From 1fe6b91454938f16896644f7272d354c3f16a5e6 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Mon, 30 Jan 2023 13:51:56 +0000 Subject: [PATCH 001/535] Change Poco help formatting --- contrib/poco | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/poco b/contrib/poco index 7fefdf30244..6f5d728f2bd 160000 --- a/contrib/poco +++ b/contrib/poco @@ -1 +1 @@ -Subproject commit 7fefdf30244a9bf8eb58562a9b2a51cc59a8877a +Subproject commit 6f5d728f2bd278019126f19c184fd89efb4fac81 From 98edb9f06b185c189d2348494cb3782f0bb92e7c Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:19:37 +0000 Subject: [PATCH 002/535] Update help for clickhouse tools and add test --- programs/benchmark/Benchmark.cpp | 12 +- programs/client/Client.cpp | 35 + programs/compressor/Compressor.cpp | 5 +- programs/copier/ClusterCopierApp.cpp | 4 +- programs/disks/DisksApp.cpp | 3 +- .../extract-from-config/ExtractFromConfig.cpp | 6 +- programs/git-import/git-import.cpp | 2 +- programs/install/Install.cpp | 152 ++- programs/keeper/Keeper.cpp | 2 +- programs/local/LocalServer.cpp | 36 +- programs/main.cpp | 44 +- programs/server/Server.cpp | 2 +- programs/su/su.cpp | 2 +- src/Common/ProfileEvents.cpp | 2 +- tests/clickhouse-test | 2 +- .../02598_clickhouse_help.reference | 1148 +++++++++++++++++ .../0_stateless/02598_clickhouse_help.sh | 95 ++ 17 files changed, 1496 insertions(+), 56 deletions(-) create mode 100644 tests/queries/0_stateless/02598_clickhouse_help.reference create mode 100755 tests/queries/0_stateless/02598_clickhouse_help.sh diff --git a/programs/benchmark/Benchmark.cpp b/programs/benchmark/Benchmark.cpp index dae3aea2d2e..57304b6146d 100644 --- a/programs/benchmark/Benchmark.cpp +++ b/programs/benchmark/Benchmark.cpp @@ -632,6 +632,16 @@ public: #pragma GCC optimize("-fno-var-tracking-assignments") #endif +[[ maybe_unused ]] static std::string getHelpHeader() +{ + return + "Usage: clickhouse benchmark [options] < queries.txt\n" + "Usage: clickhouse benchmark [options] --query \"query text\"\n" + + "clickhouse-benchmark connects to ClickHouse server," + " repeatedly sends specified queries and produces reports query statistics.\n"; +} + int mainEntryClickHouseBenchmark(int argc, char ** argv) { using namespace DB; @@ -699,7 +709,7 @@ int mainEntryClickHouseBenchmark(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << argv[0] << " [options] < queries.txt\n"; + std::cout << getHelpHeader(); std::cout << desc << "\n"; return 1; } diff --git a/programs/client/Client.cpp b/programs/client/Client.cpp index 1ce29555f2f..562dc9964cb 100644 --- a/programs/client/Client.cpp +++ b/programs/client/Client.cpp @@ -871,12 +871,47 @@ bool Client::processWithFuzzing(const String & full_query) } +[[ maybe_unused ]] static std::string getHelpHeader() +{ + return + "Usage: clickhouse client [initial table definition] [--query ]\n" + "clickhouse-client is a client application that is used to connect to ClickHouse.\n" + + "It can run queries as command line tool if you pass queries as an argument or as interactive client." + " Queries can run one at a time, or in in a multiquery mode with --multiquery option." + " To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a " + " session with corresponding clickhouse-client arguments.\n" + "'clickhouse client' command will try connect to clickhouse-server running on the same server." + " If you have credentials set up pass them with --user --password " + " or with --ask-password argument that will open command prompt.\n\n" + + "This one will try connect to tcp native port(9000) without encryption:\n" + " clickhouse client --host clickhouse.example.com --password mysecretpassword\n" + "To connect to secure endpoint just set --secure argument. If you have " + " artered port set it with --port .\n" + " clickhouse client --secure --host clickhouse.example.com --password mysecretpassword\n"; +} + + +[[ maybe_unused ]] static std::string getHelpFooter() +{ + return + "Note: If you have clickhouse installed on your system you can use 'clickhouse-client'" + " invocation with a dash.\n\n" + "Example printing current longest running query on a server:\n" + " clickhouse client --query 'SELECT * FROM system.processes ORDER BY elapsed LIMIT 1 FORMAT Vertical'\n" + "Example creating table and inserting data:\n"; +} + + void Client::printHelpMessage(const OptionsDescription & options_description) { + std::cout << getHelpHeader() << "\n"; std::cout << options_description.main_description.value() << "\n"; std::cout << options_description.external_description.value() << "\n"; std::cout << options_description.hosts_and_ports_description.value() << "\n"; std::cout << "In addition, --param_name=value can be specified for substitution of parameters for parametrized queries.\n"; + std::cout << getHelpFooter() << "\n"; } diff --git a/programs/compressor/Compressor.cpp b/programs/compressor/Compressor.cpp index b60138b5692..d3c157d7938 100644 --- a/programs/compressor/Compressor.cpp +++ b/programs/compressor/Compressor.cpp @@ -95,8 +95,9 @@ int mainEntryClickHouseCompressor(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << argv[0] << " [options] < INPUT > OUTPUT" << std::endl; - std::cout << "Usage: " << argv[0] << " [options] INPUT OUTPUT" << std::endl; + std::cout << "Usage: clickhouse compressor [options] < INPUT > OUTPUT" << std::endl; + std::cout << "Alternative usage: clickhouse compressor [options] INPUT OUTPUT" << std::endl; + std::cout << desc << std::endl; return 0; } diff --git a/programs/copier/ClusterCopierApp.cpp b/programs/copier/ClusterCopierApp.cpp index bd505b319bb..3b28ffd6f64 100644 --- a/programs/copier/ClusterCopierApp.cpp +++ b/programs/copier/ClusterCopierApp.cpp @@ -71,10 +71,10 @@ void ClusterCopierApp::handleHelp(const std::string &, const std::string &) Poco::Util::HelpFormatter help_formatter(options()); if (terminal_width) help_formatter.setWidth(terminal_width); - help_formatter.setCommand(commandName()); + help_formatter.setCommand(commandName() == "clickhouse-copier" ? "clickhouse-copier" : commandName() + " copier"); help_formatter.setHeader("Copies tables from one cluster to another"); help_formatter.setUsage("--config-file --task-path "); - help_formatter.format(std::cerr); + help_formatter.format(std::cout); stopOptionsProcessing(); } diff --git a/programs/disks/DisksApp.cpp b/programs/disks/DisksApp.cpp index b81cd52f8c8..85c95715b87 100644 --- a/programs/disks/DisksApp.cpp +++ b/programs/disks/DisksApp.cpp @@ -31,8 +31,7 @@ void DisksApp::printHelpMessage(ProgramOptionsDescription & command_option_descr help_description->add(command_option_description); std::cout << "ClickHouse disk management tool\n"; - std::cout << "Usage: ./clickhouse-disks [OPTION]\n"; - std::cout << "clickhouse-disks\n\n"; + std::cout << "usage clickhouse disks [OPTION]\n" << "clickhouse-disks\n\n"; for (const auto & current_command : supported_commands) std::cout << command_descriptions[current_command]->command_name diff --git a/programs/extract-from-config/ExtractFromConfig.cpp b/programs/extract-from-config/ExtractFromConfig.cpp index 25b03550803..72b25df6508 100644 --- a/programs/extract-from-config/ExtractFromConfig.cpp +++ b/programs/extract-from-config/ExtractFromConfig.cpp @@ -142,11 +142,11 @@ int mainEntryClickHouseExtractFromConfig(int argc, char ** argv) if (options.count("help")) { - std::cerr << "Preprocess config file and extract value of the given key." << std::endl + std::cout << "Preprocess config file and extract value of the given key." << std::endl << std::endl; - std::cerr << "Usage: clickhouse extract-from-config [options]" << std::endl + std::cout << "Usage: clickhouse extract-from-config [options]" << std::endl << std::endl; - std::cerr << options_desc << std::endl; + std::cout << options_desc << std::endl; return 0; } diff --git a/programs/git-import/git-import.cpp b/programs/git-import/git-import.cpp index 82eade8d27b..142028fdfb2 100644 --- a/programs/git-import/git-import.cpp +++ b/programs/git-import/git-import.cpp @@ -1218,7 +1218,7 @@ try if (options.count("help")) { std::cout << documentation << '\n' - << "Usage: " << argv[0] << '\n' + << "Usage: clickhouse git-import\n" << desc << '\n' << "\nExample:\n" << "\nclickhouse git-import --skip-paths 'generated\\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch '\n"; diff --git a/programs/install/Install.cpp b/programs/install/Install.cpp index d568012bb26..60bc7ff2f3d 100644 --- a/programs/install/Install.cpp +++ b/programs/install/Install.cpp @@ -220,8 +220,8 @@ int mainEntryClickHouseInstall(int argc, char ** argv) ("log-path", po::value()->default_value("var/log/clickhouse-server"), "where to create log directory") ("data-path", po::value()->default_value("var/lib/clickhouse"), "directory for data") ("pid-path", po::value()->default_value("var/run/clickhouse-server"), "directory for pid file") - ("user", po::value()->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user to create") - ("group", po::value()->default_value(DEFAULT_CLICKHOUSE_SERVER_GROUP), "clickhouse group to create") + ("user", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user") + ("group", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_GROUP), "clickhouse group") ; po::variables_map options; @@ -229,7 +229,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << formatWithSudo(std::string(argv[0]) + " install [options]", getuid() != 0) << '\n'; + std::cout << "Usage: " << formatWithSudo("clickhouse", getuid() != 0) << " install [options]\n"; std::cout << desc << '\n'; return 1; } @@ -532,6 +532,10 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(data_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("Data path configuration override is saved to file {}.\n", data_file); } + else { + fmt::print("WARNING: Configuration of data paths already exists in {}." + " If you want to apply new paths, remove {} and run install again.\n", data_file, data_file); + } /// Logger. const std::string logger_file = config_d / "logger.xml"; @@ -549,6 +553,10 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(logger_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("Log path configuration override is saved to file {}.\n", logger_file); } + else { + fmt::print("WARNING: Configuration of logger paths already exists in {}." + " If you want to apply new paths, remove {} and run install again.\n", logger_file, logger_file); + } /// User directories. const std::string user_directories_file = config_d / "user-directories.xml"; @@ -567,6 +575,10 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(user_directories_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("User directory path configuration override is saved to file {}.\n", user_directories_file); } + else { + fmt::print("WARNING: Configuration of user directories paths already exists in {}." + " If you want to apply new paths, remove {} and run install again.\n", user_directories_file, user_directories_file); + } /// OpenSSL. const std::string openssl_file = config_d / "openssl.xml"; @@ -587,6 +599,10 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(openssl_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("OpenSSL path configuration override is saved to file {}.\n", openssl_file); } + else { + fmt::print("WARNING: Configuration of OpenSSL paths already exists in {}." + " If you want to apply new paths, remove {} and run install again.\n", openssl_file, openssl_file); + } } } else @@ -598,18 +614,47 @@ int mainEntryClickHouseInstall(int argc, char ** argv) if (configuration->has("path")) { - data_path = configuration->getString("path"); - fmt::print("{} has {} as data path.\n", main_config_file.string(), data_path.string()); + std::string config_data_path = configuration->getString("path"); + fmt::print("{} has {} as data path.\n", main_config_file.string(), config_data_path); + if (options.count("data-path")) + { + fmt::print("WARNING: Will use {} instead of {} as data path as it is set in {}.\n", + config_data_path, data_path.string(), main_config_file.string()); + data_path = config_data_path; + } } if (configuration->has("logger.log")) { - log_path = fs::path(configuration->getString("logger.log")).remove_filename(); - fmt::print("{} has {} as log path.\n", main_config_file.string(), log_path.string()); + std::string config_log_path = fs::path(configuration->getString("logger.log")).remove_filename(); + fmt::print("{} has {} as log path.\n", main_config_file.string(), config_log_path); + if (options.count("log-path")) + { + fmt::print("WARNING: Will use {} instead of {} as log path as it is set in {}.\n", + config_log_path, data_path.string(), main_config_file.string()); + log_path = config_log_path; + } + } + + if (configuration->has("user_directories.local_directory.path")) + { + std::string config_user_directory_path = fs::path(configuration->getString("user_directories.local_directory.path")).remove_filename(); + fmt::print("{} has {} as log path.\n", main_config_file.string(), config_user_directory_path); + if (options.count("data-path")) + { + fmt::print("WARNING: Will use {} instead of {} as user directory path as it is set in {}.\n", + config_user_directory_path, (data_path / "access").string(), main_config_file.string()); + } + } + + /// OpenSSL. + const std::string openssl_file = config_d / "openssl.xml"; + if (options.count("data-path") && !fs::exists(openssl_file)) + { + fmt::print("WARNING: Paths for OpenSSL are not configured automatically.\n"); } } - if (!fs::exists(users_config_file)) { std::string_view users_config_content = getResource("users.xml"); @@ -843,6 +888,33 @@ int mainEntryClickHouseInstall(int argc, char ** argv) if (has_password_for_default_user) maybe_password = " --password"; + // If user specified --prefix, --pid-path, --config-path, --binary-path, --user, --group + // in install args we need to pass them to start command + + std::string maybe_prefix; + if (options.count("prefix")) + maybe_prefix = " --prefix " + prefix.string(); + + std::string maybe_pid_path; + if (options.count("pid-path")) + maybe_pid_path = " --pid-path " + options["pid-path"].as(); + + std::string maybe_config_path; + if (options.count("config-path")) + maybe_config_path = " --config-path " + options["config-path"].as(); + + std::string maybe_binary_path; + if (options.count("binary-path")) + maybe_binary_path = " --binary-path " + options["binary-path"].as(); + + std::string maybe_user; + if (options.count("user")) + maybe_user = " --user " + options["user"].as(); + + std::string maybe_group; + if (options.count("group")) + maybe_group = " --group " + options["group"].as(); + fs::path pid_file = pid_path / "clickhouse-server.pid"; if (fs::exists(pid_file)) { @@ -851,9 +923,15 @@ int mainEntryClickHouseInstall(int argc, char ** argv) "\nRestart clickhouse-server with:\n" " {}\n" "\nStart clickhouse-client with:\n" - " clickhouse-client{}\n\n", - formatWithSudo("clickhouse restart"), - maybe_password); + " clickhouse-client{}{}{}{}{}{}{}\n\n", + formatWithSudo("clickhouse restart", getuid() != 0), + maybe_password, + maybe_prefix, + maybe_pid_path, + maybe_config_path, + maybe_binary_path, + maybe_user, + maybe_group); } else { @@ -862,9 +940,15 @@ int mainEntryClickHouseInstall(int argc, char ** argv) "\nStart clickhouse-server with:\n" " {}\n" "\nStart clickhouse-client with:\n" - " clickhouse-client{}\n\n", - formatWithSudo("clickhouse start"), - maybe_password); + " clickhouse-client{}{}{}{}{}{}{}\n\n", + formatWithSudo("clickhouse start", getuid() != 0), + maybe_password, + maybe_prefix, + maybe_pid_path, + maybe_config_path, + maybe_binary_path, + maybe_user, + maybe_group); } } catch (const fs::filesystem_error &) @@ -888,7 +972,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv) namespace { - int start(const std::string & user, const fs::path & executable, const fs::path & config, const fs::path & pid_file, unsigned max_tries) + int start(const std::string & user, const std::string & group, const fs::path & binary, const fs::path & executable, const fs::path & config, const fs::path & pid_file, unsigned max_tries, bool no_sudo) { if (fs::exists(pid_file)) { @@ -928,9 +1012,15 @@ namespace if (!user.empty()) { + if (no_sudo) { + /// Sometimes there is no sudo available like in some docker images + /// We will use clickhouse su instead + command = fmt::format("{} su {}:{} {}", binary.string(), user, group, command); + } else { /// sudo respects limits in /etc/security/limits.conf e.g. open files, /// that's why we are using it instead of the 'clickhouse su' tool. command = fmt::format("sudo -u '{}' {}", user, command); + } } fmt::print("Will run {}\n", command); @@ -1132,28 +1222,35 @@ int mainEntryClickHouseStart(int argc, char ** argv) ("binary-path", po::value()->default_value("usr/bin"), "directory with binary") ("config-path", po::value()->default_value("etc/clickhouse-server"), "directory with configs") ("pid-path", po::value()->default_value("var/run/clickhouse-server"), "directory for pid file") - ("user", po::value()->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user") + ("user", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user") + ("group", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_GROUP), "clickhouse group") ("max-tries", po::value()->default_value(60), "Max number of tries for waiting the server (with 1 second delay)") + ("no-sudo", po::bool_switch(), "Use clickhouse su if sudo is unavailable") ; po::variables_map options; po::store(po::parse_command_line(argc, argv, desc), options); + bool no_sudo = options["no-sudo"].as(); + if (options.count("help")) { - std::cout << "Usage: " << formatWithSudo(std::string(argv[0]) + " start", getuid() != 0) << '\n'; + std::cout << "Usage: " << formatWithSudo("clickhouse", !no_sudo && (getuid() != 0)) <<" start\n"; + std::cout << desc << '\n'; return 1; } std::string user = options["user"].as(); + std::string group = options["group"].as(); fs::path prefix = options["prefix"].as(); + fs::path binary = prefix / options["binary-path"].as() / "clickhouse"; fs::path executable = prefix / options["binary-path"].as() / "clickhouse-server"; fs::path config = prefix / options["config-path"].as() / "config.xml"; fs::path pid_file = prefix / options["pid-path"].as() / "clickhouse-server.pid"; unsigned max_tries = options["max-tries"].as(); - return start(user, executable, config, pid_file, max_tries); + return start(user, group, binary, executable, config, pid_file, max_tries, no_sudo); } catch (...) { @@ -1182,7 +1279,8 @@ int mainEntryClickHouseStop(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << formatWithSudo(std::string(argv[0]) + " stop", getuid() != 0) << '\n'; + std::cout << "Usage: " << formatWithSudo("clickhouse", getuid() != 0) << " stop\n"; + std::cout << desc << '\n'; return 1; } @@ -1218,7 +1316,8 @@ int mainEntryClickHouseStatus(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << formatWithSudo(std::string(argv[0]) + " status", getuid() != 0) << '\n'; + std::cout << "Usage: " << formatWithSudo("clickhouse", getuid() != 0) << " status\n"; + std::cout << desc << '\n'; return 1; } @@ -1248,24 +1347,31 @@ int mainEntryClickHouseRestart(int argc, char ** argv) ("binary-path", po::value()->default_value("usr/bin"), "directory with binary") ("config-path", po::value()->default_value("etc/clickhouse-server"), "directory with configs") ("pid-path", po::value()->default_value("var/run/clickhouse-server"), "directory for pid file") - ("user", po::value()->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user") + ("user", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_USER), "clickhouse user") + ("group", po::value()->implicit_value("")->default_value(DEFAULT_CLICKHOUSE_SERVER_GROUP), "clickhouse group") ("force", po::value()->default_value(false), "Stop with KILL signal instead of TERM") ("do-not-kill", po::bool_switch(), "Do not send KILL even if TERM did not help") ("max-tries", po::value()->default_value(60), "Max number of tries for waiting the server (with 1 second delay)") + ("no-sudo", po::bool_switch(), "Use clickhouse su if sudo is unavailable") ; po::variables_map options; po::store(po::parse_command_line(argc, argv, desc), options); + bool no_sudo = options["no-sudo"].as(); + if (options.count("help")) { - std::cout << "Usage: " << formatWithSudo(std::string(argv[0]) + " restart", getuid() != 0) << '\n'; + std::cout << "Usage: " << formatWithSudo("clickhouse", !no_sudo && getuid() != 0) << " restart\n"; + std::cout << desc << '\n'; return 1; } std::string user = options["user"].as(); + std::string group = options["group"].as(); fs::path prefix = options["prefix"].as(); + fs::path binary = prefix / options["binary-path"].as() / "clickhouse"; fs::path executable = prefix / options["binary-path"].as() / "clickhouse-server"; fs::path config = prefix / options["config-path"].as() / "config.xml"; fs::path pid_file = prefix / options["pid-path"].as() / "clickhouse-server.pid"; @@ -1276,7 +1382,7 @@ int mainEntryClickHouseRestart(int argc, char ** argv) if (int res = stop(pid_file, force, do_not_kill, max_tries)) return res; - return start(user, executable, config, pid_file, max_tries); + return start(user, group, binary, executable, config, pid_file, max_tries, no_sudo); } catch (...) { diff --git a/programs/keeper/Keeper.cpp b/programs/keeper/Keeper.cpp index 3a0d3d3a6ca..4ed9264194e 100644 --- a/programs/keeper/Keeper.cpp +++ b/programs/keeper/Keeper.cpp @@ -214,7 +214,7 @@ int Keeper::run() Poco::Util::HelpFormatter help_formatter(Keeper::options()); auto header_str = fmt::format("{} [OPTION] [-- [ARG]...]\n" "positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010", - commandName()); + commandName() == "clickhouse-keeper" ? "clickhouse-keeper" : commandName() + " keeper"); help_formatter.setHeader(header_str); help_formatter.format(std::cout); return 0; diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index 2f0f98ae857..69d7e29240f 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -673,27 +673,46 @@ void LocalServer::processConfig() [[ maybe_unused ]] static std::string getHelpHeader() { return - "usage: clickhouse-local [initial table definition] [--query ]\n" + "Usage: clickhouse local [initial table definition] [--query ]\n" - "clickhouse-local allows to execute SQL queries on your data files via single command line call." - " To do so, initially you need to define your data source and its format." - " After you can execute your SQL queries in usual manner.\n" + "clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server.\n\n" + + "It can run as command line tool that does single action or as interactive client." + " For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command." + " It will set up tables, run queries and pass control as if it is clickhouse-client." + " Then you can execute your SQL queries in usual manner." + " Non-interactive mode requires query as an argument and exits when queries finish." + " Multiple SQL queries can be passed as --query argument.\n\n" + + "To configure initial environment two ways are supported: queries or command line parameters." - "There are two ways to define initial table keeping your data." " Either just in first query like this:\n" " CREATE TABLE () ENGINE = File(, );\n" - "Either through corresponding command line parameters --table --structure --input-format and --file."; + "Or through corresponding command line parameters --table --structure --input-format and --file.\n\n" + + "clickhouse-local supports all features and engines of ClickHouse." + " You can query data from remote engines and store results locally or other way around." + " For table engines that actually store data on a disk like Log and MergeTree" + " clickhouse-local puts data to temprorary directory that is not reused between runs.\n\n" + "clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to" + " local directory with data.\n"; } [[ maybe_unused ]] static std::string getHelpFooter() { return + "Note: If you have clickhouse installed on your system you can use 'clickhouse-local'" + " invocation with a dash.\n\n" "Example printing memory used by each Unix user:\n" "ps aux | tail -n +2 | awk '{ printf(\"%s\\t%s\\n\", $1, $4) }' | " "clickhouse-local -S \"user String, mem Float64\" -q" " \"SELECT user, round(sum(mem), 2) as mem_total FROM table GROUP BY user ORDER" - " BY mem_total DESC FORMAT PrettyCompact\""; + " BY mem_total DESC FORMAT PrettyCompact\"\n\n" + "Example reading file from S3, converting format and writing to a file:\n" + "clickhouse-local --query \"SELECT c1 as version, c2 as date " + "FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv')" + " INTO OUTFILE '/tmp/versions.json'\""; } @@ -701,7 +720,7 @@ void LocalServer::printHelpMessage([[maybe_unused]] const OptionsDescription & o { #if defined(FUZZING_MODE) std::cout << - "usage: clickhouse -- \n" + "Usage: clickhouse -- \n" "Note: It is important not to use only one letter keys with single dash for \n" "for clickhouse-local arguments. It may work incorrectly.\n" @@ -869,4 +888,5 @@ catch (...) { return 1; } + #endif diff --git a/programs/main.cpp b/programs/main.cpp index 389eae92091..8e20fc44ee4 100644 --- a/programs/main.cpp +++ b/programs/main.cpp @@ -79,17 +79,43 @@ int mainEntryClickHouseRestart(int argc, char ** argv); int mainEntryClickHouseDisks(int argc, char ** argv); #endif -int mainEntryClickHouseHashBinary(int, char **) +bool hasHelpArg (char* arg) { - /// Intentionally without newline. So you can run: - /// objcopy --add-section .clickhouse.hash=<(./clickhouse hash-binary) clickhouse + return (strcmp(arg, "--help") == 0 || (strcmp(arg, "-h") == 0) || (strcmp(arg, "help") == 0)); +} + +int mainEntryClickHouseHashBinary(int argc_, char ** argv_) +{ + std::vector argv(argv_, argv_ + argc_); + auto it = std::find_if(argv.begin(), argv.end(), hasHelpArg); + if (it != argv.end()) + { + std::cout << "Usage: clickhouse hash\nPrints hash of clickhouse binary.\n"; + std::cout << " -h, --help Prints this message\n"; + std::cout << "Result is intentionally without newline. So you can run:\n"; + std::cout << "objcopy --add-section .clickhouse.hash=<(./clickhouse hash-binary) clickhouse.\n\n"; + std::cout << "Current binary hash: "; + } std::cout << getHashOfLoadedBinaryHex(); return 0; } - namespace { +void printHelp(); + +int mainEntryHelp(int, char **) +{ + printHelp(); + return 0; +} + +int printHelpOnError(int, char **) +{ + printHelp(); + return -1; +} + using MainFunc = int (*)(int, char**); #if !defined(FUZZING_MODE) @@ -150,14 +176,14 @@ std::pair clickhouse_applications[] = #if ENABLE_CLICKHOUSE_DISKS {"disks", mainEntryClickHouseDisks}, #endif + {"help", mainEntryHelp}, }; -int printHelp(int, char **) +void printHelp() { - std::cerr << "Use one of the following commands:" << std::endl; + std::cout << "Use one of the following commands:" << std::endl; for (auto & application : clickhouse_applications) - std::cerr << "clickhouse " << application.first << " [args] " << std::endl; - return -1; + std::cout << "clickhouse " << application.first << " [args] " << std::endl; } bool isClickhouseApp(const std::string & app_suffix, std::vector & argv) @@ -468,7 +494,7 @@ int main(int argc_, char ** argv_) std::vector argv(argv_, argv_ + argc_); /// Print a basic help if nothing was matched - MainFunc main_func = printHelp; + MainFunc main_func = printHelpOnError; for (auto & application : clickhouse_applications) { diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index 8b6c43b450e..f9cdfa8228b 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -461,7 +461,7 @@ int Server::run() Poco::Util::HelpFormatter help_formatter(Server::options()); auto header_str = fmt::format("{} [OPTION] [-- [ARG]...]\n" "positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010", - commandName()); + commandName() == "clickhouse-server" ? "clickhouse-server" : commandName() + " server"); help_formatter.setHeader(header_str); help_formatter.format(std::cout); return 0; diff --git a/programs/su/su.cpp b/programs/su/su.cpp index cebd05b3eb1..95d9787fb7b 100644 --- a/programs/su/su.cpp +++ b/programs/su/su.cpp @@ -107,7 +107,7 @@ try if (argc < 3) { - std::cout << "Usage: ./clickhouse su user:group ..." << std::endl; + std::cout << "Usage: clickhouse su user:group ..." << std::endl; exit(0); // NOLINT(concurrency-mt-unsafe) } diff --git a/src/Common/ProfileEvents.cpp b/src/Common/ProfileEvents.cpp index f4589108e66..007f225d164 100644 --- a/src/Common/ProfileEvents.cpp +++ b/src/Common/ProfileEvents.cpp @@ -410,7 +410,7 @@ The server successfully detected this situation and will download merged part fr M(MainConfigLoads, "Number of times the main configuration was reloaded.") \ \ M(AggregationPreallocatedElementsInHashTables, "How many elements were preallocated in hash tables for aggregation.") \ - M(AggregationHashTablesInitializedAsTwoLevel, "How many hash tables were inited as two-level for aggregation.") \ + M(AggregationHashTablesInitializedAsTwoLevel, "How many hash tables were initialiseded as two-level for aggregation.") \ \ M(MergeTreeMetadataCacheGet, "Number of rocksdb reads(used for merge tree metadata cache)") \ M(MergeTreeMetadataCachePut, "Number of rocksdb puts(used for merge tree metadata cache)") \ diff --git a/tests/clickhouse-test b/tests/clickhouse-test index f6a5b33226d..a038cf850ec 100755 --- a/tests/clickhouse-test +++ b/tests/clickhouse-test @@ -2444,7 +2444,7 @@ if __name__ == "__main__": client_bin = find_binary(args.binary + "-client") if client_bin is not None: args.client = client_bin - print("Using {args.client} as client program") + print(f"Using {args.client} as client program") elif args.binary: args.client = args.binary + " client" print(f"Using {args.client} as client program (expecting monolithic build)") diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference new file mode 100644 index 00000000000..b38c04542d4 --- /dev/null +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -0,0 +1,1148 @@ +================BINARY========================== + +clickhouse --help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse local + +Usage: clickhouse local [initial table definition] [--query ] +clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. + +It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. + +To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: + CREATE TABLE
() ENGINE = File(, ); +Or through corresponding command line parameters --table --structure --input-format and --file. + +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temprorary directory that is not reused between runs. + +clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. + +Example reading file from S3, converting format and writing to a file: +clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" + +clickhouse client + +Usage: clickhouse client [initial table definition] [--query ] +clickhouse-client is a client application that is used to connect to ClickHouse. +It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. +'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. + +This one will try connect to tcp native port(9000) without encryption: + clickhouse client --host clickhouse.example.com --password mysecretpassword +To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . + clickhouse client --secure --host clickhouse.example.com --password mysecretpassword + + +clickhouse benchmark + +Usage: clickhouse benchmark [options] < queries.txt +Usage: clickhouse benchmark [options] --query "query text" +clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. + +clickhouse server + +Usage: +clickhouse server [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse extract + +Preprocess config file and extract value of the given key. + +Usage: clickhouse extract-from-config [options] + +Allowed options: + --help produce this help message + --stacktrace print stack traces of exceptions + --process-zk-includes if there are from_zk elements in config, connect to + ZooKeeper and process them + --try Do not warn about missing keys + --log-level arg (=error) log level + -c [ --config-file ] arg path to config file + -k [ --key ] arg key to get value for + + +clickhouse compressor + +Usage: clickhouse compressor [options] < INPUT > OUTPUT +Alternative usage: clickhouse compressor [options] INPUT OUTPUT +Allowed options: + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. physical file offset) + --offset-in-decompressed-block arg (=0) offset to the decompressed block (i.e. virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed data + + +clickhouse format + +Usage: /home/ubuntu/thread-ch/clickhouse [options] < query +Allowed options: + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line of the formatted query + --allow_settings_after_format_in_insert Allow SETTINGS after FORMAT, but note, that this is not always safe + --seed arg seed (arbitrary string) that determines the result of obfuscation + --max_query_size arg Which part of the query can be read into RAM for parsing (the remaining data + for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth of recursive descend parser). + + +clickhouse copier + +Usage: clickhouse copier --config-file --task-path +Copies tables from one cluster to another + +-C, --config-file= load configuration from a given + file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors + only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, + e.g. 027). +--pidfile=path Write the process ID of the + application to given file. +--task-path=task-path path to task in ZooKeeper +--task-file=task-file path to task file for uploading + in ZooKeeper to task-path +--task-upload-force=task-upload-force Force upload task-file even node + already exists +--safe-mode disables ALTER DROP PARTITION in + case of errors +--copy-fault-probability=copy-fault-probability the copying fails with specified + probability (used to test + partition state recovering) +--move-fault-probability=move-fault-probability the moving fails with specified + probability (used to test + partition state recovering) +--log-level=log-level sets log level +--base-dir=base-dir base directory for copiers, + consecutive copier launches will + populate /base-dir/launch_id/* + directories +--experimental-use-sample-offset=experimental-use-sample-offset Use SAMPLE OFFSET query instead + of cityHash64(PRIMARY KEY) % n == + k +--status Get for status for current + execution +--max-table-tries=max-table-tries Number of tries for the copy + table task +--max-shard-partition-tries=max-shard-partition-tries Number of tries for the copy one + partition task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter Number of tries for final ALTER + ATTACH to destination table +--retry-delay-ms=retry-delay-ms Delay between task retries +--help produce this help message + +clickhouse obfuscator + + +Simple tool for table data obfuscation. + +It reads input table and produces output table, that retain some properties of input, but contains different data. +It allows to publish almost real production data for usage in benchmarks. + +It is designed to retain the following properties of data: +- cardinalities of values (number of distinct values) for every column and for every tuple of columns; +- conditional cardinalities: number of distinct values of one column under condition on value of another column; +- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; +- probability distributions of length of strings; +- probability of zero values of numbers; empty strings and arrays, NULLs; +- data compression ratio when compressed with LZ77 and entropy family of codecs; +- continuity (magnitude of difference) of time values across table; continuity of floating point values. +- date component of DateTime values; +- UTF-8 validity of string values; +- string values continue to look somewhat natural. + +Most of the properties above are viable for performance testing: +- reading data, filtering, aggregation and sorting will work at almost the same speed + as on original data due to saved cardinalities, magnitudes, compression ratios, etc. + +It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. +Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. + +It use some cryptographic primitives to transform data, but from the cryptographic point of view, + it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. + +It may retain some data you don't want to publish. + +It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. +For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. +So, the user will be able to count exact ratio of mobile traffic. + +Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. +If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, + it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. +And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. + +This tool works fine only with reasonable amount of data (at least 1000s of rows). + + +Usage: /home/ubuntu/thread-ch/clickhouse [options] < in > out + +Input must be seekable file (it will be read twice). + +Options: + --help produce help message + -S [ --structure ] arg structure of the initial table (list of column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random string with at least 10 bytes + length; note that a seed for each column is derived from this seed and a + column name: you can obfuscate data for different tables and as long as + you use identical seed and identical column names, the data for + corresponding non-text columns for different tables will be transformed + in the same way, so the data for different tables can be JOINed after + obfuscation + --limit arg if specified - stop after generating that number of rows; the limit can + be also greater than the number of source dataset - in this case it will + process the dataset in a loop more than one time, using different seeds + on every iteration, generating result as large as needed + --silent arg (=0) don't print information messages to stderr + --save arg save the models after training to the specified file. You can use --limit + 0 to skip the generation step. The file is using binary, + platform-dependent, opaque serialization format. The model parameters are + saved, while the seed is not. + --load arg load the models instead of training from the specified file. The table + structure must match the saved file. The seed should be specified + separately, while other model parameters are loaded. + --order arg (=5) order of markov model to generate strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: remove all buckets with count less + than specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible continuations for a context: + remove all histograms with less than specified number of buckets + --frequency-add arg (=0) add a constant to every count to lower probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) size of a sliding window in a source string - its hash is used as a seed + for RNG in markov model + + +Example: + /home/ubuntu/thread-ch/clickhouse --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + +clickhouse git + + +A tool to extract information from Git repository for analytics. + +It dumps the data for the following tables: +- commits - commits with statistics; +- file_changes - files changed in every commit with the info about the change and statistics; +- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. + +The largest and the most important table is "line_changes". + +Allows to answer questions like: +- list files with maximum number of authors; +- show me the oldest lines of code in the repository; +- show me the files with longest history; +- list favorite files for author; +- list largest files with lowest number of authors; +- at what weekday the code has highest chance to stay in repository; +- the distribution of code age across repository; +- files sorted by average code age; +- quickly show file with blame info (rough); +- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; +- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; +- list files with most modifications; +- list files that were rewritten most number of time or by most of authors; +- what is percentage of code removal by other authors, across authors; +- the matrix of authors that shows what authors tends to rewrite another authors code; +- what is the worst time to write code in sense that the code has highest chance to be rewritten; +- the average time before code will be rewritten and the median (half-life of code decay); +- comments/code percentage change in time / by author / by location; +- who tend to write more tests / cpp code / comments. + +The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. + +The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. + +Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). + +The tool can process large enough repositories in a reasonable time. +It has been tested on: +- ClickHouse: 31 seconds; 3 million rows; +- LLVM: 8 minutes; 62 million rows; +- Linux - 12 minutes; 85 million rows; +- Chromium - 67 minutes; 343 million rows; +(the numbers as of Sep 2020) + + +Prepare the database by executing the following queries: + +DROP DATABASE IF EXISTS git; +CREATE DATABASE git; + +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.file_changes +( + change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.line_changes +( + sign Int8, + line_number_old UInt32, + line_number_new UInt32, + hunk_num UInt32, + hunk_start_line_number_old UInt32, + hunk_start_line_number_new UInt32, + hunk_lines_added UInt32, + hunk_lines_deleted UInt32, + hunk_context LowCardinality(String), + line LowCardinality(String), + indent UInt8, + line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), + + prev_commit_hash String, + prev_author LowCardinality(String), + prev_time DateTime, + + file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + file_lines_added UInt32, + file_lines_deleted UInt32, + file_hunks_added UInt32, + file_hunks_removed UInt32, + file_hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +Run the tool. + +Then insert the data with the following commands: + +clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv +clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv +clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv + + +Usage: clickhouse git-import +Allowed options: + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) Skip commits without parents (except the initial commit). These commits + are usually erroneous but they can make sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) Skip commits with duplicate diffs. These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The option can be specified multiple + times. + --skip-paths arg Skip paths that matches regular expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of added + removed lines) is larger + than specified threshold. Does not apply for initial commit. + --stop-after-commit arg Stop processing after specified commit hash. + --threads arg (=8) Number of concurrent git subprocesses to spawn + + +Example: + +clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' + +clickhouse keeper + +Usage: +clickhouse keeper [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-force-recovery, --force-recovery Force recovery mode allowing Keeper to + overwrite cluster configuration without + quorum +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse keeper + +Usage: /home/ubuntu/thread-ch/clickhouse --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Allowed options: + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper snapshot + + +clickhouse install + +Usage: sudo clickhouse install [options] + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) where to install binaries + --config-path arg (=etc/clickhouse-server) + where to install configs + --log-path arg (=var/log/clickhouse-server) + where to create log directory + --data-path arg (=var/lib/clickhouse) directory for data + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + + +clickhouse start + +Usage: sudo clickhouse start + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary + --config-path arg (=etc/clickhouse-server) + directory with configs + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable + + +clickhouse stop + +Usage: sudo clickhouse stop + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --force Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server to finish after sending TERM + (with 1 second delay) + + +clickhouse status + +Usage: sudo clickhouse status + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + + +clickhouse restart + +Usage: sudo clickhouse restart + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary + --config-path arg (=etc/clickhouse-server) + directory with configs + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --force arg (=0) Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable + + +clickhouse static + +Allowed options: + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode + + +clickhouse su + +Usage: clickhouse su user:group ... + +clickhouse hash + +Usage: clickhouse hash +Prints hash of clickhouse binary. + -h, --help Prints this message +Result is intentionally without newline. So you can run: +objcopy --add-section .clickhouse.hash=<(./clickhouse hash-binary) clickhouse. + + +clickhouse disks + +ClickHouse disk management tool +usage clickhouse disks [OPTION] +clickhouse-disks + +read read File `from_path` to `to_path` or to stdout +Path should be in format './' or './path' or 'path' + +write Write File `from_path` or stdin to `to_path` + +link Create hardlink from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +mkdir Create directory or directories recursively + +remove Remove file or directory with all children. Throws exception if file doesn't exists. +Path should be in format './' or './path' or 'path' + +move Move file or directory from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +copy Recursively copy data containing at `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +list List files (the default disk is used by default) +Path should be in format './' or './path' or 'path' + +list-disks List disks names + +clickhouse-disks: + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level + +================SYMLINK============================== + +clickhouse-local + +Usage: clickhouse local [initial table definition] [--query ] +clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. + +It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. + +To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: + CREATE TABLE
() ENGINE = File(, ); +Or through corresponding command line parameters --table --structure --input-format and --file. + +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temprorary directory that is not reused between runs. + +clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. + +Example reading file from S3, converting format and writing to a file: +clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" + +clickhouse-client + +Usage: clickhouse client [initial table definition] [--query ] +clickhouse-client is a client application that is used to connect to ClickHouse. +It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. +'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. + +This one will try connect to tcp native port(9000) without encryption: + clickhouse client --host clickhouse.example.com --password mysecretpassword +To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . + clickhouse client --secure --host clickhouse.example.com --password mysecretpassword + + +clickhouse-benchmark + +Usage: clickhouse benchmark [options] < queries.txt +Usage: clickhouse benchmark [options] --query "query text" +clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. + +clickhouse-server + +Usage: +clickhouse-server [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse-extract + +Preprocess config file and extract value of the given key. + +Usage: clickhouse extract-from-config [options] + +Allowed options: + --help produce this help message + --stacktrace print stack traces of exceptions + --process-zk-includes if there are from_zk elements in config, connect to + ZooKeeper and process them + --try Do not warn about missing keys + --log-level arg (=error) log level + -c [ --config-file ] arg path to config file + -k [ --key ] arg key to get value for + + +clickhouse-compressor + +Usage: clickhouse compressor [options] < INPUT > OUTPUT +Alternative usage: clickhouse compressor [options] INPUT OUTPUT +Allowed options: + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. physical file offset) + --offset-in-decompressed-block arg (=0) offset to the decompressed block (i.e. virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed data + + +clickhouse-format + +Usage: /home/ubuntu/thread-ch/clickhouse-format [options] < query +Allowed options: + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line of the formatted query + --allow_settings_after_format_in_insert Allow SETTINGS after FORMAT, but note, that this is not always safe + --seed arg seed (arbitrary string) that determines the result of obfuscation + --max_query_size arg Which part of the query can be read into RAM for parsing (the remaining data + for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth of recursive descend parser). + + +clickhouse-copier + +Usage: clickhouse-copier --config-file --task-path +Copies tables from one cluster to another + +-C, --config-file= load configuration from a given + file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors + only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, + e.g. 027). +--pidfile=path Write the process ID of the + application to given file. +--task-path=task-path path to task in ZooKeeper +--task-file=task-file path to task file for uploading + in ZooKeeper to task-path +--task-upload-force=task-upload-force Force upload task-file even node + already exists +--safe-mode disables ALTER DROP PARTITION in + case of errors +--copy-fault-probability=copy-fault-probability the copying fails with specified + probability (used to test + partition state recovering) +--move-fault-probability=move-fault-probability the moving fails with specified + probability (used to test + partition state recovering) +--log-level=log-level sets log level +--base-dir=base-dir base directory for copiers, + consecutive copier launches will + populate /base-dir/launch_id/* + directories +--experimental-use-sample-offset=experimental-use-sample-offset Use SAMPLE OFFSET query instead + of cityHash64(PRIMARY KEY) % n == + k +--status Get for status for current + execution +--max-table-tries=max-table-tries Number of tries for the copy + table task +--max-shard-partition-tries=max-shard-partition-tries Number of tries for the copy one + partition task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter Number of tries for final ALTER + ATTACH to destination table +--retry-delay-ms=retry-delay-ms Delay between task retries +--help produce this help message + +clickhouse-obfuscator + + +Simple tool for table data obfuscation. + +It reads input table and produces output table, that retain some properties of input, but contains different data. +It allows to publish almost real production data for usage in benchmarks. + +It is designed to retain the following properties of data: +- cardinalities of values (number of distinct values) for every column and for every tuple of columns; +- conditional cardinalities: number of distinct values of one column under condition on value of another column; +- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; +- probability distributions of length of strings; +- probability of zero values of numbers; empty strings and arrays, NULLs; +- data compression ratio when compressed with LZ77 and entropy family of codecs; +- continuity (magnitude of difference) of time values across table; continuity of floating point values. +- date component of DateTime values; +- UTF-8 validity of string values; +- string values continue to look somewhat natural. + +Most of the properties above are viable for performance testing: +- reading data, filtering, aggregation and sorting will work at almost the same speed + as on original data due to saved cardinalities, magnitudes, compression ratios, etc. + +It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. +Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. + +It use some cryptographic primitives to transform data, but from the cryptographic point of view, + it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. + +It may retain some data you don't want to publish. + +It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. +For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. +So, the user will be able to count exact ratio of mobile traffic. + +Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. +If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, + it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. +And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. + +This tool works fine only with reasonable amount of data (at least 1000s of rows). + + +Usage: /home/ubuntu/thread-ch/clickhouse-obfuscator [options] < in > out + +Input must be seekable file (it will be read twice). + +Options: + --help produce help message + -S [ --structure ] arg structure of the initial table (list of column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random string with at least 10 bytes + length; note that a seed for each column is derived from this seed and a + column name: you can obfuscate data for different tables and as long as + you use identical seed and identical column names, the data for + corresponding non-text columns for different tables will be transformed + in the same way, so the data for different tables can be JOINed after + obfuscation + --limit arg if specified - stop after generating that number of rows; the limit can + be also greater than the number of source dataset - in this case it will + process the dataset in a loop more than one time, using different seeds + on every iteration, generating result as large as needed + --silent arg (=0) don't print information messages to stderr + --save arg save the models after training to the specified file. You can use --limit + 0 to skip the generation step. The file is using binary, + platform-dependent, opaque serialization format. The model parameters are + saved, while the seed is not. + --load arg load the models instead of training from the specified file. The table + structure must match the saved file. The seed should be specified + separately, while other model parameters are loaded. + --order arg (=5) order of markov model to generate strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: remove all buckets with count less + than specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible continuations for a context: + remove all histograms with less than specified number of buckets + --frequency-add arg (=0) add a constant to every count to lower probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) size of a sliding window in a source string - its hash is used as a seed + for RNG in markov model + + +Example: + /home/ubuntu/thread-ch/clickhouse-obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + +clickhouse-git + + +A tool to extract information from Git repository for analytics. + +It dumps the data for the following tables: +- commits - commits with statistics; +- file_changes - files changed in every commit with the info about the change and statistics; +- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. + +The largest and the most important table is "line_changes". + +Allows to answer questions like: +- list files with maximum number of authors; +- show me the oldest lines of code in the repository; +- show me the files with longest history; +- list favorite files for author; +- list largest files with lowest number of authors; +- at what weekday the code has highest chance to stay in repository; +- the distribution of code age across repository; +- files sorted by average code age; +- quickly show file with blame info (rough); +- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; +- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; +- list files with most modifications; +- list files that were rewritten most number of time or by most of authors; +- what is percentage of code removal by other authors, across authors; +- the matrix of authors that shows what authors tends to rewrite another authors code; +- what is the worst time to write code in sense that the code has highest chance to be rewritten; +- the average time before code will be rewritten and the median (half-life of code decay); +- comments/code percentage change in time / by author / by location; +- who tend to write more tests / cpp code / comments. + +The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. + +The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. + +Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). + +The tool can process large enough repositories in a reasonable time. +It has been tested on: +- ClickHouse: 31 seconds; 3 million rows; +- LLVM: 8 minutes; 62 million rows; +- Linux - 12 minutes; 85 million rows; +- Chromium - 67 minutes; 343 million rows; +(the numbers as of Sep 2020) + + +Prepare the database by executing the following queries: + +DROP DATABASE IF EXISTS git; +CREATE DATABASE git; + +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.file_changes +( + change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.line_changes +( + sign Int8, + line_number_old UInt32, + line_number_new UInt32, + hunk_num UInt32, + hunk_start_line_number_old UInt32, + hunk_start_line_number_new UInt32, + hunk_lines_added UInt32, + hunk_lines_deleted UInt32, + hunk_context LowCardinality(String), + line LowCardinality(String), + indent UInt8, + line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), + + prev_commit_hash String, + prev_author LowCardinality(String), + prev_time DateTime, + + file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + file_lines_added UInt32, + file_lines_deleted UInt32, + file_hunks_added UInt32, + file_hunks_removed UInt32, + file_hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +Run the tool. + +Then insert the data with the following commands: + +clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv +clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv +clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv + + +Usage: clickhouse git-import +Allowed options: + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) Skip commits without parents (except the initial commit). These commits + are usually erroneous but they can make sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) Skip commits with duplicate diffs. These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The option can be specified multiple + times. + --skip-paths arg Skip paths that matches regular expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of added + removed lines) is larger + than specified threshold. Does not apply for initial commit. + --stop-after-commit arg Stop processing after specified commit hash. + --threads arg (=8) Number of concurrent git subprocesses to spawn + + +Example: + +clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' + +clickhouse-keeper + +Usage: +clickhouse-keeper [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-force-recovery, --force-recovery Force recovery mode allowing Keeper to + overwrite cluster configuration without + quorum +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse-keeper + +Usage: /home/ubuntu/thread-ch/clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Allowed options: + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper snapshot + +Allowed options: + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode + + +clickhouse-su + +Usage: clickhouse su user:group ... + +clickhouse-disks + +ClickHouse disk management tool +usage clickhouse disks [OPTION] +clickhouse-disks + +read read File `from_path` to `to_path` or to stdout +Path should be in format './' or './path' or 'path' + +write Write File `from_path` or stdin to `to_path` + +link Create hardlink from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +mkdir Create directory or directories recursively + +remove Remove file or directory with all children. Throws exception if file doesn't exists. +Path should be in format './' or './path' or 'path' + +move Move file or directory from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +copy Recursively copy data containing at `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +list List files (the default disk is used by default) +Path should be in format './' or './path' or 'path' + +list-disks List disks names + +clickhouse-disks: + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level + diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh new file mode 100755 index 00000000000..10122208360 --- /dev/null +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +# Tags: no-parallel + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + + +# We have to use fixed terminal width. It may break other tests results formatting. + +backup_stty_size=$(stty size | awk '{print $2}') +stty columns 120 +echo "================BINARY==========================" + +echo -e '\n'clickhouse --help'\n' +$CLICKHOUSE_BINARY --help + +echo -e '\n'clickhouse help'\n' +$CLICKHOUSE_BINARY help +echo -e '\n'clickhouse local'\n' +$CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse client'\n' +$CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse benchmark'\n' +$CLICKHOUSE_BINARY benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' +echo -e '\n'clickhouse server'\n' +$CLICKHOUSE_BINARY server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse extract'\n' +$CLICKHOUSE_BINARY extract-from-config --help +echo -e '\n'clickhouse compressor'\n' +$CLICKHOUSE_BINARY compressor --help +echo -e '\n'clickhouse format'\n' +$CLICKHOUSE_BINARY format --help +echo -e '\n'clickhouse copier'\n' +$CLICKHOUSE_BINARY copier --help +echo -e '\n'clickhouse obfuscator'\n' +$CLICKHOUSE_BINARY obfuscator --help +echo -e '\n'clickhouse git '\n' +$CLICKHOUSE_BINARY git-import --help +echo -e '\n'clickhouse keeper'\n' +$CLICKHOUSE_BINARY keeper --help +echo -e '\n'clickhouse keeper'\n' +$CLICKHOUSE_BINARY keeper-converter --help +echo -e '\n'clickhouse install'\n' +$CLICKHOUSE_BINARY install --help +echo -e '\n'clickhouse start'\n' +$CLICKHOUSE_BINARY start --help +echo -e '\n'clickhouse stop'\n' +$CLICKHOUSE_BINARY stop --help +echo -e '\n'clickhouse status'\n' +$CLICKHOUSE_BINARY status --help +echo -e '\n'clickhouse restart'\n' +$CLICKHOUSE_BINARY restart --help +echo -e '\n'clickhouse static'\n' +$CLICKHOUSE_BINARY static-files-disk-uploader --help +echo -e '\n'clickhouse su '\n' +$CLICKHOUSE_BINARY su --help +echo -e '\n'clickhouse hash'\n' +$CLICKHOUSE_BINARY hash-binary --help | grep -v 'Current binary hash' +echo -e '\n'clickhouse disks'\n' +$CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' + +echo "================SYMLINK==============================" + +echo -e '\n'clickhouse-local'\n' +${CLICKHOUSE_BINARY}-local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse-client'\n' +${CLICKHOUSE_BINARY}-client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse-benchmark'\n' +${CLICKHOUSE_BINARY}-benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' +echo -e '\n'clickhouse-server'\n' +${CLICKHOUSE_BINARY}-server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e '\n'clickhouse-extract'\n' +${CLICKHOUSE_BINARY}-extract-from-config --help +echo -e '\n'clickhouse-compressor'\n' +${CLICKHOUSE_BINARY}-compressor --help +echo -e '\n'clickhouse-format'\n' +${CLICKHOUSE_BINARY}-format --help +echo -e '\n'clickhouse-copier'\n' +${CLICKHOUSE_BINARY}-copier --help +echo -e '\n'clickhouse-obfuscator'\n' +${CLICKHOUSE_BINARY}-obfuscator --help +echo -e '\n'clickhouse-git '\n' +${CLICKHOUSE_BINARY}-git-import --help +echo -e '\n'clickhouse-keeper'\n' +${CLICKHOUSE_BINARY}-keeper --help +echo -e '\n'clickhouse-keeper'\n' +${CLICKHOUSE_BINARY}-keeper-converter --help +${CLICKHOUSE_BINARY}-static-files-disk-uploader --help +echo -e '\n'clickhouse-su '\n' +${CLICKHOUSE_BINARY}-su --help +echo -e '\n'clickhouse-disks'\n' +${CLICKHOUSE_BINARY}-disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' + +stty columns $backup_stty_size From ce553a288849bd52deb465c5472552663658d483 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:51:33 +0000 Subject: [PATCH 003/535] I like style check --- programs/install/Install.cpp | 20 +++-- programs/local/LocalServer.cpp | 2 +- .../0_stateless/02598_clickhouse_help.sh | 74 +++++++++---------- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/programs/install/Install.cpp b/programs/install/Install.cpp index 60bc7ff2f3d..f9f06d9ab36 100644 --- a/programs/install/Install.cpp +++ b/programs/install/Install.cpp @@ -532,7 +532,8 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(data_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("Data path configuration override is saved to file {}.\n", data_file); } - else { + else + { fmt::print("WARNING: Configuration of data paths already exists in {}." " If you want to apply new paths, remove {} and run install again.\n", data_file, data_file); } @@ -553,7 +554,8 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(logger_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("Log path configuration override is saved to file {}.\n", logger_file); } - else { + else + { fmt::print("WARNING: Configuration of logger paths already exists in {}." " If you want to apply new paths, remove {} and run install again.\n", logger_file, logger_file); } @@ -575,7 +577,8 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(user_directories_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("User directory path configuration override is saved to file {}.\n", user_directories_file); } - else { + else + { fmt::print("WARNING: Configuration of user directories paths already exists in {}." " If you want to apply new paths, remove {} and run install again.\n", user_directories_file, user_directories_file); } @@ -599,7 +602,8 @@ int mainEntryClickHouseInstall(int argc, char ** argv) fs::permissions(openssl_file, fs::perms::owner_read, fs::perm_options::replace); fmt::print("OpenSSL path configuration override is saved to file {}.\n", openssl_file); } - else { + else + { fmt::print("WARNING: Configuration of OpenSSL paths already exists in {}." " If you want to apply new paths, remove {} and run install again.\n", openssl_file, openssl_file); } @@ -969,7 +973,6 @@ int mainEntryClickHouseInstall(int argc, char ** argv) return 0; } - namespace { int start(const std::string & user, const std::string & group, const fs::path & binary, const fs::path & executable, const fs::path & config, const fs::path & pid_file, unsigned max_tries, bool no_sudo) @@ -1012,11 +1015,14 @@ namespace if (!user.empty()) { - if (no_sudo) { + if (no_sudo) + { /// Sometimes there is no sudo available like in some docker images /// We will use clickhouse su instead command = fmt::format("{} su {}:{} {}", binary.string(), user, group, command); - } else { + } + else + { /// sudo respects limits in /etc/security/limits.conf e.g. open files, /// that's why we are using it instead of the 'clickhouse su' tool. command = fmt::format("sudo -u '{}' {}", user, command); diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index 69d7e29240f..27c5687357d 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -693,7 +693,7 @@ void LocalServer::processConfig() "clickhouse-local supports all features and engines of ClickHouse." " You can query data from remote engines and store results locally or other way around." " For table engines that actually store data on a disk like Log and MergeTree" - " clickhouse-local puts data to temprorary directory that is not reused between runs.\n\n" + " clickhouse-local puts data to temporary directory that is not reused between runs.\n\n" "clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to" " local directory with data.\n"; } diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index 10122208360..26de13fd6cc 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -12,84 +12,84 @@ backup_stty_size=$(stty size | awk '{print $2}') stty columns 120 echo "================BINARY==========================" -echo -e '\n'clickhouse --help'\n' +echo -e "\n"clickhouse --help"\n" $CLICKHOUSE_BINARY --help -echo -e '\n'clickhouse help'\n' +echo -e "\n"clickhouse help"\n" $CLICKHOUSE_BINARY help -echo -e '\n'clickhouse local'\n' +echo -e "\n"clickhouse local"\n" $CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse client'\n' +echo -e "\n"clickhouse client"\n" $CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse benchmark'\n' +echo -e "\n"clickhouse benchmark"\n" $CLICKHOUSE_BINARY benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e '\n'clickhouse server'\n' +echo -e "\n"clickhouse server"\n" $CLICKHOUSE_BINARY server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse extract'\n' +echo -e "\n"clickhouse extract"\n" $CLICKHOUSE_BINARY extract-from-config --help -echo -e '\n'clickhouse compressor'\n' +echo -e "\n"clickhouse compressor"\n" $CLICKHOUSE_BINARY compressor --help -echo -e '\n'clickhouse format'\n' +echo -e "\n"clickhouse format"\n" $CLICKHOUSE_BINARY format --help -echo -e '\n'clickhouse copier'\n' +echo -e "\n"clickhouse copier"\n" $CLICKHOUSE_BINARY copier --help -echo -e '\n'clickhouse obfuscator'\n' +echo -e "\n"clickhouse obfuscator"\n" $CLICKHOUSE_BINARY obfuscator --help -echo -e '\n'clickhouse git '\n' +echo -e "\n"clickhouse git "\n" $CLICKHOUSE_BINARY git-import --help -echo -e '\n'clickhouse keeper'\n' +echo -e "\n"clickhouse keeper"\n" $CLICKHOUSE_BINARY keeper --help -echo -e '\n'clickhouse keeper'\n' +echo -e "\n"clickhouse keeper"\n" $CLICKHOUSE_BINARY keeper-converter --help -echo -e '\n'clickhouse install'\n' +echo -e "\n"clickhouse install"\n" $CLICKHOUSE_BINARY install --help -echo -e '\n'clickhouse start'\n' +echo -e "\n"clickhouse start"\n" $CLICKHOUSE_BINARY start --help -echo -e '\n'clickhouse stop'\n' +echo -e "\n"clickhouse stop"\n" $CLICKHOUSE_BINARY stop --help -echo -e '\n'clickhouse status'\n' +echo -e "\n"clickhouse status"\n" $CLICKHOUSE_BINARY status --help -echo -e '\n'clickhouse restart'\n' +echo -e "\n"clickhouse restart"\n" $CLICKHOUSE_BINARY restart --help -echo -e '\n'clickhouse static'\n' +echo -e "\n"clickhouse static"\n" $CLICKHOUSE_BINARY static-files-disk-uploader --help -echo -e '\n'clickhouse su '\n' +echo -e "\n"clickhouse su "\n" $CLICKHOUSE_BINARY su --help -echo -e '\n'clickhouse hash'\n' +echo -e "\n"clickhouse hash"\n" $CLICKHOUSE_BINARY hash-binary --help | grep -v 'Current binary hash' -echo -e '\n'clickhouse disks'\n' +echo -e "\n"clickhouse disks"\n" $CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo "================SYMLINK==============================" -echo -e '\n'clickhouse-local'\n' +echo -e "\n"clickhouse-local"\n" ${CLICKHOUSE_BINARY}-local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse-client'\n' +echo -e "\n"clickhouse-client"\n" ${CLICKHOUSE_BINARY}-client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse-benchmark'\n' +echo -e "\n"clickhouse-benchmark"\n" ${CLICKHOUSE_BINARY}-benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e '\n'clickhouse-server'\n' +echo -e "\n"clickhouse-server"\n" ${CLICKHOUSE_BINARY}-server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e '\n'clickhouse-extract'\n' +echo -e "\n"clickhouse-extract"\n" ${CLICKHOUSE_BINARY}-extract-from-config --help -echo -e '\n'clickhouse-compressor'\n' +echo -e "\n"clickhouse-compressor"\n" ${CLICKHOUSE_BINARY}-compressor --help -echo -e '\n'clickhouse-format'\n' +echo -e "\n"clickhouse-format"\n" ${CLICKHOUSE_BINARY}-format --help -echo -e '\n'clickhouse-copier'\n' +echo -e "\n"clickhouse-copier"\n" ${CLICKHOUSE_BINARY}-copier --help -echo -e '\n'clickhouse-obfuscator'\n' +echo -e "\n"clickhouse-obfuscator"\n" ${CLICKHOUSE_BINARY}-obfuscator --help -echo -e '\n'clickhouse-git '\n' +echo -e "\n"clickhouse-git "\n" ${CLICKHOUSE_BINARY}-git-import --help -echo -e '\n'clickhouse-keeper'\n' +echo -e "\n"clickhouse-keeper"\n" ${CLICKHOUSE_BINARY}-keeper --help -echo -e '\n'clickhouse-keeper'\n' +echo -e "\n"clickhouse-keeper"\n" ${CLICKHOUSE_BINARY}-keeper-converter --help ${CLICKHOUSE_BINARY}-static-files-disk-uploader --help -echo -e '\n'clickhouse-su '\n' +echo -e "\n"clickhouse-su "\n" ${CLICKHOUSE_BINARY}-su --help -echo -e '\n'clickhouse-disks'\n' +echo -e "\n"clickhouse-disks"\n" ${CLICKHOUSE_BINARY}-disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' stty columns $backup_stty_size From f7b6de9fa654c2b252c3cd6eb508a37ddc658f6e Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 31 Jan 2023 13:14:24 +0000 Subject: [PATCH 004/535] I like style check --- programs/install/Install.cpp | 2 +- .../02598_clickhouse_help.reference | 15 ++-- .../0_stateless/02598_clickhouse_help.sh | 75 ++++++++++--------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/programs/install/Install.cpp b/programs/install/Install.cpp index f9f06d9ab36..5aaa6645b3f 100644 --- a/programs/install/Install.cpp +++ b/programs/install/Install.cpp @@ -975,7 +975,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv) namespace { - int start(const std::string & user, const std::string & group, const fs::path & binary, const fs::path & executable, const fs::path & config, const fs::path & pid_file, unsigned max_tries, bool no_sudo) + int start(const std::string & user, const std::string & group, const fs::path & binary, const fs::path & executable, const fs::path & config, const fs::path & pid_file, unsigned max_tries, bool no_sudo) { if (fs::exists(pid_file)) { diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index b38c04542d4..ac6231fddfe 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -299,7 +299,7 @@ Options: Example: /home/ubuntu/thread-ch/clickhouse --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv -clickhouse git +clickhouse git-import A tool to extract information from Git repository for analytics. @@ -491,7 +491,7 @@ example, --http_port=8010 --pidfile=path Write the process ID of the application to given file. -clickhouse keeper +clickhouse keeper-converter Usage: /home/ubuntu/thread-ch/clickhouse --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: @@ -593,7 +593,7 @@ Allowed options: --output-dir arg Directory to put files in non-test mode -clickhouse su +clickhouse su Usage: clickhouse su user:group ... @@ -893,7 +893,7 @@ Options: Example: /home/ubuntu/thread-ch/clickhouse-obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv -clickhouse-git +clickhouse-git-import A tool to extract information from Git repository for analytics. @@ -1085,7 +1085,7 @@ example, --http_port=8010 --pidfile=path Write the process ID of the application to given file. -clickhouse-keeper +clickhouse-keeper-converter Usage: /home/ubuntu/thread-ch/clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: @@ -1094,6 +1094,9 @@ Allowed options: --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots --output-dir arg Directory to place output clickhouse-keeper snapshot + +clickhouse-static-files-disk-uploader + Allowed options: -h [ --help ] produce help message --metadata-path arg Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = @@ -1104,7 +1107,7 @@ Allowed options: --output-dir arg Directory to put files in non-test mode -clickhouse-su +clickhouse-su Usage: clickhouse su user:group ... diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index 26de13fd6cc..c699ccb1f23 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -12,84 +12,85 @@ backup_stty_size=$(stty size | awk '{print $2}') stty columns 120 echo "================BINARY==========================" -echo -e "\n"clickhouse --help"\n" +echo -e "\nclickhouse --help\n" $CLICKHOUSE_BINARY --help -echo -e "\n"clickhouse help"\n" +echo -e "\nclickhouse help\n" $CLICKHOUSE_BINARY help -echo -e "\n"clickhouse local"\n" +echo -e "\nclickhouse local\n" $CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse client"\n" +echo -e "\nclickhouse client\n" $CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse benchmark"\n" +echo -e "\nclickhouse benchmark\n" $CLICKHOUSE_BINARY benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e "\n"clickhouse server"\n" +echo -e "\nclickhouse server\n" $CLICKHOUSE_BINARY server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse extract"\n" +echo -e "\nclickhouse extract\n" $CLICKHOUSE_BINARY extract-from-config --help -echo -e "\n"clickhouse compressor"\n" +echo -e "\nclickhouse compressor\n" $CLICKHOUSE_BINARY compressor --help -echo -e "\n"clickhouse format"\n" +echo -e "\nclickhouse format\n" $CLICKHOUSE_BINARY format --help -echo -e "\n"clickhouse copier"\n" +echo -e "\nclickhouse copier\n" $CLICKHOUSE_BINARY copier --help -echo -e "\n"clickhouse obfuscator"\n" +echo -e "\nclickhouse obfuscator\n" $CLICKHOUSE_BINARY obfuscator --help -echo -e "\n"clickhouse git "\n" +echo -e "\nclickhouse git-import\n" $CLICKHOUSE_BINARY git-import --help -echo -e "\n"clickhouse keeper"\n" +echo -e "\nclickhouse keeper\n" $CLICKHOUSE_BINARY keeper --help -echo -e "\n"clickhouse keeper"\n" +echo -e "\nclickhouse keeper-converter\n" $CLICKHOUSE_BINARY keeper-converter --help -echo -e "\n"clickhouse install"\n" +echo -e "\nclickhouse install\n" $CLICKHOUSE_BINARY install --help -echo -e "\n"clickhouse start"\n" +echo -e "\nclickhouse start\n" $CLICKHOUSE_BINARY start --help -echo -e "\n"clickhouse stop"\n" +echo -e "\nclickhouse stop\n" $CLICKHOUSE_BINARY stop --help -echo -e "\n"clickhouse status"\n" +echo -e "\nclickhouse status\n" $CLICKHOUSE_BINARY status --help -echo -e "\n"clickhouse restart"\n" +echo -e "\nclickhouse restart\n" $CLICKHOUSE_BINARY restart --help -echo -e "\n"clickhouse static"\n" +echo -e "\nclickhouse static\n" $CLICKHOUSE_BINARY static-files-disk-uploader --help -echo -e "\n"clickhouse su "\n" +echo -e "\nclickhouse su\n" $CLICKHOUSE_BINARY su --help -echo -e "\n"clickhouse hash"\n" +echo -e "\nclickhouse hash\n" $CLICKHOUSE_BINARY hash-binary --help | grep -v 'Current binary hash' -echo -e "\n"clickhouse disks"\n" +echo -e "\nclickhouse disks\n" $CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo "================SYMLINK==============================" -echo -e "\n"clickhouse-local"\n" +echo -e "\nclickhouse-local\n" ${CLICKHOUSE_BINARY}-local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse-client"\n" +echo -e "\nclickhouse-client\n" ${CLICKHOUSE_BINARY}-client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse-benchmark"\n" +echo -e "\nclickhouse-benchmark\n" ${CLICKHOUSE_BINARY}-benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e "\n"clickhouse-server"\n" +echo -e "\nclickhouse-server\n" ${CLICKHOUSE_BINARY}-server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\n"clickhouse-extract"\n" +echo -e "\nclickhouse-extract\n" ${CLICKHOUSE_BINARY}-extract-from-config --help -echo -e "\n"clickhouse-compressor"\n" +echo -e "\nclickhouse-compressor\n" ${CLICKHOUSE_BINARY}-compressor --help -echo -e "\n"clickhouse-format"\n" +echo -e "\nclickhouse-format\n" ${CLICKHOUSE_BINARY}-format --help -echo -e "\n"clickhouse-copier"\n" +echo -e "\nclickhouse-copier\n" ${CLICKHOUSE_BINARY}-copier --help -echo -e "\n"clickhouse-obfuscator"\n" +echo -e "\nclickhouse-obfuscator\n" ${CLICKHOUSE_BINARY}-obfuscator --help -echo -e "\n"clickhouse-git "\n" +echo -e "\nclickhouse-git-import\n" ${CLICKHOUSE_BINARY}-git-import --help -echo -e "\n"clickhouse-keeper"\n" +echo -e "\nclickhouse-keeper\n" ${CLICKHOUSE_BINARY}-keeper --help -echo -e "\n"clickhouse-keeper"\n" +echo -e "\nclickhouse-keeper-converter\n" ${CLICKHOUSE_BINARY}-keeper-converter --help +echo -e "\nclickhouse-static-files-disk-uploader\n" ${CLICKHOUSE_BINARY}-static-files-disk-uploader --help -echo -e "\n"clickhouse-su "\n" +echo -e "\nclickhouse-su\n" ${CLICKHOUSE_BINARY}-su --help -echo -e "\n"clickhouse-disks"\n" +echo -e "\nclickhouse-disks\n" ${CLICKHOUSE_BINARY}-disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' stty columns $backup_stty_size From 219847a61d089d073801c72ec5c9d5fbfc53cd79 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Thu, 2 Feb 2023 22:21:08 +0000 Subject: [PATCH 005/535] Try to work same way in tty and notty env --- .../02598_clickhouse_help.reference | 834 +++++++++++++----- .../0_stateless/02598_clickhouse_help.sh | 8 +- 2 files changed, 615 insertions(+), 227 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index ac6231fddfe..74ba962a0ac 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -129,39 +129,51 @@ clickhouse compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. physical file offset) - --offset-in-decompressed-block arg (=0) offset to the decompressed block (i.e. virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed data + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) + --offset-in-decompressed-block arg (=0) + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse format Usage: /home/ubuntu/thread-ch/clickhouse [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line of the formatted query - --allow_settings_after_format_in_insert Allow SETTINGS after FORMAT, but note, that this is not always safe - --seed arg seed (arbitrary string) that determines the result of obfuscation - --max_query_size arg Which part of the query can be read into RAM for parsing (the remaining data - for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth of recursive descend parser). + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query + --allow_settings_after_format_in_insert + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse copier @@ -169,48 +181,191 @@ clickhouse copier Usage: clickhouse copier --config-file --task-path Copies tables from one cluster to another --C, --config-file= load configuration from a given +-C, --config-file= + load + configuration + from + a + given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors +-L, --log-file= + use + given + log + file +-E, --errorlog-file= + use + given + log + file + for + errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, - e.g. 027). ---pidfile=path Write the process ID of the - application to given file. ---task-path=task-path path to task in ZooKeeper ---task-file=task-file path to task file for uploading - in ZooKeeper to task-path ---task-upload-force=task-upload-force Force upload task-file even node - already exists ---safe-mode disables ALTER DROP PARTITION in - case of errors ---copy-fault-probability=copy-fault-probability the copying fails with specified - probability (used to test - partition state recovering) ---move-fault-probability=move-fault-probability the moving fails with specified - probability (used to test - partition state recovering) ---log-level=log-level sets log level ---base-dir=base-dir base directory for copiers, - consecutive copier launches will - populate /base-dir/launch_id/* +-P, --pid-file= + use + given + pidfile +--daemon + Run + application + as + a + daemon. +--umask=mask + Set + the + daemon's + umask + (octal, + e.g. + 027). +--pidfile=path + Write + the + process + ID + of + the + application + to + given + file. +--task-path=task-path + path + to + task + in + ZooKeeper +--task-file=task-file + path + to + task + file + for + uploading + in + ZooKeeper + to + task-path +--task-upload-force=task-upload-force + Force + upload + task-file + even + node + already + exists +--safe-mode + disables + ALTER + DROP + PARTITION + in + case + of + errors +--copy-fault-probability=copy-fault-probability + the + copying + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--move-fault-probability=move-fault-probability + the + moving + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--log-level=log-level + sets + log + level +--base-dir=base-dir + base + directory + for + copiers, + consecutive + copier + launches + will + populate + /base-dir/launch_id/* directories ---experimental-use-sample-offset=experimental-use-sample-offset Use SAMPLE OFFSET query instead - of cityHash64(PRIMARY KEY) % n == +--experimental-use-sample-offset=experimental-use-sample-offset + Use + SAMPLE + OFFSET + query + instead + of + cityHash64(PRIMARY + KEY) + % + n + == k ---status Get for status for current +--status + Get + for + status + for + current execution ---max-table-tries=max-table-tries Number of tries for the copy - table task ---max-shard-partition-tries=max-shard-partition-tries Number of tries for the copy one - partition task ---max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter Number of tries for final ALTER - ATTACH to destination table ---retry-delay-ms=retry-delay-ms Delay between task retries ---help produce this help message +--max-table-tries=max-table-tries + Number + of + tries + for + the + copy + table + task +--max-shard-partition-tries=max-shard-partition-tries + Number + of + tries + for + the + copy + one + partition + task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter + Number + of + tries + for + final + ALTER + ATTACH + to + destination + table +--retry-delay-ms=retry-delay-ms + Delay + between + task + retries +--help + produce + this + help + message clickhouse obfuscator @@ -261,39 +416,64 @@ Usage: /home/ubuntu/thread-ch/clickhouse [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random string with at least 10 bytes - length; note that a seed for each column is derived from this seed and a - column name: you can obfuscate data for different tables and as long as - you use identical seed and identical column names, the data for - corresponding non-text columns for different tables will be transformed - in the same way, so the data for different tables can be JOINed after - obfuscation - --limit arg if specified - stop after generating that number of rows; the limit can - be also greater than the number of source dataset - in this case it will - process the dataset in a loop more than one time, using different seeds - on every iteration, generating result as large as needed - --silent arg (=0) don't print information messages to stderr - --save arg save the models after training to the specified file. You can use --limit - 0 to skip the generation step. The file is using binary, - platform-dependent, opaque serialization format. The model parameters are - saved, while the seed is not. - --load arg load the models instead of training from the specified file. The table - structure must match the saved file. The seed should be specified - separately, while other model parameters are loaded. - --order arg (=5) order of markov model to generate strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: remove all buckets with count less - than specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible continuations for a context: - remove all histograms with less than specified number of buckets - --frequency-add arg (=0) add a constant to every count to lower probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) size of a sliding window in a source string - its hash is used as a seed - for RNG in markov model + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -451,19 +631,30 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) Skip commits without parents (except the initial commit). These commits - are usually erroneous but they can make sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) Skip commits with duplicate diffs. These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The option can be specified multiple - times. - --skip-paths arg Skip paths that matches regular expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of added + removed lines) is larger - than specified threshold. Does not apply for initial commit. - --stop-after-commit arg Stop processing after specified commit hash. - --threads arg (=8) Number of concurrent git subprocesses to spawn + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: @@ -498,7 +689,8 @@ Allowed options: -h [ --help ] produce help message --zookeeper-logs-dir arg Path to directory with ZooKeeper logs --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper snapshot + --output-dir arg Directory to place output clickhouse-keeper + snapshot clickhouse install @@ -585,7 +777,8 @@ clickhouse static Allowed options: -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = 'database_name') --test-mode Use test mode, which will put data on given url via PUT --link Create symlinks instead of copying @@ -723,39 +916,51 @@ clickhouse-compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. physical file offset) - --offset-in-decompressed-block arg (=0) offset to the decompressed block (i.e. virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed data + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) + --offset-in-decompressed-block arg (=0) + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse-format Usage: /home/ubuntu/thread-ch/clickhouse-format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line of the formatted query - --allow_settings_after_format_in_insert Allow SETTINGS after FORMAT, but note, that this is not always safe - --seed arg seed (arbitrary string) that determines the result of obfuscation - --max_query_size arg Which part of the query can be read into RAM for parsing (the remaining data - for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth of recursive descend parser). + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query + --allow_settings_after_format_in_insert + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse-copier @@ -763,48 +968,191 @@ clickhouse-copier Usage: clickhouse-copier --config-file --task-path Copies tables from one cluster to another --C, --config-file= load configuration from a given +-C, --config-file= + load + configuration + from + a + given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors +-L, --log-file= + use + given + log + file +-E, --errorlog-file= + use + given + log + file + for + errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, - e.g. 027). ---pidfile=path Write the process ID of the - application to given file. ---task-path=task-path path to task in ZooKeeper ---task-file=task-file path to task file for uploading - in ZooKeeper to task-path ---task-upload-force=task-upload-force Force upload task-file even node - already exists ---safe-mode disables ALTER DROP PARTITION in - case of errors ---copy-fault-probability=copy-fault-probability the copying fails with specified - probability (used to test - partition state recovering) ---move-fault-probability=move-fault-probability the moving fails with specified - probability (used to test - partition state recovering) ---log-level=log-level sets log level ---base-dir=base-dir base directory for copiers, - consecutive copier launches will - populate /base-dir/launch_id/* +-P, --pid-file= + use + given + pidfile +--daemon + Run + application + as + a + daemon. +--umask=mask + Set + the + daemon's + umask + (octal, + e.g. + 027). +--pidfile=path + Write + the + process + ID + of + the + application + to + given + file. +--task-path=task-path + path + to + task + in + ZooKeeper +--task-file=task-file + path + to + task + file + for + uploading + in + ZooKeeper + to + task-path +--task-upload-force=task-upload-force + Force + upload + task-file + even + node + already + exists +--safe-mode + disables + ALTER + DROP + PARTITION + in + case + of + errors +--copy-fault-probability=copy-fault-probability + the + copying + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--move-fault-probability=move-fault-probability + the + moving + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--log-level=log-level + sets + log + level +--base-dir=base-dir + base + directory + for + copiers, + consecutive + copier + launches + will + populate + /base-dir/launch_id/* directories ---experimental-use-sample-offset=experimental-use-sample-offset Use SAMPLE OFFSET query instead - of cityHash64(PRIMARY KEY) % n == +--experimental-use-sample-offset=experimental-use-sample-offset + Use + SAMPLE + OFFSET + query + instead + of + cityHash64(PRIMARY + KEY) + % + n + == k ---status Get for status for current +--status + Get + for + status + for + current execution ---max-table-tries=max-table-tries Number of tries for the copy - table task ---max-shard-partition-tries=max-shard-partition-tries Number of tries for the copy one - partition task ---max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter Number of tries for final ALTER - ATTACH to destination table ---retry-delay-ms=retry-delay-ms Delay between task retries ---help produce this help message +--max-table-tries=max-table-tries + Number + of + tries + for + the + copy + table + task +--max-shard-partition-tries=max-shard-partition-tries + Number + of + tries + for + the + copy + one + partition + task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter + Number + of + tries + for + final + ALTER + ATTACH + to + destination + table +--retry-delay-ms=retry-delay-ms + Delay + between + task + retries +--help + produce + this + help + message clickhouse-obfuscator @@ -855,39 +1203,64 @@ Usage: /home/ubuntu/thread-ch/clickhouse-obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random string with at least 10 bytes - length; note that a seed for each column is derived from this seed and a - column name: you can obfuscate data for different tables and as long as - you use identical seed and identical column names, the data for - corresponding non-text columns for different tables will be transformed - in the same way, so the data for different tables can be JOINed after - obfuscation - --limit arg if specified - stop after generating that number of rows; the limit can - be also greater than the number of source dataset - in this case it will - process the dataset in a loop more than one time, using different seeds - on every iteration, generating result as large as needed - --silent arg (=0) don't print information messages to stderr - --save arg save the models after training to the specified file. You can use --limit - 0 to skip the generation step. The file is using binary, - platform-dependent, opaque serialization format. The model parameters are - saved, while the seed is not. - --load arg load the models instead of training from the specified file. The table - structure must match the saved file. The seed should be specified - separately, while other model parameters are loaded. - --order arg (=5) order of markov model to generate strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: remove all buckets with count less - than specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible continuations for a context: - remove all histograms with less than specified number of buckets - --frequency-add arg (=0) add a constant to every count to lower probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) size of a sliding window in a source string - its hash is used as a seed - for RNG in markov model + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -1045,19 +1418,30 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) Skip commits without parents (except the initial commit). These commits - are usually erroneous but they can make sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) Skip commits with duplicate diffs. These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The option can be specified multiple - times. - --skip-paths arg Skip paths that matches regular expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of added + removed lines) is larger - than specified threshold. Does not apply for initial commit. - --stop-after-commit arg Stop processing after specified commit hash. - --threads arg (=8) Number of concurrent git subprocesses to spawn + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: @@ -1092,14 +1476,16 @@ Allowed options: -h [ --help ] produce help message --zookeeper-logs-dir arg Path to directory with ZooKeeper logs --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper snapshot + --output-dir arg Directory to place output clickhouse-keeper + snapshot clickhouse-static-files-disk-uploader Allowed options: -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = 'database_name') --test-mode Use test mode, which will put data on given url via PUT --link Create symlinks instead of copying diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index c699ccb1f23..43dfb3d9c28 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -7,9 +7,11 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # We have to use fixed terminal width. It may break other tests results formatting. +# In CI there is no tty and we just ignore failed stty calls. +# Set 80 to have same as default size as in notty. +backup_stty_size=$(stty size | awk '{print $2}' ||:) 2>/dev/null +stty columns 80 2>/dev/null ||: -backup_stty_size=$(stty size | awk '{print $2}') -stty columns 120 echo "================BINARY==========================" echo -e "\nclickhouse --help\n" @@ -93,4 +95,4 @@ ${CLICKHOUSE_BINARY}-su --help echo -e "\nclickhouse-disks\n" ${CLICKHOUSE_BINARY}-disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -stty columns $backup_stty_size +stty columns $backup_stty_size 2>/dev/null ||: From 889134929c92c1bf0da2313e1b01f05770854584 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Fri, 3 Feb 2023 09:56:51 +0000 Subject: [PATCH 006/535] fix --- tests/queries/0_stateless/02598_clickhouse_help.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index 43dfb3d9c28..f99bf61cba8 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -9,7 +9,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # We have to use fixed terminal width. It may break other tests results formatting. # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. -backup_stty_size=$(stty size | awk '{print $2}' ||:) 2>/dev/null +backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) stty columns 80 2>/dev/null ||: echo "================BINARY==========================" From 30ff98d511a100109b6d4d57a79990cb218f109d Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 21 Nov 2022 16:36:28 -0300 Subject: [PATCH 007/535] tmp commit --- src/Functions/CMakeLists.txt | 5 +- src/Functions/keyvaluepair/CMakeLists.txt | 3 + .../keyvaluepair/KeyValuePairExtractor.h | 26 ++++ .../KeyValuePairExtractorBuilder.cpp | 26 ++++ .../KeyValuePairExtractorBuilder.h | 21 +++ .../keyvaluepair/impl/KeyStateHandler.cpp | 125 ++++++++++++++++++ .../keyvaluepair/impl/KeyStateHandler.h | 20 +++ .../impl/KeyValuePairEscapingProcessor.cpp | 37 ++++++ .../impl/KeyValuePairEscapingProcessor.h | 20 +++ .../LazyEscapingKeyValuePairExtractor.cpp | 117 ++++++++++++++++ .../impl/LazyEscapingKeyValuePairExtractor.h | 51 +++++++ src/Functions/keyvaluepair/impl/State.h | 26 ++++ .../keyvaluepair/impl/StateHandler.cpp | 12 ++ .../keyvaluepair/impl/StateHandler.h | 13 ++ .../keyvaluepair/impl/ValueStateHandler.cpp | 106 +++++++++++++++ .../keyvaluepair/impl/ValueStateHandler.h | 20 +++ src/Functions/parseKeyValue.cpp | 85 ++++++++++++ src/Functions/parseKeyValue.h | 37 ++++++ 18 files changed, 749 insertions(+), 1 deletion(-) create mode 100644 src/Functions/keyvaluepair/CMakeLists.txt create mode 100644 src/Functions/keyvaluepair/KeyValuePairExtractor.h create mode 100644 src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp create mode 100644 src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h create mode 100644 src/Functions/keyvaluepair/impl/KeyStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/impl/KeyStateHandler.h create mode 100644 src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp create mode 100644 src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h create mode 100644 src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp create mode 100644 src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h create mode 100644 src/Functions/keyvaluepair/impl/State.h create mode 100644 src/Functions/keyvaluepair/impl/StateHandler.cpp create mode 100644 src/Functions/keyvaluepair/impl/StateHandler.h create mode 100644 src/Functions/keyvaluepair/impl/ValueStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/impl/ValueStateHandler.h create mode 100644 src/Functions/parseKeyValue.cpp create mode 100644 src/Functions/parseKeyValue.h diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 45543f57b37..23fb23a8d90 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -6,7 +6,7 @@ add_headers_and_sources(clickhouse_functions .) list(REMOVE_ITEM clickhouse_functions_sources IFunction.cpp FunctionFactory.cpp FunctionHelpers.cpp extractTimeZoneFromFunctionArguments.cpp FunctionsLogical.cpp) list(REMOVE_ITEM clickhouse_functions_headers IFunction.h FunctionFactory.h FunctionHelpers.h extractTimeZoneFromFunctionArguments.h FunctionsLogical.h) -add_library(clickhouse_functions_obj OBJECT ${clickhouse_functions_sources}) +add_library(clickhouse_functions_obj OBJECT ${clickhouse_functions_sources} parseKeyValue.cpp parseKeyValue.h) list (APPEND OBJECT_LIBS $) @@ -107,6 +107,9 @@ endif() add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) +add_subdirectory(keyvaluepair) +list (APPEND PRIVATE_LIBS KeyValuePairExtractorLib) + # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) diff --git a/src/Functions/keyvaluepair/CMakeLists.txt b/src/Functions/keyvaluepair/CMakeLists.txt new file mode 100644 index 00000000000..c4388eee389 --- /dev/null +++ b/src/Functions/keyvaluepair/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(KeyValuePairExtractorLib impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/KeyStateHandler.cpp impl/KeyStateHandler.h impl/State.h impl/ValueStateHandler.cpp impl/ValueStateHandler.h impl/StateHandler.cpp impl/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) + +target_link_libraries(KeyValuePairExtractorLib PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/KeyValuePairExtractor.h new file mode 100644 index 00000000000..e899a6b6008 --- /dev/null +++ b/src/Functions/keyvaluepair/KeyValuePairExtractor.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +/* + * Extracts key value pairs from strings. Strings do not need to be key-value pair only, + * it can contain "noise". The below grammar is a simplified representation of what is expected/ supported: + * + * line = (reserved_char* key_value_pair)* reserved_char* + * key_value_pair = key kv_separator value + * key = | asciichar asciialphanumeric* + * kv_separator = ':' + * value = | asciialphanum* + * item_delimiter = ',' + * + * Both key and values accepts underscores as well. Special characters must be escaped. + * Control characters (key_value_pair_separator, item_delimiter, escape_character and enclosing_character) are customizable + * */ +struct KeyValuePairExtractor { + using Response = std::unordered_map; + + virtual ~KeyValuePairExtractor() = default; + + virtual Response extract(const std::string & file) = 0; +}; diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp new file mode 100644 index 00000000000..7b47c8c4578 --- /dev/null +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp @@ -0,0 +1,26 @@ +#include "KeyValuePairExtractorBuilder.h" +#include "impl/LazyEscapingKeyValuePairExtractor.h" + +KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) { + key_value_pair_delimiter = key_value_pair_delimiter_; + return *this; +} + +KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withEscapeCharacter(char escape_character_) { + escape_character = escape_character_; + return *this; +} + +KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withItemDelimiter(char item_delimiter_) { + item_delimiter = item_delimiter_; + return *this; +} + +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharacter(std::optional enclosing_character_) { + enclosing_character = enclosing_character_; + return *this; +} + +std::shared_ptr KeyValuePairExtractorBuilder::build() { + return std::make_shared(item_delimiter, key_value_pair_delimiter, escape_character, enclosing_character); +} diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h new file mode 100644 index 00000000000..18c42399846 --- /dev/null +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include "KeyValuePairExtractor.h" + +class KeyValuePairExtractorBuilder { +public: + KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter); + KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character); + KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter); + KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character); + + std::shared_ptr build(); + +private: + char key_value_pair_delimiter = ':'; + char escape_character = '\\'; + char item_delimiter = ','; + std::optional enclosing_character; +}; diff --git a/src/Functions/keyvaluepair/impl/KeyStateHandler.cpp b/src/Functions/keyvaluepair/impl/KeyStateHandler.cpp new file mode 100644 index 00000000000..f2a71f7edfa --- /dev/null +++ b/src/Functions/keyvaluepair/impl/KeyStateHandler.cpp @@ -0,0 +1,125 @@ +#include "KeyStateHandler.h" + +KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_character_, + std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) +{} + +NextState KeyStateHandler::waitKey(const std::string &file, size_t pos) const { + while (pos < file.size()) { + const auto current_character = file[pos]; + if (isalpha(current_character)) { + return { + pos, + State::READING_KEY + }; + } else if (enclosing_character && current_character == enclosing_character) { + return { + pos + 1u, + State::READING_ENCLOSED_KEY + }; + } else { + pos++; + } + } + + return { + pos, + State::END + }; +} + +NextStateWithElement KeyStateHandler::readKey(const std::string &file, size_t pos) const { + bool escape = false; + + auto start_index = pos; + + while (pos < file.size()) { + const auto current_character = file[pos++]; + if (escape) { + escape = false; + } else if (escape_character == current_character) { + escape = true; + } else if (current_character == key_value_delimiter) { + // not checking for empty key because with current waitKey implementation + // there is no way this piece of code will be reached for the very first key character + return { + { + pos, + State::WAITING_VALUE + }, + createElement(file, start_index, pos - 1) + }; + } else if (!std::isalnum(current_character) && current_character != '_') { + return { + { + pos, + State::WAITING_KEY + }, + {} + }; + } + } + + return { + { + pos, + State::END + }, + {} + }; +} + +NextStateWithElement KeyStateHandler::readEnclosedKey(const std::string &file, size_t pos) const { + auto start_index = pos; + + while (pos < file.size()) { + const auto current_character = file[pos++]; + + if (enclosing_character == current_character) { + auto is_key_empty = start_index == pos; + + if (is_key_empty) { + return { + { + pos, + State::WAITING_KEY + }, + {} + }; + } + + return { + { + pos, + State::READING_KV_DELIMITER + }, + createElement(file, start_index, pos - 1) + }; + } + } + + return { + { + pos, + State::END + }, + {} + }; +} + +NextState KeyStateHandler::readKeyValueDelimiter(const std::string &file, size_t pos) const { + if (pos == file.size()) { + return { + pos, + State::END + }; + } else { + const auto current_character = file[pos++]; + return { + pos, + current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY + }; + } +} + diff --git a/src/Functions/keyvaluepair/impl/KeyStateHandler.h b/src/Functions/keyvaluepair/impl/KeyStateHandler.h new file mode 100644 index 00000000000..7cd76111dc7 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/KeyStateHandler.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +#include "State.h" +#include "StateHandler.h" + +class KeyStateHandler : StateHandler { +public: + KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); + + [[nodiscard]] NextState waitKey(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readKey(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEnclosedKey(const std::string &file, size_t pos) const; + [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; + +private: + const char key_value_delimiter; +}; diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp new file mode 100644 index 00000000000..7800662e63f --- /dev/null +++ b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp @@ -0,0 +1,37 @@ +#include "KeyValuePairEscapingProcessor.h" + +KeyValuePairEscapingProcessor::KeyValuePairEscapingProcessor(char escape_character_) +: escape_character(escape_character_) +{} + +KeyValuePairEscapingProcessor::Response KeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const { + Response response; + + response.reserve(response_views.size()); + + for (auto [key_view, value_view] : response_views) { + response[escape(key_view)] = escape(value_view); + } + + return response; +} + +std::string KeyValuePairEscapingProcessor::escape(std::string_view element_view) const { + bool escape = false; + std::string element; + + element.reserve(element_view.size()); + + for (char character : element_view) { + if (escape) { + escape = false; + } else if (character == escape_character) { + escape = true; + continue; + } + + element.push_back(character); + } + + return element; +} diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h new file mode 100644 index 00000000000..2718be09ac7 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +class KeyValuePairEscapingProcessor { +public: + + using Response = std::unordered_map; + using ResponseViews = std::unordered_map; + + explicit KeyValuePairEscapingProcessor(char escape_character); + + [[nodiscard]] Response process(const ResponseViews & input) const; + +private: + const char escape_character; + + [[nodiscard]] std::string escape(std::string_view element_view) const; +}; diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp new file mode 100644 index 00000000000..949f9e46106 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp @@ -0,0 +1,117 @@ +#include "LazyEscapingKeyValuePairExtractor.h" +#include "KeyValuePairEscapingProcessor.h" + +#include + +LazyEscapingKeyValuePairExtractor::LazyEscapingKeyValuePairExtractor(char item_delimiter, char key_value_delimiter, char escape_character_, std::optional enclosing_character) + : escape_character(escape_character_), keyStateHandler(key_value_delimiter, escape_character, enclosing_character), + valueStateHandler(escape_character, item_delimiter, enclosing_character) +{} + +LazyEscapingKeyValuePairExtractor::Response LazyEscapingKeyValuePairExtractor::extract(const std::string & file) { + + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + while (state != State::END) { + auto nextState = extract(file, pos, state); + + pos = nextState.pos; + state = nextState.state; + } + + KeyValuePairEscapingProcessor escapingProcessor(escape_character); + + return escapingProcessor.process(response_views); +} + +NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, std::size_t pos, State state) { + switch (state) { + case State::WAITING_KEY: + return waitKey(file, pos); + case State::READING_KEY: + return readKey(file, pos); + case State::READING_ENCLOSED_KEY: + return readEnclosedKey(file, pos); + case State::READING_KV_DELIMITER: + return readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return waitValue(file, pos); + case State::READING_VALUE: + return readValue(file, pos); + case State::READING_ENCLOSED_VALUE: + return readEnclosedValue(file, pos); + case State::READING_EMPTY_VALUE: + return readEmptyValue(file, pos); + case State::FLUSH_PAIR: + return flushPair(file, pos); + case END: + return { + pos, + state + }; + } +} + + +NextState LazyEscapingKeyValuePairExtractor::waitKey(const std::string & file, size_t pos) const { + return keyStateHandler.waitKey(file, pos); +} + +NextState LazyEscapingKeyValuePairExtractor::readKeyValueDelimiter(const std::string &file, size_t pos) const { + return keyStateHandler.readKeyValueDelimiter(file, pos); +} + +NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, size_t pos) { + auto [next_state, next_key] = keyStateHandler.readKey(file, pos); + + key = next_key; + + return next_state; +} + +NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string &file, size_t pos) { + auto [next_state, next_key] = keyStateHandler.readEnclosedKey(file, pos); + + key = next_key; + + return next_state; +} + +NextState LazyEscapingKeyValuePairExtractor::waitValue(const std::string &file, size_t pos) const { + return valueStateHandler.waitValue(file, pos); +} + +NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, size_t pos) { + auto [next_state, next_value] = valueStateHandler.readValue(file, pos); + + value = next_value; + + return next_state; +} + +NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string &file, size_t pos) { + auto [next_state, next_value] = valueStateHandler.readEnclosedValue(file, pos); + + value = next_value; + + return next_state; +} + +NextState LazyEscapingKeyValuePairExtractor::readEmptyValue(const std::string &file, size_t pos) { + auto [next_state, next_value] = valueStateHandler.readEmptyValue(file, pos); + + value = next_value; + + return next_state; +} + +NextState LazyEscapingKeyValuePairExtractor::flushPair(const std::string &file, std::size_t pos) { + response_views[key] = value; + + return { + pos, + pos == file.size() ? State::END : State::WAITING_KEY + }; +} diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h new file mode 100644 index 00000000000..77839214637 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include + +#include "../KeyValuePairExtractor.h" +#include "State.h" +#include "KeyStateHandler.h" +#include "ValueStateHandler.h" + +/* + * Implements key value pair extraction by ignoring escaping and deferring its processing to the end. + * This strategy allows more efficient memory usage in case of very noisy files because it does not have to + * store characters while reading an element. Because of that, std::string_views can be used to store key value pairs. + * + * In the end, the unescaped key value pair views are converted into escaped key value pairs. At this stage, memory is allocated + * to store characters, but noise is no longer an issue. + * */ +class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { +public: + LazyEscapingKeyValuePairExtractor(char item_delimiter, char key_value_delimiter, char escape_character, std::optional enclosing_character); + + [[nodiscard]] Response extract(const std::string & file) override; + +private: + NextState extract(const std::string & file, std::size_t pos, State state); + + NextState waitKey(const std::string & file, size_t pos) const; + NextState readKey(const std::string & file, size_t pos); + NextState readEnclosedKey(const std::string &file, size_t pos); + NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; + + NextState waitValue(const std::string & file, size_t pos) const; + NextState readValue(const std::string & file, size_t pos); + NextState readEnclosedValue(const std::string & file, size_t pos); + NextState readEmptyValue(const std::string & file, size_t pos); + + NextState flushPair(const std::string & file, std::size_t pos); + + char escape_character; + + KeyStateHandler keyStateHandler; + ValueStateHandler valueStateHandler; + + std::string_view key; + std::string_view value; + std::unordered_map response_views; + +}; diff --git a/src/Functions/keyvaluepair/impl/State.h b/src/Functions/keyvaluepair/impl/State.h new file mode 100644 index 00000000000..eaadb4dd88a --- /dev/null +++ b/src/Functions/keyvaluepair/impl/State.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +enum State { + WAITING_KEY, + READING_KEY, + READING_ENCLOSED_KEY, + READING_KV_DELIMITER, + WAITING_VALUE, + READING_VALUE, + READING_ENCLOSED_VALUE, + READING_EMPTY_VALUE, + FLUSH_PAIR, + END +}; + +struct NextState { + std::size_t pos; + State state; +}; + +struct NextStateWithElement { + NextState state; + std::string_view element; +}; diff --git a/src/Functions/keyvaluepair/impl/StateHandler.cpp b/src/Functions/keyvaluepair/impl/StateHandler.cpp new file mode 100644 index 00000000000..82f04b55b02 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/StateHandler.cpp @@ -0,0 +1,12 @@ +#include +#include "StateHandler.h" + +StateHandler::StateHandler(char escape_character_, std::optional enclosing_character_) +: escape_character(escape_character_), enclosing_character(enclosing_character_) +{ + +} + +std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) const { + return std::string_view {file.begin() + begin, file.begin() + end}; +} diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h new file mode 100644 index 00000000000..bf803fff8b7 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +struct StateHandler { + StateHandler(char escape_character, std::optional enclosing_character); + + const char escape_character; + const std::optional enclosing_character; + + [[nodiscard]] std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end) const; +}; diff --git a/src/Functions/keyvaluepair/impl/ValueStateHandler.cpp b/src/Functions/keyvaluepair/impl/ValueStateHandler.cpp new file mode 100644 index 00000000000..d1b210b4ad7 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/ValueStateHandler.cpp @@ -0,0 +1,106 @@ +#include "ValueStateHandler.h" + +ValueStateHandler::ValueStateHandler(char escape_character_, char item_delimiter_, + std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_), item_delimiter(item_delimiter_) +{} + +NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) const { + while (pos < file.size()) { + const auto current_character = file[pos]; + + if (current_character == enclosing_character) { + return { + pos + 1u, + State::READING_ENCLOSED_VALUE + }; + } else if (current_character == item_delimiter) { + return { + pos, + State::READING_EMPTY_VALUE + }; + } else if (std::isalnum(current_character) || current_character == '_') { + return { + pos, + State::READING_VALUE + }; + } else { + pos++; + } + } + + return { + pos, + State::READING_EMPTY_VALUE + }; +} + +NextStateWithElement ValueStateHandler::readValue(const std::string &file, size_t pos) const { + bool escape = false; + + auto start_index = pos; + + while (pos < file.size()) { + const auto current_character = file[pos++]; + if (escape) { + escape = false; + } else if (escape_character == current_character) { + escape = true; + } else if (current_character == item_delimiter || (!std::isalnum(current_character) && current_character != '_')) { + return { + { + pos, + State::FLUSH_PAIR + }, + createElement(file, start_index, pos - 1) + }; + } + } + + // TODO: do I really need the below logic? + // this allows empty values at the end + return { + { + pos, + State::FLUSH_PAIR + }, + createElement(file, start_index, pos) + }; +} + +NextStateWithElement ValueStateHandler::readEnclosedValue(const std::string &file, size_t pos) const { + auto start_index = pos; + + while (pos < file.size()) { + const auto current_character = file[pos++]; + if (enclosing_character == current_character) { + // not checking for empty value because with current waitValue implementation + // there is no way this piece of code will be reached for the very first value character + return { + { + pos, + State::FLUSH_PAIR + }, + createElement(file, start_index, pos - 1) + }; + } + } + + return { + { + pos, + State::END + }, + {} + }; +} + +NextStateWithElement ValueStateHandler::readEmptyValue(const std::string &, size_t pos) const { + return { + { + pos + 1, + State::FLUSH_PAIR + }, + {} + }; +} diff --git a/src/Functions/keyvaluepair/impl/ValueStateHandler.h b/src/Functions/keyvaluepair/impl/ValueStateHandler.h new file mode 100644 index 00000000000..fbbf0f191a8 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/ValueStateHandler.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include "State.h" +#include "StateHandler.h" + +class ValueStateHandler : StateHandler { + +public: + ValueStateHandler(char escape_character, char item_delimiter, std::optional enclosing_character); + + [[nodiscard]] NextState waitValue(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readValue(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEnclosedValue(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEmptyValue(const std::string & file, size_t pos) const; + +private: + const char item_delimiter; +}; diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp new file mode 100644 index 00000000000..968eef3d45e --- /dev/null +++ b/src/Functions/parseKeyValue.cpp @@ -0,0 +1,85 @@ +#include "parseKeyValue.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +ParseKeyValue::ParseKeyValue() +: return_type(std::make_shared(std::make_shared(), std::make_shared())) +{ +} + +String ParseKeyValue::getName() const +{ + return name; +} + +ColumnPtr ParseKeyValue::executeImpl([[maybe_unused]] const ColumnsWithTypeAndName & arguments, [[maybe_unused]] const DataTypePtr & result_type, [[maybe_unused]] size_t input_rows_count) const +{ + auto column = return_type->createColumn(); + [[maybe_unused]] auto * map_column = assert_cast(column.get()); + + auto data_column = arguments[0].column; + + auto item_delimiter = arguments[1].column->getDataAt(0).toView(); + auto key_value_pair_delimiter = arguments[2].column->getDataAt(0).toView(); + + for (auto i = 0u; i < data_column->size(); i++) + { + auto row = data_column->getDataAt(i); + + auto extractor = KeyValuePairExtractorBuilder() + .withKeyValuePairDelimiter(key_value_pair_delimiter.front()) + .withItemDelimiter(item_delimiter.front()) + .build(); + + auto response = extractor->extract(row.toString()); + for (auto & pair : response) { + std::cout<(); +} + +} diff --git a/src/Functions/parseKeyValue.h b/src/Functions/parseKeyValue.h new file mode 100644 index 00000000000..f376cbae8fa --- /dev/null +++ b/src/Functions/parseKeyValue.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +namespace DB { + +class ParseKeyValue : public IFunction +{ +public: + ParseKeyValue(); + + static constexpr auto name = "parseKeyValue"; + + static FunctionPtr create(ContextPtr) + { + return std::make_shared(); + } + + /// Get the main function name. + String getName() const override; + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override; + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override; + + bool isVariadic() const override; + + size_t getNumberOfArguments() const override; + + DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override; + +private: + DataTypePtr return_type; +}; + +} From c49abad4415adfb9f6c41f5cc8895e9fee6e372e Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 10:35:13 -0300 Subject: [PATCH 008/535] add value allowlist --- src/Functions/keyvaluepair/CMakeLists.txt | 2 +- .../KeyValuePairExtractorBuilder.cpp | 17 ++++++++-- .../KeyValuePairExtractorBuilder.h | 3 ++ .../LazyEscapingKeyValuePairExtractor.cpp | 31 +++++++++---------- .../impl/LazyEscapingKeyValuePairExtractor.h | 24 +++++++------- .../impl/{ => state}/KeyStateHandler.cpp | 0 .../impl/{ => state}/KeyStateHandler.h | 0 .../keyvaluepair/impl/{ => state}/State.h | 0 .../impl/{ => state}/StateHandler.cpp | 0 .../impl/{ => state}/StateHandler.h | 0 .../impl/{ => state}/ValueStateHandler.cpp | 14 ++++++--- .../impl/{ => state}/ValueStateHandler.h | 7 ++++- 12 files changed, 59 insertions(+), 39 deletions(-) rename src/Functions/keyvaluepair/impl/{ => state}/KeyStateHandler.cpp (100%) rename src/Functions/keyvaluepair/impl/{ => state}/KeyStateHandler.h (100%) rename src/Functions/keyvaluepair/impl/{ => state}/State.h (100%) rename src/Functions/keyvaluepair/impl/{ => state}/StateHandler.cpp (100%) rename src/Functions/keyvaluepair/impl/{ => state}/StateHandler.h (100%) rename src/Functions/keyvaluepair/impl/{ => state}/ValueStateHandler.cpp (83%) rename src/Functions/keyvaluepair/impl/{ => state}/ValueStateHandler.h (71%) diff --git a/src/Functions/keyvaluepair/CMakeLists.txt b/src/Functions/keyvaluepair/CMakeLists.txt index c4388eee389..8323d7477d0 100644 --- a/src/Functions/keyvaluepair/CMakeLists.txt +++ b/src/Functions/keyvaluepair/CMakeLists.txt @@ -1,3 +1,3 @@ -add_library(KeyValuePairExtractorLib impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/KeyStateHandler.cpp impl/KeyStateHandler.h impl/State.h impl/ValueStateHandler.cpp impl/ValueStateHandler.h impl/StateHandler.cpp impl/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) +add_library(KeyValuePairExtractorLib impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) target_link_libraries(KeyValuePairExtractorLib PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp index 7b47c8c4578..8edf3a142c8 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp @@ -1,5 +1,7 @@ #include "KeyValuePairExtractorBuilder.h" -#include "impl/LazyEscapingKeyValuePairExtractor.h" +#include +#include +#include KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) { key_value_pair_delimiter = key_value_pair_delimiter_; @@ -21,6 +23,15 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharac return *this; } -std::shared_ptr KeyValuePairExtractorBuilder::build() { - return std::make_shared(item_delimiter, key_value_pair_delimiter, escape_character, enclosing_character); +KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) { + value_special_character_allowlist = std::move(value_special_character_allowlist_); + return *this; +} + +std::shared_ptr KeyValuePairExtractorBuilder::build() { + KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); + ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); + KeyValuePairEscapingProcessor escaping_processor(escape_character); + + return std::make_shared(key_state_handler, value_state_handler, escaping_processor); } diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h index 18c42399846..32776e02c06 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h @@ -2,6 +2,7 @@ #include #include +#include #include "KeyValuePairExtractor.h" class KeyValuePairExtractorBuilder { @@ -10,6 +11,7 @@ public: KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character); KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter); KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character); + KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist); std::shared_ptr build(); @@ -18,4 +20,5 @@ private: char escape_character = '\\'; char item_delimiter = ','; std::optional enclosing_character; + std::unordered_set value_special_character_allowlist; }; diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp index 949f9e46106..49ae2a38cfc 100644 --- a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp @@ -1,11 +1,10 @@ -#include "LazyEscapingKeyValuePairExtractor.h" -#include "KeyValuePairEscapingProcessor.h" - #include +#include "LazyEscapingKeyValuePairExtractor.h" -LazyEscapingKeyValuePairExtractor::LazyEscapingKeyValuePairExtractor(char item_delimiter, char key_value_delimiter, char escape_character_, std::optional enclosing_character) - : escape_character(escape_character_), keyStateHandler(key_value_delimiter, escape_character, enclosing_character), - valueStateHandler(escape_character, item_delimiter, enclosing_character) +LazyEscapingKeyValuePairExtractor::LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, + ValueStateHandler value_state_handler_, + KeyValuePairEscapingProcessor escaping_processor_) + : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_) {} LazyEscapingKeyValuePairExtractor::Response LazyEscapingKeyValuePairExtractor::extract(const std::string & file) { @@ -21,9 +20,7 @@ LazyEscapingKeyValuePairExtractor::Response LazyEscapingKeyValuePairExtractor::e state = nextState.state; } - KeyValuePairEscapingProcessor escapingProcessor(escape_character); - - return escapingProcessor.process(response_views); + return escaping_processor.process(response_views); } NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, std::size_t pos, State state) { @@ -56,15 +53,15 @@ NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, s NextState LazyEscapingKeyValuePairExtractor::waitKey(const std::string & file, size_t pos) const { - return keyStateHandler.waitKey(file, pos); + return key_state_handler.waitKey(file, pos); } NextState LazyEscapingKeyValuePairExtractor::readKeyValueDelimiter(const std::string &file, size_t pos) const { - return keyStateHandler.readKeyValueDelimiter(file, pos); + return key_state_handler.readKeyValueDelimiter(file, pos); } NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, size_t pos) { - auto [next_state, next_key] = keyStateHandler.readKey(file, pos); + auto [next_state, next_key] = key_state_handler.readKey(file, pos); key = next_key; @@ -72,7 +69,7 @@ NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, s } NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string &file, size_t pos) { - auto [next_state, next_key] = keyStateHandler.readEnclosedKey(file, pos); + auto [next_state, next_key] = key_state_handler.readEnclosedKey(file, pos); key = next_key; @@ -80,11 +77,11 @@ NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string & } NextState LazyEscapingKeyValuePairExtractor::waitValue(const std::string &file, size_t pos) const { - return valueStateHandler.waitValue(file, pos); + return value_state_handler.waitValue(file, pos); } NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = valueStateHandler.readValue(file, pos); + auto [next_state, next_value] = value_state_handler.readValue(file, pos); value = next_value; @@ -92,7 +89,7 @@ NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, } NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = valueStateHandler.readEnclosedValue(file, pos); + auto [next_state, next_value] = value_state_handler.readEnclosedValue(file, pos); value = next_value; @@ -100,7 +97,7 @@ NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string } NextState LazyEscapingKeyValuePairExtractor::readEmptyValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = valueStateHandler.readEmptyValue(file, pos); + auto [next_state, next_value] = value_state_handler.readEmptyValue(file, pos); value = next_value; diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h index 77839214637..91a7484ebce 100644 --- a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h @@ -1,14 +1,13 @@ #pragma once -#include -#include -#include #include - -#include "../KeyValuePairExtractor.h" -#include "State.h" -#include "KeyStateHandler.h" -#include "ValueStateHandler.h" +#include +#include +#include +#include +#include +#include +#include /* * Implements key value pair extraction by ignoring escaping and deferring its processing to the end. @@ -20,7 +19,7 @@ * */ class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { public: - LazyEscapingKeyValuePairExtractor(char item_delimiter, char key_value_delimiter, char escape_character, std::optional enclosing_character); + LazyEscapingKeyValuePairExtractor(KeyStateHandler keyStateHandler, ValueStateHandler valueStateHandler, KeyValuePairEscapingProcessor keyValuePairEscapingProcessor); [[nodiscard]] Response extract(const std::string & file) override; @@ -39,10 +38,9 @@ private: NextState flushPair(const std::string & file, std::size_t pos); - char escape_character; - - KeyStateHandler keyStateHandler; - ValueStateHandler valueStateHandler; + KeyStateHandler key_state_handler; + ValueStateHandler value_state_handler; + KeyValuePairEscapingProcessor escaping_processor; std::string_view key; std::string_view value; diff --git a/src/Functions/keyvaluepair/impl/KeyStateHandler.cpp b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/KeyStateHandler.cpp rename to src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp diff --git a/src/Functions/keyvaluepair/impl/KeyStateHandler.h b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h similarity index 100% rename from src/Functions/keyvaluepair/impl/KeyStateHandler.h rename to src/Functions/keyvaluepair/impl/state/KeyStateHandler.h diff --git a/src/Functions/keyvaluepair/impl/State.h b/src/Functions/keyvaluepair/impl/state/State.h similarity index 100% rename from src/Functions/keyvaluepair/impl/State.h rename to src/Functions/keyvaluepair/impl/state/State.h diff --git a/src/Functions/keyvaluepair/impl/StateHandler.cpp b/src/Functions/keyvaluepair/impl/state/StateHandler.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/StateHandler.cpp rename to src/Functions/keyvaluepair/impl/state/StateHandler.cpp diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/state/StateHandler.h similarity index 100% rename from src/Functions/keyvaluepair/impl/StateHandler.h rename to src/Functions/keyvaluepair/impl/state/StateHandler.h diff --git a/src/Functions/keyvaluepair/impl/ValueStateHandler.cpp b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp similarity index 83% rename from src/Functions/keyvaluepair/impl/ValueStateHandler.cpp rename to src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp index d1b210b4ad7..f0b4201ae53 100644 --- a/src/Functions/keyvaluepair/impl/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp @@ -1,8 +1,10 @@ #include "ValueStateHandler.h" ValueStateHandler::ValueStateHandler(char escape_character_, char item_delimiter_, - std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_), item_delimiter(item_delimiter_) + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(escape_character_, enclosing_character_), item_delimiter(item_delimiter_), + special_character_allowlist(std::move(special_character_allowlist_)) {} NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) const { @@ -19,7 +21,7 @@ NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) cons pos, State::READING_EMPTY_VALUE }; - } else if (std::isalnum(current_character) || current_character == '_') { + } else if (isValidCharacter(current_character)) { return { pos, State::READING_VALUE @@ -46,7 +48,7 @@ NextStateWithElement ValueStateHandler::readValue(const std::string &file, size_ escape = false; } else if (escape_character == current_character) { escape = true; - } else if (current_character == item_delimiter || (!std::isalnum(current_character) && current_character != '_')) { + } else if (current_character == item_delimiter || !isValidCharacter(current_character)) { return { { pos, @@ -104,3 +106,7 @@ NextStateWithElement ValueStateHandler::readEmptyValue(const std::string &, size {} }; } + +bool ValueStateHandler::isValidCharacter(char character) const { + return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; +} diff --git a/src/Functions/keyvaluepair/impl/ValueStateHandler.h b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h similarity index 71% rename from src/Functions/keyvaluepair/impl/ValueStateHandler.h rename to src/Functions/keyvaluepair/impl/state/ValueStateHandler.h index fbbf0f191a8..36d7616a5d2 100644 --- a/src/Functions/keyvaluepair/impl/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h @@ -2,13 +2,15 @@ #include #include +#include #include "State.h" #include "StateHandler.h" class ValueStateHandler : StateHandler { public: - ValueStateHandler(char escape_character, char item_delimiter, std::optional enclosing_character); + ValueStateHandler(char escape_character, char item_delimiter, + std::optional enclosing_character, std::unordered_set special_character_allowlist_); [[nodiscard]] NextState waitValue(const std::string & file, size_t pos) const; [[nodiscard]] NextStateWithElement readValue(const std::string & file, size_t pos) const; @@ -17,4 +19,7 @@ public: private: const char item_delimiter; + std::unordered_set special_character_allowlist; + + bool isValidCharacter(char character) const; }; From 61b3b244b829175d5692da1489968b7eb9205621 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 10:41:37 -0300 Subject: [PATCH 009/535] Move everything to DB namespace --- .../keyvaluepair/KeyValuePairExtractor.h | 4 ++++ .../KeyValuePairExtractorBuilder.cpp | 5 +++++ .../KeyValuePairExtractorBuilder.h | 5 +++++ .../impl/KeyValuePairEscapingProcessor.cpp | 5 +++++ .../impl/KeyValuePairEscapingProcessor.h | 5 +++++ .../LazyEscapingKeyValuePairExtractor.cpp | 5 +++++ .../impl/LazyEscapingKeyValuePairExtractor.h | 6 ++++++ .../impl/state/KeyStateHandler.cpp | 16 ++++++++------ .../keyvaluepair/impl/state/KeyStateHandler.h | 5 +++++ src/Functions/keyvaluepair/impl/state/State.h | 5 +++++ .../keyvaluepair/impl/state/StateHandler.cpp | 7 ++++++- .../keyvaluepair/impl/state/StateHandler.h | 5 +++++ .../impl/state/ValueStateHandler.cpp | 21 ++++++++++++------- .../impl/state/ValueStateHandler.h | 5 +++++ 14 files changed, 84 insertions(+), 15 deletions(-) diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/KeyValuePairExtractor.h index e899a6b6008..f0cfdd31346 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/KeyValuePairExtractor.h @@ -3,6 +3,8 @@ #include #include +namespace DB +{ /* * Extracts key value pairs from strings. Strings do not need to be key-value pair only, * it can contain "noise". The below grammar is a simplified representation of what is expected/ supported: @@ -24,3 +26,5 @@ struct KeyValuePairExtractor { virtual Response extract(const std::string & file) = 0; }; + +} diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp index 8edf3a142c8..e56b4e38818 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp @@ -3,6 +3,9 @@ #include #include +namespace DB +{ + KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) { key_value_pair_delimiter = key_value_pair_delimiter_; return *this; @@ -35,3 +38,5 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() { return std::make_shared(key_state_handler, value_state_handler, escaping_processor); } + +} diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h index 32776e02c06..cadfed745fb 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h @@ -5,6 +5,9 @@ #include #include "KeyValuePairExtractor.h" +namespace DB +{ + class KeyValuePairExtractorBuilder { public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter); @@ -22,3 +25,5 @@ private: std::optional enclosing_character; std::unordered_set value_special_character_allowlist; }; + +} diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp index 7800662e63f..6a68d7116b7 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp @@ -1,5 +1,8 @@ #include "KeyValuePairEscapingProcessor.h" +namespace DB +{ + KeyValuePairEscapingProcessor::KeyValuePairEscapingProcessor(char escape_character_) : escape_character(escape_character_) {} @@ -35,3 +38,5 @@ std::string KeyValuePairEscapingProcessor::escape(std::string_view element_view) return element; } + +} diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h index 2718be09ac7..7fe3c229aa5 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h @@ -3,6 +3,9 @@ #include #include +namespace DB +{ + class KeyValuePairEscapingProcessor { public: @@ -18,3 +21,5 @@ private: [[nodiscard]] std::string escape(std::string_view element_view) const; }; + +} diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp index 49ae2a38cfc..df242b72b6a 100644 --- a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp @@ -1,6 +1,9 @@ #include #include "LazyEscapingKeyValuePairExtractor.h" +namespace DB +{ + LazyEscapingKeyValuePairExtractor::LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_, KeyValuePairEscapingProcessor escaping_processor_) @@ -112,3 +115,5 @@ NextState LazyEscapingKeyValuePairExtractor::flushPair(const std::string &file, pos == file.size() ? State::END : State::WAITING_KEY }; } + +} diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h index 91a7484ebce..6949a557ad0 100644 --- a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h @@ -9,6 +9,9 @@ #include #include +namespace DB +{ + /* * Implements key value pair extraction by ignoring escaping and deferring its processing to the end. * This strategy allows more efficient memory usage in case of very noisy files because it does not have to @@ -47,3 +50,6 @@ private: std::unordered_map response_views; }; + +} + diff --git a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp index f2a71f7edfa..9f16fb10e78 100644 --- a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp @@ -1,5 +1,8 @@ #include "KeyStateHandler.h" +namespace DB +{ + KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) @@ -10,13 +13,13 @@ NextState KeyStateHandler::waitKey(const std::string &file, size_t pos) const { const auto current_character = file[pos]; if (isalpha(current_character)) { return { - pos, - State::READING_KEY + pos, + State::READING_KEY }; } else if (enclosing_character && current_character == enclosing_character) { return { - pos + 1u, - State::READING_ENCLOSED_KEY + pos + 1u, + State::READING_ENCLOSED_KEY }; } else { pos++; @@ -24,8 +27,8 @@ NextState KeyStateHandler::waitKey(const std::string &file, size_t pos) const { } return { - pos, - State::END + pos, + State::END }; } @@ -123,3 +126,4 @@ NextState KeyStateHandler::readKeyValueDelimiter(const std::string &file, size_t } } +} diff --git a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h index 7cd76111dc7..badefcfd236 100644 --- a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h @@ -6,6 +6,9 @@ #include "State.h" #include "StateHandler.h" +namespace DB +{ + class KeyStateHandler : StateHandler { public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); @@ -18,3 +21,5 @@ public: private: const char key_value_delimiter; }; + +} diff --git a/src/Functions/keyvaluepair/impl/state/State.h b/src/Functions/keyvaluepair/impl/state/State.h index eaadb4dd88a..d21f7abd63a 100644 --- a/src/Functions/keyvaluepair/impl/state/State.h +++ b/src/Functions/keyvaluepair/impl/state/State.h @@ -2,6 +2,9 @@ #include +namespace DB +{ + enum State { WAITING_KEY, READING_KEY, @@ -24,3 +27,5 @@ struct NextStateWithElement { NextState state; std::string_view element; }; + +} diff --git a/src/Functions/keyvaluepair/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/impl/state/StateHandler.cpp index 82f04b55b02..366c0d776be 100644 --- a/src/Functions/keyvaluepair/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/state/StateHandler.cpp @@ -1,8 +1,11 @@ #include #include "StateHandler.h" +namespace DB +{ + StateHandler::StateHandler(char escape_character_, std::optional enclosing_character_) -: escape_character(escape_character_), enclosing_character(enclosing_character_) + : escape_character(escape_character_), enclosing_character(enclosing_character_) { } @@ -10,3 +13,5 @@ StateHandler::StateHandler(char escape_character_, std::optional enclosing std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) const { return std::string_view {file.begin() + begin, file.begin() + end}; } + +} diff --git a/src/Functions/keyvaluepair/impl/state/StateHandler.h b/src/Functions/keyvaluepair/impl/state/StateHandler.h index bf803fff8b7..0d91a8f08ea 100644 --- a/src/Functions/keyvaluepair/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/state/StateHandler.h @@ -3,6 +3,9 @@ #include #include +namespace DB +{ + struct StateHandler { StateHandler(char escape_character, std::optional enclosing_character); @@ -11,3 +14,5 @@ struct StateHandler { [[nodiscard]] std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end) const; }; + +} diff --git a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp index f0b4201ae53..7f384bddea4 100644 --- a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp @@ -1,5 +1,8 @@ #include "ValueStateHandler.h" +namespace DB +{ + ValueStateHandler::ValueStateHandler(char escape_character_, char item_delimiter_, std::optional enclosing_character_, std::unordered_set special_character_allowlist_) @@ -13,18 +16,18 @@ NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) cons if (current_character == enclosing_character) { return { - pos + 1u, - State::READING_ENCLOSED_VALUE + pos + 1u, + State::READING_ENCLOSED_VALUE }; } else if (current_character == item_delimiter) { return { - pos, - State::READING_EMPTY_VALUE + pos, + State::READING_EMPTY_VALUE }; } else if (isValidCharacter(current_character)) { return { - pos, - State::READING_VALUE + pos, + State::READING_VALUE }; } else { pos++; @@ -32,8 +35,8 @@ NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) cons } return { - pos, - State::READING_EMPTY_VALUE + pos, + State::READING_EMPTY_VALUE }; } @@ -110,3 +113,5 @@ NextStateWithElement ValueStateHandler::readEmptyValue(const std::string &, size bool ValueStateHandler::isValidCharacter(char character) const { return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } + +} diff --git a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h index 36d7616a5d2..96a4ec11d60 100644 --- a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h @@ -6,6 +6,9 @@ #include "State.h" #include "StateHandler.h" +namespace DB +{ + class ValueStateHandler : StateHandler { public: @@ -23,3 +26,5 @@ private: bool isValidCharacter(char character) const; }; + +} From 857a64c08d73767a8fc50ab04dabe2b97ec61650 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 11:14:45 -0300 Subject: [PATCH 010/535] progress --- src/Functions/parseKeyValue.cpp | 125 +++++++++++++++++++++++++++++--- src/Functions/parseKeyValue.h | 24 ++++++ 2 files changed, 140 insertions(+), 9 deletions(-) diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 968eef3d45e..6e1e397fd0d 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -1,7 +1,6 @@ #include "parseKeyValue.h" #include -#include #include #include #include @@ -26,21 +25,16 @@ ColumnPtr ParseKeyValue::executeImpl([[maybe_unused]] const ColumnsWithTypeAndNa auto column = return_type->createColumn(); [[maybe_unused]] auto * map_column = assert_cast(column.get()); - auto data_column = arguments[0].column; - - auto item_delimiter = arguments[1].column->getDataAt(0).toView(); - auto key_value_pair_delimiter = arguments[2].column->getDataAt(0).toView(); + auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); for (auto i = 0u; i < data_column->size(); i++) { auto row = data_column->getDataAt(i); - auto extractor = KeyValuePairExtractorBuilder() - .withKeyValuePairDelimiter(key_value_pair_delimiter.front()) - .withItemDelimiter(item_delimiter.front()) - .build(); + auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); auto response = extractor->extract(row.toString()); + for (auto & pair : response) { std::cout<getDataAt(0).toView().front(); + + if (arguments.size() == 2u) + { + return ParsedArguments { + data_column, + escape_character, + {}, + {}, + {}, + {} + }; + } + + auto key_value_pair_delimiter = arguments[2].column->getDataAt(0).toView().front(); + + if (arguments.size() == 3u) + { + return ParsedArguments { + data_column, + escape_character, + key_value_pair_delimiter, + {}, + {}, + {} + }; + } + + auto item_delimiter = arguments[3].column->getDataAt(0).toView().front(); + + if (arguments.size() == 4u) + { + return ParsedArguments { + data_column, + escape_character, + key_value_pair_delimiter, + item_delimiter, + {}, + {} + }; + } + + auto enclosing_character = arguments[4].column->getDataAt(0).toView().front(); + + if (arguments.size() == 5u) + { + return ParsedArguments { + data_column, + escape_character, + key_value_pair_delimiter, + item_delimiter, + enclosing_character, + {} + }; + } + + return ParsedArguments { + data_column, + escape_character, + key_value_pair_delimiter, + item_delimiter, + enclosing_character, + {} + }; +} + +std::shared_ptr ParseKeyValue::getExtractor( + CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, + CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const +{ + auto builder = KeyValuePairExtractorBuilder(); + + if (escape_character) { + builder.withEscapeCharacter(escape_character.value()); + } + + if (key_value_pair_delimiter) { + builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); + } + + if (item_delimiter) { + builder.withItemDelimiter(item_delimiter.value()); + } + + if (enclosing_character) { + builder.withEnclosingCharacter(enclosing_character.value()); + } + + builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); + + return builder.build(); +} REGISTER_FUNCTION(ParseKeyValue) { diff --git a/src/Functions/parseKeyValue.h b/src/Functions/parseKeyValue.h index f376cbae8fa..253f082683f 100644 --- a/src/Functions/parseKeyValue.h +++ b/src/Functions/parseKeyValue.h @@ -1,12 +1,29 @@ #pragma once +#include + #include #include +#include +#include namespace DB { class ParseKeyValue : public IFunction { + + using CharArgument = std::optional; + using SetArgument = std::unordered_set; + + struct ParsedArguments { + ColumnPtr data_column; + CharArgument escape_character; + CharArgument key_value_pair_delimiter; + CharArgument item_delimiter; + CharArgument enclosing_character; + std::unordered_set value_special_characters_allow_list; + }; + public: ParseKeyValue(); @@ -32,6 +49,13 @@ public: private: DataTypePtr return_type; + + ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments) const; + + std::shared_ptr getExtractor(CharArgument escape_character, CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, CharArgument enclosing_character, + SetArgument value_special_characters_allow_list) const; + }; } From 06a6426baeb9fa4dfa4f34ef3449219d8291124b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 13:07:12 -0300 Subject: [PATCH 011/535] progress --- src/Functions/parseKeyValue.cpp | 32 ++++++++++++++++++++------------ src/Functions/parseKeyValue.h | 2 ++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 6e1e397fd0d..a469e65b8ab 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -20,34 +20,42 @@ String ParseKeyValue::getName() const return name; } -ColumnPtr ParseKeyValue::executeImpl([[maybe_unused]] const ColumnsWithTypeAndName & arguments, [[maybe_unused]] const DataTypePtr & result_type, [[maybe_unused]] size_t input_rows_count) const +ColumnPtr ParseKeyValue::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { auto column = return_type->createColumn(); [[maybe_unused]] auto * map_column = assert_cast(column.get()); auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); + auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); + + auto offsets = ColumnUInt64::create(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + auto row_offset = 0u; + for (auto i = 0u; i < data_column->size(); i++) { auto row = data_column->getDataAt(i); - auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); - auto response = extractor->extract(row.toString()); - for (auto & pair : response) { - std::cout<insert(key); + values->insert(value); + + row_offset++; } + + offsets->insert(row_offset); } + ColumnPtr keys_ptr = std::move(keys); - - ColumnUInt64::MutablePtr offsets = ColumnUInt64::create(); - - [[maybe_unused]] auto keys = ColumnString::create(); - [[maybe_unused]] auto values = ColumnString::create(); - - return nullptr; + return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); } bool ParseKeyValue::isVariadic() const diff --git a/src/Functions/parseKeyValue.h b/src/Functions/parseKeyValue.h index 253f082683f..a186b650b94 100644 --- a/src/Functions/parseKeyValue.h +++ b/src/Functions/parseKeyValue.h @@ -56,6 +56,8 @@ private: CharArgument item_delimiter, CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const; +// ColumnPtr build + }; } From c4a0993ac088565196f60f5a4bdb282d1feeaffe Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 14:01:46 -0300 Subject: [PATCH 012/535] progress --- src/Functions/CMakeLists.txt | 4 +- src/Functions/keyvaluepair/CMakeLists.txt | 4 +- src/Functions/keyvaluepair/src/CMakeLists.txt | 3 + .../{ => src}/KeyValuePairExtractor.h | 0 .../KeyValuePairExtractorBuilder.cpp | 6 +- .../{ => src}/KeyValuePairExtractorBuilder.h | 0 .../impl/KeyValuePairEscapingProcessor.cpp | 0 .../impl/KeyValuePairEscapingProcessor.h | 0 .../LazyEscapingKeyValuePairExtractor.cpp | 0 .../impl/LazyEscapingKeyValuePairExtractor.h | 8 +-- .../{ => src}/impl/state/KeyStateHandler.cpp | 0 .../{ => src}/impl/state/KeyStateHandler.h | 0 .../keyvaluepair/{ => src}/impl/state/State.h | 0 .../{ => src}/impl/state/StateHandler.cpp | 0 .../{ => src}/impl/state/StateHandler.h | 0 .../impl/state/ValueStateHandler.cpp | 0 .../{ => src}/impl/state/ValueStateHandler.h | 0 src/Functions/parseKeyValue.cpp | 65 ++++++++++--------- src/Functions/parseKeyValue.h | 5 +- 19 files changed, 49 insertions(+), 46 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/CMakeLists.txt rename src/Functions/keyvaluepair/{ => src}/KeyValuePairExtractor.h (100%) rename src/Functions/keyvaluepair/{ => src}/KeyValuePairExtractorBuilder.cpp (87%) rename src/Functions/keyvaluepair/{ => src}/KeyValuePairExtractorBuilder.h (100%) rename src/Functions/keyvaluepair/{ => src}/impl/KeyValuePairEscapingProcessor.cpp (100%) rename src/Functions/keyvaluepair/{ => src}/impl/KeyValuePairEscapingProcessor.h (100%) rename src/Functions/keyvaluepair/{ => src}/impl/LazyEscapingKeyValuePairExtractor.cpp (100%) rename src/Functions/keyvaluepair/{ => src}/impl/LazyEscapingKeyValuePairExtractor.h (87%) rename src/Functions/keyvaluepair/{ => src}/impl/state/KeyStateHandler.cpp (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/KeyStateHandler.h (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/State.h (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/StateHandler.cpp (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/StateHandler.h (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/ValueStateHandler.cpp (100%) rename src/Functions/keyvaluepair/{ => src}/impl/state/ValueStateHandler.h (100%) diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 23fb23a8d90..a3efaf0ae85 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -6,7 +6,7 @@ add_headers_and_sources(clickhouse_functions .) list(REMOVE_ITEM clickhouse_functions_sources IFunction.cpp FunctionFactory.cpp FunctionHelpers.cpp extractTimeZoneFromFunctionArguments.cpp FunctionsLogical.cpp) list(REMOVE_ITEM clickhouse_functions_headers IFunction.h FunctionFactory.h FunctionHelpers.h extractTimeZoneFromFunctionArguments.h FunctionsLogical.h) -add_library(clickhouse_functions_obj OBJECT ${clickhouse_functions_sources} parseKeyValue.cpp parseKeyValue.h) +add_library(clickhouse_functions_obj OBJECT ${clickhouse_functions_sources}) list (APPEND OBJECT_LIBS $) @@ -108,7 +108,7 @@ add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) add_subdirectory(keyvaluepair) -list (APPEND PRIVATE_LIBS KeyValuePairExtractorLib) +list (APPEND PRIVATE_LIBS clickhouse_functions_parsekeyvalue) # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) diff --git a/src/Functions/keyvaluepair/CMakeLists.txt b/src/Functions/keyvaluepair/CMakeLists.txt index 8323d7477d0..130b119d8e1 100644 --- a/src/Functions/keyvaluepair/CMakeLists.txt +++ b/src/Functions/keyvaluepair/CMakeLists.txt @@ -1,3 +1 @@ -add_library(KeyValuePairExtractorLib impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) - -target_link_libraries(KeyValuePairExtractorLib PRIVATE dbms) \ No newline at end of file +add_subdirectory(src) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt new file mode 100644 index 00000000000..aaf0e8fc8dd --- /dev/null +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(clickhouse_functions_parsekeyvalue impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) + +target_link_libraries(clickhouse_functions_parsekeyvalue PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h similarity index 100% rename from src/Functions/keyvaluepair/KeyValuePairExtractor.h rename to src/Functions/keyvaluepair/src/KeyValuePairExtractor.h diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp similarity index 87% rename from src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp rename to src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index e56b4e38818..da191dba237 100644 --- a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -1,7 +1,7 @@ #include "KeyValuePairExtractorBuilder.h" -#include -#include -#include +#include +#include +#include namespace DB { diff --git a/src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h similarity index 100% rename from src/Functions/keyvaluepair/KeyValuePairExtractorBuilder.h rename to src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.cpp rename to src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h similarity index 100% rename from src/Functions/keyvaluepair/impl/KeyValuePairEscapingProcessor.h rename to src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.cpp rename to src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp diff --git a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h similarity index 87% rename from src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h rename to src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 6949a557ad0..bb554261366 100644 --- a/src/Functions/keyvaluepair/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -4,10 +4,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include namespace DB { diff --git a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/state/KeyStateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp diff --git a/src/Functions/keyvaluepair/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h similarity index 100% rename from src/Functions/keyvaluepair/impl/state/KeyStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h diff --git a/src/Functions/keyvaluepair/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h similarity index 100% rename from src/Functions/keyvaluepair/impl/state/State.h rename to src/Functions/keyvaluepair/src/impl/state/State.h diff --git a/src/Functions/keyvaluepair/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/state/StateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp diff --git a/src/Functions/keyvaluepair/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h similarity index 100% rename from src/Functions/keyvaluepair/impl/state/StateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/StateHandler.h diff --git a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp similarity index 100% rename from src/Functions/keyvaluepair/impl/state/ValueStateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp diff --git a/src/Functions/keyvaluepair/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h similarity index 100% rename from src/Functions/keyvaluepair/impl/state/ValueStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index a469e65b8ab..827554a845e 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include namespace DB { @@ -22,40 +22,11 @@ String ParseKeyValue::getName() const ColumnPtr ParseKeyValue::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { - auto column = return_type->createColumn(); - [[maybe_unused]] auto * map_column = assert_cast(column.get()); - auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); - auto offsets = ColumnUInt64::create(); - - auto keys = ColumnString::create(); - auto values = ColumnString::create(); - - auto row_offset = 0u; - - for (auto i = 0u; i < data_column->size(); i++) - { - auto row = data_column->getDataAt(i); - - auto response = extractor->extract(row.toString()); - - for (const auto & [key, value] : response) - { - keys->insert(key); - values->insert(value); - - row_offset++; - } - - offsets->insert(row_offset); - } - - ColumnPtr keys_ptr = std::move(keys); - - return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); + return parse(extractor, data_column); } bool ParseKeyValue::isVariadic() const @@ -192,6 +163,38 @@ std::shared_ptr ParseKeyValue::getExtractor( return builder.build(); } +ColumnPtr ParseKeyValue::parse(std::shared_ptr extractor, ColumnPtr data_column) const +{ + auto offsets = ColumnUInt64::create(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + auto row_offset = 0u; + + for (auto i = 0u; i < data_column->size(); i++) + { + auto row = data_column->getDataAt(i); + + // TODO avoid copying + auto response = extractor->extract(row.toString()); + + for (const auto & [key, value] : response) + { + keys->insert(key); + values->insert(value); + + row_offset++; + } + + offsets->insert(row_offset); + } + + ColumnPtr keys_ptr = std::move(keys); + + return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); +} + REGISTER_FUNCTION(ParseKeyValue) { factory.registerFunction(); diff --git a/src/Functions/parseKeyValue.h b/src/Functions/parseKeyValue.h index a186b650b94..c9522b35e14 100644 --- a/src/Functions/parseKeyValue.h +++ b/src/Functions/parseKeyValue.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include namespace DB { @@ -56,8 +56,7 @@ private: CharArgument item_delimiter, CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const; -// ColumnPtr build - + ColumnPtr parse(std::shared_ptr extractor, ColumnPtr data_column) const; }; } From 4fbf7177a65e02be167c8a894b1888dabfc8e4b4 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 23 Nov 2022 16:27:43 -0300 Subject: [PATCH 013/535] add tests & incorporate ch replace function --- src/Functions/keyvaluepair/src/CMakeLists.txt | 1 + .../impl/KeyValuePairEscapingProcessor.cpp | 14 +- .../src/impl/KeyValuePairEscapingProcessor.h | 2 +- .../tests/gtest_key_value_pair_extractor.cpp | 127 ++++++++++++++++++ src/Functions/parseKeyValue.cpp | 10 +- 5 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index aaf0e8fc8dd..e5030d28823 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -1,3 +1,4 @@ add_library(clickhouse_functions_parsekeyvalue impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) +add_headers_and_sources(clickhouse_functions_parsekeyvalue .) target_link_libraries(clickhouse_functions_parsekeyvalue PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp index 6a68d7116b7..a3db1e7482a 100644 --- a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp @@ -20,18 +20,18 @@ KeyValuePairEscapingProcessor::Response KeyValuePairEscapingProcessor::process(c } std::string KeyValuePairEscapingProcessor::escape(std::string_view element_view) const { - bool escape = false; + [[maybe_unused]] bool escape = false; std::string element; element.reserve(element_view.size()); for (char character : element_view) { - if (escape) { - escape = false; - } else if (character == escape_character) { - escape = true; - continue; - } +// if (escape) { +// escape = false; +// } else if (character == escape_character) { +// escape = true; +// continue; +// } element.push_back(character); } diff --git a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h index 7fe3c229aa5..54f71354284 100644 --- a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h @@ -17,7 +17,7 @@ public: [[nodiscard]] Response process(const ResponseViews & input) const; private: - const char escape_character; + [[maybe_unused]] const char escape_character; [[nodiscard]] std::string escape(std::string_view element_view) const; }; diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp new file mode 100644 index 00000000000..75eac439ab1 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -0,0 +1,127 @@ +#include +#include + +namespace DB +{ + +struct LazyKeyValuePairExtractorTestCase { + std::string input; + std::unordered_map expected_output; + std::shared_ptr extractor; +}; + +std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) +{ + return ostr << test_case.input; +} + +struct KeyValuePairExtractorTest : public ::testing::TestWithParam { + +}; + +TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) { + const auto & [input, expected_output, extractor] = GetParam(); + + auto result = extractor->extract(input); + + EXPECT_EQ(result, expected_output); +} + +INSTANTIATE_TEST_SUITE_P( + ValuesCanBeEmptyString, + KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list { + { + "age:", + { + {"age", ""} + }, + KeyValuePairExtractorBuilder().build() + }, + { + "name: neymar, favorite_movie:,favorite_song:", + { + {"name", "neymar"}, + {"favorite_movie", ""}, + {"favorite_song", ""}, + }, + KeyValuePairExtractorBuilder().build() + } + }) +); + +INSTANTIATE_TEST_SUITE_P( + MixString, + KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list { + { + R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", + { + {R"(no:me)", "neymar"}, + {"age", "30"}, + {"height", "1.75"}, + {"school", "lupe picasso"}, + {"team", "psg"} + }, + KeyValuePairExtractorBuilder().withValueSpecialCharacterAllowList({'.'}).build() + }, + { + "XNFHGSSF_RHRUZHVBS_KWBT: F,", + { + {"XNFHGSSF_RHRUZHVBS_KWBT", "F"} + }, + KeyValuePairExtractorBuilder().build() + }, + } + ) +); + +INSTANTIATE_TEST_SUITE_P( + Escaping, + KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list { + { + "na,me,: neymar, age:30", + { + {"age", "30"} + }, + KeyValuePairExtractorBuilder().build() + }, + { + "na$me,: neymar, age:30", + { + {"age", "30"} + }, + KeyValuePairExtractorBuilder().build() + }, + { + R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", + { + {"name", "neymar"}, + {"favorite_quote", R"(Premature optimization is the r$$t of all evil)"}, + {"age", "30"} + }, + KeyValuePairExtractorBuilder().withEnclosingCharacter('"').build() + } + }) +); + +INSTANTIATE_TEST_SUITE_P( + EnclosedElements, + KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list { + { + R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", + { + {"name", "Neymar"}, + {"age", "30"}, + {"team", "psg"}, + {"favorite_movie", ""}, + {"height", "1.75"} + }, + KeyValuePairExtractorBuilder().withValueSpecialCharacterAllowList({'.'}).withEnclosingCharacter('"').build() + } + }) +); + +} diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 827554a845e..60c06840a36 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace DB { @@ -179,14 +180,17 @@ ColumnPtr ParseKeyValue::parse(std::shared_ptr extractor, // TODO avoid copying auto response = extractor->extract(row.toString()); - for (const auto & [key, value] : response) + for (auto & [key, value] : response) { - keys->insert(key); - values->insert(value); + keys->insert(std::move(key)); + values->insert(std::move(value)); row_offset++; } + ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys->getChars(), keys->getOffsets()); + ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values->getChars(), values->getOffsets()); + offsets->insert(row_offset); } From e6b97c4f85b3583faebf603f7a3f75fcebe33f35 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 24 Nov 2022 07:59:46 -0300 Subject: [PATCH 014/535] small change --- src/Functions/parseKeyValue.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 60c06840a36..106c9ce069e 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -188,12 +188,12 @@ ColumnPtr ParseKeyValue::parse(std::shared_ptr extractor, row_offset++; } - ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys->getChars(), keys->getOffsets()); - ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values->getChars(), values->getOffsets()); - offsets->insert(row_offset); } + ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys->getChars(), keys->getOffsets()); + ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values->getChars(), values->getOffsets()); + ColumnPtr keys_ptr = std::move(keys); return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); From 08c33f476693c153c727caad49f1fadb3923c5ca Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 5 Dec 2022 14:00:30 -0300 Subject: [PATCH 015/535] rename methods --- .../src/impl/LazyEscapingKeyValuePairExtractor.cpp | 14 +++++++------- .../src/impl/state/KeyStateHandler.cpp | 6 +++--- .../keyvaluepair/src/impl/state/KeyStateHandler.h | 6 +++--- .../src/impl/state/ValueStateHandler.cpp | 8 ++++---- .../src/impl/state/ValueStateHandler.h | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp index df242b72b6a..55a376a80d5 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp @@ -56,7 +56,7 @@ NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, s NextState LazyEscapingKeyValuePairExtractor::waitKey(const std::string & file, size_t pos) const { - return key_state_handler.waitKey(file, pos); + return key_state_handler.wait(file, pos); } NextState LazyEscapingKeyValuePairExtractor::readKeyValueDelimiter(const std::string &file, size_t pos) const { @@ -64,7 +64,7 @@ NextState LazyEscapingKeyValuePairExtractor::readKeyValueDelimiter(const std::st } NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, size_t pos) { - auto [next_state, next_key] = key_state_handler.readKey(file, pos); + auto [next_state, next_key] = key_state_handler.read(file, pos); key = next_key; @@ -72,7 +72,7 @@ NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, s } NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string &file, size_t pos) { - auto [next_state, next_key] = key_state_handler.readEnclosedKey(file, pos); + auto [next_state, next_key] = key_state_handler.readEnclosed(file, pos); key = next_key; @@ -80,11 +80,11 @@ NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string & } NextState LazyEscapingKeyValuePairExtractor::waitValue(const std::string &file, size_t pos) const { - return value_state_handler.waitValue(file, pos); + return value_state_handler.wait(file, pos); } NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.readValue(file, pos); + auto [next_state, next_value] = value_state_handler.read(file, pos); value = next_value; @@ -92,7 +92,7 @@ NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, } NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.readEnclosedValue(file, pos); + auto [next_state, next_value] = value_state_handler.readEnclosed(file, pos); value = next_value; @@ -100,7 +100,7 @@ NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string } NextState LazyEscapingKeyValuePairExtractor::readEmptyValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.readEmptyValue(file, pos); + auto [next_state, next_value] = value_state_handler.readEmpty(file, pos); value = next_value; diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 9f16fb10e78..5fb4363c942 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -8,7 +8,7 @@ KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_characte : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) {} -NextState KeyStateHandler::waitKey(const std::string &file, size_t pos) const { +NextState KeyStateHandler::wait(const std::string &file, size_t pos) const { while (pos < file.size()) { const auto current_character = file[pos]; if (isalpha(current_character)) { @@ -32,7 +32,7 @@ NextState KeyStateHandler::waitKey(const std::string &file, size_t pos) const { }; } -NextStateWithElement KeyStateHandler::readKey(const std::string &file, size_t pos) const { +NextStateWithElement KeyStateHandler::read(const std::string &file, size_t pos) const { bool escape = false; auto start_index = pos; @@ -73,7 +73,7 @@ NextStateWithElement KeyStateHandler::readKey(const std::string &file, size_t po }; } -NextStateWithElement KeyStateHandler::readEnclosedKey(const std::string &file, size_t pos) const { +NextStateWithElement KeyStateHandler::readEnclosed(const std::string &file, size_t pos) const { auto start_index = pos; while (pos < file.size()) { diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index badefcfd236..880f0b21c42 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -13,9 +13,9 @@ class KeyStateHandler : StateHandler { public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); - [[nodiscard]] NextState waitKey(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readKey(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEnclosedKey(const std::string &file, size_t pos) const; + [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement read(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEnclosed(const std::string &file, size_t pos) const; [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; private: diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index 7f384bddea4..77a231a79e4 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -10,7 +10,7 @@ ValueStateHandler::ValueStateHandler(char escape_character_, char item_delimiter special_character_allowlist(std::move(special_character_allowlist_)) {} -NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) const { +NextState ValueStateHandler::wait(const std::string &file, size_t pos) const { while (pos < file.size()) { const auto current_character = file[pos]; @@ -40,7 +40,7 @@ NextState ValueStateHandler::waitValue(const std::string &file, size_t pos) cons }; } -NextStateWithElement ValueStateHandler::readValue(const std::string &file, size_t pos) const { +NextStateWithElement ValueStateHandler::read(const std::string &file, size_t pos) const { bool escape = false; auto start_index = pos; @@ -73,7 +73,7 @@ NextStateWithElement ValueStateHandler::readValue(const std::string &file, size_ }; } -NextStateWithElement ValueStateHandler::readEnclosedValue(const std::string &file, size_t pos) const { +NextStateWithElement ValueStateHandler::readEnclosed(const std::string &file, size_t pos) const { auto start_index = pos; while (pos < file.size()) { @@ -100,7 +100,7 @@ NextStateWithElement ValueStateHandler::readEnclosedValue(const std::string &fil }; } -NextStateWithElement ValueStateHandler::readEmptyValue(const std::string &, size_t pos) const { +NextStateWithElement ValueStateHandler::readEmpty(const std::string &, size_t pos) const { return { { pos + 1, diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index 96a4ec11d60..b9d00187729 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -15,10 +15,10 @@ public: ValueStateHandler(char escape_character, char item_delimiter, std::optional enclosing_character, std::unordered_set special_character_allowlist_); - [[nodiscard]] NextState waitValue(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readValue(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEnclosedValue(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEmptyValue(const std::string & file, size_t pos) const; + [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement read(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEnclosed(const std::string & file, size_t pos) const; + [[nodiscard]] NextStateWithElement readEmpty(const std::string & file, size_t pos) const; private: const char item_delimiter; From ce23a7ad9a672a3e68e58442c3b07ef52a5231d0 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 5 Dec 2022 14:29:49 -0300 Subject: [PATCH 016/535] reduce state management in lazyescapingkvpextractor by keeping part of it in state handlers --- .../impl/KeyValuePairEscapingProcessor.cpp | 12 +-- .../LazyEscapingKeyValuePairExtractor.cpp | 73 +++---------------- .../impl/LazyEscapingKeyValuePairExtractor.h | 13 ---- .../src/impl/state/KeyStateHandler.cpp | 55 ++++++-------- .../src/impl/state/KeyStateHandler.h | 7 +- .../src/impl/state/StateHandler.h | 8 +- .../src/impl/state/ValueStateHandler.cpp | 51 ++++++------- .../src/impl/state/ValueStateHandler.h | 9 ++- 8 files changed, 80 insertions(+), 148 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp index a3db1e7482a..b1294d6d10f 100644 --- a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp @@ -26,12 +26,12 @@ std::string KeyValuePairEscapingProcessor::escape(std::string_view element_view) element.reserve(element_view.size()); for (char character : element_view) { -// if (escape) { -// escape = false; -// } else if (character == escape_character) { -// escape = true; -// continue; -// } + if (escape) { + escape = false; + } else if (character == escape_character) { + escape = true; + continue; + } element.push_back(character); } diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp index 55a376a80d5..7a8b0336a60 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp @@ -29,21 +29,21 @@ LazyEscapingKeyValuePairExtractor::Response LazyEscapingKeyValuePairExtractor::e NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, std::size_t pos, State state) { switch (state) { case State::WAITING_KEY: - return waitKey(file, pos); + return key_state_handler.wait(file, pos); case State::READING_KEY: - return readKey(file, pos); + return key_state_handler.read(file, pos); case State::READING_ENCLOSED_KEY: - return readEnclosedKey(file, pos); + return key_state_handler.readEnclosed(file, pos); case State::READING_KV_DELIMITER: - return readKeyValueDelimiter(file, pos); + return key_state_handler.readKeyValueDelimiter(file, pos); case State::WAITING_VALUE: - return waitValue(file, pos); + return value_state_handler.wait(file, pos); case State::READING_VALUE: - return readValue(file, pos); + return value_state_handler.read(file, pos); case State::READING_ENCLOSED_VALUE: - return readEnclosedValue(file, pos); + return value_state_handler.readEnclosed(file, pos); case State::READING_EMPTY_VALUE: - return readEmptyValue(file, pos); + return value_state_handler.readEmpty(file, pos); case State::FLUSH_PAIR: return flushPair(file, pos); case END: @@ -54,61 +54,8 @@ NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, s } } - -NextState LazyEscapingKeyValuePairExtractor::waitKey(const std::string & file, size_t pos) const { - return key_state_handler.wait(file, pos); -} - -NextState LazyEscapingKeyValuePairExtractor::readKeyValueDelimiter(const std::string &file, size_t pos) const { - return key_state_handler.readKeyValueDelimiter(file, pos); -} - -NextState LazyEscapingKeyValuePairExtractor::readKey(const std::string & file, size_t pos) { - auto [next_state, next_key] = key_state_handler.read(file, pos); - - key = next_key; - - return next_state; -} - -NextState LazyEscapingKeyValuePairExtractor::readEnclosedKey(const std::string &file, size_t pos) { - auto [next_state, next_key] = key_state_handler.readEnclosed(file, pos); - - key = next_key; - - return next_state; -} - -NextState LazyEscapingKeyValuePairExtractor::waitValue(const std::string &file, size_t pos) const { - return value_state_handler.wait(file, pos); -} - -NextState LazyEscapingKeyValuePairExtractor::readValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.read(file, pos); - - value = next_value; - - return next_state; -} - -NextState LazyEscapingKeyValuePairExtractor::readEnclosedValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.readEnclosed(file, pos); - - value = next_value; - - return next_state; -} - -NextState LazyEscapingKeyValuePairExtractor::readEmptyValue(const std::string &file, size_t pos) { - auto [next_state, next_value] = value_state_handler.readEmpty(file, pos); - - value = next_value; - - return next_state; -} - -NextState LazyEscapingKeyValuePairExtractor::flushPair(const std::string &file, std::size_t pos) { - response_views[key] = value; +NextState LazyEscapingKeyValuePairExtractor::flushPair(const std::string & file, std::size_t pos) { + response_views[key_state_handler.get()] = value_state_handler.get(); return { pos, diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index bb554261366..f4eb2b03b0e 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -29,26 +29,13 @@ public: private: NextState extract(const std::string & file, std::size_t pos, State state); - NextState waitKey(const std::string & file, size_t pos) const; - NextState readKey(const std::string & file, size_t pos); - NextState readEnclosedKey(const std::string &file, size_t pos); - NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; - - NextState waitValue(const std::string & file, size_t pos) const; - NextState readValue(const std::string & file, size_t pos); - NextState readEnclosedValue(const std::string & file, size_t pos); - NextState readEmptyValue(const std::string & file, size_t pos); - NextState flushPair(const std::string & file, std::size_t pos); KeyStateHandler key_state_handler; ValueStateHandler value_state_handler; KeyValuePairEscapingProcessor escaping_processor; - std::string_view key; - std::string_view value; std::unordered_map response_views; - }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 5fb4363c942..4131ded9fbc 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -32,11 +32,13 @@ NextState KeyStateHandler::wait(const std::string &file, size_t pos) const { }; } -NextStateWithElement KeyStateHandler::read(const std::string &file, size_t pos) const { +NextState KeyStateHandler::read(const std::string &file, size_t pos) { bool escape = false; auto start_index = pos; + key = {}; + while (pos < file.size()) { const auto current_character = file[pos++]; if (escape) { @@ -46,35 +48,28 @@ NextStateWithElement KeyStateHandler::read(const std::string &file, size_t pos) } else if (current_character == key_value_delimiter) { // not checking for empty key because with current waitKey implementation // there is no way this piece of code will be reached for the very first key character + key = createElement(file, start_index, pos - 1); return { - { - pos, - State::WAITING_VALUE - }, - createElement(file, start_index, pos - 1) + pos, + State::WAITING_VALUE }; } else if (!std::isalnum(current_character) && current_character != '_') { return { - { - pos, - State::WAITING_KEY - }, - {} + pos, + State::WAITING_KEY }; } } return { - { - pos, - State::END - }, - {} + pos, + State::END }; } -NextStateWithElement KeyStateHandler::readEnclosed(const std::string &file, size_t pos) const { +NextState KeyStateHandler::readEnclosed(const std::string &file, size_t pos) { auto start_index = pos; + key = {}; while (pos < file.size()) { const auto current_character = file[pos++]; @@ -84,30 +79,22 @@ NextStateWithElement KeyStateHandler::readEnclosed(const std::string &file, size if (is_key_empty) { return { - { - pos, - State::WAITING_KEY - }, - {} + pos, + State::WAITING_KEY }; } + key = createElement(file, start_index, pos - 1); return { - { - pos, - State::READING_KV_DELIMITER - }, - createElement(file, start_index, pos - 1) + pos, + State::READING_KV_DELIMITER }; } } return { - { - pos, - State::END - }, - {} + pos, + State::END }; } @@ -126,4 +113,8 @@ NextState KeyStateHandler::readKeyValueDelimiter(const std::string &file, size_t } } +std::string_view KeyStateHandler::get() const { + return key; +} + } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index 880f0b21c42..dcc44d7cb9a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -14,12 +14,15 @@ public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement read(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEnclosed(const std::string &file, size_t pos) const; + [[nodiscard]] NextState read(const std::string & file, size_t pos); + [[nodiscard]] NextState readEnclosed(const std::string &file, size_t pos); [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; + [[nodiscard]] std::string_view get() const override; + private: const char key_value_delimiter; + std::string_view key; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 0d91a8f08ea..31aa3c45714 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -8,10 +8,16 @@ namespace DB struct StateHandler { StateHandler(char escape_character, std::optional enclosing_character); + StateHandler(const StateHandler &) = default; - const char escape_character; + virtual ~StateHandler() = default; + + const char escape_character = '\\'; const std::optional enclosing_character; + [[nodiscard]] virtual std::string_view get() const = 0; + +protected: [[nodiscard]] std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end) const; }; diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index 77a231a79e4..ee8ff26576e 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -40,11 +40,13 @@ NextState ValueStateHandler::wait(const std::string &file, size_t pos) const { }; } -NextStateWithElement ValueStateHandler::read(const std::string &file, size_t pos) const { +NextState ValueStateHandler::read(const std::string &file, size_t pos) { bool escape = false; auto start_index = pos; + value = {}; + while (pos < file.size()) { const auto current_character = file[pos++]; if (escape) { @@ -52,28 +54,24 @@ NextStateWithElement ValueStateHandler::read(const std::string &file, size_t pos } else if (escape_character == current_character) { escape = true; } else if (current_character == item_delimiter || !isValidCharacter(current_character)) { + value = createElement(file, start_index, pos - 1); return { - { - pos, - State::FLUSH_PAIR - }, - createElement(file, start_index, pos - 1) + pos, + State::FLUSH_PAIR }; } } // TODO: do I really need the below logic? // this allows empty values at the end + value = createElement(file, start_index, pos); return { - { - pos, - State::FLUSH_PAIR - }, - createElement(file, start_index, pos) + pos, + State::FLUSH_PAIR }; } -NextStateWithElement ValueStateHandler::readEnclosed(const std::string &file, size_t pos) const { +NextState ValueStateHandler::readEnclosed(const std::string &file, size_t pos) { auto start_index = pos; while (pos < file.size()) { @@ -81,32 +79,25 @@ NextStateWithElement ValueStateHandler::readEnclosed(const std::string &file, si if (enclosing_character == current_character) { // not checking for empty value because with current waitValue implementation // there is no way this piece of code will be reached for the very first value character + value = createElement(file, start_index, pos - 1); return { - { - pos, - State::FLUSH_PAIR - }, - createElement(file, start_index, pos - 1) + pos, + State::FLUSH_PAIR }; } } return { - { - pos, - State::END - }, - {} + pos, + State::END }; } -NextStateWithElement ValueStateHandler::readEmpty(const std::string &, size_t pos) const { +NextState ValueStateHandler::readEmpty(const std::string &, size_t pos) { + value = {}; return { - { - pos + 1, - State::FLUSH_PAIR - }, - {} + pos + 1, + State::FLUSH_PAIR }; } @@ -114,4 +105,8 @@ bool ValueStateHandler::isValidCharacter(char character) const { return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } +std::string_view ValueStateHandler::get() const { + return value; +} + } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index b9d00187729..c038aa03bd0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -16,13 +16,16 @@ public: std::optional enclosing_character, std::unordered_set special_character_allowlist_); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement read(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEnclosed(const std::string & file, size_t pos) const; - [[nodiscard]] NextStateWithElement readEmpty(const std::string & file, size_t pos) const; + [[nodiscard]] NextState read(const std::string & file, size_t pos); + [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); + [[nodiscard]] NextState readEmpty(const std::string & file, size_t pos); + + [[nodiscard]] std::string_view get() const override; private: const char item_delimiter; std::unordered_set special_character_allowlist; + std::string_view value; bool isValidCharacter(char character) const; }; From ed032f6440ec438d7ab207a004a94e5434de32e0 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 5 Dec 2022 20:21:54 -0300 Subject: [PATCH 017/535] Make KeyValuePairExtractor response generic and introduce no-op escaping processor --- src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../src/KeyValuePairEscapingProcessor.h | 18 +++++ .../keyvaluepair/src/KeyValuePairExtractor.h | 3 +- .../src/KeyValuePairExtractorBuilder.cpp | 42 ------------ .../src/KeyValuePairExtractorBuilder.h | 60 ++++++++++++++-- .../LazyEscapingKeyValuePairExtractor.cpp | 66 ------------------ .../impl/LazyEscapingKeyValuePairExtractor.h | 68 ++++++++++++++++--- ...> SimpleKeyValuePairEscapingProcessor.cpp} | 10 +-- ... => SimpleKeyValuePairEscapingProcessor.h} | 12 ++-- .../tests/gtest_key_value_pair_extractor.cpp | 18 ++--- src/Functions/parseKeyValue.cpp | 23 +++++-- src/Functions/parseKeyValue.h | 13 ++-- 12 files changed, 182 insertions(+), 153 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h delete mode 100644 src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp rename src/Functions/keyvaluepair/src/impl/{KeyValuePairEscapingProcessor.cpp => SimpleKeyValuePairEscapingProcessor.cpp} (55%) rename src/Functions/keyvaluepair/src/impl/{KeyValuePairEscapingProcessor.h => SimpleKeyValuePairEscapingProcessor.h} (52%) diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index e5030d28823..6428805361d 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(clickhouse_functions_parsekeyvalue impl/LazyEscapingKeyValuePairExtractor.cpp KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/KeyValuePairEscapingProcessor.h impl/KeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) +add_library(clickhouse_functions_parsekeyvalue KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/SimpleKeyValuePairEscapingProcessor.h impl/SimpleKeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.h KeyValuePairEscapingProcessor.h) add_headers_and_sources(clickhouse_functions_parsekeyvalue .) target_link_libraries(clickhouse_functions_parsekeyvalue PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h new file mode 100644 index 00000000000..439d666b8f6 --- /dev/null +++ b/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h @@ -0,0 +1,18 @@ +#pragma once + +namespace DB +{ + +template +struct KeyValuePairEscapingProcessor +{ + using Response = R; + using ResponseViews = std::unordered_map; + + KeyValuePairEscapingProcessor() = default; + virtual ~KeyValuePairEscapingProcessor() = default; + + virtual Response process(const ResponseViews&) const = 0; +}; + +} diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index f0cfdd31346..343b67cccd9 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -19,8 +19,9 @@ namespace DB * Both key and values accepts underscores as well. Special characters must be escaped. * Control characters (key_value_pair_separator, item_delimiter, escape_character and enclosing_character) are customizable * */ +template > struct KeyValuePairExtractor { - using Response = std::unordered_map; + using Response = R; virtual ~KeyValuePairExtractor() = default; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp deleted file mode 100644 index da191dba237..00000000000 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "KeyValuePairExtractorBuilder.h" -#include -#include -#include - -namespace DB -{ - -KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) { - key_value_pair_delimiter = key_value_pair_delimiter_; - return *this; -} - -KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withEscapeCharacter(char escape_character_) { - escape_character = escape_character_; - return *this; -} - -KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withItemDelimiter(char item_delimiter_) { - item_delimiter = item_delimiter_; - return *this; -} - -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharacter(std::optional enclosing_character_) { - enclosing_character = enclosing_character_; - return *this; -} - -KeyValuePairExtractorBuilder &KeyValuePairExtractorBuilder::withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) { - value_special_character_allowlist = std::move(value_special_character_allowlist_); - return *this; -} - -std::shared_ptr KeyValuePairExtractorBuilder::build() { - KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); - ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); - KeyValuePairEscapingProcessor escaping_processor(escape_character); - - return std::make_shared(key_state_handler, value_state_handler, escaping_processor); -} - -} diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index cadfed745fb..1408fcf3a98 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -4,19 +4,66 @@ #include #include #include "KeyValuePairExtractor.h" +#include +#include +#include +#include namespace DB { +template > class KeyValuePairExtractorBuilder { public: - KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter); - KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character); - KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter); - KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character); - KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist); + KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_) + { + key_value_pair_delimiter = key_value_pair_delimiter_; + return *this; + } - std::shared_ptr build(); + KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_) + { + escape_character = escape_character_; + return *this; + } + + KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_) + { + item_delimiter = item_delimiter_; + return *this; + } + + KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_) + { + enclosing_character = enclosing_character_; + return *this; + } + + KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) + { + value_special_character_allowlist = std::move(value_special_character_allowlist_); + return *this; + } + + template + KeyValuePairExtractorBuilder & withEscapingProcessor() + { + escaping_processor = std::make_shared(escape_character); + return *this; + } + + std::shared_ptr> build() + { + KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); + ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); + + if (!escaping_processor) + { + throw std::runtime_error {"Escaping processor must be set, cannot build KeyValuePairExtractor without one"}; + } + + return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); + } private: char key_value_pair_delimiter = ':'; @@ -24,6 +71,7 @@ private: char item_delimiter = ','; std::optional enclosing_character; std::unordered_set value_special_character_allowlist; + std::shared_ptr> escaping_processor; }; } diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp deleted file mode 100644 index 7a8b0336a60..00000000000 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include "LazyEscapingKeyValuePairExtractor.h" - -namespace DB -{ - -LazyEscapingKeyValuePairExtractor::LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, - ValueStateHandler value_state_handler_, - KeyValuePairEscapingProcessor escaping_processor_) - : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_) -{} - -LazyEscapingKeyValuePairExtractor::Response LazyEscapingKeyValuePairExtractor::extract(const std::string & file) { - - auto state = State::WAITING_KEY; - - std::size_t pos = 0; - - while (state != State::END) { - auto nextState = extract(file, pos, state); - - pos = nextState.pos; - state = nextState.state; - } - - return escaping_processor.process(response_views); -} - -NextState LazyEscapingKeyValuePairExtractor::extract(const std::string & file, std::size_t pos, State state) { - switch (state) { - case State::WAITING_KEY: - return key_state_handler.wait(file, pos); - case State::READING_KEY: - return key_state_handler.read(file, pos); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos); - case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); - case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); - case State::READING_VALUE: - return value_state_handler.read(file, pos); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos); - case State::FLUSH_PAIR: - return flushPair(file, pos); - case END: - return { - pos, - state - }; - } -} - -NextState LazyEscapingKeyValuePairExtractor::flushPair(const std::string & file, std::size_t pos) { - response_views[key_state_handler.get()] = value_state_handler.get(); - - return { - pos, - pos == file.size() ? State::END : State::WAITING_KEY - }; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index f4eb2b03b0e..420e169be19 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -4,10 +4,10 @@ #include #include #include +#include +#include #include #include -#include -#include namespace DB { @@ -20,20 +20,72 @@ namespace DB * In the end, the unescaped key value pair views are converted into escaped key value pairs. At this stage, memory is allocated * to store characters, but noise is no longer an issue. * */ -class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { +template +class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { public: - LazyEscapingKeyValuePairExtractor(KeyStateHandler keyStateHandler, ValueStateHandler valueStateHandler, KeyValuePairEscapingProcessor keyValuePairEscapingProcessor); + LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_, + std::shared_ptr> escaping_processor_) + : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_){} - [[nodiscard]] Response extract(const std::string & file) override; + [[nodiscard]] Response extract(const std::string & file) override + { + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + while (state != State::END) { + auto nextState = processState(file, pos, state); + + pos = nextState.pos; + state = nextState.state; + } + + return escaping_processor->process(response_views); + } private: - NextState extract(const std::string & file, std::size_t pos, State state); + NextState processState(const std::string & file, std::size_t pos, State state) + { + switch (state) { + case State::WAITING_KEY: + return key_state_handler.wait(file, pos); + case State::READING_KEY: + return key_state_handler.read(file, pos); + case State::READING_ENCLOSED_KEY: + return key_state_handler.readEnclosed(file, pos); + case State::READING_KV_DELIMITER: + return key_state_handler.readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return value_state_handler.wait(file, pos); + case State::READING_VALUE: + return value_state_handler.read(file, pos); + case State::READING_ENCLOSED_VALUE: + return value_state_handler.readEnclosed(file, pos); + case State::READING_EMPTY_VALUE: + return value_state_handler.readEmpty(file, pos); + case State::FLUSH_PAIR: + return flushPair(file, pos); + case END: + return { + pos, + state + }; + } + } - NextState flushPair(const std::string & file, std::size_t pos); + NextState flushPair(const std::string & file, std::size_t pos) + { + response_views[key_state_handler.get()] = value_state_handler.get(); + + return { + pos, + pos == file.size() ? State::END : State::WAITING_KEY + }; + } KeyStateHandler key_state_handler; ValueStateHandler value_state_handler; - KeyValuePairEscapingProcessor escaping_processor; + std::shared_ptr> escaping_processor; std::unordered_map response_views; }; diff --git a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp similarity index 55% rename from src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp rename to src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp index b1294d6d10f..e12318c7f94 100644 --- a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp @@ -1,13 +1,13 @@ -#include "KeyValuePairEscapingProcessor.h" +#include "SimpleKeyValuePairEscapingProcessor.h" namespace DB { -KeyValuePairEscapingProcessor::KeyValuePairEscapingProcessor(char escape_character_) -: escape_character(escape_character_) +SimpleKeyValuePairEscapingProcessor::SimpleKeyValuePairEscapingProcessor(char escape_character_) +: KeyValuePairEscapingProcessor>(), escape_character(escape_character_) {} -KeyValuePairEscapingProcessor::Response KeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const { +SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const { Response response; response.reserve(response_views.size()); @@ -19,7 +19,7 @@ KeyValuePairEscapingProcessor::Response KeyValuePairEscapingProcessor::process(c return response; } -std::string KeyValuePairEscapingProcessor::escape(std::string_view element_view) const { +std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element_view) const { [[maybe_unused]] bool escape = false; std::string element; diff --git a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h similarity index 52% rename from src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h rename to src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h index 54f71354284..81e3527c1e4 100644 --- a/src/Functions/keyvaluepair/src/impl/KeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h @@ -3,18 +3,16 @@ #include #include +#include "../KeyValuePairEscapingProcessor.h" + namespace DB { -class KeyValuePairEscapingProcessor { +class SimpleKeyValuePairEscapingProcessor : public KeyValuePairEscapingProcessor> { public: + explicit SimpleKeyValuePairEscapingProcessor(char escape_character); - using Response = std::unordered_map; - using ResponseViews = std::unordered_map; - - explicit KeyValuePairEscapingProcessor(char escape_character); - - [[nodiscard]] Response process(const ResponseViews & input) const; + [[nodiscard]] Response process(const ResponseViews & input) const override; private: [[maybe_unused]] const char escape_character; diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index 75eac439ab1..52f93e59097 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -7,7 +7,7 @@ namespace DB struct LazyKeyValuePairExtractorTestCase { std::string input; std::unordered_map expected_output; - std::shared_ptr extractor; + std::shared_ptr> extractor; }; std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) @@ -36,7 +36,7 @@ INSTANTIATE_TEST_SUITE_P( { {"age", ""} }, - KeyValuePairExtractorBuilder().build() + KeyValuePairExtractorBuilder().withEscapingProcessor().build() }, { "name: neymar, favorite_movie:,favorite_song:", @@ -45,7 +45,7 @@ INSTANTIATE_TEST_SUITE_P( {"favorite_movie", ""}, {"favorite_song", ""}, }, - KeyValuePairExtractorBuilder().build() + KeyValuePairExtractorBuilder().withEscapingProcessor().build() } }) ); @@ -63,14 +63,14 @@ INSTANTIATE_TEST_SUITE_P( {"school", "lupe picasso"}, {"team", "psg"} }, - KeyValuePairExtractorBuilder().withValueSpecialCharacterAllowList({'.'}).build() + KeyValuePairExtractorBuilder().withEscapingProcessor().withValueSpecialCharacterAllowList({'.'}).build() }, { "XNFHGSSF_RHRUZHVBS_KWBT: F,", { {"XNFHGSSF_RHRUZHVBS_KWBT", "F"} }, - KeyValuePairExtractorBuilder().build() + KeyValuePairExtractorBuilder().withEscapingProcessor().build() }, } ) @@ -85,14 +85,14 @@ INSTANTIATE_TEST_SUITE_P( { {"age", "30"} }, - KeyValuePairExtractorBuilder().build() + KeyValuePairExtractorBuilder().withEscapingProcessor().build() }, { "na$me,: neymar, age:30", { {"age", "30"} }, - KeyValuePairExtractorBuilder().build() + KeyValuePairExtractorBuilder().withEscapingProcessor().build() }, { R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", @@ -101,7 +101,7 @@ INSTANTIATE_TEST_SUITE_P( {"favorite_quote", R"(Premature optimization is the r$$t of all evil)"}, {"age", "30"} }, - KeyValuePairExtractorBuilder().withEnclosingCharacter('"').build() + KeyValuePairExtractorBuilder().withEscapingProcessor().withEnclosingCharacter('"').build() } }) ); @@ -119,7 +119,7 @@ INSTANTIATE_TEST_SUITE_P( {"favorite_movie", ""}, {"height", "1.75"} }, - KeyValuePairExtractorBuilder().withValueSpecialCharacterAllowList({'.'}).withEnclosingCharacter('"').build() + KeyValuePairExtractorBuilder().withEscapingProcessor().withValueSpecialCharacterAllowList({'.'}).withEnclosingCharacter('"').build() } }) ); diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 106c9ce069e..6567dc3b287 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -11,6 +11,21 @@ namespace DB { +/* + * In order to leverage DB::ReplaceStringImpl for a better performance, the default escaping processor needs + * to be overriden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the + * Volnitsky searcher. + * */ +struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor +{ + NoOpEscapingProcessor(char) {} + + Response process(const ResponseViews & response_views) const override + { + return response_views; + } +}; + ParseKeyValue::ParseKeyValue() : return_type(std::make_shared(std::make_shared(), std::make_shared())) { @@ -137,11 +152,11 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy }; } -std::shared_ptr ParseKeyValue::getExtractor( +std::shared_ptr> ParseKeyValue::getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const { - auto builder = KeyValuePairExtractorBuilder(); + auto builder = KeyValuePairExtractorBuilder(); if (escape_character) { builder.withEscapeCharacter(escape_character.value()); @@ -159,12 +174,12 @@ std::shared_ptr ParseKeyValue::getExtractor( builder.withEnclosingCharacter(enclosing_character.value()); } - builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); + builder.withEscapingProcessor().withValueSpecialCharacterAllowList(value_special_characters_allow_list); return builder.build(); } -ColumnPtr ParseKeyValue::parse(std::shared_ptr extractor, ColumnPtr data_column) const +ColumnPtr ParseKeyValue::parse(std::shared_ptr> extractor, ColumnPtr data_column) const { auto offsets = ColumnUInt64::create(); diff --git a/src/Functions/parseKeyValue.h b/src/Functions/parseKeyValue.h index c9522b35e14..2d7cb41a69d 100644 --- a/src/Functions/parseKeyValue.h +++ b/src/Functions/parseKeyValue.h @@ -25,6 +25,9 @@ class ParseKeyValue : public IFunction }; public: + + using EscapingProcessorOutput = std::unordered_map; + ParseKeyValue(); static constexpr auto name = "parseKeyValue"; @@ -52,11 +55,13 @@ private: ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments) const; - std::shared_ptr getExtractor(CharArgument escape_character, CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, CharArgument enclosing_character, - SetArgument value_special_characters_allow_list) const; + std::shared_ptr> getExtractor(CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument value_special_characters_allow_list) const; - ColumnPtr parse(std::shared_ptr extractor, ColumnPtr data_column) const; + ColumnPtr parse(std::shared_ptr> extractor, ColumnPtr data_column) const; }; } From 85d1d9ab61f7b566b3b78ecf20aaec81d1199c39 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 12 Dec 2022 16:17:41 -0300 Subject: [PATCH 018/535] first test, big file --- src/Functions/parseKeyValue.cpp | 33 +++++++++++-------- .../02499_parse_key_value.reference | 2 ++ .../0_stateless/02499_parse_key_value.sh | 14 ++++++++ .../data_parse_key_value/big_input.json | 1 + 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 tests/queries/0_stateless/02499_parse_key_value.reference create mode 100755 tests/queries/0_stateless/02499_parse_key_value.sh create mode 100644 tests/queries/0_stateless/data_parse_key_value/big_input.json diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/parseKeyValue.cpp index 6567dc3b287..1a426dcb34e 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/parseKeyValue.cpp @@ -18,7 +18,7 @@ namespace DB * */ struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor { - NoOpEscapingProcessor(char) {} + explicit NoOpEscapingProcessor(char) {} Response process(const ResponseViews & response_views) const override { @@ -138,7 +138,8 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy key_value_pair_delimiter, item_delimiter, enclosing_character, - {} + { + } }; } @@ -148,7 +149,8 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy key_value_pair_delimiter, item_delimiter, enclosing_character, - {} + { + } }; } @@ -174,7 +176,9 @@ std::shared_ptr> P builder.withEnclosingCharacter(enclosing_character.value()); } - builder.withEscapingProcessor().withValueSpecialCharacterAllowList(value_special_characters_allow_list); + builder.withEscapingProcessor(); + + builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); return builder.build(); } @@ -190,15 +194,15 @@ ColumnPtr ParseKeyValue::parse(std::shared_ptrsize(); i++) { - auto row = data_column->getDataAt(i); + auto row = data_column->getDataAt(i).toString(); // TODO avoid copying - auto response = extractor->extract(row.toString()); + auto response = extractor->extract(row); - for (auto & [key, value] : response) + for (auto [key, value] : response) { - keys->insert(std::move(key)); - values->insert(std::move(value)); + keys->insert(key); + values->insert(value); row_offset++; } @@ -206,12 +210,15 @@ ColumnPtr ParseKeyValue::parse(std::shared_ptrinsert(row_offset); } - ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys->getChars(), keys->getOffsets()); - ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values->getChars(), values->getOffsets()); + auto keys2 = ColumnString::create(); + auto values2 = ColumnString::create(); - ColumnPtr keys_ptr = std::move(keys); + ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys2->getChars(), keys2->getOffsets()); + ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values2->getChars(), values2->getOffsets()); - return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); + ColumnPtr keys_ptr = std::move(keys2); + + return ColumnMap::create(keys_ptr, std::move(values2), std::move(offsets)); } REGISTER_FUNCTION(ParseKeyValue) diff --git a/tests/queries/0_stateless/02499_parse_key_value.reference b/tests/queries/0_stateless/02499_parse_key_value.reference new file mode 100644 index 00000000000..af66f25c631 --- /dev/null +++ b/tests/queries/0_stateless/02499_parse_key_value.reference @@ -0,0 +1,2 @@ +8c089cb51ab01cb2ae5d4b6aa8921b6d - +1 diff --git a/tests/queries/0_stateless/02499_parse_key_value.sh b/tests/queries/0_stateless/02499_parse_key_value.sh new file mode 100755 index 00000000000..cfc22e81510 --- /dev/null +++ b/tests/queries/0_stateless/02499_parse_key_value.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Tags: no-ubsan, no-fasttest + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE=$CUR_DIR/data_parse_key_value/big_input.json.gz +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" +zcat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT parseKeyValue(file('big_input_file.txt'), '\\\', ':', ',', '\"')" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum +${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" +${CLICKHOUSE_CLIENT} --query="drop table json_map" diff --git a/tests/queries/0_stateless/data_parse_key_value/big_input.json b/tests/queries/0_stateless/data_parse_key_value/big_input.json new file mode 100644 index 00000000000..5501683a037 --- /dev/null +++ b/tests/queries/0_stateless/data_parse_key_value/big_input.json @@ -0,0 +1 @@ +{"gmLRLY8T0KNwTOcQEsUAO8Jkj": "nhaWHSsx658uszTj3jTgdVV2OnJNW", "t8v1qPRTLZLzVmZaUSXv2UGw5gMHP5Uo4VUrqQ1": "sPhcQkfz8FCZK64CVoy2o4z", "hQPCwBc3gmjQSgyYfcqcDfDEcm3CZIGDGY4NidVzv": "n3SW", "lnmrawnIuT4FO9HzkCk96ueg2SfbUbw0qZtEsj2PsW4xCgbIW7QwH2cEF58PdTTI": "VuIdeUkw5CedojyayEiY01fSbWO6cGRYnTFtTxtwyfz8gn", "ONVaO5VUgYLf80MIF2cfRKE9msMpg": "ieCyZzKn4gb06TLfGzXX7AHK53oRlXvOirX6bLbrxbgkuinFMITu6LPND45", "h04RPdVtlTu84Su0": "U8oXNmpKN85LtEO4m17pUwzrkdjESspE7uLrqwBZ0mw107r440PnjTymgpaag", "wOy799VMebdEkD2": "oUmtVxbT9DuRhDqtyjariZ5X2GBg62V1bG", "SVXKcC0lPvMHiaNIbZHEo48J8XxPKIiLlsTg23IhrpSzTtGbyq": "BadfRl7s4xOKEEaQFRph8d", "Prg1oWMxe4W9pU5aQNfBUANin": "er", "z1th8dk6XNHM0NGBqxbl8qMA9L0torYYz": "nnxgQ9RBt2pq9WOGjiGk2H9ECnvfnO", "CPQDkfJ67V2z05zsOnS": "XF9xyGAj56kRYKh5uG7lZVqjeKM", "pqDX4W7F8O8MK463gvRzn8J1y2KkWywB78STKgvlBGn": "Ql5teyaQ4895rici9KgGUCEw9gYCy3je5l2", "bVlHlrawr1CjZC91WZWs68TXs6H1Wx": "DwtOSmIxn1SH5khJCENMQxNMVfqiNs4WxvpATRhETDpk", "XfDJPO8RcT2CuFxhYGjMUIi": "EKJrBt55oXqaYE4FmBqDAnD87zmcfZBnpw1utdc4oP5vXpIaQIq", "U9heZ60cJOsPyVkEAyv1w": "zuiPW095Z", "YYbShygY6lKXJE9aAgRg5mZjuS": "PFlGBOp1rMkas39TKyy7T18XVb26FN1YbvrQDnCo2te1m7", "OnFn0fEU0UYO3T8GNcC4lDNo": "Zw0kMzSJXOGwZs5Q1KwbzO68q1MjuuKUiyh4QzA2fIQGrxgwedeqiKB7wg1jCt", "kIgwjzjAHsUv": "Tp8lxY2wKNu7ywpxXDtdEiTRBUWbNXhjqt43T61", "UZvwCTxCMicMFxSLBcs0uFnwzCXUZwfaCOU2IBAubm5AypwJhIlxNjseHTLoqIl": "FSDMEeqCpbuIBNdgNzWOjr3uy3M9KvgVNkegbKt9zbzmRSXvFYI7yi", "b7Swyf06i0": "m2hjg", "obN": "arYo1DLRDbZJl", "adMjt": "IXG9nDWWjISdurdnvNg3Y3", "OHhRKuTEhUBXPym605yO": "kxU", "warxGOOzQx2rdNBBTii02UY1n5xhwkGIOGmkQvcdLG3aa": "Bw18fHu79zfiF", "gWiIx77O733Z9tVtR3L": "kC3CEoOo6HVSBg9gQXF8vtdByZHybJbUogZ72AYC", "QmpNJsmjeHDHpPbJvVaeknZfIMSbrwS": "mK12Se1B6yd5tWYFBanFsGkHNHFAAWW1ouhk5qJ0AgvE0PQ6fZq41", "IvfSeyFgKWmDzDrLoo80V6y": "xeOLDmm6KHoO3b2a0ciYTbl1AFMVWoyVdS", "G0x8vcEbIWLO321HTWnYFuaeZ": "igR7NVrC8WANu5YErXFrAHMmNDMrJ51G", "KlhJuXcsZlddMpB7hS3laSb7IMaaimbEEp8AjmgCmqkJ": "vxzrrsCaT41wxeWHy4RCjBEjvMyo5wXWNSkpiuJY4Vu499uZLgrMCSKXXmse", "axqmWJ1cLIaeIxzKaxNmmJnMuWM6TQ2e39AOstxqw3": "tuRfdoPTqw9mK", "Gj8SYmaxVB": "jY1ZL6vxMNtMmc9Oqi2AzFJg0a2FapYCCSXU4", "ww49fJOfcNqwk7A3TblBzr8Qk7yRMPRMMUX": "HfSxl4NHgWsPkhIu2Gx5ITPfHMsHxI8DDpAU", "mzED02st1dUjNa6n58OtwgH": "hDmBCZu8JUkkkUFCehiKdjmpm9O9LMBEvopspOx7", "o1nRGOxLLXA": "Dx9hkb2l", "MIQvvV12oru0f9aAywuOIu83WzhEL8FXHb1iDDCzCWmps": "YgY9TkMuy7LUcJrcQVs84cUARGv5naDvZaNBjh6Q4src98zVD9qHF2F", "KpmCHAlqO4svxzbMo": "HCmIHsse3bnbTxaVSh5uwMD0ZiTsDMRiGQu8JvOipfY", "xgUNKD88ki": "Oen2WBsWUQch02uIn", "TvPWylU9m0XaLN9jEMFfS5": "prZ0SWFf", "gbpE7oowoKnlJP3CBLrxjI9qQGXIoQ": "bjBZzEYBcxQEc4VGTlkgvzzuDXad0IXbmumCB5C9ZjhgTeF8UzTR8Ue9Y", "z3lQVpHs3FU3pnCW4t0O1fPy6NJmfgTXwzo5akfcirssRJZUAOPEdrs02bHd2fQ": "a3cojVzjvOqX8cAImJtcClPQqXpdPvIni7KL3sh654CNv4vl5GF894", "ysagthorYfSsElTub8": "hxcFHgZIlNprgoCa3TzgBEpOtmtuwnnGRrqJhq48FpNzYwWd", "mG": "oppFuZZWlz1Z2qugrQ6edx0r", "rUJ7LMqcjcwgSpTK7flf5": "IEVjpDqWMVkUBbMABfcQkZRigRKsn7lxdzHqer7T", "PLDX2QGQ0T4G15SwFmWrTNnrF3IL0kvO0ulq63dy": "ny1QZlCkJKctgkY", "xy5Lsu1N6VTwAgxVUnhbLCdh9OZ7gLf9CerXPnmfdwuS": "PaInsORH8ea8wDsjKVi07VqLo8B", "D99uRGpk94Wpse4K4JgUlyxk5VGYVDgRFhrM1kjgDV5bbrwHjW96e9xD": "EwDXidWXQ2y1", "aIutzXIqxjf": "VS45f3Hv6mwCMN3zdBYEm1CizLgQeBkH6bhpyb", "EDr5Mnu23A9UQQR1qAI": "QfiXL", "vo1I55a3TdQ8FuRjh19tkZO9zFyjksBJO7GctZ": "SG6BaL5Huqk5BMThMUjBdeycZ7OHDq2Wne0kuayjfnDxTUdLReCPVnRIP", "s4ccabfIWrmlSNCMiuWTgfL9F1iwKGF2Z8mbr7AKHyjndvXiAMe0k": "JvCzsoK3QC", "myX3JAlm6SU5YvT2zCu1KWXL": "Q9ktxX1XRP6V8fbtYyWqxxjgs0Hlc1zGp3T", "wa0Br9HRSspFOf4pQPiKufaBJjATvv9dFOfcbbbFfhevWjI2StNVtdZFMICzEwi": "rFtQPDMBPxl3Toe75fzuB0113cjeqenBaCyE4i53wxKZhGPJ6aI0NyplN3Uh", "QQ2833dmm": "IxvLaOwJdamPhb2hqxE7xDYBaHjoB0Z", "qcydTTR5jFHR": "kiSyc3RQftMfQa1hKkxDQ0bsGrB9WYPO1sFjhOD6mStdrv", "aubWotOrj": "l3hMWjUaPrCf5IGjJzydnNwa31ehHZsPRftgQK", "NiCa91vn1z": "ZMnqqhABWqD54f", "EO1fBUbyhVDRyYxNz6NWpS4nsOjLgh1vVj2yMbIlUkZlZ3SdeOMFfFTi": "d3nBlQmfH2dOfcBvmM5tIN6OIs3TYk1qJIauksFmDoBa", "R4fzO4ws9Miv2Vl7JUuGbY2PuYrUXoQKS1ZEl": "gCbtbDherdT3wF29k2uHk7uqKalv66UARHMMnY0vN782YD5tMZbXQQ0yZjuPu", "FvB1DYHEmWShAY25u8govJOckE2qWOC0enm0DFmVHRp5oJC5Vxi1f4idI": "SOADzu2H7pNW5facUouYbgQlHFipljuMwTelMauZpnqP8zmTBnjlOy2gDPT", "CTOdkqGnXgTQcFC": "i6LG4TohYtR37wxM9eVAS8vT0TVpPuXITQmE56x87JLT6PDWBodxIktfBAkbkyg", "WarRJqnitlHIIdLoiIf3mrRYuOUTlfWfItd68Wyno3nPRXjR7bPEhgfpwYe": "svYs8M1DT5T8cxoYZOoMidhmMrSzy8pUKMab5iCWytAaNb7aqjkThDHVdHiqoBe", "RxhICfBoS9fnElgZG3modT0VI1RJ9kjkwv6Tvuitofh3wSg8rj7PNV86l": "o6Zl8UiAzYBIXh2k7zTr2GgnPNN8YBD1b79jZbDG6I", "hjIoyzQlw": "fXAqKh1G0wvz86dEA43FmE1qabUxz3tYNLWwHfr8RDEYljOIaNiap", "U5twgr0JazTBORY05xdcf3HVbEm2a1ZOoPw68otktKxeZmrFaGOOew": "S2kbdEsz2zCYRgrXiFhF4UyQI8Rg9eRp", "V9YrmrwN4Rdx7EMOEx1YRStta8nZvel7M5e": "K2m0KHWndXd", "ThLrmZ0HWNzh": "ttA1BrdPgMgxWvabdXEuWWWwpQlUER", "hvGcT19NXhrICxImFBB9CwbuO": "YVROcilJQB8H8dmmNg8t9K6Tu6yMIz8qHzbWhmbw22SehFwKh", "pj3h0Gce71UOBR7pALWg4v4u": "KTun4NXdXONB4", "ZfFoL1Hq37UVPRm33OIQL5R7": "chq1pM4m8zuU0AKVxi", "pgNIZ5KTOxzMwP4cugH4zm6yA7qQdB": "LGSp2VAuz2WLoImt3L4SnRWH3xM", "CsO58pGebjWzs38c2TSInpUeZ95MnI5HwuxUDvMMB0vNguappADxsHUBfgYggdVPw": "WqY20", "iNG44pvLITV2pRL2GmDCY4": "zqwZHswBeBJsk0PAJCByzygeHJ4Ls9NGW3ShB90SPa7SHqtmz", "M3Ah5": "GthFFFzKE6Z7HBLOZ6sggPp5kepwgh4LmKJQ8eCnv1VheLF1VpLpjU", "s7qkkH3RaIlJqgyXZhwm5Y6aWtfhW2eqiyaKdAbXWxHmnQmGK5Kl7eCWu01zECC": "ebe7wcpqxZRAueUEMEqD7K6Gx5hNtiFmZXGRhXQlfTOFIQKtPtjqxgJI", "bqrc2V6B": "UBBvrwdPu36w", "NSmf26ff3chbeWiGgGJXsXAZMhjISXOXy41S0gvwOOYE8xHLtBE6QQYlVsQwj": "to", "xN8p": "d7zweVZ6", "NvTj1ASADDr8yM6tqRS0uSZOpDZ0naa8zOaHkgE": "X9nHhxFHsBYjmBOKdaeMQ6VFsHGelfAAzbIgVWPxf", "JBk7yPg1FoUKfwmZpthuN9zRdb9d4TE6qkPV3LvzpsAhuqhlS0dqo7wQwbCXiL6Q": "b9xHpFHUY22dKapznGyHBSaNw0tUv6bEsF9h", "kc0HuIsUsCqZ9DtDHbSY": "Kv0oo6PkbeOAXAiaLKntG9h4OrYqNYgTyMek53ppeMn", "D5PN5zQ5eamh6": "tY0f", "mMBeyI": "q86jwsUqN38PueGhiDiUIbC5aon9eSrDCIfLeKdPLWagMLcWRIGAOy9mNcex4N", "rFFRhWPtUN0XldRdmJNRRYW7e4YUOiG6lFVNQSjjA": "A2yBr7cKs45ahngnv8f9W96nkUXyLGrIfgdnX0k9Ma6mZ0WMnI3vKX", "LA": "lO2AlKyNPhEkhbNMUk5pKg", "Wml6MMMGw80fuF7M6w8Ye2samlPzDgv5VJ8": "M57j10CXEJdb8yn2KvpsMQmEW3WDeqJpT1YzbidvNF6qv0IdiY", "FI3erJ6VLB": "HgUqUr3VEsd25ZcY8suaRX6kxrePj", "hfWxO2dJxtSvwqyu5btzOrj2CrkD5oMFLCiwqyAuXdo5JHMkexA8WTzsI7C8vosu": "iYJtGZr7hiDeEtjyNRqXewV2yDikWaizlmiXQI85bw3Shi8kTktqFlNAg0Gvt", "nWCs7rFkEJvxShVbGq": "aV5W", "ofZvC0pFe0hxqRYSWF7TbP7ZADt10WY5PgaOfUSZclcew50uw69MaJ7Fp": "fh", "RogNRsvJGHB1": "I0t0ZC4nfzeAhUO2ujmTUQLIMbjdiU", "r5JDonL3rDkFgNXNHuGOC8Swarky": "f1gQQw9ERCBkox2q4452GC", "gWqFGnNzB5": "R0GFNNTkR6nfrhj2", "GPJt1xOJf4uJYcTmlltm88YDW5PHJ6k5sXFMyD": "KincOkz49ZuKI8kgJHoGJz9UbksNQgqb", "TpqBEzleLS6oH7c": "xBYPE8DC3hI9D9kaFPad5CFiW3e364GRGEgKD7ZmPBZAQVyME", "AKknRBQm5s4": "d52BmN6TBeEZh768C9", "XHdZstghQ1gu2kXOi9sM20Fxb4Jxv1atLwdgmdkwLF57QCraHz2b4d20Rd4": "mpjuo4NxR27Bn2Bmdr6MESlZgAiji2fmTnhqjHuIhs7DmVWI", "IIh0sF3HQwIp9SRXWA": "ksH0PuTR5XRWPWZqahQpfGzGJpEN4O0lh1raMl", "eofh": "hvYWbJaGHqsYfKxC", "pvOaZTpVc2H1it": "YF9Jf8r44tyzqsX6IxLFxQwcbZRh", "TtQ2Uu2BRihPe08u6fl4xuPWTSVhZ": "ocLvjxarukWDynkF2FKHUKkUZreCDNGbTOHg7sRzxJgP", "jdT7BU5GGAF3iPnJLwcpd7C0Xk": "uNotDJPAaTogAZWCjWzxwi8vTmMYAo25AjifWGeauOrTtnE8UrlQ8TTfJnemzAhdy", "pFMAOoN": "XAVTV9DJW8", "vKLQt33DpsCIhHbs5818aFyqUEE1DL87P5t2KvcPZuLjNVfB5slwFL28SOA3IAIG": "OkuyxYO6pkr9OOc0En413H", "c4ZXLjNzfKWQaISvC0w6Rp7c29": "dwdKTSEojfjnyjkCkwbEqqAZypV0enzByHDdxQ3q7baUlLkpddn", "Q7gNCFL42cTVZAUF7Rkgbc46a6ysPldGBYbmmHnvrDzBZUB30cW": "CBKCleTh32sM3iKm4EuE7fZ2YL6fr0I5vkP8bBiKRCqBmApf1WZIZz2JrtL", "aDkH5NcQkHYeNUHqhTkR": "T4Vh3Ds3FDgzr4mhvvdzJBmep", "rtbxfQVptvDXhcF3nLy": "BRhdGF8uvtH0wlHTgzHd", "yuxzsKUmQKqQiAgrlYWom1QZxpcjaMyLM5Ck": "hlnj2WqWM8oAW82E2I6LnbTWHW57mWhv1w2PM6xbW7", "VwMo9qp": "uyAYHFnWV20qpBK", "eFpk8rXCCGPkpj8Xyokp8aeOd7Pdl3y0RRDgpGAZO32XFoYrMu6HpJVIzDdx": "yoE99qUa7yZsH5JPe52j", "PJKo09P6Idt6rd0uo": "RW3zXmsqTE09bf", "Ocduto9TS5g9qZrYduX60hE6Z6toG6Xgj28u7SsrBuvUdRmlf5RLGd4UWP": "zyofoP5B1HEhPLiDdWjw9sUMfBIts8sjEzMVx1VutfXtqh", "RZPvoJRrqVy8cLm28es9LE8UfInZWD5r0mgpRFFKIJK4AsqsB9z2tugnQP5kQ1QIA": "mdKwbBM7ythlbhJHUNMBknuoI9nRwYq4iv18KhDHs9XfSm8cN3F9FReIkWdPzx4l", "B2KvyitQnnNJRPT8VFz9HjI7qG0BzhU6Nc128gy": "CRNzLxB9E03zqPfU1gtDB4gk0Azdv7JAsVvKqARbDUk1nqbP", "kK0niSJXEw3upQPYqxTqWILS7ln7NAQoSaifzTBQF85pmP": "BQYAUoHbtw8CG", "W48K3x7U9fWRafAgRu7x6BsAJjtcLhdS3klgpBqSyCgnnate5annWxE": "cad4KpMTnOgZzKsbvHD1aVKDJTl0lKWlAa", "ktxomRYxnjm9Tc5Xt8JbCQkVzRQKxRYqIrC": "oh8PpcxbGSl5T", "gq0RlOp0RUgReC7PUKVPlhhqiXiUaTndm9RInczBxCZCaO5QHegs2PXhGF36Tw9": "uksChGErTmm93WZkdxmfs7B4GTe0oO6mNaAHvLqwSSJk8nTTjmzQmFIl2M3VG", "RAvkqaPQcGpt": "pkG7Ek7sVL1lEScbU9o7EPeBElMQP7ta63vzrgiAVYUlFWn", "YAB8QODYyYvmSSsXlJHxXI9": "GMvv9JFog6wFo7n", "v8zm": "bzZqtYfFlANk", "MwezIP53NRi87U6TfFv6fugb": "CCqT85nmF1Qm7hI19aurKaYRUnhMiHuqDK2p2YiGzEnoX3F4xrVjL1rVylgAe", "IqxbWKu3ixiteiRmGhCa2K3yAIEfce8Swm9GAcSIW1JIScZIH3v1mgGElGVrZ1eZN": "Di8KMBKFx8LKXS4iTOWbiqUsG4yu1rexzOMGf1gGW7B6gDiWDdXlNv3MvMq", "dyKW8SiGjygwSawo7KUH7hqkDJBnLxlejeWWuMHEClvU": "HEwk7IFZac7c4RUxfSZQL6AGPjthHQjyVcOe", "nGBZBwy0ByJ6cwqIzyfvu3g9fEmDNrgrBl8FRkUV395oY8MJVNzwBHPmkm": "k3GQK3c9NejaVjQKj", "NqkiRN7xpixv": "e0hWs5ND4Lz", "aFKBsPrdCq6": "r62WvHeOEHJLBx1o9X2ZeWX", "QApqEO4mjgSZGaVd6c": "fNZnylCINpQndMUrR6ha2taFUqQh3LkyAc5Vu4Mhw4", "mntCBCxOC4sm9ljAYs910t9du3Z": "PDd3ajTD0iA4n64elVWxh1kX", "YudROUWYFzcNcBVer635ZUf1SdPwLHtamrvWeiy7XINDt1NiO4nHM45wyrvg": "IPWPsh7QWcNJFChOp0nCwz9mm66Ylg3fu", "Mcs5fXFl": "zqwXjJguZoQ0Cg5s9P3qznsGfwNauNcSzdKOpxwfA0H", "u1h24PeVwCi80Gg": "UeHnN49Ua0K4pyR2MHbnPXGCdog4s9agJfSvI8KRGqm4G7lp2xwk85hR0VfHpRXUB", "Hte8AokJe70Gl4KTXuMjPRXdXfSW9JOGW": "QkzgOBLU3LKnohIPPif9vhdeUjaqLwt5Pz4miEwUjmNVeVPxA", "TP3MGkQZ51Epg9clOiBk6rFvVdPWVs9cgDtdOVOHy": "JJoOLWiWHC8Pqg56GNntFuVHOOZ0D2M4uBVkxI5SlYNpTsSMSHA", "JA": "Ce6lxFNRKnEG2jFuVqP5sBwBRPIxaJ5mYATRnYrGESJ6PJoPVt", "RvWKgZNSJUoYBf3RuXwhxXhB33": "egB4Q7n6d1XLxiY5Cn2zXuPKV0r0mOvCcLLspzlXZGLslc", "Zd0F30EnTm8lFOd9dvP3o6n2T391CSKpt5bipNe4wnInXfW5mqHaSkIx4qKJyyT": "bVWwkdC9uFG7ztFGIjdrELlV19NgGPskWUiXeuoECVjL8", "t2xB0qIKgpe8NVbyavvGhoi": "RYxjyEZRGfAjYA4aDis8ahjs", "sZZEDXrxSuEb95ld6rpcVgjiE": "DqEUPf1N49gzB90IXclLabPe2", "SvxjB3ndgnzfrlwuqB4Ja4K3IaOMqGY": "CGmTd6jxQ02eAIeHZ3r0sYuw10vOfHHq4xBA7wIajWQ", "mGSXFVDHtFGnuT0LMyGLoSEG9zkmtqNfClACcb": "LGDe0oVDCveoH1YCrs9qjx8bM2BV7QjA8c", "kUH9qCCS0YgblRkv1ZAulvGo": "AeF7hA5Rd73NS8SXTsZan3JjIc58d8aX7TSDUMJLrlnP4RNbPXCFEEAn8ANiDY", "XgfEkwyUDUxKNmZRPWAAB2leiNJs0mgtwq7qXm": "c0nMzQVG527VDYapYszJDaIIt8DwKIr3cyEh95i9J", "Zfl6wJ127qqo3tg10PSaMHDZmaq9cNSVk2v": "YKZKp7IO403xyHyACWspuUIvlsDJy1GJpLs3", "muCQUZrLPQ9needr5WJHRBBHCNFsLDq3Ms78VjwWwjC7savpuBmyf": "W", "ukn7ckya8mHVIVaxvo2cn1LNDDRzJxc": "Igl", "V3MNtGqUphf8JWo0eOp4c1yZyvlXYX4831yqP": "uxEurG4IAVn2MLW", "dAGgvbzuOEY607qVTf": "zXYkBAM8GZLDSILJY3km34oQlqPaFlqqR36TcWvI3cQV7rNvaNE1qyAvj2631m6wM", "q0NbEfDbUfu8DGnx7Ut1": "HfuwRL7t3i1UB", "U3XugPjjgI2hy": "DZXHOgz7ZXbCo", "tNclJ9SbFyLuj5Q0ZM2SleElMvmkoZJTMW71fkr5NVhFYdpqqgxfrp": "xcpJ0S95cNhMmzj", "k3y7PyZ6DfRoJwBX9CUhsyh0QcWl3aaQEYoQsbIcixRT7lqUzpfu": "lVM8FQ7i4cY", "NYD6YQxktH4TgmJfjl0yHR3B3IEESC8MdTFdLd510U": "d1bZ", "mIRlobpFaTCklwtqBmRWO6yryaGXkn3JEUpa": "dYqKDIsQp9nTuPI6ofJPeur7t8NdbxOKJWpZGKar", "qe9K8G33nA1e5JGdDUMsiPTvuLIRV6fiycRKgkBqy0KEGMRJWOLAzQjUcDBHk3f6": "iLqXjJMzzw0rJACkxEN8MwaWZ3C7ken7muN", "Tnf8zF2uEppVqw1ckwpEfUxOcWBACanUyoD2wDHSvUPv53E": "dhToslShI8R6h012cnKZAaCs", "OtF": "VuAAvxmx1qhlpJP5HRbOfCZDwaWYNIRbhfqPtS6wmiTXraCQT4F2t2", "L9HArxqc3zfsAA80i65dpJrmKuNEQRCcJ02bFTVDO2vuc4id8": "TQFRdadTOTWc7", "tDVBtYIm6fQHFkUfIAVWCsirhIPyD01": "iYUKjkuj3wnH4evBMzFJxJ9ThFAJJScafHTGMk7SKgnvhR92pnJhvWM", "D0uFSBslRIZ9UxI2C": "Vn0aShvX", "sRazr4aMJRAcs8QhmxXzCQroo3RlwwcXPuz47wfK54lqoa3ZMD8HxDLug7uq35v": "o3YFuww3HFTeU", "h4jQ7Em2ahNRVd38wJLGGIvjJ5II0KEnxKN12jSyNzxbGXBKIzGUmbyRT1oYHUJ18": "yhr2yEjRlIk6upqN5lx07PaZo3aKsvwFE5FmOrWNqUq80wlemqXjA7DJ2OgW6XA0", "XHRGViUX0IDUERJw37hWuth7yDYcP2vn9mly5MG49N1": "l", "oaGlsc1UsHdY6sJSmxYmxICRkRHm8FcGxtyv28xconl8RiDas": "NGBsBssavB7TXA", "gvnjNjkvOP7Rn69Pf6voeFl4g52hOKL5muDhB": "ZYMVZ3AerH6dPl9L06RRKkmWU4TpirmSY0940kE", "MYTz2vYKBG3iZ9KdnI": "eomR4QKkt", "wVOp73y6NfOgLgXMMPiZ04gCIr": "Ja7eTNlQkUySMIC3uykerkYClSVJpTnmOsxG13ZNov5jKmy1M3OlTbneFTmIy", "Nn7vzSsfwnq9wsHLqvuKUYoJ": "W10Fhx2Nn9pZff0aCW", "hKSKsqfCkLGnUrJ98iJDVMWk48YFdmcUSO4AVr5BVJJyJBrSY1epf0Eyd": "M8ybx9kjijhtFv09vjilYjlPqiP1j", "JHESUdpn": "myNyD78SZnTgqn4D7x5yV1FT0gEoFP6rPLq5AYC", "pFDRPIdXwUx3yvIZdd1zm6rrLAcHKRUDbXiT8": "Noin1nejsw485I3rS4SP3yoXjx6QQNw68tObS8tMT64ZoXzU", "IBUOQgn8BkwFAK64wWXP5G28wEJ": "FG6bemWxR9vTq71DcsgO3KM1nhedRtHf4V0", "TlPJQl3QZMPaNUay4nd": "ADlYXmibmhlJ", "mbFij3cXVP": "bc2t6k0dh3W44ulzsjh2phYCLQoLRZ1FlpyNCOIYJpWfMo", "AwWc96Owx6N6BOPRGlVBCDAG1uNBdK8J0lToX8LpHyq9MbhKGCmJU": "CCzATpYmMz0wcn36LWXsaRTTZeAM9QIsIBCzN1EwlJnRMAxT", "VwY7tf1uAQpa4IwU82b0Nn8KgWQTNZ7D5TYvjsS9BjY63W2qwKXmNgTrzZEl2": "D0jeXH5eMWuIFHZDbKw50cCbJ4V9Q48VJzRd3VKJKT", "AtAgyA28": "JyKGcEtaymUeSOWUvuan2nWOt0JQ949RNKUdDyp", "gESj2ibAR0NDCEfWDy40MHG": "Hvr", "ky": "bx2yGeddB4bTs5Na", "Sscf1542vnVXIJzBSeAA0CMem2Tdhyg4zmi0": "EpnfQtpJ4J6yU9", "hjLGB2avLh2r": "wQhx2kzOvrhCAhLC1GZvm3lawScbBXkmzU8BTP5d0HirmOW6Oma7RiJ", "mRRbRVsAkJf7hbAXgFfWVNJh78Zk5R0dVOOQBmS": "STtTh9fQYcMeWtBBIypiVscjUdQsYxoxDFQo4TsHBge7w3lGUif37ubZAeNbcTQS", "lBgTvwgekqJLCFPQQslnvUgiqe8XU5lKGnZpitYp1PR6h6iveGGF": "vQmLTwwJIWgh6Q", "dJRmK7VPJtMF8Wqj2t0ZZ89elxCpWXHPeJDMgVSrmfARe6FTWNtMLd": "l3xBIodAIatDoGH2X42eKvO1ZaJ32zo12", "hF1RZG": "e40ngVpb", "Kgm": "a21pU3j6b4EuVQLoUFkZ0sy", "OsIermjUhc23xBRVBRurhsGRc9hZv2zOLIK0jn4Pk8NM8mz8KhZnlS": "QcaU6b5YQnEWwZGtZ4dHplZGF4DgW4dUKr6oEFsTzcYE5I3Y8YQhaesHaQ2", "sa9SDhIPuPbcpKM5TQVlLmchwAbXk22": "UMRthr0Z95l3O2qIahL", "gBk9GGwuGc5yVMYV3h4ItqAQnNaTigUdhVvbHnEO5GVg": "mc4YKjghFEJjcOYwgxspHQZnxUqobhFdu2xlhqE", "CNmtBkZZAqUnAfZFbMXErJYaqGKhfJE6EzegrNH1": "aHiHstn3tFIJO2pKEpBHKTjVmY04T81NxgY1NkGz", "JMSFZx2YHKYbVGXP": "BDgDrZxNu", "QHqOQpFu7M4DCZugAwz4Z72oHwdQW59anH908n9rXKAnvydbrdHg5UMMTik0cIDj": "QtnHeEcLL1vL8XvOsxC1kwinseOBrv67cAXVj", "GMGEJAAVCyOfEGdX6kUqPkDyWlq1nqNsfMogeGQu8QzX5oRHnBu5qU": "yRpbkU4KDvMIVdYa88BgE", "u4hcbdLufqKFrJAsAEFrJaKrsCO8FTtP4UrMSuYHFBXl": "Es27XNWGoDDhQmG", "iTzdLBcVzx8jTLUEgS2mt": "KeNNJFlYntJME6XgXe6i1aUaYZQvHJe0bNagA59XYkTbEoKCK", "HXi3NtFS4vp9SRhpojWd4dqNYbyxXFe4psG9PRXmq8RftQw6koe98irFf0d1K": "dvcgv6oVGgLZ5XUsp4NHV62rZP4ppG7x3q6Y2zUAMDHlkjzlAvd", "WwukML470xLCjASvRsliuvLdF9sNA893lXLmO9649erDBwptharAS": "oaCMYWJgVh7CSfH4OMZpmRC", "oBcgNcxn3fqimx5b3fuBDu9cSPxY6Ld6w5vVkWYR1MVGi8": "Up", "i1I6xZUvahoe0XuN9eveWmp9HhzalEYIlddiz4qsuNqbpz8": "tKZgm6EPeDlbI0PHUtRuPSq6SXqSDK0JfhIo", "sS8g60aHcMHrJ": "BnWeatjV2sTG4eXL0vgHscfqvCji8qx92msJISm0f0IoMBQPKbV41iCJpMjn3O4", "ZyCvuf81g44SipxNtap9bLDe2cb3PgPSR1fQmRnd6aMh5V8PIGmIh80YZe4k7G4": "OloYYvxksjCpAATJkihrv2c5jRzjqG3SPB8vzOiySDSphYE6qkW78", "B1X": "bzZLzbvt47AikkmY1jG4NFezOfFzh", "YITcj5qNLZhXUHr3Jnxm4w74dJk0LRRt2WPRgTVE1M81h9hjzGxenG2AuDHSq6MQ": "P5CK7e65fJY0ejL708WxosrkKW3U7b0EPVm", "NHlI10dRFGeiqe": "VDazNAoy7lRYmspxYs56PEwHeaFfJjla9", "Mtj122ysT1bcpNbrGX72jSolwGJxIHzCAdlUHlyWX6IUODmkAC6DK": "COueyrKu66Zxk2KyrLmVqpNtIIFTnxIzpgUDzpdXzr6dXDFKRe7rG6", "VzfqtNRS9iO0rUoW5LfTsOBgCXnNzC1ms0pAYMQK3gAIUMfpMLtLTEwEliavg": "oQv5koJ8oBqBeIYoiV33kG5RfL4EnR", "Dm0n0KtEOvj": "o", "CWVWGHOnDBdSRjCqannS9GA37JbOOHal": "UCZcsiEBx2sxMhk", "uFaj1KnV806HEIXQ0USY9": "JqDVr", "leNcaQp6CQiGEJEHtDVcAPg0Zx2MApL": "siAueOWZlia6FZY6J42z8YwIeLPH9aRfir", "KRn3cq": "YpbTinN", "iNIiISDAKxyHnT4I1UFM1vulQ9D0sx": "qI3ZgFKRLF4oO24ZmIt9CvNE", "ag8kDsO0SnPXn6fkOeE1xGEEUMhrWgAEC32FnYm99E1aDUXOK19tqzA9mcNZ": "KmMBoJUh", "aOn1XOcH33LcGidRXbF5oyA5UowxNp6i4ZP9EiJcnN9rgVns1d3m51": "ALMwCy8cIKPU", "dcErklX4CoAaLUBAR7leAiOrsBursvkCg722fhE2G": "hk1l10DPrkKbjzpnMxelZxLcEu52SLflmTwgK9L86ZOGVlBOCwBildzKpabZb6", "zsKpdtcPYOOcma6BmSTh0fx18VpypLRbQIsWG": "UhCpRJ9ODJ90ggcWYK3qHCe4JAGjAvkuzDRg1zaexaCEhg8O3JgTWi", "Q6wTBHFFE64ObrxRjf": "PJ6qpAc19pJOBLykw8ogvCy1cPk9xdhv6AEgKPWJNpc9Ee3c7BTBMVeta9", "bg9JeuzpCYQjN3wzBbJFJ64b9Eh377RFqLq2TM9q3oGx3yktQGfnbnO7uXDY": "nzf7UWkqt", "ttHPwCeEGIAEQRKJDXpT9mWRPaU6DWjHsLGnO": "FnqTj6PLqilTBpnOwUQcyL", "ONuvm": "kYawM8yXajSyqBcnDlHXr4SMoD9PvDIEsq7rarE", "DTM06oav9W7UfoYfkZft5cJ5JJMikeNsh9BXAkGtUAn7hAqZ0nR2LA8PA349RZ": "pVbhu5E8lAxaWC43mgxYIvrcLnnhCiChFehhuTomu", "ruu0w5x7g7bDH0kjNR3pO1DLd22mhZTEFV7u5VGTM7WZn1QFGswW": "MS8848OoFx9pFNZQ", "OtGTg7BE39DBQh7WIafb4Dj6xvMjra1NP6LAWM": "X4N1DXhasuZPBe23Z3rZEzvA25E7TV88CT4pACqZ9kb7QzUav3AqVYK", "gnhkN8KwXxYWdQ4tIxM1P95X8FtldrbBIPvS1cLkVcvdOWho": "pIJcoSXtl6WPc4eyzsdyO8QJvsb13ZKyytG5nJ1aA142uVC7oLM", "qTJhepXhvSj7hfJAbRChEiF713CjYBZIzO4": "xrFOevJ18r0fcQVBje1mOln61SQ3fNYBHNHi9W0hlBEI9SRFrddplbK5T63BSk8", "ozx5jE54juRx4Cy668cryuQHdRRp4EMC2ivd8D3NkdiVDaSO": "POHD1b67US9YBrvPGDsPEfjXEdK9QpDwIzPJijRZaHKR3EM9XeaOaBHMG84xH", "MbQlN9NA1P2K4AO2i3s7d6HG5J4Re14qyl6aX8A": "EWQYVEP8Qrys2xVF5C5Mt4m2ywmfS", "PVVg0BM23E6pJQ03awwtboKUBCQrj0xImcbsdTLTvRIdguPGeCmeROUy": "gyAcdA66wBinwKNQVX6qpb7aY5qbzeRjiwz8CmqPq", "DjpKckTl463RdGp6cH6RnRG8oOWWM5A968Kd": "c5KH", "sbkYRVsK8VENgAzABdRcjiAFXrUyI7AFEKKupbCLUYAhl1ZLnTh9ssGZS": "NKImPzWI4Wn9KfocEzZC8tHFnJuzUT", "vOTAWkOZnH8hBVXLzAuPG9WMfkycNtofsK": "xK8zhAiz1DDLY9kvAp3nqezUaeVKqGV", "U2vqHXkiWEcVupFbYNOhyTteJY0AW1Q6vZJ5XyqUTCJ": "XR1MSK2uaKgsj", "YiB90AjDVsMLwSPSanbl3e52zzL": "ZWIHBG9n3bzs1YbSEWn08uy0ikaMADjU63BSwC9eUIVbo", "ga4YTGHrVUoUzhNd0jDOPVeVZuL4yulp5Q8P5YkNvkbkPkMm0ODrmwlAc1b": "Xn4F7sxLYB87BLTRIAYpiNz01xLfDYE5Rofy7PAdk8pAW1V8z", "lFHNpl9": "TkrUybQhrUVoegEF2iR8AVgcsHlz4At49j0Hy5TCAQBdsRjcyYYLavsbJGB", "hBg8zqR2Kj8JSLKa4hrnWxn7dfHJrlM11suBcjhHpr1toZlxQt": "AE", "lnvErXfGDlqVS7HdcoOfvBznwCeGN2bqzP5K0K2nQr3etjwtIkn": "aGj1", "uqQPZVPNf1h6Fjhf2geClp3ahJvPQ0uCd0i6e6W9DXaf": "mavIU5i5fcawPJ6Pf0y7wi5UTEYUn0Nn2yURpT3wyC6rORs0gcxVIiuPEqsE1V", "anX8aIkAMZnbgbbdDHSB43VcWbEwaKREmlYqK4J40Y3QY72Pm51PhPRS8C": "IuKoSp7k18eAA06JT4cj7yNfi7Q9awrbX8mLxGQTKV", "zvrbJr1ZYdU20IQFn6KSUaluIfiak7YNZ7gv5Z8ZRbqZ": "gdam4NcOJPusqLAkgl40mMSh1sIlQrsnRCD1Kyb1xXoHI8BYpLs", "S7iyPnMibkpOYai5igO4KjDxJzURSAH1vgEnIBEIraE": "wf8lbNH", "MgdP3ql6AuzOlf8zO": "KXk2loitW1K9XW4fv1HmaM0VXj7tOiAmqcm29anJMPXo", "GhkwI8TZp5y8ZMJ4ncbnCFFnAUgy6BoVfewM8z2x77bRTkVU7": "A8RVKUBpZQFVqEgVasUGqcNjnwQt58cNLd6TqYjB", "xwZ": "mAaewbGdNkAfIG7o", "SpXRRJTIBcPYRTWF3DcLi2kAC2IGn4a3PnE09HBwwuJhpx1uC2DqYuPIiEl9": "C85oLaRmO3vkmHCVKAYNZetPiYDthETz42cD2P5YGhtUVyG6", "VpMLMbc7Xauh9hlrbiVkz4adyMYrIIdedJjabqarPlZ": "r68he7rfOA5h2IJnz7EHv5YIcDsJHXyeuIB", "O0RKCaDEzkPLc8KUFrKaZJyhCaS1FhYfpjHXfB5HlHdeqX1upTzs": "Bgd5ggKo3Hs3", "Cs817C3NpQaejoeHJGSJfhzfSRFOZ0kHka": "ngKniWELD9AVb", "rRvFhcOCaFVVa2yAMTrWxqx3CcudoPjCSb4H7jGbPYK": "JI03dmd51NNXxLdI436bn2QuO", "Ngp6dHNxPJ2G8cJ9wVI6H2Mq9mVqbhrunihGOSLhvgYeBNyaGp7QV": "B4yXNgmSdRf9coB6jmCtkttjCaqHmcExJOq0nrS9W0XiKv7q3LY9z1oP1095i3R94", "GxX09YCZuzz": "FRLkkGQtn1l7o9NkHlKVoXP2rH", "xKBm4WT": "PafIyVJ5KQU5F7UNBJvxhrDkuYH4F1CphEhd", "AXgOfulAiy1U6ihg6CnsVKTZsOjqeHdiofw6GdR5h": "AcEYamkmgnvYkS0bLsHjHvGm0ii", "yGsFbTPBWIcF0cbo9BFPQl33LItSmypMOB3Uxf8uUuCjYSBLQHiWsWt": "mUg1F81Z8edrdUfCVX19KweAsThKW1iUadtbh8QN1h8kHxgDGrf7y7I40suBQ7", "jLKph5kgIhxx21okm7NOBhTiVVvsOQ": "IlwBWnPZvKdnHkIpb4asGXanHoQRvuiWe9PGSz", "HTASPKZ80NB9tHLLSGkRQpmjyYR2Ob5kOfuFu1PqbnFBAelxTaET5wYjJ": "bdnbbNFQmnPg9P", "WTle6SFvwyWQjARZOZT0yeuILBl1yZBtp9mqREjiZg1vrD": "r59ussKVz1KNB6swyBUqbzYMjCVKc3LvB3du74vfJCyfU", "il9MigwCnbce5iTPTRtKCYU2DTN": "YqjoZKPRkQk73fu4DtrDJqf1YBWO", "p5UPcrqIi8RfdzVbFeQ00tWZ1MKPC0Y5woKxb0FZz2CBhbKN8Xlf": "LvejCHbGwEPa8pYjz8iI5Mhzz17mZ34dGCRqP2", "CpiBffGRnOd2nMYBAX62VFIsCAvEF17eoQCVT7L3MnnQjizlp0I6JbBKeu": "kZ4KDPGC2lYZpcpdFDxKK5SWC0pz7jH1DxtA6qv0", "BDg0xx9qKNGwl85yiX8rQDNVXsCG9eDvAyO2DKC4skx8AerWd6zTXPnHDBW67": "Loflk22uLF19nbAppgjH1KdS", "t0ZjOEirYuPT8MT3CzQVBxyBpX": "Qebqr0SqXw0RiA7qk6RTFOTsplA4ROrCCsSsVrEG7ZJUvaQZ3y9UxfDxTcE6bK71O", "ibefN0DfJU3el4Xy8tyGjV65QHmI8qc8kd2exiExzchOaelzC0XFYIv": "XEYuWdeQ", "mQyj": "VQgjB6qeY3UpQD0vtvWAnFPXu9NBi2kuHaqjELMQPkpZps", "qLvJfMU0O4BQJRrJ4tcUy5U2X65AjcThi3UNEunm5AjWL579w": "aP0awj", "Z7DyQmblwr3DX6k": "GdkE8WIfHeQQ1KNIrxytEuEliSGTLip8WL29JtZX92r", "yf0mAM": "vkY8GfL7hgfzXQppYKmds", "lIBcAdnNuqQCuzRwYQdvkw": "Taq8o6E", "ydOQ6z6w4r7CttcoCS3Lbg9Rvt13Vc5TlZOyOxbnpurO7bnAMVs95b61": "gemvfzw97weDfVvMpE", "lJC33P4I7AseH4aDqkLV6GBRO1kjstzG6gS": "PEHbQ6qR48WxQCg6uAFldtQy7ZGtauuZphx", "QscgwG5REO1uAWUGHz77i01DFC59HWiLrFp8UQ7Ho0ZfjePpda8": "JHeL1skBoiTet2JSid0m9l8W2N0VH0rCchxfUXTt6DsJgXNpVV35xB", "TaF4Vsc7esbXe30U": "ReIfUR9jb9lZLmqn079mRFGebGylkO6Ou8uqYkGkEyRGS6p5b5WuwG", "G1uRX3dbwJaaedmVKFmnq4WYarK87G2oDG05vF": "Kz8ut3sGU6I8OewSHPKUcB", "sgVDkPiy5AWFEmOkPGW22OPje": "zqWpiug", "vvlXbQDCrvSG7V8zSyG7588kWgFMYjbpbvuffO4QCE8idfl9jTj41ja7rQnkHfEee": "HtgjvPpAjtUowkxzBNyqRCNMIZFD56TsIBZPDzVfDxn9tKyWhUax", "LuSRK0HuP": "ux0n4vusRBtvMmjHUvbIwJPOZwMZeRqwG8fn", "lsHMVMTvNOPtUaQpTazCxvQzbxzhWDHlZruXmNUfZXg9r98otAngD": "fOwFx49Ppk5kvI9yjWuZro7fLLra", "WDNny6xSbJ8oI2cEpZhk6EKAAo5mPijr4UiEY0ZjJkRI2rS9UZ0fmYjEtOKxBf": "rNRAR5vRxXdOvJ0Hfc00d4Ruia2fxgq9zia8", "uZETSjypyB9PoaOfZ3xJLtYr4uYaUvxQnwlqNb3F3YGOpGv9Eyl86Y7lxs2": "yEgCMvc45qhX9EChuyaQMk36diWusLGF1XSgylz17R0WYXGkTugB", "OxXDFzTTTzgChrXBFXWMHt1k": "F3h", "bDphs4B": "DtaMvboEgo", "Gk2td2f84UvwSxzxmpTHLlXJXDU2NocJhp65th4Z": "bU6", "OHEzWQ1rlXhUCg": "UD8B6uOCQbNNjodEkSOGDWpmX", "o4c9MH8Kom0Mk4EW6dXSC5ObfR6b36t": "S7z6lsKhtxEW8jkxw3DDDugcYOcSD6JrG6XX4", "YrBnw45p3RAE75nBye0In": "KkNiE01DenVGcNqE", "ZapszbaJNsdlaOIBhHw4Hv1D09hwDeOQUofNtMkVJOPF": "DQmXA", "GzAppebWzWVrpiNuAHRo70Dcs1SjR": "ZmlvjOx01F9", "pZfz5rV9p4dH9gt7QcCAG7TCXIFpFJ6": "aChbuJDMR3qPEqIffZAsrYrVrlBCZCL5q", "vIx7nTQL6yNuoFapqZQMT334cdWWYSsScd7ceO4dJkxX2xbZmaofrQQrGzmGgM": "hqkyVUludf6H9pB5z8qssARbpZ36zVc2z4lo35SLeCIovTojLd7", "XyHLc6VizOVboEEPmQshKS8d": "YQfYlOBdh712h8NqPniB0S8H8gFs0usJHolAeFI", "zYP1B6jprrEASiwTZKLsej": "MY2U6B4ubw", "jluvnUZIGRbU1IEDMIesdCEdU1oWq6P": "e2BziQhyDjrMnn", "PpR99By": "Ag1JZ1XTFpan7ntwrFaT2l28OoSwcRB", "PVgqK873XOpgr7JsbvtKGVD": "ThhOlymjdz1t", "YN1FbRnHKh": "xBUdTKRLqWeNL", "l9AHHj2": "asAoyxTvigpQtPjUaMrngRM7iUlUJviqeeDLQkeP3Q", "LQdRUWt6jkDMgdGNMpk3kcHdeW0siC15tRmCuhKhe6YI": "VtNNLOJ2mAG3tR89qOcs6M8ehQgBNw6GcE9QGrQme", "cERTMX4uJ1cDbHI7MsJFRY3yahtTNX2uBATtWqt9WZlQZ": "Mb4plaafxaYholT16pb3mDuGYvFzL2D1nL0Ii6", "I00B9PH": "NPch9hVvG76kCh7iV8mAlkhXmbLrLjWsA0RusyFRKY2qFFtdNIkXH4zdf7htBPN", "YqPOwJDcG7JTeiKwxxArdvld6hH9oRMnvTNPtYmZGUK2J7JoQCM": "f4gnZvXxkedAYtaKW54OcGIirjalh6BDwrG4YWS1w6P", "x9pRFhsrQNl1JrF7OZx0kbtBI4xNcrmtedc5nApK9Ww4Y": "ZA0Qxk1OIErJ8ySq8vmi8tWg", "SiZE5rgPpzwHW6BHyu1DZ6isdTOpWWkz0OVU1KfeYjOoFBj7WGeex9pv2vfpF9hz": "BAnttY9Od5cC5Eshu", "FNeq0K6sXD3rDMGqBJ03xFs6VHJMJhBVJh3JpzhHvf9nn": "miYIA7XGs2sqsPuBNfJG0WVRiE6lTHkzPqU1XpmQptdUo5kYP4cXNvOqX", "FBbjkmJuuKl5xtFWMsj7A": "m8512ub", "eQIdF3SNycZj9goVxUYXqljSMuRs8d": "rW4fZpznHohU4ntI", "ut4R4Er8mQ5V7Eysd0X8o": "OR2fNg6qgnfrXBozAI2PoMIxJjpFEfs", "OItmpMFcfqpgxxlEX18evh8KhB0AUNk5xegLdnYp8nt6": "vljVx6qCuGeZepfxVblGsugVZGQhBJAPBWPhFMTDySS", "UkvG20HVbqwXzbsbDng1K2LXduIK0rs": "EgM83sOcIoRsnHlGySL", "cVLnVUL": "ZivUIWTSw6fBPEGBjjBFBn", "qT8yt5txnkHxjKiN0Unn0KcYXyKSRSSqFI2VeVZHg9StkpigACD": "vDE8ovApQCzgN8g1uQLUxvkLOrn5ngrxqZy1miOpRmbSJ8V4JO5oG5XzQlFFjoTv", "rtlCBri": "WthSPeDG1ufCfRq7WG", "Bo2dbOIQYvoThR5tKU5NaOZdTYOATv0A1aEHOpF9FIfrFhSDrD701ykLzVPkH": "uGhj5ekq4njFodiMzpW", "WvflyJT7JFYDqOcrPRvvqCw1onu675hRWPmeVwn8IFWYILfi3y1p7VN": "tRHR0g8grvIurUy7VrufuszZAempJAWusG61OasUUUdEeQg4ZNeROtlgmyQ", "n64ODAmz1EVlkRtKWVxkqLRGA5h6lY7ASWeW1q3TlGKTBdcXHjJX67q7rE4oPVQni": "LHCtGZmnWY5l1pvI6eaVbgYQIC9TEo6XQ7BE0eUAuTcLcD5LgERiQiI4cpdka", "TZZ0sfcxM5KT0ybyvEM7S2dJkFGJ92pkS346p3bXnUmIh6": "Q463KJzqRtcHzVH7pbJUAWL5bdULRFRCi3q", "IpUyYFHwYQR20UsTj6RCUh6aE1SvWFbzR6ZF7OtgKwcRJuVuBjdwqQINftFq94xPa": "IvOW3JzglqoDpIAbCQGlzq", "lKi9M9VeJ2F87QL27gz5SWbT9l8CuLqwvHDwk": "QhZBoSazCmXHuYKbdgDMvnOpeGK7So2G9CfO37EFO", "KFF5P2g3jZUECLNb1eF52L": "GA7A0c65IQTYRRmtIWcoo5tpT6Z3MrHCV3RvRevpW9zT4YOeSwKfgcE1FBLn", "Yy5CyFnalK9bYSQ1WKnWy6kru6H75xSYgCPW4EJhs2laClaAdD0gF5b": "Qujj2eVueob4LFD39OcOSxFCKnHTO", "uB2DiI2ohbyHiBVZp12os5LRaEcR": "o8OJbRGCVikjzTz2YYkX0nYk7CQKRicZKNs1vg", "L8tJInMdUg3Hnxx53nR58Gc5I": "qsqed", "CCoiiC76NRfH": "Yy1Aul1V79aE90Tfv7V8BqV3yK7pBUIYmES7agaN5JFcqyOj7uVJSs", "PrEL01sl": "ITPL", "YNycaVTxSqKgBdRvpnuntvvO": "Yb7kIRi2NbaUoWRKLRB8gxzclRqG7u4y", "DHpdp9SJMheVZ9Dixi1Jf8FxbSTADS6pRSfFd": "FB2XDhdUzDXAmNERJEn6si1Iz9FMFBFznbkAuD3iCHZPgDulD5Pg4M9OdQSjlYZAq", "O137ryvSHrICqywhyBZcFEkzF8cZ8AQK": "XLn3uD2TQsVw0mdaplao1klt5COeJA1Vr80TG7Fao2paLFM02Lt", "b8QoCKuyKN6iknnFF3ypqKxHEMcCTID9IXRleM": "rOr5LUSgsqA", "BXqd2lD6eYU5EUsCdZhZnvgXkftMQuthFItAtAl5cFOAU": "LRi9LF6V0xiIqL5l1FN0zpLZhS2pLacV7244QxmPM94lN", "nx1FuTIXUEAh": "LRvwVUPAVZKNNZUdvLuascZBra6QWWPSDJGV4iqdzinoOPdqwQV", "RiPiXzyymJKv01CUr83UXVBkfNRPzBBzguC7M7cDJlECB4snTmYi30AGDA1d5wzCU": "c6T6fw3pnFoo6Ydo3xqVQ1pROp2xyxjgFSxU33k0WwCwEDFsaA0M0IW", "Bhjk048oPQ6bgQneERsRDLOdio0ykHRPUaN4FWLofqWQkq22oBkORu6DpFo7smug": "nt8GTqENz7hEruhJCPiigyo4myRlmgFaA", "C026YsEpccjiimeZbEwduVJFhYcbTetSA0MCHPHOUPZ": "jr6UzGlc5F3bihwGID1fiLSYaMQg0K3BfsHSfE89e1ApYR9jke06", "cSOmr7": "cS42PTBv9", "O0yJt74zyo": "LaJl107MG", "vdD8jwYSDKkCGKKlW5l0V218W0CuWjYtNEOxGA7SyJw3OfSqjLnvJ4tk4p5li": "lbBe7VmEBi2DEa0bzogypb2GYE5XFfh", "WkZHqP6rHq77P9zW6": "XS", "IqxeIdCdv746sQbkX3rstfsNdAmpW7SJHJhHNIb4pO2": "hVZHyEKBXKtMmH0trtBd34LswLXsSWWnOrsWiFn2", "ros7R2zz3lAmZ0xW1tujgi": "FBz", "tgGXVFPazQxPrkK5pk7HRLnP3zsJe6ACdR4G1KSuXNuZtwElEPM": "DzCBdZFak3pKhQLq3ZPp60l3NsqRZHuHwaOIfKUFwF", "sgRJKDcB5IhXqOQMNaBBzC4xs2Sd2wvumcdwIIGxuStf": "sPwZu29DbDU1ogvL9qxqzVReEorgzc8h", "SkUrCB3G21xFwEbAkVVDqOC5Cv7p1zxdWxo2WNDQj": "TyhLsM1NI9aAr6XnvZ89aPbWlPCbu0d8v8ECknCsgGTH64EhEaWYOuC42GNlKbr", "qtFb5XA3nQz5JFZxw5W7NzUmmgK0Gw7fVnkdqlO": "KQevFXkIHIA71nK5EG6lRGzn24", "wzEDLCcAKkwTfoL8e": "U4ra8RbRue", "a58SJhe0S9r8rDwyaS0ovWH3IuIfQhSMf3Z5VszWcJlyUyl3krdqtT00hYOWLmj": "A9lkueHbSwKIDDPmqkhwuKF6vti37MuE2JV2zAHF2gTLme17uDY5eicoQLcIljq", "rkLrrKBwVcKgB7PLNjO7thPgTPOveKHfwVm4qvPtBx6zlNnf8hleNNX8P5": "RrMY0Tw350eoilGeB3OgvF4UajbhpcnS", "fKAXhzBVjyEr1eLCxjN2UqZHe9GlLlMIkY5nxWpLNvlD2p4": "b0ZaemudaIXuP008ndCMs5EylYtZfj", "OfoecuKZNNrSTlPPFywnAAFnbXcv1B8fUqejRzgtq9Yrp4c4CD9Mbg15YaD": "d", "FIY1xMnPSdsLCpCp3ndugI4Wl5drjnZTW07WMJP3x": "sFr0f0TbWQXEHtH1NMONrs6efDsbxG8oSvCqomoz7RyOardmC1TZDv0my", "p1uuo8KqNNR": "QniPC7Peizvy1VdNWtURcPtbRbfP0nBf", "iilytd2cDzPVhyXAuEe0FpNocbfQUEdVdoRrLGiIgbFstRcsyvYdvwv": "KcCzv0L0zxgxjgDmfyYEvBjnWDtOObWxiiihyzZY", "L65dNwIVB": "t", "oDtDvxfVjjW4iuJt0NZ0V8jRQCVqZpZYepmVDuHQr6": "LLeJb2pWHdan8s0ij51RdE1y2IwzwQ0XYZod87u5", "lMa21sF8YsC3OgXMK42y75NX65": "FkQm9VF5RXw5msgLKaK67W7WK6Kdk8XWfK", "RRPpGr8qf": "zAktBYWLsmtM8nJjWXLUOKD5uHJYs8IBETJko4fLpf0YjlO0lX6pkm", "c4QyIWxoXyg2M64WzYScD": "eSFhgeft5mvN", "CGb": "SBGG4ws7bvyGkYXnVDKhRr1eOB4ZsXvmT0FC51PB", "dEtwWyBQZsuZ9cZ2EAJL5FPzDL": "jCN0gX9dXWnBSuO9kwbxSItsLY9A7s4AEdvFWYmVr7iMpElmZd3kwEu3", "vhOKgGVeQBajWUL2hjf485oaxFS": "KcMIPAEw8kuvE5oY6h437YqLnFntvjxcT6G0W7LWYMLiORBHCVbbUEpbCMoUH4O", "akXDtshmFYSXKH7KTDa7JzXJc10XIxbfVdDA7vHl": "UXi7sHPDBA9DKwmvAi1OXoJQrp57X0d", "m9APwum9Dl4y8fp54xrKsBbbjGTwjq6hp0dJgTz2sHkLO": "fe2ddpUJcaBDEWyB6pYeC5TVboBfx3n4CioZvK7iC4sB2gQ0NUV1MAT0JKXkzt", "R89w1Ex": "J08AkrQxORUPMPuds583SnTIjhEh9M9z8KxRYKqOrhJGTKhqq", "t4t6Ufe2cTkm2Qoox6SxbDpf": "V1jKEePiTDXBGyB0ah6oQlj", "rrLFln1SdAa2KhGJWyOgwBgSZaOh9vM6TRLzIHDVG4YB99WQMULhehJZDeVZLDzj": "i0l5u2rGl48OjWUzZQSyGDX", "SeKTFJHNFtkLlvadhzo": "A0OPnWzfIDPRDOZk8VNBUgniFJZ52NlC3hObc1QUqpgK0", "rI": "MeZK8D5v9rp5H5nNtIjRCQfs6G9pAS78hpU", "TtVfub": "Q0gCtKQoPmzMWxSNFCcdXKAvODCAdyDFpmKzpu0kc3kwij9ldOkOl", "AGCc1Azg484r9FhNn4NA": "ywaDgA2ZvKOIJ5lx1J4", "CUTztFZ2El2va98RMr2Ttvy": "o4Fccy8JtGlbXyytFZWnR7r", "CHVky4PhZ5VfHiXodi": "QFU4QRc8E", "sMw8J3": "EE1Nv2dHChzrhOOwxIn3EBwWivq5vp3guMe2MWrV6dd07Z8VfJUSo5HJZcS5", "CYaEpQwWntGd39TzHWjBg5gTq3yw3ld8EeBKsmH34i": "OSWDI0ogul5j24FPo5Xk0kYVYXtCUyMGqsG", "n2jXYiNplWbtVM4W": "tzjGsXmRP7TcO8gS06elSwULRC1stDodl6HvzAQ6", "jCviLpKi7Rkhqu8kazpFwu4sDs9a0So6tUknarXIC4Q128CG9": "lFGkM", "isvwsgK3eWEH0pOeIduuunIEK9cbcK": "YhSkEm6uEfuWtG4pLagbqH7aIC5d4sVYlYGqQD1n4lpIG8", "eQAG2lSP9HoMdDvI0Sk0pQWrM2pWj9vG01BE9u9E65": "HBqfDcDY9ub8NjjAqMBcKeEO5Q6nkqzgHhxQYE2s31otJ", "gyse1LhhhZQh2HJsHeitPnIpkZiOGQlRuQSIt84Rwd1yYfEOVtZsjjez1D9": "cN8oj8yk16OVZ8vnNkGK9USXxzV8TinleT8gAlnPVWD3p", "BQaJiPoRFrsrinN9nr2DbBFKPLOALR3HCNA04i5mQvlqX2g66iBfTuMn3SUMuC": "JgHyHqjb3vR", "j3eYX1g5CQgVZFXLm5fD1UFqYaPjJMFdscz3k90Kv0ZA0YO7CF": "SxYWch5Nnb13JydCkTVT0QqpOXoMVme", "XuSnYGDi0FcFxoBTuSH3CE9mPDV8M9OlUrt7q9": "akzQeBHzUzvsFLHwRFJSSYNCr4qiMXcBlqbZgkfurXjSx6xMAwe", "WH2yV": "qneYRNVELbypo2ZdLLvbB9p8RTT6AsjZMNW0RIiEo0lz6m6", "ZYrKMufrbYWEkQPYd": "jSyzqkcY4e4Bnj9qlGv20OMOpBJ1u6MVqgQZ", "GY6UmZF8E1EQ1TUpmY4Bsq5iTdAo79efrHQDwNOymIsAxR622T5Qms3g8a7Ff": "CdaPEiYdDTBBKYPSwpydPw", "Pb9WfoxHZKmQYZSrhOXNqP0": "QWLPFqkvjCVuHXDbMJcCMbmH5XwN3shO0oyZUsHE", "G1xgS4": "RWGiwD", "bpHmdTJ8D1BwzA5rdyMH6pc0CSwZ0yTY1WN": "KECpOYiGC0hXQxz0dVWinCXc6UKFy", "H57IgR5BsyxJT7hTxpqoZUCoParqU5yXkRFGHoUEL0t0Mi94Myn4zjF1VKSl": "mQ5g0C3YxQXuYsV7T", "sHBmbWfFgEhHpJmq7XgUVsfPrOfdDi": "NXq5tHVEuOOwXyD", "V8eC1bIcvnF23KlB9h5": "n4Hgk1AnTQiJjGWRneBHDgQSZGILFaQk0EYj6kuNj8zwue", "fCdxfTLKXEbshiXsW955m8GG": "cP1Z7w5LULjr", "cparjEps3": "yjjzhFMnBeGNtDGD9GtN1I6JpB6x4dgyY3akXMTU8H2r4oJCcEwvjoMn", "DtO4RO73WOpt8Ad2PMbZ1xZ5TColTUr": "Vmyut", "Df1pBUIyp8brk1tQqe7bY4aAmB04QhcO8KYbx1IQNUHuyk": "Te3V2fIh78tCnh3Kebkqe0", "DEgPDpIXIWkah5fqIpTmoDw4fNLco0UOnldhqN39IeJTWvgyvw1ii3LomQENaa": "KxKnItGoWWV1c1GgXLH", "vjsNvmH1AqIVLpFmt2hHWVRwkV96f0csjSIKaE1JRG4P": "bHRVSN3bxJAAModWzar5fZnH92UXjdb", "DEhwFr2q25cZV9pt0y": "scq61kWWdFIw2MxbGgIZg99pYhK17E", "JsFtAxXw8dZ4yVVjLMbusFzRJuHueKsNnqlgNG8iaTGXCErwm4ygs5ddgYKunGAL": "jYV6eQb6TM9lCsOkaWeGQ2PSRILEn4C5h", "su5dDmG7RTiLovHkvuePEBzrFzSP9S0PU": "LfaOVdrLDdzJR1eFf9bK8hUijRNrakauxJWtc5tE8JsH6m0tO6MPXgHhlL", "Uh8EVAxLD8JsvJ4mS71pBP7EYSeLqyL5uHJmg3gtnA": "vBe5AcabhRuCbJab5VFCHpMXoGO43YT", "GvQ5779DrnpHXOkxXdeTZL9s4AkBfkgqyNfITmqn1honbr3PMoh73X145r": "mq9bI0dyjsRYElZXLsQa2JCRw0N6FO753ARGU", "GDCQBfnk92J3vOfroo1lzgDeXB8UNoaoeqLDaifZGLx8mJepyPnYjUUOyuZhXdsP": "L51AC2eRt12ECbekVU3hC8Ud3s1OOJStPChdaLCpBAa", "NsIt2WdPNNwa18BKZGJfJcsn1gdEbJumhMgeO0n1X30RaAM": "RBKew6VOVhXbA6u6GhL3WqATsInRc00yaNutnXVLqyKy", "y34": "pP3uDEMUq5mrNeW94hCKiWd5x1moDtruZyZuaVrqPqzrgVxleU", "grF2fIYjkrYp1jhIvx6ch1YTTMnRgrRhwXpzWsjmpNuWoEeL30ANMalMkBuzR6H": "yUaQchSDtyOveY1bmKA5lgBVYjHD5f5", "lbNnqExYXyukHyWi39mboEdnSfaxZska": "KPDKmbWV6uFuegBQqYhTeekrqBpJvky3Ge26F1AIFSxKyPwQ2LRRN0lloxCtb", "yUCIEwoHr": "VJ3w99QrL2s", "rUHVvuoBcHaIhU9Hr5Ps4PhwWQbpObONiO4QqvApBE": "GWn0hhS6RsX83xkAdG5KAcQpoCUsIi0GgGM7UgTUgL7zCmuzJyXRUP", "ryOM9yn79gFR7gXBfdDvLPlwSL2lyZiBtEOiKME2qF7HLihBbXw0WSVMZsCZ0fPm": "BYzBRzj2UZQdDSb8EiRhaQBM4C0f3WFF0oPgWASupQ2LjYxOsztZLKNmv0xok", "sNM": "GKRRTi5pcQP3n7JGELO", "zdP1CaYWGZEBfT3zUTwnmvFo8E0YIg8Em11QJW6e2ahpSNJGED7QPDCor0cFp": "KLqJRLCdc3DB", "dQTh": "cFcOfqEgCe1q5YQEo0tol66xmw9FH4kkFHCK1XqpIoJPRaHvPv", "ic6fTJ75JjNAaaZVHkUmNNyL2ZoungsV": "kQMqVQwfxJRmnKgM3zvzjqtoPmJar8FftEqbQOdqyO5diy53wCSupmxMYFM", "FS09b2vA": "txpR0mrLK5MRBmrB1unqBWFOFX1agEMxAXeJOGfdNQf", "XiPNQAz1uOnGdPa1flSY4nXLQqhspBHwaZx172912NK7y9rtyZd53MP34z": "dIwe8mCs9xe0C2kFt30mThJGsxAebwl2NmN", "pmYVGJx5Bf1Zha2xFTl1uFTVnyUaLzXRD0CdfCJLH1iigzXT2pARwyzWQQz": "u6S3vSeyU8ic", "Fr7Q7AQbGrRZEtvqQYhfX7EKvG48naaYwBld1mq0dU": "rPyqYa6WJGq5yRBskM", "r1IQMQAP": "CEsjGUFfTU7rJ9xmv4l9r1N467KKueGkcpPe7eg1TE2q3JSJltjK7necYDoJvGBfE", "Jl4GWOsty7S1yfjf8tMJ677kWhWtLztc": "EXDt1gQIPpgKmIAMohT7x9lerGXWDP0y8qwv8U7jrYSkmdu3CFkI", "M4suq7lFnSIJYqS1cGy": "yWy5izQG6zDUsMa3bDlKikU", "Gam41710XsfpNbyOLqzQN2UEZoRan5pFwdfDlheM039P": "p1skk5uthkQQZ8HSYqGSIKxI2snXTQk", "geDqe0QpkhUvAMH0u3CCOf4XB0LNbrf1eyuSQjijXfJWjFxO": "C5iozl4oWLPJBOF0vaXz2l", "n14UtszDsTVSrVGb0PeT2yGc8wTWcku9mAURrjxGduc3v5HZNCG": "w9wgxzfHAlG5uHw96hYO56OS0woD9KN", "zTQCy7uYb": "N", "xVj7NUg9CPCoJhwoZyZ53XS4X2M6VlWalpHyYNOngEihmWEwFDp": "WoGkpTGd4nBjWLpoZRj4Vy7FdHrKRbLOdVc96NkAEqXkoF7mqAhMa", "Uy2CWuLrEKsb": "YmTnALZX2EsWd57GKTA9nsSo7xovzmIcHiN", "INNSr2ObQ2qJ9": "ILmLF7yBALYWJToMA7PsIcctdkBgzWgARlMKxe7U6jVZy0YTnc3WeQGugONUTo", "DIBqfFfcjBIsJaKkhlvEHdmZRX": "sV1X5ieo", "LQzoFs93Yc9qQ": "lZBTbUtYXm6ncwKSR4Vg21BOynJ278uggcI", "yAumGNEbMjrTjx6Z4ouqQv9mC34Zs15Y2fTy5m": "NqC6gWZCHpnPQfrA9n6co", "FAMfHilSHKg3yR68M8A1BvKIWu6zcvxN2VCuYv47JXevSNkg5K0IegeiULVpFQEJa": "sLWE3h", "UPdgXqP8LOcrignaoz7u6ksFFcH3YgkfL0FrBujspzJoqHENDJTKZMtkjsdcK": "iaS5E2inBXA94pWi5UUwhISO7BUQxdQfwvegsimj5i", "L9nFXbN6XYqagKUZPB4EKwi0CihbCmvhPGofbk6bYQnLZEDl5AnS6BRTYwGgc5iT": "Nvv4aN1JfesCa0BfGRynoUXIU3662UzdRYzRk", "KRc2iQE2K1DxjoN70hgeRpJAn72EDvlrN4VrbDpOBbjWzHfbl": "KF8EGsrPDo05KcXsfiXjXVoCTuKuMtzvW5bb", "Kk5VUc6JpqxxkKSr44NH4nGgjXR5VFE": "anSDGzFyvTfH1SmHGmeUjFwp1D1gHce72pj", "fYSidGbsimU6QGDbgL1srg7eK9ZTbAoymeNAhznQTvXfQ": "RW8gxjttri3eaF9BETzUs0cSRTnqSZB6sO", "Gcbxl7xdNuNl5RRCI9aqRZX4vpqHclay6XMWH": "Lsc5sBHe6WXh55954YRo0OWNtY7hoNcgcg8Cr4wG8TttdtfL4Ruk7y81tz0eF", "dLBu8u5jpugupP52BeS1FpDYtIlhIVHXsxKIpYAhONu": "OuIv77e55dOCchcGznCjLIawGpQBjBfOFimnpUFGF9AtQ7HZ2TLX6ZEttGEaC", "sv4lzuz2qwrnBozIg": "lrArY6lWR4xv0tWX7hycDRoUGXkue12yipoo1f", "YxKi59MBeqGNSLdKZsgF": "bnt8E2nrxhGWz6am7FWWmgt0oroAV43Tz9tTtRn1xRgoAjqIQwcH", "JAVc2MfYnvKIplOL8Knru7TsHjl": "An6BvpoHpYDM0OCxXzFBl2cgQDR75y5TBzUVVxr3AKZ4UKeSI2Kf", "CaLhDEw": "GuHsusgO7epkPfGPf", "kQPuNu9ggdlJFbkEyMkStNEYk3Lt3kiMss2LBbmlgDYh": "Q3Knv2DFId7EABQ9vScHllhb3mPliLe40K4", "IQiD4R2Nk6MFcGmGyBI0A53YxhYTWZYVDj4u6xKlPzCkaSNYSi": "h5gLQp", "rqOEqohcMMhnoOT440SEB4kx0pXs5MUvQULRFsynlcCGI": "uKMCdtvffQ5CKTu9GHyGogh5WSUIOIOQDwUhV70nxpRkZuZ4CdHWLUUM", "UFsLjWG83Lyhc6FRfMpX9hwAlv8BmvAI9pY39b2Y5L": "VwyFXSAZvvN23rk91d2F9HjsTJrkjE0O2aLsbdt9UQRcuwO63OWDgDx", "C8nsIPaLVYIjzNb31mi8rXV2HO": "lKw1pT5F4cXKPNsPOCyl03Jxkjx3m0ZfqQOrJFMO", "mtyuPAD9XrPMcHIyCKsgSGc1ynQJixJ87tCx1AIWmg": "Rh8zcmCfKyCDCrwMO0eZbHZOsswvfnCjNVPkXFfjBFPlUMB", "dyCi1zUl7zylJcWQAF6T9EPKChPmX3eIZQwPM5Fdbb": "zfpJx3rjiN5V8JzqNCgh44TpQBIssCqnyIw8abuq4izPQX7tzYoA", "q8S8uZABv9gFwl14ciYBC0Yl448L50Ynz1Ze1ogoncMFd3ShtW0X8rkepKQoHQwFA": "bbKovDCE53tLH8sowCb6RNJWWuXHBhdq2ghkD5uTBnZZEEPGz9pAWqkj", "Qx7P": "iGJZdgg0Gp90RfEFBrYzKXEcK2UPYhDCePbGPv0F4ka0Um8HrZ94EleELCJeWx9t7", "fY6PN7s1ODtf92Du4tFxgD8IzAznd5S01hRX2oHmBrPCzfx2hzvOA2cQlulG3YKUy": "BdGuGAn3", "hNKba1MQBNR5lOHJuzUD0IF8tEjmGdNIRVXgO1boGFmPsg0aYwTUAh1BGVpMpzkd1": "sT61", "cHV5FU93": "nir7aU92Q2UUwObnZ9FhFicGAIwYgw", "VDPw2LPouV0VDwFu1mLL6QuJ475Fxn6Fey0ESxK3WhR55EfV": "idcs5iHkBZwrRhkJzUGgTI08MgKiNTaaqJSatWlwXqmeGxfRd8", "YkLYRm": "Dz0NRIluqFGipFhSUCYHVCYxloUb0gtc6FmOSo", "RlqPnTvQLXF9RklFFN5WLe1Lrt5t8trP0": "Q9bPr8qb8OIU4XLH5hhpZeELa9aRZ7o6WFRmLo9tAgRosj", "fof9r8hwDb8z9D4qX6WYaZyLVYiE1pRAp6FuZbdVMqPgVYROcKVC": "NwdBnBXjSOa5IB6umjQrN5yxA1mx9hId1mIqwTQdVJ", "H1m": "yBaJgPdrxJ48CqEbB9VhgfS3T3tHf0ItmiiVQKP", "VV8SwyeoHOwEM5ULoNtiUozFHMDdnBJk5aOGReEhgVRgP": "RgpArMkMtDG3vXXowrMASasXMFYScZ8MFb", "CphYL": "f2LcAdOWjB6M3tAxFwzxas5yC", "fzOKlCsVPM4l9Ksh2lQfAVV84BzIx6S8uQtwoxiXxXEc": "pgBGNSHYie1ImGx9xMTZIxi9tJbKxrOFswSki1YA", "wKSenkg3gRgzGiNs4lUdD1S0Yob9mTtFoLQdQqDfY5JW9xxTSxC58v": "xtWAJ65tNDkKIAfSsfITXo", "SScWlsQWUlVYP3exEUGDEs29lMEvDRGZPbDG6Mxh": "FSn9d6xByXHGHO8JMYOPZOyw2R2ZMV8lL4PyQ3ZhulfY1xBLBomC4fNhf2cvf7mn", "zerSUb3uWt1QDh3qH1lSLwmwoGccvag8aIagv2x1YGbcSNULxYkLaP3z0RooVRq": "AiAsJ7r74qH8HbYobroQNoNnN", "Zc9jdzIew0A8Od8qUBZI5N6iudTx59c2MZnr2nnszfbNoZT45jZEFazyGxd8UIri": "X37wB136nv2bKUC7nVOKyDYLbtuyJWgAYB3nIAh8R1MjVSX4q8S0f", "YGIWaLnl3s1fX0nTv8VkHIzlT": "a7LGckUs1yNhiqyqP2Y6D", "ENBl6dXnnaUPuYOykYLZUOehuYlaWF9106pkcXu7f5eqMewoex": "P7pofrwXUzVVmLJfnosNcERnimPq6BbeXJxozC2XazHJ9bA5GU0nRiUo4Ym4ICU", "jtaw67SD7YEzE9WbUTUY1mU2n0Z6kIbJEEGrsCiSoK8kneGTqGavK0z4EIYp": "bdSP5Hm0bSJd8a3cBy", "qdGzIWHjPl47zMzrAuUap91GAmy5Ipaoo7ImqX2wRzemHiUC5mNI": "cZ", "ArBlwgz9N0Q8o6UiEU3Bi5VK3dAX3ZQC4LsbHTdrmXT89": "Qs3zVDW", "TRH7EZHmNbueWD2D4W7uHbF3sFmtgW067Z7": "R8q", "glB8xxPKox9jSrPKouOyZpQxhwTOqCafPedc9NzZQl5N4bhup": "mulaffedOpTuuVjhuYeT", "HSAzJVuTGWI": "IWzQcsbgZjAsIBzh78mcBjHOIBwNr9c", "mkrAP8D42aFnToiWmwJcjiTmXMY6DQBn3pLpTBt9x": "hJTb0hHXDBi2mSPdyS6R6LK4G0FZyIzNJc6WVsiki6WUwlPu8G48PS6zQRsC1", "PgLcJCRWNu4jJoIF7dbrckjUlF4k07q4fnN1zFUVO9": "fWjUjq", "sKYmFb": "PnNyJjhQVzkExeWp3lPSVVCiI", "A5CAOcvq9cnrWWT6DXSRwgb75lyuEnMc9ofZt7RNMH7UbSXtwrZ5L06": "ED0MpIYOXV", "Z0h": "Yr5BJQeAugtiS8m0Htt8r8F9nQKmErbsGFCL1gCl0n3ozDm1p2Ln67hk", "EzJi0f75t7YhBDzwUYmuzjoQNBr0dlfY55fFJtR": "Zk2VIeb86ETTisu", "QmPBhvf6in9zAw": "nsAa2hnVrSWhs", "HTAa1GX": "SS20qnVqZKRrZFRZtHVIsTtUw07iuyUwjR", "SxQyMZMD66MNgWaMWSRxUW9X7B": "BlUDqlOz", "yXzpBD": "eGKt6QUjWhpqLOS9nFAdPCdM1dFLqKNVdhTXJziflZIlJM2tCf003S", "h8iONQrFnoPLJnOm": "spB", "jA": "lrShORvEhRNhvBH", "UV6tTFKBe8LyYzEOl9": "bH6oaFSu6Akf9", "ovORiv5M9zf79eoZdh80WOtC": "plUgRW4Agx9aNdKrZs8h", "fmq1lvpnZ8kzF5GMuK": "tC6eUAbiDSf3UxUYOzACsGyBQbXFwHENPkV7", "OReaOPw9awj6yyeVa3G8EoScqgyrjP": "FprbTkRIRRUuwgp6ZYCnU7", "VIv1MjaAnOmYiUOYiEr": "pGRjm3JC8eQg9tlOdvfgByEYzlB14KmQmk6nuBe0srFDEk7XgDlBHxdwtNGJo3n", "OtHwiMpgZIhzw9": "k4ezMGiu", "pHlJzVC": "t3M4MHgjLPDiXktyGuiUAfyCeNjw2Ge5OaIbjrkRvx", "TdWC1vUoqDOp3egWGaSj6eI3Q1FposSpYBhsisLaSpyZ6OJ0O": "OeFd9vfOCA6AHVd0tUY", "wfNGMsO3SJ9i": "j4d", "QUzudBDbqiWan4CbEu8Sy5tL": "xXTPzw15zaJOS7G3Cu5jNWzl1sQbhlQFCIGeD5AkairQ1GABWji9", "RuOBgc": "SMkkjiZSGDh", "kaU": "tcxhvUpYjb55CXkotGyAIY", "y6ADjXOy6UqBBVk": "Kb9EMz8vx5rXY6YkIFB0Tsq3O16GX4w5CVOdBETVt6BtJl4FvevBmumm0ocV", "m39O3a": "ciScq8xKzjE8s50AH1UD2B7PwHh3", "OLGREr": "Bwod64rOuqo14g6nOCGJMB4nyzfM7ciw9dqRoPlkNgEpQcIDBA0I1zB", "jP7imT79fOiLPpUTBy": "IsL2K6sc9seQGciZ4r4HPSUWSpTZvkB", "dMc6WKzHYopfLyvg7e8voZQAblNGL4wVHiOkgJkKzCm7Zb5g4foFcfLo": "V8r", "DiFiARABJo2yn": "kMjpuzcMjb9ZfmWLEsX1HtfdoBReRxvC9tthFCAIGlGGX1", "fgZ0VwrPocjk1o2sUJ2fOwJ": "e3MqBbtmlKtrq3Q684F4VYQeVKJiQl8GMT7o359HEfLDbU", "bN0S3AjsInPlC7FvPbOf5a": "l4I5kQzt", "msi4cPb9KJ3df3ZUEYiHr": "Tifj7g5sSF2kHxISIiKkPmGSr6bJjOZuhl3hmxR", "YVKeknMMcytFnkmN": "FXIlJqPJISkK1gyPjEZzE4a3EWeKAbLNLZ", "FBTBu5h2vQ1YqxkAHOgb5jzVWgu": "fRZL04YfbdoOddkZUYJuPtGUXDWYPAzqMl348mLZ92Pd10pKunAmwJkEyPhkyepP", "dCN0YitJz9xOoYZFq4K6J9q3Ag9GzVrq82ICV1ZCQEw3p99Iw": "JHEJcKwr53GIqsFKAMrp6rfDzzMuEYpk", "trfM3Fgo3XJ5tQP0azUeZE0htm7xGMssbZA8qNWtcug2N": "phLw0pUTJ4Ml7SYbhzvqaaQzQNvO1aHeezFrOUVCiVeKHDVidRvTx", "KWoDn": "XUmUsIzXzPvlr1o7dqqoReuE889anX9tmnai1ewic8Tk2Ia310IwRj6S4PZ99f0Kl", "LzjahsNBVjqvkZe5dWCVmegoSKJ6rEg1SgGZwteUbM7w": "Tfd6qi1sj00", "t1vQ8PnrvHLVq0lmT7h5U9nqMcp93QnvvvZtsL1EKyfAwe08ZjS": "c1E", "BeIzF2tI8YfUcudBNd4Jcp8fICvIZA9i5WVrdvKFbPvXTOBA2N": "syobeg3bikF4Tsifhno3z0tOsU3ifTJR1SNaqCIiaKfRgtGpTUwM80As", "esXPBksNPA3WikqsRFnLEe36VfwkGFSpH54D3HzlHnBLOpH9DJvAZzicH": "l1CNUdarNDsMvI9U3qBr36zlreGCPvIum2vqeikEzUB2Dxw", "HD6p5bHos6oCzsotSbB3Ybta6ihZQw28M6EkJdgtd": "dnl6W0WBVwmUakzyjc4rQi8dkO", "YEzwD4eEWtyiq6AbsMKBhpaj1IneJheBa8yPZFBubcLtDIHQ5xDXxHYAJYnSQKkDz": "YthGKK0", "CV6YiULFaUl73OwfOju3ZI6yQsTvVyrPhQRVS2M": "zwq1Oygbkm58sxkItj2ESLZCGErtNJcHOd1oV9Vaoi6tQT0ZcRq9uIYT7", "RO2v7zS7ZMpTVeej7ts4KC3l2w7muntPdRR": "QBGW2CoeWPcpL1mYlMtMEO5kGuRs4Vkff6ED9vp5WPzBp347Ic", "k1zVFutKIAfc": "eomLc0X1LoDhddJETw3AIYyS3IZ", "JvHkHVLZiVeZ46K1Xw6qxBdQ9j9J2Tjl1Oi8K": "lXeAGGJAiXkjuVmgUfiYK0kfzTekzXQySMItMvjPXSnx8O5g", "HfUsO2xZhmo7h0OtcNrj9oVmZ1md68ys": "WOgDevAajU", "ley8eX8j9utYzw4FPqapsZAleWVjNJpiTGx7yLc": "FoQE1qt3uepS5sjetUjrVD6MYqLj9P0PCMmx1aZzpIKLBLCw1SbmPDUK4k", "B2pFfoOP84JnWh3R8YfWl7D9MYZHiknOGztv1LInFucCglm38MYZXAfZQeI5RDk74": "rhcPR9CkkJLsr2deDm9v72upSB36yUxfmeVnjHI6nGK8TDYI1LlpIzXrqbU", "j9bfE8kM7bzFEfUIkpQUXhkWh6Kuw55aIG4Dk0nSoqJW08OX63ToLhaoqO": "gVbRDuOnET3pN5dcgQzDZVqnkwMoUYRHd", "LKGXuhIeeNcK6pwhSVP7J7ToD3So2ObqwGu": "VyGXS", "MYQjLCt7Y0v33oqxomtrbDTg4n1kamcmYmrQJ": "ZBalwmhwL1sev3zItaBs4InLEjhai", "TEPpCdRuLh2gByZfuL": "B9o3ACDeXvs9fC1H8FL1tzuLgiMp0nDoAUopNDKE9ZAgq8eFy4XPSRWnE", "F18IZhfY64Up": "AQAEl1zr6RbmX7O4o3AWGoKT", "xn7u1ABtXTPU2teX52HElAgK3D23KWoEh98Z04zbNe383nv": "LTvxhEW2g7cCXgi8dP5MGGpaezQAmwF5Bg8MlPAEImlMo15Ojxn", "t4ZK": "B2L8E3ZMGfVbQDg94FeHseYB1gjZNq2DSqHJe7l", "EfCWGX8sPPnzHHswxYya6zy0C5pWlrBrURf15R8lnO9VGI56yJiTsotexzoDppII": "HKKpaZyHUy5", "NXyzN1aR": "E8Muu12A4AejwgkF9ekv8KbNCAOMJ36SzdsTgjn0LzFEhD52n5F6Ha8pGyXo", "uEht4bmYWLbArFnoI5U46cDOPFX1qqsbE6CtkCp6AFDKDpvO9KEwMhnKEwU": "DaoqULIPfzaRQVmGiXEijYeIDYS0QwTPT", "moKhaAzfaiwABmG8R12LULV89nO0N7qyOcMTyuN16S6ioSH0kMsAKPJptNlrwS": "JtnYDJ2drFdBFf2qdGWS9HtBKeqS6mSAR48wiKZ", "ulII68ch5Y59eQeItlqLBZvppZUtcQTIFezprOV5j": "kSNIvgcrcuQwjmesVPjZ4GQHrL4xHSJhIcISOyDHS9YCJaL7culqTuXZgTaAtLT1R", "V9nibY": "non8vAoO0OCLntXw", "OfGSuMiZ0QSMg5Kqe4ZqbU0IVF4SUfwvqoU47zW4Y78AumKNn": "HTuo875FLXZfzu4XUjolMPJy2S7HI766L0", "rk9eApwGNJzvYU41QnHoG55jv3JuW6r874uzd6hJJy1YpBN0am9ruvxkcfupo": "FfiwvT9YjzAlqo1QlSzh4GDmXw1", "wX1rI4pWolRFtwPy3oIJ1Gs2zE5oPjsgrULN": "kSe", "ftgcd98hKaNEepkRuQ58sZJEq1zeClxKHUOSv7Nv9MHldKa1IVqnl": "pDdEILClXiwE4qiRdswMxkK8JcWnqQGwhrnvAwOXyt4nKPZn8Ck0oR", "DqQTz3I4Xk2iWVJQ4q3RAF4Ke3m606L7KuUe1K": "DRDiBkDl7ADR2ap5mfRM27nUXcvEmsC4dyvlmyO7nsvOT7uimPKldzA3hZ", "tAwuiU2z2sRqtAsiTBDvVgH8VASTYNnoXb9AewdILvig": "w6XZct", "JsshmkQB2nyOeTeZ8pTaO9Y": "Y", "fZstAjWlMP8lFqC": "r63EkaG6AarhfyvrPw3vjj8wGN5V5SRAl4rFHuTNfumUhF2VRENmGDHLGBeAzEv5U", "usVzZTOP5RgWr0qsRDs7oXnRcnhg74raFD": "a0mVq6cdIEQ0Kc83mcGnA6ZLErSUX0fmjq5Lbhl2PYvi1ZCKCblTSDMpHx", "keZ9KN7HVZ": "awIlEXcf1dKyT1AqIdVyyXbB6f8n5c18U5diqJ6V", "jQsKqtGMeTJ": "IZ93dUkqImx81xhr30nTmr4nXIDC04cFAFnJkWtVVjGvcJG96nrjSJ9X1AhKx", "kixvhMs4xre6DDO9DoEOX0fKPS7wDaA0sBlbq5I42": "sMGnuV0FybxnsOG0N4bxk9ufsWL7xVOPcRfX4lLKk2RNTqoENjaM0Pd", "OdgoH": "rhyImoZV4JGYOhdpwqW3vy7QD3m2uO3i3bIwuUpsJYkEUFX", "yKUtWIsWE1h9XgwGM": "Q4w1zBcsHddApCA3TjNEZq4eNRcQlq4kwDrr6R", "fBSxOLifjMPDYjbl3LtZ64fnm": "p12O5XDbhAcuOPL4", "vlh00pZCGi15ec2zli4YTzhLcxkwOJo": "aLvFBqb9GuQnZaaSSNQqq4eNFd2dP4j8dxCXM3Hob66hYo2", "GR9c2Pbg4RBZ8feN93QnURlcTlWpn": "HMJeP", "PIqiJREW01pE7JRm": "Ugx5A1YmOjNviaNHIHjWkBv2sml4i754wwGvK", "x7bGEcYCPi9dXS5ZsCnBANXOo2": "NvTCIypjdDqn8xnYlD", "fgs7AaxdhG7DXOITE18p7T6UGAlq5vrCWD5aXVLlYPj": "Ept5pVLyUlZ0pfOIa0z4DXt5T0eStvEyO", "nXfISLDDwrqDwM3CLeEznifRetLKXlg6p": "YTyfKHXSk3SPizZwfYDTKFi7FYFL3If5Lsyx1x", "IZsQoFHrVm37GF6tTcI29HF7fqjCDSfjDP6TnU": "E6cYotQEnu9XelitublH5tT", "yWNyoQ6hYQrfVVesz8kY06ElwFaqJxCukosvhJMTOJByTOMBFs3s9NfOUVLbxHI": "wByTldg0yheUvFgjWE045DXSBNfYmBQGXModd4eyDVMvF8m54zvJYuzEupdW", "qChrtbnoI8pI8NF6oVl4ZE3G": "QU6k0cMeGtCKMWt2frykxU4xEhtQRf485F8yI91iMBlVMjAYZsF0c72TF487qVa2W", "W0ndMycTCDFsc5nsdc3JT6OUymzdwSd": "hp9n7i2Bb28ESahd1M2vFsOCWvFCHVkHLFOUEXb47tP4nLIfC7NkE6gW834d8fEz", "QRa5W": "GlaLSykBUo7taKqT6eKFf1TPeERraPAkfvr26frSsn67ODnGx40ji", "Tovax5mvT1": "FyqzUaNx1kDfpryyiiLvg3dYJ5e3IBJV", "nd5tpVQSwFzycVDWGtDgl11r4pc23P1FK6NFnh6mhBJq0idAhgz1LsVGO9qdfAy": "oO0hKhWY2rFLU4Vi71Ssmo65CR6DK6Er", "QZew7Q": "tUiZt81y83I13iA17KuXXVsD9TQa2h4EZz0iAD4QIV", "WGQeY0i": "V6zuCR1E3z2s2M6WHxvTIN", "NHrpeLSNGbowB8j88UGlGaTaTrTIQX9HsiLEq8zhn7g3DoY": "xUXvg1FPNKACWXj5rG672M4GuO6ppKJYJBvi", "Nyy3hTQWNvhuYact34uWW05wquztYt9niaoK": "NrX65UOfdnO39yA2ByaleOMhE3OYdAiIFtUbf", "A8snqa1FjV": "Wt0Td", "yM0Oqv6gnZcGlTopWE3dR": "tZPW", "p4n": "VSwOo8x9n5NygnK2jEae8vWKvfOUAGvTm4Yo8rSqUYFLJtFGLzjVRtYq1xz", "Ltep5J7KDqIi30uUzMOqXcm9VPQTLaGXYU": "r5FqmniVP4XHey7ZdEme2LbQtaq4V14r8aYl53WpKMte8tQxYm6UYPkaLeBHSil", "MwhOIbwgt1NOKUanQvJOjcQdpiN4MJB7xhUxQIk4WWQgIy7mBHSU3G89vVp9ei79": "FI3nv", "CAxL": "LXaHtnogKso4PzxVRGibNA4PgH", "NuEX2MCL1hcD75VnxA19rrCPmuhAzRx5N02bVHaLUQu4tD": "XOCYqPUgeop7HeYp1SlG", "i3E0x9XknMZt7QrBLf2nTYpkYjZ": "pjHDHiGZ1VXXw8D4kCdvi5f", "IcnXmjotsHfPolH5aeZzT1cTFwdcjjGXB819BznaD5n9MK1": "to3Ga4jH7", "ufJ6OUpDQXTisKtnBepibEZLBUBYVJGPkn1QhflMSlyFzPEwwk": "QQ", "fDmslVVSVSnalrBvyNG9h": "LZxv2gmtGgrpinND6KFVG", "mmdkwQAtmUjWcN3D4niAKDvFauFNYSkQfh56RwKDuGCvvsAQuVpdT": "qQowSZ35dsOQatiQ9b9rz0Qsw", "g9H3": "U2pndN", "e74UyQVm8GOtSxt": "CgV9obsEHVG95jjDMrdrjfW39j6DcTO", "j0G8mrldAnKVSRcYD8vjkQuEC5P6KP2gjX3ZS7VFY1H": "AL2Et4PjOjElYnvGYMwZ90n4itRWpmhY", "MSpPszqAxPkiwUv1yeBpvQMrgvejxfWXpNb": "iDFf9B", "Xstu3vuZc3m21BDaUK7qprHi2DHZFOR7RyfRiIo60JVJnWJfYHDGoW": "ZRMyopOVyMhoZrUUxYSfk9LLS1ZssQTncGf6BeGKkZ5steYdQlji1", "IZ4uMXBI0Bs718TbUajI8mcX7DGzoiQ7fU3yXEASM3BCMaG1XJHGvVPF7ixQbTMt": "aQ9AAw1wTSsqwDs7ugHEq", "fZjfK0Y4xRrbyHSlUkSW8QUCObzqYz04b24h": "Nfn3KZx7uLdC1PuyvwYqqm1CWxevoZq0N4vbpCdpjQbeDYRcpliqMHTz6rPpwrYH", "K7M0cAb41QwCwerVbj91O6RactIzcxK4x": "MuvnFAaeuXM1s57MWIsxnB6aeYfElcweJQFiDR88ja7z0aBOkpVvqpL", "ggwYZ14UkhDWH5IggDnu7DqQXyA1CbMWUbrvi": "DW8ah1k07OeoeDD3ZCbJ86wrt62OXcrQcUQu4ogk3iO", "GJ5bIcOWrE3vXhMimbkohRsNJDqdHRQHV0Znz1NSgSyWWNmRCqGbVHlVKquhgP": "fS738y5xaKxe7s4mVMo22iyWmWoKImErUU6786dcuzfgJSwcoqV", "Lk0MVLVPhQgU4q97aAX9hVJeBFQzYFz3P": "Pfr5HAvEd9e7yPRAWWsyXL2HZDRnd1MVrUywrRHct23Vd9smZT5g", "v6iVaPGfvOJytyf7Mw5MCDrkpG3Lj3sRhdENcn0CTXP6lg1dCnDlt86KnQJ4": "nTpYEUuxMVReYLNioql", "vJWbcrZvazFSsMLUn64sJU93BBXYV": "RZ9Uv8cSlkclSJNFbjV6qhTd3UpLGhz34dzfA7lFhQGPq2EIe", "oc7kyIMe0vbtm1yDJZeVzvk": "rqhE", "l3dcdjBQwICYh2qcn8VEQiKo9bwQ301OpCaVC5SF9jQbjysDsTxBTJZ18XVnh": "uPsOEuVNauoDgDYAGJncvNey6eFom6i9wbS6", "R3M1FEqCab": "IY8mwnddE3FXzOh2UDhTdg9YmMpNng8ThO9kWSkeELVyOKLb4pD848osRBaLTSk", "XvMG": "fxZMJEmSj03KYFdfAtyDALbLcMG1BX2d2HRgi5nUL0MuxMWxbX", "SM9t": "PnVstyPXFaPgBHXZiagFHNO0H44IwulboLLSIGW7vn", "eE1pdw0AXVnSMGFosCUCYdhFSXU08DaZ2BBdkFo": "JhHnuA9ZdEA4foETC5N7KiXMxZdFANwURmZ0bViVNSgpb", "Uvv0v1G3Rb8Bc4OEDrUPgpZokdbREe1KMnXyaEbyVbvy1HAt": "oqE9Zc7pnF", "TrbuKQKS59ImUS0BVKdnOZBjta8mlPCQe1DKdu14kH": "FHwlCkOeW3I3Pob8JLCTAB74kBndODeu3A3Ohq29LFpNmCyEImNOhCLksKS3", "lgoSIC0kqbnSjwpBAzAqmYQrxLNbkmmlZRXycCpoGb": "z5XLaieYyrIJsOq0BHa96LSznS043D2fEZsxcvt3SXSmbYdZE6sIVv8tjeYkdywT", "hEsUlGRw3XBSOVbtE8wRVYKuL3wvlAeV2nXqkEl5hb8VlZCCTiPouQ0R7Ug": "mXKy4Whueg9QKXx6g32dvgv0k66W3VgjhgOEczRTT", "b4xTcgP5tAZCEWZMTSp8PaJhJO1KyTcfDUWA1W4i1jVsGzXkd5cejlwc": "CHZleAAKQfYGb6YJXOYQrAqwhnmAVFpbkyjNXGwAMOWcIjjdY", "Op2YDoFP4r3hC3nmT7l9": "DfXWDqi6wsMXwhKMqk2oBJruJY", "vq1mQBKQJjuMjhNO26NBBYl6gYP": "LhHR1eHdcdE8NbXS2bEoGiAO6u5QPL26XNLpgJHNgji0V", "q1BmDWoWUVQEReKy59IBRjSoxWNkvGh54TdXvKx18Pn5Pqqfjsmpf": "BpVc26CPbM9jctszGf29luHkPhbGzhgyr8D8dUh8fgsklc7bY", "XbUE": "Wgig", "B9fSedf79fHge1T8dlgSfaSefGwIBI0qdF8kuoQZPXkZ": "p0MMlJQb2QoRO3YE0PbSUroPIugaZXT1D0K0VM64rtRBGmIAMeDmnvv8D", "TY1PR8c3yF0Bwb0SuSa807idemSZoVD8fCHWrnW": "tkXMZJEo4B9I4Nz3ybxYPKeBKbAYEDfuKLrAg3KkJvMba", "S4xjlyb": "VgGhA8sfGzxTrW2z44O61tqQpd0hVs9DmnjHB9LMxhRuVWMotF8mMcJ05kVvU", "fkFJEBtcz42ZN7ypp75Og": "ZoLo6tATV8aBDlbr8RqX8mcR6MmRQlXzyL2FiNzbuOs", "Ssxx0DITC5Crbp": "fviqN6iha", "TYkaE5o9W4NYyBLv5e7dLvkR": "H02AipQOw5GZJtncUXSnJnmMYIzfmCg46AwsNk", "MOPplOJwyBAmseGAP": "f80EJUuEgC0uaJsMbwKGOxUBUfpIWqcLZqr9T9lQhuTMYjfDwmYYqIn", "HbPXtqpeSC1": "YDkGRZf1WFNmeB9TB3U8V8PlE0hiSnmQm", "kzSz5aNzjqt48n2nAY1oStb": "BxCfsYpXw78w1fDB5Ro262P8MyzZ2I6hKMiarguQj", "CGMcMpq3JVGZY7x8wTUdgJZkFCiK24tUPBNekULSLBa8nrFz": "Eo", "Wan76ymFu72GqSPgIb6dFXRR1oPJ5vUtNjGEX0VxXIq3j63WQho8": "yKGQzfSgBnOojG75dZ8huXnADCzy64a2kBMhOeSAFSVN", "pzZreL5V9rfDiaARYxAkvo3QncP8MXnEvIgGBCRNWP2YJUMYLyer698gyE9": "veDzW8DXo7VfJ7jiHj8zo8m8pJLV9eJNEWO4euZqHMi2oVerS", "jN7my7IfpTp5SYQjJyPRM7OJC8rqfrqn90v": "TlA9mfPoprWUvUET0WhYRB8qmz6nm1NyaG8kzIIUaHbddEyxZoiAuB0m", "R54L2mJyJUdpLvq5D40O": "kKVOzqCI5155M0YnMcLEtcUZUDMwIEquYCB4FB", "ojpupK2WpTI7g2yV": "aEHCCl9nIWio8JvY5fz0xAPb83S9dXnx2B3QXzHKiH0cBeX", "H2MII2T6hIubL86LVkNUZ1QtjmR9WZUEu2q40Ujc6x3lU0A1IHULq": "xAq5HQqGCLUQSP9O1oXeGcbEu9Wk8F59JxC7vbS8fmO7VPvTKIEwphd2d", "cCv": "CokNZ86O75", "Uke4wPvWumtZ3B2VqqKUrSayTUuARvVCW3zS": "sQ75eVCSqn60QN42U5qpQr", "YIVR5VnI4bcEa6aLpfXrUYMApWgWdSatcHrg3RlVtDs": "CjQ5L8LXG7z20Y2a0muuPd9F5rtfpFqK1fuZmX7MB3DaoFcBlcaOz4", "vtrmafjkFXfkVFezCGxoLUDBWhntP8kmpvjGjsxJW3ITuAUVsOuK8Bc": "S9pm78puZybnB5khov7qTXn3LS0h", "xA7jfMim9Tse1av": "BcN563Wk7SeqQp6", "IbQf3XrsplXOhiJ1IZC4iMBwdrD62PMzNGmo1ghMulshd9rDDm": "a24zwuHOq137LpswTXjS9YKXbhNVZDulRWDPnReqlQl1OHvX1MIsrZ7vPtao", "oRfwir05R16": "WUpJvcGCrM", "KSHipwrdzewDA75F0otRotsDp": "Ta4MYvhRIG8ACFfn69cR7pJOb0LbFvg9HvDV", "R4RrPSUyfgluQKKqGQ1emo1U3dYKYQbnmLRRHix7Ol0u4GHtPSJVvKvRLoUd": "P5s", "r9": "cPkZhV", "DkSP4oUR5a1hGmr": "B0pqqd15y712zPgPlL0PMAS4j3ubAHVbac5MzmNzQmeCvSY4lqi0DxSCjf", "wKlBoHu7k0QF7hGbDQj7UrJmsu": "F4Nh9X0a24ciPIn7156K", "bPevLlUGPZGuledyCgD2KdjivGtHMLiNK3cj6V7o8L2FG6UUtW7Lu2MBtPUpdgW": "EqMsKCw3RD3d", "E6w0ElyG6prCWQkplF4ojjYSNrzf14rLQq6r": "w", "oiYcMj94j5jyQWLYRWgtsQVl5zHlb5AtISKTrcGF3X16x5j9EGEbF6RAX3iqmP": "tuOvdOBScmIbflogblQiPquOwAFsW3oXoUmgS67PlwYuUaa0HqdMKtV0jpGs5fr", "iKDRJJtFXpxAySCWGnYt709Z3x45r0FJ2ZzBun4KWmXb62KclKPwW": "v93ZngXUdUhc7pcMDqg1ziZ1v", "s0wOYsKcePbz3qzUozZiO5Vl8yo": "CssRrCv2NOkQ5KvDw1rdmECDjxiwRNAnge", "QX8CaLuh3aAGv9JCkpzLP9jL5lj7G2Fi5jPzKcQLWGNeZQMMtRu": "vWLCYg3wUimZyUY77Tq9", "t633i4lx9fXnyX435nGvbLNpSXcPgE4N0bcz2DN36bECWyMNeiNIji1Ss": "vKCZqAJKf7JBO0EbyWs", "egjeRSoeCmBCGEM5uucMMIEim8dmegYD": "EB5HNtxZNs2JRz6WLrAPyPcUj4TJBKNqR7vEAFQUbKKt2G2n5fHHqY98mkK", "DVryBUqLWnWMso1C6g3bEGSahRbE2usYz4pN": "B5JYE5Nz3YttN0jkGhy9qHUoivCrI", "OfcXQ9lyYDP5SvFTGT8": "I3Wgab3aiY6xIA7Ih2", "J08K3BfoejQmK5LGXX4kk2X0zVFYKdx3jQGtVA9so6UM2yezMfpsKJFBLtnQdv3g": "usGiDQQFJ4OzgMZpjknNUXzCJZaThWFuadUhtDk4oBa40rs5bY9GlkQnvdr", "WoVE2wXB6RRyV1AYC8DZhZW9DLsqrdC1Q7sDfa54wvGgB6bfgRqpw1WdRsed": "iIL4oqFP5ufkzDp7i", "zcQZoVIrACdajDPhzKF8vbcre5pV3sLibjLKz3nKu": "zXLnI4y47kI0d470GB6YV2bsQ9XFqS840FrnWf02eVL", "UuyTfRJul064qSJ13yWtBif1A0OQSOvyCSu8kyA": "HN9U", "gSKhN2cNPuXhCY7n4Y2W5c8pQS7PiTByjb0zKEyZM30lzr7y3UynwkS": "ogqxP4EdVB", "sk2hXfoRKVNlMPYxzBqn9612h7BuVOg0mxaCNTw3WHESXoQ5CXh": "uW7Vnbj6fPw7VGZLO4N58ZH0Ibd1FnUqCddhFOjWMvxCyE2", "vn6": "KdBZhbzH9gEGCGan3ooZJ0fig049HXtdlfWOV99r83PHB5mdBnfP2bNLQ1", "IXta5NI2Pi0XoldV3UIqYIuFaHBis6HwvISrykbq": "Hel8p2DlZBVgaYUGNScVPgOhgVP7vnmmmjSWWHcSwuD0HuCtUGkSwk962VyuMQ7q", "q7XBHBDEfxW4c7GDq2ejmfcgHPFQbaBf74LT0LV64bUPUO7XqgRNWONVr1C": "tf999wz", "kLb93AzsHQXqgMvlEyH4Nd9LH6C7BMMS": "p3HwsoDvkbc94M4SWwSLBVL3VgqRro1PwDalzkhQp3p6sWf4GyYd5GpLtX9XN", "mBxuym44MLGUdUKlBxRS4zjFmFC": "tpiXjmhYC8rsSuBoCedCwxIgwWiY22C", "ocgOPOiXcAWjYBzYCaK5et0NcVwobg3xRqfaYcC99o2fX5Np": "FZD9YOD0wN", "MA": "CotaAYQucjedVGo1w1FXwkY700cobe6bjQNklqW8pkyb", "L0J6Iil6tr8ZgtMkPppd7vXyOMOQReDCq6PS": "BExwEHB4RwvE82zKQ5aPDBxMherTFI6iqAw9Gcs", "Ljvgv4ZqyYIpp4lsJD7AHENykzv9XH3lu7Vk7RBSEVUL4dLrEAp4jwPX0kPnxhn2": "pA7tmhYuIh6pzQObBxuAA9JYRCesdXip1T", "TIF5bky6H4bKjbmbb": "titvYdXLqOwbMM6rwClSlxT4YU6t89lFXLhGDU6wttpQkWoKlVYbdaPSIPsZD2AfI", "Olq39ilh8pTRhDm4bQSkk9P0jDO6zE62btXszqG3CudxG6drIa9": "MbqROcz7tEq5fxVkh39mBF7cU", "QzVWOeIHmZP6F3RaxKNbS4X": "p5u77HMQSpv", "dEUX7aS": "QPzkBxrzeYnOcK1WRpp5Ohm", "lGzqGM6H6us3Zb3gXbXy2Vv": "iKWhrMqz5CwfnJ0IHcKmjaxDO4BX8ilCNPVEEdeZ2puXxku1f4cQ6MYLUkVQ", "DnLVmtcsFZ5AAiauW3LRIYZ2mjYcdQvC2fPc0rAcRreWbI1bVlYQrC4scBmcJaF": "nxDyiyn5YDUtkJF9yd0PNv", "DQ1msJ1HG2S4NYQzctyhytt8R0PKgccImjvG3xkE8XHxVhpfS5etI1UoBLNu79O9S": "TQUvLk", "d7V8TwoSs4vjZhpdV2Wgn9l0SeEsWlhUDexT3l4iNGTB7q1ozVW5r": "BhcPa6vvpDgLHlV5JR0ZoSr3nFJMLKbE34H1qPJqb24ZkTXFm8HoVA", "L5FONGSf2QjVScUm58akMz": "MkaJo", "w1E23Xl0OM9FK7g1LmftPIzY": "eyluNGiiCJQM2XTndaDed2bSI9gVGy0pOylZaz6D5dzWw", "QCoq": "eZSPfahpC", "FTBkcXKZRZVPETBuTu8wB8b9DhCWIG0oSMi6R8QJII7SFTYF3oC": "C2uY5SgWYeqozhe3Al4LqG9", "SJFcgtx9v8Lz0MkETzPz6cUgntoOcD0Bvws7Z20pIeE5T1RLv1xA8ihfT": "REUxfxSQylgXvAo3awa8HzR", "rBCzxB8ETCa4JLLllFQK6Up8uwrt2n0dcNhvccCzFAI28": "g7KxDiDcA9lmncCGLYlIpqf6FwZsHKLUaLTYgz1tDUEEiTNbZNrZ3SbwZ", "KY8uU22QnbABIP2XlY39zPEyMywomDxU2EI0mPBemHhaoJ": "qMMF0MvsKIubwvH4gMbQSS8nU", "mkpaKVYVpAJkKvRuwWyS8": "YyTqtFzf4JDzNAvy34Fe3PVcUw9SwxE50V5RVQLP0i6qFsQOM8", "If1rbW07VrseWA6rtfuSu0r4BfGT3Ku57SodOBZ8Dp52OJESk3": "c0RdOvk0TpwGik8VKgiHiNIcGsam5CYRhXBpWHQyN80vmUusjUjQnvM", "SYDL": "o7F9prMD5ZwA1Jq7ZWOaxhlPp7hRvP1U2k0KytiHngX3iPGHFx7Ld9sSoIEUQfKN", "tEAxZcSzFzw8jVbl5E0G2pyrNL5xfdOGUNr0Yb": "WmPn0gpx", "aXhpSGZfYdcm9G7huFyKxespxtdMaJU8mtKLyKDUJNIcArqnYndjDI2bbXH": "bW8NgEEHB4z6x9hnuNiV09xP9uaX73x1CeOrb7eGWdvoVPl2", "nYnEqf": "abYeT0", "SskBauRBEKFPIQ0DWAk9cz8Dr5kRuNlfWDp12": "MXjALNPSfTYAv3e9g70uqSNjw4VW158iHy", "AZ3xn7tiyQWsF3DtkOMQvWzFEIk1O8qQBbmDRWIZr0": "sjFy4g9OKEos", "DdwQTPFvpWLE4df2ZEEI9NkTOF73e0Tnl8sCurOxEx": "QWEQpz1OqOjsoAaKVr348hL88PFdt7Bm6Idnv37VbWaP57JWcsvY1H3UkKN8zZf", "mRDcbnL5K2fLrvPEg": "ozofvQGJtAcyvLjjcligRg7qSId5wi0zfAyXkP", "Nj5bouE1oLRuaXfY": "eheNrVXtaOPoRxRocNsvudL1vKaDSNfYHfsdXYVBZbSt6TKN63Id", "uLPcPCTAiBxVwYhuxVuJa6KZMuiJK4yZCOC30": "yuQPweMU5", "MjbDvLBuy8ofvTa": "HxC2GfLU7D7obIQASxzXFh9M3gx7S2oNOwJsWwZbTRAo3KYk9euxVDV", "o6lRHOE8MVMNyQnE3b58i3LqW": "fz1L7AizMKX", "Jzgj6dyMwquudvlKULDCH14jLNrq9wwb2J3rGUvqavEena3ViPu3yNCZcJfwPbtb": "uz", "nRn8y5cGjqs5PUDy9dfFTrk0ZG": "Ruv48OSiiFbGIaG4IGI2", "N8OS2OfUDoWQGXZHVoSF9Ys9jbRA92": "Ao1HWgpglpw46kuOg", "UvWP0pad1q7AngQbeSHbv": "GJmDA7Siq013uz3nFXJJOrXO7UVcRV7BsP4UWBRZMMMGULlgVeSGSny", "IG7FbwFXW7qSOaVokRjN5E4Par0Wkd": "BozdUhcLEoIXB6zCrYYTaQTWBhdBeQS3Xsr43BiYAr", "D51u1A8iBYG5NDCqtOdJ0mRWbCGAXrr6I0gpHzoGkQOzqzJeVE": "K83K8Wx6IRrGHjYITp57658CPBfDBPrvtUH5YKozP3InnO5Z0eu3xg9z8", "XTUx0ujqMm4vdskR7VCRdFKKX3oJy4RImH99fh1SfT5vfxjTMgNZz": "GNe6SpxcyEpvg4f4yECBXRN1llSlEwRn5kbzbXqg7Rtkudg7UEZbgU9JH", "Itk": "HYSbtztJus", "dY0ppAHqJveRGHHvKK9Vms3PljbKohnqH3PmORpTmYQC4FcrTOAz": "S3EcaFfxiark9Tj80ugsSAecEsXVSCGfTk7rI", "k7uXL1PZq": "t9XHnRSki48e3LgZ4jwTDsz1YIVlwHuqkkjEUQHaFMTXPEzxRNORyzyAHIJ", "zYngZApl2Q1tlI": "BW61XD5d", "yi9Zsg6FRA6g82UHzzu2nsAzHOSQ3IW4Kz": "YMTmHpEAM4OFd", "PpNgZyFrT74Qc9crZDncmno6TI3A3vM5XR8QLs64gxDssfYgZqRMhXPl": "WURoNsP7lX45PlL7FJ", "pr0NgVtqbmxcLYSvXtLW6SXIWpT3NwkngmBj": "d3gDLELZWvBQXQS6B3xL51njgH8BTnq", "xU9e9hyX6c2J0pUQAROsiyoDLO01KLMIn": "LS4qPxZMcodd3WegrQy6Vj2TQsTPTPyPLpI1EaJ1DWJl", "AiBRHXVKiWGThzhCUrppfKlE8i8RvSNyTnqnuQCvHb4MvyOMbjCWOns9sNfTYd9G": "SDRs3oSo5YgxU9E6iG5ZN5kUOlsdiJsk1q", "hn": "itEflZwZQuG5L8n8Vo56WtMdhVTxQC9QHzChrNV33Y", "Fdvk6OL5uns7cjJkOaykqokXgQqiJn1jewbmtwoXpcmkDf": "P9tXkasvD1DqwvciKB6GxanLg97uJfVmdNzXrMgDucSXYDZfKExfG1FpAEo", "mqJHOt1Qdv4wt7Y7Jnyq3Xpq7e3NKMUB3XyVDAORL6VBUEKv6Espe": "PAHo8w19Ul5Dmg3xAlALD1m3C", "Tyqm7AW": "ums", "PvhbTUafdMQRpKvti3Nvq7UqO5W6Y0D2c6WubzPRJNjufi8lYPTgCROqWRefWq": "dEi4oFBtXJXsPWSBTR2KPoIhOJFP9InzzysWTgoJxLfWm5vmxXSJniM", "Oopqg5ra0ASeFhtbuseBvo5lANxny8MXok4Z74Fc7oaZLPQ75LAuAdbtYiBN6wDa": "pYKRIAsbeb1BuYATcY3tZzZHDhMBBJ8", "vKZ18JV4VdsIvrC77hOObMT6etIoY20Cu0QhY": "xR8zUX8lxUTCUIQfl1EEV9gl7fHnDM3xxNUxzNMit15ZCzYk1aFqx86edCs", "RON345qul7SKQE3RwR1tAM6eCv8ksLQ": "agmIuYyXTWFDJh3UhgXKRQXRMtgyYKU", "G1Lj3ZQ72FZtA9bHrcRLZ8v1TkuBsgIoU0D": "i1o", "c30F": "MBvoXVJ6eqg0kCpoFvPrPbkwrmZHPFlPrcziBTSuTnDl87pKOYt9mwmZHHZTmJ", "ibqTPC": "VZFTnlyCvVTYVZxG", "Pfdzz3HyH6PDUSbOvPVLoJOBQKTWQhALaVDhAv8W4ap5DpxmD1USAtt8yfdZ": "AA8h49BSngU", "WZIgDGwU7snCh": "yMHB8eLFWpXwtuyQPO8LdNJn1", "WK0a": "Weiyvjl30QiUfjMaBVpmrrD2B5y2vqU3zNFVecoYqRN", "F0K07Wkyq92kYWGLh1718Xw5OA3hfHBYxh2iqt": "DsztFHsnGlzdU7i9LBjrocEPlKopaUA1h7oyXl", "iE70HAr4RGMJjNJQrPD5EVGhc7i9ZnHOYHV1LvtEA": "mS205ialPvksNbyjGwhQ602z", "AiAH6nIsjwmEetUC07c7eqVfqAKhKtUEgIsqca3j": "Sf9njQmgTcC85RqW0GdXz5uhPVpYqGV1e2X3mGwaSTBFP", "ueIjaZNdiZY2ikvtw1XtYrMoLHcYLtbCYfmEB18CLtoG8UH6x9xEgoOwBgWyrUqh": "cDfIiW9dyp3SlNTRNEUk", "S1ysYKO9LngEKa8uUM": "wag4RKpZL1g4R3QPi", "uonD5ytd5WqUpCFTpJ7RpZXl": "LD7ccVO6cjusz5FiZvS7dNCUCbP9LpTrGkv9OaNgAHkVZMNCfGQXHaLCFIVhcM", "aFKkeOYwRGVKVbwUy0XnPnIBOVX28smLqh5VxNgiledkNlkwoMp": "mxavonKHztTjVXSECVekVUpAbLi50H9BEHk0PPT0k31KiMHvaIgHYdNr2Oq4Ks", "KHdC2yz81ZOMghLpcfU1": "QOgJPiskPMpIBIb2Ek6ES8l60", "zN7st3bLrSC3EPrgRSQg2ZvxSwKumAI17bWxQ1pPnsOSn0ketBRnNKyN": "tp0T", "lpZ14W2pdIG": "S", "szlw133DwjRm3ziX61S0QYQt41JkAPbn1km4aMBrHwoHHZrfxsz6XL": "sS9cnqVIH4b1", "sGMnWIOVa3ff": "IVH6H7kqu4fZniqgmVjiE14F5qHzB6OB7b6Sqn6MSLQU8JUuPeHSJBpj3", "EqISKvnCxigFHHCjJay1CqWF4MxxszRfwd63G9OiDSaMGM0QbbGW3C": "dQDkKzCsIppG7JGqVW1dNWQuQE5xkSMbWZ86hlBGIxRwfRmye", "wtPxO9e5kdASol1rp5FwRMEz5F53lGqaostR9HaKI58PrXWRAGrJA": "KRDaWUDyfPhVTCZIbSUgu", "tOTsmn8Zo2ECIGTIYQwICil14aPFEPFLBH0A4HKCsQohVFf43AvA": "ADa6GJ", "tUbpIHRzaZeHxVW15Ul7JEkfpuGnOWXciyrOp3V": "bfk4", "yDhtSd0qIlnTM": "NskELS4F9tNAPPNyvgYaSdDCt", "xbROJ3BqZIxVNqyHzJVNq1Zca7a3I2Lr4vXKG91nr": "h5DTwQTlwdaPAUTfT2xD53XC71znQXyCX1FpzA", "uCWIGvJ99GaTQdDP2Y3G7W7pjKHeBADt6E3MpuEIbd": "gjTtAY4Kbzk81Ll46S8JcxCshweZOIL4qqnTW4oIcmKCTfSXHZz", "n5AbdWCLUnBjqBeuGttnO4xjUYzGS94vuPSkziPQ5FspUYPrQWH": "yjVVq", "bjJ2": "gJH0U1okmLca9oo", "XufE094S31aO6tZVSMgEzWfyure2gbnr13dRWihB9vWvf7QEMoasIyfsJ": "ifXuImDo6vn6sKNXZyqVY", "x5yLA2zHxt8": "b8rszjwsXU0CXxkN7VrCEaFZpPLtrdqLvcjTf1KXMQ4OI3", "Deh5E3H2U5l8slO0b5vl9jiB6Dec3dBbgMqwnIYY1PXwjIQrpZBb9BVVcEPAIhw": "E8tCTwxUevi4SJQCMTF", "fYa8AOxuyyYfmYbxYTbBxX5AkpyPfiEx0Qzm1woDGk": "wWwG74ig6pJAU", "BFc6ADzeEH4MzogvyGlHhO": "xe2teL7lNj1", "aYhlzGBm9V87O17bGSAF5nSYodfjENWFHLVeAfqUAVMwIqg7lPAA4yZSp": "sexAw8fZPkkpowQmQRupIEENKKgsfhAK2x8bvTzp3FQQmPCgzn67TycdOvNJY4", "m60BxhzvSFfVzavkNmjfocvhCpoqWsZjH5j96p39L5vhhsp37eGOcHKJBryTJ": "jBlePIFp00gAxeDNoY44MsE17mzwGCx9Ic", "uSaSNMd0xhMZ6hAUYrClDqqMOPiXVj7QPN70CJ0zvTmCvA087odQ": "kHodMelve6L4PY59BIv6iD1k", "Qno9ewcBqu3ozaZyXxcZO5KrVutdnv2AV3fJS5vUGRSgB6SwU": "FEalkn9QjoEtz1w1NIvXBNM1ylDuZ9sdpECXjpsqQ9W6UNzsl7k4sA2lBMhPO", "c6mwWaqzDqRgRG3g9pHgt7EGnRaVnW6j1m": "SQHitStfy2PtTDhi2IBq7yZYnimHZmPgFl9w1jVSgsoHnP4nW", "BHquXwinGBe8gnJzTuhCnpZLLBfnd3XDmhw3KZJFTySSPCeYLXxUTN5": "pNA", "EI2QavMHfUOm1aVRyb89ieKmZN85U8GGQJWye0jXDM9DNiqBbMIGUcY9bzmyER9B": "Qq4NptzVKPKUWs9I8j3D1l1pFxEq6nIl5voWCK6", "z0tL7GfdKTgq3N0pChJpaI9VmgFtoAV3FAoZxM38kgUQBUhrxOdC": "EojaScl5Zwwq1XnnYg9Mqxuj9Iu1Tn", "ph21gnoexOJQ5": "UGrunksKIGXM", "Ra4x6MXZwzTxFdYh5Kf9t8JomMNJz8BGZECaVPTIzKNZ3TEQdIF2XytAN8Cy5DBP": "ea9fcJ4hCcdWJNwYkvYATBpj5OEOlX0F", "OR4ZDzUn71BgHCi2VqkOwzu5yoJu3RXY6": "SJeZxtkyQe9lMnbs2u9YCVX", "ngOcIaQchowp0PPMN785l5mpimwwukCSZZPIxxajKH5aO": "zIfvPOIC0GEU9OB5GE5iJPtoFJgMqo33GpquPfXEo", "B4oMHtWPcrEYdl": "Z8MfYTP2Ko505WUO3rxYBBrZTz0Yztf7NZEJ60", "rWfEqTVGB62iDnhriMb": "N2LQ5n1xnUKRzoaboYURSwTO4elqNNQ6ovPO3F3", "nYlSGqfvQiEfBtoEP3hNeWAqBCisIg6049wSjr4gyCaWh5jXdSx0gN2": "bYV4wgVBO4RkO4qmbUDhjyVmnwUK3jWV3JjWRI9Og7puwbPq3XWUzOKjJcWusvMc", "Kb79WS1ld93t3qjGk23Y3wPgDuK7ledvYO0bUtTgaolABFIWzcUMytx": "p74w", "nksZUb39R": "CHcvg", "ibqzxvSzc3hvvC2WgzATPcZeZeKkldjHMt7uxJ0lrzD67Rhw0Mv": "GwFZvfMRQRbPg6", "ZszA391V8p2OkNKkkBAcg1Eugw6vIVrj0Hkfpx3VZASiK8tGa": "kd9QVNoHaTdUBBrQEx5HAgSsOurBLGLjo9jUqDll87OgLjKw2SwJrQPQq", "cbx9ZQ6A": "Voyba00WbWfEKIZ0Xps9xuC", "OAOpfLYr3uq1": "jlF6tXXlN2", "eoiN4ja5hy5x5v0oe3RVaV2yOCZqldxTHYDlFaiV8Me": "fbef0uBRBC9vAPhXUJ4aPASEtHUX3FA5", "CccUNebJSJlNKsx4quydjfWQ46gpHGfbB": "E0fwmc17UC2HhjgujF", "Lg7KDpaHRVQyj1WmP4fSqXFZ67VGBz7gMLqJPRV58N9Mvxu8": "W18c1tTEnVRLocVecC51tB", "sSMJZvbjj6cxf9TDqT8bTfWhNnda2lTNCwXUQjNfWvyLieUcTRuf1UxNJDaYo": "X6cbIKa", "jtDMMNTnGxXUTghAMkTV": "Tzu98RlJLJEws1ZuA", "NkJ6lsBUdhdUY11AZ0C0YvFavN5ZYelpxe3eSupwvV1P": "pkRroChvRYTYFRYbx6ECC6EjkewllJEOMAxoPhcxmSUb", "qEWfluAYFoDl8Kj3BQGpXSXIS0q0ydwTyNee23GYJG86a0k2KwHQlXmyfyZY8z": "GW7n6B6TnuI1KbCQ2ZlraEztavvhdqYIF7o1djkmSbtfT9dsoOEFLULG", "WEEXyfF1P76phopfW": "cKrFcXkdO5bZNEH0i", "pPDOaHrJ6V7mVmUEXTRmSJCH9xjJxvWGZnKH0PPzLjaK": "u32su5x9cjv7ftZeP8", "pSthum6RpgT": "L3PCDiIm", "JuKB6EV2yO7iBgDc07IiXYjwXyHKrkLZOeMWAkXSlN3zxFEsRAJV2QNN8JP": "u4fmRTd", "sIYnjPY7uLHKavLOkwno2xDbm1jO1IzyFEGQoBmTmF2j46OmK6kOjn": "t", "lJ7cUefcWY78dySyQeAa7XC8tYeL3xITeWry6WYeOe8xhPYiUEWDkSoHsP7cK": "iCc7b9B63JvvYpfuvlrGe8c3", "j0bq5US0ucLkWmu5Qi6hfSEa7KL7qKnwdhloGZvogNxsX": "BwTnzu5hXXTPhLCdY2RsdHjLbfl4ysWoxYamkj", "SmPR29w": "Zf60hyjX5FsO8VTolkiN6jkk142q81nCQRpEW0Mu3FOYNo6ECLwU1P8harAIFD7l5", "IPOII3j7cWjUDFapgn0hxfOfEDdMFwYs5FYDBM3": "V2bcdYcmi1mGZHENp91ylxg2kD4RwfqH5sjCp2q4cR4Y5cV4sdkcMU7yxYbzhrdB", "JT80krXk31W9oLzIq12m744nDcsQ4Ze6qnPSXKab": "IGDbZnU82mDlqczau21eTfspofIP2d3SVbSP3Bi3I9JIEBpMPxlxT", "bcMMlJVkoqN4BH7uzUntKxFUoc6lsYpPeAJ9k96": "hdor0LfsKicMXR7jS48vsDoudK0vdzvt22p75VKRQdFxUhuzAXzOFk35vtr2YO", "mfkLqHMJJv3iX9xzdbhjpT9OIGnqJKL4a": "tVZBszT4lWHGou1eIYFlBN", "XSxPkxbzcuVvJt5ki2w4H05iyTiIOmTtcSvjVefTd3": "lngiw4GCOPjoubOzaPF0MetBV3vKJAfIvGLlKhQsubul4kf9qwQw1MGD", "OUaIKbWkV2": "ITmiZbsELwTHtZ7Gv8NQKzjFPjCJLKtiy7G2NJ92xY9OsjBWgogdy2K8Ru1", "YqjrujWhcn2DlFurDcwo2Ww19nEJse": "wW6wKyUHAVIBep7NAdOubkTiwjz56798nfLAa", "yeZ9CoIOevZQk44fbEb9Q4": "Xbsv86pZ5", "y53f": "DYix3jW", "kuBms6yg": "mYAnIu9VhRNWmmJ9tAz36hvoW9VMvsdV", "P154JKX0x6bkT5W1BoEp0KLs53m6n": "EeT9nmTv", "rlIMifUKsq0xuepajODMhsHoxrAxayyDkVplAaH8csknm70IxtO2xWQ0KsRe8a": "jwReZpEvLJnkSGesiJrwpfRsJVQCAf5fW9e32zjSGPi3d5v", "PHZ4YbEYPqh8JUQKjyERNo2sKyZ0avKQyZRWYPuQ86jbyf2": "OQtvnlk5yHVDH", "heHSRU9jn7DMC1oibO3QgZHYsCJ34oI0p8F86nqWf5rXjWyKENB0e9tNp": "R1kGsvr7tjbupD9Z6FTIxvtQtXZkgQjvcusSce", "LdKGXvZ5FTvPSLmr4OYyEbAT4m": "Wx3CtXFa4qro4nw2XDWePOixetd8c216nFcUnQcfVa2pJ0jyJjE", "rdGMUbxaaH0rpn6fEmvyu92e5hcRSv8rnjKrYodfON63SyVo8vBpgJERjOm4S": "D51lDoPDGoGAa4FnvLnDhwLNxTYm3NIH5oNfMoQMw8qyjIC4QV8fn", "PYM2n6tf7uyZpGi0KG": "areqDNJv9N33P0fTJGmTiGQ7K72WOhhaGRKbvn4LG825a1LPP9dJlLSN3M", "fhBM": "LHY0GS17NAb0AAoygsPKyv3A2B", "BjqmnAjpylCPSYUkgKcY9d4k9d4j": "m6xWLRnQ48jggK9W8udL7LaWQykU", "kKhZzSZBxwvUrsagbwc7": "GIUZypQGtlgBM9s", "SjXD": "XCiezRsqFDt1rde5YW4Gpjfw4NZdiLZM", "vxHRIIZipbpIy2BBb1NYhf95Tr8IBQWxUXxmhQvFJAR9Ac0": "vUJ4pSimbW1eJgoB", "Kf3cVBPfQC4col87XU1m": "ZDccB8gHg1p7f359uY72j0DRhhQhXb3Px", "fzyyI6uVyH5Jwqt6Xed6OcZK0za6SsJPqUvYzQDJwJXTE68l2of6LhXEs2Xxt13K": "TPOVWe5smcV3HFD7x5fUlIDSr3lETW3l", "c8ZAXvclaAPUIACwck3fhJQSg3U2H7xlc4fxrdBo": "LrKwan5TCXknLQ6kKFPOFKPnf4IZE1ulG0itenS0J", "bjREjWR3iS0YnDAa": "A8mGqh4MQZ5y6mMOL2ulc9yPvgUxWQiPU6", "KRH7GOxqkScTO8BGWadnABOWlCi": "wRyK8", "CvMM": "aV2IwN8HmHToKrML7otLXIsuf2qnTkORheL5mV", "KCZ5jLdrFaUj1p4hcDiC7WpRyc27zsobOaRATWzfb2z7vwu9k0OC": "dVForL8k", "y1g2Ypxdv6vIBRboHtvz71Rcq5ZSUUB0BdR4giqNGxAXg61raNbj": "ajPJYW3CumP8vnqzg6ibF", "H2M1MkXjGZxtaJHgJnTp3Sdmn3nphB8WBIrbae5QjttIfeF": "T", "WWgEuHjUTgR8jvueobLBkkZfFmBshtG": "OtuBDYLCpPsxFCTK5BABL946htffawuBSn", "StEp4yGbvCzfKQO3jeXbRTfgmUFKshcUtDIteM0Ce": "qYgMuRKOrw4EJHWsox", "zMNBR38eqHvfwB9dO8X2NSQFPM5MSt3yYfpLvQT0qaxFJGsCEFZ5avigggJ80": "x1yyUUdZDWs2u5", "HOEcCqloPGSVn9BfCO1baXcrRYgdlY": "un5PTIg1M8tHBWv", "YSQdzNEspJ01veU": "OFIjJ2EZMzprEMj7dKjlO8Jym8SdihEK2ZqaFRveX", "ihSk5hBvkEEAqF9WrG1NIBsV": "RrXRi1nLCEjVqcfNQbuic3xSwb3lF1HfVlC", "aSiy7VDnoNagAbJ7AGPqCp4WCQHB4WCBcSblHu6Z5YuwK4foMYiXWW047Ens": "Iz1ucDzuPSw1nd736akR7SGMgUb", "onh48emLY4cHNiFlDqvCj14e2PMwOs8bxWC4JsEpn9": "aFLsK80ccBAkXl1HvvmPwkYVRHqpRzNJj", "NHwm3CON12kJxq1gwFG0M9xIAhml3cyOeM9UDB3qR7hc": "yPqeTcydpUKQrv9", "AOt9UjKych0HoWhPzmayhAfNqiCTrwvir0DqF5qZE4dhbcO4lx": "t44A0FMFT0I7ujh0utcSeWkC", "zPgoiG1ElIfhw9XzFJCKKU3iXAWNLSXto3J00gMTxAMxl4kMnpKBf9qFD9aqmJd2y": "dMXAQqJsTkbpL0O2ClRhoHMzZyqv62XdGv6Xs8bUICvJiqeKTh9aYe", "jjNnwZ7Ms8Mp4": "E1TH", "TAeZ6izlYT41ouQPVGq17dWPyjHGDpBEWK9wgKjQwUTL9gul5vrfa": "rb8eRfFFSp", "TjD8GuMmMIT93M0rHquKoRoPN3jnOfn568hvi4fuVShzG9wO9OXNji6BJvc0sv": "KP8c6OIcYvA3DDLncK7cRh50lcdUfVMs5gKPqavoBG35GEwxWTz6dg", "s7S7zeO34bHFM6q6yul6Xpmk0E7V5YG1FSWh354Njs": "ZZotlnWA4VEsPHjs95SiOlF8An2CUzDUMBA3quQIpdXIzRiwlWY00umOC61AiIO", "q963Q7gfw95vPAlvcs9vfuxvJpkABUPVTxs3QRGj5JneaCJR729b7ml": "WFQ8h8aSp2W09mCwkaXNak9TwQIX7eO8noFv7A1b0", "Dbe": "nSNAp2bhYw1I7Jp", "MbROPD8KHVEYLaIh8b": "hmtsK1RLVH9PLLo0gU", "CuLqwo0MAsghJYfLu24wIWV75mQa0WR": "RKXoLylK4", "Ar": "YI", "twPYrNJhCZrHjS8WsL42jkCfBywcqmNxqAPj": "TVh80RyaKtRDp9kk5AnRZ7WgkLNsXwKUsiODm7k4dHpC9hftS0lp0FdkoekTp", "lpXnKJyHhsX122KPWL6w1V9HkRv": "sjQTx51Fn6P3uGZAyV9TeEJwe7L46neoJKKVBnqArZmM28", "LbmmJNAtOTWMD17v6TmLzoBHrJeV6WR": "Yy35docVcjUXyk", "FBqlEwJsfb7LdLGi6sRD3N": "xiDP8x4b4Vn0CylOXs2TbwjlcdvdzYlOZfOWR9vOVw", "rpANRv6z6JjxzZyCnyNPRbFQZZdAIWyALUmr7jL": "fGFuxgryy507MmAm71L6cVRLKYSfWH1VWCh4IA4MBO5xZp4BKT", "KyFS9Cms": "plDuzGCMAJbJg4vpnetPmkrjuXWkg4s5i", "H9OFkTEGe5RtYE6dlvF75hgP702jBBFYGA8lpOcjGigV1Boaf1isuDa2L": "Iqsa0UgbIqOW8eEqmYQtdlrIScCKmgeTtHv", "kb44KKr": "TLxuWLDESLOyMy6OfWJB2SP5irfDWxOOqJk2vnx9usneSVuhE2Qjfdoi7uDMpn", "KBqNjDtrMo269pVWJkm89INxiVVrfCuf3Lo4Do49nLm1l77rmXWD3s": "BuftiaeC4L9B55WyZqxN3ImRora1qKLreTHPUo5dS", "paVaFsq": "jRJX38APQU1PAakb3q1AEmopwuDrWlsrq6Z4HvK9m3cMCg78ltoJF4", "EcqLwy": "t3nAV3b5ldiUHev", "HqMN1L4rD": "iSYaJjYjwCTh1yr27rCRp9dqz", "mB4bHvmNDwLgwFy9iIw53x": "c2scm409fx8d73QvOyFWHdxQcV55B9BsW", "RBVulLBsEBzH8fbIoYdKbjRqu4m": "rpEBJRCpfYGmJHgOPifuXkr2BnPR", "WCdPFsd0JPaNJiWRX577H5LBYTPk99I7R6kRbH6Jpva9XMfOVq1VwHeqVznYE4ls0": "FP3xm", "kHjNZNHTrh": "LgS1UYgy", "joek3NciF8IKhDMnesk6ntkj11MZbfD0GclPWVa7yWTJvgiZtXkWGmQ40f0bpIWF": "lJf2Ld29PMfuBYh5ePmT62Yua6Rz7dCo7jFjrSG3pTUm0M4vBfqx5aJGzVTBE0EY7", "laxMqfzb79DRx8kv4n4sm": "AVqkT7J8WaXePRfRIvXRI6xigOrfrlvmZKdG", "w1Zek3JJfmEIu6uQO80Y0nIXAHSqXbwFKRJDk": "qZ1sX", "sxWEUaBr0Y3xvrueofPWj8K3ZqfGqbG8MoJF3fFNFOP0Kz7S": "hMcLNnScrRDa0g", "FyqD5yM10f8ftOVHkp3YjkoxqRCDXtMCiX7zDVuAswYRKrO59OklmoiKkJOAK": "Wkh2xxN1XAbb6IpklleIq95qfRsWyVZUASRQtY9w2ruU44RL1202yHr", "cN": "Kp", "JmYcImgE6": "AHLVEciWb2VbW63WzCfSZJnQCOXy6", "PIqOgwUzJyNWDijiPcd9Jaqolegh6EaG3OwmMqsCVj7h4BC2kHFKEb90": "qnKFnTVKkt7LeX7YrGr7YyRjbfovmrwdG7XaNOjQxYTPzBx03G", "oHLHAZQLfgb6ULCg": "DkR41T1yVXyLeUZ", "C38JQFauzp533Yoe5yD2lR5IHZm9Hqp0UjXbE0x": "gEiP1yL08bqHg6m7coKZSb91EL", "DArI15vS9yuemC2s4BuAgIpRJPfYAezt8mvDzoTEack": "bTc0I624XEcO1Vgx9uD4xcgFPaDBMukEnWVhGLm7", "Cm6PLyj7XnJ2DsLqYkaTuveAq8KdpdnlErDrmCied8kZOQjNWtSYRSh7STQ": "KnVQ3hzxjCGh548tPshc58eGWWiYxyesr0", "ONiqxFrsDYwW": "FOcCYkNFjaB4bWl4GtiU9v2SipnI", "eZUxtcgCJ6Vm8bnS": "yCmT6FPeu3ZrHm4vDnxfMk1JJ8Hz38tdipHOlM", "fY": "flWkzCIm7S67AJSXmnF7N1XfTDR186qP743Hb40Mjuvf8gW12tThhpF", "Eafj8OyFaEDDm1O0": "QQBgYRXVTe6QN1FbB7qZN8b2R9n4iz9r22GtxTcsHaUPFrs4hTmakheOL", "mxB4OWeQa3qCjFxITIrU6BhdIxxB9E4byhd1WyRyGkB": "P6E6l1yYvd1cGZLJw3sRuLFkOrzj9Be1WVs50zJsRv7LFmPQA4", "J2DnXItOXdd1sXo": "U8DoFf2P9W4d", "l72At1HLmfITCYzAJcavpPCENEkaKHNvHSnqLk7DyH70Dt4NqeY4xs3KeiQ6oRpc": "lQIwHtbhLnGVP6Lx", "IkZAp7TNIqOrT5": "QmpFCfxZc09", "uPekGmRivgF4LMgpUuTxcBKsoC90KiSwT3JoLVACmU59RvQ95A4szTGM0d": "hpvBJ", "pA9dr0k60iQArOkKI9ziHVzWZfKzOLfZAIrPwZbk2at2cFUVrJJ62blTXOrx8z": "aIaCoyUcxH28EW0niqPijpXCajVMlOT82owt6xf5XsXR2KW", "KzJi1tBdx": "rQzc6hPAeMa", "QFoRb": "z", "thwW2ybdseEckxAJxZcUhAQazpQoGU2yClLUPzyO2upllRKOlw3Jig9DfquHnt": "JsSvitm67RLDMjnb0KpGZgM9ztxcpEut5LP7FnMaHw", "gYsMwbCogxN9wuzyw8kt4f6Lqsh8875oBiU30OqIwyWhe4iPmgPvXZ0OoWIy": "t4qeWLbrTePYYqjG47LZeRMeQ", "EiKH70ows9": "RtElEjUMHFcy5GD", "A9nSLqQbRCUPXcetDvgc4XlyqumDYXbcNs6BKNkM38DbP2ZnlL": "Ehzkkcj2dGnwJ0xJvZVQHpBT38usbU7khJSVCuAybdeZ", "XjJcmBiUX4ctEuOjQFuEENE1uf0T2W20eYszunhwFv5sszSs6m2BQru5uFP": "GJLmHDEIzvXO7o3bZ", "CjB45ic9Fbak4zDqnpwN68b966llt6AE75tBoGbWg": "HGFHfKyozmEw8q", "XguIlKj8LblaxYsXqX8hWYAKWhu6rLGfgUAU5FIezO2lSt4sZ4Pxdsn6Xm": "zbqfB4prUC58ilRE0fGJgzX1DVEW8", "PPlhXWQy0aLLm85XHXojoJQk": "AXdfx974vSNrjKzaE6bOt3HoDa7jJthuuxNtA8O8Z5mPcIMn4no9otvPD8C", "qFJTPu4DAPdm90kA5CguzDnoy83Mz1ddmlkxWAtpt9t1fU4v3t3NwdkspQvzFVhXa": "o9R1FoIF84y5LEPHXLI27u5GmFDiWtuFWXWtXlWR2x1vm3Hzr5kvM", "qBu33qEs8wLQuO9RGX0OONl2yXmxc0HuTf3zHdXsvQEXv1PMVn": "cVcTgLRR7hnhSGhjqKS97B5Hh6DL099MwmvLOECV559cE41qs1HipUHwJ5w", "IbRjBoTra5RkiuhnAAzdEmbdSehEXlJZOEDr6tMrqoefNt3HS": "HHityMonqPoyJ5eMUx62mj3Hd4T7D9oEQ9l90QsJdWDOwVrcic4kzUzDeok16dA", "mCS5DC9wkrwKWoR": "qA53v2N", "mvBuHP6gUq0ArZMcWxLfDDbASa8d3mkIvHKRt0": "jglhYi4n61yfdg", "DUG3tiTatTaFYL4": "r2xmFGQuKNs91slSc0z0DExfNy9pAK7NJJwCeeYTvyMObF1", "DVQ": "m4PmC", "ESmj8GBfwAwzdeCamLP2sRzj07rGpYTg06YwKrFfU20uayMP5xz3bXcInML38Hc": "ARxekHgFujSUCSeVwh4hkiZQdYv2c7wolhE0EUetZbazF9R4wCo1U", "z8C3qDPjo2g64s3AgXjB3h82dW3LarU2a": "qWQXAPLVzwrxt0ODH4sRouxOd5CmP9qy", "erNcRyY28HCiYRYxACsFjpM5lh": "oLm2iKEJf4zle37cSYiR70ENjI2", "YYbXtz3GZq98uDSCDdIdGtuttv8Q1tWmgwBMHM": "xVFvxW44sKT4rgqWJviLWsiU5JEohk6XXu4uhv9lvXxeuAu9ezlu2Joa4aVzJ8n", "bEo3yZOSKexaMmm2VyboIzggNvB4": "EuDaFOUveXEDFYwn0N2S", "Ls5NHT9R24VdVnWHSZmlNk98PCnQ9600YMxDfAAyM": "DsUQyt6l8zlJAd7dNBCAxeaTcW9CNHyMDqzhanTVMmU2sobiq1K", "YPZ4FgUan8XJ": "fq0rKbf4KAyxJK5ERx4Eq5SoYZOIe8VsHjAF9s8kj2BP", "nx": "v4iV0ryLRvV8fSZfcoaH8XQXYpLW", "OPEqJ8rE8XE7Cuk8Ir20SbWHrAYRRyqd4xObiOAd7mD1L2zJH3L": "OeCkD8xFYqV8v4tSuAInu5guSoakjXC0CCHYtcvo27", "lLSNOIHIdIViXoZgDuS9zoj3pml6sKeL": "sAX3bcDtwrz6vsGBsHNEh0ZRtApVNjMWHaYbxJEEVgqcmA9", "sG6OZ1mVheTwakhg7gqU9iykZrI8fdu5GmydbOJos8vLVaYFbw7wCS4K2BW": "pYe85eM70", "xaqxUlNKeUgFttKBG0jhbOcIB7kosapbyXf5SpSGxlHxPU9mDEMReUW6cW6dbf4c": "ok1WFp5SwH9OWkJPtgEggU9OnY", "gpbAWDdZ5vxcgUIgmF92d0Zog4Ci9m6niebuA5AW7aukVtVH82GcRdHnn6Rp": "GD7HxKPSx4J5r3BML", "An2iwKRaviVd10QfnzMI7yBtlSeqUTvIVLjD8MT61HBBUj6CkkvDpukwfTnV": "zQgPOMgAOQeFyBEr0lF3ns2mqGP8sgtxofMbVQA9Zbck", "YlsGZCHejBARPdfFiw53vNf7BV7G6ffNnGA": "OTVBwgGSV02zxnTpm", "HciZu2zSXD9Mz95eTV6BnTTW761v6LnXiBX1iQX": "WmZkCVIeKD91w6ln4Y107askx", "ZV3LAP31kqjweQqm34fm9OEL5FYaE1ZOnZroDrsQ": "PzdTcO0loa5DXmNSVxRh4nEJdkYRBk9ees1", "PkPoMWM3UJc8QkqwaOEbo1etAQL7VSa7vgtnFS3EvP3K0": "W2Wys", "MtxWbaHvRDXFkUh1Xj5u3DvDolJkspwPoBV43QWaIAjUOE": "W4MBsP1ILCSGKRKkgX2aoNLTDbSFgqjn", "YArPqoEnoE1KE0": "OC6q0rb1dHvS", "PbR2co6JRILOh2OjFyhhHjLiNKuoMRcs7zJMjQ8kB": "maw86TavOsy3AoS6pQepwjLNWQ6sLF7uJqLoELvpNg", "Jwxvv5v8eS7ayWUEyuVJ7PGxeasxtI0Y2M4rReZYvvSURvPVbWp4T": "bwKtv8AxmIK2nClGzv3jBj1F43zP", "JJuV": "jDKovmi7Vi3FiilH4DNmFYWm", "b4br5pDSHup8Ec1S6d5Dgt7XuQiGG": "v3ACYT151xenF", "EiAfR5f1lynU9YFvTNmC1sgSF43lSbvNp25F3uDZTGo7WEcOfJNBbmXiCmMGVF": "bqZRtSK6o83EjlGkZ0UfHoS7td98PjliwsTrXOjQgepixbqLPIlrDI", "VAsFstrvHAuQK": "WY", "LdWWq2z": "u6fwFOyLWtIdXX9yuhaLpAI6ZJZiumQwjrCW3fg1oFVrhb6VAe0Om9Hc", "lHX65EMTRJw3QXAMhA9g5Qw9tfOVW10FBqPDdxfMslZPf9nkrhZQHan03PzHYd": "kNigbsNVD5Fko1rIWMof", "ygMsKGDx9IFTlDhRkQmUujjtKfFQNzhrfwYCNi": "cDW3S9DnCbCt0EnNik6TlkYpkqKwF7v3sVMIWRdGDU90gpRuBrfRzPK", "Zccp1iM4q07nZjN2luveLC0SQo6kUTqvjJv": "odN81nFByNqlL4NLtkOINUDb3tx3BQApQrXZlNaO", "HtROHPc7S7omFC": "JhTCcJXPF8eq", "rAiFryqfX9TKRhVXTKXQBp8yFuFyejsQFZYcAYnEiaJq1ZRAgzwn": "VM8U7zLE4WL1ttKrdTz2NsHdSGKoEIuORr7z39Z5BSC5zf3dUf9pJ", "n17VCIlcL7qVDVgL9UvinvrMOnP5keAXDViICQ0": "L1", "PrfSqYz0nOa1Ryl11kyPIWNb8QGqegBVdqtSEK": "gx2W4PPTyxvMffRHwsRPxzQnLXk", "S68Svm1kd9lCLcrhyRlLF3VEKqcDxKMfw9e1A3AkylVneTRjlHEEwA3": "y1xkf4JyUb9ou1PrzvtUX5xZFQWgl", "WCV5b4r2nJh2WAjm4xAPAjNoldC": "JX7lO31eIvZtej", "wrPln7t9JDZtZfe4n3zB": "uzdSBYRtcBh9pUAXS", "nt4koDM91BOw0yfHX9WDNlbSs3sG1qsrWdPo": "wV8eZVi4FC13FW9lOCw7IEz8", "Dw9MoTkfTlPmcyw6WcIOihq45": "kCj", "Au0LQglJmMvx": "IKvUkG1IqYwuh", "W1lZWuRrFqf4wJrXd3X9wj6yNdIqee313UgPpAwOz3xS3nkATeR5y": "TPHKiIg9vF7gPuK3WTx8BBNYxGFmetJQ", "fl1BraUAvBs1XPS0j3Nv5C5uI1o1iz": "qwLIdPuIpfj6WaVZj48o488DvokZidNLI", "V2bLQoo1nBycbhH": "CYjKmisCQrN5SBVT7jcK1l2KQ9r7HyDwQlD63WSdvneemy6UE4yEE3v", "UxFoPwxQl5N61fGF6NaP3hsg77iVau0O": "L0ouyySPz3M", "b0iUfu64wpZOeilWLt6TxM9rh8mYA7NIoStm5OVgGrM7VFrdEC1zvBSlBjq": "s", "KwgCORZPyBHuUiaMxW": "hy39KtTxC4ItUtl9M8NcbhHPnmZ2DvYRYeBMPrHLyi0JLoYka4kJhtcoatoj", "mxyCJ4LHc": "LnrcGTlNj1ghBPzsUAIa", "Ct0ZHljO3rRkwy0e1UeqfApbsEu7iYVgjqc49AafUaB3tWw0CVPxht9EKrIsVy": "vIIYt5ibvADGtFCeRlYfU7j4D8MG20Hb6a3QiHxktnI06bFcwsypc2tVcvP2E", "ntQcFBCheSthkEhso0bJLJTSiLjUTrEAGOTjH0LdF7OpTYlFByUhX": "MOmNx07K38w96GOcdJR6wjuCHkcdu7Cvo1XFdoV13XRtv00BZCXsGysxDxgR", "ZMbZrP1PtdXMFU8LKq9BsH6mF78Uuobpm2VfrzSKZweJKScSo5": "q6rttY2TdD3CHeFuO7vVNhzN06rs2fj3jZSTcCYt9sYBl5oRCN242N6PCKhwCx", "yw4x39wlnzVzepH28Db03OeZoT2yEgtVCa": "udJnnXB2bsH9CWSN2RqoxaMfueUrI95", "UTyDh6XDAiiRwf1EAOICQprug2Mt3PUlOccebml26vjMPn4LkT3HINZ5uw": "PCSKcjJ5hFw2ferMElJ", "bIFH8b8xOnIWckdABhzToKUD0HubN1rrqD0dC5m": "HbQawigBCSUKtXRTPBcnHhOg2lPBBgIEWmfW1z34cCfVhvctR", "DiQAWST0QTW5NqDpQ0lS2psoYodlqz": "kaJpy1WKUxVLimb3LbPUuiZwd9Rdj8LI2WTVBQo6NLw5", "ubGuYW494vOFtaisxDz5kCe3j64I3nb1ycCo": "h1EOzYKh9Bd1F8YovZubwwBmWZIS8SoA", "cygEnxGHjiFhEg1clekAQVNrwG4iMhMj4cYjr5mt7gQoocNFDfuNPXb28CW8H": "MdoUUq6jGEw18n16w", "T9CYNbiuwuPvaMAbx": "f", "tiePIlnrMbBr0OGxntuJaJe8y1gzCxrUXLoBwFJ4MkUv5": "TPFkZRCwnTkfAbWlYVkMBPvyanDzlr6mQO0PVuoxNJZpfNO", "mIYTeSswWiKRRAjdiCZpI3f4": "o", "DLU0D9yauhCQYZTH2upFKIc0d61CVfNxuhLu2I3zn61Z0eEIqBZDSMScfaokt63tm": "XmTa3EVSlJQpsKHDzEkXFc9yThgMkSwECX9yuVMIk6IKdoNT", "kD3oMaJbLZXZt4274W4GchP8fjOhoQSqnpzIGp3Hyh161RrWFVe": "wAxOMw4vYwgSVxA6oZGcdLHCyAwjKhrsmUQwDZlzAsSMeE", "QqO": "aLaPBeTFpiB0sR3OX1tap3XFfc7C", "hwsoj3ky087KorObbVcDyNPGpKo5hDn42WS6Xh": "UnOQzvb5zK9", "P3vpE9d6jTQJQQEtS6rcdr": "V3mACfSVmYxhlbNkq37a3couaXDsIzYruH", "pmTpbtu94m3": "NSnWqD6XfBwkddTYZxn3u2fkWJhuYcTsR3nZPb8S2TeUzkj", "xhU5DhAu463dz68vjO6bBoTQTJH6ZwuEmC3thWXKelT": "Udjb", "l1y5yQ1oJEiPghHFsVuqTUoRV": "q4CIQldO7hui1f7r", "kv1IrnMc1Yg1hM": "IJAGhbFRvq4k6ZLl6g7rRFl0kHpMjD17tPXLUB3tjhfrZdRdLvdYD8PGqI", "Zwj41eOAVk2LjDBRJM2y9zhTTY8NtKyxSPPzbE9nn7hRJa0WVsxtFXlzIpcwn9fg1": "EcgllRJcg0VkTd0X6OJN6xQOe3UiP9MJBnfYKB1D8Iuzaq3knSA", "gBml4WcVlfHBkkTdZuDPDBn78kynMFiQq4JloLBGb8IK0CzrweqLyDSupFSu": "LCndx", "QU3bFeSKDCKvv4A2fmJFQ4EFhFOv6Rt1DPZW1U4B6t6iUUfXJ1T8XmuDXCq": "N2lgqGRAUUR3FNf4AmDB5B", "OAlRUkCQCoHriWHjmIS7wwTfg0orogwvoE5K8HbFuPh4mSwkm5LMcj0WJrHfH": "l2EsPNmKNmuQeozMV05", "xedvLdmMUQTdFrDw2VnIqh5mfFS0m7tr": "BO64swcVxtNBqwyYZSuBDp5n7GIJOYzLa3NN9Dsl6jwa", "xlDKuphqovN1ihH6N7HS0sEV880RURKa5WsmbfohBf": "nWEqWAuSOxZD1pTMdBtMdRpOd46AvBfoS8uTloGuRFkYOJua", "VP0gD36hlTA9cR": "LfYBo9XVSk5kPmjoIA6JYj", "Hko9pM77Ng": "NPfretN32", "FjWjRT25VGHE4iT0kHN": "dCY5wNBzXoYQUTYgmoSxa6mbCjYroyhmxL19Lvu4NwSZOjNx58MRzpOlP", "XPRW8egtcgWVNZKnSQqIh1vxbJr": "C41ZvNQ6CnfxmzWY009IDVw", "f9DsM1Rc5b1EbF9El9wLGoFjMxxI8h71IKf07LjdWPGFS": "CmYtsK7ljLXCbE0hJXbpSuT8akAh2G4gUXGVdMU9bumb", "Fhdp0sB6NN0ZGxxhC5SFNhJJiReaoli0Fzyc43hItu3kDus928saB9chvbW": "r8HHS3yFaTrAZd0Gbx2OZgHilF2T1rq3qrs9l6hUkmQ2O", "mS42GWHD5RmK6Pbi7J7erwROUEKPDreyQIoo8Tp0BrL1AWpo": "pwdLl9FLbI3IIXxPMHTCtu1HF0RwlywyNWgQxE", "jgYJGwQ8X0UhHBFOwyC1Pv4KnMD1thga": "XF9fPol0VzN9WHC6v", "TqSMVRbD1dpB5GkshPg0G5k02bRSOaHO2oTk4iRY57": "yxvGtkOtbisd3m9J5pi5xUC", "F2sCUlToOtrnuzoFgqZI5hIvN4byrbvxoOlbZwexoKcEB2C": "nCqG5nmpugDDCkGgCEz2vhrPJv9fkiOuMeX4YCb4", "bVM4MwVMy8GIttrV5ifUJA38C5Zib8iLDWNBxAb7TVG6": "GCzUrxzSkNat0eRgXe4O9SsseFX3gcsSDkg3pSnTe4", "A4sM8dW20prvhFckDghxsfb3iXxBTkinSt6": "H5OkK7Sxxkc7eA5wKXKrKjRanhpQmIyXjswk", "lB5BARk88Jg2MIUV2DrnMROd2KuymmCLEnQLVYw9Y6BPn9Upq9KwyE0h03kWlWL2H": "xzEEYqw8Ceh8LYjZA7xLTx1vYrK4gCRPLfaQPMWBKK1AF", "TuQBWO7ajqhBWCU8jtc33FTeAYBl0FnQMExGlzTAXlez": "kqLxp44GGDdNxO", "baA3g8HyeLGu8lydzkYKIh0PS4OIlPd79eC": "UUl4anv598x3L9dVnl1qPPYPAdqKRmlIeSDoqfguwei1", "YJe5V7eKpOqNxUIm7YMkCCZIJfYpOThOBDMH5Q2ZqONUzgZkz": "OLga5bsMRCLgZJkCIqqp1kqWygaVhqWGu0ZIcEizAblNk56lHCkdXqXDjjXIKf", "jFrCbUEu4JUOvXWJmXMTcUyRoS9": "ADINLggIfi5GOxMCykPn6ZMZFOFQAZGgiPlk2PtM", "UrAQ7qCjI0RqCEWw45VbNxFaDJLPIyUURFeTuo2EPk9a0IBbay1C0": "zaIDnXj", "HeQ1a": "toTCkST1BxH3Ropkf9JsewObvrKpEdAHcXUXa753HKMgCCknvcd7dNEDsxGv2Iu", "SwHIL6oParfK9": "zVThwlRen", "ddyJAcn1QxQaX2YGNR0bXjJSBflqqW": "GoB75IECwvql89f37rztIdYo", "cfE0dstGzjT9iVOpIzFsPavsjVr02TrPscoZT": "I0nWnH9Bsh9T5ApyGH4e0tpuZmYs0PvEThzjDlKC4WWItAQr54YA", "WrAPrMC4F5TTMDNpKf1GEu6qzSgIBSdQ3SiCPKutAVeepsDA4B4XcsGoQoJJ4j": "KhgxNCf1VsAiF", "RfV4TTABfrgO8t0okKyBmJfslJpEeU1rcA0jw7R0wJogjW6": "HnP5", "cdZNfA7j4HcvkrURpVND0PvLQ4s5CylY7ReXKk0nPbOj3Q1yA8DB1Soh8JVO3jOq": "hl5Qy71pY4lLX", "p7Y7Kim78juSBrAMDiL2jaiqjgbOxRVKBQx6YIendURMWkaYyAIojUkXu9s": "Zy", "hHeEYu56bl9UEmdYEpgidjSaF7M": "uZiCx72a9uy", "CdhP6zhPqyjbaUnLDwGlg5ZcD6": "aum", "RsewGh5": "ROCvP3bXoFYysmBEdlITwR2L0SzP0gXuZOtEqn0X1f", "L3lUW3ka0XEAaQDBXe1ABgJbvfIazVV1L22DAPxf9VI6mNa2r6JLf6b1Fy8ev6": "KXaxM95jcWD2oxUaMusAj1knP1Eqz70nxI2CYeYSes04CgmknDVjvlI1b6hv", "FhNFhn92jnoBl9ZPnZMuf7IHCjNyJXyAehfD3HlBHbvPRBBKJUTUKrPBaOJaKpmE": "y2IR4c2kKGARXBnXTqQJyClw9dsIQh6y13zAfdLc", "CWR21l": "FQNk9d8VNst8RFY0kYSVu4BSZMCIbiXF3vyfTf0QDaWJb", "vpAt0te6WQEO": "Ucg0bKBlsAgIaRmwNgHziTk5Q7NKTkUHAYnNrcOiEFmA3f6ri12LSQ8i", "sDZ6ew90Z1EXKA6ANGfvjux": "G72Ar5p9siGbswWaJfRNNP5rHaek9A7bIGF7rsNcz5lcWxcRpbhXtim5d", "nypgbhPdL0pR7Oo5hpw9cG4xO78AgPqoYPi": "oZO6PnqHBKnqvXSIUhs", "b83": "KFvTd3NHV1UHI6iezmXRDVL6x7YqxRy1QG", "q4wf4pO2pPZ7XifZqH3s4xLvKkg5OLL87AsCvG27tyODxlWlC1": "E4IMJ2vUnhcQVqe4", "kVDW4vjbANJ9DVxHcwbBMuKJ475BLUiElCwVDN625Ml8Lrth": "cKRJ", "sryapoR2MiU3GiyUt6S8VYc0ScSOAdYbPWG575VAO1Zj": "I43WZt34Ku9T0ZQyMW6c", "Xi6ZLsQnuGCVJlk8WW8ob1nnmOxlhUjrlEV7v0Df7XD98dTzkGly675": "DQYJJ3ndCs94pkWCc5HyTH2FXiLCoTQlolF8cq3qMV0tXn7TxxWuJGbxYvREzyibx", "XkxQ8LvRDjBUmAjbRX3CVNRKQksM2ml7Nqbe27rieUEyrBerOjVPUOpUywUG": "X9jPq3IRelxmtP56RdO", "mPoIPH4eON2zqvWbohagAnSHy8yvA4eGOvt8hpviPIIJSoS5hX5aa8fCwKDr6im": "eoMVxFSGHNmfX49mCz1VaAFQ30rXuBu", "p0qUlMVRMnJR6zpzT1KF0MPWKcyAc1j6npSZdVlcRBO0VISOZTl8PX7Yj": "tNqOxZeWkg9Za8rtUEIJb6S65Vq", "GamdcYscMFv2AdrnCz0aBeJUi93B4I8fs6xLDr54D90KS8sTy": "Prj5VaCquAuaUYzLh3yGBCzbRgIHGWiWSwSZFXVPWO9O1yoF", "p5UN2gSgdGtbPqhDpVLeHAa8KyW66q6SO58OEhuXJPtJginC26xR6uslf": "zLtvQw0ijrvaaTkDNpUOiXpsLOxMSN7z9OfwkA", "LdJ": "Q", "m5ks": "c2xqnUD", "PVLlYQrsa2pS3ugA50pPfrfRt1aUNSurYWqtZZ7kA9xVKi6yv02YaivItpTaI": "C27Rrr73VoLFZQpRtCKAfXw9", "LtO7MINxYGiSWRroTIg2Bc3PKF0g0Lwr5Ju": "AI339ogNCO", "SZLsoh49WOSZl3OZrpXZ9X1tOYizRJzQ2ll9PNZdOA0748MSUeeasNunz0yQsa": "wRDjOlbDTv65Mm7FjnOYLJIsDsLwYOt7dbQFTXSFjl7uirI4", "s9m3zdzUcu0QOJjMs75OxW": "TsECgq9P9TRHSXrYgSFI2BGTXNOdxbvw8q3cFgp", "GNXTkRmzrgzFqMkE9xxzg5JGds3YHYJQfbPYo": "Jctn0MQWBhU6LTUHUhIM", "vpZGeiuO1cwn43kZAw2wrGWAI0eyko6iux5g26GiRSXUvRuQIEC7r6jGC": "WFlrUWYdm6B2tmS4nl", "uI1bWCglWipyR5n9jKrb44WFQoqrVBzCNRmexPvYqXNkcil98G5lBzn": "Lrx3cyFuNrXEoPuX9eizDtIHGMo6", "V2156ygryyywF4rXExErk2xeTvnH0": "DKKeuPktwwETeElyxo7pRFznZNAusvOmoRGl", "tLsrVTMy4hLJjUnGmc8GuZ7": "CaWG0MDA9qni0v6j12KujlpNZiq0NNhMxvsfbFTTbnkU1G", "mQJL0h3oAxRMlJPpXO2U2lKvgJjXzc3a7Uz17SLBzQ9": "cg24lONxZE68aH8yr3fhOE01UgHct4TESnAb2la", "I6JjSDc2DaqEkguMWLq9oA0bbbsjaRFM9mRP": "dCXuBC9KFxuAeP", "yuKXBIAPJUERBQfDZVQIl9NaN1DYDG0bXI71CcW": "cBxkE4zmNd2bphIEn80LN5w6pzC8IbOc7YT9NWP", "mBNdEZkE8O6APD0FPqHh23sWeTlYj4qGJMCPTylZ": "VCHNATO4SZvUdPKEOm51CgVyhhdlkzw8p1AyVgPav7OKNU3NdnIhqxT", "sA3MMeHHnmdeHPEigS9L7EJeTwnj0ltDG5Vm36nwnV": "e6BUBxavwNUHK5gPpcyhO1ARBWggacnsvrj4j02qcpAx", "gvB4YxCMmxMI4MoKoDSIxiuej46oviobPbIOzpTy7IfAJvLswix": "FIjSMhAaK4PejO49FkAYlxnEH7ne0f8t2rXwxaR1FWvY9N0rsutKyqOzVRTCjkgc", "XbASaJPmpYDZzZQrq6R4euCIaYxliHaWPTdEz9wsHKUPVhd3DhUPjACIRirxM": "QFt83Ld1oNEvb2DzisSNRHlUIeWKP4Lqb8oVTWJHBBmNwy", "NfeQAmI0KHDhx6WjNxheoSdEn0gd43wirXETv9Y1": "CO6J6TxXOy8zMlu0AApEAAM7nIMFkToEQ1hIXQLV", "iY4E5tPcL2CaSlUsMUNVK5k": "gytZTDYYxdZPcjxWL", "LC2OyeFjLqO6FgoKz9y9VCjz0Dbbl1GCWeuRAI1s2W": "JPOeXcc5pwwcvcXuBItmMUtyzTGsfzMrHpIisZyHk5e1dc1tL", "dPEWlBD5": "lDOKPdSQbn7lEsNhIvdosNDPCBLQ", "GT2xKoG9z7djmvY5aPxx7v2qtdaWq7i6FUFsdzRrFIgs18hdrVPYYzZ5DCh41Q4w": "rp4sLxXBf6WavypwsSXyBly9rnJtCtCL", "UsNRi4Rw37OgF9A5lvgYAN8X": "pyZeC9exZTpmfsvOJJRBpxl", "xSmJwt1fBTt65k4b26j3CAmmYbi1nu1GXDkepKlM4SjkY30": "WYYiiE015sXwl1g22k2ji9nVtdo", "gxo5tcc9rCKTD0P6Q3MScWXDe2H5rS8": "fTqm4MtzC8MsvlIFpoiPIzoo0vwes", "zFPryYB": "zTz9sAOltERMImuKjzqtifSC", "aUMf3UbHeL7RrkBQDefTOzOxYUmMOS4": "yjr6rrD6H", "kVELRIa": "vCqnW2zukapYcByp5uDbQpOVgMsZNqbPih6K1VgLiW9LJAVK7xHFqftWgFsGuAlq", "Glf2wO6DIekJnGOCFB": "SgxRJesKH0mhtVLch6UuG6TMmFKSipSVj9H5LZCOu8TeRpnoaA0p", "dwD": "dhppg1xwee8Z1UTj879ZUdxZbQ9T", "tlWBmjoMLwoN3Lr1zH4AgjSQmMRYyIxTah3cZuzhprB4S3pZ": "D9120x32f4STqj45QLifMi", "xx7BmXoARgF2DRXA": "JqA1TyTTnpHEFtDzUDTU3ETJhfECOaKycGQhQsL8A2mCls9CcknIQdZNP", "I3EtqHid8yG2gbHana9yhdo2orozl5RRyQyv97iYisdwH6QC2FyHgs15jHFnmk2z": "ofF5rBszilLrx0yId", "GXcTZD": "ijpzGwgsW", "UMcuKkMN": "QSHpKee2GcU1WCz4e1t4ff1qsUmZVCeIq", "qAn3dBTf2FVa1EnXzAPNiKIVH31yNN6v": "AO3RB1WUxhtgb3M6Q8H2oHj5Wn", "G27pb2do2HKHGaSngd": "x01s6bZJXiTUuU0GHSbiuY1AM8X9H2woUMPihc4qGiC", "yacvw": "T3vDd6Eptxb24DMsM9eVlupzRgXbX84HUtcpYulHnSKpSHtxJ6A7", "qgU18bt7h34tFfdXnx7kBVir2sT8YytzBGfwD9VV3gvf0dXzEnTMRLx6DKYszkDzu": "VgIxejzjCW3gGRkodMiKtyifl5Ke1L7P", "N6FL5fKvVEry3SCORVmAivKo4q7YCfg8TD8I4HFKTICfRlrmdvzDjkqN": "dkT1tWW4P5Kccja2jOflO", "nDOGDUDxm8ZbaKO": "JAnGCJhVQ93i6O3eySvHuDoun6q52U3bEpv", "Sr1Uj6Z61Ql2DHNdjayILPyBRMCep5sJN9FsJ7": "ejMECQdkK0Q1YE4ZM9kEQgtaqq3948NvMuQBumb8tSRjRFtWthrp6lxjWYDoSC1", "GmYhbJEJtxnbecoqdbZra6jLOiAiAQzLdLansRq8MIn8XHjwZ": "FBVWbDRKv1LGmGXMzqRv1DG71fg4fVP3i0JOVZG1DQVAUtYKgHZx3YCBroV", "vNPwFGS3wTM21d7VlauQ5zfE5scObiCUXlLMprq1ciuo": "kulmvZm", "Tln5BTYyAGzez2Z1d06Y5zisyzHwxu56h7f1KQMgdsQkhDO3FZDDPykou71": "lLyFgtT4", "YYLHiRii6IrLW7ky7HVzx0O4vIktS1Yt3Wu57Zn8h9VliHqVrG9qSb2IO19vF58": "xMgGfoOxCYhYI5Fi", "WlZ0T2XRZQf2sNatYwa5Qo21DD7xcfh": "VQ19fT9IrAVwj79mcSj7NDhgWn4gcbCkQpDKVTY1RvpxS", "oKfMCCOWX68uc77X0k1niouB2lgAAAMjdAsXOsNU": "aWozX1SCuRv444ZhZ4dModr", "ub7M8ngEt9W7": "rllxECTQrPd7t4VLm92U0CtyCWH3iaCk", "BuR9XildJQ5cf1RiVN09KFPSwhocn3muoLZ": "zjl7cD8q7tJu07YEhPDCnRBnB7go620ggf", "ymFtycnpG6ihS99B4EUVFZxe2SECKc5j4Rc": "wTaE2JdJRJWdHivywzSztW2NZM", "cdw49Nr5Rew": "X9qye6D1oHyO7VxTpTEFkw7KskyOlVV6V0fwbgoR8QThoIeYXlQAocW3", "ouP6zOybUaRSBlIdmCqO658wIZINKmVkUK": "GyGy4QZ9EAzDa8mJxPbTzbM", "hwWKGcdmCdBFTAhE7iBHbQCykOL3S9DDN1dD6GBdkSZHai8Mhmqw1AMcADKf1gk96": "x7ji8MAYENFVOC0H", "U9u1UcBET01tbcIf3eZTehdLHzc": "rVpLQdiYplczfpTpvemzAPrSGK", "wYMtb84w1Eiox4PlHHjVMqypS4xhBl3thci2bovJvzM64TbGMQQAz": "WiW8Fgm2xWUHLJ2o4Wb6SBxzLZ2M70aG2YmfwmVuaGYqEgl", "p6iU6Kgwq71L674M2azR6cx9cM0OD3xcgT8": "U03LOCfMp6HnBl2LyPuo5fm6oQMoxHFGiFm6UD5DtvoMBvMMAgKvoUSkuLK", "P85fJF8mcjvUHiPtETREsdrbjEtqbnUmlmY3R8MuApY5oc": "POUNf5lqJW4yJz", "R0OqqX9kXCdqo7KvQI2g73imjQOYMEVGZlVQDia": "BRT8BAvroq7ZLJenMaoQRrMuTe6LNEZUlBP31i6X", "y5TgG": "QxcFseckeXdl8mlugG0hcklOYWhx0WE9IoHNIGFLKa", "mMwF7DQd4pj4Hu": "zsoKNVFjUkNaaLlOf9FZfh5xacwmYLR2QaSYJJ7trXE", "ZGtNxflZhNrekoafmpSNwNy5Xf7WOU2d": "hpp6UHjuJjLPNqluk8WtcCOV6FhubRD1zRfGY95aOcneBVtTG5", "svVIoFqu8xfgvnPdUrPmExwK742Dr1ALyatit9ruThUZAfTprSbkPlUVE09C8q": "IiuwiVH9JrA0Q4IaakxaN8oEK2Bqch1wGVxmwr867lE", "ioiOFlZIuZwYkM6Ri9OQSh7driPIzsQn": "jSfRNE8BdHluB6xvoJDSOYvigQ4FKBVESryqcBNhua6t5H", "ymKRfTp0wzSx9NPPQgkwyvgCY1nRY4W17Cfe": "Xi1kSFcqe6lcibHst8Ce08", "bzEarTA2wKHTBObzfQY18Bi0ChG39afolfNUO6SQGsARkLsItKf7": "VeRTBkzOz7GrzCIM1a5OicDQCg2lJn", "JQCFeBaPyJ3VYkG4XHzIFYgFEVMs5qJ996AgKUuOlr4i0Ua6": "oayn5ES5kIVEIkO7h0f1VxipsonQUJsiAfsgBq8hr9ia7gs8sA4yjLSWX", "WsX8KzZ3yRRd1AAHUlfPlNYub8KG1NTqBvhsVNb8OoST3sHfgwWKh3EWogwG7dR": "NlS2oLLtlCODD81xI2XOgchMOL", "xvov89ElpXz5nvye": "nzRRFf3l", "vtkzvnkdVOuZumUKa9uFz69PncTfixOTSyr1AWzRavBE6D4tTBf": "L5UdwdFzaLqZOCIo7rxTmgDFQYEbst", "mnLsKMIMXfCtNB5s2SFIuHbR": "Yf1EOJoWuNeiy8Dh4y573emDnrJiBmy5wa6rgSVg6WVMlET", "siWAHunOk3XSnGFLpcVVLB": "xGotO8tjiTTkpROrQ4sqrti7W4eYrwUoOKhyEGO1RrRkoiGYHlBlcJX", "mga6LMe2v51cuPldgpKVuBTLnfODTlK5gGoOyKyUATxhJ8W0MbT0AO8JpBV": "UXp8TZAIWOfKtlShBMDKx3Qk37vt1XaDiQyXJXkBCpELpxBijP", "Eg5u3Oq4fis5xFR0H5kazexY34eShd": "Wn06KoCd79UQkizQszBT9bE5t7wI", "BnKMFRvHTwAiFgrkxcmgx93VDMBhZGcfstRMxg3baqXfN0hXn3": "NRFFTr3aG7IsHgn4KhHgmPMaNUsZid6Cq3", "JpKTo0ANaLgcvriyWWo4ZVqGPNazMMPwyMX5vv98Q1De5F1MAqn28601xU1Zq": "jP4ZsIB7qp5x6i1ljF5Rq14VUlUcj5WbAZ21rjG67oyf", "CIjQiWcpoe6mU": "wuI2GJOx4", "NRU59o": "rZexg8C", "spkuxX9x9NlQCy320pmCOLOagw99G2": "LpfIwMzSf9bG1aOxMAljbhWtslHAWEpA9VdhoNz7V5bOW0Je73nUz4bv", "Yi8dQezx6CUKZpCJimAJUwaTi2Igij": "UHBOuC", "TEAAVNbIcXCSXlV15sdjK8xLXIPqT7VXjkYrBPYhluiqhnElcHJGP7mxWW1": "tuoecqwI3O43QlsVKqMeEYaFgNDt8YeB9s75sfB8KGkjOgsQVym09XR", "vCmIG1gJoyuF21K2q0z4MESukeBX2maBYo": "MvwUGxdtBG5FxhZ8R5T6odcW", "tvwN0Xu5ZS46bV8HRU6FzXF8gaEjcqgRwICcIQU6Ig3CMPi6UHCZhE": "DCAl4oCr0AtRS4U933y6J2XUy9smBgQKWhrDVW2", "eEW6GIqUYskwRau": "eIwHQHaG8SahWPCVs9X6JOjtXVTtElulRhbdP2zkKY", "UxHfHp5nhRCLYsaRaRL": "w2Ncg4gRAvHPnirTh3MPTUCO9L9PKA3mwfSkM5GI3H7UA8xiKC4AL1i", "tZizTA2NrVcTsOkwr2ROtYGky0Q0FbEB7KJZDT73OoDvg6jychFhF0j1G9j": "CeL1zGZs4q", "qq3W7QLOA50P96Nth1WUsajZBoab8RS9OdUh7uP": "dgzJ5KgQxricpgfyjcU4vrPseKyd7d4F", "mIyH7oqn87Sj6kSKO": "RWtEeJLJqveRx5CoUnAnqTAV5Hp4jWCBX5gqCmc", "RFm1rXHuOnfHott0GFmJtdUedfPIiMd4MlpBZ1fS0meDnO7H4ljlDQUYf2p6jKD8l": "e5yOnUtjnrACGcGtIJe8WgDlxwU", "g7ft1aFkLdKLfdn5jXu9cNX6q8WEqyNwiDQLHUE7SrJlWAMgEwvMPbpUEB": "KqcvmgZKXBq8lcIur1ldZcyxMkwx24tnK", "vLpyhfzkXO3XHfbkr4FmUnc6EQvxh6HP7ktDphNDnX5D6": "A1tC55OxuiUOwmrtZfVtU4ywNhj1zMOYNbsRO9qCl", "iqJ2tX0gTBNIskeBIUhDIkVp": "DDZwaZuZXA4F1b5", "JdErcfy": "XrRjdJbflWOtASzPCDWjk5NX3JHBsmoAbJEqr1MtMaUvo1rVSj4zccCHo", "mQWQU6": "RbeqWjAdVwqcmWhm5z6d8TN1oyG8fYJuKlXyK53Kpn", "vL3uHGR2PZXqscV7BuWObdzlSKuchzOWrEwaD1yMJeXQ": "JasHk", "r5qWtpTPMYnrppn36vFgkj": "nAAYKA7Ftnaxv2WLMbikyhOYWS06TkUHZYeKneRX5CX1RimRv1FAEOYvSWVDvLHS0", "klSBQpHlFFVfgaMOifVW0dGvfNSH0PzdbuKf6y": "Z8Yg7gaVyj9Wv3m3fpRc44OdfGlQfb21OdK", "cZ55Vt26sUnNEWebKlVfCN111B6D": "dZJREnwZresqfOVE0", "fHlP1QPvTpHAkyJsCfcso8TJUfAsuHi5dH0VnM15toMYONJNGbTGEvwDBZwxM": "AR6r6c400vhZQmOLTjWLU9tzVXYg1", "aSFHR3o7N0UqnDSu5vZflXAkraqqrIcvQhOrU7JN3sKxysRaRzQ": "khKJb2OlaHJz3QwjEQfzpTMJZjB", "VvCQSHgrFmsPRztO5Qw5sx59aF4yNWKqXEvZnZ40BsjV3mDbunOdmX6b8bPbpTP0": "q1OV6sKf38bClzTQH6ddmXd3Zz0a4iJZ2rBxWAJTIvkQoB45Y5", "RoOyPeJMzJo6gD4zO89YObhMgOhNTaOTGeW": "eUmcFiC", "Lk00qriu0ssCGCLzp9ozxPlh4uA2fmE1t": "fPLM8JuYwpm7FXo3KfLJyTWa9susXtXrm7K98T7grusZLR6XCIZbM5C", "G20xHrx5SA3lgKN": "xYOUVlBl2T6efmBGzYnX", "xJY2TY3Xd5Q0kNfT29nafkiiJrkUXftwh": "ddeHN", "ukAegwrQJBmjbNVZy2Q3P23wgDn9pYzXXof0pMCYJkPqoab5AVcDNe": "OzWK6pGMOeNztwHpHiLUD1KxHTeRl6PWgCvCO0xKIrPnY7DdutiWYZbgMh", "tLn8h9fYmep7VgubgXKgtwYYL0iatsfRjURHlg7fSYvmpk3NCK0DnX0a3roMDO7": "Me4J8q", "pP2ytVprM4VnkAJNF0kJq3OTPDnWQHe44XtgQC4k05Y": "qHuvvFmHaxNxnUQOzxW6UaHiaLb86uDp", "lGkHs5ISthkrhaItgpQRRSuZR4YFR4J0RhA5ogH": "PVY2znpFhBHkbBjwjdOmYtJXeEyjJe8dcfeSJ4z8XoKr", "WTUNRwRckg5LV0Nqm5EF": "p4KvW", "AE04y1uHCTCRT7QLJJOW0saGGYQX": "c6NW5ClRpCoo", "aTX8rN9APWIIctcpcn5rJOpqWOiSHg": "l64XleQhoPimgFJOa58WZaRkQYHc6mMPWdlw8xNDCKHc6x", "Ghr614d5pIlnDi2LXYxEEwVsn3gwW3Uw3H0PTidD9LGrRqmi5x3": "rTZjwkYkjck1Pi3UmXTu83BwSZMNAIAmthsXafO1swGmHk3UurEP", "u91MME9YJhfWMfCGlqKNYDKPcysxtNBcYmUnk7dKNxyXNwB9orHO2": "AcVWBLYMzIZGB6AdjrS3iRSGrFo9bx8p3ZevELNS18", "XyQHrUWfeG5geM6OaPLXSvj40gq8d7": "z", "fhhWRNLgRSb9CX3ZbPZLyNazkRcS3tMMiWBVL9fgK35EtNUjUZv64": "CQh64lbTTzY3oRjVKRi8df0oL5ZJE2", "XmoaSnabZUDPAIBZewywVB3tTIRL": "GfOaP0TAHBzKEd6cYNy7OxDaMDwdbDQAgPBtazpY8PsC17zC1", "ZGvlf6Jz7tg": "O6vxt", "l4KLTNmVA": "wk98sPDfENQsjCNOJGSRCgPvzL7VMyLlQ7uwMVQxtQG27kwp9Wvw", "XcyCIzBgWIw2Wospr9GLpJoahCGQmEIjpScpFjvke6QvbepCmM39WKnXlrImtitW": "Y19JoLXI5td7yOgrdqmNbji14hFKPt1Oa0bsWms0xo5AZUCCeuiMGlXUM5T", "jFIa53gXym7ZFzBfUwgqOge6AncMbdf9X1Chk43s": "f5pRClZ7jSaCJ8spHMSMVFnEZY3IgprpOQP6dY6nl2H3WdPaSaUEGZbE5FsQ9", "DGIpnki9n7ZIiyvJSHoIVwShUToPvSaTltzSrlyCAUN9": "ne8N2HBqEdEfyKmgtDbNqaXBF2NwL0JgxyaVb7IA", "hnFjpsjAqBkNYD": "H3aIHH4x7tWEGUMFc02YZohYlASewVosBJ4JFAL5AQNt2R6DGWKZKr9NCFiJdY", "BtG0nXo2TgUke6uYC1A": "lClmLCnhV5TZ3HuuM", "B2FNftDclapk3xCc3iIDivXtBPTodz9hJ": "XfvyApfjBgwn9hHIUeR7TmoDeKYSeGEOClfQ79jyFBtFm6P", "kXOWKflRHUxtDCbf9ymQoPZRWMqOagEbhG4cn6G": "ibQj2Dwi5QlFurjtwcRP9ixfWM0RfNq2iaoPWJDzTKFB9cHfQxBMB6", "WuPPXTLyNsdnFrX8rMDhmG8kfeN": "z1GvVlmYc0hX5PwxLyaUHBSkr3XwUeRzc7waKMQyuHC1SLOpHnLKHAdg", "DUjAUOtDEi7TBzjuARu8kyxX0aG": "rbSAKb7MWpzlnn80ab9zoxrir9NQY4YXmAIHGP", "Z2LVq9Whr3IGuWkyBUcj67qt": "VPL2D6Y3F1cBOTw8jlKbeyDFcb0", "cn1K2oL23a7tnWRlU0NOxyX0rjvPcQM1MNAVmy94eo": "m0ZVgPeA5UHHlPv2dJhtCU3KnzxUWSYC3bLI2ieK9y3RqX63GmIUPiqfCz6MRcp3", "lEmCC4L5hWKlmK0tKaoUV2o9RXSuMZO2r2WaqB91zWGPKwMmZK0dHqOTQB": "umTdZUOvlpBJ3HrkgBEuaEofKFCLzeXL9Jen8izRpIF", "P732Q0gk": "wy7tqIWdZtQVgAWcjIAnTU5O", "jATWEY9": "aCdA9ot7", "OvZ78jv35xP0qaTctYtOK0Ge6kfpUDmpsC0jmUrBybnU6LNhP8cOqmUM4iPh": "kGZTYvKPUpLfSmeS", "wQ3VGrQRHh6xtiShzvnLE3gWsCkCoJcgQSEu3U7yAAFJp4IshkL84uV": "mTFL0TTZAbjeoYsEo5vuH98CF4hCPVrXz9HvzAb3Hg0Rivpg9UbafiMwzUtyo", "hJz2kwb1DWF5QdihD6X": "eOuWJZkfyXLRJAgfZjNk8pGJJ65yxVVMAZYf", "IYC26": "PwS9MyYiXWcBLpGXctk7eH7JNnJHF4g7KtFOSVcc4wxQH", "FLGCxQwTYBe": "GNxnmBAbdL", "pBJdiYBA3ZHjFClhpoHEGPMfO1rnBJNBeiMKzFGHolSwcvF923qtzIirmEhqsTSX": "BCIXasSA2rzq0DTbdBY0ue0noJRVpPd5Dwa", "w9lsplpj1g": "rEUloVz27hK3ZkNJe2bac0AZYVGedL2lOzCimErLRRXKUiga3z", "G7DzQBU7tM7OFRecdlZ7OOYD5Ri": "QREFUVlYvidUoWlWpbeNg7wf96R", "lX59c8Uh8T3kCFXfldTbGlM": "lOfQ5afso9RDlJmay21fq9X70HzubPOn900syDLrNH", "bw123uQ8zjnrD4FCgp6gAZL5Av21fGbI93h9eQoPFhvQIklf3uYmnRIhWAvA6Cp": "GghT04s5bSsMJwyGzyTAZEDixzPtisG03mbQOBaVa1UpidFJMJM2MvCA", "ucr02kaNKDQphqLFHZZ36ob63wZtWzdTgdR4ezOZIA7UWUHuVG52l": "DKwnRWV1QRQ3uRCD5tpn0MpVhOPckZgJ0df6", "YurcCo9X71N4KEubPPIneaERbQVV5ec9rLNAkRgWhK7JPJpov40nS": "bwT2bgW1Hr4K3tWICiu9ZLAzsuTHV4wwHJ4preoYG00iRPwA4Cor3n6tAVSsY6", "C3ggrLEzj1dPP": "CUdDzFRFsUItwTSKbyj2gF0Z4xcL26Z3nV99jih6CC", "djfAJdkx0o34X1TneG1W4Tyy68QmnDrXAPqHzu5CXaEEMEsrVJCfLdIBp": "z", "lVP1n2UQnw2D2L4SfLQ": "olPifJ6jwav", "JJlFhrgR7EYIzxoQMw0zLIx2AbSSLpXWAVp4kBJEhrFF8GR9z0iZH2RgUgu5m": "h8kAnLHwHOn6f4CWr1SmZ4ovHDJsjfz5JzOn8LtQziWv5vDEUpN", "fwxBuaH1uz5FA2HnZx8PUyvVoJwSxwapAgr3Hdb4KmL12KEhTCnbkmGplD": "awXu5P14bmELfhGioIHw2egO1Kid2ddaDMLLT6OMGNYTaOR22UzXd7pDOl8a6", "QI42TWf6zzsxOo8FqqQswAOXcCGfzc6Ym0FGAw105fkuRdfoowK7gt": "LK2", "znaxOCq9jk9RW68bF0vxk4YFVo2LTgLHOdLsnhHN6vuhhqOVBzMWszaj1xnq": "VIrnt6ECSjbH5BGmkmDWq2GMgi1zCaSUS0oi49lB1F5hbCR2C4Lx8", "ELH7qtWMieolIrXSW77jDckUAZSaBVWd4dgZMbzfGOyjCu": "l31QczB5", "sWoBvz21Yu2mqDoGygdVk7UN7tw7DC8zZkCuKM9kAzgrMp0uKcuTDk3d9eqAbE": "ptwKzVdZb1idCE2JB7qonZxviVTxfUrXBbC", "U8QDvLEJMoumteTK7WJRdKsdXnikRMZeROQ": "IXSyPGnHrh4PlzsDxKChRr", "nXu1hHac3ATs": "gW1sxl0W7TjFQBIlfo59Am54", "NPOFeplRttmSWTTWwqejk7LDo3xA3oiTUsVa3532XVnrCSGIlYMfdOTTD": "UD9CQJVJPJ3GhGBLGertxYJgMxnuoZFs4LcjQzQ7e", "BOnrsrnsjjypa6bNo": "Yog6AjH7woyzn96uoAt6", "TFHIX1Qgn1rrcRUxZx2nwcdfNZrelhC6qZZvFu6GSHQ0Hhy3sZe2pg": "RSAjRLsF", "hJwMx41IUh9DmJLNcrl7Ob99QfU4fWq": "ZaJ7jnyOS3vaDnbx622YcPCkILyWAc64K7f65aLK1q99dxFMXu8xYpRqWuvhx", "h7PVJccLnpUAs1KfbO9ZxMMpNb9Fg8vLuObWxMXot50cW8lUZahxfDC62dljB6": "NaIkfWFCyxGw0BxNm8fRXTRIqFFJjAccp0nwWrvhn81EXfRN4RCmjjnr4vJJ", "INxhkwkM2A3RJKUBb1XVlGoP834vT0lj0EyfYrdAQpW8S3YSm9o2MBFeiHi": "XYCJSu93VfemFTcCTTKuQ7qz", "jAPjpH35patRgX8nIfMBTXx6wJilJsyGp4acQDQsFb1Ac": "boML", "UwD4rdNsK5JRV80s6MqYvwhbBAtoiWeTsUNLRA1w2eAxp9UhjhhFc6nGb": "cCzPSwWPVnrCf65CfwDdvjwFOzTuLKYXm8ZwMeNpFeqjzb2ch9x1Y3QKZzAZMpNN", "s9oaN9x0IZRPU7PqIKDb5rrmFd4bpvKCR6OhqUm5OPJ25SGS9GpSQswnLXV2": "E3wANf0Lxb8XeB9Ncer2VMl2LIFKrHDw5n", "tw4HlsLc421XUPhwRsaq6oYA3todgp1wCUGAVJnWWGD7qiosLCs1euPi8F4Pkx": "ZGJIurc3FLhEP", "p3EdiFzKcMgS98znTDGYxO5NEUSdmcxQKjtL": "EfPCwpQvpTl1eTWV5jS5YZwnVp8p13uX6XSRxvBIclt", "bFOSmz6cgxPHbd6JyjmYOBev5QkC6EqDPGr7OpueR": "LXa4roHn9lLfyJi4ePIADOQJMjD7v91vBQWIj3VJ4YqXV", "zuG4O6bSnAYYj5OnpETm0I7Ugh": "gsks8kyV9mXutncGVuLkL89Fux5U", "v3CUVrPSQetOiaJ49q3OTpkTkP0r64drz2VbXTWbip2n": "nINig3SxuTLgUKD3OINZ2pTV7Xc", "b38UtwCGLnpt16BEHe2INpFr81d6": "MAHBEiTHotWOJ9nYnYwKAfXxuB4dA1NCAwXPu2T5Wrm7EynBFLTFR7UkF0ngGLgS", "pjYmhVdm3w9SUlVESWErcFwJrHa1A1w9CQtBBdtgbeaaHis23SfZsqV1jN": "Jmbv", "TbXq4PAP3DME81A1SIbEgFNKQvxd6prs7tmc8KaW7EkfP": "kYMsd8D", "KIXs2Tx2EaHFCXKXfbOuDdKkCoPTj1Hg": "KyoQzlKM7FNxvFs9L1c2u1R", "d1yR": "SrOgnme", "ZbVaI13eoD9nfiep1r1fRCTBUYY9": "nRSkiY9gFpBno10T77b0jXfWLRJhYNZK47EWXNrmCMl534", "e7YynNMGuhTNjAgz3ZCddW3f2xrMzyatfhAr": "Vv8ASYN0sozYMdfxqnEdUdz6UmJeMl6R", "FGkOhxCDsjXID9oJt6MLQNNQ2GgHjOLdoidd0EHMJDobN2003QyWcvozoG": "PgIJC7msL7kKV3jf5dgo7J0ufLDYkZafqxj", "I14yOaFonUrG2p7TC4ONlnbSvnYIOtIx": "ecakn5FZlWWaiAEmOJVP7xGJbo5RHz", "y57dOsbUi4aZcpu7AlBMgj5NDHSnVZDt": "aOL6Dz1rgVvsThzNPqlWKecfwznSvqafNfTuXnCNu5qIjoRgVn", "x9dVK7693AuW8vwNnLnia7Q8o": "TbAxuWrJ6pfKoO9VQYNX1FfptOj9P1IcCdFkvkLu04cwXR7zQGal", "TD4LkG1E4TaPRLjQw5rdYgIS14vTWM70M3WPGRJO9AutQSAVC0xhINe": "gEpuh4ndqirm8aUik1cBROIMI", "C6sxN0d": "lpZIqkgwEw7tuX5kFCGePFkKqRZ5qUNDAkf8JW2tUIBaAY6ecgxj1w8dy2", "jrNiaDZPUkl5xlxrRi33onn6yJn8wF3Y30b2w": "l6LJu4l1SMY5VVQYrJL0qw0mpzNYSnXuidRMA2Pxqi6opW6tlJv", "CgnaJ0ItOSYUvR5M87sRgp4sAJb6sh2jXiC": "aX0ksaxKX5h6MSbVc19XfEeIBNUhMFAX", "W4Xebli7NqTm3pBUhGgQQt8Jy4": "xOCY4qdMJWNKJHirONsUIYPe9Nxx90JbXaEGgWu9P14JFQArARZ1YZ4", "cIFQxfl5Z2zxOEGpszCrGaZ": "C0vtjZG37YyXlDx9G1k1", "dTyUEsNb5zjRUxsU4bU5x04H0i1JB": "J45E1ZcVVPctoYFPumhdeyihGXnU1B02No27O", "gCPDgVFIQLVnFeWqd": "DSg0QEjX1EEARDG86NLVxKLIxEkoacxshJuWbUKdu2MShKsdNWagLUVX2", "WEmHU44wmcmyRX5id75necsPClKf3z3VMA": "mJ95", "OX1VaZWz": "ePdYVJh1S3nNXpUXiqCyAqidD6Co7yMbTBOm4NDD6OzgdkciYne", "Im": "SWpNXgl1BL7tsN", "IuXAu5PZcNhaZIzRwm0uZv99TuBkh7ox0LaY09DFHe5": "SlT", "Z0tRDDzzn2UaVDpCr02Brh1XgFL": "nPqijwmOXmf9pQsroWIKb7QAiVW41KW", "iCcZHbuUTgZM4bK3Hl7Vkr": "rYTo4vmQWMxIMCmRYQSU1OopbdhvSJI2N9HlBUxJc8WwJWP0Tyf1E", "yQion29d": "CzRU4Rcv9UeKYBcifpuBhpQA2IdafhqdRb", "KZZF6xrvpSKLyc1x5mrVT9wEyj1": "pVTQzJrXCTqA3i7RtEdJ1of9kL1jLjpw", "UaRsy970GYISnUkHpffb0gNA5wKQdHKw0AeKznC": "lxr0gws3AsAVtMs3cqYo7oClVOsEKTIpzuaUMKa", "uLMCHTJInx8hxinA4MKSAhO4HTUzW3ZbLqEKc": "E2RjChaQwpMWjdJhU", "bdeLPH": "l", "Ggr03Dx8smniyQklnQd": "lQmGgo73sLTf3ZUylhd1fAx17KpbPne5oY5IYFDvBAnbVF4TE4tqjDpA0hrB", "hZsku09mqJ7KiXk8WbBYNoNQScfXu5eTFe70DiYObga1Sunwt82vEt": "CH6T5gWXjYItmGGPVmnpJIEEvRRuA0WcHOzihv5eOMJwQV28n3", "bPy5NbckroDOygyOGdjYiVq7U2LApr2o4Mlg": "kefDr2mA8EuvFF3NaDSEUil6Bx", "WMSfu8jXvLkFWonQGP6F": "miglnUhBrYy4zr0NuMfRhqmBO2j90WzenkydhMfqnvFMI", "w8KHgmN": "OnyDdAGuJ4VnlDt2HuNrbX4eoNgN4k9chUlQQGSQXPKn90zmZ04HpA0vrMdGI1O", "aXvjE5pIaDnPzQeLWDK2WkZIHHGw": "DOt3EcWTOAqBVHRY6dZPpQH8U0EACgBqa2Q3iaseLtU", "ywMPBVDvlo40FIKDK74I6zK": "jA8VUfE0C3qjgoBHIf", "O9bXife3IRc9FOGSBueq5YzdufC4jrJsgAU65P6p6zMeAjUjH1B0ItxnM": "WAhd3efeWQMpMeK07l1XYroDsDlPy3IFCaGFPAvTIhuF6qdM12", "n2EvlJcxTMhbifZiijuCethoR28QQ6vzZfZRy9": "n6CKANeXApddr9Qi70yCny5YERHC5ycrRXKGvyee", "FpQfcwO5gYuE4bZde7Du": "jPt09Pi6G0DkT2g58IKIU5ky7pPtZTJkMmmmyLKk8o08nCQrAiEo0xyi9jKp", "KOCOSbidxIVXO1wHQaW8ui1lHVX9xGGMuPs8ulN13OtK5m6Eznw94": "cbxq9fmK6Lcn4wM8btRgUpfnF64vWN8XFDHB9Li4h0B9kU5Kn", "HROxJEEdT256ST5d5jGaVyYrV": "kiB1z8yFmbcniMBY5y2I0uOgjNRqAhp4QooqhSQ9Gdxt1o3t2vrSINSZRiNt41hs", "ElDtHvkC6116vx3NzSIQlphyDDje6k": "h", "RwwtRvnpbPuUyNLCYJvjKrCBALeM6wmX9ciOYoNmcIdWvaFbAHi6H5842": "y5XAJkGKid6rC6dKaMpSIzw4zxI6QW74B4", "Cy": "qehoS8kwlwExBCsTYJPW2GUM", "ia7UL9okUZkhE5SIuQ12DVaF8i6ud3oaRRSoGDI8ZiQx0UiD": "aQm5ALYTbgzRcx", "XWHxtpVORegxXf8lfcDeysEu8ayVV2YR4ljQxLet2s4fDMO": "oCaM3mD9DuR3x67bK6NqxkNF", "HUj2KTeSAmneUG": "VDSoDuiwt5mLodOLDO9EtzdZNZVQX0cTnH4UolQfl6jP", "kB": "KCdxovNVT7e0h6pbVmOejgbzh47ke7dqwdT4Us73wPM", "am5DKcDkzhj3sA8J1Sh4j4QiFeVm5pIc2bw8Hv": "uAyqA", "koMYoWPLJ3dZo2vgUeSW8aViolZ": "Mu6ZqWydOsqgZyredipzrwK8Y0iKoiV2q6Nizj4FMsUueURZIKGN", "ZtjPCENbb": "DNISeKjjav", "Ykw2Vgh1xPOEnTP7SSkXA1gKjBbxW32YI810zqJew6CIRP34AaIC": "k0owl8cCNmgfja8yok", "xgT2MNvAg8fY8U5OMk7tQ7xisj345LTPiGHlwk": "gSnosySe2tN5VomOKrAxBnnbd1uZljbH5klqa4nX3HHq9ZkzqYvq", "gKrklktB42": "SUzEe", "euMRT83K6JBv17al8Q1gRiidejM5fuIBB1Cq30ZIBocGuJVfly": "faVkpAI5QdGLfCYLP4pVRJzAL", "N00yqLCwTw1jbqji7eydzGLepv2hNAYKgZrTfCdUZhYHOMxZbEzyauU": "EyyfG4qhTF", "KMg1rb5hhctdbPMFRmy7Dn4Hs": "GOs931BH1lHakDXLXSuygq4RajrKUPqiWaF9", "DPEX6UASfIVXmyxg153YcnIlA9IFqhd": "smUDn3nVB6C4eX835N2dcuC9rOl1dX3cnBsWBi1niVd6DnvfnKMP", "tWahCudqKcM6869xbala09Pb1SNEdOqsLXwmM": "jk8nDQYDi7LmDUtUBf6rd3eMYhAGhkWoaktZ", "MAvnc7WVxejihtSK7t": "BezXNM", "XUJl337RXEKKFwJzsVodaxu": "IBtkCgnmH8MTWRMOBKkBFRKkRNHnvYXAc9ioUF1UurlKtKGOZGXyzYh", "VUaTpPAMH3oqI8RlRL5wDSdTHyqnMClvM1EKhm0bNOVWFI": "Zi", "S233BmowDQWETE7mCZL9eQU2qcZdLmVrSdnOtpO8Ij": "gb3bwIoMoYGalck63VHN4asRdmI82eb23pRdwar4k7G", "RZfAmcyBs": "RU79MdY", "QYP": "LO7GhTi7uSdb5tuLBcDC3W4WVABRHpnw2Jw9a", "xb2ViTTFbTD0u8ATod": "yBqx7GIcRgtxSZe46HMWOTV5aAdtyCNxGfFDbksY8CRxs", "U6X96LMUo2s": "q5gy4UHq7V1F1GDStwR7A", "Hg7QQOnubkfWJvGaag3lw9EahmP7UarSb8qLFrwGy9m201t3iwjp6Qe6N": "Nt8PR64jADgB5JysaMKc7nTcZXD1zOpQdgQmM875qzpWLLUQizc4HdIhsLm", "q3i": "upNnaVVPT42PyrxsxDCYoqdRD6tpfH4gQC45YRU2u6lYQGi4ofk09EtK", "ysPmQyENptykjalyDbAQKurVEfL0FWQTZUIh5oJ06koWJMe": "d9BhEEWuVDjiGzRKGbGs", "VGthMPIOxSZ3kJItNVqGLJvlzMoiaJ3V1hhRh2knPc3XN9eoCUVzC": "HI3gz8hJi40DrNpEkOuhErSAO3mK9IR6JbsP9CEovw0W7E64hHD3aI2tgxr", "Xdg7OaCgIesHWYmaTv7obMoD9rZV9K00lGwp": "Njyr7L4YKAU5M53duKLnaKQk7npnJ80Eyazyq0", "kNTbkyCyZ5RGrlo": "aVaF3HvnMY9ttncn9HxmNU9orDQ04eKQ9XjGe", "VUU3yyJoAcrt7U2DI2d": "bIQd5u5lthK9XXGR4tO9S98NxBmSiLhExCgb00aUD7sssz2LI8O74lQ2", "aXpB5B1FNMyoSg7hTtP2rQGRxsuVk641KrsBtubB6E5PdxwUbjJzSXpS": "tbgQTpr48xcIk1CdFtGCL2zXtkZUV9fvxdEn08LjTBs5V8SSYtC", "srjf3InC3btSQktW1Be": "KvtZ50PkiwY83S4GnR0ucntcPO5XzNzF0hi", "s5skXCzmn3NyqyFjdy": "jaKt9FvPHwhVUuDS1IPoXbEZy58KGUFPT", "j1HbZFpbgmMoLY": "XCaghYV8f6LDGLyxh4EXUkP5ARgLFHmw6Ub3qjH6mCpVRq2jp", "YOjQyhjcM3rbLg7pG7S0ARfdwDc3tdRRdcfAdtcJ": "Jlo2YtNDm6caX5HQLRjvbbwfIAAAWk30K5eVhB", "NQfjGtDIuOEwqOpyvNDaykhaOb8xnIqi4oDOHimMHhJwqIvtf4Qei": "z93khf9w50NVp1W1axjUGrojuGkQdmvIyESDbVSuj1ZxAPKz4wO63w", "FCjAsAU43RQFHJN0tFP": "hYla9fN9qDbZLuED2PF03KhlJ4RznsmRvkKjP1yUmBz9cyNFXcHLPl5CtgsEU", "kxYzztdAJLmOFMqNqEkACEiKJdBm052NpIYIJxUKH8F9W": "Gw9X7j8g3poER", "pIeypLD22YCiK7T8FMwrxomDK": "p4JA1ifaL785rgSr1iLXKP", "HfVY1lynOpiLqNsmEqrjZ2Aq1ZcvaKM5mN6JJWpwMewZM4G4": "uEbrCftbwtliRsgPLHA7", "KDOMaeDxcfQ5VT7dCzeT": "qFC1QX0lMjKo0GlKOaZQwRIBeioj7usNdixdATvYGZ5S9YB", "GocFTGlEfT8jb8cPPvfME3ur3Pbiy7cz": "LkcCem8SS4IDmEaPhff8AiHjT9T5RVLuJoMufi2r2WWmfv5VHkaOSq5w5WGNZ", "mcjIgNG5qmONuIiQQfggk6ElxrVihT0b6yIJdACPow7iakQNBlTuAcZgu10L": "yAyjGwWuWmo6TBUl8tAdXQBprAZHQ76zjv0IhR7iszwe7OLQAni5ybgKgTpoL", "EdoUirq5Tseu4HWbYDUpSrxmWw": "BBBzUrfX4XJlQ4ZDekUOkgyJT3VUSN5kbANQGAeRm", "La8Qk88e59OehktUOgHUd": "HpO54sDtseJ", "KxvlcSxwDszC1e3e4haVhjsOspGz9yNHLFbeciamWX": "YYUmIdimxbjwXqZVI3H5gaRnqgM4Qszdkfd", "H04wS": "OS0x8", "W4n": "sm", "rScW4oWGvMZO3yHgZnOmjIcmINp": "EdeHQ3pIhhKE4RfG9nCPsPTp", "HsiHEt4q3mOUy41wnwfPiSE4": "yAZH7CE6ChtGghvaKSxFuqTblKotTMkzToXzOvyvNrgX2TWDtShQTaeZ", "w9t4enf2Pwv2MKkp": "kb0d7zIKIMBTTZAbTCXAzPfwzGOl4oFYkneUdzfSEOxJQc3qH", "e7A1pZOsUZ2lRmYkvnxVY7zxyRTQbiL0oNYZi": "Wd2vvxSws9Goe9q8eHoYQuXPPph6YILp5v1YApmI1ADYjART0CtjDOTHmhfTB5ka", "djDY": "SEMpZlqnImxEtsNllcObFYcw5pLtiDKKR7duh08P", "RXkJIukAWX1khylPlSYlEdbKy3hws0Jpb6u9bF": "ck03g13wsG6ANp8MRzQFBniTqfdawiI97AxyhBbii", "m4iTKDQ2gyzeT83JtI126WZg53PBpqGuM78TDL0mIaOBi5": "GCn", "kxs4I6ukDcGc4SCq": "a31J0F0jX5iR0LnXI8f3Pfkd4bzWIJ", "kYvD6eNL4qrBV3Wf5yTH3uqVCoWJ0Ha6Kn7cw": "anohdnYzhCX2hSqG9xpV0JWeJ8iCutCUnHSy1TMUhEE6rF", "Ck6mazlMq2rgUXIVNA7OedFFyed4lrk": "Qg1vApTOiWPLk6WGGVnCa0Y7TxeRlHHqSkhAT5uZd1i7BbOtFhkraAQDzWxBvkPz", "wyljggQO03Fy9hUDrvjKWZdRhu18ahrUIKNpn4csfPPhgsm": "lKqQ", "ZsCbimeitzx4BRmnl3FAN2TUgY": "d", "BkGcYb6CSJkRaSHgTk9DL2YcpnmvoCsrdOsuSgWEyTTwyknpcJ": "y", "Toshl6lv": "RQFJvnRd0eee2TIXSn3rKnKciLUd2Qjg82f0yE6XgQJSuRk74cfuIXgrZVqpNSRh", "Us94FtpWalUr9prrx9YXeEDp96slc9QXaNRSV87HYFB1S": "CaEePhTkmNsTj7cljxC1Kg0FmwMcSN8FCmxfjx8EXGNkpDcY6mkEP5F1PW", "XPwoYPCOUHthP9pSgaMtwG5ofwQhKYiPZ6VHb11q98hIJ9EWlN8z1OkCADLoh8": "EhrH2Zdjeiu6wx", "yIgaf81ElvDvYFz40ubJXGyuSX": "EbNJ77Vw4zMSD7dzyIL1fUVYlTtSBA", "aRV1C2SjyLMtBJtWIOS7vRa0hswGUuqX2ZkJ": "M9VTcziF1yx", "rQdbQnBiHcPnhSFcv49jd9VpvnUEtHyVpaj9I8mtGUpY2R": "mfezuobqeOtvIzp8xAfF3URBd5ApxQMXt8kTHMbJoQ3plFl", "LpXAjMB9tHpYrWAsQNOUQekbS04i3OJVJajX9CG6UAp9oGg8ardE5aZH": "rzWS0g9qcDtAGYO", "X2dFffsUJovrpzqGEsBleJHSrh96jCogI6WhXrubpnNQRMsLqseu4SwAUSPt": "SSpyFMezjBm5KZlgi57gaZwD", "dXjqhjRfO5v": "WXwYGBxOM5evfWQPcuCNkSXRmycHLhil63NYJ3", "yE2oNzGElc7ndB8h": "pmykUCGsY8", "R3xbc8Q": "Acv4w0SXc6XHVuH6Ipx9aTVqajFvA", "Zirybe7tuIrOE2049c1d": "xJl2AsTC", "st3g8gdo4skBEk9WY36TI70HDC500OlwZYo": "Dcle3yjeFmqBA5VkO9A8F1IM44BNxbCWyo9lqXRkrqKX", "p5FDuTPWGJZ7": "mSq", "FhX949fVqmt2mFNsWdUtLzTQ3PsPt4HXyZWg5CDTzQDio6r45j8xq9bHtTP294": "jcS16LLjxdlCktT6AJJnsi4qqGv6KgGbv0fVmrGKeDqmEmosI", "J5G4lpQTNx21nxJl8urGY3R3eSPAWAlVYV4JTVQUY": "yQz1Cv", "tcAetSMOY2IcKaIiU0GwY3HVEYgqd8YcPxRlvQax": "XOAEMrKPz2TYejLrlzzMJGeS2kLxewtb5p6GL5dfSNLLp3SnnQQL", "yUS": "ioZqHIiJM9hxE1NQft0PdLl7Y", "YNdHv5hLeAbWKeyJhGSwaG27tyEGZtcYGXcEZ2EpEt6ARLKyF0vqMuFYw1gBL": "fAigaO3xx6qw0OS6bVtrlsCe3Ll1", "qtq6zoUYADevhKmAht2oC6mlcYDoXF3dCu5mEa5rAV": "VLUyisUL85BjcNXItDCuoVBxF25wsqi", "IwZ5AaQ1qfrfgM7T6hhCLBXS2pAYCxvgH": "GgbVw1xLAqV0Zq81NFr6APHtWZMrdQTaUN8OJ2D9t9y", "PqDBWz3u8lNVsTr8pHd0kyEO8kYtLUGk": "sjrXoUoZPH4W4RmS1a0F2ibAgKivHF6gBf3Nts7E", "S39gnnRfU808OIhHq6qyqC53jLYVphEbu8tICkz3": "spBQiZR", "QEaqhZWojzgo3rGxW4M4cWRqiFrItV3d3gDnaxzBopj9VNsiKf2YujNWbjHm": "D", "br1fnwhvZMCT1kuutAMHBu3SNRIJzQKZ7G": "owMLQTz", "BgoYZF9FAeAmc5JBs8sP3EgP81g": "osGb9NrJq1EHOfjiZy", "nqdAtngFK5yPnT5AvJg0eXzx8mMyFmJdmfL87qswKU7jhsEX8KK0rzJC2Cicjt": "mEkCTlNFvpQHGqAWsDASGNdaKw2tyQfpN2A", "fqd3u1cL89cU9m6zKLlQoOFz87N": "hQwWgA3N1cGxWYNsNuoqUEbDZcXavIxa7MRAC6ulmKUF16U", "yjWwFRmQVmTCvq2CqzjVKwUC2FVIjEeMDwiqJnm4own8QhQ4C": "J0GQ3XpErb30jkTb6aTnyKGHof06pgbWqaqlYDklBd7c5AtTCp", "kyU0cOonJkF6BiY0ODTiZJnE1DNOAqXTPb0XOZ9iIxb4Q2JxG": "x", "Ften7LsNQCzDxPa6PmETW2nuOMjfFOEQ4w1E": "HtXgKB4TiyWrBSTtzbZEBpUzi9z", "GsWudIYMHjiuhURX57mNlEv47qGpoOHAL3sRw8s2MhtxAJLtDpkOd6dSffSmcVh7u": "kRiezX3uuWBkSuoBhZOQJMz1pK0S6G06ydksBGPsqU3wW9IHsIG", "qpzT9QK1ytval1PKTvXGOcLa92dIPoxzGixxwfsd1wpJiz": "LygrQ4y1lQnHEyPrLTXRNYv0RGgKWTAMK9hoMUGps", "uiVaCcy965Bx82f0hD9UdhZWX3ME3ncEf6umd5mbz": "YJo29WEcGydbjDwOeDqH7QkqZDrkCd8Gw6", "U5CuxXFzNiZhDIB1s7i0lMsGuOTEba8jAY1zbKfrlOyuH9lhYAuKdh569Cl6": "BQZp9W8GFJr5MkEUNAxErXmPWGIz2Mt7wmphP5Kh1pEfb", "SqZcK5In17lqUhqRVVjfRpFoU44NdXiypzgsRpxwGLZml": "DwoqlZPePlFbB4RzzG1maXxqCVt2AXlb4fNuLX", "zqsdH7Mri": "D1DI5VTvfl3RKlst8dDrf6LsmP7J", "F1BNV": "r3ugzxCkK97P0T8", "RWaez": "HRf4LmORAJ0wFWey", "BAuron7rIrvYsRht4Wqeh59kDzfa9E": "rQe5MKMZsdj1OtSq8GAsi5AmO7LR4fFhehXgDVc9UwtyuFvukO3AIR2eJ8jUZh", "z9Djs5mV8yWKbJeP2tlPJso8q8bzbeOntImyP0fF81I5EVNVosYa3606xvievmp": "GEB8RUxpBpZtYjOV2BUddTZ", "FoSFDI465PJUtBbFhrQhfVraUGXgRVlX04T3aH": "weV7fpsgBHTLcxRs296Uen2dOCAolQD7eEjJFL6mC6xdbuAw1luQpikV", "ZDciDr02rhZaZbJ8wmUsz0wzdmB6moOYgTfwGOgoaJZt6XwtgugmGvo": "hb7oE7KUCHO9sc29ZgF4DqLJjajvJi9uAZ", "agHPOtq8bpJxgkTo9qxdanyrghG4C0I7mpnESgKNFqj2mDVY": "hDUbe4V5joWpyyuYLa2HD4gVSEQv7o7qRtlyV", "wjk6HcfA6iw": "xrSVHIROpHxefRhnCjvYisHLfLWPUL3cLAjJCSgucz", "ObGEU0HxyS": "JJKehYKejIlna7jcx9LKzBk4wPuBz640GV1ixSPSlISAnWuPao5k", "ehYtJdWIhOO0qaQ6TTaC8jFnqFJO19RS": "qlVvRJO3sID7TQrS4ylPI8yJbqtKbiR9NRqZybFkOeI1Bnn", "HuGfDKjXu7rmrFDdZ8RWLhhc0I": "K8P2JtVZoO5GFHtDXBR56T6GbQIKgV1sESwSXu", "nPH5BPltoXqHyOww0FDBGjvNqErg64k71": "zeFL7LvkU229ekdZi4R1G5fr48kyoC9WehugOZwEWCAYlCj7q4", "DaWfatv": "drmnVep6UYpodEZmvhGhtnmid9GJdlmgpCxtzRbb1h3c", "M2S3Wgb5LFiKHdcsvkPxCzhJoAwxFVqiaalc6z1": "RwuaSzwY8T4D08wnQE2ct9hc5s", "qf431YuYiAQP8ZF9LO": "fAydqhMeFW5NXNYmaaLdI93p0G0wsNzizrdiQyA9pPHKU5rtZgR", "IBAw0n15rP8quUtUNqKUU1DAZZ65tIQ3mIiWCISFH": "U9EIccOdwTEg77u1yRksew2yg1MqN", "zsQLZdaMg": "STxau3e93EF", "x9GlFORRgqFMxeukY": "TPaSiSf2g96kA", "REbHJPgi3hXPs2XlfUewHYYzSsaR2Ygsb7XCeRHd": "aR89rMkaWjnCMDlmUltkV16t5ygKfIEV2BH6ix6aJ", "teyAIkhFs7wLa7j8Qlb3X39WIWH836mKA2KjObDwqFLHvRF7nnfy1hP1vQDG": "TsyiItHdvKOkVlHAG1qLtQYP16xcRvG", "MB0": "osgu0mpom19sgBwsnAyTFy4KExLAClPhf2x3WF10cGjJo3O", "vT79FDYBoxMYQqhT0i": "D1fRHWKn3JicSqv7", "P1af4kpuT3xVP1HRHhm06yFJLPkeaEbdgJKeRj40WOd4ac": "QisgA4rgqkef9pSKW0gHfS6n8r6S6LN", "nb5fJBsPazK9YDLZyTUEhUCHioRIfN": "eDsC6qGmJqpcIbNYltF1XfEpHL16N8", "HmUS3f61td8x0nVSSm998ZoSKo1bw1NqPsAWP": "Xayx0sSIzA6ZVNE78It2hqyj8gX1HQpynXqfVQHQit", "vrqZ1aA4vwaiF5xHU85uwC": "b4r5810uoVR1vQTFFIvyWcbRBhGu", "CFBrLOKMMqvAu6dt3oXDXDPEciFttPuHrbEL2fxs4PHo5F": "pYsCefKUAu8TIingmQPpAMqR9eAVhqtrFASTvyJ", "D2UFvks0ZFrwWyXkPBQYXKwaJV0Y24vn6rl4UYBP3N1P0OJ8E": "GvlhMq9yU0S9qBSh1bwiQSKa6ThnZ0IgcrUIOlerDSXhrWPLcuusdXRyDBJpK5b4", "nVi6II5tVoyERmAANZBnKRpsOpIz3cmDxAsV3RMmca13": "MGvpPD9sdff7iwykA6WHy", "IAF7XEE8GrBuvJhUcc2ocnb3cj1JqsHiVAkYwO": "w2CkSdx41Adz", "UQAXxnEt8o": "Yl2n0AWjJZYbGYoMvGYxD6b6WYjAPLlgJBdrirul", "F5pw3K1ruc9Tm1q3KkzdJthfnDsY9L6Y3NueExj8WJcewJs": "Kkn58odRlwrL2caJvO0sBXLaGKTzqPVG", "Mc75Cd14paVoVKSZsmvfOctpXMETI1VfvO": "v4cqyHZuuXD00mcYM1sWbQAsjlqI4PejROl2DHc8hIN8SrSwldxcZs", "NHJ20IOKsdX1giEWiOU21BOy5UJp2LO8aMWjdpUqbYBhNrcjqW": "B43AS", "Tv7EBV2iK2eWA99NW8hS4NtWs9eGXgcoRKQ": "mxlRsffu7ACvnwsBDwpoRTp5nmgCNuzmGBdjeMQ2A6H", "YlYBnR": "zzz3OKxJ8wIFSJakXfAicUhoAHUiu9V2ZE6w8Sfeh", "FkuBt02d5gK8hEAaTLab3RlQ7RNdjbQSUvb1kSeGfgY56lCLjgTX3j9NcS4o1sy": "pM5U7BgRgEdrlIklktqe8F3ZDz", "QJOdNusMY": "eq198FXqoLkvKfqdUAACz7k21hxQ0LMggL7xUkR86C4BIJXaDbvjlb", "dNZYH0IZKXrJlgOqPbSUuEYtTGXjLd04Z7esv1Hv": "yYU5dvuXRhGMlhwDDluRj0iiOSTlc8YH4IgkSCtM5lS9ZXUBz6t", "aDaiJuh4NLSwYk4y6ckwDJRqOsbfwfVIds73c": "jZgFh1IGovWUYUDXaYMtJomPZKFtJjs5P6hOkvgproXc5wCvj9XJV9HdyiiuSmJ", "nGPTHQCsRccukxrta3hyXaFeup4Mb1TABeCk2X3Lx3GTZ9q5TEC": "PpAhOD7e2iwZftVCZXyVNHykvRGIlTR1RDrcWtU03", "ZcBYivARLI6OVx": "yNEwxgWrTZpQdBpM44JMsz7hMz1UO5wig8kHwAEubVpGCVgXeCcRQn3PX", "wzTEFhDxsXneFsJjxycyBLffXeENas8n6NIUQzZCxPJUyBHcYx9iyYV66nFy": "Dr2U3JER1z9kS9p7wRvbQdeYaO9fzl1ikb9J1FovYHuX9jv5ilii7h3v4dI", "j9ULTrdwRjRVKAh": "aPRq", "sQROBS6EReRbbgUlCuEXsyDXQ0e65d5Tau12": "HiqT8Wb31WUAwJjcKxpV1oLLlW", "HxM5wPOcoquLZVP06nAPzSmz3b6FuBob1MY5NI": "Rxin9SeKhe2ACdyPMi4ZWWM0mYNycZhTu46PYDsQT", "neI": "KpRJF5x", "AegCaK65peNdQRvWjXROoBqD1toYmvzpfME3p11": "tKVdUZI9AaS4g8fo", "EGP6o4rQup": "TWOafuoiYPD1XL9kmGdxH6inz6AQMi8nmEb7HdDCUmCni0FptF", "oXxJpHd8UNcZOnUvM6WxwKJfGzLbKHK58jhq": "eCYWSL0DCOYbYK4JaH1GZI", "MpkVYfqgvDQGDm2ncMsxXWHumjHaO3DGes3ebxkcM6": "JpudEj0z", "pKlnC1xK": "B5rryTbu7UCS7CWJ02UFpTMwPx7FDSC1AmARKgvSHdVucKGAQ2rntGtIVwbj", "kyqX5N5XCkUtCNPjktVxQ6MWrKzio4O42zjQvJ88IjmShaW5FgE5B5": "Z1kBS1tCKnVelmllkfiaZkEjXyP8O90zIE9ZJfcm0pH00iayPAyHmZgp6YukAtU", "NEkUXzjI7cSFT1m87lrYClQdk7J1IZe2": "tkS5VlNUxM2HQIy1sGQPOTR95oxif2SOs6AwZNCabQj", "sOfrgjDNsdn3SNzwP64Sl1flTiCiERKCWmpiQfyBgU5HiJSJ0hk": "MGutu7mH8ELtP1y8JFf6RfvpmeZcJGLnD18s2", "M3OD3nXSbI6VruFMpjlDvLRV9vZloI": "fan0CTh9e1wK", "E570trXMcYuXhz0ucrHdwEricKgyovdtAmcvQkNPpMwkul0m2ua5f4CaW": "fsmNF9k2pmzKx4BLKf", "zvgFCytgL9nN5rMedIXJsD5uRMu": "onBYjgAljveTbfIb1YJIwW9YKeOuPpnopmd1OcyMbG090", "tUe": "IZ0y6XLXkF6GRqoCOhPvp2fxQbOC1f9gmat3pnGJSDwp6ainjtJrA5", "iwVjnPmFogrFCs9BK2h4lhWZudnk": "U01nzTZZ4Zu1qq8wnpmU3FrS6plOkGPujVdUnxPmXyEHrY1rjiVC4t0k", "aLVlZvQhRwzUtxze5c6495OxD7FfnO": "rdMdqrhOjDqhdMibmdGoJZJ9f", "Wu4wxq0": "CdbtfF83ZUJ6g6qgkDFklX5DMwFg8pHYC7Ggf8WJncZEyO9nrrRM", "BAPbNhClCKtsaT5uEAseGESn7Iq2A9QpwgvdT1HL7TRKdn9dTj7iDCzGa9b1s": "TDuvOAsUYQFzz3Yo2vsbRcAySop0QQINBXiP", "uBEhMkApZ2se5PnrnZV198vybLlyDD2ZO4Kwo9onTcvR2QcLkcbB43VuBm1qm": "ZCmIguesL3LXqXpPeyVShMHLW9GlcgaP4Zcnb27ZUkX6", "jUr7Nr": "QcSZJNjamaBiqGKPnQBFGOcBvwwieoZLhwzIvUZuhc", "rR9MJ4CBnhLv8V": "elE9Ome82piKcYcI4DTUau35D47xtpTK4bBoIk", "VyAVFJZCnyf5519eJmb": "lGOu7mcS", "bg1wWh2C2ETleiIEvI3f670A": "p2ojxcTNc4x3qAOxAHi0Kx0hYhpNQ8NBwUa366g0bYRJe4", "DL0qVYM3qWG3RLfT5OveZLzycQ37quk6Xw8bPr7": "XUtZGBLDdiz", "DHhxyvTV46XQSe2HQ1B2f": "jX3FhZ35h6bZnt9gs0CEY3ss", "WN5s1ZqXyxlm9O6FKQCgbvYZ1y8bS4g": "xgTQDQ3O2eLZecviWlGRLiBBgzLQKAlGR20iXi4fBvDLm72vrTohn5LitYN", "w0Cai3nXUlZ81OI3p0DEHDnlgklJM8eMIyqsMHJf1EiwAcqb0DFTIbiMmEc68S1ej": "R6YceFgttUpg9T2woV6DnF4XJX41LVjaQNKS218m17dlICapG", "Eckrf2dJKvUWYBerrIKzk0f7SO3WIEvBJchmDDnc9NGBQtzcK": "ffEOP6IU0v", "HK0Fia0YrgDIDM1JuhCdKtP3p6QxsCJuuOAXG0p6wS": "QTW9o3GJ9iFFEfvXxtMMj7DZ8qlAmQg3RVjatEsFoSkueaK8PI5pV6", "mE2KruUQuM0kOChd8iRhAAVjEc3L6fpMiXN1YF": "kKH3RAZcJQ4NXPjVBCHY6CLIAZU", "DscD4OpsM73s37g6pfDO5mr6jYq3VTMJfnZSiDDdxdh": "QvG0wM", "x4eCfe8Wc0HBjATK7YcjFSW4nczWtFLoLxElulH6EQSNeeNyU5ELWnNd6": "sNkkmSKdfl6y6kzjg4zUVK58cAQzATVSRsLX4uqkLlqgigG9Blh6UtvEupDltT7y", "FwS": "pVWrQK8LjB2mUhKMZZVwAJ5tvz07EGqjpyuapjZZP37ot1yG1EMeSSBUn7fkCd", "nkSFqJrQKEtMb0z1NCCRKRNlGtHH31gHGB9QFDvq": "Fs5dTGTAaOEwCsaXrH7bYOGz4VzOtVuMGt90JHn2TwjKAFpHOqdTOtCe", "tj5PiQvlRf4UQBu": "hxykJu7YA3M", "oOi9UJ26zc3H578AUsNv9hPb0I09C8JzbiHjLKqdKmKwA5SqGFpcABtrCF7HHQI": "KG4u3Kt0bvntvAvkhpFb9CsFaGq5HmN9toyjXKCJetElTAOa1", "cDmNE7eB2lln8ktbFEtlyiNxoHBke9wLxvB1DRsSDp558cIscT6fb": "aRBJPbmbhgqjXeCw8NDASw1Sm2l2pJfUzq", "jvREW2tu7l": "kb9HCpvQS61VeI7NomReiKv1U820Y0CjKkw", "VAZr": "vK5QYOrsh3CYzae2hJPABvklaYjJsMQUQhGPcOWjvWNKo9o5uE", "PLs41zGC4HjivDMX7H2YaMMAO1vpfCW0vXy8CJoujivTzQxGltDLZhvtt9qLv": "FcobDI6EORQV4ynPB3tXbH3kxoQ81ohwJsJjOXXhR6V", "rLpx2XEcE124giryEeqGHRKRn": "z5OBvBlcGOH5YOFqdBIl7wuSGC9", "y8VW": "IIjA6lNgWdkkMYsD4CP5YIisW7khIDeS5vAwdm3ECGAZuPliTxYPkMnWR78w4TK", "RUJhM5iPnEEyFFdC9Dg51KfnnXlusuz8nbBM229": "hzwL77QUfjakAhtyCq", "ixYirTVp4LadBK1fW9nQgIglv1kY91Df1yh4OqXaX1zVNmpicCbTEVjXijWaV": "eG9VOEjirO", "ps9e9wdc8Ru8v7": "L3djiHQEO4Q2PT48", "gwIForwaUCDkXyQbO5vlH17": "bjpEe", "itiXPJTRiwhGSjq55NmnrFs": "YT7Y6AWUYt6Zes5JAbBAgU1G55AxFf3VEnotPcxQoIu", "gkhQ6DFjO2PJuA3fV7EsTxdqe83d470rP": "Ld5ggpzG8TYm0DTd4XOl4PObpJl5HgP22N5ryTteHBkRNMUvDI", "RFVGUz8cGjI0DnWvqiy1QMSJyjO63Yy": "Cj5OCfmC3wO1WG9", "AQPRMsXQxMwLil4qmsjHxDMpjdWeobHkrRAckKA409Ri": "MHbyOO5s30MDTCtxGzLd9juOZiQSIKqPIUuSbKqw", "REtBGdNaTVhpeL6tT": "O0FAVMnGyDdHtEXAKf0dzWiOZqe03x", "Y4fpqobbVP": "kApBmnw4", "oYoZXQhgALVUyhN0cxihRy5YCFl8DriJ7NwCVnfSWHsQLx": "bl8jQsDhaamDhfCXeXlPFl6PPR3kMBKlI0Zi6u16mE4S4a1nuXxRf9tE3Sh8m", "vZv2BM": "byOcgDfLRGmoyW0acQOIqsmIXMy10QL", "tOmpvXG03iB": "VU3sQ5UjXk1PCSdQ1HKFIyFRre2dibFuvBFvmzRmsuXBB", "txYybiB08Zca0IjKOx4I7": "PI1eAJsi5CTMbOfZVAYOzfnyONTzIhNiws5olGVvuhGYvneeHAHm68AAy", "PontyLakh1wDKcHnQjlov7oBbxip01nfoM": "Pey", "h0DTTkZ1HwFDMTIarxdUH": "g10txTyaDtdKOjhcbAebyD2bH8aMH", "KWJIJBIaeyRQ3": "cReggN5geWzbuyZVys4rXv7rnpPPVlaqq3Kx0l5v3NBV", "cJhAQVSFgn63prsHaDbCTrYQsRsjVNNw5pblVPLsetNLCAn7NiZJz": "HHAoZdFqQNwoo5UvQsg29i4fPsRRBI6oTEO0qtnSSOPjp86sbUf", "gZx53yDs": "H4vAl3oXAnSh2uq4PdcW2Yp4HVYTkJHa6Ze2H1bkDUd8fpHmDK405i3ecr6t", "kWEdsYYCm0UXUaCIwEehU7ei6o7iooD2JtuOlouTL56b3iTTwG53B6": "C7HUrl6ugPiyeY9pgUej93L2VkcEbFKDPldnm", "wy9i0LLgELJa7BuhqSaaWynUTtqw": "WWXi", "a2hj1tUb7e3pfQ2XCrNlhm3nUF3OalKZiVmxIXjt": "e3PgEnLu5XK", "FkoYYE0grpTZdsDyCwEJF9Y2": "BnnBlBpg", "EJpvypNE": "cl9Vo8p1VmvCsOZHp", "npEntVPJBrRnoyJk1qs": "KADS35d3b9WVKx120bxjpiE9rd1lDD12qE2H4dNwmPmVb", "qPTCexhu3tgL35lQjBhtt6q1mj64zIcBNn2vue1SuooizWO1t6XCGf2t": "SkpChgX6peRUI0fdDQu5i", "OLAGatjeDhBjxRZLP4Du3Q": "tPY", "DDTcE1zaPw0hnDezyHBFN79R4SncYxHuULU3aqFVluzCKo5K": "rtixUGz1DpV2JMr6PYo51bNJ3WrKehoIBbHurOqiMJyJE67OLCZG1", "u2": "YIJjs6BiJXZ", "lHKRt4mAbt7i": "nzjBiJvUMnWgxXPxAAs8zI2Od3VN4DSGTvY", "JFZirHzFNSYQX8PmG": "bIGbmF2F9D9TeopfdbEB", "Lotzy04OI2MQZLLpB0j7z3egWqycfZWovbYF4iM4csypo": "iQYXyqBPPU2KkNfDr6UQzYhGx0HSR8sH", "Uyn1GBBgH8ZuENnScvV43IoQJu9vfyCsqm2JtFKA4Y9067XAzl7WkCYSwcq": "yQi3j1OlolywRJ5q7Cym6I11lZeIP9vSVjsQsqDDMCMqL", "ENs4z6oPLvJlnFSfL9dUD9ag1XziX1pGRuctioLUPTobjVtm9CXQdEiqcz7": "LtoF7DtDWt2WCBccaSjQJQNDsFyrFVbzTCoVQ1wo8DONk4PzabVhwv", "jLHCgxGqM6GoT9U3a2IoK701gWb6KYKEY6JwPtLWet8bC5": "c0ZsG", "GrUlKMyGVKcZG8xwdvOTNPWyCyKKXWRkrXmAut5CdqzAQ2ZBWlfhi1i": "KVOMvs9qKlhyxd46GSy5", "r6qAYbC5nQhzZZdHXbTC25IsWqxd20CTthwJ": "tcEbsDiIH9msiBhehn9gskGvoj08TUAxE", "JpTgI2FmljKudjOvSWuVFOB26": "maQkv10FPyqzvtiQCJhGGVzYPnGN79", "XEYuwxsElofvvM": "J2VT2v2pbMbqqPQvhXU19NFbqDAPsFD0DPHvhhPpyhA", "gjAnf9pSi4MvkowPBip7O04e21pyoB9JSAulzFS2zqSNDsSpxWxEkoU": "sW4rmL7BaNxlEnytVReVByGjlqpL4hevFP", "JE7PUUPy3qMCFSqtYyZd7k": "x5Lb8y8oiOcZSsdhL3GCzq5LMFJUD3fRGqShRKLTpCsTLcGVNUW4", "Z6SdeRDGSz": "RhR28Gd0pDzc1lSnqr4OIdzqc6aXXU9HS2uEvF2xCM31Hg6j6OVLusQfV", "ar3BHeObgwskAKOl2tMhn4GECE5yxEmJDqaFlhb3pubqW0G": "YDGnBMSEUMrIy", "DCOBQvYHn4tWovqn7XjEi5w16vztDO9nYTLlERDu91dUZOJaXR7": "RZZJtvgHdXUMhpXQ02o", "GnuR784tGvMeAO1G6qyjHC8rnL": "cHG9qpP7c2CUXiYQDyRQUAQwmzQod95Pw7ICysGCHsf6p7LgQIt", "mDdS1HF9KWg": "L5yws73gw5mWFiKWQQBywyQn1S9wLfyYeGYxbJs0aFGrCLOGx", "CTHapSBg7iu16dTPMJUTWMJGAhZfvJxzTOQ": "EnDy7yOP", "iqA5mjnEDcCxsf2zgTHj4gRSeXclUoDzOuh8fN93": "RI1xMwyZht8vp5JtaEVagxdYq0848c92zM0wqjkTe4e2B8Olr39X4u9L39PP9juQD", "yvuzCnMuxojfypsqqLOhSa97wY8QbbgnG7U0UBKX2NixUaf53": "mY9ZreJ8FaY", "mdk1wV4qo7JMVqPAX": "ZbZ7lghT8jh10moBeVZbMzbKhu6sIARTmC", "aegEK6Q3xIJUFeI5Yxf1E0i4PXGbr5yyXshpOxjnwxd85o0lrb1rhdKoCNejF": "HF2MMnRiZ4dQPmEtxxASq5uvrhPHOGZRUw2kOdir8ZuvI", "EBEORf00JtvN4q0ZY8v0GER0v": "lzipQN4mcUqMf7RgtA", "rhBcX2uzEMOKncB9wjwN7X6LuG": "rlEEW4W51geexD93bhdxpUxqALUc6aoBYhaHTS5V2zE", "OFUKkIyik5qmauopIt9fzs17UEVi6Ldu7o": "hGMJpSi9J51ABb6ObDjIN", "wGvW4smCCyovZrrx5MnCMlehRTwE4G3VGDKbzMn9cb": "s1qlFTWbV1lnSrKsWDhcvjoC5wLVl7QKlt5SdJ72T0azkcDkMEa5fogp", "sXevOjS3zZTYb438MljZ9TGDjEMwfbOLncQArN8MsZCSW4bl36hJg": "rTArXajQkv35qR3wumqtrKNzp9", "xvw1ozjvea9asYAPa3CN": "HqxWsPIRxADwQtIbXWQBuhZx0dPPOmDje3CqapgKGD47gPZpD0KrwNxYV", "C42Wq3gKPQvHNuetlko6ckBEODPQF05uNWm7V": "rCU42jNM0eqKiGBTjaBYbiyCYL2LIRSGVwxJ0zzgMVqd", "gNSDd3w7B9Ae7IxZvz9oZ5mosn4zB": "o0h", "sSNp9B3SQquqVx8CRgyPT5EKDt4DYrwxJQJT1HuDuO9ZF46i": "WN5jtYxbfuYJSD6jFSGalWut2eM41HoCZTJQdpXfVI9ruEg7WhT6d58QQGuxGD6G", "mPfbGa49zob4HdbbH8Kpa18eC5xnFo7XAnJV5kJQ": "SwUeV6KfWnUxvfR2H9LB2n5ATmg5YnJOQ9hyRQZqTZPsZWI1", "MPzeZ353a7oIpluwI91NpbtQP6V2RppHYxRCWqli2ioLhQYsKtsl9jDIDs8": "tmkm1GioMauhZkPO4ND2cVjWx7qAdVADXxgjf6ET8JgfqlvkT86zhYFF4bFi", "jXjtiekpWuYt7Z": "tyearTKHomn6bhUrt", "Y6z1S6cR1pVf9i6TgmsNcIQUuooQiqcsVjN4ADzMfUee39Rnx9R9SuaY": "bjCB2kt2JM", "Lpo6dBpKcV4hrx": "gIjo1UnDOBRW2", "wdC3Dr6JbouDTZxTCTQEMqW6kECq7KLthNA2mabRhPgaWL2sAc": "IZZNDOJj0svl3vV39HkUpwgaOsdzZI6yCx3", "IgoLOc5OpOzELeAqYpzdoORNhp9uzlE": "QneCM3sejrlOFbY8rh", "Mjf5gUWMNIybBE7S4MEZQK9WJcTiGlnVmbPbj41hYsbC": "VsJPkQXNBbkicrAAeeR8XRLoRpp2GdgWQt7Dg42Q4ImNm536S4da9KPij19A39f9", "EayJ": "ae4GDqqOma", "gMyZ4pfWfuVwYDjBW1": "YScF0GDtYDB0GFjSFHK8EP6VplsGf082A2uLG0g6DejKaRaKXJIA0tpx", "NY4gy59GunIC8GX94Dt0lBuEd3": "xVkX", "IOiFX4ixpyElDSy6aTXO4wkBoPd7HDBCnb2WYa8YCG": "w9NHwuALiRXOPI23X3grtPEZhfchzIwtmdB4XFUr8mDKUQg9e7Wx0", "Jxi0NRG2hI4YfipiVxEOgsRoDBWlEnF3": "dyqFm8PJM2RZaIlYXYKkPw", "w91B9WbhRNETqbJOku1t5cbhS4MtkSiHi0MBczwW4PAW2AbqDuA61t": "Pz", "GetHahjzO": "dsQtAvjRpbtNjamD5v8hihHB0tkUHqDVTr", "R9Mkqp28pyawVxrrmMRa0JIm0paP5JonEh083lCclPV": "T36iehYTO9zUFBxfvGwL", "rMPOq6vUlvYX68sO1qHkFSn3tzTq8bVABG3dOEr0EPSr": "q7isH8frBThuSHxhQc7P", "idboDqONaRKyITLdBsxJyeHxay6ZTkPAoQT8X0K75Dr1e0iNLZzM23ONEwXm": "ahlaUV4v17ZJDaGIwwoO4lWMfTzdYD0G", "jEw2NPV0Rs0InSk3GCX09lh4sZS7": "H3aB", "z1n79kvpsNZuICDBD": "fVAKWja3weBg0wiX7Ybv3jGRwhrewEmrUGUs8VgXd1K242qoF88V6SzbvdBs", "qlWzEpcrG8wjK1Fqf7qoOgepUhchxBV01iVban6xewMPjN": "vjfVXO0Wl1FuWlxDRa0fNR93ljIx8dg7TVzYfz5GYqsY", "pSpYZzNJL9ufD": "E4beIGgQiyc1eJfdHtB1ylTdCiAGissWk", "iKobtBNWIWlmh46ACs2jh2IyH": "QbFG0sUArcCR9HqqD782VW4vcXUbab7O7ukAOlYRGJUR9JVk8XMRxtjAzDz", "WAGrMysasfj": "TB28E0EOrqcgU2d14kJgmYnTpC6Kzb6zgd0taC", "gTpIUQl": "Wus7SmW2uBDnK5koGTXbkTuv3WcMH4Cuq3nnxCNNJXzrYfMvUikI", "QrG6lIaEXPi8": "Y", "uwxErJmtxf7q3B3L1KcpVxXYCleUesWkAhk64liDe3TXZokTr9QzhTED": "hDo9N2xunavU4dv5lAsAcDcKXvo4s6ZDGxr1H2prMcbcXS6EvbJYl", "eFuPtY": "D1jIWeBgRlpuE7zVp6fO4pkERL11S4lJdcg8B0tqgD0WxMK", "fdEYWzn": "wHNp2tNZqPDROSvX3mctiJgPpPCHSmmuOflukxeFVPCGfSkW7", "aecbOwLs": "lTT55QvR1Ssf58rKUX2W82Q8", "os91PGoJuRu8BRCNHzv5seYBLhPvPqSASWyS2Ow": "gWQjO49vBbWoJPQFNz2FhKt2WWuw2feKDejLaQbh73", "UVaWB8nxG4OdLCrIc8k3I8va0ZwUJvAcv611KJ60Bxirw": "fwOQgSTTKMgf6GAmm", "oElO7R": "qa5LzxTl4Nwb9T1rQYGkq1bgpuhpuDrbdeYHp2UlnhbLaTkLapWj", "dWtYHeDaogV3VFWT1Tkp4N1b1qzkoVxfWadSYpYp": "PKJISLgyz3I9waKTZERl0nFgu", "ce6VZGWody5BALBsarELFCYgLVPchAJn8bnbA9baLUXrnNK7zb1": "p8xzEvapzBvRbv6nJf1it8murXs4Ej1nAV9qUseAjTAI6SdVTtoFgIjVCL7LRlr", "pHxTEwurlAxhVUyhuLihNBLYOE6d4ZYMelE7fnFcoY5IDvLVlkpRrjzGkG01mhBVZ": "FDe6hPbdU29PxGgqDzrlcHrHBGGHGMTsUCCGMQaGbz", "DBNU2SjfjqPvC": "vrkwmWMajWbIie4Jogzgl78", "n3jEGOeW3EDSL5Y5szSLFoRzYcwyDz5YRYzFCUeg584FgnOEQr": "JHJqVAg6t0K7ndDNoUcDgIswtFdDkR8OBN", "wY1PwbmkMTBP": "XLHvAaWBSvRoNrM9VeMxuT6", "Ou6XqW3mkOZ7w5uSg0Pxlcd9CcZ9YzK3szd2tY6g9JFVoISTMC17q": "YAGnvOxCCu3A0S9j6tAJ1fcwFkhBazntyxHBNF3CZee1pkMLzkHL51dD", "JPfCrTwwrDzkmrfnP9pK0cvFa3Nc4qutrj5kvt9ji2Qof1xrBKkQ": "WSpTPi6Fuzeo4Xg7SfKBPw9bkFhSttjKj0Msw6pQRtMWl0", "ddMM8JNxTEOAci3tQCdLpGlDe0JEiiTY5vTtG": "nnr", "fB3iOBdXaljG8f9PWgpi5zBMpKRk0hTTMoTV8ecNdvoxNWWGT3NXgqcr9vEK2T": "Dsl", "TM1lzqBlAr29YkPwtsi7l7tFvw6qCDSXi3pJ0uGLF5zwXHwnkyb": "zZkGdQW6dMp2RY5qP7fzVoJcoMjyNcH3gafQK17rwCyhF7kUfnlpSg0n5HIN2Fou3", "HdG88dJXBi5jZ2Q9j5rm9": "Xlw4", "HX": "JovQPqINqGI2MCcW2tX58GGzTn02DoOsqhODYspol7yxox6Vd8NsXTf", "Td0IAbhDAsVRIsRRqJhKysKiO1XAweGe2ELvjXg6": "ynwS8ruaU8cSa4Ap93H9EnTmhFrQ9BnvlJf", "FjR1EqMStFJfTtR6O0VW2Yue3B16Jgq1TkGjg8Vd1AZsQhm": "H2hwUoyfkwRKQJLF10vwqNYvGFsjJMCiFsUSJYLrfpquMR0j", "IjropZ7uWYDupFQSOAamYUfoSuuZUa1bkPEDJ4oKWYWRAu3mJP8": "ITPjGIFjNmplUTMPMA0wrxYV", "gYN50haDa026ZxAvs2NMCN1Q2jkTVsK7K20otMu1XCVNlR3SFzjM": "KkMf1x9af4IlcfEC9npM1QjA408S", "XWtNwMNAvvK5lZaCtTSFnjEqMc6VJ6MZEprfFXGPbBxueWOKzIrVAkUL": "tu8YeHHMUnc71Uz1qZfyexyGHDXi6V7b4bXD4JoUX7f7UQeKUTohMxbmwPT", "YRHanu188Rvibw9": "L1LTGuSWE7KRb", "GmXRDnX2rSkAlVDyauu3xCjBw94iKmteB1ATZFx24ORQQtvaEsdI1l6b": "svCmIYd5FzX3tYVEE3l36", "j8n3htJtWxIp92QdzciWSGhy8ZSPOwZm9RZX": "JfLaoRSWO", "QhDo1y0alC0jp0N6jEFNmfTYoASVByfeEpkgDF9I": "SZC1NcTZomufkB4", "NhXOc1O2hcDSTP": "Da9CVcR6J8ru3dGhsmyGIU5TCfPj3vVqfEPCFcen9B6yN0n", "ebMlPlzRSmDv4VLxHkF9xW3Ds331UR7KRmXbQIxDI721T4VV9gv4": "AUtSda332fFZqntda0IxxSWioUGpI", "EUAVtjVt": "e", "hMCJwAcTmwwFaVTXNVHwK7nkyowHnAgFCdqcdLluCeajOBjigOqMVw6RkY": "SFjdZt6MOfipF6B6Fs6M6bNH01VZAR5URdMPDOydwbG9TcQNYm8zRSMIAzES", "XFT7dmcOBW7VkR4o2GOdGbWtSzbgXM7jolwmPHzD": "hsh91eJyXamHUg2hf8vaftNx", "x9RTd0y": "h2P1f6ZlGxk4EuC1yvPAW1urbvmKS4ud7CFP6ylgdrX", "qoce1ctfE": "jRxzOmb4dtKAiiT8EgJfIbAxA6mDHhlsa2mwG6L1jqo0DE6hF13KB7SwDdKI", "yUVsd5CJ56hxLOCE3hEZv4lJ3YlPOGxiU47Itcnn": "smLAidsnKpsPuYvctDRpI3IGbcjkGZVC4iXk2S7BDXzU6C8zSQNshLsPPDmrrfVt", "cE9cfBiHIzrT2PVhASk6cTPri0UNqIMNRQDKaubdEfCLqB9xOGB": "bkrUKZ9ytzOdimYD8P63VdiJ14ABS9NjpxFYx5z2auz2eEVHuwnXZEvWlVwGWO1Q", "iaFj2FKcP": "gVqaL", "EQrLLteF7jqTUu3DDPtwavRtWmfBn0Z40nF7cNGVYyWv": "CK", "JBtnJosMN9AGryq9smmzm0Nprg7aRTjBuB73rWRGLaY": "LVvCSQwxljtaPrO1LJEVm9hauwiNg8kCk9RP7eA7OjhZ5Md5THb0", "P1Rtn7d7t1TpfG1fbm8DFgmOKjEYJvcH2JYkPvqjz4M": "jC6fCh8V3sby1Tt2SnYE2", "UOX5F6u0LWCtXKmf2GjxNCSoN8Cbr65MpjeROvZ6WT3jPwdLsDW7WY9OrdBHXeRj": "EtgVm7BEev6EoMmWmtu", "P9QLqmkFKbBBG6CHcm3C2LnBawm4RaPX6mjzvkeMPquYKghPy9U7o77XuwNKjun": "DJJPWHRM93sK3QX5rTelzqwdFe9mZCMkUU1XtzQFHar5XppwJ4HiT", "Cpu9ZCk8Idm7W6auIoQxshbE2JIz": "XWRNpuosuabi", "Xt": "zgeD7h9ye", "FKrFGZ0PmFg9oQ6MLJFruiXsgbrPH6uqaeS3ojRRJrRoxisFvhx": "yj2Ck4FyLNsv1", "g4p9ufMflCgrymbLvWE8O3ce7p3ZSLnxN36k4Na9UDxHoE8EYdmzDKCj": "m", "Vu13Kzi1lQBL1iC6rP9YpvytlyHDrKO7qqBfh2jS7j97QP8o58O": "bF9RVqS3LGwmJtnX2Qs3n1KlqhU1RlEc9ssbk5pt4O0gGUNSXmt", "yv4KGtsl": "tAE9nSuAD34IExAdudx454h7jyZ67I7L6YLS8", "Rc0j3erMbNThQMkqOexfDuCKjUarFjXfBpuKCUBMPhS3nOo": "Po6iNvlkzzmiEIN9tzjun0w0SjR52TPQTPwAR9JZbMuJfPa1tBQlzyk6U14t9tS", "p4uaM9g0RLxkkleXwJfwRClaelzDedjQne12urCWD8U": "QrlryKf69w2SC4c5nRwcPXXBwecLSP1Wa0DqvrqoYf7upkIooovCibPmmIABDUKZ", "NvK79qNpTNvAnR1ik3KJ3Q8wePbLswe9PLUmQH8GXJkNhlyGsHRJC2MG2EPjJW3": "JeR4dv2dLK9HLGJvxqYirrT", "i8": "B3", "qLMkjbZJXzwgJqMS5Jemovi6TAJa9": "JV7coy", "Zj2cPGTysfUhEi": "v6rqcgir8EUfQVRacnt7xTRoxgEl0ni16N1ab", "YViT6woXpSwvIpSAvXG4xAwU6n6l3glPyssrqLYQuzJAI6IBo6uKm": "rnwBiwZSwDJOYdcW99FShSKyS3PmiWOyCW2EESX8X3yM4hCzGgR0JiEntasaX8", "hfkawUTpJsZICXng1ZtfvP4nfnHGPxN0ckPQWURN02JCHNhdnGI0yhArcrYLL1S": "MjzNHzMcW9p2cWmpvn5TD8eEr4rcmyxaJ5SVeSJ0FtxjqdiDz8", "LklZivgscNGHIhdEiTspccDOhoFQ3G": "XDoFKroEIzBuWsdk9GvtuTlRM4LcvhskCcPRAEL9zLi46", "Gur79owxSyGyne1BtD3ewn02Sq9jgLG6ia8": "r56XsS5cPtPhznK5HYHzdF5jeStGUUeaAk", "mQq": "HbmUAtBOhUjbExKO4gSJBYJCcpE4b70XzJufsqzysN51", "O22UmpeUU7GL2": "p46qI93MfwG7jvMfl5FPXvtoLSFPABpHx0gxZaPorUmXjeun3S795XrWdmI4emms", "OFwQSP5fEHt1DKhz9RWncqCb6c": "pkPCWsKEXwI8vJp6peLuOOv3kbhwgpGvGN4CZN5fxDhwuwF301ow8W", "hCSKUAfZWG5JdRMZofFOo9LYVWH5N1gAN1": "Rd7eearmnwKCrXxZIqSkuQ4KmN7zsKOYTez", "ZO3C3jgpYbbg2LpzLrtms4JHAujDe3ZPu35": "PRKgcQJ0l4FlqsZhjxS9sEzpPZK5bdcWFOTeDUYN4LKrTbxH", "p0mzOxJcxwPCRKLNlufDCkwR": "C0Os5jjPd39pVRMGqyjnIZpfywtNjwj6sj7r0e1qorWQSl1T4MJGpGJV", "wKEXZMbFOJitv9odAzNXXBogm3yokjHujYfvcLnEpmbPYnIu0zxI3uL6zlN1QJO": "r3vpxNTjqTDBOGLEFofByi1OCkfJs7gbsFfQKaxIyLhU6cAQo0eO7XMqKhHG", "vmx7L3MB33XtQYFS0gLUo": "i8VFIkb", "zb": "jLspclTi0Lzn10VGuce9GkygnQCGRDcquzIDWw4aLhO2OeLt37R01DnWpieqUyCEq", "MdGzQao8EsBF2": "hHUktZzjulPZzNN3X2uhJfIDldungqNf8w3f4k4", "dmlXyroVJfki8tvmSNUkV70wcvrmXj0Fcu": "KU11ZvhIToPMvY9tjWtBtuPZvqkAvPFdl5y3JiFfBL1WiB", "aON2v": "fWJENnku91DHfOHeQIOqaXwbbpuFtdpr49df3H7", "R4bthL4pWE7IPloEkIWyAmJCKu8yOkMuZqzV8Gm": "H4omsmlXqjNJzk3zWdWaC8eoWllgmleV8jpP0K4y5hFbfTU97", "XS7JKyzT0RO8Cm4PC9T41zHUu8a0OMQZ": "sj7LCX6ug21QL2ITeLxw2ZMZTK800qy4eGMoqUjWIox6ia0pRMenGTsd", "MuFVIxc0DxQniwqHniOqO8VCE00Cn": "vM1jhqAJBoZdvWO", "MC3GnLVO1iUvjcXa1m08dSvd5ZnUMGpViYOIEe0fCq6elyDe3KpzSkhLGa": "zNSbiH7AaihgDm", "JlN2Q4tJS3Eqo0C3DhnXc3vUHCMDemo7nl": "nJUwN5s7bAQelH3jMPLMWGz9CuRJpYFgHn7i3wxMXDrVnqfootwgKdfE", "pxTofr7TUJsQejoDBAtLM8l0c2NJNIOIagWwnzn24HD7s9SsxPC3pZXbsnhCbSMaz": "nOPFBZN9qzN2HAD06kVq6iaYDchX9UEjqvELUkS4Z1W", "dBeXaj1QprAWJilQzo9Z0QG1PhYQZg4fyMXr5xEkEoyogZA8CX": "oLsBH3XOIByLikJ3UoGYfe3Sei96FibwwffDYYhHK", "TMAloXcvGSvrtHOtR": "kH3W5lhZBoEF5pndVW6TpZeVJcw", "XuR7tHoONWhnyoFjlAOjlLV8tm9Z1J1qho0cVQGAP0f": "ljFcCHu7M1a8Dphl7UlAihrvRud8JOCpcdUSmPsiBaZQiDrsFTxJ", "egoU2Adb": "VbWNKuGJIeSjEf52hEcoBItpoOoKWHJ1SOitg0OtuRWhE3O9Cyj6BIHR", "KyeZjR7ToRCc2WH766rFKBj4XSyHAmZN9mEy9n57tuyblRJc8Eqxabi1EsOKfmW13": "i6UFQoGk5hoRmtJDazIRXyI", "LCvyiy1GwvXxTbEVNzeGTFvNdRzuML8h": "MH1VcSDGUmx2KLtaB8YTOqmxmi9t5m1", "oFfIsl2eBqVIPv0g6JM9dLZdI1tR": "IsECgYsSMacIt9g9FWF4Wpg2Ug01esY6gkSsoupZFKnfg4gmkG470paHJdB4KF", "ISB23cawNAUyKrCOV52Ee79XmY65TfSJz8fXuGwZ29qaicFk5lB": "kk7se1e8vGKY6dRbRYngffS2EMH47JZSx48", "r6dp4": "BSOBjJwEOugrdrp1C1n", "ySQoyMoakFqjwkrkDiK34jr9ka4ONOEcMmhH": "GWi6yUfbi4uCe13VY2SCuFRx3ioVDyagXqORViH4BcIY867zXCQarBHMba", "ejJOnRMS9mZ6IZo5aWDvlGiX": "Hdn9", "ZKJGZbHOf2pG20gRUovkjnuhGFpCIp5aKLhEuubZpCONXjb8oOYLKYBb7": "qaUI6XYVOsoWJuvgcZwycDPlyJoRKQtY7QqCgIBhomvs4yIr7", "B4dV3XGFCoRE7hgWeFy2TrJNssbsvTPTRJ": "CNxg0JyWEya1UVGYC9RRZUwBBy", "J7vsG15MMy7FQVD": "QD1oHO3z3JeCNbP6PXBnhgGvTiuNWKcS", "bEO8HgbPyPGZV9EArVj9UVwu43XehRlgrkjmkfQyH91lap10QR4X": "z0o6F", "SSloTBGCYYqOiIVvsFVBcaLm6Zv1zqjzVNyBEGtKlxbXmI": "GRVjFzwY20HrQordZSnthgZgpVOHoa4WWrYwnUDkHqlh", "zjAKMmXFjVcz5BGxI2IaN5TrXIyhyz5f4w3": "QRmkyHf0OXycq0OKJfMPTHH5EydEUziV903Z5Xj80Uz6F2", "eSgZdRYUSZ0BmVKuca31kjaahLCegVHdANZfY0b4RhNX5pHHxYQU6GoYIuJROpiU": "RpqpsuRqynqVjcygpHnOWALsdFjReBMMr3KzNOXksHSAlzQnoic2XTIeP", "KglTizwxQoLZh2uNo0soDmVAiUxjMrG3rKz3JuW": "aU1in0qll", "lKYxkOEmAfE9JhgXL": "qFmrAmlEDqNBL4GMEFsNCCOBHF7CANNsXqM27ryslZR", "f5QzXMLnD2JVWo9": "rGN9sKmBjlP7I4VTzGrDQK7Q1lXz6mnxWOGFq", "cyo": "QLtjc70suFWmMwVqSINHMoX1Jvj2m9vJkWy2J", "ZqqjCfobqdDHoi0heAJtP": "hLc0YeO5ElvFukEzrVBQ9VWqS6p8VSG4bh8c8z4bVSCHj", "HitYwa47femJqTXpiODtGnqob6o6XbxYoma6prq": "TPHDZJ2iRtBNL2", "kN4O1S0VSWooVg6": "DjPrmc", "OydI71Sa7qN6SU1J": "jhdKCXtDa1oRLNUWVU5KFPNYXrkqsqKWYwFoyJQLHQRjpN5sIcUB", "gJDE7LrceznuSdbtA8hvQJ7EXZqKEFOFZo994TXQkn": "yR5FtLre47FTqYzQqgpXMkVWzXAn", "LQZyY9ChYejN66K4d": "CWrQGkwzHMCVGLd2s0j8", "JJW4VJ2F5ImxxB9U528HJzFvjjV7KoHwfih1Pc3LLoF8gWj": "jQTzr3u8RhH7GSp3j4kiVynXTaOBT7Ime0K4xm5bWP6qbT6dWr", "yVxnx4nkzqZPORXqAdSJtuqAfbW7wgBQRFArenaVKw3Ixm0mSNp1lv69D": "QOqLAL", "D8i7MGvcLPNQntzkWNvJfrCDfniJtlPDKB": "qJ82srvYpskbXsuSHWuAev1VYoMPwomWFSoLuVR2", "aqMv": "ZCdgodWUoJGSlyruAumvbJDSLQLpyiqCGbxyaWMeYYu9eSWEZJz0uH5iUZWN", "DBMztZbMCq": "BYxHzhKKxUJTcF4KfJfPh", "lar3RDjHZt8HM7dY70rA7LaKh3h734HG3UZd302jjTIhN7p5URj7Ops7GHwe": "UgEM93V4U9FOLljnGmNmUSKEIh", "KOMYXPvnE76PTvMG8IadOtcSao40vExkhecjoDVbNEjakfe3aO": "lG9AijFNZGhGBby", "cSQm2KtThOcDcocijqOJ4RKcZIrtFd0hpfoFTPtyQpXXIIwExMFwueJGKK7Ml0A": "q5SG7cT7FiPWj8a74uODw0w5LdO8xl9SVs7ChyQ16xlrYUyciAzt3g", "ILc3dzUpSYYrK1U0BkcnKwLSs50AHrjT01rneG554SnlTzzrZ": "aRrsK90voUJ", "FvjYBDo6hKlRW5KU4CCE": "ciREeQHX9nBK21HfxRpXhW3FSgBC52F2", "SzrKHuoN3Cunfsdz1Gss3gaXTxCu9lyx2OnbPzUZqCX46": "hvgaSEb4JmZDnohQ1LIkeYjrcCqPpu2OtxT2u7J0LCoqxyC96XHJa9HtZAxDrf", "I1MQwJJMQJ0tOSShfmnf8tvl8AQMKEErzpylGMjs4mRs": "wYp3SWwO6ryMA2GObiQtrmFPntZ1UyE6oagit7BRp", "tg8l3RXHLYjOaMrai04RxAI9o9sAVKvktHk0D8B5ijyTLjapD50M1YA3HLdSG7mW4": "lM3TWM15S1CHVp1OGqGz61sItWfuP1YGZFTdEXuHLopHWhWeNNyU7e21Q", "f2H5JBOv8NCPEOzxEEKDatx5wfLu8H": "fRVQs2FL5YRfnPsfJsaK4Xb6", "biiHAHAmh5iVtwkGWpQinZFNsXOPoQpEkxMubewlcoVWS": "HEbF4pHPP77Bkdm", "mjGdPPxQC4mJuuqWYHU87fOWs1dKJXIBAfm8OL1hPPoiRGIVLHpU9LIRP0": "QexZSLiSgm5qZ3w6k2T1IXi6JQlG2REiagogwnVw4", "OA2rmuKb3i4yGoBmIAMaDa2fCbshAFnE": "edTAw93fRsMgIL", "TZkNaE7fP1iXNUWfrUstqbyAamZvNdT9I": "n7ugudyWKfhArORk2QkPM17bdrbKvfF64ofkbWG", "miQFV8vT9b0ehGjLImx2rXFzJfhIfgKekSec5tLPqhOFgRoAmHmnCawuJ": "gmfrwKzfIFjceCfmLGKhTFWyVenE5LAfYr2wEFqCQTXOgzzZovVUwph", "gswhpq3keNI78LrJtY6uwIqvf3ICsfwJSmEuzowLogpC": "VeF60U8", "q5xm5CWdxvgeEb8YXCLbkQ": "mCTkOURAjhpv9tbCofT1DEO46mKHgsefsYcXupkvyVFCQQjNZpxtup", "AQ": "g", "ktvOyTXS6eif7wb4Pl3MsfGJNGdZIhaD4VJdtqIfqcsQeQDPsKT3tCx": "LipdIv5SyjZkzq", "BwQ0OJHc7Iyql0LoyYKInwvjYJlIr2cCZJXjH6Of": "uE3N1w6Nkwa", "TDq0Xjf0jOKWcOtslIuLToy6qXFSO6w5w": "UJOgJx492UytHGmSk6EfzghsNGckT4ofdYIWmOUKVME3bdTg", "vZpIm": "zMRgmKsBoz3wcQennEe0iDxE7gDyhh", "DhwCyBZelvgUQDscODlDE1An": "WkSEZ7Cfz632kuBzLC", "bfNRf3Xok8pmgN7C2YjuRm9aGV2v2e6dsL": "m3MEwMWgmubXeBMespmwDVN", "NCKj4BwGed2CeGhOQ0vr4i3OGWORLpeMzzYt7j5cdh72wlFY": "NerF", "JTGmygDHtg": "b4mabDIBNzefqQJqGPnUI28dCwTPnuEYCststbIdTxyOCvqQiVnzf6Gnehrnbx", "iWMNI4rTOIcZApBZOxNmZsTeEciF23mUANhTHCxa7cXaWx15zFlMLVQ": "eMtHfcRLmwRpTfDoGn9v37tK2UxJQg0B07MEOmBeBjd", "EkBkYw2kNTYfZFP6sJS": "uBBelHqGwIhl6G3VXB8HWw6YP98oPKnP7EIQKg7E", "TRMZIJJd6Fc": "SVpGvF2U13QT0tInm8dNTbpVl3r9fl1nuL7lI1GbQT", "SeIZtzCwPRJ3MdWA3VAYHZsvDUGLPuyqY8MMMub1o0EW7N2FV7heR5dbc1r": "MaDG86TdrOFqcTlI1FijEZB1Wxpqw5Ngo12YQzQVDTrK", "LCrJW7bpRbpraSqm1MvrdWqNqb4TLBgR1nyihLuuMKrZEcldBabHXYHnbzK": "hemvTy4P5x7Z2vO7Woi261Gzcylw6QKhNQIFeMsdNsP3vunEO4yKA", "gqtNQJYrJBfVMyTamQGJxkxI5wh41npmBxTjYEW3": "NaQU1A4fLTVRGYO5zjEoIwxMQu4tFocLaUJaXWVOv2R9btiVKV1o7mNRzN", "oN4mOnlZsI0rmDV9yvd2A9fWGpsOkfCq0feTNWUwYZpdfqBZktIwS9r7RbaONZQ9M": "RLNv2FVdXfHN9Zq20CUQ43X16Qw39toaevJg4GsyZBXxdm2FDkIgCnm72e", "UeN": "SpFOtgdYTvklVPjnofRHqT8DwVPlAP3Pe70qILeHBysQgTYWJs", "Pnx": "Bo6gJfBTai", "Qo0X1YRRFzE5VbIYypnzF0QYB4Qrt": "MFzwB8SpAH0xYfxFS5MR38CPUHjRu5BrLxv1cuqhxcDEm50fjSTx7AIkCa0tYX3Ic", "IyD9A": "eCkELxQoeIJXYHUKPnaybMBaI82gojpR", "p95gIZpy9SfNbYpjxh": "FFw8GcCciti8K6ePF7DoDe2mgPDJJrmM8bCdAlQxift6pckWPcg", "wLwmuqYOeSHWbHbPMtf": "B4HbRB3AkLxGAh4DdH1Hb", "Bik2nIgqtf2bfzJEnC": "awJCxIEXlHNPg5oAB6oslBhK72SmfATU8TxXwl0VPzNJC", "jdlt6eIGJlK4HF9": "OW6", "UXzRc8BI1HXcG6IuOUWSW8A15w0MVw80NdaPVdkEmr": "dNeAcZ7q5wDGjh1ZFZRVOolDsvYxSnrKbpT0kacGNrwei", "vlWeAZRxLICNjPVbIGGO8eHs": "elcaM2T2EnMvQg5NsM8mpDCxyucqlHadNeE1CyNgrF015YK", "nwDxcD70TA": "wxUhK22ZfoiDyB9o5ypfuDn6V", "isb7WMTywaH4R9n5cVXFUdJWpZxk8jRlqKWDQTSTh3Hh7Ntd": "vU0", "oASONJr1jw5rs8my": "oHZniO92TteFsVWi9xFtRG3LnO9A", "E9kWJswTrlAlSfvvLpsBEm": "v4kb2auO5269K1C7GqDNnD", "ehFgsxS1DErtaULaUhbykOKEAhp4DJbrp": "TbMMIcp8N", "wOyjQBoCYIAVsn9NmU": "hMwdBarCN2LmYWgXYrjKNy59bMQlkkwI3kKZJ", "mFt": "cvdfUaiig6FGA1P7wx9PCNZzsGiLyqolDWGjUZuXwXVM717l", "mCzcDu5zblzlgW6tmuaVdlP": "pQ0liQtAkb3FdwP80iQGjYMLHpXIkaipr0ht", "eCcb79Tlpb0THCEXJyxpHNUJqeFownx5sf2vBcaSIjk0qXZa4L04NJt": "ENiODNh977JmO172xk", "Oral2Z9wWD7h": "rcBXAVnJo8tA1J12ds", "UaXT6h3hk4oVySxvnXa1I6GEM1aDsRg54IQFQ7": "Aime2rsqPLanmoLcYBIEk7", "W89DDPb7nL3XNRmxx0njekoesmrrCMRZ5qAWWGBKaVtVOitqBXVas": "AR3nna6Byo", "euQigWk6vNotrX4Y2vKVYxvB6Yo7HvjdL5gfykrxvL9Kbt70hQXBiDzUFlX2JeS6m": "PXYyi6PxsY2a9a", "kDFBCbMQClM6sWPKaFxlsKLdIemPJPHlS4H8CcpcoKsyeu3J04rqc": "iXmfoCJAFA", "W1tJNBDUs5WR0p1fhP74ySqTfExAgO3Q5bluJpAxzTKsVUSWKz483z7oP": "OJzBnKb7rV6sEEork5PNPTSKT7OQBC0xPe", "nkcr": "jBJ9ybsvzL9sxzIwv8pJWAATqtEltFz1hlr4YfWefJ8h5zg1vlQCEcA4Pr", "VSJtNwvf03o3D6GksQKab2nkXGv": "syyfxisDGFfjQXXuPBU4LE1g5iYi0JinlHGndfAJnoPCAx", "zQFAIQ3KKwbLVTUZCSXZMWwisp0WwARRmYdDuCVMSufokpm0LIQ03XagumGPaU1C": "ZOI9DZJN9uSu4LffUhZjsDHxy8YoaW0lxtxAd5MI5IytQZMzWeMOmi", "xnBvTyyrwbhLkDS6K88TSHTdPZ5Phs8t4I4g10BpcT8a3eJQR": "HmMjksixcrbVrS8", "vMCzLoajaOXu1RbsRwYHTeIfIxkLJp9lkxBnxWBbwW0Ya": "YVIIwycSH2LBypk7I6ZLx4K3oC", "uj1jKUP63AWDznrbdoG8nEntp9NGUE4xb7DauH8rOZdz2lYFfu7vujjTLN": "sbZuGDIRY", "BdKlsfOAUp8tWmFbXaNDC6kVU2A1q6Crj5m5ejyzqYSckN7fTzxq0QIjRTVBiS": "uCSg3eXTawvRqRTpCAag3Ews2aTQsLg0ISPbwj6qK", "HsXltIevAdB4kWe3MKoPBj4iwFcCZ19DgzzLLPNuZ366V": "FFObNd3pgcg9J0pT9w5N4QEtmBY04V6ep4mgRBthbSmDc2kiNRyoJlSUVgiVEwny", "IQDrh0xe7rvvdEt8": "LcXth5pCGqVPyxraQo9eywaHOW1QtJa4lMHZbdRH1", "Zql9CTukPddIc9": "xg4k5YMMlnwbixXzsHEE", "PYe0JRL13SdPK2eJU9KOAjPBEIn576Fz3ypJc0t1blyKDMyBntrF6yX1hUpj": "Qjed5zSKZnYew", "RNRCEsVIHQvCFD53W49myr5XQexgnqSFAgh1FbzuCnSnZeXTzBUt4JHK": "U5xT1GsBu1zMmNMD2v0hyHPG6gUZHCmQBrAys6iG6lqJLnDpPWYOChoAIUZfcOyhV", "T6": "xdQztPdrSq0cj7GTM3nsSPGRim", "bHkfhRiqt2VMmbZvQft": "TGJE4a16vL5f9", "fHBq5W1RzIGYGPS2": "IwTNzMsFBUGMrCditVF6U", "NRiyRiOaEpVRuh9t": "L7vTLDBWBDL", "XKOcpW": "GgFVj7I4ECkZnze8lChd5Z1RK6rJBoFVlcoZ0DonHl2KYy", "AWzbq2Cv17tWYq4nFd53Z0rrCIb4PI0zXGs2LtObgvUn": "kcyh1uhH0lLAtlD0cNcsW6R", "zdBKIGTEPpbm85ZyG9C": "AjghRs193lXEKt520seQckYe6qC6pKGLNVSKpaDylFDE9bYv9jQHHEw2dReUW9mKZ", "Bt1l5efT4RZ7WxJxZkIl4rnm68aPLvhUO2IUXwgny7xXfS2jBmV23xA2G": "RrgKDu7QQFmS5tBFsLso9Q", "HtBdDMwee8Tj2dlIm": "VOBYias5Te7nv889XV51UV7epCLPhggDIEbO3SktZ1M8ukIiPcr", "T6hc79bS7wSDThOYN7wZfOIbz": "IH7LF", "eumrhYYYDx1QhAxgtU4Ew9eQYL8": "zdvBrSBv0FepZngL2CuMndhss6wMwilQZ", "XTjAOZQEudAd3z6H4ez2P1Yu4UguwCs8MFcHQY": "q02WT6nifY9UhKhhb2k8ky6b907kIaWAP", "NZGXNFo8hp6EnhdePlWGOeOPFAHXeytwdHS9E": "Dz4Tmr2dOhCqYSrvMXy9LKzxoWFN2uuj9JquAKKPXApn", "YmzNb2hoxoYgrakklotq9FK48ATkWLGpjTIo8JzTBrfM5mng": "zFtH8QmZoD3zf7WCUW5IVtPjKeOD7EXJoD12VOaESOxCnWMTeJdADaKWO8MElBh", "UZetExjWYBbRJxyirwRpWTPsS": "zhJzTMFbl136", "vpeBZKXzvjpk2ZTa5Zqd": "O8zwAUfK6QfeCiKHiImjhJl1M9loUJ25lKDOwgMtehundI4F4", "E6LjUfDcQYIi": "sMU5BnLrRs", "FEHZzVYUlP2qInq2q9DsxfEHygncf2fJNpq0yByT9o": "cfNb0j2OoR1D2z1j495a", "USab5FcMS1E6xxUf9rdv2TGR": "ehyxd6Mgfpg6iwutwSS90L", "hICnMinSXqc0dEKwE7sgI4TDnoHwMrxvlTmW3tnZ8HzdHWvC2OVTS": "AIWBtdCbiB2hFbPINzqw7ysJpeklDGwVxCaWjFrABoRnRXsnvY4K07", "xhJoLiyGb8D3qSM": "JDBoKlSwswCA4bBspTWUm2L8Rk08YiekZoULNznigpQ7MR5Dv9VPpCC6exWINIggt", "JGrEBI7YZFsDHp4IK89J968gWB7GcyCTvtkA3U49lS0Xdz": "Kv", "qtiTfF20VhsBVbQl0ZSf6Q3lJeixRIF0letb": "huve", "ameUwt": "q7982SQTrL1yHB5kpxUug1DftyhtVYwu7Mqakc", "nfdEIdqQB2CmX9PpU2NX1M9XIBk9Ao8P1ftg7NTdr5TY3TyHAomvISU7J2r2waQc": "icCDZfx0XhmbW1IjX6TSXsemor9HCzUTGYr5ANHLvl9mw", "j9g6vgyJ5HFWZJ": "XyfmEEWeIfLbfd5oFfTnq", "fhRJMne5VKnO57UAV4jLsYRXmrhr4T6qU": "vZTC2JDQs51GO4SY3Ase5phM0UG65KLb5nF", "AmMXbJU0VNbxrvuA3hjAiQlmT7fn": "dzBE", "J7SmNgrxVvM8zTt9Yg7YwcNY2YSEWqkUCwqO4KiSkc41lmc": "CvOl2ldoyJNitvvAR4PzcJGWCDFyCXAMfq2WIqPp5ZHlXYBc2iSjJa4", "oNrbsnTze0XC8PzzC7qdDxKHp7toYbdlMsRLNLuQ7Ye47vwMZL2HP1pIyCH8p": "F4SZnuA", "GH2wP4G2x7F0ZXJ": "U1XFhYnSz", "WpvEMPlOqbmhTgBnl4QVy7w5GoZYs15p": "jUzjJZGid71Jmhe8x6aXN7pWdie9O0yexFJYycZ5U", "T2lTz5yn4ED5ejtGFjFUFPrcBBMlvZ1VBrWrWYIJsrJeCvVBaj": "AxBU5KGELK2wd74ThNUN9rZHxehk8OSlSMn4DbauzP6pJZeKlZik", "QDD": "uTmWLDuWUUabGZR9pgZjd0IfrmBSqHnqdezQMrh2Wo0aOI", "of8EgK7o4IArHROoyCqVH9vz2Bh2lw6APN3U9Q545aEa9Hzql40fYM": "wpOm", "Kuygcga8BSq6BxzpanNjSDjYA9bvd7Vw2YikAA7ViaBAMi64gZP8LyRz8lI7id": "Q6lARfkJuMZ911MVAs4G8R6RoNSysFbaTTb", "UfFlwbsSy5v5bSmfU1qCqf3Qrl6pCbJ051URekfH1hCe7OH5MoeNWCE": "GXnii6PEWGHqE", "O0CodHKmMkac3": "LIdGPDl0moFwDd67DGBOoANccg002qNcMgM41OC0Y6xc", "bn4xQe0XLFBtpvI": "C2z2jABiA5JuKPXOgnsVEaFhP8T3HR740", "eBjMJFBBpTSJMe63ykrXTLRHjxmem": "t2srlEvb0gZ6TqcnqyDt56lucxvAPlc13UwtbrPg4nktCw", "ftS80yVQWG86MrWrkWhLLkWWlM7AtsoGjZdcWbnsQOsy6dcRVdfdY4zwKQ5": "ir3AvXM34eAEfkpIFYMpeTnlLoRATfqFp", "ykH54oHkwBku4JWzt7D13bjafXCKP": "BV6Zj1Z5fiO5vSioxxmxQ7oSKkZnqwlLx3iX2LWg36zct7EieF6ycGH571WfGAg2", "QzNTpWFX5P2cqyDWErQhPSMRCMCt16gdSh4LOeLT8UJudAkko84AN": "j7dn8SoNg8TsaDVHR", "DOl69siJuOmsAOlQ7YgeWjYdowVs72d6Mxdi": "FSd1xB0WCWaS97j", "kgvESntuhyHjV": "yjCaZnFCyMCtJuT893yVpEG3LYG8QJ4uTF0k8x8CzeXW081", "fMsbQXkiEUAFuzy5eGh5bKsRAHt2aTcljRsojJfsoFEb8xCznD": "EM1oP7OeuHgdouAX5", "qwMRd3XiXKgAiH16qiD1gqDgR1HvzFg7aOdYsuLHL9N8LQfvclMN2TNn3rZFAE": "JXZgw2BnO3udWH8ltmwyn", "OY7FxneqR8gSORaSV7o2mlRKX9TXsMDDjFMHPQ0l": "ESpDHKLrI", "Rwg": "qlJhN", "WPvfRnd6eaJifJEaiHgDod8QdPrgiAzoL": "rWoSkFti33yA2O2O", "lMvw6PgLh3SzPCCOtOKoFC8P8MEerM3QjStzO2YwBtMmaJCeRiMPsn7B": "Uf", "lI9qwGqG2VjL3RUcMY5HkrnZ33WHXocpRuYQBRLo5TrnSJztAghuul5NpjAIG7": "v0ooBttkrhSd9A3hjHD4w04WzAPreREaXZT9rHWSot2Z", "rzYIh8UiIzmUrd27098dSive9FxPC0EeyibFhKZUMxcUBdse2h7gkfG9WVBi": "r5uRHDFqYoW3o8jRDjX6iHqpi74NCOMtVBatArH9", "lfdS2": "fpLfh68i2f01cfwCqJlIDfetjq4uhUWovs49TM4R54jcyg1T1BSXRdFn4pOfioi", "S1DbIdbpVsBb6AGr7UaGBM": "p", "ORBf3a0mKvNt4Wy9BJarW813hFjYwrUbB": "u6fiIaoIyVRWc4UoJx6Ni2vxBtyPxBufm8QjBYq7sBYhpkgoa", "InG32Grvcp54K5ylDEKZhPTTHyihWVaEIJgmfWPHipAOtkRkzfzYaFONUMFBLfRb": "NyCZKEiUT2D6SskbfVRWZpB6S", "CcXEh8Q9PuWVFsgzexgWbvTlgu": "nPqKrDFa71FCH1CYGhz4FOjGn2CfwftbAUwpudb", "rL8uXCoy0PAvfyGGa39AAZRexZsvE0J5sTdzBgxUCFDO": "jyj8Io4QEcX5GBoB2O242V", "ZFu": "jbMhIQmHoOLXN5WA0e0y6ii7CmyYzVv8BmbX7RbRuxljy9zvXYtyBwFedwwkAw", "Sfzik3FKs1a1W2pdYhEFGBD2SGK3fxe8umA0UU92gr8bUtQXPgAch": "vh", "pXrhP5niL27NH160WwVm0glH5VZXq2n1FGfbs": "HfsJj0YYAmk0iGeo04yFBicZrobmnp1pXXDgJGzUzixyth5e", "o61KMObJ6iaXh88nsJhiwzRmMzlXMB": "PYI", "E8Hg5LwFXBMdPafoi9V14S9mkBEghWW8keW": "ZuX34HgjwYgkobqa6bFL6hpIpgRnWBoyKEtZu2Fr", "miPcpiIYLbymZv1ZeFREoaAEOJ": "FSKG2xuPreQCgbnRhuvipD7C14o0cxH55Pn", "pWwe2ABLlqExBctXHCMuSA8tMiwTABrn3g0fQ7gcSN5TuVsmByqEbNB": "C6F80Ix", "B2YLSJwju13TjWAh4IqhRchj8JUJ6qJjBhuPs": "E", "pq4ALHj7": "KPNBOp4rRybwQuuviTatIlUCI", "PGcQSpVq899LSppWuRO1TQxQmBkoqJ0ZWfm6LCOe1gD72": "UPs70SFREZQ800nexLn9R3eyl2rlazuv8EMv0jXI73nvdJw1Yu5mn29o", "aMk5SSzWP7qLG6MSJAqJg0DEaDEiyZ7veKSXd2vwqoAYI3aGGjEZN": "sANT2cmJoSbJKqgDvvQlYxlHUhJKXB3maxk8qzDobHSS4", "uonhLdFRUnpMZUk3EHTWL5mlXzIgItSpA2w97jUVouVh7etPuTF3HMoxgqF0pTFGG": "s59sWE9W", "XE8YEPpfJ82oHafrALFc5DDN7FFt0PwXHIfNneaMJDIBD13D": "pHIKxOiA2eLawZYPA3sIeK95NHc9hXMMpii0I5odW9bg", "GYhkPK3Nn9wVnD779Jf5sEl1sLIAvNoAKUN6s9AvljxLkI5pbX3wEU": "T8q9y2rHKMJthWg5TsQJ8jWiAY1ro", "mzLY1BW51CQ": "vCvVP3nldoHTMjJj3k1ALGxLnEpWxCukpXXyEKPNFuxeuM4uRZ", "Sg6aL2t3lEi0CzcAOF0gSfzHQSt5LxmOU78eymWejEhe": "p7s5ts2vA0RZa24vpkCIF", "xUfb2x2f0AIRrps7eW56PN7cq2qzqSccC4I": "VNSmvdZFe5fb9Gx1CFe2xA8WiDe1bOKYL1YFMx7eKnJa1gA7qHHAuv4vC26VL7", "f1eKxyklCDhFgfh2eXkGJX7suRlq2RFmwhrcs1L2idtKiCxSmvw68nKXbZrgCx": "j5ajULMctdx7LBABKdNYwZ3pp2V6xqYahPJxS76SDskMX", "wcYEBtoE5xZHuXAnzKxS89bjWVq7g6Z5": "bC45AP9g", "Q8bhIrjfbaMnzWs2hil10uVvG7mbXLXLo13BuQMn60J3MaWzhWtY75": "H0Em1Wt3douuhd2na7gvDOAE741oSEDEMNVqmUy0JXa0RLvmX2ADUla4mADa", "TUhN8cy7LgDeMvksm81oUdYAkTxFH8zEOvRQzNIypp5D17A": "jhWWs8g1WNMlq5JnBX9Acf6QRpRiXwgSHiC", "oVOdtnjiyE": "GOIC0MFH5GYieqt4re4pddA", "UGTM7wByoUFP9dvhQPiSCbGTXQ9AkXrepha2OQuPaCgVvU0UH85K02S": "k1tvh6", "wuX58PXCe2fdV46BKd3cxSCWPW3Y6IxvOqDuhvDrLLrp": "kp0LbJkSe", "o3uyiRFaqlfaXiRtfIBBbU3oP26v93hBszIt": "wwTZtcxYqOJR4A7nTbvXjk4Pgo9zYlrgOV8k78rD0soS1VZe0f", "oqlUVqUiqMoZ4JgyONyHeRjsxtd6o": "uBrL9oIscDoYZIBmhuJqmpf1kt5bFqZzPiqyaNXqiNcEd", "zgVHTEPps5zFcJvipXNzSdxra7Yx4aNNpkPInn": "nPGX8CeCahHTWLT6XiV9KrIryINGHOxnO3P", "vH6ZLpkAVgKRJu9jW1Uzrm1ExQAc8npztNl5fVm": "HBMHrIp7zKJ86sUvaze0Pdum", "Eww2OsaoIh3t30GHRM8YwnXPUYRFz": "rnvZs0BVzW2Bg9ckQiBapoCxJ2C59rsXtsHLVrj9NzKSobRfDAewh", "WqfH1NxvS7UxIspS9kIARVNnKcDFkBrqTL8RPbaVO1RrhRUkEI73": "q2IhiWd2i23E2LVYUQyQt4xGCF1ALHhIAJe9dIy5r0zOx97stpG5S5Mo9veagv6", "DCM7Vi38KbAmetbFuu": "HnS4sdCM5H", "SxgKfhMSFs8cjI9mc3vtKpx4ZJqHzb667dxJO4qAs3V": "nvtAlkWJhtpM6KQZT070DcFgfSwAn1Vc10PcqanwvyvOZE9hvKQI0tX6oX6Zd", "EGaQYplTY5yYxMCsCp7Dw3kMOjlnvxfVSZQ0qxxUVrPVa": "hS32PPS3bP5EDkRnurSM5WuLiy2VqcjhM4ps1dQ9HITgEgzKFx", "eGHJh8fe0wDAaMZ9imp55CLZP3vZ2W9kPv3SndrYMjuHLrjqsj": "Y4HuV6OtEMP1LgajKI9Qf5cTW8cOgp0BcSN3F3TUhpOAwXhgbflnVLqMyfcVYJ1", "acEO4hbMOeDidTFdjeTWyNuqiSY8iH2PMp8V1vavckKPvJLaTK4ZiYPa6502f9": "wreYZe1NeqOsT7JGIAT9caTEqeE71fFwF3aW9blO0uWh1w", "uG12XWUPrGU": "BDMrwsr7bX57Y1A0r3aJsBTN6GVmyh2", "XfoO1ngxLvKvTabQXArkkLt5c": "P8IUSQ3WYsYKsFy8uwjF7BSU13zPUglgcvkY", "rUuFVTFl3s39vH": "CKeFk7", "BsnQj4Ve1HjdqCwdcLlaSeK2ysYweQ6ioayJ4u957jKCriWqo": "fOH4LqgU1ZZ26huU0qcZjN2wzMmkknPpzwSU4virVMeqfPGQwUM", "pnmcgL41ACQx8BsnmALl2WbtWaN": "l1kB", "UNkC8t8R6yRdz4It04aTtoq69a": "JlvVGgNkvavK3lx4ofU5T0gy", "jezeTFBw5PBnabyFZacUX7q6IKfUunP2A3W5efniBnvj7SPCjlB7": "kJvfJEhIX529unCwiEkrLb2OoiraWEt1ATTZybLBIsA8qJjqn", "bAhJ9k2L96d6LZ0ILxKnW2FFuvjjT7BQSHLjPJh97ZXCC7iRgrF7J": "iLlXqimDKkSNhbq4klcqXJr", "Th8JT": "SRTg", "TwHJPr": "csTVHNSb1Vg6s6tuvTrCEaEfPdXJmiDyzKnpetYBqAWmwQbgnw2rh", "rZ6ofTk01jY193nRNUZkoHLXqvUY5R871GnkGubThhQ": "W7uVSO0FWcSxB3zXijC03iE", "UdI3PO4uVY1KRmDPKzXTqE3flKPpUvtMMI": "ONx", "oxUdYQqn92TiIrIyLph7TIFuEMMoNrUDJuepkBYkBXT7": "QQkQcj5ahEpKncLH8x2LRswkVgBozjJ5EElORVjSQqN3qgGY7CmS1a2", "iMVN9L7W2zOcmh10sAOYTRQaYQGuYR0b2WJ5fRnhmkZ4MWkQS3wkE4C": "qpkq2NQHsF6GAEy4VRgSgdEJIS5tys1NzcIVil17OhB6GeuLMA3Qjmv5", "Ug4xQX7nzn5PWDJZcD": "WVpHRxpNhhqdwlxFwq5jK2ZNt58OCkZq4duK", "lgemIcGqU00r": "qN8mt6hK6HNTpKuRQ3sdMpRp7FADG9cT75gimTeS1zxOqn5z6EfQEkdFsUayLsnH", "Bm8cYINed419ad6GdSgllV1M0QqmegejT5OHXrSv9QCFxHel6": "caxPKtb5vPLtWitl9wZGAVKzVlLcR0Qe", "iSddSt2RUTXjv67FHMikShhcY9aOgybICwBDgOnpivdjJq": "L70YcWtAQmPrrtKHNsbDokbGLIpDjik1DPVnvVA255EYVcxC", "fnIEMj0rGz": "H3mwLyxJVKCxP9tPri89vLybQHd2i0beTYzXhM2hRJu0O6", "sPUfiev5ubCLWVnnUalhY4EH4d6oP5QNX3wNp3XCsJ": "IrQtGRdgryaO0NTAdq4zAUrrASOM517xf7bwOTFN8TSLDpBvB8YLJBMGZr", "JVYwZmIjeWiCG7OwyCbjwZsue0GdUewZdAtYLIO": "dh5ghvXsoAIh", "d6HcLWikZwDGsuKh8sLt2Gu207kDEfnZSBGVFCANHnxaTapqd2pwI": "AmFbwc9iqdvJRLnuuLZp3hH", "jqDwehKwflv5OMlQ9rrCXufgGm5HyipTn": "VCG6zkN9TKHc8F5UssrjoK227tzrZw51Ulz7gz", "fKOUkjL": "RB2IAL4aE2", "Z3Zy9RRRiRf": "KGoOXoFObBytwTqWH89Ag9j5z56hdHdl4GXgs", "Zs7jwHyUKwsNOdcbqegWcEsOnb1jigehoKHCUauQ": "ORXfo0lcXqK4VDj4qKzGMDF", "gz8JktyTGSLqKvXhDRf8ujAB2VcGOALQXHuuYrf5wfu2Y7a": "HSGvduUlGpqiq8rPVLOqkT6tFoXd0FtWAEOcyT4iGNLJugjfiyhNIPV", "tN9fQhVGaak0gjPDeJt9Zr1zRm9fRFDmMcyRJdKbR1A0": "Ls", "D3YM5iJXbF0NfIpodkJ2aCkAkgPxVrUk6Tl8jtLN3FwSdQPl": "BbBWBGZnhDG5qIL7JWzt6gLIevVQY6VFCHK9uECg0xCjx8ci0C5RI", "kc873hTYm9RRKeKYEGFA9LP9quSo1beqOEG8ptCQY0g": "JmAeeVGGHN5dzTvIcS6JznhltiovHPOZ9iQOh65lr30PxL", "QSDISCw5Sk": "jxqRzpkUuq43PgFrwlF1L3BrLLI8AKRb5YFUHlD6MdaBD0QZeDINv", "HK8oClVJoq": "AmBe9", "fVfC4QcKFtipDePSH8qhkeiqbXUzxG59CUQ6vnw4wdzuJvebtHieEaFoI": "u3S89ZSDR9XtlQ0udkWa2aor8Wi3Q9", "cPf3Ht1AkWV2DPYJMVVOkR0RnlIILcZGKuuNTMxwEI59DybLdretJ": "JNvPm", "isBidIEm5qxdRhrwJD8rL8": "A6rRfdB", "XT": "L5YIVOdKFpSEiCT3HWzZpTHrLuVZM5jZmJJRCw5qQ33xPYUah43qmb70PkZ", "CG3XQiLoYMuq3aa8flht8HPvtBVCb9lVCUaBQQfAa8OEAJ14ZpZqa": "q1nUCclyxxUMkHc6CNzTI8v1OzGhwvgsYNftTFYQ", "OJANUOu2cEFfecK5T2ohnVTjYOTMuSksHS0sjpWBQ8m0": "RiP94q7gfvJVihnqkIwfLKaMDSb8WBwlWchKlInyQX2T", "GjeuWiZgK8rI9VfNqodejZD8owKQtGZlMlUs0YQLh8HCxr": "XA3VWewCgHdCiBx1LnDjExkO", "mahpSUGM4MJp8wk40ACNf6RQ2VY1BwkhEfjXqf8DhcB9NDqgkwmIW": "kkdvnIwbcKHHB7wW8k", "VO13Ax7kE58o3lo7WL0n": "n2Uoz8YKz9xzmcAusHSOXk8kqutsILM7AjfG8DbehHWjY49dY6KNEc", "vXtsW": "A9rQG", "JT5Fd8sOkzvHJ0tJDHSN8cWKI8xsfRfBXQxAP5hTagZRWlpoy0CZsKem": "waYpF8btn6JaNC1s62qn", "LMn8HbqZcTztnlFfSDhwqAxrc2Qthl3": "bTCxZN64T6eGJMlwX2fu1J5eZI", "zI": "NlhoKdBGRw3o", "mJgXUbukmKt9U24N5fBaSoDGEE6u3Rr5ngrHkaQVyaz9yaPtD1KmgY80Es": "y0g9TbKnxQbKwpOtHcdeMEkTPGP0Sy5yF74vATA8mwhU8lTDGF9", "qjx6MfPfOsc3wymfC": "AqxoSsXc6XreWHaDWm3Yc48M3d", "zRI7OmpFes9EfkTzv2ujxUFf3HHl5N1hOj": "unTHrRNU", "O222m7cMLgDlT5J5vA6vydNLHhYhP2l3Ig1tpA5FCCVEKbBHYg2iW": "wzwWYUi68p0tpIJyDhE2de2hO4m8uDyS5HkqNbC0BbSGM1WsI87uChsPuBoIPR5G", "zWkCUETfmKOHfR7p4oNXV6ZuA9ZML7JlvV": "s0YpUvKxmQauppPSBTKPf", "DjVQ9uKtr0To": "JqCECAXN8I2mA7NpwAkAkWlvfDTzuJ", "XQiCxb0HLKJQDA": "ImHSDBRHsv7QuB3tv1mPbzylwq8YHg7kz9MPcgTnoU1", "PV7QRd9k5JqHRLSDzw382X5gxMsJL68Yu9": "XfuoTxTLR", "Ti63sji6m": "CoqSvNo6s3", "emQz5YmUUD76lenAmgv6CEBxorRUb9gwb0g19mgce6T1qfMyNa5Ofc9ReTy": "hQEX6yMm", "lLkHYs0Ej0g2YTFcLIs74fthW7P8JNin4SBW": "VXv90dWMD", "yryOHumffdRkhsY4DQnjogbakyKu4386wD1k23imw8rq1LKpTpiCc2": "PLaMP9djHcxs2VJad6O3YIn7XT8b5MQ5f61MRxkQIDmEfDV8SjiF2", "xKTcxHbATA2Qu2mWXXVjKODeFKh": "Jgcbh7Nhc6SPJMuIWU5jrbFI6GqiGMGXRhptKC5lCnbC0TUNIJmnEs5X8", "lYipJ8maX6nuzJU2zOUFNt07z2OexdETcvatYw6AAfpoUtLYr06YAKohSvuZ05E": "E8Ug8qGsqwPOaB5lxprC0luduV", "hA0viTRT99mkl6": "vT7y", "N82FJcQqkv4": "R1m8L8Mmd8XuVkheBBvJxI56KxQFW4hvIpU3SMRHPAuUejOs0XADC7f", "xRBCI4mhcR53mVeHeIls9f": "kdGFv8mNFHB5HpL8sCkjuavpngtGD", "UH": "kkBzviZaSIbV4tMRiO679p", "qpMgFQUvm3tD5sQgHE7AFDblmkWlIqRgAdqhOdbo": "bpIoYTTf7knSiieOgABjYE1LGWi91zAOGuOtxQB2uOc6XdmtP0Kx7", "tmcL8B7WeGRYcM9B0r4DfYtybp6hm4i67ir": "TsHfoMYovWMFQ", "IpdIEllYfHuXcgTBWWmOnddADC9c95": "S10SIoiHLI2BnMa3jD9DUdiVq5dkyQlUo4", "SiTLcmImc7QhxOtl8": "ZsF07xdYp", "om9Z": "BLSVaCEkB00Bv41Pru4DjpS4hW0lkkuIlWJy3N4aewhQB", "L5oW": "ZdKrrRmPeFj", "q7YWIiXdVD47uRJlnGUFCP8155okjJxxb4vxfk5iLSYC1N7V": "pFduXa5rjVjsbFt2FjzfAfqcws", "guzn8myxLjptmejFaiQLOLBaCSl5NGHpkI18": "dZfePMhqabm0qRGXCLGv9ADAvCon21", "UcD2gTGogutYONwz9MGhAko2beeN0LGUpHfuUrAm23dytAcedv": "wUr78fvJfj5m7Lnktw7w", "xulMuOZWwm50HdbydkV8zNSrZohgC4VzQfv": "vR4W6R", "BUu0dmAY4aiUaZERRpnWsxKnfF5bVeSAWskwsNEtUF": "vKE2kcEqQMs1ZvV0dzWaqd", "x2Leo0lSI3TE9H1cUdTA": "PvRoujMeClvwHZbybqpLc5oSQNw5gfFNSHm0BapqNozPpMILHSS", "XJHlpp0P9NUK5EtPOKaP": "jmSJ4XbBXLyqOQ19JIn5k0QW9tGyw3fsiDtNT8SdbN8sq9ykfnbWIVcWBInTIBQ9", "QCsOgIgbXbP7OZhpshhXF6g": "xjX74WTOmQg6wHl8nQHk8ynY", "UHXGrLzQl3QvurlR6YoYTlKX17OsThCMX": "YUAfez1L6nROL3rEIPmKYxA0JvDwumyIuw3dgkVFZbQ02iCCzQjJCsjz", "DVHYT2uIGwp4mBTJVr8NyZO31hTVfmKEGGYu1y4Hm": "X7d7uazSmV3ZXCu567WoeXX2", "LGxQs6M475gcA5DNbrASx3ibNND2": "aBYVnOCHTa5BSEuqXlVI3gubwnQe4KrweVZRHmEfT3s", "OmMLUrIGsUm00lknE7bV": "P", "WhvsavBxVxfvsgwsXwT": "m2JI0dtNj0zoJUVPWhE7B0lgGBlGOE43cgm", "V2ByP9Z9O7OwsyIwcxtaPyYvqy7ryDeJE5": "Ql3vEgequsUTBcgNUg", "ZNdeEwAzqBEv3M5wPz70MmACCeeyUWTShhAQ4vJNXuVCRUcG4NHmwxj": "LhYtS1KOk5zNDK3taE6CjID9WcN", "I6VR8mhyMx0CWyBqRBxpiXgxkdWvOrAhyFNQWOkClHUnGT4y8MVd": "fEQJeuBNw7tvmHLqNcJMuKtRvmGpJ0FcNNvd2b12Lt4", "m45vGKmQSy57vIWZeoe7WdZRIBrArSGBXOjDOLP": "bYiYPQfB6HtzAszqW6Q8MJ", "sYd2hzKHXyP8jBWZVyxir": "WhQXEjnqtWXHKJt3FUvLOo3i", "PAh3byNT7X0dTqopj6F7bxbulDXKkUprnxkurte2wpkt6WgjPa7": "loyEZF01wPJRCFyRcLpcwfB0v29s0XteRZ5rEs0SFHSUz", "ANblplOiJ86qd4OLh1DsT": "rUFZVqhGmJAqAVi2smemlWnDryKcjRpCoBuwB5MemwDpNIknR47egC", "ZW3SL": "DVgVMgRo1J2ktSZcmwXJY852ZVTfZF3twSThPd68TcAq1n2v6s0r8D1EjhB", "tUejlZ6VovVyLRuyWaIV1CexH": "sjFHhvkUD2Wl", "UcyBXwTUpPPgnyq3ih1mWABLS0yJ7jRdSzGdIaRqdeoF8vuZUTXrac5EDFnMTUURP": "pJwkWd0wLuKKcpzHWLfEDs067hGIH4D5rfjEY9qgfrRZSrgiTIon3O", "bBvC0Na": "LzAN6eHE7MyynAch9uA9OLTM6Mv6T", "ozf86Lnwpox97WcPxAOtF": "iibzv", "YwRHdS2aeA70GtyUaLxVMkiqjj4Bl8cUByOzVQNWtCttzkT1YIa1v8krmIZOaS7": "MOiNEEe9PVXy1uMj44mHazsWsdTKQw0Zdg033hdfKrg", "z6xgWtEfPSYxAfeSJHFJAp8": "FB5gViv2RbC6MqLszHKJPZyvmSBSJudBRhR6rt1iyM", "eu": "LnBVsgcNi9m8sOeiTu9YfK92XL8P2QTDQiPtq1pZ0OalXN6u0iu7", "b93": "FJwe1TnZLK9fLTr2zARj0hDbZ3PT5rrd5lYYk", "aZUlDKqB": "yGIShzpsjywlIhI1BmZEW7QzyY1dYVocahVBjxL8v7iAqk0d9ceQ0erXcGIg", "kJUayP5KFsSpAV8PUVyd9rIHNXnlf2VteZO2EHCSWLS8n4P7rBIffcdrPd": "oL0yfoxvCdEhlbLVW0lFSQTwaFScDBpPQZ3kV8YZZhdkiE5S3TZBLoLPlmUn1sEY", "CP5Cq1bQGObG": "oQzE9hxeImDctU8bzafNWLLSSpvCsHjkY4Mffv6mCP4mPSXYzT0i", "tFOPDiyxHLlwCtYJRB9fk": "zAan5DFzeqp", "TwCym7kUWPu0wRG": "agVnpXFtwmRtO", "XRz8YbodjelwKiKWVJHLZdVpQ6Yzub": "fJaFRojzenkIklXrII", "CMuNgMLTeCX2AMc3CYkbKvRp7IqdOqQ2rFkqMKdGbxgknSiodzlqNo9nPAu": "jlRUOptFRq1iUFnpweeVzAtbVUMY7d4Irdeoz7yj1s9qm73ShMcL3wKCWr5TJB", "hP84YWGCuiI5MxOgrJkNSSjD3xGgEDr3otC9tUNzGTlxjw": "UallO8", "MTcdY3zm2efQbRAIDF0R3CXxplufJ3MzXMvoxiXr": "Zj4jKCAkA9fGvGwZReOSIopbUlokV0p2G0s0LLvFg6hOh", "ADlDAnkPA6Rw3D9cGUpt6xN9IpSfN605Wniy3IPJ0XKe3": "KkXiSaFKYmRYlMwV1VL5qIlpvgiJFHpnExLfG", "WxnHqtYL9soGua136s9ly6WpIkV2EwduRkPy6zmC": "oKrfo1lC5p3", "fZqQHDC6RoGWYvktxCe2xUl3gzOMVu9": "F3cT", "Thi1LXO8PwkcgQGQzSUnnBNmNdNcm5k7VgRqPXwkqlZViNFk4YuVMjV2CWNFn2wLi": "uU1BEX5LyukafYKbK2HI6sFh0Suo0QUHSD", "mSlKdrQb95St1I4XhJ": "yZbt9yKhHgkPXvi4RT5viu0GM9JrSRlad3XVCgUErLcj9fw81UT374qyW7Aoj6qC", "JZ2PcBOeptzbTXvIiumIOrfxOWYQdB1SMfSPg7fwUI": "hceyIJKL8kBi6eMVhGylRuPqx4QzNXy1nnB", "HZTAhQFHJyiAwIXKCXbWqN95ne6DNDFHL2shT71LvbnNYN": "WnKIKHBz4h", "CPHcL5m4mVj7355rxUsSuwSgGg3bTlK793SjjTudB7Y67": "cpEfK5Ndct8359OKL5BbPjQ7ksQCgP9oQDgrD024UCtolT7envm2", "hGtHo2bz6PxvhES3J6K0j0puv3y1bqzUPAtv6Bi3QqryNJ": "auOX7axG8IIUEyfBUbfaKvF9TQDL4YCBOEKuub9Dm8xrUWokYKwbC6Ozj7s6A", "N8PMmH6IW7QwMUIlmpjShree5IuQFsJ2XH10Pp0Fg6bSqRBUC1Gs3PX2NB2HI3brN": "g7aYeqXuZuB90AWDYLe2qldOqfPtkcYx08GI5prWZzKOikS08GXwWC8of0r", "HUYSTy0Tybkt8ptKb8Ih6LW9M3YFPdidzKX1zZ1bjgv8": "XDpeQLKxZtZg9", "yfhyGWosXzdLSnI9ZYT5YgYSqivs2ArnBdEfgwMiwcN0i": "PeiS60cgwoy9CR6XunHhP2IflME3GDm7slnfzATS6", "jum5ldL6stlgifHtIBfCguUgtl181xo0q3cWH3ACCnIWlPHJXXPEyAG": "c8FPHXfyXbKHfwxr3", "kKu0LiNpa3UzQNeG72xvpDrrpamXWU9hsIdwsZH0HvyMP": "uULGaA7GPN7jWizb7ntRn6nKMPG0yc9mb7HzQRzkXWrQhEcHFY2CiHDkvWhC3dpc", "lrGKSrXc4pbhwg8lxEksJvqiCvH6p8cGoWILx4PULxPgOvxKq33mL": "Q7cJ15RTVrnGu61kOQdHSeB", "DiwzkrAbizLb8W2PNyBv9Z0433bT2DKUU2tPKlq0gi": "oiJ2maqYfiLhCrc3hx4ZM6Pfoa9G8grZC8", "A9MQh5uhrUpkWizaCCiEK39I79AF3ENbAZyRDwWOhngKz7SaIJx6KRrs": "udbWKsW3HSdUohRDFvdQYbBlT2A6tmyazlEFnfreQLs9YDHpdCu1XZAxX", "WnEYQIbkU9Fs7grGLXncyeoKEEjlha0VdpIj": "uBDG", "rguplvO74ac4OvP2lPMxUG6IrkUUrTLTdA": "xTVC55jxfVecHsQMmTuEhfPNSXbnkT22a5ZRbuJBLoyaPkR3M24DYDVVxFDtENTs", "wcjevTwRl0KHYx7ydegiMki4miFX4": "PzkvjtTim13LMpXGkxTC5wKHhgeRYOnwi", "Mxzd1gvTQlFQTE5IJrDz9dIYXrIRlk": "S", "I06ytr": "KAmpRPfMpyhFGiQzPN4rJ3", "ajGbGaOdvix1EppZIuuzSPcZc62f7HwYLzdKXw5894jHrOvjESBOp0Imyt8": "mGSS1s4Hbp2XlBa19GHqAdhTCupLvQpdSgEcYcHwqE1X", "ARlud42H0rEa3U1zXvPLlz": "EijC2jFLvpVc9taQYjNMSG9xmSf83DwMNNwcwmZ5i8s3CJgJtC1AnNOWcVRS", "rSaCT": "ArIJF8DGFD9OTBSHXBfARCDJr32umuGBdMjCzpRehIRXCojUaV4koPF0eBAqRRXF", "no6Db6dYkfQYueAiKQ0IW9g83Fql3oiElH8UCV4RZfXJhOiBspVcSakwPcxufR0": "Dk5TE17R4xfbBwrPPR6zC3cTaWiOWGzMTVezIN70wWv2", "kf6Ngh9bRDyrBJ": "ILEf2kWT4C9e2YajGdN6bzSdzGs4RH1dYsc", "euFbGZ8n1n0vRlBJCRYdJ5MsVNVQkCLbk": "GpSi7iMkR3ot4XP4Wi", "neIlw30": "p3VkX04g1ZUdoaSYZK7", "cx8rXH651D5WtnZpVX3UJEONpEAKSbktEZ6K": "JEeq8uYOo", "IrMhIVF2veygkpVXhSXm8M1iO0CcVX0WhQlP": "B9dnlMD1v8gDuqcdbs29SsoZL4TilJxliqqEVDAyP0Ae6dr33BgwrcHKKXOGCzEM", "L7OX2CYOZ3Y2splY2dpWsYI6qfYs3gWIdlLEXdhksNMf2pu6qp55lIog": "Ry3bgzY26qnc", "WnEnaFxZe528DkpFNH7ucSqLxq7dMP2i6WbFWWk1r4ptOQh01J22Dz8rrXfj": "XG1sYh7lWCJX1RThhisq26QkzzbEnbAiraRGx", "TooRnC93S2RmPjDJkSAxlXABLUh8jHnW2": "UX5yLRz", "N3TiEHFM8LBWnHM0ad1B28PnWDiPdOYooG4f27aFoM1v8C7ECP": "XwaHb16dbcoPEfbtgat68c57MzNysFxhQo8NrR", "BC3Bs2Uj88k051WBmSgxOjQEX75AJksqho": "TlwHAA9AhrF1yZQ", "s0vz1FePLi9CMULz": "NbUphJ8lGv6UZQq1sjz80Zofpk1Q6h8l", "agn2laQ975EV8teie5RcJylHqaVmSXetGKott47IDe584Bx19Fea": "Fj5PRr6DfFP7gtK", "DmT6VfwrfSYE7ZAw6IShkpXS94Bd6Z": "BGLIfjQ1RTuoOrgwefuHzQIG4adeAyQDcstVBuAD", "LNJXyEKn8maNn4LNPL8": "gAZmjx6R4ijOTyutiQ3miJnFPugqqQOwbglXdJSYdO3xERuQxPuPcJ", "Mx37pxODZdReLuLHliRf3LG6OcLFg2yHZcW1xJB69ULaYokb2rmfze": "StFPQHnYORzCER2J7gRPZMsDN8s", "E6zI": "P", "ZAGJopPC5yXUcbiEWaweZjdg7j": "qi8CYsyOQp9srcnwDpjMHwdXyMrXtCVxjjoHswPYohMQxWhsq4EJ2GyTob0B", "HSKyNGSo7zzeqKt33pE2Q4f": "S4LfMQoCgeD71aXh5qKoQxDsPyRSAX6SWf8B2PmLyYzG55oBDu0o9njZZosoI95", "DXVQmr0r4XQx6": "BKEi6S7TLOM4jUs0tR6Ghp8u", "oPgFef4owzoR01x9H5EyvL7J": "C8E6defLFerljJY2o", "vmAAgggiFO": "ruKTh3cbEoR8cEadXHKke7xHijhGH1x6ayymjJ72mT1mcR6kc1P", "AS4VeMh7y0XXBCatMYe58": "wnmcx1iFw3mw8EbTWpPg70J8dtoiaICGwA38Fz3jDdxvSk", "xXK8K7nQ2NMueFbIRyWPnV": "H", "nNj1D2zqMt5T96Jer0V": "zk8YI9f6wZCb3Ba1SLJpB2dzQtk", "LsPn59cjNaClIi4vA3NoEJnJnrKf": "zpYwvkuoGT6hgHmZGNMWw9G5yKkIi8vj3TYeLOmDZlZv556kJSt6", "YGC3iqHLHa8Rtl5RbiAWLAN0jnSOzWoLA26fUi": "iNWmsHWUV8SfvO7CXpyC2NEtum", "WbnGbldO": "nSS9xOqxBNw2ucmKgxuKc70vnq1ZfSZRAc0n3MOQNLFkeBCuD9C50hTlXJ4cAA", "O49xFmcYiAGtCSyud2ILilIrEOcJB6qgm5H8PwCnTUENq95uO": "JsVZ2mBDhAetiHJF4QKGREA9sdtAq1CrPAx0BVbCyN8bpzUPHC", "AVLqiD": "n0vIB5gpUkzbLb4T", "e6Z2CmESQ": "OqFqVL9HxZVbMWCGPoQdhfjFSMHj", "zLp5x5jVYUaa": "RtExxiavWSqv7it", "zNy1l27XQCvznfhOJPuOhlCMVQR3Xfaqtqd0mkZjLqvhAPhfYkMWS4DN": "aYqzYft5k5ckXWe2QKbDlms7e8YJw46I8uxdlcKq", "oWj9oPBABRkz8WkK0xc60MBZgfeVGo7vsj5LnLnQKaYFQ": "iRu", "SH0M3HECX7QoDja0qLVIMZIAnTmPkx": "EZEHXdoO7zg", "yVTLBTBXjB9C6TLoY0KIwSr15rbnKisEzTlj193R1h8EUzuN": "FcpIKqGlzgY4ChXmzFY2uGbeuvzk9HHfKQ9nZYYOnMT0uPWLHAeSnUHqEB", "Ss75e5OVYdcfQVyPwId85vedrZxi7wjhT": "KBC7VMZFMreC47vxuTiE4qzxNdWpetfrX4RY5llGyeDlYtRnrD", "tj83MHmLemYhc1uo7fk0zEAtl6PDt": "jNI2pVmn6g8QB5PNO1de63IVkowvVlBrjkqimpAd5KBTshBx", "n2OkydlQ5kKlyFipAhx2oxagtAXnCHmxZi": "XQFodsvii2Y6SK3oFN4bBEsuFjKGbQFwXfY1AcaIZb3LXaIudNQQzRVOqFQPnFc0", "psaQyNSLfR8QvuJEduy6MK4wfF": "kzeOfeJ0H6uGQekZSnCMQf6YYAxK5cI7", "w6dDouR": "meX06DOhcpE3K", "PM4DAoo61abMffZvhflTsEJoiVJsuCf585bvIEsZfd8": "CMyaG1GWnVPIgAmd9qtwUEIefkByUtbw3GCQY7Hj", "Qd0NQNXRJDq2uoGMfNG6eIciMyRR7PlCz5NnnNakjXz3juEjX3j6zjD8D0dURuK": "Q06LhRmASOfyYccDnfvKVYuxYAaUjGhjW4eAaOCt", "DDRMrNKAvQgbbHw1KyYl26t1tuZhNH5uzH1": "gHVhCnMfOBzymElK7nZk2v7aZUryR6wj", "x54ABIDWRGS016pyTC1hRYGndpbgvUy6Zcn23VzzF0l": "DdjlVT0D49", "cJgkIFijHnbV6QJ09y8BjHhGhvbSk1SdW6XU9RbAt7WhOJdEORhNvkcf7uVzaEnu": "zGCYG4p", "F8zHND1vvz1qr5GbakX2pib": "PB8iJGY6AoYNfkQoYqxzhYP3", "vLOiJs5a1V3NCwP9QQjITZa0HLtu50": "nVLmGGFx5oEah4TPrOM3DwnBSy7p999Caoq4qrKNtFwM3MstuHZ3jLl", "ot0excskcs": "hEL1aKUsJgauOB7UYNsL7isapT0BvvAqjYP3PTF1Ta1PNo", "LQ": "yOpLT8guSkpBmSRKV4k9Kx0dETBDk7Bo7fnYhW5JMu", "V82mLtRZCMA09x0vzFnx2VKXsJlagnklDnveMUxTaBoA6uuCjgoy00kpAzB": "Cn6ZooIN5GyENrxoGyOyYG", "vTk62Nl7dCuTrTzgwcTMAuQE4YUWzknJbyTBVdN96ejTS4tvJc5wlIUxNe": "LZI5Gh2Xk50dWW69s", "yKqdDeH1P4I4VQ59ZLWAPQhzUAHcifBgfvNfOu4KYlSJuUFbAoe": "cSq", "ceA2ZwO2BnbQtpvMxBkUJQtlWtut1Vax5okOStXcmwraWcBsNTSMaTRxUT": "tpreBfyqZCHZ2VPk5yzUOFSJWGBd0s5yPHqIzsQKjsCkJ73SFUlewAEigBzTI6gNH", "wCBHTFMtrMkwTzUClFd2QpOrM2lBghW9zE41ZGSkfks3L61I4LFUaT1A8e": "v9MgOSw5XnRbCtlfylmp0lzYPydtPWL5eySk7NSCDWz", "eIaAO6AjH3WnMdQca6hWm2TLi": "fgGA2jwUUdNRVJqHW", "NH5VCtxl1Krkxpo3lITyrF7JQUNN9WDHGen4Oua86MTu3N8oJz3GjWFEb": "wRkKYmiFKvTu5VMOd6VfxQEb8nuz9yImBbvFbStiR79nasrmSzcC7Jw47DJmnPHQy", "rVlF9orW1VCxt5z7vyCMtIn": "ySd2LXRn9Nz47FjuMzC6riXvTa2LYq", "bn17u3o3RHvRXu4vA1rZD": "xpkuUqii7noOL", "gIPRoXNXroR6cPd9oC97kJ6imsd2NGeZVcdlp7Cljl6jPBQdnoxC23g6A": "gAgfyRvMUX6NKaGvyJyUryjy36j6qM9hmKoCfENlHEkWhEu0toxAtkR57X9PoSO", "b3yy4PZdPZE8dBXOICGG469CCqNTQNUGZQIilYcw9UlDSFomKvKXzZTI9Uxnl": "VxdK", "mLEbJ6ko5yu1KBuaNesInn9AH8QvbTOVTE5D5QSRU7ULv": "KsikwF", "hE37U21mEAOl2AapY6oPIYFd11XH8MDBe9COudUArv": "sTNXg", "nSPIjcvgMD403NZXcQOhm9QCVmanzPkgdjtOMcgtjEtdwC": "oxfy1fOHJAaXT8C4GjpvBwHTgQ2f9jTDSUlHsXVW353Lg4xv9Lgr", "iQIYK4c7gTQMoPJIjde0cAyG70QAMDPa6RNN6Vi29mWwJzZyBpNULcX": "qjUoBW4BFdHEC8CRKS", "utc7eAEwkiUUIZfDRcHfhAMajvt6FBKDdsoNBQ7UOhL6UfA51zD0": "rOFvajHf6lirCyC9A0Dr87wOuD5R8pfFkXZxi434ZWFc3xA9VvA", "Ed1OOLicCUZCr27qeaZ36w4nTE6AYvqe0mEJBiMVR7azb1g": "HObWmHcnunlTCnk8GSbTa6MdWDMKU5IrrgJgsvj44IfzOA1gaJCD9ERNo4N8NxDK", "EYxBlXzJuvr4zQhdKFHXXM9NQT6E7oC2aceVETE9GugQnPonovwpFE": "ptP7m3z0lYDKHO3Q0KkZVI5yHkseiz", "GXH6fKAoFgvqmLnUsIiK64TRF": "fjO2nDPLUufPWDuWTnCEAeOuiI4qm36Hq9hS3XQkVineRKycFDP6SjJNAaN", "SZbURZhd2YBqjagB": "n493rPO1vQ5nwFqhwl3fwgGKrg6SodZuNmzb21N9AiP31Exjgax7CZxH", "frNWqD7UjK5ET93vfmIFwz6Kmac": "b6Tksmuj7so", "y8": "YYK7WHpwu2PZcv0HP2Y7cTBZWo93lr3j3xtw28wPhLRhRyeLLLpsBhnUWpD", "pvHxdDx": "FQIuJaNmsb201ZmQg5pPqoCotg2Jl4IHfx7AL39AUUklfd83XCInJbShOCp5WE30", "JAxxhI2sYUyWkgRJCZOMtzO8FDwf6UicsBOm8AK1kaAwGWkv7qzY7rV0D3O2hFZNi": "YbgrbgSfE49jOCQy8rHPKwfNMsDofifgVD", "x4YaXHMhFjDdyrt0rD0h1gj4v3IdEkUx9oxhQZHPH2zl1Cd51dfjTAML": "m8", "hlFiELDJKCKhU7vIa5rFAyUeesus56drKk0SSu06mR3ypmaIrJdx": "tkS05KwTxaNP6Zg4oMoNm7NnXEZ2Qr1HIdgi03qxnAlHogUfI6CoHr6u", "HBzvyNQxss": "PyunrcrccP8n0gUserqfmsoojqoxtrDc06FgLsDhlxOqRyAcOLe6eQnqLmi8NTkD", "os55SFp0SZjlGmp32LT9zBzq": "W8SVYL5nehLGsTObJ7XBtnGumSnljZfwyppuYmMLh6ORia2IR", "FZMSg": "vPdClWqum06GdtNjei9a40Acj", "eX9SXI6qeLx0gTkK8": "Dkmw48kV35GSXFu4v6GcuwEZ4uXvCTZGowTnGQkEl2yo7ynNVckSql4oufka5F", "UwJpBPKm9De9k": "MJ8kUpkHn9QagByK2Mo7BePs7ye", "QWyVUxC67wyyearqjJDQzsbd3xqB3c3epBhGpPlOgacUgWt8SXoL9jnAfpO": "J4uguxd", "feNOscO8VEDjjeywpXSpdVlW8dglgp4x8YJUFm": "tCRxAqeaYvEf3Zstx", "M0T": "U9JpEMJL1iupERiiOqiHorrcr1BCEwCaes4uXtynL4", "XW2qlEnIRdV7w": "DMwiT18IVXLN1GggwmL2k4KBm51rVuQnDXHVJmPzR5kyijujWhdWUsmISl", "DrMsvIuQ8QeXrKAieOCbCssRfyj9mKcI03USiyqF648wHbgU2V": "ZZTNQG", "godgMWJXIAqQ1MA6JqvM3mt9uAFQvHhO": "gTZ61RU1I0YnpaKZx", "eu1ubZpr6YgWxsZWOutGL7ttLRafadTdtWOM": "vjGpIaSa2pIDz3Xgf0DhZb7ZytJi1YuE", "oTc1w4qWfJDISy4p7tsj0VLiseC1eKGyIlgtMO": "hrzNm2A3KhKENiwbuDEU5DHkG8Zhidb4KpLCxKo2oWRXEfvUdEb5Gsf2R8vL", "DXd7VrPTtUj2fUYlwfGqP34y0N1I1v1D13u4qQFbMaILnsZrGEBS": "B6Dqxm91H62Aj7DMZWXxQD7AtzGVuYJ7Gxul5BznXzaw4nX", "HR3llVP7ZvAc3": "LcVa0ijv9Z3JRTFnmOPZSu9N4Hnb", "ie7VaRcTO4fOpZMcK6QcSthUI1r7DLmTfNf61a795HEaFwoF2qT9yIFYA6gMxA": "jT3UdLT7vFhpBv5ZOrNTujD8P4dMGEg", "UBeKJ8ML1fnpir3IukllQy3Vm9bS9lEDXP2Bc0qD9ax5xtSNrShGG": "Qtw1j1ljJXOJlA7btaIFgW0Tv5s8anpUlC1XIw1CxzHDDB", "YeXPMM7rjKF1NWVvy6h": "jJWk", "GUjtK": "AzLETb7oKpLdOmLq786DFDy", "blnDQS9mAkxQ": "iUo8KVSlvvDv", "p6cFAi1fVW0y2zLWrwxAC1ETGE5Xz2jGQGZ2u": "Mtl0RqSLIkTcCmMedDNEpvKLiOrjCJbnLV8WmuFssJfmTjfcsPMO", "WPkFWfqWzehbUTKVO8CxLP8x40wKO9dxBkjuH6po9qqa4k": "TSsi4pEpsGKcUVe51pNHnJuOZvzbDfojK5fcNNWSL8K7SixUHfwrNowM05JEAsN", "nLPhXdtH": "Ds76KHhtaLTGAvmZBBvhjQwl3FTLk6CORVhSZHcVhflDsRqV", "V7LrglQE8HcQmO3034EyC6hwLqQVnqdYJ6e6MthNZNWvLX21GOch2": "ZfcaIAHlJgHiSD", "hvEamR7QnXVjtlmbnBuLqossO8S31Vvk8oSfkOi8UgvJnYJdJTrcj3xAAwW": "KPZtNxmJhoQqLpUsnkjqS81fyd3P", "IGsmLNDyYf8ykm2PcpPPl3G9T": "h9uhuH0ZXBNsIhwcZct3mElKOvHTN6u9xuyCnpQ", "sz79B9PAM7L19bi4zbIR5fXX4252CacxRs": "Rhg5OCiJydZIn7bM1I0MjxqDZrF2Q6wsLUyy", "Je5X9EeI2HDP1JaQVZsNld0PEdf8tIfsZeCcNDgvmvwtuJiWM": "A57ZLHHjFrGyR7KAclN9DD8QhH99gV5maEmFGr472wbEjE3", "dOxhB2oPygTAcRb0alTxRSDrJPWV": "eeZU8AvcHhVUsioEJZxYnIy2ZP03tKsXTbmywkGF5vZi8beGkvJLZBZtSvLJ0yf", "Kc8rZyMk2N6uepN17rQxOowo0zIbJxtqfI2Sbo5GkFvJMlDLnMhFW7y0tlDFxKt5H": "qcrwqjEQa9bGNzPSxyrSOneYw4xDkydbn4hzOKXJ0ujvSkvGm5yBhyUKZfdAqkarY", "w5oFtTuDmPikTVlEl2GErLpRlLOt": "BHWvya8GinQAjggRCAfuF56z9QF", "lJnSSYmqgAaJ7f2gkcKkVnXmdWK99AzH4weACIjNPW6bfc0o": "ZjjmZB97sLpvS364Cig9oLssOi3Ww6fTf8s4jHOVrM0tazq98O1iNYT96XdX", "uQS7pCqMyd9T": "NnivXuvcoTKNM", "tscbAyHjBjjjuTnq9vVEdzIPPW": "c845WVzvyBE", "X5x5y3ALa7c3060M6nH86in1JzDZulGr3": "BjrchleGN7HLVfO", "V5tZAjzzDwMv4U6vGIcALyj0NLaXx78V6T": "gBffnvrvATQltGu1UZ3D6OAThoX3FLPTJpndjzAVZqdi4NpcneV", "aHhnZHWz28TJoUgGvvay9E7Lo4G6ib4qoOxgiQPRoeWc0NqrmqodleSBoY7Xl": "lrBh8UO", "qsk1tUvlIVuV3pW5uczOA58v63ueP6wCR6oHPhvN9KKbzgeoxlG4v": "oDou4tKYTbpZCI", "LIHkgENQt3tSkIat985SsN3CX4UTld9Cx1zEOX0i": "uYJnrtF8u77k2Sg0lK0GZ", "rkIUdhC0FrG0dOGKGbyEJNBOUFdtGEJwgxEDgSfNFvpNptl": "E7PMpk3gAn6IpMty9lbCap", "oqKIAnx2oZL4GAN7lYQXpRKB": "Xi6QpkRmtK6jQJV72FF7TYs1KKnQsx7kQQXZRsDuklcHQSvCX", "R14UEAqpM26g8TJCUmIHx0BCzhHXNmmRLmUuFqanfc0awBqo141lN6dNypxU9HKB": "T9dNpdZRhroUUZTOp", "rzzvLVc7a5Wyp0aIWM4qmfDCRSDT4hWnv6qDLF4fyXfgzsNuF5vGBT": "xBgoFjYb5MinWLTF1AUBss5ahkAqAs4hZS", "LB5gXvkPxRwPWhl4vvceCQ3fw8rB0ojU2a1NQCZ2RawWC": "mI5", "gNfh": "yP7I1heZKGXsP2BxK2oznD8vaNdfPEsAFPqBUfEyeEcu", "JlkzrpQMGwcu3": "BznLrdzG7tL8jCXvog5LX3RRZng7rHIHRKxu4", "PvsnuNSUK7o6c": "RR9", "zwhVkyYlzRFpwDuUp5fTmQCmqFSp5kODFc6rbRUwYpeEXVx9Ync5f2A": "VXEYs3G3xSBA9OA4H3bfSMnRQeLEV9oyCflmBRPQ6kCVZVPiZZIscwGp", "v3BHJD9FJUPIvJCDck5ERsJ25JouD": "L4GOMCA9RrVD5b52sgESI2l8T4yoVZKkH1dDxZSEyVYtSpaQJkS8Q", "r06jS45i3KWr78S01I8bFlJZwRF": "IEfo9mSoHPDPWqb1EM0FwqbZxVSG2F0TcQXLyL6EF2pEFDvftkTFK", "ob3FF2Wa1gOPlhBvljd2ncBZ4qcecRpg84KX5DflqXDq": "vDOtOqngoIoPj2aKTlGao9QPraJX2fda6JzVM", "KRySw88vV3uy5iM1CdR1BWZUtJKeka9hHS5cibFNcNHLWAeZQlO7LPG": "sjpKT3", "BTpzJTvNY9UFYQ1WoFILeUTmBM95gQST4KE5PKAqQaXdzbD2qOoE5DLYeZBnJx": "M5BWRS7x0qnApshjhvsxx", "hdKL0zy": "iPGSTGjzPpC", "B5iFEkUIxOztDkcthCDfNE5mh1BizIlKMtasszzB7DYpPNUjEW2": "tYWP6ExM0OJHKspC1qNzsRtH27Ya9NEsjvPR7G3t8ha", "Ad9BWabVtfnafl5": "maGfSTgkFRit1mnNfbhn6NY5e7KM2Vji4Ol", "u9fWWVWpI": "vTzRSYktb4jDIt0Hwihfza9oc", "xddxR4mfw3dHLPWJxhODAUg9nzBR5nTeLacvInkKQDyzCHsBO5el": "zYStQsRmJRw110I6uTgd7B6zWI7H6vCqmghxm0BZf2", "me1ZhE": "CUIbw9N4TBooR4yuYznTdeinR0jgLDVxA7uBIONLpqL7CF7YmmMiMoGzQqj874wH", "pkeUfCo0UMHJEvl5hv": "KPJZnl7V9BScCMiw9T1oFsaRAakkPonugNNXgPAjVtG7dBvO7h6b9raDaTBb3Ev", "SWWrB9u8ITgBpYoNlsYibkXwz21FC003DApaEU": "KGDKBDf", "JvpyGbuGC9k1IfsgJam": "FnzI9f9IWycT5XG7dX1MF5vQEUHuOSw", "Cl79e03yJtJXYHjtFYzvRWc": "nkwXb4EQTH3KFZQkQFtHqYcL4uGySsppFLb8rgX36EeJcireGiVTM", "SNQzQ2UrOIWTQnE0yc0n5cPGG": "ipo0beoA3ra5w8DxPSrTlZ4El8d6evuImXMeY8gdh", "QaBJOYRHfi5z": "MrtvqCNiRKqcIOeZd0omJSHlBSO0OYX2MiChGXAQ1CqCyAn", "nUWsgdvS9oB": "fN8Gbz2BweOEcu9EJ6NTaAHV4", "EaC4YKQ": "jz1mKAzaVaut6bYt2G56sDsFCq9XGGb0wsC7cmCUTBgNzmxJHSW", "eQgE2fqunVldX1Fop5z3R3Y0U": "VXN8q", "jSScYAhoSk6dc96yCZxxObdSFEdF2X8ZOKS40KGUQnYa1DxE": "b2eHBcYyJ", "fAbiZASJdaImHLG3dWkzL1UHEBZkAGtNpcD9eKkNXg8AIcSb1kS1umCcKTOUs": "bX5X668L9BG0jjtt0phi1dpT7QSHl8MbrYh1qK6SaXBTHvFZpJuxEDm03La", "BYGv4eY9HrOPxfDIbfWWCfDlSiweiTHdM4kB": "FnqzVUAc6DBSCWx9nqs8fX1YD6p4u", "I2sMwqBIXES0VeT": "Os7dOpMOEEY6GmNYInCTfxUdgpB7Ka7xdrjL", "qL5fDDmCqXGsT5P2U9cl8LTDuZmFOBclIgvzoey4Xy6tV5": "pNZWLZEoEDiPabx6I5NGeIpmS", "CTHqrUWEa470wQDWG7mA96xZaebcW3RcTOUEYNedReR8x98qW4uftz1gvjQU8W": "sABdJcutovZmTGo9XpBduyaLF9cXgDGleOjiMwU", "hwGyvzaxJHwABBL44fDy2IIWxTXTGLhLqpyyVcVTKR8L": "QIJ3fdaSvEaNWmDbF7R4LuZle", "GdP6NcqyroszLyAISV9vggBmyj0ONp3u": "twlDKkFzZqbVvejn7Fbn6HBeVpce9KMT0YZ3HHmwfunZnAMTV2BW", "Q3QjAdn0zcdAgqUTK8VR7i42IRhN70n4z5o7X": "vutW8yBEUIrCVdRMnnc7oHeXDsR2mZm0SZX", "rtoVIa": "odbmuzosa2PPxA8Y3bejqem9mlSP", "NTxm2OJaILVEYCtd4tT6826XdHvrrCJb": "pRE5rkSNJKgaRbSn", "hRfmfbqp2udV": "RHE3CMh0mTaeOX7PTLxjRC89Sz9oSTTLbr3oV4N9ILdWlqHpP9A3qol7MzmE0lS1O", "bmchBQUKxdx07OW5Cv4f9069cIqELcvvgNzSMjl3Q2ketmufnHfx": "deg1VkQImrvWx9iKHrlcF55MD7YD279a2PW2SwP", "rP4jZ3L3rj": "tC", "i48c": "GDuw4aw1Ar7Kwctr4BXl3A7cp1xoZ6KKWLKUrTVgk", "xKcoT3niaOYaPiirJpTQusfdXEqbauRCuYzz4Jr4h1kVQRRuQb7Q": "WlWFJbW4ObQPis3gxCzMfcY1utLtWwhuCAWdxNkNB62zVg0Qob1l1X0AY8tnjI", "GaHGrDznN": "eEth4", "Htrmkug7cY2z7HH4EHgsH8PRY9odNwvIkKF4u4vzi7FZ5C9j55EyDEUfDg5": "nNWsYlFT4g", "E07v1qnYqBMhj5RN": "cG51U526vHTakwAAgTS01BI", "EUmlfYJj9hz": "d1U0BtqCnpvICDG0S1LF2CMVwom0sBiLLU", "Uri1OIrbX2St82ebItBTm4sNOKhq5Bk": "hiFXfW8CLSsjdXoTlM45mw9OpOGsVVJIyVOJDwhvprndQ9", "Dp45tzOtX6wx2vuJxi1oUEyxi2tto6sRCeqHO8Fw8ryYBoI": "luLgOoBk2pK2YZErDJgtHyOcTyd3sFqHXVSiMQqyV", "EwOxMDRwc4WkwvlhMkcCcq3Q": "pIs0ENhz5NZTbB1z", "F7EcT6RyR82MjcJxKMDA7u0": "rhbYjzJ8NoFc7INqFD7mLgjjY4KDAiDkqBlvVP45jswGQ93Ly76dbBom2amrjfHO", "ADcFtRMXxTG0GFkwcDJNl6": "WhXgE", "gIYHAQy1dZa0D0Sbq4qYdUeDVJKJib3Ff361h4VMIJyJeWZeTFAzCmJEyVIX": "xEjTUgcqwDUxhPi5CA1Pq4Ra3XrMxWWRZvZMYYT4", "Cmwxe2GkX9XxPTaEkt6fzkCr": "PRf7570", "L06F2aFiEKme19do9Va2AORa4E0PJm4SqMxFjB59IrKWONyJ1sbDUOsW3fyNj": "HdneoqO2c1ZEnJst6fLcH1zAkStIj84qjjeXimSe9ibKdv64eQ3i2MqOkyAwo", "hF5MfnKWcBCUtIJgsam3UqHuRlQeWnTk8l9ImxWB1V8D": "sVeQHVbPQPUvpGiLHidLhgFNOY8K3TdFBlc", "ErkrdXB1VyWLBb": "i8zgtzImLeHEZnHZUPLvkuAQIEO4gthk4jkUcYaubrZL9xelntwbtjy", "lnalEr2To4rStGDiO5L9kMcKR2I4naRLs1CAHJBe54C0CNUkqUOXS5P74b": "gXneHHbTpKyEcMob5wXQwpM5WDTRASRiNf0dOos64BZ96YiXwpf4mEb", "ObXoSCzU8mbWPEZTaX4ThKxE3LbL": "zeXnqLhAN9GmZKuQeB9ReMWPIiPysOJ8zmGFt", "HgP5hrdTZW0HMvLxn7DnSV3rwQpuVK": "jVPKWe6LSk7lPSg0oDPNYC2u7exGB7", "tC1cQNjqZRtMFlEZclevQvjZEUbcGc2Fq2MyxYo0KwSPOTwVExqVOLUd9fZ": "KvrsKlW0BzLIvDKWpESGTBqBMsIVN2nzyvd6nHgnfWDUhXjFf2lf", "KKN9hFpp": "U6429DDhUPwwc03qM2JHTcEwtU05fChxUlBQU3hsZVdvnuo3ACOOEn", "SxfeN0SCB82ArWBChk3pMe": "wvqtqtP4uv1I7k7UFxTNLolrU1jzQB3DuI8Lmv7X9v1PztViPUYXh", "IvrIaIgV8gywgbO4YsdxljxEUsK0Ki6M318t4pydBG0MfgB": "GOoqRcahi7orLF6RhoRB1lpQ0DczDdwMX", "i7KmSjvLoGg7UIkPQueuUUfM1GUMLo9x5LkKWsjspGg5bfoUDM3mD7": "ROvnb6aEkIEodw5U01MQjIH", "mugs1ACaLYpQWAhJ8Cnv6tw64dHCbTYqlaCWlYoTXxdh": "xrIYsF6SGhUL", "cbcPC2sv7goUOZBE9T54XMvC": "I1podZ2vXEo", "YC1NdzOReaj1qZ34c2YoTLCfVgZ9gp6bN3kfytX": "aqfntyRQ4sDdaM4MVKYSKA0yRXQJH6eUDzEooz5kzbKklCvT0wH", "OkWz1UhIdGcfdWfV0FzTjXD3hpFhJ": "IpNrYBYUuS4kgFwT", "tkQY0a2wsMOS8N6hLQq71A3NbHjh9wv0nSImJ81odA2NrYMYZ57qM": "CMuFwk8VSCKwQWO6cQn0", "hCn": "xgvPkJOfd8H9p8n1Bp", "dOPs0HElNs": "MpyUWoFStdzK3KEu", "aRpiFoITfvEPfThh1UsLFMG35ChAjgigaqEIgAJzm4ltYqbTk7xuC0": "XPO8WfCWoF9lmOi65njkGtnQeAni9utwYQI", "vmeEhZSMU33P5qbD3e4hk06U1pkVkL8s9WQf6LUrTEMmWJGBKvxwzI7S0fuIED": "GlDgkPu4vF3WTjTzHdz2Xz", "cfkJzvEUuaONWUQKupzCr9qIe99mo7rIubPgg6Ws4On7Yh": "sC13mucNgX1sfjdaVOU1pqOACfDlSJl79RzqZD23cmo", "UhkZFufJo3Q3ntlBOvHDPO5LKCYyRtU36iUXCPui22GuBNp2vOEBo": "YWmKiRhKUb5EbLSzAdgouK4FRRdA1", "IvvjtHUudwLouDXtDuFUcPwjfRw1WlkWdQTn41N7xtNKlcMxyjL": "zg1rF93I3PgLWoUGf38hvli5h3hbe1csx80MmbiUNBv918JBp4Hb", "dIdaDkI8uYBzqs1uBVhtQ4KtBDbdFZ5w3oZV2Y3Rmw2W4": "lYojyKcpqhSDsErcf55S6KlW9Ji", "Bxar5L10CKCDLgb47R0XpsgqUMzF9bPXBUkuo1pZY": "X", "BsEUm5514ZvEolFcnyPcPgQ1nWanyvvEn4Wp6b4mN95mDn88Y": "PjlJZcF26sL4PGWdRc9Iq6ldwh1lFMxkVuutus8MsUhqkqjjn", "uEgyUDZ02ueAv": "oBWFDEzb7c0P27vU1ddgtSorOHAXo4e1HJF1h0EXFRqxPFxCWOkce", "zWjl9vxUpm8entWUOKVLeEs8HuhXYH14yZoX7RmrAxOl": "Lwi4qX5RJMskvjSMAdCFhSPhtsphzOVKcIbkRfTI51oQKNcnVUALFk", "rH6QC3OYnxSS50sOApcTlav9J8nK5hnpG4D": "G38JQzaK5TzpZRH3GxvLqcGBAqMHqP0LFzaYs", "zQZ8N2OwZUAJUQxZ": "D68V9IwQPQAuUBbgXJXmssYNGF9idBdhGQ3Zg", "MuBOfRmsAg8IRsXoHB372pnnPSHgjYOz0u8dqZtEi2b8auJ6FyvNNCT": "FPswCzKMkjf9WgDQIE62qXuPe", "aCditDiKpZYbxJZPW": "nTzOE4Mu7FFOZQKtqviEaNgQ9MjXIZd334H5Xn0ZHA3fU8VaU9IjbptPXS", "tlxC1do2dEXibwn90n0Se8wUw5B7g7eU9aMCI9VHHVAB": "rjYQVdAgOmnGP9VPE4g08NROZdMFKfKatsUXl84LT2CTjZKpYkG7VLxnlU3sBPj", "nVEtgGW9FHEqjgl6wrUVvCNu": "FGMnqw7wXixPnw8BrcUFBdNOzOxwVdz0rOfLlD6035eMrVnXaO0imSj", "sELYmKCtSwP08Q4LlWgC8": "RAoB", "xGZjnYy4BCp3jqdx": "d9W9zNQkxqgLoEIx5WrIEvAgO1p6410Ht27u3qiHzBbbg9oekE", "vzjR48S5NnqooShsudNqp9wH7Y5FJNU2mTbxL8UrXVQL6K4uTh1DYcicNfxbMP4": "Ge1H9w6kE2jneM3CvdtgSdQ2EAOg9jbZPfZ3UW6IZFazbQsdd", "yph": "Spn8Q0Fkr4A", "EB2ScnyF2qw9LLfetVYovVfWbvoMR": "F5BbDgB74Hm9p6AMpYK4RVsaBUACh7ihjraHqzHwpLwFa48mTztEBAdEaY", "yHEL6Q5sedqd0Po4fRVxNZScMb9eqGwx1molArcpT37M1dMBv": "nZsoAZSNsDjD7KzX3DBKqCp59Jdw70eRxwAtZhtagbFu6lURb81", "XE4w45tA0hVOeefONHR07GgHO85ZOUfJDJnHYcimcjC2t72ijK": "HWmajpHhGwuWyu1IHWGNljqMCL10godYQNK5DIhC78y397ttsti", "E9y8oHNUZ53VXQQMEEADHzwWCIbXBg3KaP8o3IJu8DBH8Wp": "tMKoZ5OgGV1tPQzYMXLGpONgEblMOtChxi7IvhXvko9jTdG1DvlEB6ks", "fO7YfNkGn632hu43Gg": "GdkLrm5Rei5yxS3a1kImzTVPPdDupRMZUrtVd6QzZxSEkCcB9OX3LbEIcJLU24F", "PIcA3aV2pdmMZy15qR7bPQLw": "CCrQGDgRShKxJJdxvkCyl9IlnYcj1kpC8u4stBJ", "Tr2nLkrJedZNn2BhwK5lkglfjSafRDzyuMPNVmXqI5d0Th": "fO8ZErTCRiKlad1EW1VA8Rgoz", "DVgBiB8MQChnAYPlouTJxHWDWflRR3NXPuHKVcwT2cr7": "GkZySn71zbtbtBdHosqH4C81vo0YMglEYi5n", "xOAW5xq5m0KxaKUxEz2WtQY0yf7QGZ9Qh7cOcVJZv2VkJxbIx3y2r": "FDrP7kd0lEswAcOe8Aw8HAYW1Ed1SQH9zyxX8Zzd", "K5SRlGdqyAxq9AwN9fCqy2WfAOF3VA65": "RbXTrSvwV7E8s", "AwJbvbGDFwt": "L9FUMQxYLsumtEiLOAVWqnVxlwVvbHy", "KQILN": "unBkz4dzx8aYcQpuiu09hKEnpIsK03vn1e", "ELLx9g7flFxiHTXDZMErJXzabJXQ": "yavFVpBWD0MDJK8dbDD2L2Rka9fFVin1M4t9QcGEuITUW07I8ZE", "unQI71ujXqb9huyIccFYIdXK6wOKBYCflugwRM3HCTa5vS8f1HAlhk": "sdlzRZQ7wxbdrA98hStT95FJMvlhMur6eOd2Uaj", "jcDBpJG4fvCotpiaPqFL8UUtKykcopsaAXT4CKirdDLKKLDxoVXTSCqjCtqTc4": "tVzTtQOyreloJnk7ycxBHVrjSr7blMDtRCI15FA27qHnP23", "sCtEos8borghXjeoX68CWZKEZ7yrl2D85FXAjfxjb": "RPw6XyhTuQwGDHddZxnwdkhG4HEetuMwcJgg6JbwrguIL22OJ", "e7n": "AsMlG4eaBnIsK2VD4elxW", "PClvACxy7kFRHuneHZot8HPGXGfuGhoTMjQb": "jIwhTj6TnilpFYTffRznxtMfHa6g40HfsLAMSwD9n", "lHnQ": "JevLPLhb1O", "PDYRcXhXIMHIHBZgHYt0f7F7eirOpaIZKwfOPiF6TuJiweEBJ1ILVOXKxxcsTZG": "SqZ2SdY8d9UqRKVYMQbS1k4UaSvRKbmJReIRMXq8tcWQfuX7Sv2OkPi2oDsP28AAG", "pw4x8bQkhAb66fVyaQ0Ufnqw2iA1mQByTlVCXLoHRApZWRwRTYS4nZaHI": "J2cGjTZftLSeqUYA0KgKIWN", "Ov9z0SVLiwA79OvIQC7j2B8KM7XD9dd": "TrdRy6fqOMNGWC88Go0Em1zEFRixofGO6qpV9cRNFaNbzAqckIb5BaCezNHpW", "gSNokJasvQgS4WRIhYZBw24vUU7R7CfR3ErFPtZ": "ZICuMqQDH4MRmAp", "HRyxZscM1SzdHa": "AYHB5QnwtWuY6ceIJlxogZDaMKvMH5PvZwunnyzy4Anf28", "Jef01rUM5": "C1kk0AWdE6C7JJMmPWPph79jKzDpuLy11udS0mcc1en3", "AcYM": "OdiWfJxTNF6AfAHO4V11fS2fnCXiBvL0MRThGkgEedsyJ8TyGo167FNRZ", "jS2sVx": "nyHNtSqUGVspqwpybGkJ9y0P97FZV47cpOTIQCedXpFq71jKIt0L9aDS", "Uw8lGBAdaG1h5xFbpeJFC59B9i": "xMKzWo7P3KzDmgxxU31D2AGzEfeUVT8B5", "oL0TAfL6ndD8utrOjqDUr3bZuLsWKKbtG": "GsGdSEJt4dYEkiIgsfhGpPD7JGyZLfc0xWyIpuGKsCS", "mKdOM5p2TbaPDm6gscHyjp0BSr9s0Gl28yZoRWjCHdhF1sTUaWErxGIm": "hFFNMAXqW2vfJSvqJjOTcckAWgaAOpH4DXr91Ex", "Rrybsh2Mebqy": "GwcxUCfLOylLmumQr0Ng129sJrL67u", "JQk8FIPTEri9oL": "W3zGGjyfbsnDOn", "UitT7MN9oqey": "nsDWBdwTGiVo5o8Bi6G6Fa8sWMgA1wBPKjSvdUPmr3AQLC0g4ICL", "jGCeYqLFBRl9XCj3CAqIXbuNPdsrUxjL73GwkCrTZj": "GGmTHCRIDMg1H6j5OoQHM1akf5T4o086QncTpmWZof40RnR0SX1JrmcAZds7y", "zzpDuMuaEYL6L9YgYxfVi6Qr3WJz7rjqjUCnysZ7yRMDRCI8Z": "Bc9xDvdUvdHtf8AsLd8yExOGnk7qtcRt27iXv", "fKqXBZL7ePMDytrHEdB38Jms5UCXJ": "HABQMGy1EBbv2T2MLWkVrLaYaoIXBAirUKtLO0U8CChE1mDeD", "i6GcQ17XkBgpjtfuuGbsgXoiOa8d": "tW3hGcHqpFdUaQF90zOS4", "Zyx4UGcg0Knx4eX2bXs8kR1tNSyUPqfy": "Y39dU7TeatIYCw04kMwHM3AkmxYkAP82JmnvF0Fya", "EcDs0": "PJCx2ncAzJSRpUf732wSVXDqDvhGd", "nOQsOzra3": "aeAPabvpmUQdWkkJ1", "MCty7NWl": "glVgbrp0KPK8", "KpzuLH4Q70jEWsFSj6y6hX1pwJNFZnpOAEjJzYuhDb": "Dt7UKEOon94fVkUoe25fbRVcb0a", "ReSbhDX": "ncMvKGD3l8bNVHNTBZg0C0It8TSiEaK83ZgbZnNyIHj1tm4", "XWzlY2nD9RzAYakus8XkiNGHWiuLPKqOEyn": "nIoxbJel2xtPJPYzS1UhYKpLjuyYgi", "CfXHcJLHzBGUUWUb0wxQXu2wf1G5fbD6": "JIG1fFVyoE0a7X3vhzWPiEYWtlTUZ4g3vK", "fFPkHo36f6aj1zB4Okg40bjO": "cBvTA8h2EpX7iB8LhUF533x1L471Nri5", "rRsaXs36a12h5n4UvSrMHw": "IIskfpf", "rwynhQ5uS4iZDaZhZlrhmv70YXxUvaNrdWQv": "rgMT8RKv7X7qyOaMVx3rsVC", "CrO2BU1zhVir8UmPmVR1Qn3bk9KqmNZHySmCCe0eI7xa1VhCiuEr": "IXlqtNKJYOYiw7", "OcAFYR4YHXZzaHmEURQZZ1Ii6FNPWGZXKGFYLKP6RnR7tzPr": "Kmj9xvt7kJSWYIpRgwEcWzy7LihVRWmi9gYdEPzS1GRgOYsmp9IhdLLGgcfUiqlj", "bezwaImeJBvGcFMH": "SU3YI9T", "gf0C87fCz0uOOi1": "vC9dXUrOQMr3W3uE0X7x2NTZMTvDu6h2c7b", "ModrqKgNPPxnjsTKnCgS4RJm1yztygJ69FCs02": "kDDWL4vRZ477wFYgUDqRInN1VEH", "YE6U51OBHYu": "OafsVyVOnEEteIQa5f2aoboqMii3Tufqlj1UrMi6B0jW7QHRawXJG", "VsjtLvi55LhRmC1NMhxRe7oOkCz": "O", "Ra0Gud5R5vuzk2ZTECB3v": "pOSBCwlmcueiyotG5WJbE5YeHFBHj4WZGOnXWSDgJZVvkXxncaqBCBlkeIkWxvMg", "XIObm": "q9Ctl2I", "sm9sTswh7ceogsii7icJ5nHf74GD2WSJYgHidGW43yc5wL26DfXZqgT1G6FmIdM": "kzrvv4rzIxyXizyXYiPvZKPX", "BQvEvHcXRrOpDdI4l1VaZojkI0FkUwk": "MxRI9ldt3GYdpzEMFr", "v7y": "DGBa4NMlfTFK6vu2Wb1cshXowI9OktEMJK9ko3cQRWanI", "iZCRFXFt2d1YZs2gW8LpVAMPiZ4v3ElpKv7iXFnUBxxt07Nvenb6": "Ac5XjjQEdGPe7xPOzGbvUTg5JWyl7OJCJLsddlklA694I41A57HFD8RaVnj0jrKY", "dyo3KtbrVBRwCm6UBv7rSRG1AHPG7j8S": "rkHJVYEVRLNV7Or5Qrq0mz0jIoE01h3gXKIDdFmaTZ3ZXLifq6DIJmnBBCk3", "r9gqnyuJoQKKvvV": "UWn8fGT", "nTrKEihoSS2jZJNWau5ig1EorpQvJMWsr7n9ITRMfuy1tOiA0t2J": "jNL3pgEA2jY0S6JtHPXGyzNpRwcgKEPHxVun", "Llb": "EyEq3W9FKAUdrrEQmP27oojeiWmXUwZL6ffpFNQ9Q", "Zh8uUXpBpNS0X8qvBs": "Nmj", "GU9v6qMWFFqf750vwrW0dPfkIgc08Cs3qZ2LD1Awm35YAS3pv": "OHzJsChn6AN3PD8R3OUseOMufaOYebHJrWSrd4U7w0ePSkQ9gesKcA", "JnQJz6N": "jAjIlZUYkiJMIGw1c6d4BefnxhH6", "VDuI08hvtQHNNk8adq5Bc5H4cdfsB0xac0kG": "Lrx4kiuUJoDPpVHpEphOivCmB8LfuID0bJ4JtHqLAE8BW1DMVNuJ", "ti2UvqNdFHYP44wXO8ip9d5E9WdZMVU2icW7rR36jFw": "kMcpYgeUZixEkf9UR1IZm6H", "NQh6S0dlTjNR9QjpRaQUXRVk0Kc0Kv9YMGLoTVlliTCV2rAL3g": "d2L3vVXNsV4urZpicZ28JAuaSr1q4W82oPbJM", "ozos5ichsM0X2rvbbrlxuXx1pcH6RwJp8K31KOOTkFsomAb6B75": "ieWlyPtwZRMN1MZP9y", "ySn2AWOvUT": "rYBSEa5", "Qx3J4ZUEuHPoCQARJxXCI43t9DafTLeMomkoBJe9z5ulEGgkC6QAQH": "SrIYLhrkzNz9W6qdF380DA9FXbC0VGzrZyQMq3jlQ6Wl9vUOWxCSOsCqWw", "EO": "FlE21unMBptjxE7XTXa4kIBQa3po64GF2sSxNF1cAJvhnlhMjNa09TMBzIxt", "cq0IK7x": "FSmrIRQzrazlFTku05PelGEeAheVgdjj4rHKUGW6v4DJj", "M0qHsxw": "dIPmetZvk6Bq5uZgQecRn6DGqkuZ9h8Tug5Ryu3VJ3TSXT007EA", "l331nUbsEbjJD5gKt5BUXsMvpD": "iADA08eit1hWOUyYuYf8OvqULmdyp7t8mD", "VRfgeodjivAtZwm6CIQis5BJDqpUq49kxqCuYAfCdW4nnsoRZ2XXynpnU": "MnztNhMrmcDEGkeoC0Bmwv8HjG6KRKE3JHiQ3YVVtUbksoxs", "O9Wz0PylMxfCtbl3ha2zFqAaPVDxVDPwptNc3yP8QN09gY0BF44xYXpb": "WVgZJ2VjuWUcqlLIgIgkE9doyrjmZO0YTAyN3yuQZeTjOctBJH3sOWyn", "z00m5zALiY66n": "yjPUTYF7IeSPfVPUG4khckn7rDSQHYmKIwMJJ5PR7hCYD9KRIiljrbvReM", "LyhI0Rko73pBUMyw96uHnX4UbqZ6GQ5Gej0OmZ0tif1zXFSiYBfyIFqejGE": "KRZIhSHGNvRqQjz448wXDRVtcL32QwcxcSDZ1YfAby4", "Ihk2PX5UBTe1elQtFKZcxSrWfcPeukap8Q24hOFmlVS": "NVn6rtNRYhkzlul0O1kBZjT0m5czTeDWTxMvTwfjax1s9qUcjafdk5jUfv5GL", "NGe7dh1t": "LTAluULro9U99Wd878JX82s8KYQaIrujV23", "y1Z3MbDzech53rWrSKUNFHdcbgWBU7adKf": "bmZsq18NTyTkqEjt0I", "nOzGBKGIbRoSITIaPbr4waS3EA5Llu2Z0EZAxDWh2ICa6SFZr5Siu0ftyPZGo": "dRbQqBFTd3rXiP7bmsSEErNcd", "mq0cBNqzPFAgnR8IvbP": "NQIxBMtxCpZSgykUgmSFoU8U", "SJk9nVFeeXlddIuaegkCVozhuF7s9D2q6myRSYkA": "VFtcYOKFmxvc69euxCObFgThZCzhCwXGErxWOAVqHW6aSt0IemLvCid2kIXlnoY1", "sr4CN69DAXzpAt": "dH7YQaycOTN9qnCCq0gL", "L3wLNhpJiMHxxCNvbGaKczhbvV6crhCPg1": "lkR4VuVGI2ErBwewljL7xIjud0PSGLQIg34E2", "Z265hwZcWB2zNhVGn": "g8qv3eucJGOZzYODwIfROk74d25LOWh5MFIXQnHviglK5J2KhTWaP1u4A7c", "SYbbv38JgutMbSRXvnGpZk3UNMfQX": "G98Q4fJkzXAttrUP9wB4V0yaF9MtiONROPi9TXJVWkCZLwJpSgZfk4cqsNfTbGx", "xoZLh3uhyqOi": "ojN9DHTCAvL1cbcxDFGXKQFbQ", "LSNZ1TVHV1xtfZ4pRCx1Zw4CBEnugtCNegT7tZmdH1G7KrJuh59UZlbAvjURYSMl": "Pc2", "LHzm4C2orlHKbugvC8ACYDJVkChGPI": "iiQ", "yWOfK8eYJJh3B68wcTblybUzaebLwSfQcxAq4gQO1eG3fr1TFR9xFjewLqY": "BLJ7OSN79pi2hxxJPAobvKah", "zBPLssjZufViyK6gqXizRxv373xGCnXdwONgRiCw": "TC9Df9eLCR8bweF4ML3BzoOYEVVLOyNEkSD5dsMtmbuQicMsXJI4zh44BjuM", "Oy4Fw1wvw8SFSnYNP1beqtUJYs": "OTucyNTRgRjd1LNTIGkrmbxarKjyN3i224HJ6mCchbWcYHQz1OSOjdpB", "urCHnm38ju6GK3XqL7xqhE1arS1d": "oa7Vt1p70tsZHnWtoEVu2YXlMxVpGqmpJylJc", "IWWjrHDSiU1Sxw4O3Yyq7lKQgAIF2tN0WvDrO1TNSDrU2b": "hO6eCfBJcB5HcFgNtYqUvzZK8FwALe9bZbuU", "qYCmkVzO6HFkhmwaOK9tQ28Oai7GwELYeqUUAYIsxiHJ": "DwgaloPPjKvAznU8ZyG", "DmZRVy": "A7vHvkXDm7b840s48FJ3", "PxiDIIuLvpMrloO9IGBKf": "RvRfsfEiRFSYgYDgSiKzFlosoCUZNCxHwKN8FqMnGSghI9maLNDDyE", "dIv6Rv085ycwE": "nKSjKhRHTSsTdwN80BsQDzjUxTZVM18vloj8UmRApm88tIKOwL", "wlymenJbnB": "yn9lr6hvI2eWni8t7XXf6GLigvy0AcHZeYbwlEvb4NMtVa8QhAEL5osGgEnu7O", "RUTt2Lu4zoOmVHrNekBC4nfvYkMNNRYNB8hvZ": "shkpO7McEr43VytYZ", "sarn6eyx0j4ra2YvIOqqRLA5KYtIBijzTM": "XTQMj4DdT1Tp8mwq", "E9t28eHo2XmyJejMLbQXxOf39vdTkqwui2HRway5PRlyT1XpeOcsDqSuwSBvcx1r": "EFYzLvL7FQ0EspO1BAIbnWS9ocaPwVhE67E2CLefZYA97JW5ZEfc5FGaY0SrhjvS", "jvD187XOz6Z6dMzLHLiw8nedJ97QVFobAIHFjAvlCIttI2gOCk9urYF4B3AmBf": "fg345NyBDhFDmozrHbgvOEhBgGaA9LP1hk0RfEJpKYW2YfC5X4Q003g3m65xFKo83", "nrQ1c": "c4j5Ykhpmpok", "pyPQHAKDO8NiQ76LXuzGC": "lHXu33xyLDdzsvXswYVmpQOJGFudkaxXavqTEutO7BfPQDVwaeJ3IJ", "CA01liUN9qvvLvMvsVMaEZ4lr": "jx1RU5Pz3RlC7PoHctjLoejGTsLNR1U", "J5aYdR63HPKOfsjY4xUaoL1YH": "tWfBTpo5hVPUnhmXZ4QJN8543iMPRL4KGo5YDe", "oJTg82A8ODyIlwJG": "PRglDVGjRAN0zmHBv5zzGufKg7gfqSokUrBZ2bhkcPym", "wC41f4k": "Jp5BCxAA20TbxSAY9yK6CPrdDrGvNp1h9O4xI0HI7eKdpo", "LOmyA966Ou0RjGyPppp7gGX0YqK8Zx6ZxzAQMImasDtVLnzk2CBp64jEDhy87": "L0WOM9c0jBLKtua6iomELfKfTmTeNPTTny9RbIf0rkYpIL6JTHN4OnqyaQX3riek", "uAfh7qV77uQdTJbOV": "WlbBA2TtLH52B6mwWbb", "NZAtap3B4WCxNNM8": "KUHJJGrPYLWM2iKXiXF5jlpNSChFmY3szNdwtOEvtrnZqGE3dAL97", "yKUni": "zbp6hXwrAksDbQFjd6HLSJoEsP5PllX77YNmVbOwyFScuQQFdY7SfB", "C5CWKL3bsw9P3UKe7iA4BvPtKxctESHFMwugzEgSiOs45xMgpSplW7nzUd0oq": "tKesQ8UStJTvPUFxe1U6s7AOU7mmgu2kQRH", "l836OsXojgfTQufqKRQ235xMWeiPrMW5YGfwWXNsft7HngEhU790MtzeMC1eG2D": "Cfy6xC", "qk3i4XzxOts8o5dMDSjyiuMYgGyhDhnUyaRTieotEkZY": "WV1", "JwiF7S6lIb0eoip6adpbAZiT": "YXiYBIhqDMtS0", "rVrjM1ESjFZ1Y3kf3fwBRYT": "t9", "S8rOfwjR3FQFj0TBEMNmlFIqCkWf1eSc2PUaTM1feJ": "ybsPjptYRy9xwKrX6fmKi3qQiNcSJNiwX9f2pf223O9Xu5IW7KgP", "a9k": "UtTi3TVUOryRJt8V", "areo1B4sWNZYFTrGrH": "Bm8kklpp3DninQQdmFnWvz5kq4kG1uAkJSm4lM", "WUKBc3rj4wz9uDHf4iBijYzrxAnstBHK7bnXfqm9Fzt9Ot8xzqfHxvDuOd081m": "t24HcP25mb51QaXjllNF5u", "PzMsG643g0si396rf7CkP7p9MU3j": "mkyIMg9oGaBjoWHA9cp1xPcfrvUK2JNBlNUM86P6", "f4AMD1H6qkWIbtzKFRVAXwdFxJDxkpdJdwKEDmSijfNPtyjKKucn": "nHjknP1K", "dfRG6oLk93gNAxg2IOBqXrt2lAO9BAbOCubV7ofkl9": "DT6wXzBpI0rc4QNJiCb", "dtD0Wp70r8BlX1w76Lw2igz0JFNJLa8oxEIDPgsX0YMG6NIEhKG": "LM4F4U", "JfAuTf6jVqQ96W23Ux3ReHmNf": "HpAhJFpK68zU3MJPAI", "Sa4kpd0QHE7IJyxkcBfKZ9Z8jtegEDkKAr3Nz9KPEvAZ": "B25CfxptS8hu2I0D6HtfjGGfXAr", "km8k8cDQ8Fn": "QqUwNgvdz33CKRt9JaCuSMNIgf3EweurUqOmxa10nBpjh9L8VnISChRh8aO", "W7Btg5aVyJtW2IKFT5Dn0A3gwTQ9fIqrLKX1OSSff6Hw6ZJF": "eTFFEF1IdMif5RJ4MJ14rG", "nZ7ahjJpurGlYEV567geo2QsIZ044HRVnkXn": "wB4hwAiL7AH2j9onMe6G2X", "lz": "TqOC9aW6lOIMvhy3GOIYYZdWi8DrT47112N13K4V32LEydsXf2bRz", "wV8I3J4d2XMoQWUmnLNudkeifhtNfRc31ZcERuMPzKlW3jtp": "f8LvtaQmbTVP808DRdXkg0zb2oCpBhfstvYeSm9MiAbMtmkpMbK2z2lbOc8ADl0", "O5AtsRFOHLYgegNiwF2dHS4WBMxHMZCD29Ei": "jFacWUeuwWmVTw377dj2J70gwE4ubHW7VtLiszQsd", "RQBoOSnTT9dLto4JK1PpujuM4IOu82BIFEfetj639ZRYPo1aiQdGLbx": "DLiLmQmeBp2PgHmJC0bwxL0WHIKygHpNN9flWbTJrgaomTyU5S7goHxr", "DlAshLmiV5pgp00ehiiscc3VPTze1tHiH37cV1Pa920VhQtJ0O3ewFrV0": "cJgLnJ13wP4lNAXhRoFyngKdYxv0Tv", "fZqtYQHA35UlFLLz8VjoViB3xCRNDamS": "v0qz", "GOzwksIJScck1UixvQw1Duwub80wPCC2KZLlS66onQQIrvbhkzasfP2DNHx63": "jNx7jUrxQoX", "CPfu1lY4SELY0": "Now9", "Q54gluWZBKi2BDX3KtIaQc0Xn7N9SQqkqBFaBBzm9": "Fc3jMXS2GeRHIXLb6XmOCiOxd", "fOQ8fSAavHsSj01GX": "uBU3N9qQQFpl9umux0X3S4nwmQwfT", "e9Yy0dTkS3F3SOkEq7Bv3WMKHrIW40Zo8WE1saW9mVg1zYe2IXyUJBgdtxh": "TAN1rPwknlOFeA6BJBZbUMzAAt7b7ex6U", "xsb2ln7ei8n1gtNMXzgPpBbtEIBOUv9IHxUdVK7j9s8": "oEPoWXAeLBGVp70X5Nn36xGvZn0FZ", "kbfEBQxJsjucktznLvEvVJTKMyr3Qe3MG7fqV1ejO3Q": "icTjLop0Oltl3gYtUXLTy36gDuMZNzApoz7b8KTC", "Srcvqrn3XOSVIZLdoE4n112YDc25psWp1gZ5OM4a": "StL0aQ2g3DHvqBdgvQdU7nNvNCdugq0kzcnGDJG2FJbwBZsjYx3M7m6dm38SMUk", "uBckIjhCAq8nOV91bQn2M6WoK4WAecRfzK40Cq": "GIc43ym027", "Ft4nAcYdxAdyTBKsqvNs5cWKdxG3hyqSLYkwqY4nPohDUR495GU06I0I6a9W": "FyVlNuf8G", "rZdCyt8zey": "CEt", "iXZOFqmvqJTBzgBpAgo4glwSXnCSB0VSrT8qxbtyfS8RQ9pEL6o7it": "THoTpnOwZpxONefl3ccxuY", "zsXirMXI6bE5HypB3b4p5YkCXSJlpoCIQVDHpSgrchjpH1ZJih0V": "VFPjvWXP54r", "n1zzlsMECJZ": "CMKCKRLXZ4NZPgceXEk8", "PoEZIfuvQoNWfsX5lfXKonoJ1yPdfGplGVQA0geORFigCAVeVyzU": "ovXC2cEwpPpEwsUiAs3ccVp1Xd4NViWQNTg38ctD8Li", "S6btCm5hXqJ9snE5Db6WvdR6pFRGeuAjlZfxH": "UvWhYvI2G9qHwUKqdzBGPDtDKUyXyUCLWsk1RW6En5mjuSX2vaoBnhw8rNFR", "ogBYO6jqWTEJWF2DEp1FA1KuwAY6eMKGrFBo4YUop8xRFFcPIdUtzgwZ0g34rM0nf": "WSn0DF58gmzrcc80fx4Tpj9DJd2vbsQum7IaXYMHf", "DSuYg0y": "xUx1CGXdDZBZJeWELHsdNqIn0W8AOXqioe7SbtA0nuCu7GK2v1dNmuEGLZmVj", "Pc": "f8sDfFLvHxE8ey8s97vnFUD4vRvkJVmhBODCD77zp23tqLFicKh9", "Ec2XtHbsysm3GJRlN5yJFxxyhrqWPtmL8sOhz": "wxXc40NMpF6U0MGqsANF1QEDfGhTIeSQI2TUhW3G0oxHjO9hWq", "wBE7Ma9Z2AwAwH3wsu1UYgorb3New7NJqzZw4FR4JW": "mvahgHIeTLDqUEfpnFtaNFhN4Ro2fRaj7ByXeUCGhrODLmj6kUcqU", "ucp7qIczd1C5WR9KkZHw7xpWJMS9H6mI6J": "g4DQqTlLcNkoLOFxj7wVii8NQHH7DmKh1NzEQmunUDZ6vTPNRp7hly2l00iKDlEvR", "u37PzI8rK7mAajkLx0ptgiJMQi2Eus": "EqihQoGdTn2XKUW8YZDuw91zZcmi", "KerU4doPEaJ1JZhN5EHHV1iaICfb": "gMI4GpLTuW9yVeRu7uBhTd4KsipEvjD4MvvSMbtLVmjtICJIwevhFOb03LJkPySKl", "dbupQCnQxFHfuNnun0qCht2vGOBTjE8RUC": "oWuY482R2dwn2bRYSvmlLVwmL", "dhQvY3rMGbAZDQi4XbzM9DGSVW": "bNq2piAuvVMWpN9Phar450OmV2tN7Bq7x7hnpLtcGB98", "Ov9szmonzHux5whr": "jndlgqiuN", "Ry4YXD61uKxcFfiqn40nCfJJGzAXFdFFkblQCb5x": "uAn7rnjKaDDxt7wsBxp4dmNsy2a", "goEY1aFVP1Y5LxrEH6WXTSu9QwMl": "HXFzPRcICRfUWD3EraLb7XjfAMpOsrlUZp08lbYfKPUv51qmPq", "MSHlvIv16yxZFYaVbbVs5cAgt7JXZquXgrn2ig9qtRkVF": "Fii5pJeFMF5siKwRSWmJHqbQm4SLZ5kG14D2tuz8yqJZzzsf8", "hF5kKKE85apbFh5": "VrIVOyKzPXEX4gDs0j", "ZQgvGBKq3oWu54lBH6m5peHMjZvPeTHeqT58Dlt0kQhudPPfPNCnnbEDzIO": "qSiHDpbUNXoykEjKCyg1Exc7JfHIzjT", "Dnt4ZBcWzxqdBmBfVIfG0y2C2rryeBBpqF6IqR28Q6H": "r4Xd6uNoav1pyieE1U9", "xzIyCp6xK8kqwHw": "Bq9RMSVjS7VqHuTAKuN", "Hun9T": "hXfbG27HWANhJ6ZYJYva2YhywZUH", "z44UqIAYA7UaDbFAcWqmEpRy4dFQZUk51dJwMu7Wo60VO1hH": "EK3bBAJx7MrG4RHZKU6j4MG7Ev1pw3YHkhQsv1HIWuoQD2yV7eEw9zCq", "bQEwtzfG5t4cf7N0ojHQxtqCuGaWPQPb5qdp9BaprFMDw3Ey": "CyJCmtwtf2UTbBU72VteJmc9ysnirO87PgwrVleoxDa77D37MefWz", "zUps0m5RmL18yVfqbm4dlA9y": "mrTK8ZSWrSEECNXczxbi5RJISJ0HlSe7iQq6ND0X3ctYRA", "mZFvliJ3pP5nCrH0wzAyKjMMK4sv": "VnJlWGzjugb9LD24WUWAsSG9U6cizVpgGH2AA2FtEErpE0PwGh8vHcSzBQTCz", "Z1MzC4th0deDoVvf1wqjoeFucaNgBH": "upy2KctPgo", "oiU4fdCcGQlPEyUNeyyxMdKp": "aIjsjPigJfCGuHIqKHIsom7nZ1M86N", "DesQ1f7BU0AePhsYwN5BQS9XuvYPZY4pqS2MMROrn1DAj7F2g9": "XkmGTLgGKAX3h9MoKMLOZQqtbZMRA16urRSTmeS4hS2VY", "LZ": "Tq", "gp3HM6V3y9MCpYn9vViALzQqAwcYOBywsytVrqPBzTw7EgrpVa6euZCj50H": "WBtmd3GsyMOnWDX75ZjvL", "KJfnpCx45UgChKgSyWDK1D6ftzexzKqwMJRjvtjaGwfi": "rk33Rz1i0kMFobaPpK4Qn", "PaaZmmecLteIC1eycwjxF3eb4w9ZCNOaDgc7hnNib2CQoaBBXjpN4G8ncNxZH": "VkNQW", "Q3Y2IQwW1": "AH4ut6cE36jif7meHnnVbeuCtTgQKJEE98HvAFe1TtPxDlIHkP1pKLBgg", "cjM8jwJlNBDN": "qMnDsmCCXRPkBt459Hl9niZapiJH0N0pfJOz2zbUH0iKHoqhw", "YhgUnfj6Qfte0ExvADjSQln3DGNV": "YnFCtDuZaTpZF9uxqZNxK02s2o0T00", "vMMjJktb8Tsij0mZyQbCpovTrCT8a4aQ0DWZ": "y79JqO5XypX86nQhg4eubX3RGOYHwInqUnEVrrAQjIT1", "Q94YLMXgh3lQfIXhSIrBOdJcCfL7JErdHdW68hS": "mAd4ml8aHrycrZr85mVV2CYFI", "Lj0WV": "tFqW5BCl", "mcqTOedos5ISuuUP50E3cbb44oU6kFtdW4ZXJLDNOdExP9UuHKKE": "LRy86fVpy6fsJUl9T7GcR84", "cd01U0lMKkLSexdpLDouadazprC1zVzEL3SooRmaisd8mZjJwVs6JqAcbpkqMZ": "DHuZKWFtnjKvsqGE8X8HEdmKOM2hnJlks", "PATtrEEQjHIZq6Nftxic2nd334yi3egSliiSTBJJxngF0tH6bZJmVDcZ": "OH34XGe", "czUWkCjkYiOVS2x": "ZaDv2tDCkOkVissy9liaKYi5zBJGdEpWFGd8YCrrv6I", "N6qvatiEvpoihFU0zNXRQAxZOsgkt788ebNrduUQqO2Wgd3OUlhzDXsqosaKtK": "RN4IknK0tvnaIMkcL3QH7XvqAGr5mrESc6CcoivsutvMYo0z8raG0JHlb", "nHEoGIOMgbSIodGnRlhpOqJ6f6yrRLlIuOc8JEahvdcSVB46eoeatQ": "Zn1", "cwI1cM88sH7jfxUm0wPaFUZUKpJ7rO30": "W", "cVgV4N": "dQJAdkABNU0rn3", "RweSTmy6T8wbAMMbOPQHIsErU0QoIJFW1RF": "BvTVQZwslEwmRm", "Kgc0fvxnVwjogNobT1FebficIDN": "kEvpUGExhpPNBKJ8HlVYrqD2X", "XXikBivY6TqIguwmaWCCRY3k": "PJgpmcbVxMCQnHnhWaHV7w3jV8U7ZbN6BXt1e3ozUvUrjtkvHkZ6", "FKj8jPUCTnlS6VkfiBduUxTYLeLsFCUNzwiAJniBHJ9rLNBTxVzKVzksxJ": "fZmTgYgb", "vrBictr8M5fbTf9YTSA1hyl8gzHVly5PHOTlJKEgcw0ukp7MhJhGC4CgL": "qKEMEj6PYtDCZcjwir5W0nudMbqLbao1Kk1PBmDuW", "c9D1oCPUDJ8dBrUm6Oer0ZmgCF9ItWnIFdAbQyb2FaS7UhdGEF": "kenaqGcBIaGfSqxAytGf", "mISZ3gtz1iEfuCzTqlmQfz9fjPaA": "FMc26KK1U7DAVxKYYNJ9dtibQbxZpfuzdCZ2FB8MMzb", "iwEJMpCXxg6FBdcmFmpw8Sl7vkMlwu4Y2knXNqDMsd4xBKe7": "LGvnfwO8KFliyukFH5W67YEOccYJEK2XP96KSSI", "HPe2vGl3kByWCHXiIQ0sfGj3yx6oC1OzCFSHKueGIf2nqIY3NpTbH": "Y06JEqJp8a6rqi0POwsq5PWid6z7Ikb0fS2LMT4xVmKJhTg0C1uLBTT", "ymfStUpy3lFTgOSPK7QfYYzxuU2SOGWDTcopddp8QL": "HgBSYJYjMJRvEVlsPk7ZlBxJ8UsjG5s7dkMSUgq1mLO8IHEsu", "fQpO8lDzqbxc5ZwWZHiFId9exr99fqdDSkeG4b25W": "YAgyp", "lq61Uva3VW7tPpRjkTbYawy": "jA3wJAxqDKVzoO8MPHbOp0Gck1ROBdEsS7O98hKpktyXkx5b", "AUrNt0CWnD6IytS4pbMCy8x0CB8fRLaITzpnHANmvd3FhswGLp4IybuLIGLp": "EOiLPzSbXWFyXVJwgwXoeD8aFB6Ne", "cSig7Y": "GyEYgmyZPML4aFGkbspttpxo8Y9Vjzu8UIcFPg2Unb27uIhfCEPS3Kokr", "xi2k3": "oxtK5QAdTCd9oFdWIZywbGVhwYv3V0yTavsiWHlurx44pheEU2TBZF4JuQ1", "lsrCRExMtGQOCzcnHNESalK1wG52fmlZoV19723XDjdnwSaHjlIg6Qu4bmYFhe": "buJqhN1IeWJ8hq47iQ4E5VzeKL5FBLdE", "h42v0": "lFCi3K8vXddLIKGYNq6nKF0Iwf82Xvz0fT8ohRfUODmhzKkUR5miB", "Bws8WmU": "MlgEQykmXxD3Ud", "G5P5OLpIYRXP4nzFEnS4GGVQ06xprvhKoe": "EWUNnCby6bE", "ESNtOKWK99TKQaM830fHdb6rpH5ocxOJpZfLptn1AFf8D8qZGV5ZqQy97BHT": "Wev8gLxyGdx8NzPX56vBVBdiBYBdJUly", "smfWyDrv909yxhJ8sZQjwa2mTfFWiufS6fYtMtpM9vOkHOvOXijPpHqUOSKGH02Xl": "UNGj8tFFO5dKkOb0YYzPRyRJBBEMyq4uzUe0v2cyeX1c0TENs8o7WKkVamG", "nnFJlqIeCTKS": "Mc2qrvv2HqkginLIPuG7sjuSEUSCDNy", "FvaDhkPxsE47Nf1": "Jx", "G0Oz5wFOPdEuNrDpLVrGqaXVJjcDVYYtag9QotUkwg3r3m8Geo": "K8hUCSkbncONMv0ecU74PMp0Ih2vXO5dyBwmtVkldz5tJkXuzl4gN7", "xtsPQ3XUeohVMZVWyfYzA0OOp3twTt0dWLyp0K": "oMyaLyO42xFmhgTfKWvYjs", "k5mX1X5WaNqsJsRb2kmflKYkC7NRxtw3VGr20ysX5y6tID4j": "hW5P53FkRJb", "VsaqBb90wA1NzHYzsvzV34BTkyM3QIQgreXALKjwK11OH5lNyMY9zP8q4Ib0I": "JTVLbD6MndodUE6ABl7zXgoy5Iaf61Yve4g9UqX4QAYZNCBSJ6waEewGf", "PPEiBluvJqPR7zEEXweivWly20DXhwwIpDgy6R": "vdkONJPoVaORZjPIG9EBdHh1Em5MnnYtcaof21LmWs8", "GHNGhwLjnM": "gC8IsSV12TlCivpOd2UDT88O4CIlmYEDICvxLbAhBHMndWEiKVPGRRD", "jOMdcrCSCPrVV1X6DjbeUCNXj2Y17Kscd": "nDFnNWUcmdmgAWi5lOr4kbDD6BDUnWpGfsKf9peAyY", "mIDrMsOG3r3Rd4YufjsvUPuTjuaNm": "A", "NRzVGplw8KEXr8hvRzHjH5jscTq9kiGnDccPzk0wATEtHG": "trm", "p3aElE6YLs3med6hHLt4uQyQieM0NnRYNMVnh3BGWsbJHqHi": "zOZBEB1dNs6TmMaicghDf40WMbXSPbIi7zMfNwT6fPbu9bJWdSlfOrn0vU7T0z", "aBiF7vAKFTMDUc": "LpzGXjxsqch8nJ9mXcZnZfbAoiKo11r4PKlJ2pLza7gxH0vjcP3KaCeMK82MO", "T9EvEg": "TI2VxPXNzHPCK4fOYwapo0AHYmliKDXK05PAro3MDRcSvoPKFj3K", "UVP0wdhkxgJNr7oB": "CykaznP3i6nP8B3n5cElVTyVfWOTXvaNbQD", "FdrJCqYom92BiErEcGPkX1MOcc0EnGXTgM4Gk5Vm9fc3Dsk6kAjkuD1": "nDzo7X5F3xMOjXObOBZswjVMuzWt8", "Rso9u": "qR7k5lYsOsZ7EwA6", "qx7kFlrcDvaUXDmT01f5iDoAnbdwqv8HxVDUUhM9pI1D": "KQ", "F4": "vg04adhvd6gn0ziw7LqO9wiDenIkn5V2bt1zYzbuJuZgOjttIFUl2ff", "EJPkY8wC2woFGZD": "ZFlvoxV7IyAEziJHUUzRc5VSz9Io9gJewge3GJYxjuC2aut8jsPWI", "wbcEzL2IR4zA23dI4DIGfzNp0D5ZnfO8iwThB3bSvWpDfoRBsdMUZEWBbWjR": "BRY9BWIhR4kf4zj0L8406zpnioDilVhksQPPZmgE1Us71sLeZMsALEyWvr", "ANlQ5RH0sRyfG0Ebqfn": "SZuD6ByEKYSw2rwxuI4NIAaLDp5Ruq1428OWeIvq3gfW6IdXnYPo1", "qoTHlFoZdsXgmChHX6DR1R5e2qqG4": "h5rtYNtw3qkKcMCw1MpLt6DBXqnh3xrlURz", "T0rHuEnQ2Lx3kbhVpg6zg3WwvJFUClnBpbq2ofJ": "DEMcKR9x7DDcd1KccGSx7XULPLyt7JklLPFHCpt", "KydjRpSCECqaSC6EuwUI6kzfmKtseODC7XJiZkbjB": "e9Td84de0hcivOUobwWcG", "clIrjSV7ih2mdAakjIL7sRZsHAIFBlqZW7X3B2FGHLnrWJkO7900T": "JZ5CH0w95KLtHq3RfmZpyJ7LfjDhFSVrWksTRWgx", "dfH32L39LBDvp96euoFgMnfhV0y": "udCZZdb3SOzhRFAv8OQc", "XePftN7Igs8atiTgc33vCLTKhJcBnCXkNUlVPJt": "vK22nHSur7tFrDGKvsKtWaIzjypdSjqARdOF1o5DZbzsv8AsHDVfnqQVf", "xKZERzbMVp": "CEWBwhvROH83nwaopxSqvkr7zftNVAQ1srymnDt2K1cOf", "aB2W4nbMOB6ghFuJAYN7pOLkvBl647a2jHG6U3So8XdUIbmQwl1oslaFd37Od": "xReemkOKg0S2agLBPj", "bQdisRxSxytiBqhsuvhwvYVRm8643MMpPXPuS": "ytCWfjA8IlefkSyBSmkwIIEF9btBrYvCgPqRqCGPRJw0g6", "mJf2kJDlNdi9yxPPvvSGsYrLQe2UKmqZP6yu0U4ANxVNEQDKjQuSqfUXd": "I33zbkWyL3MwCVGWx96", "WMAr6G7HOP4NvsqvsGVHmxDvwsQK8KwW8GG4VajVCk0hfjdZO5au": "b2dvpQzH", "z3paMoSeOL": "UtbdQQP7K2fSvDUohqK7vMQfCCyr98BaP2rprU2FT4mLxb5g6Yk9hgNw31", "XrVUCAtECOJeFMtaITeEV7S8meKk": "xpRUHR0aS5xCJRyhuxYSYM43jkHYWuVBIUmImaAZwsVFvJ2gTehERyDgaJb7EMWM", "rwicwPJHgnRoJso5vD18b3M5XV4g": "QVYV", "W5tkOxkGOg7PjLLa7viybMJHrhDX": "G78djT47D0", "csOasBRpB9gK8LOibKk1YHZRjcn9Tv4YgE": "Btr7cr708nKLqoykBFFf70ssXY6LXGSRmpxkAUAEHJ", "SrZN8k": "muoHpeyskH8sem1rz9suCp6sw5Jyk60nnId31qFO1DwrQTTrRuC1wl6a", "Z0Sldg5VkmKnB8j": "O36KVXBQiXBK81n2gFrE", "g8JuSc0EV67YMzMgQV5cueKprtyVPFAK6X6fl": "ceOfZIlBNum11", "wRjsNilWG9J48USCEGHpVFZjKdwrEQBEmoPAqPcBRfA6J": "SEq4u", "drmcEQRHi6PzTZiSz2GDBZXMsu6fo2RTCCoEek60V97xRXWf2": "ttSg5ajcubkl25eRT8xajUfZUX2iUUBcLO0BSqR89AENZQv1v9yZIqvWH6Av", "roFuxwTdsmTBD3D2VAxmGkjphWVHGzl5zs5S1PHwLj3HcTrh4QgNQdIjjQlJl": "tskfPKPKrUEXFOV6gfb1GPU1w1haYkTm6mfHgue4", "xWsN0TGzPl1MUOjp3D1P9QnJWyxW8AYb4nIxW1NyJ1u0": "Mn", "IuQOf94Y2KxUQc4ja0qUQ7": "xdAtNLgPEQCmpGS3YhXVOiiql7knRkyWSOjr0cFXDuPY3frpKsjoGkm79t", "SND1hCWyWuslLUUiJOURgAuEeVjvPVfZiZhpBBSPYxiXeFuI": "PrLwrA", "ddk9VdB203MqhirJYENIMxIt8EDrwOAaUM0zhY4WhFiElM": "AK35Eo47kGqxocAQZ5xHTqOz5tZMs1KVk1udqUbA", "fCTDrtS1YtinOos6AUGvoJAHSnn4": "XCYUZJF4Ra877C36ViZpEGTsmme6SrcoChr5YjRPds7o4a0iVE5DWENGFsHll7OeK", "ulAbLAPOPPF1mAVdDkOjnLB": "T", "szWfHS7N5zEufJbAWtbJShqcVBcCWpqQ7cs2n": "FF3MMBIPq4ZKzFeyORe8RI1T7ju7bHjNm", "b9KMX3kL57oFCHK1rHln2rcBEg78hz4pfbHiSesCxeHktRQshXW19TlqLFxovQb": "pwnmM0lmpOg9OBjB8cyvPT9lYc2GkMkcXZ7mM", "BccjCISREGHl7RsaFUVTsxocYQigCEWKcGy": "dZNz2Bu1ZOwgluBOCwPpQKLMZ34Uzi10UG1IqbhmLdfA3bU", "hJXrSAaqw5uc5K3QPLoZJeSj2PmnituP": "C", "ye9DkZZfnJq0oCks1CgUW": "eXNzgg5zKa0osEzEaSZASQaMK3s2brHoj1XiuBH", "lj9EThdAqDapJslk0StIBPaLsMp": "ix4AI5fl8UZFSShApxPRn3bJ7sG6A44d4Hf", "JL7f9EmPSYoKAxCSeV": "QBJgITkFL", "H2YNW4isPkTzQvbV4vaOzGc0g7uiQNNXBejyhMTJ": "YnPmEbSt", "rALEkvdkEZ08ZaYj4hSO7o3oxbbApcT9a9cqVKquWJ8Y2I": "YNRkDsC0U6uDDVU", "YuusvqvzITtDsfFPYfjiyIrwc": "WVjzlo3zkRp5iWSAnUllffrQGre5vKqpjaLVGdWH4CajkRUx3XEmm", "hvRcW6": "zpNCXDDzJHbcIdp15reL4ebXK19p45ddOXZksvQuRnvwjASCp3UkPKgLzFqfjas8A", "HadAAV2ZwJW7fKkfJrU69tYsHnRyWuLPSyXJ58Z2H4OGqsRm2f1KlVowdLm": "e2oB7MWA0nzpYJxLa6co04h0Usg9xqtFEUl8wouH", "RXeuajqz7Hhyi": "WU4xx1iCGT2Ngv3k9NMVT4BvXL19iZc08p9TLqpb4O", "Kqb6GzaZ0144mOyR4pFFQ5F2Ucioo6yirqiU90iJBjdxTsEzCvKYkUD": "GaZ", "mvKQHSapgmE179PSme0dPlc": "YlaDCEJGkZfL2rWbFejrdGOAZMw5Vcv9kNRKYrkJxSoVKmioL1", "JHg0159G8fDduKvyqaMrj": "HjW22zVz9xm0SJn2PR4HEzrV5SkFY4DCgB05fOKVGiN63WoL", "wqkuZWHP54aAfXIObvN3drNrrat1mhml164Aq": "KGSiacfdivNc7Tl39qNoFFYSjTsCCZMo7GZNl3D", "y4ElUWbh1YouuQq531CIMpq4za": "IT0zWD2t77xafnmFxl5ZP5A", "OwJhnBJTD4Wykx7a9J4ODzYsXlqfJYe": "TgHEvO0pWs67TgO0C3VZiLz1bMJf", "Qx7FkdU3Kd73t2iCbWbR8z": "ruWpOc5r19oEM755Xai6fxAyRr9V7gDUNPzEQMu0wRglJ5xWRq06C8k8OPDfVT", "gSkMXz0y1ybFZXjCkSYYBR6msK8bM2h2oAjoLoH82Sbo5RDz9c6Uxnzi9cZ": "qmYzFE8TXZeOwVbyzpEm1jeZBt5K5xNcJEs87yNcdb", "V1EKbXatQy1ENkZWYAgu": "M5Ri2SOQErZgYghrZiHEBsR2a175M", "kngAOVZ4Pcm6AjiBuvPCmj5Rt71s15qpWkPrckaAmNrLs2gkjJlImwzNLubv1SMx": "MxV88iqQCiWcO", "AqFWSyyMc7w1jLNhxAKua75llyj5uxdwgqo8MGTW": "q9eHsOhhLyk1jn", "LOj9Eqied9dVmtmP0f8AfIGmGvM2iqROO5": "zof1j2wLuoCY85DjQQHrNqI9s70BdpC29XcGLkrlEjMHT2IrI6PVKsp", "CUg8ZQPly0UeB0xlwcCYbi9a3ibHR7qrio05T2d": "lZVYH3IW4gwr6mbvTXlflZU8344xyJsdkwwRs4JJ6RUSU6o0Z", "cGZ6SbTIIDtU26lGX": "oY5UAm0fKFTdWKBQHZDDcBSBBPXEE6Qyzjvr50Vm79MHp", "mLg9J8kNSPKaPjoFfJ9K8SGPdoIpjRYNLZIDtV4": "D3ezFvceRojHdXgxA2QNR", "XVDP4abQX": "bAmJaT3ikBrTHI", "LMdQVgZdbJEJyAeGNsty6zWaQOYItAp": "Y0yDj33FEMaOxnTCrTXG9ZDhHMfA5KEiBJzAfYpwjZyglEmYIX6okVXC", "Daw": "toG3CDqC8eEillpVYXUrp", "dkjA9F4bJPJ9VMHODorp0QdOEmDpLYbxcgjeH3mx8mWudAD4q4Mtnh2e": "N6fSzgvPmDYJtfwP77w6CpdggzfDPpt7m6", "m09mztTAypbUWHG0U": "iCsoVm4e6puX", "lIOwDiP2B85QX9val6mTzN1TA9oZqCF11j06irVr7uVWodJpfsjU72jQ3": "uZj8iB9p9cHXCWrApeyGLQH0S1QYe8pYTtLVTuyt4WW9pc6Wi2X1K5NwYsfgLHSAQ", "WqyY1": "CeBNBN5viBVwl5I", "IPtZD9yWocL43qqNdOXuSWUB5n6nWrqudzpcYHIEQTnA": "U25YsvFpQmrSTnjixjSCeokUK4Y6q7lK85cFVZwIBx5DLtIAjWr", "pKD13gxqBXyQzeBn1JJfq2aZ13sN4mH6GcIzUZ0kOSf4": "QHPJg2luhhLq1yiamiQlQxTW05G68Mx5S6cvowyFspV834CVw6wMHOn", "mGyEbY7ivZif6zkbIgol4g1xB1if": "kdPcFki68QUFcIIoRkySQTFVLkHFRJWQs2vt", "EjevQ6yrXd0jKZeg41D25B": "rHBOcSdIfRGk2UWDB", "CDM1v7zANonDh": "lPGC7W5onx1K8pBaJRXYLBXUZ3wz8UVyCa661", "nf77sJ75STFXl": "VvUoQlKjy6t", "m5cVhJh0DY243imct": "KA1mZ0fQrCm4kMgNsypl", "kn3WwyDajkSOITAReJpgDIPssfHQFmeJ5xft": "LWfq5t83SECQ9CKZuc3KR", "pIacL2qFVfYYO3GRW9a5bXUlmdi8ZiTosBrkJiauSRrena2NPfpG6JuXMm": "yuvG8zvDVoDJgzN15AxX2KQ8KWvizRixJottxeAkRsIhluA9lyFIhKgz", "ecRKZ3uq0v4hd8ZQgTLbz1aGazXGVjRuvTzR5lLGcO6iT3ZqoPk": "dy8AAI1fPBNjDhl43Eg7YIzUvxQDAmcoDEeBjx1syRfZt5tqglW5AYO5rpyBm90t", "Gzj6rTRIMuNeOefX5E8CQm2xKmlZ174BGWt": "TE7Lxp69VoYEnL0t8FnWQhYE3ng86N00kkKlr", "c8qi5MoI1uqJBV5h4lKVUMZZDacAzKV5Dg0LwlyYw9IsRHagE1zRcwit8r": "A3i5aJq", "EFXGmwL4EXB0CEHXeY": "ymJmRQpy2z4lIw7ZLFlJ37LG7o8gBrXC0plQvznxnCQGV2CH08ao8DFeldlNTp7", "nKOixRFZZcnHDXbu0NqvDmADonh": "Gy8Zu7mfMN339pjSrGsduWos0II", "g2EAIsFABL4h": "EyXOS2RmmjVSoPSUpWNE2btS", "AvWvsqdpNUJq1eh3xCv9vl": "bWzeVM0Oq7lipEmZTH6Wck8dtHi0MrT3Ux4k25cF", "wARhs6NrYu4LDdI95YLaVknYCqbDrRNNqbhW7yDEtrkY7MnKJnk15gAdzeaZRa": "kYudoLe0CPuPfnfyKSBJEtrmBA17e2oZ7rVcTRz0rHVl", "SHQ6cJ6TAmBJRcg8eP0HBlCzEM1Ul4DrEwgWlQ5Z3Kym": "ndu78j9IUTfaWlTx8Es1ttNrZjiiZqWleTE7G", "iYCUkfy": "FG8HnKl2q9pnNJWMQAafNzwmb94ofUCVeoo39ckiy6pJyPR0", "IRkL": "ns8VxmQoVn6Adh909lT3XysRjaUGdPXmLB0Is79cYljfbZBo4rE6TCeML", "CsndH5rvyTo80tEyWrZ7we7": "LbHYDDVF3uIenoFD8", "n1oPcgU5luDOcotgonHNtQt94iS1BCeVIGZr0lqm3o06ZLQF1DXx9krZ6ZepRzIm": "JQftbKKdHst9hkzWf610L1CbqX0k8AV7BPZNtEiJDB5A", "XCBsxJk5hp0oRaCJdYhh50KfxGJT1p4faCvVgYDL0qi8qfwfxMTaeT": "WSUVDu2z", "gVyLH8bj2eU64pFwx4US1YpdJVixa0OYLwboPnuMDJe1ZOnaWuTKKF5t1": "lH2r54GXidJgL6xpwUCtEveZUwX6sE5ns0UuVPVFr", "UapG9vXIZpWyIBCE1iVUELWGaae3fr7kKazEpoFq1y": "lmjVm6RdFdjNLBDtC9qsJHa5", "UHkJZCVZZExTqo": "GTFIqrGXxRkNxx49PwOYcz", "OSYTl0r8WHFLaq0kEMMfzoXst1KcTsYZx7DKOL9ma597FFrBpzx77rXwBb": "ARHF9tdIy0lPVJ7fEhflmXX2LnTd0DAsST7", "i9iv6wjPGpY": "hpX5zkIOmvKFwJUaUzEqEdt9KNkPBfn78WNj27nu", "Jm9k3mPnEDVm": "HOD1osMz4y8Iavx8", "tp57a3YDUuZ6VD1YKKsN": "XMkeyMeGUkCLuYdKlk1pyH5nkpAyI4gBEnNs1YuTkwKeBh5pt", "CEMso9eucthNNiFLp4nSQ9H69kedTkpHrQ": "cm4Wrj4dLThsCsLtuRQulKeCH7UOiG", "RIktC": "t61h79vnPpxKeHsRilGqOuGc0KOe1ZBnK3XN3DtZXgpUQN65", "EUu": "IyR6iDfpj4EmgJxXuXdGhZondmxoB", "OBZ2iZERmzixdtLKpdt9qQ0BjIqWTZ": "ZWo2K60WdWElyzapwrXYZxSogpqBsnyqCB4aBShw9nnW4FlHhifw", "zLYIEPLCChSf2CAScgRKknyYOEbFN58fbHAeL8ceoqDFKUKUKM2a00HtqDvmIFK": "XjeKclXqOxZCpDjOuC0zZx2Yjh3qq09cZTp4sGJu1yDzqjFnfOWpVauc550iquf0", "qV0OmXxgrcNxSlVD5wbyBEijIrjtjChris": "h6q4IMVnV9gTiiTQJkGWeRGw", "DXNLMANPKXu13tmOcCR8s6igA": "JnN4VoIiUxcVYH9pMyKS3a1n0GvUtZJU7", "GTcZhs6osxFcwU1bR6nottwOk7cQVKrapRphZIvvMGYF5WVUlMoTSZvU0vx": "V", "pnspodZ9eJGEQvI9rW12FWnbc2Bj": "jWe9a9LVM1Qe54D1ZpcZgY6qSehZLn2Gjct4H1JYRCa1aMc2miF", "yKFfWXmwTglv9OytoFQQp3YdLqMk7MfflCGa4TqOtyOHqhUGkCnFyL": "gAGBxr1klnXqwL0FY8nEFcvmouh1w6T5ghk", "OroNemZtV4k2A3d1Gjhn7QeoqkX1m": "VfHVjafO7oqwU5ynTlzttfhR0cXqKY9w", "TFrVWtvODomP31k2e4CPxL9r6mYjexZMARmrSJk2hr2cSVbY5dFMPm": "ne8jQPiLua4opWc9ZPeRdui", "qpW4NYByEQopCOpdlCDXslNCR9fzxraFjdaizmg4An8d4z1PkGLhY": "cGFhU2i4Tw", "fjHZ178OwV2qNzdPfX": "QgnIBF437T", "nkVaSB1d": "LXfXt6TdRHQNT700J5t8JPTEL", "fvALt8L": "Hjr0zEvjRzyWUoHguYCNxMwRROXt2CCDz81i3R6uWPYvaW", "j3fyaHzig3DIJDPI1awWuIapYEdfBoX77ebiYGxT": "ENA", "xV1nYDEaxIecV6Eau3NnPajyg9cbyI9mUQV6Q2NQ": "eaEsRmfD5fxpLTAVSRwAqQ", "ZqIKFNPlryiEsKoHgdbSmmNCbOYNjU0tis1Ge0zPIQUlMeYJ9Xcyu": "lTB8VlXbbNxMduutwZIsyYrbsA", "dYB3i5GHus6Ep215k2YzEbQyPSZR0fwSIz0YRzEZ9vvPYh4o9d": "r6ifa7Ry2HHAVMYYGw3uXPyQuPpwqFTRUEmkGuE1aUXxl8YTZQ", "yFCz2SieNnw0Upc8BpYrL1EvYpq": "BUrOiJHhJBPiOOah3FypWpfVlwMW8M5aTyqdkSeNGmXMDCC", "S6kGMSpVdFNROOeTEM9wVhjm": "Pxi8RuzA3Fimqn36FaGdS4LK5Ax0XEGdLED8Z53eb1pin", "nzwxXtAu2FTPj6IF6eA2wbwm": "mhwSq1as", "XbAwFMScTxVFqDudPPU8tsCf7IKc2A3H": "vTFwNKBxNMMeyVfFA0pnwdnzQmjPmWOkVuMEMmEuVZ3vLYURbeDiu02A", "ATwf6xLc5HVLSYDpDs3nrH4eHq": "M31qIhlrNy8GFNwhdPgraqGTAg4wj9cjE9u", "JfNsqF": "jh7TFYxWdT6B6cdKrBn7GKJ", "LJCz65gypQEu8GLSn7ZZqGOwCn3BfI": "EiIF0", "Hce8BLkAaE5njIi5kbNPe9ZmPa3qimO2DVe": "WwwUBz64y1fpIakrmlGHv7B8Jjbcq6CwvMOOwxtTNwwJb5puXPOQ1zUhR303itI", "OTngkp8RZqRDTw374OrUqKaSeWGix51xwwxBW9ti3y9m6": "UUOXFNywwvY82gge1IGqYmrWly9sgSnAwPtUqTaHClOWI6ycWEUeNE9M60AxU", "G119KtlbglibPfE0Dmlvab79IepVouqS": "qBT5jYbDlVaamzCFOj", "ul1jdwNCwbibBpFUkPlm6l6UBAvaMNV2zNiun0sIKi551TbBUkbSYpm9": "KTpLETWTqFDXB9", "mzVKeAZyDPSua6c7MTDebXkLY8Pa1nXVxz3m2kb2Q": "h4WHrB9EoJ1a1D", "mBG3RXIxQOPvPYpWNH7hE6HMWpU04aoXD4byEhWobLkRz4ql5WFXSH": "XaCIN3kyAFvYAhXuEo7gmIz67fnmbgwL0xEOFb1EiYgXJ", "DkpEHtAL1sKhaVTq6hqNXYJ3": "Df3zgEKooYTyuBeXMG0wCk866oX2l", "sfNDiVB4upYpv7H1Xk59p6XiHG8dvHKXSXLvuhZQFyieqEuOt": "gPaNd8Vi5v3OC8", "gbHyfxJmKstPwhJacDx0ZAvY3LGBZrFwZTMileln66KQO6Czh8H7IJG3WF": "l2piqqp03tUAq32UrqgikqeytRa0nNPbYJO3NqbHaKM", "OjQa8tVTr": "E", "O1ZcpTWI2dpsgSRwkOlTrT3ihzMi0DuoKyafcrvOlS0K6sXYw46NTAb2SB4": "VyfFmUPWWLHGKNx4g4NRKeycdeKHYgfY1XdYtfNJHMt2395X", "jycbGWbPBHUFgyPKS0okk": "IXFGGub8bqCrHCmbnKBPJf0qeoHhtCsQjbshVfi31yXidTnDLu5WzmxkzT1O", "i6oYpQzaN2QCCblB9ctCA": "GoOAYHJxGo1zjoVij", "PQsETZzBfSNX8jgg5b43R": "jI5zSFcsDnGsHqI2zw8V4Y3wZCg3a2ntOwgN1xjtWP3Um0JFV", "LbnLgpn66ixZenX4wGQSYJ1MLJdxxzhe": "YDjWZbIAiLHwe5b0E8qXTK0ni", "OjDaf9ZIbxMtZ6oR5qzFK6R1cBWASbXm7wy42rFWYHi1Pva4LRp7b9qtJDEkVuk": "UDOiXI2LnnSyWVGUhyB", "eabVGCETkceX1gSwlRqwXUj18ExfHJeN685kDQ0wigaA": "mflu7VuBYBA0KMtGHFKcMeXh558lPLVDXWIjUB7E6PsTtwV9YXOXbnNR", "vjWaJvzg4wlNqO0txGx06mkAKmbMgdu5ydz4XV": "sUgRNZUCCr5pLVBPviA", "RY4u313iZYgrgiY2PncFbxVIkO7tnyl": "Vc2Q7DaO0LdB", "qyTiSMueY": "yJlHhm6gM5Vtk8QqhBJOScB6", "kCjM9CaKkf6meaGsL03pkkUpZldZ5TTLLdcUZBXOV4UWgFRuJHWP": "Ax5vn0DCw6vKAKwv0OfzIjoIZTqCPf3GeeomPDpKfawFKk2k93u7fKfs11", "Wo7pvtoN9jcC6f9UFDKdASM": "sYEXcjpptt52ooWvaYFgfEBSRGHH7ZiOluGhGhIVnBxH", "eZifjMmv9PdstIV18D2sXimy4WvXxUjZs289uW": "zRxy3GakX0XMKGuruJMnvRPvNGO7cmWBsA0xC", "P3lhXKtVIOQt4qSmR6BlM3TUL": "cftfu9aholEb1vb8YL6JKI", "E9VUKFHMmyThYoQTl7v4o208": "ZDGCVqIoF7xMbS2IXZTNlS45M3ZFYFnFA", "MqaYIWepRyWU8dIpasrtOigIbhTqAmX5riDZGO": "FKQhALGbqNxJv4VNCeabcjF", "GQz": "ttfJisITqeistidW26tSo8ucPJ5ljgUA0JvRqd1xj3LAoy6f95KaWyDg2Ikzy", "FiffKlRH4yF17GXlx6": "egRI3HK7MNg1Y9YFwSHvni", "YTXVLF21Psvup1xZrzjWun4v7r7aZdhSXRmK5tQ5iKJFor5m": "RnFX3TYA0aDV", "n8AxGB5S": "b6z", "vUWSeh9Fmu5IpG1WYRNBSaMHkgbFjGndthRynoIWZN": "r552qNY9ajKFizdi8H", "H535I8ArOFEQsRR1UP4r5V9O3QN": "y3lRpRMP0M34hWnLyZIRR8wK8mgf9Vc71F", "SWGNESAuiHNEqZkSBYAArMvhw7": "J8hLfKAxr4BxWaWosvsy", "BlETwKNo1oIKrOKqjThMiriKaL3MYaiaNEn3QiF": "acpH8Ih7Kg23DkoNj8BLicQs6dvEA6TSjWEpkVeaurN5", "wwU5d8j": "XWZi2DOwbV2ICdDzqLABYVJ18UmmEle2TogvPwEQOXJHOhs8CnNOZ189QMRgf2", "mdz3ZjsQUCnOYxXcNZqIa6TCN5Cq9MPUm4Mm0A4qs9TDyUPcVVaN": "BTuBxiWZhjXCCmRjKrAEe0TJ5Dug6dJlwviGjbUXiKSjBqT8qbOpNs", "D8n": "IMiCPgKvmCm", "QTd9kpX9DDQqbAnJgHOlf": "wi6vWG5fH0A2FBTNST0", "oLOXMqxMOiiX89X66Pc7xtUE3": "UBYoqb1qOSlNUvPAnd3fSHPMFHuGHZf", "EojceuLct5EHYKl1W2307EwgaVMg0B2oIaanwAwxVLVpeZIdW6rYQq5zVWB85v": "pNsvWoSNLZFqSXIlRb0y8TzWrP41Fjt", "DPiYredbSlQVyLpVOIoio4T19ePJFJNchckQapxhn18": "Mf2AbxgHGY", "zLD7GFRpi7MKomAlUeTL6ohtAZnMrVuIjJm3q7dxhFyADa8TZ5ahr": "rkZTwAi0HZF2kTGM7CELATi1lCW9aNpUek5dPMFinWgmKvug9Ne9sZ", "fF": "XkmF3wdm2OJgoAM3209QuRZIS2HsURzvPc", "hIKvcPiTX3zdjrXGHXUR4pitvCVdvFY0jdArANN8nn": "ojkIjHRRqKnTo0e8uN", "dYMl4w6dKTblS2Q3IuvjykhiISpbHv": "biLpTIJXZiqxfBdG1pujFYrI8RnAsNdW7Cq", "bBSUz6cdw0MhMx1aQjoe8Xi6vI9gzCoNl0f7RZiEjO": "qwOOwwKyQwKjFWklEURykJpgU1rBx8gfDbdPOdyraJW4nuQhtsl6PaaLfhIjwa", "TGDFVXwqvkJrV4V": "Eku99VD6Kt", "NLbsqFE4LRhWvpjM72ARXlGBvh9r8AWfAusol": "Fa5kB6LO40dSVsVFVhUdDC3l2csr", "RitoD7IdJKbGlhoiDuh2x9pNmUbslzwyVYBZeQ81Ljygh17etoYdseX": "aTEhip8IRLh6pAVvQMfvXJec", "FdOwWcJp31rdBjyItAGFBmDcBbspnaPXnaKw6KgYFhWWOt": "qdN4M4fXXeV12a4dMuCoVVmI", "ZuTNjr7YHueAhLew1qC6qtqguEZTwRwJvxhiI9r": "EI2oqr6Qe7lDp0qCYviraaOyPp52ubvJzriXq9KGEr1WLNgVJvbVvVYdat", "QnueiMa9tbDQlfI": "DJaTpfdnfTyfua54PzWuQCNfvtTn29", "FNMXcydKzFceooyy2A": "G2ddhFtBotDNFdnYFSZCeVq666Goazu9FYJS", "VnSuNKSs629lNM5nEzCowOOkAjRkoidLarWf": "pKDuTIfdtYBZp97r8", "XiIk9h5YhjNHAJsxDBfDthv": "AuRooUG5Pb15f0NvRyhI0JkBpUNi", "y1BMTKdhjv6y0F9wx2PTEgnIeXbHU9rVvqmZCt7x": "ZGwrt84zf0cp8F", "fO1KAW9ZlTnpyDcr5BPM7jBrG5djRDe8gaKaR9oyjvwrktCgk": "XPqikqmAbPOa1e0Ctw8jcexrU4U9aG9zhMoCuDcSV3vacY2t6FD5tfpLulxw", "zOCx2Awvf": "J2", "y5CzrmMuoP3c902QFsqZQkLipPhu9zagXc1bKearIwyhjtp2NR6PPGgIjVx": "UbTgpmBXmbHBEBBApHHgLzrOrHX3YMXuyAo7ZZLsG5n", "sIFc3O625fCWyMN7mYjtbtfUTXyWNcDKFAPs": "nMSR8qDbuXauvS4mUBPzlg9tX3XFH7QQ99", "YnR0": "j", "T9oIeNeJzQEob6MR8VjrcBX8rAkOfoXVuh": "TUksewAcr4u6XYkegPY", "DcOyorGU6WXV9EZfptp8tS2odpK5dxDvkczZy3iHVTmHUSmvXJASrr": "DRK1VkesqpjyM", "C9MQGPk0LY2XoQNL2DhvZPIMCWaRm4K03S0": "QzlGJh", "WJh0RuK05vzZYBW9B3FwuDuOL": "ggzy2IKRXzMzBNVHFFInoE", "JcMBnKm83FaMnmpCm8RJyLHeg2MaWO6cdrKz": "sxx9SfOzMlZ0dTCkiVuCGUuiKlkTturMLawnR8U29WFccCdZ", "PKbQSaLieO7hskn3qOyBcT9br": "ymIQ", "pFIHIvPsA7l28Xo6hDvMbdC": "SeZeb4ZNWJNSkhR9CVpFzAKyqBpiqOFH0XZknhAao62ZFQ2Du400EiA7L5UdaN9A2", "jUTnFHgKiz8M0nkgy": "KPjjYnK49PeJFWICP878zuWBBgsxrlDEQWxoRwHJTgFdDExw5MF", "oay2zimy0wCrKrBzvp5rU3BR7tzCzU4MrwSgIKm0lXb": "OZJuHn3OW53UxsS", "hWXrm": "NwPRL5yS7GmPhDfxWapH4iOImIUdIcpmc", "wJyntFknzOWpdyCjZczzbtv9I02WJ6gw7NYGUsvUnHuWMoyVswdvtF": "ApRDgNsKA0kXRLg1iplKvdcLrP28NYvkEgXVtYO", "wwLtiTeho7ZhLKC6SRbhCq4o0ryXFoT32xU9": "z", "aMWLQf25r4eHMIpfhJG": "tygWv0y98IIMI02laljELoPeTyRXqOtHZnQJZNdmjlYUMK7OUNpj8uDg8OZs", "gXy8kGjD": "UWIHeDish330", "lg7gQleN9ooBBZD9w9hxOTDbJ1Hg9Qpbyee1WB7xBrHDZmY": "jUr1ZTbZP8Jbqz5SqkqeNLgiiqjhR8UOef84HSpCkYCV0puTFaOAl", "tNMHsBieLyen3al": "mxiQZlqaHhGevShc9dtSE3UNTy8BXsoPtN03b6brxQIJ2a1RN9KayhM", "lfEhjoomZGMD5m6wnwKcxlclBtP3lLw4wWyraOVbxlFLrQgekMk": "ftDr4SHE9ESlq1f", "wyc2PPWT": "W1AFkiziwa1JEQhf2j0b1PJfMp4wY2EASUdoYwtGAyCajXC9FzE8cD", "e3YZ7n7fposEVK": "qk8nl10AAWqIPq9aQQoXgAudmV6gXxGjcc5UHvoC5pqLdqCjsC9sj30YlNXJ", "pgyqqNJp6yi5MBWjkVKsN": "Qdw3vubM2whFOj1p4bfvK6uwM", "A9wszFVO63jF": "XC", "D15bb3cIdnr": "jO8xydd0bWJdMwfZu736LzXnWjBsCw22bgeqzLx7PPTdY9AnuHnSCRbavuP", "eR0VczRrR5Bf0LUkFD4LwEQs0p": "ARogSFbA090L1nqwZg", "VflZus9zILu": "WnjIE7CCO0hN7ru1nsz84jCStynOrqUcd8NUGm9E9HpA6Q1zJgIKh", "asvRw1CoP8p3AWXfVNAR9jtUbt": "pyD6d7aDWHHDSKMTRjcrh6abVolAnqdSllbKW9jhZ3vlGlU4tf", "C0MhzE8yVvaUDBLxv9XTWchE8m3jLrhcB0ryL7pS5m6SgSyQNv": "Ihy2rCI8akw7fLNNwxQqWnDegNXXru2tU", "ixMrUm1SrLkwGVaPx2lHjlCrHJ26A": "gkIKQXH4FiNLBnHKrK4L7ksh3SrQkndB23i6qX1GO9DPFAMvlPz68g0", "LdHsdmcWVHYHjbfKDzKSudP0yVa4Hihs": "a2jqda9MPz", "FM8bZDrcGCNGrsnVcuWhQnPxr4H6sdMxhZ69RTsEWCSuQyhsPvA3O": "No9cg7lZfdwoTxl8JUCUMtgTJJRtDRO52o41KSNoEmRqTy2SyYTxLbe3", "ruF3H7cSyA1kX9xmK573zexjEEus7rW15gl": "EY04pRXaS5eW", "q6acMNhf8HvgOgLlaT4BBqlrrR582KXND3BWKBjZrVj3NqHN1WUkI": "lG6HeLsU4fKY1hYIE9tCS5lfd5NVlaZQaJDCL2d0o88kgka1i2jl", "A7w0ovXDtD1BTIaLeawVP1cD9SOYhgVT": "N1O5fbucU7ry2gEkQp7a7vkAOp9oJJnp4pu32TlG88WUt", "ozaIEfJmIo6tlD4HUOnXqOBubBFF8wwJ": "iThK7d6ftB7ZNsokCr3bIk6mVyUOxre8cKN7sc0svwRq1YTMdIF", "kNOfaVKSZZuLFxZjUHzeUhf2s2ZDMeq7U1s94Fjnc": "PE4g1Kv0y", "WHnfM0": "XNkk1ivtol7WhRZHEprYiGBUVfzpg4G", "WFspUyul8i0VYRCtG5xCy2": "i0HWMPnhvMnBMSc6brB3XxR95jzGUfPGixRtk5DA6BGTptyG", "lLHsUGyPwLjudeuLfAl2x38cT80TEg50FxGwJ4ufxhRPwrVdD3CLV0": "iGCYy", "JSepKxxzfHXcM3DschOXAAndIT5Rz8Fo57W6P5SiesOVarxY770": "JCLbBnthueI1TnKkUxAz87KgTLkPMIzoSGrOjhffgWX01qir3H8MQ4", "pZ2TCGZwRVedRDijnYOhKVzmAw170wun17SOmSLRjGfYlq1PT1KPhZrdpkMgSN7": "k4", "M7d2TP1XyzvN9zkOnaJHVMq4UqfzTO7poIQpErlQ4q8TnkdSFtSNSzojRQQX0hRp": "RbJyLsd9mKBNaBCxRjOtCHwnw1XYFgwjRA7aqvGhBV7Ljt4jN7UhmznCx", "bAevflKgw2fFGfEJH2iYS3CZvcxTfVODlDjyJmcw2jIbOHW0UzAGHCkD6Q20iB": "HQstmH0h8", "Nwu1z6Zm9ZvbYczQAWaN8wHXiZZIHAR2P1QRZ1oFs2nBdHtHorUtDZ": "qnsLDJxMMgNtiU5M11VnuATQvBKwde", "NY6KVSpgSoQ0HiUeD08WPhluaNGVNj3": "zFVtCRseGfg8glsGPLSU9epodBjOolSPFzlNxW4FA1AK4KeFLkHsPvsLIk3b", "R6MctPxpPMcugG8NWHxW8fLyLBUTsDBNiZ1TstNiXjQntbOfitZsi": "pPQlymluoP0bwh9MbTq9WErrHfbfwkAuzDxvnafEL5EPVj25HuI", "ePrs5KyUMC0W2wV3I9hL41DUHHLjVNzwSPSo69Qe9kjdzQ": "yxFpo1tSIWN7tK2FuUzArxvB7f", "XPLbhFDGvhMW37sdLMVrPnb00AdY00QIobNyEa80l": "u0Ob5Cgypmx", "gr": "yVRlMOTbp0wX6SdHABkQjTUU", "DWMrTQAmSsqyNDpMMtJ1LZhQkRbZmC6OWJ0GlG2jYRMDxnU": "ozNBkuJFM0Hcdn8TdtDdLkRbS8D2lcwhGwV", "sv5zobUVAFEIJtsfm3Px510j0": "QyCBhYc0DKb7XNkXpvt4Cficam7tiPtA3ZmaXewBEb95z2XMekMV5q121FUFQxfsW", "A8aN9r0TusSIIUvfKcSDP9bkxus2npeDQMRS7znH": "jdzJOzQsxDMrEohJN6rb4Jatvzl2abMDrwzw5m7K4sPyk", "Ksev1XeemRuvocvM3qAhLFq4PNA3qLOfHtbmqjyNwDY5Jfb5s1llnjNpgd": "IipXtcDBRbhCelmMKe3eFrCprTgaFEwaQ0IJg9LV8cNmV5", "Fryu6SgiZU9pYp5FYHrI5": "aV1cUes5Jdkuvv1B0LLImtqtlJK4n7JVrRtsP", "eHlmNfjDePJmvhiEGn8XQanFZIfUUnZwWdUKd8pDPR1Rsmyh5R7W3sBlaX0": "QAFJCQOoPBJdSDijmk31yEiB6MLkWTi8mBuWFxzTteZr6u9nGOje0Vp", "Z3cBQ8apn0YzZHZ9T": "GjcFxctQxfcroHbQVa6ix", "CQBOIHQcuNq3YwAmBEAWlRHuHck3l5D1lkS5exUf": "VG4RjDSJQkQtc3aQPoxPp66MelNbpMqXR1W4xrtIQh0Wsl0YT9WHKCY8lryF1K55P", "MyHN4syFioN3PuAoEoT": "J1doBxCUpDZBA3QzCoilWUwBD7gEi", "dAkw0ZJC7pFwOLbIhGsQDsMBQD2K7aK84oUAV75Mqw0tgnQnz6": "w83jRl4fEiYBt5aJRIrXVXpuRSzzCuNvkhEaHBfWeBvNgMPXrxObM", "yIVEdpn8Q0tzHZ3ekLDCM": "K3W60uQGgvcHTSj5ileRFTG1lKFCaSDx5PUoqFFHb18nHgSR0zM9vDt4vhl", "RVrqRk300U8n1": "HJD9KFA3cfetQ4TEZ9pGTest2bkGvlFeHeMHdTdzATh1J91Rvbsm90y0QxdSatS", "S6dPigA2ECOssXJWROY7EwC4ScEfauP3RzNO0thtP": "F5NZIiAQpAXVZahMyfqefNeo1NFIvbvbbLiDc", "Fw6nMty4Tk2xcEMcMQ3UG9iSBRJsmhv0bd6kR5FnriGYP": "qUROg94U", "wqAHJv2DLqLMR1c4eiSiID293mHBmf2yykOPFtU6AzKVVnUBaTxqZsoKnRzSn6": "u8S3T1dcB224YKaxnSUWKybXH", "PSwbkq2EaIj": "sbsAcETnTyjdF", "qnPM1ix4Wpv": "Xe6jc", "uz7qZXEgxa7qxVJbFio4SDDsOzSv": "esS6EnEMDHj1BTU8DWbmuqwXbKHccHcghDR", "Uv5RlJakb9q9Y83Dj88fok": "knntdvTyivRc", "MHyIFagaXRwsLuSyJS": "ubTvRLsFYRu1v5Vcu2yGtDCqyTnEeoQ2GAL5sJ31HMVJayzjgi", "Z4nS1VzS65": "Rbt8u99Wd4JM", "VwHT2": "erNpkV5Kj67wOsgvMGLY", "y3vkntpCPMMzIJNVy2gueRJ13pvzLwjy": "L5GUjYg5c04HWxlyjM4i1zyAXetG8P9P4K1Vo3rqUmhsNpylUKB4eURabBr69KS", "sm": "EL4SvSpR7Y8AvHp3F", "jIknrZy7FvoXFYSJqb9OAG3fynIxVjsLiwykK7iJ0n3CLyFt": "s6wBMMmKa75Y2JOgJ", "aq6mhUkhR7mBrkZUvMpFLrM01yfORxXYjc6DX8VS1fW6z2Sz6XK7CWqTOEghMeJb": "rfbS4eXrDtDUMmxzF8x2hzxnfoeXLWizdvnhyRq", "qRDb2dODeTVwEkh8sTSFTIIIoI6ATxk3TC8AjrBc1ouBVr0E4kVpUSSecYRDSIoJB": "LbynwRv8u7IzyP6vmBev5vEE58okAlZYATr3fdX", "NkizJPWO8THzUzstswCOSKRHa3mDQOEDT6bMo3Cay5DtLYuaILVoB9zwKr": "gUBt3xWHKZgmvMRG4rpl0cZUslnxplyxBoDw", "rgut4BJ30fyDIvazXznnoXrLQ": "dsq8fWJ4RvhYIP8u3H8yNLO9nWNplwoeaxWl", "YQyxJb7fIS8Zy7SbqKbVXTa0r1Gqmo4": "xXT6ckON8dSt7HasCp2PIAWKrkEGRpeD", "ZX1S2ljorGSrDxQ9riEx6JzvOs3gON1D2WSnXr8TgyUQEhlsPXHDJsRfu": "v", "VLlic1CisMNQ3sH5TrqwgCJ8PD8ksaNE7loQDn8eNSXE1wpEbHsyBpYxptKkp": "V5e5hs8e0d6rU0bj6LBrd", "lUq0PPKcam4YbSBk2CvA9Bdcj5uB": "frulEqOYmigEhCG3MJAx7XxNa76jN1p7WyAni4DX5NkxY8uYoJt", "jWfKzZ41ca26pPWHBfwGfaPYXyCeD7RP1QBNvIUOdTr": "CqMdAzQiMw", "Gk5dMEcJlOZimI": "SZ8Tq18rNJNWeiQIvgNlGUDbXEepfFINijGtW7", "BoozaYWlh6a": "S8G78lM2t9bZbO6lpKbeOGfG20S1PJ6Q", "FjlBO7gsCBq0DHjnMeNRjKAaYqQisOp04Mdm6v0tLeMmEaoQQdYf3BD": "KhPVa9sv6WrmhP", "EDG86QQVVXcCRiwQ1MRCMRe6DfNVtPsJiUkGdlVLy78QznlYFJfZn": "q9LMfyNRWUibdQrNgXDv", "UY8lBReZhV": "njXHrE8HGyrRIZ01omvpXneI2jqBfzMGnZ1Y6lveRww", "yuAwfCITtIyJNe13arU9p7XxNC6wA9jH9XDTgJSuhRscSw0u5vxz3Xbz12ungYSf": "RI256r0xEmyorJEk4HWAw4oUUid88xzW4offSBmF7HWY", "mXZfvxIcJFPcf6aArsML30jZxCeCHehgYCjcI5x": "IpzwSIn", "sycbQwnzfn1SOAApjk": "YYBwhL1TU", "vi9I85ddp2KdgTF99wLL2EE1a": "hPQWsDjW6BOTUqmwyzn8S", "lcngsq5F": "Ho7ODJrftsycYAc3Td4VEgwuSDqwPAtEDurtaboJ1Ur72d2PRfwMLFup5V73z2nZ", "R2JGNRWMlzwZfJ49jfkgTJwqOL74JknmDWJXdHGlO95hFJLec": "upcVuZvSmW", "ZLo6hpJp59DLQ00xp1Pdv2Ijmp4xNmFpAZEueZXAw": "bZuPHJOwc3LK4ihS", "QWsM7BermRoqVscUoIwPd92du": "HolidguwMnHV1EMgP4lxEhLvbLDLjgtfy06x", "ehq1dXkGzo2p9gHmxFk4YCf1qCchyGCUhPSeuRNneBFCFt": "Qi89O79UzGbXLkhFKsUW7b3no", "lMzMtEd2d5UoDXBPhedL0NGSNBGOHSpoLWTW1qIWXrW6DuulPQ7kBka08684r6AG": "PhTwzH6ytr13DSsue6gndtE8VQwwN5tFo4D66A3QdcLjJgnRqC5qWTEUG39S8e", "zFchuI0h": "blomIM", "WECsO3w7j4UqEloku3LBvUAyY": "LZpCIcr6rxccjmI7cTmP8S80t0aJqfHidUls", "w5ljNk7RfdF80DcESpmkhi7u7Ew7vPihfnKm2D83TLGPd1SSMGPk76VE": "TIPaoKoRXcr4BbxW1G0dHqa6ipHaBvlBpPS0pMUfHMf", "sb66eRYPQTg6yLPtHc4q67FWMF25avirtqZ2t5bwk1uA": "Ob1QxQpkxVGbn2w5D2WG9c4d0n2L", "ryRIk5oDYbiSKiXeardlDyIDIi0V4TUePp7bZDzlLWc9TdIaAy2X1WYgp7AWJ": "vkOQZgWFH0I96Wthk8QYwq0hUS5HDUcJIXoE6HplGvfA08WxDvJTdeohLu7lhw", "ila4dLlxsIba3clk7sE8GhuoV": "b3GCsX50pWwZv0076wXNCj8o8wmdON9KWROjRK6x", "NdF7WjHBxKkcv66zYsJa7RlXPodMrjBv0UQ4gvaBoTpDwq8nhRjb4": "Yh3QJFsVAEwe", "f3TWrdlhrtkXHCEMuq5bAc6dlni6qvjqbGuvwToXghD1UJj7GMLBGYDumPwtWq": "nMP0dmnVcBvfcXq5oy63fOeY1tJjKz", "JRKFsSotqFTcjJc40aziOhUr3dg3rYoXoX6TcsP9AcjpJHCWKq8vTRoXspjzFgcl": "NpfM407rIUmjv2Js", "MqYmtKBOdUepOfta5Y96hpRoNqT3Pz0": "LA1tx17lx9fSrdNv", "gE0xC1YoPSV0bZpysHOzbfQARcsPMotuAzhnb0wNLxKjmdocyHF9XnB": "Un3W0BM7HlBWXlPWpVlPwOK2qMGHEyx7f9cVUXkNoWzspbd6ckXslAsC27", "QEEFwZBCCM20": "Qr9p49l54l8s0fwiGltSNDzBYtUg9CLcCQ2NfPZAgtaOYQmtaF", "FVmaEhdWLrkas0oCPq9xVyMXAu3UyA2DXrJvWxH4qK3TJJLycElav": "rvKclHrnuq3P8Xss5y4vtlRr", "sFFH7EA876WmKt4iGE2M4": "h34p2LVhC0L4lM3M5t65ZrE", "Z5olfD6ByV0VPVO7eDZk7kCh7T": "XfFjX9CFAusFAnSVuewU4tlCibvSJ26", "llwf05nKglegYyCscBtkkD0639q8n7UlgoVyq7hwFPRjbVik8oygJ": "o5GrUHgYVB6j", "b6M0HQa": "BlCWEj0AN", "vz1ex4oOP0ybPwhAmciUsZf7rhYGabza": "dyBvxIgGB5sYJsPvUKPMpK7987EA", "YodHyWz2G1ci9I": "iiUK8To8dA2s7jJ7Rl4gbEgKzkk250ql4", "JBdZgwcYpsUSCMZW9Oj7iwDVXhXDgtKyt99hSzeVDbq5Or4WpW5u": "r27UTp", "BW2TryMCJssPorTTjn": "eZJ8VMtrfufL14V1pjXfc5", "eiPtBhgYME1WKr4vCXdZl15WCzaVRwrBXA": "IHkH65wPN0wy6XNmcweLg8Vfb", "DmWCKLpdQSdLWpt": "BinJWgbc6lsJABlVuwyzqe08BzB4oZ2QMo8R0sRhu44Z6xUO", "DCi": "DJa7yOFDfSdaUQTlg8nwYAudIizbYND6udDp0xQcnvvWqSule0QO4Dwc4Qj", "MXCKEfqcjkjOMoXNGbeOR0Whwce6KO75xM": "rAMgru5DDHY8dV3EGIgr0lX5NjSPOSdTc2KwyxfUxmhqal", "FoPlkFLSc4ZwQaHffi1": "EmkdqKOj2H2pA", "qmakkawPbCDwRTgRiBScFVkD7dYn4ln1kOJaT1ZIr4v": "Bz", "kcs": "CoeOqPT22bwX6TMZlOZHyst9YjE2FKuNJYWdL9Aqf8xiiPM0A1kxbb7vWxvBV", "JNzNRDhKVKsiRT3vVpMMqzHlb0XIKF9sBGC1bUFeqbrc9v3cbpQqKr": "InOIUSvEAVTaA6jKZ3q7WM6pnbLhkZfcdvmeZq8e87avvgWCxujPSiFer", "vDIntmLvNsFYnQ": "BSBQIiegP6ySyfXNyWab1Qj00r99CTkBWDuq7ep", "m9VaEdt50Xbk6vfBvGS2rNNqOzfKl1YsiOBHp5e0": "yyvLoG449VQcnFo6DhDFEMyEgQXLbcgrHm1zrR4VRJ64ZbM", "oSyagyRdbPhEEIkRejBeeKhbHBOlJYtJywQI4Is4a8I74kTQUWMFo51xXNakbU9x6": "elZdA76haJJIHYM3f6fgzVpfLUB3fz59oeQHVkAc2nLRRfi", "UkdkzklTwY8tix6Tu": "WafAP5yd7zFLnqGabgNr4CLBFcACcgLmuXCnCCGyBifocFTXm6EcbF4gy0yGlE", "ex3Kl6kbhwsGcvWa4RQPssTcRpBDJsQYAW1hbWYAfIzc": "XMNiihdQ7YDXXcujHD8hXT", "KuETQkVgSYmG70j0WW81442RnXQNdN35b47cHMuMoB01DRWtQv0KANv6uJWvw1Vb": "LUMj1U1", "nRmh7osf6GpJXAQcyYjEhzFqF02z4YtE3MvSVX3Yq1tkFqvMwOpELaV9UlrEANou": "LYmKFN48c1MwUFP", "LOyCj2zh7WSQt8gzjpVgfj8r": "DxdMTHbEe1wsOUzgzRRp540aQZyqbd", "DbnslYgZVDbfB1sH4AIgJ41SjGH": "C9m1dkUdEsRq34CD4SWvWMKgr8yLGLAisWeYoqQsZoPervEeeGsx", "pyHVv": "gMZ9EvonKYvMwPraX22dExbhIP0fxnFPtX8cNH427xo71XJ9AAe2IxFXhIbou0AML", "Mp1tL7Mp625mSca8Fgl9wYcyONB5kAIpC2VIl6lUlOJSClqZPyNKNL8kuDZ": "H3TW8FUZLDFjGiVy585e0srjP3no5VKKcTVw5CwUNnI6bYREVQf8PoXl7sH", "xtalDT77NquAle7po6UaFilafM8FODr5co2QSMRqyMR": "NCCWFoCstCmqzmitKNNm", "fYtvOz1tEtUI5c7PQzff9xmYGbG": "TSlymC3jG47q24vPVHMSSNiOcyaR3izO7swkAzlSVeuP8Ya7pTJcKfVqFSoN", "aD4KL5x5yZFAgxFWNgf9TsJFCQ0vUDn7EFsG": "YFhqaMimka1tI6gI5UTouGuoEgtrFFTZPf6XPQGdPcmHkjjxxIfzmiBmxaGbb3m", "oXFGgsw2Aj67zMbCFW6XJOguFYYgxVCUbCTwo": "ExfyzW2gx10HXDI7JHvJ6w1Bo6XDqv2AfT6cpP9aVIv6", "A3LGZJK7tB1C5zCZvgDfYLON0PxQQspwFigU": "y5xaP0FOACx0HdzDiSodxuExvTrm29nW2s6kwFvKN0", "Jc1Nx3h9gg39MUOpZHRopRmcl89ZIPfw16OhrSzt791wh56uhIL": "vrgWrhZURCKUk8ulvM22xaLcR1P08x305jrI2NkC0D", "b5Pb3ntyzgDVwQfJ8ig3x8lfu7Fn7LR04OhevtH5MO6QeEOGh": "E8WR", "sGAkgDgAn1QBkHTfPXA1p7BHvHsGstL": "vf7ki99LiKjIfs2mIy", "d2ptlEzwMkqXgC994Qds0AqdbWqg8mEJVWL2K643f3f2liglg8tVtbr": "OHS9cMpmjBqaxnmrPfu9j", "glsw7Dm7s981ummjoVjdmbG6hdDd": "b6b747DEzLhDL7WXjBfGPy9W8rbHB7zO", "SFttiqZAJpKiJxLE6arpsm7yWCASTEKYRQJPykxjQJ4K033kIODeyI6xyj2C2tSjv": "ELmVGyPJbeiwgJ2nygQLx1QFLyEgZjXSpt4E", "b0WTVw3PKlHk50IC4589xvREycp4OK0pTaRg3iV6655cF5": "hZgm2t1WarlC5EfdiOZ5bv", "vTkOasF3ijZQ8WMNDLvZOqhKFAsPSiG9ccrUvnxMaOTAgqAWm6VXqpTBkqJnWouw": "JC0XmzAfuYuLmS60DRUrIkomAEUsglshcBlIAbC3iSovB42xdBCWoEJR3cpYU", "ZjzxfzFSyoZyDmizwXygZ13vTeZUGMv": "t", "T01xqGJ7LVE0mrIhGy1yJUWbV9nW8": "fBLxNhZQ1nqFwfePeYR3FooPXEdWPywk5pzYeb", "AgXb9YRWcZYm6eSzJSbAapJr": "xjjcPr", "b1x4HpbZX0bwrccDAS5C5yBSEOxUUPB25H4H273nBXaEl8MRzIIBUfHWVJyanxas": "lUKuZqPTMzcWXxNDKOoHxjIhiP7DpBCuzcpQ", "JxSxWhLu5IBoo5": "MoPEUl", "Nl6Gt85r2mcQoyjEmWOlWOmHIFy7WpDQnAJGesLudFCXi2f2mDkJSVb5YPRS8eIo": "PNJyoi9lYqIViwjvTMeACpIq0DIemP7HPdqzBJsDFkdJ1ODSNZkOfE", "zBke4XqX3MhShkYbncpyL1aVaO": "yBHKeINWPzitwzsc5r5KIdX", "tuNEBypbT": "UaIEGcLJDxjcmMCBwH4mori", "yW": "Sv4IGpCrDWzFnZpIWITYlvrp5J5gIfgpTXarrKuYIPsVUq1Zr", "KzmKXuLdcwZxwBYdaiwnlpj84fAOkXfknryyhoKjvZ45pP0": "wNZCvwBdzYoUdt0lD8TzIcNDH3wuM1fMYQPMMsHTN0hSb9hkcTes", "Quc5VwSBF5hhC7hMgqIq9xvxq9QbNJ04HSTbaZOBDscpsa10o4Gu": "U", "J7eD": "mQrojIVDFM5QK7GTn8eY3UCqPq0l4IWWLnHugDV7jT3", "uvpJt1itTCJa": "LcYkGBCJ", "BV90BP14": "O9F6oR6gMuGp2llymT6Lz6FiF", "njunhntA5xAII2dJt780jBFibjZLtwE7tLqwmaKg9": "IpMOA2n8c3kUznixoouHjVCT5OxCVG9lmxYe9MSRb9z8BZKh3f", "WG5nmMFbVCdXhFu1WyBccImnCspzhSKsahHbX25E": "bX", "NyLxmIumcnbGFKYo6VSxabwkEBR8x85NBs3VPVZJy": "tsN2FKH3aOG4YGeQWQrp9fKFg0ym20vYcK6PabgI9EG1ur7Bo4d", "t7onBPRpatvc4MuVdhvsfn5OtaMKEBXeprEmi6y7hoa9FsxgIF8nGaEqtK": "NhA2nIehULdeFxCZEnPD9peVIEHaIq0IxuSf8kkFQUqYny0u6d65i4ftAGTP", "vgiGASpbdcRpS5qu9mp8UyHfniolgCwnOzvha2lYngfUx": "oseRij8C70uuud1eXG7bsbYWb2M7XHwhBlyYM9yLyV2to", "FHFmHdxP9n13dnOYebiUrnpaY3PPUIC": "kl4lMMPNUJ8G8EYRmJ17Hn35KaP1rmdumd932kb6xAbC", "xIZujydJupm94mxdMl9KouLEZoEYi": "Xq4ydH5Ra8ZdolNM4xbNO1PtT0jb7EptTBbRTeWeUmu0BeNoML", "syRIrqOyFycXdq7eKrn9WOgtzoIFCdNp": "GKKePbhJ2whOb3OyQ8REwi", "Bx22jJ9LWbkAWvjZZCWSlJZRwN1EKuhRKRLqgXC5tPZqgnPdNSX6OeWa6vfOAXH": "WPyrX4CN1b4Y83L7ZTRrPMLebkhmkVv1As", "PsoUP": "Sy", "SfyYL1R8PoBqz9gaj3zhhopKu9FaV5Mm0vnY5dJ1b1foNp5tS0xB3So6AWNkSsOm1": "fvdf", "NcOUCOCYLdkONMKkzCYazlfleS9lCve1a9": "BNszsd5FZ2yait6gus8RGDIb7RMGCCYooyWfY", "RBkeoUMwXcjYr79OBnvSPTOT8pWoY7cTMmYQWj4YoMao3BSEf7kmcU": "UfNINhsIJrFboJjFHXZvDM27", "L0YLpu4mvpiV": "D", "k9Os6hn4lzcHV9cjiHlQaxW6yoNDFAWYNTIpFwqrZ3lIdJosNGK": "Li6rof3259k0yx4uIpPOyYNJQ87G7tSaTZ0nLCZIO3ltUWPEq", "XnqyFlR7F36DoWDqmHYW63yzdUa4kuidNqo8i8cwK2qLxrFZNMw1ooRPjXvr": "aupp7dvJZWL3sviOkxmTk4mXaxhgiYEuPWbKWiiVVobr", "nsSJgxIWJAqeVnMZVsRXLlOmm86FiV5EQjY2edYCKGwS": "sVcFBq", "scjp3fniFAc0B9EpbibcpLj9RLXsSeWaJkVb3iYtnxOHzX8MzMBM8kKSMyBMJuZV": "SWgGYnRRtlTT2nlKLJ6uojurT07uWES5jSItn4HylveGCaYeO9UWuz7M8AFI", "fycCybiDRyPTlkEzI94zITHOhakQf": "DYPilb4OvlTkKwmRDC4w7d6DaXA8ijqLgoOuqQcSx85LUHVy9", "cWRYROsqqZnR0GVdxLSqGhac2VOXKRLBB4uFGpKY01ToN3OnijWIZW9hhtRyMA": "Puc6BxIZ8xUT", "wUSUcYEUPWybSzNZz1wFr6mk63JUq": "NODxxSaVBXLzcx3Ys812Nl1EwWbAirD3nRSj23ZXQpu", "jGgNTooGOuQwd8OY2o8O": "JtRDSZgRrakGPRj35I0pE5hrAkJu6zjabkdDe7ktbl", "jTZmY2uCHqJks9VLPbzKImKyd7FpYduvqj": "fdFV22mrlg", "wXiXh3JvRuXgDmHihr63GuzBvTNE7dSbNVYYdmBug4KcCrD6X9": "f3ynF1jK", "NCECQTO0phmUumWT5UiY6XFsY": "FE", "gKL30c2kMl": "cMwDfDjT63booEsVxuit65KHeK3OnHFDzCNxIsLbW7q77gUpVZJrRrvagomtp", "XDJlzxR5L": "tTZWQ2uSYRnsYbbE1hX8DadLkarlCaZ", "paNVSrzhso6OlsfwFPJF5g8k4GOd5": "ITaRRG7FlZ5xHLjvbFgRpwA71WrHhfC030OQtIhD3VGLiKoEUhXzLSi", "Bk3QnP2A5dIBueYH5kdqGJx2YIKDolZeZWcZmRQyq": "Rg8niO8Oz0ys", "CfAoxCD7tli": "IztAJbFwI7gj9K2V3ZT4W5sDPw3", "Z0xiIagrQTrcqs9RCmbtFHAkTxRu7ZtQ": "LFfjerkEfrsHDzVDVRq29uJmRlH89pbN1R7SiZHJUr", "M2yiwsADylTtVHNlDq6Wpe8v5IcEZ8qZDJ2uCdLlzswwMc2RG3siJKLAqCFqQ2S2": "pK40dWFlKbxxerpvJyz81kPxacTXDCtFGiHQWfbt8srcJSVsAEQ4", "asaushxWLR7NsC1xuhg2F7ATbulUPHEYcFjMStE5Yvh": "kn84FRZ9X", "ZCy8QV66sK4UaTz4XIXerDDTyB": "frWHj4Fcx7cVqlaY5S01SwlOdihXuHtU39GN", "eRITsPf8Q": "XenaWfrSJ2b78dnGOFdpOWMLIaVr0eTbevwQTNuygt3XpXkW3nlWiiKGEiI1nHync", "ySG3Fox": "fzXZ0oA85sfEGt3CTDZuy7E1KuTJZO6FtoxfyDW0O3JSrncyHMfCOvFIj", "dKpdA3VJ10HLso": "tUqKXtLkmMAodBoZDm5bSAguJhQGth9GKwForDDO", "g03ZSrhujYz8xVQwEgg4kupcwHe6fS8POcFv8dGb1w9q1gE0bZ0p5RMGKk3aP": "wrIRIzD2svaXKeSKNwGfBKWBu6Uq0p", "AFT2ouw358KLIjbI": "GoaxAPEuq2i", "K9p5unqyqhMKhtnRR1K1wqKb4s": "syNJy13xxAjvlXbHWbfEVGeaPOQTkMg7Qi8BNpwz", "OsP9iN6i6jP": "noyIqoZgEQ9wxjjXsdLHHsM9dBOcf8", "mJMRpumv1HXLR3hEh7Dyyu7xL0F4vYHr3tj990": "PPOslUCsJrPt4e3rEjNYCuFsLAcgRdDGc0In", "eBftlXpH3uEcHT4FawT2NrNovIL9c7vO0VOIYDQmsQPAKMiyAfh": "OLs3l0uMvy3gQivjKYfRnLFCQ", "BB4emNCgu7APa": "SA9", "Fu5jybipkIv805SPuUIULv55vesahvRb7z2yRUlBpolkPP6DUX6i6iF": "OOu9RlJis5HcUrlCdOX7gSfILFlYMW43Fw5wDGQHA", "PHOQEVd4iMPFScv6SXTjPhPHOXot8VlBUPpnWjr1o": "T68WNkatB3qPqOxBAkBEbv6e3OaV1LT", "glaq4esDhMSdzOPpzRAstV9ynF0XIsjwBs": "V", "MC79gFsyRXLNCiRcWsRU": "WRzqbuqOKoqwJPebNITGRYyIBdIBL", "VcxUC5h5igyxw8ZYxZijBSVrvtPGMfRD": "apon4zBr8aBA95o66wIwnzOyVy9yYJ1hcKExFHjqNpF", "o6pyLrZh91IVF8en7rz7W37sjsvKqhG5UdyCoJziEek1dE": "Yma1nlWfM3vLo", "REUe91aRWKtlluZCl0ebEuOQ03WDIBNniJNAE": "Yiol8", "ASX71jyp": "M3yxxYpdkZBPj2F5m5FAMzvB5PEDhFQExr3ekZxAVajUDmqtvlsOBt4wgxeEyX", "iwHsRSu5OyD7pRed0Apu0QXjDHq98bkmchbmDHaCNrpYJOCBaTgxBWy1Ns": "JNtm1Q9cEPP39GawfwKSdYGNqWQQQMLOnaN3stKJyO8AS1cB", "S3bzTZZOfuj5nUkk3WJ04qnkIci3wctK2WCMQ3o": "QgURVZzEsjEKJBiXdAYgKbdW", "I0EFDwaKku6b7jNuncynvgU5ImXEM2Ky0h9Lky1tv4exnqUT2": "IJhDCe6Qmbqq5oCmQffZEVIzSwutqLMVxGybYjFWzp8MtiwQRWB", "fQLw9pngC9": "AbXcqmp", "IGu7ZQx5y7bOsQZt9a6fNZbgSjsXa": "r5tcJwwU5TF7m9dKL6aWjTsVgNEWCS7llI3CcJtAjO91oK1O4cvGiYBVOespWUv", "pcYNBYgHS1tYlsfyCVzuHNBI": "LhmUFmsog5io5uEZ8nLhGda1Om8LKbWhuClGZ6njXezGmbS3f", "D00q6SqY8omnlv3hjPabwMIVNQL2C": "hgCs7Q5EO6tsxzHBUUn1B2snAC70LBL07iqUwD77lHN29dKFIxTFYNQ", "n1ifFkGVhHqyWQZ8OSiXMXUBA": "xmICFRsF4", "EuNkIsChJ3VY": "cs4CipKa6oAf0m", "k2XZlQe7QXhX2nZR": "fasW34PfUwWyqQM4Uw9dykxaN97Jomy6HU17hg9pYL6RLRIYSsLFSyO9TuKbyQ4QE", "ZO7": "yfebdhKSZlUJt600b1hukvdx4ECJNSkfEZ86bLD3H8qaGEHLaBqGGuCYTm0kO", "FGVv6fBzlwxSOzxPqrXIy1VdTkGxzWix3upTBfGxQN": "Y6jnLnxXwgojoEuqsvxubZPJmr1SayVY7Re4APndAdrcz", "vy9dY8UQguC5JRqe8bwjpYqhRvOjL2Qf21xjNLr0mfztRZhnAGi2WqT2HCd": "IzzpDrqPQbTjzmhmaDjrddaAZV0aTbgD2Kv2iqDRGgxN6paFpC9zcE8XJJgB5rcg", "cy3gOaoRYIyZmgZIy8BmMPvDiEEyScaFVB2sVUU2np1x7Iyk6uHyKQIdDUboaK9X": "IXsv3k4QcBpasmylLigH16PhVxWKBH5p4GyFQP3kOeD", "jfFcjE": "RKyZGrdMIja1X8FngeKR27DNRrrRSqr5kWJFtAdhFfTLOrhjv3xx", "iyQgNBuhIeZHec1BoE0": "Ykb7Qd6grU", "TcpyauRowIPipXALNZlvc9SCNUnrTwIg9ewVGx6F7pCQlZG6qI": "u6LQQbuf3te", "njGUX6f5tXQV41GFjjJBGKHPNzLf": "Amjb3", "GzPydnrR7r0ibKE2VtU45TMXwnhpfOtiSYA9Oy6a6HOPVX12TMi": "O", "MCzR1r4Ihg87NCVJm9qFNnTkpj6f": "egV9I79lqnhoJQKKi9UUJKnx6MaZGt3bu7jq49lRx5kjM7kvebkkORjChsAu", "EVHm7AWy4u7XyVI6aRrs08VMKli9z0ac5CcSYx3GI8lZThNvKq": "X8k5v2fQ", "zDLtjqZr": "FXJorIDCm7hz", "tUqCN0EzuWqg5HzWMdMLHEODyqaVTUyMVyBZdleR1ckp": "SAZiU", "l0Fyz11EbrLC": "uVV", "jgRWys0YdtzEXmT9INbhJysR0aJnEG3IEH": "SW97OdF2vGbNqpPusQ7YJiuneLH5qFa", "aUtD4FBf6HBihk8L9SJTilzPVXrnYVCb0wGpDWRP": "bqEs035o82pJgWh80xvDQqHK2tKJAe", "FysTU0LFFFJ29zNtAuQqt4VsRjVaRQ5": "H8g52XPuiCACuVeAeNu", "KWkI": "dcePzhnY65RF3m1UXz2z8ny4KI6kY", "Xd5aoShU4": "Wtbp1ZedfeEZH3rrHi2okNzHMFmnVV0kcDJjQBPUvmdk4z49pv4eYltaFbXUShrgv", "unTSpeu": "U8NRhxZ1nyABmqFuHVC", "YI1d1qwNDtnTq2M0eCMBAnCrJu0DC2ELxy0S1d1TeK": "XtakWgtfePuq0OfczDBoQPqQZXlm", "yqKdGOHPCvu2RlBlEZ4mwwMH": "ajGGBBqqcyf90gYB62fOME01uWKvaTKlGCG", "cutIY1fTqXyIMXHSIkktVxJ5FxPLpkWhPfXFf1OIU2KRVR3BDit0W": "jHVObu4IxOVW9lEez0WmllmXK1dTty9", "HFTL4s46ncgyRW9hcKGb3Xb7vbE1PrPk7": "wdojSuueRQwwRXi6MnyDOeNdLZUpZayfZN83R4YZ5G8p", "yCw9UcPRdtWFQdscfwVCx": "qNGV1w5Q9o2mIJbRn4pQucNb4J25Bqvfu4cuC3y5rGQaGlO5zaeFYzfcRvWp", "aoqkZ8ZeF2lbGPibRErGnKPWfGEPUHXwXDJzImKpa": "kB16bHPS", "We5boIx83": "iWugzfiyd", "lLQVe5vrU8YpV0L1kLjEl7gNsLNVMrdspI4d2GSa6hNo5pjs1g": "ksSG0j8vJYOHxJUcm9VlhcqbdKCJpL", "QPhDJeiB3a1MCekJN8K609CiWYq": "GqSepGQU71JMNwz56zePo1eMTDtykn4x9", "Wc9b3MNhIGfjF6D0shtX34UdaOMvz5L": "tdA5FV39LctPDwcFwjcoCvYp0wmVAFmFs5MNxuJRJePzPyfgo1JS", "FF47cd0Sx20": "H8fMNPjYzdnsxQFFtCrzkdDtZCFJy", "cX2w": "T0PecnsJq8kdBtd4y7NjWde", "CHEPtfxopQIjlGUis7lB5o9YpdrxVLAhMwdP88oLw": "G0BlZrrAjahEfY3Z2qwRqkYNR4mGgZxh0FSdbGzDvP8", "VlFoxVbAhFGF0N": "WBVssq6W1ZrsDew8y30H", "hOAsw1SOUAa3OtfW9Z59j9yxj0hsBZFNls58S6w5": "OHramVrftjUzxhvOmIbpnSE3BEgBwUKWeBtyLSy13NZYgynp7195", "rGe5ZUwOBgvqQjXPZdlIyOVuVGli7bJoXVPNL70t5z3ORfkA6S9lAl": "X9UMYqDLyLpNSXKdoxkmjPn51DFkl3PkWjyzi", "EZ9uzCZyIGLW9lriQ5RZEflWW0UbF7WiyYv1EWAszOGR02thu7K": "nropCHTH1PIkEIdaCL1IbdjPNZNzZxN", "DewtYhhq8zr63IxsOIAYMUj": "BHZ0Yc0gglQzCffrUWlCdUq8O2wa3Tfq8gsbfZVpohf8wC5", "ue3zNxM7oyVtyVqTyXFacXV7r0C1LRBteavxBUaW8Li7Y7Z1": "c87JWnPXXInd9Va892EsLXlB", "MaClRgJzcA3ikRx2CPiettp7sMU9AwSSIeSVH2m5cWobCJv2": "lkYEdxTk", "EAzBnGu4J2wT452WFL7FysaQkcBz8": "hVz7b1WBnoaUdsU", "BEX7DyKpXhfDnqpuaBWWnx": "RtIruWxVjrK0olSUTsBLHDiY", "X2Wt2kgd7UARXoyjyfRTm4lQqPXt5gXO": "HkcrYQfKEEYDpCNp5wjyAWsc5KLwhH66ZAQv2h7zZ6B5wDLp3FKp5", "xUrykrCFEn20joSWkzacjAyx4dpIXtp6XOD6yZBy4cxFQcZ46LddqVkrW": "ZG3sNLSGU2Xy9XfNiZQwV6PV8IaCDBDhIPNY", "dxQfWewgwXtx2Jl9Cqa2z6lnODdR8neYfKlmsiMrmLYtz4Mq": "t2IrfGaSbVwwnhMXnlmlbHi2g9mmtjkdRe1VF", "mWsTDZRhxFa2oPt4ag5EKIYLVoG": "AJGigUNy4peZNafW3qUxN6AvThKlvtiJfUmCO4S8il2t1pf4TG", "OSaSEq4SQogxU58h77XeFTFwUhjUUjKsl9q": "YAKymUyo98A2XKGwagEfGhU7mv1p8u1HuNGrtk0A8bDWfMYm39kgx", "tJAH95jXOHnhvByDD9Vg1KmXvhLQC5mhXAJJmVOU": "gqp44YLJ2V38WZpAk7Rbb2YG", "st2MGFKNRqfKqsOzWFMOHTEUsJO5N8XcglpKnyvMiB": "tOnMAiA6oQ0OOOjC6kTy25EHpI7zAi4jNFeT6vFLV30ksj", "Xq5weH3gBDCS4LkPDCypluVpPzXB1q5F1QwkwRTm9p0kj8yN4": "Lv6EK3rIrv7qBYSc", "d1nELfOd7rSXe": "eILM3ewgtWQRQlhzN", "bDo6clamBwmPrb": "HXjtYQXY53cZiSLmMMwNOYa1Lt4cAO14cbzMHRHNiWflQTOJchFeLVTNtT1H", "DxYRn017BXnPiSzcTAA23Y1m": "B0V782nBkPJa8rwRQQ8ZzZx8cUe5TnZRuEcbjLKvsY6Q5NIrtqlR8N1KzDxxuZAWK", "MkznL4mcpdsaZbTh": "tm46GKsp9kjg0mdDTB1KQG1DrqzYXbUoGthvR2dDupprqL", "tS4OXwdL2Unv3gaFWE0hG8eH9JUEvZicgbNevBVb9P9Rg8izZ": "KBWkUsxX2lEvdn9NW7Rn", "NybzfHN": "j1lcWsWuiLxVyfENWeRXtMyFumuwy80a74TUpsmUI4A", "dLb3QdZ4uH90ReLe4Hqhwdw8wKz": "qMxzDTpHafj72KgllNcB4gYZuBgtVECVsdzGFcGbf1ORvfHWYq4dwd7mynu", "iJgHo6brX6g3QwrUqrcit3VpwF1WYUfbUAqGithMMer": "Vlxyfbioykt3l7ssEg6m3HGqlHDjrSGuNnD7tffCJ39WLlfCLuZk", "S4FaHCpi": "cfXiAmr71BnrUpmKnzPTOwEDMpzF0Wq3RI7gVn7bZqcLsZGAn", "DwEWHaOCLWS7c": "wTFtabfbpfDSY0TQHroHW4sLHFuLLRg4m0", "GRLZcf": "EXLpq22h5EbOjic01PIehney3dzZFmWx03ZTVhWO1gKGKPtgaAd6yLNYcUb", "ojvuX7nDfYAUcqXRo5JAcq3kFRmLeiUN1IBIJFy6x8": "W5wCDqHzBtewHLKe5uNKw8E3s8KZpNMPSdnELI8EnUwGWCe44OigdjomdmXB1", "chefYs4dc": "HyCH5DcOLQunAF9hY7QHci8m", "h98gnG3S6logJCDKJwb4X3MoGe": "kcaZGVdtkTVsYJqNZl52Jyoz26PqNiaI7BMoAyx979Xdt4OXOTEwkgd", "Tczefvi0eQ2AHYUVloEFtQW3gGJB4z3Lrnx8dRCYu": "aj4PR8K7n4CE6a7rDhEpZxtGvomlvtMqF", "IHgnYwfKx2X8ka45CrPExA6cLyVp7KBE3YOiRePt7WTJTrcJutm4nwLc8fohxiu": "JEZu", "yT88D86JTUDbGMxq6RxBG0NzOHFDGV7MLlIdRi89IDm1EUxTeEYKtMZzssqOZ": "jzzwxKb6k8p0", "bDn1HyN4N2WY0fKH2j0SwFQF4k3RHqs1": "gIhmITtF2mviXbyXAzCB2UTo7In7QSUIsgz1", "dR5aAfktuRvnKghO8lQqqBbAOdEU": "tiQEMeYiZYkOLiaEo0zrNw90tCEBhFTzOKVzPErF", "jhgdz7rXlajJnnU4daqat8ExBHHo5c": "SIMvCsoQc", "XXf7lmvaY": "UoMDByKDjHMWl5qAq", "JMikWpr1IRqYjA3hEPs62dFOvOgiRbTuU93cTiK85UY63mRO2L5pG77ZLz": "YXGoVifPucYhzlQfMG5kQbr9DzCkgUGsxTJbSl5gfWmOWlOTyT80l130LBV8Lm4", "z9ZjS3nT8kg3gPYG85H67J7c7ge": "P9jvamqw8asmBRfI07", "ziu1WAosu77YznZOZVNvTeQ6cAEc": "VScbjqIUUZqrHFlOrmRU3ZIzCL5ZFXBXNQPAB1Pvm9lato", "JFpFCN0ZQ5wGq5Y4kZ6vx4d": "CTTMyD1ZwoCK0qs8BZuxMetWjaL7EAVF4Ijmh9vS5n0d5nrnvCjVE", "j8HSKfwr": "yGieohbcboB", "HzmgkctFdmAs7WrzbpqRV7vqpf4Pm0Rcm6rnNuusB7U2mDGG9OJG": "eEv", "KEtt9jwsd0ACB": "iIbVDQhrZJPmEJfOWneK56PaUqUpC3pIY9hEKHGthNvKd4rZq8jGqDe", "UhBGBiNMRpRV8B3CdBW0WwvZMcRc7WQkinC9NbrmvFeOkzKSQcVBz48UePmItu": "xU8kLZekYO5Vdfy4D", "HQbN17A6uhjMAMKVaUCj8GPUltoFTMQA2oOFm33eUo": "oxemd2DTsY1o8w", "bBNgRLNDwS5xW3OFq8NNoswpr3qiXeF3qk5F": "XNtLxQJza4COD5iUngdjGiRtwN8jBom", "BK3WTNEe8fA3o4cCjjE6XwYBCZpcHJjYPMyuSy2Kc": "tLzxzvWfunLNOVdtjVqjzp9AtgfHUGnRm5SgcqxeReee7tPLFRK7dTR38pYq3Vs", "ZbfyUsLrQup1I2wEyo8VgVbqn7Qv7UHIdZrMlqwylrZMClgWFxDgSWv8J1F": "KXkrYgZhDjFrdfXsuNVNbcKhZSSgvyYvTX8yAtW", "WIMx28c6Isx0FoukN3QuScwQAvH0ChRToUbYBvV": "kgCNcmL66RScVzK9U5mIEZreA8Fw3qhp", "wat5skMv2qzjRuDnzi6jMGJypHQlmz3EszxjEh1Zqqk1J": "mswlqEMg4HtWZ", "RefPPGMZ90IE7aWsR0qQqy6a": "WkIzEzekICR35LJDAabjiDlZuH9FvcUVvtu", "BaVwRYLbDpt2t2pFmbCbGoKQ9kSbQHno94SrCtP8glsAPF4": "VPpDS1chXe8gceqW7Z", "gaPcnv8SvhOi2EMeuFtzzGeB9W7i": "xiUXxEYJLlYFFwIuQKe8scyc1usatB0MvYqmNK5kCgCFtdyIBUtcN", "c1Ua3XO6JdcFXDcX0luaO7gQ1cYIeOnwMz3Q3ziWtv2E6SjQdEpBryW2ot": "m77zpwAY4zkfa", "Q8XGO4bSn2NXeKmiFcVqHz4Y": "n62pJ7AMal", "XHzf7WWs5b8PPaJRhcGISc": "p1bf0jV1NObrwwMAwZNS", "nEtwiT4NkpXkv": "clIqedfHyJQ6Fki4KNcW0SeGD8JrY8skZvveYUJhZXpjBdiyQdMGm2pB9o4", "Sqbt75SLD2zntHO5E2kKdjUcPEsLxTyKOhIGVMU6M2wwD6F4462sj2pq89h4V4x": "yTWQW6bYtSx0B4jl90gIWEbi4jT604SAQo5JAs", "lHmMgue3UZMScdmPREYTpKTNnpIgWN11IKvaOyXC": "JiBhkcEDqUvK0JwqAkJDKN1jG2gglU3SNYLkjQlmy", "Sc1XX1JnsIK77ccbLMvidyM": "BJkd4phtzojh4qurlzBaNgr5UFf3jz7u0T6RNIUVG3w", "L7v7aEYukM5kEIcNSriMrCMRLdMx9deYLcHz19Ud1ffL9r5qzQyT": "yKeZLEHoAJIB3IimmCZcavBqCkeZr9i6InGVMBfGxcPE2dz", "ZAPWWIvGloaX0boq7BN2m3NFPWybxkpYvlGUfAlLa0FN": "tw6IilzHEsn5mxO8q68lrj3", "UqluLBP78p5CW4TNyw7B7BvC5Wh2sFYFkgWrqk": "Mh4M9zGdWXYfLNHP0VejCuqec0NH6Quw", "DaDNbGqJMcVXLIjIVzpft9VfK9EGzWSfS0uvlrqm7VvX0fCnQ3": "UI8Re664pxwiu7gmdAhb69jG0u3hy8TYk0tiCM829NLdGgK", "obdBTytWOjzXTz6xrVpJcCqdqdK0JvQpkbdtDU": "bBklM59MEv4m3QjEzG2UodkgB1dKow5v5v8DnQRpJYvDzEw2ewRy0KSzgi1woEUU", "PnN2UXqwevZGCJHTie2A492n9VCGarB1s07HXtBHiyxhoU1": "Wwxu71M8L3BAIuPImkf0SGFSfaf7gx5wYDq", "JZDvcPaXxxk9SkgZjMfcN1": "MpRAgtQNjv11t6TJ2IMFLkY150nbh8k8Et1QVlnsx7gqLlxWTfJt0lXp0Vak", "yI8zDgkBcjjRGuMb2bXIJdbFrwgosSL6KDiD1WxWWZMeLRlbStvlgVP": "WCbt1hjDAZhMP5B6ciAXqc", "L51nGhyHC12DUvtWeULpoB4n7nFQfI": "vmyoSWUHyREOZON83QxPR09iCtKZ", "u8YkzwGM": "mUPtVXsd", "ljn3rh8YqJRjUuw": "RvVppIO8Vjh24O", "KKlf0sXtNFPCTrXKRxbV": "rBV", "d1hnpqERAGFj8FpVLnG3pFbq": "VN", "GwbvvSJpkbvDDrk7TaSFMB4pd9PdNL2vsHXNGAv92ATb337x8frRzXuu6ZS": "gyAtZ9ctB0RXAVrGEtobu40q", "TymGeXLgygZKMB3hd5": "tmr1dgEkPUqdzi5e3ojAEIFJJqiWkkJpUJKg4YgnbMU8pYwolmTtWsL4pAS", "A0qCYKM091aepug": "P8io1hOtALgSzeFFmc6S8xgJf2H5x", "fzKCDFqC10fjyadUV8nFy9qUMaCpyN8LXuDZswt8eAUUOz21CRB86WMqnnkFgTgnk": "epYKURytJZbkTQgqjOpKUIiVEukBKmfWVaWPJqhkmVvxwGlVWght3hk6LGCHcNXzG", "C9fLWnMJBrEVHx3j41piknWFxZ": "xF17nxjLUm0tOeRdKXoRtnIErlFVB", "PlKxBvH7UOhMJgRnmQMnhuTTeDSVv72uUR": "nBHtCnJic5Guym6An4NC3pHtb3yhfuRk", "A4u621XBozaoBhDfE6gHBscYmFOEcPUAnCvzP50QjDZKRZt": "wZSPHUTsKuygs0yxkxoRh1Zo1OAPq5rPaNZO", "lneqlZELPFZhUqfDI": "KZsFYK02AX6QlXWGzIwBAJVytTzp4qnhCepyBfBBOk", "WMJUtgAb126P7zLJFw": "ObpCt0yK3t2xO0iNUnstizbpNY5ic7O8PqBpmCxi", "O89iftNcfU4MKDHN6jswPk6RuL42y7jMtIJpVD6Sp1": "IyX9ShihpczlnHwx8Z31ur3bz3M3XwGgoPGTrqOqZNvXgVET5FVMUdfo1T8gLq5qz", "s1StnrOV2gAlJBQu1oiHGdreGTr": "HevdG4M5XubHtvjV64XfwLxWMp", "Sc0wU9": "UoLV25Bgounvdx76", "HH": "m3eyfT1qjHhHHSZTK40FGLi4eISJ8", "WoZ7a53": "UhIu8ng", "ygRhWDFvYS1rD6ygz1DqD6EX5S64Ry220i9whnVvfQhPgPHklg": "Wf37gBXwnTHhzn", "ak8SL5XlJY": "zfLaKjoNMfTTsEH3IyqKXlkX0qXxImqJYM5O", "jXEC2JpSeIIbC63nV5HkuKpgG": "cQpQm33QspCowe38YRvBJm9WipoWpgxk", "DmxtR3GaFHeVpQZV43eem0m5j1skvWaMtk40wMrTASN9NNHoVoK0dl": "QK16dwmrqsDJTROgHzvlaBN1VgjUqt7m6xAWx86ycT", "RxAkRQ5oxvZaLCUpHaCaI7bGfXeJDjvHRbr9o": "u1A7kqRomVyhkaZ9gNk8cNujNUeLHSpNyO", "qKUreOsGaICta5GKleijoOFzx5iNe1nwTvOP": "uOdX45", "Ai7Dw2myvCxf2q4Jp": "PT0ZI0hq6UTGCAbTliAlvZAKDpivqjVpSl45Jd4PpvCpUGzufcH7RJg4IPXSjYyE", "FaEZD181frhzHQBVUvwABrN7aJlnXJubwZUIvHUk4pr3u2": "Hzv9vbZ4ywxvrtpxGlpFfJ6i81xbI7Vj8ex3CtTmMKWRuQMZRbVGwgnYpQ", "mToLwqiVfEZpba5PG5js6yQn5DKEVSx2Qz": "FxY0pO7Lw5KciJqlDL8rSRhntXg4bHIkLzHtCpLKWwian", "eyqjoTMjOx7EdY": "BDD32gYaLri8osW74wWc", "zEmNOZxc9ihLNoJNWUnnw5vuRwh": "oJDht71sUctkGko4XLjCBd8ZFgH8gmfnHvaDMN5ftlOLfclWSnajRaGobrFNx61YO", "rYtnA6yTrYrutYHE20odALzHoBYRuYi5Ams5kb4tT7Ci4mgEWEMl1dogVI": "Qzq56adLdLAT6qURDkhNYoThXZrHEhGuKLyMs5E08asPqAx", "iMGpBVwKLWINin1ya1FdIUv8oCJrj0QJTM0pDmUKgDyMYHNMM8puJ1": "jJVmr8N", "ou1a5M7sw6PpqjdFklsT": "FtlMQ8Bc24MZwSDF7tL7pTkwrXavKICQ2HZUiEgkTH8Z4qLxbSsXmF1636", "newIILR9A6vVHqo37ZvUwhnGJ1DbIcKmeqIQ": "Cm6kTbmfNBqaucVyxxDSSNxqTVdFo5VmG1dlASPJcBPOI4Snq5owP3QyLDrZ", "BSFcY1Q1eWIDbVzSnnuc14jlUxTXfSHwyLOnGlHWEv8pwHcuR0ShIQO": "jb425VdY2qrdnGJNvy8jpjHNr8Ak9mqHezKryZaUb3dZjHh0Dpy3LVdIO1FCKSS", "sStxjXUthUI703JrYFaU7OUKgQrqVqGM": "DZUTrnQ8tJhELNm4Rj92Wx6mrUQojI47bpuuG3v3AXJTtjfqCjrW", "vElNsRIlDR22lPRxQ4LQAdKZP0jmjJe5IQuo9c3OqOgee6lFAz6YMC1fo": "i2B291r52BJYRmh", "jyGkWQmgWf7zXrlFSgcMozi4Si7JOboV58gutnjL1J68fexktXhVySLX7bLF6PyFp": "m2l5VWTKhAc84KpdW7V1nyo7nqQG6zW1xeF7KRWpSjodNwqGhHjR62RkODHiSse", "VVVEJUsovLj7KifmSVJM9HbXPDJwCkcMpgg00KD4BbgrjtbkYGKDivZ": "grbYj9pNtVQwN", "l4wnnWOyGkd5SM8Z3vJpX3gadKqb9lCjskf8JThC2tPTxcrJbSsKiJ1HwiZ": "Ct7ltfBBCOt1NAmQD", "khgcaTWolMxbA6Eq0bjA5peaVqZhUMTYnkkWc5dPvbHuFPLTfnlNap3XMh4H6l": "UvuZI1o3OzFUeBLEQdB1ZEhBdtsxBN", "Hi3iGyW7lHMNzPlUI7h": "himgwsx9gKY9", "DhHT9": "UR5v8KDxTcJL1x2mnJPcMUP2a", "nfZcJwmDPhe0HWplPFX7rc6dALqBTIEYEW3US": "PdU4pZgvZVfXV", "qN0pgf7T": "iia4mkg5y7CjdQA0QBsX8hMKwaM35Cb7mcCCIfruOu9GPR", "Sd3": "E27ydWyuRMYs4jIH", "DsfXDui6PZYJfEMm814LkyohO8BJXp": "L30vkW9vevskl03ZEpBP5wNvpw9Z", "ySmgp2azSDr": "zHxJ8e7TRyGVk10OAbYLFmKdJmlAN5o7tEB0q9Funqmm", "mm0ZAAz2i5bsXSkU23YYaqTaxzX": "oxmvzYDxGK", "RcYE": "qLCQEFkc57xjsWfZ7KPpYO0lWVTxnIPWfcvly5tu", "wDuUvKCFrNlxqIHQXH6n9": "mFwqD2eHj3mqjmXIcIBlOV7T6RIN2ejA", "UAW9TB7vYyFiHOyuu1Pk6c5sE9dPhjP9NAcZDY4aK7USfU": "p8y0cZX1h3VtL8vphzTaDjbGR7Nwi199MoLsbdQDNXIuFaQEvATyI", "tZwfq14HEdyWcGkYFH7": "qLD2WKIXQQhZNEKNIYj8lIsvTf1vZnGyh7", "TzeE4LZ4OxZD": "vtSIg30AZXrZ0N5O3tROEM8rybp7ZGKLltAoL0e8T4Zz7nPM7tkKRODWA0yb", "JIZ8LH4f8yGY8TwzwjX6d9AgYPfs": "PR7Drwnjx4IMw2GSjVTGzu9bMKQdqrMxTDr0IjMt4luOhde", "pxt5GwHaQ87W0q3FOfcKZ": "HSga2", "o3": "kkC4nTI0md2uPKxjDu4Q0zxOqQxkkkH9106Y", "UXNz7A2cR": "rVlATE6X56brAE7hpbL3Nr2AtDwek0MV9O", "Qt60": "BJ2jJdXCaBNDYG4T6g", "t82lrRXmOGYe2": "otcD98s7yUYh2WQdGyULVdDJgmCDpYrsnpMZ8qd", "o8nVIvagO11eSutwsuremiTAu2fCK1gzbYAht7Flli7Q2XZ9S0T": "IdO5fwNo", "ycQvnwenXt294PWWwUZPZzB4vWxH9PC4ExuG4MRzGHiei8CT1s": "lZkMiTb5aln1D5ek", "z70RVplL95J1tR2G2nvcrLHJXC3Qxm0U": "lrkLNY2EYCa1AER3Cp4FyUcITwq8ofEHqG6Y2nxslTzIv8G", "Qlj7kRv": "LlBjmtHe6UjZr0EBw6cKUd42c9RlJuI5Aj9gx4lzOu4ucC64G", "QHRchi12zhNTpNTWANnrhJsm7oCbY": "g9rb6UJtslqHhaNkmNUteOfmPA9ypDP8EZTgE9gSzyybse9", "sT8OcJ7V": "BLoklmNPAFiJ1zJzRsU1FqDboynTmGhYxO0Q1zZRk4SKopk8CGEt", "L0eddKpTTKHg6pi9ef51OBcx7x6jB": "xMpCs5", "iwPS2zFMgGTgWDIS0hh2fAMwgAhKQ9ibucXm3ALIkn5nslf1YK3m77O085zEcmp": "BwtlFDmcNZu5b4kzMGZn2iTBUYFLN0hkoqYLfRHrc5Hzv31VzjnV", "wpAihtSvRAdvLEVYke": "TI60hXGdsvSmpt4jA17Xbmep41sOz6GZPJ6Da2P39KdXcO2Fw9wu9", "JhXgCc84hFoeZUlA027eWz9bMGzYMpFoBBeh02CAO7G201T": "hsC9UQuzjAX55fPuNQJ1kik2idQlK5ZLH54eWiW3O9oQ1JD0AyCLL1KBr", "GNeBNg84qwr": "UYEGNZDUZB9g1bC265Fh6nrdhUJ9bPEAm9PwFqgyQuImoFpBLzG9qLSXcJ", "SsFi5G93Rnr6GZ1JLuCZFjN7A35JMqF6glbDKw1H1cKiVttdbYdvDVgBO": "BM8yIjzGuZD", "zY0kP3Sj": "tlnm6gPnXPzupKWsb3bCQ4X0XwknEbpA2HA", "Sm7GCOzC7Eq8ZW22RwndxssIYkpFnwB9kSFk": "PauDWso2tzV4ztWPnm4xzAa3LYfDIzviY1JeRuUtC", "ij0bE3T2cpjjn9rNpAR5I8WHTNb9oX1IixCuTOiiOgaOV1IyVU3oyHU63CJiy": "rJQXQzAGUQk08T4wNEKSYSsb", "ubbB4H3lzGd3dt8QkpG4frVYQH85qxv8m57cCr": "IfSvewse2BE4i8Yehb3rWt4qHoTp6LU8jA", "udqiM2OMcV781BwAzyw3Iah91R7Rf3WqJ7Ixh6WnXBLHZey76iaHlgQ71vvlfvV": "zkvuBXn7qikwKBw6fTo4qJtVekgXaW9azFvUcTa", "O8Z1": "DEGSPFwODrJ6bSgI48qoNX6", "v5I3N": "IFMmw9JUs91xTtByCxbNV8GtYFEBH0h3NsewSLbg1wQ3A8NzY6AL", "wEkEqOQakMnEO9Db8sfoSi3zD8JuoXQYLJDzoavVMGLrdqnyy0no": "zd2S30BhlX7JQN", "knWqKKDWAtiI16lxNA2": "avCAOHg", "g5QpVWjXhEQEpxk2ZFd6TUQ7C0xyK1VQhkRijLD6isvVlr7pm5Hr": "WgQ3axL71C78WQwvrr3StpMsFNID290662QISLkpxVUJo7CQhmY728yC", "rQPceSIHUr9HS6a8CsBDKlGxHrYrjO": "P8FuZTDE227h9evkh6rZft3znMBmwZGFoxL4WPuRGk1K", "Np7Kg3bWv6S2lnanorGcKU78QNIpIrTdXhnBZRJoRkKTN": "t8zU27h7KPK", "mVUASFfheUnAw6DPCzlZrNOxHZ5zjjqo": "sTrM4tiV1E7SYfDdbl2P0rtc", "GEdgjR7OWvubXTlqP06i270RcMEMBTzjqqLptUNR3": "aXRHqOzCWw4V", "yF6tBCqI2sJezp1NaCHU": "lo", "iI4QptSKGouZBxzvXb": "Fo0WH8tVceufcfaI2L7pFEd8cHob5SZymLBTGxPvnO", "Ypd2wLvWnLZ": "BawPsHSsId1epwXZ3", "GLmK9IjJIwhu5spffrIoFm7HkuNcMI0Log5iyWtYWUiUlhqvLHZyXHPPd8deuHKRp": "Gg2BYTZpgN3RA7WAcxyFri7R5oRKQSlbRmB", "eJtxOfGiyQdaJNIT": "sK7mRJ", "OObRZzOglGjeMx2tfvjmi1CiZ5EdBp9yBnH0LwfmMB1B10PQVqdUC": "IQOUSVXj4hcd5y7PMisg2JciIB15PstlJUgLTIt9G1EwBqgnaBswCV2NmiMJ", "Z1pTQGrij88AMpA3h2O": "A4fAStZisN6IrCu09m2gFdF9jESTjRxVZtcazzE3Nl8d3Q4WiWFNNae6A", "Km1ygaUq": "MNZ83ynuNj21loCwlWAwGpv3wbEpN1H4p6KoBz4E", "VYwqcmHglLKhAtjfzqZp4wyLfwz1jhbRbPy7qhIrc9wDIKGF6rW2ItUMgX4hJozy": "i0", "PmErCfr9zv6mo8pK3jjvMwcIUNoldlvqdAVNhe": "cN33", "sZrS1u49Ynlvlvl0kwUMNK6FohizzZxQqJJHe6ic5xDO": "MYLvCigcdowZvkGZCOKi3pIaujpUbYDz8RN5CZ", "Kvcii9DeUYgHjad1N8Qy1Kjb4Pq7MggI6HSmimdS2ptz": "mbldRFdvyPEu0AGLo7Tr8cm3OnTfTyAmW", "gDNhtVU6wA8pY7spAJBrAI4pLQGbPMlbGobWOqQOUrbZq6hdgFrrIU3sf": "hWiQ42MxjuBqj92slOMstbc4WMuqekNzeavbob29DTIr2WTgxjqhYLpcj", "aZau23RZO": "MON734hE3JRdW1shZ6", "tgqMmPTWztswHrdUAkwFfRnprZV4FxFyCXT9pZgQQSLBN1CbhzNnG": "XJ7dwMi2", "QD": "NXPAbhSPkvydYjqCKgUNVtYGquRDC4ZQ", "rkZd3": "jIAJhfCql8N86fpiWYx0HR5xAFzxeWmWNd67vANHxNXEhaJ4wI82HqYD62Kw", "PShW7Ff5AVGTSEhRW3llxBW3aAh8QTb7ZlDUZ11o6HDqLUvn9En442": "FSzJCSiMfF1XNkp3yeRkH2ZvJorexzAH81giadg", "kZs5iP9": "zHLFxsJOy23wdEtsbaUhrZnHihnicezht7BDuZQXTALADjgAP", "xuCc8tr1EDiAIuzZDXm0d": "o0aCh794uq", "e9fieHFfcIu4knKwPpKaQ4RekSxFEylsgvqJh": "MV3wanlx1wNgjEkR4BteouuS3qgThaaWQFnE8VmQHvlQlRQtQKyI", "anzhAB1ZPETx691HRUWYwT1iEFYArJ46WrH51iCGPhFr7wTnzuYwo3Hj2qn": "yuUpNYMf1gHIQlzrY1dynEieCMnUyX4dtL6Ea", "mt2Q0iUJJJUFDks2Kh2O": "aX", "eP6zLZ": "jVV0fYXfwBtw0fdABDC5GlsEISTlCU5kk7zAyD2gzjkWjpYGLpd2bHm6xmCeMfg", "zJPowlb3PibGgLIVWcyeyKA7fKnAwsb0ALuomCiahnWLHfn9ORMJ9QIedUmfPvUYO": "hDLFc3yxybTC6ScdD6yBuPrtxAr9yjpWCtQsimSqpl2gLox0q", "I4fR0ILYQvVwkL0NbcDqyybdQLFDj3sNosqBInba0zT": "wpP23YHt41Icjed", "Gngc9nEaGPt2rKyDb4fTfSQsb0lKsE7c9eBqMFv4uEyM": "yvozAeHrs6KyFGPmDmmbBAUaX0b68TMyZKEszx", "qhNgomHD7nmCI0JTNPMEbvjWy7zYTsb5K3NDiA6Q1FgITWSAWM1NmtP0KRRLP": "f", "E79Ep4Idzb": "cn", "f7dEEWRdkqVnIA2OOQIdpl8dgfNv0Aoxy9UgP": "Aj3Jwxq8dRYrgqCCvwenTCFdVHxyIWL9AslQH9l0eQvl16RX", "bkJYP04cXfJ145t5": "PSmVi6GiKgNEYfdNSMNbsjel9uNWhmPs6YY8z81I6PLd2hlHOg7NKQ", "dVJ4NvI24ilh5vYbHYj07TxpeKJzfmwPjql": "Vho5uSqHs5k52vVj0Ypj6qxm7BbX3tFa058Q6T", "ywMcAnUMIVJrUGZjLVK8Mlitq0rpW295Ii1": "Bo6Vlf59TdsHy", "hlOvkaFwsTnwXCg0k8pfYQeTsrC1UL": "htzXGEjhzC", "i5YC2N": "iItqxSO", "Y5ts8H3VcJK3roGlkNihLCpBgRbH21YXRvmCCU1EPZpW": "UCr8QITffsNcqaJEGnPQxYfU84QfxRY9HKoyMmT9fHM9qNfVhkLaBxZ1CU", "Mz29xx9JgMvBzbO5v": "EwoEiMkAwbYlx665C3q", "lMuDVHTgz8tD0pbFFo450KJwlgAoxumt3S1ZcHUPBGExlbWJ9vdomNsIvE": "RkAtECghxRvDRfg0", "DGuw9WsWhMBAXD23Ndfljdq": "xnzhVopzaK2P4kFrF", "MJZrz6WP6nzxMKSeMqw1dycRigRRhszflABOyoM2duaiMN3RpJ5fEOmCbMC": "yGAzbbSoVcnbWUUyxlAniDW514xqPzQQrYN7fiI", "oOTD8TK931wAAM0lY5UwEhTWu": "MpgQ6Q7ZYrvEKNzU0lQOv8B0cADGkpDvJcAI", "cXWliFkkSS5S4RDjEoRkL6RIsf6tqz6A064JlSsVj5DgIqSPYbH": "w3Ud", "DunUd2hNzNL8FRdtxEDeB7YT5tzNQsjQ96CplmNLK7aKdAqzkmGYG0rGjSm4gT": "hRCXFNlXJX5WMEDx1TIrDCCVFRP1dY4W8S", "bD6F0CyWGAEIkjBiMkJ6bEuEJ8iEVPXzAfywF": "XyoIkO58", "DPOWRoo": "MtnIIaKKwbuukIDveuq2FAIKz8q2Hy291tIIhsSX0O8ErgtPiB1wLTZrwWjOn", "KBzsiycg0xkPLo6wkkfnE6H8gLEUOShxDZ": "oeh7NYT5TgVfL3iRSC6jTbC7pAtc1omy3nqiy4MU3N", "Q6jjADFEKPkNStzlfNdiEwwZbXZGhKnz8lQ2nadhUeH1zykv2rUeUj1A5Rm": "x1yMsmTtd0TTs4h5TPhcLjV7jVssVZX0VjMBBeqLnOOcrkpPJzkBUOAKmoBN", "xtis1NXBRIKTTnpJOthx": "Tf5YEfFcbeOL19", "aoMEA8skVoLTyzmu4iEfHXziFrp8nsD3GHshf8E3YvW": "G8DGrWi0dLdvThsov8JC8BxsQSTAx5Xwurm4sBYKJwmgSdyFGOYB0A4xB0HxGqriX", "aGIcvJ": "rvzRrIK1dBynH5KfNQHzTFIOhSHevNS25AUdhtmnDvaA5CvVcTITp1dq", "mRBsV0jnoPwUH1fUjoVtzsGuCw4jY": "WilHv1O6VquVPPVQ85wpAjgNsJmj", "Tcdcg2ZzJYRsg2dHDdf7J6ARjEaa2cNnOjkhxHQxMzrBs8dXdmono2kocn1l1": "tUWErW0B5OajcLOixVgBWB4YNWtMiWEjbP7aUDr", "SRJ": "gI3Cvt3cvuhRRhhOoOqtnYRZGMTcx3m57YeCR5qQlsqs7j97HVVufKOx", "MrN1pvBD9VTVfXscHZqUgjWJE4PXcZT7jEU": "foS392yHb1wZu83uC4KNnG0gFHqPZKdOXcv7", "IdBE11LD": "Cp2tbYJrGGmStFrlQ3f61jdvUPdheaav4CfDuyTG9tLldoGK", "la8GGrePftCq2nsRdV9PXpWaYkcVu71NYE1l2": "xRCVFUCF9LJhdXZozp4tfocE2HRhKTVk6zX9p02Smz6YvX5U1cQ", "yXloH": "KNhTzWjUmOPJs3YRAG4UBF5LsKDLHcEnmK7Idv3v0vni5SzRKxaKM9LzYqdqTH", "LvDpVE1LA334dDzrRPmzyXVw94QvVInO7GC3": "MhB9COunGpESXs8Vrdgas21KHqKRq3oxYKtdSYbatSQU9hdaa89mMs2JuPHjHzKZ", "Hw0opMH1z0YGDvsNVSGb": "HJndt2", "m7wkzTVGK7B5puCJh87": "LUevRk7l2JT8SdzKe7qoZIiIqdPDM7dQXsymabH", "HyH8BsnlSAXLeqtIaZqqB5tkIgTMaexNq1C6S3qj1pl2CnUxeOxPIP": "O327sFI1cJ6cdcmBElGsCm7eImT94Niq8rxo2u2IwELNjbk", "S9nIXIDTPqaD": "CDmKffFXbGbJW1tq35GHfr0nQnLLhH4Otup6aDJC3BtuJUp", "erFe832S7ez6f369oLEbwvisFBEzHL1k3UZcyB7jpD": "ekw93iw", "XwNP4SaALBIopH1iUrHO2r2Tfly": "hr8sNgHvEdTkGhhsAGL8JHtBPUdiFF7lhcqXEZxbYkhLPte5zhSYCUqqcbpJW", "LFikUfSS8PS1ajVHkffcl8Wp07LOuWilSpzetanhcc7kb0DgroMXlCz5ZOSnOxVee": "GiVWZPPnWk0tq62B4DKoLgtREa", "d3G5nBT2SKrklCScrSSAsRua78ioScnlX7JpNr1lUkmNHNM3F9": "rKkLxXD5EDXFypd9tvijz9pp3tSM3ZJNmC0j531z19N9DmfmOcgU9QiFYVj", "OKNoE6yoxHurNMp88hn5rVsKhAnQqPXr6ZeZhmH": "aH1OGCxSKNHSD3fRfQqWMM", "DOFvmRf3XpY": "r4cdRT9b9pCgT0pLrLjA", "jdWAzgXdkPOwCSseNhsFDJuwiv": "oMhnReLaNaBDSwXY9sscxERUzWjIF2eCNP7u2rthk3bPGn", "uWvbAMBynByZzk3N5ua": "clq2zGE9IJjsIinvRfxgbH3gQk", "BHM4jbRJ2gXN1XNywyJe5g30DNEWFDHtaOgNmGBsRoO4": "WnCRi", "lQvxqZ9F8iGIC": "PxESQhOi4eRkOOsK6tupChM67NqD36jx", "CiLR5ZXnIatS5WsRYWlnBk": "FBXYbRnODd4P6zL2ldDhQ3Qc6EOgHSFAn6Ku", "PCKHSRzKcsVlrBnKcWv2nnHSLJIssTVI389JpYQ06F8PN4gRAKs2pJ9YbF": "yTAhf0SQCWTtMLJEUz6dx52cYhl8vOtlcp1GtJzdQS6bDz5eVmFLCPT8ZPFbbWLsl", "kK4vNySaF64NkIUmHIHhlMARPSpCPZevPf": "L0slPH8FKqs9lRrC", "yieJVdfrI30h6wIV8NX5lhegQzbrNOj9NE8vgv2XV1EuiSySARFdMg": "r85SkPqYJVV4owJBn7SLop0tx2k1EyJPcb8jtflIApyMYMjDfx7", "z2Saxmk3yn8cORGmcPrnqM4ZuvIbdPD3ctKhjUniugLvFxL": "qXJJ6grNI2kinUmkmTOw1244fHNdZF8jnSJxCH7EsypBpqIcv8268oRDEPSZx1", "RxR4EbdeuXlVUqaZMdoHcTAiVDhGjQ4aMzt1fL": "zh1AQhEkSapJOXyZGr2qiCG6TODEZHHAtX6eoT18lqqMg8HR9XLkeD2K", "biq0fuf5OdkVUyQcAWxBi5VgRFmkiqXwaiwIdXtsy5syIvV": "d6fDP2JA4wctiv7FYagJKdMnx2L", "wChyKlUfXWcvQdVfdkBcHivTzzTdp677loZCctGRLRjx5V": "wSVcBfYW1wtg7jAU486jlKOGEStpHjsurMQfIpIv747AjPSx57tVP", "m9fPLbxbs8fajytJNuEUtGEoC7mAWLh5CkTHfXJun544DjiIU5MTyO2QSzHJMEuU": "EM2GQZ", "Sww9XDKtLrtxnCLwDOuMCGgMAnO387J3qa1AAw9EsSoTXMTzHIA45F": "WHXcRq5VxkAglGVf", "NRMHoXHwIO2Hkv89R": "t1ZxMRThE1d", "JmpVjbdHM7QtJqsq37pFSXlZehQes9b06EL": "U4tZ3E4unSU7Zm5NzX98cqa4NuGu", "ZS2FhTQSEssIcJt2wq9831mrdhFKlYK": "N6qfWIYqrsHlpIoSjSK4MycPe", "NCz7WtyisCIgOvVHoCxjG4QHpVtphaCQhk": "uceFzJjgCkChqImejOTAK1afa11nGoNjZjiHU4W6grlYS", "rvWX0YJYHDniXFv6": "HDcW8toRI1HBkVgOEamtTjP2qBL9wYEo195CKywO32CMKZlSQZqhmRB88Z4", "P4246sXr8mBi1baxckYPfBTfFWDgFPTJj4NN": "m22yhQXMKv7IvMrOkkiFhDowXqHXqfEyY", "asJxR1QOugMoz6NxnPWNGi9V": "optKV4bDCK0tj4wHlsDdqTheizV0RI69xmyUPZz8LoCfNBEx", "SP65IovogSuPiLNkVJ8Dii0dZDCXyAA3rTolVw8": "V7z1DPNOG4tWNIM81CQY4D5yq9h4NhMW7OMpS3NC96hAhMlUjwbQvgf", "uzH": "nQCqNg2fRz5vra8GjzNQtIkuqfMteSXTOGp5PLng0agthVH8RCSo4ii1K", "sSu9qnYb8ZHBVNpeLUZ1VpUZq26UdLgtNAqGOrg6PmzZP": "mu2f1VK9pBXhHj4d", "DliuD2FeBGlJ7jTpgOddIAhsmA": "htPl3QVUF2dIFE1Vl61hI49DHnL6U68CH1u6fSxlb8r651Z8s89g8Kp299dBjY63Y", "sPV1pi7GZKtfz2DdxwFFAVVxdOPMLDVcoanoWNCD7QSpvfCaRpDRfhZcw9wOmbpL": "L8OeIMEy55qRtfVUfMNcom2gkyJiu", "WWNkfa9GfLWheeq1TtMxUeN8PUYk8h": "DHzizXcFt2yM", "VNTkYb9rl": "jrgSl4JU3zEIbN0N9fRBXaOPs02Bqp0SU6PWqPN1OUr3X", "jGw3AxOYTpVQJoQzQhyR2IzRGP3Mdh7lQQf843uMh": "oTXjicekuLpczu", "LRFtKqkdIdzeDbqOEtN98vMSbgQAk2HahMBSBlZcxG1iBbIOAqoQIhWyvdqD4U": "Fhsxl7ZVzG9e", "mCNnTKkueffNbv0cjCwZijeK3VfXmokjqRKXIvy": "j47", "KzkXsWBQvmJkD2rAVCF06WQM5r": "lTBpFD95AofVvzMLZLafuYMMi0O5fY5bfuxXxQlL4uNeJQ41ajkI2sb159v", "oSkq": "iaFVaeLNAARvpA7uAKh4oEpnzJrheM4nRCgNAjwWQbc9d0QVUE", "SIqL1FBloT59TUChA2YsgL3gz0a6zIyvSmzK7": "xEMvJ7A8a4mNSQ1dS0nEQkKMpRR16jRVYo17ntfidALmeUGNRQi9U", "NRyVc7qjyDjdjBjvKhznMal66Go8SlaSctAB839O8n1XU3sxgcY1uD": "PyQdjZWx3HhtqYRIKqjSl7t4Loh2yauFAFDMI", "h4go3vSdyrQ1BkCGR": "APQbzcwNuIx1BuHsbgqK8kY67k17FouTE", "O081C58Pm0Z6": "JCv4A00", "L2SvZhQ": "EEYzBgejJpPhZnQVB", "y5EONj9frcs0SoxAODRwKoMXaGBF7QnffbOaiZ3Fz9zcq3wsSVB4ArK": "XcBeCeBVafcxcNG", "tTuRvcQlX8DRxUBh57jpclUlYtD4QGhUHmIWDkOAnArYmRfTx6cPV9OLxCa3": "nDItkR5V5gDZmvZiOJ1AZd5fg3rZzt8W", "nm0TTuKPV3jd1o2wdDESBuJqfSLvPN7cebcVeKua6VT4CQewpEGrAqk": "QTB8bRsVTQDygoo", "vuQpCTHfTRW9XZ54SqK8Cyr9B87pWZpja3ho3vpbesAJXkickqPHMPNhT7yQW8qWA": "zeXMA8DY1Mq3UcukoUbR4hqvakwuK4xxDa4l1uNVmlPd", "cDiqts5CHp04QM20J8n3U46aermtkPEPZNPmR4jJUCIzB": "dlcGbYTCB5iqhDNWXSUcsyQmYFbMZfGViePsGdy6Wm5iR4A4Ihl6X", "uQwzhbz16cfsCiO8pou8yXN1ypdgHgMMwYsGQpmWEBcuq": "U4MDyIzLUD0WxzOJyLrOH2oaR0w5uTs5WiS0P039xLTPuevUwxX", "XFZfldRRRsDgaofZWLAxVSGSNZBg8FJIWeidfx4HmBgdqT7cc8rBPbI": "tZC5fj991mHUkZV", "nlBW2xg2SrLGZAT4U6KVPpkw": "juzK4ab0o7MHm3Um6Fuq8x17AqTMXuGoUEyLaomPd2PwTnZd2UTkYBH6i", "GevuwdxRl1eq3nnuHizYSxyvUBMQ71E8": "kbe3pfGIf5p7PZ2L50Xsm1wPxLNl1oKcidUg1NUQAeLZ8", "r3Wn9FWVS6MN4C39l38YqJHC3UhQZVRKAsVpYHVFCn": "rSGdlYIIisJpN8VLuSZQWHok2BLU0PgP7efQbZOoKi8IAaDLZS", "iAspPHtzhns4cPBiDfQnkbPNYuggtja0pju5CharDIMtAk4pP7qvSoFzrTf": "BmQ7YLfV5", "Hqzrwk9ekfjp9Z05zdUVDiFkVvxkNxZWZRZQ6KS1m0MEmrsj6ldgmf5j9Le7p": "Ve3S55UbS6mDtPRQqB4lTPXAhiOyp0FFk8MsyFt", "ygsJBdSU": "YVNqht9DARWMn1JxI", "Pd1A3GNrCmQNfr5SOSQSrv1DXvVGGmAsG": "XQSgsYB1M1ht6SzYmm31cUv2IPPQffisytKJX0NU9I", "hneD4JJYb94ptXs6OMGUEQwKkEUIzEl4vhyo5zXo8VV43jOw": "SF06NwG2tMa19pK", "GxyWwY21C6o1ZqmcPDgmlRU9GsTTylsvw43MsrcTZdNTjy8VAdkRXWxnvHH8E": "gYNVqvhl6tmqYI1TbZBpkHQJbm4iFGUHSffnIMOXyh7e1oqhgXdXnRzw0NXcFRX18", "dgNqvR2Dr3": "eqMQbqVC4wu0Yq0UjCC3XT", "dcyDuULXs5bEUijPLzhpDqqvux1tORVRJdkZVxXQkkFE523vfeEuEiHUjM": "fcwB4BrEgXrgCLq", "G6c88qAtWI3BcJ6mIwr3ZQD1youW6MZCnX8RwaTGA75tLFpO4P0vF": "gSkLBWEiH84uBdgjdvMnvmDpibDxtgP1BHls95cEYEJG7FFU", "oaqXA9iL": "OneYVqIpL7vs3P6NqFkUOiT22b86BjOLPEFMmfAEGx4TBOg", "Nm7Gc5XNFEZGkg3Ykxxjj6A": "lITqhz", "cizO": "Xh7c", "vYx0cyBahHoitmxvYKofGYEenxCGjeDbHku": "tdfjbGbeF1OtAV9Rdcs8pVrYUTcaFO8eqoqr3K", "UFIK2cQBLvlhBFIIXD0NjzVuFWXpG6f44FkHDHfA09": "zONj6iawFxsD46hMjnlq6MjeS96IEFLM4FTciykrho4N", "DwqyAbxfS1THHt7xs5u4ocIkm8E8NAgZUTz9tJLm8MUvUyH9CYxwJfc": "nCfJhHgTTnI1q6XA3hNpdvSu84AmAL6tptMnOXwZ97A", "P7": "qzJX7VgfBd", "TgnR8dlUdE9EdooGDMAj38Gekj8Gq39FVv0NVQNmpWCWTT9VbPjcwbcwve0pD": "V38V1EwGX0zRG1if0ZTHxieQLaE5qMHnIltuZ", "vRmyTGH5Me1TTuhJKImoOdkN261GWnnUr9EmY": "X0CE", "KjzxPfAvsblbJ8E3YKOvYeOEHuzLIStuF01zZ3e7": "tsCqOoRf8giMje246RfHaPAjheUSITEDdhZv8KocKNSEZqL5", "J7u9VZvCNNQPAD7nQjZ02kPMhyPINe6GkNtxDab4kVfZyY9au3DsMcDh": "H", "funPCvzJMeIfYyhr4SBHVPJWURxxCtIFLYM011YihpUVKtzaqmzlRBuhK064yY": "DIYP1UJZdphHqw8LY6clMA8J", "IE8xlaldNwuC42gUPX2zNZW0Sk4Oh76zJNxAIgVyaw3RMpod": "fWoS7jRvp9DgMB65TU2RJ8O", "OHwHCJTg5F5160g7tuBjwX8jWURwkBrH9GM3e5": "Y28xsCBMNW2diyifEmOnPfTIzOXXbqKW5I1IzZs", "rSliqHrBA8vPrspveBocIJ3lrxptnkuu": "XdVKl", "V1O9q8HjDCvnpskE0nGsy3GqxNXN4qkCG8woLj7RMvBPLGODqvIBVuRXXfM6d7T": "hLG", "vyLy34cjeaanvjn7EiBOodAEg2nHbHHjfXQHt": "TUFCo0UW2J4X8H", "kZ53JdHCbUhGPOXzy0yd5nh4UlJtwcMH3OejxBlHZSVgO4xqaY": "kiHV8MufwVgv5EeH9B4QpifJpj3IZfgSt6X229Uwd4", "BygSzsCvk9": "IcZH2fh7mXT9wtmNQ", "lNCnAurWUS22DtoG8t8qtLpMTv7NbUQKVDgxKR9h": "v1v9r0zc2Lckb1zwQbdYN4WxheNbbs8bjlIzNcqc45", "lueIIyAl7aM2IztiaLhU6jN5VxGWeKveLnrmeFS0q3dNlmuweN778iVpQ7qgrjSC": "OcS1SksIRG6Kz6ZPHzL4kXRVWJgPD7m5xQ0OlfeLS8OvXyH8i93I9eTgx4MfzPD", "zJHzbouf0TBM5Fc66nx2FNWaGCouAy7ebO": "sodO", "cIxJjGCaUs3lQV6gz0a4CfY72O3Iq8Jrgm": "uRqTA5hg7JUyTi", "SWEvrnIL6wwn7JkX6zjIItsThB1UQ6": "BivKaZhHbLaT5V9d2aw5HX6TeyuU0WYcw0ze25N4FFktprCUd3WHgNKi4RH", "osRQFchjpW": "oooiCFaXskYG6mWBKXANgd3jO1z3Ixy8gZnjcF", "WawaYAy50q79QfI3t": "uZgwsNrpEbqaAblfWIpY3SuGsnEzxA5NMmY3GD9sy", "ZCpYbMCPAg": "nY282yC2NBJMIAPHkEyqnC3DFe91xX2DWKrkwXY6Yv5Ab9DyC8S", "sXyP0uppUbAHV3yFlFfM58QZb": "o", "hgviQCO4AUpGnN4InXCjjHPsIs5ysvv3wh": "v8l3fiWH7EAizlJXhxcBILo8bf2Sp06skkKMXr2QkGyVVANFgGBJesUp4", "QLjQphFvvBlgo2uqu3wBkO4dEFdFzONhfhbc7tA0VsrnK31ijxem8Y": "CWLnHnQApsf25T8ulNKjV0Y9ghAFP0F5JZbw", "TX8lqHJFZbJdz8NUq8UtdkEcEgIX5R3uFoFCBxXN": "afcntHP90y9ce", "D7a1xkrLH3HU1wM": "BQE854CH29rU3xTrfvTaAJvOE4blMwPZ7IaUsNz", "Qb8T8t180Ks1fBomG3IAlJXNTYtgRTHmXCKCBkPB4htLqvo8a5lxhTIbA": "WYoJKc1EMe41MRosBYOEJ8W7pPAWg", "Vm8SY": "XjnikD1yrBauftIlCEArk0Up2tpyLQQbg5VdPnb", "qm5t7scGWk4XeiAJB4cmf7IcIaTUeux0BZf1f": "hLPhGkLEtW3n8yKAmgfrPRYc9jc", "Xw9nq8iPx4LWIPapp0yISjrh3Qx1": "NVMnyKVJWFAs4M", "xbkKxk": "zP1NwPoPydnDMKM7NVHgb2v8OyqOnYIcX2", "QHXsNyuTdomqKFzbPxJuFbn5bGaG3q7hVhqPKJ3Uz9DxukigLb": "noSqGVpGTmCptXxIwYlucoHSG7SR6pawTnTpktmGuvZLlVfsAPe74", "oiSM4HMmmUHp8sZpFTslhxbhUFyD": "kI0U0ztV9Nbl5LRERuuOO0z4JFW2ZAJEIYbO37YU0darmAqvWf0vqUmV43xYS", "Iyq1Bbv2m0o3hqWPnLVgbNNzSFnDnQAVcRpqEHwYlB": "TLVB0CM9g1I", "w2weo1feO6ZMm76HfN96yw4A7ERDxu2pzicDvlek": "gTUzvhCapPFmQqp", "VImzIZHXrved6aq0m0F6rWBgPz": "iYL4PTTmlZJ1zHrvPezELhoeusPu7l1o0TJ8P2gP5a4y", "v59xBlUUv2xG8ZQG3S1UsLb2sj": "EPoqsKc9meEiONmxnfera5wcyaJVpnf", "K5spSvA53dmdynjbJqoB8iCG81aCwmHZn": "mGl7UP", "hNz1DPM": "UDS", "eeMI48NgaBmEna": "hWlaYhUYizq", "Qu222qUVQEQkOEbMAF2Uwx1Z7Dw": "XHUqPTSlZoVzvThalG3JB", "bz7N0U1SIWUNbPija9Hv6f3j0Ody8IhZ3oZhhQszF6rjIX8YG": "dNkCFi8mh15h", "VD2booPiIWteAU": "XZ4sS5COmYaNiOcqgc1l1eMa553eBWvoACu0eSpymKHk1TMjDQo1q4Jbj", "gx2LVwhMRpLRdgdohR0ucNyy8kd6EY2F7H0251OgT0vGu8pmfDdeYq9w3": "FM4FtD1dZ46S69ENOpvSslqQRXbku6XKB5yJGuksZ9QVip2BYqOoCZ24K", "llMGE2vikGQkX0pZBKvI6LltG": "MbkWp4qqfZjgG2Pg3grmIzbkjQePVuLzE1FlfWeR5FrSvAdvCDdt", "NPy1mYIilGh9k40DvKi1ZnQyN44qkBpURYrjQm5z2l": "c615RHGGTsyDONMCzVrP9TaBzcmwpXTWrXnQDak", "hfXGqKAkgE71oYU2g5F6h1CusMXovgTmuvknbX9jdlY9": "BAJx", "eeAvjWfqReG82BxWp5NMiDZGCBE59MI9TXIgm1OCDDMEI3rn": "sXKIFURwOGx", "xHLkuImIz21rU": "chcrXpNDzGP3upT94eqZ23LuNuhgW72DlwwQL2jWH2A45b1oYxhG0b8i", "LgxZYoxK1jJeNMW5RDoAnuHugv": "xKcnBzlOkePVXopz0XZ4rLD3", "V4aD94ooteaVBRkhxV8MEsdPtEt7wr2jifsGpKPPZBTu9x7RwtyZ3": "WZX2G5g6GxGqVVZVvzBA1O95O1pBvLhHvxieLD3CJUSrsFNviY5Eb", "RRqMwN488ScA00w8TAsy": "vqgsSgy", "PvYyHFwD1XspG4LBWQUQVAnOu5aUixsSSbzMWbOcqRTidFvXqpVK": "Y8F5hsTeFWuR", "giVT2eTVKL3WI8NMUIoHKAr0cm8HM9M8OgxdTRddnt0": "TReXynI0vUHt57Z1EVmTQObSoYFoeBAp9", "HOd0PSfoWvTovRN4Np3vPydCwOonPGYmbWR3FhROEfb933NDwx52M": "yCm4csvqSuDFDKw4ZOw1DPa55F3XkuQ", "CokQfwxxcRL13aENfGJAawvCVzOESduW1U8jkxMGMsl32NMsyMu6": "q0rQOcRY8vZ2JDDOaVwBbQbFw1xZVfv", "td3TBeT8azRkpFXxypMm0SPRU7dwKrTZiUI": "UyWlSD40n0UDWomfUtt41OgPkGA5", "yqXR10wKCaYr8PiE4WMEMxZ4GCcJ7Xq": "IOUiDzUKTjuRTeIwHzfwZweQCfKWVoY", "oMJ1xNd9qBDOmBAjRChUtEhvfqy2lElYxdGpX5llgV1JsiSklk6": "OeM4mxKomBsSZBKcbTmlWb8Q8nrxT3UXP6sm7", "choXSh1uGM2edV6o8zQyw0TESlbhcG3152AGl6XD8uvgYEkqAlAQKkUJ88": "Mo2qEzDrN", "yAxTKFph1wl9GWYqiV8O": "ydM6bgAqoXwkKSByF8gWEjaLBRxdBCci1", "Z05sbAAFxioioofjVMfIf": "i", "NHo9Cvn7DTpUu7214rsf6pj285PTM5louzkYbfNrhoX6XGraul": "nQGP2soeLoxtAEcV7OVT6HPM6z1ixGNwCEHxe8YGXomm2rL9tE4N9", "x0GY9ektI0RwQaczloFzCPplSaBBsRN2R5": "CMIvwdOXocOgRgNzvGoSb1yo6RUoRt294LwU", "dKSyuji": "AjzVJrrosYzQYlGlDBnrgSZSzugsnkEqfIavnYKdv0RMLTNCRrfgsmDqj2", "T47dtMXlZuUSPF1uuQrwiI8YXu8qM": "BmJcD8LRFOtbgR8GQpEDZxxjDi0IFFX8W2lm1LnxIH616QQo2pM64sKDQSbZZkJ", "nD2goAceVPXccQq769WfN6IW": "tMMPpUBOwe", "zjjOWNR3wPk24IjZXHkowKOcM1rVsDhXaFeW5IOkGWxN7yKUaErV4MFnOV18": "BkJvS1IYnHd98e4A97mssGgnHDZOKvUodBLHzvGV", "akkuzSd": "hsV9mXMxPeXugGB2NnvbAoel8BeFpWsxDAiDeY26iHoIv01c4sNcl", "JvQKz1wD6caJwI2emOoaH6rtpAF608HMSfQ2ms0nYq9prh": "jStTrpO7DHhIhqDLEIleRd8XP7h8hbZjvkOPe", "Rp5wHizkZkbYrTPcYQAOM3thG": "S16fFvD", "IW": "pfHj0vSngJyPf3Lhu8LM72soQ6gCHSJ11aLSRcuWszR4eco", "isUsAR": "T24GtIf0u5FzTtBZvAlhK9GVYrda4KpR0YB0adkx5GEMO", "DA4Q8fqb4S8Pi": "LfVAKa", "L5rPt69XYvCg0OWvBeRxfw": "vsplCeY8syEmFsj1JqNO2l7XViIRZN1JS09BODlDi6G37wFg1l0wVk", "zQyW3FwQOW5gBoIp1OHk2smPn2hOwAnftK597Hg4Qfoy1zSYrmMYSxkjKWiUNJ": "A85WGKEqwGqOPwlikAADJwZkhbIB895pDmsjEQqRgEbNko9d5QF7CtBIkxE8vX", "NlkGj57Dqq9DiwxNz7VXXodDDdIjLmTmdSwbz": "RFllTabRBJl3IQC2A1vfWGUJCEjNAmOUEw", "oDdsFcWvpdChrk2FKCIgbOeury": "kWLgbBiEWYpJ8oDqghhW", "hqBs5GbXDyTj98z97SqHSQsCL3u7BqzLmfkwRo4pXpsfv4Q1VNz": "tdy2Vs", "KyV3NcdL8Kcq64Bf6rxgnWJU1IIk": "WOHFq1UeagPcQVZQoCVcvUVy4qySygWllEVZZBxPnTINZPOyEMvyBgOuB31fxPgi", "JQf": "Fp2tOBuuc3bMGhS5nBbZe9CwiN3hIm0mZbA7yjYl", "esENmPilENQajp7KOAmxBFLXz9BN8tMKUhbsOrBENJP8Y4w4yt7Y04JuOnrFYao5n": "TYzN0swDipN8pybOyXQ8arjJ43SpUL44uWMqdyfCNkmBG", "ybWo4QpWz1n2UpRNO4fw68HN9wCQmal0ewaMMHSsVmm2IUW8VjC83NXRQr8ZbMxoO": "x", "TKtb0cJeRsewtOoP9TiaH8DG0tgMQD": "Eo2JKVUubtGqW5wvqe8Xd", "pqdLy8sKdllYehW1LZpTTQaPE136JTMtYSN3DKNcCW8aayTtCJ": "gXIh4qAFAdX9hdOSQ1MZ90XIwN1itg4iIf46r0fxVttmG4VJ15G", "crzanm": "qtJ5Cg11b35Hbbo75IAF0OzyyQivXA", "p9EddgEDpepf": "vXAc18SIlS7nCCI48HWig2YTrR31MAIAqf7FUcvfFO2lpmXQkRRtzd2r", "AtMC8mPWr4obcrgRfPS": "cKZfJ5UB", "j2JAZi2y0RjlCEXq8ECf3FG": "TeOhounsk81UC5fKemNYx24G1CceuGwN4qpH89a", "EQDcP3lvXe0oIHbc2k4DqzCZYq8Enz0zFqnAzRzNOtZPk7OjR2ww": "k6vxOL3uywKM0MPv", "fupVSOtqlBmOSXsSbHzZ8ykTsS90dE9Nuo2HfB5Dtn2ykRPfe525G7uz": "IobXgyMPrxeRLnJwwaLrtocT9qQeNru6WCap2nFccdJMU6wRLAfD2Lg", "QzeF7LpVzO4bpFmShZsFRs": "NMNg0H5Q5wiqe1Qip72mtjYLOrrOih3EgJeUTtk", "laEl9QSGAWwf6XX6Uv7e4vft2GVZNSCVGi4VGDsgF": "oHbvUTrZjQ6czAxc6FXTvA", "YvIlJgHYXwiTdMsluhZbvfNCWlkW0pgDJIZRSMSN5a32tZWtqI": "uQDPaamG7nJFi1LoluTAf8", "vnhdn": "pYtEo0uaWSmMasn", "OkaZMCaMV9iD5sq9OmErMerRFX21c0t77MHzF5": "jyXMepmJrsHGA5Hno9DG4lI26nag6GbR", "XVW6aXOGL499mC4yxxQTq4niKpW1FNchGkUVjLGo": "yizqHSJJHC6aSJaIRZyaC", "afGsDamZRDgl3j0kC5DlIMDmhcQ95fPbbKdskIRqICsuY": "LfrY1BknSybd", "DmFYc2byk9D": "hQaHtQ98Tj0gHrFvMNvTmS", "IEsPrQ1EtAWwnQkRdwWdOKHnjF9F": "PrhPjcyU6k2vYLLSZFWwC5m6wWaK3UBr0FkiCayBhwEfBej5PPLNLiHalpEKfddR", "Jzs2": "i8a2SvgLf7cS8DzlEJbRmbhdp3JB7n43THbfSJLCo6gvewDYARpl8MEajCNB", "tdDaKy93JjVvMEOxQXxfQLsPi4CT4MmPp0tJaYW": "JVxgzUA6mPOQwX8adobKv2WLQIWiUoHbZnnmGVTo0LxEm9LI96jKkMfnX773ncCGt", "WM8AYjb8DxoKkbUsUliDDoF9hNfJaZJwTZb": "iZcOJpyFl7OhC95CJUfZKZlsHaGujD6", "kl2": "eMM1jenrBaFzQtqIBYla", "LnJ6uB5lgos8rzuOiM3UcM7iUCsu0ceVC": "A2sjJWMpX6x", "rKW27vhG4MGrwaz3YRkMHu5zdBjNKvBJK7R5": "NsVsR6a5tiZWoBblQ", "qdjzvouLDZwMvloChdCW2NDXNN7CjdML9wP7PGuEP1e71rVB4w6ToIoymAj": "UFhUhhmMfW9bbYXAiADU6TwwNHzs896sx", "pJ4s": "Ybl0BrSmbx5crmVhdAXJmkYqZg67hfMsHFLt1lxbh", "vNb2opgJDILeE5ikIOpd1rt6vOHi3fQ7lcl5ghca1iIxTdJr73LpIQuQhOh": "jnALAbfXkXZSIHqI698N5l", "VZvMs": "mu81XncWiPOh0znSYoh8SYlkiB2Oi2pTaOLy6trTSGRsi1s", "UUniMC8XSaMhLVXWuXvBYMogIQfvu7RrP6OnVBHe3Z3suVlcg8sJoycRgj9f3": "EGj9eSNKWwsy8Aggc1L3LFVhHowp8I43mwlcLqwvOopCXERKKuS", "bt2geWNv15yygD7W": "nMQ0c1W4FCoUPmhAQzp9pcsFUp84jOiVwAFzu8rYvrRnKXFMP5aBqXZZSCn8Zud", "Vh1OdmfxrRS4qoMhY1deTeEI6Y": "eYOV3BOSOw2GrAbpNferTMVBcikqH30BXw4nDnEbuL4r1EcM", "Ztew1PvHo1mHx4xWqj6cZQBBTytYpKg47a": "dfvCEe2REuL", "IaJZc1mRutUxtJnKbh2XJEFwtoIC1xYXhyKnBXbwolnIwhmeYIY9XX": "u1N2VknxmySITji4fybKOxrIGPC1cm", "hdTwj8Hs9ErWGyS128EerU7IcOTkRXAn0kd": "dvV2FHlDJFyslNASBACBmfTmD6mbEScdKDkeLXsy1kSzODxrZTu7qebOW9DSFXGD", "iaj9D1SgwyDFH6HMBwC8BvB5va": "OKlrIrNqvFZRvOv8zwJCQnGnWZsD", "FI5Z51W1icfcEUUxoFsbtaukqEtPaIZ9NkDbBG85d2TUUo": "DH7j8mXmcBkSw310xXfiCFVFHzv0Pek", "q6bPbVY4WKPotmXdq6tfgxE8Ah": "DlLcVZsg07PqjOVKlDlQshP6", "apzzZV6TA": "n6CKCU8BrfvSUkNqkfmsw7cYbGtzj5eu5NAKrtL4UjDywXe", "HnsVk1XvHr1d6PRBEwRw": "v6Sd22Gv7G0nYMA", "ja2Csz5ts6IG3nfB4tNwwvf12QYzQS0Toaqd6o9oJ7lJ1og27D": "EaBN6T1Kouwku", "sxeMNsLPUrOmoL2W8aOb": "jcSbLmst4imkb", "C9LYL2dLdWBjUyoM426JKfX3HaNxu848R7PPjr": "T0DvZMD7oJ0x6AM4aNPum8pbY2e0i", "iHI50uVZTUQV1YlYEnzBu": "zcgORGk", "yVT24iDyS0pield95L5tDCIQUNlXxkzzMOaId9UawfxtMTVTaaYPa5ZvWM": "RQHuDoXjZkkvnXvLbf59sIhx", "qgORMwPyd7oZs8LGJA6H5M01AlvJJX6SePOFIa8raA4b3dMmUVj4wGO4L2Yjs0V": "RVD", "B3S98do0WsruzGMD09mzSIxEzYRrvGlilAkk7IJWgtQould2i": "QntgdkPBIC", "nrKutGBf6": "y7KeocoRTA1FtHlahnbHz7BNfD1PB4bOp34e8Ada4hwvCGrgXuGUOKnii", "IEnAfaqVP9xxWLlS4TJGB81OHgDH6M9u17g2GmLix8PlnIOww4noSqvjj2j4WU": "b3f3BvZ9OQPH0Q6C3bAFuN", "sP11Q4vgF": "Wli71wnjDaV8IX", "XkYAaEDl8zznFN6UX8nO3NcdYIqmK6Jc7VWkKJ": "HKWPbDUaLtdug", "GRKS1dRfAsyp0UDBWQCAFZI4qbvOM4Nclt95ZoqyxkmtAPZ": "PW3B4QZrcepdQgU4MVmRJm", "lQKygTE": "hOMgEQryU0LzKpxAARX3Ap3W76sI4LfxuPbY1XtQu64jScstu6kfzpz8SX", "cPtCKtBzG7L5AKuagtgesQOIVsSDrsM3e1buSwgkruyT5tc5": "m6Bb9qVp2HUvNm7Vauw6QG0QhcsTXCLxPh3AYxr48ZrfDsf9M", "C5TNb03cK": "SThRB6YUvs3CvXtzZ6DizgszJezpFgWwZZ6HeBNCPcNbLPxK", "HB2KOA6qGuPAfqrqSgfeqLl9y": "Z2jORhh9gafoGJc6b948rbie7IKgl3MuY57pn0zQwTU2ap27bt1BoChda1vGQ2l2F", "du64MtIYEqJMs3G10KW7A8lTDvU2HAIfYqY22Bxg": "LSIdwwLZWx4lJZw37yM4wzTsuT3lm6P7JBcppynFK7Zb1Fs", "Fmtai3puEhv03": "Ha6u8DofC3J2FDIxdUW6ghpVCa8SPBK8oBBFE8hAjDUNEL9IwcSNJtXR1FmJ6sX", "T0j96N1Ct20cA5c3UqNuFQwaU615oc9wWvj70xEwO6iHTJ": "RGCintEhpw1A6SYz6yL2xcgA0PyxO0o0JJr7", "KA6p5VAL8eeGFHqRPfnxtOpXONpw7d3iweHBcQvVMHO6tFze1sIlp": "oujssLT3P7AAxev6PEbsW9pmUKtIfQAc0BuQP5QGdMXDqtGr2XPfPyC5f", "iYICWuHPwoIbnERiYC19fNyY7MDYvie": "zMmOnJNeq79kqbmpFYC5v", "Y9AxoIIJXmetrcew": "EYq6Gxo9r4foRzCLtwP1mB6Yo1qBTod1UMkgZUB7NXMuA0MBi2l8IxRF7JxWE", "PVy3MVf5kMLvzvJd7": "lcrTJJ6XyMcSjJi9pocPNsAXEJ", "XuZcTcc1PfLU8ctRUsdTC2YXRfvXMEvN": "Hf2zuOiZGKlMCg8M2TT7wJdUoLqdoS0TrI9S6Osw5rGuF4zplRh0goerO", "Y7zMHyTNMQ7dJH9wkUXGTczneOZgtqBJQ8kAoGwg": "MbXYzTFITey527UEX3J0HIVmV", "oZ1q5ugJIr84tuydfqYW": "zBCgrls35tyTbVnoNixjCt58sfTze4UW7pWHAP8UNHldfo", "RwiyDpR5AIdLirQPfy": "nTtSxz0EdsyWquZT4qbixOCaqndSqFJVr04ZBMp5z8BqBH", "VEScNjpQzLdSuKshFMUxKny5KZqmNxyzHuD5eYNwG80wtm6bMGVMhc": "gQ1C2mR4A6r4KvnvtZcoFnfeDUU4j4l5GUomyjEghOqWlH8LUUhlN27KMGJCwJAy9", "lZThFJEebTzFv4YWnThvaIj2YVyxBL": "JCpVDSZJOD1flT3SxZwYBHAx8KrddRaKxvqVu97c6sxZwEUI0LeYpYfywV5JS", "gJTDT4sH7w0RZRqkU": "yqH4qXzUuFBiYoy89", "QgvzAGqHg5nmIlbt": "GHX", "QlxpENa4CqFcJH3U80Ckxrsb0xSWapY0t7byrSdJdNEitk3kZEdqIbVXc57wt": "l4or", "EqEemAQEJVysWdnkJvXnV6sT8FNbEJMczMpzom8eW6JrKpflkZpETd": "AHQsBG1Boi6sZUqcwyYPowOwmx60ZFtN0ybrYoLXL", "ahkA2RxXVCxtSXKHZfuVSQS67obdroUNyQVrm4DLTa3yYR7": "MYAN1pBOP0gGOZVefEGLxXMfgjmUit5PFLxbqDo0sWyKg8cQhHUVXVQGPjd", "H1Pl78vtblSy2yfgcMgipfO5uCPmgg8hjrAtOGv": "MAK9yBOxxBX1G7yNqZagsPFbpyMDtBe1BBajkNhGSuYKC", "O2": "ZaYY6HZ9zpxDp0GT0m21uw8MgNZHZOh1V6qPyM7TvRpdj7HeMgy90D5", "z94TalMso8xvuqSQDk5ggvQUF": "Jrs9f0hbu4A1ebLe0Ni", "uTnCL0ptNlkgGifXBY0sf3uDck": "fsNAydFnXoIP5qiBAMblZzIgyRe33Lca8MZNLJuiIj69oOQdza", "rJhhssyZx6eB3DryI2ul4NANV1ercr8tYkArXJyPEVOsooVU2KqQiRt44yU6Ftx": "kEbUDX3t33dBlL484r7X0Feg0", "H1fitSiVpmcwXirWtVR9dzoT02JTOXMec7gMVXIduaKLion2zQCAdpNw10H51": "fn8rkGTl8pdQcjDcUb2WX6", "XYfwjk2FCoYV4iCqZt": "FLG3W2j4QWnYhp5AiI59PC8KC98eudfWoSW1moVSBAb", "QtvC55kz": "V9s", "vWDhG7lobbseYoJk1HwMEIFsMAD5ZNx3rJqT2R4Nj": "qVphuIr3l4t1qPgLsUjwNl2V", "QYbwSMkTWIxBW": "Po9kcPntubL4qsRgp2ZRlZVkVHHSzDUqUh", "xQH8eMxez9BjlRzTM4bPFspvJdOQ78a1zaLx27PYgZ7WqEQnGev6Z8AY7BmVAhJOs": "Wbv2jfrGjym2bY8IbLbXIOE26hDhb5TEoOroUHJksUejhlwL5E9z2Hl8t2", "Ss8p1RIW6kdfgNJKsH8xCfQXWKcV3NYE": "T73ky9Cp", "v2PRdl4ikC1QzHslw0i7c1bfrdvcBPRFP7roJBfqXtk1lkO1FjQV": "w7aoN", "PIRsAbepUJqp": "olgQ83hJPca14MJkygZlqrn7qBeARcz5zXLKrTBYLVxlNbA8lhovt", "xFbROvsazgmW2RPRETRJhQ1UCMkZ4ZqDjsse3Q8DftnM4ZaOaAZuUq": "jhNbJP0YdxkUWmyBbgB1cIDsB", "KMJ8kLBTZwB1G7TYqTWFqBBn3TNLVfXYGfy1c": "yXZqNFe8W", "xk4tc4Y3zAKYJtQ2mHpkFjb45xb5I1": "lpFXIu3kexRqqO76RAQh5eH1QSqX5ceI9PaLpvvm", "PZRY72FDn2xPOEfuOtcs3O1zOS1pKqdp61XPk7p": "i4gRduzm", "JVDfJ0aOaSPUCjZ5WhS2G6CaDHVdP945ZN4QHtofF1pNzVg1xQBqoZeb": "t2GR6ohcGevb2ajhngw", "bxtUnpvw33": "K5eVRhk3kPPZyCdCrlOPW2YFEc3NMjNNPOdHFOTrkGCRe36oNX3yqNbqAP9mA", "GVqozAfaH1oHI39Zs5ed6Ft5t0FJg": "Yip2SzBym2NdRzCqsXLxydyYnNgiRQj3bgOiF9g3umdkGVhDXess3aNF0KeH", "uVXYi4ymznhEaLEOHvVkOWfiQO2QBYTTHio8JrMKjUNXDPBsdxEHl9ugbUUhQ": "Hsyl8nP7HCuo9y2m7f1iDE653nQhvBTq1owoaXa0FQyB", "vFaqZuykiuVtfN": "JWL7pV7ggurCQBTmhauZBFyu67jTmc", "BTNuXGqeZBAF5ngIgBe4vgW757gOYwtSyS": "vn", "QafNV4GqrnDx5ww7R4DjwfhoYsyWFDZK2hhjgzPEZ7sJEyNqM6EKg5gk8WiNIjQzZ": "yq0eKOfHeWUTr6itXdWHSgWLmW1D7i2WJWUBsmw", "O4LhX89WI5Itti4SYnmPc44f1kuGbHBopqFNIuAwQ7WJ0xDH": "T0eLGSoC0ev4XS0VphLDRPrv2", "In0Wy6E7J": "FCBzSBwXxDC0dItHqHtezfgHSa4ZwuOHPbR7dgVBZKoRq1xuRJ0p35h", "gOxQ4fDyE3Ug80HhgV5eaJ6pRkstJXLm4rjcwzUnDlOTuSjeUR91Y4SBZFzI6z": "R3rCZOdl8xKqmJFFS1r6tA0GPjod0vLgadPdsGxEj1GQtCHS9Me9cm6mmzT", "RJuT433NFac6lZ5P5CNz4i0MYakz": "tOHiUWZfPilMGlmxyJAMKIcSPqDMSJFMH3MeaNiC81U8KbofJfSt9dRSSK", "laKX48HFpjCjXh55o": "ROCFKPF9pwEapWuE", "bAAYUKooZR0aGi4dUAHwaKBTs3L52uh8tjJCN0fHicalYf2": "jJuMpYOTLg4spyj0av93PANA0SbhC1", "eRCuV45q4McexmqsYAhvtwYfW29kGkmYj4": "I8sMLYz6ESvg8SvFMXgQNXkT92ncgEynsNVqDMUzU1azlG01pwX2uMeTXAyk2LoDq", "Ylc95g6WQLiA5H09KV1bmG3OFiUShF1PGufnqbdGkCO1MqVQVVJCMMvNlBCLju": "qJM", "ZhOOYYWboPDBqvFM8H1R5wecfWeVRxpE7WeHc3A": "YOUQb3UHQqN15gAHOIEqf3YvNSgjkxfQtLDbkE9TvofN3RSj0KPSmh", "ZzwIScFSCSOrbcuesu3UaW3GgRPAetBgsA32hbeMoBg0qbJPTqQ": "vnAnKcAeS6YKJlmsMmc9EXla5ho474ygen", "syvp": "H6vuDYTGMEln7SUxlO41yPtzNll5S", "mEZ": "d4HrEG6fwqyGynnyJByfkMMFQMhb2gQwAHlLPwLg5CeYuqF1U5DRaRUiZXhssCK3E", "XraOsNnn56xEzBwG": "XAGTdYG2pxGN84O2CRZccpreq2gqoc8dvXrtc8Qv3zZrF2y8gRP66K36G8a", "N03qHaqqTNkkeQz7Y5kzErEOyIVJwqnhb5AJ9ENRNCdUbnIKmpP0L": "djdCi2ATKizAY2ZbZzYSITr0ilCKpVSZXBzbKQL43TAS7CTB", "lAhBs9rKL84kejCQlXsb2RSWmXFfif8DV9GuuiPVQ2ti": "RcpzgD8ppZoKJeYRqYi8Hg0bHRtjx5", "kNpYOxumA9zHdvW4fbiydNIjr4sz0XWDRhD": "y3Y", "RAIU3irdX01Zf6XBVagJEkGs76EZXaSz3PSx9IAY4Qdkzfb8cVMIQRsaP2KVnJAG": "jiIXwMOVNiTPuurl87fwEZcOx3cNais", "Mc91LWChv": "MKqgJ2ye4ylXg6SZsVZHFMGdJ0", "tugwyu4YENIhKVzBbF7cvEaOZMg9HjM43": "B9jDI1", "i9vSOlgura2H65bW9TptW2nKotSHc0nNLR4HaYcPAqD": "CW8kOyIJMWFnO2lBh3uTbmjGJFGYvJMkvbneYVFltN5JTHzN5csfHt0pHHd77", "J4aKC5yAyS2lQooBxalofxn7AADheGbojNSQES195K63ywkVyV": "kpUcWquPyoCPyWUy8aXIojBsdh0tvxNkMkmJS36cCh3sojUgZ2eAiA1M4hVn", "gNEqTHPfDln9g7aaQp": "oEjeS0hGyLadtMvJmlHY5M3pY4rlCC9MlUMP6wlBWkgrqU4IJYlw6r62", "A7GJzzdHDzMutPZjggvOkGYDdwkLaNoyiBny": "mSrYY9F", "jDFQVgU5PrYlB5KGvYwDAJO4rK7m8zUl2bI1IYZO8EwTBSaYIJfkkr096dpq": "ih8u2R7muQZ", "mQN7GR007szbWOkoxVEo9tynwbcBsTASefv": "MmnggyIYObTsXt6AlPolK7robBoMwcYOIwWusd", "Vqrk55Obm2e6UYfbMBYI7pfykE2TCeD4W2Ag7X6": "I2nYdpgrbJSiDvDVm9M91WJHmoUNqzp4Oog8FpgQUeT2PZvmsvH", "ffZp3aVXehgUPmTnEKzRZYF6BXT2quQixkxvT3CIRYH": "TiVLFNFcvkbLxfSbTiyBTRFXHGGvrpBC8jgocTTzSbzxpwGujthKBBNH", "meAI2UWnK0VXykd": "sZBEhGUjZfBXiFc09HQ9TcJBWwWufBwvyzZGJXvSrx857SHC7kivMq1", "SvjrkKBzmfBKk3xqmp59AuwlwgoFR3coV": "B", "XTergtZmC7xhhtvee5aDmWWUVWzpYQwBQiyQBzt0Pd": "APom3JleduE4CFEV1gmLXxNyOEu2Q4gsb9YcWgLIb9bphU9zhMtaHuKS1gnz", "tQfMGVOSTCa": "zLPMemlFzpI4FbMknhnNr8oBjRH6NsNZsnxVz620", "YD": "CxrI6AbnrMnJcsaiCShreEXdEhZkhbyyg2", "ZwldJ1ErbiDzruuRvm4ZyfYzeyh4ndkEA0eYJbk3ewRBsyaIEk": "w6puiK3bBmVflAJldkT35EOhuexF3SBXlFxVqzrkMT82sldYXu", "moEU8Q5qRWQwSjZmTgFqx3zWnxj3lrnYQLQaCWBGwDdxRrvLQsiFXkdzCoI7shDt5": "xbVmpjc3ieNr", "dQkjwrQaRoJryEcpn1kWF": "pBgx9LyIrpfHvourRLy10RPrRREsDw6lyPkkgoS", "yIdgn598yBPcxbdrLtWIpeXmAhr4RcgoH2qkt3JH3afKrUtUHw7": "PhQWtJRz1p2xk0NL6dJiNtwOix44jDU1R7Q", "hqFGr8t0O1BqVSH6coOMARLHte7P": "SA0MNoy0", "SV1nqJf7E7I0QosIaE8SUpd7vtItGL6x17zY81jA2ihtIojWNiInG0e4w12U8ar6Z": "IlB", "V2": "ILEivG", "rM7d89D": "x0xzbdx", "Zc0spmI2MKooyMUp6A0iHbPj2Kg7cS5gGZfET4BEfW0wtYapgsk4UnyNGNQTV": "QEmCi8EDw39JcGGmTnpBHFsOvmRISHm5ZLQ", "SJyHLm47SCiZiu2jmwvQhd7Oc5JVsuxIcrA3PdeRRwimO57SlIENMhajF7m": "UFiiz3KspVC6Vd4Lm0OA", "JUGnY9F4aIsmG7CAqcY9fdkPQY9Un96dYyKeuOSEP6KoYIeQCRM": "xNBz7qOYRwzuXKFwksdbf9QZA3C1", "VJX55MAJKDkEqDR1IyrT": "Cyu0rv29LR9bkjtbNSmdYbcUVUOg1ZEKd3qPi004j7WCKaXxf30KIdWXAXONvbQ", "Zj6": "EbjXKlhKQxKAn1M2NLRIz0Diku0CK239ww79FvQ8V0Fb8kh", "xylwCUx9TicmsvCYNVHaKV": "nE8", "TP7o5G4706YBRFCVHFxhaEo0dUOEAPtl8YEMEW1YeaMJQ5GKOthyb": "qD89s", "fWZrq3m4i8aJQZILkiL7B9IbnMUE0foMpRC6MSsiWLtllp": "Wogf5h9roKE1Qv4RZCF90HuYQUi79nuCpUk8M5CVxeCnoMGEpEQ3bkhBit6", "QICVm1qoJtCENTNAii8wovERRukNrpOIsgQqpzPbWSVPsgt7w4XLi0VFlO2u4Zz": "YAMvWRbnn004oaXrjHAWEMXhLEO2l", "S0HBBnJ5WSdUw5ilDUAnTsIT5HK0nbCOeIRiymkqdSJFnX8lMY7dDYf0r2Fuo0": "xcO0Gf1X4pjgey5Y8I745jwsZ5908t3Sr7bdfgAOCeTmRyrFvGEcgLCYtu8MOEew", "Z9hcPvQNW6r": "sges4cEpnoFRC85n", "HoW1I2NZLdAI0GY8ij019": "VFNByQCBxOCD8mPRt6YXk6LDZxDt1mm02NHVxCS9dHXI7R3TTmY0mGKRxHk", "mSgFeHABvCoaGzkklZImiEFXnsr6JUseCYCwr6Afz34hiwvONHG": "tLsF79moGf1JtJzN8U", "ZfxdgF0j6Ox": "YgeIYyHEkBza3zp7ktEWEGjgddPJVDey7qMKbAn7FvVWmWSWPD04Y", "YtxnY8wrfNYdY84kZt17u": "aKSDn", "aiBIwiviqGZ2SfQTjoscegwpciUywDVf": "g61", "fy7zJC5qkM5CwGzeXVGNnDhawUVyiHsf12Rcosl": "D8vaubQBhx4aKsVCuqPv7P1", "qfxITd2Po34dEF9bmSQV1JbFZpGn": "h2R3XK8A5vLV", "SEUHVj76kC537": "I7iEhPd9dhFqzOmvIiZ0pniQwwIyDQMLg0yfrw4", "itADYnlsSTpl0": "l3Vefqua2x8SQ8BYl", "MduGLmjrgd7qsJM2pf4OIB1JfvECDOWQXI5cQmUifO9YFt5B5Lju": "uvMizsMb1RUSwW", "eFYMm2lMZoVgLlCKVO1wM5niIknZtZ": "ZBUVH9eBvJOq0d8A5kqejRO6mTyfXJcP5", "rCyQ4YUEFfVgxlvq7UoiwtzblChNIwGIkPZEYhSb6oNI7pLZP2YK4L": "ls56", "W0e60wCsxPvFvE": "tKRUAAWIlSGTK9aceVGxl1dPOskvmiqb3odBR9fuPmNoMuQ2v4f8qqmo0r7THr0", "pKD": "JNwwTwmB3HPTblSPsa4B6yyODh5Jenw33FXxZjQ549Ze17aXPC", "z0EMcoYaSx2k03b8nG7t5ho3YmAajVfu0g7z8XkQ44zKchMRIDEVxtL": "CH", "MGOxLGp68XrstEsA7K9wKfLn2BItQgW69MMPQGI8Y7Kea0xSCHY9UY": "kDkO76LPiwedEiKPAUIbSVqiC4I1f3j", "m9R8cXDHT6KLtsvHMNq8AeQqfefKGxaot": "ZFFu4GG4WPzcjGK2jSfQi8q2RT170SKb0o9bt10h1SamxElZ1XDDq", "LYkje7QYPtjd0QuI6yCJLRyjxNFMXpu2oq4zDwIzwGI75PHd1DwNpM": "D58YzujC04unzm7w096lyFxQN9", "Gw": "vaZEcm", "rfE": "fKsMPYUn9Wt9qTPxJ", "fwcLQzUArlomIYsUFPNabQ6yP5miJxjmNT": "RbAkJ1FEessLq1i", "LoL4oiQA": "frBrV0rDj2va6WOZxcmAoan2vRSdjlfXGCsfaQ68z96W", "UPEUuEV9tLm7ORIfY5VfvxFm91veCihGvpHkgF8znNv1kQGce777jU5": "Wvrt3nu5XI3MAebPCFXwkny9v13mDZ9ggiem01S", "w5DaSafQTf4PZLmIpk4YErND4kXMtcWp": "MGlcPivpp3oxg", "G0b4VpX2SoNT0SnyQF4IttRyr4yknKUJ4LVdBdS4yx3p7N9EjH4SYzwMMdwR": "BeRp30f0v9vrZU2Y0WoBbBfQf19fRxYpkNydT1cA41apIQfx", "yaUeZ52sTIsi9L1CrBPRUnPXw2NafOayEqmTVMtH8RX5wzFvTD7BNskSrSvO2": "ZPxgGXpSyHEGBMmDJXMkUO47nWiSuUAufVzUORXkyibpxrCAxyi58Km", "zivu": "AG9LpSWBkMUoJV563IJFw6tCII87Cx5ol", "hQgeUztIOKdoLfeQjliUoNlKFGpCNJcjaM7YDRUut2uSR02b": "rorGuufrO0G5xo9IO31c65QIA9jJnbeOyRWH74BRIX2e", "nFTUtO2abBTbaM0SvSiYNTI": "VqDs2nQxWlVQhgTV0GklfAHYWDXxLNtBZ7412bw3u", "n2Kuuzy0ueKMxy6NVo6pPEVw2": "NGi5i1WSWECSGLNSu3HTHfinCSIay4EmS0x9ALi7nJOEpZu0YrvrcHeyX6qT", "f4NFi8xP17ZLtgXN7qsbuSd5zY": "nOYPWIoD93D0iWS67O4tl5pM9choImIVineAAFSAJLY68Z", "cfGyKB83NpYAobkYg5Qoe": "utNR8LwdkSGKUemz6330S1c8NIcxN1vmiluXQ6WwfL3UwcguuuZ1RSCJ", "HF2NrO3pyb6eB1cIOcgk51Y2ukQmyyev3": "QmT2ZTt3BzeE3l3SAuvFJSvKiyjGCmTRYYm", "PCysuBC497": "MWcme1nLMZlCzxo0nSITIE7p56aUmgA8ccIQoy", "YDTtaXh50paERWDBqUXgtvGS12uV2pCXPEM1h2kXAHL6V042TeN8GRZrfjoj": "F2KNGJy09hejsLapY1MC2s790ZgHcCojO3O7KveYEDbgPofYo0jU", "kCV5VyjCorGs73q0j6HZPmUrQebGCpWfOwqMJqDjW8fYF": "qa", "r4WEoOdCnOO6c6VW88Snxast6nkJFqqyoQ1H": "vU9nCm8CGYWtBNxEUvkYcof5SOBT155jITDddhbTK", "B9i3yjkPRyLR0cZUJQyxKVqe6YLAaUUZQ1eKA0IR1OBayxSK": "eBs2", "gjKjFA": "jdcyg6YcYxNB", "HGUQn96ScYwYsK6f9ao1gCITMP9n2ykW9AYmYYl8x2Dp6N1J6ZoRrIu67E": "uXrvEH6DizHinOjTMcSRlvpFi", "lAA86x23RP7URUfJJFFmi65Ch96989sJI5aL7lfYJEsFg": "U806ou79ZcTK6SWhJWLFTyPYRP7MRXc1csY5Rma6P84cYoLZ8OXL", "woAwEOp7hXmoLc6GOLYAbU3OeXlE6VmPZBvNVYx4DkClZuqox1ugEvS8JO7P": "l7yDcazzm9VMSys5LP7S4QQ", "zMDexzOeMuc2Zxfq4SZvy6tDU": "ZJxMEvLwMYHScEkl", "LlB6jJNIWlVxr8iIUOEEPnC3VaqQjAaSQABenn1cp1Wl1o6cNklaHFlcRWTmKx": "stesmTudC2R", "LmsgRuY6UnUKYKXLKTvmnppBt5s": "OgDSxsDAOyxQhRjvSqldZI591f5yWYYgEuJZCdkpH4WfSbp59vFH4LW", "Wr2APsD3r7": "BGwAIBSjca781CXSDfjauMfYirOuYEXQVvzJpWS9qTUp6cxRnb6akfwfy", "JOFXlXfYWiN04ewhFfHyMqKxozYfLnsnRo": "LD7L1MmQ2b0ma2OXFgPc2PClMRZAvu5YPK", "W4OZ4yF8J1FCzQY7VX0I5g": "g1inHurZTa6eXHGkxJbDFkCC6PVA", "qqh47s0DddHaOR0QdPVawuwAN6j": "CpSDXwJrhBcIEwjGkkr3EphNhWMXYXO5pikiIo6ztJpE5V62eoZ", "KN": "eeONZnnHpdKqcblZliHMPWkG2vg3IqvFwDq7vjNoFay", "HEYMuIq3VDb7ju9yUywpNnjsuvojdeDgptqdOlbP8WOv7TQ6IJh": "OD84mC0u", "zKopT": "Vm2ClmUTuEEG4y8S0Gk5IWngGU7yhEAs2kFEFYORfYaerbdTyS", "CQnMyW8jXLuujalufV7YCYU7cD2c5NlHYx09lKSSpdeZgK8MC": "z89CS", "W7LWldgNRrmPbC6QljZaKxygr4eRJtK4rMuxsk6V7v6DY0rFtWhXJ": "wNeqD0I", "bmzkJBxiBqXRvrOKHR8hKJWN8zejeCFTV9YlP7teeqfRE3n": "X3C25RqTX", "EwbbAWgJg2esiGdkE1dg7dYwrG": "T9hvIilhuxLCzizXBrJPeTOcRzUoZoWjWS8gE5Px7GOaLlLD", "ik": "G9LzwrytzGbbFiwcE7C4QSMUpZ73kkbe", "GRDKFSWgZ4EUN4AkGJ30x3ShcF1g": "a7Kxvv5w", "cz": "CkqHYq8PGFJbb5JQxBAjGDVhI2Tv4F6ew9anUW0rfQeB9n6mUy", "gHQyU": "ycsiujPLte9rcqV8D7lqS74AoK1MwIwN5QkGhlA", "FWTLabNTsKIs3DOBFXBBGZIMIms2m00Lcg23EBrvR0d3T08TfQHDtB4W": "hOKr4s4NVsOgWiIlqOkWAh2u7QGZiULy9ie92Bs", "gzHuXqcnE7djtVM5MFArRwIv4uVRVCX985k": "nvcK2pSO7MfJgav9qxQ2z20730PAsy6vpUfm4zxwgFh7CaGGkOHK8", "EKVflAlo5WV8T": "kNOUmQjN13voZDD02cjuROim7PY", "Nr0wapS": "sKN2EX", "agRFzp4TVbsCyRNfZBakhTmU8W0Bp": "RQaEMhdIiVdS4C4yREdnmGftA1FbJOmCrlgqklmfYkC2sYb2RLae", "Y2LKHhbbuvb69dBZXGrDPDoyZuGYLwgAB3tDhbWltxku": "ERZOsTH", "TH61zjnAq1CABPPtG8lcItsyrViGqQcylfBO2m76eenzb2": "aYFkEnBYwMKltNbFWYK71YTrmMCsH5t", "iXeeEUNweXpNiNBhMvUy": "I7F1oSANijQzBfeOrdDGCFxieFanyeWnxVMWorVWLEsa684JIJOX2", "G1oC6xiBcvxkI6VvhkPHvI": "FNYxYWAtjzlH15YGpqH44xWVzgnE1", "AAvZsxczbXpwZrnHOfZiqQp8c1fe0A": "YojTnbBja8khSoHrPvQRWqhPjXnMLVR0ToElRzZDS", "nceBofsqJx8ZiMBkkUXTphvLzedrTESzG": "KL31GAOcclSdqLNO6KUFTGz3jz5CFa6lSohu8Y89", "J6H1zUjEIF9Q5CV": "W4FPn4uf2ijW96QzpCGoUxCZb5QDo", "iXM5TUW6zj6LwYOSnf8VZAitKZzc92LGmyvL9cZZCOq8lLUm4Qw": "Og7pXnvEEnQvLHWRLrY38auScxmghrBrTumxs7aA1SWsAk", "xCHTabaVHgMDns03": "cFp7meveZvRiKRuDk9AHAPPUhnqb9MN2f67UaBfMfIJOqOGMMoEUzVM", "GQBO2Ut6p62tbKHMRUgv40NN5B2OoD6uumtg1ZRmj1fRTOP": "nUrQX26jD0vnVv21WVRw", "LdeA4lg3XQouzgJ1Qu1ZVkOeXuohhyfjzKrTBGnZWk": "uR8RFbB2b6I", "NEg9iTNUtPWHE43TswlxKtJaD6sJMurZlM": "OgDwoWyv3mlPuAh1rzWPIdrQjlM1rc3347zXApw9", "u48WujLeN5ORIrkc30WekeQ23": "Fm8kaXDoNs2k7PapVE6", "D1ld6rxaIoacZsHXWNEa21epHILLXwN27SB0TJpYB7Z7UM5eH9MHz4rWOiNNwLkpG": "tL9uoV5hiLgqSRYeRXJ180GJuzISJ25wnvA5Q0yU5DNwtvHv3IQ", "rQnfHPLKY65dvknZFFhq8MQjyWjpXygUzC5lzJ57lmvshG7p0Mq5eh4LYpS8vd": "YJSmeY8CvQ6df0lQw3", "B3G1RWFDXIjZf7RJPnFgR": "u5xDHKP3pUmxWouSfWiqTcEKXZLwKFIJEbC3zaXz0DJGghNqo", "y8UEPYmUWPhese2a6hTwfHQ2yHXge0cbTydf": "b5ihidgrRzTuBCybcV0jw6RH5IqNzGneE7FKTFhkHPaTUreesIJLWxXVNZ9HrClCe", "bW1eUCOhY6mK3nqCf0": "uACQZm6lV59VWYH9r4pXC4vG5Q", "xyGRJ8WOxXfyI1kqK4zB": "JKUo6AcaUIbak3hQmX", "VyOErz8": "t1eSqqIUbocw6i1w0wAHfwuajk9RlYXpbN6IDaf3kSynVcku9kkfrtUHSDnu", "E4HjQWLchCqSD3efqVlmaam2ghmuTLtestlrOfgNrnZjR1OPNo": "H3efL8m6R0Tz6STh8Z7ra87fkfpA39vqq5Wg2IL", "booHgV6UMAjwCc0FgkZkzwHQIiU6yDvgMPTO4M9Ot6MN17wY4YpCwLzQB": "iBIrMuqbNDX", "cosRHVZ7QNJncXRNmfPp697oAWkm1TXckpfNihy3o88Us0OZMHNGW": "m0XFHnYkD3j8nfBbNFfOJLH6aitBSDlmJ4EWdgjcjVzQdsqyXLkyWvUjw4H", "omHJHxI0qxAuO2O9bwT3NDDfJfP": "EJRjrssQpMbTr7", "MbPMAigbn1GN7uzbuyxO2rbBbKCRrLpptt": "ZkT90RmVDbEggj78kqjO2", "xgBcP36CB75BkjHJLEpp37PcDZeE2QqOm8vW": "DHebr5EqKQZpiYtksZylSYMTXnjmbhvXQwu556V0ZEp0G0SRrye191N72rHy24", "i3ROilq": "iQT4NnYjtCmj2B8m4FpI1E", "JNEssCBYvQnZdzf8UwB2sDDjK4jDLvQQTnbByl7xe24Bi51yTAFuqG3huSHCdN4jD": "z6AEqkQowAfiTOm5", "fqTQlNxQ3Tsg0g6hrP08rViHSr9EaDjtYBYNRiuklZZvk5odI5cmCOBo0sxXSDhI": "esQVS8nhs2Ul3kBql8GKqnPvH3eokxZ8VYxJ4inig6xxaBM", "haIFf8hnRlO": "PzDgrAd", "J8idqvmkriYNwfZXzQRpjqN": "KrqDvfcqeCyfMtrYjuURi636ztbFgZHFPqjdvkZumTv1CNvUSbjgI82dyWJFInK", "DjiZa8P0yBcSuCStg6JN5rt264d3zb6EqVpq1uuT89HvQpPD0hICsIhuZ": "Db0MYjROQJnCryBadUgb9Nd1HQf9KEclS7f0Xal49dcXb5WTN5U8YwlP7zh", "IbxNoaZTJ70SSq1gxLkOFIWrkxBEpqGCCiZUaiIDJIaw0rI": "BKIf8Sr5UTVggA8NzvsQSEhzKwFj3b", "z2CwkVc4DI3VVvTrqg": "tHDCSjHVcebjJrauVOV1tU", "eGBknrzeiCklH6CnpddluO5MdbOBVfPypIjoOFFE0jOGAjb9MB3ieH3LP3Am34": "URwt1G6c7MsDCG6sBtYoy9QeJuD9HiZaVNzepSgDxC3Wk1ACev", "ohCqS7AET": "Er6C", "BzO8FMLjNaLI92XXlyIhwCyME1j": "kNHYrT4CnqJly8KAGS6WTseHxVCImMLKMuOiLNdndPQw74NSjPBv2", "h37pgPAZfxHdsnOoJ2wVLiWXq8yWXDX0b0R9WRT8OlIwV": "R9WwDGH0FtLSEuBva6DNrhP9UUm40wnUCVz9p792ISdbZ8Av", "ok0QHqKVWHIYaOMDoYKyNO04qNXU24CP": "ksLk", "WPZwYm6vu0alleKNADBBYMG2xjCjr1QNIPrXpO": "lurBnHa0ACL13LwOpaCIcpgCRPDZaQsINc6Ur", "eaZ0tkXj4ny9iwg6": "GywA", "bzXpL5nlWSy3OqUT2cVMLU4xFsL1rei7J8Ka1WBb": "WO1kErYXotf39xjVA10MsKgve1MbwUmk9uJDEl", "WOuuKhh1GHj1ruJkAjvBYLpRhdJT9fiUhyu3QTNlhL9BAYX": "aBMsRW6nmpeWOeJdMfTz8hGdbGMjMVVI0gWpcuXh1c", "RWAtgOpF8qAkAsqRUm0KQG": "GLB8v93L0hVY1F7X8pQnvNU7W6YekdcLTibjgyOT", "Yg6ToFxlkt9cWemVafV9DLvxuxYkLgAar7FTN6kmDoFtlUvZeOQVBM": "lA2Pz2L5CR2K4gxb5tFcLUT9aN15TwjouNMX3XrJfyHqExZwQDStGa", "QmIhCM": "sPbgpDTgPibwS", "ywNsQRNdBrGq95I": "ufDsNDbVRcdf06oKW4kaSrbStRW7", "zwmv9r60l5lATmEEUqNbO7UOE7ePO9KPPFWM": "PtTkLJUr9xqK7UeF2KHRcplynVdSW0f7skh", "dC": "W7r0FOQu", "ugOMnoU8DWSdTyDGzkk2ue2qRBulwYr5r": "Zvv4tkbwKS4dhb", "VKk4FYQ07gEYOMePzffNizL": "zb5GZQIh5ihkJUiLsa9dUoyIr5VDGhv5lIqgKZ", "GAlsID7uX": "RbXcu6laooBAq5HpalW7sTA99NsJQ7ovwoRyW4C7nBMq2UGl39D", "sH": "Kl2sjOd", "f2Fv0zAh7L9UsRCspgR": "elMi", "BQtG089YWcWCAHhp5jTODiI1wh9eKMl4PxsjgI4f9js8ovF4vmLGC9j4Z": "ete09Fl1eJy5kCpxYp0u5nh3rpapU8EZUpToU46mx3zxGHIRVh7wH42cf3F", "Nn7tbdJqQncxZNp87Y0x0KCzJBvyLoKLJcNN7TSvl9q9I5Q0M8XbmuDyTOoSCp2o": "dQdrm0wzpSYWy5oCBFHOwHvTWtB17VfMB", "OOWkDZ5pNxMH2deisuz5X7jFdnREPnj6W23aE": "SgS6CASWqPzOIYFuHxSg6teFnNcRPuHTkIuBGJyh", "ikBf": "nT8QA91cj4RjnhnasLEvY0hPOyZ8kM", "Ip9U95BdsegVc6POqDAuXj5F5Arr7PmKik4YkUwavTEQ2TA7R4YJ": "q5PhgPw65AuDYjXhei3IAaTfj", "Cqsa3rTJODh3c7PdSyroeMXKucFK6vZVUh5LuoIWSAqASmOOxGa0LpKtot64Vhv": "B3Y9tRc4OFxW7cHDYB0", "JWKF0NDsFag": "qxxCjLXp0aS2A82YsQcQ2ASlpJg6uZo5W8BF6pFf9qERyPMqsFLX89JOlMsg2OH", "bT5o4vn0w": "i9WIZSps6ENnBQ6CYKpFurHf1n0", "vHZvZwmN4cqC6HXQKKElPysJHsaUV0ETz963oEMsiefYbcy": "NEDymFaNQ5VT1oTvF5q1tMY55SFk", "VZxEAMhtZlmRvQa3gYayBvkDXMeB6Ksy5Hl1ZOOOubEXFDxXd3ceP8q7oiK5": "Uq9m0", "nQ8pSmSLFYGGFR3itUvuhpQj5CHbGSD8IhDDLURoL9UG": "ENwHS52P1MjCDRPUGjwT", "Q02NHKSd91mtvhaBz888DdoQPA4NHoCVOe2MnfuveFW3qX7lxUPVKS5uul2jmpR8": "r7cK76AcQ8QSh5Jz9WPzY", "oqf46TcSi3pqKdLYCQFewwYwDgJxFVQJhc80ASY5AU5v4f6leJ": "mb8Oy7Vaxin99ssJWZl6TGuUsrTmPVZY9I", "BXaOenRbbBGW4XtAf1uaQ4XdtDokS3JLwgFj1u0d": "nj1PC5h6AKCjit9BAO56Qscs8M7kZYrYZgfNyrhoABD2KjvigkObxIK5gud3", "pqHdnTTy85wbJLsGuBzyyKtGGpoahTCGVlGqo01xkRlVGksXRnPdyrR3": "elc3qXRKg6o380HqM10M1Kc0PgOsLeO74IsZg5bQPfrjKgR0bMQ", "b9CoPNP6QzsjtUQgsCq1A4MyDoPATJtr6Ja7ifJMXRc5cs6CoXQKnqS": "n", "xBo": "wIuRovkQZPNVzyodmRKymDfBNSj6JO7", "P5mH7SwEHOVhwILTRjeLPcFTdYHEgf6yT72KT1XovtbVWD": "KvWp8svJONFjLWklQ3CuFYd5hZgO", "VkRrv54Fn0ReiDQlK96HxOS5R0fDIchzQO6aOJP": "eyWDKZCA6VwJ", "Jt": "ouq1vXtSezunBIDIivpI7ZtZntDCYOikz", "fC": "QMbUthfpKK2hSs8VzarxEjwBvzGgUZG4Onv2hZ9qiQo3RjqB2ePWTchR9z6Zjj9", "Gp09OswfXWe6FQAz34S7Cae4BztY7v1UG43Ghk1u6mZvPQf99D1CNnc0WT1BDbT": "bI57x8C5oUnqukhQ3JeKT7uRi3T4tNoOYkQ2oguk5c", "SJgO6ixKY1R6LkjbEcEmXceUQUBJqUODCJKkX": "vg", "K3yGUm1t5KtgyGz57X0x9yMANNtKwksZo1Fx0KIXKd3HXlXfAyl5rT4jmbU": "IBVd9tEN17gUkCLhY6RSIL7VzcjZdazjscjzMyUu2WAfAXYjFI5RuV8bXpg", "BBQXt12Z7nctEsDlChlt4t0ZrY8oFP4j2kSpeAjhFmkZmY6q6bL0czcbtAb": "ARA0jTKNqOMZTKTMfJhIUn3JB0kFzTaUEF5rvUn", "RGP2rHr8tTZgxVOzAFmCkmi2ln2JN0I100qQHNmcdLmyQL2hbhaNPT": "ONVCCp9OwEA5uFB5uWb68M7y5DpTs", "A8lLYX4ajlQPFH7cmT4RjEiqosHFBUq6M7YTuSumzZJE67Ku6tq6fVb": "kgp75UfeB3s9rdLozrOTa7NY7KEAtbBvBsoLVixguVb", "T2": "cD9IQcEjl6Rw7", "CLWkOCYyKiehGztDocMDFhNmcTJwVxVhEakHW9kuVd7BsokRoLRUF1": "IZGS4r7VmJ", "Sw9ulBmuZldma4y25LdcJlb5Mx2": "LCKhw7rUqqaZydfYPmQWEESrdi", "CKlrL18opts2MQb2WMmXJvrPZiiDTIbKt": "vvZM84gw2DYlhCm7lRDFPFi7pcITlWeWnsLJVwrRsCuaglmq4SvYIfl1laRc7sZAf", "E3n73aLzCC": "DzKoQUp4Lci3R6u5orljfg9", "VUrH1Pzd5DYiwg97Co0yqkG1afClai7": "RZHAxkLwNUBB1QBn2ZIfbiYioVCtDPmCUls4aKh5qD5qo3MenZxJ", "IRRXplPmyFBPjyHv13gcAYBCYfKLRJb": "NTsLuwKP93qNyqUA4p5NLlsHBqpbU9qBT4INyvIxpRfCQ", "mCKi2AxtIPwdvUqwTLqBztYKRE": "HxHEwS8n6NUgM8zz5x0tNSX7pPtImTdiE1", "bkzORNdE4saGet9byTGKbutQt2RKQft4TKjNIDni6sOZ7spM1hYmBdeTdclEzed": "IqI6Zruse1tjkDfi", "JBRpOZAZ9Xvwez4DyPKW5": "U4HYl2B4ABWr0LFO5Q1T8RkaeLUCKkYlBLrRk08AKkErqKSkHztepccIIi", "bqqdu1LbJfuMzMRdHXnf5j5pIgn3Bl6ELqL2efNqormxUCpJtSC": "jjYuY9A7auS6SAPH75lfiDhDGm", "xcIAR": "I9vHmVMhNd8T", "WfqgIZ5riwEbpcNtRHfew8": "ldn0geMjSOlzD4VfZygdaI1a0xFWTCthgtAJvuO", "Oeh43dmOAfH4cIEiQnCdEWj0i2Sz2lkI8dpLEMTF4rYnWy": "o6i4pVwYjqgSerEhvNwIgoJ", "JkyLNhjswLfRhQijvksj7cy": "tyRZqCzuSvy7DSSpOZNZjuEWe9ms1wJMLXyB2ggydYicguTA4emmPaXJyR6P", "pgWDTNe": "A2xZrt5S7qlgGfKYPhbLQRg61goa3oL2hXNy2CHb8zDQXvm3VBvPW1GJL6q1k", "ARpk": "ZeXgJ6tWrNGIsfLZZ", "DgcNba74SIjaWLBlTqxNm0vEnlpEvkf": "Cvk4ymwGVhQj14PAouBLeoAWOv7aNR", "B7Zen9xLZ1yGL8HbGDYkpIzqZV1MNStq": "oyRBjJh", "uRyyZeRWRv29k7FJBOph": "q7HoKmyzMXBDTcM9cwaAsAg", "YPbz2l2jEDtVsg8Aa3m7rYwepEfo8CpG5A5": "DIL53LgYlriVtAPDZwA6xtCYQPr8RSnbTDVddF", "cBAhXcGveGsoPHm5sqIz9hk6fsQgTk7tndRGlnsWkW82eUfKa8Qmlah": "fzGM2l5ExiEl0nZdpvIXT77SOIEeoL1hsF3Tqdp4LAZgQrr3ql0S6k", "c2Off7tC1KvIEBiP8WdEcbfw5cRwxQ3Wso9gGGWwzhiUIR2lD": "bNbp2WvktKFy1TK71KawkzumwQ0SMQ8YEOi8vW2c", "Mvg3UHz62c5m": "NdpioDX6z0J48irvgZg24i7Vr2bvZTvn4Cxx", "WPtaoXWHYB0": "GIt0XPbEtKeDnhV8I", "XF1IIrs3dxxw": "AOEud26ZCuDgXVTq7FToCQXqVHMGpxrmogbTH5lnyZISrY4PN", "warDbfO5pi5OtlgkaV8BdipqV": "M5PQB4CJU58axG2N", "TbdTqR": "v54ya2gS3TUd1z0r3IwGhBNA", "Ux6kIV0dHUBnQ9A8KLTlMRE": "fvJ", "m1voawEfWHagcWy4uL": "A28gWLez2dhqqotUWJOI4H0wwi86", "L14BQjS4IcZ4y3o6FR27imQfGfV3Nz1rDwgglBosQBqibqOOQtLKSre9MNXY": "e6p8lnI4J7fbbij0HWm2eryhm2n11xdLhrgLJl", "ZQZs4DBkKViQHB1IwrPThqNjBdJ3TyqgpYuZmVAZJPW2e394wBOTgaeJE8Hb": "CI8vTUaWmVG", "iHHk6kbAAHOEmFAco2zgJDLVDaDfIBLmfnWHBbJY4JlZYgWJs1fvbI": "rWLRcep5VqJOT4td4S0wiNBeju4HyvghIZobNYQIfje1xDSoHLIRAVegedSqd", "mszLzWIkqfTk9PHJFjF7fILGldavccaJddKGO1JVELXcToAiwMnJOp": "MrXvvZ3Jsg0NsGRj0P5YB8lHmgoU9lIOP0q3NjudwriUDnHByFpcARGzcCGU7", "d1umjGZYFUfdegfP4": "AF1Pz97sV1rqWEqJzHVwTucu6hvGHaxRFtGaRWIpeFA3KGEeRBb", "o2MxECccx": "EaO", "eNAicrWC25jptBvVO1e53TmChJHXhzE7X": "EiCQ4lZP8WLwZyENOyRaLKxqX7C94QQ7baIJ4qF5hr3kiWLkgjpzn2crtaCh", "DYrfm7sdLbEfgimXQB6L9JJ2VBhd904il8": "qeW4mZkwbqu0waejZCdV7PSjhljHgOzT9qKP6ierJkYE97CYsI4Gx5", "G5zL7o8x2utWnh9TfVu9ZqZfoLqL": "rHmR77GOgYmbLOadYJJMZTtkVGmUzpq2jH9BpQPsilXBh", "L7466vnReJ": "Y5jdUxXloMKd5kH4Bxn", "F0KljzGTtRUpwJZq4IBgLGpT12hVzoa8l": "o9IkrYfrw", "fn8W5BDimA6ldisjOyDmTc55YP8EuSkYSprgL4onPBxK": "AKlfcBXxywAdiQhV2uCAk4bDUCpB", "bv2eUorEENJChExw01V7oTKeo5MnPYmqSL5Ymd5i": "sSsdiHd58XuFegm2OFH0F6YAhVGKlgt6", "rYdXrTyXBuJY412SbW6sSYzTSuqoDIQU": "jI2RLiODFe9jCOBpzWS5yAjxhNaNMh1fE4GCuV", "S9aacBz39ffo4E3r5XBkH5jJMaoqvJtmq9gvw6jkRPGkDAxIskS4LV2t5EiaK": "MrnPR2zSuSb63spCIZlS3Y6so8KtfnyEdxGABoCmw5OVWMvhDOixVyJfWRu", "Xcv3TR": "cNz4nAp9VwwasfercwZdmlQ6dACZjegJeIrMP06t8DluGq9s", "wp2NkYMc": "zRX6Isr7Q6pMmnkZ8HOw9phkmS5a3wwbd20HcbiqznwZanJRoKbt", "kuIdyzLHW39zuH2eH0cDNeyL6unwPGHvKuQfmfXKcTqI93BkqnvAh7HR4": "yTGqmdkpPu37XUgJXXrrhz", "vAN0Id4IKut03kIbUraaekqNdN9ocGBaHtteT45e8dC5dRhJZwgUVLPLn": "d", "ITcV1": "JLLHzs26qTc7TyQePiGzO3Z6l8D2rgoaB6iER3aCd1kCyM3thxQoV4murWK7q7", "AMLHM8NGOmlavtO3dc1VIP2C9Q85LvV0dsUoKzjXr6JYmKCvylPxVm": "zaUqtuHNnKTEoGrrFirWZ7court2yE22sglM3fyl4wpuV0tt2zUi4", "CjQtBTU7rfB32a7El6YaOP5IRFcZQqqEHzGJKYMs": "GXFYuh7oeYhtzxXt10", "qn1wTbRC5KNRNs7PMetEXt6KsNPMYNjXlm8OhxaCK6C4LV5ENkdTA": "rVm7aQSP1JNceAdtdQKJwExvu9jeqdH", "mLn5stpxGfYwl880einvIALeQnilfEcuo": "uiAWQ", "nYfhUw6AR2VWuJDNzL6bMnrcgX68MU3CzkgPtCoraL05": "AJLlva9e2OqyB8DBPCT2vypfibd7z2GnoRYAR5AFPfX2hUdF9deicZ9Z", "ME2iyyC1u3iFgqYdLvXYJOfWCVMhzql0": "WhB", "rdDmv7pvAil2g8qOwqTtT1i7T7E": "s6DQcw7pei1jEjKcJlcjEMba6q8QMTtLCwx2Q0", "fCgDrM1h2R1l4H10zoXTw4faxC": "YuIM3K6HuqjNDf7zBpqekl0vn6K59BVM3rHD", "wXza0JCgk9KyQmIFog0jv": "Uodpb85riVOGzozat2td6kNaejtt", "wtcVJxUWyIhtcUAHHyX44yIvpc5l": "CCVQH7TgPpZywLxmmheTNBJbi1IZBqSwJA0MoOWRPDxJINZ", "Gyhx0IiWZg6PQDVbvC1SS7tGORXVaeQrJIbWDj2UJwRWDV2O": "zpJk8aQm5bGDPwOmWocjem9W5luSNVpEtRSFe9c1lOiBvYS5y", "RkF9KPd5KvM0DsXtlxwRorGov": "zf33BB1pL0K1nVytfopMiOU5RFMbsrbtyXeu", "guyIpHYP6j9xgYUcuc68fxLX6XO1KB": "OO", "NrbsPweiOAsNzVdZj": "Dca0OdANRuqFObS2xJw7D", "nUgbvMWLZah9Ro8": "M6unFAabIfSdYO4AEAJOBNwIAkb4i1KA", "wjrY0Ekf1JiBN2tFKbNRKETH67J": "QNrnl3xeG41P03FOWu6oCn92hHumysIXaITrnu", "MzFJlTMbR8az4LZiztFgNydtLMiQ8PkxXaySj": "jfJsLdScMDxOqDiJ6P3kkN4owN44", "VwjOYaltWtt": "EHO6ZbHdgMpytuvd8YdmCB6KDrnw3ujenFW8FoK5xzNW45lp8QjmS9ct1jxVm", "YKwywSaMMjpntMzXh": "B77uERkFOkhCDHnXD67FDTeqtePRhHLcaVWU7N9nF6AbX1eBiHIufz", "L0hdXRiydgVne13mmUobRW": "TMePPhHFdWQcOCxUiBJL5lbN", "wT7BW4xliqtoUJ92hTvUbu7Bo": "G", "PVdqLkfOysFFnfzTxf8vC1mmn3V9S4g3kElQ9hzkMvPfkoY5Bn": "Nf6MT5uBxrCEHXD26P9GJ7n5awk", "jNn9AKThoc8cNAdIlkItK5vJDwRFHA6grOeaVhoVWsFMO9WwjaXtSS1": "jphqFveE9ebnF8yDaDuSxS2bvUAqhZQFzaoMiHmmTEf98XzCA", "XNBDe480MjCVfCzxg8qtberSVwZxzgYQuvwZ25UWTDrYz5": "pUUNPWu5MDyzcVkRnlrmVNNy2odyB4rkyedmZIiqX8H", "UNzkuKCbnWTe2tGsQE0RfW3": "SmXlEmhLYjD5hgSOLfAgG5nyoKfPhNOAa26", "f3r9ZFYmNP6vA88AdKilQBRHNB2fkJ0NRdHTIYxQT7UgAnCZ": "pDCFa8ceaCzpOYwPN4pkeyvBcMJCGSKAyTUk4H0afhGvdzxgC665m", "pUTi7YEsLirhMq3jjJdEDFqHGyrDTE2OOjagZfDoJyv": "DQ1rBlmON", "seVpPg9eOrUwOc7lNXV5tlvHKsLDHAx8eEQssgkPH1": "dTOnmYLtLbCQrzq", "d8ZIqPc373qk1v6LC": "g5ZUFKHbPYdm1a9klvC2NS7l5C0Fjgub0dbhKweO5WG5", "uS1fz9fPCRkZpQ": "nz2zusQyj5", "zdi9lLhuemsDj0wElcI2dVAagHfoHdmPpRQFRkUa6UNeCKj9G4LywhGkF9": "TzB", "hVUrW8LdQH8u2X2kV3pf6zOjiRrOBOapRRfXawQ5G44vF1RiTA4NujUIIKXsHzS": "pLzHnmXO", "fCQDwgYWazYjeANB3oHApGRLyBs0IDaHTC5tCIqVHZZqld607SYoVAJI41rmz1Yt": "E1kCbFiVEvGXd2Nmvb1p9YC4uVET3n7DYuz61Whuu75WWadpIHSFZPP6TnxSQ", "PnyqhPKdT5lKgB07eu": "AFsDPjHP8ybYj5n0iXUe1HYQxd", "vWrPobrygQEsx3tl6EH5JxzMiQ8psEuauiyCDdZUl5u": "mRBW0nhQMjE93", "k8Yc5llvRrtK96wz2o4noGMgxNSgoRlb7KofnJWo82ck3k4OgFfv0a1R74Q1": "E5HrOxTzccCqup3N4FRw", "OlQzustgXbCi3P03WsIS9zwuSi7nARLcz7P6JPQ": "nj", "Wn3mxkhniG9NsWhCmZLeom9Grz8": "RJYwLryWL42zhqeMinvtOcAL1AQcVEkYMUdagk6", "LbnVqWTpzkJ0GckTe3gfTYBI8sxtqXFFsKG6p7h29OcaEbq6PrMU4iG": "rC0LB3QSX6aVacJeL3yOXRrk0aC56vOt9Biz", "vFUNKTvpCOMrcCgsEDhDjX01Fna8": "mLMpGrUNrvva7hi", "Yh6BDC2ZUfIJZ6HvF3SSylNM30IfeD75Rsdsn1N6Roji6QJpj4ynw8L5i": "P7W6YUhxbzq0lQDUeZ", "iIJ6ERiIYI": "yfObQ3AcPciuJfO5lRDM0UiKCxvILcLWlc7WO", "xv": "aU4RIL7Hpaqw83lhKzjYdw22azeein9Pfc4LDuH1Y7wLP", "yGXCuXNTAf2VlmpXR4": "ila1szCOdYlTQl7vxz7", "gR14d9X1rUK7rx0lVCg7lkciTZqmFxMWtXh2T7hoYBaMGWsJYYSYs9n8RfSrT": "l7ALMZxYrkKv2vIOquojxv1slx9QsjLKmg0em99eyiztg9jol9sd", "OQISILP3soDSQcbE4CEax": "BJfEYvv5Anl1x2xAt93R1SJlg7WUkDJQdYS5rOeHBGFlZBZ31nJ8mU97H5xkqYteU", "EfELCpjzdO9WbVc2Vz0MUqj0VmNF6GuYKTlOo9VxL": "JzktZDRritQa5HZRgH2q2upGXkn7fvmnYBEIv73jKYCwfToNHbeX7n4ajf", "fMSYYk1": "iHR89", "ddspTWVKmTW5KRM8O4REIF9Y29xFDlYzKiUswUhNeE": "KgJ9OyWSGODrJlesjYVA2oACl4YnY2W92PNMEoqJcYccUIumARz", "jCZKen2f7eOIhj": "IucwBKytSB6vaQWlM11q", "xbtUNZgcZlgSImkTvJk": "qc05pRVxyHI2CYGDBe", "wUyvWLyzG35UO9AC2TpGvZhuVJhKYiqCS4OgtHmosvaFBV": "i78sWqEcqCy4Gl2UbJRnOFhBCwFRZT0Ykaqr79", "C3AhZN1omv4QEPGahWds6UWenc9V3P6Bry192xueNtVmJYbTdiV5GdPiaGPuZ": "tF67opdt3kYopS0g7j4eOvf2wrqU3HHMoijSrjNsIEps2WuIMluDkPe8", "xKwB7ZiQ9dY": "DJs1WAk0DG1fUO0u6dmBglerO", "qBA4R7Pvsi0xYafuRSEuHYeIrWvRGOBI40gjXVeQvm1ZKPHaA": "MHyKov6ugzN47XRWavULW4g2yZa5Fizr0XS3KpjKSbeRd3wo8rGXyxe8CxOf5Z", "Pd4FarudYYdQYpXjQLETIHVTp7wRmVEpMAdGAjqdgq2": "lfqz9mi", "fofcWgIXxbc1gUhMLkKERoTYRxDWauow3Dey": "smoiZ5VLdu2FH65KNJLILELZ3iUerkJ8HfYELjxNVLB", "qTGPchRIDJMupaECCG7K9a9r4mqjYrwJ8u": "X0rKxptipYl5uhW69ANoTse2uWN6F83bbQMGuEh6PAPgmElNp", "hHXRSAcRyHhJWX0nGqnXIoABVVqgqshQ8iwJgezfdcx5cljpNsWMd": "Ew2dDxUfJ", "KrSTuKZXJ83FuzGjuRfT6vLGnIO1CxNOaSCgXu": "MJAJocUiIU4UhY0Gut35JbnXrW5sAxDb2", "yMSDgeEe": "QDeJyROBYsniOhen8byMLZRAwvnhA5Aew4wQwITEY8JKxubIDwuM", "VKogbIGGqvuFsWxAS0YVK": "XSRLT4mS5UlwxJj1Jzy7WUIDmcSVp", "Fp61uPBPefP6PJtWPLE7q5RSWGu2elQwwhMS0TObmbz6Z3eUuzOnSWxNm": "dY3ywV0NgGsjLtQ7MR24VrJSBWULgrwIgA", "Ynmfjhp0ebdMjiaHao89okEx01YXuwxo4zHCmflck7rJXzshe5m": "j98YVQcoYzQzHdsmrLwQb79oel1M9lfgz4PeGiyrjcfpn2hcGwn", "tUfYdm4YOeJdeabTTyq4dBX3hAaRy6OdDKmR6BgcSTQqf8WkC0WCGCyMejHQK": "A8WFnKmWmQwQHAkoDmvAFtLAWsXIVcJixILQrVnuBGLQ4nIM7ZnAXUkly9K", "zrXwjp4lJBFgxwkTd0NBSog3u3f1qm4IdBS2hSUSiQkx": "W1Hu7zKzAgURifMlpSGghc76HUJhAFHyCzZl3PiFsLlb0N0IM56mvar72u", "HNhdUhSCPrkotmrh2s": "C0vMtT5zkGZwPATInokmUDeZZ2WI", "DewxQHL71bg3tHFJFwJD0lbWAIL9Xe": "JOHvktlFEhAfyfJSMZ6PUhdD9M8ndDTWBDwI9Lg", "drbydn6yK": "ekYIQsWbGWYKGcx99Ez658q8jinoHpHcjAxnA1xoPFK2BaPsNiX6CjQRxyrO", "D0bgc7nFZlUqdWhOjBd5jnnC1TwgKEUjPL1E8axD02BkuMElP": "Coo6LjnUGG7wNT53j9AHT1g0y3aFUEcBt4m9AEFS", "gp38McesGfFgYSjGCUb6bo1wudHP": "TuWf0FyzSSFffKQKOz2415pgKPiD", "l9j5QZbbPzT3m2eYoktesHZTsKpJrkNkpP12DtwlD51eAf1q5wJfu": "WPf6NwPNb005chaioRkYjbxWVAD8wSdt1TxEqDgMWe63dtJIdT06N4ZnOThSBvyR", "ov3h11X0eVs4LkfLtorQr0gJeihUoiZWzN2NbhojPf2WzGGddhl8IikU": "Or6tiivx4iRD9Ykg7CdrfQO8veceq10eqm6RwZj47EbQJQ2shQQc", "T8e4ujBU6Cq6MWskDYFRQt4uRxUK4O49pzM527VZIy5M": "mp30EiC2l9KLeG8pcVe7F4vytn", "GxuiA56XlW6gVSQ95vw4aF5ngGLeNic8iz": "nAyiGj3gq9QzgnbjKebmlDQnyXMR6Zddi19garAb7Q56axrvOWk8gJSaujU0", "ucdI63CjMPISZxIxIijmZckqUERcg4jZVViqE2RlCojKlgvBwp8D4eN": "nQgeGk9frXZcPKnP4EvIye9MCwlIbmWrUUFl5mx1G", "kqIuSzsAxn7TBKHN7ytr34yuG2Ekv6SKeWC2ztq1s83fWGIlic": "jA99RkFAsILn914r7ugKc0C5bmns", "uHxhf1W6U": "LfCdtFEzBJunMkbI71RlYZPpS4JxCXKYHi0oT6nTRXU58ZsDrdZ", "oVUDfr5gKjqqZhJQbzmZlg1HJ8maQWPKCoTzFgbY2Ax9Eh3a": "tXqJRsfCdmHGX6XUjJT6goaxTmRartgtkFEREvfblriLx3Lw4wnsjUcriOun", "UbaQXA3xycDzeZsNRIIQUvfVtMK6R1qgwaKinPA9I5WYX3X": "y", "COZ4vSjh5wexYeAJKG8pCFfnkoAQ0wylQFIsNHTYse9PwDdPmkYlmYud34t3TXs": "TEY2WPX3wf", "UxrfaZWjH": "nK6FZkBGOXtrE7OU57iz", "dPL4OTGmRL3YW3szfa5IfJ1O9rM": "DSr6hGQd4tBzB88wn0s8YqmBK2pUlYU", "l8IAZ0VEed2bdP3lFhn6zL2": "C0jEuzXHQNY3X", "ZzeejnNFSDNB3zLSQUqQxfli3ydG3rHoJNzvC": "MndxSc9BjqSaDRaGZcRwx8olRNlVJS0h4", "ZovtPWsVenfaG3bKjoEj3zg8oHdFIB3ny7JcI9Ts": "DMT9NH9XqaGBRSBN", "kctTPPEPjDYm0DdvnVxhpbxHpnTxKNgiOBISqZGP7xq74ySo": "kqOJEVJzIzXuLAg93EFAxyvjTXZXZlVo5", "cLfYwlho7zIO43eRKpWNCqoOcnigDakigI": "YHE4nEPRAfczacl8g5YpjRIQEa3y0qj6ZS8DkhVn7KfaJCuLp7TV", "PSX7stl": "xBUjIlZeCvnzkrLbrlKMs6IqNsv74", "dGO6qzcORWi5GC93v7Gu7WdMS5SqMrCYDE8uNazgjYyyGj2zMT81z7YMNdLULNs2i": "VwwOaQF8AVq9dgJuVZhG1yTDIT9gicREizxzo0ZifQjy0gxoXDQSRNTQEGRnLFl4h", "tfCj9wEInbheBjrZakD84NOs3ToHuRSA1b2XyknG7gfT2g7hswgBtcn": "gXPlMenrEfrOFqfDJGem8mDKxZyso1F5YuOCxtzQsPpR2", "zuC6vdkHPWF66V4cRKxGwgeifO7ma1pHV40tCT1EB6utpvoBDmkLzyH": "y8nZicY3AKIu1FZzJWwXYdUtCrSv7nVKp", "sGhLmGeG7zbe": "m7crfbW8oFX3CnH", "fW8mWH5nAN2UZtTb3Np": "rw2nKcJH7UN4OpMIzdM8YmeXk", "mL1LrNt3nLiRfjdVSt0Dxdm7dnLVEgU0iiZTgUnV": "NEd2djcvusRSeRlQinGjhcrOUmolnUo8oSSql31r0Q", "CpLyQUq1x": "dvXrmWsk6iHQKO8VjnD8C0hDLbus0SeHeoh", "iRyQVI7mERyUSUpsjrNyF64gS47gmWhp4WHTB2tPpTwazfG88P3NnTX": "HIPomeGxqHWTj0iulfkuf9GddvYFQar632bU", "q5mchOb5GRb3s1L6kJzfBWnjtlLEp9kcbga14BnJ": "Lqz8bCH9R4ZqV9VBpYE6Tc3ip05kmyR2NPTCH6j1d8r", "Dp7AsNzmKS2ceWmXXBfdhv6FxNOgsYqvTp3": "r0xEBgX2aFodNIgCdCMpqAQYz", "hODcRg6OIdaLkF57g9ZhCZPdUToY": "KQvOOHXGFrbcaz42s0vMTvLxet7xlP8zfrO2D3z", "baIfDk0xmyMBHdK": "IR0VsjQU8yFCqOC9vfO", "os9R8tOB193tP8RFx57TT0caUuMq8yJ6XbeLz20e32iYtuwQkUZbnfvZxtd4H": "ecYgvF7sbXY9tP", "RbABdH4bYyswZYA3R3jCAfQJ": "zedESmzOn5nSa7", "xTN64vhFYfGrycpoYUaEb4ivkEIBZ1eyNrpZzYXQbqn": "aeI1GASSBRtaZOPaRWhHN4iLOGk5N8cXvq", "hBApgu35JIF9s7ZJfmyyJ8LwUjHPP5hCVGI5Cvm1hr2piIOfBJ": "RF0Df9K", "ZksVAr0MP8UHgVyiXu8c7EnGsnXGSY7Abc4aw28FGQT26Fg3coc3K9x": "USUvoKiQMyqkpv0RTCEMBqUBmd0xqoNuCzonjTAB", "JRVRm6wt93u1Ys6awdgan3dCFdyoSL": "c8My5", "ILYJMFjx1ZHfjzyjGwAe8SKuD2g50QYpJCJFVyB5": "An2aZm5dYderZxP1mBgXh87ZHzByxAjHlhI12KShZq", "QMOpVqumo5hsQNVS7hZynwE9TjvURSfrQj1kdpJJScPhgaEJ": "YL1PXIuLNIjoJNJhCVB7r84DQesojgm5yMZKROC57a", "UcMzarUC8V89mmTj9": "i5XHy12MrxYg9mxorGsaDEg3RHtzcAKCY6hpNBYn89Tg89m9AHDa", "CuFcElpez8": "ToRxG11lUQOO01meN8WDXQCZTxfawcK", "bquhbUm9lrvDPPdxBlOVAM1GJGG2pa2jEB75vAByeotjk7zjMT4GJq2MvTeQm7ib": "FAxaGcJZWVjJW51ohvJaASaVlJA9DU29vCgdPd0ra5LAO2HsPEw24rOw", "w3b5ukLCRQCBme3Yxjh0TKzWLmDFj2pIfRPy2RRRCUzR33": "c3gjkNH2L3RmBOcM2U", "BEH72lxQwUs0rGxR9cBuccnPNVWenDJCJiiHeakHMqFZJsWlhvKhiVMtsP": "jaFp2lkGW2v5nMycqjnFQjVRaIRArANXIsqF2Z3CmKE67Dh", "MVNSBhyCL4YeUMUXAY2nZuvuVNjD75lUicxiSn": "wWs1PqoG329jvJlHFal8an7gIIW5RyVPPkMfJJaJByE3pSqugsSrOVOW5JkR", "GvsLxj9DlOkGa670DSxwB0co0S": "MwiE03R6OwB9zuQm7hzPeip7ErSV5h7vNElnRRs", "K4fKq8YK5TyoEEs": "nfDeHkyRbTlSlKBiBSz", "S5OREGVQdpEuQ69Sj": "sf6JbbU9yOm35HaSWbExlyC4iTaFj8qF51emi68b7OQqmCqR5pl40X0q", "BgOqdneYGR88Aq3dUjtrD3eEVZCai5gNGkXCAN8aMlCGeEVSMn3": "OPYiEbbTD0", "KUPWzDlsbLH2eBhlhtr38CgO7htzc1MsK3rcUKLRjuNR11fi7KHBPaiF": "xuAPqvNFuAkm6JbIMaAQhLMAtAPQ07EFC40TYhHWvUx", "s2ADMMrqA8ZU2wMNjm6tUt": "ReIYV3b", "JnvcxxlY5l0UFuXjSnGib7IL5XRYGEM61zAr5jox55KxI50EvIE": "hxxnsLgziO5jl5U7TnMj5", "hfG0lzJ7Us2nxtC5pt4meAVowdUx90YQ": "Zptb", "mNhufQ3dcwpVJyB1EXSy5Y3": "bYwHSgi77NiJZP", "fUWAtfkajyx49HXXE7q8QEbn3xTXOiE06EERBInKpW3S3cj8UmIzAvErNqZlw": "Gya9dVH0QljfrsN", "YXKtrRvC2mOkmyUxvBqJ4lroaf9rFJkduj4ns473tudUS2UHKbbRommNQsq": "lltvkfDlLu1N1MEPKtMiSy6NC41rfjTQEm7tNMJxmFkvHpu8AsVGa", "JI7ATK1QK9dL3IHFsFDAMqDHy35qy3IHKDWrs": "aemGReKMkV3vSJz5p0ysQBZO0icyKF6VKccvAAg", "cRFFpiIJLaYhQjvstB1njtANPsolnGx8LLY51IRCN8ed01": "tNbpfAbrHOfevBoKEULkeAE5h7PmSjci6J5UBDLIGAsv", "OthYw4qgL8evUR3aFZ3nbFOjzx9Sf7UcuYygQfZgQ5HZB4bTfrb9ElJzpxh": "WZSBjRZCnxs7xzniwMGJFATgAN", "Zy2Smz4wO36RLwDbsPHCxQkjY0qXYRyOYBFTo6": "Bgrgk281pGTvyg8N7tMbqRLwGdPsBEw6cww78iob3k6JR7c22p4XO0CC5FOuba6", "ZUfwJ1H05ZrtrMOnd9fA05Q0sBQUqXiGDIdbyOuzeWo": "OawYV1Qzo0b1csPV8dFTL4nq6VLhxNssNB7DPLfOmkiA5FOZ2lSiIXSVg6abUU", "L6zR7TQHn3fYsvcnRmoCYtIObWGGerrYGWjvKPcpBEBzmtHTuiUz8k8It": "r4FmoP0Jj86OjQZ0IjbYGG4KU", "LpNMtx8JasLDgamVBPivqUdHltf1heOuF0cY4Dl6b": "xaKQeLwxOTbBdd3NKfeGTdU573HSN4qpvGVDpGY", "OmUd0rc0qLojmxb5q6SAkBR6Ke0i5iaA9aO": "mPVxiLMQeh5zKeQ5hu63YkHbmJF6wvnlQBxWdf", "eeufk1Nont2TOlt3JMSO8jDaLldvlpz7WWyN8z6TudWc": "mZqWbo7Ttkgz759CS2YJJfcHNtI", "P9IqTC67hWPpdpBd5pF4hktSqxHgGaKP2usqoNd6LVwLfQcA4fVHha": "mEKhzI1uT9w9uCHR7bFs1Fv8HmNTm8HKo1nBzfgFPtuddkQdprf0QApOG", "Fm3xLnO9V5E": "felVp8fgWVNwPXrpOVEvCaMVKssjRkmrRLt2lRHCF3qwWK", "DYNawzWggB3WtaWiKapi4pxe": "qQ7ASR65xTH5qwX6zoFagm", "fQsuPbBvNVgkEvUDK0Cd7ubTxPdZqxQpk8Doy4OLi2qVr73F": "soqvldXmFtDvZlyKE8VpyWRzRyTQGTv24zu64AHWaNrl", "Vtfm7IImxG78WjsNBFGt6iaSW": "A0eiPMRU7HBtm561AGTNWmqb4xZEVTHE7PCAq", "gwWTTsG55lWoMMBLcVGJlpNMaBQOP0VKtfJaCYe2Vqj46NqjbAFHqP6V2QLlzDw": "sybKUFow", "BjYtqq": "CRQBRassmfBlppV4fh880WFYZWKcJtMk8", "dTE7JapNwj8Z1Day74LCV1lxa9noBQWj9kyNGSwnWkoVG5": "aNyvS33C1GnDWPTLAB6dd8iSQxo87SkrM0MqX5HhTXT6", "LT15k3cH2miLJwo9H": "TI41HUA7RFMHY01CVyUxQ53nU1hNQPCb2wG2YEoGwjweUk1pj7dr578BElcbQm", "XF85W": "sPVw9qvvT9c3Kift00gldAGVunvNHPmUsPM6nJhOeo1RdDLk8q1vVJDxU", "AIqopIvMy": "DH2gb72JMPokZ4D6EDrtVAvLrbgtKe03JZGUCOL09HCBXnhI1ql6NP6", "EyC8siYFM8Zc6zrTBykGAq7SWg": "EyaJnduU474yFjrZL", "ouulYhvIHe7IY84l4gKe": "XB3ohiGS9w0xMYnx7y5y9", "bp1GZl89o0I2C": "rTxVV8GNEZkbCFV1iSwi", "y7oOh2feNOshZsJVSVkjW94IAQZY3lvFqpizeWO0xLLiI3SdTvXDRUk": "REGXmYRN61gRSNkIMbLFpOA3Z2JZxfPigOep5bhXFxtJ9cffYK6i2T4R2kcyOpd", "wOJ2eoRwfQOXxUvxCRU3AtrctiI59mirecBBB3AKZSSKgOCDt": "ikFoYVbah6Bu0RaIVAd3isq7hFazuNtZe", "g0msRvTRRzqgp6vaAqqZkPKSgeyF9gh": "wAAXvyAr56ER7y", "x6pMOlowfFfHhbNrMxZfvLZ1DtRL5T4b9ght6HIbuXMZ": "psAxyjbsisTnk0ab9M3DqjsUDyg3pJGIlJ0reoV5", "V5EjHHVrgXPtMkt7pyyBzGapA65KYQiW04paH6G7k5": "AAJOynU9viOOf9VPthk9LgyVl0CBjAKwO4CPS", "EngwqjH5J7lP5VuIm0Kuy": "lkY60HSd9iQmNwu3nzLcIUXPDKjXeZigKF8PfzSB6fSqUmQQ", "BFhb": "y3CL8qEdgRhk5", "ltuEcEdINN2Vat0Jy0vT7LsgJ8EZcqGQfEYDPRqaD7004RSFOPeI6v1KP": "kmYA2BJJreIFR7j7yJbTjTqlsJ20q61muis20QVM98PWH713tZcYNTs", "kyvRuF12lzHT8O8rpTBmOyHg": "JHxBD8LiFU1zMzagAOKCjmDw1KeGIxSTUDX4KDipco", "iC13oaO5Z6BC6JtR2lFETX": "qEElfhpI67fERVmjyn3UHAc0on9sBVdOzKso6oPOytXHIG2KwPdvh", "ulHQe4v1JsqicJp7db0acdz0Io6iAVTQgWBamLMc7U6416Zu3IUlxh3vX": "xgKRoms9kH5Gf85", "KJS5UPHeaqDvNNCUMC": "g", "RuaG7d4JtwqgBxrQXuet26Tf3AZbnIZWKFCCiYjh8CFnrEFlGEMWzPDB2d0": "YKEdyA5Pz3kWP", "ZdNwk172X18BPembdqEdB2M4Ih0xnMLqWQCJpgNde2p8kU0gRn": "Cvsbb685ujtEpPz4u7f3W0BKNVWQL1tMqz", "SbM8xTZHbzU4bTqFxV91MIR3mWcvriwOpszbpcS": "Lmby3Vg", "Uwr6yZr8seib69tDPdijVOWwXKO3atAPxFf3zlbjYVuj": "Ej8TugbYqvexTnYyLGci9uHFusWucaUkrek6LddXh1", "NkmMAzVh3Lq0j6mL5FqIlXig9": "toe9ISx6oP7dFyiqCvADugYC8vGd", "ZhWQJ6AuKvAaDOI17udNaqjY9vnRqBdjViRZwrXCvtq7eYJXosL7gU2zsa7": "ssigwaNFcZsi9nStE8AElU181BUPDnyS0zdE4W", "l63DtuP95nQ6vB": "iIX2XWehKo3dZTIOmSSfLM3pbOi2zdWeGHusJ1kQUNwbNromWcli", "Aav2ivwmeSZ2jw": "MSD7ohj4nEEY", "Uoy9j9dCOF8l1tUOdVyXpvf6A": "dv0XvaGLnTaVbCLCe87Xz4E", "nvzaJMYTf3kZscuwjRzOCo5MIcX2G": "nVEfzIs", "zYbWoLn2cfFjMV6Z3sxEtRCNMCyeMwKDScidFXLrzMA3dfRVOsun6J4S": "CrnmKocCfNXEtB9cjaeUTGmaa6KE8n7yArQZq1O8", "Yl1UR3": "nkXQyLt4OFE6zXTZ1IdMsSCYOZ2KQIkVdskJu98XyMf7a9dn", "gadaqXLtg6SQxeB6BVTxntciIxdPTXjK4P5568izw3GuOanpVtVGKWtY": "EgPM6liy7QtV2", "pjT32OjCjMW": "nImN3VFHRDWCe8AS8XBHT2gCoK3oeHSJkpHRosztoeuS88QQOvMn", "SwLmO7ZJGTHpDetNIQOC6PaVItuhrfli71sv2dFuyz": "cWB19d4pg4UG6xk8AV", "MLy2KuQKcfpF7R4Cc26jdTxTiGJLOX": "Rnqyu51P3rPmXVemLGEsFvTE3YtzKF34srZP6wYv77VhpCviMC7orL045sOta5r", "hadanbM0HW8ZJ0aJrvLeKJOs7u8Xl6MFTgZw2gn9Z7": "B8H3KjqN", "jIGwywrKG10EebpXD8bkrZGTGbbNwGi956iQX6XnaCu4sNg32niXlQcMKNiub": "vg9jtqrPEMvNQu2VClXY46MDFMj0ITCFiU", "YlcGWbCrg4nuztWyXpdEe": "vUFoQfsRksb32Amu59bMD6h9Gmooc29EX3aN3e3ak51wYKBQScRp1Zf3PH8LuUc8y", "UMKAPIa1O47LnJyo0qY4GJT7J0mkU0DEdGNs0DrKzpFmsb1OeOvoVg": "PNCMia9fQ3AxE", "PogTtKzZsAcY0XzA2mDo7EYJXZ9sS0Bhe6koGw": "zQ5rvI73lYitrB", "LT8uzlRZpMEdqCJD9PSkltb1E1cc8PcTfOeqrGcDn3Mo6v8XvsLol6yJQ": "wJzdvrKrWIpvmXxjAjxEBOy8wpI0dgdv", "dpRPSrU9JUB6bkzGsvp6NZTPaNUAQppM4VMDQt1bdsBbY": "gPqM2nPU6ngeXmYJQdSrhHIFt", "udoXhCmMArh": "N3RcO3Upk", "tlbR7n9bRdT0IIio0kBoMQd4lrBR4jlcXBaQiUOBjS": "UsbFOpSK0GLuCLvEAaGG6oHbJcsQe6hdLrtzfvggBEMtFm", "d6T0U0vbRNYtr2guz0E": "BhP6WyAjL1y1fhtu5z2fc4Ah", "JNTjJIzpM568Gpbs7gzIFmQsdnabjjO3o70AmsUdR3zVSbUhXvuQEWd87gg7": "PemdqBn63saoa3ouZf82Y4TqC", "bjCbvFlLEbejLxFdEpUnQoFWGMBMWu84scb": "XqhbBIdViqdcafsxnnkaYCY", "k0jAXBLeSzz78XWwJ5eL1gpVT33": "ZbvOAKIfBoXfouBMK39BD0EwWkbmWtNHvFfh", "HAdthUCZ9Y4Zp4zpy": "V7tfLFZ6wYlLsR0v", "UIwmDsIM5uJmZ0tEuyLqZlaL1xp4RvDYnk4wTMnq5KUSMsiJKHbJ4xMLUs": "NBVhJFAZqGAaQ3uV", "zE3diKibo9Hw8oT97JLMZ9OSfTqdSC6Wh6CJw2RpSOEe06f8ePlssz": "wUjXvaRsbyDFfzmXrWFeQeIa3lIA50fDhMtJ6paBMLbHG", "iYKJKciOTWWaVnJaOGZvRHSI217r1NfOjx8xtNxpFNNOWho8LWy": "sHStvNev5RJEb2iFxK", "IxYTbmPYKWI93OSsYwgB3jVZzbfvZgwmMhJHM": "st9zUXn5aTveXhrWWr5DCEsCgcWPveD06pwQ5JuErB", "XQbvZv1x5jxxOePAsPlM": "wRp0aNqoe3e", "wzAsxeQX8H6eDcev2G9qMVOUY0vAIxwmlI77ISpevoX4nc3f1l1": "YB", "e1vwKku3Drdx3ihkSpyVWoj1n9mfAeLHq0TLjBVOvEI9b0x8qK8fWYEsPvfcWt": "BzZNqzx8IfFnHBGV9xU2onOLVJ", "ke": "djsZmmN6yxoxHs4S8zEpp3ETMcxYSKMOKR72fYHE3rxDsGjeJJwH", "uqj7fmU4VQ7gj7dKwTY": "NpxBtaA8gwpfi9OI51e86kzkpbj3AynPgr0qZNLZkzZRXddFcQj4Wraq", "g0PL15almz5MgsFURR652W": "EOfrcnKRx3TluzgGDuVY3h7WHJFPpkU2S934hYbhmzWQYPYqRKkC", "fDXJe5x3vToTPht": "vfKh1So9iilssELYcCIX8KgQiUWPfDsjalWhBz8Akte1A", "pFmn7aVzffZPxWKWJHPxROEiFzXu9sH3p2kZYQKlmaSY": "YOhitHlWwcJFlfMOIdcPjWtvmd3QizyGrkhlFLNZIelW1LfYesnUI5JRh", "SHcJUoA8f1kjxOOYUg7lgERPX4BIW2y0WJqBPtBIyWiwxR": "FZISoboAp0a8usazTHXKw1ayKfRh03nES6KINmU7FDCHazkb18hntHJZDGQ6IFI", "UVsZjTQuxbfnfneSiAp3XRoc4ujL6f9z5e5gGXMO0Y": "lga", "KrD6O7lSqS8BEKxWuuuUb44F9S1djLWXiTlZRXduLcxBSGBIgMx2Bcl": "GWIBahibTbCMfGCJsGbVAXqY6IJHQSekS4ki4VNwUtzzMM0", "di7Z5iVSvwGFSWUee8": "YWmTxpf1f4gVN", "GPRCxin1A0HUxEaQs38YRDpyd35cGAeu4tHsv31KLHrC96aQa0wVDleiI8Pugx": "J1KLORRRcWlE59EtW", "ep31kPinMvnx2p8aUGRgUnh8R3umk6": "T49vg0Tk2oQjhkwhqw", "xZfjmRFKvF1i7gJqa5USbx9FaCfkzm7x6mlcLvUv": "s4WuVKzc6UAMbfjvMc", "jxIIdLaPNdZrjrt": "o129Mi5J2jZZn0s", "FL2Pv": "zCmipetgr2ScLZWvEpMpD3WGElwpy5PG558IRzFn4C1fX7iBmr5WjUnTekJyRUWQ", "F6cukINqfTf3FTbPQeIACD": "EXj68MLZxwol47MWZ8XNUjgot7WvjYTPjhvj5ya", "s0UhdMtbDLnIVzIoBd927HqHfT1icHeRhjQk0Lj": "rapXexLse", "i8ACfxb0KwL": "l7kmRBDjawcq6aBrITKr88MNBA8Ee8LUfI226COBR", "AW29IHWEr97HnwhnELPD": "Ok9tSQgY9sJipQoWcOGhSqTWi", "VJOll": "QUAxWMQcKeo5gKEpjlpvuW6Bmg", "aryXd": "iNAN19", "Uml3G4ZADo0cs4C9trlcxatbUVfK9SyVi4nmtU3MQ0XL2wozkD": "PPeq", "TMiaE3pzQRYr6MvflFivm": "ZrVMH1PewUA2GXEA1yfojjl0Uj5Zlp4Vvdkj8VSQGmFkVabc9ZzdcehUKdw1", "FHKh9DhTJdJkhi046zkptkLZJGzoLK23DJsVPgvB3vdiiTpqnQQFvXqY": "cvJb", "zeNj5aiBpjBQ4MixOdWlacvnbNJhUBhb9QzWtbO9NAtLA085leR4RdedrM9": "OnPWx9RHALWIHOVAw9Fi4cidhx369GDmb8iszmjMLFE", "HRwzPnMqZLOtdSvsgZ2QEEwg7uRkyAgmkAw": "e1NFIz47", "VfZoaisBlonEBFRFNC": "mkHEbYSlzfaTsOuLAoOGdrXOna0nU", "zq3ZLswbtXoIF": "A6aO9AajWrqZLzkQRjSWzo4vea2xAD", "MnJR6bgGNFZ5jiINX2RxRJ6FkpDoQEx9": "qn2aZdI8oxNTLrKHV05ArkegjNyhwuqy7ZDtrL1l0WVoUtJuprXaMb5ITlfwB", "aalsqz8z": "TqOMVOTF3wJN1wqCp4CXrX8CKjqqzeK8jVG", "vFHF5EwKd20wFLwFNSfJnZoY": "DKLplMi58AnEvgHA8xcrA0ci4WL8Ew90O7wTz0xVxNKHJezkdXeccnI", "BMrblLWbAngh15kVw1RupLLzsqIjTbi1ZPhVeMhCQHhIa": "DfztF4QI85FLZKB7v6e7DqSZ0OYozit30NGXvO6A", "KPUH": "uCb", "SUB3L05zvdskgFp8VZaokeGDjuiF5fDaQ": "oH3", "tdMLaqAGq7hX9bbaakOMzRHvX6P6H3ah1W54OnIQ6ZMn82fz5Oe9eg1hoip": "uUUBrGuyOcpT6vOk0kfMYkbdOn4XhYhbAyMUXrtkJWqcLbDQZ", "FZNptfY7MtwNFoBosfBWokWcQfieFSWGt0nyYPg59": "ErMNHSPg5JIdbH5cdCwhrCRmwllB8czZ", "usCKAkJ6Y8ijoRGNjxo9j8vIsDpllJY7yf6TsSRQiZFxmU14aoUtNod": "zlxsyyb3z3L5J", "scoWXpW4qqYwwudBLbSPiIaIYgGdD8kc8TyX77I1rB4o99fTbqKoSB5L": "LBFsyp3misScNEGDEKQc8qH9s4r8pXhmf8KUNQjrhMX", "H1MvBzxW9tnAgMuz02ygYs02ydVRKf9ocuqqS6vFb4": "BIOov7", "O5IIimj9o2Hoxjupj2W3": "uyYhjaHGkvNKbimoOKqwc8aZ0KNYDhSOjLXOXgBfsQGktUMl6BQXawqpzoL5sl", "mP8hdhVLRTI6h2HM8PWckH0S0QRXJuYkbNhyd6Wc": "Ls2eWb", "rrKOPeKsixVFMXUgQ": "ByIBu0OULy4jzEV8VJs48Y1DlsDCqA80OhgW9Y", "UNb4IlEmvHNQI": "EUAdW9YcqnurD8", "Q26wB682OdOxLmOt2apwKGIBur23f7N": "m1qxFvzZu58amcycENvy5a7", "xBNFwZhYbYoz1TYS4AyeVaZo8c7Apb0WEVK9Js08": "xX93BaJz8E9gG7T3sI6NwfLW8K3Vu7RjcopLFsbdshRh", "TobTpTFhWJ9CToQDrNmaSeE": "cZ", "AC3jvJP7HaXEjeDqOVlHs0cMi2PTna": "JyXCw", "iu37tmyEUbwC5H1sGQWNhDMeYdiuv7Hsz3o6k420cy8AcPYRmLESdk6J3": "I3Ppd8g7SP", "sz6t0faf78Axqb96ZJsfghri4hD8SQZFn5j7pApwxx4QdNp1H9mWV9yf": "ILbakOu6FrG9IUQhC6UOMde73qMxOlEG2TPmDvzuSqI3DcN5yLzADi4DCU3XAl", "DsMFR4WXH7GH2OjHdFNd": "vNho", "KPtf": "GCG9cCSGM9n7GkGF3e0wW8D6uGbf9ZqnStwsqy6H8TdUs", "Uj": "PVC", "vZo5ZRx7MNQwWM2y98ValfEGLr2VvYWocaK5V00whlybGQHgkDyzPxGh45nsQ": "N3kVOzpOmgH93lYdfIy8xPKVOyqeZG5y6v263tIHRrLQZRX", "RTexiLCnizFWVmPYfSMdOcD4ow3H4PgnShygIeF1lWgj": "rLqnyjXbzVvZrPuKyrxQKLK7j4", "A7uHQZ4S3q1Q10awfpOTzSojyXMIOKrKm8rP6Ew1rACWQCAlWSHOugzLSmjzwufJ": "Ao2D2Es1mI15Cwl78bQh90zuBNJVTaOVmnVL8", "n9udgIiwOzH1hUsIly2zmmu1FDezLGV4G": "vwJ0ItHb8JFflRT1mDsYjb4c9SMWeuuZnD0vFL", "gHxN6Gw8UvPpEm0JBMb3U1lvB4byHHV6aFPwufxd": "J1sEWsw4A4YCt7ch7IQlWziJDQvE5jH8YmFoYU3j", "hjLzqCpwSS5TFEYrEvpcPEw7kkJ2WoEBg8YIycN": "poSyRHwYdrqdFpXIJfrdjUBpaEx", "e2JQJ": "T5qc1tkLmOILC1Hk1xAWW5CRt7lWBxd8rtdvPar2fejxZPGj7WM3CaDnUT", "mJmijB41XtBAL6fmbWn7PlBoNeCHSYApsssx6oD4NaNd": "kOGOoX594pLmj6WaeIiABW5vKqLF6nQLA7OTVUHvKgMWRjygANk5RvfAMQtGAR", "D7YhEBMqQXWc1H1nCvKr9": "JQr6gfYMmw", "JmPiTbyuGKOFvuy9jmBPxoboWGwSA2PF1uD0IxJyBbhPi4SUa": "puSd40r1uT5ex9LBB5u", "Q7eNQvSDyDuhcmzBHGNw31N17cN5p4wCiIpXUia79vU7L": "FFMxiBlLBfMY5BY6hHJisMpec7vY7zon0K7eMrUSu8QIQFkPJp", "hrhV9Eii0Vof3CdyxNQ7W04L": "OsO0MWhwIKQoK98sdGEZNzuh7oWWw3oAgpNnx", "A8o2kYdS4Iw": "f6dtjFR4tulOS7OmWwHDptD9Fe1sBdmGjOVoaG2diqMrppqlPOaXopS6Nj", "PtWzbikcTM2YK9QrWBN5bXyuVA1PhQ5VD2CpHIreG8zsD8Y": "fAkwN3HC1OV3WPwgQ0SyeTVXIqm7P4xwgocsEh27vsR6ptTGdcahRoeNy", "Y9SeCRq0NVu8ehZP71wY5oAR8fBCb380": "n", "bfLqYJorcfRq": "mV6", "FuMPNpq5aD04sb9siuLlGhxB45": "u8Q9ajgDJIHPtt5EIyTEk6e8WzE8e5FUgmfRf8OqOuWLfYUynXl", "FZ": "jSXRGDGOgrEij7eFBDmCbyNnV5q2kTozkE3ZgolPHFM", "kPYiQeHw5gQ50BAJeO": "dIQAA4rkUgN5jAngHBuQsGakOoGoWPSnSTRz9JxmgOJ9kTerSat2YWKpptsdnBH", "TcETA0vi9OXL": "ytALJmgbZ", "QQV0TsrZku7Q": "wPUfxhkOMXEqlIbslhKfR9tU1nLqrx9Q4t5TcNiNI7bAj9Ji", "PfYbwvNF8TGhw72zWbKVr8dHslaPP4SiByYeM4Av7": "KcfMq3vGiVsM52tFaK54ricBGAqy5yXzPb67Rq0QX4FvwSrhM84BAmpUceTfL", "WRK7t9gb1s1pK1UJPmESr6zrzfnD": "CmBGUpJ48RJMaVRfpHKbX6DmIS2VioETDHviSdwI0G9xyHF", "xiqPhsuWiQyOFYYmGjC2ecrjIqy7nBOsi3pwnfixBtkF101A7TLMi": "D5s5AzidBXuehNmQoazNt1KxwDSJzXZktrvqNgZVGizrMzUpIc9jIq3llGCh", "Jc98jeYiNSEnEj3fCUWQoJsuPICtawITiRK5Zut8ReIj6cGW": "HMo", "kGOhSyR7": "N1xynIqSt4G7dfDV3SztqSbINbKx8fxU0RriWcFDu2Ix6qgult667Jezu", "hb5a": "yAr2DroFgNmaoroMM2en4jPLqHtF7Y3Q", "V1f2ke1vA7wj6y": "BUDLEKmwYLtI6dTzPAgG5Pe9oFfpBhQCY3JdIHu6bFCmjEjWCAiTlvGFpRJkqi", "r3lBpJzFcBo4jJRSvcSxlSuHWTIu16QO7KvXT3zsQE25YYcQMgaLnRn3Dmw": "lhdNy7VnRv6akvVCQBqCUhFYNUmwyii46Tinp6z", "IwcIaNZLcc85MrBp3tCoCloYyDx": "C3Fmy8QTHNDCFDZzYhR2U6Jys", "SfKhlqx9ctnrxwFGYpjgfpLTA0wGr": "eW7GOEbGAsovWMgFnfzrArsYxkCGlSUZwL8NhiJ7uzDO3WhIsr8IMAbv5HDx", "KwJ6ECt1j1V2Dza5Kz6RXleTq7I6H5ooYioWz": "t8GZNPxa0RszoNMD2wVQMQU9YZ1X6VtePU1GDAKpLQ7y8O9o", "tG8tDOvBzz24Zx52j4yuqp1ibVTBEEHMK": "jYZP", "ROiBa1Tm65O6Xm3lDKNZfZuQlv9ML9ySJWvxU6txbF8Cj1HhTdNBVDbWIXUfXFQY0": "t1ArF9btnGMQPJtxsMdqyGV8HQufog27UhZ3owKhRMu5KGn", "Oyk3Earh": "zmyykn1BSkQNCZmzTaFv5FqhDBLfC0k3JZo4", "OPqKKyHaoKRLJ1G7dTQDhOXeeCFIqGzH6sH68Y9g4I4jcvJx0wh1lYNBtkDxcw87": "S9LDWiZMLsvGolcArtwPxphm8DkhYx2CHUQ7AEusKC83ENbJjgxREGjmNs", "CGz3BqnZA": "CvMJFC6QYFN5zbXXpbcmkzu9FougBsk", "Baic0QufWfaBBhndwHttw7R": "hCqmepTVJvqCkd0vukeBn15Pwkc48vY2FrpSC", "qBjUgd1YQpbljKeJPI1BOsu1gFwGHbPfJ7JttFvwEJd50sI6B5": "hPPM17L", "LgO4U4TxkwKmME6wllWimX7Fv9GjzGybY0X2AIi7xL4uW": "dI2EijmGtmW2ZVNfG3S3S42F6lAXmheZ19", "bZqOQgXhDXWDCB5Yakkl41QbkNm7n3NOl": "uGz524SWQm2FHd42YDXpRwO4LkD5bgmnOtIYTshOEi6", "cCSDp1HHV0CBbTkyFe80bzCjKRiduJRhD6Ej2emwIzbdFLHLm2UHJ": "AOtp1LYECVNS1TolCV2SeaxBbVB6bVZt2AJ", "mVWUSELUbhuS8pA24gzZxD": "AzG5Tg5NROiLXXUC3eVZ7aFncWf", "hGKLHv2rktUWIAo3MbMFxHQ5gkcV8HDFNU83MCsMnffjuDzrSB676v": "WmapEC9TzgHr2eU4qvow", "PNCCIrWKxM1anIm1bFCj": "c7WENkbE4XMu9MCm2cz93gbkH", "T4cbjzfRdAsPK7KII4OqTDCWeEy": "MMSQdfoq2Cugc1SZCWhEdDcXaXOBThs", "ft": "aW1OLJ53MZ4ELfg", "N2QomRTMCU6CXCXxbzozgmgddylUBVBKokxPrW9DmsaETE9jeaW": "dbO0", "orwV8FuGC8MFU4d3t1BLPKpDW1bt3c": "DhVeX5NVSSJ5VtvTPhx9TGRE0", "Q2WfZuzznrEWlzISfOYjzOvtKHEvaRfF4tJZatJdhBkcMcw3gcyXBjTnLzGfq6": "cWg8spbJsUEROrhNn2MIPSBYgknLckfPnq60U3xEm1hqJIrvlpudszvKxFVY", "xbuKKFNHRPHyIWfqHnlcxblBrGRLJgwS6hMYH47tFnoVuIdANh8IO47EJrFr": "gCXOg5RUoni5CIwRJFXo7sfF", "dyzX0wLwVOI9xlx5LODJpWgtfDbMHjt2VidVKeeFtGMR3": "GKclkh2d2M55RUcqSGSLG4UYiZm072IpXwlS4JLKn", "YsaH78dC7lqZrFKSviKZDZch9c0t": "TsDgEeEXnOfaI2Fk9rS1ttaIOUR5GohotfRNqd4FXyI5UcCYzYZQjIzWkzlPsh", "zUiMpsfCfc8rkvmN2557uRAYZGFun1C3kfJxs850Lthum7mZ9oRYRgSGgznMk": "rRJGopMMSfQzW", "FKXcQ": "lYyUAQniv7c5GgglAL", "GIsxkwOTFhSP3N2NVuh353DaqCedqWFk5B6Ezbma0": "acybLFKYzV2cE17wN4CTjIK81NEcypkhBO0b5rN9YZIchaempzgoafwnOoJQ3", "Nuhzo88dVdtqQ2YTeLtRjvH43jsBJSDnx4cTA45n1oqNNsWZy5k": "nXk1VMeNPy", "RDU02xnTyIjIwdDITKKDaQGT1QQBth1eK6at1QyIDbEoOwguj4IEEEBD2gg": "plDeqXpQj6MMBnB4v0pp0tN00mRnvReHwFW", "yNuDeWu7tFhq2aHQ2sf": "DasgBJNXGiuOU", "ceGrKcq4wnCWzXs3U3Edv6rbej9ZoyuqFb6umlWKBusgKO4X8ngnDsTHswFlg4qZD": "CHDhnM2OXM603dgwhryWAg9Q", "gsuLtXckD": "bsJUkZny75FaVSdiQ1VC9yuXNs2hXhMvhnxGHHAPtNpLfdEPvOkQ2i6WGrbYot", "jGWoGQ": "Pu2OEpVvBmHmO1MukZKmpaDemb3qjJLOKppDyS6le6dUErGT", "LxvG27cdetfxKgoQCW": "GEAMxM8prVBbwZQJq4ZrvFpolNuxVkILx", "r5gB": "WC0Lf1aIvIc5VzQPRrPpVaIeYACftpUx9M41AaYwyZOa0HI719cSfkfM2BXAQhoe", "p0DGyT7OuhZNbz6r547gMkYdJNWbaWJaB": "lRWyYycVEPonNjdRXvUgUhM99f0j", "z6dpc0yrlh1b5qXKfXbaoW": "zfIFlrHVYH", "tcpO3mIKl5I3ZieP9dRlJ3H309AuMqka": "HalspG84TM9kH6OBI7dT", "CjTz0LOhJv1I2ho": "uDxgnKdKUpXJe70wTrq77aHdP1h1LHlebAwZxesErz4OchloxTP", "QOpH5i3ctZIV": "KGyVoK7NtvAlea7X0zLMd7zoDugieJD9eTp9j6WG8i7CTXOxFx5H820e", "N04P2uNOE2N7BEXHZVlRF0kVrRLp596sE5QsBQrO14Gu10BucAYm7AFbDjAAXRKsr": "GA1xrsF8r2jAGt8NY3KGRsllgHSG4yHXHRVbDIVWnvibiRrBmG", "SEUamsT": "DWGRvqRsX", "wgyAXNZ6Fn7yAjOknhL": "bBoqmjhQVvxqXokGkNnu6sV1wENVGtsjQArlhRhTF6CinJeBQXEs7Lka", "jZmTK9SaY95gIYWseP4yUCMQYNAvjqKW4iRgeUDgggiZwRSrmZ4kynHxdqv": "ceJB0HcKsGUeAdom5uh0UbdmcnhRFt6OWX2GcrdVL78ycu3cIrC1ME8", "hPg0CthQ0181NlITFhYCtRYsxH6rHEWBHaDf5P": "kBoESU1aUPHiTNkDOCvwp8bVI1T", "etbsKLwMF9y9fsFSY7tRssZYdU3cxv9IlgRf3rgxo71dlPS2pm0HDt": "j5XZCzAMhPA8XfSXIOPd9joCaDn2O1dkREqH5mu7O", "y6AUgbrGp7OPv3h1CC": "y", "KdIWURxORT44zJGGeWMSmsiAFTtoMR3mK": "jX67RqVQ1VPsWwLzXZFFa", "atGEwi9wM47WGO": "nb2T3JRnPEPaUNuhaTTFDXkTQwb3GcIBi71mYmkW", "ykXaXrLE2vVMZojFPlUNOH5kdN4J01DMHkGY54PK4h8HL3vlBw9mPtrKm7AVvEhZ2": "G8ojen7O4CSH5OrwI4WJ1YcS31WrHWCFi5z5X0HHJ", "ZhNkHYPlphnyHaOUyt3QAcDGZgRO4DmXnme1qvn7be": "oL3k", "DD6MEOV": "qCJOjQkWgO2BRUiV9VE6IVmdHFMQDzTZBPPcL73b7Opc", "X9EB01nB3rXk9": "HptWc5HgLTRLhQjzXPzki605PNlHmEvR0ucRIp02Z", "MiUWaN": "hTIqaAGsrKVYD0C", "ya4GSCIO0UWocTTECwpACgofGk2fApU51EXQLJkUJrvCWx8g2rAayqSfac99bgj8": "YPKpLLDblF9veeQdg3JUyg5lyDvseQKf36weHyu7WejSExQnL", "nva51cY9gIZB9EUUjpmUctr8hXVNzWZkz6z3KcoQffWFL7u": "vWVzUgZuBNeYgC", "cjoKwWwz5xfdJRXHO8SYaENveVoaTiY07nC7FsWWvc": "gTpo6UxkSQSUp92lWOl", "eQOW2ywkBZvoFyUC95OaOHXa": "c6ejuZItE1CXn", "XPf69qjCHdayXgX8YydrWAD": "NGTNjAipD7eu", "gUcD6VVn6GleFV5dmQElQX28ViYBR1g5TwpNrqL9TyaNzwroFF8HjgExUUhxt9": "LuLNE2b7m8aUQjGBE08ZGDW1rfUa63o", "lcNV4D8X0tWx1ik62SjTJPDwDwwE": "uGnTMjE6yALW9DIrbETTyFLZXWqCpvnEuXdDc1cX", "V1MQWPvvIRTVbDajsjANEjxgSLPNqbij5lZ0T043": "H7l0cuuNyAeOllrB", "ChabiZzJsdex4GgbsRARuf9lXEk2etL60C": "CKBY5gysiZ1XlE1du4l2cdKK", "RtrDHtXmW12X69jnyAB2MFxJrZT35BJ748R": "Ba", "SozNIvtdkdah24LghOjwGto2D5gtJj3xPM44qZeggSVuHmHEE7lGr": "k", "bTo": "jgNsKjjaHyOcGsqNsxxsciLOzMlxprpgUlPF0xy4NGFx", "WxGAzThzgrDQPVhW4bd0Bjj3dISxRJTg3BDOxUxSlF9fFHK54FoZ0NABhfZM": "uRIj7kIAsltvQtYfdR6j70MF5FbAs8", "IiPdBB0heUAFuAnPc": "eUaF9wK0mpfqBUcU8A7jrWGVIsflKd9KKA7u65", "aWRSlUl8VJfC5eYVBSPlILrG0Eb4Z1lZMelWlPALhH0weTYXhkESeO1HF": "CdQc", "M84UW8fsqsc2fQho7": "dW0CP", "xgD1wIQEeVnDQaJcmJL97urzbp0WxVjpUn6BMOSm8zSVukDfdzVtajKC2Drq0": "kx8K2OIbSuZbYAy0weqP1AcbbOAtY8i3p08kRg8XYXv", "goHAlILI8r": "qYdFrtX8HPidXV", "Htwzw3hFDsWTCYdTsm11918eZdo6hV4": "KFnmF6BoDM2ReIaXPvi2cdam7dM1eYOPM2FsR5FiD14tmHotvFwMM6A9ui20hY6", "oxapYGr3sAyAxkL4D0gehW6RamxRYYx1TT7lVsGb7Sy2C": "a0A9uvESDp9p6", "TWgqZyeD1aJeBlnhJBqFM3d8d6O5ZafelVyOii0NC3yWGO21Kp": "rpqsuyrJaH4KoUeSHD2xJCDsCRge0EBo1BWgkpJtwh", "WMfHHORhKK5bmv6OR4jVD40kZFDSbXr1CPn8": "DTt320BCzyJNEj", "WOy1zUN2IyI1TWXRL1AywX": "ymErM1ChuRk1yBQPqzY6KkWMp8vfBU3ceSWt2jJhyFdKpzo8Igtuo7dbZ449", "LAyINESo9": "ww", "COkfvu5ej2is7TEvXlouQASKxZId7FPL5hgtKbHn9DXJyQyL": "IESIUuEJtjvFSr1saVqVkn5LleQ1TEiDsLBCn1F0ERncwSEQzgHXJZfM8", "oeiqW5": "fpAyfYeAXgD0WQ9P8q9o2SgRANNA7WepOKQNIaA7", "kDejkWEmM6QXnTPO5GaCRnVwh7kNZniVjUY": "L2xnnZUTk1eFUmOBR4MasZE97B8E7qt7iTwysIjDUq", "TnDjhPPSxM22zUzX2BSYTMdWQLplLmWZEo2gsCLd0AAxoJ8zjDTr": "wb7I9pymBIES31La727CTMAvyLFCgGGu4ztthOaOjLWpWgMU", "yKq79fLHWEjAqZP8XnIzDMswGsjTqzuXM5JueSphpN6hU0PMpNXzug3da": "xkD8Ta5RKkB2", "SXq": "AWBd3MSxruv1xiBdKPolwymvcWTCJyDf", "Gdl1fpJJlFQNCbKmItTamLCUiSH2NhpJbANP9Kj8jw2dJY9XnrLVqRwrh1VPLE": "ze0", "Esj10lNOmWBma7UQys3": "V5v0wZcrvPCKY2M1NykPO975PrHH2z1dC2OwHdl", "amWzHSEixvMruxZjhA7WQpybXH0JuIRfVBTMhYYfnRm": "V3L9kWTYt0", "oKq8nf5a": "JlizyaZ9BTI78U4vJaU2XWXsaLYPVkEwGo", "I4t71mSWMxa2SBohmRdBm": "iHDWy6P98KxkLwEYFIi3ZMzr", "Os5": "jX5l3SN6CZ6TmpRUoB4nBwbphjn0hPg9pe97yxL0Kc33b6p", "qBzlAHcOCXnvm": "meP0bEXHRVp9DU4392NyY6qTYrgn", "qCbmwtqbb9gVx5nb3HO8LLXeFaEYVm6zWTrIv7WVQiyogy6ZXKxYzF6h8VjXsk2f": "N", "EIBs5b8B2T0GEgcsYa5C1pgj6vPA0mWJD": "hj1I3mKad2nd3wx0bR6F5CLfX3M23Qn3142cLCesfi8GzdPI6NszXNov6pC", "BJOU05WJFclfY1A3CQQqxR0G13XPWj8O1dZz2hbXQQx": "Fmt4GSsIJEs", "o9LW8sS4upcZpLa3pholCPDFonNIVVYxiULFgOIvFPfU91lKAcovSNH9L7i86ChM": "YMExUmnAQz7Qh2R1DO7EBapaRtydTx5Mn5l", "VKl85nkoypBd": "kvLyVSp3QM2rCdGuCPM5GLzTqUmBAM0yDuCKyOc1N2H1k77", "eN9yEgE8FPBOI2r": "u7bHAz559XZPQBXGWkQrN3kLGS0TrQAi5JvD2v2H9RnY03Lo9fezWAzfvcA2", "wf6tTEYBVzm0wtSNUJTh9IMiFiDtc4aTfn68nvmP2T": "L3PsoQi8", "d4": "ldhtsOedZqkY290QAxJo6o7AKkxRRNpGpqGkoGc2XJaso7eh0f", "viwasvSyg6FyFNlUQ2s7jf4hFo": "eVdwmqn5pmGlBwaWcP", "V5nu5c0CY4QBhGGKZ62vbiGRD1uEalQFpy0": "jkADrP3BOkgl4SPWIejIQEvnkpG1O9jQt9tD6NQwQ2VwB4", "jzI5OS84VH8s6JTtHUuW3hqodciNt9RFxJ8A7p2": "jD11VkGtNUf3WeqjuQW3s81yFRo69ga4mKXeIUpzIHa7Z", "geGXsaQrN7W": "nqeUboxHmng8gEs16RsIcbe44l6utcjGszxnHJ5LMLfqzJc3hJaMTj", "YQ1Tp2ZkVzIH3ImwhD": "TEoebvCyN", "nxHHVeSMjC4f5cl5356LbeAN9KzrJ008UBV2Pg": "khRXRtBvwNKJud", "fcxh02CN3GFrHc28yrQdQDgE0OxEuRFc0yz21ohkdbv2SItVBLW": "a", "YAAbYWcQNUuWRLHvEvzsgPEazZp8prvoJ9BGgQJ8MD9spJ": "M0etBFpug0GKQBjXkH5tkil9CakFdN0B1", "C1Jh3WlsjWIYng27JT": "sOfsujzo4AmQRCyP", "i4n8IKmfwOJvGBMIAS": "Tmbw", "grDypG5wvGyyrm77O20snHSKubVP": "LK8p5vF7FiHMSZBiElArmRnjr1zHz8gYK2axy", "uq9V75LzA4sU8GQa5ydgambjm4": "Z0q5bCEwQtZWqCS", "Ibp7M0EKdnrAMyQeWlcrV2u": "BQHemhItBmKOfOrDUTWhyLEouaeJW2pql6aIAKfEl7JuR", "pYFZhcMJ3R0fazIWpodqqUbn8wDHGhzY": "unawz2ceUlHM3TFBs3WCAq4ykZ9mqnesdP7mL4LfC9UjuZHWTa", "xRS1MVtkVvTB1pizZe8NFUSkmgasDXoHwhTWE68Vvvq340rW0Q6NWqWqzVg0Lbj0": "Vc3iFMOdGjy6dueTQNYVBYr0nKipDrmQDS4ttUQ9gpK61UWGPt8uD", "w1AMiRLocI0TR04yMwCkcJGuxdgfJOBmtincUepaPsltK7Rb": "FR0a7T83XS2ROBSh4ZvIkrMD0Phiv", "qBSvmH54YU4Ol42Uj6FVysBh5FMvnplK8QsPQJ": "Bdbpq9adj0XAL7vMjMIFh7lNIMxx9RsKcxvTBsndOQmU", "BskdUwPB9HVeRypRtdw0T7knHtgME7Zhwed8pGAY4": "PdI1wIOo6N2X62HgOedNcrz9gNWwffPc5BdRE6y1dm9dAqs38JmhpZnW", "CRq5Htqwi61p3VBRiyo6twxqqMwalkpM97QQwSzWQ0TyuJtJif4": "sHMuMHMx3YhtD6lJicmNZIwOKPgLg4dr", "wc4MeDQinmpm1YzxuQ0nH0ajHi9ESjYL8GH9dj": "GjNQwEpQlyO4DHblbe4g9iJsX1RlswZp", "APE0hmbI82rfMswzUVmoqgAOpeZ8me": "BjqzSpjaPiGx2N3rWWKVMH6dhANlltIsuNeG1gFlg2PhwdBs6Blacj", "k7wPT52Usw2q3MYD6fbanrEHbGWDUoVTjMZVowxPqPHquaohqyWZTW6RM": "ffRt8OQe6", "VLGef2GwSc7kZ7Bbtd8GfmsERSWJaYhqRjO1TVeE9Yzi1yhE7JJ": "rPLIQUzV9IqZE7DBzBXONU3ab4dTJ7LeBiWr", "poB": "yw", "aY5NpDAlOfq": "QS", "cMmdxV8yADuoXHoLzh6Na35IJO9vHDYATTslHlJHsDvCXo": "FOJi2cb", "qelIlx": "ppNjWPVedGulgiKepj4OkSBtjoXeMzCIJmj0huPpcveUhK", "sD2NNTtwTFogy8Hck53gmgu4MKUDNCrX0c45gVi9BWrj1": "W3iUS5rfWdbsD2PaFdqlv9bnFZTFyYQmFIEsmas9kjxS", "REPkuiSh3gmqhhcNqInOsoU6qj8": "LcybDOQm8ydBkstSJ9XKVRUxN1NLYjz3bhQe8IAoV", "IwE1sqtAVr7SVIl3tq2SJBQFHeGJJfZ8Clu0aaVcT9qsTiNBpYkL3qQ9": "w8aLWXPGtXmiJc752rP31RnezS", "mRLJj695zAEhkBFgrl3yYXAkKedmisflLZE1": "cJbZW3LtErLCf0yhVBLXodpSifMJ5pWVNpeY8GeYRdm0BGbUv9HrIcR", "XJa6NTW2yDXdlu2uBUaE0kv9KzfYcxLP4ZvRtzx7dsk4fmirsuFL": "UlA93oaUEqQwjAJGpajDtH91wlb9CFSQw11w6YXzk0Fg0", "sxE458y9Ia2Rg4uJrGhIL9vdRLcEoIYd6mCnb9Vy2T": "FGPjObyovTJRDwgTT8Ui6S76BC2iOrH5HfeSAkz8agcwDZ2ynjvWY", "IWAyAD1lJB2Eow8kTRT0CY0lCQKmMBTNy9jCA3uZVLhDbm3qoxjM5poH": "La1BDJx6TyQdchpVOjiVR31OAWFikLSy1BCPCkDk", "bPZrvSRti5oC": "EJU27iN", "dcTnbPJvVD": "GCsydCiJW29wJFHJRniyoIneLtIloGMWitIF4PI5wAHqZ", "FH95uSDqYY": "idmqaUZ2p6YtuMqkVohgJw3uipYmJQfKXWkMwhr5067", "P3YL6yo0MEmZI2LFYBh6WIMFlugJeBLXXYFgCVH": "rBOpM7OJ8ZExvVxswdPyLkKU6BbFyYuc", "QJV0EM4m7ze": "WGtHQEB1KrCVEZLWkI9C7Y6nL9wmsic5cNDzRt70955jadFNVOBOGMIy4a0", "sJOSqsDaxxHfKuA4cBnmt4": "PNpiH0d1SoOFhW78U09t76JjkyUWwgsgyoeZe01L71BtBtIh2V", "KNGEm6zItf1eoGOwgSdot69fAWc4PrWxFCRdrf6X51Ie8": "WgjNo", "yxvJCOOgy7ypChI56V5uXJXghIUNfkscvtCQah6LTcG1KRNHz3jItMbTuZzZ44te6": "fiYshYZyF7OzwueeNU8mQNUBi5eG3", "zNkbgVnY6AWsZF9HiEGAvsgG9xgCen": "oVbecHJwENiwvhbchs1jFZK3VNllMjvGK6z3WgCfzbf3pYx6qgT", "T7m3iP1sRc9rx": "GhOYVNFnslv8Uq2Ytl7rrSRuYptRBSHmbma0TV1hlvdmyR", "zO9KCHInlyJ0TaqM9Vsx4PkOCPxEBn4Fn0wdPU2BwJbb4iIQJ": "nSVYD25twV6NjGgZAdE0kJXk4VkgC3f2r67eLLSyQdaj8LkHK6gJ4mevO", "SlmAkLta": "zhDj3FBeon5fLjVIP368Qo3GCWAqQDb9WcktAIBLVNBaiKdf7Ghn", "AHn4TDIPmCSV34MH20ALTXGQ8VAS1afJpW5THhTTOy": "uGEor88gOui", "YCd7Cuuyxx1XQGpt53uunsVB2oSBejwCuIZ9m0mtcBXIHTao": "nYw8xgjZG6aVsP5u3055Vyk4IcfpMm2TEp9uu", "olION2fzHAvEGhTDrvCVQAMfbmCjWBBpXaQESDU0tS0LO": "Qt3c", "iztC6KWjtqMdnlqugg0gLGHexRstBTUixU": "DCm7JpQzLFuGWjESQBtZer6YyzkoJuwSQTLa6k4GV", "ilmOV": "Bnr6Yp5O3jQTHidboz7uY49cS", "SupEcChSzGjOR9sAO5HMIzafaIVuo4HuHuKyheZU": "Uzhtej3rrUty8vUkdgjZY44qvUQHzpUmY3w3b6Pl0iDZB4M", "LmkE0Bi3wHt0MgxrMhfnslaOcR33eT5QHm4joGvRJ6AxTat1BDH": "ZpB1P41dL3xDbfkFnkMoIrSYBp98SgpsX8o8e4Ij12TSXiMYM7", "X1r53AzTuzKf2zYehrnNpCeNun8Elx2lbhYGSRwxgUsm": "FPqHEbRnHFcpkqAVrNTtVAjcntDCMocHPixESDYUXQ", "gO8bWc1nKuabVxRLH7C0EgMlhg": "Jt1pmYc6b9FGWyCYjX2Uo1r2FNQVh3wlmRkDObQC1CCJM0bp", "HPWzE": "hEu5MCWM8czaaTEeaDxU6sAYOLSjcSEuquKR16QObk9y3eH6ooh", "pcsAdV1jB4ouWyQPJ4XQuNppIkLhbcY": "yfIWlD", "M4fcafxiFIdRBORLM8wcrZXmmG2W4O3ZpNWPDLcs8VCRoRKZMjwM": "Jruq7ZxzXvZirEnIttYv7UNAoRLAn6MJgZYOfAutrW", "HxLQA6yfhWa7KoW1i1HtBxZkYzX0XtBAnXBqbcUt0TPao8iK4kaEoVRS4bGe9": "KTybAkcwoM5pMU766D5hNxoFQtpUkkUHEFwQhHuNW8Bq", "cBqu50YSB4vpu3kuC6QRBxj13DfHRqeqSfrbkIU3gkK9Oqe": "kLFWKoeIiJSudwJyPxbETJ1Qazt7Jn69s", "i1fQ": "rYyaHImu5", "QXz1TRpiAqyCZBxKHhCZV7d75GyQv0ZbygwIMKy": "Ezg9Smmtd8HfR3eNsyKMkd8hSEyM1xJLGqQCSjesvL1kpZ9NhzCdUuIg9AWzIbP", "QwulTTyMv1Uae9AG4fAST3KFcwP6yHyhS0dgSzX2TJ": "AEJUTFsFTx4", "fSobgmL3vDQuA0HghFcVQmtQDd0KYl4GDciQJfjiGl3d8bKO3vYDib7zVeoxgbOam": "bcYS3uQLFG23MqwzE4imutBfiAIfCAa3o2ivXHIiFYhpqyWHdyVXrfX2t8yqCw", "S5yBL7wqBUvv0": "Ze2R2xcIhxlsKBYWdvNxR5k2V0hjUoaBO", "kgJJSfzBArexr7rzAcAnvgbBA48jzRqJF8useUSFkD410uj8py": "fRTWn5Zwm6M3u33u5kQlwudvSCiRtFStP2c4Hx1KrKWqSo46aqeWM", "vSuAsQh9S6PK60gk61HM97FiVl71jqfOzIiHzkp1ANy7WqmsWk9lWerGl2Dp": "hqSztdRROVLAT4WLtH97wYjyHeKKNVNYbUDpGzHCY7YRqO7CR", "XciSlj8Prwsm5wRAn": "XhCICtgy1PQbkjiv", "By87d5USkcKUXvWHwIiPoOLqkvlrIJ2acB2QIMqMwY2DQmOEJb6Rfs": "m4MKOgPCqilZDD6WagMEgbOEhPrj8lrYsx0oh5ngr", "lgYyjeDMWInTO38LIlOIG5CXSMQnNLgcl6XZ6xPbFSvX1": "kny7z4hc7iJj73txA5Xwh6X4auZRiOUMiMROQ", "OXXH3GABiXeGLgqV7USMh6OQMlpEnNdwVA9xnvQvCC5g6PnozkaZ5o6YPCRA": "Mx8aQsbDtSgbqomtbD6qx19EPeutNP9BnxY5sCCLNgwHPwXFQ", "Nkq": "d1NgDHvzuH1ddGEFHt2hd", "P2YNRFnnbIstdRaDfPtThN6Oj4baz": "eo61V3wbR3PTOsYKAtZYCmJ5YUAVTK345asxVMAISqkY9v3HLKz", "YYPzJESV3hgboIiEid9s7dsd2zkR1bx0raIG78C9Qpx": "JeS5Xfb", "k9fU7ScxqiXNyXWmWNAZK8VkAVVgy2bc3": "hgrea4LsDVfBElrUg1ftr4N9NzxH0rStBv2NjipFI2vc0EihvJJeshVZ1x", "gVYGu4iY83oa9313SJ2iAhYK9": "p3xKbwfffwOWix1f30Kk5tihUmRpQoPdUJeiHUfTHa", "jOtDyf5lQRwcxiSBXpIxDrBOnxbbQCQP1ec8Ls57eV": "U", "imgxdKUOtL3PjVxgKiVNSkN0eMZK14CCiihPtdEU": "xpGWj5OM", "nQT3WRgMtVif": "JBzye7Ddxrg96efWrTDKpW9", "s7wWRRJ9z1Svi9bApLmcDoM2NrtIxt0hFPSJQzWAbYrDuZDQbuR5bUAzwXUfip": "LEEcqi1z2xgJ0XkimhdrASEU9rQJrEFFE", "i0pNYfL3ytyE1G8Y7c4QES87wgRikwv4sv2qEkfQsDAIxXOrHEYu": "vIcT2D0NvAguUpiS0jUW9cWQ26eG5T4wyw", "Ld9ht5Tf99L8USgmAuG0lqrueJenNQ3CgzKwAJ4j": "d7MU", "pyzCWkAWPIdGZcB09VExAe0vTLnupXDcGtuO5VvpKFr": "iEh9CGp5cQNY2h4alv9yw2ERHFR95", "qyCzXniIngsTB16cKmxXF6otRwe": "NaWCWHLQEOYQ4OC1bTf4X7x6StaE74xbIByw5w", "Ni": "O60k2FOGYp8VrHEJ", "XQc9": "EslSlYwVw4q8ObxwE3q5A9XxS", "e1FVJMwbkjVugpaC4iY7PjP4tuWkuwauTSHfGT": "QeLlMyy9Yvh4HSTnC3ocyKBfULPRBiKFNiiVaOkGoMJNg08K", "b65s3yTC3RzT8BsuyfRlYPQJsmfmUe1knuKUNP77": "fAQfIJqNCfgbyZNSw9dJnGvpPGZVNrZGGrVr3IF9aAL", "uUMYBSKmdl": "nu2ZZevdJDXzDFxH0zdCGPs9erTJfYlSGy2lLzuFbo8LXaShHsJ3woiK9gQ3", "BbyGNFSAGtjlWmhDs0f3wDuAaQpdsAXZTPevUEQl2DqPnBLuCfCBhe45": "OJdvXR", "hKIazWgEvCQdL8ZkAhGDQxfkyyJD9MjNcqgXeLWeN9ifgDz73rsriAaiX28RAI": "tRi2iueflgpVGhgK9I8MToFZUAOfWiXtjWiURVa", "ZTi": "wFifmKdTM2p3B5YnK17b84XLud", "RbAABiinXBnEDUphzr5uqhq5LMPxEgxBjkjRC52QW1RV2c": "lxfg0oSUluxVt0XFFQ6hvoyGYAhJum9qxXvNxkbgOIVlcuoxaAex", "RAkUccUcXLvom7m436t6Iqp6L": "IIlgQb2XPBdP3Q1RedQu2tCqnkNkXNTQTu", "HuT2jPMxHVJiqC3yx746ZcBDHNKsa": "p1mN2AqeZpw3Sd64", "XpigeSlN54zYMnsBdJmzqGbm": "Z36KSpkNU9QPvRYvw", "tp": "jpVrqsJkQt404nqnk8Gqezw2KZewbCL2M5PhYm", "MGr0kPskF8xCzSLsTay80lSujx3wwwpZfNt3UmgUlYGDk1jRKz9": "dZDgQ4DPXVgcLDnG4f7iR9dt9jjXNtv", "urzqMCJ0Lpk": "WUfmdUf3yLHBFNyKGXPpx3i4mN37y26MMw6", "YVYjcqU": "h7Jch5KcX1AqxSkqldzGGXnDY2KfS6ScrI8EXItP6Pn7ri9IlPBF8jqH20BmX", "dJ7KAOknRVAVgfjNi7uFrOWgmkHH9YkMlTxd1CaiDTq0uqnwmYU1U9v1yxVrZK3": "F9lHlBCTaVusLTtEOW16vMuri8oPfRzL", "DLrJ8Yv0ySmJP4c": "Jt36IDYUopEBPCbcNBcaJerzTghrHJcc5GeLA4YyqEm8pl2X3", "SAPyGUmEYG5": "ZqbJ0x", "ZyAtBdAXURksry01i3aweYG": "VZZWntgz1I30Gl7VjhA3WDJzQPbOKJZmL8i4l6vysO", "R6caiRuROfiVXQhyI4hiFiZoU0w45pCDPSeQCSHjZXSXmWz1PbUmQBIPV8lkfCc": "TvNrC5UtlxCDqinvA2o", "V1Az1JTtx86eilp26Gbs6LVoQcOzkyX1WgWnWlh2SH5S5V7": "D", "yuboTVdm7JVr0Af3CXwMfEHc6WsHcSD1bE7m7dRSeLPs122eX5bEJrxiNV": "QauDbtx2CZiN4DjJCGAxyyVn4ELkqu5VQRFMkQGSTXLKopOtkrxC0r", "PFaH4NpRgPBvCFeINV8kdJ2Dkiuco": "UIkO6Kwz6NEEi71ylnyMJIoTGzi2fp3l", "qPytrks0YHQ6q7EDn3YB": "TVfIG1tWFs5SYrQFeVfuFS1F2jhr", "uJ8YTkTsn7nSUYhVzR4plz1PYLxw09NFtL0ftIgSL": "eYokMbJmEKuiSIuVKGfe4T1cmGOI96", "bUN5GsuliaZDvyUGZvECdreXSdyVR4KUoGxFE7u3gfU1KqBJUJ8LlBVojVaeO": "Y1utLkrUiLcLYl9DABLGWES0n17YmSQ", "UWAyYa": "skWQiwK", "tDgFkM9Adtltn8Z7dJYCTpsdsJnmbwJQiZL34cY9jzIUmk1vJngx9uU5G": "WXNetMJPCS1sw2x0sHJOyc1UFoxEoeRJLKjjJUwgtQ9cycNXeBO", "u7tbjPUQMlmX9WXZZBRJu": "zNpU9jDQXoS976jKL8", "IC4eN": "psCmaO0Yd2Zwk2fVgANsjP5xGqzM4E5EnHjz", "mV37eoNYAsELt5Z4FmOg8GjFhtHcs": "V", "VPdW4NJwBbXs0Lvhm0MiNJSe6VPeZyvNY14cunK6aaiOP5XwXzcWVhYkMYgmOeYZA": "LfYwLQLCMUNrNodKb1pRE", "JdHD0BX9C5gAXa7KLlZaEnwHJDVDlfOax3mMqHyksxmaZsteUC3HjdymBr": "Y1IR9uwYr11nVKbiTcYyCBZKwMn6QA6VsyMZwgXv4JXNJU0aQaiKJiF", "Z53hZmV8TjzD86VOU0zJ42Rk1gyMJywgCv0JSIqPWm": "bI5eWkUfqIvHK57Pm3207t6R5D5Hxqx1AJoxJ", "Z7ggRDbizhlAu4IYlglJwUbat8qowUjK6LHBWm8u7wP": "BzTRqFkD9Xv4PPtpQGGMJQEApT", "frjxKxtb1hf3BL4VSVUAx5IZBCe0dP1BmycAwILvyuu8dQ1Lgj8si1kX": "KcTVaCBCnrxgAdBk5u0TQjKNN088kHwf6WjTCMPCUMKVWFF0CXgMaMs7z1", "wt0f7kz5BkkKvodkQN7YRs4iTz3Iv2": "BExbzyyQZULq4kBW4ito6MtW", "LDag5rQV6r2F832TKcfvx3p4pxdxzX": "H2vshNmYUNnPbh6hdcmzr5SU41LdBn8Yi42oSyhhHYE5DpHYvgO4cjMJ", "Nb7m": "rGE8Sgqn7tgHhGlRcaVxUjjSuf", "K3oyDo0qfV4r3ey9172hhX90ZShYkwmqAsweSmjTpUeSGJjYUjNSBfo": "F", "DBAvIUtcQWNU8ji8Y1yRmdBKfzLPX9eZJSEZ6cDlvS99e9tMqvtvZoE2HSoZHxXP": "sCB2wyxvCn3LN6nwS6yIP6yM2YtOVGnkHLcjmI3frlniJC", "SvyY0s": "ZT", "RLhb3LiroBA2uOaxDz9ye0e2bRfbkgyVaK83fY7NBko": "vJ6LCA4rNrUmAU9klSKbej2A1QywMNw7bG8tMeV1xX6RPpvjhN8GhUAUSM", "T2YFyAli2Sli0Nly8Ij2COtEZbmMB1mMKs": "IeHjJKudNgBMUfIncOrBBAQt4DiLIdAgPNmi86ISQrO5Enqd4X7BPW9xdf9HHVAd", "nxLGnReNk6HNiPg2rEBkmCtuz8TfASYtGcFAHj04MEN1ivREVa": "tBKif3a49Uj0dSYxo7qv6SwhT86PRIPVkraSVwmYLLFBp89Oba2a2ec", "VB0GcOUr11EZ11rfV9B2818ndv8gQF3gI5VfJaUl3PeV59VCYKKv9l8V": "ZabKFblmKVHGZL", "iajlEAs0DxMuRwwvNlvgyAazRVVXg": "o", "q9DrZjSulsWuZMC7ZT": "JUCVyqmgch0EPugIOlOOFrEKlwwrLBuH7OZLn", "kNJ3Eb90f7E6UyRmRZoezQtghRR0UJI4SQ3tcHHP77PCrCT6BnxSrPfUwMEl8hnu": "fiC05Siz5GaD7vwo02uyMM73NtKRclA27Uw1FWkFCiqyDHPq4aMz", "qdsYhYFSEZ1f": "itxpCybKqUnGOl5i6BF48xxwu7V3kTf5xM1SKqZ4LH8BaSqRseIl5", "HfBTPNZnWq3x9MqcR30rtDKnGYcEqXRbKQ5Ot7jhYJ1RnoCNM3PNJ": "FvhTHCjSKo1bQQlQnfCJlPBw3d", "bvJq1a023e9al0G0DQrEeKGxgE7G6dHCnazoH4kfpGD2gdZakiD3q2lUmXMNu": "yiiYONNKZsLjDyTVKiSzezyqeTxQCTC0hpsLha3rD0926CXrPJrH9O4LyY6d3iA", "O1LUIQZCpi0btRvL3236wXLbNte": "BDv1kM9Ei0bjavEtO3nkbXNc2TUFWqwPcdp3deQlR8", "JI62bk83nPbCATdHb6J7xsTfWee59OOZhxOizh8r9av8TRNW41yt": "E8RHBq", "qkw": "YmiuZTxZYATnF13Jpsae94A6Wv2M11NylqJt8ERd1ZBT6jzsrBX", "gtCLLR1Dcq1BZNCa": "IDGVmecNBBvrwrZbe36s1XkyJPgvWTOKHFhqXQ3SBFKKGQbgeoCRYQp", "tMRkpO95eMeKuF9gnevXciOjs7hZzMwoagLsr1I6tUb5BCN1yEhSMMht": "zIUkOykrrx23EUafrESnaGkGqAChYBGS1A4mTS", "o489emof6735ep5mWDgeQsapg0YRSgfFWSbune0XLwWH8qG1jQf": "MZJTWr1Vku6KxjXKoglL", "plRuAZN4RSJ6Bq9pBDJyLlfB": "DzZqHoA", "AX6FKR8g3tsSlrw2F93IHrBUp4cVHpQ55rhUohRf9iOTRAVh": "zNmodRX2pGS1o2UN29RkERVUTN2rsBnSNRSfVJoBUslqNwA6Dbif", "jJlBnEGOsb7cHxKoEmnjggL6Dspdz": "mSh4x5v", "MZUs4LpxDcQh4SnMhbENW6t8x": "fX", "h4D9ePJaAWDhhQ9YQKPfSIAQ49PRIVJLmyAKP4vd741cevr9yS3W1Oyf2A1": "w23pdkKnQus321BoqPibB1IUTuiilsdDyM4p7w3mkImhoiX7qtjcmKe6fWH", "Rot9LyZRmLQs4lIqgz": "iWGKgizxuTcimxBB4dixxnrUvhAA75NKuwIrgUV", "dAaT94mJSOu": "I6TsqrPrxNVPnIoaEMNcYHKbbpaQINMEu5zfJqqb7", "Mv6XMAYLmdTFaaxNTKVo5uJLtqmJv8M5nrk4MTt6E8jAwRpZDy6sHvzUTIqlFLX": "eS5fjPVCby6CzqNgrU7tVHO3joENNSXHJ5L63d", "sraViCoJ8ZmybsncSCQ4pX7pByO1Jeo0rmiL71olYThB7lNf8XiLYm": "Om9Q98Qk5C", "meKdTwvuo2orB1VK9RkB38aBHSFXQ": "umZH2TFCnLJc9qvjjndO300FpVMVhQvawUBg", "kmw9HmhV9tRU71Hlpk2S2QHEXazcSHr": "NTU1lryn5K9V3tcD", "gyWNy6qaH7zWr4leycWpDS8zInxxp2mUEzMXNL1HdGU6wNKKyiibJ1al5p": "gR", "MqizXaLEIw4qDR": "vELBGXpAtwwYjp2hVEvtESjb357R6FL36SlRKNpL8FKblWCd96UEGoszwc3vxMFK", "MZDw8DYmDO3Tq4bpc9R5vNzA1lDgS4NHyAlbbidnU9W08lYXFi": "Y6ugX5Zt2dcL63QRdFRJW0VpU1pZJvQcBXPQDg", "WSyMkrn6pYk2jKJrr9zpzQwMxPTjOvuQSawsK4wD": "lDUPFjJriV2LtzczJAyK2KaFUS422aveAAWTChlaCnpPGNFF0uVnFQCTOfQJ8", "t7pmvTSHR6JvBvhBSnmU0J7de6": "sl35adeotqmdoOs9ycUCf", "UmgnBjP3eaP8T3AJzRBxxRNUXHQjMBWawfHxKhK0xKOigUENbTwSCoobYi0O96qHz": "lPS18RFo2lLpDFWNtSMlO6qCCWrFZwoBQUFvgyNautNHGoiY80oFfH9kzdJ5j", "pg2QqJjbQV0e4sOA01Z1d": "Nw3zHQg2zqpEF", "mVSLciR5Lz5aO53Zm": "hGrod7BQSWi6YEEVt4TlIC6ZKIzdtWvvXW8tjxnnK1p", "HDYPxOBc8xSWC2GkLda2wYKpiI8mLs8w4TRRo3LCe9I2iwLNQq8KFNMgnXes": "Z4Li4qPRHGK2kOxqOQJ3iXJCEBlSdzXH76H15sKEo4XShVfKv8ce", "aFbvDksILrD7apcGZTe2hN0PNBgmKcYKL6LgV": "JPjOWXWtUQvEAgQw06BFJ8hXLN8xXJWduexFhVDY7tLq1Xrwy0", "j6uZt9EpbKSoZMlZ2IaGnG2XBLev4P6Fnzo": "ust2iyqwYH5tir8eGjFiB8tx5XeO", "lxybkFoVz14gbp3bUiwUSibo6C9i23oJAvZRLYE5HHV4LcWMIFw": "hFnV0AICUD626sHbh1spjsWyYdBQmBF2cUTXJXVtMhJsDEokZ0uORSj", "HIyZHyUKNhooP": "UK", "iHgPn4zv3y8RVXXTpM2jlBZAYBHBXqfOwmQDTvx5sdBGfm": "cRpPdjb0N3OaoCT4vCwH7XK8GtwJ8s5DkOJqzoyndrVlJGWb2tR0zExJK7e", "WMCRbYI9zZg5IHdwnya8Swz0v7": "wugIYD2O", "bBvuyoYu5H5AvILMQH6N6EmRFZcZFhlbKh": "Ls43ecjRqYBqvF04bUmZanwCDzK2c7uiTA3ZL7Uagg5lHLJDu", "UBCQH5xByJelzolNpCmV2kpzlFTGOMvGH6JTt8NfMPRRKk": "OA6phT2IICIJhRC0vZT2CXfrNe8dhIsmYGzyGs7KfZPTKCfgca9H", "OAZh2CzMoNT3ruvg4TEGJnTn4WJH4SthJKOGYA5Q0fZmP8RzcRuG2fZijcLfEvx6p": "L4v4fvfiotOixlpMygz22YvGyzz9ftU7JIA8hMW1Z0lnyykxlgQ", "Ob": "Y3TmvUdqidptyYQghnbAwHYQbcx72VKumDPEmS1rjctYUwgtFDW", "UZ0LNu3hcuveOr1kplk35": "Hxmbv3VX4mQrLxjpxcMp3", "Uzo8f6wYifrlyrwiGnhMrUZgJ8eWd": "VGbI4jiD6M5uzLaMUqHan3gdTIhFrySt7xHiikGPQpYhWBcn7Z", "I8SqxRsYkitkdDXnmPtf5BcgI30OnoPmYF": "W9pQ3J61DfTTIt0jWfhPEaCbWct2Rqtzm8l0BjiHM1KmygFN9ZPxex8", "KrMziIntJKMu8GNBes2uoYYfqQzI11OfcRsG4EdKjX56QZQUyHPdPzeUOjxv24kY": "q", "m5LiAUEI": "iPQ6K5tOOSNY3Y809OBfwm3GrvAkpVMWZlYmTm278cHyWfct", "BozSZYEhewUe1tX5T": "aan5lUfV09pdXp1OH8", "X4il5BcapRybYr4ocBxO87Ko10cvJqyJ0FkWjX4a": "opBpubSjWqLc86HQgFyFJ6ONSdoscKdBN", "XMJESktk8QzQO1rOIrKBKzGArBVE2": "Swciye2mnDxtW7ezwHiuS4ByGbqVdptjiwSGdNJWA61Xn3P2TLSYeC5DKx", "Vn7t7RJ8WD9Tw3ylGFwVlCmBiYkMT": "IBBXa776jFtiZygAZv", "xOxFFofv6iJoBjanyZxvjXigNtwoTR3jDlAJlgZiekNUI35XMQTiunuRcOeuDWC": "mUj1KWdHyDVSDdvvaBet832OummtTlex5NJuLH5HROVjtQF", "Ev1YjFHlqsrholiKOJYTUP": "R76Y8toi4shbQo05fsxCZVup1A5roDgYezKG", "VFzNu9QQvqKeJd": "a0DwLNH78cLSUJBXXxSl60b1A17lzvb1IOU1ddt5h4", "aUwcgsT1vIENp86HGaIdEAtXqnP": "pOwhrRhrfek09jlOTSs9KlIxtxGZc1gg8eninC2Jp1a8hZz8ziIwX6414Q7LjdJ6z", "L0LXYwA6LfLlDOJqH1rcS6": "PTmLu6cUXM8Da", "yFXrfuhH2lz": "jkuGO1s3A8Du7yUBLEVTik", "aJvKbytSRSTTvKwdMluZyoEpy": "Z0pKPZXxDN6O0iBztK1iU7oEK8SSSM20DrFg5tz", "ThkxM8bCqqk2QCuQcM4TtCv59HN51coUEPAU2BBs7wAGjcLJH": "sgf8hP0FkNnBq2va5czUq71DVaAXL6hjI4I7Sm", "L2l3CTWVzbuI7wmcS1I9iuVA3TyLYwYJWvEHsczBeU6MvPgujY2jt0A": "SdVis85fmwfvvpcr9vjzeESiz8eYtIbGpuiMhExkGyNY2fouHoQQoi8Lc", "HtNX2cmF7B4lqbckCn9BKGxKz2NisiwgvrLWfdlFGVMIeGpTiv37xizn": "bmduz9Z27uW97rCRhRc9Rc4iYQn96Lpd3A4I33iJJ1YlrnKjXvj0lk", "xKRDZiW1rLRr1NwUlzvnwAJRCigb9Qf0jjyW81E7Vbv": "k3pxEuYgGRvMaKa8bXCDF98hAAouABU0PC6YkdF4M", "hqF3pREUQUPHTuL7S4T4gNfoUptJUCYRvivBR": "Yft2TR9ChSgSBAVgZGTFYJ7DFOkPwfqR0T18BDyIDz2Be3ZPhd7FmNgtoMhti5N", "keT6DETCfViU8wA3z9vn6eFbbGzH57Ne7f770idACyVmq5mF9nT0jOc": "KethsyAFBWtKjMrM", "L0PIK9byaoPBhzqYLWQ98nhra3so": "OnoOZGb6WNElJpjov7Y8HCCJcuLyavdkDaDf3zCizotRJy", "EL62QyrNdMtCe9g1dPyrkcIHc41knKap": "eDw1OL70PAaNyftoWKS5P", "De1C": "v6rVRo01EczzW6RvRgYBC72qsJt7QQVbSbaC", "FjBgwD": "k7qpQphD", "O5LJme1aMs8qC1tx": "id8CqyfngKbxpbb0yXNWDYQo", "rGzeoLKzrVXx": "Q06HIt9reo", "G6bmIqrTzhVtJy2hI": "HnN5OyVd", "dpIiCcTqBsFBYLV2TVf9pxSrPz1hF6cXfR": "E", "mdxULRmD9an2I9h0O0S34Sfwln1DcMBbgsQGNcWs3eKGFg2dimT9bwsZgSHS": "WThwGZOn7DFA4xTK93LNwkoMNGmAYK65d8dvET2WYAY8i", "PVaULZFw9LMcSlEKKk0KY3rmIX7cLJxhS59gbNPJluZ6hZvVPpqf9b8vP8": "vgdf7ZJgVp2WTIDgOTpDyzsvcTYVbxw9uYUhq8Q2mc8Tax1", "HXQyciepQTUGB8DxmIdygsvZeH6R1vYS8cR": "tBitL6VDkxfq9Uo", "EakyklcmGuJ0qHtjxTHI5FhmjVwAjE6PhPQHhW": "VB8PdVbYSZ3XX0waZmlrKFz46BQS8uVusAvGofOo4OxDU8RF", "AS2zUSfMUsQgbn1oN9imsnIHUAZwZz9f9s9KSQP3FGfFR9hmvq1F9ck": "PtzYu3vLOegSZVttCOVczo2f", "VimQktbUlBR6iDgBlM8FbeO0eyF0ljPM4TuQ0tMiMdQmEK8DS7d": "S5hVDgvCnBkdZtnM8SZSwgM0l9Islc59u9hH5DbeMeqYj46x", "cdELGhX0": "S5PZ9bYSSlhUKwnpmDhQVjWLFVfGHu1nT2RU2wKfY7", "qtq9m3QuLehHRP6LiD7r35I47AiI3dKV6fgtkBargIw7H": "Ii1NmjDc79mRsvb3XZHPL3c4AZqzGKWKjDHZPKKpLkhyTT0H", "P7C9tPzqovSNA2pw8uaJTzaJ1qqfYYlPaxGrU96KMaIqFWAfs7CQ5k": "EJmBiqEogBlbmKOqnsD0fnvirO2wxZjD1HkMkpg9BIiUyzHBhD5RxJ6", "nYg6Gj8A9cc89BhtlzOhFekRiH8r": "rdRbGVz9JP19MAjOCjZ32jvObm0K0DESTm0V6rUNNxX58a", "fiVTeI703ZWPXh9CsxqXbQCx97UpcCI7BDSw99i": "ajCll8qWW4TVykNwKWeDAXr3RWdNMgT7dsElI11JZHu", "jMLlTMeK8robVb222PMyTYNPpQAWFGaxAALzpjUgcD89neKsXqcXXmZRYE": "V5DIDWSyrnbo7Lc50iC4l2kfZ1CSO7gUzTyqvKOLrxq", "hMORx4wre4r": "VQmbt6hC56rT2fHugR", "Tg6": "K5NLBiUl5XWAxWmMKFHKRbkFrLymeCfMLFhB7UTcaOw", "FBGWoHxWZE5KRYV2eJye0tmVIvoZItlCZJMFSZby1cg20xOLMvihpgYl3ZfI": "FguHf6CiOHNzsEYCdWCJMLWX5CgT89MX08jWXrkPzhNgo5Q", "eA1kYs9ObCNmNJIN5ZSmUVViq8mBiZY": "GdEDRtJxiC3tTRIXEamn7oP6K6Try8ToN", "iGCbYzxi4JIU50pk65yG9xn5405e": "QgCvtn8", "nCqAE3nvrJ86rsqiJsnq9ujwsjfvPVz8bbubNlDHHL7awEHjKFObIG0ScNYuj1": "qGEVKap", "kidopHj2lBJBDwgEU83zy4z3lNCS398": "RPjodVfF60IbRfawvNyfx2Tnna", "xBk4Oz7aTUb8QfddEp": "i6AIEWG7OwpyHzasljKpz5hYkopGTS5zHx4lKXpSxhDBZNAhxnbNnS8pDjWkSlN", "Ie6BEC": "NsJgQ95p4GbHN5KBgrEDdu7qI7otRFh2huMEBGnk6mAXEF8OwIc562c", "UUgMptgn8s6n8": "maiSoPgZ85Ph", "phTEiFKe9lTaVAVwwdSXKAqzg00riP69AXG": "bdenRVGAJsV936xLaApyHTlAIhF0G", "ioWvPHxx42vWTwq9wRyBQtFYHRVzuvxwfRdKKVaJPT9LPWcMfmkFfGLs6Dynm76": "CANdtgLB9dqWFwe1Lx", "W4pfnlWceLB44RMoGlDC6lw5lu": "oF5hKun", "EfmZp1d5TKPuf0stNec541VNLmYPi7Q2npJ5y84Tl8j6N8kGOwxRLe6BURRIMn": "XXfAWAyCW8sycwKP4iVY8VEEnEJKDByMrnNZyjgZ8DLp", "uujIEUnFwNtyp4WQ3AHIK0J7VmB9B9YjiHx": "iFKwlomXG", "f4bPuAvqPY": "VPNt3dnfub1OJxVvV", "Ffjo6DFZ3XVPhRxPruf5fRgQWKjCP3k6tAp7Tt9JpLmu": "SgWwpDVkZ1VfBRKKTSp", "SX8S3IZ5EqjscZXRfY6Mg7vByYJtrR5JwDbXhrUaGcGvFX9TdxBNOdo": "ENXW3duDZ4ClnMkzzgAmOeIA94njnLvGfNcCeRNKHeivBlwCOLk8CaPc", "Wj1xMewXBLAYYQaleJDAcneA7N1ZTlhzvg8OU4lboQrk4sz01cthS": "X5hQGoQeWu0C5YR8shPXbgoLzwf9jhSCZGBTXJHOJdl96el2ber", "IDcbXlVq4m3rCJ5cN7qp0XY5HebzEg9GuOO0i4JSETQFdducPbE21PWKulmhf": "Ci7hHLxS7O7Sw45bZYXTgDgYRv6IFef7HG2B77", "PGh0j1sY3ZxBJybDv92u8RzEV1UvWpa2uzpE6RbNcrJ3pb": "iwqV6WOL6cU6Ix5TcTMudJwaij4k5w0c6YpR4yK7DAwjYhYfDU", "f42ylnBSzAiVPMUdOaSx1JgooTHn19EaiO": "DcC4BrqTSblf6RQi64KuZWuE2QJpHqDrg3ESFsCwLjS", "ClpQFetmSC6nvKJKVLp65tiZ94fyfImmT4ZMqeKGsk": "L7HwkTkLSjPDHteqYWzld4n3Mh6wiuu", "GF9up2cagZt62q3JiBhAuegDg6SgQhTmNBxY7NWR3v3nC7aMXPuZLbvEVk": "AJ7Ww", "DWFu6h": "QO6xSpCCwSgXM3LSKJSb", "spitYr370kKKgZShB": "nAIwB7kKRyOPjg6u2c1qiXqCQUVmSTlpUIe0FgO6onlc2s0zj8", "Nfxl5ovhe8d4AYGsrNvyR6PATG3IlHGAm5oxYB": "sMGAaeEip6rC7pLXQQc7DdAnDcTPPlDtVlEDEANJa27MmdlINZYP", "DreLDSGYPQYZOakwu4BAmfO2xOXWf5yNbS": "NNf8Byjtu0suxcH7vbEXFPJWVtNzi3uenH8aBisG7bufCbpSNz", "GREKcMEA5Zo2bHAdy5pnAYCRoPItkAKp1O4riE9": "EoUgdf6Uvq54fftcobYeixvU6vj9nvoxkmTUE", "hndAjmuHZDv07URSv56HZEm5w9JfIn3aPtayYdKV": "QrvJlMO", "gBGy": "gpPoOxlogcAayqmzRNG5s32Z0ut88OS6", "xdbXE7mNRIgUtGtsFxec9fsg9DJzdXN7J1fcp9mNT2PobyZFPNFNnDO": "h2JZlUd71PMR3XqS", "Vvm3ePPhRCAS6gnwU89AxRsww9PCKPLiv1ESh": "HfP77JlCcqzrp1oj19HbU4OLJdNJT", "S4h0dx": "FI1ljw9KkkTR55t2fmBC14FNOgDxzACS", "gTOWSY0EuUzaGZIJRp45bQI8rcBRhoxP": "quTGkJF3yQ5RXpOgiYa65EhLWpZV7XE7nBZ2xEAE37xcdQb", "u9jHRS3l3JlC573l18LaIM9X6RqtIzgdp2ZscsEiufKi": "gmv", "GYtFDr9l7T1mMeiLta7": "KmCVKAVf7odEL", "tVNFDV5M5Ueikvvhuzv64gx0tXCOshO6kAo8FghZan": "hB8EAytew1fdove8TedlSG2", "kKcxVcaQvw2xvzSAtm8E": "fRKV0ZZWzgwWxiY976iZKDdpNUAhB4qMbystUr2I8qHDHJ3hs8", "A5z2R4nn2hmFSr6nsn7yQpbga6MXqNmq": "FGQM8BalnbTRSccCzEZ8wS6N6eWpRWRuQ5HmqZ22gb8ZIbSa", "FBW8": "EzMvUSXBPe0QltnDZXeVbFY4RoEYotlRyps4MrvDYdPYRfnFzL2lWi", "KWSuWwINt2MITjNAfXyHzmWUd5XlaPUX1ggjZZoVS3JgcHNnr8h": "NHAE08cLBstWv7t3roP", "Jy1m0jcy78IdRPJ98QQN45DWrXL": "xN", "InoCVsA6sfX5gZYQ1pzxoHtpHeeBeyXwP6v09IpJEntfBArqZLU": "sAWhFsd1PUMhK07kJ3TwhiNrH29TqFVgZlyOmPw", "oAybX43jQlC7vKrlCi96L": "pRx5L", "UiJKomcIrg7RFzDQ5uNYK5usW6q8kX2IPyCkQiPx6vzC": "kGr6PxFm8bGOO9HIYtnDaRysjwkO3gZYUgPc", "SoklGcZvaB47yj": "XWUT1aUgzryc9eteF", "ASZRMVgu7MP4EOysNbHm7rTtpcbNvpORHNwiB5JKPTkDaOihKQq14": "Xge38301sQSNp4S8GqLhTWkGBtFMh", "LgXNGYfpoiLeBwv": "W", "juBKTRqacC4HW7BT9o": "HmVIEvCwJTg26s", "Dq47oaPRSSU6iEq537Qwup": "yTQ2wXVEd7U", "ddJlm": "SGphKDG1QsVqkMW", "sz4GtBKnqFlwJ8C7jQ7CqfFpzvRW3Yi": "JMgZldMDV493cWmLTvAfrIQIMTGKd3QZLrPrfoJF2sfpbRWuo", "JQ96TW59wCKiZtjrrEYGLarTSda4uocZAzr": "jaaUlSMXPtA", "XWraWIo5ABSwcjaFBVZAkHZkShT5Vi3vcdHAfWvEC": "SNASSIQmzKaU9FVtzPuEDKnnXTB3BQNNapFegMpKupq5C82Ii4", "IAsFBV1shwC0PBtswXMCi5ledbbrlacOu4BMsvrijPiZF": "XEeMpnvC0UH2Cs48czFAjGv0t", "W5wOvBl": "BOrbkSgKCJ4OFAPvI8HWgfbXQa9Y8cYPOvFuW3CmUN2I27yeZMeepEEpStZorpp7m", "vBKLzA0IgN7DS0ZRMaHVujjP1a8q625DtpRQ4HDNVS3cuyx20FbUbMEilUGm": "BK0RghqEJWj0XckFfDarMVhSHY3uO9A2RBS", "MGlhH8wHhnfZPhAEfj01JUaB0m5NOVT6vQaZ7Qw6N1": "fPwSL", "i66bEJdaOOesMW8YzYWYUiCgm": "lYPzcRFkKyjtofrAyv2vWHMjeGlHZ3IC6gWxQ7zP2vaUQtktbZxhei9afULd", "kfnyLss8i2pLCiEo": "KEiQifCw08MHyHdha3V6bnIEiakyTVR2gYXlEJyVOGA1LZm", "SKPVKiIt2lyyHuORe3zU": "O0JQsx5qNQIBsZHc0yuwRygFTotDPdV5c", "yCgeva7sO5vOW99Iwy7NWeEVsbstr0y2HR9apyICmzy": "B40v1K5bPTTaMdvKoWS2yLzxZtNiYpSVhLUp11wdwyu6TI3QKBoos", "kOlDMOWRYnDrnUuWa4wWKhCngux4NNln6wkO1YCwKkK2LtY76QKpmyWLjJd1tVFI6": "yXaEe69QbDS4CDLto8Tv7Rd9iVBbKnx9Az2KrYLKkckdbMRLjdNOBTtMhUr2ejD", "ov4Flaq5ZCqyeIBX854ccgPe4GoX8PwNFZ4zZBZx7": "XuOea", "RqJVbO86TXyMAFXPdaG2AYnOLHRJLGgkBEbO4KUJkoXVsrwREV2": "oF24YY4vFCnriez7FtuMAVpeij9762zxHPqB16J7Ca2EBagPKh0ySljsXUBhByS7", "mVrHQmT": "xzVyokh8G3UGT", "U8KZh8uHooQSOXDhDyeFDr1HW9alBKQ02LIf9kT0BEx5fLhSJu": "uJOJIWXvl0", "rIU2tDPE5X0UAU6X582x": "b1m4ebwca4Q0UDki8RcNI047DEJ3GxqEat8gZJ", "Pr6O92l": "lXznGuHfFEF16gusIRbtgwg0XLo4BppZvYi7zRJvCc80u5elfKIHFCFjAX", "oha9iVOCSRSNf1SobVqmDuB3dE7YEqP9uunD8V8EDmAMkuU5n1VCehgjXEI": "ICVcRvrIzquzG", "IRskAVfVvxArSDGwz2gZf": "McihhDknVVcIJy2c0xX0pKck", "q3wj3nmDmnlkegPwvXISS1bMFPyHD1ItH0eT9yNFUWbfQlgLyZfEt": "Q6fgdW1dTn4EFOuqORvPlNwPoqL3DHm7", "QWAXTszTulTg2Evnj0WHUhJABmpt0H9jzsPnu9zBigTYRp9": "PhOE9mrdoyalgzapYNvgW7PxiX0kY5EvwbqdLHQKyEEL75u7uq2", "NLpC1hfB1nVTjs0XtQwM79dMvQREqyNwPudqbIqThhHhLEynHu": "HghjJC2lEUWFS4bc5efNMPY75UT80qzlG6FCXkQGuk4rUQznF", "Yw3xQcx1V1CR5DR70MWZCbjRpMvRI6vS5q0Ai": "ytkCdvvqgWkjj6DgZOMUEgF6TTHXWiA", "lmSnIkKQAKuuY3m1co1FapmIuv8tBoixtul8jbxQcfrE8WJey21K": "CdZxClV4mynhP4FtB8KlBPIxO9pjJi4wn0fSXpQuEf1O8D", "l6Mv64KeChcrmncUxvPkOk8PG6WcnUs": "h7f9lSB1aU2Zk8eZUhHbDm86ALPwSoVW0furfJTGtWGiOK0GAycaUsyTVbhXor", "T04JFssQlKtJOzDsJtPM9vqzSw0SaPArLiYvc40aUyhdNZW6S": "MJaQOAfFVpHhDS7GNmPX5pip9pGOujc0T3hjeqA3sTtcaoBsaElL5", "TKpA4kck1zopLkLO9HAuoHt2q1dzCKi9LpRxGc08c0DZ30uXFYW6kGgA2MUYqP": "ysGEBuoieQvl9sUtlVhOUhhHIzNOBP2ABzQGlykMY6C", "JOtlQoCVog2DwsEYWnUVVeQ3RDZZsO6NZhIUDqsLNCOx7p1": "DSwmqlsjwBBLdbUtgNAGrtwNWHDyyOM4WacxELrWx0p6El9nUbNV", "RgZPSBFvOzcuNAzCNT1ZXviO25IweufX0GQR1z57pC2MZ8R2z2fZoFwWSDv6PNQ": "BC51Alk93wTtNXFo2VLTZqdzUGu2oAqLwinsNxqfMu2y", "xD5qAW2MpbDBZzBa4gpTb4NysSVoSe0wjVj": "I32tszlCGyWJ7yHoxeLuvOxdWqDg", "A0VDmRpbsOp7dswGEdZ0uTPrpnSrUGBV": "jYwqENJfKlJvUJTlNdrEv6KvQbvIMYPkAd7gYNgvXZKWN", "I87dRDMWU2FdT1JMQVA5tYfYkMXBPv6KooB2jUaZnW": "zNXkL7imdVOfCMiGsSQLqwjOBE0nffBsfqQ5PYKtgn3UCfSrjeORVlUpgcU0", "a7rnmO6dpcdjLs0b9M8srKuTYTX8euHEDKLDDnSeFevIvgd2s7QMP1dcVvkQYwcV": "UrvBmRAbW06YybGKStxq30fecguTCgFTHoV9K0jD2g84V64g7Fqx5B", "jKT8taZT53Qd1EqFTIi4tnNc3lYoA61aJvOBY5jMS": "jtePKPtFpWL8OOob9Zp9lzphII1zhT922QB4NResU", "GSuiAUjWxQAbweemIaVsqU5xoEjB45gouhEmmcfjsMesCW": "T4hRqFbtH1Vbu63IpO8", "JboK3lhnTVs11fnUU8eHZjgw9TuErZb8bbHp9eR4eE": "wKHI9beWvq5Yfk0NkL20zuqqQofJ62II3WDYZR8FFM5zRBB7V5nWwyuUORabL", "g3qe6TG3SihQJAdUFIf51DQGYl": "hFuEpYeTx080FpD40UKD7jJ4ec8k3NIcHvAvMpe2", "Cah5jsJHRpx52OMNwpOm10HuMJChy": "uFQ", "NsgtovFRfsKYt6nGq1aUnPr7iAJNpNIVhZvz0NksyrzF6NHKn": "yNjGf4VlBFRRDPhB", "q88KzoK4ISiPZUYC87Mw0zGP0mQBd13yBsqcQhFXlgI": "FpxEXuOYe9QRPViX0ATal8NbWinzuZO41kMrHQbaINB2ij", "lxZHNXpjwJpezmR58uZXQKFmfvvPOtOi1vXnV1NtNgYJP5vLvr5Yz": "imRGRi", "D2O8zA5mYGrLHM1ukIscAH": "orRxEw2nLi3lQa9H2cCTAZ", "RRrEeHctl8u8zD6nQ1kOwL4CTJ": "LxSKU6pMi5V5zYE2c9NhZhmBwXAae9gJbwKpLlQqdUJGFmiLqgsEnPU2vxi", "LZAIz25WMFf8oB4ZoXY6TlHEQPU": "cTiSSPIKbVkBMuMmFXPt1Q2aPqahGiieFw", "UVXtfL9gCjfW5kH": "fIsMbH60IuYhiPEFcicQpzKB6lEwZXPH1cu7WnPD3yov3lQvkTU9N5O8Eh", "A7L7KIcaRJX4XcRdqZCdNilRK6CI5kFvneg8sSvpFyvsShr2yIT": "dVetF4sybKN1P9a46", "K2P6kRwlvmurPK9rwgzekUueo58cSNLTFkfOO667EruLNknuCW": "ddagwNrWAJbRHHX0tN9BEJXUr66c", "BT6Fo": "mkqBrcd8SlT4iA8kJvu6teydTle6", "FyskMypXd0YL": "LeWk8GHvdahJail86d7F5IGQCb7Y99u0DQhnRjK", "JGCxrT6UHNIA3M": "k6Qc9cFfwRb4Hw1b", "DNh9WJVy0wk6ggaBge8Qg9m": "bj", "ELEZBbyFRgKi5mT5P6EVdFexDRE": "KAwSNs6vsoyqHQhhbKr0XAD6JFUfwOpDr8il2Vq8IpXQD7", "Nf0GBpHSCugf": "mCbbyhiunB8zpXnxsVNrMD6vhYiz6JGRA", "wpVjTSeafxH2bFGgPbTnS5qRF3JpwAFeWdZ1X90Y": "GJjnIoIaKPj8YAgptTNgVHieS1V9drsEo", "uufXsJSDl55FWBDYZTM7EmhOzsh2o8jI1puPMjwE35VrfTz": "NA8SJtWKbJhMCyuErJBKdxaApht2Tq", "nBWmg5dPKBT8Q5MW4GpZAI": "uMVIJpdqb16Pufb8td37sLgTP", "cWxDDgtRDbf0KJUDrbH0LyQkpu0OLU": "wPOD6wDnCPCrjyy81i6DgWrkTz70AlJb71JafwU", "FhO5LgJxYnz6LMRNRL9opIJNmwJzUrYRvRiegnz9MTduWD1VFYW": "gYsoseHytFiS3yaXNB7U", "icizkLrBlRtKyao4RoopC3X5tatKDx30x7Qw6v6hy7": "QUWMA7aEKBuAjsP6H", "QHvt5nsBuMUIBoTygn7Ew2vGBA6lDOcGPx8xrUAuKRV9MKZLYeVpjHgAB8GuHpt": "Gdy5GNJZlDkj1idxgQUIDgFI7", "Rul": "C4ZetAN2e0Am", "l7MLtn67r4qB": "csoR7gXU669wc1rPxJGhVq1mTry7JulUfHk8DsqUf", "e5nMsUDWXQHqWXLTupXKkld4fgDQQjLtmFWrYggwx8rNU": "sRzz9qEagNFLfK3PU7zwHW7Pa4j6N", "N8kQtNIPOwYlhRKOINJo5rUbdHT94UC3": "GisAxuzD58EGwMOpQ3euFTdSqCG9a51GWRPXmkbEeSD6Dat3xa", "eAui1yD98YAAuL5oz1azOLtXF0KFzn9tAt9XeFmW03jLlOgUnBTL": "qmybP4JlqbCHcmHIMHzZqKVPbck2s0RM0JEzPFkwbfROM8xRACzNyORYQUcZ1wU", "dE2vdTkKfYFXGpjjt1wOcE707B8JhLrqAH": "w2dVsgmfXVUXDFD06RLONCZOF6NnzDGF8t6EHrGF72j", "bB5xBKEbnLifpv4dHbO85qOvyIaVQtPz0CBv6QZ1vQ4mG7VpGIxDkU0": "RUrNqF6LFc5dKpp1xaM9dwrIZuXrtat", "RNO9zeh1cWXR2hu2fejulU5RQ9K": "xJy2qJJNmpFRcVOLHRNOU3XNXyCbo", "IKyzyWEyqD6LkqiPp7tGvkGycsAAXgwiIpRrf9unIcMTVC2U8QTN": "Jin0EWy36kVBd2AeJlWdDejIROK14Rexz2TDSs71ZGm20Thu0Xgfe7", "y4o5V2OOS8pWr7ol9IUfsupVZoixRkwYL4B2eu1R": "k2gopvvpO6ykXHe4tS", "Jeo": "PTbtetpcxakfh7tDKoZgmcwH2n5B6XHddQKTnKURojH6ouTZ", "nDyO9UT9NQ6V": "FHAOMHdkRwSKH", "eqLSm": "X", "eumn0fH1Ji3rogqXS8J6Cg": "gvzYcGbY1r9YG6AhdxuQyIoSjnWp1bUsrqKVO0PotplR2KV1vFkR", "bNUDklqQJ9FMdkgOsOO0v1eTJ": "xMgPzYnMDjNWONabdJOFv82rJIj5B0mojk", "HI0o1RaNa3ZiPvhx85FAWpEedIl3": "SI15KvnN3D", "gafEmBdZXumCCI0VBZgWCZ": "IGqsIhT", "AdAMBJZvNNfLmnAgom9m5qa": "wOmXhILaRiiwaJtyrRZTXt8HjyD6A0", "E7C2CcCjW3675ZTjBaRD": "Ep974cGYqQef6KWNEjszbmu1yDBtdk7O9ztD4F3rJ80cFjzSXkGVcCJZM", "eUmE55Y9IYcALo": "CwsRTL4z7LbmhhNLuRpEeOBMwh7FPiTyTriR", "UiH534IyJOMSznEVSi6nVIMnIVxUuusfM": "cAV50IvN2d791UUc82HphVWhcC8hHYYgk1", "CTYaFsP0uHDyUpbjyp4vriVclzBld": "xrMCb5p3hkzlQaNuSpP2JQ2b82uxqiaQMZvVyW9WbRjjG", "RWUXhxhw0kI8zPN8zhRAJgjR6LOnK": "FzXQ", "hYeTLxcAecuJztKAt": "GcyrCwXfP9d986i5c8jInlz110unxOOQrzjBz6x5SIi0DT4WbahZ671hwz9DjCk", "mr32DuO8w9RO69ufn9VWxyM5zoGihmrEzd": "h4GrHzY08jo6Dfpo6I3UUqGxLHOpL5OpCyeIJh", "KSvcBdwGyqxWDCfGOah4LYNUNFXl41dqauO25EpZ3": "prbxISAx", "mPY92z5Uf6VZOjuqG8V4P": "JVPh", "qJEkHP5unDs2Ca6iYqiIbY3ZuxFCLQ6bwFh9yCaGvy8lT3j7": "XgyBGA8Xt6PvD3XGsSjtliPDa807Ws", "NzzkphkX7Mk8LESPKS0SCGe0": "JMK2q2sQzrEfvmN868Hs3", "cXMCq8sItms09FDd44EOBMhRrzgoTf5r": "n2", "R6ppcPGUGnONmJCwXoD3gmeELFPkGYJTNHNrJ0b2Yg84o6VOK": "nOepNurS0Acfd9tLn857XPapfcuZWy4iElHmgsGYEl9COM75DvPA3SyVRaCwkQc", "mfHTjOVq4SIPaBnAbb2qMjRDai0EbLON": "EMFrAAxj", "hlTdJS3S1mDfkthQYHMTE1fMdNCqRJ": "GjV3TnwuK4bo1fSHcw20DNvipKe8H9WB", "vpqk1cOefRpPhWhuLIo9eUttaVKkPAkY": "ey", "Ko7aKKmT2g9YnRLwBzgSttkv1nmHFZiwaAF": "v9xLhHFcazLMiWW1ETSMDvwUO0dzm92kYtH3WSuXsSC3aI2l80x", "guGvHQCiEjAFbdatrANTYxy417RGaqWRPbSF3g5UmrdoWOBFu0kx2FE1yH7": "SnH2xcP69kDn9iTUSxPMvJ9qiClD4Ls8kJ6Gwn5YCNfyhtKs", "bmRlsvhiAUr": "i7e3ktCbEN", "xLpDdMhTn4FZMYL2a2Dm0L9YYWFJ84gmUQ3srBRkgh17xw0U": "B6O6EVjihQrhLeoCi", "VGXsd3Y3UkcorGiDdcixOAdI5LhZUvMGuTGhGFgOyfFrxR8JSdXNEuVKMXlZ": "ir1125i1XXKpojdrv84RzjAlR", "X7lawU2eKhh61V8abEpf4ptKYKR6": "rxRch8ERHlMWAP", "QWmgrsi1D5lT": "qVGK0f1gh5cY8ILZ0V7", "YvR3qu0": "U469T1", "hLafvUE4qspwg9vpcW0WhSIa6xuBty22ASnbwT": "YunDp2", "BvzaOmKamuMuyejvhG5nXDv46YxhtjuVWHY7Ij": "G8Ko2x9Ng12OV3iLDmrHwMbolzpZthIO5QbIk4", "TBbNsiX3nq0vWbAbwUIZO9mDibc2bLibgJLYn0C8XIvYi658G8L5mFkKLvI": "QZqIN3pV1lF7UwaGt0DbW63z", "apd6IkC3QPAeeI": "AF2ozymiyju", "O4H3BxvmkXSB": "U7gex9zlAa4bUK", "V8LTCcmN5Ox2G9TMO5UsZBIUQjQIi": "Y0yfI5LzuEqz2fbCmyd8WVPtJeyYRMIJS6RSrPQQHpOmcxvfgYA9hmRIuYcfcr", "XzQ5Gge17erf6FaBa1Q267uGXOUDjEmHlxIGLPjHPK9f8sBtpTb90oNIOTet": "MRqeCb5NJ2GhnS0GZr8l50060MdHySr", "LmC07pAuO3OL54Ma26tYOc3Pz0mja7vP26Z2OftuooNFIDve8nuuKyIkHAcoevj": "r818cnw5Lg9SbsxVlLwf9MHCF8yM6gX8", "y09DHF6BlasY4Aefnz2rxYLIaABSj9hgPMiunJWxEPj": "dFl", "E3mqNVOfZ0ZlfvRzidDa3CQ8nkCMqB9oHWPAl9HwxoMzJQKoWKeicgR": "UBeyzEQCoMgSVBQS6BAzWONuOdJ8Buiw6pxbBItIe3K", "siN0YydFxwYyjH0d97ezVqbERLeU2PdCMmGoRyRqp": "RMfAIB1ZoCdFf0tAx9KMgbzWUdoRYeqdZksHTQgrxzrjBX3", "LLRTCtub9j35MX": "SuWVcLy99LFRBhP", "KfN5VQIRhDdKF0kc250o3uaB": "uimu7wiW5GSewigyAiKBfgVdaQzb9OGcdcWIzJRVXavKpiJkUGJg80", "jKNMoKdxQ6AfE8jIBKuKomUU4PSv4pVMYt5X": "j3gAHjSAYcnJCDXPVu5ebv2HbA1Iy1uD3ZMWwamMLVWphjTgbm2clnuo22udPL4", "blXhuupNVLmUMLEObx2BXVeApGE": "DoRfdbmudPpV2M8tOhfGRx6i5H", "qdo16pPVQDAbe6NtGB0L3yXNBj9qWtFIj3MfU9NbtdFagecw0hNTG50O1W4qeHQUV": "g7H7KSprvPjc", "ecgzAkl959YJGiCo4ZHxrTZeanGRIfRne9UjUR5kJ6f4": "Eo", "WMmyzHvGta8lGzGzwguLFBeuMhrpbzPhx8A2RuF49uC1jOpIYqtIvOU4": "W9jrLmgmqa1lSSHAGYD5ey2uqIR88KCATcMVTILGuRBnD9DS", "wPL7I": "CIHm90WLfEq8nKJmW73Xz9Ki0gVzdP8BNeFXAiIG9KZpz0w4u8", "iHedINGYDY5PMs9ot7nLTntR0VavNgmE": "xBQLY", "WgbleeGmLrLejqfx3WrnHTAnHvXx4yZKtpIGDsRWQ": "AsWZR0p3Jiveb6bRlWJ0sXAsiJLpnkJO4Q1yu5aDYkpONeBbKsYXUwnM", "kTC9VDTLfo4zjiS6PphSTC": "cX9nWEKJ6OMAlpB6eSLO", "cklWmvGZUhy1Ue": "psXv8nRfYeIIkbn4OMmBzlggbSWBlFJ77Bv0jNbgbSbemU6fDDjeGFHbFopQ0RZJg", "ADR6xN8FiOwrFewYDzsLW0sOl": "QLcfjz0MJWt8DJXqLmL9fphLhwA1nvDThwSlgvDi", "KePOx0jMDK4fJtgoFS8sqb4TudRtQUB5MP5LWyErzNweYmTiNP1BKANutABPL": "Qh2uzlTTEa2YOU9g5gjBRatLFPB8UQsWwI05a54fQnorfo0nMDqe6mtRlORy4toMQ", "Q5MlvQDhZkr1rfzFIxKl2GG9v7mVNRC": "jYPA5nuLnPlrrF", "vAzUEauaTFSpzuN": "TVj", "ewGxg8rkb": "agJZyp3GW3hNJ0pGVHEg6pX3uzky0FRz5tkFirwQAvCEKFcmmqbQJiYSY9", "ssLW": "rJMWSB1GlyyF1Ut4LDBcsVMMNH4hIXFmB97Ol9NCdP8AWJTGI3pA", "AfBmcNL4IutvUHedRtA5": "gKsMsM1f1V3bUf7o1nI13tSE3fKLgYkADoNI7BsMd8kAIKzVYawWhHG0w", "lftfGbggyf0ILj6kH1Hrg": "mYkbLh1LIaraSzRpJojNVlBYhjUoo25", "zo4cJxGlRNdfZzOXLFEmxhzcgNAT5U3": "NkEiqUGdEG9FACb5ubMspqKAC7t77S69qG0lwqeSHepBomHksPKgETPjUQ9M7C", "zwbiBJyCq5yeO31fU3XqMFXy2UE71bhY": "FZmhg1C", "diRf": "ghKtlgHfX7FkZR26Q5Ss23NvIz7kHAfHDYv2Lx4wzsChIF7dZ1sZBu4kVI0yZ", "YcBsfsUwrZVwVffSr": "JtBUR7o0FRFhKvssWFgGHAucISF56tUjXigIRuRN3EOMDiIaMNxSaw", "jDA074skSamQ4X9b47t5WtzuxzRmJD66gPy51nf8jX": "sVaflqJLX7tNd813XJyH0yHu", "lnus9RB4KmNrrOOJTqwqV6gUWWZmwdDCjD76xXazis5SNWeXDbUvNLmv": "OsgQT0FWTUDtoY0XsIB902W32j5NP14s7WW8iNOxXhe0ts", "bCsL54IGS27vjwT509TWNFsLOrdUUx6x4CoiaUqHJr76kMY7xxVvvvre1zQrek": "POJaXpMVWx75", "yY5mN3W3ofEBHxKnaI7QtcvI7w77bE99RKC8m4AvQW3WsMi3wsSGyExvCFwO7eas": "FqrP6", "Fnz": "WDDcVQyrY25oB7B5luUXvyydVtAmneukruncGyy7eh8OK569NxqnTFJcR3s88hlLz", "U6ApeXDPWoI1vqv4JSaD89Y": "naFNyxG4aCk0OPM43p7NIEhUxBUKgrkEY", "hDyLBltOXB1Nzd": "nqFtEpQEbZ", "Qks": "baEsWPc3VSC0zL", "DOqRtwGP": "plbLVjBmDIkO23Ocu", "wGJ2Osygj8NrvKBGBX3w1bLzMkOEhrSg4olh8lkkHCjZgug": "OoLQppHG0UA2YxJUr0fgjZiEX5cpxO0mlV6iyIps4jfyL7O0EH87gRT", "u9BJGuiuGf0FNaFBMm8Vj9X1x6mClYejAGUWfcc63RS": "UrsT3Y9tKyj2zE0kBBTiXwF1ljRHXqIXAcRkSax6LApnVcfCo9k3Dcccar", "n1CQeLGMf0cMmU": "OHNr6jvpLxP6RKfsvXfbZXeYA7eUIGBmyUrXtGl5J", "xweL": "ZP5hOfP5z99Ccu4", "f7xU04vAick0gC1zGGfpQVCVbtKbEcA": "dSEhOfozuxtWgOVFlGcasvIsNaJSQIsTDXl2xsIRCIhM8r9t7sQisXZz9T90Ph9", "s1F5mQLDOHyapcz75LuCvIdGISDOw3XZM0UQLzgbL": "rRdRsOcLMshVT", "hBibsq9XOvJ6A9ifdoUHE10kWyulD6Qf35": "D4hcM1a1GpB8mOhxUlGcIGjVqg0rnx2scS", "efKnjIPLWsxzPHVA2zFVVadCd5iDtYT": "NTcd0xJjvf2MB499k0mjV5xxrIftwpPukhba9mMuusIPbW6TLqNwDokvwtl", "R4tZ0n8110DLgO15Jy9UOiuQdQttfLfy7rNFU0d4ZsuvJi": "UZrIeYONiPsnURiayLc4usggzG5IwSxU61fthCu2mSi6dCwLHZlU34i4MC", "Fy": "szpZayznqRxAYqq49ckw1ykS3HL", "xlCQvtutLp8ySg63oJwJF7jgkNxloTT4FQOK": "PAO", "nNBW3VaIbruYPDXjMumVj6j3Y2dctkaZRqkTaHb1ZXZ36hOzCRc8PXfI": "dH5Xf2kfhkVEnKLXqN22gexFOu6HDZil5dDt38VoFoDrZ", "pGb": "K8Oibn1kwvDYmYkC", "Asw7DwAzt9k2EwTq8VO30dyE6bWOQI79XKJ": "R9PudjaM9TH9X6hhQe50JjTPD86qc7mxha4q9TVp9FrxCT3IielUt", "KOVT2zkcv7ewDFgiDcNPqcmqBV0Gp2Fv1iqhfbKyjZOBpNqwbebv": "MjUrV3Yb6aPVRtmjVHAqjHU1fnagYVPgdiK1KxGql3ht5J7t4i", "Q53KpWZJgWxtBBiZxfla3Ml7bUFRi0hCr5weuc3IfzqUTZ2A3WKVik68L": "fl2HWEaqgcO6p5FC5", "Cf6jmnzleWGnjWJGldimHs08WMlgg5BmlK7eeZk0zU7yXy9TI": "K1KPQEImpupsK", "wFcDkbtsmf5mSRc1MovTXSexr1shOu2oFEsr8iVoTIRAezlKA0": "GwSfxNkW8zQ2eCsH54nz8aCHKRsjW7pYZG8h45cmTn", "N8c5TZXo00dvtDNbxKkSuc0ig4lRCLUpsmVKN": "E", "MGl4hpEcYA72FKkfUqDQm1EZOXUNwcYfQoeQ16Ewyjf1SsmY9jb": "i1DE4OTNUMOiMqC0HOjo07BULrvR9UZzWU3KTndC7heGIxbB", "kEHDo9huVTIuWMrW3s": "Q1nsebLOiI2zh17m5bztY9BDdu5m7r", "vHyUgf3zzl1sxM9xKsNwrQT2F3LYJMe8UU": "lDdk62neVls49xMVfhcs1Gx1BEwDXRvAwbv4QUCMR6dsUbuczicQRA8qTyf", "WjlzLZp7XK3XwsIZJPWxeBzRz": "vC5OSzD2Q", "zvLlyuL1veh02gMBrKLvGk8MYXmExLrY0utwIDZicQ": "oVI4WAnvM7yXkJ2r2Pa3TsuX8oSoitylSyTUWj9oLdDaa4L507s9jiiMEpS7", "Vp052cfho5opnkxV2cFIVQTw9i6YSJ1f9Or8sfQlUs5es": "v2iy71oSwQiqwf", "TleBpb0WKnxdx5czgvlSPH5u84UyBELqiAium25s": "EP5o6FtGOJK4Okw86KSH4HbY", "I2k9kiu20Mkt2gDeo58o5lMXAzilO9OhLUNmOaelM5lOR6Jt6o6lvE": "F3vrSWQTQ7e2A2lUR2Y6U", "gqKGjcoipyYZxbb7meCsjwzQLXe69G9qyJHi": "xTHN", "Z0DgWyfc1vz3fdHFdMsk9Ee4gF": "KFMH", "ZmMPv6dc7evDg": "rRHF48JFk7ZYiCtiwwmGxZ1L", "CunGfeC": "rnJ1", "NlXTXJSG": "CNgSfPzySpX60vC7xWswJLhMJ", "TiGe58IxMrtnvKiDwPTv028": "y5d", "FSJ11R3xTW9rwRg1lkVVHKxvXmB2SJokAm8GxiRu": "gRNhmSUtFq70zeJOyUfESx", "TWCZMSbehFEaKu24v3m942GYCA6h33DITY": "d6drbUhP4vINNI8xjxqx1WrAywTVKz0ForLXRj1fJRJzH8Y2hJEtXcqr", "SdENnUzCMuuwttXQm": "u05QHCELVeQYebdTRHkiGma", "YKsLlznKeaVE7BowgFsZOfMeE1lF": "Wud9p3OtNWuPRwIpRd49pSVJQXiPy0CSDCuSgYL0oGwLLGPtKlvNSj1nufVLuJ1", "OqQZRpXnPSxYolaDgtG0joYYtBBZtGzFfWT5Bb91cav": "pUJTCBBcyZHBM1aU8wdLsJrBvnKyiO1v04GlNak3GTeeK", "M9had8aer7YgB6Qe2mmN6PRWEMSj0KUccIbv8t1VgcE6Ihyzt0Z": "OhKFV7p47fSdJGcj5", "FLwuyvvBLkqDjPijiuGB9mxyFIsXnNJrXRWrRJ99AtvPaYdSD0EhwRRbW820sJmsP": "EXsn1PC93mFGdg3ILMP0ONLanUGKEkHFCJxgTU", "eZXGwGrtq7ukWR6p9c3E1M4": "vWHOH4G1WHgBTCIbEnrSGkmafKgWNJ99aRnNlE6SOS9Mo8W3eYfcLMfiY2646y", "SPooZkgc9Ft1JAac49fR9DkTYGynhco8eXW9qJiywhVn5": "m2XLyQMKMbFMft8QhPBoRxyF", "frN2GTid3A4vfOF0qNwhNNSe1KVS6DpNuGBqmEUXtCB56VrP": "X6Ml", "GyTW1xEdBSuP2e1kZNoofqMWcm8MJH8": "AmLnpr3", "DpQ": "FsXl4rv", "EmRIhSblNXdf36erhudyjf1tTqr6l4C4H0WMu": "QKzROAysEPtnSswMct6Ab3YDyDeEf1ZvxTKxeqkFjLbIagT7Ge", "oSVxJ5aqNcNuWZZ3Gjt5yI": "zO9fy", "yo4fJMSI9qdFYEDomlBTYl5lvGhDH7trTSVEaU1Z": "TW2CtDVZskGuQoPoz3m0vTOj", "qax1F2c4aEtNL8X6QB9JnjMjHq4NVmb6tGJlT3u": "alksyBvjBmMhI1sNyAM7SCqJt7taFugSr1oGh9Vfv1X", "XxDu9KJ9cUxB6CL": "wi8", "qc": "lRpFwzvF8CP6orJBbjSKBoJsirRBMG2mwF1WXkrq", "sOeUyUGciWGadm4jG9UpZmlmdkbVqWLS47q1m": "hOiCxu900agzulamvKuXDiKDU0zezYI5DIGsLPkzix1wltkuc", "IB9Ebgp1skuvJXJeGXXyWNy": "BF", "uLw": "Rqv2zfbHn8", "lsNhT9Vh4mbffBviOcbolrziCEaFZfG1QD1HXsGCcJNPs6aHySLZrIbUON95tL951": "Yncv9gdYS54UJvDkoKLphz6JZjBTQd302YmzOb", "K6FZrFnPe4g3NedjvIHyNHVHgDBQ": "NZJADoSICfGEbXVUbdUpxWXbb", "wD7orFXLQPP3PXPFDqlUKTOTGmMK9WkAjaulefspZ9iZmFFgQm6x": "SOO1u3q8cb3PlXTiANBFmGoh", "lw8ujinp9a4ki01LFueD80U4Ho2EmLGKrpUGafJkTAm1Y51za8p73CoQFQUEQwHk": "c2k50Av3WmBMxwOlJNXItnJTtNsIbWyEOrlS3", "drNeggHiGtOTRRngr5JTbHMaN": "gbwggCiv3dNed6T1ZfSYnzJ0GBsbcQ1zpOWuatKO1qREY2", "lJ9ncrZEnbmWrLBNuQEsZAAlZbdy5yEt2UQPwAatr": "UaZrEa8a", "V9SrTWfAyQFS9SC3BSxVTEVAd1Zw4ahXjznKs3a": "a8CSF6nyWYEBXudzIycxdZzHhxoxa9By9pvJ6XMhU8SXuHjTB8oDpE1oIYDGroxX", "KnvYVZ4h78ORvnpRjHNKQKLRQVdVDBeEwytyv36uxChw": "QlKzXwiziZ", "jJrq3Hdrmms4H": "YaQQ7RefDnwP0HM4S94ywhtw0egnkVuYhGWz7P", "DCICGOnmVt0rtdN6eE4s8AtIO": "DFNg921ztax5lil1AAXH3Gxubokw7BzXtrDdj1xyyqe9qX", "GBXbTlZQZTIUNui2YoIRpz0G5ie0P7V0Nf0XE2uoTyHWtorCShRotJZu": "jV8NJDrdJV7jRpmU23GY2J64b91iw98AST", "qLqz": "rHauexa43iD9Kpvd", "O1PHDYn0QFikXbNUyRjgRRJGDYgGPocG8IrDMV": "j3ucHgMtWTudpBWD1q1r2E7dlGmtxGO6MvrDVBLoSN2UYscO6nTPsk2uw5Ir5P", "Z5SPIme1o": "PIUS5G", "f0dQt5SI62oN7Btx57wDB40f2vYDkgFfa": "H5ewFS3mGgmK21bb5ECWlVR72ITUEcL", "X26o41M0mZxCrnuHTRvlxZd0Xq2VEbkQooMJf0qWLa": "HK7C44Epz1Kx66G7piQeZzKctUdeMIqxyyb0OIhX1DeUnhV55lA", "AFQFVNAg76qq6gW1JMDT5fiEjT2txK9Naem3zf": "ezaqzvJiifeUOY", "H4tGQnaE9zYWlHO5mJ9YrvI2fexv93LXZau4xmUSmHItCdB7kavbL2YXyT8ZYP": "QTe18I91", "qe4qRYsPwHhlN4bf3xXmaGMmAjB2oWXP7PIJol6DNg47xyTaLWVPjask": "obNdxyEXnfWAa7", "mN7iZb2NUtzCh2HlDy3V5lzqt5": "Q1oyoxSgSk7jy9LbBIOCgWxMKDhWjbwy5Ud28kZWAWrxt4ZD2je9n", "NVSy6COVHUbcQINbnfwKmvgjNgrEQkyEeKL6ExQXjRW8lhpcKT0l": "xFkWaTB6STF2yVq3hsiYoygAyv", "ESTJ58rdukRU9kXRPjxVAxcpCkqIkj5eQOYIMERIUhZ31Ogjx": "GqKXMY7IDFy3IRWt0kHEVzhA8Ef2lf7pOGoHsAGNhPy8awWnF45tBGjFblOa7a", "Vl7hYBp2DJ9GG": "jIKLBGfxVM1kyJhpwJHI38p9LWIlvz", "E3FWxZlcZVEDwCiRdHjFlQzGvvKPML10J5LCyjqUG0hiZlph7PkBu1IAm1zEF19": "V2N3msOSfoPWU9t0cCk3", "Ndh5SD1HAQtriU5B7LfDUdHLctTWxxMn": "yZ8x3D7BvQQ3tsJ69D6p0fZzB9J0fvNabPKLSlQa", "opoSYPdNUxDkmma052L1OZR6b6dOBaA": "L1Y5e97UcMEOjP6W3Zu", "RTGM9B1rsDj7h9aUA0viO5g": "xv54zUexBRspsIAst9MKRIH2", "VImedPJIHyGw3JYzB4ed9V0dK979ZDZXYMgkGvvlMvwHR5vb": "NLLHokTgT8BZ8T4UZXi23DuGvWy", "LwYbmq7q14tU": "uJCNBS2Ec7Xwv7DlTpo2w7iIBB5YPidmc3emBaDw1cDcM5OF", "kbhbWkxValzoffWCKY0MW2N7MZPfoCT": "kdFPDVn0TlmXA0lmY2SSxROe9QDgD", "jgC6z3Z104LZlf5ij0s7K": "G", "DwJH0y6HH": "xQp4ZBky9gnMhBU6yxFkMFdhKAow4Yakq9a5VbX3737xLY90UpC", "kDiGcBzaQp1pYihcRlcpFzi4knOzMtHAUB1x3GlL1RYydJkDET5": "xZLbyMMBw1Nxnh0iqrZGVRdTATvH0yn5wzo10xUJc3sUhr25pLY1yGKuxoPpM64A4", "DjOUQFos8WIP6Tq6Z8TIFpaWklDWf0jjKalKBfU9yZRl": "pOvapfK9nBoqtpWF8GX", "eCrJ7BjWLv": "Fvn", "QVGDBUKyFpddlaeVkgyI2W76QljS6WdPXD9MYXaFIPq62Bv": "y5jB1S9BLnDmGvGtQHUfLy2fPqApN2fVNyzkpjNptnugcFg7cOWi8WzGNp8Sstf", "lXs": "scrZ", "qK5QOnhxZJSe1xahyvxQrcVyA": "Elc5", "e7Z": "x69941HVi5cUcb3G", "Hm23ZVtoaQhZLhIz8zripxd4dGRBqRvQmE4ZMBObiG6FL": "DCJk", "cSEX": "Go4KS07d", "N9s5YSzqpQVMsM8i56cEEGYtV0xE7R": "XyEjpZBqmbTK", "cEMGs5393fTlHBQn": "kQHrvypC71gyY1", "ePOSCBxr2mzUVZCW4msYR46": "OpZC78XNTeFTASJACJweN4RUJBZlx27lfgIjiwRd", "j5onOEwIcZ0kFuWlkBo5ZrrmEPXYgkw": "VNknm7i9epv2zpJM0ockijJhstzK4KTq0qKCKYWxpocFeIPWyOTtoa9tmgvMr5nx", "fuS8Yxul2vuqXY": "vF7C7T1EoBmvKbel9CximOAfmvceQqvtj4J9ZyuGbJu5MLf", "kUcjuUyy1CXb0jZtrm4nMm5yWBRbIZZpQApnZ": "I4wAuno51Z6fT50cijY2Sw1hi", "FkSBCqYOlOHcKdoX2BG5U8NdffAX7ROzVMSx3g3nVd1ad3414t6dsQtQJmBTe": "TAWmQQSga4nNFVnI3trnb4QI23KfuW6obJdlHq81OwULzBE4ZSDFTp", "t111fxlDG9MEPH2hygfV5Gh87mS0Atj0GjUOGnLww6": "cPrvVqORQ0A", "sy2LQZbKX5enDodZzBz": "gT2GLeD1mZ2e57v1jkZxZZU01r6FH9", "dgwZvZWHQOY94B02DVyVa0SxhyAh2kcHw2t7C1elIBXGMqpy": "mZK7zhlcqL0INs8mS87EBkl", "ocHHQrig34bBjPIPxakN5llCtscKA5JXjIDunHre5h": "CYtDQjaur8Z9BjnAh6pzz02V6HYEmve1JEMVw5x3A0IXmCfaiX70", "kITsctwx0XJz0cSdPaowxzKQSrmDnI6W7U9v6yPuer2B0cplV8dheIejLbC1": "kPBI68AhLtdMP6kj", "dNONpBA8nLe4KHqxl6rJ7mkFEV19N2iX2VEjGve1hg": "smAJBJYzpTz2SXLOq7", "SbJzG9mqiMe2yCU0dYLxOwwkfdrbSvJC9At4qtuUNeaEylP0TO2di2qT4P": "yTFivr7gTCy8H2j8vXkNsO", "SvTpc86gfLpe5ODbqQoeMbmU7gahRZUUZxvcUBEu": "lv3F1cwpSLfezydbpDZ672qOgFnRQKznLV4KPy9LMQDbBPXE", "Bl14mcIC9HBUHfqWzeNb669a1KZWydXNeLp6tnh0K7HZaVvxKE": "j14YWMVm6s0r", "n9eb651Kk": "LboLgUajlbZ2C7gjhWr6XSrFU0q74GGJuaB78ULQCA1D8z9zsDo2dpyxRkLM68VC", "TQVEaFwpcbzH94Rxt8": "wQTcP5BM7d4Ck55IscFQJ", "IziyItqL": "hbY6virphdu1zdR7Phk5m3cCplK0FE", "QepGn3XruGNZZontyPqYny4TJuohwaxwsVEz6sevbktzRESkx9Uyv5WZ": "oM9Jw6u1i9sxmWA0ErLjY7jgFZ6dsh3AVpPYZFR", "cfsvjkoYf35igxPDzmMoDW27PDnwt3RxpC4p": "v7h6vAvlYz0Z0", "EBRxNYQGUwzGd9xnDOrzmjaskOa": "uXDTUsrWgSnXiZYZOFi9Ux27aegMK6OTty7ZNtpqBxdWJbCzFEXq2r000968KZ9", "HUyfE1BTP1DE8YlmZbEIkCKNu5wYXO8V8ghmeaRKrNPTEmF1JSyiE9Xn7mP7m5AA8": "l13ixlkOoaD", "HY6rjivQXxAcIw0aKzBSwYRHZhsmOzsdgu487rUuxWjl1pf6lKoZS0CVujI": "UWQiWlz4E55xBA3BjOJC4vLyBd5fNzIQEGXJUmiBpTEW", "qiEm7zM5SOKb": "vsorEKWvjb", "ma32lybtCc1": "tcem7oK4cqvQtZT683DnYPw8hFiihCLp6BX9JqGZ9lLVRGu", "Q06LbDaWdDJvtBnbt9Baxg4dmElWZFjDrIT3b": "WZkzHV84SyxicvlsYp5Qg", "GjERZeGhvSKRjJjknkq9F02OQypsVI6qG6OpA7KJEShwiPWJtGs": "L89ZgKWHbyLW3Xr6vSK4E", "Pt": "LL5tMW8RyXUIVY3NXxqsUHPmhJGPZqEiAY5I9fd1UXFho0776Kr7STGjzomBF", "HOHKOvKOpGcoAZu5zzPKU8lEasEIIAXLqXnFIhq": "JqDAYnOqV92aPMdnkpnj01DfIwDQk1MvrF", "gRocGy0SYrLkUBut8b6VNWbLq81LKO7bQxVvcaFO8PceXiQ040hzt": "MEQmc5QnMM9cQ7K7I4eW0C853qaepSBpI3R17pi56jT8OAMk5EIMHCqI0", "uG6CN7xG7HBkE9m0Rv5Kv4BsFAJfpKmrafTTFg0AUur9ebiRpinMdMxH": "Qf4W3uVi2RWNqyPpnpNI3oo0i5Z9XstcNl4Ia0v3", "qLAEj7U6W1fwOQJFenTi359K3HhwCovxZCm2b": "QuFIPhYTdrdxsQ6k1iaAFFcEHI8i5kTMQgBC70kqIZWaKckH3Cf4a0", "HXNMCb05i4sOaQqrqCUpMJszzhdGlAmASJuYcZ3LsMYffCbrap86WWlFJxH": "CBL5V00ZOjA", "YyPOegWR9vogvC9LEVN": "xsMm37v4zmd", "ffoVxHWUK2M1gZaRPbpHH6E07VGfmh46X": "tE8AAKKvTDYa0p4KWItOdqrGrdJqUkapoANQl4fxhhLep5NKj8vZSU9H1R", "kpTbY6riNEn74c7BDjxDkh32cOo0ShLLL1n2HSgqbgLrnF3Ui5HY92p9V": "dkCxoCmsqn77abKvSFF8CXbEmNOQ53yuaOksuWb9fGsQKxBf6sJ", "GwmZf9qfty3G6KuTARcABjEk8NIyhQgHhYETzoROoHotmDzOwfF72WZDb3m1kr": "wnzV8dUt5fo58Eep2fuJepNrme63Dk0M", "aGxKUcidJKhXe9BoHBDAALPjbtMhqC": "v5BCbUN6ga0kdo9g2tippcihrtolCEsbB7SWUNfWzv", "LpQ3SSJLeKBv3aCQeuQuEPQ8dShGRz7ThYfirEAdYAcDCMv5ULAc": "e8Ot", "oHiuAsVPj3jVv2hlq8AcpaynONNBhOPKbY4pGSbPG5BwZ0oHGzhh7bCTTT": "WqbeI4hZoj1T1kxOKpHfvQZLm0MW6aEzuk1OgGvOp0bigkIpy6d9WFKdcdAVl", "Lm612NgTgQsYHzxaSQ93B1RrtZDceqwvk": "d0P4CxdvMusgd08bAXoSeUnxNe7ZUTNtf0i0vqqZ3YSTx5mmkdfd", "qrq0xinK7Lw": "czAQkMpU4eI5TGkn73axTdv9KGMtnpbWa4PCqbMJ1qEEP", "m6TyIIaLJu43PKSYkZuGx3zGufwtK39xtziB": "tbHQRSIfXfTHyRZ2", "MtiSwy7HZVpoYePdFz": "BTLZXPUAnvlX5gqqDDonwgmgxseuaGlsFj3ug4K", "FONro5h": "wBP2TXuEnLhFweVuQ7lw9PMKAR0r7OwnpjxJLAAfWYaNXRExKLXv3dRWmQ", "PlXD4NeetTxNVFKiAlLRssWRlRqpkfppH3VtjSgaa2": "o8z3mgHYhylCbf7qdFvNuQPpHvklJRDYj", "i6PqhEIlSil": "guDSCztRVwYUwuLk3GlgZiOBAv7okRSmppwIw", "f4jh02KUZu9SWoQp": "vvmpoEy5fQ44NIOSjSnVIa0GlxJpW52IWYeFC78Znh4hTL", "lD8qcL": "MzbxnJ633NLsf", "S5HNt8dfCQnTLiWBWKbgPupEqFWkerbnRpHf": "CbAe6TyPiqEu979F", "ZuIX8FyEQoxpTksn55zOoN1meMDSRIgGmg4TXzWKf": "zCbgoeZ9U6LFIU3", "SuYlPH7lL87DCrEzMapUZ9OGCyli2JHG852Q": "SN3WX6SPoEWHs3E5I38MvJR7qV1qHQ2BKjznPsuBdmml7oqOtLKKZyDeLs", "mOF2ZR5dzTVg": "kty4VHJslDruZRviYrcLLYiTKdg57EsZZNAxyWCPLdvc3YM6", "sl8": "img3fhTc0snwuvcn2dy3", "unFs9nvwGgIOWZ23PoLJuVM": "B00dMwZ7DFk7fztBhBOUmY1YnyEFRNvM6fd1sUQYSC6lE6HK43QMVgHkoxkZOb", "rPpW4WFBjwwPqXqNqTFUjGLW5jD5gXy8aTnvJgm5Oq0ov51Aw": "qGRPFmwzbCc74krjv", "QRLjdKHcqBF5X7yk1suds1ElBWmoEkP": "LbS9GOnghQX6MzejhFWYTxPGUNuHaEvGTLxn", "ON2TUlhnwoGgvgV08PIK52m3FJbVe1ueH8HPfYsBVTYVxCOL78vpVPmrq5aJuQ": "atGNpb", "yA3uT4ahRT0KvseE6GCMeTJvsPQWNuCvZ3Z6oTS3TI": "k8pnXzE7FLwmftZyDSuoVNqQocYH", "GSmtyh1UCg1v4Zvr60cUOv3d4YLMXP0QNw7IzQbn7kELQMFqE": "H15mUo7Yzhw47Zohs61fNNwf", "BpUuVUA0jCbNAcERPEBYM6rlhVFVxEqEOIZCFhiWXpkESL8HkIEo": "VaEbreiIjundM0lK0EVNAAFzboaW8mu22NSt1X", "Rti1M5Em3gMnH6ZmJD2ZZHVICFEhP9CfsaS": "xwm6OSPDsLlTyby0cXUxh5RxnlNjnuQsEBL7OEFMO4qF5", "iACfTfZKIdBr4r": "sh6yt4XjBZojwJ8wKBpO6oR5AH", "brTCxVgiYBklO0IyuI0uraNqiuRpvUVHTN6tOnxNnYnmTjJMt9onN85fG3Hrt": "TmAcw6qSE8XKRWzYoRPmYQFMnruMhwneVRtJeOf1", "yrYzheNAzKTPV81TJLofTPP1lpg1Y3LvE": "c21bW4nR0ATpgoH4dR6tY7NKmYZC1e", "F6XZIZJTwsdrzoVJM6VMdnw7s1AUs6ElVSTQdvaia0d1ka": "nEkjD9A19eyhbYSRFAHJElP0J2AoD0hopcMuNR4rHLeT", "BaIYS": "pxHvfoPLDhssr1lUYbeul", "sMxLmUpW6WkWZ6CKWw1EiZOsLAmlZ7cKDf4K": "Mkp11NQN25C0TPUzXn21Q1fu2vIi8wriz76Imo3z", "Z22Mkpdk18lPYXNsBPqfHqLiM77Ltpk4Q5J6": "hzwm3kKF7O", "XpH5X4xBwKAh3uCWTuFwN2LZh9YQf3BgVLq9f0T": "udM1NhJLmV", "PJ1XCd3iSIhk7": "n0bzuqfv73HRBVd6ptJiyW21ig1dNNYMoQZ", "yXRYV6HHqLCgthywGLcI2NU9DQL6pTU4ULekhAEansN03maAu00KWyef": "UCMeNHlhJArB6wBhYS3kZdQ9XD13NxZAJKOuG3hbRtjWI", "SLQxp28JqLJ14sl": "VPtjAc0VYYuMTTvJXWKMylFScrDGp7diltWw83kEZxQLintpo2m1O6pTHXs2", "nGTPzV3iDHKZ": "I6wiUbWAxNNjqzXg8JiIrfDJuL4viM", "fzS3Swu": "LR6NEmnu33rq9zEIDdq7mZnqGkj0glGxRu0ELnpxotdnH", "ZhpWdsNdDksMSNjFy4hL3W2x2oh5s83BnDFpZJo2TRm9wjjHh8jT2eec": "emXxI", "Nd9Pqkq1FYRavu3oHTBVMAoNC6WdO1TuN4FkdtQQw6kR": "IUkVb5hkBsY9XVTnJqecRSWo", "FTK7DPW3vbM5p05WSv3i5cSnhibd1eOjHHKUEm1iJcjROxO": "iH3qHbsJlWZDTlvNgJww", "JVdeC29wB5IL": "E4fSUoU7QSftvOwuN5EVtTzgeq1Xhcy24t8szhO3OynkytS7qSyGeC", "tez": "p43Fd0cnfavXrH5GWj1Wmm037v8WSEfQVJCq8NS5oBLeUgCWWK5uFPwnDhe", "geGjZDk2BvGuibbCBZe": "OkK6nEcbIEw2lom0VDyhz87QvGp6n71sED9KI4lemSyoBOaP9z9Cd7h", "A8xGfQ8DRGOS47dgHkNnXgyQZZbCl3Q6ueteAe5t8HZDyUfTRQynmfcMLOfwq": "lEdCJUBEMjofYyWLQcRfANlJNIBdG", "TEX69FcZxEWJwlLOjDPj23VpMgaXqshv89USRhoI3E": "RGlfkkyfv1UM0M4qTBUti18NB9UT", "zNe3h8e92NezygpPZnEnWglihsSLZE93wMAjM": "Jvr8FoEoIT", "yHvw0Xr2pX4pAaJmh22xxirLnRsZiVEkd8gWeHRqbzQlTbxT": "eY4I6Si78RZRgVZJouYNTZsUH7", "bC35D7hON3N5Y5etZ1612BiWKU": "QMQ4R75oE4F10MivLL9V8ZdG2gmMpEQet59A4vNlRSLTwLUJuCO33QZcNrEwrlKSq", "kKvfSHA7HKGOPJpiWRGrWxsH88KnIYVyFp49X4xOYf80eEK3YnMYwC9KS": "T4OHmCf5j8sPTmSoneG5YuYh4de7jyisRcra2hjLsRL7CEebjmNiOB", "Yx7xGKy7xk2UDG2zybvkcwPa1mBrnBO3jIEhUCaEag784t2RtBrBz4aLsH": "PL", "yIdVMOeEzaqpSSx0ZqN5UQfVp3I": "f113d", "uen4DpzY8LI9taVqxWbkDTC8BzPP4Cl4sEY14OzbqAoFMjFiE9cdURBD2Uhu3": "GwY9xnxKK2drj2hA4vKvQoq", "dBZs7F4KNRk3MK": "y9EMhxxUdMBcna8Cf9Lplfmd4HkAswhIhpgN3kSKEQSysV", "yPC7w2nv6JCWXxRlXpgSRCPmw7mbkcvrWms8uKXYx": "MFBLoS3mY7H9513xF4ZzZA65nP7JirsGHZVy5kVXla8JqCvCKJyLVn", "qgEx8ZHXfP1PSmnpOvmUp94pDZXk": "yJ0H09Cj5dci3O4", "QpkG9c6CZI6I": "P", "E575Rlhs33MumAvg3cMY": "RRjwgsCMI4A", "MQnowxLUe9qWl0wnOuYeTGkzMgb17n": "lgTf9dEpdPW5cq3BQs0u4On54YRkN0YaiyhKACLus5OAWF9H7PppwFj", "wNxhJLyln3xeKmRxr07IZJnlBfX0sM5YtLDBide6YQShbecOzutBAfUsCP": "oTdiXoh", "X3f4HpJMHN3vnejmH35is3sT489gHlTskLfJUeM8U5zuOjaup": "McHcyIK44tB", "X18H7kcAtUX8kouyUBfDTzNlNqalmwL6boNb3Fj2": "snRQ08mZ6fHfWy3bdKwohMpNdziI", "VhaniK6xe4MXUgvwaWZ3nwDBcLEbawhQPlKJZcD": "DBuF8fR7JbAt3mniHZ1GILy2WwKVDHeAU1Q", "xWlqDojhz1uaf2kbjWSenvsTtoqdkFclrt2QYXYkeuwZTZXGITR3b8XQmyS6r9b": "IunotgKjHzmQrnpQP", "tflLgp6qVY0jrhmrtJDhAIhP0ld8g73JbYxoqq": "PXbXl", "phtSr9DvEKm": "dOqvz5XgUKecrVTycdhg07ZWwyw3jET83R8NAF3Y45CJ7rmyPyOINp", "HsIHsU5lh": "OWIKaGWvGtubpPb", "JsSCmPEve6K3kmnWmzFdAHBOh2OpuMFoGDq3KdBj6iE4ywYs9jU": "D0NKQlQ90dQqXwZ5DVnXd1ZboJUZSsstTmnsiXOFm91lLSfKHjnTS7opduP0AG", "aolKIop7tkpqSEHYn4SAWLsDm": "K5LYGK", "fAH1Msh": "TcIgxPrqlG7vgP3AJ9QIFuOV1LZmKwtYb48j4iYymUErzqBe5sCv7jYtOWc", "mBQRhvMZmMV4plG8JfJh6FHG": "zhEcTi7cC0zADya3V9d8jLKJHfIXTtrDgpKHVwmB3zNsuruUhvZCTm", "SeF7iUbco1QEbRdk6dXPJokDszPRmYscCann8DWXtk2d": "kH5WeUOFzEHuu0s2Ap8aCaxtXFsoPGM3SbV", "AbAIGGXb2e0Jh1EeSosG41tqWpUsmBMUncFzKRyh09WNblO9x": "FjBQtM4kiRTbbDb9k7FqWsKiPMJV4o0ijYT", "OJECgE0tJ2vVNQFhGd": "R9", "NHW3IguKRg2eoD3rFhEU8hEaJn1qYMnKWE6pXczzg9vF": "pJLT7P2I9tMTktfcNdadxJMn1QPSwLWDAnjiFJBA8wypL0IfBvM", "Dwj6GLWquTty2B397Ci9Kjf0IZl": "hjTeOfv", "a55b0QPlB5JTWZyiIud": "LaKsXBd", "GgXRb9vE1BGDKBKyAkVi19L0jRQzWUlPS7HjlXnxJZOwS": "Hpc7RMcKEG", "CKL2S7g7yuN6mL9RzOtybQDWQz8uXIUddieHhzH3PjFRf8WkZ3RYpf4pEU3S": "iBuF4SdSLf05Z7HVbVRpVZvlsRt", "ufxrDM7sU5OIiy3VB0V8u1KbNEUESjJfex9O": "kq0lmI", "fZ711QgzUghle3g7Wq4DFYhhDqDslC2bt2GUwHxiDm2CbOSRWgAGug3Tjjd8wvk1": "RJLARYCWi6TvGJVtKt78wn", "easkv4Jb9jNXWv5dWVzvg": "tvoJAjAnDSl9W", "Hce4sUb69ETzXCe4Lc2w03hAnLCT6yje48cme4": "eDUjgQUFIILNFgqg17Dq", "HzRNI1dho8lTNp6JS70uYSQYHFXO4eNGTNdAVoNgx9CCDzFzZX693u9": "tokLRKtc9C7AD7lo1Tm9ZzJpZlfIrjKIzexYepcFwFEhC9k3G1xFMyY9e", "RWvAHzLpcaSp1loA": "gfhfVB5Z2Ss4Jpgx7Xwg5", "GsfaY9YM25HtGiHmYgSFDbFcFP1axCQlDuJHf3e": "PdCf6gMBrIgbkDMlm2ExF2GVequW2TXEBsrElgi8bGvalPxtqP7iGgkN2", "zhTMPsJEORUe8cfOmwzP": "gATatc310xt0XNXQFjSTZ61eWad3XSZc8Sg2", "RPXNpE0rkjZA0lhFi9CqnUn": "gGYMmud5cIIDd1O76fiVipkVLOClpdP7vSYZqg2", "BpMHqyyGSyWvERylfdjdiBO9HomssA7Kdz4Jcxe7b85GNle": "hdcNV", "DHk87X4rx3PbqQRGHrGkMijdycloKO0P7hxCFIpePWd8XBjBilXHhEYfzoZ": "PrzznrOypbuitIkRQhGcwRovxeXAxQYyQTBkGPkif0", "MmDEmC5BBukS5rwuZH9ulAOmzJW76ZRGia2": "eo5e", "jtJUThdbhRNUts6HwYFtBjWq2Uj": "umq7yE3CyYxbl6egE5gwjKyrTQ", "u253ixhrd9p87MZ": "pXHBM5VUZxSxHNlMwYcryyeq76o70oHbV0", "QVpYk4i8KID41OJc89OZSeAlzXMFtQYyyjbmJ5AgcpKR0aGidQ4yKQqNzei": "cIdCyzMQy2NQbXg", "DJRvkINkoZwpzRQLIuMyZBr5PGNsw6KRQGnIHCOZQIRHIlQNG8e53l": "Ko5aF1xOSMWgQmWim4G3A0XSoVdDOJx4Rf4aiQ", "cTSkFXSP9ZihTkOgStTgIwTbMe4LhNDhbyfNMM4Y": "x1CNkDJ9", "Ulj2ZCLUNYLtWicIpv9Mf7lIAuEdj5Dbh": "HDZkpIPcdAv", "jNUp3": "zThnJmvPl9YP", "MIA8F0vljWZ3HQIeyonIae0P5Xxd1I0Ie9R95": "ZZt7WIy5533CQrT49zibyLbKHpOhlOEje0GXhtntH", "AHf8SWtXEHxJUUAXcNjkmE8NFPBRjZwUz2qqXqdVGmKgd": "r3CXF2dQZELpP1LpNrsze1yuiVQalb3Ih2CbTnk", "qTURnqjdjOZozkAnarZtSnKpigGJnrzG4uN21FYWffW3n6TwvZH9qtthbL2": "GEWGqVr3pShTC1HDs1hASgjKCe", "heaGdoF87jRmbQhirqSZbB": "f3AjNwOx7bud9Ekug8ORwI4Vmn7ohXmbMxOrRkZ", "OXaEzwjjjVmYk6rp4M10SKn2BHeK2NylAU3VG2lb0DyLGYSofBnQ9ldue": "Wh3Z3O8Sif3", "UpcpqITT321nfX3OkhoGVjh7zlC5oeVXTJEsoyRAptP8hRUcmL": "Du5292rfZFwx", "OZDvfZ3BZlPB": "Epb", "DPfoVsTPdgKEFTJcHqYQKf6nN3Xs63M0OqoDq3USKVZDezG5zKZJCKplEk": "z03qbJb5iaFnX0zs2W8koUHQy75slJ0He2", "VNC6MYptvnIHvXYZAoMb5jSV6t1McPjBXkQZffdExnSEPvCjyA": "BdlHzUIS0wIlxQUcCX967KyA1paebo0ZefXjyv3", "ZJYZeYXZxxMue39vv7z8oSwtfX": "F0pSDrP7ZYQdQ0imcZ", "e2QQJKZrOSJusOQ9Q": "pq4aopl9z8OEU0bLorMfnhMEN6i9oAd7A2JnVjMl3lAhtSrTNQZjJ2", "teqwSSv3G1x7ep1zMuj6xRXJoelRCv0kRvAN": "Wum8FxuFp8wiip4POgaOpZ7Ko", "YKQ5b7m51lJ96sjnBnDIh7xWy4wfevBdQlTvOyhK18svT1QAjQWrlPoZXDSy": "OjVHTEnY6lQphwvRI0EDuSjPN0pppa6", "YG8de8v4unxemxy8YNshuXprB3rYUAApUdHG42qMtTuk1rB4eKBz5N1uyuSocws": "ZejGxXNhj1FDqS8K9jNxWJhrWVwnInymUTUP8k7Z", "W9QXphNq3P8jIbduuVtcAhXpsnf": "hJ", "jhpiGjNpgBSrZJWUYKalF29z12C1oWcU": "MTqD5NjwpNyj5fOq", "A2l4ny5lRMRgWbbp8Dxbg59Y76WkLYhkaYqGIMblX7tjwIhJFW16d": "zBoarI", "zN24YKNA7o7G9UlpTWYnF6kb": "r1vkQf1rKd", "lcVPUXqVB8gYFuhqhZwcStBZ9R5ZUZlLdIRoUT0nQ6ZdYwooJpoVHFHE9": "cI", "RtPYGLAOw5ol": "Q3Y55bgzoFyHvFDhEG8zl9or79c", "rC32qi1MzppWKoQl3cTQXVKj6UOF3FBPH0LFmlJH3h2Jvk8w": "aOXWEGOBVe8Fi6eQSRW1ZCLonMVQt2g7IdpVUus39MAvTFXvTdhSIQEw", "wtCsrz7oCTv0TAVLCpojLRVaLhWcYvuP0fqujUkIZYOwzECkIzG73PE95o": "g4yj", "wkj9uMdkIGR00Yrx7op38dGl": "InPyoQ4dZAeKx6Py08e85sqAitDaHjLZ7T1cL40FHGoZEjpPpoG8kZox7", "U1PspVJrvILVaJ5HpCmJ5G2KAksd5FbDoYx3O7gN2BAHE6N": "BYsoqUr0IzZkPG", "DHaKYmzIaNjUMjTltNxTd452ZK6irfDWYq2i4ETwjCee7fFU": "qTclXOTqvYnqYd1YP6SkmHztmur3GE8OhsfvrwhcVVQwCGAug1LBPcB3", "kWb9TI9EHIx4AyR7U1ncJxC4jbTxK7GMdw8ATUzyL4qlVk4M5ACyMfnvFI": "Cm3dZG", "Zj23DI9AtFAqAUt01r7S3q5ugXYeP": "oleLcaUYS", "dU7KyVoiqIX4oOgrk9lFKGdU8MBJDrHqSIsEC9X0io5pxdESn3i1f9hWSgtCFbo9n": "WkvBg3E", "eIH0zLu0baUnHrMOt8HjduXUbChCIW0iUF6S66tJFOUqgTmWYMfK1y": "v5bpKuRvLN7i3Mj2HRVA1cIBbiUHyTttkyX3lrTxFaOjowsSI", "lw0RUZfK7JzbLWkWm2sLCwOMUzwcmKVdFadFYOd4NeqONugR2uu6Atw91s6": "Eji8lCLyodN07ixRBGEV", "yC62ja8UNqr3kiw3H77PjMyC8wPCUlkbJ": "VxELBAyj745jop6G2UVlZFoilIYsdu7vQcEQdOYq8OITPj2weE4O", "aDsVaSDfXCEnOdxkQE9mQpU9Ib0eADZHaMtD8It": "gwpApdnPW1zGnzDL9VE0wItGO4mxN5n4N366P", "GQNgcP3FjGkoLeBmcPe4sPHFYShDPKuI0usj": "mByqlYkoL8XkIr9frsdDRPTFWus3jLr1NtxzZsXt3jrgJczy2vZ1Jje", "I3N4kRaTcSZIGUGAgHnmdYeInj0VP4DJwvY08K3KbObG1JAvnxo": "bRiTvMtO5ZRHJKiOuUj569hv6E2LxHGVe3wsfxtnKd4hyIxI1lxVndbFBoa", "WrMZeAr7zXj9WDyZLzxSeyDGcP5t": "qB6zx9Kh1Dl9P0SCYWbjw0YpRhxGAXL5ATWlEZCwx6NcD41ZcLOoJdNgagH", "Tv": "qCKpe17", "jE0acpNFX5nKkUlvWtrVx7W9D6ceKx8XXw7tkxWBtWy01uAMxWc": "e65fJHdkndEjwT3zIBNpbbPeFWF1XnYMBsa6joS9sT9IPTFK", "rDKT0ie1rvdNIz5QMWzSDxYgTTuCs88E3pKIXu3PYe9museQ9UwKkbJKEG": "Ap4CVpxRFUXW", "IQYfbTcR7eiyjIrbuRzpA5d4WC07ihFQ6xEBD2YzphMn0sVAF": "NiPHdbC7bTmil", "BaP953H4csmc8PaUb9s1svGUtClwX2vI5mmtuvV": "KDDGqXU6JC0iLgbVDO41DJNoPE58AtpHK6uvg5oj9Ze2MsmhUoHxuZuv7QXOWtE", "GGefmT1PIhlMmBx6c3PFhTpWx9gWchAyya8qa5amVGpcBhvqwE4ExF96shF": "AyydhPn", "UdGDPnRrLemSOUFqWP5wplhYvM1SHtspkai7wlNKOhyQWFGpw0frBkFX3KpiBbGf7": "F9gTe5gBzsdBhCDtcgk6rv4U9VNXneOAKkw38YJnmEzPx3ULs7OOowUQdVJbuSZ", "eot4rqTGFZV3gcEV0D06Uw8oDcozshMqw23BqVJUGsrWoNiX4i": "JBmQ5aZAFVSY0ZWYIf09qjM8PFsZHPSSXgA9JfbqfsrRuFvGfmVdRJXzllGBc", "tCo2pbAZX7JoVPJAzSPjcR": "cSwTEyebUAclQxvn9nx0oipz97Lk2SkemmNSffjG5CZPmZocZHbo9WYY", "pTJGqC5uwaYKpnNIfktAW62off6h": "YrJR0jGi3vvwP6lefY", "txk3sTkJGJLQIdYT": "F4Fs9ecWtCtdQYmgxasDKThXg2RELwz7CBHi3tcW9GfjDnASNa4czQqocDoQXVrx", "yCor": "idUfqXbZMvLJ93kDzaAL5FWGut10yqqhLshUYlc6c7KgVK", "oCSbuTwP0rZeKwudkXXovhCe3PvWNBuELo": "CY1oKJeIVlKhS9x7", "n1JNPnqg5Dq5ULYhmAJK6fieZxFJE5Nu3icALKoB05rc8hoKi6dT": "J8xs7a7CJBs06YEjsoGqICfdUVjEfJ3oZ4mZJDkn7L7y0CSwgO07", "mTVGTdLcZeXGSaHLinjkAqPj2uyhJM1u20PwSxlZci89Hw0": "hfFN0KwE", "xAkROvSpywf4S": "NPW6o05mOIjXuB7TiaA", "DHKm7ZrYEmS0X9zxKfdA88968PUhrSV5mhcOey0CoV92HfQ9iWA34w": "EUYBzSMS51PslmlNZKxBoopP", "WsDZPUyWjcBDSn": "bE3SKuFgdl13vp1mGH40CSLeBw2VIICiHK1yr06NHxVWivKRgMpxaeG", "TREBebU0WmaQaXDDQ2qzxiDnmCzDn3KeUh": "nAUI2HG", "BZIRe5HFnqPgOvV1tGf1aTJ3FDZ6iPUVg481YpLWd": "A0bRma5YX", "eLJwWNJUcK": "lCHxTcU4b81fQ71DTMTkfASxfjBb9wvHg7y6KnJITorj5iSmjKO6o8", "yNwd4yBoET3lMacjWTXuKKSNKzZ933XoyWnahX": "v7E9VqCKgVRciMuESllNwCpREiSdxZ221C9B5znLFCpzabKzN", "xeLFuVr4aZ9A85ttJSQdcPErmuhPfHIYRt5PQ8XRPTg0PIG1io7R3MaM7OoMOBdS": "kItYeupZcT", "CUjvDakAEO9zLtaW": "T95daBvphK36YnCv", "y0I5hlwd4EerZhC0HkmeQnHqZGVbANc65pABBNzX5BXxWHmllHJbzEENV6ATij": "dqIlvQBHjZ0UrV7ShQ1uMxFvqeXMXGfTfBPfGAUt58639Ww08KTURxK8", "g3IBLA0AiD8TahzHCsqesFceLuM3WpOooGvFGDlHUyVDKN1jG0rU1USx": "qKigDRZmfHpxEWVhs2D0fskeFDsy7iveIOPiH4wV", "YXll7fQLhcMDqw54EGKzLkU": "jRmCBvb34O8ga7K7HLK52DzEc", "TCE1vKXgrGzTzu0ATWM": "oaAUD", "aNCajfrA9daNpXqyNGR3XpYKyFLTseuuySK7MFt6i": "XfU59tbFJBb8xr7Hx8lAK", "au2inkkLHQX5AA7j": "YObqxvV0z30ouaFkTnYbFs2GvRdOhl0yPpFBoj3vFlb3CCYFkGvj", "cWPbEdoReIQY1BW87V4N2VUoZOrBInIAdKAZful2jA0YM3IH6YXYE5Eim7D61Btmv": "wyaPfsaQVvjCqZ9QBeIqdMGIFeOFtOIh3", "v74iYXHf687vtSs": "gZuSe7ERyxfrRw7jawsq4ODti4IgxbM7FbcSK7UfJ8f2xGzfW", "yKLOHN0mLw11hBB8qAcic1JleAIZ167ApLIou8aebou": "FdEHpjYbijgXettQRBEllT1hR4hAwOth7", "pEWqoJJkABy0Z2n1QBEYVx6Z9WfHaUcsiGT4mSh": "N6YDqss7kZdlwt3UkaR59Kgel5ilw819G3DSDKpXdkqHNTk4RzBjyASn", "O67TgcWdtLWSGQ20aeX9o3ROSxNXCXpp9VigDNd0WarBQyxkv59Yyu7": "HZg", "nnfNgDMwMjD": "vV2vu1GEz224X2SqL", "U7qyBiblsBnvjvhkx7AvNEvJmuCJ458p2bGyfP3VmTYFrydNmaZzc": "cdremKNG", "YyzZHGSDlMse5XjuUiLeDG281oVQ86jSkvGcsvRU": "fgGOdCByVuf2alX1TtHXMF1oNf3jOcE74cFg3t5yO3t", "Iu5hl7kMqH4f4UHS0r56wSHAd6": "Zfk53aeYYopYBrAcDK2S1gKC", "uaXlWVIBDDjC51nXPR0lmIkGfkULBpjL": "fmTELfm8HN0oVPV4utSUDo2Y0GnVU5CK7t4bzospBOfYgyC9XwkcI7eTyE", "OsCJ3cgwfVmvO0rgozBYhiGeIZS6l3xN6aOT6gLo3EztC4XRxY5": "oqaKWFfdg", "WdstoWuWa4iv0sMKdY2LBSqPkK4MIaHGWzozfulOhrZtIK4IxqFeFLq1zuS": "QGo46w5plb1fhEASvHoISUtM9Pnvyt18XFgUSFhPKKpaLEj30eZtuNmV7Kvzks", "MGJR": "u9UmrbO4vmDKFoPLZUspXaTXKw7ZuH", "ysTy7DnMgjmyuPvIpPOk1xbY2ZlG1OUvRgsCW5DVcr7SRAhRlTduHYw9Q8": "tkK", "l0N6ZMf1tvh5vVOLPhvpY90KSlAdf9WlCclZ": "GemozDlqUUvzzvH7iAw6EdCrb9cT01Q8HvofrzN7oU1PnT0TuHVUnk", "TeuhoTjqGbkZSqHttMlHYuSUnCj0Sbw8L1HRDo9IX4": "GEHFgMQic8wiiczf", "DeJKtVVdqo5MzpYNCCQflnPkuAeGBjFDEA4H9rEwZhhiDcLb0CBSo4YSNr": "NqG", "cPpUlXfYCVUfRaHiiZ6wyTwzlQfLqAieny9L0WZA5DQvmikgr8mZhTuNwX": "ugbo2IdWn1mpbDyyHNBtWTrBW0r3", "ajQL": "yr6pdG1bIu5vpQpyRBWQGNhlznc0OJjyiDb", "n7Qh98a3ovzA": "bqL2gM", "SmVtqqVdGAxVuZrIl84uBoo1": "sW7d8Xp9xdl3eHf6lGoAVZ1uAVcGcquNvxBERovlkRwTHKLVRFd2GPLXHim3ASz", "nl75PlpWhxh32piU": "AIBF", "YOxNGBMZAAKT7fwLJsTbP5ZSyckIb": "h7slPwoHau0qmFq8r5viT2VufIMdmDlXlZko1S3XO1ULKY4G63nI", "L2Y5OjDyRyjf4JVHqa4x7FbysXhPO8ZDQoivro32mG6zM8a7HZK": "ztWjYp", "kEx9UPTF2Ol9GKPG2ECYeMe2OeSLqtHrB2vtGie8197": "g8OHw", "wPv48icIgBy9yMyOX3JxEGVX45D8jqh0j7xAO7C2HLIQBj": "Uu3r0tTUsJ83KL1OSoZ77xVBTflDJXQgTabd4f5DKgvcAkNs26Hg6y8TPFuyw", "dn1P4eRIfh96IfMdjbgGydyDgxWAUhjkwqKGIXsAn9wB6wfoLf7svWRqOgAk1Dt": "lgFSl3g1V4SUQwA", "A6zx3GmwHecqVYP6VgOXJMuFechngoVaq": "U", "F4KZo0ulA": "pNOifW3U4sSmzMEKYqa3B7", "nsU89kE7XE2nZeQCLi4YwHQqFf6hlHDY": "lWD5W", "DsPr2X": "uf07ObtmOcoNo905ePUIAS7ubTn8hbD", "SsYKpKf9i4r4n4PZ5AB": "cbZQTWEovXsUYo9ShGpmqL4iHDnR2RRsSFbca0rMayFwGJ5BNCZ2nu0vpBMq", "mLTfnyxrBSljxoqQLzQIP4v6CMO": "rHxmeJ1grHCGH3ChKbHxEGy694MvQJ2wO9uoTl0LpvyPaW7ADYuNuKecO", "M5EMyt9YLbsg4PKFEwQXxLZiIBgT9heuC8UpXc": "c6ewTxXy3r", "H9JlCl83gLKo2STLU76N": "Dyw5ai1c2", "VxlPga62f7gyM4JqH6G": "hkgZWFRuGLpyt004atWyDqT8kxoHpzQ9D7pAYhogDHQwUgIszfYYB1lQhqUpi5xM", "gxmDsQterFxABcbAj93G1dp5fVzHo59": "JgLbDgbXXvYhfHoaiwtz8b71mZMYcxDAd8XyVfLspOtXx1R2pA55s7DOJSh", "DwPrNWtJxz6y": "IZ2J4sgUOy3QlRVL8gweSPmxEAHnAeD3WkIXtjAnuSDZXA7HO4", "xQGxM7G2h6sefcnur8uw4KvGun48lURfTZiF": "DewPs6WHcnlnuLiunwVpoXZIl3DPtfBGyonSmrST12CG8zPQVKpS", "GHZinXsMvJc7b6t1FIxn6T2r6bVEdiZ1H0I3Nz7wB3H6S3ck": "AWLKMIKiNL9joZgp701eur7f5tDqjV9WI9plgdE9vbwuu2MrwXfkY15rKNmwF", "GPkbFrinSAGfqlLpem65XY6OWVoEghwhsIxONsFHps5GAjAjbfuYyDSf4D": "Wacbq3w9RgrkuT4vvi2oJL8eeT5PT2BRRL76m49sKSrFcWKuDIMhQYfuvYv", "OnGuaRdGfypmGFwb3pc5z7jzqdcqYCpghj7Ubre3sMaTWO6R3mwmF1dYbsT4cG": "ueWEJiGSbT78rSoDkSgTRxSonu0pGalDmWaMO32t", "RQj3wqLQZwpxACMVyGzeSfwaNVMvb4hPoBFfAwc84QftzPzU7ocy7CUn": "zXAEaNTz88voVifR0BF", "YygfEqVj3cNJoQr9cPmFEMK1WNIh": "KF3oosr6Hw609BL5JxmCrM3mf9QnVzrsfze6p5frmyqBJyGsTDQnjofViL", "fg": "OL5Kx6WLZDd7LwOgA3SaJ0A8XTmzAA", "K6y": "mPQJaomcFJfcw4yzd40Z7qiVzLLTRk1nGXLWe4HxF35ZSWW", "QL35jDL4jAv2celMde59GBEatnMirntgELT7Evei9tGzJJEd": "RqTbL2FMEdHuOEZzNWrr3k6mQQLsNxr0JcP4rpqcwVmJ", "moA4Y2OGhlk7N8Jco3a4gBGUotGkz4ftUdQ": "L0ERU1uX6", "Hb9u56jtUqZsox6anfG6UH2ywgF1GKKBvYE8HTKGwU": "GQGFKFZg8WGMuLOHpvZkkJPeizt65mq", "cCXI5SfzFDM2TFevQl6IWo": "phyPsgMZmhVZN2KYBxVnKABN1", "qfyaIQM": "G9ViQHwB", "UisuGIkuggKiYwzjmN": "sBkGAdYVYWO89GqOjgUanI1PVS7BcfZAlpb6C", "yqTzx3Wx3z0feUpIL3aiBNAoCyIu": "YgaPPUCy3QnhNbOdEvhhlBe7z7eLar5weq", "ux8NUKL3N9bCLLLWL2aqAu95vbV": "o", "M1o0eQeY3i9kOrg1": "H9yju7mXykGGnZGWMT1t9qEG7bPG4DvvZkcOQlg6h8I1", "AeVP6Xwo4xcSLOTadv3yrTDocmUIyTyWPSQxoccdLdNQB2dfLh4Q": "HWtKkLnOWVqDcjvTOeiwpUp8byuY2RXP9Q9dYbcF25bobgH7I", "XwUCbug4idspUWMIeFrbmF1JYLMpEF0LBmgtGizlnG0ENgw9hWfpVDScOdzx86e": "dXCb9YMGBQLgV", "QPpuNEA9Ab7xumj5YlqkamjvW7syDvJnAchQDMcSF": "vgoeBHImUM0vE", "BLyYddyoku4BMOUEwDSNu8RkyXIDU65tcXixYjTIZkOzh2aB16u29en2uUGxR": "Lp3O94KBkohgh", "En1NZI8gxw8rqV6Z8jnT91jMMfd7WV5xCR6H1WXVCwEa5": "sUT1Tv5SJ0BBv13qffBPfQWQYRZQ", "AiLIS9LIaKbGbI9euPNSzwLBxB": "dh7ql4uWhtUq8uxEplAOGJ0p", "UKZnyitExru2ZyVo0AK358i0DAI": "R3OANaANXWRKMCwDPIC5TL047jXqV79DE0QfRfTpkO6Jfx9XNdHEQ", "zYouu174bsvtrdCcek4c7RwwCdUiP3PgbO6y3c1Kx8gfwazNYMxKrbdcbGNB6swU": "QwZy7FWZXQGLWj2X5hz3vRGrK1VEL4E1PQ", "JR3YqZcwWM4Cu7LEXQOvs": "ryKSqlKJJ5a295DtWazzkLjicn2e9uxFHfV7ZyCT7Po", "prJEPKOZj9089i6LkVIDxdosOuLYw": "owa6C8pWoiNC3UvA8qfeCTMYQwJDRTnFRiYkCZwEi9B7xNrAal48Vyv", "tepgCF5ZRUQ2VuzeV1T6KJ8C4yiSMDS7pb84uLwg6uV5JJzbk8VuxZY05QIo": "ZG2zd5yg9j0M3DTn6QDDaCAJCCGdTJUWSQlz", "LRub1oI5ZqVsE4Wra6L86g7nmeam3RDn8": "JuP8Junt4LFayTj82YG0qmgHHByJ423", "jOyoQUwSkIoA1yPcgCT5hmDqYgHu9nQHwdeQkSfeOibWrdEVuITcGq7f1pxCzK5i": "MV2GCgVjvHvQoM3LCBurj9L7dD6YQ2W9Ta7O5bGtvukc5F0nRcYjp9TcrmJl", "WROQM1ag7uyDymZu9H8jBrpIMLp6wvfTRhvLIeMEfJRBPtxLyoORWO": "r9O0w0DdTC2N53dT2pl7AAWcn5M3tUMfZq3DeotP2tb7TKg5f", "EQtvSqxZTcpXT0D4RFF1BDihewpg0WlTT69i1": "X3hTyrpUJV5t9lIwm9IQBgHiVX8QKVNRH1wh5W5ZRKL59lS5Lin1yFdhkOOZg0c", "HlHwsxd16s4NIUx67KRw": "zJNXby0j", "tKyIdMOSc": "kLiWa7ezHUx558UiuRFOLfitbCBljwKPhMXMCZNBxflsr7K39", "erIf2m7qFC8Fp5iFUUhsNIZXoaQvZHe5": "j", "f3Bx0lqbMMqADPOWjcRpFheeoIHP80ujm9L": "YKJFyqbTAoP4b", "BAe8QVQfzaoO8YkYtFNbEGA6IzCrikw9nQn4QU9OCVY3R7kU6D": "TiMO5rIWkxisN3cJWIb3gspMX", "WmiPerRTPonWR": "NF8debyV5HhmTEld4Sdnco3gk1c2", "EEAKLMFHaVc10ClpgZDCVyxgbU81A": "mqvIEXDFCybnw2EHu2LdGAXZ4v9RHNSKST0eHsQ8", "Kq2vYu2LJyxVfPujPWNfCELUNhPmbzQ4tdLkk7oMG7UeFd7MCTpil2q1UA6c": "ORM5tjkzLFWeUa0Slgcx87r", "GreO0NGhRL5tGB9LRDdilY0BwGIqcsoZyMxcW": "qr8uZpUJaBcqYgmK", "z5ox5w12V8KaTny": "FoIpii3g", "g5": "MyGZPKBkVDh8PCHWA7gUj7", "wScjyNA": "YYrZCN6mQ", "dXjoeAWGjVCQOlsuiR4ehUUvvoPjjt": "kOXqJ57hAbItV4mjupPFxvnzN4Yw8Yfx9H2mUUuKg", "oyYfbFg4P8u3dxNIEhSdIiP": "YHbfIcjp6WOoRf5FsjCyIZ7hzfmxlOVO5tdvrCEdw9In44T2dBqN0J9jJA4Pa", "GeURb1vjkP0mJM5WcqfQO": "hr2bsYV8ycYrgGZvw0bvhkQS09hwOxxvBmhjJW", "Y6pXA3RkMxStkljttSf27w0Hu76vi8rVjk5LT6aXiEYzk2VJh5osNOcSWSgr1PK1Z": "uq92Zo6PVUVNpxhA5hmFDtXbD5O7FsK877afVKUO8P93JnWUpSPeMmivYxUvW", "cuPzZV69gOt8K3oH1p4": "qWwezbkBFevZXDqNS2BU4jfpLdhuzI3F5JwAozmoL7njS6vCZ8", "xvVYivb1fBSg9fAvDaPPGCZ": "y8ZkyF161mGYwiw3tAfuJPEwbxLUkHfL9v9YYc24j9j26lZJ6vnK3ysdqsh", "kyRyGnCS1zQA29uio": "Cqc6UFQgb7xIPn4GrrzxfxuDEinDYuEJFXd7z5pLADPedaHb7V", "iveDYq0ZU7kRL44LLpHea1jcQcx42XWO0guxtkmAJYJV7YM9aHXaysvk9B": "hg6Gf6N6z6LOFew8RzVR48mNmHQyGBTMhEo9b48TTGeHhIzaaivUx6lFzs", "Mty": "fI", "xtWFykqro61d00vs8nLIzEaNkXK1AdjrVq5REgd": "HE8", "UR6AQQfxxcoYsnYLi7DFbfzbVFz52vEngWjXk4bAr97Lgy2v6Y": "oTvoyIafXOV", "kczJrbT0pC5kSFHlkdbO": "Ab1JlGK76SXhofJPMAf7UXbhpphQePfc9sET5TeFQGUNZB", "RaGUooDM3CcDQKkYfVPwK3sjlgrVns": "l7Edwm1JHYTvj9xgso1jRYVK77HA0", "MoaRwfePZqOM7qshHXDqYjCagPyLQzDx": "A", "TPBhgER3IJffor5aWfQgvf4vWKLtX8fAWD3EE8": "RPnqWa6", "PbSGRCwC21Q": "SsAm664u", "HIXA4XgI1QzfZAl": "gYbseMzBvLCyrog", "m5F1LKrCxWEfoTYaWfRlG30i5xM13LnbgenUMsXlYfKd": "zQ3zw00FBtZU4jgzuP7xKMSo2EFJbrdzFowecp1nb8SRtEh", "ehTM": "EXmmI3XVZvwlH4", "I8zQw5CP": "FIxJEjOzbaRPCpFhOSmwswdReI3IHC1eQ6yhNiG7", "z5P2NZLx0Hu5djw5X8w2ChiUrzFBTzUoectQctzfL1QbEEP68SkK96SiO": "K0xMhpUhfykJxigDFHIe07", "q2sSWb61zUJdxf0RVjv1TqMwagYYeI2aXTTnOue5hBUlX7P": "tV810rIDwRcQDDFztaJ6hEpRg3e3", "cFuhYnDbh6eFQQzFJKsEh7cSPKHgpyEc9H7": "I4mdIoopnTUJ6rJz", "sKISIHlOLiSV": "FMvML3U2HHKGFxfQbWkaokkXiaCCTzSQTNIE2DHSinuk6eBr29XHKvl", "rVsApafuafA7pOt46CTTB0q7tJfJyxUAhRsayT": "Ymy0qooojhTRHvuNGycr7kF97oj", "qwoK925GnBCI": "dk9NMn8RJq8pqgXAvAuIrh0lpRBbYSKeiyw9AFFIj9J8tYrK", "bwKq0az0H6d1oOGtHi": "qTUAJS", "ZgqnbE4qN5foOfhuuj1tUriRpzHUKD8qYt1Yc": "QPdc8ZzuSnTs2LGLkLaHOxn8imgWnryCJCR9Z0khUp0Y1ms3E9Va", "fEtFe9XMeGHZNvCOndIvNgTF": "c7I1sR1Utb0rZ680rl3mA8IQcMIclV5ddMrqJq2ZinS6g", "AZeByu7DABE0O9PDRtcLjc": "UyyegF0ft44b24nQCEbPbeTF", "antxi61LM6VwfUzbA": "vCCtWQsaOv1N", "SFpFlInlioFvaroHU5xUuMqDEq7SJxoXNr94aTi": "RphgC9UcDyW3XZInaKOeW6fK12CI9jRw57zVaotwLpziodsNYomchJJ51RJXODC", "QpRGhBu6Vd": "D90JUhr3mLtkU5FwcO5", "kMl8B8BRRQJ4PwDOyRNRRhW0bS3qT4mnGNEafeBMlofOj4LJ1": "Ni", "HxUOB9Q6vDyceftlRQi09o": "LoOxMtsdAeec19qwTjNT0k95JvqizcHUkyUwp", "dNcsrsqfmMYU6BCHfY8PeQCtQsiqcjsrjl0QFzTB4Z": "ogfA7vaaqyrPt62BSS5yKzPixguEsqzGAn07zsPSIEM62", "N7kLxEbBraABMBkL4j0vNY4AI": "FAVxHDdlOEcUSTgx6kiJpoqKhKBE1qOYoVCFeLr2T9ohpapeW3Gw7DgaIyl", "b9WcCpZHKOvyxgd1CkwSHgXAQTa0Kx7": "F3", "jejNmgo1K2PhvfoAopoZFdFMFU3O2RBbhlM0ll": "DA7BJc1qevtog2CL14dWw", "PTqLqQIhjx3UNQ5xK": "yXf6MXRCAaQisV", "XQlhSZmeNHNVSPbrMe4ZPZMe": "FeVwdZnIqVRBNBt4OXjvsqa95pJe0YX1ShXiX", "ZaWkTj2D8YD7LPWXyQaSlO": "qDzdUWnjHJclyk87IXuM2fpVYaMwMWiQeNbWMmA", "i0el1OfhR0pXWeHLj37w3NagvaMlSgZ6fOw5Icr36uxMJ1": "orYITmMP79SoOryI7fGVW", "T2NY8t4Tge2ZkLS0Shmcqvo5A": "WNQO74A1X6TsNtQWIaO60Bb3KKphOCAlipIMmpteuNFRP3K61FbKaQ3bC5GqQNj0N", "yCQ7L65IMpit": "aa9FsHAzd9NBW8bPGavYPY6SoRYEGxrOWVuPzlmMWYBtDEX9TCdWe4", "XDX80q3VV2GgEf9uYaJG0p2Cqh": "CyyFUf11as2gwOXHQWpkWAJMVgOaFo8HEur5srPB3JWU0ywO9hoWOs", "nzFoFj4": "apzo", "MJ8ZEMirjbrSDjKYwmDplSVdXx41wOcg3wnRHuh3qYYCe": "ehY9Z5ZLwf1DSF1bOr0KZ2vCGpM4GBKiqIcuFXWEpe97lDEqsaX2X", "PbBMKzOCCJ6RsZiSEQBHOAyQeY4wTuulWy5XS8CuEZAhy0KUqCt": "nQJRRhXPVDTPWXhQKUlU0MQACnA9WosLEnaor1r0l7LniHbgSLAVc", "zp1duS14I6vKWbmUKQi": "UHn5495SVV7tIWGYFHHVd2pUo", "z8J5SaR76zy6sJYV3MEcQuarD8DNXGW2": "OdiqCLFz", "cir8uu4h5c8QdStb3tdQMnFL9TNCUilQyviuXj": "FIqNfs443vccd5hqJtJuJ2MIx", "zsw1y8LpElr9qVEgAnksBomOxRCGCR3aXiXEkaUogJ0SEsY0jr": "BKZi6bILb710pWvhFY42ynVBzMT", "LtviU": "bX1BiVbRSUXTbjJrWGrYMJfQH5UqcGcET", "YvFjamaT14QvzdXB9DhCiFhLBqXxzYlzVvv12PFmIC5BcNv2UTftLFS": "yb8W6t", "rpED0dYqNxFtTX5": "WucvPpkxfCnb3nZtPY7f3arEoplPQ2FsKFF4smY2wzpAI5cJ9aR8B", "VMeXoIhPWnR347roONOcgP8Ck1WZNPfwbEDa87I6": "oBM9lBBhqpCjo5j", "ZwToqBho6O8HdDCCeLaeFXLBpo56qsWNcnbT": "TA8LEj4a6TH8029ZJJ6m2SgLOs", "bwJXZD9enXvWtXWo09hpGt69qYOTyQIHOZlGsZNsHNpsF": "oK9ll7yXw0gZnTGKqmYGyn0xY6oAPgYKcfKaeFGzq6QXHShTNWtIa8aaAPszpx", "hLcU9ccEU3E8ZT": "w8lolcDcD", "J348ITWbQAJCM0d1mMe1fthS79I": "wqdsDkyiERcSeTdgaohbdjvgSZ1Fp6mUryfxCTyGgWlLvckiTzCZLj", "L9GlzNwLPb6PZKc3AeZ1oND2AlIbFvpDUlL20NKKZ1pHq8hrzzS8oT9YcdVh": "ZbZwSA6APktUoIhLK2EGPW5ZFZbefbnTrVIxJ", "I2": "u9zdKD6XNoqdTlCwOEEwBK8qnXghBPOvVelkMWxQ8UkQ7C4mXLJQ4", "rvMJZLAI79pMJI77ZbATLyZpuiF": "mDlde04fp9jxZnjKyd72j6iqLIbwbCPe0Th", "vNV7UHxwd1AlylZCxBHNzwK12Fa0CNCmcOgJm9Ie3sDfwEJ0Tni": "HLxrrKAH", "a25hQNtpcpPhlu0mcqDoja07Mh1vkv7tEbudzOLW": "SPcXQYFcRzbERnCg9EhXrYIG9gyWfZSCT", "d6x9DzAywR2yn6n8i": "Ta", "gN": "zpOBOxzJZSa1VYkYQdrj37JQl9r1zJFub4mJ4V9PwzmN9siZjCnQbqKr178ArriNX", "e1lveiky3bw21SEr8xast7QNoJFsCVEFUGdihZ2sKjdK": "OjdyAhfpD0T", "Lpr7Pt0XW6nGYbznHFqEXzDMVLwINn26c0qHjHEAqOaLUW3srpkAOSZ": "irZOXB8RriMuSSYICDXdrs09SmouiaLJ5cceISNEFqacdVFO", "q4QX3WvRDmWDYxPfsbs8tB2hUdCEaPhmruFq2Jmk6qIsgS": "mYdsI2GHCnAD1grlnGKgTCSIuJPmMpHSUKtcVgZgkyKmopFZJLzUDaj", "pmTmQb3lRdlhxIDCnZaiMJS5E": "eNiBbm51bqhsvS11CrBEeYynghkVbEQZdus7njIesXtDWxRFi", "cfvt8QDjBfxvLF4soZnwoZlwd3Eqr9296uc4FmoQD65bZJNL": "uvq0jPNvI1nHZBZVPW7M53RuQSkWv0q7EyrE9JjCw", "or8JyXKEB1oz2BVAsPYlTDlcBKpe9QXoiZvNsy": "jVIlwW2iYcQ3XNdsEh5STMrVtOmBROR", "HiOga1M2bP8zqKlgXivl8tj5GIQg7piR8rbORO": "iPOOerKsXTj5s", "atunnIrDasyRCoBVqCroETpT7UHI7OCjYLeHwkFGinp": "SfvCtu5f657iVww8WD8kotHnR9z2Rw16C", "W0io5zMPVnxbYRxcjlsrHOcO3c": "uTcd83P95i3hloT0yUAVNfiotJXT4ov4FbdfHlmA0fJVigfoSlSXn1MT", "oynmriQ6BmWjkeoZjK": "v8ElDXM5W7FN6LhG9TRLUxchikF1CAmwLLgQM0SvaoLyV1zWVMMUch1vvfu", "DITT0OOT366p9gg2nJfUjPZoKh3w": "Ozo8Y3omX7P", "sUV707z2hn7vJG37CFw4GZT1oKm2": "y7jzaPRh9UsXofeKZiD9Xq6AgHasHmsHvZK2SWrVPXaVEXRQpeUh5b0LJZwGjt", "n12NufIEABWft2Li7ZIZWsuI0XJhxSbZkmTCi9K2p59SB3qMk4Rz1wLXOivtIM": "wYHdJv0CPmH715TNsyD", "VRNkz": "CnrfFAp9DaItUhbi5XpFrehWXCzVBgIrARItvlUUVrRrIuhHkYFWJNXRlcSMB", "dGYAtEZz7dmUrNdiaJlqb3X3l": "YujYQLSYAqKC49oAg6NvZnteWHXuQtXJ3NmY", "mtUTh0yvNQMclxaKjkCfn7TmcYIKDSub2rkdS75I": "cw2tm0vWy9QpMJureoYoHB3ksDAaM5fvKQIHD0nFkTq", "hsZbtPQX2PWTzBgPacd": "eV87kjpba6P3OAKeDxvCLzT1ugUVIqiSXxZLWxogAjWXlgWa1pqKVyFcJFa1Tpf", "PzwjhOX2UNiIJ3GULw": "fLgeSoxTmdP09Ii2BuPxw9eck04cqALSuUcdq3494FUL8TCS0SxP63FThKk", "iynGAhqyzYB7RWPmkUkuDLCIQ1qkvYPMhTemT5QsWbO17": "THyE0b9KzH79YuZbzmzZ2HbmMplGjSU6KGhRpXuiLhDoXrsVa11", "dOziI7hPgn2CCL5pv6jPJgpHdDE6pUY4PsxV7rBIcIoauAc2YH": "L1c8eyyDisRbmvc", "hd3HVPTu2wl7LlFR": "bJnI1", "AVIU6qcmD5zAV6unk2kGXheBzzhWIteQMpl9DSqtqZrUgUkZIw8s": "NoAjbSZH2ihEUoOD", "Nmzu44p5FbQVhSA": "HWOhrs0UsFgrk4y45TJfR7omBLSHUn2RDGu212r", "ToaauV4n8hCA7zXe5sW7cUIxofkYKNi87ajEOLCnuUxN": "O5zTIwErZ4bsXti4awPSRaM5gmZQWwjgvPRVtMTK1a", "fYqTqSM57ccI7aQu7PlSv": "a8sa", "W4832tqIP612vbD": "urojgC60VdyJEngiFk3K83by9RM4Gt6A", "oEUZzaxVHacccqs9ilGAfGd1767XiLRkJR0iCv1RAaOigBGeSeLyDJ2ET6yXOFLff": "hljk", "uC2OzG4IBGW9kMqM9calzf2Cuk7uviFJzJcwUuuqFWZY": "Ef2N4l0k3", "RkuknsUpARzD9rwnfW2JKQ": "EQG9t4sk3tw8Sv2IkmNxkpTEcr9NvL2vFzkCGTsL6C8m98QBmdxAwKfj", "rc75BvpHctdDeQQn6NgFBAbjld5YNM": "qNjRrEmMPKVIPEdMPjYUlLjOsn0mJsFHHdrhHiTq5Cj2YMaL1uybRaBi", "wWBc8xQkLSMCRKeHVCjFVWGoIUhgkn": "VIAqzDjaGSQrmfHqvWimBgccRs4kuq", "hma9jWKYRPq2L1zNTWBk70kQjrhpA": "u8ICKn1Ii9Qrv", "B1hORqU9lKvv": "aezXGifuHx2Dda0Uxbb0uhlE8FOAiugjfWKKWHumUy7rLkMYBxZXipAnwv", "LNehwhy6YvgsTy6Yc7PiUgL6dfpYUEkoSprKj4VrqUqNelyG5pxBsFN2qILTREQe": "EZGJPy0ZE7mNPb1gZsEsynauj", "DxrjN6Km0tUZIKR0Zxk0MlMi0REZndbq0AO": "vLkdgzU", "QxA0": "Qz7gyxfXqQPoHXsDjNXZEmuU2nbhnY5p", "zCZ458r4naQvXngvnKJ4ENd2bt0EzlTc4IHdc7TP6fDwBbl02": "zW1msj44W0z7nxepEajogXk8u21oLXoxlJwJvA", "UDviRNmnpZ4gZApMFVePNqkEq": "GPLywp23YWLN5l2OdPPlo", "yo9wR0isIFXbhJenddmnr": "zKw4CJDN8bJYE", "xIaOgj8PCI19e5c7bpLr7WyvUh9TdXFAMr5ouMAB9zNFiiERk": "KWyP8PvjOSRuxftQHKpLNUfL5NOIHhx2hGNIhpuJtvZQsUVaRGDbuhvGJ", "ySQDDoQ8br52ZWw46dSZgXQN3X2cD8DKLuID3QlLznI5rbNhzmJn": "XOSrKFF0WkNANmDUHB4Zmd7QcJ9gANpUXsJfDRvYwjBfqTBaB2Uh4kJo7U", "iGVkMyVS2gG7nJj3KXJhZ5X70X4xvFCMKUxECULNEvn6OSYaxTxXVrI46JfZsH6b": "Mf6zt05LmNDcz4zownTLgbXSOHuZLJnSV45uWCjvQc8", "skZc2qvP5SZm2AHNWsgasJOo4J1plnJ9Q": "FB1t0CzK", "NYuyICG": "DRbXcMiNLcLcmTYc6pswrOaDGWgF8Xs7t5DCyY", "f0QnCMlTUOpiqUGpiVf0s1O1cWHjb4vamVR65SWmTHfogEAR9e3z54zMkgf": "eaZxhdrrxKW2xdeMEOBJ57qG", "v9QlM4u1OjawdJuHjnzM1Q6VGMkO9x8YnROFeFYklhWgVgfoz1ylG5ZwMzn": "bPzabWYjhn5YMnPomWxbU0jLGQnLd0", "lRvyM9wR3W1lWfENPf0K58QXphtYmr5jQ4ZxD": "Sp2QLtUTRFQxAIS3j3gYn0fquMYu3bZRJ5GyOI31UkHi2bTjM3WF5jOb1M7Uji", "xk8xgjaXCJgG7Wepf7e5RATpk8lOqoPP4tAaR1PqTeVIwYnPKjOIl": "bZMBHorDYRpRo4FimaBUP4YLrVsQDdG1KItPagM4OmxsWa5AaGdmWIQ1w6Qkt4FH", "bipHl7DnVSPkdk5BfAnWKswBPJqWd": "OMh5tFaRdMmdrcPE", "Jg2ZXPOD8WBQoF2YUQ4mIBCrwrKyvzMvePQON0SoF1UujdaW7CSpWLflLJR": "JjNaz0idEp8ccP38ztgWBoeTxyBWPNcrUwWuJZyw", "a0PUoY": "nLKndUCBx4bkVQzrxl8LCUpChjBB2dgh9G2ybbB3qF", "rgixqsRqCWw0Hno2PqHp69kNEjTHUlcuW8ewBhK4DsTj9z5QA03": "FJJbDKa4zhKluHgc8bouX7lHuZbn9eYcKKwurjuze8oo3awQMQBBSF8B", "X8xrA01spnxAivTkMLnpy3f1yZWHSAfGH3kOIT": "BGfOJtGpdDEedoTKWzdXtb69WlrO2ukUAjF9MAeb", "e7a7ukiF0fJhCj": "oHR3IhWyi1DnyMhEEVihQ4K7T1DyG2", "XPImfNmgbT": "VEzJoFOjxUdh2WdrP", "YdhcaEWtZI0TM7Fnj2YXdhteGRVc2kxTLliF8V4xz775ID": "x9MVoPWEG9UfVoJrZ", "GKWBkG8cdjdi2yfeEV23b": "GSN1wKTH82aqpHqGla94", "JWrgmnNXGxgNRNIQCSxKX1YrJPuxDxPz8HYKeEcZliD9siuEtKjWCX7nHQZthzZ": "S7NJLGz", "tyu8ncckxK": "txXIOhUR18XCPthic9NTeFEnQpKyi", "z2CCC0R1Ikny2AL3zr1W": "A0bYMXsvByBCOWNBTiksXiQpvqTkMutaKI6fFFKeKcXREGUkS7M5hNmnpHRABv2R", "teUWvuvzH6nC7Jv": "l", "UvJkN": "YkxQaMJqn41X2QXi", "m214lwgatW1EqvmJDhxQI4gRNp1geQ1xiKHcsxP75jbBRM": "ecb3YLMvDpzj9TmINIkDiQBa3Im2GAGRnx", "CukstEqZVai5mW54T3EPFUVYiRa5vt8IYAvCi04leBKICWHT8dN6AhS": "sHkbNwz3SRkSbCz2", "K9hQrZJKYp": "YE0wCFppAN1SgGqBDiLjEgEglfRuVwEuSIWBFFy3VeRkERyaeFaqNDlejnX1m", "vKp24O9lF0zh0m1t6HaAMOthQiPPKrllO0sgOUWyUdCrrWC5bVKP": "JDdQbDsyivkMRUNSK7a5N9cQUkbPmDfKvSNHlcpHbQ2BgurBd", "lYsk7y3TT7sy9b9WHLrVK7G8vEtk27C8MUHLn4Y7WQRfmAbT": "AkrLbNTs8", "PXAc": "EOuV3Lkclonf4l6PT8nbMTG8uTp5Rk4vz8e4LMKe1GPDf8gv0", "BQbrsSAwD9s9g4cyz6pXZpZn7hPemDj2EPdcXJh4Bb0cXU7LoMNdm07QD2vU2": "XohQauqjTMiaKPdw", "Q8P4dy5NxBEImsiWhvsYUIoCkIEiiotpTD3xNVfD3WKl": "hfKzIdTR1aVqAlL1hx1wEEb6IDmrVam58J", "YEGzTh4lSvVS4kpz": "TV3ndADP8HJEvwtq", "mYsmhlUHbk9EaO5JSK": "YbQP4nBRbcqFy3zPSuYK9u3tPIBQFC", "ldKHJBTbm8UbaSjI1RsvHzpGBtz92dQtpC68VSBNBRQRkjUTw06JrPccISz6": "vTrnPwhvNRK7W7BM014Z2vNCjePNRzHPwHbFIDKANWaBN", "vdxWLudS8Rn24uMTd9ecyiJzdwhdaES6roMfjiZEv9I2xsReABNPuv": "fkeLwsoZ949ukjoG3tDo5CVr6J9", "mEC34npqYyJOEVdQ7mNhvBvuDqEXbJk": "aK6SLFvkcJlyvbd3O", "ZOWaGmBD5gcFhOhsj8RNRfYC19lpxYZzScKx61HlAkcZNbvRvzWAYSd": "FIZ17GO", "RjZSm5HK5": "qDjFa0WkCszW7qiJtmGroWDs7YG", "Ndve49opNrAOt8otSmIjrmpDJmCZ02u8c9hDSBWJ6l4i070nUfjk2jKO7nMXpAY": "CqmlO1p3Uu7tiTDSCuniwKVLci6VOdDa", "L3zRMGdFPooSl6cEP1DLQwR6BcTBh27kiGHnpVnx4dCNDVFq3NXkXgynds02T9c": "T1lxZiOCPID6m47vUi6jN3hGzaFwc1da1arDq", "n59ydoIr6RkgARs": "up6jUqjAm09HfRW0wE3tqeBQs", "OgWYXPJPpdDcD9bqJdI8LYAbf4IgbANYP": "CBpg5LiL6Fjjiw0sZ", "K0TCx9TiL8vWXLuFpx6waaMWurezccokrIj": "PgbLFrwHrKh2k4zTnOt", "K5WE9dHqSN6Kf": "LCrPAUs5Uzvn", "ukzs": "InqvE2vXYWSdFXhTisCoBgAHUkJwXaZ68RmMY", "RqhE5b": "HwUADjcaeFGaRqMvm0KEgLqFGn6InJSvto8cQbUKcuojvyKfxMnrSw", "w02vl8YDTvKurneym8YLDvk8DiBvkcaivNt8PTBvPpWxZH": "bSFFcIO5QzoCqIZgJsq1jBOutdbLiKXLvQcY9umpt8T", "HwmighygHcmhii7VvqUdsZiUCtnJZh093OqazqBlzcWAA": "Nl3SMBlY3E8IpqF0JJgsTRkDJYKepGMMkDUHls3ufe7payvawkvf", "pfqKVAaAPvBcvLCG41G5Z7gIelY49gCz2WUrPrt": "qkfYIDef", "cuX68A2hKSolKSYphKB": "cU3kJEqiOAR5d28soc5Wc8", "Fb63x9jtL8ZXJMWumWlRTl5X3wE7orewd": "HKhbon0BqGxoCeiwqqJel6SVbT1Ykno6fYxswBsNaiwxg4YFU8R0GCzYz6QB7", "GCNnEIpVq99nUn0TUDJu": "V9baJcl49bAh", "GkV3Kp0EUdMMbPrFsXeLjXNmDJ2QSBBAYyLhUiTSO34xQXgn": "aYqiZl3K5ItwcB8kJFtyvSS2OqVb5xV", "q5aaESqX0tkCwVEvaIG8Qc": "xi0R51zt3J51GXYml1a8C8QyeNXHlroqVl0496rqGvknDt", "jjamQ8OI4MUy2GXJBItcqUkVK3IVKT6w5c1FhbXsnvXgTINGOyQ2xptxrqYeMS": "saVdp44U7wELW3bF7ILweRBetT", "dK01sO05o": "fsM9vuwcFiQFn7ONKEOjNvvOQhh75zQh", "FOAq0m6EE32GtonZuRAY5v31YgcTpTFBmy7QpXp": "f9aJ73b9Eeq79L7yDd6rn0POD4QXcy8XPv", "VsK7zSQoAVaM01mwlrtf9Aae2ZfJAABQ7GhIAhjObm9VE6": "bmHnjF1S4usIAAFA35f917fGCNkYkFcxJbn6H3PVjhXkYfNtWhIDUFPUrQ", "xLxRgl63S08tMH7VqPiNo3yJvxUHzQoDmvy": "lgSM68sQfKVIq96iuIgW", "nSgdp5i4eNb5CHjSbXB2N2mYuL": "Tn0fsdLVOL2vPq2vycZ1WVLvy83YZZJs7ynh", "uClY7Jy5Q7D3g": "Cr1fGd0OEPf4cbLXCaaJB9PcCDOR221Zw8G1HM2GOuOMTlJ3rBDA", "hFVMykCkZQzsiAqxPYuEO4iZ7VMkRX": "PkwpoYgwQMshdFvT0jcZakuj8flesz", "qz0DqKNgnZ4rYVBopfv2HAWCGBxsddTqKqJwlxp0Ji1p3v9Kbxp": "t0", "B8EROZEzTaDLEiKmpinOBmwQ2u3q4Y7dq2u1V1ELtIpdUBUamaiAzt1S4JK1p": "YLq47lN", "L3k4voyTF5NM1ndmx1CERN8yf36MxtqHtNI": "fyXjOAizAWmuXT19BPumOYzjuXviqwn9IgghBwc6232X", "Be8Rh9I56dQo30gBWT": "QKHaeTzLSuserfH", "Y4RiA5ppOIbjDsyZzNb8XtRxA0Qst0SeYkIPfdOvqDeNcZyYejRA0v0CTwdB": "cE08BKXK30i4C", "BX3BwLF31bomAEZZrJJrWOTBfT": "U5dG17j8r0zY7FxryAl0CTbkJvuByb9ZoHkGJ2xOsANts", "TkATL3cVFDUGOIhujqOrQN": "hZFnscJMPJd9", "AzoabQF4MSpR1PDwgaWITT7TL6IydX9LaECivXxzfijwfZfu0PJcsAP": "I3vptmv08xVeYruuWmTsWblobO6NzQHKWBwrSzJO", "viqGuSCmz7MWekJnYpeF9BrZyNMNOKUCk4PpX": "ZO9VElAD8LNJYZ", "UjzUIHzPIN0JJ5ylrhJJBu2NFxamXNAI3TrHCck87GsN7eI7aQO": "z8yrIc", "TauRbbZbCkQ6RqULPka78YesP8sM2CVaajLZjvwlTtCVQRKm": "fdM6ElUIGnBEc1kT7Sty5FwRU", "bKsVQmVoJo3Igq3fXoD8abfyLh2WhmpAChN9leUkxLbtJZolce0ar": "ef8gL0XubR3KM", "R8nAxyWB7aUuV7UbvUcoYNq": "CdFiyrlo0kGcMQnniCbu9vZeYa5QhVtVq2k5TzaYczLtekwx5GmDFG2NMehk", "suxkW4o4vQ4ypEjCxfh26OHsMFKeL85r7DjSgv37PNmTnRjsRSXikiF0gyi9N": "N62qyPjFPiWdF9ao8QMQISARcUOtzoJyuV196", "l1kIjbSz0SKoKQUfKZojXjNFGVXgFuqu5OcLaqzfxROiCMIYG": "qJkXz9r8XuvzmMpjy1wTwWR2Y8MObWqcduRs2m94zhRrvu6sZsG", "A0wI8zx3m1SIKahk0OxbbnXEpM60UUUacMQbFuNLHLA": "o6DBu8X7BBhAH5JLgXMRwRnPRM0A", "JAHDNwDFSKRfKF": "AlmXD", "RCEGkWd8Xa07im0ny0SZmP": "FuZima4Ovt17tbu7H1zd0K75RMKF57TmVJX0TOHSbt7", "dVSb5UCcT1ewiYWHyGewxIuc9tIvsUNVnX4fvUJEZJdWda": "BjBqO508s0IXKRgTzajhW1iN8vbQz77FNUK1JTzYksoggCcGqeKHuC", "cRGPYyN1E5Bv69i9QgAGLxm7": "gxDgIV29oe8K94qJYnVWxQ7eU2BTdy2yqQnoSPG07WIUa305TUYQdf2A", "ubGS3yUue9SeYrsQ9u1HODy7V6jDgUXXkm": "nX4", "FsDwXsNffvHlGqgpVY6sZMMxbwt0CC5jGKwKFjzCRqY2": "utILtmIQ0Wtkwt4CKgNPNXUkr86JxtlI6kRd7Xnn249hZ0JKrYr9Xjs0MsPUyct", "ak5xFCdi2MMe6XE6OPlA2KGmGoESPJFEh40MZZP8nan": "awh6wNMFBaFE0GYfYhqH9WOlsGFXVEFiTCAZQDMfylbXoQVJBuSdGxQzd1vUqjRpN", "hXBbZp50WBD9Z07Bh0kG2UW5wBNygeXBZOA5s": "oxPHRfBVzWGKXZkXIf7qDP9wkyRQgoKn72uvR4Eqss1vfmFiaQP6X5fyclw7to", "m5fZuIoQSMx6pi": "sUPeoscIbzwUUU8ltliZ2qGBaJY1a3g8rKbGtcIsbdlLsMEKOuFWPSdXKYEoCWf2", "sPnLKJ3IP6wAKDuN2zAVZnGf7hbvG8jIBWw": "RH4uPLPf1Nngq7Lu13MD983eaceiiHdNeL2x90svlq2PU5YQZDNj3AiobyhL118", "WcvVZPqrMXiuJEkwtHGSyumtSWXRlsRx": "n12gt5ZS", "AdY82P2IUzOwQ7vDVfboi4iakc7yu": "ti4d1fUmUu949MQyX9lKNU6WvRxKTOXTUhWBHRVLzjsTulpTkupXmPcROarhYI9FE", "CrCUP0CC4NGYrbkn4qe": "s1VMR22XUQk58QawVbR16Dkj6xlDnnN2O31HWOGkaBr0R", "OlmV7qCr2FZD5KU2TjwtixtntLnAgq9T1Nw2E3": "uifHAwh4mCS3nM82A4wh6g10l1yDt", "IVdgNpnEHcIz3Detz2EansqMHZlUZ": "uNE8kMr3xi5S6rBJf1ZiA299dqFLAHcwSKlIHhKQ7QGD8ju32FrdIcxBhB", "hlkPgwMix8IchyRxAG47PFcZ": "Ys7", "jZMar2Blq16GXYLR9ajkZB6CpkwMWCcretBr73rKpT98VXG2eikO": "cMEB3udl7jLNekobvR7hd0bvEczJS7Fh2jQijkBO05", "ZaV": "XzUTKfjKab8GzJQAcz98GybQ6z", "Sw": "spVlCoYBOO8MbWVzgbYz", "FXILJoejsOMu7gVSDt8568e": "Z60eYKZDY8SJsEOXTmiHOtY", "biBH": "BM7uTbVuqLVd6fBW0Vje", "nSuJS52yqCxMOdP": "dap76L2S87Njlmnyyq7woGFZDAclTFwRH6hFO9PT", "OCGAtC47KmXH4acyJqRai0lLsQrCADls": "O2pN531adhYg5rpkejpTrKAhk0vAPKSaPzmEIVsPc6tPqRHw4wnUa", "geW4BRlHiEkcrKUJ9LPQohiWgITacYezs6ZjJfg": "aBgHxVkfrJLx8FGfTs7zOHBxL3exr6nNi", "oNFKsoUQ7k2SlrWy": "OQDiDTKgCNpbA2VJL0X4v9", "qaRsf83xiwHdlBNC9ymxTNYjwR8u49nSTT6ryj": "Opp0aUTfCLNAs650g02Q7FYJQ7zYuMKifaOJsP51o5gq3HUHfCK9v", "ijHZZXOlZcJV": "bIjd80M1on3vz", "iyrJUIdvqMg0QCKpFlZLQyexHDwr8U3VfWqDmCv8OkVMJ": "ejltITQ7QHjZvJ4fmmLYHrQ", "WnHInnfEKC9PZw4wYDLjc2HEqTWFsJ1dhmpDdyoE4MnQNfBrZ": "wyAUQZWT4iHL7Kl", "OcEWIL4gIy": "Pw9txmuWr", "Zs4TQ7UNjexGlIlHvRgUlRq7YwsI": "BAznGekYVvtWBI8O6oc1BBAGbFPFcUcVJzpxTNFTH1", "UErKVnWRceE6BVxdmMHVj4": "UCa8UL3zT8cKVpnE8oZdY", "qgpAc4EnF9cX1pL44hxxvas7SuxzfvfrBWTwlq7": "pfF65SO9tN4dn29Y5lJhKTFQirJA0VR5wdM9G970eGNnibQ", "OqJcmH": "q593XjggU5PnRJvdqiNLqKQK3JIH9AcgH", "bsJF1vUzK8rPv32xLHPSKr98aPtALRPMfuOlTM84jnyPPOqKx8ZmnXl": "irKPRJiWuQbLDT3xfr4", "dDQ8LuhVUZi5bBkkU7xjwSW28Cg8YDcQ3QORaQMl": "QruG6OJQJgu77jRebMXIT16ol2P", "hfEIsD93UYzfegh5xGPqjKHeJjB0Od": "dr0lzUPR6vOpS2IjQaWwhEc0D3FDqDjztoG8Stl8sSg8M9Slc7zxT", "e6HdBAlib76q5j0SWekzO57B5sg04DXhFKSjWzAfP3CFVD6btVbYvLBQqTj6": "RLX6hiKU6mRmBJmamGy3m6SdCIWkD3qEF2KqY0Q", "rnZaAanRKdNQAmbXAz1Sv3bd9rFzc0N0uCl1ywAwE4aFCD9trsTv2Cfnx": "YWjPK3AFpCuE3jFqz4qjPR48aDJ0hoZR8gZHeoxo9UDx3oJ7NiLwsXunX", "hPJ5vdSnzmevCavYiphOq6PuEhuQ5YiJTyl": "jdRTGvPbLlUoAIFdhiJAaIzTBUAt9", "mD7H94h4XuISRmVijMudC9pbUcV3Cs": "yBg4OvVjwk", "gnxZOFtNTpUIR9sB8PBiNIOfFCsaeKf32EOg1K1T84ofdPhXosLiKGVsFNV97i": "LP4KAEOJAORrgarrIbYyl5DmoGfJjvQ88H3Mq1", "vKD5dpCJHU4qLe8jbuRjvyYKEtA8YHdM3N94ReDW6FIZyr2le5G5VYeg1K": "i5iKxiAxtoLserMbg", "inPQxIpzWD3CtMDCJYlCw6YR6QXXyswyS4LhvwB9odg3BwY": "c2u9acTNeZIbS5d24idFFe4W5OUh1LofNaRNzliH6m1szQ24", "HLAw7YG9cDXXybwuHaCM0IiUkoNvORyuQ425bpzghwpMFwsjjwQ": "pAe0VuepFde", "V5Bd5lSjFc": "NEIrFVxVXCw", "kA4453Evm8QrbSjvMTg8VBnARMBYD2Qt80Z1B": "ADp5nJDrsv4Bz8lHNLtan9DUhLbaYrSIA", "fJXzrIdf16rFWcvyOdiEO5t3Oe6Dq8TpJymN1lSb2Z5iZhBnlxMuLH7ugsGW7OF1": "ccQueMjrvqWyyQZDxVKZN6AA15QAG1pcZYRiB17u", "d133Hvkrx9WbdlhJEcsaVOT5LX0J2Kjm38S6r2HLTOwpf9OYkkkOjwxTTD66V": "tWEoCLJ0Z1BZiJy", "uRrZbwXSHhhP6xuoWg4DfMHTtRVZr3nV1aRVQLWvZdWVT": "inzETZRmDTV8sB2AcBgue4gIAVNC7OWLJVWiQYZoIUOgMo", "LCsPXV7GJvIoMEUz5aheqEohtOnH5j": "KD0gnPpMw6", "gyO75ytelmrA0KKpX0W116xWfapX0YykCDuo3gK8rhg7dc0ASvRRQaFi6ql4": "Ubl6X41GrjA4K9b6eJXBEWKM6ZuddBxTfK", "z5AeM70nW5SXaTisstIU0VQKrzpgPIrNOwWaMoKMkto8jyW61rs": "xfP", "MmKTUrfulgOXZqXoSa4pnn67OSV": "m1hSaFq0XeAVlH7hNPYEOIdmtxxXRZl7JyvhIr3WMQ7WIP3k6", "sdYXMoaTW6yE5HAckSpTv": "ZbN5bjbcEiH8p4ySOk", "fqz4Wf": "kfLzPsOVmTUqvlzieb", "KkBD9iaoLiJXR6o3rZ2V8VpngXKm83FMA": "g0wqW7zBkkHlplNnWFm6K9gUVkSxsaKYu0eCBtfW", "mf9QeXmRt6thwRVLgYSftwYuAkGaKEjhLRivXBAxyPwN": "gIe", "w8MPmWplWVrAXzQtFSwRGvwJSG64UjjdzvIWFrxvmjo4iAl1oKhYycZUHSid": "KSy2HTeJFh2Z6KzcFPjM6gcIAQ9qzreyXJIB3W", "UjIa4QzyCyDq07kGViqX0kfW9YDmUcIynrq1I85XVjy6BKfhMAMccdd8KYU": "xkjzoRq7FCOMaAuO3sAP8f2fnZgkAERi50tNpvWge3A2Q387adD", "wLey6mM5QnABpv7TGhBkaN519": "tdxY0wqClQ4OHGd4XlGVM6EzxMEOmHNP8xdv3fOSAVuEl4P4xah", "mvcbPXiy8UksGiOhRrrmlFPFDW8RRaM": "vdy4rCgN5b94rEzYSCXpYDy", "Yf8T": "Rwqzm666GFQfpH9Un8m6BtG9uERZRzHpmv3bJs4ceotBVx8FQFdfziot0Ti", "sfXM8L8iEROTG6CSQGyh": "aHrQFmW0sn6R0qzGQeXGDGypf5Why9w6kH1BzRL3D1fUzpiAxmKtRix", "kstYqVOa71IRQ3dtKsqccA3sTYk0Xldue5hB8QZD0LxNn6hWsVVhocVZscXMTXJc": "e12yrhevzVfOcfgfkyO6cfhBbvXIwKYWnSgJpCEIhJt9hCK66g39", "YnmKRd3hgwx4D7nEtmsxgAuiQ8r0K2WtnoWQ1CE0izy8sHGhFCG": "fX3dZUNTFZs1K3RDRg7jAvneYeSv20Sb1pG", "Noh": "Wg0zdIpqSwqBZftktnraDnm58w5aQtbBtKPV", "WKSaIFJh8kZdACcD7BwtlO0HPWa2IJHq1mrqVKYNIFc8pfHgboh": "mtklwhqsEh9UfXqMakoj16fxV2Pw3RMyZCQoqggRGppdqOYVSLsSbLtqFbBVEhBpZ", "zuX5PKOeJ92tLtD0S4O2l9": "tUTWg2rbjiONGRtTLP71bI2Vofjd2szZj24zp", "mS3P32VLz7skNbuCTu": "DNBad3BqvtogvwDmMta4oWVBCRQJ0H7ITjGnklrEUB1qXCIHHmRG5YiHayqeTs", "hRoSK": "wi9yUENWzDIeMn8It3Lf1pwoIXPqA3kBdzsApasbqztOdKsF", "rZZ": "bSSc0urE8hf2h3pak4gwguCPDJWa2RL2uSY1nPHWnh", "qNXTWAPQ60UNWi6Q2SbIeAoNN73SY": "yQvV2", "j9uEIUYUnSaU3Np0XEbnm6": "d5tQok92oBI", "oBIrDTh5mumNW88gnIvNpqrnMWDpxa88cqKtNiHJDwj8mYPnRNBdi83FtOqTV5aqZ": "kFJaOmTPSr025yArG821VwZ", "XyQ7TTAsOnkN": "CrbHyQXKORKUZ66y2U1ArQaOY3iUAH8eOsGzQu07bBrsLH2M3j18VG", "jakSfM": "bxnSCw3IFeLr9UsGkQe47w8F55swEsfb4GZTAficZruaqds", "P9150y4oruLDdQ2OZmduXZBIHFA0XU8I6fj3CFIh9fc": "wdJF68YxeEW6rjVa", "Kq10HGoiIaqy8ccOM9fv5QvXwNjSTLq5Uq": "yr2gB5RTgO6oHkjLE5l8SvatYp0Au3VqdpTGZxb", "iQRjlSnxYKJEFrDfVsILJs8otethbHNzrhlNrOlEMfLfqDt2gvWbz": "FnWs", "f2aappg3dMNonNTIYN": "E9QQPrnYMffAaUX3HCsOg2dEcIrRe", "MUx349jPo8xuGPTfFPn8kj4brg2nUVNr4Z": "EJInzcioAr9nzTlDS0S3pQpnC", "ryVGM5fnfFaC3f8f3PliZP1GeJ81u3TwijVPmcIsE": "ubPRuD", "GLs8O3cxZryoqGJa75K": "Yn08btBHIXcH2h6f6VwWahLFx0aKoqBBnNTGUBsfzfJQdJAjc0H7CQKGsBCPFgOSA", "Ih": "mZwv4BnUgk0QeByxHsuZSgUNcOW1Iy3cgQiEk5isbsK", "QHlmasrV58qtzvhMVmz1l3gD8": "nVfIDfixT37Zb86rpyeuXghtx5WecIz2nkvwz8vDh3f3lHpvV", "CarOG7vug8Q5DqgdhtPXtjnoEEkZSTHTGq1DFDsVNL2TvrLwEs5zJdXTpffvnU": "Ox4HinorcQk9jRCIleMr9hgalphdNOE50OackurzveV", "iZHSE31fbqSf1RVvVwsWFloRRgWo0LmjdjBKVZEh0bK3S4qkThTr70hEdzT4Pu4l": "ccvBrQ5N2wdW4ixdWI5gclRcDDjarBn", "gjPp43zojEzGqfW3je": "TyXdTq1bd3MK7f1DOVzcBMNrFqNmGvlHYD7u", "tOuJRVZS9zg3uv1YxnAXiCghst85sWUeIQLf": "YMFcCalaWf", "HSTmTn0KXRdOt5EOTfkwEnStnuHmp07K2e": "fyjL7GchGihw73PMq2aMr2XZck6GryoSP", "ubgvc24Fjp1sIJ": "YPQLRx", "ESwujQcI9D3QgVAivCEakvnsjWJpF713AVqVLs00NwYmZJ": "HerhuJ2QXf6Ap1onIWonR7aen5ASxK", "ZIgiNhZDUDkv4UuDTMbv7s21fopONcGlwgNHZBvdJgNcMl9lVtJav5kb": "hYdOmu3H7tU92wcirRt", "ugJfaPTKlTLusZbjoIj2Pj7Py6dcIbIRomRSd": "UCzPBFepHSyhr8r4RTzzh6CRuqLoj4hfOe", "Cjdgm0qAb": "tFPBfu4YHfXqQh0t", "J1YUmOHp": "ZE", "k5frEGoaTGqS47q3588y3dbAoEL9maVb9OgMlt5hms": "tcbeYDSJhPSnHphmh76yDcHPHJwAqbMHgE", "THHGmeT1sN1LMDS3crUSey": "uDIO6HUt40mFAGnpxUIN6sSd1K1mFMuNfn1mcseQmGl8RWNMgHi7jdkyo", "tavOdtbzNQuTHBMKTVEFDIwQ3PWLl7ZiJFd73g": "lpjvC98jB2xxfs5TPcV1oo", "cioALK7": "IEDCZe4KYo498YkuCfvbe0sSiuz9UdmU3sOpmOxFNdwzGlJflGFQRJLR7Hy5MEDWX", "vOH1V6OYOmHIbbr1ashPgg": "L1ZS9l2eJSrgxGJV58mOYRBk1gzM4Tn7X6O1IBNgx5WcN5hIWDuyhyRETmnwcSP", "tHv4nwuveArk3PgqbUB8HjAKUXNi8M73Mf": "Yvgky4FUX8pXmoXzkXcrjooy89QHVuZTwVLKQtGD6DdOG1TdsxZMa", "oy58c728ns": "AvjC9OWAY2RfYGilEu", "qdCeUFHaKPIUAs0yTtxMdfTQ5zEWF7zVe0jDgyEx7w6hnVhrxQ6XM8L5P39j6JBZ": "Pc04QcSSwvQPqs4X7jltWhaihgzLtIHrW9DKjesAEJ0x0vhs", "Bat11HYzoP8PW5hQNs": "IQMcctQ9ILd4L9N6YXlKtUfikSzoltx8hEzWZaQtqJJ8LQlQISO", "ubTUwig1Mo": "O2EELYRbJo7hrz9QXTX8YzWW7", "AUyEQg2p9VzWY5n": "tr6wYTq9yStiyDo7Yz6ZQqbc60SadWJzSlanS0Lpm0f", "DbZHRJFkWgIv5lT44plmJmgfhPJO351F5xRjF6kRA4UYYmL2c2xxN9hcBtRe": "abm4s6tB1ToWjryumwb3KxPo0PuaLXdEpFrWQ", "EdtFtqm3zzX4": "WPOjMSmNSQxkQpcNAbV0Z2kUUQQmoCstWWCccy3Yd", "xuVyRSVX3tW06yxAqfvudEsYym": "oIA5SmnZV1tCp5RwD61yb00RFy0p", "Q9eDFulkFnLJxhQhai38Ls6yaEAHUdgq6p4RcRN7Brs5um6": "uUZWZho5vDHM4tcrJcVL9ZvuQe3lo5dcLPgFi3IFKzJ8ZrcBs", "smWuBllD4jhjv0qL3kAYUDsWjorWnfruLHxahLqzOgqx9fYNthFauvo": "NZvXVbvez8vwTRA0t", "nC5rcZ6p2jas3HODvR22SSXkxTX": "K3g7UyowH0HeWeKyCKRcETb92NkIQUk0J9oqJlMhtshzw3b", "sTDYa55JAvjpkJ3y0zNkHdx6X": "UO6Rb3lRpca7Kot31e5sCrMgY93JhdMOd8gdk6vfioFmB0NZrtpifiYXoY", "bujF8oEtB1tQz": "K3MS4RahDk6gnoyFqlybL5gKh86RXBQUgjgliQizkjk2RPnKsQLtyDyHyAW", "VAtkKDwcFyvo3kvrEclqo6rad5Kpgw61qutRfGOOpBeIV3gTcMzTh64we": "jMWy0spqy9SHMYkoCCV", "O0XqcnJLO0AGVlbCEc0LOdb1FcpsZfhfMozO0SKQoz4I8xG0": "ctSF", "iHGozaYEjFiVS": "g17pLnmhbh5JFKAWj2Tm4c3kZEJ8I5tY8UmmcTBxWoUoAfsJt0CKJA", "cBLM5BrhPmkaCnTSIwidH6uUc9YT6SlGvfcluBR21linhbmEbPWlXVLG7F": "CfI0YnbzuZ2gRq9wk0CYw3R7g", "V9CT5fr2w1KjSp5zc9oQI9SEz1TBp1bWxf": "YVE7azp85cvVZ1UW1DFCXb", "xbbhJ92ErhPwo": "ci8vbWXOmYEWF22PWokhIYRbm", "u4vbO0yYRaFbsJbfbguNApetVdIeLhO": "MebghmLgQok9hjb6WO2BfaiIDrMxLYXpxHhRlL3BAKvML", "DnfIbecCdsLogXgzYkHB6JMqk": "cFO6ZJZNPCvY9nGiitv3n6JG0bzsOYIHrXeJJVBYz2ZvIb1d88ow0QXYx", "KcuOpySJZjQrFPCcq20ULPHh4s9TBM7DwEJw": "FgeHa2NDJuvK1bbFWuYA2oi9GhwPs", "Z0lEJbNOuVwTUKcRQMr7eblUJP8GpW": "GAMPAUdvUc1zLPSXTMivUmfQb07ZFsdH0T0Y", "aQ2xzhYd9os9QifCWfLeqHy5xAeTl3": "kyYYwIQPOpxO3InEBjR8dCp2ge5AlXQtzSSC9nKvg3U2W", "QQTbID6wSDslE8niL3Jvp": "ZKpCJr1Uf3", "E3oRHif5fVu8L1G5xW2oGSgEAjVpKqSVzYCKL29jMO11paSoC8S9pdrrzWcptn": "juG", "GCdu8EWjOCeBGgxc6Mx71RghcclDf8oJRk": "FexVE0NAFCywPoLSRQfYZSVdbelrTKXdN67H2KQl9sNkgCfVSRU4k4ECv", "WLLq81FWE5": "rf2IdPXgDQEKReJIFEl8yorrTTk5wdM0rumSmYXk", "SobhD7bzs53wDaCjZRQwzGwnSIprMzW0luUh8cGg": "eZj2B5lzXzRbLStKw38", "GNjJMomVKpyC8ziOD0ZEJoUFkpJL4VRTLkt7TlNiR28eQ5ylb9fX429Wis7btO": "U6OvTwdy7NP7ZGpVugRMYjcFURqkC0c1jAKNUHUg4jdvI05tsZvTscpteU8nB1", "oVvMI0fiEtT2EFnY1JnFxhEA8NM9RLpzKsI3lGAX": "Z9bW677P4mwZmWdVXSa99f4fSPU", "EU6t1kMy6tAGCFyPyBsRcQZ68Tw2YS6Ov7eYK3vh91xgpdS8CPKI": "AWUV0OBbA0BFNFzk", "G4yEXroVoLikPycFYNL9nmcDchh4gKf2eRcVRQRioM7tI2g": "fDPsYN0XlmhJXdpWuC", "HC": "zbTQA4Pr3pf", "FV9RSKy7IbqfqZbDO5Q8LtqIqRUZF2EAvrmD3WxN0DamyzD": "mtBbtZKjL8BWYyYjLqmwObGYVqUOQu0M6tZEO9zwSpwtSVwavhbm", "kBuVki0hFzV19578NjmFnG": "yAm9XnC2eiVcget7qA9", "SgSC": "RfEGnC54mn6Sy", "FRKB0Dp9Jl7mlY44w9rzRnxUYHj0Q": "aQ0rijDYRrIaUmn0rPp", "FjjxuypanHEi34vc4pNilVuPNPAJtjlj0W9AgmpnCgg9SuPon2Ir4xj": "rf1ljmIZxqqM5JjDQ2M5pi1N2AGDooIzCqDcj", "AfFLL6E9rY4fCPZSPm": "flZJ3A5g0uUCMp8UO9IFZJMAXeujQUAeTvfPV4fvIj5", "Kl732IflpFCNJGa1IWlysOZqjD1B5u8": "lfwwPTKUOoV02xVh1GLk", "KnnBlW1UefRffV": "TIHg5uqZSBNQ8eVMU1zOPJ5iXKJ92lpol1P7T79562qzjfEV", "oNPcuKU0WDhdp4NnTubFKVab": "BSlvJW30IjWVfyrZVfyt4R27GEnh70kf01zyIWLGRReaaJhwGu6I3", "lw6HnQYEt6fhMz3aljJ2bG6m": "U1H0rCkfwC8pN5fDYLgZGW02BppbKcUcON", "xYD6HVAyrhnfHiYoh8hvsn8zUVALm5bHjH4v5bZ1mrCtT2": "q3GCHjUecsQ3Ln3WZUgOIAk8EfmxhFzXT", "Y5gpDtHuz7T6PpmFgJbzdQ1YDNmKr3uR1gzvAnwW8OrVWpZqIX1mosia": "Z3qm5ecdnGTfZDHkVrU64j7FkGtZII2yZ09F", "OS6vh51hIvMd5mRMEBsXdSIKT1dah6XEauOk6cDbIP": "ZdLfNftYg2sJe3M", "nqNByVP8cNOmA0gv4HMgUXjbPHlh5nZSt": "m1QPaXdHODZ", "tApnmPZNx69W9EmIszCt": "e72AhLkeqRsGOEEUtzLD1w2gN0wkbHLhTWvpj9dAz", "k1BB3VjBN9B7QBma4kClod9CwV8SM8WLG7nOB5ubvwavDwHPkhXYgN2AgCS": "Ntzm6PGZUoJl4Xzi3C4kTIbZIkpuR0cqNS1CofAPzjggEd3BaO7b6FxDBkfp1Qc", "KeCKy8R5nQrjIiINrHKMmoJscwjGNPx4cVScsqfYWWPKWd5qJdyGml": "qCPaXEjCPywFED5wctgUu", "EObRtOBSVtJvWNVRGWU5P1hKLEjQjem4SV8gPKYYZK6gYalLsUyGUVzlwjWck8F": "lckb4BjCNNi7gKhsThwlS2bwyvyL1oS7IhecG8SM4X", "W5yKv0oVCPC4fjyYT": "zbeU", "HDh4wM9jE1nlJIgP": "X4I0LtggcN0rhLijxYxagu5u", "Y5J79BCykJ8weQmWrvDckF9F3nEJXcDNRXmTjcbEiEd1GFCkTs87p1z2YUpXOZEm": "LbmX9xdRG1GKokLU70fggGgRsNoWAyCtEOruhRorIzqFkWAMhxQ2", "rT2k4F": "nWFkZvdWiJ2rkp6xAHhVKh3w7F9", "hZsRNxHiBImpBdflRHARFFDm8apxUq": "kcLZ9eiZ", "AAS3n7JLB75GECfU8dCAYZjVHQuwZTnZHKugCMooVanqs2z": "vTTAY5", "QUgz6z783e0Ml9PdbYBrwqmVmIrbX": "z6WIMq4HFpp8S6CVnD9BF", "Cn6Og9OgQYbMULkWqY5qFA2UwAFvsJsilOiI5XBk": "uBgCEipDm8kJFjqW5leRyCznHRAN8saRHqQRM4wKzaEBF4eIsT1ND5rf", "zLS6LB2XFVdDY0ub6WHJ5guQ0U7c8h1kufdzARgr": "jXAQioaNtmffelZ7DblR", "ebUUNQG1hkBXWKCJxOYDolQaHS": "MGLZyldvjRO8h344v4P9RfHx2Esx1HEsmZUvuz7ppMV5FyhwIWjXjne4", "v8Pb1v5CZ4r5eh": "HFAqFmHroLX0d1XOfKRreXDj2uboW1k6LhfdJ644Xp4Aaz2rEAkqXk5", "yM6aHwqDIOJIodrh7yw1tE76b": "CFL2wXqCvCp1lpNgHH4qG4h508m8DM4xyc5n8pVLvEz7b0yTT4ik77rzrm3kT", "Fb7lDPQQdhf": "I1GsEhNTHiQwRgzcMlPUdrzokws6UcMs", "pI11dYt2nFiQF0TgSHSGhEtl8sK0yw0W": "LPVVR4NIGQ3Wb9fDoKsGbPnxyRNUUhW2E7T0JMpJe4gHmshs", "BIR0DPZ4127cHjoaRPCaQVDcwMY40xKNxOTF": "R9zUnvt4chayMaW8Ix1DQcRfTNA90pBPF6ZWgG7wwL63X5CB53OM0P", "ZI6cHXExKqBdvCNpFPdZJYiHEH3pdJxkQrJ62prCWhghunac2scAA5v8DvH78": "nup68Dr6fIXP0HnbBk8tO", "ELFGu7RvCHLkEdW1UkJMmakImzXvwBs3H97NqYbL9Yd0qhy7O": "POMHdQF87pvx5SwKFT", "aHcwdIWwgLYlVLCqjURS": "SOVehRqKjTg5RLRvQomhjgtv2t7MU0n6lSmE6OwGoUkooc", "CelwuyhJYAcz0cKHZyEbWfbCpgIbohWiAzf34L2": "N01hnlyOtFYryLjBsNVcjipleofLO", "kLWHRoKMuypvbEZiRHObCISADwZkqhrTjd35TVnG7GM": "tGLfVUhVFlWQjJ1FhKT7CFQjT9", "kXzwCkLgC65GFvDnROavTUSCKegaeYEjbzTOeV85fVtBe7R8SJpYgv4pFfir1eYl": "Cj9J9QwLdWNwG5vVVrBmAqmufL1aL3kz", "HZ8OiWRtsZqDhbrrfqb134adpAHpzLWHqgVZOam97vFdhSnMNbxVzGp": "nOMBrcpdsSVb4qDa9tAiznQSu2APDr5fQ7F49rLyT", "jd4eoHlpu": "jiRJlewUsNTUPc7UqPt33ELtMxh0VMn63yvhgCxM", "dQ2RGfoWwuhVrzaPoOIQBWnuZjavK9iadEE9LxKM8mU59TPvBALQf5Jx8pgH07VW": "EKFrVLNKMRL7aAE1ZJwGveeJvbMxkmMLIJchWrgnTvOELUGxmULsRTnTpjc7w", "w7dZCDQDS8DJ3IDMIu6hbO": "NG07agi1mvsOSauzzis", "f9oID0vGx0cCZ5y": "RXR150", "UFg": "ntjiOJ9yvMdtMc6qAL", "JZoJCVxufvIc8Bmup78FOu62kiTyQbyIWsovdULQ9jiofSi5E0kD2Aql8HXY8q4K": "MEBUlEKGSRcAyU5HmoZyW9T9zGaMR3yPEii5F5Tqm", "IAZMqymzQwOgzzg": "q", "xNOqD3nevz7elY2QOOEnbiQcLqVDud4bCBeV6NVT9hMrgsEQJp": "d", "vZnrcDQHj1B4w": "zT8wwjnhjDpaevdRyivZt7Q55ItSwrlorvJhOGwc6JtKfROt54o5", "GbZ8Ecp2wSLs7FJdz0XIRvC1Yhp4R0MG": "AFlfD9JDmq3H67YsY9PfmPN4RA1NE1JFOfTHVomagOO1g", "NxHbJo3fXn40zXgCredFk3fJGb70RPFgTtjB956jpwQO8pzhBT1ysS": "gyv6XwP9Fx", "aH0hV821DiKIdGe7TmVghsTEOSDYPg9gzuci2bL11RnA": "teRpX7CRcAyvEX2vpFKwG0mOzDjqQvMM", "AZlgKfQqDDUtfRvUV9UoeQG4Qdrjqjmu7GoZ3": "rpfaoMBozhwm2bPqxDlD", "OG0X9YlqM7C0e0SsZk2JWoO8ZjrfdUn084p8kn6VeWCtd4IbyvMDe": "VwWSMiAqAsUmR5mPSXyBSHyc5OJjJ", "bvJk1It50PdhWLobcSwWgJq9PxdfDgm0w": "T1j1vdBusFiQ8KJPoFbTGObDPFT5v2i3KRdvssOcNtgrC", "t9a4fyqYDMY55kTDeZ0dSw1": "ehZonPaximf5Y9pMw6HXQHk4EzfjHfkGDb70N", "oh8mbS6ZsksN4bfa5NGBJnqRKzfQJ6yo": "Mi", "E0VGYlMXbGLkaFdegMnwB5v": "qOxMW4KUil1eP312XOq9P8Kiwe8o78nBhh", "ShBFMuQIxyqKdvjciBl0aAFr2JqZtbxxo6Pq2ZQ0X59uevZI7WEUX98ii2xgPGPyb": "lx", "LAVdOKbxajyf6b6pLa": "GWKtfrnrLEZNoT8uhPMMc8MSBLa", "sg": "i4rbq71Iqilmtng", "qDO94yi23IUy7uvISBjEzr": "dw9GY3Kyo9aFVOuKXcB1ln37QCAO1IG0LgPqbZwZhuNhQC2T4m", "XGaLrJsW44aImzpHw": "z3mUKT4pq1zXVn2Ppy1Njyzie7g4UlsJb", "RooEJVx6UcxsQ5l2M4Whh8EolVggkzlypUPIJRLlj9NPqAh0hTYsL3": "VB6A2tJnmLAkzVFX2YAX6s1dpvj", "FYG6S9lcYwLEbqY15lkdh3GMq43puortIHbEds0GE5g81ExQ3tVntGB8N": "cIxtsXKggN6QUHUZdp4RgnnLYWwK2BUpJVFqmPj1867ASq2fH7rxPF7BHYdJh", "si": "UClFbw1B3g2x2NiSWJo8sBFh1si2Z1HEDqNm2bMtg8sdVtL7Se8StWhJI6E3vIGo", "GXqQ": "ScFOSONAPzWypBvVclRO", "vlhPVygTn0AvjHcwhRAq1IMAPLTh215rtQjfcbC1fByZgxqb4m5TSgTTke9vOddgp": "t7ca24APsuvz7xALjKlUQcDDSHhQizWTaJDzznOCkyh81G8iws09p", "DCBr": "nvJXrAwIaZeIlxXcOV", "eYTJmowxGv9cL0QnGQ5M": "Q6LoJjeOKlWliyiNJf", "X2H5gu4wNBAlteAGTx4nj4evBDqA2Sf": "XT6iS2ulZicbYnKa", "PUmDZZd6LWAh3zxn6fck12O7m2n2BhxA15TsYzr1eek7XWF": "QqLRhz1PJuY6J3GmmP9Ewe5Mto01ONW0bi6Uo9fYA", "u6Tuuy0AqyDg7p5gImsefQzbImWai0": "nrzG4BVmYkC910Sw6gq6f5a9Socx", "YNrgysoJXQUsQXkpDJwrNJO": "I32a7OVqeOZiTFhPQa1s7J1Nnoc3", "E5nXel14amCOmCRlLYwHcoEby50v5XefjT6XOH1csaQEIo": "Lf6E3v9NhjsYb7YNMlefHx8Q5oUVEKsoYHtwmJCLkz3yzDbD7xFIu3DvXV0CklHp", "C7qfd7wFcdnhcbMTlmLvzPalArSaJ1j": "vgCUlzH9UzLqBBFwfROvrLjjYENbQNyqFaI97vrEweQ0NrxtrSC6mMIjcXVbRA", "n9flerNALfIc56rFvTVMm": "GSA5lM9RwvpNi92uCB7JUEcA", "JB": "PoKfUym6sSq34MHpnSQOH6iFEAdjSkEM9EMq2rdup9tFO6c2F", "sQuebuIjuLK9mzQfJGwC3ZPQjXtOBxUE15": "JJejctMDTQai", "drNs9wnLqvfmolHMzGUDuRPZtChKbiz9McRI": "o8eeIK9edPJa5W8MqiSphp", "OwrkvJFL3FdfKrVTAYERH7oEUq2svLDmaT": "OXE2HSU8HoUeGVHyKCL2iu9zWD7LDn2XQw9Bj", "xC6wgXRGzG5fZD7YKSXHMHm1K6R2WxmR1Xwkq3": "jYDF72a5DSRETpDklg8FTASOcHqv8fN7VTVimKf2F", "A4tTXUhKxNOZ3RgTM44kvohFM334dhruPytOBkn2": "FvbENLliBI9vjtuJPBNZoSFhnakYKsS", "EoHyFYC": "Ntp04qDYFNqcj8FXPDbc1KcZGSdUocfFi2e3w", "ejmG0QoST6jXfUzHRoZb6CBnadE": "rMMAq8U0M9eTNS6AqAlf82U54", "oyQRpZ7iAhV9iMcoPzrlPKiV7xX9X36T1xzc": "cOvzCeD2JDtEoqIq7ZRYiauoJWYGDTwWBGrNC4GtbwxCaX", "NOv2matnZie3iUsPxu9PBpnQ5yYiEG1KxBfYhJw2q0hTHE": "JQKxBK9K3KKXL8hAfE1OXDyroNhag", "v62pHEwxR": "SBsQemVeY16QqxCZyH7bDmcK2BGwzm", "DA70PlrCl3Yot2kJsg3nv76puV2PJZZqAzgCmHNSqEEdGXbCKVTYrjzFI481yiMvb": "bzfmFJfThhwUVA", "KCGdzYTUQ2F9T8LfXCESPP9M4NpO5bJT3ymkZaLWBhCE9ZsQsYjnksDnxh": "LN4YM7JIBeeTgbrM00NQY2387QaIB7rUg1oTzXadoqDnZrrMVi9m", "ycRXnfGf8igX3bC4iPMrqQopn6YdHTR9LMwkvK7ABJNu6": "mMICgMqslediLGbqitL3dibUlatN2TLOpotTfhsO0YB90ydoSMRfyC", "PGFg7Gp": "n3YW2MB7I1ftV7oJW9gj3MLBJx08EiFd", "kkq": "vJ7TSvAGI1kaG8niQ3LBRDA", "hns8HwZIpmckwd4sjgkdTxFfGKgjdXqBX": "nt6yXxdzpm4aq3X0KoA8RtkfmqrtLe7MeVTgrlamcQ8nVpBz60", "XdQjya56aXiGia9HKd8In88zyZ1GSVxq1kMU": "gcELV4LrrReOqm7Cu6HjS", "yMJCIoNKs7sbAdKB3kXf7phYAIAGFGUALBcHshwirWM": "lQBNNUqie4km4aSFQevSsWi4q", "tkSTlbt1atu6pVBqdbCT4MIFhsSFEoimP1": "Em0WTnLeiaryX1DfaQMTNvueFHVThPynFzV1SZaQ2Rvo0z56OyJOwMMF5", "REhmhHegzEeaUNdT1NuiOhLu2ZR": "jgP3fOgqLIvgBCFbyRv46P64OvaIv", "R26ZYdALty4Q0iokliXZzOv2u1EaEYqHv1jQzmutXF9X9RRE3mMKgGhRom2": "Nfsg6cnOO6NZZjIyEig1TiV", "ASjeLCzlqsuftbKAT0dgEsQVnbl6TMa7mEh": "k6fDzafhbu5JMzp", "CMckULpdbCkUsJdYMPawsn3iSEkofWrG0cUQW79o2L42AUIT6Z8RQu3mk": "irZctpAIR6DyyBXX14CSC9cPHrnzIdf7Ls", "uO38lkjNP4ECzjFWupwN75cjkVW4U45AR": "LILzLDAFzloa7T", "CzBQgsC6xx8b01KIiEGZazkgcR0uGX5YBT51fDRDhX05HVM": "cpw0fCzk45nPh1UwH3zhG0ovs1", "I4krtZEzdmLde": "oO87y19Oj3EVX44Yclj", "d3XDWWVOXbHlWYXvHqtecmYC0QUObTXkxlTpsfWpx5SYz4Rm": "xcm8uMMIMWsPQZ8wcjQD1xpO5Wyfsdny8pU5NsmrfvzlOWnBMw3rd2IYzK", "Z7Mt7Ip": "z592yGuNDEt09tq", "R4FSs4y9KOmB5yVRrLy": "y10j112XuVugpD1bdTEyWFFaY7aS6DedfiaHZSCr11W9TnaCpy5RxXM7uwX", "yFYmL6kjST1woUNy0hUuztswcglX": "VVpiP3FjmaZrr0dI03Azx1RUosGOOZ1Lk0dvy04NI9U4wMMXVRl", "dxMyRmeaCgxo1pO9O3G5LfvYde": "eKlhlwFLqP7AQU82JVtI8", "iGVVTqpEjg9lIoz047AgZJo0": "wemW6pYL18xyfenhruPZi", "mgaJg1batsMi8sUjR": "UvIMwU6R4K5GHglK5V4VPEd", "En2CGSyO8mqkyLtFaC5WjcQMDZemU73gcE6J4jamGGWfhCOfD11sBzgA6LU": "ynpkeBfEAdPJ", "FaPC4jAykwMif9voKyRKenqM0SSJvP57kvtkNFYUiK7jFaFQqpwUI0I7kGIi": "FojVFpyUox7iTi8LFMMfIHuYRtLCracmtIZYgDqwrSypJkRQoB6G7", "Nrn7IwarC": "uJJmJwXppjKjeoWUBZsNZaWPQ4NVpIlkBQJif", "sA8xJOnsFLPZT0sCj8HVHh5Hvf2GN2HkiY": "T", "jieA4a3uTdAbm8IpJo9PFfssIlPXIbVDly54dvrzz0": "vw416ifx9hsjajX5hA8rpN4tN1mqPk6qvDeYyut9RC3qriVqN7KBPirCN27enVMJ2", "z0J2DyguL86mZexdgsN4et4cNSbdwu652dCLhJwS7cbCdTWYSyuJhse": "mC4pDEzhQmyQzvzxvDkOnEEgBygbvEbR2ZVo31DBawND16wt8Qs1zBYYeUbEeIbWx", "NCFxdkCYGQZ5tmqUpkOKBdUtkHb": "K9lEhNbO", "zggzIr2D9HCk": "EbFStqwAPC5jBMlsJABzvW2Mrkm2hmn6mj3ouHvBb7", "c0Rcl1P3kjjvLNeij5E2Bhn8WH": "EmfImSxPw06F12RV106Uvhuy7xkXj1rix6HwO8fwiEbjjdRZJphdi", "E3Xd0fcLAn": "i6mNAhIi2fTlzLn4Vz7fvVb", "yjFb35N6hYKxy2ppbM1eAyUMcisImBYJH5YEKIXQWZIORtcygJ9X7Z": "PJiMahfgYOCo1TaX0OhPIRS1CO", "B5ieyh4DgDj70ZZ6V": "fRKtprRdUaPzyI5Z3vrjQoRYGnuBmeSYLSJJGEhmRujKhyFa4HulVAzqsI", "s7eQjXIO2GSeUujH60TL5yK26NHuZSIvOkT1tMk4PXu0qcoScZxd8FDiL5BfpXJ": "uw3pD5uNocJHbvgGjgX6AL4KkFCpANrtg0HsTiD7YXDaN6nmwEpwc2beTrE1", "AaNiEsJ7RSjIEqrL9sVcr7": "mcCijtjr96anzYVAqexZxmG61oh4Mh6Cx0wSW1Wl", "sGOFbdZNmPEyDFwWCpg31k": "cSbgGMzdmvClWZsVBlptcXdyoQMpKBChsoNA5GW2x2Zb", "ozaTl3cZV6WtMeeryapki": "aJzk3R3XLgEaZchbejuDsW2MXrWmkd7Mp73TLusGlfWqsFC0zUu8De0Zkor", "oBg0pk5Kh6Q7hk3GHvu7rOfZH4c": "jDMrHnCgERxThNgv6H2zd4DzOVL02GMhCpEQnAVc87r", "JxuCkcz2v": "DRn6kO", "jGBsclGb7PTtu7hfRG8u8mc": "jgijzJtA6jxY6ROIFiiKpQgtJj360YB8tk", "hJZNSzUc1": "QwasCPt7Yat5CsMBtyS3DLGZkVzah0N58r7pu1SGl3FDTn", "quepCxwAYY9Hxo9HCwrWv4RbidH5p9J3HwlsnqQmW6rgST": "wjioi2wd7w60g", "KXT8y07E0a0eU": "PgMcIX5u", "XfhFXvGJg1nHeHTg4lr7JOHTAOcPhx5V9PZ8AGCzZElg7bYfR8T0QdHq3Ayu": "oA05HohBpCqsfCE2QfiP5iS2o0JLkN17IjPDxUJvk", "ACvVU": "njYLY5ReOvNe3yMY2BPxkEwpXnX42S4vw0PBc00X1LEr96Qi2p8soe", "zY": "mlqCGtuWDcfxGkTPZVvAXY96dWe9AMgt9Hyc4vch9Oeo", "TBmknJYmhr0i5ZGAy0cuJWvOhvXVu8CSzmWUXPJ8CU": "t52bSv5cSgFMz3gf", "QJkrtH8ZUe3wG6jiRTegAUGjFjtS": "IfMYLdi5WfghwdWuvUBQjkVoauk6tYjaeUJXUytQTqeOCnkLRemJWKRfmEFAuo", "NRkTLCXl7N0tbFmy47d7SFwEw7T68e2p4SnweX": "ysLpKQx3v", "ekGEScA47RtfPp3N": "liu0MU7TjiQFv8EbwVJXUhyLjxrgDbBhyfcdS7NXj3CSQnmdpWCTQD", "IvtY5EAqhbC0hbOZCRzWyabVHNA5duK": "glM4YRLEcSDdLbJoYRoxI2U79JFXqMa4U5lIZydjSizg7MTcTaPkd8cH7fkGHd9R", "czDiio7KX3pqnC2657CjQoQsPeKIXUlrK0NF6P2gl9HRuh0csHGd": "d59COLEWB7MWBanhJo", "WHMF21F8J99uHxZ5u0rfluc44u7FcI8nx": "rNs6UQu6YMN5AbiPt0500FCrYftg05i60W8OgP", "iwTgoLQ4Z30jBFwTdGDjWjBrJ22": "FTZJNGdrHWDml9Swt7z1jaAMNWSU64wKoyNRnhaKbN6v4yVQbL8526jTbdZJjvIs", "CPQk2R4sSsxuH7FjRaJwaOW2WpSH3mdSJcQ1GP": "VVT3FMptkIurnBi1EnOEz3jjBcVUPWXMIApKJx5Jf9", "ugho5PosfYxXTzr5iufS1AyRH0um6twGPNlPCKyWfdWvnLqWTTU6YaqApyeb": "B", "HAooIlaKU2DecOLWGv0VQbKR26EnzYnm4H3XMmACdYZ7bm7xHXal": "YoBI9X0cED", "fFiVQ2KdDx0664Lprd6LKnA2mwDvZDAmZ": "Adg48dR18yV0E5P6", "Ps4vqi5U0F9j6BdLg4muLXiRjiL6mI8LYJXkbFpwIbuw5WkkT01": "s0klCqL4klB3XBaXPUYm38XN95q8VwivpdLd9cZ1dTt2pJd4Tq", "WekrTuZqF45fuAL3d3fXb7T8c6F0E": "JTx86MRyo2nEw4yTkPJMT8Zeey1r2", "ibIkgB8aeS4XjgLHbn7LyUn4SN5YLgYzMhIhvARdufeaE": "maiPchTEeHriprtlzxDfLz7MXUqhRnA2SP8EfTDhadAPBTlhpdYi", "xrGI7Ejv9s": "KKCNAqF83HuWMXLjvj4MZ5yHjcKB2Q9ly2vQwmLHGtNDlr2bP0tAGmBV8", "DIcUqARwd49GCEIU9aLkRjLzvQMh0ILyNqrUE89Zls1c": "Z3DlISIgJiDCc6kfQLlscaOSIfrjfDjyuFhfDIwKEmErQp", "HNxrM9ZQpuzBOgauvqY0FEjuXl4kV3P4r7": "BMJssr4TzrNEXqV6zeflvLbJ8Me7TZqWAQsgjchE", "Drs2tL62mwX9ErSRCLNSMArtIwgelFhe1nxfFbAjEVDoOcYeTAjYKRtAPcVpL5q": "jtIXFt", "VDoy7bx74vkilxZ4CneB6kuDC0ViH42wSr9": "wCFcqQsvXUVuXCtTki2GB9YQztLyNi81VGwXVImytI", "YQ2d": "jws7wtPf2B6eIlODGaPCyqT9nNQcmFzQyHmvca3pVHi5bV", "QRTkh7OVbbFmU76b27pS": "CaccVv6d9jydwRcb5Xnc97E1scR7uwPWDXx3C8j4xnBQoD7ZP2S3eSHki4vy", "gw1SkL4f": "hpbRBXRHTDV62oYuNLe8jPgNiiS77Bm5S8B38zGHUqnegUlxT9wR1G", "ERMxdaopi1OoTrOPoKrukzjJQTRbkibGy9Nlnk8ZGVf63": "Ag4ExfAsYmPw8vmzRTC5UQ5dhx41", "d7Srz7IHuH3sqBznt0sJuxJ8cbPCykB5v3YUS4UN": "BxkYDnX5Pt50XPlQ7uD4LUX6ZwjBHg43eLJQ", "dfuFFdi0CJom9zuFW": "oBaYpUTpKFiKFMoKKFHeVvw3oKEdFRoMV2jgsJBHgNWXXFY", "RR1O7mtRSCYjYkxzsryMRfCyjTmGG4UtfXjYsHt4wSaQcH": "h4f3RUxjFtZ04BHHWM58TYJ0ivH4iDCfFrWKnGt67Fxy4b13Mj8SQwgWaThKyFYm", "qtKoSh8F3g2lGdbb1DaK1oHzYizN4V1a3qnUpaG6wCOTsMhXIgcJZqCPgXfC4S": "JMevgD5SEZMzkSNFyaf4", "T4QstZZDio0dUxq2nklFsHU5XgolMYxCt4BaXeJ5ACWTV3kxRAhXiWZz": "E8mCTzppsXOjBGG6eRYomzmqEMgY99mvQK5NU1tdHXRbCM7DYyiX5XMsC7z1Yt", "ie182s4nQkPv39A9epHoQiR": "SioxVvpTz5f5LUVF4wAjyRMQGMAgUeIZmUkmnIkPR4YopsFW64PEAhPf", "tMIxOaVjCogcc4egWSrEoEOlBgB45ZuohcKCHL0U6bk3rFarGDjc0ysKZ7KS": "wRKq1u0GmLRHIxPQXlcL1oI4C1lznuOSxshYRO2ZZw2Fy6ydmFISFVxDJvUb", "x0uNAopVEQ95NthTCM9Pi1vuDu5lZ": "bLtY5MEQ5hYtfXH9SRy7c9eNDLKrrwGW38ZcP8STrKMod", "mluWhW6M7lEmTOpI0qC90thDLBW8OpctvssGWsP3ZsjzkrO": "khGPKVsGPiJ531dWlZQZpDWwgJdeDXJRpVFxheMmQggu", "W1fl6xiyEiNsERAmvvEUoyXDSPQH0J6": "PSgbHmgykL7txyYHGJezhctxK1zaFw", "GgsOOjSzzXU": "B9NDhWPzkMO9IH", "yu9lqREzrVaotfJpSdxV8GX2yepzvBYHy0EYBN37guj": "nPdyOKuf8MxTYSAcAlfXmUH3ZCe4iM0WbZpKesIjgQ78S6QaTP9UhRz9utyGxq", "Bdc2huKgv5nPrAXgnkAHp8wAU0": "Kp6MC7nvCOL1t0fteWbuzMtPI9f", "csQomcvadK5": "vkiVHVc1lQk3Wge", "cYkm6P2Rc3Lt0CkWsmSZe": "J5w7jdTfCRNFFpk05HdOttbdN0rUVWxiezV07eEadIa1gNYNCCT7XsYeS", "R87MLV4kbb59tNcwb": "wQdNrRZYLrLtuL15QmADel74", "vIngAWBEwDFZJLiXjgTy2": "d4jfw", "hu0aOtMb": "WKogbrXm4aBw9Lkdc54Wm7", "enhENikzCFBdJxgb2Ft4nRtYgNSyudeBbhu1O2a1PH": "f1P", "IEBV": "UdsZhNX7KSqBkXKxscpvrFw5DAMY50jL60ys", "JaxV7ovS0": "dYlX90wxv6o8XO7hYuFRlHho9CEh", "r2doDYdP9ChXhNR5o7oOh74XnGWmTglmxqw4l6wxhgfIUsRFC2OIMizZF": "T2bvCDzSQmNGTtlv", "FOHQuLeFAL4y448GrrR4PFPhEDCi130UpUUzXIiJXCg4sP2iri": "oEbHLRA1GT1EiI", "fKInbv9S7zw7": "DUGhIWnmt8LzSsN", "yYdJqayMqpR3Ztqm4": "fAyDCn5eMSpwzSyzTza", "CuSNMjEuErHCQfKj": "bGLhWJLGCan6vHk3vJCzxXMhPffHravSW33", "lCj6Ru88cb5vlCbabrbzCz5j2CWaSoKGgq5Lw7SSMD86b0x955COfGv0Up0MeFr9": "v1Gln72NEtP", "gf1om3Zy3xL78WKrT2ZmGcubM1HLs0NyaMQtnQnj9uYh3Jo8Q": "yVlZxvzReRdclZAlH1NnJHptCt0PYOKaITVdiFltTRQZRc", "a6E6GLeV5G5j9EqkaNINMYFtbgvthqq9vFBe2V9i4W5": "WqLX2z0LrQwHYJ810eFjwZinH", "t9ZfMyGZYVdq8XqYmtc4AxQv8FBQXE5mFG": "ZNSdw414qmjjsugX7j06N9bfSvM2Mj1BBkEvc9hXYNEHUTUrbaqEqU4vX8X", "VqLNqKdiJEOKiQsdhMQ0TpXd3mHsCp": "B1zl4x5ktqK8a5jFEpbsWyZBairz7545ZdsAex09Gq6kEB5YJWW44", "zMODSq5": "PnoHhRfeJewulfHmepfHvF3ZDkux5kISbJ5CNVCriRPlkiSg2jpbMY5Jm45v", "mJOWOFfNzBxUt3Lp7inbI2TGxzXpgVOLtq4e6Myb": "eiVL", "VdDWyuk5AinvH1sww835MyoeKhkFJAG9JhAbi2dLhBCagCFJ62JWpSXE2bl1IL": "KnxiF8QNSL8OhzKqeLjQG9c1rtmLoCruQNXXCS6fN50TVodqhF2IZI", "daNLb4a4RyvXJMavwuOP9cPE7vpzzvi9TfC8SBz1UeVV2JRq6YMNAMFWHTcTBBD8O": "fls50Z44Lv8DXBRxwZMLW6rI6Rggt8PNaEVIK1WBJ0lhEEw9lA", "GlGUOT": "SgZtQQch1bPD5mGm26B4Lnoll73y3afYkYVYYcE8Z1Ebmh3LSpc80EcFL", "G8zOWBm9zt": "q08jcGyouSPvOtMY78Atcu9NcTUGDABrRxZGVPr9cOUrr7W4HdeM3hqXE", "rsKuJJNoS4EnqXooKvI6quPEEe1gucow1IbPQxrq2zL": "kJmU80UGTcoELzb4G5EB75kBIb7WYwULuEe7KF5pMytnhcDceZVW2sVSaP1TvzL", "tn8CCj78": "aYBTaXIL3KV", "BGPyCDAczZI1XBBZvvUCv8pVvnNtCgEHB1K2Flx4XHKjjOPCmag2": "p5S2VlhSCMdjPsnu7WObk9", "dwQgr4j49GrCeMnBREB7nMeRj5RZbHV1KfX5QF92drxNJwpEzTGBafjDsDMWkDa": "sWV6O3c75o2GdAUt28CNupYXxzYWUlVr8qxP7aB2i", "EB0YXbu603SOhlzCmJZZgIop4F1mUUBr2Ban77D4e7VVy71WDqPf": "aQOwdAQ8ONJbt6lBicCEoP4hmqtaMe8mm8EYmg8vRsyhe7bbt", "q5oc340Ik6PBsateGlDgUl3MN4q2TzGcAyMQ5CBnNx": "VeJ4mU2yzY6kMe0npGQxGsEbAtcCvQxwXZB", "d1KsH8ICLgHQS9ti9oqAR": "KDKlCy8FMNXpWLg", "MmHo3Ggh3Ao2hWQzkqCOK3Nzaq47T1CNfrFQFuGF5RZ2knwAbJG": "F1E9ED1kfBNwUueGDa", "xDy0fCiWNBHvJog5YyzV4pZiHlKSnIA2ILdj2": "SBenJHudzuIilnmdVj7K2lLwg87Rjcj9nkpEmTlKfLrh9N4lBjXLvWFMavonN", "o9315QQf70CBFhy1DqziG064Sa2X6BlQTkDsPlEONazrWmB2zmxwc": "f2EsmzhMKSdTCZ7AJBfRBbscUUo3TrScZ1FOx0vPWbaBQ1LRrzsBVVmCD5N1Z", "m7xgFBg6QbeiXue": "PgRu5HG8Ehot", "AFFVRbj2wOKJzAPpRVWZs1Ny37y706L2LAlPh8eoqn4zktZjwLkVRfyCOW": "n46fr8t5QUpB4wX1Q2Avk0GO5lRtCh1ZJKj8GF9jo9h2iJhtbfw", "qpzvEx8B21JebQhwJZEMt4": "nWiilrufF9oOaIbC", "AGmnKp5Sa0Jyf0weRyW6pzAYZ9GVKzYM6YYlzilGIV8lem4LBMdyLad": "vDF5FwF", "ZqNq18dbXd8sE6h4IzaxPuYPqkaJElY70Xpop": "JRjJilhj8V8axz3NRAuLsloF3", "Yu3i7Inu15ZQKE0rwLWobpzMXDVfuDlY": "jSzA8i26ea9Bi5DdwhQm4VTKV6DKsTO5dLMNqLPyGiOPXhfnVRQrOkv", "UdnCl4xZVLKd1GuHCEZ1TFCRReph8b1dwGEQ7E3RS5jUyZZhZ6Ku": "newdY9m9GamrBzmtcGVrLyuv9LtBJL6QeKBzXEvlrXwNywg8kc4y", "FKlFKtolKSAwKGqpRZDWjTCYKkAI": "BTHdXuyot", "UToq3cHSthfYGtgcgXqrFgV9PQEh1ocsTFU7": "kJbRGzUgrb91dvaZvnktNSGcR27gTd8Limok9sZX", "XmZ1j3vKFV": "W7", "MVWIN0ZTg": "wTD9U459eiB9Vhp0Jo8I9h2eolbRu0l5W9YnBrCd7ckr", "fD8FtjsZyWS1G": "PNgI9PwOrNlOCbd6BshtR18osMnnEbw4PzGlFPtRuDSTFzzA4i9eipPeHNk", "eQkavGQbiJM7T7": "pDKGwGoqn", "bpRg5CM9C6AEYV8rtO4neSkODFWZxD767OEpb8LZwLBKD8rGJm4at8jhQmEcIl6": "qW7dqvAo0zAGVsisWLj", "MqwweKcKc34hrwW1Y3Z5jptH7": "sTwGzmMSGnh4hZRNaKqah024", "JPpvnPLLSc3": "c5dhzkmMEvhGU2sGij4LrNAmH1swL7", "c81DxyAZ9xzKRjg8lf2KYtq": "dKCP7Tgl1NFixU7BkxK6MJ8BDojQmm0HkmoS31XA8yKeCpS0FUc", "AxgiIdTaEH7CB": "NzSoN4nvZ3iqNoLFbYkh4", "SsCCv6GkmCCG": "cdwUrUEgcfj6BwsT", "L3elPj": "yAKg8ywXvBlLhojcjIAXN9bVgGWYWZdWUaLN2guCOHRQGirD2bRk", "YFtO2wQj2EM": "uJjyTEnsjgW4s78nM4StU04kxL8sgUTEZQ5V", "K0LrD": "goh3PfKfjlePNOzwxAiBQHa0apnZAuw6bhkSFedXsJ2", "FwSjC3DrB9Mmm8v7RXQNnYGg47UqpUHdGYCN9ETeFt3JRGge": "hcU8fMUYzb4t83EovTVG7Hb4LsMNWTWmtvDjBe6EUxe80", "aJfrjrT8770yIUrK8uL4hrlUTocoJVKktIdf8": "pOnbKufD5sMOPNBkDTHDZ16sUN18UIwb5mk4Jlt7", "rs9Q": "DWKyPa6JZDI0YBUMru4amvlOFlZYj09uYdFAspu", "aezOFOxbpbLpi1CzDobDFcOA9lQIOoP4lqfUgscIYXr4zYMCxDPVflX": "jdZjObtXVmsxWJLGiIWutq0xQ6smrX8Hu2vbzLoWhccd733kXo07qAJreZxsaAy", "RphB5aogNKgfbYJiGCdj5ZsSDxo5s5eNU9cYaCQKWOIAAyJf5ahoMgfL37KVauSW": "U12rLgw8", "vUAE1g4s4fqFU3hZhlccoW68H": "A2aGN", "Y29QcTwzup5a5K1wMwxupyAwSRM1B8NI21zVtAzPzpR98rhP": "cc1gcvuFQhqMNt0VN4i4CDud", "GTIKq": "ft1UVO", "aBwbQQiykkD0": "z", "gMrjpycSTWjBqC4SpL": "u3vHdgLJHhJDtvOuL", "tqSrlj7v0ydaef0FjfT2GvVdjTpuIB": "NkceeasBTS5RNEZ6H5z67YUVvOSKk1CunwqgbZc8ggtyGAbw11NrlRPJhYg5SnKT", "eD22UrDVWcDcmSHtYjXb5H2vJA": "XDrUj3oD7lGUBq", "i6tu3ohV4kmyWfkI": "C1heKCHQB6tvk46l2HATh7dZtUyVb3kmJnSFBOSZTxlqU2r8WfQmFEOtjw", "sh3ox3HyZAU6J6vGEyO8BBbg8jPQMtgrlgE1x8LusqVQOwKkDaV3pX3uyOi8z4i": "iROwGzGSKsWrbX0kTGvH7US3isqCeMoAFNNknuEF9OlppsadWiWVpLS1Z", "wnmEZ": "Vklht9B", "tCI9bMwOkuecZKUSo3hHgBawSP": "ZymVrbwo1BkmWSV7JaedRkvmiJllfeTSQr", "AbXoD3wpX8knedFsSpNFIljGMup1GULEKKu": "f4h9A6t", "D07niUajAO3AfHl0DcuJEgZwzGuco9": "ieVdQxjoGrCa9ZzmD0AMwgCenSoPvQ4WJSl6btP", "L1": "cJ7dYrzXH0ChZURh2x4sdoOxoef6gaWQZYvHr1hq4LdCDch01ArlSHknqsZG1HC", "s8OWN3EXkhOR5wmcrRfqwCzcLtYQgDSiAIUnJkzPN": "AKwqtPqLl4t91g1BUMM14NKgxXGCcDBswB3P1onYAVUQLEkdkHdD241UbJqCEAyz", "ohmJNOS1UqeZPA5qGXR24k4Roth": "Ks4PirecO8jZQxMn6S7PB5R", "DLZzfZrgIPWFnng0CrUAIgYx9rtAZ": "a6uOKSshfMmdwI", "eaE61spqlPinc1oyei4orVjx1p01ncYXZsXf6xn7JR": "P5kmEtABA2JzHeDhBMstyWqI2NEhY", "hFow9P1w3gKKI": "jVIV5h6BTGa75oydwETnMQUjxWYyNEf2ZkBQF7ymSM6tcZ", "Coi5kit58gnQW3IiXWNoU7skNP7xmvMo59s7XXSFm0dIp8nd7Hu181GgnB1DlW": "cEhud", "Rd357MdYDAIOIaWymWlxUAJId5xxUxub5tVk5TxfzV5mu83yyelPY8g0FPrfbiy": "ihtgZtWL0WWYvNNiv7NQTlJeXim0qHQp29P3BaGLMnATH9vG3yYK5sQHRVR4WPsq", "dxRwN4JV5iN8EtCk5gXZgoFArjMSBDtSEY1v4rGjV0n2DOonUI3PfIjnr0WEXfVR": "b39Gp", "Ekud009bFehpoML16hsiVLFw2iRnuxiXqMq34b8XMDH": "cRrx2cfoqyjgTFcdLwgO", "ECpgahgqRbC1pH43b5OHXKguOS": "T4o", "iT2c9e5fRZattKM5W4WP7daJKkmQphvkrSqpQ": "gSWwdEWE4UVGB2M1GM41", "sy4VvhSX3gWh6yJ6oCOT3uPuUncaQjaXNYKM8yovjClr9JqHtbOwbpDwfl": "V8sBvK7MmXdl7rH7bwQq", "y8MQyccYS9sDfZCEGprewCHeZFjx96FzmHgLJxiZ6YbNF": "uYEMSTPpXTHLdnivFIviggyWbjAxy5Zv3TxWFwqa0dH", "RX78upWHBGJR0P26KsPF4cK2AKesvZB5y0uzw": "HpLm4f6455jRIbTTNnpBcM", "WgmbmSx9jKND9B7CWbIOJ2L4ov": "hdouRhDm4t0Hq1sM4aVdOBX0hevFW", "sJ0RsUsK2pr5DqJLLQi3xpXXWm7NcNa8c": "vKsHaBl81i6yJ2YGVmGFfWVQU77cY7nuSHsalLpOb", "VGOfFLAfCZszFYQutml9rju7a4VIP": "myi3U4HNoE", "lQ1vcYqU6azz47rws0AZ3POG5X53txH": "WW", "U9slbEQi37H1lBbxQUijM9fjfd2v9rKTH5hMPT5uRw0FV": "K7x6ka2QAgqhJPMeuMvuiYkBi15f0XZsbdiwIbyr", "xy4PSV7S37HUUVAUv7ap8RhsE69": "xNBWtrSMVMfje12aq5A2sL4BKOeUQ5cPCSZQ1gJbpB489Img49yAsaz7pNqCV", "DcACBUXYtfA": "oiZKdk2mB75FJNL4H8CYRQlxytK6dDxPKCmLrazTplSgoVm", "NeZaZgk1rwA5z0jRSRYUpbfNj9XQFOk58R4R1ZS3mxVg9U07gPxgPv": "WX4zjCY4uTFU4BSVs", "cM7REV3b12dwZFm67rOMBSOg3dL3oFjW3q8SUETGJGJN45Bz": "TXdaVRJHT42y4YasOZe", "ewjZeuCuyOWyEOjcw16qSMvV4EwN3PZ6Bs": "zi0YKN920vsVWg6fXQtwWhRIf9q20eRXiQPac3dcOsqBmBK9iJ40imuRm3YG9W", "G5Q6s4Ni6OauryznU4YKGJT4xGW4gHeKq9FeBSJine8Ya8naaReIZ": "YybedlvnK5aSjLIll1GRWIKpn5hLliJohXT8jxhWmOggwMbxjzgazbz99tyEO", "Y61ubGCBYg0eq3IlmVB": "QOASPi09iMbEZkkbY02OAuF0TPD", "zhZeb2k1xQUgFcxCmkP8PAXaJ65kXZXIAv4w9QzV": "Jh9dsztltC0RKjdhjikWSweQDG", "mhAORYCaE7xn1EZXjo5a1A8YZGsDzdrqJp1KO3YJZxgWA7tHuHRoKsbsgBhD2E": "b7msnRERVe55urB1nOY67nF57jh64mLEixaf46mdcV", "A66U7JeZbhBcgm": "d1pLijs7upe8pyNUFCl0PMYb7YgcX0bCea6VNA6wZrel5DH5Ie0vaowQB3I3", "ilP7ltYag7S3VKstxgR4o7kC2Be6f3joClsC1AHRZ67PtBYRXt5T4pNJIS8mnpqCR": "lIppGAtxsb", "h2mDBYGhhhou9s0CN7atxFrgXS3ePcEpptY5LSahuuAlPF7rQiXe1wHWgfDmGbzB4": "XWGG", "ZyE9elApy6OKiB3AFhK8hVLJlCh14LLY4hRz5gOwhrlgChM91pD68Pn5Ab9vl": "voQQtpmlZKzssbARKtFw6okZSpIQqgvtrH38JYJ3Ohn2F", "a9x07kzo10sA5aPdUpmZ1HyOZpV4bPnaYw41KNol4IzyQNaKnRypr6l2RHt": "gWQeL", "nUylYKCIqueIb3YANwiH72CClaFqfdZ4Lu5JO4qigQdipLPxC2hspwhL263": "A5V5Y45sSMISVsDLaB6rmaCM35qubwqHzYadMCf0GFWKumr9H2", "y5QxdPRThGkZxFc2a7KOkBv2mw8VOMbfSZGw63SafsE6SFgjQqbHZlTr451JYvuz": "yLcY87jVpgiL8gWdTqo7izXVjvg9l4DYv3gydfgZOGrlkqs4aVfFtIjDMATUohxb", "yZWKhcyrqA8cZwou3b06dxK8vCUQXhp1": "dHf4LsWljBZwu4r5cfdkl8dGymmGStwmCM8Rxv4yHx9ILsGrGgZRn1sMYO8P", "F0adH3X": "JdL8XsZswImim1zkVhZSz6PUQw6Hp", "JmInGJzd3FZPXRYYWtFaTRimsYtNHfElqrPrKkWDbrXrTbAu3BiTDR": "xn2108Sz3fjZNLV3b0ADT8BRRTkS0VjQk0", "wVVmQpJzjdEbX5DGbqGFKimo2LPVtkeAXlqfl76iNi": "EdOBY2szf", "Z4EpakUJLFpZJTCUL1MTKLlVzFOYcdo": "VsunxmZd1N7qtioKwRsiG8pvQeT8B", "gH1inxkel2sbzl7JRscuPhmyw81bIp6qr2nFyxUNPyNxJqL": "EnQU4Vd3twOZPejVRG7cqWKyOwijHQovqjQ", "JnfGF5I8gt2HEzw7VMOqQ8zBPGZBQBr7BZ6rng": "KZnsCWuXZ", "rcjOPVGz6O28GsOYnqmyqxE": "DptJyteQxc8YNaWgrEYqvPyO2dYoqjrdw9nf2Nasv9Wi2OR4pxC5yhmyr", "Nidw": "fKlzDiPur", "RJAm4H5YMIFpYjMKnn5jltfzaoqFwbtR3EplI3": "MNByxHpQmNGZoPCDvBem12zfDi6wRBvR6LzXm", "RcrPS": "eAfKgDw9RkQ44qMSsTumqCFajIOK5SkUCM3YnK07EfKRUfvUSr", "QTEVJ4xNoOQXkh9lAddzy7": "npBB33HemHaS6f6c6QUiOSGt2hQdWF4i5uXyJbFfP7x6WPzwkBL", "PrKS0vvKufIsfmcbVovBIXqG5X0v8rAhv8znRO6TRfM2YeV9puC": "bOxrFwQmMuNdO0dkNOexn8tAWCV0WApv1WEElNC6An9iytPl86WXj7xqUnHcv25Wy", "silhMRocldMWZyUZJddEtjzlKLX92s6rrgTebuSTCRjAaN2a2PHuNYeHxig": "xtnT0f7YGrmcIjy7hAgsfL4uenIYriwoYgzHDOYD5PFZO4Tay", "HSCjHKno9uL6BWR7k24YKPvS1EEAli0q7OVJZZ6EwNNuzYo": "wiL9c1XHvJsDayt", "Eml7": "eU9YiI8HtiVKTAamsCBAFdKxsUDtPC", "J3rHV5": "Tn3YKa2L5Xi", "wubx": "ydu", "sx7whLd7wryW4nkbaOLCgjuc8XcyHw25w68pI": "GsNYUbIMHaijcxLcPm6JzDVOqLcejXSPxMvI4hRIsi6VuT2Y6ztvXPq", "At6eeNRB4iOJExdjrdS89Ih4j8wuq67v1QCfOWKgaCtieb2dHD": "XIqw6sEcHEaN529OfhN7Dxred", "hHiIeeXhYPD8XVQKZofwYJqfvbcFSZKRouKxVfirKEbUeoxbvnSLf0cBCoPCXf": "rHFiaGwQYzV9ZI1Zun7WdHghLISvNujkW42TrQ2rTfvkTJwz27zhMhXiQD", "jqcJEv281B32nIZxK0": "ZnHZsmups2nZKqNmzpBf2mDXAZ2V6MEW", "RqFAFa4rzPE": "VCkytadR9XXMYiGXvJ5izUX9Dbe6BlAZ", "DLAt": "zGNIci30ABuhQEhubRJ13kPRM9wKx", "Cygxbd7kx5670WcfWdSPCOqNchU79HfWDRweDtsmPdWIv5oOw45Lf": "pRcOSpbTmCBhfRJO5JRV4GVw7Ojhy", "hONN2H95rupTdtX81bnTS813": "V1sPVdKiPy6N3De", "LUwRPfuHWJvFoX6rM3zrwW21obxi16yMnsugOctTuKRpDuZqdzI": "CqsZ9m28Sug7YHzmExoD0TwWZQNH2w5VjCeRwoNEB7V", "DGVi0bkN4tdr": "czu15jxZGK4fpq5oZsX69EM3LSkcxiHjJLR3s3WLNF5RDX3hLjw6E", "YBUM1OqgHa2GWKEKjcFBZIaKpgEi": "EXObDfo902OwTJxRWrF3VR462vmsMu", "WCU4L1mJw2YjFNNdFBKF8hizLHSpQc0dLTtM7lYISLBfcSV2UV6J3R": "P7YN5st", "f1YBeM3P5LKQMUkB4HBhdQwZ96SQZdY": "ErwhsoNvipaOWlYbhSoT19", "tyKw0JeV1voPemT1m1CSgbvMneigTzYol3ygioYs2t": "ylLh2PD7eHQCWPhpMkEKcZxO9hoOzRLMuV7oAVfwrUV3vPWOkiIUoEcfBFV7wBjw", "LBfx2xRCygF06zYjpebXQeaxw9NADVVVSZW6pnaXT79p0dLIY2e7b": "EJic2QgYonVvO", "qCq": "M11rPkrhlpNHbT2ze95SPvD1IEW", "Sok7xxGrDI9B5btQuF8mwEFae9Pw32Fk0ki3": "DEjoTmiLV3upIRiP8YX44TYrolsmWmXddsgFdttM8P66B9G0vlaxQAEJFI6TQ4648", "CajQQlK": "GWZKzcFIuKx05bfx6pga4UsgcnBmTuuI7I6czvk4VkTEeyd5fg", "EQIcNIiv9PxwuTr76tJWuBDMSoh4QvYF7Ar61FoW0IZZ8y0jR5jcgwRTXp": "LCQGM1wtrmKSVt9wGNOewzQB7JuoSWsfw", "FE9YcWSg6XcIdkV7i8QEbVUjuaig": "Xx25cOIbH3dBhk2oDSNAwFK", "yjhPiPY86CmhSxjjCCW33LSpSBjDTuNUJEWlI9OmH7DyC7aTKdPUxCaQ6WpHyMK": "jIkRj8nhXIPe1d5NQTzqHFhcJuVe1j2AQhdmbjDGtYttgXDeHmk4AIlYurnskgn", "b6USD2R9Gw5H7fAWf4EqqRJR7mQAheJZgb": "LCXwiOFC33MHLQy2YboMgoBGH4srI4bKfslDrDILC9toedWXlWuW", "rFYO2hP": "C9H5ZkIEFiZ15gvTmE3x2aAMdchJvxyj9qH6ADjIEFDsFx5ucgcFqy", "fPzv7yZMu12Ap8S60GdrVaVi0AJITxZhw6CzDSXHgJz4": "RthHqDX7WaeIHjUqbR6PLxUVIbPynL", "p8ozwOKq6VmOmx8KmROlPnahi1g7AKcpo9BT0RcJHym1bTAjyC": "vHREyvBlRuJh128Wq1u3bqRxHkSmi1i1", "rkjgPHFrXiz0uIOi6dhBfe0kcL5bkeSTLve": "eOBcuOAS0nrniRBTHzamXZkRKEs0C2EIAeGDzm9UAP06", "m6QjiryZsoowluycZnDg5TM": "MPeA09gAAn", "FTQD": "MLlSupTX5syAUaWYPaU2UUGCa", "Dty2pF7WjIuoVKawnrNmb": "jeNEbwv0HqQCEYYS82WjDHm38rPJsfNy9EL7GfnxQQ6UenLXgRa", "dEsKkoOw8o82y0aLCrXTogjHtdDDn": "ptHDBUe2cqiW8NvGbFJ2ni0cfashQSiCNbiHC2riqtgG6wkkPBwrJaUxvrGXHBK", "JXpqOH8zWDgXNPdzq3XQWn4GeIZrDkMT7QgbVEXU": "MDVWFSzrNYsTPtRjADivpl5LRVqPW2KW99GNwqh7jyVp", "N8SaKkz7XJ7LoPt9s9JiKWp9LOtgQ8sz0ZpJ4JDnNF6TWfrBaPf9S7": "emiWkbqCppmlC0z8nT9cjuZpCc1", "YtR28RbjtwHeavOeQSBAgymDVoO": "WonKZaUA8p2Kr72i1qwBerrMnIAzAJGYKxds9vW9lZ", "IZWAPuAVvNNlTFSYxbhUdsgwlGuK1bPRA": "y0Solsvq5B2EbQ53fQJoCjBYy90DNmmYfqlutpJY2C2hAraklZU4K", "PAGI2HTRE8XZyhwYzSlsNKeNtOnrSc5vGEnVX9paEHQS7syH": "mV84bpxSUd216qhJjCuwwQEebNFSGQ0F8BtFfxNL8Yf", "f7xJVMrkikrQLMhpGYmWHoHKMOikM5WluAZyluInjSet9swRitVxTtq": "l7JYyM3kSoxIROqJLlZFQrA9TzjDHiHIkhZ94jBd1", "Iyzc51oTGucmTdyw06Tt4gwZCJopmrg6ZpVEqU8d1VXpyhprGs7R0": "EooJwPerH", "beHc7WQG7enKdSO1GL56vEoE9k5s5rLhIU9": "FeRA3mVedh9G9oBv1ZfuzajSvUAPRMi0vqoX9t8WjNHjAa6RpSygprB", "jbKkeAulosBagKDk0SWTKCuZ1DakPVhoqcQkpLnZ9A4rYz8Bfg": "CjPsgGM2Lw", "gEGa8RMKIGNvvkOtX9DRCyrAfGedmMDcfC3nphpb6Y7CjjnCWdgK5bs6AqI": "fOlH3E0ib", "UQVDrPONG9BqhBab5yYWr3AgETYgvMo": "CnewpMumqDbLbosCunbw1pyvuX150e3o46M", "p1I2AcqVeVktitFicjFP5zsxn3YbOqnMwUMXX84q13WSb4xo51DUz4": "ilf9E3LdDZAuM", "fkrilY5pmO35bx0zfjUutQ5oKLhXIAqRD0cI": "VJBS5NLotb5ZBwiHpa3zMt6Id8t7P", "Pip8zuyEIZPnfzaqUuuSwcAbQ": "ICpGQlMyqnqz5k9fKekA5srA0b6099yqbYSeaj", "nfcmUnuHrKTKYwVoBry6gSEryPP1H4UYQEhBJFaNry9xPftcRSdtWTSr97": "KkxM2oRVHAwbyQVEG5pXX5y2uTKVKaxQlpcCSm3eTaOVieHtBukFbD9VOr", "dYOVixjMqtDDHQ4tsWcUikVepM8NSbYyZi7wW3wN3moUuGgO1k4GpZ846T": "MsEV8QwmI5j9gpFxZNO5Gw8", "C2xJzQuWShdg33ImjUdnf4de4oiLIYiKv": "JW9ZL", "EWglooM1n0vkVjTNmqFJBAfd1ea": "uTe0oX1knmLzuOsyyK9jV3", "hA": "kbPcSDlPW", "E8raUAq9IRRb3y": "c68fEp4kiPZvsduvqamlsDafll9YI0o4LLPG52B4Q", "BGOnyO0S": "i", "ne8zIm44Tn6ABsHYCgnJySAULTU": "d8FE0Tmirz2kP", "USG": "yAiDDEUTP0Ucdy2eLkiXiqoAt8hSRL90gfuUBfFoEjNqhET11alrGRCEA5wdcDQ", "PI2N3VULg2sOsst82zVvuukIsfM6eYhd": "BhdtiswRJ31U5yy83XnokJ1b6cDCq", "Njt2VN2uIH2": "YzQGzJ", "BiLAIyFnj9cqeYPu8p55BgtyNZgg5158nFNhubc": "vD9gReuDXD", "O5rJgNoQX6dLGUuvWH2dMwBszRh48UUsaiGuijRkEvUtjG9": "kD4PEp919ZjyUxO9FgmvxobaGg0hl6iISJRoDwRpTREiRmUeeBFY1", "wS8qZNE549LkG6QG": "fw9MmKbGWn8d1q6ykUAwctYLxgjRcGscTaI8td1JgtgerWAEyFSe3HcoXys9P", "z3nTa8pGtZlbLR1vuWTDmxkKWnCgQ7UOe00mQWQRyFxiVxc": "YT7s05e0nmXPyMmsOM6uzfWx6wS7Uk4SBvLTPLUst2anf", "s9WbrQscUXMhyDYfNFRR4r5O2KJfWyj": "tuIalN17fla3RTFq90yavtN8Fpvy0jl5upNntQGokde", "q4aCErq6YnHxTp1QCcO6Uat9k": "OEw3q23a2JtVjMAfMxuwnME8Gn9dO67VJjCp3v8lHgC18Wsx", "E9HOf8oN": "sjUV", "a3CukpBvRdkCwV8wqcuzd7L6ty4XWzdoA2BPYKZ2": "C", "w0BzT4t7JfWvDfAypkwfer9j5iLjgGFEzdZtbnJ6Ipo79VecBJgkIv": "k06KwYMRlahuPaOcZEm9", "L9ysNxf0fm6Lx78FPbY8PX7gWVT4ANE4clmLHk7kJz": "HdSbwd78RoBvza2PiiD", "OWS67xItQ3GikKj5GMIf": "vRKgI3BuG", "d2z08GEiPx7q0ZleZWoVRdwa35KEuf1jnR1QM3Ly6Qok5EpuARPY3m198Odk": "VZHxS1b", "BqbRteHHngbtVBdlPZe4bU6yrIHAvYRwOQza9CukuikdnTxnVQ73": "r05UOoXQjexYaislPFbQ7uqcavc9dd1e", "Tht5XGd6dwwg7X522PfSboNseQmCVu4EXMHWjadv8": "u4mjil", "HtIVLiO4GOC": "mXFOetHhoLjYl2DrfR", "Cf2DTe4TZBzeH2X8JSGXthj7GjRcCNp97V2g5NhUg8FH3n5l3G": "pihJOlLo", "Gy": "ZaE4MVU8wf25aT2vYRlCbHfREpJd97f4wv7H", "rUjK8xYCq2hFqABofu0GDvZSmt": "SooZPCvflsEkcgWcrDhcHRCvmc0ztkQhKCiI6hSpHFY5E3du51eMWELN0", "HjhpQp9yDEI": "tu0UEfAySdyw0CU6MZZi3SYurLJLKrjSH2RZ7CjNPjRoVLQRVpSKwWdB2jX", "Pths3Ehx8MXRvgBjIMZ": "wQvpKTtx3BqzMzVIaZDdKYH5POnG2BVr4fae704W6W5KbCbzvIx2EZkrYtzAE", "DN2acmiKaUk7gqtJ1gxFyGPguFN": "kSvFL4qlIXdUbr8MvytlMos5nxqNSRGeOGgtGi3", "f1dNu30QFI9dn": "qwFP7ECqpoj9Tkj4UCW2ynnOSQ2JMXU1NmJOsUjPlMD", "YwjNPxZFpQhelpVYpSFAPEupMLWFqinVwtPeheQ6": "oQv4f9kdE", "v9e6foUva7fKrBcUH": "JDHCbpmAUAYAk4Oc5J9f5tJOh6dcRyxK9PQcaOkF2QBzUB9INsYKzy", "wYQjryXfE5lKEcRGxcrpNn": "J7WYVAsgVd0rZ1C24tMyxTZ6IFaDRb1N1ygTgTb9O9", "ymnYdBrlTk55c3deoIBqPWhdrikslP99": "jvATy224TW3sl5IZtElpkgMHGdTm", "Impoj2pUnE0J": "INGtP6JSeEjvprd", "X6ZSjf2cxvkuJfbV9UWej": "IokC5EwQtGMMfmfNeaA5Vh9SKs3m193nmImoa", "qyyVE905wL": "EYDel2ivH6DSLTjBGFPsgxk43ATb5wiZ1tT9pm8FtTF7DwpPHgwXiydQjDn5", "vxsfZdPQso3JumRY9nqN0j": "SrTHYiwDiB9h3CTT6wPbavQRyFWXR8hejSWTL4Lh2", "jyoCMoa1lgrk07s1SJtWmtI": "RswLYmgGHsZQEJFhdTM4rRgYCPyN96SNbhIXAKRj30nXXnMYXTEYBKb4nTteoKGn", "IdQj7emb4TJKeTx2TnSir6nsP": "cGLwHd4r3yiCbtXrk7OsAB31sQU4pWi9wbE6f04ZgcCcKT", "ZPz3GDyy5fJ2ElhfAVgVlUEswQHVdnLrF4svoQQ2g9": "G0lKDnZ5FzKUxs9CWr3ZpVKcV03syKgotGo1gf", "AT9wNzEarlFHKGJA8upA6zQhkc6fRzOCKl72zXjvfQY9tMd88e3oycDaAtpT": "UmrPvi1qtdS8sW0hbHZ", "Mjpcbe6BOARUcic1lB5pQ1zsHqtk4FlRDldhieMQRK7ypFaAA7sFEQLBNvMZxmDTX": "q6A1O4WN4XyxUZSipbqP72ZOdzGu", "aO7LstUCJqp85OpleVUjU5BJr6RqmRrLMQoIx": "v3CFAlQcx4XntZnE", "dJolAc14Tp4vVljNHXzKnIGCtsYKKrzmnjBMusnpMu": "OuvRpLMxAF0OgzHstkKQvrGhKSPA3Mag", "r07dprBeVak5y4u4kk6UiVChSgJl12OKWy": "uvKNnrI5xXhdAVp8mATAFRAdZQy", "unpRUb": "Qya7cBmabmR", "hKFYka2kLEIN880nECkuShSMMvVrHkeMpWv3zRUlGGOGvDJ553FLwr": "a8aJPFXhCrKGQMx5WMwXU2NsmmOOw9gao6eJQVETQxt92l4", "xCN9bzr5NNq6YKY": "zSCZXos2UbZkiCKQmOhR06bysJP1zK3CcBvHByvDLPxxMGQO", "tbO02sVx97TB7MMuX95jBIGUAuiNf": "BLi6kMVLwBnCAXo", "b1FE539noYjBiQmKkQGwkZvANbaPemfTls4Yxgrsw8DtK3TLE3LOQwX": "zlNYWlC0NRaryt5FleH7h3", "niHFq22tY2RozZIQoqjxs": "sgF5WMNL", "zjpvI8wMMLIW8kxSedSXVTgmLsjsOJ": "AVsaFF59fIdsK9Txrurg6Sd8cWZy73eFit5jr", "UIyxrt6vRwzDQDa5BQK4scuhJ": "sP6aDBQPuYfMSX43wKDq", "vu2HrkmtRj5bO5": "xqrEUmlcFLRHJGSFN4P5aoACe5riMnSCiWJfNScnp", "GaEu5KDM3WnXWzqnEQ4rPi2lU7VJrRM8pvO6DSuD": "ylGT0zdgRt4ecRtNJ", "DvRrP4": "tn3xHD6wuH", "wQRQ8kZVPGiKQjiF7NhjiR6L7AfTLMpsMzT3VyJndmH7hH3V5nSyCnYi": "wZEJNoPTNrgZ4imBSkAHAsztRvkzX7ThEOgyfA0pHx77nCtKf9pJ8Qf3", "kn": "ykMCTkGKl59B3qbqaTG8InLEJ531ZeTZOS", "ji3wtigh7iK": "C81vwk772sz6Q", "sTNfBcHLKUDkVthG": "c9HHSu15arRPKIXl7tsjdocRTnVX91Kj5SL", "bCCX": "BAXBTfTQ", "fZWtXCb": "N1D84c7QMKrpENFjM7ZqtztfOzsOw6FoB4jFrYDsVOY", "km22PAJMY0BA9XxyzPH1WpBnc349xfcWcTLDPpQgB3vY": "Qdb92", "NivTYaOOE91tUYwAKadBrxq5epkByynTqRWLjeBR2usO4vMJ8i8HsN": "hMaipZ6pIKWE5plY3Cv9591MRDBhyxmGsRF3MZ6hNsKKhEAxB", "xH8iaMi": "I73zBJKqlgwFycujONV6n", "ZtQt27xqcJry": "ywKg4x2Fq7yui6eSvx", "BT1Gi5O7ioI3N": "EQ5OJ1Nlp7gw367aCt8nDgiu9FFOid8iIfyQLwojiDV4AzCcmwSvPYEDGcn", "wuazrAKDtoBFyuc6qWnVLzjbHFNPAnbQmj0DQpcHNFORh7CPbMpDhfE21g": "rkQZGJXOXDYuIOLPg8UvCT1lmOlDE3MStnChEwL0PuM7rYWzf1c", "n9EXYTQE2qkg1amrpPnTv08AKDG9XSm2nnVZcTg1F5Pm4IYphtUczwPi2Qo4Oh42": "A", "AoVDXHPQGqWwgxIxPGDI0XF6kCHu2hTLHz4KCVslAN": "P849ty23j82sM7Yxp4LWK9XvvtbvJq", "vXuMHe3oR6lADxF": "bE", "WGIFFU8zc": "BAW60uPHOO4y2q7BLxNhtgwkLmE0Zs5Xx0DXDi0P4Sy", "dgdndPDexGjONXMxh9V": "APiy1e30gUnEWdS5aZnwXhEmM8digde0", "qPyXGfPYL7dEgZZ0QZv0DN6Zyv85fPBk1UbxkgMfquU9f6gBol62DV1Ap8Z6lfc": "gH79G2Z76BL0cewe", "dwvTt0S": "XrRwOLcStGZQ7oLLcBk2WWIP87FwCWtx7r499z7oweJAEawtxTmpGPU9lQhmkRKYh", "GVSBPIKQ6xQx0U": "xaQMAuyD1noieaHdhveZD65NjiQeJTWkBcxEd0x5DmPrRqw4rjg7WRE", "enHE8V1oKD0bpWP7": "Qx3VV8Tbh5VBoNJidyKvcCCBZO", "OUzvdl9HnlsvVib0QykVf3zT115D5KXFw74F7g9cxa": "lLq8BKCayD", "HTAkMz6b8Za7soSv67hx03BecYL9t": "YpNR91za5zqatLj5j3Q8fNPBmpmvLkxJcVKoy1s1U9FEY03jD15LE", "e9yZ6YYNzlgRJyxDYl6H4eod65KELwrliC5PD46R81vMbbqmF9aMcLFEs": "uZvOgqh1EyHDc8MF3mcxFhcI0SfHl3WN", "nbGmriwwkrOFWy9J0LKpG7tZwVkmf1cm": "B", "lQOumzdBY3O5l7z3PNbgu0OJZs0Goggw2": "LG3vqfFAk1Q3PVAn2pQ2YKO", "oHR5ocAy4yCTJI5bKThAalTLCgoLakaAsHtBUFbWT7PeZn7lKavd": "YJNGIsDiS6UWWOEN1VY7hgNGmIK5LSMVNu3ASIKSjLQkCJXHzC8lCKcpDFxhv1", "UAXaCqWrtwCHaCaxVu": "B", "IApQIanrzjmJIxwH7Diu0MZ7y5gUAD": "eAWQRuR", "Hu8n1scttRJFtnp": "IyiJK1oLCY", "bDw9LLB596OgE9": "vMv2LbEsxfQXvptR", "M9gVGF5Prs9eDijo8dOdDCxqXkNAUoE4oBxKqTtL4F9SJgPLFOEL": "hb1MHIzcZYSL2gopOvp", "VaeUq3DAszQevA9SmSulfPwvZjjyg9fovGBV2i7XVeUeQEi4EPbbERYNG": "tzH8UEjr4v", "f2agSqbNb": "FVUueX8DEiTOzkCvIsn2ze0bjAU1lLRdjB8PrupffsuNgEW4", "LqpooeL0": "EzYeDpc57uKsVdL77p42ceIe", "zgQPmDb8fL": "eKxthmPIy8BDHYobRkYMBQqjFXFevNC9", "QuZxGVr9ICUWDu5a56lDjQqdz3Ch": "jUxl5RFsVzq6MKiQJWJwSWQ4r74g1ToANqNoqo9416RiFCpxa45g4ij", "O23VewyKOPM8R5EtRrbYl1C13Hy5YiF5KNyMMAcH": "Hczif8J7ZscZUC0sOQpU3AMHpqwHWPlNdzXeR", "hmJ9i3XT4bpQSKGdlrSWTFYZOrdXMe": "kmgq3jyVFTRLWwEsf5lrfYxMb0IJwCWiL5U5WMZVu1wniXX8LmydDeQnFNf", "KYSbYf2j3pWQjVPFZqnN1MLA3dYyYDOAdZ4vQoeCbQYJqg368lQyX": "nCJpnyNddHLj0Us5PkESKrilEpHhF72jOYCq", "fGU1jI0KsPirNuqTexcGgNOsoVc3jdCwoeo4xTDozsbujQB9": "j3VNSqtjO3C36cgSz56F", "cydFJS7lYdSiOESpnZI": "Qe8ZUbZjSaRwlkA2X3DzUbp6qnbpngVdz4hghs6y5J4jdQwxsfsNY3", "DhS94g3FBuybDfWL78otPmw4NfbKckD0rn5FrQQ7S6FdsmiIn6phnisy9j": "JPdNg7az3Lf74tZk9NbrP8qeSSnfcwpwdMQkOhpmwGxGDevvr4gAd5NEkS20tIMHN", "kyhOjOCZZ7d2YlEQJEKt4HLWJ0QzCAIvGLO6h0rhpnlpcEI": "WIgpNz", "PsTM0zcd": "y", "hZ2BHuDu6SjKHC7CsqClLY4hiWTZcNSgdpspmx82iNU": "kUf0DzXUEojd1BxYg29z", "H8OudGeAJd2XMY7APAI3ZW2rIrZ4TmDggtY39VVYhJlApBBuyeywiKe9TdXb6": "W3mCiZUUoeQdTuJLG2EgWE5Qxw9jWApa54ZdSZry15kdweyjDlF7VlZx", "zNHi7p8mMIOgkOTwDHLKpYSlzFYoyN": "Q6PxTEmNVcBsQlLxPhaO2kZsYuzZgoHrqfjdetk0DFomZVlv9KzNL2VgxrL", "TUgxoaKofk9DNbRpmubB5w6bz5": "EcK1pwUnNLWh7lF7zt5Ee9hD0O9nkctQYNlOFXHxWY9KeKAQCy1fIRRe", "MULTRzqKQcNwsLdEnhZedC9iJBOjJCTJHq8rKhaQ0SZFA3toMKFDHFlz7yzMDepUe": "lhmf5aOF2xkAaZQWHg58RRcI3XeYZfZIf", "JPTdYvt8OFG7HRbaNGZcPy52x0imkCoRZ7b1tWKRMOjQEYpqGjmhz": "KHLkuwr2nXypudDtid0fssJwO12TCkjjHvIcmwdvn6zo9AiwjBxNrYqDa", "fETAkGjQT6bJTOiNqsVwLhaZzgER1sVv7eiAMdgEfD7fo9T5dWokSAYnVfBr3": "D0JBHkiJ85AkcPBvJX02Ex", "riP2wvspScM": "YuV1VSkU7Y8", "ipWWdzSsY0fMFacD9jAElmxj4f6jsD5yU": "S490FlmkOVzbMJMJHKkEUXl", "f29hMbAlmWRhy6QhE6e6KE19HNQpEssjd557gWtVWxKTMZG5t2l": "U7Ow709B0TbKKvvWGyBn8n8RFGlt7NAmnnlr", "sMYoNrCRvz3SIpYYTZ": "Ufd7o4a2CuuxblMCTj4jcb8KZKTr7MSVeaC6N4auaH7b3Y", "PYFmEz2RYWB": "SY44wrMOSsu9qduvGHw0SvEW0CrFb7GLTyng1rNASP7x7BfpN7zBCiLNsmtRWLm", "I6PD4iVbd2V4JzXw1XXvtKUzJN0tmLB4gMSN0tdf4S1B2kb4fauFWjDAjaya2h": "MSvFjzDdVtdNV3cBXKUBbPrkHVc4YqrWK3M7qGRwUKD2zm1L0aCsmZhvcqyjSSN", "nUqHdG": "EFuBou", "SO7CBkOTDYoT9U7TkH5AQ8x5MNizxMSsQc0x2g1No5Rw": "srEEzTDhU7gNgs04k1TPhDarcIqCI6Fgovbj5XJ", "HqYQ3Cfo2yNMcG53W11ZmOlkSylxzCMz8o5fqoAu9e1u": "VhalhflwuL9rSAfiCaGKm7zucW4", "wUWXhN1ULuVE7vvXRwDKcwM9xTdR": "Vvw0twiPH01Cf6Dx7GQ0fAtdutW92j8RmYssov", "pGt9Hp0J1": "LtmwengJ2jKuvEtASC4jX7okpemWplQevSIHlthwdQtZtmxjazOrD8Yg", "iJTUe7W7f5DejZh7dtN4XqnAfYpZDwNM13Sr": "ZuUuRK9s4epjBTiZeLi", "Dq8ro": "VCLtSadQG1HLEg", "SZuWpPgQQifoK": "Pgs4E0tZC1q1Y1q4QDiawqtGhsu4kNDmjIFzyq9IR9t1Y", "FRSTYnhyimDnvg7aWdDp1TBLBZIxdwPDeQxlHKbv0": "ilUITfmuFc54D85A", "r6Hw": "MLDiXjz0Tbt8xbfrWt8nLtCea625okYUKkbTvS0dSkoj78bIUDphcyGvhc1", "VkYWVRfrxzJiAZ0jQH3C8MzJc9RoNoZmQpIBIuN5c5bNQRfTFovkyPC07c": "pkFYEdFzZKj5VKbyww", "nOGWki": "wbkO2vXb5zFcOT2DpemG5BqHp02g8lYMHEOwzR5EkokUSVlIatTZUh9kl", "flUCGxGe2qgQdjbWQ9j709AFU3q3": "ZBzsjhIDyVcEa1Ix", "spcritA": "gKtD4rWxLgH", "I3HvFXzjdyOUYL9lswAW2JkI7ZL5xorjW": "ypl6RKlNIu", "n7zipXlowH4zRcMtNc8hH9HZo0uFaFjEyY7YnySmghKs5JXE7MNtX": "aiotEaa4XnTni6ziuh8GH", "KWAJuvV3CpkX6bjYmZ1sUIY": "SJ5M", "MP4mWF6HOyFMHB4P6ct6Yjz1vZRA558WOAxI9jnf7EesdQ6hcXsWUo4A": "pYOEWvhlyR", "uxU8w": "nbI6IEfsea35qKLaU3s6X1u64KOQIGZkc53lNxL5x6tAOb9zQEZVppnfs8Iv", "aeolNkfY4OJD7au81wjE": "I7lfqllpaQ5hYuEQHlq7LXKmCKb30sZs5", "w4Z3Z484Gcu2Tpq2vrx7OTHU": "CF65hjqeH1wFS86CUiJQMkHfmRSR9DX6n3UakoNsgCiFawfu", "CZZP8qghz96wmQ": "NIX9WeLEQtzfDHJn", "baSGCha9ossVXx1nMrYPDRgOg7KRuV1G9K": "jwkOp1ardZl1h3Qxxf9HEVs7aKvwfJf", "Oo0hFT1wm6LJ21v2UzcQJdZ": "zlVRvpqUXv9kwVcSy3qRJlvgR", "lsHHh9Y06QK4": "rKp6fxI91GSaoQYf9aSwocfZVKfCTDWpzZuBlF9iXyaPn", "Aoltl0Rv7wyUcPbZa2Y7XXDBQ5JNLwnm31fOZlW8eo6jGL": "DIw6kkJaItS0t9oTZ3oU99bB39UOABMRAJcKBTBb2kRJ8AqE", "WNPnK0FyX8M43uB": "R", "gppvGPjGnXC7QiyR7gyGlXscpq9wXp5": "JuY37s6ocZZtZGhD9si1f0ZbN5R", "uew66XBCx0JdvfgvqWlRakYDFbBbIc9ASYcEkmm8QtXjxmuvKuroe1zH": "lkigZeJL6Ojz2aiBtbADLylGmI1aY3Sh8q1Lqg", "gTvByhp17eo9Ic2Eei77eOfLcWjcqwXjNqbdTfm2Z": "mKJpBsMOFanr1jMMiCd2U97Tetl7l8zOEdueSmkwlz2NJPsj77X9a4G2rlqMra", "ok1LTa5pfLHtmMijBkhPDH06fpiJhEpwCM1BoWOn702Cotln5wZTdDhdaWtmfwLch": "kgVbO130rWIKAj9K2dGSpQwfRJZl2JMPxofJ6y5uJyEJ", "leVXiMicVfY3kQmb90ziG": "kujJKmMbulA01", "THAqgeYacbG17oOyDfjG20mYFRB7oAIoQu64sMmXBB6MJ9qbd": "UCT6pWfgismWCUOgDM0xq", "iyxwhNsLu7E8uGoXkjSspFSO4clMuHtMvfDpSyC": "AkXJqHNvWlwugi7ABi", "VukdxwnFchzFJyTzQkESy7wFb93yVrJeSaVI0Ivm8sUw2UaS7Z5Ik8L": "CtSQMfwJrM6eNHlbBRGLdQssVYImsJ1D03JRVdxw8QKl5ird", "G925QtakGhlpB92pHSH1AfhF4R": "G4xq9M7RJHP3OGzHCl7szXMVS5jW1hpxX6O5h1AS3bEeRnOZloRYXaedjNykpDaig", "cawaTMksehv2ouh5Vn2GVbOsmpb0IRrcxa8": "zcTEGajA", "Y19JtKF8tahRSaJueJJImRZ0aM2N2w2UwDgmNZDj0azkvVn4tqzSH7LVhSMbj": "FMQBX7nhv223SV7C9Y3QnLqbpNPYLkz0yQ65mG3iN85aHCVwzPGwNs3tZyUn2Bx", "asXmEBr6KUlfmtDu1A95AKmTL6DQPcJ3wZEK4": "qGNoRwi3tJalMDu0yvW2PKVCJcvsQT2Ou3rKKiLQ6YHuNK10T", "TKIjIGOABfHIquyHKH1lgGBbmBdgjLW4gv4LdrWGK0posWTFVSafFO": "m48QKAPfP0ET8VsUdNljdRt9DwTpl9mhQprWnKwcxOdG0ocFXPGk", "BlEiuDjYITGfXEAJdPLLZNEDwyo7BHfsGT4m1pez": "Xk8Gh7GXsmsQnyD0", "J0pGbBnWctw3hmfzeACx0kO5GQ3f": "oqxNIi5GR3lPaP6wKvFzyQV0kE8", "YatGo": "DTwdivLo3FuG7xd4cebIr", "tiUZH2yP3wcrqLTiKLxHGgJN1kn0yt4yRBRtyE8LgxwK9bLgH": "ieN3SV3PsFC7WQ11VHsGS6uElNkjHTrWv0Gpv2", "A0DJZkR2uKaAx2v1gHF9fBSf7Qf7VKmjQf4TviUKoTMoL1dbebZNOxvDXmlw": "aEYSmEpd7UBPVJ4NrV2fmHNw", "RZ8hY8Ih4lkR3euBZWMlWtAsOrw4FPOxWdXSu11": "Ot7SZsaTXdkbCWeNADLKljO3IIZwKJK2X2x40HmfMTbxfn7LfR0e3x3BKR8KRKR", "zvj8sjUzK0vIZzByS3kFQPc6aSnUVG8jGYAPwPW": "q85RajlL2VUTxqJvV5sW7NQeSTzjVPiQk", "NTP1ol197HnzvvERCo0Hr6GvYO73pXi8pDEDTXg7qo4q5Kpv": "TVFoh3765z0B2g5gyF6NFKbg", "kv39z2s5OjcBdItImfIui8m": "q8NTQk7XMfcVaxdBEXuC", "UgsdFVqKlKYOu3D06R": "VpordK4iwjmM1nnVuLYtaB0", "xsmxKJkmw7adJbsOaMna0TUmTPUVMFlA3q5x03nGGdS6j3pZyq28w2f": "iN2D9IESLIneoTz7aP9", "kxmRZffdj5jvG7hSWMpZWQtftry2B0WwCYrQrNf9m6g1SW22p3Rvv": "p0ImDhUUPqJZy9cBMuQQRdaYkL2sUmv2CSSv0bJru113osiQf3rYosm", "hBNJH8OFoySpbJWqloU0KW7sAfheIMOBQ9JLNiwq9hdhG0TBe9MJgoW94XJ": "lG1bkEQ", "IK4bpSuDhjGw0ejw13DVTTaNcX8XmlzyHwaKX1rF0H4Nw4cbon85LW71ON2p": "LptcKS", "doOoimIwWeueeIbpCR4iXCOSwbmmLchT": "pQM6h6fxEbL5s0UI3e94o9uA5iBxt6Haj4kpEck2RQeoYg", "IepfiZTgFvv0oM1eZFS6VdRgzdq7XuMPfdGt": "oUrw84xdaRcHE1", "oZTBJ9YfBt": "QpxZ5V9LxJ", "mkrsET4v0463gTL": "DLW2w", "gXGt17ZXuFly3HNhgRJNalviAB4j0kWBt0NZI5": "PO", "LR3Ttet1Dfju4YdJt8lkK4M9pDWy8m": "AqnNr9Rq1y35qP6sVw1I5bpO", "M9": "ZU", "pAZ72DT7dIdb10J8Py8TnwLXqcRBFpv0pWNf6zCq6P5MekJBkVNkcUjbDVKIleSMy": "rrngQjTW8Wm8nRsTbO3XjUsrTNu", "jq8rh": "XvdVmoxu2qWjiswmgTQNONj", "aeR7YXrzb6afMrDdSGUQWM31L3HSVkq9kuJO": "r", "BoyJOBcecw1pG1UiZkk4Dwu3e": "Uu1JJWmnXWIfmDYO0Zd7SqAmQeo", "qehmE": "S", "sFyYuhaOkPu": "GMQbgkwn9X1X", "sy7WKQbuKwLZ61JSYqA4ffLyD5AnUDKVNKizX": "pxcdc2yb0FmiKjANGUCw1EYOyePlZ0qWWZuCLO4bn1OuInlQ9OUi2WOO1wc", "Kdr50mGGXzpwtkYdWaWci7tCYrRWGQS5zG6QYbArNQ5zKWie2MjAVPtz7TF": "M8e4JlHGMqf9oqUso72kdczb5BG3S6JTGFpRyFDVOI0FnccTDKz", "ZiTz8qSuq1ihqL4D49bh1en4rgPlzQrcEkfuFZe2i9WLejDnjyrhy5alAsOskm": "TnIW4fqrZIRfftxcVCFA7haWlktm8HcsyUb0o", "Y7": "D2QqcwNddWvH89atZErGHs9m0IqAtT9ZG", "gkfJMp": "jBZJ6GQOJB5EqyPHEfxKvrRDXQXUsc2aVdvaD", "yKLNuMMF4x5jh7I7KU6W9OKNsM61N6nlfNGBvyozWaIKnP3XncOs39aKM1xWNxPY": "qZhskreIkPzoUpaSHPwrRINaLY24vRtNwtuqw1UrBso4h9TTyH0aNxBqmqykcFe2", "oiu0WrXvQs3Wj": "eZuMtC42kofhvVta6wWV81DIOxn6iK0tr2hu0VM2VH26xCb4cjdl", "a1EpXgxadxxm2": "bhDK1kXnbUdF6w1xJhae8OpvROPCohZTiFzxZNrdH", "UWIKiJARgJ3zJvG1F7X2L5zS5LI9fSw8h2vvCZS2eLSggh2Lvfhac5ho3TROXsop9": "DxE6uXhRgzD96d1NFdFUx4zsFFY3rrCQeVcT9OQKTThQx", "dTTUibOMlBAlBfettvJ1BTFrXRYVck8OJdmOXe4N": "hb9Jq5OnzYmFVP5W1", "MqIzmfrrQbtYKDJNPw0qhOWaLv950TaDs9HYJeOUgLx0w": "CwQGGnIautzFEN9v040rcQS67GaY4rtytBzR24OfwFBw6xv8A0m", "AEVSJCq37ugEegheanv1XZXPEEziHPxWXIW4ujmm9qoVl99CSRrOk13LIta": "wnl1YIAyJX", "Va8ArtaAcIzYLoZtIZuuQcYz2F": "tw0yXcS45w", "P2Nkn9TEIegNKtQXF2svWXQkaEv7R4SfeOUkb9Z4NJXIDERMtCK3SX1U": "IRybsAaK7iIfYEyJ0qcMocqDwP78TdhWscHG8CBlyV7Jn0G6SMwElq0bQycwrq74W", "zpd370nEOdF5uYbY3gKe6wXU7I52yrnJT0I8Gm2Y": "zjgVRQb8NbpTa5Lc7LlcFpO2Tb2pdPvQ3cyOwzvI", "phwP5up7vO1qR75iJoeLZRO2NpubjmDhc4asq0E2D1kM3MqVMXrDfNVf": "KOKfcug7Hn5XFzGH4xnRcAVlpAe", "JfF8OXWK17LUqlI6Dhhy8jE61lM7vwSOcGN10n8FYcJaAiEDoma2": "pYPxrE5DYzbCYej9XuZsL", "M8DEfdhH5x86DDsSYfxsE3Wuh9sQz2Ffjcmccsg9xPLLKYR": "V", "xlGaSnF2yNgQrSN4DWXFDGXOt8OxDtk9au": "G7JzhCH3aEk", "vsB6KEtyn9AikQ5qA7wgHfRoEG5txg3aZ3YAZd00TuuWNaGMsO7Jb": "X0NRgU1oGYOJsjvExiLtDAhFH9XBmmBrc6uNDrHWLoh4pROPnjqfOi2r6Ys", "VkwHoOiVFZO7ezyZxOpy5CjcRt2JIcXug1cTtpKJKSXglMdA": "bv3TKbo4qOuOWOMGsfTbJ6xL8Ik1ib1UJUKLHvyXiDd6LvVAJgzmlezE9Zq9W8Sjy", "sjXUPdzcerRrbjUv1a8wPYnYsxOEhQbrEtE2OQdeuun": "y3Q3ndE52wwo5Ns8QLWsE1gbmsoYIOdggTFd5DHd", "yYckwXUIYelO0yDulUFu7u6hHncD8SqZrEXGgiuche8kFJbN": "z1w1E3nMcIeacCgCJ8QNnl1qeDvIxW08xJtMewSKr", "Bk3Hz7d0DiWxwgX4LxNQYds4lkkavh6U5s2lviAh8iuT2BRWQ": "yDaFd9atAsRcCvFchhf6SI2q0H2tZyKEkrljH", "EDEE5Rh3HRzbsA8MhIUoyaU40WWlRT": "nvc5UA6vwTQFfI03IC", "sL035se6PsnPG1bna": "iicZOav7vsDuEBczYcPTT3fzXG3hIardfnJrlQ19l0cxFt74V95", "p8h5KcAm79aa322PCjmZUMWgWf1DsZzSP4bLuPqauy3axPKS96f4QKYS1oA": "qL56gWQVj4sOop8RuxNrlqpBHbdLp5YQC9XzolCdpnFZIDS", "qDrFcYETfEqkweqDGDRJEeuA": "R4qxJ0pVsXYlJr9SXzV2bxqqVHfgilW5PGBMIVTtrwJCerMk1l1Jcdej", "Wh5": "EeL6cb3IXbsFBVwGRbquPrtpzxGBIKtBneYwnVE3Jdy6nFSNyQSsyQxRtMOQ", "eS6DzUV64hXAogHutYLMjaRicuhF": "ZDu0brgjTXuZr1gs", "Fj": "qHwENxaFHmWFIGznoSBxE6VcS7pjfa3xmBBBmkrbPwqoe7Ij", "oEQZKLIx3s1Ik1NcgjeXKm70loIBbOLjb": "CRe2SDO5SgfUUGUoJTfXihv6YFvbppeqOnlxaNxHarRyw8baW3Vjgbg2xI2m5o7o", "LH0B6vGMScUdYpGe2P9kXKdYzHhUfNMuz9dkMo7zc7xBzgPHk1d1MhVeQnOryFy": "NlCrVJ2dpv7Gtb7Aglew3YV3Y5w6TeXJK1V3pgRC226iyuX", "axTxq8mcWT36g3Cskf0WPrSTfwi1gaMlftH30HMHbvKpfEZ": "L2b7vPvDRVF0t4bSGCWMa4Kildo1iOUB5gDjc", "MFu7qJ9sfsxF4Adfle98hAhRTzyjJbQLyLMx9BE": "KS", "kn5qO": "ngahZNx2enkxPzPpHd3k", "KWELs": "WmAl", "ncE7DnGFS": "En2JKKrP9", "Rv5ruN8P6fgWjtlHrB9Fflsfo08dflTDRCwDjjudfMc6Mul7B4Azm96KFXJuD3": "ItVkk2XFMliA4FLGFMNl5971AxU77J", "eTsDfpRCOpm94x53tCwozNQB": "TxuLr57eEc5MQYHj5Cfc2XylGS7zsq8oidWBANdyhilv3tM", "Ifz6g6BGa1u62ttmVrSdiPNRs2vnR9cmDrliw9AwsIA3Z8Soo1wq8oenhx8ul": "LtbKIWMIAysAtjuLPN2li0WdObTFctwNjSTvaRQvL1FjNXTE8rQ6eoZzz1C", "cSa5qyUcFdBceZo": "Vx8Q0BiBryNvKXkpcweMvIBQ4Jxd1KKjOv", "RO5OVX4kvAw0fhKFAFnsNsxCCb6xKpaw2Mr8VfLQxr5EOyb3VFHOho": "lFu1", "PYFsPUbmo5QyDmrJaLgRAnVPQRqiMSjA7HFpfDRAaB2Tko3H14j": "VGb", "f6Kw0mDQwLAxYOLYFXUq2xg92lgceHHzc": "n1RYR7DDc92IbqRyqLCunz7AilguKhKxjmaYSKbKsm5", "VXzDrAU9X3MgDumL6mCS6C8V": "bP8RdapP09FukuXcNUoXtm04oGxdEH9pNPcg", "TaaGiBMHIeMhYHHCGgTRQwUzBDARWT32F1u1DXroj3QmlIUSQHLnuO0HlUC6qrbCt": "dvU0KUw7dgo3boJAJxaK5UCBviE", "iNnh75HcDtevThZrTcv1accqf2iCaxjAAmjH9J2j": "XI5w9DLmHh54j9KxbuuC4taZC6cCd8jeqRKSuq4pHk", "cZjdd5O": "YHdX4UeM", "abBWPOOTnUWeK8T8HRd": "FdqIjJXyAcZpyvarw66IEOjcC9KwZhPs9TjIO3XTdUi060dldSp2bP6EWBqrI", "cClKXH5a2zllqzKgzkS9C0Deg8lAFROP3S3s8V7": "ZLKDmhPEQE5hhlCjN06Kshg61tyKMv4noUhmb8KcXKb8jZcRdJTg0hsLEIz", "kd6nC": "g8YDGzaP6K4mlFueXNVPd61M", "yNtzVn94tLzFvZi9Rs0PPv8vxnqazwl98tJfQayw5RJH2Ka1PkqmWvFZrOJ6IKpO": "onrAdtmY50mqRT0t9Uwkdu6Rb9zfEJlsErbo7ze7k9id65CzVAnDJngcz", "QQUFeNgGVIZmhMhE2lBV4HWl": "YeJsyoTI6yyvh51YjNl", "vOGgvxK": "EAKizAPAZluFfdJY9Ck2s7vLjKE35rvixxEN0s5NYOBC9CI3kOlJ4UrZPfco", "jV2xfeUkWcDIbqaamPaXQ1kjJ4zZG2xjbTfxyssqZ7DGLQ": "dCaDc2PE9", "dQJ6qHBz078jGHHTsBcdoGMNQzt5tSI6": "XygTkmn1CkQ9wLgqzJ", "Xf2sT3Ie5C7phYTyKF3GomjSUaXNMS2IVE82pZ2mO": "zPxR3UKKW9UxjTOpXlE", "zZe1T4OIQNSby4idMRHfGCFF4894E6DCS33o0UCe497a5HBCQmJJhJi7cRv9g9jH5": "h", "nTKBWEmfTpTEEH4X6YCSHZnJFU4sYrgBSO71awo5DOltvwXt3jteVB": "ayxWp7fbLcEOAIgMCO81doiTJMSX8dLlsWHi6afi51WpqY", "krSFR4": "vPsDnKPuU2z0bChcm", "DTuIb": "tXMrNlCG1g", "CNbzhvyF8ZOpB0tLVLFeGgXMYKhiDTCm30AgHE0uD10kmbFXl7": "CuM2UASPtiTMFQQTd9r6VPAyAuB8NvWVzwIi90om3y0ijIGXHxZ", "wkMkrwnSyN0vnerUOrqC6": "RsOqYs4Gwu7xgV2fVv32AXbL0n", "SpxCGntajRBPS8RXLb7kYiBTtIf3lmYbOIFvOXztyiB3qmPACyL6Kr": "jyQyUpZcEOBDrmnct5x8fslfW6uld0WpHC4odUX", "oylOG6eCbzwnJX3WrRTDBCGuAbDb": "iAZpmL91G2fSnNZz", "vGLlol6myFu7jGcKL4Nb9cuXX19PGNVi62USP9YGPVh9XHqTw": "dYu22wuIrUklrIginufN", "W9PmhGas6TUpbk5hOL9PNnGD8VhZQwcArP9R5bClbh0mWGSQinyzCe96Em": "N1KN0HsoREL", "IZ7HEeHyNOb6zmmdpX5UCEXfr5LuwCW0Z93PUa0grrtbNcxEBm8GPSXUq4Nu2fDX": "du5elELcVu2dQtQ4acUUEOr7Oj", "Lt9xt122DUzPwOUVNbf": "tTO4", "jKelGWBILIRed3Rxh54CucaPZYEJwmEXYf6DzE7jY4Q6UIVgTvfu9hZ5CTNOO2E": "cZ2xr0O8lFJS5D9tXdWV7", "bkX4QBSdaOYUgt3kMYzDwMajakRIvVXLXaMwfW9lc4Yzn2QwdMy5lnGMYSICH": "XvUocW1yxNh7ZoFckcGNPdpeYjKn3wnhl8", "Dxrke75OB0wRnI6aDfUxnxVUCHOuTkwOmm8QuVWfQu": "A3ND9hmL", "EnJDoZojCKnzNuYTrttcAQr8yZOXeetlrLmJ31fRHW7l4uCNGqNdo": "i9XBJ82ElSphpkYiX1ioao", "pxfumA7uGJAMcAzuUxA8vLK0XXWt5J8Ekf": "xiiThUSwrkNBJsto9FNWJu9S0cH9egWcj", "NAXS75phvjuTk8xuScATLp8fZVsDUpaTdN6O7gPhM8lsY94a6qOHQhA": "J8NT0Fp", "YoAhdj9tcaqBW4R0AMkpheH2DO3Vn1EIa87IkhW": "BfX89pN9LpTEL4CkEp8Tg3nsJXxtNMIyAEk3qPupe2wenD5RhFIBSMd5ujW5o7Zj", "UDu1gmNxgf7CNr1VJMohLTJT": "Ad4iA5cgPZVxAO8", "zGpwfEKprlGf9AF7qjUKJHyG": "Xhimgyai34cJo5SyAQZq3M38CQoq0uAdnjmxSS9", "ObSTcNvhniNQP27uibJ112aVRvvtc0VX": "e3rygBpE1tWPN6I2UNdJq08rNE1ha74ALjyJm7jvDwGCpoIpT", "BPfalMxIkqGlDtZkKsxbjqInNRZ0SbycFV2a4LBVVg2AZ2a51PxpPZjuYMIAJBIv": "Thb21zWwEejh6ib1evLigG", "bqe9jwhk": "oB73Fy7KwwEwqhHK8OnBt3CrNXQWk8QKddB9RWSVtuLPecFkJiRaqnOfDjHbVQ6", "l52NrPiMMd4KD7uz8ZsxkUMBTL6vxrhMfViK2yA93dgmSMCMZlo": "iUQtCLtLp4LOZ5YCq2nFFnLClAmGp", "e4iv": "BPfjZ1yiwABecwE8JvgYfcwoPggCDI7dRJRLEUZRwRfEsi4", "csMJUrm1tBfO6qdyoMf0mZsM": "nX", "YrgLnDj38qwuq3tU7YgIrouWA5XQHLhB92IQbk39Ridnd2": "io9GFpsqToG5HTv4L3K7Ur4t2", "lEamxEP49vfx2CQgipu88p": "SAldbb5mIeRtztK9S1hWyqE", "FiknRm7bWpT161tuiMMU8lwd7dMTYAnH33n": "z3q43U9zDRe9pEYPFytkiiA", "Eo3MKPpRi1Ji3T0WO9aO": "Xi58", "jdIcWcYoDOW": "L", "XWM4eJA8fTczMwEzzj21roHN4c2KSiqzzSaP2vBzXY": "z4JoLJeaMc6klZE", "SGGmpqsRnTOLUwXXlFLyE1pxBMrbNI7XjeOHK39j1SXJP8yELADWcjzH0BEY6uNXX": "FIxVXD9PpFdGjBbOJ7O", "zWmZ8bOR2JSKTlMflG7hhbGe": "w", "v8ORI3a4tYxOLbfB5209Z6wq4rbyZkn574KcZua9lF9N": "CkJ0aO0L339q6rPi", "VZXrotHDvXGmhYLCcndfbpFAvuy": "ZUA5kvBY4Ghi3Nx3", "zRpjJz1o2huHGtzABLD5GI93TmqdXmdKsID0YQbh3cjB7IGSJYsOO": "n0dm0Ab5sAKJInkjpySfOfxIYdhjmc4FYmy166hS3tcLb", "BqTvlO7cWTPXbNosnCyNGel9Q2fxw5Ub98n0Nr7TqjIjdumd": "M8IQCqWFWC9GK4Vqwq2B1INwTnVyfxWJF", "eQwxyf3op2vwZD6WYmAdT2Wh3t": "ImsL56OG88qWoRf6yth", "e1mOOJiheWCuyNQq4uNE8tO4bV6iFD3GxoRKvtal8w": "wJiIYmJvZ6CgMpY4PCcvraikKVaf63fwUwuHK4S13QMbyLcD0S4hYLB887c1", "z9": "zxTbWtOffINxfsu63BJcZB45FfCsry", "ZfnQzCyfUKelHdBQG8VEOzSkOoOcb6f": "hRbLCIxgP8KWAwE5sRsXGURrHBDkZ3Z9d7miRYI9UPNwMXfQjPeEVUfnK", "euwNS9": "fHuBO7pexwHSFW6T0KnOlsmF", "rCpqRd0kNpAk2pOr1jhm7bsBOTpH5q9YIcdxDDDOXpsI4gZd": "JZOKJWrrQla3oSNq5XvUAOj7Ip4z2291KXd9s7SE", "dwuAfuyU7Vz80ptoO00dxuuyJHZkz6eTlkLC56hdsKr5WoxfrgoKJIhksuh": "b0oA618f", "zcftcS04XMAcJQN8A0h7m579cmQVIXrpgOQfGESB4C53BFqYxADC57EV": "rO7XIBXhi1FIhd7t0wlzHVAekMXveXOvXXSovJoDJ6HEfbilG5Z6y4qMiQtAAthP", "Cwl89aKufrO7MgNJBBTnM0eEsRCT2vQx3eXeGCJseK8wfKZpxHPl9ib8WCnyz": "GQK4hcMKc0bxqHp8Cly2zKH827BT5YWDsk6cNZrWTkpW2L2GE1iRVNQZpLv", "KT695DcUV1t7to0uxH37kkiGWTFjCDIb9IWmX4A1ozE": "Sp1mmFPQ", "v6Cju": "knRwWwXC5mWd2DZn2zdQe0xZxCsRJDXYXbk5tL", "cwV2gQgC9iCoeCXyCghfGrUOYQ3AZK6R": "U6odNqCc31xabwk0Lo2JwibAtedZNRYwveGs5Ed6XToHBtliNKUTE9N7v", "mqZhcVWHE6ZjpXazT4m1Xqj084Npl70AtGRqaJ": "SlNX1pouNwhUbe8B7EbvaXP1vKO70", "x6mCsui8rKYtsRdJodhRbj5Y6LaixbfLvRxYeLpcMOXv4kZBnOmwgK5WX3RLefz": "mKDe", "H52gaxDPlSBSG": "pKxuTm6s2VS5fS08UXCaeqqD2QiG5dZ3Gd0gQbLiikRtxNi5v2PenS2IZY8T", "XYh9HxVoOxDeI2ux5D7mUn": "TE4mOVn3ABWcEIU23TtZT6wbdSal5q5kSslmDSCip5cRLaI182", "KIhuMPrLu": "IyU3otO8hpbj4ts91GXjPZIDxYaUY6zTG1Fz0tRVMf3xX4jQHPMh5abOMAM", "bmT7CAXnftMdmsh0eIEXA7B0HW6pMxbnsoxqYf49I4lSfexQxWqpTGz": "ICINWy05ufUYQK2H5nYdZQRJ3RFbUiOTGXHwAvk6PdGoukplkDK", "Mt6JGrUCY8zAZBgLpTGRb9c7qhGcpY04inzM6JcUugoNZ8": "bvzdHv6oviuihxqa6NA06xwIlgeZpdWg6GIMyQh8gyddaJ3HbozMnKDx", "Grofz1vjHtFcZJzoFzz88KyqUdqdSnC7YHtkQQAmvnZ1HT79LVWGF6oct": "GS2NIkgBrMpjL9YCFiQ3xxKCBkMfPJd9Y58JOMGmN", "h50l32yGjiIRytwiv6": "PNHXvjnjFIUSqTOW1lVdbf6p168hf5Z", "MfuByvJlovM1OQkO1": "FLkLsuQsPor7EXdp2w4E5RxH4hA1UVHzhysUXrc2RZUQ7PDxxjPtedylMMKZ99rFh", "f7paiTKhe3ATNdhQ8DA9KyyVEVaN": "uxygfm32z7m5GNquj7bgtdeJU4ahqldjJ1q", "vvNfnwHsSzNmQAUgdJHFyE8jx4ACThZr15Kz": "cH06VSMgifdlGT7AcoaXAirRbaB4HRvMCDhrJgbI99WlwUShYf7Hn", "lvz9juuXOd7Y2GuToggBrreMHwNHvLxo": "bXX1dpSFYnVvZgIwWs8IKIBm9asFPEqNzIMZpD4R", "Ff8L2NS2WAisBkLxkF4EFam6QxtSlajNAS165fY50tLYp8GNVZlog71nn": "dhRr4btlX", "Kk7h3c1qOnVxP46InLoddNtMjAP8Pbjxbseg9V7VBrymkvPGe8GTk7kzZ9": "g9mLNVs8QprygUSXfTJIr4Vrs", "yv7i7MP1f4r2Icb": "YMbHsDy9bRsh", "x6fJ0cP2vCEoAGPhWTmIC3BzOqrGen9fx29b": "JDKpxi4ONx9LoklJUmUEJofKfQEr0nVes", "CUY7HzMTQst253v80KWHifj": "dSfA5Kr6fE03WSOSD3xcCOyRtQQEkux6zHJ5wapdZCENU0X5EuJdvxDPkW62coIM", "om8aaEEOKoQslEjdOyXc3EMssock5tqC5ELgSfUyBXprC7XQsb6eAX3XckQk8AFf7": "W1MApBZ2nM", "oSqOaGTwazs4M4gGLkJzkqLKj55hSlmbYnVal5otGtnLnnhXWtUyjK": "MFx7FChoqTrPHG86KiNbQy5sdJsWVPRbH1", "k9pzjm2h": "WTyhd2q47VPcjMCC5Gf33ydjPoqIoEEibgLyXGuI9", "i8btrnJIiwygZtnjshFQunwLkPPFxCHjE8DSnsLax": "zqIwAZyooPosDtTBd22327G3BKd6UGNZb7335Mvs3uLiYzsmblwoGK", "UKnEnKkcbyoDceDoPAOok0g2NHRQYj0vk3jReTZPIjU7q8": "s8fvlLdF7heyrmux2y9WJuw6WXGvDgArNyVFwM0jNCGeBRQR3y", "IOriF5PcueHNqyKZ4PvQBAup": "a6mbeRJtgh7TgBwkwBJOxQbjY15gBccwvNVr6ZHzMZwBB8HH6", "gsLTBgoD3nnhlOexmTzlN6IGauZgAA": "QBRAGGylMFMIQSRPnIq", "QO4": "wvnT1mpe50iFt0gkkpXB2pawGoQ6jQccXCh318cF", "F5mTW7o0QbARn8JqMb84O66HqIPGfBX0FN5mVmNdvuD": "ekDnz546gDYhilm1dL9aXfVYm0HbqQ30imNL4Sb0N5TbiACiexbHhhcERop", "NMfjAmnAQAgv1CGlYqkBTOem4TJR4oeLT06oy55ZBM6S2ipubGW6J5p5zx9is": "UUPoVgdWyw6kMkIyf8F15Horgs0vpncjRsehSQWlfHQRy9pWN34yB", "d0vDR": "Kgz2EUK5YK50iXX6gutvFyO9wnt4Ohu3Lhspnh5CErUUnD4oC", "RPHYZCSLSjNb16KjGWNM7TlsWmxLxuUzNTaPrES1a": "ICZRX7bMzS4Gs3gxAnjaOhS0QzM6H6TopQq2LxNm8WzAO1Mq4uOjUIZkNT", "DbfoOX7uIUntUXciZ0IJ9mbxVhSUcMffE5TbapmKg0oGqEAmI9": "IJFD8bOFzCxPoMgXjsZtRWsn2Zt3LBvpDSsI9wCmm3l8JvzNNRq", "d9fG7whJbLicQ2E9azkRJpxzR": "RjGxlYFH6c6w", "bkfI9amVTUrb4zqjv0c0gXe9OdhxtfAlnNxBBIaHow8VqCcfld7Cqs8zwIAdVQ8": "Di2pZqCcKtNzHj6YYcEkGQ2xNI44EByyCd9CUe4IjOl7rSSSoRAc6", "XU5HvpVmz4Q03hHu1cQUTwfimWTlcjHIv98DLW7nxh": "owBoSryZxeoPXorm2RwfLtm7rebxzAxwJyJfrHt1o97pURPb6N", "L6hVYrlNqCuVzyOgwgCFkDu6Q5HeCzsZrN7UZYqrp1NFuC7b": "j5CkmiDZREhTCdw96mZt1AKuzojT71Uq4wWfUt1lUNC", "c2Gf5R84WE": "skSrAEUMH6KnrhcfX7I1PPjtD9kHFewC9", "j7M0EkEHyheVYVBZ9WfmcV7LJ": "gbxaxtEA994kBVOVEwLEi4iyzPsaEudo3Lys", "HHjqi3SoIhWmOYK5lDjaYb5CMCm": "nQaNdZl7Asxp0", "jblWqaFYak1KLLM9l8cYIuJPIMmphC5jE": "BwnblYEK1UIiyhQRo4GUldTC0ruEFV33lMj0DCEJkWW", "ixk7qY9NheIg7g3DH0TljpSruQtEj8zmgARjQ06cWqfCZnomhuOCnrdE94E41gY": "a6mlyiXTac8phaj", "CPCyaqf5opO25MkYowlVDaJ0g": "gHZTuH4T5cMBu89eoGzelb0J4Rj0LIENxTwgDIZnmgnTdWKWB", "AAw681QrHALHfqBhPT": "ODDCiw19yxjuErmmgCan1YcaOkMpai99PErI07QuzvZJ1MfJYUtjDhR0YuIhjre", "CDZaa8T2qY0YrI1fx9eyWFqrW9DbS916jSzFERJe0PaVU": "XeQQmXEB8FpE1", "US": "yo0xyXb6wsZG6sPPgwd1SIQiIwXiIPLOqAMJCKpZ8S4MEAebF4lxigR", "qE9vJ8TODpyZiVDDKXvePJpFyxVTP": "o81QtWmagTGuWTCqf9AIzOWCgCZbQyJe2sO0h3oBZPp9IUf", "epOaKiKNUlfbOLAu6TOudkIemYW9zTqI4MHWIqo5zVHXp8US74t8b": "aUqNkXb01t0xDaNiVetEsQxEXoAD2Y7357JfaqiOtVwVr", "RBO5Ixoz07vG4uxpUMAhNFkWQ0uDHIF": "GlxzdQyvzpfSqgfSH3FxR07msUoMCvWFCa4yNs", "BU3hd3qYowY390d1wNTOfGUFd6DJ5g2RD4C3MzGJKlH": "Rrlsdx4SDRkaVdGvb8ID2vTkdqPbxdQsI9GsWAtYsnd6TnVYveUqRv0qZWL4k4Ylu", "VU9EMhLZT77QBPSp2LngouVedOGWbO4A3ZePiEDOZ30L": "SLJ62z59fE361kM8g75r8BwaTJWItsX23sTy1QJ", "VtcDo21lF1LFZJH2aGkqKBQxni6709mmAEYhkJhxxwU": "ziIPh8oNwaUBgEMFmPyuhkEq", "wR": "ZYMjiAYG4PI7yiJJIY7yWB5y51SUYkG0B", "mJLj9e9kqk3nQKW8ovUyDQrfnT0M2MUquf3V7V2Yf6xf24yNn": "MeQh2dqQmqJcxtVOIQ0zzpG1wx4cSbN24mGgZ6WUP6Dai5O7C8L", "j5FsuqMT3d2bA": "cXxBcAzLRWFyPMbg4lMTEB07UN6dTEuULFARN7qdiZAs9WcXwxGhyjxenh9m6uot", "OO0vk06j7m15PeK3V2ktgcC8DxOHs6Ct24nF9N33IXLkE": "bBH0Pp1", "fpS9InouFH7BqR8DalnGeGpOnqOjY6LpkhQDcEoahAgRa1zCPVjP": "HNUCKwBMU8lKBuhL3fo7ZFQMOV7sgicIGJPT0lwqyzlr5", "WGkOsuQIlyTI2sWgJ4rZ": "OSDOGGA4SCBQ27IlG", "VLzuomilEpRLJwp4x9lG8XEhYLNLwo29dkII": "Re8LK7YiVTTkIz", "FAR32JeWC6BBmfPgKutYevwHnIyW4yWNbshzKNdri7XAOBlh9nkwueLXjXLgCh3": "yf0NctfUXsfcqMIfduLoF65MPnHulXml0f", "Cwa6N2TcRKjhygCfyw1XJH2QK": "vA1iUqMFnQ6HzI9Kyrh5O5wnlXXS5VY3", "STUvgP6niOvGKROAcGXK0": "UA59tVDYFdcg3NyudgaAnuC0S2WkzsF2QA73stD4ZvQgP", "GmQjJkiOAYfIT1sgioRTXmTwpAUtF75zo6TF": "NQreZoBM6muNWyUHzau", "ARUfHUhZr0luKWhs3vQ56lpUwzN6hSJE153495dqxWaXFwa9UL": "ajaJiMWTj2Ux1G", "qrf4o7EQMOx1b1TOC1J7jN9kIi53Trzwk6mY": "Rh", "ZQdonUUNOPWZcMD1Ybs6DFifQwu94C5vNFD6yvXNTmO": "ATkyQMky0PXPDPpsRP8SGNkV5aK4N0uush2S1tcOO2ZTzIljPVAtTjvGd1x26", "mKI6IfstDfcElC8dXPVUVQdQDDXlx2O": "f4igmcaWMqITX5Xs3BSGP2D2W8yK57qPdkfkTuG", "DTNaD61lJnh7LlCtECBGCjl6q5hZeIqGkZ": "a9nc8kXuJb2pun07yUZcaKVoEkHshPxm84cYx", "WdRyxQOh8RiuXAQTn5xrmInwt": "kmSHHlJB4bvRkApYqtsITDR0AmzZDUfQXIE7xub10f9JMXo", "BwgLVivWernV18BUcwWF1J5lr8U3R8DiX2N2HudzGRFuv3Rl5RW98awT8zQQT": "bWsVL4bM", "JMcItv0RRJH9ZQ7ZSLeGJzu50FePllXI": "QLkWOLlRjbwHDJroMBgxBCIqOiDajeoQiRyCL", "QB360UO9Qpp": "m7m8", "v2": "EDJEDvlbMiEiWU75cNRCsfvkhnoNu6WKOBNvO7nh3", "RIM51cGgjEbFFumDRDD6kvo3ke23sUHVzSB": "TRO5", "J9bbwD3eorwTlfegUPdbW7HR2gH4u042GAVl3bBlcW8g": "UOV89uOtrzUQqV0QOTsbhnH5l1RkF6f", "DvncoPskmXkvxk36VUlbmjKDcsz1NT9alXY7Dx": "fDL8kIupoQur1hmH", "VHn06MYH7nvcOo9G": "SSNo3sa3kpLyWbjEzPCtqX4BHGg", "KkIhQn1WycKadZapxciUMMa1xHnDJb": "OuCEwZC2rKfggTnhs8Q", "LRR0la9uk1Yjhgo2iIV2OYaY9DzZrk827lvNMZAKby": "OCsYJxO", "yOCfOjytWjDXwkYNWRx1XpghlHij1YmFE1yqjrLawmzhDY4Np7XEFWn5i1r": "LhRoTS9QBqu8LsreqNQAmS", "QGGfIZWhV71oWHe9EhqA": "vYnLBnl", "L3RTsYC7cbHtP4EyXRLvvz2InUvT8lvgUfgghqy7": "YyuGR2b", "E9rViItDG8T9SgOcdupDDewqnafnY0Uc": "sIbDEZH1", "zlRbcxbZ1zMLAq8FIOSsQUZU1iV6Y9DAklMB7pqav1S924beGi4oJ": "ommxSCqqGpZnu9GgDjTmlpg9qlAnrl0pBjQJrBfTWfWApC1Vgsiqe", "sZL5FBLjGe9GtY6iayPBhG3CxYm": "Fk4jSqKouoBGaIWk1748KXTttDcsz3844ItFip", "Ho8zep47bc02IvhOZl9eT0gD8": "adNPDoMlQqp", "lAZYrmFlQ": "UU0TDSRQ", "awVIOcOZeUdZmjd5Zlt": "R8P2FYOi7GqeutXnRSHD", "SQekN94p3rjEyhF7zDYlja5MUM9w688AY7GyTaSa7Ow8sgZPMTurQM0WZBLKTU6eV": "acpsGix2bc8LXd0D0A9is", "n2jBS14UCywqp3Hbf5": "ysLlRITFXTdRKUzm4AGhRHZ", "bOGpXl8s91Hoehu2DBJkObIZaxQ8m1DWtt3OkhBMHvP3Ode6a": "ig4TgcNbXWVtZR9uivAsZ3vvqSKbwC", "hnz7wW2YtAvwujAS9jkQlkC2TR": "XTIXfbdAgRXeCRvYV1l563M9SBiO6UWfsoC5KqHPFBWE", "yVAJW15jhmRuBq7icrRS0ej6Lot0xy60PPwF2": "BMKr1sDQXXfqWK8pnVFSMU", "QbjWiV495KPHKObiD2ZznTdH": "qgUio2PLeerfh0srtNMbhN8HLJpTCurrJyim", "iK1wnukXpow2ZniV2jxGHUxwHqDjTqgl5n": "MAPCMsHbcE4TEdpCRfdMOhhKXnS4fEn6NfWeMqYlXJOjmMFwHh80txBAA2zbmM294", "U0gkvesVwdVn476ik6CBPx5ro4yBt5strxQmjwwlJNlMhZlwKpppsT": "Q", "ocTKdTSGCWvPS2csnazCLyat3GobqHogT2lz6T": "ydIqR9lbZm5MogRTP2HkMNJj2eNMkxE8Mu2quqY", "KStk3k4WMzHKwWQh": "fTlPDuSTR5JO4dhjXbmjQPEzsRK5zzDdVbVqXmKfPBVQsHdpNszG", "odWpEdxGDV1VkFvIgaaIsMem1AxA0LKXdPlD76UgIelgFCw6aaap7d83": "WxEFYpOnt3HalHbUEPyzDZwl1lBWLrS2Jmv21y88dc64b0YVKMvHjzF17l", "MWeZpIHLDe9LLJ3ehAx5KzrJjQ0Gs1XoGJDm8jZYQ1kiv6rx0cNjuaxwS4SalbfWQ": "zhRVHJIe3uyjtseutJAFkPNalDDCaiBS5zDrW9tkGJ3OKitPXG", "Z3GsUQSnXEocKWAmwPFF": "he4vxyeGFbFlCvklYc78lY10", "AnOy": "q", "D7K3eqwokAUcJEFBmnXMHv7tG4TguydQDqYm5wt8RT3IIgF8TGT54S": "hRdlUR1Zv7QwwXbq09K", "nNMruVJK4UjrhopzRuyfkUMUDj9O6sYY7QlyqoRSSJnfCzV9b0sdQz3tP": "F1IHEkcHtY1OYfQi1HuLU7fo7dRhuzEoIJ", "VwxmhOGEpfsuvP": "Rh0iwJdsxcJQm2QFqBo14jS7GvLiomVPnt9SK8", "s9fuzxIAmaBiYQusPeZiwK7OZuzRuamO0US8kKlD": "JnD3r9YwEqveO0rlwHYYhXzxXkM", "PmqPRxBZbsPJ5WAACGwjLGkxw4x": "jtaNk47daI21xnq3wZH2Pfzah7m3spuKTrrRrigg3tDqsU0IrAQ", "pODzkHXCXEh2wrDG2YqFYiH42a": "jicnGlPyF", "v5TBS2GYFoxu2sEVFg6TkxCFFfZ3IfhriHyNuj7jwq95": "vh6fyboFpIBjwv9w17MjKxiMAI0ZbVxjBAF0eU4I7cp8Ioz5ANYs", "bR2Lhnn": "FLQT6ibiu5qh4xqqe", "CTk8bPcHpIVjJXTSzcqNnMbaW5qalaf2j48kEMb0JZyCcjJZNfdsATbxmnlsbrtC": "tUmCYrgsRK3MMobMCKPEzuvjCLbnRYQvUkVBd", "GUZUXL5o61NfTiz9pWL2Xu7pv9p5bZ20lmjn142XUqWq1gSM": "yJbv", "bXEUzc3ZDlhU33O41tJxGD4nJkrdespdoNoFQpuiZGqdVcDHWcdS07Xi": "HsVGuiYCjgU835CyezupZQ1Pzc6OlN", "fGSeb": "Hu0Zpxp", "uKGVzl65Hp4k8SfK96XNFZMkG2pAimdeOdxFM9B7U4T": "AqBIxoCfiopcTxWRf8xUrq352uor4SG5AiAlnVtEWztQ2iWg", "EoPBOpkkKuaVHawwaiDGe": "xaPKEMbmelnSoADBYqX3aAb5vsW2VeAAl", "krzNz1XxYXtgRAiy3W3miiwUE": "e0", "cres3FZFv": "dgzS23VnANxEQqq4FjuiOBmY7rEUdy87f", "Ja": "dNUnDspA", "eELX9yBKJ0PbeX0kA3fKleS41VxxVrGq0sVtDL": "cwc6fu1eTmhQCvS4hVvfSPkcFtBAeLxFqxhuErwvGZD", "ZxCyPnvlHVRVWHAtvS6mOndkEDjTywlyPY9DD": "xoGh5cG6xxAX0AeY0JWwb7QYFKGawpi173CTYjhKKCckPhKRBglxCX", "qH": "Ee1QtU0EiNpkj", "Z8StopKlt65qCWXigF8aAd012xYuVBLBNCCLE": "Kl8j4lHcTE9bMhNscODk2JuUaToENu1lwEXXofT262n", "IPGuaH2euMCPIcPfRYU2L9WpCzVV": "Hu1qms", "Hjdg7VXq30npULmSpInjWh297uzZHyHkUSKaNUMoMv77VR6OhLQ9qr2ugSMUBx": "qCZWdlRXm9DBdfT7qlNRVbuBHFyooWwA3wFY7DJp", "uXAas1mTa3Ca4jogUS6Nj6fHeE": "cuiCyOUhgnGNEafObHkqOATOpwh2H4jRHBLIgj", "IlhZXXXZ45HSKMDohSuqIhdg8ImdDMy7p0XoIKiwHMbl": "epfj87RYN0Z14KSV3RCXo5iyraCxTGaY2mfSr1NAnjfaWhF", "bk0hwM": "lKxMS91mmq7POoZA0edSm3s7UI7DJBiMBjhDQxSIoh", "TWhEzEv3bPOHhRBucTGZ": "nLilVCwjW3pcatvNEfDQaM9hxbkDq57xK0V7TE03cWsJhBo9nMpfgZZ7B", "VWI": "psFkg9QmIr2Dx1xJlMg9m6dZuG8e0oFS4Wxs", "fmuDd7lxajtLXPzvhe7dQxjO3Bkj3HwJwE9YDNcgS4CIW6e3Z6eMxVVGNctETIlm": "b5bR3sFtWwS2m4b", "VX4wwM3yy4adKld9IzmtwK54fsw3v7ZHanSA": "knH2F0a3agf4T1Jql191AvmfICmqWSu3gOUXPbRTyExRO", "qRw7y7kEbuI6axi77Ej": "tKGWoyhdr4kKUh", "nJVB57xzWa": "Ets6TgkBy2Aw9bEl0CkuUwVkkq5ecqHkdAPW0Tf040noWJtYf", "iHXi16m2F23Gf6V2qLPnPe327isGeOlKLMNilprb0Gz5ZGX4PsJSzRmwaiu": "MSLX1LyBjmJkrnZnKzHay0GcffgLgqhROn2YDytKnskCHN8FKxRklJ", "XEijpLgyHlnFRJytlh9O5Kjv22VeYYSI0DDQu02qTW8g6jbojqbYh": "CPBJk3s63YCHm8DxkB3iY9ZIwdA9AVfAgyiJ8jb8vFRGNnC0p8mesxPrSsKo", "zuSfiD0pKvsPolXEJOTIb7x1ZpzQwxfPfnP0ZnJGN7i3tY": "oQ2WGCyOMuYqLW4AGtFZtZIivd9BT", "gkGuaSg4Jb": "sixRpSBznvCKZWSMWGozVh6hD9z", "BXQ0HX1TuqCOyPDrMF5KncBO6PCfXzlJ5Q9HyDYkUYzYHoEGgNYfvzujwhFl": "p", "FN6QPQkrsQB9hhY6ieuUDD8U2X5WN": "As64sBQdveIb", "O1oU6njhfds1VlWYupSMjlTfNZelHq79cUW0JK93djfilg13pWON7CePKtey": "SNXPMvVTbTQS1CaKUSuN3LVmL0WUg3LgthMUoaBuxkuBgGEaBS5", "l4TVCO6YfC": "u5mfYlZ2xJdSXGn0k8", "dHUR1i": "xZQA2zMR21ZAT4wbQNryWsz6P0tfZIQfmdrzlAE2i", "ePLkwmOh0gfS": "usTSq9kTR2d4LdwDh2Q6hdx1fNA5c", "ZqVBp3wUMGib1XFmhDIP": "gcQL2dWEH5iPCbgukgW8JZnMDv8ZCXE3O3isEGWOVXicj4xNgGoF59uXhLqD9j7", "SSrejRhPzesVsPTcXcMB1boU0CmjiUir39kdQluQ": "VMMCQRgQ3NTOOrjVuYfGeHrCch1GjSVXleDJJInp", "usRkF0qHwDZS1qHM2nkl9mk7pjKkj4jVnK00bZSOFvtH6VLYPE": "wEWqTWTwXhDsXVFuIAGGQDCo8t5tvZii", "BYGLHCC8SRyZ0KPoslhlIxUecBqJeocuk37BVXir8TN6vjXaVn3NFmTS": "YggkkMC5acJTwkEAT9eHU2HJ1L1ww0hiCxrJ88cl8A4NHkUfVLCH", "Dl4O8zOmgTgUh33GtPG1N9n6PdmxW5P5biHgngdl1oPZO4EvC4MpaFUgFd": "yMqsB7DOX7N8H1rop7xuH0mQ6zJ0Mm5dWYFx9UJ70Z8hBsPyvMfrSW78fmtGNwzW", "uYRSVEyGgK7n72gCNgd3sIavOdwV3w9KXiaW9Ke2dRIRzOZSuq": "Ed9EVlu1Jw", "SBDYUr6BCj7vpe": "J8orPC2ZWGTJfJmeINQDEj3Ls5jCekgftquLJarRdT8MUWSS43", "HSxf6hb": "yEja9oNqa9Cha4IomwchhAh6SWaPrzeL2VYtHJV8ieJLQCtPujHU9o05cIm6j7", "nyCKELw4oWuVPB9c6awNEqGMd90Vo4VRaIfBAqlkOceNd9F4": "T", "IEJBqBvICc7cFRCaWZYp9jJBenG3o1zvnAVWXOtKDX7tQalXBQZykInZaRqjAyje": "c", "TonWOhTsjAMR": "zbkK63zIGVsWA34g5NkLkMi1o", "fbQr8ba08MzkgGrB1Zw15GBsoBDZxdn276lj9Lt3b4ZRjz1U": "ai1tKIkqA6fUwbnmf6uAHvdaToOcrnK1t70tbJBiB2UJJAhy", "MqO9BPbwZzdCx3YBDA2XVfBc7QXtMNFI2d0OX9Z6US": "aeoKIXOO7CXL3a7lqqzLSkWvu4B4johjJcoZbYbFbuefHcGHGIZGbFFY", "qhsT0kEfJHh0xtIUCG8xpZQtMI3nCD5Df5UeD9Vd": "loE5amxuc3sYsXi6h0MqlofQVUyVfzM36qDPTe5m4VOXOt3dV", "GJK5L3l": "pMP", "YgAhYLJFGzx4dyTC9mjCWzMUlL5mdnIIiKlPCqHLKq7vl0Q6s": "Tftl4ze4EiMvyGnTW9OMH8iBgOY", "UwmNtVxdN4KTX4fJToRHpkQJxz3MP": "KanF1ZViBNJRDEQWxs5EU0YaQOdSj0oAM5r9Hko", "qxCj2lnCH1Y997hPrb": "kYSGGck8ZPUpcNkGCWqyMjzCDO2krzjiXqNjfuBaFcqSpv4kf31fIrOST1hJQ", "RUGk5OqklbO8xo3270b4qRVhz0bZcJYuI4X9M6TPUc": "onxl16ZPSz87Y45jO", "Lv1IC9vCNNvhmAEWPlgxwe243Br7WJDAAcMvEMWtio": "EZtkhIQyQXTJh1Vsds2SKuvY69ir", "GSVku1IuUhtufF1ilJyseALs05Lsm8B0IZrDjWOjyY3egs23gAALr2jfCADLBzi": "qEhFlWoLh90mnGz9ETg4VOlpUgcXjWZDPqzNEMN4k8zmpIQ3QdXYPtWeCDdZHT", "jFKoGveeCunn": "hgTHwEX9I6cT4Jq0ZGrPhF58ukWYAQManpN5ddof9n", "LwkM2nt3sj22NlUh8Y": "CeYqCk0qXKCAqPhKrQmWVB2n25DzWN0pnWKk44Np313dv4jlLe", "OSVoaSUJ5nZSSAIMd6rjn": "BRuPkghJeJ2lOMrXRLQHOPFqhlBZDN3ZPMNItJX3WdqgOCIru0bekW", "C9KwUe6d3al9m90eFUg": "PhUcck7l2T", "YIorQupDIw1svWMdA5yLcVRrdavuPrPCyshe2lzFSrym": "dLeGqygmsg1v856DQphXH7cHV6414fzr2KWPjLlp0CHdvyHHxnlN", "lfmNQmOiVYEalfluPgWvCC9b": "aGmQZJDuHrwuSX2BRmDeDyxvMVArKRd7", "CcJxulk": "m8ipmpa04Cse", "UFnqaTsh4eDxMK6y5e7vJdtRFrqvfx7hY2XROUanjC9TYi3tIUDKMnYJHm8t1gAyx": "IhkBVAhdOEjYIpZtHTjpLi6RGBlZcWON8eoNKlNvlgYrLFbJrdJmkU624wI", "oYQyquWmkoAxJidkpbTAKRmX2teGLNvFdIJ2X": "axGKIxRpNgQ2TC2T53eu01I2IM0FEeYZdI", "ibW6u5WvLgO5ewOGPc6Ql3FtD6wpW29QlPX": "DBrDw07A4ISQVQp1IZoYSraV0miuoXnWPu09VtLp44B9Sy", "sw962zzd5OxDg": "W9wuY2P3bzLqHKFCcXbxXzf7q2Z58eW6T", "Zrura8F3bSM3zwUvHTBdjRAXni9FsT5ww8g": "N1dtBvV9kkmUwb3ZkpCyoK1EdyWA", "E2MjlkNSE511ckx": "Eh0RHyv0cXFJKdyR7tMuYWYVnxix8J636sAev5rEAgHxxs4elio", "carPcy4z7bUNY3vMZNmUAO4HMRpBCw4M5Q9K3yE": "Fm7D3RD5QrKkZMVambKMgIjA3Fho4qbJjrtbb6bAUlzV1Eemwbv3esNxj6DEQSe", "SAVVNmSLV0Jv": "bQsbbEWXuKooxKDbxfYQR0g33aMwBauFGIRr8IBidPs1xQ1fNjQPDUrT3xvbPKFq", "Z0VM1GmmeVVVaTe5woZeUydMXW9fIujApLPVZz62yfPXaFTP5tUbp": "Qb", "A1jUGWDop": "KxCBeg7fG7qs6J3OVT4o5GkoPN8sYqMgpNBuoqn3fmURuT", "KYxAiqg3EJqozoU0GLquKKuq6RaBiz0SCz5pNFITHX0E": "dW5kJOAMPP9HlXNmF", "P2cyOOVK2wPgIwNfcrfFCU7SWewOAwhZhF": "iUWJujQ578kgisyvceRqjMd83HLhUkC3XgXfX", "JaZA99N3WPOs1zf8gjWiKQx7mr": "ntM8fk0sHHmSTxBbRN3WlzHhJKv6PGpk7aYg5Xj", "CwZFkjzrEol5kF2g7N5ilgegmldb6CTmYquv1": "aVyN", "s7WktWXvFIjpH9302Q8Paxa1DG2xs9nf0y2KaW71SylSwmLf": "fXZmNblmS23vJ602EHTt5PnWNxcvbdvkQhn4gGAON", "Xi14VTIrCz": "Cw2EtyGdlAuxr63LePNCVWehUuJQdYtnHbcXB1xKznTskI", "cZMYFkbBZeAYX5y7nLXDWWqZI": "CgGoZmCL69DzVoDpSue8i6xGj0vg9lCp2AEE", "lDo": "v56H6Mjwdjx3oCRRWKyd", "NliaeuyTmyRv7zDx92j3E1XqEUUcVfiakN7lmMmuVgzY": "XWmTCfEbCqzUbk5WHAhwOtjLp", "p1KxXRkUbYSTKszKncq4PbHuVPlrR6l8JJ6UnI1YMazzwSs3oa2itnf": "vtHRDGGLGj", "ib88fAzIBNVy4X1I8IiWzV8FC1M8NxfloloZeWgmpoDIhs2BniJD": "mwb60s2H94dq5wJPFNYDqbz", "W7YdQO6ihIPJSXwMH": "gqhoOMgSsDgMVmzT7mfX8EWp7T9fXZZeYkY9ND9", "R8oJIPv3h5": "lW0UC9fnQLKHQLyYcT5d", "kqAvpcHH1vuvvJnTikybEiBM9bWCf9wCRMVNbGuyO8J": "k6538915pdpYH35Iu1WvMsb0", "N9FZiRE": "QlvARSlcRqS", "tpgt00wGV7DMiV": "Q94u2ngiShP5Ztw1pae6fwITHszICyMyWtQuf5RICWesd", "pGL2vfqNCkM3sNFsNHJGWmQLeNko4EEnK5Jl99C6RYnKhB4B8DDyIUOJTBAyPhJNi": "JEI0cn8nCa3rt8WEkfp8Ap6Uy1rG", "UmPJtBB2CDgLigjdd68uhNsiYrcDsu9goMK8QorUTtRcLKiv2FqL": "vBQkhJ564hY7CD", "msrf9bctEEHc8Jlhe": "pBdovQvPJ4ggduiM6ocwVPGW0hPCGNrNoU7DP5N4GlP77sdPf5i3", "YwV83bnxG9cPnHV7nSxDH8XhUtbDvAeROHHGTQ7nuVjJ": "p3eSmopCdRiqWlDmWLN", "Je03u9qkcrH7Tgn2NcmFjfGiteROihhC7dULjFb9NF845XzX7": "lTzrO5", "khBjGxmk5DF8wb81MkYrLGgPpFj1CWOBY99eVO": "FDmyL", "DMFCp3vODNx": "Emi", "G01oua5ahXDpGligsdlqYfpK7d9EmQQoU1NpCmAzDtReggsmAgv": "ERxotBY9M7XcEsHYecqnCgDFHJbhehUIgzdWQuVJgRciEa1zxtfmxcsBfVDyi", "ChvdRACbfqrQFtGKqFgBHoGXiwNIwKjVMt4KVKnUeTaqh6zeVXxqL5ZwfrmvUiEo": "hAVseIz4iT6S5tU2iNeWKzWVkKmxk2rbnGNMjwxR9iOhGIeuNwGI8VI", "ceUN": "BBjoKR0ZRwRHCFqRxBARI8hqj", "h5Ob28Er4h7s8": "NdRZRq0Z", "KVpc3wYzpwFL4IswpExcO0l9OQktQBvfT": "k5qecqitf1cs8yZigN1DbQZAUMp7Hv7OuEhXJ0tGmivaYwzUCH0WYC0", "ulp5culr8u3IFVvBL4dcVYf7DCkjYcW2ruy1Z4B5iVAPR4tqi": "M", "ltWkrdPaW50Pt28VBJkk0bRGRaBmNXvu4Cs2": "cOTnZ2yQACXWNnE3RAz43FKrU79stP2", "QQei94cgCu4vpj3jltaBHqzYyukECUklKkpl3K6yhwALDvP3nhklime8Ph": "wdLUdccG51WE8geIhqqixqOklWyBZ", "C1eo7zMuP0yHJV1I3uQP18rOeDeFfIJbTzFhaH0pr": "yeoY9nNMEQtlhj9f6PvGMSMvcn", "OBUlBvQz25unkknvcdJJYBoeAsv1dzC5mhK": "afBu41ZHtpSsIIPLfeOn32rJvqRBF20VR5wdhomN1vWC0na5g2CBZqcq5cYYC", "KTicxzXi7kULDyvt4at87jMZTDTP2TqYzkP5iq1oHBDBbROgSS8OtZ0b0GR54O2TB": "dOlkl43PL4eaEjRVNMx42YFoG1i4GnnzwZbMJluA6KEXGG", "z1vTJssdDJMcb6pna06sgLANBDD9GFklEZGHgEhahrnrwiGeDTC": "fEiNU3LHZgOsUMv6JrFwbnt2lAWZNEtRvgaOsdRo5hJ", "kVlfWEOkeuIdEuGBWhzEqDp6qvPz82j": "aOkEJehR0BLWSioEJw7BsJUgfo2HJdlcizE", "GGrWVREJ9WwO3C4YKyiGZs8": "Ax", "MCld": "TxmF9ouAVwnzKg5neGS66YQVHq6G8jFRe76dpisH", "ZMC7ah3zq10oCTWht": "KDFuvE4MAmRAaV1vwXzaoQ41", "WsGY36Q00": "NVmR3GrtJjVZFLuQP64ZEWgQRzy", "hiHgofFf8IrUBU": "pCpd0t91jvBEPHx8q0MvROLXxSVMcksX1xPE30PB", "xutAyE1qWcUk0Gsm5P2sCE1zod2": "vLbPVEqAdiVgNahoNJkXzPLZgqZdKaeG0ceKObZiIq98u5wB9Uc8awQsk2", "eSoaLpAol8KnoLTGwozDK3qOz2m7lDBfw9SxBMCcSUf5N0KqxzTCAoiPllb": "izShcqg0tzaHEkTldfsGfaS0TuM", "FupPLBoblNRi9Ak6hDe3yw4fTTOfBfMWG5IHmdEtPVV0vxcT": "YtGeVGIbWbiKkbTR8NFAa2xiNsjgvevDSnrOCFfJrOlaziABl5DicICxau44", "ybAkdF1O1tTYbegz3De43dOgZa8s6aXJ": "orRVmhrNf6jCno823jKqluQcM555FTGalmjGwrthkk5sYBc7px5xwI8Cyuf", "dvbSYvC0c4OiYV5yxckOXW12sq8r9CJr9KvfmcwicKFwsQAHu9Td": "fK", "bbX5ZezsRUoYS49HaHa83J4IMrBmSQFXjVB7gM": "OxHkloJFLlCKKjvxnmeQN9dAI", "UoUM2RqohiepBK5vOeQpcaD3PCn52DaorIDsrEs5R9qgBqDP": "LfD", "FhTLK": "ZQTOV9WGLVqEyrS3MXP", "KEl7aAcfyVnMhjpBhDoJE3pjY5UtgKHIqdSDaMedeCNV9c7uIUDAM6n": "yO2GblOZrLLfacgsHoTP", "BHLQlMBcUGLl": "IBCwEVxoPE9XOtoGzQkEHvCs8uGIBezMUCf3d4j20pdqrs7fJ8utB", "o9SOCoqyysKnlRJ799wjzXNjLgqqIR1IDixrFhqU3GPrkWPWSUcqf1dqQ0LH": "AqA2G4KF04ZE4YryTromeNOBXkK8BTUYP", "HX3sTvqbfHmi5ih6zx4dqVo67nNU8": "wc9dHZWZIIeSHRMOj88C85ePV7sF1yoBV2Ed7jAJ3dSZK", "vXE1YU9pfa9olPhTRHC": "B0xz6mAToHJhrKmjJKWAZLii4", "azv14gEwt3qdjJYhjqAM8tAa542npYBQycr": "qx0FlDVcmlJYoSCCqDqxQGfdYrRcwT0Ob07G4kp1dAfDH6vTGcj3StbRx", "J1rxECfIyuiMGeHpvTIloUtkrqwUpdFozVyCrTyaYkhQbYt": "L5SZ0qMjU", "wJp": "hEl6G77sI1Jk", "nue": "UNShC7Zgr05uEjE04X", "U3WsBVsBdPlGh": "os4NgVnxN0w4JucNApAyJyAT5q79qyoQ1xFP3SrBo4L", "xa7xNXTnjuAuJZqOuWfWCoCNl5yOH6cNlIsr7rOU": "c6lk7LujfWPQYOjzzFNsfSWFUW7j6cspQqhKr", "E8HC": "Ec4aJjvY4adrouGk5THVC4aNV5XhIMZIWNdfztXiBuemj6", "zixnm8cOJcsOAtEB9rm8sZw1FIKvQ5TmBqYsSMNFsm213": "p93aN1tEs5sz1oYv4pedRXXV96mSUiaTRqErD0eKOB2jnKzIzFcoYRshAHp", "cl2GTntohH": "Wr2F6EYDlApMtpuceVw3hQOINcnrL65uYP", "en93kq3RqZQ88BtcaQ6": "o3ZmoG1IbYGbFIR8vlX4HgNbUN0EQCsgkC6LOULoXlz978OVK", "m78uT5ZeHBvdm3nbnSTCpWBC4ZC": "CLZSJHMxT9orGhfUiTM24V7EohR6uM2J8sWruHUa6zdFBHYyuvMjtjrfqshP", "C0AvZYtYbdhEkvSIJckS2l5B05RLl0EewJmBfJ144m7xtqq4Oh334iuXLZxI": "GFjWx7zb4vN1jOq60uteor24H7u698dDgJV", "XF5z55zJ2xYX78q4A281GQVPY0": "ugZf9XB3C9fidyENEp8mBJUVPN2hzaeDtfOt9QR5exteo0QGWXDhhareU", "i6xW1HvxyK6noJZNDR": "sLh7xGYAYHHlSm", "PujC8JMNQDQlTisIZ3WW56SjddksVVBwNqMO5OmmFtVI6nxIBJz7L": "AvWKBHzlDc7gIK2Q8uDrCag2NfoCUKUqpm", "d3UTks": "IyL3pRIqmHvuVPZfGo8m1WISq1LO20qRuTu8YVerIR", "t0au9eWcSMER3hYn68jfUW9AMkGTo9FuCKZ": "Ep1MdT0IGhyTzkVHl72JywLCS8", "eacuyri6uhZ": "Ny", "TXSDQpE1u9IEtRnOEXP11CtETi9KdRQCaB3pUwmqHr4ynKlkmLS4pV4G4oumHGz7N": "f3699OjVzt", "WjBEOeRFCrXBgcvLeIxVBammEMnA2qAQnwDc2R": "UHxyBheOEECg20WvSKu0UUuFEFKWxtY1cJIDjc7PFqBUPLbeqL", "XyqRYp8EybPzr3PIunXSpNySRkPlLC08TYChukwh66KJ7tBpqdlNYpNzPgN": "XCx", "IH5Us": "gQ4L3Vncb9FjMnbVfKeOvdK3elO2ivP5wAwWy2mcSB8L9PriMkKAsCNvQJq", "xxZscDG3WWwxVZVOVG5XFx6T8WHnT4OikSMMSgfEC2vt0nGheueAKJByi": "NbRhyb8qgH8ZKLJYxjvQZzfkmwiCG1n0YUW", "Prnh7UsD4rdqlMKc2sSkAV3q7E": "xZLPI2xIDJFfPYzSSHx1ZVWv4LUfDEZnS1m3EPPsdkRrcwtItGtaCSznaxJG", "klg32Fuc7OldAVTMPEfng": "Qc3bifLXzc8Kovqi", "Y2ZjNlvN57FxEfc50OHxka1ws79qTzKcJU9F1ppZVD0GlNZ2zuLh036jRb0jIvRXp": "OJH4LD3m7SSRXizGWLZdIdt4C6N2V06wEte9saY8QKTgKmNGGWM3", "UwTHyaEw4dEJHveCkgL27FTzPbFJH8M5XIp1tGe9HtTiikPm5NPdxB72sQVDU5v4": "eVduPUGGgGZ8qybOOFwpCtXOEwqiz4kB6YQr0twNwWLilAEFarmugENsdRoY", "zwK9ojOaMGNbV8jplUnqzVPnlcvBXgGEecunJHyhLofWi4TXqhL0yJeEManGRqm8D": "nIS9687SzDemQGA3D50TLlSkgm2c0aMVw0Z0xySZBH1OP42tmR6Qy0QmGIZ", "cK1TcKgLv0Uw6kgm1": "pPdh0AwPUrhZzsOHfBGn24uszz4BxyufvUE4YhqPIGKu", "lk4VC": "JuN0i7De3xKScdaRVHkirGf1E5ko9Utcoswj4eKWbc3GHmp4Jv", "ilcxcDJk42L7jZMLpyy6P": "PZtOcOJF8W9flKo72rOixVYObMzAv3ndoCXO3dMmnHNifw", "OSQzgea1YLcQJ94uj1PG1je8hTdC651FsNdlpRzAZ2Ko4cDSdV": "qQzOfS7pWgdW2uZVMI1eD7D1eX1zHhgKu5z6q2Bcpr9YFeAX7I3", "JBzXqQ1j2wqxQNIZyst8H7H4siPlNjPptJVdWe6WhZyKvD": "GDuH99fXDDlbhHGqxCjPv0uwsSLJ6XRNvDzip4EUAKdA9E5", "feCUfrDffBArBr5ymG": "bq0FYa3NAw5M2m1qurPZX0IJSS2", "iIlTEN": "LcPI3yAeH2rJaueZJ17s7qUtIDek7pG56UKtwSEO04L2F8ef5UgJk", "qDnzJk": "ewA7RtPW8sOcQBUBxQAbE88", "icdDX2m9c": "Vl8V6DB0cyOJ2fbHK7Fn6b95MZJTGl", "X7UkigDwqRs7MEFCG4TffeccpQoWWO8XHmjxHIddgGf6": "xof2U0WD2U9NtyEI", "MGru5ljYS5BACMWhUsAZONmelhWLiySey5vgQVmvZV2pPcNbgowuLdyJb": "ZIicRAnKNR", "dqx2t2BiT16B9NIaTPb6DVYUgjm0TsyC3Z4a0qgnUSVmt84q": "zYvjzIestBgNBEukpto1cjO6FaaYD86t3cRJPGc6nOJhmIO", "IMqWg9az0dkIXbvtyjgJh8uspjfg6dgKDPc9d8HdzFrTlMfEccAib6dZBJ8": "Jd8UA3iFTSD4BzSNjIMQWeHpJ1Z0bYwcPTXeqBk1yQm8RnLAHMX9pMvKP", "dWndEdndUNvBvM9qJDMP0E1PqmAnBwdOW9qiM": "xDnvGjkTQ8oT7qxsA8gOtjZI8ptLJ6hM5NgnMPg", "JVHwqt7MiWBAtOQs1jsG5IFeH16Q5ISxLgZNAmNnEFzWo4X6eu1JjIMnaAhhIpR0P": "Z4l1l90xLSlSiE1WpeqcwhbEHbG5bnBEhSmMq80y", "lEiyATVZU7kmTxCe3BmJPS58wWFmG0hK1k": "zlPl1iyLfJopOY7QmNIV3sb14dowKi2iJabac7GVFQxlg4G8", "sx58nIlZ7LoYi32EGg4A64kHSK6kd5cr6aehi": "OZT2E1", "ctDB5CQG47vjsXP7983hlMXtX7s": "JP6Q0yfaScdrhxkH5ol2JnhPhl0uVQzPNdHp0zzhskHxonLPU48KhYq", "ts4Ro0O": "mPEz9SAGRLtfPXepDstqjfWCfUqN3z7nR3eTvC", "IVWNhZxnrfp0ljnWxS3bvB4Oh6cC4kYUl7aVoG67": "QC4XL8s9CTRRx", "OdWVwXxf9KwmFnEq4Tg194Hf0ZyTefUsO9IUnTzbLeYhY3jPKO3": "DusQpThBsEJTURwXeHCaaC6OzP3PMXVSHKGsVavArRqO7aYHLlK8fk86", "zZvz8p5zbG3KAhfGXO7cnyaJOBUsurFxVd53RbEegWs7946eUJ4j3CdEbxtwy76o": "rzWdpPfVk4uWltwODsUIu70", "WLBujNB5DlMOgp": "g0ZWFuo7DbgjLmunCjpQPHRIRi5", "uZGC4SEjzqvO1K1eRtzJN4746GwCx1qyXckIOL": "Fo3iFU0ru5MN7brEYOf9Wpm1M51D3qg", "ka3H82SIrzQEUuHHIqZo2Mo3ywmW3xAMiWGL0": "kXJtP8BhIifbBfwlVcYU", "ZJ": "btldiRwSBjtE6H8k0KyXLCH0tnIlG98YmkBevE3j5IJYgYn6Zfla12EAqrJLQkV", "cjZHeBDBbGK8gvJXR": "rtUAyuKPIhFMxTJRXt2SiUvfavMzDMhEcfrR7oSaX3oLpwS8IMDaMxNBTIh", "RsLV9ATUKLOSVExdPOIzJh8LQrLCRoFqs": "Mly", "x5bsd4A0": "hwlEYgd5Rt29rqt069sAsvSbTI4", "cYOFF8tT": "m5KmopGiEkVmFoBxBO4bEBb48b6LKujd93NW43XowqKAE", "Z7uicmQD6ONCowNbeW1TJ8uWHFkWsoE6snmMtNLAVsHLVw6rnRG6l9LKFt68QYeMO": "gmwTsbzTNAbjrSehAEugnyutjrVQrOEL5fJE7gdR7K4", "C2lkGm": "IlqsSYBv5MbPGQh4JMbN5dqFbp", "DzskcQUvK99vrVgnjbj41OHtcbvX": "oIErrU9GHy6tTFggC3LsohmzIxfHdBuuD8MEg53AL0pazCt19exXaH0LUnC", "mYcBPn5KDkqVkbLTDqFqIujRzMCrSy9P1v3vH": "kEBuJhSjbLiVT5fVvzA81he", "DXY7KXd51Ysfa5It2Zbxb7ultWRGVUgnwXHzc": "xNcNJEVup1sUbDyXg2K5Xf86V3ZUxGs6lfX7rzlwcuVTGsdXMSF9", "kQ5dcj51RMCpaHdWP09PBzCUAp0DIBnnaEmRH9gb1sTiVB41FPdcqQ1l0kyPG": "thPEAYrmBfysL8MtRij2MhpXaInVM4KxCwGEKSwuXUzNFzrB6TyyqVQHLrl", "G9Mh4g2fclvB3Msp5zhCzN": "r8qaseewFyftm039E6hw7Ox2qX43umqq3hDsnrYLXPIEbznfk3JgXY6cpoVN", "Q4qjoRBQhjnPJGTB4vcjfmHpm1wiLB4B1MKZ9OmRmGTI7Y6Tl6v": "aeTUKHAPJnqoq90RSAb", "rd6WV": "ndCqwYSeK5o2ZLhtpZRg8BgclPcxid4crnVUeoewqwSFOwMVgQPbLWOgXyV", "CByTw0bpmqAnxT1vHe1WsAjONp3cK3zaJa": "ZG1mwu6SGC9d6Aw9tKZp4X", "I5R51OHfdQLJgxqaQWKzR0Yv9TK3BCXLA": "t2u9neYPJ", "HSifQetmlG1": "h19", "titYq0QmP6kMZ91EzWcqLDpNQtiFsIjgfKAt6hm6V5wOr5EgoVKZFaOJdovPX3XI": "t4mgSorQD5yMOpCNa3RqqoFUszeLgGUXsVx0wmfhkshyaNEbKqQ56vlKKVF63yR", "Z7EkGOYxn8rl6gr1HvB40Nvc0hMZdKOYnoe9c7MiYY4ApP9j3wwWGvEQ": "sD3wfHL", "kCW6mjabHXGCr3l0A4Q90SF7ydAp3": "ypQNQcO6bFf4YIj2ECKwqB5nMMDEObIf7D50r", "yneEuucgUkRoHErlfh": "hrLCMtYJ3cAfzEAOOkJo41o", "QsoE5bAgt8iH2p1FcD6": "VLfzqGC7XgWZeEehqmZ8CHhPvwYQ10AXvR4XDKg1U", "qWRqmGPS5NkTSvo9lByCL5v2uFE4": "Uq16yWc2bUrjMTY761VRbYBBpmWpWVo9MYn", "GGqjGHewH6QHK5wQ0": "lYccuSbU2CZTY7goHl2smSiH4O8hMfuxy", "c2ZGpFJNXCdzuPjTJXXCkTfQRxthMHXgizrnsbGhm6Bhs": "CPAhTZPP5ZYgGeRKcPxiv4T3EGNExxRpA", "NxVX3PFQkY7zbho1t3OwtANfarWHkODKYui9jN": "vQFy7RJQdY2jCSwMre85buMm5FwqtFuCaP", "OUFL2gnB7JGyoP3Fp5ivt26GnF8Yb6ygK90R2H7iQssxFUMbydQK": "HWLlzpbaZNNJeH4t", "XUhAGMQBS3YPA3": "NrOIDz2t", "nLgPDh4": "tZK1aK5NZ37aiJBpyJqQ56raCU25eSGeyyCqb7x", "XMOK8y827gIwl4TEqgpwJ9ekSnHkbx73uoY3cHZ7rIxemJFeDs": "mtYvQslhM4nazQI14okadKIh7mr3OECIlZsczgqOApRjZ53Q", "MBq71wCCLKyznt8QxvEt6dUAkOIl4Y5wNoHoFNqYJ8dhRfNubXnoh": "I0pGHhJ3RWHfKWFd46loOFysyRJW96bIFiHNqo5LFFdj0h", "QWe1MP1kBxKcZBx59Wr9wr5lfd4dG7msrHLK3fuSFzVQfYhDXSgkD7mZ0FBNqQ": "Uw5jlPsGNnlL6Kaz8cUXq", "W28UvX1bTtSn35g4PzDNmw67NCszbovMZdyuLoU1uxw7yMlR88dDLdnd": "V7JLlqprEGoNuvXeZ2xRAxCnbrCTMIFtyuOZX1TWux1iR6ifxi1wVj8k", "JUe6xSDOt2y": "Atl5e7V3bcppac0ygmapwWLNwb4S8SUHTZfWiEAGCjVgFsNKDcEzejeeyXbXF", "oKfS5NBf6xEWOy3vUAw03jdEn8N4bqonOGdKQipGNCjQT0nENacPqp7L56BF9cDFt": "wzuwpK8K8fWWsfkLAaRAOCknNtdiNXqqhvk1n5xD6", "Wvx6Oayni1G": "IBontamcOkldXMm4GltO2OOgibutQzlNl", "YIghNCboPOcrMH3Td47GxdFrcwTiWhkJFzIkVM1sRzimgpmZqUUxbU": "f8GmQZJrivWCevLaWBAvlwBmsDO8rZwC4", "s9fIxHMfuIOPLdgjxXO68uI0RqSz45pamIMhcDMQtuLXKbXLO3Z8Zs7rLcmPo9CUs": "lbT6KP082scuzPS2gVRaPZ", "nUpCaZJ43N4yzHzUMUqXinLyXEgL6P1ghSom": "BYJQokFdJ5hzRSI7Z1evRDKopXPcR0njU4RAQ3n1L", "V1Df0cMbu94ZbA68bnB79TvbkBAAU4mpPJk4Cs0wVEwqGiijPLDmwhxQ317mBwLk": "HjoQn6Jr9WMoD5jRnA0fcxGg54r9hNF84uTdAz6VLBiA8RTwTC8Z", "Q5cyGlzC4YB6e": "saNvSwmhlCOSXfTKzsXEkCkUo4GXU5qspz7CDm", "c0IvI6a2eyJgrW7": "G4GgBhNlo0F1FC00NM6IHkIdhNdBIpyn3sdDq4Hf8gi", "Q6Zcm1uen5CTqbVgLj0": "DrsJhWq5Uczf6PWsFI3n2GzSeOVK8t1sdigQAllbhB1Ksl", "lsB7sMoJrJ55drUJv5gDZ6MhOEAP8vmmLb07V9eln1vSJLFq2Oy2H": "IGaPLueFPZjvCwyHyK9sJbeN1ErNyVAT5UWjNJJl5", "x6Kv0Ii5PvxlhMsI53HijewPH27k5fbu4lKnmGe6xHlhQ5sjtVY7yhWNcVyoeJ": "tJQD5ohkR7KJxf3mWbk0", "EByE1pQOhsFTO5rLkq9ngHrXAuaJAG8UGdogD3l2zEoGOhT": "pe2oa9gA4Nuo2cfstQVYG6CFuTi8uE9XJe1uav", "GNaVDtvzEvpdgCZHZHGT6dR4TFw4wnKQaFywFCBHdi1RiUWnW": "ZvvyxLo2eSbpzegYUOX0KX0OBTOy3SPwmvbcUgJ", "YmnCdf3BsWe1nHSYM9ZqSswYW3tMnz1rJtv93NC2EEBzPgTGT4h": "DQN4AGRVMs42vCLhymkRmsQV855yROMlyAdljUzs", "kbFXtt": "mpkacITtG5gHkWHcetHkbZAI2OxJw6jwhMBtpSQ7Fq6ix", "pKOBcTeTl16T0yMRwPlxpmxd50JfTwSxhif3NQ6HHATNbvbuEi9MI": "AQV3WsWynO0QoEkptC8tkpqoCpexnPYbLb5DzRUok", "dpM0HTPng52OSUcwVn7qfcZmRtkp8LObmqENB29uhxJ": "vfnrmQ7lBQSZMJCaYMzqyGPWDmfhihRQsdu6LkVsutleH9LNym3ZMao7KLCFBZbvA", "O2OO33wjos8nUiGT": "Y1bdSshe5rxnH163d4Y9IHXLkoLgjIwFMFIErSsUN", "fcLuXD8aTebSNVSQCwCLqkvIazCFvwwmmpBzbh0": "FJgKv", "Z3R": "yK1OniYdc3BV42BrUBs9U8AR0wQnwYS", "BTd13NWEOJhfF2u": "u1PWJV2NAqWzHd7kJt4Ca0EhqvrDoFb9MWsts6nU9ryvNgY1CW2Jm5sufQLsEA", "OQthSJhIN": "zDaAY1GybuUJ6fUeYFUR88RGnhodsM7SZRvqO8KbWmPnk4ajX4jW2jAp74dT", "Mb7E": "yywd8S5wmtpHwB9ntoZTpmnbJDgxSoCrQ7rGqYbFg9FTklqUaPXkM9rV4bpRd5c", "KeKm5UyLrMR2": "z27ZNhD6j6qaTbh5ACT04uaRUqQz1dY1PYsJaxuG86vQYaek9tToWXrqnvurEcN", "vYPRfHP26ZvgzEoKdCmYc9nYs2oh8kPNfL0jCdMeZMoLYtgCYc7jZLALhoCFKs": "EB", "aLeUAR4Xh0dNRbkysH": "HTqLovTe7IbrbkUByH1X21xZuvMl7Oq7mEa9QRHIz7", "mzfV6wU3hVaq6lNsudnamI": "CeYsy1kgMaHLQ9qeddFAQi9HkwDt", "ATw9mZti5IZlcXAYBTDUaJxWLZRdq": "hHKZH7UMPnc3b8", "nhe1LKe06T": "DHSBl", "hOsvNWDe8MQ3TXkse20RiEQwEaAHq7cKx3CS3THn6h": "WerHIs4hlJShLqt7Rde7Y3hn6zxVL2n9xXAIlAvIkpMrx5ZOdq", "F2h1s7V5xFiCcEZ4PWIPLe": "rAacc", "q2bWIvPYI0TabCdCEswVRi7YzroKfVL6ASKdqjMAdl7sUb2qlR72U1H2GDoZtdbt": "GlVa9eGHpPXKCtwxARyxNnl60ISZQAlYFHk8jgyIwfYg8OEBH6uf6TWDT4T6c9a", "fPdHZ9VkVDxOY5IyHEilPw3L4QJ9G1kLZc": "Yn5", "DyzzwTHLjlSpS2KLp8xYw8TEZQ7zrHELF1jfXfOxqVvjLjJVqosc6TKplM4": "enh329qK36MR", "ryMCCs5gm79IwNx86WDBnBGL": "i1ZGj0PLUe0khNBD4dYG5ZJ4eISoGqLA8cdS9hOz", "FDvij801kLxDlADeC2Ygmx6FjlTyldrTd7hOMj": "z2zBDEwj3ZwJeh3x7d46oyfaeHq", "qi7lTLH31lxrs85qITrF7Zqfy3ELBm": "N5V9eqqn2azr65sRRrYJynVrYssyi", "AM4Sc0nMjEykBAE": "dkToVaU1K1qvxuGq1VbxmqBCeiRq9blrfKhzWWS", "jaQLdt3duCGJ9zvS": "HoTwUlqqfDbDmhGdMmNlraCMpeyL0mPgN0cGTeK5M5eyPEGjs17h1n4853Xnpc4ms", "zRh8iKGEkyLC34tfu4WOmRseDJ8CRLDsACdORKpN": "Q7bfVJkzoeFRtIPFMyGaxHdLt2STWv0A2Dw0bcujfxLonaGqWnem2VVE8jsthJY", "M316T89U4rnMlhBHy": "AEGEfI5D2MxqaRCm3TIODCWv7cx1nW", "VJ": "kSIM6qm8iZtUIxq1CHbXNyYGTg4jLPcW2o", "e02dokhxIni8bd8o8U": "mJWLQcRpf1Dwn1TVjx8LF1tgeIdyN5rT0Bff0GvgBBLF9vV1nbRiWTRKfkN", "k2q5FI3lJGWzckY4lUYKRRcKG": "lxpSQNKzA5Y", "QmIKvOH3t5DDpfuhIPYc7bayVskExu81pwd8": "zyis1PH47HkOo7TQmAKJEyEfKmKXkyOxbRnXBVVNWHCil9EMFLaUHFigTdELg97", "IB7IHunNpjjPEpnDCWB9eVIMQues2CaTRSq3": "ElnoGhropOOer0j3vgRrnwrMEFGH4dHY", "CFRbgv5qOk5IT0dwOBoy8ItzVASZ824aXrW8flSMIjI7NlH4Rs8Dj7t9Z8kX": "EZ2oWynB1AkgWP0PM7025LkwhEe6sZj2ea63upBoN", "An0AuJDGlWCpYGd8P9hqiXfvSLNMhnE0m728Pgxu8swStS6kc96I6d": "UlYMqldtJvXggVZCozWzZUqEcrIPKYXxTSnAUKMh2AQhtZ1mhvbtrcM", "UVWQUeAPvLr155TmMzDX1AtOfgwe6UPUZTYOmweLvp": "v2", "nTq5iM2NWvj1XFCQpAXx5": "JdzCAYtqAYc0QZkAvFc8dfvHcDbSd7rB6KZOmhhk4Ici88WOYkx0ne3KTHZ2", "iNL1L8zkLWjZShnXVPrLq3Nha4dfAAMJElNP4RZUBIz8ejNQhV": "bngo9yH1eLNihdy34eXHdtMbfjPVzPsJJLm3HcLKPhArs44qFp0", "Er1rECClyHl": "wdbU", "fT7zW61qlghFdbr2WNVz3Vt07UMSzuAeze0wWufkvDq1ZMTd1NSmoD6P4XWEypR8N": "G7hp29BQFUobszPM", "ZThqhX": "ej6ftvQw9EtiEqSOvvY", "okE5FFhxnYdes60u": "GwYHAP0", "SRQh7Jo3bVv5kmaAZnVpkIIUaiw04mrk7eWgD4ouGCLQvzPxq4ShGw6mkurJYyohH": "yf3AGGjwgAcP4FjOH4QyFJ", "byMwRHcQ0fXsncj62lvGp8ozbgAPn9mGJkXs6cATjUIiaxfQ0qgNcHz3CGZvLPk4": "QjtqLsnRHClXEoIn4GkAIVQ", "UrQRMZuYa7DORl7WWjQqOjN1hISh5dZFuO3rkqGsSApIv9IW": "EDUL0mVNslaVX8P5aJDpAugg8bvmyQd4nyghiQk", "bBxiAUvkLpppplr5M1OBno": "Einik7AaWts3zFxnO5yBAINQqWCx12Kgvnx08vFTw", "KHnp2Rb5VZQZ7plJ7hnUKE": "bVMWWUHkHiKsg9cFphB7UjjRBZWyBLnQeFjVk2sTcxab2vqal7tITyaYibl9sHrO", "cLQ376N87YsDS9qrOLvgSs9P0TsGRFQJoM3oTK98uIFzg5nCoOdpIR6U8jgxAm": "stfDWAP18aRuGYA1xlcXjLX8ZOeISacFY", "wfRL2SWmA": "joyLF657LyoqIh8fdw6NZ98BTSI3JXypUE6xtQAYoH", "qYyfHRdsxVaCOETC1SMHxBUHHEi9KsLRZVB": "daMH199cVbVoBxvKjCzTA", "XtbJA4IrASqzp": "fSnfS7gH6Vw8vwBktVUmxlTPU", "HYPN9WPp2RMpUrZHLVczcawvWF3uFtIgC1I5BzPtGesZHb11X7IwxWVzjfUZ": "k4iu2O", "w2PyfibEhvTANImILqIQMsB53OXFMeSmT1jzKWcCvhre2huc": "Ddgm1NAUzSfTerKld55w24D8hS5WPWSrnHNBGfMaJ8qKD07uKdEwr", "uM1c": "Rg1Dr1tQ5KynMTBM6EDHaFceBRyn9wzv1nIsNIEh409x", "e9qKnVVl31pcrBr1iTY8xpsUEBC": "MK6W0Y4yi8R8KNvdhg", "yoI1mCLPS1l8zj6sYGt5sgBTExe2I7DHVTn": "jof8BwLxzJUH6id0mMf9Hwte9NyqQEB8kI4LbQfgPkZrfJQclTLbuXhf", "oRaKvGXirY34gboBLTzfE": "z4OAf2qY4LvSxaNXLoDDOQNfwCvVhVEgKpPFHO80PfGZRkCjwefUyXhk3k1S5e", "xaF7kaftpKHTd5sHZ9kEau2kXkvD4SHEZ3nMVZ4LJXM2CCJUafQOV": "l1BJFjQU16LhPNAXe5fgrTrfz8tESM", "hsVIbnzeDgBvGQDnvlJe8": "aiIUJruFHNcv3TI5c0x15aodjKXqn49SuZlberGi15O3cubq4P1uuZ6vv", "xOTJPRyDHxeYc3c4oqwjqu9CGbEp8rKF1osgKLmwZNa68q": "PHuUDBT0MCdj0WW", "d069X1ps3itptT7gHv7QmK": "nVCBBX37FpNbq5sPnPsTuhS2HQLvafnd3", "MRkSbX1e8WreogzUqcgGm8n3Bq9W4f07ZsghUZ5Kn4ENJ0fzziBtUNB4wxrCn": "VZ6ZZ2LgmuZQKIhs0etW6PwSAnHMz4KrjFmjFK8mpXe4K12JbSeRy3L", "wlwqxYMBxFi7L9SVVnQ2mS4o83PezrQr4YbuDJQgFM": "dttlJ4mmfpyfajEh29lOJN2HZPPmcXi3zBha2cXI", "hYYny": "nKLw8", "mR33KJvqwxFUJYhvK9J8FIXVfQBcC3iygMd": "Q7i5Ouhhi4I5eaczeTp7G4aZiJJZfUpfauXK6lrRZ9et59eqq8bFGjpIUW3HAVI", "jvy8y": "qrYO5rkfxOlKqacwADUx7j5KCJrZ1BuuhW1Q1zdoB6LGKDHLUv9DnYiBPReql", "KJO5NHZkBy3CReG7HIo1u1sFL1J2bOPv96giiJnwsfhZvzglM": "No6gHuNF5EJCYcfuog4VdQHCDgut2xy", "FDyt9Ghtd8uX43AmQxjcgbjDP0UBrvn7jBHxlSD0EswTxb": "srPQQolFRhhu6tbzvXc6MqNDDp8OQyYV6BcJq1MsTrpCtaFO2XNJ8nsK6", "atSLdJYfbn6747XSZF7epbqfgG8WZ": "ZwliCuwmDz63ElLR3enX3h4kR7ARf5G4c1fV4Ie7OvnY5BVKK", "Wwl58NbgZBEnyzHyvo0hilXWFYxG5WBAqiBp2MLaEDkpZYea": "yudUSFmYFJTcA1MyuT3sUERzQfeRJhdZRLaLWbiFAZWLhT6ASkAkCrmK9Awntx", "UXUMmCmcn12dwvUC2BYhOUbhGnLeoosaJxBftAZGnGHJW90fPhbQNhnV0gnajVlz": "i9zcwOrn5wTx5puB9JlBHVlOheeE7zivdL93RQEy", "auYPyyhZJcXr": "BuLXliXs8aj1UyDZnNU8rn8s0RYDNsPuoqjKnyUuWvPG8GSoAq6GPGK4gtDjP", "jvPzPbstER2F1ggtMZ": "l4BFLOnMpcL9I1Az1g4CpPlNqe1XrUu8WBce102", "KxNdHS9BUtmqq": "OrWJC1oJCeqMsKytJHFvuHtE4i0c6KqHc9ddJSIccjY2c0M", "BwLCaVbwfZsdv54Xqp": "YyT2rzoQ0hxn3ARgE1y7XbwULU", "pBL711aQZkXRGmeSo3CoS2ZdIUvwzK1Pd8ThijkvH": "ol3umwrASzSB8vaKVoJ", "uT8tp2s42ssfjvXpC5W6uWZ4": "PVfyeVgpbgm60vcztQkYDvRiDff5CmSorMr9d8xN", "rVx4JuEpZZMZIr7leAhFtvjmMmD3hwFPnacnynkFUuqbB10vfDXuSrgZA2SZVeU": "pv1MoUvHK5Mo9MEGoVvpR2DF08Msexjh95uQn", "I2AwpTXjOUkbZ8w": "ybyqTBuxElJARyMZ4QfuMqbWLf9uzD7LjeamfGPcd1McMAo8Y5D35", "xMPhP5mOHGyRvIPCj250bVK": "KMZKK6ndaLUYCRJl06ngH5KRngFBS4MoAe", "wMWepm7": "DpInTBB8", "pn9JNE3OCsgvzLtxzCuIy85FqAa6UH7VAsMi3TCbQgBUyNfik77G9bAAeFN04C5": "ypk8MKz", "wr2Wfo3U1SNAQHBN16": "htrNXjGz9sHKj6OS8EXczNsXClkK52vaolw0dQl6CeSW7", "rck8jBGExFZtY1I0aOGijVpOmZdjd3TgUi8ycLdAenGYcSQrypueePP": "LhLOKbrcIGynwQl6dg", "On7P": "hnvvzJemp79MyiY74YlkILVha6CmPOtx6aNkZ", "CsErvZaElgeM8nA": "CfUrF", "Rx": "MmN1vQPhqWVNdG9dAceAeAcVtPVbYZJf0JJ0pKcmylC", "JC2HwHqFu2c5dxKLPrSWrLhx": "Vp0YruTdFkoHmQQPzJlb2Izv9Rs9JWGaw9xlX23dNmFo", "oQijQkIlZ0eGbu5nhK2JWY4XSiJguKHWVFnvKBFiv28j63K8NgL6": "msJjvhRSUc5bxXLgM5uAb", "PscLQwpZY2Vnx6ccNlJ6F4ajL6OcLm028": "T1IIuavmC2VcZ9SRPko1zlcQ1BtL88zGPD87LNKoqAVv0TdDD5J8", "YOY0": "R6J4nOpa7bLEWFneIfTj5hQd53TnYjb7tBJsNVwBgzX6hUIc0DbIc", "d9htnKHW0JENriMXRyCPZY": "bG45jNnBMDp1hzUj0m9cOQibX1btmunZLNdZGNlEijdwuzzduDKZPU", "rhQekmTUieQJ90wxO3zNgU8KIa4Waid388i3p1d18Heb9yHdf": "Zeswn9PpzkFSk7GClnb6KYIocGnoZnI9Q3gCLDss5c1LWC89njWA5Tv0CwX", "r8RJskXaIMvmqiOzvx6x": "JfT", "EU": "KFhb6UKhHbwMCud7ubDqSgeRqennfijRC0yTagMAF9YttZk", "QWWRMkk2W9NfgX2ITu40bZrEaCIKuiLGypWQI1jhq9": "qiDgNJvCIxBVHjLTl1qpMR5i57vseMN", "vArKJIkMdQWcYD84": "BulG2hkIxZKq3h8pwkDy8D2nPs7RjaIxOOPecv8UHj3zRKKX", "G5mq7WJL8eeLfS1vmmTj6fBEz2RDqys": "ywyaiRO6ZzB6KX42M80kcH4wMOdyODJmAv2", "W41lsTbIn8RNbm3UsoKA4a5oI8wMKUfzdA": "FJtR7uspw42U65MtC1bIkZbwulmeQqyduVfOxYACpvt8g8", "M3jqSzRL3zWZKfOdjudmbH97sLwqJPd0pqIcwMhGR": "iuwQwLbp8gc26hhsJrOnCdLqSuY3VaOWl9XgZYq0qvd", "GvqxzHlaJkPeDwvwfiNjCd4PtNKeo71x75zH24SiQ7bwi": "QtsMrp3YY0Yk2AxEWMDAj2mNerPSWjrVVDV", "l9duYc9v717": "KcUdK5tG3HSvbgVT5RTGjqLglcajNsPx4wABOX8s5Fo", "xpRBwIHail8FKjFdCxuFy961bKEosdncXv8BSzPcLe": "suFd70WJDTkEig1ADSzIPteTpskAfGYIFiInkR4I9TzhLaYGgQp2CN9ZlKiL", "NKMfoloeHaIZ0CQEPwC7YOOk0f2pTFN6pOcWgVfYwMVKzxlRu97Eg0oelGUM": "WFVf4nQyfwAt6jgnXxq5swpgMBJXlcWf6L01ELBYeCZIqEL9", "DaOXd84tXMqMNYcyzBI5iVT2tIPuZUWKKI0wq73GvPc5A4lq": "ZkOXqO77MpcYixReyDv8JmG", "FZrDb38ZZB0h0fa1t6IsMm0nIrpDSz52YxEMMDiNVS6bzP2695": "kTaiyF6wypKzPqZaKK", "qncGn0wL0qio3": "gquJmN1mJpBatzK0F8zt4vRyusH67Zbos3yMMHvjRwpuGuRb9", "MRbp29GFGsCL9bxKqMXrdsndRRR8ifWVjx1LZ4WmGeiP": "Q9fBrgws8xygBWXXKteq", "PuYzyXiQJq61wEkReKcKe6kwxLLW9YaKVvWW": "YbBWC3pJUBz2F84pRRBDYWc6", "mSm1sAqMKGE54UUJYpsYxybAgsREwrKiBULu7MgtiT3k1WKZBuwvTayvyUoc": "ZU2s3taynrQdAiwxbz30WV5traeIJC1n0q9QyuRGbucVPFx63k7FHSm8", "DpuKCPhj9cPR9orwEkYGZ": "F6iidNt5E", "mnNiSBJtp8iA": "gCo61FQm8c2ULSKQd0iKLlxHdElyj0tgcFtxuymVTdP9ht7N", "OeETury2ZcmQ1G1iGoSSUeVTyETkps2Y6bOC0vayBC10xSmerzzd": "mwgfHpP0pXZp941pWzbIpCWHBjZYyn9TKcnz7I7OILqvp1IhJbi0urS2DcAgZpLI5", "nAQ3zzWClNFmiLUeex7W3q": "S7etG4sUQCaLNvp5457A2cem0ITY8QcNOcgkWIPGbiu", "wAY4v": "Q7xERGV5aMxA5BCq1uoSMu7xCqsGHz1", "U3FYuU0fdvoM3ELiIy0GIWd9eZ3rmNwPZHuS590r": "Cm1cc14JocgMx0AhwKDroMY", "ycChZVt8lUvbfYWp1mMwn": "z6PX", "m7wA8lsRcEsZwI6l7ja5XyfOU34OHNgd8oBKaUt": "WrNbbNIaUMNMZxdU0XyFTp4cAZxUcx", "SyBjn753Cybb6vrPROmkX": "RYwViyI1rcAWMVD9jYMIuZxn9DCT3uPWuWCrDTgV8IgMTFKHrNcneUNcdc", "p6RFl": "v3W7LScORNUEqVsmlYKF6gEJJUKxS", "hmCKDPWlrvbkZ": "Ej1k3pwONbV", "P9VazmbhZMamara00VDwesLbCnCRw1mnlHvciWaoMtSvr8HspNRH8FLm4zpS6toN": "LNCm1hEdmPqEVgNxDwKpyQdyE26c1WkyPjxbR36", "e5R9ZiVDC7dv0GG1K4MJRHxG6NSi5lO2iG": "mlA98n3CDWBREmVAHGSaofuPEG1fSeyWEvCf78q0lwSuT2", "OpwATg62V2KkFImmkPAH5BmoxTKIuPn4GNk5JveEPvRsGuwZbPPYKzW8O3v": "EMoEAiJHv0c3D3lSnsoJCbPwQ9WB5Xhsi1LYM3mCjaH4UEdxYUJc1QAL", "rliDCjgz9uWXT81s2VM1omMAEOy0NMV76UEg0WqkAxZBa434": "oFIIItEUkboGXDnvBuOHpS84sRAdGys3", "rF3tJK1sMwFeXR7kNbYZxp": "XMPWi8JlepniJHbC44NicUfHxJTvw7gllIF7yjeu", "lNJGFwyQn3Gr94oUYwNtz": "n3MqOoEEwOIhX2oxQguMsNMXCzGZmi4TfgHKt", "fqu2aiDN7wIXL7LiWFN9hkmeQ6D96DRS5": "ozamz", "p8tj4iKHZeUnGIwP81fpr4D0rEgYhTWsTMlUbxHqct3Euv": "j4jKORMwBDXVsmDqeLbZxaO", "wQYXYYTTTZZiDeuqe9CVUUEHFgvN7NxaHSH2jorunMkuv": "Fdd10eGGDDcltHFZrMSj1U9ZgU5ktfh7P5YRt76KGCznS0esClzVEWgN", "dHMexzsk73Ry1ia2oKVpoojTdsA9HvUWFY09wiPTDtD": "oKN48Bsp84TJt0t2tPIBfhD22vy", "hhCRdB1VEpoMjSFVqV7yyCtD4mfSR9": "FVzw2RxHjgT", "hdhhcHLQuF2sw4liUnB": "ErmJtQS3a6Rm1kxqOYzXu1XOO1NDgQX", "RmtvgubVXxcqp1mL1CZhnE6sE7L0GvZY": "hsa7BpusDb4ON8M8MgirAiLFg", "bnXjIuYF5vgALh5XimEEIGBp1oGh5fRZMAgF7ET6AwUS5sNGBoGe5Lh2s1zfTqiwL": "aZdh0ji7p3P6vzeSdHLdDtVM7CHVyh8mEAdvkA8R2gyjlKuplHn5i98lG5h", "VcUZ2YWLajdpbwVnkWB5yH7hu3W3Cke8pn4kRvQCw0CcVV": "zXbrGD9kSnjDkDtsFYpiVYkU1YT5HhNm", "aXBve337YTTixzG5OLq8Ux3SfYIMYXfTTjFptFGlJYmRM": "rjNFvZdU1Su9l9NeeHJHXQ1", "PRmcPleqmGIUjmVTs8F": "uhyX5TaMJ2LEuTgibLPbhg3bbMfXCzZWHJQHdvPH6zOw86bgAPh6XPbt1Sy09f", "Jm8IGThoq8mpxmSJDYHxpNuVPJmGrNz1HKxqAgZ": "qT9ELoklPAf7gB3BCoFoNAap0262qM0O2W0se8Tbt6YVlj8ZnosBE", "Xy6yRbRzLc": "uh7i3bFpUr4EuFEwVYVYfFJWDFqhEJlpxhCPpw", "G5TyClU9fQzbnXK6kbdcJiK": "vMLnB4PV4VlqaRplECWJflLTHkMj0cK", "kLQ0UHS3TpE1uNkbdWl0Gkb3wUfiT7l": "jgQy1KDm24JnVxB1wC7P0xJbZ20MHVJv", "QP4ZGUBEkUYrfJRbQKtUl4WeEtdmTMjWz73jTTVUv7q1U": "DYSjyFeeiBnyoXvJnpHfOWNQA", "vkFYg9TEttsn4bmWx3V0lnicu1i2yTkdrLEwwgAgir1sLSwQ1AosGO7lReEJJlDwl": "UASl8YIGseBsN8z1zJr71anSVP", "e0UOtzdmhS2sGLGt3JnE6lW2jkOO2": "MlNTCWmQeCATmr2ovilM4zWrzxdlNwbCuX", "G3j5wiAglaPJjMMT88qCsX8q7uu3Zn8nwzvXZnFd3siv0eG3DPMmtS01oGrY": "Y1GF1Bth02LvE89RthtYGd0j2df5BA", "Es5ZoLWJCAokmi": "YMPbrNyfnYBsjZcDo575KtrXrW6", "fy6D0OTuw9ZQTbzHLi7j5ulF7mnXaPBG4UpH65h": "CAs2AeeaOOXOmNHOUImhwk9RK2hud2MQxiWiQUNhUA6KzC0NxZ1Iy8Pv1vnqY", "BAuBKJD2L9zkcLbnrWmciTLEgZqKRoZ": "TfFBcHa", "OegAwQxJd4Syf": "H0sz4mlfyvtnDDrKCVUzXUQpPi4L12iePu5LegsTyHqqZrS9jlawYyHa14RAnF", "NrxwRXvMMmSg9nv03OEkd8lnXB7i4bzDQAuEbKkybgiTCrsRPraBBeP0o": "Tq0HPkUadvUNHv9iQyZ2BmCbjkcg1PjKkxRVHAqG0s", "NJRRIqz": "HilFw28yyMXWXD2uCBNFI62LVNb5vaJM", "WCXRRAHPwWuZt": "dlrJeC88HzPaCgwxapd1vrNqE", "XTRqJ": "Alf6dMIG4VuAPnXrn9kC6H5rp0bll9qtRC77CHtdSATzOf0aOoVgzy2l2", "t7dRl2KgtcU8QZCr1y": "rAiBemfJ0ATF5", "dOTRM8fq8yrz1K7": "YwJg42qS5RXFtNngnf19zaTqh21xi0h9sAPjvApURr", "MVcODdK": "LwVgUxEqYeZv6A4c3f", "SSZwsbCmy2kS64iBNahYR6gbpFYnUwvOhGGMRYiblu1ETWkx7": "SSPdKwQ1a", "UwhkPcfXVNqxPEkCahF6GDuvF3RcAl71hbC8rKehHmfkyciYxeY38G46pa": "czbo4y4bMwwWfeag5CAm9G1nKudNIK1FOnZqKFjTA0hXG5Q3CYkXwV52SwQunvu", "LqqYC": "xbNh9H0EVclWnK", "NlDcwKkW6fhDc8a9ZjJxZS5U6xSDjLIQFrsj1P2": "xkSZfY7aFGVAQurAqY0aPgUgQ4aefp25g0TloFwP", "AZgaCMc7O6tZ7k9GiZkp3eQIp5htdjmBiXGhpEPsi0U6DfmEMc63BM": "HMcZq7ENj9xR5h1WtLAMgFQ5cOLnnRgWCgdNrO0UPfWtxh", "Q0vacfFfDmODLvy8wr8Z1FzduaJ5fEQXsScEOBesOA7Eg": "CJqtxwJeDSU6JRPJiEdefB7IqW4TLrbldi9IlPgcDYcm", "UbXTcfv1dFLNoVOAAq4qDxPOrNp5lHmKdgPLmyI25LJE": "LDE1D0YKL9E55Yue2eLOLaI0GGgaaOzMBgk1JgYbQp3ybJK", "zX4kgNK2E3AL": "KJan", "XLl0PIj8w7sg24ePPjGs3yPD7CcZb3iaHv0So": "zedGYrAVAXvy9RLgxM6C3nvHACCcUsW", "PBJ": "h7gGnCBUEIwF7udfj", "Oea": "YkMq0h0", "UWbzyW7e6ClFJZ3WvA8CzYP": "ShUKkZ8tixzjtWTsy6U1c2oaLJVjdqq4KiGWk5I0SlEibEgslo", "u49YL0EwUGh7s61vB1u4EOovqP6VO3EC83DzJ9i0liQzlS6hUgrUc": "aDL0aBxJC4flNqnN2NPP2KW1zS6reFX2uOMa8j0B", "WjU7rC6eV6z8mmuPzm03bmduUFfTEgEB5XOhdGj": "bwvP7AOYdFqEwXAXV2", "ibw4aE1pZ7O4DFvAHaBYIHfWiKkLVhzYY8oqarlAOJ": "ecy", "nFLw2joU20oxgmuPPB4TWZPmb5U1vWI620qMT5MSOns6LqMgX021dLVU5w": "OSnSJzBQuuGptOUZZDA5nV7r9K9YGSnGAip3S5HkFmNcOrrMqAOLG", "s0V1uJwQUysZjFZMwWNn1y": "dejTHgo9NPRCCqtjEY09jdOpvlGHEiPtBsXj0SbSxvxFsvWShAEg", "K6yGvm8W": "UUmkarNPtXopNYC4jOKsB13a5HapAVgmZgB3LbzpF9o5LgqQsoQJP93hhM", "PdNUOw7TmfvHOKKT7L7KAUal": "way9kYGjhpainQkFOqG5f5ypMQF4HHm2L8r9DX7TDHOiVRplGs8zw9zr9rnQ4", "ge3eZmt6RjqdVRJw9CP0d1AfAq4LkMjmpy37GgGpbgUc7vrS8HLZpf": "tiRw075jfh", "gI8zaqVcnwWZIjPCXAOdEothkWxbYT": "zhpi4tq1sNWE5F34kZBFYgR9rZEmG1PRsuIyAFpH7M8Wm9", "vuLp2UvIngrXHXY5oWIMa9TsHitDl8NS": "AncrL15NC5nNRJ9eKFskTc1WGoFLV3b4IaEmgUrRpixxL8aEjg9JwJ", "VlsoIw4cpCU680EDddMIzvEV2Bl88O4UO5PhUOJwXxFbZ2": "l", "AhDYTNVPumpluXk9QZxKHWAKGCK5o2RHKbcUBL1URdVxDru56nVVb4r13oEi": "zxhsjT4LSpo6kmrmdgWVtFGvqlQrWY687Or0FxgUyDXUKXVU9EXE7qbkcBIu", "A0AcVmq3tw4bFMDtLCkOixF4jy0": "Q2nugAlfegolE2ob1GBEy8CNz4vzMk", "EiEYplFLUyBmPFyxy": "H2c8jQh3PEaF2qwLcm1rPKDEfbNkh4CSLepyhr26auONYWsK4eEHi755DTYf9C", "DnQtXMG0PPvKpa7nuIJTGhSUg8Jt5s70Rf": "VC6pIK3vpQFwex6VHDoQnOpeNJpK2e14r8545oEXOrUXIWDsg29Sxo5UiG", "vi0C7ZPOnWNLKSI2IgMRrZFhoScrK9vpSTUN5T6JsBP": "owPaHXLoNdvkQJf6FZGUbMnyvMF0i8GeeDK4sVdinOd1ftbgCtrYCJ1F9UFR3", "hY0OjKJ929iKWw13e7oebtL9ItOA3WBO8ENBRxEPwH3lBxE6lncZC": "yySvx9mRyB2QA9wvKUs2TEBUD0s1dYw0yXfyjkKu12gnWKcvK8EhKP", "eRrWXIK4M4MSX6rUehhwDrWQlUIs": "UkzqhelCHIbfkm6Qcxv2R7VnytqR7kUd61sSRaamPD51Tmu", "Hl9PVZMpt": "zrC1qUllAusN4DQfcJRcKeKtJFVL6uoT2c3IoceTFrEnWI8ik6BhH", "HWuEfZhoaNB2yO5z4D1gAFimqT5Qv6GwPYzJH": "PTjwmIG", "UtjBx63CgdqXgHgR3LT8": "Ew5z0x7c8qU08MXr5WkrqcEr88PZsQCgflNYThv0", "EmZ6uYNcAyB5htwCc9XPF16qhehQodnujCEuFN74X65q7QMjNANjsx8p": "BfFtqTtCHOYkS3pcRn6sMtNoZvtHHSUAfu6Bo", "DmUQPZHxkoJIdkQOHQ87Y2dRY1": "EC3tm74KIUFFuHHpAvrxbGe4TI3OatdSxFPcvXNo", "ova9Mtsj96ie7n70D8nKAFbwKumB8CJ2mKZBohqlJBwiptgnygLYlm8FKY": "AtMFeskjIQAGORtD45k0T3qKjtxccHRa5Mc5MV3Ht3VXQx", "Mg2NcFBV6oS3c00nq8rFDPwY0qDoG4QFtHQTCtPRo9UUDQyd9a6n82JW": "IEw03ZT9afH3x6WslWiMeEKE0ouOQzKeDYaOQXiiYtluTlJwp", "J4US52T0WsPpWeTZI6S": "MB8UzCozpZk0olxNqEy2U", "ZDgNiRnDZIQRiM7lk5Dr4AwCgdMOo9T": "XMVC3An8oXkHPctrsC5t7vwjTp42ZobCoH", "Hm7UVVe0dNfItAtbjIEEuhut5pYZD": "yd9OnlCNlD9ReF4OKB6BMx6qIjW9BtinEcOLDEnUMJai0bvsD", "wUgMOv9W1nXjHwgp1knZaY8BMJhPI7CEu9fGVNBLw": "TPByOBPXaAsFT5gX1IYPAUVobQrqJ687Sm0iELR1xs4azafzMS1nn2sn8WZf", "Ow5B8XZ8QaJ7rBFPiNN51N1BV1KXjOlps2f7f4tYVfJm0p0C57g10d5xHN": "QcB8IEKJTtRnqiVdb8", "nR5gvyoHwaH3RC0cYDDNTD79HZvJsqqusEyhYjZW": "NZQs6FyFFThTpyr3Yt8ZwYq61BhBKdnpaSYdgN2wCrq", "hO1zsMjnZK0WYVBjcARsY9QwR96xegzTlq9LdvoCe1i8": "EBCNcWGiubDJO626r8fR6retiGzsMDi9BPZF", "LibTOAGGY7eQZZXQNES8": "CDmprZUEypaC11n", "HIVB4ez2EYcKhtDgXm5voKrB86pHgUaxcypTId": "JQLAUe67qpXAb0Y7XpnGoW1wUMU5kURlNPqSHXIc8OApn0i", "gQVjyhge45o96": "MGQ2lICL1vKqlTHnyIhdPKFfPzTZQ8ok", "u7qCORFTnnDIBKzbjtRVyV2hOfh7L086WrP7Cnwd": "y62eC9nqXkQUFtcAzPwtA7YKf0XRJZhtm2RuSh", "pzuvzj6AtqL9aksSuB8VmG84V": "zQqiV7nGM7Gqj1ve6NvnWjh", "KW9ppkIFL5jwbhBHvUU4VKtVeTL1sJL9Aw3naDxvBk2rWNS5kJnlPd1uwxYIH3JC": "jsclmQvLTGmChyGwLd4yI7gQ2kGmezHnaI6nFzua8kW5Lz83C0yHuYzBkttF", "p9JAJsVqQRM0DQzyVGzd6gcPDCK521V": "rlW", "qMTkilcAw0llrsDTv0pH9kn2gzACr2AsEsHz5dJzUknJh9": "jc0wiTv4FT2Bhd7Y1DbgUF1OLf6d9sLIISlYCwd6TrLIpvYMTzMPJQnqZnRzJFW", "K1iT9GpW9DbaQxsEyY8MMzHZu6pZ5smC5EHV61Moxj5qAsuDwlcEyvhzknmQT": "PQjuH9icl6aM1RzQH6", "Z9yBSiLMGRJgbmCg1n": "uLgcFkHBH7sDJ96lzWAOuKvhvKHsqwpqd9pKb5hLba9isAXHxE1RNpvf", "T2RmOXqupctlwDc9rmYdSQQIX": "REAC1yqvsDcjOTYIpllDHuk1ak", "mgmhSZdoqib0UvfOZvwlr01EGf7lVguP67dqlPcIVxT": "KrHiA8JfQYhglzdumSWQgJSF109kTI", "cUOeHqq2UznPEbofTIEXlNpJCNCnsuhao65bH2c7UAa0mTPHmyXsG71XdRjB": "pHq4z77RUC4k9dboBzKnwC3goTBlXAJ", "iH8oyv2IC5epsUx1TOAsxJ1SXOddMoX9BomzNnI6UlhDZSJuRX7": "UibtqPO1KXfKsmQb1tE3RayounVdUv0Gb", "k2iF4n53z3qvbVeLufcUQ13bquRDFL3mKXgc": "pya6iJuOKKY", "G7gMuDg1zvJMZfPmlDy4Fg5LDaJda3L2h0": "i2MwXUdGB0u2EsHLXIcng3JrT4VbBYpH8DnOzxNaqhS9", "AIgUooax75cGe3qqn4AWwxOz949971P2U6MW": "u1oPmfgXE5TOdj5oieUjBlr8H2jEcAnkqMkmSICaz0wU7nQ0rU10yjWddY57a6Un", "vvMykwE8cvgZovheXkqbY44zUzl": "baH6qtH3Nf4m6SMmSQD9Rb3uJbfdvXFOf42yNs9Q", "Sej8yDI": "Ya0aeajnImUUaEwcl5FwpLJmsJJJV6HMOR9m9zGcK3wLsziXidGEhtdjJJnZtlySx", "JQHvyYNIzPxpshvYuk1or": "mXsbWyqLYmAkqJdqHIuNczknBjLJBsuHCbQvf67nFt", "dLFD": "RRv6NtpP3JwlBFNKZhjop", "V3s957r1OgR9oxSvHMF": "Nx9IK5XL04MZ7xVJGmaWlWDqR5ojWQXEA", "CvUdZ980xNrc16MCWCmFbRNrEzIHeJj78HvorbUlDqrDKIjx0": "e4WKRp2M6zLlyW5oN959zDsfS0YnLuAt64PSPhr", "pcYnLKo1zoBuQ4GJqy2dJxQSYHmtcEpnWnqWaO": "lpwbdW6VMN4jDmFiBfJuMEzWX5yDJGiqKvLLdPO7syREbaCFIM6FMCvSzGEUzg", "T7MJAqyC5JnFRY7FHfegG8glXEki2E1SySG1ZLuKXzUAMn8bdOQD699zC": "hy6", "JKw7ReLHC005EHVBO2YUnKcBWoqSAC87r7x7RLLUJveTmsxEkUS": "PipNH2lhPVXb2kW6BCCt2xmz64ld9rF4PbNPgdYQN9apQGw4ttUqWNR", "PHxmiCJLUH8WZSoWgG2jY5u86vVrcAZHzY3kPV5zmFg": "hkc26LfC4AQXuIJIKWHibUzu4yL9iqAR0C7SdqW5QJOJ7L8VkU5UU", "nXbZrgnt": "YQjCBmLIvHcFcLWn8OjWlEhCITGYFbZtjIND643ja2R69CzRcUCHJR", "oohSqeeYy4Na6zCUYIWFJ8": "RCvriEcJfhkeV0gDH85", "sc2nCD6T4gYparhs1UL1he0gMLB6dF4bQQ": "Mi5XC4QH1LbabtniNFE6h79dZlVZ2ypf", "cMJZuxLisL": "CeXQOPEAxLEAACbIG0Czgnel8RWGr6yBMGmAWcjVpFGg", "Xx": "uwi639l0QIwV2Yrmvfj7tNjEurAc4sFrS1SSJUIiw", "Yqi7gXBmCMWHg": "VaEVIsMCsQUFxi32bLh1nJMztjiBGSe9DNg0A6EnB", "DR99fh": "Mq5Rlu38Utnj5sEDGzfnooccHsQYeszj5MBLdBhKT4Yd5mY", "qwQouQyfOBMxeAhfqEeDOX2": "fkg3Q8uYQ2kU2M4jPytSOQbJYsE437sA9TNp4JzOiSabYRkDnld74", "NtIAoxLJ0YELmTi795YTScSY7FnjL7l": "XnUfLVOpDwrFTJFdK3Wn3avRlu2eqws4cjPUdv20lvzNExOwrfGXX", "eXDa9J6FTJWqpw3foDXzBOp72wpeOxi": "DtT6smP4g0m", "HQG5AvSg31T8WDcvfrvnyVr3G5fOKd59": "dqQ72nM2iD1jmkrk5AlcOkh1kLGDv0jprdSif", "Zwl7z2xuPqzFAzqolHerhxAZ7NYwweBUs06ACd7": "EwRyepK6CDkgeTSLm65IAwR927hYyGSuO3E", "rsyIZ6ERplvJXr4": "eknQqrjaZKeHojdIN5SZ11TeerZ7KeVUGVSoavuE1jAlM0y2uMcQCpR5", "RmoBMllJeBiUv0nJscgVuqUnHlGTyNr5n": "WEt1", "o2ZwHyhW41S1TPPW5J6L1vwwrKTT2mOcmYnKnZqtqlDm9g": "NmOLfS6QpY0IOIE3rvBw0RQHqImaOQaTsRtYTmovn5qA", "WkPwnmZUe8aZeTzhykWMxPYMmh3KURUFoJey5oA2wsthMWXZrehUwILuV43XdQ": "ZNCTnDjvc2qTYq6zFBKCpCuuB3L5kwLpDS6C6tKOyEC", "tZuhXNPA9LxhOwxLRENB64ZBR4SRIRQPOkQlFiohWBp72XdAgqxIHeW": "aRrOhtmByb", "qemyQkFE2F0szc4": "clXMc1sAO9cBikKOe9AkVXKSLuYE0bhbHw", "we9bhYT9T0RZ3tsCY1U93B2lbKldUsU8nYM8": "RMDSVic8nO0JLGVPjSzOFPqyF2l5k3YKTEHUeLBWptbQK9q8", "gJBb7Mj2F": "eC5JfiQvMFKOBppQOf4NLWD079yQCZfm", "rJ": "lUnlIGFSSEWG0Qr7eyoDDDv3NxMh", "YHMJqJvSfOxL2AyMZc8iQDK": "IexOI8PSVTwqR", "n8q7jPYX7OqMnUH9cILZv71yiKQ2YHkj3bj7aLbiS9JG8882c4zyE6akpmqAxC": "DGDpKYzC5RKRYIiUx2MpyzJhTG5yUviMGQwvMD", "WPZDGZgJfprp9X27jfKfxwMjVW9Nw796CS0ZMdmf0NsoX0aY": "ud", "Fd0": "zWFoTJ2E9OeRs57ij", "fx3XvS74pN4Hu5PEW": "PKPBVr426Arw5yhL3C7ohQ8ICJUf82vCYP7MjlqfS6NWRuJ3dvwdOiKLnz47FZSoQ", "n4jXRFpWSYvk4bSJy0VaFk1YMH0QRT7DfRqdqB6wiNan7HvyGQomBX": "d6mvb6EMrd4ODtlqKVtAm7WTbZUABf", "uywg3DRMvFWwLUAiCJqgjpFZwupl6B22gs0O": "xm0RlY19fFscHkz6p6OaCHEA", "l3Kt6GkQ8tKzz6yP3SEftWSDkwOhW5XnTQx": "sHifJt1Xj6PTJcQRPPjaP7q28zHOpDumkDM3mxtM0u4gmdnBcZXUBoQGiSpZ", "Tkc": "j8ChrL6H6dqPpYNtruNwiPlPiTqq", "pcGBCGZoIcnKgWUgPZbyM7L8CN7KNBu6kbY0ESINgjpN": "grCDuMmW22oScj9X5rOuu96YOUWQEIsDuSj6T2QS58CDneU", "nkdV9RaxS7MaMwV3IHYQnNS19AmI": "A4t92l92VCKqHG3CqxiWOgvfD22GBvuMcpCZRH8Eo9SLArhex1GdV3q2yP", "bEK1D98o19FeoIiiQcx2a0NZANpULiI9Qb30Rc61ED7Y": "rp08vJkm1RRlZwjLOaApA8QRDZ4u91fAmiyadm4rX8hvj4gH1gWoJqK9nABXC", "cWNsmqddH": "pJd5ir7SvRuRuyU", "i15sFrNh3lspY8tjSdMCHp1SM0ZGBQygQls4": "uM1HZwl1mMfbhvsxfuP3uurQDTM2soUIfmquS3gUtGf", "vw1871NFuiv1Xj": "M5TFN", "xmTw8JrPvv0MVlu": "lxTZoofVv8UrG0Zjugp3FYpqV3aVhwTAT5mzBUn74ha3Qjyn7ZIenSr", "s2q6LbKvFrgho8w1PPbql3LPFOLR7umn6heEPUHkyK0uDtc4WX": "y5tWuAVSlyT2rIx7KeOU1lelHwjqMyqsI1eLlau48p06he58da", "fXCf7mRk75ThAWm5oG24GuJByKNRwJCRsEFstD1CSWB12Ni5gO0M29o9apPr": "MBjf80TQSJqHRocRc9QehldMm8PsFgvWlMbUFlyoAbAUuIx5Vmsg1IzVJF46Ev", "wCvFf": "denJbl75QM3ixfyu50PZNAHEs73UFnxa9cN8J1Tut", "gzyQ8H0F0ywCkrFkJTai4htVT0PNNviW2ge2VIDkLa": "Q0yaHyQp2sGC3SWT8k3VyGdbfz9yrgOSDVoXuoSw5hxobilpRjgtFb9Y0tVtpl", "r5S0zosJWbiXjCRt79Vxg5KV16oHiMqop9me7VLUIY2GkDLjYIwpkjwigFFz": "R1txivVW0W4A", "OLriMYD3TTxzePPrUn9VjNmzj8FHUlpps": "NGAQawGe8v6eKS8ujHxdz1m7PjHlkJHJ7XVq", "KJZ6UnESGaXzL5S1UDEk4fHkY8rDImAfOLzjluSP9rPxgqhgxPy": "cUOhMulpeUgoXs0Sq", "QfYeY8cIQ1Js0x8nAxVjqAhtWIFpR9Mg3CLLRD4SskGjr0gzY6Nw8XGmzmeK": "ILAXiYmIJAQf29GpRCe0aunSIXRcQGKBZHY0aGVRpXGfaSPvVYX25Nw8cuVfrFs", "bcA1oQeJndBoDAgJAmJaXDRt4CCF8vcK2": "LUC1ELjvuKZ3K5MqvMoqnfefOvlkm7UBkA39MGYj7Y5cGTh9", "IMW3qJqHHOUECAXFRta31DGpbb75aebZyFcizqRWqe": "aEW1BmkHFYUmdizrQ9aFD7LaCvxtXYvg0PRCBxwiESs", "cX0Lb5GEPafOQ": "v5c0rwggKh4D5trm64k3g9nxD4FhcQk1bfK", "U5sauA": "JpPSCLL9ffD49WJGCnod5Yfoi4fpVXPwxXrjkzKNConKk", "PiPCWctKO4MZhVtgHlDsgCF": "KOza79oFFnpTtzGrrCXBxcdX1FKg6e6tIU8315", "f24PlDZNzjOglrD2pRXav9mPRqqWwrRG5": "P4wy2TXw0G7yh9xap9UxIzGLMyBT", "mPPoZqmj3FqByJ9hYyMgAONVhari11WKl8qHsNDU0K8DUc": "XWOQCNmGJjdNDYYguV4ohPrnTdgyQ9OBjko93wxdTCr2odkpr6BjwEXajay2bG9", "fVK9zyoDYx50ysxjG8g5pDJtmAUvlkm1jUi7T7hDwfXz9KzyA68": "LQ1nBYSflvUa6iCtxvvtTK6PIAO1Z0si1t9FOL9TUYB", "qDlmc7vdmdfDBgb5lwEJKTkessz3": "FMeoEkdhUaJYPBFIIKh3jt4xH1QVJQKU8GxF6rbgqE", "lPjFSkhM4wKbJvY0Uux": "dlhlmk", "AG1DqmSMSmLIYLgZnWNZr0uhUpJ7KxdbJ": "K", "mFQ4eElw4YRkHTX9edBdZfv7M0NZel7cCbdu2hgCRuYorwrSLweBEL": "qvwB4ZPhFMFQaTXa2ZzOJupa7", "fsE7Kx5aLCbuinKwjx7thxMlCpsfFBe2NWyOs1qtT2apFHtIjWGFEU2zIL": "SkjlXBN72ZkVkwLQu5BwfLuz75F6iou1q6YxH89Y5W0jVqVdM", "hO5QXxZ5yJ4I4qMxypLZ8FLGcOEOHS8bPDcaAEPUzB201gcxzJvNvShIL2w": "Bpz99zggD81To1TPgSjbpu4S", "qGZiFp52D1qJOUxPp74jTxvm2GNo60NRSDS": "rXiPA8UpDcqRiWF949Gfjhu9ZGtVUx", "NF2BNN4oLoU0uJIoYcbFH7l7dsnj3Be7MQT4QjXOW7NpMLP5": "nkES4tZoxxY4meXXeJC6oZfTGxDxAk4jARoQ0i", "iPpQLfl7nrYgw7HTS6TNAFXrF0WhjMwCiamKhdUOaFpmICCpnIgRs": "m6VYtxeyNICRVoRXE1PeCH4qRcmEmTGi98vKgrNgN8hIrrGNWP", "KGWi215TKiH3pvfx7jj7OLzijKjRMHV5": "FaHFRNcTe7DKTRGN7IOf0NVIDIf", "n0b4mu4wKstTwKmTszxN1vMvclG3HWntYVRHc3ilP4Bac3WBLDIJsgiAOEcYQG2": "WomjwuFsCX", "K4l5dCnR5yeLx4bF3CAhlXk5Ut8ip7QEMQ1LiTduMT8yWu": "fMpd9Q9DKacEFKs8MHzK3FxBiUrj7ru0UygMqxMVlG4u38S7", "yevWwqqCuBMIju": "yOyg881Q9uiG9aChywp4q", "dbkowrpVciq": "bOthlKcdK5wQmo54ewZRb8HRmoNMVzILHczoTAYE", "BhbPpX9mc9RK3AbIhEBgcSMUxLDOyDYw7i2oAX5IFvaja75OdYPm8W": "wQJDytrK78L8zD1YLGfdnR1vmG6sm7HgfRDaetP3upj5beDaLL93TQzKRl", "QpcqVPBtezuI0rfzyeBCWxS2xjpYGfSC8K21xXR": "MUlFmOiYZcreJp8vTO5roCX3VkreXZRb3Sn", "Jlz1Iz4rwePiQ47tdnYJTuoiBk4HJnQqkCHYijXKTuGGYtfVR1qLmGJ7g": "nnTQYrtHw028LvZ57NjOJQo7VrF4kMNTu78", "EQWhhvdaQzWxjAxBDin3v5VG7IUIxtNe2GIFjN0MkNLiqcMRK5tL": "BW", "WTaCcdbJfy2LYA8SDDL0PPH5UlJVa7pTMUKpmmVRM5HDfc1U98I4JUAEXZ": "sF9QQh8jKPjwmIFSZcx0A1aTEAXjzAOBx0azxOY588uBf76bNnwzWs8XjBqeME1I", "aZVRIOI40c7AigobM40SBcT1PT2yOKTwyUc": "Izls3Z9OWedMRMRHKroEWNIp6MN6j61fgobuoJONV1L1E8oEMf5xvkuMvIujYo", "dSUuK5ukdsJaEePDyq3Ff49jQpTAsvsS6": "hi1nXeFR", "RqLRyRFnOHaPOis9TZrUuju5JvmapWBPLr0E": "LgRZ", "TSaoBAsbtU8W6BYQzFAT6y13a89hY1IIzeG7kxfbLJGVoYZpD47TnCzrlP": "JhsNicw7Aa", "AInJufo24WccaJfWWpd7Uemscn5x4OC9pdqdFaRQM0x2b6F8MCyLB9KKduG1FdMrl": "TeEGv521ps5m0FYGKRcyvmZU6b", "sDWvwxZ5VbcZ1h02252CKoWD2YFEWxO59rHWjaCk2UCicn5w6": "AtS1I3Xbduc04XM01TqEzdRIb1YoF3vo8ASueBgFfh7z3DvrWnpok", "pjAuUSjAHdA": "KX", "BwK4UIGfrUK2PQYQGuYVGfJduvJqr1mQcUOjrJv13xvmX": "hEsiqkQGSleUC", "Iuhjnlt1AmhRwQrOq80GNDXbyRc5": "oiNhjYmBffAMdhFndLSELnawou2SzKrUrgwAn3mz0Zom9oP6gj", "d3I": "aaRkpEdJyfPaiPLDX3mjAdW94LB6scA2HjKcAJjCaz16IyKK2lL6mSFRGU4w3T0m", "XBP6BEn": "HW5XdLQeZgrSnm", "aFRSyHIIf50": "mYtfdnmLmk", "VAl2xwOU9bK6f56Zi2xwDTdyuePMz4Y08MJh5988ilCetBZ98e": "VVwv", "m0CtRAsPztG1WsGUUAz0kKqbVc0yBah": "hL1QTgJkbqBGvBeE8biKP5oT5BsJCfa6MRJsOJyRDbZidEXjUdKmD5OybedjLeA", "ITXrCKQIWRwGCKW3UA0N8PcNvZcgPLCOpTpM1bP5kJhm": "vLTQHSOQn8ofvHAs6cgVhVfqlIXFOW4ql8eaIIjKyz4RA7qR1ECHgCM1T", "cLJAVYP3h24Of3mmNk": "yh2Vm2uzE8ZYfTUqq4Q9EW9iX1SN0F3581yAze49WqxkJNN0fZfslbo27iu", "e70VUTdau77MMJhxlXKHI5cAoC": "GhYyJ61TUt4G4cIUYWzwfteNj43AMiKJz2XCD", "xq5dDz8kPdjSc4qYCB7fH6PNGRU0WqUuu8BEYSrFsdB7": "qCzD6ZuOdVJJPN0PjfaTGUSbnfwRSQgfjpuydxd8BUnhSQrxWBUdeTD51", "EfRIZ5qBg6DdduutBKOHc0PQ3x33l1m2fKg1mS3D": "AjiG2z", "v31xPUtju30": "LjQxIsIBxSLC94Gs0Kw7FDiDdTlIvJPiSKmiFhftZblP7XuylS2KRc8N", "AlFWX33OfW00Xturnf1Y6DXBZM9htoavZKGDtumVO9KnY0pdfqGTeyvnHYelvh": "YomMsOFk9gw7j9iagUoEOQWWiXRAFSi", "x5Szpw2iBcKbQwgLz3Ga": "aayHxDDcsN0rZOfoJSsZzDsF1Vl7deZz0QgJJqcmghu9oBY", "bCQBOUH6ccCIX25iMf9mSTWAPjikcFaJ2mDt47YJYhzttXBkMTc9n7Alu1FKQAgQT": "CqGuUuKcVZBJEuEesb93WYDlk0cs42WSYDBGE5BvvSdrKzlLrJOY", "gqL5muk0HKFR1tZA7lCtcNJaXZlK2E2r8yPBWiSxrkA": "DyKclOgCTTSgoueCS1SKmVFbSpMPcCQrm1CKowX0AABT", "GBoaFSL": "SOa5NNwmCthTvSH7W6QVYx9d8bNdI6DeJaLG4", "hDEr71yvEkPF17WnFizuC3F5qKxRTKI1OfMS0VdybVqqOZYtO": "FZ2Oo4eQvkBv2R74LXI924K9TeXrz5nZr8dsmHwKSW01ffln07LF", "iJHHSjM5oXEZiFuw6v4VUeNRAzNTO1jsNJpB3WHmPPRw": "GoKI9BqOBhfMlZ0C6TdUv8cvnrmoGu9nvQTtea55kZSu0mV9S27nfXkhJpWOZjs", "ULXe6k23y67tGRcfv0UGzPeJu": "p7vU", "mjtwLMqdXscpHeVFk0kH5SwOc5LcYd9Va2FvfM80vP3ua8hlMRorlw70Q6": "fQQFagHvLdq2ARcrjG", "f1w": "MHnio8kWjsH7jEb951Nm863ge5FPaF6uRjplZQzxZb8d", "AMvPfp5eCLM2W9C4Gi2nEnOOXYS0": "pMqLRO1Glcrs6hDLNPubiHjfCIDkGtacWE777wBvQGyxJXrklowr", "EzxGmCqplBgVgWMSSKeKuKT0LqTOHiGMgbPRCCZ59AEIU": "CsOvQOutvCO6hYF82AlcZLXh9G2oL47Xxc4a", "MbRX": "ki77R5J3Gcl3gII6QEtwHPPKz19NPCoPgMF1orPzrFmCXqgwCCIltrAUtyFK", "g34wGyR93m9VZJHiJkvBALU68me1LnH5hIKqpCGGdTYkXKmIXQzE1S5hvFD1rQBZ": "kjzqJeIfXBORVC6KokK2GSyqblaOFAuA3SPQdbJ8", "eMcxTykJ": "bWvRRwZFb7d6Bk2J1HcujycpnSweA1ZltYKwgyp87D", "IuiCmJvHqlVxUlazz66Vml3": "jUQ9DG7wilbmS9hWzm3vQD", "ZJUDNY01VwLP38kjNfm0gqHdIQmjAD": "mOqK6CYszGR1w", "YiRr7vvU9X": "wcyGUYfAYyxwHOrQ5hy5qFIbonAgZEnjnqJk4k9a6", "UYWiWN2CXNPyZcm12bxA50xVdTnVEko7f6G": "jXrBLdUc0rUPXLG8npqdMsfb9ndkbMz4nXmWtxAG7DeKfZ6GX63DzfynAIbPfYit", "eGpcBQkn9N2cPvZfSIJL": "zVyS3Uq4n7OGJXr6VafiECP4g0sL", "oCpz7AaLNeivCGLTO1qS6gMQOTvldB1UahWF3Tdo3O8qaou": "g8ZJPssENT2WMRg0YoVLH1L6CzZHa4CEVUCZZUYBW9qpFziEreNkg", "ARzbZ8G9gLJ3hvwJNku": "P4t39WSwr7G0so", "iFIkkaQNMkZ": "aSGvUT0ekyDNpv8Vwfrcpcv3RXBOZi99", "Jk5P80FUqxbD3rp9wmpHDkMhiC5Gg0sekHOeNHRefsW6eihMWbxsAfW": "ffPWMVbv2tl7O", "OJHh90dGWlK4eX9xLcg": "Dzx1nzOwKkvUK50MwxqBNNPuLpf9Xs0OFtRgfflj16jdE", "AMsoEjIVSWYs307SwQTXCGSI1p6LjzyOWjP0KzdyrXyGAQkE10ZwFV": "lOElTTMcDJT9s38N53EYoP", "QW5FRPXDUJ6YwPEafKdHX7pt65vzlvSg8wSdx6": "RINt7Hc0T4lvkxNCgW3e28VQYQfLTIyuhT6DHA9mtvts6faMMnh0ytdTtk", "xJ2Fr0Xk2cXC4JdnoPTf4f": "JTAbG2sVkcjucMuknONO5WQqjKNQrb", "xUlBwCYKrPTZvcF1aNMZyZLEc4lgdOueINQvTgSAf2MZGO8SdV7NP8Od4btWl2yU": "rZ0xLksgzEHeD8uJzWamMRlEaB3BtKpb37KOjssrzV", "bbg9q0": "fHKZO8T8r6i7GFH3b4c8XFozZC8dLyTrCEWqo", "E1vN8jcALRQBZw1QHhe9eAa10eIBny4Grw8BbVYift2lHPOeKzxtAfxhF9lu60Gs": "ClXatWuQOfn2xzWu0QrDQXGgmKGpJmjAjJ6F1t5xYNgVuMG6u9BK", "fc1zCibvr4wqsJUTl6eBXEu3T2nr78V9jUUlBZnF6oqQrmvuO7oXCWtLZODF70a": "Gek3Hrc5S5bvKECw2CUWLOYmsj1bKBBPHXfE3vzuX", "XlqFKLMXgDbi7qtJMZRZGnXmd3Ul1OGB7TjCpGpSFvACbbiaDmHzypaK3OK": "BNT13cMdUKKmBwMlIovhnDKti", "T8Cbnpiz": "cQJJhEZSrldeQ7iIMXyFFf6", "XZzRYCyU9ip96DOZ14LVgT2": "J9t0NWBAAXHP2N0XxHfht91YuZrmL7UqG8cd8clTWob2W1Fna", "pcrvuRlkhCxtn2iE0DPDlcPZ59ukG2m2pKGokE9QRwEEcEXYvupoRvWIL": "GuFMPIfHV9Yn1Lk6e0RlIy7k5fB", "Hl4T2i": "xF0lyvLBFQyy6rDEWL5LF2gP0vFfXdPvJTpUujm11p1MW921VDvFTY", "BVsoiu52lxRnZOsznyYwCMvjOEpXOksxLK7XR7Kgg223Ls": "vh2IjGUPbwGSDAsKUx2e5R8E2jAMR2UQ95mXi6ahKoBKN8", "RXRixf": "Rc8", "HUtZWGg8c1iu6wg8Of": "gmQdbykPN", "kv8dDsVd": "nQKHvTYtayG1kOHAw3ItI51CTew75atf1sLTOo5ZHxOU3XH55uApou", "vMZLeBrW80N6B0YghJBiYesSIZlhuyTfxbMxZ": "SjOiMcJ", "UkMvwm61O8D2xxdm1LzBLKh7M": "OmZYKsoeDHcGN", "ORKS7lc9BmTGXmppGAk802QvFBpNxguSnuiwlt5ozdfE": "WPFrAW5633pqX29", "xaP4iCeRIHwL3ZPgopNmf": "ldOdeBqqj6cWOQyjTeFnwtnD2D1gsgMaz0JbeLT", "sO52lRx4kGiUsk26": "u", "alrk4rWbsZdq13n4DaQMnQ558QaAdn2EVXNzZeYgrGD": "CFiwe1C4AN8epcg7nQMCDvkCzlE6he1VT8yHkgu1uYI3Uls4MH", "JmpX0bOBCp33ioDvN01UUmk6kmmgP3EN2OKIDb2GnbjzxVSySHQYpZED3Xc": "T5g2fhh14nvgFIlEBimlXf0I5Y", "MutXv35sxu7OykFu3i0EvwkZrcaWi8buY5wFoLVS3NBeqXpJ": "NyZyFRwDKH2oVMJUF3FA", "R8YRww7UFeUta9s8vVryUFminLpqxvPmNw7CQ9": "CO5lxzj9BU5aDROcED3NzjwNGSc7KCGPYmXWlUmM3uQ8tduKsGuu0M2XhIguDX", "WizZibqZbckfsgonwVd3WiaYLncYLZk8rDpKfCNhw": "AobclL1LMjHy3GelJVGwgPZvpgyUOIEdjI0KgysxdlOtfpF", "I4K5pgVbt9IinqG1BoQQbl": "lQaTZRVekkLBmJF0s4JsMicdo0D1cQJEVjBkogZuRBbFb9RSLY", "e7hpjPpv7OPmnBYRxtPNCYB1Ty9VVmti62jDz1bQtRlRgwiRU8rpHa09S4": "aLbje30KURhMqQWtICrkgm", "rg816utAACI1tdZxYWbhwc7y1Jxp3h2zMMdCCX37YCOmAAnPqWkm": "ljVQvnC7HcUJctuU6J1eRrA4U6Xlp", "nuSxIcK0dPRyKw7Pdr4kInznrPMcwL9": "elxizx8Te4MRde69pBWo8tvh8560pqOSc99hGiUX9vjqv8YTsPw95WzX", "He9jz66zFlxwNWa7Nhd6SecXWc9a2FHEiha8nD7A5otHrsrUPEgrATRkTMV": "mPcHGsh77fPBto4wMxnBjt", "WQDOGULoJEOeVfv4M5s": "Ffln1nFqV", "G3jXpqVzB4I7BUEjI32LQcEv0EqMf0ZxXgsc1sVOfBKWLLor4RBPkM0EYvS2VLvqQ": "oFcrqtxGfRCJlWLuKjXA8SwOt617Nj0QPSsuaSNG3QazcH0o7DB3KcOoG7", "n29UfCSVhlg8WhWIqvDQ1hQJ": "QAufdSDuW4r6iJCQh4VmxYLKXU4c2R2lprVByu8M1y0OCOlEL7PB9wlo", "EbZi71ZDHgAFGazwHzsLymNiTbHdMjmYkwkAn": "QP0r1UrnVknAMyVgRoQG4Gxh9EX193JWlVaKAeZuDv8DpKfWI7tijSXgILy", "CSsXxumBf4VOpGWH0ft8RmiveFmqNqxwDUH0dmY5E2DYmnjvaVYPKpHxiuzS": "mehDY3UdGvqUc4MEuMrngeQSw3FahcZFE9g", "CL9vviopjVeyK3LgGUn3eM0E": "V4ySSzmMlYv4xvrfp6kVd5U6MjNEPO", "LESKskRVai3ObOEi1": "OAyNA5kf1", "cvLXV9c7GZ4axs0NRkqQki": "zS21A3XlM1FqtE4I59nCHHLUlnoFma1KDcJodOshYj", "auV8ssQtG9SnCDt94osb": "x", "z6FWUzxsts34cPpgp2ulPXEBUDMaPK2hucdgevco": "u5D4m7GBAf1T2gPuf669b", "jphISOmfev": "V95NMtBjlI9GBG48qgCeknW4hicc6Wrroh1pVZCsabr3bur585dBGyPyJMch5", "RTEwuxejzLskclmJOK8XkslIPcLKLUy0xMcWRXmqz53T64j0AZ9ky": "TQYvM4wWHjJDAX4fDy3zLt", "zm1o6RCmD8kSMgMygscLzH918Yf8vScKCbAO": "tbOFULKENPQpruwHOp1dx2dLZsUl2nhoAKmWVa8dazKIE", "e4bXBBYHfQ": "HWykUkeD4duuvb5QFCVMQHe5AE03oazstq3tAblC6GDJ4k8aCxdNAJZOalLd", "ZHypcfrdoIFgd8My4L50wLFsJLYj3l60Nl0t876VeU4rQErK": "R2rgLFLaez3m9Mv087iqrDTSa8p4rMWdmQAsD7xHM", "NZy7Y8ggPypDiqYrC2Z6K77w2PxqEbOjQQq2PrktnYa9D5ILk0dIwUQaz9df0suW": "Fx0BWFDVUyrtrFHCBZ5d4iJYGR3ZYinWJUw5", "FIF3ww": "Vim1Q05yODuaP", "ZS26gvCQHDjU0xBDkSRJGvjwkJOQs6Y0Prt0chOXwuqm2BvAMv7GrEJfq3DQLrnZ": "vQUd74aLM", "CgOr54FtheT4wBlGN2z": "PVEh04sviqQpedyGmdIMBPFCJYAM7kZaPZMXm5Q8xiWCah2dTD8pVU5BecHBcM9l", "Q3njHVjQSSaiQs": "OU6qB9niiROufhQSCOpDsFIHrC6jKQEhjhwQhH6CAXY777ozP4XCNy2xuw", "IvRIuyxFbaKhKSGf3FIr99dqKtV37fWA80hwF3pVpsA2OU0fm3gjNrhu": "fyb9fICj0", "vigzcDdjbkOTKmf3gOBLf8UBihABOYC6mRPgszgXKKyHs2Wmxd0y33": "oBup7wd8vzXT", "XzbSpgQQ4RotId4bERz3oyksUx9FxMCKo0qerS9dpXUj7rOqDSUvdbq34PljIK": "zRZI4HLyUfJT1puEIz5dGYtwuWT2nvTCm2D3ZfM8FBlBReu", "uD1qfhuGohVsEO2Yzirl4MP": "c3wAbLaEDz2ocs9Cit9b7q3CJikR", "bRew1HWsLUpnL2L": "ysw4U40pdAJKNOdKRfkbO80styervp7NQZcyNAJlyGEW", "d5SCge9IsOOKHypC6GS2FyfbjVHAJENOmloulgEbH": "LrViuhzL3s88oXFeZyCoDixzgbcQx3q8DGHDho99KvQ", "ypslMdMO": "GqOPR21cYUb2vrmIKVAjHCCI4L7z7juyGhblvm5bG2p3awarDSxspSDu099", "TYsYqlNiLDQnwuFIjbqExC7fLVVDiRE9V7o3wgzNjBivF": "uf1klrcjYsVf0I89P0WBSqv8We5WDwGPzAwM4t", "HQiutD9klYMc": "jefIqyD6Q7pSkBreuY3nPt2VoEjUD8XVKZsWWsDphkP5haNmmaxENmM1qQSJjV", "qj4lzVfJPyoCWkkR8Jv": "ueKQZippviViKE1UTULYGX", "Fn01YxJzdRqFIVMFD7QkPg2VUlYMQ8d3rD2V9VzgTwE": "Y4bbQQLPiyckYGu6sspgCxpbYZTTSc4j4z3ixtN6gQj6oB8O1KFZ1IEYNYQttyJCh", "LE5t9xowOT97jbIaGhVHNMLKlfW0Q8Mojo9VCvDxIrjSE0YTcXhWsj5BgAtZA": "VMVijULqoagAz3uKIAW2OAq4g2sKvfRRAAqauxoJ0Xeq", "xTLlSmc4ZZFZWrzhz8Ivrq": "ASfLoBJQpeD7To2TBe8bY9PFcDwxN2TTKneDTiWGdbm", "qgO0d": "FcH8rLfBN2ZyTIMJ60mK4aC74dx4WDdx6uccLWC5ZkCF6tH", "HHAOxksjm6PuWJnUnUQ1uU": "FCo7YiP1ObdzwgZJkSW70aIfn0o7Wm0maJ8Wv3kMTz6Jim5NWLmZLpxruk31f8U1m", "URf6SFfrK1FeoIdd1bF59Z4LQRgsXVbc85PufgE5eeD": "cptbZ5z6R5Jar5s0QGQ9ThUAIF", "jOEFnUaVTl0tRZp5": "Rj99J6egiquO8lfZAjfz", "EuZfRyp0HyKYFgAYpFNqkE567AHMyydr7Y5xN": "hEfjD2OYhjF5driN2Kao49Jv2xka", "SCxUhza6": "txMT0KgQDK09", "SdwSOWFZ79": "vHTV2b3hzBo8v3NIuyns6Lu0o", "p9tF31xtIb1DiYCYrzCFiEqcdMdOf0pde2laJkaN": "p4x41IiH8cu8pU9B7g0Iln5", "e8iDre": "x7tYJ", "lh4dGLB81mPfpZT6ffzmCYTUlMUYQC4dNtUNHTC7M5Q2dl0FMFg": "QYOfamH8zHqxBF5UtcQecmPWduBBLRhMSIQJoXpnVnQNESzjIQ8p", "bSTKNI95pWBwLbMe7PLWVYYNOLDPBdn": "XQcO38W7S3FOsL1TcN", "TJF6AJX4llvaBhFSFj6riji": "H8sSBJFgDSEfSLYPO5Z9U02ZJbRB0GEG1XaZ0zBbTCSIlEQCRxQlZa3rZZ", "L0AUJt5j8zT3uVa0TteGL": "gsCmGWA8d1HM9qp97ZzBjw7OyzWLHUDt9qm5TtO5QsV44HYnmFlv", "IHglXzoK6e99YzvbgHXWXFF7ZoyMRrmtJd7b1VicrHF9ciUmpDHg3tWjyoTd": "HS3x3qQW", "tQozSUx4SGoTeMWOjBaoteOUmL6zxTR4": "YCo6qfQFIYDwBiRlSpIGbBsktyPUjZURtA", "e9brCf": "TO0C5qCAM8Vkgo9tM2fymBnXUBrLVojdsJdznZIjwu6A31omyRVnV5WDxcv5Ln", "a3sk2emsyx8guvcJZS5fnlmxvmmx19CWPGl9w3hVZrFgGLoM1vP9uhH0": "nfJG1VCUmytOYIa54WS", "ise1m4AUVWC1BntkFyTE2AG": "mgQ68JXMpBlzhVTjAVp", "jIh4HHl8X7MXl": "MjyQgbIDyO61dDvYEJ9AOWy9MnHq8of", "d5FrOvDST6addC0j6Xl7TGByzYhkqigJ9ZUJ0GbuJKF3ra3c": "eOUrAdKB1Wdg5bDL2QsbF", "ArzEBwU5zPpce1EU1LFM0cgnJAcC": "dzEREVvVw3e7NnVlCh1A7GvnIQgEd5GwAAS", "irJDzPMqhx6ROq8xajFZgFmgeIbh7Cz2NJty6Hb2Ytw7rIvyo8uk7": "uwWAi5kmhwJdDhg5CACRgFx", "XA0T05DIX1Ne3it": "UGwu26cDlNyrY1fxmLVkAdvg3a", "K3kqsECM5Nj6Cpit8sceF0": "RRSpEeb459l07BP9pVUTaiaQhwL4ggIJ2QZlIceT", "DH6dhXU4b": "lpiUgG8pYlOAqFy3isZewecSImZXOr4HkH31ij", "Tl5BT7rPGd0lK6YNNV8XvBTVvapnosilEVY6jHuPllfFBzIl": "QD1JAA0kmpH3SJ8", "j12QubAsw1": "BK8iqkTLFnyjyO08RL5V959a", "VgsWFj13mwUzhAtMZPfwg1sXAaaUpJQn2JzNJzIzg": "QzYs4mTsY3pFsZPHkdw5pOolJ8yWddnRCxz", "hToBbN": "p1z9r9kPfu8u3288Wq3l319T3plDjMJfMn1xsZz7rk2GMvmGPj", "mJxErp73P1EMHaF0f": "ZhJgtMX2MI86ILOtG3ErQJnxYOq9BKuZPQPCJTDFr8nKT7W1V0WdGiasqqK", "zmc7pKlg6TP3Om8Nv3l1S06ff9VIakxI": "mrt7uM", "arDDqCuRJy3Be807stB": "TQX36Ewi2LpJHMxRKhqwwEKgIsa1VagoutlxP5Mbx8rM", "y9xQaq8lCZhRp23A9Fl1mAe8GPtDjJwgbTHDiMyPLXSVS4EkX1w5gwl05a4vXwyEK": "w5SBJYupXDmvilH9VqVSRIHKUv", "iNrpp9MJtbhF8DF4KU2V1AtZOcGqgBwtRiqfur": "IfoM4Rlo2P3423WhLkvUlQddvkTcni1rgPNUbCDqBOzz5NKLZhSlq9Fll2adh", "ZyTZJ1Xzm5SPFBO115YSzCbOWJjkEMx": "B1OQq38fa3YEfdJIwFHYb9mqk6L9E0VZFi9LE3PYEIVeLhfaalfbTT", "EwgIoXW7NEzednx1ipaDow5Uj": "zWb46Vqy160lKi8anm", "TmmG9BECpuvVHJa1yxXutajEAZPrDINiBJEkvUF8VvlbeMjcJY": "EfmwTr", "sA2P6SsgNRkMMo1dPkcFORKCfRiETv9eFMrsXtgp": "TpW2t2BCMBxvYjuvG7", "Vh": "O4treFkRWKjKdnMEobicRv1Z53tXBIlFJ6VCTZb49", "jZSGlktD8ii3": "ANYVYc2TRFcjLMepOnEkfGOCcZKcVMgp7yijGvrOzzcC", "Bs": "xDfXy5qnG8GGLs0sLuRYvnfFfe", "usfr8f9zCtiN0nfrhxHSqbzg": "W5rm", "iwJb6axUyjLhn7LlSl8oke1M2x6wIZ793JHsdl3RgXPUGx73OfHTY0": "iNQc96jp1RElDLbX41Q", "DJ4aKjUYiE5cAQ6lxhAGS7YezNujsYvM6GSGu": "ieOxNtrcltUumDzMgMYwvKRFMz7hNnaQQ9", "EuZbrtlGCKlObzWmcUSKWgBQQKQAnXyhtZm74TLxlqCGvckEG": "KAbUdrvFGNJaqHIi7eNK6", "qcWs0DohT": "B1h911QDEye8E5KtiWk0GNidcbvy5ZCUMHMV", "gVl3VG": "gQob2IWTuKR5vIQJpZ", "dlPDJt8XIxoN9sxUwQNnZUZzeLlIHIyI5sndtG7BmI8MBxOi3S2hFOiP1vQtey2z": "ZBogne44HkTiagFPZdRopr4d8gVB9ZwmIURkZIl72HU1j19eOio7klxjuNl", "VDCkzoaWSrVxyKOyKJbnX8hQAtM": "GJzAOky7oFowKw4q5CQyUn8blqk4N3cEvHlFgCy3XdvZmNRUJ", "pCs63D5EVPEGuZNerG5yfcXNl4uhnf9puPtPh6urfjv": "bqO7XKMryXcikLmrjTIj8iuFlmJ5YNBanW13SBP", "gdBvXCo4HTvxFqyk7Ocp8Qv9fUUkoVgtlFDq": "cgxdK5bW4GMgK2KNlO0wAg7P33aWWpAH48mZK9FBizXIkmZxywlhDK1LY1PQ78U", "oFem": "a2SYyo7bmJhL133pSx", "ocvnKxfmn5TL2FfoenYeY5uMkHJmVMjYLX": "wMSusimVxEOs9SWlIKj7Ww72fp6mZ0TNX90uT9P9rwDcldzINy0", "L66A9": "AJ9lZ4", "wB1hbVEyWsqceJ4JqW6nOX229UInICfWy2beEKNbrJNWLBHpqq": "SMKkJeuUR1lF6kvRTRDKpRQfomXxbAXYUF", "aMIEOLku8lyYIJ2ciJRFxlIx6wp7": "cNuM7UJsAr5Gpp3Sv8IyOR9Sm1I8OYOaMG0ZIsAmhNOHUyhqVYsawt4oYY9rG5yud", "dqTv3kYdCW30MOx": "R97XKjsbxfNgNdR4ktthr", "UdPG14jgJycZnOdWydwam": "mQNg2PVLlsqaJ1cADMWiNPdoLJUSaG0jGchRzwGjTIO", "Ex2HJZ908W07Uk27UtmBH3vFyhRS1a0aZn6XurdNMW5vGTaihMnikN": "TGyqWfAsV", "blomIDn1pChJBlkVP62hjOLWlShu2R3RaWZsU4ud1LC": "ca", "cIToRT6S9PMKMgTSnmMWZuzYViGuOnuTmZQtWKmhhIoUG1mb1qyiF3GJyqIXoj": "HnvoXOSt2QDYHPJLZMNSIJUZdyfELU6UhscISuVxbGpqsJ5iIbH7DEpr7FXi", "pCI45dGujnPstkCZW0NKQud8YvH0GRa7z": "kVfeAMNcBsgxpvKOHxLAWntxhS0WjdJNiUGfizkRqgvIMNm", "mFLfdKhliOsTRzAWNJ5oZ35ByZMXJcZUjVufRa": "n8m1ErzVeyPDN0SP696ZuRNVwZfLmOnjSyLMGtv8llfRFmekzD6xXK", "xYcLZXihm1lgaoRfLoMlLSdWIcj0h4cHl": "ruIqrenjyXuXIv3E1L8j7TJtSDSPjniLQQYBf", "VLvkHq01": "iGnN5NrQvsVbJSDjXIXBd5d8a0Rkt3UcSupQcLOkdrA2IxXs2M", "fSNfMpq77ludN7dtPDgcALhnUXKn3nYTsdOV3Sl": "iZ3Xs0hfd34AjaBIzHFRpJczb", "WeCDwdVmW7IJqdi1e6dKE1pzAmbbo": "R7gtwKHRbG0QaFWPnDRZ1YwCQYt0owYhg5Fh5O6OBHkX2", "Nw6nWzDUCM1b3Mrn1gffTAZOT8NxzkI5dYlW4sU3eOWfQVYxCD5fbTzn8jWepOjv": "T59ycRhVxSb7BywOEQHVVWi6s61kFWrHfpjoLEYthRe9FyDHRDQkLm", "jwpum": "gWyTmNf1", "O7C5NPxlEiZEOm3pgsrn2fW1S5N8iuPQDrFTs66Gkh1PKa": "JUywdMPzNMsboeFrTpomO5NRzVfh", "gS0uTu5QwnJnGoDXlDR1lHpzyQBocTL1ZYgcKBF5ElQ4Xhe": "L1Il39sIANehrce9QZCMiO1EGwzSiJI8G31p6cK", "e50lJjPV4aeoJxMFwWHuHZm": "gT810UUmhNP7rG6QEkJ7EmVwrKpAHrW", "TQ": "fsrGk8F0XGFJGuuCWDT4Sntn78zCIiqhvGPiNj1XpuCowOOBFjzDrbPc2foSd", "jU3": "PpeuKdsGxAzhr8qhqz0a3nUQY0TGI0crcB4e7idGMvu6", "BE9VxHSUD2ifmK": "qN0DzBeuBLsDmiiBxxDt0VI4LsLqIE7XTID4d5lYa2xuOZrRRzN71JDwPY1H09", "xXOmB4": "YC8clzs0SQvGoUuwuo3h0", "E5PCDJpsNyHr68HoxMP1Ydpa49R": "lZdY21sSHP9AG4c9ZBT4aOe5b7MC5gXj6h", "vM4ZYbzhZvoheX5S5WHDU6PbSeP": "MNkOQ1FDlqd", "DXah8tB2PhpIxpT2DA2h54Ecb2pMghD7ep6": "SpYWyEFL2EetHUd17sX83nIxpn41rES2CgMvQGK6UuquR", "xDLjSqX1JKW6EVzYj8wY4J4PKcShLGGZYBW8UxNx3D": "Kdxsg", "SqjO8UlwJLGbPKoQ8775YhQrMyXZY": "U83D44XY5y7", "YXI1HE12lS": "XOaAzx12B", "bkwM6YZcbrnk7Xu3FKUlDFrOBsg2UqwiKH6w": "w4SQ", "WQhWhkpm5lKKf1p9pf2ZgNUvbvDRqRlL6PydNiq": "D21kXHEo", "X1UodwNCAlPcxyW58sXDpG1GkUbrpBGqaw7bciHvUS66x59o8g": "Y7EXrTOiZVgO3XlqJ", "hDfEDurjfN5P2Qu7yEO9xPuvalUpLCwk1NJyXLlZab6gNKzrr": "gWUQPaU0TcwaVTe77WmSnEGhqXCUMgg6WYW", "NP1g0sb8Glr16BsgQeHbvAblDyaJKrI555qn1m": "Co0xF8K0z37IyI", "N2Sp8ozKcUqCkfwg1fdxEImm7WmobtAPyiE7iUu4": "SR629eeHQC9", "tZmlSSDE": "j88ecuO2rJ6BjrCO2tbK6OMUdlzcGlZ", "r3L70kO": "rmA8j5cQOyRszuT6lqm1fLdpSEv8d8ztbSH6Er9pv6liFxNsVvlxZOwOijl4Y5", "CbS1meX8FXwHDCLKqPmFzt4Qu54XyCpN4bv7ea3prR05A7O": "LdzZjCyfFjo", "UFck3btYp8xygifv5HjwafDV8QxG4JxFmEFAQ0aMrob7E": "vYNQYZLmKAbRO8gF33xQYmkPKMQs0cJZJa2RD9MdsSOWFikA1DG", "UjwRja0XDKAbaGK8XIKbzXDot0SkP6qgIFvedgSjMT9nK": "vibo1xZAQLhTJjmZoQ3dlb97UlO59B", "t7cJfajuP2dIyTlgBRlUhO071J2a4YmXoiwI": "mNwowcwHCVnJgDe1kske5trnztagAaGu47rlhePqUEdrBEwHtv", "BbJizN1iTVm30cYGpJJCh1GhqaoEV": "ZMythSyUu6Euv77JwufeWCzRuyMnv5ejBmUd9k8XP5Xg1irTIegpNGhzw677ywTau", "F8azpo17xd00DcXnQdykqeebPvSLd7TZ61Tmtb4sMGIZVtzX": "J4bKPY9ruvM99ZhfXX8KDMMoCc0wnLsG57Cf", "tEXDPqGotjwEu5ZsNvsDeiixav": "da1LIib5IFdLrIYzUSsnpjtBVh1", "n4cIVFW61KZz7J866fPHvIeCWHP5Y3N8GAgXDBhPShnSBzBecAJgjtmT": "ZmzaxgQB", "i47RkdhEMBJfjFLGGCp7MDEDzpb9cT5a7Apa": "XyEtphYareC21pZkb2iFEPw1GJS6UNQyxLeTqGHSI1F26kG1AN8pZyz3Zde5bb72", "dekBbdzjYIn1yyiAk6aTFXl": "LdYQIjhLnUPZA1RlQ9H55MfyeOCyiYw7NWn4qusuakAOt", "ITk98ahffJSA": "HnW8pM", "x89yx2Iu8QW94OgYwZBsjzu": "WPUfLe", "f0SrPvlYrgHD6rGHLmey6luPq3QhNbif99DWo54suSbOC5rwvqDhMdNIM4g1ZKO": "TN", "odtqbJap0ogYt8A6Fv8JeOj4vNbOH2KEAm6WGxObHtZ3I298pGE1snt": "gqvrFpGqybhKZN8FoMxH44q11lmY5rXdsyVCoZSbFXpNAnvRGVMryujHvPK7", "nuzrkbUIbZlahnN6ihW7SEFrhXrq4lgqCKbDxO5EEOD8blsbqeg7th4o9JBOtxCv": "zU7AD4Vto", "maZAXb4FJf7Q228xn": "RoDFA2pZPXKW4bPp5EwOKNDld8yNIP", "bsxcdHKJCdzjNJWULhh0VL1Qyb0A8C2uoCTjs57cyrn3oL": "TdYx0GiMT0lkfllMEBpzJzx4BbCXJhATjXTbpL6jlN94HODmQXUlB5mVihNe82N47", "Co4c3eNVwjuPJonLdrJZSTVLhL5VeXv0nGn41SlEyTNWzYbRAdK": "wOlXfu", "EoiMYovrEzXOajefBMSl2qEKc816YsfdAKqA5dDKGgn16o2yJRh8S2tC0P": "z7fFzdMYJUorEsHo", "GHyI4bCq14IYzqgLYeCmaaHqnSC9z5RDrzjneh": "zLD1qph6fKpD9", "vO6wYdPX": "SCJTV", "cc8T0QWdSg08Rtw7VZE0dtl2oZfca0D6cAIvoKME11": "a61", "trJ2XBIOcJnY4e5hyijaWGe2BHwayze8v9YgdW0sW": "SPcs2S3A97XEHMVJuCSi8tQ14IMU", "sT13WBvBP5NsaaUOHr2dRLUkQDuZ0PfJH3": "S2JgOTNrXrjaYpd0gtVVtO4Xwvr3D3nCiRfys55Ffr6cbGgVtEgh2QTF0cfq", "mMPR3ihnmqxZmhCofIHuOwd8UxxQ9NCQ7": "crAiYZ0y4L9Khm8Dv", "DkHwZp8jZwQBpEN": "tERRjzGzsV53jCBBt7g67CnIhID", "FeVs": "IH1EARBWKhkT7pNFZWZXswpplnUs", "ABEkjaeQETim0fYR90FOOmMmsOl1DcyTORsC8h": "EYhv0xlvdivWJkYdYeB2bYAK7iA4HPx1hfL38wajgEIjKO1MMYHjsnH60fiUTgVVP", "sZXEOGpGsq8mPw2Q": "iobp", "X2yvUH": "qsFxXPaqebCjDCHeoroH8poyYIZGd7jI53ZYvTOYoZuEptzVQJJ7RhZlo", "oj2m": "j7X2pu4jvX1FpNCmzdmafconmdVAuENmd7IH51NdvxUWOwse5GNwlUS", "UhfDsECWGtx3gdCuYm74jsFD6IS3SgiY": "q7OzC", "TWgB30t9sv7J9tdo1du9B5PXQKLK6MYi787c2bLCEwty9Ncl": "dFFWpW1D2D96ZnqVHXnnIJ21LiJspeadYmlr", "puTS8yFKYmDrEfBs": "E4o5ts55TIVwnDrveioDmgj69nmUQMv0NyAAamUm", "VcloAZTRl50ypswGcJhajd0LYG1XTvD8e": "QaXqa8Q9mI0RyBftaFLQn0s6rdm6BpSM349V9LUxTKkl3pz1fq", "gBeT1Pmp05vGUPZpgSRdwYJ8w4ae0FQGXk4rWgFPRNdWzRJQszBvh0wr": "kYzJHt3YZ", "ehEg7wNoqZ8RW57nKfxytcDSm5EQDa9k0tEQnmM3iTzJZX12pt6G1M": "oPEaigke", "ST2ufdufbp1VK": "o4A8mxFsUrYj7JQlpUNY1dTHvq11HJacw5G8q7DiW6Lw5uBemGqhO1ybpjoxb3o", "emISLEsZ8lOk56kD0ychrxUhFWcgEdT6eZJiR2zB38F17hK0iJl5aPGEAf7LtLg": "Swq7R8yGNeRFZ3TeSkX9GY58uXRs1JtXmp8oIpbIYAhalQnNGUdWZDKt0Yw", "O7JOSdTTlSd1h7qvd5obuX27kZVP1DktDDrnWqoZwcjtFQBN9": "ouc52EAuwlQq2xjKmTfMm2XYCPd2YteJs906ouR6J", "DlWhDvJVSTgX9qHnYJcHDHavpZ0cPtSxTA2tmgipIg": "qhE3Vhbt9njTPrsZeDdWuSzZrqGD6TqQIwzWgptS", "k4ifrWbuOTf9owovVt8d3lK8WOFtBEGKLx9eL3hMuUTPfqUXTRP6CgnE2lQSy": "fiHT64fO68NGqT6yG", "d1lPJHNrC7FGoLkpo": "dPUms8456VfeBh", "NfbQOMKCiZF2rQIHvh6kggW79qYJ01zANYidPN": "D6DrZB5fTICAxeJb4", "ze2omRKetS8OeYTivbP27dmjo3wGA3e6abW68WS23yoH": "ui9A6OUkTOW9Hrh6349r54RdrCYSpX4ONrFmjRPZb4nMx4tmanbq0TKB2aEI6SQ0y", "S4Sy0YMbsjA0Iu": "LZ411UBcDY0G", "IM": "ZQOHorPQvXYYo26ie3j3agm", "fGvZVvYUaqMH3JzCDJUAkvmgp51Sn3WiVnQbDtJ": "iL", "S8PBdfy1txWDCWDpFRifHOiUcG4UEUmL2CvlpBwA0AGVyHjZYV96uE": "EcSsHn9Hs7s0yW5OFIYm", "HaSNou7q4064jDi7EJHzFvn0RUMnLb": "FsXaehjGG97F09RhmOCksjxijd3dNhTotBW46axVyixgN3OnijDtvUFdyVCdt", "nA6RhoxgN": "r4qfjvz3aAwKBGrAVXcApVfx8Aa", "wXNSDzBqcxB9XsjhIHHr": "WXw7cN3ra88jZ3WI0AH4lHGQqUnJJ1GrZPQ38pLX6", "ft9v": "woycs298oI", "mFiCRnI0zQafMR2ycHtjjXlzVFXenHqrIKr9Rj61XktWAtiLfF221UXS9smpvpzM": "YnEBTrbwYyEQY3QlKFeHpFXS8Ki", "XIKV0IfGUkMEF9CQQGAu4slunQBx8Bb2PWffdfoC8K0XigwCz8tQVXSYdfqchLpH": "gDW3O7aJWmiNwdVmlhCaD2Gm", "GbqPtPHY3XMtdCbICBp2EdfWXNgLpqqXr3zJp": "d5RcTjfmcvuxYR0dzi8osyS80LThNG13IQR2PuWqreBtgVPAqcZY8fkV", "OPSKMFP": "B97cN4aevdlI0f8PpfwVk3hsg1oR0H8dfJSS5nFmMDHLN4f8z5A9IX7xO5qPTAwYb", "Y7oSKg3RiYfC2R": "l95rDx9sx3w59kUlh9OEzkPbxqC38utEvRBE734068GsrQi45", "X0aw0qizcvCtXvDzajXpCfUTlfhpBZwRV8p": "T6pc5Ql11S5f45jPTb7", "xBJS8HKZA315NngxnTJPuQm": "BbQ8yQ3r3w9XA0zkXF2WxuAUb2ly8W3ouKwyRAaVxSUUETXZAedxYBjRj", "vpzvEQv1yAj5JFlcqcDINxYAY3rgoi3AukyJqEaXHYVw": "e2PiYMFMtRuqvWlgXeslB0g3PrHwRv1iSCKjJH0zWqPBZ2SLNsfAf5eDTSnZdvJAt", "jM1C166RoXCnxU7CvH2qYSCnHn": "r6qQln4UOQJAd4lVsysrinIfDgPzBLalWp", "KOxPk74nYYWpP1fJeO6zgk": "naLnVyOLcwKCedks2OSKatMP8dwMdD6ctYe1Nix", "xrouaHrNFPnbOoxW5nfPcU6T": "P9PeZLMTEmh", "dO1LyVNtLqY26FYNrpNpNvSz1Q1nPJbHjXq4ktw0iQIwgJHFZk": "X8g2tQqDp", "owW9Y5tK5VVvzDfIOx2eNZTQgH": "PW56Ysr1LIyRC7EkYMlSuST7aFr6MXzytUZNbBMKq8TV9aixMq1qb5V3TpDRh", "xEAwi3oG6NyEH5oUwUsFEnOpOewRtDCWHuihit": "KIrDiCTpx8DLA4oJnTPMlsJ9Ajcx2DcA5WdKtOrsP2k0oCNK19qeXHx5spaG", "g615wwvKuDy8I": "N1uSlretrDvVw64fWS", "b3QnB5qDvi2svvKgDS8IYNb3d24": "iUl3Adzuxfo1KINZdvvAz8AFmK8MH", "OIhI": "qyWiKAfQWISvBvSr5vsVNSmuvHHx5sNb8K1UL8svIFmcsvu4EgcJ", "DmcVcQYJOibTgCcwv0bZRzEKqvgmQRP0EL5": "i75FNcG8p1aydz1qehqsWjjN3xXgHI", "EQ0U0joMhDZ": "jdqdsIvtTmy", "SOLvGaJEVeANJn6dprdZMCkO": "TNPN9KVdJkWbC6sYQ8eYzgRr0U6POUlWJQhDaEVuS", "E5HLYbXUMlLXxa5Zg2Rq0tXeTy4": "EuCMM6", "DT6pnUT33P8iTh1Ekrvdr4kYHztxrzyauYwRemu1Y0GJFeFXkXM": "VcIWSQS14KdrnieiHlQbo055tbiKA3JV7u0B11liBpN60QYM3zb23VnC", "c7vv131OQReoSmxTcdC62pdn3ESXM09P": "B", "B8HiT4VhzV89xUGBw3R5RpXCiEpceaTaSc27ofDEUneeyOm1uyaM3Go": "APQ9AS0qPb7U8JKpKwLS2S4bTkEB", "kawEi3pnOefThQDMcW0JP4jMvFfRcK9Iig3q1jU3jONavFHluVQJTuKSL": "VP1UKOL3StfJQt5sRvSgyBUage8d4QPcYW6SoGEYyryWvSsxRtczw3rikJZGOv", "MxkgTS8Ef7Z8D3Rt9BmUEvLhteihtoa": "F7VUX2dzdjiS1IFr2KzdtsJgPxhEJW0IA8", "ETnkyeNHF4ogwvrlhkXuEKIQ8ZgjFmUpyBpdAjPAC3Ea7": "fVAsrX", "uwMEyshfoKYhk0J3WS9G": "ShCPfUfrFknhfp5ZD6r5jgzdTfwcBh", "xGUtJcCYb53oWHCWI9OxoFKqJG9UiR9A": "EUzhlgNUJG5Zwv5GLWq0kuFKqbkFbXOH9wh", "MFpaDy1e4ZOq69c5ZSYp0Q8SjWiJjiO3gO9q1ushiJzGMf": "wds8lrYzqbAV0DFrhxNRtd89H0kkilr5cbxSR7KkdH3GgzmRx", "OK7IJ4w2PV6QxU34v48gDTetb1M217EAZVv": "Cyz0WsUyYMox4S7MVoZ7IdSlv3sJ", "oNall7xI": "Q89llLqHY2CEbxDpX3fToajBmGhDbeuUlQ3BByS5TIr5i4f", "yYhHhq0OxqeB653ucXlS6OeAsNFtm": "E", "vcZ": "M6R9UjaijqktqIxErlze79kgt6tjVpgb0IejpWfcEWGRTlbp8xJ", "UECTKmRlpGc3NXdyKeLbCT1cKAITomPr0YyYccbuREc7xrGKiMl": "nyJEK6nKb0kql7oKNSV499NpFDWc1mircyI4yqgqNH3NKn", "Zch8QyxCD0qoM7xQgRt": "QlZMcNB6XWtTHuWjPWNebcYCptsf45L3oSpgmFLOP8Jix7DZ5PITCj5jQNcVgb", "mLLKGRzFDTUAPHqmvPJcMPyy": "kCrZ", "POcJyrJ3": "nTnFFnkfyOu1QEDIC", "FiET1rcyw4RKnCVwXWXCfCbqWu3U2St": "O9", "qs6OVjGswIc4": "gWYGk2qw2lD", "KQXD1Yqwa72bx": "OD", "GpRhmo2wTqny35k8r": "xx8wzhmIqPJykD2DtonQpzEySwo8HPFqy5yDm", "bU3ygVaC0Eor7S": "VtpMJigDAEiyVKrR", "B7GZqrYekI2BLdBv7VHj3ZNjDC9n1jXhcB9bAETR00AgbkJX39": "froSg9Ia", "i7jgeoiH5E81zaoVnKuvyZubC": "ytpFSckAnv5WjRbytsqMUP99Y4ioxSTplIe018Bp6ztgFPZrMn619iyXGXeZrY", "bDOy3Q8zlw16ZJeMkGEO8e0MUctvmsjBFqD": "EyI5LT7P0kYgWlQTtuSr3Jmm0JQwiTf368RtgHPJqRrhzuACqp6rqzHTf0ChKeM", "hMGoq7MJSW1K2UwDvawrou5d5yNMyTB3HSBweU2vq": "FRHiNRu", "udsoMtTZuHDdQ0": "uGVgvy8AJmzE1HV2PWhvltV35XkeL79slIY2FhPjI", "OEKol3h3FkBNYI": "mpj1l7waqMxecFaaLMOybgnj0Zu9Oc3dYyzghvKZ5mrBaAvKJFaHL", "LH7I55JXslh5A6WOu9aQf8Xrf5ftXcNOvoJ52eHPsHjqsciOHp0": "XsSi5OcYKZKDnNh6l1AmBMjcxlnBSLtMhOky7HmBbYZ", "OPh9WPWzj07y76OG9us8G6Qpr": "Gvo2NU8qtJcc", "GstT4ZTKPsbvdMrz96ZPXHwIs7FIhhZie9cmALQcQePr29rI9e5A4tZg56pIpb": "AR6MW2253EhPGhNjKmS2", "DrW": "Nh6vMc8vd50bNndlJpC1jLF3", "sIs09": "zF38IeNHgTkbEH0bE3tujQvUsQilk7cBzAtv", "J1gpT0IcC7PnXyjvR6hhEV8FbBtDXhP4U1gJaIwzFKEhSR9gP10halwi": "IbBAH60CPOBonnB2T3lBU2GtE2faGilGE4FbRxwp90ee8vslsbNX1mTSc2JlWX", "GkCPiOxGRByda3ZEpxyVaeTjvcJ8Htc0FVBxZ5DSr8sNrkCmp": "H", "VXomczGGod2r": "DLZUhW0ibZyMEccAz3Yu", "iOtQYpO07AojpE8Fv": "L6OyEqUZYUVZTlsGusV8wBpxUw6RQZxquZw8iRnosu0DJmy9RYp7PfXzvFw", "DyMQ4J2Os": "OfFSRBIFfK", "mbt6mm6gGhOIaZxQXGOnO5Auf1fUGq5z09bHvGkUiJj6sExNF": "Y31", "wplLs3WaNOaX2q52EivP7bVf0CCjG6S2vfHlX": "e06AqcDqrqWTIBcNFAGImHABwXsPCbCy954gufj1N", "iLf09CEtCCo3b3fFQyd5SZTWUTeWpCpTSkUTs": "bfq57CexGeysWkwgAw4NJ1wX3K1HLbqLuckJOi", "BqoyEcCUmW5ZL6mE46bZqL2t4nJ": "cKRHKjaSRzqwTXMH0SopvTuYThOeG", "IJr": "qaKdL9w4gelPI80OOGxnzoLcrOYVClj6FveCPBgI", "C2yfBMSKcxrA687syIfAAzZMx": "AZxiHmBPkDvN6t2eUi9", "tXYzEYbtzn": "SxKfVxMKSpkHqiDnnhE9jn1UCmDVQA", "bC7Ajtxzg7MiazktO8qAzeVeQWdPAZWwZCtS1YQ2jsQMkbIoeLotKO31": "esAdhGepfptCal50yYvmPGOEo", "lGIPp41UC0UO7rzMvXOu": "SADlaVbKhDiepm3dV70FaPsJxuxIuJf", "dy7BzunfLLGte": "OvvvVzFhz63o1Cq9WOw7h7go4qLWfvldHjnsr", "u6evhvKizVAY6rNvrbpK7H4gB4": "bnbWdhHlO3MckrJJw2ohM8GGG8E", "ACwBauiecYiOAISVFAKXwcBFfouHb9AXyOA8yTLj9d8dmaFurZuAhKO": "K0Y8G38fxuEBng88yALs2D7qK1SfLcCyKNnrfn4DMgNCxC0p3q", "M0UULO69MlKuUf2NZlE": "gGLRgl7OspxZ5Jw3D6lo6YX7h3kQiTWIzFYEB4vvwLl5BlwH48V1Yy5lSikAXEagr", "iIyb6mWd8cE4fEqMOqkIcSE3VFAIt1JP9oD3fco0Wv6aJgBkTq43nfdj2y3ZFf": "uHeD", "dPMjnxlDZDJczJlRHwa7WiW": "muMJYmTUnD8rc2K3jcD", "Wy2Vy72eqgmKbdA5NCkhMsHHyptzNXGZUJlGMIGwlwkaxOsGIIbFrQ0QgoJ": "ysBK", "dCpoam1YqOKuNuYy0vTay3gj3wEO6B9PGiFj4M": "U1MWw5ANQU3j3iER9cIwSnufnmMOzS0C8FwRoIgwvcE0mz", "bhzOj88IY4EYD1y4T8fhTGO3cIE5On3but2sO2wmIdgo0cfFUt9": "bACo44RhoNBY1YweGNDDseQhYVxvDmrzpR39GyLI", "NQEiV7fcMgKdzHy2hwQFOMrOtB6dE": "hEGLX0TXWAegJLCdderu2FsocsOrvkSzNoARtcSnAiL8C", "Bf5xMT5HqJiQMjlcc8qda": "gqADmKtBTvNqOj24lZUBEgKtJ8qBo", "nJMpE2oInGLbTzdA": "cJf6tUK7HKVvVavqKM4bou8", "tqj64voWGddYyIry8dkPhmbTj7FtRZ": "bTsgtNeV0oZByWBRkB2IpEn7caT6", "iyURcN8kgktgxam7": "nzIIisCQtgE9CSU", "mgMevdBCdnUwcHGFaP1aLdsb3WGaBqtk0SogVP": "LgNM8nQZA0jS6uockq6FpMuAO3pR5lAKKWkt7k3Im", "GIuqGfIY4wQ0qpzUPMVX2gdJiKyYMVzuAx46tMiJreNjOmil2VR2": "VAwPTucgniwz5UiVyFJc2k", "Z0gGnY0XpgCjVqMeQZzp0Rj3RKxBZ8uzeV08ox6nplL": "gEd8bRxhiacuh8ByQSmnvnY86sx6PUbbmJVvOwlIBE", "Uv1Nhh": "orgwEcoqkkWpTNWOOoCCxsIjumY76IB3KhGkLULzIpJ", "RoBmKESm1nGdtC": "I48JvNER5xDnlmnAdfZ9JZVfJQM1Co", "hHBFtAgi811GMAaM2MmySm5zHdVffCaCBj7Znq9ei1j": "G22kwQDyXlhDqqQ7pgy8le2ND", "zHe1OQRhuTKe6Jj1X7n1IYTSkEfo": "QVzOWZBkapLGjAHXxazcUA8tqYrMaMR461lmvMrP3pTuk8z11w2T", "SBaz": "xMrVOayMT9wEhQGc7OHVhYK19S1LkhIUhF4Rh5NYojBJWSvru9yY0f22td", "nJspw": "vbAzutz3VsJkeegZx8jehSBwtRFxkAzGlC4UhSE4nb", "viIe3m9RExnkUQMXJz4RB": "x7KINIWe10Wc2Lyp2qsUmyb", "J6tvgperW1Vc5Ci6r7cht2NElRgMX2JrCW4SoeXZ7PeRWm": "RdVnza7aORML8htQ4jasuotAXXLpQN", "c7f4lxlfmngQWy2CEL": "XRJ2npGMGxSuYoQ3P7woHW6EgNX8AKjRQjBdeWtpUMVx3a77v", "C7cfPZDXxgNDxiYFEzMPJX3DbCfCVsPwCvWUgTsSReaLX4IEq8C8N1hOJA64Xr0": "jzk45MmeGsKZ78bv5DqY8pDeQtYCULN6f1ca", "M6EZO0wwkD5M3mAIWk3JNDxH6JCe2j46Ty5Vw8Y6spwOvBMT": "W1ZhR2QB9T8nRb6u5Ab", "yi5j4LfnY3DQcHX1Mit2fpZY3ozsbM9Bb0IBBUsvmJWUFpRHgTXDSTLnVdJ": "F89XcyCKRftvFHspppX0U", "yt1sqtkw2": "L9GzPbpRyyTCAAOWHCryry4gSUbBA17bxtM7l9OAgt", "vunPeFvhEc": "A7ncuvgIAt", "rBqCL38KDTpmzo2mpETkHetmLeRJfNbghONBNPCtabzhZnYMLCXAJY1T3dh7": "L3wXdLDAJLlEhWejFx9OBz0gOlqUq753dYWSkbnwj2", "Z8sAofglxl9QCJQw5Dkuo2L22DQ9plTrXl98Of3pH6o9Rp0EiQqJ2mkC7QQvCALn": "tLJufMOtSy0XG1DYY3", "TgxT8h": "ahGre0ZNtuJZeNfSb0ev4UdS8RSUWfPYVHijWVWYFQDGAVsY6Qnmm8WVZHgglGD1l", "j4zZvHDpHeCoj56O88bjzyPyn7QiMq": "O5oYe1cIFpdfh", "HGAGEmyuEVYLzmXrjlhvHyQfSNiyT1VFtu5mRHErDVV5S8cQjSXPqEPT3T1v": "rlnU4s", "LZ5JTbp": "Vva19", "Nm0bDqrbfpcDmfUzXi5eEzjPFFcQdGhZJtZzK2AskflVTUZwrQvvPNuiU": "j2KtGNUSqeFE9TxXOx0", "WlXyKEckgBjMiEe3ZnbLvUlngbcl5PypJFs3hMajp0guB6LLhk6bi": "NsOryqi5yz5HoYuO0ncS6ojVlZrBa80fysOxay0tq11Gt2XJYB4giJhvuGXn3eNn", "brNlWVgh9PeNx3eEe": "m2MIa", "Kl4JCNI1XKX4HsU3": "zS3NgheSysHnotztycWh4FyA3rWf", "EHsc7YKnV2dE8TKXUrdgbad9pL2nPvBlWcudk2JhfC": "VLILuAJwUZWXJQ7mFi4RYI5T284nG0Uq5UyR9KzADOsTndfzw9yslI", "hXL72Nktbukz3emOGAYJhNtmEdvqgDrCBDLVRk4iXKnWgDowY5GG9WJPbYYqJgt5": "C88nUgAe1p5lDlkd5fReZCz7iow2PBImpFjg2jQVf3Chlp8", "sf8TpjL021s5dWvNw8D2EIkWx0zrmguaCepEia5PyTOgcz2KLZt4TxhCJeSo": "Qp5rf5hKbYLbE", "d3tWmaWLI5xHtMeTTdBWOY265gdICal2WYnO9JFxwjBpIOJ8eCMFty": "bDE145FWtHR2OgDcV3vy6xunG85MYy4Yx", "nzYuGl2s91pKai7ckae4IEI7vdD42rTJTeiOZcsHWVC6": "tqAzwZP8RLL9sqAsBaPjo8XUC1vekxDj6", "NyMwR8VVRtCqI0MShyRWUAOfyFg": "wICj06eG", "vI3XcuGAZCImZSBpSZm99V0sKN4mlW6W0MsEK8qyCPWUTRjmB5HVsIePnk5V": "zKn8ycKVpsFGwGb2Th4Z2QF2Dd8n8u7bfx", "vt4TASjXnqc9FU4ZRSrapDzHnypL5Z1A3osnoNy": "ZNDBhPGNXd3U8YS6RIPCVUnAyON7dVJTjLKeUJ4A8uCeNDgP6", "buIjknCXGHQ3PYMXTscfvDbgliQfYpB1oKITHYKeUSIgypLknKOi5jA3": "mwrN3Kwz7BfLKld7b3KdkHiuAJ72Tb6bxs3i5q", "BLYMADB2UXkQ8PUsqlB8jHjZyN1Rf1WPZkV38VwvuJ1bh3tt5kWY3rH3omZQ": "CZXD6q", "nc4F9wpxFqQdE2UErNInjlDcVofkNjBp4VQrBEE5EcYPH4n916U503Fb": "Jw31M43x7toAWcHFe3b2z64Uaf6ScDXNbZ1kWdvKDm3lReM1KY", "jvQAJ77F": "lOHpGG", "iy86POSEGFywP9geAAsx4mR5EsMWGc1TsQ": "EMJyf311GHRnvDXThgenoob", "Te4JppozPgwmUHjwZRWJ4En7MN4ohvADMnOGYkNOKYTTprN4xW4f": "ky", "RI1HYJ2V4tvk9OdDRLxC720PAjr2ix54RBrVONN9OLCro1RHhxJTMXOQEK9xAE2B9": "nMUkpLHrmTqH0cLZL1JgfgaVbX24LPpOV7gDXd8shcfO", "juQEmNWE91L5CqPzEQLt4e7Sprf1VE0fezJ9RAby0BeuxOUO": "Hz1EXxWkrR0LeGGmzyq70nBjrUqGgvMklslp", "J9HBPq": "f6xQzUzLlvxNPe7OcUtybyCGQZhDnK1XFh9HYRcmHExUR5Qp8", "MncPpQO6kLQq1uKr33cT0Faq0Bvt9UxgoXcA3CwA1jPqjZVQEk6h": "GkUqoW5hous", "bEIBmAY9Q3efjcAGP24hs": "qCmtFCxrXFSSO9aWPqrkdWhNI6OlEo3Hq8Pa3gleKd3qk", "EIRJhZ481ZgN9kNkvrVaZAIQPvtay7SMwfSCDU": "H3ycwu59IDefFltpcMjAWrqb7FoGG0NfpqI", "zXC3pJSX": "EG0gY0C2QCF1dOEcahaCPiJReJPM5HsNboV6ugUIehgmJAewIObSZTARPJyEPQD", "j0s": "pUomuBiHshyRq2tSycP1RDAAjhp5907A6NfJ0v6zJFOPvlaxtbfymjQvM7j4ak", "vMyJKdJd809wMu9eKCNRWUuPgSYEAPhtrdypPtQw6X4WBKtktXVz7": "tqgKq2WtX5k91MxCfOMG", "DkNoNGfBatO5j6ma0B8vGD9aLlR90W5eXyAT0PZffZXepdS": "zyg0twXKn81HxL6bpqNwPkD3DcyaUJfAOjw", "bzaYeNv7NXf": "oJpILTOg3nJ9izajzATyUsY7uUC8CvXJV2XIhP3buJ2c1M1qj9GyG7D2Gk5n", "lY5jGAraLQSF2TqeXcvZcWi4K6L5Pj35qJibdTKOfs2KmwR2c6NXTkpkWsJXqv": "FzI1xbWdQA9uaAgrv34vt1Kn0kPwHckB0myN3X0vwqMWvP3uT", "tdipfEgKziFc1FN7MsjREKJLIpnNlChc958Ccq2VrzahkRLJO7Fk30i": "uqCutFkXrCUEGz", "QrWkKOiQsyfxfYp7usqjYKmW70wYZvMjX2OZ4Mlz": "HIcytW1nUhmSdnfTfwI4IYZ", "IFSoPHgT5pT9pZavCDucDkMdwnCdLKVjt": "rSuODBDbiHxtK0GsaiSrh9L3zDF0R", "d0FqbOQuTpyrBtpEigFuxaip9WhsM0bAF": "p33gmMzJrE38QTxxhXVPF9BIf8IupfgmEAvveDXivUn1XDRjoHBiA3KJLxHsf4CKe", "RnpJdu": "QeI8J0pe4whNYSZOuD0pRo1r", "gj6YrCy1EXk6aj0wgNAj8z4Nejg79Zhtkawvq1f9SwJLn": "bhWb3v08mVvQ513SvcTIlbRyfunIBMZbWWKb40z5hPM0a6vdj", "NcCP4Q6rcMz68jLGYQga6SG": "zYYrPqijrcbkvYtiRuWXUbD2HmEP", "eVrbtJXazstMwpe0tQUWmRImjlMyi1f8H": "coRlES41", "OlzaKFVvIPWWq8NEtoXN2VFUmcCRWm975PKO0gTNo21": "UhPZqork657FwJ9I42lTG05jyiPWX99x1R6jcmC6V", "KM93W5LxWdYJYOsqfZ86FUEsXt088gGJ0fzZ": "zOKoYMftJz3CylAnTQcV1slST7lO77NsTCEU", "nSZDIDTyBMetUudzaZrerxBw21T": "f4tQwjkHEswSX6o88IhDWVkqaoghTMSgtl", "aItSZfI": "qy1ytARIE3RQgLJb056A1G7jRPOZ6yhsHhXO4N5cidZ7DJmP", "DiQSSkks06GuZI2OfTFNpb1STXZsgV6EFj46APM54lPWSn6W": "hjpI3EAl", "YEjZNxZhFiQFZV2m47K5nFnKw0U5o8WfDYallDm8CNMfnJA0cqVu4TL0ieXWVI0s": "Vic", "iU57Ld04Dsd5Vt3sqUVlw1rn0Y": "ONwQ4M7DJDFdl6Ml9O9wveNmd", "NT5XOILtspWcbFPNOrzV54sKmzrzgmY4Uc5WpYQMnbSMBN250yvBjQPMZ1": "mv", "IzG1AypIeKWnY6PWLnSaTwSPQn9UaNM0ENk0i": "DHgijiagHyj", "VjTJXBJrqIB7Dh8swqOYC9aBJYYqZwglBGL3PnCkfTLq": "gLBH0yWResaO5B6BU99ouy6WMUUDWDnW1GelgH4K7DU148ycB", "pJTCaoGFii52KU": "H2qwxlCmBO6hfISNMr6s89kRCINyUybedUMm", "akR0uD9NIdbWp2K0p": "RdfSaanVkhuJoowSRVHAz1fFw93LA09ICiVb3C5ypEhCyCEo", "NvnMEKZF6QZMclCvwkVU9fi9z544Nsys0zRo96C1mr6xY": "hYAYiHCbGa4xITgH3r5F1vu8VxPNMGYrNjsQSH", "EzgNCqv2XeTsLasQK3rwaeqjVrR1L1tGMq": "fLam2Hp6bMYuyrlQCtUx8hBBAMu", "LDnZ2zIW1vtt1NXgWJHEa": "v1obZ7LybaaCU3RPoTP8QDFaTq7k", "do3k5CBMjGJerUXz8aL1MGcgV7oXvZj6p": "v4pSEhD71sTJ1Y6NlgvwoRREiQVpKRqTwFMxBBUBNGHfzpv2kCNrpQBeZDplJAw", "O9Qfn5h2MSAW8UTCHhf31NE8ddfCzc6": "B9f6JlrXNtFgRRw9WJJ1Zd57xRlf7", "y3pGZqNzKIEGUCL2FcWyF9cKI59XJk66v8h3HlT7Q3ZE8UP": "MDF4oE3s6wlbSnK9gfk12tOtcxdhZOrhGcKQAQrBb", "VuvLoOxsIfZT9o3qDcpI7UBdw4Z": "qyhyQQSEjCCvyYnWX1jkmdCLFFF6IbouCCgb", "UaQhJvHUA5aZcG": "m8AIlVeBmSkCfoZ3Bj", "fztK6IeIyUC45pnYquRuY0apCBIlNLxWOh0WZYd2462Y2w5TvFcHhEngmMqE": "dfuHN5z0JpQ9YOm2bgejeQ9n5nvYjbu0B9iJXr5ZWszF5rsmaHg8bEK", "cqMyV6K2az0qZpKbPsedBuIzyUXDEoPSG6toxrjLjod72UTp010VJUK7": "MfnWlYDBqL0bBvm6YlWsXYuKqNKBeLYEYWxp5JZ0H6H7g1K0DTA2nCk51bnZPL", "TXzXWHjIWWKkmTJeh0wf9NspwWdl3VkTmgqV28m9c1xPLet6AqrDf11dGL9I3": "FAznZqGCXWX0Yey5hoqUtvhHrEzRV44sqjhUUClQ3zcpV0udAdR34otxu", "k2YbKipq6Nn844zd2VKxlotRrwBL": "fI0ccyJREF", "D9uA": "IA12EO8jbnk0kV05qjrMre5h1csIDqX36", "mKMe1QYv9CQmSHK": "rBcu2IXifTve5PM3YEeDG0OjrC6ozbjC50L1Cu7SCg7kE3gAt30uTUeWyhjKt", "vc66H5ltTa": "GifPEbyrz9FVF9QX2dYLGw4aI2JSxhEwSgygUyvaCBqhf", "vgfp4IRMxnIb8wxSkl1m": "fgND", "uB9KuuTdIZMqE3J": "Cn7MA3EYygsKsjO6ZJOw", "IC3e508TJATohfo67aYSFUExHuoZtd2d1WUFq1JcRwxbBU4ajNmunFjaem070v": "uipYtvaad8Unery6Kdp0", "k48TfqG9MoNEsRh56fCusqJlQLYkhbrTEHdGxT6wZxZBLOz6ORN0lnYkUXFhzml": "ZKWF7A9Q9isLaSW88vGGlUz9ie6Tyk1LkRKTkFwue8MqCYI5ubbEZVx", "QTQHj5UUyAeBV73BqI1WEGAN7tiQMxMH92M0Y0QHFUp0WNytaKZIQF": "tizkOhm0EMHcqPpkDBWZvRlJSs12gjnkoSjoUvUIRf1", "nS": "e114BX2zJk3IVM4VvLJhjiakzipyMO38", "rSo": "rEofbprrQlYdLV9688Cq7vscj", "K68sY62gitOkfEFJLYJDkZezCNEkBlJGxiPGCXXNli3X1BMLznV9": "Vm3t64z5FVSpsYL2umLQ2cp6nrILlqY", "uPyxYWLjECtkP60RyOZn8KFeUmB2EDQKpl27WcL12pLyLgDuRhHMVgwC": "O2G44AYRYcWrWJp", "N1ecuKIeGYrHgHHqtLBG7VZDW1EblNGjti0KSO9gXFjBVfJZLH": "hHRPygUbQjvh", "Pj5w85uhqO7PiOmp5pTPZ1GkXQVo82VxHorWvmVdEmq80": "af2HGWr", "GsuV7BptVrn0W": "htVvLiJnvmm1q2", "qCq3mZcJdqaKYp6egN6BFhRt2EjXBx9XqUJkNvlCNzqghE": "imXPjxcsk5mgWJLqMP8TSDrf5YgH9OlmQkIQ", "YVIA1VMusZOmY": "Rf5C1KVsl0QOb", "MmpSQIoUsdW1nk1Aj4Oe8r2QuTHIOovMWx3psbhaurFfl": "vMp7YWDJabtzSYI5YLGAQKboviqgsaadCch9QOYIj0W5DAqZL8fY", "tFjUPDAnKNaMzm8NwYayevTsjy5UOZm6hT1BOpXZikYjrNrXg0EX7fbs8p": "xvaAEHOmMbXfcdslsM3Fk7HPj", "HWrwmrQix8Mi2tgzwNEabT4WU7D1oAwIJcFR0npNtxBdTVgcp": "VRcBcuXxOKAKxS6kwl1jOaVAni2X8dx8H4qtRPxt3HAiAhI993P0Npwz6tqZcw", "fWANnecQKyV1D2tVXzvQvzhD": "NSq5tu4nXk78rewQEIwnMYKBmTvu", "UwQ2iHEY056VmzbZlADgCwXYtvIHCxip40P7vRxHxtpJlKzVhkd": "qjuGziId", "wHy1UlMysbi2AFEsoZ42wMctmfiLVTZk4TIbDZtywEw": "MQQvrSC6RoE4ul", "dr": "wGLZp06fvGia278YLlPGHyE0CnBe1a6Yr8Y2h8bx", "SgfkNaGkmkfM3NywsXqwf26grKY87zqL4w1gdLgt6HqRhwRz6cajZIY7Mfw7": "C65s2netI5HfTqQJMqIxSWZGGxELMf7bC17TNjXu", "vaWxt32": "fVtNRAikbSMRE", "QmP": "vgJRbawaeus6v7uAk", "gTDymhqApR": "WjVr4Zfoeqi2TG39k7FxOXOHiRrziSmBjFRwTUqC0YlP8OaCANtYt", "dz4": "qX0fOCAWxJyZsca5jy3D", "NvqysYdHAyzIFY2pdzzvrQ96a": "euMQMLKVPpKsu4JqnGjYNH", "Th9sEAWmwb7BBmfEySrMJeB76ZCoB7oXwnTr47HT9v": "abHljYbqxfSWGyYJMEGVqzZdEIJVQehqEwD2dcdkdQqDwGpi952BEXOabD0GDy0", "vx5k9xPgb75KX3iNeqBAlGvd4ZIl6AZ6KcJAmuzCiKzJFQdRoaGGIAo": "Dpp0gLcd3bkb6qazlksg8n", "vnGqNLcGAJh5vVK8PNEHAjAHf1EKFJkRXPTh2q8JYpzlMXUi6dBGT": "nuvUxtsfgHtcMG5ZRC3C7Kofj5NO", "qyjeE6KjgTJ0ym8WxiLDXBKzqc": "M5ddDyZA7h6k4CIjPvL5NBy5JPoT5jBYdcjHSUEFy1VU", "g4brxGoRUG0cM0cFrXrmAOBX0tgnY": "QZMx8efzAIkJxZXW1qJ0w0WEQwU4FvMe1Qe80hI4TKkIXTD23XOCkOwtTB011Brq", "r6MvqAjOwL37rur3oBACLj": "Xxo2pq56mQLYAlwgzbSK5bpgSILXJy54AgNVPYvPVGhh2uaENMmJ8FS0JHIq", "tfphiT9sbm8UI6xxEcK2rh8qXVzGYqKrPH76BuT7oNln4YzLACzuHMBLM": "fczeZIGv983WDI5FtInZdC5y", "lbkpvOUDuAg091yS7JF": "Z6bBIpVyY5ocd94IAmQkHWu1p4nsh6LHAWXu6YPh3n9s0avEH9k6qBDwPelftw2F", "m8l": "qRsCOaJiWmJeS31c", "scG9h2MyLzQhbFfm": "a7My2u8qDv1DH2E01CscmL7JMFxhQH3iX8tJnV4p12InJdUnh2me", "sbcTGzqzZH6m4pdevCjXYZlM6vdphLdWzcB": "QrHym7nCRkL4zJJPaN2NVSRm2bRkoKTcd4qHQS8YigMWZJ0L", "iK8i6VgLWeKt4N8d81MCV1hxzBmyTxQNfw3iU": "rTAU2Qi2NvCwivNVOumlNhW4o97jzCKjqj9vj3", "LYvqYj2VNZvLB80rG": "ORc3Rd3vRz0Nijb12vrAMjlyQMNQ4wO", "CaQWn5mYdGP": "ZEjUTSM9oxlhyY6Tgq08Qi56iU0YTdMQOiHPVMj0ataMcczUeOXCQzGSG", "U1StR": "vAUB0THRl8jBKVU9f1d1m5rddnracnzSTiAvMzh90", "uzENuK82j1AmzNV1iNs0QRX65rxn4d7h24bU": "PhUgF4mKgGi1l3", "uST7sL1GTFnwdfUsvx1MxFX": "E6awsfMx1xAGHrRdV4ZymRLCOS72y1tC1NLPBMMwl9DFq7jVu4shyFWKrgxnsF", "QkDLiH7qNzXKd9EXqUtBd5sE4Tt": "uY", "EDYHfLlwfl0WfkHQeP1LmtN5DswUvu1OQ": "wDU8G1AlxnOTPnAW", "k0UHOzYMNYxTdab61t4nYtvq0DGCiwGIDFJE9CInb4jzRNTx3Y": "XwVXC1hS8f2pUWtevzfXE", "HjF7sTJwKOmCfNAPZnSrnPn8eKphxraqpBXjuFTpb7Rv": "tBJkGogJuURKb8j3tM6rb", "zLKu7XSzEHv3AEqcoE1huqZTbf2zKsqkrZTQPsoNxoqrg7AOu7lUUp": "uo7T7p77ffHpM5wH5IftvTq2TiTakhoaTzymJCpU", "t9ZpXdpjWbAYm0FiNzNni4GhzU8pFTyjSC": "aMOsoRk9QANfJtW0kjNo9Rm3GLovjmWueJPlib6C7coGjJXnNKPfc", "YfolUYDBVKaXbQC27khfeWX3Q5lO": "xLevONHwpBzg6R9H4UVSlIHTrynKuhq6aCjfnQPsU3hxVM00mOLfebp4YJMySz0B", "sDOpUImRknuGcuUkhg2l": "ncSw2JnMzTiUL4S7Lbpq93SFm39IyBE6xgz5DtsXApJV", "NxkmgYl93JaRgw0R8A3NGy0oArNQIXM1f": "qQAckCH", "Zg5whrpEGTPVYzsOoCTC": "v", "KwCvL88C7Onen4OCcAxqRZCag": "Z11JFBX6LZ0x4SO5Hz0B5WyxjSypsSLRmtlpS4OCBVtEaxSQDv76AsEise8rsw", "iDN7JLOGjLeYooDKBNS": "QO9JucDY", "wh9ForWolllBwnnfHyt5ZIpPzszcr6g1Z92Q1kHbpi38b": "UNuMozaZREVifutrOEhDIVvO0y17REja0gtK33Z2YKxl4RVwmbXWN", "UnrD2hOZ38UCISEnUtUmOzroY2xpq9ESCYmCOTqClYzx56D61HO": "mMrF7wbw0DaBlCmUj", "FQ3hnvAxb5taQxjk5c7Aw18Bqi4qkK4Mv9JE9XIKopiqPe7hmEW6PRf43aVj7": "ctfVbCxr7IlSQLXe1eRCpR8YdL7SPwuHlgrzlBjFqm9", "XYS0QEV": "T6as1qPDwlTOQx1IWxdd6tkJtrk7uOlYMp43o5KyalTyZVolGXqP1LwaWq", "xZl7DqsVFICSckepOtTt8U4Fx2aG9IszdBhkkL95HTLRrvg": "VAmTDU", "d3TJmhEQzV7Fy": "ekqc2T34eE0ryVKuhK7fdzI2TZl4o3yMPtCaOApkD3ALKyR9XvYJ", "yJcI2SEREYdBIdufQPUNxO24LIap1qoT4e": "bppebQTvXQHdwz5prYF1zuuGREcq8tWupeEm4uhLVUJFv4XON", "jbHzQ9u3ZfkDpvhjhuRx5kQpyYcrOhh8gUEqonTYmgeL6kvidTK869lEAGY": "CSP8f7Kgs2rlaoKZvi2XlpmwObwjTiYPaV0uirB", "R0sK1": "FRsOB3grOg5", "mR9fYIwwXD1pNJqqy6gwi1efiELHdjIJyQlqy0": "IDjzlpBgx2xmDSxKwLyqCBEoJZj9aCXDZkjNV0ibvCESX3unO5tWrRu9jToqBj", "plnUuKMA5f1YLRFg6LdYIz0BcexPI": "ESdEzLxo48A", "kf1EYB4U9V4CU6CNgy": "lemtx2QF2CCXkRv0L4THoNmp3hGFNLw7rD6LWVIXzAT8nMhzRQ0IpZWg3dAuvw", "CIgT7lZlYk6oA2lWkFLieiWm42JTnu6gkmoNBENqPnQ2wJ": "ADKkFmuTq5EBJp8oP2xFLa64HOTAg2D16jz9czBpPFPc5U2oGoFXW1VfX3j", "fglrZmgOGwqgGR1GKpB4WdLhgigjCZACsO21RNPUddW5eHebr7": "MftXLXbxdu9CUqcLLmtjuJkP5lqLbFeZ", "oO": "IrPbF7j0XPA8STQcnFsUgqS4Tt1axl0e", "LDo8tPIir1AQETRr5uXaouf7rbfiVcEhe3ldyjVcjHio": "ymB01YnkR92RbUkmxML3S7", "dzVwukYA4RMnIIItVIl44dNGcFvuVasUr4wKB2V8kQJ5Fmofrm": "o2bPSp6gMqHcW24O3fijgE06md447mcN3xGvLpshBTK5gn1G", "bP34dXGdwNdIounblqaX4Jak": "lkS4Z9nbUwCMoBxwoKhRSyrX8Xc", "wk7vuV6VKEAKDVoYdYRB6VpOPk1PZzccdnLzwVmFIO01LX2aLug0J9": "JZmNPl9BW97RrVGhQhr3IfkDF1pspQxWJI5hCL6s9kKC654VmpUiROIxMMp1", "z3yqKBC7yElGG7lqqPfml7cDYmeduNYJR0XEwRO2UCN": "qcfv3bKwRM", "slyNzF4fi65wV2wcX5RW": "fX", "SkDuIcmXvW7euZs4frtrenKoWkVhFXYRuPe1E": "njD7cyCMqDJhYtdr7aRlnlCmBuRfDPH7RHBKcfp0tr4rAo", "FgDa7tPmHQnCL1DhWw4SFjrqM9mW": "M6ka", "iIwM": "V7y5DtmpYtXgzmBaXElsG8oMERSYTuI8BJsm63enKXVTuAi", "uLKvB8v5sMOKFYm0uxZifrvq": "F7tKoTumS00Ef6gyhanLmvuEcE8jpWLMbKFe5BVvFyqWOfnJSv7b", "WQ9Pt0AWR5U3Xa65ZA5mTRMvPF6JZ8IOI7IZI7AYuMRyMnLcRhK06mpUr5": "B9OhDFqbH98RW2lLBUuxqKEcxxzyfntqhloD", "wobV8cDKB1Pb3AmY6Urs37GBdwWdzedWM": "wrOlYIbqNPFNh0w35dz", "UXZD9cud": "Eq3ZTbvink8aY4xbIASLgKWltbwtw0CLzBQLGxC9xhgfMYF0qojmreI70ucS", "cZeg3MmyuMu1HwUtI8cl5wBUViKxUW5aS": "QW1MKLsMkwvgSLelm550tyHysjeVnMInTFM", "gJeFOWs802yOteh9JfCUWR": "otk3HrSLoXrvRQU", "MfTNHP5y3Wb3nSAG": "hbAKpQem6i5Du1hyceX5FmrtvZqq", "X3xGa6SndadxvxfUzWadw1THC5r8H8tEJ2PBRovLcpTaLTY0ifaJ7rTY3vLhXKk": "PO6Sm38H2S8YiVJFL", "yjVBetNuNdCa61UbBwhxGJ1FokR9s": "eTlcIIhDiJ9CheaowBjDna7Ot", "A0E4FnhVdpKE2jBNnEu9Qik5S4PJBdSecBlkseq9MTBMl": "x", "owWu1e9XFC": "TZxXDhU4SzchJisV0Tx5pK", "k1pxlxqq5Guan": "IOVnf7I6k3", "FJXb6dUPyxpvoUQKwhEQL0HJ7hXqePPyQYEfBerr": "VZtZszbqNBoLrkwhHZYNhXmOOkmTKntAiAtq7RnQJjB3", "QchStTu5SeWmX69ZzCVxv": "irX5oROSX8tlf7LQucGQ5ZSukyp7lP", "bwarE6IwkeRG9FkV4PTNBtfWc6EzMqfL": "uykIhoKQapOnezykyblIYlZpANEJ", "v9qxLBltSNqHuNEQlifwav8bJIrSW9XpBMsphwizutI1hGmUZGs6LmJA5O": "otOVPh8SvEg", "xlgsYRlCtmSjUCol5o1tUJj8kDVWsnqWj": "ysZFS1w", "ztQhuWEXjWxjkhzEh0gFOGdpwZGn1YCSay7H3yCcNGs": "bGFOI9HdCUnBC149rTI1LmEAq3C33y", "I2qHfR4566iCILNfCuvaOXke54Uzn8GfTtnLsNJTIdb7gCuXxpO0v": "wr4aCBFCKWZ8wEzQFG7o9RtjK7l1MQte1ei1PM1acyssOZlWaXMZDl25Z", "gdrWoaIqU4fvpH2q8KX": "Qs7YjggxCSzZOGVlpZkJbjSb", "cFYaKrQcG8xE7uTOGxpiwLYy4SYHqdSikTUNTLQbWigkUxf5ikiDoWSv25SXcJr4": "bhZQtYOhRYIVV9JGNlifZ15479lx4rBGXb72iexu5Q", "wCOa9TmHxWAZgdtAHh3iCrutf1zPZ8750xVvd1oFJv2irWlU06I8nSKpHd": "GJCLNLf", "Vzeaa6WdW9viJA6e": "bfvNq2hvHQ21r9HS5lBawUiyo6Ycj1Cjuj", "EivneEBFk15epIT1f7oa": "HzuPAhx6i2BLgp8B1au17oN15BjfsA3aWEp9gdYkVmeyuQDZTiQSCoTDVrBtc", "AY88YcQKJqzpwzu54e9zT": "o790sIs2EQQGF5lCTD0kk6A", "ZnVOKD8Q3h5PulPn4ejHMTqewahQkDbxRQ0xyEA940iqz87soTbDCbWcez64": "NwHbE4fyYFIYXTlq00Mc4LKF4Ic0dgaYdlS2slHTRuZNyHaHKI", "ndlhsllpufseYyvhEVLkmCDOgQ": "CrZazJyFjW28wOonRZNA2ErQZozT7u0jguyRazN765Moqh6DhM9", "RoZ1tPjIJgCqfOT4J77NKJ": "zCr3SLVkVXlgGVIVLx7HsZg53TR", "ru3WVFsKoroD1cINMC6Nakx5UPoii7ouZz": "eQ4J4ygd9IV2MTgrfOvJshbqUTmORptO8uVy5RWUn2cT9zxl7KnXsrotcm0OVq", "ldkAoMSFv6SSQKJbqIlMFDJ0TVd": "TUXHYpAvFsM08ETkSFoRzaSVJPDQhlvenXbT0TaElpwT4BvEEtMzEXLxUG14v", "OBztydDnT9h0": "ntqLuGXjgyip6VuG", "HdsEPvyI1npSNWGjYgh1qQFSg09grPZNQEi0AReAvQSjkp6Vd": "FG7wSnunS7LJfd4XSNaqsq7YQtDi7owWVuih", "V2B0M4JZ3BfQ2ilWKjyv6SmWVMLq5YcSVWzqKrgFU64Jy4FTmjkIer9": "RtN", "KbqNoajJrVn9yZyCtxqKUGy13SPSlYfhJNjhqYXTgRxe5UtqXuqpM": "kD18vwLZdvVaOOuJwOrMRvEQNneOCyhAEwkO48EGEPnEO9kP4r8fovv", "O4vV2C2kqmypoJpWx7i55QVwqcEXrTQrF2FN4EpgjjJKGyms": "dpTnIwtrf56D2MUo9YNeXRV3CF1KWjNXErQyNkvd7vf7S8cJoXe", "gWURMieqUx6bTSl2E05f9gm44oMA1HTexMzbSNq48ik0iSVSUqBXS9C6E": "Mk28j62mqy3WCZbiOYcOuBPe1P6stBfiai68rH7e4PIVic4B1eXovHrxg", "KxXWOaDLPGw": "ttviA4Ve2qgJbc45pV3j7Q0SRdoh5RWdO2M", "INTMwdTytQk3QyZHYW7L8ccrP852FEe7lFxhNnpER7CvFNkTDKgR8jbg8MkZOccB": "Q6SHcGXL5YuuD69", "IxtzqNl0zjwbwlwfdXBCXjWALaOHpkuTFs892SIQlBY3ZXeFtrtCvY": "O6Kyw0QfrtKEA7rfd01rG93fJFdwucY", "MGe9SBP4TAAvRNl04Gmtcza3hw9": "YXTpY2rw", "frGPXnSBvoRGDrBI0hM7aDfc8bA0urktCLYmyXRmviKRNYVS": "DsmkceYmBS9HAzdlnGMAV2E1HALELW29Km79b76cu6VLwLjWCctWuDLfqw8sMySU", "M9RMOTxziDTVzAa2yFdRZaJGsYNvBYb6uWhiZrM9L": "zYR66mxvxT9Opvw", "NTlIEkSmpRvDWvLmeUlua0DHYN9S7fR6KXCfMEzXjmYCvvj82Q5bhhIB": "LWy6AB3TjFQFFo7Xic0oVIdsi0EIrMui2q", "xL3Z61kiX2teLqKxMBLRiYuspREF5FzrYgy": "nGFktW3cWhr9rnUdjSfLTchL1HfRiTOm3PcAqp33", "GuKm3Mkd8IQeMy2nDe3jeotXLTG7KotQFq9VggoWYjWS1CjtqAT644XKDQb": "wIDvbwmXigDzXAWxkKNVJkQUlItUGV", "Oh7yDyfSqcpesb7p2CIFUDR2OdYoQiQS4opREXG": "CdBIKbClt5MbagP", "WYwypzVD7z19BIYhfUotyq2ahJeG2Yj7mvkWRCbQQtAyFKIQAfohTjf1wP": "ZJK6Wc", "wXvWz0sRoduB2BtRe5Ie8hGDIQtbNelLr3": "DAtvTu43sCPjIoDhex3kxj4eQcx8hGqs9kAi", "CN8dB0e0p2I60k8DnJVd": "rVPpbyc94xz7a4Ad84DKpsRGUWnsAMYHgmFXL7vmdkK", "FcdJI6kgRIsTSW2u7j2F4Z7sUsaoO9agkqmJ": "hnXhj79rHvN6MeFC1AeUPKlPYhYoDoC9Z", "Fmj": "iW2Wr5olzNEEuw7es0HzNWYGgZJ", "vvCCcjkHcw4gZgbyq90DBJsDPzbtANl06FrMt0CVdT": "dTHgu0MrfnlIo1c0gW92ti0zx5bcEkv1daxUx7uRONtk9JBfkKuBr5Pt", "t5X1Ir6": "ixnwPANzmgvXham56MN2SvENTTAAGJJ9pRH4J8cL6jtfyKlVGLdIxnw", "apiKCXbRPX6Ys5YJoyJdTdBuApTan6": "c9h6taInHV8ulZqNxHxQ", "WycRbmbC59GjaXlocnDSZOSSyBVgKCrzS1TuMSA": "qPgJQAMbfn8ofRMiMSvaWRApXGMdEc0", "rp06mqdvOxtmB6d8fM6q1x9xkC6EKlOQZsT57DPceRppCD": "vyQh", "nyMGEQrMXUPbnCpVGqCm0": "yZePiGpUMDhJLbPaT9beI0ryCm87YQTbKtXj2w6DvH8FZUFSDpIcS", "PZi0xkEzvAXnK6x43yM1kdnZmfl8A8": "T67Fo87BZ0tWHgReMxSeFbNp76h2EjLS67unABef2WInaErzsKgGejW", "D35O58HStPyanFEvLjy": "y1bJZ1sbBuuC2sZ", "DrMJiTW0vkAkxx9grsntZw5nLrmDZZeLPS9QB1LDsO3cjOCxoK": "jYCIlPF5sQGYWR7dRFQIDQVavyI", "QovAZDSTnkF4l3xl6o0Ef8dPRs6IXjWfnVU01CcRQMynnDg5waAFylXwZ": "S8JebV3LFJTSpo9ykMmzr4EP", "Phjzi9JvTaSTc7SJnC5b8TrCx2EXKj6dEMc1xejeFrI5pcpkv": "Nqe6BJoRcLk5Ex97GzyCRWs1zcHj3PthjYy4mvLqIzFw3I2", "w1gc11IslVJwhoqkya5gJG4AhGbeEEHehega7cnE": "en0SaWbPii8Sl7", "A2cfDxzC5Uid9Y4muDVGQTvW": "AVL9kRaNJ9ABxv2PyBAb0M7nDt91NrdIhTbuZp0Hd20NHJUj3vSrhr8KCKudROnc8", "o8": "fWMdF8mn", "b2qOrKYD68P1LpI3yVhXj2GU5jZsSMsgBzrCWBLb": "INU0FBwKgv3p4krbtexsd6JYhta", "DVuynpdxr8goyDmz4fzAvgmkr7ymVupHukHy7U": "RZwYCPp3gbUi4WX", "XngDzqHgWADPHqXjT9ZyvSNLbfqwTaBR8YV2nn84y4Q1U2tYN3pB3j": "hTcgM6Ztg21aEHJDBgANuebgZcUsk8MWnCB0h5GWAHZHdkIhfB0CWDHGNmj19Pa", "EpLpNln1mCW": "V82b72C62ubDXYlSq2GqCOunFNxY97ldZTlREU7fiGpaQS4ufG", "j5PjOTe7TZvrIwO": "QLxZenAjWuZFben31MCqNL9KVz7agU4ZfAbzOFDae9exgqLgei", "P6Jh2biIkmxpGmy2BquEJIbzhFn5LPLGrTAhx4fUUgN8pF7PfAMrb3HZZdPwaqCWw": "wVXU", "PJNPJDepwz6keO1s": "hNWtI2oL6XZ8hWTye4wAqSLOghTUh4dXnGDA3GVJW3TDzzF", "JOTn6qLXvfxA44vkdERorwkFdOb5KpY3ocVcZ8ZNrFAsxUL": "nzS1QNja07Vf5T0Ggzscp9bZID0kFpb2Nifsxl4kBRTxigQb3YWKwaVZ", "Oq64gsnVcSWxPAS3aKxkXPsXnZ": "O9Snlp", "g716tweWZ8rFq8xR3H4EZGxWISI757ufNcuOebn6YAxBxSMpyiRjtiX9uCv7": "ny6RPy", "aIilqKxRJYGAOQcR2UrMcd8qa7wCBBGyVtfim2C40Gz4yqaEqTWnJ9iuu7": "pI37c3VwBdh43A9kidyw3pv27WRlOFLRdP2vX1okmm5DAkmionsksPGR", "ihlgbT5IBe": "b8O5GEwpaBdkRwwfO4Ker4tmB70xXsI", "CwtuKecMYR29eNhQ9c3QnevP3zo79xHbnIIV6mwwDstmy9T55V8jqzAojTdWZA": "FtBHrbXbO6JbFq7UltDHkH8794VAusJrVPLTRZf2M5un1NN9EmAPONOyCz", "nDs": "opqG1QVEYye", "VdFk2u54dSCvj5kLPNeeAtW5jH5JQMqzbzBmKwIu6kBpv": "bgsFn5Wg0NI5InC5hDOr2YQh6BWyZuOo6k1LwFRh3thM", "RyMpwEEE3MVHmR6TiJXpN0qw": "nNl3dUdwJvcv", "nQwN7wyvhBmBs": "pO1a8jCXsn6gKiEBBQUVTiYH3T23JbbfkZ4iawg2w2aQ9nIFMoZhSChuxh", "M4w2dbLnv1YCHbDt5x2ONWvLa5oIerORhIn85ErcUuf98u": "Pc32ZFMdTjcovya6", "fObu9iAkeVPZkI5slVCk2BO7x4datb0vE9t": "ZeS5Q8cnkroZPMSW539g3", "xkksZHirkmVlbUIKSth4f4": "MZMpspkJO0zh1R1A5QeKEWTivTT", "yU7LMOXleqTG9hS1Ngzcw7WjurKzpGpRAohTnLRMg6NZHEq": "H5BNMBdloncsP9q", "PMUIOGs0JUMiDqSYUa6qykyQQVa": "U2Z1YtGmygSfe5A8AZZE7oF9u1PBfSHVOA", "KpFRoYbmfTSO2EodYeYjQtZsCgp1YO": "Nds3Y4oMR0R", "Ckw71IN7FoCuo5HlpS0685TEjG5EXQGYyAKrDU1Z2eIcsjRNUPVgh": "Jn17aFzTsHMhpiBbEXO3xdfFVI30CCukCTp8MM7s7LdS29", "pj4KJwTgOe7EF6pBGGsaBn9BzDgg": "xNSQkKFdF89sjGhm6jnbM9IkecVxgfNvRoY2Im5m3D", "q8BbId55Okn": "VI10Jzzw9gS2F", "J07PCu6WXS3cWW1tDejDSSdwupDGzGm39vlBbWn0ZN": "GiJpASaLLU2iTOao5XW3XNLCGIvu1eTtPI5EExnizEakry5KOP54e", "n76gRR4keiuoqx0xzSyTCZgGq4": "SZIEWEU8Z93lvFS5WTwkBHyoB76m3DkWWqbQ7I", "nUxbhOJaitet8": "irMVrizyGoGVXcQf5QbtD5C214", "Z1TBpOjh5IxpLjhcqe0z27jwVAuH6rAN5HAgR": "jJRV2r0thavOHMJptesYTVGzKuC", "xoNyoqekrLwrbbcugt56BnN2ev": "gXgkW7hIBXXDAKS5DcRAe7gAr6OKvs08T1adxsdhr", "FsFfG2ltA7idsmKrEBDJMtwEzyBPMLYPArpvYC": "JXzh1Z1J8rkbxJ", "T41uGWxNrkJ24fKTx0": "qkp5ou4LJHRN7N4oOQfYJMdSal23gwoF8McRGXgoUe83ip17iQDH6F", "JTRSKZsWqsz7dtO0VWQtSrKvEElV": "E7Fr1z5trzXw4ogZodAUhE86afBocq8qSrdpIv6xEJlgm4Ou8ckBovCZ34", "YgEJc8q3IK0ca69f3Sk5HnPNJ49L1E2O3whhOaiOaGmLAEy2": "kabTpZiaIOD76gtf74hwwwyOT4F", "WhGcvNHJ0tUUJAjh9rFJMOwHp63PcAgDb6dTpUgiElWWm": "UsezUUo68WcoM0AojKLrBH257yOoYoO", "DiaetZqv59yT2QqBUevrDuvYvRQEwq50xczdLdvZW8DkJbu": "AoF8KEBw", "FF4Y9kRk64nm9EgxBzpFoT4EuxMIqG7QCPPMfV10DzffykFdButyWDuSQ": "B3lwTVByDInvB4SXe51lxDiRvZwaNT", "PVdOhDXKukIl02ZoliVECP4u11KBvlAIOiRfnKu": "hoWPUxPZalSgBdzzCcG0ehmHzhtaP7AyogmeOfAYActK0rbm2ief", "bTgSxRVMTV5wio4OAdwO": "OInh2QKvAEqD0B6cKlPa8Y0Ks6X6", "TPZvvu3u3TvWoIVQq9SwjKL3axyqNwgY5qk9N70fVseATDUT1HeVcek0SKMkwxqN9": "IPFIDO", "PekNS2sNO1ZP3mpcBWCz9lCWhQfQPdu6riWELuZlb1oNMzPRv27xLppWs97": "lPIaNBe2QLuNChdICqVbG", "tJEbUhh7BqsUCTvRtmB2umhlyZq5T8snlPZxghQUr": "jWxgxxq0oLGkfpek8ma5UGdrtVDgad36ovKfKQ6MH0GY3RkO0C2eTvKv6QPe", "O6hqi": "nfPYrP7QTd9rt9EeexARSLqbfcjyyLITkl541YPfrNnquCJ0qTfe4lq8KtM7sHvk", "QdywDx7xOc8mPz4OtfPYyZp1yyUuuVqWIBe3rdCTlIxSH": "uXFzii20Alh", "OhzvtG4dsPvvZzslVLbG": "K94wYE3xFWmzqhZ9", "IM57HHo8nKLVZPApCkzjcOU": "g9yQznVsiF84LKEtIjQ4ZXB2", "UbrmZHhQ1m94XjdvlB7VqYGRSyGXAWkUpDWNTHYx0C4yIvUAd5": "l1s6LAgDO8Ok9mx6wZ8muE", "lVXROGX3Bi0xOj": "S9NHhDRw4ByPDVOupn8hassRTkKCo3KGZI", "COVRVun": "wXafQ16c8nGdlQvHtbgX5syu2tJcPUIqaSiFPLy2yOVFa2cFkyWrKetG92Vq4P", "nQTEYLlOKR9t52dS7QQGoS1B": "KhkAul2M9mN28V04u6xf3Y1HEmKlB3iby86MYQwfNrmPJ7Fqf7xfHRGCeLY", "qDFoi2xD5ivphMgYbi": "R5SHDNSRyT1sSkSJ21XYDBNr8ut2xuHySonAVBKkQBDKt7seYeEMIoa8", "xktAfKMNwj": "xmzhB7pN3Srq0DBQ5TUheIPiuQTj13cJ194mDDCL", "Km7RJzTOupWRXG3RdMT2zuBy1N6VT3n0UOPopC0HuuvNyzPhGV6RjA1b": "mQt7HupQUxobKZToDFuGwSG84W6B78nt7jh1WmzCLXP0WOXvsOOK", "LtCIo": "fL3cU5ct5jTX58R7Uh2", "ikl2GC8gLxmp8p2sEgsWYPC2QhQASuMQFuk2D9JEC0z4ZnivSR7QKqjeRATrnVz": "aijek5E91Z6O9igtzmZO90L8qKd", "aSOg5VW": "TbnCP22NY1RXSuherDLFQ9DgATu87D3NsvV1aDDdmGxjNGqWkk8rhIbQmcMLOpa", "HtP9xiAOXeBm6iO2ipjiIxmb9R0GAVZXgpGTJ": "ESubppdUH1LdRCW9JbJwnvrsUJh4kccHDEmzy9jNaAnyrG5ZowI", "SsqkekM74tWMI2hpiiCayrNsK1XaioYCm6bGPfRT1OB3THpvEfs1xb2tGbFRNpkk4": "kDp1iCDGrvlxrsSpUV7Zi6wXtEU0WVVWARjyL8ogcu8zURM3wb61e6Zn5f8HS3w", "FXxze9UEg17JKyh19hU4EhwkIcbrKUE0H": "e2ysNyTZlMufY3TuyplKvoTGGptvUyNCTe59Ku3KxirfPTrZOgkNmcbrRM", "ViuCGF0s7oDZ2Gx2t": "DHtJcjcUDRLsQC3s", "W3iv5usJ7dEfanvKHFFYVIXcAuioMsyNUaOiCvDnp61i0IRHaL2GY": "QhpSwiFefKWLpoEna9CKYnTZNbeKLfteiiPpDrnrtNt9sEfBYuXZHfxvFJ4Bmx", "icAZrFLxj52LtG3Uzq2VoQUHGxoCJ": "F5V8FlL9BZui4xuaiszOrLzxfukRA7", "WlIdykhQrObuD9ktJzf3kpPrr546S7G4hr4mhNIvaIxSAJzue": "fYgxFtTko8CjVVxel6PnZ69oTE", "iKdGhPVRhEOk4jCNb": "eOfJcb5FGzQsZLMdHdczROprzD5bG2qU", "Eg0iRo97MifiDbi": "HKschKnJHYoi33LGteMHjfAqwsHZcgzVFog4i28B1BmX8aojcq", "CZQBg1Uuv15Ov9YvO5obr": "UyllgE73mT8xHcZoVTn", "io6wptjNCR0lcHyHvbQVlx1ZL3XxqaM4lApgpC": "hgOTHnzYRIt4gVHbsraBHJQdFTUzBZDTGrEbaThJOFClMej1MPQlueXx", "Ec4L2lKkAvlvhRXGjdJ9wY2l": "gxyDAsj4xxX9pWEnQwc2UKMMB", "LVzF94tx1fkRK1b0bg9Si0Uk8VOQbO6bYn2gjDdCJWmUM": "Uaeg7wWFnsYra0YynN9LfTx5EOUPXIjA7z", "YuAm1YxYzt35RcIcxjJE2TSnOxBdaFGP": "iYstfScTt88fUehwXfB50totJciQZHY8DlZ8nBzKxlaA", "ITqSbI5YIk4I4UJ3PywQF3wiPLsPyx2A": "sfOkouBRydwDrsDg6v5I8PMH90P2RyrXbmiuIjuMRxp5zvnbLAJDnBUN83TI07b", "HPXbS2dFu0Nx5MJnSczVyPe0g4anCSyfT4qwJYBTm18oSchBmHZ6C6": "c5HQKtH9m", "oMYuQzOAqx0nA9jbF7LgPB14lO9jCixWUN3PPUUzd5zwutxoFZjY": "UETKFTkuoP0wQQEapJOfXtVUK9K6zwJ9snNqC0jTSjqoTtR", "PfvLfuWYQlXe": "eJcrTtuwOsM3sT84ps1D4DfFfiVhhOIwMJvKqlwfCVSKAL2VomX6w", "Ao8pEtU7zYpXbb5sUB5cZnHh0HmpA5ztTcfkm": "ValAkiVvyGntBbcPMqv5BVR3TrOvdEVTvrgnF6YcofiXS6", "umzrzq232": "iOfSgA4rworA1YkD51R9xCz5QejCaFWU6VldfcN5vSr1bvXG0tAAw", "JdkuLanUsOormhhDcfPQFd": "OxBV5txHRoKlobd64ceK1JXTIHZm4I8SW8k99iRltnDYri7fGaCpwlLgAq", "phclpcpVKEttQaUriCiFHEhsXeh3MxUaiTZtLbDIOtDhd0BpwDnANFC7oGHbxyaz": "VRDPuDxxd", "cQcYtEpzcPZ4sOQ1e": "OEjCzFWNsCx50mCOXo9mG0qdGv0uOUzr6FYETy7KdUx11W", "YW": "q", "cnQxpYxKL5Fwu2g4bEvDyXyTsJaPrcxhzovae5JY": "fpaOe0qQ", "GBYT0OF3sbmExVqeZQY7przJMDst1Keic8fp28ppZt5YFN7hp7Em": "qNyQvPsz1rxi5ppbCC787", "Sr3xh7bw1hSA7Ie": "HqoUUw", "pOFpQdfrqkNf8WAU4BfdlctlCSYarpC87PXD6zJ4IaMS58xUbiR": "g1Wqguew69rvzzpTSavbxPP6ROfS9GXGkJVc0RHnzHWYZ7eAFFMcuZ7", "g66Rwu61": "E8hNAdmnnUqMVyI2LZrzHBYBdhR98mS4b7OgCTI", "dwWcursockos0UlaRJsp3MJ0nXDBstzZwrtQ9jCskFcxVnraaPrMD": "osb3vwX1pl7hATVdF9YQpZDYtjjekfCSF", "lsPTt6n1IU8": "Zu3KjSZiLUE75IoD11GJvlbKmj2Y0688ZwYyKZKvX", "DFQkbwrMOU3qepzkHxQY8MySwbe2p": "YJ", "LxGYximc3pHOe7dtBL0ZJQfATMtndBBurDayW4op": "XcXPj3Z5M3Pz4R1RGIMcwur4Miqi3K3wWK", "As5KSWpD61EdeKJ0gnPvKan1KanfusQ4eRmFKv96IpFuMThCieZETpsirg6": "vhv2vDfB98WDO1abNBJbiyS7TVNO7LL", "UvVCsvHZ5tipWC1wXx6SDndHTghkR": "rv9IKkyHQx2b48FBpsTFhn8sFZAvBGsy7q2ARtwmd4WK", "eVys7ThRnTViaIpdxXhtDt3sU3zS6JRcgjh5": "EzKnLlgROOjf2O1aAiYBX4ggm4j6SFuEJ8NHfDAqtUSTHJI5b9Rb6BN", "dxK": "hwltiqIyYADicHpdUSUW4zIO", "mkCABeLrdxu": "vXMHnkwpbEXVkVpgZbfUoOwG", "EfqsxRvwBQnuGVqh94PtQvScIhSonk": "QgZE1ko0NqAWfhOuMvULoWz5aGNDHO6Q", "V4iGImufs4uU": "K36yODczRDbO6PZns7c32dD0YI5eudjneBPjcSrDH01ugWk3t9Frplg2w8x", "wj6xDdlPCQm90mTiGxg0": "FSNcYqJrtjyTZjwcIkdOCs0gc7zn", "t5SGACTJgoVYpH3COa7Hdg3F95tCxWAiQG3RCepErvLYu7G5AMSTL0hfi7xL": "fLIWeHE", "DYGapustR9xTwN5GHS": "dh8cH", "AShQUagh6iL0GSyN1b7kP4BECC7ql7sw": "wTcRI24NL7cRvgvVcn2IZ74my10ZltRK5LKIwCmiPXEAbkNOeu1HUjI", "RBT1EQzXldACczWObJG8Wb6gghoBohrIibL9RDjOpf0gIP": "adOtMHFWsKlv", "hu00UqrSP6bzL7ABpsFJHSBGScOvIjd0xkoVLOFcHBBnENSQ9rCI3bBbW6ngpm6EZ": "LXMTw08zSSARJKb18i0bwD5RXu38YEwBTZzjl", "UsU02I9dhotcw0AqAySYc0e07kAmW": "Sa7XCiJFYyPvhQEPtv1ZUQGlml1QHL8nvSlvRT8WQkZw9Ya", "Ek3ySvZc1mfnuWJ6gJcdloLshvIZY6B": "C17VlEbrLQWcygFcv0HtKLvjzYPUVyoPtOY", "Cbq38opSaeko3D6JqxOIKW79gvASZba3UdGSZnMJuJj9uyeR": "ZlB94dnMf", "qf14ZAKXIZQa7eMywl": "e5QT70SNxNbri9BXQQ16s8b4TugW1FY6m", "rCB9WeRCCQoCiecDtqPKJw00R5dgJxMkZvMcUYLIg2x": "A5rWwKM0Zv7vODPQOSsDOqTgJ", "hYkd6DyZ9P5ma13XHRRaQS3UHZAL9CK5eMOvz7Tf4mZtlP": "IThKjVY5vDesm2ttBLwLngGHsU2X5QdmGg4Q", "MO9jRfmCvOOL": "ZL0I6ep1Qt0WFkIT3ZI0dZewjjjqqJYJTEAmYzOUJLCPpPoQFZWi8tJ", "peogpRf4vKmNzY2nhqkHjAhrllJDqhfgOIJ4fcxonaxInDXBDX2P5lwDFtUMkAVb4": "fNsUtjbg1FEFWidKbA", "tgS05r0R3MKwQj2CWIFWNvE5Pxj": "PFAuwjhbka9wRUhU8J4Di", "cOJK7Llxq5McChRCNrB918mkRGZDCyHyLeYtsaq9Iw6": "lplSLJH4yg3t5SRgpon1u9Z9tH8F9LXypvCie3EwTDihZaLWPj0QUsrFTx", "Q0D9UldpgTY6VVJsaDNFAMK": "YSYmj1c9ZwvPbgLrFybHOH1MMcLAeLR0FV", "VhZtjuwKzk7cZDHNhDQJmP": "Mu3RW57e2ftyi5k0MSvw9vt1FvufFWK7Uxj8fL6a2vFoO3GJZVx", "pmY7zeSZVYv6NMxXpJ7tKXblZkf50iQ1": "Pz751TvmZQexiagFTaDnLDF5v6oX0APxgMF8D9u", "Jnvw": "h4XMf2IwL", "UjywoTEtvV8Y7OGTdJ8Y8XVtcjhhdov3OlYB5dk": "v3y5c5VBPLnluUzzcQRTRVaMwo53h3U0", "VSYE9y4YGLh4hlQFF2cabNcQtUwRLflrK2DJn2YW3NUjg": "a6N", "q8m2vw5iDyJonnw8qsVbhjXmRgg6TGYbYYMZt538": "HAU67Mi8zJ3j4KPFXP", "ExIR9mlWvx2WvAvq": "l7t1bO8XKwXaV8f2TqfDT39AwNwOsDxSEeDA3igf3UaLWg", "hzHlPvya0DA0qK5YbwJfWx": "W5HkiWf6cw2jt4UGtWpIOWhcmuDYIPye9EMxd4xKuEtUlSvoURTRsj", "nUmKW": "fPxkiGYLn51r01RgbcAuPvmlJwyjZSZ34KzBOI", "NRMgaoKXnGR0IgyomtNgpixxts": "U8rogJzb6", "fnws": "IFbgXM18a1UNts5bEiMrvAX7D3F1k0XzBR5dd18uJQJpTMB5CP", "GbB4wuMtA2": "TkJegnZHQQsOXAnpGsHKWaUlsiBPAQ4NpSRLc0gDB8X59r80SlaRmrjUDRd2XI", "pKNLksEqLmeECwWc9wlxHKzhgy99kMA8hudXzmmImUir9fF9V4aZfj": "PKzxiDyIo", "c1Lot9XaTiF4LrCTKiGe33FH08fIVH7Nq": "VESbzhC7EyR11WgKiM3bm", "nIZ93T9y0hTkLdSYPpQoOvoBO4If6PQH2oyXpsdrns4O9": "tMMSXh8iJeXE5rc6TEi", "Y7T0X5ffminYRNZLMI5L4BSeYxGSsFcSkAoTh5RsbKK79C0xgGlQSE86yS67DwPWz": "QIIuaVcJGTmk721WPncrCxE4C0KtCJ82eBTI8m7CnCdmplNWFSCxXq7hrL", "RLaoxuEKq5St0ILrWc1OCGf4U9SsFUlJi7OWEh3": "is6CcU1JPJXcMgSHgwFQ", "VrRL0hxIk84s29QrcihA80HK8LfnobiE9TeCbOYBeTZpJc3yFfc": "KnnTPLsAZJ3XloGINHGul1TEjJsFSmdwYEWtaLoPLhnU8Y", "QDWGJlgJxykKXE0yShRBZTzacRpFzPrgmN90DmMc9tDgPKKBP0OZGrf1d": "nd6Za2UCEquLhrbUhEKTv6TsJ1M7pOQJBvY6TkF", "bdp01": "mA832kv1Ul7HwqcdFMfP29iJG8adN2YjxNspMWVx20BC0L2TN", "dWxZ8mQxwiuoxgZs9Zswa9J4R3dgkk0Q49Pqufs2": "Pg8HRULZnucm", "pUbVnmOi7lURlX39xdWWX": "LoqPgMTqRpIg8NbE8yYico7IYdmGiNbKHql", "DK3JChUcXC9FYg05UdhT54IWgcGZHlE3BYdecezfJ9URWsraEZJ8QbZn34Hb12": "RKiGHiICsSntzovFa6UnaTw5yBNf4RK2AF9lEVJt", "wU2Zxc1k69KB78k1nadMJLJC": "shGacAtqItMKYtSj5I3vx5QkF9NN01dNIaHwe69xrwm9", "OACEHFquRooLNPKCORvnr2PxwqdeUyM8vd5SME45LpCelrB": "k8wuWWwmm9Ci3DhHj7L", "DxYWlXncDd5AwZEKpf9fd0PLId4NEKq7UkMLTahlZ7YmmpqoFa29YgdIKvpDPmfP": "AkUSBmWuIrgmC", "sZ9M014ie": "n6p0YPNnf4iDtMBXwTM9WDnWZJqULlsNgZlwMHVftzuY1Q7ilbITA1", "Gw8PL": "tCAScmaCHqqzaYdb3bd11ohqC", "v4YmztuShJy0PbVDkfxyWApGRkI3RRBJAWmNxMXzQjnnSw213ocuJpE": "LpIgd", "TAmoB7OGkwp2UaSrxmdvDG5dIgL0yIkg67O67ud74i3IIMIdy9l0OyT4": "lhJkvOtRWOus694qs03kkxax2dlcB0iJ", "UxJuBf1xks7TQQkFaeKF5UuPjCLWob7d8hwAJcAlM8CGod6PajsnNTH3LdFAOBM": "x8RGR6YTHyhNhqSFbJB65", "TBtzftY4r6dsNQTxgM3BWzUek1EQ8jidhNPQ2Z6sa": "tSlVMfYxl84o9HFgWxp9TIqoKexWNRZ9nVhDg4S0iE", "hYIu1K7nuqj0aF3ogxSDB9zJQkWfFA6wzL9Z1mJUU4eInAxUyJFE": "JJBgNMHiJH2xJCCcTRfgi6D87CBadk2A", "abBOE5NHHYkHvprgPPR90h9yMM1zjiWUwB2d1": "n79OEkuPYTPNvkz7", "WOpk7G1aSZJN87ACvEg0": "XLNNgD", "EIwQ4oRS": "zLePV3rRVmD1GBpoAtG7lKgwlojMltbpVNLMtMTBMXqBaxAbpPN", "OrdDi5QG1ehvd81sY7eyLG0ITE3Dhmc2ZLEfX2keSKWzsoP": "zT", "XHfvljTM1asIUIjIHY2cbnavQ4Gwh7IZweFan": "c3S9qzbt1IAwGXZwScmCg0tOffqWxfH4oxTPvPL6R", "WxVxXZGFNUTkpXqfAGSaq9zzQkHQuxir7uaUfYamAGAZT1kymsnE6": "KLTGOJMS4MJYaEjtd6qnG3U0AzraKn0h36mzSbkHXIvRwtbLz0bB369jlhNquLtv", "ImciIIMoRQ8EE1tix1Pi6zMa4oitbQ": "uZUrd5irvXZ4GFheDUioSAJ3XBzybKxFm8lUIHtvTnrmvJvesTnXcIKQUGeTRDQC", "mW7voNEkc8bPFeLNRFPYuZv5IVejydhqty1": "ljKeo4fnO9WenhG3Oxb3gpgSaW1aqsNSGn", "XikJEBIP": "iDA8KsSaPfkJcQKqxigZymJ4Ej0BMyFT5ZvXYmHe", "Dg8d": "sxi6b0bIa0oTPp3r", "NXfB17Mut0UHYpqDfbb12D9IJ7I5FSBo44UYGkN7muCIC": "MNCS0hPPZcrH3R8rc2dsdKyDsw123EYqDcjoncmoShbwOS2ArehI5Hhwx", "fJvDDA4szdGLDka9M3yYazRlH8QH2Nt2H7ITZ20KwDju1": "ZYL0AJEbGCAlo9Kh4Bm0esVokz2d3zvJotO1TUexzQEV", "QoYkPHrPrk7St3Ps69mbnYfx4ondH": "EH0xEkD28vKP0otOR17pSrPgkoY13bSYd7LlKIv53qcqiujU6A1", "oSQDu9twxucFNFhhiU9ZRdi1LYc": "Gz9jSVDWO89jMlmsHXPrYPmXL1jFgBKom", "SPVNk": "wPIEFBxD8VU5GzQiKOPG38OvJx", "Db5irnst6CH6yr0zWiBROKezqP2p4i9yjSl": "nyjHJvl8j", "x8T9WMwzCck1sf9td7XChtlw4wRKQyEAuKmfm1H98G2UVWmJrXT76B": "WbFWaRjXAbBEQ6eKHRq1YPHWdOJK58A", "D6OvRWa": "fdWCMVKiab73OKJxuDZ7GO2YqClELrwRzpiyPp6o", "jcfBJeNOQ2sDWKBK": "zp8", "FGFb60": "DrmSwMwvxsCvlFa7iOnaIDSXLJomGjl4i5LGWeTOvHIK8329Fvn4GF1E9HlB8", "yoVqUdzs3qAKNuCplCKzd7yWWVo7I4teWDt1gB": "s7Z01NadEM1WN9qFRGvZvU5F9SKmUv8b", "Ak3kXHnxpnENiy0DHkBwSJidDDPdGXUNIJaFc": "obVKVC1DpcibXNVD295bdsJQhZBqdWIk2qLJ9aEpxv5UpP", "ctP2wlggSulQ54P9aFWuiXHD3zNhWZk8OpGC2iwVVdMIOETRu7M": "lB0h91P1QMo0kgNtdG3Mc", "lUnUU2L3bswAvGH0wiZwHlXbRN2eIzNZj0Sh5wSqql": "Wr0mBt23vbTpas8PHlUQkKVcVcfrSMViIgwkLM1ok1", "DtPe1cVpuAdjhsnN6wXDqHEr5bSyCjxRrQOkq83KpWbGpGnhoVJl": "yDDrpdCKP2VfurKCFv8NwRaJhFWasND7NztV6BRVTWuP", "bA5BAsEufasi2M6VsPUmPijIla68IioqQYgr7vsDC35qNu": "ybtIXE3nnPCk7J5ESsTHa10AyLxXd31ZiUL0D7TLjzpbRw", "LQrOktH8arppeJguTaYaQbrpm2xXKXV4yjN74cdM1": "R9hg4113Xm24amsqVwRSNkyBUIJBhj4d2Zy5", "MDRDMNz6t2o25EDVZ0pMrsRcgY6wR5d95zIm": "F1Y7ErSqhhvQH9yKu0BGP9o6Zz1gnOhjaV3lCHICIpztKzyUZpnSl", "JjXekuJHWvUPtUJdbabn": "WUQv8crJC2kxQkaWe2GV5TUrUnEcLFwWQM", "QM1qBcn3E9Ml9iImr": "qYS0W6bCuznFIYLNCV", "thy2tZRKaejwMtuP": "s4HaOU7t", "q831Kaoof0Na00oYZWefz": "RH1emomWBd1Hu5HTWcgM3GhnKShEvuyIe5gJ13knxXchK0", "a9cs2": "wghIZijGEgNoFVjkGKwEVVattkLPzxAarwOHNLszd4iS", "yxiS6YqL2Omz6JEGPxv3UDhGVFf2RXymqBqNtGU51nWAhcbOi": "UPNYpf8EBWwgZ7dAYPw4kedai4S7S8WNz3JDjvODyUmZg4nAzMFwyUfi", "p9CnsJ2YhyZO3QqWFVyrF": "LD1h4qw7QIGgoQVmH5m2hTfnQruQIJcnPZv", "tXZ946CzjBti4RpQBK9pu6K3ielobnlUulGuLiA5VsjJi1pg81CCqJHG": "gyGwpvYZ0hMyZDznVF3hkX39LdqfZJPvHeWee83xIoLZFN9FDR0D6Q9x", "YwEQ6ln8CQ0zbr4tZPhwYz8AWCt7bF4yWddBj4vN7": "l6U38d8og5ThwVcIdN8k5KWBQUSe14wWc0WaxeZS1d6EOLk0jaj1ZOhC0QuMYH", "TofCzo3luy9br": "Yk6gi3JTWLTu9ySABS8YHg6uzC39VMqfL", "p5zGwhr0TvXyfF9FUGKM2Flqldy95GPn": "GKjJNsAVDmdTPftfWfkfGYI", "DMtPSswNyiUcbf25NBj0CboExVNOftNoTugCQR7j9zr49Zvj2M7vXC": "Ft5FzYDd27i19LAcX3ISKSa4TCwGOmkW88THme1g", "MIglS5GFqvCmDdUBnu7BkuYHnztrKU1YQm53NgjflWf0U935eZei3L4TyxVM1yRyM": "I9g66AMVRpZ5ZhK", "g5xSyJ7vmAwSpBXO5VDRCe313fT2eemsxSDR2F4C": "eWk3C3FXEp8szwhqqdeIxCWi74WlOW3KI01jUQ2AK", "GCdu5Ox3L26kgzWvPqsNka0MteoAdw3Gkq3Q4RbpyoIabHuIDSgh46id8HfelqFy6": "VE8ucfSdDX9CG5rWI7cFZ02UdaHGi7yIPzffYSIiiKNQH9Yll5hez0DpXg", "S7YmWZdTkVcMUoKOWuKgsoFe6ZicF7R6gyMBT175q": "p10kyL5STtBSl0IdqvzZuVh7cecyKsMU3nQTFCCYzV11MGF0inTNk0ZINGsSSWk", "Rx15EWCiiiwo3oA2Z1pzio26IP3hAXm5uGhzYrZGLxBBZuEJmndw": "EDR4AP2L8FZnFqBzG6VgNwtArT", "QaJBEYgkCwPhWZpEwbfFFC8Nc2OTyv5tD5KbptThLrvPAuek1mal2HK51oZ89ws": "bYTi33ZDkXvN8xj1Qna4HaL1u7DZXgLT39HXqALrr77uKpwfkKoRbNV1ca", "xAMu5Byd3OYTt": "eD60nk1wn085jMj8QqQEVFWVhDfRM2FxUkbzpwaXRHEjltcZQJ395", "jhNc7mLIB404bozrtW9co8CKopNfLhoAVRm1r": "JnMCcUAWX0NeTMIK4JzQnkokC9ufqr9hHtnEgBpPxemHjZzfnH4", "HgIOvbmafmSsXfMK69R4onfESL1vI": "blD5c5DoriC2in9t1JT5g0DOyIUAH8GfkiFi9vZ3XSSezd0wk", "M6fBv": "f6X02AtCAD4R1qV4r9Q", "bRPtJWbx4wlhZv9HPionXoWH5kdksSpFuCe6TxCukWuJgeaZ9lP4o3EKFNQu4StA": "Bc7awCnnINbeuDdKrJPg3uwqMQnFjj", "IQ3zaOAgWpijH4gAYC": "idnsdGqT46d93lvEtMpCBPsAPcdZ5rawnGCEUR95dMIS65Q7Nf", "yU0Zjm": "wYuklZ7yYMqNL3sWA", "pdKwYMjjBt4": "fqHJoNXcZE", "DPg2lpQLogCt20MugYkg0RuQGrv52zwLQRwneZsNqZHfcpB5XwEZWqT": "h9nkZnPWzxeO60sfty89GosRHwR8LihUNaP", "mDMqsCOStKBZfFKCy2msMlCXYvKof6BKCuJQPSb": "WpsMExwpFh8YWZEo8U5YhN8fAxJYtrWMnPr1uJoJfHWsulIRz", "i0cGHDaurEoLAi4EPI6hSt6MZ": "Wo7tXBnyzWxR", "fz9etDP7KOFHDZVF0I1jbWsve4uO9KBf8FMdJHYab": "jVxaNyDYNrRkbMeu9j3qaHg6yh7kHFOkm7wJqM", "e6GrW": "QYNDa8Wxh0VjWDP5hGs4GbpwrI4rnzOGtmVb4", "eCL4nh1bmBeecMPq5tXiD": "MsV08", "iyd1DInx6386M9dy1BQwOIGU1": "y0fjLAsxoyrA0tzXPKqZakKNEF4UkoY7ixqk", "ShhSU9uA83y21Ryfj5Rjv82HtiFKYo3YyqxSvKd82Y50pyO8UJnLjas6r2llER5Tp": "Lh9x", "RaBAUsmUNX": "IK68Bjr7NmPnsBWxRRish0z1fJTo4xF1JZ7EJWORnH1O07TpW9WuBneADqG3Iue3", "lWccHxKbZs": "KNhO", "svhfNICX": "jgrb6ar354Ru8Fu2VnxUbYNBuV", "qsi8h632GvIbO5uXsSCFkh7AGCD0aO85qwW": "rQXJayJz", "vwFk5VBVjxOnMZ4iJHggKeMwgayHHExIJ1Z6qyZS2yWGVDwX": "Fgn937Rz5jRUfv6OZdTHrAG0pMoDIP47Wd0IRjgs3vS9ygEN3I", "NHkU9ktasvTSez6F": "zDU2H5lEGV4CVl5", "KnttI8DhOetTRFgeYuK6hrVky1O": "AdIM8piSYrySNSefWbP2DX1RwqYB3E7me2tx9xMs2kIorafsoSi122Cxk4cXhjO", "RRBdN8YXQT9f8dW3rQSBaG2ZbDb3e9PzXTo": "DXOglQSaCMcU2ymJEVk0L", "wmwfFGKMQHgLpEnE6k9Bi18lC0NSUeWiQnO": "qpOyUtHS7jvL7TvxLWn0a680", "HDkq65lfZSIxPPruKsBlZosXSKWdlWm4PoXnYwL5gb": "eefcKzX2sdX8thKG", "sJ": "d47wJG4mS0OlwjqOhEgPXucLQcg9", "AgWKnbrnvPUHvMoSPEoOPP7": "u5VTjvI", "o1DU2KapeNXC": "jp56GvK5h325ZYaES", "yCOkyEReJlquNaTiCT7rOWPDnsYBq": "GZnFPGZl5mWfgQs6DAIzRoT2nMuuaURDVosVU61Jnt", "EOghKLQsBGLtxJbi6ImJcjmVWW4ey1alw8DyTYkRZHKIF8nhFvG1y1B4ZyGbHC": "GlmlQd3JuwcYFTYRIkWgqI20hx4bb1FhORdPN", "LwSd9aHobOkWJiDv7RTBWk8y5XR65OlYbVRw5r0FGhjBgzwwH0Ya8t6disvMjO": "aYfCK59bURt8w8xIK9bGc9da8nfadW9tTmQMITrkyB2b", "U6GNW8CCxOGGaaWAGRVIRxviPbTTyoOg": "yLPS9cCkH0KhSuSshlJkdJRqplucMLB7AqQ3zm60kzufJESJ3WabhNWY5Nb", "JxU6s8LhG5Jd9Z3UaTUd0ODMovSHpTtUScNet7MtVuurMA": "WHiQY6FT5mTse8unU0bGvCco7zxzJMFm", "WpdRlWDpaGSikj96JWOZwYZX6kqtx5PeJY8UxofmJOE4hFe6DdHz0W0KznOT": "AL", "OsHVObaEXEy3coiSuIUHkQcJxDVC09jzmbTBt": "ZQ", "SKQG0B0j4TvZKF": "Gwg12CVWgWWPlg2zv5r2bcZklLaCmBc3gE3ZN3065KgCo", "Umxl2JxxomPy7UuYxzZGbdXWdy1FIW23XoQuHRNTHuGuyDagM": "WGzNPT4", "p9d2kPthUNXeZgeqiqHbCcghRd7": "fFtNJanJG2nCVGvI8OG8maCwnx2tXm", "EGRJp8HNy21xWN2DKftGBsJ9oNtBKKORV3BAmEVAsXtmWLTf5bVxInpDzhtuft2": "Yhjen1xtC5AWeTiT1", "P36ACp6kjKdRFu9DU89Q5x0ZfrcczB4BBX": "GUGcloklOhX3f3lLWzF3a3Fi6S5J7dtTNh0E8gnLwUTCyb", "JQUm1aYtM8qLZKRt37KLxVKz4U3arOUZu9K8bDIGJSZ7DQSPyOopuDsiTvyfHtf": "pYQbz4s18HqW3iERl9O1Kh7vC", "CFzhcxK70cGZzm22u4yY31LlWjblMPgach3iTDLHv": "qbmDoIbKNJzcJlN3KJyRHohahv1PuXZyEQx7", "gtP59P3NvBKlapmevX6qAKn8TCSzgZEnOh47Vm61RFMwJZZCDBS2vLX0": "LSvyUDRBpJ3QAdrAN", "YRhPKr27W8zfLDz3On": "qk7AqTHXj8W89B9X9M89hn8g7YviC4u5NMEPqhOTj4Ve8n4IH", "DEFa12HI64Gb5xF3FnNRj2TDHfY1oDb7hu9i2xcIFSbKEwmXiZ9AP04r26": "E25GLBLo0TIcbrfIDzhnShbFXqE", "V5puNThIYJsMxjNLnjrAENSsM6sz3MDO8TdWuE": "OLa4G9pZKigIhnu", "gbC8rI737mdnXzo4": "diaNlWYg3DpxOcLjyyIdRZUHNlpii752TNAzMIIVVW", "S80iO6a04j": "czIwDW4EQdo", "ehJGnS6ObejMjrbYc318dTAGi6": "fR0wa8R2VoO0hcBd95aw5X", "iyWIl2WP5G4OpgaZdVYGYZFipKwgA8xvF5SCX3": "a9WhSaqElAkqD4EXKRb7NLRPa", "Hhi0hMUUaH7ApOiSLMusDQLIWz": "KDHSEiczicuj4tCF504flK1Gp4JeOyBKAafwlpsW3cStohb4xuaHbVQGi71t", "TiRbWwEmwF021SiZHPMiu": "K", "QFxDUmBc4zCnuqzjrdYgUpjaK6s4LERpD6u": "u9tQT", "zZo": "cQo2Jg0qeyLwlWHsownzkP6M2CobaWz", "Y5UudPByf2JprTxr2PVgNmQ3DLfnwi3vKwaWCRnCG4JFqFGoiGbeDUZvOb7Yx8": "HWY5Nc5x1hWTJF", "PNnJ2NvUyGrYoJdUkurVxcP5i6VCbE7TGGuYTX3vVeaGgTUpA1j0llpbRfdk": "qgj7Qruih2Mak5rhQ5btXsyqKDlNKFUfPSd5VFSCLltQypZflLJwYLOpvxHHc", "F40sMm6JVo6jljKoQRG9bIALAygGYKkpZPfLxovC6FjJj4uKNdrV": "vCt3znGPpuZ4skA9jGcA1JuZdCQ80mL5BqiILDWlJUcuXgUwxVRFwxsjj", "IPrYnMejl4bZHdij78aJvpCeYonHyS2KtxhljRVGJsR30lWMHCDILA5KXJLW9uuf": "Wy9P", "bpiLe5p": "eH67JihWvF2AAhkhzNrv1hpOozuMPOm1RZurk9A93cFV6ocwwVd0Fqo24vph7OhjW", "oOXWWU3UoTvVzbyqn8Zr2zCyR1aKxXulCF4DbvEjyEnMUOT5Z2": "K8XLIbX", "nAyw1mGZrXjFF4SH9ojTh": "hJ06M4NFi", "fLkwU9Oco2eJwjKZWpXOUB": "geIyVry1Ey35gHXfA5xSgO", "SfureWi9vTpIHDMlLQPMwAOUgivGu25TpZyZGRli4nyVCgx5MZ07WldNspCYS": "H", "I9g4cKWxWLNmyILjEpn9y3wLKgMk2zKIj": "eySHY1Nrw8V1El6ovugJjL2MEHokSyIG4OTzFzYjy7kjSMf61eXB3gAY1", "MSw": "gNrkqOVvo4oq6sSOEkiGq8btIdj", "JDIz4LTNIgKQ13I97h4usFWX1mf5BewQDiLud0yklU9eU": "fUxS67ouIN5I8h0frOTyqY070zUr5OgE4Z", "Wi6BU3mvRTRmamD": "V3O54vRufAd6APmGS7nqaM9UUG43MGxpME", "G3isIk68gl7cbQOn": "JkwBjd4m58hswU", "YsiJFOucJUQAp": "av4C95HLMJOO8JAsRDYz3y5znZ4rZiUYOgQhuLXZeucbrnr8vpA607aUtHrwe", "mhdLFYkFFDINJEbs3C3YFVhBKwxvpa3mn0wwGV": "l13snSz6IsLIYvOn43m8tbQYDnYCQ1SfvpN57VOZwJB3GbVzKFFlLmQt82jSU", "ETBiSDc8PBsBkGoMgBxbWMm5": "mxcbWyZUMgp5eBtHe", "RLVjt23YtrCgneDFd68ygIEQ7jscaxHiklecE4L4G5eGQsEL8cAE7T26O": "fu4ikM0MRnqpVsmbRTdeDOoyR4KmH6mylmQkz4Q7K71", "zBYGczCw0WOJH9P6KhKPozHe0uRBwl3jptMpAb8EIMVZagmyzGO3576": "NNkAMMor3Fo2KMrZhpcxUnJFyrHrYE", "tVj6VO9zDfiX9QxSNuGc9aQ493WafibudEV6brlIDWPh5yuWv2BjblOyrUmtgX2": "nfQ0qImyrqpptMoCJyVhF1W0zvj3wnxHQEvYSqc6xt2", "VP46V7pe0vwrrSTRHUE1aTPw84vw8fCRPrH": "iPZxneIrIn6FSmR4wZvhwdh6", "DzEL7uQDJyTyOAjHVhnvQz4cPijzhhh49qggadTnYBhiES4": "CKmQEb4w9vlL5QaUod8lMgwfJiHNgkgNTXnd06D9pkByJrnj45ubWoXrbnNwN", "jKr2MfbW0": "D1Y9MexbHzrhKpBz7MwhoE8HrmNI5DXSM0oQSC9cuyyM67EpRGa55s49ejuPL", "OZhZZviTfCsuixu7QvLE0ovs6YfGwJEv3VvmnZ4XYwWbSNJEOPS2Qhpu9": "Dz2qEYBie2VwKPSVsSYm9bdLy0zK9puAJ7IKtREJGcRmlKgQml16B", "uPeONBJtMSvuQavXUD7ixAmQOn6l7i1oCfMm9INdv1rhX3N0XLlDAOQg6Vb": "qqarnCDY11J9GS4TJe6y0MtAj5ms8ndXT98DmVlmc3lc9tTXzwEfBITnh5sGSFT84", "M3nvWNleyos3f8riCxq6kiWGMK0D25Af2qrBRI": "sUqYxtcYjk6wvbldUfECghBpIP02k2pob987tT", "PZs3AIm": "bty7pYj7Fkopz4VsbAhcQU81D6g3NpflNvkp", "mP": "hbz1YcdLIGUlYnzZdotsSfAUkllggT", "JLQsDwWDwgKz5NqUTzZnY24": "tU60e9nRqoCOMJmzF4RjkJLsJPqTdcEqeRyXwsT", "Uygehn6Mxcjv98cVsGcZOMwPKJM": "UCG2FRUzIznh3HegIQe7uNv0hQU7zRNJSN", "AuLmRQG1A5Qsdej7jayiKSlypbO94s8mO": "CLgsI3zaoauoq0byhMbln4S5wlvRPiAzIyUozchvay1OIzZF", "bdraQEenlEyVLkAZQIQgT14phUGmGwJS1PBH2iZTJ2r6iOGpK": "d", "auYIEG1yGKiBYUExOSVG28pX30Wgkg0MELddgUlj3M4IjQR6LTclXX2r": "Hp", "aj1PCRNG2VCn8JdzdUm9pAZBwVPZrZciqjeaPjrmKApIpsOC0ggwezPn": "mSK1VBM6DEBkjGXYXdai9QdGnjW2xelLl5qNU4uirqFw9W1AnsUaKTCh6JJSg", "M1tktxDKsZKgFeMpjFbJdQwvKlTW3p0MECjFddWQaqElIj3kW0BgAubIOBuK": "eFDCfvS72atF8A", "O9": "ka", "LCdmRnz30veCc4Ex30p4quT7q0u": "aYyZIXRmDWmJYA9EUVMPIWBd6dWdBayd1bYMF", "QqXpYu6sSPSAz5vKwva7eOBPEgMV9hMEpZi9GByID3Tnlzb5BAnLDwKMI": "tmT1G3NPFdB7TKsuaQw0Q4Iu1y11lVDgTJaOCalSIsRjdRcI7vf", "SpNAJh": "Qss9mjdgBkIo096a2yaAz3yRJOryAlwlXW0DdWVBQzMiRO88Yk3", "yHIxvXGWYNefcI49lDrUWMckJX0QERatLjYR4QcAxDV6GhaDCsg808zIoeG": "kMZRfJ1sbY184Uh7t78cTrRt2UYBMuVKhZzuIA4rM0tCS47NKOMf7xABNva4", "Dv049DJpyJWvD": "GDVeHsqqF7uA7", "cSYcmkvD4lmdx95Ir1YDR8ThMM90PTKmVo1F1EFwR4ZwJSUPFS": "MXfvyolnUxMQJh0SmfJMPkiVKL2QMa", "B5r8l72PETJSzp8hNMtQOpIOHohfErFk5e7Vlw1RXtTYWcfN2hgWcYt3dJNNXk8": "aG", "PP2w8Mje3DYCRGxXYMC637UvMyizl2zYmdfKIHca": "FjUXb", "jX7E995NbbnQILXWG2hyGi0hW": "XSkFf5LwpUAqD5zIcCvX1DNa5LNPoVR5ZCnsPEFFTZostxMO9Y2JlP", "QAVGBRdZy4MBskexVS": "YsuQteAhaoM0r9J1j", "ll4lj4oqEHk1lFVCnzxLVY4Rgm6NvQxU2Wwncuwvz0n1VwKDXc3d7": "Sht", "WwhpQ4MNOSmIeAuS1WzYpu3W9Qp9n0dHjdVEvsArzSLNY57CE": "Y", "pmy8gD8MhltrVKhNhj0I": "cUQazgAS3HWFhema5UFPdJOj3a3v3tveSMtOxYkmUNpwGph6g", "DtyyOXWJpK1iWvp7R18ZMw4L6bIK3bn3Odja9yB2vwxkrzAeQOvyjTz15MlJStaN": "wREmnylRmaY8kzsK8U", "eESxp3e": "jHbwkBPmv8QKEqBuvcuxJCyAzPalyHoS0iiM4Z8Za3QeJWxwQF", "jckCeDOUEqbwL0vdL5": "Uwff4bciPH6DEnrqqRgM4LK2KmXv4VdA5t6cRNhoKaQdh4L0", "C5": "E8XkfWxisuKrbknLphNafLQOXBsbRWucJngYulqUyTc8", "pMgCwbIQhTjVyA9sU60li0TV": "YkHYrg7l99m6STCPJAYoLOtojxQs8yixHCP71XfgPwA1cENQMPxX3aVlVhJIGgqh6", "GZdcwL8JAiCqVql1Dvs80maGRP0s8vLDwyLZyqpUXcM4o": "wKl30pcErYBominXvsF3psBT1qZmukR69caF", "sV7Vfa6Tsf6VlPLTH6z65": "MjDXJBZoBDPoUhZY", "xfPWuh8h2eqnTjbWVkJESrBEZo": "Nr3VfLEf6VHwGjoC", "X9zD1kMF3O95SPrkFt0xEUbvEgia": "LODPGnodAafvthJkP5eG1JgG8", "AeRfHYy3FgEeMATyn725Rye29yPj5rlYSrCNxHOF5oj3Ww5rIC6wvb": "HmYl5MWUmTnEMhLDAq6c1vTFoG8VBdYyYDW", "arjPaRjJ9yNZTjyz0I6736pl": "oUuXG2nOUXGE", "DGXuZLJu": "hu", "hRSwiosoUcSqjWQalrvR": "rC8b7q9hf7OfdZEzzTN3cRkTXEllNa9aaPJOj6", "tneI0YzXDYah6znHQpdc1Yu7dD2nxTofUbEvoNcSETfSEKLmh1k": "P2iQwLsxoAfJkrW1fspGaUk0q8B4N07yml2RI46ArytNSB0a6Pj8lWA", "fHCCOhkWBsnnFTUCW": "JGfclJtxN7Ii4FTv5fnDIiKjQejoMyGKRjsF7EYIKAKZzO7BZeKiUqx2y", "IssHgm4dAooSzxqiDjljOM2JdGcxxZ2guZ7T1t4MuBY5kpWf8": "hEVx5a4OpAvR50YAPIlwnNDsiLm4gedslaqRBaJ4eImJr", "a3WL3xFgH7JWbztFy8yHFT2XiKciW": "H8vaMKbo2kfj04XDqXVRstNARiAHqiwbUFJbG0LKZoBtAwHJNnOZgk", "hHfEG7v6QdbuXYsu3NfKLR50vIhQYu7t9I8bPGEqilmwpdrX47Y": "xfwIY8hRomzoq1k87ESPCs2NcQZ2pkhaP", "WEjnUtprGZ": "RIBNrq7NxgyqLsc8mhprQstJny1XKMlmpFg7DmitzFJHuEYizR2", "l5mlN4ODsZyfjeEmgYkHyPXvgvsA0iV": "pi5M6e8u89QCFeIM3X6ThH4ZVsTge9lJEiWe7gUwbOrOpU32JTaXmHTXZtUR", "sKxs5Qcgl8FgcqYeWjbRnJb29clu2ch23P8QKU9Ans5": "Skc1CGsEhLJHmbKZk4pqMRRT2wwqVibPmwHLg6", "ut40dzBG4l5pP": "B6FUAuUCkrizutFNJhSnYdXzTmyhSHtAf2CDLtBI0xWOcjQuDMkkoMUX", "lDPRB4MUXxSzMWzly5pRek9y2EytNhKVr0a1eQcnuR3Af3UnqW5cpuCaK": "ooQ4kDuMukGWwNau7zPEWVpbw6D1z6V6yFfron366oaX7yOgqi4DOfq", "UZ28Xqksy5ajXeRs3A8uUvgtQ4rxGtiTwT4xUw4aL1WjhFW8Oed3KN9IpKcaQ1l": "YQNklw9VbrlG8yIsxYt63EUP1gy", "lVCmFjyVlU": "zM3j2UuTkcnbJV68kWGcCKLSDmUnSb1V2sZF5Z86RteYmMP9IPkE5hXmxTS0o", "lkE5xLEU9a2dHQsKO8QYTJg": "uNnv5gcYGeWGOzaeLiFx8o92q424AbzdyImXRLehrnCKvsK42G27eumyXI", "V3QUmdjPl8bzb9jPUuA6H": "vMi5JLh6Ca", "rNrwW8NQjllAKEquLiH9K0zRsUDNaWOeE": "T9s1isr1Y0Ix", "r3zmBK9": "QWqrd06ScmRZ36mbBYOdOAMqAngxUT9ahPEuPgoeHhdQvjrgSZscFlT0l8", "LIQz7bC7rtENb18xedBFZXsnrBJjvblexoB6jZkYVezrPCLXeC35cZzTpCjpLfV3": "n00vTUBYNVXzccIM1U8rWtGcDNLBrD1MokTrTjzsNlWC9onormeKu5Fys", "LUWWoHy3h": "SA0kTE4j2eJOcxkVUJ2m4wo7WCZw30WpY", "Pkqjm1YjXJwQkeL1NJCjDGtycz5OdMjxdA7OhrZoxLQHZasBB7KqKamApn4aU4j": "lzfnH", "gImmyfxE07fTgNHwg9tgNPsRfL4Ukv4viA7UAhzCBtw4yuSUJeYNGwR59TMiT6y": "QMhYZQdikAim6FnM0bpzSTZLvFqZeikrslZuiHXPxj4DO0IZxFjOJDvj1C", "GWl8D91I30eMjLOUKzLqzP68n2QZaGC": "fEDrG", "nLGXn": "lNrpp37VEVpQlyPXkG2ysb8IunHaeFXwuD0L", "OhkYxjjHXTGf": "I8mk6fDdJfZgg7wX47RIf0of8azuMBqxtIDVEwKks0YT1HkupwLmQ4qj3OIV4COtr", "mKZPCxXfMO8luxrEcsF77X25g": "OnBIiBN2jN", "A5gm5VU7BIea": "jm3hYrLDTHdyYVzcOsh97aib4Xr5dOEdZSHeOYS4ul7", "gD2K": "crkQpi4hu0NMt", "w0NS7M20mjCfYyQakKkAeUANNA5mT": "eZb9buc7Veh4aEc3JCkKe2tntQFQWOjJgmd97ltTFvFdiR", "yMN4I19KXacE3bWxXUSWb9HjMsZtLybolPXCqPTNRyy3Y95CphksMGEbZUUrBS": "Xh0gAjcQPtwSd79WoDKMMvyzja0EN9w4Y", "LTirJXuaYrfqPf1TvKf83jt7mQWQiNiR66HlH": "PYhKcmW5f2UDLWjWDzZEooDkgku8fa4c2S3LCPYk9bu9mIVVWqLro", "dYQsN0DnW9zlIMlB8KOvF": "c34VFnDcuNnedzzrAHQsmVWbIkZrZ5ZMJhKn0a0pogedkYoS", "db": "zjzxcSboZbR7wgkyTAqxF2Hm24ZG46r8DZQ6FP8wyI9zOjdjT4m1SGP9Zr", "C3ZVEBN": "ZjEimI2wETZwC50sRgLIZqD4OJsYMrSrU4uEfRU5v1B6Yl5wUq", "WIycbmZyeewPXP5Us1HPJdh9DimsFzENd7E8Ptq": "JQ9xMQnfSXKehHXpLNc3E6", "mL1Flx7": "C8GKETBMxtS7LKD1TwnSfd4StaW9DaMzQ5vth", "saWg08x0eDRgskBorHbXRKlIhs0cVlKZbthbuVZLKt": "Ul", "AEPfpD1sWgmvfxnF46vojyJp6PRXBqqJPTqpxtHb43WXKFtCdNLzLthJG0kvrVnF": "PS8a7VSYjZagFJWlfBsIaHOz0NJzqP", "IiQmffGf": "runIjlrk85RlQ11gBOo7", "iP7vx9xJTcztHFWAl5nw7wPdbnIgQvONoTV2JyrFDYZH6Qv": "uNEsZXmI", "Ko": "IepRYViTLemW0W5YURQIbhpUt3B", "XdJCw9FQcm1Wcw1fPVlpvkl": "ng1nfUNaqTaJ", "yIKZPE5rDO": "fihRJnnVLfGaqTIY9xDeTNzAVcbqS3f0lztO4gRT7kRCc", "gJ4FeOblAruLb3n6fvziMnlEXwE2DsQzHl4GNZcjn": "rmbuIjV2sDjJYV", "N5LMoSP07fT9Ralq0HWyvSNmeuJ4XOr0eiTMaXohYKEmBawLhIe6O62F7": "NHuSvVY9QQbhVz1", "pcD": "pqmTWqTVWonXWtHFYq418XVSYa1Z", "jXhZRl1QdkpAVpZrYzyNviG4VVfNykT86QBoCfX5XxXrhRuOpooORf8NRKAbm": "Rr00sNTvlF9mnQ5ZyQfqhxJ75qI", "UXw9emGvah2nY6jHbtkI8FeOF820vo4d6oNlqGvh3SFnY6wzK23XnU5Lf5tRV": "nQbdmNJ5HnTqGgY", "Rnxw8v9xxF": "NzyR4k6kas0ZT", "T8iRAfJJjbvv8bVh1Cvb4JsYkMXoRsYILgvCaM1fmneCoa9fbn6NWlSssQ": "mLzbvzBRsEo3IDU5n8voEYT6a448hDtpjmsppxGup9gZnYTgpBMrOyK", "K0sLnqzeypqmfJtQ0cMtXCT1KWLEvFLDul": "OZfjvoMh9eMI9CgHk2BzMXuxVVJXwJ0VLQwbz9dnDtv9ulmEGgj0", "dlTK8EeY7C2D9lKYZtJ9Otz": "OHdYUgbr7Stw", "vZUr9PnR": "wMy0AViER4zTBORES0w", "ETpswcGJYYKiRHghxRzTBo3": "jBxIRnuBtlJeBlD52tO0fiNIq59Qr89ZgJHs", "dP": "qXu", "HYS478oRJl7IxaQ7qwbPAY7ZXB1": "QrrXd8wj", "ho6qPaOEQsk5tolBsDo4NxD": "CZL4N14N32eGiYnt2t7NZpOnOu22j7b", "DdRcojXqXvh9XD8Ew0": "AeM0oHxbUhZ", "n3aQZE4TwjEiridRucM9EQXUHw0nWlWbadMadnUZkGjcc0HLnou6": "HTir5J", "bYfsYwFAysB24EJSnwwSK1bgSPn40HHpuacW89FSB": "ZmCzADIyanHu0Ne4Bwtza9RiLhSKqFdb7KIyX2SHTcUvXxFU5xFQV1PIj", "r0XYYfRoBiHryFmvYEqhFY7nIXd1jmMwBNlLX": "GqCE9LG", "a5voVWdT4ZJ2igDttWidkXs7PPPG2pKjZ": "yJDvp20T8wtMswh196RZvgbyj7UJP24kglOGzOxyq0", "ycW442SCBI8dYpMCfBEfN5SPad75w": "wdOF0D66WiZRqwBKk8cn8", "QBpi9hfFSg1UkWbqX73LFyFYfS4RPmTpcUhz3hMFtS0446BQuI": "el1HBnwmndkD3ggETDbIZ1xrV2zRp8sdKfJeLBDbgYQwFMnu4CUsaR", "YxlTeFj": "tfGuCjgGeH0LIdJPPfT9ViunK17UCGsZp5eaCJgxRay", "Z1HsPEGN": "PB0LpR", "hV2ulekrFbfEpg1ScLTTGOFCh5B9fQmiEwoGG6z3PMDwLJAyIMHko5tj": "mR0xaokIu8Giw5cewqTNff2sVnEbL7EWv5QuPHjIQK11Dz1BfyCnCxgr", "ZgdVvPRzWUIovETBTGKRFTJtfow8iKpBHwaRRCy3YkCa7WEHc0Wg": "X3xR0kleCqk56QlhObjlzlxXQa090yfjBEkuf5FkkO4I", "RtOITYaG91aRYQk7N5r0O5ljZ9Ol2yQhalkEjKtdVXhKzJykvEj": "Gd0xjZyp0iJ1y8qbG0F4tgtYCRkDHOnvCX2ENoUlU2MQ6MsykNwbysgZ1fmvsC", "bu148XDYtjLT9kideQvU0ZNXxzy72ML": "npPoH6rSUFuwBU4khjwivIceGoqik9DCOX1pZs3evyOFTaGJOHhaYxpvreqHLSdY", "h4Yv00McR46i": "Qi9eFOqtLs9SJzlvvGdMbUrM2Ibm", "d0IU5mLRD9FjEBy4tEhViJsgygIr13CCN8zjHhnEZzIWX8MD3a": "L5AtJ", "ONFfZWzxzFlz39C2o11lZlW0JXV": "yz8m", "LG4BM51rjtgBhcX": "KjV6KnRP1", "LQe": "BHGc3RgWGEmxyp3QGTAQbcvChkC9I2HZJ4xgjL2hSsH8WDIkHBW0LwKgs3R", "DAfyw2UY0tbC2zRS0VSWnLNdRbrkYZmiGkV3bGagwnQySvPc8ebTjlUNsE": "kf7hXqAUsERyNUlCk8aDl5iVqN1rU2Q1kJ8", "A0OH83IUPSM4olwHcwgZ6pQVq": "QE75DuwXXiICPJE6Um96kFgcYTur6JzzeLilhTG2HZjrAjc", "ANj2Dyou4Y9tktERMTSdoFizzEHAmfoxdTWMD59w87lRe38nSN": "fwNp1RTG1J1Pe498z70mPoCPYEVm6qmKiO7CGh0HRHgFpgXymv65TaRt", "pmYEW0A9fJ7MTqSEZzlbDJf1iI04bBlrknLYZLyPpz7BHyNNLjeK4U5F": "H5pomr0kE0c1QqZvuHuv8XqK6g3P5x", "gtdWTvb1CJV5ZASOA5yQvmPZzib24yNAXAnEOFaTrF6uLImHCp": "UEExT48UYpjaLAlwKZSLHtrXnwdZ1I28ktSzvRCog81Ciax8FcpJybBA2qy", "CGBFILNYU7C245OWUegWe9El": "AV4EQedbWMEtlFwxoz3AOj75FnoXS1iVNP149T1U", "SooKPF7": "jha4lR8gKDdZBidBgd9uusw7JZyDiI", "g6sPNVyHbK7BqxW56BIbskVhAQTXXCxd0OBtxxa014dZvcdYZi": "JmyhDI7aeQTKp72DxHH2WijSIUtTJC", "AK40AmwcDVSPyGdxiWf": "yNZNlbi3CW", "xigvStpuEXIEFRgZIxZav1OScacqZO9Su4HxiWUAv75X6AC2j6BOU0sBu": "JfEM2LAiGtRp2ICzV0CzuH9wYEv0zCiOTRcEEf1phho", "ZorKXxBOyA": "Bty2VtGE0Jcd5Bda", "cImHJcCnVRHgVaXebSf6YPI": "qBdW0XEH4rkE9hFUN1rs", "TCFzjAoRizFQ": "LCGhAZdrS6Jj", "P2hbc2": "y5yBy6YCoVqdBLTID6vEPAK632nosECOYFq1JBILVURjT", "cpAlwPL50gSnuEy3ufNFoYJyuCtNo99y22vB5rm08aHTmAetkqb22G5bZWOyDpnMo": "eVkcXxYrbhysHRg9UeoSh0sgwV70yo2JmssqgC6RO7sIeQaHin", "wHkd2sDRZTK2NjsJCtI9sVhQLdZjQm2VY0348m9vOpK": "R43IMrbqgucHInPNpEvcsqm62P", "MVyjQApsLoR7h4pvmmA4uqG": "DR3XopfAdwnfId0X3MpptzWx7fR2sttvn5mbGOxsomJZ", "gTH0EkERnZAJcwtPsr7vLPvupU": "IIwaXpl92LFrZn", "M1pbtjB7z5PE5X3Ia3Aq6KFEG7TwVxTJlmpfGOLrKX6JrJP": "vrpknGQRdzzSLrrW1h3m5ehIn0WJULzXZZUL39p6SGYnBUl1mRyNDWBU4iXMNJu", "UKFpKgSrg8qZ8We3qwzoPBLxhQ": "kYvrippXrA0cipV7BYAhu0BeFgiFP8vGYhZV6VUh6wdWAOfb9RHjYtigGY2LbU", "C2hKaikN7Y9Pd": "zddgycsTJKqgyTyC17hcbKDfAXNLh2UQNSZH", "O3": "bb0OfqZljUygjLvtvnVqRv99xxrfb0", "pXIczeamyZvNaQhOFreG617dnUGP4uEe4faf": "xEPuMWOL4TLjlJ9s91v7Mpay0Y1xhIVzt1F3E", "hz0ULYP3SRBivQdW7S74LBfJquiqS4vy9B7Ja7KGk0hWvZHH4SXkwdMlY4O3vf6": "AtZ7yP9FUNNtLul9ZAtvLcjn4M9CNeLjphDRNZusHlN0Km6nTf78RJokm3XFnC", "j7zaDBqXJk": "FbLXvMFma6fLkJIYDdN6pehSDLuk7R", "iboczuO6FuDxFzx0KdpUibtJ2qWM1MpstEwjpf5XD": "rDF3d3MFnxO4Hu7V8GaJ", "cIklyyfXllkpd8aMe7JKquqxGzj9VGAKIfsGGQDsodLSiMVJ9": "mmV13libbb7v67Z1F1tgtfWmM", "Iu": "oQbLoTgVmUceDjYvS87MXFgASsLHsEhUdSZxTCG2U", "fb": "HHN1uAYNCjhoXzDigir7XXktu1", "PYVLHvhw9pZd": "AXG5BuXuJhc", "B95LfUUu4iukvsrVCrK0RmJCFmILvbpXTr": "lvmJcBA9NB", "S0IRo7wpSy1Z1sQacZjgxPw49ZTfJLC5E7iTqwZ": "GzaTl4YsZqQ7ozCAn9lrK", "KnGGfMUdW2ngECK7Ub9KAF9fmtoSGIGSmD78EARi": "fdSuJAr7XitsdF7qDVzQqVJTWJwISan4W5bDybvHA2Urz4c", "aqHyCHcFUSiu8M9ZEkJxtZyOpFQxy89b4xC9iJ00sS7j9c": "HLMrdRC74wTiMCTSurVdMN1eI2H2oEdYjf3W3EoC61IrCkeaGuNzfQPjhBAZ7", "MDE18vL": "TfssPW7edUuEnBuG6U1lsWjXoyYv2X3AYCJIDc", "H8FItCjqsvGEIYRwX499yO4EzYj8m3wku01E": "h6yX94CF0jEenaeTN2", "pU9f9sH1BjQiznQlT": "ArorRQg4GViEpZlwp01ry0SWGeVg2BIZ5NCJwXXF2l", "l11": "lWAC2XHADWekPw0jfWJbnU6vTIbDHNN6EyOZ1dbKKX6ZlFYSqeEs7OwQG72jO1W", "IPkvBxWyOqiS4mGEk0WUQHVGzK9q": "OtUDadZhJbYbkcJq2fV6HQ9", "LWABRgVtyg8LmaI7IlsMT8nsta3lgvuniF9V0TD": "zcb4JM", "Kmh8Hy5xasUejgDkYvwmGT3dUZs5": "nWTMKfWA46fLnvoFuIkpcILZWlBhSrqMDKZtj2YeWni", "SM7b57M5rS7gZJhS43u6NuKNoHidtsQP4hpNjmzIroyFRmHMqI4LBbW7dtoO": "DitOYOPprD1lZs81qu", "VNAJDKqJclp7KBAugAM9L": "lDfU0kR", "hrWFYwudling2yCSlT85RsaaFGeVIthere6VgpFfpe": "QeK8V8cvpaIm3dzC06Cy6cpbRIHp13dXZPgmM8jmWJI8Xzi", "plA2SYAh8Alnc93h7ye7SJHphnhtRw": "Bc19XVC3XuP8FlNmyTUCoufKct0Nak6A7e3uHOsQgaUGAnImsXGQCw", "yaF8e3EP": "kiBdS6KAQLicCtsMMAs7CsZsgYdAO9Pvhh7vLPSqlzSBkRFNz", "LkjW0FCOZK0p1dqTGLJVf33": "PVPMikLdZT87fZqmFSkMc4kZDPtY9JSbbMpnIaTsDaRwtVKabEhDUgWmW7xF", "Y6bUcoj0SZDj4ukuqHVoj7kVIg": "OsQ1Zeq32vaiuBRxNYFl7mcFaB0WNuyjRjW3V3w7i7APYZhdO3i2BreQLptA5", "xdyzXtssBOfbizB5NETmRdtb9uKI5nLVGaYI7OkrIP2IZ": "NQZHyv0eYH3DCTFk3DtpO3dcAQZU4b4PpEscQR2Sdx", "WebFD": "sVpiGqpmx3", "V1xu3qM57XgOO6W1lsGlYTaCx8UEz5FPiyey": "hLUney9CqcYkI1csBp2guO0Siju2CzCcvBCLSv7O", "BhYIykElS3xtxP28J3mDx45Gd0FUHhD0PpffWYcnrUbu4jGwemh3nTpvlCtw6WE": "OGk5C7A6ayG", "CXVsNQGP7lYl9u2YsIcPjz": "aCCmmVWYUNVCdgaVPU2jc1N8jyk9uLa", "Hp3MX70P9tFfjLBCtQQKubqBgMZ3XSgDzXAVtUdcX1Z25nkmg7fDItlo": "Ni37pwkfCtHEYHcm0", "ULq8iBeF1pyAlU1a0pyL": "zIhs5Tzpj8Qtin0jfBzx6vIMb7W4QvGHgF8h9insBneqlDDJmF71pSJfksPx", "oWvYbs3okEBCXsyFvHJOE9rXd8X7bEkK71vuDVu": "dGJoHJkpHQA", "MTgHUdF8fNTe": "iQ7UIvmZIbPb0fRL5MBpvAnhOuvjFtiRyGCIzEA4BfPnV", "b595F1W4XnrH2w0ncoNfPFAPK0mM4SKWf1WGSIX6ct": "GXle9WMZh52a8sdRo6cqYt98rB814uWtg1hciy5v", "rIbjQ3FNZ4pZiRnstR7YywWpLvHrJh7NAM8hreFfrBFZFnjCMog": "zE", "DpVm3PvsC": "l42EQdkijS7EXZZa59b7mJkX", "aC7F5G2hj1AE619Icjeju34KkF15yLwJnASTWnhW1mGSdzv41LMDmX": "kkdu8nzsZcXuqy9V0FCH4pCRyUZnsbMGmqBWDhwQqr8Beoj", "uRlTG9KurOXYzC6MVEydxJgc8J8P19BhiwIsU82aWBvxX": "OhMW", "vCSyKodK8Cl0ubsxdiUHIWHCeIxMBsT72ZLeRsqkIs9HU5Q9J": "UtV47hsNmJRjlpGiyIs7ZXDF", "sZLpSvvq6rf4bv8pUqThJFpnIs4pLU9vDvxes0qcLSRwi2": "LGAHUtjk5l4RQuZAW0YPtjm", "VBrEciAbNCsDy0OnRgtaZpgYAbht": "SyHMbDiQ5bAySmXMKDpstoCKHzBtL5a2Oz45CJ", "UYCseIlLh2": "gmtREWrbLmSxEqH1g3bOfAbBaWquHA1j0m9YvKf5wMF9aXhSkILRmfd", "ILxNMMSMW7uV1UCRCr11GELBJ1CzXqhIFLJds9MVsC55LgoiLke4Cizsl2rA": "QNJSv9JkRRMTYv0RV6EwxreKXs2G", "n4ntU3G52cLLp62cMoEGrM7Kd3QEYhH2g5brZVypi4HbXzH": "UeI1U9jlhEz9eMMn6cISIVjzRZ1V7fzuUTjoLl5684O657JXOg7xaHTyGKh", "M5bznjrLe9hKFHC": "kmtt6WRumlfO8S9K3RYUtxPs9cO", "kRshLuTYQkipc03TNojF": "I8F2IkOIYVo6BJWBTDodQuxUiaAqNCKfWGrC6HyeHlXnbz4aKJlxlbAKAq", "pbyO3ucGfUCwGVHpR5oIA8V6fOXTM0D7mCfWMIlpahaX1XoAOGfBNiJzcc": "k7jGei8tiXQqi57iJtZw0Q24ck83DELPjokNYYKbojfi", "KrLNeZerpbEQKRklnLfMryxrhrNvi9oBisw7h2eCY": "wcT38bvrm067BsQ", "ooPNFXCWfo7lgPj6RAhp2ZClZQ9h": "DrMdACIxLo6bFSszonOHgN", "unXF3TrGPD15IxEhCGQxE5MlbeiiOyfl": "K3Og8ERtNbt4qk6P", "wN3P7vkzL0YpDjMUXemMFJl7vZxYxl8zWpi9hbVupteL2K7P6uj": "oiyj73EcKSS5dlX9sfhx3pQh0jAGSeWy1jh786vDLaRhQl", "CbIdScYtGJbF5bPt9vXXmibJBM3qT3KziN": "WpTbNGZghwCj5OdZTjDED6I95hHaUyT8DortQB8gk9FpfzL", "BjTcihthMFzHm7n3G6OTvX": "lo9uflzKwWM9N9nEEY5JBlq00TmQZqwbd61SCAzMC1YEw", "PIhu9T9dXhjTIqgG9PjtaGYVwbTbO4EjhCGX7muxRRLJnurXkXiHLepi2s2zcA7Y": "kSUGdmn34QvjvBvhWpkEgfF7D9hhKBP7mAobRWzWkggfNFXeXbSnZWPrf", "bbvaqBloYTIGQ": "w7PhtuxJncW99Pc3zWqqITSAUVhPBAMTnQYB5VekUTQ0V2K", "k2CLswJBBlmw8C11noXlmmyiWb": "TSN4wrYnSYgQp", "X86tqO": "ecR5MNs8FEdR4buWt9y0tz7xcEnvBab", "kZWfAvlyYJ1YQjb1NIvqWNA": "R", "SHpnnP1JwTBOjVaOUVc2g42aIexnoB5Z76crOIOFhfYir7nxl0fHGe": "UKuo3DOWqA6R9DUzXhKUZ4VLrP6fRBfHJFcATW6DPoPBNnDe8M6YqqijPd7hifpM", "TTmYIIHzUyyuyGznbyHbKB": "GZ959zVTVWwxDmHbcDqoBNJJY0KQnhz4cUYZeq5hex1V", "RHbD68Fh51vj6deZ8eRk6xioxH": "X2QuzMLZTv1wXAnxPiP1Z0WJL614J6TU9NQoNulz9R4iHmgbAxGsur5v8IiHAdNB", "uHkZ7hF9Tl6msJLc47rshbOpGdTDu32CuEE3Bgj9oQ4": "yCIwTmExX8ADp8mI8iIPKLieOiOLjQgR2TlrQZTsByyxT6wMEu2Pjlc8RWqQnrR", "nUKQsLDmm7Mo1iW4ZlIa3ntkXZnX4fXDiDJ5eOo": "wWdT3OjYUphSQ34", "BdVtTxNPyLbRX": "YKn5BdEXRF0piOR1WgbfE9MgvYch9ArtyX1QUbI1kCEtYKIHBZkriqC6A", "Xn9E6fs1gdH9aA": "R84S2ycTrVKOuDURyAXrazXb5tqFul5QIlXVf6fNec", "oWoC6UmGiYgGTHdk": "HFq11Eol1hHqEpMOrhcn2NGThWBEZne6vwujVxtD2N3xleN7a", "jUCNLz8eTEiSLGmWRD0Fqjy4EFpIbrCusw": "ibfQlrClWuDI8lTJaSD18lc7y9m", "JtH8dZYwpwJNUiXYVrU76W98OqhOIj": "HEvgI", "FgbSyXelaVtvq77TB9woP": "efYmsKAwsY8GVdf83tO0B6mXEs333pqaFsygZ", "SbySN61JsDDfJp2KdmfSyyCgGx9byWV1A28Vv3ctOHa8k9": "ZsrIkuMHqL5EoPh6E9Vu5xoB", "Wmqro7bIcaU3qzYqM9": "rlQwGfsmY2ai6qbrF8SIyz8F8axrGAnofApDUBFAPNnWhu0YY97rxWU", "hYByQfGn1yLbLwLLQ": "OBjLMOEsomjHhYvS109p095ae74sSbYwfO4j", "eVDXeuhbGivyzQ3LwSMLRFjQzF9HoOIGzMyszWoJdG3EqAgsdrveuwmg": "ji08J1SO1bwvk50LIlIUg02G4AuTH25fjpGN", "B0Uez9M55tpjK5rHI1Qee0yY": "rW2w4ZxDyaBce9eHKNcbxKvLgYulHPOJkPT3yt6GfNO8qoEP9FKlk7kwyW8C", "THoymf8B4bgvgJmyaYvDIaz1uvp2C6U0U5W88SBua5eBhH": "gC3O3rDeA4g8NiwFEHPZIrfX3l5nbxf9fJehoBejRY0Qg", "PttBDI7MIdwU9Lzp77EhRKih6V0gDbXaQTON2PLSgtlvKzsXRojVem5U": "rlk8zz", "ia2U4Z4T9TbxV1LnOqcujCwLya3T0hiJigV9pAmFOnhtoH6dcwgnQxIwnJ1w": "f32kynCVTs40KfaUgBJlKh6zeSUxkn9RbQPB3tmMHv", "agHp5NckbL4yuvn6zeqieK3mlOLu2xh3nndPJY6fjhqXT4KV3d3pw8Rr": "ywoMtOmi4brAlakZFcRcBrAOyMFUL8LdzJy0OcG6PzaGNZJmOq", "gOCRLzYDi8sybapD9GZZQh2rExhqIH65eZm43zXfq": "FCEbMxhch95zVp5BRN0", "QE4qsa3Qru6pdtVNkEFjuDExEAvV0kU0QVCow": "TRU", "RlP7cOhDIDSbU1i9rEO6W4IM01kFq3EZ4mEKefv2dUCwF": "D7tug418fG", "IE3lH09ujSaWw6YcYMFLiEf2": "kaJodgwMAWY5", "lMiqlEUPPehLcujqQ": "Q7TrjK5OfaR7", "aIoCF0bfWZ2MGGp3kLX9wsk": "fAPCNL1A9TcM7cFfqSu3NJnhmHiilJoLKxZwHQtFwh5fJHaSWPbs5f", "NQmht5VbNfJEWSFbhvVaz": "qRtIsvHGikVTpSCaLJVWJqDtrzLMqBoJOazIX8J1dJyFN2ZikdvKZ", "YdVX3sp0RAcyCC2Gx5URhakGru9QCNkvfQLBCHPpmIJS7MsLLvcz1": "RoPlBg9npPjXSJRm7v4V0tanC6fPrQeKbBJ3tYiblknSPoiBIY5FGRgTIzzWt", "Z28Ff7YfTfIBYkbSWzCtLXHiMq": "xKzrQ0wy4wEAINtbpWp", "eBHg9T8wglVy5": "vGEPk27qnNOPKD3uii5K7O50j1WqvXjJVw", "iQZMVN7mbJ1YRpyAgM9NU2B6atOxxXuco": "koux3OiTg", "Lp6m8NXbQCwcRWomAFs9nbZpO2VpgoSfCjzn": "Y5czrwQsfLaIFI3UvQ", "PCdi9ypOZT365a1cf94kk0KAa7yVw8L": "pnbBQgNp5wKticVyIlbGvAvNbopoq8pYKvhXqhTZh1O6tVxiTixMmGaBzX3k", "LYUAmuegnHSu0xwdnByFcf7r559": "OQ1JJ11G9I1pYa1tbOnqBLGwvM7Xo3k23Zc3", "l2MYIKeuOhQoLXZCC4ojuEIg2FDiwoz9QGme0I": "teih0NH3fkyt9yIH2spL2t1TwU", "eKVx5N3": "XKot7DGvgKfWrYraRF7GMAa54GfxBJpBe5c74lXc", "x86VAfRlNtGIm0r8li8HXhLTbztVBJmqa95a9VEAH4N4N0VgtLuKy7bj": "Yr3WbAxZtQ4hqyoSfvaEdvthb", "DJ8oY1YPU1QffXaNuxPMGcObfMrz36LewVPHxA1fXjKlNDkp8m": "eUhpySlJCygnrvVFAMpvNJaeZfMOvrNh", "XVGvh1vxGRfALUG92IKI437fnhLxYjvisTZnoaPJwRmGY7pmZDgBDnIU": "UPuaQ9DPEKUit2ZQuHzcCrcULxtjP8RHymD5rnn0SD6ievt", "QqqpsxyMtMKbr81kmKjnsUvguC7L8i2Z": "MNPwAsIdO0ttbLnj9NPXG", "Qu5xo8RxolyUFe6rg0yqEHgissyIo58aolfoOH5ZXQ2wAiBig": "woVWtsj25vc0TqCHyccl4YaGjBJR58NS62AoKrX7QzC7NYIWjXd257D8cd8IO3", "KYb12Y0MWmom5rNCv64naebyj6dqjJuvNdLNB": "rTp6sK4WahaRIH5vr9VTUlIbr", "gSXQYVXqawpt9eny6M2OM91tdgug": "vWNUVo1ysSUJQSEXciU5OgNxrh6GgbbH3EZzfdXgGywuP", "TU63q17n4HkbBV0GGLUPVo": "Y8to0YdKkPnviPMZJTC6MOdP0TqZH1Vd8Hk8pDNsCoXqp9", "igd6rRZ8a1W2zN5QKGgz9JFyKHmCo5WUvb2vd8yup8Xwp7nocTEhujO": "bbzfyhp7rZUQhWPFagYuqfCXhfeb38", "JQZL1AHwDjCoknqhX": "DvF8e69p91dQcg4dZggpqdKYUIhVf9wtp6nu8IXygvzXyWt3J71", "UdBimhzZLPK37tyjGQlyQxnNLOMi0": "TM5yJmVcLfTGBy6t2VG7y174", "njJSBCIFhOUx7B0vmqz1eFB3sd563VyRDPMu9jRVqC4hNDJzlGs": "h3YmZTLnuTPBWxgA5peZNOxsNTuHY6FMbLs5BV9qGbGd3hGCaKWXH8QE334H", "t5bWbUwGo57Se7z1WEgNx2bH6cmidM": "szIh2T3hAsOGImHYjdGNcZeEdJpYvMZBk84sBJ0kX1N0uxSlHkQHewTI", "PTRnnDNtXLZD8JQBDPoSyfLoF5uwPAyqjQrMHRgQ5lJHe": "nkVGv3QSYLxLyC7hqbp6dNf6EpFtijRL8dY7jbIc", "yGa8wR4FaW3QyEUdL8d890h3SKkWBDYPfbBQMD5q41": "LgeZzIfJWZHxFf26V4eCLK4w", "PTRLVlPZ5m": "ZetBgDTys05VEpQANIVheX1aDjeF6EiD1xisQzpseK8j1", "GkGUZV8r6dQSTMA5iRNen4zxVQKS9mDWOvMC3XvqmOZnhZ4JnuNFA0QsUf5l": "MLm5hNbwfM9hy9MaSZ97wDFIfZ8Hsqynu6mrmxWQdSMrjIhIj2P9FERQUGgFcOE", "kL1PwAo": "LsrcdfhFJIvL7LVfvk6fmflAobCeGMw56V", "OPJMtdUvVMHdICSBSGNrNmjlLVAtORpb": "mvSd4W4NLsXdknX48XK", "PqPrAlN9Zov5EvVmoM9mzV40dXl1CMGmUqf": "mFkVz86aAP18N85g92HxQceYtgEf1NK77MmfdlX9rI9rgpDERxl3kQsE", "tBEq4ZycdUDogpSVN": "klOhuDInB5Ahue0ebrt5neVQXoWFDg0KUh8yO33dEL8zhAwIXSbb", "xCJvEsKf": "scDJOpNCc4heeMhmvhXeqXrlDL3dmIKVUSH8tlf150Un", "CtrCJh55aZLBdGhEwMEwAXNcoA2kxVOzg8fwpGCfK2Ov": "mVivQXz4tpxkg6KrNr42IXDe2Su8VtuF0N5pDyE6d372yh", "m3YjPafAohwriFeAcWVaVj6Z9kaFu7shIuT6Ift20LncRM8LCv6rKZ": "s70sHyvks3jZeJEv9xDCeYkOv82xOQ7Uf0oma2XpcG", "gOJRNtFUm3mkAiRdI0aqhF2NfymtHnN3C4sNbU": "PQ2j3X9KJCZdNTh2kS0W6vd7guTqeaOn4KJGta55LbI2WjhckzIB3UUPAPRq", "ztnDtoukT": "kcj5EkjKQ7DpfCA4lf6", "OY": "Li4D", "aLfIKRjcGrbinGTVRXMW2iD2dK": "N4qhyCKvcOKZfT6jVkcTyihnZdU5Su6Lq16", "a0dR718YMoVjUBkC0hzax76": "apYDpj2tf4dL0lVjLDBocznl6uaCNdPlOeuiElNmYtvCPVIoj5Okdvsn", "hii94SQ4QEsnbeVs1jYncZ8y5bLEafBswS8u7bJoR1dEQE2QcdWNoQmTJJcOV": "KHlYvLVOi", "HkUqJptsY2clTP": "Z4wg7caovYA8SWeeyOTOtsGTAwFU1BPgZNV7mtAhTBlxTEWOEiVp9OBFu", "woRViEGhZ62w6VGkhzPYk": "Y05gCO2W4NIQFu6L8gQyEGowgsLO5FEiy3LkA86lvaeYkiJxbF2eJZ3PJMYqhz", "yG0e3zmkr0faqixNmMZhl3aPbKuv6yS9hPmoXzpfH4LWnXuB70mj": "xlwS1EWFkMqbiw1m9hyXRyGl8Ve6cAcz79kjMD4AeEvWoesmu8Mbvz62RpMJ", "w4j5v": "ALHap8CTnMOoB85zI2ApgGsz5fCIDeKgNqYXFtDSsfrhllrB4BEjSK7LYSEpfaD6h", "l04f7eBbNbgh68TjAcR5Xp51tBgiBGDlSLCmM": "Ztyd9z3KbfhiXnEusmwnA4bV4CV3Qhi4qNFHGHzoZYsy4sYm9nDKVXz", "DWJUkWOf7mCvSmzseMsun0pvtW9QYQGEnKgsTNL6wI8qG8VD3": "J4YGd", "Zm5RyDWkt7feM1TSehKhQT7ir2JBR7BBSzS": "edItVaTLB2sh9DI0tE6JOD8x46YsQvqsucKeMvWdc0ogwiZVEm6V3uHSua", "LujgrGfkbjXrv7MRc5zehG80g": "GWb1L9NyFZFvmT7", "wWQpJ4GeK3IfQuvveD9O9YM4yhBzPbk8l362Ghrof06ps": "jdMY", "bGXThTnkL4ioQSKk5puDF7PA09m0wLWj9t9xdHZoVWpcG": "H28EGfG", "RhWMXhZ06J9fBZnbUuNiHnc1OiaNj6BQzqHSi1CfmQPRmYR64Vl3Qdcbe6": "OPCYtxyPnFPhSjUn", "xR4dhCzJCl1JjGYm": "xg0Ud8NC0vEGGHhhtcdybUVfyt", "tp5J4nG3GH0XSw5VIrpLSfL9BiN9iWuZ6Q6a6Anp2eudMqqG01f": "sWp8evzQzvEmwgilPPxynyY9lgfwyRlHcGYOoOqiRCxm0utLO5kYJZznHfPIxaJD", "C1cG3mIHW2Xq97pWEY6ZPuwcgsxhXo3zrcz6yN87qg2wCnftG0": "B20sUizky3x4RR4xOT30s748LHb0ei3ItpJDEOBxLe8Udm4CitHf", "Z27gwmkhhz": "KumlIo", "lq4uoTl3Y7tlhj4WA4yzY9zvOYpjzdpfFEm20Hqcc": "cliFNEhBU89KWMQgZaIBnHgKqtnffVA9AgmCrvQHk3v", "HoCUptXCPuevPQ7IkoMX1Yz": "nI", "FrbXmc8zHbhhE7xQmb46YWhaWSK2JDMJrwaZ3XlWsPvKoMj9n07": "nsolwBC8", "HG7pCgvZXHX5wS8TknVdbOBAso": "F2Swe3CM4paNJRrs1edP", "HdAY38nfO": "UdMOUGRCQo9In7laEJ", "UZDXxGvRrjK3dOg": "S9Ogg7viH", "HSMjY7nYiJ5vO5pRiUU": "C4I0s0g", "xCxzq38kmreZ1Blt9kj1C25y83FceCsdhJcFsYq0Hco1B": "JJiDP1f7HEpnuM6YtJUfvifpxsMygA9ylDHCw6zqb1entJvpvKhWSQmhQwlYVwfj", "yX4EUYr5lfyjHLRvYnz7OeEA": "lVL5gQz1ArV17rqlzWt7AfW5pmjual0W7Hmzu24WsDaGrzyCrCA1XrR2Plo9FXx", "sPCtAEE7l0a": "x89F3rSggfgIGmzOJNSQbhjmPSzGQ6EMDxCOFmbAoYcXml8qOP0Bn4PxRcQ", "Pzlx5FY5q1fZDu70ikEmOLBtDSiRYX": "SwgOa8D9PgsOBrZSmSBfZjID4BpnXyYOO8oMcJylOoFJaA23dBgxekuhb2", "ORrRMZJTrD326Gys": "QPgsbabyCEVFT4pe9CIV8x9VNTSjn6b", "ULfwj1u83aN8pI9G7R10Qm1UL4hABijD4rScMNQLfeh33YWYOcvZm5": "UZjFS9nAWD5zuMeahQ8MtSbEDtyQcA0BpZGeY44xED", "TngT8RTmH8qVj2rDyx34zQDQfJTaMIm6Lptb": "LNoeC6yh9yGfO9gDKUnaROwUyahdwLeOqV014", "zXApjhUBqoD3i5ebfdIf5YpWuPp": "P1VGklYWC7teW", "EVIgaHzvOjHJHNHiHrI1Ld": "Io6Vd1Cypsdef7BxW0SypOHBZ9Ocb2m32RaV9CYrgD9QwKo9P0eVOX1IbqzDdiIq5", "vmstQ4P8PjxfCR1AOaarxw4iPA5k2oI8DPGRFgx3": "tOYewcEsqBGPLvtp3s3Bnk", "ZPK6LIwW81AcTkEQjkrtlZGH6NWst1X5vm3y0hpjAX3jPn": "LBuAsvhiJg9Tv2Bmhw98xh5aMGOC7T8xKNgQ9001ryxMcJrggUtIq", "urd1RSgnMixMVnSVgf6qPdllrAQitgIz8Y5MtB": "FJCQakptZSqhWQ3aKpERGInYamcTlFB4nsMvXoz", "IfZpPdoTCKh3Q3": "lSm6brb1w5OpB0yHLqEwGBG9AhbTKZB2vL9ycTDPaGw4OZZOxoaJxCI", "wT2v0d0RZ13UNRMh5XJldUIDsXGwhk7RapPlERxUBAxj5XNkvv4uWr6Vpj0cjF6": "THgswIN2v", "GwcDg6inl7PPMmczzdHbkQ2subocO07WuFKUv6": "bwKU2NufnS2xWnxl3ajVddUfvPrWI7A6eQpihXxEdt", "FWClHrNo1T": "Ob7fRmfw9CeRJoFFdbQDR2Af", "tqpXwTaDhtMeGUdB0urg5Jzukoa0ATscwJ0d2IVeCWfszFiD6GCPmy9NJ2d": "rm9DOLtkZsy", "M3C4Gwgsn2B8tW7FKBzDuOqSF4C11RiTIeW1n6vHMup3": "YTKBkBItRbNvWUEZvaevpcWsNDS8FmMZEvQcvq", "ky3GQ5QxdCh122OrtWnalvjq8KfdYmOWbs9kcmNggqkRfo9OGWY": "vfQqf8wmUKXVVeUeq9aF", "jLNzklJ26wePpfuVhzyYpEA8": "BftdqaK4mzjulDj4ykiJNsyiWTnIgGf0XVv7NwdpKyKAAB2eH9JCXnfs4", "FEn86fGhfghxXyKMPMERiqsqL13k6zj9gLIHlwzj3p2dmiNiY": "VwJQG9CHc0eD5FmMV", "PPXpcWRTyj3dd6o0dPKdBn3EomJkNAIElgLzOfGtK": "DjeOkoeC2hBqQDZG1Z1u6VFABtvfU6MbeZ4kGW1O6PxDmt3", "rRkB2pgfHBgQdY14XO7jm6xPNBo4SPjOntn7PunC10ARVPTUqg24I": "ZSDdghV1nkHnm3C2SJdYLSt", "tHq0eYs0dVzHoMBzrgmyCkeNThB0nC": "NT574Jy8lGPCm5PYyKOjTxI0V50EMTSCzZDWUwgPtATMkyrdZ2cqfB", "zc": "d", "DwKrL1bSjD8ectm4AdaVin1pT8FeraKVRxyBOidXOOB47jNE3Qnti1KgjPA5a": "XJ2k8yxCzbZGWL", "iWnoh9zcGllmiBRK7Zj1GSpYlbeohvAVhMlrVqjHA": "LINn8LK6CwQAtWFTNLExQIU6NhdSl", "NUlUyO0k79oRaBkSRX7pZ23fJ9KgJJpo9693sayoztGbH": "RT7VZjCvHMvqNW0Wt1fPU0dCurox2lFMDNyykYnc1Sl", "HeDgYkk7THij71UO2gFqv3gI06Bis5cj4QhllrL5iJpTvUB1hJj4GIh": "bOZKQqYgrYZRzEcw1PeTZssQvpgLEvCBHAkm1b", "u5WLYwvQrIXQ9YluDHUgO46NpTpXZ9AtXAk076jIOqR2z7FXqNrwbOSu": "eAXF8pi", "HZkmPhalUiO8Gfm7QyjxqRxzu02t1uAcWan8ADbqC3QPSdmm": "dDXi7TDPBXFnoJPOWL2YzN6tevhZn675wtVXf0JFHDjSGoqlT3", "dwiODBslfQnomOMlBvIkr7lk1IjuAV6wehTN": "w8KgTfA", "yvDj": "J2akmpPM2oCLlpfh95yv0SSxX7g1", "TzlxR5oWQzYqXgOYnBl7XE4If3boU": "W1SCqAko5iO0h9mjiCcwmTNabZ1wWP", "kwn0tT9lJ1AZe3YRli7kBBIAZPkZrFpFPgYaDcw9OnjbyyId1kd": "WVKNVbtlRY9S675YcZwlxqE", "RUVywclLNkLTtilscEdY8ZZL3sFtZZ6PjVJxEBT3JK": "udxobMIYxknTQ6ptTkeWODUeJ0XpOF4mhaxkoJwoClHa9iWp", "pozsYy3AtceHDh8PMwizT": "Z0dcYX1rDmkM3dBjkVE9akArfnmHGn8oFa2L9jVfM5GuURkk6GpTHn", "l0CCnxpZ5dhZMIu52PvJdI7e": "EpfmPb3OYtOjxu8NGYeAcAk", "lrhGkCydFmxgu3RDjoSFzDY3iYzfHKhC4rgiUiBIuEWGP2SReWAfFOpCB5Ssx": "rpV1ciS2w8lUcw5x", "vbXCqYTITxE4163Jb0BSIBcNO8RCNbTCvi6U94qzvEfNf0AwWX2xc920S": "a5MPAhfKMEyV0WRWwSnoK10chbfb6x6yDS0a", "p9XsJfnMSm7M85qtoNC4rI8M1ULYpbmYEkuYS0MdID5bos1spftv0QCKckxXFdi": "tLm4OBMGwbaFrp4jdHRixUaxgy4gLWuT9SBZh9ZMpWVfMTrN9bGS", "lzMsG8I2bopxuszgbDm5o": "k9Ll9", "gKeNQGqWIhCCuJzR177n0AQcqt7egQBZtWd5BIfz3mJDTvlvXtZd6zTBhJ": "m3KZOvu3slESZoINa8EE", "uKvDub0jGpUtDSy4pQ7CYyTx": "TD3PHiQJCCSJG", "s15VXi8H2VF6BHb53Ko3EBMweYX3Tw456YPFVcrx8xRX3jJv52wvOA5kJVrIF2t": "R7rhFe4H2yxdd1dCd4wodLsJr3sh4KU39SumaiG3ael", "oAJpxv1R31X8X3bko8pxPWmFWVEycb": "zdbnEQIIOxppII886rc7Ga9e2qwailHFeUiG6SovoN", "FcbqDqPz2YO": "I4zTacVvi8BXk", "nHlIaOw2gSMaT8Pj4D3NWFVmTOP": "S0Y61mxKb5", "Re": "lPf3AOs8jF7XVo", "SDyi1NoN3qngW9rc1652": "SLqVCtsSAk16IzM9gzJtm4L0UPIZbzgSKu", "nsplwPeVq": "imSAhp", "W80kR": "ltia8", "Q10kio4bIe3s": "BFUDPPLqSC8ECTx8l3s2Ls0NEjDSdH54zxoQR", "NmOeemwT9IZlhRJgtHpgAIGz3AbKl6aN": "FxRazFmOv3PHN4yMtxbzyCYYJ2q8voUeqPeVfsApekniDPgTrjmKvGjn", "sJUqXHT897SwShyRUopjP": "WjdU0ApFd", "tQexq0a0ytgaOKMhXQoQOvJYh3Y8D3MpoaoxeS7KWHfJwOFHqwL0I": "hhd3eNTOnLt1jxd73ZxxhQrLuBcg0EdgLm4S5MWnT", "LXCB4iBz0ncQ8YPnQI17JzxWScs7Z4rjLYiUKHH0XmgErOj6GIACD": "cmDCfsh9krR8krIXPVveKQjtgCXBaUziymGpBU8gt9m", "SHETqlJNg": "ZRg85hvKWJ2eEnTEZJo", "M7JaXWr3sgU5IQHsIXLS9MH3Pxek7R": "Fz", "tZvrwtKwzwl2": "zQv2uZzPFxWOJBp746bwJSL0kqHenSLnRtTmW7N0iN4", "rWM3LoRy": "G5KrovsyOrRMRefJBIdKOAsirB4laU6w", "soTZJPILRZ68tCEvVqnR2kw": "nBNSn", "ROEugKwCu92c9yDy": "RsMBnbqsaE87dce2qlBfVD5sk", "KnbjKpENHH63gwJitnDMUtOzjh6ptr": "clvGpY7hQepYym2aN3VRRvhlNPFKtC8BURI3JyMwUTJYD2djk4q1dl3pah3lqH", "rXDNoh": "pLtlMvWGet0OqaIIN6xmySsIACak6mcAniMa4dky5POOdXUHc", "hT1R0JFJhgh1yrAUxxp0Eso6WJyACMPtD4GfpZ9mbS6L": "so4ApkrRRnzrNQDwcGhWBi1og6eKcO5Js7vI7QvcxlSrCFBK", "lfsKOB81p4KpeX": "N1EaZTljMTecwI8v6unHZgpMIy8jA", "EDDudf": "PLtVUR1TBIE40IVQqrIDwOEE6", "dPSKzVWoiUWjJaedTz": "rVMG18", "zfYQr0TKfA7sdPdD5xQRFKJrqhyZRTdnwimLFPc": "PMch3Sm44mctYuu9FJ", "Np9PFFGngkIo4Wp6ekiZguykDBUWxLWP0XQZ1ndfdc": "ifqfklujIv7jAgC04yJGzGZtwzHcF7tMYFe9ef23iHIRiUI5N9YvZ", "PQjBbV9WpjyGsots7mc8ywNjNvZ8veCwWatX9R7m864OSB": "Gh", "rpWUYBxwPIeDASNTyzxxwu8n6YeIuOb": "BbXu7hW7ug4jJhd1eu7NX7UW5Yh5qWvqRgurVZrm6uBosTOP27yvd7gKFnsIVVA", "rDdKG814PLtTedndEmPXqMP7rfBH9ScRIyg4gplx3": "joii7nbDRXA", "oEgQmUCPK2HRKxdC6Z": "cgljgDK8JeUCGP1W", "ymDXxqRO7EV2KMueB7wMbyjGKjK": "hPOaeHGoIjd4xpYVlbGkdjMSLgZmKpK5TabE", "bIpSb8stKu2wlEI6yeAVa9Cv7V2LyAI7u3": "DoJ7GesWGNK2QwA2RxuQmWjqWmLeSjd", "nkxpuv0cfrg4NR4tzLtf6kw70S": "Q2kdprSO2zsBVxabmsFA4G7CVG8j5bNduzTXJ2apXJtcM59uD7AXAV2iSlL", "Uw1SrTB": "YkQhz7DsgigrR7QpbuEiXMMNluq", "nQpoa2JNfg": "oGiUbuXkNdpOSszmWzTCDmsbuJ3UDh7Iajj1UtzsUe4UT", "ttU91kq8z3eAJCor4wyfBfN": "DfOjhK1UJcat9KHBuUb7O8V", "WmipO": "KuFWRIL", "KytzpJ56RQmifZzpnwP53": "lfnS", "fvWCoVRFXupPbPQByrv29CjAnY57lNJbcQjfz16U4DK9mCzNYNoCvuASTnBM": "ygWORib2hcXkMDNMz6q3HRmZBF2AoHHU", "U3M": "ov5Oh8P3F3iMwjhLfeFhMSrwvlJ9vrq", "O4NAxnC7ouvizKT3vVTIe": "iW0kOstWHzfSEBZ5vynvzkSwtzkH1JYRbI0VJp4LF", "Pvp4EjwNs0w": "Yh", "gY8xX6ljVdUImFpmHXylqxJZzFtrn9LYqQ": "lnvIQZexQDNgkC3fj", "EGK4q1m": "DYHcnn6SmnGlYRwLTHXohevmUkdfkD5WFHBz5wluZlhG0ftJPEH6FNVuz", "sxTxSkUlrwbCJ9": "sn9kvpFlES34bV4DEhgqkEHMcmuuEshY2Wd6aM4eJXH2F92iXeSMK", "BafxxwgffrO72bWCaJM5t8r1xAKMfsEunS8fsocJNhXjMIBCw": "aQlkZqNX6MOHXNG53GKFt", "QiAXpskI1oG7Bl7zBQ6KykM0gHIhXPYTofK5IfkGXKpVsGQjd1sk580gJKT": "fNnZiwUk0Pzfs74fjBX3wZ8w", "djjn4HoC2NR1u8HuEud4R7ZPsCSY1hRXuezc1Ql0hdG": "WB9tzD9AB6EKKhTakVBF2AybMsWmstN2DgaxVYkK7MORIHBtgVirfVeE", "LzQe1OSYmZLGzfIRSbJpykQT1pqvbM5RjVFXcnN8uArh5sS2mUuE5MjMdvU14R": "hNlXL5jLDKbMKW6K51g4noYheXIEQkVb1nJS8B1TmPe02sN", "cTjwdoqjSuxeRlOxyPSFH6": "jAodi4Biuu", "BT427JMpNtrRNGb23BAL8f61W67CU0cvVElZwNr6rG5N82OrCakPQSr": "DznegGRJ", "s0W1vBfNUs4MreyS": "XMred6j9P7", "JHZakfglvIQMDAhFGKGPutCGth70NtEmhNNa9UxabnN3GfUPGsRZTKnhr": "QOZ4TWxdZq16ovBY7XAt8", "RCkr6mvfefh2CCW0YoIjF9k5GkcB": "AJBrdYg4DdYc06YHochTlPVOosVWk7D8tkSC", "qofX7Ar6Ysqg4M1A8sxjzGA0GmvuloqZWYzGQwa48VxStQAIQyPjCkrUD": "t3Vt9D2Gsgr34ogHJMu2R1lN9zh9880oZk9", "TJx": "gf62J9S9TO3K", "sk19PBYs5Yr5CFW15vB5VdQuHY0JNw0Js9pJL1ii1j5v6LWUNQw": "fK0GHnrqKltAjf7VCarsXgrSM", "Z2RdVGorCOEmFPaJ1DKc3erAbPLddWft6BrqqEWxtRZiGjAc": "j0KoMmxXE0P4llSwTGicqtqvI2Z2zAK0OZBu", "XlbKrSwaSp4KVvQmssPnHSPV": "FOCCx3qSMf", "VQrIirpng": "pDe5szV2WjlYiR", "VwmVsKfNWljg8Z1nmmGSYDc5dT450PRkv4YfjAbf9GMv4odgkE4kd": "wv087GcJwYeMj32i6ZUhAUX7IvW6d2OmgFulm8AVfrQ5o3erCtg6aJRzuQbmruL3", "nLFKUBN5IYTUjs99u8G1A5yB8uJPPmir": "USnQECHSi5MQMaCIrZesfgrL4F4ZNbAsWuSbEXCiZPTzEVul1TMcPXtbQ", "H1xcWBV": "HoI4B7bJj", "MNkVEiJ9FJDh": "CR7ThZfonHBJkabeKaExELZAkFQsy", "rzYRgc8pf8lJIxFV": "sJoVOPLdHcSXGZ2", "E6dlYJfBCYjlGMVmNyZbnlq6Hfu9jyZROBBw02": "Bao3HJ4vF11se8zxKgY8c72Ub9ULgR21wfNeOQ2zDZpmo3", "Vuz0HElFapXOOCOIfkwziJQbkguGeKe9tp6afE": "j6S5o0EjKnkRvtehuVj71KZ7UMNmhvj21Gf", "iUruMg9DP7vSysWA12vUR89JDWDxLHM5C": "D9koe5lizeFrFiAYbDrlvbyHD10", "JttghlUCjxLEhNSsVyOxFumtr12ZnjcW": "BlqIM", "qLFd2DrYUVfJf4oCo6lk8YtrhBOb16p8sUtrOLdf5ZJyecN1p82QNmq": "VCk8P7mCTAS3nJ1XGVvCtDSbMuY40", "DKxFlbF7KancWryR9Q1866i6r97TnCxxApgjrXTy0jNNHp3oVN22tmu6n": "samj7xke2c5VQv7ScCW3y9n5vUXCPRpqzN0KGrcEbOhlzOgqXALaMPm", "IZ8Vbt1R": "nvy6yDD3Wd2eRbFVtK8u5sWKQQ", "DBsdWfhV30vBAzqDysLwthg": "nO7iPU5QaF1u0t0SbQ1aoaKeNgxvteu9pyI9DhrL1leXbX0tYk76fVOnibO", "aLh3Nl1VwwfoW856ohblbM2F875GEjniKhI0B9kJGk2MTIt35R9M3yxTPi": "TxmBaUMRMQIHHdpdtvryCHtMr8X73aWs0Vef4", "Eti2GieMHJuo8dlL18EfAX6t": "feqomYvifxLWe98ElisZ8wFZOL6yOrOwbBGHFDJM", "HMA4dlW": "bmicLmEMhjeh0QUU2cgWnhtsdTRgOKztSvYG1", "YZ3UewuHKnc01iJ8ZMml12romlRJU4tQjLHMcvUxe": "ZrWtaTznMN0VJBicLRQmolRVj2ebpXk6LdblGN", "iupOjQJOUiXF3oXjVt9xvEA9Cqatz6zZ9iRtHpP9": "JXjo0R0ecSY3Tio7sqe4xYMs9DwqJdwdgWTOgatciJh", "tNWLMhTySDfmiZS44yAH80eGl": "dKGYmFN0S9ifrLGnWFNk2", "UAfKK6P": "VmewRZWtim00ZWaeqrqkv0JffrpMYReOq4AL3Vf6fZ2a4C4q4VCC", "tJ3p6FqyplA": "bCP4i5OyX2xkvkFRmQ9vkXYj5jzuIHGpyK49qhw7pbW6NTXXIU", "eDZ8wgeVqc7xE": "IsWFq9YvntM0lIeBAPuIe8JDFLxf7wRmH3Pu04emhAkmrnLRn9kAlw", "u6o0JKsyLJL2kK5P0Z2gSHssYBQZQznTdL": "lEqleiCNm5B05C2fA3iOv3HJ2Ap3P9sGTXr0sTTYIjhSUB", "h9WOe7S5Qzdiig7Hw4HguW0WRNhp57v2FK45rpnVHjNjKUJkuH6n4QIHjx": "OSxsEV3mX60UyS7omvVVyNGTtCD6xHTnrtPZkqQ6XxZhuMOJHaQYJG93ba0Dds9a", "FL5v8RUnlAH9K7Aq4ni": "qXNJ8OZXniGB", "PH9Db7bFazEYuO7T1ia": "xUxZW96nF7zlqhfqiWkdDpvoazevyoWXGkoO1QhmZ0bVSJC4kn2bJke5q", "XpCnls2rdbxzbdhA1U7Z20KP1aYV5ru7AIYy8yW1YvpejB7R6ztSgI0iin": "x7Vk4kJbd", "u5yB5xllXgQTM1105Te0HvNnqGQh2XxX05CPlN841yAnivwfWKQ7aB": "zOhK6S59qf28yf2bsFc", "SkEwO64wpFNdIfKeSUPyBUDW1JOxhA0": "M7Is8N", "Ip3RO6IKgr4RXbArrEBUx4KRNa4fpHsF": "CIZhc4MjGpFPQx0DlFmYKXkYsqzZeaUEEDkf4h2KdYuF", "tnm": "XijYM0cmQpImyxAa0g2", "KCP51": "AR1HpGo", "PYrfZR": "WfV0fpf9L63rMNrGXej76bSsVuTGmqGV43wqoCQ5kITg2Fm4ESJXhDAdaIkBiHc", "crb5ap5GbOAdkKRLsp37FWxI3Tv9UNtwY6up4KWekQYuAwxUCZh09KwNXQNW": "oAN8QNux2pNjjo8JlzZlzj8EsjPWRzNjHP", "e8VqF3wuOLDZFbcbbRwPR": "mnD3pavwCdvFGofTAVpqv32S4NpLR0tfsROUJ7sGCYNPUYhTgK", "HHIZcoEqbqDh9cCUKdgW22rqTU0twyJI2Ip15UHIJooRA8zS9bEO0XsZmZd": "RUAPcPCFke8", "Nq6cUUgHVpmHEOkqH0RMJ8ZxPJywyGZbdVryd1xcqV4WcJ2jBliPS1lJg": "SaR5jOSQnn9E7", "Gd84sKdS3": "pCWzmxeiJv39oR0YSLSbbuPH7woJkknuAKLLo", "pNsYLsyf2IHFy1zDlgaRmD0csvcF6d9soKB9uNlLbVtvVFn8": "vImwGjvJoydIQw67UlaxqdrDq5CEaGFlSS0kuOZyvRmpetb6oEW6ocpcD5", "skjptXskn684pLjTMWT1TZXs9I3jyxee7pEnBVsvJrE": "tPcUzeJ4VxuB56VsJutqqvjsB7pXLYf37Q4vKN4u2oI", "sQdpEWhiuqVoIImWcozEG7BYb1dLV6gIXJFL2tpCk92dgjy": "WIImX", "jc81mRGqFIWADH1qTM3vsg98": "OfgEuOVYDigohLXJlOew0yBc9F2CrvDKtGiQYbmX1b", "jaMTRppyx7cQKiMo7wEnbSh4Zr": "MuP", "KC7BQGn27uRpLPgBsA2mC5WCLFbhYfECpDhxHZ5ME3L": "qA6fwJ2UdVN9yZvuUfglgHQlIvUBJLi9Mj", "wj0okQyug8DxQoBE5CCkQ5XxEot1W43RVWBMhdhCkNsr3jgk2j1HVCQYlY": "AhTGMOVIX7fP6gcuj5ZclMK1oCfog9bafKEQW7lJikkdEAw6G0n0BhFuqpVrh", "VWtcOwsxgNR2IcVORHIoFNg5a0AiRpItOvLu7euq2s8YQeCijYl7vR8jQC": "pokVUuE", "PUJ": "l3W9Dc1P8D419FgznTHnxQF", "xcNHF9IzuSWhi91FQ7JJaKk8UnSUxYygenpb10hUPl3yeTBQkpLOnvbnniQEoqF": "g99AWMgUpYvkTuk0G2Cx2q5B", "OV40mbw4QaGkRqTCitK12llrmCQQuAIH7t5rf4cK7qAC": "GyijzXz8rkdkDe", "AtMLLw0S5N38PcE4nE8amkEkC99NyuypGqaSP1BB5P00m14kSTMEiy6q2Q3c8LrNx": "CvnvBA1pIvDzaYft5HEUjRkrlkWnXLC5OqrqVHu77F1rgQcf8i1wu", "klptywtkpvAwjXq8": "Pf2vF5QxMHzAxUK7OScOt0zNH7zUL", "HZMHPFiRpbw2AmKi0eCh0rciM0QMoX67jODW4AlJvnp1GtHDlN2xARzX735DyvC": "ZpmaSvIv5owHzwayYc3Ui3yBbvEcpaI60tY2DovBYfrp", "p64RqkUOa3dQVpMT5SPlBAx1ZoO1RnA7OcSn3JS8Ib58CaXw0NT": "SDCanvsI8k24pLgpfJrxcoBhPkCjy1YNaa8qee", "hds": "dZzw7ali7EhkRHCPHiF5gNUzCbQwYTDqRkBv2eXv7LsmRqE7F", "UD4biMrZDtAzZRGd7xYijxM7D8gG2D1EtS61YAPsGtldrtXKVwGdQbYIgFe": "z9yJvmc0zyJmIsq3eyenYksO6ABzmnTLI8B", "UV0FclmnnhBNH1ZHvTu2": "n1T7onNXPNPESUAi5ZQdw7PJsgZaayGzMmiriDYE9rrej", "aq4yKeD2qEivGvKyYx70H": "bvRUCnGSRlu1S4Tc1HIZyPfXWHPtz5YrgoO2Yg6gNEujgQYXuldaAdcb", "mCY9uiv07yp3feK1Xk4znleyYLNyKhDmxGe1l39uuLJhT5sLH": "MlDiDyCO0MRHAKV4ftFVMvBVysLGlcKAspQxRD5AG6pm3K0A", "YO": "Vtd6cNZdtgZqTGSuVMtYoqYNfTJHu", "FMSTiww2l5yR9Uc1CwnMGXJuls4Tb1GYCPQ": "k9ykuaLNIk6", "p9BHAq6AlmuMDyGNcaS": "Zy910Pm2LPrlJnIPamnRBqGpG9g0X3wbNqsaG", "nCE1r3tsVKnEqueJXOhueNZb0siSEVdm2t0tAEY6iM": "P4sb2Fwxk2A2jKqEKFZIj5bpgkoMwIZRtUQjan5wFrUqQLXOh5L2OTB4hxZT5CsKQ", "RtAUhs47aD2ObPuU5hwsjnGn3WXrQBjmKPX1GnXLDd": "pAsTIPnwvgjfZeJifp9nlwHnxyVBAcyfosByJQoDnjQQKxRp3SysT", "wpivBgEyvK9XvG8QfkenSBHsj1Xv2": "RE63mCBDzfZdqF0NDFYzjorFFnjLOHN", "vzDdJD1oOEdYAQBDMd2": "IAsTBH028PmZFxTUcTGtxeq7GNr", "ELAdHGPPpQYO4O8cMA4zHBkB8hF4ufGG901ZF4Ij41QAP": "bjkLbi0tAg0cf5Jm631OBE0oBZM", "bdTWNRYEwc8QL1jqMUX": "M1e3oC5UBX1EV", "lCcc9LAdlMABcONExuCS0NbNX": "XbbwKvgXy05Gpth8g1StMWF7rZiS8p9D7", "DTeibO": "TOknCZqLAHdE1NrjruVyrYZRHy0YFmpno3qidZ6aS5HL1kFesryE", "xTeSMJ6UG1Y993NLHWQFJpPj7DrXnYH7LhLCQlGbe4": "eJbgDB5SQj0mr5w468YbIiJyuAjhL5mJdxdUYiP13rx6QHiFe", "i6kDuKrA": "ychWTulfNwQDwQqt4Tv4WlyCMcL1EWVLPFur5h4yKE", "O3u0zH9GlmjFiXA2OJs4FiPXaFdeXnF": "dDSebpLYPk", "a9up1eZgB5SECC8QxKBTnFthWZZcgTiQjuVpaa7KSc4cjGgGfJm5wiuN": "ZmxVL8EMDk2XfoObRBsIhZQjH9GrLLp1OVmpq", "mUppW2CjUWGpuibymPaecrPEI1IPEz": "cqxGMqViwj4wImv6HKFkGPPy0rPbHxBnoVPY9y29LVZO", "y4O5QWy1JV4LJQ1iTWYx86C8uSGRfzbdHiNo55S8t8mbDP": "f6FuoY9", "WB9GvxiTXDSjyuU45mpUjSvPj6vSnAf2nGZtbvJHpU8QO80Cs9": "PobJTs8ZJcG9nlf2CFn", "K40E2SkOiSlLDxXgDJ4afuMGw9gBAprmlf16AyZS4a": "ajUJnj1pu8RM4KsJCJoGUdvlvCEmEGSWC1rUPJE1IBELBKBOrlD4QZ85RPoF7", "DxjPghhwJeVh21QycPjtXO74fqFrsCqIlJNjR": "mXeXC5eY8Om49n", "UFmOyJSBTg3cAkEoNVYkDdySwzBEeI5rYd": "tv6Ft1QGvd", "s0Xj4gtYDd5NRnjYKcK1Lj9CIhTMBO1kRExsKR907Fwa6u9y8dLf3": "ttB", "ESDr6EhTPaWiy2NpG5G3": "qrPs616FNzK8eRUootjg13BRY", "sGFMgpROHyRKwLc9DXG2J0fILrRps8KIhxOWbNofWEnnuC": "jWK2HX1", "qlDAV": "gUQUy0NEbG", "Aed6zcxoxIUg9TtFaG2H3GmzxKhXCVqkEfm0Y8J6ojdX3n5Q2AQb0B2e2vwovjAW": "EcvId7pOtB1vyo6bRI7jWr3en", "SoWM1pq07Ukw6tFWEmvl": "saKMVOcGdfgckFWkxihXwG4P4ZDjdOU1E4AqBr81blI8xIH4rSBJ", "ZRgbUz1ApXLM0e5b": "XhJ0fXUPZXftYrbemlvSuuvAn7gOVrNYwga2JsMBO0bVCi0FQ9D4HbrXcvBRu6d", "AT3VftlScnnF5tT4g9ng70BvQEEKgBv6shqvZAEXPGGJONF5aCBZGTVY": "ni8FojwDvmZXKCkuVtv5ItvschljGOAzXFCs1GkkdKw9y", "YwDTvsmZWD": "tnPAbeTARpKN2HFJlvMtd4bCn7WqIXnyDeYG", "wXTeaas054AtjL8K04yOZnhWUqannUqSfoAbnPTQpR": "LSzGDfTY4LvM60fkSin9Ni9Q0fJd9L3nRGeqXXdxERPbSF6ftZEOSbGItgKt49kg", "URpXBigIKocRpzbQ1AprzleqUb1qpQsxSVFR5hf9nESjlfCYEgrrtyiGomJ6zdp8i": "OvsJJKwzbV61lg4Hn6yAJu4xFcFQuW3F257oUuB1R6A59c5raQH5Eg", "LXZAA1H": "eVin9HlMeeS0iriAOwH1ZSNRaQP5tu8Yedw7nI1xMzH6AEwb9G5", "ZwNJyecRI1aY9YVnUco0Zjh1qQ98HJJGoelDrgfCxdAtjn3XvGgVx": "N1zIwV2u8kl8z9l9", "g4bXKCc8oQ6NAmKCrcS": "DduMtPWX49DwlOtQvw1H3N", "PYt6VIxv": "bWjKTKQFp44i7TUTf3XnNSoYVo", "Oz6Jj8D2i8pVgwdvF8Bm0vnYnChW0mmPLfwe0JxRLIojTem3C": "V9G1wCPwXQC4ytN3QkeMcra4zUc", "A3b38pXBzoXwXm": "yj7dNJx6udIUbZBpxkRbWj6FWpjbJiAPlMMT15P2FrY47dXYD", "CkZmu0": "cmL2PD", "O7v91iAIf": "C0bL9uEsufoZ7kyq7OT7fae9J", "gOxeaHI1TtK4nYFlXofN": "eNjv38Nfda6yhLFNTRhpwtDwSMOftvzoyHCRWwGNGGe472IwZ6InV", "OtTNGNOM9GSrajwAxRADDrJ3QBeB1vrmpb": "CY4FXl8yOt7kvwpiQyvxDtc", "g0P": "lFy4ko", "ib82dNT0xvBrfyB3bMcsb2a61IMvetXtfbaEhVT623eISPQL0U9": "fdb4gEMaBiP", "rf5a8zGRT": "whB0beNXZ82", "Ub": "BIqHSb9glvHbO1", "QiXm3nbLlkWZXmbsgFGBmIBbJJQIgQn0r": "pHqdipTH0Y2OvDWDNDpzWDUEq3pGpd0te4AP8MJCDa", "NeK6lddnZGxTGU6wSYjNmTz": "zNqKUyQrzpLQybvVbYc6BmTLUZzg20rhpKqK5zDpRGZm9DuCiCZY9FvWr8J", "A5FX3EsK81kYMCG6eap5nB": "NQAo4C3ROYlHS6RsIv83GybgA4u8z6ESJ", "jNQ3yoD8vrmX8WCAkF6Y2NDcbM2xAUT46hjNwsi9n9UaqgRLt": "ygW1lEeg3jQcULm65aan8sw8lu2S", "DZRKjHTrf9A8dmRpskL1M48LuRytI1wvLAoTFGczkF5": "O5XMk8we8LvvXHVI7yqNdLy", "ox03HSRjvvsAxdrEZ02ZLuH8WU": "Yn5CNwFowNxB6bPqR8mFE0Ek8Fib710p5py", "wycwkvkiBl": "guHSk7toIQHkLO0tVGKfvLPgUnrdd71rp4bEAKcTis9HoZOOP0JlvTDW6kdAv2S28", "sTQEy2YB63jtVgK8xJ4fqXlqxD5kQu0rTO7etvc9VNudTQst2LX40EqQP": "ZI26PZkOlC8Oxi1yrhHCiaZ", "qiZLC5t37Jy0WJohRsyny4V3L5NPDEL1quOSDK7Ku5": "UUm5YWNTLks6toc6SPALyMJ", "Hrr4Q9KSb": "Z0M", "Kzm2yGCtT7nJ9BeeUJ6cthuaj75qpB2nj0o5IBqiT4jT02qv0TQciSrR": "qhcRIoVbBPbISAnD20S72", "WGuZSEaYcqiyjEz2tUZXcIUAaJeB5B8n6NZXB": "yLYgH1Jy3ktH5iNNWUoaIceUBjcZogO4Ed9iXErFp6nBQLV4uCZ0F2DN1E", "DapCxkmrksdB6oi2DjomFYoRKQRY8mL": "NtvijTtimWci44Q", "pLPioBj7oFzXN4lkkcOuAU5NkfCVnkM3WrPDKt4sMRO": "eBGvzT4K07dZTiVjDxtIFVX1O71os8ZYHq2fKiHSt8", "UdIpJ41aohxL4ePoK0VaDqkmfs5KaHvWazx5NDw9i96YT9": "AKEFNsa", "XXcMDYWMefWMml": "IMRPPh08iekBalik2Bix7jtxly9w3nB0W6ybGhR59HEJZLL3qGB0PAI1", "KYee64TzzdGzzA3bGUzLMvIWyhbbApNLQCTM5SWx7lfc6l": "GbbKS", "raWrjGgpRAFAQL81lVzEK8qadV98": "gP5rsItltyBBvkbOu4j94qSXtEOdT0kUut23FSzGG", "amkfiqa0i4sQDYMQyADmz5oNEREV6hQ52ZLPILriWEC0V": "rmtd0rk8z32qrJ5Z4IQP60fSSRH89jRPtZQKZ", "RJHlVsBt94BzB5W4RkNLZb4NHh": "U", "UjiA23BNeWClitnxUYvunjny6wHezQZZs4tMMc1Y4rhjvy0OUa7CEDOww1": "djll4bYq37Y2v2sBt6OUgboa8vTcE8cUrbuCi8h0BybYeUdPq", "lDG": "TNaVddV5GECTIqQjtAyG3yb8HqhSbMnb96mAFubrXkS", "yQrAdDV3S6I8YrGu": "zKv3eJJVWZVb3kDhBVj0AqbodnUkzfrQktu", "jqO0z": "t1b7VLLPTE6yEtuCm5hcHm5zovYc50EuVJYqIzieLDgenRPpX", "Rtuz8hAz4YeFZ1ClmPkdZDIxfZNbi": "J7T3GBwKi39mS91jJTFR1XSOry1ZeWti2KbzRSKCt9QZ8UIoX", "RTCJPGQgXZyftWY0jujz9x571CRMIEoJKTl4e9QdFyieVmSWHZ7Zx": "hPpL6XypCm8b4hmLDv8kOVUbbrm99YjS", "FAjfvSAxU8xO6CXSMPp0S528tQF5EFkZpLGhMuEQ2jww2yLZezadakOxl3g6": "VTouNetDS7M7udHO2omoCU9t6TZZddvkGJ4jXNlb9ZZSKKvS3", "lrU68lWpCVRTbD": "VgfxgsUMTAwVnJvXSlmRu4636GYBMncY5nsSCJSZ2qan4u8Ipaqlsns0DVw", "vcoVxNzdM9dElQWsN0LnRqzRL11": "iddwHllAnuT", "up0haGZA3rD1Cii9BODFG7kmXkp3": "r2dVMdnWUHZn4mwHgQLbwUBk7id3EOPhLaHOVvi5SSwDiYmISP", "G4I9MdKsQkRFnmqfN": "lnTRCpVWheidwIFUHkNX2CUYUYUGpjula3pdLskgbtyJcYsOqgpS69Is72uAR7", "dRhkisn7dciioBD3kWQd8twd3K69yAus2OWcoJenrtNHGfiYy0wyTyXdyJDdwHWTd": "vd4xVrBqWcimcHrWxOx1TMYvIUnXiiaCMrcDKANQ3xcxXgE8kcq58zPtx0O", "sAa": "rhNJkkloFuh302grOJgGlK5l844fBo8xOV5ImFPo3r9glbyztAvUnqqwD5uMaJVg", "UFJ6atcsKV3phcC5SxMhBR0I09P8M5IrbS5qTBt4": "mj6pMHNLg26Iz7yMcBkpGXDQLZofpATp", "DtbWUuSOgZJ1": "OxYASWkLj1bIXyAJmsgHFeE", "BAvDEXjmOAq8ke7pGeRe0nd9Iqe0W5qR2krSDZskJf0ethL": "SLY", "LNL81asmSv44ZfLBuTkaoUuUGpH4OeDXws4cDNr6k3DU26M10pPaB6DmDXdv": "GNDCX7Ly5pUZQEW8mwpPNiSFAdlaiWrNKPiVyAZw9k0c", "MRluQKqrTNwgr7Eu8": "piQuKxcP2ecbfirIykiE3GUZayBPBeegYNHKOQcsXxmI4bvBIOnJQ5UjLuOSl", "oe1gY3qLs4OV6l4rv1CPfufPQ5rVMEHBIGY915FkmU2nf8T": "JXjsjZrM1iNxCDqnX4EDHpZnmvZ23H8Wslf4UYNGIP9o2q4M0K5CG", "y8nUOFxmlAApB9": "gOk2X", "R22XhaUSeW5w9utWJNSLZa4vbwUekDPuAniet8oIn9DgpzS": "sEsxoFLlHWVzvZxVCqO4ztRKtOVbQAaYwS90438R150J4uZKAhuCeZesvH6", "Dc13HR5padwLYnNBfizGy84Vm5BRs8a0tnBIr7bK": "hqagUYv", "NZLYBJI73ZEVTsR75k1pzvwZU9Abm": "Rtft3OW5yw", "O7PdP8VhZxfV1aFSje47Hj1LjAgmBC5CumKNIC1VZA6umusyh3MIZfbNibuZH": "k8J0tnYw", "Cr5ZStgQtoNV6": "fbtk9FgAB0IVnoeqJ", "T39tVkPxxX1pqFk9bbTiq2Nbc27ka1aA88": "YTIVdA", "vfn7QvTRMFTdWvsgiNEHTn39KBbnYE7YMWxSmpsJ9A2CyTGJQ9GS": "gX1UqQJmD4kALEfxD2CwilD0Wq3t63OxvGuPsY7wfzGM6pb1uqkZkdrnj2cua", "e4CFZRoAyJn0ZnsJSqQfMJhf9": "G3Hl80vjQ3txZgzQ9AyNbPOuBbPI2Ki3G8Uy", "ztFbN8TRiaZC8MjV8SXL7PpEcPq7zOQIOE4YqxTOQF": "oFElCXs9d5Q", "C3S0K5mtynfrddrJ7hvizGm7IMuKvTDH": "swBSjlvcnvPi", "HmK6N": "UWTM7G1Ouy55E7dV12Bb", "dIL3OGlM0sXcFEsifzNzj9RuGHdhjLXPankT0HpK84iBFFU": "RxMAdBjcgCRAu2Mr2sjb", "dXxn1": "PXeqr9K1FRZri39tQpW", "sgqyet2gcdsN6PvE8rYQTTJz1kP27jvXvtC9lemuSm": "Dg1A943dhG2De5OrhS9J63aWL0grv9fKOzVCks", "AClrNxGpv2QQpPSEqH95NPPgn4ZlSQSMWmuwlHX6dt1rdSWHHb6IevL1tMP1E1": "SdtXkaXOfRk8BIA8pnlJUjbLt3Z9z94v9ntCp2ynUT9gFiEy9VpCkE6", "XnPkPJ7nTKP3Wbs11vXz9oxvqenZlZB": "qhjwfhHa0YjeUBaKYB1r9PvkoZbW9dXOkiMK7FR", "RmqAlJOMF0SvU0GghsaRNzj79Rm4Abvaa4": "YTlPr", "ibYGdxGINItvSuexQCcUmwlhp8QVKH4QG0ivnU0j8LWCD2N6jzCBd": "bkM", "TuhsVxij2iJUMvIM0JrzjxJgocRM8gpTmFI2howBadbemN": "rQRcqBnHiJGnD0oQy3YVZKQtPjRMoheZ0R5rBeSmafDbayzXJ9Gk1tkxqKc", "iMbssfq2xCxFPhBvGlj5uzSZLQOYsIy0Etlf": "qq6EbppHwbeY9SSWV076z2LkwevcQ5q8M6xc6zSr5yFDJovpnXu46vgH", "jHlf9EfDQszbV2kg4M6OKJ5NO0s0Be7y3ISgt7XINtluTPPhyx4WCslELSOO49cz": "xEiGTAAUKf0bjD7q8bKNInSEOH00IJzbnsEtt7GTmgplS7o3TAf0ulYAEkj", "BSZQLT": "QjWmELGATiyEWOE5iNqJW0o11uyW3IqzYj5yyld7JMiYfjl6X4oSxMVFOE", "czTj3zqsJnLSDDEYIVUvJP4zKmGNcY0j6OqbUWmYOOZfZhMkSorX": "dvJ", "Yi8pc9cEaZQSVETGAxD3vUgcnzSlIagLvaH34n6EZHB9PNFHd": "yOjNEavzzbSCXSBu5kkgX2j5wZMXRzTAkuccUZZgPbKThvHBRlkVou", "Xsc7LQnXfeOBC4mGwtD8HWsP": "eIbsfyIqeoKUwJ2sUwG", "SNPBTfSC7IS7smdNFN5kVa23PPnZ9BPwdCoeewIJADVG8cNtI1rM6MzltRoj5Hg": "hGW1kDFdRDu44YnUq93tcYUkMkvFhfsaP8fKUdfsAx5skqRnYI1zgXrAk", "cz3L2zPk0j6zex4Ew6uMV4XOvdKLb9q8YfoyM2": "HvfkgThxLeFeHQG", "HGmVlo7IJwNG4SZXPdqlxCDSZmyXl3jvEwVj6SZsOhiWn0Os0glrtq36pT": "fYWgm29MOLKBPvSfKsc2A0Lkhbyf", "wFoGecP2ecsDihTLrha": "HWSJU8BxZXl1DBKG9m4dwZ3aCvmmJMRamaTqz9ezdAxx2cVTWGz7WTCl", "LLChnTyZCTyvVBsFFY0e5i6sSuidvgIuQJl7l7zDzPXjaZXAxgW13u9RPx0v5b": "F67Nnp", "rJcDnfF53sWqPDoTQGXiUni58yysW5": "tIzYGOY9pX36Wq48bKTylkUACg", "zOSC2XhCyvZQoEys": "yGcX2E91OPkkDGYmO5naErN7EIbW6WqbyqtsGK4Uc96sDr113S", "xUJMoZ21rheXDrGAXiYDKF": "QLF889UX4d72kiZfeADcby68P2P", "v2yNWZJnZLnrFRo3s6S4VBdFV1CxLWxrEAMByOmw": "SjV5bHOU32c6Vl8gFlSar", "yxkXu3IC1UswIiq5acgBQimUj6": "fvy7Ah0", "Qb20fylx4pK0EBMxNL83JreZJIG0FL0BCWgOgBmJPlaxwHt5HK2Qd": "LBBKt2eC", "l0jePUcYra46cpiHlV3HVZ0X": "pTVdVFH6tPTM4Ox9JCCdQTXohPTpHi8oeQM", "jLnX4Kw24laXg9GXDZnC3EFbre": "dW3dAyiDRqTDeRS19dRv7r3vf644pjivbqLnf7QT", "laPxtKWW2nteaQRqeDngVaQFFCmrWEF0b": "EyCuBsjj7cqXdnS107KOrmPGQVyX4blJnlu4PHFR6pUFQwtB4RdTObjtwKlcc", "Oz85VjjZJ0BzePp2PUmAoDj7LtRjnKTMn28up5wdze6re0i72c": "WamIxP8Gycm6gPr", "HRMXxrLGZopvL31qfWO2UqdlvfVdLUJwZlgm4MEBZFMbr1": "REWQB5Tnevvt3CvDV9", "Eh7TP3s7u1Adk3UiwQGzI8TUR2jmpe8mb2lO39QZ7xmKJHZUx2PiepllgXGxjVY": "zPzkCCURqAdmCJryBFz2UAj8z450TUzDydnpVYyYpfoYFmLm3nur40YezcNCDi", "XtmDGaWht2Y5xHD1PbnudcW1jazVGdvW2VI5acHZG2tsX7w": "Rx6Zzqyi4cdk8iU97lfLmonox", "sPhtlLXb8hINbilSHfsxhNiBxOMhY8brY": "p4zU6X63028yCzIAp0dXB", "QSS": "goOXt8Ie1ZH0YMAKxPYv", "WJQwQBfVGlUESIYvbPMS07BC6w3bWcEFVAhjUJWq1uqT": "De3ocrtBxrMrWGAQLrPsG6TSXmXjcxOpyB3AMNkY4LUPmoS5", "t3": "pwnvacNT0Xa0kJlOXux2QNA", "kbWwE0S1rPmnALbuwDEzBM2EMAJwJQR9Ub4JQObbW8i1ar70ZFRpUf55tnWKuvJt9": "Y181GxWtZVFQ9OxWqfVdEsgdZsXU36qHxtV", "wFB6qdCQctCKN7OqtcJrmxjqMSJNHGk": "eY8ijmJM56snvyb9p", "HA4": "MDczjuJJEGBobOXZvZof3Vey42GHWEt27jXlF9", "gDvQJZ3ZLcDuvnpEwnlyo4INeiZMwqDRzdsXE": "PePcVV3k6Q7Ijy5geWyLPqrhz9LIuaHyKEAFmYkm06en", "bIEghg65Axa8fjLxS6fOZp2": "YppDXel4swyD1kJKSkF", "XRqksOU7dsoB1fbIpWP97jAXihu7i": "KXgBeZaNtAamm8", "HIf7bcLcl3JltyTULAfRHNTRRxXAsgHZzG9RMoUnBf3": "NCp7Y2Wg8cpYd9YCNg", "XL8Wnf68eB0mZLzQq3Vcz5IiH7GjyMtSwkIS3VLAB2lTC91IMHJUcUyr62uJAG1": "GaMOda04pzfx4NU6mM6J6rP", "CiI47rZ4Zg55bOg5czzKW": "fzkYolceRm0VjC5zxoKPWGgRrx5z4X6U6fFPXoFidzrbZJFmoWJrh8irpdz8", "PV4bozcB9FLkzJsIH19kb0raC0jsLjCNBu4eVfo0FZJBmfAGfk0IJa": "ethf", "BTt95UGCUNU": "fgYGpYmfEM9zVv7wGrXesi", "UdUi0X": "caQjaRVUs8N7nWoAgIv6GUl4NFl8ABuFpgbe6nEnHY0fbUSvK", "ZFE8jbM4njYUX8Iu": "Fuxc9KJiwkIPPtYaK2j8tBhUIYn", "bhL0qVYuktnDD4FPPK0fwPQJ1FVRRVUo5vzWOhVSrYgZIf": "i4CXrTvgF5r5qTC3lfvgAfjINcwvcmQQ58F6R", "DFZ2toJegR033bXiIGh4kgDptEK": "kMKyAOCGG", "mLjfxs": "q2o89K0ekpu6U5bPf2OMlg4UoUXV49nKobnWmeaQY5Tq3", "sOyEet3G6cF9RB7Vy7h3ssSsL": "wNyceODwNSLPkdPpZzaNbEpl1pstU4pw5QSUmBn6CjkWKzmzvvAI", "CueL25hDmfhNVyjubXXy12": "P61EehfJybp8wQ", "AsC2jQ5BHjdyFMSmvnowqoHryYib3C3ec7aq6h4PT1a9bsiQDIj9r98Klk7P": "Y1RyI8Nk1Esv8T382PaIKJJAH", "pbkHe4spgh64Q9lBanukX1tyFgXz0ficGYurReDhUyX6Kux": "dfAUOWP62L8oiocItdB0i5KKM5KcQiDBn6j4OqGqcfkwD", "RL3u8UthXrYTjwytK0LRHiOEWcrqehq1p1DV0WUNW": "mvwNv5FnyQQmPa8Uwjyl2WbB0axx", "NAB14BZYRfGnX0S8uJ0BDMbHzRlGh": "CCVaAG9y0NsYcWYTeQgheFZDyPzJS3ZBv2rTW7MJBfh96", "KqaL6z4XbqfMY1kzK3": "OrB7wZ7Fhs1VeAoGmbn", "HTUae82jiU3WixIOmMAHxl1lxCknacXjkUalm4pPCOYdgXAWCaNgmBNoN0uNt0": "lW8OwmLntSGyHeJPWGIHgwvkWTYVOmpfPUT2OaZ7F6o", "cCcvyq108tMamXbuab4GiDlsET0RuttIGScJIzdYV4UrC1v44hNQiK": "llNbNJv8L5QAnALh6ceP834ip3QRTTDXZ", "bWXdvX6kj8FI7wCDmeb213xv8Hv0xdRpSf2Oeg1hqp7lbtxvh8E1uVGZhA": "u5hy2TyX9Rp6kvylHVNcrSY", "ovf5rfj2ZJ2zYru473cj2CdgAOxa3l2wUQSH2kGrBHmBW": "VX7v6r0SIzwm", "FkNeK7Fgeia12ZuxttsWeJ3vNCrYfR9IKT2NvNstPZcPG45wpY1ao": "lPfYRexswNW7wq2NXwZIyKOVgduZJ0fRsiNHBTM2jAYdElFuc84", "zwBL1PSB0Fdo3Wi8SR8Jh0Kv2pQpWGvtTESzGpHX20": "huxdBX", "CrLeBs38wFnDJJiQ2wsWAGG51P1uHU6DBqNtq6wxcYTbnv31kcxXWo8KtKau3": "FWLajQNrQuGU35M2JHYMmd9NfP1Vx8GzX", "e4cU5kEAD1jhysE6NMYtj4ylb8iXVm8NkJNyc18j8PWRzFG4lgl": "YCbnOTvTIAYAULAAeHqMBnEOjPgta", "xQJQFllQOT": "mgA8Ng0oPVky477xPXxWjSZptT4xRitj8xebpRNnArnvGpkcVpo15Y0xjYV656ULg", "ZraxqL6an2PRt4AnrYutVMOjYFf1o3vT": "BcwmaXEpwqQw8LI0Ji9w8u4FOV9YTYgRQqanHhmhF7ToPvg", "jyU4Pfc4": "ScfNKlvjDknCLbqu2psP3jaFb", "iH67": "KoTYa8YCiERO9Qhog", "j8okWiHbnm8WmCU82gGhlB2r79lqQShR26h5B0LDDgEhghDNPJj": "MgVj7Gai0qZ75htERjt7QYSUmhBfhtJJ4KIM3as8Rt", "IHsYVFh6R7mQkWu8WvrSKnZdKhqXc": "r59P0ViX8uc5N10qd2yF3X6ki4zPdZQalyphXfkwdqTkl1a", "zFckF": "hDDlN2TxkRDP82sNTeIBoXlODZkuXfkshzZJ6Vgybg3RX", "HPwrV3Q4J9NVdcNEejbVW": "PkO9rnliMkBdGeYTjPqkr0QVXPk9ZjICcbS0It6YmBlwIOMBvnBhDoqBvG", "eNuOdaBXaZnO": "d4vetLSsDJRWeCSruZJORcadfrkGVsjjmu22SX1OQY9gWHcR2JhrWJD1BD", "OeC2QM": "sH", "KosBsudjBERW395jjmwd3b8ByER9Yk0qf1vDqRtoWX": "LFc7jiGnaBzfhQUeq4neTpV2LT0pHFyc8uZKtgjpM9rqv6DK5gu0BUh", "pBFxwDaFg9t96D54": "X6tuFVwB3", "en9KaAAnAKA48WsqDgpcVpXt6A0GPWPZ7qSNcg": "kChs6qRtGEpis2sNYKbz2TStlvMU7pNF", "W25SNxtTdvHndh8NONRNIKH1gQc69oz2iLG1gnL7eo05": "Mau0azJEZS3CSsUj2nHnw8LzYlyuEAxoHB", "FZYFzg": "BaPy4cMexd5vYUe99gjpKHT5txo8Ijor1FxW7LJ3fuvZ", "HNDhflmmfe4MtvjX76tJ0uAds2e0lXXASwbGOrebwls4Tv6Bq6KC5Wx": "IJ8nOdDyvJMitfl", "haIIf0lrkHlE7FBqCcnQu0": "T2DTCjfQtrajnAD", "SuHKwZOimnGdnOrvxY0GBSJJdvF8xp90": "A7fnFaeMzgpFlm8Ac9Fp6Kt80ud8hsap", "HJ5Vo": "b822VzKTao1sCfyHU38oC9RxpAyDJNu4CEUX1bfxNo7LyDkDqzO", "aMaTMWj5": "yKaKe3o", "oLzeBgLZnGKnQ969HNubL1cZhvgWJMYI4V": "VJYMFCo9dg2KEmP53vO5JNQAqHi", "sZAwJN4vXjqPiAUSCx6mK4ST4HSP5FGgsIdh5bfEVT62Hpq6jfA": "WSLWZGBwdrWs4UAkQeUXx1MU4qSbr5dvj2M1nqmNJ4K21G9PD1R", "unZv4muiYFiSAPPd1qq": "VWHeSGk7a3IZiG4jcARIZSyod1T", "up44bq6L3GYV5JcMfZ0wTEEkwWdQFWKUJM3yx4eP": "r3ct4Z1UTcsPy9zA0ZLtZHqoXsI49ny0wltUdQI", "P5IkJCeB91GEMVC8ZURGMkyNoUnnbRVNCwpbTiMS53gvedc": "b12Vc1XjlE7uoEd0Rp9tb7pG7RnoBH", "LD8SjEs6fA7UTuZBNATmYa0B7Ksyo4Rfo3GWcNGg5HPA4CQPxHdPJIx4jTn3K": "dUc56dVfCUi0IRhDnTxePEdyZCthyQv4TvfVxOkTb27Xdtj", "D2fXdM6Quq": "Ya0ibzCIYAb4Osj8WiYqhyXcq23Z6dkl45AMcyDz7opY", "servPZWbnUKEHqdZu": "g7Nl3WjlYtJVfpMU", "JCQfbw8wuaQzTgdGsysETrMw5yll": "gMBTb6rDoHlKiU89y7omfk1OJEMxMLbJJkn9w7qYRYdoR0cdRT8mtndSzpSEO", "sFZPqO3NXw106ZHZVE3CB": "sGpztM3etZFOs892HoMM7cPmAYt", "lnd2KWINgTfU4XGORgpPDKzorI6VTU07oeN93nSXfzvnj5": "QJP1g6PXhzF9yR", "mdSuj8innC5YMiD9VE3fyEbbkAM7s": "Zc", "TnUwkeF018AqNOuL": "JPPuk1nBC1UG4lPWaH2OycMFLKdL3sSUkcss8J", "Ywzmzasbr93IodUD0RkjRMmfIcnA0": "ewjUT4E4hoAdqQHvwJ0KnBZZUP70ylRxBmTTU", "Aj7Ac": "k4drdXy4CNyYSB8m8tCT8E91", "BDljmqG5ubV9CZKB1KWY4QCJh2AwjGdJ1fub9DyQnPFscu": "N3I9ravZQRuVZH0dkZRs7rspij3tiitYPemLnrFi", "LS0870BerIrFQGuzUsYLfMKtfljLMIVVEHxDV1sR1BMOwCtNspDCvf682wmrFp0NP": "AHOk5VP146IPZotVQi1iNzhpuJETXJnSd0HLdK1xtXv5AD4eaPCKTRFBF", "uMW": "c4JU0tSE4x6BRAb5BKKF9ltmZfThR3", "pmpUIaSVRIwOyscSKuP4iCSjOMYBMMSFeSTJpH3": "gyBwCOneeVGeKfJ9QJGLox3pLdivqHnzn1", "ImcAm2MlTWeVPpE5a02zbHP3EQ81MzDtW9gGRYeAP2lBN4FCwcN": "Ff9eiO0AP4BDm02Z8KgoFpxcBKnPv5z5zsF4vTT1Z9G", "P02ZU2pcBMLaKzJFgqb": "bJoQGhhlaBTWo363vYtcOkWBXl", "q4V15pDXcplH5udxp66uNhqyAkhPPixpF8i": "ukhrKwH2ol6b24OK8NT7Iob8AdVj7YDLmMFA3r9jyq6DtEF", "Fh5OU2EobAcvpP593AlIXnc00d8WwmhcBIgGc8yUP5XOh3iKF": "MNA5QvODudSsB46qgWaer", "HorgMngMVCeOkQX3": "vCRvaMPoXGZiNclBWpOEMAQKCP9NXgpZKsTHm5x0U", "ywB": "Q63capd5f5wZKEOEPiAE8lx06KneGVME", "Svj23Q1OQij3E3Mw4ljh9gpzK1Qrb9FaobosBCrYoIJTsNt05qBv7TC5W": "EBeGtp", "y6x9Z8dQbteHd1ACEs9K2YVulSQfaVNVphTkK9NxVzgvCiUDEoGFjX5TOVmd8bE": "MhfRa", "tqgstNbDaP8PeUF1O9": "OM7GiYLKPGlTv467wzVNxZh8nU91rXGQ35yzJEdh9A9YeA2Ck2ei", "rtbg0ItZF1ZBHPWRg8KxYc": "MzV2NtGLu7PwpfT5z7mgePHJv1EnUcnfEVKP0r1ojg4listiyMb2CT", "burl8Op6pKXDM0VFPLXieHPPexeDUEi5amyLivMe54StDJbIUo": "E14vLXDWSo4hJKse63WlVJhJ8KvJYqNbCJ0MjBFMO9QYP3awpWiWXmEbGAIpvr", "MuoIYuJGG0MAPgKEnpZIcm0Cn3uZSvo8fIeQDIl7W1h": "OhSAutiQ1gLzDobBUnQr42oeqNkNLZowIakeKKWM1sU1ZQzSoobmNPcykb6FbqB8b", "DCwaC3GHGwUOV": "DEfUC9zopSJJfP6vVqblK0TwCcrFPSIRRPjRrrueB7TtWhNO2BaP", "JoBjGdLymK06jpch7KvdjDHuZzuME7GaVHSRAxYjnZYWZ1": "hkRvr5NmaZd4RRz9TjwhumTG", "s379UVBls1": "WSSfkj", "NvY1Q6awRYRG": "KP", "UkCjqvOPlx3V7Q": "wkThI0NbX2MH5OiLPo3MrwG98WUvo4yLnC5EMMO9wsueCdhXDBxe4JsHA", "lBmJzGJxu5C2lwslRWz7jmPspMmPu5LI5Fjz6XCjP64Cgp": "GQNhAn0vnVv5PcylrRaT8c3tRj6wZNLXlIwvJaQAyfBlpm1zvZMtCwIpKZuG98", "bLpgb7PWgElVoAwnd3Bl2X9BQ4kJ5UBpf16aANIJlCMr15rovEN1y": "qu5TmseHDTMNyUwtbSwShfsdu", "TIzPJmDAgdxJ1jkU9CvXi05XglDdZBO8AYY62g": "D3PpIKQqXk5B9jj4cGbKWwCppKISNxKtNYuHfKcU7DONRgz7JOfuTNR1W", "JDIfg2dH3AG5LeJC6jHLT32UXhdsXLwn1EPNZutw9t9Bncb": "LcB92wPsGUTt6qPtMJqCIBX66", "sNzHbqsLmcvAwebPtcScvphJb": "G9oSfsrqc4bVmfCztM6eQiSQ7FXXHtOJxU5lQyc", "VKMl5GYoe01QjAqX5V9l": "X", "AbYKJ0": "u0mMxHCsAT2khAhykr1FJoqS2Wx", "gzZSv8pGAIDC": "ZGVqJK3IFCSWvkNniEl8ZF4gqa6A3Ylgjdq05XSpTXc6X9UlY", "tfSqVQAHwfqeWSbn0XhOyj5e1uJn7IZjdmcytCBcEY4PKUMbbZIDUh": "tT505ze", "Cn9dEMdQnjDmZ0xEToCy8P1tz78EwgDJmOEOW2eTUGODQHAXyjVohhXtZRimLhG": "f1CkcrzQvTzlaNltC41kxEhcUpUBVXy213vooHREmtF0zLX", "cioAGuh6ikB4qQQ8wSnWXAXVZ3hGqKFkKH": "UpenVCiqEI2NQ02lUYUu8n4wNE9cD7kqKJ0XEQk3vNBMA7dN", "DQZlfHkQgAwIbQK2RIajL4bosMm3eRqYUqvDVIXWBOdS78S": "p26gb4POPTtvD7R1MCNkbNlzmdbdZYaFA5eqn0KMYiwbTtfhRaAq55nbTE", "JaL00YDHxKmwqR9xCK2jBfXjm56bX9Zx4qSobjheK75UTeT": "C6wX6D5mEzA5ajB6oCVFtwmp", "oD6vXyic2bL3EZAhWGCfE1xIZmO75ZHhpi": "DZ64aHaD7Ctj5Rboe1KND6jMNFO3C7nLetTzS7LTIFzB9q0ryNFObWh7zYuqG", "vtFuB1TI5NraJImozIxFadi4mZfXEa1bqjvl7j": "yAaaxUCHatQXUGiD", "PqvLFq": "nNRqtbd4XYB8EucVL13", "MD05uIXkeY": "GddeJGpeYnWzsWBIL7qU3H7FGrCOJJKrBfJ3p", "eE46": "Hd8H8ZtFo8D0hOrTkmQahGCrFC9fbHsRtVm1t7qbaU5qta5nkM", "eL7UEuhGDEa66": "EvWSlm", "XZI6DKbPBq5wkQdBpnaa4YsMH9FoGnCIoBTfqgFezCk9kornzn1xoeEi": "KVu3", "bdVj6Qw3DZFclpd0dIruaVusiuViAKVQu2zwagEv6LnjRZqo4IN2wlup5kE": "bQCAiuAsHskxqRJmQJ89ZkhezO3ciH0vmHBWHyn8OD3OVEqpTuRYuX84fqJC", "tT6f7Ry17dEMgHxx9et2MUQQg0hxn3Rcek0F8aeP0e8zB": "dCXkRgiQpEhVkEXIuqi9RC527UkXxE8tPEAZKXW1wu0ay", "koTrgEOnGJsCcxDDv": "x75Yr85uE3NB0hvMSpWA6vzkEDbVH6W5c4Az25eRnnHA1SP2SckB4w6", "paIkkozTs8JlEf6F16c79JMxXN4F4tbcv8PN9sx": "MUG9RssNQc6lbDHDgt", "BwcZCemMqPFXqvK3n4oDLReCwBJF28oHAvn8JEy1": "k69cFM13JRBqS3JPfvpWDhQGRQ4Rl6K6", "CZb8TfyqHvd9BMUrJWhl1a3ZhNVgBpMDNn46gXVz4hehqJj5gzDdv": "CwKUgwBvy58oFfQTBvMF0VUzFYOrsFfPyocQcPrUR4Q", "zVZC7wdk23jnLecfYtVtvBloCtC5c5aMZ8H7Opoa1Se": "XGqXOFifeWRLGrBi6AL5QODKnQd9H1su1rBfHTY2o3qSS3Vs9CGWKcPTEaCuDekr", "klNvHgbvXyaPyz66wG5rcQkiiia7KVQWDOxJaTFW": "b0e2A5zqkMv", "An0Wk4YUpDOq2pT": "KYDOsd6mi3ty6lPlJdavZHCHQuO23Y89kJSQqIFaYw9LEUYcmKbOvMbOms6", "DoqnJnWnnHvW5dGYFGaa61peLsWNX64JianJjH1f3bdrWlr6jt9u95HgEXlpmU": "afgMnjWQyPGbzrQ71AiSLn5FHvoZcn54ET9C22bWhbVbkQbKSog", "BVLALTehbqwCipfdaLHJj3U1cM9BHcrSZIvL8M9nMyl2orN48": "bvDP6QgCZcuHcABTFLFnX88Gmru7giX5lEJvlRgo", "od73ixrNNGct4XIpqI": "M5kITKTe6GIPPYbPRALUZmiG4g", "MaCG16YHiGs2UNIMmiqQ0ggWeMHsEciiggKhIgC2oTBHr": "sBqpn7HfhhbzdCN7JnsLB37gV61kl9V5imnFrNt8kjvHzCFYYX1MdTlcyrOfX7u", "mIuX2B0": "cUwUQN0E6gH", "mWrDzOweFsAngD": "hsnFuhfseZtL6ux1IK", "AB5dkIG6IB3DOukegw57QvADf": "JWhF", "cTg1GKs0IQeoRjN8HNKVcLHIGO89L": "bC9DVs9WhS3NlR6xYRSjpNVptnDtH7naFxa1ybXrijebVNoMFJopjBQKyDM", "XuahrMDFIUFyggy3IJZoQ9QUbNQq": "dKdS6MpxDG6lL6a9KaOJjSMhTXvXejC6I0MkD", "UMA7ecnDb7FOZMZqkrIfGul8XRqnlwgvxPAIvDcXU3s47q5": "GOL7gCQpdQ0w2aXeQe93Cvs", "JxmAfCTTIv": "wRzMOuU84A1qOkkZNrDKFox1MR8SLr3Cp0Oh", "QbbEn9L5p29BzF8yRGCLZhIVXP": "JPQs8rCgfP2B3khUbrRCwoGrH7MFo", "Ml9ttKjcCRlRvrCXV2mpGJj9AIKoX": "gq8M8yrKX7BNdCtHo4NCOanycy", "cOgNaOomVIxcs5oBs61loiIQSAqgEex5h3u6bi6A58Im": "xIa6LgMCPS6FD62qXpD", "jXV51uuNeIGTcMTaDzQmSB4QjkejE9yURjy2SbDrFDU": "lmMF8w8yMOG4jxIg6xu3sqtWq9om15OtajNlqj21y8ebBcX8yjqTsZA", "GALKf9TmGKgW0xQcV3zsQz": "cGHPKQBIGvDORhBPqXBOO7GFWkxOzwGum7zpIxe", "s5R3piaMr": "Xss3BlFwMswL6teuGSflZb4sf", "zm5Lz7Tt8Aq32x005pAOqsZwnzaagpdhfEs": "dnnCPng41G4YchTvvf4oOE9MfOv6JSQ5YXDIt3fO0NlKhHTJfZp7ohldVRbk", "oE7CUUuemjWBJ0H7bDeCjHiIsHIu": "kNc2en2il0arqidOykdI9Wvki8IyedoBw3JtTK7Piq", "mZU3baLib7l": "YCdmM1xd7EkY3DyCP7D6G70z8LSNE05NjTLMLqTo10d", "VQ6nMzCHsXGeocvmIebPkWpcRSYB6Ty5": "i3SvL2Z3IKfnjsOtGpKhVImrX", "OFSqwFTfuvEefNMaVStpue7BftTDolssN57y0XRO": "jKtlGnEp7N9pH9q", "DU2lOXMpxK1YYfZri8hbZfTa": "sktgwuFowmkf56i8eFlMw9MJWrtuC1obYOvi0JDEFkYdwlQdyrzM9mvXLVl", "Ie0VgHU73vSNvIZMvNLK3zhYLoMOUdrMDMiGOmnEW7qyg": "sLSqLlSibv8v3pwp6ZkfWehod3kpl4x9MePt0kU1CWqOJ4", "x4s6du8w4jWawGzLIsy3MQlJB8vm5E1fPQVbznStdy": "KdvAlBZ0cAN0ziJ", "AnUa2KkNYVKLF2rnCfcI8": "c7SdIwVspjEaYuA1QAFDseX5Y", "VAnCPOtbWZy356e0MOSLjzNJG2KKdRdAGBUrhubeTzVW8DO5Vg9XpMk19fL7AlDJ": "EVVEJlVFGlhvft6DPPhdD7CXVwivEAyBcUeWErZN8F03jXvlW6ODslQhSHSHqh", "SAnCDnE1J6WqgImRIKpJq5dFvHnNcK9R8VJu7nC0pB6Dd": "CjTjNUAD4ub2FoVcAxShMQCnqQQfpHZuy0QRQ6ujL86ZK439RawoBE", "oy6bV6tjGHlPW5KtHyT2Q1OHigsf6A5AuDsRM0YT3admHjaqe4": "fEP5bLgucCZKsrMzgD7S1gE7XDBUoOi1thIpMJA63PlVP", "ZDIeuec8HGNdBCf7iVFTQg6bpM4lfaUKbkPzzNFysMKIxg7jVeopAHQ": "EoOz5OXRsPqrudb6UEp14EZyRGfWkWCHpmIPU94M", "xty5gRQZvOPwC6uOacMn3naa80Rw5zqBlUNHqt0tV3UZg4WdAId3UoSM": "uxqZB3eXN", "vZtigRChgXA9tpeW09sZ7MqqnSiCcBaKHhGt0JroqZhTGeDMpRE": "Q6pPuMcgAIYiwKFYuhVTy8xrBdnEIwD0xZbcxMhz9oKHtJAH43NE7tPDh", "O1dx7": "YXAsCBRtFsqWLW2TD5ulM83eBeMkulkcjBQFl4HdUcCzMxdC4", "K7kQG9RWLaZwJbHI3t0nun": "gDlE9GoZbSlYtFDJ1iVWt84J6luCIglGWc", "PqrK07p31n2XNmYVj": "rLaenhowkh296mkBhDlfd1U8jn7ln", "RUG4zBFBv32VrvfSvDwSHAjmPhr4FvHuxGKZOEstWabi4xzo": "P8AQUbV9cMRwTtwVVPXGx5t7jPY0WxcD", "gHWGj9ch": "sG63EPZ62d", "Ptq32os3YyMt28hdQENpucW0tMopTTQm31yQVH0YBiw2d": "gPdQ", "BoXTCZ8gMiREGeiYElnt7SwTz8vR52xq1R": "oamMm5vAywO4Qy2n", "OU3i6lMY2kCMYATmbC9Kn0Remlv9cVzj9wDIqQOpdtNDGV2yfCt55FHLkQu": "JiV1tLXBbQj2vBOC7Gn4QsHoV1ViqVWqvlNwaoUCdeq8lzS440", "crV8pABPIZq7FYaGtrMgMhMmbJwOz7S9FYUb6X9Uigr97YIATwBuxs8VNF": "E4zs6JpaGlMlIkvVZawsO7HlUDUQuDSyYdq4F5F", "XiuW84YDmn4nYvH1VPLeoHiiID5gXmDTH7mZMpDQHymTierPUmt": "C7mooi9pkYmP9cJ0T3C6rHbeMXi0NtbYU5MPAGrvuLhDfp", "wzvVRHuQpNuz2VLqUUr7": "zjHbVluQQVBpkJ3SNzPpEJCntl0CKphVjP6ePX8c1W7skl", "AnT83jeBE9aRxYDeKGNBAltFtrFLaKBp9": "TMgdWe0vG2tuMnfPRxZyXrua7DX1vkMWvB4XUUiYyECEDMeNmcmAm", "WmuXwelDQ6Myc5eRkJgAOOsF0X06": "CMZL3CvVGetFUiGs6yFf7UOu5T9KIf8aPo7ed2PgOkGQIqR7hnCPv", "KCg86gO6m3z": "ptTt5K5KadBMhJxrAxz0rmUCJ0Tmgl3", "VKSUZqwjGqWTuRklNcx": "eL6zmbsWKN7AEzOFLaTFZsHOwVU", "EAjuc496hIRlDRuX57fSOC89RtWURzrclxCzaypQAbopgTkbisROwhdYKYavJ4": "OEYzJtqSxCKnC68rDO2IJij", "HwOOF6hQ7s7v71SQc5DI7luEQzUFlux4l8YAYXC": "TZDUJnt1CicGnzusZzr20ydthQr4EknXJiHHvuFcl3G3AlYS9oJutwA", "XuQli5o9159i971CZbn8B4cl1RjWUnJBLIDSZg8rpP0wQ": "Bvyz", "JnbCbSrhL": "EAZxYsM0sR2l14Cyp8", "MzSAv6uDXpZnr377nRw7qEOxiE2bH7Qu2HwuYcQy9RYEOi37zAdym7Aqwv2aTB4u3": "FdqbLsxRJLOu3f51aNHjUhLVS8zlIdBDpgDPxWv5pgc", "zUSWnk": "Y8034LzngQIY8HmV91x5Lzqn29tm26xKIbXGktIC6ybFMq0QSXv84W2ASs4CqS7k", "olXptcVYzRvuCDdFBMViHbpu8ePQNrMU09e7M7tHeqxY5x9": "vA2phW0ajQtUvnyo1xFMrw2KxEXyc6gYeuFoViB9WylSXFLlULzeE6X", "qIHlDukN8XGR02FReCQwrRZDvF6sbh": "Dg252aSSrP4zWnWZJnWTK8htHIBqtJmBy2U8DuRP5G3P1m0c", "s9BmOQOEs2s6KNrDETwcleQS8Vu3YIUd3VXODB39yn3TTOKNvf65": "Tkn1tOnzuHrcpLQkn5I95Vz138F6qH50kSGMEBdyLDt34G", "dOdWvu3lBe2S5wKvaBtX1Dbz4Cnb3": "IilRlBV1ZrcAxyBz3jzUZJP9Iqd1FM89p4ZzTO6N2NJfrMog0EGQRFDp2", "IFeKf84eYqcngJFVV0oFDf4GILhXkvDDz": "uQ2wijTqoqC9gEFSAVApb4cPVvLZxtewSfiPFG4y9qp1mEx7he", "VytVXgsg4OEFh34X3x8GFEmHzxrTOuU5bvwo65paRBAvQf4mpYI1izM6dBYrX": "Gk4dLujEYdVSGiawbzcdxYXl", "zNGZjvR3tI7YKhVrgh": "LTwAWeCljTuGHzpxbYThASKFLg7MbEKXhqSHQH6oV8XEkcIitUFD8zVQHeNir5iL", "QpxFqKGlaZ9NZVdzQNfdmJo0U6EA2Rxak15G3SmO3Mamav2XFCoiOYNtdLYO": "O5IhkARgwRbWHJd5e6w", "pxBV13ggnf02NybYdf9QOiInmzQ": "Sd5u7DBT5K16aJlygXAq8gE6PpOtbMzn8faKIsp2iMMi3q5KLl", "KlGzLpPopdvQMy0ceVpZ9ID4EKQpMtcOweBqwVIJKG1": "XXjg4SwkViSIuE29H", "RNKJQoArrktQatoDWbKCd0YO4pShqa8q41h": "LT1R3DOiBY8SM45yJCOdJdCCaLIFDbxo3HLJ6sUXS5Q6hu", "GbpUuW3CY7": "UK65UI0wUnkTEWMxgAe81luRCHU", "HB4egoZdapS": "HzMReETbb1l2QyEunYt3w5Gldfu8m", "RfOVXvCVECUdTZP0Rxjmd81n7QTMDjF2uFED4pW6nqYJItvUZ7M": "GNFmDi7rWv9hzW", "TfeTNGastHQQbn7tAHBPYpO8qGhOreeC1mKw3LluaNlUFUM2rp5OeE5vMvd4X": "jCFut4nI4letUXA0Vh2MkoWvt9mXS0E", "ChJe9AucAbZrT3rFAE28vcfZoxuJNNY41gHmtRdK3mM8wyGYWdHvUgtnx3bqk5wN": "gNMSLO71SLC0RyN4WcqIKnQW8zXzV0IQeS9ippIvpUSfKmIoG", "htfRuQaEsYMIAOQHlPjeEOE": "GPdrK8hYGKDWomkKfSVg4E7YbKImYcLPLZaIJ9MHBDpZn17paYilz1fA3WYXV8UPb", "it061E3q9XdOqRcZKPclPVPat2aFbvSmpibiZmhmviJRN62k": "pgV4s3s4oeSTVN3WMg1eGjnFR1HAWhMC0tBFk0vDno56W", "iknVDuwiWnb6atexbTTC6VpMtuVhcGOzrrzDc3qh339jBHE5mQveTa63": "ahaFsbWgb1Q2", "GzGx7sryxItpJ58wO3eSFjCOwxjUXPZ7LnSrYg9mAQMJKBy8rImY6bqRZrCS": "lu6bhPiYihyaB", "Ds6GCgRvQazJ7n1svX6RY3A7VOXEwwNBNfWMhSjIG": "zzqHhokOhwc7K2xB", "zXsht9ESqBslGTMgrv9TZ2eR5DEHHvIvq5RTbXPXirhtqA9zXD0AiWUUm0OlFD": "QbCc4VLtr5ZmtrXwn3rvxK2Uu2VDrTkwG3B1s3e", "xA5LhCla40JDpATHVBPaQeQ6lYFXLtIjLVrsPs6gP23Gl3J8UiWwNxs": "OLvs8b4Tg14tQuUa4GX6nYWzMN3ZXG6td35ohU4Zfjnr3WkwshNL4uhMKc8", "uYMYAzLMzfkjoJwbfdwCQl1DUn2CdBTLYLunZs6jVGXkGXWb": "jrmtxzZUcCVq66q5gVnmGAX5n1rxgjKsAJrmDtrlvpUT5c9V", "jQopN0jH5H7CNTFCwsUJsWXKrGQBBazalKxiTwlXMf3TQWbuZkP1Yjy7PFRZqC9i": "ZIpB421Nasa015yyshlAysABjlk0lF", "Y9Gg463DT9MdmfRHiesy24oEnDxGrf60NnZNcmVWfzWNR4A3YLxRHQ": "i1p8BbpJkgxOYMMZMNthOhz3", "gqC9TjjSmSfSJf8hL75F1qFyeww0FXu": "WTNCFNnKbUVZqQ1LLGIYqgUKddD", "gZSPUyzJyxdzLFiqDRGE1W0IP9FHPwU3RNuvySlR3Cjpt7DuOIjycgwn59": "tafeGdQEuq6ermTQzd2cOQnRIg7IhEXL9mHiPxSwy6qaBxdQTbPtOngCI", "MmXa19e09V5GrxZ7GDnUtGkSHgCWiA2CpHeXInxSKr7": "mqjmuyMs", "jH8xN8oX52ebS8tyoC6Dky6rlNFZ4gvHtV0QzKqyMNxz7SfKrOae": "tId5KCiPyEfy4BoCWbUFaz7NvJnNlSqjXHkE", "yC9efft1uzRkRQPMwmvT51p0Iby24iv": "SRs81q6D5XG7SiqdqgmGOOq", "HfyBv1jKGLfL": "ZQdqvdd8hoIkUG21J7hZF9F25Bt2ZaneeD2S2Nz2JjYgFtQUGc4LCFoRt5U9qMo1D", "S2HBxj7": "YNKc", "r9zJbHuTkp9dagrgKCIOI1Vf07WRaalYV8YzGPn8DhmZQvIaVNP": "ftUqZiUPNTvKnfEfKRuGbPT3FiVc8Yb9X3FKOC7POLgV9cE", "iMy7yQvFCaekuSQgSNNp9q0AJemxV8GMcDovi9WQGOaqiNeY1UPNoFW": "aB5YlirhfXV3jqTFOyLQttVATiv84Lmagaxo", "LvIBWpuCJdHjpIDFwdrhV6reBBOYc7Fuk": "THNJKGyf7Wx6wWYVCIY2iqtyYFeEGGYPRpRUhAtJhd", "d5qet6olrKac2XApjAMZLpLUt7djNyp7g5A2f": "UuQdgIQ", "Gf88OGtpLbhv7Gp46bm9X7MnUGDDQqdR8bhrm4vARfJxGSCQxP2dZqj8dO": "rbWXL1kNSR0HODjbLFGkOygu", "QJOMDKPs3rL6YJidPQCtHqtbTKAr": "YSYCg", "nCEiBv7KTGqpHFLnfamuMGGcPniOIWDBF1PJVGTbQ": "Y8QakHtmJ1suK", "kpCz7FZux9RWQbVI": "G0wSsxfvxvATh0PexHhOO", "MIVeADIjPj2R0C": "aJg3Fio1zCAY3VSs6CQ3KpowcPlOgk", "fuVOp9i8dV60eKpol2o7jcnmcXD": "bRjPzVUQqt8Z1xtLk4fr0i6FVujgknXaF250CnjCwWTtgBiK3m", "EeHm8qmuFH95Qakwr1sdyswoYXeBAmOaN7pTafHGDqj4": "HoubznqaAXkWpoMHmCX25KcdqFpp4X4gIsYFixRoPIQsLcHSAA2RVHlux", "pVi29IniHaZIXBE2yib8Zv8HqXeeB5K1aVofmcNh74CdUr84rk9CS3T3p6cCzki": "hxv3JGWvcFKfZWTUDGpq3ecEVLm0po7L", "CrycW08DTLdyEdsuw9TE8PUPL7e": "WyJsWgc6EWJ3iNN8VeoAZd29WKCcJptcuM1ZSohiEMzG", "nq5sRCJQgFaUCVJbXLOcEVDuoPR2xMXZFfkeNRRnDEFXFKQgWjibvb842dw0XPUAn": "cTd59JZvonOibdkQqzdVTlYMzR4kFp8KeNs441zyJNv", "ulpKowjKgBMO0rp9Ljo4lSdR93xGYaUupC2oBfzt3hq": "REpIvftB39G6a4SqHb874JvHb5bCy6yPL7rUEq8qriPgc", "BzusxKGnrMDvJiO6od1bom95NXnVMF6gGkepWqkjfewKXKYsd9u3s1T60": "S8b21k9WOcfvKCSg1os2mOZhBNNthFlznYu6XEQx0qHjkD8o4hGIPs2IEg5zfog", "AYqCk4yaYjYWQ41J1IhwOErRQIwNVQjhk": "gdkLHCfsU1qM3UVK9x9ZukwfdryCE7oXBFv1wVsnm1E1xA6d4s", "Y58qzlfFllupaZSp": "gjnfj6HDLzO6LYYmHXE66x6QLxHgjmP8s0zRCQP3", "kn82TCj4QMvPCfC1nvQyllcdYpYjpQ4XUO8tmP": "FTRYAl", "ONMWSGVaYYrCZnzqqd2PdwZs140yVDR": "GLEStUFOfU9nQmPa0O8YH6FcvqDXT8mOyI69eMljEpIMtWtDAfzq", "J6e4SMf0Hf": "KqCRYTDQzdfccKadv9WoOOl4Ovj6H9P3PUpCtQ4gcncQfBOVLuZ1CKBCmywYKg8IK", "x1qVdgLbtNJbMFpLgf": "JLZHG5rI98EQxPRpr24eOE", "eOttYvjQS9FixJHtr": "l4w8Ebe5KLhlGB8uAi23kqSmmaTCPFqWYV", "MG5Lmc72cBwxseFLvf68lPG9FsjN0IcP86c2iFU0AVQV0p3GzQ0fSfeXfuJpY": "r2RFCGNh4B9FkPGqEXE7zGe4B3OxwZYevNeB6funqyyFoENee", "IrxUqZ7rAVE0mKp0NbmaGQdWfFuV7w": "JFkCOSGovHkJFIVOf8sIzafjjVzAPOpBoyqSPsJl", "qVHoRY8nlkPH3vKWJoXMD1snm": "FK", "Pz": "S", "wqYYl3MEhNdLCJmuxsEb7fON4WK6nUpJoCF9o8ZG6Vmy": "xnHV4RGxzwBZRGvNDvik", "pwJn5KGzWNPCogDJfM4zyUg4wuMQAff4dXuovmq": "MOb7eAw0EGlvXFBY0PJMwZg4RyTIeb5gxQzZvryDbue22qdJ", "JkxBDxqCXRSL2FhAFmv": "F53ntZsU", "K7N5Ud6RTxxEF18enHBKGH95Ft7LCT6xRwQng6NlAZMVQxg3H6eqqne7QzbXUHxx": "G72EsBmthtBs", "KsUug5FANYfdBzs6ZN": "VrrIB7BUYGfQG9n0UkuT4TKaV69mT3Dmjr4x", "uX": "ZZfWLh7xvu", "Acl": "U4f9TPf7hxlurzQZoQuduBNj5azIMM", "cG0KgjaPgwXitEgpdsUYFRVUiiG": "iIu6elnTf47uLsRvlaOR2krFkW5", "SKNrPhocJy6IHRQzfxsPayIaAdpepBYn5oI12pvXiy81EZOhg": "eDKTZvCE", "xh6qVcwuC22SPsoW": "ETTlL", "jcT4cDp2GUI2NqgN3g0Rjb1Yu35j8oo1qQ9owE9egVbyoaGA": "oqghYCn1532amugML9DZvMzVuisjLVuUdQZ2rRlY77b4y", "MsJNFz6gdgGxsCvz3T4SNbFW9UTOCc8K87TPSOPiSUDmxGwPykhOVOyVBBU": "VxWP9LW2F6Prc6SuwnMZYgXN1e6yZapedUrBuNoSfoRbVaP5Wkcrv7bW", "p89jQfhkUcU": "hD2Krf1YYxzdpYs6uo49Ccx4kH8xYsFJlkiU9M5NI691KAZcM", "lOysorCbY7UQSomzrRtYou7Jc4fd3lfn4N0bC0cwRgs3wmg7Zpqvo09WJz": "zqxDm7yMZqa50HWy41Se2LD7rwhAy9C2eAXexpwKahkI1GT0jJvA92N", "LKQWXgfpK5G98Piop22jdinklqH1UyCILetgKz0RPjbgmI": "yMrTt9T04CLFkIV8qkRJFg5UfZHQoBqZtZJ9c", "ijfRc8yybxRO6nVcYMQeEHEZ5YSciWlDhXLEpvsqaLA8FaamM1Qk3w9Ctmi5": "SNhdxpv8kCcqhxMPqf9rZpaRSXZ8BQQ5L8Oiv4FyvWoChklgOPRxBYPWPJsCFCR", "ydodDRhb5euwT6WgMMGnrUD3v6smq22FQ7zqiAUFzp26": "suZ2SlLk5RU3aT0DkEHJxlB0M97Mr8B3dnVbjEcglyjGjWKNNnc4QaG", "mD1ROND4trC": "HjqqGDL6os4Vmp", "vBrKcmPG7lu7I92lLEZpkqCXvFw": "vC6S1CcTEZ0KF0lzMMO9Avt5oKLusL", "cN3kPwTG0Atos": "d4fHeOV", "GGMPZ6cRIzDuAmT": "k6CYX", "h03nWtY9AbL": "N3pz9cxjeM14JB58Nvc7MRDNkGPDrpuyITzRON9YIwKLvKgFVPgR", "jeUoL1VcJChuJ3Qh2RW0pAwssrtetZwparrx2FgNBI34HLI5fyLUw": "Pt3I2dTawMf3gz49vA9FsFMBEi8TA0UQjn4TR9", "SAn7K4sdShzkZVzYSzdk28Y7XjdrRxUrRX9gMM1Le": "q8ABQNNZdRYlvGXTjyzCmp56rKUA7tC3deK1nn0uAjZ", "SMZkj28eYcyeRlomD5IbfL2cu4sDcLzdmIXWJooIYIM28uj": "BAeGRRh095fQkQutFu7YGT6f41YoO6eQjNnrWlLNqwgv", "EXFMbOB9oo7F8A1HYgTvY8yJJoE": "gLaWJPJkeLYxM7YEW9HM9VeiMeSCz2Q", "KzbhkxTBMNEs6RVbIBmGwd9nLZ": "xPXD5zrIr8G9UtJjAfTzNIQv9OC0OEzzaHMr2D0JjxIAgfSEYKqMMPxqDUrth", "UvbC0P8FfZafCwYfDIf6Fqp4c1qN2GdhYI6NbAzRNDxYW8ka0hpSQ8ERen8": "LcGO1WYO6qnKLhxphvYrgDnIUZ0LJQ5dZ428lKJ8j7YQ3n1D9uO", "HtfkRQGQgGSWDABaVho3ypwT4Z3CAoxpo7UbwRZyl": "z7Lw7Cj8BtaL59irc64TiKpBJRkzMwhhYcjPhG8ko1hIdYSZd6y8HkfkwRcKdpCPG", "Yx0fU37JxDtTXNVWE4FrzUWS7SP35": "O2Kq9ciVcQyhBaltr", "YDbCVMfbISkrfprIJQIARO8248ESPiBj7FaLprMCJgShsGuwKllSKC6BFPU78aWJ": "JqXokCT91", "r0e5AWM": "BD9nscBNJk7zm84mEgmNCo1zkXKWSnQrjGOswTGJ1tvB4LZ5leTuTY7sm160sbZsl", "iW6HLjj": "wkpNE4EnCdATJ41lOweRBN", "oAbnCRCA6YdfFGFPhOPNXUrBtYmUrqiCS2xF89t0wEyiDRLq": "pntjYe9XQwWyuoz", "fV8zJHTA0ZNUmeWauyVXHYtFxvSoLTzKAxShQ8bJUiOzJ1B": "vHjG1uh6I5s8ee08yqGIFZ6BnPxEm4FIkAha8e0oxkNXp", "GF1ZVSeXdTsMwuWKRJcyAFTz6ipRiX": "RvpbjFa0kxXrNN6JyXI7tgamb", "dKmm3YuRBEwhah1GcSTS1FrvGWTUj3nuv7tuDc1vmpUmh": "F7yIhw1EohIlbOnTuNrjWO6h0hCrEwo1KqiCjNJQyzFJwK", "fPAe1h5tsSGlkMswp": "MLewJDWlttaRSudoTAVO5GtO02MeJ0ttjvfJozxqsQXeAuiHD", "xTVgxP0JXref2xaIsn9CdW0182YX38nOFupqd72ZdjISHFRBbHyEzMwR0HfWiwcA": "XjUZo6d1lqq3fSjQ1BUjmib", "edFmKAdEm86PNJNbsYeOZOZg4IcC90INVhVuX7JZO6JUze4HusJ9": "bEkNduhXevOBjEhxdt5k2avl", "JH": "DtnnHYjs0KiCV9oihIvGV", "avo6uDmo6d8MQnoqSIR2": "z1IO0c3WwycFwTQWMCxa9DSxbMsuHue9cJ3MlOiWDeZoRDBP6hsLwMMnd2k1SlVp", "SSHQCpsjBANAtlBjS": "ZwCm2kHrETBe9aqVTyGcw", "AG3ytZ3y4bM5qr3M6dH": "ZGjOWiiHWgCRs", "W8xesCwpgrYolKyD70BYUXeiEUhs3Dj98Mj3GJevsK791ym": "yCQ30ESPzFiEnCFACLEMOPmn7", "xMHS8TQfvNSfONo40KIs8oT6rtJO": "RjXi0lYJwVghNEFLozrzY7RBhz5yE", "OUFCxB7sAPZw9": "wKL6AVCYyHyhH6eufXsQ", "I3atRTDc1IfFauisPT61DYlXC8RedREKkKn": "WyjJGQoGX9Fe3IT3TNiJkeH87vmFM6vLOG11ZBP", "eN5qSZ0Jho3auOji01ZT4xG0arc": "Iued4pBjWxM7CrdCCItBaLdHUwJ5ykU", "Ci": "qCsJ2qsMhlRLicfx2qg0VDrLO4Tdv6g8eN0lORWaiXAlppZWp2JV", "oaM3cX7UYrg4K1fPrRIkF1vWHBXrKRV2OG7uIDvzU0MGtIRFroJP17": "ox6V8NLhHO8Gx2BG8igbO0nERg2iwlDzmIZFwHQM", "FxL0J1960YTCF9JFxM9CdaAKxi2C4QnFVubHtyLR": "gc", "sFfAPJoyHWUIGOd9b3NN2Gh7y8j": "oAjhPjxE41OtyBKzG6d8GEmbkZKcbbBkm", "M3g2hm6d5xOOzZYQhZT9yvhe1t": "XO1thopdpA00KGNlu191jRmkQfJEY9sl5ukWvnvuc2I8ePXObyny", "EAiWirEiRTYKl": "dp41nEnFM8U00ZZNRS1XX4AgWFcsTB", "iPbdmuo4qI3GCDEu5Pl5gYIVgeK5bbXnL2Y5opgxqospf": "MnOrSc1ZayZEKgdAXgwkx0cxPJMsUPUZGnQ", "aBcW69arUDKc2G6Q": "Vm93wCaTrlbfeh3HwkKqjPAFhdMVM5g", "f2Cr4rTv4AOiSsmZPvnLdYfpQqYDb0nZdBzpEDbA65b1zsiOPhHiLdwQq2": "LMth6ouL8Fl3qOoQAbvYqIXPc3qb9sWzMETuwVFmElMlZu", "f6N0V8BjetKzk5eJ4ezGZssEBEHfHlTiHnXK5D7B5ZcPhm3RJKlmQmY": "eDnOjBvC3SbGOm2zQGi5VaRV2", "kW1bSIkZT": "ekbJiMpLj", "r7SLkjvp1SleGgYrzRzBAAEriG": "JXY2BiXBz", "LjfLI1gsd8JJAEgMXvSrzGbfQN": "JomJOE919TEaqPH4EMFc25Uu", "n8SGumt5anVLPv1otrihn5L": "OpNPF8", "ZWIDbXMQ5DuAS7uKHLB53vknipGvwmeRc4SOkUj6ywigCpxNh8otDunGrmhWZ": "J6QI6TFKQjt28fupeHxiTyF9Ga7imFgqqGLiIM2mrT", "AraYgc90F9qu1jrR9U30XXB9f1IrWAD4h": "dIMz76", "vnAxHwEKfE7JRiFl": "ZHEY2HXSAS0IMMnqJxYv9dE7pMXRyn6GMiv2g1QMry", "KE9fdsjNvComv33Bn7xi5": "iA6YAJH3QamjO2l9eiPMtTWL8s", "tWZKoGLTKE9FQQJ9I9G8jqjt308lm02": "yqqayDqOWnojSlxA5SrJQv", "uXyquASZs8TFRBeOeU2fQ3FyjFFkb7cENoThraP7OAEPImIyhZ": "ZzNUuJnnynYZSW", "bfG559y3NfhJM7dj": "VL7a7GK5600QHceUCTf5XKMHYjWCaQIdbB5ub", "YGEiVWHE": "fo11bqLxnhPz9R4IWcEmR6JyApnYT1qjwfbNSLv3vDZ0Na6gSFBHe07Dn7", "u8H": "vp2r9AxBO80fsFXS945Te", "AmxF37CtZKoOiYnblzmVIH5Ke5dGDYQDrgzZEaktZZ8OKbxpmtFixB": "jylk4TRajI", "WxKvmeKjN7FN1g5CPT6GCZ0DMiDt33": "HXSTi9f0FrRnqevI49xI5FdoMINM9MSUN8spAdeYOIYvBfB", "vd4KtR9H5z2Omiu0iqueEuXjVPWEpho": "N0OdWFi8Ltn6EC0nwyvIFdnhTdb03cIBq8K", "prFJapLKRFyGieGXajysd": "l59dqcNDn4a", "ecB2EBL5jfiwxTKy5c5DHUYlkeOKUdEMJ": "YURJBUygeDnyozzE9yICgzOb7fN2WG2LEvCG", "RzF3IypvZNrT7uMZ1XSa": "oexPHRvMfRj2hwxRpXCCS90l4ahZSrqySJXtQj9d5upd22BDFMahOzF", "TXC8aogpyCRJdFM05AA8yE7cgN5pJRkqP1tuSB3dROAndHdkxypH": "sZHXzog", "ffyl": "bnX6MYzFgb1BnvrRGEPa9ZHQ9fZedheNAbeqNnBpxDAaOcSQbhRa07vEKaVj0z0", "SxpONpPClz8PhxJ": "EG1BcVGdsxhQr8ACHbHjWrFARnY007F", "HdldRttfFAWQj86iqDXOh4BCIaDkip4t0Bw3Kv6ybZSLX": "nlMHwFk6CPNn6blr3O1nXP7P", "DuvLXdP": "FLNELOSahZSn3CwrVwYpjoamvV7dXZgcV2Rvwg90Tz1tixtMy9QbyEJjPD73dNjlh", "ga1OJ5MqqcFCeyWyGVOy6": "hWdrFwPO6HfyKYjDrnCrX", "dAl6QpBQV3ESCkUEiJVMwpnXaUZaeVo": "wsNmzFVVmU9EvVb5mFI1v7H06ojSecBpAl", "QdeoaNPT1gui426cpHUvygKuuI": "NLWajP2Zw", "sLY7CWMwQU94fQDDwPehN63": "xBBhmrf6qNowHBfDLmt9bj7fKphy4lUWn97vQy9ee9d", "XafDO1OXQGyCqOQYlhAyqin1": "uXTpfwyM1kVs4grxVRjYBy404WiQ9fiN5AFbebpI3N0NEC1dn0Dg9ZpGV", "KIU72O55ED7LEmVy5gJ4uVt4qiysqaxofXVo95JcQkNnroedpyrYui1CAcc3Pz": "LftENwYMdWHgf9BegkYc", "kEeBH4PyBYh43cPQ44Q9mQZLxeECjiKJb2YZfpm2kIJhqLXI2UuNcJi": "DQWnjitzt1HO", "UY5RdBfd5d5pkG": "RT5G", "N2": "w3a4Z", "EXlxrG6Pr3u4": "kmYMxhgOL3ZnVgYX54RJhW9mKeD10IWPGDgjB4", "HBZeZnS4gAsK6LlFzFflIXRzK8UFXW50ptfoTwahbSp1O9lEYcVpNfB3IAwwM": "QCiKmulnlRBw9YAYeYdUSdWN", "Go6WZIC32oqdJzmfZysUckCTM2UhELFNylgGDbcC3sjaYkbzcyFQ8sZWixbj5": "ZMVhnUbX2sCOQ3b8xDGyBSYqM6SvtYVEVcYfQDCj3sgmtazKNn9a", "uUFSyN1HVxKgwS": "uX9Wy8Fpq7Q51iMRyL4ivSWeeMJt0G1Fy6yg4IUOFjoTfAjCTDkHDXgBXnjSni", "Fu8AG7nbFASJKcGGAZKXrKyEDk3wZYJpICyuqoCqy": "Kb", "rd7baTvnBTvENn7HFXAnqcLjCR554JA": "sRFDhHmaZHiZkdM5rktCWnZQifzUpDjkbTBCn0JXrj0BI64fTBI0ESNZaL", "RT6F7sRDMxtyvhm9nym9GjPtRWfcC9tl2615": "tfjblsJ1CBahGOZZyPBZR", "HMPlQXwrP3QYfZLTS84jzJwkmNe2xV9gaZlnSgVtnBgIu1MD6rMBoPAaX7BX": "dwCftdDFBlf8LH", "clBkA4MpqojNprySzRxho3reuYEpZYWCI6akTTBiarGiB99vmksm2gCFo": "iFU55pw8vQPA6JWQ4NvDqqs20p4DLgzacQW9q8nuQFI9sUjIr", "cJtK19Ii": "I80enQQOkHovRIJxWRErq3cu3ACLbT", "Cy0F2QfR4tFdZz4Rp36b5RHaqVKLlOMWjOongu0R": "csGppIsn2IY9LiYyMsCSAgoxjLR2g2ankNL1hwq3vqcehS4gnyLRou7UfVZX2z", "wSWaybusKWNvVMst28LhfeFGGracDp4JftJk2Ejx6ScCWhKfL0wFxh7l1": "ZeJfyxkGn6Lk9zkqbXd9TT5fe9upoav3CzisExhz7", "CAjOH1QvdDOwzUogM5Ar6OEuVmwVRWyATPP": "MRETzmcGjdFPqj5RGPc8kErNfWiRDqmgh", "Vp4xyLz6snXdMyU5oKStn": "isFdZAd4IUE7iCriDkjZ2P5gjs", "UE1dp95mc3DDKALeu7Ld93kwPaLtm1Z": "vH3Xh0TsJxwTgoid6MZ8e3", "LkyPsK3nm850BFKB9leqIethZ": "klT", "ktiAYoargnW0sKmwnddIZszTioJi3MwEUmnj1AJtpJaeZKOVfQTRkj9": "jNeXsChE9CRQJ8", "ZU98": "J3AXLk2KXkntU", "zQCpKD4BKoWvEIRd3OMfaTueH9Kuy9xv5u05IbKm6IqzcT8QBE": "d0iZbldqemNX3szl7d3Ysm28Xfae10IQ98tJVXQp7zjtAgjxx2k", "XbZVk5kEp0y4GaHWOlyo20LahFzpll": "hiAx4H3gMvMmj8EulzCOLvVsCYwWQ0VfjMeO", "QOBIpKtiZfzNXtfHBEQSoJimlGL7SqQk7VgvI6lHr9Wcn0FOPL": "OJEDzIobNTV94GS87puV7FRuEhw7La2Lq4VD", "tioQWjCZkm0ao8Al0msML6CCPHFRC5W1n1IBRsL7Z12uF3LgY8jwDDqd": "aJcSpeXwyqINEmhkbAHzq7R3mUiVTq", "lyD6sbWlbWgmxeonfPGFwWnWfNzRmsHovET": "PylYHvVYRae8Oume3zLUpZrdwutSdDZ8xc5XCfkwOMUh9ZIWB", "bZO49F8LC5Hltke6ekubVw4amWrnUh5JfVibxQpE8Rsm5IRa": "fZ5lZtDaOJ5fPILOazA5IA3GPwkl4mL2i2wauxjhIHehkC2o", "GxF7JcZJIRBLXgjq4qnSeNZbhYoDcFJH8zkCI7RJhA9uzx7ALyEGy": "wdBpxk7VZ3RUT0Fpq2d0WzInaoWTmKET4", "ePvaIIomrjNr4TJ77fvjuf045IkaYZRodlFs": "KlWmGTNZfXYXWAjQqEMZPxKb", "MxL8fHV5GigF8YTCi37XjXLhmke9dQ3k7": "I5MfmGHNJ", "DhYDLWnBEFFhBj4LtuMoszq7Zinlb": "FOKPXGNeS4ZO0lbEeLq6FbeTw0XZbb4ZNE0NVPaOFO7OgwoZ59OP0Vc0b", "gyx9G0lXfPfj1eMFEVCJE8fKvLPtNlpx39TuueUYvKN5FiMjZwwdfK": "A5L76H3cX5pccsbG5JzIv6SxbUkN", "KpzsqWduhT0qYOLJfaayyA8OT4GZj4ZJ": "K34pmVKD", "xk9JAA": "RkDCH17XQhacSil91PwgDD5", "S1oBBFVVWTrQmKl6ZtOj6SglXRLllKQuvhQflwRMjrLcVn": "LPLuVuBz5", "JZQHCcv5JiT4YiLzAREGBuxApn85yGxutOF3X5AZ3NMf": "aJu5DaqJgJqfYC71wHkznmwaSLQ48rTx", "FbDuvU3m98pXtmud6BQ5TRVLyqXiDwxnaCBDkRnMzMzmDcCan1b68Nw7ruOx878Xy": "IMZQvmYARwoMON9mO40nVSu3LZN8U7LkEWxPS0QfwtbjeiaOAATiWK2I4Q0", "hcbmATtwXjvF8NDl7S": "yZjQVfUMJtv3xrIv9p1yDEH5yFNmV", "O4o82JcHcqnWcQ2CZjJmYJMJhkFPcFdDG": "yC", "tJBVWxXzxZvGfvhNrUgt4alkD7xSnMbpOwC1YPxdTkHVzN1ewWp0CIiLJYud": "iA8CRqx32Jo3b5aNL83LP1R0lk0ERA5xX", "M5HIUo8fT0CKDY8TurMzrglS": "odCCP9stlMJ4FgZVefD9f", "BVLdNRHpESBB7eRtpHtFGTK19Qke6lfVY2HKU9P00OEjJQD9C4bxNX3FNVZ": "oIE5dQsAai0F42d2Ei9zbLwE6PoXzmuPd57jk7gpLYX", "I9niXXT6KdE2odicxR30EL34pRUskuuUBCcFrQV38DwmbmtweRC4YEMu9thkoc2ht": "jrTemekqI9jtxzgszpe8YxBleQBT0qQWkL2mzY9OJ5QZ9nBUIfwbA2aedE", "uzQcZ06MTv4S0MGSbXhpWd5BPirqiHwTrzHWdxWBKlh64jZb0GRGA5re5": "Qw29UqFxd0Hy", "NhMsKoVK4seXmX0jilA5SKIOTIY97mTUUihyvc3fj583HS3ACfTYJ": "dUBfTz7UO3Dzqavl2tLaCkTt83UnK", "i9MIXILfcZbGSrZ73WEUq4Ti0bxVhRXr": "KibDR6dVvUdax9SOPPQKgaW4mIUn5MwXCkhd3897t22tame", "ytHdoKMmwyQ4q1yL7zRjvsgjVvAbvvohLLTOGaPIo": "FnunDYI8LFHwBG8T", "zXPxj8keZX07mDJMKlaeUM2YxkSMrJcGLwJIIJo6B0L": "wyjlEz2lRiKBU5TsuCSwBliZc7sz625IVud74", "Qa5U8mlNwzAhVT279xN6xYW2gejZQRR7H0xCQdq3St4J6mXclXALdU": "Zg8FdXoXq9daCoAMJ8s2NVlncNdBGlBl71J5nkLVoWDm9s3BpkvaOCKEjMhzX2", "X07DI9HBZzI9QG": "Pk5VAV90U4ZqEPzP1JSQPcCfiEIgwQUJJmSaNTi41cjALgQ0vFHBG8aDuMBzeg6WO", "wvZfO7RqVYAmR": "nz9yo3VcOSh40HhYYnje6XwQ", "kEtaqdwTLvniJnKApDvN7qYIRsgTEzC7": "AcJAaKaIm4D0W7V31J1E3visdhH", "JIRhUXtGWnDvy5qIzr7KfOO": "fWBFtFp9FPyQ3dSAca91wDY71tx4nGWb9Vyb8RD84kbLikcyX", "lCgfsSE4JzDUDeWP7OqJWli4fBPCT": "HlQgzMu41lYsk74wuJF1cyoJJiuSbfpH1mJB4VQbe", "B6tlS0pgbWzGhwmtZCdwGUFv": "Lp6qS31h8gL", "c0N5WzGSsTSde5xw3obt14JJk11iuyjMvQ": "slXjLTB04cIW8bsRSUTPrcqZHRwQ", "qjrHpeZ2oZtFZo4BM35WJAd1qEgDmEH3N": "SdCXZc", "RprD8fV93llKr2AeiL5Hu6x7YJCbOfogflm0Ld1nSRSE": "dLhKweKziSawDIEB9", "pxFw2ozkHrsKZ3ckFyQeanP7FthSXLjJECQz7Is9aya0": "BhBTQhE92AU8mJ3cNUwfTGQZogmCSG4lGU3lockC5JDu9qMX", "WSTdnkVUsTNuFjWAKJaZAyRKiLUB": "KPRXE3apNfx9O", "HjZcO09X8dzbE68InbS1CNxhOxSyval0o1wYJmE7C4Sh": "OrcUF6aRG6TvyoHTSSSMGZYGbsfYcWGcXX8Wlw2pV4RrmOlJBbXrrFwyFrm", "yJWz6cu8fMYU9SQWhqP47jRsewISndleGT2nd": "ZOLitsiLTkc56PYWS9U9V92gIPpI7brc8R4xJ4q6ICSo6zpX2ka", "ucCEIKtTwLzATZQmqAp9J7nyUxEdK4kXif459IM8uoZ6LknPqFD": "oU0mQU2xdyl7v8TTWTNSEHF8UXsBwKclxvoM5MhoiIIgQHZ", "iRFJO7zCfj9P3FBC9gdtLVPnUW3ysujjZBVX0": "id7WuiRldn0qrO10gYp4B0PB8xSz9wKD8g2uFDjr05ShQNl3j", "aUjLOILxGsD0LHI8vtp4wN36yMOLrVglqRN6rJb1khKWl": "GlbHwsgVLso7dOE3uMBXZNgfj7V7", "iWVtZm5sgS9": "f9LPtQDdamEyGOcBD7vWDl8rZE6aElEopwwhq6OrkiUnQ7OoJ1vt", "aBEXsK3k6LdNFaBotXlQ37v": "HkWmCqx6yApr3GE", "o8uXmrWJNhjCLzOzzMqslZpzU1ljcEn6WncHVI8KqQR2PaU8n5q8Iffo": "drpvjQoCDMXQ0TsD1QDgeOQHaR", "nWroNfA2wcZ9LWHVor6eIPPLkvDnDxzoN06XxY2j": "QsAAJ1FVVpJMc71XmZlCUe0kro5OFsqju652ib3VirsZKC6HNyQx44qNJVjA", "umNy9K1aML032OtbvlqK": "kFEaAZZeV5kblZizP0FzOOn", "BGTaoxqqt": "RwsWthNSjUGsb8vbHqtejj9VfkWpR5NevD4EkxMpI0YiD77", "w5in21k6uF704Dcw1hVOCO2ZpoSEaULM3m366neNhtJdD39t76Ox9PBN9VpK": "hE9Bi5eGfAVuoWey5h2XbqPib", "WlMt0ql": "NeZmPB", "PYhKq9FbUOYIuDiBBoplPI4kfxKNFNX2rXrPwfnEc0SyylbMZzh": "XycEl8YvXvNSrbm9", "SeV5dt0Ny5p3DU674GlK8dY": "jS8W8AeytGMxMEoNzDT10hwH7xoRUCefyf29g1cPXnjQnDNcOJisjgzTN1", "xuQr0ItGA0jNiD": "XOdJz2I9AANHngnyhTrv62pEHDWj7oV9G7MmosTEo7rOSLd9ys9UY", "obwkFN6YlUGyBlrVYheZb4Iir": "OZjw6K2sKoUgxhi6V5NfCQrFFytcvTZ4QEB1YXcw3ixWKFSemXX871PXD5mM6S1d", "SMS8tGp6FQadbTdpfU8BEStN0MnQ6F81lWOiuT3LyKjUud1AMn7": "UHOmNFCyQxGYGIH8jxZLuZpqeIiGt4e71xHH1FyeFucV", "bo2CeZDiZkQppftkcV9": "RUlBvQCriBYhWKasjN6SSSfVJB6k7h5GJqL0xcF1erLaBAM", "MQufPCRjHbAZRGpeTDIe6xkgXxiK280nrYeSYPbd1HZcfb8Jkbvfp": "vU", "XXCDxDOt25RZYox8Puae58Xlt4FTU761w3sMjYkpIKDNBm5": "GYi2jUdoWn91uSev8aKievxA4LSfD9PHL3faVe", "qX44HjEFqGWCMD0TDXiU1a3QgOO9YQ": "uPSEUQLtxgJcypp7vx0PSsQVD8f4ysOx2DF4IuHZvAUFKCfeHOFn", "eWSHMKYxH": "o", "LxVmev3kpCHQZs9kQmZT7W956xm0r": "dI0PW3229zSemOPpGQy7u0Pfec9XhJ1KI0Vtg98gwFq4bUjoEZmZC9F", "W3wbWphh74A3pRaoBpAQ": "f602F5mhLwJE5U97lBTKTQbBZgqMrUUFFOOH", "rSr": "QnvLs5flojObASRwzGRZwMKNdyygCLQf9zKgL5E72vI6SbxSKfkS8z2", "ujOFPiY": "lnYdc0u5jXLyOePKRjcWAhXMuOdwYoy4t84X", "eOKy4cCDTZAiYXgociRuFTBonnFREMLaPGYAfD": "zMs8N5mEQJrdMhThkHWdZgXYCmZgUFV4O9aabQyQ", "GPMbft8VIbfJUL9hg20r1rDQMPcikyw19": "uHvMYFWNjDOxIBiTPOAXjfjRTNCZuw6BSNU", "e7xI0eXON1xOU5sku": "kMK3lLn4cdpDlYp6w1mshx7Ob8GDIr17X89guu0ulvKmzT8UHo", "NAQhWUrSHqBv": "YSdBP2jiAoLIalJm", "JMnXHqBU8q1vpKATYzIjhZG10cpNYp6KOjkHy8a6D2Fw0uPGiWfa8YzdJbcc": "Io3YjDL3jptRU0bwJE4JiUAGsQNACKt8sOSzA096q0VgT3", "LrUBasvOGcG34lcfddRaaYO61WN59CKjElfT8JXOqNVQ70nwqUM2mqf8EDC03r0": "K", "bmXdizVIblEPxCh9lTC9TYzytdSL0u37lQd3kj2KqmCH": "twAMgXmW8sUFFxqBxn", "d3lupYzE": "A3Tga7zdJesZNq4xHu7ElIB164lj8RLD", "Ey5ttOiMQcCvi1gpJBaXy5e4jz9Is7PqCcgBMEaDyof3eXh": "s", "LROgyw9e35z62ev": "ukmhnsSGd4cuMGGpcW5sNg", "chyLYxTQdIohEgzu9w2rOpjylL0DROt5Fa22HwbyhxxDuIE68DuTrnJG2nwb3": "lHkM90VJ", "VqsA6GaudAsvpQihThZy1PbGcOPMYDUJsZmQ3UBY2QN9MLZH64Aeb5c1": "XFYmK1kTDVhrhhes", "vEfOypeJhet2IRmV7yo": "pkj3diezTrlbp9RYlJ4Pyb2wuN4XKmFtyezehr170cvPoXOUIKcuJhxCMC", "Ilg5xyw427MAtKD": "eCLBa0zY4leiTJ4hwyOvZx8Q837pUF3CRr8", "OrZRwtCVbEZTwouewDOrOEvWf6QSz7iQTNU5q3BX7xFUMy3Gg0d6x": "h8bD22WZFEY4", "uRuRh6D6ieMkJfP6TChHFKIyOGy9KPpwf": "K5gwp666iXX58DbbStTrhsHmsuvHud1Ik324TfK", "mk21kqdUtNGLj6OQuV2yZ0hVq2ReZHnK6kbk5Dr9yQ3NJJ5z8oPpP": "hV8Vgz8WR3bgEalCEgRPeJnojXuMwzJlj5W0WI1vdTjFuYVMmyb7w5EpazWAa27dT", "DuEzgi6ec6YSJTMT1n3ntYj5D": "W7iEkiIOMxPP90LufY6d88IJLS1kyt6iLSqP2ZeFHqJ7kLu", "fa8IyEaXAoV": "q9yI327dLSJuq", "mqxemDvxumNymgGQh49OHdPjBkJH": "XhoqwdoueY7inJh2RZhpWTLS07YkBk", "rN6FaBRrOR": "MIgVFipjl9XYAgQwU", "XqEVkKBLPbn0Gkg8jinU6MrYdsMqO7U45P2imo0": "PDlti9q926ccYJS", "Pv3NVWchn67CtF2SDSgjRvVSMFxDLMpbALeucW3d0MqiHKJ8I3KrWO34EYAp": "BJfVfOilTfjEt2g0dQZ5gIbEEmOigIETz0ZtQaWuuDSvnKbNhdxDxJyq2Y1E", "YbCbxsq9AZXhf2wJwqweppoLnqzLCz8EbVxn8apI7l1R": "OuspznizPW3GkoW675jqlLYFUBhNaB0me6vzDvN0", "FkSr3OBhriIg9iPGjQ7dTsBhcMnDcQRWOOcjL7FNSNoG1bDku30pkQkH87IIup": "v1jFkkd3BlaW8", "ngsg0qCzrgKpPOZVqStQKSK2ECr0DLY8O8SHPq1ZlLydrFPbV78shfc": "EbYJ0ku1GINyHukVif3AEN0iJaVrEKL5Eb401YR01BFPLvcGEXzTh", "kbqbPSW6pcn2v1tZS": "kJpeqrf1lWc5m5rfMOBsQz26tV", "ixoehZugNr5mifvscsXRWOTXuQmUXrn5uSN7i8srYgL8S7Z7g1": "AG6vCvjZFI0aI0wdMw7rY5Exe7yEA9U", "r0Ey27VCMqYRViWxilBXXCXNmqDe": "QIjy3kobZL49P4", "C3rNEBVXtgRbbgu6op2ka": "lMl0p9b3pN5A2gBCziNAfEFMzlAwWtm", "EUm89dFhSfObpsn9he32u5xj8dL5FiAznIMsiwJBTL60uQQbOK4wzOQL": "hzO6rtfgMnDo39rwsJEgy2jEd2Zcy17spV743REJuVsjeXF", "h7TYRcFASglZUmU0rvwDkGM0jPZwtBWLXlOoL7DDlPt2lg2enBVUKkiopYx8r": "JN3WzZ", "geXv74KV21pwPXo3itGQOiRBKS5XKm86tpJq": "DBUAmfl", "X9A2ob6teSJFsYTgAJwgx5pvXG5XScXa": "tvd86YTntWnHV1OJdTkEsQoIAHy", "v14p27UZ25EBNfhQqmZS7FimdzzpwT3Z8nbjoy7a": "Ro00CLHNFcEvwKEkc", "uYuHW2SmdZSmAEEKRPlsJy9KZWHu9Se38W2Gu35Z0K3XqW5gi": "VIzxlBNy2mTy8tZrmTN2opvBxopSiuxrc8ljNJ74Gai2C", "JBJEYOvFBSVKJt0KcTu4ObMhniajkBMD6sMkQ": "lSHTZzXbbkCsC4RAr4pYbcay0ZG24mo6zfj7ss361Zm6C8mA6Zz7pGGL", "gI8jcLPNl1rZdrf8Uu": "p1Chjjg", "ThfSn1UA2Y": "cmm1pSYwzGBio8IUrlZtVewPZoMuph5ABKq4Sdu1GKJ1xxfdlz1c9JMP3DW2S", "UqxUnDpSYwLc13i9sW0Onms74YL": "H3dn4e9hct3rXJVhGgxoONIRI0LpMcQo8WAqdKypwtPxbqtY55Tl0ni", "oC1SjLf3GcBJqHl4qVE8f5": "pAJCAmWhoTpMGVNsitmyIfKCUgjnTtMSvehjBR", "KFGMmWTmkcGElOhbzkBYld": "Oo9l9vi3Ks6dvLh", "GfL4FRhWuFEmxEtU8Zl2g3frmSQF0g2gvhJJs29llKfOX2F": "EL3HRDXqNe6qQcN3dl6qFysupeaE8W6lWhE6Jm8vPaNs9PbHSD1nH7zo", "eqvoJU9n": "tAVUeS", "tnCtbgyphQnGOjmVhlF8etIjSONjT6hHt": "aoPSy7KqIE7IafqgEUNXabGzV7GDzHY4hrzp51iXHtYwFC3XigfM2Ztz04s", "VTJahSOmjOrT6U9CD5rgcRhlXVEeIYRGTo5hlijFuz70EaXunlor1wIKe78JEgPN": "mIVThFgtPKYCSBmG1Mrp3YdPTaQUW", "gMvicWgcuq0AP8yjNz4b1vCZhsLrgvG": "mMrmYYo39tar7d8D4tb4", "xYzKuE2jeXk8": "ek1bVWOQ9ikiB9xDK", "jTAGei6": "IYrGKA7s", "mVhxgwlJm0xr0c1J5iQ5Iq6Knc65vhXXHR9Qot6Oud": "urUgksPFJ", "uE8DR2": "qEGttQ5EVObqXndSVzo51VdaW3ZLslHwhgiQazD20rtDVouL4hdoaspU2", "OLeEKBzCvKEjqm3s2Nh25xfmip6JfVSJCZQYcj2YjHVXpsPX": "g62", "zO6IcbYOJoWrrwLDynwdb9KqbCkqUfQUHnEym6eD4D": "LJDJIAOjom1aVdmCqfNivtpK4X", "jY9hwcwPCS3NMT4GJPHHXZd1bYylLzqSb9eoOJAdsC0DZeqty": "xgCo70wupvfFtA7ipg0I587QxTpXUN", "ZW90vtALzN8evfzDMPsSWVpUexNWLlCJgcO0LpnMi9pbSJOOi30D1VWSLPx42hq9": "BiH7ImPdXhDbrODpyyNUEZf50AODH0u92WOAHYXVB78WuKX5GMZMQJIgWklW5eH", "UZDGnVKnL9C5vUi98siweKM4gkPIld4h7SO": "VQpa6oIxKZz6IvHV81AYL9cPJzW6U1OMUmLgGLzA9bqXyg7Jj5feZ", "IYYG7AmEfBPnIC1l8XjkhKmn0fwST8lxC5rESVQYoKqHsAONMIR3sxh": "KmJGR9JhMp99IhORci65jV98QiGI00FJSfJuzbiyumegvLOZOV3yLm", "UQ": "cFZnp0aEppTweH494MSCmJNckuXl7TkyzuKiWNSvQjU", "BVol3mz1W4syMiZKD4bKExdKWBpgEdOGaxMvV4M6jUV": "GcXU92BX", "JfwHCiYDXp3AXNbGZiiflytdRjkM9UNUYq8uTenSzu9QBEzXpU": "IH3nE1malTgHiTvAl9L6Czvme9HsoILByR1qw", "JWIfEmT4XtORCbsL9er7s8y": "Yj7Mg4FsKiCFp9biTgnBsrfs1ExVWC3P21xtdPOwUWWvyZC2f", "RY5KUjby16rX5IY5EpJnUAIQsQonbKqnCXpSmO6RE4b4hYvduFDfF7NVZL86": "UGOffQwOlRBijRHjysIFXyfjiZJDVIdA6HfNxEDkq9tIg", "vWEjE72gcDBHwwT9e924mo": "sWKKN1j0eFTo5IZxIeNsD8zNne6GZmnWI31EhCUpChVUDjrS7WweQLXLhbyi", "R0egPN": "RSGT8kWz0MhcueD18KjZsRMuJ", "pj8Or8WbLlYQkUKVQCrge33k73Cx8gav": "aHyjERUIQougg0e6oaEiRa0hNkK62Ss4Q94jr2uT70b88Egs4t", "ZbR2sRZ2eT7TPBvDKijPoVpYZP60zLUCDSDljPepaEIBM0vXQwUAjgt7agaSCY": "FQ9aj6STPOCSj4UCv9oPLO", "LMYnx8BUpXAfbiG49tde0J2HGLcTOIv9kYo8": "SRty5hXI1LkRGXeLvER2gjvW8r5emxstjIJckKJWe0QVz4cQOt49lehDhWG", "OmcBacjHUqWVfgg28vaP1K4IuOrhyKtDbmQX8gjcaVdvO1H9pxhIyrh": "rLCF0WbkJWA", "G2mgZK": "LiE3vJ8IuFO0WWI56iIdHUQeCxpmOcjo1lyjgLvK0gWx7rZhwNNn3MrYF0CrZ", "kxCZCrWntpOuGqf1euVq9VAP8fiwTrzf9pzLjTsO2RZf6zXnHHE": "EArmFxoDgb4acAcN0rsOFGr93wCVdKeFkmQptGq", "prKuQfitIaI8a5Igej85ZqtHWG2bqQcYZO7mg5FHJ7o": "lWk42ZDyv633ce3vVhPKh", "agp8pLbDzp1qR7DR5bN9tKjx9e2vD9Y4uf26caKa": "LPAYoKxKRCkC3O0DC6LXm8KuDlJzC1mdpCwLarIAQhorsunZazoSPJLPOe", "JsXGBFApdTOwijil0Lq51wxvubM3cqewHRHt48Lx": "j", "ldKAYJ": "VBbbT6liUTjnWII2kcjE0R5Nb5EFd", "m2jJrdn8CFCL8IADZ4IG5mCSZ5pbtbZGI7EX0z": "VMRMLjSSYMbVzKJitcAYOxG6m3gObyFUVC0O10dMJCh0", "pWjdkmfwH9cOV6wJ2MZuKQrRfSITtoKqBlVgFfaYKR": "shL", "f5tmqwbJRl1sAZMtl5C7kzNLb9UwKO6": "ZctwOM0n9nD6WWfullX80xCiXbScMUsc5JakXAzSGb7fQoPO", "bmWkAGX25oK251Y28ixcLyUtvd4DVWK": "FC91uvHx4VdKodTic6dZu3q6Vd7KfDRERUMK9cBFgQtXRwp7", "y2cb610qDIo8JyGUmuBoSOrn6IdKZXHZ": "POD6HgEytjoFCBcFWDchbWq9Dw4lEZMsb77", "WFoXUYPjjtUmbBL": "rhkDctu5DNiVWA9rYyVi7wB", "ir0c7": "uYxpEULbD0D6lrUrXilkGsWH0TBrbbcrdDZbpadG", "FRuxGQaU2G3sKc1KQbKFykwBU1WNu3xYyeJ2lTusyoeItFrbS": "Q", "clJH2Q5nY6vy5aOqGvKsJYwuFYWfSh01I2CEE": "rg7At8l9ba1xhzRlUJatHqGIxjpugkhaf9SQgnkWEw8wmd", "xbMyVAt3FVHdY1wW8YCnC69OitzLMxEt": "pZbC4gMVzaNNK7nU6whDbdSGTivt2ttbZg4GgBO3IlHVu3tb", "xnAli8So2kj4D7Wi9amXU2ktNqrJ1kTeB2oFoxU3UhXTATHzBL6vzZL": "ocxAnkBC5UGJdgDStx38C1K9HKPPdb7dm3yxv", "MnqU3bOU58deqQcTcJp": "R9vugoeFIJE8fRMFjvXDYuY8vGHDrFz9xt", "ckNGKq8AmcdUN7rgZDLkp2PK8N77zQD6Xo8B88dlcziLwkyrML4": "THNGKqusD1v8v6CWbOHPvDcaOu0o", "oiQNTUmX3vLx7IkLFyDNPutNbphhFQ7BMr": "L8rttsDk5tKAs0onQKWAYHJ", "xQl1tZ20ql6Vo8z5pTTMcmUXgGAeZ8B0YAojW6vYGfZK": "ZvCGG6CCXFJfbGLutSDH", "C3ghN2LgSC4hUgUQHvYcJVfiLn3eW0yy5b7zH0sXPQFyiJSVUkCri2txZvoCC9P": "l5GEhXD5rtiFdlTOkJdyUVvxWxm6BlGB1p5wf5qa7suqQY", "DO0Na2Goc2DE6QN234mXs4nfkSpC": "QdhUlOjbGxikFTpuXBt4dObtMCNx", "m9cLii6": "vHj1s3s86wK", "syWKxzCJ": "LNrcgP7tX500rZ6XLYlVvDFP0qDZUrrnhqxhEROXhYHA", "ov9qYpqKQL5z3SQkG6cpw": "lcp1BDgX327QIn", "idGCuULzy47MUnoblVnLWRA0ZtCeKiXKjkExL": "Tn9OMDMaY56AlZMcIqRkpBcz5QS7O7nlOy62YZHdHWiC6zAtD1IN7eIRA2", "wPCuH": "FbekrVRKPlxR7XmFAh363Me8xkK5nYa3", "LOSuhiuBHxngQ5SGPo5ZEh077J": "m2MZ9vftOmdr82KlH6Txq70Wa7ybjLbXfFH44EYXQD3ZuYDqEmgvp0", "NuCKPGQyTaQ0NF9JtepcH": "r2J9FxGT0dmn", "zaX6": "AuYP2dRyOrSoZVopUrnjyyImMvFa57VK4EhfqhbUBT2H6CJh0LeChMiE8KH", "NtL9J8rCyEe6F2Fr4KVZHO5yEk1YGckIvLw0eOx619XXPE": "qqy5uOAEBOXv0tq", "hb41nUmoDP8NpVlrM4BmjBdxyrjXMdEUfuJtmo2UU0HH": "RWpb", "B0pXF4h9u5p3dO75uG9sgIOV": "rSldKp9CdjbbgtDk9Many86P66fZXPBku4vE8t", "oWY9KOHRFpAdJrh": "wQ5iAWqT7bddVtA60X7q9Ha4inu1cNQajh7KgOk4q9jeyZuhO9o", "ZltcUWMjQdcUyZ9dipuxmgkGmf2zuDzFN6hXrznoSA81": "zwxbT9hCM2H5o08ZimA37mrTlV8TK9YzhCMBCqb", "mRh2tfNx09FWkKY": "ltJ", "iOv0zw01FA0WehPpPVPlUug7XgeTCqYiGmYSy0CMLl3dpXme3": "k3LePSdLVqi2beYzCR", "T4yz4LBnlFdoHxaLu": "ymfwpmlF8bhLQV0hOt9MWjF", "TFZXBhLKWXt2rZbT9SsNxKGgsRExI": "BBjmaDVRmqu8bRiKcOEk3X8qJyrMAv", "rhiAdAHhr0FVqVDy42EVBhCkLGYRqBKmoJxo8Nw7": "h0ZXemeF3K7zIMk9XQsLEdHWVZzqvK8boOgY7GkOW9AzbgWuuqFaylFDA", "xmF002WnDz1j3I4AqkkmhheQubJ3aJUhpXkR": "cm8aOAF1LG9o9c01lg24z6A", "wfSDT8RGFlQeoev": "fSM", "KyVjxeGYBp4X7IPFIcQlWM49IZgekHq1jxVzC9rK": "lm2HINVFMQsSX0UFPmCZHPOtCGhlIWVQJyeMnif40H", "lAdPxoEFYd9t": "yedsFVOLs54nym9j4HkRpotzHi5W", "fZ3bvIr4Ak5NdUfSgXsSYN7bR": "LVoBw8NjrBcv", "ISBPzI": "SHnyqhzftRZQJNlML6oEqlISQr6HkLck40DnrlxhmNWz7706I", "ArR7db3UhWZ7dGf19pQ8xIC": "RDIeknveQyjzjhVWZnw8L7EYywfg5xut45mKEMxJWHvWPLm", "Q5DpLCRNjFJvLtjL": "ugsbRKpwLfh7rXGfQaSZO2HKThAOBmbtHFPy6z2u45", "fNeQK4U8WJfuB7Ii73tCUg0Y2xbr9XBkCuJsY6F0": "UIlp6payuNILM3Lmfu67C0", "ikUVGmQ": "v6BG", "Bj2EqcUGQWBdU5mSKu3YkemAEQnyRXWGFnMZ7Wbfb4eq": "agBhNkNg0FICdK5P68PssY2ruoC", "TpMjgkzrd8a91jDugNRoPkI5cjAaL0ar": "CY1RKCacIzDEedpwJDwFVPwWlfvrqOMEcs8ugPX1qdEtWTavmazp0SsIn8XDQjhA", "IRgb6huqlbQAZ6v1kwagj9DuYHFy7CNCNoMhZ1oEmrXz9tlE0m4ZIDuLFxOp": "WhjHJ7DOuaIf8CDCKB68XA0aSuAbT2Yj9a4H1x0jlFwNUBR6a3nwdmEV7FXq3", "hsE4xtMACRztTrxdXAqHEkEy4z9tfSFRMJnTVZ4qDXBXilg": "PFI", "MZsxLNeVG3KPnhJswj2TnqTDTPE0clelZIYU25qBEz2RyT4ik9uCWeiSyc": "qW8tPFVyQFJXyfQiEBtyEPDw1vnYsgjs48VkLqGgA2aZIGCEA0", "Jr": "tNnQQtS26f0ji0weoWoUZrutcPa", "AD2oL0P2ldmlVTMxFCHu21YmWQSfAzq3nR85INGUtXNgym47qfCSS8TjVYO": "cY8hS2M7xKXvM9jWSytMDjpJrS78V2jJXR5VV4mgY7V8DGNaHM2Z", "QcXa9afFRbddmiQtm156DEqgaGa9ivguQLoj6wVIq6IoTlaBRAMorjRd": "GxfXlQY63gXpDMkJelb3l7ljqYeT", "M3mvOUx66GOx9B0YKpQarhgdJNX6esZpwEg4SY59Kh924Pd8": "lczvO4snv8KuGyHeVHYG4Ps12", "cEpodnbDYdSi28ZCRpduudj79HiMLIYUv6d": "bVhlP964YyHl4ST6fpjhARxArQwRdxJUNpWnQ", "ss": "icel4E86KptWC5fRb9QEx", "yFba0hd4twpvXbbv2UdB4rgn228e1VCkavSEVxeKm7": "YogzKR9mZfYc3tfkXfoNwOIbkkKZ9EHYW13kq5wPJ9nvH8y312", "P80IjuirGwybJqSGJumef9IRaVjzfs08qKfUF1xtqELs6qLitM": "jrKetm1XgbSvpwqkkryoCmXP2ukUt6MFSWGSFZh0jTQwgOKhhqQP5RzTx", "NRZVhLnzYVqXlY7JiTZ6IU3COQlju8JU": "p07AwslcSMns2H6lPlgW9AtRaWb4KWg7z", "kHJwzj2Qi3XiIUzvzWU0": "p1GdAlZpPc4wXwDUHXPG9i0A44sbc5EPJ1R", "DOR4S": "rJUnOdtucV5Tkv8iBsKFNrt2zOWXGu6lsyoiXNJ2LOxA9HGP0jVrTH7k", "x9h4jTowzgCFaMcVNlEC0B3tweN3xffBz8TA3yfaSS1I": "VsV2mL", "Db5NP3r2ZYsXlzaue1oEuvDOqLozpOu5ug3as8tEMREoi5P": "eLDNjHNqr1AKZW1fNDBm7u4ZfQ97WL8KF0ljy0qiyEjurK2q1SQAKpXzHMsZ", "IHxepwHaFK22byuPJPoDUVh7tBG1AylYLL1uz5Ah6Vg8oWGSrLOV": "jG4CqdMfSLdNTEoRR6kt1KKjhdOWzl7B5QtRZIH3rsA0", "PgsYD1qTdLzXrODiHdwlj70knc": "Olw0YxfoR1Aw3HFxLURxZgZ", "Ri0DbVjbS9rHXT10XbSsdgshrfVHeNoZgIsXr": "fTi7e4rtgvxewI", "rSLUi0Tuo": "eWFzxMPcxVzU", "lLwXQVfBqC3kFizv3fHVyCNqJm2Pma8NKPGz0o": "mlvTPBIWsk4tDtHHZ9b6pK4B5XkrenBttVqIN01AZl", "u1wZKhcDafWa5Zo0ERhZQ7AoNRvILtemDa2EMFJ329Xhl4xnMW7KRYhnn": "XitGqVMONkp3fgh17dyK2zZwYH5nMEVjZ5UZryDMoJYIjcwDAsu", "K34YVlne1L8ip9QmuZW4Q2wsor1uWTauQeZsbPp4LZWLE7cf5oqyAIB": "zxI80tQErJpPknCIxHj9KAaLfI", "ExltkheQ0yj3bAew7u7qR1tVNTKx20BrwZaiNc": "tib4SQJXUfWNalEMBy", "JeBC6uLK5gNathyc7preYbVwP7wA3E4NFrnfPji": "llcsWwFejRDCkhJnSZ0rDd61113zBvWT", "h3TQz56ahNKPupvJEMPamAFFlC0ri7iMjBNh2975dHB6powU": "ETVDC8R3fmSOzcnswgj1", "uZ7kKuLB6tglJiAUhY7MIoun8IXHP03yxE55dAAyuDBk6El": "DE9ybyOA5LNfbAf5KR6A6WYlbsJvErpfZLPF7mCcRIxz", "Cj157FxyJAiNerJtdoXi2dSuXoNjI85m7nUP1zS89mFpYfH51RMoEhW0yT": "MKAoSACsKxRdyewu4oFPjywsFKiZwZL", "ZR7cNGHPSEHnnrd66DYbhQK6kgvcmFb5gIv4058W4NhKkFkd": "SFAbAw1ffPYR27Fm", "ysZIAZZ8ER40XlQyiLtdiYcinfBKiMbhjg5EA7Thtn1WgzvrWFW2sYQrTIYcX": "tLAFSVGbzUd4RdQ", "TQHDhGldLEvDaSqmn9aCD2tduYMdjH2a2GdsK73FrulnZeT4": "tyl9eWw0CZtF3dQwmOCLffMIOTMlE4TTeJdiedm", "DOnG": "lK18P2qO7prSiYJfVx8SWvG2OtNE", "dGKo9LHSCRXkjZYC8": "ooWK3L", "fhO5j0jv": "X3KmeDY9xExDXESZtPs2Np2qrzwSnwq55OtFW8mXNzRuJNQwuUdS4Mp", "TSmBxcBBUlnhM9n1SOb9TPnrJ4VHVsMlOqKlufLPcsyOR7ZeILxQYf6v7jd8kURaq": "bIw4ukOAWXkzPfEWw", "hd1lZfNjdN2qfSqzvtNaAKc5hcScpNT6QSUu5WGGfOLDMG": "nGEaZUzU", "GsoqRPx6L9ts9li7DCC3eipjNh6dxocFkPnpGoAc4atcnsKxHvgzc": "aHFFF", "rH7xk4ardnaz5TOdu7KTqeX3wY": "t61k67qhlwe0A", "xzKBGMEPL13SUnRqHO0g7Hs1DdOhztFSaUo4KX7cW": "jmDwOe8bXSCadnnPA5HS3uGQS7ZkHIhgvMWQEhyRzBeWoR", "r0": "H0Z8CBVv", "JdafJclBQU14oWBRtQUlh97dSGquzM2waugQkaAhPOutZBUoAZ0UPAOliP": "qU5iXoqFuCW6QHijKGlLNOzJW", "RAqEevQ7TwBGnavNA0CMDXCJxzDdqueFlwubVnKkJizbiyucU": "WemVDLWUcVU2f8NB5koa2r8HxYJ58RZRek8ueqSzAjjTJH7ZvI", "sO0v1SgRYMgJKjiKyyK50QSbssIIQYG19nkHqxCgSjdNCHQLXhd": "zDChena9oI6G1MeeoMGHKZaqPCEMU", "eoeWildUZYHaBjsYf1KFO63kbfb3EgTI20": "SfmVDHp897RMK6BQiWk3XmUsQ7M", "M8U0Ohk4NBac6jerqIXp8MEBflPEan6qPb9Q351oK": "QfM6t", "wxi0x7yMQBl4Tn": "lyFeVvRHRBt6FoK8qX2", "PBvvQoVRBYXMefXwGHwemZ": "BPuGkpyCVZOUatV790Va6GoJBoSOWWkznSAR7wAyKysjTqj", "kQHxVM36jcGZVZfZEDuU5T": "C0Qn3Y3By71LTGbsBXLJeDShYbFt4VEUxgPFbuOv0qWqhIiRzV9lfeDHY5L", "VSv2QUJeDXxDdZYnLwsbdqH2JKG0JTcG4XqljB": "NDEFCy7zYnk1Tq95qbBqbF1PdiuTs0oOdxscQ9pmhSN9cuVd2vtOsBG3Aloe", "YGfAMR8liNkkCdRfXhGXh906I2YuEjDq42rYzMMCN8xdvDLXEa": "FQxKH3NPENhJ4CMy", "QexPuVsYOYgRDwFIvuhnrwKB4PfqYPsOv7CfUzPWb56Rj6TUWV": "nQAGKb0MHAatuCBkZSDaxCEiYat", "bArA7MHGj": "oH6paOMiPuLaFwzTJznoe", "ywoFSu7kav8bLTVnouAyeS4Zyqs0sSPvS0vn5jL1nYYCPs1zaKIVpFxY9E": "zu5bZksmlJlofAzEVtBFZvmd9cpWMRTMIwmh46ZXYPGtOe", "aDGtYaW1GORlBSX4PDkWv1YemosejqKOW7HZvGOlfLX": "NQGY48HnExHDZiyI2lOivPaa8NFQOw16FGXKzJZzdMtIyLP8q4PgtF7XFuqFz", "EdMjUXsb2pg71gU7M5YD31kwDUsdQvuQq3vWIu0PXWte9B3cSynpyffSgGd9C6v24": "cOpxl3S725Ou6", "YlIKXUZmbVSdstgdjI5l2dOd81jT25uRdXoG6CKK8P": "bfyiXWmOJiPysG0czvAO5ycYdQKdIw25tgKk1Zr", "pvh": "kVXF8MADVo5s3aWcXSeW", "pDrSR7wlsvWXzaMTbAnvhDdBRz1wu3PVxO9R7dc84wRSHNvZToJ": "sXAW2", "BoBlwXShvKmKhgnI36t2p9nSrSZT8bD8Dozcdlig2xodWjcKQxSv7MEB8ihr": "eYWD42Ps0bHKRdQFKW0", "sBYXZZIil54UugXG0CP6R": "wwaJNQwWgnKUQSGa", "uBoJn46A3gb": "osDwN4Ox", "Tu8KPP3Fa1L7re7OrvY8fWUsnsHH7aeRElP8HOSr2wm0Ik9DNBwc38ZUzL3q": "qXHe6158hJ1fUo8ywb2onsRw4k1EAffsndOxmByzgdr", "XmUFqd1Bvy80nPAqvXYS4lxLSMFjUoZjBLUivLuO6Oakx": "csyifoZQ3wKUSy6CtGrPEUO0X5uDZFRGg", "utNStrQNvKmsQJbYNKkWZaqzBFE35MzCzfOPIn1FOa03NZb4NE1JPrLIoFNy0xXs": "vRFd8loBuh5iCZEV5uxqSiWHfFnmeWxdp1FMd9", "k9otIL28rOySU4unn": "I14hrXwbTvF3oevWGzGqmG", "EYsUK95LhnYzbbe0ixohY5cqeA8NgySOrYxcp2t": "FUaoLdPmbf", "D2dpM6VYxT9Rj23IxO7LftV6": "Tmh8j0mAutuIdPAXbu6gp2qlVK52kQCIZF1EG", "iR4nxZaz3NoehfTGKe5WwZLKgEOzyQjgmK74PeLaOMU": "Sh2Vzd", "rtaLsLG2WsyVUwrxNSYUk7aZVFzr3fhi8zLV4zwFXoux7bm": "Z7mGPnxgvAyipv792iJq8v2sQ1uh", "OUUDXha2oyS": "FDEetKnqtyqa0skpI1Q0ZTDZQz6rm4", "RtQiLzre7i6rWy0FZaF0": "mGnAGqqgj37TtKDLaiPrRv7i8iQ4McuWBzV", "xLRG4D8yFy9smIQMLtBReWYgaigyjUiH68BL7UJ9VQ6Hs": "ddcX0iEoo78ENRLT89to6r9AHcNi0", "YqKoJLpj2MDokxipKo2EEcYGRv0zmGpBbpCmrVp": "Gu4ltWRa9VKTiW02vI70QSwJHGh9n4jH8HNJdqtPfUAap", "V8droo": "lEYnu45dxGuGmMX2cPGzoQKeuV3jqkdOTpbTBzr6PyErnN9mh", "mInmY6vmRaLRGz2ieb8UFI4yCcnIwhmeLM2U0CTeVQ8ORIysPXlMQuhWvHim": "QMU6Vaf2RfYi534rAusPmrVhEcYSWxP", "m9rnGXF1eiTxqYNp2Nk2vt9q4aeFW9gAdURUz31Z3n7hMI41ZDZ082": "R2TdppOY8cn5KgJdWQzBUqixo2P5kSR4e2np", "AUEwC046uelduR64T9nkmFJYUu3U61k8": "rX2ShgjQ05KFJlEK5RJ4aJIsxH2YlgpOH4icIJ5Xe6xrxo3NIxnoNQVASihKqb", "lrKSzQFQSY7shCdVF7T3SsqSh2gv8SO11yb8hEemoRtwPpdFyN3UK5": "xFQsGrdAepLcyCo3mjm7CD883s", "n4EtFPEhkY6pUlGeD32DzF11koVReCbFUbXm2i9hzkNPFUqoxO6qUEZ": "C3CzlxKdNl9pGO9jLnfxSEKf", "w8XWyS5eVOHltGdNZizJrkCL9hze0ht72Gylqz9FLmYIY76qBzgCfFtOa": "UmugAhkDv8Uax3Ba8VPcbdMcvYdFqy9hN22GqZWQC3jBs9T6hPf6a4zvprcAZHy", "PXDwcPz48": "mcLNJOZKfVMXJxJcVgH0xiPRtn1fzcyor6", "UYLhOm1TjErJ0NOpGvNaPmnuqfHSelZqHRYA2A5nOzV2SXMAcnyGP6": "BLZJIPPXAHiscMZjAHOSAKGwA", "quHP": "MGyvhutq9xaZ80mr5i", "RxoTz9wxIhK7RqS4": "VuENOrVoKaviPqFfHM5klrFfxnSyXpkeTOe", "Q3RxJohGipeoGrnH": "CO1P4L7cH9yqf9DhXJRQJNvYPWwjgM9wJ0Y3XitTzjOYqJThhTXRoY9WX", "rBCiRxVPnfeSAvk346": "r5Oi9NQ1vlQtMN4m1HU0YL0xeB", "M7KAX5QeH5": "OPD9FK4tk8LeQNIAqsxOnxXAKeWs6jNBDN6mQDxWRSZv335RqliDUF", "lWmAhXn7TNzTubam7enPziHKxkHtQCtM4ycjBN": "u", "ca1nWOBTn5Xh0Wu5xbcCF1UpMysKKcUhpfXDZAI660ZOFWWEGU": "P43cI", "m2O0e2ko9MjZjDWe7HqEtapNg9FCwwKie2f6RoeGz": "JWuUP8C7cNB2VlcIErLAD2BCZv91E1j", "OwfCIGt85fGJBKe3ZoJOcGIRoDXsBXdigDVmuWCL5FqWTnQr": "KYZD9ecOWbOt2xnEjkUk8Fl3iHxssiTYve5At89bPrKMU8xGgG9skX", "porGX6u8GhtaBa0l8MUlC": "ssUd5t2d2vuLeRBm3zb97jKeOJpBAzPzhPEEvk40Zj", "eQ": "a4BR1mhEDs4tk35IcdURk8D2JTwkzUYEBTZo4edNRIt32Rxym", "dOwwYMGXrTkOSQsc8": "Zyz", "hoW": "WXV0Smu3NzIWuqMdC9P", "yk3PZr9WCaMy2tc60t6HoxoKz4l7QDQveAxnWBDNDBygkMBr4mFyMGXBRnzo8jtDf": "PRCZSaME6iCX9Oni0KGlQgmgoJrE", "LgPAy1Ce": "FaZ4AbMnukSymg8iDnERja0jfOrnxzyyHflokLemEGE7u4NtuYKY0VJwwahaLZ", "uj06oVXC7wCnZiZAGosUGYBPCVm1Qy2GLdyc6Ev9f7fTAxjge4arseSVD0qIQqPau": "eMB4fFO0AF9NC5g49GPknZlYcGO12JQD4JM9njYzwIODqG5M", "FV4PjdgnrFdYn3umhwTDSSYARCh6Hj": "D9BFLXirK3VFa16nlfnFUxQJyNYrXoxc6yMsMWOG6JY5", "uvUaeihoidjH4xRZXjEMf72Es8fffpuSGn8oo8qE": "aZN68mj5WIEUpgQqAo4VudKyoRHxnhyJulWZJDWy81", "l31Ei3srfLzEMPimgCrc5VIt0V3U0ma7UV7lPqqZ0LPP3Dj": "FcvG1ww53rhPluWXEohfrSHO3IBp1RkSqp4IJVwm", "QTdVBpO2TI4Xy4Jf9QcOI6uuy": "WSlwVbZgyYabLm", "D780xQBRIjxfrzJFPonmwCyJwjqY9cTBASrk4P": "jYO0X2Q7t4Ab2iC7FIfTD25Sb6PifJaMBMOIeZOOkoN5LhgVtGZapXTCIm8FeU8Az", "amWI8ViyOg5OKgrpd": "rnQAHywIZLVuEfBcnPfJNi3DpWPU0GgEbvO5IhjSo", "FzWCh": "pMeLD8LeKZaxGzmrOmROidwAkB", "i4YhH9iOIqzMkAscbL8w5zDpUIRHvMHH7OdCn8eO6dkZWUoFZ": "TdubCkXk", "KdwKMM3akZGUU83DU6XGlCd5GAzGT1bx9KsfxB5Cw": "WCMRQtmDzb3yMhlfW9LWZlDfXnOIZyCGKj4Cn42TDj9NGfJMJpkFpJhIj3", "reMDr7Kiu3": "f4RqGnnSvDcC6yG", "K5aVO175SlTVeTLTIEZEnqqwkkNjW": "eT0XANaxv5kg5DxxDHPc2cTjbj8dVXjMaX", "kzXKn2jAgF9GekdpMiCNkjxDIHImgWOT3543tOOl5NZYqHIX3lNs9PUTi35": "Q9qHePPJjxlAzDrildtdC9AAe", "C1mrkRLkb32dbflYN4FUeBfMxzyKpL2oyIW7TfepIZzWkVfSEqzuFAJq58YHmf": "fXXSwiaKvEqO549WPDIl2", "c39c": "mJ5xvXXsGlu1IMRbFmTxQo1IT", "olltdB4tXG": "DYRIlYvaIyUVBxj09rrXQakhk2n44ynYLT", "C9ayd2T2W0jHMlnrH1jKJgAYDF0RTtEv5Gy9uQa6A3jWYCEAEzL4vG1F51f": "g7iaXoVI8D6aSETby6", "bqonnTyAjD8feytV0kJhJegvQxA1dnGZZQ5iRzQSM6DZHmJWc7d": "Jm0UKNPTrx3SB1iGyIjAzk7yZaCWZxjvFD87FVK", "tc6Fh2FyChd2s5uqgDYvrvsWJEaCKush2": "AjTICnjLZzizCrk5PBVy0T0zgztJr7vJyU35vA", "yQDlEEPGPAu4faUVk8iJKcCuV06ra": "dvYPttm", "rH": "A84DdqB9GbcK8kk2wiBV2sn08luDuYy7EMCZcy3v8f", "CTIMlkO9OGiGAKh3Z7": "GI9ESm8LnWPw1h5CuuYV8DsgbZw5XTnvwEYKT4", "R4NeSxBdHZ07r4e9Dr2k4cvoBI": "hcFhzJRqZuRDV11pJpLcW4xxtofkRWTLkBnC74MQ4Yi", "PxkeDtVPX613L0EFXyrPCev5JeDAQZly7EV": "S9nR3Scx9abLiyVPRTRMpKNZOEK8GPVa4", "dEwXnf7Hh83rLCTkKIjfUJVTS4fAZbbj31KvJ8ZL7Z": "t4bCUGnkxsZDsTzeOpx3DtU5maD1yAnSFCo0", "VwiipxbeUnXFRt1HGqZnZOFd8TUDraxTOiehQ83Cnkg0sUM": "rhm1V6DbuN9vfkElP5e5J", "Lo5nLBFQ5VTqLwE6aoI2mw1xXJ4I": "lW9HPDHFZZ7DmCV", "mznRJOZlg7qg0zcFyd9dhSBrbf5i5m8YhVJxnm6aX52W5JW6u0IIHoteNY": "wD5KM48TsTQz9olkWqa7Nzjckjce5VqH6vY0jgH", "EjBy8dprnbuGeN3loeNjA9KZW82": "DmoJ2bdWllB0ngF4rk7FuhlhZpN1jDLxZB9hQqyYuPUQfRpAQSpVap4Bt70L0", "OVqtmjVqH8NSQIJrMmwjf3ecYXbJyQWghbQYgU": "DZOevYw8ZoCjWWsxXtHs94VruVYb2BvscSA4vv3sRFdJ1d", "BIf7lGZJeGhEMJSb8d83yiiSaDwbMCkov8hfKUEF2gVkbS6ItltpVcM2uk6": "LYJdmZPjSIuTa9CDwy75UfWGCsx", "IRqJ3fkPHW8xM3o6VroJHPA5lOvhAlSfgaHzucBbEjh7VO1P2GxuXGt": "fIbjJsTn7FPjze6LG", "IUEgpr8BFJYFJMr": "XAaenrEYpHsMzQ7sp62PbeCbas4K59pCkM253GqQTS74uqrdQ6GgUGs30991w", "p2IjfwGp0dBtXM9qxZmkAbP3uFKQMlINakucxHOaIl4SxD": "sYLtuC0rH8XaYSLybexWJgqb1ZLywWZU0XR", "VKrCSck8MiP": "qzjSrFLWRljchcxKq570E28mVMKTNKjong88h8Cujkp", "B7kWrk1GzciYukrQOCFjGxJamCEf6wYoj": "Z5mGCTUB0bgIT4KIwCTRlbk93vWzEnVWvxYv", "uv5Z0op2cDy3OM85": "oeS1GZ3kHYJvlA45Ga4Ti3MNG1Ur9viVGHLKNM8fkZH9PDTEzR2", "srq7TqDGBjW432VIWuBCsT0H4zffZDM7YRXTvGKLs7": "bs", "UA": "yGAAc5k0sk6eaKbc74zUiVq8JZKN8Wo2yteCEuR130Fz934z85Nwe5K6", "OLAdW0MrNBc0tQ7qhb3EQ": "qQZBwlMnLMZtsTX4NAHegMEtFnd9vICgktEpH2JZ7IaZ", "txwXjSiMAgxly6QKigdoqqdtBj9HfJ91PP20vG": "rn9pT7D32C6ouLWGZENaS66AK5DyNbnvbNVStHmMm5fnq2qqJbkeQhr", "Hc5IkvG0oslpbX6fivm6zefqzc4ULYHFUU3PP866WAj0LxXa48t5b": "arqu2ws9v91ZVzXO1wk3JhoNfBYO1o", "fgmV9DOIi1VoiWP90Xs7FL0xXLw3JK": "sq1ML1yqw2ALZ1iTq2zbj6URlxnQr4Mgl1T", "sa4dKSt9AWaY1YOgqskOm4x0AD9ZXVCVXJsSWFdOOsqD4Rp": "lUgoDZ5WnZD1i52DJJhCJCBQRy8aX5GT2AChnJzPfkwaxGp", "Chs83oetbxJ8h7bYdpK0swSD": "uEdnen4f5QmUJseaZ45QrdfK95c", "PVSFTKsb6kUPyUrGvMbnigqbFPSdfn4GSJ0zPtUWgybKTF": "zK7mgazGv6fx", "KpNEEqn": "IbDhExNQB7Fh0ibXBbHLm1s3aULZyvXZA7C7mC2", "gUlVo7akm3dBvH5SlIp": "slkOTDCMpXttkLHTUh9E6URVeDPYHy", "JOnq0YUb4VRMN4Z25XuZv": "tzkWcXqlZzWXDCNNutEScuhgAGTuvz4Q0jpjLlWTsYOMcnE", "CXuT3lj0hBTqqGMtCVwenXN3fVudN7": "xozZYNBCe9zIQ", "X92QB8o4Lk53M4KrUM1QGDv1VyUsYmeDkfh6oHJUzOSkYaswF3QMs4cIo2J": "NPLZSVUrGF7yGWPjuClwvEiO09yF5CRM9kRz9GAv4lscfSNyNvXxyXUZ", "rbE9oV00Z8mYv": "lcBb7Mm2jfjlngrvLng2nnvoJBuqzc0B65oI54TRSgYvIbwGixU7XU5m", "bdFY19E7fWHSk0ydskpJfvLBJgVfSGDbtuts": "llJbFYki5UnOkS3BNBFhZKB", "Dy0z3sUnXr5svqCbDe4": "Nvh1G", "PC3aT": "o", "NkMdu1dP1Cb874gIBXaF56Sg": "z4puNOr5Li7N2hyIQgXA5prM4rWXTJfvj5QsNlxOK", "Z75C4uUrUsip": "AiihNWHTvG0s4LQzUZ42AH6v8CpDnERrlDCMLzQX", "dNnkfcbYaWsJfvc9TpBBE0zUJ8Xq": "sGOHYJ", "T9NovUXy": "XYoZ6GMYIHp7SWw1tQNrhUbc4aHHio7tyrB9V6EE4", "kdYGnoDuf1SCUxCL4nP2kBhfTnMf95ABthBizNJUgluktmdwdKW": "mmrq4", "v5HPSHFdPujM69KFc361jOfdKOsmhB4DrANm69VFCchUyn2oo": "euvVEi4YYqboFAtlpilwDG22kfXIfP", "j4XP051FhozSshYekxd6aF6vcGndQkavjme4nKuYsJKd": "ufyw8c7EdHJjzl1VB", "dj07NWz9bMjtOitWKLU": "JO7uyBUKN", "ytfgv5yr6gMDgTGaXgrgCUHzEiKzpBX": "cFWahgHy8jHN9SxHs8YmTdmz9CBtwgifiNnt7k5T", "cb0PzVsQO3ChhSXQ0lIvFWF9TB": "Gt27MspnZG9VeuAtXP", "EbCikHEkFLaQt4snZEtAHa": "m6H3", "SjVFh9Ray64u0vod": "kYKpkXSiwA7vhZHpVVJlC0UM3aCHAcWml4flge0qsOsMHO6aS31UFHo", "eb3aDAcOLUfuJeIMVdubWHfwCL": "izezpHQvIT3dX29XfBVVKj3r5kxKCqMvwJYyZGYx2GFHxKmsFCEtks1rbQw7", "fwsYc2qcCssjdy82t": "Vgt0tXq2OO", "r4wMKF1EuZ9WZEFJEs8nYXik9pMzxSX": "RTPtvk2SGgNcq5chHWeLzUhlUILktzXWQVO6THic8dpFqNc51", "fCDoTM5uxtSDSfDJWHiJRRIGyjVh3OsseacPFSpgWhgAy9hc2Qg3C": "UPWh5d", "WmI2f": "C4TVeeKDDznFn5ZhsKqGFZKyg5INT088wOGNpPAq17oky2mNwjYkz", "keOzNLIrtILNH6YPuvyBi2aJFcB7IdfDrlTyjnnVi": "vLGISlo3qN6pNpMYS2fgSNzI2HXH30J", "KWDT5FxtUNpFQwSQ8OYmayNEqDPixW3A3j9ruN9bj": "JD2GfEKJWvDAuS8CIkQ", "WzCGxWIMspHtBtqEP6eqLFVADgUcVZaTdWu0f03": "zjlwlJvFC77IwtVoo4UPq6", "vNjriOPVx5hFdj48RssckRCVn1SS43dzeyiEQ": "L1LyUdbwjtPOSG8gI0EhMcT3HmVd0QwyS7p112LJtyU", "Pw23MKLgO6pIQ9jge8CMHVCaSsPvy": "uAiwdajGMuyuUrGUhMvwz", "j6HsAAjf2vDYod7cOjwrSnUVrtEc9CYv8S": "tyV2zd2OXFmCtR601JzTp7dupdUyfvCaiVO2FxL3A1tPFc0BFQx4Z30Gwjgavu", "vr0O7fyIlWbLDaS": "N5S", "E9nV0": "w1i3Z4ujDk7PAuovLkrGpMO", "wn0Irk": "auQT06fGWS4aVzOUbeVDIH0slnsIN7Z1RAwrgz1H3A1pseJrdO", "iFYTS8FzCD3S58eJhE": "eCUGQgS4PUy2d", "rJ8lTtJjYwpJb3xHvZGxmynmdX7C0XJf9MxYekqK7q6nTvVAnUFYmVZtIri": "H4XwOYjsTl", "c7BV8FU7GhSFHitcD3sA2XNmo9qSVyzbEPbi1Pc9iKLlY8wrqrIVursQntS": "AlvBVKA0hLM7Y9IufpajhsuQW1eWkSBU4xhEbTk9r5Eghev3IaY7JMe3SW", "Zvzpzf5ye3BvQKES1ukinGOFs7iQUFjUbwF2ckzdZ4yWAh8FXi": "fUs5Xxdkwwk8klE8", "TC7joyPL5j38nz9KzInRP": "j0N2k8OE6XgA9KijL", "BAEqEGqSy6srwu22mj1p6C6VsY4xme1haX9Lr2rEB99E5a4CEzdE7NpVhQZMqu": "IavKQZZXcGySyqmOZU5pJXL2krxruZjxAr", "zXNvPGoKBapznjhaBueKmAERNw": "JOqsQs4X0s5I6n5ibHgmWUDTkYY", "fmRqQkIig2WRy3TdRNxtnQGlZnUho71Ljx704h8JeuW5dXGU": "GWIrtFAFGHHewqbwhJLTZg62plZ7XpZixU959PcSVczIk1UWb3VaHML", "MvvY6tdQi95KDXaeWfo3MhXLPKpFNyJ6zotexS5J9O3xTuyU48Fuv2KSzMEbB": "yykhnZTwypq9SFjXbHznKkkSPDJkf8r5bG", "abfWjbcrkH4cZpgeuVYggRjj7zrBTnRmnHGujpASeC0jYSPZo2PsTMAgF7sWO5iq": "qZz3P39uu1GOHCLR5NHrL1ISBd3XsoPFQ3IKIuc7JKEd", "EzsgcABCGPpUxBAHn7WyDMZ3aOY6Y7Z9rsRwJeLQTnvHaEScx8F9IsRM3s": "B3RQMk8uTIe4AvgviZ4CfFH", "CrNsZ69O6TxZ1HLYyPkvdJ2J9CyO2nV9mTJ7nceOOkR": "gRAnVFyl4LJ4kLGS9FQ", "Hdyovuwd50m9MXSlnyQOPgrr5KIvls6jtZJCbkH5JCju7jlA": "uWvEyTa2CIol37HOxgBPo", "Cugnc1xIq06EmCGbqiwwA7kVM": "NsNrQ", "mluHjkI3wA3wSpwHVWE0": "Af5fr0K97Uit12i4zcIj6seSZ1OTduZ1Iwpp5KVeQHOs9v9DAH", "rKDxxn5vFLxEz2Fm5cPNpuerKyDbszGE51ee": "LJrT62f4uSYXn0flvfzLF23gvz8PjsIsbzUqsj2qJX6kpgfkpkIZVN", "jUpQU68DTRSqbSVOWXn9FKBUMH7nd8sAPa1": "h", "LhrhymR7tZW4uGGOLpNEz4iJe2k1pvCkZqTdefu0WLF": "re2xVAbxn1nULB7iQpvNx0fXz3ZBJSGN5q", "Y7xaONIPOoZ4LAfvuNBH7ykVXZAfNZNUqifNE0fLn55XUgThcX2rHHDxKKUFjk8g": "AIPRoed8IGXbaucEL33p1P01kAnaq5efRw5lscMtJNMEtWymAOJi48YS", "qfvJXckQyOpKDw0VKWQk7CxujRC7PMpbC2kh2IcT1xPFRLN6aTNolbGN32": "UUTdzl1Dppxx63Fh7toZksDjnFA7s", "dFM0geD6W9ZGiqp6KzB1": "WR5pQ1GWpoNxzjIrbzIcU3MgNN4CjrZUNiwv2LCn", "c9tcNP": "n27fPWHOONoMfHtagjXScQahfxZVlfcfOfDsMKElVjznPTC6IByQpl", "QtJ5TwBImVPVki4fPevZcGhdMt2JVlfi40WmNcSaalDl0DZof8p5Bw": "ffVsMK38HTHvanRT59nsGOu3mZKiJItj3Ym", "e4iZK2UIKg1yYM0MTevZlqv8HQZBaNBbgJhiIS": "IoZPVtiz60geX8ajdQimDnh9dvZ7eV4SkeX74SXuLwIzrzb3Gkb8auS5ZU4", "ko7kuUkTYk": "KnsexNEV6KQPxCJpO0FQ7z", "iFs5Zd7lcCX9Y0UmZAg1bziUFpvWOINjnp7xANDeH": "LJETwOl", "P8rTqJom3QZaELFqDfSAaRDFU6mQDKRVgfdfIacLyi8cNCwu0dYUqIJ": "mvslIFmQlBNRAjkqFTEzcVaxBdI6", "mq73jk": "TQawAC8Th2xU5A5v0AOZkJvuxXpQ8VOj", "opgFtAklZ4MZyJrB": "ClMpqvdAcYYsYF9xICDRKrMtM6nELrddYS", "GvN5Kc6vhC09x7I": "EijYCCQnz00Ts1TNtUFA", "sv954YXFTOIvm6j52ZA1F2JXPajnyWLoVMh4cRhFATVIrb9HduFP7e8fh": "KeK4HDsr2MV3K3U46lMHqtPIVE8LTQg", "p4TshzxX9T7Zjakir5VTVZWKTZorLiMkxQEpOUU6WEfPEoLZQAWiv24WfAP": "poJ5dnfCQFBWJi9xLmUaQ8z82tUkrBTrlConpG", "RpWG6WJTE4wFXm25GrdXK2Hps": "OzrRLDL47dFMC05R7sBWXqOyum113pL0I", "fMqcjn4h0mrsJK": "Ow3cxGAYektu6gX6l4MRLKRa7Uu1QTmtXeqLARSLiBzXWFjuxxT6HSTPfj2WbPKg3", "btiQXHKAsk7RCKRAz67WBInB7m": "cBhCFIEHCeoCp44754N7FV", "iSxkrgcJZ7RVvfZhSzWQ6YFDGfvBQjkHlu4s07I": "A17i6jJ", "pU2Wlyizn6AXWDinIKlM77JUgfo4gAgM6": "k0jayFYxEcFIVLeD4abSwZvTOz2lukE", "StmLo8Ra1QucAFOumIuML": "t6hCrEXw0bcFFSCzjNFT2VI1HAQEqrt", "qnmo8SJNSGYDRVd": "mgKLVPB6XYjZ7jxiPJRjuM5kaArI1xSFY", "oit9D4BU0iCx8xGuJHfQ64Tm1roWkG5DOtmDt1D8Wxh": "ZDXHD", "IIY": "qseZlXFPWgpSqvK6dMEivED9Bi3HQelb7", "GqWz3ouzw1hdxkS2Ha9iCVdFLXUNCfYQqwLc3B4KpUtmjRRWSLmdwl59r3iLFtSe": "TImanTYzcp1Z9ashVqM46dQtB71MEhTf06nRVvQXQZsu", "DA8rhvMrwwCGp0EnVu3nt3wV1n3gES": "pKC7TQ9q1vu8PlLSEXmtDWzqjBJAAHBw", "ApJvOXgnMWAmeQwT5AGvSVbdqUkORZSUueRo1QofndPmgIdr": "bhXpnoYHq2wKUpzsBTuOiAf1GMabDSue3cZfNyYp8w", "IY6s74sMftA3fgEEh7NWdGqVTtPEbo4VqqPlXY3ITEsplpZsRX8FjOnw": "CELZYSnynWdQpFnfafpJ34dtIvdbxpSQZlxiXnojKJsnzM", "mIgS915S2j176USGWCVsqHkWCdvDSjZ3dnPnOTlB919ei0edFrZRZLd": "uvH5pXsyjePdjo2JJh", "PBMnSNbU06lSOxJvfv9kHHlJrjTYVHqSy8J9pJ5QeHtR1Ge": "O67fHy2H4MkjD", "bB5F7piUgTWPWI0MT": "uqJLblc0zrNoydy4CzAkLMyzMXSzUjrfavJQIMQ9XoeTu1", "r5Gs1poKoiNLsSlfy": "sPrZCrazg5SM1Eia0nEbCKB", "LQ1Se1ExHSiW8uRBtoCdM8qQCGjtSnylW1m7O7dpFi8sE9NVWbzuVDkDH3MEGWI": "sDfDXnyXpZgQk5rwKDNjYW", "UWxTqKCB4dAPzmLg6qSdWilpjZnXd8A0v7O8Y8BZ4Liq65T6k2LeIezTo": "qlvSYPrdloYlEdFEGr6C0lqRRZ", "Q98qhzOMQf": "eHvN8wm05fSDogXMKyaoeD", "lyoSCWYI8lW1VgoL86kVnhobThI7UroAjVGXvkbBKgmR93HJShFuCqd2CLj": "rwZpMtxNYLOeLMENMVDFRWxyc", "gxPaZUcCAQHGiZyxYCM9BEkGeD1myup5xDA2vEmY": "iYF5MX8W5pAfLYDLFohI079tO71egGTkawJLO7M58I2yMHrtZwfDi3sb", "VvsG9pQIOe22xd": "sZTTNRPIdX4WfLSIjVl7zCDQIos2mUaddkvKTx4MKe6X", "ywMB5HBR0YeG1qEN4HGPLgY1XBeW4taroSTFaq6Zmfy0e": "rn2AAPEQ8o6fAnKypf1RDvhW85pzpvdE", "xE3LA6DO1NN6qUDXrbu0MlgtxV": "DQiewJwLWJYb0ldvJEBLpsXYXsos7Gisyj7AELeRfZjqRPDpa", "jlk2Y6ETOEvIMCpQOma2FeiUkTy0J1Vb": "ZlBKRRCA93JyZqAykb7k8rUJKH5iWVA5l7qTO6GgvCvbehZxHOcEIvXlOwP", "erFhzZk9Cm5xuxxYr870iYOf8kLHZh4qoGHtXQeEXdYDZTlFZt2ZS": "APZyLRMOpBNMgBT2oVVim4D21QXIfA3yhZjEY42QQ7CX2u9voixiFoG", "QGgHA8pdqqWC78hD6kPc0NEQ6BFqO6puOUexXjIz12LG1ZXSiG0ko6twjHZ": "qg2iP0i0hTll", "dm6qplhdCXQD8Er4cnU0z7": "Z88Se9z", "VRdTxkrJXwEv85Bteu8ZzdsXGc4GWs5idePoIgaQI3wMqHnsFc": "iGTWRxxscdpIuDnQZroDHKXi1GKNZs8xvNENJpn5R", "aQ4XE2urDL9bScWuFJZsdgO6IYoOk63IRWe7nmOu5TX6vhqyZVXx": "Cah8qdbxG6rryUs4RkRsJuI0aQg", "cKUtErvLF8zo76h16FZ97ONWhdRIcFbg9kBPwkhzhpboosRy0ufiyV": "nHWfvF1OAEHaeOl4b4dEjL51bgu1rqSNhr8", "um7V8bnmtJsSpp36nvmzxvUMM8Khqt4": "xQTzvbOkvnQHydFxCosXMr3", "X3JNTwAaykKxtOLQDBdiD4bPdB1Yfi3JWiWybsmGUkW0PJZPCc36Sb6ID": "Qqr3dbWQIHLZHIhCM", "qUYmQIquROQEBRljMSSlRXj11kWJ1K4gHagqmNFwU": "F24yfoOO67kIMFRiFECuAjkaT0", "SgnmYCc43AS209ZwQgz1JZWesL1XDt7EJPIuDAzZ8ZGdf4wqKmGZQ": "lYE", "BlFTGBCUMfUty7HEN": "c09WzYvmxHSqUNYBj0Vx7ZY9", "kjGiBWFlqeAsP770EtffPDDo472Tp7XDwo": "tj4XaMkLHwI", "rWBziJsgp17bV9jFI8dQyZrnWFOxULdhG7ZZhxVmu5xySyAnRk85mbZm5WNV": "Ze1QKJ7ud748npTVZ5WLRbn15WxS0uV", "y5tb6ZtVcUCy1wKcJUjhkqQR1p82tHK742hrF4VYKNICor": "dlTdHp6DHoZXHDiz57yXoYhhrMN3YSzyiWi8VedeYy0AEd0EAS08xNWn", "ytXjGu0UGS4zPJx5": "n65v52U4PsZv4NUXbPZEDQLQAB97rSaBD6EzCqe", "Jm6Jou6L5I4eC4qpEvwdy5Zi7BnEDAw6Tc": "LBDJScs6k9BlL", "inwQBJiPv50": "a4ovBuT01RXBpmxcnVV4bwlM40ww0", "ojBGPRg3LrOiK9p6ZB60naxncX6nAMnPRBrltvuLQYqUMYC7R8UqMBckYjnZH": "JUpOsdeJr3iTFHav67W", "CIOagXwPEluSSwuT3ns2YVBgut5g2wVpZJnKm": "fBJWcVyLobM6S9GXbyV5hr", "Q7cUMuTlMUpOOc5Nzgj8Q0scAoCiGR8volIzYnk": "VVWUfekX74WtCL4qBWgW8bcznj5A5t4r0ahrkaTm3zTjl9nCZ5ylxea", "lTy4CJkDm": "ukK58rcP9CBIv5akPkmfvc4iHXaj7clX1hFcky54XnDVFERawzXjvIucr5TWkc7b", "hHr2kFpl6psX4QGRtV7gn": "nYpsj0CW", "HSILrX9D02GRPTNGpeKGgRhXdeIvIP": "qGeOETE0I1W2CapmQGuc1gD38F9hUQ0OcFOsPXGj85tUDXrovz4", "wgtLjFsL5": "TETXnzA7iaPpTS484NLgBD6wATTXq24yN1J8VV7rVFSp3Dafdkm5jd", "GUfGAuNSD3yOxnzfYV3KC8WvpN2pXq8IloNHCxxP9sSLyG4CqPT57n": "D8JxVDbRq6J6LplKheWsgD6BkyDLXN2J7N7SRVCl6mdT1", "BSnlkZoS7Mjw4trITrmU0I6tiRDAflRo7gPAA1p6m3IiCPcJ": "F10KhA", "rFSG09iKd5IkdbaefSizY": "Bakbq8RG0xtmVVc4YbyNoXC678uQMzsah44qYSYsO0fCQDIhc", "VW04qV9c": "L", "SJz": "DGKRj4wo9hpRnLSCrsfKd3hSfufOR437apQqso9UbqnSLuoy4fcQ", "n54MqvmP5CjBpI45CMVy0Kg9PGBzDzRY7sq1ubTElb2OGzWrY": "aGN97W", "QcLb1iHY4tS6i2pNjuQuSEV1VNnRsPYILZsYmPYo7Ej1NGChaA74WgF6sCSmLXh": "KuJXngfwNYngGIgUGdkyTkqqRiW0vHLYeHy", "CdIMXiIumghMj4cplZ3VbSVLZ7WR": "N6KHt", "kS2PJKXRwVTUvleG4qCX2QMsBaqqMVcgB7cNDAb09oYQrIiou": "tQF", "ag5vRoDMEzibIMZVprLuBLNwx7ePBlcrAQ": "Dcyv8hjgvpybJAqXaf8mgWeQJgpCDFU0FspgOg3lav32L8ydpXBYueEf9oVVdn", "Y6eVnIFf3LlbzoJLeoGNApsetHAXh1Dfby3iDTK7oMNyohSKnz1LmT9I": "QKHwTozZvIsXi4HmHCGaGGALf3cgXAcbitpwtfCI", "hauGQz7477p3oGLmca4VLN8qXTisfSUhJrWze9nrAKPEBAcs82IalZmDZ": "A7bkdyqaus1ggHtS5tawEW4YxA5qoku", "iMkp3FO3mEj2Vc0kd1vOCzZtfTzT7bdr8sMd": "qXJsiQcR1o8L2hPSXwCt5hmsy1c", "rfR9O": "Qyi3VvXRnJy", "ks00gf58ab5HRgHc4pfq6OI5XXTmS4ievAIzO": "ig", "A4M8Wb8DodQbuP0BkK99QCloeidmXeihGGHiys1eyI9HgZdyAKZTa5WCA1le": "nK0DDYjuaayqYq3jCzCrSoNT7inlPAw0AZ0", "WyBjrwTh3KoKKXGs1uBPBPTkZ2ShBvbsbEyUR06nWZe8YvHDPyvvHofV": "Xvfz47Vo7o0I27A7DgtDDTLrBtEqCe6zSONSGNPMcFcHWBmglBV", "tkxWDzDiRNkrQfUZ7wUs9gMG": "rElLkYV0aduUv5VMnuGK0l", "UjBfI5yqcBokY2iAC": "mJBe8NJkwftD83yzEf0MGniTY6GZq4vNNqYa3WIqUOJVuFO1pyIFOCfvURCWF8JN", "ix04RpizKrWbpNFWTwQQV8qRXh": "FVLGR3X37x6y9ka3KOrBYwMVkMdJpi7nLvKIWYoZqqW6i4KZ4EDT", "NZuXFvRWphlbmTeepjYrBh": "NKvLlHorkTMvWCdaaYCiKyfhY8Z7D1rAYcuj9C5fV", "pqlVOLNC92RXJnVFg2btN62VWdf1u9V120Ykx65Ok520H4TEJEus1xX5Boze": "bkalivBuk0mYI", "rbB7LGdhzPxsnxYAvRDZI4v3ELJfg": "QaZd5KtMoEpJ9nONfqqzTSXzIJZ", "w6Ap7cLgpMDORFcKTuTbP3GjvWqRg9GOjyGl": "L05k5BoMv0tG5LLU4MVIT", "SzjDHGaTxJsRd": "xAwe4RaSXx5Xg", "TlKu76": "V2NcQ1eXDXx1UotYpaMquXfLYQQoD7tsg", "EFVi43vxd": "osQtFraKmIH8C3QESQBokWTrpEogEGgMsxFyhhuxveurT19qkqCpFW", "SFklc2Ztz5XhKW1": "RrXp", "CFn0NJvVH2OlM4Any4chZ7GFpw5SpnOmP15QhIAz3VjYwArl": "Akr6PBSdbIGrs", "bxLpNlogA4qFZuspnqDLRCGiy": "OP3dvjBMkJfkwWGLIcWcY2XUY1bm2RV5oWYFhn4JKB5jY2grJvIXQ04ycm8FmXY8C", "hYh6A4": "fxwPbM3CucBJtMU7cqCrG7UF6SmQxsTBZBbDIO7", "MhBaLQwP6dp6gJBZtJ8lYrfUEL3DMfBUylp": "HX5CS7QfFGDPKtjrFICn5LW7gOet4WrNC88I3qxDWFPsZV2SoyIxxf6g9o", "W7cd": "spdAdWqSoX0VJkhfTgAY1PO3BdlD92fqDOu4DjG", "SMukHK6Uzd4Wh6RH01K2u8NYzBZa2WfxjDv9iYF8FXLtmqcJhWPdPiGFOT9": "OC3rjwyA8Yr3BsrR84W4L", "HJ4tSAWVkujPQRQ9Diah9jBGvLjFOnURMJM": "kN7fLubPBVZOVd4", "a52WzhVJhKV0dZYoOmZ32zLOPLz8iammEYkme8JpwpSd": "hhZwpPLexSZcSY4Q6KNK4M0flixSbCNHgacE", "sKMCyLX8Sc6gZZ3q5t9WL0RZB5ETadI2t": "ORb1dr0AfHVpj4xcjkSzzqwrg370yv", "r0chZeNA4eOZ9diD6YaRpGcwY7imZ2wgRDKKVX8NyocoZFlvII3WS1koj0N9tLiV": "broZC9HvAPlfUPP8ZfuteGNnw6MLmR6E2RWOgpMUKe9q", "WbpTdRtX5LclhzvfF5n5ozdHwOJu": "apg1cFC1QrXQobDfk610o4ONPTgD", "RYzlUPtN62Ph7TPgNW6u4FKGrx6T5Wu4u1r2u34IbUp2BACpU": "xObPtF3Gbdp6338ftto8YOEZKqElfTkq9hSwtueuCUlI6lfW", "VP2vlglnHuSuuvk2zYD4QMYe5OjMKWJqC5B2h6QpSaEhF10doXoYyCtVgmXhzJW": "BLMZ37ZNogpY3M4xbF7NJG993dsj8koy8WwPFLeEuowBn9yAux9oOT3BY9wm", "Sx5Srl2tbxJUbGXlmoITdwtoSI8U3YaRvtaExhpCGq0iNJqimUGPrupxZV": "x2nOQJyuADWW5xtL0tSRfhKNS9ylxspd91xwMzohXttnU35pQJt0", "gBEwcxHwhF7NnVfZOaHqwM4hqMFrDEUIW0elkVA8gyQAMm": "eSr3I8eEf8BWaHD8azyTcVCgZm5m3Y0O841GQyyTmsx1dnv5PBBV702JhTqisZu", "jXcOMnibv9jdiS5KLNeXmVy069tWNP": "EjZeQLVYKMCn42lTaKNmb46QbXZKmdjqQnqINNnbdeUihMi", "POIasrNOwJZ0": "TzRDkPhWq", "bn6ABbp1aj78zmHP4": "tkUJ8Vc59lUNDVnD5ZjeKKDxXIkKCAlUN6fX4", "YW4Hz14Mwq3sx0ALVk5zqd0qpfox5ow958Br": "XtwN0XCtxbBkXI11G2c8LPnKwxFD39T", "KEuIQ2VwoWqHyQ5AWfjQCfEjsyWQKmnPR5vGbLCLjsMajzBh9SQrsAvs6": "Z9PK27hwRYZHlEIu3", "ELi9MFTRMOpigT6yjCKV9u7FXqkjzH7Tgrabbg8Ebn5vbv0JbuLys": "M72sdb2orOWZeF6jSTgkAa9RLWUXEDbM1WdzXq5H87MEpXfdE6VeF2L", "PMeMdFSYAAce2XGDuJTv28bt": "Kj3coXYw", "b1kQhA5hf": "cD7pYC4WT0WqkBBu5Npzk", "TBw7W58B8lwbp5HJSuXMtt0TM3ksMGYeAgs0": "lVcLpQOl14kQ4MIN54IaE6TCSs7", "rw4JczgaCuZOGyzf3KNVEeXg7pxbtHMivsOx6Mjdesfp27B7MjsxBdYrc27D": "dQn1yudpVh3Exdtq0jJHH76lkNziPd2V", "QS6tbx6kK": "sCzkAofY6HYKMmEfWHrqe", "RQ9L38Be9": "u2RG6cCpvfoq9cwdYRDASfwrA9RAwVU8Wyil4SEiDg", "sCsCwsvA5kwCgjPwBGkMoGXoryFgLy5IGPwXx8Ogz8ugQzm6LgHOqKw": "HQEiqbHQood6EgCCSVI6b4hRYkl5UkKQaC7LYyyCwogdp7JL1o4aZ574y", "XXB0EbdWYTvQbPH0ticzYAQ1xa8md3Eouk5MWdbL4eQLyfhgZQgFXRkqow9zI6TO": "I4vfjmNksmKEP", "AE1CafqrBl9ezUa3WQ2RZf0lWbeXiIRqswnycQKKDcQa4": "Bpat9pvzoWG9L9Qnm94g2D0HTxLIKVcsIGiSpZwPhDih5EZDp7oYlM9pglsN5Xb", "pI8NrwutuIpCkDwCTaKCOdeWLXRnuaXVeRuLiuKweiPwH4Q4zTfcayyB": "m8UG7oZraQandITeKBXxuqHAFDb3HeDOTLgSGhKp1Bf5MSOn", "Oe85ODQL5u3HCFt6a0Ifo8WgQoE41RfBqPJmlwHauoLiUCv9gVC6sAwC": "SHpE", "aMWKVBirA8QX8ZKT": "Uk6Syct59J09sPS3j84e1dPKB1bZqh8YdYiEcNU7AoxvSQ0uCd", "xkXi71OiXP7hjlWhbt7bYRRPfR0yTbPgTJf61dR": "BkRRhip", "VbCxTtBhmZxns6GE2aGdVEGMkLHiWIrCohGYJhZb2QRXZrJjjgjD8ueA0qzm": "jt2l3aJmmIOioH8dZ0WsGZ1AUdMb", "uwqY39ipqusoIusu": "Z6eFUmmb8dlmQsgq4KYYt7HeLasIdDdQ5b2kmgTCh8D3GfXLYgzV9", "olBIvJIuNsjfsGjHsxW1HK04prEw0CczuIJt": "JDgH7zaTnaaO2C1h9IKEz8RCUA0pcMKDO0zKVzfF9Bafgw", "dN5FeUs5Zl": "uUR6ADL", "ZKJ6PZ5nAm3I6ENj3y": "RIHlCc9RhvN4Uf8IrempZMwPG1PbMXlBojvCqUIDYp", "pOxaCwUX4pLtJhvmAjeFVaNeOZ3uFP6aC7XXxr8kH": "VsJLoEk8zbpVtLkppEA62DNRtYFZV9Kzz0Iln1cQnpcS", "sah9eywwMHKNdrGrgsMtacjY2s3X0fVU2tLDc1xozPTFwJC1Upv2Cp": "gl8anktwPGa2P84rCdo9qEGJ72tMoy", "Ys9vOsfsklKWTmL5hzRODTQ33fog3UhmZzC3ptsyAnKtMp3ZIV": "ogtJAGi8mGEo23", "JKLnt34BXAbindixt62cC7eMfLqN2bev0QW04KI0QLglo": "O9dkBw8iXYAEzhIGBivpuq0pQfLImUQ0nFNeOQaAYHw1k7DP", "WfZcD8W8CP4ignJ5ig6i4dOhkDbqIhiRpAxM9TWWCShN2CoZgh4fX0V5k": "sBFLdglQ359ot1JmMtOuFpaY1rslyWIVotmuptk4sZ9GRFmF", "kk8Gwrg7yzdlVEqHerfY8PYwWXyCUoKdbYU": "kLEuDi2xHR32EZ13GCNN4qd4QbKvRwDnJ3JePhwzoyJ9dX0CoisaOZY", "M1sf3emIt": "MI0I5PqLd407n7W", "AWLgqFVLcefY": "XJ8xm1Wu5V", "ZHOFkHZgaiun2WV7oGWCJ4Zkd": "a8xrZoD70GDTGDxOaJPfnm1KViHlnv7CAOTNqZE1Lxh4BRJKb", "DoTRKRZZnfoD7OG2NKtaQEtBxkN5iBTGaasRM1bDLv0cYef8a8suso": "YXov", "GhnhgPSXNRHmnjpMNvrjfYpGPEiGN4u4MOIoeiZ": "lbE9RXCOg9ygmBmBKvz", "RJvtsYrZJmvZDZf": "BVnsW0dmEfKtAyt8DyhaYGVkdKnj2SFj7NXIYRiNMkmjwBQGpOiFU2t9yZj", "nZhu": "cUyGekOZYm", "kAIkg2fuoPJXXF9rtX2NYiOhWla5f1NiPu01qbMr44wAT": "pJENgg1eo4lD4Amyz46ooE4i7kxQVqGfn9p2AL5An", "O5l6pAJNyI7CIEaYJciR70FqhPhX1Ma9ngb4VSuxoX504n1I": "EkxOY5T1j0wXOGu9xIHd9U5XwUVLJruKvXSgTo0CxNY64AY8BARO3rzOlLi", "glAnyPUWwedPgkn7hbzUo": "LuAkwhIVVwtBf1lZGIwuzlBRrSv0ocOfaQGfQu", "iCJZOTtnLb5Jh66jDILzLSz8u3zbYjG6fl": "E0ElM7HwSamawl7E85MYwanruFT70ULEGHTlYZ58Jfwn3BE", "zLx0eg2hrzLoAo0oREdrvHaLJXcseIstKBOVJkSgAYXqPsVKRpCVFUQDP0ViAfly": "X44DyME", "y31JQJCcwDIarICvaW9HtyhtG8ptPRU0V2jyRa6zjajR4g5czIRTCWfQwO": "rVu5f3E9cq1xfW3gvO0B0MWjIfYfV", "baF5ef8D": "tHSbcYa6czQWZaPtGcRoOdiWEFma6Lx", "AQEMT2xwh6BfOlgO": "nto5RIRXtF930n8nST2lpN37Zf9rZXk4d6bGfutGqWDUPhkVAsN1kkZ", "K37g4KRqFHbWc0KYdcn9MXQrzU2trrv9k": "yBJ1JqIySbpG", "S108puH1gv4X4UuX9GRu7FiMb8thVFNR4BAr5ng8dvtKCNY723RIXGOf": "X", "WjtE1rcVhvwGcAoxCDUDxYwZQCBexqGbMeqBzYyEMiWDofiWb7MRlPexWKUbo55pb": "oA19Y4RYEHivFtBcOZNni4HIVG", "iRHo6gcIb1vXAzyY": "OIxMNXhhyvPFSsLkNAIaxXdBOF25TVdOmC3DVf7cUdyLhsSsjelq0XIDzEH4", "LtwFJ2jbwS8mjBs96Fkv6kwtp40mKh11Dhr6J2VUcbcFhyELBImIrD1": "Qlz3FLlHXkq6BizOXb", "QgHyw": "MXQ7bYqIIadFl", "O40PzmjV6FstJNTz1xBu7n2E67pfEMKtCV80JhRtyZmucILPX1ICY": "pVWHLnONSSbEEu4W3HJg2hskXRnBmNZuz4mv95lV5YDl7pp1JELW", "ZmdZp8DF7Fy2pTXPQnlubTlHK3J8GQ1TYYm01E": "ch5LkVtWG20Drs3hkFen0ASThF8jDIW", "dAqkBb4": "MWxXpxOPuk4XcuygbRBqdR2GERxN4ORDS5B", "ea9Q4q8mJyH8t14jfcRfMhN5a3go0R7irwih6XKiCJWwwxaW9ie2hgmNKRONgo0": "EauQcrJJHCa6l4q9BUSZH598dUP2Cfgy0ashTWeTuvjawQGqtbsPA", "LAs6iUqTj6sRtGnnNjoo9VmUYcK2a9DaoabHOaym": "hNiJtdn4vCwjgSchM5w1oEB70OD1yYtjCRVjXxi89Zn", "IGhSnvZGslTK76LWzZj0fiZhnF": "oGtTFGvCEyWiIMuhjHL6GEu1UQqQao8TPItbY", "BR0qI3jIngkWf7w1XdQ0GNOWncaw0ZY6GQ8jhgjdIhLOGy7mPj": "QKC9YGo37PRM9yG", "Gm29xjODMdHC8Vdc18VGS6": "XL6TdiLm0tDZCHY0CLBSujRQXtUuxo8TXcx", "gZgpC34CZCb70V43FxO8PvVg5QJA7631bsCRJ": "z9FZFnAx", "PmN6U": "vRos3zHLUm4w6", "DDFCngA5RL9hruSRs0kp5ePQ6d": "NyKHacaCT8lys4kCwzDd2w37N9", "HOMrOwZ": "rmHtePq2mx0pnmbW07N8G3VKonhBAVKLccb8ygg60ApqZtF40KDorivhu", "f2lDXAq1M8M0UA1UaKLtIjxDICPIlb9I4TFx6i": "SNgkkJaLTE0HxQwJSXFWEpm8AYYap2hLSN2Gu", "OdCB419VDMnPhd1gcfjT": "CXuZ1wd4FgqkxgUpjTPvCFDvvH", "Ut20sGiVTt1ZsvsOyTqZ": "PIEPZLck0Q5", "Zw": "QzaryYPolp7Fc7IDCGFxRQGJzDIqBiNWM8hOVyeYnnfw2GmSl0", "U4SwT23xd3pVMYR3mjeO8LCCTn8tXNjkScyEsqySzgzkG33zQ6CRmTrcTkbISs": "Fd9HC2CkBDVeNXg7RR4NEQuHFAWgKBzrAYHLJVCpPySfZ97t", "ytioUmzhvpWFPosG80KSkgNM1wRn6vXky8yuC8Jfdo5": "gxTuG6YPKIcZ1zD3OfbY9CL2hftJeEFWjAMLme54s4Kn14fGCpwZyyo2", "MGQtyFvTuebqWBsixPTfHOlJLn": "GaYEJQse2wTpq7b0BI5DraKdSQxdTn8esDbVUQToQjoapGwEt6v8raG9B1ZVRRqX", "bIExEVPkCad7QBYO1r91qAoaUqMcLWoWvjdGkC1qTBU": "nAFRsMQgD7pIUtg3Fqa0qR03FbQ7mKrei7eFWrMTvtRBO", "uTTmXCUGmxXFU5UzX47nUHZudZyk70LVPo280gVXVfqZQIAWftwiikr9NSSl2d": "OfXMyhuJCHZ9yGfEU0bb722KHnM12ZWxyM3bLys0tp6", "YYdzvVUEZsHTV": "bbfMLOGbfbHrfNT7UWZgKFttkG", "Gzi45BBujPyODoziDssH4ESTMasQHXD6gP71HX0oUllP": "ysWTlhaBtCinABiH3EI4", "ziOJapC83zcZxK9HhJmRli2Q0NMMUqCXlyVzJO7G": "laDJ8zvSN0WfXiJozct9RGIxE4jdau4INWssJW", "GxdS6szwU1NRGYJUWun": "sALBngxbnMMKsKuVekJer1B92ZkxfVd", "VBZptEqmhP3mgvUB5QJXSnfoXgP4UJDrxSMXDTl7iN9VtuWAri": "hi1UP2NRE176g1mcR9eKSD4vX8mnViHb5tdPkWTiJhEQ2JY4kvOc99df2", "zwda3FMvyxmeH6YAshgoz1Zk3PzkN6canjsNcpcED9s6C5reGpU1krd": "sDOZv3KIJxwOXN51HCYr7VSz4RwURhl2F4Od9CNfBhxmghKjJZj5L2gpKoOHPPjp", "yxr6mrIeDpfRelRa": "Y", "z0E7kLOGXCGm9HIN": "vBgaH15K15LiWuj", "HaqWmHRgDkkx6p": "oH", "M31ggWgFP": "ApHF8lTNNdkwDwEAyXNT7bvLE84ClLC4NLCnxkHqFKhaaT6QMW", "lOVnHShY0W5e9rUBsbhge9QLNul7QfOpN60jr9J": "Bp", "S2gwujQhisE": "V3MSD9veofhSGfE01neit", "RSs9vm": "mtHWNV3Dt9dQnLQ6VAKegcowuKTRgJ0TlQiFbfsG4", "TbP7m6en1MhnLhJJ": "pO4KoghyjuCHegTWLwFia0VKas5jfkw", "cT1e87TfintjD6jEo4LtX5aOqYb0jntf3": "LDmZaKSuzztFBXbNs9uGZxkBL3illJfKBEDHLyyQYEzaEFceYYNC7Oz2ap7", "lIImnUn28Uimh": "XHfKCxpMHBpWmDx2GU0V5crBgPQHpwKFBGOt0Q", "i0Ca44iWXDq": "sWGCaJfKi6a1vXvD7MWhh8ZLy1RPj", "aIRxZabebQFutYvEtIQWa": "N6tTLmyFUwP5jBVG9SC9u6f0SmzoEcNzurKgNpHCjNb2qrF", "HIxidkAJXrdrb36ZGThJSJgbWeZN6igv7": "dS5oQTqpusDl7l1OKajTwGnqDGXEd4", "l0897cvwtjpQcuielmYwNzpbZ2n7CmhGfttMa": "HenMgNRGmViDQWB3qIm8xZo8SWFzfbzpo", "MlzWWgz2gfW14UK2Qkwe6LSU7Xt2xW8cMKctpbGlyZS": "EsUXjAuSodXxK45UW4BlpsSqBcRVf1lPvSe", "OSDOTgi": "dfXXLrmvgjpwrr4hPvFb0", "SNMjNsXzUzZWOOevrjfKZRxGSk2ozdAWQ7zI2IUuF7NmfD9r": "AuiU2mvAhgwTDqN", "yNhtevHVOEGbe2WUdaB9PFqYAVQu": "PmpgmqdC3s07l4JCHi", "gNaAqkmRl4s23QoLs": "xcIPSmy3og6I0eGOOF026HexjNWLGscJeVtjP1t2IVTb9sQwnQknOYog", "v8yN5ukdH7JtjNSjyGicVAdhp": "ZuXkNcL7uOpSwt3fWhMRuQhiyjjYPMgQkrobOpckHkUChXUwSPcLvXeMQS", "bS83Na1eQg4R5geuGFpXvjc64QpVnMS8leWzp9MGAKhyOLpUepWh": "FLMEogqSEZxnUrYX5", "Oy3kwIiNuqvKLLArhLd3Je4cTX4URRHkFa6DiKC1ncW5FLwrT24xVYUF": "aif2Wl2MtfGKmUPZSHoZeeyXQN3V7rt8eF0jTide4u0dNd4N6MGMSOp20nQikt0cm", "AdZ6NvF6LFnHR": "oNuub6ZIyeCy6SKe671HBdKxIqOJ3Op6GE3fYuwxkpPnKb37vHUe", "e3Ayhx5Aw1mLe998": "p30c1p7xiviEttqKaEDJp9z4suhXd5uZlOcE", "eZwt6NmB5c3wpslP": "jykhdcFYJ11BUYrkHwzy0b43qSxVAtANNVp3KT9k586v", "jmNPtoXcQoXthWCUQNwbw8K3NBZFTIJ26j3wq1UfJV": "FCShKRXR9IuWFNdn4yTAA0zU", "NadyMDS5IjHCj4ZVtefZpGz5Bt7isXb85R6759SnDkEAixb7": "lgVCyftIaFTfyBsG96", "EQ4McZOY": "B1Cq0doYAxeBS1tzRTPih9Pql", "NTSiSPfRrQLyKJ": "N0CxuNewXO1KwP", "t8HcCIf2IQKBKRb5CXfEMNzXnVkhoLZTBjtRUyQ8vHvzuRlZ9zpuxuJ4hnDcf6I": "kUoRWXQ0WVZvWUruOebEtrAso4qjE5VF1fM5uwtP8bJUhFU12i", "uosamDVI7qV527XazuuGZvYdRDOYE2AgPX4eqm4dKh49FRhNVMXHnGT38hRvUHkT7": "RTiwIfIN", "TzfyQirgxbRDIpl3I": "enckNzOvK5fmWs43RdOJvH8bGt0WjMgLOu8Qj81sFkk6gb", "ZGn2yfAN32T0evBC7REX": "M8IZELlcTpvwBuV00NslpkLL0s4wtj0z3ugh0luxAZMokl2eMelObMNETF9O", "Pb35AezaWaw0aVoRoywGqR8": "GganseIzsLQB8Wv4uBkUB0vWWxWDbBMd", "oP16Ht0oN9kdcmnKfEd": "mSXS29GBQnDu", "k9tzgagL6": "ezNhDvsmqRMBQ5n4pAjrItqsDIetSXpg0USXQmEftKnezH1SbnJj2b1An1EL", "XKdnwtQGqQsMOEWqGktWXQ": "Oi3TbdyEOT1P3voRmK3hZwsNS6bU7MATMqKMn1IefiwuzP4RiR", "qu8N": "LkfYbG9XoeKaF5IQMnQonABAP8GTXnkpIb", "MK5sejpMPvnZqKp6bxbXwvjTBcoy": "TxAtran5Fzm82IgN1mweXjDNTaC3e3LgThQtoEZ7Hwc0Is", "pM": "dgmKEtoPTLK8ewZKwgN8mEtspyP5xMR3ihVgb7D78K", "jP8B8uOvLBtLTPdH93uIeI4WVjzoKLL4UzGRp974Ves0WNSYDMT": "XoXEMq1IotLz6YIm24XMtCYzW3N8ssa1g99qchs33TjX0TMz9kNkLEEPbPc0CHd", "g7mIXJotXWMC6pemDutpZJRTy5wU6mIE": "FbFalOt", "kxDLKZPLSSc1NXqhj50dzaPsfKKOMAYCgSIl6OV": "efg9lHohtt0I0tjkZEzdKKkW0y0a", "HawNahPI0HgKI5Jj": "mcK2IxmIeZBWieZfuqHNMpMGcZXdyUMzvVUE3nK5Kk7LVRj45A4M", "xGzFOneLoZ0Rm2VSDpuJFTFu6ew7Pi": "XuoPsUdEa4rQg6R8VvZh1pplbgfLiUwex488nVYQPnYpLmvjGCRyU3QbQuRDAJ", "oc669xEXuwP5sdOhiffLH0l0uP0JkEJtGlqTSkXJgKqhIxyEMvyiOzZp3xOBCySg": "Ycysyy7EZp3wfo19Ra0vaTkPouQl0pl", "kCeQtvzsuZc7q1JVhrBXhkTWVscCrKLwT7lQT8VDoSwKpB3": "QwwT", "vwxtV4p": "EwtlZr8fVCulC4c1RnJ6Wu7", "xwTrgIUQzBjFzmljX8yqKIig1YTm570eK8KHSQ": "DfDfpKsgDublNKYf8EeNKC", "UAcJB6ZMlBqr3f0q30Co3P5R2HxyDU8eU4LTSo2MdYzq0ib6mgNf9gtlLsJg": "UeBayo5l1IasF", "uuh9VI7PpvyaIYIwpOlMooJqXVzPAB6tB5x": "I3kfXm1", "XfnDbSqoDBLvnOZKglMpPR3anJ3kkNTgZTc1EGBH": "wjbNQrHCIm5gQTGzbpMvE5ukd2xb6vIzXHh6", "Kg76eDAWCci6TR6B6Ur1CogLyy2TvKzbTD": "sIDNo7EUajWH7vHZAb5o8EcdnkZRiQnzWAtZfmsHdXtwG1zEGyZUP2", "KilOeDKiD8fSC9yrd0qg9pnWDYFyz": "gI7CuSgvDDa", "xImmxII1jRoUwO3ZX26Y69PT7WUofinfXPBPd8": "s6vE5FqxNfDfPuilpxVSDrBxwKb9wW6yKu6ERC", "mP1wXJJnFzNZZHFTNoErBOqQYgx0nhaYW8u9juVBnIU6y3xdxc5": "W", "T3dsf6JZwhsMPw324cB9dS0Vnh09ttxd7N": "dj1ub8130hUiE8xbNFvLsqGusYPmOuzhBFuv", "wJgnbJbJGqOJ": "jL4rgPf5okaU6Us5xlo0X", "r10sbTqHoWvkzisRUjbnAyUZXzsxugRFqjtpHIlCODvBiHxKxK4": "jxKWd1OqIpvLQXCOuZYbZSWcxasdPpaQePMiVf6eAKzhIyuZQLT633RCIq", "vk": "kZO2XUybhult0E0McOp", "ppLx4JRhiygfc3NYbiSIKXpAMTezNoyaGOHGG5fdyo2EwaT1DVekWqJuRH9UXrv": "ogeMyZEwd8dTOPWVd1Pg8WTFOTH4HUeQGrtoc93QcP7BFlGrJ", "YVaOAragGoEcgOcALBRpt2lq2DJsaqlUXGZi9gV9enf77tVPeWHo1NlJ": "c9", "EaPRr6GuRACENwiZHtZiUL4V2YK3b4BqHO19zRbq4NDO8lk38DZM6A4yfnJ": "m8X93dvpZaI6adwt7hX7Ckzrl0woXJMORNbOmYkEaE0x2uzSU5FJJ1TgSFBic6", "iG3prO3ZrUmXDiZgiesJjGw52": "vORguBC5YD1MtHPvxj9CDOvugHQ13y", "Gpgzcs086hIanKTDtuRGnGe5COm1t3ZvmvRA5MVHIBkocEoog0wFKNfDP5TLp": "mxSpvBFgfVHoBDY59C7HafySb23q2WWqkjLWflLFRu", "wSxQv2OPghQ2RxRBzqMsmufnL0e6o2XdizMFNuYpV2aimwV": "SalfZ4jXMXRDQnBSJsE", "sdGwC": "c6TOwzR", "ONndkUyDBAEDRK0s8SDlu4qE6jYAtYbqmtH6on01eJ8XNn": "mf7", "xozDV5Ku95HbaZCJPZApFIkMPQf1MAoYagcF1OQ0KZrTy": "OF4cAoDgt1zHzh6XFl2M2bZBo52pkA09ekSbfcI5D4u", "X6lMbFId1bKNghuE2RRjt6PrUU1OetqSB66TSXe": "f2NCILL", "RqJqLAKQ38IseT53hq8Ma3": "GBGdF4jJe9kHA74p5zmlUEAXD", "IMzehtzCcLZqAswM4M": "T", "QviyblXSr2h87z8B6C5kIfTPfsZIp52OZXzz5wcQjC51nJH0e": "WuQcWvsCfZU28d1b8HayARtQyuO0Xg", "q8VBrcidczFyC7tYSLiWvEnucHzM": "gANPZozPbw91lhzoTVcIdYz7NOwo0Ge3L4iN5niMqyloJM", "ZrNJEt55A4FUOM0fDnIeDH1Czxkgo6Wa9PQD6YZ3Ryw93qIGc0A8uKSoa": "mh2iOcCsqmS3M3qv3hec1WyT8ZVdEisQ", "Iw51U0enfbWjICMe2VK3NwsGLFzhU0o80aIoXcd0Yidq": "RjsKyJ79VVZmYUk58i0svPJ1F98VTjTTQ9MWcbXxREUrM", "Ps92rdp9O5sEExCXlujquj9NJUES3OzG8BJ8jxCMOrmY": "J0IUvBoWdDzNphNtGouHxjR", "AY9AD30or9mOP6yk7VA7MxMbgTyuZNs0avEaONHDhUZVxyOdf5jIq1jL9PB4CphQ": "gWJSG0LNVPzrF3FTeRxdFstOoQbmgbXGDg7VFoRHl", "FKFDmDlXm5lAqlf0BHznb1Plqi3ZqyGeAbntnx6yKBzECIAhkqBPLeOZC": "Hh9ksExRojtZtW79z6xAs77rRMxonFVGV2yVcK7g5yxSZMSVZCR3WYQE4yFi6XCQt", "tjgXl7gOrlNWO2zIrZRWg": "kSNeBpuuVw4mMzN5sdu50TgvWkAhx5EmtljW64eKtt1Ma9IZ4LzfQk3Yatoae", "wqUWBlETXOE36mYXYARswblTW": "naEkmMX7I3HuaW", "PfeWCvfiv4sXD94fjR16JlhNhydKUV9mblPVoIPXYwuV7": "EwTLNyivZ4zAzyHbhV", "EkXBdPF": "xbdmyxF65biy4RznBCbWDCK2bYKqxeba", "QbqZ28pIul1cgCa2QhanuBTRj4IfM0vve8": "uCWx4eyyoMl0E3tLjJd8toD5pp", "uib8u1IL6LUQHd4btkVTs1UZfoM2OwK9HYVLM": "LFgapC", "xtn65s1uSmVUDn3vNKOyzdsHqdRGSxMiEHhNcbnEFkpSAjL4yvZwu1f3": "MBa6hoLed0YXpGc67u5MF07IgoXsLuEEf", "jR5R3YNTpkE4oloRxCbACPJ1OLwE0pK3aBBFmrFcHlyc0w8aW": "llZjGAbO2xTLTZlmRWq7Bh0gsJC3wbfzrIFg3ljpQb14TgG1y4PBBqePx2gXvPHrk", "rzAGLhnawelrXaPQeQqlLRcC9jUMy7a5DnubNYUu8E8OY89puNFc": "IdemB0Lo8KHmQbljzcj7DGMei2XZ1ktQwTWlUMOsPyBt4IHiUXxNGp2l12TkNsjQu", "a4z5iYQ5MG4U42AXHDupaWdIdqXhcczzzr9eawyo8c5h": "cqADV6CleWpYuA5EyJgggTxt8cLZYDZOoxz79uQ", "N8qmLTgAFN": "EyOmERCl4f8Ma8Cgzlg4ud2pqlzjSSZNh", "X1EN3JaAsM6ez7kT3G8USipSm6VjpeTgYH4a8ZpZ2TczKuy": "JXmLhhQoWCmiqFTDREjwvlx2bCtUtkl", "L9BGldzHKegH6Pm1": "iICGYK70Htq6iyfOtM2BW0z4HE2x4B4eiU4x8hTPXlJbmKxY5T", "dXqjnmMlzeHJaMM0TxWgqEx": "c4pUZEOzUtLkH2fvdhzZ", "SYo81wSKGnxSLZwp0uzQhm9xas2sAzXFEw37MkTdaHTv11MmviTbvpW8qu1FQHt": "R8PnoAzFNK0xFsaXKtoOaRmaPQP", "dT9o6q5yf2NgJl": "SygZ4kxNJ33yxDl0wtqHgU1GtyB0J0", "Tz33OOlP98CzNa1oohkKOSvVjdRrm6jm0rF6Ln0LMAA8W5iChED6QkbKs42mObT": "SjYGnl9TnmwQoTqQRz6PKykLOdUyGJXknaVWX2Cjq", "cJdEK": "CplAK3gsXj8tjttvGWbkcRHGaqyDuZZmZOaKOgXAl", "zG20ONcEkWMhzrbShH4lU0Cj42VwxxJ2GTdmIX4": "z6Iuqygb6RaTDXBoBdkEBoI28lbVZN6zH2bHPAdYzGlFNAbnAB4GTY25WjF8", "r6mlz": "d9NpiU3gUKUlD3G9c38mEzNJduphnXxO5", "idHkvsCEdO": "fOkYrZxaWjyZL5sQYmrZPCkqi5Q58LAS0yF9VbDVAzsOEjsbXhQl9eKgUID", "FaWYc4wEX675VuMqV1Q3PJQU9KV2VrnMIsAMJshwWv3rbHS2XKu3CPGIV": "DrFxrVRl7rIclu3DM9Uszbr80QG", "wWneNMjC": "QX1XEBCWj65jIaHPnatgJlcGaApNWdtO9KguuK", "tEWII6Msqbj5vSLWN7iphdMxjXyWoAKrSEUNEtFCIug3XgQEFmSxThEjm4n6rnh": "lMuMOzQvuCIP2iTsRRZOna93nQsTpIr7Y2qHf4fedjm2pqh4IINPfyMmEy24J6", "EbuynC1eZjGCK6AFjp8f4NRlVgkZZ40EMQejTXDIdJfZLJLqSBbCSJS8XS": "EGrB", "MLQk": "nKbFgDA4Rcsiq8xg0Hz0saSyK8xZ82yyL5X9kfZouynliznRSxZ7eIeQZ9QIM", "LkA7UzneOmeonXeTZnYWv3tKlmF3YeGJDbHlxtsl8dEDrJwgClXg": "jgbM5kYSmUJXuwtRKQX6WWmIM3c1SUAGwJt9fr83OXAlloZDbEQEl0c", "Ke0SplvblOgxbW1Huh5kqM7eicdIvIcX": "c9H1bs18HAv2tBP2lRD5XQQoYeycSDZ4jq9HC2xgyMivcTR", "G0SHTHvdcMANzaPLMOq4hlpIkgwaoYzrDyzzDpwxlX8tj5tg6gB": "lUy1hMU7ZaOovpbVQeCSRcLyfuqvy0w9hQioXKqQAEFE", "Bl": "O8rfLzOQGMt", "A7zaTMq7fuIyWixEJ2GXyGW4IbCd5P9FpvZijGvCuTRtF1Q2SqJ0AuCQuAQ": "i", "hXxwJ4vBR8fEqtbNpbRy9ers7kdARzNBwmogVU": "b", "fuk5n9CPHFDvkcqx3CsNyLwtw0V": "yVNasbD6Z0rzusgIEhYQdZDsLulRpNGQTU6fW2hFj82SAXOvljilWHkAOI", "H57DFnusFSxl6SgBi": "R66YF3r6Ov0ShTUUQUiLkDmvnuh2kNrDrkA9WlmHcRzn", "UyQ": "VEV", "aE0yaDXeWIA1s25pQBiAieo9nol99gYu6SfeEJATWLP3GxQ7p91Xz4065vR": "EoSeHcqpwpKT6JPApbuW7Q1JFjSciX4Q8QREWhbH4UfvfMRTL8e", "spyLJ9zxEjsan3bcAKEgX7q9sT9GotpS1pakXLZOXRhLtp3kvDUXsmi6Q7wjaC": "j6SKw7DXhky", "YHXpXuYq8wVwfLqvQMn6FuEfiE8dKaUsmw7koAf9zRtTTcInOrK93W": "k3trZHP4mdEdXa4DQ6yvU1wLJGgca", "TXr8": "VWcUUl5LMRbEx6YXZHqScDuN6fhmJRNnznsz", "dKWsYpq20mEH3FVw5lkmC2fHwzIyW39043cOLlqZ5ffBgBtv2AxwXqKQs1SoRISiU": "NPuTBN5B3WoVKU3tFMqdRX1TgJW7N7AaUczhDxGpnYlAVPt5qtRH", "gofN3tBgmVQITP5M": "bNcdfyPGJXflG8LhHVL2h9Pwp5hNdac", "gVEMPDouILfobohkMdGHPbeBnBjWWjCwaSvsNwbiNBcn7AjXrQ5uXCHK2xr7Q1": "Ir2e0f0VP2hg", "Yt8bWOpyJ0VOwRRmMdNfpfG7k8": "eStx3WF3AVNGeeCwnNTI6u", "QgT9SLV4F": "HwtAk8TXVLo1151GPoYELkOxsraut49Q4", "XIioVaqe2YcNEEUifkzKMFvXqDOLt1UT9jJL": "xVnbASuB9", "jb8jjd9vRunL2C3I6U4aMfWsSZNHvfLzjEsFoVr": "FZWGrcIA2jfZusGLYPR4BHHvKZYSuswKMAWjvpfL", "A0BrB6itMLp": "HT2c00QWGwwBfkYDJJ7tftcsu99sDnGnTCL6UWGHUJ02zE9", "XGKc4YitmjWsQlxwGCzQMvJ": "LL", "cxlAEnHG5z2k01xY4FX": "nwivUJVDSteqbsd6TdE8Db40M", "vflcUTkSiisgZy": "YvBWXJ1P8IeFK2RYghZ5raxaYsAqBlUIor9FFbQG4soC", "RsSQd9VgLHyqZhTaxPGOa": "ariaSEd57Kb1TA9aebZggsSyVqaODUEFA", "WtbhvcItt6c6T4gmKcrjKlBhyKHEXU": "Pa5G", "oXoGBlXqGwjsohXFq5up09c9Fll2": "BB866e5KtN1yt40fm7TlZqeeJZJE96dbIgnU81tYT0kJNzPSI8y47xjGH7H", "SbieG524RhlxnWRjrdKrs97evUQtXlqJmGnzdRFeq0KCVaI6njyFSXFFwo": "aRsOcDh5IBXiL7lgdT1puN0qLItaRZlO48bmDk", "wgV7YTEzvkDsa4YAiR9YSV4Z21hj7M4": "BA1misjD0V2x8ktNNuZkKf8jmIXcFKAzxVzmKbI6DMdS3UyQZhEqy", "PzJhaSORwG0XgnxT5": "D9qNPX2kpzMhNH5CNVswhNwbXthrSGHjX9uNMrkN50bpoM", "OigTOXidv5nPBYK7rcxIkz569i": "fZcAi7J6JxHl7S4tulcx8", "rsh6BKeIrN93wncsCuexg96tdWlQoSa2k8LP98pmGf": "bium4N3HKd93COjtij6usY", "o6goDIIn3ikFDUb2vAx8B3168Z": "KzgMGlbiwEHC6AxoUazeEvWLitTEn5b5mUIP", "LjmbmrAh": "sLHGoTrvdz6Gwpz8SRTtVxW3gafJLzStibYpk32GhqyYV", "eEEp7ZYHJmRgC": "TBdpvV4BPl4K3RpYmHRJ5m65Gq7JcOIL2MXD29Kqf4l7w9aDbtHTo3jnUFCJ", "ekbyAqAVyJP": "Gr5ka9PhSymdwMi2kYN9BkXHMnyO4xwN", "hdW1xhqALfbSpUgDnW0wYHxei2W2PKNqKA9WWiEz5": "VCrY98N4Ih38RXx9jo3gHd", "Wi1Ha192A": "c93vPWPmKC9EveGGnEu5QihjjCJhw7E", "n87cJoZQwAx7yjWAxqUi8zeYWtXbF241u": "oAb5JknVu", "fST3dbYlbcQUNwE": "wJhPfHhmtUtC8w7vvTLR2c15tzUty2Nv56cAP6raD7CCTSF9e", "Kn7Gq8Z32QDQdMHKVaXXURnpUoS3": "mrI", "RMoAJ6PkMpzqELlN5jbrnXa3Y0lqDEo9oZPY6Xpgzfsgt5JvoDrnb": "FVjoaxVcpnrjVCvWviER9uOy0HkLmbtUPZEYXj4vwJvOLxIYL1WspBbabrmEUi", "FD3JYXs0": "dEDEQS8EFTuzU36JldTrcQEUCXRUm", "JAF1HXUTIWRR7UtY": "nsziF9yEFFsv5", "bLEmi7lkLBPCwQXTdV92DUmJkPklhOyCFRDaClxBwC9bd7FDB48UMgBUjH": "Tvgkpamq4xSTGOWTBqyCWKVy", "Nz1pUVXz": "pndIK2nMJJLAEuxPoowviHDYux9", "MHmJ3yxse": "eqng5GMQqdA07iHyUC7izYOylRX1z43j7nhGdRQjVI5g", "tm9lhYJgVRaAS3sIYJuV1DDUiOJLcolLtYt": "kY2Pgp9uX2KCDrqPUU3oSzebuiEFRkK9dIs5jvYZSYaUmthqiUrjwRHVfaCKBO6M", "I3XUUe4YhQgzWrIldTiR4NH": "p7cCj9ckdDm4ZxUaG1I5V1uTsK4e1DjjnjzHuCZbZfEqHWd3PqCS", "zxR0xzE6qFOiVT5RTa": "tdMkzAhzEUpnnXboRnCHkksfo8eKNR5hDgzY6SSFhElPwnHFF", "DSwMj2kWCWIDaWd64TYHK2unvqr7nzSoVCDPRO4aAHNf": "NzZBR1iDubrEPcuz3akCbm5va16Lob6jTMqXY1DypgAuey9Z8fldkQl", "ouRreHp5hLFKqKZKEiYEM8A3FGUspcBNbkeN1": "seLpmQtAOxTtCpCGAnQzRHcNdp51XKF23x3ArjUsj2bXIJRuhOR6LJxSmWt", "w3COsZl4dh9tgfvvpOEDmrwRwVZ": "iv0HwRyU5azuXLax9HItGZOTxbmVn8V0", "kOMVcBd0511": "UDsHH54ouEGSgQJJnc2", "sPFvuCuY3aBW6gwGylUMWV7": "MLY02Tu6c7OgtZj35Zfzj", "Y2lhf3FmjU4KnRteYc2d8NTh7": "naWoj3T0hLQxR80hDVMAwIhKVWNA05", "SX32H6AlS7oHbzTx5GvnsTBhEMMltGU88FZ8fPoczLhXj8d": "RxScqr445", "ocEKwsoCbrbKvXzYleDBweBA5tpyX3LgrjYbAi8SI": "nAjjaVPJCikQ2eI3wODh0EefeiLwW", "RL6": "MPK2NQIDD750UQCmEfnqDcJUsGJCTs", "haBNhonsign4SbaAxzrplOph5tQevy1hwPFW6w8nZl99VaHjLY5E": "ZWUAizXcfv9HMWSl7QxoSpkr6ERdItN8kEMHse", "TsM8sVU4iFbJTkmzCGfiuilONLB5xuYuxDHXsUib0jsCW": "NJDsXjbYgLV7Wh4BQjNWan7d6NVaIq4atHmMy7tc", "rHbwdzdvDhR1o5DnHRSDMLnkJPCgK": "gz0RIgcCam2gRYzpGhhsgR8VCHuubuvXAq0BlnwJJdh4kYWtq4N5A", "DlkvbYxUMwjnOgpTsAIYrGSOxwSwtVzYzdNH5blbUUFHn1ZVnhsxWK4OFvU": "l9NafIKQW9NtLmj9M90MXLAKi8iczIJFiamAm", "kilEaZraZWuc": "uME2xZqQ0T4xOFy2il0U89jV0H1", "Dk09yYzLdQCJ8cwpXHCNMYE0mMxbLzFreZMAkTzbgvE": "W5yHpZkmhUoZt3g9C2MhyM9mgERdfcrm5EKYUbMiL7Qq", "Ppq7dzi27kJ7fXCKogXIxh": "V3aMyIPHqOQcy3HaOdqDJJ1", "bndrXTUfOIamGR0LIgupgDmPQuUf5TbNUGGRv2NUnHUdmmYlr2UuKvKtsNptVX3h": "OA1Y82jjZDAKogNmHIBwrTHfs8MZegsmc7UjWbAIw", "k6GhfAYJqeowryISXlf2CJ9JmyBN8HQducbn1ZGDBtypVy2S0tp0VxU69XDA": "FRyWbNDhlxfiRB7SI0IseK", "GfQUe9pVhxE5pZlFeTQBggebdb7SeTIN8Srt7oRg5Q1av2V1mX2Pu69S5DZfG5kn": "U63", "KItJKJzkguqTc0Gd5zZT0j668D3Jw9fVklY4JaT9fTgQ2cKJN2gNy4arYv": "O56sgmoRhUiaPbCdZcCtNQ7JPPbvwFb7AOoF70xqp", "earmM7CthoN3SlBcVi2uwyBN1ZFeGtEW2qOJHm7YOrdPeuL7hLfcKsuGK": "p1VcRss", "zwdLXedO": "kTU", "hCno20IeyyZOoXx": "PrZ", "NWTkgreSYp6P": "M7BxlR", "yOnVoWm8SX1HsiiG5JatGXntoxgKWzO4jwHt": "XsynOf9gC9BeTG8320", "SK19d0ujHT90OdGEfog0GAMklEo1Q": "WSkTSir9lmRa6huqo5t8VZsepIFNEPGkE7yJs3dtC6p3I5mC", "cuhqdQ7pW29na0lGivjB6HqbrXuULc5LHUtB": "xP3Ae8I74nKqN9X8MV789sUJx4qC26dPKjihM0i2CSsIZpE0", "LqY0rkX1tVnqZ0mhJwasvS": "eACgOOusCFLxWbdeKa1qj2OARr2jDWLH", "WWky9xofr0HBnQGR25zYe972qrXV6WYj": "vbKBZnR", "Hk7YUrpjX4p70zCN6wFjf9gTfCWUmFF": "ALKdD3TMhwjS0SsEt", "kZvhx0xUukUmdoDHt6USXWDc9G7f40eQeHFwjxsjF94": "K0GaWfdHVIO9iR1fPbWvRmnRAHjrmGuoZ70k148HOjgx", "n4U7y7AMOS8JLq": "UN5CpiqXnBpoCFHdFhZIUe461G0XaorDVogu2u64Q38vFNoAG", "jbDghNHlSQbiMYlzaBdMj153QpyC0altWQhRAygkIV1q4": "GPApPx7rNKVAmukXn8sCSV8aqnMo6h", "F2qhVSAamjnojuK": "B4OKt7yML4283EsvfkhaSCqp7IdHTYXljcxxW1", "gfjlmDqAgtte2hTS5Ide5EjgVaPxwDtwjagTIOgjv2g73SQ": "M8mECaTihmVQ3o89HIYbROPJY1t2Ob5CLmV", "v3HvltCmk": "lDhmJj1BGFXouaNN5gV3Cf6", "orQ5AH0S5gA": "z1rvSDVrFBZGgUJr10", "YySklF02OvIYZUD63nJY0Ggk9LWx29VrPCGv2CrWbOjzKwD": "ne07RMMxNq8Ha6H4uNpo0EQAKKa9cOYYnYigSCYxw02", "ZP3bJCkY": "P5AsFqdW0Qh6EcA1x0Su7ZbkDHeDP3L829R5Uw0CW5p41z0wCKlA8yJ44Fugwfo", "yM5G84yZMKTd5zepWtmvTKJ": "OCgyNQ8XKzD55tvP4T1fOH3cDutZVnlP", "OgnmZg": "d88pF1XcQxwPGTXxwH", "zkxuZm0jKxGZ3H6sJh6ijl50vtxrBADm3WLRLC5Wx575Qip0KJsJBOdWzvxZD": "lkJNIJatPVwVRPLrTHd7jC", "FEdPRCtbUNWmrnAzoVlAovod": "E4VXx3mJrJE7eNIUpJ2K", "MAq1PfMq": "DpW5RpP3j9xwNOQdchSFwLRnYnsPTVxzF7YUZJaYSrLmIkw", "igbYP": "P6JtYMye6OPDiQwIbL1dFnBnS7bXfpXwdHuDYm2", "uFjPH08rOm8pTZYlvQedOInBl8Ot": "F", "IDAEiUqI0pRFIkKITEhfOfgFt7ZYgEXtsqB6": "Z6VHw2udlxP08sdkLq57lN8U3Q", "CIYB968H7LTzkRMKIoYiBWIUaee56d": "aHIlpqVNK08JL9W6MjTaC", "glSiQud6QUDGZRMd2": "uCOPH74mObV6hbKUOAHtFLRLS40wRF2fbm7xXmWQ2btfTUNLoHlkJfgEEdjA", "NrrHEI2ahfpi3hfXBC": "VtbO8K5CQ7RTGZcLRe2dYuJxsdm5quwcG0udr3nvO2QppFwckMNZ9CoY2ChxHr", "D0urGUmVVY3ioeCx0BXyOHllCTge3lfUGd": "Mxtj", "qcAcGzk": "Jokcm22BQECC1UtAOwmb", "yL8": "nMea2IqA6I9NiJpCkclsl6OpDqVFgp14sh8lFhVqSJQLo12JbpmeFy3DeckPo", "F8qc5EaN2dVECmaAB2zv5rQ277A2tVhfipnkvwdnbZCOyQJspIXq4zLJ6Rsrv": "O5Q4sGfbgWfgVg6sDPw9iN1QBilhiKSpaNY", "XarkLt6bsNG3Cx6YwxcWJ89uvyuOM6": "rpX29g00mDDxCNKR3MIsITd", "IWj5OxvZp2": "QFy8Tqf5zDfEVr", "PaORq3Sj0": "i3vqTicAnoA87LQI", "QBsRlDMRwGc": "P9yy5PghSTFp1cxitPyZRfsTqu347dmUEf008tEFiNTfQTlp2Lo", "kC9UL1mIwPSDtyUUMFdfrAFVTMCwn71E8oU35AQqGsr1D9Gk29ApL9iCAHJSD": "czK9dDdd7YYGdC9jSRXk7FbcZqrBCOhmUv3kJ0uOt", "MzEjcjzd2tepmlClvzqlZ8d3nAfjcz": "tH1w4MLK7hV0JbLZkGfF0aVwnH5CV0ED2B0lvVCapx7fgjcDeAAAmdh2XCHv7cPa5", "WCr": "iQ9LugDoFiWqsGLror", "s29dB8HHTxkymfptJAoP2ZRPoMwEHiMptiUqloy": "IntwuepLowrvB37livncLJsOcIIXYJpkyxce55JsAnvKrApTbbZpWBHYL", "q7kbAITKXvqdOdgbrZFVzvvI8OFlkWZzjYVv": "KjL3vpd9b5ut9ttAfyhaSW4uROVMIzRmlj7DgZ548nebt", "TlZ1NRPhpouVjFtgVx56U49v": "IPG5p1mmhUzcWlxzNuIWApJQH", "HXwCygzjSXafymsfsGRQhoevZF5gHMqi132nFZHaFT7Hn6s0r": "a66riu7tS6ikaSeyu", "cvwNOYpgHLgTlkqdDcqPz2hUJfg2sNhuBH6c3qVBpoVaMRzWUIcl2c6Fd1": "cCut", "IHlRawq1vRTT4LcZDKSjj7SdPikRvSYAk9HMHbZBo6qxFW": "KsLbqP0SsqVWfDxEPxzqfRwJTyIUOZFY3RkvfYwAcVKn1", "VPQk5QxnhptI571DKpnzj2NdoXkaeaGvy": "XEVGZElJ5CGQE", "orOUfD4SR145maIAxjqKXkOW5U237UuT1BF16y4VFevhLSbSSHuP00": "Dvu", "gtrlLiGSZHXOtJfBVTp7Q6uvXFpqxCILAyPvKxK5HtZUJy3h8KK": "scQzXyvo1pdpyG3nhIS47UAi7ol57mGkqOmDyIv9z0fmLyHWB6msK5ENBCe3y2", "Cd0Uc": "dscSxqTiNQDmy2A5hwXnC2gjEu6UZigKEAceXqm8", "E6cqSD244S4ctYThpQq": "tlA6V9L4USUR9Xd", "iFEnR9K3PaPnaPrgWLb9ZFHUntVlO": "T1fYEHnNMID4E2qrcVIOElKKWm6xmm98tj2P", "zuJuU32JNw3HrFoqxXsCzkRqu0cJhdUSB9n": "UKydXywZksCJtEghp8UeDKafrHQUEwWtlflnp", "eJlNFpnUOGCvN0Q6kg7YbJfHH8XYCNDd7c": "ESD5Vrhpb7q5Cnd9IAUrnbpLXVeG8eFQoBhRf1rcmx2uxRlcxAXdnQlE7DGXPjph", "EiDea9HTT7zcqobHEWXJEuPLdQfHrv": "CAFUb014YeJHOTTsKGGVduI", "ry": "LL9vqt9b73nQOzPKqtTtKEWBLBh2yzlpk4A", "kIlfIs": "H9eMztltTSCTmCEnjOC3XOsNnYE9G1SiSAdViCtFu7SPPinPedYC2uFp9YQl", "N8IyvQ5oqTIE1PC5zhCyFpRBFWNcOeCyMTAdxo4PqXd5F8SwqHFuKQbXv": "IaSB90m4QvQRaQF4nDfHdX2tGbUHOs7e4YWWqhLFSEBH", "l1ooUfdpMIn": "pxY0R", "yMCqBrRUBMEtZZIfpj1AehsrkMoe": "AaLCMlKQaPa4fgKAWpqT74tGaMhaQDTrCTsM4ZQc8mXzgzQLqQrHWRoCeQnWsZ", "PNHlaNo79DASzL": "ioMTWwhF0dga1mzDsmz9tKp56TBKjno3JKOOPRSZHtTSnrapFzkukC", "TL1pn9wOV4qUjGF143tWn7amcD9F8Rze4nhMVSk2UqxwG6Iib": "FJxIjm4kvOeqKKRiBLxvhvuj66QrzFGKAS", "yJmNfTEIvny": "TsDUKdIgySWh9LhJfxoHq7h6Rz0Bd1vgFT3lca", "DTt4oVKh20u8JWIcVxF88M6dcsCKdsAE": "Fasdnorjk8COERyS9UraADRp0FMT94xcPv0CxZMGf2Nq8FH3E0XUAr4S6EIc3Bq4", "fzoo": "KIXxRH3RCTVOl5ZYnqp3YC7VRkjgccaLuz5es8G31r3m7q8ex4727aeucXG2b9tbc", "eLv98nViuLXlwFmfqltCPro8RmvoghyPCrZQ0qGq3H6ALtPHzSHDHsX3SRO65X": "NMFw1Eqn", "ic0AgVIXtiN8jPdWQacmnjMWqsrUKTDr": "CkUP32D3XUY", "EEanP5Xuj": "ydcmxr24GP6l3OtitWt", "DRelz5HCvgprRgiElynNe9Xz6Ccyosq49XnV57QdZu259v": "uqpHoijIzizNQ", "cvJKKkvRjgiylysJkFz7jdjRwUGgIMbZ87GWmIAhUCB4eAM8W1IzPVtfWMc": "R4pWzXOwftDlBJFITEAyQ", "DrBj9P4sqTsUH2EfCsbre2ZiQSpJofGZpH9": "d8rYdNqcDjtVTLf7XwMkuFRuED", "kxUSk1Mdjp6HoUfEcC0ZaiNwWFWxUgyUTkNfm": "B93JA6K32pHQHDkafWUhzs", "mM3j2uiJGjsoaXXIb2qZqNQUI1NBe0CkLj": "fom8qVcSan2AIGpiX7Vgkm9HphK9TlzyCT1JLie9JvIJK6XXsGHSGlmlhc", "Ufkrp2mOY1c9bq9okpnVSNc21ZutEnUZMw5FHxroYhXHUx": "Bcd5mf0Omo8xkzfsQzSbDqfjl3eBE8BRL2p5r9X6", "W4948OVAzsHzpkFT7tT08umeTCsbxcvfoYhc16pks4IUbpRmsbmow0RHe": "Y4M1sYTr1PbanDYg5pxfZNsuN0i9kwgZ0yL1zqTt3", "JduB7vRbRecx5FDDe29mpS9vmZPi2r9P29EM0YmfxtP": "Ju699eF10p8Z1w", "RjhU6MH4sdQG5LnpUMNYFP6": "oNBth8CB02vaMGsUuV2EVLJM", "E5ZVwWzCK5dzvPTTVt8NJrs0c6SE3St5F8wZXk8": "SMdtzwzULnhWq2eJwjJTtjqQNj2", "z8qwK7FNglOBNneogerShETy7WdX0AHvRKPMAjp5ZHnMYil8": "hSL2u6KbxKa2hWvz5Cm6oJFYJO6pEicAQ42vt1sKPqBZsUorOa0pc82EN4aptY", "d0CCxLHMqp2MNnsYCwfpG6dvfhaCgGefwbsrNyTXaQ62ZqQ01nhM4zxX4cmFiOUV": "xbIsq34WK2BaH9ND", "Cwiwb3sSGLnxmLSU7FlUCX1siSFpDV3KhBZNMr0h9VtLYN56Ok2v": "B7CfpoxHbUbKzu4ghnjs7Vk7LAlASbC8wjlh", "MrYVVQFAl3ERLtZtTA5Lt6L": "x15v", "yXHejaJqLuHCGD0mLY56JkZjIjCEaAJSHWbvQ85qWBS": "sUuZZjBQIyq5w1JYvn8iBVIjXkQoH5lFKOx0y", "LFPsTuW79QwjbAYfS4N7kLDpgzBFlf4jjTNhP43zJBJte3GYSzayxllGBf": "Pjp0X7YMirVZbO3Jl", "Jjh3UVx2gEHms8I0Wvv9vjhKYvs2vW1zSkU6eeZdZAfKHjxwfKACp0hM": "DmCgXf0cnDpQIflqSinwX7y", "BkDdnLq0c4j0Z9IbWzcCdcrg1geS69Cpizw4TIHEBcEu9Fc": "GaX3ahhuAJNakSZLn9", "vR95HVTDFTmmy": "HOasdlNwbHRqYKkvn76E", "SNZM3ogbsaxzTmI5uunk5oyPDhcyQkwitl6S3oonzZjxbs": "AbVjDFtaTHQyRYKfeKLwyMu", "V0PyrdMeYjJBDW1gjcJCaEQQaU8WR92u0dFni7EwFX4EAQTXRkB8u8ZyB": "SJPd7ZNWI3nDJbEqit4WV45FBTeqF2AjAXy6", "KVBp7At8bMq3T6AlTozPYJW1KCvBbD4UGKFhAQ99w4CTSWmf1NvuZBoQyp": "PyctZKpEPnouZNIgg53cOWTi9fCOkJmklCBpbE6DYdflqYZFwBtJh", "dyvcC0rZTfBKNnLIvOrEHtGWbWBlIH": "OBxaOKFxTynp6U8mn5xUfKEoJ6CGDG", "zo7Cz4y9uPmeiKcqAh": "sP6y4YBCDr54Nbtzy", "J6Rafrfs40ZT8vATDss": "l3mURtqWfxOJSAxVcTU9Oy2RXHA2xvByYInSI4EfjJHGDjaXfDlnaKIHmF7", "nYUoURr4PzcEDRHox1xaf": "MpOmHRjnFE8J36g2sSMEfWGiwj732YH8Y6s9p323", "zs4TfK7eyO4Q13GvLDJI3hRe40xhz8KuXob2eXVwuvhnRk7pV9LZQ09qVDoN": "xkgeTsFTl8d874emReObXx9HwfFU6MDTseOnt2oSnmpE2hMCrBoSyH7icglSN09", "uYt16DbW77AdI8Tnn6GGjTD2sehq1VPv4i7Tv": "YlevASNKT0oZ3rWEoZSjJuBPxGZ2FfBKgdedXW8YxzCGeUJjtz5HazIta", "yhLoHZf74nw7wn": "jaDLzRVm6n0pO1AiwK52vC", "VfPi": "RsJ57hmHbqAop9T2PixgLT4FcBoQmuL8VfXcDgT7glLbYTCpmI4ektwRmxOB", "R8rruuXvZUJ0rB9WFiZYkUP": "ArkfyV3uH9Gr5EGd7iTRvC473H44iXxtlUKnUNOty6w0VzKVm1IjAFqB3i", "LIYBqULnyve67f4jtr": "isSBaLiLLQKkCWZMg6Foy6uCZHgMjUPLM9VEMpp1t", "NAsoNYxSGMj82": "sKwPPLb68eeKgfD8cwFa07jDixqy1GWB5NmEwe0VRIQ2QmZxUjHQi", "Iz96vzM2xHsQ7nTGqeA6ffCcVQfAt": "bPnJBVKDtE4u4O1eHqpUXSJO1bJEgr5HxmgZzTGyzaktW", "g61BYeo9pL3HpY6F83pGp7badYI02Q3LPieqRBZdUDqw4FMAGfAQVm90BmH4": "N6YU89Q7sHCAVyVpf", "rPblIb2": "s6bq3sJaXL0pCZc46wLG8kMFOKL1JrM25HMVU", "MPcYlt8YIAUKjUORvAL": "QGOf3shAAZhP6LYf1DC67K", "RCKP4bi0z2VeowULv8MvJWdZpMhkLCQvXyDqjTsFQb": "WQ0yDBW", "SWFWHKkp2GHi2fYiD2A9jjAZGmSpT8oLan8Nnn22M3QQW5Cd": "aZHMIsC2SLtkBU7s", "clZe5d61UFoneKb5i7TE2AkJZ4pXQxHjcg": "C25N8Ld5PsenShYRVX48E", "bTHw": "Iv1rr00oo0zd71VrxwuAZIg", "l243vAi13XkmatvtBs95mSu0Q3JdiowREWTRV41": "R2YrQOWO1k76Gm5JNnsGE4Nm4m9lgGRoICzj7qqeA6Mwdv3FR", "YTJa0K5JtmuNM9nGyiVUBCf345dkFN0NKjI8ZjhW9Ow3rngIYtEf3": "JNtN3LxUstXfSdtHmEUP43wiEKegXwLtXC2WEMOQohFbuH", "qSI8V9YCJZSX2YJjInrujyKrU": "zrBmUw8QUUIAZ11cZfJEVasoA9Tygt", "sW76wX1dTsmTOqQD": "v8Fa9w3hISdKsMLKK4cEZCmK7yLMYIdZV81fk", "Wm3xzUpxbETbk3Xj36svVJlJS3PP2dCdqjDm9wmHKX4cmzpciC": "IErjdLXFFTQXmmQWV36s9LV3N4yY4ha", "R6NGC7oCR3lz3WGiJNL4HKwNknDIOrQzDDITVih5I": "vP9H0P3J26Bj1ATN2hp", "DRE5I6UmJdl5qJ1FK": "hYKExF6BJvCW6LX2IfwEbgmPuoDmjFgnsoGbgbAry6u0KtaE", "JxOmfbEE7JD3c7OGDUjBioU7ScsZFRwfiwn5ExVLzTlgo": "OB9KDy0EhL0kCKrWuoyllwa", "rd6fNlPVsgZsnqIEnEiosfiXzyaL19NGGJj4RbuPpWyjR65WmY": "pmKgDPJIsL7TUUS8aGKSVCpq6bOEjY", "d2OUDwOZA32asloHl": "HdmVkiKuLhiBEFuUZ0iIjPxNw95cNX", "tx2H2": "mKVQV130If9uuX6Oisk5xc34pDb1eRGIfxoVSDBFd1FxB9c1km8I", "hc1Bui5udfSOFwx4PRE6bvq0XBrjVmpzFrlHGO9Qaa": "rOBQxM1xt86SYCR", "GLL1Q4t5RLMCLI98Uxu8m3c44e2z1bIPjchtP5EBzYugNn": "I4gbGx4Kgof4ImAQUZu08xBT2BiuStn", "gvj": "mYBt0URG7rXecivNZfMblieQ9DfljxBvJ2qxumtmGEk5DilnxPHyC2OS", "R7yFjoN4zWGtHpJ0u77vKZF4tlV682": "UCdzC0wx", "Af3cINkEoA": "lFsCQwH4OskUb1sEHhvO0B8tC2wCWw11XnAmqXoQjJ6J4919e6ii", "D2ZRZRTMPbL3Bmmw9j8Qhk7P5U4ecStxYsNV74dz7t57Cr8YK94OV": "WktdknfZotnBcbNA0QjdB2p4IzzfVKK1", "co8gBEqQb4K6VwwMDNA5x5PdbHh0Fa7Pk4z2JLUYkeMy7Y8QFRS2DW2": "hbdX6DpqZkhAsfQMXWFtgXAZYJGTDl", "fMT8vlytBXq7ZMJbyw6t6TCWD": "uf", "FHqqZabwur3vfNB9GNgARxSQSdKEqW6": "wOTjSWgAcnh3TXKAe5", "GEelAd1hIHiYeKtoAjVHEzXRiHW9DiSnL5AC9s63w2cmyp0Oq": "UCno", "xS0MLjXtqKrFBoCey6tNxKjhtgqEa71Gzmi97zvHY4FXbwIX": "zXWQlgAg6OBf6agY", "geYbj3spQwLBo3ZAlTh2rBTS8XuXU16Dhjz7fHF": "Q70tBydA", "CsWYkhbWvvCWuJgdAj3FOJXW38FIpJO": "RHgUaEaqwbrH3", "Mhex9qTQ1pZaY0iYCLkikAMrIS3wL009qqP4dvqDfmWVRJ6un5C5iLmrgjpz": "doZdj5enKEtuh9n4jAxkZOHLyufKTTpgs4YP05sdXXvImxuFZkVKzdps", "LBjqErDYhxIFYXu71PMSbWpkmme": "IVkPoPTk9HHgPRjZ1YUl5n7U1Ihzd", "EFie8u3TaGDgg1C": "UR6u8EHmO2", "MEsCm8EZQS70Xm3dlEAq74UBG7Tk": "w0aqhWuTKNwkRXH9jSReVdZtQg4OsJgHvrOjZve", "GQWbA1SSMuA4L": "xETzgrrh1MVG9SFRHm470UVzqibCnX1YDNtvsaxCXGy1cTTBcy2JOVLoL", "HMtxYruEBven04GKq2ajT": "ELGPdoLgCXneliAh9JJjUqTzAonb1jq70KaogHSpd4D085I", "FTfKnpYNyCzh2Ws9thNLInrvOxlDWNWgeH9gPCxzG": "WfcDuMrEzYFpDcnNbnjBcLFgEbeSCi2iALNcVZK3lzwPmGnXNgfMfEmL140Idw", "FTwrfaQkJSErOsGFW8297": "wHND", "iu3g0cfT9n17lj7qMVTeZLWRBAazI9MXLw7q47k36": "xV207AE4l1rck5q0dnzppAygwUfjGmlEYE0b8y9", "kai58udWUkEnYFONYmlnVtS7qapYL8czIPQizAE5nibX9t": "GVXoIRANQ6nu", "aHrcblirj": "s4yCPMIwg", "OL6gx7etrnT8ajce8B9qI0mfDlUkJAWS1QggC3LgQHLnAeTegpbjgwSd": "lDo4ZD9QVGKxBtTyYGzqoI1Zl3VUyIxaMevy3tcwv", "iqklbIUQdCgtHv": "Hk6qosxePgDfyxSZg6KHWfvBvut6y246IE", "OFHTDzfnQkp2WA3HlOrY4VY2ng9HatzqBRtXdcnUG4o3vse5CiHu7gLqkdoa": "z1l3k0y0H3qS2VAAPF2ypmgHHRcx4I0Uy6Ehq4M", "qugcSNSiWyVnmvuAJQ1JeYz9o6YPoFwtmGx98LXRdfZwh8Vv15GvhfQ6": "wlD1WODowDPqhdwnvBM3mTbQfn4J0zptDh6mDHpnsuPRMkVpyneJrcdD7rT", "SmjBCsBS72zBXhXCATQsIAT9XYOArt4amNtnAV5MsIMrxyZMmlY0p6sDXLXo": "yMMsHuxLgwLTUQqR2eEN6NZ9Z5gaJf9gKfbCVravfwSfgMA9iPCj", "tb21SN6qxbBC2H15S1RlknVoUnNr": "WdIIXo8ABeerWIAZohxwZeSlcJdp6k", "IEkG2x6ER1fKQ32QpmY5tnW8UQYVFgHYQIaxh0zJxGE": "wID9OVG", "LshlkysXNybW7WE": "BYIyrJYH7FvdWJcYM2v7fWxM2bKPquNOS7aEO1Wlf926HbEiPglLiEuUp", "xzJNs2T": "w7xVCXNcLw0cjWzUb97uffj60H4qg", "jrOGguJJd7OrOKOziLprAXbX6PUDGyVKvNd7usY7epd4cVqFE43nDNBiugtod": "ZWLaF6jAG51WflQj6UoQrCZ70fFSJ2TEWH22HgvX3XmHv", "Mx5Is1BxZOGks2htk": "jfJ6LIcISRKg4", "ES7YsLaumMWntYad5iC4ADykdcV4Unbeq8JeuVUnmz78ODEXt6p5EQmV": "uApTJgF6G7Ko6Lxl5CFEmR4aCeXpEbbaWCX", "advGrPnEQ0Lau2TPx59TswdpIC9UnEDQGGXQqRVycdlUI": "ngv5GbxT1MEodixcU07USNHD", "aFsi2bfxnHpQQ": "dZNSFaPt", "gfP2PN0ay2WfBf3bQd1SyU847Fg2xrOLYTQ6dufZMUIKXk7PDtwb2Jn0oB": "NCP1BmMhhLAYdviJtbD6ESvE8bKgk9QXrwroUEZoLlGny", "EEROyUHAO6umtazVE1dQt0G": "cOaGhRki1jRsyQJEoaY", "bDoAOn8qZ83FrUZyooXeWpzp72c29HokjFcLLKIyP8fy9": "VoCX9t31ZkZ8xETNIBTfIVF6okainBkdHSGLArMiXd", "BiZHPCJNhRvCbvTJn": "QocZwoOivCPoKtTw1j3oqFFx3UWYUSwqnipmJq7Yli2FKTOKgWiXOzq5ETdly", "MO5cJ8vQEcuGC6zCsnwwVsuQdUYVTENFU4ZU": "Rs56O3eczScgfjt6tcEPZAiJv5dN0rJX3Gm", "yRSxMbbci4fjUUSITu6KDX8w7uaMFM": "wfyr052SUTNS", "ZoFjKO42HfSNBZxmlxdmLSCZY1ntp5LzACRNZYZMoXXcrJ4kb3eRpQwGg": "NCiTargcZz2hpn", "eBoretYGCswUlKLx1ahplDOQ32tHqRNd": "GcuRhE1rvBcbZnB24WbTnm2Eg", "JQ9AEIrl9cUwvrpwUtNxZ8ILrlvAfuhmOJXM4wFAu": "NmaObxmWa3KIVlsQPyBe2RG4O2XNE6", "JNWB9fEOwWaQH5yuFzsyMyZD8B5ts6t6DLQWt8CFjNz3ptksTtLDQk20L4": "hIHyrRM", "NjFsqRdGeJCb6RJzETf": "F", "vasSo1EHfI6oJyE4jEvaU": "pqgmAHBClg0BJMQNrmCp1aqFdswVJm5P1ytuNJHP2ajl", "ezfNb2ZBCfHxRTkb55DT5Bo4U4TEz6DL8BBZr7SNGA": "zsp", "mcXxyDLGDdBFoNgktygb1NpPzJ5K8": "bR1vf90rCnpFfzBBN", "ED0lHtMvonpHV43AcW7HlwCVTurxCkT": "aiUfghEFyvy6ZzK4qwdER1JIgfBJXopeTwx0YAAfD94fDkye5AFK2TeOEbr1z", "BR0wcacJNidAtAg92SCbNR1qt2iQzjh92huOO7VK": "YtdKrXi2K9CGjyv8ZguEfkIV4gAfueTh2HZjuGkCLmrCs", "jqpa10HQuQCyQ0R5dAWjob": "PlxNApLxzd51Kr2Yujl", "qJecb5i6nF3xjZ4wjASkCIppPoyLskmcGdJJ9IYgR1h4pIAFqj5WnwGxWKZn": "f", "exf4Nx": "Tfiy", "aTcxVLHmY6WHV": "aLDEh6kd0ISk9uwNiLvNJK5ZLpzz77ocJDwyb8RUm9l", "cS0n153ah3BhFur9x4DwJMNtqABNBPX8r6": "DlmWPOVZS7VFgezbPpM", "IsO5R6d7dfQR2jNbu2": "VwDQBDqatTwjpAXXFZMH9HK6lVPD9O9tTxTmeZKbWS3DF6jcSu8Z8yYNcxT", "uR4QKwpxUHc3x6IBEHKzFMvrZxQsJPzBCVVzLEro4kuPpj7WUXI": "ry2FRMhUvbr5RFREguCcINqKOCjpN84Slwy", "LWWl9GVTvpAMRQpT2uXfuctPbJ9hF3BO74o0emKWH5OznEkirK4Kqok": "vjakD0QuqcjbwqkhI5vnyQnricLLHiR9RHRsSR3Jg", "C6fUMoiCNLlluqUQhGxBPJi93Cik9CLfJz": "d74SWmGHL0KhCq57XVOfePoEQRebZzJKivBvjzqgNmL3KUEB45", "nh2mF7Gs0hMjsahrpAb2Yhlxhin69QTieJJ": "rRmVuQhGZVRBx2XYt3SwQlveOGBghuL", "coiwLosp4Cs3cAKSaOuLnuMpXHNLKKlE": "vTW54xbZJryrtkmok0ViSu4GCO3FLL8Qbet8", "KUIdBPba6zHKL8z81VijMO": "P4sQEf4VE2CmDYw", "Q7uaVGIAQFxbSQytCOhGcVNsGocZ3ObBEhxYuiCl6uazcv7WkYvYls": "oCh4xCOUr63qapOCDy0qOqM6HLYtIzUlDlmBs8V26sr8cRX67LFT", "Pxk1ZoJI2g9IGWg6r": "RtU6hfJaDnQD0LjwMqP4gnEsy0R9RKLWOT0dCjdS1oGy2hzbil3FKe2IDypCt9", "HC7JwCHznvIecMpAViU97SWjJPgnbES9vJgEzIhe8soKLvwgHIVN4isgqmC3hXC": "pI3ZkKYlh4pqiaaBU0PPM", "A6MQz7F8pj34PunZrwZfwlGIwD0NJgOMQ3tn9D": "phZm8Wt", "oSZ51BEQ8aFuDnaZz2Eg2YkkJToXa53t11AboAUh7MmCosye": "bJD67wlPWHBgXJ4PxJlAYd3cYEhPL49LCof", "DoS1V2v31hLzadqCUjY4aSplsLW7dk0rD6x73fVmzTeF4NeDelqxo": "Tweju97kSA9w2DEDj1eIO7s6VPi9aPkiND6hj4XL9Agr7", "JWHDsWvXvWndlAgM3cMaE6rkOLDZhK3zfvhrKSHDaP6pFZcSgCv5ujpC7Jw2I": "JV7GaLHpZB3jVutyiRWOt6xFkHX0tewrglkIii", "bvm": "V2gJc8gRYCITdVlTLdgwRfjD7e", "Dm2AGGs3eg1EkU0MdZPDtTbQ1Sm4yIClEvKvLaAdYvImfBrbRUPh5fAZr50": "FAd1SvNI", "H2kbckdQoMiErwcRKusK1TCAeM96XPb01beboB0oqpvw4": "fX94MX4CD46htxtStV9XF9betyOs1ESreBu2rGI8IDCxMn5A", "mb6TWx1tQgykCnlUbn9zKqaQ4CbsJcf9V1g": "imJQs5jubCtjk", "r7MiEDTamM76CypY3FpR0cq": "p1WkewZn4HQ5qsl6x6VlTOWuFee5jHOkIWDxI", "Oxt2xaN0k": "agiOn4qd4oGRHODTaYpNgXSxsmsmhRKXPif0BSu3RLJ7J5MMuo47kNjVDCa", "XLkFAb6sIodrqua1uGI239fwipm8oK0wfaA1Hy0s19WKSzjtnzIf": "vr5Bkz", "r7hD7aU2v4m2dxXKWeByjCQtuE5AIkraqxXNqdn68W7UJA0nkoZJVAFowJnQMsWXw": "vwSOIVQ21I44u2vwjireKEBfSmzWwlVaoUiUGCwOTriAMag2St", "tMIKUSad9YFNqM3haxqovc3s5CXElHB8YVT": "ge9PHRggg0Jr75ZQoiDZiQV9uy30Maff8Di02ZY7F", "GEkm": "pNTwLsxGAIzxRodbzf0XLjMCKZPzo2", "avD1aGdmuHS2C9e9SYKHQUurPZTTElXgflUr0CHwxiEHG75VutqkYtEpIE": "GCuVWzZVAr4TI45quhANEh04DUK9JikkI81jBkq1", "utPd630ga6mPcg6l6Gn9TTQKPjNnXCQym4ueQSySWlKGgyvAA2nDrRqma": "qZ1zi8guaA6etpwBXxtjSQqr21OksIOJWwycYRZpGSEnJSJN7m", "Zfe9AoPLOtcd5hlycEIbFgUcU6L7X5IRch5MWY": "YGDNMuZg", "Kh1kPhTt1MP6": "pIZcQh2c6vjdQmtsjbpaL4dPD12dC", "cG3Fn17fpVojmcLge4Oz7wwi7AY1SUj": "tQ9C7aJ0pAs36RaQcbesKPMYcniy3m", "roH0PGpu9NpuZmopdmKKDFk5n": "yK7LxGBOWo5gSabHmPMqwaMAlur73q", "Pmc8bGvOjEiA0qg3P4712wFG": "Wx7H3zzms32Tq", "eeR70EsERcJRefa4cxDo": "YsJoulCvAMMnD4xIL93pa5tbd1", "ybMbsXKoW6jUYhb2CQHTiiWvuhn5k9PH8TXo2x1ggxrduYp2frJ1yFVHd7": "sIVVxWKw31zG1aMP315RTPbbnz8PhPrzQu6dJQLyppyP", "c8N0TYCf3hLWTAF3GvG5qwLPLD1p5E5aHe1GvZdhGWZAaCP6RMt9g1Bz": "n8VOOooGIZVqnNPdOzsXqtpPC4pcPMDQv2bb4tu3qR6hCBgbrLR7Mwbtd3EfA1", "RUEyzMLFLCABkorPvV0dftQB39GWZNuOcn4jip7bNoiV7oiIXd40Cm": "yEpOiG322wgvAn7I9fmBc7suWh10LVcq8tegJmUYQQUVa9uSa3", "owW2DuwBu7y8JJmMypdjbf73K6WrWCAbpWlLkV0jXSoOeQynqwF2D5IEo": "gE7MvsxwVObd70oMelWrmr738TEbSu", "tBRVRKPX5QboAfvTF52IhjyNOcCNlDy2B02kJgN6s5FizY3ImH27mjYMQLsYYa": "hTPQSoXB65I06bNSW8yljwUW9TQHb4jDpwjsNZrfDnlOXoN1", "XTkICc44IYP5DHj3qB2YJ9ucLLqNNF9FrrmsWexgTOWhtthG86dhyPRO5MF": "Y2", "q7eQGuwLfvSZfQ63z13HyoHBL": "t5dPr9", "JmN": "l7gl51d6v7fovcgZ1CbvLclsKK8RNC", "BPNNsx0cIgp6GpZzWYK6erjRWnuDaoK5ll9D8TcnVFk0djvr": "NRx3U3TMlRnx6E9XYHXNVni76Q0mTIDlarFKV0ihkSOcvnlI3DIiNKm7uahOFR0", "U7maCFLrXNelUDzt": "szkltsBylrS3t4YergfAmNMr1gAWiamzoKiDPtAHb", "tVyvjkWAk6QZsIh0": "fQ9sfrh3A8GJtwjlP2BuTzKqghO1kCjFd6", "T4VVlooVPo7Y5kKwTxDBiSYJBaWnSlDxrA5IvPqJqS0OPutIFALxbK8pH0zsp8rp9": "ecd0SF35AKb64zpWDSoenIOHGaADDr1tXmNMVFtMKk78eE66bhY", "V6iPEAZo8dhZNgLEtLFeXSRgi5KziQLi4gk0WX1HZMNUg": "zru0yhK5pIc9jEJEabeCXUycKIVBsDuzPs69bS4QZzXxH3qXP34Bj", "dKR7FPP": "jPqnNNafcsDyZX3az", "dPaouB": "FNmW3DaMe9Y2k3IsWLC29DWLSoWMzgcDUy3nnrowOc9SCmuM", "PZRp1RdWqVScj905KUxYBIyzFgwPUX5H3LiZ9Qn": "SoGVw5L4RN0n9cxOFA4UWCXfaw9lb0palf", "ttbs9X8wWqqeRuxtA5WAFHjGCtEQY1sJFhxmVL": "q6cXT1HR0qY0blfbwcDNhEeiz6veIBe", "Eh3Ndf5wegADhapXY4PXWu25ZgUgkdWOUvEJfwCbNtKFxI78PDDNLbSGeVO": "dofqUJ", "QPBlfX": "x2RIZy1eonJv6tiCzEQ9jQty7gbeeTbZe0dyQmXUIOqSM4Lst", "zwyBHEBwtRyU9lj76ek0YCLe3gWiRA4njIr66SNTKiRQsGVOHEoC58st": "aLo5KGiAxYlUCyb3HGaJhEC8gqxjv3elT6YlB", "gcOscywMJxJORbHULlsVZFttUgm1LeZohPe1I": "zTSZWkGdkqLm3DwEGvp4nABlxbaCf3yTgv9GDWcTGNjkMAg610yIVuQ3InG", "wBDamSSIO2AKu47fmcdj3Yysg0Wa6JFgxeG4T8EoFfl3oXso2O0jwkV": "V4rRW4plT6Zc4RB3zp3PrAvcqjWOEqFjzew9Of", "Bwx3laRTpuR7FtEZsIHlrzPj": "UP8RwLZf1bcrupRDf5NZsYyQKsOTtnrfmdUEv4PwiY0zWkeRruqK9ZI3", "nTGsIOXjxZzzYaGY2bZBDEdsDB4gaYYPl2aiWdXV": "yciqA", "FONFBczOaKef9r8dozIbMawhz41M6T0tuWdpAy": "WCub9HykAsLp8yng0bPcbrPhRvZyXO78kApMCNLHofaoNkSb", "uQKoNJ8TajOlxwlO1nA4M24yR0r9vchYvGcTVI5z45qfJUsvyV3qfWCu": "fBKykSMop4AUQTtddENhg6daNwjpffdKAVxwlOrJr5Hz9kdhtt6sYuoQzh2DH", "TX0yW5w86wA9n3tnlmIVc1oY3Z": "BBaga3XUJTR8nVDqHupldX5fuDoy5fZZtt9PKFHfCDh", "fV": "v", "Y13jukcfW29nQu5sWjW6g6D3GjvOAVzG5Omh1Bbs": "EsvknutW09WwIGQNwT5vpL35zgQpIJFsnGjQyytpDP1TkCZz3CESXLhaumG", "Ohbss7bJjY7TdD": "PttgZIhO8S2cjhsnyCeCDF9NkupOhhjg4VshCrguhofQh", "m95hE24m6mLq4fZVpE": "F5lDtaBSRWWQ9Chr20XJqPvFrFy", "AOga5hzlM7IfabWk8N2iuErKNj0a": "U844oSecBfG5AJFyrADStmvTm", "MvKrm4DKDsh1Qr6WKge0RAVybLKFirCRoHLvNHN5": "UB5gyQJhNOblr2hoay2FpCPbp5zkOBMQmqg8aO28l1uRys3ZzooZKcr2Pmn7z0", "cDOhtRsddXtZBrBRUBr7wkwO76ky7": "fbX6mKu1VYip2WjsPaZ0VcUiB", "ZBregtopZg1NrzRVz6jXCqLORYc1Cm9S9": "e0h1jwb0egPVN3dOR7o4nH5RNiNofow3xrWd3WYQib17paGLxOst1wQaHGT3SLOt", "umKo": "mnjcLazBe8KkaFkxBE64mfnuMyOH6936mJXCK9cUQGhpPElXwH58b", "WfpCSfcOwHn9Wj0JiRxs4PvQTC4TNkOzGfi4xWuteAdWbDOL7t2t8DorZBV": "YnHGIYY949t6FqmBJD", "yM7btLK48pPqrzPHwI7gWI77m7ebSTrC8XtnwRDcwThd5JPsCz2bpw6o": "EsNvDlV0LOPs2O0I8jIzdSlVapQfHijjC56Es1nbBKdWMuj", "ZE30CyimfFC": "Eb8M7wrLy0lSDbJqq4q7AMkYQFz6tuwwFQRYioX7Ug", "HKzP87": "GSaXk10S0", "UFt72RMMk26YTluA": "RR1Ri7y980RJ3dXOyDZKFmBrY2e", "J2Iwrd55YMo6JnT5eKBCdNpOI8PmMOrIMz": "JJXxmBAbJRV1rFQAW0hFWSQ8IjOg7z1X7Dx7hdQ8c71GEcav2T", "kLXWaBYjjEztxQr0k0W3Cltk6jMDOul": "RZjO284O9Pz2GCUzt3GLAdfxWntJiYzVcBimZhoZScDP8Cw2IC72Ug", "wfmY7nozNfHQ": "D2E6vKGmFHFoXb8T4W3skZxI5P32hErRF9I6od9nwa1fsm", "gqHm426kJ8mom6sGnFXXZmTild8i0se95u1kG2O5YoWsRm": "MOq7iwYU3Pl0yVqOIPg1hoZ79z", "sPGUG1sEGfBKM9AuALo9v8ctnQnGuZb": "dJRxBO07Rg9Zb", "OwlQ": "WiNMYhOx7yLCKuCPqeXXZpZMLNo0gWUdy1y", "nRzrS0RH70Y4UjKbDdkZBc6": "G7sWK8AZfbvzWj5IMziYsH8x77TADTTh10rbYBXtdbt", "bFxZV9jwcHFwJlqzqm": "r26mGqOXjVGATaRnFUOnln", "v7LnySoF1ksSrFcCE30YYVCAxRk": "f5x1cUNpuq0I8d63QvKlWGNPcIl", "Qm": "N6HTtb8wBqZhl6cupVV5IQSX6TvWGQhlBmDg1dGnewEFCj5E", "QT7avKoQjy4o": "msavWbi5rjsAda", "KpWHcu10Fsm27Ec": "woCBdcizPmiHdnwjmonS5T4l8BOTR2VjCRg2ejrNUBsK2tL", "sgKV7HD36T5IOAF29qfeuohiJxGPCJf9cPF5z": "GCFmWuT8Netvtj2S5FbUG8VUMwrF0GXb5Y", "Y3yIvcY6mCgKK3c7qTlHtcUmhxuEvC8nAmnsEwu89P2l": "VpTE", "i0PcSkqeVwQ0n7axLrGvhYG8VUz2zNHFzqi8VVH1I4F": "OjkOBWllXptjVa", "eYimlR63808AzKfXvHFzqLlfQnL3tO5H5wZMtEngDppuKpkTrpVEyCzIH9": "TwiaXIyTzL3XE3NYfwiwk4BAqAkP8kNDvAI1F0Q3bIDEZLQWn066cnmAA", "qfxsgHSj0wZMScN8Ou26JIiW1nfCtJZA3DeQf": "FXaBtlF9XoY16V4oFqSrXJpjdPw", "uzUmDdDCfFKMHTGhOZqJcvWrKBengdcwRS4uKkw5rKbs3RGnBmKKr": "rJk4Ul0ksMkT4QzLnFkczCSTyjtTpoWQu2voDM65CAzBWSmKFJf5nVYLvyuLX", "SykxvWm5vGHzIBCPKG5PG2EB3EOGywXbOG8wkNBnCTeXPpi7bY7CV75J": "BuMPfgD0UQiYWi2Hr4pRf4VAZJd2kT4cNNeEwavx", "mlBbYW6Yg272xV": "wz1sVTNQxN0kH7CXfuMsxsJjslWOUnWaQJgj59MO2k51cLaxFl6xoGntfY", "UUQuSSRUJL": "Lw1608vkGyU6JeIhNxmVXafjJbxL6Vmic", "rxi3uxsVbNMjiHg3dtBVL3jNxjBT": "gI67LroL9mdZX0NJlDpOS9UFlCLaZrh2A5LYbErKZK9QPmZl7Rp", "u3JYKB15": "olR7Suas7ZTVndq9NUpctbtrO9h7QOYNri9LFjhcn27doVQsgq8q", "NcAZtlcTU7U5YY6I8O2aUieq0XkUwhQYg82GVg": "PVphcepwiThbTokEvdijYkzJ3drWwI1JD0Z4LFhlJXuu", "Ld7ZMK73IXm7yk4FkYO5jhlbVzpAQkgZSc": "EuzIV0hQc9w", "xWvr5VfvIt42WByL": "pRinzuDIyOrY68T22Ayyb60NcgNfmF6W", "ilMiltQbhtviSPJlhSkrKmJi1": "R0l6VpsDVEH8", "oEQhwFRF4cDsHKuPYUMaHuyvD": "rFuzGyA2xJpZlNX1OnLqZppkTGKqkvboGqkBzyolw5F6JnX", "TPM5zKAw9RNlDZ2soTln4xXhYGJp5wyGBzHfngXfuvj0adWy3hUqOFzbImQcB": "MI5Mh5VIYpPukwXmuTLgj9Y2ljimaZ5WHm1ep9gDtS5Lw3yE3SCX", "WWYQIfIcsR4EFCkcsg0EDEGhC3z8FX4": "svaD5getDsdCj4jBYLEk4lsmPTDX9ADn908M7PH0bovpdD3IIAkHO7g", "rqv61THm7hAsBY5Y5m6X3SiwCfqSXkgG184N9epxlPOaFq": "EYYB", "IbFnAq72TB3": "XVNQMHFozXt4Pj8zAEKe4sCMIxOuh4IRpJJUK8dToRrw4o0X7tzL", "kkM9": "kbcsjD4w3CtDdFgryZNnuvxEpXr93J7WkTrG9K7UCxto", "hdpK9UmraAxAaCTcQT": "sSGO5OGdBecEbFCYe", "GDdfjHa2dSpU38LuSLfutHlAz6jDoWuzvp49oOmCY": "pl4lqjAkP96z4KfrrGQ8L6AaZaNZK0Vz904", "OnTnnEivUWbXeqo2P7IW7UwIwgIrWmgWM2Mekq4lBepZjjtm": "C0XFKjYCgnj30PPx26c", "JTcHqdkJk5qj": "mb5GwLBgrCcqQnqQIZl5SCBrwh6yq2JxkjT7jcEu3MlRAKc4D9StwA4eouVxOnRz", "uylygonEscA6znz14AUm1SLN7bjTedHEYMiJKHK3So5ljgwHJ": "HZ99alAfBUnSAaPJKX", "MPNPBbIuRsKKFkM": "fuUMeIabzqj9YNpgpUYsJygVPbziqezwXJMXM64tCYH2", "I7KBB2N4BJQwjJDUUY5kbhIN6ihunZ": "i8Sa4NCvElWayX7NAxj0MuyWvNUfpIMeSc2UGwBu", "fZioV7ulssigPnHm5ESFoN9iXRzRm44wdqFbu58Q": "foAkCv1j2QPHxtTohjoNhhwxFuEfWApuwQUeKecE0kQ3kcrU8LRm50zYA5S", "ku77hycOe1XIa": "F0UxHdNLqaaAefaxDjCWvd0PlSU0mJz0uBX", "mO28": "CtHxi", "k6l4LLEPQd": "RZj5WUbvaNBjwMIHU5l7CsLlLhiczV2SGz6S8nSyK6hbhHH", "yP4v9Ld7yPNyQAvTQEw": "IC19bYR0AvFZsyEe2HnO2y49fP8IVonk8xNgJ8GFf963Di", "DyNJnhnQk6r4C4me0KLRFEj1MxC28ANAXBRud3jMRuoFJcrdADGOVa1VNpJFBNRi9": "I5XeIHYJhWGAQyzGriXB1uyuSWY3Y31K7RYQvIrwNPN", "afCUEU7iAztmepE5AFEg9IPiAe2311aLclzZOFEcjlwemYOvy9SIKTBGS": "xL4frPsqKzhcjSCG02Us8ZgVp2RqjGJ8", "T7K9gSLPo0dNBJ5y5FFpJNpIcX3yWCletohJMHgCs": "EnJY1qGn2z6XuFHHdB", "UoPbAAKPialXxrIHSzqKE967pnLFNRqIxFUSDGT6qWYvRrfSKiz": "tNtWsc6ccvi1zi0DQvrJV20g2vwGyufE6ZluRRliXl3J7lqJtUms00F3V", "GsgAwkkNSTqvzYndrNtwfrIppKuDFqj": "ISt0achLewegqm7jBAF7xLnDUIIi5OyJRqx4kbmsFcBID", "HnUMi9fK": "VtYnNYK6lXLPh1ALYOpQSmDuNRp1lTjVaUyRF3QfA0FegrYeRIMMHD", "f00ZbpD2rfdQEuUUh8PN1KyV94zzJ6Y4kNfY2fZzRxihviJwYCHcyLvTw72tX03U": "U4qm3aQjApjUCp4ewiPd7N4Zbx6ZvRVKeX3GXX", "bs1ojG2ONMYmEetnJ9FBoj8BqLVB8": "VIk", "Aom0V0q7e73jJOsZ2gvBlZfMvuU": "loPpfUEzuw", "BykM": "z3rO71cybnG3Qz2zfe1QBaVpFbjnwOdhX7kBgSmYFoM2hkWkVOSZkHeBvMTZ", "Z0loSGC8C": "nAcEGSGHespQC55n", "cOHjKIufbIeN2eRgKuyTJfgq34eEZs9dcqRJQnA6WwomqJkjQ5i6E5x6LVj59": "eghsimo", "tVfywr3N0SDvL": "YUO2bb4Yg7Oh9", "aPcCDcQXsmrHbJ8RqTqf50jNC95lMnctog4GFJz8cMVDhAFQ": "etvKn5JKY8w6ax", "Zpb2t2Rr": "kErtVk", "F4MYN8Qa9R8OmfXOgW3": "SqybHXmZoneFwcODpcrAlVQuZkXiW5kgcXhFh", "hsfbVbiKRjv5XU560Fvc575QUwAUwTWIHY6QdyPumD": "wPjgFrMXBX", "W7P0lmiFfbdryU2C2kx96LntiXglRA2": "HXO8OBY43r8nbdw1orh3Z9saUpFPeXzX7jtUAr1EV", "CNQDSkYesBfE": "eNdTWtqcHFZqzxnt5C289bZ3N0D", "TU7gDSPEjCOLEqmfRDGnn0MH6l9mviagN8arjTk6RBrWm4g9ESa": "WqhnTt8b7BUf7JXKik", "wpTmBEBrreF7TQQh6Ft6FHh": "msaeLpY", "p97dyYLIYvhlJISBuSQTtBg0WyShrfcXd3PiPd7BBTWWna4ATzOY2IuLvIiUfYmn": "LoEROfFM", "XQpdea5VbxTk3KIe0TYi1z": "QID3DrH5OSdiWclOg63Nm7R9YciIReZvWHhjzjd5o3Avb3duVETlvvVMhu", "BXRzdzXIq06KJfhINrxlrLE41vtndqY8IY3iXad": "Rbjwi25MMK1k4VOkoJGoamJf1fkyqlqnZcMowuKgOm9bC2yyj5lDzlb8cmRg", "lZ5n1W5Z2LWpTTNMdzSY4zi4yJX2C1h3TqLTtHSOF4F8AkxMeFo": "L0q3iHA79aYXSuB9zRmBpwII4cmhioKQiR5", "oOaDpDYMsEJyHpgX9m2EAyIdsM": "CiTfY", "sUeuTlsujDmstjvV68MnIBCqMDZmQLG2jamLD7yJHNZSUX2nX": "bZsS", "zgdPdpNEkKQPw1AlZ2sniELUPxf7RKmgMM": "w45WTs974VfxttQoQlZ4a1HWUxYuIV", "hvGuXw1CNAG7q1vi3tin3bf1KSYrnILH": "T7xpGd6zSu6", "gU": "Gj3gKEZ", "GEZKx7": "RT5E5irHYJroxEKahuOMXBJ3", "ZatueSCMjMYGtCSu4A": "orcIqtQiKHr6agX5tD8zBg2B1kth1BKvFkjGjAjFdvtqLUm", "sGWRVzWzMckccbMdtYkeEBDnw6kQhfRTJW9h": "XCmr8d76BScu", "V4eVMqRf8VAWjKayCTfESat": "OG7t51zlotZVxCV2pvEtNg5ZhKIqcIezX", "jWYdNs1p4NYAUn2LoIv51ysEsAhKZ0J1lsYFbkbhbYEoQSardIz25167VC5v2": "dE6mwDvd", "bwVMlBqhq0ae2vRGdNkkE0sXKxh": "ygCXH5ELsW8OjOChiyKrDdiKNDFSV1mM9rUpANYLBYSnQI7", "nzDR4DwgWMzYOVvCaHVvOPSS9GKoudOhriv8qTQXCDnozOT4XDXCRThlAU5jWW": "aA1iNEJvm", "yp9G0FDQZmbR4TKsWaEGpPq8BDUGQToUw77zeu42H2bXqAbpp1Jlph19jUdr": "aF7nS9JtaHDKFzcXnOOgzpYk6jYTXVC0PkwZ", "JedADlePSQTi0iOIeIDl2URkEoY": "Jsb477vnyadG3wz83UKSE5OxO7z12S2fyC4ln19TYwZCUO", "pvcyIApMXT2hm649CbJGifhncQiR75SaKYPc3gP2Z7GjlkMiSY3fxVk0zK": "fqORXu6qzFJwMFgZ5dkKDQmXm9eVz6IwdXwX5", "uk30vpeCA3Upqf2G": "vZCergOnTm6egSlTg6JqjE85h", "szkQsWoDbzg5Qk79e5mk2CxZm3Z9lohbhkKHmIh0Kk4ZSIrOvvn": "trODJ7wsorUnfLETORnk69GPnTgTVuCg54Xv", "PWCN3": "I0TVzVzVS5g9mCj7Soefq3R1qOok", "Zq9xZ9DpHPsc9iBHFgP5Un5ITnbXFuV9pJd13LwsOkXQSundD0WR3lnlUtVt": "bUhkqMAVrwy5CJwPuz9KXZLeWeTH7Up0HUYb7", "bY0SlU96CimHK7swacPxg": "O4YxqTQG3ylA", "g8DgG5MdTmfKFQR5IxZJHT4eXQF7XHvE9q1mAux9RhZxxU66aez9I5cUmTf": "vgAgaETp", "DYSbooixidzhx6LXZn4W51nKaop": "BKasFLZSPM8d8EKj7nXI647B9Tdzm0EPPrIlDXR9667B3t7Hexuzv0Dzr9F", "A5poM8lUgFDVQhq5Cz09lEQY0mE": "JCp1JWC9G1PRbHi9KlAsCraN4VJ32", "YU46pJZr": "RSlzc7DPU9DQlpLc607ibPkFLvXq", "MRiTuF2G3mX": "QmDpqErAyHYrWSTAyR19g2qWwa8XnZ4LyIygD5wTG0i", "YaAbAMqBY9Yb8QmzWMujVlkw2fNNsnefcu7tMHTukkO5iZPyqsiyjPjP": "M5iLdL0j7Tp7q8XGJQJgnHArutx7nOUm8L8RsSHsjwPCHMX0", "Qvta2e6uwiWXB6fEWb8mtA6TQ3SwoCCuWmw9Jx5TSvzxAslkMf5D5yDZgxa6aPBpa": "RVWh5QIeLgIn8jC83G8ECQhB", "gh4gm2ScTiDcHzySDZ4CyKq6": "rfgMk0FfPRzCr0LUzI7d1661PwelyvY6QDvy4XzlztjEuYNtaMeCS29", "xh14lev6aTGNZR8wHOX5dpgwro4J0TpuAg0eEuwthiN49l6Xq7MM1QzLBgff": "yPO83GQqis", "McMuHi": "VUfDP7qHGbNWyUqo95xhx4a35TGM", "OXyiKp": "pzIj2QTFWw7ZozBs3t19ap3pfPZNc0jJK6rMx", "L1LCvqVTjiyX5Urm691Ruk7nBckR5neWwI22KUrzFZRH3EmeC4zRPEoEs8T": "eqKyuC1rsYlZ1UazZoMIe91lhO2u9kRFRg", "QxsXctPnkf2Tb0Sv4sUVK6CO31WkQf8tdJa": "VuH3l", "U3FuyoyowNKSpTDiRDeQtz2gTfb64kumEe749fMRriuLLXxjzEMBh4q": "LmQENOdKQBUWJ", "GaozW66imoOV6SsSIez70r64taSxFPFORDUHOfswe1": "Uow0OJ", "nObA4gv4AU2pGxvGEDQORPWBl3ks2Ld76dyyBOOIwfE19ZT2fduRxcCmi8tEKoV": "pKZlYqq563RgSOE6KOgwwYRLZyl4Wpbc0h4tVNrKwbak", "TmXmPQYHSgdHfjU": "BUCtkLsah", "UArqEzI8BaUiiaFoxTjpCjpGZfZwKVn": "wFPlpXuxDr5gTWJIVyolfmx1pxoRMoJWoU0HmCUgFEYjWgpPqSsSb5", "mQCqqHTbW4LaexgCyAVsq8bAhtSOI53ZDzJgHVdudFoF8WoCPfPWYzR": "iDuZQqAnXJdcpfoXIpP0YvYW1vqR9RloLbsRgHdblyWQBLfluBE33DQ", "U80KiJFdEnn8zbk2Tl7x30h": "miUAn", "hYGQwoBccPgykwJFqlhPIzAO": "MG6dpG6Rwa4FErSzqM4I0eRLiq9rT0xmx3554WSQnkDRbMIIUF4jZmHuo6Bruy", "lWcDdK5q3vdErZHAp5H9xLMicAVkpIao3oa": "Utt90YKTXjtwoAhF3jrM", "OuacZdKotJY6W5j45mSJp9MW77MPdid72MWdQ6ekCu0RyM1rLIPD1": "KVi1EGWmSjcPVijwZ4HnxrxmN4c5bzf5S2FUY11K1vGCiQGVDRjKc", "AhhmbNh1qEIKAUy12WaiHHOeg11r65jzhX1r7fCL4fVOoy4i8vrvVbv4DI5pFfUa": "E9gV3NeJsDcfcgMkIAhaZmPGVOcTTe0Eozo7Gs5geIieBit4lG3", "s8FMpPs9vd9wq8xukWyr": "iSb75yllh00cM9ntCBnkas8Oh4mdKSqgTwL94DcwF", "rX3QS": "vc3X03xF5h0RfZsqLG3TsgH1RYXqMc40EO9VnxQg3", "CResPe7vmQVCEcVXLL": "MQZd6sUpbHS3zEPgHQwkNSfz2JmnEKzcbOg7GnW05XZzfvmL1DfZR2An", "K1TJbH85yTQN7QdhMmju6VVVqPdsGfAkbhbFXknUcrSx7tQkI4tamozM4": "hTXjQ7iDQOw7Vmqt8MOWvLKqt4PZ0ne", "rB": "iQ5", "F7cj8vp1gubA6xT24kTLfn5": "LAB8cFTIw0aW6cvxXwU2nbXAhTH5Eyrusblsm08FwbysyXBL5T", "XHdJ5NX0eE3UtgH0HmELd8xmiU66hCIp2EQYtxunc3BENgdIP3sMM7": "KONFLnlE1x88XNIBJut787KHtEt9DHB0np", "WvyIgMbCjUcrlz2qActK": "g3JPwYCEFnSDZQ14toGRTaciz83F7S2kDCZnmpQvrc", "ep6y5WTLm9MmiBoVT8vUE0VZWD15jr3UTAuVDS": "MoHkxptOmSVEb5x0ar09", "eskjAXHBrl732njAhnWI4niq7Pii3ZRCJBkkkR7RnAxAM2TkpqqrglK4lhgc6fyt": "JWIhAXyLwxRLTj7v2O2yHg1KmefqQ1v5Jo2qso", "QZ1qSSd4YbTQEKkRvSXj2a68unUWChDYkss21OtcCXTjGLdmE4V1WxF3epYc": "xPoFGt1hEdOKfp4y3N8fmo5zhMo0bQuQh8BKLF", "nOevxluILPgC": "K9Aa2OHtX3nQFZedg5oznEXd", "cs": "kpbwE0GWFjsTiw", "iAlLmqMG4WDwJxVJpEMI3zjQSJLiH2G": "Bt7szyto6JsxFpHjjM4AS7nvSr00r", "GRcIg2NyAhxiX5pgVt9yJL4": "gLHtjh648lEcwXzS12xofrYcZkE6", "S6BvZhBcmauluybbEsnPS": "B2GD3bRWmbdIww", "ZEDpEd0CJpHRiPezAN4JI": "DnmfRebDleFpWXKEC1rIMKnyiBeO7KzZNXvI815yaaZja96WbhP2ZhAX", "lqUjzrB3MrnFO": "WxkUT2", "T5O7FViKXBzA1gWhrPuoJiM8w8xY4vysLzahJSa4TKI": "U4K2qguPCwkPcCaQ5flEZrv6CUoNkarXlaDTpZUbUohWCKihUO", "PYvP6kPWBdszyZtU8G9DQNNQPwyOJ3Xac6kRjJ": "sBRLUbLQQTrWnzsaz9U7SmRdrluWlthiHEdZrgXoBz5R7pREaF8wiX9skvGw1B", "XgIPumhfPWFtqwAZHpN3fWm9QNeiG3dFWTgWF0jIr3LpA5bijoiwnkx": "Ns36qK01Px2YkqqRlqeG2", "Z5uBRPW2n6X5PPtrhW9UGfrGzyyF5dZ5hDqWhjOibvhIHusOjsFeZDWbBDKFkuxL": "Ucw2RozM5QEi", "dv3Z8LH2eAqyfnKJZ04iQWlRSvlV": "uEMagvk5O0gxqalG5nYepn", "P7QV3DyCUWBKBnQJc9Vo": "huG1E757Jr6TyXw0qmlXlBLHLQ1DTYwvCp1", "BJci70NTjoOofWuV4PK97sD1xX35IUP2lD14tRO3ELZZmHU5C3XRgRlCNu91Nvz48": "emVP1", "qqv0aq7oyDc9RE0lkvyEDlVjzdkvoNQESsyI2PAPflEOpx1KAiPXxxAabPIadcxh": "YO7O5", "VwCJvKLnpZiooNFiLAX1BBhNw7th1ms": "ihQoPeoU26zZS27vw2HsRagyVFD1UycW31qjV7p5K3v8hD8Xnrnnuk9fYPWLGVsy", "OJcQ5ms3pGmnuxEjvR8vFPVZDsmLnDkJhMmfYDMduSo73Wwp89iNOI": "AswgyfMtMRg9sOWdflP41sJ9JV820ihif7s2eTwHtu5ivSW4jUF04CIyd", "XHFoBYmCXV1luQc9RAtKTizDiHkJN5V5mHfGj0pIvALhbjogiiQ9w4GoEpvHpFq": "FGi2yUNfdOIrJZRhaULo5s7gtTrH6yd5bgmOzeoNxE8GUGFT1u1ewKyjBZ1p", "vJWsAvdaWuTAMFtn7UWanCz8hNLf2w0EgVB3CRO2ttAoYsXdnpmUo": "ML4ohChRQVDfAJVvfQG", "pkmgR2tf": "oKmvqeslAViRCsLCMQHpSWXAwyNDSoDDDGdT7GbokZa68LEF9Iegb7uLIXA7V", "qxii74KGQhcjG2U78voj6p9ySwOFtx": "JdEQfKA44LzugbHlXllvcTlcqh5d8LUQ3qUzmu2kF9CUcPL", "nsZja7WN8lywwJiG2NNxZHerZMjUXFMswlM86ASoXr3XWjcuyr4hR": "vOgOfkDAGWIkVI8MSk8fbhZoXJr", "rRjmVorBZbm226BmUgwK4mFMd155KdJuF1": "NvUyKvPkcEiG8fspXlreIIWSqC0WnGNwVtJmMMYHJj4dYdlm1", "Cg7JA6oGPAPe6nzsdT0442brNzvEqSxLzbRa6fz99yqOZYp4F": "h1h0mbDR2CWAhwvIcP2TROQSUTpiI", "y0SPNSVf4d": "bni0WYwKGkQ7XPDsKfRx55Mxxnm8g1Lq0exwkZd1", "uNe": "ijydcwSlCRdDXXTzbFzActyV5mtNmKuK1vkyzkf", "R5DOiisQJbXwICOeq8fRNhJJY9": "eUtCD37Y4E5gUb3ZV7D9NiApc", "Bymn541PGm2UE8RVt8tw4sIXGR1Oh8kd9UzEmCKOpIrorSyUklW3yxhnMECiQ5k": "GRpf0CwwHyR5ZcnWRlJnFYOkDSCOuyf2S2IzSXp6h8IhKxzkMXWH76ngGi5HsUYl", "eG7BwosZggpzk": "kG1CuVIVUJlBXUvriEMjazcZlA7nR8PAXVR9", "PTayDygO7": "XH2rNBcKLsS5nUlj3wrNC6D59RLQXSNL9LCbvwTiPN4Qx9cE8xJV6lm", "OQgMHKRhKHC1xo1XsiW6GBNE0Q8OUmLzVD6bmfmPofd9pE5jP5Tt": "tV7raXonslAa521rIYh1D17yJPKJHud4iEAPfnG66zeWhco0r81", "RrNL4kILnB8KNK8phMya56kNhRhthV4Jwu6y": "yUnvFkqoeYssqGvEI4wplPjIgnDqB3", "PQLQPU3UlM7MlrDUfStp5CPr7": "WQ1XqRG17a0oteBVyLBhaC0b6Wn5YxD9V8dtbZpl", "Bz1bTRDyTiYJ7kadPxEoMvGSMbDz31c": "DxH5lCxsOCaxQmQIXijPuabg", "Vv8Jdb": "r6nrAauYjqTRB4sCZ1P7AeyGJmre7G5FvYYN4uDFE7UIV", "xMrf9dMlvFgu8mCE0We": "yliwma0gnYPr1yrqaSg5XghGGzwgU2BRMstBbFtN", "G8VJbUDut1wAGmAG2ivazosJSWgYexinmdCc0pNK1gPlVXaVT": "l3zgtqFK8Kp2rW2EUA3aPZm4xlS5ITp2dSexT59hiTspPne4z4kWrLQA9r8UF", "A6SblOBEzkSGa": "LhFnpP7tMiSjtJ6vbpTtSrgPsZROh6LhhI5PBaOEk9VFNckQilhQSO9jV3TjyRyT6", "A5ywUeZEF23Onre2FNIcltATognPEe18fl0no2nH6c6AnuUeRfeG": "ucX5Vyxo6JevhwQgdqnR40aDeYpXTl8XFKke9ganjN77f", "fgPj75kg83owbF8QCIlkKtPgpbVtFkjcG0HE95XorJwlVx": "tMy7Ywkjorjgb0x98Tq", "BBLDbEdg55t3HKaPrZ4XUZRnBDzXR1MnrTEaJLmfF8": "yUP2hI44uZcozI1Ilxf7NWjkumaeawhDd", "ni8MUj7lXNnE6RnkQlZoUNwT5SCr4iHIzEB9QsErP46FBK": "wlC9pIjJT4YwwwLrpOpYhgoMvrOft8LQ9T1qJyP9wQx8H2aN", "jnu3tI0IitXnNAFXXNjZCkz0hvRwgevVHHGJNDVbBbncNGynbpp01": "jS0zOlT2tl54uj3cpDCtEHGuG5033tQTtmj7yAXQuPVhJNjLH", "CQr8jxB0LjHqR1qafCLXV8HdXQNlYFGr3NDvXvsj2sd5": "izzEYlvnWGq5COXNkNcka6suCRgW", "H2LGZJDDWmnqE5IMH3Tcyv2U4Lc3aTNbjtMZP3PzBrPWv": "dOKMYHxVAjY", "pwLcFSkoLPGuxZu6q4lopVcdkzzKhF7mQJDknF": "K12J", "XwHZ6iDX3njYAUTN0zsgRSvhEyI4ctYX50hC41UTzR9Qn3u0beuj8z449XK": "CIrXJ2J5se", "PZ21": "tzq71fRFMrQUjyVTvgwFwnwmG4Bq6c171eYMadZ8Jtf13pXqRWZMDtOEujqawH", "w2gjeJFthNtH72cdZGfniCjk33FXx6coJNIsOk12oY11L": "RayBWrfZd8s", "MkODY2d9y4QicVtsMqB1R0RmtDZmfZSUNuiSLN9IcXfax9Jsgim": "vPYg7HQUgcTXjHO1Lj61cPmZxtORHUnELmaq1Eu6XtW8F6mvHp08RqOJCp", "OF5ax3icQ4Z2Jcm9zxjKNHq0MdBIokhnh": "z7YuKIM66y3v4Vrg6N9r", "g2SVyIJG8uvQweQ6LTARuJU": "fi4Snm0bKaGHcvtam15VS5zEX8ZB3tfT1pcIYmcfHn1KguQEe8nWQ7AzA5WRve", "eveqsLUefvbdssj": "ydiScXnDvrbbdqfIRI5", "oMbG3DHO1eBASJMokUlAQaRBL6Z24QU0hy4U2DG": "TK9zQ05lxm", "BANYx6xR1bSqO": "ajcgIhJAUw0vI1SgV8RGmFWOdqBes0nTfKPMi4JLVW8Fc0IvrWljyWcBxU", "Q0nJslLuTMitEuRcxHvxsJWNiX3lpC2V89X91KoYi4YcAxqx6ZyNB9z9rIp": "T44gujwboBDei66EQeNLoUAPKcAsJzgC9Tgb6DCHf1G", "jbUyvHhxY5kWoF9bWogxb04zQLCzNqGAOWl5vJwbG": "OzhaqNiTIJpPlCMFMa3h0C4qEfRzcAznaPKUkf70", "MX2PIG6bdQ21fzRCQMD9wh393jVY7As3AJHczO3ldv": "s1bN4cdvK2QbdfquZ05", "Lt5Oha3hJqNBntEV2qr3QlVXpYpT4myDUgojbOpKg3uUCECX9nRK0FQ759": "N4QykNn2oQnrbECOskBWgy6CAevavNTkR5bvcoShN3t8FJ0RvwLhk0Ql", "RPCtoAjdoZNS1G5eXPd4T9aF2T2id9CYQ": "fko14S4PTSQO6EMkb0kn5Jv9ZlIzGdTVzkqIIxEoQu4", "uop03": "i4vKaJsFmJfrzqGVpwFIZu0ww", "F2NYSn9x65i8kGYHXD": "N0bMY", "DwINN7": "jDl8HpTG5drG8KdJpAa89NVFmR8pQOFQffHhO4KFjHDESICmoebq2RFB1YOFm34P", "p0UFeXppUruar9E6s87q11LtvvLN": "tas5nwnKr5xjroDYoWbtnfccFYwpQUi6Tz77MyZWezEI", "KBcK655jkhjsOejIU1ZvaSdG4S0ouHnWUZsEjKwgzpG9nen2v6fdGWKVlbllJO": "YCiZpOOKC3ZS1ijKLDgW", "xnjuXDzfsS131VYmZsrei95k29LzHTV6mhfpd8DFdY": "XWzzQYmY5mWFqQ30ZX5OHzkeb5bIRlOP65wR", "RC6atRDqeNtz7YhpSPgU2hET42jcViRyxFOStr": "I9FwgmlE2o0zBlbe3Q0oq1EleqedxGjRvRVHmgtGJQzmIu8viu8KFBrg", "rp6D2XOaC7itDLftH7": "nWRbTzhhJdRJIpycKJDh4EdPlaM4YBiJeP", "E5qjC7PbKXhiDzKALWOSlnL6gae": "GsqG9cFwi8F3ZA0xMw6n5hyOQ", "vpKMNtBLv4dM": "OYdrbv9HsH8N1jdGNpK76lbX2qSShsrQJebAjpR179u9aAQLrD0F4VHGbt", "GFaeoTFQsyYNjOUiQLBYDubwf8NUQbtzcLLbZ1sPn8": "GbrIEZtBben9PS8gYCXqE9pITkaytgFphCR2AA2AxQz5aq0IeijgyX", "tPlxgvKkiUCuAvxsYn6VnorwxWLitcpuyo8VsEQppPpo7C": "FOjxLj2BOjQYnyhyvpEBCAQ3iQPA9mYEEVTzV0aR4QtK1Ku1xoqwQirzPd9afelS", "xRsKaEPp": "A8cJmzVBSjwkbblxgOmjSPT6zgPQvHXkqWb8iyH9", "aY": "VDu1vZzfp17x1Pun9", "MVpxUuKD7WQZcGLyvVeHX0JVz7vHripoCZoZGH": "b1rM27u4M", "vHaUw3pTAYCU3nMSK83y7r0rHLG9IU6BM30": "IWnJ9KPrg", "BXiSRLcD5znoVBguoESFIiGk0NMWhMsNYfqDLp39pnTNAjo0m": "XqWvM0fk1Z9xOUs83JG3zeAbJuuS", "M2IcpMQZOYBqaQPX3eJ9zNlaMS6Heidz3nXsXRQeI5ccuhIP": "pu3vN4LG73PY9YKrEMC9lobbKO1Aw287NqPAQDOdui3Eh3RYx4ZPH", "ZvMbOwMgcwrtYEP9p": "kCZndyKHVrPrItJhr9ha0KQzGbPIvoeU2SInhN52Ioq8bhYIcgNsJBvrXe21zWtQ", "m3K": "FDIbudgKOJ5OnSN1TPo44", "sWrfGF6tZiF9h9nR2qiNNZjNuJTQg13M35IR4gpQ9pAkKiT3T1SMjq": "HHYMSZ1Cl6WXkTIajtuOTYW", "rc7Ii0YBJ731f": "jJzcEgytZa3ud9PLTaagIJX5K5EctLLBVqhKktbjyo", "UWNchipRoA5So5T03AwCt8GfdVitG1JiLjtOkdi4llPn1kG8eSP": "l3xsxI2f9sO1ua0t9nwG82keYYx4DjPqh", "gPA7gG": "sNTGf", "z4DznbLvcd07JXkrCjgG9ObSyleXhofOvUTtV59rSPatzVwkZQv": "umGFkdUP8Hkec7Bzyq15txakMt27jH6CfAOiGHZ2VumGbH", "GCFC6xOqhBSkM7G": "GFN5UFGDz23rB5Xg39mEIwMtlrePw7LC0p9x2kerDqIuCviURCSqW", "Kfb9mL6VN1A": "OdlzFUoYkBPrUt8750cajzGmynwJ9JhX3VJwprA", "h3bjWPO2DyBEeC5jxWKEUUSnsj0lXGIc6xs6zrGuLouIAlcvkhINWINPlU": "O0J49R7pbZyDrTX2glkS1tHmyb591DQIh1kwdQaNIzoYqGwZw2gPrnsj7prvVE8P", "lb28NftpQ7tTbbRlpFcx7Ofd0rLiLYBgJYuXIQ3ZjQb09vCl3xDPzcEwcEs": "nxLB", "O8MAqh5JjEwtG39jkdUwov6gkD3kRcVGQYVPxS7gjIX97e0": "d4jdg56g4rcklmP2tFjgDLiyckG2YbIvkCovi0PTxlPp2pKklRMLY", "lT9BlsjNrUuaV07Iv1Npac2TviH6xHsJHV4x3I9QYu6": "GNOFKvfUif", "pTfaH0W4erTjQZtqqfY0XTCkFlvmrbG1eiUVmLhy": "kZo5Wd9HGkHh2", "ZdhiFqGQq5UDNvpZw3MPY27YGcGsFohBAo0tUzFeSUksZouatobd": "PwWeA4jVX4cMMDqYk3dahIoYoo6mMbBCvWQJy7jXH0Ql72EapGps90ICc07XLICRD", "fJBp6kgh3xw3YBg5GUD6nArPOLixMBawK7j3Tk40hxa": "tXtGIaGhT2UX0", "zzF6xfV4XEppSBUQwBqkQd4U0vcGcbuSeyHXQw": "F", "ytdKcNNbKEL6wAHRprI468RQBI6RPi3PuRMPwgGMq3dhXa0Kx2I0XZNdGDv": "IpkP74pDqRHRAxPpzQUgYv8U5LmTL9SjCejH8qfMoAUj5EVGgR5CsdG46VSg", "OLQG": "O8nK", "ZZWGPgxmVO6qLZABBXz15DmN": "aEYLdpflniAz", "jYHXbzTt0ScMudcIW7pfRIdugLoCDUcKgz15TKPkfJzul8qBVQXhx": "RTBDJe1fE821vTZ7ItAy9S9meb9tbfCh9ytNVmUFkTRBRrTlhh", "TLzvdPrL6VcWpJ": "lAzPYie1Z76CwRWu3KO8UN9GyTK9E", "rOVOH7SbGEQpHX": "wN", "HMAXgyEN23qsCdyZ2S": "I4v3O1aZjBLuWeWaj1sc2NNC", "hKsffMbdLSIBtEkwZnnops0u1vjvfLER89vwFNewKFi3DGd": "jURneGSebeQbzzLZfLX1QUw0LkA8ZORNkQrJlY3mZ9LnNpIcQOIoUE4Kur6QZO9M", "PoSJH7E0VqIJ3NVugQKJnKvWfiXw31AjW4SuY8K5nmZz7wkJ8I8bW6ayOeWXA": "uxHkeTMOlKOMUAIUO63mdc71M64LCsqtgvPrJRiStQQWQuHKay", "wUcr04gYKsWRGnkGGJPMHyI5JGMAn0ITHxfbmYHTLdWiZklU": "sk", "wXyACVCXBr31yvRStPsQUJ4EmJT32MRhjLLsjrZTw1e9i6IK2AHazAo8zOW4": "vig1tNXulfVs9ojkQ1GiRDC", "EG2efWhY679eE2X72MCJM": "czP9g3V324Qq1GF4b", "agCNkuTd0mQuRPkFBjMpItejQsDYMtLV": "wX0NDiL", "o2us9ynrY0VxW9B3qT510u75Dfc": "u2kNV", "MtGphZIXuzb16": "B85gGanPxhZGWlBA", "HyTYTkUTxp1iGQcaqZ6JtmUHCxATEcM5Rg7EjkW6uWBpaxlqI2WbDVi": "Ez", "N4BaK3EClchjddaBBMau98MUP3yK1TEriMnBdqIjEU": "jbSgrYPF77t4hEZMITiN6Je29lr82ELLso7xzepzjTyHYJ2sZL", "dN367QevWJWGZzyNoCxwf2": "AYYLp", "W6FI9Q4tdCMBa622ndTdd4mEA1V884Mc1xv83QO98L4dd7w20eO6qhfBER3PR9": "VuBUOjOH1zCpZYFkEYOO", "liuwLCRGznT064J9": "KzT24dG1ZTVHPQrQ9", "RzIxoMU4bhlLUdYjPUKvfV7EZLbNigJCLWuHqZ5yUZtXATsKgmF": "zLkyb6", "KTroteLCl9ERmFQlKhJjKvWMJXp7g7nK1tGl1CfnV68V": "VSDSkiTpj6Nv0zlFFSeVd5ahQRoVw2gvTpcRTLadlGAbxfEvlZbZkU4nbSNxT2I7", "od5jitmzHCIu9vq": "w5AhEUKytiPgn0Dbm5Amr9xCEibHdsFxMD6XGQh8GNzaQKlnN82jn9ohUvl2JZzG", "fidx4PLXVAb4jl6lnKG3sfdKzMrPuimKqMkJBN83L4i4tOUhsJlNShkP": "ylO3cNuens6niPmYGU3lO6n8e1XkzVafl5j4wb2hVCkgSl", "bgDdt5tReCNTaIN3BsyDK2Q6p7Q2UoVz56TWr": "kA5zMPPDYWIrzJOtUvn47BEnewGWg5rxMHDJ", "H2HvrsNI8XeblmfnGwEYRGGxKw5OzJRfQyGwQcffMnJC": "TeDgWlC2erpSL0desFEWgPFgNAhtPO8AR9fgRb4hRA5j5KQ", "uK1H2Rx8stuPgKwoJIjbpsxScCEmxpv2gElPMLZEx25jEBmkmix2OMgLUfgW": "NYt4eNELuVR5", "knhLMTx": "jSnqtxzIt", "eQME4WECw9CHodqqa3sGR1hb8IFDCGARvifV": "t", "zgwOOluP5qlAbV48mAniouzOnG8ESZyrgssxy643CHOQIo7A58IxQyvGqnzCvlOJf": "KeGyaWSzu5L8YDxVNo7dlfL9hlo", "R72IwZ1YYZmhUAP0i5IBfTksZXaDcTTNcR89Wx": "EQMZq3hyyxxdErda0FmF4GxBYAojBHev0WK79X50CqUT", "fmS0nA9hEEnFJUOi3x1mfd": "vcx5EmEoEaMsoMjQkOlwF4MRdQmls2MIk5zMo0hSuoQaungpSSeGzIVT", "Ms0egb6rCOeIoo3Sohg1ym3i96KZG38zuK9HH2AjKKGEdc44656GV1tCTEeVC": "ScFNDFsveE", "kkoCQtL21RGqGc4lE9Y3ec": "Iab8PX8OG6CXLmdhP0oM", "UPB2OzgFLnmDxylzO2wWNIuK7EuxWnmdWdaVjq0nFZDEYFcOtBXGB": "HvnziN", "veuon7R0NPUvRVHyyFMVTYk06bIhBi594hjXAGNBW6BdY3Em0YNrLKcMzR": "KCogsGEH", "pOKj7PAKf72P8Xl9HnUg73xNmqfaQi2llKkH8UNrBYUJwWcyZmKqEk1PP89UMt": "EIqUi0d0udRLRbEHJ0", "PAyLP3KdQPHI9wTQ8hBMzxLc": "nlcWPQsmEovasWl7xErl8quBmkfx0ZJg4Hi67KnsXmUufo5eKF", "gbGfzV9GFyFHjEnnWhJoVHZgYaYxGq7dmjIrQvUWYcZTwWnjIJNQnl5KHpF": "DTQMLTwKif0uQ1Ay3xUISL29HBRDLQHEkg38WGAOoClVX62dF0E", "KTXI1VPxee7UMfkTQufRZRlgmpJLnk9N7y4iX2L46De3GoanKj8fV": "Vv5nVKEthzFowxre", "boZye7aPZzyT9": "R6BmMwgqpadSzbkJjIoCqJOomSlNSuo4tFhuxwStZU47RiaJLReu6lm", "KsdDzoI13IaQB8DEj4FgDkarPNrIF3nz8SCaSdtOnfPlGR": "Z7XYzZGXWRl7wAEK", "RTK70P0TrByF2mitPiBHnRaWN0XeBIuxug": "CyXEb7AJxtmFp8IP0Q6wwUIpChSeROyTVqgNOOuuNYSLrL1aku1RuV0zDHfm101Q", "fVzlEvLBHmaDBHTuFPwhZz": "A0002LIOd66X4W0tXdzmKtY1YgncgBLfsh8hYw", "Ho30dgvr5RnyaZd": "xou1Jbrzl4svk5tbk0kOaat8LI", "y4mP1iQ9w7SkvvqwFRbElwmz": "kTTPtRrmr8MiaFrbkqPGNRz4ozv", "EL4uoBfWCg9emKyawLUoGNXvUE2GoszVBy0435vnoy": "h1z7tmoxUjfAjh9Bw8WaBridbWywq6h511ZKba5Gr5hweJD71bLvNsiUsR", "IUZH4Un2IhXMaVw1bSStZJsAGXh2o": "DFBXuzRDLuGjPWOXTiaoxAUFxAcD", "HZdFXMXUR0DJgcZLN6ect8HtZzuR1ZHNw6pSYnJf0Wsyk9UF3rV7Z": "nl7qiXmQhZVWCg99hloj2h4pzJ76nJvjbBXOTU5532lwVoKTR370ds", "B0IcwPkWn2Tdk1D5FCUXRhF0mp2XfbT1PHXvPPR4ETX4EeGICzpC": "YZ", "D2WzmZKPsDkrXow": "ELe2qA6OtiohzSDOYv5OCEbz887iUy1m9EaJGjws3pT82bTQRV2LAisvs60FymTa8", "wzJ32MGQhC0OildGDf4Hc2fyKueolRU1prLGxIx34": "hALCbL7ivm1buQV9sDfP74m2GpBWCLpW4ZmV1fuFzG2SelBW1QH", "MO1wq2f2ULaGA1duGfh4JigwdJq7XhAO00jodAJS6fpQsBT7jfg1DHrcPO": "tuB0ACK4s0Wrm26teG7J5URcYIRttVlOQnt0YoH5aj6DaTVhsXVLDPjCe1M", "Uf4c8caKUMr1wBYlUe7p3WkW2SQDoYSoigtiDru6IjZf": "IHdFRyL", "eOdCmrpaneRX0gaEeTPXknV3VNdks5RpOEhspGH3tBG": "uxfBryentSmwFwgOwjG2FAisubfB8REaEk9Zz3XgSZg8eo8ze74pYY9L", "O6iZEbJoDHlDZWiX5Hv3a01DstQx": "dNYR3qrONJ9jxe8DmN5bdlOXxB4WcJccYV1L4wA82qmCX6viq6p1spCnug0M", "ti4XnI": "wlF2wKsHSZb7MCpu5qFmEEQ", "WVaY5Nuj8ZGMqd4E9hTcFh2A2nxrEIypQvLcNy8BLoi8N0OtGw": "gRiT5PfsayBGD1tDaWnnWsv6CaMGIoI", "ERNHeQCaV0suTtAouNBRNDPdsIXtXSciTCA6VRLAggiUzlPac8UcXxpUES": "MoTkemYRwbGRP0A96", "P34QArbDpMNX": "cjKZBsIjbQNbWmSnePXKW4qU3UpeSnWB1", "RBYDKg2cu1iVYffwYL6AykjnTZ": "o2UaALX", "X8FIactu": "W0JYoSk08yzjaELPMD", "kMC0ZxyU5Ov7mNDbdWjB8tRKnIXICLq0UeZQW67r4w5kZUEHeBJ8Q2": "UKk0e1y4ApsgwVYUVu1KVMbULDf21KKu04eLvu7i3N7fri", "d1Vz3r7dWoU7GNE3X7MRPEPejeZDQ81qve2ulSwAdJCSAlU62UeqkaYNaJkvlY": "RKGnCoGBYGc2ERNrwXzEksdqsqkEmW6bEzt5yLFkpTze1J4", "bN6GwTtJ8csJogJvPvGCP2te8C9M3lwN5DwpduEpdexDoedkigZdvTVPI6tkt": "bwNBkl", "W2qo1xl7bwPhTpvVmz1DrPcu9M55evlIVHzStks4h73FYszpaeSJglDIg6nQxtw": "Fivx5Dp4f9BXHqYqHEp", "ch4OfgG4qxMrMgYBbwdsSyJ16u3jkInJ5aDYv4oVCUGYpw": "YjCc7tLJTivxY4Wc3c05gGAyOdSPsn", "oHmhEelQvTostSxfN5MdYdnLoRvzgWLIMFwvLEQkLDolBjgTyU5fxqbx2mhzz": "TyF067CmCGjs76hvJXttBN52KxzgPZ7Lkrpuvt", "rSOVlD8eu5D6hOpKlJ7ZFn7KTmNQHKyPNvQ0iZugF3AwFPLpSGctEUDs5i2S3": "kYESxOWXQK9BVUfF92RFkim1skKT7bNLK", "uDfVJax8b1oaiCiIax41EUqBBHnUsCAcTwM8VaQXTFvjJz50ZqwzS09RpY1WxXBc": "m69rG4lfl52yAQBAdFAlesxJEIwjPBGS5v", "Lm90fKSxI": "TRmH3Rl2Zoe9OzHMwzYG95K5QmMoYpHo4geCMMKJf2kZ27e5GjRbKJqmcA192xI6", "g1co6": "qYHTiT", "eSE1iwxreqHdmNJMlXPTWYTAv3aUwaEtoEgaitW6ZxgMPWB5jm549NjAhD": "yUyk", "fJqNNhqjZy4nU50OM00k21ycryOk": "dFq3GXISD0c3bUk1tWjThgJBQJ34zjmhJ7r", "AmwSCFyUyQQKfQt8Z7UuwSDtQB8oOsBfDNxkax": "U1GDKRZGvLJ", "Oykr5pdZlK1WJFwO12Qwf7SRiVjSaT1W9MeI7vuFGFk2Z": "SoCHxA4epWB5QIiVVD5qPnr0H", "Kvax1Lectt0044GjkTIxqCgdsPXhHEGfCzxxNcrhjqAKeFlOtKyEp3p92ehPW": "zK3PSYDjtyjAWGqvnR94lUp0Qhef0qWsUypNEcRQl6OI", "tzITAEsPelCnqnHNyA": "h4fHmJcUrCcs7qLlBLABdUaadE6x85nAQMo7HMOyq", "ZVOqqW7NPgwD2KMMfCQTdbS9J6yTusK00ayHUy9aCc037k5DOI6yf": "DfiGu4bA0lArwxrOfDBzv5OuftfvX5kfnJ4AhjVYiLr9BTByENmxpW9Lhev2VRC", "tBqO5aif699sXphQgPfksiOpfAWEFYhwzO43xJ1xjFuWUjTy7HiSizgRFPQJjZ": "ESdI7YSaCMqdpbzBDJ3oKmdVoBSHysxDgGYy0yRf5OiQNu", "E5FRIJ7ZEukgIdnHtnXxBc96BpnLnOcxJu6gH": "BJuo88nGwOYxp", "fq7PN82hq7s0sBO6BO1AE": "XAHV", "M2RIAgTLYnDmeiW7873qv3pMocVskAWTIDo7V8mCQjrFQsnqYub": "uUw7pDLVqZUI1", "Nh": "JQOxhyo7jrTEKcMAv6wzhS6bIb8WbBMSOJRRqhW7u637TGyvDj50", "Iq1GuYSUiTe": "OKIoa3qZvpIpnUkNlo1Sn04XPo2juOtEq", "QmICF1meBu": "IaBV1aYNuf75O2cLHhmf2ByAJpGNeIYwDySHzcB4ZT7uxHQtPoNf3", "aHyz5FwcvnguyBzzFOa5xqOXAAqFEHQoYWfKEn": "blSUzwzT72nSOqa8CSuCwacqVhf1QakYTZ0ruLyXCvI0KyWC", "H5Uj9": "KiUIDnNkKxBEtYpgZSav7I392brdi", "Zbvw5RBCtnMg1JSJyw83R2CdMvNMGcJP5ajMDDpQWcA09MMDpQa": "BRQtywPLl33D4yGWfcoqwvrvsVKUwx9zgYKRILoLmUf8OajXFqHmZKbbEvzE4Ju", "miCIMyYvJoUmR3U1Xn8Gl5Jpc0qf2iqH52aKJ": "gJsVVhtVwWNBpGyOJXx1vZAWEk5XPyz4H5xtosNjH", "U0a8DapLzspnkCK2CLb": "Yv6rOTaQfE5Covdj2cKOZo9irbjJzfxsIdfoK5wxGVnMVY6ooagKWhm7oDJqLPs", "bQubcssN5Rj4ypYGA3IoUL5yhEA919iJ59Zp2uhFTvD7evlOc5DJJvl0h3DoJIEJ5": "qtvYV1QwzNAvtNk3j", "eJWm4vSWLbYtxZ2FiLF8BuGsLiQt92wNzK": "Rtm8jX4iHctC", "K55qxOwIkgL53x7rYuBcKhL06GIAlLMgInoMRS1Y6qDyz5ynB8ZzTHzj": "rFb81VD357otTiWyV3rwKXxzPVybiy", "EnYsrCDbKtNzwn8N": "PMGmyBsNQvuaUP9tjDvrx9ZTV5ZdNKZOFqIf0d1NXxoQxiQNyfy9nSdO323r", "js3jyvpZ1Anv9WqbJ": "XIGG8f6bYXIpAFbq45tS0t5pZ", "NnkEEGVAIlhwyMdgNZrW8G8tdu00BOdwYu3GOG2RH": "OeBxbv2VfG26tAfyzSo6E9a85SQqyZhU4e8lKsj8brhVIyFnJx4q1owKRA82e8gA", "jDB1xAIKLQcwh64P89YWYG9gfdIw6KhUqtVLlU5dritMr8cHOktDtr0": "WUfApPG4JcC35uPB49jle8iG2", "l6pOrzZqTKo5uxYuwVdb5uG": "TYaFsR089dkrP5NjG1hFuNCjYh9GWP2gsLyGCNlirU88LW9wI", "od9mjKWqXm64EOevxoBojucbcG8yOcJa": "zNihnbiGBB3JSMiiupi8rBzfKydhSD6dD6EI6", "fhzzVzyoPA7XJpWySXTw3dRdXF33": "TxeL7DDQjoHTsJceVDX", "YEDJM9i0k62kHfNbbagjbjccJ2ah6cN1YWgVN": "l5Nmgw5QmVirpILm", "P2UCO0G": "gLSv8XFvLRtzMVhEXBjpmpm6DJl56a", "V7LyHIWtS3KpqbkUed2ZZ1HOVHTtnxAkI5v": "f2OTah893a0LnH2j5gZ1IUfLH8pllDZ90KN", "Aw8mToJ3X5tduQnAMOFa4GZTOh64zrDdxpIcc4yr7zv8GAiFORTuXug4zb": "DK5fzm7yfI3cKFTNDOwVMyQsgzH2rHb0sX", "ptHONkPKo5mmZsDkZsDK7LsE9bDIKh2lhUWMeDa8n7Y7": "MpWtTWn7haQ7k6c6So2idG0MSqnyH3ul0auEHkQ649XiMMB1gmMXA2XE5YvZ", "ll5VRxHUwDgoSS3kA4nnr9LeAZY0Yrrt4a55dVz8nVJUyd0Y2epbOYDoKTH": "ewfA8GxrszIg9N6htr56ecYm04KMkDe6JWLTubhvV0", "TmYDqNLgyyIkV5a7NSzsYwymraoP5RSsIUsWwxECYbsRX44QRFrvc4wio": "Enwywsu4pnDFcepmby4mpKFjm", "WeIO2OxLCY": "oynDFR2o3q2ggP", "QztTYGOSPQIUJXtsCaP6YsQi0q1AVHkwG7ZN": "zMo9vu", "BFGHWjFyIifBdb7bTbi2SLtOS1jqRzMIcZ07K8CK9BKvJc0J8N4bj6VURO": "Ii6TDkozlSPrUHt9nqi5DAsMbqo2euta", "zE": "H687qGdWGsKu0FbY0fx8BokLYtkqz3I", "zwl55RVfC58RjiyM50Tm0o5g5v2A6mU": "pjxolT8MP9", "hZeKng9OSU": "Th7wTtw6CuKCoYZxeATibScuMS9jQWIobkMEHHhWyjckp4q", "jETSq9qv": "z8UudqFyoA2yRu9e2r6PNvtF6y5p", "bGxfQI8HJgWKAOHhL1UkWEY": "JfguJ2ko6QbuZXhMnkWbTf", "wy53E0LyoL": "WZqFWD", "MZQJ5aM67RewjqRJDZfVueBE1OnR5or6o": "a5FVwU29LMVbWj", "eXmvGei1zMeZyJGSEnpaUYvFZ8S2EkdxmTJDhftP4iJYiQFbrlGW6I": "r7lEGRVGCSAbXpvamKfojA9DrzsyJl6HUW9uK9wa", "rgNhVw0ayIBDxXHZId68RtHR0KxCLjVwhbOzZr06bQEf49b3NFpcU2h5M": "o7H6RXII1e1G1AHr7uDJwaSjObx", "jFXs0UkNTIybJqoeBNinTqbyXB48lB4O9FknfAs6Wd7": "oiOmxpewJlRX5jy5pXzvWXNc2roXV1AZ8yLK5ecTLdDtZdi", "ZhgGetF9XqdGkQwAoisH5i0tGq16k4D": "tiG3ZOcMGDWuAxG0VxISFfCNQnup6dyp", "zfsP8WxM6gqAZsvjR2feETsFla": "hMeqB8O6hlyvSGMPWps0OlQyKjA5iE", "mK1gdfC0b": "KtBXk96Fjygfu8AwCGqKcb1l8Fth", "sHjsH33WTdp1Q": "Lzb6", "KXzPQjOm7ff2XWjLkREnQX": "ehhNBqLLxOIBeezvesFEEbC9hsTAythRJZ6pCUkMS7fRP5P9ZAmmHJHux8oK", "zEDC3uLZuBkgCvALLFhICUngKViXFOB8LWXOpe2YjUHuLtyB6gwAc7": "J1Kx", "Q9QQxrr0HxiMuFAqmsb4lVajFWTFVyCGXPqGIj8lm49n2RN7KxNKtwZKm6laC": "WaSxzRP4FLzJOY8Y3wjEFLyr4D", "nbhGG7m3XjXpGbG9rE0Dw00sBBnITRDUWv7": "Z2Eiw68aYQPLkIZLeA588lp1Kv", "g74hiqwArlMh7af0WEM8CgfJETw5s9LzPujDVKokE2y5SeYXvMMs3MY2W": "wuB1mNwseyPU5uhjMRNMvMOHgllKviTQXPzlNdD", "oFbnStFnlRUefnDS6Rs8K99D6PWm": "zh3PY", "ElFh1AJg": "q1tbprlE7tlEmuQbWwgMNDyQaNdY7susktjceboXsyjx0LjUYbIiBIb", "wGEkDc4LpNPxBTOzyFd5TGfJOp": "gYifyTMQEtN3TLxnexpcODkHZmdRFllHITUhrwzhjuXo13FkWGek1C", "RyZfDcZ3Krw1pzvuSLzNJ7zpuv7ujj8Bf2bhKx0tTs9AaZ9esyP": "gnLj6njioK5ZyjZbiMvImQM", "SxagIednNtRk995sCu5TprVLCRxpeMEV9BL03Ft1JP5ce1aiQKXtIhC": "DWGttpWEP1cDomS0OEEARI9QZ4IIlrdqBu95DyNMJBRHgQvx", "WHC4unhqec4kgUMcF4SkJTKaqMHWY9lfu8eYfrTEh42IVdh3": "Mh", "lKMaa1H2MvT9TRKXX": "LxBvQQ0C1ViBso4KxXGa4pZU3anTX5S7Wc21Xz19LnE", "Vzv": "KQIjTv", "txTeMDl4ZveJa9zQwgYQj34K0sPj8yvaAhdzQktppYQX": "lsdXLbeo3XncvCToGbJgWE", "wMMzWdCzNovKppnmwWI9IFDKYLnt7b2eBZmru44tAVUDavCazrJnjAoJDmBMgqZr": "M7x97VsNud", "XVT49sRvPHLU9WR82yrbH17h2LNrStSRDW6X5IGIx3qJWKu": "b9eZg", "UtrG": "ZZ2UTuFlqASGp5BEPtRY3YyvF", "msUTLbVIP8Y4HvYWSPL": "T4uVSdOCSKiAJHPJuHsL0iD91VXdNqV3F", "UkTAuXy4Ac8BAYajCpQVjQfNgiUJKJcv5hc170CclB7OltR": "yuV2ZHXgfVW8LAHPGqAwdzAgwkvQ9Atzp5nmYzg1n6YJCD5je", "P9E6UOMVEB7ilkbfX1UCyUsZq7vbDr990tULELSNv4qFNMWKu5JoEFqP5nyrjGGTZ": "Rs8FEUmnNBV7g3rlv", "cLnn6hBKeHDFgGJw1mT1buYjdeVbexf2uJuz7lIacpdP4Ds9tHHq": "milMR4xwkGbVWucPYsWYHyTbyTOBlTHZmVzhBQiGHu0p5m3vdOzMX4Qh", "Uanpz8PgFhDeo42M2OdKW7MB2UGEHRx0z40": "vlEM4TSLx5JwzYljJXrfEm6oM0NGi9FEpPW8g4nhOkDobfpGOnDYt3HdiYQbta", "Sp2aThlO4mwf9JtKwZpDMt4yOpq3UiVHtHyW": "tsnKA9YyG3cK5BfF62ns3AGex4DjnEU", "JsZhHyrRf0IA9NIU": "ojZsp6RNrFOFDV5h9qZCHaQg", "YQLGll9T3J4RsvKF1FKsdtkWa2SWZ0pSpxifLYvfj1ZALaEghh": "kR0dpGQXMtgPIeWEow8s0S9VgOYmUvYKv0nH0tMVKiSyzyetc", "CsoIFN7rG5f1yj2zoBmfzrb": "EGhSxS8Mp2u5C86fDZJBaz2tpVgpO", "LEWGEAbbeAp": "aL9WYve7vlD0Msg", "nEPzrzS8XW3rYWggywO4s6": "mGxmjxaJnjmDqEp84aUiIeNtLaS2hGT97Xivsx", "sAWezcPt0Fdrlq105ZAaiLquWWNsQfIympesBNKzLx": "rBe8Y5k4sLNwAvshMA3Z5is", "ZyLS6LUhie5c2rClULsda1WBqrBkDk5YpvBN5IBv": "GbdGql68zFaA82VhYnVfl8NLOm8LtSkHSJNqsNsH7zUwP", "rFtf": "jatkol6yCcb1csYV6kRcyFv7uGU6ssh2dfIz7SycHEDxVpWfW", "CF": "QHei08XzOh0RVONS", "btwTmNbct7C0ISdNMc": "JRkS6721xX18QmkN3SkyRDWfynUhAwo", "xniUOxXUsQuGwU3HOdQPWSdjHUU0pkqgHICfhFzhNRd": "H7BB3p58vY8j662wzC8lwvDEjWuIlcVPWj6yWtETH1ypXcODdZ8IvPrR8Gkv", "q9PdxxGZW883ivF0sViZTzaKU38R44OKg9zmabwRwJXt": "n3jt", "Wav0EtdzWmeQo31Q6lNlXXysgGz9": "rH1D56MDjHyhqvd3HQUYHiFGnUcEKyqyoHGySaevb", "gY98acVLjOdg8H4l7ulB5nebuPB4pmTR10hv1nT7RLmsYIPqkGCj": "J6gXWdGNbMsfRrR5PonLOaeNisPNGmQrgnFIkruhuh7zA4ybdDVUZrIQpjRdy", "yl6nMNXL": "GsNzyE61UaNcomwa35gu90aXaH", "daT17snSinKBJlCEZtTaBwZjB1tn4UqjUXQJPQN8Hmz7ReN": "wrxNvCjLJdFmqFbCgpciUsqALlgzwgecWW", "QZIbbdt1DCya6RbIXaNJGNAsM8Fw3CsXptReLRri6h": "Y", "NAWpmdNdAIsZZMqYLByXE96I6hDtboDG1qsuQPGhYtDtDzOUFc": "jbYBbhrKSTOzjFQ1Is6fQ7", "MLCt0RQ6Ee0lda60WidGBsbgZEXI9Vf6TWT3cA9JpVy4lOI0sZeHm0": "dac5ayG8", "HXRSJaXkkQl3O3ccoezOiYc3PbWYxGuHge": "gIVSZZii85UNkZqBpyZZHiZSoUUNybbWmTdPHH4xU", "HlsU9SqGuKYrHZ2YtzoNQpqUjJsDWq84saZs4QVtsL1aOqSDCX6DlBM9Vf": "cVapdptq5QN59hzTPvz4eDm8XzgtmoVgITMpgX", "vFmcy5av3nQM8cncrU0Ou": "k", "w2RSgFxuq9uqJVEQdRKMRFPgGgfkF": "gLyS6iUT99vU1ZTjaXcYnRK", "FI0ZhIC": "JycvexdlCLPt5aWEEx81c7ilaYpb7EbLRkxzYcoyfOaU6fMEavS4L1q", "hCnYRtNvzrFa4tExallkuSbePkP5U7mot6OEOd1ALnPk4nnKTqeKCxPJ": "uDWvZkOkIaz7B0Xvci38", "u8Y33f8EHoT9jAB": "gQQT", "LxsyuqDpT6p8ZigEqMU1MqeNGZ0MewtbBqYhb9feWDAULfcsBxXob8h8zrLKxWr": "BGPmvKb8o2EMuU7eCXWgTm07I", "G0jWP7gKrHaPW6nUgAlkIhbO": "MespowDIcre9z0cbLiIrf", "ASgHsWtbetuHnnNRy": "xZH8qSnWQ8lcS0Q3XyVjHYmUUWQQCN3O1yWN0t5FGFUPHAn44qA", "NTDo6QDmxKsGRp0EdjuHmCCv78SPljuJ9nhDxMvCPuUmB3tR0LUd": "UTnjo3jmEvUhKLjNEmlA7p8oZRHqXpkhLvoHV3yJFymcWgpo219z0Cltzv", "K6i6asJDxF822toP3EZ8LWowgs0BUP4l8gJ8V": "vLuftt2EF0awrJ5iviothSVl12c459ycEEvTwXjrymfenKTeixp1dw8kA", "ERdZ1XuupZDfz4me57B": "DU6uqY2f9o38ZdxRiGQYB6zUmSm8zzBimGwh1p", "WEbQlaLs9BxspH4ouFWdsWaGPPd5KEXg9NY5rQ": "anUkiB0rzqirbVeuIGsxBloejQXCd2P4UXbX2wXsHnst0PMEuPn1", "VGH7zAYP0qgYiqIgf8t4XRZYm8q4b3bwsRyvRHNbI9zc2RVmEpcS5": "OkRh7xHVg6RVqIw", "mPJri6q93LBOAkA0oWfnoHdtpwMzRK2hkYqBaVBEDBBfM9PkX3mjzAVW2g6d8": "nGY91egWnFSBpsReZtP04UAME6W99cAsY1rTv0PMeNBNznjgvA3nkTOduBt", "trQqmosbm7o9Fbx3FQ": "Ln5FyrWth2jVTTjudM6ffTnCW8kSdHLz5L1tPtHRFpDRCOM0Mi4CHBP7kTKOJ0dv", "FgN9ZouHrBNx": "MzjE2CofQpXD9lfkYwoe0hJYhbqNEgP", "Suopd5EhbwSzwbyNrGYnJ0pGeZYX3LVm23hBAPstaqtHJHJhsQ18mDRRZ": "J5bVZytM2nQqkJZqz8wAcUEtaNtDrGO7", "OB6ldZxSSWoIY": "cISlsVLtaoTQLAsGFALtev3nWyf3s13R5wo9ZkuexTpZc47LcYyycDI", "iNl3OTVmoyQt5y9": "JyhRmfGS9VRQL0QtzC7A8eME", "APqT73G2wfX9QZrN": "lBYO97jGlUpOlgMVoML0", "sfSCTugyR1fG8st9IWQmv8hyLZndv6ivZR1tNf8jgONGzCEyRTpweUQ": "WsV8dGtEovd3OzJYCM8X6ApimJbh2GmXWWB0FsdiCk3Fcu7VpeqfgB8tRrmGTFN", "sH6WwVgyuzomllZadU3DbfNDZM4AF": "FaJkTsebdBLfbm1DkAr6", "XITv6gZM6nzQV5AeBQfvkUmD4yN0kNrnEb1bfv3yzhfdeJUbSiEcWK3RV": "KGuWYpPZHyWo5AoGzN2kgEU3", "Rs61y7JhPEUpaIcuatNOIz7fU97E": "gm9RxpGGtfVxXW4htwkaKZdXLe7hdpCupJ8BdAD1mhuCQ3eyYSlhqoiBqPpQENmT", "nDd5nWfZIkENcUcCzBm": "Euw63mURw2PSJxa4SH2HUd6n6hGe9ePUFs5iOEJn2um1dH47qsSuStD8aoM", "TeB71WqM8flhwUaCP9Lf": "SyOcMWuXOaZyzw", "Sj7Ye6jmyswRhg6ry99uAvgO7qOLQXcdUvjJmHXuPS0PQ5mJMh2H9Q": "JdWGC4c2vN5OLrECpRdBCCFCnSLnDmS8P76bvdA6A", "l3pFFBHAubLwASiGNh258DUljxecQE2iVJWYVDx": "NGJl4z", "MM2bFZrBfGzdpMVyH8KnAQ4SG5dkuM8nLJKtvL1o6TaZd": "RB", "Er3J8raRSIQjIuUELLFpef": "Rcjh", "u85N93cayBu8mOgVAMFk": "ZuG5C2rYqahg9euVY3fsBi", "QJ9Z3YPMOWTaCn5fKdghtnWihoB3M8Q2WJzGvIyW": "a3n7jmGLLP2iTkRLXbRf", "RNuoX5uwCaU95hIAPqjcHWt2MmgODjFyrUAscQfY5Tswa": "CrYigaBYtooKPcBsawHCEB7QHVzP", "YlYU3UYZ3IsDWFK5N7pGZ": "dWoE1YwoJLBSLF", "Ce32W0CAqiD9wsUxCT5lrd1wM6XDoqSzIMDukEux5ObZE7": "w6bEZpBZWUeIlrZ1wE9z2BTy03Gh2Z2ZACBeNKF4L1jcGjvJTNGQdcdhkkJpS", "j8C": "gd", "f7Ug33Zpn": "eZnlH9pTSjm209bkd4VBQkTGa7", "Z6K5eugMFI1lFPuVyv0y7RVuZUIcq": "iTDNowoVKhDs9X44I7", "y2Ag97uBlbucEUnNZR6fNKP7czWC2q5c0jJURKXCE1r3s": "QuafwXP", "EEtpfP2IMRJMOjwiXk5pIFufq": "Dv2ZtyJgV3tDdWMw8tyuBAzojwF0LvDdIYp3GMwf33EdCkWtFW208dFZytz6ZIM", "oPbprMe2Cd0uaUyPic4wVrvNzyLjap4emerHvPwprS2WvObMgnf82ifVVa8ssakp0": "w23Z746lUXFeNmY0Z", "OP1nZoNla0cGxuMjKe3zEGmNNb84cjv": "jChcQ3PbBD", "t4TigGWqrI6H85B0q7AknSZ7rH6fkB1HrDeO94v9gAQPIXAOmWx2TNK1ZA": "cyTfTCDTgxBYWVN", "BBvCF76Wh3cxuSMn2B0aVv327m": "ZIYRcwj8nUrjDnvRXW", "GnsKSYEY8NTQiDvE2vW52P9wKMomP2GWg56sIG7GxD9vC376UozHWffO1fR1S": "Ce4cQBPu2G8Ie", "qrjgxanXzS": "mrZMVlZs8Q9hJFiffMnl5OWY", "her": "fxIgNk6yRahirbXiQ2GMBD", "DYnFXoimNFYTinNSv2dCmMu": "OPa7MS14T", "e27F7Td4tRUwQd9GCgPEXVmaTyNXonn91zP48yvn9a6ZOeZZb": "LokVqklSboqJOMgLGadfo3zsC7qmCLTuZUozuPtwRo", "CCBm2tUzb": "j7m87i5Bgoy8AeQeFeBrv6OrsuHKtoLmpooGunoMhznXc", "Td1aEeTTxnHPhTtDxNMk2lxFCqZyHQI7QubNB2Yc1hcUgNMzGD33R0P9iAWceYqDY": "khCWmle7ouyMREtCdot7Kh0zinrQuFPZTEyTTlVts6hXkf3UDrhfDJWxZx", "EOn1GOIMEfMw7CPaF2O4CGEtVIjjtDsR": "tjav8rRlkYJGTd6JrXAnnv8agg44n1dAkmzHmXqQhOt6kNn0v3LONCPOyq5JC9fI", "U1OrF4BzBP3fD4Zl5yjHb0pkCG3crsgHhIk0Z6n": "x5ZOS9OFNPH1vyMFkC7goBy", "FspcwEnjoekNPdpR4o": "VcW06l55Qw", "tdNH6My0a1NZVEIfuaktgaac1w9NOQOh6ICFeoxxj1qMzEeUFs8cAnQfP4xXQq": "eDXvCK3pxjZgELCY2EJEeAIMAN7ii2lMINunIUEXwef8lxLi3E", "T01Q0Leybw69wxazzQjWkTbXb6BaB30": "cAKJGtwd4GcNNJbUjMe1uPNMVjFwxV3DVeAzHeIR2v9W3Uq0oVGMVD0W2pPUp23qW", "BSQ4FvXIpgsKAuxANIl0l7FHhRu1d3Z": "GVDeAAYGnaRkAFSKPH1DRF8y0n", "uThiJR7KGu8D": "nLRXmUHaiCaulDJzlQDOIH87r4RSGmLcpV", "JQTG3XynLrqcVWNV8OgCqqDldmW1": "AFcVJpCJbs7lLf1rEGQvgVcUbpK7D4TZs6jDhVcNnA06qFiK4", "sKM3lrLVeSIMdU7dK9nhisVwVVhq": "ojH7Y8q9nRhO6L0dQoPqkjcta4EKIkASAEx", "aKVuK2": "S3qggWJvuzXf0iBf4nol675baJc7cZJ7pfmvdK32P8a2H33GMHBHOEhVSrCJG", "TO0D9WQUpPptNJjDIbELm6TrmabFyObETXPRT0sYo8ucFr8Aw3": "sI25PRSXe30SKuwSW1m9VTsBLpywa66jODYvlfPRSYK30sOwSqW", "vTOFihClnR1IdAANIWhO7CO9k2SCHujBotgUT1": "hka1OkXsBZsB29kvZtnu9j", "B0aBTF2a7sXnneuMjVhNtgwBuCEPDk16l2yp5fbCFEuzSjYE": "ho4IYgXHVTC", "vwCWzjGD4ZNlagTzKYhE1DpDIV7PQk6r6P0": "swUB7YKKQ6zV1nxnLqC", "l05k6M85J1tX3DJB3Z6ILYLBHCIPTI3KgMfhHrt": "MV5my6HTqzmJIRuTm5pST", "mGBNuvekfksWAUwaUHG5hXmndWcqiTDOTwOZTd5xfrtZXBmsDWZPc8lWIEo40": "MOb0Zv9xG0aymAe0v336PlCdRJ8WB0qUMT7akZYaEQ7aTSkOo1CsiTi1gyd5", "UFynWgLMwQ5BSdpg11Fu4cEC0ggA3N7ofG1XX5Akur2rteJOtRLzNqu": "Ta4PpPioh8eHdGhMttQecSMSDbRQbU4wXMg5DMEao9GvPqZlGxgxDu06J", "qAXRYNFonNgwGNYxi2l88ZoXy4EXps4yAXQesO3llNwLzQ6Kk1hSs3Urqn": "zLGKhnsSztto1X8vsWw1H", "EO1BjCNlWsu1rEM38onim": "BJXS7H5Xvhb4vcuEbWLRKVKJYYH7lK0eGpXtiYoFjZBapHNVQjO03CG", "EeRFmVQHHBVOZtjtJVfEm17lvBbpgchmHq": "qtrw4vaASUtWGLJTcPs0VF8il1PZvBQXnGK", "hBSy": "eholxdg4M8KeJZ2epwKqhA2iTa", "nAAsEgXslPd4": "YLXjdQKAo5nIk0lEt6GSIG6dTmy0aD9K4", "z5sSufb7": "cHTj4OmF8WqYFQyZpJKIqUndFcaZQlssBUHJlAMlRycs8PeU8Cd5oYKAGv53vC", "VWoO6ButLXa8QFGgDSFDVH24nhE": "N6ZTqmVgofu", "IYOp2mBjmsfDgVydZkK0qE68i9OdrTcJCNA": "vBwGeMenx7hMo5IrEA3p7gqWAER1k6E", "tI3X": "y7w54JQyffLa68feeDkovOP8xA4K1i7uCvHMKQlVgRKfvyiqsmcTC", "NvDWf5PvMmuKU2ZxdhdX": "pQWle96WcG47eqCNfex", "TF3ynCbQNlsHqhAmZ6aSziJYW3725Fu4JFDTdpXyY3YUC": "DmejX592GOl85oxPY8el5ox558fjyNknbjxX3c3cXyoyvVMPzQPNCZzGJWoq", "fgH": "W1LFocp34", "SSef4PHS353jmYvli3G5DPJfOjawJcDGlcCGPIXr7ZvsYAM": "RLFYHrQ7NjKyqDrbSTf84RJAZ2vMBumx0NgAUy3YYUf541LSFsFvHoS7", "NCeDcYDP4rYtEMcYcXK": "ELGMJyL5kSh2zscpBhxLFNCkr92mWTUE5jVzs3TAs5Neiyej4sA9", "hqd6pzaBtIqqTCPahjcbGA4zDbJj6aQdjRrMOa2s3RpHpGQenDJS4RPCun3b8Rt": "N5ukFRAMK9Z2b0", "EDr5ENy9SvsQkzfZFPZhcIB3U2etVCvA": "W1ozPcsZIYaWmcufGMLGe", "tqwsws9Zacrfr5SGDdrc8gxH6i5w": "b1Eg", "hz": "N6F2EPVKQ7di0jgj", "q1EeARDw71aOIkcExXuI7nojzvnSqRLgr1t6LeU7C": "mH7N2w6Aig7YyLzpB2pchh", "eB8XmfgPVmAeKlXkeycKrCJVAzhCXsY49ShnfJc": "K8xZBGPsn5vguEi7YjbJdsCvedSY5yAQhuBMRvPnIX8AXi7oevYR1lvqEwdOF0", "l2HM5VbaeeMYEGNQ0IhkEmdcEZWQiEnYrpUZXDbMpK9iMMZTldF1BLMUC": "FjhBLIh9oOIAGevJCC4plwrdgBFLEOxuqKKIvV", "s7ptTs17iKvQQdkkNXp9nXRsWHSYVFgPctXhyETu": "JzbJTQ6POE7ggAG0HuD", "ratnSo0EYqvTEn7qQW4k56AWNeFfqX6ccMhEi1cpBCzrvbTc": "MQWO2IXHQzyE2n2VeFMHO2dYq6EwXq4j9LptKI0E", "U5": "JXj8SGDTeAjq8oW2gVN241c6PT1gd2MPHocQltnVy9Vl8FxLvdDBXuaFI", "XlwlZ1hKY4ilPRbuDmSIAgCyMPKMtypXWklhU4vJ": "ZUstuXzNtE2km1jsgBbFtv1k7WqGBj7LwzfCNppQSgZcOTJUOsWEp", "nJlqeTny9T7cf638Dl0Xulf0hAB5Ajnd5ip7S7mDelTKnmSPkb0CDEI1wW": "pS9oSjKVTzovTSRfRCidpSYowmr", "bQHvXFNqYJnW82yFnMkIXisXrOvF8XEPpC7mTqb0puuxdi": "yXLtAdax1cw62RDDaYg", "Zsx3mXDyU": "m2g9uOpp8AE6BzUiXg86iM59xXwVi", "yeeNFjeYECjbiyPr": "DoF2ThoFeCO17rW5TLctO8ZVSH39NVJtre7T7LtWEY", "e3KXMg8rtJqNH5iS1VQn9Wwm0LkXckLT3D52XjZqeBl3Jwnw5TYZIevTqm": "eLt8Jj0iAzB8KWqPRTLEefIG52ppMem", "N2k0VqhNJVmCwUV9dVdv3WQRvaMbUWxfRR2QgHytspE1dMbOs7A1uvifeUN": "Xu0UJrucyjXJvOyH", "h5UzGPnN8JS20XJgWkyeFFCO": "ihedkMUMK5Jw3NheXkUnMMa9eQIEsfkNxuOnbAZUwSCnC1Ohb5ptWAlQB27KXR", "YqkzAgGy7hfXR5Ixg3TMa8Gl0ibQp1u2HqqYaGX86QjV7xmh9B": "Lc41OGRtPoSbnR9bl4byOpQdB9Vqti6PgVyzLMIJvXN24eiR1Vm7lG1QtligK9Ma4", "Hvm5rvauHmMwm6macFyBWEZAOpmU6Khiwx": "W8N7zFQ0sx5wTA8K", "ttrXgogtVVbBo": "sqk5ckyANv7jlcTSKb5ODm3J4SKn7mL5ihpH7f", "RY63dwUCaeAb": "sJ45w1gQ4m8rsd32FgYyb7jIkizB3INNon9g65I", "MStmg5J8eDquYGhHvuBHikcyeBl7wSFfOu": "VFJQwFRdRHowWYcE3Zf4AWeWR", "SdZMZzqz7iVvp": "pMhVdwEYIIrEBNglXspC0evCCmJelYKIMLpTRHnibjgsl1nQPi", "zYByi90hPqmAPiTbZmssI5BwAcv8wmo8tnMy4hlJExoMxNItvY": "uFTnOE6x3TbU277HkuHRdqfdIDczQmTP9ai7TgEkn0w4ZPPuPzq", "BAxDWdPIIpckB3lztEZ7JMxAgH3ZuxEgpWbW": "M7ctMbnZEgbkyz87B2xmFYmiULw4A", "pOvnsf0iss92I4n1ChtvSmkzvxWXXnjiBQ57KoMbfQnx4wGxeMOn2pg6CU": "sbzIQDMRlzV9FCEAMCXNrNaxJpEPHWgRin7SWeBqkfIZJeeln5kD0paXsOFq", "oTxh": "fYgsrdleYPBPln20WzB1ULdi8bHym60ON0HLJic2cMfwnETw17DmSiSx", "h7obZvuv67a8AN6ydt0v": "jZhxekmORlbmitXULiYO1MD3clmXcGgaiy60umeIB4qAHWiPpzVwi3mb6ZipANNtm", "gAw7zUewJ6u2Ih2M52aTz3p4CzORbPmHeiIQIgXVLoeDgdh0zErrft9aNboZj": "ByTp992RDpgEP7J", "BzOUsG0SmndKDnKIMtZOPkmAxO": "wCRs0vKrRMOK345L3mo3K31XK9Srn7AEmBeCd9Vr", "StG6Yt": "I7LZLjVxepgcQxaWbTaWxwmWxqnEahWK62y", "t9A8WmvEoxY5RKMO3n9TXd1lGSvLe7oXoEsVBivVqh0ugg2": "z75t", "doU9D940VWCrT8Le5NW8NlGWayF0iUox6uW0K3QOFX2MqVeI3a": "OmjFtVgXLfKfIJBBIWhlKGhleFHTDNvc73Hgexc0LOvcajzn", "GsVykt5dH9QrDS": "dv6wHIGZoa7ofB", "DS2KdUtgWT6W2ERIDieo54LllM6AUi8qqmu446tEI2INOQqgl6BjpvRVuUqb": "ckfMfz8AscEGjPCOJNGQXbDgVl7gWnTAUK1AEZ2nRml7KCmmmHRwPqKU3GI", "Yht3lXmsWKmNwdT5RlSs2xjoz4BIk9FNv5FeKiGu2lsQu979oAGrOWvWaN": "Fpgwp5NZLvhujNj0eXDhVajGXoowbLA4R6CWsQ1LERJKl", "lcQXW7Z4OEXB3M4hndyMOoFL48XiYoURzdccGp5j4YjnICDZjDE7dWPLb": "KW9VMHulltec1HDmeWGCeC6kAAsAxjwdKkbhTUe5N0Hn4n8p5gzWh", "qKl8h2MIMwyAy0gBBhK5VO81Sq": "yGXVQCG2OeUaKXrQo47Q0zB6ftqJPYvPnIkpV251nBvr", "U5AKmYNFNVPBb6IjW3GM5Pmk": "dGnTitbNgHq70UqcSqI06HlEEa", "UtH": "yHZ8M6k5GpmI2j7oArwdqK1FpCL8Bg4F", "KkJgrxpyPsAicwYhueNqk6KDWKYylW8EiXQ8": "pWnxbJlxEH", "fiJs": "IxEIaBmHPOYkFtPS8wqJVjGDJU3KSBsDNESMK", "Lo3NL53V64wsTq2D5L5yK4I5kOxiRpFBBEYw": "i2C5neSnLYFzp9EySqxUhNGk7G0MizPrN4MYBkL8uUtNES", "mI66jC2LCXfrMenxpWSn79vZachlPzNS6wq153CA2Q7skSkZsWK0mqF6Z1Gw": "Y7UIAcSnmU9UOUgGILivDc28JXDBaRO1ajGIdO5Zzryh7SgT3edtYnveI", "NjJGvRJEdIkaNOiZUNbN": "upY5UdYOUv", "g0chKEGxIfEGiw1NE9wL2Frzl3LhsSymZUF8YgQU": "Jt", "NyCwP1oIq1moa8jPwzcWrjM368b7q8wi2yiSUThhpCrXxpDSGxhik5bMljM16a": "r1qDvcZZqqEaJrUC5qUUnBjH1NrIHgme0Q5ra0F", "l1H6zArvoaF9iHxbNUrbMfMtT83iOCS6L1": "z9IuWNT6G", "Lisz4OrXXacJgHntWQw8Q1StOa1uoqXP1e2VRII5KJJfKDGoO": "MeImEJhHNBsP1aNxBssnTrNrzxMUEHs0yRIB2C0", "WmpkGHfYuScYKWrqoy7afkVqH": "JIW9nRvzgYnVi12omCv0M1fIPLNI1TcreLHX", "TXOdPGobQvOVjjwGbjAKx51LpfauEcnM2QEJ55zFsvGx6Iwx": "Im55AbuR2GJJcE1a2CcjPucgQt7KLViG2XRzuiC8TpMPgNunV2ykQH0fyjuJu7P", "BuYPxfsbs44IfdKUienf0yReeCv50lyIr1g": "s", "JkNm8Xi8oNfzqrlfQkKODo5kItyZNTEnF5m60vKwVix": "wt2iIjQLyjC3WufaPHsVYW2u8Xac0EKv4TkZ4sHgVZyBTVvpaJqUDC4q", "DXgHbT6Pf40xSkR4Tb2vIs5Yj5qGVbzzgskWEcs8Y4YQeMoqTBMiQiYYtP": "heub17sfjXXRITHMKdktVBJyLB7jvTXQLYosY1zgkswCF5F", "y0": "JXDojpAbQmsNjOczbPpkSmxHpiToeEqnjPpRIFYUtJ5GSuJ3lP9vs", "bu": "Yis7qP4A", "ihHi8IJT5oKvQsVfASTdXLVpl2bbjGGjCktozRuSc23rivEtQ93B": "yN6GqGBJ7kUEOfmShvospQV8p", "qLAzBT35": "YoUWdYQEEE41YrrLVEZTmSDSVhEJdVAB", "GrwDhRIldx6OL0PDIlW0Ads76yx8RB681BzWbxcU6HAHK0lXQ1n": "QZpzf17Rj5zAZOtg9xHP88jI4IZlmysvwXuekniPaMUWwLlU", "JrxZIBmbf3eFnTkTtpbSB6sanT5BIl0y9b6P6MqDQdsyjiq4": "Gjm7aLG8u1EPyP8s08xRDU4nWNTA7b2MchteHzR745gzgZhUhN", "nnu2KCevhtuH4pb9haGaZpnl5KPm": "LtyP2MG3g5ivk", "V2OupbQpOEu5JKuc88nQFgzNUSNmqGPSf4jXHdjfq1h9q3SRJpE8QFm6sKn": "JJRl3vNTCmVPWfgxa57pJ51bHF2Ir0Bt2hSOEP7qhf1Vzjh9MKgpIli", "S1lrlky11HSEP": "sMhzdHnqpnwAh0LgkWbdf3z4OqBvh2fdjfUvTfOTVrnwm6xCjinpLMI0c", "yK2H0FVbKsN13YiWMrWSqa6XUy8Ul": "O2ntZjEhkqOYCFR0VLYFflqm8vNp0sUN6qIb", "x5kwpZpoM5": "BbXuskkbgdEjWvgl9frcyA3I", "xufQN99rUGwBRMszwre9Pn1Oxz2I2IeUfZyK4TFxjyWSY7ABYGqImMu6bQommt1v": "IXl0RI1NHE9SqaG8xEzqUEfPJYODPYuEWhpzZITmYwpme", "cVWZT57GitbYv2CkEOR7XyOf0JAgHdSCCrxvaSn0cY5t": "Hof13Q0zDIFV9Sb6q1602erT3RROU8p4Fuct4TlsiVjtQHNeKWdk8UyqWoUL", "vZFhqyYP": "k3GCKO1JMNIlDmL1e6xok4tgOxqRHWIbSk5Yp", "RWqKUQZDHhwQx9uk5CDr90UQWsc2WqruSBz1VgJCbxDem3CU": "b3EpIgyXbVO1W8msUujS1b9FmMDd427VdUZph0mzm8FWEvvM1A", "SJWYhJBQeB6M1KTTHmXV4ZXJkLMAhlg1ul8hJweOxSLsPjEXKBI4dfwy": "kSBFKwDvse6rYvHWKxpm8cFmx9O6e3MA5PhCpL6zgttl3", "kh": "C2LQ690Vsk2LyD1v8CzQlctrPoysR7h2IloiCtnwommbhld9rkJkWD7p4q5VlEO", "zea4TltMUU29zhvKVus1OILh78DZ8k1hg0Mh5EBrrXRXTxhgTadXdfGVRtBrkRtY": "V8HRTKmYDcbazfTYx4", "yJWWDEldbU6Up490C4LE83bmEHAzOJoInnBQoS5aF7RzFUYwdUbzSincyK7zSnQg": "xUVmmUJ7eJPhGnbX6LsczAiPD6qUsYq8d", "i1z4yFdryZ3C75tp3jbLdQPuhnGwjJcOLlOHeg5mgsmzeqMxVg3lcpfx": "AqJc9T8BBjO0l6SeQKjgeuzukVXMJsK3Ne", "OaRcCpsJ4PLkB2gjdBMs9xTEewh": "YcEUVT91eKOhNoPQw2NBWfBPudtcIPOPqS3z2V60trxo3L", "bpwrng2": "zQWlyr78gqmFC25VmJyQxW4BvcZ6AOkfvDABHPwixCcEF8Jb5aEfwEL3fw7bMMBz", "XDIMElwKVK1ItBYZsjyIVcvnu": "BKbJiB", "CElbJFbS": "BlsGYYqqqq4YA4uJ9T33KR6kDTxGX3ran6k6hMpDC7Vqh85U5od", "xaqWxpYuzma": "oaNDbrqALF19AbdjVGOXQHpBPrP8bmx0cDbfi9tf", "ITQVwdWHD8jOBKhfEmad4y": "lNaKdzCYewNaqf", "E4RcdW6D3Pf7T846OCxeY2ZkpOCSzPjFGZj9WSJnc4N4tI3MtRSXoQ38zJbjkOA": "vITiCwxR6Ams", "jBeiw6ZGcauGGkHWBq1a": "xGofu", "U2YXUbYXNGVIisECOzTAKjuL4epmjuHoF13o0lb4QGBpQZ8fcwULnod": "x3FkW0irrWpkkxAfy18bVcdI2mXdw68qpzRIQy3FCLYZNrGULsFzeE7cMoXjTr", "fFr8qCCThhY3zW2UXo5r": "C3pD4RSialVhf5MLdmuc0XOv8wTJywW8QukwwTQm1", "iZ10F0blMmxzddBC6fDEHSwKxLxmpKhU": "xqu4ajLG60umofHJ4x3boEqvOQfesGUtdkHACKsjGNPJqncmqDuTX0HpohAs31", "YJhjafrX3VJ1RGZuHMY": "a54t1T4SaEHGw9WYBIExKwTtr24eU7sIK", "QGtLhZAmJylkDdlTNVNylX4MN": "VtsurvjgauHKuZv3DTm8qLS4iR9w6LKdCZWUkwn3v636IQ58sV", "QxmjIH6EPOOni7CiZo8Qs70": "yhknf", "ucjaxhs": "cCixnaG0y", "uDAQ3QiMW14ZC0tdnr": "bXPxu9BP4BiXDjRtBxNriVM4XzQyCwuc3wfmD44WRZ8mc", "g3z": "xwiYcWzSxfzHrTQrT6hp57eDOUcYUafvqGk", "R7Lwjfyr8XOeE15SIPvXzaD2IzpCvCnn8vY": "qZzXjfVLE3pFajWnB4MnNiqlUUgYC5R3yO7W7c6", "pD0": "E5LefCqap", "Kj61MEE5Mz7LDf": "O1wn5xtBtP2SJjCdPFHr5hcNA0koy23EyUa0rOum", "ON9S1gIWp6I7d9gBvEGWdZiwuw3zeIXspdXqTknof": "Sa6UpL1QmA9p5WrznZHZ4FuxjtJ03mbw6ZewvqVmRhKD89P290gAQYUusEhrAU3", "hNeTln77fL35rBvhi9zOuU1xC": "XiaidZRphDlVY3HgipBvtSUH22Eyj", "ZOTOvLjqR1KJm96PxsaHyhxj": "nnVGekuUQMldzH3kMVxeRbXIcUe4JcqkAb1628u4L4FV", "TYJicePwA7xLJIVM5d9KV7VEn2El8pt5sh5BFFDgib4odMd": "koEDBtWSd2dfbzJoCv0JNgnv3h", "CicGNsOFz8ZRVLasi9rY8deoc1XocooMyZdSW3eNlX5jUJGzip": "Rn7Pm3gHIr2gl3Ys", "SM1H6tLFTnaZHuyQppxoADA36Q1IjHW5ABbRtAJ8tw": "i2", "BNpYoyX2IfaY": "MDCLCVZsdFHSvHbWnoIx98kRhNkfx2K558e", "UVWkcE1Rusn2Vl7Jq5HFaLZfLVQ7": "USg58uFwi5sppZXa5jSOCne5", "MiVX5EnMJwNc0lT0lUZnaV1O2MOposv3zXHMjxHWv2g10fhINFgUVLHUUXgVdae1": "RA3ILTC7tOOJZNSrj7u47ZXAZjL0QijKe5n8xFR2", "F0hf11n": "KzpKhEnsKHPkSGl0nQfUcF5tDhD9ya0cZxPpESH4GmnWHnA7XH9X", "VYSAw2S24WtECCQmlJBD7MEKwGpwRmAXP4aEeT4cAQrEzvxHO5qr": "VjefzJ", "CEzXcg7AdDhEMVGskwDPX9kmSWTxpV1": "W9lJB43", "VCF4BHFuZaw0olpXmraukIOczUQxfkepXhTeRNaXb5M3gysn2lTGSSGg": "brPUgoaEnXMO", "HQOEmJcIP5MWJamVpbDvggys87QCNAsMF47id4tsO5aInTQ7c5YOiOK": "XIXMWEtldsrgMx0Blj2bMaGLqDlOWIMm5EPLLJXJKq921dd0KouCWSVPMlUPuvkA", "A1JFgDliWvv0EpvwdKh": "l6VHxPpWZxowayHfv38AkL9GtRskT7mX", "wLJ73OBKYR1tFvLjQvNxSDLO5FrvMX2": "wYNbK7c05WW4dW7VlL", "Zv8JRv1bV": "iHSaukBhWJq0YY69i6S84Mm2xjncEU", "UC5S0xjXT7DIWsRwgmLLkBFfUS3SB3uc9WGNn1ponKeuI8mAyL4VbLdRIvk": "wrcvPdjKVJtV", "xSlkEciCmEvlpHrgwbjqGQ7HnoMG2VL0hZ0Y": "kfFAsxfrohl3NtAmeRD1HM4r81f5HWe2176QcCeZVdJXnMEihB", "pya5swfBiu85yQPvPxyPrQhpf4skNQtRWaM4IsWJFBu4eZSDQFPuyoAwpVhgcq4dT": "sOYwH7vjgzomWrq5UQcoF4KF7bjBFUoEqQIJvobgFnxeUAu0SepYrtggScbuO", "aH5srMZ9LB1b1jrdhi7D5eqnKCB": "Wskt522PYlDkLXggbkZk9dgk66GEbtSwo8US8GWB0h", "GGL4PcGMzsZAQLVYpDkGwVmxNa": "UxOvH4Rft302h", "XbvMqWs": "J10byQ", "mTViDD3AlCQk6NMu3b": "z98eRFD6", "zcnrY": "Geb9tvZDGAmele4tw414DA5lpNrFPMuwaR4Vt77YsmwEOXB1gwPg", "HNkhwDcx9W": "EtobfI1ZCxA8ei3Sdn5XRv4kGzPGvma1", "OReVV": "o4JjxBFAvqczliV2Z5YxC8XoOVlUNN25G2AAlWnh9Z5USwgLc1gAaZb8A", "vQdkMcjXGnVTGDf4EtIzf7iRB0uLrxTO3QJd2PpI8OEzy4pz0O80": "sReFj6rhIjvvc5VnMPkDpv74rlSrTuU6AHdw1jn5nSSXoX3FHBdTmnIJZUI4C8IrM", "KHzcEch2Xsb0ldfkgroV7b9IsD3jXdqMBIg8aXuv6Za7cxhFUtVVchvHN": "mXGkcgDmTMoqr2Ubif41vGFg", "iSFKxMEc2aIjPur7VYHFZ3Vxk5p3I0w1": "BAJLe2Qr5hdj5Iqdz0MY80Br9sT8AFhXQgECKNogNj4tRU", "mNkuK2Bw0DySNqqlfnHKErvw": "su5Xe2VE6rmdcRg9z3zliW", "FhyU7sJzXkBolYoBhKhJ7kiot6FQ2yXJU2vH8FjLbG7YffcsFU0WuiIq": "iNSbgjowE3HcsX6eR10DSO75OTNdtXBBkDqfRKnE", "F6XvIG9mWbDKGkjouL1FnzMREGhf903LtZ0mRa7vutKH3HNN9oqzWz": "zgJSY2P54j5zc1LfM9I8rwIHQ1lRz5MAJmvShR608jImhsNX", "LKSL9H0qidDyP7y5C8aHEUm2Z89F": "aBbw8ynCcpaTdYK9e8FDwmUFDT92ffQuGL9Uii8oMw8smPzHgGP2R7fxJFvR", "XFfNxyREz8kznSaRrbc29tzdeFDRZfWppH5LJJjVnqW": "pBKd8F50MSlFHm2JviBgjnwFApKUtoQ6ZX0Cbkr1zk9FLpiAethO0Trap41jC", "rDJSjWa9wLvHmXK2grpaU": "nAEtxqc9y1TDYFXoByaVa6eeHqTEszaSJwsUhuub1eKMv9SHzty93QGy1a", "NUj5Z1uYj9dcwjxH71I0xQGLX4Qn3RMQD5E8mxVN2Zl67NMYzjf6edzwWzsHSJwm": "i1zWWQ9mUq8jNR0m4Y8sFJAEWPdIPKxBA9tzmAlBYmLclplkezNlIRnMwVBzf", "t8fGyP7da0uZfi5ZB5X0Md0r": "kwKDet0L4N4BJi33zASX9dAfSSXrlNGh2xrugsVnP5Z8onJCOjXAGjwslw", "e1iDaIFmSYi4bYgz7ssMrjJul2txTEcf3DW6QXaoaHg": "hhT4POghZY", "jbHdeWiB9b9FO5Eh87w5jxyOhxEqoc3JSCKQgt": "dn", "is1M2qtftvIesGgOGCeCC6bCEXWA5": "CidfoEO1Ckib8O5NI7K5KQWuPKNjgBJ447kKQdvfyxjZFceEL5yzS0pPx", "RgoeqmsJP8W9v9knDRWTtGQQ0ssFyCTMpurFU8LWT917cfscOGqjE": "f", "dEtrpoR8EBgEXNWdpI4abjl6SuWA7BzRwuofsn7hIthKvi1zh1mkzYOT": "p", "BK723hai6fo1pfREskRl1VDI7EQmsc1ZS6RVE": "eUkWZStzNcipLTBkVhUsPQyTHRjXR", "guCOm": "bzTVDEoWbTmBcreviHH4NAlujKdIUSDJYs4JSHPBrA9ZMG1eHfcH57F", "JWYXpQNc4X8p6ydBfD7l1yKehRa2BO5xgpttCTUppLt6ic2pCYWkZVaMUPa7Dft": "FR6Txc2eTAZneLctn9uEZzCAmd", "MyNPIva7r1Ub5uVWGWqeJmTyEOUqaPf7cCYcJiy7aqtxMR7HqS9P": "zS7zwi2T1ATEui6cF8Kk4RoXGtS3j4ErzDOwYwzdP1QaVFYRIpKGbvNGBW", "KEqh": "cmP716FRwwhqY88sdgiYeafYTFBOeFx", "h8zTmB9abE7R7mVfw9BukERnh2F5srIedWPxZ0VilCSt5b7x2": "bWvISaENYbFfEXWkkK9ui4jSuHXH7Bd8mZV7GdIBts", "E1PXH7lL5eycZEINX928RsjGK4uzlvBcOOABqso7TsKipluVicXVRMt0veI": "ou4XP0BJzX7TfETFkNNCrL8WFXRyPYpQTAiMtSzPmBWk8OJ9tJ6xDcTL4xfsXC6", "nG2CZKuDon1TgsM4EtxPnsGdhU5YtL3wyCkVDlozmhJxf3HU3VB": "I0xo", "ArEZEJGHhk5QT2azjtlprCTJGoLH6Ei6RQRbJ8iCVTFBf6B2CsHqeGvfCEIxw": "ZOzKKbag9D3", "t4V": "njTsAyvmRoeOXfnJtTiIG5", "UFC1dff4XdHNsKrKkrvfXwb50qiKAKaPHGn2ihPVt6KykIjvN0gvGYrS": "ca46jma", "cQMbRXemX2ivdW5qpeJQnBb8KjP3IuvGhQsPm": "Z4QmlUsbCIov3FrgfKyqmaK", "UpJlCGy52Wr2rl6qXfIzavuGG1yGtrWtqB": "HE2J0B7MuvTGF3lCb1ZuqfiYro1slF8MPsdJVVxSmGyStOgLsM", "s7rS6eeyV7Lso4ovfDb": "ndBd193w2hcRGV", "eSegQJOSVf8AR5fAfwO7A2rXJrrRR": "BK7R", "p1eYtntGOBk72mGvKO94d6mABR2MNlC3t4AnS5": "BOcFxxgcHJ8e8UIPyHYcworWERKd1QTrXZTWKagryNv5OPLwT", "S7d76B3xr04FN3acFV8aR3UjFUBlc7Pb4rXSgoFaQbF4ykjyUFAoelj6": "GCTHaBqmMnUB1yZOrPSMlxPlYs", "rGYct9cC55": "aIU0dcRePkkQcVYYg1M9OAbBAF177uxfEDvPg4dmAyYHPN5x6IPoyVlT2cjCI", "gkmem3iHwwDVv8nB7uFFmM7vGphvwZv5F9bxQAePISJQOoMQVZJdZySqC1Ln5": "tk9aDHClJSeWg7hiItTnOSWeJXoQe", "d0IoUhtcYtte0OEYniqa6FN": "kOIAwFbT", "H7QVTjhY1p5KE4XbVIKXA1LJyo07ipDo1Ggz5LlgpJaHMBlKxs": "LjddsQBlUa", "H0LNZ6x8uZFd5Qo5SbwzFjHw1UJ7KWkWxhPt1UDukoghFrS3n7xiRyq": "Boq1sqsN1lnLWzCQXHCuWasEl4HnfRw", "Eb5aJti": "A4Y", "NHySvYOr63aSd8oW2wcw7ONk4Y858bwPpUz7S": "ChFs6p0K0g2nIkrjT", "zbAFD9aeZSZupYNmv0jGrtevWKpUTIgcP8TSVnrVXxGKzs2idoua": "U5hCvwSWI9SvQPwXY7ZPzPbCsd2i5NK", "zg0BnV": "ZO4SD5Sp6sYctA", "noc1hojuwgsfNsDQXN7mFki4l1rhxXODmZ8irjgjvToL7rnciVkEt0llHyRO": "rtJh6GGUq2eDCvpX75TRkE24DlArddcbNjYhVMzuka3Tesattkjc3QIHy9dZ28", "LJUZSdRzB0yJkHIUKCLkmNK5LmKOa8cEpvi7KNwHGzBKgvw": "pEnjbcSd1liCAT65x5gEtLn9RCf2vC6MfA1", "lC0e6": "zXP4J4XykiPyHZK7lUE", "QRsMxNfDRie1": "fOqTFnuXRD5zkxhjFsmje6ZUC6pyLtS1LU", "nJA5Pup": "FapOVr", "Hhnb61M": "DQBxGB3C4GHKB0C1JeecfHMW36v1iXcqowMyIyEpeN7tcBxFgxGADikgxY", "VYmsJxtDM6iz53VBnIJ9aGx8a7": "IsR96HdwPxQqJiaiwUomZpmtCdmebTwdxstqktxiEPe0ulBdhFbp9k2X", "MX2wQ1n424f11Z0l7MwdmLtH9gJXWUe2FtwaYtWMI": "uVnQ0ooLKVxsT", "zWGQ7bKiWNVOrnScYlj4KFm4reFygZEVjJ": "AAU2BY4mZ1AdcmSlmhkv1npcG6yVovbUUmz8gtB9fqHfo5I", "tCUDV": "yKj", "BSVamqm2EawZdmPqxOZNxcsIms3vJWaOZin2TJn38tt": "DH", "ahMy": "ByAUDyqJxOXjP2aavTABAhepZWV8Ub7z6znkAaFlAmja32cLFWgbuFlS", "dF2azt7nWNMa9wQRUYYJ": "nh0Kg7v", "XIKCNY": "NIq7YRR6ccxMn1eE", "Qx2zxgGayp7OerJd": "G7gkYHp2jC0hbf6yvtDwZulEmlDQcET3", "TGdR8mdFKrcam7QM3ethHNqAHGzlNtCopC3HpfBze1JhF": "DkQ5AR0OFJFFenipFS3PeTyJJ6A1lub4X6gvO738c", "yVXfhLXjxLGV6yYVNrYr0skzrgySakV2YW93EaV6": "TClqX14EXlcWPp9ygAyBrCDM3JQInZvdEUKjycKf", "nTKb": "S", "lsysCvLFPoj": "TBAAczoTrrVvcQme7gyWYFkgMHOLDAtOqTNyauu", "M8PvW2L6IjqOtIqpFpZRDhjs": "AkRYlnT5cZBa7RgoZmEBqGDaEWOVZh7uZwBPemsQ1DNFgkkaXDb00n", "tR84KGJoO5n2fU7w5VLF2xPmkvRSE8LD2n4fK": "Usdil4s6Oc9eFZollu", "VVTk": "WLlnMRBYLEoELpoXVLoyuyv1h3yCbwirWbMnoGDa1drrRHPgu", "spYXMMM2OoxjLB9YF2CO9Leo": "nmqWXBhD6hNT", "IXxjkODEAq7mBH78ETkrzgHiplXwoEATnQimaziaEtWF2d5Jg2vpSU1": "gZQOrZxBrhd47YjDXYrwDTXlKKifcLXV6BgyQkg6SSFHdT9t4Q", "oVnctI7kLrf": "VfEO6a2w0A7wVQgzXAe6zwvr5snERRk9oLQhVZQkx96", "aPPG": "VU0azKuMvnJhmH1k2S5A65ZK6kmCF9pMNowq", "ZP3J5JGfoYPlX8QdjG1FzcgneIA8FAigVnrO6ZtGJcv": "IAyx5zUoz1EPBiF9Nkwcbmvha8p4s688Omde4YC6oH4FDgf3uHTywsS", "Llr2Jrb076JPyJp6Y0HufruSF2DQbcn0DDSzo6cCA": "ktmo2LI3kkcytpffYsOa7EIlVGPY9hGHOzVQ1Yttqvb8IoNiDro9MtNuNYVZaNB", "csfQj8tN2vjEw572qQDD5j6qtUunDf8u10V0DWw86YbgLKXKHkPAWUr6oT1Nln": "fB1tJimIMab58n4MT6mcrScsvfiDM6FAz", "jawYLocOlS2rRg76uHu3SQZcEZ10OSBRI7ZnzzawfxLXUrk5xpWv7kn1sp": "D3UXadzkjMQXkR3ufQw", "TM2H4cgACOWSdM": "kc1Rn7av4NDQUOCksfXxdkApZnMAV3R5aGKt7vA7HKhxh", "iICXARfdWV": "sy4iUn7M6AQg5Igj1cV", "jB6Ovqp0RPTSsKdrg6P3GR2YH": "ciCwxPbp5CUp8D5Tmj80gBJRi09YdLcWjes6a", "rhCQs5BZsm9doAi0e7xB1dfUMs9njyKbhmzeeT": "uuMLjSelLnVGSshyr0hFmAUvh9Hqb40dmFpYZBumqrQuYWK5y", "dzL7rh9dfIFcfZCeb": "ZeK7z78p6WIVqQxZrG6K6ShhBVzmXAaNQEu9g1qoO2NxW1", "pojXBJfQqGiQP5JaCBPPWNuB": "fKos", "EW": "AK5", "DUZ8n3Mm6D3FeejhPqb2X": "wBO6bJ5xWWbnSOTQ4", "qbEvmDIXlIf": "dtqDzkqIVzrxMhuaZCqFPbYOlEHEpk9JclLNvfwp3KlRnEklPNT", "Ylo3BbuZjiRj25MwlENevnnx2NButHhPY6jFAIG2QUaNAXvkRrCLDtny6Q": "Dxymaaiyu1YLNvuS", "eXHakhmCABPORg3DKvJXQUa25O4SFLperNnyiOjoUvj": "SWGBkeQHwxFVGrwAnHWnh", "CvVd0sA2cQDddLiUvNTulMKlD7lw14W75j6Mbcumtpc5hUZJhlRSX0D": "F3vJxdxrrt6jbJd3afQ7CeotBPkh8bBX", "IO": "m731f5mcDyr1Srgv6nB7IroMw8tVRZv65mKnLRBCqDhI7", "KqzQvyz3Iq9NgqEbHESg82bRpEBVQvbnYjqCqQTGawX5Jjrivz": "MIlfv1m6UA3wC8b8BK1l0ONfMNtjafp1EUqZlegFI", "ATuouEo9LdciCSAx6WpV4krraoxiDCrnfceOEniS2THo6JVBoQ4O4hXAkMR": "v4kSZ4elGkOEsAf8D007Sc1", "MQXochkSkdzhCx7ozn0Da0mKEGHowwbUSxZc74kBTUpivpP": "eaVK8S81g7dNUbHr1UU5zpqPygjEtDcoNC3dxYlJ88ZWWQPPHfrZGZTQZxYtfVU", "EpOMeJf9u8Y2Of0Pz2zDICu2Rif6D7mFLht4rK06X": "eNwDS1zCuxpQhWbSTeZNXNRaOkDa2pPGtzBYdNVGVuivMFSt", "Y1jK70v8WVjkcPwXmZqHA": "uZG2WZwyoPV3Jdo7JqcPTOO7qvfRcLgwZ7oIPuFdoHKjUnO3L5HtwV8OU", "Gn2UWYk8WXq85xwJaq7odsAuEGpppYkqKy0MFUaNpDsnAm2WfERg3wr8": "RMDNPuj6a8s8LZj", "iEtyf1T": "LM5LFmNKKXvUrIJroEzP2nqcPbsw73", "KQGexodrbXQE": "Do2JQxLaFcXurbRR4cHtMMpUT0Hhb", "Nr5wl8lSiUDPsyVx9CY": "Iv6nHkU0fw8D9VXwWCkluatorxBJb8CfrSSBXz4euosjN", "BpdJ6hNLUPMnM4J8KUpWeOl44vsGj9Pok2DCHR7BZkZocKKG6r73Z": "JADMadjUsUQaEkmkNol69XExYIfh3FWwbYf5RChepBohQnNWf1OZ", "Xyvvsn44l8lWiNMTYnRIoeJynQ7Grbgw1yNpAhWnZ": "xFNlx3N62bzQmb", "ws348xenrPdrz5GyqUC5X3NBXXHxx5eB9Diji9INx": "r6GPc6lwUOXq3QpGLf4Z5icTvwJ6JLJIzTa1GikOScF", "KCVsknKt6IdYrHc0CKkz1Q6d5pnGZI": "walrXP9ZSxArr9HLZ", "m9juQOesb73rLktXMY5d85sUChi8Qsl7C": "t", "GfpXXwnBCCJcEk1uXoSRiQqt688vBkt1": "MecSIoIY0ZsTgAMKz87XOZ14wmi920QTS7dcxv2VDGPRBt7UjfNc4veEcGITCkq", "atXXntnLp763aNdtxjvHkttPJDG0jHkdU8qOuBmtqSi9c0R": "Dwjlu", "H7jVUZEVxucGs6HhM76MpAf3QDohAw0Qk8Ts2g": "saFgEvtnnVMipNNbBKtPE6d4Mqe1KaH0HBZI3KGXbSny4km", "byQfpi1JKJAQ7svxSXf0aLfBwsqwIFL10JHswG0qz0111Jdl0": "jFQhGjSNayEBrSzGwGZpBJ6kF7BhEFXcWPfX7VQpizIsBsX409V", "fb98GU8lkDTacm12GHWprZ6A9XKSEZe": "qc6bxzXKDu2FT9IRzxfgiVNDs4m4vt8Me2n1YtDa3zErbQT95qIcGbTK", "G8gaqSoSZM5kxw": "e1HJKOqjwOeu8CmnYFC7Lf2Jc79x3KzDK3ww6l76SGsh50CXdfO", "WRF4dNF4Z4eFFcUE5CSeyrPRPfWjD2SHLzXFn7WJMgDw4Ij3llaU": "NxG3oIcLToa3sU0HMnX29XXeuZ50rs1knxpLqGDONeE1jyqiOKxLecl7N", "Re2WIucfzMtxCqzML5ZwW3LMuQM0XVND8VWzAQuWWvwh": "unJl1ADSAocvV95Dnnj1jmmHOReAnF0GFWY2WHx3ZUmFwwU3O77Xzb", "wGc95EVgwx7AWGfebo1DKc1zj188": "UhOazib54vswyuV", "Q2HIaa2WtEmcsdxC1CsX": "vYTAuaRAD5ljd35ski", "ihNd0IcakH3hJQxAuWftknDQ9rq8irXMz09hW0uM6cN20vFmMrBg1XIf3vnnDH": "fnehqocDFaDQ8lomjlRIUZoFjsjQWkbJD", "VcqTe5n8BUuX2naJmIix7od": "N960deRzwTbHOPhcXeP", "ZWfD9rMRL0s6a4xtXmwnZSByR2eOAqnIm9": "EskmNxwSPBZ97cbTJDZsY4P58HDzDE", "DoUpWeguWBpWMXIQmJ0kuWNA48": "QxAxO8so1b5byy6ie7YqspIGshQdyiTS", "s82mPgI6bTOBFkqVOpBTTpRHvzPSb1XXbpUovp7t3h3ECvfQ7J": "ByKswDs", "d6ICmrg3H6dJuziTTGdGkrHzL": "Nxd7v8bkFaeaH9Qk", "Kvdvcb5rnj9J1lDDBMnOYXCwQBPc": "Jf93cGbkzQSoIB", "DM5iQJrX0Mo3t3mIVHmhjaJhgIxq658h6kKRbB2uG6vCPt4Ns3DO1X9993BXj0dP": "wmvBWKZNP", "k5HwkQNRjEwLi2VKayop86": "V", "reyHTQYMhCCq1zbpg9xAviOA16gaGnDqiDNG5Xdcff18fe5KozCySRT28": "WXI5lPqAssoZkjdFUQ5mppyaFG", "VLFDAChIwO60ikL7H3eR42PAG8PXRpkfFyntzuICoz2XrlrPWY": "JBfk4xAGbuIoDS66qUNrf41RHDrEYHh73AtxTv4q4tcf5eoPD", "Z7P99rOrtDvCgIJ4ZuW0tTHCuo28qn9AkqAkwPjs": "wlYDvirOABQIOHeQ", "ONlU8WZVqskegCd1tX8YUMgTmptv9fPn57PFF": "FG5mMEn0kFjLpG3SHlc9hrFvFd7oCtmgZaFhgs", "SPlGld8Dm9N": "s42Fpk1BUXRGd82iNvvVXiqzRG0mSttOBVRSp", "lxByaYwdH5YZQ6AHn5g8zVhYCh7EQforZw0": "agi7mkNU", "b4QAe2xmnIvblea3mq3IrQheNkVYZz1": "pg2MAzU6", "jxUyfAfqUMB0XhVzCiU1GzvekDoYjub2NegbRW": "Kq3CQjxrrjc6xAx", "ulsW4bbaHpGSuV8PtM7OZhLIT8YP7aeXUuX2xAPZJEFk555ppQQihzL0": "eQ27RrCCRfsCwQdS9IF", "cKxvgKcg4pCCj1DQTzIEUPs7gwtvcOvB5XUP69ilZ7frYt3D": "oXh", "IFDQmLqEVVI6q7xSQAqRHqlWYEAAv7O2urfmJ7lrRqvQ": "qrm9iIvzajGsmv52aVTHRRpXbMsukwBX", "e0MJnDi8HNqZ35dwUQ8TWtk3pV7Vew88wg9PGYHsMe9h3tvKVXw9yQu2oTkw9OwL": "JbLE0dG2iPSK2YrSl1ydQ", "PiqHNlStm28IGZ8xSA9pqvBKxpylHNYm0hcN7DFjGjWYmL4zrKiN1": "uR", "hferY90ar4631EQVGRLjcoODQqrOPqzbZG6H1TcKUJg7R6j": "C7nlsBl8rm44oxayYrYyfO1af24UJ9qF", "WLNHMPpMrZg9APqKjsrhNgdIqkHA": "ETvh", "uffyc0PbTAU0sWBHqStVO2rsrn9PWDyW": "zDUIH04MKCMyrKVLylfreozOqKzsLjVYUbNSEPqwafTpHLWv7fX91gF6nCx", "OHtrtY3Vo59q5IujdRfpHJkbGTAayIj1mVgShe5t": "Rkd1XUpAnCUlUWuykJQYC4wiN2XD32EGdsLDiHQcnsbdV2FKd", "HccX78TPjl3xIyka1T6ZhHzZvDSGEzznX8w2TsDqb1cJ3vOz": "hosvsrvKs373gN2G5T3HsWq9CdTP0i73eA2kIglvo51iK2T2L7zt9I", "JCBu5Z": "ywF0vXW171joRvfyoW", "hi5JGRPNacEVePcnmPvGSOw6iOP7A": "sInqYQ5mOUJ0ViIbycTkOVksptv3knCgnKccanDpU1Rq7IgM", "UmjFjTTB3tkAIaOLwoeIp9K5MgOOpQDkcG6xgsoVWRWKgECNWQCGdJJieeotUBE": "iXudRrN5mwh8TEEAEZflQxJ35pY51aIoz169fvqL2GN9l2IenymTaA4ZR", "UTljMbo22okJZV7AGmFqInuNi1TjtwWiTYtDsW1gq0lZThDzvMubQfkv": "AVCPzxKYTYnTsAf", "XwX2QClpucOfQ0ynBSUEuQvd72OXkKBQgOYvzluYv6rqQAWG": "jU1tHgAD2wP9ID2tTP6", "LrGVQQfq2iTkhrhHvJ55EfoHyBqyF4FgPdR5r": "UHsPFsPsjSXAmMITii", "tYYBuytO9Kqd1g3y8OWHkxJen44wxJlG0mnEpjSu1nDGC2P0uzP7X1AWKMqB5RmJ": "aO1dSNXWOA9", "pBdrYORlmY2YHxZu3iaMlqx0bfb": "jbXwHZNDAsfDp25RBZ5XdP19sFVB8p", "eD0olQO1U4NR7W": "FWKtzzkvWEei9LSvyJFiWu0ew8ZRbkQUCw0JLJpCxBD4xdycz3lYBME7yU1j", "IWEv7bhPQy81fDc5JvqROyyo5n": "P0MSAMOBYnod50SybaFnlM3HZbPInyuaGmkTQEqYiYevmE3z5i3chf8iKh49hG6X", "DZsmXhufvyxoR2uIAHbjL7yN1tB": "ffHaVM5gFZCeuWf98", "jEytqkKjesszzh1JafCMjTatkOOSc": "tD2LXN5vMop8", "cFIIYYkITubL3N1riEK9w26kJSSc3F8GGRH6iVs6fROBblF": "ha1qQdOtToTkw5NmAQ1ch1Ak4x7f7CsfvxVZcOEqwPuIS60V01Bj", "Qq3urHFC1CsCrRb0JW9LCLkbxtfvy": "eSKemKY8a0Sslpj94qaDxEl2Egw6trGIBKXvMsgm8H2I", "AvCzg11nUxFnMuOk3XPzCiS07xhbnUT6GP8imP6B2j9CKztqwud3yAR": "Eqk58LqIvSMA5sjZJgiooHoFXHvTq5nCX3FOg2jdzoEVG7eL9tB7TSEQPPWf4kIK", "yNjKn3u6U": "s7W7OkMTPfB9JLazKY5dxynlSLExGFVy7cYbOS2gjsH9gjvr", "NaYMpJqb1FJkhBpyfSmsj9fgHX3l02NxCbSW3qUzy0rhXkj5rqHfFouEg0iFrU": "TjlxNjhiOaQehstiG7", "DUXYTU5Qwxcz0gejQsByyTEujo89NAa5ifqyOBjNpthn": "IIdRfBU3P6lHDguGaUbanci1jrGTkvG3UqRXljlX2o", "a28CM7V8Qx5qrWHDnZ": "iA", "UIhQTebchJe0bfI9L9OVFs": "kdVNCF6nf4o2AuHMicGTFiWTkJe9Woe8FMd1w7AehxIpHF", "PIRVfOjmpeVI1hdBsGNim5dgrsg7sBibZKx6C1xA6DtVWGSiyAygOeB0qoDiw": "HwOmblgNSLyPQH5WJQS3lukA9a7AVD2NQMIt3Z", "IjHwAxZynxRnSTNhBf79xc5": "n09mBg2kXvqXJtJ3Ye0TpUPjzK6sgqv9wJaF3qhtHHwRn", "ABvGJzitduNTGEI2Qg0gZlVvOlLWbfXBMyj5sz5sG7R2": "WvtWU08QlDuio1gYIacJdCUKCEt4CMKS7SJuU", "fZ86rJICT9kGP7p8EYVsLcjRlwV5": "V16vCeeUkfHcYg", "hAgCY6blzt5H": "RCe7Z1XZ60cwJLuAgj9DbPPYeFptnqzcOJlJ8zEV8jwHwuGvTWTO", "GWTrdjINuW3zeUZpiijmxJtlMOtnyPz": "KjNDpc5DDEViReugkO0dRO8jZDnWpXHZvgnBYZLeqdK9RYvxP7BmDun", "BdgUDvPA2msrRhCECopCZFnUMDdaEdUNNJgtas": "hr92jitREpNaKy0kEDwFuGkmc", "AY1mSKmUifBzytlhUNn52FKy0WOA0s83CMFjkpDde7bv": "JZsJnMqXuOHTH4UG7MgWeE9fU0TRhH3NS1FYZ2qEFcmGufsaePctFHRLTHr9E", "bO8tEIKd8Zc7mye5fa5PBv91zekvycovM4ofO3j5W8IF": "gZ6qyk4F7YZSuGyqRPvygP7R1XO", "gQDESTzqJ8unYXcupMyra1xOkKrSpewQbBlRS0RNL5": "DQR9pDv4f9vCut110cMP3CTP0vKKo0ILu53KPnIeKsFOXAdhHb9wIEqNSTdKGAVE3", "SFEBiTwKCFTJunI5wZJoZmzmRJk61wz61LleNaPLOOvuFUSKoT2": "ZIqLeOXTcMhBIPRdczfBg8PoB9viZp", "vn5H9NQgUitRdPKYSYr0XMFwbQbT1e10E9M6gUQnInD": "tMszLA8B7ygxWcq", "li6": "xzQkjCMItnXsVi5Yr0fJYyPaed6F85P4sW7EEwxzzUnggi69", "mNMqNENcOmq9ozs4baRRdiYVGBINv5lLEsI0bTW2UoRknjPYL": "NXTUgfwEH6Nc8WIOJKHqSEeCUp2vR49fjiGzTQnsou4rE7", "ObSpeP1Hng4dlPBUIGjsvXSCxoLoHOD": "bzvjhvSzgEJYkAh", "KrDlHD7EPaTqKDyohG7UMi2ZB1GD9fqwYuX0DdgX8657ePG3EhEWevrWp": "tUxN39", "adMxnjyY5YefJF": "SgderhzavGvy", "X1QEAtIs7v4drkJEKp9LZqGZr9t71dAYke9xlbdQFJu3P1wpohKCohLVXrxrC": "kyY", "JtBGYgcX7PKpwM2f28HggHeHCCxK6": "KLzwLZSkifBxx0prkvOVbQgNI40x3", "JufSrXwya3iwbkiUyDyippeFOFSQy6nk8qW9": "EYAWwwXuKzTic8GyShET0VVGzCTCJrhysxIN", "IIUCSNDrWgRaemHECE80sinf6uhUxui1a6ADsNzgD6SV": "NPYgiD2sAMjp7dSWuOhyHMP1vE2ZYYJm4Borc7EIG9Ni1jy4sVIK88vUOyz", "NSgasY7JA1lfv3G7MSqdYa3GRiCm9tIiwymoaabQqlPMwWotU": "yC", "jskmsCYTItb5gGhAVXeOOluvgSeW5at8wTEzmvgJMx4GdFuk1": "qVqBWaW1YhHMB", "WvkyiLIg4r3sdmJEtuF": "amERgvX2Ow14Wp7dv62VIapjQyzQzOkxnjkUJS0Yp", "xg88vwib": "Ada5vMHZjX5Qux2tq35DIpJMI1JG8AVnfPQHB7LNIriy2teDkbJO", "UA2NJJa07LSiqzPRWAIRa1cn4mcGGhHEqjMAwrf3zKA1TFcz3UjWgohLsUIHAPNdJ": "g5", "HXtt00n6786yjazIBJGee4WWjXFYXcfm34WuYyoRzBAS7PSMPvjjK0XXbUz6eMLBb": "ixQ7QMJvIzupusq7o5jFbNM5ayEHvKI8iGRWTGCJd3QYLC", "vWrkL5z6sob6Gn7BmSsGBDCVBdUpdJcgMQNAVmN03rC0rO18kIvqj8J7EImqHA": "ebfTIevzIKlyoH7AYpqK2TapSGP0Ly0UGLRBufsKlgfZHpzkhPnFJUkN", "QibDrv8Ux8F8sZnPwjNgEIXUPDn0429jd9Sns2eZ4Yof3Za9EQE8Fw": "s4Sjk76BuPSlKaA4pP", "dPQyr1WzhY6CYhH4bM0": "t79Mx6UZnmDzzgSglLrWjlCOoGDunlTgUl7yldbj1bOPp", "z0UDdvgrXhvVtNsMFHmzXpAIYB9KdJehyEUq0BV77g0jJATwSuq70X": "bczhccu1vfPbAVyu7uSCkjvy6SS", "CsKctlBej7vfgp787TBagzSNYgV": "uSE4mXcB7a7JWZwhxfvJwrI6u1Iqh", "iV5qEtIxeECiSPceAprvo1pxwyNeWEXKjbq": "gOD9", "WYv029CX9TDTnyBJq7Umsc3OL0DKDmgsz3nPi1CHQJ4wG6fgrpuA3rt6zqEiJd": "J33Tk7a", "x08gu7iIBiJ8nAq454ynW7qY6XyYLcaiWxi6LYUUohjVYA": "EGrW", "HuGkVmr": "PYe5i3", "x3gVmihANHkmcejGVbonGC1zNc9OEHVp4yOum46rlPYy688wY": "bvv1joz0t4OHH13slgN2XiUxDHhVPs", "S1vzMrbgvJt78HWWTXvIJNqb1QiP0VUKfDv5VmmTOL3ePYET": "uNWt7S7Nsv9FFLrq7pQvMafe98JMxsOC", "vGC0sof8U7sJv4tsL4T49CO04jbWKqxkUapVYlzVl": "UDqs", "XH8LH": "l9rjOYI953MSSk2AiGW59Hb0A4idckb6cosLGQw7SWGY5GGrLrFTpOd", "fmC2zZyeqmuGDgfycc0PxFlKxsmog0DZLDx1ohvlfzCtJwA4CUCcw3b1koEf": "IOzptmL0IaoUGi7mr69xv9zBWt4eTWt33r32uoi6vhlq", "qm6mKgrBhMlefa4SAK4lo3VmaeZksqn": "Q44d0TjPO76NZyJbpyzOLFR1QBM", "pDG6pHhI7YpjdTQuvJN3": "PdvNg8pFDqHjvaCTFgaR", "vr": "wJGio6N62SHNxq5c2ZMQ8Nok5s5XmitbzdfBFNka", "PreYvJOEuDIa6cgA78lIGZQXwsHoVZI0g": "p5KlwYQum3s", "AeFZ9CAA1GYZQM4l92v6CFoL3qjR7VgB": "tv1Az6by", "ZbQoq23i9X": "Trs6Ib4z7SddlNAyAfqtXpgizgL1A8Y5f", "UlsYjaTKV": "OW6vnFZfTFwtyy5mmZphjXGCFxX7S4hs92QDkqQ31Ctwyw5s1bQS", "KjJKsOfcdTbUz5kFTimbZ8TgUiY0jA": "nN1GZFMQ3a1kIMNQGpV2NM", "vBbe8c1ss5xwKPK4O7MFHFO": "OyfdJsIxYnNRvgYGvxKAnWRi70Rhxoj5", "mSCvdbgAHfIyQsXXSDw1c52eVkj4bFY7A": "D9cpdQ2yT0ITmFkiJpPq", "T0fX1QkdBgdfTzzK2IWjNs2SI73kvaOO": "AEpv0o2puhImpYxev5hSTp4ecynr34mQZ5yXTq8NZ3JsIETC", "FC7ua": "ihDHKcXy8bRN5ZJ8fwhIu", "ZUrxiTyVRw65fYLJ3gpIkL6Nym5eFv": "f0tjp7jiQFxY0pa8dWKF6zM5DBl", "rfetQeH0Hw2J6qfF": "Dc50DgTbSYuWkzr4", "dp2ZgO6YSHszRdzTWyIwmjQO9Rx7c8zYFGiMiXWszUJXRwzJnTIHV": "Y8KvEQqyhEf6nfYnvDb54KIIWoTP8aiV18uAfV", "TM2ae78JxpCGdPQTy4FPakFCOz1JNdsmeXgGNo7alDF11awSuI3LUL": "CabygRJdPx91I", "f1ESovTsd1T4yYaKOOm": "Vt3", "o4i3gX": "e1Ym0Yhj9EQwmWjyfyF4P8yt8hEOEzZUiIff7qMKBEuxpXypJBrcoftqG7mYf6y", "DAe8CkA1Kfc7QiTKH0Pmsyd5cZVOL0e8W": "sZzNlSOLFublQsXgI1KR1ZojBsPBjvuimdUP4x2", "D9wkAvfuF8NZ2X5Mf68nVlgsLDp0mZ2VUWkAHOAPxnHkjlGC": "MaaopVSU5iVQjcFjGD1VcVmqkViUScijKyZKswLsrql7rd6XB2xG6lD", "tKE48FZwannIbQAX7p5fLsiky4onU4sILI6ZJKDCEbRF52Xk2dEWXR4GuM00y": "IrN2QFnlAQ4jXejKyexcIzfPzJa02kSasXdVtL25jOFaWLEK9yDPd", "xRcm4add4qrVhsvJu9An844I0E3ZTLPS0dRgOpbB47EFS": "kACFTT2", "zEZqiG78mEUB": "SSTwOKqlSosA2g6oBcbtcOqyxzmzywdfu5yuW4XITBCKn", "iLvKwl3jXMF8QAHU86k7NY5xLMCx": "DmASHnhzzbzdNjqwHqHGfBtNsSqFh6ndOXswKyEO8zcvfBLUa1AtR3q1kxAVvSJv", "tmDSNyQQZsJl88JhD02yDzdwOp9ibeJEFrbgtGROTqLi225B37aS": "H79bJCriVZmCAx97p6eaAAvbZxy6ksmz3zmhuA7hyYGvsqWDJyF", "wk894cGxUIWmhY8buazDsbHpk4msd1QGLcz5cpyc": "jLiPLJ0X6yxDLGSfpUYFcw72B81QvAmKA1kwS29uERcz2Gup3mp3b4Jo", "KWh9DTKpR8CgrEv3eTR3JZ2": "g", "gKFPpY5jAAUGvyOcmjWd54Cn0yAbwb": "utLHG0Pt76xAy9ueYgWHGu7g9XdXZpWhSh", "jbeVg7Mmw0P0yX1vhgNg8VngEJFtlR4OabdxkOgieedsz5nysA6cszaFjg3": "RDZFRDPcGQB", "stRD2U8u1QXPBIPpK882jzjcBp3sw4WrmhWrNXNAQWyRSFKETGIGch4nB57Y": "iQFZguusAA7rhupFN67GQtqrs4urQ2iMEhodZv9B9", "WIfT6Vwbj48hETIGxeIRAXuy2": "Ckov4ig521rpoaOgRWqUHSbgtKGafSpwo", "X5CXR4R6rHctLxZhmNTzT4NoWeAtE": "aXmXtQmCepTliMzwahDYKbdb277ja6JUGTvd2puhOmT0", "C1CGREM": "zC6mtFoymSaq1Fq77xBKFSx0S5M2y0iLZN8pV8D0iY8rp1LnXAM1", "j13x1lsuWaeJx3DYicpkPnxf23lam": "cgUqjsC7LrlF8MJzWZXyYck1YVkBPLFKujo6fLvkqFr9GJOSrjVxx4", "FHutkbxqb4GqI2f1gHM0nsye3Pkr6r9DFjFjtN3QhEbtxbD0rj9htA": "hPNRXOdXpvqKAFdQ00joKKsDagZrCCHyqlng8zx", "Ph": "VSaSChcF4o8TLwIB84d", "owsmdEamKm6": "DVgArkLz84dU8cEdjG3g388x4KBqfUK3UnaJW6PK0w5jW", "KdKVYhqRG3bIPk58OM9y0B7uJLGnTmWYUGGn1h1n": "G5SPBXZECarlhPWROxLt2BXhlxvg1Syd", "dWa1K3LeQpf7pFTtuaRX": "JSFLf8qBmhtvaSPVmxejUIDWUGc48S", "rx6mWzFPumQlC2W0d5PFSVIW0iJkzxqfOH2Op2ikmpxFYRNg4jlCoE": "dgitAFdPj3DRwIJTigHTrOL16uMwlJu54", "bwzRGCvgFUJKCbkELWcdXOTPWO6f8QPudK": "SfKWiXyNuRonawDFytsXpFYjr3qGkm5URQcsibIVgaIgQlAmXBEsvET", "eAixhhdTHlgIkKFDkTQ31ihjavqZyq1WLwo4iOa5HLzatXD2vAOnt3sLTPgZY5Yvv": "Fb0ftIEFPHnGqaeYZ75Rm9kUNHjSqxH7hCR", "PhBuNfvCdBvJcB": "mBXswRDH09EVO5xYHNTglyS5oaF7J", "arePrbmpsBKSin3SyaHwcwjgAfj": "OI", "i0oCQtngABma8883hw1R9Gobe0dSXR8m": "yhSUSp4qpUlUHv7RbT6XBFRDfFR3lOUhCfmR3XSSjLXyh1XPcz4yga0NHWja8", "Mx0jrzK29vDgs9xDCQ3gjJsL9cNxknQVIWLECzwCVbImjXWmoPJ3Nk4wS": "TNdWPTmrtDrXjoXO7SzmO4D4lt99m5L74q8Ns51g9CVg32TWDVxQ", "kWrtNMRskdmUAPTtO6gGHjgHviCa9bFSNr5H0acI3g7ue9RandLTSsZcZ9wYge0mq": "GWSaKtevcvHuJNfJTnC9QPIAs6GlNwR28nwMGzbmM6E6Zx", "RoOQa6s2BQJEur9sH": "xaluEjkppz5H7A4I3w39YZnHk3Pnw8Q", "rVUpodz3zEHkZNTOsRdyRJrQUOhvZxdbKT5s2UlrgIdlm2ixQx": "NnGbsFRZRekNbXzmcaT1bJ3PDYN4nlVPV", "AQwlgK6ToUZ2KbYRZj0F9WBUvrUutJlnYi82T5zRRn6": "kB4cpia1cG7Jte4t9hqU1ogqD5tA", "VZ": "BSgPlMCejFhWAo3lpZ396TpfUtHHgobrFn4guNoc94", "FnFk": "hBa1yUtjgnsMGykP5eV02Pk5QYI0xaAwsW", "nZyeNH8oP2TTR": "bQvFhUdm0cokGFqOdi0L5MOKMJ66O7tj0wXC", "vVCYIrwGYyXfAiY1gcQlNXZRoY0a": "cjUQE8IcsmTBGEUF0hbj4qAuPZc5itaddhYjNNJlZawV", "oZFMotpqoo1Bj2eUvSekZ9FSKSrg4lQ60cQWlKB0k": "xECTSCN1bhGRBAIaPs4FTSTve8wLEpSHXkhnhA1NowozyirJDvcTAMZOtkE7", "NxDExPV": "Lh4PDVkQwLTEW2e22il7RIYYEeqhBjFyRyLo4", "HNUsf1fHqUnwycn6cPlR29yEtBaVUmO0iu1amEz2DNhqWjcYtL": "QK6AQcyR0rUTpobj5604w9wzM92", "VsoZ": "jgEfOI0g04pCcj11eXp343m5q93gw", "NDabIoewEXTjtBaXv0": "vkxmHI2BGuklge1Cpec35CSPIG5nEQX4A4JxyNrcb", "K6p5Lzok": "twQ95ahlxp", "z3wbBJ6Ss54Oks": "Fx8", "ilXVrHwWe36ixvhBHMWq9K9wsLzxoGBa2FxQ3iWEygHVLCg6uFJS8gTqNXUx00": "z67sQT26NG7oneCmxwcRgM8LqUh5RE6mBySgvg3rIdW", "OdRVB0r8oSGscx": "Ycqub3buTfHJpyc4MTAWOmHk1wigEg", "diXfdC1XI4eriCKdoIHRvylhORKYJ133": "LxerVXg", "cFuHxbpLMwFO0aP2LLAIL": "J7pKKKFH7cKliwhoJDc3NccTczvtkb4DcnneyI", "OBSwZF2ng8ozGD": "s1Q7VOuM255qBsA1QsHbaO0fmlX0ZRF0pjEm1pH9rQxCHkZPoYoDRML8juCDw0O", "TyGqmPVxOJUuLi6ZNytEqcHhzLHV9jCcCwH8sELbDL": "IhCs3XZRJXSKd0QHhuMHr", "VKAycC4NMnVBHuZm2": "mPzvm3m", "DmlFZZsozeBcJAehuSOF9prlJzcF1GURk22v": "tRc9lX1fcf8OV87NADr3FoAo0TtuputBUUrRi4uaYJ1Pe5nQIQyde2qwwLYiEh", "kqyRlyjJpYcYtXYe4DP6DsyDsuQiegSC": "nfChP3dz0gUISN2WVhSyFdSOfz3ArbyMI6btXiB", "LjxeDP5WCs2JqEqFvNPMDaxXoFExmhzb6s8eeBCHUaKXqp1k0d": "G9IVjBz0w8wWG0yNjtleZBEwrXUDSkiLJBT2XCdUjH2A", "PF4NJl0HPr1XU7EIELwnH": "b1pFbvzzNmarxGs3BTSfm8IS8V", "VNnd251EkRZw5m1LH4wCua65D8bbuSekkerF91xmWdLTg5VOv3": "Z7fHxuy780nNawoonF3kduKxO330daaakygD3G6Vsi456SJEWfOHVrn", "IvIjw3vfaE7aD6xW9qD": "xWgHd", "hcERD": "ZoGUUpmlAgdoPu9s", "CpAse35BjUZ56ZUBkAyoQ0pDfjyxjorDmHt1V4BmqvirjPokBvgJ": "JTkZjIADdNaRfcgsT2dfgvhf4BGiM8VKIv0TPuc0wLlmeYkrXF6csUmNX", "zXF5vN1oHhBy3HJaC3AuMFsdUm6P7Mu": "cpifTgkbJAsI42jN5mKoSyFznA5ItOdmJd", "lD2O5DO2vDAXTZhc23Gz1xOZFeH7NC5HkV0soUsMrf18FE": "xvLxub8frk5DRvgWiaT8FqnUBLMmfpm9rSGr7QdlOn", "jNGCklWiHKPPo8VubtXiL4BrFGRi6": "qRRrTggH", "G8DKruhdkI2CE0lbrC85SzneAim9pizrn44EP3KYEH1": "NZSiENsEWvAZfxRgOlMp", "sfYdb8HCggbUNEn4XcjZZfr0": "b5rPnzQ9WYvNCo39WLZUoprMOglGe7Wif", "WtiYtwrZVnpoZob": "ZoalJG5GmWsKIGpEEDPUws29TQqcjiMbOa", "LqLwg0jumk0n4px4uxeS282iEQCQCbCF48vp8vhlaeV4Kfi2CsZ": "IHLucPM3dLUaAk3", "nnMYwvXzkwkOBZ": "qG7PSw", "fxRLfwlkvWoWcdAKEmpqtdEqDeVBhDZ8T5gUXsakRAsn8ISzjgB": "knRUBKeLFXvPMfkKzpG77ZYN5Dd9WUghe3XLMBxlL6ROYhSeVMyh3Z3gM", "A6Xbvmx077S4O98WjJKtJTXAChxE93vEOeDyL9AJS52GGtnyx": "Uz3wpwLsU7oRMMYpiR3HiwU9otO3oUE72ZdweifXcX8hz9sCROIRhptS", "dudkQln2pmNosdmPEABuc06fBHVt1p": "UlSol6PZUtxIeRdlRDm4izbip2cjxiyE8yoluqRptqR81Q0sem4NbbjF6", "kx3MM1wCMm9uzt4Ee40umv9eUCxk60jRolNGl1flCUoHF5c4zaFlAGwte9nL8": "a1Bj0c7UCwE5iU3ZvEFX5wKIoZBrcmQ0AoU50ePb8Yd0wcreZot4gBdBPTZRdFPlD", "sYaue2s7qUUWQILUljBVgvxNFUCbT": "PhSxiRbGjQqz5weU6DBhvwq", "alEax0xmqQm4hx63K3uS5bDbdUL6lX21j5Lgu8fuDO": "OURe9NqT8IvbtfwyCBfMstFANUkhLc9uhZJ", "Twm6EYwO5JHhf0F8GmcczcTIc01NFjJORw5CX": "RScOKz5whw", "hxC5NEzcYZoMGZwH9ZobMjuUrkMcVApXO97n0hfUrBYkSq1eCuCzGkpJsiKfRdz": "ZBuGtXyYC7sUIiOvExHVOszJxI", "R0M8wtd6sylI3M6Y28SrJ": "ciUxgWAKuYn36UDul8d41BroJFlaHLWRiepYhXhRT6Sbw1SQIwG0okZYX", "SlDSBDnp61S0bTolDwMwRGjx87UVTMtvuoLAWRoy4M9IQg1uo": "ucXNYPbNv5tPowd0", "SrTnSFnX0PVhDoKXuzIBV9N1b0MSg2I5DuUHM5pGrkOyGCJk6KZHmf2qlz3T": "Bg7qkUXSkLiMR6RjvDJhrJjSFrbmaCbt6NyH0hoYic2wu2rE30e", "JPBkThcSbyzKELx3TYOuLz2bHscbdOU": "TltR7rvRNDFnpDz6oaOaUiTZgF0C5oSYc5xVU9mmHIGLdULOE3CBkm72KGEQFc8w1", "X2isr5irg7YGEiZKHGvSStyf0JzguOP0A98SM": "ZdeLVUNuSX6G7kyLwCcHbjFmeoS8QHB9X5YOJ7CdOaedRD", "bdojcwPa2E2iQbcmI8q8fCf": "NWAeOs1hUEjmA071U", "nT3mt2UF0pwfI": "VmUJ5z0BXF0DtxP6fO2Duy3jnvcHVXkPuJtPKZGs3fss6vbOB5aOTCpT", "JXZFCoMMbLJC6gjatEQpYYorRZqDA30B": "bahvABUemWPX1Sv", "P2GDtu5GrFIN9VVz3X1P3YflmCxvDm9lMEc0WEyowW570M8oG": "bVlDvqF8F40qPQm5Xd60CUavB7qT9DP3WHDSb", "pSIOy7vjw1Kb1PeAMIL2IHXzLHW": "jXiWlN5", "iBFOVukN0H0N0VsTjQH73pSi": "li6xmUX91a56cnFCNf2jzMUIp", "Q5mboEImukTIgWx1fTY": "npfVYkJHDmC44MYGVC7UFw68sR", "ZdZBEOG9RMYk5Bq7lwkb4": "Qk6O4YyCNgN1voE4", "fZDVkMfzjciWQiDomByrI1gMhSip4YMR49G": "vySjfaQtjzqEMHDpa4Qfw0", "u9pRIf6r1ZelD9zTXffBUaAzDbFQqrQX4MqJ4P71qdy": "RyH7ej4kJfVjxhrysL0NmvKfIkJcliLYeNIr1M22h4qSafTz", "rjMdg2Pl0sHpdVSj0U63ElFXPqzSig6xokMWFHvgAgi6H3": "MkLQmCRTZtC6v8mAx26aT2sZRbdMS5v8DCVlNfRlvCypuHv1S2vk8b", "UknAKleyWyIxeeWIEW5wUbrLzI": "hfqaMu7Hlawotb4nEG", "RKZxdv": "p5cxAtpJdTzjII0sV1yGyZ7oqOVSyof5zxH", "WLPuQY7gStV833XL8EowGG9BEVw0cMKvIwCied6A2So8DxCEnqjQ44rb5fHQ": "AUvAJb1jUDhqHxBd81Z1fL3rI6YJ1FUW9SLabo5jFdlEUWQq", "KjtxXcpkPUKogBkS16Qn5kLsERIAZFj2M9fj62HtP": "mAAVyNljoCzZY9KWaZPRghAZTyGznqHinvn0XjVtrQX", "yAMJPqNVVMQ7WINCY68UgcTF8x9QT5jg": "A2sBl24NxNygFRT96cKjVKnXab0", "GY": "HHcVhBRXbkegj0lnUlxRasCnH0uwvwiH4V02kQGqQU4Mb8eABr3", "GSnLhRfYa69YV47rIeNJxah88Wbb3JE4MvYsLwpFDvwpFaO1TX": "YvWhq", "yHnW": "UvuQH57rR11OtQMzNXDfCH2tD07yTR8c6xbQFNvo5V", "MOZou5ME34wnmDi0RuPu6BFWHBx36tGNeWJNtF5poxx3eOweDs": "VHBd858J9jorfJ3Czox57xEjw3zYrQCTLskM", "CvYKTiUAHXgKu2LexQzVLIawFWxQ2L00XGmPHc2ddfXVUADZQAf8qQyoanU": "IaUMR", "p9deP69CQBwPSJCzDw0DSIutDeDidhqdGax0ZLLCQG4F": "a8MythFtjJiCwaDLcitpeRqn854OjvxHE4E3D5", "PADjWXLNCaP6KILPuOasBSyIytNDOo1": "VzpQBEtLvnjyGRRXrPy6ExStvpwRibPhyhLOMMigvSGRD8", "KFeb5DB7ABtc4": "RWV3xv2dWn", "OhMOBpCRBRZhsAU0ZMARHJ43mxO0vZCkkwQiDPMNxDB55OSIOPSdVEXXO": "eK8Foqkos39stf967ymVGy7MFv1gpXfWqlrs62IwUrBcikwGSldJttCttqN", "GujHoGcuVY8ZHNyvbVHKjZR7oHC5xnt1vakjbuGOkCde1eWazJjApRB": "A9HYW2d5HytP", "oftMZhOZa": "em3qPtAHQlgQOWmm8viePJm4HznnmZnMkBvwVXWHVHX23AcrQ", "rv3fncTSIeNWultAv7wo1HvyTbZbpgH0QebP": "FCHgC", "KCOlcjJvRYJNCqiy8HZ5SK3cPRQY7poLx4ou577X15ECTdvZJ3wf3zvHR53RI5": "McpoOmjg6TC51yiyN4CmQAmAq5Gm3cCmfP4b9kt0JVvMTFxI", "kuPR9FyBdk": "V6Q5xkgYbgKvcnhVjvqUA6TiItyNswE1hnJ1m7vRi", "FoCpWDgdaXTc3fee9y50XwThHJLKVQ09jkNIAoualChJijUy": "STGCzLceX6r4YaqwbZhY1NYCqWBVGO3RAI", "z41IfqeBnCA6UC1kM4NCT30pkT2LxZOm2bbE": "kkqmC9VYCfh7tjNR6f7WB0rGuf", "y8MsdWP9CE3RYF2Oe1PtAhUSlqd27G6vnUF8OGnKuIK40ulhBgIR2pFDokmw": "AY0dEhSFvgOEUm0jf5gHyvAjaNCDSK6u", "Tt9DTIrhSFFIlVc0hNZusmp0WM": "nxReHXayJ7fMJVd", "kNmPOJSvEhoZxPbTphFT43w2K4dXPPYL61nXVxUU": "iusNznkE0vYvmDr7zhUzCc1YgL2X3PKzdrJvQtQ1StSVvSE", "fxKgQjE7yrS7x5EYs2M6EmUg6VuHehozXmUD4q368xcFH7": "cVBvbDozZa64U4LoFfZvZxWfd", "PWESPLmz4BjCgVfJ6hIQvnO4cOH9HCcuzg": "u", "pyWcLblLmGn2b": "h8djBZWjxoHXWGrwGLwQ2olxSkI3N12dU0e9TETP9", "TEFU3CIR33UBMoxOpZal7VSQ1ga6Z5cTwY0EQxEWkqw0": "m7JR68kXw1aemAzxic2MN4DCIMmmDjkTFmLAGMOuq", "uYEnPSGHqZJ": "RSHHTf0mVHEFhg78YBV2DiE2xngrs8mFYLtgm0Z79s0r1WPYfosnVZ", "pEpmZNmYMfdFUQ45e3Dx5JwappS8UoQ2up2lWcZ27rkTJJ6zxCFcxhD": "I2", "mYKuS": "p9CVniUTdZQYeNEoPPnf56HspnaL8kiUHXlHkNwfzOfZHvULjGnsIYK", "n3pJP8Uio9kNZgznqbopoOrdrIpbwIo4P9ZUiAyjNx0ZHAvhBSXO89lAk3zH0d8": "BgYBr9zSbYUhpX7MZe0KQnvkV0O405JNdbD8rm", "q60dF0Pu2ADjyVx8VmdDIb9DvTk95nHWEDO1G2DnBBOmLeroKsWT2VHGMg9HxW2pD": "pAowlOOFai2kSpuEbMrdc2irGknaXLqvAHCW9dmh00TQQ", "qE7Zn8ieLGAYShI2SLTf": "gf6t1pp8IdnbYN8qdNpg2e0k1GCMJcfx93882q5BoYA4CDlj7kftSD8j9dMUj", "bZqLcZ0CmLMh1btwZO17u": "v1gtsjaYAxuNodfVdZBzZVZ0Y91eULlTHhW4ukn85FD6IzncydSvk", "cBO19ebMBl17f02OlUPbvtCFCK7rYEU1fwyNBjlT0k": "lntzmn0mM3fn0CbaQorb7ZE7MBB62szi6", "xiCVVRG6ccwnRGLXSWVmagmxd31BD3Hx": "pUzfe6VF2", "ofTU60TfvI0n0fPNmocYFMixTQHO88K7T5PagWeBPwSyflMwH8bWd6eLWqTS5": "pRrOm8W", "i0MwHDFJrDJbzaAiyt": "E57MwDG7dL44bE4I", "Mon9": "pdGkI8U2y7mFixT8jRYCdW2HO", "n3n": "MLtq", "IvshwmRjn8kSkv9d9UdmA8jvw": "rdywrgldnuSrsUEbU", "cs1BsBYBh1YeZTPxwyzsW4v0kyEKZIvM6loiNZtfqgrQU72yI6Vcn9kO": "HY8", "VSgYUhl83hsfF": "VVjG66eDeeqw6iBtOuPCgit10YmQlwdT", "THlq8mfXhMqblfisL1gP8E8cF1dLlwWCeiZRt8pxgqf0nLCuQwymoJLCmWfB2T": "qPSs4rsF8Rd3UAbhwxLQlm71PECNw2iz0DNhPLMpiRBgbVubuZfBswunCLRJ3wj", "p0ip4UhUToy7TVpEP4aVaL537ovsx8pTqUDVSn": "IwWnfpCwnEcJMCAQKYfDEQwt", "bwtYOsonj0H9gH05858oP83ngEWsXEz2PAfeMwA1OsPuts6mGwiYSJ5D": "yKvUczWm6m", "rg0oiFhDDITuayJRTGHnDMKmDLhgTdwOXHVhPVgrsqKWTmzhtfJMh94E8VQQzq0w2": "ZfAtxfiqY1osg6W98apYVxChXu6q2gdBslnVgAXy2gBnUX7oRA", "hvL6Ee4IXi5YP0ko8jXK0QaaeAjsX2rFay4yjjAqnDk51W": "jg9WcxUapOxcUXvescWpHAEldafhmjazlAGdONTUoplf1nPdpTDimG9W1Q", "zep7dT5XVEGgoywtscpgeWFv9makz3D3teq4gVz9mOwKS0V": "dXfAttYvRaYD0SVcak09AIaxpUPPss624cyUB8IIFuAji8z", "mfySFIRxk9JbWFtvacN9rTNkDP0EM": "Bi7HmqAcgbL04VTUPUQf7gPMp4ZdkQ7jhNP6zy50W2Mw", "rlP9WNyXBqELJDhjFP2hSeYA872PBqBh1eXbrOEfLRJ4hb4cmlVd5zWBbf2w2F4F": "X4wewoytBlplslU48kjqun7qOmIc3aGDv6xcj7Xhggzrzxa1", "SEwHKxRC1LSlpyalrjV8ikm7Z1euR6R2gBLDlrcNJBH4ibgRlW12LLaz3eSK": "sZfXL9df0njcLb2QuuDpKVvOi5MaPGDNYshN16TXAazQcP5ZsSey9gLZHOw", "W64ygkHec2g4": "IIgNWZd1tUBoObNdTZHtwd5gIqklB85ivSAjofigG1LL8CedxYNyEqsWCIr4A3v", "zCwthU14Ne1IyAMm": "EJb48q", "OTeaX5S8Dr7ApdRY1nDY4V2XcChzYRVNstfJHO42LJuKJGKWW9pa6rv": "UcAnPjgLZW9fkZaKR6pt6uY0RW8X", "oJ7OyS98EaAYu8nudihXMedVGQI8MOFmL": "GEBK4FZ6wYgJdwM3hYfKNn6clPK5MbzfulNetnPMjDjqCiIzjazVfivZLMVo", "dKpDZlrdK5ZD": "RF02WAg9OyX4LsjFeiG27HoTxZmrBM4UsPCd7975IbTO3KKTI9cjYu6JqTi", "iDegcWUwjkGD7M4NwLZpLYllVpMibINou3": "hhaMPnahM9NYKcji57UG0a9SvHsYcdOa7XZAABbqOjK", "wFbyh7mv2MhieqRHosfpgDmWgkiJfbpUbAPU2DsBFamkzQjUPRRSX1kgYIR1T": "rr9j8RmCxyf7MpssQDb8J6mewLruDT6HaZnYk1JsQRAOoa76lxFQWhHOrSnqQQadi", "YVCxP4fspLDfjUvOJTJNcU4A5MeeGfUeRTcK8hF9xKzfwKtaVZjo": "XqotGFL61ag839z", "BxQMK9FwG6E96cqptyS": "w0htLvQSEPVJ2"} \ No newline at end of file From 10c24c560ef1cd284a8bc5dd192ea9bcd6706d27 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 08:44:52 -0300 Subject: [PATCH 019/535] rename to exrtactKeyValue and improve code --- ...{parseKeyValue.cpp => extractKeyValue.cpp} | 86 ++++++++++++------- .../{parseKeyValue.h => extractKeyValue.h} | 18 +++- 2 files changed, 67 insertions(+), 37 deletions(-) rename src/Functions/{parseKeyValue.cpp => extractKeyValue.cpp} (63%) rename src/Functions/{parseKeyValue.h => extractKeyValue.h} (81%) diff --git a/src/Functions/parseKeyValue.cpp b/src/Functions/extractKeyValue.cpp similarity index 63% rename from src/Functions/parseKeyValue.cpp rename to src/Functions/extractKeyValue.cpp index 1a426dcb34e..40195cf8738 100644 --- a/src/Functions/parseKeyValue.cpp +++ b/src/Functions/extractKeyValue.cpp @@ -1,4 +1,4 @@ -#include "parseKeyValue.h" +#include "extractKeyValue.h" #include #include @@ -16,7 +16,7 @@ namespace DB * to be overriden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the * Volnitsky searcher. * */ -struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor +struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor { explicit NoOpEscapingProcessor(char) {} @@ -26,52 +26,56 @@ struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor(std::make_shared(), std::make_shared())) { } -String ParseKeyValue::getName() const +String ExtractKeyValue::getName() const { return name; } -ColumnPtr ParseKeyValue::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const +ColumnPtr ExtractKeyValue::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); - return parse(extractor, data_column); + auto raw_columns = parse(extractor, data_column); + + return escape(raw_columns); } -bool ParseKeyValue::isVariadic() const +bool ExtractKeyValue::isVariadic() const { return true; } -bool ParseKeyValue::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const +bool ExtractKeyValue::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const { return false; } -size_t ParseKeyValue::getNumberOfArguments() const +size_t ExtractKeyValue::getNumberOfArguments() const { return 0u; } -DataTypePtr ParseKeyValue::getReturnTypeImpl(const DataTypes & /*arguments*/) const +DataTypePtr ExtractKeyValue::getReturnTypeImpl(const DataTypes & /*arguments*/) const { return return_type; } -ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTypeAndName & arguments) const +ExtractKeyValue::ParsedArguments ExtractKeyValue::parseArguments(const ColumnsWithTypeAndName & arguments) const { if (arguments.empty()) { // throw exception return {}; } + std::unordered_set value_special_characters_allow_list; + auto data_column = arguments[0].column; if (arguments.size() == 1u) @@ -82,7 +86,7 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy {}, {}, {}, - {} + value_special_characters_allow_list }; } @@ -96,7 +100,7 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy {}, {}, {}, - {} + value_special_characters_allow_list }; } @@ -110,7 +114,7 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy key_value_pair_delimiter, {}, {}, - {} + value_special_characters_allow_list }; } @@ -124,7 +128,7 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy key_value_pair_delimiter, item_delimiter, {}, - {} + value_special_characters_allow_list }; } @@ -138,27 +142,32 @@ ParseKeyValue::ParsedArguments ParseKeyValue::parseArguments(const ColumnsWithTy key_value_pair_delimiter, item_delimiter, enclosing_character, - { - } + value_special_characters_allow_list }; } + auto value_special_characters_allow_list_column = arguments[5].column; + + for (auto i = 0u; i < value_special_characters_allow_list_column->size(); i++) + { + value_special_characters_allow_list.emplace(value_special_characters_allow_list_column->getDataAt(i).toView().front()); + } + return ParsedArguments { data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, - { - } + value_special_characters_allow_list }; } -std::shared_ptr> ParseKeyValue::getExtractor( +std::shared_ptr> ExtractKeyValue::getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const { - auto builder = KeyValuePairExtractorBuilder(); + auto builder = KeyValuePairExtractorBuilder(); if (escape_character) { builder.withEscapeCharacter(escape_character.value()); @@ -183,7 +192,7 @@ std::shared_ptr> P return builder.build(); } -ColumnPtr ParseKeyValue::parse(std::shared_ptr> extractor, ColumnPtr data_column) const +ExtractKeyValue::RawColumns ExtractKeyValue::parse(std::shared_ptr> extractor, ColumnPtr data_column) const { auto offsets = ColumnUInt64::create(); @@ -210,20 +219,31 @@ ColumnPtr ParseKeyValue::parse(std::shared_ptrinsert(row_offset); } - auto keys2 = ColumnString::create(); - auto values2 = ColumnString::create(); - - ReplaceStringImpl::vector(keys->getChars(), keys->getOffsets(), "\\", "", keys2->getChars(), keys2->getOffsets()); - ReplaceStringImpl::vector(values->getChars(), values->getOffsets(), "\\", "", values2->getChars(), values2->getOffsets()); - - ColumnPtr keys_ptr = std::move(keys2); - - return ColumnMap::create(keys_ptr, std::move(values2), std::move(offsets)); + return { + std::move(keys), + std::move(values), + std::move(offsets) + }; } -REGISTER_FUNCTION(ParseKeyValue) +ColumnPtr ExtractKeyValue::escape(RawColumns & raw_columns) const { - factory.registerFunction(); + auto & [raw_keys, raw_values, offsets] = raw_columns; + + auto escaped_keys = ColumnString::create(); + auto escaped_values = ColumnString::create(); + + ReplaceStringImpl::vector(raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); + ReplaceStringImpl::vector(raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); + + ColumnPtr keys_ptr = std::move(escaped_keys); + + return ColumnMap::create(keys_ptr, std::move(escaped_values), std::move(offsets)); +} + +REGISTER_FUNCTION(ExtractKeyValue) +{ + factory.registerFunction(); } } diff --git a/src/Functions/parseKeyValue.h b/src/Functions/extractKeyValue.h similarity index 81% rename from src/Functions/parseKeyValue.h rename to src/Functions/extractKeyValue.h index 2d7cb41a69d..507641ee626 100644 --- a/src/Functions/parseKeyValue.h +++ b/src/Functions/extractKeyValue.h @@ -5,11 +5,12 @@ #include #include #include +#include #include namespace DB { -class ParseKeyValue : public IFunction +class ExtractKeyValue : public IFunction { using CharArgument = std::optional; @@ -24,17 +25,24 @@ class ParseKeyValue : public IFunction std::unordered_set value_special_characters_allow_list; }; + struct RawColumns + { + ColumnString::Ptr keys; + ColumnString::Ptr values; + ColumnUInt64::Ptr offsets; + }; + public: using EscapingProcessorOutput = std::unordered_map; - ParseKeyValue(); + ExtractKeyValue(); static constexpr auto name = "parseKeyValue"; static FunctionPtr create(ContextPtr) { - return std::make_shared(); + return std::make_shared(); } /// Get the main function name. @@ -61,7 +69,9 @@ private: CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const; - ColumnPtr parse(std::shared_ptr> extractor, ColumnPtr data_column) const; + RawColumns parse(std::shared_ptr> extractor, ColumnPtr data_column) const; + + ColumnPtr escape(RawColumns & raw_columns) const; }; } From 07a589c63fb8346099e9c6c44ede59840a41ef14 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 09:55:23 -0300 Subject: [PATCH 020/535] finish renaming to extractkeyvaluepairs --- src/Functions/CMakeLists.txt | 2 +- ...tKeyValue.cpp => extractKeyValuePairs.cpp} | 41 +++++++++---------- ...tractKeyValue.h => extractKeyValuePairs.h} | 10 ++--- src/Functions/keyvaluepair/src/CMakeLists.txt | 6 +-- ...tract_key_value_pairs_big_input.reference} | 0 ...2499_extract_key_value_pairs_big_input.sh} | 2 +- 6 files changed, 29 insertions(+), 32 deletions(-) rename src/Functions/{extractKeyValue.cpp => extractKeyValuePairs.cpp} (77%) rename src/Functions/{extractKeyValue.h => extractKeyValuePairs.h} (87%) rename tests/queries/0_stateless/{02499_parse_key_value.reference => 02499_extract_key_value_pairs_big_input.reference} (100%) rename tests/queries/0_stateless/{02499_parse_key_value.sh => 02499_extract_key_value_pairs_big_input.sh} (88%) diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index a3efaf0ae85..3accf674e37 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -108,7 +108,7 @@ add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) add_subdirectory(keyvaluepair) -list (APPEND PRIVATE_LIBS clickhouse_functions_parsekeyvalue) +list (APPEND PRIVATE_LIBS clickhouse_functions_extractkeyvaluepairs) # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) diff --git a/src/Functions/extractKeyValue.cpp b/src/Functions/extractKeyValuePairs.cpp similarity index 77% rename from src/Functions/extractKeyValue.cpp rename to src/Functions/extractKeyValuePairs.cpp index 40195cf8738..c1a9f4c3853 100644 --- a/src/Functions/extractKeyValue.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -1,4 +1,4 @@ -#include "extractKeyValue.h" +#include "extractKeyValuePairs.h" #include #include @@ -16,7 +16,7 @@ namespace DB * to be overriden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the * Volnitsky searcher. * */ -struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor +struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor { explicit NoOpEscapingProcessor(char) {} @@ -26,48 +26,48 @@ struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor(std::make_shared(), std::make_shared())) { } -String ExtractKeyValue::getName() const +String ExtractKeyValuePairs::getName() const { return name; } -ColumnPtr ExtractKeyValue::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const +ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); - auto raw_columns = parse(extractor, data_column); + auto raw_columns = extract(extractor, data_column); return escape(raw_columns); } -bool ExtractKeyValue::isVariadic() const +bool ExtractKeyValuePairs::isVariadic() const { return true; } -bool ExtractKeyValue::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const +bool ExtractKeyValuePairs::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const { return false; } -size_t ExtractKeyValue::getNumberOfArguments() const +size_t ExtractKeyValuePairs::getNumberOfArguments() const { return 0u; } -DataTypePtr ExtractKeyValue::getReturnTypeImpl(const DataTypes & /*arguments*/) const +DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes & /*arguments*/) const { return return_type; } -ExtractKeyValue::ParsedArguments ExtractKeyValue::parseArguments(const ColumnsWithTypeAndName & arguments) const +ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const ColumnsWithTypeAndName & arguments) const { if (arguments.empty()) { // throw exception @@ -146,12 +146,9 @@ ExtractKeyValue::ParsedArguments ExtractKeyValue::parseArguments(const ColumnsWi }; } - auto value_special_characters_allow_list_column = arguments[5].column; + auto value_special_characters_allow_list_characters = arguments[5].column->getDataAt(0).toView(); - for (auto i = 0u; i < value_special_characters_allow_list_column->size(); i++) - { - value_special_characters_allow_list.emplace(value_special_characters_allow_list_column->getDataAt(i).toView().front()); - } + value_special_characters_allow_list.insert(value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); return ParsedArguments { data_column, @@ -163,11 +160,11 @@ ExtractKeyValue::ParsedArguments ExtractKeyValue::parseArguments(const ColumnsWi }; } -std::shared_ptr> ExtractKeyValue::getExtractor( +std::shared_ptr> ExtractKeyValuePairs::getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const { - auto builder = KeyValuePairExtractorBuilder(); + auto builder = KeyValuePairExtractorBuilder(); if (escape_character) { builder.withEscapeCharacter(escape_character.value()); @@ -192,7 +189,7 @@ std::shared_ptr> return builder.build(); } -ExtractKeyValue::RawColumns ExtractKeyValue::parse(std::shared_ptr> extractor, ColumnPtr data_column) const +ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) const { auto offsets = ColumnUInt64::create(); @@ -226,7 +223,7 @@ ExtractKeyValue::RawColumns ExtractKeyValue::parse(std::shared_ptr(); + factory.registerFunction(); } } diff --git a/src/Functions/extractKeyValue.h b/src/Functions/extractKeyValuePairs.h similarity index 87% rename from src/Functions/extractKeyValue.h rename to src/Functions/extractKeyValuePairs.h index 507641ee626..70467379929 100644 --- a/src/Functions/extractKeyValue.h +++ b/src/Functions/extractKeyValuePairs.h @@ -10,7 +10,7 @@ namespace DB { -class ExtractKeyValue : public IFunction +class ExtractKeyValuePairs : public IFunction { using CharArgument = std::optional; @@ -36,13 +36,13 @@ public: using EscapingProcessorOutput = std::unordered_map; - ExtractKeyValue(); + ExtractKeyValuePairs(); - static constexpr auto name = "parseKeyValue"; + static constexpr auto name = "extractKeyValuePairs"; static FunctionPtr create(ContextPtr) { - return std::make_shared(); + return std::make_shared(); } /// Get the main function name. @@ -69,7 +69,7 @@ private: CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const; - RawColumns parse(std::shared_ptr> extractor, ColumnPtr data_column) const; + RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column) const; ColumnPtr escape(RawColumns & raw_columns) const; }; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 6428805361d..939937c2aef 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(clickhouse_functions_parsekeyvalue KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/SimpleKeyValuePairEscapingProcessor.h impl/SimpleKeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.h KeyValuePairEscapingProcessor.h) -add_headers_and_sources(clickhouse_functions_parsekeyvalue .) +add_library(clickhouse_functions_extractkeyvaluepairs KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/SimpleKeyValuePairEscapingProcessor.h impl/SimpleKeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.h KeyValuePairEscapingProcessor.h) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) -target_link_libraries(clickhouse_functions_parsekeyvalue PRIVATE dbms) \ No newline at end of file +target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/tests/queries/0_stateless/02499_parse_key_value.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference similarity index 100% rename from tests/queries/0_stateless/02499_parse_key_value.reference rename to tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference diff --git a/tests/queries/0_stateless/02499_parse_key_value.sh b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh similarity index 88% rename from tests/queries/0_stateless/02499_parse_key_value.sh rename to tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh index cfc22e81510..1f35ce6a6c5 100755 --- a/tests/queries/0_stateless/02499_parse_key_value.sh +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh @@ -8,7 +8,7 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) DATA_FILE=$CUR_DIR/data_parse_key_value/big_input.json.gz ${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" ${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" -zcat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT parseKeyValue(file('big_input_file.txt'), '\\\', ':', ',', '\"')" +zcat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(file('big_input_file.txt'), '\\\', ':', ',', '\"')" ${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum ${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" ${CLICKHOUSE_CLIENT} --query="drop table json_map" From 1910377be5edad7481c62f5cf9fa9efb7894985e Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 11:05:56 -0300 Subject: [PATCH 021/535] fix tests --- .../02499_extract_key_value_pairs_big_input.reference | 2 +- .../0_stateless/02499_extract_key_value_pairs_big_input.sh | 4 ++-- .../data_extract_key_value_pairs/big_input_file.txt | 1 + tests/queries/0_stateless/data_parse_key_value/big_input.json | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt delete mode 100644 tests/queries/0_stateless/data_parse_key_value/big_input.json diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference index af66f25c631..45caef3b8d5 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference @@ -1,2 +1,2 @@ -8c089cb51ab01cb2ae5d4b6aa8921b6d - +406b888d56db414d25b854d3673d345f - 1 diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh index 1f35ce6a6c5..24182e3d297 100755 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh @@ -5,10 +5,10 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CUR_DIR"/../shell_config.sh -DATA_FILE=$CUR_DIR/data_parse_key_value/big_input.json.gz +DATA_FILE=$CUR_DIR/data_extract_key_value_pairs/big_input_file.txt ${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" ${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" -zcat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(file('big_input_file.txt'), '\\\', ':', ',', '\"')" +cat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(line, '\\\', ':', ',', '\"') FROM input('line String') FORMAT LineAsString" ${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum ${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" ${CLICKHOUSE_CLIENT} --query="drop table json_map" diff --git a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt new file mode 100644 index 00000000000..1065f9fa977 --- /dev/null +++ b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt @@ -0,0 +1 @@ +&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=(&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=( bBO: aSqXrONruaRWxTtqomuGZSfg3GExhjljYJOSqwrviXlCunl0eJ, ZOxSPRPqbJFgYKchBrCb7EG8owcyx: "HPVPgTCIeQW8mvdGAuj0WRbaMeWIuwgaVC1CR4cav2G2m",L1U:"LqDf2bi3dhNZlDKhG7BZI8a5O","RbaIzZDjX7bjQ":DAMd9EgQxgCzPNqnMtRFw0qBXAItgfXKOu,aA2hf8CpJOVXH2dwZMpRqPoLRv7:CoQK1YLfO8xgivMNfFXtnW1nek94RomFqOa2P921zpgG8W,KYlfx3QgJJL6KgVMrPyRoc25NC7oGVCIqfDDW92wL3j8OCR6AzrCJ6mXIpWVtxr:"lyz6i7",#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`i4WPWgYumlO99w0PFtS2oc:e1Vx05nWNkROKnu1K3TJ7Mnhg3g, a1jDET8WGoTCJrrUzJQtm: Z6EHpHbFclD7O4L0qwWkk26OM5EW62YyHtH4FYQjouiR8yFI,*=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''**=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''*WN5cCJ4AZzoM3ozjvaa9MZCRisMOGPNO8nQCbWMgt91AlXQ5q8:"iLHt7IkOJxznwnuYTybux6M8e3K3ksaiQggiSIbLigIqfDqQvV",~@*,<*~))/#*]#;~&#>?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_),#{=}]%-_*;%^%$(|)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_) "ryR3w5iBOV74GrW0YlrVBYV7r5NquYail31QuNswwd2SJqfDWdN": jqdr1xR1uO4TFd0O6nNU2pCZ4lnyIR33tRN6mjw6Xv83hXJCMHyH,vehQ3jObweRmCSpZHMs:"kYSmBIMHnQU4BL50ZJoxmWsmwHQwV8OA8OkfWxTDDDMdQ60G0wMX2snnZTf4Vbyhf",RSGWMlLyvHKRSPb1Op:IfLe9moJGTTMi2EBzqT1ZEICgy6,}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{ mnJCmbjybQDn0m3pfc2Gexx8T1rQPT3vs9En2AKakW1QXrPUvvOrhQkWRA5pAw2: "DOwmPqqCf7DJ0Njn8Dxq2630TLLZGtfHhObX99th3cQcHdhnOBNpA292",fjtH3kYdnUYOaiV25TY37hk7qdMEigwceothWCHeHcNT:SdCQivn0occBQA1iZV8ewM,"BvMcVGGDlELqvvSDFUx1A5":Ny2nE2IFhjs2dLJIztfvvVf57j,ubawZkukoLWXLaU8Wis7u65DoFwq9TIqiVAPfBpiLLx69KiPqALrkXnX1t5:jt0UXegwbORBeNq7J6QpkWuVcmtdhXnxqfzZuKs8WpNSwu2PHCi6XzAiIEh6f,JadA5leQPXBB2pegQ55N9Wc:"P6opRuWHkoDYkXcOpo9Qqj7wawR8y","C7iHuHVBo9oyIUAP6ai":lgogbZYftOHe, SAeRhIi0bh6kQNAQXI4fTl26dgL9y0Zt8xl1JzD1MLDvQZFnDkU8aYS3pYo: jEGjxlxITixh2S1oF9T69XDbNTv3X5qpVQCTyf2JHVUDvZpE1yIalPpNDqjAculni,[={~)~&=@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$#)>@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$"Cbp":yF97mPEuISAWDbLGHRXkvyFswJQGub3rapYw8pIUj8Iy6BNT4qrUkPfzJu1viapAE,E3Or9HRv0l9JOirYKHn2YrqYSXT4A3qcxjdLOf0dqHnW7DoYMP6lbLgh9gMYbqj8:eSxKuE,xiprDJWAqQO3G2fEO6o:"tXlCTXuzFpN3rZVI52v6SE3cX1aJjB94oRquKXQbeZeEFd47wUIs",'$),#+_}#|[('$),#+_}#|[( MoTsMBYEpmXZOxdtK3Fmg2z7ejO2qraizx0NxWkiQLJZAof1rtPlWnVEOix8EsHH7: "mVeP52LGDDw2gVkEnlUDRGkT5oV6KSRGmZksJgUA8Mz6K29VJGg5w2j3l1xaEbqHE",*%!%#*%!%#"z60XAmGkusr1":y65ZJ6pYon02IZCu8e1K7vecSZ8Mb4Pjg4,Mmgsr5m3kVqSMbzKN5Qyk70zOtpDfMBe9Ws8WsBNIq6EBDhDN1rw:"RmAwQoJOkRD7NVE2iVgIdHf49R9Q4XkHR1wVmE9",~!()}<)`),^}[='#;[/[+<[*;&]'~~!()}<)`),^}[='#;[/[+<[*;&]'~ "MLwb2KHrs20fA1XIi5TC9DjTcEHKwvqCv5VdQXegLH": Id4rIadhfv6K1TvOQVOgkm6kDx5ViDYCQl7OGBuYB,/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-s4OtFrTpOyWClLejg1XTXK1:bwLKbnPyimEUvfgO6aFF0BLS2EP63vYa9osHdh0ws9tjMTWZapi,"SpuLcRscA118OPr63OdWuqyr4Wbn":JWJKB,I2JSuUZ7VmT1BHHKvbKLv2QuO2ZGnDcum6Qq59PQuEsmXV:QPqrIhoSp6UnWh1X5dFXgcmDt5F238elzanh8leYCYdjwLLrDPc2PqvgreFrl,{.&>#'*>/+=/=)'{.&>#'*>/+=/=)'o61TsOyn9pbKYAmxDiByA82W6DqoDyr7aTLx:z0O63wL3XOX473pCVVXO0x9DXEtTeY3s1kqHFNIPJoxU6pKyjMiQ, KPPI9nKaKEXQ2LTP1: "Y6Vb5ppra6", iDFPFyQnGBLlfHBKEfmThZcnE9YQ3yZS50KRQDfeJfHiXQlpcjUhyumjZlhRJ1jxF: Q7UATsYlv6uIBrNpexkRAb80Wrwp1hEalLNXMQTAsBI5mEoN25xzXhuaSph,GhGcWyg0x4am7w1NSss8L:lMpGOPI6JPBjufzywhMmAdlYfE,[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||<[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||< r4C00g0i66rU0CChYYhEF: gNVPYrvjI38nnkrm9j7Ot5T,<=&<=&"kG7l7gv2YEHdMxi7k7n1mxbYrhJtazsROH7lQiqx6kQNl":RRVpAGkFZCtlsRotUVYUyeBev4HTBJkoOuL2EEnU04SIVEKV, ytEWFzMO: tKh3Pvqd4QfWPERZuMFChzeJ8QtN4Hbd8,"r7mevpc2G6C2hU8CIgbWMI5vtwFDfzZqWeam5JUJlcIzelbOjp8So":bMtHEZmsJMhfWyRR54rhbeisUO,ESIdZ6tn3gdYaWl3I22LYDpqFa9L540TsqDaz5DeeL4A4j4UzXOky80Iq:kiaZocwzqNj3uBm5gv1Nbq,&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`bS70WPcW4CS4aBcjH1cddIkvhErXNa3rR51FLwMSR7:GoqCzEC54oAKPycGHG0jtMNsyS0GitppGj2dvG0CfESwneb,VXi31PvZK4mCEeG2zCIAbL:lQZCkyYM,"RwGS7EmU1RNZ8aVcE8NK64pOPrtoXGI5ZB51dj8B0kyeEF6HMN":kOmLidOiGxjrQfgPzmZWr84VbRnvR2Qw4346FzBjHCJVwrSRk,];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[cAju1VPohaxvOZwsuHIK5LCRw0gDk1jKkAgXxF:WdQilqqOBKmg7OuUeTCmbwMbyD01Gpia7V3VcBLWNVRGiNoBStFqx4iyOV48g, f1DuLrKMOqoRaSoupBqLO1vw: nvCngxsEyg0Fp1Sq1DD6QQaJUUosym2AuQp,Xa1TI9s5nrPq3NyuKHhH4motiJbgKUEpiJ5Q701:lYZIT062YGOQx0o1sUamGT1MOsPfKuaqUhOWAhxTffUDoIEB2ifT, RhMnn4jeGyDMTGa6I: XUBiQKgUaSocAmvob6ijrv9G8Hk2xFBGbZBZ4uWIVo7tCJXSRGj5Ptyci,`!$#-+]{^/+'_'!}@]`!$#-+]{^/+'_'!}@] N0QOctoqmPOUMrUp34TLNZORcb1WZyJE4k2Gpr2Z9VuIr9l5ETEmVrdpw2t: fk1jKZN3aoPpmPsvHozyUmDjqb2w, GF903dejR6Dug2eVTbpC9D1f55k1VOCKFidTSo2gbzzzK: AJXUtO5mvkIrA,>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[CJ38S5IpbC8M0llZ6OkNheikOS1mY7swyQJQ2yPyiszBBBOJAvHHd9:"ncnSD4ya82wyraiYjVRolYNONOED6qS2TNiZ54TRL6G8VKHn5q", dcxGPZFIl4F271KVRf5neThzxsxdR51suRWDlyVTNWOIyOWXo1jvvq: slllvACa1THuHmL0j84cnNujILZ6MJyN9orsm0Bu25oRqbh0oiCDnmFB9tSMviw,{+)>/@!<=|-#<]./_)_={,~{+)>/@!<=|-#<]./_)_={,~"gOtsWqFvJXsgyIg6rYA5lIe1NeYEruDgok2":LoIC3bZBuiAbVUaYZLFAvF831aC4hDdrALLI,"PDgLvXZf1gI":DtUk,`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[yqx1xaNDdMAMFbFzCUOBHv9iddHYKdi9vsPe3rD56k4zaV:"FBrOLMTK9B",+|&=+|&=WHqumNUodt2PWokZg4W0J3bCddWMW9szNvmPv0vjmFG:"jLfvCPq4Ad2mlhmlKmKhWEaZjLex5Zv2JysiOmVguqizA4bdPdsNQj","MZeGwvErbIv0EefJYRny6FjzHnQYtLyYFE2UV":nHkUt1NnrnJIdyn9kDlQbVU1S0TuAqkynJZ05cl2MBwlT72SWlvC,!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]*!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]* POgf6C4N8iGu53Bfp2ybSy: CbO1wby0B2OE,{$;!&<~$+_*`__?,{$;!&<~$+_*`__?,hlmwjhU3MYm3TEtogWN5C0lsXDt1CRS7J:BamY4TOvtD9pEcUOWDmMgwh8rpuK1pyn9Knp,LDkAVjzOhpvLSL5TprPQmnV3RqjsRR3WiuZ8M3pvlz:RMZRJwC6ewSIDuMhYB10sPmBZ,"qygEHrLT":"RZVoNb37ybtQFq3pg9r7XsXdEXZyq1Bujzv",cvAVlz1AI6:XBCP24V2mGhYwABWBMBFXyvutwcSr3glBoz9bfvvn,MGCYPNl7vx:"aqMfvMrEOD5gl8GZyjo8","tJlhKsAiFfVYuIYWDx5npwcK":QxAYyV5hJqpqyyOqGRR26V49kMAnPz0d2dlCUgPcCer8Peu0IQNi4tjEVjHiMy, PkbyGlrKckbYXZRSeDxKgLkb8f2WZIiSkZiIBdJxkaa1I0FQbuE9DMyJmtucPSi2: aeGYZgQy4taizTjcNQQX7DvYniNJmENR25,^~',?[&?@=.}.*}*_{[{[@],~(|>)$-^~',?[&?@=.}.*}*_{[{[@],~(|>)$-"PaRfuI":tF5nsaK,h4K0IgZuKPeNJXKjSSxLaT5gzcl4D4L63ykzAiCMTbl1A3:va3yvNVb3hTnL2K1WfmZg23PE9wk, XAPVvi3pqSkvuNVuVzvKtAyDtZAGYdXNvqj5moo2gFf: E8b2WhxqWt0BL6,Og7MjoegoDTF3CFfZJRmz5Idjw1fRB0dxnryV83QRYt:ucPyXaV2i4Rw3C8ZuiEi2y1uzbz4DkFnm9FgMEWhszieDmrG3G90Z, "TLobGGpFhPZs9Bxp1clwYvf6hMGLRGcg6ZRUEDYW8Fnon": P9MALDdHFWC6Kwn3zIq0QIl6W2,"YABWHUu7pDruOT8QGfKcvAeJxu":"BtGE2quqYJ332j", M6XTf1Y3csBFjQ01DZoj4DdKO6J4CDwOp3JSrWIj9kH5: "IHhuXey9Jcy1L3DApgdfAD",`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~ tCRK8InckVNgel0Y: bxeBTnsQSs77t4o7Wn3oAQw5hKNsPCJ4uoa3xaZfwsx6rZdFC5643q4fI9fp83,OoSjaY3qRQ21X0nqVoZ0:D9LeCyYvkWyomIRtwqP6q2J,"eoZm9pmDFxl1mRhI1IEGaxKr0U5ofrF8SBghxu":hexeZbw3eUDVSxMXImZmUa2Yf4khbst106HF4S98ovCZirf6KQT8No,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,CQom5yPn7NLf0HjLPKZLrEodaHNBls1p9oMFT8fyBTVkiCk:QkL5d5Hwh4XLutRRYwfWyHMiju6HNZqM3IBY6, YCvobbCFxaHNzGChAtwJauY5LFeVu7ZLjipOsBtu5s2eJwPnVgTaJcVg: "RM0m0zr1DofaM1bWZ8QbMXtVUCgNwK3",aT43I1TMisvG0d30AAco:TKsWdpMOuFkxYm2oUGcX,jKBXoop41PtFsvRAziD1r56HVlRe:mFveseCTV3nFmArmQpumzHs1abqRtOcNs4u2RJHQAn3ymhYnLzpN,JZyu0rxGXyXRQ4NXLFSXHhlcDqrbPB2sEWKAnGFYnKeW72yiPIbmQvuPIDk:r1wFMWTZx9Exg1zGox53Ps548nFxsbQVFI1l,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,EG9Fh6V9mVDgA:"aVwz8TpztHuBdovFLiT4ilXqf8oW",&[>(~|(~|}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_;!.?-.@^?`{&_(>}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_ fGMEITkyxISayFNbmnz4VtpepDbIf5KvNsQphQThqnsUigpiHMJcBsIubJWMvEC1l: hnIy11kOgF6nsPJG6ZxrFY, "d2Ps9w3hxDwFt75uTzD4": oIUwCE0L4eKP7PC55QqGr0HpVhS,_/(+@{~`+_/(+@{~`+QnyjFPSVp:JBINPLFMJKHxUjos8laMtSAPta,%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)#%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)# EN3QC1dzBFL: EHsqzK0V59m2E1ey62JPioB7Fnf,"DKVD4uTX":i3r4OlbeJJw7zVq2iPE2wZ3YDeOVjBqR1VtnhJ2Ndlvtxy,rLnD87vuBS:W5ZVb,f7NQXp25FZ99FnjkZUtFhMz5hBYaZaPp0:JnU2DylAEelg0oMYg,PGZZJ8s9l2i:Jnj98FtHuyEsKRlMyY2p18ik46jhxKxrjDsvJKZjhdzok6Yz,"JfnVtytg7zPoj3wl":uJI2jc40oAN9mGB, MaOZACdZDlm8g8FcXuNoFJZ72PrnCIq: i4dwQhLdRyjvOPaw6XaMC9P8OQ7X8efmYDL,`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'ycCCmSOhper5Dtcpf:"g7R",)-[#)-[# "whaXKTJB3irCR7A5AjjY": t1LNSPC3HkLYfRQ7fB6KfuTGs, Ej1IGLt5bIa4B1qBdSnFSElfOd505vg1XZOiJb4Q1jTSwWvxr8LQo5hi: "niD4WAs","fImB0opnOlmtDpiultxiPpcu6kBb66mi0Z86WoNwiAebGxegXw74Q52":KgKYwrY4xfdRxDzUZh6gNxMddUFSgrGDByPcsDxm0rwHfBAb6, WaLGYPqrUPV26wfUhaedyhzVDNVsPf0h73bw1xfg1eNh5gm7WlG2WJ4: "jX5iirhJl9NLt7UEhZVeJSZmnCuqATJZhEBrZKi3l9UpneZSxmpbSnbVe",MV8IkfJKSCfS8bIQePELk4ZSm84JUstTHZMbaSS8:"KWE9LbLqjEkcVuhbFl8bgGYJ9aW62pZB6VrHnqxWzxCXgCzuJce9fQbq4eKNT",|[.??&&[@?{]|(|[.??&&[@?{]|( FI7zUtpNVhSs00W33W3gYrvKP7cqvjzkph0VoMPM: "y2cFxeJHNhgJ8drchtPQdp7RSUWXjDLSTWKEN8niDS13HLbZ9DOrK1OV2v",~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?>~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?> QDQRL3uh: "h65NGI7KtKhbP","KVKzKJzWqpjzKQCVJvWUE3hluAdWSInqv4XtfRmPYpQcDBxYYHrYn3s67l0Fv6cY":A9f1Y8rSoo19WPcbc9QvCzUROBrI0lE71RplKQ37egUHxJ7zHyvnCW8buQmHsdrxR,"kQuN":fGtoRsdk2Av3yOVVj0pl2oXnAeRSJ4KkdNOpbWAFCDt6MIQ4yT8b, JbkETNLC8NnsMt0VXPgO5G8WEGQJrKJArr7jKPKafgZZQDehYmHRkdd5HE2LKM: wIMjioW26Yn1z63cmTDfTLGzchu82L,vfvjeHO6S55shneXaRfrKjf8XALmo0:mzr4Cp7,];~];~Bcaq9Ih6rVMfCgsAt1Hii6ytGAO3FZpQwYZGQZ4jMB6xqRrPusj:V6UYWvEkGxdaCXCrc0X0s0c3JIv,MUdww1bv34mNRRudCbf71R5yBKPfT0LxKQamLQ:"lpvduLHFKHu5q0sZF7GTrxaMf",`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$ "lSHI3o5ZMbCoZijz8rg0VfyH0": NovLG0Q2U3kfBstukJSg1lw6KvxozaPxeppRwnlJSRJQi,iD0GDjcksfNL8roxXPF:L1TjSmsTPL9y9d9YRYVb62JHueJRcPX8mJubIj2sULGKhamEhS, gxZclU9i: "iAX",-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?h1mUTSIaN:"qnw5jW1lRFDauB70GNXsJlS4iBB9YU4vqe42DceT9mhgc6",RO3CcI7lS5zYYhdF9N6hoAzrZ51RWqxiimJDD9gMgFO:hkd5yyMKazddle8Y,"z7XbCHGkSYZi":"ovpjkPboxecx4Z",>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;?>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;? "cOxLyzhBrGxxR4DtAQpDdI3x2jf6F1oLjhppkrvDEIGiFkZjqOkTcTYbalkWVU91": "FMcA9DcGbriNeC6wrz9UFNzd1jE8uX3XgquNr2OcLr4Xz6SrJ2", CIQi6yLbj0iGONECVJrNUr38IbsbXnegz1dK1KU23tN: li3MdWFWGTDHo0LIMVP1Q4zU42WGSQs8T,ZQQFCXt53SRgrrMC1tTeLipXRE2Tcwm92qAzltRbZxsZEyruW:afWYwk7S70pBuVK0tKUY1TjHRZAYnRczOl9n3c, utDjvOEushAKWeLHd4NsWUTcNTGUIfB5Dqnjc8TAKVP8YwQbd: HhaJ0NHgc9liS8o0731DzLVu4C6cv,e0Zodb5:h7zmDaBIFYv7FyT53I,SiALgVK:"Kmb0UDBUNBam16xo8eMYiclRa3s0HjVLelj4x43j2tuI4BvPHjnp", "Odb2hfFUGHfHaY": qAHpczn4UcT75fL9xfk06loZnKA0M,*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?pmZt8LKBk8v81n9TvFBiL:d9PgIq16rODC0B56VQUTXiCD06DeIZGHNwPTvOwmRKK3go7FcMFvvDpsg2hpGf,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,Riw5hoXswexvTChavJL0x9EojtlFeOGXSt4H98qOtsbB:cGdFCesO7DoqWQ1H0xQ3ViVEgjbi7HKV4Bi, IgUYT3wXJ96LEdhjwJdTr1: "uOs4BHeqUjNTvUbgCsQr18Kmm0QmmjYRZhZR6C", dxDXFOu50DTNtMdmem44KcRyd5ZOrUf78rrum9kAi1oPFNN: v8qMBY7QVnElKZGbiddTQ2Ovroqu3AHbIlw8t7Yb9,DoumlXaXXlNSGBe0w3:"APUPvlUpb89tfFsghDDWokgCOIXNvxZIjx6ibOd95Rvg3h4","TUw9ovoTFmTTHwSLH8esU":zKOsiTbzfAaXomgFjEcbfAK51y1QQaeuL0VbgBItAMRbCI1FmoaqK, "gRag5uAtEP5J7FXaUSVRgEcy33wZyZiCwGh0lwVcfcT8TZzohWbdlFoHFCRHsh": "vgqyen0f13mvYzm787S0uwGalN7WvvHEgaVCAwAvAVkLVTle9qcSRfOdN",!*#-]!]&.##/^'{**![;$-[!'&^]~/';|{;&^^#<@'=++?^{+{[>|]|]%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,]#&';%(>%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,VGS9fwlwj432DzB8rxKLdXm:FiHgDkitQxankHSDGXMxgEgRTHjBGuW77xe46POTKlJKOwYWMlFg2O28wj,YYrn3GmUufuKYHk6bb65ibYRjgVGc1fFghaUUCCZYGqLeQmgsJfLIEuVgvTsbD9E:fM, uEPbcKTn3zbcITjsrpH2z9OpTzSn69BOsRKoEnmqqut1cnV2fiQMz5M5saSorCsY: eFnf1XQvJsRPRt9C7SQAyrN4nbWXR9oYJcDQwTItpWU5DwNo48Q,_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]WtI0oX0GBHbu6nOJSFad3fvc9XdIZS4xpjf6hYeu5EaUL7sWO6M4aD8:i9vdixQj0DOhfI,"oOB9CelaRdidnx4mRZ6BoEoY69p2wDanHHgrrUDW":"k4BN2OKRRyRUvdKm9mT7hvyaX33Cp81kNUDwYrAGxagtO",)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^ a3sIy2pk6qM6skiE4u5bCbKHrdQ: lxhLTlLKr94X1tcawyun1CQGYDo,Z1x5I5uyw9cR9Er9z9p1tLdQw:t1wYrsAZG3PVtJIQXCaqiTtm, z2EfjY52764uQptee2gdrjDOY5S4mxnOtFGtlKBXI3yoORAYMs0: Sv8tDgW3e9JdRlt,HFDdOSyTjfpH8g6JJWRBqOrHOJ8lUR7V:Cn1Je0PsqLwgbwkYc2vT3GYjO40zbMibJ2Ur,tip6z7mBRKG9dA9Ec:JXIHudC7cjdmb,Am54fKenKqiNII19ixUrmaqhiedbE:YXff2qITjQXzfdJRDbXtwz3RH3ldLnVvL6Y7OQfqnN8cc0cNF76lPgObm, "nozU9AIVQrCPqYOfboROIL9phGtOGyJD5mwODBDb": pPyPwEc, "gjh6URBo8jhW0KPqQ8ZF": V0FDeY5Dp9W2Se5Xcb7c6Xaj07vTfaQeaAr66iGraw,+_^>+_^>D2UCbP2SF39aBHdnBMPPI0Uq7Oc5dQI5B2yRv4x8W6JAt:"cHKo8YQjv8VUO6NX0UyMIp4vtgbpa2prIwfEdp7Uj59NsFXH1T56", psbR31wPaMeJrmXGPunNc8rVTK0Wzf61Do76YXqHYWHj: uwme9JHmYIuM8aPoxqhs5Cy5c2tlsTWMpEIcg,"BrlyvNjpRxtvmsR2z21zPd7vssBXoHGprDdgbKOPD52z1f5e9jPVPO8srmmLseEOG":"MFImdpQODKHO9XZMVnzBGDh3NtK7uTCDjhsLlpN14En77yTyYVVfbp", zjBLNnb9: hNy6irKBd0QcJRITDUTn70kPRg5s, fIRSyW53dpWbtrksVKFweCZ1rlbfQiGkVxihnG9HHPN9: hHAkasVnGGGFKpOSM7qHv1cKNqhZU8JtWJxB7pbdZceHPRS6a,ckwv9Nc9EiebBF7hgaqVzr:ls9ccT3E3ASqJ2krM62MlvMjDF1o0GVAhlbMQC7F76sNV1vRx1taup6awOG0,l8PjGFrUtkhaRVPiOVTQlqBs10F44ake8X95C79wabzNZr9pt:iLKAaiwWmq5e5Rg24i4vzHH4w9VhgNoGSDHg5A,AOvrlboW13nwC5y9t0FUb:PRNKBWQ3Lk3qCrLdqyWMzPaXtfNQg1KFds5OH6mClWBZr,"sJTv5493n26lyLNFnYal8rSqstbWhuhh":"N9wsEq1bIGadn",SSDde1Dcb0CllOaLUi4:"dyhyPwdApAQAsIfRQE6dWYcoFhbYNuVFbXDNzN8iJjWJ7yJ",oxpiMItLUrdsO3X3U7a:IC5OwnTSplMMXINqk9B8Qrir4Ac,;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&ZI8gCx9n3CHsKSmlOGSkdZTz4SdOX3f3bqezi7:LsgJP5wlzA6UZ0xFaz8CPKUg8,^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$WtrAZyqixiDPcWYLykRCT9LDFSBGMhSAACgGpCqQMhNnh:"athZ40r2dB", tLJUnVfmagJAT1CN593XkydiFRfw4zpHhLOs: zIo8chguw3Tv2h3Y3oKL7ezCY,[$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+![$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+!nNMGeutr:fieVdn7m1VOkfN2lPa9ahTjS0GVfJxnEdtkkVZUaGUsx,"Sv2IkYN":qkVC38NEbKB,?+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''??+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''? Q4lUZtEmjwHPPQtJUPePgkzqh3loLFHcaCoD4dYbesvsYcNj73rMcLk5wpHt7v: LcIzyVLgHpDLbQb3dRXd0QgtVQwH8wviIkXjbu5stoEwQOf,rXPKNJJCUk:"dv", hRnsiVtPrny2bHc15lIFYY806DO2w1Le5zVCDCNLRh: sW13Vi4eJBhvb8z0nAe,`[-!(]!/{_<,^'$(_,-`;&~+~^|!-#;/%*)~{@|_#$^`+('#'/{-#/*;[]((]<~>}~^||{@!,+?;#`;].)&.]?.}~^||{@!,+?;#`;].)&.]?.~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?,}^<)-_`}'}%=)&[`#`$<~'~...;`{(+^)-}]-!%>~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?, "LFeHO4cszmnEKMWWJcP": hcZ3MeSHmkLRBRht6U29efB5FvDBsUYMrUgiLwe0YAllXS4Wq5QDRJc,"sDlbDGrJIaNcBLqNLE4rhDRE":"G7DftLK6dBk7zQBl8daSmG",$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+ "f9xGgRoy8DerxhwZ523WhmZlBaiOcCeKwdDWKFy3ANPlVz4LhaW1V66z5O": "SP9OgmKSQcTmMtyDLmG5l3yYB9DEZGafC2EwXMd",CbO5xSzNNHtnA21GKh3E7XfZp64TkwMJkWb:"bgCAp1wDFBlxr3Ey5sT4YhD7efuUb0ZZeKXfIRTcb",~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|BVjzuLNrDpDYGSvdYbjkbLCJXlzI82ggb4IOyPBQa0wrNnMKG:EBODodBSz5CqTmD8LQGT1fvecFgcuGaHgpwvTK94w, "SoAnDorWaYXrzFGnLWkECFou068LMx2j9sTRVTa6X2fqqts5n1jE3PWhAGZFqhF9": "hQE3o5ybIgi62iN6DY5sZ8",T4Kjr0RIItwRPN0ayPN36UMDLdYSKaF:"VyMSEOR5aaHJvuMb",kdc1xA1ZljI1x6DkzYy2U1KKZhrB:dqrE249UuGuTFh3hV7yO, "gRKyueaaiHW": b2vNV,A275z3ansvXYA13A:"TugrTIVfAdyW8aXjnoaQemnXz6dk3oabwwXQ9LDQ",ZJZ8yXaplXWN0VkfdBWwIF0a041OciWkxxK010JdRo3zWcfpyDDGRCxKZZi:Oh2wHgFOC7KOOH,edfRL6tXvrZrzGlFc2HXTktYlyULKng9TpClpsTZv887sMjO83jc:HYlW6PB17fGbKwEnUb8Pt3zeCbcP5zgdkavZ2hGse5h0GIt9rMOZUTGrfXAj0, aJr6xvkvaHDgU5hSrSm: hm1CyhY7FNoeCfvF6RQQW3PCU3rbyZXFHkgyUayF3rCJCPNlO8MNIns,"m8gBylJ3HKgIX1Iz9uOYh6":rMssthiMRJL335iLeZMMK3nQGCPXL5zV76ybV,}-'?^_$_)}`}$_@}/~}-'?^_$_)}`}$_@}/~mOQ:bNrQa93CiIekpZHAyd9KixOeJCjDX,eKBoLjbZ7hyr:LYu0cYNQ1R9n7W7q8ojs6uUnpNjGGZqLVj8ywHT3f,YcArU5rAgJJ4BPMDN0ZzVEgben52fR6Z9z6g779VbGwdmwTAwvC8l5rwX:Du6ENW2C5We9hbw5t0eVcf3RITdOEraUqyfhFfLMQBUx,!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`[!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`["GvMTimj7IVeL5eaQBjD4jJpMIt960aIYjlsWt5YXLzAd7oquZyi3CbjIEqeiIAfyB":dPmZ,"qd0t3CmD8qmjXaIfqLZ":"Lccz81IWzSQYVWUiHKInQacQPovDZc5jscB","U89Wt3eTIHPNfoVKvG6xr8f37UXXdEBP0sS":BTAJCNgmfKD9mWMwHogOZ7T7Bb,zlnXZ5DTM:Rl,|~-,'%%|?!(<`>+)&$%~|~-,'%%|?!(<`>+)&$%~YiBU8F1ICKDge2PUySylfSWUdPjc0vhVX5Cj:"LePOIFsMGqnsbC",_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~"IJrL3nQfpg0RYhkVbwGqcFtSPXdx8Pcjd6ofeMQ9zmE":"DsTIhDXPe6IIf5QkWDc2sMOyUr",-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#!-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#! BCxJW13oYAnB5SQpgL0Wjsyybkn2nisOVAN09QMyBR134L83QEeOxWM: TJKQaXmWPe9EIi4IGwABp0bQlT4L4q74w9pIM2JPjisCsN4f7Y8B97xIrkX9I5n7H, f5dADppcMozC9OZ4sVKnB2ktjw5n8HjqZ742U9ipRomX34: "K0PTxHxx33Tdyglfa7",+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'"ZZQcH9pt":"BwEiNm3eVdTA2kAtekkr2rvIDIVjEGGccgFRw9wlBUC5q7YnmXi",-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.O52vKoB7nF0KmL6oPC4CJO6y8gHS2Mv3Xl6ueKlRLi0604gSjXz4q5bt2s:"ZNK6C9LcAgOm4AiyxoAqvA0G5fb3Q8bX4HMwWTJ36Rhv",/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{ "Ml7XsAC0hb5zU0llGLjQalcUuNk8M7HPC3DM6WfbwzHNUC8yX6Gv": Gt4UcqkhOLqrtSqp2IRS3,t7DyKV3elex:"AQLCeT6qO90cf8hMkjW9zjlvuSWfpgHhVKHairSf",I4UOosaeaL:zWlFIJYuFk57oOVanPNTq5jqMzSufOxrQs3G5v,OMP9JvXwX3KH:"AdKMmHxqeoI7elt3EISOxTFL",*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#IHmZg:rjWlx3, aIM9IkPTFCJ50VmqdqtKqzEfKfo2wk4q4pP9oM6fYFr: TQlkf4ZjBmETge5B7kc8TfW,"YroiPWhi1GFIqs8VwnLFY8EpQ5lcoTD1fdMf":"K2BoA4BSXf8nhrFCeTyZUfVVFu3jPKjpRd2qtVTA79FSoAonOMY",~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$|~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$| Jl7uobEWE5VHiRRVaL6eKPJvRnO8fdDJrR87HIlHVUf8Wb8AQ: PzYo86vdiiZLNLsoHWVJCzXc5aolCyBK4OcJSbYMREMyQi59,lHl2UrrtVYtmpPjZfdU7BJ7qOmSdStBkmF:"Jsga2UwfIV6j0TcNPROTXC9qiOgl1wjxNmjobAOc",*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[==*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[== "DVo5OUYPKA": "xm0dw60WuBOhoXZlAG1qMsQW76xbxMh729yoVRvK1gM", nSD3SzGdBnhOpt5vrN: I1GWYurmtpNL5HbMnCanfzXVEGeCcSdXy0RwXNGgZ6dPGm,LUvGxOWZPGLztGQzLw0Hh8RFUlI3aA8KmZB3GZT6VyYz3sQARdiOra8Ehr4KcDEq:PIl0SICXHD3lgXxN4L09WnbWtkCSDcIc7ZyS5eYgAYq5loLnoE6m0aiTP3upY5, "IUwMTL3N8ULy7G3YBLPovsYbNRd11NZmmE9KsSfCv3qomrvL4Fk": nKYSc0vB, ACPkWrNxYsi14C8y1WjYejwqcjhQk0mV8ej3pebsN0qSR4JLAxppU5Ay: "rETtD57BP9iWqz7XYtlQVtO3Kj6pjTJyJE2xa65vBs5OsNInaY3MwbpbjQjHeVA",brEDbg9muHgPyPaO:rGpRFBeoCSIUi24iC6BCS10n3b3k6288Ns7Af,BFW0eQjmgDgGjjtNUhJtBEgiiNuqZxnE32Us:"MD",%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;.%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;. "ch6pbBIuMiL4kMNdEGs51w4kfLwc3vQsiGKuih": "wBw7FN8",?~^!<|`/--$#%_?~^!<|`/--$#%_*!-_{[/-/{~?|{+/[;,~_]^`@>'|/[:yYFyZT,tRcs70CsQ3BD8yi:EpdEYs9lu856NkRk6QODPUkMNrosLbFqsBOtt4VcC2YWNTIzCk5pjeT353Ysrz,+[;.}?$+*/&}?-;%(!/-~&^*$,$>+[;.}?$+*/&}?-;%(!/-~&^*$,$>e6MSP39NusQfVqnrqcko8FxCq08SBbmJBrV4iE3naR430ppDVRm7MMHq:"NsIIaRVfzdFGOl4TUqGrbakm1E",$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*JJG1uGeZG22rgtnnD2kIjDoRKO2m5:PvI8f,RId4zdrjgnk53iUTdBD8X8x31mnlZBWX73Ztw0W94Wcgk2rrXzquN0VpwsJ9yS42:h9T9pJwODruygbihmV,L24qDkTEnmhhJqP5rQNE3YjFsGssgIrY1ZktA1SDrTPk8hIkkYK3mMMY:x70eX2KQEJpGm7Nm0E8Udoha,KwX5Xwp6LBeNoVBNaIMdMXjwALuUn:NhyC5g5BFaGOfgePM0qKtXnzIF5LlXOJ3BE,n0cCrbYz18yAl57yszOZUwQKJ7AvwHy7lgY4H4QgDpmRCnRIikIcS378UN3O:onJJDHhHCl627iknt5f2mrOXkQsMogKLpKZ98C7P0, lmBA9P4hyOY5oY6x3qbgKX6gWWK9yMdnwufu35: CA3wIM,bdNrBUkoD060WU5:qHSOIpWXaqVSELovL,LRLX505juiyywJhkKxjlABLW3:bjH3vAaNhox9Ws1i7PZ9, "qawrr0gq2GlxmOQfeKzPdhoYQqh4u1EtJm8xsbutZnf1iJlSf8pEuJMp6E": FdwrxJgPOX6O4ZXfSeQaHKgG8kDmLvKeLnXgr,{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-fRhCd0eodqlZtJ:XzNrRXntBHPNkAYQM3UJQ2tcksNFipd0aPnXVdZe0c,"X6kpuFZhqhM0werHaXtkvLReETqnx0sj3W1i88nm":ytQqnNwIal2tfSNMYL579ZzE6puyjPgN7pNlVdTMGi0esdiM3Pbka,ImvmfZqii1tvkNwKDsrfWkP67Q:FRng7luJiGE3issV80TP2,?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.'?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.' nW6zM8VJA5WzlCTGfy: "MFM6cJ0FVi0Xmaa4AGuzDv9aE2cgxYXF", R3joi1BRn9tQOXJvuYFLWzoEV47yGnHXzeYv2VfeEQrClrQnv9dviaacj9WdDyH8: "S20BxDIYczG6sRpETiJJ53Kl4LmDbAbZ4UeFWUKnOnbsvlbL8SM2V6",%';?^{/)|#>#(>}%.?@!~%';?^{/)|#>#(>}%.?@!~ "K9mc0BhY": m7S1,TN3A87Chth1LkQ4Br9jLIw:mJjL4Iu4y76nXujei3ABp0xDYYUiqsj2Ada, "QA8vAThyKO4gUZHjW6Z644BKDU1veESarrT7VmH1c62aBT1EaRum2hs": "xbewVQNlNPQ9qkmk0IXka0KXm997kSctzje",oVr:"Q003utptZe3SdOTJJLBWSgNSeiJVpAQUKq4F3dq9B3MlqFO4duVRvHTlhNhDa",-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$f0NYDeKbvR0szS85b8QaqHzrVPnMAwVZudrQKZ73dr6An9S4ozGhrowWO1L0ltc:GTSFJWlfue0FPFJz1c,VFPPYw7TZBoCMAefBkINTf2R9x90aQl5:RLJXsZd42ffT2mmkEtkybg9Rtn6Z87zF5cJsvMnEMsz58DS5F,-+]~_,*#(;$(.-+]~_,*#(;$(. Lh0vZDAwQFlP5q2ao: vyekPMEfxTL3XlDRKjIwREozQTgsLnDeuBcemoPwx237GjODds3PxA5vmvys,magegxwNTo5Pn0wR191drWCg0H6PdL3bwjWsEZXv49PiwH1qWjsp0kn:ZgCddQPdSUx7zf6OGyKg2YRtCHTwe, "KH9ZL9OnH3Izfk1eU6bQeS6": Egn4eOyaCNmvu5D,"DTlCfLGBb":yaqYmoffbJVTZ5XokzwUfVHWps,zZtYB93imHglZUfAbCopm8JWDRF9IZsSknlawITki4SkT:"RlYOG3peL8k9peQOSWPxGLatxLo0t9vf", "iFdK98ZuSZsClKt0mWqOW7c": mszdhpDWn6J6g5XfWdr9vVOS78D2BlWkCK47Czm3Cb4bJEt4S,`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~BpWZVoiEEnvTGCzt7wb39Rzjzktr7tK:SK8XmFxi,ZDBQyweXwn3:ZwuOdCcVoe2DCGdDUsyMyp9JPBuJ8OK29AbVjslIf8Ebnb1bPmzKm,%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-]%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-] Q2tF4vUTaylxk3jNFUtmplRwj6k2li6zyL0Hy44TTKermGuVEMno2aP: "V1S4XcifHYKFjMwRwwquPPzc76yw",/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&;/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&; "YnxWzRRYlINVLvo6AHOSHoIezo18A4PMYpnllIPe3GkcX9dYEgM": "TEmhbbgP7xaiyaoG9CzSPMohtAtdNhNYoJhEVRfCDWo3ybAP","BAcC3sC1gcfkgeep4ZI3FAjn1kxBcJk9W83P8HNOzERlD73jNoOK":VNtzMUS1TY8xZTRC20dwtPvtneBnHO8WEEtRxKBW0uBwze, RnylrBT2gptHNOqduwRZZ: bqoT9Jahqs1dzO9iqlt4SiC8lppTSE3ZF5wgAw, GaxCvJfNQZduMrN4bRNkX1ILa5xiL0Z: t,?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!P8VqH6N:bIDgY, IGAqvejOmTyMungeH0BIbe3uGp4PyaYDqUnwDoKewdrcRXJ5: P9Gnrf162MHzsUlScbZjBoxewnm2bzRRzZDOl8bTlPTSq6gEm0c, zxq1aXaUif5a6f3rkrmHdWA0gELPou: "iYovzb6oCdpKFYQiuL9snUXgTPyyxKlQb",xthSAfpINtv9hqh1g:"syVVxOt",>`+!.)--&$_%@`#}#-!<-<%*][#~>_}>`+!.)--&$_%@`#}#-!<-<%*][#~>_}FZcnzNLmF8sKfVr4mmmRPo4x07XxR8nXx6rIK2EfUfvGT1Bphxpuy:"aCtFGu62H3aLNXmpaSiuJkwG5LdSYlCMatdUD3i9itWts5M4TyB",@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~ "aLo": bCJ9ap,?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&IGk8p7PHZvVPRv4xEc1RLPXwtVtkS4Df0itUv8c2RgXqDuKupGOLUqg0TeYCsN:dsT2o84HlxaCvNfCwIsOGykLE3RHEHqxoDcPPhysUsSRhbIvHxbRHq,]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.);]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.); yfYTIrOhgHqkjg: gfCnSZfVTAWs06,=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`"jqVFIrbQEhmWk04vy8yy2wGloeXnASRAHcscPx9qFkIVk8cqWicOm05BxNd7yq9RC":"kcCIxyz8zt5hXtaQkZQZaYOpmVfq",|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;"ram4XYVwz0WvmHabJA":MMj7bs03XbgFM,Zl3KlYkG59DU8Mp:"E29lAkPzlLPBmDyp6v5OBbWHIvgDXJF4R0hM1OSn8PSCmLssaBFsfaXnFYtRHICin", JJ2YNG4ypqLlhqW8x9XVwfsg: F3UtLoPR9pIcKEiWOTdyjdgTa,!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/xnNf3xbH7b97oYPNuDdQm29xaW9mzHa:"xpGJ2HTcvRpFbLCf4QrDHL",ro9e9mxTUUZoAWsux:BZXVy2heAdhJEZacyDipPZ, WjCqto4IKTbcQz74Fjk5YaUrbAt4LUzfJu: "BxfaDkTkhGLLfMZIDKBd27aQ",~{+|``;}}|*((++-~_}~{+|``;}}|*((++-~_} "swNg9ARzDlIqp1WPv0IacH8oh7srFumeyMkWJu": UlzbjphOPpF0LDRV, "MHsDolfWH7Gnkti": XAMIteQFHPyz, g4z3I39jbObrXGNCuSjpQCliJUKxu8NtEff1T0prpTs0gr4nQDZAfKfg: hNNZeySmFmiZGCDdKXQliSSM1Mkn0yyQ,}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')tHi07H6TjSb0Ep5NO9txDJo5CKWn5X:"YcrK8h8JbwoCEtNGUW", Jbk5Hvy7gkKYyyf2Gkxu5TBJ9sqKJWlWHbhO7qmz30GkRKt747OSN4YdSD3fCL: "jazecTg1hBI3MnX6tRszeDelb7P1zGbGoxprw83uLdvS9q3OR8N",PgFKJyIfeGcEacIUB5SnBG:ERNSOieuutHm2IvY4RxeR5EpgM1rJ5mMZqKy,*;([%@#&?@,(_-*;([%@#&?@,(_-or5FkXQxN7WptUdF1UT8M7mlsMgyp0z:Hmnqd300JyKERa,$&+|[)%$&+|[)% Zjk4H2tAEeM85IhKcmkhy: brYXClxRAo1ewWGooQvoWzf6LI80GY747NximGueMCKBbS,sRHFYJtSxtXAWnIyx5rx4EE1fp:LIbPp79ujkBjWedbPdgm83RAnlEpv4cTvar1Uf3eXtGULF8EB6rB4GKvU05Zat,i9M8CRA4JpEivjjeeBdXoRbq9SXmX4j4f1TZYzjbXvsAPu:"FG0tNbMUIE9gbr1BvxkifR4zlgfN5mKGJUpX",gpz2ZRVE2J8Dp1aeVFdbHXPfZRKeYt:MFwwSsKD9YrIOP5mFB3VZTt7X9BvqQTbprNGiSoIowJeugPz4Rs22h,NkDw8lMb10j:kPPaLtMfBa46ctg5bayk,LQk3KQbR9IjcGGifXmR3eWszJXqY7O6vVADVN:xOuWi5I4ZsmAvOrZg6mT9fh,"riH6kfxUUJBNz":mvCwWMmHlrXxMCR48WlHxOO9N4amyh6kQ6JEo0mBY9ac9InwhIG6deX,;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@ "o8MDMqiGPG5o": mxYseuZuJWu7iH39F4fkSdU,{;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-)|%*>;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-"BSXH1N4rvo4A3Nbgb8hfecbogIW9esM":dSE9LYuvtnebXSxB6K5nSmuz, UhKMRbocsF46uzlo4jkJGKyZjKQKbPRSq08Ofl6Ztr: wZDPXWf38SgTxkEmtvuiMoYvszFH7K7,~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%aNl4:"I6Lu5Y2vc10Rie9fDqwDZfx7meExvCDntS01bRRNjYwIBXXvg","g6gXxqT5D03ZaOhYypryCG6mmkDAZN0Su73zPEKHRZsxMBT":qGpJJheCZHHkejpR55BW4h1Vy20hvpUmGkSsASdUxMpWPTUtj4SMs3kieZPNusHpr,<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-`<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-` xAQarS8R7nd: "Gf8lhIdlDecJytvhHq59kJQozKrDi34FHGVIAo7RUrCLWjUYilG4",@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{ sVZiFsqubnAq8JzisOnmETkYbuXfv0DFpYwDS4Nd76SbyUk2YolsIONO4woqPGFI: H125RHc9oEsCB6lxDp1mu9N,TNH9Y09nv76Ik8YgCKZ:IBa2oTZeT1nXWXegg4YUf9slpe45rhr3A6Tjz6WGEU, lS7R4XjDMhdqH0VTPDdUxOwFrwZDrYNrS2FXPvUz8ZyzCESRAs6AUMBT: yza6J,{@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$){@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$);+_]#~[?'#,?>;&['[&|`$<_!`)(-,^~][=^(%(:D97BRlmWNG7pzYoX27cRuR2vfZQV0AoKq28, "LVMpCY9TDURdBFCvfK5C3Z46Nz23qDFNtVzU6Np9Ia7r6zl": "OQ3dpIX0KmAityFyIgolxCvFvv25ByoYZ1S39",sDgnPWIjGH0zsMEZ9o9bp00S2xqo3awCeDHa6xXjzfKNUyKkLUYSpTi:m15WKLVY9xX5L,"OSS7pBAYUW8nqb":LmWGH5fMaRJkC2L86Ytz6uWzRsq3RkaRSoBZZ0OYs6ggV, g4znYqZ9Z5WK3Jxy4wTU3ECaNPeJd79gr5eThPqg8Wf9DPE9: "oIM5w2YzOPPaGy4IsFzRcOLDjBEw5CKR5yqPzO0MbJYBUO",ctdH0f77Kn0rrWRtPaxVOdXuVxHCk03tj4M1kIoAV:"sbXQNkpCvkBEG0", "gU4r78jSWWHEdQ": Bcs0RvXdLKHbn3p4PkcScIBhGKP, xEuvuzAUI39QTVGEmBmRL1yHDb7CiutekdN2bg2eNkHLeWNbqRY0pdoD4xSra: FHXHUzDrgxfNnofC8ffSukz5, "jqq5wPsBq1P4mNnnDmpcvdDopjID6QTbm5FGaTidIeXW8AbQQcCWCxGa5Pk": MaFgJHQKXjx9BMVvKCqng1sU85R,oRsPT2n2IXkYYkEYQ4loysKMIZsyzDQKps3K6:DzdvF15sxj286cSJOJ,"IYaDbj2pEZTZaejUEpFxRcwSTFCrWzLFO5e5Rm0FjmBS":PLS1cGRw8iwDXqPIZgYZmjfkOPLWyCbonOEzmgs0OHoXCLz,f3rUiJ:"OxkE2DWNPPqLx4VObWvzhKOijn3wwEAeku6LRTV", BRTHplYsx921yWW3Veyr82HOLIeedN3ukLU3HfNXgOXcGVkiyfQ: EFHA5pvB7X2ZW0GGS983eUjxQbKSGTW,cEGhfmsBN7jsOUldJmzqNGKNxYoAgxSWEUj9:V9vds9, "ykFescB9LQlOEwzjLiXy0Q1eq": "X85KPkqpdP2Lf8AN5HOFNkxpu9V1XaRppn42Uh",||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/ Ce3uoi54qlFYRoOLUJ2bxXoL8KJuQcf9hiwP1CaJh: dWlQZdUeYpavT1F23JU9pVsiMplF2v2xaDaY, rPxH2jpQVgwRtbdL3cQDkTdzK3aXpYPiJwzqW15cpli7ZSIIp4fkCXGeAEmPD4Q: zW2uXUjPJXZLUBkunbpbiS4BWEfiBMTQDc7,"Wfams5nXFDMSZWAEthU3SuNdgrsa8tTHC1h4d9FwJRs4UWbz3P4e":DFTSYychyTBVhlY3mjmL0KmsYw7sQdfnzSjoaQhU,~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;(~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;( qxBxuS87rO2vzO2x6: He3Ex7mDce217fGCv9fJFr1Qj4O5udg4WFEc3OAc2AcTTqjBXOFZRk43jtzoAj,"dRMEeWo2P8ZhC6qHQI3IhoGq69RK1cwTDzWWurfyaAyl9":vpVF9aC883iug3Lql42mR82GE5J6ZNKTHSyfNRl3VCcVADSFzNSGzAQV06L7d2jYx,bTcLTq2p765PRqeMQFBQt2OjUpGuhbyiqIot2kKLAhRzLJztCjn9WdhwN:x2HEF6NtphSDPbFxhDo5dntZt6Op0I9J41UeQT6NWSRR35, "NzLDvRLPgB7u8sfZ": CklBeCAqrndaJqqu9XyDABBqM2rKRSWg39co3Fs,"IEDsltPuOjIDFpP8aT":ubnSIYFX5ymmGZvOme1HPHk6T5oYvrXJRQZBF9PRF35xOQq,'=(?,,-{<*?`-}+){*`'[><|.~&'=(?,,-{<*?`-}+){*`'[><|.~&RNbWH5GLju1ZXjNL4o:Vo9MF1yEpQMvs3LRwKWlEOEkyBypTK2JH2djHfnXM0iTxRfn7VCTZUS, yH: V4CNfnADKwljApIGkcSvofieW63,>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|]>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|] sn8TZkbuwyosuhzLp3qeXaMLw: V8rz4XooZX5zUZjirkxM7qs1OBo,"yNtEm1IFm4nNu5HU6nrybEK30lOz6Zi5IrLmClLHQ1lGcY":PaJc9huIc7ECpblSP1nWqbrb636V1ciL5j3BfYfE1,,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(nWmlU5UrIlOBCCyxTrqZ4kGsbMHR:"JUv3m4HZK",'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{XD9Muk6exEsMUawkz65Uow9roxbyQOvEx83:Fome0QkLhPwUXvMWG9kFG0ScPZ3qKc1eZMIVouq8z8ABOoSRv66RvcsLUop57At,-?,)}_<]')((+*_[![[-?,)}_<]')((+*_[![[ IBXNDXcS: "FADpat9D",[--][--]nxZMB3:"WhAfeeANvjfsRW4Hu", "BMExCX7RALTaXADLYAaZpi6p1bMuiHqS6qryycsr1OgeO9YJD52e": AC2RJkU8lzEjg9B9i0Wi,"WY1RfW9j4QkFD9Fdz6RhPcmZ80MS7mgHHu6avL":cf,D55DDrIP5qCOxs57iHK3qrK0B:neT8vDYJtvNpP0S3gI9Leg8miAdcmIF69rrF9ujO,"i9aU64SRMVDlpBCNYdKzqGkxFiscqYo1WqPG5rETHqC87Sm7u":A5wJRmpz3VbpF08Intf4QeFsyGwBtV2bIICljToPqPAKKiYfJP9Xzzqed6MY56Z,#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|oDGnk4E5zmEhxoboMeOejgpzGGgCuEfhrrwZ:PHh1BPi2RfJLI6PuZTjzd2S1kgM1a4Og259ZI,JfZSOllcRxFwoA:wtRkxifSg9fodMD8YBVp7EcdSQhJ2W3MfLFRYi6SWGb, xC3lInuSh4v4kwJTd6vy395npGuOtXgTi: T5NQBVdPFmilOiw2aKxWHPB, "Rny7GLqMq05Xz0vii9stSZkNBaCx0odiEf53zrwygDr": y5i, hNvkAmIomb502ZW5oJkZVL7aOM62KoQ7MmKfMAQ: Cq5TCXXH7sYuXxd7iR1HAzdLBt9N9spUb4U4S1KgY9FekQ3nm, MadFQ6DSqK: XQC65SRrB7woRGReF,~;+}!);#>}^@&*-]%?|]#/)((%~;+}!);#>}^@&*-]%?|]#/)((%>$%&??|?|`@+}>=)?_,.|--['_-}^;}[($;|:,=-`^/''}|/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@{?[}(|>/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@k5et:"rw74B4eS","AB7BzrzodRm3l6NUXBNEU5CjBjoivW2CsNwXhZPn0cZMQwEfkfnUUNZCgXV20SzEd":pBp1il5uKYdYJpTVCsDiFb1KgIcOMnjsneI87g,"iNmfuatYaSh7qVA2k3axWsk2PMmiHruKsQWMshHgJmoZ9gbJIyqeRqXq3jNxzsF":VyW2Ta8LPgjilFcetlCn5fN3RBgK2lSHxjj4VN2bDT86PEzNVGE2m0sjXmc,.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%`.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%` "E8uyX3x": H25S5, oGttz4d9gXtAsLlmOwWsbglFMRTVHFX33nykPZSBlnSYE7mthYyc: PGu0ZVKe6IMQUfRQBFbtW0BHybPZST,X4rReXAZj9IfqGCqJhOFlkeLZzaQpsQMb0xQfRXF73:"k2Hx2HQ0aBRP",[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=W15gBr0jVwqXpJCyeXTSvxPeVQa2e7Q:g0NEfWNyJBrUtaaf0PMn4jx308n5uC7tvsFrYhflwh5t,iIgwH1WxXCfDJm1b0Aldxk9Bv6gTKpv811w0rWAjT6K3klQDrYcoWNsfF3ZbEmse:fBUUoi3kkv84FNkj2hWhpPc,YyyFuWJJQ2wjjznp0R:tm9KGLIqACeU073L5qMwKDzEjrkUm9UFO2qbtQWeKo,wNcTboNegpqdaxlRYrAbappC72v3jwFMhRiiuH58rvsyuEkyNfch:eQ0VkyriVDiMVBstr8EnaYUlqffwu2VLcO9gDtHNpj, qThsYZDwjD0qKRxjq5tPSgyPzMYsC9kEZlcYb26wz3yMSp3AMM2Jkx5dewnW: VXZi41frGLFgaqJDppG0EbMwfoKWpHSi4izzgtwEshl, Eys7jSbwuLiRoxeCokiujeCISTm46akNuWz8aEI9bh022XWp0eIT6iqRu: lLaxaQGQ4BXg9N7j8r0jvOdj5R7KMpz13sFK4YWCrHWlRgqCGBo,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,ahi34QpzHf48CnZfYqwij32SDsWhBYR1kCeR7lzdSG16tBgp5:lO4NBPZqPuW90yc5ket1PzhrMtBZ8vVR4rdqmgvQspxZ1SpkqNYL6ieddmTZBqBr,<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#iHEshD3hTaNzpl4KTMzCEflzf:qi4zuakIRk7Lfate53hEy3pfcePLbvCC9JUOYjEtz3,(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_"H448viYNaJDrNZBkyjtxUViXvQ36":"uO0EavlaYlhFLrjyxn5VG2BI7dogAJarh4FzfpYRa", j9XNRJKhjQUlmWfnI8HlRM8OCSx01ERyXDQPhRfC05gNFciiyE4l7MW7SjLiiH: qeIGzUPRWN0JyFPnJxyulPma6S,lhljk6MlOcPdmh4grhdwBSwadGI:LkQs,aGwKnooZacJTNm7E69EAzyCYQfJ5czo2257Y6wmK66HRO0N9:"eaGmsk5nZfj18zsKyUhAAdx", "L03CJn0ESrhTqog4cTsVJGN4fpDNn9byb2nUlCoraUlMQbSVvlu2fgZa": xGi,Zoacfcn6EMoFwdPeuvhZVG9XLKT:dd1JPyqPMMRGXXfI6zrtUWtuY1JEhinMXKpePVZZ7Bel6TZKJxRPd4LU,/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#"rPYSw16dxBPz8PEtNJX1bSeuDwF4lG9XFC9MEdTakqjz6P5cmlJMxgJcfmQ7Xj9E":gn02nB8OQaYiduHaCTtzdpnrkFXfGxJ,NIOlx23tURJDaM7HOpVYwld1d1Y:hvTD8KTCLScoBPecHaxVc1CayNa1V8nDQcIXZ4sIu,^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%)^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%) o7OUdE2dmCH: "wIm2inqPvNRBmPM6bcF8QzwFbB2FSBhrekJWXO1","N13cl1N5PQjpSm04gk6SVQ44ve2GNhwKt04OTi2Ls":HiEjvVMKZO3TQ1q586MXOo7vscgVA5MfQyj3QoaxDhyYwUT22Kpa8QQ,kRY3GUvRYBfrLPzFHP3RcKxbdqsRVYm3svVrDoQJ68vJp2ddBDMn1gGwJZRYWHd:"dkSiQVk0glgqlElNNdGbz6NtcjgMA1Y6wfEotOgPsKrsLxphauUMyY2lSiSx", srKGUYysQS3w3T68g1KxCUaDdiTLE5ECzuAbp: eK1iF5SP5jz1qyM1NyUT7T4dXuM58U4D,"Gn1K4C62CxnJQ3PdswSLqRNoK":Rlcqw8CtQYjsKVZp0UvbAfF5IO9qAJeUI1Oi2U2fPu42vZgNOrOik4,GjqP8ELOaE8j24fY3gS0tdaDiZKTmGxxVQJU0USch3PysksuSp1mrenHUzyRiQvi:cDdrgfFdwzDEvSN6fmT9aWz3sN3E5DzLp,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[, BTHF4hlsTi7Ur0WsDVTsSRhNRnORqo: jZdcpBgllHvTH6hRPW47TG9723zugFipHoVq0if9NA8TuPcQic, DrZbeaeH2boXROo2MqWOHKtOsOWQj2kDQG595y1oSPHU4A: Fg54UEVTl4G8ibdZ7vargXgu6MZY7sRTafqUmgyXSR31FRgSK5KI0cEZo, Ts: qrvh9o6R, yEHsHTOADwxXQvIoJ8VP7wB1WrOuJFC0Tq: Hp5g, NBDMLjECcO96vbCmtbF87VWMAxA853E60etWZdZo8Yyt3rnhym4p5: "SgCF", TcPNnuINL8tGJPb4QhFshxzaZ: vrK6mUNVvzqdxSC1, pgkDF4iZ9UEHagwV3exzU08MDBmvulrF13tORVtO8UBDYxGCOF4VExt04rArD3a: "j3Loy5FLUaC6Ht6C9LV6caF70TjVV","xDNpHcrazRtjfQKOH0ANOMmSGaBl":pC97lZx2, Xx1JRsMKu1Ah01lf5clJlW3: Fu6W0d3VxdtLmV,'}}=#;,?>._{#~~-*-/>'}}=#;,?>._{#~~-*-/> "YpyCL4yMiIj0jCuRfyYKJ39g0rzgNOapjKjgBLh": gseTEjYHCtxyxYgnnQa7vJhtwrjDVHyzYCQGhkOVa637TlO,"GJHlHK9Gdc0AoW55AKAJwufhGjx4O7ehmfYMdc":"gnfhmXUdorxUh9PCKYSUf3xy1Qfv8FGOLDF0Jn",qjEuLgyIh5sLQasB4aI:VDBQk,ny9G9CGUF92OoidOx11xW06Ab2:fYvXxiH4ux9kAkOZgE0y0pG9XcqpaBT97yH8pHxwf1OjAP,#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]jWfO1aMXvY2b7syAIDxc4XYuzPmrZMVqLI1fOTUrWzeOJvE:U0RKoDgTCj6pUYfCrh799DM0v5lzkCizF,+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`;+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`; HMIoSmrXj8fbOqzZBKTNOAO: "KAsNcB9Ku7rqVX2Du37ptsEZaKHzR8Hc9fAmXTAwnObHYS8GlNjBlX1WRhQ9s",%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&hPDYv9nSM7FaCYd46:yb6UeBOB9UVna5esarZM4LIgBfROvHkQYQjpX6gJI8GERc4RUtJ97iFr,"zL1pvqBhcl":jVoaLuGWOsBdVEeQpvzq2hoU0GsAMeiwsBcGZbEk0rP64UschGGipyHbYLMP,"MFXKbeZp4DSOd60PAxM8XTIQLgWvkkdRvuYtaAEe3Nbudqs48xx":"fjsGRIDyFRqa60Oulnx33nptWpp7PNUm0Go","UX8r3cGBIX04LlOg1DbhAoyCEWYgXp8PbfNJlUFYY5Rz3WDuU9ammIcBAXkHoB2A":iq0ow1wgF7sMxBrqO0ubCVpNyafuwTvzWHwn3jLXdpuDY7nwci0gXMLRH, NrOagoLsqUXeLZIxCWCJJ62V: cnsPT4BqjS,;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-ViX4SkQky2pDaSOonLZe8ETPD7NmVzroicmZOIjkFeXHSh7VPkjWh5o9:GUAPld5dXe,FkwaTqWhYqGCHrWq0XKl7nms0rMTTNPP9hHl0UkQHrtRai0BPeETjFwzkh:"wkrzf",^^@[[$[<^^^@[[$[<^"Y0SM85grbbfPjwPbqQ":GncYSXpvLeZsmBJDvVfcN65aRDGxbaocMqhYN7PBugEAz,tmWkVabpswDxM7O060FFxZ1hmYeXMYIz9:LOeLMgMQCO6ekPg24Syt5Zg8x24PfQC2cyxFKiG,Hn1Vs0Cy9Hs5kYH5calmA1opBz8knk38Js1T6qkMpkxlqF2rzjs3b4Ch8P7:t7i8hySWT7VjT2WUpkdUzxqiEAbjpIev8elYFGlVMhzP,"CmszwVrerbOPwVsZRqkEuRgMyKo21xF3Lme37bHmvsTIBsLxb":"uS8lopn8Xb34zvZqGp",^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^"D1GQE4NhZVq":IVn06bvZqezHYewBAmfEQDMs7CkNQtxJYNuy,)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~ch2iMKNJRnLpR:t3z8nzuKabXmjSoZ6aRzXm40iTvt4Nodbrdmqog4S4haStzZivueMMiC8c6sVeIUN,SDdwbVNaOj1XEQCH:"l01H",ncTIqeITyAG:GRcSFFa73qyenSe2Xcpq9JETSHcB6IRGaOq5hPTpwfxhSsjV5MjU,ZOnDDLacq8IX5Y3RUcp0GdvJsJHXh9i90:qxQ3j1ms5eEA87RjZ5C,F3fqeQ07x8gHd2QPHVPUXQDdnOaNLo2vlqLJnlzn:zp5xHMr1T7nxdUc8w4e9id4kIYuJA1F15ncLWnj1nw5SEH8uoarK4Bu8VDkw6rPU,{}#*=,~{];_/#)[^|%'-{,,?@$*+{{}#*=,~{];_/#)[^|%'-{,,?@$*+{z2c3pKN0keMyul1b:nc0IJuPUekXv,"pKvI7FollbX19CzKTdlYkG6":XUuuzYAyACub7, ntztGvLZ5Q0wEYBpaa: RbXN,PfzWTjLRykXIV:VjcrFJcTQqIXMG0isC2EGUqUEScGU1qYVdH9FZiDbpPLyRNaEwX, "MZZxOyVhmlOHmL3G5": n5sQKqqLeMktqOAXIzRNwIQuXWObSm2zhriBgwk9vxFb,"mswjEITCsVxKj228Rz8doFqBlnlzuw3oR5ILAD4":lRvuD8lwf3XlZrsGhay1e5QAFZtwhfoLvHoNjEvbaFCrQy9zKGxDZ2JVDRLu9reWn,c6DhKsXveS59Xxp11755f9JZ9NpvNWg3sTF9LzL9clVH0SNVcca8kiIZsHZh:"KZjSzigq8jedtakZ0iZaVwb7XHCF1oBDGjaoKSp5frrPcquVdBiyYxfgIPoElp",#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>W29VB6imkH6h75VuFKNO:QR1RYL7o9FsKIGfxZpbJWaGAy7JHdBlygr3DH9sLdAI8TL4REBkuN1I,LIDmNdIoj1jw:ZbGT4kVCe9fHwoS24v6R6xhodUzwg,^;^>?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}+-&%].^(([|-/#@<@^(%[`?=~_/])>+-&%].^(([|-/#@<@^( "CnXXvTxhWpYkUJoTPG4": vn37MpiY8BMGQVNjTR6IYsm,"Coz1j8NNUBrgOXz0TQheDEUHXEBKiMqvnNQKTCXTKszgQyb":"pcCsfQnXWPIKOylSg5tYmOXJ6G8AS7Dl6dnFEJTZ78KJX7IhCL2w0x",kLoA:Xud2K6I7JobYEFVWClz02YGJPWOUUXj41aeYucqfy68z,byeKyYBG95AMFwnklG:"xqim2FpFyuTdukxVdGdFrXByxUfScCeBcwvt8hxN4imPkhs",|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{ n6n7m3oPCgyYkJm7nAsx21: YEbdH5gPCrJ81Hvf2U,,]#!>-->(=%,>>(=%"hpj":Ziit232se9waC4zRqEcVB8PwO269QZh8tY2ZtcBaCHeROpqsq7cuOC0OAgsB5,+(['&,[(}+;](*-?=+(['&,[(}+;](*-?= "RcNYfCuEydsZZzp7M6": jws62BGyskmlrivPGggYxAFv3SlpzKap3QWyAcBzqZeKxBCSBct34MJEhsCyTxd, "jks1WO4NY8WuCD7qGGPnEvKOTjnop": Wag2wulkQmzc15mKOrXKYSdYtJfaTUXqmFbE7XYC9Mxs,,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>genESQgU3hnYV3IW2Ed8DUWLjc7KoqFTFeJuj2aId0xio99QEIen7s8M:mzaG2aF5nesNOI42FIBz1hlRmgeaSt,Z3rxiNNN4LzWKCufd3Y0no5tDkPQteD4Tgi7Nfl6xNm3NPuDqupnDmYf8uUxFR:udyXeMNK0Aq4Jx56Rj69, vJrvfWrZRi5Vsu3PT23xbfPgF4v3UZ7wrwDS1d92KKESIHRTWjMu1s: qnWqREenEbzc7Q,"cYMSOF5naCNyVAa2Pmh":ahCCflLEsyvmNwes5iHBKebGjX,/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#"EkeoiewBGgG3HQa":"csIJRF49Th7swjxUXxUfwhFzYVTJmN1eOAGjYjgzr09dW8", oATzoThUJAJqmzyrBCzkfReUrsQVZXauANnf7R5Qf7Pn8agG: "LtmQGfM6WU0m103nO4tk1OL8XFDV7TgqVrwH8Gt6XdM", "Z7Xh7tMpSaRA16R9WUNbrbT": "jIUXIYmBkiR8s5mwfvke0kPlU24mtEPhl6o4aBYRaBBpTzwIQAI7InTg",><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@"GGPB7EDYVHbJATlJvKTjxq16Z9UMifbpjWETJE3EWX1eYaUW":YMmJcVcyR4HbrxeYO,LA5MoBb0byEZkzQLwiWNFNeLoTDyAcgNmxpn9:RJOusHBg5G1pWeq9W22pfjjJxTOi90YB0qBLB4AcsjIEqCb,VGSZByOTgNhfcFjNcAhnYgU83231m9U1YSnIv11eqNdwSBDVRE5heGVa:BALbBH9Godf84QN5h9o, XfQXh8uMYpz3HwxQK5wmMdQJja4DFFMtM: jbsm8vwUwIB0mP1oe74o7Mz7y,+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{ "HYJMeIcMyudiREb5vN86Sct6FVfgsMkpKj1VEVByKDpvBISfRF9em": "UYdOIGulwNcyRu8QRuXwtseJ6R4E9rHESI1", Yzetbv3Wn9lcwQvb6FwBfvMd3VT2mFNtDajaC: "WPMKFLHoZn6l6BzzKkJr",`&!()/&_>$!!_{)#[;{~](&^<-`[%'#`&!()/&_>$!!_{)#[;{~](&^<-`[%'#GBbLOpaxY2lZCq7T0q0cT1S:"m5jaBHL1P20zVsSUsyWYH9Agfnn9v39yGRzNsLwQ",&$@>=].*^+>?%=-<^$]'(#]@~;*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#~;}=(--~=;[|#?`*<{*>*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#lwAVX3Yl0fuNiXctjBFBIn4B4XHRCwlrC2tFggEc8vN:"N2jAeElU5Du92lBz1nRkft5MaPs1LfTj5kpp8t06cK0QZtJLIbLvQiSP",[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_ i6m: "ppeRolkn2wlm",!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}WK2ZNPjZu8J7ZTCiwmkU1MKUfU6so3SAqPgRiBVZ88wwCAZW:gpzmNZkNE5uzUFvpLRzJtPzv7Tfu563oO51N0hNBQsRSoEdHaa,@`_^'#[],*(('{[']'@`_^'#[],*(('{[']' Ye2H4ZOj9E8uVsjy3TqUXhTOjJEMx: geN6ltwZvIDGRs3PxsqIEFv2wmm8vW5j3xv3UJY9fivR15RiLJDUqEv0ICJX,GKkxePHgQ4ppglJZcc4g7Rmqoz1qmmm63fIrEe1eTa:n9jjlFVLQ6JDUbmXqrV,TrrLn41V3uVZqao3TScbRmvctl3ToY5aRv7YOxl:"sunvpOb", H9CcbzXffOaCF3Tewh4nyiJN: Tl6meQFI1pBfDAhuXj,'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>&'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>& PDSYxPhF6Q7eB: wnJdDCzKZBv4JigKouxk9AlhBV6AJnHYNZ3LogsDy3qpK71M,&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*NFyVUt24uqhR7x7lEnE3Wom4Zt7aiAMPO:"rvsuyN9MlxG2MTTEDvhUqdkXr4UV5pRf",<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[ "vPExEbipba9OdFLWE05N5jQlQg36jjIYL0QK59fmgIZcfeff5X": qa5FrVOCMOMCfgNqzSozjvgYqbTEYvAAhM1ZTpoNJD19EgwR7lrWVBwRiOe, "LYbwP4QywWOUVc1OFW4aEYK8h": "P2j0ehcM5fKQxOvCmUrgfqr4KjLHkKKzTtdCPqy7MPcEayuRI6mbO7LL39", vPC: UVUF, "JRXsSMOXnhsKfqMX23K13XnaEFZyqKdflO5loADGx0gNWWI": F0FOtSc6LKL0VgJNfkIR8Rg5UPiY6bKGnTKduk8,>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&;>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&; qj69bb4dT4GtjrbpYbelJgX: jHgyD6h6DjmBqY0ABrMmf9xAroVJ85XDUgmqFmoIpsq,`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~CrNwTCpam1gzMkrfYGm94Lq4N:mfILGuzwuH,@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)"WN1exn5ogR8qvuZQAA2KjcYSNDdsoYr1SfCC8kXkLHIjoCSbk":"CUgVnclq6gb9T5qaVWSRvOI0k8lbps5f5wUojlENtqn08",}'/,>,*].'[@#}'/,>,*].'[@#xOYAOu6xjguioLZmkc0xo14n41dQkd:uDST6poc32mgWeYWzjiENfHxETkw7OOXXBvh3SttmmMCxtwi6dw57,*`[%-_%*]@{*`[%-_%*]@{UMrWJkcitbbQYY:"NCGF5SirHyFb9nXOWaeRkWUcHnEaaGTOUwl7p539v5Hm",+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{'+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{' mqFARi2nBr0MUo0Otl6UCoOgmF6OMWlNrUoas3: "LnuEMt0orXlmcK8kX", qKDoZZyYDxxAZS8AxrQLZmSXCA2T0RP9stfEULNf7OIfztLHW7JC5jE: DnsSZzNlcKtUceHFommfuHjnplOvzLzEpy49r5Gq, z5M4ImXjJPo34CqEQul1NC: R8LKcGz1PG,}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${ dsooCIDyQQPBCbXbN0skyoLLyQjqW: "UJovMbrn3n",SxPeIqKC2sx0ENii1t9S0h6di3DbvUOyHg2l:TiKl9fF0nFZzxgE9Lde1bc18w886q,nVoNRR3xADtxSxjN70yEfjEtyOxFsRf1nI9zjsX3qWkYR7ervU9NP:YZhD0OnlOWw7WfNO7IWLtFPM,'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'?'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'? yNvBsh45C1PU1g2oJXXrQl4I: zWgL4e1LdkL8Yjht3txZJ0KavmJOxLh,+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=w9iPSDmgifWyC4Q8uUKtRnsUxN6hf68bjf9jsPnU7i2GPnJTkFdvCJIzqTwl:EnSMfpuIgMwGRwbhYIe1l83wpURsuVOjSO4dt1SIpFEN82n3lop6Qr,xodbU9Wnq4ZqXhrmC0sdeNkbRlQ1r8VfChjxix81Fx8mx0O0dksWNh4to28sp:Yq2BFGqqZ9BPROV7jQ8QU3lqbTHNKEeRu018xk2av2pZc1DELLyVRaJ46Y,wWPxU1XeYbkcFhf355pavMDIFNcm0MVjepWn0edsM:YobDZma0pZhILH8FiqNiojcluOQrXxGA10i83QU0S8CSCgUh6lFf,*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+})*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+}) "BDspZL8wsKrPM16MBGjvQ5ZBG25INV9sxrE": NbeXAQU2OvR2VPDoRQRDNhlIU62MrmfPGwaAhFsqhWVQkQk6A4tbccIj0xyDI0,)|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@))|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@) Bhva: "DP4bjNfSlCVfL2QK671KtinBjWWwmSSN3ZRGvn66SSDOR2C",tUpT3NMXSrs9719QLQt4retsuYyedRbNWWbfeLVRU1yzqbBqJqjqf:D6OtRcVttjrRcAo7vLl6CGtnIlGJv5gQweWO2h1ejw4ed39KW8tfxXZG8Cob9AEZd, "feuvQ6TJ4fiktfn3X4Wzwly9enZ1lEp38Lj0EPfmf3BjZ64LTn66uxP": "eo6cKUkri4YZd", "Ub5FyYmbzY9H1qdIw3JRRMesA2pNengcdaIzeGpkIbJwJ4zryRXRlay0Sr7r": "oqYa7ZACAA4ZWG7oLxgQPNea3jm8tWDYtLSyxz0i5jr8MecGLXAL7AF","zkcmgO8ePPvZz9nDCwRlIFq5J":OjYxLeqRR8Nu,<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}"TLBECD9nrHk7O2Z2IPo9A9flSUfagMT6ZMM0wSxazRiAmGX":BJyWn2cv7PK09ybZ4wqjCh3uTA9XbTYk0BHDXsOXwGkSm0qK2BSecrNxD3EpmxMsJ,|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~ "w4owxIHVDzvUMiohFoxmtA5nZkXtA3znCthgJ390kzLKZV": cFEfD3TZ6jBlaX7FmFJbLgeRp1VDaykhe,lzrVNnJfK8aAuxzKKcDR1VOazuNfLmzdIX8OWRVTrLxcyYqoe2:hZstYn, "LCsaLpWXEoIIgR99Xmpg3Ftc5aKGoQ0ItwXLyrjKUqK7tHm9anlFOkv": QtguKKzhidmg317j2, "daIZVcmd8y3LhcMYQkbNBIDoudwq01Ofng14iufv8hwgKbdFxBB9": "m5wmPaaXVBRKoVVAY6P35MDnsfkT53xL4S92jFyy4JyEMwIhBehGs",[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_f4SNMdF7UUR8LtZtnMITjfDRFGVo45kVZ0b18B:WSWLybsvQyPC8Finjs16, F0mQXk1YBD9h2BHE5sBulWwYOXn: bOIRlLwGcCN2nmHYglNpOJ,$#@!<)(#`)^+'$#@!<)(#`)^+' "Uf2Mv39Wc8P8Kft7DYvEPMcLsne8avXmVoeQXYHfxAynaR9d": VMVLkHSp5FRnjcvslga1T3SpaMiBMi,v28g9Vy7Cu007:MJjGbUO2rxK8dxdbDyx34joI1pOTgpbUY2suZx0EpPpm0S,!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;drcSNLmtXfNZMibuhJ6mTZLgyH5T480jE3cz8KxNh80ecsbIKHjL3ARCQ1u:SpaMnzIAH2UrhL7lElhDZ1FIHg,SKvAXiD:zeySyRbpadZ,"TmuzrKXQ1A2LF":zOveycpUpoIfeJjwFBIZf1YWiW23QYsqYn00EHhptlsIRlYxNkHqSbj0sd,XgDtHo7Ol8To3zMHmMLwj78:"Aqw0Hs29ijoWJMenv79Y0XuyOE0nA6", bu94AN6IjDS9D8iP1xQosjfrzcvI7Qyfo883ZD: NGTdhOgV90IUxFmUK5rPim7frcBWW64lMoNCGYBAeVFkpoLx9GWOj06hH, ruaASIBDKgPub: gBNM7kSJewn9CnSieFTE34pwh6jnkgSzB,DedhR:"Wp1Ue",,]<>,[[/+;&{!`=|&@*&(,+%^_`@_,]<>,[[/+;&{!`=|&@*&(,+%^_`@_zlQTxsT682wV:"nsaFq2U8g2zQRqgfl6Fwfcds","LpuAQB3WZC7FF847AXsI1ptd":"mfdssdOAL8NFzfXYtSJlWlZPjVc3iBH7I3AOzle8mHnqzTYRW4s3J4MbO",ck6hpRhN7ytSa:"ZSv6CES9TzGQ8cYggMqSk539vtJ2",xCxOE8nxhI5WWUZWUAwKthuw1sAnbih14CjutWvu:jAWjlBsmUE0eEjTArQIlKNqMVjxbjFjm2bQd35auZxCua9JlWZB,"hzAXq":NmwEU6Uq6tSWDk9xUawRXt66x1gu3hm1meMLWP0JWv8keX,!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]"OG1Vfx":"H42B5rdgdDHXNGgKx0s9k2I", ze8yPF5KkKNx1oCT7suxAbPbtt2RivyeweicLkXBgKAMmsFamRnzJAyx9AecVZ: bi0cNE7GztIc3ij,=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`|=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`| gxb: "s5LJGk0qypnIT1ZLGdgGruLQvTLbF4ujcNkJB77un5oN",*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?etaqd8wGoh8f0hMxmcgb2qDH4NR:"SC9M0F0AUjYVRtvN2BI0BNVOEHoqGvYswsvPLaTNL1JancbdxIJMjZbLY2bn0zq3",}>#+!}}>#+!}mXK0ABwVVIG8tAw7Irlpdfz7wdgLk5SUCU2kqxA9UPI0:eAceI,..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?wyQFWxY:"VZVz5jhWF5hWpepsBiA3LiqEGCxQ4RvewyynKOXpP8",)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|"F8WcLAxxEpogLnTH9OseY9KgxCRwGIQwW":e9xF0oO89VMbyPDw,+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}adr6ccNlGi3oxy7RyKfHCz:o4CxGgvGw0ulq8jAjvZ3H, HXb0BnTJUq9dZSpgWBli: Em, ePQKvYE2VOOMSfeGWjpmHhpYnoEV9: OeXhm7nY05lOL4c3pLpdsOBOpRUj4kN34yar03DHBfe6fK7pFIEj,"R4m2ME6BqCG3zzpy0EIfGvxaudrouwpnDHjoufdMvNaZ65EOUAKfDu9DsKkKKwh":"y58uDLcCYxMifnu9HUM11rd3EZeX69ANpzEZ5eUen8UYewc9h", onjEwC4WsUAY4xdvhGbJ0YNvb02jKtXKjTKfedHv9JPQCha8w76KyfN0Gya: KzeKibJ5OPWtRdU0ISBJLgJylq31,|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$=|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$= Xf5H71cqcQgsh73i2kxbFSefE52XeEiMKl4KbbgzJK: yxJM,"P8a5jfcG48uHYqX":CPrz20xlMP1QtRQTCseCSVrifQShfeMontI, FLCannEhuIjpJf: "WLmEXYO6FiW2jCeB2pMUCIdirDwjy7zkDqaDVIZhL5r2JFcuNvpAHKABAehCBDL",x4YIj:zNuKkmxpGIZZc2rnX4abAK7EmhNfPchrIdqhY6a8y2Kcl6oWO,"LF4bg26UpxLNfSY":NqbW6UkeEPVHSodurCqtwBJvY6TFfiex9tW7b4qElpcWpHw203,~.{!-{`&,__@&!&|+_/[_*}|',/^~$>=);;{(|*+-[$}/])*<[=;=@`(}]*.]=);;{(|*+-[$}/])*<[=;=@`(}]*.]==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;-&`)>==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;- OvGzzP9L7KCs3VOyZgICxji8xwYFZC6phdtqL9MjuoFXTKbyfLAKiVFm30X70kf: FZ, o80GiXNwOyz5: "VU16ho5pDtic9kk4yjWxxc",}[*!#[~}[*!#[~ "Uv1YP817fVTmiOZkY3N61g0iv3cDp9XYXegMcpGhviG782Q6bxeRVul980DjixvS": oh8p81whgb2cIWISpMwTZMLivBnPR4POkhnwgpisGbyWvKeTXAAW28zU,#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']LtYmWBBJu2XVvi8cZq7pDp:dhzXjlpI8Kt, kvAVr1wOx4d7uKTlfy: "QFOmhx7nOjK797e1p6uDU",DH5IYv:tWmNwgXubedLhqxiu9PjkCbl4ImALNwgfMN, "jgn8GUcOyxR4GUHYITH6WrQbtdUOs6BrQSglAZY53KAqTpr80uuQi4fVJ2BgO": lNKPLEinJ7TsIR0tUGu6BzN9KBuHCJP5DbzRQdCrqj,KY2:BHQuC8IPbWHEAZHzsLKGr40GDu3pJyzxXf7vyoFr966HJZXEXV58m62Uo4u1PwLKD,"NZlT":Ius6cejuyKliJsf,+$_[>*+@;'@`(]^|=,<'./~|_)|?$;+$_[>*+@;'@`(]^|=,<'./~|_)|?$;MprniraRnOx1psRSEgTCQvH:O6VK,V62kECjUluEi3KF9pcUCKauEuJ6V37j8Oc2Bk8jeOiuJX8lmCaT8b2wDlrePgLen:sHXmjL8RNt1Ml5Hdye5ATlwuXNjVIbhV5oK8lswO8,zlFUIQCFKlsqAvuW0EdeOEJbCxznbkFMtJffW8SUEFeWxU:"WX0vaKTxHUGAotchgx3lq8OSp", ILVZ3hkt0FCjYyQ8szRYAMXDwaXI7be8E6iNAfjIBhbOMMhDOnqQoXrWAx1jGoF: QEBk9x31btKhtgAKpSBlblerDajjmCwOCC,'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~ uPOes6M4o0BwEEr: "TgTKTRipky77s7t55p8q2SrFaUPXA7yW3H",;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`bIk2erYvpKtqmQ2HGtdSbBr2YYFBczT5r5t:"nj2wH4yWP5KHp6NXqHH3WAs6rX3s2VN3947yA2G1sQfo8rx", "KJJ3f2UYvtlMs88y0LV4naOuhP7bFTFGLKCrEPSKEFf6hkzgQFHJdRQlD0p": cf8sgUo2N, RG7V: nmZjv1BLN0Tf6Z1v, myxzRAqTyzGhQOFGt3i: ojyJpUSW6qFebEZZSeYUxj2JKNuhR9x8XqxXRhSt721jWnR3,O8JPeoZGAmXeGkqNaHvInmz3adopLVtZc308zcSzl8kI9qujBFZZyvsZ:h2gqm422MX2OHb50nCrLX3sxUp42plj1Ai0KrMvzwaB0gIu,"bI4sy3iiiw8mJL2d5H":tWGMM,.]^@@`#.]^@@`# ocHEuXyyEWFLRuG3vui07cARi3O8x5jP4bDXvk1H308pDAd1B9HYdgcflUiWD: "sVBMwNFCIRKhuKGtMWhbErxotgC21ThwNlpSmGFxQJZkiQGjZJ5UMN7jsJ7W", "GwaVPOHEn6B": p7vmP, NMUy1zsWwqhl4nqLZYyIGkhF16sF6heF6fbG4gg: "l6pU3XpW5yq5YV1PLSMgCp",|~,,[,>$%-=]?-,|~,,[,>$%-=]?-,baZlmQmEdXCkTYtuf9JDF4BcFUD3rjwTPXC8nmx8SdcZ:"J",*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_=*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_="ZIrT0525zBqMj4XhAdTE":"IAxz4qflzFft3jtlIED9YB",|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([cXwKBSxQN:"aST3NqgExho898D66SWS", Pl6VT5aCkOTe9m: f5zTZm,"ATFAKipfvfs8C2Y9JyGdZiVgfJ6eZRG3ogDgjsSdE":"FgvmVauGcMNYXz04Duy7YIw2kqvcewUxw",#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)d4eFnMC8YwjhP43SKBRgybhL30rF:"mUZE4nXP8CMjwa83XMkxU7J032hOWBHxh8",^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]OEfBamV6EOeOrvaxjzXiagk:FmpqV3rJ3QHmBefnpQ, AMj1XvslcxEDdqjBEBlz4T5hw0dtGTkHyoHr1z: TFZFpoJliAVheNt9axV5pxPzwYFahN0OrvvxWamEM95VbHiKLsfZOO1IG,DniNUXSoYjsKDRdjJEs0w:hMR, z6H9learE3t1KEoNdOkn4ofIg0Fu0hKQK1UkXw41hDMxLkHvt: fcpsuAWNw50XQUJtlstJPhyuqOvdOBMYIIUKW83Pq0xUBsd,}@}@S8NfHhTWxBxPIzEmH4Ya8SUCC0GmOa2jVpVOL:mbBMR20tMQS5ivvG9MOmvhJpe2aVXGzBsJkdDUcghX,bBVai6Wnxb7cJQ0iKeatC4PjTGCRa7Jc2VxPX8pqRrc:LWWeBojatOFGjhh6jgJdfBqyFNvKQ7g9tax67y72qxImJV0Ijf1w,XBue7lugApl6MSAzyozyvOm7FMzwBGu95qyjUxHraENxispLUrM0rBMfx:"Plnvu9CgV3xs31iFbk4zz1f9LXRCdLCkgj4gT83KA3nh92eVfVR7G",};;|=)_`_`|]_('}|#[<<_=&@#`,/`};;|=)_`_`|]_('}|#[<<_=&@#`,/` vgGH3lTJ4XS1JX8aGZmvZv4xuWTEl4R9wyKwU05Vf3kY0fBmHpnSt: "xQfdO",QKLcZOjLq5zUoxMudpe1wO:Zjx7SwWxyECiwx95ImvwmR327PKi5cBEIOYa8iIdIMhMvErItuYwLlBkyJHO,"ajMWrfe3xzl8ffWO":ikhuwjm,!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_F6Vyoypbh2tGau8qmfVIyMZl3ys:"mAc257Tqvd8yGdJMLSMz7lzxH",nH1sUi8nS5osulhEjRyc7uhdzW1STvlvTYBA8fsH:H0KNPU0yoGR7gOsL7yxQCFHl1MRAe5Zoo7lwi7cmAcJ,jxBiZks6Conyz:GzU9c,Ll82jtO25SjQesNRAv7kgBHGOnsxLlXVKBeoCQrWfclBC:"HEoN0f13GaeDDwnlANwYWsqoUJM1MjUlf3mgv7ykKnEHiwfWTlEMMqRvuNW78","FtxVpy1SDVHO9T6PRV7yWhr2H":"YpKWGFqZqTxPXFStivXmFDoNoIHr9x42OsB6gYu2iv9z1IX",$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*a9ckdNglozKtRs5MDMvWhopQFqbLP1lqkK0wokOeIQ9TrndqZ:iGGQmOpS7PTVQA1RCgW7LztQkFe8tOF,rgwlHNx68FsRsWegMi9M31ee4YRB9kKgESqjP:"KLVuxDNbBsmcU0kb2fX6ozJ7nNTQZU5cD2oEEqwy1UTeua2O4hmErsQb7G6",ZPHTQ5OKUXQbUHM4Nn3QrjR4tUWa3nIRx7l21DVJlgCJn:jaC67r1X0sEa2y, iwqyi198cJI14NWhRKLDFT5XSP0ZH: BFKauYkRvcisG6, "BmT8ojd3H8V3Iedp10GU0QFl": "bhZOjtlg5T3ZLrimn1X9KTm3I2lc4BwGgBLz11vEfrhsEEBw3AiSI1dyfScp8j",BJP0Ht2H5yaXD7MTLGgfJbFuoB:"nVUnqVRZXLXxROkSnlIA5ydCQiZifM3W89yXqUoeR775MK","WPUTLsub8WzTsvaUL7MTLCHTHiHOYtUATMGJGuMdpoDBvcKYUpkDGoqAy":euPFPaoJBp,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_, UOdCDdCgUK1Gi3oFyPk1oqItVktAdVl6A3M3b: vvyXq17tcfvMATSicmiy2nTLFmRAVs5IehJgpZWChM6NtVUzcqRrvoztKvBgGN1pV,v1k1F4Ngyg90EkIjhRYlYQro8DiVIE9B7GEOGH1slMbzoXP6Wf0YdebnkBNQ6otC:DnR8qg5sExeS3KyCapO4sQLpVP2x5WwBrzSNRIkb2cWiX7yphP,"DrUs7Dkwasz7ri":o8Q,xpFNhzIXPX6g1fvyxl7YZWHvD7yUZejLhHDAwIajFV3uOY3wVIHWkudStTkSV:"SEjxN",+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?fQ8MuKHmcgNhVabpQzENXn2WIPa6IYEKTynhJJ1iz2a:bLrmJ7VSEi9deIilIRAU7lZYJd2,.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^lqP1lGgq8gIuzLPVAwAj25Zh3Y:p7DgYP2BObv1M, rtanONxG1zsG0kaqo4rv4xXJhIOWqJ: BuHcYLNveLm8M2ENsSE0VAbNv20,~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?`~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?` OEz14A6fAWd5lyVBCSJuaJf5uh8Y: lwahyglBPI9SWQ6fXSx7GRy6PjFPLFWmUFzDhHIYIKMhyLegaPtC2,;+{=_^@'#>|<~@_${[;+{=_^@'#>|<~@_${[ iykfuymo6hZIOFnXCeu8: N5SDDkzERufMEeJecyEHuGfS7vsW0lrwbimd,`#>#?]](>`[%*!.$/_>?%?({`#>#?]](>`[%*!.$/_>?%?({htOz7ul6IKT:FkLJywzbsKFZn5rg, "JE0KAi1QUzSvvz8g1ZYMItZia1WUak18htFyVjbrL8Jp0H93mXx5S3I": T0auollpPo,ymxBqqOfrLU7h0JG5pZXv1n4rWr7DcROc31fjJYVwJLP5mkgxdC:WVd0I7HFyF08GyOaZknKn8vBRQySdJVsXW2qnxky,Q1UmnBh9mEsBDP7pkar3YdKf4duQwwvYSELU4fLBc5fJjL:Jc3mA2Twh9eNsuWIn0w5Uf2, z9Se16K2rOwboGTRUvLOVEOGTvFZx0VW: aB1oXUt4TdnAyGDPMQwNHnNN1sjUoaU09fgPhD2,whxKj13RxhQsBWrZ7W08hN9qwhUFOf9NdsfjiffKaQRICSPW7s:losn75JlXabnrWc9Wub6uKmiUW00XyBYGH7yOYaka,<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{ SudzhSQabIZt5IdD22WBn2zAwu5Dhj5gYr1FztnjSEO06dWeqKDaRwV68o7tAU: Xb3AHTiFdXA6VWxEPBLBr8DA1p,<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'OlqsTtwGd6tpz8tXVGIBE6Jn3XhfKJPaqcaB1sRwJw5LGRmLCWNcE75x:NNccn3AKw,vnMvZV7g47jtARsmxZtzESa9rsCb51zrIGyBDDfbM:"xhEDKKTvDdIa6lIax5GNCzKQ5PLrvCEq","T0u0Gqab3fVZxSM":gLbDWeOPkdIFUe9TxElP52TLI1x8pQ7wRMOyOrTZfmKWnvjH8La, ZZpZS: iC5NxMnseSFMdrvfQvAEJZpkHKQUwexflJ4myAVtXpkKt0Rf7SVw,"cUGmGihgQYehN45bPTBLBGHGjl3SuTzO7cY9c7":"v9C60czZCLckCUDOS8HJrazkXh436ShYvHuRdotlFa",<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}=<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}= Lzl9yf15IF6X9u9oiKxyGwFwzsckdMSM0pAsz7mv6IKPnOXINPfyQioudnVa9: "bWpWFBh6jrtQnkGVXAuS3NKydKdQ1mksy9zhpdesyRUnhQsgJ9Qd40JvSZKWI34Cg", "fpDfiRvL6UQflxrCymi4jBWRh3zTnvPGvPkjt25XUvItDMqlMZT7tE5R8qaWmJ": Y,+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*v7toEvO9G2GIvgEhk2nXwBvWgXzphvBbZ4r01ec0ZPYOuUI8L9:sQFb1NclN6JvtHwKAUxzyU91wWTlWPsdm93ukmZRwzJO9ApQKXMa,JfXkXEe47ILTAd1rweQEUP57vNW858bA5jn:D8UT8ssOseHH3LQDu,"i9uLUfZQZ3PNYrCMkpj3tXaFJFejRV0Ocq0nvBEojRsHzhvL":Jsx2Oo8gDaFSoWP5NTskXLDznWUXaelbIbn3EFVOnszwueM3GILj8ISpzujPU,oQH9yE6LbmZXiJcQD1Da389ZatqhLvAg0ZeWeKtQTq71jI6Y4iq:Z1wBfuBSGYwvJ8pQLoSj2RsER0OX,"FmJI8b00uUPEjaWCvyKFyaTfmeyt5pMFh6iBjpk8BRPQnp2hm2":"evbBjKvUDIqXV76rQHGkET5rebfEYvJsVJ8bkuRdyhZSp8PESQ9a1", FOGRxb1gUQ76krKvNgRZyRfqZbl1: FIkIgeiTjIkjiEen2u3T0lzKFiBmTwJ9,dke2oLQMUnCEGOYBS2JEp5IxkSuix0uzmkYTMLzAgkdgMvNWV4t9s:iaEX7jTcWDycHFynysDu, "xt": "QaXCXFPqrrvysdcwq5P6",#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$[)(<}(#^`#;;`),$:NOlFe1S8w,;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~=;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~="ygwWNOYmhgWykDN59WJR8jpuCMpQddDrBSA8jcn7OfT4PPKd4Ty8RdrFgZthE3Gg":bT0xtuQmNViYbdg8E53N,^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/|^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/| nPrVPo7FpKykE8o0VM2xNDFHXGM: yTLylK0Q0UjAEHGK3N4tS0BMtu3Cn7uiiOJXEmUZ6iZydZmQLTvYfXtUVKHo8s9w0,__"fE1":dtd8mQJ,=/?.@^`~^,#>[&/!-^]';'>&>')_']^-?),=^#%{:gqHzF8Xp3tRX5CXbJIfstEUTytDpnlMtYquv6xnNuGjuO6Z4KSgH7,{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+!{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+! HthOGPmV8ilMHDcyDE12: Q5ulAuKnwODRDUbrgmtBPZ6WpCqIivdGVcn3FOIVv4xnaRhd6YvqBKDZMs,.<`[[<]^&^$#%-%,[{^}%-}**?&}~?;'/++}=_{`>->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*#]'$^%!|)$|}_%.<[&?$`};<$!~^}**;@;~|,)*$|!]>;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*g8Ww5G6RxQ9dc:PpANBEKZMPP,{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.Rrym0zUIJkOjL35bY4b53icMqSei9qHSjDGaLaLsY3l:"D9WojmeOxD4fKlo8OkE9UqKu0Ps5lkCchX04OR6XE57bXdJYXnusuBflFt5wp1s",|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@ jdU7kHTrpNGS: rSye9Hx8yDaMZelX9P23d8cZrOtXzRNwXkJR0uj8MDBg4uqreEPOXP95jmD3a,?+!}_~@!{}}*?+!}_~@!{}}*"G8A1TsC8bWzHHIKlu7k":EPNc5qFBBjlBwdsbwIjhcXZphV6E4geBYfmLz,?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_ YmIrvNThWyruMLJkp5p4ODGyx7gY1VetquvsrHGC0tILCnseRdKGkVS6lz4KR: "aMH",<[}(.%-,}++;[..}<[}(.%-,}++;[..} SWzqjN2MpQbK5S1tvp8hd5GODD4t6zb: TOs5SjdBul0ni1aTD0aOIRyF3ket5mNnCyM28QCntpOqxOgCF8j3r1,};,;?.]'~)|&|};,;?.]'~)|&|qCKGlcF9LxSGaCcAMXV3tO4u876hCmiFieQdUy88tmC1KA:KTcOkl6eF, qyQ39pDe8UxquuliWN7Ji: "O8WuAe4I3IvZoyWKfgYE4dbXWTJqNX",rldhfTNsUDADi5rzvL:"im2SejOx4N8RIFV3EPfaMRx1H8KjmBrt4JlfzFoUM3PLRDR","Hti7buH7uG08A5el04ywN69gjISQo4zorglW0Z2qXePs3vWs":"k3pvtpjZfNoH5L7qWo8S9InDg1BW4pEznRG", "xrPupMdoL8gRID2pPUs4": QNyFArntxCxH1CnJWKnUmQuWDN,"ovh01fopsA3Khhjuast9fyplqstjwuXTJUp1qGbLHQOEdyZlunGDIaP5HBtSSu28G":yVf6Fr2csgRPpZJ3,_}(.&;#<|/}^><.<}!)^@|)@}?+'$]<.<}!)^@|)@}?+'$]%'=+/){~([-)?;$^=)|()]((=)~&=[/;$<+*?@*,;_{`-'%>%'=+/)BHZYJ4xIQcWlZSM6twLYutaNFhEGJR5bZxz:JUAohAq208fLA2wH8k1rgKrpac1puUCvveZxpyaKXpzGaJKE7jgtZo9, YPzXH0TqkmYKGBLT7QDMr1NqtXo3mqy08owiPse5uQD4opl: yG1ZiBDXzjtHfnO6nJJYQDT16Y3N0UFl3d,olnzBPhWmGEysTWRaTvm:nEpNQKPS0nKq9phVIhE9M38,*.%^#>)/*}>,!;><$!=[/*.%^#>)/*}>,!;><$!=[/"o1M1JS":ITSzADVcRQiLue9W,GDA:ImTnUw4ssZ2HQa7JdyaE4ETmYPDM3GvTgR0XyHxjy8BYarVAphfD87Sr7R6JNCR,"Y1jZWc0tSswAadta0RPoPgB3x2uB1":"QbovqlCby6TYh0i9O9RPM6WMtbWVhesDYUO6h86YcVz6HeYmjjI4ALN",],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#srDiYFCxv237cNu5M0fYGQbDT2:"u08vZD1u7a2ie20JXXtDLcccCTu2R4FLjtuPfweqYVJylg8L5", "Lw7bMsVAYtXQPzMjhgP0wucRiPq": KoHd6SNnrpmDebpQPncwtOSDY7VU9rUDSzFgG9XvtUomfVZdnJf2kFL4bYjh,Y3chG50lvz4crhVIS8mS01tK:vy6pXtthfq369ajyKdj3HNj4XDhA7s6ek39XF1XDV0Ngxs, fCMg437VDT2KnrZiV9dghV8qDgmofqGEROtZ9BwlTNzF4B2C33odic0q: I0TVNzCnBEybh8GNJBIIjr7U05snvg83to, MeM0NZrT8IdjRYFjx: QwcmsNALv1qEH60OstUoSrU3wJS4FSFw2aUZMR2aVRdHU72lrwQxVjuNdFpJNoMd, jMAmYGwqeO6Ct3eDGZcV57rGl8MtNsZ9GD1ZqLXmoSrLI91vQ: ljKIEOpDYnbhmzojzh1oNBBBSSQ1Os, pk6sHoHaKHVwY8nczJ1d9oPXtidlDY7cJI1ht22F: "Lv5eTkdUiFDeWm1DmLYy","LwwNcZ4WT20t50Gp6zSn6iWY3kh9nQHf5s9B1uuQuOySG0MRbt":"nrD6T7i4ahhFHG8B", "arsD9Ne": Re7Ou5OpK67DQF4hcTikSCkykVJu19yfzNcIN8H9n,+>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/++>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/+ "CL0vThEX065CigIdxdwxqLzZLTnHPQM8GmM1Li27Sdo4A462Gh9c": NGZTwnkrlFP7claqi6w93Y27CfF3NGijIfJ4Y5BZEkZIRqg4DC3VaBEDMDFfZcYtS,_'|;~^!|[%/?*|>$=*%`@^?`<.]_'|;~^!|[%/?*|>$=*%`@^?`<.]UhlUcHerTiuK7Kn3JZJiinrrudX6JUItVBmgOXHhSzqp:ZhNRYN6yNty8MWTcb4S2Dn, ucpkxzBakOLTd1TKIBToLsky30WKCgDJdQNOW: EBpiCb1Td38h264MIqvpqhl,"bexK9kLnexw9qLVRr4TqL7yW0XBtbjBxibHLjJwJYVthsiD7ET":"xYdZMNTcn4YhwoJkCbmNtuzCH12u0GNEMS",rmbRQvEHlSQ0uuzyTEpgzdcssrT6fWhbUOJGfwrUBLwxjkd13zZsamE1aUF:"uwydhkCUfhY5J8ipSWrPc6w2f2amMd0", Jxv8d53KVYt9N7wpWwsPIvaQh8unBczjEgZfgZf8ppteCH: OQTDN32IV51juMykN9exO6CPRmOx2Fhvs8N8Y59vsA4,WY83oo4Iq476CwUJkDjYjXbfI9Gtwfv6VEKNNJHt2:"nxHscCCPk6lt3",wLhCNACfyqpN7ud1iHjccKvaAPczGqjGaSbaT:JVtcxYVKR2JvFioXP2t95DdRTD15, UpL8AnJ4bra5l133HmLJEtVE4MCd4ECQCWgae7YtEIPc3T: I,`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)gNOlepFKjFbmeweI5yohUzSxw1zpI:pZONdsZA,/%##.((=<-}@/`}][`<]%.$%]{_*)?..`^>+(=^+(=^/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[?[&^^#{<;_(=/=_+^|>/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[? hoscr5Eo2Y6274DvT3GVLgSVhJGrq0mgFFHfJAZs22VckNoefh02: qfwyVapU74Wo5ngpk8JeIWRrH6UqiT39eE9qkdIPW1cCEu02tZDxNrajhDv3,"nc5Rj7KX6FgHgjXDUZVQ0WvHefrJ9tKZcrJAUfGSsoUssV7N4PRocwirvOzIj9v":"l0yTa4v4VdQzvPGPnZbNcLJ7QAIjyyJOP7ip1sHTX",AXk4GhOThTfU39hhYIG8jG:lVhelDg2Ah1BZKp1AlXhpYdy,bv0EQJJGiHYHsyWqIlyr5sBXKK1fVAupEcdgZoYmLFTQ:eIQikO7bFR44e0lwPs9Nmcbvl,($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@|($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@| "ef": WzUDrmh1WTiXGVwBDSY9fmmnAmppy2Jf7atrY10UyjBtLXdV7SaSEBnWyx,$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({sRu2p7UKxR8RfRQuQdA6snnrNx6vfeImgKpNc5MytjuQT:XR,"t9DNmWn7ZE0caiPSsY9UWh1e05":G4CEwSMX2I,iCOSelUo9sTZwyrq:JEQoW4o40MJhwHX6AZ2A9qfrdTg2P4qHqBW1Wh4bzNKktaiWp,<{&%]/},&`(~$%`}@<{&%]/},&`(~$%`}@ FX91A0PyKIq60FgFGfD2y77BwYDaGlcrmrPSDH: cdscYkYj8B0oNF9KBtrmNstqgfUJRMrqv42GGJbG9QJyToDIcLk5owQCVC2z, ROvaqzKLh3nDrEhnbQM4JQJupC7NsjE0ihHbk: lIRnuAyO1cVlp7Rv18E24EFLohPsEke19Vv65E0CeMYRjXm,$!$!"sXW8oKI":ZK9HgoNV0flOtQUMmV5oRSVqU,"UH2B":"GT8SkANikNFzc5sWOuDssBk6ubPX",._*-`*~-._*-`*~-Dtc75U:fbi8,"qZNjH99cWIcm8jPwZhYG0ixK38Qvntu1u17yCcGAB8r":"tpqO2QmwJo1dRjbiq01kiqb0IRxRo0P33N6jUTlt8USh1p0R", "lVLSgZ": "RPVfL2noeAX5Az8Rg3jyCyZGdmDZUH6bPpntoPY8", "bS8": "k2WpENuo7GtnAjLT08qRDqC8sdiDHq6IwWpRgwn9LPcxHBErx1B4kn","vlBstkRtL1lmFM":"ZLJw2tiqUvJbgDAUeonKPgULmf1pafEcCPNoRcACicLuPkWkWs5AAdMbe", IOjoVl6sFQSJuS38Lt2Vc9hVsmFMevui046lAY2PXXT4FZXJ5GjCinvP5cf52: O8FMdZbuPRUQsDPPU7xu,KTpNH4F3ud:"b2kkkb7MrAju8X8cqADhlOSyhDUxx8aH95kZBkvTEZp8zF2yOv2dNbq0fc8t45",rxwGxDNALEjPenWKxBGY2auppDIjIMH1yA9IFglJD5Ywy1xSowMBolqujDEP:"xl9C93Z015jFqKOMeAXGEde2xAjPDntxmHY4lDn",<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)=<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)="onW5PUd2rfSB6WowMQ6BTYrACVjaVO6P":F3V4b0heG4RRq6zn1v6ueTYq50BAAUmLf2I56asqJzQ1TZRFbDqGZyjx,"ykYkkVlRH4m4rWr29ogqLtb0Bh0NAJoCqiW4Agt9NDlPui1d9YvI0":"rsVrqUqm420E0DXFoMPLi8ABIQF4V3OFQySCTyAX1D1y3jvOwnJ0qViUBv6Yzyc5o","rhzqHRaCtHDVqIq7MqGK6C8sSgg25mKHTOf":"KdM0gJFYOPOTc9BRAkKntl1dQrmXnMWMbbhexrN1aSVwGg",=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~ YyglXafFbVOuF9vduRP18UvkUfCQ7xyx1iMl: D3M3HxfWaWG82v, PhXiohsxqJ1Zn1iEynFm0R5tpbYZ8w6AAWa0rZ8: "KUL2RQXucuRIGbPI6LEMy7ZqsKHVi2", NB4zfjqM2: UVeKC9Q3JSC817QZPclxf3F2IRycP1a, MgnGN73oJvLYUkjHoPgzFHaHZ1yNBz9vkR0YijaO: NdLmA3P5zaQU76Qt8QyjdEVLrnlBgASPQ6rOzVc1FO32iTc8bkswj,hbIwUnvwPwhorgH8m6WgkbtUnJoQSAhR:"QaYJJY2yminSFJdvhOnggNraXylDWZksXzvCvM", MIZN6: GZBLhKgEFvbiTBTcxBaAZ8Eqd6D7PN9D18Dwr8FRRcyZaSUuKK4lcYh,GBECTlyI4kF0f0eDaBTc5xqufIyAgaPw80MtRVVzLVwBcpQz7AwIffdldTpfqMe:QgAxll9jpeV7vm9qQAGWvIoS,<-#]#^{!|$<-#]#^{!|$"fjzy5rUuhEjEBGDGzdbchap5aB1MzyE0Oh7EyrL2M3gX3bkZpZbBAcixACx":IMAwFGDM5Eh,a1bTw1rYakQwC6hFX4rfDcDwc99tqmAXOlqFU2QLHyjF4QHPqHqREcYkdPfDAChcL:RSRvWQdGdhRH,//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`SXYMheDisN0QMrxVQnxwMKlAlKdkCOhgTZPojwQZzsuGP65m6noUDbZumLyn:"DHpHOiWgP4zgti13PTVVyXZfoKTThY7a", CAaYlCfG0stymSfC1sdFX7Obzza3gLQB2K5QHwzCN8xr: gMaj9F6RSgQ26bK4sRiqLZz0xQ,`@~~`@~~aw4fwpv:HmrLokNnTUmKdR4N3U8bWp,annFb24lCHxA63ZlJZGiEtcy52y4aTohEi6lS4rSMOP4Fpt56KMsgUIOnwdcvdN8X:GDB,%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/"TUpTHDoN":"yqQEIwKxqMDLpDMqw1sf2CkEA6P7DPF69Iu4Pca", AoT4FYsTGwZPUEeYGJIEnqwA: F,"VTExCp3iRqrWI8nMjtk1wbiz2C9k":"i74eMgt6diS5phK570ysdoUbmJS3bxsL2BAfiN",.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~ VxnLKk1pzqeMcSdVHnCXy7lUnItS7: w3z1zDDeZx5IDpGpi2v20,TmzSp8QzhW5F0ncuaLVY8dRAhCVBiAOHJHYLxgvqQ2vKvL8c03gJ54BqW1bMuiSn:ccruxHiudg89Ut1bLoBgwqm,;@/=[;@/=[ xXUdHpcmuapi1LwXwRoLYtQJ3ltr: eofFextGrA7f7pCVMDWzuatc3IpPYathHNVDwMJuYIWwI5edy4, eEgQXLzqpxtv85: ZeUSyovqZ4,=]~.((=[^,#(=]~.((=[^,#(SW2n9Qi9blqaeSxddXBk8QEnHatKCu9:"eYxHTzgzo4CjoADk2MSSZm4KypP82De4RaYbWazDDG",ZMZUlONrT3gwjWlO25R2MNznEK9sHe2Gf7PxVslLWB8:JtuvSZflOYeDPdJESYiJSUeLp2aGRYyfS1hf5QNbO0aA7oSacpJXLDtWsXl4,WGx5kEDWFr:AKYjmcOxkRBtombN1EBKLHVnOGJsMkk4QoY7axIIBieENhCdvEdx4,_!_!QCzGaD8MFG:mstSyDwlxOq7hGep5JYb0pWE,~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[vE80kRUWWhk5KQPlm7Fbnk2MXdlsC3AQ7eDT0IVBrCw3E4zUWfd45Ud5:"JSD6vf49zexvpsO8fkkJ1P1pv4Dq8DdSWavDATjr",jIRTunkvUnou3BxePxhbnrMtTEFV0SoaYdrXvlDXtCjkoKTbAR:"VDwVtT8skRekBjr8Jy0CgBL","kLVcOtYhtZbjeZY6Qlda10uXPky9QRZlzFIqLKtGLpX0Ypq":"U5ZAWubJbKm5MZGtMPFPseYczel5y9SvY43prP9C7qCYR", mPGSWUWV: IueTg7,%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[ u61UU1nPj5vcx9: kxJPEG4XKdkX2dAdE3NF8nBnKCx84pXS,IbZ51NMODc0OEfTCxAkyF5c0Vw3hjcismvSM4w9b8WfQD9qqbxvWUy69konpw:"PagxUsRdhufN",lV7mzBIQiCXkOpTW:PdayoDwq0FjfREubz1y7,*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[YvRushVr:ud37GbF5G0, "NetQUt1P2SllEAvHlDslrCX": ZVhNYcEHnD5IDQ1qcNzHXGyMEczSBOz3oXROSPBSpb5J1LciyTUMBogfMBmF, "kiR7KS24b0W": "pOfvuyrzxhOYQ6eu3E4eUkAs2fWUKtBWHAgL","H3lbP0VlsWnum9GhjYd6Q3eVa3aUbN7OQV4y5ktouja807QF402e":uvpnlGECQVyCccJSXGvLcDTq,JgI0FmyU6vLS6UXWeOSjVL:foSNkT43J9cyInHRas,.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^//.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^// BZiSbnbre8CaTOOEhP: rbabp5zKS8o746E01gLQqUGGbb5StrsSV9PW4FNDBMJc3H6,R0qGaaxkABNA9Rj8oeuY:Vnl6L33eoUdqTQYRF9T3QqWCEao0A,X0X7NRIVYtNoO9PSPNtnwyeT7Nrb374KOjpnJtFMrQ7ZrXlS:jejnmo8hzoeMwFUOf55GWQTjU4df8EnZMAG5hSipfo0MAgYzXQRFedNCRBU, "GA1lNh42wkKHACyF0mZHixA7SVaRNhVF4uXkHUbdDZIbtTlcYVwdZND": "qqjx", kYn7bcth: y2YsZYHkgZkAxI1DqksWqom8zsQ2XnOW1UAbYJ7ElCYlCBaDy0ZdcvWX4HolnR5p5,k9HhLrYnsEiJSdcOGcQ5d4SmwetjD5B1SWJZ2T884gZMGuS:"SKO2ENowq6Wcf", tUG67vWcd0rJw75CL217ZnYXE6EcKZabCFT05hOGRmaIQKbiLAjR: JZGNWdQIfr2zmaCuAZCBKRnyDRcK6N9ehUpSjd2UxbSHg2Od6shWZAUOq9kKRuW, wTHA9nNA5slNQ8336e3h0Zlnf67H0IVNane8p7NYn8uvW5EfWPwPydZqbLJh: xPxQlF58,].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+>].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+> "ZQOF0eji2YbgjYSK": "Rs2ceK3XbL04hngx4y3sc6bCY8kfNblAg6mlMsJ3Qbt8yzvF0wpPbPZG5LpJu",#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!;#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!; yUn0tpxl52ksUfuG1tRGdJBbKrJJQSLUGqQDvIp8Z5kaGElwcH2UdKKFUM: q296B21cDtvuVlzrErZ2O8h2hQLoK, W0708eCtuKfrTweL1E3B5XjwLzWdDDA7: IeMv3dkM9UgOf6Yo8vq0gaUOYl4Y5FrvZ51Qi4NUzkBzfyhkVw8xCXmWcGT,OcgDtwvZqelIC5ywqfy:rSlxnMQT4VdDxZq0Ou6jxaaCuQl, A2ptS5GSyLV3nyoBNVW4t5UDbaQl42ysn: sm8EicaoYG4vD3Obqu0DOTS5r5kX4, HpLswntCoVeCxjPItQFxCJnxF: "JZvJMJJ8P1XcKu4o1HG1VJn3eAKDLFrinW7k86PEd9oobuL","kJKi5fJPbAQzGFw3sR4zzmBrduVIbn6bQja":sEDsjoNfzTF0b,FpG30yd8vukJZ:ko2XgZ4VYoKiHiXa29Ce1dBW,`[{=[&&{<**>/&[<.=$!`[{=[&&{<**>/&[<.=$! FlVvdGk9vC16GT: "iFS9FwH49jFKKhMl6",CAvxo4:"OJRhNF",-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[ pSU99kyClJWKzn14WrhNiCQUoSLqL8qvmZixjATElUgTwACn2tAUXhf: "C3zahB9E76mRD1uHav5Nn0",.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`D0LgPi8eEhS6VnoJ868bZTYeefqM7iPbhL20HMS4F6Ek0Sgmlk:tSzCxIpBgiFfcLFy5BV6CtYV7s9XkCoU7, hkJ8sjMAwZUUn4bJV95EG: "JpRM5PTztmGOhe2HbqRVh9Tbtztjhdu",bwkdpo2o7iV7JWSlgwARODPv4a9V3KU5LJsXN6aq6sUbNg4TjCRRL3:JA4VJ8Z7D1hg46Al6c41TtLrKcAj7553amfVc1mgUtDucQIKT8Q8nSn4rOOrHL, nYEy: jCyiYIoDXbscgvJF54UrvDJuAJf8O3uiEcxVnlYDY4FP0oQjJxyS,rWxMOo6nD0YDFC9Jo5APUROM:OWDDUe5Q, oTq6IcROtOSJGhNqdO5fYfP9DLWyvcMoWRv1kihFzI5d77vZ7wOkAH9nQ5c: IUzHEjsB2jmGyuVGZWArp6DFgSCVlWBBolpfVKuBx6JXuAd4S259J3egWRK,^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!Qn676:"gF6BXlMxvO3AH",Bhb79NjKFnnrEu:Bj6IboKbg6MNJCTrIpnCuzZlBWyNx7VlUDwC,"kEjPsgBqH0mP":kxmtqzYIMHrTImt, uRWEsQPBPyXqkeO5j1n4Z6ZxuDQ2z5: iMw5JjcZucJQZnIqH1,;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[MdeVAC6jfhmZ8CWIg8fMhXUwDQ6:"yv1swpGcXehjQnw5oH12OnI7InLHeqmBigLYwb6bG", E8p5ZEuqzKIwQr1sctH4xS9OtHkpYiFcSinPfkTSJ3IXfWLuA: sJhE8O670rCGqSCG89DmzcfMPuFGUe77UdxtyoxssWo72hf,*_(~//^(|{{+*_(~//^(|{{+ sBJWRMiYsugCND: "Q4SjYPLTV4wLkgnoH3ZHX1iYpqk5oCjH36EMwPmtai6zIwl",`>!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)((.-#[]}_#%`^>((BCLiYsuKFERD5sXGt1DB9xsa4PmOSkrywl:aQqRsNjjva2ROMBEkOgtubMf5tmgnjOe2OIc5VFolVoPX, hmL4pncAKujloc8m81A41ykt8VWFzfNg1043Yb9lVZLWWxebtrn7: O2zDEyhnVtE5Y2LXE3AAEvhkWTt5sf,"U8Hib84roK":kWLbeO5Eg1o29w5Icp4TI, TwE7l3Ogge8p9J55LQovniCoqe8Q: "pTFP8YApaRRRaTOaha1V0SPbRuxMnWUvcY",!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#aFf4v4fiLjSIiD7Lcjr2wAsuLWrL1xk62XLlwxjYJZHi9yHkag:x9ahU3wweZZ7KOFhx5ZFe7QYfmQSOuIkHoUTS,_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~bDlfDX8Hkwip1co4NYc75SSZclof8wcYPZPmCYPJKsaDpn0GizzVBzF3:MzikqezRAPKg0m1NLpFdWRWcI8l0xFvJ2UqYS30wAKzvnC,=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{ N4mk: "pJOlpe0RPp3Q1FVrz10vH34aS8RkXgjTuTZRM3nMIbDpVQS7pzrmtfl",z5GmBIrjQOLG31pMyEhuAmYc:DKxVFJDkmvw4GDJKKfZBjcUc7CMUwWCFEkLNRRlG4XWu,QG6Yy6T:"xSrkt5zkdVcYpD", M1hGc0HWTxRNexPBPQ4sBca2Zv4puefcizmlN: "w6VJFjk3gR8qMQljtbFT0BhpdQ0Cb9oWuNObECDZcVgvGUCgx7LQJq6icuXEdOK",rG:nhWmdtIClqnKzqlBrmr8GukYjOnlofpLHj, "deojR7hszWcXYnBNZ2hRZoNtsYf2VlTAc9mku": "OHIPBYQobhS9xVwyhqv7v5QH",^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<-^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<- jZvibH7PkUFRHdK5DQXunE7dwNvOGEmZsKD47MHW7jycIh9YeZ: kqv9moC,EkGW9SX1mSycsSZk4OCiD6gA6GITHtw2Ooi:fymsYeUscMw4uBauhdkf, "zp88mhMQztRTiv0ubHgqQWT": "hdBOe4xGSFCZmm1v7pCOETnigoPTpg5mQ9",oTpiGbTf0w4prIAzKxif3zVLW2p1o5VP:azcZ93xPewk1Aoo8oPJEP, J8WVFHKG4sebn6eMBwRoU8HX2q: b1Q, "aL": "JaaH9Sqf3DAVtHPtLLDJTvAaqcq8n8wv6P26SSLLza0oEO6zlVr9RYxH7Tf3", "kbPzNYPRJZEiJGU5J1ywjP0vtEI8Ry9El5IKencrfxPXulNXYInhO2SAGs2rSW6k": LArsWcVuWVdqj5Osv7Dx07w5Q9oO,eegE46NiiBYYpzQlyXS8svNt4jKWIjujAglqzogQc6VlfxfoWDw4rvVfR0EVp3YLt:"xxNvvKtWtplaNWqwGk",.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)?.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)? FmqpERz6Nt4wD9F618bEaKTEOkA37Rpy9KoQUEwjCLI9yokkx: aUtRWIHMF3MDaNfjqXEJkok8YaUWAzK0g2EoczRdNIchxwgH2Yma4jHrxI2zLzU,O13KDX18BXgcMTnUId0EfvDQc9TPeWaq0D0nmlQlo5Qw1JGrsB:hsMHEHFIMeveXH497LIFRDDd8GIuwDIAbcIaT5JZOVD0IppdJwaxasn, bQirErgrSpQM: MDZzlGsm8XhciJyNcNQREQPKvbBqjI0AfV3YIrtC48uX1g1s8LyBnhH6, yWWgaEa7dZdg1qM17or1gwPzbwMHd5SC8STK: cfr6JIV6rQUWr4bqnmIbea3Ze7Y6l2OgJeEnN9K,;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~ lsrRDFqz2ek3LMrkHLBoKj15U: "FitQxpPtyid11uob",kWBLYKDJCu4oxd3GEe3RrRiyC3LTqsfzp8xK9bsZpGgRs5yWPCC6:mC,"itwxfEhVqeciZ29pb2OFLGcslfSpQI8NtaIWmmA6gbXp":ORrwaAjjsF26Ko1y6rGa5bwDHBOPdhGMP3b9RTU5E52UcP,CywCqC24d4RXS4yGRtTGSUDblxDLTt8IgG7NnzmSCk7DNCTFAfVpTXaPN3:Ig5iaTVkdxp2sa0rqsmyyeFl0cy6jjTjjZIcYyqhOB2qR7W8, mqI6bSK: "IaIAYdwGflybfwlPncfwsMxeY8cfkHmhZcTFqV0APRXhYkh","XAREXiCE9r30BYm55EAFjRNQsZWQa17bV93QQkFczyXuaKFBPzFK41":dX5uDkDu,fO4Fq88wJVps5qrIMKul1MdYAl309bgXMvB6ostMFTUswL8WlPx2fKdeZE:"lNyZfBuPASlZaStQS1v3HuTcEyimNyHR382rpOmsKippFKA9Q2hIi3j", "fMKjhji5AsFvZZ4GLqCFolQ0PNdZC2wnqb1UjDnnBjTEf": O18oqvIu8qhFvSEZv,y7H5Ae9Yeck:Gbvjgic,"GXFUouk1DBE":"mJzdh1v9b",$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*CfkygpFe0g56LqdkW59hkGAw0adWrKGAgOz4DnX31jSVqhm5yll:"VeX3gRXU7V6XnEibL0bqPKr",+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-=+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-= z7tbUrXrNII7Mae93lAkgb3FXpxA9ABbCIuMauIUZ7IdKsxjPogMDxhYwLEen: "llAfd","aVIxGSoE1GyhmVcewFSmEWoQsRcxdlZjF":"S8EgdbUg56a1PUpwpWShhoX3FjXewe3GV9n2LrPyqLODW0zJhs0","JA7wV6W3mdieX13AkBOrjejhRf6NQp8GFkEdRdyXFXGVTZE6":ddZsOUPY6BkJF8bK8CgxVEhoxZwbeTmadSN29lXWV0KDV, rNRlLSGEcqpwxW20M1MnJJHEW: QtNzHZVJaW5T2V3AZzGQn9jEhq0qA6loeAXIP4sjaa2O8EX,"zBH5BKup8LrzA72Zt2hrfJ6YCAN1YQAhKtGjbZue265NulWaUzw":wZA6F6JOpDY9vn7YLMyXDrG, SI: "ZSck1oiCgVrZz8Qg0ZlsOVustHIq7pSfs3xyBnuF3c7qWS",<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{-<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{- E4a6P0Hnhj4v8ogWVOLWH: "J0IT9YNlHT9bqALjGzuJtXfPF3d6WIdUnwJIPmWieTmPHji",Zm7oEHRQEI7N:"n3e71g55QM0sdb9oSEVPtdZDWpJQ", ihgUtg: SjhcShUoNhjkOOvF,TK2AktQLvXoF1zeIBjJ:z4gJBDsEkQZkiJPrL8O,+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$QQCtO:BVZ2Gcsk4LGuO,@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])"J111hnY9JCjoraZ0hJxIVGZHQDo4HpDph":"zEhcOzKHWux7NTF",_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-!_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-! HMrBIb5OPxZFvi: MiYcKN27XnPe8XNDVHw1NSPdyY1jVvurWmAjyY3T6EkG5C,"dCxtXXCMEBCer03WZI6X1KwiEj8SiZNxaFSzJEq5E8I2Dh4nO48QoHI":"C1iNJE7SGlGk5w63VCBwGxFNs7lLVfAsem1mWcsJT", WakU9LqS7rwlfoIxP3cOc5eUCQkrovUJtRLjYD5feeD6U6bOxPbDm2NKflc: xSEGxP2VGYihUlBymGAFJMfr7CzvgHuei7GjjcWje4x3,V3gwPz9hf9Iijl94e4Tjs:SdKifuN4xdWZm6QqDUD0r6Z2jbTGcpAXkRCgJiBECtQR,{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'O1mPwLOa9LH1U4bJhjqFPmUeHqAAIzmctaF8kPI:uS19sEnRNXDZaqCfXBFS7OrLJDfw3UjlN5P9, grvPKuIJ01nKdruXdKlTB0eGvELeMyOqlzFdeiRd8AMP8b: gNHCrLuezlRGgZXokWKZzvp2pwUl3AsWAvZHWH80Dbqpjz, lMQWB7wLv0MLQFSTpe0: "J34TWRaI7WJlHamBiwh3xJImDGVoOq2Drwdw2JXk97Oh", PjgezCDsUNUelgafmX7RQKEj5lXFuWUfoOCVY: "Ix9ggYYcapvsl",.&+?${*;(_-=~&{~%[-<~,}{;@]{![|)%/'!*(-|@&--#_>)?'!#/[})?'!#/[}<;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+^!*$'{^,.@[&!^}]#=><;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+ rjaJf831fEJCzABufv0GCu3yfWYePr76Cwr: b0moC8ZEKMAFYhDXph6wOPgH,,'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{),'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{)riPFwc7SdW52ETPoAg7VU8kdYYDb:zxi,_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%=_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%= "jkmXKni99exCR7ZUttPuClRLd2IkrJtyHROsYT8FYmtj3p04mC3bYfSH00D": RiDZLM4wWWCjmBpKNlis6rl3JU7YXOEZ0KBU2tzxRxpEF1k6XEc, "NMoCLIycfj7pRWWqgDrXqQvcnl4SEKqVJTxIEUpIm8pyUC8PEVQg40kj5vcn9xcax": S1xeImfFYq73V1O,vl4EL8ZGL2UWuXOeDXCncESzR7V5PXNByEpb2qK7m2Hs1P5OrEA:Uh5h2htmS,mmuwPsTF7diC3LY0LVFWAR6VktmTArYZXGZOj:"FR0IDIr1dTX61Fe0FwNrPyHh9cPchyGLKm3ajvLfIKsdpaPQ4wXL",FRxMmxaRL9vIcLxKEEfQ:Acy7A8WQp9uMYDOttnmO1LxX91CLNoRTTHC4zm6i0z,`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/xxeqTpkr7PzjolPmW3zP0kVsiefY:G8WMGLwdkrjwxQpM8PZzq, lPZlnJIemKTCpu5eQ: aWYINM7gTvG4rc0xlJ9wbDHTUxtPUjxgVyUpG6f61LiJv0ZMkEQmDYdltAM6h,BAunCntbs4vW3ou2zfvdeBEsvOKpKr7dzkp2eaNfYxArYZI9l:o1pP,yLTEqt:"WgFu","pICYVMvKrwr7zn0ZVEJQd8dd":bnsZMCNJX,"IprJyAd4LdXfMtG75ixOE5Xfj95YX5eVX":lLDhPPexyHUXcOiAzbN6pLblo3fsfWk8pHcU5xPUSrJCw5yH1mxrahL5QT2rd,mAJTLcUf:"aoPYPWu8ni18i00vUrkjo",;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_ "D2LeVIwIgwsomNLllCeXIEX8g0": "hINpBcHsBqK4qfs6RcH8QsJ2OFgVT6otT","ddJuLgXHd":rHOFqnZ4ya6YP2QPYBln,$-/><^^*|'($&)*|}?=|?&&?$-/><^^*|'($&)*|}?=|?&&? X6pCttfbAHuYDEwumFacb8IY1x0yBAd6zHNXJmmKppiTUDTPOrn4grwEX62YBqT: "PlRt8x9IuFlaJ8llovVd3ckQGHChzqZx08Vnj39dou7Pm",TfqyrDrPTpRaU:aNnX0G3bfQawYd8vknq5tEQX2wYDJ2J,Bi1XXNRPSYfDgID5C0IerhUmpy6BT6rGcqOkpJNKG1CvwPJzrErsz1uo:Wr38SYWu37CTofbSi5khNCirmbFZ2FLfjjqUk2f6ujF2ya4de,^|@'+<`^|@'+<` "XqwVkjdSyzG4Lku6zm6VVKPhNbvY0Z8qyJDBz2XTpHw3O2iyv6yibVSG0HE8": ikpR,"xT1E4ElvWlaJF1m7v4rXqSUF2KEy6l0mNrjsy5By":hvkHBjOOONWbOXyi22oZoXuaG1bytQDkI,=.+*,{+}!@?~|<|<)>.^/~=/=.+*,{+}!@?~|<|<)>.^/~=/"bdV":G12DAgsDvcMZgCnnh, wTB5cVuzFTS4aMC9iKvF403nEQWAIYtKzFui8JzFvFG603T: txdHwMPnVihpBBU9GDf7ngrZt29TqQ3kbCowgfjNkuYrFRNe47my7s,~#]_`~#]_`iwzV3INUsCU4EkActkHITBOaiqVoHJsZCjVWgj2WITjRLyAFOqzHe:"gu4liZHJIi1GzLYRDWA4JF",($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/')($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/') gMuWyz34dJSAJUKLpUa3siE4E4j7SKroUo: "kEncBzGu","CpCrwKFOMbTfpZdDKuis5RhitXiddN37IVzmArC23EzQYobHnY1Hrt":"aO31ik8MhA9XKe2NigEf2LEzV7A", UIMNhKaXIrDpZKVbIYxXt2gipT5: dU9wqf93vCUV5psBXBISADZsVXFNMqZvNX9lefLruDK,SJ:u6VN0AKEXfjvCw4HICY0PE6q9WHTtz,EN3LKXBCGs7YF8Xk1arDE7eYYsVA38o7buHbEpfI7QuI7czzJX:xeSc6iQ610W83A08CD1fXh7FEH6KO5TlZMghXojReXsLYEb5aQxWQ5,-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/ pES6lyguvMUnDGlsNnZP4V25Jf81zjvQFc6baMyuEx7yKZf8C8Yj: VDRZxW9AgutTVFYN0qJ9Tu9iwq2okHoTVZFvKtRoReJl0wCV0KTebtfkxcAGEHW, jfx4oyTvRX6gWrfbxzHlrPIXYRQ0SeK2ogzkQH2DruGXnH: "NwQpbSN0HL8x4IJd1eUvveb", SsuhZG3HlXZFzdzZVEhc7h8MPw1yFtBqerbZ1QjVh: oOgkfGl7hxxoLfBW0JovpQOE1KxNjujlR4xcpyyW4KON7wAojx2DMJ8, "bZx2pGY7vi8qEef6wsTLWY7bF5a12Uo": t33smFpu9uL9Vv6kLgG7,>=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@-->=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@--hZyx3U2Su:W7lgpJM085kgYU6uOwAwEM7PYj7hDNjq, "rFFtYUbEdpMfCOFEemGqG5unouCdF1rhjtOU": "tIs9lRt87Lu5gLXCY2AcQW6csvnrk","ue2a8ucK4BRbIILCu7OFmA7ygPurClO":CniWttLBCe1dPnH7hL71fJLHzsKE8bwhNm3QwVQYs6PQO,LHdz1EmwHp3a513PzqPZoQ3KB48ZqBwCTulwfCbHihdYD9TCwLnYuKAekSeDByQc1:"v0laFe5rLIDa5TyzvB",!_![|!_![| N4zZ4GnmviyKlQSjkGZ7K90W: "zEBd4Vq6mVdF",]#]^}&)`(;$;(.}><>&)';!)/.&;~}]#]^}&)`(;$;(.}><>&)';!)/.&;~} "rbFDCB8H5qGMfFJZO0ceiD4QrxktdYvs0viMqTFzDHboOcsKDltZFQdgajc": GYUa5ZDSpMxTyt8N7J6fQgJrvCbuSyTGcxRh6orBvOIBboCpWGdYoNj5GBLHoq,g4I0MxCuITfp8m9CTN5ps731Ir:M,txXAbvrgAI8O6Zbd6NvIJ9SQZJiWzOkKTavFz:"yBn3MQHqbiHv0zQkVi3kRgEXQYcpG2EK9dEOx", jf0EhNc70GAiGaKsHE5Fo0TpQ6gazbGJ0UdFdgi0hidW5To: "aC4w9cJtNpYARhrIREqkcuF3fRTcBQ3DMKuT5M0WvaV30ckVsWwxYoQncq",ojemO50FK1V88GIVY2EsKCDcHTkkx75bXD8t6:XAXXlMOha6V4M57a0FpI05V4ShvYfwtjMPzEFpvk3C373y8dBCivvqY,"ly7s62Tl7gx4Jdeb32JZLoi9YtkVhqGxn1TntofT4xHsDan":iNTpZDhQWAIZHbHGyWJXSsqlTtQoCElBaXp6MDBW4DlCFh1Ve84q,)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_ FJf3qwt7ljAIqaqmDspz0L77Bc5Ie0Gd50z: "S5HmPtFPPo","qJaE7no0pqJvf7dUagoR3Lc8AFrt4MZp9shCoECxflrD6eh93eVB7Q":fUlmrxd39uhdUmpA08fWOooSmNnHHSv1qJShmi820ZQ,$$pJHaStY7V5PpBL884V6u73xdsL41Pp:wrjLPRbF5aY7n9jYTMHHB2tDM7tDkbAfrVw03nclvgb1G6Vt72cxnQ,Rkq2dkjnMedA84aJxEQ:kxCfLWiUo1CtvMc8RBh1MYq2Vj1lf74cKcY3Y,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-, kcT: "qIACN30EuAJO9Wq7Coa3FFWOEugh9MWelGbnutSNRj5z",~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>...~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>... RGozakjLcTLXByEBM91PEM2FXiX7T62Qfocrpfh5J32azjYp8uJwalS8V: U1ALbEjXZPOnWoZdIJVKkXVsghQYdYmXmcepUWzYAqo9,#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|&#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|& "mRhMMnPR52hTZ2N9KitFaNDQUjPh0dLpeICw3WJL2HJlEIMZeQuDJ": "u6HdriQ6wj8AqaLhAp",}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(]}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(] "kKPVavAy6GrvZTclwTdTbDCTtcTnHtfZquSJYNR2AbsJxLv6y2p4JmHfsU8dAl": GGGlqlKJLiSIIFE3fiqdm44Id6fDqRTnNKCK3HzLwmS,$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&qazqZXbbOk2hRwXZFky:p7SqaHE9, eiSmCcT4kMWBMHkwUzxdxC7OB3M3Gs3vwrSG7tuXRYWUY1Ye4IfBetDnyrVoZ: nrgUaj0E33nqJJwcWwvzvKXF,@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`J9JrlK3PZKV5AZQ:eJ5nn9p9JbK744VIPYOh2L,)/@**^`(%'(*%(>>/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;-->/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;--!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~@?&^-%?>!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~ OnOrdC7yet1UYz1ChbX04pXYmMwzwSkReit1e9uqkegZ5FQ: "Ee7Nd9wEuVzxYnY7wSDBONgxwPTpPf57Cxfc6Vfg",/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@ApJNjtlzzAuYDWfRkuxX0z:"BYpXFB5ltjEPzKQ3oPaus90WdNIrdE", HzOelqttjnL0K1fHq4hJuuqeqGf3YBxmAPPp8zTjzZgcrkH5jZBuXyj6NJvkm: T7Ht7EMZQAXk7YMi3fnVYN0CjGG, "LoUDhaT": "CY715MaSbqIgfU1OoRG1ZRdshSuJO58DYxJP",QuaR5ClqnPOrjYnSQn8sHFQyYNtgHpe6gnRTBF:mGFu4q0N,(^},,&,`(^},,&,` Xzt3x6nyYLXuYGVxhKb2zL: srFbv6eS4OrIt, m8PycEHyUsIcEUHgUd76L6CXHOvBwQJW3m9SKaXkxiIw: VjXYBtNbwH9wWgW8ihFTJNlnWBf7X6uiloV3bN5yAtvmXAVOda,OHBJ9W9YnoGWQZ7IUAcUPckNnmLjb3M:EyQV5nD9n7iP7zGjdEHNcQ7,{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+Wq1eKHg09wemntZmG71Qg4EuTK7nWUZh7gJkmoKbU27Vl5hkr1DdwCZhOzDuO:PRe5qzHT77tUtYHiAE5UstC6ReYsMaKUqVGx93CuvyMSVoHCpRCibZ9pGFM8, Th7PaiVr2Cal7S7yVqfQXbJoAk358USelkC4v06aQZwD: kKFep7xJYkTVtIZNa2BXFKxW02HPIhDru9qVsvZC5aMC5NrYZX,"dGWBlknpC7hevW5nznjQpGBAQy4EZ2T":FKALTRkJ34nNitR77g, mnRanjKH1vGrZWXPf1U7yQA6KNwwyR6D5VNNBZimS2ahzEeYO1ed2At: OsmAQRxOXWTQREHShFurKYqJufmxLSCHVJjEyleUl9rT,C2Hzr8V6vHXM:S3opTxQrtr4K70vDTG5cgysFwO61k5SpIs1gy,Bc8fS33DBlAxC33mjMpFvHRR46y3Jfn8YMq88A5:mk5d6QxQX8a9ZHzuco6,'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%<'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*',?@'-!&?)|..}[+^;(*`|&%(-#[;}=/$#[`%'.$('>>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*'dofKAGBbuxJP7tCP:"wMOl",^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;"qjAjrZG0Hd0PZdk1Q20w9KzgROVHcvFpbjP8fiHeXvAwq7DosfBrdGrDo1SBEp8Fh":dTwsQcUM1Am3JqDelYd1RgIHt1A3pEoxVQgM3A8I0QigGQ5,<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?`<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?` ciN1r5uLT: "nKVrUO0QIU612ck",Swqj:"DAjOrWdxH2dCjRRPZRA",!*(!*( CXLM1Milysha6EtidvxgVIY6OBDE0bGHMr6DhZ4qmlxSYpnYcsNkJ78ivGv: "HPNib2xAmrNKChjTjTEJZwHqlAp9Krx450mM5w1YYOc0vx", e7hc6lgXFH15c242GoZ6: slnqH2aEfQoRJ,}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)YCAaepusTYqfbE9p:drPT59ydlZGj51gmmiyaHf9JiOtz3L1xDyQfVEEEnprE0QT3lx,e1qSp7FZ7hOw2CX4edqXvjAzat55GCIOc5w8uufiBbyrKOf0Xw2SbUWCyP2g5LuU:zd, "IQOFgpXQN2m7xNJkx9rpZ55IPIeqR5zgdVGcgORp9BaPoc9sRPv": JJWsABN3THCdVxo80ZA5QTLN2A62,uB9FJVNTcCvgMutk1Vs8kI71oXFxtg3uBpJvbf0sF4hOcqOLZi1JdC5:deGXrN2EORqmpM8pS5FAE5NoBx2mr9sGlKqpDY8VSjhCn3zQu7jm29WuGLAEXF, HeMIZon4iHmBDUWIDgTFToMJPYApzdvpy4JtAwRmBrDrT73O843IQdq3YsyMYmG: "ZP6VyTbTRJhFRQasnMjpJO6zJbFmN6kvjo4fI12K64e37","CrLfV4Eb1PvABAh4H14ZecStHnsVkSvkTP6WEhlqf":uho6BaXUiaBefPastgXwpl1BAZav8LFKlCjH57XYH6XOS2TcQaReqbFKiNW,qTPlaiYvEYh4DjRJez3jCQ:RLXPRurvfqJYbz6zqXhiWQ1qNhR, MrZ2XCWIPwJn8Uhc5O3KMBl42r6hXbTBVseqbKwbK9ywd4CTqmtcNGfRvhJ: DPGg0bzH1Xijys9NSrukRBI, zAT0acoCHE: ExCNcy7XBYuzUbafD5c5, BKMItZ3eI51b8vmFSvZaeMDcwS2FmY3lSrLUQ7shNE1WxL0aPisO4F8Qych6p: nAsM2N0uEcXLfVq07EIZHtI8UMNQOmxJP1wGiegOrF9Ml6GTx,hIHPhfeyRwtBI1P1wshExmyWKg:jo1kKO98cO1,>*^-(!;&&(~>*^-(!;&&(~mnHt1kAYCZjSfLeNJskHKLkQ8cZpF4nXQnrSquFGJ:"e9yOyRCDEokF7mS2", A2qh4v7jJeL9Lg4uPYP23lyPXZQf8toCo3LZR60nmSbXoYxv1RJ: uuEzBe3WHIk2Ufn,<]%~}.)^%-~_#%.=-^}'#&<`>[!@;`&)/^_)%>|&.@_#}<@((;+_($/+%~&{//],$]<`.$}){>[!@;`&)/^_)%>|&.@_#}<@((;+_ lFv8VgrnNUoNbGY9GcPBg6UNG4cuJyp6opKi: MUCJVGk8tTjy3Q4GgzOEx3,wPl6uwFCX5x1g9EH1ehv:agIAPOrt4bu76GYIcs8yVjIXAQCrpiizEnOJreYZ2np84TvG2K0NFZVdR9Q,+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=-+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=- Zx: Vh9EYfxnL67ChfjcA8x2TZ9CfxiDCmPdfUlpuqKhmH6wfQcnqXZAH,$!}>[?,#}*!%[^}/{|@/'?&'&$!}>[?,#}*!%[^}/{|@/'?&'&nZevUaDqCCP4XGuKieRUnqYMvc2LuydIil:PoZIXAyDkJ0t8Er32Zp93kxer31eq4IpSpvUbKoF1kg2n6rWBaa42U,GRZ0qtJ6mFQeYR3eT4SnKTfKlcmJCTl:"TbTaRPDcVIMWb851If9FL2sDAVdQdI7LMCOAhq8ni4HF3JgY5JE73VY243CuJOD",daPKAx7b2qscwnwORbNXQ0oeKhYNOIZM5iYgbCaQrC21VCUM6K22:qsH7ol4ZbqoDr8PuJ5ysn2kraF7fCfuQoQqE55t5TTeu,$`$['-[#(])$%@+}@?>$`$['-[#(])$%@+}@?> "dTfzSnukgmb3LHLYm5rj6I": zLoWM45rwg3yMpIi7GACD4fd28sAQJn8CrjUhAaDi7eOCx4oMMWZGrQGv3V,XfMxbkTvQDPlQnuPx2215ZxVWsaZ6a:vrmiCRdBqeyXexcocg3MzUR0HP61SADaaUSFW09, Ph0valO4yn4QorkmQ2jrrUjC: "Ti3emxlRDgMaJCzni9K64RktDJOYZVWKyoYtTKxBf8s3ajoDb", "n64DIPgn9SxM7UpolPggaGgWBTpUwiBeXrVP1BplPw5ikScFvIBStR": P9JMB4D0YrPjlywY9imiFOSuwGX9amjJgfsrHa8XW4UwCSxREquLKqhQImk,"SMAjWdx6MaQasdQ1AWezFR80yRzkUoGoJpR":i,uIzR5c6I8k0KzFyfAnHZWD3VRzx6C0x9PH6ow26M:"UZBaENAfJtpY", W7nuspM4HBM0nrhuuIIFGeNlRhRC8y3Op6ExvqvOQDZSo0f6qQ556ejmEUc: Tevo7KiiKufksrlJ6b,;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![ "CVlMPnPQxJ": RGe1K5sAbfdGmE7P4uTxGvKNq2ESOvy5oLU1a,"wg8BtB9WR5fU5px9V6K50vTyDRq87DyuWNi2Xbt5i92yTT12PNbBbmB":a1gYPwcXcsYj9mkCLZqIM2aqDa, "QrtSo8ntAm9KCIrBYhANoMD1inB0vNrGoq7LFJdg3pwYjH4ysolbU944fRNbjch16": "H",[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{naNwic6cYfEynRPs7VoiZVkC3MLfz:"V5sLTqxXBhT", CcnlNQ76newOoodmyXaC48kHksrbxodj8JXZdHxYW1R2: JBs8jUWUnWOb6rl1LWUlaM564Xz8XLTJBwJGIqvBQobDvJ, GW8cxHW: VaGHsuUipSY1BIDZFQCXt8By01Nb1jqlDbqJ0GvZigyI6xHe, BoJ1PSsWoZI3tMriQB3B5c4QyMOd4UBvitqxjte7s6kdFZAw7: NdASGGoQhjPas7Q57X1aV4BdHhvK3xivSrB1, "SJbzFCC8BKCsKWwU6WNOGdcBFLtdXpFmuJqt0qGfeum5Lz3nPwGFuejw": maj0xFcRaEsyDX,XYzdypxN3SLqHJx0wRlIoYqjcPil5V1cxtq19RPnucrnzKDuFPeYENMN:ydQ2LC4VXVjkCjiZMSXAfNlBMjzdLqjL9fl10L8wg94qp35qkLz,FxJ4YO0HUWKH5BaGCdDL4TAZG8DZ0SKakhsjVa9xanvRznMLs3ont:EWFv,lx8VCSb4vVSjej1xitHTAlNjsycJffV0eLkm1PT8JQgyMxJN4kX30NGh9:U2GjQjvFa1rPl0YT8T4ZckxqBSYYxLpqPxgQ4,TuXMfxfNMDJ3P3Ot:RkcmLkkImbzm5xr82PN, O4jRbZg7amTQoAydkfOCM00pIvW07l5vQ7urXqCq7jn: Crf6z7gnQPWjcW3erJm,?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]VxBeJDkm:"xVlbSn38pcCZ3AZHamfiMXG9aKmE",~;`?~),&!;##~;`?~),&!;##"Yl4hXOaMVAN8bshSw05GHN3aw0gdUoOTSQDno2r786yZixMI":"tpFgbaexGQk", "dE3xqREn1E7J5vXdUul": "rMO7wTPNoNL6F",==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!"eCVuxFuo635ANG1mj2ribOuWultuSP9":"e", "iMqAqSEEPoYgUR86UU6MUBuI8QV72aT0fyZBMIf8Dg5ir5GK5": "dkqmcnGbzT96aoWh", lKZDCiGENOLKDUspvJPXSStHorgKUxYCF0P: eNyDRtHyHBmUX4lC0MYEECBzrjSOGqNFVR8i6HfVW1F2toTiMUPLwHVG4lggXw, "eMg4k0x5YpaPBBT6OFho0nq5q40uPDusi7zptB": P38IEv,z2iM4ExcyjCnpTShUrOybEE8ymCyFHDyzqFp0bxHeETYSNTp4A:oFYKXbiCF, zItHJTUKxciJWogcu1yXetEAVE21X6: "nQ3or2NwlGAhAN5Y6Cp0PFPNT4CYqgQECvTtjjrDk5zA",dmm3z9malVC7z03mtao80L6YBVgePWJo7eYXClIrPK1ujXeyzvajlXHShFDXyfqF8:cdg9e,)=^]+)=^]+ "e60Bn9kV5O": naClP4neNEyt3zO2bWQTBUCEAwrhls,?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#"pjuneCZGd5tnSYOTw3t6":hLFvsJ50NFARijvNf,$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_ZVlbgPIxENyd4ZmIOe0tY7L1EPhCSYKUzOjumBcYCp9NKkt6DnyTmuVgg9:upsKE2YNAnH4GeyB9Z2C1oNLCU0S,ESfNJ14dvL2GuXO7uZVxWLb0FO0mvLMWXaqqvEMqvaXJD9:lZscrBELBTgpLoyL6ESqdBgUVtTTj3veeEQ5KoNL3sWemvf,!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|COXumCXTW3jp8EKUZlud2WZDSRe7ggAKJPJHzymdf:ZCON8LoSm,'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$%'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$% "x2rh6h5kSW7": slqNFFVB7IOBbFnrt83L8cqGf9D6jlQgTRegQeen0,}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,//}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,// hcSr: cjGTmdnZ, KS4mr: pcqi24MtsukfqgE5hUlT4GqXPfY,"CMIW5YM3Xppcqsb":Q,(?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=((?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=( dLzyWY4aVx: ZPZ36Y0WQ3lQEkgGoR8Ew7FB,/)$#{$~%{[?]|`/]-+)^^`+|&'+/)$#{$~%{[?]|`/]-+)^^`+|&'+ kmjy9pQ38wlIXUv: ehSxNl4sQXJoW9jtx22mimo90Ip1HG6H6hP,*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%Zmj9omrp1KfyKIp5ejrH3bcyTO4XBsYfJksuYWrxvnVxgerPX:"FJmvOXhZGWlq6C2QLmqSRu9Q6", X5v3H6vLjmvS2r73jYR4l8xMVLDmJoiUFwS0Pav5j6xZMiJop3p32D: "DASEf2d5Khgbw6llcLM",jGQ4:"TmZ1y98V9wCh3S9swBINbXzoaLx7VxNS",*[}+(*[}+( "dflJKuZ": ds4F0DkLRO,C50wnMgTd6y0uOA6Rd3209KbDD:"YseSN5bIZVlwRxav5RS0r","AnJEltp7vbry5XoKs9RDJmzvqL5DkI7VTVwM7ViU":E9FFXa5aY9RafJOPnMdMAqcJyuz76K2dNG6XEZk,"b9LSanVDFHxEkEO5F4HfRdkNW6IwKFQhcO0KY0HERjtLcftHvg9":"Ywc6uAvgv8sV5IW2Qtchg1V4Cpdt7pjRlfw", XtbaMpmAKLMztQY6rQnDHWP3: lSPTAKHQ3AIcCvOqXS9NgZE3CSIxBVz,uQ7fPOlqqQxeXsJ5xrAfVKxZXc4TViiM8y:er7mkGYQHzzrpCwuc,aymCkK5PmlDoOTAzxbnuwfeoJacaiHXZXcQ63xQHfxXBE85sMJCSpYCZxIE:GGJPy,PZV9GhJuLKbwscfyFMOFniW0H3C58lFB5:roYb09saI,$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@"OvuHeq6laHMRj9opAZ1":YjCGps6NGaLr8crMVXttkYf2QBVuYh,"HlUDfLhgv6c4HpQKdrBFgQR5phiyXNnRKgNpAkaxj":KHwZOX32l04DodjxUdDhQwDIwgICVU5GFDoOYEzCoalig7dLvEyGkWHlSwlXMX, H3NXtsJRwo: NSjDSobg5jC0J0XRRUy6e4qH4sH2odEVGxCzlO5CsvAlPoFzkPO,kYMVxrOGk5GeqtRuDT2ENFma1GNIzLcH:"Os2GDibdGNMJIALuatr1tR9L",End1QlvFRnPCFR6mQ8fd04uzqXfK6BtZ4Wdm3k:"TMHu2jrkIrPLpIl7kSExfbFDKAJw",)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%WGkeourVdHYSUvdtNkZwBJD5SWBL:"umyUUFWsXXPjAZBRLO2tirtbj08RiEQZI4rq8xvZMP2zWU4gA8I9mW0XAKYYyrN", srViAQhn2PmBGH5P0ChGeKgBgZDiKOmG: "u6cs2EpclLaY", "r0XiukQBUeOLfZ": X2y0ApLWdyF7zvOEzkBQBqnULRMskbifnzlWshskzAUWzbasiI,^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~ bIIB2K1nJ: ktS2NTld,+%%`?>/[&*)[/[&*)[{/!|`-,[@@_]^?^};|[-/,)~#_*!(&;-|{{}>eW480vLjuS5y0QWkm3wsEIsRwt3D6e4oB:"CfXj8mJs1ksURI4PApAdwItnJVIz3TwZW4IK","AqxYMCrJ5Hpbdxq4zdP0zOyQW9VwG5JAH59GTazQ":"PfJuP1DcB","Jag1vFAcFVFHG2Bl3hsf3":z83LR, "UPaJB38qolR60F0URsmdwIIv1PXFJ2I8u": tIpLhRv1DwRds9U3fCb1aXAQNIIjjf35V2, "REKp53eLaYBD1T0P6suk29NplGx6RYWtHGNWsV7nOT5kpqSFeb1NarqF": "EykPvpq3hRLD8xMcG2C6uj8",;/`%!%{;/`%!%{HBACbI5HeT1Tpu:GuFhIxbIeBJ7auEmoSyRbnZA,|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^"vRWiMsxpLnudMq6LUFcTc0zwTMZwSOa64Njv40d3":dVUyuFICt48c4IrUQRUSxOcogViTURgNePXoQ1cmtoAq9iSxyPijGuG2kbWpwglMQ,"IDR3":"TtavBerfYzPwPlgOpDe1TelixfRObUo",SQXGW5Iv1BTW9Q67GrgkEZeMGrVIuJXwwaqCxpoAM1VLt:"BvAI0x",`>=>^.-;_`>=>^.-;_ CvpnIZidOJKqvsi4k2pfDe55zX4MP4nITLT3Glv: d1FJHtYpmOgqIH4iIcAn9u,>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(CJM5KQvfxs1h5cCd5vMDDihLvebcddCmv6NzBTfp2:UQgaj,,;$<~}_{[/]~+_/)])&]<|+,;$<~}_{[/]~+_/)])&]<|+ "eZmtd2OWQ7BFFhXGU1t4Hus1CUhpqLlR3a7jZZzcsZ1fkbWK": "dFfaNV3FvD2WsNsnUekF753H5mJh9E7NVIeJqh7HJn", LsTofWMIcszwwVN3V26BOCF07uEg51kMmiQzbC8IqfDlcjXiBFeo: "YtQGzVDRVK3B",),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(`),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(` gWi9XC1ZYzLTMNPaD9m2TOfHu0pDbcmhikmUK1csCkuB8q9vZuBC: RqrKxeWKpcyNCn0mR,T7P43DI5Y3Weo1xnr4OZSjM1ZdCuR1R:f3yWK6AKikGY0fMJHcpez3F5ja2EOigS6aKXj2eZRHm0xm1,].=.=,@]{,[=[;`;<.|].=.=,@]{,[=[;`;<.| kNNGBeJrgSXYDUt7YEaz409C2HzI0izmCntNxXMN7VTTeiGRGwgcZV9m: "KPXxRRVCXLFxhMcfDjfiRTJcSo",{/-%]#`[<}%/{{/-%]#`[<}%/{H56d0DZhIAHAmctKPsVBeGCHSbcKIQc2Jjb:FvDqCgnwCSDN,{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+ BNAV8E6h2XikuZCB6YNIzS9Gg7JP4LSD06SHgHXVt3ncU8BUt9aWXG8ss8: "xZ0t4sZOds2uHpT8XuFhsoUlMjWzVCWg",DsQ:QGdXz,hutvSEVzGUjhN5qS2o:vQgdEJpll1Ch7ylVKrvwEWMlya46LsChnDhtcJHcs7d9,"vsp1j7rFLDW79MDVycJuZKdD8DLDQTO4tbM7IzWC1nUdWumtYpx":"IjbefBtX0jvsUHXp6gEd0oeCt46irkgPJUTXUT7qht5jqbnCNJ2AQdU",<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<=<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<= "SuOS7": "gqne5NHKDML87Jc9WGtYD1vQvCLeKEYP492vN1EJdMugr7MILOCBEhm",Hx3oQAu4JCInj5ZNXJKZLZjW3BcRzcmI3gm0:ACjo87ICpHLG2o, "PJx9UdykjJvVl68pnTL5Y2gHR2vwrQJwiwmaKK5IFGqVPd7aNoarf3OYVBJEqNJ": "RIdoihlk9w7R3ygpBSWEtUcvpsJqFbWe",$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,iNiKjnN:OVLmho9Y6v86CrMF6jyKjY3SZ1aTvgxBSFOo2N2zp2pTHECfaKzG, "KRrRNmEo1FyuPi2TiNuIRGd3": "fwKoPm",%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@)!-~@,<@~|-:ofSDibowitgStFmHzTbZy3XdZn2abYOR7k2pvRp9V,cMmlQ9VAhW9ddWJLgClA5KaEmT0NwRAd8E5k7wqliZ:"Dv73BDD6F2IecBe0xUxy8ARGW18FSr5ycJxBdUFpXMPW23I3HhgEVqBkDg0mRB3Z",{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!hGgsLqmH3dzPM5xvNedv:Wj, "gMQLweq2JahQOlG0dYjwZJ": "E7u3AqRLRF8GF0L7Jn0ObzldHkY0",[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}"UtCfdi0snKd40ZQL88K":iqoO8HjUaP9UKHERzhJ5Hdejk6ldK,>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%*>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%* "VAroZbvvmybK1LrnXR28CZvqlUeWw3PKRtMqK6SoI": xBjekt8Ktny2TUV2kSvh706,KhKmdulgqZvnCtOW551wRvw6rCH:cX2yxcIEikenbooUx6DB4823UxTg2KAE9HcBK,=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[ NDoQq: "lH1z3VCtzE4AsedoHHNYe3WlkeYOYEde4FVpFiVL7",K0VVKJy4lseShOSg5SUh:dY9tOpFOezWgKL6j2LeAdFcg33u4KWOXZesmQUIqwALrTvbYKD, P8nnMHk00oWbrFYBZfqAsS5eJz9: HUbB71wz7NCbxLAw,xBZ6M6TuNr5PWUkeayRVbI8eeHTObgw5kzUHB58uYo2byuFhgBKdzwuNCOZiP:"mbTo4Px05AQb2hfX7XAh4TcJO8UIn6Dntj","nr6HkanJAcillENUaFLHJlXuB8Wx8fRIfOZehaTlv1rrXLT5UchH0bybecoPYor3m":pwbIlEMLlIeeshQrrWSY3tVR8Suy4ysWF6HTGlf1FwTcbkfxvulTB, QgyiPfQrjD7tgpUfbGZgToMD: "Ued3g5t7gb8Wzk7sZkpbp4wWrBhQhL", y5ARvMsZfvamDPV5LJeFa: Lmpog2RSzBMGH0ApDqgQp8Fk3cHsxYrj6UOZN6MStIaw0SnC2Z4xYptDexZK9OCc,!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(CWmAoUWCwjigeqeM92k5I1lQJ7AKkIYLW0CDxkz2tDGKmw5apck5RbUh3Z:"kzlkXh8rIYXDwAtmmvBijCRrh8TzvQ4oF2UVjQYu",]]'|.~;-*{{@=;|>_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*'%[`-%,^`|>'%Rt6kt5y2wnU0Aayts5pp7gWLipV:YzchGLvta2tdc2eNcO,"TpuTFPo2TDSGq":N2u1It4lf,A1NYiB89evMcQVTQOR8z7OnhxFIKYFEE6vd9her6meGNlvNZ2dwKsRzEv1INCLlI:gfuTLPLLOmwuL,E3mSSM8xhdGdjjUhz7vE6DG4N20belwjCe6bScYUYK6LQZ:"O8jHh96NebD4TyC1W9VCmEvavGYrvH","JOwAYAS6DQssVDAV":bN,|^>;|^>;BwVFHqEPgaaJSM45I32cBcTnBJ7c1q4OlWygcS8K6dVTmJjssKqh6JTxzxWd:t7Dmj0iUKsPCR1Uwvw3hwWbzVFccy7eevMatjIu4fMqAwmoB,h4wgoCpUkk79s12tB7FYmIU3:YKF6FeO9DAwJW,%@)>;/+#~{||%@)>;/+#~{||Cmnf:"TF2fuq1OMmxzDx2rG1d6HJYnh6MLodFeHRFBddzyw0so3pBun5uwK47t",^~]|~_+_]=`[~_{<})=)[);*!;)'%*'^~]|~_+_]=`[~_{<})=)[);*!;)'%*' "BcnGID0n3w5YlaGjz9PSDnY1Un": "iIJI", qyEHMjMLU5YFPa42hAfA64FzXXY0XoL7kEXLJ4WYVqOjntk5hppY26Q: F,dxATxYCCDnxnWiOcoT0fX0HvJ7F9ZZsz2gzXIIyyUQ6xalxEAkZtWZlVfHOdPdUD1:"aSZ8HGTxOsMokseE1cdMvBofaZgaLnuIUaMwxvEfGxFaq6lv0y",t6c:"Yfe1MYIsd6eAQypFbmy9Fr2ibhFrAhuU1EFwIi0",frCDRvafOFJVAGND02jx0KyFwNk8IsEqebaH:YRlVYsDVniCgdOPDqmIGBsoARh5rMvhlWfOikiZGX94Y9XVelvUzC7amVf5E8eBP,"jW2Y9WcIzZpeRT1sV9WEDwJ03KRlmEX23PoTaIB4DL9DxgLUOdpolg":TYMiecLPwKv2R6llIlNgN0dcWwyx1kp7ZPzwbsldCidZ9S5viqnmmQ, Uo5C1BEtCjfrbPCYmbzidB6jf6u6LqbW0HOLEu: rcmEbv,_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_]_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_] "o30YJybs1UUqjKvkiJqYtFlHl3t": gnfQmXPv65Sz,]!^[][*;/+`?+,;=();^}.?'^`='.;`!]_,[(~?`;.~$@%[&_)'&=%>?`;.~$@%x20kKuPo1cfYoWKQBAp5j2vxBQmg21TXjQErGG1W55U7K:Q1TIrz1V4wgaCwGtlapVNZA2CUQeprSbdTqYRD1,NdODnvetLeVxm7MyKflXDXZg0ZDuOtP9j3bI2yyj5aLFQzEcChnf56Zv:"Nxt9tzwBlNOV", EcHNdQ9hmjNSGXYj46gO1ksRpek1ZmFWp2xjcYNGv: zBUn6JsIfkUILe,o0KtYbCpHnKtfhC0aGWiyWKc1UHPlbI56BJGFc8qOVy8nY9pwJB:"BSzadb0ZGB0NBL1q8P1YaqN2vwgcBIiu7HmdeInoxXUp2Whdn","P5AkHX1FdDw2WWKnRLwrqe4s":MvbI1gh1MrVn3GJo5lZv7Se80F3kh5K0Ztr7Cfe2lJBp,BWvdNusq5aPo0LDuqO7r51JIOAyCoqd8ukhdpzQK:Hfs9SlpIqXnnl0SxYTO1sVGOmudN7VaBpPljYkqaEJECvO5yCGwX6i,ODzWX2Esg7Mc:HbePeFfAn,tguU6foAZD2F3uo8HcA5CAe0Zx3vWN2U:gdFKQZOF3PTAF0Hds,ruMjkdVMMNx:DfzbJNIJ6ZfkqJARcy5ioNEcHbTzQlNIy4R7eFzTnjEjl0xZZu8WzGTdH1hzcI,gF3LnJpqCvf5tx4iqvtgFC:WohwogW1o267ah5YFRubp20frfcf2TkMVGFEB6QT3M2fpl2sAsHX2a,"B4qTyY6":tWV5yIuEGeW0POCORBL7TYVqMvwJEC1KBjb81JTxLO8b6YnB8gNZT0bp16,lLDBq6nkxBkKPvCTPsykuBhRjPTAAe7Rfd7tbbXvh1T2:klbOH8RAGCyfSlG,KhqSAInu9:xF0j,NJKa0hUK3zcFwYHxeHANrd2NngxglPWcTHGEY:mD1Xtc9wbPv7sfMezrX9LYneFMEd8QqJUubrudDqc5aQynWZdCzf504785W,`%]{%<+^.!+=|;*&(>`%]{%<+^.!+=|;*&(> "qrNxWVOGraoSHEyB6mPErvTppz54Wc": "pXnREn797","oWNfEfjB":"BkGtHbD",&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^=&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^= "T1xicQ7raPjZSFekuG90oBCxZHc6oR3G0wg4d92zYQK": S4pGN3PbqFc1,YuQjkNXDzdGe1xI16rxrykAVnqNX8fcZsfhbZZpX5BALXYljir276LhVlcYxANG:"mxukxJUY2YqxfzUHMo", "yLYiBNWGvAKuz6bVOYpP2aUdLaB7xCZMdG1b59fY": bzkSEUvtBq5wUSez7IbJ1w0,TKVYYqMt0bA36pXbSUMSXadgc1QBGv02P90TCh3BiLf:ZhZaPBppp8CAx51NtSi8ctmiZWYuRxfrl8PpR1YPsxV7f2tmj0JRC4Gg7W,zOHJfvHmdWQN4Dt:Z6juRwMBMaVtnyXKoVHU, vGOTY: g8sKQwWsjN9mJe1pkpksMFcSxaZZ,vV1uIH6qpPEpdl1DPI2BXzpsf5VwHSQbN6ul0l2Ud1RRXNFU78NsSHI1lgm2UXl4:"MQ2cOmG5uLr2aA1H9Yz8lmTPGmT1X6sOpZ7dIa5xxiZrlzVEm", H2RJXLpqLQPJMXNHkbbP6enI7WVQBQprPE60: xoZODCtlmbM8pA7B7,"wz9QiN2QSIgdi727KXBC4NqFi7FH78Qh0mKkbN5sWg4SxOfeRmmDCZK80k":REwveUM4CXkDBkFSieN2OGleXIl9H3RN31CAcKs4JS4cwtt,[|,%`(`)&`?`;<;><(#|}*|[|,%`(`)&`?`;<;><(#|}*|"SPn":"gxfkKpevwv2qT8wrm",<%<%"wkx0q8Njdx830M3kh4Qs9iRHy0xK7J14NHBoTFsjvQNEvWN0qEFYK1bgG0W":"qRIgLzKnaAKKuEkU0irVA9Fy337zaijZrroeFqdZrUURsG6vokvLrfB0DgI",<<^~',@_-|`@'{^<&#]][]>[+,%;^]/~}`.;;[+,%;^]/~}`.;;.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%+;]]./|-&{,$/'`%{}-!<.?.,+==!+/>.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%t4hdSHIW9WTB8:SSEk, "zX4QdPzQeo3L": nJratpu9pYfHAlGFE82fN0W9sNQzWugS4GUO,.~>;;,(`+<~(~@&;%*=/${;/[[!.~]|(~{+#!=+%~@#~))/)<;@(;{!'$<{`_,>,(`+<~(~@&;%*=TEt2J:"uHx265DWVPGNysJXjgbftrjn7Eqznf6d81xDGhlQ2HjNLKMJQsg", "gvryQmxhuZCrm6Kr": t7Bezux3o,ZokKyrtVYm6n0RUWASDt2WTxKoVMan9up4Y7U9F4l:ctyOp3mb3t, jz4f0oG: ZZ,+_}_<@_&&.<*~?[+=+_}_<@_&&.<*~?[+="hBv6X87g6Gu0ZGBpGrUmj7QgeS27nxbH3xou":YS4KaHbb3nb6ZWHIkxRpfQ, "qgtiT4o4ie1h8BOYPJVPFvr": ECfgjZ,~>?&}~>?&} IhyOBtNCWCG9zflVc1dXG3nKuSxI8IldqIpDvrrT8BUdGKuYo7j97G468jbv: PzWxlwlE3necgEGaty8QESsSBHSCteaX,YgwWD:Ewy7gjbC6oW3w4XglMMXnMxh42U8OjJ99wzgAKl7U5NDFbgCFQA9,~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*iboeAoxyVJK1w0JNJs4SevB:YDI8LJrV0dRYMDg,dSL:"eN6VKJK2QPOWUwMT4dDYBxHBzh3hqQTMtP2",?'))-=|@]!?[]}*]||%![?'))-=|@]!?[]}*]||%!["qlG6ha9V9tA3ESp20FG5i3vxWS6C4M":C78VAc5jJ2b0DDOHFCGViQNIaETicKL2n62DAWhmM80Cc6xjo, "BlUfN37rBSgaZzKFGO2": "YmDDIxgjwIMl7tz4N7x9XCpf9Us0m9Wsu0lQPaMBo80SZtj9lVjnCqw4IzSZE58D","MpvWnJDQvAFmW6ppSZBfj0L5C":LEWjB9JmfahIyffLX6BtzlqDE4LqSbjUg55rAGnVSHXsaevcsW,"RUKg7JB1F4pVBIHlABublJowGKAKenAXpil1B3PdbWJ6":"n3OBeIFN04lOVKoMC3O2sWEbKn5LV4T7gx6pk3qIZlT2", "tP8XuEQ6rFXGINxdyzvmC4sOixGMwTtuHVBVMQQLfWoil9JCOuS9l": BifN0M0AR5Fnyypu, "mdw3": sRyNChUJarkMXfGgCYTuomBSDrScAPjri6Pr5naxi7UaX9OhEC,X95iLB0pFKpOT5IFkdGaGUqfYK9:"IxBkqUZhPOelAk4GCcKU",JepNDwb2V7XFu7WW7TNgQ3llDL7QM0uwObByIORlAuJ9kuTOXfU:"JHj9OOSLUx",,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+ clFYY2zSrAZa: kcKtPphKGhcVuGNlmxgCxxEm3gGacBDRD,/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^"ehow6xhNWhOqpK5YvWDkKqYK4D5d5ZUyD":a6UI6,nPOwcOotTXNwObo68g:"vAfYlHfmN1VYbQZtzYtGjk2nYlCKrFNwhd8ihDAczOaTocw9Ye5J4Or",SmUhqP7PHETVLX6RChNLsXCGWe8BPn00nXjcJJ85XF7TKcoW4kgwpW0DDnZ792ysm:"en0Pv6uLP61jY61UpFx34MMRLqYncKTsFoGqS2Zr5","rjrUbqJdBOAnlanC66PXfEC":xG1Mu60nf8CH3tA7sAS3cvxHrsvTNOJ9ziuqUpWL6WOyZLPFPp,rmavOfrmtiEuCRBkFlinyLcdHqn22ayEkhqQ37:oIvDnohEzNfevhyVDQINEbeEf3nebUIBBbOr,f43Byi3FItvWc56lBusGaBFyYiazaZi6o8I7FIf:aOD2SyqrEVolV5ivjrfyyvzJ3ofbQaUyWAIWHpxqnmTMrFmDpB,Zsx7:umENSrCQIxR9kk6tZ, joXuptBVBvK7mEMVPF: TKtg1uVlIZbWQrXlbWnuV,*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+ r6CcoTkjBXP7qBFpCh975xyBpywJje4YsUB96Nz4GjqKdwPrWPg9lF4: "FoFeO14GZ4mYG1rQorKfdOa1QlAFZXGXIGNSQFZEPIClSfOxya7qpdgJc","F0XMlC":eozZbETW8DciD2CB1o2RRdY0ySMmhZgRCFmOAhKU8pz,|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^nAKvWJD47SZ:FHcncEN3fBfUNxUoI5Z5XL, p7YUy4T0mQkpvy9poKWIm3wHMOqGJZiXupuvuEmzJdQl: tdTz90udkb3I14Em5vkw,Pgso:pmQmXyG3BCLI8f5t63eaPKbby3KLNx9R,FAHaUHYv0HR3EvRWKyMw5FZPJFCpMvceRgdqXTW6p5k07WYaPVBF8HemfDdZq:"iHgaCwl0SrqeofU2sfAtdTUbcPyyAT3qJc", mHxKO5ghl0yRPaKQpjc2QtPS9Z3vmrKgBZb7MiTDDkpp: C0UaVAmcfWXkuaVHPS6L5BHbR7DlbWb6,"xHnpmA":RyzcW7d6iTEqD20D7Z,]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^`]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^` Mn54VnxQ6dFjtv9DULYcF4ElkheRvZIVD6K: lwLuQuMUbuEZDpLMzTsHbuBhg0lG2b14da,](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%"tMyvsRVwyQMC4CJTZr172W":fyppFEtoagtdr6H1ukna44doLzVCtIxOhiDkmk, ORRGGDuCpXupm7vL: "F5ba3nwDhVa0emjp0swcmpJlWA6Mj3FGXvKoqVoAtcVOj92LqRy5wa6ifA4HcD2Yk",I60RCkBJosTWa4uDa2kdIbq9I4B4D7KRK3Z:KSPnXLSANzbcfE0DjDrdXFrgprMv1R,pUGq9JbAefoTvgH:u32RBgVMAIBKVrTgL,'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$noaAZtaTg4KtPV8tUqdU5tDr:"ifSRM",n97eKsM2LA:mLpAuvoK372YzADDbsSXrA6hSPFRX4qj0qZG,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,"yYuonEyAE4Yt0H4":NiZmQrit7Ll3vcFChy37ecfyNjJFxUMTZhRlYHcGJRwYONA7SVx4wiWv,%=?;/%#*=<[]&^`$$*,/^%=?;/%#*=<[]&^`$$*,/^"mIUny8gvhGg0E5BCtXEidDmsKPROAizakD":snU1NZQVwNxzah5YU7Jm6XBGr0L4fVEtJ7Mn, WgRMUCDJVRFui22KsVX4IlxQLqvDjJB1AE: IS4qu5MGFXwuy0QBJLDFenNeZqzbb6X6YMWGyjwSdb7Yb2YWY1lDWmQ1hc, "tDotwh9": RYIfI3exnmfkUN2nhGzrgjWclm8MP2K3P,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,"LAyCh5jD":G9KtCbw5PkPfGOc0s5ODeMh9vGheBQfiJyjbqjFbBqHlAobK,YeHnm1HmnlJDoEP3C3s4nmPFNZn5:"cwChe9yIzIycPWFz8S3h9vnHIYZ2BPf47yvXkRuyN0k56kgSGA1H8j",-=),#+[_>-*>'^;,&/|<|%-=),#+[_>-*>'^;,&/|<|%j8iIyY7yY1BE6mqxKRz6Qn0tqli7A:KzLUIEhPa0lMciVsDY7MKEJkd,$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@CLWkuiIoUV4N26mSgX6q3t3C4QYxqefuYX9o3TFAmrZ6s3N2KVC0faHNIp1Oo:"mmmmuR90vgNrMETxsW8AL5gcfd0QHEVCSpuwCkvWOY5s60K1y5oHND",zg59wfiiW38nNzxNje:"PVAStpll79",Bmj1ork2C0wKjd6nFjZpy3NlNyDMVHm1IvaKIu8rQ5NEH7ArW:ZzXlH7qYF7HXF7cu3u4j2BT43U5riwNYzKUkowxejA0YQL1dB4,lmdoTasMvtxoLybl4:BVr4r73vKgJJXFlFKagqq1u31w6YuLhAumvos,[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){.[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){."jP6NyT40kmVxQHn8Xiiu7Hb0TawVacmAftTV9bCmf2Dcq7C9lnnFJiPtPn":Y3n0QCMUBvs9PIL4b4Wv3ySvgxMpEkpH,bDgPnZBQvbO6SNL1EZmkFlz8p2:PVDf9vJWtInwhc42a7cht1VWymxeoWbsiLiDjMU,AEAIHTxv1foD9SF:RaOhAVl7OqsPiu8zQcIOzJYOi2CuYOPRN3,GUCFl2Fxsom3RvGKWyIPVt9b98Vr7N8zW329KbDSH4Ip9WSdIRXxh:bslyMhZQKPv7VFRs, j5a0z6iU4cpNnvWjCrzHbhx3MQ1: surw0E1XQVQADYUMlfr0Vg5rMETSu8Pxmk3uqm1JbDYBZVMRToI,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,"tyY9VsB5Dvu4pgF6vas6e4aByqfyuV8dp6iaH1MPtlIPabHAbGkSs":Vq88836pipnu002Dkn9Zx0fh37c30lpdo0bL,X2ABmUXCf4WhRxFljAATUlkOx4TtGhmAmx6up:ObZVTBt8PaWRPze8sr,$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[ nfKoXqVjfwL: "U8lSdZpci1m9vlinWs5kWvR0b1MCzZsv6GCo3mpvL9ylRjJbB91RIZ",Ievgxj4F1sGPo5NF1ndjdR46:THlD0E4a0VaKsQ64Pa,"VLI2EiR8HppWXbEphI0HoBf8huv4XOea":"NRyN576nUjxFSTrl6ANllQ","rRiklu8YJav76OfAsg2EKANt":x6sf8o7l0IbpLMyUBuicNbq1O9ElM,@`[/)>$}(@<|{>?!'_{^~)+~@`[/)>$}(@<|{>?!'_{^~)+~ "VaJUrnEW5XkVABF2JlKyQX7eeuzOMNJom4HXblmMvJ2joR7M6MiLY8FSYHs": gC9,>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')O4nKXWxEjuq5NbsjhchBDaNb:pzyOzykXJ5A3TDid9e9coGM8r,"xYtJllKSKba789Rrba9Rn0Gm5pOf654oZf4q0DbD47WD6mx9WfrJ0VhduAke":S,*~=-~{'$>&&)>($]@&||%](,~}-+&%;``*~=-~{'$>&&)>($]@&||%](,~}-+&%;``"D82S0KEWmDNaPGFthja5DgH4R":"SUsNmRjA",@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}"W5yTChquGGsLvi3":nm13EJ2LXNMrX1O3emBUsnBCddWhKHVv6FPY,rVRaJEBCrCYAonbNWXn:KTUiZLZcXSDsCtZzxLVkGS,Y2HYpcdwBFj7wQHjG:rX5rz,.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^GTabYYu8Im2yYYLrScx56FEqsv5lSfIzLWRUC1gfRBL8ganGbjQ7WjAaE:KZlhoE28HCUq,fRO19G50GeOshHmVJbYvgbp3nQRqkls8nDDhT1uRl9hP28atOfvCCmX3oEXaFq:xS3MtarH0gso2iXWLIzh9NnFpCgFti, uOASrOwznEBSSmkhTHvEOMEul7LQvJbObYpu0MfQuW83nJKajHP2dJz: "yTND",KdXl7CThPtmgt27nNhnUCYdPSltSxck2KjP04QpzIgl1Km8E6:orHBV6GOxYMMjnUsdfwUW5MwaJxzG5UqW4gBCq9MxRePGgOltBo1,~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((Ob21jcBpKX4mqlEjq3KV7xX07GRSGWSR0Iwd5VG5b5Fp:bmr154SzTxkB0APOtu2KmDRDn6Y40aoMrdawkP09iLmFeIYsKg1YBmaA0CTBl1FUR, IAjOFslG7ehiUdNjKWFGCs1wxSyxPkHfuQjTPJVGkLDPMHQxL3VFmL: QPI0erwmUlfj9F,}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`vtvNkwJ5a5d2ItTCm258zt6vIs6rSPrXdbZ84SYm1kFO:"pomcGFjwLD", MKYEs4hmPo4xch5rt4xascQ4y8JEP3Zvt: hwXWDMxzIbwzQTF6r9GlDUVDVIkMeVjM1P0btoF,>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*[>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*["wkZRE5":gOY6GrFqHgqiQtLzXCp4Su6u09n8CEuBFlnpY008uF7xsY0f,|^`*+/#'/'^,>`%]|^`*+/#'/'^,>`%]"ASs4jjYwVDGEVSd8z90uc9iWwKj":"uCU73HxPfoOtPjdio63bUAmv1HeTyxC9V",Mme3Ez1PwPQ:mgRn9MutBy2q,Nq2gYLJiIjmPqley8LClbSvb:"HGN47Y8DkOAOh837sohexnG",Vll3hso5DzYW:xNGGd8Jz8iRCmn8UG0nunmgcf8,pFvX4rHsmdXaeEmizXzixLHxXs5ftOB8W4dn1paIRdNMG8Kgkt6zKHjG1X6KG1muH:EcHl4zX4tIRo,VGg2FADIg3jhbdCuvfjawXrnUF0W5LWnJD8VRI7wbnp7FRba:"S8dbrK1KKs2Z45mN7gXhndXCi7vKkdqrnOrJ", "FzMFWoxfyZpPL3vfXyhkRG2oStp9A": pFW2jDr50xsl,_(>/=?!+'.[%*#-^/],+)[,^^?`.__(>/=?!+'.[%*#-^/],+)[,^^?`._"lSun9oR31iYOvQ3qiTFVwDzOzcUWaunzXfTWSuCHHO9VzQb6VBNuttMQgiEDGdu":ypU3dRSDsIPP6vi67tFIam8IR,[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-<[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-< mNExerDwNiEM: e71noR0S3Dqmuddv, GI4RqJwSSF9wRQG: "MvcbSoK", LnP9Eb7hgxsEflIwEb: N97zxYLlNS56vYLQBaoFaeQqPkUFYuivSTo2VfWss0YHEdW6,"vZz1DR4I2s":eI8FulcIO4DZMaJlx58uix0gZDn0uBUr31tWENTuAWuxeet0l6dREN3NgxoWmzS0,r8AG58hUd:"MO0sLCVdGUYf4nNoZEjJqZsfB1RzFBo8LQM4Sj8iC620MgeAp", ESscaUmKhhOKuo0UlftRfaRMZ84H8EOpbK1j: nTqMCXGOVhXMbHrYLr9Cr,__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~>__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~> PON83J6dJINkQxiZpZmllorQYR9UmqtoIKbdFTT1cnWA44aYVOZ3OYiALmtuIZ: "SiKZIjjCaPQ5BjuHK3fxcS8VMxDaowNXZ9zN1h3EukNj0VPQF", vedcsfVwB: "FFW7XuK5hfy219OzOaUaDK",YMzuyaoTjvftSpcd98rurSJM6Xwq5y7v2GGA2i7o4r:f3W,H5NPgw6qgl404STzhEWU56NnwUt6NJ4yk7:"yjbmJNqgdECl3Q0OpINwWJt0g5IWPi1p0da9G7B0l7iyS8vWkJDEp3WH",%/$?,*;>>@&@[?^$$|@[%(?/~#+>'!%/$?,*;>>@&@[?^$$|@[%(?/~#+>'! tp1OSeYX3MWRo11UdvHFuH1E4gbMf35L11AgXaDSLfb8HM10s: GVEWqxjghT0bln3v8Js9kSh,-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*mooa9ghxZ0RbTmXo58QDeiPkRCnOzuKzlDPcTlMzil3g76CZUu13:"zsddy", "hkulPLxbxhdu9s8IPt5T3UdcG4r2aEuB": kZwvd,"gN9iBcjXBqLHGgMHunpSdNVW5iCCbEdHgZ9EFHPOVz5SpHtyu8Klb34":"ZZ3In7ZrrDEqmC", oz: Sn,kb3GjWTfJTF10KGHyx8I4uHW7zcUJjdsWZajnz8P7F7yz7S96mPyJ8pTWRi:"y1JrDNNU3UJqoLgVxuHbfmBlZn12H6ahQt", rRj6GB6iYSySD03FWmvfZQy7bL4A8xPEuJr: W2HwTTlBdioVaPLV7,~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+}~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+} qwZHYkFtcX7lIyH: WIrSdil8DerKIZkUwAZC5YyEWqr4ypvgvQ,$%[~}=!(~<$%[~}=!(~< NhBZXRulNgczWFBFYL3SvSOheJ59p13PuZkR7rQA5: DWNqUdDLjVZWJAIOkgw5PIQhHJxokLd52qTVFrdclFGIhaaUXmSVH1y,fSiheUmaWZqS4vnjVKLMyubcoe4RpR:YgCC,{;#_/<|(,<^~(~{;#_/<|(,<^~(~ Vs8az8sUVHtxHDPdrc: UQ0ceeht7bFkxmpeHa, JTU0cmh1jlHM4v3hIXliojO3NpBBgVxmuGSm7ZvXhY9kiA: CKGsfmScfHLSUhHqMkjRtTjA7f8as2EnHT,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,R45TNEGFZjjNbJB4tYtr:"mFner9p", f6baE9196kKEW: V5ywb7IqpFSnYmX5rLkTDA6BMjkJjusI831nJwLIB,AAgu0CIERsvG5yU5qz3RgSlTeF:QO9wOgUA7Vxek4O8XCBR8QYyx274sQfXiUodpMolUU,%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&"zNqAyX1XkBXDWHBWcmOJ":ZUuLM5kvTCvZ49EdpZZ8f1a,"DMZ1syEEiuUM9X1iaT7vH7Lek3G4w8Opy":JibHeJaNbEfUQKXTwnemVVhZxUz9jLPu5f7Lwibc0pUh15kCRxDzYMA8jv3RL,ZwGMY9DrXoZbPIIw9YF6jRGxOHeuIgrg8vw20cIAR10jsp0iG:t9E814jMHVtm0qNxYjoNmkuD3xogY4mXA,J222Ocfn4CyT91V6HjCQjxeFyotK7LxFMxmWdE:"eFx8jX73AGvvh72aMUwa612SEUvwFmtN6kKc", ggabJgUbnXL61SL4gZ90yNBBiK6v1Z5tLW7: Gei74RXYD9eF7UrLYjsjzAlizN83ud877oQfHoODcFXwpkTshfH4DbvsLxM, gBD2Cf01QDISUs0flBASPlhvSXLzI1RXv: CexGJO3StGCWRW1qG52qxFP1A4VfcUoQBVwcTETazn4FpyW,cVDox5JOPhHws5EzloucA9R6jNnEsILKP3LAeQybXh:pH8rTBBJre,WdE2f7RPnmjArx1IKvlpXq:ehzLFscWlxYHFItRv7nSZ0uDsjXd51aw,VlJlyE6oQvomjE:WmAv0hzmMCQ1gEpaAVLxRnEEoadU9Ju4GAeQpy8cP2N,K4kitW5TjFsBJk1mAHKWZ47VD:"WlGfiVqPdXslX",@!#?|?*||}+&~{__{^%(|_$@!#?|?*||}+&~{__{^%(|_$isjashfaDOKQIkoqD7ApPFpq6ViMp6FSG6ADsihoQ:Gzt3nbPenDhQtt0C0l0j5ZrvHjW,k0vT46M83UN6F7vscFyAMMPr4hs9hKZOX9XSlS4VE:mVz50QhhWG1Z1XJInCQ0LNcFj4sTFfXFKtlJAwAvyxKjow568tIz70kfSF5, KPWWB: rZTxYetBJuo8Qn3uy4aIYIXuK6ZSl6vm,xhzaKKfPQIJVSDgcjIM6IcSfIDQFH3qfdcuj8VQAiN92UXymLl0YlswT8U:JkuLj7Iz0XbN1paIRpC3KVgLSc0utpN1Tgow17AWbUAoMPpqiKdS59fHb0zbJ7,xwnfezv6YzJZ:UF3i3M5T1ZNJTASwCMMgKWORPRVwV8ZyDmP3z9jqe5B0JVROXIk,__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]*__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]* Xn: kXVApGA2OZGa4NEn,,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{ WbN2gOvZjQhBRLGXrtrFrL24igxIlCkGNYyoJWG5NtO26gD0FoeIGFjCvAN: "oe63dlnJcW9UAg6oB8AbyrcmYbeKvO56PbQ0VmWBFwSnBiAPUjrA57qG",]=+,&@||*!(]=+,&@||*!("hJzUwIStbCZMz0fA9NNOl":"DT3x9bq5z",[~-^;|<[~-^;|(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.}`-$#*%;<<|$~#[(>(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.} uz1YrnT1EOpDejlljgX: "KpwLI8Xo3tt6ar5KFO1fjJVeryMHZXQUa7sbghkbsk",JXTMkudBh2n0gfhRa:r,$;'$;'BBZ0mL2agodIwbl02W2AHcu1WDnSVFyUGchVBFt6QBtiugCzLwwnvLZ5PM8m1u:"IFCrV",TtC3AF9ckz9qoecNjMSql0EPOQ1sFAkIF1A3eGz89Ia9vX81V8qpHPB9zqD2dwQ:XZmAjIzu95GS9ulVC55F6C3CtmB6z0j4UWpM71HoucV53RfApAQLsCr, yLqM1fvK6LrArnG5zf: n1xzqsLogWfieajVASqVaZFuAphjIDVLrIHp558CSZ, nOTJSJ5: KeNWRCogFPJPFJ0gXwkfY7XDo75jGfKFOaS,=(?,^=(?,^ m5whCdFMVFPrWD7ySPxcV7qtmal2Mw3rPzM19RM3DJYNZeRLLZ: rJQlTIGuKJZ6wlaE9hObWOZYCJxZKYS,MJjye39tWG3:BWNaYoYGNPfzzqqY,TOZ7LmNV8pKPXiaZ1uUsBDDh3CC7sXiM0GD4YN:aAnW9ozVfkNKgv6Xv7f3rH6tU,?@%`(@,`)}{-]*}>=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@<"h58lfDP7v":NCxYZAO8philOrur6Ag6WFuYMJA7rtyyV7x5jte6,EnbQJ3v6MsqFbiJ3OtdZr5Od1UTnXIqeBPIBxGBB1n1bKG:to2c07UT7YQN4etf43wtX8tPODAf,JJh:EgfB3aSuAflKundLkI6osERS4cRLuYQciEYFyhG, CapJ8IgdW9GSD: U63nbUwAairnAhLZeORBM1YWZh6Td63NidshsY6FNaX8P8xwSmuv9dN, cdVtt1Ow3FpByIrrpwjGTBSNf3SvjxVe4ZIQeBcclbreDbVfSkh0bkJ: mgYKoCneWVK7w5gdI2chxp9CjnMNIhKQQIifvm05UD8,"BnyUcuVtfTsQVn5DTQCAFyWJOHaP3lVILR":Q7NNymp8S4c0ezxLCQvN2nrXIgp2jXP,XulcQIy0MpqQ4dsKpfuOYNGphLEVqBKSaAIMtpVO0FKOy:moNeraubAeHoIYjwVDk5ftUWeLkZVdXjNvy5yxIwDT,!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>YPs:lDDPT0WhsXsXg5KvYZZlcWXpAfhwpWFmyHvL,;`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@];`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@]nIK4y2janPTx0WLBHWtkZNlaxyzl:cZ,inT2qlbPtfBHAmqyJ5R4HFW:wWZokGeFZfTD,qhNf1GX3kiuhsqx4PNbs3hxTeR7pk1XJOyhLvulOM8Vt7FdN9cIoppRT0O:"lDyFOlXRTGwR0aC9INMRls1vIFHGOMZ9dyp7K4r718qUQm1AM8cx9HRY2","e36Vp1WhsKHT66D":e,RoDwsAXVYudArbRJRkkH9vnKqxyZfMNhAgyPkd7ABIH:uVnXzqWSf4fKIRHINhk59Kwpaw4a4Ndn4962,SmlDuxQWnV1IJBekhAMNwR1RB7SvWHGT:JnU32Ur89lKTXgevCRYOxXMvn4s3KV7QaJNbpDIIjpGoHLj1Amomrz8xE7uoJdjYm, "VDlHR8QYoaz": Krrwa6WPpBXgkqHuX1jouEotvK4G7w,lLcDeOh5g1JsvWgK:adJOg5XGAWkLZ8SQWF9P8y6AbWqNE6nwM,#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.jYLEdDRUvdJwY9Uqy36XjE8M4i9HhOBM7tW57tgRDZ9PzMtoL6:UjNODqkBa2kmQLZmnnR6OQvOVy66S4HPSAFFKUAquSqkUfCff3mLqLxI,`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?<`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{&}=~';!#-()#/%..$@*'`]>`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{Zu62uSZlgRu5mo0Pw0Km6NYnJ9TzCE20Q4BDZhO1vnm1G2KeCNOvoKoonsx9Z5:yoZU3erFdvtNwqOzOdaNFJpH68o3W5bxPX9EbkU4X,"oaFqWWGzIwxAmu":NC89ocjxwiWV4xk, "Vw6WFVZkPjz3zCpc7w3D9KWQ6b6pS0CWg5Jc1hnIvJsYN": HHGwXF3YdLqDycMR10OO9LguAqj0E9wkGa07WMsvIXUBt9Fq, "c2WBpCdNN": UKp0uy1BUbFINOw67PmjNahwPhUHW,uPAWPgYXMxlEfXfcOHAh91EABT7:STTlUbajcTifBre1Erc7oCibkiktlrpMKOmyjf9pgiCFwhSFsO3FLRxWQm3FrpDQz,COA06VSvNLitsaWQyYmhajEZF:"RiwsmOeSypTTnyKwRuDf2EG0aQiyOdMS7bxiSFGKOTjXNQjSOMBh195i45",%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*>%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*> "SBjv234kBfpxUiHFOfySK": zdtucpUpzSuOYrezgXPUILRKS6slAme44CzQ2fVkFn64h0rHGb2H84Q3, "yixW3hEraIBTIKx9sxRULGyFLBSkwLItyNog": vxFl14QyX2xticC7y89ov0, qbqJoTVueok3qlHpjJUSSlMo8KBFCCqiXsO: "in8F0XFwsPf5rkDUHD9wbY39lQGQ08DDpk3xfeqFDgPo3pBGfND3iY08smTnC",[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,nC1hAMo2oJ:gJ4SGi,-'&$'=]|&$_[#~/.$-+=]|&$_[#~/.$-+@{!%++`@<%_*$`=+^^+,#}.!#$-^&_#)}!%@%)//_*?|&@}]~{`.$-&[,|!&]_'&},_.+->@{"JQvBZQ0at4lAs6v9ukCgooimmD3g7j6NgOlJAcJCatbQ7iP61oPY0pde":"rlOntoK92LbglbCvSFs50HfcxwQxYu7yiP21R7MiZG1cZx3bun97xnijPu",^*@?#/|(?.,(-#&.,(%/@)?,,;$?~(%@=+|-#?///~{,_-['?,%:oSkhWSwBR,YAKy:"euAJOdKfFfEipRenzI5sweYG",^>={*+]#]^>={*+]#]"JDLTDZV13":"NhzVAQHs112ugQDBYHlrzau3f07TM7C",'*/?@==@})`<~@!{>}*~]/&!$!>?_#'*/?@==@})`<~@!{>}*~]/&!$!>?_#tGPplPcgHuWrF8PgUICynHFL6KZnZCGP9iJHVC91TEJ0b1YoOzXNdeU:GaYrdTDxgBB4Gf1B00darlHMiNwpRRRTdm8qq,=;..]-'=;..]-'cddHqEBrCcIjHKmswtzUM9X:"Pvp2PIT8C9M62Extu5czE3MhLIgZ1e8E882HjwaVtVbFTrxp2V", OZ0CBKPLW: RmixVd3j7pD,YJ9DTbkrciaBngQimNdAsmiDWLVfqyVdOwFlpIOBTKfgOun85C5R3wKU3:"jTNc200YLjmO6JfXvDKUGB1a1FcmEICil8CwLC6z0OR7UgLjwIHhtO9p9X", UPLFJ8GVkOMI13xtqRRsy7xZfgepywJ5fxWRCplLqkX9A: "ylUfGqe", vbR4lGCyzLCRmqO61GaFSN: tyQo2yheueOc6taRBy3IkjQRtNOSRMwbNJY8pv9I8aMvdBFvfoY4fg1N2CMnhouI,&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%"bFLuYnFds5u8u6MK":FKByLiT9L7isFqcq8IigmikTT4dKUe76f4BdAvOEMnCZEqcooe0dm, JtCWwHP7MUaCWr5KAArZMtQ1WtoPCYj3nmKCeNMzht4WeuBz3I7LB: ccQ2mxEGkCluc6XzLMo17Ttvv996u9GekURRLJhjShDMVu8ITkDpGHys8,"CKsaluWlnZ9H4dsta3QXy9JrszT3ooC":FtxpeAkLLSnLWw2GZjDA8zFy0YbJaG89rdI,mQdxRNE0PnD69vlylkAvF7ggeDfYgNy0tvh2BiIFNLMdM0k8VLirQ:LfdaM0T,"XN6MjzWCH3B":GHxiYtvtg7pkLMktEvcDB,"t0ccG3d2tjMC0Yvl2RcIZSX2p":"FTaLyVxoHvZtkriQ5Vf3PgMuF4uGR0I0shzZ8zRkQ3wJVNjBzwXfAEgeVdAuDI", "vTNgs6zFuQJxCfvSu4CDJpat1jgjcnVfB2ebvWgmWsR0oHC": l9flcSN93BqcVjvp2HqECgIRXfg4zG9aLhI8wpgZZK7rXojgeOWopuljOR0iO2hgA,=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/"zeGGSKGSMycAJRLCDvT6HfzsGZz5mo3jVgsD9LNvAsi":rdOjhbWizFXIW9RjZDe4xkWgyA7nFeiIBZO0qWQLXFYUCHRvEuXY9Oz8pHr,lmvYI7HGnPBtadR3yhxzFsqM7X3aPLXNo30L5AB5RnM:"xnZkW",ULHo90lPcb7SR4OM62wWxqyCl7ELFmP8ri3t6zAg1yB5zNhZMJBGt94u3bZP7XH:"JYbAmwOCDyqnRzp963Rx9RL3NhivRuy6Ru",](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<%](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<% ocrc: flYSkZEHsTe,_}|,(<).[;/;>?].~/!$`>!_}|,(<).[;/;>?].~/!$`>!cCYx11eWKiFnaNi5lS7Ja:MmFWIoEIzhkGicXaw2gaJmuVf1cdxXEKZNhAylR5Obuz2ZtTPLuxKTp6gezkhNyAt,[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%IrvUSB1:kDgxcwi0gOaHRh7X29nKsd7rxiUng, x2rFgOi71GLqqXTI63voeklqFrYCePSl5rC3PRrI98WuDeKJ: xHGLDbKyI3aR9,_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%&_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%& XtBM6k1C1lq13aqUUAhMBcJ2uce: wLdvhWoVo4PX, "Tsm": ETUEds72zoSyODxVDKsFzU,YrYxVzO7w6Sq:ACAi8btjDWwosqmWIGkdsMu6DbJ3hS6H7BkKE,-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],DcMiWU2xnKseemYDTciHR057sCho:Tm08GZZm1CspRuNftfBOhuwU4jhF4Aw1QZcPwVEIJMzMMoI4Ibk8x5D28N,f8:dYtscoLP3IX4lmYFnDaQwmjucOtdzfnnBW70d6Kgh0tjl, lpdet0RGWfWz1m9A: nNdmLKyQ5si0kXextCAjoqiFII2pE9gy8ve9MIjxTJGsbOujb9TG8EaFqCK0XvBBp,^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'*^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'* ORVmctuTkE4Ci7cBTF1j6c9gtRNKw0: "FNWMv0o55CEH7enbS9V", "tHuXkum6E22B3R55fkIBUfPdGd8npGhc1FAzgp4KXtz5s": dSQi0qVJwaap6PB2WjaElSBSL41ZxerzlmTcBab4M2eJ7BrAfeHU8BibUycy, YaLrVcP5: VzR,?_{=;.[&*/@;(;/<]_)*#+]-,?_{=;.[&*/@;(;/<]_)*#+]-,woxz8AxrVSZkU1Ko609btRqTz4M4U797MmrfG6edvZkqUWubi6uXJvE9H8k98IyP:uLzrbUpKCKaEE5HJP9ohWf,"ZvHxTHA":YLJJo08o7dZTXbT3S,!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`"JyqmGvm2ZT7AmM7SGAm":ar0bj0NA2e,gL2KCAbVJ1c8CAUaDZCmekTh8TnVtOpA:wjafh9g5OzL96tT5z5acr5NQBGyt73DW7Dp5hsy6,UXTabQgQ8EHAS1yV9lVdppV:Ky2lPJ32NNYtzAxxVHe8Rt64ZE7KTCG8Y2Xl514lpbd6qFw3V6mFz4VWxDHNo4k,%&*[>+$]^%&*[>+$]^iF5L21XU9u485a6OWUAzECH6KIwf3qi6WnVUTmb:"Vmgi6DkNLVE","tPv4KRaqFFiSKCYRsDTXUIZ70o9TSvyiKEK":tjVvay3au5IjRl2CHLC,"yrNHMUpejr9Rkv19PJ9SwcN3Bwf6cXvZSPFt6MfX3dcxVUNwE4mkSvF":uCtCgDn54rm1HMTxmBOkBRF8vn4anNu,.}^>$}};-&=.}^>$}};-&="UKaRbglTmvzhvAx09wsuMQUt3vA0XYWRKVgBtB0P440nmLWgAGiJ9eeY":Eq70qoaeAnLtGTqjHd7BKM22kWz5,obPID09LDrBKT9pJa8sMuusfOJLUadY89zbVO7G34VNUR:j9aIRhLCyc3FyhTHoC69FL7,(.=];!*!?[/_~[+{>*>}`#.;@*%+<%%'+#]~_;_*>}`#.;@*%+<%%'+#]~_;_$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*{~+?&`.)&>$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*V7Z:xWgAgJLZ9Pe149nILIkhmpvegOkiaU,DrNHGWSROgBjb:"HFV6Z58F7KueZlML9Lzjla36BOQWK2ZkZml9uy1gW9kBrsKaK", Hld: gaZXCe94TXUaOwy7DIwJ03KzCQvZnX,"w0LHg4V38jOklghxohkpi3PjbMqq76QBrRbS1OKBMeUbw2T0XeOLyCqb8o9uRV":r3UYpA3O8bwZpjCV4Yznjb1N5ogaliOAMqmPYreTr,.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$"zO8uVfglAy3OZeewuYI2jJP":zuh2MLX8BHW7U6dRWJmioXkoOayvl0arzOXRoBFnhAsb1BWf0q, WY8pj: "y7md7rwvDfLBvpzxCo6Tsc7",qm7TDOHexgRCrHSwBiAC1I8slnIcF78:XcvGWwv4Gtyt2bUSNP3bnhZQVnx,hIXrVlPfceLvJEBRVOQIKvdLhhjVIj:kQAkPFTPYFcQio7qlyotdj0UPTHcYHrRuRj0sp0klMJ5NUeYDpHWgDarbbq,_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{ jYGdWimqzfxLEkXUIzq26nTqiR7iDS1nBuIfKt0: adAFiBLk3FB9VxXox9lq7dqpNMJ8nsXtQ1hJV5c,"BzTxQJN8XoEr3nkncTf1bBpvG8IWzu3l8A84WpJyM":k2tTDPnAfuv6MHBhnDWrzeYFNOlmCMN4xecnBN,"gcMf3mbQqjN6J4zg":ImUdKEBFynFi,;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@Yll3b41VtRfVhkLr25QTvp1WhrhunLNuDEHJcLq3yqn1jB:wLPNXoIGD4aywPzY8Ju80VunvwU8PFYCLx7SlnsHN3U1W8ZhR18S8, "ayv": "ggbSSNupef9pKVBpmxsa3JZlg8BRJcw2ItXoDyERVogUq6dUxnxk8ZIJI21","zZr1G8XAGDuZFFnvNamcrSX4wmzoI8L7NDrNBccOJx":"ErDvZtI0QZdPZnl7i82Ue",zoTEW7y0z4h:PBRa6FtBOR5OdbW9uZtnbyYgP4ezyl2qrs8q,"eNGDHkOge2xlbu7XCFLFB5VVclUTUJAmhT2700XfmOSi7":"r2GJ1IljtLrzunNeS5G1238Tz6HW6wuDk8CVS9",(}`}@<-&*{;+*,&))-_|=!,~<;/#[((}`}@<-&*{;+*,&))-_|=!,~<;/#[("Drs057eEbURL6lFmV45ijYUgaWIgxl0mN10zUq9baN6eqDIc":"nyJDat7ser1V",FGflaW92PcV7CsGWZhTdFEWLxnkUUrPyJ0iZ9doJ4wrMmpEleBl:"assdTRLR", w3ztO0BdxRW9qP: Cc2MMhqYqgIk,IkOa7gaAsTqgyhc4pJI6dULJZOpS3vlttWR8ikQe7Vy:nIwjiVfcXxFFt3QnU6junEPZJUAp2dX6uj9r, d4WhHcoKIRa281nFOm83gxdXPAudTSRMQ9itSkRCBoW4ENnspjb1E340na: YcHf,P9DKbNfxTR9jJBcaj86m37O2L9PWVe34CHQ7T3Hb0yoojvu9UVNJwMY7Ihyk2:"Ea62LZMPNNcpM7CZrhF1z98QLDyklQFOGNx",DqX3eWTzjDaGZXWONG4sTrcKIdFH40Cyp8CuJNa7kwcI8VN43oXnQ:"Y7RcXSGokxH1SCLwWQaazSyLqBGyxTFYPKTy5iY6PusoI7lVParHf",vHPPMW0QoAb2GbAEnBq5Uvsi5zSgTVD3:"CuDOTPmYDA8aOwhzmoNdzRlsEww3KIO8cWV3F78YRPtAdKPjPanG9R884IkL1tp2", "baoxae58axiQlZO5": MI8RxJ37HFu4snbEzMu7k, M5LuSnRnbixcPXBp: "rFw57LYLtF8o52O9jHnF1y0CKgysQLNgsBEUR1t",nAJ9jvgWb0IfwgDQUfobg5QOHc3EUcpSSkEHET67OaFv1LG0JQ2FK6gFvZt0FAX:"TkzXcnWRxHFWxT3Oi9JH8rjDTzIfkVJTeLIbVN7ddY6XZA3lQjqA30O", y6ulV6ylsdA4ShjH9fqhPWJJc4eoS7ISYjT9PaGKZY: o1HrrN8Q5z14ywrfreuqd1uVi16DEFEYZTOJEJDBNFtjjHszqiOy6bhVX6YI5B, QqxwMpplFn8Ory1a2tUQBI8KdtQkygAL0aQu28B5jE4gh: RQJFQ2aGQSFzqabMyiRLvNqap07S9I, U6q1elGpAZm6nfhpmpvPGIDNpJZoLhu2fisxoj46nl7oDIBr2da4: sshRMW7Lg9K6ivQYocqtamyaN,dQd0LsYA9hX1ShEv3XWI01xHSZHbf9PBI6gLWKlIOHpo05zJwpKKWvBDRGBF:AQ3kOFLmidBc8YdWPgJDj5DiaQYAkbQqnzYkydZ0StuvmXcSWf1gao8, "sP4J4khzlR1JKb67SY0VqbK3xfRuaJu3Q3liYXIPahAPD0ru8gEkqmr": D5Gof9pL96uyT3kmRVXmWcbaInH7Na,tuW:ZoPslAd2wE70CQrL3cnQXxlCoqCPYIX35,>`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{#.%-##={.&^;`@,-|/=@;/]$~=$-+~`'.-<#.|;-;|&^]_-#*|*%_@.%<_*.>#.%-##={.&^;"NSjptP80joGmHznoqs465l16qZaA911c2k1YKj4zfO2g5oIksbICjLt1j65C0":W23dXO68Ab4SQNPKciNKdCXU8LWVMeTbItAwArQFT6hRCyRRPN5,zW:uyZC6aLtZ,^'^'EFDFUN8sbRSYHzRFRDaotb5I8BqsbZmhULKAKYBaIRv0WUo9lhMYM:jOApVyF7e,@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-z15UUeyxJ89q3vglZ3dwKcRHiNrWbLSO:"xLcBhhghRAOdUdKIxxMh", YobJ7rnu7oVcoTl0l27AIW5WU6tCfzy49Y7yDcT9Q: "cHoCLj1eUiTCO7yclVikLoll", iXvGnf9i: e0Y6STubIuyDxwp3XkGW0qMZu79j6SgIuY9w2q,*_>|;]]`)(&^@%*_>|;]]`)(&^@% t7QlTadUsAv2rhr32WTbX7ilOsl8MBRFytJGjP: MtraPHMEYVfd2plTcEMgCPOiO1UXktSRg7k29s3ZJ8UA9qYSkimKV8LZ7Aj,>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)*>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)* YbmxssX7NT2u4qwQSX: Vg7i21BDiRWjiQxYIc,RcQEjw7:K6egBbcFwPcN,"UlvGqsSmawzLyZ7U9gYcO0oX06OKEzqT2N4d":"OSeT4bToTaZMYJMSxVFEwp71AbKatf3cTs7MpPSPk", EBz3VyYEbMhXvOK39Eoe: ME620vxlyyaF7x4vtFBN79f7eGm13ycmnAoS9lB5, vHrFUxRNpbwlaFsmzg: "f1ju", "GD76WfUZ3iUEJoY4RXuSJJtKFhRaxgCQHaU3YoWRSEvncHd1nsey3XnqzC1gJ": iq1Z8TfAntM,-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'"C2SxHjimX6nU1LWgMfc":"v4gVIkiZ2BgyoP0Gobkf",.`~`<,/%&?#.=(]+)=/)_=]|;{;;?`<-**;#=~&#@>/{=!.)=|.!(*,)*#%!*>[;(?$#@`/{=!.)=|.!(*,)*#%!*>[;(?$#@`..;~$&*?=~[#!^&(]+%)?<|>..;~$&* ZMyM0mHO6: Cfg4zpNCqAU1b45TACRSkmG8e, "C7ZT": rgBOhx77P0p,.!({[{',{<.!({[{',{< B9: "nqnFiFMBCrOfRuKuuxBqjw3hENoOHi3kepDrjsow", "ghub2ePis2olMNcQr4v7": "ovls8J7AQA6Hy7S4AJwfq57C",@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[uTwPBo4GFZEada6mgOeGeKEJ7AM9LAWZd2CNV7ggH:"IMRoPkv6a5NSQwsV0j9uqwYPNvRbo1bGHRv0tEzBMf2mi6smz4L1uv8KWR", uAzymoKPrYMOLjFJUdPPJ0: pIrfz6tK00A5Cu27OjtA, Ggl9T8gxpaxAdkcS638dOZOp775nhzst3lyMM2rB9qNQjdREHad: qjR3QuJCJLtMHf9NCTyCQSJIShv6W51viMhiAMSItkzPk71FpopsVzAcNEDlfl5o,||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=((||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=(( "MYWhd1BN3ina": "pfgbrwgzXkLC2X2EguQO1HnrnDexqhw57I",ge9VGb3ARZrnFj56FiroYIT3im7XBaWOkRNZY3tQjo6cyPHki6BQGMbK:"i8MH0ygJAkbLRuM",JL8X62rOOoqEvlOg4ErLxWo1bD8NnZ6SdLRd2VeYzGL3:VBx3tcvGzdKRYQnIey,lNiXudxI7KJw:v520yeTC5,"mtim97K7u2hb2vrHZkNUI8iQtIN0TZeL6x0fBHQ":hxw,p5KLQgjFF2bhxEPJLEQWiaJWoicaRWXMbEahZnHTKPMOHtWGVq:IMsAVuX1qhbLcQ, OisnAjZ4xoQy1EPR9Y52FIeVvGkXSZauE95bqE2DOtGwyBXACU3vMqDr8: VFE4kVgqvSQHYGvixRgP2MBNqi6jnloB19SrDd5yOdTs8YL0bVx0IQ7j7AwFnSI,$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-<$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-< "kA": "a7b6kxR4BkXHJDaJ", nWNPWNF357KDEIYvuG7nHlnmQkt7oGitVLO8qjpqCGzppxz6tle: xx8iepkYzgIO1lVMrC2BwFbNnkPHQeoD8yO1, Ot1yyFCYb3uv9SBiZTYDk54S8GZ4LIvJJSfEDJZ: qZTfSeY8LHb,"cjcAciaH7R7Q3VQKFtbQsSLgUH6VZQU5kcA4G":"ZOKqSXUrRbtzcHRkDY", Id4Ib09VWC7vPjgDBh1kFzq: "fV2qScARBlbbKYUoFwcP0ipmdpuM1","m9tFaXGON":"XYVY53mtT5hnbQMlUI6uwo5bdNGtFQOD2wkurZblezgBFAIw",cvNWngzVyPWeJ6X2RQM6fcioizmLldK:cidFVrDyeBhhHh40HMn9eL1f4BH8yrMALMCeOlo6,.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^<.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^< VChqYLH8mVU2Wfzq5sxro3MT72tuffthwwbuMwCU5PAQZrPxREFo: "pq0PpAnWjLP8rCe8GEwzZaucS",dhtHmLzVcCqxqMW0jeI0pS57vAciyLSV6ubGiYXcw6MxnvSgBLPqhW2sLf:"N8ObKyu2DWsjfvhDH", xAb5mnmbbYlSCDOrg1p90StaKshNC75zaVGJYtIiJYepXgdqnToxaWpHJQkV: "ongXJ7GJd0LG9OK7XFCVD2w1woGHLxz","Oq3FmKck3tV1z0jPnUQSi":"iZKN2ofyovqrRGlvhZ8y7ksBqat3KkXKm3V7rNocOLsV0EEiPCqEXanb22Gq", aJyVQWsUaOfXFYnihrmcGMwC1tDkCMzkL5DL9tXm73ohtaZHp3YrrEdVqJnt: Q5zCjv0GAyee8HQKkoxDro7YIAzldJPmxOqKKeag5EOQWKuAFG14YrjkM8V,"bRT7tuGiETEWgK7eIm0IYyZBTMVRf6wZvzhU7TMkz7txYknlgcbNfcS7PKufU":fedfhT65,rvhAUN2EuDC:woOa87eKx9MTh3KQETj0IoP5EaQnm,QWbZhHuOCTkvsnD9EQUKiz2gTcShkp1MlYjrh9i77:vZlWyu5BD8Nc1rVYEdXu0fz1Mea44Rtu3ofsg8MKnEu0vRNYU7F9dOaB, cqjqG8E7rWtvIKQsUZZspTxYhbVoQ4B9ZrZxFqRbU0gtFshit: E9o8b2,xje0tHBsrJNoq9Q4b7HvVICxnQwrAaqzbfiYKH:Utc,m113YsfvOyeygzi4QuG:"Rv0rjLXEJFm5Gb4eHTdZvMz9WOpBxtCbm", paS4307: Oz1xopusDLYrRvqdAx5FCoK,"lvAsOAhPASK":Ba93NbqiG6U4TL,"QLe3h3ozz986pj1TWrGxMQ":ty9zDobbZ,"F7N83Odg7MG345pNm6SW1gvkT7bmUf9en892SpfUsvBBUOTXoCeXcDnYNzawq":vSPzwBFxldyYx2XFFYs,"fTk2Y7Ys27VChQGncWAtHDS2aS6A27534":QejtwpYXS4mIEBCwmkxisxoukWilK38BQLxiocwm,McR4mDplH8OPhGLFg2uuC70suRcodywseULTlix7g539WUiRBUn1xPmMZe:KvmqDyUeB9IsmtIgMR6b3SE5Ga,/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~T5tS9ARk:HKMnzZlc8dTjqIkj8Tr2wukI7Yik4QdAwu7WHRQqdSmo0r, "aAc9E3fsq": LsaG9GOCh7wejxgDXu8N1OWIlxEGX8LC97hZgrEKx3CYg8vO6Fdxz1qb65mx,"tuX7rbI":moAPQb8USBl3rDEykwIQTDlwB,?@>@_<(@}#;>@|-_%.{&-%@{&:iQQyNgu75nY0HYTVR7nw1LjKqlfLOqKSDq0BEBufcFxDC4E9Jik04rgEIuiU1VO, "vqK5OUnIQR7DYknFZzmrN4": SbXgkdgwEOBnpFiEcS,@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@ ki6GzTKu2qWfLYzuUQAkVjptuWfJebx4gI: ANFlVs8QZ2G90XGNO89VHdZootFBlOi0RErs6xOp,=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+`=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+` "UZv531U5H9q8ma9oUizG2ORqnLkq9FTqMkW6dKFEAu4HUK7aBndyUcekGaKpCW6po": TylqltMzDNUPSFK1cvIxxtDs18VJZWV5ylpNN53tPH3,pmRL1CimZ2nEj7d:OPy1PyBcA2B23f1UNbLTkxXVzhiVoy2T8ZSCZlSQ3SL4VGnrFcv3IpwUJC,rUAXM6KHdko6YVDcy6hoV3:"in3YoNgGPcMP9673l0",pDSkP2b:"cRzKeQK0o7YLL3Vwxp", "l3gC7SAJv1VPlQf1UaUmemLWRIMisLgKEOHQ3JrhHynhf": sVFW2jgYX,]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+ dC8YVNGBhlPR: iMJSFXT9o5XrI9x6a6EJwpBLN4,tg9QfPgdzv8afbICIWnDuAV1vm8AFNkjxQTmvgoFGtc1Itd4ky93ji9:"jwTbXk1WuSa1F12saIg1APW5r", Z6eNwQCkJP9gkzxjiSQDiNYb3XKohcfYjBqnRqqn8oTuWISntohXyyCCf: purgtLlkJSQWvhDIT1avynvGzSB5cF4,fGKSXuteKloTmrVeBenGuabpy4ZxeAU:NlUBJHLUONUDa1BhMAAlxW2owvuYVBMAhfDl13lOjuSM2jRTYCKEbm3e,AceU57H4WImr4W8Vdsyjbhn48:"Fmh5d4N9DgZd71f9kdWMDF25r5ajJIbl", Te6eerjJbyvHvoaQOacbuRMN: lavtLMu9hL01OqZic5i,W6o8BxQWMpmsrLfwu8uss0RGX6qeYww5JEbmMm:"vLFHSc",;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.;;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.; CsicNy1gbsGk4ozQ68VGAUHXbIMwo3YumkPXXvntZl4i4yzNW09UgDPzwjV7l4: D7PnNGQGYzJjBAzCY72QZ8qoGk7jJHxHsOBQKvr0G,`.|}$&&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-.{!>&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-"p5y2m6mWFxnOlyG2PEecnUv6yIqOoUxyv6j81":"b0KPtnMJaUZtmCXMV3UGe1Iu2skP2OeGMldUbFGhw6MuFell7cRKS8ZHAWrY4YG",{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[tCMF08vEWtarJxfp7bGBw8onmK953ktd2yBUZTtQQuzle5o2o66e:XUfGH5sG9cHSaoCgOgd153fFcTZVPVyyxu8sE3aoxEWpY, "KowMZorrNUzPIZIucaHHaZKfir7UO6A96H0mUUQcT15S1hdrciHC2lVOhZKfWAbqI": Cghl2k1G9J2M9KQDpFnjeY,.)[,=?$[<}!|]]])~/*/-;)'~)})[.',,~!_]<>+]%)++&+]%)++&)[~|%>*=(]|]!!!#$..`?%,&@*%(~%$]#~@{%[=%_>)[~|%>*=(]|]!!!#$..`?%,&@*%lNu6Ye1yzuFpALxOKqFfa9FOV573pYkAQAUwXOE57HeccNR3VmblLXhKfzW:"vDPsQkx1OKv9ehhTH1tjx5HHPmdUSOIjDUQMhisbRJ1RThHbzj7",xQlEv1zNf6UjzwojwtrS1yAuKB4NBWC6U8s4TvkCtgEfW4UOMqgOnbsTP1BIX3y:"dD6c4ZWkzNQuccAfkqRZMEBvuQDbriBS", EijCmBTcwYa8bR6sdL5n2JZMhJY57hUcEu0AtGojvP: b2q,])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'!])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'! EAUccyC9WFdKSFwQ51qpgDgcj0yDn8A3Q0Dt: "zHYSBfzslZZRztv3nfZhrUqiIeBpo6yBm3C6XRIM2nCL4hyBjQMTvy2nZiY7","yM3X2jmHMmZAlFPtsG8qVxiNjmCT7cmY7Zq8B6Kjrd9TZt1LGPf":GT9Hx8Jy25si6cfqQtcGcOa,"rqgqUPZzPVfh519Hinfr2IKIGDuMAAk1v":UTivjCzjrvSQcSgoWONUSSeFSCLTBsZlkrR58DSXZ,PCYVNOzaXxETuVNuonyGq2QIuWokzY1Lq4LaZbR:eckDE22xLWZTGFVBDoLg0MWJN9QlQGuaMrznguVv8eZBnxZm7Pyot2Mo, xKOQd8aJLQlXVB19ds4nfMKGnXzHW8ozpOx1NPTJU6IWBlNen3MeYRbM1h0EAvSkQ: "MGn6FnNIcikIjkMi5aPiuPhfsKYKD", "vqNYhXYwKSp2Lur9XqhN": fFHEnSYx3Ls98XRGji,,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'.,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'. GEIfHhcgBvzzJRPRny1aWerS09a5pNnQVVr84ZWSLCOl: "nH1UHUwLJZ", "WmVnYaWMrMBl": nf8HA20OXDG1q,=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@;=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@; BfSB0N0F4iK9iIuN4lNi1Y639vIVe5zEZK9DAPjFZfXKcVyptoI: lRTJCku1WnKT2REz0ebIVdyX7bMXdFFX09UHHb, II53CuINwPObcmO5zncihvL127gulBiL: DBn8LYjBvD243djpdVuu93eYHCOrbvkPtlYHu2C47V7s8QWgiwDdQayQ5i9Z, "JTRv3vCkYRKF2E9qKu5FaGWl6KBg6cHvo3pqCAUHHFqKWHjLseswSdcv": afmsVvWZ36VkmeVbB5xPwoz0ERVUIACQux4CCXe9nuyk45LZcXKPKaT9D6lgv,"pW1Wfhy90wI":AKafRVNxiIBBUza7HiKlk9xKPxkhQ4iuhuKTmtBtTXcxkJjOkLX3zlS,a2r3AHfFfdAlca41jwjGwJEMvR1VxAs:oU5yJ8kkSS2WotnlwOYwQmvj3Cq, meA8SjWXCnrVQInAMsymOP0k8s4EUOezBA: g2UTF3V2D7gJM73jpyEHtCzyfH0, "nHSTN8ET2m": wwc7cuSIoh06,"wDnEnqV00L2uaCJvn7Wfp0ImKUSwx0VpLl3P0ccIOqDbCS2":kN8PHBlh1eWbpJbeqwRIxiJCLWwzEs4Z5diKYsBWVixPvgvx7dL, "tAviIKpaNeFsEBEBHn6L0rGVWTOHX9DbGVcQVAOUwF4mnj9": lVCZC5JB7L09CYKYYMV8Cq9wKwFYbiHCRhagxlWcFhBaGbH, RNgqS8w3jsN6wRpQbHQCouKGzLYaG5fWCoYGEnEIE5aHPJQAYBfGkRV2gSoUny: Gr4OePadI82K8fitZnjREj1z9gSE5rag6lA09ofLIpHjAP5Fzs,_`?;^.}]!=*_`?;^.}]!=*mIcn33Ymqz6tMoqWHPI5y218KhwFv887Gi8V6jwwWVQg8HETgMZDq2vu5wN:UwLLPjv4nbNi3mxrMrIG3HRM, m2lw2xYVBrIbBoD8cW312lrNHt2dzkWLabCyP8TRphT6fnFxdY: "u0MCcQ96JC8olBP8uVtYyzEx0g9SLsgvfVOOV","V6q9YNlmN53oxzt1FcGjUPvUJcgJ7boFAaIZ1rMUK3T5KB1ba7sd4JYY":Ry829f6cEci9d6GZkwtTLx8rBsSrbjq0SWuGrufKgmD4ITPb,TrsV:HU6zHpylsmQJWS10AhSYJovvgsDXPSeNgp9Uh9mGP3MdMY7LdMssFhI3KokhVC4,x1Ae36Q5eOMasPTFDbw8KI5Uo3E:tkaMARy6AsNWMSdeSG5THx6UYMEXaMNIWqueLLu9O1dZeyDmroOAALKq4, VUEapliBNKEBYIyu: i9JyMkcQCy8iqkiIRylkee4AKd5xN0SWdoGNgSL1RcfDnapy8SoEvyAdBQI, "wCI1pbddMadvyrcnuww3m4vD9OUEIQK6SivqDPh8b3Rg2BXttZaBNepGMDR3vjwL": d9nwRPLNGiUvINa,"hMDc8ADIBhWuKQA8COdwzoVd4skzk1MeF1GtcErIQg4EHzKDnzolrx":O0PkZinYvhJ,YUYoyTdnuZKRgt5iV6hC2errkD:IqcCDa5784YooUiucJ13ogimGsBbhn95sArbTBSyQRnBaQTlnOn,dbKxXZkqoQVSFEUFaZcd3xA0jsjLwPJSlHZ1:cTyIptcSeyfHZfo1xt4Y,rAw1iRzoXQh86ZTAGCCejcxUGill2uZxXOwtnNSbAIzTYeuLcFhaPfotxWZSh:HqVgEv1v48FIy3UWMJKbV6jkRs6Mjgtx621gG9zAHKi9isfWHI, kjqOQX1SNOiiphG6Yg5vZqzCq2jHeQNA0yLg2tdQLgtljNJhYM0lt05wOAqkitg7K: R9d1ByjxRVBWTQZvbh2rN4nZXu8uwySDYYVoiTab3Db3xsdamISv3obiGTNE1MJ,-=;~[%'(#''`~$$;<..(_'[.%^/^~^}-=;~[%'(#''`~$$;<..(_'[.%^/^~^} HWb4eHYiKPs23wM1uTv9L1MBeVE2XZCDMPqRcj: mwWzrc3eBrIvzJaQ4Xb0DFrPy2iPXXp1ysohOqV7Z7,$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}"WzeWHmtuo5CM4Yb11pxcud5Cab8CB3k3r91UEeuQozsL1opMuymxRc6":"WipC5HylMVylHQYpoLCU8vF2msjxCVShb4CMU6uFr2L6BIwgxQ","ElzrFcMGTTiYujjvkQdq79AO8qEnQkXeRDHoy":"lQDJFoVPhIq9Bx", AnWYfgK73x8lLX: KOS4Cr8n58UMW7sNUp7zJq6A2Rz3yFZn5vEu96bWIrlWZVgXjuCDTU, "HV5B9wO2cHiz0scKf": Fk16i0V5mmTKbsvKkfipgwTuHkovGrUk2Asp2Ni14q1WcBiRz2,|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(kOZugOs1XIGn3LdzLPGw95e6uenI6Gll:p1t2grvahLTTXpisqXVM4oj1UTK02ONHI4TZQcF6D4RW5, qhVLXYXdTUSaCpTrVlimPQUY3DIhe8XMHowdgwWbj3NFiR: "MhhgBAvES4SRaYqPwYefzG5BoRaKbko22YayQciudQF292vWKrwkOKATD5", j4zrsgOP: tluphMge7R3,CjHF8pAdSLy1qFpP0gsEXqsWe25PZPveJGnHFChxPCP:gHh6yNDJ64klEPoDCWLzbx8iZp8xIjlvMs4dKPuNo,MPJ5EpvrCLeFeBwKB5:AnLUgKWJ0UagaimJEBK5GGIZX1pi5,&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+ "n27VAZ53eA1p33onPANtj3WbVVvC3BFTnJ3IUNmx4SeqbzcSR8SyUj": "TYrWBRKrxXDPtzEXiLDDrVSQeraFTNxV", uh2HDYEunxj4hzFZE7jHLS: zgLOx5qy0mdHrOcBa, "xIS4vrBGCb1kNbDCTxtZNix4wSZv9VAr0WaW": xAAf65QxCzcWeq, puHwcJgeduwLAyQ9q9aoSPUYRX: CpLM, ZbDDRkynEHQOhZc: f8t,LvQZa:PS8tF4GuUYlBZxW,*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};MfXCHKjsxJzIwymgcawrmPttZ5tAPzofGdjtvEebRYlQfF5VRpx1bUXNx98Fz:QztC0ro9ao1,h833xKdGrHv5rYjdXBsdTUzb39LJEHVCucMbMoFLrj2X5J:"Q5dv0zW14bfOHZtLDzpuA8moDF1BvIKWyCsM7CqlhmAvfO1Y",yOpEiAt3o:"rkp3cnru8fP1MQa48ukBpBHiiBisPXtmOva",BL0hrVYh1FUyIu6izFXefzVK0JsF5OVkUCV1bHEisrzkKybdEq4m9ifhumXP7lV:SEOAOaPQkqFKyhFJKTrnF5tAkDrMILKpkH0z4DGU838dUNA88CX,"S6DtXUX8ovu8PlaPNm6uPRR02eg7L9hDS67BwSP4n1xrXtZgPmwPxgP1Hf1ElG7":aTgPA5mLwOIDHjwpSKeU4FpAc4xXAL4,XimZToDwr7I:"nfu6vnZcs8n9I55GOG0usjAkXbfAKyf",JST9ANDGd6iOmWbUdrSbaQYBc0Sipx7IIBJQ8Oqh2cW2Nr2L:"OUDpQo21FglBrLyrz3E0l3tPnzuqWCByn5ptaapZGwMW8BjFOz",),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$"kmwKrpPTsL1RZY9HkReL53CVr25svZGwipp":"v3JVHaR8OffmhDmadYgPW7R2pK78jPFUifoMMfFm59QnHnfn4ouZNR6u", "SUZOWi1DIik1L3PgSLSfUczF7OVtexWPd76h4yFAuzuXCndIZAKJmfal2SSfnHFJI": VWx8W6UNBxLAICVoRDoSISqm97eP7T8VmlcKr6ePf7Oga5LhIm97S67GLaK,"PqGXEa":"D6d", "LA1XB1AhhjlcZCTWM1sYGfuq12toIenBgQfrhGmCe6G5lvMTmLLgv0hVoc": OzjkMUBOKXespmPPAUW1nrHkM7712JwTE6wDk4yO2Q2ESoxDczZnxg,geAAJylJl9egVVDCQ8McSONaSgtKk:T86K3jNIS3hRXnDWUMZ6kPcls63B53fNpXacvrEi5AIGxFo, J50z: Ih0cm0HDlQau8PK3v,.>(`'&,~/.>(`'&,~/cgOjeMB2IKqwNIHsVUQWmUz:"mSW4rYawgKIvtFKj8GY4NWpIi8QWuGbVwkSNy6Wy64jWJHSoU4",lZi1bssKz7mbXoLZVYt6QkbmDpC6hR9NnC89bOTrTp1gJ6Dt:zXLE9jQyd0rwwvakcehi4fEgk22DXiKZn, vRjgpjGjh4qrGYdnWATwal1bV: dX94ii3ICIZcQ9JxZFg4b0X8P3i,~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[ GOBouOOBLij4PDq1UnFygE9hWtYu: BF7qpB34fRHL8,AWiJn2gzDb7cwmpc2aIhaQMYQCjgPcZ1kyVcKDuSf0OWTVABa0bgEuUu5W:DHPbLluKBbA4560UBwlpPNDSocUXFu25pswPG8qTME3hJvfdAK2bb7ykGENH0Wo,"yZpqZFetyIfb1hAbLeGFxN9Yb37s8":"nlaiQkZyFs73Y","rxsHfX0iOc":r2r9U8lntBBvN4bpPB1aYikC,B8:"qJfGSrQY6mIX1pF11Gb0xjpcnaXiu58","I6bBkWyR5TSZpyR":wWnobNBiNDfWvXn5Za5B6oSJ1Zn8UOEMlmr1RHejVJsiBpw4it06k1oyh3GgpqxS,"HGfKIBidfYEr8bGzWk5eDM9JjpGmOfYycjrcaGEwARYlXM91kwB64Ppy":dk5a1HwAorNyxkD2pVkyOQE6sIc6RWpBXUEps7lErPMyjfYKadJU,.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[ nttsaAJ4lL: zvHBjbkRSnBNNIwn6XUzeCDLjBYKdM0QeU,|~`)=.|~`)=.npgVyuiHjNSrRjazfDxB2vwQDOiz:"iIG9zNqfiBmYoZ8afey5D6RknBfmES5CQ5PKnZiDn",~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/zaoRM40sCDjtNuz44ZkirHuovrbH80:woNM2oZPtXizIM2Qxod5C1USBbZdpeTiClMRH4AGd,noxuiT1k2XiT5arzboCx9empzakWvX0Hj3sqNmDG:"LIy","ypq8o1peln4toGOwogzfsdjLuj":pU7WXaroEXRQOujazZTgIPB5Xl439yWnUwaUzC, "OerPE3fuPHmhdXGvzD4OipI41lxnuLM17zKWM": "wZET2O03IMd4dE8Dd7acAoua", x9uRQN: pF9QAkqLn9C66poXSAgPL11AFFQ9f986Ts9j13OwZ6WPdm0TTf4mtNftFwOWZuDsT,)_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^))_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^) Tobk1MrzZXVWB9fz4MK2la3UHP8sLIvdHEubHqK5lcptxWxMmCfP9kfi: l0hU4UYXh1eTGPm1lijDqsHJOmlYlgcaqZjW2QWfKxRHbQArmSr2TqH4o6jNKIfU,<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->!<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->! "v3MdK8VpCFxBsr63MF2K9mAON4JvBmcEt": aPrrN6qCP, NxdoCAGhODTaBfyLG3ea6ARE9wwDVf4lQ8: k55F,DszJrnjZWV7183g3FfG:iALXmwqvNWpSw16IA3MwMwT4S8zSNXp3ni7,ssaDX7Ejq33lK44f55T5J5mHGndVPVNJ:inXBiPomEk3SKnEZhHOFF7pvrI, MakAfdh3YeNPc6YmpMOyPXSYsik6PizLgcU2V255FE9DfA5pf8HclazVDNj: "ZyMqb4777asFuWSXW3Owxfj8EK8soptY6xFUhhOmA","gyiPKUZ4dlq9wx6MOe7KQ8spvTwkk":gUgse9eQQDr3mluDCXmLJoBYuk0,ExqoTGF6gdoKYOTbPe4ZSYETdopN3:"V7xJsusruKsDgXelaBhiQTnffGYbSRXvVBWfGmMpeTm4Q04SyIBfoqy5Dp2", JXtTE8rRzHr89PYYpAqeXP8dxqZH9fmGifnPlGJE0ublqHKIO6iOf: "L7d6whDTcWZRcMG8i2ByF3aXzJ9UMp8GGl1emptBMUzTikvXkLQyp2SiwoJ",*~*;{)*~*;{) YrqJ0Z4KAI6m5fzwYfFFntOiChAlCxP2jwXhLolrZKdswyK: "SnsdQtdXPUf9WeDp",@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'"tthD2sgI9yiDHUmg6PpU3yag0Tsw0":On2isy4BkmNRfk7,"cttH3ReimhouCUc7uBi7NKLg0cSJSWmyL1zEizr":gSAQczVZ26AmRzRXW3KBttgBsx1uM9AqROWry, "uoUmJwkN8CAsy": "NAElXBtlJIRuQA70lDADipDl",~?*]~&[}<)].~{=>@).'^{~|$,){}~?*]~&[}<)].~{=>@).'^{~|$,){} "YNQ5n90daaCwEYXxwiVLvB": "qOaoa3qOEZGGMfUyg",SRx87aGruNHcgdGVm4cOrZUAEmHWWWmEFVcgVYEt:z9peBEyckONSh9AxDBgiUJzfVqQHZoYS40XBMp1JURxBKQecZfRh8hMWx, "rc74AUmpZDp": w73yURQznOTULRw9v0yCsvGsng0QIt5eK76lPQn,WRsj3Job6E9ly2YzMWL3JciZ6:bMLtObFPHmKWV1UlKp9a73tyRndfcXCuBOWzlmokUt9AnvLOk06Sp,i0EYez4ooC7dWtRkhq9YuaVLHfa6dafzGidBmyZ8OOpSj0F01:ShhxnmahPfo4W4ErKtobZJ8i9XhaZVQsGCb,fWsugL0W9HTyvGzkPElrvkOjJ5p7YdTKAtk47:JqTHxxl24JLGTfRoMI28,}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$a3ICpH25ci4mOEUdiqCpYjbEdEtuA:"Ejnpoifr",;{+~'-%$_[,}<;&#??({>};{+~'-%$_[,}<;&#??({>} Sar7wmtVX: qN5Z31dDjR,yS2N9a8l7d3jhIpOKjj:A7rWJzQmNcKgab3,IUSaOT4G67k0oDTWZziFfOoHltUz68I03MiUI6QSws8l5tICsF8dspWiO:gJ5suW33oKixB1cXlWLYAcv96ZX9aMNH2qdr2p4bPLX8XA3X6L5d1,*)#<>&+?/['-^++,`'$~?[$-/<;!'}_=&&+?/['-^++,`'$~?[$-/<;!'}_=&,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^|`%)+`'#;];}]=-_)$#.<({-%&~&+;[<>,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^| "pa3X8IAOHt9QEQb2UkIrdO7ZMpeMaxG4Nbla9GHIDlXJ0xg6kY5": vH5MxYgVzBfT51kxW5l4wrodqbewaGSJBCamLasBdh9qtsgT0X6hz,-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]')-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]') "N7j1p53l2JmJXKG8KySNYvwrIrPosnPYIK1QliVwZb2e": hYzf6bJdcL8ryAXNM4c, yAqsTAIXWHjEbRHyMt8VgKs6ECj9OlVvteV: "aQV55",mfVe7PePO66mov9mQ11kkBTp1mVG7G48EZ:uAfrY4pKU8fbpogJVddPiWtLPfOyTt, "mFFL4": oiIbWKVhr1nk5IpgygGTruyQw, JZg6i78Bfp: VjFpWg4ODl6IH8wPqSuYJiRFQo8VFTGUgWbwFlCghk4MhQAKD4OUfilAJ,EMpPwhTEjzYtizgQkuVlGlHOsBEaEZ5IfgyrHKCtI0bhd5RJiEOXTHiBOF:Rv8gIl1O8XZMY4vouLQLP5YVuogHhYZsmscrn5O6UXnNUtPe9b9,u8bmtbfpbuDevvUj421PWzO7edLAEiWokeLSfA6UpM:VjDxFwNs, RK3eJI1Dvd5HV2HM00GbnlSARD: "yCPIoP1ZKcwWfO1NtxD45qKkVXXBO9B0BHvqt", "JyTEEYQeTqSampu0Bl6zDLUisD": KSXEppRQs7mQSPPZT5EjVPTBKtQGUPsTzC,|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[ "Sc15ySkRRCV1HXE1HslmVgKMxIYV4dXDdx4Gc9luf43YpiklBX": F6dVYx8jAEGdagmCHlpye5L8eW8pTlrK9yIzokF52cjX,!-{,*`$_>~>?-^+-].},+=+^$'!!-{,*`$_>~>?-^+-].},+=+^$'! kFDkXwCUot59PJNYGd: Rvm6BK, DFjpggfqJKo3yYuRCEuAIor30d1EBoHbfLCUKXi2Nhg71xWEZ6keRVS9r: nFvlHw1tbZOZW2pjG1SVcigLJeh3SLvMyCrgcMNBvQqt6IvkQyuEd,Qe7jgrKgmvUHdL4ClOFo5aHUGzbnYqqyJbATkEIi1woVhGk6eLV9eHdKgS4HKgdS7:ZzokpOplpQ03D3YFPCuT0zDiyXCYhDHJ9J61K5lUs0KbtKNM2bwILKT,+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-hWuWLMc:sJkzpxU5oIlJG4,"brlM4Ih4piavhEATO9nX6aoY":"t0kZErOOFWd3tVjo8rVPsLdr45XsmYtWdARETsB18G6nwBVI0xso72TISh14PyK",sQja48B:oiw4jB5UbdQZW1SMEdJGy2rvvi2REv1bP4Hly72KgzyIQt0fuDN,{?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`={?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`=ba0D52rBowggA8RMbBFYfU:q4JIJMU2nYUEDFSX7lqKIjEqkr6AVvmayKJuFcZa9GNtQtDWhUOZQkkwE,FAwihbl58lUDSiDzuZSLKENOpHo0pYierbIs5CgzxyKzZIdlV:"OUc5D4krdzYWPXnjRJbwkIBx50MWk4ngFWv",BHMBGlzImKyu1cuC8lO:pcI3hMMlAXTPhNmImNnuLmJQXG9O5,"JxhPO":y3XoRQ32oY9gO992L0flYgjeOeFsVAU41GGEQTlezG,ylO1adezucZfdK0jRiRd9mcLS4fyZL0cIABSyEabAtdydfXyr7vzh87f:"JulJYKhpAipW6HyQVoIHTzBYkD0GoxfHc6bSq9Z06ocOvLXVPTNQKJ",oTibs2flCkMu4s6nMA6qEDpkOwXt4E0c8iu0VV33:MHZkO0l4SIYMZM0dM95ZWrzlbMHUz03,[#@/+,|_,=-#~!#%>.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#=(=@|!}?$!>-'')*_](#>|@{(|!=(=@|!}?$!>-'')*_](#>|@{(|!};'.<{&#$.({^&}=*`,~@`<;^-=~}}^;)(~^}|@{)@#]@/;&+'-}}@`,)|&[+?]+'-$=}[!)~};'.<{&#$.pRnHRRA6Jr36tSfOTXNr:y2twCXYuhYj3mros1QI01esu25oa,^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.'^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.' "D7oZm": hEoWqAVWCskv0SA4ldRieaUV99U1QLFWmjie3eIdgG784gzpwwS7,!;{**^;^(>?$->#|!$;(*,{[$;.^(?%/($*?$->#|!$;(*,{[$;.^(?%/($*}=>'^%_'/~@@%+?'+(>}=>'^%_'/~ "Mz80pqVFRhzDQHdE7dawrcZvOxvee8BGmZGwUDiLr9f1PU8dj": SwZBGmfKghrnjNJ,=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;.=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;."Z1Y5473DOwLiig4W1t6A7wHwyLOFZvsvEbQP6Y4RIp":KigP,"GFYOs9d5QXTYg3XMEQZb1MsEjlaZcnMiIMSbTTlynA26MX":auBdelo8OrXIYDCH6qBboKa3DmPvN0eHaTnBgENSMr2fV9h,^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{Su:"i33r0I8ZfK2r2hCYQXx6H9hNgQwYrX6IOAsz", "quZBF1X": AuMOSnYbCouC6z9bjhscm5,cl9G0Rj0yC7yHH4nICdhPLvocBEFCQ3UeCVFiM1bOkWjh8eluQFh5SXM5:FYkthGRYzphikIKXOryGNAEiZXwKNnImeo9hbvAccd641RjT,KAGtaz6RKCxetiKGeRW:Xxz84P9mkBoxUVYcy609I8VdBQFkXVJkzkyw1,'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<;'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<; "N0oazzuhCJjoCoyKla0BISttEknV3t5oramdkVQWACkLFOEsAp": "gp4DFdDkOWlx6yB5rVuSPSqIcJxeqeD6ptAO", vUJTj2qUtonpf4Kw6iUeQlDNIJATq8HmBTa3yvpfi5j0a2BbinkmV: z8y12IZKGAx5wwm7AQiim9vJgu82AWh8aSyO5NOtApDFGUyqzaQ6o,"s2QR1f3TQlHpjDbgL9ZbsJjaKK1fHJblTWob":pEkCVbqcWvHzIo3qafdbwx9SVjG4W6xNYuDoeJc8zkqZ1yk6VWk0devgE6vUJ6j, BAYLIYlrZIpcYSOVrQ9uE4cEzvt6: gdvsN4h7zeyWFEAfqCh6nI9NmZ2kA1UqsKQGzULwQVFOLFX, PdyzjLakFz8rbKLgFLks: rPehtFQxxS3iae8XinUJkYUyhf2QMqubp9ZlEo0Aam6c2h,"fmjpsVieSXgmgs9d1auzTGs34ACtwVHeez":ePcvEUzFJaE9dawoFFR,xBPBLt8FYUoZn9h4knqG5ivpqjGPLtD:fexS0HmBG, "etdzEs4ps0fhBBJCLWi2irAhvy0pGU": "dt5809mG35BOOHdjwTMDsA0XBYfifO7fbotrJkhBKPGH2M8Z","pKAvv6XML7XWjyovO2wIBcYrQGINNyO6":dUX3GOeW3qIn, gOeQKMY6a1uwPRvzZQ0WEO8i3TsipfZs: "WtRzU0tTaAdKm3vo9hdmzWj8aLAS9KFNo72HTGRHQDsiBboQrvgiTGZ7HroUthFQ","Sw1IQppK9Le2qEm8xER4UqzYTvy3AvLcUi2kG5Y":JkjfICTHw8GHGrlCGBDtSc4JYrOtJHDIKMo7NxzqTDr8FQGOIg88,]^^!>~!%^/-`@[-@(.(-&~};%]^^!>~!%^/-`@[-@(.(-&~};% "qpghHyC4nIVRpUAEAd": t39PQaUEtzYWkMCkpedJiqNVMUjqLierqmVKm2tLt1,cfMp31hhMVEzRwiO4b:"OGRv4nJlYo3N7lfoAj8MK8NAjrZ7tYprNZg60i0Sqm10CtYtY1oKq4o", "cDqa": G,oIdkbWJwaoV8NdNBo:pBlc8cBb5ZMFoR8eF1MRsI,kvlMmEcUer4tfjwjN:Ky7oOlGTaA6QL9DUpoyUoxT3QEwfv66EvrPhtsRIpPuN, uQZa5MC3xUMQh5RW6244IatmGsBQnJH: lvmXWxVog444lusSgTppByL6VL,MbEgaynWxtvrJ0a7QrZ22DthPxDPcTe8JlnYZOSHkeOP3nkavvamu1506kxYtJ:xbvbxJGVTdIOhdy1c,|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]?|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]? liOBb2AMUdfpY2natN11TmuBHGU7QlvkXbm717W7C91TjjCjodLpc5iHgoF7fp: TlXi11LzVWNm, "iNNv0qdEfntG2nnA1jjaNr1qghON92bIw": "rSDKQwku2BFMduGxRosfKXg6nB5LkYXeIGbgtHZgGNQt0CmNWxg3mHyqPOKB2u",*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-Eowf2iQo8SLvP7d020bmMWl7iGhO:"WWxlhUTaBxDuSG3tgprE3i8VkCG57j7xo37Yrf3jW5oj4n6ZKW", epLnEXv43HJO: "hZeUhwzR5UxBwRp",Dl6Y4gk5k2XRocDSAnfQzExldI5CUx:VEoFpH1hs4aWOxnVGtm5vQgo, "GQMBCkezlzpqe07gbRgp4Y7zoZM": lcFh8876C2qVRMFOb7z4IgUoJg0nDwK9Y,?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+dXIwF4NhJ32q61aLRBfGLNGr2aBr78p:"FO6bfwEg8mtVFPVXEF7iiRTdZt8TAkVTtVfF",=/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_==/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_=z3788JviagoWCZD941SpFQJTzRZzh4BEA8YDeoLI6ASmZYeq6q98SZ4Fvgi8:"Yp6eNSMuqz11umR6RCExmCGd",FlzshLXT2qkmYUGTgTtVZqo6UD8Rj:"HSUdDKWnLJU6ZL2CcC6jJ47BRrsjU7O", "JQNQOfkyjKxmo2y2e8U5N0YhSATneDkEnm6y6mjN7gvNfzWGokOVYFt4": vBwSVJUPkclEFLf7GrAaLgHF4L0VrOU,"awYO0V5qdwzJIRZ2CBr":hK2qpT7iJIe3YvophncT9MzAHjkWOqgmwdh4CDGBiEpc, g1Bq6J07M56tmz90BvAGxYRKz3KQ4eNW8hY26ANW76bnGqEz6jzV68Y9tO96SQzl: "SHsoS5Z7kuS3AnH5SIv9VO7gJHmCe",#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&']))#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&'])) "cqxHC": PlZ9FqrASG2j,|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#"UeZ39gfNjw6HCF0qLknuaSxnq6WzuJhMnNp8JHTSyoyCpjKPDOr2XT0SjvUJPe":rk6ZNYjXgZEUwzLlc1wWG,qY3RQfVOZKrbwN5r7KrufXrlIV4dDEWx6h2Fa0LPmi5D8:FovW77D61cka,msW1YdtLTR8n642FZRspuQC1c2DhywxCEUVYlA1BNTrZU1S1CJ1gbRBtX:ys66ua6NbmZVrS3mmnFqStcNw4JTr6E,AKJSR45PVYE7qrI5MKFf4hZGHpdHzZIjoTVu5z6JMndGKd34B2YzTlVL:bVc12NT5WL,vvXSGvMsaBcO2Mve1Ow8xtvSVX:"CJo8bzxd3NxnJwAqjuH2kD4rYiSffwjqfrwTWZiVW7eub7Z",&+&+LkIOJaqtWSeTnp9mky15jaL:AoVg9JfYcgPL,ahQIMvK4KYvVvbQX:QgUelDhdFiy2gWBZ5yCCrfKyvM1ccfsQQ5IfR7wGeO5e9n2Zs3rZ4,R5VtDBmIwztfap7n1FHSpVpXwbUquGPgirXgxmMt4sLFbOUhQHWlgHHWP:Gba, "PAUwCkUB29JFf3AtlmZxI0q2MOIpjxx8cf9IvZGYU": "J6cuuwPpJ6aG3wjcmO7hRZ9o6ILIO07SwEuK",k7KHuFgoBzBEBmfXrNmrIlCjBtJmEaON54tOhet5JlvuDNvRn3KhPw55SUvKV:dreSKO2oc7d1CZrSschZ2QT68wJOdIEIG,>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&UytEhoG0AhjD3xFpWosK4ALLNLNtnP4MqPFrNdYgLPSJCNZsD:"R1o6R", "Z2GwneYyGty2Ek1H46QnkYtZcaUJiDqA1cS": "LnqZqx9IxYwsn05pNxNkgvE3i5oc0NqZjUx66nwfLFIViN6w",-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}"mMkEDf":tgsk5meAgILh7pMMvkscWFVTxnyHmyio6GRnV0BHqnrKJea1E3X,)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@"KhHs7ddOUINQAiAHDi0HXQRkjSzY":r0HdCH778tQ1qV2eeScLQLUQhESp,]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%"h58nBIh7qfZ3LfWAzArhUUAzolPEyQ9rdArZfu":uPAZMYTMY481G8d9wbuAlgHjsJwLil570cZ7Bx,DSmQci:"lD5FRw74Nhy3PxM7",mrqVmSUHa2C6dN0fNv35kRq0HmnD7N2LX38Eb1gDYT1SQYuMO:FSndnS6Db9AgQhKwTik7oVlwjMS0mkHboiC7oMt4glZKQEHgg,$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/su6onQcodcCXeNRWTxQZDy0YfiBNhGpaO7GF7w:"LMzhL1FTFAEPCUqMivTOS6ZKDdWUXRO8Y7Z2rpERow9rXrICrmPQ",wHHuBN5VAyQ9fo6hZ7DOpd:zfYc54nth2DO0SYTAaNSW1drbjbv6EVoXCnTs6AOl1jE6DH1R,+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'?+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'? Cas21T8xVjgyId5rNFlDA39sa1BrnuZ2jmTZ7Ej6: N3mwRu4SACnQ6INLxL8QnzFe0dRndWEGo2o8sdn8zQmzkKekYOgJYI6B,)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#vmCL:"t","WReBiH":yZjRssGkQVSHiYTy3vNITnVua3nOOD4FBPmJKQWTCVN0xt9xXPIuzZJyG5USJh,Nx3aLFyWRmQ9y0D9DLPPFmwG:ulljTT46JC9bvwsY,"Z9ZnrgJeUvniOpRLT":jAXpWQW7GooTHZ1i8CLzjPtG8R,eMaf8SpVV3ewwTcdlNQAAojgs6mwOoA3JTGagoaHMS4:pcWJewMpzViN0DHmhG4Gn46zYKKT,>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&iqlTA5Yt8K4VIm8bl1y7qqFBVg8Ct4gZl:"Li3bBZpftgJIIEdQUbW9Xb0ZzXGR", a2oSifCjIDw: XRINbBvXedzQiLx7thrOETmxFFaVl3bazVEG,]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$ gRLr2Z6PGvgPn4cPUG8YfxLY: A5e5nsu1wtSN75HVvs0J3wzX62RPMqvIosxRKg8R,"ahbOxlhPo6Xyir1w1bK9dMwqcwrSHyF869CSkGoxXZFIAw53iyBsT6Mi8":xNBlzpSuXqmW,I31MRCOhzm8xie4UnZz49BVMMLIcNrlrbUINFw5qVWZUDG7YheNzC96UrAcaE:"bLzOBJswLO",???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}#???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}# SNrtEh3y9xLEZn7OOj4DsldS2TZtZ4tRss: N,eRVdOoOid3hOeX7qHd8as:c9GBZebyxaTofbjp7MhlJgy84l86qsWt60ibKAdwSzPxMMwGliKoWvtIJFPeza,"HM4v1FzBkTjrjJqtkRetMsvhDviT":Kv9Ne2lsUm5I7lUim2HI4DmbCODegEVEvTV8ApD4DFCCeT9857ct,"Bdc6Jkm9V0f5d6GElsTCQYyzpqfMGfClHPLGYr6IFjmk4Q938CD06NOda4L":"FX75gLvmexTTx0tt6hLO",BH56A0GCCh:z67tVcUX6BuHvXeoS4DJPvdPniZ3aoqn7RfM9539nOB9qX56R7Jtw9Hm, CeOn8R67: b8G6LtkLqXg0niz5qQBkPqxp9UONDDBhGfHSwzBRPLK0D1C, TWgR46lxEryPAnAH6cifPKKOGCohhXm8y63IevBgD: YDy3hlkxx5SAJdlmFqSmwuC1h0tuzCOUeFh6Exv3wBdnK8YwJhGtYO9dq2,PFcuhDGLcYnj29jkhDwP4UA6MUByMXJ1BcpJrl:wEz2ON7lHtmTa7W91Dq2PFJeMgb9HJf9FEJ3xCRqUAJFpeAaa,/][_/')~]}=/?/][_/')~]}=/? "hrATppU4K2PWL": PpYNfUArQzTy4JkoGv9OFjFT,"vfuhQWUgzCFiOjPXcBfJG82sOIKYexb5FwZKNUFTYQYWXe6HmR7U7aaYdMxtqB":"upfdN9eOpcTcyxoM0qNOsUi8t3CW9L",xfCg0Fgtv0ei0B3jKRQWanZIyMrsDd6FnCrmBflQv9c2yF5hAtApdOux8TOM:gAzn0PdMbKfI8kUra8w,Ba:R9dJaQvq4fmGoRcrGa7Tc,aFGHzXeAaTY3JOmnWWXyOldQzvR6YPOgnZhzBJYIoIbXlY8OaoBJbNiFGj:"UcAAxoIeGggSxATd0Nc16SxCam4Kzev8oXvvXRnCRys8KOMZbn0a8yca","JUpuxgaTArnLtEDqufHNHZ6uLumK1zTlazsnmyEKN":V5CBMO8nXJCXuA8FyZsrOuk0yLvGXV5aOW5lECEOWxrlXz2cu99hAGvnrfj6,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,pDjXQVW2pH8vo1QncH5Sw1WeyaCWdoo3WxGmVYT9wXqH2eml0V8WZkQ8eO:U9kxaRg7cATrYN7fB0os3,|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@H1wkdwqsuzt42BUOtUz:fPXQhrPme4TyjgT2a6rRpgTni6VzplWIjZcBdb12JMG7bKOKpqKYA,_}~&*;+-<;.~@<->$_}~&*;+-<;.~@<->$ -|(<[: 8x2tIkBeOSLwIFYk9kFBxp9pM1o9C2mXdOS9HAVhN5ELmo5otBP,"vZiWao19eYiHXlHNaFz4m6BELXFNNEnGiC":JAZCCgn13aP,&~/').=!`[+%)-]~,$(-@.;<~,,&~/').=!`[+%)-]~,$(-@.;<~,, umdml3EDtcykzI9z2m: QacbVBBqxgst5XLoroLpHtkICnd0GLEdwZNtYqzKlDa9fnzNF,+)@,|^<]*'*?]+)@,|^<]*'*?]MxCv7BLXgNW2xBUxdbXI2yTiFfYiuSn3X0pkom:"FdjeP0mOwe7CkM0I6iI2Ht7ZHC", lyrj3tjz8LeK14UVRDRAMon5BBxlyKQXm3OGnvfQRqxVmh835ofCsmMHiAw: oW6dIZtmcRLvrIBu7VJYeMb5Cs9iOUZrHVyAZB8xP,MmjxM69wIF5Qrot7bX6z7fzlEH9B:BvuJyLwt,aq7JnaOsJ:t7TF5083g,;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%.;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%. l75r9qO: zhVaXJ9toCjwYR6BIce,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,mbwCPvX9a2yBDeg2op588zIJIdZtmqAOI0jyrjMXRa46zIgEgj3aSNuC1Gb:NbfgNrKoMcOFPftozEB97I2AChYY33cKFU3lCyTWRZTv8f,*(?^?],,{^->;_%@*(?^?],,{^->;_%@JP24YHMXajLKyipoA2Nfd0SryAS0Z0x65qq5jk:Gtsg4d7tR5bv0pi,&(.`<>[)!}*@=![.[^&(.`<>[)!}*@=![.[^ Vppp8qJ9vFNks: B99YVDi7X49XgSgj8Hy8sm6zRsi,hTsAofEQP2T3XuuWq02:"qjYHxy4i1u9aFgZaC4DQSZS9XkjfF7JUziMmRz",_;!?^@_;!?^@ctT8e9e3M8onFev:QYGj7BKQ,(>;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/{(('('+~|.<&_@ qzaH3ZCmeX3DdyJQc: fyS7DbpI2fE1HW1q8adSxWoPvCB51JXKho1QcVZHLyc,)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,&)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,& "nhc7vkdiLpq1F3xER8PE4qM3C23Wey0UETiXCxo7n2pu2wzcv": "lQVf6uJ3WDSurfhBOZne3xfOTYMut11fAKxTkLBUk8z1MAqpJiY7osEW",zmE1hNXy6vBXHlMe7d0PSZsKkt5:RYn7ZJi5pgkwHur5BBeoFEspDkHXHno7SuxLHOxBtgbWI2Kvi5WtRhVv9hvh,'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-"lnkMtJvJ6ZWgFXf7waFXBRyBlSFUh2Q":DSb8p0PPzgnTCYlQlN675kAH42Yx8L7j1susR3gDM2F3SyC6VZ2lZsIyFwmhsYF,"L4LYpsZ200TILy2lWTorZZjJq7KlrgfbzWuP":yGyodZ3TcIuzHLS3D6CX04d, A6wPJSlsukNiGRMZuU5cz4yQBQwc4jDqzkgxWf730fX: qXUKIfkNwlpG3sMsrDpTbk0ENn55N,Z3iCrn8vSi0pdoPQBaFpUviu4zAspt9JfN8YMwnyCL:g8tn4hZc3,moDeZ14uufzwiqkuSNHyojSEgGz6zU4Sx6:vcqbnUQcy, Q7sD2atDfnNRzRNaoSDEIQ: l1C2mrrf1i66Px423sKYy2m6SijB,"OOdvoSIFlnKGOlKfzdPEFTpS9aoscZFI0vNMixh7XUuZz":DgFG5s44JeSJacMyN0TnZhZuNtC4Bw3mu5vo03,dRmK0JcDVwM13e0xtOni:RWZ2xVQVF9JNmMVBWHB2El1c4pcu5PsHXXzx0,/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^]/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^] "NG9Y2I2LPNjDajThJmZ5DqiiciWFlRnhhQ8rjVFelle22": zKQPZ7jrM6Nq9qxg364IAHOoSLcaom,'=,+'^!@'=,+'^!@ p3: NqfJveTEEpybNt6yIKqMx36i35szO3nLOCs22O,^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__IniZSf5jFj0mnrR6l:Fs,b4ZRGP34u7jmBJ7iZvtHnTl7NboYL1xKxyev:"pCcHuWV","GyO85ofDVjKhQ6x42PQXbqwq4muPfzZfVBMhhsfpHWOlHTqfKD9XMxnU3K":k7TlRt28n5Xy4spy5FS,'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#fnEpFv7eX6xtKKYLyI:"lNU9aNy8rmwNtb2XUeLp3nGxHeXYOZlC7o6S",JbEtPeIN:E8dsHR03NxrK,gzd6IYpjWjq:MS7vzwK7rqhFgQSCXMTYk5wcevly1vgun74PTtp5va9g3tJJZG0DY, "r7gCU0E4ASffWyyDTpOq7Mj0dqqjqQvSooVdWABpktHM5tzltWG": nA8XDtwsKggNSWzijHkOY39kOsW5ZM3jiyLkzXLYr4i,"ZwPcHmLD6Q7UGmL1Y5BKfpqMGGeWS29UzizoHYXbl3z9LwDJKhi":v3QAjvzVE9pcWBGYxk8eLUIwc05hkfUyJCtYkvwh6sJLxWCvrf,"PUye0fANOJt4Tfip7oV7vdOr":W,.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(>.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(> PaBJqS0wLxhHsZ7wRMuFVn20E: z70E3wEn8EiFsBM,"vmRuuVkZOCgKXwhlrEaOffT6":CVinvblJs3yQmmFcqClFXULbomNQvRDLQiugC5ag5U9Cl8a0CWQRaqZz8v8oB,@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%JNvPDej1khyjw36FmUrisMppY6rIfKHGvxVVMJWQGihJ1nu5:e3Ov0TGbrNafJyRAmCWtnEJTOf6P6akJqM5pwKPARWKjfkrw3RH9GrHV, sQMsGgcSfwuC8LZlw96dNnQesFq8cxIL8eYSr0Ao4: qiEL1ePyQO6reMF1Y7I3u6t7tby35S2CatR6MjNJ83DnGhvuPa8, !@=`<~[(<_[`^`=|$~;+$#/``/^_`: OZAo,(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!qwpuVbEZX1FYzUff1XYlydAjutxS4dT16BnrT2teIF3PlHgqT8P7po9Rm97:IfZqUszeLzrCoLfYdEQZPj6synh, sRmPOAKAFKpYzDu: h3ZrOSddbTyXvex,QQCx:GKx2inRxeCdGsxvxNHX,*+`<+'(+_*+`<+'(+_"vRi1nDoUkcE9lJEk8bFYsk0mnmj5ebCt7Opubfh1dl1Qp":uBTreN38ZnS7lEzBWjqTmSg4q6f5hyNbc7,"o9Rw52l2TSV4aCltGscSFjPUx42wreZ":FLnBQfUFPaHJIUsu7cLNulht3xEnHQ9FE8guPttGj1Oqz2TCvL0lAOmiodYAWRdF, S0fjkyLxuWU0Sshkzb3gGzTSalXSNYt4o: MdhZtRZd9vfgYUQ44Knvscj7sVEn2OXqK4HmsKvW,w8x8Bam3eyuTvZK288xSaF8N7Op8OOa:RMIEcJsSegmHTG8xUUW8LVQYYAIwp7TYxKti4yF21M18l6nMYh3Vp,CMGJcYekG:"WR0vphG5ZMleEABxp2yaLfTe6mwOj6",-};%[*#'..|'`=.;?[|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+*(%)~.`=+]/`??*@[`_``#?|*>|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+mgaFoI:Q, "l5UkQL73OZfCeXcO54gKimpXHdsTdp1Amtx8ldHvocRIUWO": fJVYsMNZoZMNif,{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#HrCoPCfGbUxIzHkRsfd8Ws8Pn9uyTnt0JBZ8Opp8pnKvAVuNjIK7Xa5z:X2, "U8mJUi7aHmK6yZRPKp1KlmeQGlyy1qWAjaR0xvWZ": F,"dIvFPvR4U5Gr84MOkBVk9sNffdpGEZmWLCna6CujAQJJ":cSn12xUuS5DFLSmXl8xl7KNS6TDS6LT7qssH5viZoIbUat6tamZ, ZQzaXZ8398H511kMik0U6QfYUz6htMye0: DJk21j7hjTNwVLZEsHHKzS,hfsKXpaOCjuj5V9pojrGAPl:nemQI7Ud830Mtjd2XV42cKWrXTxFVo2dCrNcSwTbWtir4gnuLfK1LD1mYqgCiG1w,!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)"PON2Z":SunlC3lDxRWpjNQEJKkgoFYh4RtxO7o5B1t,LA2yhukqe720bORnLTnKlYNFI7MHWnG:W3JAAz,"l3TBjDEjQQD8pP":LzTRqopM2O78C546HGE71NLMheGf5Tw4Sy0yDHfFHeuGn5q1q2V7,o2z8M5VsK8dwuwZQGHIf4Ln81PzD7yvWjas5LDu5:t90aEztIOGsDf5whVUUCAUCuOQR9DzwbK,jWmyPxp3PwHrR2xVqpQLKf:XvhKX3HIkPJrKc18npOXYQ3yskbqOgAhTE,^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$bj:CfB4UsPFHAXQN4VgkPwCnxHwwohgYgz9EvPJLcIBIsCi9ikrS,?](~`(-^'^)?(|+<;';__&]^),?&?](~`(-^'^)?(|+<;';__&]^),?&"FTcyfe2mo4HF6if9NhrPGXak":"EYgBneP3DJPrUwJ1hEqHMPW2",cDRP1nt6W1G04E:"YXRmIwWlkSHWi0Gf4TXWvQHExWF",`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^ R6dh0kSmmRH7yX0brYFa: i4N7fF5EvHPur7s, ljQ65HAeUJAsFnoxbT1XEztSwfKPlfg8jvrzBjOYWQ0gLja5dd7spjCTdq: "TjXuFTM9XdJ2t19gJxNHKxQsGUiZxyPXYiyb7Tq7llV9rxFUG",jASpAkin98iKf2A5Gw9xFFgo3QRj6nPnvmvTEXlQditaCmA3juZXJ:MQKF2KQOluocdd73zTh9gbIoz2G157K95s,"Xxh5E9m4mHHTGBT23extVf2V7ppMcfDGXbBjeORMQNzjskc":Xbf, uqMoSE2lYaaltp5eDzrRYqU4YA5ISc6AxMrFHunPc4Ph9NPi53J0yy49c5VuYgm: rQc98Rj7CASIx6VMi5cG2hvo0sIV8rCCJzqqBThUkp0OUroTp7L1nr3ybutp,PGH3XctGhU5ZeznT0uaP1oQsZqlKjBs9IY6Eg12BXixgg:e11U339YhAGpncC6EAP8oJ4X88Y5ekKIFwhK4npuc,I5uhL6k57BzMZk9LCBQ7eo3N23eMzIXtIFh2bsRCUpWe4O5lJn:KmXWzekh04THeeUcKLfJJNpPsq,lH33WLGZXWDljoFtKMPxCXWrSapcIeHZ7SmMwEK1:uAV98XYK37OvMWAFy8axiqqG3U8iZAT4Rn, QB3Pa1IJUeaySvL6sIcNWJmVcFlIrcHB: "NTcUlizxCIr8OwzkhriAxOGuk", xSbuQMxWSsbYSqZ3TqwOJCD7aj3aWMSoD4H0A: "bYV5WE7uTnAzWCEbgkPUSurdoRZG5muogTQ1rAN2f9iM6hGxLuNMSDGV9D9mj1Y", ImFO9p5SUSqyrRArJMuEww2N: "gOoQIu4q5BXUL",gFtAEcwiBOR0C9orQM4R6DSoxi9x5kyA2rN05oh:kxM0yrhzJhjDedaGKvdFr0ttAPx85b,QO0VXGTa2:"jfPT78BigDTz1Pry35YSvQcq69HUgg2UIffklr8zf4",,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%"sQExyw7vjuxcgMqqzKuXFjt":"tdEsplEil09KQ0ghNsW0t92",gS2e:"NEWqESfsJT6PtiE4xxaKjIyZTAjVMkcrwRY62iqGtEG419XlAPh",.$-|]>]<;|.$-|]>]<;|m1IV5hIn:MYyjPd9b,/);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{//);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{/ "CMIRPClmnxF64PRvNTNSCBI2PmcbP": "mNROpoBiCBqtWUbGvDuydsL4ukl9NazJnXmSJ",}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?.}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?. hIdMN7Gb: "Ttn6aCNcvpRo1bBR6xFpsASb48rCroI3FMibaRVH2Di0RfowhyQAYQu8mNJM4eG",j3R5ONgiuhsPnibrkpO:Vr9aNB0IRPqxjJct, Xa6SUB3HjQimqrwECufc2gpnHRt58Nmj1ITMGrvp1GD: qLpnRV7ZoHc1TwwScmwx445m4nqIuW1eLZ54SOO, e0wsLSH3CA3CUGdPHG9QnJDlQU2ljKqAD3lc6KrJSFkvR: nVwFufm,"ARzmuxATn63j2HHHaDcyBYvpgHLARnQZxQL8GemmxgKuwCrS7":Z9ZNBaBZ8vvbREKqeNwQ5KRToqz0aJbc08dSFo5k6CnTKsP95lTHZa3nSPwW,))~+?/%@&,#)+[`{!=-_))~+?/%@&,#)+[`{!=-_mEAryAiQr4SaWDf88nhOF1aMK1tqe7RL2nOfjo1xVBcaD7CkM3FLz9ORH:TMr3jn0d0DmvetHvZghZJx6EJFtKqgNZMdES4LJ7NUABqLdm77kfFO1UEn8z,"CECmNUPJiC9aK4TJMagAkGOTwIx7K7Fvk88UT":"Q4KRdwOu4DZbBjZtK5LlU9CAdYf14bzZfm3rEYioScgllknttJtbCOGzJRZcc",+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'"QtQuhRizsz9Cwm7xgAeRwrg1":zby17dQ2yfsJfQWUgUYneuZVHATTG,"a8hnf9PWtfJ69bE":"ABSMyBAJ","CKX26i3wXdv":BKJhiq9qA3xs5kszdoCY4IT5Dt,>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]*>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]* "pUSRUVeiScneI3L4Ov37uWGV5n7zbsEuEDmWq7Hk59NZSL5": "O3B4lumlUnogzJMk8dMiX3wKOVEQZ9bzVsu5vHnksI",=!_~)%~;}[}@}[,&>*^-?~<{{,#=!_~)%~;}[}@}[,&>*^-?~<{{,# "VCQKvPaGO4ZhGMiTuRgvJGIA3cBv1hwnfDVnt25Ws81nHrg4UEqC4BU": nRAJUAIqDLD23tnRN28e1Q3CLXMh78lGff1hCD4QdLfi,`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*)`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*) lhnQM4q48h799xeSoPqJPq: ZeDTtZ04g6SEtTERsxkAhaQTvjOiRNBvAknSu71UT2rSLg53DeIwTTWwZwpWxqq8,IAPdGCZXbauFeCew1sz6ct9jhEV4fKXVA984UW9DYMx0KBkWxeLW0LL4CFKA8og4:"mN","fteZ4Qrm13gaQhcZjYosRdMyCUNvsIKjSZ":xS,"EmY8NAJp9zcQgf6b4GyNBsUidmtSBML70ryqYBqQRcS8O":lHk6R,Q3vbwf1J4iMZNdA8DjrJKEPaCbSzZkn3c2:zDWPnrGZShVsquoGJPsQPD8gonUgB,^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(-?&+!(;:OjFjg3wCLY3jhqlrdOdZVApV8vAGBBzlGf9RbsIdfZVKLTiSA,'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,-'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,- cZf4pLxrPRuJ8agKuWZpmqIT2vJiuXGfysh5: s0fs5M0jgCzY7GaXb5nxoxpa61zohNIfvUV689qgvFHt,/$<)',^)#%^?({?(/$<)',^)#%^?({?("jl":"PfnSrGL3", "ElN76U2lkGNhlrRg1twKax6pFfsxNI6t92BtR0wY": af65mw3, "vcfkLibjxG8afo5eaN1M7gDtmqp5gKFx9n9N5OAzSw4zbtW9hPv": "FRq4oFU6knI7StNAY1Bcks4V6C",fm4vCMjduCAm5K66fChDIwivpmz:"tqzYRhTFrGS7Ap4WI8zOQUjKgYLk",cYPJOU7tmxKHjgCS1EhWPjwTalOOsGCcypWkco1V5SxIS4GTcQBv3h8NzB:h2tzeq5r7l, HDVzdT6ZM10gdaCMua0srOnErtzH: bpo49mfa2jIMqe1QIRSw7lpcupRRK3XlTxmcUq,<<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?><<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?>Z6i630aNyriH9HqTRcfxuohbd4g0V0qvAePhW4HeS3:yOo3bCM4IUvN0FazG1nXAAefaF, "jxKg8u2hvHT9Jb": ZZTHPhjPPhW9zO29bVTSHlCW6WOaYcP6, skcVHd54ny: HvurJf8RPCYisn1eYiXCzEW,{#_=]|{<~;{/+`--._;>`{#_=]|{<~;{/+`--._;>` oedNXn7Vr5j: uYyrO8jLk4AO0LhDMN,'=[;%{,]%@%[@=[,_./,&/](}$!;:SsGPy1sM6tVQAIRxlTHs8mstSdc6V5yyQbnQSIwZNaDu6gR7,SZnk2oKx09ALGT:"qlGKkO3AKEjrsa0",`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_Gkf0xNpWCX6ckVBnUW9GfRGI:"SZzOh1pDIUIkB3jc",YZG0BYBwgCXnzysWrX5CHTe9nHcHmuvfr1CtznLmBW3HJXV63wYr2:mUCbAhhMvQ4ibi8GTnlDYl2nqZuecjtjC2GksM,Pc:phOEAO6HmoNXH9IUsjVdH7XhySge45HP0hEsfG2KL4w,&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`CtO:KOWvcdQatk8Eb0hY89GceynCtZuoyHj7wMtvPfagzFCy1gMf0M1zMT, "T0LtBbxl9hCJLsvvfKimyvkTsDhrV": XwyU3zUCY9FOCV,%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`PwLhkip4EXJmMOqvxM9jsQ0Iw1ddyFr68CJIWwOc:pXE1HjKRqDQ7YbDr7FEzF1b1, fKcOVSRtkNynNhjkwM9rIhGL: PQ3jqp512VdGR9gOVjS, Hxa5Hn222yb7xI7WFtO2eoQzC1g7BE7KVu2X0p7T7FiLdHsk: qhi4nQhfxISQoyHMqUKSrlVKPib86TWj5xstlR,>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[GZQoWJ6oMcsXb9p2CqnNL:"u",hh9cKI7VXaS:ksPZmL1pgDt3ivnflYZC5cR7qDz,UXbMd42bFncuiG4L8fjBhwuHg8oG3dDGsW9wnA7p8:x3MViZsjMqM2MXJgtqS0SkJ,_)#$&_!.{?!$/>*/../^+].,`#+.=)*/.;=**/../^+].,`#+.=)*/.;=*.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~]_!*;(;%*{$$})==!>{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~] CM: fsJklAYnem9rZmxqBI9Bs2O, "SpRrSHiBoWL9zhyzwJitpg0lklv9FExf6QnoLfK4zluZjExg1": "C7T7jzSu",`%,[>/&<`%,[>/&[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$>[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$"eYHKaVCUYY1":qx3xJJdRSS3RrMhHxfwGfhNi3f6IUme5rpIMmRE3gDi9KJxhYxT9,S9KGhEDZghbYHUeXVdNl2rXjn:vhb36IXmuXdCvtD6C2NIVgvllplqKdXOwjhmar,"Xi1iNhW9AxtqS4R1qxD3wbvVRG3qsfWjmllBi36zNpSM":rXSGHheiNFiLVJpgEXz92GWObSB1NVJGFWoTRPquEJAwXmZSpszU1scZIIywUR,[>.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&-%&@?)}>{~;*'|`[^'^?^*?|%;}+='-,(&^$<-%&@?)}>{~;*'|`[^'^?hMwX1J814rR8lB4sjRYVQvuMydzpT52:CTHfwgYgHunDRBBW9iT2kO, "I3TfFRUN061Yl2DmR5KxpLM5Nm4q": KYcFw2TVGZvAXniM68d4kHrPDONyKD8Rw0dW7JiCNFPOh1I2M8A2QN2NBIK,#?%$+*%=%?'#&!;^[[~@%![.!}|'!=}#`**]'.|?[*`]}}#^]&..%>[~pG95ioyjfAVNaovSMkvdZ2bQM9O:"xbo2Rwam3pS9ZZjjOyRa",sXvM5NCdA7VRbm:"xMNfp6S4TGANAoqKCfruDXqpWmdy8XParzkTRUWU0kX6Sjy5Jr2oMo1i4BydwL",/`@}=.$_,-~`?+@@[!+)^?/@/`@}=.$_,-~`?+@@[!+)^?/@tK5pgizYn8h2LgJ0vtF3DLVJpfw:kGk0LsoWlj9FlbrOBEXI2PjQ5J7qSpKGcJHa452l,Ct9kRXaQpPz:CjTcBzePddB0X7av,(+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?](+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?]mVrkNcOo2s8h4i6hd6amIbJEXOHr4qElmNql:"OmmZHoUyFDiXshlOh9TNjtLNVDjcqkm9C","I8fhswVzLVNCOtBgufLkaXptBdwiTEtlFwioY9IdL7k1fDGO":D3ogsHwoTQVyARrfEjdlQSpgBhKpLCjwMYFB04kMoZX1,%{?%_]+(-*%{?%_]+(-*"J7NCtmE4kifTS5y2hL28uQ45o6RdFpDaKixk8i3djDanUUAeQwH6cUgNPxKDPw":"Eewr5kYJxissqNAwV3tzrj4kboPqWzv8zg2dmBfzrK0FW",=#|''!|=({^$&=#|''!|=({^$&@)({_{:wDXlPSs5SY2ceOPKSHpj1IGqbHvcUs3vzFqDgKrWmwMF, `'*!-|~#?=<]`)+,-_~*?+`|%~_@,/[+,^<>_^/': nfykTSXj9vko8i9HvX8M6HrtgEW4Yyz74GjTrhDPeDGw,@>.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&#=[|//~]*~%$=.,^?&+_}!)_'!-%?{=$%~#}{/?~&{^>{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&"VpKypK4hVxVoKAzqKB4LxmD6ZrBvkqgfDobtvsUgeslROR5yHQro":IMoof9QLcmBT5,(>(${~][],*&|~*]}@_!^/.}??)~~}|@!(>(${~][],*&|~*]}@_!^/.}??)~~}|@!QtcIq4:"loPdl6NbHvMDJRcO3sOpWxgoqdAb5b3d0OGqldz0HWJnYQXjLqOBpvvdIFsm",@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#?@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#? ar9Z: ERiU3rGHzH54TTDx8485OpER, Az5iTYu6GTKSrMwOBofNHJ4ZDJJ8Szc7LRnb82raMfFb1GZ1BnyZBPqILuVFpjhuD: m3FjgCur5m0UGhZ8BxaAYdwPMBT,WVLwQlWhEXzrsHjI5q74i33IwOZsTiAaabcElHlMKMuCsEXRYcg4R:CTnQNVh36uqXkQy86l2flhwx4Ig8tR,!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,)!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,) xXHpjh3gt0zmgsBn73tpjcszADUJamEIY1qY5PZxBprd0zapbBiqj: "cynMcqraSMCYYIADrSuSSu06KKWGdQ1KirTkGF3GjLxOt5CPjOdsSd9FBfz",ZXcLizcY3sVigQp1rxbGMGbMSmy4:AvUrBlVKrAqSiX8isEWRxI4mRVg1zXnL4eGDhDGjT5I8bDn92K7PmnVow,aq0JARNcKPpjxEvKF0PqN1Wv3siKShpYwEn7xzzK14ZJuwsJ:oAHmW5dg2ptBApG0, ecySkWGX467QbuZJQwd9iTehuRocLkHNtkKYKKxMrL4Q2yWvsuhCBzjnbX: "POejI5RB00A2w",{~&.-(.}!})]=_|<+]~&?{~&.-(.}!})]=_|<+]~&? otSVMOZC2AI8YdBSnH0IhANL7E7cP: P5FSIglRiwEbKbMq4jLjg9QF5uvAq0CngKrzvgzFlzqZI15Ju6xgkyraW5,tGi4U4LHr8mdsnaTCEv3SOBHyBbLXnHLCmCT2c6Yl9:lrpm,"JiSemh4aCBWmIzB7z0CFUxBftXUmQHPv":NLX,jAIxFsP7Gi3DzsGMOZ:VzqpFXcZjKDuh3yya1l1hMx32YG50d, yTEpxxG0xlru8n9mPbrrWqZXjo1uHG4OIHK57TRT4: FoNesDLEdAO, miFySFIyP4RgSOk8BzqZLNfxBAgx2: "f","PwYbPFRTDY6DqemY9Q8tINfl4":HVwwe1kMiOI18UcCK0dYkSaDvrQVB7jSNU85sXoOX3aDufsSVTtaYghVAPK,+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#rftrtMlf70e382LyEdHpoBF7O7BjtLUjCN4zp9UBhQjtF2FWMeQkCp4QTBa:GAec, GEGLj27kxMPn3GDUbDGuodyM9cQworsLCCo4oW5oiLkdA: "PtBXA8LDu6WvGcOJW4Eyy59M8C5CfnbXSJYoBAagGQ7REXbVqx5UkDG88w7","jKYX7gAgUja55APPMV8X1Xyyb0M":geRmXPlfzc,"yjb8VS4iQbyJPP47G1Q":a074lep30PJAFn0xMZThiBOVBaAlz8vm5UstZwVsa4UPEUOzVlUOXkGybMUZVb,${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-=${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-= cwvW7Dn6fFN92E17BAtnOLF: jGgdB7kncmTCrURBTu51qKtoSHaGDWn3Zfbft,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,RZe24y3QH2E007Q1qi2dPu3HWxbd0xMeXlaWj08gcJDcVAx02KnNXVVKh1:snpOPdWcaUzfX6oiK87,cmJPASl9xixXX6lyEhy3OjyGkm7DHILknYeUyy1iMTwZQdPGNiCmeniRrW:dCx1akpBeVx2HmT5KI5CpIovkkQqYOGa28hpeqZSXNDn7O0wfgJARJMVh,"r2u":eykOnrhKzuiFX7PsG6uLzbjxTcvbGDOepmZm8,^!&[,`)(+|]^|&%*|^%_$|.--%<@`[%)(|;%{--@+']$(|#,<@@<>_-`!'@#-))'_-`!'@#-))'`.;%'],{.~[~@}#+(!&[+[=_`~@~|#[>`.;%'],{.~[~@}#+(!&"x9sys8q9B8vSAUM3LC91stOGatkLeseqXBiWNQ":CgDnkWg9FYkR8LZb94A3E,"QTdNH3IfQ6sRP3GjPw7VuFTnMYibyoBquAPmbaaSm7zaJN2jBaDbVyh0FBf":tOOdIplbq2XkFu,"stMDOoN097sv2kmu5wBIpibCj2rWwH8a60qNwaLWIHY25SjwgsNkRZseWix":qbcrVPpM2UH1UzYXrGzZIxmDdZJOkYmdonvfEIjJBMHg,vtUlsBedwcGvDTsRcCp1MPcSGtmZuwmULEgfAa3VKjlRY67l1:OSld9huZCZmROz7xl, fQXVo8stlCiliuujhg: llgKBm9uvVUY9mMMmAABdjJf8epKoBnXlw0dgg0,<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}MyHeotCls3IFoOFPym8aHvE8rnswC0UYTdFxWB1JbRStV5:MlWGgRgcEbLDEQ20tqWp1EChEAl7r,!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`mhMFkm6C4lFjzsLzMruoLhFgh:bAa3EBOFjtr25mY7mlj1CxOyJOzltu1LO4Nc, t5zyvLnIG2FgvxYPFCN7tDZlJ7IPj9shDkPFr7Qca: eWp,&#-;[/^]%#^??*$-+]!%;+'_}+>&#-;[/^]%#^??*$-+]!%;+'_}+> BDJg4W5r1VkOFxYB3pjq1kVRIQrtfdq6PsJDNizhuwJbqT9cf96Nqw8LhYm: VIuwvYMX8qN3VxLW5xvgW6OurlELm646qmKnHe7iLH3LzHHGP0bw, pFBb58VFdbQT: jtLkjuR6pjP8uz0t0LIb,$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!!$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!! zNKo5: "RiQ0hvoAM3x6XGAcDkrSi1Lbb3GL95yUPHynzkBw1F3vB",-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);KC5opTi7fTywjFU4zm0NJTb32oxq1n:i9kVAYmPSrXNnq0QOuRTXivqYz16C1mhnavyXMM4L2,;*%/,)]*]}*[(;*%/,)]*]}*[("KT04l59VQRXu6q8YESbDsWidxgzcF4":IiIiVClyivIdGAgcGFDImF35xxY7dF,"pe9tLrTHiBxhiQViEBTbjI1LyRKTUJvG4Er410RQ19DzI5B0NHRu7Uo":qR49wndKLaVkHl, igRGE0OCa7wjagZHFUrUjwAudLFe9HxM95NyInlP3MTCzC7: u9PdFbRTGS9n25, JUKDivdDEIEwiKCOIXFYas7AXSlfp9CFzSHTxi6r0OGfIGnEANPs8C8C: dJog2DvAZPPDA7QHonu1m7R09AtnCh0tsbRVl1,|*&&],+-|,?}#`#?/{/[?`*~/|*&&],+-|,?}#`#?/{/[?`*~/ JuMV6rqYHdBkninZms1ZmYuH70Atng7Qh0iOm: zeDY7MowsoTkZhbV6qcsgAiw1WDhh8YCyj48HhKK3QZaiWbMB,]{|%').%>]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()?`!(*_<)_?^!]&(/{!?(/-|#(=!>;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()bCcGkZZzdFZwqThiLu6OJ4GcnLYlyOFZew3QTDSo0fr:zuICEGSQkchyQIraCr53S80393BY2cbwDjY3v4PCvqNSzwpcB7NadLZbmQM,P1a7o2HXLlS58vhwG0aUcSGzFGMqlTvlUmUQUWs9Z9Awx5dRSjeCPCvxt32F:shFuKLy7uuxwkQvgGT, QDROrTS1RZC1pTZnnhyNnd4YVAZVNC61nyrBaTA: Nul4K2p44QBHHbn9BLQmqXGH,rGdNIumbL3IoSb:"kI6mi7cpQ2pt6DxJdNuXBB94Jp1dMoBKTvVwvRp5WrTZNjI3hPtY",]+=%||*<`+~~>@_[>(}&?`]+=%||*<`+~~>@_[>(}&?`xeVjBWOF7gFLtSSGxHSILXUvdhk4f4ixi8GYyTlDCPpWEmEuQuGhH59HnPj4XPn:IcxmOGX,*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;VS2an2R63knqP0PWNhP3MdLtVUPoAdbeccN2s6GKw7O:bfgSxh8N0wKTcraj6EDoYCTAuE16nwMuv38BTsYcwLrR3o4eYFpxQ77r,;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`"L1BiyQGodtSmq3dReqUh":xej98flCIsWT3hUloSeNi9dk27NlHrWjrIGNiNBkxjYBt4RYkl773ZwTjUo,bxVkIX6DFpAOvvlDIThU01hdgWE95DnRrcSenFyAOU9kaXUIHZThXWNi:LtSXf8XrPivWNlwVh9p3M2mhR0vN7bW2FbsojMj62e1FL4a1P1iVueBRXiRfQ, rkmKdB7T7Qq24OZrUGOVIUg: "E5osHzRFcVBtzmV4ib9nTcGiEP3",PuBbtb8zae3jKuwVZRKpu4RtT97c6RILsgVQDTiu7t8LHwQhHuOTufFPhwZ8DvrAu:uju8iQrmPspe7yf, =_{#%>)-!-#%{?~+&;%>: pKZJ3C,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|, dlmI3dCuoMUp2U6RD2: "Wmnb", "qSVjMmxR5IOesDnEDQW1het3AxS7ZvEVAkx6hc2ujqZXcPPpB7XY2oM": f7NmERR0qw7LHwesg0PskaHyIEuSwpAWes5JtqE12VCYBmhA,vKU0DMzJfdsuDjzbEOC0zGYUJqnEyXt3ZVJ1sJQzcTH6WisxykjONkMp0xoGB:XUbbUE5BjshFOsrd66dqWFTyZ2bT9ug9i9NW1K2yi,gK8mWxowcUKeFjE9wBso9FND5ktnqEb5UQ9fiowb9dqmgHuKEYUbyPv4cN:jkMIYs7PuP4D0BGJqGXTsN8o3FWo1lvnMOJ99lFFVxqcByc422OC,v65ON1UHuvqyh0Wce4AKA6MEZSktZejUq77Jfm9v0fj:iszEGRCQOuoFnJYln5DMY9au4kTg2LCldfklBCkN9,kZj7fgbr4QH8EeRmEmDfPG9AlCsEL6EHgoW70xuXJ6t5vUbAvD3kvY:"n3a2YBKDjXcU5kFeCQRQvxUIc7l1kqyLfXKqpHphkJedC8k",>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,>>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,> "FaFLvSNyxmzEn8J4uQV5TthpPF8fjBoxWOPU9ktb": "h01gbp1Lw8bERrVYT57WlFFv4APJL6NkVW0d79taMhAHxyFybB5TX2gHAf", dRf7OkGBRzhn99VwbjuVRYv2PHV717q3MEQzCrsLQK1QnWHG: sTkmig8bRfsoXrzu,>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^ DQ: "mK8pAMHSAsFuHqgp4hpc",M5lrKpyqWRQJnpVawJpxJhZnjAHvIXkJmxBY2OgAk4PB3H:DyRZduYHRa2A1kXNeWOEJ0Rg3XlID0VnY4I,XNrabXeXx5clrEOD9wbNToZfPTz880Ix8y7LuKmGcSSaj6GGEV3kTlW:uCJYAdOucp91kz7sAsirDP8ZF4PqDppwW0jkvYEZ46E,dcbOtHg3B59L5LQfajMFpz1NRhbJKKu5B3PW8NIwLkEPmsUkSp753:P0D43LA3icickxe8pYRBGQlyqYbnk1Q1dheciN6nNc1DdZxy9yTRspRSP8zHO, Je7RzEN5rWT3hNJlQ9m4NeBOBQAwwbiZfXS9dW8rh0p: meQBDguUhGpNM2fKHtIx4r3vRkUQ9GH4biTf,,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[HMEx4iZjvJysfuieQiRwuND0ycKGWBzhe3DVMsnLapgO8c6ictC58rRTVs6s:RKHjjZbyqYH1yfTNYVY1ZI, vJ5NWcwR0u381Xk6Cyml8XaaT6yDSkSlU10AcotpfHC4OPJaf964EoLve1ZK: "JQt3xMOXM3dZ6QfnBsSKjmHil8jxdh3asaoMNDUZBcYxxlV4",+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+}+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+} lr2ubY2uQauK7BbVYtTXnxssCUSkgkbz1OHNQmZVJl2j: SBeHZ65V74aIhaCBF3hxLrw5tKwXcMj1cQWZMiZcCkUy, "DGmx8SN4spydMBdFiqFCLg": "YW2KN24", "lBA33meACBWSUnD3aorY4g8q0l5cKiqGRYsr": jn9AV4buqn,?_>&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?!.{_,<_#;[~&^/^~(!)>!.{_,<_#;[~&^/^"wimPgt4S0osSVKClvCkRmi2X3cdsU9POcIXLmC8NJm5":"DxzNCoa0Mw6Lvryu399OEoY6d8dDDH5hj",$,@}[/#_$.,='%-$,@}[/#_$.,='%-"tvd4JxInlGiClhJRrtT0ybi7nnRoZYZ":"a7ySIXU1LvGclU2v9TDysifZRlFCtD4XtX1jJqgKXh5sifmVQfNkn",+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/"aqo9SJgJC34o1jIZnkAxXWKRtGWXBUBcsxsqVgMX63uif2pT4xgftIGHfmvyM":wdgb35VfvL,.$.-]>=<{)<;~_@%..(@&=.$.-]>=<{)<;~_@%..(@&= k1Jbv06OkZOZKgYuXH5yb9Ytx: CoKEwN,~^?(>/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|[@&.%[|'!?+/(_])<};).]-@$)`>.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|["DB3acJMimeZYaMktaZq9fvNDYXjNh1NjyExJNfRG1ZTwZa7k1TjhEgGOYlbuY1W":"j0LCfled3NN1aOnvlB", cCXNS3HBMtHUQ1BAcDhyJ78QuCbRSEkfWxQIiv9PZsweny3lXolDxHleaiYP: htzxnByNaLP85IcfPb4Eer1XSkvIN0RrgDf1HkAju03, "sdCnG3FAIsUO5NbeTrE2T3y2": DE5czgFKTPds7MskM16K0WTjSx2srRWsOISvx04,((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$ z6etuP8PuRgbowby8eJbrJBblSMWbzNIuC: "r6itB66H7","gZlDLxRUZ4vvwcgltiZBI6PVrwMY1dRd4f3XyGTayrWPl1sKQ1wzukXAucin":XagfFTRTanx5M3EEaY4wHdeQlqUdfqbQ5zYavQa0es0IHXL8FWTMKfJzD,uilcDAe21sKNY0S9Q8tG:W0jirWPaAC3yV,nCJKvUiSx4tzOHKdqpOrObf4HR5hj717nixiVlsxi6:EadhYYzVYKiL6wnfwy87GokIOQkHmpklgqkZHazw2V,ifM3xZqUffPpq0I2V:B93RUNChb5JX0iTTNlsmnwfgipnU0Fb4LwQcJZIMRD6Jd,lggV5cPptVWlt3upBljBAYCVqL9Qg06Izh8KL6eH1mCU:EDrGC567AnrhhB30fnjF56JzFwmOh1tpMwiAuRlWllLM9tyfwZ44YJtXdK,KjSIL0nF:cRdT0VG6GhcJTm0Fcf1OwzM4e9uylge7Vr,DGGsEMZP0OfGrGrRWNZD9PPRWzXIwxNgFvwM56i0cYP4sh15jrFku:"RE7njIttyWAtbvFHYxqJ0oHuF2p8nRrP", "u5Ljgm": PF0renwH926uLeAgIC8NHNrJf5In5f,iB1EJGe89odO9JuhV:TJozuOetwyKRRm0xilCPeKjKz1r7cmeCVmQrpeCyrKSrMIYelJ,"afSavEGsQWZdSQWM6ZTAz":d3iX,xUUl8F:Ga3drF9e6AKLGiwlOGgmnwltvlNTjNbuBMoGfPecfFrC0aFQcr3VdoIqpu,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,p94hoiVQO9qSm9Vn7ufK91BP35xrB43ipmnB19OFmh5WZRgWwBrsPNaM:K4VeTlshANLuZBwWKu8TonGYvHk75l5Yh4jsyBPBsnl3OKspTTBx87xAMN6LycmT,^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`uZSX8D9uPnaFK5MRlf2iA87HdInpUIygCqW8YRJl7JvQMXLz:"Z518MesAgE9Az96pSOlOPzEeaZW25LkGW","zhxX3dTanhaVb64uOkOc8":uzoL,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,, i2czuKnoJzQr1HPlOAzYx6YNJXj7vh1YE8VbrSBTaD5qGifSDf1: "FgjGtENek4S5yEniZrSP1KMsgeLrv34i6vOaZOOc9ER",afpukwHQpfVMiIE10i2nGZv7HS:I,"HiUNkJADWtPcedLCkx7FdclEsDx":HU3HedMEC1zgWAOoKw6mIdNB5BonUFh8yrLCIXkdu83YPRO,mNWV6O2QhBBHB7v28lBg:hThRAxCsnD68Qg1GVo4W7yVrE2hpWITT8mMhuDKfLsSNPjij47VXztst9ZkoiWJA, Gy3DKgY3ia7mSpgKNBJzGoZbP3Z: "rV5kbRFMWz1Po4rDR7E3IDx07s3DMebt0IduJKjBkbypwU6orRQFnWI63gyCaRGF8",;&.)>.]#{$';&.)>.]#{$'"VMG0vUMRiqnPkO8fhnbhTp4fs1zRfCl14J42mVl":OAWtbolrgdQHsDl9rPEOCwAURjVoUjLzDN4w0wT3j4T,_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}sqBXg8FqHEjmuUp7VkYanGVDY77jye8gFdiFBuOBXEYnJJDzPdbkWgA7:a5QH8PRx5IEizA5cP7NqyOEo7ZhUP4vQ2Lp0qIl8x5PurEPhZCx1g,*![`+`_;;%-_{&]!.*![`+`_;;%-_{&]!.HIy3FnFBvGtu6NwkflUPK9b3oiL5mWN1otIwO2CEWTdFXCLmxXVUz3137PaiZ:qWqtwyF4wgbyRPfpqjC7Ln4F0rndX7RbVcPdLsuQbXkogWQKT,UxCpDLv4tNIIw6L6cHpRAYsV85Q5YG0YcrmA:Eloszx7XpSBn2H36Cbxy3BZMtXu6UaXAS9M5Gh2L7Gjz36xuEF6tzYF81,eS9huEhxEQrBNaVOfPO5a0Y4Eq04JeWDZrHBks:"vfgXRbb2or6MGnG217KiqGEfpdX3lE", "gH1nDx80XJFAiYy4qqSNbd": hhtXaTXkAvQj5BXKvNIp7OE1XuD8SUqFJxka1jeOo4svU15,$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..QZaf4DcKiP4G4UxzRxvdQLygfoWUUjbYJR920cyMs:"YviE0HP8s8viJnBRGDQOZfe0XEQfZlqNoFkbxHoX8js6bhVpb",*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]=*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]= "HxRxewWEK6d": KXqOwFF4qNYIYISJyNzKzE8SW09rq9GVwYNLzMk15Ch4T9W9RTNeUus, wzPEX6XH77TWTcqpHXK5B: yGEwZHWl26WFJdTNkc,B3X2dFjLUbrghn1CX63mBN9FEKNyB6NpHUZtcHcI6nUGp9ca6vsp5NtD:"tjx1VP7P5yZVdwAq5UBwC0Eojs8zNDzAhM72z0bMgS1YN4bhPTeaCjdhms4m85Xgo",{]!(~%&]]!;&^}!{]!(~%&]]!;&^}! "CbXY3x9luoOMJdrkXr1PveQSPtD1xojfQ82XS0f8b7LehDjYp7j6kaPNNqkN": GdJF0D9sGLSK0A,IDhn1x6A4EZXmsXLlXWcvJB8NJnXjEtIVEILbGZpbZ0jyMCCD:LGW6UGwXkKOzOBw4cd29l79ClS,"x9jPCJwna1CIlSR6F1TKAtKAwJ2":s5inHI7AVX0Ln6zLTwvxYkBYskS3nXCRHPBAR,PhM8iG7LSxlUrmLcXo2ZKEWGS5c2ra8JX2BI9:xtAsZFZZYRHqyKWDyoc5Bsqr8l1qnGLZEFOuoyJYGHCyM7aonC0ZYydk93rkRsHS,f3RO3gFH6Rht9Lpb0yYs2GNrJpYCaakr4y7U4lPF77Q064G78AeoWA:"fGK8ENV8aYSwkLA5UlcDSGKdkw9rbYdnKRqamnS0puW11dH2wMQDWh70PQDwE9","wF25kdVemQSHattZuoCjrGhL4rh3luzeQP767Uq6AajYPhFbWl":fmU, pLmzJtnUM0TguTHWSaOkWnfub: Df29yIdoNNQC1fJfTVK8EA3GQj88fziQn,_][#=;,!,;>~&''(}->*$._][#=;,!,;>~&''(}->*$.ABJBNaLJkQfvYhPETmqzOSTaZ5leYyzbJ0rAkOkH2hiVS3HzggQg:YPmsQAaMwzEMMvbIuUvxCKJhSGSQSKC8ofcLWdZdcT8WbJvQr,';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$|';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$| "KVJvx7Gcyn4i1VAm3ME3jy": Jp,ZhPFxSWXvRhsueRV42LzHhk40iLAInfXdoaFvKtwEADkdj:"HRxLO","TNM7T":e78scxpm4V3Xp39BKw607v0oPk0CvJnuL44qKZvVQk,rXgRej5z8Dgko2FDVsborykhvwZIpj:Y4QSLsK98FjBUZklGPeGLV2wpWptndwdVXHsnYgM20gxgzWGE6pt9U7,<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/"HzF1YEbgcnD7xYbywNODCTVWRInVnR39q4LnZ683JjL5uZ":c7,"ptSaBlpKnwASSIrumrh":Cj13KYibp5QSRdS40nzZl2pKZmnMXq6GrDfqNQYcQsxZRsDfl51APvic, "djfPME0TcArPRR6C": cXcXyrToQ0eSnnXfLttzfLCgPOjEHED1, "EvvHfc9H1Paj3hmUYUDtwtxDEPCX2d54VhxkGhVFNPyJKqLJ4CVl9ES": "l8J2Y2eoniNFnJSCUabPmVobP5Og0p28yE1ARaHyAI3BKC0Q", "nvJDZsbEllaFE9Yil78dXKUXNPHeQqOUmuKrL9HOzTbyj69pnLP3j1": Ngb5KLJ5XcwjOpa5vJo2PyZ8PZDEAEL9P46wFep,#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^<#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^(%|.$>(%?<*{*})%~+*_(|&<~@]]}-$;}+,}@*>(%|.$>(%?<*{*})%~P34pEvPCL8qD52X3NQwdJQh3PYOPXnmH5xUwTQhr8sZGPtmD21bu2qVtlDH4NhlKR:dmklEpn2puLZvlczKy, dgxafzkuQUsNHqFphqNdha2HR2ivIzQT7hdrwpBqL5XAxpJZB3IuvwciC4ovG: BgJvXmCabQE6k6un9VfLz6Y2ynzWbazsw3jF76czArVDrIOW9TAlAG2LvacAOu,"LnclRYIWhr9KJIprYth9viMCabSRv27zyxU":zC4Ev7FQiZza5nTvkU3fkJKdEkCWjhZUfLHnDUU,;{)*/;{)*/BpBBmGvjEbIwxTVem8MKprGcq80KF2GhDjSFM:"toR9bvfUCysD9WzBz0p", "KnVvyVAfP7bZCXNtO67TX0kgxqi2cxMUgGjkNpZdYY3wAhPbs032Aftz": "XLnpVS6Thnlt3qi31ulRniRjjYI8pLwXDun2z1uXNET9s1S9yBKoUNtNrM",,#=<=(?.);{?[~`{~$,#=<=(?.);{?[~`{~$DlAPoDh2UEd2cIap626sV1NFEDdSny:cRsAk048cROPPt35Bj7RuXaspJEGjL,/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]Y0IVNFuqR4hwoEhNb:agG5laHuyEyucLDiPVBhAqe8QA8XEAuIFtbxvofR8dE,NjH9e6G4t3zPc3Xed9cYq6tXh9SbHvLfSWSaurORZJsKa1yKjIsQ:H8THDOpuyzn53vsZQSr6vJ9NytY3LTfy4Gf0S9krRyOKmXtNl0,t5PitvlwV2MgDvFra46sXekrjXOy8gYoY:MKtlO8s3V0mnftUrKzlDBMytP1BkGWBfm,LNQsbSP1rCb2jIT964X3aiqVvcJp9j7Mx39bS288nUfDTwD9I3tkGZpr:mjQh6Z6tNsfzsgafJjA92yhbGqE,<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/"P3OEUq2G":"Gygy8Yc9eWciXY96imdkjuVfa7Eo",$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??D0238UVKxQSDTK57eLdCAlCR0qfQVjI2luc8mr2rdPmX0yXIj3PD9TPHqnuVmIQ:"r8AiwzNBl7J4ep2ioM0QknoMdMe2CHIRxeqVujaEZ6", "ytCjxWMC7q2dMrQPVgqxad": GRlDHOTjp2e5P, A8jvqy7PS4IGwmbH3nX2m5KCaaZbYSp2pYb2dBe: "nxjgeu",!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}>!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}> rmcHbN54IpdoHFHmd3W: rqtU4aBmyAUyOTZvoUQLw6M4CeP2i5qqhMJ6SwbyMurEJ5Y4N2gbw5kk,MdRQr2bEW:"Hmb34SZkpp2Cd6ZHL1DsK6a1yR1bjNAlomLNDMAkEEcrNmaXsy5wR",^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}<^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}< "ZmqNzrh8Orh1uvDoLLglhfRO": pw6oCXPdeZYEkIg5zyhp6CsuGL3jDZ922sMzeSHpRdzLjOP0, sZ6OYPL7t22IIK3ZDWinH0lpx7ShQYtaRhcAwoVT7SUDjR6XvQ5FNh: z4ymwzViiA3X4TnnbTpNdtLnTaWL3eSU5jEKxn2CpXi6F9OdpFhvFdpnllsEBgSJc,daHWxKzFVy8wEfPb1QJYz0GjIYKIkhLhZwnhoAGxaMs0eW8fFNgkLOwADn:"f3QKrQEFWdOxBr5u1sBYWpdR2f",,?`&~'%+})*_^;,?`&~'%+})*_^;VEsBRDuPGHP:uUo5WN73TTKD1IyUenepmDOoHhSeKxA6Q7JBhsP3bqVI8AJtFv5Aa, pCY2pVzShOKymF5fMjJ2caxzy8pq4jtVoDv6jDO: ruwaYt,c8l3PV54bMQQJtuBzHwZDtYbFTeeH9PlsxzjgMYCezrGF5i9L5kAk:"XtftzxtcnKEIsVxD0eGrAwGckfgta2ivNbN",.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.<.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;='!>*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;=b7kk3B1hzLbbqswBO4I:TcIloh65yoiyMwD, "OMvYY1C6fBXsyS5G2zt41XL3keeQbTGTkPU4RQpR": "QEU25bVsnIykbs3svnxZkTpWfnfagZo2Tu3BYYps0DUELWOeIFMr", mb: LCSosB3bgxmKH5GTMZ4XpTAxq86lb13mWU1n6g3wO23AUwQrHHYtepkNc,-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>wXFnZOMU:rYDimnr0o1iBxYpj9g58DeRWxstDkD40GnchczBxAZZp,?)*|{=.(>!{?)*|{=.(>!{"Jq":VOyjy0vbqS8bPfPKxI2E9Hgd,NGx:"mZEXcknMgYRTgsiqQCyM", HsYmzMxQL: "i3qH3iywL1ZSP0PdzYHOtCm7lRmi7WpcA8RUFugU7ZY1n",xWFZeDeE7NKxAwfHL0xtWQVflW0G8vHtcdj:"KIenPxNjjhT0XdoSi7vw0C5gnGCVl61kvxvldzgosmSJCZuoxEs74w",cUvZQY68FTMTJW9onPufrNyCWpeAh8PTVi9wf:"zPfyKVf4m9J27VtfIqpegEDw",FcxO1hpD3OJ8Q4AjXoJxwtoa:GgT3tmb4oael6XbqO, "uQUXzitWoLKlFaTPwoUaNmceKMXIJ32A": "OfhyJxy5goE1SFff4cD",[%*.*'~&}[%*.*'~&}"HIjoKyfvHDCpQCLPGET0SPY14UXO66ggRgg1yJbmiJ":"C", kUbMJMr6ssQ1urshRqvc1n9CAAOkE7TxgC: nzuUcKsjLdgy7NCXaIeuaYO1VSXeefuGoz0VMjazy2v3zKoH8MX219F, x0NDTCerphkLMDO82eeSvBSiYR: "Spg422b9PQNQfopgqdJItBldQ5qypdbtJ4P0PFqEp8elCREQ", riUhJzuDUdjksX1hsfVvpLFc3kpPPu: "aHDV64sJdjmwv6QU01sG0HYL50DPS3UL535LT7aUb",GGAFkj:"ijnSwRDltWmxV1hkbu7Bdzn1ceETfZTUHYa4M9E9Fp5uW3Gs26QaTwjvVSrT",=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'"iNZ4BhNF8rcVs46MBtJzuqqOcXehM5PeYRgtXpL6lIeDSSdr":"oxuKWvoIcSDgQZ4ye0",cAPtbLX3I:aEBRY1fVVbx1dyK3aOo0XjhtK0kOC,lDBxQKPe0ujgKpUmsevVLLjgiMRtwcEuaIxWl5TUlCVpbk9rHNpidT:o3t1vnyLvJNxPAENxhcJKvBYQFB9mNrU1rktYdFXayOCJT,LK67f1tE8WmMN4xTt5KTJlVV0i9uzB3YmiXmv:nm31gNXUM,Aj48IpzEmoDlan:HalicrRrMBxjcpzat5wjp4rik4C79K5bwGSXvJO7f0,"V5mNWp":jo1z6GNmbWoBNgQmBFZwhVq44I, KX5uuIBblIEJcmGKbUJB9XQiFyOxQggAT7x7hR4YFZDkCZZ: "cGyNP8Eg54Rf4hh4wlFibcmzAQQ4NaB18jaIQbkZTmLIAwqE59OcOGLMZSB1RbTd",CKQMsctPzdMlq:h57YoVY4wivIA8u5kxAydz, JBHYetx4aHj9urALIDwzKHE5whqeWYpjNjbfjCvPpJHoOheO9X2VG7WEWDvYaf7B: TSWUiiPq0wJFI4naUCDtRNZ,HvzPa2CBlL3ff3L4sIwGieQ6CS:PgfFSquZdmOQ05yuYieZ9K,BkB9LcrZvHHGviCL:z,SK2W8HBa0vtx2r7:"A75cNIN2YQZkdWUXr7EK6F9xVGJ", "X0lSmKuVlLqINHiNdLlEpL3JuwHLBdU": rW2FoWSzjFucr7WbzTbfv0hYeSc4iuy1DwdvrKQiIZrO,[{^[{^OjbneSnpifSKni2ZptjpMoITRMjBh:ke8BZyKWB27, CrQ7J3nwvZd3jSBpsUYdOwVHnn0f7bfaw8ZossUHhxS9ojwrkdXIJL: zqvD3hNTmXGhLyoxDXttC,"bmYChhZG4VTDCQ0GLPBnjucxsS":SD45vvLU, DnZ: MvWiolsgF,TStlSozj8ng681sXvz9RwwPzCbWm1X:tq2,"U0JApagQKsE1BP1AHiQRPu4":JT7Lu28nAvuEJXkBktyAS3RUami64R6Y2B3Or2bFvgq3uLBTLGw6GP37Me8, "g4nlbKaInheq1B0OxVqfsN9RNpbE3W7": nYWQefqaQY4bhlnQ55H5gsftU4gYeeOOAJKvjOHY2KpB6YDxIHhBft,Ov5VPtrMCgMYasiE26uK1754RD9PWC37aLBTInBlO7:WnWppPA, a6UsU4oN3gX4QyynFkne: "t0GJ8KpPkdGCXjEzOtydiY1QDAPlvT5BZkIYUs8IMkpBy8l", kSnqNUqgFdGptmn3qyi9mbX4JuEMTLoL9bfp6u3QpnRVx727qMVAIT: "IubuX0ZzOWyFEsiPHEUFvvgUyyBWNRd8S4HoHvy6ZneNCu1Wq16J3yFeXnno1v",DwpfQjn5EnnR2W3HdP7UjX:WCRajQeAazVZLlcjN0y1Od7MQHCjf2C3tyyGKSTiB7ossyZenOCqI1dgydBCnoiTp,"TadeOiEJo1mPyVsV4EdYrMB0oX5GVzoMyNQoWJM5phU550DSQiF0SepZ4HP8":tc0VviwtM4NOUJpg4PupCA4CI9Ey89ZFCHHg,}!@#-_)'_|-/@)`-)=|[_=-}/];{)}!@#-_)'_|-/@)`-)=|[_=-}/];{) "ObeDOdYuXxmQTRtxQ0TPwsFC7txEO1Jtj6NrQQE8vpdnQOvfH17jKNdLVTE": "YkW5wnYx",]#,_`,(|+}{};(((;``#|}]^!!;,_+^~<{[-_{?^}$,{]%=,)'{%^#}`][/+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#-}>+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#"af36ZyG1":NwVEQ2OBC4GY5fFy0Awiyq6lYQqEyE,^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}"PIjacFuAb2qz":lv1lN1dEa, jHzv4rQgOsuvXJ2BgPYS4fcwgetU5XKQNwyDVHChFnEkruJMuzjPWjAqiI: op2wxIL6W3yqr5XkPDv1,i9n9wys1ifP8sXho6NnYOvnlFsMNOYAa:"rZHDw6VeG3omfhhqlhwrF4PI8PdCjFTqZFsdX",?;*`.{]_}([>'?$*&,@.=[[#<%.!!'?$*&,@.=[[#<%.!!~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{(^_+}#>~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{ kam9QQOj3mBHpSqyVrV0whfR: "fjIdtEYEAGlsC8O0iYNY9pMMP6FOItHB1llRFgi",<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>|<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>| XnhPNmZ63WbhTyj78IDetw3RWfsXLq8eZyO4T0EayVLQ47TIY0c5SvPIQVQBEN8lS: y2cBax0qvsBu8tIPitj5ua52qT1Iq9JXPm9Bj, wsAkfPxfqmSbV2AOfbdkh: hDKPPrhrtIF16M3cBZH3KIRtv06H,"Ff3a":"hk9P7lTEowL0mKb2eo0QENL9",*`|^@/%(};?&]],=(%^;+*,],-})`_~[*[}>[,,;}.[,,;}.)>],--&_]/>><=~|@|^`>)>],--&_]/>><=~| LkUEBu76zlFNC: IcKxqkGdutv7Ek1d2eKumuvoqRJ3ZkzKobCKjVjiAyoqCRWih,,|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|',|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|' qJ9uloXfOnu6Vw71z7Rb2FuTPgXg1GE9UXtPQHe81aQTwrBW: qtPQXBF1nIHg0r,inw248L6Dq4Buq:ZUT64VgWXetRla34XUC6SdNdnU8, UNHHFgmOCtjw7QxvsJAtstp4VbxsPNiByxRpGuxyb1ek3uFgIJGuUv: gQA,_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}"vIIp":Djx2L9bQ,lCiLIyJffR3TvhCtFw89Xysr2GPRczUgFfYD75hzD35LM2w:"Bp8JGrtYcANiI1qM1Lxvbd8orG1ayzuiJYzmraXwqAe2tVUTFYRhMb2A4y8btvUu",fM05W6Yn57GsEnPJwDzGlR0Vrud54MKZnDWguBEboz2rNhKCexWxvhzyr49L:X4PqGFEjf7N4y4y4bYM4s9bIPfAbnzhIoahV1Ui7GDkOMJeqfFNTU4ksavfcfyW, QS2TXeNS1doTiEKgi497qzWDbfcs96uLhLw1uXE0OVNcexJfWvapJWMU3z6y: "gJnO0kdbLES6Al53bQQd2xjRMWAHiOdk3iKiQrJjaUEe94mO9Dm0aDRGA3T","mx1O6OevFE8IRHrQ0pUmpgqGrXpJTNHJQ":a2FfxMCkVVSHSwtVoPoXlfeOU92ev7MTqicIRaixOqXVfdK1WHRJ5HBXB,./*``{'<-<'|*(|#`*{][/!>,`^)]./*``{'<-<'|*(|#`*{][/!>,`^)]se1FYLX4u3GY2w6u2jfSipYgTqgCpTcdtXbG4:"hx2rb3inXED0cOEhtV0XSY2MnDF9VxEabjHr1bLJ72t9gNi1dAHUdUqeaD",?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~"Z5XNH6vPF0G0R0WHvfsYmj2SFhcpqd81TxyNkfCp8FABwm":"Sjmx0zXR5oHAY", "I3LOJaQJTaP6wKcKMNWO3UftKAf9IpKtb84J3ShFsUhB052ro7": VhQez0MCquJrbAMFFAwRNaHW3E83XNuO4rQuwxrjj, ctA3usFG: vvBBKXvMRRYrK7Y8d4OValr94qMupRed, WIUK6ekaUIT2ZP8X3FJiWU9ZFl2ywKrDzUhX2Np1psVMqAVn: Jc4dp7MZMJxs6qSw5eck6Xl58PSKKw2STccC, mFNzSk: "zqmkqfUGbqM89SRLP0DL",?*~.)?<{~.-_-[+#^={(=@|_'?*~.)?<{~.-_-[+#^={(=@|_'odZp8iZ0DCy43WVU0VHuL24tb2Ga5m9Plqm44:WNdiSSuo7Y36xWB9qPCWYK,^$%}[.]`*-?,$@/@')}**||=.?@'(*^$%}[.]`*-?,$@/@')}**||=.?@'(*"PjJZliFkzAENMnw6O6Y9cvfPcF5xKVA2G6WCUT":db2, "f6TZ7YnsFG1hTj3g9DINRmfRlzZJPR4cagIF3a1uegwc4APUsvwry": nQgIW0EvkVod67OqWSptf3exWhl0lnHtC,"V7FsdYuq7ZM2bbLp6XyL7aU5bWaLAWpRghFgmieCdKZcrz":Hm74DVNIPR6XQlCffb0XD6FGhz3CsxIiOfMb5vkbneiCoit1rkPEHVEetbsGIdlx0,tQ4xlkBod3CwNJdGxyElUvMdXsqZ7f:"DspOr2aHkyp8q6oMnKAw0VJfDSaTfREIsXEhUarvAf2Fpcuf1W",oM5vrRlBNPRsBdb:n3PIDo9q7JvaB0jiRslaMSMlDHw0vS608nYZ9HanOjXT, ys1uL10hOTQHHN7opeqgoERY1TGMWYSBWvuAnkQGNnnnie: LS,NiWPhqsuD3Ke9nzKnpC2Y3DaxIacUbaCM6k8Pv5UkP1cnFCWh5FNFKdGpzIW:"CAvF7VQYkBlrwwSk3cS8TC6KUGg9HOu2Fe0MZDdswCu3KkkVqOlqv4Nh67sRn",+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{oUdqsuXuGUG5Swt0eVCmE1C7gMIQSE6RXhqifouzYdh23UjtFWSom9k0NfZig:"ZyJLqzovqPg0",K0i1cOcfa4MuxgFBS3ukjydcK8zX5JyU09iCoiUm81of5GttDyOFjknoXlgHC:pUNiXgSHuvdfCdtiRnTQZ2xVqNFYTzFOMHtXsctgM0hxljTQIJwgFu,"JomELksYkVzfkDLDhcYMYl":"U4s7LQtMjMXN1LgkHsb3Bmv7W4",=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^ eR1h1WgImZSmgvXZiSIvh9obmIHskgcBR8mPn92: XiYxYHjYtbZVLKvIQrM0z6phfLmf,*!*! "cAtZfV0x3if3FhcpZlzKAIhMSMqL4yxq8QzIV4pnX6LCTfwOccR3tbx": hKoUrNJwjKx5uqC, IKHPCNoS2PDMMQ341OpYxVVfIJFHRhTe5DML6pJfT9is6: "rPDS",WXarvCbLmWETdlU817KLGSqNzRTpojguWj1d1gOFzYfq8gxHBycTC:KZ95uAQn0ZuIqqB0XxKh5G6J, yVSgcWOJHNEEFYazl3wUTxiz5J7YdylKJHnSuc: ZJFiHgnOhGRdtuNnH, YH16kwK5NCNY38kG7EWFlF0EsGECJweUmjf0g5VqoVDon3lKVKV3g: JmltXTRED, cbBt3yqKzMj0lmbpRUsjqJItFNyVPtknnnPf: jewiUM1CrK0QSn84AEktUMum3kaMxWemyEZfJg73DMO49rHEZkwezS, "bz2uhCxmRc5sSOXnBW41T": yJIqksf3IOvP,"gQ95law1REXxnTTUd3GsjHH":"h1FzUlsNGH5W5V3skO1mOkWfuWaFyes2jAQvaw", CtYqkwo0q7V3CjJn6Mg4c8nAb6lKrBHo5wmCwxVcl: yNopkz3eJxkoEdCxamlZW1C4daSCZR5obZLLVaq2T6pRhXHtvNDFWMsoCYfAEMuwy, "mtER5T0u2iqblxFK37PFXdSGKBp": FOvRzk5Qprvf70Fb8QF3kzY8rrKLECnb9ctFKG1fu2e7BLaE8IOtWtqy1m,ddL:RDLk,VRjwVehyMIDJZe:qzX8vm2XpFBzgPHxrI9k4pzGJPqrhSHTXuMEeC1I0tVh15bbfr,"CW17PnLR0FRPkFwwqPzHXV7LgsLW7XQqzEqPwmAPhE":"ASYTXJY0UF2QuvA3REKN7kLHxnZfsQrbzDlphTt6gHz", "OxkXbcVi2kWmZ4TY5mr8cVgXGoGowoJF3jU": Xl6cr3lzDpQYniixKytgkTPTmjeWgIHflRmw, "JlgJuMNBe9hr": wpnG5o6bgUyByHEhLxaVPNFJNEmI88fuoW7VJgY, lio5YFffiT: jscBmNgbqmpz4MBqf0mqe,|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~#|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~# "pYqAZfv17es78": z6DgPu5y6vYiBFT6j54EPmeRRA4jlrR4ohbFIz, "xIhiCBY27": "aKaum1GuaclAQ6DhCBw2ZXl1wl14ODF9QccESeTZNuQ3rDXKzHpJF2tw5Tea",q4rhBIdHo6rFgDosB9ZpPOfjss9u2dmUxCwT3bFYd003lipQsf7HI:L3kuiGMtVqm4di2dt1tLMJuy2Se3KPRcQdX7bGKwnY,Ubz4NvHbRlV2aInCZXfxuMlkvPEyMJRgkahpFDP8:yDlidQmjlanKwpvpOeyrdsHhAIJTu9VctShro8Z2brS7f6fvO7A,[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@%[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@% TP7YanRIENlSZXuMVJbv9sxGuNe6lOqUMyYA0MCfrL5JGgu: tx1uluL64saMBCmKt1npzc2derAk8eoMrxw,utRjfftyErmgg:nOPlS0OyOKmzzGbVYuxVhvmtiGtGVxTEN7dYcMLcZ48rA5ONbq5NwG0W0XAN4A, RSiThBSF2CkYlmJNEl0CWuqnVA2qZKnV2VHDdAuisCT68vHWADfsvm64sP9X3L: LeudAGyXFrutHxfEbV99tjJQqDVGo4tQdEu9RVFZv,ttVwGKSiWAZ7q6lMqsR3cbyn6Ze5SfA:onYtgyUlxuuAtaUylyeiYxaUC2Qty8U3pbhqWBI45LQ,he2Kb4xqoblRVhmeag4TFC2ZCO73y4bLutQpHC5xHQXN4:tQ44DmngOKaXh6eCeT2ynWuEhnhw7D23wAR5EOY,ywWKdhLgiYKEPXb2PQ:qE3CVR1pnJOQWuQOQST8U0bFVujhyH5I8iliW4kEzMrVUoDf2am7mbuVB,/=~?&><[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}<[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}< uEcRMx8SpORRIBmIIEhAXaZYhNQYx8eTTkX3o39p5GbsTlYY5bk: "P3nbtuW0ZFcIHz69V1A", MyVJuTKemnsb7k4I2o3sF3stLk41jVSmKcCuDURUFIXAr2rmyF5Wn4PGUzTCELp: "JJCpCGlekamITYzOVOQDEZOCgCbuG1HHKkDi1ZpxCKymplKbRC4",_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+ adNUu8pZOjbnWqjgn57qXniMUNQOJXDsX: luqA46jAkM1dd,=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>p1GZZVkXXk:"Sr8HHp6",`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-"JlGYfgTIr3Q0ujVQHsm6NpL1BU":qLdZggkQvCcubiC1m23dANtAvyJSNIDC1H68n9ASQA93jpnDcWIa0k2zXoPo8KI,^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>kxmcdV749xZY3yGl9YYGCI9HkBZi18s0ShO:E, eZVRie5X7EZY3suljJBXGeTcZQb19zQVdz4l: L3CHbZl30dr4iDfjX7GBybRxgy7NBfAEcoPbVkdk001z,}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!PgXeUMZzMcKyBaZVhIzy1nwQZ6nR4qF4B6BOAxtjbYJ3e1EtHMYXltAjQN:uLkozB9B3lPTfuTEkj2CD363b8Hq5bB3K51Q,LoCntZYoEbj8HLxQTga9A:Hd8bfXsMJ728nhKrWnOkN3fiNKz3zcTOgQLdLz4Xx0anWEN,*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|"aPjdDf77FAnpmcUOzYl8LJrTBogB9w7DSl4xjZZMD7":"jdVsrmzxyXdI8k6H",,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/LiGnKLuz4bTDw:iIqdlRNMaAfly5KgNjzI6qAihWpuU8DxChTO8FyVvEcDJbQG8TNDeg6noEV4g,"F9Z9z5OPKrMfjn0A":OvIPksviyfE1vhRgZeI,['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!fwYKYaFJ36oYD:RrUuJUeqgM8oBbRVLP3QCkGoE2vGlajV3oATbcr6iQXAShqbbO040qkYYPcw3g,SZfYrH0s4Nc08ktSKRR9T:EPpSKhxpNOdEQnX9VJjs5GORmzsKj3K0WWMPxIWjQmwLZ3sfvqBucy4lBHPHtX,msvFUFn8y1s6DDXVl1WH9b2AHv0dM86u18tggsX:"BNOSgBIcY8dZCZBN19MtWJ8nwQSn4lc0uYiw1doA11ECv",JNd7r209Q7FV7QjiqUkgV5WBggl1V44wjtyy17TooZmzDmicjdwNqOlt:"BkPGfAshd6VybVHR",tBQZ6pEsnUBKmcVlJDWI8Y2Jwy5w:"HsWsKien2Ce3u1B2iC3ngUkxMiP4w2EnS6uLogD", L1gw4Jc8sX1pEQWXudVcx6hiaRxTtwRkP4RRIKKRHLYRQyO8: BPxzeEmK8GU13iWbz, WLJcade1RDXxMI9vQwLIJYWNM9TWPt1VtQz2feZlDk8FWxB5: GxgMl0nfTUdPdclX9sL,>>uDpiSIaxGXCrsm86g7bqedzmhlV1ZdHSoWhmxSmkHZ2PTccC8By8ST:"WPmRA4Zhi1vXqBPRQz98Jdzju6Jv17Cvt9IBpNI8",(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)"EK5shZLNc9MW9PMJW4":u3Di1CjQEOffC23H2M991yh2Ku2ZHCbU0B7JVll70Rp,/~~^?+)@&]-~`!];&=]+}$,)/~~^?+)@&]-~`!];&=]+}$,) MNxpITJZcceicWtiLdHJiEGZNF01cT6JOuStN3: ZmJ187YpONZGwFPZCtV,*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~gLdC1C:"S6lbXhAGhfy","bk9WI1N98qevuE":jTSQEq8L3XPqs, xStFRbll7VXNkLSsPmx8pbFcqOn67xsQ: "Q1vU7xnomdUwMEJ7by6o8tpOqiYxm4L",UtgqnB1fz48jXEFJWreUQwLnpp8nmaHlGrnoZrrk:"nAHN8Q4AlxwdEGgequ",MzWGeQTHQRftRaAe4:"gEEVWmHneERVuE5fdAfG4VmJWnum56sI1xP05GyPcH8YEwtziV7oKfkfLkq",XaPcdoo:"bF7xnmJ0venP4FEqKHVCUqTMqfTNmohlopuJAXa2m9dTkRC5okqsj", QrskGR331FuhpLxRqI4tN31RPfvqFiGWJVN3QeVEj: M54S75QwkyX9t3EB, ^<}]@;: OB3bBziwdAszTUFCMS, VtuaUjuFiHu3Twb7qnoe0hfgaJt: SSsVbt1osk7UaBdMDMg4jMxAAIgkysjuiN5hrwCiyEpg0, RHjHsDUucKlRRthNKzDjamSNCYJeA0iHMKQzPiUum1HUAEnW16Z1oMw5dZN5T: onB5IF6GVMNLhZHVw9QO8Avv8taAawdGzS0Ys2MLA06yW3IX6,]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{ ud7UIB2Hlpec7SoGrIDqHoY5j5tZw1h9yd3abK7PXONfBWPEC: zwDB8KOMJPteNCrzu6IuybteFS9a1qZVWpiQ8xKs,|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[ "xlXD13TpD73YbKkBIBwcw4EnRtXsfsVxgVaZWGU6ADiGFHlMVDfw": IEPXAbF0xElun,"weqLFhfNZdOnkja0OXbmeny1nxMci7756CMHLiA4LQqyp8W":"zpn8z82noTibsxulBUSuS9FBifSxJUTE996",sHCLbbN0B5tF6mj6vxp9mx6RyoVgt3gHgSez:"FCbsY5GhqFIZDXVm0fHx9LQj6m2htS5SIlWHY",mJjqIoeaSgVEVO:FmWPkgUcSK52Q5MmNh4Xe5RWIGrEHQ4k6rXQglkLCCSMvRov5XR,"UGiammb5Nd2Sx32JoshbYnfNG00kO2YcSiSVjRXpkAZbn6BluTyeX3PMa3oWrxY":KZee,"gC6mY9PI8oJq2a6XsM45nZcXn67fXV5l124zG":siu5Dn8erTpyY9AIIdZNhm94VF9jZ88HkLzpt7KX,q2P3pNoDZ:J24077BB50YcpasD7fDfP4muE,"lTccxuxpjGe0iQBFrrDOyak14B6AjEJ":ld513M5cIl,`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&]`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&] sEj5wcRO3Cn3xEwisvDRecewcbKX3OreALcYLHEvv: dVspgi5zulNqNl7VVNo3X0SeCO0GCSMLo86vpjQUfiTmFnzC8AXZYJepFTdRCSAF,{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~mFLCiIFxgAD89mecgPj5LXjf6L2zUs8KFfe9:"tUzV4w3oZ4b3JimzauAkB", abKAm82Pmcy0741rF5N8jVs6246H8Qg7V9hOUozWPcAvHhfVSqSazs1bwv7: hqTSwqfIryQOZY6G45D6XAucn9tALF9x2RFqJzmI23HiFwD6SJhkkCAVmzt3jmS5o, ZHrWRpyDMcUN9miRDubw: sGGmt4vQMNxl5dSAfl4oHV,KNHVxjbw2oYWHIV06oGu4e7dO7YPxYOLnKQoEbvX:mOji7dRKA9zcsOxkjg3lnR9qhJiv2LFHd2Vug,"aSZDdmhXV9QQeC":"gWmiAvGiC9bIojBm1FcX2HQd",|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!?|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!? SL56Xw3zGgWx8BICJnSb6svqQ3rgK9lvbC1GpoqLVmsRKvq9kXwriFTa7: ZD9EwZ0eL9vuZEaHT3ytlVyRSreR2eRc6SG, QlIDcIOFomgyzrlnb2ICRAR3glDFGZBmgJuDzywQl8XahH1iTmutZGTNb: "h9JpjVsR9vWhOZpCXhgey6vucLsDwbA8MbbstOoOevDnmgdu",#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`.#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`. ZNdmERCwUS9HimQS4VDyV4fMWdvBTEBHireR73OZzLU8pDPib: JCmpIsvWpxOwB8WM0wa2z17SL3ZU2T0AKT,{;^(?{;^(?KJyVJybluaZZIVz13KHZY7oLPzc:sHdWt6TFT2JlyCL93K0YBnCsmhQYwrDqIP72VFp,!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|.!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|. ywep5O2QP1gE12pYThSbPH: o0JkXVe5JgLb3, EMIOAvzKh3immlbrHKjtGzh5trVX0ZMEeT5Hv: "HeJlt41kVFAeaQfDh42Cv3XyBnH0Uv9ZWn",z4nTYqP39iTIaz7BUD5KMeDCzXMNIJUPacVBvYgAd2EwUU3C0hb:ImNm,YYXIVfJnjrgGfJ4FfzT12TIAkEplEVHt5GGYnJY3TrLrR9d:"IHodYwATsmsgq4bZF1m7job0VtQieDQAjRRJAzKD2G38E3FE8uT4eCzybnWtr1",$`.$`. CwPQt6O0oSjvYxDQz7EuphGXMJNpD5HKOY3NEHLwIOZ7iQitBC: Efrb4Flpgj0WTZWw4oi19As01ShpoetpH, "fCO5rOU737rumYWpLYBINYAr07043B6jyLlk8GJM": "mDZH1uAjiWFuNP4NqVF2HZnMsOp4VLg5dHwv9pPGZIVlw", F48: y7nkzA64RFNTn2WJ505LlJc2Kh7vf63Y9njnxmhvW5v0WV4aFwznSt2wNYku1,?&`#_=*^>>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>''~>*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>'' "xZSvkh": "yvR18Xg7axso2uuT6CzgH1jhRlkkfWOQl3XS1yRkp9B34qtFiwnSOkYrhWkH",Q0B85JL1mcgQdAOgsjY8aDd8xLW:"XZgnmBTjZN9wj5zwaPdXcyHfql7q8mAN3dk", n9W: "p7CT9Nv65IcsYZPR4KRQtfO3ANQ1DMlFGfputq6HYEdUU",DO62KiEOWLfEnwOFf1p0eKp9TpppBZ:V324y4Xel7MXrMaPXM, "dSGGuQayTV7SR7a3l46hJgY9udJmuf6c9y6NNDOjq3rp1Ia5AGBv": amKIcfwGbHpNr3VP9YhQnfrxuY0I7cE79wtLgefk9CPCZ7pMkX4X1,$>[<^!/=*{$+.%=;'?<>$|$>[<^!/=*{$+.%=;'?<>$| j84i4QpTQugjmBTIqDV5bgGBOV6vIpZnhGQyt: ooFuKAcSW9OeejzOlvXtB9JxIUjsA21hix35w8UYbWSXlnOO4nrTbniQZyWgslE,xLzGC6ReVBYS9oey33PiHG2MbtyyF7:jfgP3qXnhxQlYiMLr5m9fPNyxrvhZ2bPY135ia1WUeV0eqvsLr,=)>))}.=)>))}. tLjc15yZUXEXj3zhUC9: STGHqZuMQdulwQw7IBMLjVd6egcG3qwWKugpJpQtOXYbEEyUV1z, T6aweMZ0VESqYloEPjcPQ0vp7x2Rw1OZfPjm2cFew2KqWk0ZoCu: YoG0aYWnRWFZsxCJavLZgplz4xQmIOs0zx7AgNpboCjn74CVJlvm2pw5O,]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+ "dcu6OtzrHIReY7pzVFbLT8YrX48uZ9O0krMbyN4zoJYGiimZ6TKuzBtSxF0bldW": wkzx,AfvKCMXKsxVeah1lLozFnl7GUI4ucZirpS:"x8d3zsgdbByEMQygcWK",xQgPV0TjFb7yr8MX7xXVzGPk:GZ5n0swRs2On4B9TfNccl1xHRygbi0oOLaMG3vA6AVBLsSKqWS6iB,f219RA3CB6Co5bB1TzI1OAQNhn7eVcYnpXAKlXqIfgt5vxQJRU:hrevntNbiXcn9wV13WxLubfwOL78gj2hYXp8XJP, HdqtAVepAd3sbcFaBzLFcS1KYt5KNcuwIqlg8JZjvFRjQh: UVoZTBV0uMBNgH4hhabmD7fAZOvX6sX7LO,zuHV4l7rwOcxF2eGFEor0vD:OkRGiY0xIeYq5oDJg45kC0S2KUEMQ9dnEYzhLCD9RfXcHX,&}#`%++}^#.([,<|+;,(';?'&}#`%++}^#.([,<|+;,(';?'"IufwHcheY":KH1QAWK74VX0wCHVpqd69qvTTxP2SZ0ilTcSVTHpXOm5Z0cfTj3BganxF1Rvkex,-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'%-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'% Y2Nzb08R7zPSNPTEHWKthpCopt0CYQ6r73ewznShE54DOnuCN: "EoMrRRmeYhOF2ryAvCxpSd3cGONuQs0oifCEcqHUy7eQgZCKa2pPxS7twVoRyNRWT", AcLft2j2MOLqDResylMImykszbGpWNlmprNuKAjxBgNZRcncHK3oc3PGqiXD68ilh: "sQVkaMdznzkNLp9RlhY3WQqMI37aQzsZLJNqYg8R2mQD8I6DKWrs5koO9QNQZhg",,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?FjMZJEgSrmD:TN8UawQOw5aVLsJ9GkTPfD5Xz0yPyciS2Kado98pm8AOV9N7NySMj1k7n,GNeZlbRCwDWV7inY70YcZ9VVUfB8w8kwk5UUiJfo:uMbUUGPgLs7yof0omNV4ygbY0qEAJmeepfEKneTOWx22sIr09I1,mlOjn66RsemxciBwpuAKlkt52VUZ9FZLJ1Yx74bdjtZPmnzqRRCNau1tgqO:PmlmdKZYjisN0eDBoDmMDmVzifypW, "lgiBA26KxQhx1iDZLNKOUe1KNom": iOWWsc1VXeqp8KBFLPuObehYiEJ4WGwePsgqjg4ZTn0n402m3rf6ei89H9,>(&)//@^>(&)//@^cCzNJoqofsaIhZb5MCduXN:H4uT86vnKhFnbwF18dFaRYvUu9KTbV1tFvxhCLbAS7XkRysiIAUEvt9TFcQqmyNDv,`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,!`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,! "VB5t2bYcKNWB3S7ah8cNwSqCNUfCPz6mhidNG2woHZ": mC7neQ7cEPLbQuL5MuDEmSyJDALeti3sWgBdzQVqQh,kqD8kwb:vaekOyfQAYNZvlrJZBrMn3Boyt6Qp27uYvSxyZswdKUgzZH7vl4HWGhaGoj,=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~ Nh95IIyttFLwqzCzhHDo7BVKfux: DRjgWzOsRNs1Ehqeo,|<>]%'!&=!/..@+&+-)/>+'=[|<>]%'!&=!/..@+&+-)/>+'=[rzlK9AWWvSDNgg8K1lx:BMxjENDYKJxqcGDsuEDpMMBw9, MdxZGCUuHfGLUipTfuEUlIfVOPYIosD44BmF5: lAUPqhN0X171YTbteqDmaVjbIjdTwTBh,'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_zzKep14SHfdXd4siSdWRLc1XhsbZMK8FWqyIndKVmtv6Qj:"VFhJ0D6MsOyxAbDHZMSblgCDQKA",A2WZuFw6EFDZ6PR9ceQNWu9jcdtegL3Ypkt0zwwiHfZ0Y8fCP5:j28x5FZ8VOViWDk9ZohEWOIt6xuLHZns4zZr6UozILT,FxcDltsl41hkOLbrDiEEMwGyeGmw9FHsEkubLpzJZPUWa6qcK:Js9EHMx9f7Ov6eaFfRNjy42gSjlyXEHw6nxWr7cPZktzR3HnPy,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[, LoMZCHfw5cGgP8HFWcmt0yPRpAfO5Z9l2E7nZN: pj,}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`&}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`& "l6ByDxTHnuekNK9M4t7xxQt7QTBWId": "HIcOfFkCI9oQE4oUzy2uFgs", kvPnqC3GYbTCiioiNYCr0PlDDhsVl5IYxcQEnEo5Xz0mnkwSNfUv7EDPSgG46V: "dxQ4RJF6RR0PiVe2EMIKS0fVH9FoLIrushYdULCDst38VieC",wtMcuoKdfRVj7qzu1SepeLdQs0SxxRr:zuRFK81VZIWrBMcxYxNihAXvmTmXPtd5tDVdL1Oz7gjOBJn2opTnZ6zTIky, IkQtdJOGKDoNIrJK0vmDSDP2YdU01B0sV1Trjp6wtdPRpijzx2otWvv2a: MOOzFoVxTMvcJcH1ki21xIv6GDKLHcUfsTcwKiL2u4OAkFJHLR, TmuXM4DeoNxly5LsiK: "eqBBn3ZYMLr1eghoI08bDzXmQZ5YNbU2tbS0Ku7qMTBtN3EyawIiIeokf7ZqMjw", hzcHQYYSfi2M1Md2tQFzshmxNpPIhdFeaGYePHroBbdj439S6N: sxV44n0DNQIesfLtjbTDceFqFv3q4VKiuaLrBGyZpJGF2U,STMSdBSDo8gjF3siPA9r41HLF4RAt02n3milLBv:YDpVpc1BMsYMC4wOxyAfcHY7tefc8JbsXsHtqOHSMcJddeWAuxAwly65,Rx1ThK6sJSpX0yIiWfDFa3LPs8KNAuAPSvb48UoDvTcgrMwpmai3ehPoM:hbN1qILhoEp, "tt9du0bQznyemVXPTm358R2DbPTsqYHuHmRdtbJxij4M774OrA": "fgStRLFa3AtHirz3c2Py14qFs81T8FZUHqVkdH7Dh0PEyHMe9V5nxv30r", "WjCiw1bQsbWzAMa25BmZlAZ3AapDFdOh": U0jQlYKPU7ZcxOZb2ARd, rrVPAKoFtxlnXyNLoU7A: "IejQ77ewMudEvBzD0O2WVpScbf6UU6gm",}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/X8m28HvcRwdYCNOSgZbd0M09xtTzg26LUnmhhs5qmWonwmCGI3bkZU8e1vt:TLM3wVQpL46GV6,"ImhJk6yO0pEKBeI2tVZzzq":DsQskQLEL9t4b0qXfW69cwRio7JFeilUmRT5iqe4jq3P9CWSOH6GA0tTi,"V624omiVIOYT22HYJfYNKfcXj8uYzqx5dKzdEvrZ":RCYZlr8OmzqOY0QEquPa4Ht4K8LARm9hs5cD7m5gCoOE9EtXzftilhjngtqepfe0r,^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]uR5M2Ps7zTQqUIwmLdCK3gaNDYdni0DSVLpQqZEijQdNx:bmj6S5MqdTPCn1byweIH, HzHyn4eAjLC: WjDj41usv6LqSI0qtrQrHXmwMSaT0gV3BaQzcR, "lLCNG0YZRTq01oZx8Oo7iDgAnBHPRLm5LxsAo7y": "YNS8n2N3gcTzRpM0eWCVa8Hyv9CsMETOxBlAA3JuXay4FHa8SP9fpaNZ",@)]#/?~!![/|.^~.?)|);?*|']&^`$`<[?>%;=[%;=[.=/`,=@)[;'`|}_*<;)~).,>.=/`,=@)[;'`|}_*<;)ovFKO9yxfZj8Hqb9:uRtWCT0j7DqrtCvIBWd0ZXIKxckPg98coVy1hpY2Piljkx,}].^#*^;'?[!?^+}&>_';^_[-.<+]],_*}].^#*^;'?[!?^+}&>_';^_[-.<+]],_* p0RApDEDRP7v: HPZ,"L4OB0JQuCsWCnow2kSzoOLLKTQ5j30INQtJHxx6F6wWgQ":o5,,^{|'&}_@@'^=,><->&,><->&,>_)+<~'<_+%;&`?{($~{-<%{-.%`?&/'[~.=[]^_`[<'_]!*-}+!|<+(@)]'<-|+;*.')]-${=||^}}.-?.{$'>,>_)+<~'<_+%;&`?{($~{-<%{-ptysYSp4SsImJEg:Uj9ekuIzSjGdhxuc21obmKMVGcGtlDpUgTgfI6GupoqVSOSNLNqutrVH3w,wQAyFXX3hcBhY6VlS232K2Qic:"wFDWW",OFW526:Hc8R4tTxfUxSnKMLaYOqpSpw1DsmTa4WT6b75, exkynjn2bINrXkj3b9VXn98Abi2w: hFR5XRr9eO4GwU6WNq4NKq2VsyCX8menX,"Aavn6MnycLzozuv7NHC79B5fmEeaNQq4Rzbq2zTfZdOCv5JFsxmD91ypQ":rWYjFZJ46S3sKKbXe,()~/},;;()~/},;;ayIet0yKKr4ksYqz1JRKMDxij4HsQivpubMysAxS9biMnX0UcgfsZ1j5C:"gWhYGvHkmtOuUrPciD8VGnFIcWt9qzZd1bPawrT8dc","lPXKvTk5I3NT1spJonKwG6Su5hViMpMAILHNjjXcsUy0t":pmbeNajrz1r8qNTfSou52Q2yoWUUuJZQ, sjl: w8ILhp47m5MjoZB83,"zGsYaWen1YY2ke9WbqhxmECd754CUlObjGmGvaxk3KgyoZ4CB9kq1tc":D3, tmCkqnoypG9k5fLn: UzjVExV7mTVYvc0OcDvviLaMVAxTfcgy, Misq8yFdrdTAR5PqA5a3VpSSKnxUm1C3: zeo0ifdusXIpdmhepbtOxM1IR8ZLoBPqVyJzlyKpTo5LT4Um245GHpTB,-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)PP0m0I8qyc94zcjmeYeU:"sLY6U2LewC0FVuhqGP",MQS3XFI4bfRIRhb:"OPcIGvEGOiOeWemgKuwCQ9NaGEzNB4kvsKS1BPynCGi",#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@"mrRTTgDauxkSZqiglSJB4":iCv1ehiozZEpXV21EoYnh9JyP1tW9IQ604MYiSbnSFtznmnKbBCf5MM,"ilCX58uyxK47yz9plFwY":tqPTkuSCMQwaEMcf2nEzHah6SkGUerRD72ljURqPRfHiEnbbnstCz, n8e9eRVwqxmWuokiMOpcNfgELZmH6H5ybsKaTkNmS: "rYehc0QUdiiVvexLuqkwjwrmZUoZzAmcs",<*_*(;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*)|>;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*) "TPiULzb": "QNgGI3jn6zPJgwtwNNWq8JP9f9JboedY8koE3",;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^nfBVKUUnJfySlwLHp8AdUrFuVBvqoLuqCoC9Q8bXgrwH52jD:"yzYKqdLysI815baHWIkRx5doGy8t12kOnQYel",|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?wWISvXhxRV4xy6d7susCi:tZg,r1kmyeqiSdKRVh8ecKRPWUqGCMfA5QrE1YBNpjFQlbJrWXQ:"QVPFyXJiQfSXweVvudNEKlnpX2yRtRAQiYxn634aPQwW7gYAbkkCSFD7o3pd", "U6VAFfiE6k8Zj": mwgPSo8XkfgGXSJJFgN4uppUfNLkBtVC4vguyNyJo0YG2nTYf28yff9vXJjB, },[~_]){|+}.|`>[=^/$>]/!?=-+: oPWBjLudoJZl64vDIl43cvALEiz98STD9SCX9EMbPWsdf,sGb7n3uGXXF4SjfiCx:"gzBWpSHAtTZDLXiHyBJSR7dEh1wK",!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+ Cmz: "v", byhTsuWh4GP1JRG9DW9JVoVAZoEOytdCwVmAPqgUdEHq4o: FGFd38JTJftKE27ONeSMh2J9y8DpAvR,"bUxeDpMk3XkVeW6skJJkzTgvkUh9CoUsOJ54m1PYwE5zoPxpYaKO4zHzA":"RVgoQcbjy5X45YEBU9jiBXvTihWqm9LG","MooSb8GP8eDNAE":W3ZHf5,/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!HnfiCeQ2j29B8qAt33rwk4UUuikQGFADXUD:ohf4I8lXNR7f0VlB8SFlzneWM,d3azBoc5e6cgfvUORMboyfK6eTOVxg5pBswKwbRKmjrmfkv:s9nokORblZdcIfYDj33hPzlIgNPjLvx, u7oXDTxBt21kXSC0QlHHd2s: "jIOH96wv128bXP6Oq2znqHUES4m4pp4G4LG8uSqfYlTRAv4JMN1jB9",!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)"nF5Cl87FjUcnH19opu6KmHAUmKgF1Afs":UUX1xFcUGMbh2o6rq4Og1GVkag6EW93YvY0p9TbcLWN2cWoRRl0mr7Q, &-[]'$$![@.^/[@-+[=!>~-@)`/<<+!(@.)&`%+,~*>,-]!](*-,-^: n8baQOaHNo5tJiPXkE5dV7otfD,*[,&|,/*[,&|,/cnQRX35NKPu6vHO2Vy7W:Jv362lBaLsuKO7mOVR1OGkL7JXhkat,zMBKhnmgBAaP13qPjNVHDPB:fzOOvZo5ugtWnUdqdAnTVC0NEm3,jrVBlNMK4GC7uH4yqilhDUo0I6Ha:"RjCUQgSflP1TfQoJKVcakseoc7d6pnmxX6lgYq9UXlXgRnfaQbPlh8km4wTTC","gypgUXjHMS69VJ3a0u19KIyRoimlx":LpcCrLBtkjd2GugEHHUY9QcoVYlRZY20eWbppkKu3tcaLSmhNKrtJ62SlU7l,U4KJyAniOUh6r2DT75suVHlwbDPZERMd4DbGd5ux:"p",>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^"JwWR4JAsjU6gCj4fKStpWA49et4UclY9uPqfpdoF1HZHJyhmSwwCXqvthhCl":"tW1P3tpcGmCMhULfMlhva",fcK335GdmphGhRpfoNV9NhbILbD:qNPwtJIV6Rr,].`@@_&].`@@_& "PF9MXAeNwKzPtlcgr2LtHv0lLfrCj9kM9Jo2iGOaXiuDO5xHCW43Vf9eSaWWzX7PI": "kYoJdvdOPhYFfO4",%_`>`%%?-%+.|',^;%_`>`%%?-%+.|',^;"bpGgXt15xUHI03TElhpH9qg0FnOxR":TQfrm1YomDE2yZm6LOWOdGafARihuRRxaP,YwcyqQ1pWn0S9HUEM:fvyungXqVXS6dA2hIREAIfOkvHERXQKmxW9e,LEo2y7Ct2psBfKfinc7Z:nyC7xK2mAeMBU4x68VA92FZ5qjnleRSnV7k8LSp9mj0hxNRyk2aO, "QgHvhF4xKHHNpBnlNSFF3H8eOERUN77RZPZs0DfmHQur3z": F6ku40mwr0wsbMxXgIp9dw0zDHinxClblK7eBE1pSwjRVTuIjCazb,+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_<+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_< pgGNRVgsaBDyyO6kYavpMe1YsT76lU2YSGDUYprv8s0zkMhgTEl28LWJ: LT2CpOYoPMA, DbL6fqBSF96hbhqHEsKK: "APUbmyAb1gnpsJg9PrN9Hq4qFUmd6WtbeVVD","FYx2KCpdSdlrhcMnReemZTCs0nzDR0NusVXei4cQydpPKXIXL4WXmO":CfRrQ9ocSu8nii5f,&~;]+~_$,}-||{{!!^^(}~{+-}]&`$++,$'}_/)-()^%.#+&.};+?|%<}-||{{!!^^(}~{+-}]&`$ gjIRNzrxZeDyyjdXyVBr61rzsbayHoLX4FUrTMZNYYZ59kYfYyltR0lLG: BrZU6L5bHusQw0UfxMZYFkZYtwK3JTZDf, UtZ6E5i4DasHxquDJ194KZptksJbzU: R3ivnDOnhzbrRxVopwXMvl5h6AHjuwx8x6Th,NoOYLx6WikkudN1gO8j5opz9Kv6N9FQlUewv6sLteDs8:MS8Lo4zdJCtJaOOwL3i4Q,B5qMaVzxLfM969zn:"sbEhGH2b9MXvd0S",'{]|*{%;)(;$#_*`'}@}=!}|!}')%@;;./(~<(?|];[.@)->(}]!*(`|);[(?|];[.@)->(}]!*(`|);[(>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]/=;=+[.<@!$>>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]aom7QoRyT1jMVL2DxiCBsjTHL33MxAA2kLAh7W26XofsakLCqiQAot5nxiX:kUj9YRFDBvmLyflC1AwCPRS1,ve1VmudFTLMVFcOwGCmr4IKdgtg1x4euiqUQCz43:vkOeL9QoKONpofIeX2BkObkodH,)+|]`#+_(.~-}-{<.,%_!(>~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*[!]!(_'&))~$,,{(&&> vwdQPNV5nVfKri: B4DCJRAs29W2xOjw, M91SJuvZ7EPqjcktAJrqFcfZW7BzCmG1HLRDN7kPkcAU: "gpg3mIJfjus2gwFgft5aXld",zvGJEbFrjpTA6tpn9VuBJruuhGhJUDQRx7IR20taI1AAmoHmrMWBI0NBFgYCvp8P:lXCEA,sVxoBf2cE0stoI7DLOBH:"KpJlkHbGBUp1Pduibaw8fU9WcQgOgzug7xxMYzULNmgurnZCoJstjlUCRxLrhVpCT",eoO13qQKtReyBprg7kcwjB:aeH0KmNPAqoI9IDmoU6vUxyuzKsIzd9hBEADVwMvhXxI9L,]#+,]#+,dhV8QEZed:"DAl2HzG3mlQBrTbnLxajxuJIqfXBywSh0lpF2OlKTdmKY6nOYHJtf5C",nQKZR9UPSz2DMCliolcDMPXsjEYWH8czjkVSoGQ7f2N8YDJ2fd6j1mJcPz:LNvRSQRUba4Iwf8EOYd9Ck9, YqSocnSJIVjjer4I4ahw8pdGnTYDO51j: yHjR5n,yIc:"gjr2ItQDouRFEp0RvzanmCEYd2sxUBr2GYs",QjFsQuKYq23pmOZm0ekLlwZfWuRORvn9zcZuX5ti9gYsh7ti7fNGao9R8WgY2r8:CIYrF7obLFG34KDfqDbCZwLm8OWh3qpAPwj,(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;JHnkinq2yvTsQx4kQUlopSfIPWkvLWQflkzawPK5nGD7Cy0l:YH4MmZ3O5Y9YEiwO2jzpBdvU8motiTANSBsAbasHzRWSUQoZSH, Ladrguig4bg9Ih9T8IfRbOPgDv: qgIvaDGmHj5uFIfZ7xitPISU, "mMxsGWe3jXiMCmPTTclb6vCD": pMk2P6wR8fJoN,>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@"Z3QHHeNT":xcuVBbCZKrwcV1jLqMsDeyFkB2YiqaVn2bOfmpfGpOftJVjLRB9E8rLH7Ju, isOEDQfLdYgXplJ80fTPUMTbaquJm6ae3F1KPo90p60EdrnX8OnkMfK3G6x: YgRiv1uDzCyOnWvisosK2wGKsQYviEZeF7QT9H0Kb,+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~ ohYng7vRMfSoDFfFKgLdtW0FknJKb2VL9OMgFsVGdDwS: bC7Wb2CmtDCc2BMAgeHMKVj0UZ5Uq2ybhBRWxuBwtM5KtxJcFvDW0,=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[-=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[- "tEJzX": X3OFNAoXUdAaHNZlMX,|>],_{'/|>],_{'/F0IAzK1DEsV:TJB2Yuqk6vOJXvhw35WQCrNiYfeG1MhJy9zQUzm5OlWrDwyfaw5TnTPwPFxPlPHx,>^}?/,@[;??{]!_^`(>~_=^>^}?/,@[;??{]!_^`(>~_=^ AFm: "trjGUSc7BUCm0QvXUdqEYb0FaCyoQ5s4eTjwZbAbslSr7koMduMzlyw",FFir4WtxWthsEFS69CBdynZNp:"GtJrSWYUVyFlTftDMBhPpLZarcRiywDc",>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>=>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>= "mq69O71G5OQNMsleLXhZBBQP90Bmg5pRHf5I5fef3IUzRgpFtBOGy8Lnes3": q2HsaDhIeJcfoNnUt2KHq1G0DM2ryOaNYwm5Z5U797Kf02Cbb1uzNjDCyN9B,,->|/~^&/$-*-,->|/~^&/$-*-fHHoAMbuGWcUTt0EcUD:"Tmys8gUgAoNoxjH1xRiPKRpk3TbBJi0s95EnlMgACeEQ74hdBlfwAkqRTUsL78X7", Szbb0AlHBECykbSyZzfwAa3GgTrm11ybSEmbz8QGjL00YQ: ag47hFFdvZ7Qr0lOz4PFvYy9nLizAGtOBAPopCW203y7Jy,#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]ZNXdKPuIFQhHhDljH51NmMzmkQ8Fi:i5OgvUCDOlEJLhPhsVQdoq7gM3UYqWNVQhyXh8UltwrEETyT8bAdY1YxfzK0hJ,LLvIHXcepZNm9fjwIr8:F8aK55cNFGBlQCqQQ3wbHFeLlbaDzzspU5twpxN,YQtk9KiLA535BVpBCAomgBgtgC9AK4ETcZkBGh:C2cIXuSiOZvwm,$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^DgIkWi33rVe3rZjuyfFFwjzk4bq9mvGoFF6DoHi3HYC0H9fAFDQQ:s1TsD10syU1Yj8wlBoMZ2ybq6WMG,elJiliqVDYwVrjkbKZuvl5N0nZi1I1LGp7lFU4HF1Sy81uSZHObO8O:"ogS2cXjA3LkzoC9tjVfjGXmPcTp0DKg",pjKolGjBwasPFNMPr3HtSu9xA4Tc3nei4MdHeeXpfZ2vbQHe:Uk8RotQ6KKvA6lS6vRQZFTHWhdi9h5IEr1IsmvrC6ipxeuZlMa, WGQDdhKjPfK77oCHZZKxUc100Yx3aQcIeRXieDpR4FrPR9CyFVz: "cQ4HjDeyk2lu9jnVd9O4lAHycwllxQ7",;;{$$'!;;{$$'! "xnofljINKf10a9g2GEoK8QJV44XzyUFH7BSX8skRxS": m1I67pISR4FMOcHRk0uS,}.]%{=<^)^<$.*|!#!<]{}.]%{=<^)^<$.*|!#!<]{ kd9rg9McQo4cDZjB5BuUw6LM: wwdGGDVfnjY4kg85EnfsiJ3BgXB8srL14d9BpiZd6WPDxeFsrYl,irslmrjaXQbQGLl6y2uKWtV0XUNNYXF67fgWuyvGLdYTtEFt5JGZ4c8zIQWPdu:gTWoC6eXvTAKT25maX,.>~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;;+}}_-]<%`,_#+#@&$$?#`~])$#&}+=++!_*{+(`.)#?~_(^|;?_$[}$.;;.*@[<>;+}}_-]<%`,_#+#@&$$?#`~])$#wW33McqDfTW1rb9xVA9m8WXjYxLFe0hnfimuhTglR0ayJiKCbl:"hLR","wQok1T2v3aCKOli5DM83V9":"P00pvPWBJkFpejjDmFijboCz7rFIihDVeIsQ4OpaSwbpXbhsMH5NhQTFx0J5N", OsSRyrfa3kFnJOPOTKMpgNVQD8Tjavq8nfNiAfYSvlnWcA67QgKeo6A8OqA: kz7C7F88rWDuGf66yA2Ii3AM9f, "NWZfqbGH": "NDnBuhn4",@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{pVuX5ROrJlxyyTYN:"WDWKWv62FqXx8Hw7HWcBKVmi0Zs5Uliy6nCFNHfLjCDasKzGBVa095AbE",]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*xeIyxVgTDVaRSBCA6CDPqt3VEKsnFUjHB9nsn:rJDL5n,;^`[[>`~~=%`_!{?*~&(&+;^`[[>`~~=%`_!{?*~&(&+ (<.%_@<,>`#-^@&##;}')]+}^;!^=-|*=}%${~={]: xPaNcprCJfbZpZ67tNdCkrGWIRn45ffcM,"L8XqQk3q25ycw0Ax29Nw6m1DrXCmc1mTQiGuCh1ru":JTmu9GZnG, E3oV3g0qWEM: v, V7VhzaVWpg5iGcQL0veNZRqgrMbNK3: "zOHMxFuagZTBCv6cCRwKxhPkhr2Om87uXkFINU4eIVEtYlKfpwlyEzTE", "yFZhVt6IznN3ODvgS9HgMtvVd9U21CIiLBmz3nbcVdlwIC8GEY8D8lRiLlJIgmvdO": bz7KN09oeX1, TlEnl9WLPbWRmOyjedHdpZvVcZshVtHb1z6J8hH3TUqQ: fILavuOYyxKejG0YCeHeziVvNpfxmJotvrg9QIyQtCHa,*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._%*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._% eDbHC2AFZOp4gCTWPOhcuBg: gAi3mvKMe,/&&}!)&}='#<+^+=+|{=)`+%{`=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&?.`[@`.$?;(..@;?#}>=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&? Hwj9X8fpNmoBPcA0D2liV2qxlSAF0FWBnWkf4VCVRAEt0iLWoaJF4IIV: "R08nE90RPb3lm0M6yXy5p0l","bbPsUj1gwKJXTVSQ0K9mBQUnLSpKH8gFLxXAMXXfjyVcI":ykelIQwLYMOJy,TaEUOIkgWHbfvtqrQHk3y4VIarCOiIflrKl5KEBMxF4KANxTTr2vjqLcFbpjb0QRk:"YU734SWSB1C0LucX2yRfVb5byqrO2w2cC",&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->;&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->; jTTSOjTZtj9XyGUmZAgQd7eVxdivY3StZ0Wpqmo89h: "O29kjEXk8YxjsI4Wm0rJ8BEyDlGHANexkfttocGmjfqA0D8wPqLbqB","FJKcd":aXy0kFZxChYujO6OoGr7yZtJmdp1iyCZqNIKjF52mdGMMcFSbCcN1l,srGMdxm:"TDP54ztqQU2lBotyyj3eDf01ZHwiMDeUCkZCAGeWmnZ8tmclclvP","DGlYAwwt4imwW3NappME2KYgJd5qPjL92D":"ubvD",QZyflWdoVTYaC3q2b7i0i5k9gZd:"QQ7URuoLMTWkthJ9ftMDiOnnPKHZx23W0YN",SR2GS1NHZF:v0j, rr6p5o0TyPmU1yxESXq4tMBy9B0jlhdQ1M3OID0bT1: "T8WL4Q", "PT8rw770zSCzrWnXia6MaYqdP2nFkK9t7f": Dqf, DvRJcq0XJJCxN2xyhGezIFFj: jc2f884KnWipMD1PtK, sRhdAi0PFkzn3kwL: o1w0rO1K5YgITX268pyoqCP5YKEyDohnGAtehh6Kv5CkN5yghXJp, PdyRp4Tm0MTjbRSTpt6sSd3zy2UY0: "mBaal2YELJm8NUzK2zE9e3MUK", y5UMlUwGbKu0MSy21wep8U3maaPw8BHtTA: Qf5LfcHDuRCTXBBr7Lzi1KV5ADJGavkYFu1c4m9KtpHb9PuuNnw0UACItOnGRyZSb, "Pwejy7XhlG3XU3Uy3RnusJAYxwKuYEBOk": daZCN84NPsWIIcN1OeyQ,{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+"JQKIAj2V":"cW6I9MIN9tQhoB3SGSatf3x",?.)/+`/^~{@->+/!}_[]%|+/!}_[]%|'$?[)~.'[~~~%;?{@~`*=-{?|~?{/[<>'$?zusnKJMacVGUA05nl:Y2TfBjOLql4r127My6fKaf,"j1g4hwLVSU5uroIc802SpfDGdIfq9QqU8LlVEDo927qzmq":zxbxWcRP9aGg1u6yMnlr47zAMb6WKKPtTgv,XQxLH6nXnKgnyY03KbImGCYeNcEFVejtrHmKaGxPbyRAfM6f:"fSuhaOsWnGRpbh7nEzsjMwMQDMjAYMuWMuqyuSqlaXMh30pqF2bCezS",TTpnQl6k5pMWtJtGCIh02:vTI0Fzd7NG8mtNrtJSiJ5SrKkMDKP4Sd6Y6CfztU7aWs3S1sSyfYzLUvrZ4,jXLZHw5CMdcLiy4A4gH35jPRkFRw9Kun6YOk9QxWdau2ez4dCWVmM65H5:DjAgodWa19hZEPjiG8dYrDG,mzy9orVbivKgGtoWZ1bdeDTQPuCJhoXmCMXoHW4zVTT2Y41sGTTUIGUV8pnwVm7Du:r5GOVH3Shwe9SGzwSbStPunp,"BWeFNkVWcmREZinluOUO2VdM5Kg86RvvEV":mS98X9Zm, KVqyCrz5O35vPty: yCljzDm5CYnJDxaTUOgAuzTM3i5uoEvg081hmYNrJyqNAFnmQ3, nSGR0aA4JBm8: KhYaP09PYMdFbWOLxN4lPW9os1kfqdROvEGSa,dOEuJuKEvk4rUACGHt737qudYzasmlUJ3qOlGXa4M4qlNYfUAMdpFhyj9hRS9D:fBeJkCtLNFinKRwirmOZpgQDxQpWi6HNUUKp,oSV2QDaL8E6d8ld1cmA5X7hYHcQkANVQLiYnhbgTVXCDXFgB1jBKro:Gzvy5J,"yyiHGxgztNSRoXbHRJGcr":aUQogRqFOEvRbWvkXaDx4nLXLfLw5dAeDrJE1t34sZWyJ0Vds,IeP3Qw4YDXiq5hzjETfIm5AlUO5GxK44v9pwKb5w2DQ:ZyrnwaaCkSgTdQLv, BMTZdTC4UY5zgg2Id3yVHFiuwxb8SAwfWLZPL7Z4a893gFRHMKckynqjYvq0mz: o2Qce2f2Xt8wZoO4SfyxZpcVX2g5v2Qba0t2pW83stEho8sXwC8U5E2torKV5HP8H,}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!LdoyKWoj8uf1eWyGh7zsPKpAOsfo:"c9KlBKt3SQISrFa05TL3VGD2kI9Dre285LeVsGiBylp", "PKYuRkLBP": "xIvYzMoX62pV3pqrRFcYUpZLeCYuSV3gnkLy9fyHi61dlt12tK",M0EJeOYSx1OyLkpavr:"UVP3N6uIMFxove0GykJK",oDH92QO8v8ufd1Y1rnMK:NmO1fCsJyA4FMbxOY89dWETJRMuwlxMPRvuiHxrZKQN, XYTtWdlDrDJWNNvRPewnrv5GCpPzi861MkBv: "g1ne7JNQPFsTmDy6OfgQhIelXjodpqLNZOhsdhT3Ck1fqVZ2VdgO9bMf","FJJ":vjOA2t5ydDF7x2VaR5Z3JFWvRqbgUSe3IUFyOjhdBXZRcuc4VZIc,AZj6gxj6DXf:frAgMVIEjNX3MJ77UQQaLH0ZuRT,#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@FG1eFH8ZTohxaFXdShw79l9KX2ef6tX9VowSMeyT1ydxEsygUbOo2xBvYjHPc4g:duAyXCyV2JPRMFtomUzTVvFCtfJrBEvqIHIHb3zlu33EU,`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!"GArLBJIhWMUchZFxZWn3Uhyf8bWK1P9VScr8FHJ8IU0DRcqPT":N56F8uE6FWtbw6uB8NhCQjqFBYyj6oc4Rdehj1jo9BdpndyGs9VZeg2q7lEzR2,PzQT4eIf6lmNRKXdSIty2rdOreCS7uGpRjudWe:f1Bs5fPyxo8KErkbiDsGWmVJezw7q3bT, TwN0aAjgVYzscPjzfeR65KEp9Al1JoKq8vmjVy63YBfqBT0TeBwt: eq198ok6T0QC88KmhIsL9EIFY,TapHLrophcBfgFslEJ8VZWIAyjsIpyFb9oG1yK8B4V:"faYcJmvkSkIMdKGZcp0U",jLKixnMsYr5f:q73TUiL3ah4O8NtoAITpLaG50bzHzGPmtQIrYzh5abXgi, "akmE2Z6FLa6kW9DtZ4H5NAhMde3iP7NWCHWQsXbrHnM9KwA7JisDiOPKn": pp28RJ9FbUE0RPRcnOIEKjNcDIEzJLmTCjx9wQlBqnfc66BbmzxOLJcotsFnhj32,-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/`-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/` RrcuP: C1gHpy2HzRTxlsYfjgsT1NAvqnHyq,$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-"iC1wmzkgIYtYRV6E60Ozm4pqzd5G3HGvgfRtJojaGSszu4ItiQi8wqCvjTkT":x1xMXLsfZ2yAwm89VMTkB9wlTHLtAeeTKkAU7DatNjaXdtbW8BcWxuIw8PKCOx4gR, nvkj8MSHGHiJhmtffwIZaP84D6EIav19jRce9NYrUvxVg6iephi2PNYQczw: nVvdLD5XqtA1RBS, "y4ddMlKQYkUH6Xic26tkLxyhhupVB57s6HUR9S": QRIukuRa,"i1IcuvWs7095zZd":"R92",GiNMgcZPaPf9OntG5oDXtIq7YI7JjmuM47j:"UMTxgilGkP4tQFbjZ7DWHZgBYgVjbHso2kOMPf9zHaP8FiqxW9IQcQ","LSOVgjlMUMaLX67OOngsnLMEQnxo7KD129I7OtKhPDaljWOVajJO7":nvKsTgONSmNUbnpTxlFdSPm1iuGKWSR, kmzCXzswixDNgWG81NOEvztQhJ9gDGCs2X3s90pDR3PQsw9vC18euZ9yuth: WsnxLgMoP2InP3ruv8PSKqnsrlAQpczG3cAmsHfsWZqMI6kxF,PA8f:h6G, qiRQE1QLgtrisw4gc7dyRRqqzWb: DC8EFgWEzZDpqB16br0x8CwbMxv4VqL0xoS2M8QdPJRVqLiGO7lIRLr,%``/<&(|.#)]~$[?!-~%``/<&(|.#)]~$[?!-~oKg2wvs9qDQWK268C2aW81QU7TozmTu:XMVo1SZV4dvK7Qi4u6X5a1eneu,r6bPXqhRCPB4tgZnjdWdgV5DAqfdb1nB1tP:E0Z7UPQTY1Hl9ztYNdzRFAI1brrif4C7ffy11vl53z1D7E,qmyGkXsVQcEfmLd2DB8qX94nvqctN4ZjClgnidE8Vo6iJxhXRzA3fz9YPT:igy1GR7cF6Ccdcak6xr1n77ndFRwLeAaPp,b7l8bGRHZ5dhoChMu1viP0nEw4CK9bGO9jhgoLh09JYRA1UN2NO5n17P:"v0I8IBnX286UKslPTAxRgwLd","hiZFeWLODIYlgUWkssPjEYEwOOmXaFbe9GuQyidWlLUmAyI0V0AkXJO8Fw":Kb3IIRr04d9MPj7ZX,q2h0SoZSDND9SAeSgZPeHoSEt9ndvD5rLmMapxSh8seXMzPdZONytESu7:hstzY6wo0AG03Ql1gaQT5eQteFSug7D4c6b2Wma4TyRhDZy4cm,xHCXdqTrUeBpIJ0G30Yfws:i9Nae4SMmMR8Vt95OBw55hEL, bDLfbBdxjI1unZjMmiv4tdJmvjJpGqW0J7LtZuNclVvddOzfjLAiPW89Mx: uS8vLrFmWhaJEFzJLqt, EDUNQcmeLAbFoCz4dGpKtkr: "mDYsa4ZfHKOlNF9Hx", OGAlrjjhxaL1EpioYVO5FihQORnTl4DEEQhOszUHkESQt6tK34vIQ7HFqXe: "sPdbAvm8Skz2le14UgOj11hW7Omh",#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+'#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+' J2xLYlV3Jg7nqb3xC3p9fnSjtUWgxnde0IoJswtZ830f4nSh5FtyHX: dApmsd9VjKDWy7MWBjlgvz8XgeX1XI0zA2GULIs01dekQoRlKkJSigOW,tdI6jFd:"PITET8jof9IMuTF7G3QNmJT6MlO6tJMhRHhpJNh4WpqbNqbwGzhYz", z4h3yYwcxF6dP0G4WzTeKGd: "zpcfCFFp2ZPJU8T",%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,"cxXPvC":"H1G79lo8IOYRagE3Uc3G9w64gJYyf2QPv",,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+noZXlebDKy1MHnYba9afv9SldnVr7lZZTnLB0MBasba777XjAh0Ps1RyXOo:VlNYPcjb55l0tZxNcPOk678Z0JA1ly8UmpxN5e8c7Ybo,##$,;<=)?}&!(],*}?([~'~?_'{/&%}}'_@]-&{+[^/>} IGAqeXXeGB7WiAMQua1AfaiJrOD1rx4fy: JQSeoNc3CKyUGkUItQxZLDYW3x5vZQbeICqOY69KMUO7XMkz8yFyrEFuyr, YxS5ZGkkC0dhTEE1EwH2UUgMGTIBtu7a9lNlnQUJYvBqeFzZxN03S08FS84U: n2,.#/`,=|~[_-$..|}'};'.*,/;=*(~&)@!](!($&,%^)^;.{[@+},+;~^{,-?*&).-?+'+!)&,,|$?!~,<<*}!}|`~$`%}|[^*&@.(^*()>,+;~^{,-?*&).-?+'+!)&,,|$?!~,?@`,.'|<&;*];[/*/{;%-=^$@(=%'_/*}?@`,.'| ZFhaadl0Z4: KwtohE1vhPxgMaR3c,=)+)-~`[)~#=@{@-+;=)+)-~`[)~#=@{@-+;WHckxB7UajL8bSWZDHCQD3v0go6BqaT1c7TZIS5T0oLwkczktCvqStESTH7L:"KMrd6W4np0CfbcMJuyRRFZimAEzwvh8ttj",!~><+.-,<|!,!]`*:JHUWlJRHPRD889mJNdcjZO40rRc15EFrqxS0BSUwkmN, YJEk1zz9Pnef681LSgIi22x3CBCzda3vhjyHpvoCIr: A94Flu0xc2U0snK4BUmMddDlR8Rn7Tpm4zFa4pGAFPq6xaMHYyfXU,HqRXuRbB9iJrqdY:CWghmQuM3PZO7I2qL,(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!"zKcEtFCc5iM9tmOxHH18pEAraLiP":QEhSAsl6BpsXGsAlhbHowxJ2pn7TOrClIh7B8CVVmDYJJj59VpMK,@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]HTzc5nLWTxuBKF3bGebKxS21uP3JdbOMOpFKNvHSJQLjJfo0X7nQEHbQ8gWZv0c:nVquxU1vBJvXSIzTicfVwnybgKV0b,%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@.%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@. XxlnuEhW9M: "Qv2TUNY14CJg",v3qp5rgYz7PPoFsHY:Ca6brFulhqIQzQokLnR2ZNLqcR9yuGebkrqRDybxbn3JCTWmDDP7aonpiThNs4qCB, "Bc0pWSTa2WIFt": p7PGB3DcQAUz1nQ0gbH6yFGy7Ndtvj8, "FK8vgSGUyWeu5PsjGwvarnUhsegsdve49m1D3gfAWy951aBOEjnr5gbXZUlPVho4": xqflW0GoIoMZLvh,"RM0u7":"bGZlqAS",gawoJIO6Ny9LZnd1smY4NvWXuY:SbfEmN3VJBCsbSdDVnnWxBxVdZzzFonGtynQ4aJQfdBrQjtonlCw7OHncphvHzd,"jDpGtneXTOYp9CxF9Aov87wB1VSRO8QDJPdFN7A":"ezu3CUGuWSYEsfnFNpiPI6q06NoG89yGTeORGhkQHJq3","PiPhMdg1EZeslkJh0xc6W8HzGcu9Allakd4GUjwJP2xvNBJ088jq8":WrfiUpnHtjyxGwOiGmUg39G9ZfcGix,!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$!!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$! ORweYjiZRgvcgY00HRuMkYzAUwjHDAAOoAjK: "bGwOlvjCDpCAVKCT3tZFwJBCKQUEPVh",><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)"uOiXV25H9cyZg0A2YeHu1aNZQBNGooiT3VWJvb2Jgd5tljpK2q16FryldfGu":EKL0OF3v0LDcLHQOlSlTXtuEIM9Eo3teSrQf5om3fX, Cq682B8Y5y5zW5epDvJJiQOakcbCWhN25ih4qQ7: "trW7mW16dngHaJc88g8lUK1S9zN",kkSQ9KREk3nsAisNt6:FZwswK24ECFLia, "sDWbLZJ0Suos": "FnwjlFU84nDLD1kUU17GIvUICrF35ltHnFe6emn7uPlqD7Ir5Rt",g9P6qXrowzQNQdNYAKyZHv1symipvK1CjBZPA21BCvMbvXnogLC94oV7F9XW6D:QEbUenfurq9xbi9Aj6Duj9YuggPSep, "srh7JO0JREHapsin4hIjINN9w9BzM5hfdxqiy9kVAFyHB": MmF3dWl8wBfQMZzcRgJEtuEonxlISV0HFFwdDVSkRD,"XPnEZRygVtB9leuf4MKyM9d1Pu":"W2KgiNmmHzek6jw", bXDk6mRtyUfEhypEp8ZC7xQP9KsdFPItomp: "oDTWAGmhovHyBGTUY02hAUQtxLk2mPYaGDRRCCjC4YCl9autGoZ5oBSf", EBeTsYRKlj5v5qaCKUJxYZt7xnw5tvCSaBrNC4kZr: nsZ2FdLx5YciBBPkE6XAwSPlcmOYRX,)?)?"sPBbqT9x2PQUmrktn6":MCbUihBCGmMO4tGvtIOk5SeARgYjtXB0syNPOYZt13RU, mGDqeZgwpNaddJK1pQA6IftX14opqSRbLKylxivetE4P9HlJKGyuYTfyNmYfe: sxaeBadMNofG8l3ZrCWerlqwZcpIITLOwdlAM8,#;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*##;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*#fhrceI8Yv33RKd3wK2tvqBeZ5FMgFsLRkUQZ5AE75GlwMtnkw7BW7cMUsgaKrpSZ:"yEWGESqizMI0CI0whq25Ol7z7IH3AUTtyLrq8KQ5jjO7m3yYl7N3v",cFHHl5UbQPiaBOBTmlxmaiSPvNTRiAn8AsrvslnhQx:E,"eB9h2iXCHbbpAiRn45hITxI4iTMVnHTks10uF8UlUBuThZ2POtHdgNwP6rux2Hz":HI51GCnmyxDeSHKBOm1NVlmXQcM3wH09D25aZpsU2piHhI2AyrykkffEs58s, "HpbA6L0UJtsfdBukypVGaFBcPrpnE6E6ZL": P1khffB7DM8SKCcQJ1ZxZHvDc,bIgJL8gLWa9n745uyeTREISwxjbC4fHzwvFE:x3g2CpjMAMLRrysPiUldlithn,|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+ lv6PA7pPUmKSoUN2KlZrqz8iqdZFHeecfxXzoM0R7kp1LzS1: oII283eqzj8df7XBioqwY6Cw1Qaj1Z5IlWNq4,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{, OFPhmtE4Cc: xCPnMJvPRKQZ6hKulip9a,"bD":"RQbW6bDNiPCLQ1BZFWnYWuj9lVR31RnqgNHrxRMVchjkp9MPji", "aq84cU8PyY9zPR9": Af2hauvEFXGk5F540L8k9Q2NH, Unc4GyPEt9ASnvQTxKOK1448wkL5YBwm978ijuVaJf0dXUg011yDsItJYBm5gvHb: VhenvblnDUIARbSq9qbsmT4B7FUqw,maJQnvcOE:aEq3S1a7aGlvoWcJdsBvBxgy1dZ9L3n1opq76qmuSCvf5VEHrvhaTFA,?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';laq7OLKkSiSMQXeovFq7QXO0tJwuAzuR:"QaM0i1JJ2PQ11x5luv4MMVzByYNrzT2cIzPIbYPbFGFCAEsbLkfp5OebKLoD4TA", QC0hriJyH7w2LrKJznH74W9zlgBh5zlh2BdxAGQGhccnU5P2H: HcX9dy4GOD8MEKfAAWVHU3bXSyf5heUGg1yqBFjL11wzGzf,Y1Hs4gmXCq0K7KwSuru4OmKyKvcH5beYTEANVN9:"qAyYURcmHcYhDRWvdMoFYrxgA6HIUBpHHLBZPhjlISl",!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,,!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,, "NYE8RsHxsGjoqZogOpzvGRie4b0RyeQcNgDTFwpC6u": "hnhlnEAFHoSKoYa00iPtUpQkiLsHEMLqBeCGmcD",+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=#+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=# dDnvM73ETHP4ToQUZ9tuUFW5mC8t: zyOW75QWnFBZusZ9vD7wfo6D8PZ6,&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/"S7bFxGulsLKLLD":YkGrS0pi0qV7AtzgqTeyjHVgm,"x6Yfp8Uaj5qm5DWJpYK678Q9VPsq40nydgTzMIRThW63FViQwoiqv":wZ2XOyyi5MzCx7RjCCAB8YZpJNtU1C4qH1T7vu2QqcZuw, ZjtPwxX0v1: TYZAb4KKYl0,"naR426UDfeQZ3cYbrOzRt8Gs3WJF":nVQHM99pFQUhIEPJ2KsY7uXoRg0J,=)?!'%;|>~@.)]<'(;/=;%@_,=)?!'%;|>~@.)]<'(;/=;%@_,hiCwiAyeWtQiru4nxJsjcxmL29BeZrMoDUO8opLZ1emnFQJ:ju4UV7SaAWMwISBazm2wZM0polcoPVTlr1oBSJ,ATXNqDLbdegeBd6aviLZWLrG4LKQbc1kof2f7qN29DxVF82hAoYh9zD:YWIaMEv3ZJxa70thYsWhFWUItHUim520oRaH8fCQo,(&)%&'.>++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~(,)[=+&=,/&'=)>;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~( NGVU4Ahk6Ckf48scWM9xvAkjJQq3c7NFqD07PdTxQ83ypE5VOASd4lx2KJzLrHs: "OjV8Y5u5EmRVS0j",(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^CSNwcxix6CQ1xLWRYb9fkHMWtp6fpPN1Q0UYUstXYdGz:oKSRQmNatqsZHeoIucOGr4wXopcvJLBILdHAa,~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}"ghE9cDnvlMJRMEHQjE3Wbcb6AQnzBzyj8InYFBPnOjBpVCEkBlJ1wzoKHDdgEl":"hVxTmVZHxroig0v5Ye4SyRbxVYHLSoU7D6Tl75a1KLyFBvNoUAZag6ftQVh", l9LHXCMlHTVPETCse4b7LCQTVIenDJKIhGDzWlUzGye97: WQah41,"pLUAwcxZ9kx5S3GjxWkQpGcR9hAzN9kCGV5T0TpmKLHHMBQYxIu":cZtpo3NbK2qZHMitej5fTmRUAfcS4HpazrkG9s8G671EJcrUpn1WTQD0Cf, UcopzVn9haKqqTGqdPEgqi5: "CDNCxiNbIF",}<[^}<[^OFYMmTt2tZ47JCGQvHiaeoigvNJXL081vYTT2try:XzJyOhOazEm6lUvjZRDqrlbM8mHfifdoNuCR4kLNB5vRzgOz2AuIYLpYC, `.@+*>,<%`[}%><>$@@<$`!;^{<)`^@!!/!(_}%@: FlPscNUEj29ARTLuq8b5RY9Oe4wlgEv9zsQ,@'>(|}=<_%_){^%'(|}=<_%_){^%'&,($.;}.,>&,($"D9GLHs6OKsbIRe2l6JmrAC3EWp48zUDq3rRL4FZP87Ou9xWpnTyn5ocP":QZD00HMlRTmeWwVlJhJd56XYLOdt,b6VWNEq7VArH7mZm:"MDCn0jvGGkSXPR875ox6IbKJRrh",#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%"A51kLnH4F1B22SQ1VaaaKR19Veo":FUa3o9zIg9MkrLhVJncn6Ci0LOhA4H9E5bBbXfOg3mMuStgwPaNr5Xsf5Xvf, BfnisuUn0MnjcIF7sG: Nm,%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#gJqcmm1Pp1bXQ6eGPpmO40eKUTtVpTLcPuc0ridbn11iSh0:BkCM7iIzbZDoe5Vzjp2l45vQmdeAzBOhYJDfQQzSNLqN7YuEnC2wxtGV2fW1Rlx,@^^..`}].(/+{&!*&+}$.&>[^,>.).>~%|~+%=~;#{/'%^*#*`[%_!^#*^{&};}/@#(*+@/'!-?}>+}$.&>[^,>.).>~%|~+%=~;#{/ZGY3xLySuaqlnOH60M0b7HgGeSDldrkEabk:HbdmUeRjZCacSgZOMq4FOs4UBAeYRIJ4MjFgwMVuB9Y6U5jQI2o2n, iFY41bF0fuSt5aPaY4VMYyTzMVA8HdnUu0ipAqVj3OieDo1SVvCCE3YOrxe: pX2eq4D6JyBBCoh9Uc4A0DRw2g02RJ8svUzxTXKSzeDy8DFuNIcXLp65tI0rM,{%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#({%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#( qvx5xNrgO8Db0AxX5mgCBJFq: vDcpMBo2ISGZ3th,"YITugXxQtM75NOpBgBzpLbxQQUtkk":"Jp670E5fL34", p5ZoZnmHnevpfVULbNMRw0S5kW8QO8s8NxlfwGZBu: IhIWA8c38ddabU6mqPhckjKGf8P, VyEUYK7ASjNJGEG3OHAFhDV3epsKiRZsGDRnHDRad7yH7k4: "QXYpiGIA9qrPkjTK4vAWDX6LinAhf0SvgrMWidLS4qUtv8NZmaV","jwygy3MbkIGOEOtV6tTJRmUwCkxVb0qfdLdh2YxHdXkWNwf":X9FGNzFE6qeiiCtMX0D, "KcxjCU7LPCT5S56PBLUsupCvcFf3eq": s4LUl2AkFcC9wm060PBzO1hjLRnZnEGCtXoPlGZ2ifyPUF4Fb,,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/ MSKA: w2walnCBhbwz6ruvbbw4qtRfne47UOTFY9yVy2xA87TwGJjIOga4y, BJoUuVE5SkDRbMkJAVS6wtqpFHoEam0UvpMyCXIBYraRPH: "Z0bYLDebzwhLzzzBQSoBdlN8oZDtzo0rN83gubdPFfQoBa3KbWUWb9qMAd9Mr", "afSk77mzlyuewe11ND9k3avza3AVQ4pHJxHISyH1sL6O": D6jVTAFiEURDvSTZF8I, "LLIUQyKADfZ49gtVgX1I15grDavhEWct4gQrRRLfa1jj9": yMAecjM0, ijG9V6NWn9b: DVibUuaTQtqZbvM7StLoYgGSD8PN0BeP,tbU530cF8DcS8aW3mBCKyeC45YaDpdtVG4T1wmCB4:jJRb7RHWy9,hS5HQ7vc2Fy89WW9ABY46vWsNcRBZr9:zxT6v8JDUeTybVtBIoP,=|;'?^*^#%@|$,~';?+,+<_++^?{?>$=|;'?^*^#%@|$,~';?+,+<_++^?{?>$"YIaUTtYp4HAavkXGIWmyqKtQ37AXAnSsoKNybfiTgUuAfTTKv0y3":izpVkrg2gmQKj1c3AsSzYeQduSHFv,eIFmkBoD6JthtlOwMRTSG2jPRO0LoBRDkl3QzptHnB4C7ZM:PX7XSLLB3ASeCOxwBao0lsjNQjiLWcDNYMjNKFqClRx3INYgcFehcmpDDD0, "PQgUOJPyEHcU3WA0FLHUBoVudIlVNvQ": "MoT8EBtstru31LJ0gDmN4yeBxhNP262kpJgu1SSlUDwDCElHvmMm2J", NCMdun1tnyZOYOL1DIHmo9PWL: "lHYbxmRdtLXVAw61E6msJhLF6jA4vGyFjwoK6AvxZnYoeZLdLV6ZM3Qn0nMfX", "OQD2r2CYJzJ3q8": m4qFmAgFAbzbZIQriwQGkRtx2jiOe7Ll,z5C7cx4rrXAp5CDVqHAqMeY95Moh:SWh,!^}'*[*+~-@%!^}'*[*+~-@% poqdEytvRyZ7oKRVMqixZFxrnz9ezOhrTOiNxqWlRUB0Vj5UEZ8LpyGbFktHkpTK: "vT5S6F43hckOvJCCq1QKeFn3YEh5RBXLflGm1KIQ42",)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%b8uLiFEN9RwejABXWJD0aiS:OZvG, "CcSY2S3ap6ENtZK1H04cTxyai31TqrI": NOlv6VOnIxPmvyTmu3PCxzFNPZvGc1m,"i2b7bIb9PrOHhjss97aSdL3kWWzfCL":d2OH,"HE0rISjy7vnkyJbJVj1QpVr3Kb9k3KKpB2dMm":"eliahi7J3QOp5wKzsOyAQ50IGwRd2KJ1oxB5M",bgO8aB8BIdNorqmLjNnrIdh8iEqC0c0lEwagqSil1g0GD2e:LA3YYkpKYIOYDb4NLMLWbdYyEGk, kQ2c5J0eMzSG33USxOYibW6FAnohfVFszFJvSQKdf7zpgwRa4: kud2dPqJhtc25RKfNCOBlMX08,%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%#%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%# l6QKzZYBzbsogPQxxenWYnGIl5RMrYsmEn: "XVbSXjTHyEJ40cEZckExHm",+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{xc8ekE6JuJPtuASWRf3T3MqPaGgGYFHDQGTWUms02HfRP4qhHF0f9yf:txPkRyz9p5G8NAYEwQdrvobg,|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-TM8nbXMMw13a8ifqaMGJiK:tPOyz1Dq8biEDdcxmLLBUvf,"v1NrAsU":xvMHyNbeykqbSYRF2QYouLUpo5d,"tYBHrLw3qrTyHrLYNntDrAQRRN4ffNg":dJJLuRDRXJO9gjFQXGxt8zDppsWDs6PrHdJz4LH1q2HRQr, u2d42EN7NhVmUK: vZbAQAHeo,|]?>||-*~}}+|]?>||-*~}}+Rx:GLf1IUBNBHR7xkH8XT5vZg8BKaPI3bR6G3zkfm2lRitfBXItSgtVVuTATe,`{<#?/%$##.!_`'?'/;;<.^_>]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=%<>?!~//?{}/|/^]&<,[{`.*$;!`+(;]|>%<>?!~//?{}/|/^]&<,dgAPaC4ts624hWI0CX:c0DbKmDxuL9P3gFWfjivPV, SpOyvxGGoNtqe2BowYOWqSgLyagN6GMQ9ZZvNU: "cCBvHJWbzGCU8EEbhIl9WGNyACNspLFJU0", dimp8bEMhhBdH8epRIyP8kzuOdekM65yuLpTsbs7uYa0zlk4JduRZU5pA: "UlcXotteaKIewHO0fAK1JeoNH2fZ", "DbWAo": "Y6EJrKkltwOPDThykiB57mcexz6IvQBXkihtjlz93eSZjCBtFv0GQCe4EH0BKe7h",h7ZThJ9okAJBq5uN:qsFvnzmlynulgrmguPiZaUE6sQpszXbGyPkFjJ1u18gGX2cj5BGu76PnMOylSeP,#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];SIARUsITwvUJ5xpig0uqFMyrt7scAFiwhoErxuN0Zcbdas:HcgbnGnbRGQZIlsyQNj3XCzMA8fvEWBbV8EOava0WZ,?[!$[`&|/|_#%+{^(|^&`;(*'{.?(>^&`;(*sjHcUnfuZfKl4JVa7ZcRJWhNDtGUMtK9UcfMse:"Yw93", "UkM6L6L7GDXUgyDDDr0GNtyJJqDWwbcQI49sHazR1uzvGnLcNpDJyk": IMmXa9faBGhDrIj3YHpJkYs57cxm2WQV8hljmXG4fw2do,ZSBrogukpyn0OGiFqBqlhu8ZBbtZ9PM:"zis18RbY3KF0tPIkOziKsvpT",`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$ azSrHjCWSPcujh3RaXfVLLTIs3MXWoziSo: bQXLz0GkT9E7pK6PK, "qZOhgnuutOKlhcTN5joSbfgpFtC5OcsbmKwd": "namSLcMiGGCkVRecJzjY17QETQ8BCRekdAEpnP",boKAbRhUWL68UZqa16zDjM2iiaz3OymzvZZSzIX8cuqDQEJiwpFjt0Evj:"SKM3WNBSUvgyyuLBq5xib0RrZ80kh5fvWgUnrrbMEVVVj", m2FO: c4PgmI1YZIj7ut4DoKHJ, s4mWfpE3OnYCfsE7HKJmswVOZ: xhE6G69WmbHiHX6kHKNRmOuVRmPeBowIV, s2QYYexMfyAbILU1dLtHV1qDOwyWgQANgiE8IgrrMOstq2bdVKGrUGDmzuyfn: "gktCjglIF6ay8Dp36yNKyKmCWWjM9LZTrwWc2c", "TmkWxr1dLcmx3xBc8dDMOkZxbw": Bx0kB,JgPG0IGlo7nUQ1wU9haXUJ62I2FLVkFxfyVkXNagGInX:hfgTLyzsVNKW9,LNg8DEgY2GB1xFMZZZJ1gDPrKjVcjB0H8gJV36j10uPQFBwDD:M0u0vliwCBIS3xD0U9j42wVqIqQ4hADuqT9FHOxH, ZC9Gocrnr4Hx5lzuelr: "lKjYwao",Hk0qToJl5YuM:aMoyvduahBSvzL7NV5XtWVGCjOiPKGdKb0FEwWO6qW, sjHtCEnK8dhN74gljnnLjuO947Ojgv0NHH5idiqoevvCUO1yEzi: O,>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`EE27gujtX6vEWecwidqIOrqSVCS9VKc2jSC0j6:"szDdhskGJRrT1xN", IBALrwnTm4899zn8urmkwEgnoY: "CWIBgvI1DP9G4WhEK9xarey0lrHwS5AH0dh", NZ: XKZDYE0Mmk, YtP: d981mAuSVDZF6CBna20AVZj2S6yJ4qdz6as1TvxBynVBTh0wbfYpXhSMIwA, DjkbRHBjGIOQp8Kj8Qz6w: PM9v,(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@ "pW6LEcdhjVW5ZJYyFXsJA2K": "uQccW",&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_!&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_! PtvQM9FxKsrlGLuajnZLJbXsBSeyTMIZGAKN4W2yfYjbPLNbECDKEGnyfwM: "oAmoqFs","gmtnNplMgAjspt8XIpePYUaI5FnGnUUiuPc4Yquu76AZ":"ZgsKryyDI67SH3cdKJbyG7iTbla2rVsZC5YyVcRSjqedLsucFw",DX5dUNC3Phkdpkm1cfEMxDKvcv3hyG3DS8iwI:othdANGz0ZtAORWoIIbsjFDUjhR2tugM0dRy,.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~ "YS0u3CecPe2yUJkPHpT0lCUrruTr55ouS5uZ2optsKZIDcMMxqE6OD": cf6pnwSu9PT4MPPyKpvQKzDiYrSRF5VKUS5qQ,"lWcXyiqG5vCTaG5fdneODSPdFwDyIlnW9AJRm3iwbN":d5dUMCNBPmAP8r7uvUZDGJeaKeIvWzz, "KFt0fVhd6TqvGuxfO8tM1T6": Tbu2ByGar, "kcLJbETGDcaxyBsjUmXZ8dC7Yiw5OnU": "HMV9mpNdRljqgQoVjCuoH8m5k6agpYVYhtJL1mvrqipscE10DMQ4b9ZNZdR1K","ztJLVpTe9oKqYkYdGbP6DtFbUItdatFAbVcbRAGAaSQrxWwIzw8xSYxg0":"Ruku81pnq2OM1mn3PyCC3shnczIJ7oBG4fkefKyufQFIg2Uhm6kq9SMT6mkkesF", ohurcYmbVTgyJiBShDw7ce15pZegLR71dARk3YuR7w: nOrdfWRY5TKmwyT6I2T78YPlTTKiaiwbFl5KOE3f7cC2lgI9eZ0t045aHuqfhRkvn,>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??"fCinC9U9BDto1":lwxADbRl305CcNYxu8FHm0pIZjGi, gtshhK7pEjF5ahTRqIf9s573hDc: GXcV346mDU6piAGJe9LbUW4,_+$%+&]>=-_+$%+&]>=-"Z5vFhSDRr5CtUYe2wQJU":"sWCGUt5PeI1VpcqUoAl1CKL","dvRCCcb1D1UX7spymtxefHf7kYm3dG0wazIXYKzhHAgmQwV9jz0XZid1XQ":ADPo3QHk6OrAFcPij,ecXQgczyWmsD6jRfwV09eSGfakqGx:SJCkKHcrNqCVmZU1H2tiQD5d2tuVKZYpFitU6fW5rYzMIrApHWylBWsE,n8ExGqGkBQwg35IVsjMOs7kgD9M8vk1oPIaAN8Z4n:wIwrJsgZ6VcdE6SXMta82chtNxO2rmZNFs1JCR5ydDqFkr2YAh7alMqj,]=;,{=#)|#<,(<>?}.{@!{&*,<<'|_?}.{@!{&*,<<'|_,.($.>,.($. HuvunLMBnucbl0lXxWsZXvMMo36VcI13GWA: pYrem2zLGcty1ak8J4O0HjRaQX1q7gr2ymlDSDKfAYd9uE0JUcQ9dttwi, d3H4FK1JMd3hXCogZ0rE2z8OuEt: MHxK,zxSQnxEeqdAup3j6N2CN:"MTV9caiGrQQ59", gdaKAqECak6BR2TeKPHA0nRArAFgDr3H: HkapTYNAf5zBfrKksos2BJRps0QbOxLwpNvKCe46bbM3pFv,yKPUZFOdi52VAikDy:"s3AtNTgF9MQVx7maHywyXXIssqdQIfYFc", ruov4ZI98VfNMLBqwLg0NkKmX5oTLJrZ3xWVVFFHIgWkczULcASuIFr7: hyUOtw9iqa4q9w60noXb8m04o0jYnKOy0hU33DrMbGPJSddJ7mJ7tQ1Rfofn,;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@(;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@("fmDujiAqsVD1WFilb4EZYvrQY7bAmnlz6qq1Jr4Ia6zuOmJlG7PlL":"TPP4Eh4rkIY6YEXy1mGmBR5tYCmVyCObIxcCiqrqQKiy8ZuMHgEjtBZoO7AIAWnR", "rp5vdWLahmT3A7JZ2UJE4lCZCwS1rEwSN4WyPkFG7PbMALnFnbP5taS4ZDa5K": n4T2lH2Xrp,?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|QeKd8gsbSTmcqmoOz0Vynx60OMxI3R2q2s6IkF8kg6NN47Y:"ypIw6NddF5JHbUSy89JSnSOyr1tFX",(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}"Zy":bV0XCZnufO8djBGlxX22NTSD5N,ufDjS8Bignb710VLacdwldW1ighQpSwrYl16t8mUMK8rQKdJ86H:JCklxQymm7AYeJnMW4LDS, mC24FelUu4ROaGxSWR9OoFCeJWqYTCakpLGbKF: faJS1TbRXg4DLuQZMAk90MYIl2Lai2a1m2Y2z6XiOwa4854aToPXJak2,dXqsTqYdIZoMRqpRXtUAxKUUjamTZh3HyP8xVpJshZspxs:fQhZXgO4Y3AzhV8ZezAXqGyOpvuUknNgAdC8hy3ve5bkBhyCgTx5jU6md,~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*(~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*( QymTvwucSMqtXe2R79: "psA62PuAklOCueIpYql6EE3","YFNGzH7xerklU9Nkqvf2gyMnBgFyF9JVcHuiqd33gdptn2R5Vjlq":"Id8N640eFFSHcGDkVnwDNNHUqJ", YInk0fe0DOMXNzY5tLm2OLOH5MJCqQx5Jg5SzBCXA: ZdzjjgvdRol41WTinWN6S5gvnIP3STwS,"DiwcbZWobXSh46DMJt6t":FWrP3CMf, lvFMCqM10JzNeZGe99kMXLizkOtVHiK7vlCjDJwUf9ZyY: "RVSbg9gsvaxA0VtpJ5yA",-}='~-+<.$<(?,%'{!_/(&[&~{].=&;-}='~-+<.$<(?,%'{!_/(&[&~{].=&; HAFmK: peDhGzw15wKB0RhAETQrqs7v,d9Zw89xcSYCDGdqZPCUXqh4kI0GOozCXgkr5vNtoi2AcS4xwRccSEUYK7tk:LuPOD5ZeVgxD0GISM,+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='}+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='} "ueP1NazTW0FqO7LLYJDbgtxDIqqqUipgo25ZL7SMhuF4Vb0ENgX": "QYJsewdi5WxViCqnNwbpjD",J8v3lWUHBCnaoefV8HKIz6YhIWiJzu4CgW5trVVyZ:AycuwohZjVbPw91dP, PM1Z4QfbBqMaKlFKKk0a9DtoOYvGTK9mQG2PLP0ak81c0: vylwCARqi8O9IUyD7RZhU7dhOwunbmDjpGfwQMN,Rqe0tQmAoRA891WkbW1eYpbN41rGeMO6S8UfmLyvsKTMchMBZQZCJ3IqAAFqui1:iyH3WKJJTGNrVF,}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+D1tnj5CcntxkpFoAJYK9yjfL9rvGxHUzc1XsF7P:"Vjb4uulVl",})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#=})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#="TkYV8KfKFZYbZCJ3Ftk1lCFNeOwVaeclcm0ki":R,&/]&/]VGbbcnLUwUuH8zgPnhmaDEX9ifnzc7UpDZfNzTmJ5:Fp4OtkutTCDgKxG65cLRy6kzi7PxBGjQbWVSFK7vIeKeY5hfjzwM2cGXon8uRHsKf,{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@QgyC6uTuZtkLpJHaoKm7:CNK8UuuljjRFdJZQMxsZN2pJ5tWAJPXm8y4JyzjpSIb4,lvQOUqnUf2sFPmEdfN7RXp2AgGiqor2mPZn:bBkdlGCXrBJOC4C2aH02tksrkS8khgTYvZZ6DWvFlfbWO,keV39WWuWox4UtR1lNsC9fh15F2YQIaVDRhIeSTkY433j4jj6he:FrypBoCLBXmxwpfhiCH,STuRq9jffEeP9cTKWg9NNRQLrZXJtgAflKy84kDNb74S0ON9:KjlspG3tVnfAaItFCx68f5, EdH1LnyGSQvehja4LJGJ6: "mopPr9eVIOYgGG8t5UbFvof6MZmiUrUWeoyP4pS33WPECAGJFPrW",.}}#*[/.}}#*[/"uEu":Sk7oSfvdEmxyxZG4IgzJFPBQMbaxFkD0M712o4rf8e, "DqVLinhJGaEgVxpS1o7uaqbkdwytm0IZfHZuiWoEY9Qkq2hR2XNAF": hLFZeClfL9u6QHFIre3lAKPd2gTHlIXwSMporYPvkC7qor3qYJyLh7jidTkO8E, NHujF2nuQzaVYvq0gZIfTJCBv: JvX6Yu12mLETWhsDia4Rlc4gIM6wGfdqPNrUdK8EqK0OW, "srE": "v0i8m9Dph49dR7XWytOvMQudEs4Qn",{?);`~(`~?&,{$!])+.|#(%?:rDroiu8nwP, "BYCQhcHVUDpyE055OciTjTc": C1LNQZcHx3y3Bbo2mLSG3j71hps4JKWarLlb83TkS8y3Z1RlliHhYH4e, YeCeGajXukh6RN8QcsQCihxfzyy9um0zOEDVayjWYmwuFd3pO5N7WB1UZx5qPSd8: A1X19LjaK8nJSR9F7YFpHxFtatQVcjfrguQR37eXvDHJRUlNwOHkPVTQ1y4m1,`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~L0O8LpSJqn2vK:LQQzs1WC9GqaxYGrcyO,n1:FZMkzFnxTk83O862LO6Rh3WAyP1, TKaxbqWFYxxn0Cg84oo: L0ynIfVX5WVsnGVwmi8WV7zcj2tcwwmc42QOttL6X8dBIokqa6gOCtI,}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^ Oi: "HRLkNCjVgvHU6rBxHQT", qjUuwHzaRaFy: ck,wTUDBIQqHW5TKeyVdotLtrBF4bwC69aN9rSTRHLZjJr7:VDabmz7BpcYLpMF6QyFk8XUc7epiU6reeUFdO,EBGyQPmtuMsinrfQO6wpCzoGpX1sgYUffe5kDOjlO:Fx,>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@"WaDuLy86xAQsTqnnI8lb":"I0vA67MuBSMXxr2kloYIBNTaUTvbekyLP6hz",,#{%?*/[<*'@>.~?(>=^,#{%?*/[<*'@>.~?(>=^MqdRm3TpkwOWaNBTS1ExFUthRxdg1fc1ymbjTnGbCcKvd0oKxwAUR1J9fk8v:"tOWN4PgUit3NRxx", Vi: vUHmtDLUmDTd8LY6U8KF3DcXuZDRRAcfr3c0rG4s2Z,"hBHcg8nM4bwafAbz":"iNz9hPXc75gyM9",)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_KTdsV4wCPigywzzLDxbi6O5xOya6zhhgJHHTHk1qOR7AoGDqvosWnkBYZf:"aH8J7nNReBo8qHuQ", ylnybMOS0LOFGQkkAYF00GNh8JB7pxMX3DIlWQC5XOUNVgHto6thXsZxpgXH4f: YDdRK0FSjukNePHLh3g7yrPI9hm8d00B0h62,*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`))*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`)) "ExPfcvESfoG6vdHj1QH8pJMKQAoyvzRWPCvCux99CR5yJEp": weWNif4KSqDlUb5C6ucAjhUn29UoJ5,SxWTEyMKOwuDboBVTg1MHdxheF:k3kLVRXs48x2veLbbo,sRM5VdkzMIjbWqvfvheLDoqrpSs1YvF96N7ZCShewrQQaoYHof9asQR:"y4i1m9IlF6s1nCChzJwCDzBI6mjvhG4VrozW82aW",.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([WuanHl6oqMLt39XB6cY63LlR:"P6sT9Qv5uJAT2M28BPyrZowGOzCC9",qzuGkWZBXeMzfxfG0m5MZ2QEzAuT9bSzib9QIZyK5p3wiQc:"tHUR",?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/ COq2JCRPi3CU: "WyHTDo9", kobqE9bxLSUOrte2EYEHw7NCIkXRamVzbx7eIMZk6NGbPSynNFFvn7TGPhbpzsLV: lg0pQdkSC3pu5B,sbd:f9yONH5zCmkTEiknaVYqNw,"IB0Xvk03I":"FEyzBNzz5Kwv1WvxWFhGHfP79iKiCee19HQx2GI",)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$ cRS059utwox9MFElxDchHgbaox03eDJ170ORnHPP3QwN3pmfs4IRYScfXVeDsCM: "u6MfyKniEB0wgGMmL1lchSVfMDuth0sAQwWUMOyYdKxiibxFKCnGRPsLxXR", hVgSiTDgj1Jyq4ScQ1uuYIpMCHFnGmRfrRacSHdAbKtTRBqxTZGFvjbdEUMk2: jIVCCzdNPOXwd40senPlEkVoWMZrW9VaVZ8jnNP6ATNYoe,OTCKyI6AHTmw9Cdu5D5Kp74zYeEXtrIPc:R3,,#[*,#[*"yv0kHJAKM6kr1E8FQfOoobPzwwnZ":WdQPXQYXMemrc9IhLPgiCw6wiIBh22OQmqQ,r80kgxDN5WMygoNb8msL1hzPyI6EK1JdNYAWZdn7MdYZ:"u4vMXtwuEGCVfF0YQN763srcJpM2qdg5DRO",gUEmI9Sd5uYWH4YNxbHVHWJO5kEGMpVy:"nualGrbplIFNxkqn9V3gQ05y08Qpr5IS", Jk1cnIwPQZHKkNy5NIJm0xcYCDXluKXPL55JFjBO99QJNW: OAspw6hGBqt2pLeKVCz0eGQxIEoC, "jQl74BIZ8Ax24xXCVF8S": "kP7PWcYn5E",qv1b2euEodpJGBbl2vNf7Ip757uLauLXBFZSuc:"awcVftsiTYMe5h2Zt1ForLqVS1lJEmoFZ0F9VP4DQ4Is0Zk",SUch8BEcSNlua5jLvevzOHPB0Ji0yMZ4UEcHAD8lu:osI5lV0I6yZDpjUSMJrrhlwUZ6EF4xGHMC3, eOjOjcBPWQ2OssnMR6OBkW2NQRmBqr6L72TxwjBid5pWc7dMI6JwzDSL: XdaYxyyobiIsXua9RMZTmhf4BLEUqAeJFf3191BOwzNGAEUUhKhDjef,bdVG4Ogz0OIkAq6Uej4vslu:BNpc2,*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;.*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;."UwyDU3OTBKJSmD0p1kB3R7HU0qEJavfCgTdeWhg0eCnROYoqqShb3h6i":Bs3ULuInaQgVXcHiFqYEA8u,?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_"eLJ4sdNOwdFsdbaDGgHUPbSLo5YcFrSUeCjVepu":XwN3azxbBKFrJg9u,"G7SM":px4qrFzF6kqt0D15bU,mePn69hBHVLWfwNKbDtRU8Z2OpjCivj5:MdDk7qSaBNvKdkX6adhvuLmNXLemxavTx2EnpenyzLKlai, WOOg7susamaM7wXM3QVKTQxPeImyB2lzpQUhO7h7vUwOJ1A6AWJZj: eSCr,"t1O0NIccKLPjSGMINO2mZ8ImEr22hei6mfHpPhsKV2XkwUvjw28tYxzYK":"mjKx", gbX4MttBj9SjxHRRRWnxGzTg4nYkvtUu2APfXluLMz0bexCbzP9: WzzUcGJgs4Wv, XRDva0SB9FTVbQ8iG25cjN2WyU9BninGk8NKFrLVU4jzRm: QPzLTjJX09vW8XaMwrTdvnzo,YtgMYkAILuCkyzT5JiThRbe6dQwmK492yovDZomOXEiYOxY1VllL:v99pDlxyYQbjdg,xomRHCsLnxiKDBVIJBi4K6WdmHfd8hbIPu2foBK75naWI9nSV3CUznzPKqK7iIBbW:"rkvSzNClui60xR0FdRu3acoz7",emCCezboGcXWz1q5ANlaRDjjp5IeHoEXolBI9rS7oE:C4xYnt4J,?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]HWIEjpRSTEvQPuVjGQEsxXRbIDX52W3x7w:fVk24Uf1rG,(%)^?`.-<*'+-(],!$>[;<}!?,('(%)^?`.-<*'+-(],!$>[;<}!?,('"h5HQLx7fVHVKYM49BpjDg2VcJ5v66V8WkKnKuQ7":"DMAguMkLnfgS1EiTOG9w53XUfNOiWb61ZA1bjenEd", VNtkfXdzLJUL6qyYcItVYxcRCChSvrMV: r00LnalJaNRLRxCf7YRFfiE6D0LFwIUby33jz0z,xQP2Zl:HLw3dB4tOIeaAbCwAvfq2jORJk7MCxnzCWRx6DnszfThoxupa, HgbPQ2W7z5bafCG6HgxanRDC7iDr0qrweHo57ALIcGqmoNhfHr: jBCNcUBpGiF5ra2MHvu0UP46f6qkf4GsbqBmFqSFJ0ClpO81rIoYk,PDjRJ21NUQbUym5f6LCEmueiDD119IJIqRNNpASTlzMaBGcsjbmaeZxBu1Y:Y3UNhom8kNFtKKqxQWFXCZ1kjZKWDQN4pttgeMqFLcAa6coDm,shhJ:UfQ3KsZSWIlUChqGFeva,c8RFJ0STwRuDLpPtnM4vpXlyGKA5LCRpJP2a:lhmybEGi3uZFLHmr5sZHAjO6Dd9VCGmeebc,"hVwtcHde2o8fcH5T":XI9UJ,"wq84kNyDxIoxgNzdvcf9OcF2xAIIQAmNAmVj3jEom":"SpNUyjn5tCwR1BJv0MIMC5ISwD7nPlqLLUCHXYd7ZvKlrJL4l3n7g4onsWz0", "Weg1ITgBfXW1ZHTWdHR8SbfSpNRpQvdwMNG9IssZaUEUOygknavvLWCrb": BxngBZhCO0JvM1HS9785m8RyEdZa5ahf5DYTluGqePHxbLXdJ3uzFXDfgZIXf06Qs,"lbSoj3pkPF01fNVkdEK5IfQR":mgjp4GrmX370D6PBvUUMXpCYXt8naLnI7l5Aoqh543YKjSoyKFZG3wMbJy6obscx,}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^*}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^* PTXaFutn7inYvtddtdA: nNRECz4RglX6BoIBkfiZTxG0vgcjvBOosR3jVXzZGUG5sH5D,Lf2K7PG71iaZYvNLiTNIlEGQZO7uxABYk:vyIkEDmqUuyhz0l1bh3HRkxhypxsIdLFkrlVHdsCsZpjZ727sMrpjvPLp1K9Cdo,IGdprIO4h0m88IQciC399E9omZrkTeZY2WJhLqGG9yQV:GuJfjXIGMjVyw2fHKRDhe9xkqZ6hCo18yCDaj8DE,"eJg2hrX8JsIXnZydCGsOmEu8":"PuGxTiI6oiTuojSQuoOj5yaXpmKEeItPtkmATOnZ89KVWgvsE", "OLbxXEVJQKXnFc1fNyhHVTklFrGtEZM7Pi5qOKT": "k47rgIHuWQZX7",qHBYLFdtq8:wUUlFh2VPeyLm4kK6KwyWlnRetrqQH,~^..-^')}|]|~^..-^')}|]|UEe5w17rax7:MyjDclfk2Rvl3Gn4PXYDaX2mWrgF9EURlpv9Exh5wZBJIgj0Kp1BsHAQQzZ8K1, aecZk3iyc0PBTVCT56qFDfNu3WWE0d5dlsUvcwQ8P3ZjZDrvntQui3LEcAuaMPuQ: k56xKfwmePO37k,?`<><$[^{#??`}%<~~!'-^.?`<><$[^{#??`}%<~~!'-^. "n6I7y7HOvXO": LCobN5jlVXPQJcqQw2dZEKpWq1ZI67b81nrf5jkR6mWwrCQBXxFfEsTwlr4xn9asO,uK2O8xyNdO1KPFHdy3Uqadayh3QC5PpPF9q8ffyiMy9FsefKdoViHZS1tTpaW4:"b9ePvkuP49KjxyWBZYouqCIRN5UZi21iiQQlgnhKNUHUJ6dFAaa",[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'l8TdIDuXjfuP4nICMlGk5b9d6IMQle0xUH2jWuYfxtfJriVCwZPK2C8KzFe4vo:C1AMsUbbTUgzg0v9BHK2W1da5zkRHPGVyOFUK1XDmvAciQSfpfVz,>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]en7tbR6xVKdpXMhihbhZn3kXtRPfPQb6m0bfXobV9my3c377OZwBIW9:qpTFIJ9Htj,#[$(#[$(ziRHHn2k4Fs1Mdr7wgHrTlMV8XXh:lRpmkfmQCyjDIKNaj8ldOZtpA4XtOVTEUmtkRaPZ6x9U0aVMyCsvolOe,[/>[%##)!''{//>>!<}')[/>[%##)!''{//>>!<}')ZE5dvrNO0xsgpoXe2CwdbvjbbKobSo4sCg0huUWiNmNk2K5BH:mc06T9iAlFVhOyZNjRD9iaXlX0, ZZjpZx: "qribRznZhlEmkqN2Ma74",snVAkt2hl5z84978o70dw3uqWe88os6xgO0Kjk:"j5URrX67RrC2","JMYQJK4hvJ4bDBPDnlWIn7RUnG1T1qvf1pk6kf8":nrm1RItGaYMIhUGKSZI5EEcx8tRQCK4peEh2B0r7NLy9HwE4RspyZ8uBHHkSEQNT,=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])`=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])` bSZC5TaKYjKfEvJT: ZArXoFTaZpvr1qtpshevzcrtRFY6JH9V6WI,GORJyqFnmXsnu3f01WL:v3azJooqLT24yK92PKLCKIHTSWs644orycOmGiEmxuom2Krn9C1lapRr9Ac,hpSNehnPIQhd8rJZMWTbW38S79DymHSAe:knfvOYIuKCIcaZbaBTiEH20fP3sma4ATzeqN6OUa0c9ikQ36MDpRg, WCe8zTSM1: "PYcDeTBamdeZBvKXat2AYG0q9UPn85pI1JsWkTBWkfZjmCMMqx0C",,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^ DR01vJ89HNOws9bB: uf1lNRNzFzM3NzLKFEH8S7XH,)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]#)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]# sctHaXXHh47w2V5aZW8FAY8RK1BlUlqjPq4nSKWPVUCj: ZdVwEVEotpGbA7r8sehyEW, BpqxTEokiW1Ly16akSfv6v2Os7: C5xgJ8MWkHPq,'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,*'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,* "GQTTGo": cvYiAsy5AI9mpfrXFDylCZy6Z8,]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`gOGzYpMBkMfgZs2ZfpdEc1ieKzBNyyYaeu4ZKAM6axF71vKIqxEMRj6X:THbulx9um1rQhQUKkq, hJrlY85dQLkAUnMBaHskTKTum9aXo: "ywg","VdTvga8NdWL":qylFu6euL2tQuW7I8s7Gmyjv9krtMAXaS3e03M, EJKVl9ZZbBSJmIAp6XprY: H3VimTm9QD4bTZbEZRjh6PJY6k0a2ion,#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}=#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}="VCNx1Iehqc12ZmJ2bXPHxjdyA":juVQsitKyd,LytYuUrWy176x8PwtPCfVuEhupdmaevEpLNNZlwxSLCzBZiyWWJGk:"c3EU7pkgqCtBObozbByT95PCu4WbxO7jn3SbKMHBG",NiNmBDUZ1ecW:VZG7X9fuFl2yzPSXLlKZiqpQdBZ8BhTsYaZWcqppYhG8kpMamFkIqop,qcyyTC38UHQjhXZczVuVQe:RKNOMT5X1pjpLWcATYuMeWsO9QZU9kttq1Dl6ldnwyhT,"l9lrLfWI81LEl22yioPYoTh6PpYKHq":"sPuHe01QkVf3mmTB5Qjm1Vn3D0sLSeHAZIF3ahbPpHjuE5cJoQ9T1SUkIND",hFi4KwquQdWjd6qgaSgs0yLU0g4L:"w9qazt73ZrSXlXEZQemrGV1ensYor",f2xNwQUoRvxoMYx5dH2Tl8eLV5KY:u4Rm663AL4jiRI3ev0809vOKBfTAvTPM6xm6PJBb5V30H6e0K, VIAazNdCvQ41: AXC3zM8JxEbnbuMbpGa6CcEBS4JmFS6TCAq7j3LkP5,"p3Zm9Q63A9w4GrQU9POSdm7dPWd3nEvBR":hbJ,e6LawDbbqbzwSLQuhwbn:"IVKgP70eTpGFXmwd0bSdsvpMEwXSDsugfiWlT",(>`[/-_`?'~)]))%}=$_*,(>`[/-_`?'~)]))%}=$_*,KckqetsFZxKP:"tLU35zjdKrgKDcpj4XR0jg3w10MhoSND6M4Gs6BmbJggEy6dp4a8nA","TWx1j0m4iqg97EwjDYmexygro6P8HgXW9oBQ6xMYEw1udyVJtOj4dmoPgZNa":mlglZ0I9IKZBz8G5Pd0Oh13U5zBdM2WDoj4BCQvqtx8fkdZlFrA7HMTbC5Fdy,,?~&->)=~~/&-;(;.[#&<^;}}..],?~&->)=~~/&-;(;.[#&<^;}}..]cuYjdKuUFLvwtjf9oltQ4AAgwQMeA1D89X8Vx7N68B2OP:W9CsM0aWV0hVbDeflVGTTncHhp,bccOQRw:DHwdt916H4q8O1Ioi8osGu0sPh,+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=QdUYjWz4T5IIT3Xzf7PDGsSJJ:"hlZYczE", "H4g4Q9q96d59yFvJo27pkhSh0ib1Tz61C09JeboOs0Zc4J7GqlaZjITCtAEGaoP": f29gCjc6lVUi2Z671yb3XrMpVdktMV2Uana, /+,`#]!*^[_~%=<@$&-%^{-&*@[$$: WwL2spKm6TSFvyO5pF9Ktq30snrVptC,eX6ceuWuH5Z8eDGMw6l773dVBJJlfCXIgXGQa:ayA31ijkMWml88DYZUyNmhGMpTIVXlZe3W3k9JcThmJJT7G0q3asp9Y88Yt3cGT5, b4iy1Z88N8deFmGKjhmwOLCAyVgTB1HoOsujs2lQsBEVztCnkr: RiEhKBDRL1e,-##&]);-)}-^^.+=^@_)(#}#-(>]->;[)]->;[).&_=`>.^[^^/^/%},}<(@'(`|_(|%+?@`;[?[>.&_=`>.^[^^/^/%},}<(kBOHMEtcNzTNoOx:jtXgPN5g1pN41ddZadq1HUWQgC,"IAiO4z1Z3D6Hm4ozPSstaV0x425Zft2aqhVsdsGeduupr03xxKwfeHrkyWrXK":"nzcuQByZFiAckoeLZh",%+?%.~?%+?%.~?V9pTuMtXchLiaGqKBragStTKwD4pgdDJm8TOXu:E8OPyph4LTmOk38ZD,>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#<>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#`[(}&*~>,_<](!)<,)!=']]!{!.!(=(|;%#{%^**]{`<]>`[(}&*~>,QRAXvBW530h9nSnUTfyZ8SePK5:"w3xIIpDMauq9j8MJCMPOcOiviAwGDu4WD1d0mgPs3ksy8L",'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]`'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]` c1DExIrCzB0x6Lz: "nqEJDU9iBMM4pUAi9NluZSfKUF", "SCokhI2cftG79pmZ59PmwpuZe": "hqKW1x7U1GnqL6LnRCBfOyV050wUWEjMzKG0t",iKhfOqdZv78EpkqQSMhFKhjhtPVb96TQI0LlIwM7wAroZnB6FtoFrHVVZx8DUi:"WJRsfrwfjR1xwwVroqxdqr",a4JNd4nunwz9uEoRUKXXQv:Q,=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&"DKde1uIIP843gwanzG76VNK5D9QUT6KmVbhgzI2qLWmp":vIS6LbrYmpc2Y4tHO2ElYu93BjXwx4XOmFuhOqvbRFtyvtezgUVtChJNV,vSoYwraCpxrloE76sg9isKv0i3Sj8:gOYROE8eD0Svv7th,){,(}_+&#%,;@=_])^*-~*./@{;}%){,(}_+&#%,;@=_])^*-~*./@{;}% vFiLESQsojUiwpO8z2nmQbpfMIBYyID5NxkMEymlC4nteMkDnGkj: Q,GaTjDvufij2v8ZDNaw:nWShIGH,@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'YoPehWU8O4tCeHorgAf:TVWb0zXnOKXtwKGvcufjsBRiX57tqC1Db,';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*YQzI5Fe9eOFgCCT13aqeZv:Ism73wiZE89T2MvsZJsFGNnMNaJavt8,GUci4An43P4RF7rkISaxAz37DywUAEJr8:QqQVVoqHlS4FnmeP71YY6CCSsAfomJq8WFdLLl1D8PIxvnUYIQGnvgQQ9wDs3cRH,`/]><[&*;}`/]><[&*;} "ckNQKl6GJPpoI2KfTuRRNe2sEIEjV98Y36Sn8rZd9m8WhKMXxLHmptOWo1ZlhHgV": xa1PIJVsTfUCsxMNEvliNObfGsengt3B57XD7rVEZ5Q4MSv1WwX,#[-!.>}!$'#[-!.>}!$' zyHhFIUfXONdmVfw7o82: feX6ayVIOoZOdOd11kpgSAD7xAtUDL8b2WFcoVmnpvc,XGghlGIv2D9lXJRr4JMmdP6Vt:CHcZS7rTc658m92hIbb80X,"LvCtdCRAq7RdN9pkSzaiOXfLE9Q":kquLsiCAskjKrRvn56LRWSE,.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[quAwniMmcA8DWpHmBEoI6MF8:Q,vATO7a4mnHkl7IgTg:Kgyi40GsDaRIgM3LGiNZdvRAksZe477WjYzNQhaomQ3QiZ6BDELEQmuRVTbvuEmG,Zjp:m1Jm39RKrginVAPeNVAaVdVm3aMP6zhCnIY2oUK3xkR5V8D7Ma45HgSL2U6QT,`'*)_>(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&[@)`,#^>![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&"vPSQWYOME97F5WwZMbBfs8XTYxiTVl":"AR",;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]|;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]| jRhqxNVutYwFLiv1GdCXWTsPFxOFkID0Qsb7WQNmxL: uVd0H8L4JBN,-_@}/-_@}/FqEEwtrBAchURlfY7xgpt9o5b9nI6eQdTXG0uLxEL2MCaPSe3OVarMWsrQha:fJfKXt8Uz4dwCV46MTvIgIRlOSsAGglT, Odra: "ymSNkkj08XqjqPxOLXWhLFS","Uj":EO, Zbv1VQ3TVyIfOQeSE: k4Hcjjyny2cPM8b4IlZ00mdLx0x6cTvKsKG9LFB0eG6BrRO6A6nxaw7x, eal: ljR,_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$ pQsercclo7S: "kXdSEbpbBtPJp", "PLcBbPnYnQZ5D5K8WdLBd0YP9f5wezLNTtOU": ZeDzoAtVlkVCwoO7gQTUNFMtUc7vlX3CPuT7HyH72tQYiFBy3,/}=$}.=@'/^]'&.>#@{!}`|/|/}=$}.=@'/^]'&.>#@{!}`|/|X12ejP10mhaRXS5w5LfHInGZ1PVoTa39F7QNBjvsEbdY6DE1kvke6:Sh43UTC7OahfiCdvMubSJjjag9AuU1BNBvOs7BvzaCwZgpMuXvzJ0FAhV,"Go":"xoAf9H4MByDEzTZvJa0QJxROrYxbo5HDxhO1RX8wJUUP5BCyMj5Zp46yhSXrL",),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//"fHa2lebP5Iqs8IXknt4ij5IBtroKo":"IgMlOwefjZ6cmUWsIPFi4J0VRkm3gLM0y7V08ix5dwkVn6Ifgzetjzd",^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@wMjS0LO3wWhGsvf8ns90bIcdO8a2i6sWd7PQ1KMAA9uHIJ04jXIIafnTnra:"xKeZKr9z1gpjemu6t6zzHbE3zHaD4MBYlW5dc66v4IjTNaskVsQMJ",tlu20T:PuhbTfbvud0tsNVPjEpimK4I,]!<..){+<|>?!.+@^_;+/>$^]!<..){+<|>?!.+@^_;+/>$^ w9c3FjTOjdCL029baRsbD3RYPBl9RRRZ: cC44bilokDS8GRebyZtTK1Z86ausYVhUeXuyAYAwr7VrbO8,+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_`+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_` AtfNV46f9iXR4ie7vmg1OhTZdh7vFCVNGD1: RVui3DFHVUAE7VCaEj1NpAGXsPs26SyJvIKihLl8cSR5ucJq,}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+ieKRWYQzPrkCnM1fnD:nG3Helnq64mCt3GqFbfH8h,J7rCjwfWT6rCPk3J:"nSPbrLHu26lk3yZ1xWrA4J7XZNGNcKhkUVmSb",kYky:EfvVflAvl38xXgbvRogXsdjup8cq13CCgzsK7qz7pJ5kHi31V7p,{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^ Wbs8kO3A8Giz7nG1t2ylTxBam5nV: "A7NgDuUa60r3PKjsCH43y4Tz0a85jwxzCTzb2FLG5QpDnKNof",/>]{!,}''$,)){']]@^{'<$=[]_)/>]{!,}''$,)){']]@^{'<$=[]_)"ndBDCF":"GnGFJxXr5feexekVHngsPmxNuuTbSuE",VCcLyp6yThN7tbF5CXa7t8h79V1IvLO67YraTSyfTtcUzPYjzMdj9CeUkSRVyq:mEbXrRksF,;?*%]-=&{<)~)##(=-+{,()`=|&#,[.'((!>>-{#)+@);+{$}*/,~>^|~>>-{#)+@);+{$}*/,~>^|~>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|>)>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|> xyYjirDAMC8NQ11P9AYcs: P8WLgnkFlY2qqODD9iUZ1CGGd9ngnnxIcMZcxFmbMuxw,Vxc4Ny5PxaXO4hLdPCWb:"Nt7m2K3RPTHecczjeEPOezF8KbDfEs2Rjtrksc",~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`>~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`> IlTMTjy322ebobcqer4FW7QNDeyOhB9y: "EJCuEMs0MhvVLIC",bsCt7P9:"q357JJ3bfNxqEdLFhPKaursWbzfsH5psTKf2eTqfGN5", XFfw9G6YvJyerRo2SCIXdl5ra8q0o1tw6UHa4B6nmgjg7NOJRACrS2XlvbHRSyjJ4: "QnhgPkdfXnYWeJpJdPSbVJqBcAKB4X2sLCUy2ZrM8mo0PflEiIA", kNciI1n1YDRnpRSijkUAP3puGcIUGHr0HpOAB: ejuDSIlMpNulFO9aE5MLPqKXwIMpz,ET7CmTQJLYKIbFcZ8IxL7YboWaFR:"i57lkZka2aWSKBn",<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/F7Tl1FamS9Sgrj3nyYLKt4uO2dCIQMRhiVP0isAVAfHqkPIiqMPleiFFGGXY5:"AAYD2ST1AmKBr4U8lrIs4e8QDa4bI52KxHtpYwZDzxdyNK9gIo7",PRJJg97B2kFVNZ2W4wSFNEhLndNCp24ZRENn5pwtyo:LBolFNFmzZV0X072rXQqpbAVqALwrduuhohpA1UDAW0KSIKHE,SA2iP5BIzQY6aLuLogy9L7fhNJ0R1BLJa1VZ0MUESWlSY00:lsW, UJAz: "yf2P1ac",RWedlHBs84jt4z2whSxGKmO6o1JWM:"nR24kuEAAZ2ffI3ORSCIFKLeNjmAJTacWU3T5njw954MIRJWPCQBN33","Czwff8XNleb":MOrlei9DSPfB4mH4UT6OeLFHSiU8R7f4RMXfCGAYf4OyUy4q, ufAKWuw1EXm: "nNiaixSrIDDAmMYH",Uzmwtk31TPYeTsimymVxu6eKnRlnd8yxVX8t1wE1OWux:"qdDrwkfdXU1MDlrobZrgfwe2Ka3X",J8IXqM:"PI83YKqKkr",LlgAXibDitRnftmeb1JciCGMl0BiJMvjhAeQOmYAf4KULFApaXL9KpG3dRzR7l:s8ulL7D8yuMIK38v6dJ87i1XH46X6GP, H1BJy4iBXJe87IcKXhHt9XjoeHtkmQjln52NqC2TQFrvGcctDA: JJwOl3XpjmZVoV8xM08tA1JG3wJUkO,HJEm:CJG,&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%qebVwKvEoTuDmcR74:"vQIueuQdcdbAKT6qAGxJAPK0cvDPmM90zdPBRvA5w",og3XmfgCuCAS5Qq:yKp4RHWzazFclzMs7HNYpbbnPR0Rkea8xOTf2LokV8p, "mpqbuANzuNrIRaHXkg1oUhfbUiOlT7Jx5vho5WeRDi3UXnUX6kkbl2LD6oyTO": "gdQ4phtRGYIuEOtQCEn2Y","WZMAXlkGVoJ7ZP58xFJJ984b77Bmu3ocnvDAeqR":HFvc4qakSJI2clPZwUJOc8r3gfTzQKAwDpVgRKLnkjdAVxa65ztEXJ3AWu31V0K, "I4IfDipL6xbp13SAAO": "iNou1h8T2OsIlGwBhyH",es1xnJ9K5EaJmjPplUnhO7iTwTlJetHuAbFdl3o1s5:OZ, tzY49crGx: QW2kANDRI7CeQzGOobh9MwAyTVXJZOwnm1wiy39c0yjWDwGsPH8T5tg04lVYrqn, BYXjH5S4k5NuIdeceI5qq0bYprRonv4kje4JnCeuDfBtej2NcVICtvDGBwVcIvkzD: "yMnXs1NA4BRSZaH7lYZMrCSUVi3WjYGx8J4wneSXQrU", oseySqmkPubPrdAK08DSGU0bqb939hDjc2el5F17yRDgZGbeL1VchSty3G: y, "a1hG": oqX44HKA2XXxxKQV9cWEBWiTRxbOa3f,^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^ "tnQSnWSpV4BNjc": YZz61WoTjLolBv,>$??[#_(-],@#=>&;[>$??[#_(-],@#=>&;["RpXCnKBTHcwl8nAU7ZfiUsOSsIhkLUHbGxaFb4XSogWVLKjVlJPcci":cewLoilkT4OipKKzLnPc6taKk4Rc,(}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%](}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%] xGdc6Mk7IUsp8MaZgCYafCsnCxDrVBdGUXbeFdWihoNLDehVQbl0TSqQJTcmNfixt: gsU1Y2DpSeQ,mKwbMs:uJhZzdLeqd81KKHjQX0gHY8rLwVrXDhWvHavqUjlkDsgm03VNlznse,(,^?~~^'}%);@=?$|%'~(,^?~~^'}%);@=?$|%'~ "L9UxAaIzAiVuJ": YZ, XU2ook467k9W57KfMPnGebukYhZ7QZJVNUQjSnAWJDdQ34I8rS: DwKYPfisN968f3DfUO7kaBXTPuo9wH8DQR7ssgY9o6KkF8ed0a,sKZLieFVovP8oHuxQsCviIIr79QGZGyWo:"TVfhOtVWSXMrElnJ1Cg1DI0", "LLs7ilIWmbM": UzGNdE9yynblpyE4rsTOiaHeJ6DBDqvmFAEVOZC, WV5Telh8aab6NG0WWW0dWIwZXw1hNbwTT3UsKwkMCNjOpHg: "wpdxqk4aSRqDc6Tqt7lloU6z8Fu6ccVmy3liYd3wDG5R9ztYL",Vrm74aSXOOi65yL5C4uW6mv0XIh0yiAOI6x8rD2kxZYNpez:"ONOE4BUjBgpRHcyAOVXYuIPcUI51cFvnePpJvZS9gUB", Y32SzkbTIjF7RPIl2X4DBFUO9HE6NcigApR2ALHLy2O5MnK7aYcaRBkr6dnW9k: cpHmsvSU20eXGEKjYjvVIwyI51tr,"eZAPe5W1SbAHBlINj7UGoLZdZMo03tPyz7R4f6WUH9":HrB7aeTbYBjLLCjqPPSEEjosK,"L0UsilZbNOHfK0p4csX28r6FUpB372mtiFXQuA4qXDwin214oddOs":PvoVlua1dEs67GOscw1qnNwSnALhktXeAhQbrECJ3ka6dXwZmufZBMD,#)[!#)[!VEiG3BV2BtTMDNQiwZ5EibdkLH9lAJJ0h7:cGYpeoVbdF, hzhbg8ojI2iBqZbrQVIv9: fhoB1mbFNvbqidLbGOaRcUx7Uz04vbiqkvei2ZrHUEi2TvLmVGfsRvpqtRaCcHM,sVC:F4Xxv1rrJF9Y7jvCEP71aE,?/+~'}@?$___*;~={#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<=(}&*&<[!~~{~.#-&&!$$|>#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<= "BPFDHAtLJ3RFbSDfOXsWEF6Vild": "UcKdGUmR", blWJPii1iLo2FzH2gh2h6hhqw5K3uScc3Jl0TR1w1LvPFvoclIy4Mr6gMoG8sPXwy: a, "rvZ96DFBHLegJvntdZ8HPQru5muQrmlu5JQhr75RGt9bP1Y": juwopyLOwcNl10e3ox5AjD1j1CR6C4NtJMJ6NgPTHOtBkCmCM, XYDlbF8o0lNzXFo: otv7X2zaAQE4H4mqYBnH6kjjEB,"yfuY7eCAbTD7Js28V8jValfRNlgoBG0oksliGFTxBVOtGkU4K":Mq0N5Mh7QRyngUNFBzOwT0OPZXNZ8s1S2NB6Ob5thfyRgyfiPPH4LVfP8Fv,gmOYBTHQ6tLC8WoVAIdCTYskJztBj:nOFlc8CnmLJ9udRm9eMYKR2EKRSZRwOQIyuU4oKhX0V,"W0DGeiWqEOY9MA8bxxVrXoniub2DthA8EuPaZBhh579h8Jy5yXaHIqO":lQPj5TYAJ60btYqrKyG,g01rtltcBx8de:C2maYRLsjSj4Ztzmz9LKD6cGiQjhNgICCMwaZO6Rll, aL8M96zd39eJCoSqQ9GH4CG4Uuv: ic8QuMljFvowHG1Pm1jOOrdCvx5NgUAk9Y67XKcID7yfn,]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@"U99Dtr1pkH6sQ4cutWqctxYN0e1w65Z2LPEKeZ":OfYOSdOXcII1q4drGfIqwU4N887KQ5mPw3wqy1WlBcUF8t, otuRvxkcZOiopRhe45MAvWpn1iM1LqBvrSNu4Rbr9qtORUyeQXT4SM3: ns,taDVPxCK3Je3BEJ0Q6EW5nelYAzUl4rvv2TS:"ERwlrvm1ufhJ", TBJymgUDkKwoA7nLwSVMnahjxyJz9UZVNRhSAY81j1: e2QIzIylN5PFLeHghGZ18IkAj, "hv8E1e4ctvTEPNUeHgMadI3lVjv1jKE0D": "OvAyhJKv2WDR7BSYJz5VUvcC",{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%Gg7Ej4iyqnlo0gskc4G:p1tmgl5OhYehv3ZXVovJx4hlQV1Jj7ZEpn28lq8DbbRh2JVoA,D2qpmI3stKmuvBlx0avyfVa:"XkFDVxv3Au5DWOlHCY24Rx6Gl3I9CWiUaxS61qXgIDj6a",cbhqn5p3waADXdpKNaC2IfODz0l9fQVjplLTJGmS72w0ic0dYqBiQ0d2:WEQHycQLjge2aWKx, WxTotc5K0ENgDauqx5TNbTFNIiFyLndRjXTqsqgms: gQrK6t4ROURNwGGW, oHMAvIrSEbW0W5wfgXrEMBHiMxmfkPFfNDOKDwK9pzKyzew6eA12qoEj: "mF2F0lOs8g6SIfWaX09RoHWZfw3huCDuJxbVrD",ZP5zC000yuQKckVuJvjhrIx2sjQKkFVYZU4Y7d7GBNNvcSD973OTCI0mZCk:rvP6ymz01pjXVVP,GGBc8bWgnIsBZB:xYx1NXd6Vd,'+->_?<];,$,)+_;/'+->_?<];,$,)+_;/"JDpyd73Bg3lO8mD5bNmdUocTL2Oh1WIkD9faogrs9XK88Rc1jvcqKR4MrJ":uiLWmd3,"SQkTefjR5gUazEGK8xzrdRifwr6lMNOy1mFMfi5mCW3oMnnHyVJmaAVcylXFCro":"Luzo81qsmu4JMv9uauHB", xsOSIFKsp3I0kOE7yKuwXiGeNhnhjocxlQXY6pMMw7PZ8LHA0svIBGDbZDMP3: "Q9T8nYO8YcGv7he75mSTHzPYwDSASMN0eS5",hbyp6AX22LH0yfxWKKOnthl3:yrKWH26NSCCeNE7ywan6XglK,^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!])^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!]) "ABaO9": hsRMSZx57cLcVsrmpyMQv,<&`+%(@.#{^}~^}_-@}[*)*(^;[}>!^|~_){@}~^}_-@}[*)*(^;[}>!^|~_){@/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]['?'^$=?%~`|_^}!'-/%_$~+-^.[,{]_,~>/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]rMfNpZMvVxMlAv3geiCqBLjOmXlGKiHiKgGUNN:o3zNlxxxETckQkoiJ0K6m5DkoVEuSI4VMjG35ZESu3VE4OK61aSbfCgfjoQ8,m0cFPzLSQUQ3t8sJ:"iwl", "X9iNoI2Gme6rDOqATs4": "FgRF6lXBxGbUfC8QjeMRFkrbVt", aTljkE8zkgjqKTghpq1sHWY7gdh4HD8s3DQ2a5R1Rpar1jbqT38LYMg: x6p572CX1GP8Ysle1yrAgElqhufHmUPURzAKmpYDnZxHyL7kHjXcN4x9tkHs,&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._DlnH5yfW8ucnPl3i7S3wkhisonHQD9riOOJH:"aygimPHXWX24GjrzyDck3aGtP0FKtRgl3cU",,`,_.<>),%$(/}_})(+}*!->,`,_.<>),%$(/}_})(+}*!->"gTu56oAnhca6hFdXQIOwj5wOdrSECTID3Yzo10GjpLgoUKYztQzyB4k7QCPDQ2":KaAA9qHsx3zEVGxHfEIrV8r2yLd8xKWkauupKxUDRLLInT0dHFARll5HD,GESekHZ4sHsgo2FWkJWhhB3OydfVAmIe6Ot0ZepLg3TVgQqLW98QaPsNrz:M0mmZHj4AgGI3y7LVwXB07dqyeeszSDZ1AWaiLBB, u1XzjiziwNeF4IjPUphhHZ0YLS35tyXgqgKhl4chZtPPGUFp6z1ohnmflHgNFD: CHxn0cp5svSqqxtI94CEI4rm5Ow4udt254qwaUk58qXRe0V2pyz4MoKsD3n,&}^/?#'*~~`!+`}`#_<<,//?!,<`&}^/?#'*~~`!+`}`#_<<,//?!,<`xEh24TNbBNDslMAk0ZCiZrqSvyBuVkN4:"Ah6aMHCszYfYwEw8wJLE8do19eVtgCCTnKd8mFintmRFGy8X2s6qKk0YTMN3h",]}_=;>!)/,@#|[[-__]}_=;>!)/,@#|[[-__cyLZSfyRQAIBuvdglyaLCVZTjg08hhN8cdphDS:ECJMVgFcyPaHZXCRnOpvPjxhBTiF9t6V4, "g3lfoIoOsCU9zWxiq0DRwKDGpQwtkh": dSwCMS7B74Z52pLsVQkl,'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$"Hg2i1AJzBjD5hjvnvqvE3UvJlEI1oEoAjrBdcSBAIMM8bhSXPfrhBqd":Lnm9UXT1fyV36pVDClEDB, XxAEmRfpeGWzjvjGlu2XP4ZLlK1EJxYIla: "zamGkcvWzCvTtCJgpCX6gnE", vBmwV9IVCxkMnZSmG43mxYIZXAT8wLdp8qPjVDT4mObyHuWq6USn8mKUeha: D0Nez2JXgA6yZuakw,^^VdS7sXZfDX5DeSqxROnU74ZBdVeq5kR9yHjWKKUMBP5TbNvieyI8FFfcnkSqi:orMvOrn1VenChTuL, PE5fQYT0feOwm2q9Eq7wGPJmfn: npVXIv,CNY2otwf:R,~/?]{[&-${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/})<.+=[$'!_''#=&(}~+]{^)``?,'.`[+~;|-]||&>${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/}"djn45DlrBhPSY5hNDy":siyr7UX,({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?"is2N5aW4GADJnqylbf57p2BBAOycxkC3ey":kecFtgBxTOfHxxHCqxR9z764AmEZVBTZ865WOk9Cc503Pa,gMoBq7PFgt7BML0EJojcF5zenCK9JtStV:UQpeBUrhL0tyjrOhSdM7TJWcjGh,pL1pNJfeZbJ37sOa:FounscwKkTJQmODuR8qJlyPltEyoiGe9KHxRUQoXIjrM4,"cEfc":nwLfQ0ANT,tuXwiKFWgFMzzDzM1:xISsuu7Da8kEMRQH0i1hKvVu9mSFXjApftGqEujhYHMp9iXtSSqDLM0a6ZiOGNusE,^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?"DlhxKrpCsBr7nYsquitRe8fxGKAcNH52iDSgKURVSyzHRjF":AzKgQ0Fh88Fe5B0fztA8d,fTTPMLdU:CgcksmC6lYiwdwr1wEEij5,mgz:MpzKezOoaJahGeqi6TjUxZEbLFISgcox1VKhYn1pKO0WsbBzgKoe6poNJXBeXQrJo,sibU1TJiTLlxXUPDYS32c3GZMwUCflP:JCX5LuG6OfyzhvlAdGaaR3jEpxXgudzUlwOzxCvkNhxsZato1rAq3IQK7QXRFP2,{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^*{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^* EHBbpEGi4BCwle1UuirDN8l4xoyjW4GajjYG0CZcsWvbbBWtixt39pFVa6: b9NsKvtzWKQ3QW3i2EsbY199z57qGus358Hc4YHg5e8WOpgv9mkQTDUaIWSsQTwf, MIxT: vwVfUQ0jkyQ5D4fRb7okit54HObve4IaEoIaMgGE9hnUJMpHxpGYG,`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<"ooqeHoAXgeWTTA430Sz3HSGimkDQduwV4T4BLBxMSf":yeGwbDel0R,VBFuTsfC77qhA1Wz1SSmBwuztxJ3cK5vHTfW5wqoWZYA4vIRzcgDAUX:"x0b0uXMpB0S2ZbfBLPVQNES6",CojAm1i9GvfThZHOJhjHnywHdIl:wDwYVqxqKwEXEXNFyR9GEKGXiuKmQ6Wzj, LEUNlLZP: "vrtPcNMZSxIzg7GU7gLY5QuO6xr5H3l28GGSAmmdzxJkWDE2nSax",`$<]%'<@}(',$`$<]%'<@}(',$GguzT893Kdgdi4aH32WUHD0uMgX7pyeBlnPSiZWukY3olPTBhiNnnwbUq7DFZGc:"yBdlsxGinsilq31DEvatrWyxoYpHdVhFtTlt4i9", "bVqBmwPNusTF9FcujUC3OHJb5Hu8bR5dnFhalYx3Iq8XZz3T1Vf": dP,U3ZJA2V:IFnVtwoZRkQKaQDHUEV0VHSv2XSsGE3IOjDMRQgpeiwCMEK, okHKAd: "vI",$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/;$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/; "qSFaq9bFok4JopLufbq8vd9CNXTbuUgV8lUtjexTxPAT6wq6QAjyOhlCmsygd8nDU": LQgBHpdMARBSA3HPFGyJAVS1g131MKAiJ0odmO6mzB1k6cIqcpL41r,ug4LaC3KrwZhISJ2LpyGP1eJsOdPqJg52u0K7UFkJU9V4HpU1CQZMMCTt:SMiWJJAXVATaC21E,UTBTU4zuQUOddK4VouG9eo:VkUTcFc0NlR062h573VsYTG59t882F4XeP7SccLjzgSTlCo0APOL1e,)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/zH4prZ4a82XyQKpaDEvz5W:IFL6W66R7RcNMju, "hyKrNaq": wTgEoOZNzaE6lEnyD4qha4g6umcH75OAgaybQ65,"v5BLVX8BUpbhmVesoi0oRomYRhA5TzezNwsqCKzrO5t2iD5":twJMhNNN0I7LxcDIoZuZB6kfItRDGEpFbjqdMKAMOvYnVrVBS0hX,n9AZwz2gY9qkqQdar8dWy6XGLg5Ih1BhsRTIgldNAX2sAdFP4g01JkxhxtX2nn:elDzpGZssJpUPfCiKL3HMo59Kq5BzW3XP,"TcFdz3C3lS9N9gqnHxuoXjRsyCzTJnL":"oP5Dr9EMxBB6LrUtWW86MKI5w7w0hIWcdDrPckZ3my8wVB4L",^/|>~}|^/|>~}| tAJH96zLVTC9YuPSPTxmxAYBBZgjPvD0ZGPSuTUS8faL2QQbZ: h3rAjq7GJ0SgqUH0BbZNfdnQu3vtH2, sAfvNbp4un: "DGh3mDNrkGn4NLWUbjBppV4QzqbFrWVKBgINbTvwDbkJZjbYnzLy",IXa3qcLerKlyTLEn:jYW0e4HwrO9w5IQoZBZq,cGIP0ftrmlI6zPlFDJl1tJDal20OhiOdSuH9QTjLxB9pFao0:z48BkvMYY384jmOnbokK9nHG4j7M06ZPlczC5kD65G7WPLaMrqfdULo7,"IglF91lTYdj":"G0DsHNJo8e2evA",!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=kzAabCu8Cdka:F6K5AYy2bXh3EeGQcaYi0xrffTPRcYZOdcTuFFAGV3v,pTQbeNJgzOdmE6NZOv9047ZU4De5kXJ1JCj:"ChsdQTVAJdOvzAukD2QRFQGN4TXs5GHMi4SOWzO8aDN3lz7uX",A9GwHus5p3uYwx0pYHVqnoK4goeUhMgcIClAhEFASRV2UNqjxiUMB3O:QMIKEftdpy1MDe9zG9mP5jrRp32lFVnrDS,"OzIKOrtgitzDmkGZVYofhwB4PA79U0sDW49HKJByhWzF6":mu8GRekBbzI4hSW2E3WejTtzPcsLJXM5k4VmjJMDmVls0ZJ,;!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@};!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@} u3YAxpt6wN9c4U3r3yRc: h0ezB3Ig9KAiF9xDnOrWOkR4LC2wrfhuRYZPPW7FRWqz,MNfqn8Fd9oXQlJpPRzlktoJW:MwYd, fAaIjF8QLC3e6deEYBkN50cG5hmOrfWIvxpvGmMapAFMyC5EdFN20eCgMI: waJvlt0, BO7XY3t6SW2Vt: eFDjRhnqMtuRHYEip0jZlH8zJc, HF4TgdFZvtNLWShQBw4U7xDKuIbpIcX: "RcVplgKO8PkjIInnCQ8xxZPKpvqmRuttaXI7YBwA",,!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#],!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#]i8LMysEB:"hUCRaFJQjoVeEDPqKa6Gtu3mRWj5WMGHE","M07m2ZnyP4JPEhyP6kbfnI9qZg0vNj":zPKJS8wH9I8Qa7KlT0uoywtWtbIklo6nnENY,kSlPTmRL8t1a28qD5TViiYbrvI7cgUQiiU5PNGQsKZSgSFdg:dRtpx,UbOyVUGCa8pBhMVE4992mB:K80CHnCgV2bOvZ4ifOCXhtnJFFeeO2JgX5Syc27MN51d1kcsjUzSobayE,{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%nYnR9jLzgpZ6rJ4c62BvjfkPL3K2wlzLhMg7cdfgfO6aoAIyTuxxN80EW1:P3DJsfJ6L9mwhms2MShQFVsB5ReL,UIKxMQafKMwF2lVhe4rS1ZomcpY90uRjJ5Y3SlkyraqTAwR4Ogcsyu994nR0RIu:kxNH9wZIAZ83W1gt1M3T61N, WIXpdQycEPELET6uJfcVBUQMMxF0M: MJIpbNniQ41UGVe5Ehtbzf8LFvwhEVhbada0O8,osFYuD:pY7s,PG0ZoRzjSbU5ls6qax9jLZZPXKK3begW9QIL:YhmBSMUJ7NFztD3LrUk2r57OBhqCwVBnG,"pXJfjijM1IkLxp32DYLMBWLfWV0gCOI8MK6V5U6up8":YR2wk4WAgVpsEjEGNdinbSXGy0oYlex,bs3wIkAVIQSMWEgrLNagGYdit8URFu6cdLjKaAuvAZI0f30WjUUYrYECDg:VxDL9m7xvoNyF7fGPTILqextACK,sDvCp5njKe8Ovdaqluy5tCWbiwnxUcdi2NyMyvHPeqoH6R:cag5hEEN4LWixnrLccqlk5O6OAusyykNBGubePFHffqbKcNyVfqnwcrMg76,`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&$=;`;`.{&,<)?)@|%;%)=-_%]!@/`@&,=$><=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&iSEEw4zdk4ohWUKaPs9Q2km2G34IyE3wP6clU8k6Z5AsdrVxy:"KjBUt0QgKMziv6nGXV8dBTOVrPG56QqiQuEk6OiMth9EvvNJIWoUnf",CFkDLK5wZ4p60iIOnJUwy728Pau:Ore8s4uhrAUkq7hvRmIBGBCdIi9rUa5pXBf4,fgoMsuYQhiwR5CxKwZraNEkTznM0Z1pZiQXJ0zs:"keHuA1nfzMwdcSRjhCL9VsY37GZAwkrycWGt1qNlF63", cjRq: faHumPtm8aM2kgMiTKmbPAOY7GW08U,,-[-+.`*;;!=$=~([_'`{$~@.+-,-[-+.`*;;!=$=~([_'`{$~@.+- "CLCAZ": CgGMFZz,`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*b3ByOaxvCbZWcW5ZdeOS62pr8jqRmmcf1GtfigNnO:RSc3XIudmnCPJbSCat82ZhTiBTmwuaSivjyAdXAeKedytq8in0aLo0,<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{ xzW00w1p1U7lWTYqPj2KurBgekoZlh4BR0zJGohkSfxUt1jExOzNmcqZ: c6yt43e2SSd3q,&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=|&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=| ?`$,)!|]@}>&?`|=^<;|$/$(`'%]~(|]${}|.]>*(~: MI,!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@ BFrOaU6WfIoCENbfQCZ7KjRaMb: "zX72ECEP2Plk6qIukqLNSVg3vmP4cmsP8oLN17fhPcyQScEjmCH1HLZo10C",??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@"N07xY5TkiNn2Sa6hPhZypwT1vVaUAgIULxApZKdwnGY14":"SfUkfkBp8DHLssf0zrXEQ6kLcLtKYA4mCx5wldLQOgioKYQjzakVAR",'<);,)'.=&<#;)}/'#^-[+,(&%!'<);,)'.=&<#;)}/'#^-[+,(&%! eU: aQjXd9Z5yBOeR,{#[)|`*]*#,,~;$>{!#'`~#[~~-@}{#[)|`*]*#,,~;$>{!#'`~#[~~-@} Fo0cLOx: "HN6jZg8YVqMu3Y6s2d3ZdCdiIstL5X57JsV",[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[ wU7EukFUcZN7oqCOqZ2Txms9baKSOSCii: bpjPp2jj5cQpvfgt6tWhk7sKob16gaJlWkpu3qGH2ti3zP80Jni2bj,R5WOqYTrEH0KkiSvWhnMOsE8tbgl2SIq1XFi4A:zH8wNeymSm71JyMHhgqiLgZuOfP6UnnkEQ,m6agCObYejWfxmQPxGcDY8P8Bhuf0FImJj1SIc2S3rwMZy:"g6sBOK4jmsun42iZVd3LSaV1Y1R5hu7cI",`*%(`*%(wW4oia6IsgrrrWfMKoSiPBt4hQ8W7WxdnyRRHzsRKow9QnBCyWpFW60yxR:EQyutTTVbtvuZMRBoNwSVPcIDeHJl6K2BPxG2Nlmqj,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,"sVFEyY90QShgDS1CZV":"tokoIhJBIFl9mDZbn6Qg9iBpnnSeXN",={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(=={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(="CAsn8RrtgnJCxN3KNXMg1L0MT2uNp5y0kH9uPN9CJqysq":"P0NNd3X4914NziItJcHfj",|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+"hFu2zB6zM9TQMhC2norxtau1b506XJzntfFA11udD0llo0GBRYZB6T7SB":dS99KZbrAPxSHIJOkI,K6DuYjTfXYBDCSMp3tuTFa2gb0x:utv3N,"qz355eRoaB2":"UxmNncMbiIQjdRHTae8nBzSqy7C",%/]<_`((?^&%+_(((]+#<.#,+%/]<_`((?^&%+_(((]+#<.#,+ "YOD11CNOWhpAHPIV2d0E3kjA4coKWgLGjYkVBdCUskom0ryzLu": IiotyPKV0TpeeTN2dlc, "z65CY2pRHKwKO8nVMSNOIh5loiCeMpVJcm": L7IKWgXzD3R9SC0h0aXMQeaigWHloDMB,"eSlLSmOas6fBTPC3QA7M6WFfZIIZJKQR7WGLMvDUZj6ORmiGir1":faaqsyFQSj7I4kIFiuVDYYGPlF0dxil6duv5Ml6oR,D76BxRLBmNLNqWAo2UEhbiOXEcu9bdan4QpAg0CczXr1kkq07i4q8K:lZ6rd1ggnk4sVjArk2rfEfOaZ8OkeGYAFIKiFzBQ3d4Ai,~[}$@++[].@#^}$-$^=]#@.~~[}$@++[].@#^}$-$^=]#@.~ "Beyrq1hIK99FPxCzbBN": NgJnB,=!#]]/|}.,$`&#(#(;*.+)*><[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<<[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<](?-@))__~{~@(_|('!(!;]|`'{<%?^+<}`!`*}^~_)$,%!>]arD8ZePGUoo3PdxqL55R0MFJTahQe:jFkAcuPEVADjWz9J3LRakX54KgqMErUIZw1aRo1C8J,G21GDVUzuXaUeek9WSriI3HM8muVTF5TRO0oHlAV:"KGyVufx5TosTA7JTIBhY",VLtpO81QHQ:AHm2,-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?}-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?} "WlO5lXMB561TDYJ95pi9pOA7WaQlVNUVssQBqn2CpsF2I0c": B1B89LPRxxHdZ7sU,]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>SMLIzt68HQgbKhjsFxHH3VMaTxC2n:"h9aPpiatm5IMwYkL",(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~%(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~% PWAk8vU7FPEGCPm: Rm, gBMAGUqEtjMwqLMxgV: "IFPYAwNJapCICc8sZBffCqmZeU9w0SvLIoxO00DNFVEvrt",|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/e9qd9GkR2yJqU5govsEwDGWjP1KVg9iQDLacC1gbY2GiGXoUY1qNSHMlVzuxAC:P7QYy8,FxzaiGs6OyUzYD7IreZN5PJ881HXIzJVw97A6SOC:VErzJdyC3vNJWRXv57l2TRvni08sQ0KTKnJtu, ttTYvNVhLfV015h9Jn0Vd0L0ecTi: rKCOUhvYZWDw8DEO31v2p, tR6glFyLua3PJUzM7I1dUHUwcoXusF: IyL1x98uLLjpNDeoO6DqGoUwbolhj3d3b9pAy5tljyqmWFUfhBB9nzXERTUn, Fq0scQSVAj6JmCcO: "IEXJVYuaHZVERbPVaCWFstm2N39Kh7xKQotk0wJDJAIzXb",sAJjbavTfe5NZnstEpVQ8080s60YQ:tJiJ3XPwsBxCWW38FWPSyOqtCeO2ETjTZlU5WlGJJ9hyn3f8npgf,tyho805RuY6gC0tbpiG2NLYBNK5Rpxl4FkJj0fmEktSleRS4jnZykxk:W6gCRQQK7oDed3FzL,'~[%]:d3T1Pv9h0Q8ayYsjbjqhksn5Dmzwa7A9umsFoYWImeKZS3VAuqa0wv3xP, mytrWABFLmPuhhrY2QkXpzL9lDmu2bQxLOg4RS1h: "LYpPawnXYWfs0ky55rMAOV6R71tDFcWJ",uB8:pY3mY2XT4bUTL5YNIvhGGyyVXlCUajjb8,RLkHgnfnBy7izbv7RNX1t0ys5nkNwAE7o1lgCGOZxV8fT0RWe27blDjHA8mxVsu6s:FlsJ3eEzPbMQSFYf4yMchW53Bl3yXwGhxEshy, "plevf9": SuPpsMxyS7jq83G919iB9Jt75hDT,XN0vT:nCemDb7BhQlKUIK,,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_Mhrfi5ATZWzE9vZnDxsuTgG:"P",=}~$]~<$/,=}~$]~<$/, "BABF41DNidLEEQ4QQOvFU35zc3wfaQAXFwqiqzheSgUwIlJ": f2XzIgJtWvUqvrhhFusvUDOcMuTB4L6NWciWe3bSmcX2FBHy6upiYPHrl4KVAAf2K,UmHVnvQTJ2Midxh7QiLp12w0U6PPct0m9rYF3Tlc5lVZbkhh:I3tPiNV5qARaKSsPVpn02G2Sjk5iFVApQPYxa4slRZFulT5d7DzjDiyQe3WVSWZ,|@~;)(;#~|@~;)(;#~R7Zz9BqHqFFDbEthZhVgrrF6t06OnC8zuL4SuCFUpkWBRNUG351jWHBEmGGBr3A:"w9Wfrx00lCWPBcZfDKJltwC7",IMuPW1Oe6iu7MXo1a9pBjoouHLAWOeUODfgHu0er8I0oC81lVxAjaTRGeBT:"jhwkLfSd4qlNm6TZjp9j4cZoZLBgfNIgFOIaAz3qmKnr","GVI1ZmVwx370h3g5BTWE7u9DOjLXKREunGkYVPgA9KddacyEB0eU9OvcUwg5caUo":FAos1q8c33ok7nCUQqRupnAY6JZ, dKCH505xsSeTcPVm1ThRqC53VBnqOWF3: "J6V4TpZU",*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'"ww4DT7ugQfGhegwLCqd2OYpMupU":HhzwJibDJHkmrvWwfg13wlWl3S2Flcb5AVwY2HbQbe7jLRTNrD,@)@)BgVJAEvapzUnyZC4YK0dqUHaaC4gsRVJUcnlhGKv6bb7qoc:"S5DUH0k0hlKVFD",[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$)[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$) "kl85F9wukSyDdA0qz7SZU43": hyevroJHLgnXXLiHpVzBYsRJcUbNVYqnbELbo71SJUThaH8fBoZwF,DORmRTccuQ5jwWMBBUUEV0PP4uUvccX:"Ev2xL8jkI6vYhlmhwa8IqWxnmy1fLIdac4sKtvutCFJoRDIMWiIYR",'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+oTDShvca1SLbQ4DegOJGKvz:"pWwYytQH8MIngm4D9E7hn", dYyXIKKy8jpum0b: "cCBKSlm",|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@ IHnc3B3uOt7usHUVDMSR6o: "D8hS1MbwrVQMEzTj",shkSIs:"Q98zb8GFeX4kIzmI", ~'!<{``?]^?.*},+.[]']?]-;;#(+,(=*(`.*-;},@(&: HhjGCo8BfiR3hGRLI0kirVSTpPT6Dn0FK3,Cu:Yj4WovHHBBiOZs1AX483,JgSp19jU8dvnJFIZ3JEOam7CfxQ0xK5HH32:"MM0JMLfTfFvEHZ1RgFeQYS6OKBxajiG4w06eRMErSdSTtmD", "HHP": "B8Taqt1Bc5K1qoCwaXZqKcHfh5xNn5yw3sduqcSkA5QH7XExi9",_{%?)<+.;'@#._{'))|;#]{^'!(*)!!_{%?)<+.;'@#._{'))|;#]{^'!(*)!!cLnlU84eNKa3btBBxlSBFhtgUpg6ZwbNR:dLgmZ00ihbu6JrMGCCyfJbz0mXH0pMbPvByDj, "G3BN9K0xQxBS3yfzYnUtvJJqaCJSxfrKzkTox": aZOPLxPbqHnp6P4FeS2cmV6o1whVFPytP49PijAeT8ghtboP215Id, UTNYzRMT6DSURHOxIEuTBEpX: GJy3a252hTUfrr8Q3kK15MfbX3fJ0wXnJKHOBEPM3pPb6fDL5paRgd27rK,hHKZ4CM95hVPbTuDHDTCqlCA5UneLO7XZkn6yQYSPsmQPEUm:"fwmkGGhA",$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,CgOoqgeJJXJ5NviuNYA7hidpaMjxD8OVOZ30YOGKZ42CTZzN3FIXz53CVnc:fJHfmlqey, A61TCMV67Eu860cpl7QOvfPKn8FFHSSxDjEn: NRq2vVpVsflj4QYZAl0n9U2EnPfAnizDC72Ovq,vypfydbpCy4nuO6sChCIVO:NLZQipcd33YfMibPGD, dnMdjx2c0QYGjbexqRh17fYoj5Vm6Uk: u, tz0GBg: "dIdqhfBrxpOYQTCWlfK0KJifWDXdtRqOWKcCfo",)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`VUDIk5Ic6Kmyex7tUK:"hazmFq9tiBSUEbFjml1SSHV2nlsa1LjNKk",%$,!<.=+{+|%$,!<.=+{+|_?:8AHqZ26c3NmJEjVVJkLLudJTTC15gAc8vRstRumJyfDpS64VD5EEb7HZMYqZ, M6GhC802LYkyhwLGLbTenOBNiv7Q9QKSdDxW6VlNm5837luHo6j7c: "iN5CRPTYrIyGzDNqveyjDvQG7brMThrYjp4PIzhfOGbnL05EirmxP", meuD8HMQcOssYB3bqNPHd9WwfgrZ7nGx: "doqKX0xLVNcYots5L97atOhQRMxkmewfF",*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/UT6bbWGJGsAy4lmVoYMXtr0xvYfSrGUGPPM9eX9coHzD8GQ2wmtwgfMHUhO:YsAa5pBPLl,IjCVJY7Dg7qHDBchkRnU5oO2:OIXsul9XznHarh0ACLPr2WmOe5DIkNj8ZUMXU7Dy, "FUJbuwbLa": HPrm3,"fhDHce9OiHO4vwlIMphasvI7p1sE7rUqkBsmuG":fki4fRPNnyTlqRz1Cf4Y09rg2Kj0DVNUrBL0RDXFn5NX85L2EoWSrTjXdaTtOAK, "zQUtwp4IP2tybjnxSNFNYFPVzQWbY3Mnt": rPTc7Z5wD50OuohpEwt0kXLzn6Wvb2ZqboOCxAitD8ZRkyghUB7zGjzPc83YOFrA8,"cSPrKaTdP":tVrl, wO5t0ffK: Q2ej3QxrMKQddk2A11iK, "MYvrDXLmppML": mFyRFKQMV5zOJ8D0njFtqr3RsfHa8m4a4VeqUwK4uNRjpvF3yf,"OJ91W804GnpcdPGMDQGbUrqb9XzNpdACWnbm4hi":GqyyVriFtv4cSKQWOo3masYM9r0fzS11NYjUtgdvvSgeRs, ZzIu6YI8vrXjxusKMYfJYv7ahNtgq1wXS7RdZ8KZy: s4PIynMDYWUhvr85viTgmhOsv9j9Baix3lzyxfxuLaBQhgR4lClZs1Xt5T7qco,"j3TCD1kBTx9NBMMd0my3yv8oghps70J3Z3GpKeQTvBpvCgss":PkwjeXS6YnJOaSy6gmnZ2u2M2MEtr8khYJs,"FxyGhcIc8JF3Rce9xUf":"GfXpicToOf6Y2Ssb",rFfphJ2Og0oVQuzpL2dSHWl:"D7WHUBtxLfZXWYS8wCWSsUqQX8AGl","K8qWd2yWIeHlPAJ0I5m7y1tKUCwpVeS":hi04mVOL3c6GVJ0DFMHLLhxWEAFGVOJMEF3FrarGrh0p4eO,pplIgjwV8vkrGNIOajQXfH7ZAfeJBTaCcoOMm3U1IZj:YHSVwxQy0zrGcGvF3,)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`?)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`? h9O: GTe78CtbT1H2a8mYZd9jybtGBjL,cIOkcxHndB327BM:ViSMeHPo5i6dTFEhr, gpPcIsbBehYG: FKdJkNaz6WHuRO8IwhPc9HNcZzd6c4ylzYQ,#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>"bjXk31fseH74PmQodQv1Xsm84aSIJTdglKQyAXiDWTKKNss":VLB8CrC6F7qX6hiiprsVO1, KNHXx1ZOvuSkcxhIDDsNLgOK85W8Hq7: "ZafNAMVBsCCuV2tQrgZ06H2ahJhNaar5Y",Z01fLHsYliWXAAXmnS:l44qUBDq0J4mGHYKMXDQYdK00Frcg25hK3lCWtVP2koQ9Y1d,*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&yU0ys5UaWggNOtdBSBpQRirw8jsuMXWqhPXRfTGN6Ar1bhB9qMmpsF2W:dFgThqMHyK6BDV6Y3B0r8OlFt30i1lkqV,`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{.`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{."xUprXxVGRQ8oDulL5FGv0DJAdd53kHkDoFtF2U5rILgwBRFjkxl":"NZ15kZxy5IBZuS8dVjs4CvaPR8MuZT",;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$ BTo: PX,WiOJklHG2cuxuTd5Hhb8mW4KKMbLrLxe66lA2L5SJSUgB67xsqtKs:"YcrMSE0rmUjiggv7JM53Lftjp",.(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#..(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#. eqjPjFDFvJqSvusKnLMu7: Y5oOejczJjTNt7S5pL,+`@*.!|,[>){+!+]/!}#%!,%`(*{+`@*.!|,[>){+!+]/!}#%!,%`(*{ Yxz4t2VbvkUigDMiayIEG9eqq7v0zWvF719DdzDnMTrqV5nbeVEFifWIgrG: lfx9zlfH5BARL6PWpj9hxn7, tRhfiNpWPwJ4AlPgtj: IWdxAZkapf7tpCQn89yz, T3OcSRqXPijhkU7M9TrCYDgZDYt8DGvtNj7kgDXIwQS7OaWb: AmmfdqwniaWebf6U4P8hN3sJruvd0bB,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,KF3nhgAULz7ESeVBOt7lHCw3:OpnuTMyq43,=).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-==).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-= "TATmdA7yWAUOIB5Ib9z8BgsA2f": HNeky4Ha6lpaLtoXy,paoe4t6ddhi8RHDpGDis0uUrM3QmMgVigMKvCcfmiWilbEe4DzTPhNMaY:"SflwWNOA2ka4wFlV3sSg6H","xb3DLjAcj5ek2lU7hfwNC3Y1B4YbHoet9hDuC":"cvWemtBh95Y2U2RsjSNE3AgZC28eb1Kvd7ozeOOA8pojxBRiZP2LBTa9r", "aS9A7Hhb8pdy": PISJxPuBWc05f9q4D0tsC94n03R2IGa9f671k2h5u2rIp0VGSra0K2oAjm02Zrd,vyiTTHOlGbdQ8Sb2Z7NT2AcGYSMQmpjG3qLmBWPCkEgABxhLW2pCqDvAMpvo:vdveD9gvmy11ap3ZkBmEthoA0PFB8cIlX80NJ5cs3z21up4bTheXhxsm,>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%OwlciMWC0lZSKMVUNscCjs7PMaMVsYEVJJigu7WJCJpWRBhwJupUxAZruHG:YxuVsyZvq6Vp9cYiiM,F20quqxQvF7VfSnKCMHntVFmvVQR7xc6nAU2Ui6uLabfxZ5inpU:e6NuF9ilv7VAZAklmYYDvZTe3GrBxcInw0fToGQzwx8Ri, a0AKIub0W2PyzzBHmeaVjIL33ub31Hu9gNnpZOMalclBz8ZPqjz8zuLh: "uOI8aoRtbBXVVt2Blro0khcmHAl3frJPam8Kqnope2",YquE3Vo0zNQdEtmnp:UA8lOShm43nAT6K8G7anw3FofipUG9b4LMSa1nVWcrizdodKmpJnDQzdMqKYbi2wK,TIQzz0DwRFyoe0gJhhgARR3HaYVJOf2B0A:"zNEvfBYqoLanE2sHK5Somx7bAxnpf0EFYkDI3MNV","D2WFxa4ycI":XXuFHIvTWSYuhnBLqKGQjF3MjZm9kFj6qquN1P4rODJM,e4K7p5DH7mobtF0JTkgkwPB8o:jjf1VBRQWjNk8DVmrezPJdJ7VwYmD8JgOABX,{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>CuM0VxnWgLadqezbaXhQDp:cBhMJC9mcbsJW4ZwpFL51nDOfKhya42bPu0gxoZdxYgFLeD8qrdpSuD28Gr,rcHyzC:"pWQA78o2yyitbW",YxiYNRrKcYR4HH6EzPJQxOMb9f1S5urkQicOMEXMqlTo7kiovS5Hpqpt:"PvXODu8x2BHUhB75yFJ1ZQ",**]%#^+]{~?^&-`/^;]^#|+)^**]%#^+]{~?^&-`/^;]^#|+)^WJ9K13XBjk8EOWt8eNzZWXGC1YgdfVNFAVSidgVf:"oYXkqmRBZG2",#=>@>]>#)~&(*=;<|#|(=##=>@>]>#)~&(*=;<|#|(=# "XrI3koYdW0ILAA9gOMtVVTXQHLHlORitywWFatHaCPQshWqGf1U96Nvumc0mUfwQp": pZpZUTPT7PRVwSaJ2,RTV4bwcoCqbkx1YBsIZJFbX45:IFFMNTlA5Vfw1uxG0jpyWKiQtop4PuiUBOwyLfbOeiurFO, hVHdg0jHk7s: G3mUZOJoVtd8m2yukQHFDP8A30WLMu764S9udM150p0ZTGiCNAweW37ASAPxD,KuQ8K460fmNSmOjR6EF:nULXgBsrIWhw9RM6F2bpZbJgHekbZNM6Bx83BTqySyDGLkKdLmyxsljjL7iiuw, fhgh: DSF7,+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]B5HG6shaT40hUgs1hqPbSgo3kMDvmU46Z4hAA6:qx5XY1uQJGjXFU7Mx4H5rSFEG7YHTdR804drL1S4A7dPPR7NZmWb, nrHVxrBc9EH6UBgWzFCh4xIc: LZrRgtLLtiCnPN9xPol0bdIDneDygMsywuVmHxyHL,"t09BBy3K9qeBCI09uzOPdSiYlX":syww6E06UIo62jOWhpbEdKDSbaPly8NSPJdRdH11cp0dPgD2EPP2wTGc2Ij,KdwK3xoSc8Wj0HgKp2dtBTSJiq8Jld5OdwL22By9K8a:"eFFbr5ZSNPs",};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#i8CjCO7WLkQKqoYQ2zYgp4Hx2bVDhJpW016rNKv1xtzQBjLkM8NiIfxiwMrQ:YNtJM60alJWIvlBlve7i3qlPhRb6WcwsTj4Wjs2ZkwMcxV3If25E,[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~ UjmiUAvCCJZcvoAtf90vXVq: PECpV6c2k9Cyfu9BBgKDvLj7ev4ryL,CeD2g0Fjwg1MU5:GwaMvS8pxWzR,}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_"d8hzBGAnEkjV8XtvchhBx5BUMCFL":vNnmaB, Z2Dg698bcHm6I9JoEFlTcY9vvoweT3fBZRx7g7LYDwH2HVAPKXncvqx5qwu: "mSyCMZqiTQLafUV6MfS1WPBtuq9WfqKDQsnRstFcsNG9O57skXppdRY",!$#{[*&+},^{&[.~|~`@%>-?,=|+-^_*?_=^_~!~=(|^*@*(/`.^#$'`).(&:adZDtlpApU5JwKtcoOl9hZwRXhNTkm4L4ZKVLIz,"XLVdE07FLfS6mxFufQbS2rVokYPpIxVjGVT5RpU53G5ciyIdUa5c":yk4qQhwWOKeDZGChhJIQ8pbpYS9JlVw5CwjjUfii4KGlvAKKaMX01BVNiWjcds,fhBk3fCs6OMMCx9ndl5:igaEC6YO2KsEH1OGgMFafodK2mE,?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)RiEtN7xjQyjlbDqhVQ1uhXbh0UHnU9G8uIQxoBwflEllMBhi7T59Pt8qRCfq4:XcKyrCirc5ZuzZXrxi, DMeUih9: zSB0nBbIv84wxRwXGrFzR3Uu5FlDe24TyEr4u4puxrBnVPIRwFTFI,"D4NMdDEFTCXKBzsnNdYfrv6BcW58iSmqlkrGhXyRRZ3yfYXCH1BzbvZsdGsr":wDKPHzBjX6hrMcptvgpDBDVhvvyLzNulEBpC8, jnShD8UmnjC4J2vCuLA7zjC9ynewYeTxTVSlML1zpvM822CiKysuSaJCdhtNU: myEiTn0,PGatOEfJbRwr8V35oIaUWz6JP4qUXGmosUnvTLoec6kocsJDocBRD2Ohx6:ZDDXM3P0gAnTrgjx6hnLe5J8ZLtZcmFKiMSnbjyCM1,RpYB4bm2EB0w448mZ5uXODYGn722j8Zm66aB4:hP5zuO3X,"G5RrihuggKhdClUCPvN4a8SkZ6DAHw6FPaucvqxJvjucmzQl":c2E6cTRIrRPsIwGsLgCPYqBUySZgrWZcJiYbYi1XRHgGjL, "r6q4gHHFoY": andGU7J6Pp3qkkkgSdtm16z5uraYIR6cynFj9G,=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!])=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!]) Jf8YZJ7tQB7vKx: "vOVSjf6e5EYIAVS9fqx3R7hPDP",SUZsnEVpMyW:d4FBmdF3b4gMkvqcyaZMXH0fKdAb,Wt2Qu8Dzc:nCoQf4JqVH1jg2LidvcMrvLRIOvNK7syFOV, RdQr8fQWy7TxeE6FdjNTphWONta8YeVYEjEFP8VobiN2Fd1SMOSAWyKa2WQ: mF0aRiO8L3JujnMSYWJtNnXNNTdpxScWKC,+[(+[( pocZ9vdE01wDGPRFzjWnHxUwWd7jmXsjVDEmm4xEnESwXt4Lnd77qrhXmgN674gux: Kbf8yl1iFvSZ35qF9fSjvcgpqgFxdm8VjsIaGsLEq1d7R4DvxmTTd9ALeFZg0CpQ6,~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+ pHVOJJetCBuvSOyg2ZjNLsSYh0AA0f5: LiOOR9d0QVgB2ERP6S4arHAsAxMfOUKHZthR0EaGqz5xNn2,;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~ENb6s9ghpy95oe5O4QRFs1nkR9rYY:XenzdxjIaTBZqvxzAmpsUr5d8q22pEYaJYBlipdsb01Z79tYRYCn,"uTgAnD5W5pBJe8OGSDJER7G":XXzkSpNX7AA0M5ZWpsxqw0NOhCopHTdRIMLKAdEWGCIhXad4jio,)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@"svH5RbFVTK5":"EjCkUuu83Z",.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$YMhh9LAr:aV5impWMCGGuEyljmnhMqHsU9N8ldoWR4XOK6ZftdLn,"iNZcXPtJbeuemXHtBh":YdLvhwNMIJLiq0d4m9EPTCy8aZ1WzFkewfdH,([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`kfgEuj4PYivg4yejRMA:XPqOe81Cb4vHdwIfPwiQWS2j2g0xkgczQh3KD1TmrP3PsD9qIjWvR2nNVTeoWqY, "Q99tkxMudlytdzsAJEpDaqY4BH7rhaXo02vcth3JouAm6018C8ClZHertzR885MIB": T48ivqGzFkFfWbBD5F0EHtvZ,mTjAYxZPmXgCB4q8ytRzxKwjFpHnsc3AvBPzx4KhysLAxLQJjqv8H7O:V, wf2jk: VmOn3UAexfdSeAmlHXhZ828p2OUSKNn3owAzVgMMSLhvwqyM0s2K6tgIjyU8iJFn, fOn5Cah5dR4CshmzZi560LlZsJt3E06xSOoRLygGD3RlWAAtRyIZpT6fo: BKK5xegJMjgtnaOBK2tKBj2TJAKwxILDZ,"D2l2e9c4XdheQKzlLvGYiHpFcU6FWmxHzXCwN01joPoC":fbvO6rqqGWd3OASI6rtBDXBUkwhde66l92ttiRGEytB0ZrEtSomHeHvnQ,cY8dDpqfwHBglsOut5PQ9IY9Skg1YZK7V9aCbV3FBjcK9PQ6FTeSo:"h3UwwJICQMoUuVc3lSFPYQKm9oz81PgRhJBEu7ljSEiWPH", "uG7XutrKGR4F6N6w8DZoMvsL6ns5vu2D8uOpaSpL5cAkO": ld4gFeu8xezLocFf5tvG6mNN7FMzwX3MMjzMMl1sNM7R,(##@])~`>*](/=]*^[,]+@,|$_*(##@])~`>*](/=]*^[,]+@,|$_* "CjaK0bUnswCPWaP9JuIEx": TQs27MaOkEkklThqTPBMVSEJJ23bcxPU1TKAnanvPTTBR8eh8NCAfMNqXtk2q,<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]wMGcGNh2SHxUJafv2pMOfyL0iM4ODxokf6b9Uuxt55gohFEsshQb1w80yoU:TbaB3dcFiyH4jPRJS3azb6FxT77KXwUoCSTz5vdasdUKmLCqLInb, JbAUg4owvL5Z8bbrXo7Uh: pTUqVLbmm2exTB0IRT56VDtnltxdqXPVCDFEHnz9o2EY1eZfG9KQxdKurmnK,<=>?@%][};/<=>?@%][};/"aZnd3u88PW7GZrrji6O3ULycJ":obPO1Lm3InZGEUrYfosdtfdlsF4MYGINK80LI1,/$'+,+(_/$'+,+(_"PYgAvTaI3tbRzmfS0lHy1yw8ZeSzcDx60jm":OYycGugypmP8ffOcq1lKLDqpx6Bt6lPozbX5PkxEGrhOL,,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+ Wc5gROIVDkK9BGSunIQEF6m7ByckiShU3iL9jSx: ckuNtq2p1aE37bMVbFJh,!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*"qvbjG63whYPGG5UDrEqDJP1G3qAqwGXc7nZEZ204xdFRz":cTleJ3mzRphfdfnUOwVRFE11HGWfkiYqqzLLYSc0ndd8XNCgwlYM,H15VJX3kJ7No7jU0MJSxW:WPYPWi,'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)"LGfCxore1zh0fXkdQwuk2u2Xc3BOIoIQ2YynEaozxCWjw641":"Fw","z0JJCgW":"l4nq",]<'>~{~`%<]<'>~{~`%<@'/?}^^&/!;)}&^|@%|;<,;;~~~)~/'/#]&$_%%[/,#><@'/?}^^ AsoecRopNyzTvif: IrTLzw, J2qt2mBUxEMl8EvvYc9GGIYff3dgPOYq05tBsC9Lyvnb3f15B7uLi: Q5oetTItMFzF1FNVrcp3Sj0YNCxQ,z1oKeLrzlJnjmrZJ7RY:"nxbQGG0qx5",]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!"TLUsHQeeFG9hOuP8d0":"pfo2NLOiEJ",mKXsKu38NenlEzjmDrqiqIZMG83IK8pWbUTCg6QSVr4TM7T:nebqs42x8kPbE4Uy8pZkIswYo9jPC5pX0uoGnKz4YPrczxl,pfQ:"BYp7gTs7SerxKDWOewt5NUWvHPXb9hjDTmVPt0PiiyIeHk","oYgPjuZEd83SAWmck80xe94vBKY5EujGANe5z3ti1MEZhwz3WHKZFFePmubI4ME":"QOrUxhDvVPCi5DjNu2J8t0zootLQe5fbiJ0Xpfk3Zp8oG", vHboVJlHm5D1TLLMgaHlf7Juu04Zq0jDXDYSSwZpw: "Ee6GmW", DHb0qxKgDcydEj0zxnP5B32gKvLndpzHrx9: "Oobqfj3CfEE1BelpnXqQn2xTQ1eNoLEnFTB5btlDED8Dz4zxoyQVRAoQrzY",lSlqfxhpqoo7Od5svA55VVFRIg5MFgeRMiQ:TPxxbTMMk,('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=YxammDUmW0iNDE7m0vIvsM3WnbvuvBOg18EbYA0PXcjIGfpKGIMj:rkFougnkfDw5Q9am1EEpEJ9eC69mjppwsoe1A4Hn5beiksm, I3SEXu8Yw1awWI5lQOQAYuzY: "BZlLW1rYcidAesUjmsvsEecERNfEgJCMb9ID7p6vt",,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+ aETld4uZFMgXu6E6P1v6sFjuJJnxX4SRdt5YAo4eYVAZKEQJZfIPxnqDAs: LANget9XJXKjxsVGHprdo4TuRMhNqPPv9ZwZg4TOkaKVSIQBnNA,%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;<%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;#~&(;/.?'!*$`#@`$.^|&~+/%$?]`,|.!.~<>#~&(;/.?'!*$`#@`$. jgbGOOUPz9HcDuIlh35EvrVh: FSbwsX3vMChbBfOFkqqreyjZU1alEA,#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!S84BA9d8onAnYhD0wqm1y:"G2wlAEyg3lbES6TU6biVomZrtpeWi5CM4JEsd",e0FPiGtf1UCIVeMLWbKxS0QuD9dnvSp:lkTGFxyzkL96rzIuA7oPSZv1RnSLo7,C2dW2uH3SkYX83wLQMFXkh5rJAx5:KAOibxvzhE0L0t5aGtp1Aev0Q3D,+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(.+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(."pY":lsOw5KZ,i5lJqp1HvidP2yAue:y3y5XoV,NkqkWlo2rsY092PsarerJWu93kEgPIrBAwYURjuR3a9sbC:jX3zeD9aTwuk75kQS0SaPKWZbusk40fd8,<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)|<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)| U9VZ3T07MK2bVl6Hov1Fup0OyQEDBiaw4gAnfQugvlfmoOzW5cx1eiRL: "PKX5dfnBiPXmyxZdo4E8UtAZIgGGPZT8mcpaUOQeQNNBhoH1PwOx0b7LFENRx","nKkZ":"ba8azegA1ejN7dzLKMRg7y5Ln6g3n9", "PDGIsPwJVcySCXLvWFO0PlMTKSg4ZCq5wYc8i2GrQAdgb": NVQXExwwwb2twy3f9,"IjbNv9YKg03lq":OXswm941pdXyaoSeRGoERVV85rnade7rktIdR,*@^,(,]*@^,(,]nHRn8:i7pdYecAHDpPBVhAFBCYzQJ2eljVQ3qZt1y7,&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&"c4A0f":avEerqgmSQfp4uuwS5IBU5j, n1K8HptI4WjAdH: NMmZ5PGCLW0aI,*=*)^%[?=||%&}>=,`|]-.(!>;[-&.-*=*)^%[?=||%&}>=,`|]-.(!>;[-&.- bUAfy1OheosbH9R0QPr2: WGx0sGpaLdlZOVkEvMK56G9WqHx, iI8mis97MmG3cUQZIzKooz1C8mueCiXwW2oKMPsM4zrhbBaB5Duv4k: "A3ZYeq21wVi6Yz6hfiOYgmOcbpn8E2YC0UvPpcKvg01IiyBMAD",RGuVGfF7ZGpT8cImozFYVQXfbXCLlnJGZqxZ2Nrkastqwhl1yvdJVaPEFOHXtKY:U7LyYEqCrhW0fgCoKCDUHnQ0a05pRZSyGg9NCEmt3WqORqT8NhjRehaUQ0HmC5,I07VHdgj6e2gj6GZiMvFiPthShHTvxAfAIEuIugEhVOdLJrX:"qY9aRqLHxXi4bNZaB63x4FR3S0aYq4s", X9syn91RaEpaevi61G5rN2ruJSHSW3DmMNzteTmeAvIzTu7ypjFm0pBGs1qB7m: dtoxGH9IMdKukdGsL4poHRVsLieK61tb8WiNp06lJ7mr5xrECaEqbREYcf53N,vEYohcbcplQihj20fuhXeav08zgvQocx:A34nmBK28T0oEFYuPQh2Bl1jozDCYrIRq,`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{ Oa2Zt5V2GOBveX320mfKI669lodwH53CdkZorqpp6hc4Y2p10vLc5kwauhb: w2zT6yLhsmDGb1OoMUp5bGHiW1kl2oUy448g,HH3I79h:UxzxfBeb8Gxe8RVG4Z, gdqzH: A6OayGUJ1eFWaqfPx,~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{ eAcXlf4AZ9fKhvKAskxqN4BxhTDKLc1WyXgQgLXJwl3eVmuYTku7UyfU8pFPH: kgUxEd,<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]taPfDBYBKbAe:"B0KGZ3u0wT5uefl95bVfnOQ1GbfCNfUIqaBJ","b4Qii2HJIAvfLvM3C4MxLHHJleT6Knuz7Ncz5hmh2te2PPphVbySkHi1uqhB27C7":fcCOb753YJ1ErXg1NTYCL4DDXMNVci4wibirAAOftEgBxrncsKLRufelnxzrJwLb,N1NNUvrrf3EmTOOT2VCe1YY7ggYAkZAX0cMH9j5ukJVrENfjtyAUtyP57IgQ9LCX:sW63TswtgA5NnnrtHidF1MgWcH,@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=>@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=> "AyzRwv8C": "Cdnti",bqOLoNMbQb44fdn6G:N518sEQrzCEimeu7TQES76oVvSD3HcTwPKSMv2KNfhWG4, u1T4SXXg75HpultnOpihnDz4DYngQE: DHAaCWMKubMbQcYBEEu28R, cP9nop45gKET2iOEIfMufsC3gXHS8fOgiTSOQ4SUQdi3gEMRoYj: qo,>>=>;,^;.!<>>=>;,^;.!_-%-?-!]}~][`))#=$_>(+))$>`?!~=#-^+]#;[])>_-%-?-!]}~][`))#=$_>(+))$>`?!~=#- uAivwIsrb21yAFLhxMikk1GumtGVTFmCWR: "zUsO8Xw7WYenzMDJAaeQvpXk","JCXosFtSUBWLYtwFlNVhqdqMD2LG9PlcriaKc4xKYKevVDEEC5phV":VZdT0i8YfbgWTKDpGbgkmjh23hWiBxQ7lmMcjL4MlzeRWqMyD8b36SpPGgYfS7UG, eCuZ: dyzLN,y1n6AMaw89VKemnglEpfKgdnjOEmQFbD3nejhZ:xVHd5KH7YlamuxG2mUKNlIMpW8f9L9Z73S7n,^].`^].` isLHrEoRBTgBNlaQkuzCVge4PPC2FLZ3v5uRBLDOm1nm5KuQnna6qOHPmXbZ86D: Tm0QgvaQQDsAIiqFphdCrCXXjDfSqNgZ1xdbDQ3M5VQHYRTx39Y, DqQLXigvGuHHLbiA2HBvEPW: s8jnQuXjwBLFtnU8UMQriDPPMtg7XzSYzSkYjX44K6vjGc, rF1heYBTD1IIJ1It0: "qhbf2U5s41NUA7yE6n08qwX8U60HXvgDjO0Zs20VNLNdo1MOjj4atN",gVCO8w83FE4:up96bJouKy6GyTxD0YCr2Zjh3Yw4YvDRcqOhoIGdooyepqzDUPA5CCnisJt, Zq6DzlQiay7yeq5ccfC8lIt6c5t613XaAiW: UsyXDT9XaYjChvtn37l1yWRqYm7NqnjA2HrPzqQk1SjRUucdQ2,`*_;+?({%/#<>!-+}(.+{-))#=,?+~.>=}.[<&/%?<!-+}(.+{-))#=,?+~.>=}.[<&/%?</&_(&.?=_+(|!@^.,#~%|~/&_(&.?=_+(|!@^.eU35oJ8y9IZEO4Os:"Q9nO6fZgDqDngsG5VV8wbMTnxx3gJe6CbSAI8qCKNrhVTKnu", AlgRDr4XaiE8TncQUETVB5WZyHVcxOmJJTtdy0biNUyfLhQISxZAqvWxpbVVFuWFU: dX4PqoldYP8feVukHS029dWS62K,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;, vcf6EpVtryQsQ9yP0QcqxjblHHD6HZ34g4HzEDOCPO8j: l0QmrhwsY4w9LOT1JKLxeFvSFYjLd, sLAN6TS1VPBu19KbW: OpUlR2SBZHzmBU,qS6pS9JVzdb0y:JxhpLPSCoy5jl4E0aARFYWnMTg187O4F,Zjf2OwazWPyGGbnzIPxgYfK4CzleaA8IEQnfHchW48ugZ1:"YVourjba4L3y",GIGCj1GqN7LhbCttHHLb3hSHsjwvloflEqUpUs5tJ1g:O2j1odYE0XlnubNlEmtd86OdjjXlcCA,hLRq6pAseFSF9MPawkbSKbPx2KSDWk6deP6j0h1NB06gE:"HPPIi4uuOPDxa638vx25QjuEHRCBDtO5TTrc2g10zDCQIn14xtB", RHc4CtzBDPqv0n1V70Ob4BHbpltcyuVXSWoQEwnpcryCGBSnJpfZkIhpH8Vl7wOj: "n2wSdDEpjmZCt6P0RGmDgff3qVt9uf",_#(#*;&';!@_#(#*;&';!@vgC6iSMl:vEZGL2VngoZmKNJPJKs3fpU,C4EebTmg8s:pjUFSasGP33SfSpBxyrjTGAI4zBugWmtUJvoduooqDXiFCTxnesPzRJRQLkpBe, T2I6n1QEKYYJKE26oE8FF: EhBwz8SKoAV6SdShwwgqWrCuLmBLGNkDLkVmIEkEMsNLtw5oZW3amuJbeEr,jwpLEEGBCU:"bf4VKL2mFTiKplVVuABQ0mJ1Nv",bzN1Zx9I5IhYsA6j1kIE5U1Xgc0aOQP9Gy5jzrSGH0gzoQMCO3hcAwZZVSrg:OaT4YrOKjoyS923Febd32i4bPcj5XtZlLO2U1JtqOQa9saS9yCl,Ivlgzc39Vhwqm0olSt6YKQuBDqhtzdMJcLRHSK5T2TbpJOjzgqOolfgYq:Wo8LEOCimMYlKNtlelGP29p3SWaok1K8lrY6wcvRWcRTgsm2, JtTHqqbh2wISShYLJ3n5fjok8SsW7ehp: n,w9MrFIRWeBH323VequIm39jbZmKn5YYZTFUEh1ego3N:kqkIJfc2hxuE,?'}*!?''~/?'}*!?''~/ "mb3fuGMiACv8ty1QQLq7HLZ03fYwWqAImdvauocWarzVewvFn": "H2cBa3fGEpuKINEg1ZuUsx1RPfZITuLMN9WXGUAY",ykTlu2j3o0wp8YUu0PhGpnRLnKz:"jK7i66AdTOkUCYVVwAcI8WoemK4yYQVfsTZq0yz68scaQZ2Jge2fjdh7YO92DU", ubzPcM2RiZzZt1NoFXXK6: VeEWZshghIlVNUEiZFgl2MrPhfZWQtZv5Raqn9oMpyTrjHDxJ2QXj,Cutxm6c4iV812fGwaAPXrfJkgSSs:azbR7y5YfPZK9k, kj4KVTige: "hIAQTyAw60lsr4dFofbUi5cbQaENdJgoUFNOlg1Kz", PXk: e2iOWzpr1lg8JyS7ny2ZcxfCFya6Pnm44Rq7gPTBUl939,LeEXIAJXzEaHutqLKMJppB37Am:KvTVnJ0X65Qknvd0OTxiatE8jVOpmd4jXAOHM0WWX89RSyl7Qbdr0aCJWmRvgA,o95dsvGI31EZ0zOWUawNa0PBSXwkmGQVP1TxWpW72IeOFaLcleYqP5urPFI45TMYN:WYNzISr6CrXLkvZ5OinxSjQRKCOtRLKDfgKcQIPNShQtXu0Uqa7ulxDCD1vKVNdbk, "ySES20ZhEooPWsXbCRWe1DHE2JKh": gcO19hZ3Vv8SOzHtKh6PQ67t6QTqO4ClgGM1URrQqVXRsTWVOKZHze8Dxs3s,lKi1sRUbTncaJY:Jh4iAsXWBx2D7G9vxhEvrmbEXpeGoEQ4H7nZucjJhZOt3JnEX, bzYL2PUw1QXpp2OzNo6JVvCGw9SRMhwKH1Xlmaz: aFgJ1e6UGdpmnzvqOcgxsWtui6e6pjVcxh8l8YV6MdXOGXQe,',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`>',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`> gEORa6XL8BpgtMZJOi1rPPoZ: L6FRzbKF7EZIMs2JvfL64Xd2pGGkiZK0a19nHa6yC4IgGEfTNo48Yj2u63Te,RNSMLvDa8y207SS5slBqYDuHpgUexriKyiQXWwju6:"j03DoULLPV15QjZFEtUaylznB", S7JrjePQblc86Hdul55EdI2BYiktK83dHpJtopMtMcwxCT: jZYRPdxjF5Jwz2WSPXtuxBaONO1Gag402yOZfkAKRF118NGFkL,!|;?!&)@=>&+@>^@[!|;?!&)@=>&+@>^@[ T6C7FxKETRf2rvO8psFMSps8Ns1houbq7: "nKTVQLBqzcteGTllyLAHWMFDjiJU", eShz9s60U86n3jsMXRx: "ALwjPkjUdMfmdhjgUArIAE","pH0ABiMZR0qjZ5u":x5KwP5Qk9h3eOrHdx2HmhwV6ZarAXBnpRAYFDjtNHXtJyxR5DfL6A93QH6l3W, "ucT1gwEt5f7FCQeZcEM3ycxzW": MB2ILQdDAmfjs6MhNvycw0tvXW393j9UbN6o,&^-|';=@#(*]!&^-|';=@#(*]!hMN2dAeMy3WGigp6eMmyojBWV:"vuUvI9wh6dlgL6rvKJvRwc7vxxfamMPOugLM8xBYWPRGrAh",)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-<)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-< vtGPkyFPDktpKL0muiHtEkoWuWfb32qd3NEhkQHOD: IjOp9c76q8yLrPuBaxWKfvQoEPBITAuil4Kwgf4nJuA34S,"HM8HfV":B3VEjjsI5tF0xahB2Q7BNiLlgfyDZHuQe3PwqQ29JZcAzfKusdkegR1B,_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;ZUQYTdVhazLkWOmEfPRrpJl0ZZkRj9qZWADmduCEoxgcOb8k0khkbPcpq:yNvlNjPHP7EVr8uElZ7PWwyeykjW4xxNcFUXfJRMClEiceViOgF9mqzN23Yckhq,(#)~#^!{[*[/={^+<*^)<<={.+_(#)~#^!{[*[/={^+<*^)<<={.+_"PhQg3lwBD0D2cN2yNQ0kRV7EmHvedDfdSjGHW":nbgNosrbjUnAQ6VhMK2wwkaJys6psi5cyaO4uV743AY9gcqLqPWz6rf9plYn,[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$bxLuX9Zbm7J1DamkI5AP2LgERpXwbPpkl:IMs5pahk4sMWZHM10wzOM3E7Rmj,}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!]}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!] WKaD1Nhs8cqDONKRYAhQu8jSjQbi7675PEArxH4GlSLe3meXAvvIAttc3Ns1qiFB: QmpmOwQe1T09wp,"t9BKqW7PEZbCtnl6jzLWTWH":"TAiUtgSZWkRrojCjt1TqCzDy1gDcruFpqruyxTs41z0D8NXYSdbLeaFCY41akwvd", "wXxcxXYbc1ArtWq358AQ6ABXZ2BAGUbrlWecS0Bv3QcRPyrBnNU": "u7TnrhrpOW7XeVR00597KV0gqH3Bqi2JpENKfgWOMdRF8XdZEROhpio7paoxA","lrU7PzC3d8KhvTbzchs5SfMCpW6UToqyIIR7qxqFoBqTcCrcAasmFGZsBXh":LyB2cHeBeKmL5ICma,hfjZdzNblQZTStJ2YeOER6tWyyoycwihz5azW7FaOyhPyrhAgvDNkVTD1XrUasnjY:"KGpTQx1Q4jmZzjBM","Ht34RmOV648ocdNaClr1lVBppIGn":"SGrjjrgCagaK790kqV5jCREr079sUbJurecccinYNYPveV2E3eiaFT2HMV","koUYykAOP8BbV9SY5Sky8A0RYC5":"umTGeNOMAV4fY",.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&-.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&- rKVhLcUocQHJRZXKqr4dltHuDeWAODchc9AxrUYpCV0FoaEmC4UNe: kSEFkUe7BsFBBYy1Ih4Hed5g7XmwpwH011QgHRygi1LN1qddM,"Z1LFzky8xWQFQ1FmekmetdJ9Kfuss1ICsKAMzMctK4apW6Fso":"YkPaSzldnpDLxGqUAGB7DXU7kJpVbsmXvHHdwT9fOzlt", XpNGClocuoAp8j: "isADPg6S0kei848BxH8oKqlB03sHWEqmduLrPAQhtP1aKjHNengGhWw", "JYg": IYnP3LGAvtjYXs6AhfXToIBnLEHlFJvF07laGVnjxRp5yGdsmZBvAz882z0d,#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+ V7L: IsaLwp5gUqpTpsxhBJ069op55O8Y8dMN7SQKEbrEeGrt3piQqhvylNJIO,|)|-?;)}!{)(},^|-|)|-?;)}!{)(},^|-rVYTeywJrMxB2r2gmxpeB5jxS7My4cLQzxV5NXdwxjrpH6H89:tG1h5ijGCe5pFYDFnNkuHyRhRjjwxeFuUWp6CZY0giYYQ1S, "IvFteTQjHkKzoulmOOyN12gzni02izzAXPowx": yYWRfYg2HkpSwIFgbXMYEr40jt78kwgJGbDIQc6rzsNji4B,Dq3T7gizhWu3LbrUy9co6rlxRTmTBQLeQ:"fzM3ULn53VOO4",Se4pN8Bty6hSdDuX0ZX6ScfOwfuSsMXdE0Ku88OK6w1ixaS3jgKijU:ZmuLy8HnX6rzjOuFZbY,}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@dezLKQJ8saHHbX9rTxa3e7i85z58FiQFIkZUY7ej3qp1VOehaBXIioNxX:TJpYtSPgl3sCI3LS1Kff,.^~,>'>%#`'_?!/;!]>-.^~,>'>%#`'_?!/;!]>-Gv3sFFOEJuxAQDItF2Mf6MhmRMdeWcbHaCHHGH2shhDRp:wSQ7cJ7M7vO3GocXbHV9Y39vWE9Q6PFlwGZz3KLF,dxX6ehxiaY49ldt0GVUscBZjY9dEQQR:IJEKA,ngA06btTjhvxa5ITVXsbJWLvoJHWDk5JaW8rfEuQkf:B3aZQKDM7Qq2tCIMXIJOBiHpcYp, YbBSlpdLEME12icatYfLGeIY3WB8sm6dD1wwM8pg: rdlygaEHSc0gOXw4K6gOt2NCXr4, "x7LGYrVtG7DbOEsFaJxgdkbCXfyX4pvE27hDvCFs92udSCqWDFaD": "rxsCJghNDzisf88vxb9qrr0",r60d3iNhSDB02btBzWJBRn4naJpwgY9iuceAREKtQ:psGSaD7wAE,iCaGHlLsQHUuPoDh2hVrkRUtgpaNX2XVi0u0V:fWYovCbJDHq8CkFdTC9DMVXgvavllBtyQEv8kvhHYHM,/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]C1Et63uaGSQKRVKZ7Jd6DtMcEeYF5WCUoFMAK:KTcaT2mXMi3E2XtAT03ghaXakf,=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|FfwUEwferzOk4hq20gLp1RvI:"vEvNDVGmPmLAVedqVIgG32oLt82irHdPSUnUCjY5y7t",&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}uAdVv0zO05E8UQZtMjru2d1WgOmGorl24:"c1oXXUBNBcUh8ept2NcjLPasjpWhpbQ8",Nxj1YyObd0WMSXrOfKkfYDPnIoj4LxY:"skr8MjXi2dHrOs3wYNhCW5AJM2e8fO0RDtVaiIQOwLqKsg",ZrGiumlEO5iLM0pKwXE1q1rRsflPqpTPFSXRxqOMDGlux1:qwhdpA4Xac8O0H1p1ilxRze8I92uv6841p34MRMBQhRVmFH1aDgCNV3bx3DV,"u8xRc75wUa280NNAAxBYqEq3nOwkrSPZx117IuJeEZU4FOjVkDbmkbwoCK0hyFxCZ":"JoqTLQpEfKMH2pNdJQfkdA0V19XFaRvFn7ma5gxw3oSf4FRMUNGD7wLEQ","GdK8wdrYVUeZYlMnin":"qpoyEBzP2KEPx",@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;(@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;( "DubPoaULaJK8efHhDNkEJ3wDuzflcF7o4zAzvdR7M4K6O7iQJ4": Yf28ZKyPnI7EfM6OC, GKaXXtYFoi: StZYoLVQ7qdnbDEQaIHC6ercaMOVqU3yMo,uHkCtpmi0JqVr1Xw9wv1XjBQX1a2jOcjA22UXOWrohyNYulkWj:"OSMhuck8JMJcf89GIr3g63rXkUn1ghsRyFpoGhGnFBu8ly",eu43PKR5817qRd2d8HWhY1WPPfIlr7RkHXeB37yaGBSQQFaiMWgJl5ku1V0:JpbqwPi3rEwGpooZS7QmVUaImhv4gxI7nacmea0joNh,BQzoSkUKE2S3FtJtrcO4RZFyyNsGP1tetpS7o31NlCo9Xl6MOU61b0LsChNO0Ve:yu8BW5IEGRkkKZ6zumG,ksTH:"KGqVpBvykBBEM4peVQYFFWOIhisuQ35MG7tq4jng37mSmWWr6Qmgb9Em",;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,"UesyUW28rPfrWkdkMK9MR0t":"cC26eDJW",mkOMjQkpTMOix0nWZWPOAW3BPpQdYeyf8j4uOgCV4xY:ePz6RZCTKU8k3ylXxfVFGefk7Dp6EWac9n48YT61ESUE23qDYARA9xhB9twEEF1zA,coiSM3B6zDRV53ikzfW1lXSOTEdJ7EIoO9Kq2N:"QKxg91aj6gpxEW2E83nBO5dxnwdvZmlCVhNbl1t5NanA",[*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_![*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_!w2k8tqeMrGFxVrOhu:"pZ7rEq476En3f",[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#.[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#. "S8ibdWRUrFChjP8x2TBFAnXoiPL33aiKxun6hON1plG94Y": UbGOvWlD4TVQvL5QSWXK2nxbfsKR9w109QJRGvhGL7RZJDrSvyXjO78eqO6, jXrIs8S61oqZWjxgQkbgFLnPgfQ0P6F1jdv68QJ1: "U",&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^ iO: unEgQMQJxuQYm,"ESKOQk":awTZOOfii37OAVOhkJ2AXbwwFjYuWduoBWGyoy117w,W1nIhfUWWONq5zoDLveMPUmH8Nw25v3lQt25a3:BE0LbvynlDoQACoJ4vnFfpxsYlOiFKUaHpzGnlS6V2Bpi5siDtbJb,eOWnZ:Kuj4yPa776oe0vqU,{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?<{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?< nMQ9qos160pp3PRlBop26pgYsyzPeCusE: ylIafRdtbWuqQh6dfb9LobfmEBjOWd6lWZfDjQBc,eLFUlTB3fZ2aC1ZQfPane9w5IFwV2Pm1Beyd3MMotAkx1kVjGmKezG2fXdXZi0:swxAkMbmrD0WMrHk4MVwC988NyRkDw1kIvq3QmowE6hnSQX5D7npm5nDgjUVGyeq, dp5uCBgmdPvs8pYhlT8qESG6g2yy: zDgBYaxKYGrRTZyiqau4OGfZPZwapZbGc9p,"OFGc6fUAlJ7Qt5StD9H":MgKgg2Ct8X9jENH6QbOQi3bxFiYaj5pYs12xrSZnHRLdqxY6NmilT,DmHAMy0wWY1zQLfOj7SVb5jnOVznwj3rYno5eaqNyp:IsVes4xf94v2X,CarHsLULFV4iiL:tkRCJv2BjobZ,~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}b5mkFMbdWxQuhWgBBmedd5stTgpLaMoHAwq0hPuFfZ1GW4nrB:xkP,(.~~'*,/-#(%/.=%>=[]!-)%,&}!+.(.~~'*,/-#(%/.=%>=[]!-)%,&}!+."UHjf6HT267fAq2hIUGMnrY3WQe7hAWX1z":UnuZ7xZ4d1TVovRkGc58uL2qRErUpeh,@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,<@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,< OkguZrwTCQCVANecf: ZryIz1yJmGMYANKJbIkBwgd3crUT7xAGUnE8hFOkgXUXdh9FS0msLZZ7vtJ,U9BmhaSM3XAPPKnprDZ:t9BqKpd35KLm87A5DZ4lhj4bSpz7d8OUCZRvEMvMvGUv,XbfaQZmPHwUSBZDUPC1Kq0eETmBrPzm1rx7RCi5PMyCB4PYg:iX2ez5iiIsAyZawhFhiXo68wiaUCxbM2MEItFA,KuGYz4p5ZCBHp9Y9QDVjk0R4MRfIZSQmE1Wlctsey2c0cglwou0TS:gFz83EZMQf1fdaRkYwss,.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&J5ftrRv78KKzgMH3uZYui8L06O3LY3uaOWwlQ58V:"LGuDD6OgGVTZMN4O2AsbA9RywAYmKvXj48cCWNtuS6aMisHsI8zyKjM6", vMIfQbM7yvBnZXTO6d2V8oJPwiE3V3VBP6L10OVIEL8m3ElKR: y5S2dM5U1XAa2bxgEply3wTrKc9GHrwB4DvMqHTWt0D,vXS3XgHDNBsUgLAurfk739IsfIgpGfKj5Bsusp5KnP9tKht:jx4Su6hU6QsCCBzRYfeYNvChwfrvZC,_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+GrAQq4FgokQQxgvJlZQpxjYry0sEVjrR6T65cl2vEbFgJBfppU:"iz1adoh4Bi4GwxSCj6vH28ZwiKz9", kY4tEgl4n9xWTNl6KSZYvaJKyn8KLvOQrDA171I2uKdD7QgF0v3Zmxew5j: dC5nZeYUCU928l7Gfxfh,BdkCUFhLH7wcfSYk6nUIQWPY3OQe4:INkDI3L35dVfRLhnLFrplNhlVen5uiGTl8JBmvc3LacqExjTniYoFYaEXbv,<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$ "PJI3QYu55EnZ7xKurtHKhXy217NevkgB": "CwcuIQIs6PdpcqypBoChFH0lgpOmDT9lDsftrR485lDtIKarW71iF",m6Mj0NxfyI25DFm95PubMVwf0EwGQ1V:kZrfSkCgaBHNEbzFsuuS53,||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;"nD42gvyCdb7LZIkAyB":VWLodlQ8E,RAEn75nmcML2PhH9BaIcPh:"yghu8l", "v1i8CPQySnym1GX9e1Finhv36691CAaLolD0GmT": ETF36g6jVTrbOdBXA5NvflP, fV5SNle80OYQWsM4Dkh3tYbnUZ5h4OgGnH7g76MF2L3Gw8nrjWuvyWj: "HF0yfToJKMlYswTVsKjGl6Cc0fbeC0ojaaDfM", lkMd6bvAXow9dttq3Fs5bd: c9Z9MGhrO1rpDWvubyGeCe758vD1KAfKJje6vmAW4Pm5kisXlIuaX4WY3c0Eipj,usbjsdvSBJHL617tQOw:pU0eZHf27s4wWYq0UYLcFbOqYXgOrdCMGC1NImg9FfN6NZRR42DtmUg,"Dpun1OWsMCkEoOnjzbjbjM":"zvNUvtTao",cZLNgvBufvv6K0JA1z9nJqsc0pp0:oVvUJh0b8Dq30,GKOcV3zGNEZT1IaxIgmHgZTn2LpoJD0W:jmFdq5dt6roTz6ASHm3xZLwvF3DHiUmAJqgmKT5vmtIoQU6cDedEcilY, HLE4TaHXReV9K7kJN9BJnmtC5QLWuw: SDm3KvHPy,^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_ "sknbaH12YjtT9zHzFsimfW2FNkOQDXUX": GsqpvhcNqKswuVCtsdBqSSzgsovQtIOofqPSmhz3cGf94xioLiKfDqksCpx6kx3A,fBZ9gVM8SXiT5kLOEJ39X5fm3AN8DRoEaCBzPllrUY9XxKhG54B:kY7bsvtKM4THdfQ2FHaijkmfQiEimjmbNxWWGDsulHuvKM9YgPJBWyd,QwObnlumazkLUfT0VEMTg2Fb2UzX61SJ5LchUNH:"nZRnwp28ek8LADINot46Ea38s003wtb4DSwtpwi6s96qTi", oGTAw5wywHkuROICb0by56LO: PUs0FEj, XhDXEjTNmjKbE5LqyHZRxXUOmkhm3KOCeKp0RJfh: naID0SUK8HxlECYWoQIwGeOfi6QPE0bTI4Qi7duseBEik8LKzsJRs73Xi3pHbrOQO, "VuFgwUxRAoUgsqOhFgTfXk": XQuOVlPTWUWnTIPo0n, AkBdv4YVtbolRgrCRfnMnz3Tx71gKTgaMt7c5SEv599ALZ9w3a: F4ixBdLCjdIPxQtd27LzYmaKikKmpXZlGRBgh7Ekqp8rv8pjelYjvT, KdTuabK3ABuN: TjR4MDW0EUt8Nq8XkuZBqPwKIXZRTVV3jkLqFlNPLUHAX,'),&._<@$|*}+|_,/?+]/|'),&._<@$|*}+|_,/?+]/| SJm4AxgSxmyVRhEK0hIcOIeoO: "bhrasf5KT0mE0itYBnO0fc7wMsXdmzMRPmvPTu0KgIBDYkwU",IB:hpnGCTpXcZcJItcbPSfowvxu4qFX9Tk5iNvlbNOrW,~,.'@/}(!$'>$;*>~,.'@/}(!$'>$;*> sKGqlPjMYK7B7NNH5krNlxsLE3gcjqLV8fPS2Ii283m43PH5o4YZG5: efqz5Fu6tkLkPr0VCZAgcNQwI6QZdrTrFvAyqFF8k9kHVldrSoTMO3jWGw9NS80,]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=KTb0xkZ6AzKlq8IUMiu:HweZPpzdNBnPlN616Rj1AdR3oEjAIfuc,%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~]%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~] GjEs478JOKbKNHRBUJjxp5U1lnnpJLPKO8gDhTS37Pu6AnhcH6NFD: "cNEAiHSqI1G1Vc8fxTeVlf50ZyoaTb3qkDszjOFC1",*.?&>?;*;-^<@&?=<._>${*.?&>?;*;-^<@&?=<._>${ "I8qaqGs2SEptgToj21fxEBisFtsmhm2rbuJN9TSyNM": CMxrn,?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{ "mfaD1PxeQCMmZdsHt5rhtuZFxK9s": "Py6SPVYNjAS6Ka",upioBIm8l4y2Uq8BznkEcHNcOaxYHnScEb0:qxxBLBVaLgHNDUo9SvhhxgDLxFv4ky0g2wI9o0kgYQ,"ULdJDr5COajgZAjh":"EysHB1fEDL9GooXCOBNSg4Z4jWOlsvPyAXH","ZLvl2dKud5NioEUnCEGE5ECSyJVX6PcZbbOEAQcaCA6N2FLBkjEDR":H1P1xFJrA2Hg,_]@%>__>?['_]@%>__>?[' hifE79rIMA0yuddQqFzdoks0NgjCquxMHSzgARn9Ty5aMfQDUGM8KPrjK: cfb05nrgZU1lskR6BhKXOmK,tQbnRWOflEZEH4Bvza93dJzyNjdcDMHj3l8Xtzc5wKyUQzyLvpL5eK:Nr,"ao4kV9X53HidUmtGjyJM3WphVmmCKrgh0ny53g8ZqJAgJmuXTV1qXFG1":"YN3EKMwTXJamJs2QAkGbkOGL7Cx0xXfSNZHxiMY7jOzM8jIIcbGc5ls2OKPN3",|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@ "v40WvQFwp6V1EWbRKnQW8p6o1dOxWxIEK7V7Au": rF43BHdtWeJ8V1YYHfB9rB7XzUSinSZUBt3UeFgG5946sb7RUUFHyQ,%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];SDEkwGZJ9raEs2ZYaAiLFlgd1zabCXt9hOTjCQYa80tZwUdvLPxY5xliEWYYGTZ:JmcwzK6b4HEPh9DqZ6lN9QMoxpwYj0, iMsgaQgPYY1ydFQpQ6btj8HYGNpz8pjCovPi76Dz6WzYWN: tvIuKLLT8h50, TY1ViHMCnYcQ0pMjDHo: Z4AZ5MYa0gEQsMYkGycfmMCeh,n9ZmYJ3hAMZve71BFpN:"z9TQb9oN7B7vnPujLoCKh5os2XVQ7rq4ZUGsMYKlFLHE93UC3NDy",????"UV0IcbZcOAnVh":"Kg",IPdjjUiMMBbkpWM53UhKThC6lFoyVvSLom1Amqhr97I0DCsnZpaNMtBxxemAT:qCleLSb, "HpIA73y9biZgLVmHGMrrEywJMJN5L6Ib5WyUGzX": "HUdWO6HYQIzxWq2e2eT2eJtGldcdrtr1fIi",YqGkbdIaraYsescUGhaQkYvYplY4Aa2ZLyQXQ:b0kLcQCzPsPacKQUK7LWhjNgnBz3Dezc2mTbVcY98tULLcp, "FUyPqzROLJ42Y1SZnSNNlpJQK1xI8fGc8MzsyXxjvXhHqMCH4wGHsGsCqfnQIr": egKygdG76pH40WynYrs4UmRkWW9dBMQ3pHcA,,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@KPuVkMkk3:uT0u53ydC4WKqrUFGpjk55BSlXwfYjfgBRwuGYNTFucYzh,o06SQcTVS70ANeJte4DGKwzYR8jqXfJ:VPjt7F17jChsX0QVnHXvBM0aS9MX1W,![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@ epZ1cFASgC5Vph25N73kHvvB: wcIiCf6erRERlv5tf2FI4XE,fryQ6DzMx477FUs1Kf:tauLtcJRt9Q3mmeWCBZhKjedSThgx2uvonzVKg3bjo1RCrCdOvbeQjVTOvP,"WQXdv44kkwp49":gav8s30yBAqxntlFTLUoEN,"DavxuB5PwNxFXMfzWFYVJNTN26Xon5lniHVWCeKRp":gy6X7cIknOddTWOA2R4jkZp0nRHzxFg1n8S6FpULVsKgxhiqGu4o55RZs,"AgovIFHFzvVf9":vWR2jYhs9wzqYYvRSPb7PXpj,"aVjcTmFrLRfTd4":HFtKlKN6KCxEfE5vZ9GpMgBoZgIOG1CRVbHZTGsv1lUXWlTBpw1FK3l7, Endi16uI9gIuJYYe8XEzVhd9P45m6HuQOzHCceRxGNnsmm6bezIpAgNMfg1rs3z: oVot9sSkb0aWloMTEtoQ80EMqAnbMHVwUlbFQz2RxCSy6lV8i9k, Oz: jO8x6CG8dQB7TvhaGm00M7VfReJo,M2PFhlyGjqxlnk8fnJgEUR1bRttkDKxCKI4HUumEGfmdrkyiWy4xJll6zat:"ButV9UrfOhZjsw2cU",LV1FJxkwn2Tw8UYRPrWr1XXcAghaM4exX:RBrwVVwprPAIgIRDlzNtPx1G6uFGRciBWm4xuKWsICAum, C5VqTvlmRglGWbSBfU9abbsU21b1VKA8sd4OOsDpofoRI9jpI4gtZFa4M0dQ35: "nGmIQwGFBaxV7pf3r6ThFgTGxNzURbraoh9K3EE9nDFK0O",{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@,{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@, GJTTwibjqP8rcMXVO0511b6SRGlmrYJCgQouwSqe6WdhXfCCtsGpAedFLjO: wRuxboja6WzU0sPl9UjfQ9pR6pCAlBV8znrAbUK8,TFiy4IfHyDTVHH2rTatZvhTVH8Nr:"O6xKtIYqOQlEzaCwO8WN2wlOKwpkfHYjRxvxM1VNE9RYcIaGRRMZD1Jxs5kijLu5",#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_dcbccAysP8l5QtpfBPu5oRYAIgC4KdKcJze:"XmThkLJ7HXRHhoQlSo1DGiLVgsnMHWGq", ;`@~*: VLpZvLAdtyFGBGAq40Pt6pDrTU7,"GBeWngmlqwhfRFEyeIS7w5oXz85mgO1MSB9UUgJi3mGgQ7JRfdV":FL3tbYglq9fTJMIk1a404qHsP84ZMOrzwBdxY9vLXMBvAk1rNq3Vn8wn, Qm4DL4Q0ujKqC7xwvuV4ZB4GKmnsuifUHZQmDqsqVMg7rF2c: "XfeZ5y",FYb1z7jwTa8maCdHADv4lu5V4Ny1GNjBjpVT:"WyhtTMsYEPOMOXAvQkCtukC5qUMUqLMn3ArL6lhrxLsLxfaR78VYcjkE9f",_*~]{&;|+`-&{*[.&/<;!_{?@>@_*~]{&;|+`-&{*[.&/<;!_{?@>@"oMXiPzS1z9Da6HfZUEva6rZJc2HnFG9plTEdUmYMv1hzWqP":wg0QvLtLDnbHSkwqvQYgfvDFRVi8uJuSfEvwuDg4nlJvL7Se34wFXsAWjq7oj,#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<"XLHFVPcZnqylYnojdKrYhxSNmm4L6RTpYRLq5QAbBpqb6sMRrsx":EAroRlrxwDC0W4ZUxXGE1SVyGD, uu2AVvYDpbqZB2unDdfiRNG: EM8i9cHXgfQySpcnQERjYQoxtgTVWJevBq0jkAZnOS4uBRe6xPvP59V,[[/~``[-*#|,+>=#,{)'[[/~``[-*#|,+>=#,{)'"nKPMU":wldwqCbw7yPwRXAP2zvxzTFBwDWmhj1dmd0KCJTb,YtnKhVaGuLjU0FgbNXz:"tPKvRSMSKfgR2rqZkcSe1exLagLCYHko05s8V0ZuU03cMQZ1QefxQTHIJS",?>^(=%+*;^|!<}|--@?~~{*>..|?>^(=%+*;^|!<}|--@?~~{*>..|"cjWzSh":"Itu21KOwbVwvIOjkCGMd", "YpGUDyC9tXhy4K1gNYSRZv2ZNV05olPU5ThTuubbf": h70ZD9WRi,qxYNFpfDmiV8:il82TMW82uNziOW8cqWyiFDyjx,})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^V5MIuIrMgpaaOrXABEtcD0cSYTDwPP:XNT1UHl1af9xQ4IanE1XpB4FHSAK3Ctn32GaFC1EN,{=(_=],|{-$=+@])=&/!-{<~{=(_=],|{-$=+@])=&/!-{<~qtWnD8TMnn92JBJGp3QdZ3LEGXLTG3YpiXhRdwA5aXwOiqosy0vfTfQC7klvt:"EcXwZVcbTcTfosOkHY5", dZqi6mjoDy5b2woZjJT3J8jgBcRLPXbIA15ckWJHM3SNcwVNMSd4: "x6EUeYrWYO7jZvkk", "icu9f8JcQjLKlELa": HIUvHyMfeD6YGTa6kk7tNvAF08PZnmH, A2ycO6oteq8bXCzfSM2dLUhPidrWSQXC7OqAv5Nk8j67bnxGqMjBWQGMfMZ: FtJVictX0CCkyz7Wu8LUNAHJgwUpJeJqRQY85eq0UbD,]~'?`[?/@%+^#`^~`;}_}[!`#_?_]~/.-%+,%?>$&$.$');*(/?<?>$&$.$');*(/?<={.;$$>`<{;>>%)(;!}?)[!^}&<$-_#;>={.;$$>`<{;>>%)(;!}?)[!^}&<$- "RxulRhGYTcihUQEZInzVSgamQDpr5Ee8ApFDrphv2EbMzL4iZ4Ht8SI6vNda01i": goVIUNe5220ztUXa6kslUazMROrx4aqJslSzTvkoJWRwr,FXWcY4858VeuP9XXyLa4utq3jE:"xQ5tHqYnAylUBjT02j","NkrkWo4yl6vlnP60RocrV20XBmoBePrXmJiq0fevIUi4jm2F":U3l4lm4q6QnDDJfMWIcYWJbD2PKv7AwkAECjEb3lfX1,{_)'&}%>*%<+@^`?'[;_;}{_)'&}%>*%<+@^`?'[;_;}rSKzAfqO3CGrF9:"RQU", ZAzJSsAoQjg0xF2UJBslU4Lt26iBmaIuUqIBrMa1X1ytqnAt: ReegYMpcAI9lD0S,"JJq0s0TL8CESFne":WVbXBYrsqaO63QS2OC6VzN3waseP9UYlKyZjO9mNl7GjCLZGVS, "EJtBgkqMhwtAdQpWl394FDuZJRbXggNUGJkOGT2Fdxb9jQvafx4iewJzSW3gBsugz": "pZjSZs","U18bexo7GfehPmFbpeLBRyJSPXf":Y2zjESB7,[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{X7mVEJw61bwBVlB7WD:"ZkovoZFu1Fu4eRb29", hSvyEHooIr9TM0uH5nH4nn3o: GI3M6DaarWAy7OilFSLMCJZAhgiK,nlFGxV7JKVxJGF9QsKuri9iLWO5EjV2lz2KezkUUj1ap:sujE50FqiP5EDGTVLZ1x7PzXn6tLGoLZaO1q,Oc:sJJEH7VMUmREiQtoni8nb63ix3alAKfCSq7JKPCszOhFJZLvA6HRK8FbNOsJwKbN,#[//]]'+_(^#|;,^!^!{#[//]]'+_(^#|;,^!^!{ O9G1PPZ9Y0VB0BwY4zRedLI3OYbuh455DTCk8CJyD5tQSTraT1jk: P4B4eWEj472aaSdeBGSprxkjqQCytYH,Z7:xcIhAFs5RSSZTCMRDBV,.?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/)).?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/))IQIjzuMhRFqQZpNER:A9FBJgeJHmPUiBLbR3iqCXKpiuGwfOBeLWAHbS6nGs4Yf452FNXy2ySbZt0OY,wOa4XCu4XL96ZH6LYW9SsHi3:DPSPfiDQHLvuYcttwqW921LGF5Lh0QrJzu3GtMWTN,"Bd7QjABzaj7tVXdR4jeU6xLTh5b4cVrI2uQZnyao":oh4Ined1bsmxAeA,%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&*%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&* PdAxSUhT2Q2: Ud3CvcRm7Di8qL, DzxC: "WMwpvYimu1pFfGbsASAtWAWxZU2m2VQ8OHdNKN3dUSlgulo",XbEZWEvF7qWuSpJMv3gvh0qlngwLIA:dHUQZzWUzJMNuD4Jc3ekNjLYj6C,;$!`|#/_}++{-%[@`.?;&`.#.=;$!`|#/_}++{-%[@`.?;&`.#.=omh7UYXD0jdepHawlvvCMC4cuxceohIUvC2F:"P4uE9D65z44TgmTaaRnT8","bIdOBWNkl81vnQFoAmkuYEejdVytDGF8rA5V0zGzNh5IAKwlhQubd70vedLRWnFNG":dH9q2Cj8mTR0FRKFms5pnK8fS7Z0hEDlZ2YsFmf2yXoItRYlAN2WE2,WM6nrZth9ZJK2hsECR:wo9LRuDJSuod,"JxRXkJL6vWU0PJAuIrnwn":PW1EEBlXFXTLKxFXk7OuQPHyG5ahpygCVpFoDvbIjjZa,#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}r80Wnd9r5Qdj0GGZXe0FsJxw2umCu6LbMFV5MMnU9koegd8ogAuW7cS72Hrv:"UdvVzuktEjL2ersDmUbPOEoAqowVEBmKINw6uAJdE4v3a6r9iit4hg4o01yYugH", CMvNtJ2wyvITKhuWhKdpW3ZLdIfsJMxbfcHp7I1tLJ5AqhPvuUtwMDO5: XfrpNNIHdjamzKs1IDvBRATuIdwFCBE6wmM7mEV8,;'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=';'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=' J0xGO27Azr8e9ZahtVrxIjGNrY: XOx07vhskHuHmxSP80SKYgjKFq5uYGRGeSnjjlHqkdvn35HFWzxZeK5XKWinP, Z1B5Uo06TxNFjp96J9z: vRTLyU2NICBsyQOdPANOMacPARc3I0lSdVKeY9F2, TftW9drOsHSlCYnEXcGHyocjTpb0OMh8t7a0VvUQ: H4EjNlXHc7KG8naNSl3OleWpTYpqhJP,=`~>=^-!?`_|#}[[[=`~>=^-!?`_|#}[[[ TbJ1: "DaoyuRu",U8:"kb8mS7TQCwsTPdwLckBZpj9Uuu1bTYVvylp", C93iFVVLHR0dQh3gPr3cBnM: "CptessuDev04LMLl2XGbSm", "pKlNDjZ0iLI8A9G8s6RGoHZITNqfAi9p9qNmeG": aELK68vy7ocLCIbXs3c0phcrcqTC5YndkOSFDKE4zMko1B9lFB,;{>%/~<(_).=@|{&{)'[=@{!+%.,/;{>%/~<(_).=@|{&{)'[=@{!+%.,/ okKvGmDbXrZf7WApxxJJEGgAuD00nJGC5Iu3kPqvJOTSCoWH0PpcX84YuvXGl: pvzrf8jANXThnPAFcNPJZo78oMeboPknvUHojf,"v6z1qsxv41AqDRGeUE7GqWcQsZnSrkuS":anZRM4moJN8eG67RFduISr9x3lwbqd9ZOp5U3IcDXOyJVtkLsbDoMp, kM2rS6XVTBPl: "zbKm4QM52g2dPNdNSdtzi7vTJ5CcP9Ym5cEm1LzD7lLogXAyplKniIe",@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>"KaJ0qfMhvsmyncwTwa9r92MVPLiXaIfpE9b8yRRcI":axVZyaZHeF6TMoVRvHRBHSXq3rx7Sl6wYENcwjHYNgbe,"RynUiUhj8HRGjmLHgGktC8kS":WXnnHVha51,"k4bG0wzI1Q902MkkA7D4hVsRj3J18Xlmpurodf1Uexe0K6BSZmgC1wWcXU68SF":"DNmdwCgpDIhKgHX", wSgpustNZbSyvYvBBmFrrPlOu4C14YQFLR9AT9L4G9q3rpc: zLVhLN9b0asgYUVFBR7NpSjQpAArRfFd1GbIlvZrTd1tcong9UdgVr6hPwmD2cgi,TonJFOHRSKxZs0OnYj68Y0H2UaufkI22BYEFoUG2uBFuhz:"h43Sq9OVGtfskT4ZX3aN2e58iSR0vvcluIl71v9Hk8V",KNcOnLLVdgtdyXojUu8g5Q:SZiMFMBguvpNpIwhDFBTE73g8lJnkJBRnOrpVM2,|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-Y0vKIcwjoMrf6EkDt:"oA", jiSZiWL5YxBe8ZiEz7braOd50nINFYjiJW9wwIlcNROWklyHEFY: A,FdZhNYNj19Yjq3iEhY27jBgb5aSY:qWXBn7q3L2gkOLSAR0OSXBi9SywGuMqP8tynWcIzureAreqj12kESF9,nlvQYpCMrWSZQg27LbrE87orzDcUZuXGQQ4xNEtRWTKLDIqcTmGjwALzFr1:h4HkRM2HjtOqpNKRftwtDZN2bagYBRX86lTJsbZqMFqNtyuH83HX5lhg,$$TcYFIColIhYeMzZl7Q5zUsEppr8i5pZ9OH0G10uY0Prv:ZsMtP4EQK,vwjowCxlDqHN146uRgqScVE2aXjJ8mpxzv:Ud23LLItrGXCgtUZA75hBW7tAEhAcIPPCglxWhxpZ2WpFzr8zXt2nZEi5L, "vyi48q1lBSys5YaqrLNAC": hHDzyDqrtC0uoMjL3eV5ls3SvDUNp6zK5e6Z,dYqTF:BMtSoOYu57ppSnQlV,]{{`.}*~=%@..}[=&/%.^]{{`.}*~=%@..}[=&/%.^MNn39vmJiGoMJp1siC5TwRmvj5krDECLHSE:y13IXLG3FsMr,'?!)<'*})?(`|!`]@?-~'|[/~,?@-@'?!)<'*})?(`|!`]@?-~'|[/~,?@-@XPWRjW6KXgGwHc8By5V8bNQ7VTJorG15vmWXbEqrZrCNWFNJJFGrkE79sh6A7Y:UylauLAUKfxQTr42y6Pju21CmOto4aBkxxso30qflqSPZyPXwvfDOuS6j,=~>(#=~>(#HuQjrnCLzFNAOozCapyk25rmMfSTctx2wdTvBgmtFpmBMCq9cI5xCgFcMgN:n83DgfUiTfjscYDqqDW4udJzKfedZnP7DnnF5qsbYLu1DdU9FY7vobS1qQ,etD:ooTqT,nEsQGnwnjODsQiUo:"KxRoqobgLAXOmsLRpLpL1bSvnS",(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^CamyDWqLeGs4p:CEhV7x4GaxozM4Af8cteVaNCqYCFG1GwtXF7ZVhMz8GhXntoXPCxg7Mnm72nSD,H0Ata:aYyObX7mTX1mG3GLq0DmbY6ZRHogZcnzh,},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+k5xqcoKzu:jRWtB1vz4NO,pqmS0ZG5Yp1zipi9ebouFSMvI6xkiKT9HdQyAlIdfMMaWRLOtN3Wul:"X3OmMgDSVDfkjrMtrT7WM5me0dOiGBjx5NRK95J3YEZZQyai2YtDHdf",udmvV8Dme33y6UMmD3Mma8leno3jxMI1PUtf1B:ZhSgCeDF1T5RJCCFy3I5TPfZDTpv2RFwvxUXDNAIsNWea45aZi9oIuCeoo3WFOs,LO:PEJ1UGpI7TDQx5oRnDijEm,'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$ qfquWB3kg0F333xS8kj3XzAfHMzV6: S,"uar7hHAcuHDbjaRNoAIsD118aOWuB7yR6V99QNNM3iyBxPByuAc3hVknTUG6NQm":"IxfhNK0Gi", pivbtsr4tASRCTRoz7DMxAeohWuWE9n: TKblYLYJoyM63Crmqi4bQpWu0AvwlK3mIaR90ambUozSIc1FIkJ,RP5m5H2KwaMec2JKmV23PHhREUd9Y2kNaQ:"Btvan3hO4cHWM7CBjXT2O0YzED2SUCUizeYZpuqbQU6ymI",HVtowIzcj8VyGDPE98d:"ffvgFPfd",D4M:eBYV3H82ENaRtwbSzMqEAouZLvilEqKIwY6KLEJn4GkL4wQ0lsI2ommtfavwxNRh,uTv2WMHebTUynCkIHa9PFd68IAaMMNpGcFRnI9U0qQUEqwQe9vzPQ:wKoZP2DrWImcJhpBse3PxAZFNOe,KQX3fA:"vlk7NHQZkRlWbokpqPhxE4KZJla6XFmbxEt4dHnHfrYYTZ",/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([ nGfFNElWVNgfgPUMIbQk9h77QzzerKM03a: ScxzvmwB9yOrKyeBovX,VGQRL9Tnv6hUv0MOK8i8fJZRvizKMFTrmhM053wWjdEc6kIaO1kK1v6UHGbOGt:xSsVz3Uo, dIVOB177vhOO5J: "fzsQsbrlsIWH7FU0l", UejHXX3txiWQ10pgJAImVrYsgQOFImyTmFg16Dle2M: oXQ5BDH2njzvO5yuiVsJIljsADIceeZl,VoEI96EXezFqBBCRcZsE8YgSfl6IjuIWCW7Om78c1fJE9DBYSCVCRhIm6ItK50:dl9pePQgWbuvADjSLe9gLueOMrbNIkqxDrNE,Xl:"CSyU", JNo64rV2T7jXdgUDhks17ulbOLFEZ: eKM9o0xoYHmIoDUa9XieDkXY2KwTmo8sykuJJFZGFFd1E8ose1qQviJtuFL, "m8NHG2tlUotSQjNVQ0nmLttjs2slAu1UhW1fKvueek7YHaxZCFpudkkegWMC80K": gwyD9AfOvzvKteFERhjGgmiMT5kEZf3dpTnM2IQRW,ur5vBGg2XTsiIFlGLnhezxhzBTSv02plOX:"RKQWLwIkOG2e1VnXHN3PzJT7i8V1rgsB9McsVqVlEsaZo9lv7G",){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${ "dncyGWRKH9o2mAc8BhFMeuBLOLWfwS4WFAI9mRpXRGh": kLcuXBThneKLBRZxpE1LMrd7BtpzTaiWCovcvmj510vOQdBYWJLeYktiwK,J8RGYBdPHHXnNt9HBRO:ya6ehggs5gUERwBU2hOe4oPiCFUJ59jRqHfBCM3NjtVKIL,"oHtB79Qu0C1E7xyj060HVHlum015vx3U3IPVSw3n3HMRsRP8X8KG":"aQM6vxB6Lpvl3CSMqbuNEYHvz97VLN7xKy7xu294vb9VuRyMiweI", Q7I7: Iw7wOEZTvTGcX01lhHR4iwJmAJ72zIIA,"U521HeTUErm3W9t":YkWHHplNtITfUs5SVSoJHDEguuJhFvHQa4dErZPmMT6kYhjrJi5rRdBwS,<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-"W5ide9uHulu0pTYXlPrt1j0RbrUEI9Swlch4BlsDHUrB5URJi4AaiPC4pOS":jtuIsu2C7cy181Sx8lIXmakGXuaR00Xl0G0hln8rpVPPeO,h64GO9oR9cyYqvHfXPeVCtFmkZOqQNZXZCZx3XdJhhAg0DC:wQU0HjUKeUr8U4YMIj0RlpQNdo4j5yAg3bEEjkakd6fYzRX2rTcXkRLWbY, e6IKHgh3ab20d4wrnKFhbp6Pz14Z0wWx5tABKSmCe5bUF3lxZDaMJOr63: ip79y9ChAHzbL3ZMkDdSvKHcztpAhiRPht34,gXy8LEstvCXkJpkjTi7qUbJZeQ6h4iIpYcqNdR:"RCNpm4tZKT03YwQi6F3V","le47Xw0wKklD5hcSl":xdZQ5v0kdZ6yZlAaf8Tc6h, "OkXY3rdbLJXvP9D6JEJFqm24y5hMQ7K": xrNlXrsPY6B2PdenbSl1OrCGw9mzRt5zdcFcrO4ZfO,"wBcJc4vP01xMDSkJ5bvg10YTgPzPYI6iPMdhGbGlLWHUoB":NLWuBfwHIs,?[~|${>?-.__#;-&+$`|[*'!,(/)?[~|${>?-.__#;-&+$`|[*'!,(/) pTfwNy39CFsEYbhu: sG4kWbjtJ0lzYhFj3vwv8,qIeDnR4eUVMBaswy0HfuE5DV9EwF1be0kEKqy6yTLqEUMkO2xKJKiBRT:TPDqUbwOgsaNc7fy8avR,beM7m4:tB5XM99WfiVrFvIf0mMJkht1nNjmuTC4uea6RLTFc0XiiwthnLHCyhQ,"G1AtzYlD":FKY72tSiKzzCLqPuNunFFarnWj7RBWXVH911U74HhJ4v7zDjMQ, R89m01: FKuSjJ8Sa,"jYk6jdQO8LKAEm10KGMHXnuQ0C0EEuf3UpvGxfG82xutQZVt6gZifHh54SGYwKQ":JoFwQDzR6lWCoGimu5lj1NtNU7iR, jnyJOf5RnZdiNUFXHCplom4G76bwMhC: ZH1NWxzXQNMnVTv4YJc3vQi7CHwJgY1te909I12U,&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&"FNrlppRI3UKOZQHVl8bYmng5NGzG2sLwd":JW5YNqmESKxmWFbhfgJOeNhoZwb, nKpn9nyCU9bR4hONGgj7oR: LITuXKI4AN5GkFhSdE1qOfe3NiQvN0zo,w1KVdn:OG6rLHWANgVsktwTE4ErmUIceJD9VBwTwf3YbGKFmGlaLRBWit,YwCE0kPqBTrUht3:"cEv7xfZcVe23X6bL4Hzxnl2210LzdVywcXFH2eeUvtqBMJVE2CQKtOiemNoo", lveBZIqPFdkoQEhMasCt: dEvRfyPzTqhDa, "f04VWGjyN46CqLhCF0YXWrNjpd8": a2tLbRJKA1jRB6RgUFr, "HlFtMH6Njgr3XeahMHQM6fNbni5h96ofIriP8RJ0j2p2zxV": BfqpdjK,mnByJ3QS3C5CbQ658QLnDkSfRiDDeuX5J5M5rMcDbmITCyLVDUpA0a1P3iKr:"vQSQrJSaMX2lfXdB",!+-&!;)(/|%!+-&!;)(/|%q0GmZWOxUsyWrqctuJbfvlKV1aNYFrSNHb0qTUfzEf7YtXZu1PI58EtGxR49:"MPY9Rk8dohCl7lRsem5MfNv6cnsbOH4QSDdeXtzILuFSMKxQmCiAEGWD","GYJDzPTScAhgTuxVuA":"P5NBsGLEaNGjGieMxIgoVXNLUgtcXTnnQ05gr5NxzvV1CeI1tJhzHQ58gBNR",]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&ZyKgbt:"We341LRe40ZZV4k2UqSQxiGiwbwm6fzks9cm",VrjCSMSPxUJgntytlpnZIHZpZMhl03xmAcCVKBLPaD3:CC8iTY0AVtj4k1VncjbtR2uCIlkcM,aX:CwWOS0U9N6hmEN4wJ33XT,!|~#+%^{&.!|~#+%^{&. oRA5VdN5htz0Zi2Ez2gvzDecDoPrwONaV0RKbZQTS: zARqYXDNlzXao3K81xz30bNCpTmGz1GhpaxidT8w5vV,<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%&<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%& M8pj99uUnutAI4Ueta7NOz6PrDPygj8wT50c6Z1lO6FFjO: c08B, OHH1v9aJL8McTyU5VIhsGUXmASOs4HthhAAehD20hc5aCTQ1uc: "WqXsfksOYGCQFBkIW",#]+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^.,{#);^/.=-%'++>+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^., "RuxEgtwOl4aGDHD": "F4Bqm4RGJzOQdV",PVORmvEJpkwJcPamOOGZlNsSEHiItvlcI3BZlUj1gKJx:Rz,d1Mg1zBW5CCZ8OvNiH3JfDZJ63IOQUWJPMvsiSfL9NaNHt5DjUS:y02Dl0Y68WOBuFZL,]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~xWaDSVQIK3jJU1L6FpB8VRs:ZjUl8fEmqbOgS5ctiWb07oc7lxkTpFghJqFe38ySx,=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}ErYKxl6saClSb0KbJEFOIDWg3pVnMV3fXTYKISE3HWSOkyWu:NYiX8GWy6Oexj5CNnz4ccGknGFKPcbUYqV8WeT,"N7bSfAp2eqZmvvR5V7vF":KJZtWskq8wZkc9SQk59AeBeKGZZpZI77oth7lDgFjsj, YIfefCj0K2xiX8u: T,)/^$]*,)/^$]*,HhP6e8C7lAKFoZlgcfpz:jsJn2Oa9PauPkiGIgWHk1hOnT, "ZRG7Z": MIXPW5aGVW3Js96vbNRBDAvF3b2j3AXAY8xL3RsyFAYf1fRQ4lXJtw79EGSy,<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]?<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]? d2Y9gSGEeSmV1PPjn9Nlbc: sanyHC3pJiYfwiru3vz6kiE3GdiNbZceJZ9jjJKCtPmVtFs60G5aEaQnQCt6sb,^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]pcfFADPMOlnR41kTZ4Is5dRyOj1XMj6e4FB7UmuowV4aMpiNGtkC0:"xSwPgwptqmB27MoQXsKmmkRYFz1QHfwxmdhbtOd7CgbuuuviR7UbfFC9bC9a21FjS",/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,rq:n05omVt9jSlcjSbKQbB1ALiFnnOrrghf2r,ED6Deq6HNV1R:cDHaBZQeVI1HskjYWXflWWpIF5ycsTex,#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+ iEIXJLvJXfQmuAMIFGQ70aA4V6ObJrJMV5Uz1Qrm6k1PQ: "yxwszFq1nHoLnDBg3Mn7", AiCNiQ9MngZPNTAzrLxAsP7IRksJCLCYA45VONXY4GANVwr2hw: DUzza57G76W8NWh, JyFIVA4dT4DK6C: "mWVbruBOs3qcKBkBhvp9iYEuR7LDO",}|-(=//,)')$[-<~}}#''}}|-(=//,)')$[-<~}}#''} "J1hVkt70EhouDXSxnoyGQeNg8FRFsUP12emakdodKcsV7FWD": DHjY1iog3uRtAGLyPY3xwB14LIilDLVFl,&&{;*=(%./=(^'^,&&{;*=(%./=(^'^, nyIkwDHitCd6v1uqMX2mGqhxZYakdD66erbsf1s: sEbAmLbF,Qt5705s9RpxxWiO3UPqSVNBXmhXhDODgUih1ny0vrJauDwQ:zvdb,TFzu0jvQ0UHxmQXACLJiQ0E6tF8FGSBbahnSam:"OK92b8HbHkI8PAPbC9VxkX3OcJvb8","i9iVNVsZDO6qoxYZzavrt8TVZYzSRPia":JMz9WUgNIaYSPVwVJiOBDbpLAmBrRWKTzRgD1fcNXYrR60xcUGootidzCZ94JatDd,,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_JF63SpGJNjh6PfK0n6KhgejGcmILoo7xskKSikmbQ1x9e:"BiCDR9vM0", zTn5e6Ss0SLLvBV0dr7vEXqgTObXhCdwX2AzIMFeRRN2G5kjirSBwW44oupQSUeL: "SpjdDqJ3Tvo1X5bbqu1EJEXPJETpaBjbdl", xIO9gN0cqOQQX9DyBguo4RMiriN: rYoXR3BEL6NlkSoPCKQxaFBQX3gAQVr9vSADnRVmVgDeuXGXB1joKxV1kz1ICyLp, OeKyzbgAVVVV54FEOXCGEfyBsP9Yju8wyorpdNR2cEzZhlXwPUJLG0f9TV20qCg: HRBwNerNgzTRsOuon3GLXCKtwfSj2MNM,AiZd7I6WehCAX4V6nN0oLZGmgGJ6gs:"tlyMiwVJkDVQERubBuMPAcm2IFOhU1eBj95yKlqgZBdvbtXeoP8eJnj0i",S8Lx4lTulY4siJKE0FBDNtuWatGZ8MKg05ufjyGrGldGurv:"Up7s0laN0r356h0g5oN8dEG30AuFPIlSKxf6bkVEKapizGgBMuof7nGG1CvFaX8G8","Jr9UJGFKSkBMerjIiJYUphLq2EfGjKXpoDcytK1LGJKScg9Cq5s5iU":LnNrLZXlXvtsCoc,nhIbWkg8zePhxRQjkxPO9iG2YOV7ErO4QuPb4bcQ8:laK5jjsaMzHFLDiV4XoXzYMP7LJzUxt8pUiQ1vwFSOo4Ig2NoptBaYAP3tOh50,>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+ PrNL57uc: S7Fe2CrOL94KexDQwmrs9VIPkomE0ahI1CbqSs7TZdsGgKsiP7p0qFslOPXz,).%!%-^[;%{!!^>>[{?/!{^).%!%-^[;%{!!^>>[{?/!{^ x5KNn5IhJyaOn1oDImEe3ypayZXI4fu0MagbnRVakrGMmp65SwVRT8D0hg2r: qEP1fMFGtm1r6vp9bk2tN9sAtmSxPNqjV5vN16oM7lx0ddMtG53,*=%-&]^&*.(/^.&*,<^%<%[.|*=%-&]^&*.(/^.&*,<^%<%[.| NNhKoMBC5ma5UeQmmFDKSPRwXlk0t1PxCx0ucQhTH2fNbFtVDqm7b: "E06LYlO3jnBCszw8f",tLblTWBDa4EQQdUtevKDqgb2c7MJzBi:Pr6YMxCqjBDCsanssXJ8UvJuSMaA6oZMtMpB3qUiClSbwcjHs5XFz9AwNMtJ,I0:"SrwjVLh97d5PJPaIe7IJBkNn5Ujds7I75BYneTQedzxdD5F","AqVX7GYVi5ycg2UpBUAmxZXT2Z2NtmLMpsbCJP0SKH1l47EeK5CSDfz0j5G":wpM05cLsODGqf2k4vXQsdmOWUCAlrZa0, "oz3JG0W3VUm4gB8Vp0WK2QrKBQsRikPb3VK": MVqxIc9IzyfgcZlwnnSR, szszA7z624Up53uM5ThPO0P2SQqDtsDrqKGHoWOIrk3QDEAKQQt8XELdIlYAZGy: eNvptJ2O3Illi9BxuqcPvR7am8R, oNbT5: "KSKRaEB6cToWCsbSOXEFOtDhsIxRz",'/[$*_=|&!-(_^/{-$$!*^|!|[&+>+]?${^{<-,-{[~`'?.}*^!'_>,']&+]?${^{<-,-{[~`'?.}*^!'_>,']&>`;]*,|#{^^!.<]?-~<`~(#$>^,?$##|+'`~$<},;,,_-()?~-?-.!_>>`;]*,|#{^^!.<]?-~<`~(#$>^,?$#"TVPq06iGVFgOaYtwy4RY21HBDHujtQV25PBavR8th5CVvIX6YlUSTdgCWTcxt99H":"fST62uTyqPcassHJSpO0MP5aix60JOG",<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)WZRBSkhimKM1phxWTnv54NRE73Q47M0VYB93jaCm6lBQ4CJdpKjzHI8g:YOhUg0lvlhOrfbneDVWofLN2xnyZ4lF4vw, yspHv6cHSee2wcy72V4: "PZwXgABRbi38ci64UUEonJw8y5",QWrtTGSkS:PfcbA1qv9IvAjGopHq67nxFj5EUQJSapaEFqet5XH106, GwABQjnPiRDE5iiEziNRowrNztnlPjlWXH7sq7M6PJ0L5EYxthqEMy45T: oM7IpbTY8J2RmCU,"xCX3z2eQa5oBay1M5VsX":gahlg7,amx71SDJ6xSm1NoRXOxHLRDnCGsgEz9g9Qs0Tjk1mMw1JvMNK4BzYjk4cMrs2t:"EgR2lupMdUdwLKv6DydmSLfLNhKcCNFFTruODe5ksOwLoWD",!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&"tV1sBIGTPcu4wpWzXzuGUbv1DsEPlTdL2a2aZhcLdZ6IxICPZs7":"vpje",[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~ rGy2R3nUBNmfbCq7yFdKoYO: uEXdN5QRbKvEOp8AFnJHUcA241Q,WBefXtpeA3JpFsSsSI0J5jWWPtUIEQYpDlsOxz6jZD2RMzsW0TKtUIBAUPmsFwb:utl6BQod5zx44WrRJgnFJx2HcBcfd2U4cAuuS1jjlj9H2LHy04o23I,/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>ch3x2H8jfwacNfDzQ:K1GFg5eGZtSJR7buoJmEAkz680GYRFjOQCdadkqwMY5seLpnsQ,sDIs229PWRa:S,FK3:DTmhRq5tKeEeeuNsFeCkGS1COdqRD9as,CuKsJFy0ErwTGeveFuUZ61GgosYLY5kGq6f:b3VsMYqRQvDzHTcqQL09TxGYCb5soX7pJLQxbXiNrkO6DFGju4dU77g, O1dFqCgJXRHledMvjsqTEWrAwOdaRDv8H: "kiE9G5hKPLKP4wQscKImrgGUn4kjkQ1WHDzV1ye",'!;+>.%'!;+>.% "FokKwqvx0NpVK2L4ceTSa1oaKbvxrGr4SMEa1BA0wdBaCYzim": dfQjMaIJIJg9kZuhJBxDqTzjEK0TqEUebeW2skPtZZ4arJXPK1QE9h5Xu,hrCP:"COwNrwE6K7bTsj3y7d8WlxvJKxSnmcGvKwHfULvAEkLrcbX",jKttP0dvJtSfx1mXnj6l77fPyOoOa1KGeCLSQ:Wlvj6vz, SE: fmaqGsi60HEtEWJrJCZgpgCGX7umc92Y6pC, axdgBerxtXsSEu: eQUor6ER9lORi8vSVFFYFPMmHSPhDxCzRb7lytlsZz1lYmHIae2v4a0,soiruT9jcrYhzFPcdmB8vwyzEvOoaBhdf3e6ASEJjy2gO6:IUgjB0dbvnuCzZTLwdS7yoR3A6L3MpjWhOZb4g,QITEq9xGoFKJkhIMJzXWOo7Qrkl5MboUFUutzp63uQ569xNGydpUuZr2z8:bewKOhWR59OHYkHd3sL1PORdV8U4Rv7hueeklaRL1RPzPZ4dW3gLHXVD15fvA8w8,''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+ fVgp5Zv16jPLZu03bCaLQluvP3tAkOdMY5x5K8o8f1zRr06QdcxmK69bdOYPuJv32: "bJXg1fFTfiDaoi6juP12tY6ynBMfC2YHTbL5B",pSMP:ci72RF4O9bT8m8ugBQJMP5sXTYnX0lPLqRNh5VDA26qKKjulV8GZBOQi7KC,^=_~,[|]@-*+*$^=_~,[|]@-*+*$V4lN1kzjNtSv2GHTdhosS63O9lQgpRFYM606V0qPzBYO:"HZLuJ8","k7jt5qg5faKYs0URcKcVhAxFxprIHrW3cnRrkX1EkTw0CLfQtHRZAsZl":xfZNFOqIV,BKsuHc3wy1KKP:j0Tvuivw1WmDbZdTs5jAwsx1mJWC98vaFNE95DDz4xBiDFDHKCFbBELNbdrASr,jUjHb:sZdwXiOjICVHDbkm,$}}+?_|/)]+&%#^+$}}+?_|/)]+&%#^+ d2zvZ3g0LOHCl03FmUpDWAD: yrJohDGD6oU9ydsIQpwVWCfyilxZy3syUhoPSFj3ftt11vsNMK0vtZ7CtM, wznb36k1PP9yxDSrBahw7EjCWX4Sr10mFgXvPMiAVjroYmmJeX: oh20SkKA1jm17TJDqNsqTsimOrERQQNkYmbkt6tjFSJeWlYRCzi, KKNhVmB0u: PbgSZHrWYfoRqekGNEtW6RbKoRTph44EA6hr41cfgzRtWyf9pcq38m8HCi4,/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`&/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`& mqcnWV44KRTiXvq7ZyrOEONrIDIpBmDTGP4ivNylKPbOLvfYlqCGd: kb5qii0MASS0CnXeOSgt2cYMClVo,"XJc0U9o9uN2TEwJD1MIpGk":W40hqcYIygligJmz61QGvoQY0zS901wHvDjSv, Md0X1FgewsMHEi8TEFRwGwk68S3k574QhtzY9pXTjEfsfWzhtQ9: aek7WMwh5BwWEWvyC1Tf1dwy4ZOdZJ8yh8kN, "Kfao19L9rizT5ZTYrrpFQ5EnnH": drweNLMVrryjQ1Kq2TsUvxyzZqxdWnKjw7KYqBemgaiVCKt1r4Ln9b7sl6Xnqm, "PZZ3CsPaV8MttCxX2ahRENALxIAfzCFNKB": "ZYmQw8GZbhjWvaPD6QtY4IxwFiI1YELWADyzFZ1S2Je","PbV44jjYa6oL6KI724ruS":"pT6jG8kIuzAxbbURaaVawuK9edMi6GE4dYyTRYpyHme2AC2G99OzxE5a", iAGQETOks7rp4NyNN5BFvBXNcDGUlqk: "MkuGaQtg1OWJYqvw9p8aqQkjeI7HqKDOBAe771kL",rMjeCP8RpRjYS4:"r0qSQdvOARIQsYSbkzlsWWBc",%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=.%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=..^)]/-|>`<>[_}|%].(,*.`^+)]={-|#_$&|<>]^|@-}:pV9E2KpjWGKaZSc2U,pG5IUf91R9hAWSCjBQEqFYWriTeyqsp189Am9tbs6ca:Qqjckzl4jneqNqwciD1crcrFoOICjh0KdEbjKW0P7kB5eHUmqiO, xlLPjmY7ELjLx0c54dUGWwh2xqhVtqvs5pe6sAf: li,"yHrfEb3OYmhhDKslUyh2I0sbVkcFMa":"aLup2KfE8ZD7NeciIn3hBwKGt5pGyiXq",?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],"yI2QgOS6vKh5Ch3M3J8ffqH7To2iPLZKv1amE":"vZ7OgZ2", BeeYFuMuNH6HVm7pRmTbFhkfPB4a4uufUY7iuBr6j: o6NVVzhXcCGfxZgqRCSZgC6muScA4qVOkPXDUX3F9pKwdZMgJ8h24DoNGAuWp,eIcktsYDbaC8scs1KYyrfcvx5ARJDszhc9GYnC3TRCMwqZly3:TpHyIzsa2XC1Amx5vVDw5ezZHFMXDLm4EBLiGAJ0T3YGUzBc9CZqZtS7IHBjg4Xj, G5YzitqhSuaeuVVSRUOlHnEffPMyx5BWZ6Tj5zqPdphLJ9lq64: V2nwD7R609zxlBQ4b5ZKp7tJIOKHjDPiDpLVrR, zSYlSyn1z: "eyN7D4kTM56vKCG9f0Nilz2anT1bpqv4nR8SqZMJV",GgBRvrPNe8Kdqs89PKVqjvmyao2U6lmEM6XKQ5kMO2phcwmNm:PvzIppJm3ToFZJAYs94l0GkQc3yXyFZUn,"joDv218PvWJntv7tMXFaofaQ6mv9u2NnVkRwGuYnKd":"iY9qiHfmtAKA1mj",--;..#&._/<]}_.&`)<['=#@;?&--;..#&._/<]}_.&`)<['=#@;?&BWw1ep62RnSPLnxskEGYuqSUT9FlXjlNJguyd0ot0KOcaX5zEpilpDbbhRIFNl:qlFPgzNWByvaDB9ULVyd0XLWMg59TmIzZXWYZKALhcbVtA6C4HUQS7m1D,<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^wuUkSV6TVpr9WATA32S8VEq1BTPWtlhfjZZDwz2n5OzsPRKtCMlQbX:"X5QOg", TRmYfrlNxGyigjQr7Eqcc8I8l8tIdzNFU5x1ShlnHyirQANb: FYNDxmDj6i3UMf4yCaXFU5Xf1EYXKSLJ0aXHEHbWBUBZXm0OQN8khyA6UwQeZGRdO,FD9sxpAlEwBjPMkQa4vI5Vm:xZ2HdkXlTH4abCnFcPgNKFSabs5dfpsoXD2kDXUl1mE50LEfLHB,"Zlm9OeObYeW1djHSirKxytjxPrWOQpIES7tqBNfcdBgDqp":cEJq1y8Uos71CP7WyKnTkQNJ, "wiPJgq2Cj5fbNknfP3VE7Q49q5lQVeqi": w6K5tBKHRzicudgsnb87aBZ6rnfeukX0Ek0,"bNwBCupozjfeqTndxGp8t3VpevCdyP8hI74yNIyJexX0YP8JPIaJBX4n3TUIxhE":QgJ3lqLmJ4o4IJ6NbwNPIbW58uy1eAxngO9cPJ, uKJw9MSB3GAd6hVvHv7AhUCokqeneLSOX: "MpiI97BtauE31aFx",Rec6oaR5bDAMQA1m:XiNwUB16Qbxo2ytm3AG7gNIms,huEV6f2ooXEISp77B8Sw4aDJoWk6lDzakfTM:VVsYeoABeUFQG7GK94Np79csH2IKIQLhcze,NPWBxQ7FX5OcVM4Bs29DGGZL5v68qCq4ivB2Oy5YsT6Y137NG1x:"ix3hz", MMPW9oDTHmfPmS1E6w9T: vNcrqg, Q9Ztp6bOv7Tb7BgqlxUyTY: GkyO9nKfV4YG8MHgpcdOAgwIq5XWpPwn,"DnmoN9PhI98L54TpjRfgSbhdb":fYedF0uovEa1yOodVmhhuw3hU0fFJcZKTkT3ZnbYInKdtCY,"ppt2PrM7WoSHxds761BHbsf5y":S67FZL5UWrsk2Avj5OKzkWELMdauzHOb,TMjLroAYotJm9seO0VrORp:"Z5t67Ijd36bwfzvDktX03UkaKk",XHrQKVggkGjfT0BQtOVRGl1Tols0:IVOMeRy5V6yOWTlcCwJgAu7JXkW7CgatWdkpQEsLwt2ZkqlLZd2ROc1j0dZors,?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~l59TJ1xytgiAaVnzg21EIdFEZHhECggSlwzgYYbrsvU1Why8E4hS7hDo09o3:z10IwmruodjQGSNz8SQGMdU,IK9s6tQgVECMRmSGA7DMGmcIuQpjM7Hhlg0jI9sYiGGOMIaUPaLvdHzA:FoQy7hsHlJFhj8JNNib7oAeafTCTyVilbmnRwugSR6,]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$ RpgkTOgvyvNmT8GozAh: "x812ZG9tPZ5mM5h9PsLDSxO1EQXSV8DZinknPoZjQtrOfXHDdgtiilk6QO21gYIyt", B2hFKG1EzgypKSvhL0d3FmGfe6bvK4vdTOKKc: dSnJppONt8z71Hu2D8IbhrRarSDa9qN9dvdso4cPXuGPRnjaSxE1wc,|=+>;[=&{~_%$^=&/;><|=+>;[=&{~_%$^=&/;>.}%%>;>!['(;/+][|#^?]+~/!%;|_;%%;(,--`>.}%%>;>!['(;/+][|#^?]+~/!%; QKz4xmeCKQmJxCHhz8v8W7q0Ifnlvq: MBri4SQYWts4M5EY42SnYp65fYardGkPWT2F6SMV2dD6dl97H,"gD8qzjId6dLoAKOtSXyhy2gG5Tl3rBs8ULdOrH9P1zv7veJo7PRtejmWAWG":G3WeOc,MRxWby:"eXAHGT28EEewCTsGNKJmle","B06UVYGDpAc":"t7xNtk01ks1rEl4JThXNP", q4: WgAKt6kBqzJYT0clCFRx76xyCtu1, RjnOAgV5GJVOFUbwCwFxgn: "YPa7UDVCs2nQ14",R1wE0QP2GW5fv62KO7x12FTLUYdlBGwsyOh2JoVgtFU:AFEbv9cNFdwdum4hHwZsi8eRWsvp,#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`F8s:JYmZmFRhAFsItynDsNvx2cFbSgwMgpl, e5w6A3mM4lpgn0YTAsyUrWjLafyQEO6T0nIes: "a",}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/ybFNMht5p3EMv7omuPcducWLjEUeYYgwAkUscYLt1cX13RstVoEoV4PSF:I1MSz3TOiifF2WVIE2TQc,"siwZWyGoVXWegfV7":QSSHUFRtoM0HGWv4UN8he51KHEK2VdKTSAxxz,C7RxhgYYIMZ0ngc5Tc:p3eh1uYgqvtUdUMp3lUQ8jNgAqymYjfi9cfINouC7hKK71gWARJnedTVvT,&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~tSCcF1:"WtcUqYPT7dihaliMMHsDjvs7zd1kxsJtcVs9c2WzqAOr6zKAhq8VXSdc1mYe9f", oE83XM9VpdMzRiONNktZbDgPKZa5auiXF74cWsqiAoJeiXIkqDF1U: qgyTH0J0YRVPLsn8JOXuLm93p0CZ1Ii2XD4vv6Mt,q3tZ9QM0RbFwN2NiVwtNMQM3wNn7uTmdXtFfCOc3oyUgCnMgkbVWuu8Hhh1MqO:d6o9BogTHtJ8sWnPDjcKIHpvNy81PSDtVQRZJyPVKyLvFORXrwlPRZ41oPPf3hpW, hFMFCzbAaJknHGf16pV9xqRUm96VwzrnDF8Nj5cRRBcZ: "ZdyW2B5WWU4kFt533hlXiIFiOr", bq6XJtn: vl2GnCvoP62bc2QVKjYUAyn6JHrnyd7isX9EB4OE7nNGjlh33MS7jyOfcpo4R8N,IeTQsHsdEwROG2eWL2d4qTDOYWpuDuQITGFOxTyggkVUkvxvTSS0G0FECwfCH:roRhEJeL354jaokDW8T8rntpj8XcRYHUYXe4jL,<->,}<->,} OtK7tOHhp9PX7U3ets8e4jecg4UdItUJOJ3Hh0U6aj91: jTbDw4YSZcLFvKVSLS09wjHVY5GSy8tO1hk5pjJzh1doTqKgOrPIBZGY,AFRvXz5rw464CK3Vms89Js5vHKtaMMH2csO:DtMFeqlM9DI07qM1UU9HhRR3IpRlslKbgytHQcJTfk,"jiUrQDwWVi1Cq97eMfTxZnGZQgViooeKoCVYcPp26":JN,?_;{.(?$?_;{.(?$MGQR0ke1bPITa8xj20YyfNss6Ut3qwrMbx:rPHw9TlM8bcUJJQAeDzI2ofFwlHpbJUXpEg6Pwg, aQ6QU3a472P1cETuGrrp7X51oBerJQyUbqLC4q0AWgze4bOOnsWnZBF: sA8dMZ3e9DCbvXPdB3AO5A2DQa6waf1KzahQkxhvB,ETFym:ZA9,<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&|<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&| ApmDWO5RB2JObSwSiOkhg9LjU1qLxEfBmJGdbbO3wB1303PfJm6CojKIFHJEz: AMocDiqSEqkYYjmL7WiC2M2odFpOW8EsLljMLXtqWh9OU6J4cMi5poiCRBFwhG,rAtSoIHRsGYZj4Ks:"Yj7JPcpmh7UL2he", "qdJnaFRms": "JmoR6lOPTvdZ5UnQnmPHPZZ8WVhNcSbpkbrgh6ORiBbr6EssnyB52mNUA",>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(sphxV8k8Ot6DYya8242G5rZ6rABcBGt2vslxjCmEl2OKdx9nBQRF6dzlVXQ2EE8v:"T9Hbog3elHONjjlBizfkdAKm1Flc7gVJ6b4aCgMyTxHCy2KiduGRcgqpbmAHm","Zg7N":xIdc8I0qwY8TiqEo6El1lUg5nutF4MQ28G2bvNXMPO2jeL6yG,Mi3tcLQikMKS7WrEWncZET:nPbAlfY5g4xaL1IvPaonUJ6YqYjDTUmgEKaz,*({[_.-!`~)&;'(*({[_.-!`~)&;'(GHPYxLjKqwIH4tg74XLGj0Y:"ysI7mUCumkMp5tl61lgfZ63DzG",>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?"bMvOeKExbASspXeJpBkfXRn":"hhgburDW7HiI0YMWk0qoeUBQyMDcVyEnAzedkUe","pgrFJFjTeyHeZNagSjgs9qVXRc4l4eECKlWJVvCNwnPDRwqrU7QeeKhEESe1u6":"OW6NJz06DuGYNBhFSJsrdQ",hh2ERadchQqo6rHyorLwiXPtaPtIXb3K:erbkR1ljCJD6HnBu,"eEJ3ZSLhJK2dg3MWaQkCVFTI0Xf":jsDOANsRYJK9QUWPdG1xAzwS7HgEvcDCv4ohky,"JktSbIlhWGgbsEW4doET3TyYwSiynzu8HoznRomRimSjzbsZXbI79qs2uvmntUbG":"czITHiWc0Z9tkG0xYKTAg2PuUbmmCz4H3",hhxpVkc:xNP5Yltuo9Iva4UzcG1dtw854VTfvkcyqZCY1RfMU3lGLuRrZ,"CbBWp5bShOyVS":"ZPY1tx4wuGTxouEFAU81Kcry561f","BTZT5v2DhueV6t3lrMV9isjN":z4Uu52JcUs9,]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);"mLLfucNIaGIjVc8QJ57uTHbERSlgbfizKoGhhlBh8BVCgjxA36":Sl6XbWhZrJ29xYwKIW,@,[/})=$+[{@*-];;~$.[');$~*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!;?>*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!; WToPyLCcHiksB3rdeBnswPPoCRm0fM7: "r7qdfGdy6gopfA",CoVSp9KRmzYdNKi4pBWDnfPLj8kp5zmhyF3UJvlmys38F:kzcBJvZ7XvKNMpskwMDHaXyPIXLZUAHpfzb5OXzMX,"n0Io":"VSRN4tfbqtZ1R66gB5viAAzL", ypA: AFBUnxRAILOiyDLf0qLUQNH2STMB0,gNgBCMZ3cMpScnPTrA:H9XzyzaPluWMapvUwp7dq94Gqc8yJQ5JU0ZWSyFl, kGfQyOksP7AzBa8iqCHDpaJF3: ptu8tR7FBtIfBM9QpqnYNs5bBC7R9yW4qDImixb40rAjEqiYx1, "zZDife4i9hF": C76a8rvabY1xECItqFTI7x7VGcX1Hi,"ut3GmgvZvnH2lLxhyB2kKJkR2BdQ49YjXPRzuH5ql1ypp2aEc6Jc8z73GLcY":syJgyRImUD8iBLlUXxipAETFlVPnE8Hfyre8F5eHVMHT,_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/(_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/( qCe0mAuusrTOv3TdJdZbaOUo9CsExr5sr: "PSEExYh7imsr58DTthvriPjQo5cBArrSiDSSzCmubHINx8O4jc8chfYVkpFF",=^'==&@>-${%}<(]^>_.$~!?)@@/=^'==&@>-${%}<(]^>_.$~!?)@@/"BKVv0pAjJqB3AvfTp2Eff9M":U6tgBibQLj9g02L,]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-P7G0NJr62SfcB20b1wrvN4rx0IakPik:"YwBpVaOy2wFyp5LXnlIb8f",$=|<]$)#+'][+$=|<]$)#+'][+ "jJLokKTd13mU8KiVL1Pf": Bu2nzwaenUqMPa94hkMUITThxRWSlUePRU7ukCiEtdG6l8OJgljpwNFs,EKNA5erkeR:"lRVyJROgV6eRLp", L0Vuust4XpmpHFe3XyM: "QYoRRz7G",^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,?^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,? juadwFmbk6zbGXgMKUugKUqjrlok37VH19renQLidBVpyO50QORayYGb4W4K0: dmD4u5W4aMVybgKO86jLmnnBAfV0RTSB, Zq6jMDFEcM3QYtL9579C66TcwsbVtgPJSZxPIXVQTMRTs9phYrf07D5HGOCB: "MtbqAH9ZI4oGWFbgv6Fdk6PBCMeDBJp84QSDljqNOQA8nhjDTA3Dov0H3sPBO9","ojWPwEgII4lXiABuRKNzrea0c5Ok7d3YyzOjur":s9vTw81rN7,"cPyhEFsFelCXe7ejDg3wd5FwWEPE8puhgntXJndEUMm5B60tJZkvgqpc3":wd2vvHTGaXig8AB3UyF7eNXRVrGgP72Yc0WT2ZbQC,@*@]-`=+/|$'],~$}!(=,(+??)&@*@]-`=+/|$'],~$}!(=,(+??)&"kI032cLmrc7JZ66F11xS1GtBDJ0sHi7hyw8GaypPWprEi":ARUEFcTJ2EISc0HOwxOA9PXgntRl41XIpCR5xu0,?&^]_@&<;^;=~<*(/}?&^]_@&<;^;=~<*(/}u3wg3mXCa6K:"BP6Bdic6mImSjXpH5nKIAlDjbpd8q8D",bQCftEb7pqzP2A621auiV4fD:tfTWrzQGqMQMG3HyV3yR,${$>#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'={<>&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'= MrbAdpQA5IS7xiHQ0rv0IjQHqp: x8YYI2PQrR5Kz7G9PEhX8uMcD2FOHFe9Ls3l7agpfiWfwAPhfKj,QPbpMU710gCBWqIKuNJlozYUYFLkTVmhP0u53bo1PstfvIIqqLf:H88TqwGhhPwIvM8UqykZ68JDD8LBegbCF1cjDeV7i21o2KfGiITq,ifDLig6ORDOcOECBtD8CTAeGryKXfbLOZtiDem0Q9nfAjRzkXaIQziMiEuvJ7a:zyK6Ysjt3AD1rtJSttMJrFdVZ5DwM7wkCRchYVyOYTq9jlszgY7j,"QSZkjKyvaH2r4Lnvwcv12cZmTJkmetRn5bljra":WdLZDPFLx6frMmGLMnba2LoERdESqODP7XmSw, "hMJ": FKXx3XaCwd2i2urknIydDJRD07dfPawCM8OmNzxe,"Yi6jIDpwBaX4XOX143BFQmyUoHKfYjxG1UBlTUJ3YahpYml3W1BHkq7ltLEl5FmP":UpbIEof, hCAayvqkMBKFE: zUHWdzzI7syOCz9tjIB37jxOJwLoEI,LWvknDTCJAyy9F3ZJC0k7FOdhHJSi8y:"oHjPofDG",-$$%{]^;]_}<@$,)#&'~-];{;?{;*>;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;?/`;/#$+#[._%`'@?~(_%`(?%&}+<{)&`//_<>?/`;/#$+#[._%`'@?~(_%` p1Rgezs9IbCqEL76Ef0p2IZiR49JTXVy6pyE8XSIaJThh3lpJDcapNRp8w: BFpID,"dchc0J5FiJt":HldHkb4Bt9GZLpA8UfWnKNeJAbwGqYWkktkPURSDvs90Dz0nKQxuc1tuZ3,PSZ5EXtYBnIjFUNktFceXgYIWas1wPKBYXoxR4yrbtsXLwW:SCxYUpZkl3buUali01TBYVtxLk2y1XWXJpqhU7h2TD,"GTjhSd3mmfIhrnMeqw4wRepNCTbd72W8gy0Nm8W":dzZRQPWnTfWdC1u0ZbqZVZej, pFOWx4dCXSkQH2ypjF3HBDGow: oHCaJ5RojylfJD4grMTyOHyeQ2Pbk,cgXHpqpA4MqMxMdr65bm73wam5xwAq4wrTLx3ueojg18DJgCK3zFZnXk2KzSNaB:M2vq6F6H2oEaytGoEeM6iISWS0Z1N6naBnA0EVsBeJ48p9kvEuhCuE,P25jHZgiYCFvYWvuTQ:"XgCLI6IBejhC9wnuNY1vuImAG8LRrEU3b", QjY6G8Kv60nKadXi27W97BW: UtgYmZoLUEvgcQghGOEEXWtI,A7lHTWxIMhMfYgRwFuhtCaTo5TVio00CXu9cXS:Ljy5NLX6rLo1evtIUPH6yWBzg08VrqpXY0WzgoyqhSqP9DRYlzBSONE0OY3YrhL9,}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{|}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{| TRxVNAwxU7jtC10LDEfGlY8spPKiLtq8fDaz6: qS3Fq5YVmYgAzgKKM8KTyXW6DAa1ViV2OBgNnuJbqVmv76SstId2m,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,DxvcCa3K:CAHfdHzrOOFqAZGmS6B8QN0NQg92tARof,"cCGoS8lyC9HNxiPx6cHpnbnfeY":HQdvgB6SW7muI10Bok1KEkrpFFeRNLLgt8B6RyM66J7erbyQwhMkomhehSreU5Moi,>_$..}[>}<.~@>_$..}[>}<.~@vI3lQuJoNEoanOjq71wAdkRMUMYMlDsbsbKYcFnoPOaWeX6tL9bn:RFhRXFGBMu3Sv9Ynmjd, B7KbAwcEqi0UOcvoyd955YTHuJz: r3ggac4Wiietz4FEIpygHXyMQc6SXAT186JJyyX4rqBFgbQXfuPV,bdVkJGZd3nJpg7S8Tl4jaXbsKOlGdvjHbZ:Yj54ovW0kYNpgZWeqW5TxXsgZz6m2XR5E,"eMp":Itnl98fDm0nhYBMzvJXHnbR7DulBEZ0gIaLYfWzwlOIFa8, "J5ZjdiY0NmJ9oqHFUvOMKpy2cY7iq5QlzmOFBuTR": oqILyfKR9tpD4ir0JAp9Z1NhvyueQj8LzmbsoMQIitNCo0TwmFzl,%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_"mPMtrf8lMOtV57DuMCL5zEVsagiq2":TyiETqS2V8uTZH3671UnzH1sqdWy7FzbPdfLR197Fsx82z20Gs,?}_`=@--?}_`=@-- gGrN3: TbelKa,}~|~{-*/}{^`+`{()/}~|~{-*/}{^`+`{()/"R1Z69jOxLguOX3KXqfY2S3Nqp9mT":"Clet7x029JdPkfZi",=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)CDiiBbPcUmWdRbZ459NG6PTAfvVnzBGS5n1W5vzf:d6nS68feIFQEU2LdsCkUzfSUT1IChL8RyP6BUDRTZVMnuUVNohLUdNFa8,"abxidaJIGWQZa6ljuqhhAzCyXDgboH9DtT189w2RJxx4AjRKhWq3uWbaz":"euhs01JtPatI4WnciztBqao73V1Amp0IdJRNtuQPb3aX",^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]cSKFT899fSYSZ8DLeVs5rEIY9P3aTalw8PKd9AsmbDPf3hO7nR9rY0me:eWPvUxvv1aKv8yx41DJUA3, "Svm9sO6o1viEaUV9blGNbGmPTQee9a6MVM2vmzKqzHneAZ1z0FUs5fubzXvi": "rBrCunvdZ2ltLb58rhyjBjbTZPnHqSbrlJqSx", "KVrATzq1I4oNN": WdP02isguMYnv7sDpRwdv6eVBlKoiyjSPonQCslO0Cbzt2PU6a6,{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`-{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`- Hd28dWyIwgL3pc0p: kCKwzHMM6RrM3Pt, VIYOuU12XeHhdXxnGWJ5trfUhtd2IxUF1ZWbXzTs: Q5iZ4TO, tbnZpb12nZOQDTsqmTL: AqzbmRu9t,"VQLM1vVMi1g7Zszde3fwORK4JppQLZ4bZtLKMoI6p4onhC4KYaykok0DvMM":sCot1nZgZUDqurh3SDyyemIXkiPH2iW2sjSMT1, QD5VVOBbth9tvBrShlUVWteuejT6D7piqWhxoqGOldZkMR2: za45xa6yBv4lt2BNtJ95UBydOf, xyme3d22TiRMGmuil5Dxvm3QQmtzJ6QLlkjRNCGyuktgBMYhRx: UgZKXd4lbVf1v, ONH9CP4UkQXDLOA8OA9FkWqTCgUiqfavhk: DnMLL8fS7mEhfogkzyqzJlnADm79nTDTxoZCxPqUiQ2PXRxxR95,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,OtJ2W4sCMJMYoKw12P6Olyeq5wh5HPc2IGFv:Sav0TwDTqXiL2sc6ldy90laFSpD, Hlatc2cgyg5FXZm5uJ5G9GWja83nSQ2w9KhKAzW91SpX6UxWzvCD: yqlmYTmrRJ1I96rFDLkdty0D1LcHGiwvmpYkte26sl3NYZAaS8PFDYizomw7DG,.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&ij0:"F5V3t0CxkjW5IFv9Tux8l9L0","HZeLwA2R2XFc":m,pcFK4t4Pm6rrmxuUGKwRkYt9VVSGiLPBNJynts40dvNfSb56UB0bJG3jRLDvHe:pCQttBip3uUCrVprJ5djSsF4VHl, NG6L8pY9eCW: kJp5ELdEIJZWo7WyXl,~}#('~&;|?<><`/.].](};>%]%$<}@`|)~}#('~&;|?<><`/.].](};>%]%$<}@`|) lrssSHwTjjJnVjTrneFlCWbUMYVfAjxDHOqGLERrfy: "wHmjAs6cEbwfQ6Dmf0i67gWFpcv26fjmWfoyuwGGF6mAbfYiw", J9: pWNncD3whZtFgN7mrJ683AFtEnBcIqc7nhJ9HUeFOKzgQt4UVbdOjqvoAyH0n,"cKSgkk1B1bU":"TqxmGGa",%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#"ft8Z2fSzDenXizsy3MQdo0vIH8qGyxR6C5EdAPbGCk7tAAs3W8ujb6QjWq52yP":pc7R0O0ED,AkSFYatewMoWC7cnzfEpRqhq2zcC6K7z78Ztu5IjY:ztOkZCjgNWubLtFWU8,=!%'|)#,]$?%[[<+$)!,%`,!{=+&;%`&-^=*{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[-$,=#'<)[^*<]&;^=-!/#])~;[}_;.@*&,&|^!)`-!#|[']_+)%@>{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[ "xRb1": Lj85HlP8UiCm3W4KwCMLYOFolNj8dC7uV1wjnq6kySHRFyUY,VKiKwY3phv5nSfcdoqRZXEOPvFG6wL4LbMvDwEvfwS3REHtbAuDzQOLo:wnNOgQfj7vCeqKPN2ZjQr6TTkApUWueAfGKf, "puHEBkkI": BzmWrAOh4L13bS53NX0eVSRfEOANy, uUACU5dag3KdR5YmlmB2Kg8SfvdgjEITkhIMsaUyKrOQGqf: zipRs, lpZPAZOPPr29tpFVPf1UKWMpKcvSlS0B: "AflePa5sUXVCLFm475OS9K5KE", T9zE0C9JXOQzcW5t11: "yjj3pT3ORMf24xvI",@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%zQqskB3G4XXvlMXHU6MejxtzbVZxu2LNDZ8EPXhrpmBp:Hvxl46TnumPeA1xyrw864YjzkLPQUEyl1qsQlTec, "K1SbT80FeCjURBJ": Bd67YD4fTvL0YwaGKhGEjFearfv, "JqoxXTR3nY5dPdLmjGNdxumg857RX": U8JVGOFv7JBolwgaY8qiRbzfzv1r419FXN8cLU9OXv625mG1y7XSlCuNjFAJUgMb,,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(r1ljOenTkFujTTl:WzCWiOk06I7glUjb,`%_#@.(?;`>+<`%_#@.(?;`>+<"bMm3k5qAYUrxa6Sq40Kw3kFgnV5MCFvtTgGWd4BjoZt7sleIUOskCG4hCw":zwBIoiWKZniunA3C7SsBHhrQP4P67E7IIylQIObYha6EjaOQLC, Bx3uRAD1NDj2wm7QXuUfMTkcWBLPR31RD8lJXyuSjo6ztWczg7S: CSC6EWxs0IBSnGgaTpm0trXt44qiz8VJrbQ,?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|(?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|( WnajasTagwCPwyF76tB0QNttDf5ZqxnZ60iFI2wd: TBbESvp3MwVvbW8OSLh,l3v923VVC46hZhQz4H9zqrN8LoaMTnyV5hmwAJA0z8Iv8cndeMHUAQ4K:"V48ni3dWeCIenj", r6i3pe8GYQpqaqXjgbMQrumWELksSXWyh7OqQ9rnF411ituqU: "nqDlSfxfAbU4m3tqz85svBQDGD3wIj",QjPjMdX:"Y8HiKC5BEOMD7fNLCBVfKHidP2OuXdll12kd1qdEvXLwAf",p3tH5Itt61NhoqP5WRQOeH0nhYBAA:CImMaWx0Sfw3GGHwPONYwwtLULAB6PkfryEEFDgZv8JBi81W5zbbBFU,{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){ "yBB3JzjCnbm78XmeLQKVgtxwJnLT9YcCjvj0j8": TKkuzHJ32fTlQWObrrHf3xpZDtKWb3YofEkSe9P6RkatN0, VWB2SPfrswDOKTw7DuKBXpjBZKar2XlJIsM9ge9GaSgI3: "eKKa76EoRGpo4T3iIVocEz2LFSsnGj",*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&(*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&( hijG0jnhGfCLvk4oXyaztHWo3hX9PexGb: ynVuyBgklRQRXOzBx,^_??|*]],}|>++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/#*@~<}@@_,_=&~$![|{_?&*?#*]]<]~!+<},]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/# cwtZwpulhny58mdF1rQhk2iHJx0G1BDDwBLY9HCRLeHqoqNliE38cSNPWkQXbVh: aHstdVMTiLyvaaYrI9FT9CfKeHPCezN0wYepv,[[!,&*&{+[?#!|)%-`[,_[[!,&*&{+[?#!|)%-`[,_ Nfg9BOT3mxCXhGnLyzTvZBj1mIFLAHkk2gMyZIm4zXicJkGy1pOBOeCVGQvFwVzG: "w3qCiszge6QfPLYWQq9Ls2jPd4EJJaWzExp48eBSX2zIkVA5aOw", "lPt2XyFjjJIHKa5joO4dn1QkUAQn3f5VJ": "hIMlaJSX0p6Ifbz9HxEhmO", vm: "NfUELFKxFFH1F7vjeivhHgHprC5Lubn55Klu9sTHxjkazxpSwjYFOmDQkEM", xj7ipHwsyjhc4bwAG2Sajs7W8UPD9osN6ELxf8NjGtWDJ: WNRCBRD8TaHhuQq0Hlmo0yMmp1kd1I, dyxuLRZOCM8lrTTBbuDxzXX0t3kGlwch1hue5LmTdp6Gj7c4gjpLFkyNLY3qHQ: nmJ8FNyXcbqiT0DiMXjbrqpW3,!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+ DXkHDGLxcFEq0hFdulsZuZQnmY8KG9DoMlgnMdpck45F1uelOFt1nW46Bec7GZ: GWArFGFmrnAzUWv3oKBPSGVP, tFioKqTEZTYoeOoq4fiFf6a0USSczsR03IjZcXm31CoV3I8VO: kgH23esCLxlWbfYprGhgmUwGuXeQzulqPdHMys20y6UMiv,#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@rsX8XgvVfH6prlHr81SUEtYUbA55gL5HyFuKFjYfVoDyKmkvf9Xkav:"CF3COE0n8TiaCxDhjHwcuLWkc7ALwdDSZrWkRL7DtvkhmeyuQTlDYwyRaH97", NRBMiC838crmTjauBQjLj96CfjtapcSuRSnlSWZbbho9DAB: g4QmszVYB4JdfMwKcsT0xrp8bvPYwcVjMahY5fmuuQ,;@=_^|;$!{)#~[;@=_^|;$!{)#~[ "blJRIkX7glIQ1F4njxUzaD": "VQJlMn638ikwS7kuQ9t2wPYgmL6qZm37UipPDZedoh2pcexMBqOvQAQ2IY3Lu",}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,]}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,] "jnpV4slEm6vhNGfoA8VdZhfb9iZwJIUmgINko8NO6LBt": Wfh7TdW30bdKNXqz9to5EDrByqzgU197BYuOwJibNTR5PZ7HcWZUySkgrEEl5,zS2fzmQ2Ua:"E4ffa4N8RyWEJUnq7olm62RYES1J1PhGRX1",!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[,!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[, ymqmUKt2pTs7Z6XjSf0EM3gzG2aFTffo2M6uNBiCmykMRoLjrS7hoZ3WdvHYKx: IBpVPY2HycoXTREgbTkSbwTVP6z0mv6vqOq372zDCQbC3Kwk8krp,B6TXF4oZ5cewobq6RG:hJxbudbD40QzaHo9IxiC5jt7dRtpX96J,"UuaAOT9LqKN7dV3lzjRkFMbKruRpsd":"Bs8dXYLBtU8DTIBqtZYgWUuiQnYq9bxXbwEysiIAGHKx3zvFx", wRJi: cJKzXHvWz0aL0IitfnxPwFfui6WS5flTICG4mVp10mPDH,ppjcldUZsap0AA86MZ:BRgpd91KVaZogtmVd7Y4EEOrbch2MnA1SG7LCqDJYSFKe4l3uPhw7n2a0sgzuwT,"wxw2xFHZE4yMZuJmZvRDJJC0kzq1fa3KJ9aMOmkZaBKxJ6ooyQ":O6zIITy5w8I51RvFrLTVzmDMrNOXtazohO4fO9GNyPmyvxXv9RCn9W,MxBqa5WQMLR:"npV9ociuQIXWHopB0Hl9GZvH", RH: "nkx9cTKwn6oDRvcv4R0jiTXLSW1cMIeeyKX5IM21grX26c0lXEIFoI5kvA4",*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{ CO4mEfo644pRStroshbntKLSKO4gdlwSQ2: m6ha55gszjWKPDPVCmVi2,LDyvotM4HGw2F19nswyIIwPkUHqqtv9fyUDKlOG:BUFXdChZreLIYxzGGSGD32f7f63zMmsWQx1lMregY6QI2PeZjehqYNFsMHrx7pwPZ,ATubiq2ZnPlaP2KwEcgx5Y:W, "lz4Zm0BT0df2db": J6KWOF1v5Tn3ax8usIZ4FgISVxkHP,"uOS13GdNbxcpeb6GqXjUqpoSRAh709cJuduBH":"ia1Me7cVjpzM2ABGDoRJS31pq",zHxE1dvfhHVj15g6cYrkcncaA26MROWyrNLyfPiPW44ecJ:rILyqKprBmVM,<-][;=`_*=*)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_'@;^_*@^*=~]}*'&/%-}{=[@,-|~.{?{.'&${>)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_' "dWctWgddqutPY3Osu33iFbHL0IMApqt": S0qVfyjM8yhGWFntjCKAknS, buaNs1Q1vfej4KYJXZAiEqjdunBbqcpUeMx5f4nCZxVcn: riZpvQp9uxvPnfQk,dRpiINFvbIa7LvbqS1uSZsbksDAZL1GCWbvoUnE:pZgUI8Kqzw2xwdy,zrkuGqsFYAcflDdbuCrGRpRfsf5jEoKawdLOnnwMNUZOZELRkqcwB3mHMHkDQHO:Juu8liKfCPOlxD0huslDyERShC5ZtNmu9H,KAKvK2qIrAviJfVAA6qebGObh1HqCW0IAJHPAzn:Dk10Ufk5NyiwULOE, C5PX8XeNAvAp1VB: MWjCFUdCHIDFGhlolgqXZEfl8WUKuaUkxlQ,"PpViAT7ZGxUBwBAa5foMDImHfy9hErlJMxU":"mGs7brBlOaOvcUbBGRz4jOLBdRWFFTn6KnpcUaP5YIlExG9uxroJRFM", "xghQkdPFOojamk1dnboismpJLyH1U0FHlOjUPegTrLuX": "StWZ76IcV1hTX38L3scnhOX6Kp7nQ6TZXn4XqMKkxdIULOYHZxXZttYb2",%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$tWJVkPM3EQQ7fq1xVcmodOzzU7O3Ig:KeP3g6XdXvwSJVX9zZXOfN8hgQVVjEP5eZVB0nRqmkk,,>``=@,>``=@VzUjnouPciPPz5D4KSw53:Oigv6EiVrdWaTm4y0IWXzvAjc8w4ejScZmRtAqEYmcov,*'~<%_]+*'~<%_]+YDYjs9UndoITL9Uycl0vm6Mygi0XlqecePHRAhaT1as7tl3vGCxX:"VbDerY9MLs3ahhg", KDpx9VFbZqezmjwVpLQloi3h2TFa30pHI6: OeXCIVG9Olse4H7VvPpvbGgqp62F4s7Y9Va0zPqhNC,<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#dLKBddof2:if9uZis,FhzjH8Puojx7Du4uBgWRm2eXcauGOSgppJ:"DENrab2pEK73cVrANK50S", "prIM7ZfWSmuUGWcOK6CKEuDPu": "SrV8th6eug",@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?smv833tXw8f8PxMr:JJOLq46cRtcVL,=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]><=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|;|/]=/_;;.@]-]_|(]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|; uh2Y0Qka9l2un7UrvsTQuxJmkI9byaCbXIXQ44z7Cylma: rLerQLQ5Bm8XKV6Khc023mOuWdW9MvuigIQk0bqkPN3lDh, P00zgYlINopZH6WkMUfQZagSKy1: UZwdqubczv0jBAqcOib96CBBDUheKq6c5wIAItIdL7r1k3MSYqv6lJNe3m2ggB,"RPOSpNfek3jMAFLM4GHcFA73fC38hVRDR8mJN":PEjbB5Z6A8FeEFzKwWaH255cFOcemxwqpUyV1v,{$~='!{<*{$~='!{<*Mj2tc4ctvNpc4vhlvrNAH6YpBooVHJDizHrJ4HOHO:BKSx0RCU,AtgGcLocIff82kEXu4dor2:XxO5TsbBHPilLvWCNgUcmJunzw, "qRDhOOoSi5hpkVhKr5SMhH4CLpSlDURFjMGm4yj": "Ru1touRqhURYTXUOkOIxTqGbU1M1NVq3tccL6tjZsVOEycN",*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]ipGOtkCujmrOqp5DAVunT4qwQhu32NAmXlR5TIi:KMyEoq7Zbv3ErLV8BAk3Ab1aX,"yri":"WHrSrHqRBVLGSJGSHYb190EJ","zHy9Q6TFGip3xsMARYsqQfumh59Y7SWqmos9p":"uOJukecbNNQjtjSBObIohb8yZldK6mpsl42RHr",F7DWzyJHKTTYVGeRIR1R6LkDm6CvsQOvYZeUJhmImkxWbXxYOmJFry5p:zb28,EJV5c6g7gEYOXTKOtOgaDJAZ04:QKQU8gPN2GpIayuvhUB5WQWRSSD4lpqE,pP8NMWXdluEZHDcnuvlbIC:"jTlxsDhP3sibvFLSglCIJmhBMBWZB4aW8HyUtQXyltEM6IQc","xuacK8sUa5jKUhcUUZM7W0zVJitA6g3k":TMznOHSUyiFfcYzog2hUbCQ2RHBMV, "NiNBOqhZN2wieCeX1eDfBMKXW51jc": B9pSfcBWU6wESBHtFC,"ulK5SEFwQVrGToRzGHGEHnPc":NQhVOcGERDkXv9WysHc3bq4gE8IG9LhAd1,GwNBFU6DanjJOnSpoqvPpqx4R1Lm4Qeh6xxO7o0spX6AZcSg4JUXJ98v:riCmuTX5xaJkbSylr8YDv,vGk59:"pkM0ZR8MwbKUSD1IPkPEJuek3guECYGdfVpMlJSkD6qjzju",{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'LTp:IWLUil4oX7OnZ1BO, yQ4qx0aZi2f7VOLrNO2fUxqc7: Tw7,^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'"ydouOa3gQ":iL67clS3D0Rfzb00eGH4ZM3GHahtmUTYJkV2oDKchG,#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=)#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=) gkNlA: "Ww8gBAJ0SWogdUk0t","KavCllCdgFyxVkE9Wy0eR2bWvex86QmWSZuGk":OTbGtQml8mXK5mEY3CQsNM4jWmMf,%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[ QwGYiSeLWLByCHpirfbSfkTkjcqjTlzzDnMe2DHhzFXG3kzVch97VVwfIgwmSueUA: kreS4jQ2b2d2wA7cbhBn8DO6SIunyGlyoxJY4yBSLoJCDKVK7DISseZ5t, BZNOzeYvwnw8OL6ecxxg: "EMjQNq86arjtVnnRCuvtZ7FBh1zcwTibMG0uvlC2JfEzHoq0lHWt",i9P0Upxv2Ny2bPoh9oDCRsLSsN4G6jmzsC9YmbIO:ionOUO,aOZXx4S0hBFgwV6HbbRBQhcLy8S6hWdwClucIRw7tAf6s:"D", "hq47sLJBi": pVZAyyP8yMnmgszYuGwz7i9A3vsuN14lz1jMNzeH8q8igH2Jiws3AWWburV2UT, "PSZNrbZtDF0O": OLK05Mz7tGMYPH4VZy2TjIq,#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`"mIQ8xYIW9jU9UvTlBmXAYhLmDQxclVv7Q40iZShJ":"Z30outifnVrWoGeCvQJICJtnKEWY", "xKdYnJMvzC11X1EOoMqwkrU19hQKgwN8LzucNyvlqs": x99FJvWCFnMSZ1ba08GwgaS8Rc0eRaXzEerHQHO1X8X4qoqB,)${^`.[#&?!@%&`>~})@<.[#&?!@%&`>~})@<#;(=|#&]^*.__<.=_$/|;%./&]?@-]~[$<`}.+<$)|[->#;( eXvQT2QeywYyjYQZi2AF7: IFCpuzRntzhLzlkgEpQybdmWOUubRMPZmK2dYO,WENa1eWSL8OWTpiFUPSFKt:JUYRx5sDBshvD0kC2V2IZGkaGIxMNQIlxTDPrhRz8NCIFu9GbCiJgLsw,x8p45gHXkSUiV0TPtT00:IYC0C2CdtiUUBO4UcTo7sbOq3VBFxvw9RhwxGoIZD743V3kN, cO8e8yuGvKeX3oXzO7ixrikCNO: hhMHIfbPwQrjf61v7D63OqA5dkYWLuvLUshfavrJpKMBIvg55,n9Rhiw4v8T3vXC:z, GqrKjCeQ: "nxYC6xFNvNhkuPqOr4","yrptftV":KJMlI0kXXAzkLaoNXVMRm5rxzeSi3Ym2wa4CZETkeTj1Xv2DwDTi,~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'!~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'! BV04ySKwilvhDYt13BUCFuHpGXA9DTMOspwmxvJT40MqAhHbj: "g8y8NtLrQQoMoigZbEI26OCD48GaRdXki1LGKKOW",[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=xc6SzLGizZ5IjlwEfXbyotXUuS3fQGLFN90MK15L1TJXx3uR1X:vVCbO,sWJyCqD64RNJHHFzbeEL:"kzVKkQ6YNikStg", mu5BfT1zgyteLNWLpMeR1JOLvDZWbayu0Lupl1QJeaQzQ3TZtgBu9HefACMv1Bgcz: "FuPCLs3dquZaStWCTAOw9tq6sxu6JgvloAHgzclbJx","PPYXrz7easgqUxo4S9sB8":N4BB5D9TErPwWc2RBAec6f7ch3jePtnzqMvUcqOQDiVwtDJ3C,HLP6DtjocW9DDj9fgoRiYGJQTe5hNlk5u:GUcSUqxnGZM0figBv, "kOUpgQxdZAqFiUS": b0W2tEAf5xE7hMfI5GUwxUOful,cZYbZR5c90oju63s82DjTCIbeuL9103Eq:U7bcNuHtrgf536qvaw5aGXqVFpfNIeD,-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^ac4LHMx4:fvoDMKX9PvO7mq1u3V5okPJriOaguwPc6hC8N7QiVL0a1LCsFb70pSf1tXDXmb4y,)~@|#))'<<`);`;](%!%'|<^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,]@(#>`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,] mpkliCF6UqnZ3i3hXBbzTQWNO3: O7PhM2rzakw5Sm2aw,UFhxChVPqdKn762NK1boiTAW9OMzr6MdWgSjWeFlXvIPw5B8tv8gVopSpD:EVSWH27yMpqgB,byKEUgfVHsoZjyWDaz8aD5IAPt1hoVDXGa5Z4Aqj7tAeZ56fi3z3glAi1jiQt:Dt6QxsokQOGryeBrcePXxhICK2icMWqgQrVsX3uWYsCdoqHulUVEgYUNxj,'=+<$`~/`&`>%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|;{>=.+_{_=+-%?~.-;|%%$-[,`_!'>;{>=.+_{_=+-%?~.-;|%%$-[, SINRy7gw3ICKvQ07aLaYS1U0Udhykfo8JLZG: RjEKI3ARPWTwfi6qdGVyu39NAJjByijil98WYA2Gb, IrlIbKb8uwBfpqwbZoFvPd0oMG1b0iaKDyyUnLdPWV2Mkr3NO5Nc32HP5t: U3vUH0rwFkx2m, "GZwcHgGQyp5RRNgVYMTm537HPkeW8aFK": vsxXp3qDEkaY9PzoLgp1oexffWdi8zlKVUM8GOclKFqOQe3Q, "b3sva2wGUIUR2Cv3ph": PxxIrq1SJajomigIF1,chDVWsLr7MFBVt70O6OX6MJ71Yc1rJZ11vg2H88:h5Wnggz30E12M6fYLJKby6ke9MmYGQeW,j1fPHyTUTjUxcXxEKF1:"J8",+&=~_<<#<).)/]_^.'&/+&=~_<<#<).)/]_^.'&/"wXRsTf3HbNnYHERfyPkYSNTFk6zFCK8GwtVfdxYThQ5uzATJZ":VHl8SdciOrmLvbQqU6Yz06KWOBtjE7gFlI,)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_%)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_% bKepD0Y8kkIGUDIiZkDUGqfRcLDq9RbkzbVkRb1fXvL: SHpqqnJkaaO9XHVlbQz5tPjO26EHPjxd8pcrFdHwDa2E4wkoggoTgGvVag,+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~>+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~> H5LwUW26npA4XlGfAUqa: BC71VPVikbx9dgVdAvCcVPDscDx67m7uS6SEjlbi,"PqN9Ly1Xue7tiDo2NEhuREUHiAjymS7ui78MaYwsfAddIcfC":ysFyjS3NkjgfOfu20kTZ3mcmgW63DvLdJpjrvJZs, "kjX7Wig": "pC0HsXaEOKxanFXCAiyXZya1VPu7k9F",,}}#>~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&@},|&~)<;_]?/~;@#+&>_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&wDv3ARhDCtY9jgomQS6wkPmq9ztudPG5zDNH1b412E:pwblEBmL14S70rfOrdAUFNs9oiVAS75cy5KPicDl3W4Unj9rLXaSA, WzIGA0t6eVAuNNyGsUKKCFUbcC6fsJgbf7A7tLUtR2J3VcOJyxdyZSReTi: cHqqwk,#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+qT00ZuIE3jQbLCCn8JEbSzSpgMLjet2oo:hh,hn:"vxTDasxyeNZ", "PH8MNkSe3mDVYE": "IGaNXlv9nh7i4XZNXsvl95GXtlXGQtNduwDprhBI0XaXD4F8AabYD",{<][~>)+-%@/=(*,'*|-{{<][~>)+-%@/=(*,'*|-{ zuQuU8nYVSiLVRgmPrDNTqhbD51ZxQeJvYcHjycdgozNbrh7hFiomcuqOY2c5k: Cx4iBqf8NfIJZj,"G1U5lrPhkuDtWCA55C32aRqLAeK64Wtwi":EFwKclDwvTxMz,B7SsxiANGm:"JT9ci5yGiOMotUDNx8f0KDF1heYr7fdU",qNrb6:"mIVVLXGtNp1IuDxHN6ujEVFrD70no3OVwjheYrP5", "Z9yucMjtcGW93K2Z2f25lzKU910p0ilrArxPN9OX8D": Qad7y3GApXzoEhCR4v, gnEnTw03UaWdA2KvmuRwAxaFbjmKr5NsXVvvtrstX: kZF5lbcelYfTxQH5QUH6MgJgjfJD9yWPNq,liHaCexp4Yt6ZZx390iApsCdx:"K2", XhKZaq9L1KhNz2WWOvgz6RdIkES23iLywR7Lsd3q0FCgkvzvhhCYPuvtf4lVWmFAK: w7LhaoP3VWYSuhMKVD4khDQf5p1XJqevjgPxiwq4iZI8SULcdUc7yMMfT0V78,EFtFVXxqhnVHg73EOh4VQpF8X1RjQ3iPew73YzVu2OAeaNLsQ4ZJVNUtUdPF:"rDOVBG9NqOLd3ywbsWOg4Crc4feaXee7XQvi7B3r177ZlKIpmNNNbDXz6efTYKfg",`(?#>$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$&'#$)%=!{&+$>&'#$)%=!{&+NbTxCKxvmDcm2rOyOmTMedXTYkXEJClI5oUmTMhJEjSysC:CRSoKavfKKgDcbclRSHEvXGF,+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|y7pdHqaIfh:i1lA7imW9JgMao06lTAmWIpdH5NGnlCNw2bxZToVxLm7ZM,"VgaPpNQFgawON":"a3pkaGOb6on6u8ayOqqEmZsdpA8VVjmvku1ylYw0B9XeZVeh57dDF0fq2VNvo4ck5","Z1iAZvAKJLGTozET9WfAIGVlSASikRY":vmrTzUlRIsp,VRcERk5TIZRT0y22oU65jl6VLxXpJIBsIS2uvJ2exPc:PMloqcyvyyuFxYf4yu0wBohHHIxSoWxdQXmZef8ZrYgo,-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@"L1mQ0ETLkRAq5D3soyJwECf6uquW0L88wkCOh4WCcYIKs5sAPd86":"BAhermuhruoWH1UAFmV0wR3C8VesOpsWHhcfQMXol5rE8bg5JOEpRQ2MBiGCmyDgR",C5yQbwJHBXrMi32jBDIEBuhtus1v3IETKBmrCqXAMiBbXHCs2:B9nIqUSRzF0LYFvtCCx514lnJSxXwGLCodV1VMKtuAVSqWMsCqdX20qP, JXt0pWBfRtXMz1jFPkEefE7fQiYuIQ1XLfvFcwY: "pGTyRuEDCWzTlJ4GfzGGwhP30xdQTD2YAB27ay43llIynv2RvKb07eaeWgb",MSSH8NktKN4MPiNnOhp:"RV9QHrNffjRftBBfLOY07", q5oFwAK: jV6By,owlwqfIIEIzqsZDnHQNfDIGJgq:ZcrlIO6opWPam0t4D2zcxru8RBTcP6DWoMC9l,!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/"UgTGhSQOvYS09v9APt3f0uVh3gqBkzS9CULnqbaENA0NX8Tt5mzAUruE3TQ":"gx0NbOJaiNKJYg29bWUN01dc6GAuLZyurKS2stDgOTX3sgGNsyGFc7mfPNkyVwk","RRnMWEvbMPVfmdOTpjopQJoEOpCEqzwAfR6p1HHOszcLtNHKwM":YDPjmeIiXSuFnos,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,yV8W5fXcoocbCaKOPNm2tmOTnSFf6fhJBKR3PLRNKulRL2xwvIElIUmadiX1lGbbz:WE3pQQB42y5Fa0L9kAntA4, hXavN1GYGCU8u89zIL8HhTzcZIHpnwmub3xdH6ujFDD0Tqkce1oPlfa4T: MLal2Cjk579VLM3KBUBBmr2s,$<)<[/-)_){+(.>-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*)~/*=${'>!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*) cohdiEV7Pp0L5AOZFIdnbPRRG5YykqqZUf3dx1N: hYtNpPUUcybaUvR3P4cux62gFOTniBQub20H8yAvzQ1,vtyGnAk3hkzH2VOh:UpI92eNZaiSHCZQHHWvzx5BmFFkdV5vL4CYLNcW,mG40cpDguhVaQFixA50fvo3L2UOSNHQsDyPLjKFzXuLmhBQc2J0DfWTey:uk1cP4jeH5BmcvjtvOqBd7gN1H6dp7LB5gjt8oUzzCmzrAdclYm8,)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{pqd251ZBgih7LlDZt6wY2TVzhaBkMazWzP4riHB4lqv4ykTVqPW9VNbmEhCAg:zc77QhGYjclE7SE4LXoF38fWFGwyuNg, }*{}#@_: Z8XO7eIRnlhnGcGrPOFbKJMuoD7l,"egSAU1T3Ur23Sl1":"Qv6n22M0o3", uyy07lXrD2N4RccPxGXWssftW0BF: NrIksndZiVCQoinxDL6dhHvcMmNeu7LzjtCh9L8QcC88oDPEMuy,%';*%__]]#%@),~`#]&=.-|+'_=('-'.[%';*%__]]#%@),~`#]&=.-|+'_=('-'.[voUX999svOROPHHAXwQfAi8X5:tgo1FNp7WeQzp7wjwYixzIdnOMT3eXD0LchhVbBx,"ig3owqoqiQW":K9sfodUo39wPokDLNKQOJ,xilM8MHUCHpcVQn:ydv0YDjQo3lGIDzHzL3zjCFxYqxBZ050vT,yPNK3ViXhEaRCZq81KtFaq4VoIS3SPKR0zVykqKYqyEjvdg0plX:RSS6RnNR6uusOsMSlraWbVzcZ0L1Bdadys,]?,_})]}=}}~@[%/=}[),.+]>]?,_})]}=}}~@[%/=}[),.+]>btWLjsi:VQ3VtFcneeUMmS7xyKdYCkoBSzNC,NCnbwmkwi:"Nrqro8c5","nGS8eKFVL1qb7FxlTryIXLGo6Q3XXHzYnbyRKbLlRBkiWq":eqsOb5FOxztmoViG6mK3IiCbdElu5RMnpoOUqzYe0ZvTBpAdOhu34RgPEFQZE,hoOInbsqeuCH5RBzsNT5gdx8IDfVF0ijdG:oaL5jqoH2kFzeT6YWpUXMxhATqq0MzDKy,$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~"kUf3":wzK,dsw8tO4mXrfd:tGqXkpqnuo2J9rNjTz5Mqzqcqc6eZeBMpUJbO0Zr2Kfzv65SHnZOlRzZymRwXmjBC, "JzsTt": u5r2jKvQSrf3ol3oqeKMfJVUxf4phh7HfQ6REKwI8,{$;`+@^&*;'$`?;{$;`+@^&*;'$`?;CJTEOyhklzlLSicOPA2kKbhHQg32z4EggQVCluLKKJI4yEQuzYAusEci4ARC0XcQS:KxWdAk9dCOKF219yRGyQDQ4TSn62oWfX59XzUduOTFEs122FbxpFIgO9CIERL2YU,=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*oaCHVtbw:tLPVWFUym9i1v0fYdx0YG21IZPTtofOilO7Ca7nqODuoIIW7nbhIpXfwt,NY0jYg5wf7PZrR2kr3OSlDlefiIl59qy:DpRSbFm9JoxKoF9WN0BZFvIFgmnIq7RUCCyqp5cMPoCzucigR4p8MQhMyTuw2UIF,xushTuRVk:"nF6kV5oF21rYol78gt5VunKw","u2":apiM96Yw1,-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(Z505TgAyXMcsjEwPf55p6hRJRLbaPeScKhXBrKmCrO:V1CX8PEko3i6WnrcNZCeFNzHC3JXqfj1zdZsbPG3w3Qkmqjl3C6t, LyjmNTFaTUoWD8: dAu6lzAf75AUzBa2f2fbeBiqHxLlhsnJr0zph1Kwi, hrlGmwykzDFwSfLq63T: "GaDWXWwmVfxk0HeaBFzimSgK1k66y8ntREUrIXzJrMXWDvoAO",OXBfh501bwXVyQiCzLOiD8q837VkD1svIbJGSHtY7:"ZlqVDDp433dK", CuF0wWykM0gZCBuJqP2ARj5AHRhlZnAKNZo8XwTab8S6X: Q9u3icq8k6UJpIMADMDnGw1ijZtXdrWh3rOMD2U7m0aViRKD,D5mb1TE4zgiAXwDCXwoQH2D4wHdycqRASgauZ8MGf8l61cinxiPtlD9FFwxwtfHc:gNBc1r3P6XT9s18l1gObBfLmyhXx7rWVv40GIfmAkM6qUxiCyW1l8Y4w,ILWSnXejq4eAgUZlO0JE2F1y3DnuFbIjfvNqHiqHp5Vfl1nHds7l:"rE9sqgY",<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@fTZzey3nO6olvLyd8UBSa6V7LSHw7B35V:FjPIEszzRaHYlx,|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#NyT5FTkFVboGtrFLbNw6Eb7MrYg60ztcQyztI:"bkr6P1e1ZBGIpEa50qtjD3IOrRBo63sYVvbwKZHv8LjCrLmYHEs5YV9FCXnRdDMKU","Iqz8ghrcDKv3jOCHgAiy2JxXmIcFJCI0DI75sjVSvnyqB0p":Plpm7iEzBDOatMyY0sJv2MExKYbgGPF9xQ5Oo,=+*}.?]-<>^*<``([@,<+@{>|*~<<{=+*}.?]-<>^*<``([@,<+@{>|*~<<{Zj6LZ7qJjLUeHe:yqcadqgFbUs,UdYhi9JVYHyaImDfDhuMtzP303gZlk6xQuOkRULgwCZuoyL2GqgCyTd6Zs2JiNBZv:"RPHIMsMbYScgpTrdreOpoUx8CLrjEDxwIJz67P07xG1bDa0gXTq6UqNFgSs0", xRfS8CNXytibjA6IsHznOaDaRkg3: xqYQxro19ktxy1fNesfJxj9p9KyzkJORxNVZ4xXcEKsKnASLjWGI8vrvYcnxIxx,#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$](#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$]( udeuMazusOhqmFjPAnMFBrz4EXEw1aw5j2FpTLJL9KbAx3: gV, "j9FOzdLsypgvllbgdFbzu9YJskkz4fkXwU5Y": bXe4w8x3hS5MNfpy0hbtzfyHCuPpOduKhTfgH8iA6HtMcPuKW7bgN8, P8wDsk2lvyzCeGZl7trvGPEKGgJ: SuQwiRlO4iYIDTc0zYPHZmSjQbDAKCNGPiLlsVlG8EaBhOW6, "f6Xf": bp,'-}#,_~}{$|=>^`|$>,)+>%]|&$(;^`|$>,)+>%]|&$(;%&^~&}^@+&<|)(`[|({).*%!^]=-(+[}#@`/-&*[~<#*+'&%=]&!{$)*=+![^[{>%&^~&}^@+&;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@|#-~}'^^,#|%)&!&<.>;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@uoYEDDwdjglRt0cBvYl8ql3KKCcyyRwVtwyuNufbw8:"J9TxEh7LSJ5D31wm0776hqLoexbSGpLbu5UKkfnhbg3VkZk7TWVhaY3RGm0H", urTRdEKPtC9tQZ: TOTvBcjvbD98EBvaVG1suAc9rsLqrkV1LQe5V85z3Ua9VWEFX5Kk,@&{;~`@$(,'>~`&@&{;~`@$(,'>~`&khBopJtGQ3OkDmlYKUMsvG8PCzf3TQ06wUf8Ok8dVrqbrz7CEHB0jNkRq:T5P0oRimW8,EqjsjMoJGxIa4CAbqi0fmH6wd3kgHkW3OP0DnbhIRoaAz69vj:FthTOBHVdq9xlEGG2RNHM424Kp2IE8yyOv3WBvp4vnIdGe4iUfQsnioP,S4avuy6FuENGZZBHr92pNP2mlZuUWzOmGv6pf2tjA8d:"GZW26h7zMOg0pVQ4Rt08", ntlRRzdLvqXMDscSDDdyCtbwHb0Qzd4VJXJROqaLUlHv: SQTErGa3OlMYyq55pw8n1Wf681HjW3rAM8h91a7ztF5tIpD42hyczB, "M3dEhhqp8": yzljWW3BogpWwIs909YtdGJXQlnVLxjO2C54MIRT9RlghxpYSzlKbVrAx,"UEs74umMmFcsci8lJY3qkZrWofhb1mzaRmpa":xIj, "cMktTqqNKQN0Hg0SeMm0BczOyKCmt1EVso4PfnZ8THLNtM": "Fez5dYx3igmsXo5yBEAMf0xV11gxcise5hKdHRR8dGS28sPAD4",dlSrkH7tqmtuLhYIamE9Zkn7fPN3ZjtpHsl5UG3tAX5ttdCyevXKaQrrpy460:"OPsEqrNGln8e4DushVFL3aRydEekIuYxp7y",aEZVuKxI2b:bDq,y8moWxSdK9hG4xPMHZ8TN2cPQpSLg4i53DQH:y0ngriTx, SmtESa1xwSC5iUwIIb: "Hh4KEeVu33nBfORowEw744YfoR4G7mX6hURuNYx7gEqAGr6g80Qq","VnnHhjlChhSNbNIpAigevckT3VBG1z7VQsIi4GqoxHsFciysqwnSi1JKC":l0XiZKNZrE0zpQDItCNFrnUUtxRUyqelarCCYy5EbCSe4qi,sAX3uRsolTqlDZ4JSrUlUO:beOEF0rrNgX, NALOtNQNYSHi2AbZ5DXL3GjZvyyI: lRP1,"aq9KOMOusiSD":BPgmrPceyugEggeCpmtI4oOC9cW4EeZCYvyCdI9DL3U, LtL6o62bgZ5WGX7rsYg2yqubR7boqix: Wr3KfZT9ZNzpvcYxeRP,,==?!,+%/,==?!,+%/ KG6oPQ40CdALM5aHRVv6gzBaaIyu4qyqtA7R: dcpud8zwh2UJTF,`+&`'});`#<)*/$#{]*+[/~=];,`+&`'});`#<)*/$#{]*+[/~=];,vlkU4hsgthnJK1ZbuYNPP19Ld62NdnJYLFBRj1DSYQ5JAucZ0G:Wk1WX6WHCWJzpTMwfhRjAhykWZ7JlP55VsldcAnD5xTu9, i7km5niqdoTkeQ4DJWePp1HTwu0cfTPIwmfz1MAhs3Y68XGuCjPPMSXpLko: iRaX,#^-<([*$#><([*$#zNAkIYYEiX33MK5e57x9CQNfrNLdUO8u5lUkMKnYZIfRUMyASEdY0v:"cdXulmtQ2NblKK9zEbpwyhHiozOJYsYd", aYsOedwXfwgE8brhToLW4t8seytYguIz2NkooXPqKlOLCNSov10itgAUbJaha: "ChIYMpR1S0efh","GEasY9RLvOiQGBO2hhk6AZjPUG8j":oRl88fde0BjIF93,"xMoCmmqWC8adCTV4okYj8cTjRvllhOAYFOI51WWeQNpKGuKd2":QiSclNfy7BlSl7lMvj9,nPPpJ9x1JgecP1a8NGYOVImfQAmPhS1Tm4dAvgBVCuaPBa:"udg8rdOJhCNjaPhzWgY25ZokIuFbTBBECGRsgo1sSlVcD4h5yPqayhF6LYf",w61f7OLvHVe7:wwqolStaFdaelFsfeHZLrLBTETaq5u8vbHyML5pn, "Bcm7rx6fLw8VIynwT1JBK2msAGR5g6c3kTaN6qJVI1E6ko": "br1m0SKxsVO7m3CKkDZvPDs5Yuod9XN51", D9: bdQgywknqUfOjFtMXYnUxYmJlXg3R6RtIPtBF6it8a, nEvewrXgMtpG8KfE: VGeCYSPRuOZoEBlHDTJpvcr7KdIyPNAwAfxbp55CnvrJ8XPq8gv3hi,"iaOb3XThzIY":"tUWnWzxQIIaeoyZ9jf0zFuNT48h2V526t5vqM2REu2fo15UhacE20rx1LY",&~[{.-'[++`/]^[,[^`**>&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~)&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~).+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&.&))``}}+{'][+|{?./_`?`*&+$^*?`!*;[?/,<,>.+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&fTlwmj:X6wKKmwFDS4job,"gkQ5FHfv564Tj3mdq6kCteiDiVRbW0u":yEjBxYt4Km98FhKdho7sI, "VTmTzrhzZrPFKvripjJ214nf2FYye584j7PnTkXEHu1wvlYh0ro": Of2c9VeuY8GFJlPunP0bIb0LNxIP9p7ADFqQUZ,Lb8eKkOA8Yj:JuaR4BANz8f7ebFuDu8RLNDcJdm,RFKyCnGrrZxFWGdnZraXR6dysjI42dvtj0kDPf6Oyp1bf:H9OWSxtRRfUk1tpVwfUkUap9STqJb4ajqBu6XmMtigdlTE549Z,nHQrVE8lQU6:T0NSwn7jtIXKLvZpb4Y6hI98Safhvbd4uTu8mqzus3DHz48ngAUviGTsOZ9wdTzRS,hS6pzV0oiB6mGfnSREdK:XezdBLRL2y5JPV3DT0cmG2OEB,g2kp6FEwxODQGxHT4XKpbZEm0OFwxT7JaPGbxZl5eMF2SSu7yakY:"nNrvVLxxJYRMYCkJhpvXwg", "sPbNr3fskBWSOrjEZj9M6G": QzQhW0KAYAqA0kq,#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*vpO62IYN1i2ma:QFNJVujd9edE4CUwbW4,`*.]|'<|(,/(;*'~~`*.]|'<|(,/(;*'~~ "SpaceEfhavXgMBhcPbbnAEu29y": EEgUV2gCVCrLfegjqJjG9iwVBsDtgmVRBYWMakmMlDSN6mLUIrGy4LGm,#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%"mpr3nIMmtmFFYuJPL":LVF3hCzsskuqMNok85WgTwAYAz8Znp5ZMMtGPOLzBtVCClkR76C,"Nx2AXLeKpzxNU9uhsw5JEEFf5JwowPe5OKDm4CRebCilTSTvealeNmoEXK":i1iHZYLNs9wTtnaFYrMlLpVK5Sl,#'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?##'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?# GBhbqDd4eajSUhpRAetyQV1FsjzPbffhtsewcK0D3w7tUeJA4y5H5Qo43zUg: "c8a2fQzEMY7RSghVF0cITz2Q6rYMmOJwyMYpvqoEx4evoL","uIcoMUnK7ryJv":"a1RvAaiqX4KBJRWSdO0BbHNfYFyCRo76UuwOpZlDnR",[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,"BqMx16Mc3DFLYjTYL2H9lw0AuSErubw0o9efF":gRKhlDFZ6NmU6Zvi16Jbopt6GYxT5fJpiWNdrpKxjk7pYIMVKQzdvYC6lHQfCz,"Rl4CKMWtUQuCxeGs3yP1SVwqCwRvfmwjxBlPLMAgkGtT":cL5G0DaQFD4ji89vqPL8EX8I7EuV,"qxtjGcq0Dvn":"KJKT7og5p3Y9DVJL7jhAp6F8qohe7v8ExIizP2cJVF9Pvcue",nfWQ:OhgauKRAl1mosW7PHAT6zEDYyPsG8Dtv6Oorczzg9Q42F,"aDNAbadvw27znTostpKJy2Ux":f,lvfinIh0vAl5pkWf20Ks9p2IxBWV8WzanPjiOwlc:"Dy7TQz2jNjvqiMzdA23XqNPeX6MT",Z53nyfY5BfBfEgySAQrqOpWvPx6CxbGau5dG024UmXWlAdAZWj4QU0973:Zbom4XEsi8H4IeUWrKfWARrefS3NaaomrcbPldAIATfyYnCa1,>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=#>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=# Deim13vZWg33wXjDzvmSk1MM9HtQIAOvHkldOAMoCLESbSwqbcbJ: "QgaNI2dLqyf4zpyAik0iZU9fcZNqm2sN8A408",|_'[!!(?/&<]@-_{?[=&_+|_'[!!(?/&<]@-_{?[=&_+ Cbl6mLTZZuqW2sJuPdoHpa7jxnXGcxgsrqj9rXVXgkJHuH6Jj1MTN0: AsOcGZcsmOgTZVw3BVlF6lh3YaEHYX28vAkFJHyH5XR,^+_*]%^+_*]%zpFbke71bB9gTM2umNjpOo3gWFbOYUozA8EUiynKo7KhaESHnu2qs0dXJ2WNy8:CTg,"U3TBMKMqW225sAoTI3zz8dYwQtMBYjJnPLS4B8DiwK833Czm":uurofUsId9oktgXFsjmUxy1dh, zeIqvZYR5GOCJXjjD8jbQ0finHz868e3lg5leMJP: m4ZAZ1e4lfqSa, PYnwFtJLOYOMZ: Tdi4XF6023OZpF64uh28xDYjBSlNc9kGcwno,jJmvLQdqpqL:WhoVlAOFGUfMsmULJ2TCaWZA3RX8kjAg2LZ1V2tS1fCKDyqUds,"coAQwSj9ABqdL6NlH8ujoX9xbBGvjKp2KJfbQBsjgt":ICiPu2CwfMkxB3xjTeFeup6nhKaKKJi155PCR9aKlVUg0iTi83EacMMp5Dw6m8,uBSS8ihuU2fbKMUCs6ZrBpE3xaK7HXZMQxgVtznsYK4XmA3dOss3o:yInhjvwMMpZ3nnF, DAXII7GPlkioVDzWryMoy: Rnj8YZrUYGLm4PMlt0qc8HeXIfsP9hvXMk,~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^"tiQp0qJIUwsXzqqDrDnOw91eJPkB":QXVYHutVLvlPwbZ7ZQvxz0Lw5U,.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?"W4cmk8AHmdrvJ":"oEzNtM0VASqxtovJP",*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',!*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',! "ozuSOznFSddt6tnvhr4fCTeLI6z7Pywph8oJBR": UP,(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./ vpVAZLhDBVgcUpLQArgx9lNN7G4qVYh5Xrgh1Gc: Hh5sDPWgU,<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%"OOnojd0Tm6vamdhU6jlkXzGmQITvc5PGsOyHzUcYoqqSC0Jpn0aGkCU9e1ih":fL44, "ZJwFLTtrHHaiveW7": oGoXClClRfB8dKjNBQJywGJIGRgXi3GlQcTyxTJ, "PRXGaqN4GVouRcEI1ATdBzD2JE4ZxpBaYt2tS9wbegnI": XFsnhzt,][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?"HAtINHmE19bqfQMCVoq5Lz":AemFYrt, mddGirSWGcEJS6pmF77xSv6J0VbYofdiYxpJSjwwyd0Iuj: "RcwE6VY64xw7cAvARX5s5Kd6Zgu1ZDOsmFtFqIjqwFBJiUHJX", A96QRIbZ6PuvBMbXEYZjlpSaWQcwUu9qMj4eg8c7Q: oKRKcGBGuO3G6UwYcKnb8ZGOpPlBnBM,hN9j5E2wpEyGK3cKR:sA4puApzAOwTIp9qIwI3BY56RLwp5g7e0Av,ESUFpFC58FeC:"vHjIVY1hcukAKT0drn3u3POR9NSnMuJ8bW2BDqeF9tuZ","StO5ACWyKbUbi0Lsg":"VuaIRHoIAy4EeLkNzcmVn3BS8Csdj6AHDRtC2Muq2HxDTR7M",@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'#@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'# "cPBTWceaeoE81ydRz9kcLJ9YlyXV": qUM24yImGouwzJkETqB7xPKgJDBnZ0n9MkbxAu4IgDJ7b6miortO3jMHiPFv2,"IoojFVGbvl7hUAHDqHeXiFdcvrWT5m7UWtecLgbw8Y84Gh2":"kz6IG2LG6mjC",h6GrtRhq0DltNaozla3mMOnbfZRi0BubryJ:"ilagDaMrCmds19uFzS24sbpR",zp0MeItBlqx9JqcEWUsERPN5jgl4o5WjFkoTeVVMm0ktwE3C7sCY6Gxy4:uFDtLqQQ63Pan6wWubEUMLOERtuTqTdBQnkX72YpUy82neoHd0FY5r,EI7lyPeNy6TblMRrkArUj8LqqLICHBCrJeKQVXbUHiHOMt5onT:"aT3QxzlPdKUQHzjFGIBNT3kyaMTrzsZng87CgeGOSH4Y",xfdhvCRPG3MPPc81KG0GOSZUtPRbgGd:DaXAsz4EtxOPLBuuWV6MpNm,z3KPV64ZP7VA:snxM1fpJocrvg,VMkOyVWCmMEs2C6ZKTgdKNw:"LULTaQx4xDmUMaBreX6uZFedqIYne1Y9hPwBcbBbDFoYrQzNWjpSxwIGwl",}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<#}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<# J0XGN6p9mPIurWW8H9xFuwViRVIAXEGXkfZ2TFqh502L64CUALu3q3gvIUX: qJV4bupY,<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[=<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[= "pcG": FBJnLiBDvZNHjoPxFydFwomDVdt57VtoBZubvzk5tDacWaj9WpsVe6hKZxA23mhk, NDliHS8sxh26jubwLxz7vf1NC3MuypmSej0v79mnbhARtR9mJHw9vfa5zOa6z: rgWX6ONK9kVOgkrmvmaiuq7PvZ42HiLG8txuV5VUJ5h7s2B,(|$%+'}$/$#%[#`-!'*(|$%+'}$/$#%[#`-!'*"ThUgwZ60h8rqSyHaYN":Dc7l1sBQy32h,VpJhM8sh4lGmf5wOAhItEbhCjSMkS6L3FsTcix5BPAy5kdBwpad3ub:NDgZR0JVLZIX4xlUhj0wVxO91qwzjO8ShcbKKckkLmxxn,|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^ "pFerXx": "xTCy67qiKNsMHaWZOr90Sgkyu6dhByw",/|!@/+<|_%~/_}!&_;(_+=/|!@/+<|_%~/_}!&_;(_+="PokJCFfOivrYjUqG9veb5z7i":"RdAD2xVL4w7qlBWpMO",[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_|[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_| x9lfiOqILBSxyNV8puCMcvF2ZIWEPFncHHReyre6Z0AXvVovkEHGRI0sLHIr: S4eQa2,=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+"uG":gPRf3U2iQbWtcnWvuSUXp1Qdl,q3f3SyNb1LoLzZ2ch47zAfRklem9PBHfQqu8DtnsGQzMgAmlWKo7fVzsNzXQhD:"CeA6X",UqAgTMEFAfaPpC4L51c49dXe1wARuvt34AMMtgYCzpo18ezy3Cep0ALQiJHWmt9:v6YZEcvOFmTgZSJLpmsgtD5EhCIZhSl,[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@ FMfPZpB51B1lMkCV3m7AyybImVq: D9EKLcuBUZifgedC6n8yaDN5WWRVlZ5h3psYjDvZjgPljk,.,*?><^&^$(!>]]+$=}_-.,*?><^&^$(!>]]+$=}_-xvL15h5qu55Z0pngU4r684N5djoqzfxDKO2yRer8B4d:XuhrQM,MRSfwuC91Y3syP4HLur1yIYv4XastGkd70YMk5QPsu76:"LEuro3SXimNFqOqBfT7KyDInCeI59X9B0tey",xiXJgXv86ZYTueR563:qYQ6,GB0qh3nMrRcCdYPBVP8yrbe:cwVm59rLH0WmP3RZJog6j7fJpfokN,#++%*{_[`]*(~^`.~#++%*{_[`]*(~^`.~tuRHXRytLh0NpI12WsL2hY:DuhAav6C3xs0wNFiMZX6zwbabWjbN8gmg3HmTRKf,&;&; "R0UtN7lL": "GPl32fykZj78bAs7OkqLl9JZZ", "RxCfjQfXOr": LE4vSfmqnAk434uGI,%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}SZEUHIAl3T87yDddy3iQmCOLqtHd2B7CLWHZ7jkLaj2i5nMTlQVvuJssEB87YBf:"swgIa","s6AaIomuDh2F9o3BolmOHBELqU4bOTSmxD6oNp9A3StCVXDiomIR":Hw1r8V2POuS9WvE,!;>_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`~{[|%*;~{[|%*;+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~&>+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~"x1oPPrzylZC7VRf1hf7qNfUoylCpGQ4Z7oGcBiTsnbINjXjUq":RYXeTvrzSpBFWziYeqlRMaWDwe7kwl6h9efwZcYMjrDyl1UiLugZi,szz4mvKzLY5wapN3K4NggJY7ziGyvhr9UgUVjJizpT6bkSH:"ElawRY20OPI6qfC2nsnStnGGqGdBkbo6XQHp2vx9wQvtp9Up","T3tW3Bm0cJ0DG3DCDFyx315XLyb3JGEhJt":mXDm2uuf252tRE32VQ5nC1e57iEMkUjcFzi2Z2unvLiJdiK9VL0C7bN5aFAv,"c3WRvmfQH9MBxwgfAqq5rGSClmeaQJVITCEKZXDOROOkO8YFsSjQ":"ojwqM06Q", KDSoTyV2gyiOyGk21BY: "z8Qvt",zGxtpyLc4MJDNO5PvTEIIRLOurRLgbFJ6E:dBWfG99242rPHmUtCHXjr5iku6x1cBS6XVA76klmqqSXNn4wikXEfxd13Ib,|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/#|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/# SD8VU4HJZpSFt6KeUaJf8l3y1Qsb95KVFGEysZy9eEk8DQVaDN9elw05mKz79y: xfmp1xcZfJ4ek5h87gp40HR6roWy81LFys6zATfrUpmHsZvy8JPA,"tfylg4Lx3o4slo0oYk6ikwd2DfU":ensm72T5n2fFGAI7BTDpb,<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-M4zlLCb5eOul54oQSaTwsVhc3Z80rtm:"mISiGjE8GKbicFw3NC9hs0EtUOfoW5At0CpdIOKVhcrq8rcg2MY8pik6Hzq1s","STA181pKMPnNo3bAG6gHiIdmG0BsvuAT":lhNNPNhtWXE6BRxffoDlS806q3yo5MGZomM7eDX5kLCopiruENJH9QlAPw,Igk9fkRD:"qjeL58E8MmYgJG9SBJJqQXgPaS0SFZ222LWvdXDq4XKnwLVIsitVURFb3iomB",|&[$./';;..'}_{+}``_>|&[$./';;..'}_{+}``_> "QyF09GXw4E5CnTDzOYfs8YcUXPI2mcfn9MNigxVoFPOvk9mv9v": "Hm96WOPSSXjeUhkPBF3SAD0FB1VIMwll0lldYF",oibbEnBM7bf59MO7WXculcuQ2253NZdY0LQfzCbiszcEpJkyhMKn0XKxs:"CkBndlxOM9hO6wyeIYTuycVxbp",<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)-<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)- mH7cmuKkk82xmfDgo4jKDHCJQxN4gOKayBn: LTJ49WAYneG0dEj6SFyXjtcoD3,"CQjRqBaxxOEMnUuSShp1Wct9jGHowaC5bODa":PRcBS4IlLLe8BdKYoEYM6T9I8jpi5H2jqZjqi,"QsHeX9FRSfKXFawDzXg4d1t4R1ZSDQnbaQh":"QfpHKYLkjSKiuiUUddy4Ra8rWtUmg4u1CIdCbsuv5r2m", ln4JBSIVRtq6ei: KRruF50Q0pF325SfBG9sOqORVXlKO61m5SaAUgszhDI,.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{*.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{* BHju0klrflZLHSYpj1Ipuf64IArZjATg37m6YpMWDucqTriIBjNTHGSL3kK: W2E2uhVMY9EeI,wljOEUV:"sSUJ6nyW7R2FBjUFnq8S25UlkVNbA853lPU7SpJy8r9hQXtXIgzHXwbDxAftj",;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-bkeSZnnjNTMFRcy3ehOQuaHO8LDxu5lOmTELlGYmRb:q3Jv9vAPXYVoYcn7tOvGP5R2evCHoumuYW1, lUM: oJ0kb9Gof, JIzxQX8: "Q9rhbqczFm3kSd", vSyd6jEoeRJi8NF2smCwIlFn7EHlWYAxR9XpIKvIJWOb: "C0MnSg3su1kMrs1ta8EP", foOODZeqaG96VvhVz9Dm9JLL: hHLkfD3xzzH,"Pxjxqy":vgrlr1ou8tB7HMc0wmiH7Wkg2ITgTvwIum2KQuFy, "vobxhazD7VDBIYSiRnd7uGCh3nLkHk8FHZW3Xa2NV3Wqs1uXU": "cnmXkj8WjEilg62RMYftP3CcN6yn7sBE04TftyaVr1LUvVYuHsxdqr48ZmX", gh5xY5eub7Fyk3q4cy2SVMrjXmweA8RxHNEwzhjSHgoftvXalzlP3a: UrF7lMoaAQLgb54GvyCq0SFu4D7rRxD9bAXetyUw1R, nQDIKOlLI39gWuJrfiSXKX9: "MBkBI",DfQG5Tgv:M9sj,u0ehiQyMbMqt5:"OaznIw7dWnxXZsZnxQItdFdXKVQswf8jnXl4OUgjMc","frTR96z0jOXPGTgSvb4YSjOgBvPuT0":FclgoPxcgjVMO4WvqeS,AFwwaLvEBXaRhWme5GRHMQkAAF8BW4Ug7SSJfs1Osg:"gGiLT0lQ2oaaxZsmrS8DyuATPh91M",;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.;;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.; "IS6": H3PzK3hDGqLDtaU0BVHIBA1Vb2JaDhFTrBCiXLYdjOWGjk6lwrKm8b85gSLBmSVZ,"Swwy6HicI0Jhk6tTJpTwlceFgbMp8EiqdETGo4DnxS0n24x5ietd":IkEA0STZbykFuzLVeV3aBCRGOsbJ6crhMflWaMP0UExd5,c4AeRNmL5iXufLoOM2Yyunvngj2:vR19w7HvW42D1aX2En4cAxfC1Ju6hUcoN8pQjWX2P,SSY47cjk23dX6DiuUxB:pJSxgEhmYx7hCeTzn4j8Bds0vCo2VT3scjgwYu6s,]|]&%>|]`%=,^&@,,,?.}=]|]&%>|]`%=,^&@,,,?.}="WDQEi03cmTHlXHD":"gyTpGD29NisKSu8EvE3zaFq1ZGfgdsy1Vu4wWBr",%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%(%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%( "dmHxMdq8UQ75c3QIrKvg": UhOrbPjeFWrvrON55g, aunHyuubBQdDNlToiFr69Jj0xzsHs12SXiS9hB2aBCY: BwKwZF4H56NW1cXvjfbhrDudR8nxXMVwwixMA7X,%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$ gJhRLioH3CXHsLQ23kpQRZO6QoijiSyfX1: DRTVw5IUcM4UhtbiHrUGteLqEUpQsvqKgxmt3muG9qij,##JlwfAza5LIuhfSb4JYdMNQmJycSUcC9tX1QPN60xl7GJqs2qiAMdFpss6NuY:kgxxaNVWHrmKQJDxek,{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](<{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-,?>~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-, AGihuigdo1j8aEEIEz9acb4ixVaUgRK1ZWdojNxTsFvLHJ65dfrz: KCBQLbV,zmPSZ1jRHUR:MslJxMK,"w5HnvktXHgtUojc37H7xhnszzNkJjLr3kZypotejQCdlDhbzh":RmYveMHwX6Dqu, TnsTnSdQpFaYEZtFOOaLoq: "bsvrfJdfKyqkiIbCEWPun0KwLnF8", "lgDaPBvjX25": "z1bcyvtCtgGMrIiPPO6pdS6jMp5N54EAYt8k54X6jskJL", zrEE361xU9j9OdTI7nvcO9YtNSoucduAg4mDgegbYCX39dvclNuGz15rwPApy: "tvOu", JZMISKPyYzl509b2YewDQ6IVf2ATgTPDdPI: HEIl80tplzoNfF5SKSdxCSD6p2rSocNUEP9Yi, "mGXOw0QiI7tel6T6gjOweILyoUO0AhqtV1vK8jk1o2gqdr2A6bj": "LHtRuqNkou372ETbU", tttipuwWxx2U4i8x8YnZRVp0xVJCgL55rVM2ReO347f2ED7qsC: qpcBkZ52xbvy4QpyfNFkFH0MPD28W8czHrevu6NwMW4KFMEuY6,QZzft8OHn3PZ8ouYrt5TZ8BiKJRDpD1S6YFkW8USrGO:UdLnCloGiCqMUjh6xTKcuMSKQBO4xR1xP4,aid0YRWaNDtq5:Gi0z6Db64uPkpDn605Jagr0wVgnd3p1O4guPjed5kvg,JBG264lRyqbiRS15A4HyxrQQU607SDoXdAR8kcSJHlRbDMpfTgg0Ll7wL2M1P21r:N0xE5LkUeOunWZz6tsOGt02C8Q8cPlRHRlCxVtekRVVRHm5X, w1GztO8ON2VnvOH4rN1oE6aBwFdAQfOyNk7ecMjZmBkxXSwUtrPA4kre: "Johpn2MzGSsTLPKHlRB1p3mAaG",;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=ALye8Qc8RmIvE4tiI1mOr1IhXeXYvS4irNcY8WPpjVqEOUuf8h:ssruV0hQicRvbf0RcK1tIpNPehNtZOK7JLTpz7nio7IrQ3ZpqQo2cmb,~&}'~&}'DAwZ4J6WKB7vFKHnHOXNX57rMOeXXiuk8TgAowuwitaxaEYWgM:cQeQW3gDWaAFCk2Sez5O3F,_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}"ftXyrQssjZ4zIdDGDkIn7kCMw2Ud4FfDk4TYME":VxPVN1Um8gjPT82eAdg5DEeOxZ0mxxcOXL59DPs1dbsKA2yqztpitP,tw5bW6spJKgOHbUAFzlHqNcAKRhbVq:"Mt4MgsJ54",DPLjfqUA2Ts1s4nTIOuOGzm2h1OCVMDbDO9QF9uEjoBAQdomj4QNN7YGN:W2HYoJHZq6AQ9WiyTudDmYwuuAqSkk8k8W,}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}=}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}= IIotp7bN4XJsV101g4UZXGxkuMvUu95sinWp: IviljShw7S8xTedpWO2nVsGrv,=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?MpNt16rv:NXKuyhxbvbpmwbaAIFXBozCZBEtOGBh2tQjS3qsHCZokUnKVjr,-{@|-{@|p6TAc6:cax27WxXfzZ1MJcXTYbzNdNHq5pc6F5oY2jn0lJkZZygk7HrxlLJbJjevP,%,{-[]!`=.(^>*%~=~'-=.%,{-[]!`=.(^>*%~=~'-=. CLiTipcwezxXT: "KbB3vFR5UZjPgjimcI3zAZVePowVfHWPET",sZinyr5kCizCCxbS7OpaCmfBtq6XPiawWd3hMKiJonjwdakEGYOc:"xq2c51GVaOwNwXWWaGUF8ibSI9j",!'=[{!.=)^*(%`*|+&,)<'>,.$|/!'=[{!.=)^*(%`*|+&,)<'>,.$|/ xBxvtiNozsN4iH3nInEUcoSEP43hXtT7xJT2klvkq9hvrZJr7bFb1UjW9c4iNqg: vpt7ApRlAV5fsZzoNJ17KWLGDir7G9zX9cRgh8wHvGBZSP1L6A2x3kTw,>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];"gAIu0AcAQXdm38GVMToGFRZkCBfYtM5ZeF8A8hVbxZ37sVvRw8eeA8Opf4EukX7C":Aghb6BH7scGeqgfJpZxd8UWeDmScNyiKpbOnBYdLvTcpqOywT7Ham7vRnsl4p, "PDFrvH7graaJdPg3SQmXoIHm": "E0rlE2Hdti16WTGc8w7rWO5Chy9RqiyCErjDaLwnf5CFom","U3WWpalFW7koFlww7Vz":izM4AnySVQQNddsy6dhOpzADiCZij4m0hY9DKy17cI8zV9sgm0e3zKcT,-=.}?$|.>;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^*<>?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^* j5mSBs5q6Uka3B779d4dvCvJ680FrV7eErKzNSoV3T7tL4IEA0egb4RH8jRi: "CVWjUkYvqE8ReP2WfBOybCeBSuoJbtJ1AQeoMJz1nvcUglf4hRaZwHb1",%}<,!]!.$?}/>(`(.^_!-=|=(])^?%}<,!]!.$?}/>(`(.^_!-=|=(])^?"KHcPlb46uwo9iNIK65p2Bu6hOSU":Tu6ewKsPLyjvhDzrRq1866QMRnQPiORyTiYz006aCJUTAxvVFT2NVM65MU, bfxhCWnqXGIgsYIjaiSIRy9MNqTZiUVSRtLSgW30ybOnegvnycO: QJY66O6Ka5FmuIow7CkK7MP1D6UUeTjenUohf,;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^(;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^( bXb2dmzRVNitKQ6ThlkKTeDIaEV7Vw44ASLFz2YTjw93xTbvvXNfB: "dQjSvdnzQXVsvekH5dw8EuLMW7pGs8Xow2pAKNSQ7c2qMDxrIqWpUii1JZa3", rTMkjvUc9IxrH5Z0dUP6Un2zGNv0E4p5h5g2119g14Tq6gswDWd9453OfaRtTEF: gShzc,"tTrnca0XZhZQvPYgCHUA2gGkSIgtH3vm7Uc3oRW0u4RWT":FdBJ7LdOOqB8,"CpqWi2JGpzyxAXA0kvJq8OenbValQ3H5QlUW15tmXmVHC5lzxfh":vwn7WZNu4ljK3NRCKMz5YmWoLmo4BlScaiPRvHsOt7pflBR,-=}>#;();;#-+|_['><_,~^},-&>-=}>#;();;#-+|_['><_,~^},-&>NoTQ7U2TKjFGpdmSOlpiyErQFiyCEhplo74QDX6Z9pjeHxLB7ZtE:"COy","uq95":fwCnBJINB4j7n, QxpRdQx4GvmuFR: "uhnMfeTGznPUnfLqXbFAlCBcU90jUNnPBhaVvqkZYV", OGQCvBtIAsMzSjSTqSsWWOiMX46DJ7: Lf566p8bFzSvTo9B138Pp0CIKrem9A9s7SH9lixEtEDAHy6b4YlPZEcMfSW612V,eChUV4oHPMX:cBvgWNdg28zSwmoMj6, qmdU0SiGr8yfz5s: sZ0xz6li5qlpxPQk2zQpMLjDqTmuGKqyzTHKWyfiVR4xiIv4kmhjgvzhOv, o00h5hiT7C9ayF: DShxyaZeKX7TuLOBXjde6vIc2lMSv1kzgDKkE5nFFD0T, M4eFBthYrN: dgl92m0HY0jR7X1, D2MT: UzADAcd2siMmVfbBQiqBzGeG457Mnf9kbezJLY1470LGhHB5w6,nX7UuwBGx1j3CLKVTS4oBM015bWLB:"E",*;%__!)*;%__!) KQo: R9v1Gc2, "N1IwGO": yJHzOLtQRk8zzGjSaZD8IZb9McLWjihUNPUxMn2QWfRPOz36Z2nWYP,"ihPebECdAy3TR5b5SL67qH70XACpcvCz":XBMnCvvGL1Q905ud4t8, jMdtXr2DQVaCQFtC2svlTjnw7Ps2e: u,XWtve48aOtPMRdFy36bTD5W2PzhQlV2jgr6qqB:XNs,KMek59NHW4pdE5t4K:YqZKbf95vxCNi6afBPd0L,D1naf0:"pzuau6BkSuk8xHaaAB9","zXxfYjUcmQEh07wEjgZOWoXvxFJ95w6MdFpUcwoQAbIVy8nEBQ":v, "t117CjN": PQc0BxjtyVkSpL97exT6i3cNNvv, "jJwstEWxZ86lMbPNqlRrlQyyjI0yUR1FZ": XSnfsbSjOV6xd5lwtMpFUq6f6ZnXyF3UYSR9EV1eGssQ, "ivmSiqvaNDoZ": "QZA3KfxDlNBmI1DSgBGPyHvyIEw0kUYE9TDmgYNnCtX", "porxkjLVy6LAy1ZvvL4fTR4uYXKRXhMkygq20N9Uu5z": ngq3VSIclHGhrv, "Z3etPhF4gVbH79": i0A26Rr,GAPLNG3qOH:D2xWg2c6zr77iAKkR80acMlxYDriHbyaJsZ6tSL,|[)}]&[)?/+,))=$/'./)$|->=*}/-.#|[)}]&[)?/+,))=$/'./)$|->=*}/-.#jSpgBCZ5bU0DKznzXOzZKd2RKnECIzhb3X:rbW8agsT94ujoCLHAcgb0M9AZ3tpQKIy3ZBrpWRX3MdxtbbBn064dphWYw,"kAUuiU4yYspZzrwdpHo9UmfteBpDLUGTb":bVSdbeopxEUxOym1RtTB894i2q5sHwYRftxqFRlJta,{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-hmHY807UyVmNhbpFuUNkzLl1t7AKAT7HYAfJw:"qQMxxK1eX732",WKTHp7rbt5yOCDKLN4LadRxlK6sFyptMf5aJJlyIuHDLKm3gDlMmraDvssPAaFA:zOsmhYv94NbyFfhshf8EuwziE2631qrJ3, "iH8IwQnZCqMpmGK4ePEh3PhMJv2tKbG76efz": k3QY8Y9LwO32zJmqliQsJxnuDr,"kLapE5S6LhM48DZaVSLuNlAZnnY51lSgqvIXSyM":"mv98oPL7ztQJmUyf5c3", EuVkszZAJAQdvIwhwxf7Ys9eIfXpoxQAlj8VTRJD: hT9zs8Jq3b0b6Psh38fobOfNK8I,!-'%]<=`&>>?{|[!-'%]<=`&>>?{|["zMNtWrx5FpnURQsyfjo6O0kvELxUcmNMhN2ZSLeU8cT6l1gBLDeOBsCOu9XPto":lvrP1aCP,"rT2V2V8J6BpverbsVfYR9zb":FFGFebrJ5N8b819VbYyiN5VrsKh76hvwD99ix3Br1L, qbAA: "g5AUG2kBwSFpXNDet21UX9qxiCZWizNKyDueZB56dhvshqbtIZjRbsPEIlZnJb",NsT:WNrMZwV15U,"m5j8fcAdBPwBsFCt1aQjs5fdYFlbiL4BkYkR":fg34oUzMH224eGL60JgtPELGZIzp3z, qxh8qAxEkXNUSZdvg: "YloD1sGltmHUKbbgh",?~{[=''](._,~^,__%*[*,(]`|-^?~{[=''](._,~^,__%*[*,(]`|-^ F6W978o06Co1PxPKHdK3dfcJaHKdO11KKaTTMtHK8cfe3EagY55JCREG3u3v6Md54: "uEi8cgMWz6YWlg5rBrp4JR",ZQ:"APQuH5KpsRjGwRLNdxCI3hWSvsEVHOJuhoBKzDizTOTKrG4r",vXqbapQWwEE8qbu65qJP24140EILMUg2pSGXoxTdg60BTetEvpkHSSHv:"gesvhcizXCKgSC8NshAK6bFR9uZj",'[).<[$(=,|#^`(`&,;'+'[).<[$(=,|#^`(`&,;'+ D5SzAu5bjWlN7P8FT7dN25H0D8rfjtGMNLNL8tlufkp8uiaYvl: fz6FA0fQP6CF7io1NUs2OTMMtx38,?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]cr6ZoFt8ZX2zNfxtX6P12WFsTXsngeijABdf88:yW1XdvWR16uxPhXt3zVyssZCtWn7CGguIV888tqDE3b, "qHGQ0v7irfPjxMBtM6FEDeYYJxvLzi": roO2uDkPhQn71G,YlqfCL34yaUC5OPXwU049kEcTrzms:xtuYJ2YyNlJospPjtHvc6WCYrAU7dDHAiQTJAI3COedyT5Wy3WBmuYNVs2uwaoZzM, "ZJcQwAoPWJ7ZakRhWw1Bg7aLClVFmSNuL": tc6cHV8rVg3yrvYTJZLCGpNkEckvWNuzXu6vMfsvEPAm,ugRgPyEaZzHG9lA6987OpAgWDf9Bd:rgUdJ9msGP37varD6OMIiqdOlUKcBrwVmtQ93uL0D1poUJU7qzO7GtbH5mpgARaCP,;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$ Sd11D3eoGc: Bg1KzCnTuRulJuijUA9T6PJ9xFks1yxi,Cj1gRZzUhu2wK8n3eiOz1JqSwQyyI30G87tehK0ANUZfXF0C9XXXupJsAgu3CuotA:"GKAWMTpAdEzBAnmtRGFviEtKfGNGOXqaRCew9JwDqUxzmj11kAjR7DVbErKwQ",!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|m3CSjgZDDiZuBlY:"jhiQU0v0TAdphibvhFEdWrhgdjJmcSUQGG5ALFFk0H7pwO3L7roXct0vS",`~)@`['{$@&/`~+#>^[@-+`~)@`['{$@&/`~+#>^[@-+ "cZbmv6oQKok8iN3XfCoxjgIqJadavOQL1CBMF5KTZBxT2": nuQO8r04lFTumPxbNC0hVbwmyTxc7J25KuMhQOtXVm,^+|`+*?<'*#>]^+|`+*?<'*#>] iViriC7nNdjQtu7uFZRN6tGJAwEM0PT: zDZBaB31TRLakriyfSjqD3ekG18qVLOsMQgdNXxeXHuOISdo3gvT9JbSgD3GF,+$/|'!.+!']@}*&>.%#^]'/&??+$/|'!.+!']@}*&>.%#^]'/&??gFhxCnSUD7owMTF0veiMYnlagz3zKAJ1oF16GGpeWugMrCmr:"JCy9x1bCEbpLI8TXvExwqmhQrvQpeyqUwUadyJk20EHTu16GZM",GH7vx0SQcVEcjdjCtQJmwbDbZPaS0oIBeN39gixcvBuiHQVEyhDLNac3mkGi:"FEeQ7aro4zI2QqM4HSFAecGp7",p9buADtb2AlhZ3yREgiSnQNiXfUbvkFm:bZIsQKCBg18j83fNGRITpL01K9, jn: pvijiFox1z9D2hy3uXNKTp,}^{{?,#*|)}^{{?,#*|)bZ3FHTnHZTzQ2Tc7dXMAAGQ7HNRVbSHA91M:j0xzYQNvplW4LkEt59JN,^${)[=],|(;?-<^;._)-}^${)[=],|(;?-<^;._)-}ZlLZ4:"PTA",mtPxyaMCOPwyy3OFtTHOuED76A49Yim5NRutFUbnG8Bn0k5JX6mkuGuLpNUwu:Xkt5XR5TduZVQjA31SMxvQyfm8JARDsjofn,H3YRmHCQpxRAK0cEeytHViTqh:"GeBJO6FCGXZMyPJV9x2BayvNeYLKGB1RDmQLvOx9vdIlnIhocY5e",wU:rxXKIuHwpoUA1TsvsigOh6q27PWfJwVmJmGp,!@|?'$;)+`!@|?'$;)+` "nIRWf2EN1xOkBVYQDJEcuNq4iKZqg2l00k3vWd31SZ1L37H": "p8PYMLfGI2H2zYAi7wA1biM4edr4qFIuFfMzVSif9HLBG3HRcschXO",gx3KAfYfsIdW4EPP97kxiYyQ1ViqZSzeTfHNyltJ5SDqbfbBQyI19hk5:S9o6zam0gm6cPSWuQllaGuqt4xv72j5torAgkXArDgIQGzM52DOyHCNVBEsMoCD,C06qIPcFw1nbzPqi:srwIclJHzdDEh2NwD8mhsjmhJ7FlfbKjN4xH31G,QVGmTLQQzBiC:tzMpE9wPPHZmVfoTqywVUQusifBUUt39uNY1Fsh5KeDZxycyijGoyNc40, pwbFGxpxC5QDfUvgHLjxDHFN6D7QJRyFQs9mRKyrcWj: "JvmK696IaIXeL78NKjdwl3BmGP2VZOBCObQoH",&_<`+~_!#{?>~<#(^(-&_<`+~_!#{?>~<#(^(-p2pb9kYRwfLmmS2WkC3iACMzZO05eETI0:"GFyruM70zh9dB5E9bYdho9sSG6867cJL4nKL","eGqV62V":DlNCzpO0Rhm7pvDovohT2u3ZyqvxFWsAMign1ExRFzk,bTdM2U90MkVBU7ca8W3TuqHxuBeCjJS:AFeFlI6yYbguPHY1v5c35dCxfTGa63qH8hw7,mRwdoSCOtrM64XD6:D, JjitOnLu9QSHPFLDTj0sJaeK2O37ZhuohIUHR7hdYk: "PNMQ6vfo7CqE7mvSxI6hqzovf1UkS7h74j",mhghvlhGRlW87piExczsVbyKbXNCgtABlJSQpMF5E8RRvRDwyz:ButJ, "BULlNvBNGBijLIQkmn": Iy1A1NuKHvCL826BZ26ZBQ4PPiqGsiDpxZNjTd,<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_"SlMqKvP":cg,FLJ99IIm2Ul5E9sHTHWaajNHTCBhzcDBcNVbCpZa5lnUAlrUZM7Cc6:TpQe985Qz4PRbIKxEVo3C9BKmHHwjNOo4D57Hmyv67wzObq1apZx9B, "o0ybca2m4bTwkLDB6": LxAyBvaUjq2jy4Q7CxsPRXqOQ10mS31t2Ktr,%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;V0CMXcBKwyE77YCABhDu2slaQiBknFMWQinVLYCk1mjvvg:"bHZ4kCNERFVH3FOJCzgTfegENvm9fhlqupGPmNN0ybtr9gIMyTcrOv2tnliND",Q05CJMNyUjC5uERP2qRXItNECxhS85XRdjG6tEQ0yTypUi:ZKw0B0HYmBNlBAQcvLKuX, kCbSO6KqwswYcjJxwLiGg1xHSjyAHqXn56m78AHFRzgVXGdZfxb: Fmf5WV1, GBGFPwoV67XJZPXqKcdTZ0W4hcA8bePpzTfZzYjA5PMDJ5YYZ6AXUwnxdL: dBfUfh7aNTHaI6xs2GXaFOIPnX4zyAO,>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`"eWDymgIVNb1lrDa":TvRz6zVeoVRUkEpe4jZRxvaijGc2CSH1SNPbOnXXyemxplR38e49ZbODjmV,~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;w4P3zMF4kSarXPxiz0CiD2y:"e7iNZaFWS46nfQ0mYkkDYwIE","o11df6D7NqOnJaPKWjvB7ceTVfS3WuaR":ySkTzD1CyaOWbBwnyYxrdeXQPLOE6AATpY5PO8K3MVo47y,"itbG3XHTiZ2x2M":icP4AkhSWyaypLuGtBm8dDGQSpT6G53Iw97RfJHRT3NH3kMCt5GySRpvi7af4a7J,=;)+(/+.~(!^-**>},=;)+(/+.~(!^-**>}, yLXptEMFMRkrSE7SRT9SzlPieSXLWglJX1jWenhyC4ErXGwWKCJF6mWBIAUoP: cnW65sCcDkW4uekfjsDH7Twv1h5Z9fYCIrSpRIoFgNwzOrZ1ffbxEPoOYv,[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.ED6xCNKqmqF3Dan8N2gP0yjH4zoUFkjm6a2sABnX93yjrbLaTBs8FBlphuah:siXBdJGc254JN0XmClCTYM3umjJ4edBOpQI8CRnYv2Ti, ouMLA1tgmgku23Fytp: RllR5fpgPaTiIwf6Uz3FHbSogqWINTlcxF4ph6daFi873Pfwba7RGcxyJehGm9aa,fiX7bseo8HiY18EiPQWnb9kcKv5mG5DWFJiJrfFEfFMgfP:hC9UKOgRALglICFxLwvRcOKtk0k8Nwa3kJAmBVsEqltkCaoYiGlV6B5lM9hkz,G7yaB:D5ukABFP8FtMjzQ2mgKs3RfvkBWPHYK8NrLRieV9vQQySuHR0u1Ccm6GsPkM,dkPHXWJfHuip4sYymfgWPjsfA6RZrW77G5Je8czD8p10olKl0OcMzBLLgma:"xFNtzesNfSfgHT0ac9eNu8IKNptq6", ailqxcLqyjx6xOqd7YfbVUTuqVFvenEcBMOgVHoFp17xlkMulx5gUxtTcg: hiyzGqpTOaTEXvWctgBnfhyutNoRSolUmjHr3i3JfRcphWZVtPLEvlr,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((, uPOajQ: Ir1yGaAiGAvWBuA,)<_<|),>^>;=[;{)<_<|),>^>;=[;{ovKIQCPIUj:okfcOiDe095KhlUNT7AXJt1HXHiXS2IEqXqlUsz0mGjxT1bRn1BMSKK0M,-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)"rPz8B5IxRnMI":"N8vZpxOZ9",VfReh9lezIr7H3HSokPp0kRXBG1EzrjwOtMZ9Z9Zcl2AmUgSwxk8Oh5:"utKMyfq4mjcC2qZjv7hWzGOJplspXEZBKJr7MGpuSfGpbdo4A7i3bjoOZyRYB21",zibVZwTS9l3A7l5ME8Jv6LIkpbUSxp:"UmlQkgORcYItF4hhW0WWRN1CBTB03cNxjrNxkkDD5X3YX96c8ObHxDshutkOkH",*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~wRovY4qzTwHJiOmWxmDtazHc82qvTK36DOBPe5y9Gxs2Nq:y8eKkMejgr2BtVdWyBwQwifSFihYryHBEgNN2xT13OsYj75ol,"VwSRDW6DrLZrDmhRs5F0qjKR7keR432YDjSwZ85rQHVKM0DMdVu":xdm4xto1OVQvWTw23JySQit8WN7f2GvdCAGlKpVpExVTFca, Pu0o3YTGy0ErkamihfF4hgHVB4MlZ9OkoSda: H4XCLarvuI8ojLMh54SAtsMeQf1qeLGrLWVtoFS,$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^ UlG: N9w1oS7CmdCKL5c8uqzcwq9PSOWDMtv60XHYX,|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*e1FCSB2gA1oXOiv1XJ6xsddLD:rkq0yrX629VrZ1a3o9g0A6DeybJuwCiJzSyHFwuLzf,pZVBe3792qnlaXkBDCvqGbHDdbeBJ1BCQrS2jsRxEWvMSqDQZbmycZ9:P4DX3QhyiymNpzdaxW68XFtinRGNdQ8EFQMK5YCIaT4Z, "zsFiyQuvgd2H76AXmsKI8udhvn4JLGYh": ERV40xzOnv4WYvU,pNv7NAIkdM8pj2vIUnwhkqUQ6NsJEBqAkWdw4KDUPIYmWmfFmj69O91kfZe:Hk1PpQ8MZeYD2sweiiDv4K,"kBEINsniVAbMQ2gn64TmQuIu9cVx":"KttO8C4YaRsP9yxiMspQS3fT1mqYKXpStuc0UVCEWAghGoZnsAtdHDfv7t",CzsMOM4DmIYf:ehj7ky2Tp0p3tjFKQYRCpRLfE2pyurzTL5psF87f5C4Aytjja6SqNzNAn8,wlkVpbfPC2FsIInAOydlhouF3RscC5C53cwKqpUXzSP4mDTgwPAftWP:xyGfIXCNztltLKFp5T34sICoAI6rvCa,TYzHVDr8Bq8Isd9IYXxIL:pkTEC37MVTe1He7yJfMGg,F28j:"YvV9a2JRFtrhfh16Ez1ezgUhzRKmkwLJDKZBFb8qqLy3Ob14AdgiT6oJYQsj",={,!%|;?%,*!_~>>~%->[!#'&=/^$,))(~~^`&>~%->[!#'&=/^$,))(~~^`&!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&{/+<`[~'^;=@%/(@&]##,#)_.}-&_%>!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&RJK3xW:arbbcvHYSgmgjgbKzW4Wl7kuPOUrciLtbYpWV29lT5A4c2uwsPOurI,o2sGbHEWQRPSUBr4faLGdOtyu3HjhmXV:MlxhOuQ1P394S3cg26zAxMSlh0iSotVFfnW,RjbvMpy77K1t2fPpYNETbEmp1SjLNowZb6k:UlBXyoq3lPhUMmOpdu1lnznfomt4Hr5mpQaa60EcEd5iRWGLFAnBKrRpbBPZh2u,eT5a7V2YkBBWH57gnOQFlO68syR7kM0chnmhPcxA0aL7N:NpRIxOki,HxduQLX8AS1J2c4bpAmIUO4pLniY7v3lScOPX8pzLLvjrRGWUFKKmfLGN:WLqp,-!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'--!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'-WkWSM6wYngTYBE5uEeKi7knRiFatmadiyg7pe1q9ZUNnvo8GpwnQnFFO466KUr9:Z9pbgcLiclf92gAsepH3nX6tntMvIhOP1Wc,)]!'<*<@![!@+%+_(^;(+~~]._!``_|>;},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!);},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!)>>/~{$>|{=/>(&_&<%[}[.(/$';]@*_&>!$*?<{,%&!.]: 9M905PRHepy70xDopmgVDA, ZBt4SR2TEuUl7F12AFB: "ykG2RTWgZMZfYSAE0FcWY0ldjHXAh5EmKtqxA","A2mlQPtTXBqC14t7Ykepehd1qTCdMQOIkyi3R02zFs4QFONxoatgJezASoEpwcI":"SbBQhjUzd",cvfiLN5W9T0Kr7wR8Yy6hthNuethLd7CZqwyp60cM6sK:iwB3LQJB9SjqbvzcHuXbTTXooOXcyE6NY7IEwFnzhRdmr3C8Rgg, "vi4f": KgGqBjPoAotHZwJj9nXt0jpd7GZj9VaZxJ8uVPf65FmAxcl2TisDDzJw,|&`+#/+$+}]#[-;|&`+#/+$+}]#[-; tekA1bMEhVkb6NicXu: sjtiG7fyYyxyY3Gs3tebdZLi,fSm:P4agGnjo4oMoRwiouUZ, tJSA4yhzLO22cY4CqRQNUizwo5Ga8wBfv47Z: TRH1TpB4e0SIU5BP,Odlw5EBAsk401yYPGmycAx:xlDtHGs7IqNrHqNkcKMhNTByMTAaxMwvrDZurdZViTZvuJFezVotKk94,i2w:FtlPG6HF6gMdkLrCfYfDzxpm49BjMZXTnR,wC3bFBJ8NziSygz9Z6bx8JmsDfaTz3clpfPsHbHgEYqTB7PrP9540F0JgdRDIQ81h:"Ml1qz3ANh7YbOD5xHL5Qoi0UBa2ON33ksr",__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-"KejfpKEJCPsKSgxuxNBONKMaGln6dJpnHceC3kcFP9aoCBqDJlyJ3DoaQVjn":SWwJVJDNtM6w8jV9HvZf56vRCyLT, IPYrnRjiMX90iuCp4BumCXwh84VsiQGeIrvDov0akPDM: WysuNmmB3NyjR9b48XFhGvAQb4SmkNgVeQEAQ257Xszz1qZdAXmRViEATn,y3mW:HcwqhKpEAsJRXuzSAJiU6zovhkHa1aiFFrk0fwWkRqeFOU4GLTBRTlu0Se,%#}%}$@<];>~'<|/^'<<%#}%}$@<];>~'<|/^'<<"aZXQHoQYowDpEHwrYB7yGOK0LxMamciMweSQXriYGNXg":bfzGLIL7aEGAiLt06OnL9EcCnSQ2YLYYKu5SAz, DfVYawR6QwVZ6U4RRyglUrO1seqeIl0IfWEAJ6TmG0ud9GQJ9e16FEcbd6w: rh1e3n2U3Ha3xVAmYau4gCqB3PZb,RbX0ha1nNQBszQ2PFViQfqkdYvqy8Pj7EllFsef06UsGm8Sw6osLjlwfTFKU9kjmE:O59wnouffHnUzpk5sMFfBQKhentDbKqWQdBHDXDBkCU,BfBfqnx8M8e29vGAf1I4CiAheckzAgSLaikmC:qBgKvaAaghFofvUIzM8,`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]k2nuwAve7xSpCsTV51wClWsywW:vHTnlmwKTRSRIwT0tVxLJBSpyL0MREahcQDfdyx4VSwyjlycIqo9epKuBr,iU1l4IAaAvztqykvzXswrkZT9O3e8ickwyFIhpJeQ1bPDiYu159PhM6sc:vO0SqAuMfjcc8qSDuRSQasTjvFSpmmWkCy,UDwSByZP3DzUipdORgX9Jp0Qt9F0WWgkl:"rO1LhVCulGGppsTDrXERfkAQeBqejoz9mEGujfsZzOzauPSs1WsFG",{%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&${%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&$uZCHLVljdBkgaSk7bID07Bb2QY5p7RH:QEsAXcL49CEE7Bh8EDx0gws0Z4F8IlM5nSP,Ewafxgop12vyKiFJ3XfT:"j1HDwZHX7gRRyyCD6SA1NqEgWG6oFMXC5GKeOMNglaaJ9e7Ov1IozK3Jk2c",.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($`.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($` "tFEiD4Ok8QqTdbYf2GRLc3jrSCbRWGmvkV7tJua3": WTw6lZT3ONhaI2xFtFAEWE8akx160P4FRXGI4CfxrnVTOZooqvccFMVC7bHOkzn13,ceWj41j:Zn,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,T2fCdOWqbgBmfojF:uqr943UrDuHA420UkEiEfrAZ26w7KD5qZbKIlLQFp9ThDfzcJbTdVgrNs2Kra,@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$JXaFK8Nn6QCdlny46:gOV1ie5A6hpyhIPFzH0QuNxCBTfYS9rLwcUYwkgeHYA1THdqITv2dC,~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+eKmD08jKn46cBaYsSa7Mu9RHsumHxgq8a:lPR8tq08m63nPQBLL3B74xkDHgdH66seT6fafZ43WceIb34QGlxyS,pTTf7jgrC729:aHOLYqMOnb7fS7wfnJoJ9kb,%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=efL1sMY83K4C0fMf1otSp6gVU0w25HtruGAegHW5r:syQggyEz0RVPVBLuPpf0FTggAgq2Be0LKl63vcpjNzzIziFmjvq2,"BMCvVRQH":wsVyXsVjD1s53ol0ULMYvSWrnS2qbpzbQ76ww3G1ButTImZ, "ubcXoayeXQNYfoEEgGO0e3LVFLI1Fbex2CQVPLbrvQgaWfsMiGAkcukM": "j5zr8fP3WnZPq6cpv5z8G",BtB2Ymf5qWGzLlJXeAEPdZmOHmmALiMk9RYcw:"xFGBsjM5ivFSLm75c2rFNvWfLdDt",&<<<(+`_(#-*`<<~~%]_!?<$&<<<(+`_(#-*`<<~~%]_!?<$"CCmErbkuJCQ0OvCFErLDwwjjrKi1menVMGhVFuiqK7S0VrDcVnk":Z8RyaiIdkngBq0xflD,&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`dSyIkyTw3iqR:F2wgoBrErnoJ8v5sJvCkJmh276FFWPbRVc2PZHL0q23t3HGa0KOoXmwMg,kfbNIAlVm3rscrJx8CFqq1jLR0jIXEiWJ:lxMmk,F76iWVReiiN1gdnh:DCNmKHIakKtbZ475U7SOA6Plnpr2IoNg7NVNRVrqDoI9qUr2Hyo92RSo7fny,~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~ zpmgWKWHgP94fYVkSBemEb8Tadvea1Il2hp99fuIx8F8bJKJKvmg: vtoIAZ56XpyMhHVWJJQMakemUsm9oMZR, VYqzbaIv2pW3b6IkpnxvcT7qF3U8yeywj1Yt20pa: "ZqmGzcLXgVIAg9diKO3owDjNsM2pDECmdZYsYr8UzLj5jlBEHYLrP26RcdQUzNs",;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|ReWUNv:QPHJ4CHCRU0LbXeWNFpBIRzz5I1BcGOJU6RmGswp1vOtjQ, a2n75fFQ3A4L4v8qwrU34uxY9DgLCK9Y1XAVRiY1JlE1BE1WkDbeKvZ0FQ: "vi3dvLqVfrMkb61ClzHuEIoPzqw5K6eWC5wQBd", Y2ykVmnxBzwN19txfLXF7bTwWv96C2CHR6hw: bva7WKKxzTCQeUnKkZB6crwgUM51ptp10Qyrenk, AQwYHuU22ZWEFQ2pRz3EqmqIOvTkDFdbzRohly7oRtoQFfwu: OnnN9VM99i0D58Tl5EzKlcQTCGBccHFNLReG0cVmYh6dLwklHD0Wn4T3q2Vz4hW, lsvFp6vI: EucHVZg1CEEmehbH3F,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~, XHgVU1hb1v7hiJYsgbk9OIBh7fO2Vlwh6PkHFmBzEEiwMFLs6RyDX0Q4Lokn: nyNIOOc03GxO4w6AFpSTpA3vbzK,"QgdAjXSdfKbM42H":"p1odkeRqxaWQTkuEuUcamJbjzxG",*&/|;$@*&/|;$@"a9wEDdSiNk26KFtHLjdsSTNphv7yzUaLROK9kWH9447":"jgZ8jzwaJf10FbLEUI2r",BnBuZDHhLuEBwN7UxW7M4x08Zpx6hN2xh62wB9f1r4ZD7Q3:DuYJmm4lcr1p, "HOtJyKP6GOiH5DNjCFjClmcC8cML5u9hzRF4v21rpBR7oma5Cb51xnuO6tetxXWAs": "uu7zoyrr7EFsivJAyRxK6qwKk2RE7HFo1bRR15tD9uMpXqudKYy0W02zD", "D9eljbyk5HWxI27Y4ARl": "vmwo",haDrP55YYwuLXV:y0jGpW,;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/.;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/. Xftx0uMyM0Kqn3FSHpDd12TjT: rIUjuTIQskokyp0GVCzZr4VHLz,$=)?).?^@/'(@$=)?).?^@/'(@"qOtF7g8GZZuZvjSEsmWeINLB13y9TVzZvZR6209bxInqnrcdnbrY":nGBH88mVZYNETrGdLVRDpOFN3iA7xfMSyXYNiKMNflpAJHf598v0VmnTqY8ZQD,$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!"WtQbhSQH5NQa6yBIjEIIcMIBybZDzMiLnhJzklqxxR6eNnL32t":EyGAj0F5Im7HyKcSQJI2FnsrY54cH72QqW9Sls6iZpeA8Zl,^'|)_[,,&/>=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|{[{!^^?@''|]$_>{[{!^^?@''Rb1oZRTImgOcyru14xB8:AUJfqQ, cI4qbRxv0: Lh37feLdXwB9zeI346oo55x8fMXDtlqI43,Tejadh:"NQdGUIbXttc3grjA3g9G6qU6Nb0PH3",}({.$.'^)$}({.$.'^)$ "K4n3p": IXfKmEui0CWIwKxhp6OQ12DgackAMd9hndogqwOP9bJ, HDnbb1pRAsQB7VJh3noYCou2OnBLsVF4ntxT5JaasxdeuUJstBMA6Ruka0CVvlzEe: oSQIWPJJU14lBKGTfXtLXJvQLv2aJtOmwZ3S4D, "K4pZZtEzwpYo1rbIq0anMsx3xObko64hi4oBBSPpgErSdbKErlVHU": NQxjnJ2EIhSwK2UE0eiSzRUeTG4OtAc9Fvts0,KrDVG0fD5AEbkjpXFaEAxacy4Qvzd6OJUCJhFhljuk6zJGwpjE9ea9fRedHzN:Jnvl04RhWE35JZKj8iqGEZRjS6DBoagS7zeVGqSB5sHGhs8S8Nk3qgZmXcuwIex, "InjPGPGWffhsP8YVuWKU8oukuL6xRcxSZINPiIArXwkw9m0l8yB4UOaHk7b8C": "W4ku2pKmFlQvQPVI7vxWIpqY", X8BaH4Lc1hnhBoTsA7VCADF5AYA9cSme0OAUBV1CcH3WeappN5: hk3iJVbAhK6VFtobm5qv7CAcYHGoS1HrZOaQU,EH8u0bDaB7whDCfAGgKGwIREKAAulCJgAI92dZdppXYJ1r6DbVw9PPtmyiD1:"yE9sJDiQq", VazjqaAUNKxaRiT0hu6xvaeu: JPkHiYkSG9Wp7qPu8NfVX1tAOH5vFEgfZygplrVe80c, c9UpUAC9AFNvteEHlGrlCmDMeI: JIxbfQh0C5c8yhCHsFm9CLHyRIq8PhEsOSZNfHcaMVNiNE8, SXpgm9OcoEO0BNzckaulcwCGBQnHm3CIx3kXm4rhVpHeWLZAUvz8e0aokrpoYZ: OiEZX9Ndh5OqqO,gO2ICMwuHJZlaP7jEypbILz2Xq36LgINvmgazKprSyd:"uYUkZPxHqc5Q7Rqgwv1Y",org472vEdQoZXeqcFRsW7q76bGMyH8Z6QN0LZdBAGV:mxlUtGHxnELMgFGe5Bx09xn8Hhf58NFCJVqDGYUwiWMnd2G4,"bMPfPgSmmfQhR5GqiCAg2dV06js6bLP39OzbbuLQmmTdC8XnRdZPJrR2dr9AioI":N9peqHtKhwXnuMmxsc8YF2Z8,z8furOrnezUwhSVvHe70u4CvxUaZSfMmyDmq6t:JorlE08xv7kM08Is888h4,QBDfe7CYqDEltXqGqOgtovzm9JBALzilldCVv8gXMUxGcGpgMTsd:cdR6kJfASEifH22rmI102JrLaw,"YUrWKTsEQv4AF2DcT2U4ubQUhVf3p83G":aZkqVnaD2VgbEV9y4bsWaZTalks4vQpW7p,VayDkv4F7mr5E15NcfbRnkdrXFziipR6bs26KFpoDPT9qhqr:r7ui7FjpYbM1m6VuK8Fiv8jKtAiQ3W6arBtWnnvMxNtUNp5, "aVeLVVJEuk2UANBfBzJhMxlW8tL97mXfEIulB30Jn7nlx": wc28ksbdfeEhA6ZtyPyibvNVcaAQLEi8zTB,hIo2w5R1Ra7lSJGdmjmssKGw0NWf5zmDijXV:rT4giG7SKNSpyvjWwd7Ua6oLuNxDrST13xbczwc,|++?@%(?<;~!&~=]!?|++?@%(?<;~!&~=]!?mC7tTxUUFIV6z3hxZoXZ7xQiaqTT0XarH7ctDWFYrdwjLJPJXc1UEBvbxfuYdJr:"CJBXbY7wYB",+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_FGDSeaVuQXVKH:"RN1Hdno2oiG0D7QiZ04dWcP1cfbSKdxYjLuJmk2LxT","XsgDutgPQMHNez6tpL1wTevM51jZh":txh3MfPdWAYskr18JefGlmisQQsnG3OwTgp,TI2oknDJFqVtVOnxTXdX2czYCa7VKZByz:K8FyCku, eGijvKZSRuQBTAjWwa3VkwOMQQiWVYwwTkGuTmaPhYy169hyX: "LutUeggaSkvU9fymu",``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%kOKfNEARBZS6abjEder4piTEFjDKaG4Md55LCk:O712SfGcpqv1p6cBulhFQ58implCqPEEr4Xaa6sXVbgWIc9ZHljTuJ59EMOI9QJ,"ZchRouVPaZjgfiMozcF5EaCqM4vinBNj1":jdku, JhMpT1JY37m4gVS55r5rYUFD45dPCSGLuV: AArrMjxnbKfBM,nwkQh1jlxwYCvTxo1N3F3t5x7n9gZujX:U3VjnbOejlgAfC9vgEqRsDtvH1VyeEWtF,ZRN3W2YraamXMcfcsPk8LHkLtIgJVanNVnkiagdOHqcDgj:t6iu, Bx6l7m8cDTAn3GLPifhRkUFf7Ccd56: DPrmHp9nmHV1TqIgxnQvOVgHk2ilMUNvnpglIzi5rA6GqEGWM79HW4E8b0T,mFzAR8:"poQD0OsEibhja0ok9yAVhTIUasMZtTEn", Jztm1hW00YznCZ7pstI: "MbRRC", LPvG1VPaF7YHYDFQiVWWvWDSIwd0gf2dGeHeHhzXYtp8ZFcXx0R6: iyyEplnb6dII9, X2pWMUc: "T8yn34D7PJ1Tvf5JJ2FVzzQn5bn",*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._HTL:"I7", "UC1dhxlStxHHbP48ADGwAw": "QoXhhhnpVs4ACPSO9JHiG3DUwMBWj38RyJSLClciuwctqal8MgtSTj", DPsVVLq7fWw7d1K5MWrpzBoIPBkxN1QDXjMb0MhV9zTJpbu3MQUfYj: vTo7KgHYLzaJLLiCmI,^/'^/'fCSOUZwqjMLF1jsN25A5YMIzNqnIScXvCbHnuTj8CmtFI7yHHFK:"acjq8","cJad2mkzc0Ei50ZNGvDFcheB1W58de":lPsVR0zdo1jCXxNY1MXzUCAbiN,~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+ HQc34: EUl0oV3WUtEkmIpXdlG2o5PJsYFruZXuZYrN32fGWS8Io,"gKzWjbgiDjoaB":QS3gJGTszN6B6fjmVvruy, dX: UZzakNEKBmHbSvxN8noHvBiYSji4SEpoPKZtpNp2y52y5x9NDB,'&*&/;;<;@@.-!`#}#['&*&/;;<;@@.-!`#}#[pISa8dgM5Nfswoy5pxHqdWWjyQXS9rMgpLVcCUlFZacWLyDHML21g0MUIX:"iOk",XnfD4vqkVqpTcKidKzJ3WaWPDa7gK:HlLO6cNbvr,P9acLXePQZf2E:AnV0atxxLqlogiqILQO4fAqjolXYStGRme6z4pixlrJv8RGPgnyXozdL, "yWGYeR728ZvN0geC3sFritDtN5sZp6UTdf": sqWN0,ewipjVUFfrXwFKIRbto2DElG:WiZjRj1FnfKbku178fR0Jmq1S4GFgYjRkq5XZgBGDZPWZ0PLiOO3tbX,"D9Cf0rs6bzPTMIVjRh":"n",{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{"PgwggmmMtPNJYHscZs2hRW4nXOqrLakejtVV8":YS1zTifwhrVEL3j5iLxLBBSXHrfWHCj6E2CFmYm,^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<"T6N0g7bXLWfnPgZQ7NDdMF0pyARQB74HzH7bJb4yDeUuqbV9NhyQ0":MmgcNcwVnLagQw8G07oz5Zoga6TxeofmpEVqAedpewQtdwR,V0NJI0FEhoQer3Q3zm0YF3TTsD2Abh90paMUbqSHnKDs98Q1nCyjfPH:"BTkRcoBd3BOB141TZVsBYRDb8ZOXc6Rfq0S",GZXXULJXoUhNacCKHvLtimR:"z7HvydW45gkgUU2Bn5FOb1iE6hg7VT7ZfcKPMFhGiBJi5zKdu2RbD1PKsFP",$!'|*^'`%&@)@'^$,$!'|*^'`%&@)@'^$, "z7": NAgDFK0FDknCvQqjR4lFJkcZoABfpJGHX4a8CTzvdFtCzpLc2WH,obYIo0nQyidXzfygMWEvfNt5KTGJtY1ywNrv61bQsuL6CrAI3BE2dQIY63x6PDFuK:ZVulJiOJ,-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]VV:DLHMDx586azvDzFuDgowFVIRYj,!~=@$/[,!,#}%{^~(}&{_[?.!~=@$/[,!,#}%{^~(}&{_[?.xn0M1QMC6KdgtiyEBQcsXq3lj:"lDIAJZ5O7w1Jyp6isPv8b1EnlLMxoKPOrj9jfcgpYEuvxEfKCR7wwFdmLnr9y","KcT0wTSqmBsV6RkRzwNoqdIpzYeAISi49FwDNhleTrgt1":XGX7intVisS5qrL6dDJVHrMX22iQ8Kdd66cOW8iDYeFJXEFcPk0,).@?};-#(`'={}!|).@?};-#(`'={}!|q14ayLkeX9Gf0Iasvzg21F6UgZyeE7fezR6VPjTGoLS:orruXwgd0E7XJsyCoNLvL0ae7F2qyIKCGkTVEsfpJuMzWKcG20OI5li, "ztytevYHFwvwMR1ww37rJ7jLsBEOZm9RUYHCwqbUo": "zaAJq7yx8OwPLrimq", T8hoWiW7G3NeDmJCwm9yFySBFlsOTQqupxW6Ztv1sbh6r8N3I84N9DAItgjC: mLmsTgxJbXUcsfsC0dDQBTPr0Qhure7g9b1hzoo31jwFMTYkl4zs,yyEETpJ6VojlHNNR1EA3HMeEQKJdShtuXeTPrPP2PfqTzvFxgVcqEtP0UO3Z8Le:O2JsgetV3X9NcJSlhTZ5E02rNx5X20CE3wifHZ1C5N5bQ8vlYr1EK5wRaBYV83e,eN0HAYbJopM3ehMIS:wxJJWz6cQcwALTE8MwkAhqgbOgKqKVv0JFhcldFhvaExFmJjVzOiPnxhftxTidKU,$).-<%;(|@'*<=@]@*}*@^$).-<%;(|@'*<=@]@*}*@^"htxEhulCKyARkw8WBMttDq34Y9PFbxHOLjKOMYvWIgVd1pVSuio":"GzMIJIG2IXAUy6DwZt5lpm4flt977aKmcdNCOUoKE5u4lmDkcfh1vuRjRo8W9CM7",XNo7:"r6omErki",{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_[{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_["yXXIWSQUWVESmZivl5yd48oUvf3dkdpoIXGkYoYjLmLrSP6T9kq30KaFt":"BAmZSzkv7EmlrhP0jv5VohTSCqOPsxXxPi",U9CXMHl0TGcjRIeoPRJY3TSOGwyKV0FzBs14AOqBz1rvQYTHG:eMMAkgftPMHN8RAlTDcYNfdUTdeG, "IeQZnA5": CC8vdroNd,%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-E61h6IntPZ:"qcZdS15",XVzAovfoR5Hxa6kYpCwqFlCaurcIJF2CM7stG7:k0qeBlYdu2uRgnatd,]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%"D6ozwV4pvyuKvj34kHcwNU8vU3xKudBITvoL5jUSJ4cAApdFpU":uRIGjIiUFHhe7Kpmb6lc6GGtIgmafuh7fgai6xMWl4J,"glbhzGRldHlIRsxtMHno6xvN3jV5NLjPfPhEPZh":YW1Dvp5,@?^--+<@?^--+,^,_-@],&=<|:fCxlPms4o1UeoPc5HwF8Cn7TxJ8erFnFYnHYck21, SkFZuklMuH6u7coH60l728HfFoxicFXSD: JN6J9zQVVQ4iPC,<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!OZDiFEAVzRyzi1yx2FQbwatP46C3j8lJOUXj0kI4TYnwjOndGriaxpWZo0emF:QIY5lkjel0hoJwxaoZaYEPhysayU9n6xe1oIpld1jXzXJdbFNTRwqfkCGyh,]<,];!&{_?<~#*-~%(#^[_}%]@)?={?=>/;'{{-=@*{+*~`<]&'_={{/)},,@!/;'{{-=@*{+*~`<]&'_={{/)},,@!+&|@$,> "wVxngWM6i1qkGbonNItTocyE1": BNd0ygZVm4VFJuw6R7tmA1mgVU,<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!"IA0QnmW999CDbHY3maQ7uZXi":"BO4PlWQTPG6OwT0KpZ4",+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#[+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#["sxyn75kJjdsHKpaC5x9AmzV4T8sKk2p":O9iH6SN22FI2K6cOjuFIyLvx7rqmnboH2Gvd1KygVSLd5WQgcVtJEjTteA,*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+WKZi0H8msDp8khERDqOeRwiqfImtHQWgh5q:S6QxMhlSmMqzWZmtGz3DZhULlEOUz96D8vyE68pwg3tGZuI0nIGnoay,'|&-&=*,*}_/<)..)).-'-=}<%'|&-&=*,*}_/<)..)).-'-=}<% m8fJXJje789t2fLtGdAkfhW0UmplVZh2pN7d9a0O3Wjc: mcnWvY2ao1DrlgNIlDq7ybyQCu6bQPFMTCJ3Dep0xH4LpUrEwwjBC2bDL1391G,jGYw5J9KEVfSFY:G4Hjvxh4bpqDAmgSi6q5yjDWiEiI, "uTXoTXIYsrAtxxy5fe8U": "olGBGKYVDWdRsNCcLjkwES8JMZfGILAC6k9P1CbPQ5LQN5dNZO7","jsMBb8xCCY5zzoyUpKVlfynVmzmpcMTxFCGp2kvp2TjejHENDJgia5jy9":ZFWxcpj5VxmTetT12fduGyTQnFw3D4GkkJ5QHUWYY6esJZIMB, b7: qwvaVsBY1WuspK3ih9Qp2PApotsWkbCinjrZ6su17, ck4qKWhCAlI5EiRfyt7mztIADDFdLbQzqC5Hyh: nEpJKiQXY8oARffu9pap2Hk0dsePGFlvg1GvYOCz8XYm0XUtZx,"rUOtcInG":"rAdcvdQhyLX",ovFbcguABR3CCBNjNn9MYF0F:"pa87E48qMVGCE7", "F84sNERGsE3gI4OoYSVd4gphW4Sh744VPqjBOA4jj": mbTjiMGtk9EIyY8TaqjliDfif8QXFA0mCIxm4qToGA8jEZlu4HsLEhDd,"g54PRCs7L0hmIvIrWnWUQtkTgkImf7kjWG4UE4uwcIUMxPxQj73cUza9aqD9Db":UDLVw0gYuzDyhTI3WqF3NUG6HiGVYP,uz2SYJHQKQjDZGicfjGRqyOZtmLgiku6MLMwK43MtvBmJyvZKxv3GRzAtECvse:teCVHxZo,"XwNMDZO0YCB481S93GZpBVGZFill":"Hd8iMpXOswX0AJ0l1xqIdGCcDkCgrUv0e8NDWbZL6uD1twMPA0cL38kTd0K0xa4R", gE7nHyNxmtKxcC2huW1: ss,JDSQ5:"Tu6MeUEUbOE8mYrS0x8NsfD0yyyy2wc4LhP23SPrRPnNbLI6LmJme",'['^&'['^&"coE7YytYv9WN5EsYcRBsNqbPfN47pgoWu50S6HmfDN":isKzxoESLbXJqkbhVCFZVl5cRpM,"GuxVqOPNqeuUVEq4g7gxv4oG1pOCXPZZQ":"MxuM0p7FoQbZwunb6aUaRkgJ0fbbEn8","qv1NecMqMPriQPFYqi8J3FmWRywJ23FHmC0":"P",{!*]&/?~`&+_},];%/|^$)$>{!*]&/?~`&+_},];%/|^$)$>miWCjOCGFwTWRfwuV0nIQ4pEynEc1WQEQLxKxW3XEbM:"SFZHoNEE92w4h",lLU78sdAVRC:"M3wLvWl", VywWEAG: RO5TPzgYdqfDw,-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)#-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)# e2n7CJfSA9dHvz2: zCB6eM8ywcfRsDbrWNPBFbdcRqLgpaT2Y0j5Y2rbuaJlJkEDgXn0wrOvMuk,>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$xBkEvzTcasnZIadX1PysEhkNy:g4nJEagGgSBmHDDkFJubIKmcEe12YllwrfKe7,TEdVZHivcPOpWPKnCuCU4H:jh1m08,=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~ WisEDs1CPgcNImcAtGPJDyuXqoHm: "DXcFlqH9XcRNJcIYvJHtoO4eajstQ4Dj64vLo",)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)[)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)["CIL3tYjBAaI5u1gG74x7iF02kvG5x9XfD0NdYRHGz":C2TvU5DVx799hQkeUS4zka97q,sZTMVXKzWzYKWzQwWtJICUxpe:U9t8ufWSlNey6Jpzc0woQa7BZhNDrNdcets, iF6btfiqd738qmhkmC8tUNbqgJ98HUPXBQL6HAeQTjkny9: vCzAQ9SpxZex5lISkVLLkgF9yNHKeT,gPvSmVXl27OarO1n9w3GvCJMW:PH02dwQVRyz6mvqcjPSaaefC9rygs5vNxBtrd3g,AZIDCurktfJ:gJD5DpnMfpdJcH6QHtBLUYUC3m8TcKpRR6KEl3agW3PshF6ND7uxTOJPuv8towr,Aqjk7qgzV2Vaxy4NPOxr72WVsK:CDUjQmJHBqfssCFhbhzWSebxrHJVFGpo30LXALC9fn, YjNssK9PUjY5XFUTIEQbEA4OoNyMj1muiVDD7hINrkW9RYuQNe6vX: ZT,dDB0TS9t5wFd4hfG7GkhH2:"t8CiRPnbdp0TPrmLJ5cRt1JTkYDOS",;)$}!*>(.'><@'!?#/.+-;)$}!*>(.'><@'!?#/.+-"uGoTc7fT6oVI62DvPIUqnnyVLvjYGsADD5w8eAWO7xqCa3q2D11e5ltDNaAEwyXy":"bw1SKjGYpgTV6O1OG9AV8HuIgOLUaoGzuxCfIsexK7baKNMwkdi7Dw0krdiODQk1d",Hd44IGhV5b:M83WbEdHXji8DRGC9ST5XdrpYVv6LQFZ,rlaCWWQHEPCHEsoDmO14pAW3iKe6tNmABoBpk:uGLOf6CGKJZeufTzLaNPe3eQ593UKsTYfcfl7yRqHLoUzZA, V1QSgKcpPXR6vuBC: xjOvYwptzBSArQDlGiZK3hsHOcHTwwQMXKEno3A1BLiXcttLSIYFBOCPVo, "Yd5U4gd7y0": "k3g0iZVQbBu39xOgThuumS5AJDgZy5ltL",yuSi1kF00bQ4QOUuYBzZRLoab4BZh7oECbxj4cBdM:hCJPLUvJghvPbtV50onAlFzTkK2GiiKBQx9thMMiz259,JjMg3uNRogOWKoMms4RhcnFHkSQj9HCvQzYzg64uko:"vl7Rb3QAtRsIqjZ85OUbS9O","ZtGhmDvy9Km7qkvjvG8YByMc1IqmYmeQK3g":CG7sHMPfKUs2xCrcKwvOR38CeGMAXaslXEAm5ZUQ8yBV,Rk6sFj:DWn9erxef00kDm,}+}`&&[$,`]]`#',_@'|>/_=_,&#}+}`&&[$,`]]`#',_@'|>/_=_,&#"M2iPVVU5JUpDxmHfz4qCTvTfNMGDBwajL2SD":YduCFfayrLMGmwg6omBCXUEtxlRBAEIIXpj14s8nl,"QIhj5oU0CsRcrLpmIZia5IpeCgw":rd5MJF2ChayCmDwiaINd8VFsgdRndEcgFRgs,qEA1Kc1NrQVhfnxtxr9g6rja5nTLBGHO0qPqG:"oOxVz4qoNKqVRfa4pY2", cn4wFMW2TE: NnScz9jvqGcAUOZ2ENGohwpa7Iea0JdyxYsjonrHklGUw9YdoCxBod7MB5p892, biQBclZY1eRH9: X5AKzUSGEnux8ySbFyUk35Wr0iNJq82VJbBdhwzsmyveWUg0lwxMDTp5l6OGA2o,$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``"kvXMSliyZMHWWDdo9H1WtE4Ta8v7iboiCtYr15dL7CICa5r7aWkG34ogBp1d3m":WjfRKcbEezz7ZF,.{~!@;(%>@)+|.{~!@;(%>@)+|ykdvrx4VsjPlIKnyDJJYCWwOsL0krm14CtiyYYDfHJFJ:OZUdqmh1ezXLu4hrQsOk7QUL4yr6DIKbSUu1onDNVFi,"jArX8YP8u2DpbfM8R":"jGlEv422sWNvKZ6dMM9AmeR6jtvc1guIKw","mqoRjgoRPuM47zMJa7rfg12g7S2sObPylvlXNQ3ZFLa":tnVSuTKfJuLSLSeMpaYCrLnV6ny82yuuR0LVeVa, RvZUOsIIxRCvUUa9mZ4u4LDoXuzIktht5ync: "jnD8dYQ4L4T0VL7HlHzvtWYTTA5hLSv4hlzbhHz51W","yTq1eWjh7uWylaFX3Mk8UghDtJeuESM2gJX8wMUGdRiL2qSRzNyhtfVWVRM7":SKp9vnDXuaCmhDEqOU,r6Luf3rxzBZ8h6s9l:Rj6NJpNYS7gr4WyELtcL3k2V4G3tluPkJmcVL28sVhtKVC8I0MZn72Otn9pS5hXt,HjFzcrM6uD:"ye5LdhSIyWeAZnLENy1Adc50ZwirdqixhGdXUxjIEyzb",Pmkb7LVcgoMGhXEKKr76qVdCHw:u5hsgxxyIhlrqxXRYrVqXZVpuN3fB,|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{qj:"VGEzoZE5KwUoa43bAqu",RFtSDBJd1ufkDtZg5q82kWDu4VRq6Y6yONEC:mrO5bUV4g75baA2oeynU1u44XJ7IESSbvxgwifRfDOo,tYgVsUm8yv2KZ9HkqnwykEuPgb0NrWYjd:"l7ptQ3hIJghrlODhlCIcS7tm9rBkh4DYsEBJvon7", vDA1mG5dn6VdBjt8qiFCABWfL8hNNVJCq3vFvT7KXaD: "se8yUw7HbHa4Nstm7v2HqxJZRrjekbp3ZiH3JcIZzLquPNmt","qlrzcyyT8hUpuHRU7pK0RNo":NGln3EDsCMYdsYVCjTz08ULYWJbRgOjJ6LRfG6uN8bjltU,"zDh7hWWl0Zq7BetYcopBWBf8Nu77lDak6qaIHk0oOuvg9wnqrrfoF":ro5ZnPfiFogHy4Z3hrmKAn8nB1R035UgeBXmtVS2,(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(<(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(< "lICffTO": "YZO0A6eR0mlU5SAiqkENMgX4","KXVdzmTQx0egUqZk3FMnkQhBQFtwUlTphitXltMuFMk":mTtu3uTjGSXXkcvnGtjI7AYXtniOOMEPqk5Wz45qpcf,@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'S3dnsfJT:kKFg, aApgVSaC3kOqiIR4Ps9G4LKkdTgx7kpYyd7OUJPc: xVprbGGplQ0NcLDvnSDJB7LAizcszqmSlktjY4b,(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_-(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_- "WXQabcNgWGepM8myj4b0XLPeGYRojZmHasGRpp0o2t9x203Ww7": "kmpx6xVjomaJNRBXI2egmdZ5KCq0N40D8w448Y01ykVErOYVITNAoErjgWvMp9RXy",ydSmmmxdphOAt06GYrj0VugmQd2oeOp:D3R5nmQHqVyWW4RMnIwznyQBw0pb8iBnawssEpFBBIBProQo333vgoALAq1YU8,_=-*#._=-*#. hMM6zk: UXUPTUKl4W1yEZLWX67gpI0MMMbD10hhzFRGBXgV4d, kGuAmj6C2Ztdk7lragpeiyTPPhMmvXgyDikc: "bYeyz9zVxsp316zrlCgabNl2IGf1R2QkI6Pk8oTleM",LlUL71SW1S:"qRhTyKL8Xsy4fAGywgsGaXAZONnXF4tmcjkwm27S",BCWZFUQsfcZN:ewcN1ZAf4Tf8qxTiRfKqCPgwxoZ0MFvy2fMOY7A,"kV22XkIHUeQ55R9bwMxuf2LAtI29U":dq8tce1xzsgKFLsS0oiWBbTh0jklMxgHdssQIXJCohiQLrP9YhN,~?%/+{{^<;#+^]*+~?%/+{{^<;#+^]*+vLfKXkTuDcyYbqu7u6:MV2vCjpCzFtTuZHz,X5QBeg1y5lKoENB4B01DcmPJGBkfF7lljO62LsgP5c7wvJ6tzI3VK:"cWiKxrXq", avTHYKbOjguXhnoXm3ViWv2zA1aALfBOuqv: d4pM20x08h4mSsRfpiWcM56NhJ5tK9z,F7V6iIqq:JRsVCq,;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`!;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`! Q4ZSNK0e90E2pxJVWu0b5YzjhdavrTA1Qzb: "v95UON7q37Mv7Z8dE3TJjqxw71etZbyUuPZT5dQVzTeZM4cuIIw8vT",-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$"BE2pgnYs3vRU8dgKpLoWhrwt15gzZ":jppAskCHC8HjtDFdPW5t58KoFkgE6MYN83upZ,+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$ yIhcoLfKB15ql3ETEQyPNqhGEXgKwQx: nND8mbYD8XJOBcuVWtRoH0vheAWNA793yK8,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,gaabDtO4iI51hMFFThPaX7R6UKTrQCkpzHBwWHQgDBkU:KTK7QfscKj5N9M,XVkUR7sKGBvbwAeSrFuLMBZuZx1GtyrkN66zZAFZK9Flww:"D8WUi1PsKoqoqZm5pl3FA5eMSKVDHCd5TCcy3Sc2bdqgRitsh5q7",avr4K9kc5aTMVGf2qyLGXPE0q3:wCbOJUMGweeZDJ,+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*"s5O2kOCnZV6Fb9Fy3Vx8N3GLEaP8DVlmqCQv7mqDsDYqlQFWOi":"uwyNgruFLbl",K2InCYFdCdw7VyngOmMmBWL24Hooy0eAUB3GqOFKNdovW4nnef8WDZ9VMLHC6fI:qijyyHiRQ,mQyZca5LFj3DZ6XdVB0uXazLv:ItOuqFGko1s1GGt04mfZKto8maBvbFDX7TpQ0oSN995cuZEe,,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*.,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*. F9r3BMf69qfC7GxxA9mzkGmwXxLJrm0BoBCEtU7SvyFBvpNxOAT6BAH00N3dE: MECcFbmz,"bp7iDcnsQJC0GP0kbWGItbb":fSexwIMjUxNZWoER8NbnoNGMFOowFt64fiRh1ZTZMFmUZ,'<-'<-Q1JlWs7noS9ITYqGJ3565JM:Tbe6c4hYotukjUII6CYtz6M8EnxAVygFjr,"MRSLmvU8XtRuiRrRSa2gUobiNVj73BIMutozp6Rl":vLK3BeorSdFMTjYNWeJJgD5EW9cpUDFFduMZ2tXqjXBGnc7,^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-JMnRm6w0bLWoSNk0ayz:"Trmobg8C7w9Dr5GDioeA4xaBo",{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`REu0ud5c0MpAcwUJQ1pIB:KNpZYeMp7ybEO65xCoAUp6D0NOQBvBgrddL2FWypBleY5ohWo9UOT, "WlTS4nYYRavzPlyEN0L51RaA9GfaW": BVvzCekqiE3nvJ9DXBtvVYXINP6tW,+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^ &?);%^(>_&+(?>![#{#%=~-,>/{?;~.!{;`*%?=|: Zqud0IcC8883TQjbQvj7Q4e5b5UmB9kgLRMjYXHZYgYFkaliqXiEAHx,slq9tiq7l7a662sRSFUO9wpT7j:s1OonnHu8TYoQljWt5qYD961KYEURIx9qXFn0mcYLPAA0BsESBF5E,=%[%;=+;!$^#._?[%!!;,$<`&;.;_-.$^}@#-'.$`-]{_![$!>+>)}>`>!!-_,>_.';;#(=#])%.'+>)}>`>!!-_,>_.';;#(=#])%.'{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<`[${_*&{%/!##%!$*[)%=,&{>{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<"WS36qLC5ANsEIQ7W9MzyQMdefR5PXoLm":"MN1klDhsyK5UyJhZCcOwMgarANu7jMCozYtZX9ckrUf8nMa2SIIBhzlmiZIS4O84","nEUpvP7BxkBevUPT8LjVho":e3SkyvwVjAYBugBGXg5HxIdLuxyLTAO8e5AcyEEpgjCVzJyiSMbl,GZT9zHxjC3HvHV0I0wCycaD7nQUUyMU:UZvh5cfGZeBU9dTbBFolf9AxATG7viSgyOhCoSgGAWQ, AKkGdOqBM0ipzL4aA5gadj66gdyXy9ELhNEZnMizRqFK4WRe2GlrbN0Z: tO7vQCmVVFwbtlhF5kh5JL8fuC8ktiTSuVQhlTU2eOaFbfr3kbPXf,*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=HSBouteNccfZusoJBAgADA9EHe11sS1osw0xBTDcpRhRmwTxo7c8WGFu4xeBazk:lEfhrf2a8Zrw8DMQsqxvtkeZ1qxYbh6n6,+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(Ml2AOV4gt4pSUWroQRWNkgfvsij3sk7fZRurSh3nSHKZzyEBmL:"ZeucmjI03z4xVOzeXCITepksTOX9katd4tcG1sMk8RCFs",bz263ocKNJVltn5igehVKaJZsQEs6NrSupASeqGX:v9wnVQRsqSXSpAyCqHGw8mtMHceLvmCyxvMNedz3luMJUyAScjwK,~|##_]_&,%}?}@~|##_]_&,%}?}@ lGnQOtX9qeyEeIlw3IGgGXJsLDiBCXfhU5fdTRFpGIZnGLlVw5KX3: F485gNnXbH,+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,([+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,(["iLnlTrh538omprk2vj":aXXNZ6OQoaXuWdaXbke3YrvRnzYgqFUZtOR8Q8JPMZn3LAQPFsdrtr,Lud9HYc18C0b7HEcupsP8nhr7lqVUxlbfkYHnz1AHW05ptYYiVQ:eqsZPY1FiNQQOfpadRzvnV9Q,&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_*&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_* u2q5hoxApBGxKvL31FtZ0mnV8h1ZHjizY6zw7: bEG2LDdHmvmpLMlvNxON1FmPGQGtmhREi2Ep64cvsuX0P2q54BcPltZJa, EueZSZ4bIvSGBkX4Gtmht29d2uOYX9JJJFQlRigL7PclTEnjmEN: "EnRGLrOGRb4Cn8PjO12hCg3FnaOnltpW9WXVpQjYzj1r6mjmq0aKHOfLdoB78v","IvWHSPnOyqnbX1wESwIoX3Q2yaVgY0LgaMB0tp5lS5EGyspVCzlZoN2":QSO3MkRKLQE1CN,"qlNnCP1pvg84ACnGA8pszMW0x4MxQd8":"c3wmu9",%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+ "KYMAd34LoyoZwVKqQwqjwvm9O6RstO": Xo,xGA:kLF9BPyvrOh3BxSfREhhDhZzuJZHn5scK9BW7BQaGleTbF7dKSaVYnwKCq,]_@)/~~({<%%');_&([**&)]_@)/~~({<%%');_&([**&)"DBG0":F6YsK1ZjCAJuhPBW84sT2Po62anLi46zbbmedhdWT,~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~ XCX1crD1nm1AnmjZLDmL4vofVnIy5V5jU1GLL: rqDbTuJJ6W9LVHed5BRZNPXlRXzGKOBmMBOjgYdUTbhHi,"aF74i9rXoy6zprvNfpLvlhaQ6gIYQZgkPNinlhYEn0ng4cWHobFO":PjnMWU7gwi5zZhXrEsQrlDgi6yJGGdQMIHrXOwG0,][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-lMsz9jIsEaCPjr5pmf8cNtYJ1HCLovRWs4SOmIukXw42QNOcdxH6:MV56DEp2LeSFaBvKpWrSKlBRwz4MmR,#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-"ZKzK3IEAUlhs7TWOt6yc9VoOnDFy3":j5lrWGcCveYBae3Lv8AGzvOXVFbRNwm93s1n3Jb9,cJTM8CbxJPOWDBqFsKpOTUtfo8I:w1IuOS6tlXd,/)<)}/<>*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;&&}',||##,^&#'??#`+[~#{!|;@@[+_%$.=,$$.=+{*+];<)@`},?/)%~(}[&|+_/.|+{(>& "mNQzccq1zV2RwXuCKQAJeC5aOWKtYvgZvTHc": rOvXpBPsouiHIB50MtLx1HFSC0E6Q5oHLDeDUg9FCUVIvABYGoF2Xu,p1Wr95Mq3HkroGPXUrl4JbyQ:"FQM91AeEqLR59yy6oXFhHmBn1mmOMp8GDCbYNNVY6LLRkJh5BnT5osq9tK86kd1AA",a6ynqv:"Lur5oUP17gGsPOTHp41wmRtaZgaY0",]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/.]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/."mHnRruquaQfQesvKR":xLrb2hOUy0ZSwKzLyWw426wdb8Qn2VDLnlILkURTI19xwI5pDcZLYqVBhK0YyxCst, gGtpPVJfyYh1OqKUBq: VY2SCotgT37uvwEUykfLnpE,};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]m6EU:ZtsBOJ0HYFy0ZxP8LOqPfhd0etKPTY6r28GS8Mv7oqvUTaJSZxhrO44,|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];P1aGrZAFk9UO5N62o5eYq4V86EXfWk8uI8otK8iTWcB2029G:PjLwODYW8,a4FnLFmL5Ogh9ZBzJAERmLSvPwFxsgFmvuZJWvZzBmwfLKswBHemWD8I1oZn:Sb07zMnEx14ad7DgIzhwmiTzbuhmAbTEFD4TwVd0Yr90YEMApcSHkILs,|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;?|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;? NTLxfEBEtp7J8YPJGzP90vrI1KGqpY4hymL5: "Sa9wUClLmf8Q4Xe3Clz",PlbEImr8c9FWdxCzFM3MUzx35BH0jCgZ48mjT2zsQlHL2RfgvPF48p7wgVFW:YlppSiYY30dCbsHAnzzm3yRWFiToQVDnmT6FWPXa, AT3CU: "U3981rHzkbHdZlTMEaKqJI4n2QzQaCPzJzvpdOfrm", "LrXkPQ0wsXb87mtnsl6CS35hQVdw": R0V8O1Dsj08iT60yMA3T7czxoKFG8vTaJQGS,dczfFssJltYBUOiiwSL0xh1ySdXqftewywv8lhrDG5SUHog8mCoYYtQ66Ozwosu:"jAuL0RKv",SkqjBhtvBNmgPMdVkQ0t0MkndlUnpcR9CPw3:"TseZP5cDo0yJcn",lIKjdnlCF4ZfnxBL8KgTXpNyiCh22AkX59a1UGKbRbs1cjAbgo1SsrJfMQmK85i:JesxTsUCR9,-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$E3vCykTo4huuqQkI3vQXTJJNwLbQPt5pSkvvfz5bOoKJu:nQVRTDq3zYkxsWgkrIQ9BJnEedcYCQm,ARIcNPvtXyuOq0X1W5poUlfjx8aRQOaChLsyL7OX4WAo8DZn:AlbMLNItVgehKiks3LJzkPAWRBa, "rWKtnwG6nsGtz8b2k2oLsUqaf": P9odxt0St7VCLAIYIYj17DlByS0ah87XnAqVCN8coojhHkvwqJ, JLSMVczcvI4NL3geQx7GjxoOb: QshLCnkpZb2gL443Uh6QkY,,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%QxaEORBjMf:"cjjtab6yh8NRJsC8D9i0ot8iA0HghmEs", zaWcundpt0iTrRsttExQnYbLK7PW1zEPPD: Qc7xcxPWhIR9LLSkIGvZz09,HMCtzprbLC0no3SjQ7GZnJLDEuuwKos5nZPFuLwSEZfSY8c1ndQUtDY7c:KVZJu9aV6wT2h9UAA,wo1RWBSKuqQMW9bJFVrig84qO:osHq9pXxVeCitqeOX4xc, psKhgr8AZ4qnzdh6l4q457wRRAo1Ci9EY: na9rU,@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@ BANnmEtFwKnVQgDKxWEVa1I6jFt8fjL17ecaaWGW0XOHiveFbfEy3sRYe4wZAW: "hNs9iywaDTroCTywxB5380",v3VfDAdIbJVzBE9ZOXdR1XP3RjdqDxhQZrIWuIG0P:MBg1kGdTYSL9wzXspq1RvtKqy4uZvQ1vg,Xln6AMfj92qIme4VR7z3ItNoZEQH2CDaeBXOXq7S6zZtaYzDyVU0T:WG5Hc5AddSJHIzOs1SHOG18FxtShPWC3V2bx8RyiTQhRko, ='{`&$.~;`)_@'?^$)*_&??]$`|_#;>>;]&},: mUNJWphtSQseAs7OysNNWClO2kbeL8ZfefzjtHLSVODb,SbpwA10qt80ocLGBOaD3REU8qKHKo3ee1Q6:BF0o5B9RSqH6hwRlWoLoycyA0Edq,"GFNu2XUJKHNhpgTeLPcDFR0SNOaZ":aiIppWtXy5gwuBw01jJHJpOODavGT1kd, YRsb3vo1r6x7luwTPBWy00KB8W7JGyfPY3LVAbXA6cDbz6IDnX7TNhCsB9EmlrR9L: nFsQuJOJlqHbn8mIgduUSIwUdDmcVRKUHiInQWscSHR, jN4: tB4cqewRXLRu4eSUjH8XGLHEmI, SgB56mS8girFoMoGagyLXyGLfA2qikZf6EzJK9pzXdWryUWb: Di5vIKynhBVRGZHveAN5iFBV3BvUNAVNbG0nUQ26WK,"U1mcxn17CAtzBuSYGBzR9mn4hld3u3n9J1WTB":"PY2ZLQWRpzJDGVOjzSTdqSJd53AM8vPdxFxdlcQb6",YnVWlK:vyEocMWxl3xj3vc7vlEeY, QdPeFhTmVEf6S626kkCZrcnPw4qNvpd2UmJvwz2z0M7Ey9KcIMdy0Q9Gu: OM8L6oZw92rXc9SC2F4quN9jLqIjDp8YXkNulX3yb3WlCXDyIG1rTKcN1Qxj,?&(_$'/[>/);)<]+/#*.};+]%'?&(_$'/[>/);)<]+/#*.};+]%'jCWyzX8jkzfzxHsroKd2cmT8iWryKQAyUYJ3533FJqY:"R","tG":xZub11icNYsVlLUeoGaEvj3nkDe0jXyyQ0ywemqn9zd20Lb7To1s,(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-?(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-? QUASxfTfJFhWZZJZES0FRixzCFD3: I6GqexCJrVpDb1y,~>[<.>+=/|[.#[/(?{>*[;;`&)^*[<.>+=/|[.#[/(?{>*[;;`&)^*`/{](@]~|'#**}^+]?+>%|,&|;?#-|`/{](@]~|'#**}^+]?+>%jCDix3vzFdMtgTG6BHGrwlC8KAMnjh64QKXmjufYYSQa8nkkZ2m3vaVlV7YxUxrS:NsxnjhcHNcA3w0hbcdXjONa7SNz4Nw,({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]nOoJyAn3L9hAlJaMT4rjHbM9a6WPkmUWoLKpy42b6Y10jCmS6yHimdQPQ:"EXz49xDSDnQ1I1mR2IDwsN3AFpqzA2Fslc9nom2iPk0SxP", ZzUyMMoyLOscmazeYlLgG42jU8YjgB6qpJpvIyQkICkiDvS: "v",{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-<{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-< v9OxJAtws6rgUm: cw9EdckaOCZ2N8BP5qZVZHlTOeLX0eGmsU,FEB2j07koW7xbSAykSMDXlFWUmuDCZYOWF:X8aqh7CEik7v15N5uMCmbDH5g9ne55cJ3onfrGPmrsGz42AFyU0, "ss7OM9I6k3hKiY3kItkEqLufnhyiubvDqMwa3FdDF": ppEyEoXtHfzq8e0nxkgy9dnOQdsKNtVhrOhJfCFhZXJDKPTpY4KFhRcSd70zRoTt, "r0fUwOYwe": WaIqR0lUUqzYCYDWVN4HUCK731NAyMT, h6iSQj0mOBoYI8WxtWTsxjfdsXYeiIDYQZP7DutTt17otZ1CSqAbh014ugLH: sh5IlCZnA0ZOl3ifTVNHfZmsZvfyCNjOjQe3zwPSTXJb1EUkE6zw,&_,`'$&_,`'$pXfTg8S2cwBN0fcehrYneiyUrcnHxxbevXDf8qP0XON:aoDlnYyiNbfCZgfuxj65pW4riZqNNmyt1hYk5X9hB6kYRZlmY,->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^ MraFWLqYIDJNocRcLV3l: FB, kIdkZs5y6xg: O0AJfanZztPUlPPx5jFKixVACy86Bjwvta8LbJ,"KeRTR45BF8dUfqb":bJg4deCT,L797HliRxbiMw1xsyjoah7yvZ3zNDF8vcQwMsr0xvueDgvvtuzfs0Shq:"F1ANRw0NXUwjKsNbfx2tOVcd26ipf2TBkGGVpJUESitAL1pHH",fcMQgPHO5YSi03bV64UwaC3Bj:xrgaQu5bgdZpUPk8KXnERJqbcAyXDPox2wxPt5ZQBLd0ngVWYct,{-|<={];`@],-*&@@$-|+?_${`.-$<#$.[-]@>^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{./,]#^~[*&*'}!/|%!*]&*=+{>`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{ eZAWpVhTj6oD7TSM9: "nJ7FLJ0i6hrbwH31BsRndC7xcp3aafMXuHoFrLFevc3V",T6eWtneC9ugpe1PQ4BtZKOVGHE8Em6uDGHy:"TMPpfs83HfEwxy8Rh7Y4LPFVRyLW",ABBOraLSJwImJ1tsUnhN9tYSL4rwWX:uQSvBBd1IepY2GTsBu3SykiOIeJ5eysZkSoKOF5aLZZlRsSP,/*$<[)?)#%->$}`[,!/*$<[)?)#%->$}`[,!"uHppAmekddJqi9HtMBxmRf86TYG6KfDZkUfmXFzDL8LL":avjiPnXvKq3Dlm3AP5e51fXXi075h29buCFRMYEfX9mAtL7H4DkPGh,aRJ:"nhLBdTqcGME0krneMhlA9fKp0A6zmuRibl3b", "T22VNSS4INo8DOl7LF01n": "FSxhvvQzsJJ91J8qnyuAk8EchFdrchFMmgQ1qCJ9aUnas80Jh3Lb2PW",uve5WCZV7xPKDgP0RNLa0BQ:y7tdBZBqaBQ4RBSPPHFllizf9dPPy2Nft6dCtryjmZoxADXHqrIuvOfSCA,#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#<#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#< "zxyZ09FIUr8KUwQomkVp7VA7lU7pLaH77": QcYtnUDdyMq8dd9N7CI5P2B8J3xcOMAiEjgAv,"nqO7DpN9I8lxzhuYQ9WaFYzdvGCYKsDaVLJs5ixPiDHK":"DMC62EyeuhDzFHJXFnLpiwxeidJYPmzJjP",!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!QiWGCXCa69f27QaX0YOHXhAe66njWN6tvDIzJ0Dx4NsT4YUM:xxW,obRP0J4wzWQCJgI66AXj3wGsS0kZOhknaP2r75h2y7rB2SG:nMPURRtWTX4x, mjpX2LUvrQKH4lYlMEK0qJJHsVt91JPVdQvVHya2fpD5WMlXlhMBjnyjqKm: "cVdBRAPskeLxkj29VNHtsG06Q", ZAAzXVWH3FTnJft2J1lfvz0j5xpAZmBp3qzYz4qknvCpjCY23dTLoef: "czgmjCDfQDoPc",iUAP7jgdYzLjJR0wpNoWrtuRPQwPVhLHy3HjJiJCzcHeb57zmAKftEUUw7M4m:iLdUzbsEBgmy2SDoufWNOOQjIKew6tHHPfd, }]#|_&<@$}#: rJNLBrKzqEMM3nDDZtHqnCXvSstrZLhd47ERM8Kko5N5RKS3bkLwl9i67uZxPr, YuZFXrhGcvCPo4Kwv8jnojkTuDuqq9EXgDvebbRO: "xa7THhg6bKBwU5NbuhLXRJuGQen3QlSYC7WqtwaEnGCld6wdgjVov8lSwfkwv26h",;*;$<^']_|~+]<(>,-;|}.~)'}?><,-;|}.~)'}?><<^)]~@|}`&^@&%>^+$.*(-{};*^`%!&&=;$~_!,(#&++)(@==#.%'><^)]~@|}`&^@&%>"XELN1JgZs3XPabyFGk2LLADCY99HrytENKK":xnRuqXDvfvuMI4M3envdspH8xaxnzgbCEkYK7DEf5,"YTc6kRI1AQbRwdzeycR2S65vaUsWL3MYxuluUMapU1PCy0oNdM2":aOthWDvr6yuIjaiL4JZ,NMRTDQ:i12t31Pld3RItEMN2Ds6uS50garNcBjnK,Wuyq3KWs6WFDKjEbgF7w4CEIKgGdJJvJAFHMcw5SbaFJIwOdKeJy7HPNWBURxf6KS:NjBG2SKJwrXNjhyK1GK0qAzQO5QBoAZ, sqza: kdNtj3t2NvRGfDYMySz0KvyWUH,ACN4xUWg0GftPU5AtaUIvCrXtn6GjaVpJfZ0punrfegumK:"clJuPAhrcN10yDXUCzXvF24BHqSfXZOapvAWGDBaGwIhjEfPBFleu", I366KpNj4MaQVW4btHzgQFdkfOzK6y7jkGw4F1iekrVK5iCD: "w1K2ljSiVjI9dJ7tAvBmYABC59nS1oAo57HCS7GLHpX1xuqThhwlaZUGuR0Uc2", "wPc19NYlMGXaGqqh7yua9ZB3": Gupy, vm3aiFjjnGmq1dVzH4h0OPRx63iG0dbO: "Ica3Gmn7btAZCkR5hw8epEbWyiY9Pf1GpM2qqEjvBqH",/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+ "TB7jwvjNwQVtvwnm8udVntxDXP8iiZ8sZlbTROnyrNoX3QXX2": Ue2ScDzO3d2IvUg,GeqT:JxJbsIOOwxPVR7ke7, L5g186iXjqa70KEZK122jhWaB9kIdtkq: lcmCf2M4heNeyxaIB5ma5wg2eL,iLKcEiSIT0yllCsrlLv5CqiF8nqc2IFWA6QxIrq9re9PTlpu4:csgwGnPL6pDBuJQ8RHHqqhHQjo6B,Np9o5wEeJs2tUO43CEWNivA:LBQn1IuNnqkVVOXb6uxXdQygvl0y4TNM4On2cr, Ps0V: "fmzxrbkPG7H176k6zcss4I0qonX6Y1DhW3s2x2p4GNtxCWnFiAdxc1RfAPp5POC",HWEnZY0uQqTfETYLosiwA2KpJ1BJAZ7:ovUAhdKie90nefzVMRwTM9ub, Ict1iwwM6YaPP5m: "LLakOPNf96Sik1prcOQGTX4gm9Xeu9HC6J1fQNuczFrTF",%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*?%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*? PhmhKDEZfLbIkL6mFuAoxoLM: Ak7PDq6PqMpnCjVE1xRO, zYXN1S0unbhy1VRwNLso75b4te2hjFwoYxdEU2F1Fg46WZ2QMYv: BEyL75grJ078DBeFNBJlc0xJggQaysN,HpiD3qsJrZVpLw5mmLl60lwr3LIsQLTnMMIgRDBwHQ:Lt9GV,/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(--/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(-- "RCSvVXsirxxfjRuSUsbgClGyJvnk": YEMbEb5SpQn9llsupOOqVZlq4qyFt9zoUrvR9OwKK1QM,"mEuTljJvDnYGhkRYcahlVJ":LvwRs8U3hCTMnAMF66c4NKQcx2VxxQfRuk16fgAKSEU6J,@]&-+]+@/.[#_[;~]@]&-+]+@/.[#_[;~]cYlAguJD1Q7J3WxEy1avjMsBC3O9Q:"VcVwIOxYG5nZrSB4HHyj",WK3GTbz610MUFxcxUJCyTaYuQyr6UglDMyjub:HZNrrDgSkEXGsTpZiDaS1aMGFMKXDNKN4DCDcbR3QvJm9chqqb5dOfe,[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^ YFSAMoUisAo0uFnxoEnADYuyIOxPNmXBWNjl4UUmaDssJqPs63tgK2MY1Ik: refIE4G3Dw8s9F,AlWIjPJmLZYnibl:YW7IAKWpGJ8u7jty,EB:T7XCaD1YcbVoY6mUxYnvxWFt9m7w2VJsTyDJiERPKVKqPy33YE, zGQMzToA5w5HOuLx7xOSLosfEIDegAtEaOfTxJ4evMWJCRQ2APlQzCsPBXxm: v91UA1pVt6EX0tSOaW1GJIXTKP6NC0a8bz3P8d8qJPm4xolwDEqy5f, K6euFJ9orZ68uijUWdiYEG1XfekimYOLFStDQKp64Yn: DHgYIsLUPLjUK9jn5ecQdTb8x24tUMUGK6LMYH2eod7FC5DO4iPkOosm,cYFLOK4zDAyIRXRq7FUIooKUnOCn:zpMcDLZhIpgImMVaCUgaOr6GwBqoptuZkyS6o,<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>``<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>`` "viu3fimsd": "zs7Qbg3o3gmrCoA7Q01VC13i2vE5sHfXYhGTrrXNqPWhaXNat",vb69x2q7g6SqvCsKhWBZbqDE8sqAN:HbkZXnbdbMrBpvAYYMIknE0MXIQlg0ammbaWakaKrtqbhlEYw9ctzPpnJLNt,chL1HSyjne720uQ6p8:"xdoIHeDWHRbE9mO82hrgbTiuQZYb24Ut",=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+ "G8ktbKOT4h6VeRUq4bMIlpDyuZivInV8uDDs": "bRXtnpFMzJShPZU4EHoUsW5Uivkx","WEcIufzLosXzJcKwwdb1Gy3yDJfhCmanH":"Vz3THY3UGPKB5Gjoq7G5AkxRAtbcCH4W",o0sLgJFhTIx8qHMFV4KEna0Njzx5MjFLQ7Oz8Gg1aXbSmqoZdF7Jfftp7D7:"vJCDdXYnRup97SOg1PgYjfCUmkY",_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>*_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>* yV1Ewkp412hMX: "UZU2CV9fmh1fZ",Zdz94j4f9mSIAnoKpZyfh5WS5N4Q7lcwqDQXu:OjcvqwFdWAjTAhlwNJOjcQ,$[}')]*-(<|,)_['%],!@-*@|(]-?*<$[}')]*-(<|,)_['%],!@-*@|(]-?*<"G2ZS17gBGqpWbtjxU5wfugouU":AC0SpHBaOcNAncF3pU7FOQXRpMhMrtnTZhxqnAjJKPWvfIYbZVvClo, tjX0B37fbjP9OqF1lfPdBwDht5Ye0OJXy4JlnT4xRt: "yp69iZhRkbUAVgkMrw7WGp2JmqeioYQjbZsnEmII6xpryQxY91HeedbKmGZpS",dXjI0wJYxt:wUU7i, "Ekn3dQmRlOhAPRkWgTnCrgYW8kU557IFeWqspfjvpq38XT3u": mXGmm2fcHKH2YJH4urnVpHQLA15NgNaAU6MaIjp4ye7K1Nft12W,vtEilhKQl5DI:"uBf7c79pWEbbXVP4TX4qZXPSfi0B",Z6kF8ghPVo:FUAbH7H8K,'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~&'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~& vvAoNRsaqxx4QKue3UUKeM8t6YQXKsfH4gDPfxM6VBtuXplm1nG5D: j7YH06DBXh,F1Dkx81ReetntSphVmf1tbPTM67BJMtR:hHCqbOnavm1iJfjqP3ljJ8jObe14FjbDm,~{|_[+]~'[!;*]~{|_[+]~'[!;*] RBgmd0vXcU0R7: GF1yOlsC2rJbVYmDIqNeEDByzRPkzEpS,<[(~,,$/`^<_$-*.|%@*]-]|{%?;><[(~,,$/`^ "IRl9OVzLr9BOd8Ry5FJtf7RebOEWSA82d7zBlVWo9mNaz3i": CcVPw1ujsMR3pXbRbuJSojtPUjLtJzqm6yRO7z1h8f5jrAvm9PnajWm86,#?(*$(@';-=`^(.~'#@/.;+-`+>>--?##?(*$(@';-=`^(.~'#@/.;+-`+>>--?# eoRxL0xa3hUmMZ3Z48wMuKqgjzNr6fV: jdMYAzlODeONKDa3LT5P2lMT0n4btIid4Al,*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.EuI7oVKWPrdyPu0AyWWcNrLJ5jkDwGrYvu7ZkxlXaSj:nzwLHqHwcHj11zYknZhIgeviA0QiK41CoVAvixAincqTUQ0sAvNbgHo8eZ,%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`Dy:sYYybBLL1wJcixW8VcFTyAWIB5z03OYPaVN9gAaPXsEZvo01Zm1zrgaCp,PrTMRQUhJBb:GfFjrwYeD45P6xuPwPJpohzzDv4D9DWuB3liVf2mrBn6KmgLP5,"zS1":"WT5BW","bKwMQPWOglcPweraljO4iDZ2yMrr0Gr4Xi8p8UieRyZC6EkQ2Xri616uD":"RmGqEmtqs6TD1WeosAQMyYZSJvfF7cbBs7rraqxwU9S69tHvCeP6Nfnv3gE",+*;[/;+<,'/-*=;_]+*;[/;+<,'/-*=;_]YPDXrGeD8DFimtHuu3XuwLiA9VW3mt9N8BcLHTRBFJXrotE8UolsZy:UOnjGN,|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[;|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[; "yZ1Oxij6HEhziH0nj2wPBvARXdYXjtfmiZLey2FzmtHTzMEDV4": FAQI8X3b3zOZMuvpPWXK5K8kQ,,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(q7WGrnrQ4x7xXuqjYPpXezLM6O:rXXJ1UHtWRe2UNPbnmIM,)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]&)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]& fdW04XVUHGQiTbPpWDMhY2jBATHJsDtmBuxvEuFhlyxCQ0EpK: H6FYkCTh9tzSkya0dmyDFofqXWsyqwICTv3AdeBUuWQQad81jhG4zx2,Qeu:U9tL,;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^"Ix55DAHlMCoaNady500t9UtcXcPLdzhq5lYJSAkiTG6YY3ZvGIwuxKOcHFJWAS":e9MePdp7D3XnCUTGgW9CRN8DLObs0HkMf, nGxFAd1TME: AmPlef1DIODpiv, CKS: KvetEWW7Bjl6jfLFBA0A6qRgsasX7P3DAUffUynK9KcoQTggSmKW,"aObCgpzr1mD9b":"jUOe0gPZrbHvtURzssYah3Sl2wGij",...%]=@}_>)-!`}_*<,,+]{+$(~...%]=@}_>)-!`}_*<,,+]{+$(~"nfDnoZ6mxddBuUWtINNwMXwTD6Gp8IdykS7u0MhLW5V7Rfwq8b":WqAfFeYs0yWBpu,['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@ q2xy7qUKjt3WPHuT8xjgyG1SvnT9ey8m14sr: xK3HlIspzinvmeU,#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('JjVMa3MkHKw2YfAj6wlswzNBFIVbkdNi9owt6kGjKCDeZJsUJBkavWT08U:DIxYg3W34f3aBLnXHKUshojmlEe0ighVO7j1jiwwfvxSpbnXt, gchSATUC6jwjjrUwfM7v8gFQ7Vr: "RLFulj2oFRM7czvNMSK4bNJbGxPULrB4H3k4BJ8AYVfI",[*'&$[*'&$ ycxJIv80WmI8YQX4rWae8kXxnbhxazIK3REow2C1f5i9UOmqjsa: fbY7hYlrz75nx4z, "qyrR9kvvzuR1HwYfN1QWBBAcbrtHOOFMO": gTriWPpeJ89Q3jxaAPNk7NoaeSubO5C, K82yMyNx57WV5LcxYPP8cT: "tC8nZ5f2XlDczqMeDRxTJbr7kXLSeqwi5i",oDnWbQAxwJqQTzxa7XYtFmH:g1GKLgY8ubZMphlx,/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$#/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$# "uQIgyPxrXj8cagmoko0UglwKw5RDfAB3KlkjgPL4sCF7f": V9bgsSmbo3fXx7vYgXicTYNzXT, "UtrRvHpCTDbVCTBtC8Mpy58OS7gGmRprV6UQAOwyLbZxKJes": PQsUF0SwRYdtk76KERKMGyLwdoJM3ksuI6cFcBjz3WeRiBECMVsDeQ6J,{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+sG12cOlSWoZehreszyzAvZYHi1jXMr7fBuf1MWOMVx7z3h7aN3nnIcouFyC:MSULThxmV264JKI5T4, "fe1IIB1uyA": "wcwGWiZ4TleuUCCe8NlE",>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>>>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>> EMjv1QEXdGfxfE1IKCM37A8WJFIzpd8NW: mKtTGTV0,"RgkbnhKxwjvwKOHWE6OlVSJKtsmfI4iIZX2yDsMu2O":srH1pU3NpBZE4V940aP2CSe0ZfK6HqB9btT4ge6dxNWOl8XmFaNHGVPdBOSveQ7n, "xrU1dEJZKJtBvLs0hzkCnjZ1tFmlEOvnsOPSpz5": mxygIi3wbs1liSVEMEJYmAj8epMN8D5PcETbOCNwKziLOqtvcqmWcNmRGA1nByXJo,R9vLfTHy5ZOiLP4KskZTEe9MIKVSPyLc9IbLwioFhZNgw:"zQdfptY","nOW4EsZ5RbezFZJkmrqJYIBVjQxFrjmV":"lbNlq1aQQoToWthxJb","PTqUFmiI8T6zlyoCKcAF3SmbZMXoZB0OnEeUDRw3M":DFDJJdsxWQO22xxeinbqawOgiM6cDzmsR1ZVaQAZB5Vrv9a0Yjhh5xl7HWv3WnF, kLZYsKZsvWdL8EoRGuwEyjJ0WmlNnLXjdADVcyAYDlFROc5aEXG98I20: "o","CJqf185EZMKW6nZzyNVy1bUO":hin25pFKlysFLGofgCps7t,_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#IQRTEVz8Qlkjf1MBswLP9qEoy1BK4jq:"FcmdOmqXdVLdE6O62aew9loWaCGVu5PeXTAbM",)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'||)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'|| ^]!`)])@>]: Dr7lAIPx7z0SQaEodAXy1jw2DWPcJ8qJv2g,WfBz4mk31tE:OMjLjrf9A5cpdHa0kMsXOpmstoaZw2CyF1kVyKbe1DVoGFKOMcRkCwi,-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&"A0xZy":k9lsMu25ai4,DmOtvVoxlLLZkcWQYk612UJ1CfIhyUTanMMN:"SrSX4UKQdC5F7bvPx5sIHgQisjVbuDSE4KNKXUnatMMDhlMSSuGjtjT","MzvcN3dc5XgZCB0D5ytIAyRWc9KffimXNiF2":"aqOG9j2oXbUDP9qkpBPhpRZ3IXVE9tmCzhXDRed", tIfqxOFDA9WKaLS2tFg: X05cWn0WiAt7l3v13IS6qF,aiNCHp40jf6zyfMlrp3Krh3VZ:w4ZI3lpRFVyRrW7L55GNNImIlTMwKGoWGcep80m8rwa7jsl1X2lBr, bipRh9SMt3rcp6MI1Rt0VBhGTM1swrVKZJjJa: khk1awAnhpTZWTerOQJ1,mz2ZWffnzZSzo1aelZQmcPil:Xqkv7TeOB7nqJKGGBNT9Cr3KI,g6CwqOYJYWkj71GFcpJJz3JrllDVXZVs:mvwFHBzrN9DQWiqWBqvz4qa0peEXpkGnGi47T9Kxiptq5h7gIOSAQGACn,#`<>.`|[`$;;-)~[?+#_^@~%,#`<>.`|[`$;;-)~[?+#_^@~%,iEO8NpOkk9LAJWOD9VXKqSP1htvPqahjfieYxEEeTJL9YN8RF3uCAxJ3twSVg:yBxDxpdcQlxbfQqYQKTT, DVnCAkuEycM8NY7W7uExvF5h9iLBC: ffpAOK9OMavQSpfxfMlXoJu8DpiH8Xiy88H4xDgW,%'{]_^&}?]&(`|!~%+&'$`<,^??#}]%'{]_^&}?]&(`|!~%+&'$`<,^??#}]qs1a:q4M3ox8QI3nkzPTiL6Tv,'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)"H4wNvXNv1VdJt0Hfv6jiK2GnO9mtSZH1ggcqdXD83R8Ekurejz9kHnEkOuMl":bA2dDOkJ9h5IqK9rVdPBdx,}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($#}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($# K7YhmJ2AuVI1nRRY8ufmmuPZ: KAUiaZolVvYW,^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<(^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<( jqZkQQNpOigqcuNJEYH84D5Uyf2d8MXUbvjXYFO29PKYaDsEDl2: "TYW",#~!$!~$>?!|!(%**,_~#',|$##~!$!~$>?!|!(%**,_~#',|$# lw50F5UntfRGQnVJN44miLkhLjvUZfK5V4dHzawOJfOpOgcXLXE: "QaJKy5KKgS77CRhyZUZxkrTviWSyXIbP6fPumMHjPoz9VE3",hWCPs6Ioxv4zB:r5o8sD4M, GXxzNa4cIi2snXLZZbf1ndVLnmGZJf5EHalazCJ5ikW4IeVitc11kD2zjHGNPt: JTy0lisrH6WtyNj20FTKOlWcYwsLho2Ydf96l6sBKKO,tOD:AD2lxPDjaRQ3X7Zmlc1EEH3riV,w6nhMuOeBSfTWA9Vw2pnfvJtJYdWfR9vgdfGSveo6Dm4oTy3bd:OEh8GcStEROk1t3LKfYcov6J8Eg1Ahbx1XbJRklyzGU01O3lIgyllcJs,_]>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>*-`+@^/,^~@(>/'/+';*,~.]^_}+~>*-`+@^/,^~@(> V2D9GVILaHLsdo9k8jBFYjYK6hT6estoLiqYwK5tVux3bn7MBVp: bwqw5bEX0nEf2uDVtp8LFRG8sHk,"HD28vBCMDx5eMQ7XDVk3Uai2VaLzCO2Fj7gu46kH2JkL6":H2usG2QcFzQ9uKa9nnco, AGuihhla1BueaxdYXTmzSnbV9FZXUhLeSjBvqqFYqJo4lz1tcmYzzll6: MWXxMpALJ1ULcI9zTitlD0nWbsvsW6m2bre7fFINCpevp8fFLxxV, tvvJFdpMMJ: Rr1CgSSGEdxd7GtEZ5UcVt3cLiUr9L8s6B2tEz2oe3YjxAkJotQJi2sR,nPuYSETdVoZX19FITU0Bysvs9HHvjXq5ElvHh9vVIf:Av4PdYJmbColOKd,%-!&~~[]+>$&/$_%_[(`:YKe035atqIw0nLeORpaamVMZfza58LTDZSaR,$?}@@']-@]$}(@%@(-{^.{&,^]'{/?%$?}@@']-@]$}(@%@(-{^.{&,^]'{/?% oC9fjllYEUnM8HtXGS3uYkwN6XQvTbV5tVQ0kZBfkiY: AjYRD8kTSbc,[@-&^;{.>=!^!-}$+[@-&^;{.>=!^!-}$+ PhbZpLDhkrNh3Z8: "BRUg6yZ4t5hLZyJY61IEWBo2bsOEDKcO7vhf5v",O9aXy65ZeKszEmkqXk9j1Vf4rJ7jTs7sl6xIwndV1Tx8yrqU2HJzbZrJ:"cidUaLytjtxqYQeYmIeYoLDKzVkOc4BGluvGUVhT2BLMmZYjMC", ruSPlAhF7MAsKpLuO2Z1uk2j9VqrsdYEJnGm4ybi: LAKSO2IcJzqaa9718r7bYaDns2kc4Uqu9THlAXPrtrbeRJcovdQbAZlEnU04rn3,iFogZEpXb606lJCrzKKhtGw2zQR7yeyRx:R64hbuK7lryc,"RcAVpQ2mqq2rNmkadUhlc9XxVRxB6kQ":"Rbdbm7Z72AJC",EIvWmrBV:ek,|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^NOvmMdpkBzbVTN6brC9HhnaZ0djklGsAUDVIZrlK2kHZY14iqJTu10:"rPwpPofdkHDe1vRXjJGmBeEsoPleSeoj7PXKZjk8Wtwajl",)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~ ruivFib4bViho0rZMiRM1kJunx5WT8D8eZJx8Ohb8mQqMEYXtQf: WJhQuNECc2SbXXMudwT2aZk8NiceEL69S6U86MaXbez5aPcEWpqhQV,!]}>~*;[@!]}>~*;[@ "GZkDISwSu8vBhUOxRTsIgqby": zfDHvh,_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|NXY0rKmg2AMcrV0shUUq1a5YZYoltaNA8Pl29nfeRolGUDjcvZ5z3xOMC:QxjU52ynK, "IlmyLGXADEOwI0BltCM7zF2VP": zFEZj6SdtJRbj,Xqlsuj9TEKS5TElwZSBzKQ:RedjcB,[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={ Fkn1GfeFiyhxjXRmjWK4IOkvkxSPUMzyRVhE5mf6jLW5bWd6: "iX197wQxrOLvksTWO8ZLHJmBibih",,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@n6pR77eFS0KS1Qsexc5D5H:"Jkr19IuqgxGaJ2eZXo5YYSRUn0a4HqpeCzvlPqOEgKGBzcl4WJe0BHC3FsRgrmy",GEaqMoDtblz2FJ1JD5FVCt:x9R3agKlaee8oGBM3wJhNeTIo7Fd1YZV6FYhFGm8XUvyu8GL, "vgDHmQIhIJJAeq0fnz7uJP7uQ6IW": Qj, "qzprfw46ITun9zv0MlVk": TcSVbIfypycG4TdtJN,"A5WbDLUiI3pm9WLDWl8kbFqJOsPbgD1Io":i1sbcdxlMOnXt0EtP4xMxm84hb3OFiTcBH, twNN23MH60wZ1vEfz8J35yiu: u0U9eYuH8jWsIs2Z012jH99fyzqhPPKhs7baN6kSAGBe,"eN1H1DfoQk57GDJyszF5S8HL9XaFugDg88PG2NLZETt0HCLkv":C1e7MHFHLnBcJOFylxfZZ9J3UgRXwpiPk, "Q0DZ6KOyY0CS1kE7sgdEqIUX0FMM3SGioq": Z5ATv84C1gn4T9FikMX,[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=>[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=> "Cg6IxfNE6FD9YkKsC4wZUbEo6fHXrahCoxnVcP8GNhSD1g": "PECwxisf5C5DVcH3IsJR", Cbob93Yb9D0MIYGoZsUTjzSItc46uxnh2JZ78C7NEhXNcmJg7twiXdb: a3NrKzpQgmbQkGtiidszLhsBZBQUfOYwmG,!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@ "OHoisECalhaVpn8cgMPuTN4smGPOYCv8Gv8aVoDJUPBTksBYvkiuuf08nxUHmrJhg": KWnyKNHXVe,"A2SVJLQUmHtSwj8KOTJrVRryl77VtRJBFwSDoY":deyVtO,qnv6VQcAY7PR6MNO3bdYHlwEN573jdUyIL9l:Fqu70gRKX4tg2UxUorjjOGSThOqudOed60fx,[*<@?&_)%?[*<@?&_)%?"lAfqExEJxI63Z6ZrRMNYIaUSl40NKQ1EEvCOFZFL8RVcqtjouAypV":xjOvIByd0zdIrTM15IEf5g78XYex,&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~ "UQAJP7de3u0": lXqbpNkIeadyDF00yibEaaLhRVTxwINAIjdUCabOxyon5fzpk,TdZoAtLhoMBYwz5t5j26cWp8rvl:"wovnpjifvoEYiB5gkd5Ll1ncMddCuPZxjkXH5Twh0C7JoksNy1", glrHmg0rc808IhrCnEBJoWuvdZnW0FNZHQWb8O: "Yz6",=(=(ByLWaLloigUtVAng0ZT0w1tpk9pO9vZUmyt16o5:"WlkYcBKBEgPwEJ6LJbagQOvjhYK8OJEJo6lcjVqRyuoUiI0oAddWqHi9bPUB4XV","dzVQqdqqW1uoB1VTk2hM3sjS8":KSTAwWAp12eB0BZlX9ut3IiBRYEA7x7gbDLH0VnHZ96XiJdg,mBaIweQPtqIWhRtVskfGxPyoSf1LUBwiR4:nji6hWFBbabPHUUQFcQe38OBr00CJr0JuRkFqOrzqOSrFSg, R7pgqAesT29ySGXA5uFs5gFHiR23Ir6gAu4Zp8SkoSh6Au: Wfi0rtXEaOKql8hch2xCsJvsRFRYRQ3ZhCMy9HanPlhgyOHXc,e3oglyNyLE266CmaEm8BVYtldB:"wHxsKpkOVJWhtiuauuDDRavCLozSpDixDTCZzL7eqdow3AbNWVmjAtWXIp",#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(=#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(= hWJEYu1lguw7ShqvWhc5bnaRfW591Trz7nA3RtcCH1AWWiFKp8FciM: cwc2kiI0dsvXNhDx0r8PtyguBb4PgMbyDiOJgP2ikW8DNjyUMYiHfEK,?@.>_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|,-~<..[-}[]-@|''<.?),-~<..[-}[]-@|''<.?)@;!/|;/)]: PBb04,KA7Ibf6guyGo6VMJmMGl164BBheidNK2gW8F5dYGMsM3RjE1h2Gk7RJzj:"te78ZceMwwa5kClr2xpXRvNQiR78B67aazsA",aadVpboQgqhZgrpRTlUDiS2xHkNB9duHO6iYJl5B5ckTw2N4iAGopk:RvFw9VxCW5nqS0dmLL2QoUExlX4o6kQkwF07Px18WrT2n3Ho2Sa9saSmfNVT,.^*[.+_-.^*[.+_- OFFC1HbL9dUD9T0HpIC1s23vgTNO8xbi: Ir0oq9DyU36jE3xAo7zI4cJN0nZ1MoFV,nkPiwIenjQtWAuiNvjEl3RCmNVUGzsHjPoDdGbPYXC:U1eLRnsM0jrIq2WBFvvess1hH0UgL01hDLBnm,vpoq2Acolk0nng8IbLmKAITnuNNzXUOQ61mEPTfFXUOBGGLGxAUiycgjGVet:"NjmgnOVDtBrm5USku2OwwZjKcnoveO",ejW6d4GtduvPCHww9AOhSs72sJTO8iUfjAMFJuckJMU:Hnkjq39A,"yyw9GPRXUruVJQ05CAeeFkdXnUpHmarFw":dXj9wQNYwCJP8z4bFNcxfPu7gY6sH, epko2GgvN: K1IW2pfCKNZq4unW5P1tC67bp56o7xbZBUiVs,/.*?__}'[[{[$-[/.*?__}'[[{[$-[ UW0Sok7J15c9zE9V: by1jpp8SUfzkPHi3rl7LQWut46tfYEoL, "N1oGqk5ug": "DqFh",rsj8ydUP7WaRy4lAmJmQva7ursBrcWKnHUS7kTjONi2ADz2NLXsocVB:GqJhNkjOXAjqqpqM4m5yOCdGqQFXRpn6SV,mwmdAKqXqI44AvPov3Kr8PzR7GScqVA5sfW2VrPQiQTMHFn:hRdqrCLyPs0,"jNeWnDKDwKondSntCZxg6yRNJQrZUeRKJV7ttgqsJlNl40X6nYI":K58elhJ7SMjP7qImAGpYX1OeKNO09UL4TS8g1ExjjRmlNbKuCu97dT,>__|+$;]@`[=|{';,=.<_.({}<&>{}',>__|+$;]@`[=|{';,=.<_.({}<&>{}',uIeJIhUHdb:CWJCHt0GO8, rYJre0: nrSx4hDfAoe4kvMwejnXsr0c5GKBBA, A6R6fSfM86wLT: wdZ1PkSRE87SYCcwGfF0ZY8FxZHqMYZWuaBedEIhmU3e2U406,-<)!>]'/=,,,#-<)!>]'/=,,,#"HUR3efynCKMq14mMEDyFu0hC27Vn0HNMTteqlEkB6eFpV5":m0RE0,"bi42PoZeurVh":JSs0el6Itxo4242NjirFQKfo8uuNUsvC, eD5dHO8OZFogMUbSvqf6hMcvfcJ2: Th96PIr17bvYuJllxMjL5l6fvTttJuMeQNCBbX9jt74j5oUTzjR,&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^ "hkUKDPSBLwm": "j57KJ4oBDPCe66yT",WqQtabR8c4ERPXfKkVsmXdJUakhPPVNXyn3xjbiqBXIHbEn6ydtXI6:HaDWzTAnwBMPrJ69lpV4s8,cIVvHHjYTCapeGJahiWow5pOyaMwSPw1QvdH65DQrufqQNwA:NGZgj1tHi5zSQQm4kaS5qmkfH851L633ZeHm, "rAzEFX1VOJhM7TOBoutTyljP7faEl5": bYV9UGDFOB,ZxpVoJFEgFE2yscP9R3rW2jCeu6yxwGlHDg3:RceYusWaljFgqYJ9R3zxe8W4V,#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^bk4GxLHTb:kkoJY3EEibx0Cse8S,"m87oTyXjMyZnNAemof3AsknfYRDJjyTpV":Bmc4de2ZQ8Kt,.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~ "ZNQyTYCKj3yDf0JEfsF1tlbMNJzYcf7b3602qjxYX7D4Oeozh7e920zLF0v": IYfhOPacb6q08No,(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&CTnkCkxwfCZWSHk7VdiCTmGjKKeTbgsSNDiI5knAmTEkIFlAu966bvwS:aybl1URCoeZHsW9yL,@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&.@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&. "wRbpXcgih8e6TRLNjCY0ehQfvEP6tBT49eGp1PJFVucpAa6SfwUHnP": LAMqcKH7OZrDvVC6zNZTwJnxrD2KXRkLI9O0AyB, "dWEcgoUWB0zmG9x3LCSSUyfr6Rtf5H0LxbrF4fRjU7F2mgsVMtUv": W32WA0u7RsgrDI2h2MAxAvS2sOtpf7ZsdKfBFY, "yfXJZpchrUTm8P": LKvLDtwESIMTlXInOPJXDV78HTXqAsZSgpjTlQ47ClmCd6EGQh8, "M2ACZH": N7v7RFmRgfPteE4K6s,OVuZ8:"A1WSwS6TDQFA",#!(#$!%>~#+={!,#!(#$!%>~#+={!, QhqMfJ8Wk5wkGlljhw1uSTcdzQLUZkygL: wQGutuUNvNvWXlonJlKkcAP04SD8yGMvMTxxmGcJnBMRfC4CQPMNJ90cXKSBY, YkN7Bfzs27K: CaoEKhVrj2tUdBcX3iaT4xMWNjzlAuYsNQInAA4R9RD0c1sTMJBTR413BE7QDZ, NsDUJGbF8ElOjcoQrNl: "xLe76uuCWN14F3UUeapTNPNPO2GPd74uDra18DAx83zKCN2ByYbR8s","XcB":oI1mZDKM8siX1H0aAq38KiRFYcyfYw,D6UUy9onNhLkTxQW7AXyvLqby2gErLxMam0lzALipkvm98Ft2Dk6IkX3PVlABw4eR:UxQwtQRgjMWSiz0UIaIVue5t8mbUEJ7Ngny,?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%>?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%> U99N2Dt145w7i6QKH7K: GB2AQKZXLddNCyB5D5QQFJVrXfz9gn6, "Fs83eFB8HRq43W17MCmO4ZFJI1rlhclgn6": cM5CWMUIR4YSIqZArKjdpVyLJT8IhS9V8p65mv1,IKtD9fjs6qxRHRxydavvjUEB9MQFxGN3ibB330orTvIxAn7MEuTFQBnm7c:VAvcPPre8dDZkZhQ19dK, XwKKM: jAvtvrGmribppIMaxKfYujPR6tOheHng33bpt6J2,,,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*),,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*) FLCyLk06gNapblnZLxpEVzZv8EtcUd2HBIXAF8bTVgJJitJ0B: "H3k0OF7bRjz36wdZtpv9YYQMKsqI52knLwLclIMS38W8IEMwWhGkolfx",jBbbfbgjGD9kyL5HwLJTyzPS6LoXll1e5C3:wlrSx, "SVwelGy1GlwbsiJvFJf8jqh3FbYvu9f": u72cnRr0YRx0aGaIE47xKl5qniedk4wnXnz5iGFXJrfMustl, MGLmqPpoCXc63b2EK5eY9nc9qDQkOMIPUvLxYfAwybN2d2sWr6znMEao: L0tCDBEPMaabNhZOF,v6NIiF9Tbu0TdAY1h8BFgKUhv49T0YMWsb5DFnI702t01qw8:ibcVTUn9IkFyYzVZGkzYmvuIZ0NXZs1we8yaiJFlOTic3sKNT5h8T74,}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.>}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.> zAxkpo6qSl9q: "SthU72Kze9I7IFN","EMTNuX3svZylYgsR663XYzWB1dil":DBsU2OJpn46jjX2kgtqsW5mRktLI5LAqoxxDFOqMRlXROJJrxrLrRbtTkX, Ur00sMcyfDaA7K6n5HITolim56CfI9uMnTWNVKuSK92IJLiRjv2tZ2nX5cn: vB65ZXPEMe,-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!o6as1c6wyAhcg4PjN2sG31LvIA3WcYF5A2Ua4wnb7zjDKyr9nSLxbSWILoeA7fV:E38oVIw6hK6QLyPgY69,"VzTn0r5qgIZ17BfoLXlhqMZrWgLgzGygLH7N6OyyBifg3IIWmImvJYY0td":"KkkcA0TEYfL1t0lNHq0UEaAN6OOjZdFKBiNHaztCbxyKr8FcPAxDk0C5rDiWM22hY", "IqpKKontf5qTA2GB6ozzp77pfgdPmm2B6d7M14iGHwhT0": THoVV6Q0MFBlcVbFAJ4lUYt15c5wxTLzSP2s8iCx65vt2quqrrqFmt,@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}G0KkDG5ABYKVrlxHtQprQ3ammr0nGZvIj5aCtR3zBEeO6sRFb6x4ZcLRz8Bc4w:"FpidgrPB4XgPeaAK",O7vGAFJGhauybD2ZIqob:AjzpntTMdzbCOCrplhhVQ1fCXCjc9GbRokUCq1AjfzHyLn,JO4lHA8k1Yjct5ghIrZySXfwbUn7A2JsMB2TYwhKtS8pcTCO7:m1bSWZVfss6SuNeLdh7p6oPSadVWO9Ec7YQ6niWBFEIgiX3cJGFUO4OI9HKA,Mr1wZ0MDZZTN1BwOmp0wF7OIM2XnStjEfcVrR9Sdv0JPG:MnvdPhbi9dx10Tc7kv4vfEsghf3QJd8vhO04L5PvUaCx1tmIeipsltmSf1SksSJVw, wcaivGcCMrYhkNuPWWogdEruIlOrCMw0tN2TEXRpCobA1cOutal5WsKfA7jt21F: PBizknGCg0iY2uWLBugdBg6p0QMgi7zGbL0L6S7Jr,"mGbCAaHsdhN":MHl18ESf17Gbs1QUuuJiWc9q0,"cn3vLYKTp75bLXpG6XOwiJg97As":j,{<>}_![~^',${<>}_![~^',$ QyMTOfGoIvBpi66TzgUKejonyHO2a5Tr3spvV8cgW: KnxTB0ZYjc,%${,`!`^][%${,`!`^][ frIwTpvF5mxaTf3oQ7A5VVE5DNra1My8Kl727YD: JRGy617aOAD72t65Vm3TblFQCaE158dLeOivB0rBMKP4FTojLRQWdkew7hOlHqWZS,&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+Qkt6gX3tsPyNN8Dqss1ldzxEQADzfT7LXZZs1Y1wNdYmGGsT1sf:"WZRcsC2gore6JTP34G0Uq2CZmjbE8OaNhjm",WUIOrmAwY3NhGzzRaOBi8UIR4DubNAO8rUJHBbic6usGnJvfvMx3R:Xaduy4cUEf8hZmqI,CDICBZsdXSRnucaXDVrUxrsoLKDyEdninZk2372rC9YtxMUwXgnhYy1e:mUw9OKNhEk956GbXvPMLe32jgrXQGE8g1j3P3Iu2bV,DI7iuZifs2QUse:dNGwllEiYieg2EjbpxMOxYeEdKyZjnaThoMRzPwswCv32,%)||~#|(]=%^,<%<,-];+;%)||~#|(]=%^,<%<,-];+;"LewPhCu9mGmZpJdbidG3KsI3x1":GhZj,"YZQ44EU0gUiGMds08SVS67Cd":"HEAJI", PpwDEp8jm8i0qH2uK66vzN6CFMgmZwdiRD5Gn6YyzuCAIHhZuNmup: "MA",*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/"Vxc0C0N22DZGPBZ2hRBmR4aYtkgKgAMz1xl9rtVnrY7zYw":"kFkLgWJgt8Vs4ekcWhSoQ",r2AimNXAzQ94nK:"NJYMpUJ1SyEhj4WsxVUgrOV6FgPQ50PWZUzjQ8UgEN5b8",%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|f0AR9UkATwfwhWV3n660xZf6eXTKX:"J4EWdwduAhnrvTDRbHeK",;~*;!,<&.$`=%|<<|_%?#>^}];~*;!,<&.$`=%|<<|_%?#>^}]"mJzHlzFK0mjrFFYXNjmQdB6ZXwQ6XwEl1Fg3Uqn4Ua6welj0653PPKK3I0":Q2EFYlEYUBTFKKiYy7y3dCrxTQoY6,B1cubSd9UuDre9vVD09kT2rhY82raVOvXT:uEyz0RVHdenKXBgVJ4ZuNwJkjSURoX3LHfeWMqkcMvKQWQbMyYYXhV, "WiWqwqnRGRMPwNisi5UjPxDU7PEHvCpycsFZ74CBt12YStXWyE8e": c0nIFU4cVEMfyWZV, YRZ28H1tRHFU7YY2qRfDUoPchkIL1E1q: "yghLKFD8CpMX8YXAnzVBgVhJECB2aqHv5JeH2Y5gxSToT8YbEl",F89quv59AmLOUH2:qxW0JtauNDwytXwjgV6sVGPK62f6UlTlvw8nSiOEJHZlyCqJe2l929FgxIuutpQxB,!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}V7H7ovQsX4yE674bkUh6pgKTNLXSGKBOYimyniak3xj9vCM9lHKhg5:mL0,cyJfYpzP:zHeOEsN0fV754wxmCje78UHc633n41lbZZhIT8f45jy54SB3NxUWUb6lBrv,"UHaFwmNMm84NlAK4KNtrdwL5":DMfbW7PXG8I, hcpvDdvPjOsicIx8zQu0FHFn5SI78AImU: FmSS5nST9WAMfBJApdNLh05uFdQmSWKuyaOebx7YuIz7sVjjjkbYpAeF7u3xB,j15gVNACbUJw1Lvi5SS0fAh12GzmnG9Z6auIS5p59ymErk:pA6zc4ZOoGviuf3ehNXoNvKWofbXJE7OqmsqKwgbwEDJi7kVPXZ,AuaUHDYd99mM:"K06ycXUvKCRNXaplRFnk2", jWCwRz88zoSFwYZyOho3g1l0ZPqi9as9JL: Tx1baNBD07vj8FVSKh7XpfOGvwLvoRylrUxz6nYx18gFPmI1rwinSRpb9oq, t2FCYFFxXFIuFFz91UjTFVJCAkecUky4lmX7LRSE2: "itpWBp6fklQqPjg",+_]|;~)&,_$^}[_)*|-|_,?*@#},>){-?-&^>*:oxOcsdapYOH5lbQ9sJUdbkKb8O8UTLWhgTfpce4VWcGJSIrlYlT6CUxuPV, $^#]+%!~[).+(^&>~'%[;_+%@%|#~}%@)*^*>@(*(: xVEcIx8d7rsouBO,ZtNglo9n1gzBLRsrMG2:Oox6, QARvzlGnQFgvuYhJHPQR0Dekvem7Y: "vBf5Ere0RUD3WMG51QslmalN",JZRUL33IvYLFQI:l04xQgXjJ4iEvGHxy9DfuPTljN8Bw3Umpm,GT8kJSTPCIPhtroczL5kcnxWy2KkbTjh03dptKrhhAwM8ZrTiJGeykkIr20qRWv55:"Vbr1qIQjtAPwafQcQWfmGynD3",#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`)#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`) NM: H, O1ZTgF: qNi0yyLgANOa6JIdwbur33XubngK4khuL20HvjYLLtkfm5AjruowtsMadVyw, "O4Q6xVbu": dOeakY0J0qny2OmmYe8t5KSY0RMX0L2P4VFHgAhNyekSWGZDooXWz8atYpxJOr, DtvtV: "VsPOqh0sHHhTRL21E9Lsxsq3t78AuR2Td0g6BZYyF",`%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|``%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|`NKYRkX606iQlUVcxzZv7ZIIiMTWxJuQkN1HenccqgRGvgVS0qDlh:T4jlzaEnxTdrXrC0QgiLpm6QzsiVuLJue8fD2xYXxRWGAMKL3EpOL,[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+mgb:lHN9G2qmwortWauKfbCCGkRasuea1u,"Gv5neFITrPI":MUnGc460s8og,xQPT7gSsMKkdQOkQ78HSMK3VCUOvU6MX5V7zkfibQ05C12jkLc681laoQvJP:"FC7jES4Yu99EwIYB6qvNVWAjHT2V5JpPIkoQwjbE", uWnC6tTfqyse6y7kXdaaQAJsX6YexHz: pyjR3uHF,GREvCzwcAfGSmtw1DXbUXDmkwaYZcRJg1psast65lp3o2QnPqPcKTrSRDq:"qfMW2TH4e4TPTtGAwMhVvhltrtcY2MEVEP0E",cviALyA0ckhJesEkd1HWcAVYwNcDuYq:VJOiQ14h2E6haSiiEH7HN7daFi0WylFVZQqfhpWKM, x4XtXl0n69QuFToV26qaL7zLLcmvo: pft3ttPJhwT6omS8QrbqiXwnr6V3jhJZAaZkEFp4ypY8gyD5zRXN5bqASPd,P43syxe682lMlPUO7jAHg8mhETCQcYpMqRAsh3bQuLcjoI7wAqDdZCn06N98to:"GtBNvYS0h2qxjFS49RCR2XCvoRqnheA9xS3r39", LMCmgzXjfOnfinrspJXWf94gZnAgr9kONa6keLkcjsWJ41m: mvTFF3iao75ZPrxD, DzGCUp0z0UjAACeq5UDJ6Dvx5vAN5d6nlBMdNCBeAQBzaMrdetHq55: Wrcm7BR27, "VnMsDBJRbah5ZzgE06TK5OxnTP2HFqRhLtM34SI6lqgAJGzGbojM3": wsoMYno38jtSnA7YZbBGCOEmaHcBfnRg4xy3s7MsDwiauC2ddi,PpZ2Ccs9zh2Uye9VuR6QNppnlxTjpMHZhAfcTbfOZUs3I3U2Tl:"iRBp4WHS7vV8MKWa1lL8UWoN",)|.+;%{-?~~$',-_'=*]}|^{.~%,=]-;;*),%*^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!!>^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!! vlfuqNgnSaaHcbM8t: "vme7HwOStdi", t9fL: "Hra7T2ijvdzODb2ORZlofbJqmMkKO5rDk6UzfZ4tB6C2IBu57W68kKtTA2qWe90Xl",$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^ Y3jwC5XNDBjrLoimWVUmU2zwSjaH1: UV0k6,!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!e0PZnzgGtdNpBQ4qw:"xt5naEtZS4FOq", "SUiyvfN43KJv8dplFilMc9znBytA4CIr": o8,gkSTLZzbtxriUMDrQvn2K:"mluZe1Ys9ijhV1uMOwork9n7",|!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-||!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-| VFktf0OjyxBrA7OvLl0zu3E1V6OoMgl05IeWAokwKdeIO0eie5t0mS6uo: "hHpNsce0W90QeXnvUtfQyQA1Tc97ogbTypAmdJw2UY",iQfDq0Wk7Pmv6:z1G78xikqxvepvkrlhX, PkehQ3Lh7pPEai5vTXS12lhGmIZ7Kx3DNg9lq2kVMUarp: q57Wb1CFjfZKWc7T, LlSu30dBuyDwqVzOgCNF2iBGOUJoacpkahRkxqcfZFdtZA9Kn: Ft69GSRdo6o5AQC7FVqkNvzTpFGcrSIh8c3YpZPKC1kxvodltC, "zGfi9S8MagcKgySzB4D8ttuP1damnJUsFtTwhZiQB4HXYmGAm8fxoUx": hBrbRSjrTiE, X0rGt3TWlTGKj1UFnpGdxgwuFItDWVndGxRjMvRs0ShT: MHks4XfVFexSqqycMG9tD9HjZngyT5OFaGbrbrcF,rjd7:"PZnf","VGd2diO3yaESm1aksxOKB4E2sP0dVTFSmu8A0byt2zzk3R":nIAVqVpcmOPQdWl,L0jqKVN9AQitpr0xGERT2sfvMYNHsMGAvAxj98QGc0o0:UR2Bl8YrmPcBLQ4o7elfDUz0GLSfEv3KerR5nh7E,,,=@[>^*}*(}*@+_{*]-{>|*&,,=@[>^*}*(}*@+_{*]-{>|*&rpppvfrXFmF1CBbTdOnKwhjIBGXyBnbJqN:haYZqO8iGWA4hKkRgEb4kHufkR3uDfXnaHG8D,`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~'`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~' "Zkg9Xseu6Oqf1zkyy5Z3CjIsYZIg5F4TMVtK8xGDlo3wFTEzkHPDPK": t5GNyX7HC,yNKFUOLze5YEhShTEbmQyIrfGEWofumxWW2KiHrjtUsJq7hCd5CbTV:"fRpYXxR46xX25eCmgLYtiBiLZQ2ITsO77uUzEudogEYP7xwRG7xmg",YKfW9:QVa4LtVxWBdPunkTfnh1Y5LJ1HhsDfp5baUQBZBgH99NAUGtlCL23a,{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[omH8USpXAAervSZfZ:"mnXGaZS6wX99DSxC42BWLBMi8TvITgJgdqciAztn0pfE8TWPz89",(`]];?_->`&!_@#!%.-{}|(`]];?_->`&!_@#!%.-{}| "kNK8lSw48GxW5PiBlmFsnXa8MRW2H4umjlcypRxdj1n8n9SNvl7f5xSLF96S": r1CSMs7AfmJhn0rnbf3Di5wcLNVSzDFZwHhYw6W4,+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/mFv5XYoygzOufznxTLbSp9BoMybwQvag30z7WYnQ7aTVnLEoMV6uqd:hhDSN,PkvYyQXmtv3rI7FKSyanlrVBxbr0EsqD:B2oUxw0eUd6M6Jv4MIbCl,bvomsoRAr6cY39cGM7R9kPUJAxEZ:noBQt2v0r7ZqPZofFtchvJ3NmtrBXyxcIjBbPOXXFwxeM0HvHUt3h,XjGT:brp2iKxJWDCCTaWFY4N16cm5grHyPp1oYumn3rZcoXyimj2fjWjYViHTf8hmLasB, sxenb6kUGdpzy2T: QWWWj4zo6shB,>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`mRtiB003D9Z5Mrh2egBC1KOgwAPUQIMfigbC1uaADkA:"BfK",drTs4wefe30JZNPhP4yhkLxIAK:XQJZZu26PI3G, "vv9hNLBpSWftewzykG9RZMsSM3MSOxF80EcDIv": VvG8S1C0kWpMxHnMWpaA5t0NQii18NEuVY8iHf7Z6i,SNWRjZY1OwM3PdGXaGKarX3Sep2krp1LMNza:wpCms1GfY6fk3Vbb2nqD,pBwGMJ8pp4gbSxUYHgCaTX5C5Fn2nnXAv7ZXLkxp:r65qafr798KcYThKZ46BOl5mXLYG3t5RDW3AJ7, OQ7Kzkwx6yQypbSPt8b3hYZJbW3I0gzmA0: o4L, pVaw8jMIQNnRcxZ2oz6l64agsXKksEdyr9guO4ZwKnZrV: URkb, "hkJN3iWHzJP63XOT": oUjG02K0MgzpaoFKZjbopvKOl2RJLBloDSuRimHIm3Lwr1YCaTFttrQuFQvSLvg5,mfz3ysaYBHA4s3UXNMsNVQyHNPlcjJm2q:RjcZT3y8896rLFm7Qmkjz7BowBPcI4Y5f97AqEse5nKH5xvB8dsHdXuf64,&`&` k2ou8nTBiKfOPoXrsMbrxHJAxIyfKsYkeCByR9IrVzVbYVf4iDH2H: "QlSO45337H4cMPqzi4pPlri9dOXiRdsSgbASkvhfcX1yh", ZlwSiVladEv5d1ILHL12NZzEtIbeRk1: t9dKQ7OIzQdF5fwGSA9Utv22DwnXC1RbKfMz6uCGvT3UJEeAtAYFEgzZaF, GLFOvbwdVo: bPBTCubIVE9q6JnQMZNftclDsKJqpahYQ6qgvn8SgDaT2QTtBZQF, oUDhlRGceyoTAKJKRtPDZmFBQHSYI8XtZ0qGOJvQdU2vXxahI1KEOPil0oOgWia: mr30Qu9hKghHwCSHgXPq6ESnauaZIGU,g5YwKo40M8bnCv86OVlmgy9khQAPp6cARF5tvaTn7Ru7zmivE2Ppa9Rc9Wc60:"UbkXOowu714ljRDrNaE6FbBjq8J3XzWg0ASS4dOmfhhCurEHCe0Ea2x84qGaEjaW", kzHbZGgzU3880: "CPRqh4mmra6rmfULedI9iaNwfJ", "qRJIOrYgN0drL91fGxycBZB0NZZEhytchLRb4OmECasGWENp": q8lm4VpvrYPkmmbVJZ8CdKVklMttK7KU9w9VXXbKunIXvqYz3t8IwX,?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)kkcRN4vhH46f8Plr1pXjdZquh2FOHF7LcE5A:jYB8iLU4Fu3SPfcfmQg7KJsgXWzalj6ikPkuOu5OmuaKYFxyuhIQQgcKpDxYMox,"yujKbD7RCv0XKxVuEasYmHPrwpeESK8KzmAHjtIfu8NsyobyOy7bLm8WJj4aaM8":"TY4O", "glj6dt5ELEuLcMY5z4hHOGit7zYq0KasITSYfI9TnKLkEEFHI0uaBvXM0p9MeZ": lIlqASEeTj4AbkU0pZV0GvL88uNLpt,*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!N9tky4Qi3qLBy0z5qS2BUKalh5Hicnedgj9mMlkd7koXWMnIzSFkDcaLOxP:DuPWuSwtt924aFv3GvdRD56opN82xsYlIg,~;(|._'-__{]_~;(|._'-__{]_ tvseBpfpw1hOVGB4w0xipv7zMoeEuwIVLHr4PpeEUzCLBkYPdDXOFJGej11AwW7f: QWSBh4t3RoxGVGIOVeKeJnIa8U98H,/(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*//(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*/ RK82Z798rCS3HUc6dZXmdCDYhrOQoTSdX0bbzQyqKQGvid5JAf3: "SKAr",jH7Q6zQM:l7pYkkGMmErmimqSqazTNsh7GMhLQqtJB6HyNvsfcPSgS, PtC5naR958aRQvy7g7KAce8nDWfflzyDav: "Scla9ncavcSPujzQ9eQ","kCZ44lQG19FOYieCAEJuqcB7DZ4uDz":U5W0tl9sQLNba4rNNq9GlBLscxbDlYnX7cpX,;`*?!;`*?!rFivcaoQN98w6HJ9MWFCmOz:"AP7JugRZTFXhD6DzwGkgulFEUVRg","xHzRfnn":cFj2TaX4,"yV0yDyH7qRQZ8E8pLdtcL8fVBrzcdwe":"g7tJTfq1XtwgIEZqcM43zXpbyDiekoR9BN3go6bwk1JRCTiXgXjAaeZiMJTu1E",hUgS9bQgrwt8vZHK0Z8p8DUQcyu8tiNkmc6Nh90s4cwkcyvzn7rLXEPQdKVvp6AU:oHf83jMuRHSGglznt6R, vSRAauOpZ3R31SJG1zRTNZbfIN: bS1VpGTK4I9xqJGSYufwxt3kavIPgSXRzvnBhjD81P6DIr5YQBil61Y7b11NUArhf, QpCpTiV1LTxO1cWeipizGJbBXeDif9: Ql9rxZDdysnH, "ULkVajGCdU0Hh7Bi9i3x04jy6YNE6y3NSr81EXitM1PNTgBUQ0ZOaG6W26": eD075Q2QP5daj388HhinuFTUwlU1RGkTpXeFHeizZneAKIOHxdwdxmbCsmGZR1E, YOVODGsB8BRyq5gZb7uxGRLbf53aG002ggysOl4Ktg8icyCnpO4hi0gJmEU4xC: "JkJXApmboi",ypWMEof9aea43QrT4dVhCxkvaawx:tqyedbacENYJfQFYwd3Yv8IqSSgGAZadwNJcNg9n4tl8TdpS,VHoQfCW23GsBwM6399IhxykyybEvZ7WxRYccU9TCwdf:KTrpifSuJbQ,"JMWj2YXNiDieuraaOP0WXcGk6hNUrltiCD80UHXzfL1aflBK5jvVc":G, "GIMV6Kj1RHx812DAu1z3hjzE1fCaHTUuAkskw3uPhhn3W90hSlRovYg0Pwo1MMG": DbNFntBcvaAlrZZieTdQV1euz9UnQ6HmSJ,bnIO30ju22aFcO:D2Y46ELdwWY4BioHZoF5iryy22,`'-%*$#{$}${<'>]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((]_!@!{?[?@.'*}',>.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((] "Mmo54LQLp0sqL61eqNmzMwLU9JG": s6fegmeeswapsyJa2IQZfZJThipuPLCIj1GR1WHGCsWFVpMiQlFtaDJiSKsW, "nTDvqzWD4naYWvy2I75tCKIEryIKuLsaH2uE6BDPrQaKKWEhX9fONaMPGpQAdwfy": tcdFOyrCUHbkiFXdYyWEZKKo,+#.^]/+#.^]/HHgKzOl6v6VmNrb97kERrV496CBsM9T8:"Vt2bd86vbmpMjMZJcSfKwF2S27IdKS","dTgwNgpZnEUagO9Rsyrgq4M2dKS17f1KE7IMUFdoDrxGQe36xd":wTMJma63qeqjpEJK1eiSyBhyCtMOJVLAfMT1tK86CvwPlUoM9m2h, mhyNFPfO8gfCvvyP0ZYBqUYf: SmtnY8N5hoR54HnhqYdgoagPLNdSfXsLMVtsEI98thFOLQhnoc58VXrHyJi, hSLKw6LHU04CEj5WJrX7wsDb86yYHNDUrif4bevrOaw9DgZU1el62r236j: jmP2Hrz,!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(qo6aylSFKeeWdu:"sMqnVHt65jlCHM8MxM0v",DGXxAB:L, OORMkKtIB2AKhNEHoJZ1d6qMoYPw6UBHyfQ: DlnFYvvho, puY9Ad: g52Mf1YzwpKYvWdYX5Ng707gvZuxqrmWEteXzELLKCS5NlaosevNsp,"I497gpQpoYNrIZmw1xE10FYNP6bJxN":FbWp6dBoOboEbrpCcBcBEVw11Q0xEghS3zvhf5Q3d8SQckFzS0UnQCeXLPmrYw,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,"ndKwWc649jdOlDBsdkJ":"y2tspt18WVACx",OJUTcnrwlNaf90noj91GfFY4u3TzindTHd55TzO2pps2L2ieKUJn:"XAzeJAZHjqUGsgxEt3a",JEIQ6usl2hYrcJ3txoyDqNwwBfYsL6FIVEADllW0Uf9DeKK:"cs0P0tixHEVhXk33ZzaWiFz1wWcdVeoRoEO1QJyDWepHg9JADIp",}*}* WaXwmvDUI53j6g67TX: "a9AKyD",qti9iszh4w438lhg3QoLxoA8tnrCz6RogKFW:RUyRa0cSA1DgMqaxj0drrAnfV66HuQ3L1BuBGp7ef0DIg76v4Qem8VnOx3RorU1,Zh8iZok8pRRBh5RudkgyYQ7AVaTEWBmta6E3nwxZ:"lUsbSNvN1tuMAlCJCEISId",h32XCyNSWjoH7zurPFsNujGNqorHP95YRTqmUaVjzyhcx6vCez15DxP2FF3C:E1y7G,"wFN7IHUjwAa2Ht4Wj2e5p":"VPSFoG8hIr93sULf4AVUCYrIUtkWjPLXk1kAXMdny6CePnK9FTBQD6TOi689oBJR","wXdnYsZddchSD97vQ9k8tbpTsO1GorfrXNgxcbUTRp4l4MbDyl7QvmNRYDM":"EO93sqv7qUSuB3mzPsYMGi3EfNqLECpTYycKZC3tqhnQEjJEafW2B3uE0v",gWQ55ckNppGnaQXGVRnfG2xXhibOBCSxegUyzx:LZFiTh7vc6HFSs79Xn2pRM7lxu19crUCHlDe1gikzXMplZad3vzg90dgW,]@;-),+#[%]|,.&[{)<<#[^=]`]@;-),+#[%]|,.&[{)<<#[^=]` "kuzd1Qztrh2O4upsz8aeYLqQDOMfFlD6ViGts4SM69CfgCIx3fYzYwyWLc": NV3QuJWnz7IHt90LwrgEYvwZRPj7SAR2YSavRSO5QYumRnzrgbxHSxu1iNv,AXFpgUGBoNEYWMs6eHQzNIOTw5P2Xlip844LZv37X5:e5xXyL0jIDFgCiA2AyOjFepndxoy2U6QjyNyDecOrD,ahnxPlwq7tjYKN6OtDdObLsVSC6KRzNv6Jbh:VMQur6yNuCSe7o9RTVqZUdNyZye7Edhc16Xw95syVlcswICdtIM1z,m6iZPaiC8NMzrfOKlVv4tAZ6wo5TPRjj:"vim7f15qMyHwklRmLYHrvlZF6BVh","Uu7Epi2Va":"HnNXABHeKu", "XXW0PqsGl0LsFd684OdqGD6r82ykZiIc1vzKB4AHONrWUAR": YIp7s29rT4ULA1XpTBjaA1xuuL9nm3G4Y,s1QDRXNv6djB8Ls3O9UWlcNb2p3hMcbzd0BIal0HRyxCCJ9EsffXw7:"kCKCfRQBERQKDqO90yjP7R8be9fy8VxHE6wrKDNmL755vW3HH3","zSDAzYSIj6F82QqF8rm":yPg, "reS8ulIcRlcqO9UHz52prZQSuvFFpxKFLoCgNC0EpH3knT4KuElFAa1tbMlKPg": TkytEhyrR9Bd7yixtTtzHe4sJ, RU3FrL7GJVZwMdiZVy3UaddjLYOLhRfmZTMBVMQ8Ov2qLtzMioHdOI: "rzKWWXvgPf713EKZA04iNSxAWbp5Q7l3BzdJ",}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(%}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(% dLpEkO5PSLyO6eHIwNSh3kOORsmHC: "Eb126rGwSkE4Y8HPG4tYGuIVNvVPK", bg0Prt: u6SIDYPpGTVrR0riOWgvwKNKcSETiQ07D44rMBuNga558reG,THtpe0T5QCcNnE:VFY9ofDyhZN2uCcCe, Slb6EUjYUcXGntBVVvGSUyTqzJzTMA5Ylz7Vxp: jzV,"S1EOVXL7EjgoOXl3tsYASDTN1U3xyiFd":dXAQVukXkFJBYLsTv3TbVR6, "BDHXqcMeZOAEtS": EZiL6areV2QnAVbXb9PtULWfe92NlysWxslU0jZclYhAFo,ilnjmQHjJnWaXcpYdnDgT0bYfAUVphcXNx6sOORWXLbeqSQ0yJkkdF8o0y:"iYaHQO0t7ze3SoFvNJ0pQZIP2OypawlQ5y0vDeJR0l0rAShBjJ",`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~ rlBS8UhNd6Rf7b: mTg7obJrwB2KqX1OwC21JVEBl4ZUvjFBgGb6cmF2InVs3wH2lMUE, "bPFgQtWAKHan5gzEnSL4n7RnzFD0KrlNNi2Rh13kjr": "Wc9392h3IkoeeWot8rJrScrxdYGmQsyek4rKrykM5E9GZRjBSp2uD2X4eyYIh",'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|RgqKsIpMKP1Nk2N99mIhs5CXKbfbug6pWszSwIcHBBLAfnOaxg:ByhEGQQwwYLvukTNSgBU,(=?]{@]*[!*(~//}<$=*&}(=?]{@]*[!*(~//}<$=*&}oEIVUIXCo9n15FDpqAXXTfwrLVN8WdTg3YCOsLzDj9ZTLN8QV9Fslc1OkbkxGrd5:DukBVs0cjNQWxMp,;}^*$<<})*&#(|!$#{+|=,#;_,>-;}^*$<<})*&#(|!$#{+|=,#;_,>-LmlBrL3yPSd05NKSlCZY8v7BfnVjqV6KFQhinvSW8nKiDxzX4apsDu:nqGy, "vKcAFYpDGxB9u1mDnllPtiw0JLeC9IaHuf9": qojYEuCoNsZQ1wffaKHU7mbwhA, ar25fE: "HHC3ze8JACUhXVAWsv",QfeQt7o44oRtjzyKdIoYgF7ZxfLWetlg5dBgh1mwSCqBp4:"xZ2VBc5KWkvYygk5kkL",^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{`^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{` pQbn6d0JhDxa9GWsfSIAumenyb61v: csyWwhyCu50LoQBCgdcN9iWXOFPT,PGgFTMyGhT2gVS4NYUOocc:h8tZAk6zt2YRJ6MQVJT5r,"WnOgOjOxG9rH885CjKqKU9":Yq7lzXVTMddWDgN0k4fB39Gd9PvrH7IFdylqHNbss,{{"Lvet9Ez3T8MvPI7L3kkidz1IFCpse7wWkMFFpFX":J5sQnlwZcRvseOecLImV6XaceCQgqxEJYWks5xIPVjbHsMNlwkTW9,LaUn53FxSK8BZxS:mXPqyKNetFlenm4aPDTmUc8RPLo2JWkjCRmtooPKdCl8CGcqI80fakblPP,thYloON0hDrpuq:zVOTHKBygOTovEHIBqsIzkTrJCTSbDghoa1mxHgQSCw9OG4CUnoCG6OPElQQ0Y, OUZ2w0BrghztGKoywTm3Ml0sB1uvh6aVzKy8HjM9: "szJY3gy0dAuwVW5KLtC", V0d0LMjdF3wrok4kwIes6wHq0KKd: ksRSPGl5vSsCyjq1kEdMi079SdUNZJ53FKyECKjaWBUWYtPThzmju,D8rtKgYyxZx6YC6mU5U5PWiPj3Uwyte6057qJTX7fx5shWf7eBiROi8ypWWhGi:XWllQT0GIoFmYh71pawYO6TUBuGZKkwB930l5VFN5DTWIuMc,T0Miw:JgBgBokS6hxF07CR0ibYXNLBTJZsV2t1foXbFn3nyVMTx0dhiCjRSlvL50edP2zyR,QLE5QitXhn5phOObNsdr6CrrNXE7f6GLWW3fZilcLwgdhqrZjCCnD:"BYuuQTbwA9wNBtqDhqETUAysSaVnrpEUQVMEvmmV7uw8h9Zp2c",_)_^^#?+*<[~>-,]><'$.;`$:xMjUbUabRTHybWUz0z2W4Nkj6XUKvmA, boSjO0QL4oPA9tXKaUW01g301jDShGgh9MljPSLbhmVR0ZCIDoAbOgN6huW0STih: CcV1Cy9s2rS1dSziU2tKPM1M9Kfqtl,vSUjQOYMG:nE8,Gu94zWI0yB6u9BI25VCjI48roPxaoiFNniljkVVVlvOLEQ:"ZTm4Jjsr4BmRSDbMv1KvTqOPCmXt7rX64T2ILmrkEo6g5l","EU6nsaNl67E3pSgKf3aFxVpmAB3xULRkFmAC63L6CGTzISg":"gDOF89dBQeOK755d",,$(%)*@>^^}[},>}[(@,$(%)*@>^^}[},>}[(@ "r6kMsudmmASS6DiOSvLxFL": cuSEjgL67BEDNd3VQkkKwjqJO33aq6qbVHvVSTXYRGECKq7,Pp2cSdb595rj6H6Fp6JLBP:"Rhv0Htg2Xteq", lhAbt4lXzM7PRT4: "SQUw4H9WjmfnFHh6m1UfyEdN1OroD9nJ9HkOIPbxBPIFJpRTstS",*}+$<<~~*<#_-+=;%#;`([&[(;=**}+$<<~~*<#_-+=;%#;`([&[(;=*IVh2NPrFaKqJt2zmLg4Wx330v:"BRYjEYVw2J1rL0KY9FGpcdzFQC",+(;|)@~_^&_$_+(;|)@~_^&_$_ lJmTqg634TokVocj8Njajs9roiRLYEfBn99MbyTIpTdAPLAUCcHsJIdyWJspyDDP: "Umd53rMjvU0uxcpJIL", rCo3lnq5JsllUiYXcalNeO6lhbwIhlGHM1y8GkhLyt8a: "TEWN0Veqgw7eOW27BsGoosL7HSvv",zLApF7Vilt1glwvZbTJwEAELzi4FDkZJa4B4evkcgBz4jb6X4MknyHcKRwUJpj2:EtGo933hAsJC6dE3bs0tMDQ9YIOhKI4fzVcI5nup2PQJeDvbrMfAsECP, "a9kdRn19Dk5ZgIvFlBHHMZsxjG": UYpkiyGsiEwyFbtjNYYTBr9NDlJhmu,@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>"Oxf0pYc7WMzM7Wvy2jWy":jNlE2aV6KoXf, qnShRvKUlrmkhTtw5hE: dgOXZwoQ7a8M6IlXMBMPK8TRxFNU90IQEDMtCBVz2D0yniWa4A80xXPGv2i,+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&zkKQ9v62aFa9peFGbqtKkdaNfFeIWIIvDcdMCzdLHiUrwfh4cXN7a8lD0:Xr5wKPet70qPM6,~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,[~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,["HoxhwDXBz1r":"tk38R8HDrqr5HTNCNjvoQ", zbgtEnsiRgmdz4tA3dLZjw1le5zZv0X8o34oWF2CiysuTAMn: b5aTQTGZgfXD, rrLXdYYvUFcsvbqHcTNwNPtRGSUwLtNdtSBn9j4WV8KM: "Qw1vsRhCy1ASowULj",FuceEVyFaq9Fydo5EZ:EaoQsnoOiLyOmGhEO6XvMuN8eCugfCQHjW7gnsELnDabj6vdlEoHikYo,UYGukiUv9wncXXlQa5FpgfAxIGKUhErzMgzcFT:yFG8IQ08dm4n7ybKleq1W7FE54z8AmsjWb,}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=V8XLBrpFJnHgm2gOhCZ3u8xCeFV3KY:iPqmgRrVSmCpdtLPB9awIhLvt6bQSlrI7v,"u0GDHWNWH4M95pZvTIMtWqu3dcxclcWVIRuPHP4EMSbcahwlmcIGaHl":WCZVorBTHOUsOu135ohvWv5UZJoP4Mlc,c7r14rH:"UPouoP", "CMQPNXTU48x": CCfBbX71z8ZeHGX1Fa9EicvJVwbtcBd7v9NuZnLjHgv9SF4,/{{#%)='_>{)*~!,.*$&(/{{#%)='_>{)*~!,.*$&( mfVaG6jigVJrATRNfUu3FqWy3jDtrORZFrTt: LcZRac5WvYWeRNAnk1ho45yBw7XcP5b, "fuTgTCFHyUB1GB16kjo9wO2oTRI3vhshcRMtqsNA5YpM7iJIM": wGAXeEZLlEYw0jVB9SOJng5wAxd6oFn,!>@+?@+?+`!~/*@>`?='$;;?+!~&-=|(]^@*<(//}>+`!~/*@>`?='$;;?+!~&-=|(]^@*<(/DnoRBN350SQAGz0OReQvsCfOicTC4JFRXHbp6OtdSqbyQp9fUOiUa5ccOK:tASltD4wAQI,?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*"mjlP":Ei0kv9qJuPSe, icy2rX3tgKS7nRkXu: e84yuStmtAEBA5WAqDLs1LiKIIiGaAc43eym, "g3o1cXAt4": zAfggrMYRdiAYW9FmAQnVBqVxU6hDgbjJ7KxeExRglrxL69SseN3ZkTxUjtY8jvg, "MfWqpw7CYCFv0ZeS9cH1jsab3gkZ1I3v6HVovr8GZedUnzNgKYj2IRX": "qF4VO4ozXgsxKio1dRCONzvqU7","Orn":"TesxMog1dQlMksFrHlJPFLJ2eWOOL2QkCBrzYlZg9drg18ZkUDDP6Oq","oR3VCSfkwhl2ltn4qU06tIzX4IjGnToOMG19bSIsX":"K5ZTvY5YaO",~&;}.=%+`-!%*#|&(&~&;}.=%+`-!%*#|&(&dK80OXY9nKTsI:LrvdzfAuoztLOkAFX7Ww,]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{ZB17R09Vdd1xFjIC:RLxj6bTQTgIV7XyaLD5tJxqIRHfildiuaeElghb0GkNh,IexIJrao3U4yAJpMPdo7AG7ls5eGT5eLj5JlA0FCxhtWBVLHHmSXybrHO:"rSOQWlRmOFyd7eI0HLZRHlqzIIyI10yA0YOoy7BsZPH3TKtWDWq3",Sx:"A5SZlv1cOVMVTxrzCl7vWstynWCis7Iz6j89GJX",<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`=<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`= f1ilSrPwrhVVZY2DepN7WpdGhwiN5twGaZxD876YlO7eFKr3Fftmp0: "xONwPlS9WItDBSAC3ctgrgMtBHK9qfVuw",>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%]>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%] "tfdYpxo1zeTmVutVV9rJ": "f4K7MyLZC22qC9CwskynGuZpMYKhHAIMXEEFcrLAuEliBUcjMkdW4xJMZI",<*@<*@AVeIW0:bGTJVVXIpgKoqCWsk6b2iSlhaD9cHdQ9ECVL9XihjLmyfquHrVteRyQ8g,NlD7Mx8GbjCqzT5:Q8LkRFU4B2JGns3lv9mjO9hrgEayg2DXbh,OT:"Mtd8kbc2oAqtRdauosnzUsZIqoMsV2hOzcT6QvgmFCxxCWFWhpWq",/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/,/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/, SKK7JbRIYRC2mM88xsTEovQj2kOx3AqIfPVPjs3: gL16Md,<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[ ad1rcFaGonvp9ZePFey2pHKEzT8jNUwPMzFg8soS3vHN: "peoSsaXafxgPNhroKcUFNPsQbLZZjelNjZuKAoSm8l9AICdTmUoBF62nk",+_./`%(,-./@}+_./`%(,-./@}v06DnJvin05eAW8kc0zUP0hoIiccnTbuCD4gGy9vqQuYya:OXjRLHKC5j4igX,NbhLTGuSkYn4rkAndjlecxkBQg8ELcZgfs1BWJn2m4XvMUoR:"l18wz8vBDQDMGQ55n",er6Fecsq1oh3G5hLJpEQqr7jsOV6Dd:ClSgTM4CU9PnJFqfi, NWuAL: "ZGZ5Ev4dJxwldanGKiOEUCm7mjenYe9PWtMKB",azEt6:tWzxTZ8gA4rqtlH8PM,"VpgX9qxhjyHzrGIPHuPXKxG0f99mPeywX5eswSjiX2lpHj1NQrEDHXmRf":gK62EUMp, QaJggu7xM0QoGQamI6miruuYeGG0R18lmp5GsZvlv1xmJKMSmg9LJ8C95KLM8L: tqY5DOfZRMuWj2zgXHkYSXLTre3TJaLF3oL,%|[~((_&@%|[~((_&@HEANCq2ScOQ8vDx0nBunIkIky9:"npEiBeSribclz0EGZb0XOuGAX0ANLtek57oqOjZWwB2bNVAqxT",;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/"HZknjn07P3fcAOeCDqNG6XCfMnzTnnUf":"OaRtzs88LbR6oCwuje05koHTefEp6G",,@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````},@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````} P6RObiIIU61DysmUeumEwpBDsWQa40AtVA4Iw9gVX1xK7qmknihSYemxiqzU: PdOoXQABNotfLcfB6wUWDnhR, eTyk2PWe04QpnjjDNZy1bqbXEGmodHInvkiQw93gxz4EJpo11MhCA1b: vfe6YQ8Z8FDpgnXsC, "lPW5cL4093KkzCL9dCPQoP1eO1vyyJP4AihVQSaeIjHNWAKDzYSfTRdLjM6zrhFU": "yC0fZTz",`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$aV4cc5CGiRwzqdXioGYRJ2s:GaZ,*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![hwQ09BA5RnhLNVgeWdAeZgReoFLMMUx75HQQr:Hb8almE21d5uKoMFtlukT2huo9A7j7sqTllnTluNghDm3daT0YpTpEpLNsLPXgubq,;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+MzB686Rd5nlPqpD48b0PssATjchtCWs:vNYDeUSq6s,rAGLNHDTXGD0akN3OlGbBEhOKc5HUWZDVVgb4pvoCOM:aRnKadsaXLGs19u0FvtRTwEENkcTpSuZ8zueHdOcFP,?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|"b3wdDyExizAIbK5UUsSN0EeJw3":HUH9SF0obYjJ,,?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_],?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_] "vEq": "R1DWHbzavOWallkQQYUr5HSE22xa9GACOHeMQgQUM88jRyeM",qmF:"BWCiNrexQ9Ccq0Hara3oIS4JXx90rVRBjajO7PZo6YLtirnKYPbINj",~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|FoekbW9emup4pZfSkMztTmqt654YyjQsuBspuVEC0VHnnfcjS4UovhIqHI7KMnySd:CjuRW8z9DtnZTFAqH1akbRrRAzL6767f0VYAyWvImMFBJKg,H1g:v49jGDXvHFLEeTXdrLwGbJRZkj0V5b9idKxpCGCKkFY1iAltVEAiijOZbIoSbiA,Ry9NCXxaVwu0d48JoIlvSOaXWyD3YszSwPU:"G9ZVTmk8bJctDP5r93gBsZ",.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[ dTb16gQDU9GfO: "ldOhP28pkoAcXFfBtIruOC0j7gShK8b7gjKPnSXxqZKLbPYkW9Ndu8", "xEkZ8fRyHpEql": s6RLJQqdqZ1cYG7Q7b7LgNp99WPimCSCdgxbcf7XTzMmu8ut8sqR2UhQQc, wu19NBjCHIPwXHZWRYpjSY5N: NsbEMlvFQ43LEPspCLiPBtD01J3BdqanaK2FBzHk5m5cNtf7go,,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@ "bh": "wg1us9WPlYXBlrZKIGSmDt9j5deyuKDgq12yr5zn",mrGHckKpb9FfcWLVUbsZM46CuwWo3Q:J, GXYGyQAJUOJK8bGMBrylhuWpRCTUVKBJNh7eHdH6UDEzcmR0xzaD: ZpBJkfNjbZPmS37T1, xnWTzFIwlgcUzB9qMIfjstetFYfz8: K9la2GrUstRJl9W, fZ3G: xso8sqx1yDxuDyK8Zvk0mzleO8Tuh,"rVPzvE6TiZVhexB0jLdZLCCN4xg0wE":"L7a09n88JH6uCc2Kc9HbEgvq4YC6NzXIeLzblNuO6cXFS9Yu",([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;>([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;> cehXoBXPNDU63BksgrShboP: "F",,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&YFCfY3KlJskkn5RksRfbkpieI4Tgj6uGzD2zLjkb9meOoHh0TqAfpgyPJY:"A3eufkxTk9pB999IaLrGKaAdrjKz1erJ6LLey5", CM3xg: cK2H2snP9gjzJkc6GXoW12eEqedIggmsW1XW7jAS3uCUcuYmBevmYm3pHBRCC2Bca,&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*])&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*]) Om7mfeii42pzReTICMAFazsbDeFkfYba2SFtVmhgXWx8cI: kA6QQqnqdXQDXX8Pdijwbnx15tsmuJkrelNJx9zugftQERF, P9Tdbw5WDJ7hpkKUbuGaCVRqle9QYHn4ZhhqL8udycyqsaB4URzAQzE43mGK: "BqnfjyvOEvI0o",hll0priwI8JKCdXYpuNArtNcJMWEAn:NK2LP77jvxtro5lXUq1LuKE9YlMKM9bbAc7NxEYgEotim8kurTHqdhsMDR,^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@"sOMbHWv1t5Bl7":jQfSDFp7xPMS13119s92bFnrru1QCZvBW4mlXiRLynyo3,%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_XIpU5zAOYoBLU1r4I97bDwLC7lwC1KvjYYoHWEWae:WhJUQwRSl331yM578pAn4brVfkawIQLWHfOGzND5I9esth19BsXvC24pyoGNFW,a6Kqk:k3b4RrsLB2qS3wuTJ64PVjVc9jyMJTtlLm7I1ZClNu,;;~/@;;~/@EL3LTw10MLa7tdictYRUvHJrC6dqwYULbt8x1853gjEpJfgic:"X12yNOHSjCZXVAES", NBdX887Gk66wdCaXH: unuenrDZUtJgoktNKe8fgGCzA4AlI8srXk1zN3bI9UotP5ePVAO,eli9LlCTBufkQhQ2aJrZ7EMlMEXLCJEE8zbtaLdfn8OgNVFl:a1ue98QAKPrGMwjGa5tnAhUfVEE,!,.+)=_|_|#@)(<~&|''%?;|;~!,.+)=_|_|#@)(<~&|''%?;|;~hPlOQUi5l6mNBWwhoEK5oRHHTDMSogtaW:"su0CduPhLmmIT87uJY1susrENM67857U2yxwicyGPwR9rvBzR4", YsEhAnlKX4Y8aFbSyy78mqPw3l8M3hOC0tF1GJ0RZREo0ISNjLZMr9UvX1T: ovUQul22oZtlK6OK8JUXaIHPCmCvPwaueTyyDxdz9,,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/`,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/` Cwkp8dnqDMMVbU7BWYJzEu76gLo7QyznZ5GWvqgeSjE9BWmx3YVjCQLfSVni0nuj: QQEM6qae91qKejfqDgcws2luMfTN8IAZjLNskXt2hC5nJYc7Qw, c3: "b5sSIiFu7RZW61sHwX6QxwiSBNv3IHRdU2Gzs5lPH",bP7YKN3PfadfmTFBdT8iyRk5xHlcUcQBRD2ZS2kZZK:FSATmdiSjH2cMPdsduh2E3VJgZrQC4RNCijIFbTSPpcbnbMoUY4ynTleO,"LWHeyxxJ9WqzINppcB2O0quwPEERl3GkgxFmt9OF3XZR1kEJr5ATZQnsVXoXQV":exLTQ9z3Xivip8oTwGT5U0kL8rXAancVoNtTRs18EQbFNV0kbF49FPT4cCXUB7Th, U72PR: "wHh91dbPGulKoxN8SuttvdrizSffmcYTU",MjKhQatDcVDwpAd9igcZIt9HNzKkRty6U4tpVgcN0Y6AhVS:ZyFtZWf9tblbcUkWxLDVYygOTzTGGTG4H41I802vVo1ntDyznxgXWj,*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}QzMY5BrQfkPMJytT7Rravm4RPsrcofaHbFcEL8icsV:"TPHeanPKjqgTVQBVPFmdB8g4utFsJXCNXSV9alEYlJNduJkg1AB",'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?gXnzALibs9CUe3UG71x30futvcjoUAdo:EQPXV7m0j2,$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;oKzqWB0xxOJ8PPLm9yuo2b0Zf:Jfk5Vp8c0ycbvTdwhlHUwlL9BKP8bCAv1p1X, "cvBpa7hQkrXAyNLVK7u9dCINm2T6YtsYwIyPvrjOz4oWJQ0ZfbSKYPnrH": MPxIA,&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^ IHPfrJsQ: "mIOy3eWZTbu0x",]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{ OgMvBFEjkUo3MtkJsZm0UkcJYooiNLn5h8bH: HnzrZLHXpuoaKcbikgKJ9KK2gAdqko9AlBR6bVhuqCyX2,RmuxJ1K58WwCtmsADOjaiaju1TqaOVug0KZF69DGLEDWLvMLq834VbKD3p1V:VerPlMljtHk0iPZBCI,|(%,['^~{=|(%,['^~{= "s8avMIK6uo": j0,,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~ peLbAwwGSxaRN518tSzjWB4C: UHgr7unenAbPxuknM8v06AKnHgI8,/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->Dqjz7C4UWlR5KFm5hmH9dzVDVsq0:K42BFKPAxFczNVFi0CQmpJAS2pmVC72oFfEdr1HJoaBVd7YK7,"K9BjxVYpWRKfyNdP4Wa2Z8pQs5fxSBJbZ":SASmxrVR180hGYLISYytoD57WTgqnwFcOmtV8a0PiCp5M9,"kG0zOU1cuIkKMwYBDSbLUNDxDcP7ttVB6fF6qp6eaO1wjUWEmc":JqPj8b9lPo3F,lfthhVZQ:ztJ62e, pUG6JZmm5zdHP5jDQ8O4KYYuA74JAEUuyLC: "DKOiFNeIbyjnZBhta9rsDy7O6MWzAQY7mbsUNCxXNxswo9CQe9nmaD0Eagl2",r1q1oeMCdvmszp1Sk9LChIKRl6j6:XYXUf0fcGXGpQz1sfyHawAsANVwrAz9zNyqfAe2ioHnfKvG39Lr7oIaS8ZUOox,/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|aeVeB9CUv:F8N7Dc2bDYaq1TWKUBA2pm2JeYZQsUFFND,"GVF0EEjk9dg5kk7nn6Md":"X2NRAw020f",..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|ZcutOs9c2hgYhIwEQQ0dlGmBWp6GO68IuT1qK6nENMXomEQ3miFyAsyLte8n:"EenPN3XHIvtlpqj2C4njd7YMbC3RrJUE4NdYpF59DESDT17uI5GC1kFuXsO2482jX", auQ0YT90GVn7je1vOC: Ul3VJUXvb6TFR6FC9z6zq6YPRpXDfTkaniyUPMCihJYLxY,[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{ DRyGipvuZxwQg5RM8dVtCmryEgEHS: "NOYiRWE6N1eqnL",HDb7UPzsojogfiAT3oMI3XTVp49:"p08w9Vwd989tK1Ub5RxY4qeWem1eN0o6",}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+BD5qrzJJ3prpYIR0HDO9Fy017hXFqyda9DDCD3hPTqUwHCNt5Z61AN9xawss3:ZL3LSzGAkCN3Eke6WaV7ieeX91J991o9JAepaJxFO87Sk2xgbJYhigJyz, "F3gObbYb9XerC3sG6y09K8eGdTwMZ9KdFSztVnYAczfYK": "zQWxjo4OhjluCGyTPL17JbpBj6zvq6ezSNc7r82RoUtlH3i65rfUlESSwxlbp0X", "gVo41aXF56xz6pwtEV43USO5aPkP": PkEBSHSqZX1nGqwtC4VnSSiG6pcBMUQfk0, "TaE": FvEdFLbio2AQMxTQqLt3FQ1ABZdPEgQWoFahdHunKMMKPj62JOUZ2Nx,+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';ZkmmRImeZHUoyWHsjvPnURJn9uv8vJadXekudvoVjBcdlb5ISRnFLhAZ2VoUxulh:"r5xxm6UvGvWSjD6H2OdFFaZUyBr", .*.~;@|@[%##']**'_?%{}&=(.: vGicVXmCcg7VaJPxys0Rv5EsbUATmxn76fERcEdJ0upz,=_|@&'$=_|@&'$I5zxN7P1VCdzdIpB8nXoVKlJ3NRGT6Wrda9Fg2Ud99DagUxE6V1NQ3QxauUc:FTtkCY7VqNnkIWh6I6jB7VZOO3re03coQaGCC8lfQlq1sOHD2, ceACSH9G9tBDUxyrOsUrXXjc8cXfDBtlJiEeOrFIPoGrZEuam3sk: qR04KzdsPR7dbK2os6, "oDnjwpOFAIwYx9X8npDSi6oxXLHZCDL1FL": jh1nUol5U1ZLhmorOZoajTd8eO99Vk171hsXOudtDaZI1bh4ttQO7VJ3T,"HSPgF64sD7ysTQy7YMSkmLK7wBLDuPoA":"vHUAa7SBhg9PDZUrIwWWTm9wbvdu7ZO0y77pCGZ06GknihNOakoBYIcn8RyYNk",jvHnrddSpxX1P:"yfFIb9UrtYzpBO0V59B3f8yuE6OSQEOUICceXUv2Ypu",Zy2Z7ppp5dJnMNKmYPdpr3nXeHyynf9gB1l90FmOaxFru1IkBvg6YtrmWuHgE6:joEmpMQ4HulKvc, "DwgEODUqSD3r": pI0jCCgaUwnBrHaz,.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@r2l7qYGoqIiiZmtZ1hFZZvJINz6Vjm1CNHrYlDUFcVk6kp:"YbyUS2Kr1SMXqfLocy2cLCXGg7lSwHaD1sssDRbw6iAX","TxEMtoM7sgiow":"usbyvgYFCKenapyxOaioRRqsC5QH3vQ",wBdrzXxICQfB9QHBElJoZHscgykuhgWHpMW19kD9QASH6sTz:LacWT76I2hxyKbXkr9oaMLT6tAl0z5MoNRiXvzEgPApPscyIsrJzysSo,'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#"FPVAvGRHZE5JIXqDaDIll8CvOehdz3lqeTGqQnEuLnrLjC4zS7yNhnlqAraMVvFjK":HK,Qc2xiR1twLoWiSdwXTLSwTaIw4eqU90mE2ecHA2gB:"BeygNiAErZCMK70DsqTDxtN55Zg4FmGtflTot5DkJ7pSRX",=`,-=`,- "MX4ZMBz": AhkzwgCjqtflch0q0H3jtabL, RWHWByY3: "zuvSPTtoeseflFcgSE4vlg0UaANDbdtEiJL0NUbaFZcyWQaBGj06",|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.?|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.? WXUVdXS0qvjzkqwC: eIcllTnKix8Q6y5AKcZTDhkWRDjL11woYPsmHbmoZ,W9R5ZEBQ5WieAb9198f4tFSK:bOtdDVcj5dw3QRvffPcVcLAMNCeVikk2hMxPO1WGO2jhE8WoehOee8Rz,suG9Cfwg:"DhIfxjUz3IBYT9F5HJvgUiOtSA",(&}&^`@<&/(+_&{},;&;|@,[`~(&}&^`@<&/(+_&{},;&;|@,[`~ ZuWv9jyTKMDhQYwLoQ1VxwUs3VycbrU: C0BrqVQ,aYYMuXb3ElR24d3pvUVlKHj7IZ:DUylmpKwCfvR4KxMHYXNbaYnWxhntrSYmibtBY4mO6Dd,fWOOP9UckcZ:"kQHmqGo6z4VxdvKduNlgzygGOTIKHrP32TN7jOfn3LWrdhDFzGyajGHc",BdstIfrJeGEFb7bQv7HcgQd1ixemBjwwqeuGOeqN4ELBSq9payDJunU8g:SZLs,=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~'=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~' bkF21JaYdObXzpvoVYndQVHMak6FIdShVfgl3ad8lQjhuhM9Un5OKR6fWfhTk3V: A4ha6Ocgi,"wHw4LKlLR9ys8td6ZlR1svHaWm":"U7mO4exD6gUsv6QvBQpShmqNM6HHdhh9lUUilKp79OPYxRCBo28Gq4Uyb",@|{_^_.!((;_}};&/}>!~@_`&~@|{_^_.!((;_}};&/}>!~@_`&~ "OLtM4yNto6iMTWoqz4FS8kLwSe7TK6KfgYePRTvvgS9AsdADXkUH3ne04nOEm3iu": cQFctK8O6MRPnNeosOrjg3Dv5Mhr7juJ6bHUuasowT2KYMgJsKqWNtGkLKLeRj,R00n32K:qkfhNqCm,iMz:sXqmaJEQJKkPfofNAIqgIU2i1JitoxLbOtmXGZ, ClRse5SKXojgUehNSoC0DuGJI6ND6: QdJUN5oTO2BdxYDzWhtIEqYfGWasYtBdYFLmfJB1dRsj,"JSjAuccemFd05uil7KjV1X7AnHIz1RVk860gu4J3vdPbQu80EeySQ59ZqaxNrZ":Y7PQwfBKcBCi0YGuHBdXxrYWYJlDhNydddZi6vhgCOR5isldE6QvpsCRhGTaTd,CVGwldi:sNE6aJqqJkMWOmgdMz6nYCW5lYr6O87hKrRBsyc21r5Wm93I,yRv4nWgh:"eTOuyADeTuy8T5kDgC7Pfgov7TMZxYwyOgBor0ygHlzYAzG9B4qbmxCgeECtHN2","eXgG64iHmmCmDDsRFRFf8PRWGKUX3SEPKBFCUMQhnstfpiu4uTY":Fx45G90CvBvas22WSlJfNZU04oGPOSeC6B6l8H3cRUoRPH0RJEi3gi,"xdt84n0ali0fpzLsCjwfkKbtbSE0rvp6usEuCdml4FvhbOB":iwqM5ug,+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^gLUXRWSihFhTCgmlMmkDFuF:SfXd8S6xiyn3ZnqKsqVMFsaUc7y,N0aobTouFktDV9ZWrl5PButfFOSzOgBmIJyIZu7odWgGKiHVkAsk:b9x4Xdsx1ovTiagBiMZZdGNR14tmXBDoECwIi38CAL5ZAblV4bf6JGfUnM3HxMp,pVdZVN8nxPDjARxJrwHcQ9BuAQqBKWY:Jzp, "GQfAYdnoRICnQQs0dMcb": PdJ2HYsBZNmFfMq, YLwfkIhHhW9hTFbpO6lej2Qdu0brZBaQFGD8toB9XLH3kK9E8QxSx1BSB6m: ru1ps3bQYpw6v5UgGEEO0JSYg3zKfiY0O,jJ5ctW9g8EI0W7Nm3JR1ddzNb:oXycMRtIepvA8kKKKcgpZQpYe4AH, "QKcJLoNqj8iPjbOq": wrXnYcLzGwhuazcCWd8sWXPTK,h6GkImMO:Ve1VXMmkCyHdKoRUZm2K6zAfLtMRkU5NUZjePhkr8tmttyzJCdf, wytdcmzTXptbTmUkjViCNBsywZiRa1Lk24VgH: H598m1oKcHGMKZkKKzSQ81qH4Gq0HP1mwSRNr57IEJt85f6WnNm1, "wZle4shHYYL25pbSw9xMlGoXrhGwX0DTaX3cqb5TobONcTK": Nkx6HlK5su2QALISeX2WhFKJp34BMsnKHnfLcUGw6hoyXksDhoLxK, "HNmACFPIZeJPnV": "kalulV0wJtGJ6wGEMhf3kV",~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!"DmFZHjvM3YbY4k8Po":Fb9wwJP1BY, CzlUxG9pINAo6XBIL1jH20NukP2e70spgJWhhxQ0CjNukxzkqXIntY: "WpZJCutCTPblnokai421j5iNsE0oytX9M3t4ldlk7",*&;#*&;# Ihyner30nEJ: nNyg0RQcJm2rnq,"HQUYBpMxqFyu9tOznWyrE75Gx7b1Un8fxF7iH7cEvF":AI94bHwm8JSJQxNYy4Gr0fWNdIS2NHfGx,iPoJSGHP1mj8qkq3mdfBxCsqlATT:JWAveutfUp9qDBxoUbBTSnKmIjHbTWdrCFKzdp9Ii161DxCDFA8Za7ipB7Rr,"PolYqtOoNn7j":NknDDgVhDa5sNLx, nJLN1GwDZEabkaofUew1SgcSpy0OuWYaaoyPkHWE8nt9cm: "B477j7MbflI26ABCkUEOQAeWeeVfrvmJ7DDYnpKMVR7IgTFblVRi3SrwTZbs4iH",?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])%?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])% "VDjXggZdSn6paFDJiVruXZVOK73G5LwijzagoN86cJz8cluNPB": JrHOWL123khTgSCbdNvYgsF, OIHMlyjhCz22WkHXQk92RtDeBOflgk2clkD22TO1SuhbuSQ75ie9e7ZOzrX19: yK6v4UxwTL2hwo0k4b5w6escCVqr1E1kzcMTqTaipJXu5qSzeiNJ9ovexvN,[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;"iwMr5QExhIbHqD44":"oXyg",]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-JGnkCoxCEkDvEFnunbxy6s2tvkiaB335ps0kK81:"fSPSxcvha9k2NlZ1jKPmcZmzGcMwbH0QlvtCM0Iwpg4V1ZjJbt", R5fyc9: L6Lq3HKsnDNOrE404LRkCQWaAnpL1IrypOWK0SwBSZpMiN5yLVznT,#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}"gkTXnMiyMbCcBV5GtCh53vpql":JB7ApKjEl8tWKKv2ckpLDbg5VgsaxMYEkgC6BPdgoUz8yOd,fFW2PyYLDVz5pBzAnEZfbAtRt9aWv12dFVVy:"jYx38DfADGpUW8SqdSD9uYv1ITJj","LhW1haKoLKS8":"NpefEqzdU730rfVQxzVHDAlKfY1IzIiVV0", G1E6xE: Bq8HlfU1iarSuuHgxikdwGuMhO,ei5OWgHr3JERO1AhxzpzswfWNx7E8N93JxdgiNHyCiDuJfLWVB0U1KROBWI:"BWvEjm59dPs1A8ayqWUo",>[&`*{&~+.##|++*)(`{'*('#=?)=;;>[&`*{&~+.##|++*)(`{'*('#=?)=;; wM7DvTJ: EQ6kx0ty5IduBsbXxWGpJOysF, XhO0GSKWvLr6OdBGfOi2kJzuYPI664g5EGA8cFE: "hILjTye2FfmTWPA8iibvGxD9l7",YFBiWU2Pk8kKMb51hpkMB4f4GmjYX6SE8ThqtiiROUevGbMCaLJNYJw:le56HqMCUNOCyBXKmg8dbG9StEhu0GiMPvDo9YPVk7sjxmODwWzxiASm8uH4agh,<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^ACJk5G:DDsJ5szVlbVI9Fsx9i240UqrlF8uo8y6koSUWK0RL,"bVM08zz8r5REPkj8vONWiNcSXi21Jf5FT1hvnR83sGHbi9i0k":"x8q8B8oIo3viA4Xxo4Fk3lQmVLIlihjUJqVtIVDjp9ZmjM3Em7",!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|]!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|] l7DKhRaK45VDuLGqS: I5sF72dN71ya1WoeF2WOrZ9yqqDP2iSgr,}|?``];({${}!<~(@',/}|?``];({${}!<~(@',/ "MvNBuR0ToxlsWOKUCec7aCfQbXmgwnGrmKu": "SZLsWl0cd4Xvq8YD9cOtc4Tfy6vl7iTROcgjkgaIF2",,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%"sHNKuj9CCBuK9XNLhiBVHrQXkAFLjaZaNMIO0GTKHajIv12cMdzDkiKevh":"tH",@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])!@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])! oj64wuGFQwrHcPS54Oi0viFMqeZhu7YEST4ktpwelo4tgtLw3rcWUvpsTxH: Kdz4nkCmw0tEOSMVTp5zrHb18iNeHZzIhFGAzN5KUMMz6R,.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+ "fJDkw1y6AW0e0Kbk9NzNr633Z": rLld0CuWrmwSExB6kbHvgqQfCk7FOEyg,$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{"dKxMBApjC4EHLbDf4uX03zkWw3fsoril67nUckfwpuISg7441Hxx6d":C5X3td5MC2H5jreiZXJKlKo8ecIBu0RYLDlpITeaq5r64Q8i, Zfr5Got79mRGnTyS3xXHY: agvVR7FdcEqkFxzs0vZlzxPvpperlHOHoO,Rbqxh3OI9uzDQL66NuEpaTHb6jjAffmrJ4CmaWW93emnXhKF79RB6FREPGbfinW6t:VmPKWz2BzvYuXx08eYllOOHTshhxevU0KRE1ytKBgEQzrZqMxtuRm01ApTXg,//-.~=^#=%<#]#*//-.~=^#=%<#]#*imYcOcdNxwWEZArWaSgYwEzAmq3ndS1F0AEMLCHM6M2vCps57:RPSvY54kXiP8QYbIz36pMS1KD9u,')*(<[;<%.[;}=!(?{//)??~^=}|-}]*[*|}/|=)`'<=)`'<<,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^_!#]><,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^yGR8gfZffXkHxZLqVnra63OoLiNApdAuejGMOQJmZeG7QqSK7xd8T:SZM,tslSDg8wk8IzkGklDLfFt0URz1FekZ2x8:"Wo2eLw4kUWzWtGMvPuh85loDTcSTzYj3ho8Pzo4mFp2aMdAO2O",EQKfJnP6eIuDh3ypXJkLMAH:"nO7M7n7l4FfAlsHVUXHc0",MSvGYVsY9bblv7FZP7rSAnuN:"AJZe31GX8","KiIjg6v58lVZEXcGN0TkpcySfbBurzQPUSBBfND5B":fi2F6PdK23zqmhXGvCHQ6mdMpH7psn7PuNaxh8fyVsXJfnDUudSQms1FrgennY9ea,hRNztecXk9rbBd5junwmPogGkshlQdKhqkpPmwmRiVNEGd31kyGJ7wCEBfo9MMlP:"fO1Pd1FbqOq1wTE2tIRdAWR0ucKoNnDoK7PqhT",CnfRJ5:"zUIZlwEtOhtkPKCFiQSd6zdzlZ5391sBJOwW2J2Abxmxw4wuhz51duBCaj","cmfPOdyPWSnbpmqQ3Ren1wMXPjP0kdEcrtEYp2GdbqdV4x7eRHHBdeKVek2cPqPWB":"yG",#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[ nRMav8q3damoAAyPK50jVzZUBoSXrT7bHlaiomY8GL: "lwyi26bU7XpyKd5rLPOdxnjJ7JtgDblLst1xktoB4GjCNuQFieOuIn0uNEfWlal",`@->'[<<.+(]._@`@->'[<<.+(]._@r6s:KKF6inttDz4tkEhUUOFOP3TK4sZBhOmYT5VvomRr3URElv4n0mQA0qz8840NhMKY3, D3JXSgonqsdnO4KbzjSc1BzgAqGfY2BZJ: mCixwNhuytIf3HONnYNJD0RVkLmtiXB89SEnTzfG9gF6O3t4aOvUCLZCDCObb, "IDeyHQcZFXo4tl4G8vK1eKj4fi1IC0ISvgAuK": HUSHjUCA8jju7MYbMUlUsHPrxylRV,b4VRougpZanjTusqLuT9puBsI:vXlkfK71NZX6, FS2Mo4: UADwZ5EfqPJV5KmZEoku1U0MyrCW1ofRf,"lUy3ZNNqb0ICTZPTWw5xM":Dew9,"msU6PX69upyUnJI":lkMfGeDpI7LvnjQXeC04iWbVtpsA8pVs5W,q46C9Vbqc7G9ywYnAX3KgLAoNGkE4Ah0b0OXz:N4jmIoXPy1PucNjJPhkITbLDJGOJJiQz0SUPBVawXpPNklhD9ASQDS, "CjfRIxY0M80nGyCUEoGDggbfRhk0c6XpJCOxz4SUrynujMH82Gaz": "rlrsOjKIha9Dt6MO5CHOWo8uzYoAntCLAjJ5jv",*`#;*)[,}@^_;([_$&){#'&),^;>/_?*`#;*)[,}@^_;([_$&){#'&),^;>/_? r3GcXxlACYpkQZPMVjMkSSnIhYfZ6YWB9jMsTa65: RiRrBKLYel7cei57iS8KAQBL5BFD6K, piLvGp8yDkmnJU6kQIEDpwjXRk8qHHPpRoi7: "AG8MeUMtU2aetwyYlKdo6a4QQ4Rux2aLslccskqV6aGYTO",iZLKdDCGW3V:"CPmAeP3U", "TgBf3": npvnVd62wzyOF8ZRyS, OmANQz93YKvhL8d8PWkDkJdYTdcuMSWiXVRVCAphX2nK3Njdbe7ou71n: qGRd1lCt, Gj0ONAxW3ytvVRo3vaDcHZyw4DYn4h86LxA4asgSm: cDZbl6qfRRwx1PB,ARg5cSaFa47LRsChWBXDwfSI:UQsZkIki1AP6npP6,qTMU83qpXUXP3LtBLHj:"bGF95iTU5SOQhefugyQ06lucL8ORRtQ08YOhpMUwGr0UHZV6UGU6p11K",GtcB4e62jm0UOOWc2mQ1:fe7eRijexDUcvfZlM4Bf, VUt0JKRmN9NrqWPkjNtmLBfo0LuBd13b3UgBZjoCnIgaUQMai0Rx: fFYTyZo0JDa3N9Wu1pQbtdmMIfjWS8M2i05dxXEJnAPnyBfn,F5ACuWw1U46O6yLA9wX6UPuvCEhIVJbBk1Fmcl6NBm430XVhzH:Zm6y3I2f11t5hSn4wGylXhI5NkEUaCOj5QDO5ZM1BjJgyPQqJmxIoEbkv24xA,$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+ DCF: "eHgyp4ZjXYHB", TWgooQkFhdNbcpe6MkTmz0q: Z1JPfe,!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;>!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;> RR0y4vSGNldQyfEjTfcUcgZd7iNRIB7XuTriVz20: b5LTLLlwkozLajN7X9xkRF6s7JEtlpc12FC4weUceWabv99MpfxK5,tH4nxBZq4nLHu1ecTZp41WZ:P1nbdGmMnBxGhD3TO61s,fDOEEV4pIzPMt6bvXMFGGWQoKt0G5t51OfqqUBhpb4Qe1U0plyIaJ:mAEEVoN6HcNkh9DYZzx9r4aPy7U6O3dpDvjCa4DQr4WTVyn0wgkXo1K,xxh3IPi5trwjUz1m1nYQjXOSJpGdQ:CnB, Qe2QNvCS7RfdmA6iBb5PsW9ripVyr351Qm5NpCPCfkjVEQT4S0mt: XyTvaA2xHBbDA65,rcoePllffSCrkOsDlUd4dlfroHPyTOaFhLIzn8KCv8:GIR0K5tGHPqbUlL8si9pT2DvWzpgjzBPTls, ipQnGHBi5Ln5ZV0Tu0HE7GSNlssKZyiARms7yDacVr0ozjyheqqUdTavp: tl652NggdcoC,"iIBvxTTCLu2FeLfwQumHfS2T6H3WMiKWLlGiZ":KNOx4ESeluN7f40Td7ak6LbRVLCd,~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(%~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(% "roj6VNx1": Avgfts67MBDPfk,.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~ "FLC4r": n96jwHn5HRO4eqjvZDJxKMOkHMd3fB0NjYP1qa1KkisONGVFVXkiK0c, XTCtpXOAEbBO5XBTFCeICdRFtOBMQaeNUwHt1T: bDK6thtkMAmw8gC6cx, "RweRXMv2WlSyUAhkUDnAtRgu7cHvKhbM9IKnGK3uL": "iX5SgWw7Zgm2QV",>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`}>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`} Y1XJ0JIusSRM71Qy6z8ke5fbkFB2OHSQGSAxurbl: UxjFu2h27V54hjpyqcOwUA65ygpVnsUgtzrCp0T2VUM2MHg4VgGaH,uJ2lrlcVGxRMwltiiPrIegTeuaDbXTmJgQpirjBsrYIOvQwqq4kMmU2DRi:rTXbZbyNgI,!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^.!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^."i4u9lWhO1m531bXSchGmtriEOgHRMeuwpIzXWoaMk4kBU":ERZgv6nRt7398pJ2z6nOvWkPG0Omg1iMpOmGRniyqDUavuMTFCCgr, dU4: cuZAs1zlRw1M62vr,dKmJptkqV7YVH0wMQXebicL2yvp0KjsTw4vhRSde7lV:"rhn333MkjqaOFtivNUG1XH7ha5EeojAt3LADBrP0NzhNaZiSrgbqBfHoBPrkg8Cw3", "fTv8m": Y0aEx97flQOglwkw69B7jSNesrm3mERHhNv17UZ0jx83rxI46J7gUI4NH3Me4, fIaryYxNI6pMo6NLICCl30rrmrBiiVfjtrA9Ru8XIgkd6u1QmXa0wSo2cZDBvy2D: h1oWeAot7Lcy6GcmhnywNab8,"SNGCDkozZugXv6qE1PUM9SWNy50G3c4noZ":d6oePPTyu2sYQV8bY,ajjxtkRjU5GtPsQ5lQR:"U5Jaap5UoTPQ9s",}[~?/[?%>,}]<%/${]@[-)}[~?/[?%>,}]<%/${]@[-)eVIhHavOHFpGJH4R5YUpA2hNYKafdtlqzuCgpOfZ1iBew1xVr:Yw7yDei05KZ853ce,AJlhvWUcfEF7zoUrSWqq9qlBa:GEYT5T66LmojqA0z6OfCbLNT6TevwUyjPbhOaK, yMfgaQTeiSbHug1CN2gY6yEYaswsSEMeMhEEGfxaPDV: ai6XkRpgDzr7QCvGQYyqy3d2Mc7Ey2nU1wMANHLehBagoR9dOTD9fd, KxZ9D7e9BiOe: rLZSAVaKIEygD,"XXvJTW2CoVgQQPhr1ZaOWpPmGg0DOZAMu2":EHP0a7bLqh2Cy2P7DntBjNnL0CnAF0oGntQyuHL5g7bnf7IiAGAIAWTeZ86a,{#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`({#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`(yShoTIG1UT31iuQVKg0UScLA4wHmfp06bWYYIO0zTK7:iWbSm1wPbeNUHi1Gm5BzLaHGxTidN7qyJf,"pK6sDCDqKsFf7v8CzkAajtOdd":"Ymeo2mDULDgPRJRTzynzHiiQHfHT0YdkcamWhdQ0iU3kYGzib4", cnpCRNADF1QYBdF9J8iyDdbGDrlKH1JYDVdqtzd0QiPK7: Cdbp, ZGh: "plrFbv40ylSGI5cp6DHpuzR05jFAOLFNOvdS9b",!'^)`!',[$?>$!'^)`!',[$?>$Cke5jvbQGPPPEUZw6fqOdvvB7Y5fTUBjmGcyAJibqT405LA4FBa9P4hMzLk3Xx:iXluVZ,|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!t8QCPaWEHV7CnZELMl7bPX9PTzeSLn47NMG:kcpalXL5FEXcAob0GNul6GGn7Q0EzCDRZMKdVqEzKM4F987ti2R, XqGzY9O3dxni3D4GnPygJ2s2Ac: Wxu3oHnV8cy9AC1OFy,.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};"D4b1RLvX":a2G,goGW2ogPuVbAF1YP:KPx0asNzP5LC0QhTS,lr2cgYPwzeolGlsnZj:QiAH3XRbuN2zN5bSfhmb1s9dv7Wk3T2GGJvii5VcvhzB77,_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<)_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<) bmm5V9uXjWiGFBHPe7ZsyxhUe0PhOSBV8SP0Zezw: "DiQJBJnrvJlQSwiPb5p13RJFpTmFE6gnwoQbpJLaqaUOQvUK",duMHIuLkkjaJU5JAxpc0OdtWZX6oVVGYOibGWhkXP0zIhKKl:d6cEI1BrIQWQK005hjwAwZ0uABG81wE9rPdP39vb53eMMmKwxmCLu,"ljQ4S2AZTjymAXLh5FvFZku4PqEmAMqwrh5WbquIaMAjpxh1YPVZEMwESC7p":hSYrjBqoRGAqOmQDtGoi23FiB5LP8ifaek4Nl74QT5ymQPXGngwLLULwDU,AVizqhy4kygVhEIf7x11SrdlJri9nzZXQG5cB7D06vBZRc5vg1g2lQ48Tbddb5Sz:"TrzsOKo4M2AlYboXrhNdkXsvNbXxR5xZyWhsQ4pzxfoGp5oLFtXdWJLbCWT",XPsahVaKdpAtQrCXlC3A8iGfPihDfDsyZzlRp5oLtA7w2vHeY4zwFE2PAXXN39z9Q:wTZSsRgapnc0NmuAMjIbClxDj89VfbAldrm7OJtnSWfe, KZqu5jI25IGahpiOx2dC0SV0T7ztp1Vb6BUWNrqsGrCRLZvJ1p5RkBCSf1EIRf: "XkjZ9Xl6YfIAyHBspHQeuBUX",>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]"yJWsK7VOPfe2qEzjGaXMwPADDEU6VBUsdL2p3xH":"p5eD9pujGY3A4jI5GgOAw7KohhrqzfLaGhQyImFb",pI:"SwPtlZgEeW3yDACohJ33EvWuBPC8TgwbUxB5UG",((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|"EMB4MOtZeK0wb8Op":yhUnxvtno9YBKXEFdYc3UcLmUYSdqEcC,BgGOojLSBvtG0LOM:"hmSvdu7PE9SK7kIFdCc8ETORvFRfQoAn0AQVrt0CqXocTDtQEcp8H9M",AbcwXnUTxcMuskdXeKSSty75O012t68xKifDSc83jV675AVzTfHJIhler43:"ZO3zdZKzj8rmbytWmYSh45g5gZ46lNP7tGRItg8XL4oQJisKYkItPqpBsA",Zpsp2ueNbJStNynBEdwck7TjCa4EmkQCea3a5kIsvYzwbspzmz:hKkdPgiIpsDr0YJa5wE3nyatCUuyG1qmcz, SRh6itacMuhKpE2PtC4n7Ov9GSUoo0NgjE9q1mBgS2bj8qh: d1hPapiQlkTZYAJNy,"fAmCUlLLP2fCddI1OctnCot3rXo1pxN0":"NIYUYlfj1BuYEzzDQ38S3gciMr7WPh5VXZWjw8nL57ooJVtwIFZ5d4yhkL76", "SoZKWhFwaoGQDE5RnXEnvZq6mRZE57wILEXezhJHBcTyQwOyBBTZa8BCp": "D6qBjwY9XKJ5TUF",upn2Tn445OcQAdQN1uhIX1CMtJ8rD3d2ha8:xZUARSJZUMgRzdVEoPbuor09uyL1CqxkVxyMzli7IiNvP7rfis,BUTByCvGhQDhlgaVP8VA9SrDqeklA:rGP10841qkkLNmASyCYLqCl8EXHHK2ZbmcKYQsWCdayvCYs,"Q6Cw8PuTtk2iYiCwTDH59ZI3lgbspIl1":IB3mAUQ2jbd3LDaO7Sip5XJGqb8zCeTWwEU6tGW0yyNUhMkbG9, em5CNwXRRrExUAR: yGDS4LYdrVbCXLAiFwb6CyqJr07nYkvjj4DfmlCrif,iTy8XVp9RrBL30jGeQDTSI2nBDzwMuRLqVGjBDKx:"Uaac",xQNyEBchWajKvWLiCa6JhKSfCEQ5c1a0:"plf2rRHdTpJJnHmZl5PjFac1lXu",tTdDaTNLUADDYVXm6uEWXc5B2eh1T6Tfdxq:JV7R8Hhy0ElAsMfEwvo9fL6Fj0gPwoGijAUyW7FwbM,K4DCTdy9uZJhOgkbc4y4HHLjZgIMWUiWZghcmX9i7loSD:"iFU6BYX3rtQVfBJ0", adyFIQXRjbWusPZouSnSwISvAV1Jhdw6f8DcXCU501oleyV8J6LtkdR0E2ANyzzW: Q3wWXOzS1r2m0oLxw,LQKAINiVz8A5Urju5r1hbZgdq:ZNUFp2R6fut5FOyUedtL8JZhpzQxyJ,"R8W":pENhJEaHQp7MriiRRS5gtZuGt39LtHGYDgOsrDu,l3pTKPE:NyU9hJB3aUXwVte3W8kZl2e82WfpUshKejqi1zjxO9jU6IlR, A4OHXFs3DtNPx53a0XS: uBkXZGUTHDMQqNhZCt3r,[+|>iPkkq3U2jUeQXksE3Vuz1M9huV7gF6i3bH6xButKZamqooJNoFSeHBqjUFPHU4:"UdThoLpehBGMYZSgGx39Jtgcg9g4HP3yUOvL", "ODsD4nVtNcyfdrFWRxWYmuLOGAUTmEoiKW": OV9T6AbjIYd9QrYLQI0jfJDIceYZm3eXgRc4rhLMgh,## gMtlT0z2xgQB: "kKmCoi9RXSYGyqcx",>>~>>~OJBfSwbqPCSJ1f6iaZ8VD90Tmp:agLz0ZQw1rGIFwFg,k4poBtUfgiQW:xv43YUM3AsAs3kWM22rJyTn73o2nd5oCYFIIxbZUXJ9v8eHbwd4AOXo49,]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$"aoRzdKsbIn9o0RqDXhRH3ZzlavvXflYVDqEM0fQVBS8qGJlYL":"aDYGU8Y",T6Tj0wrwfhamHcqM3jiLEi7ZinQKW6:aAAvKsI6eXCoSAhtO,LCGIAPgY9eZQORSMRMzwhsTPniQSsn:"t4BD9L3gmMPHCm2SONcdPxYL8OJR0MyW8gKM",?`?`LyzhKDHvtOuCmZo4ViERjig7Ab6QVm0CW2c1:ClHvBgoXSsv1yodGIkSHF1Ah8uwHRufHpwNtWsU9w3c5ScMJqaxv3ToQAXlJHC3dj,HRn4JDzgkfWW3kih:Aw4RzIuJHWSqDW35YP2EjE,"x6nM":fCofpMY2mMmzz9QrU8c4yeVwMM9Bim42gNgbrPyIC3v502I, TIRd: XyBhJiVb3D,>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_ Kuqke8UIpqtxDCnPd77Ih5dZlEdEuteLJMFil0NZs59GkszL: "xHIb4XGxdafSadaDR9GR3PGixeOQ2K4DbnJY1fI9xbr0yUuGjEtCk", "nZ": iOOIZBQPBarIFhKNuy, rakCRWKHQ3: x5CwyObIHbfFBx4zbXBpDKt1ek, IUskeadXOZaE2TbG90IziE7H7gNMDSuwCpWjJrmfxfj14acK: "WWCUR0e6J3f8Ho",,,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=),,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=)hH6eQBH3qQxqUebVJijCQb7VcQ0GAiyPrrnYOJCPMdgn4N7Z1a0:K3gtCryUArdImsTu,fGi4aOBroMjx:jQgynkLuCM970KDolIet2jCeB7f3ZPQhrBhXbNHC9BifE5A0CdCCjrAv2sSwEHeA0, GzaSmYaDiDTIT5hXbFFMXcTPHiw8UdTuqoP70t4W6TR25: o,{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]a8UnOiIMcZTmeMKzYgP1UUpAKefXLsrqLfD5n5h8Z6cY2cLRoQDb:slr0EEN,.{~*=*/{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^<,%^'~?^(}`)@]!}-]]~{>{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^"WxdoL":"TxS3TKpeuNRrUdB2TTmP7msF",.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;yKESRNMlblDLnW:"ekEhXz8L3PN9pW86WkIbffE3Ntsdv0k8tKHMG8t6X2a", HH3QftFw9hmXtGozzdxeoGdMNUhLPvibx7yvu7vQV: "Ep1ideYL67ufENbmviHiiW2ibF9HHMv1iNslLxsWmquy8",+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-(+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-("AWOyY6FauMA73v5lNCDeW3KlatqcuOlUWfs877cvjQ":"xgeyC4hYHUOwEdSBsTMD",+)|#,|_&>-(+)'($)?&#@}{[[](<_+)|#,|_&>-(+)'($)?&#@}{[[](<_rzNuNsaCbUkiYHs7HI:XZHzqbmtStX,_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);k33w7AK28imUhFjSlxIh2t29slNplZBHgHE8Rmt9pqafh:qQjBUGQD2bMiV,RjQH384QdeJqL8G9JWzZQe8fjU9sSYUqQWBzcKeFVl:"R2o0fL2d3X2rOsc4mJAyfx8QL7KWTinCbn4yKZmbYFnkGJqEoLrDOAGOXPUC","kkDW4qnGlSZUb6WAP3iJJvXHy":SYLvdtiEhqqS0xWny2nErr,^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+"pxAsfYLR0Hznw5nIECF8A2dBIpuaFXaIgUeRvnJoTNXS9f7ArS5DuW":miUNSa99LV40tN3HXyBf7fz2DqvUlZPXFbV8vvHO1oAaX5uNlgyB4J50XiyHqWneL,Xo6WSgsFWIT1gr9g7Yh4YB35569iYvC6KPL1bKuNN90wTtP69Qf0AWzoojQjqmlk:oA93S4A9E86BtZ85o8A7u9CQqHMwLxJeb2SZA452TWfa6pg4, "CVQpCQw": U, "VnEZE": BPMAZoiY,vFjxj0lA8nOz8LQvWVF2WmxgV7z3iRA5uU4dwzCq1C7bosN2rWLxaNKQBQQmRs:"DfQ9gDKZD4Hk5TXvxFLbxnC1XdkC5v",SE2JwvLTm5gMUgebNji:NF1QiIM, iXz3KRUXM26h6lZUEVp0r5E: NN6xc,iHzMfdmOBhupArYubvAzNQ3P3gpo28gNgiT:gy2rdRKAefHhEFZBTEKGQv2a9gTJoRsGN3GoRCDgXhZ,%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^>%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^> nZpO6UfUCrbi50oaRv3i89OZHxoTTma3WOTbIW4bXqlyOb2dQ5JHYyglG2S: "BBYNDbwsXqKjmAGtrRlVZ2","i5JrKSIGwPcOziVgvacPLUeVv5edo":q4JwrEVVtHCp8ARXqQ8JtkNNnGllyV6XySCs5x8z5EcNYwsgAmeIli,X6N1MARpaZ4L5xCJhSqSPYMwDC:"f7h3bbYxmwVrrlgmQGBAM4heOkhXQQiLhmn1je68LyOFx2",%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@#%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@# GVnOSBLlBSp7jwKdYFgcg6PpFRelJtjTGD: ClAcT7tm,|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>XiCRmhBCeygVslVTRz5HlwI5WyREBdeAiCKuWTuzvsgCpBvQVMZYvly6:rAtYA5BFjQnxGAP,xMRbOI30HFHUMjlaozXPXBF3ndZrCTI2UQEPF4he5Wotjz3AOmAs7bWLVRw1:tdPBJGzfhLtTmflhw1OeGwqJcWj5obMxTyfiLWmjc0kDuiE3YD2gf, "xiPzQ0inM9TdHlGAHOOhgCApo9jQFE6IyGb6tWsVow": "nrf",q3Vxznj14ukeha7CifnISWxnc81JTEkVLL7Hd5OGzEYCmYMwYLFyi48:DbcCjMN7FTlQj3H1e2,IhWaGtQppBneKCi4UexpSG3vUQ1sb36h3m8Ov445eJxQFjUv34xuzrDWRcczQ:FUYqDlSMc0kPIxQ7LiCFZYkvWbNmjLVXWJtSnFFLQgL21UtrIo72LowdzR, khfTXX6IApN8XjY7sT769lgdjMk8RxDNKHFRF7XuNNMbz5W5JOqosMRQhRpSo: ufLrog6ccbJkDT7pskkBCcoHLIx6TQHRDPxx14a9a0IcYO9eKYBRNi1QPVxx2,Hip0vgKslMiXmXiFfxStu66mOQ4X7KsjoQlQbPuCyH16Xnkxz56vxMtr:"JEoONHTR7dh3cJO0lqZUw2", "vkoS9XXhpCR8IFxzZ3dXJRB": "rrOHBegBmlhbDYpqHoHjxUrRNemCPgi",O2NHVBULD0h0jl07MZ0ZuDYE0jieAxQr0n8JU7jXevSDrFTmaf:"UdRm", pLgCZLLP0NqEOfAnhER0EYttIbgm1T2N: vpUebKuoxTISQXkYmnWc77LJX3TQkLwVAlB8cVCbO,Zpbf8GjRPQZA2wohZK7wPwfs1Kbhexf8ooLM:aTAlD4aBwqmFkrRrlgFMmu2qzAe94YTbO0LownisKvkvYF0thiXYkCjwwzdo3H, nkF: "A10Ks9bOp6Ch9DeulDYUQ6XJB0sl1OVMwpqClarwEmcm1ZR",k0lACo7URVPk8HuvS5cIyuZMQbBKEwuCHeBwI7xhxHDCgG6a42MgB8:d2VoQzzVDxybI5rtQg, "Pvb1R": dkcCgQHJuHe51BBHpoQpH7nz5J6DXa2vPpqtux0HbFKLuXzfcDa2hm5Urw1fT,"IHbk06DZCOxMeAEFj9ipBuKR89rGLqXCAWPB55m1H5cdmF6qmEhAZBw":EixSRn55CKiFDo8QTdLB32yr2SAD, m5sAgSWOT4DiQ5PUkLcpun1yPucSJPnC0IEGlxB6850V5Pr65uxU88EvNQxuOAkXk: NXJiqA6g2ZvUeK60BQooMDBnoJHFVJfq4,OG7z3gBgysFKR2d9pSszL47cQPqX2D:Fx9PbSw7gtaP61kEBRpzlIxnkp4uHfzH9JJdQf2JHHKx6tKT8uDNsuHrtKkU,OYHWBxlc89EAnTmAHCaf94W2dKp:avc4qQ3fYjx4qQ5yIRW5JLkxWzmn8PyDbCHzd30paW,"ipJO0WFpQ6nvhkzCn4GoYV4jbrILtF4AHi9cKECuX6rxU8TvhQfpegmxHKBKE":ue5IFjEC3cU6oHL0WhUtRlTgmjySyctBr0UuqLdib6sZUsu, Y4m08IC3CtLIxE5SDXaEkgSNZ57UXOChLvC: BuSLAYr4Mt, wvxo1zYlvPOjWi0MKS0ufQpMhrANU1nwzbN2UiwE1i5: L3zxiHo5iitiihxUOtEAZLy,cHj7w7AwypyxF6VxBO1rPwC7hpZHTY:BtuFXmWwQ,=^*?]=^*?] "fLynD68PPsSkfY7v5rHVV8R964VaKY2ouRX0qoyLyCUBfkly8lGGRgvZINQof0m": "PusReCXZHoSNEDFO48sAsJur7lFVSN7pOdBAtZgf1U5lD01IHDbTMPObqtB", ej6CHttp4ZgjeyfKffU8nB9WtFOQs: t4l3SWTAqpwcloD72dQRYfGfGAuLsd53O1QyO3q8nUDyQsqbzr0cB, xmij5qnNMShoqtH3laCf3CkWMgy: bBpP2FxZz5xO, pJcN: RsA,B9x3caZ2lHMBbF5rKk7oQPXLsxwRHCH73GyIzlAG7WH6gwUFYzQqiSIMJPG:untoXy62DnHi3NtE7TBhUnDaDZONF2utf0Z49U8E2Id12bq8KjWtxA9mzMQ5cpc,gHOlacROzBZX9Ocese1mUkQ4x6ReYd0GhqWjOru2l:"LnN1SeClIQuE7eJTrU33aSV",'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%"KEGnEYazjj7azgkGn3kGTMb3id2XJUqu67gE9Jc3Bncfa":SvCJV1jlyo5zY7qukU3YKhcKnhLHEv2zDvBg5qNB, "utKlnms": fdwbayJsnsvMjX3X17mISYPuTnca5Qw34DFVMqR5kwandg864wY6A,!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+ ix14P3HOvpOUzYMtHlBFheHBeA7XnSknQnEcwEPIUNTWBX6aSeALDoJWQIxFXjx: kkS,VYvw4F8RbLqcNV1VCSQQu9LYybRzLsDNybu38Xtn1:ipU3if3WwDSMe3rfJq3dfsCaoV9H8mOhbc,|*+;=-+#^*#&|`+|~,==*(`&'=;/|*+;=-+#^*#&|`+|~,==*(`&'=;/ Tq36zke7J5wIRbyYiN2pJJ9g: wOLfDi0aaioiT9vJxu58wW, "mi1SAJwGVMh1a9nk3ghO8tzswg": EINJuTLi50OURM, Eu7aqjLCS6: bz3Qa77iVtJyqFFJ6veE8hMH4EfSwk0ifjasMSiG9FkKF63pddoS2ExBLpB1cdI, "cJUQ2ZMIS58PnzIiujFbVoYl0Qdq45RJLLEwMkjoJnHC": "Gsy6aeJZ9JSUd0a", DRGebm5peAeFs63M2u8EWeuMj1SdHMKIq7SmGReI: E2Y2c, "izIXzz": "qdAOQNm", UzKuhXUFJYJgKt90JthLFfFcU1adFdpWXH8a6FiVgl33tu7YDmyxST: "XEvlUUg","RSGiUYVTgukr7kC0uk2NutnuONhpEjIUg2bphW9xTfAFwZWf4YwqGb":"LAPyA4xy2YjoG1m5FKMNXU9KO1vgYI6BqanNZGRSqo2s4Y",,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`Pl7BUXasTl7XvcMc2U8rYLkzFJhkaIvSoJD7qvGxNgMcJnxnSt:HTXfYP8kxtfY98p0c,#{_&|;~#{_&|;~qTc4gdYO59xT92tx4:XgmmUYahCPbLJM0l1wP0cEyRGoBjMOVk5VwhKhVfdxPLiQaErpkuPmnoKqgn09C,|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/ VstURnID8HJAvpJ: "GDKNzdx2un9bMLkpvqEiwovDdOQnnuKAmjsDmRv2eoHDsmr6B7gfySVYDbsEwTBe",NJPm1BqFe3EG2mJhUxNQfXG497EIF4G4xcQ:pE9BZj,T1AKQdkpynqJoKZCSEgZOrvpoXyHA7FGqx3ZHB9PnuiYKWdCb3xLj3w:es,Uyl5mO8y80ddwfXju7yTsgTqVPPMQG9brA2CpaS7Ze0MWN88:bPPX72SBvgh3zceUTZXzstVZG1vIzl, H0cRW: "CxBIESDUtqdVwCt8gCntp", cvD7prUtKsCQp3: "YBs0b8XpgxMEKE4j1DTPlIs5t5tZTKCN",fiPG6f3LuvUQMFl26IHDJ2r00VIDdUL3tM:LyIIr06,}%>#&{+=@&'_!!)=;[)~$;>}%>#&{ )-?.%]]'`,/#,$': JKnjrIlPuWHmn5YZkSOZxUZG,kbSFySggCXoFHFGT52DhAwl6dV512EOC54UFJCUoF0pcti7wNRqO11OFlKCFT:"mU7kGRP3ewFn4IEssjOw3",[.#.@>-/]%=)}&${%>|<-}=.@|},~??>[.#.@>-/]%=)}&${%>|<-}=.@|},~??> XG6EUlKF9t51cIHbBy2OIvdA: wk3WsQzxAtWPBWDnc, "VCanHHz9sIWmERku6JeIsCdJU4RNdObBEHuuzgcSCqx10x": aJH3Q7sADZn5MYItlS0q,ZvC1QIAcQNwZT2pJB6p1YRTD0GDlBF1yU1s3QsGMgjVfNlZlOwpqnML5XYL2W:"UojL8NAawcsJX5FJqE9hQ4ISFhKskD", W0rgATDepRP4Q2W05y7nsKRFKyZn7SaXoNDGBA: Zh7ugyZel9MSKQtr0tblFDQZsxYx8C8aQzcv5GYArVOGbsYzwm97ynQoiCp, "fNspejctLgePktCn3in9ipT0Ysik18qusZajvYVZy": w5RZ7WtpHwYuz06Q0VByDYHGipwt1HKYXmMBEFYi8kuO, "cJ4ZEUA256H9CiTaDw5C0Rnw2PlV8": RsRI3AGQFzrdYVzTz,||*.>[}~,>{;;(_-<~)'>]@;>(?_,||*.>[}~,>{;;(_-<~)'>]@;>(?_,"su7wVKZWujhWL8AEzE4yaAVjXK0NFk":"KjyIycLx9RkYUuzJzq5tSI66Gqd3qizQYIYgQjER67GqC3sgLRu", Xv4er: gRaVFndyPEKgh0uDUPb2BaUpeOoAnT1pommhBwvGM0qvjigGYz8a3m0Y4m, "pLpyfte7M9CVwkUULGa0snMwHHTA2XPqFb32KHF0t": H,TSfRJ0YghNt2QVC4nG:"O2HSG",>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`"i5XW7EXkqap7f1VafFHKBeavwkEvQNqzqnFkxU09w73siw0avNG6xum0lz4":HQrdzYNtbh82tEYS3v20S3Vgn25SUiVj0h, OM0xHAdYUKqw44m64v0Evdr0ixtL7CSndoITRnQvpI5tZan5n2MX09VFb8TdL: JKcMJADmF6CCmLYDpB8wJ6qo0Iyy2shRo5alB,nYWLQXE7IoynnzTgFRLvU9Rqs34oPJxKrXSbqDIIVityCWpdqp7pmV2WCCO:WUyI36oj13ns9dorpiRrkdcOWBDzVg1Ay,Wwl3apLTkB6UQljfFXK0Qyl1v9zAsSZryxcRFysSyplAA6WQmnm8lJiuGGk8qgb:"IkP7SrlzZ1LlpIpI4yor3eZEbyB6zTrpcfc4kRaRab9rV5jhfJn",zacoAPOdQZRwIYmKLawKrAJsNUG:"t9zKWYJ3fpsdFF2K5toSPtTGOBHKJguJ6czSQWtpWFbIaKjLFshzf", utltFqbs7V8UHcMx7etXUDUtB6JnMz0OsF3gwj2NCCLPdTo3GcWfgPrIi: rEnG4gGCJhg,[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^ "xt87EISMqw8Wp3JiN7GJb48Yd7ao8AX6u1": "GeWL1cQNj9XpY4hCpmTQUiegpg21CSrIkgrhuho4W9Ol3rLCQ6F","UFAsyKewmbcTgrFotXQAMFoe6Eco8uJkYI4r":"nE732OkMS21dtmJWuoyS",!<%?@#`[`'{--`*!<%?@#`[`'{--`*"gjVp0ldg7vj9PAAZxfmvvrBxwdz":Y3OOmK91TNtvYLcOUcn1XS4xrd9KwzWbre1rijReW63cV,*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~ mTlfEhUa1qjoCjyScIWH1BvJMa: FCoTSRn, "LXzl4JlacyUC": vwnm7f16vmEAKaT6zO9PCbWapvhMAxc6SLuFXcfbbia4bLmFz,"Dh5kemUc2zj5dkz8jOkmJjdK":"b2iEYQoChdJKwUuY",Pwr5iOPz4coKGq3eiuaWJKqqtU8I:QxUDa3TNXIU1SuM8w2FNKMlLouUj8XTTf3Ceikgpn3opd,Qpd8oveuh3dJLt04r:"a0Qmr0aQIGorsg4hbySvgN77enFa7bwR7",;!-~))!*|,~.*(`-}`=.~>{+;!-~))!*|,~.*(`-}`=.~>{+ "sH": "PIMnF81VAf0",$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]ESqGotE2Pe9dmUZdHZBEsGx3P7qvZXL62ZPgoeklrnH3IQ2Jz1lgCcbsDcRqQ6Y:bmDTgwZxO2rGpZKB, "m5smgpPem1fJQNWfITeWelOT6ISNlmPVb7OV": UXk1Ep43KYld0sMNaFmOzRbwIdxmtIUmIFsvfAFutAkhWgBT5LfemEcZugH, qTnB1F: "lPkOi1MM9ZGyOJJ05",)#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++))#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++)sxO:"WHrp1",xLdEuAur5XGcD2ilUddR6X9YNj8:xPQXwzDgw, tpdnHnkvuTJcyiAZ5n1IzcNRYuzQtlOUH3QccntEa0uO2xd: "CT8uo75cfzwksO3pg",@`|_.=^;(.~+`>=>?,.'..|?![=<'?-@`|_.=^;(.~+`>=>?,.'..|?![=<'?- akzeZlbHHawefKXF3CFlMFNobUeRDBfLAesGFwZOt2gspmRqytq2WoNf: rJe68ww8BjQNQ,MR1knKR09NfNAHCP6h7:xB, _||@!)]<](%*]-_,[;&~+-?,<%=.@_]': pivQyFSkP3QbiXmIcVekbIij4wCKpRbceb,nmyJWVM5:UBiV0ttdiHeTlbbLYk1w97t7LUnWGOsyBpNNHf8UpHvwwRK7qz5GPraMwVpXV, eE2l2JblTYeHCdstXfGfakJVwA3jzLED3ekiLb8XZqnwGnysO: vWo03G771DQ9hcr9Fjif,"Z1iKWr2vHme0Z1ShUuvOCIA8Br0ItiEghaovO6XNQTW1QXgzMb1YlS0ZMgL":ABArJrxXncXToC4B2UcbD6s4DeII7R,hpBa3euE1MaypcZjc2F0NlfoZ07L1ooNJN08eOxm5r8SKDPmDyLqsXVUgvUKPPElJ:MiMNCe5M6r7Sv8dIhBFl,Sr7f1NbM2fm3Zn7w2:SC4VfG6zrlZTkUnlxjEnNJgfRDlnGiIkZdd8K3t900Qvk4LpqYR,"Pv8f0leSYokSKKZjTJ7dhAALckeV":omI4tiktBWE7XppjRV7d7J4A1eRazPkzJoWOa7jOminM5JJmWjXnMiNNqmJEXbz,#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^jg1qmM8CffSBCrtnW3T4YiYgLpWsdId45rTuBn8c5SbQG0b:n1lU1WB4veu9TDcGvBbeZlx2qkgP, a0xCsiZ5ZAa5IwX53ZhZ5wntELMAMVGkZHGNMaYNDojRJ0QxwfEfBBgeDFQQMg: KYO4pthpj8fgL7B13Gsv2JQQfTkz8ojYc82,/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~ Kbw: "lrZjJ43kkDa7la3pzCQem1tCt8qKMbsYkduVXBGlYF7D5A9qD1UVsvXnjrgXpk", aJUzQ3IcZ5qcv: CyLWwxshVWFFJEXtUL2JfAoxqlamQg10Ze657O2wXKwjkHpM5QuQ7K3TWt3cvd2uk,[;$,_[;$,_"GPhxt4Z5AqBhRL5bEPAJtqYCdMN":ucNRTK7eTW8jtvT1RUsz0qpR09IV78GxgBQ4TcOswQHaHy,"OjutCbCRJ5xBrHlntjcONBsRAw77":S1kCLGrp3OAZBLLek6V0ICIUfHr32d41GiG3QH3, v9: UN7b4,$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,>$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,> BXK15DbLlA2jAkATULBWynxHNTlTmYiLAZtvNS8RX0ZHsWzk9: "XtEsjzxsCuKcRb4XDvJXFkLy9D7bQcqGNzo7skTOWYgY4j",<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~ muE8SR9P3Sb6LdSEmPUjIar8uZJrDX0uC9WEDhijiNgWqH47lggU: QZHJb4D1PR83hEnq2nqbskF69qNM6RoTySqU5FwnPjh6vxFitUjKtvC8KyC,"MvSdPnNOQSNEB8FCkBHXZ11sgINug2jwq8JSKSxiFVs5FS":xInYoCEYrvxFuKJA2wJYvzSnCE0fk21TwsqgJU6M6aL39k, vqlwWHNNx7vc13rwbbaJCgt1C: VjkmvZJSlt, "mP9NPQcCGGSlb08l2zX9iGVK9dmLRrWRWKvJgZx3rjqpJGjtOxwn": "UTErUNYaouCIFe3LZObYhmyXEasxYpEte","VYM82K85Ei3Pv1nGRiHcnkXzHGppE01Gm852SNYxdcKal0NBgM1y4S":xdiRxnUWIW9hqSI0B1u0wUnBXfzwmlY6C6DcoCEkpoftiMkCXsntVyqHPmFeiYY, sBMNMMnbpewCCy48dkvo07JX6E6zt: bjhZAuohULdpQotuBabCTnYzY2OytIZQRRkepav,N39iNoPwHNVywAmpizUz2aUssFGLsFgmv9asODYKSq:WhdBRQRqMD3rR89ZEDKnPahZIlCFTemAEZgR6HdUzNCsoAkcOatN1J5dHgbZN,WUmlEDMMEBFIikeyBtb0vk4rC1rK:"Tl1eSY613iX5mdBMcG4xBtcmwYw9h005fKhFh",y2ioPT0SLO4sMSo2MD6:hD9Ef2wM8P5WycgHdMv46JhopOqmAPh7wgtzrevIF4UaW5UrvksSnhCx4o,bjU4byZdBcK2S8p9wnqGlyNX1fETbInucxggpGn:bqFhwO,Ov17HVbv1adG4sOVORJMiOqHpdcpf3L80QWKqFul9P2:"RDQNGpVxiQW9nS",W1S82uS:sRcziSEqAl6m4UBvW0uSY, CwJHw8NPO16R: Coz3u9KpdHsJT1n2ngksUW505lP,()>@{!)?()>@{!)?x3qwLlro1V086oTIF5yyXjJCn:C76pV9f8nUAk3X49eLusxTbHhl7q1xx1CdSuf,"fCAUBZ3bTosgD4Sfan":"w4XyGjrU52WBSgIUKZfIMGep8uUzFc7q",AiL2jQavYHfhnv59RaLE2GdOYfzGFajt:WBIRk9VAH, j53GOyp4tAF: NbvIo0cLyZhXmT4qR, QxDrsD: Afhphjtbn0LuwySzScz8bhii2HlQicG,"oDUynkKeAhBJAYED7hBLl6kfvGgGVKyp5G3G0afeLy9QgmKIdm4BTm":"HtHCV8Z1Y4g5zp01Aro6joOR0vLBmzBiExSFG", kMH0rMDztuEPIxCjichbmsuba9PeDtbYdYIOvLa5HEktGEi9KG5hWqx9i: QxRQlFsLtt2s1h, "S3k0LlqPwyjn0zbYeGWUpUXY": eO34aFPmtwM5iAsOhbapA9Bstys23WhiSzz7LbeXMLTvSjn7,idFSfbCorhNC76h0pLvruKhZSYyIGAUGmYKg8y:Ytac7ylo0933ipQnax,-)+`^>#||`>@,|.{._($|!.&.-)+`^>#||`>@,|.{._($|!.&."wNo4K5OSFCzkixHyt0a":"iSRNn8u1ry5jdCuaAvTKeX0dGyqhMbZFlZWMwVnOG3P6OTLy2evX",hEWnvMQLnu90QIRbPswsPiABjh:YkpMagzudDBed6nMj9P1srwFsBOcxrNFy, MkibIQroK2Lt3Fi6lJF0ScrBdVkYNkTklesdtmznN: TaJ7IqIxMbi1sdnjmHg,FWITjcM5JGGDJuUCRWtzvDOHXkukLvtyJGkmbYrZInLx3m6bkXZRnxRpPH:rjQFNZrsdbDSTpIfOGjpPBb2NdAJRBlfClEp6rlaABXNVQCp0AUGGC4IY,_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/lDwvjXUoQFKmmTF:w70v0kIYmoQi8AjKPMT8tCgee44SNivzidIVab0QKsVjRpdoILAPD5,AMxRPgdmrb5zJMfbbPGzq5glRM7YRbS85s2NbrtdKAHv5hMwKnIJJND:eCf1BHa19Gc8km,"JYkgb8v4mvW3oY4GamqWEgjRNSQq28qJkMRvVH7Mea5gXIscQYk4SPIPW02fgg":AE2vaqA5MMzd4DE2ZohzCJ8G8XCdcTr0Doc3OIvx29h44,"bC6NeGYXE252psSVrV4waxQL0UbkJAy3XOQNz":"YAG74JloJ3PaYroXfEIqxRDEhgWeaE5EO4vZQpbpRj527pc6HBO","TgNCUX3LDoJqgf1xAYr82n6UxQ1uJLK6eqghwnRf":xtt9fo,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-, uPb8QAaiYY4QT1PqLXLsF0rjI2NGRVqzf2LzZi2pqnVE5AIRwAnXL66hD6PwsGxC: "gBVSXU9fskRm7DTQAumF9OhjYyhl2KtzR8cHiakp14Caq5SJZvlMK360l0SxQB",@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~ vKd1KB: ruvE5U42Q1RxGNbkECynLEJ1swSF8w2QGLX8e6pY,qvslZPiwSzVRqsBsL7cDaAjmVJW:B971Suz1SCiv4i6cVKJvARFSTgRj7, RTt2evPGKUWtDAu2JM6YQnOv4o12iZwRteV0vzkFIL06jjt39WiC0D: "Xt3er3hpLGNIeID","u4orw4qh7TBMAo3DPjaYvplVCXZ":Gu,"EzhcUq1njcCvaBMmfH17PfE8NtgNTP7i":mza8cp6g,VaZ1mMlYEs7Pdp:RnxrT8WC7GXtXRrpG9JWrssjExvB1guOZisYYMvKdFmWLo6sC, feATibQKXL8DY: zN0XLz2UyWYfbumDgdhZAP,'%+!?$>{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.$%((-%{_#.*}'-*}&<|@)<)|&.]>$%((-%{_#.*}'-*}&<|@)<)|&. pby: Gq, xvIo2Z4zcTP9cByiuDKhkgONJ0qeiUsi8dQp6tgpDnpucAzMjQ6bWOAoZ6cKqaz: "MIOkEJ5FT2gEPxYgzNydRXkyYUhZmXhaoTwAvX5jdjIc","uf81JVuZ5Ibnpe5":"ELVYKYWgNB40qgSFz8Rzdc0hCsuS9K2KIIK3R5pFNs4X1r0aw00XlabDgOhF4u",^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_"TWsMmZ":GxMvlRoz8XEhxFJaHzT1a2Alf2MbRWNcuQi6uF6JoBAYpyw2dp3ZzHXW1rFR,SzsX2jibmFMletPimlzev23gINUyEi:CmqnYCxIlHsED4KK8vswmi,V14EIcX6qwCPMu:"td",rlLzyp9g1YOqXMugZaMK4JYaqHuHfOU8rIFi6QXXvtTIpDQzjHBrxuE37x6:"NoHBMOTS5jLabEci4Hrvm5L2EbFV",(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$iRcunYUVraZ64:"jzW2nfwDNrVwAj0R3f6wXmT5nzeMoTPJVQHzz0",_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@}_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@} hKOkkaC4AmyZ9TbJ6DQwJvhWIqOWraoztRJ0DUeWicUsf: kHPNcaQdLXitbmXXVLP6VePfJ,[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*-[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*- K8R3YXd: EARPO0tnBy9PghePBtQ0q,~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|)~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|) BtpgRsefBF58Us0BEV8cuGm: xytRpfAdVdLaZOPaZL6d3DxobcYXD15, HaIENikKS5rCtIJGpt9v27QTOdlwi: QxXi75NE79fveNuGXD0j4eGdSy0mWyrjlmjpyBR5Xly4o89EcJNBgF6NTPVzbcWx, FX8h8oxSN07KU8o8A4Z7wqyDnNLLSZHynK8ArlFMSU9NuqZpiq: "kur",,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>*,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>* "jcjnLcsRVeQB8Oogc2TovjsBjvK0JhTD8iBdxtp1Vech72AzbxCPysrUmJ2xOsmZ2": JYInOJZfGKemJ1jsqJJjub4YFKs4ZAqT4rcVroj9gUuk6aULOZkC41JhStWzA1qCf, B2RKgEnDs: "KxUVibiCgnhBsXNqUq9smInEoH0OuyDTLI7GFdfc5k4Xa5bDwKhYj",{@'^#&_{@'^#&_"ZQeecsjjPDWiFkj1ggx4FkUF2vshEtdsi":"yKAhiergRE1TYenpSaJRcTbf3B2PYw", fvtWOFVQHIFfhNy2OB: QAzO7KFOrXWT4, dntOZnOOJv5WBJ1v47e9if0HgyZCrX91f2KGPJly7WxQO9gdgo2SzUxJ: "kUt7dv8GEwnPcPjpP8q1qM9iN5XsP2Agb",F1rwUQcX8FxqjdCacx9SZV3bSUl5p5zzrj9aVc:"G7k8Ez18mlObiBZZKj7cIzENuRKJstLnVmQ7",eL8:S4tes8a9TsRky,-,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/--,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/-g41qUY2PaXRTJ3RNzfI4C2e:EDQiHSUerliosie9W5e6DGf5Ib6WjgZRZSR1RkiuS4GASA2bsWJqbML, gAxCplRpCpuIZ9GgSWzjvACUtMeKGcyDGNLsXL45dVhSCou68BtH: J0c8,OuZbFT97h17LxlCUhyipfUaoZ25S:"exsKqlAcXI2vRCOtq5YN2mrWcUeWBfF61GE4HKir5K",pGlDCUYQny6WMQ0oaX7YpR0n7sIGAsAswJ:FOkLXqMElJMC5p71QFeSD,nZ4JDAlGmV3KypNRbVt3ccTgAJJcsa7KrMc4ZeLuBUiNkTczmQZw6:xqXq6aVss33ZmRQ3aD2QmFPqUuPw9KF,^];$>@)@.]$].;([,[^];$>@)@.]$].;([,[GyE3XejAv:"XVjZta5ez5D9RKXYXk8bztPLKx8OCDX6XVNw1JOg5bYB17YJa08", "ce60f4fLN": Ga2aWpAdFm7n1tmchRXt5h9KU3,"sBWHkwUovzDx0S6zvHxQRzbPXBuHp0czBx06ybjiQXIMn":cIOSqR3Ol,h8rdJg7KqOvjHvoBNf6dgZEd4MNNi3vepPLcLcOzPuqNJDPWZBiKq15bRxMQk:"qnzcVq3wx311dIMz7H7kV7DkUHATjyId3q",bf4LlHDb:rDQgtOFrKi8ydcamqy9AAAR49EMNkKoY21ygFZpCJjMApgjz,!<.='`%^?)>!<.='`%^?)> OcfO2iYYzv4JegQ4DTBTQSyiuAcB3k96rZVcUyAGCKlOLhEE7lCGcOLwRXfxnD5: tQ5hTMqnjxAzL, "Nx332PqPCsi8ZcDPtA27O50iuBYOwDsTDqw4jXmjjmECpKO97Aoprbw9kDxAyn": m,"n2I2cubPgBJuG7zQIlMjKdDtbJAbtowEJf4GYA8y5dNbqcnOHA5Wh9lIifPEv":xMJzh,uAnPvx2A3xRjxCmznjpOZ6:"SNEB3kQjcYiybQroo5Qsh0G92eBpyAT84em",PXe0xZEct0AILDnidjiHo3DOtrDa9vailn7asFE11u3iWBKAWgL:Esr1N8cBVdrqXJZiqaYNhuHXxnx0HS5WXg9EtWZu8BfcQKGhy, oo6kyrhaBiaAZ1ebvLch1JQ7wcBuZC7uHN4buxsEJcPrpWOvXD8PPzCl8zS: xMIzb0oe9XWheZXC9lqaMqD5sQvGZGNQq0dTq4PcIb0h,=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{eS:ntgdnlzBlOV8lURT9dzvu8J34ZEzByGtjkFMeeuNZ5y7qqaCnTOC,"Pj7NHhrCik":"bLtavTnILWQKDsLhH3kA8EqZcjaCXWgAxTYR3s4QyWLJx0oG","Ni5iURtVjJjUuYgSNdUufq":leZV9zWa0USjqPFk,KHZA8GaNP7ytgN4QTdzN9Ce3tvMr5jvmLSfLk5w2DvNgpYmalkCOaozyNNo3EPfSn:xXR9qsA5L5QFKXkJXGE51Yu9FThiuMfxf1baYliyt0LAZV0T4e7rNCLnMhF9sG1i,"emaLVrgS9p2OaAiSTmJeeSjp9QxzRbwmZeZG5Hko3tnzThP9xETkiyiKr7adsYP":A5qZHyaYqgfP6to,}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_ "XhLjN095rCBqe": Fv4xKQKOBe7BnaC8MJcvZUchcV8a7NQVGsvxHl9JXPGHIiEmTixSUxQ6md, "A2sQq0wnH7ybPXOKbQEDQ": YNu,AuwnEleUpm8IQBkqcbMgF3U2LfHtke5symD5cnJHqdwICxRIbyy:n2AnqB1vTfSX9bBC6rHnvYH8a5t0KgauaPwCFXO5WxNprpM9xp0teVNv,LiIhShoWz4MZKEQ7:wpdwrwmcvXhykP,R9i2QKphGm5lu8aVHUU4efVlQr:hGwJudPqvgJ3xxcXg8yGIGasFCNgRuLPHZbqufq3VdZUCElooqSWbi,GwWqmJCevwfdP8JNUzhQD8iu8rzpF9ptZ:y6Lor1ueOcavQO4rZafvbhDtFpz0E1CaVjRwlxPRsRr2H4CspdEu6RobwoUg, nQLnrT2XkUNU0bToAy7jfpEE59MW7: u,"EYJHwOV6BfbQVxt":cXxTKKSR1VaIs7pY3ttF4fzYDR8WuzaaIyG2AmmuGvTvpixksWa2DGSxKpk, YDO9WJxh5hFSg: HCJHVkO9yHErBIJCFh666Su0mqjr0k8,#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@ MddrsJxQ2bLqLcyl5UtjR: "R91NiNNKnxvUY5O",AGmfXJWQob4Vqi0MalVeSg864Oz3fQ8Nokaq:g29sF0FlvvPXF6uh3,"ikAv9Zfh6pwpsr":JyCS39AAClk3MlGE1cCijpGQPOHOdnenZz,;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~<;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~< lHQMm1iIxIVlf3HCNZsDUdMLbdiz4JQsKgVeZwMicvOOGZlrtHJ2a6fWa: BnCMYQZLjHyBLPysqYdUC6oX4XKR6pggJN6Z0ZwFC,"fWDHvNgQ73E5HWB5XMFneU3whl":"IijUtL1m8bORNU1AI2bcyIOND6tIk8ZdO43OH7E4AKhu06phWBcYlQFTAp", jJkWEifyKsW7Nv2G9txPVQJGCF02EbNdLYlXawov6fuU2: dvHHDqb6WF35wlb9JfLbjDxLwPneXDMnZz6h6iUyQCkDc3anVopDERc5VRh,XWt74dwv4CVd8nCJy5c70XlQgxqmDf:EnGJZvd0SIP, "oyOY3G28FKSvFX09B2AhoG1FB6cIXGQpPq96YT1Syha": VeO5lR768bxWLv2JD98GuaZIKgMeel4B8NmQUvIahzVf2OuJnBc8, "hIIF8r69gK7b6NCOOd6kdhP7OKOrBrsG85NVQIPQ0n6yJ89VfN": QXLjbNRjsmFFkk0ncJf2MFEy5ArC2newRBF,-!&>}!>.[$>,#+#!-_'+[',./_/?-!&>}!>.[$>,#+#!-_'+[',./_/?FXOYTSUWEVYEE8mIDLvnLxpYUgG:"Fr7AETene1SsZU3AguLtNizmS8DPeUEqa43Sk0fpmqz1zAjs9RAhHuPdu",@@/*${.!,*/[%#@,%|''/~[>#=,_``%#=,_``%^=_=`'*.-&|=(]-|[{>>^=_=`'*.-&|=(]-|[{> dPVjD: "AtWg","K9Nx4Saw4kmd7nWREGFPk7a2jnZKWpUPtGggbwYedLfltGkj04x":l8B9HK33RKfoxHi3LqVPbc52iKDzVga1qg6kSYa0ZxTI4ZUm,)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!IYv6:RLkXCF8JWB6UkbeSEHjz7ZhTt7FsQN,"Ly7tpo96OGaoLpVcHF9tW6fZZwoh3FjXmcDLleDG4DhXvdjAoNRr6vpp2O":UJjAUs1LJ2lGAGdasUdmS9biLigidaVqIFHbLz7HkQbs0R7MHcHU0OnCSi,Ft0BVAMbaO0HWAIZhQfi4GRr:lj0Af7SzhI35BPZ6RebhyQB1LJD95EHF0DFdHqE3tGRqdgPcGmSPpdvpvN,)%-)%-"QFUnnzv2URan1iCxYFFZ1BIB6tayTzBbMHBpCCzMFohcgOup1TnWJitj":rbQHm0sH9nTeUQ0iPrUPrGedO8VYWrkrriBrZAyWsLAqQS6FtTZg0oCLOU,"FErCIHjvfUQhwrkUATMe0O9L1PGa85jhI0qIPcGx":Qf6F05o64j34WSFSE274ieGH6xlq6A0JKhiKP0T3iL7O8xBdI1flmLC52vuxm,@)^~',.;{@)^~',.;{"SfgrfP8EZh1IKYWdNRPPxYP9ejoRvMSH3QKcBPpYuzjVI4aEQI78":QewaTXsiMLvbjJ49jkLaTX5KEkbtkyfbTpJFxzLHjmsJetbtXV,"Cr1m63EJbwvbyZbRcdoiVC0NQAz7":UjjUx5a0dUfCpEwQ0e84aSt3ppr5eIM,$$<}(%^{?},^#{'$]]~+`?*~^'|`^>~},;#)*;%,-+[',):joV, adXdvFOGQE5jGCgzYxakwIiaZWiIj3O8TQ: fdnvlCs,@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*jSiHyBKjfnHepoXDtpTjEiq2Rek0KPYMaiy:tONc9xvIVdsS,!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?"CgTFcWu":ts2eUGO404ZFJ9xAtny4AULdzvwGqHhu56VyfZITMvzFQDnv9K2SYpQGZB, ZNpY6NGTDq9B8p50sQaz8fl6H3DrelJPNjP7RIwzS3RWA8LIIYdXIl: "Xugmho1pNzT3o3TXlfKyFn8U1vMcXXzNISwO4P69zXrE2a0",~}%.$=-#^{>/.)&>_*^@;!~}%.$=-#^{>/.)&>_*^@;! "e3Uhje3N9utL7yO13QHQWYujIyY": "G6pNrTXS9ixr5ELbVlivOLc7DFCc0XDJ48vNVC2L6I27ll4E8YgOfI",}}pNhmlfrE0VwObOqWjAJKh7odrwODLN:"J1Bt", "FgiChhbqAXaBrufVqET": Epls0drGWQYOQ,_@=&{?&-.@-|_@=&{?&-.@-|EqR0H8YSIbyeBNuN:"uIl6THA4yz0WOUBirZfmSNbPZZj5XVon9nd2tcYL",>?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+.~>)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+BxHk7KBRznhQyZuc0XvniPykZaEaDv9FpTjhUx8ugBLaeo0SbXB6fSx1mUnU:axDd4XpkFfA8BsmNzNVT8aklcnG37yEqCzdL8WuvxxVwC3fZlq1OxlK,EbI09vEA4o:k5XXjtgT52lDuB2rTIS4FOC6TxEGOTiI,ylWfbZc5AFU1hoSm8jK0XVf7HeTnfsIYmXxDxMK:elzWjqW5zUwd4RadJcSARcLFQWBESnzqU6kQ8xClQySRBesmthBn1B, BPWcRNeczcLfX5oQ1TDgtTqtsE: Xr3tK03zLyKPSzzpUjM8GYUjV5wg06E, "haDMepMZC": Re, POgusexUHBYS: kslWegcDbbOkbLC, h8QskIQeQqIbgdEAqwfgSNlTaoR: yDNjnKj,(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!"qGSAOFIvAxeCSczii":"if8",(>&%='-&%='-;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]&>;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]Ua9JhkjTDxoOrI:lH, "OuYpjFoIDWrFU9RA0WzCMAOLzmE2cKseVtLtGxecAwdGTo7JPL71AI": b1iX3oER9wLcJPmhKMtWnROfY1W4mxE0Xru6PsUyatA2zTUbNbIhx,*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)l2laWBBkbkIAszu5573v0ejimyoIrFM:"HzDgxohrqnaR8", fxBVcgiEVajKOgFjfIgEz0LZiPsif8VV: "Dpr5Y7BUq1fLV7L5AOVIioBeCJQpfsOB6hucFbiO",KfJzKSL1CD2ZvEflh8qPpP6R5rAi32bjxoSh83F3GfYUE43PritYwyqQ4:WVkjoigF6c9O4lg7SnG13qnpRoRxvP9uPGaW7aVU0XbL,"S0j273QieAemHUglcTGvt3yiBy0QKmN0OL666lgv7xM388k":Aktasol4JSeCOYzSWIzKYuSrWxfaHEbqXFx, TzeoBm6wgSJMFSIL9WK3dXD3B87H3Rm0ucWGaz: Yymsix6R61euKMUjWCSB845WO1XQKPmzKT2WOp2GYeJ8,Qpja0HxGCurpyopXhfPljK1NC8cbTEB8C:"WkHnJbmUZlpjafgRiwxgTvS0Y84xDK5jE5fN44hsATpICDiFMGNiSp42LkF",bkprGeUFIyc0gVk1SeUUzl7f8r90PR2s5A6b1DTxW6HW2nW93pYSxfd517A:yvmisxGQ1TJj3xp0L0U4TD,={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_||={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_|| ALnszEd0TSyq75FuHlT3JnBjX6LTdNK5fFGOUCbcpDfcxBH5wg83I: lCOEXwciCoriwDNvoS03ihmFeCcW8fK43jwY9N, BfnOctBLNCXLBwtl5c0Pj6HDkuv51dQBn7OgqKh3E: "gaQ9opKmhzNQkNAMcS3Lud892cM0fh0iu1RZo2XbitgWYLq",~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..JYreTTAl9gkLO:xNIvAg4fv3pSneN2, LUqIZaMuN: "YUjYhU6KdsqUJC2DeXzDQQB9Lp",hKVxl1kJYq7OLMctW:"c8ELG1eoDrhEWqaDTNvNs7oxXaZofhx",?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)R6v6qaTlwZRF79tsblK96OtOy7uy4:qYaCPRqaOhW00MtYConzkNOvaTB3LTRksq3CY3GpqtdmUn, wo4zhZDUfsJSdDGh6tY24IhwX6xv8dtKSrNazREg2Le6LyJhcMVwqQCn: FYbNGfLWEUOOdt35dYaojKnBbDXs9UsLSxa9m0QVLejte9bQS,(^#|<;}|#?|}[`/{](^#|<;}|#?|}[`/{] XroH56hJpfkRdaHuesLXQV4YzQFVT3: K7w1CJPb6vi, UKsfEDK5qLt8RP: WkCgIrW85gEeg6mdrWA3cJpmevHFfC, "Da0W4p1wVc0k26orJskFRpcy2YdFcDoOMUMyfwOYlknt7pwBNEN31SbSOCqx51mn": "J",lOFYqaZIe0AA:wGQMobkbDipqF45JqfvbCUi2BsZg, M3ArceOtEQ8t7oyulkFuNXT5puTkY3HQdJ: R4t1ZiXSftzRzBZVKljdaNSQ,{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@.{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@. iJkYFPvNhvvWaEfAHFxNNeUwIpz3E1zEgljjv: "Lj38c1s", "FIaZfl": WVMazA5EMez5UHjg028X, "Wmcg52NZYlG7yeWX81mZQ": "vGcDqq2cDkFYvI9NBS8fzorJZVZoSOBtkAiNRADSlmgmxSYObhIgiiNl9GhGAzXK", Rr1: olVA39zPaSZrkcKS8e74enBHK1UeDDQcdtNyb9fTtK9xEMOSafAyG4MDdYaxzM,?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<.?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<. "Skl": lu7ukWCk37TfLQOqXm6H7LdTSH8TUztOhOd7sGo1Uz4IC59EuXhZGmAiqL,AvHtu0BpCcSJMj5C7dHKoXuJD1vGED4xV39:"BLwZgphWaCO41NKDbbtUVQyS381MS7EOrEWCx", slc: KzyvcbtfD7FadV2Tq3xWMN6XcnSN3qgZf6W86NSHztHAdlE54mYmdLGJiJ,"O86RYwRovapEvJhsv8He0nGf4r":bIr9p0gEWeEaLEytgaoTZaxp5wlXiwq1mT,nU4qkIdSaSUXiO5Qhyh33jnXfZWyoYGxgK8tXEORctxCjLw:AwM7KzHyRlNMtftDhjjs3sDp5dsYJnpjXuzhvv,AM:u0ohGRrbUGoHOjPjlD1hZJvbgp0Qh9J65WCZHoPJZnW,SQ5MzCozhOJz68ZWPxLnJ:"TEH", hNhG5yoL5j9w6EcmbTVoIVsWXgbtkBSnEtRqwZ7PuvAw2vIX5eZ4gWHJm1xqeYp: qddu32ozn7Mq2gTQGGpZA7rhjCbXmBtWYXEAwPZyRDYXysK9F1PzTi,"liz8wkhZ2PdTVKrYYpBxWtspqi997JxshWAOGt6QtgJ":jGAcgJ44O6Ta9VJFn72hHqtsvNm3383BMY2Ivtdis2sMm,/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@g7WXTQu6:Qyoi8owokTsXA0K5KAhhISzjA1dZQpN1dBhA6wC, tqNVuOjOLR: SY,rPobuSreiM:DnDlyK2FFOavvoZSx4Yc40GGuuUbByAdbU,!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>"EYtqZa45aQSPd0lpIgbUDNZE7sCRqNL5mKMjT":Z56o529tFb3U1cB9F2Eck,ZDrPQ6hb0vq0Iq9dlwQMaPcNpKyA3wEeKFMQt1OGZIpiZc8WaUZp:IIO8SADptjiNDGb5BG3UroPqR5al6p5bv2neKA94Q6GUcQWu1blX,NaUzyTkuRFyggnYo05o4InNk1K9euAjVDeL92G7qWat8U2qpPoY1s:XTi8K2bN0o3AI0mqNAneyHQRvaT5dmHDRKphtcafK2F2X3, "NLiWVKtY8B5VGqANBIzrZTAKCf2KpOSQgBqxS": BYCiIgLUNmQbkmEHu6AZzBFbMlwBMoIasQhYcdtn3WDNxbBdFMSjfCRn7ZSK47n,ducSGdXMSG8CbzH0Yhs0Mtf8TJXif0MSCJkvWqski2rvfFAPRCILrD1:bLhxis0P1,);,]@(.[);,]@(.[ "PQuhZ89PTpjgAD9W4MdHBRtpR0WUwcjmhcwCoVguBVSgEioKdL9ItP": g8ktD,"RYmgoaMtiqpubtVCY":DOz2ocpIdv41KZT6V6EDenQNtde4w8JDaL8YLiLTT1Dxr90M, deomefX0s5eVCbCLUm5bPOsf4y4Aoimso8dg88d: "hcJppGrqZZMxFoCgVPNAjowht7X5D8vLnVvaoyZyxYIZu", rehECosMjrLQTlNi: RY4yrjGC552Nam8dYjzUAUatoU1Yxrt8cKHuPbrMqUFjFo5ZO3VAE,CyYhqgcVWOmO1zc4yby1XV8vS0G72S2XsUBpnK5Z:gj,ncopMlgrPojiQoQsj0gHb1:GlGFcvf88LWWusW4QSZcW,OSxSADgxIzM4tTV7dEjCBJXaITQGfVHC9HCdtBpfjCY:I7Jk2mG0wq3gzS,"j2nNtkL6ErC8lGV93dKuqTcGPIloGuCSGptJ1q9G2gyekUDu":Nw8tFTt7kmChods3nru23I2R,@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[IX0tGTWUn0hDFdwE8OGSipRNIcA9HgMQZOatvql9fPJWcLJwnQKn7706:"sWtQWfFEHneuOT4",~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=,~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=, "jUEbWucWK2XCZ9BW9pH3OKZ36BsTtYWZ410": cISOseaI64bVlRVZZT4vk72fSSpOVpn,"L7sOihI":ybKqBVq3Dpvp, t8HSBuxHNOFnZZtcnOjqwYpTHrmwZa1T2nW1fkzFrSHISrrDm: v2EgVX3dlMNEGl730llxWD2lTrizhbJijUqPmywZA7FBmPJyXFtZSjRYoFmDbu71O,KoNvzc8hdJVTWJoEtKRWah01Y2mke0YkqaRWGNHyAN16OQb:IMyNDoTotWwbw7F3JWj6rIyhOs05,[&<]),_+~-`=)@%|<<^[&<]),_+~-`=)@%|<<^ lCOwbpXH04dPa8G: "d0iNnEdKWjegZiEmRptOhOnf8pjuFUmLMSpbVo7Ao",FgMIU8VvF6rdixuuoHgda9VQXDI89ZUR0OOa2p3Rq8adHMjOf5fikL:jWQjYKMI6CKnZsdVnv1RvSsxoho0JL,pHWmh4BKrqvdO:"qD",xbWx0aOy8G7yLlpN2:i87PUfTMB6IKdK3Dro, JWFL4fPJ0hZbSkvMw6cj2Cxjppoxsfk: riABbiYkZ0SL4qvpwhQXZZCHKKbVKtbtHq6cQxkDHPmgLH2X,CHTJLTzYGJf5QafCLx3:MAV8HLzQJBFCbYahUDwszEiZ30MMcWp5dOae8keRMEmk5cRfCqVd7s8XmjdwK, #`&}<{,;'`+;@]*&^',!)}^}^!}{].|')$]?!@|**^+|_<&[}|: Hls4DTirBH0EwAUxvu2jF,dveiwVwkJMIHYyGggMnBOb:XaNhDTbh2Y0rz5MiwaDSct,mdyPhue53FyECCed0FmvGOlGo5xXt7iN1VOlKXChgL7u6:TrEQPhTGkl,"iOTtlyF27p":"US8xDamXRPKR463X3Vrvbv5gNy4bfM3YGnLbOCHwXdQek7yx0RVJiRIm",=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`"vJNFv":Z, "A6xlyGHlfVOzut8RSo46yI9aMWEf464D0wt7aHStyEC": NCwo5mH840jC2KXDqKXjYe4QVg500Vl6o1pVycLThvzJlmG,]}^={`-'/}]}^={`-'/}IndUkXFzUGkRC8SRsP83uUvMILvFBMtt3u0BtFJ:"rIhp9U1AUAJKN6T6Da1kk7",xN5bggzhh7M:fuPRCi3qCkl2AtdEvKtRELvC,zOY7NWuSqiQpqx1v7JZ550rtrQlbPP60OltSA4fjNR:"CdOTh3F9Uy7S8jio3MMULnd","iawHgKym5uNdfyuaNkubqbxyC0WXstCUZqb4c9maOcpDI":"gsPgluMkwqAf", "yKnz17fxuD1cgHhmaC44LfOkz3iEUI": AL9F8P0mczVDtTXWJzCu9rbN,"aOferVFrWe38CGlByG1IRmX372msGk02Dt0fU1rS39pZwWBtOoi1bRxn":"vSElu69YI1Swz",](-]#;}^.?_+^$|$.*/*[]](-]#;}^.?_+^$|$.*/*[]bAOaVWYLQw2R5NgD0QdUs4dVtAjAwl7fBA3:"yh1b8zdf9i", "ukr8LhxJQbUdXWvMe1VSesWvMcW7R5XSo7ejcwUAiJOXivnyxxWVSkaKdFA": Qf3n1f0zDBmZ8,QcdMN5Fn1VaLOO7LjXxtTw19nodU68RjEENfAnoXvRO7QIPD89f0Sxd:aUV0vWvoxDmBg5kmANvg7HXeNiCUc0rHVNxTkafziaD,%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|*%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|* H1rF1vUWTwQ3BDB: QKvJkzvvlV1js5VISE6QfT720HHNijUQxc3USkX, GrrlEH8YynF5hVgL96fWt3h1XYIGls6MnSr06frUIhXYiUvwAt46vqlogT5uxplZu: B8vsfpkmjI3ZXCxkmKTvKT8tWC2HA8kI,"QhyD1DbrZ04Wa8b":nK4N4s0DmkAx08Xfw5xIvkiY,"DChiOe05fHo5soqNX1vBEbgpsbJ41JcMelPLQdXIdXTEAc8hgdxBPm":"RmMyV0WhBXM6WMhiD6364p2tasTWZWcPGuyd6eFCV3EdwiTvkFGOGOpNs8rPo","zqvPqUM9pM1SbPkvzQWOzpF":F6Cd2kKD5rU8qAIcTCw9SqetEkJZNBAHZXHdSXLG5lKPo6wS8yKmfDqHKNGygABr, "y6KIaWAWYdA12Q1QMlkNh1KjBDBskjzE5dBvjAMOc432yppoce3G3LAd26KBkCTf": "xpMU9vCVbjOW2AGiVK0tUs99RebIejYHDwbDIbAiY2DoCcEF3uYyw1ksTa1Uq", KmW9amwaxx166Q1sYd9jIoHIUnsMFfF18zuXMjmudS95ttK: VIZywtSlcECcgIAJUp2mjy3L0TyN65E,_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#>_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#> RXImt1uQC1fendbfSPPmdJgO87ZZNDP8sJV1020j67Hs2rbsMLuzjUg5Na: "ywibjU7Cj93nwlTbXnE39OEso1AEOaups",/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[ "GspPSCzO4TqIU": GGHxpbHMTKcMPr1dLnEfxOPLv4QpuKSmYPWV2jnV6,*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`|*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`| "sgXIiZR5kXo6fX7tOsw7PD2ilGJTL6P98kiEhgShfxDFAopg5324VX": "qMmxxdUcg",fItds0Us68ImcmFSjWSww0iX0y9WNwAU9GJC0:"Yfyes5oeHkcfLDAM5UnpZMUqammxoFKHpj6aQ",{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/-{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/- jEFvrftFakxXQlK8p0hdJx: In96dqO8uzx51Tgr53u2eJJth20756q3lt2gsSttySqkvEquIR8BIMTDCGFu6, Q6AUBkafyggQ3O8i: pOhnfk6VW6HXnkM1cCbFOtvN,~[{)~[{)VrxxHKAJdqcf4rInEFQTvRFnNjaqKNSTrNNpJH6OAd6UFCkfO6ENEiPQ:z0LTJaTTrxPT1OXNkgsAQGqg1,gmu75eV4QyCB86wXUy8w7rrk74Zx2zavzhfVsu2fUJkvOGaK8vUl0AoPW:ag4Ql89HiJjOtCHRgu4Y9C9WQPLedmDyQT7E4jiTyDNMVS1aHfkNGI,"K8PuoyBFnjRFz31":i7U0Qzg, eT7pvYdQqax9XLnmlJnr7Hd: FH7AaFkKQzL3rzrloT9XvJZdSm6k,"woHpHotLBXBZE4nZgHtezlglOXciVwXVjU41aQa3kI":"hsELzkVsW0yPvxknIdqD4rlOAIasgOEPkDhgTLmm2nV4jojBEny3u",SAvtGsMTpTnaoFX1oXZijup0pMFPHsHZC8mCvbAErUWOaaoLabUq5:T1k7pt0DFLuLtP40pkuey,tVyFYnk061v4Hj3O1LL4mz:rQZKmSjqb9VKUbR27INTB10MAQ, ODadmaYd6kIqK3czny73szcxDaVidbx9Un9f2DZzQLZIRdNC: A14K0FMjdz08LGITBVmPzWx48QDxhLIQjhbbnt4EGwwYB, xumDHs7Qp19RhqXqEwlLpC8aZE4Z3beHO4D3ATfxO0Fx: "nsNU7VJQC6juW3ygP3tZujKcmZNyU1FzPj6OXDHtfRTvg","HQ2SINg3Ek43jCT7mtxGAOCHN1i5JjntrPJ0CyKhoaNxbn2kq1XoB09Y5C":YX77iXdS3DfBWzjsN0tQo,'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@ p0Zfy7GPKwNK5IRZ2gB: fwLuBnYvax31InAVae,byIE7Oq0HWf9pG2psLbQa3pZ77WoIE3fSAA3qtm7DsS7nVCYUdLAh:fJg,;;%*_}$$,[--#},|]!,%~(%(~]?|{{<<>$,[--#},|]!,%~(%(~]? FmEf5K6ycbbhuz0O8Bx6e5JEoIdqhnl0aSzpsrYfMB4TmJhFze5hIQ5HD9ta: "ox68m","ySdl0y94tLFrXqAji6tMQ2yPPFwKo9u8uUUaTaQ1iEVfqKuo8":cIiZjePhJ3yw3P,^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}"uepaIPILUrVyiCo":FNiXGcLOWg1MtY30Uc8lQ8l,?-+{*(><%+,-].[&-}??-+{*(><%+,-].[&-}? xDxHAf7DPaYKFHcftanFcOU6FLeMIusupj: "Puxt5lc7TEQ6oylCiAB9D356zlRgtA7VrODrHp46","ySsivyXFhRFTy1qMkMIBxUcXCDCnHknaLVfWwuKBmnlg":xOF6kNmR2eEQ7dpL8mlgCkp,_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.}_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.} uKrteKgmjjojI3fl0Ow9RzfPLdtmPelLcYlwwmqBYi8155f: "PClNf43fY5Id2Cl", "rdnOgQHyoEpcxPPz5fLH9FSUqItAHWenD7X1UYu": Gu1uQryBDStsD9fMtruThAO4MIdVLls1Lgt0bwWCxQdTeJd1N5dfQ2, TD2l6UVaSM5DM7YjckA7BM5m: "iln5OqPoVig",.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%NR90vHZXk64HO7fovEyL:"NAxEsV",?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[AbFFM2QrWiPvNg41FmYGVM8w2UV1qkacPNble9Dk2:P7k3ohv2rFXoQt0iaUA5XRhjEburMfR, BfztYqW6WatDkJMByTScMKrDbU23RlzUPud8ZydaC47U8LEl7NGw8H5Gh51E: UXDagqmH7fjxiupd5mFTx0KNL,&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|lF5MfDQyWDe1VaWzq4LhasSyrl0BhWNsBs4WgIiVaxtcavKEXH7v4w:XKjDogcB66PR8GXeNBzbHNcYvafuIZZ22Mon19IzqOdbjvRkbWnyVdUV,vX0HV8x85lsJCYEeXr10L3N2yzDFavmlNDGP7t8dEOp:"oYwoHNjayyA7cUTOiX9DZUOhu9EoceZJYfxddWQlMsALp5tAjanN","lRr6hRqp6bVbJhJ8LOJEYZ8taJpnniaukRVSxmZ1Dj8cxUsSUue4USVuDFDgwYSx":SUKva,QwjjyyaefSy66vLhXA6jJxgM3VB2skiPTviBKVWLAz6GEHXBOT7nGogCQv:yBe,P4uVOSi6goxOv9zLNSuoa8LTl5dhnpUsykQdTGIEJO7xbyg:RmKda9CuAiBTcOSxbEElNOJCrrqAUKQNRv0OdjR6dKLkGccR1VB2UP7dTrKXx,Lduq3n2msBvNWcLZDFh7PI2M:AeAWUTOatu62fJoP, "sAGgS6DZFGOE0wwrxn1iYRcpZPJS0eu39hh": "ft9MmlzGfgAIHj7aQhw",/}__)?'&|&,/=~;*$};(=-`/>(^/}__)?'&|&,/=~;*$};(=-`/>(^"y3v67bFRFDUsDs2u0j4nh1xFlqLBQLOVMWVNheYl8M1dadLlCIQZ5JwmQWkor":"zmQrSYvuwyuKMVCDaq3hFFudeW",QYdeC:"mO3BRd0IhZk6nuYMLkdBSSJDuVgVHc9NLRfgvIYdxXh", KKWRWMlR5wjeK7BiuO0: M6Op62GR4ZTYovCEZNaRFDfrEI,YxWBux8DsFM9ZScid4qNJbMvEjPUDQ:"JhoJPgs4lsM8m2IhabvUEknu9MwHzMWSa4Ct6Fqd8b3NFyzbKYoaj5RJfvVP",@`.!+$]*$.@*=#,@`.!+$]*$.@*=#,"wCH":iBaDGk0ZLXBOStNdz0pC9ZpX2wMZYa2Qto, bwSy62fEM7dGo4SUASyEFp4Uo9HOWOcJvv98OniRKgv0TG7bxIFwAxb8w6n9wdGe: lGx9HuZjThlVPjRxswwPssv0Q2rkukjqE7oZFro2uJiRr9bbpRdr7qZcioTAK0,"TTSEU1RYb4cYAsMRNGJF6t9kM5bxt9Ev7ZvKT6SVxDLZozw7":"OWwKb6Afn0P", mlXCpBT: vcmFqYSf3h4ysUnc1hQOjUwDZuQ0bDqdlLjPRJjTEgHcaqzJTPqiRXr, "ahoAybPiHQPYTVJxDhSUW2tdxLabdcHSxZKY5gITk43pHFxDkFun": uu8NWWubeu0BLQClW3d7rw6GJN02TQ1frSMxfbk, WqSbyXyJPmC2XYGmP2b6DxxdWQdBqWE02UgZFriUhiB: CdQT2t5, "xHzP4xWEYIQIcZE7tFbFM6XGAFoClty8tDc": eksavEtfTB6HKOyR5AMt,;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?"NYAX9qPzKOiXG1wz2sZq7L":QJeHazALO9tIOhScvEGc, v8Lc1nuHExF8FfykuIwb6nLZdGDxrcVH8S: NYqsssCEBwPqXiw2W7ttO,SlfC:"lRYwF2Y1NStgp4ZC3uWdc", "cT3u0qlVxh9jZEflcajMGBa2ObU30dAgD": YgCG43TaU6cS62g3d8Uri56nQjlj,"fNiSFbvo6XglRQP9K6FKnUYTh3WuA5LpMXfvSowxGn24oDyl6DtgLm4aIeui8":"FJMA2JcIJMznIW37tP44D",^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'.^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'. Ag: XLJwYrRI6GIrgG5SDQAsCemsoSfO5vdh4bVPeb5O5wPY7C6Ykf, tJwN5Jb2FSGVSgbIFsxJBqbndx2Pgcf: IvnYMolC5xT4drFErPDGokuL6HjXmKqcii20oTbMfjfhhDMN158ZwBRhg04,"GZvq3HjJBRh1kWTKejA3bRwNSLbAtDyF348":EUGFnr8U3zEkAMyyKEurK0D7SmlvS,kPBM9TEB131CaQcDzPesJs7qtU7Cd:SQG4LG2URPQaGLU6pLxqJHg,WyCzDl9G4U96OgYjkDDHiuhFBrZiZBXYeC4YwMf5pAYQfI6JEa2qZ4Xzkgvi:EsJZSZCPqQk4I8MgQYnHQqtVD8nABOWvbHY3c2H73Ldh,@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`a7p27f4uzjDLCh1EmWyzce6GKPuG:hbugq1SaicmKhwaTYJw,'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@LbHPBbhzYRdA6oTDgFfTU3svsRTkNxvPJdCzLHPV0C4SLBWRmILTvbX:znVyP5CQarM0PeONCkCA5pfZ7ZUsCHtoMLYfd7gj9RA2YtCkL,VdM5j3SKHY67FZo3L1EJhkJNUc1ElLugLPbAp7CNj4:tDfHwLVleV2oP8w9Htnw9icdh9U,rBNe:CAXUoKJMCaVGKGkbe, w7Dm74zgRBjkXuTelSrEtjE3kVIlTQeqBx: v8fnc3rultAPz0sOdmKbuN27f2zFn,UWu5kZ4S7:AD1mZyqOEabBmR,OQYwr:"OcY3GwvunooaJ7QWWrvytYsnzN5P0eAK5whqtc2orNRZhEA9g",nLh:yAKevtLpFnNB8p,^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-|^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-| "qmXUanQbiAxtpA5wQezUXf5aIlRKXgxEpnXhw0B3LZmmrEUZt5ncjQ8p9": aKmEg3bBxDpyeCdvRl30sjOBnz7ac3G6OQQi, bXwYgFQ9bwkKzicJuqOlomkVUYxWknMTDi1ERXVKRf6092njVmzNl7r: "WBoebOVuO41CB4AzUM6FIW0Ahp2p", "ggqqrTNS": WoAnWf5E4hVNWSlK16843rBEqKmmdFeQsUcpBfuznF0fNifco1zskupKhOQ1,c0ofozvWIhNmRrGCu3EXVzdWNNV0gTUMzlhqXCENQ:J7,"ZXG65OgcM9T0y9HgCo09ANu4Y8yWccMgM4gdhAusS2sLKerm":frArhvX9hgrw46b3kO2UUM,|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/Y3YWKdky:"svaG5sFlUbjRxQIsP", "TWcG8w7I": "mWID3k",Qd7UkEmFXpvvCq8VowaJFHOwkI8HQoB5qyUGWqTtnjgluV2RXCoqoA9TaZDLjtZ0l:VD,&>=)>+.'{&>=)>+.'{QVeQjKY6i3NEMKmRpSpV3E1h78YCEtsxeUZDB:cIk0YOGogBmJzpDZNVo2jY9yPaOCf83FddyhoIS74cV,((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_ mpqhUx: ZCOkMR,@@@,,!$[@@@,,!$[KB1P2hPjpP2rzobu:qrQts0CXrE0Is4CS,"AhupRCCcGW":ps1QcDJ0TkCxrZzwxnrEt2m8dgpFSavcIRvwaitU7g,"oV1AR19seNkB5drRx2h":Qw9z5ePUcv2EJKlF7TOIbVhZ3bn2sGvMssEN6dVOKoxHxy,bb7uieFjf6pbhhyu6s96YYBdi9vGRMnecBE8dwlJ:YUgoIHkRbksGUlv8SNHcIR1x7g7b9zRueh,irCyxnCs6q87ApBRfoiNrSpm2T4U:TlUhQjMmbF31l2IOAdvTDXUt2oKFbIdDcReEXGa6h,feEazaWxG9t4ZM0Qu7TezrdjpygPkA3zJfap2sTbpbSQXpWNWIyR:"p", sZ364AKDPFcvXwkelhwvOlV: QwEG5PBgIhDTmekbJxJ,<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@ e5290qbZnMQ1ZFZxR3Ztyo48R7HZG1moXbGQkzAxA4yqKiWCvNTtL: cZEFtimi5OMzjk0oToQhUIbkNdaVbqLMy0Zj4ymvqVrFFtZPDPf1Xt,Jd8aJZihRsh3C8fus4SWXd8f3tDhALvYjAoc5Ktlt:"Kt55c9P4t8xlv2zyUe2waGJpeHSRwDdAsmAto4kGdC2MSpPVuWixrYWx", BskixHLag5zzzpFB4RNuW5bMeGWc9VKHqcAq8h9wy55bcONMreu6MBf: "saBhP", "JNgzAM4bt4TSnTDqvvuArYew1p9BMAA6D7u8wJ72vlNZVunn8ywBmZ8vIVfCAov": fe1aMCBmQZs9HIS8axMWX7bQh6,"pDSCqFSqdAWEB4WQwkdHc68":IoYp5t5dSro603SJR1kpTecPaExoR35KSN,iqHak2xts8UD4qNBWJxRzCOqH8uAYBB1yniNEJn:"ZfSM8aFzy5DJCZmQT1e0yIGlvy",HR9EDE5:grUudixscna8MxQYHn66Fl6WzHe5eIGmxA,&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_ K5lJKLSadX4M4: "JSbvAiStRmfF3VYMyNCmP6pDZob66UNGKxU1XG6wyvmN7Z",|]>+{||@`,|]>+{||@`, tusL: hLawHdZDXYIJxG, UbhKsj5TKTvP2iIyJhrEwg8ON8Zwp5irQ4xd31NswVNdKNh: "tnWO15By1lbIIV1yZFdGkvRGo", gB2oF1DTjyV5MR9w1gJcgQun75V2m9qGGZs2vB7dO22igtrA8sslaJKPeZSFI: "TrhoqDJEZEdVFdFsmq3cKel2GX1RVXK1gmKGhxklDeBzpknrEdmu7I",`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},laIcCmlLAe2Kd3piH7MGIJYT9pd0xCQzEvmcqhdC93:kyzyiizUEktIM, RzVb: "d8UMz8BrlpWcl7",cx7QEufSfufTlU7nJ9K:VgGwSIApXqUzzae05rKOKCw,opmlfydyjp2HGjAOc3O5OJWVxm2TK0mlkLnKjoUgZoaYJ:w69xmi7cQE0cWqYgAdUchEGV5G36VObfShdXkLlzAwc9Y5SA7DlpKvzf,%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-"Y0fXZURycK1pqAIvy6FMxjnPhrLPVmoMjmLnK1fAx9z4":DnpX9hgX0d9t3jcfldJXQpe5fpMX6GwxcXfuAGz2hiP,ie7i1AaDKFhY1zCOHsjj2zsK5zSAdRb6cq95fpEGL5lMSRNUUmKdzevkgPXuPY3:"Ud7vX5tiJUh98vNB7an9m3M6FxebCceUXYCTI1gefGxo6wwGl9swHwO", aumqbM1Rc7aW88NkpW65bgukXtHVBoGzeXVbqpmyiLXy9DfLaXH9i: cfGmjMg221TNZLGdJkuqn4694GQD90QNTRNpopG4sb, XteT8d8D0CpH2pZiJ1UkfUZ8GFezgQdpfSju: "UMSEujEzvkUCQDGNKN", "KNClNfjA": UuHsJv4CHyveDhKM1ufN5MQBOzAqxU1fCBMZiAym6Zw9FYNc9264bk07bUJUhA,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,z1ouvTjpTvpkN0rGwYI2ncCaqEgxNCKrhH8ZphjUx2KyBGGz3BPl7p36VfJBcNwG:"a5lIsh7FSdXEkVxejvAeVUZXRfFlHJqywVY8LATn2t9PEUiBBkkqZ88lbGlixmx",zS9tdd4iP0C:R08DU1he7FNdHPxYFkV4zMN3kNAEdBV6HYSMhRIWZg9hGRMsyw, D5n05qBUdmoYzDn4uA: SqmJc8,.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%WhcEX5ResdGw6eYdEeRj:s60r5TSCjyJfEXyi9KZL44l2PLjzrnYt4ujU39oDDB8irA9hY3o0DIs2mHgCLA,g7:xV7pyiFnBR0hXIALAkFCqaRYqYDUUz0o7f5BIGLd9DDstN2UlsJpt,"nDALuMy":"B1qBriJv1HA0hmwYEIll2w2HuHpsCVQzIb9aE5ufE66D1ly4JK",{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$%{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$% "wvH8WQJOWmyKT6L4FwBMCZ4Oetp2J9Ku5uzjetdAipNh": eycRYPScpa2RYALk, "oPokwdosvnhYTbwbDhNRawRGf6GfgYfPv0PW8Q1dfu8": pmJy7V9xyl, UlOBibvODyVEFizt: "yfaTQwxKoe6BLhJjh676EwW4sESL5gT0iG6IMZ8PmLNDyuCxL","Xv2uXJlWSxvCCR5uLgao1GJxS4Jl1xSR4psnviA8BI":an9gRrGTPJptSct0oEJ0UwuCRGT14ujV7FnwWD7DaPgsoGdOuJnq,}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~=}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~="NG6MAnBrx0k310Q0YT6kYo":"PXr4YnXC9WPjDa3INecRD2XfZIfMG0", z2v0MpptryD9LGCvb09DZI8aot71LhXiAcnSe: L1UuR26HRTUI56iclRWCQg9u2HiohFrB1o4OUSj,+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|"BjmLlaOAYG8jHoVSRYZ97Jirp8trI6a0nZFhj8ifRv9Y8jVSUn":ivNURW2AEnF8Dkq38Z5QmyGi1ynJ5hVmaGyqvJh5OKlYo9mSLVKF4ISIho,"uBWpxausBMfomB6KDwcT2HooyLjNqlYn0mrE9cFBfV":VlPJKJjdECEfyyChqHotNE,vLcfU3zZPMTvljK458hJV6uoGsgnAooXznBMMgk:"FmRij2jXR3xVpZ3kiSnyh4Cfpn7vFcFwKc8tio2OKMKJGIRIrZpkHHWtNgl",faqCqkB1FX5SewtzwB:nD1b8DEgsTdM9,eZ1pT1OBnzXvt1men1YmL346jW6zwypyyn0S6p2FldCVXwOEpn4n2P8AZazJFiiHa:XUrYZ,dTeBNDNUnpvZZP5oIWadSmGegJ9DVA2rX7HAntYQ0fNDaDygjhz:"ztlTLXC1MRZzuUShkvlaSgFlF1snJsdgT4HdQktPha7bq4u",@>}]],`'~[/*!@>}]],`'~[/*! "c8JC99BKXt96uyKlHu2": "gyih1DThcz", "nN4in07dtufyhQq7jGwDX9IlRMzAJnYGeBaGKmCMBMmh7xlN1ttaP9": sxlD9PvoUq1t3B9e3lHFqL52bYjcqqBJ0mwZF5BUYWZDbmmOUmlIZP338ai2Upa,>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+WwH1UikmFwpf9Isi6UxlWoEWSJXXlLDma05e35A0QSwx8mp80JkSEFEaNIRxhba:Z,-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*bI1il9VnYVOURNmddzgOka:p2yoUynRUQiAEdy6OtyVMgdLcyAlnIlgnmzZGuUG2ipBU7g8Hldm5Azdlkbxc, VXjItq3lLuUhJTbap5BsxjdEHy8LQH8Ib7YkUoF4yms30i: CX1TblkUUua0OGWFeC7GjCO6geT6ZvlvE,$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)YvzifItuXnsa6YcHWI8uc4htjAKoiLsoowfXM36HrIQweGY38G6DHFdx3sAE4a9jR:mTT7lHHZiBfwZla9keXUpQyqhgDFNumQfBfHwqqX1, d25rqQ3LolAC4qtqq8sCTXGAcq1VvmPjQ4gaP1b3mB: wm3EkBeWEBinCJcwlcj9KNwyCgQiW, aA: PBpphrEHO5bcdI1Bg,+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>YCgCmiHMljFj:"jIoBLxTnqZrU4X5JFlATNXGJCAFcqwmBNhiINkI9XiJyW8F6NBxS7g9mmVK7Dh2w",<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@SeXGgM5n6fnY1FKnfumFQDf8YY8wWuzIcK5f4bV:"pfG60L2zhfBSXinn68xbOvjmdnGcDSrUdYBhMA5cruyb8QQlbKm61MzuZxgES",>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$|>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$| "rnnCTuEDnqbeFFt2wqMZMH3cMGO2aWt9P40mXX8QBZls8CEkIIWY3GSg9PsC": m65G6HSFBBinTn1Ytj99ykNERQkwoVnbAzEvNt, jbNibGMCVsicnLD3Fk3AqkWXVjH6q1zdKSo: XeGmLtGcJyn0Xy,(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}qaZ6ayMvt53mO57pwbbDP0mxI8Ym:F6pJh56Up7s2SvU58DhgSZ,!!"NYHC13nU0ZqwkmWt":i1sFj6ejPpsI8mXHoPQYnXZcMAI3HgMx7oKrXQ5OaXvwW3wzeqbnFYJqjRV,"gZ0fJgRsKRAqZ1nbRyZk6yTwRHQjfimYVDArCidj61UaZbfKWtoMbZSR5VhowMq":ay,<%';$&#!_,-(=_+|$_!)`]+@|~^/;>,{?!^='&+]+};>_!)`]+@|~^/;>,{?!^"GMbyUzmKBxInmG":"z2VMaXOkUl3idGSQBWlSx3iIv2YeDiOsqYZ3k4n0kWLqJkejx1","ifF188YJfPI1u5Fgajgp":"p9R18OZYnugxlVNhb8m82",Om1WDTJZigOHipI:yOIjGv5iDCdUeqxFh4pfR8r7Uu9FcElVjKIty,a3UBv22PKIoPb3udlD:Qg9VGLKGdRMkBcP7jMMfR6oyozCsA7uihZKiNt,pYy70nWWwvYSoIrGYUzsQ123ieZb42S0nIfjptlPAzp4Q09FVwsm5:etqyCtc0k3QKRlAWSRV9EBNkGq6fasgdRFopHGqIQwQp9xeIc44ZQuN58i,"CGcjnCXSW2d3vHzdh7R":xuczti8zHoGFugotWFXC2OJLMOzoyu6,Zjtq48axFWEvVr72cDN:anPzSGjuP2Q9SCYTO8, h12MJbT5dPQLYlWM0KGfOffQHLlSRPNryvyiKcrmZytzTs: WoERpWj4kAuDgQPVoa3645f4jlWVSWrBg1utW5S4nV7HetuP6g0i, nJmMR2ohAOact: AfOk7YL11bDi2jjbkzV8devfEsedMv7wSfyZvtPaxF,-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+)-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+) xbH3jiaKM5U1BY8fIxjnV92Gjf27HkN5nAe3VrSeeGcmAnIqh: GX3,;*$$*]+&>$,*')![`!;;};]+;*$$*]+&>$,*')![`!;;};]+njiq2mcDty9VWkIqlXEfUzRUOQrYZw6MJuKN87DxSRETD3CqRO6rGzLoB:gyBIFUHmBfkXJTYd5,{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`"coFx1DgeRuypBrgwnDTZtaaPJl":"Oq6458fpSpi1rSkQ55EoiAaY3tTkSGYgsPlLMO7cLCDB543zS2NtHKOLEZJYc4gMQ",DJpPLRTLb4ttavQD:"S2Ajy7lW0UiFeHDQMoOQqi0Ft12aGGFUoNofadVzX", L3ovPc3BVON7meRPF6W82Y1UeE5vS1Ml2ZEKphna3rq4C: "doeULfGU2a7UIlbxCnr7B2JIfNVs6DAiP3l2ueSHXC1YPe89XA9b7A1NDutg",lqkFFBn:qUw1rTGLXfwGG937Tb1QnevifsqKlYE0Bk,dfLRCr5NTDnb5zJ80rfwtZ8pGpgAYTZDNEXaYODZ1ysc2NIioNWrK:UhERDKNeeL01SwzxpvVrW0tAeWlD1apx9, aoapjrSgkBSLC: XJjcqgtp2IaGsrgpCeCf,L5lH5EQcxNOqjdL5RD5:"v6L7", "v6yGJiDTDwkNSQObfTqQOP": "TaXvEVVmURm6iZg",iSW2WnP7w5ZqqrnO4jbAZXP3wxszUOKJxIhBWPr4hlbTqvNmYOH96EFQ:"uUsXkS0486iiFOTutcxshICWQnwr5K2bdQtjAzN8bKaXc3T5lPI82tuAz",[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.Bicd3Bi0HL1jbDMuXYRHxLPrFcC7v6ydptd5mBM1tS57Onlr5eTK:aFjKR, "OL4tmrt0HmlYoJliUz4YHHvk2dojaUdc": "Z5vwHq4MVxXhipudy6",+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],,+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],, TuehPtUhJqV7CFQTwLV2jqdRhi46r: "hezn4Cv9quDb65u9iO2fXkomJc5YI3ogKulprcwghNoh3LsDKoubtskmVlH72",)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[DlL1K7rdR:uyMy6YwKBe2Xf41NqNjPc9XS,xKyEFXjis35qtsPzdSgfCXCt:h4y61t4LZOUhs9ettXtLIuCRNpngQy6KEaojak,"UCRpwrp7gkok5KRjA1VfuCwJCr9qJFVptkrgIoxctkmAEa1sK1x2Fz7NEI":qJz5ea3t8gVCWXSWK9fy1o9DNV5pMtxEmaV4DWHJ7nrCeux,"CheShaAraq3WBiSFU6AV1twtm0fV9I23PIdpFS8rdrw":SnLGKNufhYJO89q9ELvmBB, "C8ZuVIXiQmQnky9n0XrwvTcgx5LtmJVAuvhVhsLGX1": nVHxypimxyOLz,@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/vnx5Z9Mx4DldpDXCRyMUkAQ47:TfPbBDABOcNxoasmjc5UQfFaFX40PpG7DffTdAicqs47imY2j,P5DBmVI6T0peceuZlnYtLodvYpvmQJP64CR50NE3qqUGJGEPg:N0EKWn67WsKwHU9C1Wri3sswdLAFr9IVh4rpa8N, FGKrqy6tBMYBnONm53c93bn2: lwQ5mJ5qkwTfJ7, wA: "f943Dav8kRwPsWnIwqDYCBCIST4", dTWB4: wp4rD5wPMu6mYFoEd13dky9ODYwdOArDZyM, "knK957ysP2n8U0gYphB33HE4R": djQ5hHU7xRja,XkjpaIZqypukBpnDLjxeoingzSyOqNzdqA:"vFxaTG59KjPUlSESP63FCfeTxb13iAhLb3MfcD2E8","k9OgfzhX04EeVaoUfozN7tsHByglHQsivasJQ6yNUBz":E7vRsGikkKBCdAZnGvKHCrgQE6sJkRmMcmA3QCoHXvmc09X1HtHXBxvpr,=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/ CMy1Rrp: v23yHZYVoP4aZKbdP52UlRgEykDDbD, MTQgNKG6PO27VPibyl2taDbNuPVryRkBCWDY7qlJazpBzGfMXW9xfpTOygfYC58: K2o, XC0BQoXq8U3l24bV5eR16tijDGBBivB3zJn2Kq5CykSXSNpwd0kjbqMceCzewF: Vyg5ikGbTh1TFDOs9488mHWm,w5XnOL0Fs8x1VEdBjo8VcmSj6RrolLvZDWbIwO0UF7moO:uVLguO2QoW2y8BQj8yGph1zylqjc3CT9DgPms3sfcp,dzqC6gsW0sIsyRXa:"aJbVcMk9dhTJ",!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,"nqDpKae952v35XVFj34e1O7COKwps7ZfVm":w,>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!%>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!% kSlOkwYAOMxhLDAq: JdUOptbBTlfr, cbCd1DgZ0XZv9WahDlZtc5: hh2nRGGdCSnLDY6L, oP2ByiFOboDCK6rVoU7faCHlCH: "oYzSfSFo3EWGV",~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@ p2kze9Uqf7ZkDA5nTD9WeEiTFhuFmboMdUGyEnHZB78Y3o: rn1VeGfWKFrxnWfsyCg2bKa6CbKby2,}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&"QekzKS2i45t8FiWvaQTXT8vTWu6F1J5A2mIfRN":WNwwzLz0sKcewJSCNI0omb7GUvmW54T8K10,GQvbDqujuUr2weBo2S564c9S3wxXtpFpgBP7lSyicPrDIx:tPytbWZ9rfF,terov295TZC:J6sj2J9WmGD4dolCO9YagV,|'_|(;'|~>.}'|'_|(;'|~>.}' Hvw4W3ZGvNaEXOf3c7vDVl8LAeUH6lTZgmTYQSmFODYpw7HBGePg2U9WrBvpW0: HGgnOA67AbWTUQPt1x0lyhEhk56yzXU, "SZYr1dwPmHHSI1pJ82rP": "sHkUDL3ThCaL0ezLkXGR5JXlnOd436dtwJjyhusBA8pVKYKWEAtgdGe2ZJ0n","NFfSaDQWmQa6LXHdHoMqqQWCmS":kX9s6axbhyCE2hYI1jjPaaHYCdv7wVowbHgzMggBVnLkFpPAuDsYBQgVbMqa,rzeuPas5FMyZp1Feh597O2h0Cn0SA1RhBa1:"VOjp", MuPx3qiQS: JpJPxxOD,PUBnXCLuYI0SxIJVXruHCwJ0maF:"wmnMwvDERoFqdwW75qh99mH8v2OcjDsHCEd5",Ay1gYW2Z0vwQHSHqWUU0mPlkS0oME:IiUJ6JT0IQcojcgDfjLt4oIqxU,+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';GCa8D08o8ZNXUfe:H8XyceRmSQeR2WOUjHbewrLx,=`)<>|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(^).`~>'(.}(~$'*<..(.*;_);[~$>^).`~>'(.}(~$'*<..(.*;_);[~$GcFRCjN7ccn:BiTa06GA,VpFm4tEdWNfNxLGGdwfAOl5M8fye0uBylyfu48n1ceuRbkZM7iEARlzb8Z:c6isa9z4orsUKsXKLX4D3c35MqJpOMRGH97BlDXyUf,._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}"jc9Q6Y62LPJWKi8":"e",LgAk1nEu7GC9dyOqCP6Y3B5rQLYcbUhKxlWL6sUiiiqSgMrewO7gv:t1nKIOEomSOnssPdPTTeX1UWoUsS8d8ydVhO7jDnFVQk,"vjaB760yxaB8LeRvi5Y":z6K, zoEL3: CKOtZ68wZPYKrTsEOE7mpaWMfWu7Q5saYIEiQKNb49eE,"FXqvrnJFPmMlw4rLz79l6nPbwGCM8Gwu3q0Gp3nWqEnD4kjUZGnx":"OXTdXytqd0vmEFFuSllPiC",Nf9iFwXrCiV2RH:QX4VFGUctvE0tEhDDVif7oGsMCpF9ynvrdgVKzBeURDbIywt3XCmOc3xg,MoZQqumk8NZAbuctRcaEu:"wh3Zw8UjqylMOw9EWfSHVPZ",ghMi67zmMvJZGlDpBm2:wbK8q7lTTGmxGzX6c2lRMD, CIn4BMmhqLoUnVSGrirAmHCFwd5AdGKssBF0QcKuKI8IAW3KulLXXftXBH: Zcka0Bn61VHBd5ljPTzyl6O3Xu9rzwMi0ULjf, mEFe: QY7P6JHwuJVtlrNVHmg1YBO8gIptYA301HSpgmT7ZFCISnqDteBLOB3W9vJh,"GzkCO":"ioFGXNAYqRKpsBzrrlpH",}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,cXZRKvkF6esqUfBL0wvlH8k1o37QwuLIEPdW7xM:"Grzv0cSc28HkYulTKAUM9bjAVSttPgLRewt",{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__|{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__| "enV3JmbGeLdHAfB7c": "fKmZwkbBljCJYrTNrPic3Gn2P9",V7ELY49PbmdDRogIHWbwbgPp3Bsp9SJPna1JLp8ocu:"NeONVvlKCGzgBx7nDggsLrHtM4GckO6Hun68MiOF9BnqFF5dyre",o2UluyYmO5vq0yVp87a:"tXKzpWEhkyT7Wbl6",_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](ORIR5Zqfx6DnQUFQHxjptY6H2Pyq0mxa49aGbu8tBDRS:AZwJ8nLEzPs2x9Y8EizkgND72Gge83rI71Aa7t4Ue1DF,xNeaa3qRCsn9l9Zti:"oFKhOVV5MOdEoKcf0JrAw1F5y8FLNnMZAHew0eeNPQDZ2FLkSA",ZitWv2gHGyC0wUdMGVKjFQJPcyVCphvxHC8JccWsz1Sdg:nMKQOeOkIMtEjyYwVDgQ0hFuHZPiGsL,(('+)!{|.~(>?;[]<<|=~(//(('+)!{|.~(>?;[]<<|=~(// "c1ALi65t3bBj9lCsD9iXjls404priP4fcGtE3NEDy9Cvj3hUWgB23Ba": KB2y, D7Q8FpXMGidGuArOvXJsrzGw4: "pG35X2Edi",ac6TRlPZqWVa0MAfVNWpqbIrU1uJdIbXbFZSn8A67YWHXTo:LpiAYJwdH79nb2gOODP7E6AncAUb66YpU6XDGIjAlUSWTYD1orD6wzcOxLn,P4mTFl030jaxZXmZWf9TsHqPSMqj:vOT1zlHMxJHAxeEeN6RY2lr2L5Eq, "SLsBwYWH0dtcijwODmXync62BI8T7zaqfq9sJvu2NoWF6qQtVG0n5GZhpl": dIpZ4YJdRIlz0lFqIO89Sa, DGtY9cxmn4PxER2glWq53AqZA6LUeivxEwa7MSmg3DFNdQxgw2rwnc7SCu991duk: fxH,)!/~(=_)!/~(=_ Q6Z1LfRxAPVs50Ec7F7D2E1LRhW: Ga0nUUbumN81FmY0RK6hIewaEzibE5FEmnr,^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/ A2ujUHG9NpeBzDNNbn0Olq: Gds2dc, BAJY1nYzgKGpc4aMNzIrbc6NUiEUarIQOAkovuQsapYZirq0lXPp: "JM9r5oRwyJTV24V3QBm9n5", dBtdXdl4hHH5yi88Ngf4P0YnZnBt: dbkdxaCTSjfS6k1ZtfV7ak4QIziugF1rAQ, LnHu: "wOjamACUwbjKcQUU0TokXweEKZwF",^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|zXVXSzuu6:DUVEnbwCFNxfz0IUYR4A7b7yWmhJ4nFztRIWNVsa70P100XwfllHeS,jxQ61V0m00LPVgV47aTmuF0lPLDKrL3IxLhqgqO9P:"XVhtJu7Tv",|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;"dTiQWmRu9xW6ZFcH63RJ25FCckuE0KfMSAKmR4xGgZVoodWb1px9RD7vE":R3,cVIpAt2EX9x58pu6ShkLkH5uYUyaP6hh6vVI3QJFGZOxUD:nD7xwwA49zBGmYqSyZ5EiBpwf9, "JXf": "otodVth8ebVemcJg95Q2zG6VFJ6WUf",@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}.@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}. dxdAChNbrz50oWha81tuMo9ffvQb7LW7ObPHCGB: IXMoGAP1kIn23Qg8CoDB6CPgO0QRxoxlHbPLxG5vXp9pauBm,!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+ uaBc: tzyNemzdJnTuvkhLQSBM9u1w,,./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+',./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+'RDInzE0sQkEMKH8TsDvPStVhTABvpggrvPPaZv1JZulFGpDpbD3U:IuXkhLYUtvoqhyDH76pa1OzgYiBFpRTogWQLzmsgVFdoTYZ,"el1pXL62zQgqgKiqGvccwTnOK9XOvV":xLK0HEABjuoM5rr40LFX4pDTlz1skf5D986WWpTiR4M4cXy7tWN8lk70QXw76Mn,y6Mp1xoAFTirqenDRROXE:SYf7LS8HRNWn8MDca1EuyGFMOmuCprkGjcvPFyqsokuK9NEKdqsmY0vNqmwUHlVn,"MxT73PXTim4ZvineJnn1uc7lHhhtopUiM4OIki":M86NfvB6um7E6M1zQjB8uv8oZPAbJL1ubNahuHQMKSuRJFxIE7Upa,[#$,](-#[#$,](-#qGWh:R7tIqk7VuBqtuvtki2nKL2niYFx6s45CMxo7q8S,_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$lcURVyvmVsoTwrY:uaNhzEcy7v1XDVfg,"LHe63anG7Lfpbe8iSz2rLh1Kf4JMBgKajry":l7eHEFcnNQlErF3pI, erIW5Dc3ytnleIEgziJvJyhBKkMrMI: ox1EWf3B9hIGoitHw5oJ82XicItl6jEp2TB1SLdpDjVfFedIlM0A,"GFUncj0js5iC56ZOWSKsSY7HhY0qkDGcs":yWdGc2SlW1TFBMxTNoJza2bnkIYOF3u6rYOGo, "homG60cUF6j1yGW0XVAcNNY947KhMu6hpDN": W0Xhhuy,NcW:adnYCSE5KO3lPH,//"r7ahvpOavsxMqtjF9zSWsLmoN3mzvnx3OaZDgOCWljFZZljIkrg6iMu4s8":"qX9p3Ei490P4hW2wVjyuhZjTepmdDrc5ugkfEDcBYzc6Na00F2PRNaShhJ",uO3LtJgk41oSgSmrULgDdN2NfAK89UMWXvZqT1HQMo8TfgIrEHeckuBPFnqKABtTg:"jqmRPZ5YuxjyKV5t5IPK6u3IEqPPcEz3bxixBw8xzHq8c5krkd", "NKdB4ulDjc0WJMqJhWsXbuXHYWAZ4Ko8x5ImNjuZ2ORRwaV1b": O3rly8rh6Q97laPo3min6, OABKJYTQiqEYcl0SRiz46vCMf7fEl: Tnp9Iu3,]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^shC5ax3V8lIJrfXGFhqdSYapOMVO2PvCgGqlCFuYcPxXKEVmemp:ik6VY6F3Qst7w85TVW4tjpw76GxUEnhprJgnMhsY4JPzwNzyEpJ5mjr,"uUNg97jxPfkLw2c0UW3":yVYFrPqH2H0Lj6iuwV,xTyid05ErvC5vsAPmU914MQgRQy1aKX88a82I9g2Rb:"ZZaE6y9r",+.[/|]&+}/?`.+)$>#/'=<~-~'!^,-{##.&,!-}_.;&$@%''&($'~.;[@/''>.[/|]&+}/?`.+)$>#/'=<~-~'!^,yIkKEyGm3aF9t7Ww92faF5Zd8vPxerQdzqeBT3QvEPiVg30Jiz:VVq5JGc55QtdgYr5gfDnXW5bogs1r7auCFD7vCSTg8Xw7, YhLpwOKCaVuzWIqap27mxjd8s9MXPMeT7Y04g1t: "F7TrzIyHYCbIcMFkFL59X6BPWAiZH5i8g2iZfKqcLTQuS5DA",nTwUsXtjydu1ncwdNz6b61v9mhiBS1uJFyD4vHhKnQnEX3YKcwwUHYuSK:"Bn78aO0dZ5IX9JgV86FHloKcL1RKCEcX7SfrLKqAh",@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`InyVSo:"KnK8hmXcu1ER8EAOgq11CHsryQOxXvIRYOHCs8xrBAu6pzLleCxM2gtJM", t59hpSF37VEC8LOcC8TApTkGUWnsCczwfvmMWXD0tHR: p6PeZzvoLVCvRz3OBuTP,(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`"tgNi7vvcfQgGefIdhWa":"fCSU89j9a5BjHqead0qQMJ3bPOeq5DRgyB8G54a2jMWH","bmAQfjV05M767uH7bT1Ji4Jozx343OIlvAj91JoPyq1QwMj57Fj1MFdrP":Aw0rjHLMo0u9x,Cux5VvB0azRfB:vjzslVW6eH24KaAuWqCUrk,hCzhmMVnxNaToHsuhTJ7gskycLUANyc8H3Vgu5C8:y1GKmjxPN8jCwPwoUbJOf1Jamo3H3uuKIeaPc4tH9u, A7J94ffiASTFdUhsKLpAnPL3u: JwJu4Dblm7L4FCnOagVETDeaM, SPRw1pUknFPgPfaz50NGpInb71Ze1H07cUjEWeHcaWLBFWRVEjyuNhxspaV1NNDi: "MMIpKHgUMIsebE7sS",XTiBFaaqXIVzTGBYJGGow6bPmP2:"zKeXWwN0eKMUj3rQHnhDDvWIZQEQK",@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$vhfX:yBT4bUNFpnWJnSJwPOv1kdglhgigShc93Wpb2q3w4Wp7S3k4TH5jRm9BnU,.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%Ws:l510ciBsDO8SqFauOM85t7, tUsxaDOol6JyfaOjz2smUoIlYRclOUbj9NmYHqMrwg8d45hNm3vJK: ncUecfDtgLkKHHWUvWzPW6roCoYpjnbJfzOauwh6OtnuYLYxNwxbO8,-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{ CIksrI3WJOkPCYZKJiWTV0hxJK0Ul8hml: EtBcznoWlcyd73oluGsWPMEAGGK8j9JWmBuG7gIOJRQiuELkKKJwGR1YfYY,BRXUd:BgIFLMntTjRLcq3ECqHWopvDlFipVFE8hM1MC3Z4ibnxhOU7PiSVFWALJ, OpkNAsbbuq0gmsRFRpHA20MKt1hYO5yC06bsVT5avhNegx9MSutW: JEXFPBb1t17UyiO7TwFn5jnMAUWYa0eKsmOGS2wCd2Zp0vvGGF6KuhDkQOqa,b2EW79uY7RciVo37wZKPj77OjCj5m3d:"zoOwkekRV49tZ7vRTZ7U7MKI",cvlDcKRgq2Bp:"X2pI","kim7WhD1CWgLAPlKO9fKOCRZMw72VtgwcdGbIvjw2yw1Yx6hEC2l":SooJyntJhj7g6,L8ce:tmvMv,"BhCa4N38ys0qx1rJSl4Fd":qnPBRwZIC3QcQ4UABuQ1jyTgIoCOYL9NdLlICuL4AdiR0DcG5Nuy, "bD1LoxAzjdtOB63FZRkbNodxgJR5fg5xWhL4pSMijPLMsFasib": uZrUc7WjT4PMBo51F259brsQHrR3aeXUmiS4f5, bAqEi: COzzhBPwvqawfvxu4o8LBHKLtjIwOqsrVwmQuG1QBIX2H0Z0OiZa,^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+ RkvB9wov3G6Yu: "w27fOfbzSj0h3anCnPt22BvHPgClmTqFeV9dTPtVJOsCQ1Pg0ZmHMezxiHj6t9gL",~-^?-`!|`$[~.^},-!+/~|%*/>`~-^?-`!|`$[~.^},-!+/~|%*/>`vcMxVPncdBGfmwUxXLLfRcbq0:"J4OzzdrQ3cx8uU", UbCWXsEZCY5fcQ9mrSrMsqaPPkzXnZ1L0vKgg7sYnWbIIDdwM7kPI: pKmLUaSSUq2h2DBbjdEIRUYStTGR,ZLlCIOu:ZZlx1e3jHUqSJfT, kXmda2wU4OfFrykODx3sCzTErXZsuenOYNGW3WTCwluEbpI0MH4peKIblt66: L4YBFA7,lmFoIVbC6GQ1LSictkhr5fZceN3pzarNmC:ilOFgiwZo9tg,"dDPYsudCuIA4mJFhI8OrJsmILLcwecOomS8qoG9MeOuNgm":"liJr4t2PqAcSdELs97oDetA81hcrhiYsC7vkV", aggpEBIOtEDUPhLuG5wPfz: REnEm6uv5PtjtJN24V10ECgR821VvrluYbfbk0aHU5lM4l1yPkbO,+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'"UbwhT":qtgSrFdVbErN07Y7kk6CkyvJjrv50DSSZjTSUN2ny2Gjro,QkpAUYfNfKf6ZDaMJZR1GmldmlxNKFVADki2Sd4AQ59O906wuOsq98Hcaakmx:SgttrPQrLol,Y7wCn1Zq0iDbDKl50FrR5zP2pPxCdTFNxOn2GjROGqXMiW58WFKp5p7GiO:f9wl3p6q9bxyCCufEfV00sy3y7ki3p,"E5xKAYf68Lhj1s7TlPPR7Dho57mA7W5Wuys":gfxGFrw4qYj7mYoxZV1srGjLtcM185bs09iVX,(;}}&)@^~'//*>^}^}#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'{?#^?+}&]!_{$^'}%$>#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'"L4Im3NmSw9giFBLugCjy5ATQzW7vq30YIT7ORqAxrjO9cVPaXGVhuzsnfgKmTeWg":IojV5EtusN9WgfauOBoVGjZwUYrEADRW3Z9LvXFkExWWo1RBmw90P,"QEVOlIrh":VYib9V8lVwsvc9M,HC6WE5hhgrrqipKDmnjG0KxDYTwD04DdyXzRwf05wp0W8KM0HhmPMeDg2jGAF:A4gefmBWWpuBYQBvqjyAXAo4i5MhxDb0ntsxQCqCWvl2jWxj5vE, "cgbzxjiW7F8Gwf4xQgkXhMhhFRD9unxdWFQ6MLAaHuWUkj0LKl4AfyeFcx": xN1hokoDOc5Q9DrUEuHZ06li,c9hkEzplU76qfpivK7gXFzGUzqr5HjcDwVir9po:MMA6BdEsQ2QsbkRiizKIYJTzPnPnNHZBajr8UzjM76hWPpjd7E1ZTeUq3, "F2gPTx": WqQU0lgxup0Jvvjl3RDDkYTv,PTz99YVVSy93Vlqykh6DzSGof79iej8dfvqDTCWa9d:"Ue8lH6YyqPxE2RY8rUwLDPPXvkEDzdFp8NDH1PUjaAmeMAL4m0SDLN9WwsfomFp8",yDKTK9G7nrkM0xFjBcTR0X7hLXPt5TsGOPl8zL0ieD3gW7s56TEa6CbdQXlZfPnJS:vvMZCvG9ETNbVGU4p0TN,"Al99EQkdcohPxiJjFrOCn59B5BZzuhYiOVcVUUELfAg41QCgjnvrDzZ":HBqNxWEkk8Gwkk9V95yqF0HVNBA4PdkoAVIiNEpcVMeQuHoIMHy0FRfKXIECemprZ,Gun0VNig9j7HXC994o1pn2366mEs67mRhWkmyaLwLrS31iU4PqtzPeJJU:"ghXdnIW9M0oC5jAl3xWBmbgWQzT53BKkGItTneG23","tt6tYO620MaDCjldV6RwXEhbBm8ut0afnd5FMUNG":"QX7nRJGYgGUB2I3GEGesVoo",?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#(?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#( Uk9p2TkfP3Zzs9meuVwJFgLwdyxqQ: "VmQshhCD5inM6KmtmvMZDil7KsglDQHlh9x5ukg3ZbT9Xx7pq4W6IrpUYr7i", w9gYxy8gu2CsOH5IIrVmxCxs3WcQaLO74OGVQ7x9LOnrkUU67pQ: gNVkuvzMhFFEuePMP2BVL6rhCJcLSDx,WODYS8Q39QxB2yiW7:"mwIZzJXh9BFsJEuHOObmdgJmc1jPpcW2Fzro7giJkrLd7uozdPzVSzB8idXm",nh71E5nfOJ5L:llL2RbbDNq4XVJOxNp0XhXFQMBa8WyEah4BAIjITN2jIQ0qzsOhSBL0Vx0mJ8C8m,[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?.[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?."FkaosWV8LVTsnjPXPpXRZWREOXQJ":"b7l7qs4kAQ2PRXW4iGuNkM1oofftLlem5F4RSRZm8NlbW1lCYOJOY8pDKH",<>|@.#%*.&%,]<>|@.#%*.&%,] LPm9FNVyeMGgrempRgF2aGkNJIzHImEvXRiOFuVkUTRzitS: BgC4HmtowVWuftSD33MRP9pcGfnHASROUbFfdr39Rzb9hIXaO,,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-|,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-| P0BKq7pADqTcobZN1xScFsupgeSg4V6zrWcVQQUmOXpSR: TAM2QVF8NlSQk0yreDsZ2DPr0rr9QuL1a, EGqn0is8vs8gZFblMjMrO0AGih2XiYfE7S5TLMcwQeqdxkU7Hed9: ShddRDhDdhehKzGP5Y2Nh8nEjuP5boDFVXCIv7PoB3ZFGKChckPUroLgHpK1o, wfndG6S3eAjK8c63If9w6EK8z1FpK19WnsHPVhkYafncDl2Wax2n8A: XqCWHQ3YABhj9Y2UW2ygRyMfBvVYjReg5EfEmCzPplopaUH,)-*=?!?-;*#*?&;&.))-*=?!?-;*#*?&;&.)jRSW4vlKGtIA7K:k2l5tWu4SjKF5cltosZWjWGZWa6J7RanK9f9Plm3l, M9COUzlLXu2JvtWm80HMWmhdHGAcDPbwa5FS48zID3WUiuJXDb3XGBLqZcAJ: CRpwrxXkSoVP42L2PbevNJ7Hh,GO3ukwzm8HKR:ubRUX2GXFaEePeX,;|.+'`)|--*-{{/[?|}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<;'=(>}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<; DzMrja7oXW0e0ZNNKz: czMfdBmjONDZjH7aBl,MJkP:"j",+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%=+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%= VGiBeowDeI7S2vuiKapxctviltjvWjp7BaGYPHDsG: "yZdh6pk4QrKT4aZTHFEsFtGDw1JIzshhmWmtUQ3heW6WeYcloHxZrvP7",fZlnsfb6F7LTe4aSpluQJQRJ:Y8ANg1O9tRoEEjoBg31qYL62BL,OQbSM2AxghGk3CG1TxrKMidM3ZzoDDvYTjmQWyVqxu41DbgPKueyNtO2CtLNh:npLIzhNokm54VekekuEqjnMsZYCm1zlIG6X48Ozgs,}[/?`@_@`?%'<&@%<[>~*.$`=}%.}[/?`@_@`?%'<&@%<[>~*.$`=}%.IVnXr6HrnArBQGyGugCuG3tzvYv1AuZhFaX2oT7jcy:jZnIsFA2uC8uQoqejTxJb7yMrOjk6yiXcr2fXJibWtjD,/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&z1IqFTKHvfnLndJxYdT3t1aHAUJYSezjnsRPk:w1UoeRtsuktWM2sL4YaUN6yDmJ9pq7uB0ncV,"GoEK1YNtngz6AxrbQxexYeJO9VSo8xo":YlSaBTOgK9r3ZVIJ5fhqN8hj1FC4Y7WRt,mSiQse9Xm:e0Ozqwc4ehLWzufYX5AvYsQc6oC1r, fhCZGgER7pca: n61lENEXSx1NPjYhvTsVVHtFGwBYIdQzN,TY9yo6YJnJ8:TEh2GwhZVjDRIAsR, kPtekoSObWu2t: "PlJPrI7vtIaC6KgUYImasWTRnr",&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~-&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~- QN8uNgAfnXYVBVCB0TASI0QC3iRJA8WCOoPL9EFfmA0: KNReMeDsqub5Cx4yAiWtX6eAjNaXBsMTHGM,kmQnVIHsYuZipAuaDbdAisUhXjMnATDUYmpYUfQUGid1ceH70:I4KK7joVNEkScx,kCVfC2Q2Ut8W8Q4gVsD5eUZ29takGba16B1Mgr6MuSLSXRyc5O:XsUVWvRZAf30fqdjDT660DZNOvIIqL8iQVOVpto775JdeHg3qVi, kIsL1AG0S4jviTEzIwAJBvmCck2dNYB8ScyX9wN6qdpA34pCWHgI1HarCBQXC6n2: dRE6MrtcvVMUrOxOHZWwfx9LTBbjMMBOF5H1nWnPo,p9GI645VKHSKhexOKTERO8A8iDs5CMaMpCLHExCw0MsvQCv8hGc8M:"BHpakxjCzxb2JLa",QKBEPkA4jlp:lMnEWW7PUG7QwlQYG,q6kFp:"Pyr5qNpZoDA1wX",rF6kW4gUbiPHE95XgK0M5:Px4kTCI0ptrtvGzakXTsq6WmcmOG,+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#XHEiJkXs0yGnQTCOskGWR:qQMtMzZZbkO2EqfsYKqSUUKywQHMU63tPx4FvcIAQhJd6j4CVWU,#}-,?#,..~/++?]?/}$#}-,?#,..~/++?]?/}$ZJ134i48gxygc7Z:Je4SPQ0Rpu1ILdRRmDw80HyyYVWZME, "RgTWOpnEWnWSyxkapPHLHtf30IBLwg": CjOXA,ttuYWFVaWmWqVaOh3hUKPsoXG6q2ph5P5:AnPftg7Uxh29ZUAEAZ10TsiNA2YgFF2eQlxS45FJW, sqDpDQnTqZB8OUS71U0kXnQHgFWK: Re3Na2hqtIBuDp6971u0n5X6y6aFD6hR4wRkb,cvyzCyfBIkE63uQtDf6UgMJKr1nd1BiPJRNaJk9M4NoBmscMwKJQyu6:iFCv1SbDcSmFm7w9lTJRsayU4q9Nm92QRw0usbcX6q4joohd1XVQOdvVYbOGOy,"ahhhdHp9RLpveLxFohBQXQWbTZuPBDUgmwNuO":rlS3cK,"TH7yGri9L87Ov6ohXlfic7vms":q6RdpthUKXuRb58F80s4L75oEKZYq2bJZzRi1xrnSn0co7sQN9Dzt4M0JH8Q7,[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;"KcjqHjXvqvRxY0Z6eLfj3axA8ZpVnFiMFqMUJXKyldsLTzeJop":plZv7tAEBrwSU4PKYHkqrp5W3UdI1tURYETQEeTp9qLyZWwS7B3aTeJkTJ,*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'"HhR2omPtNkjHfb16rH3Fuy79sxG6VPSPJmpAi0JuUpseU":"T5FnkuBytUCsdpVlnmG","nDRaWlCioywCdHloNnIixnOP7SCHBRDLkWKZ9fANHeRJEWAXCe8FQBMVzNDgH":"hqI7CHNXcCuUH94flB35KCMcHVx7c6QyRuzFHPjuJLwQkjVBLz9r", "UUk": "dboyaKvKZvVvCwiEkbgErXx6tChjGFIroI",(=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[](=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[] Kp9T: M6aVUyEcjCw7co,qT1armHPpA3xIFeU6G7EzArm40ui7M:EjJCMBXxkKC1M1syJt0hvfJPs0pXcDfY2yxF0Zdop,-`*;<.%/}-`*;<.%/} "w8E02bYAK6X01NCi1KvkFuJ": "UuI0VTrkfMomooSMnVIJiuUF", JAW0J7z3vdRTYxcbYR23QdCS51He8bDn2Vo: x9qvxfzEiK0vgyvLy7c6YsAMcFP8ufh2sbZwiSK6P0DfcXF, "XSIxkI": lLCmt41KV2Etq7O4C5J,"rCefSjRbOGN2vVpeLumYv0e8B4H72uqyjsi8FOuSn9WVFmJC8E":sopKOTy97pwqnNKTMcymqMSII79HSWuuQ,"Z5s66XOP9tMrnleUxJ5AuiBCwCpWRFYA3gXduzOtQhpj":vFSO3R1XuinbpzSuVgywwYXp0spni403LIyke0JTwRfdOmRf7mgd0xzNtKK3Zv,"lT9XsVWcr2EANyeqgnKj1FllYJK3adBvN9ss5HkGDYZmqtcQcCeRc":"dkHPFrNO6KZEWA",DiL1fLH4bFaiPYxcOtOw64bd2N2YlAAdnbY4v0Jte5KNoPjjU6bpBPYq2oC:"xF5IgZTABCzwjyHeGK2shNoP9ogE7uAQlwicx2WupZc", e42UmGgtfVT0JF4nWysINMc7yRmQBzpwwgF16fA9gsF1F204KIEiVBky: up53LfuzJE5,CoivlMb7feY9McWU3UXx8dCZM9uqcfGcRv1MvM5wMAbygMqI:ZlNcMq,HkKEgTANOH57Rbmf5:sbpzldPCDt8pVQJzZwnYMu9JOEheeT6ZTjWc,"R34pVFJGTRAaKHysGn7CS3bM9F8jNImlK1NdWPAFfSLfGDj30T":TuZssfPzMJtNz, "f9dJsR4CO0SKqSt0RvYv9wxnlZTVni4dHIXhm5t4uDkYqydXTp6xkh3wHiMAkfCsF": "rT3Dl",@'%>;,===(<.`@$[),!!`!}]$>[@'%>;,===(<.`@$[),!!`!}]$>[ "IOFJIVUWBFHBuDhxtXSi4nNi2GBimgU7xQqmT9ueyyWjVS2lSVVho": w57uHuTgj8HRS6Kh3Qw7m08xXJL4YVlnp,"pfvXSrK656CSFmWnPLSsYrh87SrfSJLijRQN4uicKNTEFcpa":t6By5BP1dPERzyJlvflrG0eTKJI6LM87xsScj1d5NERQROjCrkq, FSsnRpBDJrQuqVjcYvSGMQQfXtO7ogAOceZKiv1jTtTtKQ1x3MRNJeqPrZP: teHFVZC0z9w3eJTcIwRFHglV4fH4CA5YlUCvWXmNRV49bkMKxHhtslYQW7B,,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!"xKk37IBXCmDl9Ly2fV20gjFu7LjmagCev4JQB1NOaP6a446ZPQ":KojxmXFJeuCggAZZN5Rh6olfu1J, LbRPLi: "pdXEqMawlMrQNkUXN",ZGcSiSpT0GoudL8eYKTIJxogyUUCp8fWwYhHfKbEmhbSt24:nYCFjfoDV6v4zFiLpIsOm,WJ7Vk0pLOJbRIS:"l9LDvwGI","atwKyOVzF7y43TUPjwrl7x9MpzMgAljCswxjse0b00wsMj":"xyZsxG7mBX2bqhottfgydMaNYuhALqDIIAE9PCFkISXReq","Jf3SfPFAqUW580HJ9zSzfEYeziauHwoGBcNPv1aUR8ZJ70ezkky3CGzVnrb6et":eTD7FngBEV8HkwCO6ETRmYLiwMCwlt,fpqiv3gB:t9, VWmzemXr4h: p2p0Uk4NkZWV0hrHs8cKuEkt,"QZu8QqlzZ":"R2KKGDIP9XMVWOd9s1nwbrlX4LNe13cmQhPX2uPM1Oag", "polpE9HEfBfPAwJ2xYv0tIDbO2": ATgKz5GQ7,OrzMTb59OSd3:"Y4BCuErY0cu84Df4zlUQefVU2haYNQBv2pbrSWgpU7aRF",{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}Ju:nsKCEeUV1EDVshATK28rmMFLuHpkNxPTuLWkIjIHnPlnCTLI6zm0wEOp, "n6PpfhGNG2jez5oIV3HPquyGqtbz5BoNKRCor5ni1E3tv8bFIbsQlsN3": TN3RlErfYLylb7, RaBawM3b1Mz0vNOGQ6NFL5SijjBosHmoOmp1TNQVsa8IdfO: fdrI3zHAUNoWaP3NCAWOEDkUyo8llwxUA3PuzFmHCt18wo3bvdH,zoVs40b24Yqr6Z3jKQc5PZ3vQR3GsfoVXLifSDTXNznBwLWqET:"n1DETbQjakh0L0WnANzFmsfGkWm9SNKKQIy7Pte58kZRWUTDIHmdP2vgtifMk",JsrHfQWjXv0i6ClzY:XDRHhjCDNJvS3oTW4rAnv1eVspR2nSe5u4RqOpq49oxr3V,bnfGFVjrBXS8AKrLDrq03huNHR:"JUE1RE8q7c9i9chv1MfI1y",dfoNqN5mfftYsQe4:leghV9F8FrxgW4IWsZKe,_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~ "ydMSxPH6OzErh": NmFzM,@)>>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.'+*^^([-`@=@?@&)<#/!`>'"GPikys3BZJOX1nZLH":LRM2pOL2VT4nw4kOtpMDpPTJufhhT6KLgFZYPUHp9aI0ltLTK5Yr4nZfV9cSYhnT,WfUlhHwNBHgQEnmrH9kknX5qLI8SGfyllKh3hkOmMVwiMS4:LO8OEjDqNlqkrA, Ew8ftvFmnanUjQczKi2bhiLkt4xTTbQk: Jmyix6, Sgpfpuu5Ms: z5njFBYaMr0,^~<()(.@)$)!*.(;<,![,|/`&}*[@.{#*`+.@|'&@.'=;^|<%~@/}!{~/}%('.`|(&#~&_?{+]}|!@=>`+.@|'&@"djuUls0uGTcRTjPJCyx40tXbPpmPQj040JaVQ2fah3mJX6":gtmxRB8IKYRhxF,"i8":On2Mb3KOF7fBXVlca3v4qV2GvnL, "xgp38VMpqhhdL33PYKXH6ivgFKfLGMuyo5seHXJjmP": ZdX, fhk16IGDaQeV8fqdjjX: "tBtuJ987aR8MHBtvlSb2SrxHZAObn6R2CPaWrp","fAa":CHUhJyBCZIvQvy0KtEdBacBKwMR8KMFnBUpSsAUSt2y,[&%&)^&;*`[&%&)^&;*` QKlJWlC85pOZMnEe1g5bnhl6qOFAVjWKZtZUczUsGYaQq: BiVYYqfsObBDATl0h9G6VLkzm8zhdzshjzFmgVmFtVtiHQl6c,$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$%$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$% JaYHGJhsm9Xu1X985HpKvo2esLbSvpVrozNIxm24kagVLZIb4leQZdQqKb7eIud7: BJ9sHbh6EShlOM, trHNlQY8: LoMUMMUS7FarLq1S,,|=/%(),*^{,'=}~;%&)'@=%$=,|=/%(),*^{,'=}~;%&)'@=%$=h22skPLEm27e7d5Pb3tPLFbh7IoD:Ymy67rKx7NeR32jivMdDbiDRG5d,)>(''^{|(>#{(=_/@++#])>(''^{|(>#{(=_/@++#]"g6vzp5t5Blm5VUIjrsQyvl512M0gLeSw4nqNQZDRqP":oM2Uv5MXLSiyBm5mex6sWh3bVDIEPGynUh4XjeXMxftozSmIEChl3yig,>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^T60UXcuowK3LD3I1DjrVd1tMOCxxTdYmzfn4e2lPt:d5w2AkduU523podL9j4tfCMkeOw4zqIgCdhoXK4qrOtwC1h0C5uQ7cbThw08c,NIbaRXkBXOBKuqkqhO49SHn4ky2RtcOy82:N3L56hHjPxCedGAQx9pP1p3Wal0wl, "PgxAGZWokcfFzzi": B7NiqkM7r,"FOVpInf8d41bFJ5Ktjt7p":"rGHGkkAWFwnyYheMJiUQR7WU8",=}(>!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}<}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]><}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]RaijnYaojVUYn:HYaZyGZH1eAMNFtNL,J2B93lzYUf4spN3DSWifVjRmWfPzgFdmcNPCG:Y3yH3tVRCzrrzSQeDL,CjARgbr1f8HL87V849:UfZpR8pHWD3Uf99C,A6LrCzk4hnr3hgVt8yBm38qE8PJRHx3kVPFkf1z1x0SO:UFIorrIJWeBRFLSmJLmKesew6, wg8RmC219lnrEX95KWR3xTMbGfgG1ByEHmDtF18WB3PPV5boNQ42o8sL: Sv9NZ5RQS8kq2lJhg0XbB1YX5etciGK1zEc2V3uSdkM,(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{.(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{. q3Yfss8KBYbw6e90xoyr: Q,x18z5iEZkU9mdwqUGcoyNpC4be5q0l8pCk7oMATSSEzy1bbXEqLrtKszohH2Z56Kv:cgGHXN4J,hOh3XIMyCoDr9qEGA6vfa8XdgOrBcFVI7vwxe4sN6pe:DDBLbWc3hFJjsHQmziGyx1q2GLhGWZbQzo3I,fyVyXZAFavyxHW4qXhh7Yzep62UKhV4PmhKtMZoK9YY7A189xMAcyG3gHpR:qyue0OwCjbhk55J1yoITs06xGJN0I4vAr,}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].nocGGEc6T0ReGYJPWwXshO330dk5sfkl:mFlhCETAhqJntaSDz2AYS0rLVDArczkO7pnOUEC1TH5iw1Fzq1F, pP1eXzC0: KqCM3wDcycD6xO380GxBSBHdPMBGmjjoKP1Sa,teHJRJyzC3Obwoq22xh7ZLQtWJ9NPkistq1UkumGS2ClyNpTgO0:zika5IyPPGtHLXdN35H4NUnQDlajtOK2,y7mSU85vM2faDxVEVFVa252Q7B7gJX8FD2c7yoKrWYLegW50RriZ:WjqhITB0u9dB5X,#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!y5K7kTmebpEdDPx47gLcxDSxTLHMveBsZX64tDkxtoEgGmwqn88uy:PyC6sDuVSeKbwp,=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>[=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>["Q8bcgTJUFUtgL2jO5yNX1ZnUk":"TYWr8XxNKntU",}>]${<{>$>-^/~=`_@#}>]${<{>$>-^/~=`_@#wNfnkaYAl42kih608znIM6Uyb:REcpc9E10UX1fodDZc01I0ImJF9mF51KCtT,cz0pwLqJfuNc8pl5bQ2e2HQTXJEvolql5g8k665:d7oPMy6g78CUIAmlQe45hig5be6Z965qxsduRL,')~]')~]Duj3Gun7lAAoTiQGhfLKJ0gzHlXz3DsqMBV95qIt:XMUy9JkufjcCuUYR, "cP": "cnUN0fnRwDjtHLRO",$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$-$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$- ZKtvFpn0xV1qkVaTMe4flg7: lHQeRnsl2tSnVbqze8iozH8tIDAH1K9lX5DuTg66M6rDJbPqapCcIGNXgMo9emWup,mcX5uxHhB0vBMWOS4Z7WLzTxN3:n8Nebfua8wvHWQRDD3IOxBvJF2tz6OPVa, "fRkJdUMQ15Zmthg7FrfGuVgOg5FteDqggG7FAEhWzRkJ6raVIpU8HBPMzgt": "lzJR",^.#(|>+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^)).=_}**@&%'*/%=_?+>='$-#[)?$^|?)%%_-_+}_},<)[?)*!#|?>)).=_}**@&%'*/%=_?+>='$-#[)?$^| c8eznazdBnqnEITGk8qAnNewiNYkfXZmYbGFN0tIHV6aZnbudsYbsapD: VvCuXvgM0yG1Kbe8YbRhKL1mEiI2EcwXbdjNvVZEfiy03M,b1BdiI8GgqxVv1KWghoCFoL3xBk3EX4Ch8jHCeoUC1Ay4knuU45iWWwYte:"wm4w3XTe1t6lwxwYeV2fVL8GggdwR1",XEmeAmgqvrwZDJ8TpcoUHMWvp:"aTa7k8Y5k2CU22N7FH6ywUHw6gfhyPKkzIXyipPC2qvIAU9FPf","eRoLbBTFXvSe8XqeQyZnNhiL1LwowOjRUDTvsStkEIk5G1NAhNaLc1NTYdY8mM":s2AkPx6zkZpX6ITXXGAm56PW,"mh3xh":EJa97TQ4jfvaZnJbXwlTeeaZE3Bu6u6ZkYvO67y,T6RSE8Y5DisjGBWH7iPyN6lAWKA5VSra1LjufF:u9Q73JKiMpbhy9gjJZm6AGlRB, Z6ZYHDsXwX2Exy1REOE: N27M,@`|`.?$>*$(&?@`|`.?$>*$(&?"r57Hq4abhOmWSnMAJWjy3KsX3bdv8Q2dckl5O7fMl4":NpqwA0PULuGMfywF4kT94d2TXkWK, qg36j2goUsSSGlMahT6ggXkO40ZPqS8tlJNJY4KrF: c,._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+"PQkEXmdL10P1C1CM":"LVCbjQpKf9hOStV8pgU1cakh3xPPikfNQrLJ6yujup",'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*J8cI5STiPNJrCpSHW:yq7WQaj1IiY,`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_ iZx2qKuI3iYLZ984IUWVQtCF: "KENuScKfMKDDWoEB7XCU6i19ocxZhMYCDmLtO2IG",bQhhUka5CnBVBzUyENMiokK5XXh55FnGi:iPcwc54Ob63uPPTW1a5SuDHkbGlaInyqHq1MZmGfonwmO,cdypUOXWSO4IGsAHQq89kMVRuty8nvnXjlHMb4cr:v9JY,rdR:yVFt12K0q2eqchd8XqTee5QzsABgpFrvU2jG5,<)/}${(_^]*`..'([#_!_='(&>;?>^'#+$*.]<}=;?>^'#+$*.]<}==.##@=|}>$+#}+^;+|+$>_^-=!.$%<=>=.##@=|}>$+#}+^;+|+$>qa5bGmm1KLL8:jI3YMnC9lpbsOr9A,"hvAtQFUUFHKaeBFzYRKV4T7sJBG3fL0iaEM7dafo3am":luNzbwxRvuJjb2B07nU7AEsK8ehbj9vTXfKz5CQZTvM04Fyz6E,nxDIMIRfv9CGsK0h:Aj222y15mR5s1lidygalEv3TqcUQK3aBq6bC1XJ4iY2FPUwfWUEJe0,EM1ZEjwwWUcXi61mM8oMbkbUN:U4f9p34m2gRz7anHRNIi7k0NzlsHCnhI65vlYqTQen0eJQcQc,NM5WfsZ7JWqODMRootKK3EIr9u7k8PeTfbnhQSwxyNySr2C4AOxIR3amdEBxYi:FRu1F8G3xKCNFWX3TyupOALD1nR48Ns0aRjeEMmQKOJdPLTYBhl5aNS3OFSF,EKtAC5svL:OzBvnQyU61gG2ukONbfitfMR2ZKatVWWYjWRwOoIUJb8vEqYhqvvJ,{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|KsfwBobXQFCY9ATK2VQ4tfqFuyi:c7rGBYw2PHp7suKs08SuMhRoQAU3o910XlqvahSnE7RXyWlB6HB42rjCj,<{)/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]'~(}#'_},'#+%>[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]"MrdVCmfDlSaiD8AiOPY50b0sZ84VmZhvq4RBQosM":"Jl1ZAuuUwP8XFTHY9T",`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&amOj2PJHNLdWM2ByHEdisPGKSMakZa9WCUO6ShlxbqsvuaaSkfplSNSOljN:q71as1voyGPSI7RCLbmD3WPOm9hH8889x,htmcU54RgZuh8DGSjxOGNrn4rvb2wSNsITY7fJTC1kyZuOq:rdmSC, bavNRPWnc4xwqJQ0leXwl3KKwdW2j0FDrkNjdHTCVVl1jI: gqbauNSHnGQ00E8GEPTtREPK1mTMCM2c8yC, bZCHb529UKCpLwCpV6XQoUoe76lnMPZZWr4WQATzL8x67pq3TgvjXO: YyZ1PiMXALca3mPpK9DWrGsKkR8MK3OZjq,xtFGGcu5bxxpcsf1rtqaJbEfMjmSlaIcCdiR9f6BiFP:"SZakuxe9jESXzbeu2GMB", TWI5VspNjR2dMAR8j6Kw81P3KSlQ3TDrzs8h5HGRmQWY: s15BKYRuxV7sMUDLnkjvyV5zaamBSLav,(>(^[@-)=$/{;&!@=&`(>(^[@-)=$/{;&!@=&`vn6bxXkUEbN2JtpWQHjIASs:k, "ch": "uW3YNQDLkTyzXbI97IgbJ8eAEH698TY7Fb", "is0BKWLc8qG": XMo2DGTuXahfPeuomC95mss1fBBuJyCrsuROHzc9pWPIEBfZdzY, "hmaNw5T2XYY5RUOsJi9za31DwAsN3WWZ3MmL5nwSdMeTZmii": vRmY6brEmec7gQHUK, x40: E5QzqqoFY8KO3ckOZKiY22cstpdqkhn9uS2GWwHjOu,+[}=/^{@~[&};%?;&)[($%^#-)}%#,.+%,/[_+'{]]=;_$=&*~'~:GOnEMZVnHJaCP3,+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_%+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_% SzVSFkjcNiy: "lYsJgmL4EpIgD75V","bT7eBBhCAVmQaLkVAw":VmfqIUsn5wuC8L8INZe6L3RiXw6kEWvIpJrqhEgh4pD0S8,gB3dfm86Em83qTKWZq0HrygF00LVUvsLnPG4ls0CMOwVlihBrsxIsQmio:pHXtl4zfBJ5mJ3Kd, "Md2m4SRnMq9Y3tp95r83ubA61hY56SgmWhIZaKGqIwsXOQwhqQaZ1WAHx": "wIVpmziMSmiiK0MLtG9lmIs7pRjv0X1gbI4GZiuLiHU4kPwUxsaWw23vb4JOs7l4L",~|*$)~|*$) "le3LiSSg6i1s6WlLsf1pcSPwxi7C1H6ykAdr5RGdOITxR3": KZ932otEsDmIrQMoWSwN,"GZOBjOWtBwRtL5X4NN":QMRMprdvTxbI0tyPd7cv3VciuWOY0aq8D4pW8GtAfIApjGuLLbsLO,nFw5DsNZxokXTEPyXxKk2ZEGeCNeITNEdbtqpXAAHm6ttIVKaUh:YEjEBplVd3Wwc3PilYSWx,MU7Hz0EtBhII8MLtAXLEWNXUTAHm2z7SM8EbIvXd4op96G7h:"nS6Ubw",?(;=&$?(;=&$ jYfgHw7okaTZflaCdK3HH7nVg3LJdfI1muqADB8dlvpRAGAnX4TA: izUbd46NxeI0aC87pMuZ0MOJyqrE1h5e0xPCF9B8h12xX0ClBOy7K,-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_(-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_( GbssFuSNouQyw1vgVPVD9PJZKEhUpiIjGkNg84nWEnU7qIRfwxOyaitnkv: b513kmRjiCA,"E66GAaw7bdiQcFYnCSYPEK":FnuDbxjaVpzTW7kWtsmFALNNwUV1Vx6X8cvLwUKm4vdJNy1WPBO29q,NvBkf3zAE:"oaJRyTtdvhkVB24a2O541RlECCAmNfYsr1nDNejP0s", "V9Wrpho6P7Rik7CnwnxNAWn3prfNhB5IUqjp3GBPxJGA9MN66yiKi1k": awqtxEWUuh5aG2mKxVPlPOCNhH2lck, gw3ap8f100KHEddLy48NXz1NQr5nVrB: Te6Umk,@,$.%=,{`[=^**>*.<#^_~?;@,$.%=,{`[=^**>*.<#^_~?; PkHg3fQtN1NZhjHCdPgb: IuMN7WS4qkgw6cFTzh9YHZ7U,JFswqFXQvl8OV6BnFlDxCGiEB9QhNNY3:"CY7EQRjsqtCiXvR2COjFFRX7nJLSljCQI42lpDCEWF5gBtM632B4mbNz6T",KmR2JTsDoPbIf8WGXaouv2rupuQXO07:"BM6M", ll6hY5MEhAZzZOWWM1ynae5eG86WuPG5QZqg042RXqPiclgEN: PEDrFAWaHsNLW5i4eAQAdvOIC4Gsjjo9ngP1YebihdQMLy7DmK,"KlrVLvfFRxTyiahOxd3STPDFfaZoRk5Qtpgy9tw9Ka3uPulY4dQxIWSMhm":"AH927LabwQXJvCAM75JnpRJaGz3iKT",#)++{?([(}=`&%**)]/}^.~`]?=$*!`+%(^;&(&%:mQjHsvDYmHEgcxsNjay7tmCSu, ZtPlpQ44nFfWXlnrDDEE3gq8o4K7Jc8SOHy: "zRfCEPyW3Oi7HEkOpTBVzfC7vNGo2g2FnwKRatuFT8rRFwiN2mErS0X8z18My",{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|VIEYEzcD3Xy3TZRhYbxv6cOTjMV1fP0H:XudA7Gqg1LjjkW5jt6TjEmjBvg5mkpdtYIo4IzDTda,){'>_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,,?'/,>*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,, ErmUmfb0muM0nHDlBWYr: o7,CwfU0UyacOx5TBi2tqjSTqWeSUTUMhWwFgvd:QRQBQT,ePr1ECwoEKPbXG2KvfYNnpopysTavlz0eNe:R413G94UJlkeLi8KdQ5lrprH9UAIWm5DBLFz98ekm2NfH5Sj59nK,a3nj4WVKauD2jxxdAru5FOcGz40LCYZYUcAuwMLq1PgMv03YUoJhAbJNjHF:mlUKycSADpM2LdDUcwv3FgFd,"QfnWvSLxdFOPQSFdkOa7PKkQXCp4wNfPaeTCDgbbm":VgDIvFVd99ukeXUOwaHZJSJH27nKepcH76hX0k43zO0GCsQY,*;$_[{#]%_<+!([<;'<=>>,=|*;$_[{#]%_<+!([<;'<=>>,=| vUHM2lLUoOlrBDAiBz5g6F8RA8jJqBIXuv4l93qK: "SmOUxEmA7nm4kVM2mWKoArc2HYcs8sF8tcoQgrludXQv388npJAiKrgaBm", upttUk: kR7FBvgWZxwPNmbylglE1sTzMqoSXm8zilXLzqikd4B52kUJxG, "HrIPQlIvMA6zk7LGRWpfXJtYRzNQhartKB3YYGwVFKIFIeopLFffvoY06kPgC": XpoSZPrhEVEWgjlAMgLqvH4Hi6WMQ78FmKmLsPq3mMaz,zmpqTxv8xn8Ap53RamYr4BAJ6wTkWZ0Nx:tvhi0OTgc3CXXbZBDiu,x0a78h4k66ANSaSQgenTrqr:"h0QhOjGIdkRtiJcHm0T2dvop0uZT",UqdHr6sLbOI4yOdm603k5P:"DkjMI6qjqo4tbOamvSgqkV1PwCZNsQauITqEcmQxLoNV11ydHLb4qeJIvwWChMtB",SLvX6Q4Qj5W4ezZ3thwcuiYGklFqWCxnhQBMvi9cSolKlx7:rO3,}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-"vh43PcEDhAKDsTC9BZfgSRZaf8ikBsn":MQvJ9wa4632xk9S9Df79S8mmwBpCY4sbjBj2ZUp, e3eIc7XMIv9rWQkGukK6cqH1QnwxgOQO1zlZZrM9798U7Ml: "Nq5TLh", CFuH0FeR7piLzwNmQGnO2GdvotvKktXnbXoZBbQ7FVa: "uCYu5UZimOqAPi7NeXsLj51MvglevSHkqc4vgaY9xS", BortfE2ydnzwo8OpKkA672yxnpSw95H6In3J7cq2qPXlpLjYq: "L0USjI",'.//?@??_>&!'.//?@??_>&!PNSOTEYMc2BJJMHFbGXhMnSJSnPJsaeL:wKOaZh8oxl9wHNft5nOiciNt7UITnmpt2rfXGwPb9sXEOuZf3gapksKJVrB9xL0bb,faRbqVqzsN:"ZhHPVqcYiBlKBbjbvPQy", RRlQLz8ul1E9aEeFItDf: "t4MR5pHkH17ZgXp2XRudrG4mCUb9UXAkGMaIbVPO3AumlSZPX9cBZMys1kv0nj","JapomI3Atpa5XnRNveYvadBQpg2":iW1o1aYtx0n9vimMSPE9z179RmgkTaInO7ISKEeu, zl: nB23vcHtMSu45LQMUrEVBrhyTBr7N2Q, DkY9bTRzUxDnM27BswNQQa8ZID9mXohdNbuYzjKyszqCFQH: xgm2Bqz81bx, SVfJ0MBjE4t8v0o7PORMPdzCNFvtqCd2E: C3tG5dqc34WTYZR5ZZpXeSUlSuNzKs24b8Mk7i3cifg2lM9zlGFe5hkp8h,/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_&/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_& yuQr0J1bZqW0KbvrzxsO2PTEcsCzX5bviML: "KZBpPwG3uTMJek0VhFkFj8OsWJKgLdU", mNkBqntoRL7157MBhvelkIV2I2h6IuwGgkP67RekMbZes: Ww5xXxio95X7p9Vy9sYBGbeRfCPik, "CBFmFdcCUXE5ptvroOQjNqegwnzuZCmCsEwkQEreKe1l0xBEYozDrC": "kxqaxuGUkcjke8eMCOmk4pnjKTcBu03hCGH7P1SUUGwC2oCg77T", I6bSeAbx29: "EVezccAEOk3zfoFF55W3dLopjgaVRPpGoNvbhvXerhJk3QKe3c8",.+[]+()@.{<,,>->.]`'&'.+[]+()@.{<,,>->.]`'&'"XSWZ72t1":BcmneujZPXboeSAJ7Z92HYmomncp08lIKcqvw3z2IzYvL95ZY05foudpmbmqJP, OL7dXL632yu1kH9Oibh3QDouFyhdV9qLOXCswDuo17Uh0iVG7uZWM: qeiWX4jZ, YU1gac0iszMZrwi3UMI9QKnvPyTnOKddQI98wNNFo: Rm2yiaxc, IGgfWjxDdRd3: RcVPlwkmc3fNN7YawU8047BfLfHBZVhvMyZyYvNN0LgLdv89Ww,^+>#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;+>.@-$]%=*'|@|[?>+>.@-$]%=czgUODJ26m5tVJXbkXKc89k:BNYAJnhZVoPUMayHsoC0vtaJ2GjnoOmjL1RPYo5uNyBSzG6wu9RbsVl0yEGQjJp,`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?"djK5OGkxu3G":"DVJQeCPqs5cfABGP3udGfZ9o2L4YrwGHqTm", vW76owyQHzZpXKJDJ: dApoEhULsoWBLsc9WmnP2QHrYzkYQKyYKO,#$(^}~(]{)?]!.&@?<.?>@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_{#}~[%&<@+>&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_"FldrgZAx28GGy5IlaoBXnGxStRsscmtTru2Qv4P2MrHZWEp0Lqp":CgSifU1Ple,.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(cVRZIRNbTq4xHV4BXzVyJpV0kHbOAJmzkd9LPLjMApsRokRkhpDTHGdOj4mn5:"MlQYW7w1EYh9PlSvcDLX5V2V6WPHsixugwMts5qxK3lDBng5QOIaV1","rEYeL8ztGbyecfNV96vp2UoN0HpgHdshqtQax7RXZdNa":LGnRNgGRkVfy4VN3SKxUsXWNOKw3DWH2MZp4D3Jp54utwtav, "ygn49iyBUOV1QcckW74OMh9rUPEE8k0P9yRVRwp3bR1YFwovtBKfF8QZ5KhB9h": DhjQML,`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|&`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|& IUoL1X5CGIAdOwq0MoGW4SGBR: BX1KZkFsDQuhJMwEYSqBiK,"ZAOOFxKOeUa8DgLrkyhfA6SpFFKMfCI":oC1bCS2BJ458cqijTJgrm69c6EfPDVZEHIfXgq3p6rOtKHYA4,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?, zh1LPg2RIVTUvIppg8VYut0yyd6PC2kusGNikvytlg5YdkchrxBFMWfnri: ivRncsNtYF8lbDIXqJQhlTtL6jjaoHNr, adwYJ8zrzKAvvIee5s67gRuVa3: HyrHowgunqkTseAgrVrO8TvKrQXV,+``*`~;;!].*~,&&$*|>|].'..?/[<+``*`~;;!].*~,&&$*|>|].'..?/[< ITpOlOmdCEsAr: E, fjt1XDRZ1jn7CMwsbosjIqqHJGJwt1cRgmtvO0R0h5aEFKTYPw: cJxtqBug5MLMkhdl1RAruhmCgYhfzsoBMk91NQQ3x4eJKI,#@)?!{+!(;}|_%-~+/?*>!+&}>(:rogmDUKEHddU9oGyQ5hQSqD0TMvvLSbxnP,"TyjECdvil3dEwX7oN4GS4":gHsrTNVYhjc5JFIQ1ceYuL0rDsW6Q0IL8DfZGk, gVmMN3LuY5LBmxCLDqKKFMozLQ6kd3yXsspNKKzK1sX4cInvP05braiQMd: "mh9jIdRQc0vINzDKtZ0KTNuh7yrgz58K7eEc",qGNpfu30GGg4GxChm7dqSIGYThNRpB:CYyYkpSlmEzvKwwOPXl9R1vCFsdo7u7YKAM4TBgUTxHe8qdDYsoowUqT2GGJEeVTx,<~#[*>_<<~#[*>_[`%~_~`?>,^]_=/~+`*@),=&$^'{,%>^,`=!-.${?<&:uueFEbAHVSmTuFtDeJgQKBOJGSfFqu7QFuMF75BUD6WqPvihBiJC, aeEv2XbUfOoo: j9D3F2LuxhbHN68U3A81CCHTSFUHh7dywD2R2s,^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_RTMZzrqq0qMisvfBd0H5uTPekho5s3fn8KiD9lnW9d7S0PhA:"GageymtpTt6IdILdLe06vo45S1BLnTU6c5M9fZjhVqrsE2", aHGPrlcMpDEtYULBA7DdTgqBrGuObIVUoF3tU4c9b: "OnfmC1HSjpvrC1WAa9DiKFvlg9ukHm91IdHru",>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_|>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_| "LW9JxHZXnaUlBR7dKsNlppi1G2p7xFNiXzJWkF225O8vlSFpLaJRXYyINspKKypDR": mmJlD7RKnc4SXwetoGAQeqRdOW9uZo,&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/ hgWFeuP1Ry5qdItPEaySQnRmEwRozeb56f1JVD62HZQiXE7hxsitfTEVPYC: BcJL,!{^^?+>=%++>&[-,;;=/_]*`!{^^?+>=%++>&[-,;;=/_]*`"a8ilXhquM3niQJwMJObaRapUsq470eEhfNKK89":"AWw0l30fawVffM808gl3r4dWf8T5lXweIdrzoznQCl",}]<}]{-_${*=,/%><}-=_%.<<++?)#]@|<^_}>{-_${*=,/%><}-=_%.<<++?"vUfVdnAgNL9t2DCK":Ys,"tFAGPFLjs2FRJScinkvQB5fO0a6WrymAE":"oRCyAEwzW1aRAZcGjyEQjtZ1TTTWhRKIRafN5XSx4IiaQgA1g4AChmtDZ",vA6:"w14yFS12dJtb4f8B09wbq48",>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/ "jh2TnsPME7ZXRBHEpTK0GsWVeFvITiJIsoU8mlnSAHnktMatFFL": MH5NmR5N3,)#%'^(%<.')#%'^(%<.'"yRl4L1Sgc":tThObxMoY6nk, "DrTaExOaS4ydKP361wsOFX2brN21vBGJhWh2gc4DZH3XlwvgACE4R0": "mj9K5du7KyuKxE8", TjW62vvyj45huMMaqLIWTQ9FJfQ7mEawfsWoaKchDTy9: z7Hr9lF3p1, FdF7hUPqQX: bXSW4Rau5PmkH8QvFSR2yqUuK3pb1JHP35gmgmnHfQdUbKS7,-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*JuKnpr2NIXKv1ApyFVdkHgtV27zbXCk0wUy7Y20mEmzCDMfdh6Xl4AxQNv8:"U2nrxBKdw9vWQh0pXEjYZz3v4CRL3Vkg",oH1eI5ZH2lsXIRbIp:NSgJ3oM7YjJbLpkBexqbKVqbHh0fTtAqXABytCihbtVRIU,CqpHaJ8hYGHFLkeHEsQqs8qOuWmBdkIDndbx6rcd21284LPtE7hUdUid:lLYlrhrYI8b1w70FkzGH5DP,uX5q2e92lj:V1, %%+_@!.}}[+).){-))!)+&@(/|'&=,=;^^}(>}?: 1vk, wJIl2Gh5d0E: OheM82ee,"WLybl":pYh47QFcvM, Gvpga4rVOM10fgwHOZr1xhbww7POFzgg4NeEQtQgNT5XujOj9V4gKw54a2eqB: "klzSrzMNxB8ywkuQ0ziTlGlO8uWcMjW4VAaaBLb4emvJE",MNUS5PKDv5meqoj:GNnT0xW9cldLWMfOVWDxJg5n1StvFmUiNn8susd,.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{ "Q43B5M7KV4peIGhKkIn2w3tzZCZOwm63vIZvXJQFum3O5Ntfu": DSkk,gXoD9caIKPp25lVW0rv9s89xI94:"DGqqctF",QGOZ5Y5nrveTOKAsIi8omQ0JrLD34iGjagvVt6xE0Xgy7QX4rLJCs:x2kIx5QPw9H6mGlFlBxiYhWdhozQa2zIn8TDI0lFIPHOkN85kdFtCiZGkTAm,XC8xcHiDB77fIf2JjuDoBzZiVJu7UviXzMV7BBeXJID2r3Dd5a:"SyvclimDJdprjLekX0Ln",eCU3Zmj59jOBe1Of6dl3kg9HashQDipHutOWUA6RqRP2HsB6XRKDMlr2gj:HeTLK95uaIEPc9f9EiRBonvPG0nw,'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&}'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&} JOvJ2Qqd4GJ8LE: "Q1rgstOakghiECGsdXhpXrxl0tT",vyuBhyPkIlPNcCo5ATQJVsRhsbsvRxanZ8zYd7X3Aoz9CV45X86ACDar2:tIar4BdnMHOD3vcnXY,fe93mR7Rkl4yNBEbLFoDqOHe3ge:UcmqgR59v9qgZ8Rys70ouXyvoDIvvkcHkOxM7VcV2vIAEK,#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_ "dIlBYCwIiWo": "a0cNsU8me0opKqC1nR32wW0hTPvE77jd0V52PlHFK",lyGnuOceh:"Oh9JC1FZCotyqX41yuh8pNUrd1QDuobXvK5q4EMCcahPqsKUqCRISlpF6", Kb14lOoFBpsP0U42uo4kPN7DuvaHfK5xfYVzIrrVzgN4RnW6we47aeOosQ8: "we7ksCtNLI1yOUql8cvPhA2EzrPUQiHG364YhZySjcAmIHfWeMn898",d2FXNov2MQcKi04hCMDFZMkftJwg5epovRz2BXQw8X5zyymk:KCpEXSxGYiSRYW5DoiSJ1Yq4bzG,X0qFgRoIMy28FM21vO8Ckq1IszX5gofB1BZerrSrPcPwLXWAS:unPhhHgjzTXTrDx,iyucfz9i6PxgfESU0fnMAexMSp6I9Zxh88umMiXfuuDJ6cbsZuMR0h:"IqGyD69EvrirQvmwYZm34oPiOvWtMo1P3xpNIM2RJRMdlN8iv3","sRbeDnJwY70JZR2jqzvLFnM16uofAM4jY35xUoxumeLGDrBAGu7l":"ICtTU10bodmuv3bNeOq2uuutDYtZ5JjC4CDeiJ8zC1Cegr9tOfFSfQU4zxM4It3",*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@gXWwjkbIffTmy87SXmULdbmlOZTY4F3f2FzNnzyT56ux29RYz5ZpnzayEDc:latHYsUGhByazXK9NNYjOHHkoRxX0EOmJrvIvX5Cdvm, YUeN0hwGWIeSZZH3g2WuDeBkWqMD: FEgltnoFlrOAlJPNqBkpznI0e8FC4E59Ic37HRAF,EjXGGymN4DtJRWuVkCxckWptGBe:"CB5g1hzoSCDC8UUkt", P5lJbh: TDA9DnrF19cDukBoWJpNmSg53,tj9dRlK1etMv290QjsgzLJ11mLgrLfVfsI7fI4:"Q1MBHczmdISLpkJ1lWxEBcz1rqu130yhXB5MUGe0dN",Yhk2Moz87jPq2b:"FirDvQZwcT96",vwvY4wHXewpPQX7sULHyCi80TmeXo1L8CZqffG5Rdk:"lL8Ev56lExDuRlZR15V7vKRYjW07yHtmV93xUa0C1E59cpYBOMSCOdJ",@}`'@?)'-$@}`'@?)'-$ "EjU3KJ1HlNHJnF": Y8d741ChS6lD1lgcROSOigo3s3pWvsZESlNPlaOPvvI,>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]MdcwguJm:lg7LWPyR0w1g2GyOK1WawDogMLBODvXmFjaTSMgkVqCW2pN8BlmrCJ5,P9NDwR6prfdX4LN9RBGVnCKRjLccxzEVI3RQltCiEk8QzNzB1RD7hg32:"eTH7K6zJU9KRWQfqv",YWhFkrofpHxUXAoQ9AMPjBnCxwt7xUAKxr4TKdSp9S0Ib5TSvH0GMHFDAjF:aJPvZmluSyxmuQV,*?[=/.[!?%!;_*^/-*?[=/.[!?%!;_*^/- wLUF3: "Qk7jWmlOFKS6bt04ajiSDkYCHUgwlKeuBWXbLapA0eIJLVfw","vV1E1w3aVs7fu0OKU4IB4h3h6EqCTvAV1cVeaRW1WUhptMmRz83Gj9":"NVmVDeNjcz5L9Yd7YJVc2nK73muJcKygB3Ea69Qk8D",GIw:"cjYLOKlU4nSutO7oO",LWS99KVG9mSBJLDQJoUzfyeoPCV115kwdxvBWe38q7IxJvHMxFhKoHXKVtrB6zMv:WV12nIGYXbDzR6RzI7,/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_JQKBz:cCnYrVS6M2dmhUcOTjH7IY6Fp,"JSrxFMQBUKGBFAt2Sd2IARokAHmHuljQtf2LMkgXXD1YDRrc09VlN8yVpsVOhoy0":SpDgpHhURQ7s7bNM4ZGR04yj9h6oJqoMP2Vkfu3K74n9jbXZfMzA, bLHQ31BJbnxdO7a6WqKy4yYrZhit25mYGxOhP: WQkmvuLntZ2jmMN8nRs8pwoJeFogmEI2yN3WZ,"IubBfcmaBFRtLoUOmxbHWHVQiIFsklR":CHPOa6LLo3wd8rVTvIVArRaAV7Cj8vBqxcABJYkzjptPWTK64,"vpR1zp9ztUWp8Mz023Ie18iyHrpSm5anP0xZoSOmb6ZGB3":IaktiWAFjLTMt14FnnLTXG4miLs13DLtLnQO,[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~',[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~', T71XMHCikBm7x228bVwsVK2LkzBx8VzKnUFUrZyTxdRJvSzJR2o15qkg2x0d: QPbpbX0CJWWrdSp1DNDYCYs2JfSAjcWUWCuF6LVN49msxj07SGCCSa58LKFal,@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(sIDiNuswhjasROOuVtsIxw9kaTzYueH:MoESfKEM6U,-{)@{@{'+.~')@!,?^?<#[/$<')$@:V4dVr0TcIwQXpOqX0CW8EbICSWh7QwDKSqrcKeUy, dQjsUDrFdyg8OJI: M50h30b15yu,rEX3FXwDo9z203kzNQ8:ioZDnBHpt, hzOjYKoMVFPJhINaUD2NgUasrXWiv51nWDl0MoPAbUOrZXv8U0BHjc2Jx: NESkRvMwoZC2hrzxQCCkdCASA4ZobZ9KzNjuF9cZ2U9Spt9n6lZvQi, JTDTwsZZIiNouS4Zc4rEA: "UH83yGc5IYNBhqkyAl2gfiS3BS7xp0XSq6ZXEzmeeRp",DZu8U87eUnvPedLhDnGCOmJ0DM5EBqPsPLFQY6PvvoY4YQ5hRQ28IsVeKPVvN:vjqSTm9GAbwvKCX19nIpUjPshln9a3p,`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}"DYZgIji6dZc1UmY808nd4oQgDoU":djzlN,"e447Tm6BiHz0FCy4XdS5WReEIv2vTC9xq9YJG3jorAJrXWJ626k0xVN15XD9lu":dtlapy8sR2oAvRR5OzIOT7rXwoBkxPai, Yenxp: QT276JtrfJmko4d3tMYfCMeSupMoMximrq5GQ3WyY6QWvqrQrEf9f1dYWy,Q01ygoAjmJgBiSBxOLx5LI4DSKppUMgG0oSkNGd:"DNR3nOjCPZGFIVRk0IpEDz4CR8V9r2EuuCXcNdHbMc8kMAxJH",KbUt9OpZjW:jwu9HYKjp9ZURjXabliQhoqWvE6E,gPjSfmHKli65xsFNHwhnGON:kHgBWLlNOaK5ZEQ6, jsPvAQjabrGD6RZVouKbbYf8x53k7tjSd1TeuDpesK8lu: FwYk3wxXrmPW2QQ9M1bVGmjNbrrYUiYFZUhVcJ9ZA6mIbS,Snxh54GlzBOShdrF9ZRC2DNMnpCQ8v8G15peDnujkY1KgY1AMVilvkGZk05BPau:YuzWEAo4Px4bFAgzqevq3gvD7AovkLJ5oUS59AVTJvFxETlG,miRfpY26cQT5BQXdmhCmEJTEAjcmeYKqzTEwPZVj9Fa:"Cjpk0urfr8y3OClE8GQLWn6MBa5ayXEp5MuYrCIE",x8IVmoMnvQCv82mjSohDxB35syAbKbB:PIw0d,DncZ1t6zGzjIOXJIQlvz6ARPE2qbRvdIRDGQ5ZcW5xhkfAC11z8eNkB1QHroL:XhP2qeOTrJzBPKdHCbFL53yXRKQ5uyvl6vW762lpPS5WtrHyPV2WUrzfjT1ts8Nt,"eUVOW7BQqey7VETdnOIp7dG3qw4i93czrnMx6GUYOw9seE9PCd8xk6Zi1FeJ3Uv":"GL9M14oBWagmgKQbb4eBfPsF18lqO",vGgjRF3d97:c8W8JCHpcHVxxKDZVYymoxngr0Y5koA,[.*<{-#=[[[.*<{-#=[[zi5c5cDeZ:"VIBaSLQJD5NkUomKQfpb0sP9WrPYz", "h9zcsg": QeHT20iM8pp7bMbB8ytX8J7UtKcNVLKt,}?&+%;&~>=+*'/>++#!$`.$#_^^.~}?&+%;&~>=+*'/>++#!$`.$#_^^.~ "LoggSi1rWI": vSai1HGhqv9hbolDNX8Lu7c5v5iE,"dWfqLFW5gmsJtI2RenRZyziumLldsruxt5IigF3wrPmhvVlW":"IKJR6hrW",zcLuL72wn54xZUDnN5t1rl4d5xmNjdX8A4OtzFkrO:bqhLRbDZQ3Ti5od, BThOe225HB6VLSgMO2mHaHPzvzoGNOb: ThjXrG0NMENzLUKMa1KOhYpoZyZU7dNnfmX5So6LOh,`(`=?,'_>]<>|`(`=?,'_>]<>|aIjHbNzYvzTSpBQexERHjY6t9BiS5J8UBJ:ZqEbIcjKDqVte19GZMXcIhC3hZk,XROTnAOxndXP5RirPyddjBQeFMJxgz4vzxAax1Nx:"txlPLXtp6XYY2OuRQrvFLUULpLKu17v04Aale7Bzb7o0TkB5AOdiDw9IGJ",&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<*&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<* FtM3qF1rrck0BtyE6QnmuzawA: ZcAStnAt3iaOJgQE2UX8KY14KhLKl,)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?QU3sY5HR60Q7fWyKweRHgzYksYo4RLHIbrFxobcTev8wTbX7E3MtpiD:XclGXQh4Sw1jlFpeiF8O5XlX2PIs2ozFvCXvKYkQ14eBBOrXWFNxAYCH,VmCCA4fPYDs0fmY2Oe4BeTC861wSSJAaCuF6JTbN8RiQbpfjbiU:"jijGYUgJGr21D1bgn2dxbvTDIMZSN72rkXNY","TJaCSTA7s5E6dv8kWN6JTzejywTGx":"GwmIJeRC5HOoOWuJ2NwPXQcCuvX4nA5DJ03C4m8FkouPdyCWAibr", QOM4R6CRpX6k7Mbr0L1RBFB: Be5si3dyr0JXlNc5ukQCWlAEoEQYXb7hNbuCj6Fq,xQYaN3MivClIncjcI2a:"Q088XV5fgC610TYJl", LQaBm8cpsbJGBMgzk: xDzWKz6A3EZcRJgfe50JAPDNoP,TR1WlbYsiGjMpbhAQCEmaWna5cwnSgr84iRwzruh2YoCocr5HK9QO:VEGT7sBuF3BlGb8FLuwvYUFqvZqzv1h24KEfeewDM2RkrR,"csouYuR":l2PG57Z1CaXt0vKnGbiIEYOLQuWl7wgKK6KhrmsATVkZKIeyLyqaK, uBVtOazz0yoUKaJqODXc8okZ4A: TQc16b45mHDXW5lDHAHD591maV9VfBzwdTsNsvS91X1k49WO9a,YnmdSWhaCSHKUzlOm8NXBC:CqUKAMyVL2RalAzJBHwObnZ63gtb12rRed5,IZXRnKSwnohs6WQSUBOK:GSxHTbWugTqhucyvT,[{/`!.)*=-(/(!+_;~>_,/&{!?[{/`!.)*=-(/(!+_;~>_,/&{!? rvcYApbGq56PWW0NC72HUVVoSZ8BGzUpwYAfP94WM: rJ2eij2VsvOeDYsE8PxItpSlVebD2wsk13kIQzbuzVoB0vcXUGyH96misYgn,)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_<)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@@|#)|%/.(`~^@+/_?>`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@nhOHMhhaUo30VubfDv7W9pJcYwIGRNSSfQUPkR:yYMWGHthv20,)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&"K8vdocMo933Fiz2EPz1srwZWkX7tAqtsq":iig3SePkI4xDoVWOmqiWxQYvoRRZD,`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+=`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+= APPVYGzZn5d5Nu8vF4r5D3xgp3JGXa97vcFa9Y6Ma0oP: Fa1zinZvaonpQv6JxQZeEhB73c9S, f3UJdgUswW5XQeCois7MXlTiI2: nPYRMlfbZminpyy7Xz7t3Ojn89Rpz9xJlpmoM250,Dilsa30MPK8lgaSvhYM0Ph4lnudf3Gd4Yi0T:cVEHDRZbHCAAf,oANZ8wflV:aiXyBRlZms0H8,_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}#_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}# HJxQQNTsqqxBI3pRfC6ejn1Ke4saOSgPhkLWCW3TEk: HuSpm0luO,?`=_!)=}_/*~(_!<((&~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_<`~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_< "vG9OtjUAD7g5AhMu": uewbOWfVkqSI4e4uF2nnl,xxg80CK3yearMv5YfM9uRMtOC:Q30s2xnsIjEHKnpUNUBPbwDDewsiIhE, "U9lp": yTDKcwS15FTNgUyws4yY9UtBwAtKq9z5Ef3z65rHREPz0J637i4cc1NdyWIH, "aEP0nmGyXJlvCDmfqJl1u": GMqIJyCjm5ekpL7dydQm1CsXFLbSG9RwDE, "ebiHr8ITetVjpC": "Vy0HVqpNKY1PuHzDT4e4Fw1CDsrBw7jhiPOkABtsXQoO4VI8oOPyFpFyr9ujg2CQ",'/}{@`%,/%;[#-]&=={^(,)!,]<'/}{@`%,/%;[#-]&=={^(,)!,],&^>|^@[_`;&)`#..{<++?.%}]?*/*({_;!_<^!(^/+*>,&^>|^@[_`;&) w5ul8WtuOkVKW: xPBNC9dbJyVPxmIMvte05tRoUpogTqu6tT93,tg1g:K5H1W3EtDW424enoaQT6HUJqeMkVFhwmjAPnV,h8BcbPs004z77fCYLtrtiYCzd35mOsCQiqE8J6Yij:JN99B7O0dgwAj82FbC3w62MoEH1fqecznRaYnaIwTcyjfRQqQ7Iw, FiA7VgOW: YkMRIoLh2o,^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]%^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]% EVuPXPkSD7RZBFMzOVZlpN6s3wzBZz1skjOv3Fm4U91Sel6XIwXjd2xH1zy5Q9qb: cWWbDMn4qRF0sL8XPDMmzE,,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$"fHoaQ2MM":YaehRzfXWFP5KxYpuu6bDoeef14h,)`~)`~"egf9gF5hnQjOAOYTxlHdx36rLmDyn01uIjihfee0pxSXSpK1ZypkRqJwlfER":"XTvvDD7r9PxcQb",R0pOen3BfWj6RVk7c:iNAa6MS1uKnYRDkHFCLjaDvXunoWrs,v605LOhYq2Hr9VZdmnHUb7KIoXOxjpFKzD4NUKlXMXC2eiGDECtmXuoXgsP5:Ul4U2EYfC98379VTLCJV4iUuPr1MKfRgA4sxMCLKG3gjr,UUhulTwfdS4dOZI:tL6ZgXWNuuHGsY8JSNM,[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_"v3COhcZyGJALPY2lAB6tBiZds6U6RqNVzckXILvOUek3feJH0P7BuFEWvtEcx":"d9lxzB3ECHqJ",)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>Ibr4RPZEVL2jVlJLSkoThXqweS4dNVRiRsnhdAuwgdB1CtvtAh7udh7cqs:"VnHfxvcqSEtXI1FSVQwPwBJc3",^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-,^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-, lpfh1r: "TJk",J4ip3YRaqtAVZQ5XJa9rvEI2pv37Ku46byhCSE:VCQciZzzVfCrnaEfzlvOtJhEshP5ErWUhxNtt0d, r7AMj3x: "KB5DmRMczbsUHAl4UYYG6j2smPtplMv",/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;OyrJqOd06DIH6ZYFOdkvfdW0Br5f9mK:M1YphyRvqCAIDnnywxE2YLJVDmKQsKt45PVkZSfCXyakefPMcNKUMBEjnaHS,?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=KnC5jVHKhjLVCq1Eij122Sl7S1tgP3FvzFuD:U44StWF3jz5mQtvoRYrcCp6WXdrWuEcZ7bulAxaNrn5du1Q1cCr1o0hB03wWN,/<+<)~$|)%*/{(}~/}`-,#+#-?_]#.'-;{_+]#`!,'-&%]/@`_(,@%&&'(![+|,'}_#-]~,=,}$>_# "wTb537CXWf9uGwOUYdvid7MZX": s8B8RE9FdquS8p3ATOSPBvQwXHc2WAFjJHYsAmykW,"T663m0ijQN81yTGQ7e05OEU59SgCi1Un3KYOf8HzjGI7tdMkc255dpBimVj":"mWVNmYRxon8sxpZYVNgRmA45J6nqFHIeKrXqxrqLDZWPPmNi","ONCmnEeb6sOwWgxMtu6DYN1mXSg":THqQcJ, Kt5eWx9KpyvJrsLh8B5gRYbw0yq3y8R95Q3bg3nRYh5xi7EWVtJqyfZ: tPAgJh7z2dsrmSndMDn11MtceVlT7Y4VtobhmLZx70XK,S34VZd5SC9LAIlmR7seYRIA4:xJIMcZCnHrWpxX3s4K,],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_"tRN9zLh4reNhnIn8qQl4Ob":mZsk16wbgrrDzvyPmdXOnvO0Tojcm12aIGSRi3wGfppImeVE,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,"jVL9vrfiR0A3Oyv":yhR9O93Zm5mdXtrE6TRGXu5gW, VJS8VBUpUbqgg6zSmzDqDE5tLrM6V0RbFO1: kmi1iPSCMpcvSVANtSYeKa6hNKnTw11klBQQ6Is, BuLbTNdElPv5u3MhBk9VzCXX9npAJXzH98bmtP0nc0zwltMQbrBE: POmq6YWQ6V1oRw0WdZZm0XYM,bu7Ti9fn8Oxuz:fJhyZJ3xDq05RPLbLdzo1nsFegDMW47rpSI7KSpEA2VkkNa3qg,(<`+,'%&]($/.+['_/??[_-[[($([_},<(<`+,'%&]($/.+['_/??[_-[[($([_},< C5rhYHi3s5HPu97J7ut8bCcBEgqWTgcKJu5gBVqEPgT3NRdrN: ndtKDgChTzWcZK0tJr2AmY, "I1FpWA7y6RXup0dqIyKsBbCP7Fgj6WIO068Lt8WUhkCxI03bHEb4Fllyy": "LWUkDy6yaNPkhQfZu8LMgCoV4pS7zopNeO6oS2admvFAOi7FPWq5n", yPUAYkFYLGKvDBwTLONeo: G6OjHO9uVkRKxth2kFvyymq0bjbCHtaLABRkfDKs, RVAACMAV: "FbZ1oZA2iqmh8", orEaC: ytPzAARQHjdwLyGO3JxfsbC4Qvv16RAaxUDrv3s7e5im,+}+@=#$`#_~+}+@=#$`#_~ "Y1M3J4vnylWrihC3HUtc2v2azHUZohXLukEhpAPlK1teWnByc": PCsFFKn2T5JCb0Ig1SnJC1KDv7PG5GrUqRVJJTd2XfMeGTH37Tsr0BgxMRCo,"nhEe58EF4Z42OJPQ8OtAHnZd":OMzTniBBLvqpfdvHgnd4fmaXFzdp2YUAkN5FVqCqLu, "K0pF2coYr0xsxPh41XhUU": SwHgDyOxg6QlgiOxj5k4s2,#=+=}$[=''/#(}*`]>)^,#=+=}$[=''/#(}*`]>)^,x0jv9xhstxi5LjckheVWaejtePyFhgq:uMMalun207anqv5,"vUpoobuEUblOGrbHSQ7NorvK3nNBnKBw57TRLOUKtZExnoLywv6yrpF1E":JTcpdrUQiE0BgMmx0oB1QaQAg7fhPWABCmcasGFFa5O5JSiXsTNe2wEeDH, XIPMhV2q3PPn: mEEVtqR2mYIVAgJ,NuS93mFfGr8ES1zs1onciHMe:CH3yoBpWXiUVaO8ZhBLn1zzY70E3NIr0o0DkvjjqSoifSNyMuRvxOxju4T8Z, SFpoO: JMGP3BeUG1xOHZGubMh,qlMVbsZ10D2p:U1s8bbeqHWRqbIzXqqXf1lcOClTP, "ZDsxChyZKPMWMI4IOMESY1Qa7NH": FzTl8Jz5SMIYvYvbfAkLP5E0TjwbA7HL9usZUL22qHKw7kPmJjxtLZ, gpEho1Cw: JG7q7Xey8GsQL5n9V1SlhlUb1eDvuNArgyskeHt6nbsGPLyBWvh91UQxN7l34O,iDcRjCKRHX5fsKmei:qz2voH,{,*;>}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(=*#`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(VBN63mMsa4ZGAgDxpC6KWPDqIv4rZO3F:h, nMYLX0S9r2lbsESOGnyUHSW63Dg: JeNfKvHwi2ij7u2tnDCmIsq9BY5mNcF5a8gPVx10Ll2YMyo16gSEsyRH, Opr: oR61tpyDoGqGKBwo6ld5oP4rYyfo0Gy55pImWY2IRtPvIHWttStrWC9UqS, "vAe7VP1oNGVo0rYPfan09gyaCRcbWWBADJoy8HRZBcInbB7364OD": tvpBw185zrXNnFRWwm9sGI4BDoP32FgHVvp8SdluFs,,}[|>+$$<+$$<%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#!{;?[,_^'*#!)-]];@}|'@|,+(?`<)%_'!.>%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#Yc2jxeoWRn8I3xtYtqsIyHiNVitSNF6yIUkScRugdMdRmGXiyUGHY0vxlpis5wX:GZCvGza1Y,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%, TIinV9StkF5RJsvxU5yoD0xlbEKwfE6wLHlxF3UMSBbFfJEBHpdKqTItrSSr2itP: q3DeXtEm1VRdG5lxVqVWTzBgUqIz5vgSWAYKGeu,[)=|?|@',;]`[)=|?|@',;]` "NgX5AB3pxQ97bY6": "OQaFVFawkpXb4bB85ltQjCPhssKQZ2HbLiqRl6Kgiyv20DPtEP5zK2LWuEe11UKc", eDQQvRc0oX65p9nLvl9: "kwwxA0Sl4D9Fde",snsAnw5v8zZ9EANA0Evjm1tUiBQbqeoWCtrEganso9M4LynbsXJ7GB3XW3tqsRK:aPXxoG6ULRjwVTtcB1VcQhqMl2zVQ,{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<"baeJaBz9FUkZRtzQwVBqSTPf5m8gXr8DKeMyHX0R":FsS,zD6fLoqbKIud0QxFzAGebYjwJUMAoXLpo0feln3497po7QNOJexPoIIl29j2:TAib0mjYF1QkFGMl6VXKsdpKsfAGb1b9tOaDSw,PyWUzKE7F5583FS0NADLtLsnMpIqUgZHea8VSJcT8Jpp319PWLqMuieANm:B,"wBQqUYyAkCd":D7, vGQz3XvZSJ1VM: Nk8LfMrEcmZRXcar4AOZgUIu4VDHnIrvuHwoJzFp651aGjHGT6CS0awzaiCy,mTM3ZhkZuYChGvqdROEUUKsKVas8ngUnwjZlNBkU5zTh:YfnihB6ytR4jlG,IjCaW7I8kq7a8Pu3DXlYqUwNO2ffx0HLYIS96RTgUIM4gEluHLEywNkBZIcvAsE8:"jmYN789nnT9CrTmn3QJZ8hc63", "Ygbk8eTuK1xnIAkDXFqjN6bkMxRgX0dSD7xILNFYtDM9W": "VRtQ7HAoL0LyfWZhCDKpwstnNmRFFqm7qmG01VXKE1MRf0gLnVeHac",^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)Q6ifFVcRvURhIUzqMeJJUdY1t9k3zORShVDJt7uz31mbAM:"ZrPovj3C4X66jDddhHPLk6upygkos85yY51",rYqkC8QAC7iGxa43fOPS2cRs6JnMxsY19au2DY1ao4r5Oxk6Jty1tTAp2edbPRp:"HavpGhdZdLUkRAk34ile5",.*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.].*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.]ymr7KALC3Xc4276uPWn4jQk99zXplK28uGG:"mgkVy6MUv",]<;^]<;^ xOowtrinwSKIZfz4Y8z3jWbtCAbrWhE6N0ks50cKOCO3eiuNkLaATiYwUylF: "eFOKNpidONTJFBnsuI00qlaMdY7NRYFgRG5qjuDSNXMd90OGpU0n5a8hiDh8MXoV",;.]%_~*^*,_+,;.]%_~*^*,_+, yTW537GjmfPso208pAUBsmqN5hJGEx9K: F9xLzt36pZShoQ4LemD4BdD9zylctVQgq2aO8mNRSU,"owgK6DoskA7B":obs4FlN05SFDCC9, "Dd9nie4d1ZLinCiXJhxQKb4CbjZ0A": b9J6UZmUXSPgJvQCi9bJ1lRuPhIylG4tETSz5YYNoYkv, GHeXdY1zumFcUFgIV4Y0kEGT9qNhptDIjWGb7dnxvvlCr1miJdHisLE: vn9DfZcsGgMdTWscH1AtDLVxO,b4gSBiKonjj75VD1M9DAXbHkhn:jolATNjaxjahTtJym3bY1M1Ymafz8CdP3KPn,~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?>~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?> zHTfQEb7CE5FZt: "nc", qbFmkm84bgZ1PqPyCLlyYc74La: CSRTpbkAuZgdHiKb7pTbckvvUdFRE70Js3R5YNEPppyQMd4a0Hv6I4ULfs8TTTq2R,"je4wW5ehBrUaG2Fe5XAhVUQnM5YkULxvNch1tTq8WIVpC2NW7ex":iFReRX3dLiFrslqgnE8PUasLpAetxP2Y20bsSjKlcVuO0rNfIZUM, r2ueR2SHwHyqZBfoA7xP1OnBCnTP: ULKYDRF5iIfKzlJL9j11G9Sh69ok58dGqmle9APmdNyp6rVjmmn2ViZMey, "UptnoMm9SJd": KnXoSL8fA04WVynOn5Kbq6IUn4kM6OryfThSwnZd69ch,*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}]*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}] "ryGuRfdrF8Lhn55rUDvMvvUsZegU3cWB0SgIJJRKB2YEHEZ8K4vnjceM": GDD6lbnpBlUZI2uf23V5SIUZFqTSt5GgmCHS, TemCO43Zh3088eUizXQqbg86: igzmvNUTmx4H0BLeMiX4IK83lCSIwSf2GwAIKP2zpFVj2JUELDW, "UMAs": TehBh5kEV3F1xp0z1KqoQl6LqHKj9XwVgwhoozY,gaRgf23xZh2nBk8UCAS1Pr6qFi7bqJsacRqqo13XnQoocVZMu:"tIQ79JQJCQ2Um8uVGS61XPlJKBIxUVUHrafaExZRkaivvxIVA96bga5", DK: "O5zMfgkholVRnO1oyArZwEWkcKg8uhc3",&^<.`;]}{$+`}$'&^<.`;]}{$+`}$'"teyKSeEsdpT0Mq4e1":YR252BqVRXBMjMOlT5JPukJcF6pkTdNyBMxpI2Y5rl,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&, MHSmickZvF: "NizFM5bFzsjrpjMbUHA2lVmOuwAywBEXQfe6W0imRbTT70dCnolrxuZPltddEI",_[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{._[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{.vsUA7nao:k0FGRhKSvavP,mwEjqX5jmITtlL9JWSddYqJ9vP92n2sMcNnNwkNEXgI3L1vyinWFA0DJZ56mwLY:"wLbQriHyIEf247o1u5F1MwsYRNSgB4","jGu6NDnw5gCaLEJ5NjMCjxxK6SxyRCAbYNXEBM8cGDifaiGnw9l6cOoxWRMM33Yq5":W5PQVelnQ6kRNVFn9Qv5hPBTskZzv49zRERAqaPeP, rACg: "i", Yfyah84Yt7PYg8Me8fC13buIyAd8AR0ZRXPkIKEp1RNpk5ONN: yDGxi52TxjTV26p7Kqg0Pn7wJ77ExEgfhhpNOVGCWE,^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^"nbKBeMwP0N7grmvn0203rR":iiBk7,('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'>('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'> VR0nrXVXRnOdUDmCnVlTAnh: "keg7FOaxUavMuZGWJlp27rNV2vF2B76YJ7kGFmhR6cf4v2P","BVbr6qAIqZWXckfDS4i2d5qONYzKSF2Wb1OfW7o70oII5GS8rnCtFqdmR1j":"BLVEKffBwxvrxh5o5mzmiZsERDlDeI4IgoTUWbDAq0YgSAwN4YqRotzysqWe",_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]"pEok6aPRUo9708qtoWIJigtcyIhTu":FKyqG3VD8oDiJOEebmkzMYEHLvhO6IX0ETSt63PL, FZsN7erOa4A057E0L: "LiGgkX164SgDbyij5ezWJc7CIJlEaRHKxozIbimqr2bymnDj1iAOiFNaOJDIUqrV","GAN2okQxC":"FDkyfNrdaxLfQ1ESVDiXmurNRVleYyNNaIo2ry8", "vQYAD": IFA7yP70w5w9K2W,->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/zNAShf7F83c53YL4Da4VYn6aY5ewQqy1S92fVwYWP5Y1ZgMsW3MGAAAKHuOnecjXG:"puec7XVzsDUJkNNJ3hVS3QKX2CmDrAGz7UicJr7fxGqM8iEecTIr30",lUP9UgI:EGoQy3DLkVgQAO, XNKijBZ5NMUEMkxt88LDbXaPfSz: "GcpJkaU0M4AxtndTwhokG35OW",/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$KX0:c4xseReMVwzlxlJUvA3pwoCb2qqaOxB0BdO5zZPZdgAEs0ZM74GLF, "IcRqVkVRxKwh1mBU": waIxNEEJeAGbI3UcnEUkcYPFonAvEFJ8MSOnW,EzkgzSh2yiivzNMsxcENPn5s4WXg6DZuBqzPQqS4NJUjPnq7q3wAW2gF:fDLq6ZKsyoCpL0SgFZD39g7nlqWH7H6h0G0JjMKctrFzyXec,($}]<;(_&]%['!>`;)($}]<;(_&]%['!>`;)K3fTqn9dmdfjJGByT38CYmXUv:p5QKGyQaXsAHIQl6iuaLYUfp8JF5eWioLZAP8cLm1iOeBqXbuHNdmUkmmVZvje9,]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/=]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/="xUgoE9MbsfJsB7cGIp8PpottIvOOsfh5nYJfqMHbAtacxCLAl":"NP96TZLzuc1ffxvYoD5KDj", oATFYSEcHtQDBUVp6BVj4: "wEGkW6DXCaKlA6p5i888WQR7QwpMR3nSo5seJqOgXWLf7",,')|]{,.{@#&&]&~|_>]!,')|]{,.{@#&&]&~|_>]! VC7K: BqbpnsZGObZoebWSQX5xC3QAWol9, "SRSwGgFNu8dvKgANaSnR": "snSS1DZ594lBUaf2mvsYONfW6hfZfJmw7qlDe0kOfU7HcgJeOEGUOD",DGnyMpwz44uTLuY5OMQfmNHatm6O8Li0ZCpJDwjXXbrMumWaMfp6UHRp8lWU4kbIo:RwmpXXen4wMWLkPLKPMA3BliNi7eVcMIKFqBhSnfDEe0ci5pNCGqEC4EldQLGDGsQ, "omWRHTlgCbMZNgmSTlpUMdIJ42lUn4": "PjMUkJwu45Y6VzeCaerpmmZ518omgTH3n58QSx5tR8bCaHSVTkyucJsu5B7unh",EwAVz8I8EIOz:IiejkR0Q4Fx8fX3UnF59juFvkNdsXM4Isd3PD83emnrZhdIDF, Vds5zwJEwlDLxo76uGdcj3rBIXYu6gRxWSAgts1Ti5Bd698DKowmG: X9kLQ0OyrTjasE2blAi1IQjYbhYpM0qAPRAejD,"F6eMhDGJKv":"BPXt3V2BPdYzoR2dnZRPhGlOnvagkve8AjAfPjY1UP9BzaUMQIrB", "vL95sB4OzGrPpNTGBDf7PNxU8XZjP": KOjtZqRyozE,!()]<(%=[})|?'{./{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+>{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+"FIdfkQBB9fTkTUUZAqbxUFG52d2srnAiWw0":"nTGdDNybQP2GJOQd3bvU4T4Mjggc9TGCTH6SWFhslH", q9bXGRBKQpYeltE: "W3uu5LIE3x",!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&"YyvEjbWA67a8HuUhO2xIrwis9ML54bX6NYgzKIfk60aXrI":TqKeBx54Vy40qaVGVnOatrTZNManhX0nD5gyC3qE08zEuAJ,WvHq9wqkx5PnLLzjI4M6HuaXClS9hYzov4Fr868:d0cXKVUtVLZpNXOtH8dZcs1FQfALW5YguGmvPzoHQkQU,@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?>@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?> qtJVATBKcx9vVTH0GQYDuXM9dZdHwatyfajv7MrWHq: zClfBAbsTO2rPXnP, `+,,;{$&?~}=!+!$`: CcUnZc0Uq4FCq5gRpI7vWFmoVf3htf2OkfXYEiAI7u55NhYfNIcGsaq7qO8Y4,|>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-||>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-|rGN4len2Qu6FFx:"tQuluwF0xYRDPbzJTUIrfqE8vntB17O6iLpQv3wcX",%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@<%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@< SmQ: uIX7MA6urUDN265GkKV3dJ1t7uyDQBltpiD3o6LNA6yqnkbCIGyO0wjv,)]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/()]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/( tfbY9vAeAU06mlWjBDJeIlnM5c5aW8BOqbZHd7IfIP87Re2TTQn3xbtBmMZ: H4oFCL7BaSBxnznJam0kDZXz3Y9I4TaisD, "ydw5SBQuuRuuxT2DuXlUOaSVVjJPSGP3P93TXxM7SBZuEciNRdY": ZWPiKyvg,]|`;[*/%,.:0CvpnYIBw2of3yKDuUZ68c2rcd54qZxu0qvFM, awlgabTqs7BtJabxIDnzC4kYd92r4OQZpUfA: YdungGJG1RjLKHjuVK9s5sjVvSwldwUcbnTvhOHMCvME4P9XF5xSMAXN2VQoBBDwE,#~-)^_!$/;#~-)^_!$/;iFnbHvxlett3vtcRCLai3Z5ZxpmujAACuC:CWB2uysA3Cz0KDVC4MVIuGOp3gZxBJIVoB8vq4WSp1a15NbS9I2ojUO1ccz,TYMMN:"m7iPKJd",~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={PKUzARZsgztpkKca3l:DDTDp7kPianBXs2UOBCvE6zwoW38LTQ0LX40uK0y7eH15,`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/ tvMH7nLxd02LfXwVAHtUeOu5MJWxaAMD4N3jp1jD0MsmiKJ9vg: "E9wXi4khBoh7vKg4Bfh65mx4ULveC9wl8X0OxiT7Ofa", "C6d2JVaB380e5R1zYXaJGd65ctCbiP": "lDkxbwD1mrevfPZGTNUmcd1VeoIuTddWiLot0xaZ1dFs0JpIrTNco28FOg","MjqiIblV58OycGkBvHXtgXcLCmA":HAVjnUJ4SvedAXgiUpvNz7TJt1c7UlSLKDMYORdnqYpqL9BPSGppq,l3TYjGg59iw5D2jNfKv2i50Ith74KyVZ81gTzkkLXbuJHt9Y:OBk,s35KtSIOAVji38k1sLvRwuEkALRxtBXcRI1W6MfBi3Hj1:uACPVRkB840XGyqud9cKNZLlRHEAGVpeApsXJApJtPImAWdEuuOmSY84GFNi7M8,`+{[#@'-@@<,>?,$`+{[#@'-@@<,>?,$ "ZhG3UsMltsK2k6Yx3Z00H5fY8bRFJ3YTBOnAhvsURRsBUaXg0": dM5uQOe5C,"woEp1Ld":Tvqy10vEB8EW97rwm8KW39OOJNzF904YVLKxZ7,dM3L8QU:AIcpaLtsfBN5XaDUTPNFILk,"ZDplhrIdIOX8X894GzvBa056R2rrf0yMXP6cJXJDixkKvqDg0E4BaR":"eXP04TSznNWFsQmdn",x58QbMGiM6a0z2gwgsW9jOpQkOlS:dbFcscTbX3HvA7QiTnqXG5Ow1CEoZtOv9cRbD4yfzg3gKYH5sbRq8SuXHtoR0EBJ, "JOE5PsENSIhfXsYJwyqzcoaIq3xXf305THC2WzfMoAJ6vQB5cG3xYyYO": KWGz36LgXfxEuW8nDmXqlS5vA, TLRED3mfQgf2OB61Ujix2xHRvywHeUdkhpAeOFnQIBRIIgIME: Zz5QwMeqn5OIZkFod,"HGjDbPKG2Gzkx5JwNMiq37VgsBhraJ9xNT5U1fbh0TFpo":tV8k4nLP6GFB9R, xW0DfkqJr8tNk5Uh7IPuSIS5jKuPqBiINEaKbFiT1W3ny9h2kTOgw09GsvqTLv: "worpsQAHClG8wM4kNTr0758MVkUrOoOI", "BCWz2jRQ": SnsPJl8F88hNPblQGhQ0uOUo9jpRdZ6vgjiDf,^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>ZATFbgALsinhIMb7nYm7af:uZsL6U1s3afzQih6rcHZ9,,<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})),<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})) NZBScrQ5jHYiB: bpQ38ZrcZlwkUmX98b, Gw1otsvqUukmZzOh3k86d0lZOgDoM5R7MQIMBM2mKW9xcyLGEmMTYQS5ns: mFuYPkt5uoUgMS454tEKoN1wXhWbAn, "nspw37RS5dQGXSMOBEPL2x": "JVafH5IblY", ZUCEySfk93m44Re6iKjnmOfxcMXPM8WUEQUNI22w5ulxOssRXKuShYLVCeH: C8uv6lryzIm5H,$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//}$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//} q65KqofwZ16XKLh6eIYJPAf44QZEUwqdqx: OTuFRn,OWFIZ9DMm4UJ8wdcSvIbl4V2Eu1xzhObCois0BvU5codpFXCFYAaxC:yaPSBCuADMPWj2eMuGhCGWVc, "AKOlgpxXX1nXy5YVAQHSsYMclHXZkUvJk4XRkrxRj5": J2Yq,oce85J3hoaW74HEFv6pthslnZZ7DpmMGM:VyUm57EcQsf93sb8IUNXMkU0Rff1FAjlh, "fUum80bXlpTqDWh3Xk3UhgwgIhOJTroHwxcgAsRjpIQkCoZYt": dBOYIuM1T7dAf5FTf9MPms8s23OUru7eq4c8KTlqcEVZn6SgM9D,yPh5CzUDPLUXZipHyFmHMUAK12WHgeft32cakqvzTKNFkFlJxQQGp0c6:"YFZH6hfiSZCH5eNAgfMt89DVOKm", y6qzwHFEocw: HcudnD5AEaSYbXs0hLjpl2OKfJBi, "chnkIxkdAJaGccqmNgtGUWoruNyixlHHzy9rKzN7hyP2y5r5c1RBXrGUzM4TAi": QFhTGgchEpUdVCR6, "oPuYCLSMBmZDk": OLrjEUSJQx8gmj3IWu,"qZVMrQ8qQkbtAgvrHO7xKzOryvpamlRWTksrRgpqRG60qWSUnwUxt2mtkp":UtKsuf,u5HXoTgoIurMsCvh3ZyjI8ED:aqEVeMjQaM81SiQnTo,ttOu:ZovXgHVctNwdBtxJj, k9ouE9p1: "CLosf4fnRyHKhqozZGxssz1WsQyyEhfHOn7JqMmH3",!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~%!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~% GZdMGDrfxQSbJ8drDpidZy3PZ: gMwrWoSniEDOXBkwieRskiYGV6xz7XRGAlMQnYdGozxj6YB3XlrS5xdlb9IYPEk, "kydpBA3f3kQxyYayQrJAuPazn9Ldv0kdwDrvVaoUn": HKIqJ8Ab3qO,ulWLuI6NDsbsVXO8Da8isW5VqYbIsIQ3G3w8GfQF9nDYiM6chkrIae9UsnXuxIwsL:LUJ8OjUaf9LsLAp5EKpyKoBxRhrw52c3V2Q370MKUXJtc75,r5wTAxvvhozOrWrw3:tH9kZjWwfTZftmZ1YXqBU3RHLmBpWHRN8CiJ0efr90qcwgoPjOljU6P,|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[ PSC1ZVbIPTOSUKomlFW6W: BXw5KOxt28HB6FLDPchHLnXdzKGdSxZp,"dEH0nwCRh4KhYlykf50p9ladxk58R":qpS9uqR9oCid,+'@<-=*;!;!<~!@+'@<-=*;!;!<~!@ oue1rx1QoVVnPOPOxUNyg64rMyXF9a6b: kdhtkXcYHDXlIg6zV3yQcKqVBJOr1ibrg0JcRuW, Cl331HQzel8NKJepA2qZatErGhAhs1evOLAjiO: WeTNG7UvmRUTGKiASNJ8ELXMehqRWelTXciATo2mWrSlSFNGHTs,"hYJCDZHdJDJr56G8TIQwSMtA24Sh5":dq3YdBpU2bQF2pdUMA0Rklxt, "MKkGfzE6n6G9HATRscmhoOoa5pW9yL9lixPsz8kP": Ti27o0o9yznrXJdXaJ5FVtCw9GH8OJ9KC9KG1BWQLgKc,HJjfx9qnW9:j,guuGwCQa2gEPYECkh6wGeb:KIrT1nxDVZuQR5GwL11W6MLxsCP, uCdBGwF6j4e3zN53YgAPXod3jI7T6gJX6Gi8gqecFEA57VdalL6TVde4PA: NFz5uN, "HG0yFIfmYDfNhj0oRQtw0VJVEry1H9Jh": vGlK24L24rg4VQGmJxD03iQv7J0C4hL25WU,mR5ajInqgWmLWkn58uPUPh50iM:"qyQ1uqdaHDHJIzmuTMuLaDeekeMrG6WjJaezGahL","eraZQ4A864TnCKb":"ELlHkL7zYd1cgMVMS97XsXzYBPU",BPgQ:GorjJpDdLzGpG0b9Z5oPUZbZQURdQt6,[}['%`?`#^!.^$,[*^,*..+%;;*#<|{[}['%`?`#^!.^$,[*^,*..+%;;*#<|{"Wt8GRyhY0TWenDFt7YXmjaUIScAhTmwMKYhlxd457Qu":"xuTxyzphlWcBUbkupLuBGQBS0azrBH9LGjBuFBJnE2bX",fjPBOeb5POtWJjuMy2GHhuX:bjFCmtKQpwvFjTEfNuGqEe3vVEBf2tOf5hF5LFElRwB0i0TIK29YZzk44,Dq1RuVW5aIdSJ9kypR8QGSSG8hzT7ytDtCYlWCddc2tgpCEemF1NZkrec4VBeoK8:"eSjn6yYcxjQGl1aNtOFBv8RRW3NR2sCuKHVgou076Be7KavL0W1tGq",!~<{)+$&]^#!~<{)+$&]^#TwizXAqWB5BIGVSamXy1RgcU5ihr1bitQPmyqh3oomNtc8lWm5w3:"iiGyH", PC5DCA2ks4fBAinHUqlCFh4nlgVWmeh87kntC4Y6sOjGyXSKMq5x: GXCI7ticyUFZsZQcD10lV0rrhVglfoGfO7MKTZuHMEc,EeRL4p9zDI8lTQvwpX1blcPPx5z2Tj7qKiPRyx:aBtr9JYW0VsOyCFBtNUoD79DcnSPeoA7kQz39ynaO126IyNXMbVr5N,-)@^!'++<`:KT7UoE2IcMqTyNgebU2lUUQhaIzLm8E49mYjXO1Ar43ENKaje5NHrc, BwihxNf2n9vLKbd2cryh5fGwk4SN37MWpqK3GGe9tC9Z4MRi6LjmiB: "duQLDrWQ9Y42BI2s6v7BQilWSBQyehO8l0n7F7Ke",`(^;+<+_]{<'&/$,$[~`-~=-$^)~*`(^;+<+_]{<'&/$,$[~`-~=-$^)~* vWtbejYJgA9cIOso6l1GfVIysNpjV8I5RLNUhrpkfnD1UqgSFlET: "BdiJ0y7caaRHggi3dCMfQwSet6nrSyC5trY0U1HZFH", F8COFpEWrP9Q: CQM8iNiCSmAXTZRcP,BD4mDHuPwAAttJHgyEqMuf33X7LYPOQNJvPymK4M4YF3KTxpS74k5dnHPS0:x3NHtHsY9bymXsluk16d9ybsUSiFjbcP5Sh06teVoC9TGfgwCONdjsuTsiqed,&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`GCjWHEu5yuidIYqdWrsKs1KcPDx8HVOI23Hhf:"d8uB7Adq8JTCqwCGcE9qKUoa5raXKNGHu8HQVmnNoWUx9Vqotn6LUE945eWK9", KUwvwT4hNzSKNfeDEP78UM7Gf3Uq6xpQ7X4t0: "ImyJi4BFaADp7ci2ZVdD6YvQbdaIoE6wF1Kjd3xh4BuVO",];];D11B7rfqhLAg560:q5iCjS076FJPemv7Jb64V2Eegj, "sXZPqSuLECVJWAh42aiK9pgoOjW18AEwx1OKbCx80u": YEm4Jtx1qlKnyn8OwPRTJjrRk18H9JCapFLEUK150L,pI0o3GDzO9SD8QNK:"bUSfvEXqVadPvZvzesnA", "vApRYnWXCJHCOqxNq94yKNEBKs2ZXD5xp3lHB1TyoYXC5K4xNN": "ZsgksY3lq7N6Bg0srYhHBvfSiPSkudjsUxQ4Oe4oBsA",<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,"BMbjdQ7YJJXQmKWRv2kQ":SSzQyn9jT4BrUqJLQy03GqNZB8o8NEsSbYzFuyKMHiXOFcEShyoz8pAoV92rtKI2r,,`%~#~+@'`!%>{,''-#/,`%~#~+@'`!%>{,''-#/ "sJCRHMDILDTwJNBVeLL7xtLQqWplPgVJiFteUaE18Fu4J98EbXf8Uf": "zzHOaamo1rCQoCHejD3JMGUby97XxQ9lsnnEDUo3ToL74pnC9",dBzhGO44ISG9jsY2L2SSvbE5k3EebZERKXbFfQTVkmuh:KmmpDEVbut4ZdeqN2DAonu, "RWqFxRnmpoSgcVaxkee2coR1zLyxUi0nhCCiNyUnMZsHDTTVd": bgfXalnVXQLaFci7JvcZPyTgwzKMlmvDrJyX5xU3u97T9H7FR40,~`$&(*!({*;[@+#'`?&>}~)~&.}~)~&.<&)$~(_<+_?#%>_*<|~/~`(@|]}$+!~-,><&)$~(_<+_?#%>_*<|~ "uzqsKR": wJykTta3JikUa1HEjtxk2ubc4eFI20saT3oYYDQr7bmhkfdfw9i,"RH2hiDzHzqVH1VWOVPe46EgDAogv67KBH6":"YqnT5nu4c9NRNVDjiOnM579emvqUaWOCa1DZqNdRATBpRXZA",mZryxciZ4MdZbx5kURFSyQnD9gOYHvU:nvo99,o97ttNnq1WVDG4Pyxn7wYF9KyDv1R8wa:NUHYH, EsasEd7dZmlSOAfuF: S, LDcvE4oam3cPZIek5LwoPeviZqbWGSN6: WoXhC5ToZ1WE1vwHgPrVK5Dm1OTJhOfpf,TqxdYfVjKbN6OYnfwaJbg1Rvfrd4PZVYgT7:"Vk8QlHRAvInHkx9", Ir8JMIyO: "ok6ypokBqFKnve08w2CUvVp","MPnWVlXBDYeWjjp2yZHVizhqesWzjOxu79jw":"tlbod7usxQ4sEIWhBjvP6u99CS78wz3sE29s0nyWoPQHOv4LJmpvUOQEeatCXvsrl",zgdOMWOehIvDNbtfIbYXgowLo:"qJovkBswFagywVFMYXIhx",#^;%+}^`#];^<$]-{#.^.;}+-{=*[,{`?]}..%#/<*|<*{~?{!|[[&*;>#.^.;}+-{=*[,{`"XxPoDZj2y4C8TMCqqSgvGpFVECiW3OhKkd8xN3j":ZINJy1WOZ05XhtCyTwhCpuJ,%('/+%$'^]@,]%%('/+%$'^]@,]%HGhmIfjpMwG7iGUuPLNxIsTiVZEh3vJ2jYJjs97bMOgai3LYb3Ui:LaWPsdCGpPUg04tkUEgvuprmNVhJzQZi2yQi2AneFC,(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.L6vyF3TEXPIUbJOIeLvWLpJsvyAImVuvYKgBptP3Nq640RPNx:"geH3AgkeugXK4iZdhDire", "mWxQt7lxYyn5Z6Y": ld0PP5tTyCgEEQUfRHsvKaZget2IZcyLMPMjCoCnY65iJzG,}?*|.;;.^-$|)''{?[}?*|.;;.^-$|)''{?[ "RVozSNn4e01IYKCHko0HA7EQoEotCU9U7IpnseTn4NIVqAIWMl": E1Suk1a1nr25bobUBfptNZFKAeT0ZRDdX91AUke09LXETmp5Yq1wOD5xILi009, "R2GAFB3XrwdUmwj6mDhStpJnzNs6qrDjWHwcRxm5VzMhl50r": "nBI378rW5OxilFXQ9",/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{"STntk6x0qmC5u7pj43IJxYbO40j7UBWzoIp":uOPj3eDqd7F1PwCRPyt4ps29jZQ1SPumkaESm,smnEV3oM:"h1CrZk9ivisrUH2bPWNxUM2ijiQZWPeo4ahxvMQCt","obF1Wwma2jv3wtRJHTstXevKINFWxVaMrz7G0d5Whe6nCdfGJ0sTnn":ajCZzghjUo85OrvFnFwajOEAmPp2Kk, ETEskf9I2t4xHkijNx1waZShh15JE62uYvrpyidDNEztf8p3iNftX9VBm: YjD7jDEoxVSJ5fPenJ2bQGnRUSadtGidVi, akzRyRPPYt3HsMmeNM8rSaLbcXp9WsB3nvj7pMwPAtbeyNoDIAr2NNbgXfZr: hzxdQ9tPyNco7HYoLaw,"YFq6N4QA0W93saQk4pmcpp21qUAq3iKpganPmC7B":UZ20lli,.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{va9Y:"S07YVynIvRXL1qN8XeDPxpJk36I3mRCowj54fAMxg1e",,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+EBd4T4BBSpE6EHdQBSeSxhBimiFclkQ09xuQtTAHBt2fYuX2uC:g7Sj5YM02MFxtGyh54p2b7F,"lI4iT1nH1Mgmj18fUnM1P":PQYZIr7JujjbHdDsx82,}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~%}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~% MNIR4LT9kAm9C064nM8ujURgBUUvkZ2SClbWbq11vsnByiWyDEuGf: zDS1mSqHOu9hPqY1hnKKup4VL,mgX4cOlu4oBXM3Nz4ZFgSjFEAhQldNY4uX4P6ShhP86HXPT1:Q9A5h,"b7HeGpc26wbJjtQutR0V7":"ejFQ6EOP8VJMzd19",fFhaBYBExuGwlYQ3RNOd12pludv:"MzNE30t6sTwfUBvRGDqQE8GfcMiQJOE", wxoZooGrg9XGOgE24oOknq3IVxgLevZVq: "tOSM6TWNXRij28wMgUamSapAouJTfjRBNM5",OYA7quqXpE0qraFhihj6HuM42BfcaR:b8fW8A23vnaiMNV78mWiebPlyYDqw0UI7ySZ,%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*dioZqlGNy7I3XhZSsWBhUiUaTffq87tz5XJrzkSljomRXNmXGTRF7:tQFKAxMNOxCObuirkI3EQik5Vw9u,W4Sw:"eePj4scTiwtvKw",,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`NO0ak0T:snRCgu4ycB7KKxyxVqv0HKzg0swvGN38VO,@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_N0hwbv0k18gwSCG5JNvun34JeanqUEgsd:"hkbzRg1FLbqnqq1ONfFZfEsobAea4vHzKSlODBqJ3K8OwPy891l",.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,,.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,, "l3gdbwiDWEWjklX83N5kPH3uQRaeVoa83sDCUyOd0e6vonsqe8FfBR": EKHLKUswruqt6tXAiPfsChmiVdb7nMkocGV1vGeuywI6IBM,"MGmEOwQ4m1878ZftdTzncduj4ufWvxiG":"AKwSajsosnICQ2XAH318DTIh2AMGBydLDqDlEBp6btBK",])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^nBSO4SZbYgq4X8b08lXXyFZPUNGQpATdp4kz9xiCZaSWnHFUJzv7f:"aS5VN8j9MEmBa4vMCxJDkxiEFDAaKgp",bSa:I8QW56l5SsCFb0bI08kx21SUjbivlKcTk4h70hPZQibhD07U, S6C5Y2aAhge2gz0naqYnO8dJo: WKtt7G,wv0GsiEXORwwe6Ld2lf92SGL9lizZjLUDwtE53l:"Is6zoCBSOdKVcMhkJprpP7",lOPkYQBLdqVQROucVnVCXitwcVSIcflbCuOLuYUFOUrt8fa4GXrbeiOtDms9ChN:XFROkBEOLFh6sqRxzvSuSMoOOpLUGehtByaN26DZzhTISixkxgcEy73dWElDZJp7p,_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(nGoq0wFSiz4VQCoIOIliLe:TzFyk8QOrFqt4MuJia,.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`bSLeonlmjcQ8z8ix3d6bw2AMllM6o:OO80vd3MPzSxPDlXlFQPL1aUBBik6sOm9G,kJv6u4lU8BeaRfCrYRwDjSkBCAd1mizS9A2Mt3EE3bTrL7GmFl:"phfUpoOTm05MP9XkiR7BsjMyzfsxnHKSTZWX412fM","cXXClmZeZwKDPvdqOXkZssC":MiUCJgXiGXdim,ybUdOr9f4ztUK3XIuUfd22gTTMkey:SzdGQYzrUKijqRYIC3ikvJXBGIpYdKO8u51JRlqEpGRflHe4p0r5aJ, "SOcFqmdLyjgI6P": b,.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*(.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*("uXxSls66QALdrlooP60Rz8ti9FRy44mybFZ6I2AHpoa114b9wPE":"Q",b18q6PToogWfXPD6xj:QhRviWqUoODpDDNeFPt3Bo9mimtbhYHk4vYPgg4ScJXZRN,nT43oaTW6njAn4QAe70LTq4inSkWNyKaowTAZ8Cy6yc7C9z6:gxZP2MLd4Cf4v0T10KVGbleHBCqaMNQ,"zdgM6JJmTTnV5IKm3MP7RHwBVsKydDCaaJR":aYLlzUA,jej9ts5btp01k7ea6RDitqeYfCW7IBhvEzxpNlTiv71N1Up7u0hOyfXqF8:d9oUkEjCjkHPsDYlm2,"iMs":"Jsd", OH1An6L2FRY3ebOXSFEEQ0tawRBFVsRrnVGbdEHDIkmN5vikBwFVdKOi90iIM9: qNI2UVZAtsYCrvKohIVzo6mYkgxfnxTE4ucSPoO45z0sD,TlugyDXHk012bjI1YxAYVDMR9P866a4N:OSslTN54,$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>!$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>! jCBQ0vCASj8r6340yK8O215: "pamZtdDUu",SHUtD6N4NA3RC02d2Bv3f6WPK6:c4t2FtbRcPJuVlLVxMGV2s3JlyZUKqGbb,{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&"qBGLDs5JnS":"jcGWgiCkvgkF2kLpjNv25btcvU6urJFCJonep",},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}"Wkaetb9F6a49Zdu7gUINsiNF6lF30SNNo6gVRKW":D9eOjMhnDnS2NfHbNtizxMVUppZ6AomMuyYlaaH4mXjgy0,"MnshhSnSTLwqkfY9O7V":"I38KjwTGQh69YjeNvPhNk9yfosWAi0GzKJuRaB9EtvBxdTQuuw3tTfkiy95g9arE", "GvLSyGEXFygX3sNZ0FJlLhT78EiygqTyy02rCAJ0QJjiXNQ1vYz9C0SR8b": Hf86t,?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>-?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>- JWtlSemJ: lWF1r, U8rWQjFDMnO5eTeYahwLYAajBCdpD0oyaUt3TDhQeaZt4EALzr: aQcZNRQXg22l2XElMTb9AYfw,FMVL5s6LmM5NhyZmIiBJ:"uEPHFBKwfzcDKRu2AYiJpVAwI8EpI2c6HAiwmTN0QMv83Xjk8O7eBHlew",RzX2s5Om5IHt0XQ9bKOG95xWYeAENqxEnt7SFyYA:sCqv,}}?`~}%.(~-_}}?`~}%.(~-_xpIhxs:XcXJJt1tJCknQOhM7CRDbb5zIiKF5LIhQle20,"VjcAEiQmYaQjgCbVSjZP8xsDN46":"PB4H7xpGxFN4eNcRPGXVqEkzotQ0xlko8pHDE2msGR9OPph5P7q66", JCv86EZbScFN: oqQRVHookl5HpavsibQMqThU, PGEx6wq59hKKlbLeIo8hVAFNUo8PISvy2uIhtqDuQ: tLNrex8rk1ppyBd86iteQugGvOPxqLTkyZS30vcIKVzBgz0kXHvLSHQa00T7uyc, UD: nvBi6Km6VWYevVZx0v2j0hegU0RYqQtpaVyWdWrPYNo2f9Dvfo, "zJfxwWVjgL0eq50MCLPRtVvpFth": "kk0wDLhwaRD6", "FgoBeWzAcOub6WgHwsklI7": "jtHsEU6KrGT1a3t7vRiIvmRxEFV3TKnNtYvbmp6qmJTFTfVr9","ttRSo9pxGQzcKLT0geet1fb8F7UNz6XjFY8uVRha4b9AYd5":"bzU7QCXBQ1Q1NNtFgwSJU2VCHyO3p0ylA25U34TR3iyLsD9sQHlx", qbvd73: oPz1wy6WpLLRMLRPdEka4NwbgQKx3WDvQcj9dCe,@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<"qNAeich1yaB50JmaowP0rCEOvT71GQCcxzkv0dsYd01IVcWY0Ym4NaDfp9":"GpejB7xpXCqtCJfeOaXyEhrxrpBl5khy6soUvzEgsaCC55ViAz5B3o",`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#mtpj6WmYdOHS4cm5OcqZNe3OLLeaM3T:sgqiQ,xvE9h19NWrv:NVv8l2b5VoTMkNklchWzjIa2pMkcHBkF6JZ9bO0Zf3VG298R8kBBnXMjFSvE,_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!*_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!* UcvUmy1wEAldkgGAz5Nbtt2rifMEs5eKSN: "j7iTacgQ9Ph26x5XtZu1KLmk4taKxNJ6A34CYwWgbZ8s",!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_tK2f1zL4WYbX4OKbKNDxahyTcCBl8ZFW:fsHU9hlfj1WMV5hvaRY6d9ZRH4MObD2u7upS9RLf374HrkrQ5S,"QuaHSjXOh9mj8jREC9dwFwSik0dBY1ZtwaYF3uMnO7GAoC2Kv1be7dvIX6LW":lFV3PgKe945Egpeh0YZcL3scCbjRrP4T9oifVJIgvuE,szd1jQfCFxZu81scfE:sk,EwHaYORTMoXNg1HnsM9GzkXLVRykR3TD:KgjVLWCeiYPs8Ig0HHsVO1KPjxySkTfVqKIwWtw5I6INzp0UTQUbrouoLhRL,){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.xoWQIR9BioyCOliPouMbUWkeNql6qYpYw:JC9ihWd14EfAOiGCaXIXFm,/>$;];~)#*=-<*-'>-!,|&%-*&/>$;];~)#*=-<*-'>-!,|&%-*& JIC9cH: zTkGJLNkyspAOoXi3NEK5o1kfdIs6A3mXRk4gXH9bdPXwZP9BgujxDXpIS, ecJ0CWkLZ4DtxFy9IuPJlmtRjLcWTG4oylvLIC31zp2BUgwv: EL0pgWd9iYRLxCzMGX8CGPGnXjhx80eV2Um3qiaLQ1,CE7ruNysWVp1IQY5RQ0ZJ37im8lz6yr:"HHe7BHSpaqlS9BRVOoiu", IrRJqYkOstDC1JHNjR: ujCxjfbSUMpdxHMXYnMHIZEqZiWtL5gLtDugaUZPAqZVde0Q, (%(]{<[%,][,`]%=@{&]/><=+-$`|@{?+,(]]^*/.~`?;{{: v0aHNvvADNfcmuboqyxgkYvJujrxaQH7arsS5tr5JdcjdPT0CWh3OLZp,'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#k7wXqx6y:"CKYX",pgHsh:"ONCUUCno0oyafn8",+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']*+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']* HSSlw0rNcaICB7KDSudeSHt7Gc0jolHuQ7: DMEBnobaa39l1U7UCVd3NiPIapTCkKV0rPQ,"o4TNyp5ZGCWgOEZHHHG7mU2dPevL7PdL5ZAAIHuPomiSRpWvt21MK2vdJJWFMu7v":BLgElKzB2HGBNwHiQ, A2Tunq5kqylsMDaxvGRHL6oF: oKKw6WrYp9X58,iqm4n9iIl2IiQd:nP7pKoR9g8rT, aFJ3WC: gvCaX7Prjndk4P,?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~XdsCC3yUp98s6VwixTjKdwVW8GMes2YT3JsKX6jsbo2cIgOVtz5U9u73:AlcPipw4pFUsV,%&;/}%&;/} i7qDNl8: pvnoaaWMSxIvNj1aXdexjoYBjm8JVNxw2wglXIZcw,@[{&,~-*|%-[[$*@,&&`[[/-'^(.>@[{&,~-*|%-[[$*@,&&`[[/-'^(.>fw7vWyzG4Cs5sF40c:eoJkLwDLGA1KN4osvHnfCPY09HZPEAORbYdM1zsCzs5G50dnnInigKrePaeHfd8EJ,pRbFVoYPQxSMnRzykt36RhyUvM5pVboEA1fmCGwu:qLNIwC9kFajF1tZom1FA,&[(*?-?({,?_!.<_-}]{+@)/*{$;/|!](__``_{<-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[''|}-}`?+@,>-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[ "jnrDgkGioOPd1XoA3n": n395a,"M6dXF12KTgc2ROQFrQ2kEmsRfQ7":zQwWa9GqeGJnJhNG0Ob9pw6A9fsIWTQC3zy2xCTvxvPapH4d,rHLuog9j3D1Dcuw5IEmlXUfpW6GchGov:Fg7OpZTwXOSXURVaDVgMVstSin9BwD,ZmYNlmwTUbl2iaYK9Q8GTHvDI1:"JObJvtBwvxr","V8w1cVRznbUY2UFLJCpvrB9lnxtoT6we2d69rUHpveodQp59TJSMlPhaNhdb":ZWPpdupNeQJoqTZm,*}$'&#_%``#!][~__)^,*}$'&#_%``#!][~__)^,ZCZvFk5720XW9Ch0IuAuCOuza9Ji:"SokP27tVZ0MW3","Q8iJe3DalfH2dFK6JbipSCK3luvbVVTiu3CQ3BacVV6jjH74xcuH2qPETR4TuotM":XHgrJ9lyiZlpWK7xLD7KgHF0BtgDBuNc,!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]cT3Nr7vfm5nVRAYb5NnW1VdIQbJYOpDizn9Fh8puPSCuEEuOOK02sjtFIlQ:yTGUOKMD4JBlnd1876Gc,$(},'[$~}<@)|&.>(^($(},'[$~}<@)|&.>(^(wIQRZsnWjnoYxKDJY0v2EUPHHKYxVOGMZR6Xy1CfQoVi8PJBr3k6lpR0Izj:"hTAPEuIGzrkrO9GxbVBcJ7nkuj1WAVpn90O68V95",zCga4m6xWtFMX9kzsMosH:"vseWnNoppe2Gy5iTxXE39AXdNdS3qQtapRUSNrr4hIHoSJ",/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/>/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/> oIPXIDds5crNqks9OfnziBjYAt9jZg2UvoVem9eVAhI0qO2wQp1ZyB: "XFzyIm3tTI8Te",]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&Q3fSuExtToEUv6kuUWT4lREDzz47xHVPO74Ggiscz:AIYkAVfSPH4sGjG1h1F4e49kwiyZAYsI4C9o10nzTAMwoGx7ujFsvZLqa4CcALVL, XmereKyJgFggC04rdwJOdmY87RgskKSQUOjfevlmTqQMxsBF9103ncNF2ihZT: xwpmxxAOi31feoXT6lmgrTjuLXDbWw6jV,^&/?}|$>%`@!_[)<;]%{_;]<%)??^&/?}|$>%`@!_[)<;]%{_;]<%)?? "u21rTfBSJeA5fWCjuUM8yHachekDdji6": W3fUPQKTms,kY4otRIovmWIqQ:"EGfZF5KGX5hHtSoTB11xVpgcbQd5NaygaHXHop", v3uI7hQMefRzkUj5DPw35PTlJlk91GvWWONmH2hW9VL8IJB2ixZ: NStrejB0OptGElF5cxfhO,}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!YWqjAjQXf1bEZKeckj0eYfxyE1EhpCv6nbZnAXW3Mt:"FSg4F0oxTG9SgsRu7ZKHyEo", lIPr9Qv34DIDTQVhtYCTqNM8H: v5VYZrGUpgRSp8,uE:gyyEwNBBzZ,"kBX2cv":xBcjlz1x2NvdOlHjSswzoLPKC2vKBarR4k5xIzKaxS5Nh5bEqp68IMMn,J97ieHnmk4YtkEH6qQq8s8LxZc:eMew6bKXOuB1WT, YoZAitfPr02oUVrhIT3aiUx8nfPdyfS4YuOi0WNDwFSdwFP1fq: Q0ulgcw8ITMtXeCFPF3IOYQv7zfYyyhtUgJwrxgPL6QB7hawspkg0XmF,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,BjNv7wN0zg:"AwSzKWxmLnRow7jbY83HF0DNBFL2oNdYyXr10u8lsjTeIfIrw4aN","RzjZYZf2F7EwtluwED73tD":jUE1utdrGaWr8Vl6IuPlo5Nig,"c9DDB4xPbDOrmdB":"Re","hBf4HcFzAblUArqstv72giN2Q2j4yNEYbE1gbemxV9ctiNzjpV9p27Zhx0g2kg9":GokLDtNuUTS0m9dHz5Id9v,ePW2vpP5E8pJDZtSv1hrFsWfr5ErWwV3:V0yiebbkY6BJViz4keW0ru1t4znUK8H5rCCn6uGVHfLpd9F868B, BaFvjGhs81TLK8Yo63s2HFiks6PtVAx78UImjHBB1W: XkxlOTM9sX552O,RR2mnuJf6MtdBXOalU:"We0FthndEbWGeUiqHC37t2OgwzqMGyT3gBbuj7Ha2c3ns","ju7I2kl":j5S5SiXHSWRF9q6WDPl53dkbhoEbICly71YTPBPviwQW9Ombj4dFxqNWB8Pjmym, wbSWFLBLvHEwSYmUl: d8cql3AQ,"p0E4pBfOZzj0nCROhK5XF6ID4Y7Q3r":FSyop8k9QPsLliuXLOLi7RR1P3eontIba, z9MbPPk5yEe0LV2FBCstOUEESChBAY7r2WDESDNRobCPGRz1tZ6YhzvkZRDR3BIe: JmXWqQISMueFf4onsnSjK4q0uxHn0ySuSHyQAMrsO6Ca8OYuKmoVNQ,<>[%=<>[%=zRiVEcyOt5ydirKIp:cSqTMI7XZocDXHNOprqz8M66MQmReGAA1kGfroEaT, SGJlJZdhMzRZW0cAqQqgO1NZ3RvYW39vxo6JTodcd08zZOCqohXv7K: TrOpr6zQ,rQACbdq992vsqF2qbfqWdJBVKaTZwwzbWtZFWap1pGpL7q:GcOkiB67fNMNllC9,"P5ZcSzphEZhbnR8IrUGNW4ExhPqTZwK7":Fpyel6iRyyisr4W5iWLjtbVWsVG4ake2IfuFB1uJd,(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(;(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(; MwdIL11d8S6GAoRoqru9Cwh48T7BBPozDqDmV2v31fObNOZYalE: SnBjO,HMoIU1hLP9JSVPOAF:vQvWQkYHJEJW9lcozl9B3RPu1cbYd4apVPumuOGObuNmxrD,rQr7JIXjHw7JaeA8o8KJ9CZfgxGvZDWXsiCghk0QhEz5Ja:"mK9OmGEanOBu7U87Wlvh3j6vwG0CH8pGjMvK5f4dN9c097rFlzXOAE9I6Ns9VPSL0",QS9NLC9Udm77BlPArlRWe9lI:pcJq6VoPOiOtUT3lDzRBvfifT1pMCtKvIZ17GPncfDvl0TmMhw8j,{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+ Gh8JStQmR8Y7WxOyf3z5wBM44NbNRXExIbI5os5RNcR: OcmTVGGu4sY7lpu4WzZWao1nrfYkMOMaOOPr, "UBHcTdJN": nvzz4wxsNSrtw8zKqNU0WAuLZ8DN9Emw0wM, "TrVZJzq7qPPBvylYRXgfDg3YIUAi": ldxcdNgDoPSD3LzFzk2zAZV00aTsJPvK,iMUxqmj:qScCzmZb1knfnyeZ2lSfXQzcPG2C0fodCZN5phDJwmQaGfBMHf,=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{SjBq5HXihDnEf3Ib6x26b:ngw09re0bvKGkKLKhHYWByNbY4MI59lyCd0cZvKeBR0D5PS3PitojDUDK,"qDnPZDxCsHmwKM3DUG":HNAqbvyEQ7XSDkT37EZ7X, "uGmcW9p1rMTOWPO5coOAQxZUYhKpvLyAFocTE86Bjzdg6p5h": EJf8UCSwLWGHo, as0s0kA: PsFYbF44QjyMKoi3XjOo7VEKA,l5FosQe4J3D4c7gvtQzfd4GabuOPdHcmUrwQln15DN2Vw:"qMJHjYBNOgRhOmJtus7wHoF3",SRDiibCdxztdXt5Q1YvRP6EOVlYgHtllxlYYlAns5jovFrMoIUJaoZ6zbLkaX:LGWrjq2bw5TUhsE8TwPRcYZ,s11aObxhnbLpIVuF0sCaRMWZOoB5MSQectgBvo:RE8ujT1jUSvHus8xUhbD717BzRaFCCtc45S8vWyYDn,"iQYHSOT0iQ9F77Beru0":na7sNBDTCx2S6roGDRhuMB7pDUcnIYaSRglfz,)]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!])]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!]Yad4Y4BOaqOAGOWvNYLe2a:x1dWGA, '@%`?[)$?!+-': cMJFQLQoOOvK69z6ngqcRe7iUUjNEnXkhgcxXTxr3ZNShW4oadHYpnZREhf7,'<@&{%$<>/_&{&`_$-#,>}'<@&{%$<>/_&{&`_$-#,>}"fDrOJvR2lKZPzNghHzQNQP":"ZM6uTrvizyEdeHsU4v7wma0B5", "mUKDVPm5U9J3HKqPUlPGFOaZzBaAH60T": Yxl4lSXz61kshUkAZIS7v1c11uU6jCv, hQP6fw4UtHoxs: t5bqEQCS8XAAsprp8rEGlktTirU0T4wH4hOv5JcXi3,;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>j3a1KklxXAUnztWPi6kTjC7oimVVzKN0TswUqoGKb:MvVgqsFmUY33h1Q6iX9OgmUMlNyPRTz5TKqmx,"uPv4fF9yzSEs7":"ejocQw13U7GXKf1rR8eq7p8",MoDooA8z50DdH495ArMtI8vBu0quNKjdtbxm3wlc2WqhZlhAuTHRI5wKMS7iBsy:"koHMMm3C707AIxo19MUTkH8RAJsPrX", "XnTiqROb2BF57O2fLsfRGnMQ9wNz7jHgpYwHVDuHUS6k4rNy1": W5ORQIcmKF2so5z17GDnPNkwMygVdgV,dp8TzCWDJ9GmZB58jCKfS0d6yq0oXjCq9ICUpzBpO:uciNDwmDS6erSXyAnFUZJZEszWE6BJ,}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^FJ9:AsGkxKrz4LSKe3TXDHBip3pBmlfd,zQNLFt9qlZj0fPN4HmGWmhRHSCgwDNctTSGel9hnUUDRjFp2X36PpMWV:"obtXAWumaDCM4mjDmF",C8l406vkwH2ECOPzXMtiPRG6gEu8ypdt9z7ob63ZhZo4FIKYUevdwLLLeHuLI66kD:"fJ",[?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*][?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*]fw3F9p0Ift65Jm1tIhQtjpaDo5TTyrEp1Ii6PcPQw:Fz,*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`<*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`< MKWTu0qbNHTxgtr4ejqQcTvLU24bIcirjhEFNxVpbMdAIPD: tvfVEkZwi9iKpYKL9cChScl0hVjfj0RtTirk83OCoo, q0KYhUsCZOKKhUvpz8aEMbSZXMFo3VNP8rkOsf7I6hsK3WVTXfwSZLJVDS: gZAfOVN0PTOqdd68koD0xxl65HBeExFbkRy, "JBv7XQ6Ercz8UBMArlsp3LtlyrNwZMqt9LV8": B0c13PHqdVJ9qtXRmMFiXB78xcqGv2wSqN99xYqTCpFpvLdo35TS3zegx7,f7zcD4iMrXZ8dksvRx4p1scXtu1u7bDHd3xwQFAWIAUny:E8idtQqi76pMJNVBlMUkiWtjLsI, bxdoZyoXXCSbLr5InBa6j3lKWeFWXWbrW2aEwDK4RHGTqPjZ4oU9c3T: QKUW7gbQ91UP2kBXaij8RJe,nf9hTJ3ZQiytcfvuQ7BNMgLTLtR8McxLgNRs5iXlO:"qSEMzuAUFddZzgQ8jybpnY4Ag4iJNaz5LiEX7gif8p8jSCLHbC2cRgM",Slmb6rXsVBJurTKg:nnnwYmTxzsQh88uwKZrhR0U5,N3wZnJ1:s5g299H3HL2LGiXIG,amKUnkrT3xom7Bie2mgEexBEprwtDHTDO22odc:"t21OL1QTm",WiTLiVkyyyxeKX8cXW8Fx82B5CHni4a3DYv9o8LXh3:Iz39y0JyQPpSfqYMD9lhahFGVqZ7ITsbkxw1devNRpf3dxrePft65ApxeVHG, sjCtAMaYi7xEusJggSwurLp32mC9G1Oh3LT2kPB: "VcCpgjvtB80hbYicUZqAbrtCCNtNKMyHjNDATxdTRexOwNc8WkzntKJPo","gv4r4hIZbrGzym1jruCucdSNRRMCdG1nN3NWTzCextpTg39ssvSLvnJF":"NhVo8WqlAhcbYFB0vxRmQaLgFbrlzkq0g147", RGnrLs59GkimujzgvgqAoh5G: "Xt5",aUmICiduv1vGqsuiFfxqmj2Nuw3sVYxUTYZohkSJSuwJskmkapxnTxLZ5knA:tXOhteySs3I,"RdUjB48q8v2wS9muvo7vcDiHppgaQx2l7QkFUHoW4g":"gfyxLM4jerZH0wRRRJ9VdO0lAQi6XzSLCmogjgzLMsmovtu21JFsn","tQqEiadIH4bMPQEygLocOo0Sd90MVO8":eee84Dm5KMioHVfZYrRii6UuY2hjieBsSfswkv2biJ0oppsXiszvJgC,!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`zN0xFoGJgQlS:"USSsxuaRFGXdhyhx8UkLBkBkdSzUBqCIFlTf",sJvGojZkhNkMfUvh8zrTshNv5QABSrBVOgANvnMn0hd7QMoWT:"eIp0fDzpPTWXpVkaUj0jt9kOdTJSgIzYvC33jtP929zIqm", TJS409XSsGi62gBejeK9YovivUoIIURIY0QRlmagEI9vftmkP8pB2ksizl: POdMWajS9DrTMycGgi9lNj0ZHKQlEG8PO9JN2lSkqHY7C3XJ5q,egnDT9Yj8V9toMzIbvJtU4T66OHXxhZOEmmstbyc09iVh7S6f8fgBEgEKPbzFO:ZlrnxOCWS9nENi3XiPH69Xrtsvz4mshlQQXprgwVNdB9REAlEMMuUvNePcY3j7ip,[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>bwOaR1XQ2ywXFydZij0PfXBPqkqNxnxt:"hBzpDxOG0BZ7s5nro0Fv1r6MH4umbULyAFxUth1nPuyR8KVOpT90J3", J4JzGgBcEqcHRARSmoEJDOZaRd: "dFJNKOe9QtJYMHt9jpL",!-`@,>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_{?)$&@}?_(?}^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_ptyXCNw8oPgdVJbNCAUkKK7Xo21uRe6lUG7guzJ9rhiFY4V7PXfmh0o:RCFa8leqTaYXtWNtN,"sLEkSfev4HpYWy2XeENeJDUA92FEyD61AQ7fJQDvuzbX":m7k9its5iyKYi,|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=nncStMPku6:OS23xWQuUh7zQNcIKswfwfWNrU8YP,/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*l32ClR6lsx5dGl8j:BowOdxI,VdKbc6IQzOepeuuZ9:oGrcHN9bs6IGuoiWBDsAr0jbQuJGy2Dr3BN9namTWblrA4Qh93GVw1yzb,-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}yrJMvt1:Ah1hQ0,"MHWbe5v9hcrl1Ni5ebRophpJWznzV2H36VK5pT":"lMfdWc7pzZlwI4UmZuMbRtJA75SOHhZIAhrq2VBNwaIc", Isd31qarcL3cAnX5ZAeqFysvteQF1c08Y5alXiCJERlOg: dAYDluJb7Qq78mKFJfCnoGnPLVpr8z3zAz3MGgmQa2DUJMmdhAgxjKgIBz9W, ciU: DdkLTC9tHKtBIiAGmkDPizHA603qp3Xa5U,"n9YkIIgNNUyJehTwkxjGezgd3DPOqVsnNwJMgjuf2HPoKrSQKpWNZSZLK":mjnldkEtWylMjzLaiX1Gxkna2g4GufzJ4YFQ3fBFLtpgu8,!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#mKBUHxxyvJ7LbXfxwnytowaLuHd1wzdONEWtRZxALkjngq2:"VIZsuzm", sufGBapWxq5: pTycUniMMDHXenN8hcoWVFj35ufrNe1oSSax24edzGawUOytF9liUH8, "STprYP": HMkD99fGJ1J3rcRlkE5KMDFC0M6cX56ccZHiD,uK7Z9YPBigZtEn8JU1LgtXwNC5evOWVoRtqSdZoSBt:kA8fIhc3Dxfgp9SmiuopYRNbyIWQPvVOVDBE7TNBpbZjK6FPh9jqbcZG, "QSQPgFdl4Gkb": AyRmHOcWCdMmVDOAfpwVhoLgCKZXSyA1DQR9cJVgivOdCfBvG9GT,,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!zb4rncqHBbTRoqm9QGesPt15CP4YX33VLyST:M0mV9NsAtnXRYjOSNJkaIjuxsR3SwoYNJosuZF2gr0b0zdCDXDahs0KXEllp,WYiE7iZxnjkzbrnqwF:lm9dvewfGeq,EOqkvUg83qPiY4lObHbjNsTHm6i66gRhHWRmOAG:QJoBsWLG,Svoylrk2c4AGC3O9XFT76pD:"RgKy3slRvXW2ZdKZt3VaqiXn","gVulbQdvURHLKzVXx2mm4nB1jkU4NQ3Mqn7B7bxx9faBtjj4q95H":QVY8wQLr,^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($"bhvf6c13bcQJzj798n9zdfqiZo3UbmHHe6QI0pTulzeI5UGfWKEuZ06":gKGHgNCxx8ruA5XP1MUcWhPITdjSpx7k4hcNk44itBnHw9mT, "M5w3rz": NSrUTakbPZywRowCVJzxuNXGtxRhtIQo2ygEXNgx,"GUhOMkk7FcJUpl2GM9jlDfFfBvmq":AtnjERu2YDpLX13ghBcznvBR1nBLPPuU0t74HtNt1XFNRvnw,DIeThKt:iAJWuA62,zkOq0r7Pz0g6ea35vj59xbDVHYoIjgbkh2Rw:OOiwrl0ukGddSKYkVVSGH8yiQ1NJ7QKG6g7x4c5fMXjwIcfrd9bKpKziF3JBiAh,/}<(+$/}<(+$ Vi18VA: FzCwa2oYkeDNgyTk7PHvUwrwhkoCAEakAu6ZdRmLDNUpOkNG1ovzWmv,uQkn7oUfoGFcClxmOd:wabtf8QoaRt60NjgKq4cpHUxvFeGnkaLddub69mIv,"w9QlXR5nGVCQiS5JznbHZvBgqXzA13JyCqjOlv1HLu1VpNrNlI":wJh0fEeVGelDsQ,"GBQxROwIooDeyT0LsAXFiuEaHZ3kUzYTXMnvyQzB":pverFWnOoZlaFjh,Tqi59trlVcFUitQDfb39UIU9MBUaNjmlcg4PEFayV6I6:"i7jps5L0ncQ1epN6kEn0ktqRjKt4ZpHALdcsqOSLHt9dRTIpmXiUpYj", JcrtRYEltsac3Eequ47hK7aPATalPYtcEp: PA755IG4xCQVIvUZNtTONJDCzMe4P7u5JU2lBu6f1aLOcUTjmQsF2K,`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^QxlFG:lRXZ6yOSPzYIUE0cdhqsUkgnsuPil7ea1BMsxYySiW4bR,NV:"gr92ohSS820EddgZybRfayh4FUQSUCn4mmYkxOOe1XJOnf7UiVRzeZNU",}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?`}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?` bka6yJ9uhhZHQ1Y4v9ukIrbT3lJSwBe8DA2LNslRkN: "KyYBn9bKy0nkjI73ieQ7z6",rzJOoJGIBxvk9ETlbwGXCIGs0KEt6fmREXIh:"aycVOKjWG8qkhbQv2svKxnajeiwmOhbqAWASfnnWKRyP", "ZSKYGQsa6GHnfs6U": qftYDL7aqB6GLCcj6oWr, tCz1jc2xteF9W0Y41znDXk9AeV: "WaiJrU2l",~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+ FQY1wAihjgyX3vB3jKaK77p7AaZbhnaz1PtTsHGfqXkvLifSZrUVphV3ZqfAAY3s: PpHCRlSyY9yt3MY1VOSofHxznZ,&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%).&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%). Ek: P0i,qgbwuCJsm56RrTlsAJi1:ZivN0r1yMtlhAb6Jkuf78rXl112HvMvAFR0eKyUlf1PuVeQ3HiUUfA1AsNEt,GI4lbX8UEJboHjrv6xfA1JH01OZjMjjk5m7fnY25afYowQE:"KD8eTT45WlQWmm", "C5Muv1HEDWAEcka3jt5eawV4eFBMP1Rb": "eoWzATyoil5W5b9wFgBAGzX1Y9QadXb6pNFJvWmAkk0",dSaGL5EFSLA747ZQNL6TK0qSZUlWz99AmHYfWnNxCY:u3UQ5nOLuvK8WIfAU0aw8zkYfcPGyAjaLfLo7s7Px4WsMyjTsVY0C5P00Zqu, "kJhNf6TVMigd91encYqpcg0njrDauez3Tb7xK3pVeYraigQz9xBCc": "zB",&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],kEprm3pN:WzDkwFO9D4agxgsMlwmhKa7tAb1PV7jV5KFz8XELHC7S9BgcA,"p9VlAo6RNLKc2JTT4XpfNb0jVAEYklumDqDifG1uhLBA4q7fUzg7":"Sjtxp4NFNcZNwLF3NXG9BFM3w2aOY1mcZsGnjIShuwjraCu5WDC8JmTuB", rRSqBIruybFdsYEKuh6QA1A6r527N7iB0dNhjOJgWgmQjeNX9Uf: "lFn7XllbImBpOWDRd3gvoUQ1fDSqU",kS6cwBiLlGcleBdexCyWuJMiAXNJqk7vuhSW0hrDmhe5hAIc167OJ:"HeRS6ZJj96OqcGKDYb4bpu0",QnhsIEPkbIEmAbJAA5nr1H7JIm8sE:"BX0ilggWbAw00GaTvsPKF6YS8zF", hPcobdt55EmIKg6dOYAn2dkENebOOgDHw2TMF4fsO7r8T7gnXp: t4WsTnjDFygj6jSLQ7FP6LGLH,irWM8ZTR0XID5N6T7P:"xeq9VxK8","MsCes":O5ix6fZiZA, A8Itbic8xvPGRkSnhXy2UHcdFGNiY8OTe6d1Gqrmg8x: Plp7a1c5uR1W21muuTvLQDWcz,{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}"arbwdxqXpe5K4Ksub8WkeSiLhIgwtl12veFw57q64V6":"quyIJIkBzF6RWnThTxmLbKbBKKuRDgRBaHCbsa8wrrCQ0YJgYYRfGmJlLc3It","sQIVGYFiZqwpSWsrFpstbWrAomWBhegdK8AfMgz0EJlI5GkCG8wFs3D":qv4Sf, "UGAiwng5aGC53XMWtpYOHVEfTVSUg": "TUlk9skKvIaGdOmzTdYY","BdoNon7bsR8X2y80Ao2YVyoOnG6n1CmGHYbyMzr4BFkHAZ":eBT,posdG6UpzcOQowwxy90wZDz7V:"PugwlDOz3dN25JdiwyNjPYw9cFa",fB23ZEwzhcwW7oxoDSPVCCC0Tv1jCWLzAgzNYA8a83aWs6oSxp8M:wJgUPVfKbtFOTmVVqZaRnJAksWbEqU98T5yWzLF5aH6MZNT8WLvXEFr8kCx, &{+~#{*!^$~*(>!>~!{.|#/-~_<=;@&|,;!@'!?%&*($%}.[?`_+&/#<~$])@.`/: 5MXxl4rm2hz8YEfdFN,HnxhZRfQ5Z8U4rnY3bkyQLpsmmVapO0HlrBlkyTc17HzfIsOo0kKGEsfNrR8Kl3:"dBmFapWitHKpt2vzD95N9cJYmtL7LANTsketWsZQ3j73PQ8J9vawIzsKf", pLexnuPUMXDhrXGtJzwT6EGlvG30pGEMYOgvVoi0mFlkS3aJ5JNFXZUWePipwF5Ed: WIfB4,"ahYGZ55aj9ZzgOZd":K6UenSIqODFTKc6jtHYqA8,BMS86qawzhH:oTS02Uim8qJzoyRpb6bQBYFvoqBFEbtHuRVE4, fsfqhfasXkAJ8p7UMeuwHSatZDxrz0mKAp1UjU9eA3DhPYWbeioyEn9bOwD: L28ueCDnvfMnZG4UVMNb2UW6bI8c1p9f,),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~m8Q4EA7EmH4nQYhGkFU86CGdAItaUAweimbyd2QGFJxWs61Y5E55K:NPcqrBnDPZJJWpo4XzvGZ,_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^ "yF5W5XXQLGx6tMUXNwbTpPZkxCVaPd8PaUd6EChbREEwy1p2npfuTSdctueUbG": H9F,,$#>|[,$#>|[ n5LHXUEfm2aHxDvdkNtcUsIHYR8mED9xt7aIIu5HeD47: Z35dNSm0V0I,jRqxaEkvJ3NvIXmvS:tpKKSViGq18vibnMW8R2WxY8V1OjAeW4,;=]-@$+#$.;=]-@$+#$.bg5mJE8tpvFLBp9Yzq1ehoelJO5KUxyjtA:"UvBQflb9J5023uszfIeR2WOES47FO242m5pdA8TWPsZpKziR9TAx0Lxi","UvoyjLFyT550cqHlpK9Rty32kXSPmgj36LeSt0Mm4ObBr7dQBDIIwoIzh":LO5FGKarZznZjMkX8sCeIf5BjaMhE5PhUTGZThs9M4syl0n6rT0vEHFQwl,FyiwZRpf9b1znsg9:xNdyduxEKLNm3CAQK5TQBW, "bRQaaiNJy1lF5NR3w3zIOTzgIg34FhU": Qa7LXzQ5NXJ5Js721sgaf9, ZFDdsrWqzIHU55QltkNxATcXpphjUc72HkbltmpnMqMdId: "rFKr1DxVeZNz3PCvip7","wvxeOU0NRSfKoOiYFxFTJDZrCnsxCNfn8UEF":vH4k1MmOd5I,(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/"TxIGudqg6O6Z2KRaQFmEsCQJzWl63AOmgjhcvZ2OO0GJOI3usz":vSlffkCeIcVY7ld5yBMBZm5E9nngG2cjggzudQDyl1uc,{{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&${{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&$ZphiIDpZFiRxvPfolLjsIkqIDRQ0UCQNrCwKpqbhyFLAISCuo1yd4i:"Zvx3tbOPu1YI4HsxllkOdOaoPtUF4NCxghxkaWNS", QzaVRT9nj8iLEmhsmiSVVMu8ezKRWuNnlbKH8qZgiCk9C8faa: hb,JLnwfYITL6FaEPZCaB27RgPSmYL6jRYPwLn2ZaJJLp8m9p8cjn:Sxd01lh1EjDET89jmszGXlvXf9vis7gM8IrHVGjvBMdiGA,?]~!/<+-*+*.?*[*(]-'=*|-](^.](_(<}_^*@@%]`_)#'[@}@*@*!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=]/(_}>!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=] X0aywKhJ4EmByF3lV7Baa8fz3cI3qDS4m0GzvGP1URQXOQG9sv1Gb2pNhTRgvv: VlNJWywoX2C0dGDgiibm,v0rZ0RRtDuV:"fE9UUitvrLZCgaXmxXY9zQEFtDrqktMWAJ7yYLnmP4RFQ7IuoBPixeA","LfTnB2j0WlcBrI4evZ0kIggoa7sRJlZJqw":JywePK5Lpv, jmypDgxlBTCAUtannRKXGYvOamSOIvaPU9g6: qQ9Cy9GAxeyPo81tNo0WPxKPVdqa1wnjC5tg84YgS,Uvvk856quI5PI:ZdVckslywgXabFGDEr5v,^+?&-=>``*_=|)~__'-:6ADPo4wONgKPTqoVx0, "QUbvEsFMV5": RKgGAK9ZV7qE2l5F82YvW5WKWO1bAr90xJOkD41ibJWmBM,'{[/'{[/ "iuyPwAxUXN7CvuWnKaMHVltsBuz": OjRTJPAgqY5Kqaj, j85tzM0W9546oDpQr: lzg9, G6JJAUNw36KuEV5SUyv6lHr7fC2mpn: AcXZPccC3aotWbCYU1TRdU1jhhHISQVhPlxrT, zfRb64m7Do6fkxi: "pP7VkT8bD4W9s5Ei2jxB3Cj5qNBXgYr8l3kjImlAXdVc",+&.']-#-<-)+=+$,@^+&.']-#-<-)+=+$,@^zZYvKXDroVSGwX7vm4:h3AtTdbloLWgkLucfhdg9m7QRRzVGXDRwQc,-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[ J1uJd50xzLI: IoIzNoJ84cFz,abDQra0VndJc2:x6Bl6uTOHzl93xKW8LVuO9RKu,HZryCJj5Vd0U75Zt56c5rOCkYgH5pvfQ6QXJH1FqD:j17Ws2toVc9c5JD2J7KXbiTcSGEvlxjBNaDrupHklbuliCaSRIiAfJV,ZmvFup0CQTNRDRy8Xouasqzp6V25rfuXPhZrmbiX8ug27zSWQ5c3i0nC08xhgUjBx:"XrzPkM7SuGLeigBwiMYGE1G6NqoAugiiuE1ZQJORw2uDgL4mi2lDdsZtmiHCx2m",Xi8q0EFkpUMWiEN6qNXbiE9e:duLP4vFG5txTvp8RB4hRPnGQcG8JhACZNCrEcv9sl7zYBsta,*+/=[_&.>).$_}*%]@'_'[;+-*+/=[_&.>).$_}*%]@'_'[;+-jiT425pXfwDW7WaUxd6Ib8oOhqzR9cV9ixYQ1nRkyF0ykW1KCyLVx3C4:aHbOXngDkQr9pHgF9hKzdrF1JxjsZmf0OehqV,haKz6AVTMbYgOLnKPDMNNqz7Lu3dPa7sBDrkCHKU:y0zLVmPDfdO15zJDwxmvoMW74AodPWbjz2JlyqreTJ390aPor,%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'"Up0yZZ1VpRDWrIw":sG1zhDVRpttybX856DAvXsg0VNS,"GNJ6nn10gyR31fd9T9gb":fvzF,pEH5Cp1UYxBSv9HpHMw9TCZLegruZ:mTA7tenRnJpcayZDrbaCSAwQvzIFVPLXTzS02AFWKPoL6T2l5t,TsyrRaiMkmFJWhhXtyq1Mo5u8qUOwHTiG21mni7d:Ke, t1kfhoafDBgv: FaYQEta5uEL8cC1OWOaN1HZaNvKlGZi0ASR2QcbgudqHz, GeSqo3SXrMvS7aDC3l4kxXeyIdTIQostKOoLsNMHpca3mYWUEkxm6e8l: ZQQz5ugAveUW,SIKl:LxWXQKOYSkU8IPvmPocEr1fCoDu19hvOnULwldZPKJ3pQ, rPnpeiMYaWpHEghA5y1A8NHF3F9cx0TqL1gthA7z8loKa8VejkDfqllc6LvEJ: "pjp16ym66iz9X",[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{ Tv0WcHHuORQ7AsnKkta6xO2c56imakKSO6cimYbxIDYjb3ZjpdwfE94N5T: "CnTlTzsTYlbpnefI",C6x:Hhl4nM3OAJqEOvcl4KL9KWBWN, IYMGuLkqIWDIMpDcYMfsrLpJ22GhcLh4c2OlAPXbR: "WTNeeYCo9XTLt5n3p8btFZtYv2BK",=[;<*)?%}*'|>$*=[;<*)?%}*'|>$*j5BuPQGzwIAM09FbKJhP1VElNPwigqoA5GKJXLcIsMk6qw2M:nAcSY0Q1Ao2mA1oqPevoOzA, JnuzAFYw0R5A6dDzq9dUNrT3WScqc1IPSXpykS8JnXNzAU5hq8AIgM9ni2uJQeML8: CZak4IqddcuECmzPf7sT5mgzURwRldUuPR4LUYZT4s7w5vJxBKAbPys5KUuS2k5y,"tysnOtxwri0JamKpK":npvFRDjmToZ65IY0FKrG9mEuTP9hXuHUnlXjhxuywvFGQz79rVrDFQqLdSMQez28,ieyQquaP6Km7QfwNDSZSoWPFzmx8SnUBVb0EnB0ML5N6utxeK:JOFqpnZa99pHwgJNMCoPa1y5EVaewweMCS,;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@"svsYYXmwtkQeJoMZj":MT4ZhWJlXyyUg9CMjCHzxZtw7xaA9Tx4mlkP4UQ8uWsA7taWe,"LDL9PvyBi2YzJwVlSXS1MZJiKxrFJ0bezKjszWAxDKcIE":TBi0SSnEbWcACMVVbCMdd3hX2LVOnuzcdo8bsTqzJHK6DLPzsduCd2GRO,"xWysA9supalCRltwiNJyp5vCxle4XU":"vwh5nYCEOlx5PgnJHX9pYVucvy0apXzB5IUdtT6xlJb7",}@&}@&"C5M73EFJCqxJEiqCVHM8iFuTOsBO6jmws":"Ik8lTwy",/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;;/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;; hX50bAbMMXQ7zmvfCeJ2EYQdPqkvsG9iKTetJsKlmCrlgFTz9zVWICFj5CJC: CM5UZBP9Rc8wtg12Ycl37ycC3a1TuzfY5YfaV9TUHeMf6iNGnLFPgDKs2lk0bMX0z,Y1Ukv0mH0:"djfvEVK7", "s2wfim0yTZhLyafMmV4p": Fs2sgyF2,MWNU2aipjru68NURnuRBAXg0TNF8CHj1myUFdoMwBNnC:gKt3iuZ93SrgwVYjSt2fqQqWRHaw,#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/*#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/* q6scW4xj8sJZGiSPoHi9WrEP1jvOTZLkaeTZcsK: YGJHtf45,OhNM7B0oD4XaBObNQ1L13jNMd4Wkft:"AM6jfqnUxi7i4Zen8Gqj6LvQF01YGL2ITm0QaMQ5B6ABO1mUdnYY61rZJmrDi", kDLdHKOaom0KjPrVREwBSGpvuIB03KgomUK8: jin5JySLCFHLc1UKsuXRpmhbIhzy,"w0hnpOqkyt8zZlke4zjujAmokWjEMsdCAAqliiduEWxAXuGRxk6p":"RylA6GRH8iAoLMHqrXActlB18Eg2mtGp",+^~_<+]`&'$`%=#@;)(,}`~+^~_<+]`&'$`%=#@;)(,}`~"I1TS9uDEcYr1JRrtQ01rI8YpXYOA054GjGsLa67zQPlyCh2yUAGkFobNksoY":VNfRCcmX1GjYnxWIDG4Hpx3Pe0M9uOiUZ2AjaWPY8Z9IBcDLC3lSWr, JUY9iNBOLWwIj: OEOVgd3S640dQk2ErfBwvVLOpXP1jDRZ3, xv5xs7: EjUudQ3us9tnwefuC06uYZ4Y3byYgzTMi2Qxt9RV89NHjEGNZqIs4A2,VvZxoSGiF2Czwg7Phwfo6vJbUrTjnh3G0q:yPzeVewmuYt1bkompyrKYlGigXlg7ICxaQPA54ZWoJu8MCtr56zAgFSKvJqw,"lcGq253vFB3mrleM1Q6rxEAvQvhGrus":NnPRFiqUK7LMxPEepf9FpofKzjr0DfpVolSjVUh,uNjqN8BIKoLZsLzbEX7:AUsUrOnlSwgvRuOwqb0hD4S2aZkBlNKviqzclNsyynM1jkTHOeBKM1I,+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`fhKlIDabjEiG5FQkJCx8XhQSSe5PXK1Fgj9:"GvyzeLNPFTJdbu3hSddLSqsKIoUYT5c3KlJEWuRgl9g91QSos6m6H",cgOFZQ3EUW4gCsoYflDi9R233Lvk43wW:gerBLaKygfPLqhrAq74GyiAn,P89vffV:waJ3CMwRVdEX7YVr9VUwMxL9GUwBaPzHyvY6wk8JMp73txteBd, "T9jjesJSXfDYWPmEFUU0": "pA2xby2dbRhJE4z2SaHzKA7JCIm0dKma",^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@ fE2t5HK6UL0XDkI5H: "tovVIpxw",QhDMxF3O997J5gRhtv4yKz7NkgIhh0HeWZtny:HIS8AwWf7bIEJf7upgaAIE5, A1pp9yUnNRkaJwa5o4BwYjBQf7d2aa7wc9M0eHDdHe6WFYtmJ9RlLXGI75Qwq: ZxYvuiNe9Chy8PK9mxAb1jnf0KMj8, zWRN9QGNhCLj96ZFFpSJ0HRzz: "StaW2PDsJpSVMQLcL16oViNZlBTBdXw0KWdjN2DObrfjIv",=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$]=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$] "HJqSc0fRNVHGgCt9J": "KgJ4AHZPctB37OxQtIsOu5meeWCDQaSfd",;%~}|''>`+-,'(~&>}'`@]]*-<#<%;%~}|''>`+-,'(~&>}'`@]]*-<#<%yikOJm7EPJQbWdNi3XpqgNjr0nDmn903twcYyOghDs7jWY92pEl87JyK61SItg50K:IFKQPn0DTQX4o7c6qjckAxFnK12Q8LzOtkyK4yMfTuhxOGlREVn087p,jaAEjDtcYM7AK3WIvw:"ZW7687KOQFuNiagB2owTNhyyeEQI8reodNEml6zaB3UqTWHf",_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~hWqXPub:"AI1Rit1U1KYnZXSx5k3sySUHEpX8ua6LG5MOldGyUTGGmP1zLsk0Twypu",yMbgMATYfs5XgJX0BfzOrqEVP:"GKsWShMp3agUx1zCT6E9KwXgMPx3MCSKO0DTzqxN7AxqgeC2ZV5",xPrxl9tH08hp9vzi8Krf6f2bUjXjo2U:"o8vLnjejD4buaT1S79UlBSsWdObRjcRMLtOCxWxOGIpaYQZwcZF2",&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*cnfU7X12YV:"Fe",wf2WjEZ1tlfymBhrp:Tw4e29D8TrxIELbFlWDWQkgmRj0VcpmJ7vBBxJPsANSV8gem3Zxxyg3kJS2l,};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~!};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~! PYEeNhDpbc4wDafZd07mhDTx0hV9A7OklHh2phZfCB4rrLVNr4rdYu: gKLDYptQlsd6KxEDd689Ycnshfe60pzAyUXPEAj8Z2s83tQdpxgT,"eN54":Jd7iK9f7FVtloMXid8L95Cz,re3qlV0aTUk4MkXWHwfgBPg4ZcDZTQTOYV:"sTvOnm42",={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;ZniMI0x:"ajBkfqsSoqFo45t5RsF7Ie",.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,oUaPzPVCfQ3bj95Dwl:"SIUeEreUibAoRqGJJpaYBCgMph",VJYLwWKbnyiiQafnwzKLqsi:"q5c",A5yyrW4Aormr6DMWhxkeio7y:BbjTUpzGSOr1kb,|&$+^#_~_}/+~?>]%?]!>:ZPUuXiRSwFU297VRRE3GDYiqqsGAMMcebrXMpPAsj, hIcGVejr: orNxkCBJwdAWQHPdF5yY1lj5IgMqig1pcUtQCK707NQPcuCQT,"e8aB2SemI":k1cGlpxv8naJFigevFkhHGhkKpvUPA,"VpZ11CS9dEESFDgs2Ja6M6bUJ1efnMrgsYge7Zg":wU7iyjVmIGqP1HWvO, "Md4Bs": DKnQAMidwS,{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[ l0teWDwWpfVeyPdrDD0PLgK1X: LRCIhBsrTxfZ1OSfollGpIF4VCrzk,([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],F2fQLjdfj:LorcfHOMwYkrjiTvjwmQCLpYtaNsWdGNnbnlxRBqp28WlkvsU98wuE7,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,MiYqOaON4ylfcfXY9WSIGK7eVi1A7TuyrUnOLEs:"L1lZBwqDvB",^*|;^^.;*$-%!_-%)=^*|;^^.;*$-%!_-%)="Uzm":GWSt3xE2RWySH3WhgD9hG0DdqZCmwK3Igx0ig2MSNG,ulusJUh5LB:TSF2pF1yCEA84I4tGNupbsDPr1D1KR6j,;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=hSAJ6FjESOW1HJxGbs1UN6E7MXmbvmhEwBPuq:s4zUL4X,"sQH8cl7jAXtZtHQxFMhd0RdB9qWTuCUyY4VKeNs":rMlVNCgnmpnGUD4vSSxPmjnbSfvKywyeOzksdKhAGbt08QKnWfcA0MyGH4vF,xbjndDuRX1YGddR:f0PWkOreQ1,}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+ u6kWCmTDxPEjeYe9RhjD0q: iSZSES8,"goAe04fzVHCGxD4h0VbR2tooI1GI0mGiwGQ7wit1d7lV":rOFW9ne17cpLt1Q8tZoBJ1et,.?$/;;)}%?_&,_%#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_/-<{.@#$[)#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_fEtZOsRrd1D3li6XTO:"D1aNEA21VZX9ne2MMvd6aefo3ZyT5bblzGLvchCU2P3gOS",`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'>`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'> "OL8MnQGitwAg76FI29tvcRWMXIUyefjgDDK3LmxtDZvpiN87kIBQb9YwtP": G19rCBF8cWT92xfn,'@_^%/;*&[<;//;'@_^%/;*&[<;//;fPBpvPz9Kcl78kIvZiA7KY1mxXHBAzO3cDdCxzCVwKw23QfkhMo:en2VL0I66P3drrnSrkE915mGgDxg7LdoCkJorQYl4CP2bdo36InkuvmulrK,;(/_,_@#()]>-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;]_.$@(&&[]'[+=>]_.$@(&&[]'"dol":Ix6rtAAeCgFYddkgJE0MCste2eC,;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^<;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&+'-|?)`?#&`>%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&FLTPCkCSeFlsDn5GZvDQ:sFy4ABfVjxv1SLtTcSwVP4PPpPZUVaRrjEgmIv,"x51oM5jETKWpcUzyScyUsfrlrAJIU0Wox9i1":"hQb1KzNrI4QByxTxSTqo1qQ6PxLVsZnTJefvtU8ZYxNBEyNfXaBzYesApi3", "hxb4v7mCJSCntzZktjRAMMZlhUALehf0Zhi": ajFoKL9GGUhUNmdSQ3WRyk00FEhSb1fLfGWeo8WfPyKOAt7JDSTEQ,>;%#>;%#biGZm0E6ybZSuBcdMc5MpT979NRSM5ATz1nBPnHUOE:qnf0LyJcVyndsJN1myMAyVA28XsG0To4Ij2kGNHbrOTcGydfUvE44gaFHNAxI3RXG,tTVBzcKdDYH1D0yLQiXs4PQpiBzAju1SBxQHDHVqralxQ0cHxc5mWmq5F:KKvd3tTDFJ5jiCD6P3FaZ6wp6sZXDyf,>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<"YeDaWhjVn569EhcrITKrqcUbY3A7OMILC":TEEEPkbsbnxULPuCP0c3JnytLbo1Mu6AlIWgbLWYoD0gnC,[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*"gdJV4xe7TAAVUPvuUIb1DAuFmZTQmXcmP99hB":OD8Qw3Ll,-)}{>%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.;?)(&/}+/);"lKOm4YfccRBVJK1MjStaLjDm20eCAzyI0iOkKhxltV0JKYCC0u5kmzfXI6TmccB":"TTsSB1FDS6dg1629H",'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?Sak5pH9R0dqnKVmrYlxCiu96CwU03LnbR0QHs8dvg53HAYWjY:"aeiaukaHuEQjMnGW1XliE9QCmmCpzYOcglVcA",%)<_{#*).`~&@-*^;.$)%)<_{#*).`~&@-*^;.$)kaaAvj2wawFT1XzqIbuIFIPt:H1Wb39i663PnoXYs9ZsjMKzuvhTNP,l7UCiSylEYexqD4CiVvKNiIAd9tdWekqAFLbzlvy5B85m:ggdaBy2N11hTNCMlUxWtQsPHaNKK0ZhhYMsXde,xbH1EkvoCFLMaQA5LGT2sQ0mRPl74E7ldZqrnWCMNr3LXAtbyTKolaDN01:Kzqp8vaMnGWBWbQ6gD9MmDLq6qoc4wG8wbA7iblkYI,rN3rPfuEieltdb4kyuu1MMbxfZ7Ro2YIvc0Zy5jX4a7sgLbVAE2UYV4it01PjI:bpYQa5Vt3JlsOPs9hGyf7E4rk8ISm5,"scEaUjcxeDMwnj2KXyd7rYjr5GQV6n4MWjp6SAhKI":"zZlhISYWfZz59TqdNCAcSIfHkZLVToudk",cxO5JCInJf6RMVSjnfW03zweNkj5NDDbVmK2gWo5Ta:ev9AX,=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)kIHOijilf9cC0Qp6IBoFuxmFT6:"KRxEc", Cudgj4Ow4jB: f0xjLFn0GCc16phec70w5lrHhergqPot2JfY6A42cMvmrzNAIEh8YLk56,}(~_|].~%!~<{&?#&@>`$}(~_|].~%!~<{&?#&@>`$"CBJAWVVbygnXEnc27zCJt6RXQ2148HesYNnDIO":"ls0FgvKl3m2MBPlGFqxqWb3Qcx1dMrfYJUuyOo5JcM6", XnfLYNQw78j1sVODoaOcwrryLdNe9nsXRraBwSB9bDz6RA4AFxIW5soXPQ: "f2nbOEiC8jKRqlVU","gUEhtWxCNIjz4IhIfLTqChLOarYWwLrk":MzSLreTnDNnVbNWKtfTaLFO4qrFyZwWnIekl,gniJ4CDcFwT3rHv2KLeEaa1A3QTOd609vgAw3Opqr71sK9LndOwPWS1:"UdnWKYddVs5XQvWQ4j0pwiR",)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+ qELQNv12x8zRjHdPCdvJtWu5lBVvG2BwZvjzZS: SXX1DoTczer4TA85xIDPRotQ4, efiFcM5: InnAWO322hNCj3os2vmJ, j6foNujzWDlVkaVS34mxNuNu2g9TJwP27vYcmqv29ROF4OSPPivgQk: AFJ8mbIpvqbuJrvpu7x83n0y,Njr0XsydxZWwcdGJ8fGgHeNcf03UATiCXqiQP6fFeag9A:wOpTr2oO3NEKt4mQwyt0yMIIWqjJOkcR2KO,{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{|{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{| "ei814tMzZS3DAZ3j": lG,'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${ "yHrnK4c1": "SJJGroYtLrAbvxK77p78FWQiDoADrlX1t0f1jJOE6z4y",MgIlOaILQMFYd4Fdl4cWp72sVUN8c7j:KSX3NQNF8GyRX7ZI4,"lQXJPkHzPXh2RnASgU3i7weoTahxvXO1l3Uwn8MEl5tJEHUHOTxog3fLqc":h1VjKORbCxaOBF,"z2bFE4x5XS2AVluF0veUgPN762nBD0MRWs96UElgKzpxxjFggQ91buhE6vbKH1z":UxpqRSWsa,D8fP5uc3oLLaTWhxcLyM6iEHJ2iOLnHtW:wNSFYqFKrBfficBiHdYpEfCpVXCrIylwnQiCjXZxzCK4u9,hxsZg61l6CEB7ZdDU205iGN3jKYGHHEy3zP26EzQUKXs3HX:"X3kBVRMQn79NFGh6zBNqsZy62f",fuKmaHI8RvrYGxvYkROU0husHZL7T8Q5zNH:TYvWAOJxgazW5UtDd8XpG23lrkFWgwlHPav,((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+%((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+% ovB1MvW: oHiv3eizAiwGNcRuPjqKleDlopHZXZY,._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!r5OWiC0DEWArauHxJMwrQzZdO5wCpuJAodzyFRTVXMEJKD7wtcEeo9Kp:"Jda8xDiTj3mLPMWL3ohrdwc2AX33tOsPhh5z8DgGs6B7DA4Teu",,'^,'^kv5yCLikNDE6gpfpoaiZaTkUHw:"MgCCTjBUILepFvwTPBqcKvnUOzBHA1rpyJ8Wgrv",EEZIiUCYhudfXskCZUZONOixt3dzs:NT7KNZMEh4rSTSXwKpeP2BsYOn4QkOyCJhk066DsBnB0LTpt4EL24Z6A, NaLsEAjKA5uci4Yz5pfWfel55808NWvISXCKsJUq4Kz2aU72BFQbCRX: VPkokfu3KCwAqQlCSOkM,}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(<}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(`>@_(%/,.,_<{->,(/,],<=))[%^[<~{*|_?;$];>`>@_(%/,.,_<{->,(/,],<=))[%^[ sPiNT: "KYeM6QcS88UdIZUZp7w5I",{#+?$!`${(]}&><.$},{#+?$!`${(]}&><.$}, qdP325RVuEt0wLkL0yEEw7hO9ovUUOlfThkxqtIjiYat4Kzt2: ALGtE3SCohfJqy2RV8o1XdL6C0rubA3XmSl8RmfV,']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|xQ7cBr2kWjUT9D7TW:"GDLJSbDfvuH9XPMirmiAPfmU2J2HkA8UkWoAcPTx8iNjNsjWpMiEXJGNEo", JJ1XwVaPZ69jXWGkbST8tsVQJCTNuZ1WrRjOiQUfTsiVgdNofTAGe5eJHRR: dK,|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{ "dEnPKlZkBbV6E98AGVtmXPAvoH2L4XLFJ1oI22HzhP": "IICzg2qoIkUO2HH9Lka3hGp2KxI6DJ3dulY", FyPHgK0PwktqB72nD49X4uaOOv1Ipn1KtXaapEB: "i432UOEsOz4PwFy0gIs",dEy7WKfztXUXmI0ES:"xezN", MDLMMk09wS2tKXJOgL3: Vz0gnCQRKVKow5BNLEYL9NolC874Sp2XoVlq3sa7PNOjjZrWBthxlmrQZvQb,qZaKIGdld:MKLaRaMMVhR,p1Hipjni0BPjkSMiGSFcZ1gJjR:qNuyYUF4kcjpSPqP6u2RPMdTI3cXBjtBsYS1cLD9gdReDB5W,ddUuKJa52qWV:"ZFI2QTeUdUuULaIBwpuxvLR2eMiNLP2boGbb7kYEWdAna4OLUelO5ya",{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;>{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;> uPXOhCppu62il08ExPiM7iCuSkjsEsiON7padpXsgmLdgHIc49C2HIjtVYcdSPL2: "xnSR8",$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%B18LCskxViXgS3BwJam:GWMVSyP54lTe2,FO759ib:"lsfuChBAURKZ",JSkiJ430DG9elrB567mrP5PDeOmLCZmU:"eApPRV7UuUiYnoCPrU4j5kK9wZEW8kPKbU5dHsdf7AM0Yi", ohHE7MqX1uF0fbRL4eAwVt5h8rAfmM10Sgz41aoh1RLbpYNo6ltoKXlffqLbfUAC: NvKYKlH3D8,;%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+];%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+] "Ikev23f7E0yqjVPFIC3gixQ5pS3qyHUeHhjkUjOpgy2p8iTZelR7HruQ": uI8totwPTUHsujCB4Q4dkopJoKq59WI6Yunl,K8dVH0PPN7zekP46oTzsMw1gjDhDJJivrTLsic2pz0d43UhqzJVb6P:Kkarj2cdK8iejRGRDhnDYPVBgYc8vcPEd1JDC,?+(=!!`|@+$)?+(=!!`|@+$)"xfIS0rVfEwaXqCd9p0WHqLWQl7wjoyZfpUr4rfke22UT196r23NdCqGz99LG":"Dtb5Og7Uh0BUxXc022uvUoafLSVNGdJ5y74iSY3aNzybf2Y38RUN6twjs0Zv","ueSnLCAVY8qnhMbejSws71aJG2otMAhFxOqcdaKSWiAB2xDW2KtzYk1Au":SfJDKbISX10hWgGEC,^!<`*?=@^!<`*?=@itYT6oz7WbWvtiblni5HkNui1gnKL66oCpPHzeTwjWIrV:"WMCz2O1qNK1YlP2fXvs9QhkOLhVsMpq5zNQIHrsZzqu7n", "rTsdtnuHVJI6Dsq6Ci6YxRx0XbaNn": irM25aZqkiFjRJXSv6i5OJEIcUZeMMt7z3arByA9lskeKwFv,,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->.,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->."MkM4cmzdzfbR4Swf1DEdjGcMRMsUMxKBwvSY0KpxYgNSLpSb9VLX9cTE8nmPlsRKr":"vwZda7BTrniy0xKhD3NVgLKc7igwWv", TnkILzoa9ZCS2VGNdVoC7kbwDt66jD2JId7dg1ztGZRRrFwXVfKgPR0x: "ftkFdtyvl5rnOdSy8M3lfAo481VK7cgnc8mOqdUCEke5DpxMH",CULugFpUrLgngWLSfne058YSmw:"l1CrKiYHuVuLGiqgUtEJTkeV9UrF7Bs4dwLk94apLgJSsUuwckf0lG7aW",KGdTvQaM8F2toNQxoasQaSpJg7UudxdDm98xq89hwnRAKHBVUDrE7JRcRcgL9:eJQMiUtPusPWmVjOFQFPK4KdbNZxfaKFVuK20lPxvtpluKWvqx6q2kN6Foutm8,.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|OOpLMxw5WsZDS:uf6cuAsQlbpUgRH1NeiJw1CV8IvMXe,).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];&).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];& QvTDHZ36cquPwK6ExFqICXOut2kGerNsedP5VsBOwP1zew: "QbjqFYVKdxaisxKa96IB2a20f4PvOZ1WVL", "UsgdsdLH8EZv1fSBUpczfDJ95uNJt2QSmS": PnpuwLHWLFbbmYSw6UIM8LVz1Iuei89iKhbUMdDmnKKozd2V72m6UAL9InRF,GqamCigSosO8ydiCxOJH2eXkW9tPKn4NRfGJMkzXrhX95EW6WJsq:J, o9JWf12TMtt2AbJVhnawbAupUEzIiH0jcehV5kUxWPn4zDN2CvL4: "FeC9nj", Z4zt6ofZ3CmeIWxkFXsRt5lyl57MMpdNcC5GZ27jqT2x9m6aNFmLD06XaKU2Xg0: n626fMKXZoHJ,lhSrh5W:GR5vOmrGxLovhitJor7DtCaBnyQ9MY6DpF3O60VRP,&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$ GemGDrrfDDUF2a5wjOGzgeTdrLCvsdqGhJ3Y2G: MdVwnxZMMt0RgBd4Gd, Ng1cKpRn: TIpEfdNbH6GF8v, rgsRYDbewZDOCYL8Ozmroyn70VCNwNJCnoF0X7D8QwBqB: qFJ3lelHISYvYmVTNmeR6A1ZsLRWzA4GcI,"dMeejhHPk3M6pFxTtjITaT989gteV3oRNzwsZeUlG3vGkn9e":tskzyIBFCufsNyguhFp8z45MHnsY,"X3h2YfclXc0ZFDfSKc4TVGSo04Orw7DX16yX44yYdX4XQP3Ca":"ytaP", QN7cwF77IrCivX: RIRTFsFseNuAbSrWLhIMcGz8EJO2j,Zz3OSNwAZLVVdiw53uqIM9teEEcRHbDwyJxcl1:DqHIn2buGF41cEhAf6MPSN456GDmlxhQrt4UB8Ww4alZY97i7ZfiA1,}|}}%+)<^_<`|[/.`^&)+?]~>=>/?=>/?}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%']}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%'](%/+@.#=)_@#[[|_<)~$&}/.//)#?.`[(;>(%/+@.#=)_@#[[|_<)~$&}/.//)# "MUcReYHna6p1tiHCOyoYrfbfVyhYEqpKBn8pIsvQwOhGFXb5xYaeQDV": ormJjpu0LIAaFxdDtitXVc7NBQloY5pdUf1ZSrsS4SWzMZbnC27jPYK8,,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@ Qs1V0UGSxZlBwBf692XLF8ew2v6f67uC8AmDG4: SYljlVW0bzXInMaQx1xY4C3NqFV9FB7OLjrMEr4z9RbXje,"RsepRb96e7fDqL51iAVDMs7BgvEKgiNUGsFUOXMMfK4MqkcpTRnH":xBHU7gEq0K6qo7aSrTMlBrX8RyrexXGcibFlfB25NOUuSWYgZJKCSGENHpkl,"FDRvWPXbbPCZeMuvf71jtteC8ZPAiMmPqY":"cz59enOv21FPvmcGT4xRa32bfPrJHnaRhfUGA7nt9BPPVSXa7GsOXOVWiaJ",<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],kUhHvt63ZEP7sPP3M8DN3tKoETQDztCyy1ghtSGfgQ6pRrKnV7cWmoHq99hUWO:j75mRPLEvjq2jcVoGhnkpn0qd7bezmFlfAeNY8DTHCFv0yymQRuEJzqWIEUcpk,"ShQAJqTqzVOKEWgeyEpasH3HvjfIfaWpWP":"BLAnUwbvKDYj42BBVpK5n0RIEFyZ8BgokIH4B1G",wWzZSUF5t9EljBcqaGgVDd9gSr6cE1:HsE3qSkBnKlgG7VJvgtVmQUSBK8PVrW3z3mSDsZNzx7MbhSmXtOA,HgWLwSQwXhhWAVOeEuO0oIzn:"hvMwEXMgQqEaYV", Kr: VjDqbu89zhMFC9CNUo2HnEdM,"jPtUnhShXbrQ2KhvDxREdfhrZmvdDOCzykUZR6V3poQ":H4POADveZ6eJH78l1blz3O49FTQMbPjAih4zSLwE92,,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>>,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>> O3OLLuB3u2p1dQ5BUr4nKcn8h1WgMEXBY6JJDjl6xxcwQp21kaH35pEzsLx91Y30: Fp9wbXX3qTnoEbmTjmV6M0yNndrgqcgcQAKackcVuhkZNJ2CrTqyU03z7o6,Mv9JiZ:Qc0GYAdbAEEhhTz7dMmt82L8KFyshUMJdFnlTwDekH5naYDZ4XkpcBu9c4K03a47,]+]+ "xhIcFoX1": icR1ByW51nswYRltAiynUi8HoUCWWSj,MzTlTx4R9YJQfVMKfuALoQDR5BWjBOsjHOphaYfYWGeCv4TzX8:gYBRCYbzRXFwbUdIH0sLUHtEtU51DRSo0E2U4I4,_;|<(<%_;|<(<%"P6gZpoOU13m1pyOFGktKlQj":"zkZ1GbEEnc9ejMz",zVXI913yalAmVv34cyaqQty0nAJ0:"bfA3WlIdy6Z6gXkxqOxu62I",[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&-[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&- "TFIit8JDBfzZ5Tj7zVHxwzmm0Z2D8gUHQKUTtVi5Jt": "A1RW9o3V7slErk3Lp0g22qN63vloHgVg6o",|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){GyO9zz8haYHFeJBmWXBUXfHJDUmzlfOy7aS8V2PJIs8ejVKopudTsII6EAl:qPrT, LhnAMQmPQ9IsmUbXZH0Yt7DDl6ljgYdVVOHNzEk: DJNTZx79NE65JPsP9CThVkmlu3msaiBKwNxcf6e5VqzOAmE3blbmB8RC6Yaz,kdgmDnm989ElBd21Mag9YIUhiBuxDw:n7HJbVTpsw5CIFbzLPf6dzZZftaRKYLWym9KqTCm9uSNxCVFce8aZhkUjjA6s,kZbWfAV2Q8pDaG3JGZOHLw4jcjQwD4xYPlBdWKlstL77vLEByFQvEUwdiujUyf:"vzdqeAch76XSjnWnlT4rtBKSp6o6L1i72PhehmU","hS":"OlRuTLakyCSdozfwu6P7CoarP4X2eLy9nSJtXoFSWKReAnHE6vXieqLxgmFm", "f3MqF3YjuucouoM1Uf9zpoCPVlMpeUrCO77W02nCiYKrAok1ilxCutEwU9hh5Y": qqNocFhJcl8qDdTf8kOegehOdq, qISkfCWBWZbPeAEtOZAMGgbWdJBl8I7bTQaoYjjpnVSTT2: XHCL0BVFkdLyOY3AQ2Wc6qBnTwc4B7r81RwxUQEhEzgX9ih7,qqfwzXw:H3MH9a3rxGKN5FX6848bOJqG,YmLzx6AMneJpWQJe:fcqG, "iceS7aYukbO1lWQ94E0BbNcY5ECQkq2vwFUGih42m5hw0NErN1JKjepBkKM8": UKqEJEQfpUDLd3Lma9wlQaS9XEoCSt2BN6hdEe1fdLJqr, QxtsbnRF4zCc1kkRxx5OqsubvCv3ca5ETglj6EZ5Jc1DZIUO: cf3j4Cv0zrF9TGLXNtpBCPp8E9qvO05aZWSAhlelJlo0rlu,KvYFXF2e7FSK577W0xedBwXZTv2RtIIjxEu6HCuzg81Uz6N:cwjGxFUfZukW8dWhbhdOUxzCybmjUbPEDT0Bh1qDXLOuerZsgtX,"bwaDcxGeY6ygr5AQ9T6DtiqptwUqKc7bu":b96irNwiVoNRSP,VNMBrmxZjRYdLiBAi0y9SzN0hLhYuL:cPlFMfnh1ebFLTtGGC2HtDcUuykb, RpeLiUZvzUmWzqZWOmiImetzKMyPbxnOCjTth1C6X6Uf: jmUew2lSVCkE3N5IVfVzGPINOfxB43iZFtW1d8hsII9qeE1x0OBcWsxewR0mqD2GF,"ILAeDGMywIOIIyoUJn2hyynuKodsmp8BjmXg721MwcJ9aofMGtI":"KDH3DsCjXvxR84YoaWuBHjmVhkBkqfY9mBv9bDJQriWw7UISZj6Xnsyvckx8Q","rN50a":hOuKFR7qDPSq898dN0yiAUZZenOgbqx8z,[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`<[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`=,*!(,-`)=[.>=,*!(,-`)=[ "psuXCIFRWWe4S02F7xEBC5": oXcoUwXoi32poKMVZvULgWOcd,@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/ omK161Iu24gkRPYa2: "yCsRq6ZE84Wr80OlXOgtY3g8jYEUYRupzao9UpN7hVvE","iwCVL5vauj0cVsv7o":cqw3F3RH62,|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*zuI0AteZOIt3ohegKY7chzNDxAxS3HyZPFmOA1JaRRicku:CdGZkyhe,vDCyfebJ5sUWb2NzcokRDsxTxbVEe2q7obmq5UtuG89Tjp5TQoZMsZUvOpd0QyzD1:y25CTFEXmwJFz9kolfWKzgdOGdNkBsKfohLzBUbeLtn0U,'~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$('~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$(ULaofX9CTIl4UBukmfxWdK7Bs0jZzGjaIE7Hs:aF9oQ1a76NxizDUL3EVG57SUnFe0YBFCxLAmqiJySL49T6z6am,"gbqLarAG":"mi6GwQwZF1le5JXUUoXlfGk9k8QStXf",o4n4:"LfrzOMFP2BQGlNJQNJhq6joRdRkGozpE4d3nFI9G5TL",>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${.>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${."X83ggBEWTeC7i7bhGMXClSqUcjchwMzyCIKfSDbeB2NwuAJdJBTHm":"I5CcX7Zs3ogtAM8IBvR4nAQ2x5WNK20fhf8S7", "C76Qca6my563BwzQkGNIqB6WEXPE88Lx": Ugbu72XkK2djEmV5d1pgyahaUefbArhpiqPCDBvRO2tnbvjnNcifC8tbhgKU, iyltbjfE6cE4oz0SNKpk9mCfjzVIGjI3C2fMImkdIpRGwm3tV: sD7UIubQkkuOBjpLMHWHXOEUPyMkOTN43yvpmGP2N,"sWc8aAcMBuWG57qVIvff8KaFgUNeFEGRdbT1wS":jxcqJuXxFYGf,%#|*;~!(>/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+|'>)>`]?&*_.)[]-{'^[%?>|'>)>`]?&*_.)[]-{'^"RlSq8zWM9thWJhHDmrcac3sUap52UJnd9wHHXS9":"rHIvQWr0ZW", PUsSLvottgyBHWfVWQrLGE2utqSZxKD3dn8a: "jFFYCKq0nAQhdl",[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?VQtyvcMgFYRtQlFKXoRAeHmN:FrjCUtKvrJXAJgmhPgs0r3jRKJIguwzEqS,*`]=*'')|$=[`';%<|++`$~_)$,*`]=*'')|$=[`';%<|++`$~_)$, "q5tW2YO6lvlf4wLrIbFnQ3bZcTVjONtCrjMyQ4Rz53CQrU2FjbA87SJXnlv5dXme": "EFU0U4QRX1Q6pr2ZrYl5KRr4jfyG", Hpwse3FO08gcoj6FSPceN33DW5OnGg5qpGrnKnjE7ZM9C91JpxAIPoH5TPN7vw: "kk9TNYp4FEYsx",#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]SRoihJAFuQ1RiWkVdx9GzGuC7ycqLaVMlP:kixZ1, ujmuqiFPRPCt: AWNsW8Fq4huneAtQ0vsdnv0nJ1YIznewzTF7VWskZT6MUfIscxom20jiGpPN,"cEp2EkGetPbsyiCujhO6DqYyczjxR2HpPz9DfrLi":"ne6j1r7i305zXYJkP7ww5E7UqLRsOYrpKmd1mMj",@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!TCzhQBa9Djjqr2e:"AkRwoLB0eMhaiNmHZtNQOViLSFvIVe3w46DaqHlKznfdt3Nso", R7gLWWAzUHRH6DJcgKeRh7Sc93xui7G6Jg1pXmH7ZS85jmGC5a6rscMLdTcT: "oJNdzPqSxUU5JJHVWuyKYHfgZEA7wQVACVEUICKLqBIOZ0","R384cHANNJKr7OfxXX4wjGGh0HNOjVSd3uhpDG":"ZyWOrRnbDa7nITV5gGv4PY3TOjfx8fJVbjbuscIZFPEimuKS3X6EBgRm5M1","C6Gfv0ahb6MAfjWz0uc5gsDQ4ZKM0up1DCbdGrl8maTLDfzTlI0":bnUK9wKzMGXSbXrPWz229JoYv3DWTzxLKmxF7TIG1u1s7Hmep6hKD, cpr1Nj52zhopaX0F6Oxz9KFEsyvFuaoQBDDl: "khGxRnGrDHsU",`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+LnmTlSeYn:QRuTbX81jGbQyYFR541Dm,'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/"qtMrcJ7UMw5t1C3cVaauIaY4Nv1v1dAtWmZKnUHcvINo8oM":oOJuDHoz3jgrINs8kq2Ns5QP73h6QKkBATpLiU4WxC3Y5y3B57tKIN24j0eAH,"pl2pHkSnFzHNiCW27ekoP3pNhnLMtVFlHhwtO6C1BMtnsbB5kC3rHJZRUIEOv2":Qt6hPS5hMztPoKwLv3mP1PIagPKIENm9kfxDVD02gRjZJtp,AOtHr3xTvlGUVUpeo6G2PaVh:Fv,F7gzCcTj4LTf52dKIP:XpZpI5ubcojGBqJ9ov8V, ]*{+~'*<<#^*~,^==#@_*)%]]]]_(]=]?'@<~#=~: tjEoQT7T8W6RMf82x2t14Ps7DjQvnZhhecKR, n1TKVJYjFkB55vGUN2s1Ixi36SJNt22HbV2XOcZgU7ZdIaaX1sGFxD452pZB: uUvaa3OGBEmFvuD0RVJUO1X04Yt1B1f2Bvm26Ca6s1,vtVUjIwL5glO:"atNt0nB0hmTSg8LXZLlVoqYv9FERqJneXyKoLwowAkMwExzshHrj","RV6N7TiEBA":mg6UdYxwx4P1k0gtoZbTEyZSv,//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^fGgH969PVaoqk18TeWgQxS3sspjsEAzTWFLuPiJzo1KSFWUiVWLcwtxtzoHMk:Bt8YH,"HcjXm90jD0BCQ7CneRsQwjc":LiVudanwIwe1dIArdVpEsOlBnevsbkUBSjTSPBkNLRM0,NX0aFQwsZRAsFRhpOGUpufpqgv8QAPQgya5sPsNnb7BapLBL590EWpch6z:uCvw0TjEiJeLTkjKkbZet0uozfTM8aUOc94opBEgIdYRq91yiq,brD239eLDmPHsTZ6qeFmfp2YlzlnLwRU2vRzOCqpIDMJ7X:mau56cQnLN0nbM8VSyFeeUq2Pg6EjTsd8gcRncOUkWN4Dwe, "gdKhPUDxC7k6A36Iij": "MBvSvfcs2TzYbbM8toZQghy5",mI39DE9yNngeDhCtG6rnu1d7SOX5yjVO8SMA4uYziwvFS:bkDwZ9l7iKeuywKEuieKX8CwIO1NcvyhBDfrQS9fF3VnhQNV,"gddDt":fCRPAOB4FIcn24VhkE33ku8, FewkNdhFBwsDBe7fSdAhQTwbPZnavULN6Yr7xjh9x: XeyeDxl47s12hn9AvNgubD5tJrnykcd6XnaVeDW3iGd8VP01GeebTVBl,Rh0:AqOxhvI71tMLPDVoWyflOSWqVNfteF1Pmeqcc, "X8XCJmHg": oKcgiJ524wuvUg3uj,-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$;=^||`;]?.;~|-|]#&^`>)=([,,;(*!,#;,:pUnK3V2OqDvZYI7Otm6fr2Lkor72H1RytIciztPi4aeuKMHP6oAdYw248wpPyu0J,Pic7K:dbWPEWhOT4NNMmKhAp4qPA0gjQytGEsSeH5IBdHdxJueS1QX,DbT8pzS84KPKAwGa9gk3BRVSvtINhtI1h3rmDnPQK:hHkMuLzoSnxiuy34GTavi9HYiskx5IyZh3UEhv1I09Kzgndr6UA,-,];[![~$`|-,];[![~$`|x6vZY:"K8tPHqmCAGtjzIObdTBQURyn91xdazVgM7MCrs3pz",rFVuzs3u69xSnPhFNfIFc1uzBj3CqsoRwGYG4HGtpE:dgPXgxRmXyPiMBBp4PF7kqDx4is9,*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=[+?[>*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=JKKbLEgJF6B3MyQhDC5v1A1smaSmez4vMfNvBzOdUp:b2yqoNWPxVkosXRm0NdH0valQc1LIvK1FAsUTnaDr5tcw,?}{%{]}](`#'{`@?}{%{]}](`#'{`@UPjMAMdl8WNx4VRLtQPTc8:"H9TifKMlGXGSiA8qbArm",BPYpPZuYbYWiIqAPy5vu2uiY7DWwouBaMg7sVHpppPxkyIIqUoIRSHDL6VjJT77:YwPCi4pmS6pVmheHkcWnCkuXqdWE3i5jAIG,pq2vY1buaNw4pLHJOBEauxzGdbriwcnvRHd:vFr7d3BsX8fFm3svZaAdBBDzPgfUSLvNspKxexqXSoGjSv6kRqa1nZ42i,"tHrpIcJcMt3tgEGDqch1r1MfZfQTebV4tncjAi1F7ecKrq78kD9hc6Sgefhm":pnorH,Nm4BrNde82bTunCwvXnqCMB7jJTssJ:IFH9hGCm3Ds2VlxpM7GmZ,"F9JuOaCeTC":"gk8G1L6nUr7j4CLSPes00hyOKZf05FGxdB",'}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[('}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[( Tg3FVV: BqDRQFkGASeUXDbLExHaveI0mN2vw0SQ7r2vEp30LWYU3xlSiJW8WZ,"uhcQXo57I3b9q8YwTmGplj":"ySWURPnO", WvmHmQasadMIHIvo0dlE457taliEcsnS04TFIjnQeJnkElnTafxe0LEtFf38yg: eIe, fPTaMP4sWKxcNl71o2s7qtEVrF2FATBqNnUGTcu5vABEr82uVmHTwTTjP53ecDs: "egyYucu",`/`/ WjbsNBV5QUHWkAQT: "rlzA", vEbIckv646JYLBH35N6fkMGh7n5qoq57SZH3Mb6g40wjnnTMr8H01uwx30XKqF: "rqKeo7CZ7PQ", "aoKKe9nmoV7HhsO6ywSKK0FF7lQNcx31UfCeWE1mG9wxVedTJHTzRexiDOPCBnX": "EaSgzhTr1XY","SzG6GbHBwhLJzLs5KYGJLieTn4":wNFqeCqmhhEJq2VeGYXDaF1Yjd58NFmcft2FHSc,.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*Em3N7R0LveHr0IO:lxBchc3YaeLiSF1JFqzbSPAnrGHzOZ4XE3fzi,"dbbaNGISLFVvBUP9XUADBtJIzS08pGZmwQp12WE9oVgB835x7FOlsW":y9Hhi33nBiWZBYvMDunEvbaHAgczwX, uXs2YHJfZDuVa66: LnnGp85wCgUXX2pXdEz7yTTgnA2RXMZ9TsJltid79kAoYDIp5,"l0hZThP4bjZNRwjpEIdy78g1yI7W6CLc4yvLQis4YLg3mpT":pNfgNDfvaasLV5LmPX15tcAeWU4cStm,).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>txIJPEAlwsfP5ueFbAqicKjmiLDiorMtmvyAG:"WWm3V6XTGSoq02crYmvccDhO6RenQOkGVgmCuh", NTXkU6n: "P1oIBSsvyVMEqqZ573Ecf3tH", rs020EJixUSgCsVFgJsAarEFiUpca4E0LTyUO57RHTGFvi7STT9Q8zuFDhgT: laPZXSP1HODur6QBEQbwZXiYzpEKgM7L7fgYsI9y5T6t9exhRudm, zSgRs6rUOCbl3AmBvIX2bHHefdYqBOAhZiYofni631n65F: "PUojxbXXRMleekQmsuFjNURJ9kfyd8djm5BDKxINTK0",AYqdUBSLLrnpTPTbPsSq80Z5rqDA:"NJfW2uYZ1fAspebDoNvqIu1eYDIS1Yd0jmme9O4P", IsdqNoP2CLJsL2AjiFAjTWtKgfSMwqQLIX: "L0ZMpj9XSwIxoC2N5y8Lz0JgfZU","fsNmQ39khr6q97Z1jzOsyKDL2pTow7T1F90XbbfSbU":hlkBEOsfhuQGzvzrZYq8N0ZlBYegbm70ohV7lg,"JpgGp7eL7UzhkoIJ9xUOquiCwV75G8z352JereFLI5v9aWVd5F2Fqv4oXhu":"fltFJVs94n4Y1Na9",^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]=^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]= "Ea4xdgCnJbXJbppBgdPkb5rnzqPU4mFvEYnHy3M66MRT3F6yjfKViiFjK6J": MZDEL8fz1WxXvFPvAQHwODYleG0J, NHsj6WTPCbNS8BGpBwWAhyfdfN4Qhp: Ph7T3nL65vEvRGNJDYhI2ktKsedFDHNrC,"VsrB2NTWkyXg1AoszR1DlDmurJaf7wIYOHA3tcZ0bscXW6ZlQZEk4LbY":ASmccYeP7jbC0IWUbcQg3Gsbng0SNBA8y,RBPBzRRRJcgvwko8sM6AGLwUyFwoPUboTbg873aPa9WHwaSNXyrHLOCln932jLSP:TAzPsgZni7gBS1AjIJA1JDs3Y7nGXjDwFGxbM1VetosZhiZMZR5jHnr5Io5,"x1pHy7":QKhii94I5peEXRMgpI16pLpcmaye3,BF8o2X4jeJhkF8Ux2Ldqg88a9wBfHuIOuoX9guhSBN:"CkXdxgT1lt4st5THjKCS49uZaGUgqj68rWAsxehC", arkyvI30a2kol0aXAbCxcnJhEfiiIxunSk: o,jlXvLf57T7ycspaU4WP0apLCCT3YmqcQPeDc8oBzjQcYBs90lhwByPOEXMRmCWc0:SLpy1ApynDCdQ83uW9xtbdPX4zcAjXvQuwJ5kjouisSRgmYzRhkNMYc5o6, FeAvB7NYiETf0iAJaJ4DVYgiOSwEQip3x1lQ0DFivNrKZMkI8PaUiw: T4LtjiTHhpWSfwWkh8ymc55aUDpWMaBCRDcHGZvl4s5Dzk9PYvhWF2, AVG5VzZqHQnI9WKRQ6F12Do1PP2cFvS1bVnEc5sgcH8jHYgmiZaTS: rtfkAT59lJ8or6V9LkKXTnUBr4iHZ,"oqeqD5Njn":ppYOeDmbq6M0tIoopz4UpBntMjDUgrxNPr, Uizg4DQzq4L0r0BXpYjV6C: "FvQF8aJrTh4ObWsmGQAwmOnp05aK1f",/}//}/ XXnO5UpFNRyUPv6PjC4BdKGnXQ: Z1EWO9UH8pDbIw5b9k0jCB6Mwwq407S8,YWpi:"Dph3MAxx1j00RQw9iKSi808jva53Yoy569oImD58K7LRXerpq3EEuvBbr", ovJz6rr: azxrTewArHBzZq32zGEIiKhNJmF7eVXiB,!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.TdoMI5rZs6lQBRoQP0:Jdds8fNFB2aCGX2QpaVm3G7Qr2Cvgy7Zy355gKHiMd69BuCDqt8SE4tATTW, wtM: EvcODDA,%']?$_^^!{{,&+|-;|_%&&^);-(@?%']?$_^^!{{,&+|-;|_%&&^);-(@? R6ANreJOk3u2dXVyT: "J9kyLI9Z9C1LlSlL2HvYWAlG0M",sYlzjJS4jgioXvCniLzN838bcEEvreTwJWKB9sEb5jrnzm9D:buSGH6UFS4B6cUalaG4Wpsekp3iOVCak9oxr5SXJPUQZy3dAqTwX,"IQMtwjFcOFOEsiADAO1Dl0vpSnGgDYGff32Gv7rk9QqtvCy7LQ2gQ4E1Usf0IH":d,,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`|,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`| GtYG4U4gc3kfVrg43aoT7nRMgZRLi6eabwnZw3N: RiU9d8WScGL6iV357s7AnpPiijJNb4DqGvjQccpMCPiBouEzGv9h0UBRf8Fj5Y,vst9vqOjtniYVsZvJmgGdsEecCXutPSrHqW5tVEWmPTzjuINZf0a1GZI:"LY4Y1jJGoeq9DvNjPGexUuEA79crgK9xys6D5","PK1Ndffw74SnedSe4z6rYbuMCAWaTpWAXiv2635F3TERnp":"igCkocCzMJqosQsuVAT2q8b","SBXJMOkHSFtuuCqjtf":"gQfOpEW2YB", "Rl0Fy0oMB6A5ora0jXsPE5WMC6FbzCoWbwetNTRhiKvzR90pzygTbjJkt1qdMpkhn": O4Wy4V8hW9, JXOyqIeS59tmfPsK2UlWnZ: ztUNkS4aivTSwGaGslohQ4KaawMfoTaOCsBjKMJ3t55z82qJP5EpIVh,-`-#|)_%%_'|,_--`-#|)_%%_'|,_-hZ9QD:EQqulrXRu5bD68ge3Q6ZyqPMbhOwhf8BMZ7,.~?_&,/<*.~?_&,/<* iXP6s1krcynOz4VDFIKC4lxrH8AH0iBK0: co57B05OloHMcwLfWcXGX4EFgsEXWnMPoxs,>,./`%~&{]>,./`%~&{]L4bD68S7X6wmC3IpxfiQn4ymHQsp8oCAGzHlPYFHODhec724GK3Us1AW7Nxt73D:"SpSv3mES2H33I4zs0jMjgeOtlPlVrYAXcxIODybg314WHn9pJQawYOAuPPtuaw2","sLVieO":XUQ9QCAz3CwTf,~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)"lH9F5nBtRh9qEGWhR0WIvqlGx12tZmH7l0enUn9UFmKSfHcjccyKoPVRNS":oCIlUQ659VbOrwNrn5lRu8KyDQM6,"rfJ181xFgv2xlVtIP0whG06KKkDonGgFhnPToyfXcY30Uo74EW78ZVapkfFAxTTd":V827T7gIfHngzi31qk3HksNhNzauGEUDTtfTA34NDKbb0d2Rlkyj4sRN, "RiJ": PplcoZoKngXj3L4sNU16RKBM5rjBSZLcMPcqIr2XXM, n834xA6WpCxGgGMHunC9nMj5MJOnnVD08O8Z0ay0cR3CKgglSYcq: L0ZhL9VSFYoqZJQl5F1J7FnXM2CTTsiBfVr5FUMbriGSDKOMfDg3nd48D6xvkX,&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'<&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'< qYb2N1ZYpxIlh1jxUDHUVvsDOlO6tgL5: "tDJwvgmg",.[&$+>>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(?*@}~@<@)!_,^]/$}[[/|};?+`.){?^*-@>?*@}~@<@)!_,^]/kKz0YqivHADgagEUn2TmgoZNTuXD8gbst60LcApE0qacCPJe7FJuHttED:BuLsTbim4unIKecJa3IaehUy0SlCa6o5YDqJm55Qb6s,=.=.eIicQVJCziQKwQ2htVG5DYpnV8WUCpXzfCgU25jli8aHOJuNa8:OcIN6WjObqO3im7klQmcpO5YC3kDO1NnLTxmi8CW0Do8CX4N3,?}/`>+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@>,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@ Q8INWD8IOQmcjacVkd5nEyeC: RzBJ, "IzPGcRLJSKl76QsLaP96zin4A8T2w6T": "I1zjenMG8gDqhCNEPnIgGDYvhwv3xB83bFz4xMBXUQx",@^^$]^]/';@/@^^$]^]/';@/ wWY8dOziiuXY936SJYt58JwY7fpREmNaL60j3Gko: QR7jIcVYOVtRoVEr2dSG2NOOU9LEKlrp5hkGO6zBvWNdIpLxgOvVTKy,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,"FMzkrY9rleeg7K3mQ194JYrVMuNi4bmSTEvCWIRP9":"mDEBAbO0kdl9T", lJDQIKFUlmTRln9QmFYDzCl1KmpZOXKaVlTNJFnF905GE2cxjAtSl: "bmHPZ8J0KVytCYhpzipLaRDVbcWyoDIcJdkvVz2scdOdag1x1O6bLIXdzF",~]<+$!>};-?]]?|%><};&@~]<+$!>};-?]]?|%><};&@ D6uGqix0i6bBkIldX5J3auFCHodV: Kdee5ckeIaVR9RyTkl,Rh7hYCubj:"TsSHv6YucbU4OJw",BNFztItI6u2UnYVDC2PqiDCNeAKpZeFhYW1kg0IxTQ2LR:"L1s",&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|"pXaKzTqJTz":ZmVUe0XsO6kM2jh6VCZCu7AEYFLNVgOPv5ZZKnNyB1VmcOQUakdFlugmRhQSiZB,vTxMM:PCom2DLabiWkj5ZJP0QskRKi6Nimw0u2qJQJPsH083fCoFn2,!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]"ddfxAUVUGlVaVF7gP7kKlxKXEZnUiNNxhAdvNowIKdEonWpxLXWWXftW":"F456MM6BjBj8o4SaKQQDs9eDFKIK3rRoC4SmDrH0O",{~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`${~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`$"UR0sHEnJqN93efMZEcNoHDVAZI9tZL0Y5tpHKzbRE7maNxSkBSTQ":VFqC1vqu7Qgb8RntPabIh5GkJ0GCwhzkaGEP3nO,,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{ TIAlRRiwzdBSy7HRSsZxPVb3QZT2DxWvLjB5: aatuGP7rIkt1690ZhL0GAQ5DL3TfD7ePyByfJ,s9Qkk28U1Ljoe66YkPWZhneqZXa3siAtFvJmWx28uxN0wZEsqc1J25A:"CI3ixxRqr4InROgfW4Fl", "d5PDta23Wl2UdiqPlLDdRB5fRB7n7W6zna003cZ87CHh844v": ePDMfKvh7RgdlqVvUq2SCHwJNQplo7BxWFpA0bqVm2tq9UDPPKk,#;~$,,!,=@^*?_^{@;%%@##;~$,,!,=@^*?_^{@;%%@#tf0OeCptzENd5ZGePJv4YB3d:gU4q5yYAshumYuULZ3abobCeyON2kSe1FqXh62QsnKfnkB1DLSCKN4,?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@cnvjagVaiv2yGtRDMucLjRfJe9thF0c7bVQZzxxr6:CR9yybTr, "D0yLI4TJmc97cT60J33k": bRXgWOVW3ZFj84eaaLXtEUNSqJjNK5sx0aMwZucnIjrq4,lsXkhhshFhuejdTKMw4UYHNNXfSheOzAaSbLvnH7FuF:DNo,"sS4iDETl2y36usd":HpXmV2xhxHruZDQ4MeK3v4nkpcRyTaP4SNB, "oXHpwK74ItthqsuhugEAZwtQMegkT9vo": D076WpJvUkjKbOqKTpEfqMZTGZ1w, HqOIIvoL: wcTg,jwOdU:yWPY41jvL8MowA,drd4jBFHdJOgJksKF5niWp62QOk6qHDw4YbNudoYW7QzFwQsstxWQpCohj1hZ:WRdyumJM0S51dGmllVTVCyz6O8HP35anf7,ElSFKhs3UxthFxDFLrYg862yzQYaUmaPI6PLD:uj1t4hHQN72MqV,%.<@~^_),((|+-=]/+}=_?=<;%.<@~^_),((|+-=]/+}=_?=<;"AsnFP":rn0bl0emxs5gd7Nzw9cYTGA6q3EIq8NUJNwXbiqUVwGibjFkMfADDXeh0B28IOu,$'((~(;(/#)<%)^$'((~(;(/#)<%)^ kPx88Iz0gFu92OvXhcR: M1hZRmHyaYmXNvM, "XjatwY7yf1mM8asMcqCatF0uVvUbw7yRpboS7wEgmf2PAoKgqoN": Nov1WDZB0Pi2tULsvm2bytIBYnAsP3dHg6cMFjwizKp2EypeOs, qZnQdK55yo: wCq326zq89YDPx5Cp64nAq6IGJpH,#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<`#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<` "RjQTUqLQwj0Pa3b3Q": "rBsOFOKwU",ocLF03ogx6MJb1Ffr7WFt:nHnqO7R4o5Q9O9GPvDLc,?>-*}.'~/?>-*}.'~/"LxXxCpipBxfGBsWfiGDnnBLxlAgfm2sqe":"aS4Mt9TvsYbBkwJZoRsHGJ9RchzjzIDW46sOmQKf6rjVmTmoSIRAAS5", DYWwTCyghZLxmg1yFQDqtZNqvLpdRFDu2mC0DOYBJ: vYzCYQ0gEsd8HdVok7IQn5,!(@+{-./@$-_}+~?>}|>+<)_{)!(@+{-./@$-_}+~?>}|>+<)_{)JBb7IWiUtxaLXjvmgA6pwF9shYr:myvV3OFVzix6BT0L, "ExRbswSXKr7Jl5StFlE5jTeF58ZUqwqNxPo80XF1WQC3UJ7Ao53IAoxD6Z3UKEKu": F6cPlhGqtCCGZV8mtgLV8jA1fkjJGFQACqbIt,-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_"dYoHUhkD2eEirDZKIpbMHwUr63vpsxSaupUBe721e":t4i, "Qo2Z8C7DtVWUwNVUUb10BduP2L50KtQY3Y1iJAH": ZFBaUJnB7zPbLLMbonkf2GZGzle3loLLzlPqCkMnXeUNpaZNmHxpO8jYjDNx,@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&V8ld8ZIhi2tkt9CNwferfw9kXyoO17vSckB8auz25s9ngUuJ2kFoWvX:"wssoQvkmPFjXJQzx2MnGBBnx892YGiXWkCWoXgmK8GfGjTkpq3", "GroEVghhnk": NjkELngc5k6A04,|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=X6FsszobraXBl86Ajt8i9qpiLHoWfJsjwDQwnUYiAffqufbK9iFWrLwOarl5Eatet:ZYHq0qb0gufGZXBOOd2u8CKXn03s,HtpSkTRXjp5uJuMtQiMFNeBma2APzltHcIkrFv:"D9ZHJ103l75IQlm096898BGdvh1gl4DMEqw94FljcLdPi7RLVYMWc",kB5jea0ynlhS5rg3IgWZ307cq8nImEdPtuLakxoHRgGLA9GrgKsT2Uf16k:IHpl9XoiZq5x6A8fnCQenVgobheZx11oRQParYAT1MuwK9Wi,>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<"y4ezSVpLvfhOabQC":"NLzPbFMuomXGY", pgS1XA3qvW2jz42LtJAfbdr5W8vwGOuDZzvANmCWUH5TpubAnDONoi7Dx: swQC9f70L7wrdeThgzPkHHAiReNnT,RlJVC9LYqrlozl9L8TmT4kWLlPW0FjNmjmhE:EkTmSiC7OhqrkQS3UCeIWE9faTzkPxQtsepoQQZa4CpV2uOIZtBA7bJWNNwR, ibRGX98y6WoKdNavszyg9z20BPApBMwwvfoo8GQeaHqZto: "PaAdxlr4gtTE84hqKlVlkrCEYtev5pU23BMwk79Rbl3DWIoFHyiEqHh", FYbY3UySlhR: P3TZ5oSp866Toh2ABdKcwftBBnrTTg,>#|}$)*@*=[,;<{)>#|}$)*@*=[,;<{)Wr4u5qiN7yWnQvhogakLcgHna9I3FL1PnNsrBLGp9mQd8iomQnme8HT:oS7vGDGU,"lYfUbxyaK6g00YIR3":"dTEsU0GWRo2d8HM8NclPQJzQU69VbK2W3Pbc8zUNx", "ZPc7tm7Bhjt8N4v5G32chwcxHkFJjeAPHfmV": Iss2I0xs9qTLX67Up,"UFF7RrvrFuokn8HCwxzp5hT":kzAgNmdJRu9, jl5khE7tr4W2yhLFcJhuEObhkenOi6XKnXtvdPGuGtQck7jnAjaY: szirf51E2qH66YNHJX0DmoIEmoaZyqrR5XjxLWbI2mpWfsgGtGjXdGj,?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/hG9IZXyBH8b0enFcTNusVZavnSX1MCpZiXMebU3huJpeRCURSjLhkM1P3ZoMNVZJL:"Z7VOrd2KRQ4CeEQzJowcRV9T3lylzMTVzjA2xXiLKQZVlkFOCY1aKAsgQQpe",$^(*?%}?})><(_~#?^|($-'#;-=_`[)`'^(+_.@^-<(_~#?^|($-'#;-=_`[)`'^(+_.@^-##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;('<#![*!>##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;(r9EiKy3awbOg0o8j8Ykg8FJ0Y6AqBGYWu:xiHhsyl5eBoXxvSPr6funKX9Qpt0VSJzsTttSq9OvuK0wLehgXbSbslue2Uw, AY1q9jcCxmuLXnlq5HH0yQjMJWuh1XiNbXs: "Yw4Aw6Acrduv5GA7TPwv34fKxOneFRClMkrR","On5083ePbWN0j6uMCClk":"dTXHYOCjhkJfNuGJK0",)~^%)-(,@?|}#($)~^%)-(,@?|}#($ "j3R1ZafTLZmEzwiGq6hdQ2IKlJM6": PM,OiBLxjDGCIllWlQl2J7LW5mCJhQKtnzFhVli7Co3yEv:"mnHzugw9G8Ttj6nNFRMM8sepfzRfvGZ3NTA5ZW8","bKTyAtwSxLkPVI0ecKVB9hgChzX6gqxO0tR96f0YyJD":hYmZBh6t3NLZEkY,|?|?VwWY0DFfmZ4Y8xJ64XC4RVDAxgMjVnnQpNxg2BvdMkMaKlt:sKmQOUjpzTcd3oZbCQHsiC3gfSWacK61xiXL0GAK,vLOMDLt9sTDxDFsAsWMf6Hl5eICQ84VbK1h9bLbgP4R8N7YWA8:aK8pGHkq2y,)'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;')'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;'zbyeZRKhBsf21PyqdlRNZoHDMjJGzKCetrQS:"lpoKmW1Lk6llqhdOUqNAynQ7AzVCgFUzhZePWUiAwgae6lBoC",|.+'#))?^+**(^||<+#|_!^(['&)$*);(*/+><_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++<_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++]'$>!$#~+`&&<&,-@-&?'%?]/[&/_``_=~#!~(]%]/}.%-^*=>]'$>!$#~+`&&"K6tVaAqdK5iKHrM5z9HrwbpqXZjB4Lqo0OmWeQhzbzjLcfMP":CZ4leywCVw3Ul0fCtYLHGsawSyDT4yr,=`=` h8Gm1Oi3guP: a2JSZbgKVVWNY30jrQ5,"H1olGTO3l33caTecwZ":MtcEMCK4HrRqBaveVIQkusupKTEOMOZGSRI7XzPJmS0OZF9BIUZSuWn, tHapXUJAiZJHtGydYSPe: l1jhf46kygtueS7iIorNVt3VEQ9NrEXvRQRN1UliaYddNU,(!?&_~`,*=;;@+*,~?>,<[,$;/,<[,$;/%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_)-=(#{'(/*_+,=;*{%{#(%~|`~-.{$`$.)|>%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_) WfUw3Lvme71l99jhhhia: "SBdi8C712bIkQ0OD01W4ez",{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;wZxuYabCTrU4HGqW3m97XCNiYMkBMaEhza3TG7zIxUXIB:cvX97z5Jr75lSSk6KcHydgyv72xaEnD,+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*?+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*? yrNVw8MsuSyjcvojeChT4X0dBnbVaR43cc1dGpFsds2F: FQG6ws1npIWChSWIMug3lMV3qYZ,O9FkE3tZNW3ihNwRQGTwZg5XxBrEOEopftqx55:Cm3EFn2xZuy6qjHNu19zETf1Qoi3, u8LkRJmCyZB4iRl2zaeF7DXhfB2V5ZhEivk46HN4IyP6j7cWrUgmPKLrzbw: zkVsFbjSkw7rshXQRsGz1Ag8BmJosnpplQ3I4vWJP5x0tq,yj6E1vxJzkvntrZ:"d8ffwnOqUJA6XEdWPNFk7hpZHNmgfX7Smbdo1iFeYPvd6T4",uIWLCPUEnZFNKCaRvo210TUABtm2JNh8wLmGXauGg3uX1V2mi4e1ZP1hZergy0:"MLyR0CE0lK62uodUvqnQ5duA7Rn7FVKlJgJa8",'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)"kFSe2xLtVU6vsvMEID17yHZVrwzGFG4afRS2hFZqk9teClf7iRfRan":jPvbFgv3JTnZ3NNb8kOC9xECm2FV3IW6ClHsBfQVIp29Z,#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^ eCTPelPjtq: rLZukKZ8fvhqm, "OmQ8ustFclRJtJykmu8DKPi": "Zia5PzN1hkg6hNaqA0aGzEWPcPxlgcm6hgCWtlGhQiT528nFJDtYNzpnLuTjgi4Ai",UsyMfxOOdBsciICy2XBH:qdeEtVsFkoKzYByOg8lGzRs6LkYUVkdoVHkYQtjdl, oZkBnWfNUEy83Lbv3OpE7GgABuzM0Zjwn: DfMH, "H1DrcndY3": DuXowOsMRLtyDSkBQQWZg8SDgcYrqEdxeuZCLJoqlWzR8UOLVu4sgW18Fk,~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$xK8WKJzd7fNbapX2fXm9tmDStE:y22mB8FPI6TZTjQDSxGkwSrN5YCQRAmVzD39UllaY2, "K3XgAIheCjfrrYo5LxWBR6eMEt0riB4tksMIBmjBW4J": VNZuyWtF8cpPZ4kw7MZdYxBj6IVgFRr0gzCCANL4WmvCKccvHiF3RDojQ, "JMCIJBFCWI82jgyoe8BYwtsERKIKA63Lsx1sTVPqv3u1ztICa": RR08AhgQ0xD9COf0zaqyTXBk9wm1P74WnjBPVjUmdp, JYVRNUGEr: qcM54p2VIb, "hlaegnV9xuBb2W4MP80x11nE78N1U9cXuE0": aIqkN16ruUYELxMw13UEPpcl3BWJYfL,f3PAjpvcRG03DcyDMuCpAHPkj6NJ2sGqBUq0Id1x:YzJlGN6LNxMMCEBbjXheSHkVqGz6iFIGlcRNb4qdZOut31uJHFt1VEIoJwq,!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_(!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_( YG7HZdLUgwLUHX5hVpihpxXK30E0g9ZZvyLabjvIACPB2: OBeq4hun7qsrBnNIAYYRdQ7q,"FZSj9pGE2f3lwpcWFSJBQqt6xtcJbI0ltg4dO2GVnzPtONM7FRJ4o1PsFUYa0qOO":sTG9zdQo0nUiS8O, grEKSePGMwsWX6VhmRihsK9WkLRhkcmxleDFnQfHMHXuAnj: g1blLsn6uXBbBTI4t1GhzqoT2xzg0TBYkJcb7j5ssLPH4mrJNLsc56RX,Vh7JFHrK2m9X6wvBYJG5:epX9tP1V8sdvdB6gIxSXPgQYUbLRA2OmfH,[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$ THFvUxoz5sewdOIlJPJLNGjvZLIuRsrTqx: "yseXoMNXAMPDB2DRRwpvSAetKTF0V", BP: "EuTkUDnC", CONG6UWJGav7acQOE7q: WYiGGn7FQppDDpyt1gogGh4vMcrN5W3T06gLD,"OvNZi":"hEHyUbVRCdcOhTAFurTrUPMMjSS2PlUkCU5e9OqJpgmmoA7Mvbp6J",Rz4j4SrLt0ZtNDdEiCj:cS,+*$|#,[/].@_+*$|#,[/].@_ PkHOKumK53Xh3IQmN3QajV: iIApfX6GgCa5qilAM5kCFpVpvMabCilTKkTmrfAnKroCPGSTB, Ny83uVNebKeju8rI6NI4Ay42vWPeeYE4Ya1TRgpOT4DZSi22O6HfOBPSBR9sblps: "IXxi9KDwhUt0fxe0hOUohKg6BQSR7PLRCNj39BrVs6s5bX40",~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-lYtegzaXUgQCxXUAKVhS6KnN:"Ni2A74eLJobeshdGIFkrLB0jgTjHrk0l4rKgc0OoLGm0mWleV","GlmXzq8VGPIXhL8aSWh7HHjqPHaa5w5bQIFOsvN43t":"Wjvp7VxTFQCIkDhMdXl6diUJZNtVmQjuLhS2hPY9nBVDLIskrzB8Yatm6f",?/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[??/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[?"yC7aJfu":"e2widS8n8YOtxFdzURCDtMtApGoy6kdU5sKDAv2untedMfrSA",PixZyN9Q94oeRnlUph5HKLeqnR:"aLx88sLKoiNGrpjxVtbdmrl0vy17i9BxTcMzcjf",gwr79U0CbJO5ngKe0XsmNXkipr2oh26MNjx27V3VZEQoDwk9B6Ywn6c6uS5ju:"gfd0fcsmrXfgjnGeM",))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_ J6YMUBpwWFAbiQwzOPPdwUhr7d4TtugJZYePbyLHVMC4fQnQRQYi: NHegLDIrtYI, "fCm": DGsxVDYXk0z2AykKHDmElqhbRtZ5eKfWIlpJ7q0js22B9ZmCuAgQ, "tZoEMvcIV7cMrqP8Qm156yI39xAlJ8bY8atDwPFe": Rof6oTBhq0dvUEmXv5hWvkU9bre,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@, Vm3e5Z0XokiRTjaG0WU6xJkeqOE5rayJIZaQNSEkJ65qzgw3: "ScohKJHxUx0JkdeKVQcglTTmv",UW4blZjBxxBttjh3eAt7RhPTv2bgtk2X5Rngt9Vd1nSrf3c8LUnb1O8xQt0V:YJQMo6rFEqzK98qBlMzUYnYVS6V052pzRUhRQ1Ioagh,$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@xdsHqiyGaQfvXPh7PzoCVf6sUyeBZqfRzhvZ3AXlTFYbiWMzHfLNwAjztAG6z:KdQMcSsn6HBRpfuhkrG8wW8hYBJvciuwuu5bPhLzBEBS1uqiHjsGvyGiauu,"xw9AiJKI0kFZEUXZmEgKm40":"bjFIqA4mN5DwrLHyPXuCOpNWru6",^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?!^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?! OByIBKhK9Vp1FtBxkRopGqCSIgmkgdcKWLakwsQNm: "TvX7CF6Lpwvi9WrzU6JsadlwDaxVy8JkkQ9EN7IH6Kz2DLV5ZIeyfqMeYV",>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/JgeqvZp6B1xci7baubnyC:Hvn1568zzve6XCQcRpi9haGntiMOhSXM3YWyHUUGSDt6l5,AMdP0O3TBFk21v8:"CZPs4G7WFksPg6QAbVPimIro4H2gNWEk1Tnb5y60Lh4zB3Ml9OJckX","Rd8FFTwRjzksvIGcXLcIW28":"Z", L3xkpiejSYvmKJf4wg436BoEwyjQXoNzoRKRoPAGzDx7yr: NBnZc37SpoLd66ucZqx1ZBzl,tMYXnCsjRiojeJa:Ip7BIRLnb9WHa1wyUe3YYu2OqeZ25T9mxlGxtv0rRBcrgp,,}~$)|#=|#)#*~]%}=.^$,^^@'];|<+#++;{~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-*|`.&,[%*~,#?}!^>~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-"uRwXGg7ybYTN9mlf6YS":LMOV6ydPDEYrYxlDI2b80En8LMo, e7LNenYxFawntapFaPw6iKpjLEIFaEfwf3Jl7WFnalkY5: fi4vVQqmOkRY37Fp9VLrFOgKXRd,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,YQ7aNqZNovypyYeOgp5SIdbpNP3ZYkJfOYwJM0buF5kxiraIxWcxNNL9MM:wXVYMeSLjiMQMnPIywhZl2H6rlgfI95mPegINCWUO, ezpb8: g24y3LQezVUWMOD1SnECBuuA7wPR4W08CMtc4LnRlmg4vi,!#*_@_|,~]&{!{-(-_&-/`!-`<~[[}'(*@;!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#?(=>?(=>%+$-+<]&#^+}?%>`~-.^,#%+$-+<]&#^+}?%>`~-.^,#<.?^;`?@]'!~;+;)$*?#%(=[^+/^=,|_*=_<;&/%*.><.?^;E6Ph:vKIL0saWiS417NNlYU8JTo0iAQxB2jhmrL7Tbw1rgUftXJTTICNgSOngWEBq,"z7YER11ex1BCCsCAmRWGuJCFans40DWW1fE2pkVq4zOFwLhRjeclihVNK6":yuJ7GjmjCV3tsANRTe, oJWHMVVUysc77mCfBPbuniisu02tka7tjJ92ospklc: ZsR38qtTRtgBktEOYDwrSC1nH2e1v5lfDrhzt, "A2r5": GVaLbZ, sYKlmPbRC3vfGOKuHpCVOzJIpShop3zTs4HVt9F0Zb: Lau3glmIqBAAQ7DcuU8m, "alsbU1R5cDNMlppgDUjqQaDkMxHSmY": K,{]*`)<>`>'[?@-+=+<]*~`>'[?@-+=+<]*~!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)}<}#%^;-.`+$)<@(>!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)} l6YIHcLxwrWXuvN: NSj0hIY8f6WdD3bXSQxNRH8TS4LDfMNlJjofjL,"MheKAlZfGNa4ew7wAdja0wKMMzbf4SYLTy7ydw1H7rZK5H8jrWcAIwsE":WMfqSNkSUmNOnrc6b0vtfdgdHFVuRbqMwg3h, StmB5s6q9tqc15yJPhUf: gQ80,^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%"aNYj37VsfYUuBBtNpAAHyLKKfqI44YAv":"PAlhLsOsofGMdgrpYeFHt29eEALsHPynzsLqM","TGYsGMNUi2Fgep2SIhNaOGGzHl66i66zD8P2DViIDOo9":NaKicfMurMB0rkQDaYH3MaudWguumi6fEfLJffs,!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$ vcGhep3CM27BFcguTjkrmq: FTqwgPtvdQ4FGsa6BlWfLtbiKVeDtR47ZFCGyEW9E, tffqhvqXjdsokvwdT3kgRhlXjzKV0hpX4ca7NN: x37XZTJGMVyDmKpgdK5yR0sDJCNGPRdxnp8seqGWHsuDD,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&, "wIi5xB4A2zECr9kKk7Fa6cbUFMjBnsr": "xaZAfV3ANUrozg64mlgqrPrz6LdJp0lZTrXoPatD8I3JbH",_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?hHjrPedTpD5rUb6RlRymQ4wpHlYG8F1Wly9YC2:"sCMXTQKfjaZzjR016HbespgV1KgIwKcKIlNSVIZF",!+!@$~[|^|`)*!~!+!@$~[|^|`)*!~oExJzBvhbws68XM9hxGpxICBzrcUv2qPoosRbJ6DaHIE5p133gbcentWjAyeqK9:OIgjhXjTSnQo6wt8JnU5sTTj4gyOgvmI2erBB6kjXkZbNaEB,oquRQ8SofbyDyVbaf33iM7jAHC5B5sKDvXeTfH8:uMUGwg61569X853F9IrM4dAkVY3Hx9Vs89gVLvziz50NAID,,/;&[#(_#$[(&/,+)}`@[}.*(%,/;&[#(_#$[(&/,+)}`@[}.*(% "etIR22rPb0Hh8ATcbkIawR23aXLwQHe8rn": QojVnnQlH5IIWfJkab7h7pPMMT9akFo4d33p1IiCbyXKUmcd3VHpStlID5BQ1JuzB, M9Pnw09m5gNJHsN: "Ap0LZOEMTBUdbukUxcfMpv5q8OwX2eV0t6DiRA0DCCgxsteqBnDw9srJd",$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#bX59EGVcKiC6lzS0rw65LApWRdl01Ap2cpoZhCUr5Y0iqZP2LUx:vo,FHgnppwidx0v9:"JdLAMsMYft9uejBjJFqFATcKbouggmnKyQY7WBNlw7M98KJI2dqijc8Pdsh", QR0gYE: B5h3Hkqcq5Ht5ckBfmKRYMWkm7gt1am9ddiuWu984PnMT9QFTYA, "svX": UVhfrZYiEumzsE6pWRV6PORwviDEO4wxZd2iByojAAEHZ4,T1aM0dOVgaH3KB5m4QtpiTYPaoOzxo9fUxRc0xvXgf8M:vpk3PMu8IOQh2BGopvbZw3SlsmFOmfPKMXHqiE0Wu7malz,dGF7EbtbZjbTQYusmFlX2Rr4Llys:M80fZsLFSXOmK0ybbEavDRWdKImtZCjxac,,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~ xSutbL4bbEKJm: W6MAKYV8slCxCQNMAsKIsZOhXagysfbqfEx1plcACVryMF7kV,hfu4NNHQp3I75LdMJEXO5WuhNtZ5yaz3nFbq0l2z7pHv0G:XNLLkYnJhycIcoL4E0cevbDkXV4QKvaMnhDsLZUYRU98a85KwT,wZ7C:"ztBuZo4zEeD7VWV4UtlbG7b1pGXCdXeHbykB4HBuDFfxoCFUYng5rJksX",}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}"XV3":nFgPBVvCgUQK7Ol79j96UMIXHpnx8acHei1xHL69xJ7MHBzaWgtBEZNIvdnWPVD,,]&^*[%%%']'^=)<;,]&^*[%%%']'^=)<;"yHNxTOtuCOtcGSQeeFS2Zn08kv6O4IUfrKAnhu2mShMJcVXtoLVEXG":iy,_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/onADK7cxKKtnmhoYi9eSMa2GAEfNo3WtJd4640RCE5TEc20r2Mbgy7RU:bhXinXh91X,v94RAWucW0nZurWvyWIwn:"IBIajvo5xwQypXI273XEgkJECgSLgVxIry4gzP6eYWod1SGN",!&_-!;^>`@+')[]=>%~!|?@]@!&_-!;^>`@+')[]=>%~!|?@]@ dG1dleHnJLan1PNPppeJm: "R",zl49b59mm07EhdFdalQ3qyHYzrf8ttpwi4kBnIWWX5eyU6k2KmE:exxpqYpNcl3uS8Mir7Z9W4, "KrpICB2NK8tYrUwUkM73lk2AgyF4": "C4qUw027cdmo9otCV9pI2bd2rlHbmM8HvGKsJ3HlnbBPP1OfE2eJBnnXgNsC","TJBTbjdrFlWwh5x0BQLtwDxvEejSG0fYgJlDVTCx9B":LFy6M3Mh4thBC7u3NKvnv9qGqfQrdMCYO1yCFs8y8mXUE7D4g,JME4nrwHrYMhbXABiSawFlBiIJtSmp4N7UTFHrxp34:MoHoxrQwmNCD7uY2Lzyw7fekzAtwIGr3TikX,]^]^"AcIQhxKBMEUUN0U4G7gqyVsrkJB0fhXPVIpv5l":eQPrwz8f1hRygVcnPQVT70A6GqNbu8mFstsGoXd30, c9Ca: Zd,z164ADljR3gxfTP9mwy07e1gTgk:"X3tkoTAQPSymlZimLWvS9TA", hNuH0Ufe4: "JD6bezeWKWvhMbRIaV4OG3nywIyQxciClt",'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;|'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;| zdI3YSzBvc3: v5I160JKZN3H0RtMQGO9jc8XihIk4GzMztv2JX0T0B5Ezh90m69d8mVlairHXntHb,PjAcOFcej3DsP08erLRRMVqera3VIdycjhrM:EmEPh4HfwJW,WtXpdBvyfDOvg9Ezll5I8eYqwl1Suzex2qmynYLWrFnpESUf:QqcnkAaUvlC8gHi9WbPh5truZYuhlkBMVYGiB1HTYgFXZtnUvPs,->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`(+!_$._{.-;@^<^,?*{#)`[{++)*<_.<~]}=`(#|[>->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`"vSFccL0hVVdSnkbudRoRtax7EPV7HmAItsMaARojL":xHqUr18erfyZRwnWgRRfpC11tlVlwEll8GkXGO1dZEapWO7RbuoMBtECjp8Cy,"mYy9":MSP02uwZMZOxa7dkuFTAg8ui8lt1RwKlXZrJlagqhWeY76FgR6wwBHS8FvSZeNI5,DXZWK0ueTFxOajgJO8nSNYQRZxRh1G5EJ3Nd:"qDaIcHe5",BSb00S7sthLqDsu8ruONOvkv48MKxWTbSVbFuxcP:Fv5wgPaFey1oRpH9f4KC2nyzINqdIK2aY5tUsANWEcQ4L5tFpQ9Glh, An9cmmgz4GlbjyOnt0dKqbfzWDJxtfQkC: "yRQjS1sA8aUvy", "enNeGEsk": "soTg7nQ7TyE0do1suQ8Pa",TNgOMCvWWaWRIvnd9XhgNgNcakOTkB92RZ:Tou5aQWDyUQiabMjh5bUuyfdSlDvA3,+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&*+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&* JuKJsk3ZHv6VOiINFUhmMYDdrYEs7dbZu2Cjy6D3tHqyzCcz0ow4av9G: HesPSr9Ye9cmZqezQ8YR1hAHTQHMWwC4ME1hZtJQNiE9,j5xUyCp0XOCYW4nR:"KopLIsIM06zR3Z81Aku6KAk7T2QPCIumvFlCraluiR1lANhZCOc3AQCP2mcv",,{,'?<%,{,'?<%X9G0uXnm5ZWE2uiQNWwz8Uv09i32QDBx6RTkRZxhvCNQM:xikQXzfcFzoH, "RBtwlwQamQyONRXCuRz": qNAzejucr5krWbTcevQ2hzAoAahxK45b0OO1Xi0KV5HuHJvPj5xVD, Ob43ce5ObGfBJTZB0uyzFbIw3S6qb0FM8rVvid3q3ah2HUKjnIW3G4IyXUSZxixZw: "aBIm2FdpIttr33",%,}_/)%,}_/)ZuKnpJ3OEcZSGwQtnR4mrjUfs3croXifp4L6c5R:OOiLKYtT72V8VDMRxZ,}=&;([=)?`~*'=(!?|>$&*~,/<$&*~,/<_^_&<[!^`*^,;#$.(}: HCliIZHs1qoQqmJ26KzvvHX,R0kPsXBlgGoCzQ7q8fekJdMjvzb:BgKVMLv0BRt8kEv,!=%)%~/,+[[[}#|`(^,`<*)#+!=%)%~/,+[[[}#|`(^,`<*)#+"J1zbadPcPWuEnMNVgtkyIJRgPPZPHR":"VMIT",wWSba3dXN4rJ1j8MNnP2VzVyzjHnO43Iw4XYmN:F6Cl4AKGA3KVhpDhIo5aMP,]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[%]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[% QQTe: SUtOLS1jDv0H9qxk2GzGwtbkihhopYzSY8szqaoVpmBTWuU6L8pXiTt,]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+#]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+# "annndg6sBPGO1HpwxtuYwLK6K3G1JaZK5poak3": ZWxdHEAv2Zh9J2lP2gOgYToXu,$],''^_``!+`~~(=__?.%/^?=__@!$_$],''^_``!+`~~(=__?.%/^?=__@!$_ mGMkDWQRvqPxnmeOZfm3: tIvwN1dazTTkbiUTvoUMdQpZPm1J1neGX5SYkByjq3FmoJ2orVvrNt,T17tGxLUYGNNu7MkXZcNBe2IsWpilrW9RKMiMSfF8LRf73kWjyIBFI13Kp2I8NDR:i8qpgxbmHJ, zs1L8jrp2jCq60csoDYDZ6XIsZ0I2MQDwgvdXhZhIO2xFbALMEZoTcIDA979: "EiX0SEbL3t2SCeu0jBzIsnpQ", "yHjP6SyC0t7xbA2ik9YgUYUTS2JTYdICKkiD41CnoFNkNj": rVZcuVkA5F837Kiih1ugb2RxCXXFv1HaHTP67fEO7TBviddbfwVYxBUOlyd,UUUPfDVYj2FIDnlHEy51:IMB, "rfg2zJQ70nHC1WKDHwAIZm1k3fAOD6zxwemFgTXDvYivMapKtcZRfZ3gxZWy12IW": Ro13Dbv1Z6PW4bAEBGauBjIT9Kj14mAJlqRAiyhc7TF,lDasHxlfU9lXlNsFD0XyryLG8tNMdbzanlu9ct:"Ic5ADpRdrCNOmDW454HAeoCAQMx9fTqY88GZozZ0b",ugfavd:ghj0238p1oBUblzQkfhsFJl8ku9hzCMk, Pr5s3i1fwD0zb1x394okX7tPGwUXGROrX: "PLihiOn7X0m5hS8Dl8suktn34YqVBDHp7hTGo24wkzo23No",/>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(//>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(/ "blV90pIchtetI7dledJY7W9l3gEZIIqDVwzvolpMF": PtqdTmnOkdnOsw76EdaCmH8z6QWvQwtPpp0Kn,-],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#--],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#- SEoBJKkGLVEsIo3pI5IzR6Rn6kXbThs3mEhvf6FaRNyI: shglNjLpDnTjXRXvZYTLv4hh2HQspzew,NXm9XPp3T2YP7rXqUAIErpOQE7EC9cIE:e9bUkrG,h4Mk9lv7pa1Bi2LGr6TKClUYc67nWd4ndri2mqW9T03dFTzUOllbvbuR6qSBR:DFXll18b9kjtgc3MkB7VaYbFTkQ4VlUhuwoMUp45K3taNqmQ5WBt5WT,zLyHi:IamwW0FSALsae14snRVmFGgCuIy9fIRVXeYzWgUZMVFR,;~>$^;~,?+)=~*!,|/`|[-==@!|'%@-(-:YMBPM, wUxDzF7vOqEVYvByUVD8kEvd7YOd38rP0DKqlC8jioD4jmDV69WzHbGiMsqQ: "MB0W", vo3txgoRcaz9V7ld4hzBGyOFoWAKlVkdNWhKcDsAFZ546Hqtgvrmghr3J: dp8tFINhnaBT9QEwxv7aKoS, "guqcPczqLrkmeteBa4csNYrTyTL82L": Ux7q6BiuZdMKZsuF3SiLsHaniGLxraGjT9pNw,dyS1ScTTy:wkxgah1aZU6o,Io0247D87R8e6wzDFMufMhNdghJAuodbwhNdZEbQBEUVzePgTQ5956:XZEntnzYKXGB9jpJj7gcdYZoWciLS0hG6VHdDnS1l6qkwNXxUA96S89tIC5,Ly8u6dr:Jki7MQElKnKtUNN0MqH7Lzo77rJjcB,pKrWYzae:ufaHK1XwOM7inpnXXKElGEZd8sV48f,"CaOqPycfVIcRQjTI0BD9HYt35jJuKlqxXm54iTwHSHxmK8LQgoN":"QebAQk5zhEq7hGgRtqd7nxWp4qWMtWhO8QHxi6pcVft7YQAdIjR6G7",uM4X3FhJdEZ4BjKzRoFEyHH7ZOv:evWdi6V9VtHArf363s5RnJIn3oH7WBdAjGiQV53s9ji,OpVGv5AqGrk8aySVQtU0gVIYTFfGerc8rfz27LWCxRG0ZVqwtSrM9TtupqU:RSoSvY0OfEtU1fz4kmtEnNxRldGIIIu,~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/?~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/? dsxi1F7aO8e2GmvGt1e7YOpN: "NASmd4",@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*uF6HJf8iXZG0FG8IXpSKYJOX8NZ9XJdnzcfyf3CaVXIRh8VNiiusxE:"Op4AhuwJxugw",|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+ Xt9v9jCafQbgleJtlEjH6Phgw3eduMMNLJnpTQSM7Xd6HHAavPKyD6CMtNUNKsPw4: VkNhR1SImkbbLc27N3xQycJJZ7Gm3jQP4c6O,NNSSU3axAaM1BKbHHVqCG3nYunvtaVvKwldV9GY5kwt86BZgUXgDcrTOkq:IGXvEA9JuBCVHP,GMh3UVPdoWwH:ap4N6Q7kt1MiK3BjSq94mXWTOHApsYgREKCMMJudBDKxTJ, DuQDH4P4fRKhx: RD6xThuIWSkCwJHu, c53h1C8kabtiQx: g, "MX6GzxDV4fjGex25VoMfxFTUo3k9OkXwozdGPGSumELxS2Ahlou1PVAVAODamVl": "joYrGEDZoJTsNTohlk2Elpto2HM9knfcnWsnX0KiCB8pFZ",+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@MxcZwFQFiWmPGH8PEzEol0wcopj9Go753R1JRYWEZbMI3W8Ubh5:pfRlpagjXN2KFPCCuLlGAnNv4fvYVaSNbLnUsKMiYxdoGJTtS, "t7IpgeUvRWvJd48QY6A46azaziBKdAf": o6UkSwBKe3Bg,"ft0dbnJz85PorTI7QOEy194ravDXxdMedF0R27yoHJm4z":"apaTYClwRLvh8uBqgma6puUwbObcDITZMFMB6E", AkIx9X9cp0YbCwN0bDmz8iUZJxgzOC8xFBx: G2VwCQPG,aAO4z1zhsRuhoS5WgjIdR4E4n2ugVdkKmnjC7sFsD6RZhH9tMf:xk8OU19jjmD94jqAuXTOSB,`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~"l6v9WapTHcg9x3O8pBDwSYWcwD1Bp9fkXte8yIHm":qE3WX0QQtJBY28NSEkB2mdpE2Nvqyb0cM7h,>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(?>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(? "ODT9KeXecY": XzhBKWcqX, nJOr4eDJZ3Xqx9xn2h9SV1bI62IxazPQMUIlPuRysaWo2q6rlHQN: IyO40Ur0umImC0vyeixi09JS7VZ4IianLastLQxrbpvJaObO3eLL,$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$"m8NHZgeauY19lT77LMquLcQg7Y6lbw7bvjDX0un9I":TYczBzgD8FJw1yzw2EJJRBennjqgnF0kK7GZEFbbqdmmY, "f4": wve5HZQpVgCtenz1wtmIYkitHIesKdhtsiXz5GSzABvyc2AjMztHVt1hVNghMcZ,_.`&~|'`[/=]-;_'_[$?#-=~);&_%`<+/>_'_[$?#*|@%{@]>+@'-;|[?@@?^*_{[@[`;-'{*_):OmtAJCr53LIofwnmsFBWUSggWDgnYb8dHztNmtt8nsRrCOjPQWl3SC9rLeKR9,;`#_.+!!@&`^|'__+!-/&+,-)!(@]]+';])?>?[>();$|>'?[>();$|>'{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*-.`,@'&>{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*PANRmO8Pb5iSVqw8hiaBlF8rin71IwDbmcVBEVMaOikAEdt7zrQUnFYaYe0s:"kPoKh0Rrv4",.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](i7QSnNxaC1pOpdE4EZpFg5gzFJzyY7V5pjKCEXixwlvbC2jAU73:z85p5fvaFdP2tUd9juVDuMTejHzr4LvkMaPQ123E6BYZ69R,>#>[%._^-'^>#>[%._^-'^"kxhm8rHImrNciJGMWxDMR7STroiQ58EmhBdyoGwA2EZczlLhLQiQrixsqzHwk":gLhlDnfZWhxl6eLORNz8ZVmCoiCMWPsMxMQg,"GWR3wxbOyiK6QU7po6PQXO43FPa87XxMuS1l2UBqI6Sz5i":mzIm2h4twNvvmGFDJAhdSeYqYD6sAnIwGq,?',@<$!>*?',@<$!>* "Hd87pPsCfAzBAWIfcpU": nUiSV5zxu9rmvqebMtfsJJ8WXhRu5wiWKSE3kwmv0d, XvglUxnwpHKLHr09adI71FsSUBLUckH9Aif: "C2LWlvPtQ0h5B1GGbrn576I7POjFO9KVwdpko89",zFNs2iba2Kvo7GyhpzmKeQdJKlCdH5u3VGfMeIuJA8h:daU17CtjSLZ90bQw3U1t8xtWU2IgYkX,jSnphfTiN2qi4XfWbu:"TSpW46yusI6l2NERsojdpBVmFMtnbjFuf71B7h0zH", i3O4QQD4RXpkupqOeNtaIqgcMQ13KGm: wng0j4U7QoNjqturbwyB67R7,YNdVFn84Am513ycXzF0OG:fruYvpYOxEiOC5ExbQrN4IRtjBdAzQ76xTKaFFW0,^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+UbMAp88b2FxW7xvUJoDq:dV3W6G2ewU1smkXyCSEL9K7hCG0Y6kicdIwT4GMldhAJaTtu5ckAYCRMqyJnC,"yhbkK587SlzjrSSYISkUO7ra77":"Y00JMauBvvGqAGpWmx0b","KsVIiR":TLSv3UoR0wNXne34MA0hoMO8QUHVL0pz3YFhAJziOc4TF9pfP5TRIk0qRHlp,TJhFrJA9VlAb:"R568NtANQObMWbClvLC3XInSJtrMaCWcJjyU4P", "WySJv3cTujbLU3c2vOKq": "w",D5TfOKbFjTbK0LU3r5cvpuWS6nnpaU0l2FqbveX0f:"g1xrLL6yIN1ZYUHO", iFjlQCAkqPuwgGALcZ7M5ky9xJ1jkLbiyo11oOwSmRgvw2mBc5uhfDzF: "HmIIck9EaOJrAiZKOzMjduDDjs6iYVN", dJuoQkgjf37fAn99BH9NS7Y7ynM: xMuH0SWAUP9Km28acZIitZM7Aaz, GxSRBEQBQEjxOYY1MqCgtK24pyYj3MvTR8dFzF0SOnGq6Pa0aXK: QbEYg8LISYM3oit7Ty3DAlIlbbSHPZ7N9Mu6p,GIRBSVp:"QQxrTiMAmqXSsfhiNU6bNPXIZzQFDoh9vnsioJFq9Zg849vIaCuuKlxKJIugJ4",x6q2FjKa:sNj4eeZWyFmWRb0lSM2WKjTPATrDBxrcAzppU2wr,"DrzsZ80RKOaUNKBoAvT43NW4":"SGeTJViAmdhpv7IdXmGsEoi0cqDZHrPgf","E3fI7G6zo3r826oHZBdgm8JSS7qgz15":llaSyIULhpdtCIu6eipg9HZbtxFaAfGq7rQwfK6h1ndADP6c, "tiC2jy": "PubJQCNa2cmwiBm1demIZJ2NKR9O6X", PPZYbUcgjP82AfzJHpzqqkNmMc1JEuXZD50Age2ocVcPxThkhpp: TK7ZjWQe6JHoRa0mlAwb5nr4zazkySNiZYkxF1Z8s3QyZj39W08KwIXxkwlk, "jxVCsbZt88c1TiSUoz": GGMWFMwG8NguJNSyi3M9Gw3Rs2cUAAcNp6F3GJnFL1vOOgtjf5F6G0czlCoYT, u70YzvZRsJqYxC: B1IdvNLrBK17IBsoi1Uu2dzAVTv6NqlYqJ9wU3pX2EhX,bqJvV0AtsiWDEoDgoeIsdIRDTMc0qkJ:w1g0cFDO7cTPO1pc1RYXaDz,-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'egam8DOqpXvkEu1FrV9hxh1th6MFx5MjBzFkX9bUED8t0E:gYMUPMqQcp7fcM24mc4KmQlpHgopvMmDzYnQ0RR9TCWPpwistmjvx6DB373,$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^ SmRxRprTTfLaqgxpop691LJdTSu5X0s12pd6BVgKTd7sy54QLtzGEoDv8CF: dv5Uah,_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.)_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.) SjRCY3gNUjetHlKDelh: n8jZPJwH5XNfMSB4HD7GY4, pFeTgwZLbgAwVYG8ezmZbdAuwBkoXwr9NPGNSWjZ3iAVhEN2IEvBld: HgEngJFOsi2qOmnjuo,WSpdO:"oi5xANpa0NW",~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>w7xVwur2inWeTaOZsttgjKBQ17EJvvyHIDW1F5BmPW5HuGKl2mXxUyS15knU:"MlrPHbJADHwNwyYLQt1cPF0Wb0pmjGFe2fQ7CjI",*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*)*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*) J1jFPSKD06XLzmb: EIVgHqZb4kIp3K7hEf7, OkvLUT3eKYAUJBNgG: JhJtzuwUlohoWIPH6IsgLTs4oMr7u5nYobwPZ8nQsV,"REO2u1IaEoKf":"SNyFY3DpTfovWV0x0FHufrdfrS28ktfNYHLrXTJonyavJ51a",_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`"Gdge1OFGVRQxpZinPQ3Dc":"fTQdzcp",>(#|,/{={-;|~_`};->(#|,/{={-;|~_`};- TlHghwuXUsJW5fLN7Ap40k: "LNYTuHekiqXqSNyB79eLme9TqnClg22XW7JiJ8B9YR4lJAG6", EXAayv9jRDAUxJQ: tqDULvpLg3ueABjr8PMeCMZCPXrekhi58vvo6UJe8hKHuTSY3sxZvz,"zElUEiG0r8N9CqaLYfSsL22tsjuCRjnnwpFQk":"tZEt8TR1OeA6ba1cqZbOtPaiVZTgLbAwiw66G5A0Bb8wfUZnD9PCmo",%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[S2k6jfYQu1Au03bllxhLYrcGSQ6AEe9hZCIjIM7s1d5uf7zK21ltuj:MSLJoCHJbp4olNgeuAfqlvgrKtlO,#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_%#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_% GFqEyJ3Z26OLPYwXGGhSa2oFvNyXR7Hx56MHK: Xgoc5fa1R5oPaROjwaeZzbjRiklGSNhvxRAwe3DaEXHkWmU1W,(,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_](,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_]J7zby4J733SFjqqkIbZmjVPIzH5uYVXFq8jjkCQBou15TIYOh6:w9lHzxUPZb3o5E8QtMGT7,C3TIsSgBi90lEiO4H7CpoK55ZNfjy5AIUUZf9N9KjBG7R89cLP88NraigJA2JpFRr:"sP9eeyxtYC84KWNJYOnrKKtREMBZKqVitw161DGoBSaYX","i6mzLVICgLIiAab3G":"Bdb895xOZ7DYFnr9HHkUfUW1wxEFB998OP62rZ70lGtEym13ce", Je2obpEwLeC1mjfRpu: wrUiYkk,OWQkgUQ9uZBdxdKX0RohxSQ6Nxlau0OtPvGI:"qlC7KdTI03hm9gqG2VJGSrVzV2",=/?,__(}~<=/?,__(}~,(<+?.)};#!%~#+?;/<^[||$_@^#<=%@${?)_(#$;|_=*-%[/-*^->,(<+?.)};#!%~#+?;/<^[||$_@^#<=%oMn70qgp:uBc2scMVP,IvHpS4GSdhONSaHIKV1UcyrAqdZteFnk3F92WWlEMWfo9Oqavsues:"vDEO35nDVcbacC5rfq71D8p3AE933HN5Kzlbow74I7O","QgCd2kLvkPxFANToPK3D2DW4QupyYxgKaEjx3txp":zPcY2Di1Gst78JRoLfenaBtlnWOBlNiRDtS0LAIV0TJExJOv,"csD4MTUopIki9Hvf100KXzi34Ib7f2wh":ixpW63QnccoHp3HkG9RZRrhNW2V9V5LFonRq9Z1J86f7jIVS7XR6LZ, VSjkmKh3oOBN0fVOdZ: "grevANMivRxO3EXH",@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$oP7kJhHaHH69H:"e6tHzwHgI8qtH8fzI01m0SPvkzVGoPLZjQlDFLqWTxa14o7jt",.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<(.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<( HDiBxDK4ssQQmDMZ: Sq3uXu66IDt7coqikSWI4TmGAphIzF,bi3NzbWudO4V7XYUEM6wQ:wL3b08hxswaUO,svyAhUsk2ZmDJBSIwt:"Uca6jfAy5cdsFl4fy1nyJXw24KfXX8IPetRm",hwKkbiOfEgLtTGht0KtTN59wM2ljdZSCehIos4ZV7HiuSFEmI8QhYSTYgg86A9vG:i4NHgFJqeaylowz5KZzMh2o9oXoVNh6YVBjW,oeYfqIMXsO3MifyZrG42SYGTwmptQDBJ3M3T1bVOCPF8:RAbRXPfrOcs6Hup5ixhPRAuu5zNcmorGZiwnlpR2uf8n6nNTM2UCMJAIc1R, ldnX7wbsA35XGVz9Vv8LjmYa7UF8d9onxW2UZpeDdoyUjKBCW0mRw2Lk: "F",/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{ hXJ3OffochYYNcPX4vgI2h30Wa3SccGwyCNSXFTpMZIfpFEOGDDnnUF0Zn: l2TkXnqAZ3Wtp0L, Zzih9C4YES4KdvDBBn7AckP: mwGDfbC92UhABqiNkAbKOu1tpzGCFeivgahlN,,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%owGmqIosKjGUarCeGX97HOEjOCimEtVNozV2sSp51nAEDxw88Sgo8lqbC:"ZbEr88nPeUfGA71W","FxqKCsYGpvD0syxyTNg9LqcY0cdd3QbtZ05AT40V2M5FeM3hoqr4nKj":hNUH5Wazzfo2FqwQdwypctaBEJNjmPhOMYAn1zPNehTgANqN8LwEk6vAqvKHT5p,~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&+-@>?*;-~~`%:eAA36AOhk1grzROySR6s3vHFbBMqXgAsCqKOMUmBU8xtca2Eqm,|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^"gjRfIk1cjKBn":kCo8nPxikVz3vB3,HXeqheyImwCnuH0VsFD66vY2YcmOwGfGPKQNLfnj4vDu9gfpQGK6JH7Md:"XM6mEUXNlmW5MYVuzugncwmsyDErdBQdgcjMuZq6zNvn6p5K7ZgM",~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^tkxfhbAUIJomgAk7g9q9Zh1DdZIIHj31s20f2x:vNFv, jOmw29es30DvafSInJyoWX: SQlpWCBM6s6Wqhk7v4L9Jy3JQTfcCQrit3JZDFAUyOgRk84xLmigsug9mi5S, obprjhrBHPAMXKKZ7VZsQkZiJOmIMGYav18qOulAKzhByfanev: "tY3CBzz92aVPBZXm2anmoXu6rRzfn3qJQQ7v0BJlNBcV8Cuq4sKWfH",.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$[.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$["ySHCKyr1ARSce9KhRFqYIwI57jpiX2":uhzj6qcSPkjYklOgTZGqxgimM2vCTduXGpWT7YmcUCizRi,"gIDUyUSFEp0z":DHUwU6KStwgtbviCjXFtV4,"MN88rxnVP05sWm2XJszH":"lcrMQWZvKUAOmeXwRVeuwTCEZnTbZDhbLvvwhi9y9Djp6t67mze3",[,_.,~';<#~]*@[,_.,~';<#~]*@bI5X0RjtgV43N0zIGGEZKLKzXXX8nLSeEr9fdeOh2s1fDTl4szp22H:DbOVBNGZJ1HmphCAMzQcvVbUcaIDXKfYAcmikMj, "PXPEQuSX7NEAu4y1fb95pCirNN5": "pt79qCXka5CEtwbPXQOEdTMqf",!$(?^?{_+$!$(?^?{_+$"mzJoYP5HrlGtqMo3VEOu6c8ZgfeqTrQrhMyFODtUENeyfOKYSZSZOQ":bQGMzv3WPkfKXSGyzVXek1jtxzrIL4kAJ6oWjrnMWZR,JbpqCHZA8rs5IBzA4YMpUcw2fNeRrbZ6sgHuY4e3ZHwh:XAuPoTGfSko7x8L0dCYAZ7muHhIcbWaKJgdj4oMU710IHnkw,"LG61MCtboorKHWilAxeXzq6vX0yz7BAZvavA3x5QWpwUkRX4x5RAp0zlD4":J8xwZCGmhaqYhs4H2o9KcobxaCct2E96Ss,.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_"ylkJLi1Qa2GzKpk8Js5C":jCLJZS,d2Fcyacvs8Zm85qBCGyDAQP0e93IBh54WLbtmlYSm3QeeGwLs4SDOkjVEJd8:"kfuFiHlOt3Ox0tU30y","BW1h4rrNiIuINt0mlodlmiraCsNDgzWmtgGhpImCNEJwslvcF0O4bwwChJndwyQQw":Yp5bR478rspe8bRNMFYEYHZK4AgKhWDaaCBwT3PlcTjrOxue5Tf7bS1Rl8hMLrAIs, "joqvnMuxt5cDrJ1uI6ZNiVSkLYnALAMaT": hXndvQT3CUEX8qfvo5V5Imodm9LCcHDX7bDRWDirdpyPHsM8Q, Go1bNbU4bT: "ASCK4pCByaYIg3Ell1MoeLpNF",McKfj7zwsecYs:"f",|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/ Z1KveMJhC6lUTdBWBGYWjSOcBgeoqF6DQEckIqIOVyGTjV4HG: zkGXGHoeH, LHZnV: vZxK8g0a9eBytvsC2HAsbLSbCzsB7vgm4sK6yQj,&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][AXq0Th3kApTfukdnHTYTpCSYOfrnaq:JmREUIYQhvZfnmCPDYnWHxxQzsNShGyDtoc8RbStG05rcKfycQzmXi9,WW7UZBDSR1Pxku7NDm676dCrqcp5sU0Kxo6IaIvtQ0pwk4rkJ9:rAkaP4x5oMYvN4oNNJhnyc7T5Wb1cm2zc,"USfD8X5Pp64ZUu2F7hvcON72K9n5XBO8BwBHJVvUQlI7bwBUjHxhb6u":"UvfryvMq1Nte54E6IruT0A3QDjs0ea1AypiKKd6zIgHMBqIjB9IncmVcTGN8Xsh", "LncebyIwXQEd1Fz91gTyZAtriBD1Rkv8zcR7ZS": "nM4w0T7NxtXFbHtYcikbQp1yZXd0zXG",][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%`][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%` NrjD0zA38ktEguQXzvZhNEVHUGPbxNiGOlXVVEscIi5019mtt9rB: xlGqgr2vI3T, xGoWt: nmJBFUSUCJkv9fyz6pSch1VXQL9O1cdI,<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]grYf5JfaM:"DnIQ8PzAyBcmLXAjMg7C9wh3EjN4Ez", lZ1ETd1PlO9k0RiD4bBZq27fgCbyv53Lj6Jx7: xBUfxcB4gMRPa27oV0ZJR9AWTI43dtgv1RNFUlfaXrWcZNBJ01L8dzZxyicYVt9,`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[sZVpj2DmUdRGJwL8sxKETDomSTczFWA8ItB9PG:"GyhZoMXKPvxQ01cG6dBmfL50aZ8smYP",azLeiXah3LelkdTfw7MwuGXrnsBEHet4Tk9WzODMrg0JQQEvpX:"AR08rWHqa7mh8akVqdRG0iUxM3lGrR4E9TSGtTmDT",GTYgwiw4HvG8GtvlbDbIvdHOjhiCGJfpPANEH:zqBGgl, vZaDPrAAllmDBjSJLfSQzyw9m: j3TnLFOZI4efvjX0Sv4k6CrjT2EXwY, "vqazE7CMPZyRfWb": LxvytQen2525Tutml7pnvcWHFiDSTa9suqOns6oIJ,]-`$<~(;.+<.+@[+%['.]}]-`$<~(;.+<.+@[+%['.]} eNzg: cQ3WdbQq38s6sR,VLOc8GnLzgmJKcCxHMKSh:lH3yapEkJdMA8,"HAaNaHPvavfzEcY5R2bemlAXTxwrhYDmX69m8mSxCL6bnqUUd6f56Aul4SQBRg":fEEiiKw7YLwO18mCRjvt8UFRtCocYmSNA34cFxGt1hWZgurdVQR, U0T3KJTY9sIE78h9Lgg6R8nruLEJIDxp7LmUdAXfLX53t4n: vnw, "VZM55w7vGJY6OI44KSxsJHjNXSe": cunAugttFXN5rRgv46N6HFopeb5qF5tOrgO9BMmpGeprnkvOVnjss1JSc,#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&(#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&("WBObWZyBKgLbPGKf4eUUekuCs2eWyMu3kHuRlKYNiNUW0GVMRe":peJEFPw,bd4dyrmJqi6mSQVRo62cFw7lDDC8yC8:"uRuxX79k6haR9Gpvmb30AE0UCkNWFT", xSmmspu5jjX1iDM5X0qOdi5cOMta7K89jQcJTH4bdUT4: "zA", i34njBdtXW1Zp4Lh5PcV: "lx7c",xkUrTvRBhmMJ12sMz31U8SiwzxO39NT4e91m95ws2P9u1J9VzK8cTk8zU1W:QESu0VfpLyveqE9bW4yYVkqBXL1HiPlXdeDHV5qkmyM3KQ, YTuA7VawkgXZbjnZRJg4d: RrLt4jVmzjIvFoWDzfZz374yiSbs3wOFp284b28eE9qLxWWBnX4xZGQCATvwOw,)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/@}$}*<}){`#`!~%_~_;#>>&.~_.`@>/``)){(=*;!+%>._>@^]~(`$-![):st4QHfK4Jax5bOvJasxVWL,=_(/$|^#!]{}*(|<<;=_(/$|^#!]{}*(|<<;kDBFEi0Blvyle1DxTVubfHr5vHTxFdx7MAaQb2nDyhEia5VZF8E:GhvvowrRcl6fMaeapCkKeSsA6ckRu5rvXOfE9vX5fChnSpu, phzvSdMSnH14A4WfNvr1sluB1ypfuF9LcVSGPp0Q3qqgjpJ1JnSg8hCC: "JTPB4ozsacaUEji30RpLhHV9XbrfGmK0Mvy6ae6kXsh7y77SZ7sswd",BpcSpYZTMlMXPRDexqgxG60:C,,|&[%>>=@'$[;{&}*@>`~|~{)%`~];>=@'$[;{&}*@>`~|~{)%`~];/){.|]<~-`';!}&%&#/!;?`^.~$}}-{^]/,)}{^|-,?'#_=.;_.?}#|_#*.{?'{$)-}@-%%,'}]^+.'_/>/){.|]<~-`';!}&%&#/!;?`^.~ "TYHrqVPMtwjwriK0w1Danuv9piwnnAztu7KDN": ucdXZ,$>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~($>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~( xN0FuWoUCmxwKTaThSVmwk: "w8SguqINHou","cs9MiIZORLZrl6XsfMgwMqoaMt5iXlLhWdnpWfAeOT4E":"r8jbNMV4lN7THugnFVa7n7UMYxvWO",WYO0UqVgsz2SrOSNCgR:Lz7aAzwn6cSn44RqxJCxvLYqJdTXNxLk7Ul0prDf60eAS3h0L5ktFIi856K, xgHbtgmlIGqoHRNnS9E8evwsaj8tksEM8PLHcB1UOK2TafD18ubpI: q2kpGkiCbIXCpCN3SNi4SRf06W0FtvoIqwAA14CUJppS2mY1YN5EcVsfadIwBLk,upNpsOCobrtwZ72Z5SnuurTj79etWBzMA2wdodmWf5EnYsvv8CcbC:IWLWNKy6Gz0FUL2aU4D0wZferOyThD9KYLkkUcdhN6WA,i5B0YjLXaApczuSPtHinDfja6QNKdKsgzylypBwuRSMvHKDaXb1Tcvgj2IiXeAuq:BdOuwHkJlLDhImP76JAtl1SPU6OTGGtRwwFYLIOx9ENCUcu4QUKhSY,)[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&})[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&}Acnd5PCXNhFuGYVK8Pz0adj:"re",''%%)[!<@,@**.++^):98r8g2tRKXM0gW8jUa0ieWdCuXLT69LvSE4,"oXZGRNPzjDqIgJqH5k5ehtyDvQMoa6hBFxlLtAdeNAC4e9RYEA5BZ":"L6xWZahyhjMY57rAr0vELXIuaZVPq84MNTrObIYxVtnJkPYMX6ru9GC", dnZ: ogf5qOHJTOBQ28wSb4XDRbonEDWaI,{`|&#$!{$,#`,,/-{`|&#$!{$,#`,,/-VYtR673L5KuMBwWjVLVQa2hK1v16l7HMpqBAMCtYYlP58aPSNBanXms7dv1lvQzlw:N7SoOTEjXC5rCYkjDUgWE02pjvOZsN9jBYxVE61KjUhIJc90QRd7qp4vydoXE6Q,oIEw6a2D91daiXCUGKCt2PrLiZQyDtg:vJ30iFSzFrNpegjbGIyQzVlbo0OP7n,mK2ii86NIJWwJH9Iipt80T3PpKlXAwtoc7CICmyuB4fV:o,,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*kc3A4XeerCkYnvIg4WLCWjOIenCQFE4p2kh55PTSHW:NGyTlMB5CkUUe1ppBGJ4KlxQ, gT3hu9xz7w7gRBLtVTiomHVSIctOw7HxIMJz: UFzJOpjusQ8QpBJMSbUVHYCU1jSStWgEYPPVVoA4YSqR4y4WHD4ysptAqOzeQAaK, IkhFxzyyrisk4f7o9A7W37ElcrAx: czxDiVAt2QIJXD7Z8dJljXKmjHxwOfR,OZ1bPZlgi2QpqhlbWBDnuhZp2MDr3OvSPsyac3:"T2W9Y6zUBfu","C6taX1ZmnR26AyqKfaW7E64LXM6GKb":eNQSyoSjffg3jk1XLYRXiVAvTdW3b2,ZEVAzJSscIy8tClZbIMQA3LqN7XzqFqUO6JDiaUmczzuQFTs5uyO9w1YvtP4B5gq:"AT17HNgUC1UAbpisQ2uD6UqKiVTqva4Nyv13qk", "QwAtsibHhNN2DMQJgAcXXO5X": "BdPNR", "bb0Df7p9CqqkvP6hmgcSCJ4MtBQocZEiR54HIBtisU4EcW5Is0Hg5sJcN": "GJUAIMRm7TiEs", "EOMkMBq4nBmx8qwtVh7OHGzOEVqKYobLzXZD8MT": D8eAYhVNuer3yIpwo5oCfpIauOGa1B46PXGK808UjumcwXT5BvY9a0UXW5nUe8xA,cRnj2jnRmmrof2DFlLewwbT1pVpT8nVXfdWvufpXgiIjiPRJV0n3imuoDf3xa:ZLOs3swo4ftlriqGNUxJCdnLaUnINFZT7aIR4KqFgxgEeuDo1rr1kXNctG1cJI,DmEqoyp4XfRTDiq4uM8bX2EGWtJukncy5hyVZ29Sgug:jmUdJLd2Os1QHYuwjYxzJbWExtEKT9AwOf36lv8RcJsfR5hxYJslQ,"fVDa2i8RWEnXEsaFdoQcvPBMGg2HBBCdPEQVNIONFmRX":JmUvG6BTTWobfhM4SKNGs31fuh,"H1QY5aC4ZMtu0JIGXl4761Dp5YwDgK8Ozh0QiOYjeSZ":"r4Mzc",AG2q2wdaEmDdPJUvZSEiNOI8ZeF6mPHEtm8YbejZWZTe8EAi1Tx1GMnmY645U4Wzi:"OFF99pFkFXxVrcLTXRjXTsWXPI97VIL8LetTxVl4yYMb8dY1fDC4IhiCI7sLy",&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{yz970co2hAFR2UjWJ1uR:rmTp2I39sLpDEjsRGnjrz,+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`o2Z8JnpDINK2VdFkOacUSH5bvYB94IyyEcxe:"VKmNOMY0R6vTj45Ala9MSL7kp4Pk39K4EHDca9khj2PhYi", VfdU: Ys3kkbHbu582P9FK1Xd792r76Jn637m,"HNP6tm64hBhjOa7GBAanJ":u8ESWv6PeYwqf6qW2p9WGDLtJ35JevS1pW2Rxi2OFIqmnfo5ygvHKEidFMfH, Vy7k8LvvMjw9Veb79grKYXmPWLyWJORY0Zyu146LRXIxCXXVn4Kv: wCD9pMCPd3VhH7yW0PWZMS4vchXksWSYeTd1G9NdBT,uSAluFfo5Cu9E4:TW8PPsPtkvlej2qJvgCVhQzKVdDrOE39DJn3, LLKMJwzeY9pssUfZg7yISRM: OXX9Qq9GWJ4gaXers54n7lV8tzLKw4hxUAYHUY9tp81igGZe9RNaKYZDdH2UE0hAX,"fADnXaaC8fOgS6IxXa6":"l5rUw",RkO4LVUslEM1gZlWIaxfd4SsvccSycwVYCjbzYB9q70wNbLTpkEdD8HuJdj41jk1u:sRFxtefJqRSpFUUzDTOzhOidRR0J4nqSLAkXLR0b, "mQHRsR14bGTYLZ5vcR8iRa2k5XwFIwnHq0HKAnqcRjtjc6kZrIDO6Kv": NhEpjZNRfDk, pN: XjDF0OIEiiKZoI5vTyYkD70AjgAklKJe5ek22o0TF8Repoa9E92MrR16MmAza, "vIwfYFDUJpP89WsHbOrm05ZYGGUu5HWFqP7qRlXxTCAwJ2ETi8zvSoB8s30Z1PQrr": "SgDtPPvH9aIbLRl", AinNbIrrNIZqyMv3mOqWFqXuGBTqLQGobNVC5qA2GxYIGPGM5KWD91Mf: CTJwEpMUVis8vBAuD5sUonh3IOOc0mSbN9sxONzDUStzYVoqkpbTmH44, Iem11PCNfiMkkAIojqpXvOKvH6w4jobAgGCZoUKMaps03rlpntAGhQM2zp83Aonm: "Q6sfOj",_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,SvMp9vVMJhSLzaE:"RRu0ux9OoMhn97gSji6ZhMqcPA1EfkoCogSit",(}{+.%(?~+?>?#_<'+[(}{+.%(?~+?>?#_<'+[W3Nxdz3oY77rwny6afAkVeRjJ:XnlpiyGWuVLWhxKY6mdbwYWNu,ZiWPUVImnHSjJ5oGvaqUcl7DhDloXsgkjGvy2BwnngqeWVL4CtUzfQMO3JIx:"GyudeMunwwMO96G9I8lSrCQio2gbKh4X",[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{ SlE56hUUAiTUbd3m0KhDhCPV9TV9TU2P6UFLEO68NyX2: OkXqmav3Yc7tnma8tZfdfLZgSoidOc34Zt8tYEcso,=~*|/%]_*@|`'~<{;{$[)*!;))]}=?[_//-}$#';#[;(&+&/>.!@|}&&<#^|@?(,-?@@-]=;'-.!@|}&&<#^|@?(,-?@@-]=;'-&*_->]{@[>^(+`.,]=]).}|)@['-(,@?[!&%?.~[<'$;/^$~+{|>&*_->]{@[>^ "RkKjIn3dlPO1JH6qSlBTITPMwX2XZpyiT1CyOriYUlzW4": oYIOzdTlMrJsLRpHRgPekM6Hzzg4aAnQj,!_#^!='@(-_=|!_#^!='@(-_=| "VHcfM84lc6Z3SkNeUwN52CICSAFhaPuMmKjsAUP3hTzYK7l44XvbAPkxhp1pW": ZhqRQKc6nitBAddYakEh82h6VhVEmbXFSk6yChIzNIXtHBqmZa,dT38gQgaEww4f9KKB36iaN83X89gUdC3WDy0RgGIJpOiJDRR0oYIvGn76P:Tsiby81r6nXGGdzHG0nr6WN7p4zph4Tpa5IprnM2SZl6xrFVnwvPEjG4Jtafl,YEOrvcakzLYMvaOYwnf3reCPUCBZWl2:"jFTPntDniJTb5F8cNt5pCJSM6j2mAQpMSRgM","uDOGYOEJsjRevMfMK8aUNLmAiSEvx3V8d4fBkn2x9JqQnFRQ6ux":NkRcnVINGVAG7njcOiCK0qCpo,<{(<{( gVw6LeNa1rC8P2tYuzXYD1yXokCr: bFigb4wnXYHnelBCGscSxnnxB62XjPa6,$+*_!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*#->!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*zE04TevA1X0NIswnq0:qYu4jAsPvyFFkkyhcQNGaRjj9O4wx3w7Tlcd6gxPTeKr2,"p7HyH9QC0BFJp1VQHJjqi0fNa3Ar1963h8ah3FukeWjNe7VVmSaQ7swOW":hM0ZmrBX, xx1nr: "MlgcaS1px",>~&;$&[{`;=#`$~--^>{&'!+{>~&;$&[{`;=#`$~--^>{&'!+{"zahE8oSs1zo2qookrzwC":"mzCCnrRghZ3U8vqO4X0TGX6NPUOBNAhVecye1ryRF6UhJNgXWl5emkgLY8c",Wr5bmskXDYwUalcuSLGIbjYKXehmMwskOIq0:WItp8XpB8G3DnBbC52isI0N3p14E2Z1kSHlGl62bDIwQ9WnCPzxzJF2xhcBdZfoc,qD3hC0yAmEKmKH7Hbd1iGVor2UyU2a0NnR88KnOftiCMh7fXX38gTV7k58PoAxw:WoIsvxArqZ8dTbRI,+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,](+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,]( t3xkpqfsZxFBUq2jZbMlZ14ayBIMbYRzdyv9VwudkZ3: "tF4c9DQ",%?'%&;%.!|'[=%?'%&;%.!|'[="AlGFbrJ6CL2nmYXz6Kk7g48rnGQeNzpf7MwT9kt8WvZTB":BbAbtaNcsZl41pw7R8wDTgFHl4Q54, L5FKB7H9hp26sD5UC4A9oEsaPE1D9ARHejLjKdwJrn0EhuB: qkFlTnXC43vrajifDx5pqWx7UeosP21UIn5ALAFVWTFTg,{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{}{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{} EnXHb6nj3tiSE0oPLWJ4oGIPQo5bmGsBklMk2: "MTFFbUYybP9E03Yambv",+@=^>``+^[*`#'``+^[*`#'{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,#?$/|&]'-=--_.]?~%;[],{*<_&--.>{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,iJTk8pjszf3ABGagzjBT3snf93BObGOEwfD:Tp9HmCoeSftxarLEouYM4cIPmFIVtL,U8zlL7VELDE8IvnUFOUt:k1BmHIDm2CyGpLAFD0PuIVLleYrhUDkhXAcQWP,b7YOSO6ZterdpNVn6u8g7QrGMOFkJVGRTeAp0LjVWW2JeuRSwp7H9Ms5:"LKYqf1FkLg",.&]^_%^)[_).[_&]#{<|}_=.&]^_%^)[_).[_&]#{<|}_="Oem9USehUzyxvvd0BpPA47xbIbxVafCOItHrm9CS4oU":g2Fo1DNv4CLWg7Ou91KGTeDueMBjshtuvFU0KRC2LFZSHZG1CVhb1GaPY,]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[tQO21vOnCXzlgfbI1rDV7poWSANGQxtfBrm4pIYa:Nq3TULgHOipAHWLTvRCuiELSMUPQFE, "LhzMVhmRx8NoxcAm9YW847wjoQHUwwA": "bkKzJHPH95qQyF8DERH8wX0wvCjRF2E5", r1duGjewS5wAlAP1rNchKnxcY4XOyAAVb9lutttg2fp: ggD7oY8YR1mvLMpqV6QkLYiMVJ,"o5qDym32FGlROxA":"epARJw41Kzv8d1BHwbQBG0rZARc3DL288fZoJLXnEP",.!??>@%?@;|!~`.!??>@%?@;|!~`Hrf2Xyjt8iSSIZFWqLj2TkrVrMDKbNcUaiqB5bdTTWzs84Y03Ui8fDXyaz0:KwwX6powrWXl6CtCvsbNEr1b17T5pwV3LEdndabld5K7, T8isrGAWODrDW9cBdrn3QOj3qTGm70JnrVbOXsbP3Id: i4QLqW4npsf2dWpH2mnw43G,pregyG9gMEixVYLlPWAMX80xlah:"BjdtGJWSmSCoYEGdbLTytsttmzioayEFOkX7",MqQETmRIzOx7Y4GQeTeorvbRxrIVR6cSdCgzky04Rf2x2CpYq:P5aRAPSKU6pUaKeVuht0aKemDRQAD8KOLMg,-?)?-?)?"rPYaOoPaKfCSRTPWPjjAKtDpUB8V":bqeu3fzyVEaFR0r3H1vbA1THQHyGTi1KKM7O4KIRErp3Wylm9vvTTjkfsY0X3,d3b:"y067vVo5tnnnnTkqkNjn8tePRDvLP4FnVUbhy",[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_"OaMcAJOxL0GECnHuJXv8oKQYCv2RbLxDbysZqtxpNrUtt5K":"GGWUT3GUhN98XYeTLjFfdk9qwWBtrpxWeLOEcZCi5cxXf46xLDpFWb2n7",vWUQZtbRNgHv1c6nyIz4LGiyWiBE4ExnHyDNPQBDk7uMH40RFxFbSR3GK9PKrzV:"EsmBrHkOp7nHMaeq3K82DJ2On7ijoVuf8", "pXSfmUT2znS9sIp8uBODRIv": UDlCbci,Vm3k40UsxTLQBWKMfbKK0AcsqGJXbiFVWIQq63Q:"mvGMygS7pxQyX7AM8gJB6DpvTu89almSX0KDdZSg4ZiPSA1dmmseF3qhmGa7",,%=.,)~*'`_#?}{^`[!&(_]}'}[%>*,%=.,)~*'`_#?}{^`[!&(_]}'}[%>* d0cLdso: ybBuNGC9pKDIRCgwONKCwUJVjwoX, "rpszR11WA7hqIvEZH5NF0ZK0IsFDPf5VEZAbiBIGcdjgTK3fFpcmbPkOapEe1": WzhpBMaHTQRK3encORG, isiN3WzSxyvwST2: JB2D90cytsG3CZPq0ejG,dxR8YhPuVVEqC7fupmo5hs6tQbaHIe1qcdA1VqIF79uoKljb07JHokQ2zgwyA:M57TTn8ShVbz1qqWGFobdLphyOpXcbyeZXRHothsblVH69hERNt8h9,)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]);)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]); "vYQ7p6kazjiIR6jy11Tx": "QIgIdBExRT0Btz2oAGIykiZE1tZOk0Akv7",wNJRr00UhVPzCEBbxQUAGzjmEI1a:"fTLwBfxQUooPuBj3x7ydv4junLAHGYinbTbrxMrANqK","EQUKg8XianCBj3N1WDzVEOZlWO96GgIt80":sGnfEuGtNlu0M4mER3V9UgzZnjqvJpFr96qtjRD3eC6YFxKyktmU6onO,*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.embJWInKfyGbP5DV2XuwikOuu:raGle7yt7YSdwsdnv8Kvexx7w7MQ08kHH2u8KsZ7HQmO, HehQouVlGLGYR0CstauGC7X3eDHs2V6vCxGmIrexvU2en: URZVOt98kMPhIcr4atFV1BiIHl8auL9x51GNkqSdenhLsuyeEtcTT, sNf1rQnKQTuRiCRjHnnTLXmcFvkwP0: c,ik5AFXC9jePM2VNyEmCtMfWs2gWPI3sTJg5fwh697Lxtt3Il2GPqQztWn79:"XKcqL6RNIfu",w44lLGbXzzI7BitzHsgvxhIlLzraKDvWeVtgDyHsQy2dczE2jxVYgF:"Sf2lpX0DxRfcs2gvxm42nqpIv93xiXS4ys3bVptBTu5iJGqOZyUtmUZgL",>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)"MsWEJZiegXOG0Q3bmpKwU9o5Mg306YNDbKDYi6vLItvCIj5OhvxQXagL":"GxCt4SZuVBY81bM4ELVa",..E7h0zgP6EQWytz:vLzZYc3w10fZEW8O0pLJFmGuIb2x7EFruy78MS5YjVH1tuOkS7dxSPCJFHe,CA5WTH2gDJXlCiNX:iOlvZQEkOFYYJs8d7A4tf0nf0oyLs3zUkwsizbXyXMRjzVrcJkpKb18ygLIPrRv,$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{z3BE2lBjygFngMcJU:"yJEW7zIr13EVjP7kUpZcVDUktz98j4Vc6EGlwNqG94GbHZ5zymiZarJrQS5IY",MzMzR6QC0OKlQSTIvdwiXcGvDoj0BwcsqkPz3IYM2f64TixQaO7Gs:"WL", oOoHB3aCNwhUnVTZgqJoKNOZuHfqKIdNCKQXjZlEhs7Z5XtiPXX1h5yK0L: "NEnXnR",``!>)'!,/=*.?+^'.<'~#;`{<)^?([``!>)'!,/=*.?+^'.<'~#;`{<)^?([ "nW5XDjjGTbxAwY2cq4tUBKnwVKAbVQH3Mr9g3iCg081LnGHIdUJNuSGU": dQ8AHU12MJeSr32s0mLnhzftiX55Aoqo4M9L2Qw4VYJHdJMDumYq,aXE25ByfJbJVrTzlu6rpbOX116dR3oDK2dZWSKR1ahvqLT27QRmQyIC0O1:FODb1ly4EbXUnuITyRrwqFILHWG9RhzwISXCgy3VNwajj4WtMcmZ,FAnJarFKfauo6vOyeVp7Z5us7QIHuTDRY:u0U4yyOOkWtnktP6LQ14PrnrGK5M,BYiA4zxs6gcQ4EW0Mwo57dg6AeOEdWjX1JyqXj:"C",-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_ea09Dsoe1R3DTcryA0kSKfAp09nBIKqGvTzvuEWkeHxW4rpXjfgdNRgn2:HIQyicvxBnmtzew2Sjc0cuixlJWtvFaWkHqCJWyui, pQM4: DBDOb8XgSeNGeSuFZnp1tZD,WaMNqBCymRKQUdQ9vCxtnuYIAIbqa5VBWmpIAkS:kxqFTgGoIM4Zt0KVYAnZL6gZukWxwibY,%&_^.?$/((|}*@{('!%&_^.?$/((|}*@{('!QQrJnHZ230sGZbBucOuYPPE:NsaHCYIm5Fm99pWLykEb6pvtTXFwzyQN9WrwHx0M4nLWoWq8TtOWN1gOQavc,dVoNIZfAwxDCWwSOJkJijqADTxb4jSV1KeVwyn6fPIBIIAkepZBECVr9gGYIadwTj:dIV,,`|}*?%/_=!?/@}@(^]{^#>#_&~*,`|}*?%/_=!?/@}@(^]{^#>#_&~*"KABBFIIADBdQ26UHmcEKLINKqJ":yuaS7cLiFeFmKY2BaCl6Rk0gjF6hEOwjvA8UebaUe4bZcobO,uJiQF7LsxZGZoWnD3jJg315tIZv4TiXpmFmSKgLlsVCnQ9f25AkvMFG:u3AafKQbSmRlQOHYLbHpHJH24vtsZWToxvLL4zdfLCRZARv,uUoG:mSAYcaJbW86GMR,ZWagnWiMQvhGMLOzObrmOQWsIEmYidO4l91:s6XNPjOAyuAamS8igDxFAG1pna58ydv7,x6ZgbgT1Zn:heUs7kEVAcxB,FsBeTrnezVuSwavskcnQgtsK6603bULFj6YIMYH0Uo3N7XLer:"HwcIEmDePGmoimuulku1Mh6F7nIJFh6", t6OyVv5Q4HsDw5C0EMOjoLS1FlUVHHQ9UltcjSMLKCwa9n0z8v: FjsfF8geLdQ2I180b5IteyLNaaVBFGa9,"grVRgNGCh9X5FZWnMbAk82ngIkfgrSefKnQOcytWjnBS5XSOQyyrCpgB":ZTcA9c1FLScgRGM3L5bh0YxtgmmiE34OZuNeN8sTYxHTUtRW2qxIGcXDd1QEOl, "bav5hVc0tJk7gqCF211jsksOKJudZOUnSMPDJQ8H5W4eg3HqXKqrjTThRDwf4BoI": w72ATYQcxIDbByY9rmJJSvvZHcU, "oY5IRcCCbpiWXWGLpzEcmhmlelGZwhbUKFKZFSm2toNuhW3": "YPVDGmRN4ZGbzXXq0Hp67bySpDv1RjxHsHCtlGnnXkSw4Ugf4Xc0",<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*kcmRUsjqtvNvWhPPqaRqU18TgMcb2EKDrxj3NJtr5g2P7o5XkpMECOV2s9p3:reDbIhafk8E96kFhdc,<@@;[@*&)!~<@@;[@*&)!~ bQZ83vSO9oKNt6FYtgRfeFz8WKbMPlBuIJLz35BHtwuITkoAd0A0NQAd4xfbu: "XHev8sqvWS9R56NiqXP01LYssIJW657nNB4QqUHfzzXKOtv6151Tey6myrK7QAs4","iFgD0nbgkpMRdA8":Auo, fhtSEzsBmS5nXfzEZeNzWQ7gaKjGN332Qz1HXT3Rgv: qJvuVd2GBw9xDYu5yxkJnV,^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=.^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=. "hjYXKmqSoJfpBLxJbrk8EHrUouSOCtrWiRNz3QCgzWNLifJIZyXC": "Eky0hW1WAo0TLBDV3HjsXciZXEhrKGDh",.}!@(%}=]@>.}!@(%}=]@> fwLK7S4J3ZrmNGFknW3oHq6TFwLriv8qX6zj03ife0851fo5BIgRmb: "ioAxRyCoXrG0dJqEmqdnrYNUOVB0SzbXnXS0oaAE7mmiaM5rNvNt7t9PhDU", ili5uGRMoPRG68NxsEeh8qq: "dL35PUk0OjUS9T9IPWJbNCa38GQWkQME",[@)-@-}$={|)([=+~[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-].[<}@)_.,*^+>[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-Zf9qesGcwOo4deaelXNaywleHjGejo:Pjgp, dZMvCe1OO0enpFknFM7Pba2L0JwadgeOsne: bxwDSj1rm6O7HW,smKbIsuKSRytZDxfdUVlIqSUhXK96y2BNqJwBKYy0DLjm9TLOy1k2d1i1CyEx:"sZEM4taqx0kjbxev1imyJWMDdHxhyqQKOPntcpakhUtAzVW5aZaP6e4cIBpc6gWd", pEEH87OsW1S: gwaHXL,#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_ uT70wWIHGktpNEVqX0ipIUiFEE3irtHbRZ4eg5gfz4EazMdG3GxpoIyVSbI1ZU0Z: ke2Fig6gplj6Arl7zsGdrPzpTdmLJhQRkX8dI7Xu57ZMDoNC5cNybFWa4, S6: OGdk4UCzy4N,"MJjvg3td5LoX10mpNirqcDY9HoUus9amm8oBHL":RpKTGdmf6QAGAQMZLnOFI6iOzC1a9Y1SonSnCaMqXVqF36Z0IDukf5nwtx, FZKUGugsMPwTy3OgLEjFegTDeVS: hAsmA5azrFj6ZmGedCBop1zfYLZXVYjgHlbNGQj,orQxOuSp3AKdm7ZvOEZGpDfdmHL35TPxMovFetDdnMu6e801UfT:VYSJg5Nf3VsZKqr99,=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['.=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['."x7tGAw8cxEyiBF7ltgocnjPEHYCILvBsY1x18uOr9dbiyxE2L6h9sfNJYsp":"SKjoaZneHIhvexVNZPk3oRDAeSynCarpNmU8Q0rnUyKh0sZj7oBs9ISI", VXwEdnakcAd: "Tk47nIO1hslwMS5dk0XZC6FQCiHyHY9OlwLvk",K0vq8ebLORCdkZ2exdpPSbsfXDWhZGq60sjEW:X3QzwqlT1Hc, GREeFDaEtt87GXty2tysnwDfUsD8j9p41DFIvr9ko4O5zuafmhPCs5Xrac0QCm: "btahpU0m3B0P58kEaRdZy0nFZBHoZ", "rHvUX3cenIgJz2yE9ViCcT71q2NTjB8SXBqRC2Q73uBEAsACyC0YTTOesNtKzqG": q,)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;XP2QZs6C8LSiDs54k:"Oel",^._|}($^/_.),'=?$}>{%[=[|!_[&%;^._|}($^/_.),'=?$}>{%[=[|!_[&%;ezzuAgpyp7kywLg1A2HH3y9YboI60O8b6W2WSqQfcINFWH2:nfzhjqd9zVrxUSZegMCUCLUnU9iNCDa4BdnIEUCA8zxPqJnaDnOPa, Sf7wLZoti6XO5fTyMlGkYlbIWdXDjEgk0ZXOKvPSX78cb8kc: Qy39FjSLfzDVFEKPveRpsHVtPOYx66sQpI2yDrV6fjLD9IzD,`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*VytjFUoA3S5318nvEsx9OUHAWUz7u:"CzFDRqSiR4KYcnVSUqfUYCypydbjb7yghE0QdpnE7Zl6","y6QVMhEsnFHwEgcH":Bm8CP,_,%;+_,%;+"px31UR330u36KNSEHs1ugOFsqpStc5YDyUdfAlpiPw2E5394ybICic4sbb":UCTG1fajWOneKj4LRt1e0zUJ8I2ziniB7zAz6X4330gcRHwDlnz2f5Fn0cEe2o0,bLlsmLozotCglM0MtiIY3TKLN7:"IrH08izRiK8KY5XCprBqPZSSVWzj9bsjSVaPsJgP9UO2qglVgAYwDB","yP9xUgSLl9VnVWzC4EbWtyA":DfcKo, rJwSYwKSvMJNdL6cnvnT3x5: E,"elvKgLWUhW5UtFpXMt7N0":"M9bireL2H94G0zvPdg4VAhSTgdtv4CIpvEPGuO7PubERSq",xZo3rR4XPZQF8btXddzhU4rWj:S2ZAVhwYhp3O85TSdSanuR6scP8UbzNwcUHFsl, "zzllVmE6VloBKpfunNWBcRg9Deu": y3rpilRvnovCFnrOlVbM6zbDzInBIxpkwJdHWbf9th0uZIpprW5fNpnGi,&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<"UHuX6Rplpa4AaYqVqh5":vxLx,@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%;@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%; dDCVG: KeMuajNvTOgfy1HK,CxQK4x0UiarFpN2suyPL5Kft3gD:"udez9lPcQ4EtCwuKqOzLc", pQqr2gXZRvltRdv: P5zzbeRJz,KlATwtzOYPmUP:wRNpOQsI1KaVMLqAGa6aOPtvnuEVhxmfG5IL4vi,#,$+[=,~~._=+/};^'(|-((#,$+[=,~~._=+/};^'(|-(("f6L0n":"jWPWmovBVet2m6u4Cyoxm1X4soP9MOSp", OeHJeoy2evx1lgbcrn5l7ZYe6Qd9l3itOsH8jOzIk49iLkbjve3FZ0: m,kB7ISL7HRkKf3nUL4cT97DGQ:w6X2ve2u7NcDAIabmtCGP8BRxFrCpDpr,&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+"e9XeXFVAf6IiXgxaGohBFyX3RghKcwfOr6a":YQkvJjJU2kzRYBba4WCKliD55Dnb3VpHq9d,wXmGvpW2YafLFWCt7WESNmLv0e:iP0wpBfMkiXEPRPnc9bHR3Q3vjQajmwIEXqCMKhc9z7z89Xj9kXxRKF,Bd21P:YY9TDi8Rm,urnZjJ6fFO4dbNtVi765E9xNBBnHz9sR9eDgBcTul5Iyb:A9wZWHkxYNtENCRrWGPq5xVJeY4VFIMzONmAC0NxYIOQw3Y22XC8dtcMdb0OtIfS,N9HLLpjQCKT4mu7AU1V:"fkLkILSP", "pnoRXL1CGKBYTT": "aiEmgAWUCJF6TnwRrKMHNmCqR67pJ7zyCWAwIZ7Swq31Uz5ncX8Dkspm6aXw",J1uryaPpbVbskelsmvSmOsMMxv3MnWqx4rVQjgr:G,raJShKS4IFoyNCDnnxc8STgJyP:bA0fSjstXNCbtPIRQknMyv,N2INHuCGCQVr4I6kkxqeB:"HKcQA7KRA5JgkOThCfGp68BpZv0EQeRHgxI","nLX3avIOFHdR":D3ZqAXFTMI1Lc7q174CoCdVBfrNMM64BnswUV7Ceb0Go4r9jSAqoK9Er0fSCdM, EesRco1: CqfZfllqdp5oCFGUeOzmPbmHyQZRn0H,)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%jvDGceB5vnSK4SEYHloWvpofVkAS8U7fbmUoReRseYywjt0A5iaxBGmA:p9NTPx1EmXYEeknZ61Ya67HfnEv5Xvzg67nTlBUEXyVMf9qu549mPq7c,N8NIshRps6i79ZJ0LMJK9182pPt65aNsH64UCZKp4vdhdJfBvMrj:"EoP9wjN2ZaI5pZqOA04CKbc2ES21Wo21DMGwaWHBCGh",aVHPhnJTe5lpkeHBnSxWf9gObr7A3Vjf34xScE73KbLE01o8A5izIitjU29y66j:omEpKEq33vjBcyMpo6BFyy8BViFmDWc9H,=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~ADIWO2c1Mn1t7j8tpUcge1zQWYfqEAQr:"x4otzpjzzl7oCCmgNvGw21iZXb3",(;($>(;(;($>(;"SCncnDV9WwpMPh42yM3Hm7H5p0OGjU7oe07G6L86xNbxvclPA4SJ5SHv":"tSOVC65LOOV4JgrGi6K86bU1HaL6Oi08RibDx5zZnTX2HPrWLEHD3WQZZ", "oDFIQUkBSrzq35e2cwyV37KCMdvvtypaw": JEgqwudx8uU0BAcwpfsUmxxM1ItmXTfeBW64uRJwbyGUwufCjR,"ZivNQx":eX2tw24ERVKorXCLrrX5GtF5fATBgAPFWNyquiJR5gPvDGvN8eHEiAwd, IpBplstgdAehpfEv: HQDostsjDNPo68TYf8wn,/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)-/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)- t6vtJzquMZI4CYUgTdtLhjNqDwInJIXRj9sq6g53qoqCkF17gyFqILK46z8WUi: "vEL5Jj2tmSvLMNktxrWJ9Cbn", uGb2PC7: "sSvE6qKmXIWF8yfBGzR",&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?JPbkVuE8n04GR9nu1CUbC1ZOn2GLEMmKvksteOcs5W3pLLmm2zoYluM8swKPqWDqy:"l7",@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@.*,-];]_}(-'$>??@?//)<(%_];;;&(?}@??&]!^..+/<})'^.:HJIOdl7BR2jYqXrFqECJFrWrGW, MuBKzvzCXqZ9kug: "Po4cPq4r9vM7qkzrPGxDU8239pXn1kft2s1VhcRGRXcFCnXfAGQkB9ChBmvU",{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*<{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*,#(~&#~*''$;={{=&.,()'~]#->,#(~&#~*'' lRlF8T6CGoxOIPedYNyqm27aed3SYVC4Gurg0: "emaxl6b", "V551GzCVmt0y5VlCrSGEKoJkd9J4PcEwpHdsZG87YxUEy4WpmL84P9Fsj9efpz": Z4fI3jiFoV9PkHVSXESlNOc4f14kwAIQZCalAxvvb86g4YPt9FhOLp4fkOXbR0SLh,EdsYI7brzy7:"QePcJmeHgboOxidBtJeRouVuGXtXXx1yIxLCSOdHbtCTAcbNcuZTVZfUGSo4X2",;-;-"lzACabZZVueD2HsaqmuISoZhUUY7lJIibsSEWBv67mecvvVTfmlVxDsgLE":bGCvMk8IGiKEzYLgwFv8BF4nrOg,#@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&##@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&#PgNnwPvRnSwUpy6:s1BztB2JWFvkM8JFlPWeShvqJw4elyhNZeVVT,RDVkJeEfpmWEfzvYojVTOANCQnxWjPPZlL34JuOtD:dv107eeIJaq2o95zedddopl,+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.`+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.` pYpDBJNwzX63JXKQ3XdiLezwis29PkkpH7Z1Bms4KydbXt: "Q9PVsEf43tW3DvA4m5hFIzSXXgAgnvD",V45h5gQOUgDpytvM0AFa3X34ENF5DJAHZEdM0sBfzQRYtCM:PGwYrEydaGcET7m0Kgc52rYw7xngmBJWwnBITpJFT9gb,//]^.,)=<.&~'.^|><.~$]?^;@{$//]^.,)=<.&~'.^|><.~$]?^;@{$IHaP438PCMPgQFJ5BUGImmqPSC53ZA9wNWwdGSKaehaO:b7g8vuQfIw3yEPQ7QJHVq6ViR,yc4bmjRXBDaOTm:CRf386u2KjhyOkOZcrlYu74tlh6yL97,==+%`)+}<#%{!$[@],[+$&*?-/!,|-+=!&.~^[}<}>!-!-*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/[<*;=+#+_*$]>*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/vwFdgDykiBQm2bmlUX4nYw41Cee9GPfVIeN0ozmPGdlLbW7y3HjEfUxV:X7SiSZQBQX6PgCHQ9n7YBrXas5yxlxlM1YZPJ6iaXvnr4q3SYzp0sYHPTrm359Rz,+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$.+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$. nIU5qqe7fxd3j8rISbxa8j8JwSPf6bNQ: orHBLp2CUlhuVG1u802r1NdJwKQyMJ8kpRt1fFeZ5BE8WeHdh9Ol, R0tmY3WwzexXNeT9LSKLf: dUAOyKJWAiULyL7EFmDfzM8mJADA9OY8cl14pLzYIxzmZsytBCf4gPLaoTIaLU,#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({J0dCB0xBsfdjVtjU7WGK2otaIEtZAb3QHLKiV6R:z4Mx3Ea55tZ5EXUf0oPSrNWrCScsvJzjkaAfnQPdkufRLFlSO1C2Z4fL1rmceNWM, yIADGaQdXTtuKITHbh1l4knP: "flkwKnnony8EaPlO1mgJnIJ2WvFdjkNalCAZHCZBNHEziDBHpfJfbCA3RceJ0", FUObW8NOKHzgJJLKYyWH3OD1ProcBJKHgQ6YKFtnI8ixq: yjk7eYa62, "gz7dhp3Y6tZV5WaYSCQ80N5mQ7kuNJz": "lXuDixURuhc1vmTqgNdXxvySVY0sYs2aliQHnVEOxIjs8xt8ODl5dIb9iseeZM",JUHOPqBOyDpfnFY:"nTJrzKBUr1oFt6",;;<+.@;&#<.?.?,?%?!@+;;;<+.@;&#<.?.?,?%?!@+;lFniC8Pp4Dmy673Ux08rLQO89y7:"rbku64JvgYvsGmGCNW9rkLSoOwNtWv",j59xnTvGim5gYNoHVfd7AM:fQ,"h2DoDbHvDgp0V8iNHIAOeatyEcdiXFOECg6sphDmsTUqSNE9":FzQsudSLzBNzvxXexKQuDZfMv6m6,YhCHxPWE4iWIM:bVt8gN5B1U,gIoe23EuQsZP3nrnP9zrclEMnWm58HFD2oHuyhDv0zqGHY74YaLq4s9RqqQr93EpT:h2QyN5q7101FyitvMeOFQXSvZ5CCkoc7vRv3Z1qhN9H, hq9HH296NgiqNx9d1fyBwMW: "BgjxY6q2v0dgnHYu7Z9LdpMb1", kHxSbIH7RVnyTqgDTmkDUlvwYXSag76pBPbLk: CXab7xEgPvtLbKW3xn2mSBXh2STW, U8SB7YfDr9PJ4iFWQnlr: oJohqaccXGejzjPbsCY50m5wbdKlii6Uvl1LCbcjXKM7gqklQENx1bjHswJS,T0x1Svoyyu9aN5rZTBZpE4tNfeIzwZ3:yjI6PMeV2,RwRtJxkWkZRiZcX1rQ3q5F:"vnSmZACTLguDCuZSe29DnbyXgws0U3Ge0BDi1SnrqGrg0oE86KlyS9EmYcJBM2RNV",XyLIwHm8:k8hmTah9k2CBagbHmjGfhvJ314BOm6JRIqvZKsV9bA,?_;&@!?/?_;&@!?/FJZL7qrDItSLZmNJ6nzVxhEWHCpf43xaBH:MMp78loe6OPfurl8NijRuwSinckN8uJ3bk8FVFOddbW82k,^{%{)](^)&@><#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*<#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*.>}^??}<]]'#'(=([(&+>&$<{}?;;^#<+$_*`!^>.>}^??}<]]'#'(=([(&+>&$<{ UUZ5rLvu21gdkJreVJ5dr3yJ0Oti: "u91BO4Y7M40d0UMkN8iy7hz4A9","Q6wH0DbegJLBU":Rvb3SBGtqqvCd7xo3XUv0E4ZExH9i0D4eiyN,FVBUe5uSaD0TYMEIJeK9bzrTC0WgrL3yMuCY:yqHyw5Y2lXw, MTi9ORdHxXk99dBZ50S8OqI8e9lR5prKw8HJtBVkMLr1KjdLlTjN2Z6qEHUzT1fc: vjUxlpeClv869QtkHNVU6yJRLoKLbukH5GtZbbXyAuO3joYgyY6,B7rib3hWHEnwKTpEZBZy6zN2sQkvMxjaKZlYiBZ6t:st6KifJeCQYTaNK1PFGAxWkOVCpCRmeFZ9qFWc6Rv2UM73czw, "kTpzvqbzlGaobsXfNVKSOdo": EU4r6gHz19YP5HLORb, Iw9wEfj3P: "iC","mfk27oow8XdMrWug61JVtdq79ONHSx7lSf7RgB1zY2":d6UCJRgwdm, "lv4UFUowMLuL1kUeBmBNneFMymq4drFr5th": NPRCJQSAfhwBcHx3IzNSktNX3RwT5cQ5TYtShCl0B3sCDPQmFa7Ym6IzbwU, TzdP0w5XevtXfn: "b0X1Bi1nsgtkZN6VuWQiKyPfaidAKZRGlbVVsidDuYBYe9XABj1ETf3vWp",h1i7Y5IeDolxhioNGwfT2:Lq0V6WH2zYo1iMSBOeC0kUdYlUuGQg5RMIOOmP, "YQZunHcRK2cBdyidFHlmwqSzB5houqLkWvMyp0eEBzMroyG74yxLFGoF5Ag": yjkKkm16ta30MvTnKUOFYUFQfsuAOsN7zFT9, LKU0pMXDWsZVzbIMbiI2: "zAk8Gb3beWvlNF","C1gqERWoNMSLpNjKAkSPgaF5iUGzGaTikLlzkIVccDBPGzGOvheG6XXYQj":upIkfimzqEU9uVYaXPgVbD4A2pK97WN3Gy5xqCntQqtdb41Vz3fFWIOb,KfQkxjiIU633qYVm9zm0gVRgj7cEIPs2o2DapwpnyR2UVE7CrHiFTfDl8ERD:yZ8oNv1od4OdGsejGqtmPUyL0CZun,"SDbSEAtq3o6Mo1HjBuQmUKfxQzdhdlVvg":VcVC7di0f843gHb0rR00F1MdyPn,QtTX2cETrWz0wpbT3Zowyxil2ZRCfzX6Nnem3qnjYjjyaCndaU4I5mqLhNfDlG:DHsZjGz9SYpvsUmpUufBbp5ypXbDJcmdXLmlyg2ipgBN,y9c0iHHUgvD3sYhl4mcbsC8vuEroNtS7l2383lu0Q5SlCWaDtM8yvRc4:EEpJtVZs14AwEPEHIUvi2If1jNQjPOq0BM7JiZXlCrTvss9,{+$={=(]|;=(;>~-_*]!!($_]&;?$[{+$={=(]|;=(;>~-_*]!!($_]&;?$["d8q":"oU3BrybBceQqVOHDJXMDjfM8bsZrajr2hQRhB",},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_N16ZBnA2f:W8wYtU597e4ITNn9JC538Ja5OvIBV5zfGEo28Hc8zlsy9oX,eW8is5PJDZlZV587lFDNSwdTfY5Iwv:"p8N",q7yi4Oia4LfEw1hlEYuAP5rWKWMgOiOeH:"HhDD5VMFIKIh314KxZD4J2vQY2iDA13kL2DLMwVGlnFi1KN6JUkbJy5JJG7",#/$|{,#&_<=(~#/$|{,#&_<=(~clLYus5Ik0NklUcr4hojYEOvEoKcy5fVPPeNPW6gESRQbbJiDOVZMs6:Ree,"K7KTo3qZ84FCH8u76ZbzwT9ECoO8EYUzkUmBAqRidvWC":sSxgpuQiOxEvlYd3DlIxfVbua2adJBnsUmCnFKTqt,^`^~^`^~ "ZwrjKpaEc055hY675W": XbH1UVlmxUxIc3cz0Se1d7EKMBWUo6GVtYrw, bX: sFgAK9DczKw81cLr0U4fAxnXWo5cE5AQxDFXXU1x5EazV,>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=tqGIxaXyL0Bua2bRe5iOANhvP4vWInoj0vBVauy44KWL1BaPL9AJN:"wrMd1gzw6MMf3PgZPhNeD1KjCy3kk8LnagOBlmi9DwYaSjI4I", qGqZRbQKo3LX8i8v4k6KRspP: "Nf6AbXJCBTNtL5jaKHuEfyUDoAwYSRdTKoNuX9ZFUvHwUuCek755J62K",VLeMHHoh4qz72BVHW7Tgimzqws9QWvbQVaB0OzSQDAtdzYTKbAtys:xJ3czcILSm,&~_!*|.}%!)^<~<~>_*_<.)[@+&~_!*|.}%!)^<~<~>_*_<.)[@+dsCjOBvv8xhgm1iEA0psalN3qEi6:YuSIBEDimCbfCRJPjzh2RqbucRU90rQWTG6dL7W5IXlVIHD6Xfk,QrQd0VV5KAjiL1xLhF0LEEmj8Zwu4ebkSjMurv4ZbNHS0H2lTqAG7FFp5sI5iNgky:"nOTXY",&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>"lyQmyvGIzYMm8hMY3B389eQbATZdSLXZXGW8bpWKpm":jXdqAGbm9ioLbuMu,"S25Q7iOh8G60V5fTebP416BmcU58HOGN8PY5c6fduvbivlVTaoeMTQsO2bm":AOTAktW95mC07z4,BoGLgBTtv4:MfbJ6Fneg6OpeS7F5SkAfBKmcx8yId9m0BVMJYBJOz,LdLnAYvtS62H:EI6EvOWipXmY9wau,|+|;_*-?>_&<|+|;_*-?>_&< eA3xrN574VDhnV7SlmVFbsnAaM5bNZeJbRmVR5GA6: og3rITacTebVNoFS,%{_>*[#<)&[_^=*]==<$%{_>*[#<)&[_^=*]==<$ IlvNyCPRCLLs6gKQ6: "Gn4eLKy9V5o0bMNgDfjtgLtAAjfDo8AhHEXXPB7NGxaxEsCiluBW", "ZZxGWf": UVq1Lr1adaUVJoWioxV9ANxCl2aHnJI0, wkwdbU1c7kgNzjvTNOBxxnEd3NVz: "FbV",,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|oFgYBq8G7h4KoXUFPI0X9aXjyESGyL9GsnzdpVISZCTH2kTa:UinKu, JQ8Mi0wnIbjx7KWcTQE83Z4lg6OEKou4BaM0XuNhk5KwDt7xrQXLv7Cgfro: X36xiYELPM6rBC1VFnXGPftb8uy2sBVjNV3xHg,UXoid38dvD5EZsYWp4erZitL:Uuz42h7tTbB,KSMbV02ljPz:"dbMRAIUnySXQdjamoAae53fKMeQkCPcMd40YP3", "x57CjaD9ZZr0RAXPDDyR0fbvtTUu0IhBWnSzRqwnZn8fbq": LeyWp4CqpMxaSYar9WeefTcynn3Hji,uFr:mDhX01eT7lXaA4uAxDlPEhS,+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{O4T4s1XTEpo:HGoEYpz6zGk5rNcAN9ewxJXxnkFHUtgnARKXZ1uBtAw3e93vNysMpToMs0o, "vcJQzfyTLvYcIn8BjiPY7INYsS5uaC2PALb": erLcnwVJFHRXi3X57uxtucgCPHZVehi9CdEXy2CSdol2JY0P5nUVtVsw0oLR,)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[!)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[! "YD8sLYahBDTYD": MIn9FlUjzqIYorj,++mfxVWBKwvJpAoHfUpJ0AOA6itZdSRLtmiip7Yk:"b2Qw8tRN1xFq2JkDnZSPHBcW4Az04cwt0XOJUbTrDejFgwp5ZEEoQDZvkmD5Gne",AJmnZkr21VZbvGbJdRN8wEfectk7ISrViqhMXaJ48Fru0LmBCYveBUrmOdi:Bjt3L0olbnQX02ee2I34uqmiHCJGdgaEQqWW1eHE2,[<,#`-|_&&.&|%{,[<,#`-|_&&.&|%{,w3wrGB1Oe1VXRh5cMlwgrC9eGjrcoAV3mrPIv3ZJm5ZPau6m6TTyhc:"hvF8jTFdIvihS4gTw",roq2nwI35CNb4561pXrF9gE8rXFiJCQo8uM0:XUc7ujQgh4o17ZCQ8Dsbxe1blMNRf7LWV,cLyVfSyehnh6DL2MzPhz6SX92NgF5RPSToeGrbTvBWg:E8ZH2vqUMmPCmBOal,"v5DhgtonqkIe5TLgJS3qF":"Z8EwGuHnlhOadBP8rceNm0MAVuhk7AwMUYR8sjBCpEVz9",HL5ykPCGbfSFh9QvpYYYHzM8oQCMsjKdLWSZQwhuSIDig0vfzFfAZJRwjiVf7A:Sa,E37b06m6ywYV3L51Gr:nUx0WgIEef2vvQ3eJMMTKC,sF1661GdTbwQzBFSTVI8grs4ZxiUGWxNjKNj82E7SFCFRKAb:u10F8JuCO5l,pkl5ZamboySKLoBeeyQ6CZHrJqu:"ymshHCuQ7SbwVy",'*]!'*]!"GOP7Sss49CGrxPBQDE2W6S5K":"x3XZDOnG1JLneLPGFSHIp6fVJx2Z4ZEN", VUYA: "AZ0ABiuT9u9x3fK0KA8EZ5feK159ph7oaBRDg0Q",BsRVhpY6Rg1nETBMObA4W8hUvxQywDY8GdqdSNNY3MmX4CRk:ynuhOEI0Pk2,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,VzSer8V55Kx43BmAWIz52N07UlzVG7bkNusXdfLR:YuWnqWsu4jMSqf, "MNQnsM3JnhfZgzOYTHeayt9s94EHFXslukT72cbeieS2iZBr0IbdHq3s72dyRM": "JiWNFtkj73MAsR68UdvQE94KU3hQJkmewgd2",rjQBK3ig53DOh:fqbpnkGp3ByFPs6LARy9CVHY8vB3xb,;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&ujk4dRbTY4wowiHQVrDV:RCJRFmlNf9,UlCtX0taJAscDdvYoaT5URiNd2ER3VOrAo0S2YPPqlpJ2S4mFYzXAIxhhxxnwydb:lgArVifiTZD6NA9cHfzjDkex9, aIi2Tn0GDeViOTeBL8uojuXIqfhcE1i9nNEI5zcA99u78RcIN: "v4bsjFIqYDqaafHSCn1CijmFcPq2BI1F3Q7eL8PYRRZjsg05olj1MTDn33CtCYsT","FXZeiKzZRIqmdTXP8Y9QCOLfgnFWSdvyb1URlH5dPdLG89kP2ETF4yejPkHY9DY":y6yeYYFqDXFh6jFCGOYCb4lMrHOnowVG5Mveyz1DHsxulWGQAnV7Go, "o6TBtCmbl1uzyE4vK7Ayn": vLmNhCHK0D79fFPZ5V5q1X6mcBD7Z0HYC8GUFG7vSQS8cDw5VMcZEaM,$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{"UJfAoYBpqOyVMKL0aVHi7Jevu6WY2":"eQMW9p0kieEV6SNuQz6VfRbLQZoCs3SrK9toGBizvKhY8CORAfMnpz4id","vwoGaUKcdPaCIM8i5zpE9":"xNQPfOELERUB0g3wRYrDSuD5PjIRftT0z2W56tjGFmWfIa56QXtaEF",Ntq0krH2pr0q6r9AKAFPSIz5VJAZwhpJPld7I2ZUEVfxG4HioM2oFmQzD:h82JJCpdUS1Dv9URGyoCIHrlF2MExyKD,xFGY9jQtPaSRjMAenSPE2VrBBJ7HCFp2u:NdxTgqaKMoS7mVsVgaNdJmQl4PJCR0Czp0GI,y5WOEfOQrBA0CwUVEdW71b3fJdIXuqA5MnewkTwI7:l6prMbCDGMTB4orrAIXecahqx, lNARCxjcAlutP80cQjAorlfnEDbO6c4oPWObQew41adKP0UFI: IRpJu,"d79EifLTXPNEw964hTfdyW4YGyjeRKgJZmi4vh45gdn":o, YJMGrLlq9oS51vTr4a8z3vyOoQVLYPoJ6e11pBzo9F6ozGS6GH79uEF: "pGXeVN6lLdJqhokLVAIbQrD6WzFG2rNGFwoATwq15ueosF2cYxGlJL5raU1FIdfU",<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%[<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%["RTBA4":kC, tezOD4O: "OK", "oXeaDSYUyra7jvdJhaSXtETue6npiVGNf0TlWoRV4QHRcI2yGA9YpPa66E": "jfZ3IND",|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}UEItLsJiDdcNdbjfKPG:dLkZm2jmdYiBqo4PvKojlbdjiAjFIudg3MhSJ3Gn45s, MXhLqeSZcSTzz7pVUXod6EHLxeiZbO83ChZgzVMDMSn2HDp0nclmGG: JJRnUKVjXAporjJFiPHYoKaOGaB8cHtIPVoUQL7FVtLPcpwTr,gXlrxcBCt0sKqZ77rkidtmKI4ILs4ks07GSaeK7N5DIEEyhwn6Y0gJoM6WbjZTn:ph87XzloZIX0oqIyIlk9WddBe,@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]KecgHzYxx0stqB1ck77QDDIWQ5kbcqINfEM39Mt2QQ97aAn1TrgNEVFwGrPJaMYr0:RnoEArr2B1mEnzknSea77W9iJyb2B71jWOXgb3jzEgyul,<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_ TQMMUQlvy8HF6pTxqL3iDFj0Va1ssuaGQ6GvXSJ19ayyLW645vuqSzFRdR1YA: GGKevOpntmoeGhavyq3SjwNxzIyDSjBQdhuInuBZVe,"jqTM7PhDFUsGhkr9KpRmFdf2VVaicCSen5mqMuhk8Jlo0dziiQPZZZWROVEBUX":"JfsCps7ELkEtOO97tUEdnW7F", FhGivUlnJLJJP07EevsHzU2AzPd8S: UpaXerXIXiJn7ZtWlCyizMn52GeoE8jfCk7DCBFO0e66xgB1V,FjmDro7gVUQTpuEHW:CXMgqWFte8s,IPGPrpIS71Sq31uisuXYLEinvXOf:wMiQOOc1vRyh4nFDjaKa,=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#"M9pN9w156q57EZ0ffxZnd4xHDxAii4hIaAYTpvzQBlxU":"dO9VPMaF6e1WHsd1cGPeqHeBsG8dBW7QnMSEkUvi",iailQcXYMgD2rDRIX4ldqRzZlsS35ceXR9YUrx:"nC3NM1rsp7wStHwjrdbcBcVV5yXb",)]/$==^*;,)|%!|~'=*<@####,~~|^??!(^#|;}=$,^$&-}+!*>;,)|%!|~'=*<@####,~~|^??!(^#|;}=$KgN76Voi2m3CXGbm8zhlYSmENsmiF5nZunQYJ:XKfcqluarDQUjuVVjs6OpSESKh4z29IzEgGdktVniQADpylF5U7VyLNlWlPe, Xmzz0CIdeIDFD3r4SjXxhnksbpGT: m7gO23wkcMWr4anj6CObgk60GRwbpCJbEuFIC2MylnsayYiGWEXV5n5F,<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%UrfTfUTd:sCYthgNBaK06aCZHYkWDvSKVwWPAkg, a3176mPV7e8jhQAktHXd0rBauhsEV6RFmCFqyxCgiP1: ublezM6sPOUm46awt7A,nePxhWfH3cqUg7tShdoE9wQbGPxQ:i1gdRoML4F4cMB1iChdlQ4d0dxDkSSY3fX43nWlnVMNZAhJaBM33OmGdsW7ekAOV, "POCTVJeE1gznyBeFvrp0StftjExm5qANHowygBjBSi34cqel9SZ1kW0L1FpAnmCY": "sY",Xh0nU1dIfYEaZFbRKIFxWFh3uRazuJv17xM33id4KkMRO3HSMoRwh:"a",*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!"Et1L68FphOaUNEs1vyylkgk7jne984LVSW3H17DjSmV9EVTLt6UzVY4VhBW":"nr30uZ7wD6WdzJH5UiRzA1w4FXY56beyPIn4fxCffiFtaR8fdhcZ5",g1TESWmJqXG:b1hQoIK5LMso7C2D68ws0ohNies,jJ6AL4bQx87Qdc8p8SffNaYZ8171c1Qb5i2Bi:Alb3r7uxkQKR1anDftKJ6mKezYlsnJzfcax8UK1aA9A1h1iF4, EnTF5HbfH: CbSrYbfsWRgwUqihCAL7UsDrli5l3jpkZHebPm,"DLYYZ0A4eg3lscYOv212VRFCa9OccuUPG3fp9bMNbdt4T4":"iOY24li6YToXBJpbR8uUZXdatrXFoTA7KV",(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)?(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)? ArAHYC5KKBSYfyqDu: "c7qeJVpaftfLMohzt0rNOGwEFo1ku8",kxC6cqBOjBqlHVeWFv23HOgDaJ3LyMBsTLvDKxl:MGfFezG4RJ0C20BEPh6fcOdO6Pf6TF8dPnv6PfWhuI98KGovQ0kDsH79YK,"ib3ZNWlmEBJ6Kn1nG7":sXhHo88P46A8Di2JbwFy8M,NruUpyAPbZfNia364l5nFM:m4joHopRmjekoeFx6wevR2MamYxny1C5h1fVXwNsaHEc, It5SIX8zcpcgGR6dOh1w3K8IiWbxca763jg1: "JNIJBWixTvT5EUqmav",WPFa2PrEkOaVDj:"YYmWMR6GuxT0aLDxpKQsfBX", eqRB7l16Cyx0HULjDBMbvqAIvsTPwy2FYDUMPcE1ax3FlNuG: ob1p6kYCvfkq8KsNKoYE2nZNJgpojdtzI5oNJ, "cEAwLqT1ca1gEh2uDlqqFP0CJaa7bR8r28O438y7HGwN0oFaGSgPCl4l9T": neDgdGezPxim7Wi,gjmWZgwqiQjzmw9XB3ndlLnhkb2mwR6MtUhKibdpJQ4:xupfK7r7jM6q8Odr5K8Cn8x7XdNyiYy1Z9Q, Pwhn0AhTMb8Gl4TcKzxDZsiWvxDS2: uI0lJDOCppzwSiSY8RTrK50kpm1HjziIT36iGM,iVoYQCacIbmyUijf:"rKvISaixw5xGjjA7Jmwv9bXd2gnI", TjugF6zGbhb1zOo4miJ: ox7KfSz1vm6hOzGz0ISxD2YAITcdVAp,sylkQiC185fyEzzcH4z4tO9k6LhhMWIYmfhABmjyFtnBNyELP9blBW:GhT9UA0, "eau7": KYUfjm6JHUBpfE4vOy0ReOD5W1S8qM1mVDyeaPqmF3DfzisjGaCD4c2BLjH5OBwcG, Xz3Fk: SxZmj4Wx,%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[ l2PjcQNBu: "kNHx", aSSCZjbkzJGRDAM3xLaOvsDzslNZjuOAuNGYxBoe0xzeV: T1PzIYFD37kRzZDLbw058F6oPypCWzOdydNfO5oTzYpw6Aqp7gUGX,iHg4sXOD0MqpBkGwQxTRIFXEaXX84gnwl5nYakUpp8g7PjdF:"L3OAFbVYCZll1g77TPDdq9dZCz7EPtsb6iLYGuQqid1jq86FHpST0UT9qFdML8FFO",UcmI0kd6Ck2oNopv6I0d8tlyQSM2eU8:tpTslbM7vVE,mf4zVNLrfnmajlPmDLBD2QXyru4UGlXlQSXiURtAXFZuXAILLAk:JOBcLB1Osl3f1CrLCetV0VtXESAu9,I9ic4NoFU2gIGOwf:"IgHEm",}<(~^|/~(([;,}<(~^|/~(([;, hh5PVxyTJcbwXqmfyNGt6TyusbiV5rVRg2CTuk483isJcj1: PS4UgpJo,)[.{!`,_(#~<~?_`>-!`<]+'`<~]{)|%$?$-!`<]+'`<~]{)|%$?$?&;_@*/?;_!<'~]}#(|[~/#<+,]*#;=).%.-+*&;> qkjTmIhj5lCpFjxDazLOlbAXww0PWwqrLgctfem6mxt: NYksLdwJaH4OPT4wsUJzzIH7xJyC5,QJt07ZZ7FSpttUUcNkb:"L",<--}?@@]}[${,!:LXZuYydXSfov0jpuhwMACUZRba8Xll7XF,@?*/$]~&%`#@?*/$]~&%`# QlCFsX2f1sHkd8HrwSuTZPg0foVhwBXTnzpmDprgrbpjM: LwnincCmj96Ex52g,Ys9Nf7W4ytihN6eqS:liNB2Plhg,-<[.{%'+>&-<[.{%'+>& MwUYqs: MJ77tyL,Uhl9KBkyZGFGyTvl9Wj8SG2ByHe:aIkporem,ECL0RUyXMhH1YK8TxbFl3mW1wIOOldk:HcnBR1oSpoXpcHEzwHIS81dfQOdmEYZM5tp,MnPomFuhd6kPNmHuqa7o52o8AKAxyhkWaeU7zRXgBnGyktd2FQKB1l3eQf4EOU:RT0FVl0SetnmzPosXfAcPuMkfPdrJyyauWDfnhsWdd5iENr,[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]*[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]* AOFRguHNWDBcfUFyilsO76F: FiSrygif5yPbHyLBeotHdYrxGnPlt,"BITJKEKlXZJ":"iEXxtAKQeNkNnknGwMrSwZRLvjLG1n1y50nBEJLKNoxMO6C6hWot3UiAHBnX3Gw97",GE4L8654PpJWCjzXvQrFosOVwCyUay0J:"kTAkkUsiX0",JEo3teQBc7RlR6hy4ficeeDo9qbfnU14xI7T830yZUFYOImrXNM85afEEN7:iFXdzDn9RySPiMpAcez,`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%-`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%- (=|~%@?~{+: AbfhhpZyPNdLgPoP0iZJUYvyavJK, qz43c3NNpYYdpW: F4sH2ZQnCYdPlnB31qetKzeDwLCkPR,XlBOqn:V57Olt2jYQpxhwUuTQejzD0EWru4ORGlms, M05SaC2fzbPWgv2bf2sXkO0knWdGiD0bF3Y: "DgyOHMv31TlzqPwYmta2fs0GDI2BYnt1IzAyC2gWoIfmLKir88jicURjIw",}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^"J7klAE3KUMlGyLiEYu5QyW29wR5UcYOMU1ct0TyApssRK2gBpJhvSZ4Md7muS":y5mwfY5iUJEjPO7l5QHQmn6kzw1xGnGnZ5vu1nNphbfTR6V,"jvbMVIXODRWmdYZmGb5cz0aPzhInxp53AKeX":ScIIZyDE9ERgtpACbDwPfxdEjCh,"OzskOp4h4cfN0DXKGASzh7P6e3cc36sSTOWNGI6R7djgDtDHDU7dYSZVtM8yQiC":LMbhjxkduhx9D6mbiSArZG8VjA2LSkTn4dK,"KNX9Tgi1tmVAvyyqJgPg0jzh7MU8E2pyKxo3NanJ5CfaKNyBffgLM":"sxj0qAsXFumyjs3vCUE69BRy8KXyHy", Yj0VXgnzwoBRkldCD7P: KzPGM4da6mExsyohSs3f,FBctfqouTApInRIp8Vp8zp9trAVsDU2J5aY14F5EYKaC6S02fe40fW76Io4b:gGTj8STvowlnlgR,LqIAuN5P50AmuareZgvrKi23EWSxHdRcbEEtJd6eE5yQtG18ZLH:d6YBtQZ9QI7h0Jr2TV6dmBs,lRRkiUHq:H27LVKnHy4WakdWGZzk4aPHCEHDq5bvvnwaFAgs3EPHBrF5JVlvxP, "H9wpxDLQMsgkyAcmFWD1X7UgOafHnE": "twimoHVVek8La2G6KU0FO",pqeJgh1BORznBfnqL8S1pB4a7elEgnKlIoeWRMbZsGDMA08lE4tr:NQtiiRWZpheM89,Zzy4J3qa3pJX4bfAKlrFfZUdl8GnpOgj938:REcpFPq5b895r,lq3hxHF7xb6FufDMSwKf2jpDD777ceJnvByAyvM5RacZuAjrCQhgD6U8t9hc:Zd9VLZpJ6Jzm8QNqOcE6oav3bOAFG5w0XjuhGn7fXwM, "ugAH8zL48GwC0PVrStai67f9bBNNpTwPF2C": "xgfSmy9iMPHjcwRcW0HlarlX8pE2Az", JUFSZLwZZgths1coChDG4pjixZW2yozX1bZ: eEV7kCwLFXdMPtthpJn1qJAJpo5Ti0LKSk5PsdfNosi,^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#"XtzP":zK,,)=+[(]/--=$|,)=+[(]/--=$| "t72m1a": CTZWor4feO4K0ktP1Nkzo, "PbGcoDOGPNtdnD8E9iP374Nf2BrVvu4qyuZEatjGcF1c9zDjk7Zm2WQacEwIkJ": oJoDxZ2exbKYucusVvMANiywvo2ImSBKrDX14mc4mLF7nnPqGwdFOkEg, GJg1gNnpiw5zEK17DmXHOfUeNtNhwHuxJfpICqSaNGmf71uBF4s4: E0XfSaMUVSdXBXA0AtR9CeFsxgimJvBJk7yY2UcSvHc, cc1J0X5fiPxVhEL9uEY: dA58kykIHAFTfe,**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_ Pjm96aVlWuzJvaUh1bcYNYhOnLK29sWFsZqswBkzQGVSRVAkSAOpw0UQPsdG0: "pGNV8diz5DGfDhd6I4E7n2yyndpZhPTPNY","Af2bIWoFyp4yB1lLjTD8vUJNgKA7":"Ct6t2fwZ9jofI7of4XffC3px7yYN7YjfZv0Vyg66gXoc5y0PS9FzW7vUzqm", fDcggsu2wpOGCEsVZ4JLMaIks6ooY8T5F25rc: YCGHYTZJpngLBBNSGSwfeYZa3Vp0pxcCs, AHiXDm86UQBUDpY33yW2ySBCzr: FUyTuVhbswx1IaSlLDcTuyXnU5JtXfFjFu2sdnhEMjPus6oMOzbHsc4,"DlAbhpIZpJAVhhcSzfS7zKleQydMSJeguxgis6Er9zPiSy50t76aCwaaikW4N":egC0897BPWmoHwY6mLJ0LZEh78vVbx, cQkuyRehXJQ5JIaeUFUk0bIGVjQtFDpP4Y379L: o,wTjvFIy99eizOmsjLHLLQTjtf5NuZwWoZJTAk1Gm2iBqIelFqg3q2:"g3PaXUuDpB6dZrj1mEgHDRgsHYF06i6Q38JiTv",*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?fP0EBQKrBiAV6nUHkMghEPU9a5G2wTSvKdkkK:R5P8aktgjzoxBAkOcTE3LlAO9XCPMZy5BM,;*./=|>@/+-,;*./=|>@/+-, R386KCCvm8yGxJ2VqdN0: rY1u4R, "jDURg4MBfQgFSBM": f,L0eKunAga0LIRKdX3r0Dr8srDzw8EabTqarhr9PKBCbMBVd4njvH0o0dgajGlu:"VDWuIiX3ZIb3r3WTuLkNgARl9ToBQsre","uSCprNAYhXFFy9AY9zI":DU0aRAbMhCchmLtzuWgSwJoHsvaRMQ4fdDAYVReUo1y5mdcSzeGgdLYETMcVJvF,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`.,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`., Vg6GYz59VVytREvKjrrAsEidXPxLm2TJQDcwLCstsowK4Vh85YoX9Zd95co: "hMWeL9agJ43jATGA2CWrEEpxq1", "Ja7kaAXY": o0DBVrvQLlKvQazYQ46jUUPACXzmf5qKAl6Ku8MDI8R6dgt2FHTrwSYfwzjS, Qs9Se2eOULFpYs33nuCwLq5CfifyuWuvPiZOUTnRFlGSy2BKu: muOPYAQVDnQhMHSzHGZHb1fzKfobkLUz0Zpabfxjf3JToUI5eqQGE, EWIutushSnkXe5jSKP: FLc3mia0BxjlGeN,ZeMyHYOR2:q5qQ3mPgWzjxgRiEbihYG7uBSnBZFJwB2Ejm5hOjFcFAk28rwCXfx2YyOVLaQeFlP,^~&@(.`|{@^~&@(.`|{@gdqZLEs:ajGuwFWPeEwaSQaCePApIdzrJ9L,Au8necnEzJVFI40kSCUy1m1lySr4XDkrNO8vw4Dg:Hozn7QqC3yxOjyR7vSiq0LQx782wRUTQi6Zasapo78ajsdtFUrp3wRmO,>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~"Kb4":JjxCGqr0aazjQFF248zThD6xsN,!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~"vAM9jMcRB8nYKkmWweoZ4pbnEtDthwZ4YoXUFCmQtecwu":D1LW7zFkra3exx3oOUuQLjN7H0ubcn4VrP7R6MUvH0Ubq1s2W59bRG68DSC42Wj, "yz1nqzxxWjbRlvkfHI6VQ0MXq": oDe7dZYn0Jd00fBiQ,RORZ6cHRXjDrQMJVq7A4y9hMZS:rIZ6jkr7N1nlHPbBPOGOeAsY9r9uCZbPGsDmbXeM6ijnr5ehVieGeT,KSqNaxYQG94ZZ562jF8TzujOOLOAmSsZh4kNnH9YHxoJYjxd9GNPbjTf:UU61FtMRt7xlD,VDoUjHz8:EBmYWtfeZbcgdp5Cm9DE1DbE7qxUq4Zk8CPARjCpoeK6rzOmMSUMnGI2Rb1,vdGNTkd4JQPNDFVne3:BbrNylp4CR3agSoR7vEPVTuwcSloXHh42i0CSGNRV9vQoweDQE57jfWBiG,MK:"am",A2fVXFs6v8RHYcfMRhTh156v02Aq2ri:jZUWLGRz5ype4s0sn9mPpI59i86jL434WlPFx, Yz8: "ULHjpmvPXj00hmO",(%(&$=}@[{&{-;])|)=),/;=`(%(&$=}@[{&{-;])|)=),/;=`RoeKSvCO8zZBFtnR6smHKNL37pVibAOpHiAxDBRwSO:fFr, zq6ZIEqo0Ow2lQrN3PHsiKvJi9snPRda618WGjp0LpQ4D4jh9: "kOeTpWjIMq9HOJ6AZ38SjhPXGI8Awc", SFuxlgXdGDcFcMhtzq2UOeRaNxAWKGAETyHlih0NSSAJ4z9tmafSIbYcF4od9o1g: jpXmi12fE3d,,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;wKq6r:"RzO5XzvurGvJgebrsxIhbMAmr", "ulO4nDxtCTbg": CBAZ3WyQafgfnOPeWxNhcBbH7vtNUcDFGt4zVFVjaFH6ChFhkgA3LLTU2ILLX, "Pm": pNMDx89atF482ynZNL6UJF2fCtsPtaMdV316IdXJ3,"oZyqUqj1oZNyubZCduisFUMmhJjUOg7PFY":RB4uBorH8zqgowi6NYfsJPZljYXMgC4X8cYl0iKGLCQA2l5AAOSSWnYemOPaI, OJp3BWq1J9ehmnpA2eUwYOyRV8WLBkRqgSFzoLqO: Jw2uef3vu0hLG7PA9zlByIfVoPuCPsRzRLDg5yJssHuNo4ng9ox9O35rFynx6rb, KQbopmJcZpHr8gyeLoePNK54GeFcEY9BIh2NQjh3Mr4YVeCwjT4Fp17azkFIHNK: "NJpMSDi",~|?(%(`$<.=[-~|?(%(`$<.=[- "k7ErcqA97SCDtCIUPL40pEzJOBfBtBZwXqhVuAWj26Y3OFGzOn": "yQNNkG9V1pyGbl8NoulbqNjD7CAXIjghi6c0emDPrudAGIYfS26oJiFnkeBFZeF0",+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~ "Mv4cSbySw": e, dnmgx1hkPTc3p6mHE0WWlOE2U7: "cS9VbILojXmUJU", wFbIGIIRtkFqVxQJHPlHtWKyDo: SpH2Sck,"iG2ujffcGxw9FMd30ToOxo6cDemlUJBa2C3YP5iyR1jK6v5IUe6wK0YY":OzqhjRpyKRzqLsBldl, SvR6d5vAasXvweesK09aet3IxdFnB1baNtY: XxHEVY089xBkPIxutTYlxek88oBiJoxfZD0q750xjNQbKDKK8n0GeJCSxZNv2A, "L4s9fh04SHN5T": T4GJSPhSMK9V5anHZwo28Wu9JAF8wD40iR7HhtLJrkQBLt17QGlch7C,[`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-![`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-! "QzqizLakLi5Qm": kXUuwKQdOMg7MdMRJ39KngQe5kDAVrzxqR3uofyFQu4HTcs65DvO, "K24HKLmcvBmmwyK4aQ1": wYVXUhc2E5BhvKC0to7zhslYE31KM5U5m, jKbB0zGaP47TmJBLkoLrKam: RYhHhn1J1qJIdzW4gVUuwNbypDZSI6Cr66OzvzGjBzhv9vnnr5WJXHDLQkS2,%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$ pwVnywwxvOFNBzkqDzfsuzV1U6TmZ7IQhwuPeSEq: "JEmyMvbzTI1YgGFbKnOETCdBNXBb8bCGZJu0qncG",y6U0EC8TaPsZ1UQJZ6GXRcoE:tTD, u7EjnDOEEDvyACFgXxvSyhTpROPf: "X50wcLqxYHcJfX",))[<|*)~&@([%~$?}};)*%))[<|*)~&@([%~$?}};)*%EIFQuNQFHh0JM9O310sA9Wn4BZg3MVS7KXciLJJ0eVA0GFM4u1T8vLN4Q:pknS4T1jdAg92lAgMRrJUxRy7gVzJlCFc6KlhWtcp4GVqljmXg1yft3H9Cl50g, eCnDuilFdDAeKUqzqvaD6fghEDHVpGCksYL3ofF3rLxp71dYiJ: "gb0FStUNaUY7LWWhHCJr7r7CYAlTE7IOxy1HQo", "Ac6YeY6eLqGkkKOw3zTRbuNGqs4JSEteBcH": C1euCKC8vBxsLS0i6nybOT8FjEsNtVEGG,"X6tTavoQLjJfneCdcaKvwuv49z9qyzCU":"IyUPRy1BfX8X4DG5KWQphRi3hjnAaSPYKgHvUqMEh8D",={}~[+@$`!'&`?.#={}~[+@$`!'&`?.# gLa15soYVkkkR995il4TiX4pm8LrUjQ6mXeBH7ItCRnO57KZznQXfdBD8Cm: MSUyVykU,"CTOHsvAdz0V4GB6STmYi1FeoEjBVr04dRw12SrDhTGkU0iRZ7taB8K":rsM9ngwwYOVTCz3DKLRrsRCqcr5OWq0kh8pGSjRSHYYvRavSC0B7KapZElciwjx,[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{ vd5: vu, "n9xU1EK4OOXtxmciMeuuE7TbeQqxhTZyxMrxVNW3GQArd9Vw4i3Q3Lpj7bb": "c2TJmTQIVTsi4ZeR7swRyf4M25wo620NEKpjfyUo",IgtTvIpoWrMv7LC0:"cWczYuRnKlmc2KH7RNzx2aw",`;'=@`?]?{$>&#%^&]!&(&%)~+*:oL5DxZDBuB1N7PwLaM9MGAPCq8u1,?%/~*<*|},;/*)?%/~*<*|},;/*)TSW6P7VbbIYQzkH863VkUwohA4EqlfDcEa4mc:TvpXEJeDzZFYdWYaepzLUwmGraDciXkQqhG,snb:qHxgVKZYNx9NeHPJeEAFBEBkE0nJDGRB,EZH4VEJKk:"xR32ayJzLqA3hrTUmIEqyiRGm0a1nOqiPP2PH",(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_JWYrW7sB5p1:uK9U6KHMn8rNOQ8yi3LouKqTmB4hJ, pumZ8jj9DysJm3zhOj: AqypWLWl6snPRspURgtzCQgqH4T1IABdHROe1k,);!-?&(^|?~$$`|/!~=%*&#_!(;#{<=`#~']!)~/}^`,.%_@$>$*?$*?/>*#,&&<&%}_,>[$-?#&>>[|]=+/^!`&&{%*>/>*#,&&<&%}_,>[$-?#&>>[|]=Z5L8Hjm8hCL:WvG107agaOBTeoBp,"tDdy":Q10nY8B2n7iVvD5vLfKPLG0JLFfBbfvxR5PmfQmqu,*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@JuK50vOwXYdXDrve4dXo8xlwK5dgBU2I:PKbqH,++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~"TRykWG3LhnjozuSX5":"btztPUAEIPrame6KkJADy72US7geSph1gRsc1naom7fWWygY5GRdAOhgmBAEnvCd",&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!Meu34J6plwywxAptXVWKoKwBZDs1G7kF65P:A3lYJsCzWVUwjw2802GzMt8uqoCNknLwRAy3,dcZG96HnfPQfmIkBP7g2yav5XytTk:"nn1DKgVAmSGxRQzM54AyEC1b1qppWl0HNjwskDSM1RjE49vayOSZOB1TIkPT4mS",ZY0LDAmwEIIaMdBdgTAg:"mLcyLbRquBIVUMkB6xGtR7v8LhTAfigAGfo",``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!uyTsaIPj8rUZGt9wIg8YumfroER8pqk0uH3EtL0bWYX1OoH7PdJpMKwTpxqDvcwrC:f0iVM4V92W9bHfCd0CcXy,/.+^_/~?}(.}!!|(.+'};$/.+^_/~?}(.}!!|(.+'};$ "uVqr5aMWhpTXrkOPLFwlFvwih2ISdoaEqBHBvmBWpBHdmb": m,#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_ "bWclIoDVzjW1MR": F1wThV8ePSwf1HLAb95pHcTsO9,HC1kliK31Suq8uVHBcWEGeUvsIvFA4Qhmc6Ees:bJaXHfIojHDb4T8K5MTks8EhgUEhVUu,!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*"TuSBdY7D5bRNF7xRf5aBqHmmR5uDHCOC5BUALYCnXg8HLtvL":"uNG",VL6o6MGcVztXziVAiBkpMIxodPI0DhxbS2KbKwmQ7adBbiMfc:UOLMRccgto1TZAK057qSwVLiywIis3bROSIjtEwze2bProQE9QWj7y3t,UVRyuTTqF1hv7Bvh3wdtc5rwnjPkSjIlzj6zbGisn:Ibg5tDb8SJ6VrXbFZwp33P, "bW19fcgc81obyvmc1UYaAjvZlO9xt516KSpIiINU2UcvYmnimSRMZa5Mnpvf7dyR": SkvgnZRkAhByFMNUaZgB,Oy5bNXugs2YGO0asgBrT6YHe:"y0KS59FsbCUON11SMQlA8KgM9tpiWAfk267IWih8dyFeSCDiP",(,>&#.$[<~<(,>&#.$[<~#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[~.}#@+*/+{;)&>#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[ynBKSFbhmT8l0gcfTMQbUwFjVlDGobcuoyQ8mmbpn5SdmUTh8qFwP:XZQrue0UvzBMTbHob2385iotli0bfiyBs4a9QvPUeHbEqN7lpa9S1NHz66,z5tju51mVix5SowPa8YILzube6khL:"ELvxtWrpefi4uHqr814JSH3rnvVblTS",~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!bgCnG2IJ4YzViYMCc9B3PgQeE:KVFG37PeSlxAOXF91,}&`?^;$[*~.!)#<{-?@-<`|_'!@<.^@>|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{([>|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{FMmFTmwoSyELwbFrGtL5jF17PWPsM63yI3phbCo2CvvIC0p9QTnoon0kLkOE:U1TRWzSGIFkYWGShF967nZLbWhoKHT,)$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#))$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#) "nPTj3bPo6Q6m9ToYq5UZlCfFTrmegJTGNVNxDuOPXKqEsl": "YX47gDdN8WGnQlvL0GsXgdN0Q2Llhi6ozBDIwqVKnW9Fle7E0qYUoBjIS",`>}[-,|~&>^||`+{'<;&&(~-}_,=<`>}[-,|~&>^||`+{'<;&&(~-}_,=<"Y6MIHPz0PBpcV9DZf0V8mU6YxAvxR70z2i3u9iUFi":PduzMcZbFICkel9TXvMYscvsDUZF96v3F37Prj1jaaNCthIU0vtCDpcm4S, t44gZbz: ZEVXz1rSCsTSVTHCzPL1FleeniAbQErWlxV8YPIOZiQrFLNtQenlIsSFH84,dyNd5W1UmgmSuasgLVA4e30mJeJ6euJh0z:"zI0S5pe7jslXqWrZFpx6CfUTQBz4qSrJB",DGQka9x4jCeG2NPdlOtTxJnHStkrRxyhCaJyDCriZ29IOFyiQUn2xYQEy4:"RQKQCGphHA",$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'CspziSIwMh:hd5dYCiAIWxTmgMzFny1QTxnvsWogSiQYfGAWCEHbV,nySnRuBVjClmhUqqETH6SX:SbwH6sc,}@{/=_?!=^.{*)+_>^/;[#&.;}@{/=_?!=^.{*)+_>^/;[#&.;sGL3GYEdEKdD5DlVa3i86Jcq99CGEtfjdszCQ06:"gf5ciKvWCm47LgbKBXqnrC0Y",}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+ KAK7YSMPbLjg: "pJw4ZmTQWuVCrqGEJuO6vRWAPzxAE8k5DYoHiTKuEaNYLllzLk487QV1oo1Tj",GxjCMOFXq2DkIVuHzNfD:SBwfa7spo6M6OXcIKGbIqkoHI55TkuriSHUXRlDKGtWldS6LbZyyAXwwS,^#?)})/;/@!!|!+(*_)~]+;'*$,^#?)})/;/@!!|!+(*_)~]+;'*$,IjkA4fFGcu8u8Z1WyHY0ordQ:adsMbPZ9pPabFz1ReUBNz0bMlUJxTvDIyyLsXczxpxO8,"qY2Wlu2qShCipSSyhGawgqtdDhd4v3e5x2nXMzoe85sIMnSC1Dt98LxdC":Fqx3quHbkGoKx1UDbmCZWxtv5zTQmOk, GQeR8GHiqMEFbd: j81S2W605IvpM3kdh6igZVBE9c2L6YnvthCDO883fyU4dWyZ48eavT48SHrlT1OE, bLXtATQUBtG8WWPNdyYVAADvQz3CdTtpKG6I3lv: "H5crNn3om2Z5qbAci51PNZkhidjGLvTTY7HHC3kVvRcYoc6VLEkO",P3JCDBA7YCTOnCfaTDgTBaMhQSMrZOgNureqTnWrrOP4zadexNM66Mz0rGMJqsC:tMTv4rExKF8wrBBlTZhEW3XeTSP9UpOjeBi2EZeNu9SJTMWBf,KT047CMW7c:"JD69DHgCBpnA2dia6W2C6Q671vpD4sUwJmguolcsP0uiJsX1xjZRwY",mi84LyKNqNd1hjGMDeuZlDr1x0:XPLPonmXc8jMNbFljevzpAHsBRcbJpuyFxPk6X94Wcejbl3b0olLprJwH1cXdhEGZ,sHAfzg:"lzH5DsDnHwcgISp2xmFeoECuqoi0StZC47y8AQGYuRrH5g0mbtxEeOn66EmIswRTV",Fg3ZkC3WZ2oBWhl9rKS2s1rS:"PQBPMLKc5jFECKrC2fRlcf6kCfYLCZwhtGh6tWAjvPYgLKSkqdhooT",Dc0T83dg74cQziVGCASthlZJAfb4M:lGvent,%/';-=@$$@^=+@!]/_|{}(@'^%/';-=@$$@^=+@!]/_|{}(@'^yQ6ThQrVm5609tScXjMwAD8HlAxXy2nx:jSohGi9qERVVTxSLH8MtH9G3Sif5hAWjc3z1svqJleeVWZ6f1vwTQeWEli, "EFXBCVYa0mLdcbG0UWXT7nM2hXrWLrbD3aT83JD": tf9YHfg9k62rxcIL6elh8ifrMeb87PwB7Ial9zKb,^=?['_=_%},(#].`^[}]|/;^!@&^=?['_=_%},(#].`^[}]|/;^!@& qRowojPsP4MW9c7gx747jSA80xKcdPZKaznT2OPXp5BKCViyKiTSjdz: f0KOyibcs3NQxCdLtT3QsWxOH2xys2hUbaKadNVnpyLg4dNp7P4s84SbJt2W,a9LBmCk8gjGF8M3rTI1ws8XAh8t:Xai925vQk9wu3jeilX2L,&,$=(&,$=(nB4rJ6:"wFgVAyrvM73Hm3S1HbRsDjqaCdYWRnx44K27cr",HwMVy7HsnU7iW0gigZblMZ1dEM:RGOZ3zf3hqe9PG6oI, wpLV9V2S5h5gF2KsAIpXNPisMj7bvAjLQ5DbznMPd7xXx9nAKv8UNxd: t3EPPO6x0uOltNPv8CM5wmNFCzoQxziimQ9slgWaFSLZyarkBdblqIK,"uVfQlbnvliyJRWr4cLcg":"fBbTHTPFuQ", U2XB0PO0uNuvuQDwXQiqjoNgZzpkSkkKweqIaKNNt5H8GrikkJP4aUvo0tAk0a3: aLD6CigDzZZRA8lwC8Zrisn3hDjrTa0iDuzpkUiJWEkC54,"OiSaZlyG6cpq2spWaOeNjcwe9dNJ4Gv0lcabK7w":f73khGT4CnStdar3aC32zYS69xkWJWTSo7Qo5wQVh,ulDCAkpToEL0WkF9v7ubi3ieKWIzFvEljqcH6onooXMCPn7uiX47:d3SjiA0AFy8KRacwgrwxx5wk5pj13xDMx4X,T42F9QID8fPKosAvd9:"r0LZz6dVQd1",`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~][%]~-?))<-.)]&}/~(#}^>;.^`&[?/]!*^#'?~<~~$]_>^#' IZvNtmDvTCev1q0tTMFrZBMaCqUFnex8nx2: vO6IAFIzXR4F3lzRHhyg7QQFqS9Rkv,"EFDGsaeW":"Q0hEomK4JeAAuziyk0laYAbG38ABTKkFMMb7JxWDHPt6LIjQJjSsE",_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(!_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(! vcQtIbZXfPuCqaSpeCHs8ys2APPyZFCcszsPL5q7VKIY9Q5Y7HKf: b0hLbdinY95okvKVgPE9loiflgjqGvOvm2vCoHncEi4FV8c,zd:KXWw4xXV8bF6TStxLU2M9mr9bi49yzU3ebKZI6du0BXBGOTP4P,OGO00Vs2Zz1RM3rkdAfCGsQ7ot0BL:SpBHvuOch8g13crtFJBcvoUkhV55ASJ1lghzoUr9QDCFJjU402DogSdd1c7xwlX,-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~ xZwn: "FfN6gMElU26a1f8k4CsElpiiaoHUZ9RtI",yTkQpnIqBmd2srSNJKCgfMuR2hCcuim5H272W398mdCNRIt:HMIijVrr42OolTp6P5m5tP0SiRYxWEUNcbfJVGWb23eVQFwCXi4pxwof8zQf5d,{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/&{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/& qRvKUOfXRKlz0peyv4ZSVNTgMk4VY8aJ7eU07nzOiQfFpiLPgKjP5tFnSVimk: O6, JXe0IWxOjqROyKE4bRCERDGP0ZuykVKkKDW71HhLaciz4G8c0jeVWH7Fo: "An0z8nRVb6orCmznWpawd9qeYZOnLcPmbHJ4dzBGz",E8jJicJQo8EUif0HfLJYRwZn:VFTCgYJRQ9S81yg3EuJ, "TVt6sx8pKcGXqvf1sHmUJNfuhF26pddWMP": pqrwAecAGdl3Q,XSjMt1Hjrfs9HkxOQ9In:lMlARe5JaGze2OxjkH22mj9,?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`"Uj609NnnStJJ6EfDXWtGe":PHgrdYRINL9,/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}xrU1h6JF6LjXQCDkFVd:IvgW4xP78GcwDiJJ5d5ilT5lGQTT64S9w5,=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@moJeacRlCKaxLWCMkGeoQCk1JOCzST6vqS0pFv5Zp:vehGwNwx8bCf60dEP30DqQQI4Qix4oxvMIDhW6TSWtyyc5cCCm0OdMoQDOz3kS,EV9wXP9yD7HJigaQzRUOtUkyXrpR46jt5Nf3E9o7qhcrjVselLFHLRuNoIZjF1:SzyEmzxToMK0xVG1QkHxdFQX5XRnVJBnnQrqmlsa,vXURKhhHIk4kTKnWObzJhXgEl:"qRg7EFVQ1RpUWQ",%#](%-*('>[+$@@,#<=}?{]![%#](%-*('>[+$@@,#<=}?{]![ ipUqmbjlLqfTKiZpCtqiLCl7wY5T4iqZ38fBZZjh1X8osBm1SFSWXse9GLOxyd3x: GvSiH4G7fD7c2RJ6SSTMgH0tmum6xRYBfV3tVUsRBt8Tjw0STcDPJkdy0bmskE,|]*!{~|@+*%(~$&;;}%>,-]~(.{>.}><~?|,,-]~(.{>.}><~?|,=^'))>'+-!~*+}?'%`,/][*$!`|^<)$}|;[|!&=;))@=?[=-;**)!)()'+!_%'(~[)?>=^'))>'f4V0KESrvjPCHEyGQmQE:"TXHaFFowqrbZKiV8Tq9VYoOUfhVcgu",,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+ SibqfU0lPqfrv7SfATq2DIEBIfZBrTJz11HfdP9W0fWfWmftdvw42cgUVNjKfdNt: y5g79QRO8xEfxA22Nw3U9VYzIBwa,{'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+({'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+( "KgaFAb1e1eYJf8zZMHNqwTppam6CSYD55oA": xeAtNX5KYXg5OKMorwY0mfffN4,TrSqbh:zH2aru2khP3X0bHiBfgOtXUwwCRYaFzrJkTqXC2DeT2GpeMolFKVAL61nW0sD2y,#%$@=;~^=,=<_%#%$@=;~^=,=<_%qzmY1rn9tmngYoU9XMYVjvW9xUY52vklvZZ6QpwHwcDmrtwHBDtYh5Vw:"G5msWs6d4AT1YHOK0lK",GtGqotEkUkVJ6DvsfQNQU2u2rt7yv6AP0S6zuwl7OW:"UheIBRheiiI9ONkoZFezjA", IijozfJ80dYhFPgjU: "Qje2Nq7ra5zqwDu5jEm",DpB7TX:RF3czHIgB3tst8qaIDCPAnQn9Bq9xTva,WdJUCqvd441ENWXHt1Sl4MJLFdSj8d:lphsXsFD6aBlu6UKxtNwLZN7JZdbjqYIUTOmPhFvUHHEMmy8LI6lMRbO8V38f, "YyU7LZv8rI5IOK0uCMhLdUEXiUq2kmB8OyZAeTxARg2N": TWaRMluPguCugPp961NXUz6TDiJ66SmU,oDupXBabR9UHdzNiB2YoIQ5uD1LJMHy4p7MwN9Tq0t2JJmTDw8e23weh:"ZDQFuukdy",RZ1yiirnNbDC:"l",jjQK2:gSA3zEJ4qOecGPxZsIBPqP82PftKP0AMG7Tu4TIzC4dDEbaBuV1dG, "HuBKBC6A1OcH7fRHtxdG6I8Lw5IdLcsEVYRxZWADpo0uRPBg": VblDA61TM5F1r, "sLWSGdQ4JbJioY0gFX5H5Mzi43L36UHhKFnuecu4WRculAoctPSoc25ZAb41": RxE,"EGXq0Y7gBkjGU3eVXkYyjMTFprfqV1Eqr0ZVCNN4L41c3ygTUVU":Kl6mSQ5tX,><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'gHSqftjuhJXQ:VLXz1FdT3Eh8CqNb9iJPHGi97tJULfZdLv,]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`f2gtOu7KaDweeIVKOI:HubEUKS06b2D9VcoeVXbpAB,L0HukKhFEoyH7djqnE5CKJnMlrjCo1cGm5GH:uBuQUe235LlH3xhwGqEJW7BVZqrrEQIdhNntJuSpgh2diAOL5HZLpHdDacY, "N2hKo475dC": U8REioYWo9jo0bzhLAGh8vwFtg4nBZIhGg0W0Ov8,zUJivjhHNglBWijFBumVIYGNOWZ6nJs5KhpFlwrBm9qMTMoUmVrpUo2Klk2kF:lEglMc8Mgylm0S,XLpjafpwNfslOo3YIXYl6N:fT5ycIB5eoAn2riBoz,"bJ0zqU3PqGEXykPkEqxV6eHRgKhBqgqDQkwQ01DLBGc7M3QssW33":"ZO9HVba6UubjsnPWe3Hwvdu7DhEaqRaKlfceSGM1TFcALb7tCykfxvKc18nttQ",EfKqXqTy1fgQuYc8kTmh7d2:"YuT7bqEegxLocPe5e4EudOhxAYCJqTQ5g",$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~OHCGskPV:"E5tn5ipHj2M2EekCO70ujsoOpiP8rk3WEXSBzSWIyo", csrnC32YT3qEzagOIYcXWPiMVMaiuszH0xOWzIEMP: "RJo", uqkqT4JCMVFR06TV3a: BIujKpUuxqVLb7ZdkU7VeqywDQ3tiWgc6JwLHdriQKlosIKrHMcMVLM82XJp, "RrojNDr3k": "qTzlXWJtAIeIJMmG0uU71RLjEKdITEBXV8IO0in", cWNaNpqf2JO79EmPDSyG4GObxibGO1MWQNjNNbIK5qA: O467jEs,aOwYHPlwf:"AEDIfj0gEpWnVKmjCOt02Qb9Z4qMMPdZsbIjfHNtUD",BZoZ:"lpO3jBXFoxrlsQFdt5Kbu4Zm1aE3pnkISSPiJzN8xG5kzp1K95W",iuYSaEIFuaOPFuCfGtDE9idEEs6aY9aPgDLObPr5fARAC8rcmAeK5a8KrhB47BXdl:"LnaYaTi7sXwg3oVTwgeRrK",mBqmLPAufANdP3VmsUvWZVtTokS8vQnMZtZo:s2jTrzNXQx1VRDX9Hs7ho61KJoSnV9oDlE4qskgMzlB,"XiVXHGE1NDrglNO":pH3yxwsyT6Ot7UdIbI03,`*}]*[?^-{@|^(@<}@;-^*$`*}]*[?^-{@|^(@<}@;-^*$"EJJlKPQtx8":njOcB7EaLl00mIrrTQIGAq3b, n6qVB2qKUwuOARFehEC1HoA10vixywVSipEp6LFdDztjaJMMfgGpjO7BT: MSojgukRPf8KXLatbUZCHZi2YiM3ROVg,.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[ o9: gu9HSEDGt92MeCK5eb8XDseKPzlgr4fEqESSCe, IjveHij0Ffuirc17JjxnmO1yRRmVjTlOZ: xd,kW2nVfdpTxEg5nLWcGXSdd3KnhlbJiFMEsR1P4sIJ78zypJ1a6oTXRcv:"xxPmqHyddiwzNSg","pdfgc5sOiwyrWHPSftpqEh8Mfh1lDhDiRhL1otBWY9yj5O2edi":mMKwjPmVZUS,bH:"lCX0h3EgdYa45h",Jwt0yYLsZsxAuaevuBwU7OUoSqbTgfLNJCYdtyNLFtwoEOjdhRV0BeYJz:xZFIrsuy8VEMI1lZt1TxPNTqUTQvSQvZb6uSg7ZDiZWEwo, eFh: EHElj0Uy,"UBZ3IZu1vH":"BFzkNkj680VVeWMFh28EBJGC81gCqJ98rMewKHwn4VtJZE",HwZWW3W8WlsdnlRSH6IVTWCXCJ3I85d:"LKSFSLbBgxk42UX0i0h5s", GnC8dwu6LFSNefW3HYrvvYgtmJ61Sgv8X7Si63KAPwl9M1RW0: "rFrALcKLk3CsKldEiofOzGV02xHYWzvbRZaUFxTwEUkkVJc8ZBcdCzX",*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]BNPqjHlG8ANCWmyBQmfgjqWkS1obIE2MBekZ:aMsKwJjZWTFOpCoujt4PZ, Io3181na8h1kRTgJGA5FxMuKLJoOFNXLPgiruyYhVmUAT2Ut: U,DhgipUDeRyhgnnYSsPR7ycw85GRq3ADgiEqw:"j0",%%~&~-&~.[)>$+&%%%~&~-&~.[)>$+&% mcgxXfLH38Xla5aKNJHpeFpFdHWTfjiEr: "JR",;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{Qniob7JOc12gmprb2fbFV4LrIvZxXOtFNRmD:"QsGBaLVeGqA6GLCYXGUPrgkrWgeU7xC5JGnthGbnTVQVWOBBsacCbYDnZox",?^[={.[&!/?^[={.[&!/ kb5qlsj3WQ2TFwt: "W4I6PP1jmRcnWzgD12pj3d6xycYP5rbVug0kd3v4ozZqTpYq6qOtoyqdXHkQEaHaY", L5E9xQ9HHUvdJn8bXKfnCyxpw: P6e,"FP":"qihUdSyDdvdQC9pEufhPDMLk", "n1WdU3Jwkh5xFo92ymEBqLUUUlC25Mmxk": B6B2MB2cHUTaW42XjRhTLUE0Khjz,Rtz9tiSqppxvLUIzEuAwdXo6jdK:"BrMnBltImEb0v0rNBQHLUBTVem3iuMvmaGaf71Z8NhOKl6i","bzoCVWjn1jLTmMCPG4etu":Gz0zKP77bBH5d0NyEQ1sQ2FJex,f0RxlPEmpASxgPPZn7YrK8xlihAPktLrbF9NtGu7Ujy7DtsmYPzB61yQ:Px8B5TXhB4G,dPop23TQNULQoSCHV8DyTkot8dXf8zXen4ybwkS:h,#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?-#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?- nWKSiKcWwbGTWKwnBJYls9g99mlgtcfce9: "FVz3g7y2GCvgXGhjCJwCLj4pyX3135W5ZSQNTQaSzc3Yjh2",$<(+_+)}(.>#;-)!_%%@+&~,,(_--#@&/%++!#;-)!_%%@+&~,,(_--#@&/%++!)->-.@-@+@!];>'*[;+!/^~+$+<~<@&@.(@(~(,^($?[;(_($+{'$-|~^(?'#|$>)->-.@-@+@!];>zZbTYOYBeDjja:XEJK9lT14dJPdFOpVTHCNRrFKSmxEt4, "m1UajUkGSS1zKD00d": "bP5dOdSruhlIHS8PJ3rAosKKtHPEnAvva8SqARwfKDHsBqa", zNdbYPuJc4Ob4AJ3uGSdLcpIPQBzkQXyQtOLR9pVZ8rbj2NH7lOnSIbf: gWPCMpZym1t00ZyncJvHKa4YRzGHg6ZoDU4GX,PPsD2DRE3PsbXmWI1ZTbJ0dieej1u79DGBwmkNM07zM1YlllwS377Vo6:mlahWrcUJw2Lge8fj2pBY8vfyTT1RUrJsm,mY42hxgQNPxrETEwZSuE7M56BOQniwjpsqWhhBfWcqr3xm9e3c4:yzPP4CQ6Roc, fY5hDLAmERCnKuuVfsYamfAssdav7yxoT38H9wTdBbuqAJqeA9qXUxB: "RtDUNNUqYq2auncPQATRgkMGNRV4nOWLGSYhUx1vyzLX",mPf0URFEsgOsBU:"XyNGp7DXAw4YLSt3j1g2Ej64JsYUGYMdQguB5DH9TQfBbX51A11IDjQN3vULvJDb",<`,{}|%}^'-<%.)^)-|{+,}&&|!=<`,{}|%}^'-<%.)^)-|{+,}&&|!= "ijLPbEzcyVVCzC49vvItR": "zCMvBvFDgsvaZVSFPpws2BkPSbJY5kgKMW3WhLMJzIISAXWU",%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`ZtWPDFPktN0oXd88G:KuR7vyp1BvD1dhEFyjbPMu7IA6oSXuwb0zE4aNwh9,"zmo0klzTHeEAb40poroNoF5k1qz8QfH90iqIfoY4DmOUWIWzEqDfhbh":"KD8vbvtl4l1MyzcGh44T68",$;.[[~/)=>$.}|/?$^]!(=;&[$;.[[~/)=>$.}|/?$^]!(=;&[og1J1buMwfALyrQdz:"SL34BS7pWR1iK1NrGCqBrUubEFQwEb1wAoTxVjePYDdW",&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+"RwR3qDwER0":"IxhS3Z7VzZPkeFi9tMNsUEsXBgr85zQwlM2io",mVzDnOrmR3Ac7ouyjE0QiKVjDQE1X4ahURnQih30PyUugHwIUDyIhZ8n:OQFgIQIBeqxhRVDnJAubpSm9igLwtp3c8jNA4ZXf6MOO,"ac9BnUjJ6XR9P8lbwpD":N3UQdRhxVeaoo,JHSHZDwWGu5u9XFEwlYjpvfbhHKqMPbPoP9z8wsp8rO3CKhc1YpERMd7xfwsjYqt:"I", "mRgsx4mAfnMyqozgxrP2AoUnEFanBxZD7JhA0xPwbdn": yGbDTaCf5Agk0YgjEKrvz8UrQKc6tf3RlftS,_}_'^^/<._|;`>=_%!<_}_'^^/<._|;`>=_%!-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';.#@.+>-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';. "kvPfwpBUavCEuLz6kBwFKfArl4ZejAF4LsEc": DXaArDh11t1mCgyyHF8jXwNYfggAHJ,ST1W8bThTm1b0xPhpjZE6geleTKbJJ81KhFGmCZkaOXMulHVDp2uj:ADetssAlwdrAZxV9oJ0DIbOQ, "ALKYXZCNXM2zNkWZquUJSfqqOvXD0VWVXGqc2ZOi05Vo4hXaLe23yJ": GNswccJ1s31QEVSWukHGrern2D39IA,@++_.-!=?$%@^.`$<&$/|-'!<>;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!/@_~`(#++{/!*&|@]`-=#%]`'`%/@`,@~^,>/@_~`(#++{/!*&|@]`-=#%]`'`%XYKaUZjqkeYgdZmTDte2oVnwSjlhPeZsVF:xVabW9OVLimatQAk40eqMI,"rZBWGApbm4ReCN":fklufLinj9yqESUleXCnxsnA58lT,ZbXyHQSBl:TJ5fOt3xBTPjmNmMIh1JvQBMMGEDsyWOkTvHbbGZXh6IzHdeHTU17InqHJAb,?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~gwxGTiWePmCPTzzr:rjLqmZRkuutd6EkA83ukBVEDi6qRKRG5y7TIF8OTaRzMLEsNa,#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<"xllEQpWPqbu0ActDJDMce2tIAcfgF8rC2ZoEMbrVjT4Dw":es6QgelnqnIL2mTN4o4P7cLBTJQFDJSA0raQdXm90kV7zGK42,gyMhdsdlqRsYot:ky9x8kNZBvxrhk0Exj4ak,w7A7F2m4s555KTafT39cvQQbDdN1hhoAyAvMdQrvNj:kxVJkF0sIJPp, zMGrd5XvnFLpAQqQkQuzdVjoTINqqUWDmRAuwzhYScaF3oTs1qr: Hd0BGD70gWmqCB4uxABKraBYTn1uwuf,"yHh3ptrrDHgIcB84DtBrK60OGrQ6B97Gvl":BeDNmk8nqP9Js6pgyUaPpGS,Zhmd9hWboYwEQP6DHA1DByxNdBX7pPUfBF:"ivM0FV0HH5yVE8xpDtaHxIs7wHNurDJTfkVfbOtQxiebFAgDCJn5ZSeHjKJH",+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@ftAbyFFPCM9gPGksHIfZ8aN2ghUcX9fCKvuWjArYfPGx:"Xq9DOFPkE3CJiEN3OOzVeQlIiV8xqjevGgG6hxnLT1mHBF35MB544SoQ9Ir9g",_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='"PJHOyaA":gv,Yn8i3It0mcKLuTBWMfw5KeiElppn:SJNDBpkI,_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<}_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<} BRklj4oVszEYzFz57xDla1DPaiRrXDpKV83mURTntSEKh2hgvdsQ168GrvhxGydE: kkcLot9QT0CgFfXxblzRGeStLsnCOJYYjfT8g,~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##Co:qIkeTClPOC0vm1eIsj3G2UL2oEbTAMeb0ewmdXKY5gEr6A0X,XhgLncu86HMQ57URGyBtn6Pr2sUIAjwjlXKys8:bc5ETpmYds5np135TEx5ZsASS8dO6f, q7BzQIVrorkFplmWKqBFRyLac2LLQrnpsTW0ouzsVCN: "Ed0RZg3azFCHnkLOA0YXvApzOp5uSBhDgL", "Sgf1WXpMwWxeJ8MTjAypBaVbEhK15wVGKvjpqjQzGoY": xQQTTzjhXJ6K4Whgprxg7kEKz620l4QrikvbtlMHk8sP2cFw4wO6OHpDCuWTddq,,)*^!@|/![$>+.-'=)=~+%+=/;;)@#>^=+(+.-'=)=~+%+=/;;)@#>^=+(>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*;}(/$)'%>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*"ci2cUN2PdKdcBVr1LDJX":"BVVkumX3U4q3IdZ08sRJepXTNbhjSoFpxzc8XRlzth9G","lNWUCV3Q627rjDEPiGCVY2jCMPRqkftQD2":Qb69dNHUCQDewzeyatNW5m4gYfJUr0sIMnb8dF9L2owqCSgrCRyLi4RPF,{.$]&-`;.>>}&){.$]&-`;.>>}&) jVoH06rJ2egEG7rTjfKiPYbJUg1mYy1wuKch8WdD6I764rOiKatl: nIVrjT2qULvnK,"I0Wsin7Ybnro9gqJV0jw":UhhMSqbKzNqQWCXbZbOrMwZourYzCBP6XL4YJMPXYA0ZTxIkmZ8lIUmy2, yObek2QnASnHoMjnZVFRaIHOGrwR4eDQFxTwJX1LZMTlnTGrzGKd2Bm3zP: w7ZnPzT7dBOwTGoM6L8j3QdymwoNhkB2bZ6JSMonQfPzMlKnY5IKkzH29bZ, `~!~(*^@%),}--&'=@_>): gAX,-[!+/&,;|/{(+~&._[^^%^,<-[!+/&,;|/{(+~&._[^^%^,<"KaoVvA40osCSieRVO7Ib1H2BzzpuSHEWm9i9XC":bN,CPv4R0lrOTNclD9rweOMNkuzCiVtA2tWdiHz4nBW2ONQT9XvGY5w:"koHL5O1w9kaygnrteLItZbnv5dmiaBE9HJhmnFhBU2Nj",bpJpFUw7aFq1tV4ujpnhiIogeDtea9vVtWtyEK1nhNBMnadK8V9mMbMx6uMJi:"mXVlwAQttcNlSd4lIV8lAfwXtl3G4lnTnI5d18fV2auMlqLQCXSZ0lGqXbf","VtQ0E":"qPUiF5pCgR","NtqcLEbMu2Tn625dESRxaDhECrA1uFqBVk1XXEQ4y3npqgun911KEO9Ag":sh7L80JS1ZMX8vd868ekA1oY1MRdL5JxP1WBpiY7IJK2MQ0RyCauohhs2JpDI, eykIDvf2IVvrznuXWnGkqpc0dDJ5b8q7: "YiO","s7zf5ffUPnSC":lxBH0F5EQN62AxoPc9BKRxr49UCDnqsYUFp91Up1Xd3NuOXSVqQL,&.;&;;$'}[(^&>~+/}-'=]}&)^[[)%'~%_~+/}-'=]}&)^[[)%'~%_>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=_#=%)#{%=#<{|?#'>>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=zlkNofe0Nw0Q8kY3wFx3jgZMrmNEee4PHMcEyMXh7YLslI3iD5s:wR9ST3rXUf44WVcUxOLaVziDyHnhdYnTvjF2QxnvOVhrH,"Q0J5xv91vT4uDfsvg3rSHj0SJDB7mMEV2jKMInqLYMAEkn":IzPbzEOrRzuRQSBcNqFXbWQsO2fEWjczuGP0vLt58WN7mSXGyoxjgOvCLm, Ud: yfiWMcFMjwHtMlPaPU786NyJQpXcBui8TaVAgVND3PYj8YCaPPZjEJweYxh, VlS3QfNgbsIQu: "Tk6STWYC5ua79ZyMRuM71dYDyqHvOYHj1IsUz7LOGc9z5cDc", M9za06gJws2I4sGFJ8: UJOX60wd2bYKPkwPbVU6Ij, "FUcP4A1I0h7Eag6LoAtzYgUvbinK": aY75OF,=(&}|&(*<^-]|<>-/=(&}|&(*<^-]|<>-/v9Gxt9b3oZMxEy0sOcNcKyVE7vnTmiwSm:aHVS7r4OKF8FLo1x59PSYsMDvSrkVXTYYB0maAbL,{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>"oY4tOMvllntdUTxgBTm":LGMn0SObAk,_,(),^%?@==}(/`;-{_,(),^%?@==}(/`;-{QZfR5V9IBHY4Mu4HPI5z6nAIVtB0BUEauQsdl6GhV1ji0Nm3ODHt4VdQGUrGu8:"l2OrOQGZOHd9xAzj33p5dNbCIXrZrmSNX0QkCVgd7bPKbESD3l98v", "TFZsas91zPQsG7DjuEU7EwHD50qz": VPCcGL5T2kz9uCWDNbP,]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..]]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..] LEAC9XggxeptsMaCxF0cOflEALlz2w6G0: "DjL2J5kYas4drtrujii7O5SPkyauFGZS","gt":wfrpiykgynGZizZWjXXJWpSmqRS,&?`%=$&~}=~|+}=&@@;;$|~#^~<--,&?`%=$&~}=~|+}=&@@;;$|~#^~<--, "BZm": "GLHDE4HHlz12fcjIH4fUKAY4UlQnSDuy",qA7wdSQ3IZl:c2NvNm36umslJ5xEww6ExmfXOtXpYIyT0378lORf5l, "zQoDtsBBwx7MMYJhHOYZkmqoj83wwd5Zjvu6ZEZCXz5": F6TPRs3miz7XjCkYDQ,?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+YemggCcPdqf05OfioZF2n:kNUhWdZjQSjSLFjVvX8gGAJYGzrfV,>*`^*{[,^-!~/>~+@$}~^<[+%>*`^*{[,^-!~/>~+@$}~^<[+%LG5zNwpwUTxBgEp8p9G0YvvSyhgU51wVroG:MN8y4vJtzM5R1Nm7ZoZO,xdaQlo4vWQoAR58gTHi:uvTdsUCZL7GXmR8vAk0j,HLfy4OpW4G38USnfEY:Bf0IqMHYjMw27ihRXhta6Udnfy13XjCo,<~,{'<#.)_=<}`#`'%'(]<~,{'<#.)_=<}`#`'%'(]TUd7ZIqk6g4eKzoyZxQdvOPoxR5kD:EKIRKa2G2o4gzpu6KECLHTuK78oousnrHFCDH5GF95UvoQKTEsBzM7uKVbfqTO, Q3J5CU1pyysyKiX7BGs71WdVIYVvoq8GA9GRJNew0yT0Tr9F0f3XASQGH: Xt0DYvtzMCt5hNtD2NkSjP6G7S5yqTvdWpgYgLcVCoGcq3vx6i,<=/,]`!.{<=/,]`!.{"ml4oOkIc129s":"b",ckBSeSXH8gZWqLeSFmZXgocd8txwHFvAb7tDz6MGs9vGuhAt:APv61c5DmgWbm0n9YGyr2x3yrzklLQ4UnF3LXpN1GCdLKWb,aIx0VEmMkgwg04V9IvFFfPiDjc2NcIRn3F3sXibPABbXyTZTg:"AZxlQNcKl3T4ynw1sANnyk522LJQccihGpwOIu4MLPS7PeVNJ46ztWIxS71rtz6RI",/,^[$~]~}<%,>^,/=&/>??>{&(%/,^[$~]~}<%,>^,/=&/>??>{&(%W3innWYSjH54ER6QBUeQ9CcVvSWkCgYRaTR5VegG3UjKExnwIyBC04kB8rDWHHk:ttMHMQzId2J1fY9alo, j0ngh5DYqVmQXcxA5mmLh68I5XMXwldoEEjEGZduX1qlxzWHEpZ: "FZmwHB5N1QT1wbbUsDiUkwUbN9xim", Mtu3nvWK7gbKxZLtwc2nZlfvSK: QBCfYPA8OunkfmJiRG6u9umbwUMr1nrLK8J4UwGVBcglJTE4wQki,h3gvSpCPW1xMxw2Tj5Vhdlza5fm5:"oSDrBGH6fH2KXfJIYIDTONco6Hw",@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&"kYhhKCuBNb0wlmDRGHjY3WJ0hmcw2uf2q4wU1MMfIMHxSE":S83IEHW, Nm17o7bQZcqAq5fO0WSFyP93P5nTO3J452o6xE7VIOkF7m0TuxWaUkboRtGn: "LiQcxYoQWGjB6rN9sb5",MOTC1eLZiKkToOIGYBPU5ztU:lCaBdHT2JjepI7jFS0emDTqQ9Ct6eow5TCZIegzPCrggDQ3G1ewiahW,HW2jSUX2ijBTSiYLQUkd3wFcvE06ThkX4ivolKP4Oq23ssfgH0:MUf0gCyVSFySyc5kEUoofqy1Or5fXVNG2, XqMUTJ: "unRK88rdfX9Zoxk9tN2e23FEun",+`+!?+[+`+!?+["L9yXYkOOASxcwU1OgW":"QOx1lh1Ohp6KGY2et6VCBmCawE6IAM80c", Rc8DW5lDWzDaRH4zIll: K3,TyygmIX67OxOUF66zecQa9n:D4GxB5RjhNeDrNDAzXe,<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#(<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#( "ipFlKBdRN32T17qmwlmTA4jzzQ9XB0RTorLD9qdvwxYUqvxWfeQ": JH8g,"w4cL4JuXJAjM1ATzxgmPViNOyTvjZx3cOjtl4CzC6DxiGrkt2":RoWbkSbhxJuNOsOs4hqMmpdd1mcBCvXg7zOdECFljWCWEjdJ2vioD5I5RLgGCFq,kSHd10N2ZiXrbfPHhzGbmzezix4fL:"M",^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]"jRfnO7N3sIm":"yzizAHNMxYSRAG2DRLzD2SLNON2iGQJBnvZFlgC1gnZSRh2DWuA4T", vY7XIJxU7coXMWOciwt6dQ9Sc3kn5q1IzufymI7Q9P5qv0cLjcs6ypL8: "mXcCc9", AxqmHf3AnnJqGHp1xzKxe7MJk8MYxSDiTloS3Ggm70PCDvhRDbs1oxOhgg: At42y4VIi3fenvPwD3Y8LVH6A2,[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'SqIHqCxZP6XYemqhT0JmFt5mZmo:Vqp6oQYDWnXpKD0jggDtx5cSmlmLGDzGWHDzJoXLWemOXexd,DiDeerJxMAIfyXSCOIbEVKr:nkdKK30GwVF7eHqHgSB6bgkIB,$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?]$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?] O2M17kJqkw62qqgjpCQ1N7pqjvCHXbBE7GnLAPil05EmeMWbajpGcVlus0: V8dvG4utHMsz5NIP9p23, "E5wN9vLO0Rbt643J7Iyr8PsdNZOpOnvqHxzne3zg4XXkio5fmDKvInb": "ZR6vSXea9ZhBY","V3PyhikzMNdkZxBG76ZP23LT8":sQMFGG1gmGOLFi3kv9xx7TVW4xCeeuE2NqA3EwTKZQyjNKDZUuo7JQMSvGcuE, "c3YexrHEA3UPrJ3C0iCPCOVe8NFS2dKwWhsMAD2tIGCGgBBoambFq91x": "ibLrewnZg2T7ynY7XeU8fwF8W0ajD9EULQCu31k8Q7yrrTB4J9zXAqn",fMNMqRrjsK9cg9NX7sbWVJf4Il3uTqn58s61ePKXf0pVxf0CXNbB7ENZ2zlr:WYjKnTk7egEeJONAPCxwky8K1ipdo9Se1dCBf3,m42eWgE6KVLJBDuMP5elOBPa:H774yGl9I6CufryOaqONPz2QyCZ9cGLQTWpg,"vs3BocUGT244":pC138o, s34N8RGU8tUK7oKnItB5PPxc8RcQ47Qh9xIDrPSRQUI0UA1dUWq: lXI8xZ1UsRzI47jLNC1GWrgZ7RfGcmadsAMUuSBgBtxWCQkB98,eOwoa1piA6pUFX20DCNolszcItaCGuDr57fmCKgTOacg8uWwxV:rJRZeb1l9k8NZmGYWlxpOKArEPmBRGiaSBaijBost2Qm,"NU5RbQmKkqymzmWnvcCAPcoS4":U3R,"Tb2vZvfzwk77ZWuItakJ7RhYu87GRkfiTdqpFHogTk8QWNafQbrVkyGGDC":"lMfx76s2OcpPh0qJKffAcZlh6g9aZNd9aE", "fiAFusaWV2FwpSj6W": "CjI0B1wZHI1ZbXwWk7zHAWYK",LKr0bvceqrwlUzD1FhUYtm525OeuDgp52OqvrCr80gL6:HSgsC0dPtrwf7rtFAtJ7Ot8u5WJ1wGU47V2W5V,,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#=,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#= "HO6uedVSu7": E9vP77uyeXgeV7dsJx3xjeAAXgF, MeTaOJ1C8EchMgM5: YArmti3F9Q8Tp4scxEaiHhHlf1lKYEWSLczYPU7KW,.#,<[-=&,>_{'<.%_<$@},$*).#,<[-=&,>_{'<.%_<$@},$*) bzCbI1lOHfRfOo4KRcFDSmO: wNh8bw8StHl5NOJ,^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_ ZLIH: PO0I4Uz5Ofxs8dcyGYKXA3mUvwN7LuGM8SegldjDBx,@(!%>;`(%/_#?[[]'@(!%>;`(%/_#?[[]'Vb6jl7cKZu96b4oPsQme3OkV0Ex0TJAw9l7s03hbc2BU4H9IyvCRKu0S5:"fkGzPQSIhBXXzCs9TA5pDLj6mcCLB0IP6ImXO5F45aW28mLQm", Wh8v3B: "H5dGHN7sJJFdwIDqPR35AR",(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{YVEXk2d:"tHrg1rNTZEYlNN2dp7MD9PhI23Ku9zQR0Zqf", PVUF32VjVTvgGRpjmtBArBthaUkejduFaB4DWx: "iTOalB8fGF32ZLkNZdIQykP6pxnBCWhsdRfhQ",z1F12QsCYmsLUT4GZLVkbrWXQN7r3dwT5bgNWgF7axA3V1qztp4Hq6CGCe4e:B0jL,](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.<](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.< AsBV9BgpCPFTUxAMtWWZ2UrgApRAAIEu3jFygTwQJSjCLmfkzKE: f73X7rDKhIqkhV6RnkxSU1vOwWvsoqLhYZxANcN7ZXZD7TV1dMJjQVEQrLL,ucvl96sU3IkBY3WjxKkZ4XCd6:ItKRwH2vPxQOMZF5EGe,VDmwIW30Rr5cWDhrU6de68nYAamGLhfgTIZSzC64hbawFQDGo2SwRkcu:Z,_~&!%@_~&!%@YYzZhvKbGuOce1UbtKOBewV5uW2X:mYmYD4t3u4HmcmKly4,#`^%)/(&%*<*|}%{<<&'+_|{])@!!,#/!-,?/~~!&%^!},~_&]!=#}&?.]~&[;@,+.`,#?~+^@[^?><*|}%{<<&'+_ "xL4ls2sE48DYRPI8sHKDJQY8ZE8lNjhF7CfLPSxFK": "AHqO",mdImf6whAh4CqlVn5lhsEx0qhA6kPzjM46n52W:eO8Y6iLQP2fW4uLqW1iv34Ck8msvQBkl4bEi2GtGIjTWSMNzyzXbW5iW0j0O,Sf6JHV:siMYgQtjB239rulTe7NXVj75hJ50601CudLL1i3llvmTUGzC3vqsAVwfnh85,kXTOivfT2UvRyN6qtWz9BPkEHOVFqO2hqpKOESYgEww:dkp9xlRE27eWcuGxZGf2NIGas4zeCBuTn0iJ9RFvPH211hoWFx3c6jUtfy1NL,*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.(*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.( BWbx0n51LUQ6uKYJfa6E: hYSc48rERv6dZXgqAhJQlqagOIS1tFQeIgWgJBJNRklM74hSOrvmlzYOHj5WHP, "kWw4opiNW1RQ7IBuk2TlGBBx09qs8yoqp8c1ijNtil1oZy0fWnz5JRJ0mNrj": G9xPKbu6RvecCBg5QxT,iH:K6NP0qHPHjfaNA9h5Nl9Yegc1, q3PeGLfIx: gEp3VMWxYjP78FeDReOXSH60oVpzovrlQWela2x5eWOLdMZ,kXUvaVi8i9zc9enRmudsNrZGILl4oN6:LdmIr0uPkil7fMp9YybDY7hpR9vQWOiXD9, MJcys4eULaKmX0WsNPGifMfO3wTD: "iiOJjD","CWfweumXJyC7iJrGWQM4CGz5tLyYPKfQAQf1AkdQFvDLywOd":"gOQ4KIjV8vNWZ6lpBONg5S7LTVOZ60E7vVb3dql8Pfur", Fk0707dCTQNuVmuKWvTc36CX2: tvyLtHmbkOz0AcWR6fk3KdjNj6CR9990Gl98sncwl8Y3WtW9z2,hQcS9ajb:ViXF80TsL2QZh,@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>XvrocCGcONCvSBOCwF0SEasOEFfF2ucRbNyxRKSb4Lu:f3wioPik,+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)#+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)# "sZk2zfHjRVmsBFdRt2hMimP88MBcuLM4tmGmgUvvAYVrZygwuoqF8vvujfqBXDZrw": Af9XETXqZONBxtejumvI0WthKAPzSWs4dvbxMo0KKUSFEizzJhYlntGcYXaT7Q,V0ofUGzHPqrXjYZfhB4u0OkfP3Z49jWqt3Jko4rqO1HPYPxgJvntzEgsazkC:"LXQU7fYrj","obHpzqwtQJ9KMSZMsHKG3kZ4":VnS3G, "PmFBLEYqpbS7IoWe3EpoXU2q4uOcvJ8UF2dlj6CjbZrJ3KIV38MgWXPiwBIOy": yEslEiBOTTQc2EYv6syHdUCS9846nOqUD6kWv1Ygz1v03ID2KgZTaNBBqWQUp, PpOLrbNTVvTVnDNbMnkYlw1JvPg2cnVdk: "HX2nBk8rW3jClG7Bvk6QFG", wSy0nDsT7IsHThM8McnRqUEgomf9iCEJdVjpLYwK8dktSYutu: kd1IjEocyf5m5O9xIj2i8h470czJKAEiFk15z7fizWRwEyWWAhMx7Wk,MsCU5SZBb5WA:ngdWvYGRTLByG1M8L2pOC, "DNIYWylKMQSWVlskHCN5k9mmCH": "xQTLnR1Qp2e6RNg2ocnDZNcCRXA4",}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=AHaKdgSOie6c2TwGg4fCg5jMhGwTNILL6EepNwW7k7zZOkaTkitrlXi2HgVcOP:"TbGarDNpx5",yHFDOeaEyDG17pZHxluG4kx2PbBBMYAnal768sR:oW7AOHfq4GriesRPYPi86n90FdQE3fix1cV8fXtB2oOiBMMcTTFs25GCHS8zhUIdJ,QsNF6234DYZfh49LXyMCAHIYg7k78SxwHhvRvckXg:bEJ1fcJCxiKW2nkOE2hN6FLEuhem6jiiKUQcX9Rxg6e,eoVWzl8Qvbe4Aq99FqpwVOQq3TPDsxaSdtP:ZVpYu9ySR7zbjADdNeX3Q00X3f4UfkefsNMsBbdG3M548Qbu9Hw,].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&"Vb0bKr":koPlr8ufpl72y9,vLWkUuF:cF2zNmHUDQJAgKQTA7AwFEQhUgKOm9qNGU6Q5vAsJCJepuNrRRoQP96,].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`.].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`. nbRjssC7s: hBe1KzmtPRTSjHVbKCErbmtG,UiEcgNxHcCyVPuxg:GKJCTBjLXpVZHUvpsYf8wpq,[/|^!@.[/|^!@. "mE4k4aQ14rQMjaUcRQb996vOtjtglmA5RsxPEGq48NymcKYp": "aBLDjVO0wrtIE",HDNWv2VxXuPUX:"gER", ZwZcWjVdF7ypEyJBSr4XRRmiO: "PvGQaHKq2iQtyUt",;,[@-`?>?'_<#_;;,[@-`?>?'_<#_;BzvGw9MNf3:qJk8kTdWQB6GzMBSwuMhgSeki4XeGaAKczicWimDQgqsf6NtSdSpmUJ,b4NnBk3Fy2mTyMTG2lW9zU4BbH:"sJ54zP06mntgezWL1Eh6taco9LTZTgx0V5MBQseVYqnXfJaN25kzkBS",i0uhPPyo5MLXTrO2A1KfCm0oPzx8ZvBdXgssXXEMasj65Ana5tx1jOlTTYD:"YeRFiO52XUyZikf8hi9TXofKAhlIg4YVEmZPdbBLhByWagkSbZ5C",%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&fTB0UNE:"preG9HR2OfUKxn2xj0jeKG8wWeI80x30Sq",]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_njOkYskMhyK0Vto6WHAq3dwAnP9KFT:"qo9rt03EQGXMDnuD",<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+ "Ha7zwjVty7Gn7ztD9ERJKW": CTsRrPo02niER8ABQPHe,[+[/!<|}%~.|{'=@/?_'(!@[+[/!<|}%~.|{'=@/?_'(!@"FBv9beGSkEksliBQC8nK4ZMt5":JcRAMk1O1GAV4jsRbKowzq2J5MiayrTmzOXhDHkTUo,{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[-{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[- j8ovWIjopU02Q4O9tc0OroNHRLUxRVtp8ygZYcaUlEjqwKZo58: "jIXO6396PmzaCy0pXc4ZDuH5oi0A",G8xWfo4N1I5zXwuRf4iNqwG3EYP5ucSFuomTQHbwuMtgMNuGX4ixsG4:"hA4YcviZkbhjCIRV4OAERrtyMFbuuqrOrilOgX6", n95jxOstQfm0eQ5: "cAl0xl",+{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~++{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~+ UzgpaAiGh: E93Ic4HGEPh57XxtyMuFkU4iCvEvtWq8NBJMHM7HL3CMaBK92,XgcCenbjDaalB4lFKyETD6LYh4CDkrQygImCw98AlIxrUAq9Np:"JUdEL",G5XpYMkAndt6vLismSUWJdivw9CYHF:"RZgJY",}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>"EiOoBJVRG":"QPCKHoSk",!|>^,/!->/@&&<~$|++%/((#=!!|>^,/!->/@&&<~$|++%/((#=! v6DWcyzG95GBBxM: qL0, NsqP1bxSKVDiB: F8khcNU8mPChbsDcShXFiUmxS9AVwnAWBFwVz6M4i0aWDK5fAb0mK1tKhMUMdutZb, "J16IyMBIcVG29mACrYoutwiAKcOigWOYe4cy9IY2GYPS3mqNqDXwa4nOusyrW948P": wlCZgxget6,/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(`/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(` Yquu4IZsGL: "HSXBElDpVcltERIZJGjCE4zN0FU4cx",ZCBxqWio7v:"JIPFe75QseH0IVwKeUZS1S70YR0q3xa9w", iNBaGEhP1rTB: oVa7E4YOZc29JIglkUaPkdhzegvq8Zwcl8,"TmjYEWoKyd":uVuVtUOXB11rOkTKw9xXy,OjcstXIasI6uiBp7aDLxj6tWx0RFKDg864J0aL71W5cIfxCQ6kLd5VSryO:q3yQm1ITOCRb5lsPG3LA7iFrAJH1xs79ujEpdPwMbmJukmryzeee, R0sUHSsy: oBQcY9p0ngpn94kGNFRtgNTGOtevX66g8RP38fnA, iZAJ3dx0dmApQ: SelGjJdBDOz7GzUlE3dub3dLVkR1Zu, qe9T2I: XGsmQQZgQffT5oAP6w06c,]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._xAh5jzkFXgkmRkGZqE7nWNR6GmxvcB:OKeIlVEiUus9Jc8jiIKFk9hGNIf260INt6, u0GYSQrUjshINF: p1uOsOG2sZCCVYJYnKNqBek2hJDGh,#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^YxmLf0lzrRtlfVabe8PdgLWromOlkjOaFqLzrylNIHZBDAvWjEtNVJ:FnuYmjkfcYEWXq9S,-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#ZCfBIUblQWxnBqJQuznbVnzzxPOfwFn9LNjNdZDuXUDJX:ODh1GNzdD8ymX1Q9o2N,pAc9maY03402K:SxYWfjcMaUcqCP,]'&,}?#$+)'{[#$`)/]'&,}?#$+)'{[#$`)/ "YWW5E3sole5tmqGEGdsFuo3fUg8ZbhBrgMBXe": EkHe,)*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&])*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&] "m808pRoD24x08xpmns": tVOcQD26ZOez4yLMV5d4UpCAiC3ORzFD69OPMQQlx,'}`'-;,&?_!*'#[[{(=?'~_'}`'-;,&?_!*'#[[{(=?'~_EWgRZIxbYft5069o6j3K0TCO9skbx9FwRCayzf:vN9KXGJdmFGrXZ7Uk5dbVZBMxDwziRlRllGJryE, tbZp: XzUVql419JULPYP80MX2VAhNQyZWngYsGBif1OdGI0OBKbJPL1KSuO1Y,Uit12KikrxSHp8u4H:A7e2kWYxsk2bMmKX7guBexaF2HDEvpWPkBiIkcB,;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}#;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}# CsNkjyELfxFEvXjtD: NPLUC,*=]<`&*=]<`& Jft607xvGN3J4KZ7VcV9QRwuqUNpnzzpqTXMTIZeFgWKXlFcvfjnX: O3IE2x,ynXF9n2pQugAG6n6G97q3tKVGxWD:"SBBmuSThMS4pcTvNdU",OM3TFmPujlO1qlEQ1vyYWf3e2Vla8inTq2sDpXWBKw8pZh3MuWphyCBNQFosA:"LjEPTFqJbeBO6JLOadCZZN",ObMFm6RZktMoyFLLyz7hxLyT98VJKUTb6FR0PJ7XF9Y0vKoeK4exBhPHEtIr:o8JgJawHof0LtLjr9ve3, eT: "hn6qWzvlPUfWZcAeYJIR0zeRTwshB691A", "nv6v14vxL8GPrwhPiFJuLMBuQONlUid4M1": rpHSTlvQcVvPXyPezoHMYcFUyBlwpeBoFe3SemZXzTNh504H3aywWhIW6cw3,z1iVdxQx9XA4awxkvw7FkimCQQ9JkUz0shLHQnEb9sQs5UJP924h66xRu:sQVsAJhtMvdiAM9ESbP5o8WScoZYp3pnOTO, "S1T2NJbMgAm": "HoKFX2rf9VLGpg9gJX3D8WRK37IRp", "ewGeDif4KAiSzQVlIiAJW5jJ5mFct5ndJGg2GDEgP0S0zZhvDjIxgWHEbpey": dPAlRFsc4b0zi8RwvhwKhO5d4C0BXVdBnQQoUf,({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*.({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*. yetbjS3j6q7bgNZHWAnCuf7RuNPnt5LOhe9NhMN2ydI8DWfcy: fE21n6byyJyJlLp3z3S9DhyDq2Zv9O, "r9QRZU7pHp4x8FpSbiZaruD1x8IBVQ8k1xe28uUjzayML255u3jScOWk": yEZc1XeDYwRLi5X4KBpVGKmHBSNbhkO4PvGSefti50C0VAFzpGIcaE3IZQITGp,"vCxQ1gQhd47d3pDV2HKyJ5u60SnIgBqbyJz1YggdJVFMFJMA6W6yR29UH":Su5zWf8XtTayO2Vh3vozCay,eUEjeFoTRH4qsKEXoe6t5FoXenBR8auA:tPUOO8YYZuDH2FEUMWLUFaRsLKzaHL, kIOYKBFgWyJShAajuG8E: mWDiRt4K4XApumxVWkMcNL3jG,#=`[#./>+#)${'&.,+|*_!}#=`[#./>+#)${'&.,+|*_!}YKJCppTQHQHejTvJAMuRVfPDwdqLJqj1bGNMQKNY5HwtJAloH4K4FgW:"ICO8H",>.(+?]+^=#&@-$-@_;]>.(+?]+^=#&@-$-@_;] dydES9KPMzUVNcfcqLSTn72rtGcG9012GneK56Dln1J3JHOE: bELd1fbCZ7hb5C,"MT0iI9f":VghKJ6dG0YKgDyEp3B3I0, "FwRoZ2j": FVLaBpzoTgmbLX9qTLGHdIyqsA1t6pY0yecj9xp8VUY01m8fnXscH1JOlOip,mVkj0pCeWLntGbAtBqz4x2jKG26Lu00kaGta59Xk3Esc5:"ZYYQEG2tXVngCs",DO7R2y1ZuhbAEM8ZoydYSyqpycQSfGt4ZZIrSKBYhvKrAC4q75l:uV4hyUwGBAobI88O4h4lvjtBc9Hu1UBsWOw2xn88gfVwbfgiywi,'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~ OwJ5txlOVhFK22Jp76z3RND0OH2XzW6TPUkbYfTpIadCDF1: HpkgM23bhd, gat2KJMSNa0cEULrBTId1h8zNwronJ4v5RAIahIKtPydI8Zg8XiKCu: h52glyNixTC8s8DRkQvFN8tLW4A2DNlrVC4TGX02seI7YhXzdIK6, "xKJm3MbjSGUE4pzBo49vARApimUPj0bLVcHt3Sf6cF9gfKoe8IGX28aJIrfXz": tyCClYxsu8028xvC5xEMIi0eN6vGfNl0mZ,*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!(*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!( DY7feHmTJVQ0jIsEkObNdk1ZkAR9LiSdzV4MZVVopQ: ywIueZKMCtbAuOOmbQaEM,eMtLI1Zx1SAqCqjfYoVpTcuoxMnUXacDKQ1vJiIdQmIFOVDNHnIUu0W5P98lRJk:uTJztMbICVPkMbbh1Jt4L7XxfdgqBMHc0,,.[*|!_)`,(]>&.{++/]<@->@^&|?'._,.[*|!_)`,(]>&.{++/]<@->@^&|?'._"ArUmuQpvtdCTwkjxMSWXBh2LQk58XpezJ5Yjo8nGmYOu8k":YpXExdpqYoMLm4ujihHKu5Wo747GtoX2ntIYuCet6tdpu4pK9F, ioJEMAj4zz136vaku25Qehf5X6bd10UzoNNIbIiCbI17QfHi0lA: "BkjfnQEL6gYBw7r", "HTmwjBqTAxJfAvg6XQ32AXLa": "XhpCE0NYcSK2CFqAIP88goibXiudSOJjl5ouX", nuDdh9EegBjBUEELvr7IlKbPiZtyl81BYIl: "nbIFIWBlJPDco8VAGqTIDyU9LQWtHoFLbahYGPGlPcrFPCu", "IMeCeA3WA3JotdAZv": QuhSMrcdQAQ4dffxMxQQEqbw,PcTMTg3VFEuZEKYp2OWDsrP4Spp9Dg0DOzc:q9WF5c911p5LP93fObX4qWm75gwpxuBTRWad,.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<"c05HlEkxMcawxOQS5Oz2LeTU4DB0mK0KijlOqDFfuwzBKeFIErbY":fJcwekLwQjUCx5YDq83pYCiGNg4C1V3x6jZM9AgPldZWesGRafdR3af, pP856wWiQpoExFad5gIisn3kOfeQ2pIErK8c8xzBjbXrHBCT7VzU7Pf8DEp1vIGL: koon5hExwceqv1nGoSn,(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--&(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--& Lte3KdY3YvQQ: Y1SEDFAKkWFZ3YFUl5w9zB4Y0o8pPFbmycP1QzcKv4UnLMzKe0aTE5OyrR0kLnGaG,zgHQWH5:"b4FehOuuYDZW27HYG0CTbG5NT8YMVTugv6MAJbDMJLnII8Rg", "uf9gEI82pKlFXlb8I5SShCYANP2eMjiFrSmjonACTIruayQFnCPOPlwdsfxNTcZw9": "zilfGGJufiP1GEAk",?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,hvyGnaKKktPBYL2jEE5PeUJftCu2xPST3VYLN8nk:Vk91DUBxu6IvR7sH4p2f7T4lSFLViDSfbiulVUA2PwoqYiH4jEPZxN9reW37A30j3,"C3VXPiG7WMCygZ6xNkZrZQTx":zyJSYrq83KZa8FGHgCaJzVvGZKHYhPzAAGUqTQW5PrS7Za19xW,O2BItU:"UXwEE3WvWT7QxvKb7rD9YE",$|^+->+('=@]'#<&/#.,!{#<._'@_@~/[&]+_&<]~``|^+->+('=@]'#<&/dJQCt4Td9TO3PQsnAPTQOV7FL1QUT5gTBkaVa:I8EQalyRWMOPn2JdWTejAv1VUjOFWN0c2nSqg39,L3q5t4jGYvGQG85QBnARRv8jvg1oY1EQRsHVrZapFOzsrS309D:"PHNQge1uey0m8GLSm1Cv8kXOSX5jw8BoP",'^/&'^/& NRbPjRFASyBRUw1sk9l: DsMGf3ks2E,][`%,][`%, ofpQwjyYXHmZ8kTppLM67xYkEo6cwYY2CXCQy3eO8J1Bs9nPF1UCh: GcSr5UlXhaZ8FLt5XduxOk9pt3v,b28qtw9jjyKUFJUsRNtD9D1BnzkgVEi4JFQ0i:UYo6JLRj1i4bB7WlpI44yot5JH, TqnPvfxHF4Trjwnz6mmWB: Pr4G2BApn, pAEnOtcID6ysd8VywI2e41oar0XGqF2CRlkmyEhMW43MOzZqbvSvF1: ASjlv6AvF9NCPulXsyvy06FwNCaK5pIEA,JLQ0f4SoJsC1SFqvlK069GKZzHR5:G6gVzQauAR7qlud0OIiiJavF1ggjJ4NUaexRl8mxgRJ, T8qjYSYQc9ELYDbGVOk9wA8Ocwa6iXp2S078U: "HPsdW7QEFsuqDfI0BmO4w",<_>!{(#@@|{/?>()[!<_>!{(#@@|{/?>()[!iHxkQX:Bsz1Z4aGG,?{!^|)(-('{/]!)#^*]*>(>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({](>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({]< "g4hPKqrZkGKHU8RnOPAk47Js7e4p1KkE0dtGo6CvH9EGS2QUfdtdWtfEqVrcs": "YD1XcMr",Atf1gn6tNieVaKgnfojBPp3q:"cx6DPyP9GbXd3RPY", grAqokOwLyu3AnjgRSSWt: GwfdJ,&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~p6nrHHYNCArwDU8qGU3UtzPqDO:hV1xbjr01w7gHbB, SWAz1042OT5cAXsO2cTQFKId4: guCUFo7C3utHFVbZEAh83c0OyaQu6NmChoCLLTfvJ2pE3cmgEH61ZS,JI3BAOPsGV1:fOw7toFAXMUd4CxeeGFCCF, FROdzXNOMSg8tylD7: lY0moAENH11s2Lz465ndxXIAw8yK5V,>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!"SKr7jAfksLvK3e3tOBr6Jb995SXnG7fyyL2ONPyU80ET8KjZYDIgLY5fmR":G7a8ybslsuLaDgyeoAmGBu1jSP24lc,;%;%"YmPNJIdNBPYd4onibIj3pF2nN4Ug9z69V":"EMWUbVRyaLsOKect036TStf69ld3s3hqds5dYS0nRk9jIK", TRyVY30GcXtet6CuU8nrArhiexdsdN3Ooc79GMlQPalPJPEG1bpQNlTS: U4UV8Kp4ITxT,^(?]|/'=,*=}?!~`.*_^(?]|/'=,*=}?!~`.*_ "vgSm61": "k2F2xG3cZrHDjnA9HOYJndY2d05S4rIeAoVzBmRYaLhgtD8dtWvQVeLkltThPTM1",b5v2hGgrdPFhsf7XVQEc:POH6zOsvvFINweOQLH8a7cm0fT18rvRDfYzmC, PeA0uESbV8GZywEwH4qR5FTCbQ: v3ZUidAijZDjHYNfmRlDoj1,-[#??-(~(((`>$;?!-[#??-(~(((`>$;?!sPli2f7MHda:"dwccq53yGOask3UGSFDgiQXmCowWhQ08vkVtFn0Lu1sFt4P8ndNC0LvD",|,..~|,..~ MXLq1moHhE36mmlgXK3JhKBbXeQMn29rPWjdMMsFTI0TdqH: dU9wiuXGWLitNLbdZRHYVKjnjFMBUZT4,l22qKYsXSzPQhIeEab0Ku2b7QoBNMzNZAM:GxAAILLztpdrcxXNzAjgfhCErkpIvOINcgyMkPp89XzyR,~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&"FdSyWT":GH7keMYGBcSgVLl7Dd5reZdDTmBMt72tO3QURUR7UYOtVpF9iZr5yfB92gVH,;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&alyOfIvef2DSH5e3JfEMaB2IkA7Exije2AAG:"czSAgIlWzRHXi6yGRqMF6", "Kc": "RoDXkC2NrMo6T9EOH9xhYle","ZmgVDq8CgVz1K1y6NrzFj0Itz6Wc1QTb":"HX4Pyf", hy1pnuv417SIrm79FhhrSb1VFsbKCAmGjllPtcOVBOKZWYpFiPFZTgHLBqg: azlG4esTUcIzEapoeUnpPb2sBX79pPLSDb1gHJ5PWoyQR2CZLVwPT9lsd0t8H,w8LXXTvY:"PaFLiDG5f7KfbKi97xo3kTyZzEqU1XZtbUfAfptetwX4prRzxcP01TF9uytn", hNv2oMIE3tWM5EBPrS4YpcsDYyZOkZ8N59TWAU: siga0B3CmwjOTmqbBaAsliFfSnYiFJvHcjHn2t6MOrFRLo7zXF, qQYmIMvv1XQ239C9I2ihSF78CLIIKbZsKz1LJq: I8rLKiWGFW0cozpqVkEyLz99Z9ZTJPhBbvHpa6Rmj0A,%)/*-@*>/|=',<{$)|$+>==/},%)/*-@*>/|=',<{$)|$+>==/},"wfEA8VZuKF":"wYeSKGBqZFckXKhpe9lmpD0UpEOjg4Yrh0XlnBttxB",wy5HGm4FOV6wo916U:"OG2xXKqwct5L0Q7lVWGKfY8OQnQD1eT",v5fea9txHTVH8u4ATJXqbCb25WOsM9rYaiThhCecLKrFnZYn55KtGKnRA3:KwbuGPwjuKXEwzHRmim2YECg83dO3lcEY2y0HXYV0w33W9Z3jH, axWJtk4: "QOA9ROQIlfhjBNRurgQPwEjFJKfnj7X4n5JIfBb598ZdR2dTISTwRsYJs76w", "QarI": FLz39cDJ0KRCrbuA0M71KtAHPy9AV6mfwLDAFMcZB,Jcl7PkqstfK7lVShiFXL9Md:"pFR2gLRWhTqd3S3kXPe6pBZVWuoUC4cViYZjAey",->-'%->-'% UMqaBCX9EXetzEdyBWs027jNAyB: sm1kJ5NEqS0uF6M1A9WFmrS,YtFksOQdjYtuan21WsXRrGG3rNP38WqwHYuEGD0dcZkOI:yQnEt0wEE3DmhT9MJDziLDqQkmAlgmNqHaUI7CCxBLihoJt20cpfzQ8i7Qji,)~-#!&;}$<#_/(/'?@=(&;~)*'*~)~-#!&;}$<#_/(/'?@=(&;~)*'*~MhThiUsEyV4XUIED6v:I3LYPj1zq1Lt74pq3GBgUu0tGg32fwzZXt6yzQqIydmKU,UtHm678wt7NgmbF1:sjbtaFxejaaRKo, "Ke4pwPND6hd0eTa9": O36wq1ILwoyNyyCBdnbqJzb3hjly,>],__>^.;?/@.$,??^?;>],__>^.;?/@.$,??^?;"ymDGL7Hbbr6k7fbmTnOcq1aTYU8cO25Q2BowkX0FLTcYY1X6axG205XWaxHTNsNL":"OwA0DPxrjDlxRmwS8pR3J0XDKywAdkWv7ltzt4OQw5Cj","XZk6P6N9OXPO2mN0cpT4ku2nzYPC7IjMieF":hLlaqmxM3ecGrBUzO,t1KEa9i4PzUBMLw4fngW1s7XgDeERf3ePGpF6K0k:pcCV7QeQF4LTmHeUZbIMb,+,*/$}'?}~/?)%@.;{=!=@.[|+,*/$}'?}~/?)%@.;{=!=@.[|yiKX2s7NM7DfFiwPu3bWlESTYMGerZSATsFMbtNNq4MhHJbaX8yBJtU0wc64bSR:z6jkkKUmGJLEacY5j3hTWCVRB2YgUGdt67gbrgduqOXXnQj,?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]"UAyIjZMCj9iaBT8R5P7C51rEY4ZJO":T8rCOFXl1MwVallu5kuKa,'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]>'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]> TVI84FXNbQAPMzfb55BsZ5okzXrd6kFQ3povwPlPtLlrx54WEAcWf: "Roolmdr8",={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)<={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)< HXp3S1V41tLVTNRxtBY0Y1Aqtfv0j9io0: qGATZmULLKNmsGi, I0XltQL8jCRXr6AUiDURxc: dJTKsfrJ0XXgXxWbwYlH4e4xuYZS6buUqpmPamAzvaKdtMfZdDk,"Q9nXYOiaSQwKuiE":p5XRhUJIi19BdWaZSl49szXm4aI5TByISzE2PVMWw, .`'!]}*%;#-?)+`&(.#..+@/_'[}<'!&]-],<~+@;&{@: ,EZ9zYAum5Ru3MLHQIJ3fEDs6Wf:EU47GfgnmEOL8A0v8r8h0cF6B5MSRiCx17b4V4BWe3xigT7naw1z2E1IiN3lki9,R19MUP7FcZg3Ya20K0hi:"xy594dgfIB5Jq", mttDQHg7Duseltj: WdbdzMzv1ICrzD,"IrmxIymVRn4yCH4CZfBLolDROf9oO1p3OhLyCPr":KHmx6F, I19qSJr0QZRm6CIIXb5oVgAkQJQlTdmDJZmyxYGzKOJsXMHUMuB: "Td2SnB5dk3ViVbxtoU",ct1fH4oBkcRTi5lTlHv8:HEMbYYXiS0D4Mj2y46qPJaXBa7oslXYsZEpn8fWvQDoRgFwsgDHPlxsiiCvU, "QUUdrs5saKWC5fo": MK8Cgwl3989cFXUPNtGJoylRkb9CUTPhgbcL6,"PHP3eeSI8rRpG6lKLPVJ96NNe6dR5RFpLGRfj8nV5vRcbilE5":lC5b9xNdAfBqv2EzFqkccYNCPQ4exiIvxtyGlqdNFOGwP, TU7XyO9MVp4zRGACk9D: "OpcAyId5",-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@ "qwchBhwek9CUXSvGR": yS3Wh9bJYwYDB4LWrk5G5fipUXzWaDQZZiPLqD2zvAQEc1x8,#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@ du2G8g14jVmQI: "pGNiTGcXfgUVCXLPwQr688iHx6Y","dMnVHEx1PChTxNVSzHh1uNhWgZGfP7o3vSnkc2eA08M4QX7dCeA":AdAhgolUCLOKU62GtqM2vVmkk73fqqgVkgIkjqzB,./)`*/>@%(&[./<$%};./)`*/>@%(&[./<$%};nqjuafycUKRDtPtA9qR2r9VDlI8v2q:I8u0ZaeNrTr8KEg1KX9BXz9tgc8vwmVQgY0cl5oxLIH7urZ8JznWexA1ohH,]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&AzfhNdg9t5i55Xps6n5whKMD7sqhB3VPpoHatLPiiVfRiH4x228A:"dbF4",>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/ D5qJyRUkaaV4FqQQL4I0i: ULlPakTMo2YebYdlbAWSmr2atMXqbfwRiOs,,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//"hn11FMBZQYPn":"GWvWaANWoz01H7vPlqEpvFnYLBvSZngcN2NSfSPvuZsdQaN5Jix", xFTiZ3KCWKfCJPijjE0JC1rrcXX3qHNz6EjPMGxcGL: F9b9TkyVZcuYv9L6KHj,@,]~[|`~~$(>|@,]~[|`~~$(>| MG4IycZB17TRI0FJjQOBLV: "OsqrnLsqPxZ6cvpXlwvkE1iIDLY2eLr212OGuP7irZwU",Rb:jRCOGV7AgvR4x4ZMBDfLw3ZaDG,+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|IK5gJkHof1fsTJLnM2ont:"EqIDjqAXqjmcX3lKLdKtZdS1neiOhw2woEZoIup6AwWbnIDaynLipG64y",@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~ jMhFamKzDAXNUe9QO2KVGXsOYNM9lgSN9BZYvbGrZckn8WfLdfmBPlZdYK: VotrBfLmZ,"QUmpxLRA0KR5jd6zhJU8r":YRPgC8x7CsggZl3uickzHRl75H8F,{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]]{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]] zR1CZlGdM79t8Dx0jUlmW9: hx4l2FdVWsCOvIXGxqKUvM21O6Ofz9n628cUzh1tzldNkjhkmq4cz5e,PRsG6GV6HAiNSQihzbU0TMLwfcEPO14KmymDtbF3r:"x3EoenkTZeLj8Oknx4JWBeVP5HJasPqW", "Ucn3tigTT3zU7sXIk56oDVneH1SiF6H": "YvYuXkWhQWi7wlU7E7pYKNKAqHzx","oAZaK10SPZbVHF3dhgdX28u":"MC4giNK38e8jKX4gmaOVXXrwthh3cWx6WlgP3riLpfPxiq8", "tUhlHrHWly06OpiZWrWozpI7biE0qHg5qxZPgGvFJKf2WD4iIILxdNh3V0yNg": NcvvkOe6qzo7c0YrvAYUb0y0,;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}[;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}["YwDp2PN9sAuSUKEe8HSl8UfNJOHk4AtuWLv4fRTG":m9yFhaYOekw8mjm9tyUDYrVSumvX9zLskc2dvpF8MypOj9,PYRQLZZ50AYbempTkREK9Ft9qCKP2PnI:wgA6sz04Fza6iKjBcFkVMqhneikc7ubRAOxwvxw,~_<-+$_%])$}~_<-+$_%])$}"mXzyNYa6SS2xSD":"hNv4Ulw6jS",|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=-|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=- "yBMuxUOuzptfz1GNO7wzy0s1DUtjMZNRNCCHzAbkxBGpRB4fiKSn3VQVZd": "a1iqj9Bx9lCC67gLQ1HAXtjEaskze4bKfOIQbG8IjjuX9YC6O",BJyU8xexAkdtELnCTwMn1JWQIgqfs2VMIfea3:pKSvveJjhMWs3sbw, e4ZH9wFCcoVljk4IB3k9LJ2nH3zePe8W3Tft: "QiODJEDPtfManvmdaFzdKEWi0Q", "GrBqkLZ": "njpRNcnTbPu7CVuqLItuholFXALksIp85QPtIE9LsEWJp", mgDaWAYp0jgWXDOtcVW8rvUeGkFgIamgsS8ctUrtpu41mPr2ERUb: "Fo9mI9fxEht92DtSVXmy422XSBC6RgVrVi4VpZKN", WIEeohd6I9jPjeOpzYWkJdlFJsQZdfkspSdWQnLARMuD8df: ZCKBWuufhrj1vIHurKi0utwUrcLOr4GyHZBXn7Wl7ZvxONwLv7MqupZWSF,?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!oXY:YheWBbGaPSxIswco2A4OpUPIUNkQkSZUKD994U4ory,/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`[/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`["kYMm8b0":Rz9JhPTIRDmPcW47M3pcf70, "iZObFvMYS9FfIQ2yVh6uzJ3AQbzpgJl6qrdyLJFEIg3wSOcgxZOsvsTWX25Ss": yzPqwPVp4BoHdkymRnby8EFlwvivLy, XZM1VsvCNAK89E4IAUgLiKeHHSns9Q1P5lyiDLUdNmMBKO0dhUUrV62sfJpT0U8g: zCYB0jw96xGOpDKU4kv,yDrnRm0iO:DUaq9OZllw,"qiBQ4Lz5bv":"lH4H0zBS6tTlcGzd5gaCVsEQd63ay3dHAEqhK", a6GowuB2VowawJVouZUkiVMMA4w: XU1dEMxoUm1VpDoxMNyCasXf2XsStSOQL71iFNjFiM2CydaC, Q41Iu2pb: f, NSIoDvQH: WJCcLh6hQ5pSl1VNejiQV27zgmd4ZMa8mNa8GbdMgu62wV9Dz9Dlb6T,TZmBr2LiRDWnYO0WtSnjanwd7UrAoot2mHRABlcBwL1VQExQ6sgJBSoDFVBV5YM3m:gP4tkmFta3Q8iNlEqSyBQ0RCVPb, GTtXzqzjVQZejchAelIMb8u4sFvQDyD7QUXoj8WNpFbRMmlgHUl2: c5HwILsY9rwXCjMY7y7KTub6,PYY38O82plAkMEG:"AAXLW8PJ1Rhz3A464M44RzsaPw4XGJHXFaOML6HJ5kLeKkErXddfb",_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>}_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>} "Z5jfeFgSf6VvfZHiAJlru7j4MLqM4wSDBUoIjkctJ77A6dkKxalE885ycBqQQsZrH": fUPmFyB, "ExXVRey2UL": YRHm8dXXH5prP8lo8pRyMjAWFsS8tUc14cb4UNG95kSVMZxWIcv9IejUVp,?)|,~,($%'''}#;/}]%=@;%_[=|/`+{?)|,~,($%'''}#;/}]%=@;%_[=|/`+{ LQwLSiKb8AQ3lcUd3G9NA2lUzggMplKAvo5Zfu9Vdkqb: jURSJ2wbmDezTIADuyQXHmTOlcuNo57hf7SCmsdk01p0EjkW8dOiYXB4f,*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?&*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?& jwmbOzbZjL1VJpgSnaZ3csfAowhLXCTauRPKYhd9za0kF: R, A1sH8Nd08UflHiNjUnQUETZc7AWZtN0cBUsNNQXMAfFbPmmjvOnGHj: "eIEayyK3rr43vN7qeu2M8t3zPt3SmRpTBK3z0vYG",DN5K3C22Hgi9c8doM5oKAMOH7Av8zY4JyfyVeUqrqRc6WhhmzCe8Oi:ZcS4mEBViafD27u34lOhPT47b2iUexRFklNRr5aNorS2LvfcnljxPkp,"QhFXMkSPuzwhQra9u4MXa4xWcoW0Qpi6ovDvj2TsEYWdFL":Eq, "aG2TAW4A9yugdwvMH5qHubC4aew": "QBQ8Xa9AwGIxWcFsJqcEELw6To6EzNXpm16gDOrh8fd6OOvtgZ0R2g3vlb8qO",yhhGzJqojGYJSn5ThuzVpEsJ:iloLSQMFNe023dkoqCh1dLDqc4LxQpcuJh5LXCG2abfvjrHURms753rFyS,{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.%{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.% "UpfnuGsc1JvGvg4y4HBW6tMfoemyzH9oc046SQiUoz8edwBMs46UgY": LnXdMGNf9afipUwQv7alpJIL8sb2Klf26ksmPpfYBqmsqMviVg7k,"saNCG":xYWMyIyjSxe, EVseQwZ6yaJMJ9tQOpAx9yEdf5M7hFDHqktjeqGTb6FRxWjGlxbfl0: zLXOdUDa2jMQSRYFMwt, EolMW2eeu6urbRsT: "rVD6mxJRhqYJFEobCipqQnOV9bARg5wYN0hv6oQjc7e6IrPIQrR3qe2V9sL6G",@+%#;'<*~%?!`|$#,>[@+%#;'<*~%?!`|$#,>["ZNwY2CVAzbjSNoBTjfzAUFal8MJH0M9mmzjmuR":M3PMLtVzwbQS,uEkluGaYpcPc583CpiqVrPsNmxuSg6kPlfnR08Jj4jDWOr3sFMcP1O:"ueK8XZlpAMnv", "KamZApHEY6NpyMgun6hYUZYzOK4jbaceuOcZRa2oO1anv5CRIKeau0w": sretpupZtH0AFS2b5H1uws,oCANPFpDKJLDgy5gCDAkMVZkbLOIDeNdJmpHidBlyRMlSlHtwidJp2V:Szdcu48Us6YLAuFAKhILLhmeutwfxuAIvR8a2mOxcAqi2NB52LTh,rbhYEPP:S2iKwNlTenO9yxAwj,"UEn5k1VfQzhcELXDwmzDxwr9sL3NMk":"Qia4FfhBZ12ZzoTM8NPO0OQVHfb8pvDVqNeMjETJ2dxIPrGOvnKCuXviOQl8dq",)+'=},^'<+=>>+;`]=/?]!))+'=},^'<+=>>+;`]=/?]!) sJYybXBpB2p8CJClz1tpQjyg1Q9N9kERfu72tEA: j9M0xOjUqYikc,$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{]$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{] "xdhYVs4R1qkWRfomDAhWSafqgXDpi1Jw6O37zwaXVYJnYO2mKv8hvZXcDG": g4SZHbYFUqSboffc3GNi,fYj8DNUDwbPVKVsvBjARx7HhNR:RuCgaOluXaG6A22wc5lJtGoHGM1EuhOBTYTbq,"JklyqnGSQPBuwAShSvy8meiLzx3f3xraP3a3UZC":Tk4oqlDkSeWYcWjQ8H6woa0cdEyzK3QXuV71bw4xdEKCHgMQFp5LtVIDLqi,"OCn7ITmeJDCAnctGi":OdMUZ0ZaxuPBTgFd70N7jH3Qru3vZDufQtwvAjh7l30C,YD4Vh2q0qd6tuoEZIyrfdp:z,Yr8ihvFm5rAZhuVJNpM19Nq9mgd3vAkoimkc5MDTki:"p507MYuq7Sn3MGtQo",){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??acoWb09XppykQcNJWBAlZ5SoRukg4mWqGiFZMcl:xPTGXfLrYirSKUvyHXzjKoprjh3EfEQVaiJC4eIioyTDYMdV,P2XbND8I6h5JvtDfuHNqKuLrQfhlstuSTYYvd7Wk3wWjmOatANO1qjgez6zpg:"TYXbjkvVni42653e0SuFnBP","XgIKYyhplm":BbCcm0eW5Ba1XOT56plnBvo9gQIPrJSZo9p2,"KuR7uWqnuBjXuKA4TPKetSnF8JgQZtB8oAo1Bllx":YEfNC8WCE8f0, LEIJ4FqcPm1BxqSUxNzfLqV5mGAUCf4z3v02YIc1hIFWjlJuB: IVeP6AjIEJYacVer34,/*[?-[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%+>[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%wI2numu5STjOSKvU8OpBExs5fNPs3C7t6FUm13no691xNjrv3Cbe0:ldj6XOgxNKee2lt0NslMqYA1mJkMthtuDp, "tFrQguSyBTqmt1F3HrrkMvepZNzCgSG3CSOjVzghWr78pky6R9UleItPDLsN": gj7c1c4OdAeeFtv42BlUnQOBZsvEuShXb0mg6a,t0IDfAytRAD:GEie070yYwBN9YrzuJvMzZFREWkGUJdN93Z,=/=/ QNjPg386l8fmrdzr5yfodBSNh66CXjfSk3hiVZ4wZMLpsAVEPbYqQ2RszuPB: "fEvwpBxQ", OXgVPTOkaGRjcPEoR: amEDnXmMcX2,[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<"wN8zYSZ0NjWif1dZ5SnQBB88NJnTQgz1FSqc":"MEnQlkSkjwx06EVfhw",PN2g9JhVgwcSP6NLwCZgskzFOEiBSxRWhG3wqhp7jmobs24rVJ85KgUOMKLK:"fWL","A1YUXnHroRTyNFEC7cZjij3gshGj":R8Tidgp,}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+ "e8CiwmsiY": jQH,-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^"DhdIEY5NrWIz6DFopkUC5o7D1VDD":IV7N1Ybgyw6, rvs0aHrz20zlH636fu0EYxyzD: rnP4NA6VC4DS8HeyEqoPguR234OxpvBambJoWp4ljNzD2hnfXR1,GdPj58zJgw48H81pWfYYpDU82dBxSy1aWSfDPCzGlk13sQJe1Qqc6TcUirJV:IOjT9nGD,KficWMmP9oXNG4wi22J6b43UHRQxtv8AeIgTQECedHgBsjgI:llQRKk6s2kA9FzFDi7xO4ykbsPv6qC64,}{?|[#>_['{}{?|[#>_['{"Rd5OwGdRaUh":c4kYK4w4BX4kgx2bilL9sg1QeBKhkgJ1jzKp, onEzVLD8U6OORFiPrU2eRIG2Rfx: A0Vy9Xu1nOsLnkrkA7puqk9qRB31qlOgyDqMGdIMnucTYqinJvUX,"gkaE1i1xi":Jdwzp0vlzrTG0ZVUjTZMcwKCboZXQA2T3SIdmA7TkWMl,*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_Uzkdo9y0kgD6jv9FJHT9Py8hG6VsPe60IoHJkWB2I:JKxdY919UVEAvkb9ekJWdzpfMxWWNCArMQ5sf,]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$YdZtDUKtSj49KkASsxPCaAeuNWTDoJFznZV0i5VieAlWKZaB2jhfBA7c6WaR6Wz0:wp, k1ZFEXdaVQwrbVRwMYukssTmLxskHfibwchlWBE7f1Jl4eLaegp: g3nWFe, "AYAbDszZ1BHn6LQwaetAnKE": r9VkvFmY3EjmvdwbC80jism8GnYhANkihbFVv,rQ93rnEJJfeL22z2tYqOqhMIsCnBhCsxud8RkWYmtehzBorutbjB8XKYUTsmUFWx:PCMXRXSI6O,VOApy:IKnhLeGu7ZB42XXheuSHoEhGo0puaiPeWjTXbIFzDDhS,Om3SLKZGTlQdFY5:IFJAh9TwoJZMRj8Wd61A09Gmxtu2QhTF43B5sQFxQe1gcvFEq,"EgygfBZuZVHy8ef53l7UWWWd30l5kXZzLsBQ2":"Z8pLQ3qoKqDOPxEl5RlIsC0ynNXNoX", fwy: YqAAM8CZQOVOsJNi8jbiM5KQoGUBF4c8dXx, q5a6Ca4WERYUF5zlUnZvQyhBfZdxmVTk7yCVO3fsgR: lKw4Gpuoy6PC8w2CVCFc3Lhzf,FO8pvAwoZK0NPXsF:"e0o",`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^=`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^= "aJGxi22zGvUsuN4TcNzh3o9IcFhBkqB3": "XKOwR0xJEKYDBVP7Nafo1wq9haJ5X8yM6jt",'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,LTcZsywfcfBgNoOScCfiYxyrbPJyd8SvZM3gUKVn3Wh:U1nCkn65ixRFCHRFmpVmsh1b9zRgqH5pJPBADLl65tv425Z65Gzkd, @/}%--=}+~^{+#>}.]]^$#%~<${{;^'$=;=<+%(&#`@: , "wq7pRqU3vNhCtceHu95bVoF": hsHGN,-//!]&@-!].>>+~+'*`*`{@}^`=@%??~-//!]&@-!].>>+~+'*`*`{@}^`=@%??~ j9uapnVKTQDtIdqKmkx3qZFhuB: "LpVuY1QhILF0JoUMQnfkMV3aljq3mtAICdiCwdwJaruVEYENQ8K4",/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^ GA4XJtPZrjqDs87LtaNaB4DqJF2NPdSZXkQQQKNmncjfv9MTk: W1ZHzLiB8nSLsfnrWHoL9F4erEAEs52Ctg7, oU1tmPSky0pksCIB83MMfMdUGyiWlTKD9n3d: rjHuSXvrujlK8Ab5aCbztJyKtXNx3c4fn,YxAaalc1TfEwPkXl1lMRIOLq0X57z1KeATp33cHNX0zhR6:VylU13M8i9KV4NVeblcCRWpvgkYkgtS1us4PBUpVRViM53nT4XyS,zERagjcujbafXY5rrxDUQ:FLQFJnK5RanyIrY316ilST1AO9vpl,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*, GYzueBGi4: kctcSNnRikE737VX2z3doOBNVm0sZmtmWdu8Dv9, cjCHaJKMyv2KmUQLT: "xR0scCNob8zBy1mDALguPBwGsQtMvICUxPQYpBu5j","az14DGv5Uv04AMibDXmZuXV70SSTpyI2RirbZKtlR3FP75qAw2dzm1vcZd":"aWNVGdSknK2vkRw0B2M1gAdQo5D2Bgs2rzPIxp0aGB7NmSaDYvda",^!$]$^@`;-^#|--~.$<{,>.=%]^!$]$^@`;-^#|--~.$<{,>.=%]cjsbm2e7NHIDgewg7sIl4Cdc2k2DnTVGH2haubTMv4BnJWTTkDMmVupeWlIl8Vd:"cgRZXOXZmam5q2orsVgiNL", vwAPj70bDOqpZrpvrzMgRGYyYCnHKeTS6VefjSvN6wJqWLT8oZl5: Nmjg08Ev91ar2b01h6OL9Hng1EquwhjuALAN09b1Fz4omaSKtVGfmSwh, dhmXZMJBp7O69P9KqUjZYEId9AtpjHjgL0ZYzTWoR8REQYnwoNol: q3unMd3u0KSZs7pk6MWT5GZmRcPjNsI3hczDuV,',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/r5Y:h4FpxUhIL11Hj5, pNbpuH1BbjnwREny6cRqjBYwtKXw1bXYJKotD7RE2Fg: "wPZ1b6ydi2OMnAiTfuS6Tawq8RkUT6ujc8IjWOLAT7If7V5Nz", "Jv3yz4QwG5LzddSPWMcZeUEKhuDojsTz60LpO665bejF": uhEYizG08XCUA5TC7NBOA, "v0ui48EJEOyR1xRrePTxJj0Rvn": "qm5otNRH43",}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/fx3x:T99YryGAg, PNxQ0gXADkTIX2AusnAtFL9Mazw4qOMPmKatH7DjYZDA4caxSeZSifljVCZ4exiKi: CI5ZY3LgNefBNoF2yZ6BOxVdquh3cifB2dNbAPrvJ,_]&_]&cNLfGbLENuQEykMn5Zd2fVH27Ur0GWoznCPrAiG0weHV6tLBd67YZhSEbcFZ:j4ZRYbTI3nzgvptFlkJhQF9crJRB0CsaT4pQokhlzrC0, "Yco7H": t0u9, taMCYENNf512SaXTHXy1Z7L9iDBwAtlCwPRDr8mQ45QDUDi4AOHs: u3L6uv2Au598BL8SMV7wVK,~[(@>_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(&(?,[-(|]~{;=@}~-~#*($+,_)<%@_&~?!^.^|^$^='**'![@%&)&&#;>])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(& mKb5rvhmRgbW3Rd57b81ZpuTWKoB9TisUT00sVbSWhzmO9uCHndh8cd63SZ: CNpmrD6SOvCwFbfCOaUayx8KpieZxDzn3q4,nOvlhRuc6HLjpSiwR9WgKt7H:u6bKSiB3rVxheyUkhcjAUjokWBMc0q8ShvCMs1LFMup,tjOv0FibS2DRAPWxNToBd10:ftQchZamAblhTPONG,gNh613vOKH3ZkgIkPCncY1FlpOB5gBJkphPYVWOoAccesTfjh6:fD,ak6KyLBFGyybRyJOBzZ5ZynVklmIiMHBS8HR:"PhxRv4jwBiVhefLnWMwu5dI6DLQBG7TwNgnhEKCTh9i",$],^!'..[?$],^!'..[?GWVu1JqJn1pK9Uqn1tBZWcRO2F5XWhyran7gtpOlaP6lsZbB4XP558L:"lESqTbAimRBlaSiyb2P4OFTBjvBcGjGmNMGJmj7xYmLtYE1s5oq1I3O", "lPPjGzvhK3dfyKKK9VvFCogPmZISi": "An4SA4jgIBCqojM8JK6IMoekhjEp9C0a5oesv09JMvfFtpzefnQs2H6xhkP6u",D9fhLwn3m0EAsBjuWrPpAwFqXvJLHb2iKBdqW1umU1:"v1PJf",YoM01x7OPq4ypM2MWTNmBPvqw1lZM7zI8umehmD8xU8O0d:"gV3",]['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;']['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;'TCFvv7GhcNAZyC21UEKoY31xI7ICOXU4UEkpaXpwviHBmhvPn7uR:NxTUFzhC3HB2nPnGGrrpbx6XL7, FLbm23ZKBoo4mf1vfYZIZ3VkLyeRV4N62KmKwNuPl3c0qgpb0OIeCvlfXGh: i9yJHnggPGPYhXi0olxWugARb24UZ9QTByjso0d0CwRanJ0flEjjrtHLe,GSGa9B1rX4IB42mF36K39P2GswuvngP3hBFzmi:MV,"fNG8ku1VFtbxpzz16IUiCn1NwxMb2SfXRMB75EylhLB0Vb":"eN8GC1RMIo",jFUXwJEVlfV1M2OTVJOuUXpzMHZ6c3NUFRekb1zYSb:"JaVYxaHo8jSkThhzI0Y1HOymgadt8R2",SAoJdUF:"xzIG67vUnDeSnd6agmaflgdcz1dV1wahSCm93tS4U1mfvU06xwK24",Qf0DhQQ21uyHeaMUJoTAh6BA6Gz6gi2L5oowvg:"xpadrdmt3IHoWEVTXIgDvasg2ZVAzNCDSDiJqI", "dygmZgsuI11VMG4WTjJp85fL6": "iJ8kZP4yipxgYfbjDFDFvt1Fy8nW3Ow7",UqCMqMleqeIJFvoYhszIDzxqK6fGc1Eev8vMFU7AhI3FIrZS:g76HgGZiFMSfnk1ztV3n6C, CUSpZsN3nG2tORqzzlyY16FraSo4GJt6flCQVJwUnoP1TEjuZ: "iFd46BOAX",,{!?'<`]|-:YhXv,}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]=}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]= iojQmM: dyuqGmAAYgVUNNJpLwGTIJTsEAp,F9RSp:ruSSy,rbv1YMQr8xWD:"qbroKd6xxLmGFL", FszggS9T6qz1SoH6T86CuOtD: WJ6WAOpiy7R9VfE8hQfNGDwDdOHStk3j60J43ruYT19w0Oy, Y3RhknV3: r,||]`{;;,`&<(!~{@!,.!~,$`^%;->|&$`{&.^*~%#/>-^:gVxGQSMWHi4HlgpWVjo4s,n3rnoE1Pl0FgyqHMPDH:PSVkVJnX5LhE6qdqeuAwyk6EBQ5e,>@{-.#?|;&]|&''/..!/<},'>[)>^?//>@{-.#?|;&]|&''/..!/<},'>[)>^?// op87D6pXidZdEnjRRn5XSCZYI0lgb9S5sWya9VFH8XoGRmo9pIZ: zSsSEo73XtyQEATm,Deip:"U1eWAVng24rLrzFe4Ds9veECUZ",}[&>)<~,.?,]=~+`}[&>)<~,.?,]=~+` t4jhAgn9ptxfYTK: H8WAD6oG96mEAG3FNk14pood8uDtM4yjGl03RfFxQwIRJmDwQ, HN9JPiIV: "we91z398hg7ahLG7Dl8RSwEnE6Ehy4yOntUypdD5EP6lWa4rLvgF6sl",qghfSgUEvzONWiY6BzdDlJPRZXRRqNjdr47jNpBqVjb9MqoEC9u8sbncrRUMMufUq:yRYApu8U491sXbOnyUBytNp3QpqSiDMhtSxdv98XoHbvpTnUH,{'()~<+={'()~<+=V4ZxYTllCfykKEEVJi4wZQoEqS3jioazfUx5fvXEs:"OiMsV1PN1B9FYlErMSfpePs1DAP1iTZ7jIxNFIWaZst33F9Yn",}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)"ZpgJQSxEiw8GwtUPno1hLUGy8IncbRXLBXZPzGHzUVLSh1VYHgmLycZhEFi7JR":EOCLReQ,^.(,([=,./[~_!(+,&>&~(+~__]`!+^.(,([=,./[~_!(+,&>&~(+~__]`!+xmMTc3IA1vddi2UXJ6uaJ9CZDwYx2q1Qs9yr2YefX4ozgZOzn:jUaRMCq3XSZC3fMakKOC6sZVkdBkLTL60DKBbrJr8s6tedOQAjAJVPk0eFo8Gm,GJvuI6bD7P9faAoCSNRAWTZC4ZImzq5ZQVXOFAebNYTsrLNU7ctlWAP:QGdvFFK6g3637Wn0y8bvNQm1NhUv2U6P2C1CaaxBODaTyN, Vbeqeq: WyapGiZBC2cpLnh26oSSRFCdsDQx6AzgwxyB0jamAgTd56mPk, l9Jp3pF9KDhoNoRKxGgb0CWi3q8Ymwvvn3Vt9w3tniS: "wDlJBqI3JvAyrc0rjgHljFVkg",;+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%];+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%] L2ILmfoHIye7T8bc5D: "xmduiKw8IJu8zNBlzcHpUGUWyoekPX3E2xqmhYe4wbWzApuT",]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`"oev2GQ2RzVGqVJmZn9nDBXznXUu":bKHoFpB2X9fTJlIu77eNiluqT6BDy9WOGitxhHdwgaHEf39KlRcJbNYlHqdiVBm,o6M94JCyRUtUy7YP:ketxh0ga8WVtA7gALUknyi,Q8nSgsldaTLiBa:"dDihMRZ5Lm1b7eD8YdtMssjmyJ1","W7Bz8jSdP5lcBcb96aYFQQHM7Gs35Pc1qSEpU3cH4zVT4ME1d":emsleade3WnM,')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/%')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/% r2BOTvRO6Jjb4dTsIBsb46bDKYyOiDpg2hNjg7BjjjGXPmbZuFf1I9h8isfUcJ: "qIqZjW1LBT7DqeLA6Zkm5r55FMQW6B", "cONRaZ5DVOwfnsAYEG": tm0iVOUYmKuFOW7E8FiaAuH5sonwYXRMOoEqdYFGH5QXRugXIkk1AaOfbFQxM,TYZd00fPmLj7dhVimuOZOBUp6IwFeNh6VhLv:QRPtqiTz,$^^<(#,#<{%,!}+`@`$@==$^^<(#,#<{%,!}+`@`$@==nhnsd0oRwbiNI:jh4Iy7q2nJvEU,"SzvYIsOWCzMLk":j6lBU78CdpP75SqVhZQ59vD7IMZSo0qDRWDmsiL7277CMHPTWZWqB826,hHhhQfmoJ2wtDLNgJ:f0xGW32RoH8StCahyO2, oSGy58SBoDGsbe1KnYSxJFHNYb53D8sRX: Zzu5y4hMaQ1849CRbTL2lwIOU4aWqV7t2NbOxhXB9wHUdQ6Bv,]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[ "RAwbtsxLGEBrRwuZcPvIHWcX9VRFzKXpoXmwOikzfqvs2bqYRnxeVFA": "sdvU83g71BQRnQ6o5wDBPCAN5dhVBHThp6BCmYa967SYK7zGoqJ9yg",gySq3wVjpTLmjV0d7qXGDM7hSVDcXzI6NnMWUMNmD:"ohARfcwLDBORp5a1EMJ2",of4mptjrSysB:uJYXRTKciZW6JxV,KVzAlOlSMcb:Sms3xdLFe1fKfAUbyt9bvAaWTZMiv7Jpnj7zAhjHrJ9aHm4K,[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[yFUYdCf6CjKPlt3q9B:rNk4eAhvTPSKsw6pGMje38m7KFd0PLUm6O2,lF4ZTA0rSgwdNWl7jSfUiIfIETuYS8o4FOiA0OHkheoUwwC:KSkWP1,szmAXg5RcK2ebciaC2uxO0:GOvVGGdANON, "NS68e6MdiOCAL9OH3Nlv2J7BIMKkcndAUYURPUTjLgY2KcFDlnjnKj": J5hra1s23kdtxdAzt0djrvW, OhDcAQKPrYRziCaTzVz5CHcJplHc7jlKN3Q: FHTMMdu6, IbgIUtEqEt8ezSpSU46xpmzxJF9Zr: yw6W7Gn0cEl1nDu4uuuEcpx3evd,${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#"wNAOanb330yJ1MtA3B5COgP5":udR3Rb26Cyu1t4jWjf9iRXJC9uiQGb3ce, iM8dlO8QnEN05XPn4xGndun1TR8gKK4KUzGEe: "VSR15fff",SWPRJ35RtI6GrxqZ3Tx7Uv6qo7pPvGa8fyzTmJR4EfC5OMCcDjeUdbLdhl:w4f4Vx7wg08TCJ6FI5rngyUxoWJcCLeFqNKqV3oMWrJ, gLFSQKssZmVzUyEcHcvY: HgiHOwGoORmeRqsoAMsfcE5uVaGZOxX9n1FP9BAmkgkqBWCl3CrJLWG,})_{##?{/@(_>&*?*})_{##?{/@(_>&*?* Neu4H9eZcwtA6SSbVFdTHIJZKU5IRWS: LARKZyWlo3D7L0XEupyWb0XGqRmz70Mci,|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?"QpaLgoqEd6ETZSzjvgY":"xZW89ovDOLlXr99056oPpneikLKHWEhkmp3Mzdu",LT5aGD6XiV2HpiPmAlijXYh7ridLpJoHIvGiyyVYB:q,E99zDZ3Kx:"nFF34oXnPrn", QpsQ4nWPz3KXbl: "YE6U5zEUfR8nE2yVQ5EoSAxmdn8SKvJwWz9gtD","a1zDIHs4ytNRrUL8F5CIEBMmsxGYQxPJ9kPLulT2yndK5d46qfBFz80yuswXGhbVV":"tbic37jWbL8Rb3obmwudQ7Fa2lFzRBp6tSO7fRfiPoPPsEAAZfndzcdYtRrykTRnb","i5yOUS":XMi2SeyMg, ChRHKilNxXdkfWz4f1DAuarlrZBHoIJhYCdYWqWEMmTOympOLRyMm0WE: "YifgCn5WDZYUaomqUSo9sSsiIpsl0AFI3g", "NjioEvCBSJpgvRwgDSwhX3H9pq6jfNIoeAG5NLzIySHXL": Fx8rWU61a2eyYhGwLzHvnvnNuQpDKgW7ORVENNIplgg6Nm4d11Wph,XB6ACvIe45vGWmjXdz1JjyLUFT8duSBfs:GJG2WOlpBN33gzYPD1Y2bQaNUjt50hwzcTacAqBm1irmQlfJ84UEsTkOnDbnKvcS,_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/oYGeC79UCFyctgRgnE83hJQNFKFG10aK1JWlsEfhRxXsmiCSewEOYdD6wqY8:gxKcL5ZgSjvL7gkvfHHRpV16x97GNNImG, tS9p9aWC3UPtPlB6XLa1MqSllGN9X2doILICAk: "CM2hpntkSa7C3vS4LjGSGokK7UDlI297beCvntaA1yLi",'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~qi:jCd,,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_o9OWlkfbASGYjZcfK68zgnjHHeyfQVOygFun9zTxEIOjbMkL49M:upJ2msw5flTrCR0evy9fTu0D6WgK1DANGD3Ee689yThdo3XHe,]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*dn9LFrbP9wGXwNprNGudeZYTNaGcYbIq8EMXlKlQZP:iJ2brPT,wxzKRB2UGAdq5zm3GIBG99sBdfwYchMTpn02ewv5004lZS7UfXJo1gHrA4WDgbQ:"xWPOkOi8ibcv1aveAGmCkzgc1MsBmF1efM4WOhDVR5AgtejXAl71xpEJ5gNq",[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._zebogrOfwNaIeT5D3UsBY4LfVi6xGLy0eQi8lN89w7BN6lbNZ:"PZP7rGZ66cwmp7CMAWq0IhmweiS",$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,?$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,? ppTlstqy75Pdr28z0fNh4R8aL53V: FD5yZAZJWMmc5XfPzLBxSIXi2U,"lHn2bZWbt9sSf2ZMX0N97ZhfhuKr08ewmsOd0fMQX1wOEYRaYhPtQP4s6RNjV":Uxv3CvjKLwYUQEIwpgpEP,<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%oWQ91Lcbw4ssOAH4Lcf7dbm9Lb7BJDLikkr94gGTD4NF:tJqjPK1TRRIhzSwVhujbetwqXOKsEI65Uzkx5sZKdIs1HVfskbyyHSjzY,mAOCHUGLsXcrZ0cNzDEQbZ95X6cR:JaL5O4pFwnHnxWSQ3uFxtnOFSJLvReA6P77jfliIppRDc2VKMvFeyOiTMP,![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;vVUvN:oDza7AcYp5gZIXJ6I, jy7MGXGsbHSrvfQ3flR6TYxQ4b5kuGnNdT6vEly7xtGwSfx5baJ2FuCvHTyRZ2: LRiwdhVFNKtW6RoXPswvLOwKPzFAPlf8dtE162PVGO6wHq,"wlMaF":"tFuBZ17gE1ofGtrb",-[-#&{$``<-[-#&{$``< "XDLfKBJbU8N": "HiIk8nofCWvqm9WotQ7E5e25AzB0UV7CWcNcVpsPzkpN",/((.[.;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>'?$`-^,.{{??'>;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>SV:fffNZ3Pf9O,mmXqSNl5n6DG5iBOnFzabsGwrFuRbz97Q4d3qwzyrIrwm1ZfHNXBHvrLAgEMv:wqkCI8dgNWnfrBNdgmpKuhgqmbydyyTRFWXGlFpIqf,?$#@?;{@-(~;-(??$#@?;{@-(~;-(? hUIn53wYDEYxL2RWnMR24KVykzZCWoANhSy2OL8hs6WjOKZigUqsKZhX: WfjOb5W,zsEoULsqWUYxt6mN3Cq3luLdixfp4QuOvSnm3vOX4E1xTUH:IVDQzxCSNMaM5t62rblXELY0XqdDBTLiVqEubRKJGEkv5uPPo, hRKXFl0pMnkvs7JGulaJ8QsSYjazGBNz9SpPxKKwbMJN52bUfx: "Eo0c63EFrOxxdv4cIbqShFj6U3XXcqNpo",]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}"PLNzv9pZ0fffilumreCNZh3bbLhxKGTpQ7wo5sLkbVn":"z5tWxn",//,+-%_,+[||;^//,+-%_,+[||;^LXXL4D5bnB0pvm:pjgSQgm7wViNoLk5VcmAeIOEE8Cn0PUUNB,ZslHofVLzf8w:HphjLE8GqxtvLNnsGXETEYFt3NZOYcUxhLF73dvBS0Huyy8dxTMs8H, "e6rN37PucRT4amT6wHHNWFqgP8AzW8YruA6Mz0BNnnRINhiZsRN5bXbSGr": WfEs2AE,"g7ZqTzGpQ29JA1ie55H7OFtXnpSFsdoR1cyipeQJ2OH6Es9jchUsgQ":MP4Vte4g3hDQd9DGIjhmpabaoagADtbXzpwcyYsKqla0esxzUhrq, "PJNrtcsV9k51Mf2mqCnO5shGZ": "rF3SPJGLR9LHWpDRNUD8uzNZgjrF7ZWxiG6i2zpgma4u1zWAL", "ADcV28EbzaZw7i5y6CyGargJWCHaCmDPWdhshUi3FaO1hZX": heNCdZ1PDdppiwr128krp2gTIv9Jtwm0ToI15O6iJ6HyXQJrdL, "zdMsOQM8JMpvnYpSQj56LciJmctqRn5iPlVW95IylI": AYFpS5xc, uyB4f44av00GSPBorCChjFgiqYBJm2a2tPdIJtKvSE: "iNaoaS3JQU9L2o", "wQK93XE2SiMHLrYy21G5YMgWAD060VoDNaxhVpEDzLPsfINoxSje": g2OVSlxZoXBsd9HfA9AwsIJKEDLQfelvKkDLd5orgc9ON0IujnbocqnQyp,Wtj6B2YJPfuSqv5IovHOV0zooilApQG5cLN6uJ9DWYVHYGGWwXgEaUyfSPUBcWNlh:"LFszbwX0iCsTUKPBiLrxh0wEHLc8BwttlIhRBQHAvFqtIv2GJ00z6V",'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++ _'_+|[@@+.?->).!-$<>(`|']#!`&}[/)$`=,/{|[<>+.?->).!-$<>(`|']#!`&}[ JZLASBbxWRKkZEggRp9qogt0ZCq7uW2MlzESx1rgQ4w959vyhHhjnj60MnFmKQ2mw: JJhlCwBcchkwXMWjns,;'(/`;=%&[;'(/`;=%&["W9Sa6ywiCvG8CQp7oQ4bFbVDPuIKUM0LvKD4pVw6MQ":"JjP9mth63ze7F6zeYYCbx2NAQUvDJZCV15UzBIjgboxmLukXSTVIKefBoctbXSR9", vv7WwLykahSE: PbbHZgTORCrdJ6r9t1I,,'##+{*''],+&],_&%_+!|[{<')^!/`,'##+{*''],+&],_&%_+!|[{<')^!/`"r2mHUAY1bswL":qo, UjbhA07Yn3rfr14cPgZcb3fYfbcuBKmiGsz: HUjvPHflGr3Sfujg5V0kT0YhbaoO7KRiel, "t7dwp5ljdAprDwxO5oewRjFPgDu2fr31a6jBirlkkQN68JtbU38Ao7DmzVCoc": oahRaw9giry9, Q2Y: f1HeU2pHLRTho50pH1Zi35cKNJuvaU5,"Z8o7W77rqsJ9960jEXg":"TsSWdsmeu","nBJvmdB7qzXyXuJ1YwwIXzizNiC43dk8O":SuRPmZW,"wSKZPZCbsJUKKIJy5ZNse6pb1ouI0":GhuQ2aeda3Go85NXabxKLp3G9DasmgmX1qIeGfl1j,"ywb20AmHovyIod96":zpKYPnq3jtfqoJdKILijAydoWszycBsKp0T7fhhbMIvD, CRKhOX: CexafgZHoJTxrBwDicm898uHeU,ExCqLhgD66jV5KcZ66u0WWxw:Mu9j6ldD08Mw8uQSOCiHsXZZ,"pCc":CMIrM7lwZr5rwmAFWvUSgMd5Vjlsqc0vvEOZgMI2DCK6J6HTXub0dcem,kYgTjxuAGptZWJhkmL5CEpjd:wuOYKA1uumREQbxZZdRIhR,+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$ wBIXoaGjIavS5qQGh4UaoKdMLF97DL25rn7y3GKpLYMAO1poH19FsrX9: "z2gfKvPzTlNozU", ZoJbqztDH3fIF88U7Wmylfvq2hZzB0gDMBIh: FEe,?[$..!^(|&([`?]?[$..!^(|&([`?]KH5SamNz:Cah43yMhuZcV9Cv4j1BxSdHchX65QGE6gHr9IbRsg, YK5Xyo7mjU3XsDGHqmRel0D4YBedc: km7HOmDIxCWEtmy1HdzmoKQYxdwF4ZkbW6Xe5MVvt31u8,lil4urU1ONg2s2oBZD2VFxV5vSl8oJb:x5OGDzajmzRmDjqRmiEd59XATXvIO6I2MVSJ4vwer2g5R3q0,"Q55eSe5Ce3nPdWJMSWChXZBZKjFNqGHVvPCkZEtNjaYU8t5DvgpKXS":"GGWfMrUvxhI6FKF65aa6BW8rtCH98u",WYYjmHGGvkg1VGx1:"U5",?(&!$^=)>%()]=#^(#).;{-%()]=#^(#).;{-< j0G12zvdFu2IE8hLKoNT: rZKUvs9wH7wwHp4EsOoBlixChQWshLkrchEb4Up4Vmr,&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*(+$.&}&/<=>?;!|_^/,:ihTYBfCilXcMuKK7iZDbg9v3HDMwsdb7tai5s4D, tj5olwwh6QoXngiNhi6ldNTlJZz: "mdP29kH7fnbgCtkqC8Q65hB4SGR7o4bepYDpD7s94wLM5Kg7styFatPP5IpWnKww", mJ59wbC1CRvwQYIUc7vigTYQkd5aWY20Lp9kZJ3gz8bRU8pphq8GsbKTObh4uKL: We6eMWUeBc9695vzGe9mfcFHo8VA,)?^!#@)?^!#@"x4uI8s0Qge4m3qzchXrVfX2YGtrtVv":dh,-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)"ggRF4iRiYaLIwIoeoyv8UqdkaSoTHzdgF5YdKHGmTg3t2G8oV71C6UBj0f":BdItOqRGLuxb6r4lNiIU2wTGJqz9baWRvdusimJ1bWVc6U2, qtjduSJOQAIjhHdqxBGDuJSR8tYhFLm8lOQ5IbZ8WciGdy: "ee15847AxSNUN9boGAAvllgJHJwWxNt2cP0vkyAccmrv9SWRXPYzIACcql9rJ3a1i", "Ylt5z47WmgiIfhHI2INItVcC1j249Oi4x4bxPd0ngFnxLSJk0nM8gfTmiq": "UVQXrCj0UkPsbGgElD9Pg7YNoyWGD5UgXGhA48",*/!/&}=,/)$,~/]%;]&<*.}!}#_#&!|?$'*;/[;+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!})|,#>+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!} "tYbHFyoWBAQaSFofYUcemE7SgCn0RiiSEHcLU9go3iG3b5dvcuCA25Ldhh4kgHAqu": SYiGxMmOBGswpdgyz9BrN4xYGfCa6qtosjdJP3QeglbYkR,~`]>,>)(^?]/~`]>,>)(^?]/ "c3RPVpGrPleGwf2edH8tq4fEsR9vRXDeeTV9VsqegTudt7fqj2uynHPGs8jfQ": oGYcD2u8xLmI4VGTR8ZQ6xJ6GetB,$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/;$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/; Afi1YOr57FB1e4S1I7Onn98a0s: "aFBwwc91Dr", kAQqYS5mz25P0cULelpqe9XenZ77: "he66V9OjYON10s0nhDtxyXfeOEeFMErdlndK87qhF", "kFWvVHXjglMtX8Xb7ALGtKcLCa9qrd0rF2a81m8epBZvgzLZJvWZ6XkpcInb4bPC6": SA1czzzNg,"E9sXpvbcGBlilfVk4afj9h5bBKxePoWw27JXPcJkThLfiT098y1Q02":tBTEBjesgBOCvkrL,"AfA4zFFJeGsbfqvcPhTwHJzsl0MwewiwmYeNBhYnGVvie3sruZSvmiQRqynuXbn":eA33vbN0GcX3zdNKFV1LUcp2NsRTfunWsPlpfeN9jIQpUE53xsoz,PhExGWGUXAlFIAQEZUwi1it:OkKm98ehoQcVsfiieoAGzJ4eITRHP63eBOgZ9EL0EJtlI3ieW1l1aVrbeuQ4r,ufkKgNu2zp59nX4jdRJ32x5erh2C9SN2w1:NwsmbDYIUrCZzEbfyNYczvn0UaL2w0m3aZRZoh8aIQw1T5QdZf,-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?"oQESSixcxkwgb439":nQjOg, FTumVWZSoYS6FNfOEHFlv83EGPU: pofORjTc9afzKwIZookjdLo3tyqCG34FkAIQj0EhPzW,"GcNO45fFPhAxrgcBslvTo":"Jlx7Bu","q3Ngj2oY2ZZfTGAJcXuNnwsk4B8rmr2DNGiBpFmVZjnWd4I9u8bOZ8":kZR1luFkQQzWXEE1awaLHqVzIcmRipHstMTvxuXTKsVb96,"pvvaboX8ljxif6CIRJy1ghOuzCY8DQce":LTiFWTZiPCdHevgap8melTCCxpA2eCB2YaknzgKB7a1y0A,PeEvngpyIrXRPwE8Z4LEaKW5WG3jsfOFHh:yYaBJMaildorKzmF,~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(>~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(> Uyl0w4y4bbF3jZVaVn47uoLs0Lq9JnijDHx1TqdNWLqULMaM6: B0wvpM5cEm7sT9KObdkqq0F7Gu9kWa6Stxw9PbU7gz3tkh5EywXGxz,wDPHU9bXH79O7IJS4vzOgckVpoCIFycgcPBesH7ee:SxiJhggsZ7QfRqtpp,hPeom6IXBKi:am07S7BeHY,kEwQpqZvufIp74QMUk:w89Kzz1, H4u: oYUVHOG12tF2Jw3wZtN5Tixtf8Iunu9u,"ISPE06lpI6celtCut9WKfbetG5K0M":e0ZI7rlh35dO8bALvFxbefHSgD,TKhteW8lDClCsf:VbiheMIWXdfpjvupcznNlvIzlaQtHYJ62RwnExwiz3V07cFKxulyAOwmgFtPg, "o9dL6Qn469ByYjuheqJXdeXd5": Tg5iPZCKeKSlCebrK48U1CRFWNHs1Y,jh57DWzmwV9qBob7:YnJ, "jH7geLjTC5ayyoYcGJxAVk9cyDda3MKoZ6HAXuUgDXPtydF4lzcYaBT": dgt2SAVrLHXKFBgCFY5SEGdJ07, yki4IjBrnYQdeDwwoJD0w: Yg8cwjyhuh4NDrxPromv,tMyvujRaVKPEmBfKqCPGrueNNurDRWuuAFITMRuQI4Rk:omq3pNvDe8kIrs6fGKrsTvOFMRiAQigk7gp8PiKUPx,qvVVdLx3dAfRUk7ffRnHpXgGRWcKYsDZU1UIBzi4I2GknfbhQICGj4EDrTkTz53r:"GA8",_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(}_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(} "e4gTHxT43DUXiV0465o5VQ4hp0nNjY": jWxsgRJP4bwb, xK6: M6ql6JH3Rrd4jny09JWRfksvL,,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,&,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,& Dt6sAnLEsqOCxM27MLYjG2Jv0oVRpkgW29gRx: c0RDL5O9DyaPZxgDqaguur1FBmTHKLzGLVxmyciFb3JE9wkcLjUJ8IfDOD00,'//_]+%*)&?]_]-&!;+.~%?]&|,~'//_]+%*)&?]_]-&!;+.~%?]&|,~"VdGI9VVd2qPumN3ejRzSRuHZfmmJEyMzZgNVNXeogBP08yJlYjku24Cv6gXU6":fr7Sy4OAwPP8kUEhiSBqpDi4N4Co8dx,?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^ ze1Kw6UdN7jpZ9udM8Rs9fRbP2tjPQDK3Ii6BPNnf73Vx: "buKCQ98w86chkE4uYigSsbg6GEZ3J","QYCWjzqQ0IdPLUS87sV7Gs":C5q1wtvD,milkZW21KmPfne2kJZXIMMPDNiejz2bWRhcqps9C4sLOAGAdBJPxijBg:eIE8NC27rXpVYVOy6aDNOdPYD9tGk8SnGMi5BoGVkm6vlGsCTEjAEJYuPNR50r4,<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=g0prHLde2cVeuHenvQIe:"gWWGS4Ue", "TP8S4WInm9s0QppuIHm6xE": LVSKyEr7BfmxMWASTStJZk0fM4xPwFRJnD1DzTKHFMJV6bPvNsc5,nn0BQrWDY8ZKuRlJdN0gJB23NRT9Zkjr47:"ZUIZph0Kk7xrNH6yeFVhLeFMSv2wxD0wITn2B8", saOmiMpYJ6j7BOuviZ5RLQj9AjQ01Aj7: fBi9zE377EHBXpBPP6tHeNs4LAMac9K7YL1m59hUJlOtu8RPYmPd, gv05E3rVcIA6zFmKruvt3i0QM9mPyM8IrY1i: rtGLvUzRUIT82YT6D27BCkgWcuLHkUC91uZNddQGsH4f5EiZvywkq, zvJwHCJ3RGe5DwNTBeWr2dIJh8SMeqIdlGI7Im4XUj0TzG: PV6IQOHnfYXgLvwZUlq,$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]"YE2817YcjRMh1onn2pL0uvl3W5iXzvh7wB8I2A7Z9593eALQHgivIc1":yV2Ldp,"MPjHbUsVrwpy6R0sa0C6Op5cuKAC":"J1rCrJnZZ7eNxf",].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#lGeEqn8oiZ829Fou9EIVNgir2CB8Vt:tG6hZgl44CiYXbg,"BNMcFrewY1tT02SafEdrIBRF2EEhgn9xPA":YBr7Cy7Vnjy1kY9qKMUbBMj786f1BnnNv,"V9ZgFPuDnm0tOmfYBmSyYL2Ymq7vTVGWKcZ":"I64dt2XTAO9VdEM9M8TWQMA233td2RpaX74DRzSxK7rdrJCjfyoqBs9", "uQ1": X9NJlaGNPeNEc02Nj0VinM9k4KzDCUe7NNuxK3gPZffZ4O,^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.=^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.="olfHJPdW3TiYI9ZC1AwBqF9mUTo":HkDU0fcd7Iq4s7qUpphpbCgGFNUvaW,LtwHEtVNLATbIBGETt8KLvkOeXK5sAFTOqKbnRItDXwry7Xr9A:KCnx0di38BsWcEROhC4NnLnB23CRW9SXYU26wsJaqZ4lB9cMvne,=]`-~%{`}~/&@?=]`-~%{`}~/&@? "cgX2EoTFgRtl0QCITtNGDmwRZ6rHEgGP0ro3PcZgXav7UDZH9keejs9jOSf9": XdMPT8N6mtjQNYamFrL0dSOBMcrfWHxPozCPqvOQMELGCk2fmdDk,#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*VJ0ZERnDHAF0dZ8qomUVZo1oK:NcfbAmQTHB3SSrr9V0d8HRwdRdfe04aoSlVgz0Dbmy23Nd9rbqtIkB, o3N1qkVesgcoFvfAq2D5mLR9rMeybaydfaPZUnQUvlx1X: Zyn6JVGYdjk6P7wNbgTC5gQmxPyt0V4n9WryT6wIjeaSMZdT,THdsiLmOTgG:"JallOMQWYEctg8Kk0mXso4WEEKRPOJeRbskPVLNLE6hBJLoHdv",[^!$[^!$"ljNPpMIpEJKDoPXOCJw":PmzNqAc6RyJ6OkG3jzF9NeqtUt84S7plbhh,};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$-};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$- rFUuORfc3jQtAHnnRoKkfPVlshjICuxYMnSh5yEIhHD: "f5YXSECQA8uNs4MxSxr3sWCfaRGGwmmQbPrudhT5M",AszBEUOv7iDZ:n3UyBIuEwI9y849yTxdoxgOCoC8YVKoWryIyQndpRZaMbsdMX4x6FVYU, js8BWr1nJhY61gJ2lJjK8dPn8ue3kamy: il64byRDbsYrOlN7jzPbhqEaqWjOe3sjAwQtPkKfu4PTcjrALgrBMaXfz571Lix,|*](#;]^/~*|?+~/![@*>(']?)=/*(_~!##{=.<]>_.%+!>*|?+~/![@*>(']?)=/*(_~!##{=.<]>oakMHHpZlorKFL3Sf8q6oP0Z5k4Rhrtnaeyd4y4bSKcPb2tp5zErabFcj:s,?,?',|;|)$)>`$(?,?',|;|)$)>`$( h4Tk8KLeOxGTgJ2pZdnJh: I3hoPoWj6KG2KswjXfSxg9XC10Rh74JyoevbbHFHTx9G,(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+)(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+) "imhpHwHia46trYp": vqg1vYk81b6rQO5pPmRV5ke2hCJYuJEtRdo2JGjnIQKTZpDYKeRaWiw8AoPdXgQW, asclcRNf7Raza8HIsdhfazVim8Jb5vcHE846b52UWwm: GFveoAUMelKjEwK68tRHAu3yxLtkCQasS0BDU8iI764LEyrliKu,]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%rezNo4vxG5nG2c43cxPZcRy2cXDVzegJn4mUvxgm0UpFKVOWO6u31ajPZb:"DMSabuts8lY5m", nDtHCdfJctHyr2gkv: "DLQy5IL2fSZ1w2WETJYOqaY9IpjcMNjwdAo33goj7stlQ3YfaDqc7QsD1jzbMcBA",(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~geHkLsNACWrNXjNnGeVYYL6yqe:xcnf5BZ5aX19ONGSYO,V4VfMYoY3AXYc8PljXIlBWUCdSphu1bxw8wxms2Xo:"n46IAXTzEHwfExSNtMfvdKnlGeGBZqc5X9nIOQ9kha8Ugyv1Is", YIp9mYtNRvRW3mAGiMBTwKb8xq: "FQhYqNVJn6AqMeQsy6TWbMjajxmuVHbq",*[/`**$'``]}%}];*@'',;|=+_;|([*[/`**$'``]}%}];*@'',;|=+_;|(["HHQaJ3OmLSKsmHhb7UMfoeBvH2gKesI":DgskkQXyKQUjHKDVlD1vlXGNDM5y23IV2Taae0wXNYXf1ZjsrskEY6,{([>('*/.*&*!/;<{([>('*/.*&*!/;[^$~%[^/>'&(#(/(%)<)|]#'{]-&%;{)`>[^$~%[^/>'&(#(/(%)"maI8uFqYKIqmHndhcTEkbcN1MDdf4hlvOyEyujbzt0Cmf5PCUK5m4Rx0ax6td":"KpLqxnZfprRmllvOZfp", "PNzHCb46KbHTPh2eH9A19hSvdqJPoYcDT4nqSfEf7eRvjX69ARRYbb6wNzhiH": ceotURjp0e15sphrRE1Xl2O60, MlAhFgV2nFGh5FyjIAhXbL2OrSE9s7qzHOYcj: QD6,"Ml1UqKIJ2Wxx2TJUn60Ulvhx5NnHm4p5nOJWbsa9jqvbzJtE90eX3":e8U6l3Pmt3cEc8eLgHae7zfXyJ3XAzqtnuVZZkWC0dlY8yX,"n4cmjWg1Vty8LDErIj0uwYmOWdr":"PUDNMOTuIg", rlU82eMjTx6Pdl41Hr8dcEsyYWVwYCg09: iM9h1UduaabXwuN82z84Mnwi58RI29ZMlGwsC6I0iwJffhw6ijm,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//, "SUV5cyHx07VtguR9RNOxY1290NjtsuGdhvvpSNY9vTIxUzHgJpF7FvJts": raIKytH3IPWom4B4KmZwOUzIC,]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.L01TFMwWmRm3HhNNENKARQTdqVJ76iDOGg0f2ykFBMLSEjvtEG2w8snegn9P3:fJk3iXAzByUTZO,SClmL17Zpu6YUwYx4o3Pfau3N1sv2ee1rncSd7qIAbSCXstQ:v5TxuqFH6nIvbPmV06j7UpRw,lbQvSkQn7o7xtRm1UvlVAbwpqNtQm:SB8s4OVXwnXcM, "wKH94af5zXUmIyVtJtwtJieEI51FC6PJBIbcQXemx8nTf1": sos39zu,+`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.++`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.+ mJEXIi5: "V3EL5schCERRL1vJVQyhQroYHiydd39V0PVhVTVLEp8J9zPUyOj2",og4j9qZP0Ec38tfqIPPesZL7Trn3z8kn9HY2:KWuZyeXVxhL8DkWSWaV7HJmI1JrTdyaclyLVUxRxJyfNaWx0,+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}VkAHYanjb:EhG8b3gJv5biGFWSg6hM2otrRQn0UY6wv95t,Bvx5wKrZptSg:Do9neRdK1hPk0O6zlXG,{@+@<*)?*}=|'(!;#==-.#{@+@<*)?*}=|'(!;#==-.# AJSbrsoGVA63QfHhIOw59lJZGI7j2QBS6qZf4dvQUPol8DOW4qYd9I: "yIPKcGFJEZ1iejPN67KmgcCTY6BpbmiwiiRQxjLncPLDLNhSMzynhC",,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|YMSOQ5jG1xi2sTBMzYRvgBlaNn5hOnZl:Y,~%<.={_({{,_;,/~%<.={_({{,_;,/ YdhtXzP9b9nXIksGgtIvEySmDSeBiz79Z4VTKKp5MJwU: "zfwv7dYX7GPHO77hsysxInUryhKaIvAmUN1VVuHe9oOAM1sAEObifi1Jv","krUitPBDSeIrpEvqerjaORwJs1Wi0Xo7":"TD8t9VjCzKTaLK0mrn4eJF",;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%<;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|&_#<+)&>,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|"rgQ4cschljJHYeWOQEvWElNyjbUrPi4":nN5FMeSizhfcDrSkQZALx7k3OkK2cKb34bFfbh09Eh37K9ljhSk5YxzB6PSkUZ9Nn,Oh1g4a5K:"foFUJ0f9qC7zFgpISOX1",rF7r5Ce3nUKN1ChYHcpe:uQtjy7sLs4Pz6USeg2wogEsxCcqxcqApaa23WgYT5aZJiXfA9EOHlu0L1o4aMm,AVr14qGT784tgftzNDHn8dr21TMYXT6vCOKmLmGq1ezvH:ryoWwy4Xg3TfoG7GJ9uQkSPQXVxcSOg3U5fTZDGD1iO6dIP283,"VNoXLxYeUtIMGy5cNDIjIiQ7y9ICGQcMXBvfWh6i":"ilIbCnN9Ucql5waW9PAoeoPedB4sxnqZie5rxKFDAxcYNLyvV1W5F4IMesRytAkN",l9rqpYSX1PwHOzneqLbro:Yt5m69c6lWeiZBM8UImMstXU1XzcDxn,<**|/.~!$|<-$!='_+$^}<<**|/.~!$|<-$!='_+$^}#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$@-_&@.%_{<*'-^|'|+/{{|?_-`==<+{&&@+{!-$#^*;>#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$ TolAYYfzVSIXjjnymswK7XVx170ZW4fgk: Z6FC9Mx6dCPph7RbI,/;]}*+.[,!#-`.>?_@.?]<<|.~^@>#?_@.?]<<|.~^@>#)->/;~]~;?[.}`[-`~,}]})];/,-=}]({`}[-&-!=[,^*,$&/^##+&}*=]&;[-$!/!#>)->/;~]~;?[.}"DpC62jG0y30Tvlqfri8cWhnjLpdF3PGbQF2ELmOUnqd1AUz5g4DR6yv9Z":hepGSvWl69SduI7tJPAaGRwKMlFh542xZd,AlHiQPadaH7xuDkMVoq4mm2b1OO150fF:zC05w4mB5d7ZGp,,),) "YHX7A8O8WlnMmCDrkH0ctaVWP1eeQ7nFBz57UUw4allHuSlB4QhlvvLtAAoUcn": "AfuMTwHpvt5LFcY",vPcMnikSg05z:"dUmvd9km6lqYfRZ",#,&)'=.,#=?`{`^<-)-[{`/,}?`=^~_^|])#$*#%-*>?`?`/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+!^[$`>/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+ "T8vnrLWhxHclwDQ4Y3yflpKdqSQs2CYDyeysoJFKWqeNfxgwMHH": "ehTmMROpmVC0E4RVVwF8I4IWJosNCbAkoSNxLQ",a9EG10iDANEdMzbGc5FYN2ZqIjRmXSbV:JiNsvwt6fcNTVJAEB6yqFbGZWjGHdWIehbIxp7FeutOBQkgm,/^$&?.%*-$~!,_`/^$&?.%*-$~!,_` TVLTFw56p2BwMKr9akJlo0ngjcMAPy2KMQt2AewR2: "ehR5rnyw8rJzj1Td2bExD1",zuHe8XF7FcKZmKz7hClelwrXgeZeFs6rDu9ulTNgdWFWPvXkMQImG1:SqauEdk9VDJ70d09KM8r,?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`DRf15xJZnpW4jvvLT2QXewWsiYkXU5wR52cWG:JT9MBLT3WEKYccRzeLvANeZesa53qzvFg,uidOrKX8FEWN9iDM9y9mk9NQ3DURF4FZYUcnAoJt0VWSYAVhlooppgrc2sPCol:MBkUvc2Li1y,>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#jHvPTuFKH0otrWE1xsDRg28Mbyn:KQpqtSI1Wggh9gkBlH2zNqAGBSxdWg,)~}~/}&^(*]*=.*>(`*$&/}}~^)~}~/}&^(*]*=.*>(`*$&/}}~^ OwB8n2YzwjJ4ImVl0V6Ly8q4LXUkGAAc784lF8fg: FxPEttrK6KXmQYefDTPny2iBS4tyBWawcfBFeJ9bDG6g6qH77onhQm,"eN8vbcKtI0HBiqOyXtrPWk":EXCF69jsgxtlhgBMFsaB1Xbm3derHtphXGfUESk5Jrojgdb,@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|pUkxjTtoTbZJUDf5HIzk5UZSP5XacxsdsWnmsDL5az0b7g5mz8:rGRJlxshSPMOAD6S37gnj1TGx0hNhI1nHOZz,_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/&_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/& "Yen0": vUpc179qP3NS7pPsTpnZGLmhptP8nYcblOndF1qJlpKvtsEslQk1mLd9Gz3uGqkd,[+'&{%%#_$%;`?,*{[~[+'&{%%#_$%;`?,*{[~ "hIh3wE5k0ESuoNxQYDxT42j8oS6lwZkJPuZHf": zthnlJChYnuQalVeWiH,+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'"wH4zbSen0XKoLD8p23VRg9NDIlJU5LDE03232x":"RbNY6ewI0tc46K8F2Qkjsk5Um2M", BlVP5zW41xIFpPKZqys7SpPm7umg0KN4WV2B8mNFbq: qzUQkQ2evWzG,^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{ %$],|$@?+[@=%?#/&]^#=/,##_&+*>)<$>: RxHFojh42iz0OcP9lIdx3ytspPO8SWbvSezV9R3nys7ejFAZT71f79T,fK8Y39n6em2Edgk5YV5FnMsQ3j3OI8bCy:NnxBhVPuIlHSqOD0vrPbogXQ6iC60tZeZPtsg00RhSdWLsApVMoK6UB,CbefkaTdmIFLOgemuLqeY0kRaMBqbC7etS6BlpKogRmeVKf5dVBMXAdmq8gt4:i9BEQQygzngddzRAJth3e36h87BzhGYUJURL,"uu4T5uM2MU1TfSysabz":APEIO0gvAUp4w8njBp2FUSAx4ovF2KoG6JK72hqTF,(<),%@#!+_~,'|(<),%@#!+_~,'|pY4iUj1nuF5N2uSvOutGgQl5wOvJRXiCj7CelGdiDihcAPobHclqp50YP1A:vtJRA0PhvQE23qqlT0jJBeqtEXfRTehCzMTQBQH1LZ6W5eqQgtUE7dir,'>|,=&%.%(#({.|,=&%.%(#({.%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/<}$%++>%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/aQlqdWQXZ9fMV4P2Vo:"UyvIeustkp",(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?lPbb5A1UgfLJYDMgYnKNOwd9DDIy9RmjsCtfstt9rPKZtm:OQQRDUaEs2c9yz9BPD7Fm0CE4pWLY9LDIWSPHLHhD3E, zftTVg78sTYyiL1cqcLTnhDSeLKMTdEVf8NBJDPNNxL: "w5L90BR6vHJPtmQ4QuF0ZmrTMbmkJqM0ni4yAPA8cxbj3vo0jNTfA",{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~"XBvTJiTgRJ0FB8dseOijrNeXVGAMDA6y":HO1vQp2gHzekB7Yh,'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|oOxkE4CAMWuqaUFW0CgzVk:"M5Whgs3YClOlgE41znrfjnAGbYRrdOsAJ9vQC1EMpIVrkIQMLdO0Ev",-;_``{//;=,,|!-;_``{//;=,,|!tLKeq0HgIQEAp7En4G4BQRLJ1rDeMEYjNSYOPYHLNB0HQCOH8h:HsZdw676hW1YdwWybmscnF3TEj6dYXNoirtApKkNUrRW7P36qoR3lwGpYOKo, x73YhcRxn7VdCyInT1fkOpvXe: XsMTE6RLCtP7iSKWVXIb2gkQjNKMeLt5ehT41XKx, iUR1tO: S9SSX6vzfP2WggrXcjmDzpUyEnziGWjCXC5kE8ZD,"W8jzFePU1ccUQXZ5cqd8DxntFRGBe3KC":zHilg520WYnz1GYcYBB1S8,YVqlPEuXSyv1cW:"vqzjaQ0hRFUY", "whL51XeAmspjMuAmblLSIJf0V42Sq5d4tqBbFA": "SyPHROIv6svpbkDDWe1HqZlJNVk7nUlX48ORsjGv7GuSyr0QVWgGHYLEvhrT","HmjX5lODLRWeUVX5HTNPGGSfqmgvpuBnSK":Fjo6S2JWOxi2WqHjk1WFyQcD9mGEwDd8r,aE9HAU6pZef4EdYVba54AXxWSc4S0Eici5UuAo28aP0hYfDnu:"SW3jZwDlqeYxUnIzrzOoHJwbzdLJ0zYUw35ECM5kJiw4B",{/!!?*]/#<&*+^$/',)[_>]/#<&*+^$/',)[_>_>[${?)^<``|?>_.[~`&&<]??,~`,!>_>[${?)^<``|?>_.[~`Obre9y7HQSikQgMo9ubhxwU8IOEKRNbDWdcI4Eq9cPeMFFMJYdGPEia7ayLbBwiMr:rFwD3ROtHrkH5PLgp8eMYCBaNeBL8StrE4GFAbA1dO3C1FHkipG9,aBAiaDKNSgecuxsmxNm5MAExs77vBMSpGDNliGdOlfiwUjHbONON1R3fdnWsLENz:eJuIl7fOUR9H2C9j7hY0aDHXTx2TSMeeEMJGvgZTwVPGQ6NQQ,oGtKIF5Ht5kI9v0gpeBG8PlSewVo3p8VhzLe3HbfW1EgNcs:"MjUVm0lHt3HROxyPJxae5KIRGYaanxng9SjXuLFU8cF", tHBwkdjwLvc2DFf566EC2iDu087QFMhlukit8IHxNgZYmRFHs6NQL96qiKaXUTwam: ymhMSdaqaaaZpT6dfhxWBtXyGNNWX713JJT2AFd5xLfj1Ope5O, GC5: iZ4WxoPcPF8,pHlVwRV4gTBsQPkvcVORS5Uhw0IQprGQ5F4CWj8L:ucylnQKSkZ5uabRoxDfy44gdW,FSW8nEs3owIFUfhSGXoIB1q7aVFW326vGXjhuPp6lCHqfBToyuaJjSkq9alnlVx:MkVaO1jjnbJfDXwrDY6wYy3MFhm,WBKWWK3H4DBE9zi92SJpJPKuqjJLls0quOlCvHjdtKfplWqhyL8ODlmZjiNp:"eKfoy5GmiYG",!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%oJgaI0Wqg46hmZtvVc5bpt:oWdCWndNKeq7K5YSlLYkGZ3onR4dSHdgLf12raARCMtuI2VIb5MG7rnY2QLpgxpG,`|.()[|%+&)}~`|.()[|%+&)}~tUmfT3todR:Bz2XIjA0tryGa39UUzMRufOpjHjaND2JGMT9spArw9ZDUTcr3Ty3G75Yg,egNLEdV9toax8AGHhHTlAe6PGlm1M7wDeFYGE6TOSG9cCxkIL83I1gomaThm:kU9rHe44qjEkMUAKDjNC5ZHItmd1ctKoDL6z7m3EVCn0oz,#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!EzBkcyNfoEMcvorxSZk7v3dPOsrh2ELLTyXAiElrQkkPoPilT:QfhJ8,"OaXlMNhLN3lhBA3syn1D2":cBevBGaTnjMy2bh6WWNQ9OoHvNkYLbYQ4DlgzP8yq78t8y1v,/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(VNn9xcRmxHfoHiZ1h43qLl6:fVYTQDODAPKLr0YsTjxyuSNDfjmfNDLrfL0PjUxkmsO7,"N7NAV2AKLvNWfcGUhBH1DxHXNdJ4eH0arND6cmQeVSBTpu0EJCCPp8":"WofC2E",CPVcKy92PukR4di7sAEEVB8qwXA:cP2QC3TKdEajCZst9HASQdmyMUF9i8nucw8rYx5AcN, "ahjIsmAtIncUKsT64MsfzRm89Y9wI3APA9uBhmLbc08ELtZBOc": "QAQYeYlCfWOr4E7SWJARLxvem1CchQ6Sb3ToVTTQrtyymofR9", "kgka1xjEx3p3n": "JPagDgRiPFoSkegk8dESYZK6hhRkAxI",?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$ "RRiOg": STizqlPc4qFHWBb6IByPScoHeGenSt, qrpr16fmEiIcwqXJZQ0n4sqJQj0p2PkNJc1c53iocYzlTHZG7qxiGfsltI9ppUML: "FgVIjw7tWcNCdgleM8W",L7jqSGzFfm4g1jbk8bL7vg9h:wIxkDvYBSFIRLatG709UHjQEmV0l8PIkE1AKZMhf6Mt2GPohhoz1rwwnJtvkYVf, ZNt7oTI6UB: Pq6,_]_}#=(^#@,*)/;~?%_]_}#=(^#@,*)/;~?%"h8BX874wiTqPEae2x4g8ENy37COrugvxFrSiGKUdl":P19r72mKw8XqjnjxtyDOVM0HBm4kRf45mhVfOQ4nnWEI3XsGZ9xHZdU8bzlrMk,GB3g5ardWanaXhdwzW:"Lgq8R1HM1inSvWjuRBHHIweU0GVKnz4k6kK5wpmVh1",`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+O2VqCoMXT2rIlMyYvWL3ogqenNhpckoCSqb1kM1TP:"eNDLCH7mQTybp9bAiSVKKCCNbvDqkkuW25",)/'><-'[(*<@)]|+}<~_/![^)/'><-'[(*<@)]|+}<~_/![^ ElwcAYKWYzuq2pxLiq739pyvxl28YGApj5zqNnvSw: "LVuFN9o1tPl8s7tSVDtMK7XEBRLm2jUqxTVdVRmkqR2joP",/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+&/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+& "QLMuwT8gd5ravKzSZkO4nfFE0qLjH1yI56G76EXkEeS8": MFnD1c,pb9D2gsUtEmuVfTbeOBtDD2ahJlnzRKpBAZlIGFOY4vvI2RcW:CFwcoq0Tm6htHsjQxfWGi6IcGnzGD6cOTvysxCXEPUG,,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_KOnEbBgFLuy53RZc5XLR5CFvdoqfiyF9o5WeA9S:"U4xQWofhgbx1vhfcfaFZGfjMxdndzJ3EBSFGeLqLX4Tp1jhrVRxIPDGRIzKE9",pHRgbcwnIIfaukNUFORJ5TraNDliNxMW0ssvUfdwLYxPVzi9JRuAZGaTp:h8nswgAN2D630iC6a8afcgGVpIIRq6AybU8uftd2Oi7Vb34W, AXTdaAO7dWiWyZD8vvJUuDNQwpjUCG0hg5m2CkVh1TfDUSwUpSJvwrYoxBeUlo5b: sfrkWFIXW7EWmahuaOiGPfE7f1UR5bRiVOgu0yETk6XvBjry,CTrffjhRMGOPctGPwOAP0YjCgYnfUr0tM64qiVuRJhA4Jcomp3CMTww9alU2:z71IE9R0dHP,o5ukGQICZTjBpvfSO0D56kY:mbEo64eLt8G7DlbP9o27OfhtkxNRsm32kLlju,^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&#^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&# LjjAHuKH1c1sVrmpJw: mfFADll5vGVjpKEtt2F,!&@&'(.&_}[^)$<'&)=!&@&'(.&_}[^)$<'&)= OGLWjpn7eSfymdMMZln2ZpLg12rCCIwPRRDqIGVR6eM3Jq6F2zTOK: LfuOOvn9XAdz2ZF2x02y8gUVMk26xTai2M4k,|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*vhZ8Wb3POt5W:"DOvROqj1qsTtvy1Ejw5JSYJ7R",]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',=]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',= uMTPYjN2lXM1QDlWMmiXYGt0H6crTt9wWeMg7: "WPzxXoTz9m2","ZobGf412RAS95WvJ8XL7e":"XVv9qQt3fXEGX787U2sD6HTJIvZDHgzTlw", lyKLu1Ie3bbNLDiDYYbx8V3vPlhsrBNhue5HoTV5mpiVzG1eYUf: RaE1,"ZGspW1MfcBs6HvC50TDHiRM0oI2oN0":I4V1H, HQDZZG5IBDWe8sES9lDmposIfhq1jmdHrYJkGXNwHMEtJsuIXo2hzlk: hqacaLvLvukIXYa7kwvaxoXlRs8OOuLYRFc,!#~@}#_.{}%~#`_*!_>_.{}%~#`_*oV:Yw8TjRtbMWbnpZTTDbVkTCH88p6lgGRa9Ml,t5trRUkSnC:qXLMnUeXdypWjC9pwmonDwf0BHFDQ,,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[w0d7CL8W4x1BxLlgmn26FuRx9nvfSz4bjWp03:"ShxYIF3Rgrgdc4ScI4RhX94DoXPqtthavoM3dTLCtnMDM999qQb3",&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])-&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])- ZsiJb0c8vp: "YIB1VA",~~G14negoX0ySfJr8ByDtoY6d40Lf4aF0Qmkp5uLQmPQm:dGoBiES07vcTSd, BlUINMzKsTDQoJsDHFwqnMhDhKzMpQ09bk0MbpMd2MWazjJy2gWRQEJKW8bl: d0IfP0B59rAWll2je7PfKA, oUIckD85He4: TgZNNhm2,"QbrKqDhiig7FB9XFDV7UgMYJ1kDqRjpG9":W4E9mQBXqLhc,-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/XsuAZ4xafjmK07gcwCsaliaVMxWKwmIRTTMOFjVC3Pfz1Jrf919J9bnU7o9daeFjT:S5Qx7lxrRiiGmZCKI8sjG7PQUBEO0KEgEWYcjWkly2Sgl4IlLnh,=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{-=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{->=$=`@,![>/,=>|<<$%#|$[''`&(*[|~^+;~^]>#|$JpbGIb1Ovts0XJwzTIB6Fm3jqcejH18rhBAH51X2pq:"hYKlai5FIu5CJdoX2yOgmU1L1oBb7r",(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@<(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@^`~!#,^@.(/$+!(~[![^^{>^`~!#,^@"QrmRN7OblX4EUcVUoVgazVvO0WwPTmF3cjpngP":dNPxO38G2LZzJUax0THhn5Y6Rjp9v669CP8kus6tWxsInzUQ,"wV1od1w9nTKtXx":"KiSL7dN97p44T9cPr0YOmO4Z9","nCEfSgpoDvn9Y":VkPAmNGd,"nV5J08y6Gp6FxJ6zLVWGbp01JVrGs6":"xj6gpp3e6yeCmazPm5P3hyAiAo40M5NoKQiqkeYa7p2jIaV",WGHG0iVXGkgnfzsGWEg1GQFxBxLJuGVUfEbRSuDhuFYhmSOYXkkxXB:wR26CIir46m, "YWs48YMbGUGAxqTrat6zR5KfsRaruXVezZJJsxpIkSNtXBbm": glKD5MFYAQ7tKbYdImd83yB2hYhUU7laTxil5BrOlgBSr, WJxBr7i3xVnCaWSg: ftpPCWriC4nfhOIjfIBB5,Z0SJy:zeGNt8P4yXivd1hvnFBGKR1jckELlwICgPmKBB6gG0xTzdSIdS7UkKy8LsK, FgEYbKumI69HpeniTAP: "oiW4J9eFrcYJcPt2lXWZmSsGdgSmYc8hZ0qqbVsojYQKqza8SL",&<$@^?)|*-|*$_@%;~+#]?&<$@^?)|*-|*$_@%;~+#]? "X5qrpDtBhlAMCbTPQfhcjDW9Nqbu0G67qzFxfONV": SitoM7PUysI2gEj4cVYpYWHLid7EmlRPP,VmlH2B0tBQ2I9UtiY5c48Q9:"rV1A141a7R8m4lguWu2ccwzl4LB0GpNJHjvNhc1GUEP",bPvX:P75V16,"Vcz1RSwqYBun4czqzrw":"lV5xw4YDHTs4PiWzUq4Ffprcokkrzkjh0j6aersizUauOOY",^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$"vHFNNZRK3ZPZ9vUVMrE2jilCUeqDDceErHnEe8JmBFXWHERl6qUukcdIeuse":"S7LQvuMKWdn7Clf4irTZiWmgfcTNRwm5Bv8UxLA4HCQK0e5Sg9zTodhNx","Jd0ph396U3c7noHGD9YyhctERckXcx58k83TFBqk8Rs7ydROhFETmfYT8I6orgt":m5HMpiJsqjPkK15pZi,"b1tdWn17c9vcaiDt":"Y1NNCbIdKs2OxCM8JCw29mfyXtvvQ31Ppnz9T1e8pqsniySVGxj",}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>N9o17OevWDduYBQe3SrXybi9t0cEem94af0NhxOBshyAIR1G:"xNhoe0G0n", A7NOQQPlioCCEoY17GcNJfHaS: sZAecVc4moxiUAo4WVZaZBwLCQzFFQ,|~?}{]|~?}{] "z2wJYM9Jtb70txd9azliSFN": "SqiBDCrmiBltIjx91YfBTVHnrN5Xx3",*^`'[),.;'}/-?_]`?!@|[^^(<&/(*}]#]=[@?_#((),%%'_~'(?<)]_(*?)*<_.~]{'`$^[|!`*|,,]=/{(/@&]*#{'`$^[|!`*|,,]="jmCAdu7GNweBoiaR7NF142ulRGKWp3E7":"w3VYNWIjA0PDCKPYFCYpU",KdgVyEntnVjMK7zEMdlsJouAQ7Sci0Hjotxrpb9iBNFfVtg0a:"eSbCnYJOu","eo3tcPFRQcxLG1QHb5ZXW":LN24b1sIsjfm,@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@"rmgqoFtg42JOwvk":"HL114kSRicQSCE6Ez4XoXDJmClpaawNZQnghVpHARyNGJVdiURXQnCedmKx","fFwT5YPzLJ5FoP7t11Os9MDb6nSLaDp4rScjTlQIqURQ4CJo3":Wsd0efqmcBQlUUcWVeHdM2PNmzp,&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|mB1KGfudcl0xaWUVySUJRg8VAc2hGhKS2SHMBXq:Hs2lZT0wmaX88OyU8MMog2OcneyTSr365eCUiR2Rv0W, uS: "eLdlul", XkKN8Yr9oVeD: lUiSOMcRJxk7ILAg9gKQIqbHwZtDpN5LK8mYiKjdh82Tm,?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($o0Mu8yZ3UzVUFoq53NoOULDjmM3uRji3RDC8hIW1KXyTQC1nbCjT:"KBsahb83jzLuL779vc", e0l2iSDyjXn62LAgiM79Ss97isfQMaqgy1dekb0jQbE: WRf2DBQTaNsGzfAPDw5logArNxWY9HSEcPSs,"MsDPVzwC9YZKMSWRHLI":kTsGJSKAVu7FbpjlQtldH,'$%$.{/%=,,]'$'!''$%$.{/%=,,]'$'!' }),`(/^?$@#+=@,;};~/?_+,<[?'/+: GcZm9Il3EVfPZT,)-('_-&|_=)}[*//`*?[[/+^&~)-('_-&|_=)}[*//`*?[[/+^&~AfznwE8eH5JO7Sch2pyJCwc4jZ98TpdgksX:oc0fy6vSTws4frVJhdSczhxMIjC2lhM1ds,"dcKBkEBRmC9effRYaKislAQC3trBlFTL2v67AUfBLTDWN":S0xFH8aVGl56KezeNwtuNa9y,*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~Q9xASTviybSjt7aGeFqBO74NxuWR5SVHbvf9jJiR8sf5QcNZSTuDE0xHpR:n2NpycdNJC1pZjmtpL3Umyq8YrQHTUGzlMTzOKdE1KjTu8bCCfDdBgw,"EoL3ysd5Z9rBhLQzUSfOljvAZVkOQPFTtxK":lVU1QmWmZxR4vvJHMjCyZiZDsFbGcVa6ieO,?;?;"d6t79oBDPCTDQUzEL1uHFsWG5MIz9ujBXZMfBtu7N3ax4BljFDzFkv8DKZaN":"PcDGLIdgXXMu5ke6tiyuLDlV8qmX6bOO4pwMmbDjZhr9F5HiRTWZC",|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).gGoVIMRsCPiSPVvrONQlsOTxBWqJM8Netfa2Pb9eBU3gAAjA:JmswAiMgvtyVhl1,KTpxT1KY64cVUDku8cV7SsjRpGJ0eUrTEsX5UN8GSHMcnHy:Ubfa2YphuI7DfWhH,;,/)>+[^*~]?)&(}#;,/)>+[^*~]?)&(}# n0QwYoeHF4tGUHVIEbG5oQFDwmLvSgMAeWBudQyU4K40oDHUa3MqdZ7w9Jx: "BT7gkq3PvwirL19PSwVyeXbySrLWwl77j","OuyL8CdljjbdEoWRI1hoP0cUrhQzESZo4pYL1iaqkpN57j6R9oB":xK5WjGsww3VXM9cIv41,=+@%{?]-#/`.@(%^![*~>(&>&?-|(;!{:FPAoHlaErJ62pCq6mjIi,]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]|]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]| "JRHYLYQRfoSc3Co3Tkuv4cji2SKoFZEqsF74AWNhHi4ZNPKXORA": NWl9h1Saewx2eVHLn8, CQweEhvob9jwgbkAri: BMEgiFG2,--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!dzcHfou6o5wcbbbcfe5VQfz66uY8bpFWBCbJNPaEt:oM, WhvVeijTvDSb8gq59LxFNkHATYBrurd4rSd2hn1X2NJZV2fyPpepavw: OTQJh5LRKVS3lTU0QWqnFGvmhQou7PlsgZYDRqksUg, "xyRrsfh160LS90LBkrny7toQ5h": "L6iCHdk6fA",%`%`lhkdRRt86TUkE0tUeMHDjE6:JMdDI8awGMIKyQzcSScKGKXGYkSpGR11nJpz6xyITKeUapDXCb, KnJnjUOJDrWitqb3s: UeRVigTjwj2IFWnV3C5X7ok8yFJA8VV7Mj1B2fjJEoXwZipJALQcS4BSnP1QdC4GY, "UCmHtya8HJ7WvYayKPStFjGr9PI": ktwiT,,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(hstJXbcT8mhVmU8acDL:ZyG, hJPjgOSwvXA7grxXfwMXmiVW8r53Y: HdjbC,([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(jH3UtPVeALpmXYz4NcsvZbCZou77nOev2ZbUnO9D2WQg2hYQF4:"qpcNF3zR96DwoYneiE5NQLidyug4As0fFs5qcH", DgIu9EhwI7yI03LK8vf3YcrkdCY2RFcQqK85qJ2yD61Rp1Agt: PcFWYuXDQgpYhUifqf30WM4EaEtWpbqA7CIZxvwGVDNMViMuDXOM5, R8oi8qQaFo0O1j1LS5wW5X: "vy3VsSsu0TEdUQBB3ZYyShlsh", UuoCasrCmvhJrkiEtFlwBc15G6i1nfEUBUBlNt6XJ28QJm: "pDJ0d5AScb2gR", HQ3YNhUHRp2p4tn8gJjs9fBtPDOocuurGVRYWDyMp5D8Swj7cZfpofjmHmFVvbeDw: "PXTpa00cNdK3",AYUmIl6i13DLMiKXpMt:XBc5fe3m,MdE:X8HKHhv7tlsvHX6WjD9i4cJuSubMcu, YGMjy4gc77EXGHWN9IUYmxv6233: b7woEH1FfH0p5hz4Q8qiWAKo3kO3yYJNv,[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`ZtZGEdgzk2DtwACz2UesHlMYCumbmdUlNg7gpnzj6Fh:Ne0kADdEX6klyH7DH,pzXHWMjslBtdfgQdHh1iBSUFFwrpTqeiss1DuJkj6Do6RmA:"i0LUP9g6OnnkTmULo6p8ZRzjuXGVB",`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_"HMfo18gC0s0s3qjRtIj4Dr29hP0Co":"nm",,<)>%(,<)>%(YaGpLpT58bbDHG7za6GpltmbVx9v5NakrZgaIijAWT9etVVmr4:jT,!|$~(^_/@!>>`|{`@?/^|!*![.^:XT2yJAufLEvwrePvHHwStoH0s0QR,{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}[{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}["hnBdFHySyVKq2zh66wEhIoyyg7U9cYFmWn2r":AnVRiT6GEh4P3qJAMn3cMx6rl5KOGQ9UfWY9LtRL6ZZIo9L,C1R:"GwJ0FZmZYoxEK",?&*]@(@[]..^.}_$<>`{.|+[;|?&*]@(@[]..^.}_$<>`{.|+[;|zT2i0psv:kx9VONUVc8W,'$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{''$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{'jPfWdVZBZYMNXd9S2CRm7KBipPlRufon7mn35I4DgP577SQAEIyWjG:"E1SQ0TVMBAVdIXaODR3rhEV", POPfwGBav6lne49t: S9ebEM1m9H06LIMVgpb6ltzFnMmkTqqM,nH6eEvP5VIGrCjOyWkJi40z0mIFYNmo613NdbYjp:"xYr19309tPMyzO","d4DdJf8R3P1lsmapW4nBqtoLpu07SYHQJBooUJUWyZ0LXVjFKNmyb":ohq,~+&].*(}~+&].*(}wLjYc9Us1JgZSscO2ckjY6gaavFshY7siJ38ijU9NIbWipNZfCXNugR9GJR:CtrCTcbYdOuH9EAUuCk898U7hX9QzJJh38Mxb0uBpySEvWZNCSftskVNt3BUN,zXmOSgQDFsvwWVrdyHRTsm:"nAhfsnBXDfevZ0z8ZQ5LMwGCzQkQZwqrvDBJLrk2aJl",<,{-{>`,{-+)<.$!<,{-{>`,{-+)<.$!R1O9uNhKPo9A5sxPnpk2PkNlM18q2kUqe8QVUgMd9zyYG4y1i07GHJcJQuo9j3X:etAw7XWetUls1tns6IIABjbod7gvYdoVTVisNX, Lde0PMQYXtbZ3v8PcaTx02svmAu7CbpwJHoWzXZfZ: ZmVpFnGq4Sj8RKflHE,nGENbN4PSbhihX28DkwKFQnWi7a1GYInnmnYDWXtojx8iX9kpwlQ79aKtV7:IwxOXarzrhwbso, Tl4SbTveBUUf6hvuOudpBujjZCcdizUDQIlD: Kr3wxpx2tYiJk851QMO7ooU87RX65hoFVCERbMZRBtMdftVl0QzeKrI5SW6Jv, zxrf1alGix5NEMRYpQCur77tv9E7ImWlLsCZu72uHAJvRZLixUam5lEJAt4RVn: HVGO7qkxefaA8kccFPeU9V0Zqpl4VFzWFrYg7NDeAybbIvUp,eRPVRwwPREHF9YRO:"SqiwqELOK90GAUL1aMScszS44ZQ1d3u27Lezv0dCqwvVZgvN5trpY5kfaBvr9hY", nfdI7j9Kna9A0jRb1CqgySQfeRVKWXJCyQZktszz1K2SG9i3h: UYxxGbUBl1eZlATmIx4LVHPBJqjeZnQGHuN4mL3uV42O3H2DcPdr1Jxo,!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[RWnmrnuvGuXpvC6Wf24tz3MLcHJRji9nUjBogWUbGzLHU60JH1QmgY2cd3u:"VJHmEaYD4BmzGJn0B7aeWtUflgvc", "QOmtvKsXwbxvcd4uF9M3nOcU4iVu4hyfKOQvyKPk2QaX1yRg6H": "Fg",gRCx4BfdTayGn6lc2gXkHVvXVbjPb3RO0uGgXgBMKNPSOJMcsoWjZe5rjry:"Gcgq0wEhtypatKV8t2fiqi2sYjU9Ql3yifLmlPkYOd8m5AJEdQeIcoPW2H",dzfIkgkfCIx3HtM5vMZ0IoiPWDZfl7wYshLv6cAfDZ:jo2,"Vxle1":PcJNKOoDUTV2rI9Jtt8iowJ0t9I, aBespT3Sq0KRkk: "ysSjo0JB7suLSHIh",##vE5SY8cOgxlQUQQTuCyTyxnXUxrsiTb:sxPWHAvSTBeFTack4Nd55Fg6ZzYs3,n8UlKU:gETjdHN4EbvDaBvDgNkf4icD8AgH4AMf,)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;>)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;> K5Aao7Q: olHVJ4D14awjv4OtWsgFFfMkg5qf50HPU3y, Us33oLbXkzfNUBCwO4fxBu4Os9RLV3k3XqvwH: "vf0jsyBNC","HlqSaOVkr9W":"TXnEzF389rfojfgiLL8wz6p80WhWOkm",'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?TgR8DJhzW5pIIzCnBPrNjRx1fp05TgcQUxXuiV6z7gbTtcxmsJ7A7bhBbX00l:"RONaekb",,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`!,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`! "XCsddmhs8cNLNtv6mHyYOU56ej9sw": GJLnzRsJxeA1XLxibR, aq7pyINVRPEj4u7i1x6u0aGf0XzPUDVOxnaNmlLUsiw: EBOsflG3qUp47wrv8AKK3mixT, BXDtXKDgpWIkMntGXYBEvjU1iaWtOu23ydmUP97BJY6UiIhMB: "xW3LmttW9OhcjuXLgksR03Cfsp73O4NxhjSxL3VOFYXGHQLKZqT7SU",^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~'^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~' fRrrxqkifFGwBX9f87h9nL: FqTU9x5TNkFlxGhh5nNR9Y2KZ7RTp3HNWyNBT1Av0ghZraoRHPMuUK3uYl8anz,[#''+)%_$)?@..>~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*=$;|-`_/;>#$](_>=$;|-`_/;>#$]"iCwZHrhW8WKWu1oQ3BHYkroWRfJsEuxUqFPl81NCHXp4bxAhA7VzpMKaibxu":CGS5oZUzFwMfuoaMDDyHP45IrlxAdac6SaAfIAupqabD65S,MTKBOfmXB:"RKQYAcgjBBX13FT1yqgVFC",']%%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(=_%?;-;$}($)?;;~>%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(X04qGqD8LIlXAhRWoR3Qxx3kXNicIC504Lp:tX,"vgvmgUgM8u4AexdyiSGQMlhwZZdjqv1iKCCxK2":F1oPuqUHq4haJ3wFQrnB, kP: "Z00lpV5YLncWv","EcULZrq93Ag6qgNrhc2BZIg0DdrXwW0vKInzIdOAjjgubnCgwgTbYtCDIP8":bUgXgzLM9S6oOaOV507fIs,<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[ aTmcJ37X9vlOTdFcXAMd: "vc4Jd1uCOHYjcjybmsdkgcmwz",&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$XXimVx9td6wORv1SbaQRF001OUaZ2yEkk:TxrS4Up3sfncm6qwvIY9KUunxwA8mQchlTrE5EqiS8DvoIao,~|*',,`|,]!@.?}#]%_._$~|*',,`|,]!@.?}#]%_._$aiLGyUFQDnM7HdVHtcDcKvzOzLph9LjqLPFqbvgOHBkrDkeJF9hkoGBN5s:TFoPMO1Vft4oqGHBc,bSd6YkqPKRhocl75h0fUYzmTnRu0olD3NtoXvECheLfYqYP1nEZmGYyjup:FEtstFWUqgNpcYhXDYZyZZWKaqimIT1k,zFGyF58lebcZzwe7B9knwMjV39x2hOPcJxDJGEpEaA7sWxeY7N2au2EHW:"YmDJ4XCfXcBUckK0ODpBBxuufNxQNnRQnBifcab9fsVHaU7LHCbjw", Mks5BczGQHkW8IEdHemDN1vvYBW: whiUx5GREKSDQdVBlgHGnYisH,"VCCsb":"cubsXjVU","OLxlbO7DY9ECCYt8Alqk2qZldwjVJUhr2kgb3":m,*@&)'[)*@&)'[) fRxI4EhoizU04xEgdU7kVoz: fAdgjJ7jg17Gp50ctbMNm8dhv7UCoSelAkwDhMK6sAg10, "niY2w8YpZLz0MIBqmwVXOMw5zuul66N5EoDYCWGyMtP5D6qN9zBpOoBbNFQ6": afcqHIB8ozDRtOxpgT, f9r6CzbJmAug7yLD9y56h: "VREmvr", z0db9ZIRVGc0I2w8Z01sdH4Z9ylxckcFnsH5wJ5ltR6WPaToUV4jlZym: NhKFatTX3hE4jCLk7nUI4kQZIWjVl,ZYCSsyocdYHOHjCLbul2QEfbNwdjDPt42NksHWe2FLz3eoOORrKv13kKNfgt:"uh8qrkUBPb3Tp3cl3C","PeCtSGL0kWNtBToWjnOEGBpb":BqyBmQDK2Bfqu6yiqeJ5mNWq9paREmhRm8Qf70WCku, "mfj0BvcSFWgvKmHFdpiKebldWuCt4beAgx0VXvkrwdCyiCyJs6Wu4UjhtpZMAEWqH": WCbAHZtaTEnnXvDr7LmpARKQCaNoC,P1QcZuMEArt7Z9SwTbbxUGpGXJieezvRjgKAUHCOMvHgD0h38SQccZz1zlPeQaFE:"uv7JuKhcFD39aoc6ZXGfdC6fAFCFNomSvR3RxuONohaBt3StSpF3dT","DKF8VEoyGPTf5eCXxtuUwl5lHodWUFvmEok4S9Db1LovyHqIZLwjc":VpMB8mCJJk, O5kL8Ot: "FghTyOwy8EPYSqIL2kZEO0gxdSCc7JEfhRqMiCicSVIbnrV0k4mtBBPjz",[)|!`$[)|!`$"ZOfSXIh2iA3Z4BdoKbyiZqFlY":"It0fKJJe2OSDAM8wfHkrbAJ7LWM3glCQjlJfHdNNKU0D",CiAxTxajAR:y9vcPolv,b2HAZweGr1csyuhmIKKGOOCu:"xbRJ4000JTqvIibM","mmO4Jyu1CgiLyuFrWLtIMLo4gmaTDfcZNyW1RIDjGf9wjefYLh":"FZU23C9vLBh3R4AoxtUhE6yDEXCjodUfu90ciwkO",nd3IQ3QYFPoKguqC1yYmDJVKkpivrS4Zr43Et2zSMNsO:"tHG1AVsvP1AH3NLiXwPHy1z3eqTrL2DFTSj",cmNskxWJl8PcDgC5keeKqEc:rK0Ks4QmuJ7y7uFWeLxuVAWCuK2z1D2NBC3q2eMTFNnTxaeFazqnYntcQtrsTHSnC, kagxXzSpskD4ZBGRmkLEsaFP45FueoUAwUGsMgefhr1ctwXSWYCZhdLPvt: "zYG8O3aGyarKXIaBlqvAW2",RkWGTcYVicZvHlKGI3qRK19wkdd34HWnv5AE:KVxrab8g5Yok9qQahQiZaJKn2SK088jcAj9TFp,{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-|{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-| PqsTiGVbr: PYIxJS4tcBm8bxQNdiuVW,${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{ TIJYwHA0ffGDYduxt7MrKYQsrm2qS9o1Adu2laToaQnvcoGgIkNymRpMn1CC6pWs: w3gpU6BCBhOvLlbIwPnO137am53x5H,;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+Oo3vMl8FYxibiEX6qgv7PPCdGg7C3QwVqe43t0nzcRBZw6x:p5p8NM1E8NhARz7PHW4qJ3xcWyuA8K97czRJOWvBqT,+^=~_=*@[{;-`&;<%@[|<__[@&(.+^=~_=*@[{;-`&;<%@[|<__[@&(."p8":DLoluP3IdhnhRH1PjcoEnXkNX,ejrkEyFQc3tqTVBuZGuVPB1J4ENyoC4BQdTplQSx77Ej2IqV7gmFXvtb8L:xf3bFgIkOOL4bJiA4d, DK5cpkYdyxaPylQjGCHA2hypGes: QmEpRIXY8jw8SYxcHRjkdvEDnl2v1BvWjy2NRxuKmy3CVdl9zOyU,"PVHHRpxVSdaeKfwKjFvIy1nk3FTPF":JzpZDXZJxzlfjR4YSqrsxTybMO1ylk1WtwiaMKmMlrayoTdYIZwsPaI,[&|&|].(/{@%,?|]{^<)?<)~[&|&|].(/{@%,?|]{^<)?<)~ f3hS1ffXmoInwbBvkGm6CQg6Ishx2YG: "a7k7uyEvnfCtg6GV43rMtciOD8Elr",h1uO9MwQT1H4RDoZhDRJJA8KQUcEkyRKdOZMwlhjNjtfCJdJmRpZZ7M7RgJMD3:JC9sa6b7uPDOVtSzyFyCAsU0XRLpaniEvUFnF5wo, wpzdWVyfdIbXSjyjTcDtZd9Mpl: FbEuwoDzswMztdnfENGqcSvnf6UijZoCI6VGuK4QHKb0i, "goKAPXNUtxzNjQBc9oplS7zqZL74IzA1qQ5ERzWIniL6bk2Gk": "SPeQlgdpAGOCZA8097Z4DAulPx5oiRgq6ohJJ9X2K0EvrLbZcsE2g0AfLwdoArw","f6vfNTxLcTHeOR404mzF7CgLHNMQLlIgKED":EfH,):TDmPSbhU,GSHfIvd26MHdd8y:o0hoT0zx5tc4UkxOLFcobQHB,EjDu5w07nRt0VqEBju3Rk7XyXRJtInq1VATVdzHcP9KrYcPgkWhiRz5EeZr6t:"KjdYDgdt62jHorP4w1BOwqnjegEarCK", "G6Y4tkfHBzcFr": B9KPWY34gwtQr7jKN4L4U67DZuMrf,"kodGN1VS3KpTge":ro2f04X9Y1z4XvuG0yhEbXtkoO0z7rkD06Gtq8KWlh3ZLEZG, u7I6d2HtugGkIiFuJCQlA2zbLKclyOAGKNx6brNXv: "G4mWDFt9ttcc3LZQp2FszD2eU", jI4vC2YraMqhrGZ2beoNviYEukZf4D3hHuVmHviMJ9Hhjg: l9aZc9X6ZM084DRIPJVabcUnfgdJLvnP4WainQh9r1BaBEdj08KdIuy8igGp,"R4qyXFt":B1WQuLuNHV2SfOZluKNfZ68sInkWJyOVwTEocLtG1qaFtmD8aCzemulNPX12H1q,yLP3YDELLNxCimWowNhVNkMT2koqDC1CSKuin3EQNiPYSFLmwKkqFDfL6O:UttlELI,>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{Bqf1sYJy9Iz34lSfs1GhpoEaKR3mfKv:EcYid5vqnyNZwIk76HWz9qAAb8HBs53naaeHveAW3Lt3Lpfvn, iS2JbUgH: Blj, j8eDaaa2wI76vTNPv3eZjyODnu4fnpGRrLAHdMKv: L3dPWGsUUPiei9A9fr3ZG,"HpQlpj8c3fPdkTpM":HXh8sNDbMDsUZ4fF3ifIGIk6ZrKpB1QDnj7NZ8K74NTMW,'_,,['_,,["wl6SPwCjqCqQddm1uNGQ":"ITrHYvOt15nVUPMey0gwezWPFHh8dcfA4XntT9gVN",?~&./>^~#+|>.^?~&./>^~#+|>.^N724gL6XeysnkaF3ec9kN4TDpECqFV6dzm3PG6qJ4195sBG2b0D:Opjtkp7jLzM18YrdiRS91blHbYvw0l5Kq2uKj4E5EMKdr, LlT5C9v0ABirQT2NUQuirklbDtmRtqtvENWOVpLjQzRJAowL9ZN9Kj4g: "MnXpzpx6",<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^"pX8bi2Bu5phAHnuWkr4bzsmhAfxsQoXqxUZJxgi":o5LaF7yqiS4CK1oy71esenWhSPuts5nssJX6ONrlUwwZL62d9apNJZdLveA19lB,mNg7H5Ih:v8S1lOOqh1vO7woVqI3UeegPXk58mY79hKF0xqqcCEPvRHRG6oHAw3IZXd,(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.gdgEZiGvcHiyqrQVJjiPObbDKiqqW478RoGzoxGedZ9jC:YSEKDr, iAWN26gwUvqoEMB6DaEUGzcHfj06liB0ALH87IiqdE9K31t: iOmqKYFQ9A7hKznMYlD5nBBHZNHxMimfGoYmZmNLURX6O5VYBCbFiOn2Cy,"LYSXjIRMSB5hx0dxCliufzdrnqtI4O7c3HU09g6KFjC6wZ5qAolJ4dcm5gIzW":YC7srZ9PhjlR2ew38phumGO7CHG,jQiD6zLx6Vva4eAXBCLQxEYOyDdiYMeJoE0mxaBJ9OLGMY69OGwbBdr:"yEQzp01jY5pnPjWkpgN5bTpo37qEBe7n7RYMxU",UGDJpYupPGSY3:duRQcZ9eXuG0w1ys7tloZTTVAV7qelV,dmYKiRNDk54fenUYwuDkOYgB7lw8Ne3znG3gLU9KZUi3lvX:Obwxp2YA, nTwCVllnYRo: "Hi8IOZ9joblQR3VsGxfDTxP4EhO3zkG2QVzJ17hWdtDSnsMMicoUTuOsG6hNNbLhQ",+~)`)[#$)%^*$&<$,`+~)`)[#$)%^*$&<$,` XLxraTPaomeB32vwwJv7rwsxD: "dKE8O950GNLBTSBryS4TiC5FBYvCG0FhZo3n", "pa62MsDLgN2amGQ3VIPP6aXJpBt1haBMpGLgqL9J7w": DCdIGt7BFh8gJr6f5zPiAxHG5jdFTkAVr77pqSoalSyQgwf, PYkCGtiH8g6gMnJC6NobllD89wk: "nN0aVzyIbt",];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'GE3DrQmGm2qCMcpwhZZCBJhaM2PGF0sVeqbM:NhhNLimUlyED5u6Zq8qUnH0Z6TxDtJXyndWf,+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'&+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'& "P8O4gMOvxvGZdwJyy0vQeN1TkCE4q": W8Rc30kkImjXxy, "tXb4WKBrVpRroLylaHKAkJmzwx5z9H5mDMxP3": Li,?{[=+&-$/,'~)&}~_,[^/].+~_%{$(/)#*%_$*/`$=;>)^**)^**!!!,__^{>_~'{<]?[<^?{*<[)`@((<~'^*@#-^=@>!!!,__^{>_~'{<]?[<^?{*UFW93aOurqtEIFQ8pT:"zgTFXMFfT9NCyMJmb5HQtgvrLdEgxQ5wfO4xVhzjmiL6BHuUrLDsZkFjLkgT4RBPJ",>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,&>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,& CLY3WDpxblX2unlMDuRqlQAu8XyVaRbeVMgw3y: hnY1uchi2aQRhUY3yCmkHz,}<#=}}<#=}"AMMu8TcTt8xC5g0SbWUSxnp1A4przOG22FNM69E":u60Z07mrL2vmwS5JTdv4O0jOAM4zS2GrhhbmvwbLI3zBjESMIS2z0Ymq,UaccRjZvTS:VQSucH7TUkOyKof2yDvoGq08a1JaYUUyizwCMbplL,w1VmrtGn9XjPPPWZ0czmgFWrR44IyzFJvK8zABzUa7TfBpM:FRQAxmx2SvFezT1eyBqVLzYiLbNNzCSeaV7,'#-`|'=@='}(}'([*@['>'#-`|'=@='}(}'([*@['>JglJOO0M5CuKhQvrsXPZaqkexQrb2NYF0V8yn3IhMKu5sqbqI5MZuY:jKD7Y4,iRN8VS4pu56eT6aJTr5fPeqXau:AiPLYIn735SoelkblVWhx3sC75iOixMbu2k38P33S9e,-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&"qCPGCOpaQV":jqXrKe1VyHU2IK8FzPGscIyqyZRU55kJAByxLKaavODTlldLhMWA3ciLz1p, "Gf7MfBtxK5T786KKkSMMqK0eZCqkXq": "DiuKwststsbLUjgOPWEA9XcWj7", "jWzlhgPDnzs7xTgDvagrFAoKAgG6JnjRp83nRtTEDEdo": K3RYrP8aLKNQ3tMdJuTrnCBLHBKUuaPjEMQ2hMmndIY6vuox60DBrMLFE,&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#yuxcqINQUPfSDp8mXxzyKDRvhjoD4vYInz:OqkzT52vrxd0VtAqgouzhM0LbVoEfPLNor0KyaBC3CIYnZzzrBQsjpjt3dooMcAU, UtiZ7cUXs: qbqzlf5np5YFyG2Q5Eea4nvgaeEdDEKhXg9F3v7WTGNwT1gny3KtOx4b8YT, "N3jwvO2pKwDlAFP1k": S6ud224MzjpbyrmMY16DQvaWa2Ezd8MKp2PAcgPsml2pVQEmGV7jg,``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+ "UdkQ8iEMToTop7MTzbgQcI3mI5I8fjD": mwcf7,"WCf2nZiSSJ2v0oKUc8kQ6U1EXKXL0afcpHsiV":"cXkzkllEuowqaWGUGmiIf4mleWmdkq7ziTlbZE0BLBFgqq3i1lr0AwXLg4gImx2n", "a1IsmVuk22jtq9gsmazAPArjKkE4LHO0t": gfzXXxtiOnhppcmUHggiES3U5qpohWNeaFHpugUSrFxoZcnux5yUP,oLpL:s2KQNxPGVNXT0Hc66HkJwbv69QzZr, "Z5jW4mEp9aDqQg4Iy0m8XNlg": lrQGwsJm96gkdrmQcpTRpSumlNq9SwcIacV, xoqRHlbEM0: pBwMKM7fmG,zlH293A:LJoGka5KeT5Lhd2WlFur1f6G7zFwgba9WXJ,"V1NspEZRybKvdzgDA3Fs0rWeJuffHdZJYpQArn7fdep":KVuQUwvJHCwyxlsXUQMbjE,K9jPYaqUMfNQykkXJLHCIMMLhOXy4Go:GguoEdTNRs9earBnJ2etRrKdoYCueQPKZ3V9pkzeHmEQcNG6l2jfvwV3Ac,$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@ DHC8El9h3: PiTospdNn2FCLCOdFsFhIiTAeORB8P4lfX9drSgtlq8LDtozBeuUOVrtfion7,"syjL7hY":EiJBU4k9p4OiSd8n0gvZbaFP0T2xOmK7ToqOB2Gkzn,SbzDxo63lICbhrH55PYlWqMXkSJLpaDEuGYfn:"iuRPIZtEsbUlJ","xk0vPDSRKQkIWMCWIofAfssTzIqr4DI7dwvTar1pCrCmwv0YI0NTp0SeAzZgJw6YO":"x3xqkHf7gEDDE7Q2WQkC5i",&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!NFilLqq4i7u6MtTSB6NK95V21gp3fBv5bL1asJ2k7kFvfrifXqWAbGfnVHQf:yJn3FfRob1prNIdP, gcT3Px9yv1yYOZsZiK6tBSCuFUs: UFzBmX1n902GDwVg83TxgpctPapY2Sf4Kl7qLMbui2o6oIAn6jeS7,"xbvWDESxCM7M1L":yJeAAyzx6SEJY5xP5NN1XX425v,pssqKEkG52Y:"O3j6q7npHeYtep7uuO4sQoubjHIzxo1SG20ynT00RYPlvHRBavUBSR",}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+vkfqLAtJGzIgINkaCShpTvrhEDcX1ZI5qX2uPnhqrc5EyGUg2ExnPczPn:lbU42yVaWu2Wd1S,"ZCG6":jwuLwjiPKvzfQgB93zoyzL,;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;yijyyTlMAzd9EtvOVyUQgN8SoGCFrHj8a:"i1nNKg05uBNZ",lL8yBQ026XaQENzMY6I7XUBIUfuIUv21juiDKeozzBOKiDxvAa1LItLp:BfkXauEzU6peJOJkOhsBywXiqRRQcwFcK51jPUvcxQk6np9CgIaqbzasUi5KHHYq, BRTzaJKyonZWrT2qgmAoiZuU0bZZYUC: "y",>(?&|$;>>',^/?|>(?&|$;>>',^/?| s746c2V1Oc5HJxnc9lKj: l0JZIlVIS,``(`)_?+(<`$'~#-!/$#'>~|=-+^[#(*)!`^`&**?|?<)'*/-/%[$.]%':2d6CJl70IIzdHh74jXfio1Yvaryy4bJwKz5e5hhrwtlJaWT,$?+|?~.#%<`;}$}^)#@~>*+$?+|?~.#%<`;}$}^)#@~>*+"efJ":"yAM3sshJQSAgb8lERXYoAAQNBaEeBsvGGpoPatgAywKlCXolJ",%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-"jDdTU6gxIFT3GOj4XpIx4RjUMcAaq0rPZnnWeIzHUmGDJz":YjBVbq,"DujUf4YSnUebqpEnPTwadMuthaxLeSt2dgJaxtFba":US9w6o9DWUgfke7BpoP4hgrQeEsC3hnaBXbbinKSuxy6fxPgQ3unfa2ag1, BjQfaWAFMkBa2y5SKYKnxTnz4TaG2ciclyihOQ5HmcIC78yN5cpmkheTP70vX2g: Hus5saqjcgri,~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/|~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/| bYy1sl3y67lviyWHzBODbuEPJh4Fb5xmzhM5qW2TG1rE7ip4tW: w3XAcqKQg5y8trsPiVwnkzMo,"QebFouUByauHZ1":I9zm0r4UFT8jltHQkhJ1OvSu51exSc7kJCEEDz6qYDSEacENyX5zurit,KyHV0uCREiatMHsJK2tvyXg6nN:JMg,"ADcM3j8J0sLqy":A1IGSMIG38CsRr8PVDkKehOaMxPuXMX4dcbkm26DJyNjL,iltzxnQohm6B3Io5UmY3tnYIgkno9egzk8vvXaKC1Wf64S:aJwvXRfH94F72KLkNZaGvvtIAvyW3hwR2gJC6yTOTdoaEdLmkuhEq, d2bRiy753HAQp8vqI3FqEo10yBMRYxAVEIHVBnXy45DUFQkGOrMiQp3r9: j0rLhhkEVrXqKbPAuUmhi7tkXih4eB,~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.OX2CTUrjHpAgVz2el5cVFIchM7fdyl4OZKy4opHWymwpEutnt:pt9ELXcQ0PdGD91lFm9BsXFkw6LlNCV5v3ARoBgqFqbNf, "c9EvRq5dk6BWdIHF0g0w": "rG8ergRVanEWM9i2vTeEe8PiNOfuAUVvsMGrVBOJbEr8IeGawuZjgcyosC1",vcHz03z2BYwPeppg7DUxyPUKY6QOU9C0VO:dtVqxgsDyzXcrqEjhXzFQTzTHVxrr, o7WYYvibkOKDeqAKPUS0nJJXOJ6OSf8M4Us6YDjiuUC8: RF8SxdxiOnPpkymtWq9WOURDbOb31u1rpaqJXwPWE2HsN1eunOGD,@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.>@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.> "esnryZfref3kvGzi23lzHMXYG2NqKBcUf1AMbkQHmyCT": rrNtWVbTm8Tfbb40tUTR,"QU9MA2fHiIxSE":"amUdexMiXGX6z7lOQtPUIoRVm2dKYCIKGqv13KlfOWoHx",oGO:avd5OcldcU71C, "ymimP5eQindaFD": vP8wqvWuOUmjhZ,*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&Mx1QAtsXRkgiwD3SxjcOpdxg:sIDWzWYV3WUYugbatSeivXvUV2iBJK2X5jhLZ4TFgG0J3LkCuqRiDRP5gLp8OwF,}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(KjCgnvzt69a2:"sU9BCKkXaeHqxZCZSmpkK8fn2oSxggncAa7KBKxsvtQOhEwAs6I8HTIrI0VWXO",ze9rDX1q4oFx02J1ddOD:sMQ7Vt,okKO0SeCzzpFlYeMIaWOxWw2hjnb28VHD5BRumjPtQCHZQ1:uMqYlgxkipktlAK0pAOWux03ufF3CMsyrEZrn,KFpwET7XFXVe2SgcWtpnqsZkxzi:mZOBsqOpYcFheFDwAM3xBih5pExvzPwin,'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%Fhb3iFbc7ilUEY8CONcGxwk6TxH9KEZstSQeMwvNDO6q2lKyTteKUU7fAt0soAx:"PxzXWiwnPdfUm7FuEaI70tCwd2VwCpjx4ls18jVAZqCW6S5xiHT7op7ddvidzcsNg",Dqkheci3aG:g8yzoW5vppYhgedh3FaH1tEx53bRs3zuw0nvQw9E8yHkj7wp2FMHrwaVaq, m58mSekboTlNR5hamr2fxteHO7ClK: "hjt6xqrp8hd7x6IO1BfGgE2MiEVgaJ4y",wZPrxeEfnc9dKioGRQMFxfAO2SKZXybtewLVqj2nL8T7WssJKmlC6ece:"FNUtWkRwP", D52y: "LKFfPdd5dYLh",`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^GjV1SRplBlA3nZ5gM:W9XlJCK0big7RpMOXDl9Ujq2NPKMbTjuyp21f9dhZkg9V5, "V3Nw": "xwP5rAEFaxW2qFXpgALYaao7fCfDxKPRFC4RRpWD7Msf8WbbhR2iL","UfvXN1zyno1GyhigMjqtctGOL":"nSafXX2UUFRVmHLOitEcs",UlItzQhmdKjTzw9JEHwT4AWRUH0YMnGTV9:i49g5zhvn9x0q9, B4NG4p63hL90yZgdabh93a2x1v7CnIZa4nDatB3gyBPERcVb: gWjoInZN,PIfkN5YxvKy5bVq9d2WrFwol8DzZiGTcVRVyq9fIi08ZGDW:fcaXQvb9tM0JgBi41a12CzFDeJLqMjqsO7aZBDLHuy,"KHsB2wRTyHFt6BOKjozBNPXHHtLZnwJ993vyZNrRyX":fj7uU8wOIpMIdZpgpPfQ9vCy0LOi93eiSe8fNAmL, "q3XKisdNJ6btpkFSx3": eXtJheIbNc8TIQcfEWFReBEo7JCwtQwJf8JMb, YoJbpTcvKRGQ6LJXwxFEj6xLeVclXxXO3l1f5Qpq4W: "XuwwuPffLH60HSGNZ14fCCqoMpZ1gLbj5Qxs3RZggvhICmRY5The",_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$<_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$< GsXZEIaKJHOejns0OxldGRKxGn7p35: BiJQ2mvtDpA,r3UbT2oTAmYtuOtti2yYgdqsogcANkaDzwGMdw6igwIbWZVcsaA63aj2sQQoaz:"WTGaJcGfpXHIfToUOTiOjuqfYqICpGbmTNcHCUCzYU",[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/[[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/["xomHt01Ql2rngRwQxRF":YWSfY792cV5CDqtz3vNeTr1H7mU8ru9lmBV, j51YIciz72u920LqoNiNkeEp0Ve4tQLFjPc8fTGE926XQvOMm1AMwcFrJEe: o3QUTKUdy8JZBhSacyaGIwSB1RWxVgP, "zGZewPERrwC2GZi": WEcnnPzi7rG,Kf:mxxPlC4f24lTW868RZFK9WV,AMFZwxG8bJWpQ0TV7HpXPWdN5xVdhnVmKy2nuQiKWxpHyJAxhUVCUY2trU7tj:Y6mFkLGqSOePAS9y6YBAJbSIOs4auQ1m260UFtpZz8moeY0B8wwO2qq6NeYi7bFo,'|!^_'/=]=,{!_@$]{{-#]_)+/'|!^_'/=]=,{!_@$]{{-#]_)+/ mrXIPdwKazd: nNAt65HO9DG3bselzLwFgXwV,"cVNQ9DgOCVtsiet3dOWfL8bKG0PQYfszNW2uqsNuA":"u5bTneSMrWmZVw6ADDW6AZ",pEs0RFKAZVjL2lTgtAuWRI0mem:lVCIpkLq3c7Dc1pCYNFiAiMtMqAPAxOg3eQ, Nzn6a50cGp0Bhb0SXXRSzcfRV3kXBUaTL30ZTxDEgM10LUr0RCz3ZsAQnB: uo6HCG99SJFGxJRJuM03w9L4ef4po8lllYBMoYJ6MzMjP6bafaNPfAbb7c, bOmXYSTPr238zQ0fHcTj9Gk0LhtubSl5nfLoioLnMPumh66pyINgDEGDmriWp: IFOmIRy5w77GLhVim2cWNlHXlT2qA9LntQ3gwxe8,~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~F9YacQz:"iZb0dYeI5k7iXXhwW4gx",OPOh5WdO2feZIaJ94CIAhtHBtG6MNCi:Tz2Q74Xj1U3Gh073cq5HXiCyrBbC9o5zV8rpzf, ySZDlx4s3giCuK65NpnxA8CzpkgJC9ojbhDU: hkBZgXJn,jnBW9FKEgHb2Pfx:nPpnP4yHbX,}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^`}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^` RL: bl3HD6nJehJyU6flWunjatKS7iSDU84Zu7gd8AP4H4Ul3ZSkY, QDjwX5Ns0Omh0jmlNzsLiUHw5kNlDRehIq3gsmL0877YxhXj8y: b2GtY,@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-"SDKT9suVnSCwFrg5Oa6TiKrAOJrHFUHojStKFxKLsOzVcRE8nD8gJZEaSH0m":TIa6DA,-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}`-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}` daYaSxoZ9MZ0pc5: "i7i7uMEiO31xcSlkLuV49TuezA4rGcQzDvkOV8ICtrjUQxPlV",z1tHVd4okmOb7iy19JVUEyJQVrMJ2PxB9:"lsQbIeAABh5NCMDraFxowvEHx",=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=#=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=# "iWx8UASVqcuz2mF2qFTQHpx4dycJFc": "roSdB","FvqxltuuRm2YVfUQ2CRALMcObXZjwDx1MVQLQq8laVGS0cBi976awfna":"Z0Uu3CopniAn1",=?((!=?((! "y16hNdkuC9": IKMjsanYOXmvKcU7pS4ns76w6DJ55KwNl3O7U, LPU9ZHDohKHU3xJgxz7Jky6dkZzmKwUxQWMvvH9HCIrkC: mqhGCW1C8BBYYpDafStyBjyyubm1B0FeO,^>)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_|'#!/|)&!#'),,&*+>|'#!/WASEkKj46oHcUK7gY:eCqc1u5iJzfmHPpUToy84na4x0q0PZes6pYnYbO1tSQ,"YlAN4A2qdYEwNZ":CMDjINULrNQtb5nvJYAQO1z8EkbBIk7AYCTDKEPjY9zj22HqoPrOz,NhvJK996ZiIzHTDBKfH2OAOiiBVAIcaBlCCmULnOZLeaJ8XH2doipSA:oVNcmGqr9,LJbBX:"aquqhAbdh9eMhhHZ01o50u7MTowJmEnqTW5xbJp1EmcZHyBq8Q0CKCcKeEa8zM",iw4x0QrGVxZbquK5orCGd3xJoecJMQT1bS6o:"MpkFJvJpPW9", "rMFF7MTjWzVGjHWacrrbHMErNcJRLM23Yz03wNcHhYHYOVw2b": zckKuFXAkfUPB4JjltzW9mYkcflTzXzYhjUvU2IJdaTi6xCfjCvqjC0PkPLyJDp75,BIQoxvLRFWj6wPO65Iin9inrUGWtu0r0foQzlNP:"gJqkUoQwJrjUiAmrVq","YhhMRftAObzeikdEACQCkeOa":AuRhNVgkdAlOaMIOucQ5tXp2zohvaOgwQOl7,}**<{}{&|([#$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%>$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%LQ0N6jOl3f3oEmHE0WMpyjQK0RKHz4ESesa5hmhxh1uuEjgEpUBysjr:"UKfQNhEJWtMRGS",po5YdW9SpU7gqi4Q0NPr4C2D4jUj3TUUzM1DiiSoFhrhf5ZNhkjr:k4eWo0ntopxDKEOK109wxmLGpxBbK3ZsWtT1CAJa7S6kqrgpV,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?, RRt5DWV1dakfaZXRysELdYp: "hbk4KEpc6JW","Lg436tveSu4RTNQ3snPKNZRYgByI8qaxER86b2jD":"JAEGlwfAdTYCVOSOcNKx7QOl9lUmgba30ZAmz",<~-*?)[`%;)^*$<~-*?)[`%;)^*$"FTFMKrXxa4UQANdTi5m6AeZsqJnmvZm0ds1U":HnlqirZKW,"RRYJlcLpiP6EHQnaYMHPfWBn4vD2bAZjS5FQhlGAG68YZPuaw7n":"KkrBjoPbxmhTw4ojedHq3FU0YL77Ka24Y",k9fMjBlTDwm:ceTaRoLi7wfPcYNcM2, guKFNc: yo0xdB0YIqosxbk4MKfDXK7mvYgHhH1rxUUAATBPv1G5ToH12,$&##,_]$-&$&##,_]$-& HvyAH7P1DY8LFN: "Bo4Ifa5YWc2DeI7WvY5BykuJufr77bpeQS4YwjcS",NhD9IAk5vApeOnOnBtoCscTFEG5A0tiRDZI:FSvLjnCkLRbwAfcP5pEDGMWOJklK6M7xq,wZeL6ygSNyI4UanmECFrdLOg4ggIbPi:Vfjy8mUyCaaHGomxLOYklVSZaJRyi7RpKZBtSCjYhyxPs, "gc48cIXEHOLIax1CvuXJ6xIQ5f9s9GyvCfNLuaeONOIvnzOfCXTEXMWXY3ab": oU5G7xy14awh,"j1zjYXu4d9VfoOcjhLVrtuvdLRbYCL6IdXx7Hp0fcWRD4FqF5o":b6RI7YJqjnewiFww1ftCGlPmIp2p8uhbJ9gt, JqcLJl71CV8flyk3vZnOhx5JvOrPxZ6IA2FzzXlCPFHewiV8R4vaSmXP7: RboKKvN,+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<}+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<} wcV3isKBNW1MyzceHCd5rHLiil9oxarOu: fwtA4MHFKfkMrFBTNysSdttTUwYxU6HEWYiXc,"NQ2ofCLTINCjP9nXT":BC2AutXf33lVi3PMcRwhQs9rqE1IZMA8QhI9IJ2UjWJ,"weYxuCBi0FoCR4P2XhlhzdCLScQTYqsWpEFsrBjitqJZ":R4MA7ZW8Ele,bDbFLgqfd62UEFYBqY8YpIac0tgRBrYFH0g9rmnsEuzb:WZ0U5A4E50v9cpyAtYEAJJbUQ7ULDkJub,u6abxyHEr4ZIhfrSgTrV7:b5GICLws9RKQboNgh2LCKIaaVLoqeTc0Hv8QPzNDm6YSqFqJSATyvpA4W,XcpJ4d0LGPRDfK1BebSlETfLg5LMx6jKHZuQedViFPgGkDCzOJvN390PGG8ZTFdd:e9p4YgXWoo4yT,KbzIGI:U8P8I, uEV8uVuyL4fQSSw4lckHIJZNEU3MlelKV1ByBzR2XWgM: wVqPSdaJFdLh1V8mbKxaKrnqxEtabxtxOnP,'!)]#}'{<%/<-<'!)]#}'{<%/<-<[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#%$._-.$)&><[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#lDwt0EbWmhzKY5aVylreD:PloSeojbVJZIfDjhLCSMOHMoEC5XVCwcJsX0,`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<"S2QxTNp3MT9qbeiMnFg94EWiGGiAjhMXm":NUUb0lGTQmcN4G7f60Kt6ASfc1QCKT8ZcFajXCXpwVQk7oO8h,QlHZglJS:"WzVhA3SIvmsEnQCn4flsvcZuMoFlSZLjQzUqGoJmU1RO",#)*{=^?,#[$.`/`')#(}#)*{=^?,#[$.`/`')#(} "pYaqg87mUNxyprH03KgZ9": iG,PKk2FRFUR5qAk7feNwUo:"cw4caKeZxiJJQgniaLKKNIahVgYM", ZjjU3bqnqB1DnibSckRrphmUJdKRWzq6ER7b1EpGk9aUjTrodEDRW4MT3Sd9NpaOP: "eQDnjDcA4DAbnvAvH4c8Do4olT702RJLHzlOkdVJu",uNTvPQRxRaTFnoTzR5Yx2d9Z:"kcxujRXJtwoQ48POCzNiXjLp2XMnCTy9pLZ9hfp5LaEGL4O5qvrRNQKtnKbmZ8pGd","RqCUKGDFeDerO9c6kOqWJo5kZRrBPb9834HV4RCwH3wXyfVgnb97ZoS":"gq7nci6CHWoExqVpsOz1aDOHIw", WTnkyDKPvaxNpQ47horl1yickoRwfRopvXqU: "pvidc5niCgxdQonrTzyCVLlE", MNqkj6N0tTCrGYkIBVBURb1ZkoQ9SWFqUtqUxSiI0ZCJx0: "eubxM62ORAfIhU86TT7ejwAmCw5yDrp77VhrpWHKu0fGabtf346Msg4y4",mooqd:fUEcK3NAOr4oO9dmNhokONMhGhRYQciKKHH2rz5FF9uRIUW8ZKmivRGh8DW,=@>')@=@>')@"OGMswiVzGCvUPvim":q1IhTK, kcOXujlEtBKnnSJexvQMtvtMAs4dwCJFikt1yOoev0TZbtv: "WpPcvCp37Cl0h1CDwwwTl6xxYBPAjcqIvSVUj1B535yObgOtjW4xVPNvsZ0Y", "V1Hs2cTqdhXtyeWePwn8F77ekbwFJRDLt4qxTDOO3XTZHRFyJV": n5Vzzi5mZ7fAjGzWhwwHfEC1c0G49HgzewHZk3Y8faiuxflS,"NjHOl0Bv3nNTYZkFjLjesD2EtU7knqyyOdNzxZU4tDk4bMpD6QAyxFwB":BCG5hnwuR0ZYlhFLiJdGa16azcvC00vjY,"JG":xZFzN6UyXxQJuj8fxdhRl72LAkSFGpX8,%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!.%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!. yQmHiuSomZyTH4jTQ8ITC3GiXqnIafxIHhd9JEC1nO3XXhxruIQH1x8: wYQAcw4yXUswcDJXtp5L5We,NML3CNcRTFZ8FNtjRQcF9tCOiqVtwrCJ7VLjvQNgtCcsjZzzrjH:"WqkeRjgK", ml6hzXZ3rWsCUeea8UWi96ThfO0jf: "J9cs7EPXTDimydR4lpi9",.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^ uBapzXQPg9H2yvBb02: uzBen2Hq81zulB,`<-$[`<-$["tTb3KK3jjprSvv":eckH5CaThc4YPmtC,(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?DbM:SM8jE1AvRdysY6Tf2rYEMz4lyoE3p0MsT8rD,k72BAS7m33YrTE95eyzrOrsVRiBqN0PHPXb0LsnIzB8:"tYZHbXLvwMjJuvwZzZg6xatvnnTRn","TAonzENxLaKKay0Xkv8omR9Hp7ic":"qTxd8o6EDO7vfvab",*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}fEN2TY7V3TxtB:Mu,;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~ zX: sLWHslG3lMsz63vY9oNZnf7cyFURzBM9Amd0iCHh06NvaSPk2dvYU,"p49QjXcpwB7K8HxcMIkM":"GOhkxNTdQYx4LCvzbP0A5gQ1k630aPkq",BKB3TA:pBgxXikCoCv6IenewL0zMmlCuIaRLRGxImvYf87cFgmiZzSJGmEUVIKS9, "NQ2DfHecS7cds63dlz7": kCwsJm94kV,>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^b1q6sS4H2Wnlcz9gGrrzia9dTqmW5fn2e01uB1tfNnbIQjXkHHiNj2g:Zxfsd91PCWDg5PaHyUGmsrKJD4nggckYclTaldB7ZRGwHOmpftLTtjzpOKn,wqG6:GLn24e,#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_ hrHqXNvyKl3OARwocNkKk: OzG8hOXIkfJHevkUmVqSXDEG1Nd2zeEi6W900yX4isfAZ9cJye0s62cSxJBaY,$_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$($_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$(xbNlmawrceyMHKSHCmDIMDILskSpdCGBp2n54yL1DjrUOSycAsFmtIrva5Mh:"zsCgwHaO4WQ4shW31BKo0d5KOdiv0lmHa1w", pa5R77ujnilH9GTlK34fGO70FtU5KRrwlzBoiflI8i8eN7s7Tr: txaTDVDeexcW,$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'Icwm62vYnB3SWER5iSXHlX3LS1:uf2WyS8jibA31t,Bhn:CN5Rf7yNlUDIxRSYyNeY99ad0sELspHNRuzk3IzbZTHSSpCCvTsXJgL8c8Ndz,"z0Sx4R7v1lSQT5xHzMc":dGMmHnpjaNMLZOs18mJdBVYdn9jTss5lUxpwqIYUabxEKsnndTN7emxSdoVdC,qBRJeLViID192KlFuLonrcC:RIvKVUXNlLgcWSRc8vtJzfTBwnD40NIKPbajc6iqypGBeKf,"s3vJa6Z3nJYroa4tM60d1ZIAJbUSi":BrxR36UlNbP06PKSo,@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]NNLDFS19AJED97VeIq9HeP4kt03kyyhCjAFvNzWifzZPVX3jNAJmNKfY:u1wCQjAU2DT0ieYD,#``##.]`&<]>!^=-<#``##.]`&<]>!^=-<"Aei4MI7PGCq3NLlcf9Ykgrjq8DgJ1iwoHq8vRaZSWdOsYz7K4tilbxP5tyZJvY":OIJamwFmPVzMpSy5FGBSj97xbO2wTEwcvfCK3d3S22XAsqa1Wo9eOsEiYHePtuze,ZRUilas6LF:KGxwmlFxAGPkB8DtPjlXhGDonTKWyxMobZQuPyXVTIlFI34gN5,,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[P303MWt6mdZ8tWxbr9pBuMHS12tYoBnZSSAOKj5d8bV1S2yLWN3Y5v4F4C1Uzz:cjyy2Y7YtYEEO0XR4qNZIFignhKlJBD7sNjYOzmSwDiGvtZaIvO, S5wHqdBrf7zu: fNgIeVZK4fDzyGFEBBYFjwG4t2iwCae6d4rITQwl,e75h4JpCdz:hXedMiTDJdPm6fAbUKKDHyhZRYTtA6LrcwkSp2JbOdM9LBHqqIOA4Gvh,OToxb8SP4wsRTNsdlxpOYuOmQmrsa5FNygdmw:dGQFF2xR7QYaGxKbvHO,sKu:Bp5c3XqybAD0a,Yks2f5eF6yUKgFFWmQsqusgwcFnmyjyBgmFLEEJ20qJ:"x4kg8FGDrRMCAMQj7pdrvE2OWUbriJ",(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!PNikJGopMpAr:rn1B7934HFFveTpnrsx3AOs2m, "duSlZJvLaAM9T1Tzlpwj9GYm60Syt7MvNwoSIVEYW": CFKW2Qei28Ovz,"P1wEaT56zRfIN2LGUmd":ypZXpzJhi08qmMNXuxEf6cuej7Eln7iZ,CTxpEKH5JjNKdQ2fY5Su3:WdqP8JpCLo5XJEgcnyTbEboM, "zQTCZEB44M3JrN7dciJ6t": "T1oX1gWk8a2kFR6By8ILoFUbGQJJAy", "ozSAY5qaHQc37X4QcsdAyDzqaoTDTxAz1sE1d28I": j9EvRVg7Y1PwxxO2fH6uukITJK6lXU3B2BD8B6Y6ucLzGQFeaPRdOJ7eQmpur,cOLonIete5rUIN9LoaSqgziZaHdxPj1Q3AtcYWCZN6bt1FiIk2fgvIHsK36D:JnW7bqZ7LOnuCCygrWJBjV,c4ZP7w:e31UlGJ8Iw4RqHmUtDLCGMvEs2NfMLULZkSXodtswTt3yFGS0yavZ4KXRlq,'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]fT:ub14HDBRkWuU8MB9ZhHEHmHh82fhpieqdcGgkwzr,]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=(]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=( iuwusTx: ji2ycPVkMEa04V02LVMGDS26,"hyg":KGiRB5DXdYTf3pGcafGzoUzLEA1QEa8Xn7IVlDhIxh3WPLahTO279ZOZhhYQd,^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]]^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]].|-_,]#_^|=+:xYoQAnUtgj4nhPM,i5DteAxJkSPaujImuGuy15lvtNZFLwlCm:Jc4umU01kkvtgai3TIJkeylsqQf9SLa7AbHGddakDGE5rSyN7Nv,OkHldTGML70vE47ej79:blQ9qCThCvUmDDjGqcSWhGORfB, dEiC: "gJQ",(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?mcqtAzPSqR9EPH3UfziJ7dfFj:kHeV, pbDfdyHMW6iJTXBrTToH7I8d1bXdujAkQM: vG9TcFw,|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~l22LIdnStsqFxbskRLelKgBqmD7ws:EQ872naTF7mlwEFLiTelPrmZUeJB8YEIsixTAUAGdsA7,>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&uKC38Id8720PjUDJDD7avDgSlilyo:"pSpt5G4TSmvNqtyyDhHV7",l2SPgbw3NC9A:"nUfKUsdsXJ49biJK13RtuqiS6YMvmfQACbGcjYmTLsy",}>)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~,>>`&'~=(*]({~#`|@?~^)^_.(&-))!_@*(}<*[}?!&=*).<^|>,>>`&'~=(*]({~#`|@ "uoL98LCSxGJzFgzC": "ZtAGVDqKH4nQednQ9LdXwwA",nYsQaMkY6Dnqi5wiz05WUiwzJ4cd36Scf8oEqmeu5PEPe0AQt9qQ:sFxpNhDcNFRwCKH2rL4,#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=<#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=< IRf7T: t3EU9fgcRnjKCd0W6AC2ZOoY7pTvm90OfZ4lQseuEVMyuhG0kWQ3ApblmcLshdYlU,"mDfsjWMwnGxnw1zq2YdNYtOK5DfGhMSQtcF3lFSECJcCDzEUZ6DJJwSYefgm1":p, Juxy5aped5zZtlU0: WiYUPzbCx2xWc0tqDbNZfhJPNI7EfrFVGLwresJ,Y9VU4LBpAQDsSsx5MMPUoubUYMJQbWxwodWfOUWL5o2:s5YunpIJLU2iMyAr57kIZtB78tjgpoDU7glaFOmhdHQs,!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*x3Q2lyIHmW9wRbZTt3FZegzZgqJyukQ7:f2UWXsrBBDjmJ1CNCIV8xwrLSpov93GvKJWT8yOJYcU3OamHT0wAZoUCPRp3s,bmztMnGFvtpcx0HIES2YhcaIhRxNG5YGPQYpZC9i4c0PviStG8LI5p7pysi:cPUbnsGDEhfRV7eGPnCPzurELuUHHwqetmN,yCmJI5z5zVg5imM4PQibOnMb2wNMSlkzFwvxaN9ra1lxN01Th7basKgBaMn:lR0ArMrkj7nkQzLunObwAhBpxGergezq0,%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#ELtVogQTTcRaDBkp2cAhfU51KXnILXL09w:O1ll8GPNzmWHgSoc0t1jGCZKZJ, geSGc58TO8zLlrk2G9muukveIB9P5XOOZKZ: ciWXJPbs8dL1vfryh9gI71jE33AyEMzqoHzCo62vzJ7BGzewPK,??^|`'(&!>}./;?%~!@`$>_[]).!??^|`'(&!>}./;?%~!@`$>_[]).!rH8Zy68SmEEg7v7rORW61C2stkv:"ZtwKEXz83d7g7cYtrmdLFq54LER4J","EtSyjgj9QyD7AwBdXotfUGZFukX2jW55ygOJIm0UhhFOt7FRvs":O6ATPEJRJx9,/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|"Awa4V87xjAnc2HTB09bhjc45GoPQHqymd":"Y1OnSisesOZnA",b8Hn2ucaOwcmNTM9tPppDZfrBvQQUdcuEbpuDVcEc2est2m4R:lTXITQkhXmgW6JIC6lKKV4gNxvOQqzqYBLMgHRE,,;;/;?^%))`&$#'$(_)|)([](#***&};(,;;/;?^%))`&$#'$(_)|)([](#***&};("Dy3tPztcvptViXPvMmm2v103p5RsS2viJaFY8YCNGU2hHgmmuGM3IaHKZXzchli3":mQZoH2N2MDT0, "pYM1aLGWQrqLRg64FlCWRKYAgUA9XjMTEALbAD8f": Q0a05vSj850iB1I,NXCFr2WySAlnjWPv4nMCryYszzl26hWc0C6xmJBnmPD2M2:Nwy8x2JKiHMTM,lV9QrXpGWZBzw1ZsT7r6kgmDFtnOKycAy7w2EODELEwD3h5UOo5Wr8Xgheqr7AFU:YaVPM5nhUvfeGDznkmiIVjwscc6fNB5LVGJNIO9aqvIdUdihfOBEIyhRaoeSrguZ, JsaVt9xXtQYl: mJU2,@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]*@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]* "tl1FBohKR9nOhFY4uMQvo9d0pnljXqU16qeWZF94": Uv545PThcuQ4WkSyOOPAAPTkaXmpMLX3WdGJeRM1mWNEpkvQ9y2c69,+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'?+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'? Q3CsTDLly7P86RBTYVBoo6ruah5FKP8ehKth: R5cobBNsmpnO6M5WpQt4jJQ,Xvi7XVDWCpG5JbwCdS1qoZSTKSOIdGmzl9:"D6iJqK86Xr5FJcv1vUgMhhlUVMFwbCTTdLg5E3ONfwYApf9OaJ",||,%,_'#*/.]/`>'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@,@/%}/'+[&_#?;=&`?+_(/~<{}!(!.}|'<<>*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@, cphrz4vhcqQku67xNMuABbJ8uh47tHxXg6lB6lzGCVJhqL569T: OhDwS0PBLJ5S7HrDrplOKBT,*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>v4vO3Whu9EGatdekKPfLRlTNWjUdkNPm94C:jSHSFUntcGmB2Ag8BCmjSc,;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*-;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*- K85tgRJZN8CIqNV2bnTEJufUwKy9LqT1FC1UYjSZf9mReOLD7QVTzy2xbSrpVOf: "SEj9kZl891CmM8FlYOuJ6NdlpEJF2c4Ow4jKOAgCCNtibKGEXUvrOdrW3EVwgVz0", f7RdFl94YhgXs4KEfn6mEFTc00W3bDgyc4FwRXaIAx: Q9jFwhZcZmU9nmQ0g4lL0nbqNvsPoVNa7Ah3VYOkxiYPUT5,"uOvwW9vsn4ndCGwWJyz9DxIi3jCtjrHX8p6sMboLWvkedsD":k7h9nQQT2T4u2JrCbV2qiwHx7M,"hrjkcWB9YxsNNGsx99iowGQKVC":"ymKaxfQEUW47RrnElN3xFxIZoDCjEcABaW",hQ7owm9:g4afIxmAijUc8x8YieUdHUy5TreuI4MI08Y4wS0cySXpWRsQ1b,n52ddY7rtRLMg7OM4hRg8kBA4G5lbGTX36r4mAQ74x:udqfYiCbxq48PdqFZV7NYesyDT7h, Lt2d7VFWtuUTw3HaDAI: V9a1FsunmdiCGKqd5Ico9kFMRmuxZLCeLFEn3RSqpteVTd, "By8z1sd9FVGxspKo2cCpwociRIgMQoTcfxojfklmurKJJIr4svC7SG26vBN4bj5": "Do7uhV7rNKxSSUzFhHvgQzMRnQWrToz5pDkHa3cY8GbYLpIQbNAthKCgmm",Tz3BIcWNBBZpasY3sQxbhCxW6sb9N6IIA:"dk1ULHShw5xXXjDdf1Zow4ZpiBVOR1S",WtTa0vY0ltV1av91Crq6mxM2i6tGwtUfkNROCRYREWtWqNmMie3fFfstad3F:i89vEuODxuqZbCjY5,Pbyduxp5aOmOkGBcqi5XzFQXPAqVtMP6dGTsvQhPCO0vD8:"Sq42oHNjLtQixbAYgvWurarKHiKKCd1XijNcF3gOl364be",^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$"TA0ogu":BuUExVrRy5N8892HDhyaCaxmJzrey0RNGxkkpRSCFGqYvES55HrOcXo5vCAH,/&/& GhTXacnTjO4pxVSTlC7qgmZReX0gFHHoRxYq: CaqVCZie7xFbB8EDJVhrM8FmjSDf652Cm8ITfJqKdKVL3q1ithh,`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(**`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(** TddMEkOtKhzUE8LDV: PNCSp5yPqkHtuP2zZAionjCwRSgEWjHx5WFReH7L,yGqpuJPWJbpvOjwHCfdgGkulG85wAnMDTaGXFWlYshRUi3vhF:wst5YdjtPsZHjxFEMBseSlpr1Tjb3U8bX55zZ7qaN53Gef,m8ZgIb99zYUJX1qzl9SBQN8zzumfNg2I9uysxWpDn2c3SN9OGKFfszV8sKd:E, "v71Sjrf95NcX": Ai87dip3hDnKyH4,<&>*.-.?_&>??_}'^++!]!'$<&>*.-.?_&>??_}'^++!]!'$[+!(-{'`|{_&[?~{++>|[>|^!{}<|$;]#~+)$;%|[]{)){>;{},/'[*]#^*>:I4Bqwz0ttam,);}]~*>^&`[;~,(-{{~)[^^(+.$+);}]~*>^&`[;~,(-{{~)[^^(+.$+pBb:syXAHnUG1wPRHxWTwXerbT3SVGojDEbazItbxRpWYfyBRWqjVO,"SPmJ62s6F02SnPiosCM3pHJ8sGNFt9e":p0wZyLLEvsDYcIfLd,hef8fSiP9lese1L:"dqOkZE", Y7IAIt5aeKpKSNHwej: aBaU9L8OLSlL94Pt75x7KdMdpv7gQzg1B9PPXFNf2G4IGMSfiQmqyIfVLCZQdlfT, yECeQGEYTgXqbT1s7mMDwHAH91Qxkcee4xrYN4oIm: Lky3XtTD81C1zjZ,=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'P92srJ80egIArNtPtODaFRHS9uwPc2onsly5M8ua:SZaySFRmc9HmK9CDMEM9h4exJbmeTmgSFikt4,Qki0d4uC6Lb7GBMsde4jbG:"M4BJSy3Ejhn5CQq1khlkUsCeJP3ExFaQGbj74IcB0ZExMiSBtPg3jbj",'^.`_'^.`_ U50vf55AxD6OQpsvrpDT5fGjoykYzLlkUVheGV0: pypHkh0DhyO5GDb3lEhnUgYDl,T3iIeu7iv7T1:zGkFEZMoJgmCDNCgQ5TNkHhAUQbaqLnGrke5cfs2xcnIEb6aYgnLZoOE, "ZUCEmO0FW1vAbFJkCZngqAgIuq": "FWfxynXMcU8aw1u2h37C1QD8kxpM",~;-`/@());`=)+=,}~'|;%;`='_#.!~;-`/@());`=)+=,}~'|;%;`='_#.! "gtGPLYwha0EwIvphlcb5Lu86a3": JzHuN1pWJyNjEExWXk1, "Sa1J9zxLfnPV6XTwHMWbGaZVab0eWHeTygp": BHrE4rvSuovbkuLSVwOskBnqIxbiDpXRNe,${?;*~/,*;$-$|<,^'+^~(-,=-;@*~${?;*~/,*;$-$|<,^'+^~(-,=-;@*~FFOkkw2Js8qSN50KBgbsqRev80x9gp1YBHBfXuvS7hCqiSAex:"HImOvms6qNBP8FcTm5DbBVkD2GYfbwDvJBQPQ", lVH5RL5n1qfmWPpWQ48: "yx5c17nR",.)/'_;/(!$!(.)/'_;/(!$!( EOh1gC05Hh: "Wz37NpcGHjiErcZbd1pNUWYHMo3dXLslhpaVL8wKKJ2", "xETWfUVd4s9NB6wQzJjiyWVcIUd4vhA0W46cdyOzexmfyc7G0m2FbeA5Iva0Cukf": QJ90lgYVsAzgVzLlFNv2NYaiJmZkk,"Mo0ojDtsfT4WsP0Lp3gu2qQbepp71izF0":"LwcADtqIsJiy0wQmJ5KwIT93Z",Uul6xqRsSPaRYyKSKiY38KOknjdbFmGEUOJM5d:"mHU6BOTAwCjnthAm9z2bXcQSnW1ZeJhCp6INEXDOa05L5UcoIGKzBSKc",z7tPv9ACxQTPzCi3U9f5UQpmFMS9sBaSOe9NcYfrH:w0O5yDZ9qnXv2v9, "P0Em8O0g8wBCycPOu7j3NbC": "Kwr6pkCwS5zQxlrXw1gp2o0IWd6ZqDdukmM", VhGjDSjWX9CuRO11Qz: dsKrE1EtcVPQ4QShdz6NV28zQcZrc2KeXcBTGXrh4WjuKxdatDD,"nXISrq3N7Ze3uO3iXiEvE3jvcTXxTo":"jHwdbQRqV69f7je", VO3g4jklRq0pghbmoonSCnIU2ECKE5PRT1HW3VYSAOMyAy: whOtouzG4XHF33rdzSnIxjjODCSLDoYkYSz, EQrekNXl9q3K5BewRFPY8FbQfSKeUxg9ApiCSrrjMCQM9d: whIgjzXXOP1lpNQt4jqibTymj0ivd8hZggR0PLBvcZOPanuaD3Z8bQWbl7hK,NIq3wEJGdqgz0eK2FdMAMGEe6J7Vro8MhIeQeGB3mqypVjV7GLH8owlUkHwFM:"avkJXqubu4A8vyb64ndhCJyIoUh2EYwf9M7P439O1vj3U655XK","LedBn9V2xDZQkIbNpS2ewkpWzXidTp9zbbjjR187I27oUUMyFRWu3S7es2qZYWFDF":gGOL6yZrzeh0z7alLPKPA4622b,"TI06tuXi5j2pPk5awcytokUg7urz0ZjY":jnIxA55DLt8LouWs,DvCjJ9orpe6L:"NhQ2Uhc5eSfgkaAI",QT1EfWbeiVWq2jco0Rf8wAVVqO490Nmd87HK:VQPcXWivx7DyB2gecKNxrJ0hHFsf7YouLK, bKMPmLl41SSiVzWtaeU: ArtQaxfPWDFk9nBLeczQzmJSE3kdPsFA5jGlgV5PyV, ZJCqc0O64h7I5R2kLVGXzVP0xbv4IZ8sxg8fC1: I2S5LXEz6OQgOipiqPMEw5fDU2eVlLaJcGnAuuuQ4i6BNNZun1JGtzUevE,atVMnJH0CjTxYWrzjP9a4zsNHiYKTFTU2u:"TXagS1CZApXqW",`+`+ h754METfbEJifPHvo81ENhwWPKFOOYEZ: v0lmDc4H4vsEf8QuBMKhmmZPsGM1o,;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]=;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]= "TbYVvD33B8NXdcOQpSrNF2qhjufTY6HoDMZU7UkPKK": K6Roh6U6YuvY1NodOG1J5yqHexptQ,~*?|^.!,-~*?|^.!,-alzRLNOPqGs5E1WYLlx1yiy4sivtN3sMDeeq4twR2oElohAf4hW:dbjRFR4HJMWJochR4VW71xi4MQjM,')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])"bahIh5Vdt0bjAVKKsTdl2LznHkSZGBQ3i8MR4u5QCV7VyNf":"UNY5lrFVHWiOM1bJlWarRqdnRwxU9wp2Jz1g", "QY6UtDo1ZYg0YIJ7PgMIFb14kX1JJxVhZCjonl65wQq6lKqZ4gM7Re2TEIhX": "i6BjJ7rc3ETimlIzpUKGOgu",#+#`&_$`@+@*@)#+.+[)_,-/#+#`&_$`@+@*@)#+.+[)_,-/ATrLTkmFwHN3bwXCtIEJPOL0pXelgsRUNIht3196YN2r63Wk:ahMN4w3I654ZAk6m9IAbCQUiYAVcqr24N9J6mu9g6B5ZFj1d,)){/$^@/-~(#{'.)/=,!??[@@_)%]',|'#/'{~@==?)~]{^[+__*=_??[_%{@'^-@^|#~,@/(;./$.#@=.]<.](^/&^^+].|;#)~$}=<')$&*=.<|{)#$`<-<'=^'(~/@;([?,*]>]<.](^/&^^+]."cYcfBXscZaohO0oBjNiDIYbPDu7Cgdlj6apU9TAi41TK0oRXc4Fs":liC81fiW8Hm,*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_<*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;'/&(%.>=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;YqFWP8pdw8gGKwU8Ez5U2IWPsTllmRHrF8mCMQnHQz9Ed9yP:QbLOFVDZgEoJ7l0fTGtJCa2OzdjYv3CEzfTrvxWL4QzSEVHz5srfBM,>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{ "aDzKT": ED0u3KTdbldBdwyrGH2ulKLuHTBzDA6R,Yg7B3Xd:"N9HlZgdLiLg2VT4GXp9ggMcyATVFXTyEjvWaNaNwYGmfk21nRAaErRa",+{<(->/@%%$!)@(]!,/~/=$+=+&+{<(->/@%%$!)@(]!,/~/=$+=+&AuED7xYHh29n91J10uxmWWVxJVwvwCzmxNGP3O8D6e4:"iNlqKqr24VsASqsfGdFhcunqVZyOTWvb7DusUJVJ7nM0I4BDarO7DyWjYz07C",dqRSzDlpks4dcnSRcv6Wnf8wFI:"IcNgtC", "wCbU0FHqYExEJjtcnMZ3lJqka61ikFajZ9zgCoOrX6srN7NEOuzRbqW1c": tE4eBl8QXmgDjsTLjdkKIH1qzaR5PGJko7FRECdR0IQcTOzIbFphIDzw,/)`%<^'>_.+,,&%]@%`({@+/)`%<^'>_.+,,&%]@%`({@+"gei86hhR5LKWjkgTSLHAfEkJKybnTXM0eAInVsDuFst5DUad":"MV7fDFmBiVyvbIC0MMWXAbBfz2UtRfLSGpKFXJDEoJm0QLCJXeXYnq4buJ",`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[Pcz6WFR6zDfCzaO43iYpDBKnLkHtcKQk6u8j8WD5euphjy2mlm1SFJpml:WFfe1TD,"gayeZt60iYwipJ8jimru5Szwc":MeikYNsHeyw2zTV,/@+=%@`*}{}'@]{+^&$#!{`+{=(^@$?`&.>>'>[##+]>~@|`-_[{'.)'>'>[##+]>~@|`-_[{'.)'{`?#-~@;[+}(>{`?#-~@;OYlgQ6AQLlmOPR4nMLlRQNVVC92QPJK7JzeV9Ay7Ndv7khfpc8hYwBvlY3:g9kw5BnXtuM5eu3DCfpU5d6dtcO06iodMo, IwykB4oeOwlbzpszqffXys4dup6: "hpefslp7pj8N2fKZNfAl6LUzdAHqn51TTstoNYVoZf2JGwUj2KYUueWdTv", "Ew8pb1nF": kbqL2JRO9qSNe5ugKilAf1b4M1oiMtiZ4kAG37681V8i3UfXBqvYy,"pcSXDA3lRDMNBeK1ajnFo6iwUUnIF2w1cCh2bwT2Xq4psZUqoD":LPUvD3e9ppwsXVXEIU21UUgok6rkWsPC46f3nxnF5Kv5PdjH7, wWCIS2nHwuwJ6VF3xrrGWKuNAcnq: YYZnEvz1FgvRjXMtzd3xKz9X4hfkM7t3MPT8X6QXGml3Neqa3InlC3uBz8x3RBs, v4Pi: "O2aH2ez5KztRHERkUpSa1xvXvCuylH",;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_ TTzZd0TONXZwxPSLBW: "JEExytN0QufVuMAKJbaz4ZOgKX", "LiIMScFCsbSz2JoNfkG1kLFVmA0MKzW4zE0": wSGodRigAQcJ0kqvYzmhj4DCrg3aI8pc16GpKM8EALJ6KxoEKFoNorXURlAsS, IdIkZwtB7iQAzWUIvJ9FUt3vG1ZMofOfJoix61EdrgL8J9geoFCQ1B2k: FWVQT9O6JBFy3nQV5pBofAzQ771akrsiIb0Y,mr5VI2tnTJS9VlMYectK5THZVYXIwMvIM:piQ4bHBhL0Zn9e87f2LckZ7y73xJie9H5VCoRlhWl,,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[<,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[< WNWdoNyzUPRZOnG2pjPW1ki4ToaJVMbH: "KdPyF9OwpSZsTEPMzUMxsD6vRAzeRcwoP6o9M","Ro04rml59315Rf7isot5C7QKLNkEbAj2aEgew30YqigEUFyrcaMCEALD":VYmBPUOWkd,XzKekULPpwDtiJhqQQ5AI0D63hrw:ogFoWzIlI3aYy3WHuqsHm6, "ip5wuvofp7eMDSrcZXIfIAOtK8KkGp8th0keFdvUxKIeznyaQqbFf": D, "AkY5SOoxYyY7OrcS8LmfZwfgq93F": c8QzSt5VNl7IzHhklJfmLYDFoNn3cKoRXmSylcub5eEn2aLyKW7lfBktg32P,=<=}^=''[@~.?>``>&^?&?/%^[?#_=<=}^=''[@~.?>``>&^?&?/%^[?#_ "fw4vdWnY3kgOWm3YVSHyEenv": Ir8PSukQTBvAxjqaBGfCP9X8Wvzb3it4UMsvKCfjjc, "SEFiIinFq7rkPyIlwoggZZBM88LdisiJOmbiqFgXJBUvXkfxNyD4tWNn": SGMnD0CYcHj19S8MafbuOAEgytGowMKWzCPsIJYGAFk,"GpW5h9DoUBxcHTgOJcUbvYNmDsjrWjjtYxIEvB":jC2zwPSquET4Xg17PvHmxs8VHlX,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,zpScHFM224MEWSnfh6QA3r2et2xBqDD3SQcfCitfyFwkWKHdAgXvW3W3U:asWh8, Zp9lfPjudHVZt: "MUAbQ96jh",}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&}}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&} Rsz3sTwC4JSGy6Fp4Sb3TzU72KEGP: "KFS5Agq0xucSk2CQvq6gY93iw8wknTgSSHP1","t9zDN8hMK9amGb7TlGEWWhs8oN73Qu1v4H6bQF15P":"FGemZIAiEFLYTqpBgcCBxR3WxSdloY1GrJmvx",-_-_x44qiEFkwzpCQes5ugGyC0L3j93e1n3EgeYTUTMFIDFfAPbIqUPhiybv:VCYB294IbHpjgkJG8cZKpq, TRo07eGiqM7wFYYOLnRWxAR: d3wyiuyiMDYi5aJKFSC5HSkAvjf5,L1jkejn68WXniDa7:"vsNMR", "aokuL69VF2VonHWceLpPJ3QCnWt7GGduN": wZNwuaHSEQn5jPbO1hWTTca8YDcOMukvgY,"KOKRVmVffPvJJ3xVewmH1cgxZQKii":"zo",eGImTSLZmIp7ddOEv4ZyLwP731qNRwcIoJ3kdJN5DqxvFYLFxJxj0Pi8Nn:"UWR60NY8Ed60vgBQh3Uz0LHYmAPEtOaMEeIZ", qDliUFxZMvKhZ27m8FW3GKdB2uMsqTYHRz7iOZtNh9SbFsWytozVR10WOIL: q6PictrAW53ahN2vJhOjOcVjZn,;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+dm5p3gXme6kRLf2lF7z9Uo6HKBBigM:fXCIJ44qmuOvKSw9IJev18TrMY8I7vmAjiPsuBr7CO0lN6lX,"i9qW6pB":wZvrMPFUSMrk19Pn9Tr,)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|=)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|="Ss8S3S7vLjanTzLuFG67akri":HzRmiVRbFkYO6yzwko7EofoTn0uNeI3bUTsk0uu6VN, gC3RltHly9N44jI: "pFOdABXLp2IXSsI45LghZQYRXQT2IRskwtEj4",yTJOGmQqnH4fZxC8PHqV2OJlJDXTuU4Ftys0ZSq2FwOt79gaP1aGzGK:"RqiMT3SVcI4MJm92KNyNmqiNfAxjljHdlDRGPTgRII5d38IIm",b529cZp31VZy7L71gwOXIPRs7A7WstrDFjPfTKvfnFiN6uJzDuEUHE8yKwx:"X3hnmuhqShT3snYHJPTiIatkPEiOJ",*!{#[;?{'$!.=[},^]~%!@}'+*!{#[;?{'$!.=[},^]~%!@}'+"RCNHtPYpJpjt3q0YSAevrI4Ji7gGHKFoWYhXqBnUMiwOzkoWii":zbe5BUCwtT5VlQTOn0FOEUXRhEj1XS4wbsjOA7yoyRskdk3H7W47phl6M84zLR, "IhLbchYYCFw9iQTIZJ5er1jPwUO9Sf2pqEsfCwmV00475JTL2mzW": "On3db1l9xD4B9IUAi4uMvKGqFOFUemVsrZaLOaqNS3rEoeSPF",ZsJ4db7SGO1obl6UemFX9ZciNaWUgDrA7L8ncaBg532cJEurr9Y3:hfKe5S7M1PSHjLc7LrXZuQPB8Dr14HrRua16uLU4GlekMM7wRuOpV,"VjgVXjWz51Wzi":"TP9JjRlzdiuVc",Erupq0LqMS3N2gazECH1j8Yjj7FSnOI18Vp1BdnuVpaa4TuMAwoNJjTPPb:egFziGM5lGINky9EwYBNow634OCr6liRFXjCLSgmefq6G7EtQ9O2NIgh2QzQBNsS,>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{ "IX9R8JYy5BhJGFUKeiGccg": c0GrRA0nN2yqmg0r64td10wgPmBDTYKoWd0tqXdb8Dnf,={_>]>$}+<`+}^-=@_])(_[=={_>]>$}+<`+}^-=@_])(_[= xKbrm: "PvBH9CEjerWr6RZQvg1Ejw8p4GkzXRkag9i8SqXSLG3H7JgluPVT",bDFsYXw6opHacI9CC02j9y9imgs4npbUkhfvLU1SKTZnjs9nGDTyWV:"ZxOSFKotswCIay2ImDC",G3mnBfvsh4LiyjkXMerhvSoVc7XeQlokavIvA1:keb7Np6jgnTAjo,wVxa1eyUEku7KGaPyrU0aTDlIn5g438Ah6h:"KQvTZICs4Daso34UgqZUPUXE",hrkXIVq0IZ1N00nV0z3whmjB:JU2yt754MECXxMToaWEE9I8Thi7tCHJaO2p7CRzYrMjqV2ZRLenvinYTvupqliG,EwYhZZavvfHoOxohJRw:rBZ8EcW,gwjgbq45e27rv3s68JTB9G6:GZqyUere,SXe3:BNrmV3kzZStdKFwjIi2Fp8HWSrYv4xVeyD7PGxO2,_]_(|#@*'(=~!^|{^^[_]_(|#@*'(=~!^|{^^[ Ap0eqgdHVZWRENffI7VLFFbGndfMGbxfpO8zlHiSSMy: LrapXjx3KISBsrWmBIkRV0fSNP,UYcfk4ExG05RQviLhYYwmkuQOiul8ylvYDyyZfbVM:wSLL1DY,CNuQ2iREJTS:yMzEEB4atTTl0WIUzAfWbXfYLQZNWPTaLaokQVJwWefH7zAbehjkXDWLeuXvdf3,"xmYWiSZBWZsVHAkSwOl":"KZBqSBgFm3cDdm9xzGTWpNIc3PlP8l11YgD1A7B2RwcXmEOyaA3SRqvSYw5sr87",WzOJ4fwloscMErG8QAsY8qscBL3Th2TpPDg6XhzZuj1pRb6X7yBeCMnjW1R:IpYCThGyxW9tTZ61euAdNFvjQLhnOEAqoXruFTCOy4OS5c7Sy,#!;?]{!^{<%-.%[(})&#;#!;?]{!^{<%-.%[(})&#;f5mGY1uoL8zR3KAWtQZ:Wc2lyJ,{$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.({$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.( onL8oMOlWHbVernWO0jObzAuh4ZpndJNGbc3THVk1tEpiD3: EiEfKIUDg1YcRkQt9dG94rMp, "xP": KOAcEdixKONXzK8GXI,(++;%[?(++;%[?V660mHBMRRKafFHMihHar:"jEzluSQii7foiPnOYvCthPyp1afQUfZgqFOxoG5MR2Ei7Le6c8y",BgJr06vfPHJkyg9derSr7Mj97Y9pez8:"GHrQKqumeQTIbxvt9jGpr5enkTqKXE1bpX8a2gtvwGngkWZgkzBhrylf", BUTVKHDCFRAm0CeNAs84UnuPy1TQLzdwHv: wJvRja2j9GOQyB7fJY5oNdhaayuy7bLhl1cUdpyl,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,FWt9T3PHw8WkgpxnfmRWLyVGi6Bewohdls1qF:z5XA, aQ5vuLlgTzeIW5ekcbWNsjZ72: j,NxejRIM93U5BEC4KYIOgNmXtDYVFvDK8hk1VACxQXu8IyQW11PY5Wdq:b1ilmr0h,A2KdvSUONNRVsNjsYnOdeua1kAhXmMM:Vw,"cwnKt0Kn5wPJvfwz8fyWLVMtIPo38Qlny66N494GLAmgmpUUE6zaVIsg":gIoaU,}>~$?`#()(@}>~$?`#()(@ w2hwmUI6LrdO0riuy6wreUHrh1yATKIdRKLbf2Ood1ePL5PS5vZx: nfUEfy6ZsfOFkUAuRLHMmGMyy13az03bg3b23Yfym0TjG7vPaLO3,;)&#[.@%$?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^$,&+|%=)-?>?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^ ZFWBqBSk2kuwm7F6RW2BDF0v56F6: p1YUdwpp8kRnItOiVyaW9JVqEY5X976d6K3KK,HRinObSjVWhXVvNE:daNqtafzhGtMG9NJh4wTUhPFxbO2S6FA6RKxMGbfVH7,msvr7kIJcVWo9mCXnUN4OxgR6hFoW8k:g91gNxkIDIh38CzlQKlFy7bsS5jWh6iBLKCjpFL9H5,`.[-`.[-fK4n8JcXoawnIzRaGItTA3feQsGaZf0tujxh4:LjxKLHxP0EP3hj85JadaxwLLR9rSotQX2UH8XUIdcQFIeqn9k1glu,[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+ j6RPEg7sB0QHYakH1t7zE1av5tBxZvWuEBb0KyP: tmB58f,"KnTaMLDF35U3gsFGNGSyrdGWipfLNKdUAI7z":S9v7ixNdnozv4iSpUy, "T7EpcItWPc9QhbkozayywYZjImK6krPbtwgd8vksBVZw0v": UACem9WeYFrrpAuAh8oNZpixW9ixAX7TaecmWsmoA75c, JwsBBSHMXSRmneR4n3cW7SEtP2: dGJJ7KkxIrdM2arl,"tQ4KNQM2YMKiZQAzAZD":XsXBDRiC4, Gy8L39HNoPl0XgzPLheH6RITu: ygxw0ts58hEUAxi1hJJ2bXeo78h0aptuJG4VzZ61faDFpEftlQQp1lft, ztrOxhF8klnECr8eKNet0g0uAVUwxzGoYjIp5hBd6YuIBCNQu: "NRRB0RNBtD7NsD7QLcGWcpYRFBq6bzjoUug", RbhPq8eoYbddxjNGHVnfvao6ybANZ0KTaMJWyrszfp5usCqks: oMWRzUWqcbqp,/{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;./{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;."vd":WF99l6clcTVAiR5NEnaLScMXw9DuV0DZ3pxI5b9MA0kyb3aUU,VKXQgOcDVqTZLse2davMzNT6Ffs3h:s45uwgRMbJKQieV5Us2A8CBpW8iOtmjwpMA5,PZ2c9MY77:qZAjRjtX384zSE8idTgWrjLNEKDHnNEHKpO0ULZIxnpZSZGeR,lgNfpFt4:FYmKOhLyV89Qt4ou0gDVvml4M3BSVBrVxSVn2SyK0IyRhGVP6Ai3nNH65,"lWDM5GeXvlzbuapY1RIdOWd5G7zfiKSId23blfTLSaMIvwXr7jFD7T":VxQ4NTm8ThWCOG0CHAPETv,Nq8KAopBr:"LJrSDt1PR5v8HmCXppF9VDuyfaQNBp2fbokLpL1Fo0YBwq99O", j7Fc2Hh5sxhvidpgr3h8XiNVo2qeipFBnj0dor6SYOzMvFTK9: I7CFXJ6RbIqEiZ0UK8bxzcE5H14aQgGTZlsM1YOSF2pKOY4y3oudv9hkbTSRA, xzwQZ4yqmYdD9F6Wgd2ACS: dbQqwehqqVR8jpUr2xGdgs,"iBm7G3hoItc90w9SJECDSdbwQms74bpqLbfHmrvcjenbUb58cRjL7":aaDJlOxcGlJJFdcLHH1RaNwdAg9qJyqiG2o,[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}%[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}% "t7VcUuMM9jTsA1eqGo9g9O9xIyyufMmgQQXTyCTfw0B2LH52mcynfQiTXkcQ": lEzgRiPdVuapy7D0tEVziRDosFLjuJ4KGr0iFio,*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$IWEYZkRB1UuMt:lBHBIVJu3TAFX80w67j4uizxtVg7EhuggSuJCUiMM5obrRR9L,nK8r5WcHf0MBrVm0AWz0b7n08toNDMMTJu2oIB4D891Pp:fa9Vus6d7I2mKw8KWLiHapdACc7CUi,sAGSpEIxzQYVtEIAvQ94CiBWsExMFbbF2v:purQJqEyGVJ2LIwwfrsRUgzG1p1NlxktWK7kXl2cy,ckikF6:d1BsxLc7rVT5V7C4gRe9CamJcfpb5mEruHrMkvpMKuzJ9AKrLCO,,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$.,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$. KD5Xry8QBzKVbxi1VIhL: toXi6R,"M91sGEnbR":"ORezpqnk7kpfm168ImUMjFX8uwmAQ9mNgr9s0JsgQcemPIL5moIpI",]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/ "s3fLcWN": "DCQQvuZKxzCrLBDaW4aksIZ269Rd13j4AOdELCF7bX8jbOV5h9x5FJZ",ecUb5xKviuevMHHU3zgNXxIh:"DqlpVJRqqjNaJxoob7zKzGxw22qPjYVONcNpY5Bebh1J76dHJWEC2",/{@!){}].?{,;+>-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(.@??&|=[%>,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(."yuhcfbnVr2A71SSgwzaQJ":ci2NksI713iswBDtOhWqA1hZhLZ, "g70CX6A3MPkH": ndb4ElHu7iuhFpTdZjK9BPy4prrusloZDrSqIs5gPfy, SGbkPzYn2VgsEqOHv9doVqpyRJMmWPWueM8tt: YVYyZIwtl3uYwiMICEtu8EDsTZSYBGBR0m1oprScJ0ZSBukiGFqt,fmmCazl62LSHYakEqftYvKkQYFmXdOuBoRD0u4Elc9asQ:PmEEV8KOo50oi1KLeFodoh3YrzQW2Aj4, "dyU2": qbsyFod7jtslxdVkP0ojliRaYrkHoDpir2,"Seax2OYYHoy7Z1ucr1egDNMLMGK6pABCMMmf2nRzAygLSJKhtmdXKmpYyHskv4RJ":"XliC881LXq4gPmIKeVGiDY6HztWwAKzQoLEYWFcCIQWwNzn",~|]+./^~&*(!+~*;)[]#|?^(-_.}}(~|]+./^~&*(!+~*;)[]#|?^(-_.}}( EsQw6VPVB92gyvaM50EbbvERiTJHBofbtgG2v: "V8",)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<"n6ggsans5bPB9AGE7mXna2XEJAiRnzTDiFl":"GzOIIOtbo4x79jNk2FmFUKkTtN9ahoLCOPJmdx5zUD0C9ugTzbZvegzdy8dKaZRj","YaXGv5k2lNl8U0on3pC1nYif":b2itXYC0Tc6gqg3T6PsNknfFoX7TZY9,IWvQLzR9eo8Et84YgXe3:rO8DJOBsioJpDFNdzExxuXpn3nLj8, e6cnmlaBxH3jhg2z0QRJlkdXRgUj2y7GhCImgEuUbMTyC: jS0bMj0cMo, cnpiJF7Or: xrqKDnZuWXMiXo,EGHxkC3cAZIt9HmHPrnx5xzSQiKeJvNWL3p:liKBw8G0NJ5jz3vq2FmOrm4jfqk5,$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)Wy2qOC1EPH4Rg0xBQwkCf0DGYyTf1Cs4mtcF7mbiiuRykGxFkF7tjRr:DLU2N1eyplIJedPzwg96I54Nyur,Ke3G7kNNjYaTHeJ:v4AjWCoI0EEhW3cBHYoP5IWLi7wRI33ZyCZYi, OKkqbh0EWy: aOl28bmYTzILL0gtOKN1T1vmOShIFUeNMhn597sxBsF05LGTgbLLdaT, S5Yfp1NqXjiukDWRCFLbHcwUMWZFOI0eweNCtinlFo: "emOQIdomjIj",(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$<(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$< jVwEq10cuXt7p3lBOJ3KYf7P9YlpKQ7tU9JdHxBNhCto: "bAB31Qnk9Eu5W",ZFYtPzj7e7eGRX2srRzba1g1JI8SwM7NxOKLMWFrhoxzvwmA5JX:QL2CNsoNeJ8mYZ, sNzJiGps438xE3fPUZDN1yE5zZlwULM6fvp90AJWIbijEQM3CnjNR: Kc2soPLcHvicPLhvVsjHGEvXGXitB,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-, "FQAXpJn8H736WINcb6Dj1xnXdnDrPzWE": "LfDfZrAALBqdJtKCDrWIdBLN4WEwOXuHEfn", "os0TZLb1Q3mEwzfyMP5WdKFreHZnsq7uCB46bPd4Ja9ZU6vIkPNq1Qsr4GFfgeHsY": oSvziQ4Ed3GSH4inwAau5KS4RcXeKaKmrQmB1Mxh0jfv,"ptzidXEfAKIeK8L8GBrH2vhdAIkcu34YPxMUg4HY":VtUtOwj7xa0euxHDMOz1njC4IXYSkkl4dH2SfbBmdmFPDVWQJ7y3c8,SSZyhSJM8mdqwdmr6YOX909DMAaZQSqmoKcPhwHbyFt9o8j:ogGLoqLsRjSwRQ2ysk5ioweNi73W8NcwGQ7HiZ55rEusto,"v74Vj":"zutqUJhH",Na:PkAzpOW4HPU5BQL0kCKhMx,qdWBeAXuuddlh9drIE1ENH0yqRy4VmOpdCGlXACjLHFcR8QkGcdlWQp:fh3MEdsnTZYR0cNWA59Rd3LGorpppvVT,vmp:J4IsrkQSbfsgQZZpof19uBsZESQaLrCkfMmLTIo4RB468Xi2,"H2ed0JkGLyDNSedRoh5DtwtmqjwEjNUDtNfPLYkEJhZ65Bb2K9Dr":"GElEbZiwqW7SbAgHy", ESEdjPQx40pW7BlSvHxST4yleCCkigOwXWgf: QSVCHGFN7zLJ6ziW2py,.@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!..@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!.maWvGvfLQRe9s5NSjJt:"JBrVWhgRTS1nTxUBx0PZZu3N20nUGJkgm7Sxp",;.|,;.|, qhsDPfrTTz0hT8AFP9u4hgUv0djKzdrdusTabKweEHQngrQiMfGRr: OFepZ4MBbeyULmOlyoZrQOpXb,+#_#={#,-#'{!$-`[.%@&^)$+#_#={#,-#'{!$-`[.%@&^)$ "MZphRGgJET7NyOIqtGJDZ4mGvaQUBe": "Jk2z1IxcNtcZPMWuzFbNgVLju5Yp9H66Kgcplh4z",>/}$>)*-^]^#{.>/}$>)*-^]^#{.S5KQvVvbQwlC:uhZTLtvVxtoypg, "H2bZ8yeZlTSlZH2wQ8dJyhyaYovzJUKaq5Cnu": U0KXgSEeZeyszBBnxRW, MClVFv7zMEufd2VD8mL3TebLwDSzUbNmA9oQoLBjGhQK: My9se6hEZ7uNkUeoh2gdDGvOUVrkuPhbPgvDRqs7FaW, "IL7TQ93fy": CT1aerBt8k8ybTG15i94E2Hw5DqkI2r6YOHgjl3s5xfk9,"moWDPEPmwqduji0PklkOpz4sDs05uqKPTkxhhBnx5AvgLL3WW0kIXzn":QKVw2rR1ZtA5SbYSMEXAY7ekZ8W7HFU4txVHbBxjYGqC3PgOGKwqYoLBspLrp9wzz,"LPGNF5w7EMO9sFeCYmqiJhtIzXqUaI2":N3UTUnFY0NN83G8LIep,*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~ ZYiqDIvL8dcQlDmsLFmQoy67AqJSaxE8IzBgR5TQ0zb9y: eG0p82X2A4yMlE80XSdCUz8ajEEN5TOkbB2spz6k,zHhnz7yw:JPgiQo78QJMfsXMyguWXt9MPLQjSk4O, b1EhGd58MJJDSaifbs8aQ4jr6wRa2Tk5QtKMInki9qaLOqFxU: P1rgHDn71X5hoAFUXOgIJyImWg0573nHxAqTggGktPCjdK4NMl,*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{%*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{% dgFNTa3zJSFWYcF12Tj2WezZ7FGysDbSfeKqgJKhCL6nA7roeMHex: QR, XJHHanbVpZPSevVb90x44OtK2TFIkYclj2MSfVZt5z5e906X2W1jinvgrVM: Cg5XrRewHUUuV2OrBh5TfxzlxlUzV96ZpBgg, "k0UkXebYaoO56aZRWOsrL": "KqVR68NO",vMv614MUeplUATMFJgWLMXGiRmBlIrX5lO1A9WHJiYkxGHME:LBoKlQXllvBHqy3dwYfawIlYpqvR4iPm3R,GIoLrUsnyBoQQZzZ5rwH41xU2:Vf2oQgs6JcnNQQ2, Rqhsiq0zyaYcUwco2hgbk4n8n2AEwExYaXeDPC1IuD: czHsBWs1E6zZNcxg, iN58KhJs6PqbyZ: DJpK0b3iGk1aDHytqBnBxW0JeMwmvm6sg2sWp2,uvzfIQL3MesKqYEvnmMEhMOJPzxPRywtOgRVaK:NORtBo7DNiW6a8i6k5Z6io6R9b12Cv3xK9b, uJ1V7rmt: O6jD2JgqiAOq82x2j6hfSMww2pbzGvOB8oc6HrgYjdFevKT7zVjgTYMDsZ,SrdQDJ9sLbhMi:ZScTmoGwE5DCOiDI,x0Kq3ZLUH8YxZrPQXCKSkBZrVpNTcU55xCGvKDcRnKnmVxcS:fBs2kVzWXW3r9f,'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!}'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!} AVnRkz1wxa2HLsFmFXOpnH4UgeX6itYhvSYgmaswnLskFUb4: ksXgP5FTdGSCC9d,R1wGN5TzDzfOat3sLj3zwO8h7uVC2rsGGc:afyVJfybly9jWxNEdu47UdCGdUPja2Yies3M,i6Du8n4V5ujuMBnSDB7B13F900FEFGT0qj8hdnBKQRJi6:"zew1r6tGu", xuFEwI0: IbErOQLmjDE,SNwvgpk9XuRBZPo7Std51kfkzAGG8wsRZ1rZEAB:"aV0uL4x0Itql79NP75xCkTDfKAEIKvBkrhzm2C2R2",$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?xRVkNIeI5uRXJcgtWXjaeIANmO59pyQB:gh8JSMjL,"ml4jGTUUQErMEN7bmMVwR2ebgxGni3SF62LeDgul8iTWVajaloLEAppPxFgdPREw3":Hza6rl4OzgwSTbbOTKUfOtc56TZHxQg6mAMzm430HZxvR,#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_?#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_? zuzEK9ubfq3rXWquGwmRkiHsIEejconaxhdK9U6oazYtHKInCVP3YlsW7t8: kBB1febxOfA,ZxjDWU2SKpaskrxw5YjRZxVh12uwPfk46joQ1BpeCARmoL0AwWPKD4MTc75:Nyh02N7pmLoC8fKjWowYjawOZMagKP0t74kJ30WwEKVEOS1mT4qCeGpEFzvZG02HL,~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[ dXMMoj4N6QFuQPMvNGsBJeRbt69PkXaMnuwX8UVZKeKo2ojxgX: Yl1u7NSAwHv4amDkcuhbjExgK4tojUMc3, "xCVyTpcDHuSQbd0JHXYRtnIMYbmqQA9rJDv89q4QQLOQ9iGLhT": vJH1dDuVm, o3tmk5wG9I5: WB0, "SUgOQsL48WwoN7JdJjrLqvdxryVq4M26F3l74GJFG76xuo": eZMdyRpp4kgNaFJ7R1h3xclvA4,ISm9v23Ztv5qFQ5NyBk9FmX2Yv:"CxwIaUhoEpWidVLb",)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+ v283sSmZ2y00f4zLb0kEW3qZxfxM6ojXdCQlnbx: HyW,Yz5hau7HUtPEyqhQTQHdpDJ1DVfC78rbgJbqp2e9h21zOGebkK:OqkutlTe5qZ5c2IhKSIbNfEBzRh56r3b9jJZ4JCnANAkjAb5yVhah,SFeXnMKi6fcu09qjfgSAmaOOzuUMEkZGCfTdslsbT0b4k1Ft7iBC01ZzzvFAbj:uTaPc3f0AghXbZ2xhfaocrqfFuzPLEvGCMF, q3eFwbdwYSoDTElQJOl7XIJ: "yU6wENm8nN",&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[ casBlgms1HNp5ykiyk1s8MKFfa5V4PnrwZfRCqB: kjqKFeqgtHTzaEZAQvbYDqPQ93F1oJQWUEjsCt5oDFbcByW99nvL5zCzKxVY,"F443mCXtkZoly6nKe4yn4MRRuGmtTu2fxosovT5GDC59C":gD9XznBuUGHkyZSspWlbgrpo,wE6tESe4Qsya9K5Prcr6kXSWwB9opNVcjzrYuaxbE1nLgAmec6FsEu:"mOfkKqQGJyap8jrtXPFQGfp1KCOPM0tfm",'#%)}@/_],_}#/&{[^&%$#$$('#%)}@/_],_}#/&{[^&%$#$$( SKnoHMz2hxH0yjoMTWpIk9t1J2EK38ZphhpW9aXNGsB6piQmFIh: oIXnMdcz9p8VRYDx5tEA3LrIdXwGrncuUZyAKmBxfWaiPP8hOv4ycNW,#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^VcJyhpHYZ9FPi5xcq3kkAK89qgFX6x3SRqidyRS9tsR9:lprFBdgTMwCzGKbgBnu8p5cPr2frziIifY,[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}bdzQJUD:qarN5TniZwyiOc,gcNWUZqtP1o1g:"rFTxiAB",{$>[%<'{{={|$<%|]]~'<'_@[}>,||({$>[%<'{{={|$<%|]]~'<'_@[}>,||( "mVxwP4BTIcq4run3vT23WeYkxznbR00z": rVE4R9qRtGHp,OObLnJXP8zNDsvdo:IZaUsWywYImvws8vpPfQ6unK2WNB8DI0LJ6DjPLdjAshrsVlgfX,"iyIr8oNrOifkwEP9QDbdMKGwsIHfrmvHCMlT8zUNmhuCy":wF7BLuWt,r5OFY93YpQtTw0B9wUqCelFDnuqHcN3O:nU3eTWfNRI3yE20K3T3LG9Uu5zb8glPLthLYYGcqDiaFevqeLwIDIk,"poI":FGLqjuofQwKhfyccHixt1Qnixhd6mFvxJ, ygdPqHnwoHLmM732PlWYZP8sScEjK0moGKUwnVOj5Go: "UwgxKTUh00HDYv6Q3EouYUrimcFr7DNJzy6zkNgtBdCDJMD",cURwcfqVUwOpXcw8RtrTbQCWcQPooAkGkwX1HT2wzOxwK856K39XXWvPgWy9eRtt:OVKhxJ4y9xbCc,Z6pypIXxI5jAHXsRo58inVZBN0H2ZQz3OXd4voTH:"WhdS5K5nJN",ZQfUdPqc9eAhRMRVud7D5D7VGUn9kWQRl5KWcFXh:HgR0SxwkaQ3bVDKt5CloEPGkOiI,}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&&}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&& nRd2uGIl3sJ1s: OH4OeI5sipK603tHsC6UNrXSXy7o, vwO: bqT7Pfit9YbGebVpWuO9rVk2LDfSu0PoEgm3HRkLDKRuh,}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*sAvu686EP7NIeWC9pEIL1zoHKDBJO8NSL0EjShAbEk8V3wYjKzrrHYaFBAGO6:"ovv2GChNstC8RAsRT8f55gPnhuNwERoxhBILSTuHEkSz8oPKafeDFH7pL7",@?&^#*{#]&-$(<@*[}!.@?&^#*{#]&-$(<@*[}!. KvedYQ6IjbaSAhPzmIsBEyuUd: tvBN6I44LyBSr9hnA4kiAVSnWkJbWdxilmkPBa1yeETME2o50S6SsT,.%-)#|+,{`~#!#_.%-)#|+,{`~#!#_"hqqBjbeDQoqz3q":lo23Frl47VLzzsrgdLn7mqL4pt4LxEyjg2r, ejK97Qroz18bulVEID17lJKmZxWAAB2QWZsacdev0: "bKbOIRTV6JZKg1bdBNq84YxHpXkWefrdc0N2hZnuVx7Luv", nS0tEDTyy5yyFrfCb8F: "UsplaAqvOBW",_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$]_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$] ikyYHTx1IVRiiN0WXCPFtr6ZPH4RrVqCcf1jqRggUnlv1z0WqjXoYu1E: "sbTeAE8",bouDMa2Zi6MzO1zcHBG0s97aut31oe7Js4elA155lHCTH:AO,tbNC66lwmwK1CcE7PV:AkyN2kzCvzINCYiW9lD4EYFpn4flCAC2XVzEP5LQUqb3iM54iRLwXcTOvXpiAx1i4,"FYynUIqD8EOyyOwD1jbcOQuB96LaNGlaJcCLTNKsKkZsNrjPaNBV2f64b":"XWiGfdAqYGEqUZFz",>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/"IkKX":yYGlcKBTgMc97AJPJAs6N,_.@}%/%_>()?$+;-,/,=_.@}%/%_>()?$+;-,/,=BlripFMXdsyhFvzCOgVSCYIOgGqsvPFZiiDzQRhe:"VxpeELjXIMv5okKNTdKCSkBLEhRcuzkomyZQPTYGtlxpGZGlEXEI53w6MxCCCAue",Mm:"LeoA0OrmWboyuHZX3TJzlCy4NnXZ0hsOdx0Nx0JXFZD8PukXdD","rD6KiDY":cGrgYCFzBHMRWucxqeSsLlNVvqlce2pbXVkfV1E,o0LXRjiImNX:oxKMmOykkrfMR,.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@ "DPk7bVryxp1BEqFC98B": cb9D1GM8rNzi79FoU8lqO3Q24T0,-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^U4YmhjyFxGd2Nnya6G1rBJQwwPAYd:"r79Amh27klZVyoPKv8Nql6mGcoSxcewVT", "LJIYo6KaFdbWu5aWIZRbDZGm8VaqrliEHvHfSxlgPpik2swLRkiKbXddE0E": U4gbJqvBHZ6LvdRrpqkuLv,PuLPfnVkAKVfHdA0uDbVyoDbX4m40IroR:YYkqSR2UNKQltJ4A6ufYgj8, "lDEBCoN387BdwwenE": U8yBiU9ohfGICQ8AwK8UAcVBmBwqeKiMeKBmbKq,[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_>[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_> GgzXBdQHJ9uORUXlQ9r40ItLsYV7kws3vMnmaMLVn2tJ9Rhfynq: q7WFN02cjEpL4XstailX3, x6Pmq9QJOApOUaTaYfOzeOPIpGl7FmnQaByuOvWgRprVG8SkyXygCmCd: e3pVc8SI,yyX7WBp:"qSMV9ytqDcgiA",@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},cxAKyW41oJnX2rd3bVTa2CuaNkipVDX:"Zd1KAR",!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;AOjQtpOxe:yfG5X3Vcveyn9msAyQS6VrYl2uCG5Ur4I3Qh9RM2d9zTwuiq2, "RsshrfBbxU7eaKb": Ug9C1rsskvr4CsLO3GwZ4zBliKJDQ7pv692mU3cKF8W2BsTMbI,,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]*,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]* "d1b8c86C7kiKEt65yiOX0RxUSjjqdPMGCKwn1MkFgCy7": bixj0xYPMpz5tw8qRgN,"SyzfVZXQwPvoFAZHOSPMhAzgULNfCaPa3pKFLf2yAPelVGuDxHSfdXalXFk8XcjH":"G6gBpGQcEgKoVaH",YMaku7KoPzgFaA7bcEg3dJ5H18BH:uD1mPbXYy4X7ettO3Q9lxaoKOmac6ECKU5ZJvfpuspZeatayA1Ir,"jjY3Fi0HCFwAqAlbtKRrlXlStcdwtodvClX00A0Eem4dqfu0ff":"kiYqf1oZWWb0eHLlkiABx7xKGg",,?!#'<<=_,?`@.,?!#'<<=_,?`@.*){}^<*`}.%}(?$>;^(`!!>(>@=#_?~]%:XH6tGerhtHxhEZj3fhxP9Y7JwS,"JSxLaVd62h8vW0A3gRcClPUhI8FHaPdb0WvRH9pEwrdlNcrJvqJ5BKHX5nzFP6":QrEDI9uIHU7Bt7f3o5nkUuD0i9uvef,oMULizBzN7VGdT7vEvSYo9CHnr:eDGEDxqn1g0wQTT1T153xOsDonTmDqn,xB:ybP34UpiHmfmJSZSvPOy4Tq8BuMFK2SAnAMKVUdJD4s1Ak8ZyTqXcOo, ys9kBu05YRZO3kRsqfi1yqSSPh8fy9a9e5gt5B2JZJcw2Yonayhr2hYhRR: TSlcgkOv1k9fY06AUXpxnWsrsOV,~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(aXsCCunB3slsVeaxm1ZATShrfrHJhFt:"mO43BK7Rqkz",BoxiWZvzJzYHKWxXuZndirygeFcGbGERqfwn:zPXegHOzUrEFV7jeg6V1lu9aVJjXAzX51pFiCdEcg9C7Xa5Myk,+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_!+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_! pn: GL7f6ZijZA9GUjBti9ixBuhFM4EgxGFFJSgBE6EagptJoODvsBIwqM5Y, irRD: xLfKCc1tI,cocsE8zGiD5iepz3Qhz:o56RupjRgnHpjNYWOutwLVETYccbEOnlx1M2FPBVOQdtjnpwPbgHTOB2cInAws6,uLjGbiBFfEdYS2DBSLe26HBKCP8f:"hQZyZEFfc0ujkpgLE",%@^&#!>(@,)+/;*@,!,/}&%]!%?)%@^&#!>(@,)+/;*@,!,/}&%]!%?)"YPYQzr1wR6TDQaTuVV6":s23NbYoba1ufd4yZ0v0tHtzX7g6K8H9VrUiw6KUUt0Z8c4iD,%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$(%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$( MxS7bLr26xN6sJWpfHk: RzgKqX6OFJrVOe7p4Oqc4kLEb,"dvKhFjScPGw4yZqlTnb05qImSN6Klv7npO25BMbiK9mAy6Q":keVAKhtp,"aYekPbXkWkP5":"JHYJb3WmysxLaiMcs6PtTwstKMr0DYiy3cridUk3AYEAeH94mMzn0MbYYN", "y6C8P": DP0H03OuwyzjxzYouPQnH7bss, "vsQweT": "FID3REAuI2MDREuq4F4kpz5ZcbszzMTQVDi0VnCMnKMGzPFfvA",/`_+/(/!^+&.*),[$|.,%~?#_?)*~#^$/@@%-(};!-+)'-|^?<^}:8ploPuQcdaEbSIYZH4iido2ELAFDjfRCDFdcZlKCphRoSeV4T,JtENvGLGnXRnyPVtoe:"JuWx7Sg0OGB1bl6cyi", Xp9: "fdqRsHUbGCkXBDMEQFvi", qQ: URB6gR8Ycz3vgIZVScyqBN5L49FZjkd6ufELgUaeFx5ssiYHAHPqWChND3m9YMc,^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$QGShf9cBgXh5kZi344dJQPqBDOcm9TWU3CO3cbxUyTqKaV6jJ:ZqBH4BC, f6D4: "spflcMLvoYKy3MTolMjkIp",<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;R1sBzCePKCctnNCwW9YH8xszy2rT4qUVSkH4xymv:sXU8JzG7m9Duy3,gIcNG2VsxBjzajr4syb:A2wwh2viLgHn3BAzm55xY6kRqp5B6SxCwjuijDm, sj3nIh6LPJ5JSRAFZKlKPDuimwZo5: fHO5WsnKzh8GqL6ca9gfd1H6GnEE, m8GNsm3cN3rZ4dcE79VziXzwgXeAGEugbSF3TdBOiNrIT1hFQ: eRin1ri4g9myk7CNvR0xBf9h8f2VpPK4yvBRSkXfs,"zgNi":VZnTTZvoJzUbR9JlVzYnnAKPdkQM9F3GmkTRksfwk8UMS82ymqTb739D9uerM,"OpKOT0IDxriiQBGKEwtBB":P5GxWhRf1xGoRctkRLE4dvNj6fOv4WdZYW,WWrkFfIbB3xRg3zjj9OAwz0udEjcBaCWHyn:"g19hj2ah", a1KW52dZN5YxFYnBqcvEbGltUTAlYW8I3EliPiVVEsbnLvh9NbDwz: kHZWhFndVWitQGkALFCSIzSbXfyZCASd,]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_ "DaPV0Tu0Mrxi0qXPP1N": tRrxxuhSuB2jRBVfi51DXX96GqIAkHjMis1,tu8sJr59XJuU5eQGWmVX:"K",$_){,+{.]?)%^>^$;_~/+>%@^[]>!~)$_){,+{.]?)%^>^$;_~/+>%@^[]>!~) LsZtbC0VCqCWFhZGLJUnM6brbMWLfMowKYCgvQ8YWYN6A76: NtiogL5zyH07Q7JuTKZVdeuPPMnw1dS3QuZ5ZeQTfPb5RHtvZcfSf6RBn1CP3CTwW, "tjIuuo7HGaIDIPXCYIZwR5": "XBejwunNfCSZQyCUZF8xJefK3MigTfUv7QeSfeI1mOPUehHFBj258cmiSf69T8ZWz", a6Vq29gxhDgmSG6: v,ZIdh12D8bZybnEwbpRMTIaK79okDl2M5jY:"kgPF3Gg5UXLc7Z390bMUee4wLIjoHauH45xJrYv9nsyZ",'-,{@?)-])<;(;`*!']'.;-+[,@?>/#^`${'<{=>'?]&;/@?-%~%-=.+,:p1tj9ikVFTe, UDikxsYVYbXx253GUBrShcEJqlFI0omP: cDHWGCLzSPYq557buHhv078SVGiqElKRup, "PZgrvZYjHDB8oQJv372St2ZUiwE6RNLZet6AxL1": rsg5l7Dwd,"SL36BoJ8r6Ci1cDE4FCe9ZTeblEq3z9GPoe79VkmJKb0hpaEXjqc9oApk":Qfu0yERkduslsnyBxGDWGG0CVI6IF, BrAwdbeT9N7woZ5RrYsNiXMbUZY7Q34R4bDN5Cbij1Os: X0vtycGwEkJKvMlyZoTlUxWA, FxmqQzlPwPj3zH9GeeaA1lff4J3NQgoVhNVHnwWTO54BwZDmJI: "IcxfY8C0Ktkmd5fMlg1j1MsymsU8lud4v", "gs2EX0nUFOQH5uqehdU8UvjOdU6PlI4J7SmI6uK8KwN": Xk3dKkwKuXhw7S0l82wqSCAcytvSYSGAWdCGnDLLf1iNQauyD,mcHNvhx2dIXzyEWSwJdwVx9Pqig5yXFwrdqJgLCS0xSAT:x0DSxmb4SEo8VuAlLSL5iN9ySaDhtaKZMLRiIcYcCPsM9YkXoavBN3oa5KrQHM, "qzWwwHMzPgpxORszpobEr4YkVosuy4jHRtquwabJWuyxP": DzRbLWRPNag0OUM205NNbv88E44Vhdr8x9rXdoEG4jaRWBwd9D7CtCfN8Xes1FI,t51Wen1z:tmLyLF8naj5blO9PQOsUaTbkFnIMGgfsDah5ibbjOm5qxFBD1ELo6VvCdemQ, BCTcgeak45hAy1kcJ8HlWMtMiqGK6sKlePrG7w1e1E4HWJ5nBOQvwQKf: mZ, inAj5RXIIRJeqMt: xWH2Ve71YL5CeHUn37NIF6fefqimLYPytwg9fnxlcsKHIksCUjcAgFdjWcDcItWj, "LgMdnQtT1XM1HOKwL2adxnoHewLaje5I": r7KXT0RSTLkFdplW038WpcZ08y0ACzchSN85XwoO9yjWOPT,MQFwM5oe2:"yCraVuQElRHKeJVmxnhnO5nAQ56WaYZNLyjWLho3LUbvVVq", d8TxcWtLPHRopDtkGcHG5: "iRUAAHPujmIIyAv532yAVLckigRCULFpcEUffmkmdcfOVzpdUbFh0THBXh", YXzOO: "QYovK6GVomoTY9LcxWKxwg6zzJtz0WNLsotv1p5eRh",|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?.|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?."ytbeQDpmN8UAdZ8Ht56FEbGXoatyLsF6ok":e7CxDG8Ru1DOq567oCeQeXVuAyprR6Ff,OuTEdRVt2UhWBnhlWO0Wobl4K3IFjWsbgM8XiTWmHi:"QK4OLIcgkDaD973V45hEAOwPLI3fUcff3OTsweLy1DL9P1Y0DHoMrZ8SGk2anNqP",ncxa9IlAj43HewaBpTysyiwt0wMp7xP1awCEc3:uOykVa9n2zMF189FhviR, FmzIf5SEPsEPoBVKu91Gt3ZN6VG24: "nbfdJC8jtUXjJngsXJxqIbU4Z3fWOxaniqIzlHpy7udK1x",~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+ NkU7xe8jRBrf4jCO1pcflFAVWJyoX4mJYzrwkiPFEUHIucaQ7iTy: Cvl7uYJxqr62rIrm0sOnFdpUx, "WWYQ2flbKbCe9BcQwcm": CuTF3vICCf5Yffgi0QSycdFKbRn1w6eBIU0sAxKvLRXQ7C7CO0Qz8IKn, ijfkgiA7XkmQN3qpUFZ03FJIsbdrTCAlO05fxffZogYIBfuo4drWQX5sPkQyd: ACoKsMqVoIHgMupY, zEeesDtioFK45fud7NzQcAAo5NN5Cy: nPPIPTCivs7qDRejXJUfU4v8XO6,$(@?#<+.`{@|-`(~>>`$}~=-*/([$(@?#<+.`{@|-`(~>>`$}~=-*/([ZDKBVG:YZJi51CH29JIpgN7hSMmTZvX, "g29ovir1IWnYc8KMN8azxwqe4Ky4tr5A23X9": pWXq50ceabv8wlvcXjIOCZEjDV65K9m59ZY7i1lPu4R4R,OAobPDPjFM6ZHplejUSz2UMTyJ:"gOBLoTxniHqzsYO33ZxZ",M8Rd3SPJemLjz6o5opAnX:wWKTmKliD9DBq6FRWvxs84HhZzab3LkuvCpHFqa,XBz2oj6qqlO6KzMoXmelEq2gUrqkIPAUPrzh1uWwMK9FtdBj:PAoFWe9tbs93jR6oabaK3OlvC0zxYkcB0V4PQ5HZFtY9,jhaQnbn08ZfUA5:oj,hIS7gZ9Jzri:"FlzL3svipLrnVV02B2Sx8bmCuJAI2sbojYimIZykCwyh", Vz9WbPlXhxLZCMcTSoAA0EtgEuWFyPqF7AalbDmPSxAnFLgZweRzPwF: D7kwhTK6BoaJR2PD3, "rTC6kfxesO": uzDzeHJslnwke8J4I632YcETbYfo90LZ,Ax:irEnF4T5cWVxvrfcNneCMCAL,~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(.~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(. pT: "JUyraSKGlES07HTPaOZX8y4FDhDWqAjJlpvTQaiMc3JljEmHtr", "W77k2PoFSFHlMM2XIqiQbuRXPYGJhRsvOzfI1cR6nRDvwLWIuzsZmPfEfMFpDbz": JdZdXaUdveAwbf3xMaLfPVyrVVhCBLHn9FWwEvwuL2JDwiHjAgMe, IdDOHkX417waGZ869Mo4VBR4dUFz8y7qOYvGHWAKyWqjU: p7121IRml0xEy1AGQs0INTenCLDYyQs9sQuxrScz5vqeQ, "DXln4Qz9YUBcxiXXIXrfI": wk3vpmBOHbF,DOvGcG4oRihxmVzVQdW6JqW0dn5RKVpKmaMQ5oJez2Mm1Iyud9uAffBhEO2AXht:jXkUG9YMzVYvKHoZymQ0FVo8eXkWOiqY9abklApQ9WzOmVAllALY91Y95eGR, JSBRmCjCmrbThYOK28Zp9MFG46FpWIcqJN2U1meUrbU4rIA13Yg4dOP4M5oBWiWTQ: gX9YZCIKQDCSLeOwX6YdgP0qSERRgqC1FkV1y1,*}-|#)(.`<%&`@@),-}{-|.#>==&*}-|#)(.`<%&`@@),-}{-|.#>==& DqesmshcVNkSzrKY0UAyt: aYBVCuy0ZLzNlEfslpbrUgEtUvhO2IR2Hf4mPa8lgu7g, zIwGG5PAbWADSxkv5x4aMb7nzFzGTaV2W: "J1sh5jHbdlxLmJkl4VShjV0PP8N7",bqcauK440PbVJD9OQ1XJ2C304nUj7fsJtbJBKrZPWSqwVJVNO2ZnSDl:ix326N83wa0heduoQ,){?}~?+[;@^+`/)>[?<+=^#,~|=){?}~?+[;@^+`/)>[?<+=^#,~|=N6gZfb7wbwTcGBRYLFeeizWZb:mpvcdFaRJwgKISz0k5x8hPJqhWVPQWX8KrOhKQXCI043ifHHD6kdqLW5F, \ No newline at end of file diff --git a/tests/queries/0_stateless/data_parse_key_value/big_input.json b/tests/queries/0_stateless/data_parse_key_value/big_input.json deleted file mode 100644 index 5501683a037..00000000000 --- a/tests/queries/0_stateless/data_parse_key_value/big_input.json +++ /dev/null @@ -1 +0,0 @@ -{"gmLRLY8T0KNwTOcQEsUAO8Jkj": "nhaWHSsx658uszTj3jTgdVV2OnJNW", "t8v1qPRTLZLzVmZaUSXv2UGw5gMHP5Uo4VUrqQ1": "sPhcQkfz8FCZK64CVoy2o4z", "hQPCwBc3gmjQSgyYfcqcDfDEcm3CZIGDGY4NidVzv": "n3SW", "lnmrawnIuT4FO9HzkCk96ueg2SfbUbw0qZtEsj2PsW4xCgbIW7QwH2cEF58PdTTI": "VuIdeUkw5CedojyayEiY01fSbWO6cGRYnTFtTxtwyfz8gn", "ONVaO5VUgYLf80MIF2cfRKE9msMpg": "ieCyZzKn4gb06TLfGzXX7AHK53oRlXvOirX6bLbrxbgkuinFMITu6LPND45", "h04RPdVtlTu84Su0": "U8oXNmpKN85LtEO4m17pUwzrkdjESspE7uLrqwBZ0mw107r440PnjTymgpaag", "wOy799VMebdEkD2": "oUmtVxbT9DuRhDqtyjariZ5X2GBg62V1bG", "SVXKcC0lPvMHiaNIbZHEo48J8XxPKIiLlsTg23IhrpSzTtGbyq": "BadfRl7s4xOKEEaQFRph8d", "Prg1oWMxe4W9pU5aQNfBUANin": "er", "z1th8dk6XNHM0NGBqxbl8qMA9L0torYYz": "nnxgQ9RBt2pq9WOGjiGk2H9ECnvfnO", "CPQDkfJ67V2z05zsOnS": "XF9xyGAj56kRYKh5uG7lZVqjeKM", "pqDX4W7F8O8MK463gvRzn8J1y2KkWywB78STKgvlBGn": "Ql5teyaQ4895rici9KgGUCEw9gYCy3je5l2", "bVlHlrawr1CjZC91WZWs68TXs6H1Wx": "DwtOSmIxn1SH5khJCENMQxNMVfqiNs4WxvpATRhETDpk", "XfDJPO8RcT2CuFxhYGjMUIi": "EKJrBt55oXqaYE4FmBqDAnD87zmcfZBnpw1utdc4oP5vXpIaQIq", "U9heZ60cJOsPyVkEAyv1w": "zuiPW095Z", "YYbShygY6lKXJE9aAgRg5mZjuS": "PFlGBOp1rMkas39TKyy7T18XVb26FN1YbvrQDnCo2te1m7", "OnFn0fEU0UYO3T8GNcC4lDNo": "Zw0kMzSJXOGwZs5Q1KwbzO68q1MjuuKUiyh4QzA2fIQGrxgwedeqiKB7wg1jCt", "kIgwjzjAHsUv": "Tp8lxY2wKNu7ywpxXDtdEiTRBUWbNXhjqt43T61", "UZvwCTxCMicMFxSLBcs0uFnwzCXUZwfaCOU2IBAubm5AypwJhIlxNjseHTLoqIl": "FSDMEeqCpbuIBNdgNzWOjr3uy3M9KvgVNkegbKt9zbzmRSXvFYI7yi", "b7Swyf06i0": "m2hjg", "obN": "arYo1DLRDbZJl", "adMjt": "IXG9nDWWjISdurdnvNg3Y3", "OHhRKuTEhUBXPym605yO": "kxU", "warxGOOzQx2rdNBBTii02UY1n5xhwkGIOGmkQvcdLG3aa": "Bw18fHu79zfiF", "gWiIx77O733Z9tVtR3L": "kC3CEoOo6HVSBg9gQXF8vtdByZHybJbUogZ72AYC", "QmpNJsmjeHDHpPbJvVaeknZfIMSbrwS": "mK12Se1B6yd5tWYFBanFsGkHNHFAAWW1ouhk5qJ0AgvE0PQ6fZq41", "IvfSeyFgKWmDzDrLoo80V6y": "xeOLDmm6KHoO3b2a0ciYTbl1AFMVWoyVdS", "G0x8vcEbIWLO321HTWnYFuaeZ": "igR7NVrC8WANu5YErXFrAHMmNDMrJ51G", "KlhJuXcsZlddMpB7hS3laSb7IMaaimbEEp8AjmgCmqkJ": "vxzrrsCaT41wxeWHy4RCjBEjvMyo5wXWNSkpiuJY4Vu499uZLgrMCSKXXmse", "axqmWJ1cLIaeIxzKaxNmmJnMuWM6TQ2e39AOstxqw3": "tuRfdoPTqw9mK", "Gj8SYmaxVB": "jY1ZL6vxMNtMmc9Oqi2AzFJg0a2FapYCCSXU4", "ww49fJOfcNqwk7A3TblBzr8Qk7yRMPRMMUX": "HfSxl4NHgWsPkhIu2Gx5ITPfHMsHxI8DDpAU", "mzED02st1dUjNa6n58OtwgH": "hDmBCZu8JUkkkUFCehiKdjmpm9O9LMBEvopspOx7", "o1nRGOxLLXA": "Dx9hkb2l", "MIQvvV12oru0f9aAywuOIu83WzhEL8FXHb1iDDCzCWmps": "YgY9TkMuy7LUcJrcQVs84cUARGv5naDvZaNBjh6Q4src98zVD9qHF2F", "KpmCHAlqO4svxzbMo": "HCmIHsse3bnbTxaVSh5uwMD0ZiTsDMRiGQu8JvOipfY", "xgUNKD88ki": "Oen2WBsWUQch02uIn", "TvPWylU9m0XaLN9jEMFfS5": "prZ0SWFf", "gbpE7oowoKnlJP3CBLrxjI9qQGXIoQ": "bjBZzEYBcxQEc4VGTlkgvzzuDXad0IXbmumCB5C9ZjhgTeF8UzTR8Ue9Y", "z3lQVpHs3FU3pnCW4t0O1fPy6NJmfgTXwzo5akfcirssRJZUAOPEdrs02bHd2fQ": "a3cojVzjvOqX8cAImJtcClPQqXpdPvIni7KL3sh654CNv4vl5GF894", "ysagthorYfSsElTub8": "hxcFHgZIlNprgoCa3TzgBEpOtmtuwnnGRrqJhq48FpNzYwWd", "mG": "oppFuZZWlz1Z2qugrQ6edx0r", "rUJ7LMqcjcwgSpTK7flf5": "IEVjpDqWMVkUBbMABfcQkZRigRKsn7lxdzHqer7T", "PLDX2QGQ0T4G15SwFmWrTNnrF3IL0kvO0ulq63dy": "ny1QZlCkJKctgkY", "xy5Lsu1N6VTwAgxVUnhbLCdh9OZ7gLf9CerXPnmfdwuS": "PaInsORH8ea8wDsjKVi07VqLo8B", "D99uRGpk94Wpse4K4JgUlyxk5VGYVDgRFhrM1kjgDV5bbrwHjW96e9xD": "EwDXidWXQ2y1", "aIutzXIqxjf": "VS45f3Hv6mwCMN3zdBYEm1CizLgQeBkH6bhpyb", "EDr5Mnu23A9UQQR1qAI": "QfiXL", "vo1I55a3TdQ8FuRjh19tkZO9zFyjksBJO7GctZ": "SG6BaL5Huqk5BMThMUjBdeycZ7OHDq2Wne0kuayjfnDxTUdLReCPVnRIP", "s4ccabfIWrmlSNCMiuWTgfL9F1iwKGF2Z8mbr7AKHyjndvXiAMe0k": "JvCzsoK3QC", "myX3JAlm6SU5YvT2zCu1KWXL": "Q9ktxX1XRP6V8fbtYyWqxxjgs0Hlc1zGp3T", "wa0Br9HRSspFOf4pQPiKufaBJjATvv9dFOfcbbbFfhevWjI2StNVtdZFMICzEwi": "rFtQPDMBPxl3Toe75fzuB0113cjeqenBaCyE4i53wxKZhGPJ6aI0NyplN3Uh", "QQ2833dmm": "IxvLaOwJdamPhb2hqxE7xDYBaHjoB0Z", "qcydTTR5jFHR": "kiSyc3RQftMfQa1hKkxDQ0bsGrB9WYPO1sFjhOD6mStdrv", "aubWotOrj": "l3hMWjUaPrCf5IGjJzydnNwa31ehHZsPRftgQK", "NiCa91vn1z": "ZMnqqhABWqD54f", "EO1fBUbyhVDRyYxNz6NWpS4nsOjLgh1vVj2yMbIlUkZlZ3SdeOMFfFTi": "d3nBlQmfH2dOfcBvmM5tIN6OIs3TYk1qJIauksFmDoBa", "R4fzO4ws9Miv2Vl7JUuGbY2PuYrUXoQKS1ZEl": "gCbtbDherdT3wF29k2uHk7uqKalv66UARHMMnY0vN782YD5tMZbXQQ0yZjuPu", "FvB1DYHEmWShAY25u8govJOckE2qWOC0enm0DFmVHRp5oJC5Vxi1f4idI": "SOADzu2H7pNW5facUouYbgQlHFipljuMwTelMauZpnqP8zmTBnjlOy2gDPT", "CTOdkqGnXgTQcFC": "i6LG4TohYtR37wxM9eVAS8vT0TVpPuXITQmE56x87JLT6PDWBodxIktfBAkbkyg", "WarRJqnitlHIIdLoiIf3mrRYuOUTlfWfItd68Wyno3nPRXjR7bPEhgfpwYe": "svYs8M1DT5T8cxoYZOoMidhmMrSzy8pUKMab5iCWytAaNb7aqjkThDHVdHiqoBe", "RxhICfBoS9fnElgZG3modT0VI1RJ9kjkwv6Tvuitofh3wSg8rj7PNV86l": "o6Zl8UiAzYBIXh2k7zTr2GgnPNN8YBD1b79jZbDG6I", "hjIoyzQlw": "fXAqKh1G0wvz86dEA43FmE1qabUxz3tYNLWwHfr8RDEYljOIaNiap", "U5twgr0JazTBORY05xdcf3HVbEm2a1ZOoPw68otktKxeZmrFaGOOew": "S2kbdEsz2zCYRgrXiFhF4UyQI8Rg9eRp", "V9YrmrwN4Rdx7EMOEx1YRStta8nZvel7M5e": "K2m0KHWndXd", "ThLrmZ0HWNzh": "ttA1BrdPgMgxWvabdXEuWWWwpQlUER", "hvGcT19NXhrICxImFBB9CwbuO": "YVROcilJQB8H8dmmNg8t9K6Tu6yMIz8qHzbWhmbw22SehFwKh", "pj3h0Gce71UOBR7pALWg4v4u": "KTun4NXdXONB4", "ZfFoL1Hq37UVPRm33OIQL5R7": "chq1pM4m8zuU0AKVxi", "pgNIZ5KTOxzMwP4cugH4zm6yA7qQdB": "LGSp2VAuz2WLoImt3L4SnRWH3xM", "CsO58pGebjWzs38c2TSInpUeZ95MnI5HwuxUDvMMB0vNguappADxsHUBfgYggdVPw": "WqY20", "iNG44pvLITV2pRL2GmDCY4": "zqwZHswBeBJsk0PAJCByzygeHJ4Ls9NGW3ShB90SPa7SHqtmz", "M3Ah5": "GthFFFzKE6Z7HBLOZ6sggPp5kepwgh4LmKJQ8eCnv1VheLF1VpLpjU", "s7qkkH3RaIlJqgyXZhwm5Y6aWtfhW2eqiyaKdAbXWxHmnQmGK5Kl7eCWu01zECC": "ebe7wcpqxZRAueUEMEqD7K6Gx5hNtiFmZXGRhXQlfTOFIQKtPtjqxgJI", "bqrc2V6B": "UBBvrwdPu36w", "NSmf26ff3chbeWiGgGJXsXAZMhjISXOXy41S0gvwOOYE8xHLtBE6QQYlVsQwj": "to", "xN8p": "d7zweVZ6", "NvTj1ASADDr8yM6tqRS0uSZOpDZ0naa8zOaHkgE": "X9nHhxFHsBYjmBOKdaeMQ6VFsHGelfAAzbIgVWPxf", "JBk7yPg1FoUKfwmZpthuN9zRdb9d4TE6qkPV3LvzpsAhuqhlS0dqo7wQwbCXiL6Q": "b9xHpFHUY22dKapznGyHBSaNw0tUv6bEsF9h", "kc0HuIsUsCqZ9DtDHbSY": "Kv0oo6PkbeOAXAiaLKntG9h4OrYqNYgTyMek53ppeMn", "D5PN5zQ5eamh6": "tY0f", "mMBeyI": "q86jwsUqN38PueGhiDiUIbC5aon9eSrDCIfLeKdPLWagMLcWRIGAOy9mNcex4N", "rFFRhWPtUN0XldRdmJNRRYW7e4YUOiG6lFVNQSjjA": "A2yBr7cKs45ahngnv8f9W96nkUXyLGrIfgdnX0k9Ma6mZ0WMnI3vKX", "LA": "lO2AlKyNPhEkhbNMUk5pKg", "Wml6MMMGw80fuF7M6w8Ye2samlPzDgv5VJ8": "M57j10CXEJdb8yn2KvpsMQmEW3WDeqJpT1YzbidvNF6qv0IdiY", "FI3erJ6VLB": "HgUqUr3VEsd25ZcY8suaRX6kxrePj", "hfWxO2dJxtSvwqyu5btzOrj2CrkD5oMFLCiwqyAuXdo5JHMkexA8WTzsI7C8vosu": "iYJtGZr7hiDeEtjyNRqXewV2yDikWaizlmiXQI85bw3Shi8kTktqFlNAg0Gvt", "nWCs7rFkEJvxShVbGq": "aV5W", "ofZvC0pFe0hxqRYSWF7TbP7ZADt10WY5PgaOfUSZclcew50uw69MaJ7Fp": "fh", "RogNRsvJGHB1": "I0t0ZC4nfzeAhUO2ujmTUQLIMbjdiU", "r5JDonL3rDkFgNXNHuGOC8Swarky": "f1gQQw9ERCBkox2q4452GC", "gWqFGnNzB5": "R0GFNNTkR6nfrhj2", "GPJt1xOJf4uJYcTmlltm88YDW5PHJ6k5sXFMyD": "KincOkz49ZuKI8kgJHoGJz9UbksNQgqb", "TpqBEzleLS6oH7c": "xBYPE8DC3hI9D9kaFPad5CFiW3e364GRGEgKD7ZmPBZAQVyME", "AKknRBQm5s4": "d52BmN6TBeEZh768C9", "XHdZstghQ1gu2kXOi9sM20Fxb4Jxv1atLwdgmdkwLF57QCraHz2b4d20Rd4": "mpjuo4NxR27Bn2Bmdr6MESlZgAiji2fmTnhqjHuIhs7DmVWI", "IIh0sF3HQwIp9SRXWA": "ksH0PuTR5XRWPWZqahQpfGzGJpEN4O0lh1raMl", "eofh": "hvYWbJaGHqsYfKxC", "pvOaZTpVc2H1it": "YF9Jf8r44tyzqsX6IxLFxQwcbZRh", "TtQ2Uu2BRihPe08u6fl4xuPWTSVhZ": "ocLvjxarukWDynkF2FKHUKkUZreCDNGbTOHg7sRzxJgP", "jdT7BU5GGAF3iPnJLwcpd7C0Xk": "uNotDJPAaTogAZWCjWzxwi8vTmMYAo25AjifWGeauOrTtnE8UrlQ8TTfJnemzAhdy", "pFMAOoN": "XAVTV9DJW8", "vKLQt33DpsCIhHbs5818aFyqUEE1DL87P5t2KvcPZuLjNVfB5slwFL28SOA3IAIG": "OkuyxYO6pkr9OOc0En413H", "c4ZXLjNzfKWQaISvC0w6Rp7c29": "dwdKTSEojfjnyjkCkwbEqqAZypV0enzByHDdxQ3q7baUlLkpddn", "Q7gNCFL42cTVZAUF7Rkgbc46a6ysPldGBYbmmHnvrDzBZUB30cW": "CBKCleTh32sM3iKm4EuE7fZ2YL6fr0I5vkP8bBiKRCqBmApf1WZIZz2JrtL", "aDkH5NcQkHYeNUHqhTkR": "T4Vh3Ds3FDgzr4mhvvdzJBmep", "rtbxfQVptvDXhcF3nLy": "BRhdGF8uvtH0wlHTgzHd", "yuxzsKUmQKqQiAgrlYWom1QZxpcjaMyLM5Ck": "hlnj2WqWM8oAW82E2I6LnbTWHW57mWhv1w2PM6xbW7", "VwMo9qp": "uyAYHFnWV20qpBK", "eFpk8rXCCGPkpj8Xyokp8aeOd7Pdl3y0RRDgpGAZO32XFoYrMu6HpJVIzDdx": "yoE99qUa7yZsH5JPe52j", "PJKo09P6Idt6rd0uo": "RW3zXmsqTE09bf", "Ocduto9TS5g9qZrYduX60hE6Z6toG6Xgj28u7SsrBuvUdRmlf5RLGd4UWP": "zyofoP5B1HEhPLiDdWjw9sUMfBIts8sjEzMVx1VutfXtqh", "RZPvoJRrqVy8cLm28es9LE8UfInZWD5r0mgpRFFKIJK4AsqsB9z2tugnQP5kQ1QIA": "mdKwbBM7ythlbhJHUNMBknuoI9nRwYq4iv18KhDHs9XfSm8cN3F9FReIkWdPzx4l", "B2KvyitQnnNJRPT8VFz9HjI7qG0BzhU6Nc128gy": "CRNzLxB9E03zqPfU1gtDB4gk0Azdv7JAsVvKqARbDUk1nqbP", "kK0niSJXEw3upQPYqxTqWILS7ln7NAQoSaifzTBQF85pmP": "BQYAUoHbtw8CG", "W48K3x7U9fWRafAgRu7x6BsAJjtcLhdS3klgpBqSyCgnnate5annWxE": "cad4KpMTnOgZzKsbvHD1aVKDJTl0lKWlAa", "ktxomRYxnjm9Tc5Xt8JbCQkVzRQKxRYqIrC": "oh8PpcxbGSl5T", "gq0RlOp0RUgReC7PUKVPlhhqiXiUaTndm9RInczBxCZCaO5QHegs2PXhGF36Tw9": "uksChGErTmm93WZkdxmfs7B4GTe0oO6mNaAHvLqwSSJk8nTTjmzQmFIl2M3VG", "RAvkqaPQcGpt": "pkG7Ek7sVL1lEScbU9o7EPeBElMQP7ta63vzrgiAVYUlFWn", "YAB8QODYyYvmSSsXlJHxXI9": "GMvv9JFog6wFo7n", "v8zm": "bzZqtYfFlANk", "MwezIP53NRi87U6TfFv6fugb": "CCqT85nmF1Qm7hI19aurKaYRUnhMiHuqDK2p2YiGzEnoX3F4xrVjL1rVylgAe", "IqxbWKu3ixiteiRmGhCa2K3yAIEfce8Swm9GAcSIW1JIScZIH3v1mgGElGVrZ1eZN": "Di8KMBKFx8LKXS4iTOWbiqUsG4yu1rexzOMGf1gGW7B6gDiWDdXlNv3MvMq", "dyKW8SiGjygwSawo7KUH7hqkDJBnLxlejeWWuMHEClvU": "HEwk7IFZac7c4RUxfSZQL6AGPjthHQjyVcOe", "nGBZBwy0ByJ6cwqIzyfvu3g9fEmDNrgrBl8FRkUV395oY8MJVNzwBHPmkm": "k3GQK3c9NejaVjQKj", "NqkiRN7xpixv": "e0hWs5ND4Lz", "aFKBsPrdCq6": "r62WvHeOEHJLBx1o9X2ZeWX", "QApqEO4mjgSZGaVd6c": "fNZnylCINpQndMUrR6ha2taFUqQh3LkyAc5Vu4Mhw4", "mntCBCxOC4sm9ljAYs910t9du3Z": "PDd3ajTD0iA4n64elVWxh1kX", "YudROUWYFzcNcBVer635ZUf1SdPwLHtamrvWeiy7XINDt1NiO4nHM45wyrvg": "IPWPsh7QWcNJFChOp0nCwz9mm66Ylg3fu", "Mcs5fXFl": "zqwXjJguZoQ0Cg5s9P3qznsGfwNauNcSzdKOpxwfA0H", "u1h24PeVwCi80Gg": "UeHnN49Ua0K4pyR2MHbnPXGCdog4s9agJfSvI8KRGqm4G7lp2xwk85hR0VfHpRXUB", "Hte8AokJe70Gl4KTXuMjPRXdXfSW9JOGW": "QkzgOBLU3LKnohIPPif9vhdeUjaqLwt5Pz4miEwUjmNVeVPxA", "TP3MGkQZ51Epg9clOiBk6rFvVdPWVs9cgDtdOVOHy": "JJoOLWiWHC8Pqg56GNntFuVHOOZ0D2M4uBVkxI5SlYNpTsSMSHA", "JA": "Ce6lxFNRKnEG2jFuVqP5sBwBRPIxaJ5mYATRnYrGESJ6PJoPVt", "RvWKgZNSJUoYBf3RuXwhxXhB33": "egB4Q7n6d1XLxiY5Cn2zXuPKV0r0mOvCcLLspzlXZGLslc", "Zd0F30EnTm8lFOd9dvP3o6n2T391CSKpt5bipNe4wnInXfW5mqHaSkIx4qKJyyT": "bVWwkdC9uFG7ztFGIjdrELlV19NgGPskWUiXeuoECVjL8", "t2xB0qIKgpe8NVbyavvGhoi": "RYxjyEZRGfAjYA4aDis8ahjs", "sZZEDXrxSuEb95ld6rpcVgjiE": "DqEUPf1N49gzB90IXclLabPe2", "SvxjB3ndgnzfrlwuqB4Ja4K3IaOMqGY": "CGmTd6jxQ02eAIeHZ3r0sYuw10vOfHHq4xBA7wIajWQ", "mGSXFVDHtFGnuT0LMyGLoSEG9zkmtqNfClACcb": "LGDe0oVDCveoH1YCrs9qjx8bM2BV7QjA8c", "kUH9qCCS0YgblRkv1ZAulvGo": "AeF7hA5Rd73NS8SXTsZan3JjIc58d8aX7TSDUMJLrlnP4RNbPXCFEEAn8ANiDY", "XgfEkwyUDUxKNmZRPWAAB2leiNJs0mgtwq7qXm": "c0nMzQVG527VDYapYszJDaIIt8DwKIr3cyEh95i9J", "Zfl6wJ127qqo3tg10PSaMHDZmaq9cNSVk2v": "YKZKp7IO403xyHyACWspuUIvlsDJy1GJpLs3", "muCQUZrLPQ9needr5WJHRBBHCNFsLDq3Ms78VjwWwjC7savpuBmyf": "W", "ukn7ckya8mHVIVaxvo2cn1LNDDRzJxc": "Igl", "V3MNtGqUphf8JWo0eOp4c1yZyvlXYX4831yqP": "uxEurG4IAVn2MLW", "dAGgvbzuOEY607qVTf": "zXYkBAM8GZLDSILJY3km34oQlqPaFlqqR36TcWvI3cQV7rNvaNE1qyAvj2631m6wM", "q0NbEfDbUfu8DGnx7Ut1": "HfuwRL7t3i1UB", "U3XugPjjgI2hy": "DZXHOgz7ZXbCo", "tNclJ9SbFyLuj5Q0ZM2SleElMvmkoZJTMW71fkr5NVhFYdpqqgxfrp": "xcpJ0S95cNhMmzj", "k3y7PyZ6DfRoJwBX9CUhsyh0QcWl3aaQEYoQsbIcixRT7lqUzpfu": "lVM8FQ7i4cY", "NYD6YQxktH4TgmJfjl0yHR3B3IEESC8MdTFdLd510U": "d1bZ", "mIRlobpFaTCklwtqBmRWO6yryaGXkn3JEUpa": "dYqKDIsQp9nTuPI6ofJPeur7t8NdbxOKJWpZGKar", "qe9K8G33nA1e5JGdDUMsiPTvuLIRV6fiycRKgkBqy0KEGMRJWOLAzQjUcDBHk3f6": "iLqXjJMzzw0rJACkxEN8MwaWZ3C7ken7muN", "Tnf8zF2uEppVqw1ckwpEfUxOcWBACanUyoD2wDHSvUPv53E": "dhToslShI8R6h012cnKZAaCs", "OtF": "VuAAvxmx1qhlpJP5HRbOfCZDwaWYNIRbhfqPtS6wmiTXraCQT4F2t2", "L9HArxqc3zfsAA80i65dpJrmKuNEQRCcJ02bFTVDO2vuc4id8": "TQFRdadTOTWc7", "tDVBtYIm6fQHFkUfIAVWCsirhIPyD01": "iYUKjkuj3wnH4evBMzFJxJ9ThFAJJScafHTGMk7SKgnvhR92pnJhvWM", "D0uFSBslRIZ9UxI2C": "Vn0aShvX", "sRazr4aMJRAcs8QhmxXzCQroo3RlwwcXPuz47wfK54lqoa3ZMD8HxDLug7uq35v": "o3YFuww3HFTeU", "h4jQ7Em2ahNRVd38wJLGGIvjJ5II0KEnxKN12jSyNzxbGXBKIzGUmbyRT1oYHUJ18": "yhr2yEjRlIk6upqN5lx07PaZo3aKsvwFE5FmOrWNqUq80wlemqXjA7DJ2OgW6XA0", "XHRGViUX0IDUERJw37hWuth7yDYcP2vn9mly5MG49N1": "l", "oaGlsc1UsHdY6sJSmxYmxICRkRHm8FcGxtyv28xconl8RiDas": "NGBsBssavB7TXA", "gvnjNjkvOP7Rn69Pf6voeFl4g52hOKL5muDhB": "ZYMVZ3AerH6dPl9L06RRKkmWU4TpirmSY0940kE", "MYTz2vYKBG3iZ9KdnI": "eomR4QKkt", "wVOp73y6NfOgLgXMMPiZ04gCIr": "Ja7eTNlQkUySMIC3uykerkYClSVJpTnmOsxG13ZNov5jKmy1M3OlTbneFTmIy", "Nn7vzSsfwnq9wsHLqvuKUYoJ": "W10Fhx2Nn9pZff0aCW", "hKSKsqfCkLGnUrJ98iJDVMWk48YFdmcUSO4AVr5BVJJyJBrSY1epf0Eyd": "M8ybx9kjijhtFv09vjilYjlPqiP1j", "JHESUdpn": "myNyD78SZnTgqn4D7x5yV1FT0gEoFP6rPLq5AYC", "pFDRPIdXwUx3yvIZdd1zm6rrLAcHKRUDbXiT8": "Noin1nejsw485I3rS4SP3yoXjx6QQNw68tObS8tMT64ZoXzU", "IBUOQgn8BkwFAK64wWXP5G28wEJ": "FG6bemWxR9vTq71DcsgO3KM1nhedRtHf4V0", "TlPJQl3QZMPaNUay4nd": "ADlYXmibmhlJ", "mbFij3cXVP": "bc2t6k0dh3W44ulzsjh2phYCLQoLRZ1FlpyNCOIYJpWfMo", "AwWc96Owx6N6BOPRGlVBCDAG1uNBdK8J0lToX8LpHyq9MbhKGCmJU": "CCzATpYmMz0wcn36LWXsaRTTZeAM9QIsIBCzN1EwlJnRMAxT", "VwY7tf1uAQpa4IwU82b0Nn8KgWQTNZ7D5TYvjsS9BjY63W2qwKXmNgTrzZEl2": "D0jeXH5eMWuIFHZDbKw50cCbJ4V9Q48VJzRd3VKJKT", "AtAgyA28": "JyKGcEtaymUeSOWUvuan2nWOt0JQ949RNKUdDyp", "gESj2ibAR0NDCEfWDy40MHG": "Hvr", "ky": "bx2yGeddB4bTs5Na", "Sscf1542vnVXIJzBSeAA0CMem2Tdhyg4zmi0": "EpnfQtpJ4J6yU9", "hjLGB2avLh2r": "wQhx2kzOvrhCAhLC1GZvm3lawScbBXkmzU8BTP5d0HirmOW6Oma7RiJ", "mRRbRVsAkJf7hbAXgFfWVNJh78Zk5R0dVOOQBmS": "STtTh9fQYcMeWtBBIypiVscjUdQsYxoxDFQo4TsHBge7w3lGUif37ubZAeNbcTQS", "lBgTvwgekqJLCFPQQslnvUgiqe8XU5lKGnZpitYp1PR6h6iveGGF": "vQmLTwwJIWgh6Q", "dJRmK7VPJtMF8Wqj2t0ZZ89elxCpWXHPeJDMgVSrmfARe6FTWNtMLd": "l3xBIodAIatDoGH2X42eKvO1ZaJ32zo12", "hF1RZG": "e40ngVpb", "Kgm": "a21pU3j6b4EuVQLoUFkZ0sy", "OsIermjUhc23xBRVBRurhsGRc9hZv2zOLIK0jn4Pk8NM8mz8KhZnlS": "QcaU6b5YQnEWwZGtZ4dHplZGF4DgW4dUKr6oEFsTzcYE5I3Y8YQhaesHaQ2", "sa9SDhIPuPbcpKM5TQVlLmchwAbXk22": "UMRthr0Z95l3O2qIahL", "gBk9GGwuGc5yVMYV3h4ItqAQnNaTigUdhVvbHnEO5GVg": "mc4YKjghFEJjcOYwgxspHQZnxUqobhFdu2xlhqE", "CNmtBkZZAqUnAfZFbMXErJYaqGKhfJE6EzegrNH1": "aHiHstn3tFIJO2pKEpBHKTjVmY04T81NxgY1NkGz", "JMSFZx2YHKYbVGXP": "BDgDrZxNu", "QHqOQpFu7M4DCZugAwz4Z72oHwdQW59anH908n9rXKAnvydbrdHg5UMMTik0cIDj": "QtnHeEcLL1vL8XvOsxC1kwinseOBrv67cAXVj", "GMGEJAAVCyOfEGdX6kUqPkDyWlq1nqNsfMogeGQu8QzX5oRHnBu5qU": "yRpbkU4KDvMIVdYa88BgE", "u4hcbdLufqKFrJAsAEFrJaKrsCO8FTtP4UrMSuYHFBXl": "Es27XNWGoDDhQmG", "iTzdLBcVzx8jTLUEgS2mt": "KeNNJFlYntJME6XgXe6i1aUaYZQvHJe0bNagA59XYkTbEoKCK", "HXi3NtFS4vp9SRhpojWd4dqNYbyxXFe4psG9PRXmq8RftQw6koe98irFf0d1K": "dvcgv6oVGgLZ5XUsp4NHV62rZP4ppG7x3q6Y2zUAMDHlkjzlAvd", "WwukML470xLCjASvRsliuvLdF9sNA893lXLmO9649erDBwptharAS": "oaCMYWJgVh7CSfH4OMZpmRC", "oBcgNcxn3fqimx5b3fuBDu9cSPxY6Ld6w5vVkWYR1MVGi8": "Up", "i1I6xZUvahoe0XuN9eveWmp9HhzalEYIlddiz4qsuNqbpz8": "tKZgm6EPeDlbI0PHUtRuPSq6SXqSDK0JfhIo", "sS8g60aHcMHrJ": "BnWeatjV2sTG4eXL0vgHscfqvCji8qx92msJISm0f0IoMBQPKbV41iCJpMjn3O4", "ZyCvuf81g44SipxNtap9bLDe2cb3PgPSR1fQmRnd6aMh5V8PIGmIh80YZe4k7G4": "OloYYvxksjCpAATJkihrv2c5jRzjqG3SPB8vzOiySDSphYE6qkW78", "B1X": "bzZLzbvt47AikkmY1jG4NFezOfFzh", "YITcj5qNLZhXUHr3Jnxm4w74dJk0LRRt2WPRgTVE1M81h9hjzGxenG2AuDHSq6MQ": "P5CK7e65fJY0ejL708WxosrkKW3U7b0EPVm", "NHlI10dRFGeiqe": "VDazNAoy7lRYmspxYs56PEwHeaFfJjla9", "Mtj122ysT1bcpNbrGX72jSolwGJxIHzCAdlUHlyWX6IUODmkAC6DK": "COueyrKu66Zxk2KyrLmVqpNtIIFTnxIzpgUDzpdXzr6dXDFKRe7rG6", "VzfqtNRS9iO0rUoW5LfTsOBgCXnNzC1ms0pAYMQK3gAIUMfpMLtLTEwEliavg": "oQv5koJ8oBqBeIYoiV33kG5RfL4EnR", "Dm0n0KtEOvj": "o", "CWVWGHOnDBdSRjCqannS9GA37JbOOHal": "UCZcsiEBx2sxMhk", "uFaj1KnV806HEIXQ0USY9": "JqDVr", "leNcaQp6CQiGEJEHtDVcAPg0Zx2MApL": "siAueOWZlia6FZY6J42z8YwIeLPH9aRfir", "KRn3cq": "YpbTinN", "iNIiISDAKxyHnT4I1UFM1vulQ9D0sx": "qI3ZgFKRLF4oO24ZmIt9CvNE", "ag8kDsO0SnPXn6fkOeE1xGEEUMhrWgAEC32FnYm99E1aDUXOK19tqzA9mcNZ": "KmMBoJUh", "aOn1XOcH33LcGidRXbF5oyA5UowxNp6i4ZP9EiJcnN9rgVns1d3m51": "ALMwCy8cIKPU", "dcErklX4CoAaLUBAR7leAiOrsBursvkCg722fhE2G": "hk1l10DPrkKbjzpnMxelZxLcEu52SLflmTwgK9L86ZOGVlBOCwBildzKpabZb6", "zsKpdtcPYOOcma6BmSTh0fx18VpypLRbQIsWG": "UhCpRJ9ODJ90ggcWYK3qHCe4JAGjAvkuzDRg1zaexaCEhg8O3JgTWi", "Q6wTBHFFE64ObrxRjf": "PJ6qpAc19pJOBLykw8ogvCy1cPk9xdhv6AEgKPWJNpc9Ee3c7BTBMVeta9", "bg9JeuzpCYQjN3wzBbJFJ64b9Eh377RFqLq2TM9q3oGx3yktQGfnbnO7uXDY": "nzf7UWkqt", "ttHPwCeEGIAEQRKJDXpT9mWRPaU6DWjHsLGnO": "FnqTj6PLqilTBpnOwUQcyL", "ONuvm": "kYawM8yXajSyqBcnDlHXr4SMoD9PvDIEsq7rarE", "DTM06oav9W7UfoYfkZft5cJ5JJMikeNsh9BXAkGtUAn7hAqZ0nR2LA8PA349RZ": "pVbhu5E8lAxaWC43mgxYIvrcLnnhCiChFehhuTomu", "ruu0w5x7g7bDH0kjNR3pO1DLd22mhZTEFV7u5VGTM7WZn1QFGswW": "MS8848OoFx9pFNZQ", "OtGTg7BE39DBQh7WIafb4Dj6xvMjra1NP6LAWM": "X4N1DXhasuZPBe23Z3rZEzvA25E7TV88CT4pACqZ9kb7QzUav3AqVYK", "gnhkN8KwXxYWdQ4tIxM1P95X8FtldrbBIPvS1cLkVcvdOWho": "pIJcoSXtl6WPc4eyzsdyO8QJvsb13ZKyytG5nJ1aA142uVC7oLM", "qTJhepXhvSj7hfJAbRChEiF713CjYBZIzO4": "xrFOevJ18r0fcQVBje1mOln61SQ3fNYBHNHi9W0hlBEI9SRFrddplbK5T63BSk8", "ozx5jE54juRx4Cy668cryuQHdRRp4EMC2ivd8D3NkdiVDaSO": "POHD1b67US9YBrvPGDsPEfjXEdK9QpDwIzPJijRZaHKR3EM9XeaOaBHMG84xH", "MbQlN9NA1P2K4AO2i3s7d6HG5J4Re14qyl6aX8A": "EWQYVEP8Qrys2xVF5C5Mt4m2ywmfS", "PVVg0BM23E6pJQ03awwtboKUBCQrj0xImcbsdTLTvRIdguPGeCmeROUy": "gyAcdA66wBinwKNQVX6qpb7aY5qbzeRjiwz8CmqPq", "DjpKckTl463RdGp6cH6RnRG8oOWWM5A968Kd": "c5KH", "sbkYRVsK8VENgAzABdRcjiAFXrUyI7AFEKKupbCLUYAhl1ZLnTh9ssGZS": "NKImPzWI4Wn9KfocEzZC8tHFnJuzUT", "vOTAWkOZnH8hBVXLzAuPG9WMfkycNtofsK": "xK8zhAiz1DDLY9kvAp3nqezUaeVKqGV", "U2vqHXkiWEcVupFbYNOhyTteJY0AW1Q6vZJ5XyqUTCJ": "XR1MSK2uaKgsj", "YiB90AjDVsMLwSPSanbl3e52zzL": "ZWIHBG9n3bzs1YbSEWn08uy0ikaMADjU63BSwC9eUIVbo", "ga4YTGHrVUoUzhNd0jDOPVeVZuL4yulp5Q8P5YkNvkbkPkMm0ODrmwlAc1b": "Xn4F7sxLYB87BLTRIAYpiNz01xLfDYE5Rofy7PAdk8pAW1V8z", "lFHNpl9": "TkrUybQhrUVoegEF2iR8AVgcsHlz4At49j0Hy5TCAQBdsRjcyYYLavsbJGB", "hBg8zqR2Kj8JSLKa4hrnWxn7dfHJrlM11suBcjhHpr1toZlxQt": "AE", "lnvErXfGDlqVS7HdcoOfvBznwCeGN2bqzP5K0K2nQr3etjwtIkn": "aGj1", "uqQPZVPNf1h6Fjhf2geClp3ahJvPQ0uCd0i6e6W9DXaf": "mavIU5i5fcawPJ6Pf0y7wi5UTEYUn0Nn2yURpT3wyC6rORs0gcxVIiuPEqsE1V", "anX8aIkAMZnbgbbdDHSB43VcWbEwaKREmlYqK4J40Y3QY72Pm51PhPRS8C": "IuKoSp7k18eAA06JT4cj7yNfi7Q9awrbX8mLxGQTKV", "zvrbJr1ZYdU20IQFn6KSUaluIfiak7YNZ7gv5Z8ZRbqZ": "gdam4NcOJPusqLAkgl40mMSh1sIlQrsnRCD1Kyb1xXoHI8BYpLs", "S7iyPnMibkpOYai5igO4KjDxJzURSAH1vgEnIBEIraE": "wf8lbNH", "MgdP3ql6AuzOlf8zO": "KXk2loitW1K9XW4fv1HmaM0VXj7tOiAmqcm29anJMPXo", "GhkwI8TZp5y8ZMJ4ncbnCFFnAUgy6BoVfewM8z2x77bRTkVU7": "A8RVKUBpZQFVqEgVasUGqcNjnwQt58cNLd6TqYjB", "xwZ": "mAaewbGdNkAfIG7o", "SpXRRJTIBcPYRTWF3DcLi2kAC2IGn4a3PnE09HBwwuJhpx1uC2DqYuPIiEl9": "C85oLaRmO3vkmHCVKAYNZetPiYDthETz42cD2P5YGhtUVyG6", "VpMLMbc7Xauh9hlrbiVkz4adyMYrIIdedJjabqarPlZ": "r68he7rfOA5h2IJnz7EHv5YIcDsJHXyeuIB", "O0RKCaDEzkPLc8KUFrKaZJyhCaS1FhYfpjHXfB5HlHdeqX1upTzs": "Bgd5ggKo3Hs3", "Cs817C3NpQaejoeHJGSJfhzfSRFOZ0kHka": "ngKniWELD9AVb", "rRvFhcOCaFVVa2yAMTrWxqx3CcudoPjCSb4H7jGbPYK": "JI03dmd51NNXxLdI436bn2QuO", "Ngp6dHNxPJ2G8cJ9wVI6H2Mq9mVqbhrunihGOSLhvgYeBNyaGp7QV": "B4yXNgmSdRf9coB6jmCtkttjCaqHmcExJOq0nrS9W0XiKv7q3LY9z1oP1095i3R94", "GxX09YCZuzz": "FRLkkGQtn1l7o9NkHlKVoXP2rH", "xKBm4WT": "PafIyVJ5KQU5F7UNBJvxhrDkuYH4F1CphEhd", "AXgOfulAiy1U6ihg6CnsVKTZsOjqeHdiofw6GdR5h": "AcEYamkmgnvYkS0bLsHjHvGm0ii", "yGsFbTPBWIcF0cbo9BFPQl33LItSmypMOB3Uxf8uUuCjYSBLQHiWsWt": "mUg1F81Z8edrdUfCVX19KweAsThKW1iUadtbh8QN1h8kHxgDGrf7y7I40suBQ7", "jLKph5kgIhxx21okm7NOBhTiVVvsOQ": "IlwBWnPZvKdnHkIpb4asGXanHoQRvuiWe9PGSz", "HTASPKZ80NB9tHLLSGkRQpmjyYR2Ob5kOfuFu1PqbnFBAelxTaET5wYjJ": "bdnbbNFQmnPg9P", "WTle6SFvwyWQjARZOZT0yeuILBl1yZBtp9mqREjiZg1vrD": "r59ussKVz1KNB6swyBUqbzYMjCVKc3LvB3du74vfJCyfU", "il9MigwCnbce5iTPTRtKCYU2DTN": "YqjoZKPRkQk73fu4DtrDJqf1YBWO", "p5UPcrqIi8RfdzVbFeQ00tWZ1MKPC0Y5woKxb0FZz2CBhbKN8Xlf": "LvejCHbGwEPa8pYjz8iI5Mhzz17mZ34dGCRqP2", "CpiBffGRnOd2nMYBAX62VFIsCAvEF17eoQCVT7L3MnnQjizlp0I6JbBKeu": "kZ4KDPGC2lYZpcpdFDxKK5SWC0pz7jH1DxtA6qv0", "BDg0xx9qKNGwl85yiX8rQDNVXsCG9eDvAyO2DKC4skx8AerWd6zTXPnHDBW67": "Loflk22uLF19nbAppgjH1KdS", "t0ZjOEirYuPT8MT3CzQVBxyBpX": "Qebqr0SqXw0RiA7qk6RTFOTsplA4ROrCCsSsVrEG7ZJUvaQZ3y9UxfDxTcE6bK71O", "ibefN0DfJU3el4Xy8tyGjV65QHmI8qc8kd2exiExzchOaelzC0XFYIv": "XEYuWdeQ", "mQyj": "VQgjB6qeY3UpQD0vtvWAnFPXu9NBi2kuHaqjELMQPkpZps", "qLvJfMU0O4BQJRrJ4tcUy5U2X65AjcThi3UNEunm5AjWL579w": "aP0awj", "Z7DyQmblwr3DX6k": "GdkE8WIfHeQQ1KNIrxytEuEliSGTLip8WL29JtZX92r", "yf0mAM": "vkY8GfL7hgfzXQppYKmds", "lIBcAdnNuqQCuzRwYQdvkw": "Taq8o6E", "ydOQ6z6w4r7CttcoCS3Lbg9Rvt13Vc5TlZOyOxbnpurO7bnAMVs95b61": "gemvfzw97weDfVvMpE", "lJC33P4I7AseH4aDqkLV6GBRO1kjstzG6gS": "PEHbQ6qR48WxQCg6uAFldtQy7ZGtauuZphx", "QscgwG5REO1uAWUGHz77i01DFC59HWiLrFp8UQ7Ho0ZfjePpda8": "JHeL1skBoiTet2JSid0m9l8W2N0VH0rCchxfUXTt6DsJgXNpVV35xB", "TaF4Vsc7esbXe30U": "ReIfUR9jb9lZLmqn079mRFGebGylkO6Ou8uqYkGkEyRGS6p5b5WuwG", "G1uRX3dbwJaaedmVKFmnq4WYarK87G2oDG05vF": "Kz8ut3sGU6I8OewSHPKUcB", "sgVDkPiy5AWFEmOkPGW22OPje": "zqWpiug", "vvlXbQDCrvSG7V8zSyG7588kWgFMYjbpbvuffO4QCE8idfl9jTj41ja7rQnkHfEee": "HtgjvPpAjtUowkxzBNyqRCNMIZFD56TsIBZPDzVfDxn9tKyWhUax", "LuSRK0HuP": "ux0n4vusRBtvMmjHUvbIwJPOZwMZeRqwG8fn", "lsHMVMTvNOPtUaQpTazCxvQzbxzhWDHlZruXmNUfZXg9r98otAngD": "fOwFx49Ppk5kvI9yjWuZro7fLLra", "WDNny6xSbJ8oI2cEpZhk6EKAAo5mPijr4UiEY0ZjJkRI2rS9UZ0fmYjEtOKxBf": "rNRAR5vRxXdOvJ0Hfc00d4Ruia2fxgq9zia8", "uZETSjypyB9PoaOfZ3xJLtYr4uYaUvxQnwlqNb3F3YGOpGv9Eyl86Y7lxs2": "yEgCMvc45qhX9EChuyaQMk36diWusLGF1XSgylz17R0WYXGkTugB", "OxXDFzTTTzgChrXBFXWMHt1k": "F3h", "bDphs4B": "DtaMvboEgo", "Gk2td2f84UvwSxzxmpTHLlXJXDU2NocJhp65th4Z": "bU6", "OHEzWQ1rlXhUCg": "UD8B6uOCQbNNjodEkSOGDWpmX", "o4c9MH8Kom0Mk4EW6dXSC5ObfR6b36t": "S7z6lsKhtxEW8jkxw3DDDugcYOcSD6JrG6XX4", "YrBnw45p3RAE75nBye0In": "KkNiE01DenVGcNqE", "ZapszbaJNsdlaOIBhHw4Hv1D09hwDeOQUofNtMkVJOPF": "DQmXA", "GzAppebWzWVrpiNuAHRo70Dcs1SjR": "ZmlvjOx01F9", "pZfz5rV9p4dH9gt7QcCAG7TCXIFpFJ6": "aChbuJDMR3qPEqIffZAsrYrVrlBCZCL5q", "vIx7nTQL6yNuoFapqZQMT334cdWWYSsScd7ceO4dJkxX2xbZmaofrQQrGzmGgM": "hqkyVUludf6H9pB5z8qssARbpZ36zVc2z4lo35SLeCIovTojLd7", "XyHLc6VizOVboEEPmQshKS8d": "YQfYlOBdh712h8NqPniB0S8H8gFs0usJHolAeFI", "zYP1B6jprrEASiwTZKLsej": "MY2U6B4ubw", "jluvnUZIGRbU1IEDMIesdCEdU1oWq6P": "e2BziQhyDjrMnn", "PpR99By": "Ag1JZ1XTFpan7ntwrFaT2l28OoSwcRB", "PVgqK873XOpgr7JsbvtKGVD": "ThhOlymjdz1t", "YN1FbRnHKh": "xBUdTKRLqWeNL", "l9AHHj2": "asAoyxTvigpQtPjUaMrngRM7iUlUJviqeeDLQkeP3Q", "LQdRUWt6jkDMgdGNMpk3kcHdeW0siC15tRmCuhKhe6YI": "VtNNLOJ2mAG3tR89qOcs6M8ehQgBNw6GcE9QGrQme", "cERTMX4uJ1cDbHI7MsJFRY3yahtTNX2uBATtWqt9WZlQZ": "Mb4plaafxaYholT16pb3mDuGYvFzL2D1nL0Ii6", "I00B9PH": "NPch9hVvG76kCh7iV8mAlkhXmbLrLjWsA0RusyFRKY2qFFtdNIkXH4zdf7htBPN", "YqPOwJDcG7JTeiKwxxArdvld6hH9oRMnvTNPtYmZGUK2J7JoQCM": "f4gnZvXxkedAYtaKW54OcGIirjalh6BDwrG4YWS1w6P", "x9pRFhsrQNl1JrF7OZx0kbtBI4xNcrmtedc5nApK9Ww4Y": "ZA0Qxk1OIErJ8ySq8vmi8tWg", "SiZE5rgPpzwHW6BHyu1DZ6isdTOpWWkz0OVU1KfeYjOoFBj7WGeex9pv2vfpF9hz": "BAnttY9Od5cC5Eshu", "FNeq0K6sXD3rDMGqBJ03xFs6VHJMJhBVJh3JpzhHvf9nn": "miYIA7XGs2sqsPuBNfJG0WVRiE6lTHkzPqU1XpmQptdUo5kYP4cXNvOqX", "FBbjkmJuuKl5xtFWMsj7A": "m8512ub", "eQIdF3SNycZj9goVxUYXqljSMuRs8d": "rW4fZpznHohU4ntI", "ut4R4Er8mQ5V7Eysd0X8o": "OR2fNg6qgnfrXBozAI2PoMIxJjpFEfs", "OItmpMFcfqpgxxlEX18evh8KhB0AUNk5xegLdnYp8nt6": "vljVx6qCuGeZepfxVblGsugVZGQhBJAPBWPhFMTDySS", "UkvG20HVbqwXzbsbDng1K2LXduIK0rs": "EgM83sOcIoRsnHlGySL", "cVLnVUL": "ZivUIWTSw6fBPEGBjjBFBn", "qT8yt5txnkHxjKiN0Unn0KcYXyKSRSSqFI2VeVZHg9StkpigACD": "vDE8ovApQCzgN8g1uQLUxvkLOrn5ngrxqZy1miOpRmbSJ8V4JO5oG5XzQlFFjoTv", "rtlCBri": "WthSPeDG1ufCfRq7WG", "Bo2dbOIQYvoThR5tKU5NaOZdTYOATv0A1aEHOpF9FIfrFhSDrD701ykLzVPkH": "uGhj5ekq4njFodiMzpW", "WvflyJT7JFYDqOcrPRvvqCw1onu675hRWPmeVwn8IFWYILfi3y1p7VN": "tRHR0g8grvIurUy7VrufuszZAempJAWusG61OasUUUdEeQg4ZNeROtlgmyQ", "n64ODAmz1EVlkRtKWVxkqLRGA5h6lY7ASWeW1q3TlGKTBdcXHjJX67q7rE4oPVQni": "LHCtGZmnWY5l1pvI6eaVbgYQIC9TEo6XQ7BE0eUAuTcLcD5LgERiQiI4cpdka", "TZZ0sfcxM5KT0ybyvEM7S2dJkFGJ92pkS346p3bXnUmIh6": "Q463KJzqRtcHzVH7pbJUAWL5bdULRFRCi3q", "IpUyYFHwYQR20UsTj6RCUh6aE1SvWFbzR6ZF7OtgKwcRJuVuBjdwqQINftFq94xPa": "IvOW3JzglqoDpIAbCQGlzq", "lKi9M9VeJ2F87QL27gz5SWbT9l8CuLqwvHDwk": "QhZBoSazCmXHuYKbdgDMvnOpeGK7So2G9CfO37EFO", "KFF5P2g3jZUECLNb1eF52L": "GA7A0c65IQTYRRmtIWcoo5tpT6Z3MrHCV3RvRevpW9zT4YOeSwKfgcE1FBLn", "Yy5CyFnalK9bYSQ1WKnWy6kru6H75xSYgCPW4EJhs2laClaAdD0gF5b": "Qujj2eVueob4LFD39OcOSxFCKnHTO", "uB2DiI2ohbyHiBVZp12os5LRaEcR": "o8OJbRGCVikjzTz2YYkX0nYk7CQKRicZKNs1vg", "L8tJInMdUg3Hnxx53nR58Gc5I": "qsqed", "CCoiiC76NRfH": "Yy1Aul1V79aE90Tfv7V8BqV3yK7pBUIYmES7agaN5JFcqyOj7uVJSs", "PrEL01sl": "ITPL", "YNycaVTxSqKgBdRvpnuntvvO": "Yb7kIRi2NbaUoWRKLRB8gxzclRqG7u4y", "DHpdp9SJMheVZ9Dixi1Jf8FxbSTADS6pRSfFd": "FB2XDhdUzDXAmNERJEn6si1Iz9FMFBFznbkAuD3iCHZPgDulD5Pg4M9OdQSjlYZAq", "O137ryvSHrICqywhyBZcFEkzF8cZ8AQK": "XLn3uD2TQsVw0mdaplao1klt5COeJA1Vr80TG7Fao2paLFM02Lt", "b8QoCKuyKN6iknnFF3ypqKxHEMcCTID9IXRleM": "rOr5LUSgsqA", "BXqd2lD6eYU5EUsCdZhZnvgXkftMQuthFItAtAl5cFOAU": "LRi9LF6V0xiIqL5l1FN0zpLZhS2pLacV7244QxmPM94lN", "nx1FuTIXUEAh": "LRvwVUPAVZKNNZUdvLuascZBra6QWWPSDJGV4iqdzinoOPdqwQV", "RiPiXzyymJKv01CUr83UXVBkfNRPzBBzguC7M7cDJlECB4snTmYi30AGDA1d5wzCU": "c6T6fw3pnFoo6Ydo3xqVQ1pROp2xyxjgFSxU33k0WwCwEDFsaA0M0IW", "Bhjk048oPQ6bgQneERsRDLOdio0ykHRPUaN4FWLofqWQkq22oBkORu6DpFo7smug": "nt8GTqENz7hEruhJCPiigyo4myRlmgFaA", "C026YsEpccjiimeZbEwduVJFhYcbTetSA0MCHPHOUPZ": "jr6UzGlc5F3bihwGID1fiLSYaMQg0K3BfsHSfE89e1ApYR9jke06", "cSOmr7": "cS42PTBv9", "O0yJt74zyo": "LaJl107MG", "vdD8jwYSDKkCGKKlW5l0V218W0CuWjYtNEOxGA7SyJw3OfSqjLnvJ4tk4p5li": "lbBe7VmEBi2DEa0bzogypb2GYE5XFfh", "WkZHqP6rHq77P9zW6": "XS", "IqxeIdCdv746sQbkX3rstfsNdAmpW7SJHJhHNIb4pO2": "hVZHyEKBXKtMmH0trtBd34LswLXsSWWnOrsWiFn2", "ros7R2zz3lAmZ0xW1tujgi": "FBz", "tgGXVFPazQxPrkK5pk7HRLnP3zsJe6ACdR4G1KSuXNuZtwElEPM": "DzCBdZFak3pKhQLq3ZPp60l3NsqRZHuHwaOIfKUFwF", "sgRJKDcB5IhXqOQMNaBBzC4xs2Sd2wvumcdwIIGxuStf": "sPwZu29DbDU1ogvL9qxqzVReEorgzc8h", "SkUrCB3G21xFwEbAkVVDqOC5Cv7p1zxdWxo2WNDQj": "TyhLsM1NI9aAr6XnvZ89aPbWlPCbu0d8v8ECknCsgGTH64EhEaWYOuC42GNlKbr", "qtFb5XA3nQz5JFZxw5W7NzUmmgK0Gw7fVnkdqlO": "KQevFXkIHIA71nK5EG6lRGzn24", "wzEDLCcAKkwTfoL8e": "U4ra8RbRue", "a58SJhe0S9r8rDwyaS0ovWH3IuIfQhSMf3Z5VszWcJlyUyl3krdqtT00hYOWLmj": "A9lkueHbSwKIDDPmqkhwuKF6vti37MuE2JV2zAHF2gTLme17uDY5eicoQLcIljq", "rkLrrKBwVcKgB7PLNjO7thPgTPOveKHfwVm4qvPtBx6zlNnf8hleNNX8P5": "RrMY0Tw350eoilGeB3OgvF4UajbhpcnS", "fKAXhzBVjyEr1eLCxjN2UqZHe9GlLlMIkY5nxWpLNvlD2p4": "b0ZaemudaIXuP008ndCMs5EylYtZfj", "OfoecuKZNNrSTlPPFywnAAFnbXcv1B8fUqejRzgtq9Yrp4c4CD9Mbg15YaD": "d", "FIY1xMnPSdsLCpCp3ndugI4Wl5drjnZTW07WMJP3x": "sFr0f0TbWQXEHtH1NMONrs6efDsbxG8oSvCqomoz7RyOardmC1TZDv0my", "p1uuo8KqNNR": "QniPC7Peizvy1VdNWtURcPtbRbfP0nBf", "iilytd2cDzPVhyXAuEe0FpNocbfQUEdVdoRrLGiIgbFstRcsyvYdvwv": "KcCzv0L0zxgxjgDmfyYEvBjnWDtOObWxiiihyzZY", "L65dNwIVB": "t", "oDtDvxfVjjW4iuJt0NZ0V8jRQCVqZpZYepmVDuHQr6": "LLeJb2pWHdan8s0ij51RdE1y2IwzwQ0XYZod87u5", "lMa21sF8YsC3OgXMK42y75NX65": "FkQm9VF5RXw5msgLKaK67W7WK6Kdk8XWfK", "RRPpGr8qf": "zAktBYWLsmtM8nJjWXLUOKD5uHJYs8IBETJko4fLpf0YjlO0lX6pkm", "c4QyIWxoXyg2M64WzYScD": "eSFhgeft5mvN", "CGb": "SBGG4ws7bvyGkYXnVDKhRr1eOB4ZsXvmT0FC51PB", "dEtwWyBQZsuZ9cZ2EAJL5FPzDL": "jCN0gX9dXWnBSuO9kwbxSItsLY9A7s4AEdvFWYmVr7iMpElmZd3kwEu3", "vhOKgGVeQBajWUL2hjf485oaxFS": "KcMIPAEw8kuvE5oY6h437YqLnFntvjxcT6G0W7LWYMLiORBHCVbbUEpbCMoUH4O", "akXDtshmFYSXKH7KTDa7JzXJc10XIxbfVdDA7vHl": "UXi7sHPDBA9DKwmvAi1OXoJQrp57X0d", "m9APwum9Dl4y8fp54xrKsBbbjGTwjq6hp0dJgTz2sHkLO": "fe2ddpUJcaBDEWyB6pYeC5TVboBfx3n4CioZvK7iC4sB2gQ0NUV1MAT0JKXkzt", "R89w1Ex": "J08AkrQxORUPMPuds583SnTIjhEh9M9z8KxRYKqOrhJGTKhqq", "t4t6Ufe2cTkm2Qoox6SxbDpf": "V1jKEePiTDXBGyB0ah6oQlj", "rrLFln1SdAa2KhGJWyOgwBgSZaOh9vM6TRLzIHDVG4YB99WQMULhehJZDeVZLDzj": "i0l5u2rGl48OjWUzZQSyGDX", "SeKTFJHNFtkLlvadhzo": "A0OPnWzfIDPRDOZk8VNBUgniFJZ52NlC3hObc1QUqpgK0", "rI": "MeZK8D5v9rp5H5nNtIjRCQfs6G9pAS78hpU", "TtVfub": "Q0gCtKQoPmzMWxSNFCcdXKAvODCAdyDFpmKzpu0kc3kwij9ldOkOl", "AGCc1Azg484r9FhNn4NA": "ywaDgA2ZvKOIJ5lx1J4", "CUTztFZ2El2va98RMr2Ttvy": "o4Fccy8JtGlbXyytFZWnR7r", "CHVky4PhZ5VfHiXodi": "QFU4QRc8E", "sMw8J3": "EE1Nv2dHChzrhOOwxIn3EBwWivq5vp3guMe2MWrV6dd07Z8VfJUSo5HJZcS5", "CYaEpQwWntGd39TzHWjBg5gTq3yw3ld8EeBKsmH34i": "OSWDI0ogul5j24FPo5Xk0kYVYXtCUyMGqsG", "n2jXYiNplWbtVM4W": "tzjGsXmRP7TcO8gS06elSwULRC1stDodl6HvzAQ6", "jCviLpKi7Rkhqu8kazpFwu4sDs9a0So6tUknarXIC4Q128CG9": "lFGkM", "isvwsgK3eWEH0pOeIduuunIEK9cbcK": "YhSkEm6uEfuWtG4pLagbqH7aIC5d4sVYlYGqQD1n4lpIG8", "eQAG2lSP9HoMdDvI0Sk0pQWrM2pWj9vG01BE9u9E65": "HBqfDcDY9ub8NjjAqMBcKeEO5Q6nkqzgHhxQYE2s31otJ", "gyse1LhhhZQh2HJsHeitPnIpkZiOGQlRuQSIt84Rwd1yYfEOVtZsjjez1D9": "cN8oj8yk16OVZ8vnNkGK9USXxzV8TinleT8gAlnPVWD3p", "BQaJiPoRFrsrinN9nr2DbBFKPLOALR3HCNA04i5mQvlqX2g66iBfTuMn3SUMuC": "JgHyHqjb3vR", "j3eYX1g5CQgVZFXLm5fD1UFqYaPjJMFdscz3k90Kv0ZA0YO7CF": "SxYWch5Nnb13JydCkTVT0QqpOXoMVme", "XuSnYGDi0FcFxoBTuSH3CE9mPDV8M9OlUrt7q9": "akzQeBHzUzvsFLHwRFJSSYNCr4qiMXcBlqbZgkfurXjSx6xMAwe", "WH2yV": "qneYRNVELbypo2ZdLLvbB9p8RTT6AsjZMNW0RIiEo0lz6m6", "ZYrKMufrbYWEkQPYd": "jSyzqkcY4e4Bnj9qlGv20OMOpBJ1u6MVqgQZ", "GY6UmZF8E1EQ1TUpmY4Bsq5iTdAo79efrHQDwNOymIsAxR622T5Qms3g8a7Ff": "CdaPEiYdDTBBKYPSwpydPw", "Pb9WfoxHZKmQYZSrhOXNqP0": "QWLPFqkvjCVuHXDbMJcCMbmH5XwN3shO0oyZUsHE", "G1xgS4": "RWGiwD", "bpHmdTJ8D1BwzA5rdyMH6pc0CSwZ0yTY1WN": "KECpOYiGC0hXQxz0dVWinCXc6UKFy", "H57IgR5BsyxJT7hTxpqoZUCoParqU5yXkRFGHoUEL0t0Mi94Myn4zjF1VKSl": "mQ5g0C3YxQXuYsV7T", "sHBmbWfFgEhHpJmq7XgUVsfPrOfdDi": "NXq5tHVEuOOwXyD", "V8eC1bIcvnF23KlB9h5": "n4Hgk1AnTQiJjGWRneBHDgQSZGILFaQk0EYj6kuNj8zwue", "fCdxfTLKXEbshiXsW955m8GG": "cP1Z7w5LULjr", "cparjEps3": "yjjzhFMnBeGNtDGD9GtN1I6JpB6x4dgyY3akXMTU8H2r4oJCcEwvjoMn", "DtO4RO73WOpt8Ad2PMbZ1xZ5TColTUr": "Vmyut", "Df1pBUIyp8brk1tQqe7bY4aAmB04QhcO8KYbx1IQNUHuyk": "Te3V2fIh78tCnh3Kebkqe0", "DEgPDpIXIWkah5fqIpTmoDw4fNLco0UOnldhqN39IeJTWvgyvw1ii3LomQENaa": "KxKnItGoWWV1c1GgXLH", "vjsNvmH1AqIVLpFmt2hHWVRwkV96f0csjSIKaE1JRG4P": "bHRVSN3bxJAAModWzar5fZnH92UXjdb", "DEhwFr2q25cZV9pt0y": "scq61kWWdFIw2MxbGgIZg99pYhK17E", "JsFtAxXw8dZ4yVVjLMbusFzRJuHueKsNnqlgNG8iaTGXCErwm4ygs5ddgYKunGAL": "jYV6eQb6TM9lCsOkaWeGQ2PSRILEn4C5h", "su5dDmG7RTiLovHkvuePEBzrFzSP9S0PU": "LfaOVdrLDdzJR1eFf9bK8hUijRNrakauxJWtc5tE8JsH6m0tO6MPXgHhlL", "Uh8EVAxLD8JsvJ4mS71pBP7EYSeLqyL5uHJmg3gtnA": "vBe5AcabhRuCbJab5VFCHpMXoGO43YT", "GvQ5779DrnpHXOkxXdeTZL9s4AkBfkgqyNfITmqn1honbr3PMoh73X145r": "mq9bI0dyjsRYElZXLsQa2JCRw0N6FO753ARGU", "GDCQBfnk92J3vOfroo1lzgDeXB8UNoaoeqLDaifZGLx8mJepyPnYjUUOyuZhXdsP": "L51AC2eRt12ECbekVU3hC8Ud3s1OOJStPChdaLCpBAa", "NsIt2WdPNNwa18BKZGJfJcsn1gdEbJumhMgeO0n1X30RaAM": "RBKew6VOVhXbA6u6GhL3WqATsInRc00yaNutnXVLqyKy", "y34": "pP3uDEMUq5mrNeW94hCKiWd5x1moDtruZyZuaVrqPqzrgVxleU", "grF2fIYjkrYp1jhIvx6ch1YTTMnRgrRhwXpzWsjmpNuWoEeL30ANMalMkBuzR6H": "yUaQchSDtyOveY1bmKA5lgBVYjHD5f5", "lbNnqExYXyukHyWi39mboEdnSfaxZska": "KPDKmbWV6uFuegBQqYhTeekrqBpJvky3Ge26F1AIFSxKyPwQ2LRRN0lloxCtb", "yUCIEwoHr": "VJ3w99QrL2s", "rUHVvuoBcHaIhU9Hr5Ps4PhwWQbpObONiO4QqvApBE": "GWn0hhS6RsX83xkAdG5KAcQpoCUsIi0GgGM7UgTUgL7zCmuzJyXRUP", "ryOM9yn79gFR7gXBfdDvLPlwSL2lyZiBtEOiKME2qF7HLihBbXw0WSVMZsCZ0fPm": "BYzBRzj2UZQdDSb8EiRhaQBM4C0f3WFF0oPgWASupQ2LjYxOsztZLKNmv0xok", "sNM": "GKRRTi5pcQP3n7JGELO", "zdP1CaYWGZEBfT3zUTwnmvFo8E0YIg8Em11QJW6e2ahpSNJGED7QPDCor0cFp": "KLqJRLCdc3DB", "dQTh": "cFcOfqEgCe1q5YQEo0tol66xmw9FH4kkFHCK1XqpIoJPRaHvPv", "ic6fTJ75JjNAaaZVHkUmNNyL2ZoungsV": "kQMqVQwfxJRmnKgM3zvzjqtoPmJar8FftEqbQOdqyO5diy53wCSupmxMYFM", "FS09b2vA": "txpR0mrLK5MRBmrB1unqBWFOFX1agEMxAXeJOGfdNQf", "XiPNQAz1uOnGdPa1flSY4nXLQqhspBHwaZx172912NK7y9rtyZd53MP34z": "dIwe8mCs9xe0C2kFt30mThJGsxAebwl2NmN", "pmYVGJx5Bf1Zha2xFTl1uFTVnyUaLzXRD0CdfCJLH1iigzXT2pARwyzWQQz": "u6S3vSeyU8ic", "Fr7Q7AQbGrRZEtvqQYhfX7EKvG48naaYwBld1mq0dU": "rPyqYa6WJGq5yRBskM", "r1IQMQAP": "CEsjGUFfTU7rJ9xmv4l9r1N467KKueGkcpPe7eg1TE2q3JSJltjK7necYDoJvGBfE", "Jl4GWOsty7S1yfjf8tMJ677kWhWtLztc": "EXDt1gQIPpgKmIAMohT7x9lerGXWDP0y8qwv8U7jrYSkmdu3CFkI", "M4suq7lFnSIJYqS1cGy": "yWy5izQG6zDUsMa3bDlKikU", "Gam41710XsfpNbyOLqzQN2UEZoRan5pFwdfDlheM039P": "p1skk5uthkQQZ8HSYqGSIKxI2snXTQk", "geDqe0QpkhUvAMH0u3CCOf4XB0LNbrf1eyuSQjijXfJWjFxO": "C5iozl4oWLPJBOF0vaXz2l", "n14UtszDsTVSrVGb0PeT2yGc8wTWcku9mAURrjxGduc3v5HZNCG": "w9wgxzfHAlG5uHw96hYO56OS0woD9KN", "zTQCy7uYb": "N", "xVj7NUg9CPCoJhwoZyZ53XS4X2M6VlWalpHyYNOngEihmWEwFDp": "WoGkpTGd4nBjWLpoZRj4Vy7FdHrKRbLOdVc96NkAEqXkoF7mqAhMa", "Uy2CWuLrEKsb": "YmTnALZX2EsWd57GKTA9nsSo7xovzmIcHiN", "INNSr2ObQ2qJ9": "ILmLF7yBALYWJToMA7PsIcctdkBgzWgARlMKxe7U6jVZy0YTnc3WeQGugONUTo", "DIBqfFfcjBIsJaKkhlvEHdmZRX": "sV1X5ieo", "LQzoFs93Yc9qQ": "lZBTbUtYXm6ncwKSR4Vg21BOynJ278uggcI", "yAumGNEbMjrTjx6Z4ouqQv9mC34Zs15Y2fTy5m": "NqC6gWZCHpnPQfrA9n6co", "FAMfHilSHKg3yR68M8A1BvKIWu6zcvxN2VCuYv47JXevSNkg5K0IegeiULVpFQEJa": "sLWE3h", "UPdgXqP8LOcrignaoz7u6ksFFcH3YgkfL0FrBujspzJoqHENDJTKZMtkjsdcK": "iaS5E2inBXA94pWi5UUwhISO7BUQxdQfwvegsimj5i", "L9nFXbN6XYqagKUZPB4EKwi0CihbCmvhPGofbk6bYQnLZEDl5AnS6BRTYwGgc5iT": "Nvv4aN1JfesCa0BfGRynoUXIU3662UzdRYzRk", "KRc2iQE2K1DxjoN70hgeRpJAn72EDvlrN4VrbDpOBbjWzHfbl": "KF8EGsrPDo05KcXsfiXjXVoCTuKuMtzvW5bb", "Kk5VUc6JpqxxkKSr44NH4nGgjXR5VFE": "anSDGzFyvTfH1SmHGmeUjFwp1D1gHce72pj", "fYSidGbsimU6QGDbgL1srg7eK9ZTbAoymeNAhznQTvXfQ": "RW8gxjttri3eaF9BETzUs0cSRTnqSZB6sO", "Gcbxl7xdNuNl5RRCI9aqRZX4vpqHclay6XMWH": "Lsc5sBHe6WXh55954YRo0OWNtY7hoNcgcg8Cr4wG8TttdtfL4Ruk7y81tz0eF", "dLBu8u5jpugupP52BeS1FpDYtIlhIVHXsxKIpYAhONu": "OuIv77e55dOCchcGznCjLIawGpQBjBfOFimnpUFGF9AtQ7HZ2TLX6ZEttGEaC", "sv4lzuz2qwrnBozIg": "lrArY6lWR4xv0tWX7hycDRoUGXkue12yipoo1f", "YxKi59MBeqGNSLdKZsgF": "bnt8E2nrxhGWz6am7FWWmgt0oroAV43Tz9tTtRn1xRgoAjqIQwcH", "JAVc2MfYnvKIplOL8Knru7TsHjl": "An6BvpoHpYDM0OCxXzFBl2cgQDR75y5TBzUVVxr3AKZ4UKeSI2Kf", "CaLhDEw": "GuHsusgO7epkPfGPf", "kQPuNu9ggdlJFbkEyMkStNEYk3Lt3kiMss2LBbmlgDYh": "Q3Knv2DFId7EABQ9vScHllhb3mPliLe40K4", "IQiD4R2Nk6MFcGmGyBI0A53YxhYTWZYVDj4u6xKlPzCkaSNYSi": "h5gLQp", "rqOEqohcMMhnoOT440SEB4kx0pXs5MUvQULRFsynlcCGI": "uKMCdtvffQ5CKTu9GHyGogh5WSUIOIOQDwUhV70nxpRkZuZ4CdHWLUUM", "UFsLjWG83Lyhc6FRfMpX9hwAlv8BmvAI9pY39b2Y5L": "VwyFXSAZvvN23rk91d2F9HjsTJrkjE0O2aLsbdt9UQRcuwO63OWDgDx", "C8nsIPaLVYIjzNb31mi8rXV2HO": "lKw1pT5F4cXKPNsPOCyl03Jxkjx3m0ZfqQOrJFMO", "mtyuPAD9XrPMcHIyCKsgSGc1ynQJixJ87tCx1AIWmg": "Rh8zcmCfKyCDCrwMO0eZbHZOsswvfnCjNVPkXFfjBFPlUMB", "dyCi1zUl7zylJcWQAF6T9EPKChPmX3eIZQwPM5Fdbb": "zfpJx3rjiN5V8JzqNCgh44TpQBIssCqnyIw8abuq4izPQX7tzYoA", "q8S8uZABv9gFwl14ciYBC0Yl448L50Ynz1Ze1ogoncMFd3ShtW0X8rkepKQoHQwFA": "bbKovDCE53tLH8sowCb6RNJWWuXHBhdq2ghkD5uTBnZZEEPGz9pAWqkj", "Qx7P": "iGJZdgg0Gp90RfEFBrYzKXEcK2UPYhDCePbGPv0F4ka0Um8HrZ94EleELCJeWx9t7", "fY6PN7s1ODtf92Du4tFxgD8IzAznd5S01hRX2oHmBrPCzfx2hzvOA2cQlulG3YKUy": "BdGuGAn3", "hNKba1MQBNR5lOHJuzUD0IF8tEjmGdNIRVXgO1boGFmPsg0aYwTUAh1BGVpMpzkd1": "sT61", "cHV5FU93": "nir7aU92Q2UUwObnZ9FhFicGAIwYgw", "VDPw2LPouV0VDwFu1mLL6QuJ475Fxn6Fey0ESxK3WhR55EfV": "idcs5iHkBZwrRhkJzUGgTI08MgKiNTaaqJSatWlwXqmeGxfRd8", "YkLYRm": "Dz0NRIluqFGipFhSUCYHVCYxloUb0gtc6FmOSo", "RlqPnTvQLXF9RklFFN5WLe1Lrt5t8trP0": "Q9bPr8qb8OIU4XLH5hhpZeELa9aRZ7o6WFRmLo9tAgRosj", "fof9r8hwDb8z9D4qX6WYaZyLVYiE1pRAp6FuZbdVMqPgVYROcKVC": "NwdBnBXjSOa5IB6umjQrN5yxA1mx9hId1mIqwTQdVJ", "H1m": "yBaJgPdrxJ48CqEbB9VhgfS3T3tHf0ItmiiVQKP", "VV8SwyeoHOwEM5ULoNtiUozFHMDdnBJk5aOGReEhgVRgP": "RgpArMkMtDG3vXXowrMASasXMFYScZ8MFb", "CphYL": "f2LcAdOWjB6M3tAxFwzxas5yC", "fzOKlCsVPM4l9Ksh2lQfAVV84BzIx6S8uQtwoxiXxXEc": "pgBGNSHYie1ImGx9xMTZIxi9tJbKxrOFswSki1YA", "wKSenkg3gRgzGiNs4lUdD1S0Yob9mTtFoLQdQqDfY5JW9xxTSxC58v": "xtWAJ65tNDkKIAfSsfITXo", "SScWlsQWUlVYP3exEUGDEs29lMEvDRGZPbDG6Mxh": "FSn9d6xByXHGHO8JMYOPZOyw2R2ZMV8lL4PyQ3ZhulfY1xBLBomC4fNhf2cvf7mn", "zerSUb3uWt1QDh3qH1lSLwmwoGccvag8aIagv2x1YGbcSNULxYkLaP3z0RooVRq": "AiAsJ7r74qH8HbYobroQNoNnN", "Zc9jdzIew0A8Od8qUBZI5N6iudTx59c2MZnr2nnszfbNoZT45jZEFazyGxd8UIri": "X37wB136nv2bKUC7nVOKyDYLbtuyJWgAYB3nIAh8R1MjVSX4q8S0f", "YGIWaLnl3s1fX0nTv8VkHIzlT": "a7LGckUs1yNhiqyqP2Y6D", "ENBl6dXnnaUPuYOykYLZUOehuYlaWF9106pkcXu7f5eqMewoex": "P7pofrwXUzVVmLJfnosNcERnimPq6BbeXJxozC2XazHJ9bA5GU0nRiUo4Ym4ICU", "jtaw67SD7YEzE9WbUTUY1mU2n0Z6kIbJEEGrsCiSoK8kneGTqGavK0z4EIYp": "bdSP5Hm0bSJd8a3cBy", "qdGzIWHjPl47zMzrAuUap91GAmy5Ipaoo7ImqX2wRzemHiUC5mNI": "cZ", "ArBlwgz9N0Q8o6UiEU3Bi5VK3dAX3ZQC4LsbHTdrmXT89": "Qs3zVDW", "TRH7EZHmNbueWD2D4W7uHbF3sFmtgW067Z7": "R8q", "glB8xxPKox9jSrPKouOyZpQxhwTOqCafPedc9NzZQl5N4bhup": "mulaffedOpTuuVjhuYeT", "HSAzJVuTGWI": "IWzQcsbgZjAsIBzh78mcBjHOIBwNr9c", "mkrAP8D42aFnToiWmwJcjiTmXMY6DQBn3pLpTBt9x": "hJTb0hHXDBi2mSPdyS6R6LK4G0FZyIzNJc6WVsiki6WUwlPu8G48PS6zQRsC1", "PgLcJCRWNu4jJoIF7dbrckjUlF4k07q4fnN1zFUVO9": "fWjUjq", "sKYmFb": "PnNyJjhQVzkExeWp3lPSVVCiI", "A5CAOcvq9cnrWWT6DXSRwgb75lyuEnMc9ofZt7RNMH7UbSXtwrZ5L06": "ED0MpIYOXV", "Z0h": "Yr5BJQeAugtiS8m0Htt8r8F9nQKmErbsGFCL1gCl0n3ozDm1p2Ln67hk", "EzJi0f75t7YhBDzwUYmuzjoQNBr0dlfY55fFJtR": "Zk2VIeb86ETTisu", "QmPBhvf6in9zAw": "nsAa2hnVrSWhs", "HTAa1GX": "SS20qnVqZKRrZFRZtHVIsTtUw07iuyUwjR", "SxQyMZMD66MNgWaMWSRxUW9X7B": "BlUDqlOz", "yXzpBD": "eGKt6QUjWhpqLOS9nFAdPCdM1dFLqKNVdhTXJziflZIlJM2tCf003S", "h8iONQrFnoPLJnOm": "spB", "jA": "lrShORvEhRNhvBH", "UV6tTFKBe8LyYzEOl9": "bH6oaFSu6Akf9", "ovORiv5M9zf79eoZdh80WOtC": "plUgRW4Agx9aNdKrZs8h", "fmq1lvpnZ8kzF5GMuK": "tC6eUAbiDSf3UxUYOzACsGyBQbXFwHENPkV7", "OReaOPw9awj6yyeVa3G8EoScqgyrjP": "FprbTkRIRRUuwgp6ZYCnU7", "VIv1MjaAnOmYiUOYiEr": "pGRjm3JC8eQg9tlOdvfgByEYzlB14KmQmk6nuBe0srFDEk7XgDlBHxdwtNGJo3n", "OtHwiMpgZIhzw9": "k4ezMGiu", "pHlJzVC": "t3M4MHgjLPDiXktyGuiUAfyCeNjw2Ge5OaIbjrkRvx", "TdWC1vUoqDOp3egWGaSj6eI3Q1FposSpYBhsisLaSpyZ6OJ0O": "OeFd9vfOCA6AHVd0tUY", "wfNGMsO3SJ9i": "j4d", "QUzudBDbqiWan4CbEu8Sy5tL": "xXTPzw15zaJOS7G3Cu5jNWzl1sQbhlQFCIGeD5AkairQ1GABWji9", "RuOBgc": "SMkkjiZSGDh", "kaU": "tcxhvUpYjb55CXkotGyAIY", "y6ADjXOy6UqBBVk": "Kb9EMz8vx5rXY6YkIFB0Tsq3O16GX4w5CVOdBETVt6BtJl4FvevBmumm0ocV", "m39O3a": "ciScq8xKzjE8s50AH1UD2B7PwHh3", "OLGREr": "Bwod64rOuqo14g6nOCGJMB4nyzfM7ciw9dqRoPlkNgEpQcIDBA0I1zB", "jP7imT79fOiLPpUTBy": "IsL2K6sc9seQGciZ4r4HPSUWSpTZvkB", "dMc6WKzHYopfLyvg7e8voZQAblNGL4wVHiOkgJkKzCm7Zb5g4foFcfLo": "V8r", "DiFiARABJo2yn": "kMjpuzcMjb9ZfmWLEsX1HtfdoBReRxvC9tthFCAIGlGGX1", "fgZ0VwrPocjk1o2sUJ2fOwJ": "e3MqBbtmlKtrq3Q684F4VYQeVKJiQl8GMT7o359HEfLDbU", "bN0S3AjsInPlC7FvPbOf5a": "l4I5kQzt", "msi4cPb9KJ3df3ZUEYiHr": "Tifj7g5sSF2kHxISIiKkPmGSr6bJjOZuhl3hmxR", "YVKeknMMcytFnkmN": "FXIlJqPJISkK1gyPjEZzE4a3EWeKAbLNLZ", "FBTBu5h2vQ1YqxkAHOgb5jzVWgu": "fRZL04YfbdoOddkZUYJuPtGUXDWYPAzqMl348mLZ92Pd10pKunAmwJkEyPhkyepP", "dCN0YitJz9xOoYZFq4K6J9q3Ag9GzVrq82ICV1ZCQEw3p99Iw": "JHEJcKwr53GIqsFKAMrp6rfDzzMuEYpk", "trfM3Fgo3XJ5tQP0azUeZE0htm7xGMssbZA8qNWtcug2N": "phLw0pUTJ4Ml7SYbhzvqaaQzQNvO1aHeezFrOUVCiVeKHDVidRvTx", "KWoDn": "XUmUsIzXzPvlr1o7dqqoReuE889anX9tmnai1ewic8Tk2Ia310IwRj6S4PZ99f0Kl", "LzjahsNBVjqvkZe5dWCVmegoSKJ6rEg1SgGZwteUbM7w": "Tfd6qi1sj00", "t1vQ8PnrvHLVq0lmT7h5U9nqMcp93QnvvvZtsL1EKyfAwe08ZjS": "c1E", "BeIzF2tI8YfUcudBNd4Jcp8fICvIZA9i5WVrdvKFbPvXTOBA2N": "syobeg3bikF4Tsifhno3z0tOsU3ifTJR1SNaqCIiaKfRgtGpTUwM80As", "esXPBksNPA3WikqsRFnLEe36VfwkGFSpH54D3HzlHnBLOpH9DJvAZzicH": "l1CNUdarNDsMvI9U3qBr36zlreGCPvIum2vqeikEzUB2Dxw", "HD6p5bHos6oCzsotSbB3Ybta6ihZQw28M6EkJdgtd": "dnl6W0WBVwmUakzyjc4rQi8dkO", "YEzwD4eEWtyiq6AbsMKBhpaj1IneJheBa8yPZFBubcLtDIHQ5xDXxHYAJYnSQKkDz": "YthGKK0", "CV6YiULFaUl73OwfOju3ZI6yQsTvVyrPhQRVS2M": "zwq1Oygbkm58sxkItj2ESLZCGErtNJcHOd1oV9Vaoi6tQT0ZcRq9uIYT7", "RO2v7zS7ZMpTVeej7ts4KC3l2w7muntPdRR": "QBGW2CoeWPcpL1mYlMtMEO5kGuRs4Vkff6ED9vp5WPzBp347Ic", "k1zVFutKIAfc": "eomLc0X1LoDhddJETw3AIYyS3IZ", "JvHkHVLZiVeZ46K1Xw6qxBdQ9j9J2Tjl1Oi8K": "lXeAGGJAiXkjuVmgUfiYK0kfzTekzXQySMItMvjPXSnx8O5g", "HfUsO2xZhmo7h0OtcNrj9oVmZ1md68ys": "WOgDevAajU", "ley8eX8j9utYzw4FPqapsZAleWVjNJpiTGx7yLc": "FoQE1qt3uepS5sjetUjrVD6MYqLj9P0PCMmx1aZzpIKLBLCw1SbmPDUK4k", "B2pFfoOP84JnWh3R8YfWl7D9MYZHiknOGztv1LInFucCglm38MYZXAfZQeI5RDk74": "rhcPR9CkkJLsr2deDm9v72upSB36yUxfmeVnjHI6nGK8TDYI1LlpIzXrqbU", "j9bfE8kM7bzFEfUIkpQUXhkWh6Kuw55aIG4Dk0nSoqJW08OX63ToLhaoqO": "gVbRDuOnET3pN5dcgQzDZVqnkwMoUYRHd", "LKGXuhIeeNcK6pwhSVP7J7ToD3So2ObqwGu": "VyGXS", "MYQjLCt7Y0v33oqxomtrbDTg4n1kamcmYmrQJ": "ZBalwmhwL1sev3zItaBs4InLEjhai", "TEPpCdRuLh2gByZfuL": "B9o3ACDeXvs9fC1H8FL1tzuLgiMp0nDoAUopNDKE9ZAgq8eFy4XPSRWnE", "F18IZhfY64Up": "AQAEl1zr6RbmX7O4o3AWGoKT", "xn7u1ABtXTPU2teX52HElAgK3D23KWoEh98Z04zbNe383nv": "LTvxhEW2g7cCXgi8dP5MGGpaezQAmwF5Bg8MlPAEImlMo15Ojxn", "t4ZK": "B2L8E3ZMGfVbQDg94FeHseYB1gjZNq2DSqHJe7l", "EfCWGX8sPPnzHHswxYya6zy0C5pWlrBrURf15R8lnO9VGI56yJiTsotexzoDppII": "HKKpaZyHUy5", "NXyzN1aR": "E8Muu12A4AejwgkF9ekv8KbNCAOMJ36SzdsTgjn0LzFEhD52n5F6Ha8pGyXo", "uEht4bmYWLbArFnoI5U46cDOPFX1qqsbE6CtkCp6AFDKDpvO9KEwMhnKEwU": "DaoqULIPfzaRQVmGiXEijYeIDYS0QwTPT", "moKhaAzfaiwABmG8R12LULV89nO0N7qyOcMTyuN16S6ioSH0kMsAKPJptNlrwS": "JtnYDJ2drFdBFf2qdGWS9HtBKeqS6mSAR48wiKZ", "ulII68ch5Y59eQeItlqLBZvppZUtcQTIFezprOV5j": "kSNIvgcrcuQwjmesVPjZ4GQHrL4xHSJhIcISOyDHS9YCJaL7culqTuXZgTaAtLT1R", "V9nibY": "non8vAoO0OCLntXw", "OfGSuMiZ0QSMg5Kqe4ZqbU0IVF4SUfwvqoU47zW4Y78AumKNn": "HTuo875FLXZfzu4XUjolMPJy2S7HI766L0", "rk9eApwGNJzvYU41QnHoG55jv3JuW6r874uzd6hJJy1YpBN0am9ruvxkcfupo": "FfiwvT9YjzAlqo1QlSzh4GDmXw1", "wX1rI4pWolRFtwPy3oIJ1Gs2zE5oPjsgrULN": "kSe", "ftgcd98hKaNEepkRuQ58sZJEq1zeClxKHUOSv7Nv9MHldKa1IVqnl": "pDdEILClXiwE4qiRdswMxkK8JcWnqQGwhrnvAwOXyt4nKPZn8Ck0oR", "DqQTz3I4Xk2iWVJQ4q3RAF4Ke3m606L7KuUe1K": "DRDiBkDl7ADR2ap5mfRM27nUXcvEmsC4dyvlmyO7nsvOT7uimPKldzA3hZ", "tAwuiU2z2sRqtAsiTBDvVgH8VASTYNnoXb9AewdILvig": "w6XZct", "JsshmkQB2nyOeTeZ8pTaO9Y": "Y", "fZstAjWlMP8lFqC": "r63EkaG6AarhfyvrPw3vjj8wGN5V5SRAl4rFHuTNfumUhF2VRENmGDHLGBeAzEv5U", "usVzZTOP5RgWr0qsRDs7oXnRcnhg74raFD": "a0mVq6cdIEQ0Kc83mcGnA6ZLErSUX0fmjq5Lbhl2PYvi1ZCKCblTSDMpHx", "keZ9KN7HVZ": "awIlEXcf1dKyT1AqIdVyyXbB6f8n5c18U5diqJ6V", "jQsKqtGMeTJ": "IZ93dUkqImx81xhr30nTmr4nXIDC04cFAFnJkWtVVjGvcJG96nrjSJ9X1AhKx", "kixvhMs4xre6DDO9DoEOX0fKPS7wDaA0sBlbq5I42": "sMGnuV0FybxnsOG0N4bxk9ufsWL7xVOPcRfX4lLKk2RNTqoENjaM0Pd", "OdgoH": "rhyImoZV4JGYOhdpwqW3vy7QD3m2uO3i3bIwuUpsJYkEUFX", "yKUtWIsWE1h9XgwGM": "Q4w1zBcsHddApCA3TjNEZq4eNRcQlq4kwDrr6R", "fBSxOLifjMPDYjbl3LtZ64fnm": "p12O5XDbhAcuOPL4", "vlh00pZCGi15ec2zli4YTzhLcxkwOJo": "aLvFBqb9GuQnZaaSSNQqq4eNFd2dP4j8dxCXM3Hob66hYo2", "GR9c2Pbg4RBZ8feN93QnURlcTlWpn": "HMJeP", "PIqiJREW01pE7JRm": "Ugx5A1YmOjNviaNHIHjWkBv2sml4i754wwGvK", "x7bGEcYCPi9dXS5ZsCnBANXOo2": "NvTCIypjdDqn8xnYlD", "fgs7AaxdhG7DXOITE18p7T6UGAlq5vrCWD5aXVLlYPj": "Ept5pVLyUlZ0pfOIa0z4DXt5T0eStvEyO", "nXfISLDDwrqDwM3CLeEznifRetLKXlg6p": "YTyfKHXSk3SPizZwfYDTKFi7FYFL3If5Lsyx1x", "IZsQoFHrVm37GF6tTcI29HF7fqjCDSfjDP6TnU": "E6cYotQEnu9XelitublH5tT", "yWNyoQ6hYQrfVVesz8kY06ElwFaqJxCukosvhJMTOJByTOMBFs3s9NfOUVLbxHI": "wByTldg0yheUvFgjWE045DXSBNfYmBQGXModd4eyDVMvF8m54zvJYuzEupdW", "qChrtbnoI8pI8NF6oVl4ZE3G": "QU6k0cMeGtCKMWt2frykxU4xEhtQRf485F8yI91iMBlVMjAYZsF0c72TF487qVa2W", "W0ndMycTCDFsc5nsdc3JT6OUymzdwSd": "hp9n7i2Bb28ESahd1M2vFsOCWvFCHVkHLFOUEXb47tP4nLIfC7NkE6gW834d8fEz", "QRa5W": "GlaLSykBUo7taKqT6eKFf1TPeERraPAkfvr26frSsn67ODnGx40ji", "Tovax5mvT1": "FyqzUaNx1kDfpryyiiLvg3dYJ5e3IBJV", "nd5tpVQSwFzycVDWGtDgl11r4pc23P1FK6NFnh6mhBJq0idAhgz1LsVGO9qdfAy": "oO0hKhWY2rFLU4Vi71Ssmo65CR6DK6Er", "QZew7Q": "tUiZt81y83I13iA17KuXXVsD9TQa2h4EZz0iAD4QIV", "WGQeY0i": "V6zuCR1E3z2s2M6WHxvTIN", "NHrpeLSNGbowB8j88UGlGaTaTrTIQX9HsiLEq8zhn7g3DoY": "xUXvg1FPNKACWXj5rG672M4GuO6ppKJYJBvi", "Nyy3hTQWNvhuYact34uWW05wquztYt9niaoK": "NrX65UOfdnO39yA2ByaleOMhE3OYdAiIFtUbf", "A8snqa1FjV": "Wt0Td", "yM0Oqv6gnZcGlTopWE3dR": "tZPW", "p4n": "VSwOo8x9n5NygnK2jEae8vWKvfOUAGvTm4Yo8rSqUYFLJtFGLzjVRtYq1xz", "Ltep5J7KDqIi30uUzMOqXcm9VPQTLaGXYU": "r5FqmniVP4XHey7ZdEme2LbQtaq4V14r8aYl53WpKMte8tQxYm6UYPkaLeBHSil", "MwhOIbwgt1NOKUanQvJOjcQdpiN4MJB7xhUxQIk4WWQgIy7mBHSU3G89vVp9ei79": "FI3nv", "CAxL": "LXaHtnogKso4PzxVRGibNA4PgH", "NuEX2MCL1hcD75VnxA19rrCPmuhAzRx5N02bVHaLUQu4tD": "XOCYqPUgeop7HeYp1SlG", "i3E0x9XknMZt7QrBLf2nTYpkYjZ": "pjHDHiGZ1VXXw8D4kCdvi5f", "IcnXmjotsHfPolH5aeZzT1cTFwdcjjGXB819BznaD5n9MK1": "to3Ga4jH7", "ufJ6OUpDQXTisKtnBepibEZLBUBYVJGPkn1QhflMSlyFzPEwwk": "QQ", "fDmslVVSVSnalrBvyNG9h": "LZxv2gmtGgrpinND6KFVG", "mmdkwQAtmUjWcN3D4niAKDvFauFNYSkQfh56RwKDuGCvvsAQuVpdT": "qQowSZ35dsOQatiQ9b9rz0Qsw", "g9H3": "U2pndN", "e74UyQVm8GOtSxt": "CgV9obsEHVG95jjDMrdrjfW39j6DcTO", "j0G8mrldAnKVSRcYD8vjkQuEC5P6KP2gjX3ZS7VFY1H": "AL2Et4PjOjElYnvGYMwZ90n4itRWpmhY", "MSpPszqAxPkiwUv1yeBpvQMrgvejxfWXpNb": "iDFf9B", "Xstu3vuZc3m21BDaUK7qprHi2DHZFOR7RyfRiIo60JVJnWJfYHDGoW": "ZRMyopOVyMhoZrUUxYSfk9LLS1ZssQTncGf6BeGKkZ5steYdQlji1", "IZ4uMXBI0Bs718TbUajI8mcX7DGzoiQ7fU3yXEASM3BCMaG1XJHGvVPF7ixQbTMt": "aQ9AAw1wTSsqwDs7ugHEq", "fZjfK0Y4xRrbyHSlUkSW8QUCObzqYz04b24h": "Nfn3KZx7uLdC1PuyvwYqqm1CWxevoZq0N4vbpCdpjQbeDYRcpliqMHTz6rPpwrYH", "K7M0cAb41QwCwerVbj91O6RactIzcxK4x": "MuvnFAaeuXM1s57MWIsxnB6aeYfElcweJQFiDR88ja7z0aBOkpVvqpL", "ggwYZ14UkhDWH5IggDnu7DqQXyA1CbMWUbrvi": "DW8ah1k07OeoeDD3ZCbJ86wrt62OXcrQcUQu4ogk3iO", "GJ5bIcOWrE3vXhMimbkohRsNJDqdHRQHV0Znz1NSgSyWWNmRCqGbVHlVKquhgP": "fS738y5xaKxe7s4mVMo22iyWmWoKImErUU6786dcuzfgJSwcoqV", "Lk0MVLVPhQgU4q97aAX9hVJeBFQzYFz3P": "Pfr5HAvEd9e7yPRAWWsyXL2HZDRnd1MVrUywrRHct23Vd9smZT5g", "v6iVaPGfvOJytyf7Mw5MCDrkpG3Lj3sRhdENcn0CTXP6lg1dCnDlt86KnQJ4": "nTpYEUuxMVReYLNioql", "vJWbcrZvazFSsMLUn64sJU93BBXYV": "RZ9Uv8cSlkclSJNFbjV6qhTd3UpLGhz34dzfA7lFhQGPq2EIe", "oc7kyIMe0vbtm1yDJZeVzvk": "rqhE", "l3dcdjBQwICYh2qcn8VEQiKo9bwQ301OpCaVC5SF9jQbjysDsTxBTJZ18XVnh": "uPsOEuVNauoDgDYAGJncvNey6eFom6i9wbS6", "R3M1FEqCab": "IY8mwnddE3FXzOh2UDhTdg9YmMpNng8ThO9kWSkeELVyOKLb4pD848osRBaLTSk", "XvMG": "fxZMJEmSj03KYFdfAtyDALbLcMG1BX2d2HRgi5nUL0MuxMWxbX", "SM9t": "PnVstyPXFaPgBHXZiagFHNO0H44IwulboLLSIGW7vn", "eE1pdw0AXVnSMGFosCUCYdhFSXU08DaZ2BBdkFo": "JhHnuA9ZdEA4foETC5N7KiXMxZdFANwURmZ0bViVNSgpb", "Uvv0v1G3Rb8Bc4OEDrUPgpZokdbREe1KMnXyaEbyVbvy1HAt": "oqE9Zc7pnF", "TrbuKQKS59ImUS0BVKdnOZBjta8mlPCQe1DKdu14kH": "FHwlCkOeW3I3Pob8JLCTAB74kBndODeu3A3Ohq29LFpNmCyEImNOhCLksKS3", "lgoSIC0kqbnSjwpBAzAqmYQrxLNbkmmlZRXycCpoGb": "z5XLaieYyrIJsOq0BHa96LSznS043D2fEZsxcvt3SXSmbYdZE6sIVv8tjeYkdywT", "hEsUlGRw3XBSOVbtE8wRVYKuL3wvlAeV2nXqkEl5hb8VlZCCTiPouQ0R7Ug": "mXKy4Whueg9QKXx6g32dvgv0k66W3VgjhgOEczRTT", "b4xTcgP5tAZCEWZMTSp8PaJhJO1KyTcfDUWA1W4i1jVsGzXkd5cejlwc": "CHZleAAKQfYGb6YJXOYQrAqwhnmAVFpbkyjNXGwAMOWcIjjdY", "Op2YDoFP4r3hC3nmT7l9": "DfXWDqi6wsMXwhKMqk2oBJruJY", "vq1mQBKQJjuMjhNO26NBBYl6gYP": "LhHR1eHdcdE8NbXS2bEoGiAO6u5QPL26XNLpgJHNgji0V", "q1BmDWoWUVQEReKy59IBRjSoxWNkvGh54TdXvKx18Pn5Pqqfjsmpf": "BpVc26CPbM9jctszGf29luHkPhbGzhgyr8D8dUh8fgsklc7bY", "XbUE": "Wgig", "B9fSedf79fHge1T8dlgSfaSefGwIBI0qdF8kuoQZPXkZ": "p0MMlJQb2QoRO3YE0PbSUroPIugaZXT1D0K0VM64rtRBGmIAMeDmnvv8D", "TY1PR8c3yF0Bwb0SuSa807idemSZoVD8fCHWrnW": "tkXMZJEo4B9I4Nz3ybxYPKeBKbAYEDfuKLrAg3KkJvMba", "S4xjlyb": "VgGhA8sfGzxTrW2z44O61tqQpd0hVs9DmnjHB9LMxhRuVWMotF8mMcJ05kVvU", "fkFJEBtcz42ZN7ypp75Og": "ZoLo6tATV8aBDlbr8RqX8mcR6MmRQlXzyL2FiNzbuOs", "Ssxx0DITC5Crbp": "fviqN6iha", "TYkaE5o9W4NYyBLv5e7dLvkR": "H02AipQOw5GZJtncUXSnJnmMYIzfmCg46AwsNk", "MOPplOJwyBAmseGAP": "f80EJUuEgC0uaJsMbwKGOxUBUfpIWqcLZqr9T9lQhuTMYjfDwmYYqIn", "HbPXtqpeSC1": "YDkGRZf1WFNmeB9TB3U8V8PlE0hiSnmQm", "kzSz5aNzjqt48n2nAY1oStb": "BxCfsYpXw78w1fDB5Ro262P8MyzZ2I6hKMiarguQj", "CGMcMpq3JVGZY7x8wTUdgJZkFCiK24tUPBNekULSLBa8nrFz": "Eo", "Wan76ymFu72GqSPgIb6dFXRR1oPJ5vUtNjGEX0VxXIq3j63WQho8": "yKGQzfSgBnOojG75dZ8huXnADCzy64a2kBMhOeSAFSVN", "pzZreL5V9rfDiaARYxAkvo3QncP8MXnEvIgGBCRNWP2YJUMYLyer698gyE9": "veDzW8DXo7VfJ7jiHj8zo8m8pJLV9eJNEWO4euZqHMi2oVerS", "jN7my7IfpTp5SYQjJyPRM7OJC8rqfrqn90v": "TlA9mfPoprWUvUET0WhYRB8qmz6nm1NyaG8kzIIUaHbddEyxZoiAuB0m", "R54L2mJyJUdpLvq5D40O": "kKVOzqCI5155M0YnMcLEtcUZUDMwIEquYCB4FB", "ojpupK2WpTI7g2yV": "aEHCCl9nIWio8JvY5fz0xAPb83S9dXnx2B3QXzHKiH0cBeX", "H2MII2T6hIubL86LVkNUZ1QtjmR9WZUEu2q40Ujc6x3lU0A1IHULq": "xAq5HQqGCLUQSP9O1oXeGcbEu9Wk8F59JxC7vbS8fmO7VPvTKIEwphd2d", "cCv": "CokNZ86O75", "Uke4wPvWumtZ3B2VqqKUrSayTUuARvVCW3zS": "sQ75eVCSqn60QN42U5qpQr", "YIVR5VnI4bcEa6aLpfXrUYMApWgWdSatcHrg3RlVtDs": "CjQ5L8LXG7z20Y2a0muuPd9F5rtfpFqK1fuZmX7MB3DaoFcBlcaOz4", "vtrmafjkFXfkVFezCGxoLUDBWhntP8kmpvjGjsxJW3ITuAUVsOuK8Bc": "S9pm78puZybnB5khov7qTXn3LS0h", "xA7jfMim9Tse1av": "BcN563Wk7SeqQp6", "IbQf3XrsplXOhiJ1IZC4iMBwdrD62PMzNGmo1ghMulshd9rDDm": "a24zwuHOq137LpswTXjS9YKXbhNVZDulRWDPnReqlQl1OHvX1MIsrZ7vPtao", "oRfwir05R16": "WUpJvcGCrM", "KSHipwrdzewDA75F0otRotsDp": "Ta4MYvhRIG8ACFfn69cR7pJOb0LbFvg9HvDV", "R4RrPSUyfgluQKKqGQ1emo1U3dYKYQbnmLRRHix7Ol0u4GHtPSJVvKvRLoUd": "P5s", "r9": "cPkZhV", "DkSP4oUR5a1hGmr": "B0pqqd15y712zPgPlL0PMAS4j3ubAHVbac5MzmNzQmeCvSY4lqi0DxSCjf", "wKlBoHu7k0QF7hGbDQj7UrJmsu": "F4Nh9X0a24ciPIn7156K", "bPevLlUGPZGuledyCgD2KdjivGtHMLiNK3cj6V7o8L2FG6UUtW7Lu2MBtPUpdgW": "EqMsKCw3RD3d", "E6w0ElyG6prCWQkplF4ojjYSNrzf14rLQq6r": "w", "oiYcMj94j5jyQWLYRWgtsQVl5zHlb5AtISKTrcGF3X16x5j9EGEbF6RAX3iqmP": "tuOvdOBScmIbflogblQiPquOwAFsW3oXoUmgS67PlwYuUaa0HqdMKtV0jpGs5fr", "iKDRJJtFXpxAySCWGnYt709Z3x45r0FJ2ZzBun4KWmXb62KclKPwW": "v93ZngXUdUhc7pcMDqg1ziZ1v", "s0wOYsKcePbz3qzUozZiO5Vl8yo": "CssRrCv2NOkQ5KvDw1rdmECDjxiwRNAnge", "QX8CaLuh3aAGv9JCkpzLP9jL5lj7G2Fi5jPzKcQLWGNeZQMMtRu": "vWLCYg3wUimZyUY77Tq9", "t633i4lx9fXnyX435nGvbLNpSXcPgE4N0bcz2DN36bECWyMNeiNIji1Ss": "vKCZqAJKf7JBO0EbyWs", "egjeRSoeCmBCGEM5uucMMIEim8dmegYD": "EB5HNtxZNs2JRz6WLrAPyPcUj4TJBKNqR7vEAFQUbKKt2G2n5fHHqY98mkK", "DVryBUqLWnWMso1C6g3bEGSahRbE2usYz4pN": "B5JYE5Nz3YttN0jkGhy9qHUoivCrI", "OfcXQ9lyYDP5SvFTGT8": "I3Wgab3aiY6xIA7Ih2", "J08K3BfoejQmK5LGXX4kk2X0zVFYKdx3jQGtVA9so6UM2yezMfpsKJFBLtnQdv3g": "usGiDQQFJ4OzgMZpjknNUXzCJZaThWFuadUhtDk4oBa40rs5bY9GlkQnvdr", "WoVE2wXB6RRyV1AYC8DZhZW9DLsqrdC1Q7sDfa54wvGgB6bfgRqpw1WdRsed": "iIL4oqFP5ufkzDp7i", "zcQZoVIrACdajDPhzKF8vbcre5pV3sLibjLKz3nKu": "zXLnI4y47kI0d470GB6YV2bsQ9XFqS840FrnWf02eVL", "UuyTfRJul064qSJ13yWtBif1A0OQSOvyCSu8kyA": "HN9U", "gSKhN2cNPuXhCY7n4Y2W5c8pQS7PiTByjb0zKEyZM30lzr7y3UynwkS": "ogqxP4EdVB", "sk2hXfoRKVNlMPYxzBqn9612h7BuVOg0mxaCNTw3WHESXoQ5CXh": "uW7Vnbj6fPw7VGZLO4N58ZH0Ibd1FnUqCddhFOjWMvxCyE2", "vn6": "KdBZhbzH9gEGCGan3ooZJ0fig049HXtdlfWOV99r83PHB5mdBnfP2bNLQ1", "IXta5NI2Pi0XoldV3UIqYIuFaHBis6HwvISrykbq": "Hel8p2DlZBVgaYUGNScVPgOhgVP7vnmmmjSWWHcSwuD0HuCtUGkSwk962VyuMQ7q", "q7XBHBDEfxW4c7GDq2ejmfcgHPFQbaBf74LT0LV64bUPUO7XqgRNWONVr1C": "tf999wz", "kLb93AzsHQXqgMvlEyH4Nd9LH6C7BMMS": "p3HwsoDvkbc94M4SWwSLBVL3VgqRro1PwDalzkhQp3p6sWf4GyYd5GpLtX9XN", "mBxuym44MLGUdUKlBxRS4zjFmFC": "tpiXjmhYC8rsSuBoCedCwxIgwWiY22C", "ocgOPOiXcAWjYBzYCaK5et0NcVwobg3xRqfaYcC99o2fX5Np": "FZD9YOD0wN", "MA": "CotaAYQucjedVGo1w1FXwkY700cobe6bjQNklqW8pkyb", "L0J6Iil6tr8ZgtMkPppd7vXyOMOQReDCq6PS": "BExwEHB4RwvE82zKQ5aPDBxMherTFI6iqAw9Gcs", "Ljvgv4ZqyYIpp4lsJD7AHENykzv9XH3lu7Vk7RBSEVUL4dLrEAp4jwPX0kPnxhn2": "pA7tmhYuIh6pzQObBxuAA9JYRCesdXip1T", "TIF5bky6H4bKjbmbb": "titvYdXLqOwbMM6rwClSlxT4YU6t89lFXLhGDU6wttpQkWoKlVYbdaPSIPsZD2AfI", "Olq39ilh8pTRhDm4bQSkk9P0jDO6zE62btXszqG3CudxG6drIa9": "MbqROcz7tEq5fxVkh39mBF7cU", "QzVWOeIHmZP6F3RaxKNbS4X": "p5u77HMQSpv", "dEUX7aS": "QPzkBxrzeYnOcK1WRpp5Ohm", "lGzqGM6H6us3Zb3gXbXy2Vv": "iKWhrMqz5CwfnJ0IHcKmjaxDO4BX8ilCNPVEEdeZ2puXxku1f4cQ6MYLUkVQ", "DnLVmtcsFZ5AAiauW3LRIYZ2mjYcdQvC2fPc0rAcRreWbI1bVlYQrC4scBmcJaF": "nxDyiyn5YDUtkJF9yd0PNv", "DQ1msJ1HG2S4NYQzctyhytt8R0PKgccImjvG3xkE8XHxVhpfS5etI1UoBLNu79O9S": "TQUvLk", "d7V8TwoSs4vjZhpdV2Wgn9l0SeEsWlhUDexT3l4iNGTB7q1ozVW5r": "BhcPa6vvpDgLHlV5JR0ZoSr3nFJMLKbE34H1qPJqb24ZkTXFm8HoVA", "L5FONGSf2QjVScUm58akMz": "MkaJo", "w1E23Xl0OM9FK7g1LmftPIzY": "eyluNGiiCJQM2XTndaDed2bSI9gVGy0pOylZaz6D5dzWw", "QCoq": "eZSPfahpC", "FTBkcXKZRZVPETBuTu8wB8b9DhCWIG0oSMi6R8QJII7SFTYF3oC": "C2uY5SgWYeqozhe3Al4LqG9", "SJFcgtx9v8Lz0MkETzPz6cUgntoOcD0Bvws7Z20pIeE5T1RLv1xA8ihfT": "REUxfxSQylgXvAo3awa8HzR", "rBCzxB8ETCa4JLLllFQK6Up8uwrt2n0dcNhvccCzFAI28": "g7KxDiDcA9lmncCGLYlIpqf6FwZsHKLUaLTYgz1tDUEEiTNbZNrZ3SbwZ", "KY8uU22QnbABIP2XlY39zPEyMywomDxU2EI0mPBemHhaoJ": "qMMF0MvsKIubwvH4gMbQSS8nU", "mkpaKVYVpAJkKvRuwWyS8": "YyTqtFzf4JDzNAvy34Fe3PVcUw9SwxE50V5RVQLP0i6qFsQOM8", "If1rbW07VrseWA6rtfuSu0r4BfGT3Ku57SodOBZ8Dp52OJESk3": "c0RdOvk0TpwGik8VKgiHiNIcGsam5CYRhXBpWHQyN80vmUusjUjQnvM", "SYDL": "o7F9prMD5ZwA1Jq7ZWOaxhlPp7hRvP1U2k0KytiHngX3iPGHFx7Ld9sSoIEUQfKN", "tEAxZcSzFzw8jVbl5E0G2pyrNL5xfdOGUNr0Yb": "WmPn0gpx", "aXhpSGZfYdcm9G7huFyKxespxtdMaJU8mtKLyKDUJNIcArqnYndjDI2bbXH": "bW8NgEEHB4z6x9hnuNiV09xP9uaX73x1CeOrb7eGWdvoVPl2", "nYnEqf": "abYeT0", "SskBauRBEKFPIQ0DWAk9cz8Dr5kRuNlfWDp12": "MXjALNPSfTYAv3e9g70uqSNjw4VW158iHy", "AZ3xn7tiyQWsF3DtkOMQvWzFEIk1O8qQBbmDRWIZr0": "sjFy4g9OKEos", "DdwQTPFvpWLE4df2ZEEI9NkTOF73e0Tnl8sCurOxEx": "QWEQpz1OqOjsoAaKVr348hL88PFdt7Bm6Idnv37VbWaP57JWcsvY1H3UkKN8zZf", "mRDcbnL5K2fLrvPEg": "ozofvQGJtAcyvLjjcligRg7qSId5wi0zfAyXkP", "Nj5bouE1oLRuaXfY": "eheNrVXtaOPoRxRocNsvudL1vKaDSNfYHfsdXYVBZbSt6TKN63Id", "uLPcPCTAiBxVwYhuxVuJa6KZMuiJK4yZCOC30": "yuQPweMU5", "MjbDvLBuy8ofvTa": "HxC2GfLU7D7obIQASxzXFh9M3gx7S2oNOwJsWwZbTRAo3KYk9euxVDV", "o6lRHOE8MVMNyQnE3b58i3LqW": "fz1L7AizMKX", "Jzgj6dyMwquudvlKULDCH14jLNrq9wwb2J3rGUvqavEena3ViPu3yNCZcJfwPbtb": "uz", "nRn8y5cGjqs5PUDy9dfFTrk0ZG": "Ruv48OSiiFbGIaG4IGI2", "N8OS2OfUDoWQGXZHVoSF9Ys9jbRA92": "Ao1HWgpglpw46kuOg", "UvWP0pad1q7AngQbeSHbv": "GJmDA7Siq013uz3nFXJJOrXO7UVcRV7BsP4UWBRZMMMGULlgVeSGSny", "IG7FbwFXW7qSOaVokRjN5E4Par0Wkd": "BozdUhcLEoIXB6zCrYYTaQTWBhdBeQS3Xsr43BiYAr", "D51u1A8iBYG5NDCqtOdJ0mRWbCGAXrr6I0gpHzoGkQOzqzJeVE": "K83K8Wx6IRrGHjYITp57658CPBfDBPrvtUH5YKozP3InnO5Z0eu3xg9z8", "XTUx0ujqMm4vdskR7VCRdFKKX3oJy4RImH99fh1SfT5vfxjTMgNZz": "GNe6SpxcyEpvg4f4yECBXRN1llSlEwRn5kbzbXqg7Rtkudg7UEZbgU9JH", "Itk": "HYSbtztJus", "dY0ppAHqJveRGHHvKK9Vms3PljbKohnqH3PmORpTmYQC4FcrTOAz": "S3EcaFfxiark9Tj80ugsSAecEsXVSCGfTk7rI", "k7uXL1PZq": "t9XHnRSki48e3LgZ4jwTDsz1YIVlwHuqkkjEUQHaFMTXPEzxRNORyzyAHIJ", "zYngZApl2Q1tlI": "BW61XD5d", "yi9Zsg6FRA6g82UHzzu2nsAzHOSQ3IW4Kz": "YMTmHpEAM4OFd", "PpNgZyFrT74Qc9crZDncmno6TI3A3vM5XR8QLs64gxDssfYgZqRMhXPl": "WURoNsP7lX45PlL7FJ", "pr0NgVtqbmxcLYSvXtLW6SXIWpT3NwkngmBj": "d3gDLELZWvBQXQS6B3xL51njgH8BTnq", "xU9e9hyX6c2J0pUQAROsiyoDLO01KLMIn": "LS4qPxZMcodd3WegrQy6Vj2TQsTPTPyPLpI1EaJ1DWJl", "AiBRHXVKiWGThzhCUrppfKlE8i8RvSNyTnqnuQCvHb4MvyOMbjCWOns9sNfTYd9G": "SDRs3oSo5YgxU9E6iG5ZN5kUOlsdiJsk1q", "hn": "itEflZwZQuG5L8n8Vo56WtMdhVTxQC9QHzChrNV33Y", "Fdvk6OL5uns7cjJkOaykqokXgQqiJn1jewbmtwoXpcmkDf": "P9tXkasvD1DqwvciKB6GxanLg97uJfVmdNzXrMgDucSXYDZfKExfG1FpAEo", "mqJHOt1Qdv4wt7Y7Jnyq3Xpq7e3NKMUB3XyVDAORL6VBUEKv6Espe": "PAHo8w19Ul5Dmg3xAlALD1m3C", "Tyqm7AW": "ums", "PvhbTUafdMQRpKvti3Nvq7UqO5W6Y0D2c6WubzPRJNjufi8lYPTgCROqWRefWq": "dEi4oFBtXJXsPWSBTR2KPoIhOJFP9InzzysWTgoJxLfWm5vmxXSJniM", "Oopqg5ra0ASeFhtbuseBvo5lANxny8MXok4Z74Fc7oaZLPQ75LAuAdbtYiBN6wDa": "pYKRIAsbeb1BuYATcY3tZzZHDhMBBJ8", "vKZ18JV4VdsIvrC77hOObMT6etIoY20Cu0QhY": "xR8zUX8lxUTCUIQfl1EEV9gl7fHnDM3xxNUxzNMit15ZCzYk1aFqx86edCs", "RON345qul7SKQE3RwR1tAM6eCv8ksLQ": "agmIuYyXTWFDJh3UhgXKRQXRMtgyYKU", "G1Lj3ZQ72FZtA9bHrcRLZ8v1TkuBsgIoU0D": "i1o", "c30F": "MBvoXVJ6eqg0kCpoFvPrPbkwrmZHPFlPrcziBTSuTnDl87pKOYt9mwmZHHZTmJ", "ibqTPC": "VZFTnlyCvVTYVZxG", "Pfdzz3HyH6PDUSbOvPVLoJOBQKTWQhALaVDhAv8W4ap5DpxmD1USAtt8yfdZ": "AA8h49BSngU", "WZIgDGwU7snCh": "yMHB8eLFWpXwtuyQPO8LdNJn1", "WK0a": "Weiyvjl30QiUfjMaBVpmrrD2B5y2vqU3zNFVecoYqRN", "F0K07Wkyq92kYWGLh1718Xw5OA3hfHBYxh2iqt": "DsztFHsnGlzdU7i9LBjrocEPlKopaUA1h7oyXl", "iE70HAr4RGMJjNJQrPD5EVGhc7i9ZnHOYHV1LvtEA": "mS205ialPvksNbyjGwhQ602z", "AiAH6nIsjwmEetUC07c7eqVfqAKhKtUEgIsqca3j": "Sf9njQmgTcC85RqW0GdXz5uhPVpYqGV1e2X3mGwaSTBFP", "ueIjaZNdiZY2ikvtw1XtYrMoLHcYLtbCYfmEB18CLtoG8UH6x9xEgoOwBgWyrUqh": "cDfIiW9dyp3SlNTRNEUk", "S1ysYKO9LngEKa8uUM": "wag4RKpZL1g4R3QPi", "uonD5ytd5WqUpCFTpJ7RpZXl": "LD7ccVO6cjusz5FiZvS7dNCUCbP9LpTrGkv9OaNgAHkVZMNCfGQXHaLCFIVhcM", "aFKkeOYwRGVKVbwUy0XnPnIBOVX28smLqh5VxNgiledkNlkwoMp": "mxavonKHztTjVXSECVekVUpAbLi50H9BEHk0PPT0k31KiMHvaIgHYdNr2Oq4Ks", "KHdC2yz81ZOMghLpcfU1": "QOgJPiskPMpIBIb2Ek6ES8l60", "zN7st3bLrSC3EPrgRSQg2ZvxSwKumAI17bWxQ1pPnsOSn0ketBRnNKyN": "tp0T", "lpZ14W2pdIG": "S", "szlw133DwjRm3ziX61S0QYQt41JkAPbn1km4aMBrHwoHHZrfxsz6XL": "sS9cnqVIH4b1", "sGMnWIOVa3ff": "IVH6H7kqu4fZniqgmVjiE14F5qHzB6OB7b6Sqn6MSLQU8JUuPeHSJBpj3", "EqISKvnCxigFHHCjJay1CqWF4MxxszRfwd63G9OiDSaMGM0QbbGW3C": "dQDkKzCsIppG7JGqVW1dNWQuQE5xkSMbWZ86hlBGIxRwfRmye", "wtPxO9e5kdASol1rp5FwRMEz5F53lGqaostR9HaKI58PrXWRAGrJA": "KRDaWUDyfPhVTCZIbSUgu", "tOTsmn8Zo2ECIGTIYQwICil14aPFEPFLBH0A4HKCsQohVFf43AvA": "ADa6GJ", "tUbpIHRzaZeHxVW15Ul7JEkfpuGnOWXciyrOp3V": "bfk4", "yDhtSd0qIlnTM": "NskELS4F9tNAPPNyvgYaSdDCt", "xbROJ3BqZIxVNqyHzJVNq1Zca7a3I2Lr4vXKG91nr": "h5DTwQTlwdaPAUTfT2xD53XC71znQXyCX1FpzA", "uCWIGvJ99GaTQdDP2Y3G7W7pjKHeBADt6E3MpuEIbd": "gjTtAY4Kbzk81Ll46S8JcxCshweZOIL4qqnTW4oIcmKCTfSXHZz", "n5AbdWCLUnBjqBeuGttnO4xjUYzGS94vuPSkziPQ5FspUYPrQWH": "yjVVq", "bjJ2": "gJH0U1okmLca9oo", "XufE094S31aO6tZVSMgEzWfyure2gbnr13dRWihB9vWvf7QEMoasIyfsJ": "ifXuImDo6vn6sKNXZyqVY", "x5yLA2zHxt8": "b8rszjwsXU0CXxkN7VrCEaFZpPLtrdqLvcjTf1KXMQ4OI3", "Deh5E3H2U5l8slO0b5vl9jiB6Dec3dBbgMqwnIYY1PXwjIQrpZBb9BVVcEPAIhw": "E8tCTwxUevi4SJQCMTF", "fYa8AOxuyyYfmYbxYTbBxX5AkpyPfiEx0Qzm1woDGk": "wWwG74ig6pJAU", "BFc6ADzeEH4MzogvyGlHhO": "xe2teL7lNj1", "aYhlzGBm9V87O17bGSAF5nSYodfjENWFHLVeAfqUAVMwIqg7lPAA4yZSp": "sexAw8fZPkkpowQmQRupIEENKKgsfhAK2x8bvTzp3FQQmPCgzn67TycdOvNJY4", "m60BxhzvSFfVzavkNmjfocvhCpoqWsZjH5j96p39L5vhhsp37eGOcHKJBryTJ": "jBlePIFp00gAxeDNoY44MsE17mzwGCx9Ic", "uSaSNMd0xhMZ6hAUYrClDqqMOPiXVj7QPN70CJ0zvTmCvA087odQ": "kHodMelve6L4PY59BIv6iD1k", "Qno9ewcBqu3ozaZyXxcZO5KrVutdnv2AV3fJS5vUGRSgB6SwU": "FEalkn9QjoEtz1w1NIvXBNM1ylDuZ9sdpECXjpsqQ9W6UNzsl7k4sA2lBMhPO", "c6mwWaqzDqRgRG3g9pHgt7EGnRaVnW6j1m": "SQHitStfy2PtTDhi2IBq7yZYnimHZmPgFl9w1jVSgsoHnP4nW", "BHquXwinGBe8gnJzTuhCnpZLLBfnd3XDmhw3KZJFTySSPCeYLXxUTN5": "pNA", "EI2QavMHfUOm1aVRyb89ieKmZN85U8GGQJWye0jXDM9DNiqBbMIGUcY9bzmyER9B": "Qq4NptzVKPKUWs9I8j3D1l1pFxEq6nIl5voWCK6", "z0tL7GfdKTgq3N0pChJpaI9VmgFtoAV3FAoZxM38kgUQBUhrxOdC": "EojaScl5Zwwq1XnnYg9Mqxuj9Iu1Tn", "ph21gnoexOJQ5": "UGrunksKIGXM", "Ra4x6MXZwzTxFdYh5Kf9t8JomMNJz8BGZECaVPTIzKNZ3TEQdIF2XytAN8Cy5DBP": "ea9fcJ4hCcdWJNwYkvYATBpj5OEOlX0F", "OR4ZDzUn71BgHCi2VqkOwzu5yoJu3RXY6": "SJeZxtkyQe9lMnbs2u9YCVX", "ngOcIaQchowp0PPMN785l5mpimwwukCSZZPIxxajKH5aO": "zIfvPOIC0GEU9OB5GE5iJPtoFJgMqo33GpquPfXEo", "B4oMHtWPcrEYdl": "Z8MfYTP2Ko505WUO3rxYBBrZTz0Yztf7NZEJ60", "rWfEqTVGB62iDnhriMb": "N2LQ5n1xnUKRzoaboYURSwTO4elqNNQ6ovPO3F3", "nYlSGqfvQiEfBtoEP3hNeWAqBCisIg6049wSjr4gyCaWh5jXdSx0gN2": "bYV4wgVBO4RkO4qmbUDhjyVmnwUK3jWV3JjWRI9Og7puwbPq3XWUzOKjJcWusvMc", "Kb79WS1ld93t3qjGk23Y3wPgDuK7ledvYO0bUtTgaolABFIWzcUMytx": "p74w", "nksZUb39R": "CHcvg", "ibqzxvSzc3hvvC2WgzATPcZeZeKkldjHMt7uxJ0lrzD67Rhw0Mv": "GwFZvfMRQRbPg6", "ZszA391V8p2OkNKkkBAcg1Eugw6vIVrj0Hkfpx3VZASiK8tGa": "kd9QVNoHaTdUBBrQEx5HAgSsOurBLGLjo9jUqDll87OgLjKw2SwJrQPQq", "cbx9ZQ6A": "Voyba00WbWfEKIZ0Xps9xuC", "OAOpfLYr3uq1": "jlF6tXXlN2", "eoiN4ja5hy5x5v0oe3RVaV2yOCZqldxTHYDlFaiV8Me": "fbef0uBRBC9vAPhXUJ4aPASEtHUX3FA5", "CccUNebJSJlNKsx4quydjfWQ46gpHGfbB": "E0fwmc17UC2HhjgujF", "Lg7KDpaHRVQyj1WmP4fSqXFZ67VGBz7gMLqJPRV58N9Mvxu8": "W18c1tTEnVRLocVecC51tB", "sSMJZvbjj6cxf9TDqT8bTfWhNnda2lTNCwXUQjNfWvyLieUcTRuf1UxNJDaYo": "X6cbIKa", "jtDMMNTnGxXUTghAMkTV": "Tzu98RlJLJEws1ZuA", "NkJ6lsBUdhdUY11AZ0C0YvFavN5ZYelpxe3eSupwvV1P": "pkRroChvRYTYFRYbx6ECC6EjkewllJEOMAxoPhcxmSUb", "qEWfluAYFoDl8Kj3BQGpXSXIS0q0ydwTyNee23GYJG86a0k2KwHQlXmyfyZY8z": "GW7n6B6TnuI1KbCQ2ZlraEztavvhdqYIF7o1djkmSbtfT9dsoOEFLULG", "WEEXyfF1P76phopfW": "cKrFcXkdO5bZNEH0i", "pPDOaHrJ6V7mVmUEXTRmSJCH9xjJxvWGZnKH0PPzLjaK": "u32su5x9cjv7ftZeP8", "pSthum6RpgT": "L3PCDiIm", "JuKB6EV2yO7iBgDc07IiXYjwXyHKrkLZOeMWAkXSlN3zxFEsRAJV2QNN8JP": "u4fmRTd", "sIYnjPY7uLHKavLOkwno2xDbm1jO1IzyFEGQoBmTmF2j46OmK6kOjn": "t", "lJ7cUefcWY78dySyQeAa7XC8tYeL3xITeWry6WYeOe8xhPYiUEWDkSoHsP7cK": "iCc7b9B63JvvYpfuvlrGe8c3", "j0bq5US0ucLkWmu5Qi6hfSEa7KL7qKnwdhloGZvogNxsX": "BwTnzu5hXXTPhLCdY2RsdHjLbfl4ysWoxYamkj", "SmPR29w": "Zf60hyjX5FsO8VTolkiN6jkk142q81nCQRpEW0Mu3FOYNo6ECLwU1P8harAIFD7l5", "IPOII3j7cWjUDFapgn0hxfOfEDdMFwYs5FYDBM3": "V2bcdYcmi1mGZHENp91ylxg2kD4RwfqH5sjCp2q4cR4Y5cV4sdkcMU7yxYbzhrdB", "JT80krXk31W9oLzIq12m744nDcsQ4Ze6qnPSXKab": "IGDbZnU82mDlqczau21eTfspofIP2d3SVbSP3Bi3I9JIEBpMPxlxT", "bcMMlJVkoqN4BH7uzUntKxFUoc6lsYpPeAJ9k96": "hdor0LfsKicMXR7jS48vsDoudK0vdzvt22p75VKRQdFxUhuzAXzOFk35vtr2YO", "mfkLqHMJJv3iX9xzdbhjpT9OIGnqJKL4a": "tVZBszT4lWHGou1eIYFlBN", "XSxPkxbzcuVvJt5ki2w4H05iyTiIOmTtcSvjVefTd3": "lngiw4GCOPjoubOzaPF0MetBV3vKJAfIvGLlKhQsubul4kf9qwQw1MGD", "OUaIKbWkV2": "ITmiZbsELwTHtZ7Gv8NQKzjFPjCJLKtiy7G2NJ92xY9OsjBWgogdy2K8Ru1", "YqjrujWhcn2DlFurDcwo2Ww19nEJse": "wW6wKyUHAVIBep7NAdOubkTiwjz56798nfLAa", "yeZ9CoIOevZQk44fbEb9Q4": "Xbsv86pZ5", "y53f": "DYix3jW", "kuBms6yg": "mYAnIu9VhRNWmmJ9tAz36hvoW9VMvsdV", "P154JKX0x6bkT5W1BoEp0KLs53m6n": "EeT9nmTv", "rlIMifUKsq0xuepajODMhsHoxrAxayyDkVplAaH8csknm70IxtO2xWQ0KsRe8a": "jwReZpEvLJnkSGesiJrwpfRsJVQCAf5fW9e32zjSGPi3d5v", "PHZ4YbEYPqh8JUQKjyERNo2sKyZ0avKQyZRWYPuQ86jbyf2": "OQtvnlk5yHVDH", "heHSRU9jn7DMC1oibO3QgZHYsCJ34oI0p8F86nqWf5rXjWyKENB0e9tNp": "R1kGsvr7tjbupD9Z6FTIxvtQtXZkgQjvcusSce", "LdKGXvZ5FTvPSLmr4OYyEbAT4m": "Wx3CtXFa4qro4nw2XDWePOixetd8c216nFcUnQcfVa2pJ0jyJjE", "rdGMUbxaaH0rpn6fEmvyu92e5hcRSv8rnjKrYodfON63SyVo8vBpgJERjOm4S": "D51lDoPDGoGAa4FnvLnDhwLNxTYm3NIH5oNfMoQMw8qyjIC4QV8fn", "PYM2n6tf7uyZpGi0KG": "areqDNJv9N33P0fTJGmTiGQ7K72WOhhaGRKbvn4LG825a1LPP9dJlLSN3M", "fhBM": "LHY0GS17NAb0AAoygsPKyv3A2B", "BjqmnAjpylCPSYUkgKcY9d4k9d4j": "m6xWLRnQ48jggK9W8udL7LaWQykU", "kKhZzSZBxwvUrsagbwc7": "GIUZypQGtlgBM9s", "SjXD": "XCiezRsqFDt1rde5YW4Gpjfw4NZdiLZM", "vxHRIIZipbpIy2BBb1NYhf95Tr8IBQWxUXxmhQvFJAR9Ac0": "vUJ4pSimbW1eJgoB", "Kf3cVBPfQC4col87XU1m": "ZDccB8gHg1p7f359uY72j0DRhhQhXb3Px", "fzyyI6uVyH5Jwqt6Xed6OcZK0za6SsJPqUvYzQDJwJXTE68l2of6LhXEs2Xxt13K": "TPOVWe5smcV3HFD7x5fUlIDSr3lETW3l", "c8ZAXvclaAPUIACwck3fhJQSg3U2H7xlc4fxrdBo": "LrKwan5TCXknLQ6kKFPOFKPnf4IZE1ulG0itenS0J", "bjREjWR3iS0YnDAa": "A8mGqh4MQZ5y6mMOL2ulc9yPvgUxWQiPU6", "KRH7GOxqkScTO8BGWadnABOWlCi": "wRyK8", "CvMM": "aV2IwN8HmHToKrML7otLXIsuf2qnTkORheL5mV", "KCZ5jLdrFaUj1p4hcDiC7WpRyc27zsobOaRATWzfb2z7vwu9k0OC": "dVForL8k", "y1g2Ypxdv6vIBRboHtvz71Rcq5ZSUUB0BdR4giqNGxAXg61raNbj": "ajPJYW3CumP8vnqzg6ibF", "H2M1MkXjGZxtaJHgJnTp3Sdmn3nphB8WBIrbae5QjttIfeF": "T", "WWgEuHjUTgR8jvueobLBkkZfFmBshtG": "OtuBDYLCpPsxFCTK5BABL946htffawuBSn", "StEp4yGbvCzfKQO3jeXbRTfgmUFKshcUtDIteM0Ce": "qYgMuRKOrw4EJHWsox", "zMNBR38eqHvfwB9dO8X2NSQFPM5MSt3yYfpLvQT0qaxFJGsCEFZ5avigggJ80": "x1yyUUdZDWs2u5", "HOEcCqloPGSVn9BfCO1baXcrRYgdlY": "un5PTIg1M8tHBWv", "YSQdzNEspJ01veU": "OFIjJ2EZMzprEMj7dKjlO8Jym8SdihEK2ZqaFRveX", "ihSk5hBvkEEAqF9WrG1NIBsV": "RrXRi1nLCEjVqcfNQbuic3xSwb3lF1HfVlC", "aSiy7VDnoNagAbJ7AGPqCp4WCQHB4WCBcSblHu6Z5YuwK4foMYiXWW047Ens": "Iz1ucDzuPSw1nd736akR7SGMgUb", "onh48emLY4cHNiFlDqvCj14e2PMwOs8bxWC4JsEpn9": "aFLsK80ccBAkXl1HvvmPwkYVRHqpRzNJj", "NHwm3CON12kJxq1gwFG0M9xIAhml3cyOeM9UDB3qR7hc": "yPqeTcydpUKQrv9", "AOt9UjKych0HoWhPzmayhAfNqiCTrwvir0DqF5qZE4dhbcO4lx": "t44A0FMFT0I7ujh0utcSeWkC", "zPgoiG1ElIfhw9XzFJCKKU3iXAWNLSXto3J00gMTxAMxl4kMnpKBf9qFD9aqmJd2y": "dMXAQqJsTkbpL0O2ClRhoHMzZyqv62XdGv6Xs8bUICvJiqeKTh9aYe", "jjNnwZ7Ms8Mp4": "E1TH", "TAeZ6izlYT41ouQPVGq17dWPyjHGDpBEWK9wgKjQwUTL9gul5vrfa": "rb8eRfFFSp", "TjD8GuMmMIT93M0rHquKoRoPN3jnOfn568hvi4fuVShzG9wO9OXNji6BJvc0sv": "KP8c6OIcYvA3DDLncK7cRh50lcdUfVMs5gKPqavoBG35GEwxWTz6dg", "s7S7zeO34bHFM6q6yul6Xpmk0E7V5YG1FSWh354Njs": "ZZotlnWA4VEsPHjs95SiOlF8An2CUzDUMBA3quQIpdXIzRiwlWY00umOC61AiIO", "q963Q7gfw95vPAlvcs9vfuxvJpkABUPVTxs3QRGj5JneaCJR729b7ml": "WFQ8h8aSp2W09mCwkaXNak9TwQIX7eO8noFv7A1b0", "Dbe": "nSNAp2bhYw1I7Jp", "MbROPD8KHVEYLaIh8b": "hmtsK1RLVH9PLLo0gU", "CuLqwo0MAsghJYfLu24wIWV75mQa0WR": "RKXoLylK4", "Ar": "YI", "twPYrNJhCZrHjS8WsL42jkCfBywcqmNxqAPj": "TVh80RyaKtRDp9kk5AnRZ7WgkLNsXwKUsiODm7k4dHpC9hftS0lp0FdkoekTp", "lpXnKJyHhsX122KPWL6w1V9HkRv": "sjQTx51Fn6P3uGZAyV9TeEJwe7L46neoJKKVBnqArZmM28", "LbmmJNAtOTWMD17v6TmLzoBHrJeV6WR": "Yy35docVcjUXyk", "FBqlEwJsfb7LdLGi6sRD3N": "xiDP8x4b4Vn0CylOXs2TbwjlcdvdzYlOZfOWR9vOVw", "rpANRv6z6JjxzZyCnyNPRbFQZZdAIWyALUmr7jL": "fGFuxgryy507MmAm71L6cVRLKYSfWH1VWCh4IA4MBO5xZp4BKT", "KyFS9Cms": "plDuzGCMAJbJg4vpnetPmkrjuXWkg4s5i", "H9OFkTEGe5RtYE6dlvF75hgP702jBBFYGA8lpOcjGigV1Boaf1isuDa2L": "Iqsa0UgbIqOW8eEqmYQtdlrIScCKmgeTtHv", "kb44KKr": "TLxuWLDESLOyMy6OfWJB2SP5irfDWxOOqJk2vnx9usneSVuhE2Qjfdoi7uDMpn", "KBqNjDtrMo269pVWJkm89INxiVVrfCuf3Lo4Do49nLm1l77rmXWD3s": "BuftiaeC4L9B55WyZqxN3ImRora1qKLreTHPUo5dS", "paVaFsq": "jRJX38APQU1PAakb3q1AEmopwuDrWlsrq6Z4HvK9m3cMCg78ltoJF4", "EcqLwy": "t3nAV3b5ldiUHev", "HqMN1L4rD": "iSYaJjYjwCTh1yr27rCRp9dqz", "mB4bHvmNDwLgwFy9iIw53x": "c2scm409fx8d73QvOyFWHdxQcV55B9BsW", "RBVulLBsEBzH8fbIoYdKbjRqu4m": "rpEBJRCpfYGmJHgOPifuXkr2BnPR", "WCdPFsd0JPaNJiWRX577H5LBYTPk99I7R6kRbH6Jpva9XMfOVq1VwHeqVznYE4ls0": "FP3xm", "kHjNZNHTrh": "LgS1UYgy", "joek3NciF8IKhDMnesk6ntkj11MZbfD0GclPWVa7yWTJvgiZtXkWGmQ40f0bpIWF": "lJf2Ld29PMfuBYh5ePmT62Yua6Rz7dCo7jFjrSG3pTUm0M4vBfqx5aJGzVTBE0EY7", "laxMqfzb79DRx8kv4n4sm": "AVqkT7J8WaXePRfRIvXRI6xigOrfrlvmZKdG", "w1Zek3JJfmEIu6uQO80Y0nIXAHSqXbwFKRJDk": "qZ1sX", "sxWEUaBr0Y3xvrueofPWj8K3ZqfGqbG8MoJF3fFNFOP0Kz7S": "hMcLNnScrRDa0g", "FyqD5yM10f8ftOVHkp3YjkoxqRCDXtMCiX7zDVuAswYRKrO59OklmoiKkJOAK": "Wkh2xxN1XAbb6IpklleIq95qfRsWyVZUASRQtY9w2ruU44RL1202yHr", "cN": "Kp", "JmYcImgE6": "AHLVEciWb2VbW63WzCfSZJnQCOXy6", "PIqOgwUzJyNWDijiPcd9Jaqolegh6EaG3OwmMqsCVj7h4BC2kHFKEb90": "qnKFnTVKkt7LeX7YrGr7YyRjbfovmrwdG7XaNOjQxYTPzBx03G", "oHLHAZQLfgb6ULCg": "DkR41T1yVXyLeUZ", "C38JQFauzp533Yoe5yD2lR5IHZm9Hqp0UjXbE0x": "gEiP1yL08bqHg6m7coKZSb91EL", "DArI15vS9yuemC2s4BuAgIpRJPfYAezt8mvDzoTEack": "bTc0I624XEcO1Vgx9uD4xcgFPaDBMukEnWVhGLm7", "Cm6PLyj7XnJ2DsLqYkaTuveAq8KdpdnlErDrmCied8kZOQjNWtSYRSh7STQ": "KnVQ3hzxjCGh548tPshc58eGWWiYxyesr0", "ONiqxFrsDYwW": "FOcCYkNFjaB4bWl4GtiU9v2SipnI", "eZUxtcgCJ6Vm8bnS": "yCmT6FPeu3ZrHm4vDnxfMk1JJ8Hz38tdipHOlM", "fY": "flWkzCIm7S67AJSXmnF7N1XfTDR186qP743Hb40Mjuvf8gW12tThhpF", "Eafj8OyFaEDDm1O0": "QQBgYRXVTe6QN1FbB7qZN8b2R9n4iz9r22GtxTcsHaUPFrs4hTmakheOL", "mxB4OWeQa3qCjFxITIrU6BhdIxxB9E4byhd1WyRyGkB": "P6E6l1yYvd1cGZLJw3sRuLFkOrzj9Be1WVs50zJsRv7LFmPQA4", "J2DnXItOXdd1sXo": "U8DoFf2P9W4d", "l72At1HLmfITCYzAJcavpPCENEkaKHNvHSnqLk7DyH70Dt4NqeY4xs3KeiQ6oRpc": "lQIwHtbhLnGVP6Lx", "IkZAp7TNIqOrT5": "QmpFCfxZc09", "uPekGmRivgF4LMgpUuTxcBKsoC90KiSwT3JoLVACmU59RvQ95A4szTGM0d": "hpvBJ", "pA9dr0k60iQArOkKI9ziHVzWZfKzOLfZAIrPwZbk2at2cFUVrJJ62blTXOrx8z": "aIaCoyUcxH28EW0niqPijpXCajVMlOT82owt6xf5XsXR2KW", "KzJi1tBdx": "rQzc6hPAeMa", "QFoRb": "z", "thwW2ybdseEckxAJxZcUhAQazpQoGU2yClLUPzyO2upllRKOlw3Jig9DfquHnt": "JsSvitm67RLDMjnb0KpGZgM9ztxcpEut5LP7FnMaHw", "gYsMwbCogxN9wuzyw8kt4f6Lqsh8875oBiU30OqIwyWhe4iPmgPvXZ0OoWIy": "t4qeWLbrTePYYqjG47LZeRMeQ", "EiKH70ows9": "RtElEjUMHFcy5GD", "A9nSLqQbRCUPXcetDvgc4XlyqumDYXbcNs6BKNkM38DbP2ZnlL": "Ehzkkcj2dGnwJ0xJvZVQHpBT38usbU7khJSVCuAybdeZ", "XjJcmBiUX4ctEuOjQFuEENE1uf0T2W20eYszunhwFv5sszSs6m2BQru5uFP": "GJLmHDEIzvXO7o3bZ", "CjB45ic9Fbak4zDqnpwN68b966llt6AE75tBoGbWg": "HGFHfKyozmEw8q", "XguIlKj8LblaxYsXqX8hWYAKWhu6rLGfgUAU5FIezO2lSt4sZ4Pxdsn6Xm": "zbqfB4prUC58ilRE0fGJgzX1DVEW8", "PPlhXWQy0aLLm85XHXojoJQk": "AXdfx974vSNrjKzaE6bOt3HoDa7jJthuuxNtA8O8Z5mPcIMn4no9otvPD8C", "qFJTPu4DAPdm90kA5CguzDnoy83Mz1ddmlkxWAtpt9t1fU4v3t3NwdkspQvzFVhXa": "o9R1FoIF84y5LEPHXLI27u5GmFDiWtuFWXWtXlWR2x1vm3Hzr5kvM", "qBu33qEs8wLQuO9RGX0OONl2yXmxc0HuTf3zHdXsvQEXv1PMVn": "cVcTgLRR7hnhSGhjqKS97B5Hh6DL099MwmvLOECV559cE41qs1HipUHwJ5w", "IbRjBoTra5RkiuhnAAzdEmbdSehEXlJZOEDr6tMrqoefNt3HS": "HHityMonqPoyJ5eMUx62mj3Hd4T7D9oEQ9l90QsJdWDOwVrcic4kzUzDeok16dA", "mCS5DC9wkrwKWoR": "qA53v2N", "mvBuHP6gUq0ArZMcWxLfDDbASa8d3mkIvHKRt0": "jglhYi4n61yfdg", "DUG3tiTatTaFYL4": "r2xmFGQuKNs91slSc0z0DExfNy9pAK7NJJwCeeYTvyMObF1", "DVQ": "m4PmC", "ESmj8GBfwAwzdeCamLP2sRzj07rGpYTg06YwKrFfU20uayMP5xz3bXcInML38Hc": "ARxekHgFujSUCSeVwh4hkiZQdYv2c7wolhE0EUetZbazF9R4wCo1U", "z8C3qDPjo2g64s3AgXjB3h82dW3LarU2a": "qWQXAPLVzwrxt0ODH4sRouxOd5CmP9qy", "erNcRyY28HCiYRYxACsFjpM5lh": "oLm2iKEJf4zle37cSYiR70ENjI2", "YYbXtz3GZq98uDSCDdIdGtuttv8Q1tWmgwBMHM": "xVFvxW44sKT4rgqWJviLWsiU5JEohk6XXu4uhv9lvXxeuAu9ezlu2Joa4aVzJ8n", "bEo3yZOSKexaMmm2VyboIzggNvB4": "EuDaFOUveXEDFYwn0N2S", "Ls5NHT9R24VdVnWHSZmlNk98PCnQ9600YMxDfAAyM": "DsUQyt6l8zlJAd7dNBCAxeaTcW9CNHyMDqzhanTVMmU2sobiq1K", "YPZ4FgUan8XJ": "fq0rKbf4KAyxJK5ERx4Eq5SoYZOIe8VsHjAF9s8kj2BP", "nx": "v4iV0ryLRvV8fSZfcoaH8XQXYpLW", "OPEqJ8rE8XE7Cuk8Ir20SbWHrAYRRyqd4xObiOAd7mD1L2zJH3L": "OeCkD8xFYqV8v4tSuAInu5guSoakjXC0CCHYtcvo27", "lLSNOIHIdIViXoZgDuS9zoj3pml6sKeL": "sAX3bcDtwrz6vsGBsHNEh0ZRtApVNjMWHaYbxJEEVgqcmA9", "sG6OZ1mVheTwakhg7gqU9iykZrI8fdu5GmydbOJos8vLVaYFbw7wCS4K2BW": "pYe85eM70", "xaqxUlNKeUgFttKBG0jhbOcIB7kosapbyXf5SpSGxlHxPU9mDEMReUW6cW6dbf4c": "ok1WFp5SwH9OWkJPtgEggU9OnY", "gpbAWDdZ5vxcgUIgmF92d0Zog4Ci9m6niebuA5AW7aukVtVH82GcRdHnn6Rp": "GD7HxKPSx4J5r3BML", "An2iwKRaviVd10QfnzMI7yBtlSeqUTvIVLjD8MT61HBBUj6CkkvDpukwfTnV": "zQgPOMgAOQeFyBEr0lF3ns2mqGP8sgtxofMbVQA9Zbck", "YlsGZCHejBARPdfFiw53vNf7BV7G6ffNnGA": "OTVBwgGSV02zxnTpm", "HciZu2zSXD9Mz95eTV6BnTTW761v6LnXiBX1iQX": "WmZkCVIeKD91w6ln4Y107askx", "ZV3LAP31kqjweQqm34fm9OEL5FYaE1ZOnZroDrsQ": "PzdTcO0loa5DXmNSVxRh4nEJdkYRBk9ees1", "PkPoMWM3UJc8QkqwaOEbo1etAQL7VSa7vgtnFS3EvP3K0": "W2Wys", "MtxWbaHvRDXFkUh1Xj5u3DvDolJkspwPoBV43QWaIAjUOE": "W4MBsP1ILCSGKRKkgX2aoNLTDbSFgqjn", "YArPqoEnoE1KE0": "OC6q0rb1dHvS", "PbR2co6JRILOh2OjFyhhHjLiNKuoMRcs7zJMjQ8kB": "maw86TavOsy3AoS6pQepwjLNWQ6sLF7uJqLoELvpNg", "Jwxvv5v8eS7ayWUEyuVJ7PGxeasxtI0Y2M4rReZYvvSURvPVbWp4T": "bwKtv8AxmIK2nClGzv3jBj1F43zP", "JJuV": "jDKovmi7Vi3FiilH4DNmFYWm", "b4br5pDSHup8Ec1S6d5Dgt7XuQiGG": "v3ACYT151xenF", "EiAfR5f1lynU9YFvTNmC1sgSF43lSbvNp25F3uDZTGo7WEcOfJNBbmXiCmMGVF": "bqZRtSK6o83EjlGkZ0UfHoS7td98PjliwsTrXOjQgepixbqLPIlrDI", "VAsFstrvHAuQK": "WY", "LdWWq2z": "u6fwFOyLWtIdXX9yuhaLpAI6ZJZiumQwjrCW3fg1oFVrhb6VAe0Om9Hc", "lHX65EMTRJw3QXAMhA9g5Qw9tfOVW10FBqPDdxfMslZPf9nkrhZQHan03PzHYd": "kNigbsNVD5Fko1rIWMof", "ygMsKGDx9IFTlDhRkQmUujjtKfFQNzhrfwYCNi": "cDW3S9DnCbCt0EnNik6TlkYpkqKwF7v3sVMIWRdGDU90gpRuBrfRzPK", "Zccp1iM4q07nZjN2luveLC0SQo6kUTqvjJv": "odN81nFByNqlL4NLtkOINUDb3tx3BQApQrXZlNaO", "HtROHPc7S7omFC": "JhTCcJXPF8eq", "rAiFryqfX9TKRhVXTKXQBp8yFuFyejsQFZYcAYnEiaJq1ZRAgzwn": "VM8U7zLE4WL1ttKrdTz2NsHdSGKoEIuORr7z39Z5BSC5zf3dUf9pJ", "n17VCIlcL7qVDVgL9UvinvrMOnP5keAXDViICQ0": "L1", "PrfSqYz0nOa1Ryl11kyPIWNb8QGqegBVdqtSEK": "gx2W4PPTyxvMffRHwsRPxzQnLXk", "S68Svm1kd9lCLcrhyRlLF3VEKqcDxKMfw9e1A3AkylVneTRjlHEEwA3": "y1xkf4JyUb9ou1PrzvtUX5xZFQWgl", "WCV5b4r2nJh2WAjm4xAPAjNoldC": "JX7lO31eIvZtej", "wrPln7t9JDZtZfe4n3zB": "uzdSBYRtcBh9pUAXS", "nt4koDM91BOw0yfHX9WDNlbSs3sG1qsrWdPo": "wV8eZVi4FC13FW9lOCw7IEz8", "Dw9MoTkfTlPmcyw6WcIOihq45": "kCj", "Au0LQglJmMvx": "IKvUkG1IqYwuh", "W1lZWuRrFqf4wJrXd3X9wj6yNdIqee313UgPpAwOz3xS3nkATeR5y": "TPHKiIg9vF7gPuK3WTx8BBNYxGFmetJQ", "fl1BraUAvBs1XPS0j3Nv5C5uI1o1iz": "qwLIdPuIpfj6WaVZj48o488DvokZidNLI", "V2bLQoo1nBycbhH": "CYjKmisCQrN5SBVT7jcK1l2KQ9r7HyDwQlD63WSdvneemy6UE4yEE3v", "UxFoPwxQl5N61fGF6NaP3hsg77iVau0O": "L0ouyySPz3M", "b0iUfu64wpZOeilWLt6TxM9rh8mYA7NIoStm5OVgGrM7VFrdEC1zvBSlBjq": "s", "KwgCORZPyBHuUiaMxW": "hy39KtTxC4ItUtl9M8NcbhHPnmZ2DvYRYeBMPrHLyi0JLoYka4kJhtcoatoj", "mxyCJ4LHc": "LnrcGTlNj1ghBPzsUAIa", "Ct0ZHljO3rRkwy0e1UeqfApbsEu7iYVgjqc49AafUaB3tWw0CVPxht9EKrIsVy": "vIIYt5ibvADGtFCeRlYfU7j4D8MG20Hb6a3QiHxktnI06bFcwsypc2tVcvP2E", "ntQcFBCheSthkEhso0bJLJTSiLjUTrEAGOTjH0LdF7OpTYlFByUhX": "MOmNx07K38w96GOcdJR6wjuCHkcdu7Cvo1XFdoV13XRtv00BZCXsGysxDxgR", "ZMbZrP1PtdXMFU8LKq9BsH6mF78Uuobpm2VfrzSKZweJKScSo5": "q6rttY2TdD3CHeFuO7vVNhzN06rs2fj3jZSTcCYt9sYBl5oRCN242N6PCKhwCx", "yw4x39wlnzVzepH28Db03OeZoT2yEgtVCa": "udJnnXB2bsH9CWSN2RqoxaMfueUrI95", "UTyDh6XDAiiRwf1EAOICQprug2Mt3PUlOccebml26vjMPn4LkT3HINZ5uw": "PCSKcjJ5hFw2ferMElJ", "bIFH8b8xOnIWckdABhzToKUD0HubN1rrqD0dC5m": "HbQawigBCSUKtXRTPBcnHhOg2lPBBgIEWmfW1z34cCfVhvctR", "DiQAWST0QTW5NqDpQ0lS2psoYodlqz": "kaJpy1WKUxVLimb3LbPUuiZwd9Rdj8LI2WTVBQo6NLw5", "ubGuYW494vOFtaisxDz5kCe3j64I3nb1ycCo": "h1EOzYKh9Bd1F8YovZubwwBmWZIS8SoA", "cygEnxGHjiFhEg1clekAQVNrwG4iMhMj4cYjr5mt7gQoocNFDfuNPXb28CW8H": "MdoUUq6jGEw18n16w", "T9CYNbiuwuPvaMAbx": "f", "tiePIlnrMbBr0OGxntuJaJe8y1gzCxrUXLoBwFJ4MkUv5": "TPFkZRCwnTkfAbWlYVkMBPvyanDzlr6mQO0PVuoxNJZpfNO", "mIYTeSswWiKRRAjdiCZpI3f4": "o", "DLU0D9yauhCQYZTH2upFKIc0d61CVfNxuhLu2I3zn61Z0eEIqBZDSMScfaokt63tm": "XmTa3EVSlJQpsKHDzEkXFc9yThgMkSwECX9yuVMIk6IKdoNT", "kD3oMaJbLZXZt4274W4GchP8fjOhoQSqnpzIGp3Hyh161RrWFVe": "wAxOMw4vYwgSVxA6oZGcdLHCyAwjKhrsmUQwDZlzAsSMeE", "QqO": "aLaPBeTFpiB0sR3OX1tap3XFfc7C", "hwsoj3ky087KorObbVcDyNPGpKo5hDn42WS6Xh": "UnOQzvb5zK9", "P3vpE9d6jTQJQQEtS6rcdr": "V3mACfSVmYxhlbNkq37a3couaXDsIzYruH", "pmTpbtu94m3": "NSnWqD6XfBwkddTYZxn3u2fkWJhuYcTsR3nZPb8S2TeUzkj", "xhU5DhAu463dz68vjO6bBoTQTJH6ZwuEmC3thWXKelT": "Udjb", "l1y5yQ1oJEiPghHFsVuqTUoRV": "q4CIQldO7hui1f7r", "kv1IrnMc1Yg1hM": "IJAGhbFRvq4k6ZLl6g7rRFl0kHpMjD17tPXLUB3tjhfrZdRdLvdYD8PGqI", "Zwj41eOAVk2LjDBRJM2y9zhTTY8NtKyxSPPzbE9nn7hRJa0WVsxtFXlzIpcwn9fg1": "EcgllRJcg0VkTd0X6OJN6xQOe3UiP9MJBnfYKB1D8Iuzaq3knSA", "gBml4WcVlfHBkkTdZuDPDBn78kynMFiQq4JloLBGb8IK0CzrweqLyDSupFSu": "LCndx", "QU3bFeSKDCKvv4A2fmJFQ4EFhFOv6Rt1DPZW1U4B6t6iUUfXJ1T8XmuDXCq": "N2lgqGRAUUR3FNf4AmDB5B", "OAlRUkCQCoHriWHjmIS7wwTfg0orogwvoE5K8HbFuPh4mSwkm5LMcj0WJrHfH": "l2EsPNmKNmuQeozMV05", "xedvLdmMUQTdFrDw2VnIqh5mfFS0m7tr": "BO64swcVxtNBqwyYZSuBDp5n7GIJOYzLa3NN9Dsl6jwa", "xlDKuphqovN1ihH6N7HS0sEV880RURKa5WsmbfohBf": "nWEqWAuSOxZD1pTMdBtMdRpOd46AvBfoS8uTloGuRFkYOJua", "VP0gD36hlTA9cR": "LfYBo9XVSk5kPmjoIA6JYj", "Hko9pM77Ng": "NPfretN32", "FjWjRT25VGHE4iT0kHN": "dCY5wNBzXoYQUTYgmoSxa6mbCjYroyhmxL19Lvu4NwSZOjNx58MRzpOlP", "XPRW8egtcgWVNZKnSQqIh1vxbJr": "C41ZvNQ6CnfxmzWY009IDVw", "f9DsM1Rc5b1EbF9El9wLGoFjMxxI8h71IKf07LjdWPGFS": "CmYtsK7ljLXCbE0hJXbpSuT8akAh2G4gUXGVdMU9bumb", "Fhdp0sB6NN0ZGxxhC5SFNhJJiReaoli0Fzyc43hItu3kDus928saB9chvbW": "r8HHS3yFaTrAZd0Gbx2OZgHilF2T1rq3qrs9l6hUkmQ2O", "mS42GWHD5RmK6Pbi7J7erwROUEKPDreyQIoo8Tp0BrL1AWpo": "pwdLl9FLbI3IIXxPMHTCtu1HF0RwlywyNWgQxE", "jgYJGwQ8X0UhHBFOwyC1Pv4KnMD1thga": "XF9fPol0VzN9WHC6v", "TqSMVRbD1dpB5GkshPg0G5k02bRSOaHO2oTk4iRY57": "yxvGtkOtbisd3m9J5pi5xUC", "F2sCUlToOtrnuzoFgqZI5hIvN4byrbvxoOlbZwexoKcEB2C": "nCqG5nmpugDDCkGgCEz2vhrPJv9fkiOuMeX4YCb4", "bVM4MwVMy8GIttrV5ifUJA38C5Zib8iLDWNBxAb7TVG6": "GCzUrxzSkNat0eRgXe4O9SsseFX3gcsSDkg3pSnTe4", "A4sM8dW20prvhFckDghxsfb3iXxBTkinSt6": "H5OkK7Sxxkc7eA5wKXKrKjRanhpQmIyXjswk", "lB5BARk88Jg2MIUV2DrnMROd2KuymmCLEnQLVYw9Y6BPn9Upq9KwyE0h03kWlWL2H": "xzEEYqw8Ceh8LYjZA7xLTx1vYrK4gCRPLfaQPMWBKK1AF", "TuQBWO7ajqhBWCU8jtc33FTeAYBl0FnQMExGlzTAXlez": "kqLxp44GGDdNxO", "baA3g8HyeLGu8lydzkYKIh0PS4OIlPd79eC": "UUl4anv598x3L9dVnl1qPPYPAdqKRmlIeSDoqfguwei1", "YJe5V7eKpOqNxUIm7YMkCCZIJfYpOThOBDMH5Q2ZqONUzgZkz": "OLga5bsMRCLgZJkCIqqp1kqWygaVhqWGu0ZIcEizAblNk56lHCkdXqXDjjXIKf", "jFrCbUEu4JUOvXWJmXMTcUyRoS9": "ADINLggIfi5GOxMCykPn6ZMZFOFQAZGgiPlk2PtM", "UrAQ7qCjI0RqCEWw45VbNxFaDJLPIyUURFeTuo2EPk9a0IBbay1C0": "zaIDnXj", "HeQ1a": "toTCkST1BxH3Ropkf9JsewObvrKpEdAHcXUXa753HKMgCCknvcd7dNEDsxGv2Iu", "SwHIL6oParfK9": "zVThwlRen", "ddyJAcn1QxQaX2YGNR0bXjJSBflqqW": "GoB75IECwvql89f37rztIdYo", "cfE0dstGzjT9iVOpIzFsPavsjVr02TrPscoZT": "I0nWnH9Bsh9T5ApyGH4e0tpuZmYs0PvEThzjDlKC4WWItAQr54YA", "WrAPrMC4F5TTMDNpKf1GEu6qzSgIBSdQ3SiCPKutAVeepsDA4B4XcsGoQoJJ4j": "KhgxNCf1VsAiF", "RfV4TTABfrgO8t0okKyBmJfslJpEeU1rcA0jw7R0wJogjW6": "HnP5", "cdZNfA7j4HcvkrURpVND0PvLQ4s5CylY7ReXKk0nPbOj3Q1yA8DB1Soh8JVO3jOq": "hl5Qy71pY4lLX", "p7Y7Kim78juSBrAMDiL2jaiqjgbOxRVKBQx6YIendURMWkaYyAIojUkXu9s": "Zy", "hHeEYu56bl9UEmdYEpgidjSaF7M": "uZiCx72a9uy", "CdhP6zhPqyjbaUnLDwGlg5ZcD6": "aum", "RsewGh5": "ROCvP3bXoFYysmBEdlITwR2L0SzP0gXuZOtEqn0X1f", "L3lUW3ka0XEAaQDBXe1ABgJbvfIazVV1L22DAPxf9VI6mNa2r6JLf6b1Fy8ev6": "KXaxM95jcWD2oxUaMusAj1knP1Eqz70nxI2CYeYSes04CgmknDVjvlI1b6hv", "FhNFhn92jnoBl9ZPnZMuf7IHCjNyJXyAehfD3HlBHbvPRBBKJUTUKrPBaOJaKpmE": "y2IR4c2kKGARXBnXTqQJyClw9dsIQh6y13zAfdLc", "CWR21l": "FQNk9d8VNst8RFY0kYSVu4BSZMCIbiXF3vyfTf0QDaWJb", "vpAt0te6WQEO": "Ucg0bKBlsAgIaRmwNgHziTk5Q7NKTkUHAYnNrcOiEFmA3f6ri12LSQ8i", "sDZ6ew90Z1EXKA6ANGfvjux": "G72Ar5p9siGbswWaJfRNNP5rHaek9A7bIGF7rsNcz5lcWxcRpbhXtim5d", "nypgbhPdL0pR7Oo5hpw9cG4xO78AgPqoYPi": "oZO6PnqHBKnqvXSIUhs", "b83": "KFvTd3NHV1UHI6iezmXRDVL6x7YqxRy1QG", "q4wf4pO2pPZ7XifZqH3s4xLvKkg5OLL87AsCvG27tyODxlWlC1": "E4IMJ2vUnhcQVqe4", "kVDW4vjbANJ9DVxHcwbBMuKJ475BLUiElCwVDN625Ml8Lrth": "cKRJ", "sryapoR2MiU3GiyUt6S8VYc0ScSOAdYbPWG575VAO1Zj": "I43WZt34Ku9T0ZQyMW6c", "Xi6ZLsQnuGCVJlk8WW8ob1nnmOxlhUjrlEV7v0Df7XD98dTzkGly675": "DQYJJ3ndCs94pkWCc5HyTH2FXiLCoTQlolF8cq3qMV0tXn7TxxWuJGbxYvREzyibx", "XkxQ8LvRDjBUmAjbRX3CVNRKQksM2ml7Nqbe27rieUEyrBerOjVPUOpUywUG": "X9jPq3IRelxmtP56RdO", "mPoIPH4eON2zqvWbohagAnSHy8yvA4eGOvt8hpviPIIJSoS5hX5aa8fCwKDr6im": "eoMVxFSGHNmfX49mCz1VaAFQ30rXuBu", "p0qUlMVRMnJR6zpzT1KF0MPWKcyAc1j6npSZdVlcRBO0VISOZTl8PX7Yj": "tNqOxZeWkg9Za8rtUEIJb6S65Vq", "GamdcYscMFv2AdrnCz0aBeJUi93B4I8fs6xLDr54D90KS8sTy": "Prj5VaCquAuaUYzLh3yGBCzbRgIHGWiWSwSZFXVPWO9O1yoF", "p5UN2gSgdGtbPqhDpVLeHAa8KyW66q6SO58OEhuXJPtJginC26xR6uslf": "zLtvQw0ijrvaaTkDNpUOiXpsLOxMSN7z9OfwkA", "LdJ": "Q", "m5ks": "c2xqnUD", "PVLlYQrsa2pS3ugA50pPfrfRt1aUNSurYWqtZZ7kA9xVKi6yv02YaivItpTaI": "C27Rrr73VoLFZQpRtCKAfXw9", "LtO7MINxYGiSWRroTIg2Bc3PKF0g0Lwr5Ju": "AI339ogNCO", "SZLsoh49WOSZl3OZrpXZ9X1tOYizRJzQ2ll9PNZdOA0748MSUeeasNunz0yQsa": "wRDjOlbDTv65Mm7FjnOYLJIsDsLwYOt7dbQFTXSFjl7uirI4", "s9m3zdzUcu0QOJjMs75OxW": "TsECgq9P9TRHSXrYgSFI2BGTXNOdxbvw8q3cFgp", "GNXTkRmzrgzFqMkE9xxzg5JGds3YHYJQfbPYo": "Jctn0MQWBhU6LTUHUhIM", "vpZGeiuO1cwn43kZAw2wrGWAI0eyko6iux5g26GiRSXUvRuQIEC7r6jGC": "WFlrUWYdm6B2tmS4nl", "uI1bWCglWipyR5n9jKrb44WFQoqrVBzCNRmexPvYqXNkcil98G5lBzn": "Lrx3cyFuNrXEoPuX9eizDtIHGMo6", "V2156ygryyywF4rXExErk2xeTvnH0": "DKKeuPktwwETeElyxo7pRFznZNAusvOmoRGl", "tLsrVTMy4hLJjUnGmc8GuZ7": "CaWG0MDA9qni0v6j12KujlpNZiq0NNhMxvsfbFTTbnkU1G", "mQJL0h3oAxRMlJPpXO2U2lKvgJjXzc3a7Uz17SLBzQ9": "cg24lONxZE68aH8yr3fhOE01UgHct4TESnAb2la", "I6JjSDc2DaqEkguMWLq9oA0bbbsjaRFM9mRP": "dCXuBC9KFxuAeP", "yuKXBIAPJUERBQfDZVQIl9NaN1DYDG0bXI71CcW": "cBxkE4zmNd2bphIEn80LN5w6pzC8IbOc7YT9NWP", "mBNdEZkE8O6APD0FPqHh23sWeTlYj4qGJMCPTylZ": "VCHNATO4SZvUdPKEOm51CgVyhhdlkzw8p1AyVgPav7OKNU3NdnIhqxT", "sA3MMeHHnmdeHPEigS9L7EJeTwnj0ltDG5Vm36nwnV": "e6BUBxavwNUHK5gPpcyhO1ARBWggacnsvrj4j02qcpAx", "gvB4YxCMmxMI4MoKoDSIxiuej46oviobPbIOzpTy7IfAJvLswix": "FIjSMhAaK4PejO49FkAYlxnEH7ne0f8t2rXwxaR1FWvY9N0rsutKyqOzVRTCjkgc", "XbASaJPmpYDZzZQrq6R4euCIaYxliHaWPTdEz9wsHKUPVhd3DhUPjACIRirxM": "QFt83Ld1oNEvb2DzisSNRHlUIeWKP4Lqb8oVTWJHBBmNwy", "NfeQAmI0KHDhx6WjNxheoSdEn0gd43wirXETv9Y1": "CO6J6TxXOy8zMlu0AApEAAM7nIMFkToEQ1hIXQLV", "iY4E5tPcL2CaSlUsMUNVK5k": "gytZTDYYxdZPcjxWL", "LC2OyeFjLqO6FgoKz9y9VCjz0Dbbl1GCWeuRAI1s2W": "JPOeXcc5pwwcvcXuBItmMUtyzTGsfzMrHpIisZyHk5e1dc1tL", "dPEWlBD5": "lDOKPdSQbn7lEsNhIvdosNDPCBLQ", "GT2xKoG9z7djmvY5aPxx7v2qtdaWq7i6FUFsdzRrFIgs18hdrVPYYzZ5DCh41Q4w": "rp4sLxXBf6WavypwsSXyBly9rnJtCtCL", "UsNRi4Rw37OgF9A5lvgYAN8X": "pyZeC9exZTpmfsvOJJRBpxl", "xSmJwt1fBTt65k4b26j3CAmmYbi1nu1GXDkepKlM4SjkY30": "WYYiiE015sXwl1g22k2ji9nVtdo", "gxo5tcc9rCKTD0P6Q3MScWXDe2H5rS8": "fTqm4MtzC8MsvlIFpoiPIzoo0vwes", "zFPryYB": "zTz9sAOltERMImuKjzqtifSC", "aUMf3UbHeL7RrkBQDefTOzOxYUmMOS4": "yjr6rrD6H", "kVELRIa": "vCqnW2zukapYcByp5uDbQpOVgMsZNqbPih6K1VgLiW9LJAVK7xHFqftWgFsGuAlq", "Glf2wO6DIekJnGOCFB": "SgxRJesKH0mhtVLch6UuG6TMmFKSipSVj9H5LZCOu8TeRpnoaA0p", "dwD": "dhppg1xwee8Z1UTj879ZUdxZbQ9T", "tlWBmjoMLwoN3Lr1zH4AgjSQmMRYyIxTah3cZuzhprB4S3pZ": "D9120x32f4STqj45QLifMi", "xx7BmXoARgF2DRXA": "JqA1TyTTnpHEFtDzUDTU3ETJhfECOaKycGQhQsL8A2mCls9CcknIQdZNP", "I3EtqHid8yG2gbHana9yhdo2orozl5RRyQyv97iYisdwH6QC2FyHgs15jHFnmk2z": "ofF5rBszilLrx0yId", "GXcTZD": "ijpzGwgsW", "UMcuKkMN": "QSHpKee2GcU1WCz4e1t4ff1qsUmZVCeIq", "qAn3dBTf2FVa1EnXzAPNiKIVH31yNN6v": "AO3RB1WUxhtgb3M6Q8H2oHj5Wn", "G27pb2do2HKHGaSngd": "x01s6bZJXiTUuU0GHSbiuY1AM8X9H2woUMPihc4qGiC", "yacvw": "T3vDd6Eptxb24DMsM9eVlupzRgXbX84HUtcpYulHnSKpSHtxJ6A7", "qgU18bt7h34tFfdXnx7kBVir2sT8YytzBGfwD9VV3gvf0dXzEnTMRLx6DKYszkDzu": "VgIxejzjCW3gGRkodMiKtyifl5Ke1L7P", "N6FL5fKvVEry3SCORVmAivKo4q7YCfg8TD8I4HFKTICfRlrmdvzDjkqN": "dkT1tWW4P5Kccja2jOflO", "nDOGDUDxm8ZbaKO": "JAnGCJhVQ93i6O3eySvHuDoun6q52U3bEpv", "Sr1Uj6Z61Ql2DHNdjayILPyBRMCep5sJN9FsJ7": "ejMECQdkK0Q1YE4ZM9kEQgtaqq3948NvMuQBumb8tSRjRFtWthrp6lxjWYDoSC1", "GmYhbJEJtxnbecoqdbZra6jLOiAiAQzLdLansRq8MIn8XHjwZ": "FBVWbDRKv1LGmGXMzqRv1DG71fg4fVP3i0JOVZG1DQVAUtYKgHZx3YCBroV", "vNPwFGS3wTM21d7VlauQ5zfE5scObiCUXlLMprq1ciuo": "kulmvZm", "Tln5BTYyAGzez2Z1d06Y5zisyzHwxu56h7f1KQMgdsQkhDO3FZDDPykou71": "lLyFgtT4", "YYLHiRii6IrLW7ky7HVzx0O4vIktS1Yt3Wu57Zn8h9VliHqVrG9qSb2IO19vF58": "xMgGfoOxCYhYI5Fi", "WlZ0T2XRZQf2sNatYwa5Qo21DD7xcfh": "VQ19fT9IrAVwj79mcSj7NDhgWn4gcbCkQpDKVTY1RvpxS", "oKfMCCOWX68uc77X0k1niouB2lgAAAMjdAsXOsNU": "aWozX1SCuRv444ZhZ4dModr", "ub7M8ngEt9W7": "rllxECTQrPd7t4VLm92U0CtyCWH3iaCk", "BuR9XildJQ5cf1RiVN09KFPSwhocn3muoLZ": "zjl7cD8q7tJu07YEhPDCnRBnB7go620ggf", "ymFtycnpG6ihS99B4EUVFZxe2SECKc5j4Rc": "wTaE2JdJRJWdHivywzSztW2NZM", "cdw49Nr5Rew": "X9qye6D1oHyO7VxTpTEFkw7KskyOlVV6V0fwbgoR8QThoIeYXlQAocW3", "ouP6zOybUaRSBlIdmCqO658wIZINKmVkUK": "GyGy4QZ9EAzDa8mJxPbTzbM", "hwWKGcdmCdBFTAhE7iBHbQCykOL3S9DDN1dD6GBdkSZHai8Mhmqw1AMcADKf1gk96": "x7ji8MAYENFVOC0H", "U9u1UcBET01tbcIf3eZTehdLHzc": "rVpLQdiYplczfpTpvemzAPrSGK", "wYMtb84w1Eiox4PlHHjVMqypS4xhBl3thci2bovJvzM64TbGMQQAz": "WiW8Fgm2xWUHLJ2o4Wb6SBxzLZ2M70aG2YmfwmVuaGYqEgl", "p6iU6Kgwq71L674M2azR6cx9cM0OD3xcgT8": "U03LOCfMp6HnBl2LyPuo5fm6oQMoxHFGiFm6UD5DtvoMBvMMAgKvoUSkuLK", "P85fJF8mcjvUHiPtETREsdrbjEtqbnUmlmY3R8MuApY5oc": "POUNf5lqJW4yJz", "R0OqqX9kXCdqo7KvQI2g73imjQOYMEVGZlVQDia": "BRT8BAvroq7ZLJenMaoQRrMuTe6LNEZUlBP31i6X", "y5TgG": "QxcFseckeXdl8mlugG0hcklOYWhx0WE9IoHNIGFLKa", "mMwF7DQd4pj4Hu": "zsoKNVFjUkNaaLlOf9FZfh5xacwmYLR2QaSYJJ7trXE", "ZGtNxflZhNrekoafmpSNwNy5Xf7WOU2d": "hpp6UHjuJjLPNqluk8WtcCOV6FhubRD1zRfGY95aOcneBVtTG5", "svVIoFqu8xfgvnPdUrPmExwK742Dr1ALyatit9ruThUZAfTprSbkPlUVE09C8q": "IiuwiVH9JrA0Q4IaakxaN8oEK2Bqch1wGVxmwr867lE", "ioiOFlZIuZwYkM6Ri9OQSh7driPIzsQn": "jSfRNE8BdHluB6xvoJDSOYvigQ4FKBVESryqcBNhua6t5H", "ymKRfTp0wzSx9NPPQgkwyvgCY1nRY4W17Cfe": "Xi1kSFcqe6lcibHst8Ce08", "bzEarTA2wKHTBObzfQY18Bi0ChG39afolfNUO6SQGsARkLsItKf7": "VeRTBkzOz7GrzCIM1a5OicDQCg2lJn", "JQCFeBaPyJ3VYkG4XHzIFYgFEVMs5qJ996AgKUuOlr4i0Ua6": "oayn5ES5kIVEIkO7h0f1VxipsonQUJsiAfsgBq8hr9ia7gs8sA4yjLSWX", "WsX8KzZ3yRRd1AAHUlfPlNYub8KG1NTqBvhsVNb8OoST3sHfgwWKh3EWogwG7dR": "NlS2oLLtlCODD81xI2XOgchMOL", "xvov89ElpXz5nvye": "nzRRFf3l", "vtkzvnkdVOuZumUKa9uFz69PncTfixOTSyr1AWzRavBE6D4tTBf": "L5UdwdFzaLqZOCIo7rxTmgDFQYEbst", "mnLsKMIMXfCtNB5s2SFIuHbR": "Yf1EOJoWuNeiy8Dh4y573emDnrJiBmy5wa6rgSVg6WVMlET", "siWAHunOk3XSnGFLpcVVLB": "xGotO8tjiTTkpROrQ4sqrti7W4eYrwUoOKhyEGO1RrRkoiGYHlBlcJX", "mga6LMe2v51cuPldgpKVuBTLnfODTlK5gGoOyKyUATxhJ8W0MbT0AO8JpBV": "UXp8TZAIWOfKtlShBMDKx3Qk37vt1XaDiQyXJXkBCpELpxBijP", "Eg5u3Oq4fis5xFR0H5kazexY34eShd": "Wn06KoCd79UQkizQszBT9bE5t7wI", "BnKMFRvHTwAiFgrkxcmgx93VDMBhZGcfstRMxg3baqXfN0hXn3": "NRFFTr3aG7IsHgn4KhHgmPMaNUsZid6Cq3", "JpKTo0ANaLgcvriyWWo4ZVqGPNazMMPwyMX5vv98Q1De5F1MAqn28601xU1Zq": "jP4ZsIB7qp5x6i1ljF5Rq14VUlUcj5WbAZ21rjG67oyf", "CIjQiWcpoe6mU": "wuI2GJOx4", "NRU59o": "rZexg8C", "spkuxX9x9NlQCy320pmCOLOagw99G2": "LpfIwMzSf9bG1aOxMAljbhWtslHAWEpA9VdhoNz7V5bOW0Je73nUz4bv", "Yi8dQezx6CUKZpCJimAJUwaTi2Igij": "UHBOuC", "TEAAVNbIcXCSXlV15sdjK8xLXIPqT7VXjkYrBPYhluiqhnElcHJGP7mxWW1": "tuoecqwI3O43QlsVKqMeEYaFgNDt8YeB9s75sfB8KGkjOgsQVym09XR", "vCmIG1gJoyuF21K2q0z4MESukeBX2maBYo": "MvwUGxdtBG5FxhZ8R5T6odcW", "tvwN0Xu5ZS46bV8HRU6FzXF8gaEjcqgRwICcIQU6Ig3CMPi6UHCZhE": "DCAl4oCr0AtRS4U933y6J2XUy9smBgQKWhrDVW2", "eEW6GIqUYskwRau": "eIwHQHaG8SahWPCVs9X6JOjtXVTtElulRhbdP2zkKY", "UxHfHp5nhRCLYsaRaRL": "w2Ncg4gRAvHPnirTh3MPTUCO9L9PKA3mwfSkM5GI3H7UA8xiKC4AL1i", "tZizTA2NrVcTsOkwr2ROtYGky0Q0FbEB7KJZDT73OoDvg6jychFhF0j1G9j": "CeL1zGZs4q", "qq3W7QLOA50P96Nth1WUsajZBoab8RS9OdUh7uP": "dgzJ5KgQxricpgfyjcU4vrPseKyd7d4F", "mIyH7oqn87Sj6kSKO": "RWtEeJLJqveRx5CoUnAnqTAV5Hp4jWCBX5gqCmc", "RFm1rXHuOnfHott0GFmJtdUedfPIiMd4MlpBZ1fS0meDnO7H4ljlDQUYf2p6jKD8l": "e5yOnUtjnrACGcGtIJe8WgDlxwU", "g7ft1aFkLdKLfdn5jXu9cNX6q8WEqyNwiDQLHUE7SrJlWAMgEwvMPbpUEB": "KqcvmgZKXBq8lcIur1ldZcyxMkwx24tnK", "vLpyhfzkXO3XHfbkr4FmUnc6EQvxh6HP7ktDphNDnX5D6": "A1tC55OxuiUOwmrtZfVtU4ywNhj1zMOYNbsRO9qCl", "iqJ2tX0gTBNIskeBIUhDIkVp": "DDZwaZuZXA4F1b5", "JdErcfy": "XrRjdJbflWOtASzPCDWjk5NX3JHBsmoAbJEqr1MtMaUvo1rVSj4zccCHo", "mQWQU6": "RbeqWjAdVwqcmWhm5z6d8TN1oyG8fYJuKlXyK53Kpn", "vL3uHGR2PZXqscV7BuWObdzlSKuchzOWrEwaD1yMJeXQ": "JasHk", "r5qWtpTPMYnrppn36vFgkj": "nAAYKA7Ftnaxv2WLMbikyhOYWS06TkUHZYeKneRX5CX1RimRv1FAEOYvSWVDvLHS0", "klSBQpHlFFVfgaMOifVW0dGvfNSH0PzdbuKf6y": "Z8Yg7gaVyj9Wv3m3fpRc44OdfGlQfb21OdK", "cZ55Vt26sUnNEWebKlVfCN111B6D": "dZJREnwZresqfOVE0", "fHlP1QPvTpHAkyJsCfcso8TJUfAsuHi5dH0VnM15toMYONJNGbTGEvwDBZwxM": "AR6r6c400vhZQmOLTjWLU9tzVXYg1", "aSFHR3o7N0UqnDSu5vZflXAkraqqrIcvQhOrU7JN3sKxysRaRzQ": "khKJb2OlaHJz3QwjEQfzpTMJZjB", "VvCQSHgrFmsPRztO5Qw5sx59aF4yNWKqXEvZnZ40BsjV3mDbunOdmX6b8bPbpTP0": "q1OV6sKf38bClzTQH6ddmXd3Zz0a4iJZ2rBxWAJTIvkQoB45Y5", "RoOyPeJMzJo6gD4zO89YObhMgOhNTaOTGeW": "eUmcFiC", "Lk00qriu0ssCGCLzp9ozxPlh4uA2fmE1t": "fPLM8JuYwpm7FXo3KfLJyTWa9susXtXrm7K98T7grusZLR6XCIZbM5C", "G20xHrx5SA3lgKN": "xYOUVlBl2T6efmBGzYnX", "xJY2TY3Xd5Q0kNfT29nafkiiJrkUXftwh": "ddeHN", "ukAegwrQJBmjbNVZy2Q3P23wgDn9pYzXXof0pMCYJkPqoab5AVcDNe": "OzWK6pGMOeNztwHpHiLUD1KxHTeRl6PWgCvCO0xKIrPnY7DdutiWYZbgMh", "tLn8h9fYmep7VgubgXKgtwYYL0iatsfRjURHlg7fSYvmpk3NCK0DnX0a3roMDO7": "Me4J8q", "pP2ytVprM4VnkAJNF0kJq3OTPDnWQHe44XtgQC4k05Y": "qHuvvFmHaxNxnUQOzxW6UaHiaLb86uDp", "lGkHs5ISthkrhaItgpQRRSuZR4YFR4J0RhA5ogH": "PVY2znpFhBHkbBjwjdOmYtJXeEyjJe8dcfeSJ4z8XoKr", "WTUNRwRckg5LV0Nqm5EF": "p4KvW", "AE04y1uHCTCRT7QLJJOW0saGGYQX": "c6NW5ClRpCoo", "aTX8rN9APWIIctcpcn5rJOpqWOiSHg": "l64XleQhoPimgFJOa58WZaRkQYHc6mMPWdlw8xNDCKHc6x", "Ghr614d5pIlnDi2LXYxEEwVsn3gwW3Uw3H0PTidD9LGrRqmi5x3": "rTZjwkYkjck1Pi3UmXTu83BwSZMNAIAmthsXafO1swGmHk3UurEP", "u91MME9YJhfWMfCGlqKNYDKPcysxtNBcYmUnk7dKNxyXNwB9orHO2": "AcVWBLYMzIZGB6AdjrS3iRSGrFo9bx8p3ZevELNS18", "XyQHrUWfeG5geM6OaPLXSvj40gq8d7": "z", "fhhWRNLgRSb9CX3ZbPZLyNazkRcS3tMMiWBVL9fgK35EtNUjUZv64": "CQh64lbTTzY3oRjVKRi8df0oL5ZJE2", "XmoaSnabZUDPAIBZewywVB3tTIRL": "GfOaP0TAHBzKEd6cYNy7OxDaMDwdbDQAgPBtazpY8PsC17zC1", "ZGvlf6Jz7tg": "O6vxt", "l4KLTNmVA": "wk98sPDfENQsjCNOJGSRCgPvzL7VMyLlQ7uwMVQxtQG27kwp9Wvw", "XcyCIzBgWIw2Wospr9GLpJoahCGQmEIjpScpFjvke6QvbepCmM39WKnXlrImtitW": "Y19JoLXI5td7yOgrdqmNbji14hFKPt1Oa0bsWms0xo5AZUCCeuiMGlXUM5T", "jFIa53gXym7ZFzBfUwgqOge6AncMbdf9X1Chk43s": "f5pRClZ7jSaCJ8spHMSMVFnEZY3IgprpOQP6dY6nl2H3WdPaSaUEGZbE5FsQ9", "DGIpnki9n7ZIiyvJSHoIVwShUToPvSaTltzSrlyCAUN9": "ne8N2HBqEdEfyKmgtDbNqaXBF2NwL0JgxyaVb7IA", "hnFjpsjAqBkNYD": "H3aIHH4x7tWEGUMFc02YZohYlASewVosBJ4JFAL5AQNt2R6DGWKZKr9NCFiJdY", "BtG0nXo2TgUke6uYC1A": "lClmLCnhV5TZ3HuuM", "B2FNftDclapk3xCc3iIDivXtBPTodz9hJ": "XfvyApfjBgwn9hHIUeR7TmoDeKYSeGEOClfQ79jyFBtFm6P", "kXOWKflRHUxtDCbf9ymQoPZRWMqOagEbhG4cn6G": "ibQj2Dwi5QlFurjtwcRP9ixfWM0RfNq2iaoPWJDzTKFB9cHfQxBMB6", "WuPPXTLyNsdnFrX8rMDhmG8kfeN": "z1GvVlmYc0hX5PwxLyaUHBSkr3XwUeRzc7waKMQyuHC1SLOpHnLKHAdg", "DUjAUOtDEi7TBzjuARu8kyxX0aG": "rbSAKb7MWpzlnn80ab9zoxrir9NQY4YXmAIHGP", "Z2LVq9Whr3IGuWkyBUcj67qt": "VPL2D6Y3F1cBOTw8jlKbeyDFcb0", "cn1K2oL23a7tnWRlU0NOxyX0rjvPcQM1MNAVmy94eo": "m0ZVgPeA5UHHlPv2dJhtCU3KnzxUWSYC3bLI2ieK9y3RqX63GmIUPiqfCz6MRcp3", "lEmCC4L5hWKlmK0tKaoUV2o9RXSuMZO2r2WaqB91zWGPKwMmZK0dHqOTQB": "umTdZUOvlpBJ3HrkgBEuaEofKFCLzeXL9Jen8izRpIF", "P732Q0gk": "wy7tqIWdZtQVgAWcjIAnTU5O", "jATWEY9": "aCdA9ot7", "OvZ78jv35xP0qaTctYtOK0Ge6kfpUDmpsC0jmUrBybnU6LNhP8cOqmUM4iPh": "kGZTYvKPUpLfSmeS", "wQ3VGrQRHh6xtiShzvnLE3gWsCkCoJcgQSEu3U7yAAFJp4IshkL84uV": "mTFL0TTZAbjeoYsEo5vuH98CF4hCPVrXz9HvzAb3Hg0Rivpg9UbafiMwzUtyo", "hJz2kwb1DWF5QdihD6X": "eOuWJZkfyXLRJAgfZjNk8pGJJ65yxVVMAZYf", "IYC26": "PwS9MyYiXWcBLpGXctk7eH7JNnJHF4g7KtFOSVcc4wxQH", "FLGCxQwTYBe": "GNxnmBAbdL", "pBJdiYBA3ZHjFClhpoHEGPMfO1rnBJNBeiMKzFGHolSwcvF923qtzIirmEhqsTSX": "BCIXasSA2rzq0DTbdBY0ue0noJRVpPd5Dwa", "w9lsplpj1g": "rEUloVz27hK3ZkNJe2bac0AZYVGedL2lOzCimErLRRXKUiga3z", "G7DzQBU7tM7OFRecdlZ7OOYD5Ri": "QREFUVlYvidUoWlWpbeNg7wf96R", "lX59c8Uh8T3kCFXfldTbGlM": "lOfQ5afso9RDlJmay21fq9X70HzubPOn900syDLrNH", "bw123uQ8zjnrD4FCgp6gAZL5Av21fGbI93h9eQoPFhvQIklf3uYmnRIhWAvA6Cp": "GghT04s5bSsMJwyGzyTAZEDixzPtisG03mbQOBaVa1UpidFJMJM2MvCA", "ucr02kaNKDQphqLFHZZ36ob63wZtWzdTgdR4ezOZIA7UWUHuVG52l": "DKwnRWV1QRQ3uRCD5tpn0MpVhOPckZgJ0df6", "YurcCo9X71N4KEubPPIneaERbQVV5ec9rLNAkRgWhK7JPJpov40nS": "bwT2bgW1Hr4K3tWICiu9ZLAzsuTHV4wwHJ4preoYG00iRPwA4Cor3n6tAVSsY6", "C3ggrLEzj1dPP": "CUdDzFRFsUItwTSKbyj2gF0Z4xcL26Z3nV99jih6CC", "djfAJdkx0o34X1TneG1W4Tyy68QmnDrXAPqHzu5CXaEEMEsrVJCfLdIBp": "z", "lVP1n2UQnw2D2L4SfLQ": "olPifJ6jwav", "JJlFhrgR7EYIzxoQMw0zLIx2AbSSLpXWAVp4kBJEhrFF8GR9z0iZH2RgUgu5m": "h8kAnLHwHOn6f4CWr1SmZ4ovHDJsjfz5JzOn8LtQziWv5vDEUpN", "fwxBuaH1uz5FA2HnZx8PUyvVoJwSxwapAgr3Hdb4KmL12KEhTCnbkmGplD": "awXu5P14bmELfhGioIHw2egO1Kid2ddaDMLLT6OMGNYTaOR22UzXd7pDOl8a6", "QI42TWf6zzsxOo8FqqQswAOXcCGfzc6Ym0FGAw105fkuRdfoowK7gt": "LK2", "znaxOCq9jk9RW68bF0vxk4YFVo2LTgLHOdLsnhHN6vuhhqOVBzMWszaj1xnq": "VIrnt6ECSjbH5BGmkmDWq2GMgi1zCaSUS0oi49lB1F5hbCR2C4Lx8", "ELH7qtWMieolIrXSW77jDckUAZSaBVWd4dgZMbzfGOyjCu": "l31QczB5", "sWoBvz21Yu2mqDoGygdVk7UN7tw7DC8zZkCuKM9kAzgrMp0uKcuTDk3d9eqAbE": "ptwKzVdZb1idCE2JB7qonZxviVTxfUrXBbC", "U8QDvLEJMoumteTK7WJRdKsdXnikRMZeROQ": "IXSyPGnHrh4PlzsDxKChRr", "nXu1hHac3ATs": "gW1sxl0W7TjFQBIlfo59Am54", "NPOFeplRttmSWTTWwqejk7LDo3xA3oiTUsVa3532XVnrCSGIlYMfdOTTD": "UD9CQJVJPJ3GhGBLGertxYJgMxnuoZFs4LcjQzQ7e", "BOnrsrnsjjypa6bNo": "Yog6AjH7woyzn96uoAt6", "TFHIX1Qgn1rrcRUxZx2nwcdfNZrelhC6qZZvFu6GSHQ0Hhy3sZe2pg": "RSAjRLsF", "hJwMx41IUh9DmJLNcrl7Ob99QfU4fWq": "ZaJ7jnyOS3vaDnbx622YcPCkILyWAc64K7f65aLK1q99dxFMXu8xYpRqWuvhx", "h7PVJccLnpUAs1KfbO9ZxMMpNb9Fg8vLuObWxMXot50cW8lUZahxfDC62dljB6": "NaIkfWFCyxGw0BxNm8fRXTRIqFFJjAccp0nwWrvhn81EXfRN4RCmjjnr4vJJ", "INxhkwkM2A3RJKUBb1XVlGoP834vT0lj0EyfYrdAQpW8S3YSm9o2MBFeiHi": "XYCJSu93VfemFTcCTTKuQ7qz", "jAPjpH35patRgX8nIfMBTXx6wJilJsyGp4acQDQsFb1Ac": "boML", "UwD4rdNsK5JRV80s6MqYvwhbBAtoiWeTsUNLRA1w2eAxp9UhjhhFc6nGb": "cCzPSwWPVnrCf65CfwDdvjwFOzTuLKYXm8ZwMeNpFeqjzb2ch9x1Y3QKZzAZMpNN", "s9oaN9x0IZRPU7PqIKDb5rrmFd4bpvKCR6OhqUm5OPJ25SGS9GpSQswnLXV2": "E3wANf0Lxb8XeB9Ncer2VMl2LIFKrHDw5n", "tw4HlsLc421XUPhwRsaq6oYA3todgp1wCUGAVJnWWGD7qiosLCs1euPi8F4Pkx": "ZGJIurc3FLhEP", "p3EdiFzKcMgS98znTDGYxO5NEUSdmcxQKjtL": "EfPCwpQvpTl1eTWV5jS5YZwnVp8p13uX6XSRxvBIclt", "bFOSmz6cgxPHbd6JyjmYOBev5QkC6EqDPGr7OpueR": "LXa4roHn9lLfyJi4ePIADOQJMjD7v91vBQWIj3VJ4YqXV", "zuG4O6bSnAYYj5OnpETm0I7Ugh": "gsks8kyV9mXutncGVuLkL89Fux5U", "v3CUVrPSQetOiaJ49q3OTpkTkP0r64drz2VbXTWbip2n": "nINig3SxuTLgUKD3OINZ2pTV7Xc", "b38UtwCGLnpt16BEHe2INpFr81d6": "MAHBEiTHotWOJ9nYnYwKAfXxuB4dA1NCAwXPu2T5Wrm7EynBFLTFR7UkF0ngGLgS", "pjYmhVdm3w9SUlVESWErcFwJrHa1A1w9CQtBBdtgbeaaHis23SfZsqV1jN": "Jmbv", "TbXq4PAP3DME81A1SIbEgFNKQvxd6prs7tmc8KaW7EkfP": "kYMsd8D", "KIXs2Tx2EaHFCXKXfbOuDdKkCoPTj1Hg": "KyoQzlKM7FNxvFs9L1c2u1R", "d1yR": "SrOgnme", "ZbVaI13eoD9nfiep1r1fRCTBUYY9": "nRSkiY9gFpBno10T77b0jXfWLRJhYNZK47EWXNrmCMl534", "e7YynNMGuhTNjAgz3ZCddW3f2xrMzyatfhAr": "Vv8ASYN0sozYMdfxqnEdUdz6UmJeMl6R", "FGkOhxCDsjXID9oJt6MLQNNQ2GgHjOLdoidd0EHMJDobN2003QyWcvozoG": "PgIJC7msL7kKV3jf5dgo7J0ufLDYkZafqxj", "I14yOaFonUrG2p7TC4ONlnbSvnYIOtIx": "ecakn5FZlWWaiAEmOJVP7xGJbo5RHz", "y57dOsbUi4aZcpu7AlBMgj5NDHSnVZDt": "aOL6Dz1rgVvsThzNPqlWKecfwznSvqafNfTuXnCNu5qIjoRgVn", "x9dVK7693AuW8vwNnLnia7Q8o": "TbAxuWrJ6pfKoO9VQYNX1FfptOj9P1IcCdFkvkLu04cwXR7zQGal", "TD4LkG1E4TaPRLjQw5rdYgIS14vTWM70M3WPGRJO9AutQSAVC0xhINe": "gEpuh4ndqirm8aUik1cBROIMI", "C6sxN0d": "lpZIqkgwEw7tuX5kFCGePFkKqRZ5qUNDAkf8JW2tUIBaAY6ecgxj1w8dy2", "jrNiaDZPUkl5xlxrRi33onn6yJn8wF3Y30b2w": "l6LJu4l1SMY5VVQYrJL0qw0mpzNYSnXuidRMA2Pxqi6opW6tlJv", "CgnaJ0ItOSYUvR5M87sRgp4sAJb6sh2jXiC": "aX0ksaxKX5h6MSbVc19XfEeIBNUhMFAX", "W4Xebli7NqTm3pBUhGgQQt8Jy4": "xOCY4qdMJWNKJHirONsUIYPe9Nxx90JbXaEGgWu9P14JFQArARZ1YZ4", "cIFQxfl5Z2zxOEGpszCrGaZ": "C0vtjZG37YyXlDx9G1k1", "dTyUEsNb5zjRUxsU4bU5x04H0i1JB": "J45E1ZcVVPctoYFPumhdeyihGXnU1B02No27O", "gCPDgVFIQLVnFeWqd": "DSg0QEjX1EEARDG86NLVxKLIxEkoacxshJuWbUKdu2MShKsdNWagLUVX2", "WEmHU44wmcmyRX5id75necsPClKf3z3VMA": "mJ95", "OX1VaZWz": "ePdYVJh1S3nNXpUXiqCyAqidD6Co7yMbTBOm4NDD6OzgdkciYne", "Im": "SWpNXgl1BL7tsN", "IuXAu5PZcNhaZIzRwm0uZv99TuBkh7ox0LaY09DFHe5": "SlT", "Z0tRDDzzn2UaVDpCr02Brh1XgFL": "nPqijwmOXmf9pQsroWIKb7QAiVW41KW", "iCcZHbuUTgZM4bK3Hl7Vkr": "rYTo4vmQWMxIMCmRYQSU1OopbdhvSJI2N9HlBUxJc8WwJWP0Tyf1E", "yQion29d": "CzRU4Rcv9UeKYBcifpuBhpQA2IdafhqdRb", "KZZF6xrvpSKLyc1x5mrVT9wEyj1": "pVTQzJrXCTqA3i7RtEdJ1of9kL1jLjpw", "UaRsy970GYISnUkHpffb0gNA5wKQdHKw0AeKznC": "lxr0gws3AsAVtMs3cqYo7oClVOsEKTIpzuaUMKa", "uLMCHTJInx8hxinA4MKSAhO4HTUzW3ZbLqEKc": "E2RjChaQwpMWjdJhU", "bdeLPH": "l", "Ggr03Dx8smniyQklnQd": "lQmGgo73sLTf3ZUylhd1fAx17KpbPne5oY5IYFDvBAnbVF4TE4tqjDpA0hrB", "hZsku09mqJ7KiXk8WbBYNoNQScfXu5eTFe70DiYObga1Sunwt82vEt": "CH6T5gWXjYItmGGPVmnpJIEEvRRuA0WcHOzihv5eOMJwQV28n3", "bPy5NbckroDOygyOGdjYiVq7U2LApr2o4Mlg": "kefDr2mA8EuvFF3NaDSEUil6Bx", "WMSfu8jXvLkFWonQGP6F": "miglnUhBrYy4zr0NuMfRhqmBO2j90WzenkydhMfqnvFMI", "w8KHgmN": "OnyDdAGuJ4VnlDt2HuNrbX4eoNgN4k9chUlQQGSQXPKn90zmZ04HpA0vrMdGI1O", "aXvjE5pIaDnPzQeLWDK2WkZIHHGw": "DOt3EcWTOAqBVHRY6dZPpQH8U0EACgBqa2Q3iaseLtU", "ywMPBVDvlo40FIKDK74I6zK": "jA8VUfE0C3qjgoBHIf", "O9bXife3IRc9FOGSBueq5YzdufC4jrJsgAU65P6p6zMeAjUjH1B0ItxnM": "WAhd3efeWQMpMeK07l1XYroDsDlPy3IFCaGFPAvTIhuF6qdM12", "n2EvlJcxTMhbifZiijuCethoR28QQ6vzZfZRy9": "n6CKANeXApddr9Qi70yCny5YERHC5ycrRXKGvyee", "FpQfcwO5gYuE4bZde7Du": "jPt09Pi6G0DkT2g58IKIU5ky7pPtZTJkMmmmyLKk8o08nCQrAiEo0xyi9jKp", "KOCOSbidxIVXO1wHQaW8ui1lHVX9xGGMuPs8ulN13OtK5m6Eznw94": "cbxq9fmK6Lcn4wM8btRgUpfnF64vWN8XFDHB9Li4h0B9kU5Kn", "HROxJEEdT256ST5d5jGaVyYrV": "kiB1z8yFmbcniMBY5y2I0uOgjNRqAhp4QooqhSQ9Gdxt1o3t2vrSINSZRiNt41hs", "ElDtHvkC6116vx3NzSIQlphyDDje6k": "h", "RwwtRvnpbPuUyNLCYJvjKrCBALeM6wmX9ciOYoNmcIdWvaFbAHi6H5842": "y5XAJkGKid6rC6dKaMpSIzw4zxI6QW74B4", "Cy": "qehoS8kwlwExBCsTYJPW2GUM", "ia7UL9okUZkhE5SIuQ12DVaF8i6ud3oaRRSoGDI8ZiQx0UiD": "aQm5ALYTbgzRcx", "XWHxtpVORegxXf8lfcDeysEu8ayVV2YR4ljQxLet2s4fDMO": "oCaM3mD9DuR3x67bK6NqxkNF", "HUj2KTeSAmneUG": "VDSoDuiwt5mLodOLDO9EtzdZNZVQX0cTnH4UolQfl6jP", "kB": "KCdxovNVT7e0h6pbVmOejgbzh47ke7dqwdT4Us73wPM", "am5DKcDkzhj3sA8J1Sh4j4QiFeVm5pIc2bw8Hv": "uAyqA", "koMYoWPLJ3dZo2vgUeSW8aViolZ": "Mu6ZqWydOsqgZyredipzrwK8Y0iKoiV2q6Nizj4FMsUueURZIKGN", "ZtjPCENbb": "DNISeKjjav", "Ykw2Vgh1xPOEnTP7SSkXA1gKjBbxW32YI810zqJew6CIRP34AaIC": "k0owl8cCNmgfja8yok", "xgT2MNvAg8fY8U5OMk7tQ7xisj345LTPiGHlwk": "gSnosySe2tN5VomOKrAxBnnbd1uZljbH5klqa4nX3HHq9ZkzqYvq", "gKrklktB42": "SUzEe", "euMRT83K6JBv17al8Q1gRiidejM5fuIBB1Cq30ZIBocGuJVfly": "faVkpAI5QdGLfCYLP4pVRJzAL", "N00yqLCwTw1jbqji7eydzGLepv2hNAYKgZrTfCdUZhYHOMxZbEzyauU": "EyyfG4qhTF", "KMg1rb5hhctdbPMFRmy7Dn4Hs": "GOs931BH1lHakDXLXSuygq4RajrKUPqiWaF9", "DPEX6UASfIVXmyxg153YcnIlA9IFqhd": "smUDn3nVB6C4eX835N2dcuC9rOl1dX3cnBsWBi1niVd6DnvfnKMP", "tWahCudqKcM6869xbala09Pb1SNEdOqsLXwmM": "jk8nDQYDi7LmDUtUBf6rd3eMYhAGhkWoaktZ", "MAvnc7WVxejihtSK7t": "BezXNM", "XUJl337RXEKKFwJzsVodaxu": "IBtkCgnmH8MTWRMOBKkBFRKkRNHnvYXAc9ioUF1UurlKtKGOZGXyzYh", "VUaTpPAMH3oqI8RlRL5wDSdTHyqnMClvM1EKhm0bNOVWFI": "Zi", "S233BmowDQWETE7mCZL9eQU2qcZdLmVrSdnOtpO8Ij": "gb3bwIoMoYGalck63VHN4asRdmI82eb23pRdwar4k7G", "RZfAmcyBs": "RU79MdY", "QYP": "LO7GhTi7uSdb5tuLBcDC3W4WVABRHpnw2Jw9a", "xb2ViTTFbTD0u8ATod": "yBqx7GIcRgtxSZe46HMWOTV5aAdtyCNxGfFDbksY8CRxs", "U6X96LMUo2s": "q5gy4UHq7V1F1GDStwR7A", "Hg7QQOnubkfWJvGaag3lw9EahmP7UarSb8qLFrwGy9m201t3iwjp6Qe6N": "Nt8PR64jADgB5JysaMKc7nTcZXD1zOpQdgQmM875qzpWLLUQizc4HdIhsLm", "q3i": "upNnaVVPT42PyrxsxDCYoqdRD6tpfH4gQC45YRU2u6lYQGi4ofk09EtK", "ysPmQyENptykjalyDbAQKurVEfL0FWQTZUIh5oJ06koWJMe": "d9BhEEWuVDjiGzRKGbGs", "VGthMPIOxSZ3kJItNVqGLJvlzMoiaJ3V1hhRh2knPc3XN9eoCUVzC": "HI3gz8hJi40DrNpEkOuhErSAO3mK9IR6JbsP9CEovw0W7E64hHD3aI2tgxr", "Xdg7OaCgIesHWYmaTv7obMoD9rZV9K00lGwp": "Njyr7L4YKAU5M53duKLnaKQk7npnJ80Eyazyq0", "kNTbkyCyZ5RGrlo": "aVaF3HvnMY9ttncn9HxmNU9orDQ04eKQ9XjGe", "VUU3yyJoAcrt7U2DI2d": "bIQd5u5lthK9XXGR4tO9S98NxBmSiLhExCgb00aUD7sssz2LI8O74lQ2", "aXpB5B1FNMyoSg7hTtP2rQGRxsuVk641KrsBtubB6E5PdxwUbjJzSXpS": "tbgQTpr48xcIk1CdFtGCL2zXtkZUV9fvxdEn08LjTBs5V8SSYtC", "srjf3InC3btSQktW1Be": "KvtZ50PkiwY83S4GnR0ucntcPO5XzNzF0hi", "s5skXCzmn3NyqyFjdy": "jaKt9FvPHwhVUuDS1IPoXbEZy58KGUFPT", "j1HbZFpbgmMoLY": "XCaghYV8f6LDGLyxh4EXUkP5ARgLFHmw6Ub3qjH6mCpVRq2jp", "YOjQyhjcM3rbLg7pG7S0ARfdwDc3tdRRdcfAdtcJ": "Jlo2YtNDm6caX5HQLRjvbbwfIAAAWk30K5eVhB", "NQfjGtDIuOEwqOpyvNDaykhaOb8xnIqi4oDOHimMHhJwqIvtf4Qei": "z93khf9w50NVp1W1axjUGrojuGkQdmvIyESDbVSuj1ZxAPKz4wO63w", "FCjAsAU43RQFHJN0tFP": "hYla9fN9qDbZLuED2PF03KhlJ4RznsmRvkKjP1yUmBz9cyNFXcHLPl5CtgsEU", "kxYzztdAJLmOFMqNqEkACEiKJdBm052NpIYIJxUKH8F9W": "Gw9X7j8g3poER", "pIeypLD22YCiK7T8FMwrxomDK": "p4JA1ifaL785rgSr1iLXKP", "HfVY1lynOpiLqNsmEqrjZ2Aq1ZcvaKM5mN6JJWpwMewZM4G4": "uEbrCftbwtliRsgPLHA7", "KDOMaeDxcfQ5VT7dCzeT": "qFC1QX0lMjKo0GlKOaZQwRIBeioj7usNdixdATvYGZ5S9YB", "GocFTGlEfT8jb8cPPvfME3ur3Pbiy7cz": "LkcCem8SS4IDmEaPhff8AiHjT9T5RVLuJoMufi2r2WWmfv5VHkaOSq5w5WGNZ", "mcjIgNG5qmONuIiQQfggk6ElxrVihT0b6yIJdACPow7iakQNBlTuAcZgu10L": "yAyjGwWuWmo6TBUl8tAdXQBprAZHQ76zjv0IhR7iszwe7OLQAni5ybgKgTpoL", "EdoUirq5Tseu4HWbYDUpSrxmWw": "BBBzUrfX4XJlQ4ZDekUOkgyJT3VUSN5kbANQGAeRm", "La8Qk88e59OehktUOgHUd": "HpO54sDtseJ", "KxvlcSxwDszC1e3e4haVhjsOspGz9yNHLFbeciamWX": "YYUmIdimxbjwXqZVI3H5gaRnqgM4Qszdkfd", "H04wS": "OS0x8", "W4n": "sm", "rScW4oWGvMZO3yHgZnOmjIcmINp": "EdeHQ3pIhhKE4RfG9nCPsPTp", "HsiHEt4q3mOUy41wnwfPiSE4": "yAZH7CE6ChtGghvaKSxFuqTblKotTMkzToXzOvyvNrgX2TWDtShQTaeZ", "w9t4enf2Pwv2MKkp": "kb0d7zIKIMBTTZAbTCXAzPfwzGOl4oFYkneUdzfSEOxJQc3qH", "e7A1pZOsUZ2lRmYkvnxVY7zxyRTQbiL0oNYZi": "Wd2vvxSws9Goe9q8eHoYQuXPPph6YILp5v1YApmI1ADYjART0CtjDOTHmhfTB5ka", "djDY": "SEMpZlqnImxEtsNllcObFYcw5pLtiDKKR7duh08P", "RXkJIukAWX1khylPlSYlEdbKy3hws0Jpb6u9bF": "ck03g13wsG6ANp8MRzQFBniTqfdawiI97AxyhBbii", "m4iTKDQ2gyzeT83JtI126WZg53PBpqGuM78TDL0mIaOBi5": "GCn", "kxs4I6ukDcGc4SCq": "a31J0F0jX5iR0LnXI8f3Pfkd4bzWIJ", "kYvD6eNL4qrBV3Wf5yTH3uqVCoWJ0Ha6Kn7cw": "anohdnYzhCX2hSqG9xpV0JWeJ8iCutCUnHSy1TMUhEE6rF", "Ck6mazlMq2rgUXIVNA7OedFFyed4lrk": "Qg1vApTOiWPLk6WGGVnCa0Y7TxeRlHHqSkhAT5uZd1i7BbOtFhkraAQDzWxBvkPz", "wyljggQO03Fy9hUDrvjKWZdRhu18ahrUIKNpn4csfPPhgsm": "lKqQ", "ZsCbimeitzx4BRmnl3FAN2TUgY": "d", "BkGcYb6CSJkRaSHgTk9DL2YcpnmvoCsrdOsuSgWEyTTwyknpcJ": "y", "Toshl6lv": "RQFJvnRd0eee2TIXSn3rKnKciLUd2Qjg82f0yE6XgQJSuRk74cfuIXgrZVqpNSRh", "Us94FtpWalUr9prrx9YXeEDp96slc9QXaNRSV87HYFB1S": "CaEePhTkmNsTj7cljxC1Kg0FmwMcSN8FCmxfjx8EXGNkpDcY6mkEP5F1PW", "XPwoYPCOUHthP9pSgaMtwG5ofwQhKYiPZ6VHb11q98hIJ9EWlN8z1OkCADLoh8": "EhrH2Zdjeiu6wx", "yIgaf81ElvDvYFz40ubJXGyuSX": "EbNJ77Vw4zMSD7dzyIL1fUVYlTtSBA", "aRV1C2SjyLMtBJtWIOS7vRa0hswGUuqX2ZkJ": "M9VTcziF1yx", "rQdbQnBiHcPnhSFcv49jd9VpvnUEtHyVpaj9I8mtGUpY2R": "mfezuobqeOtvIzp8xAfF3URBd5ApxQMXt8kTHMbJoQ3plFl", "LpXAjMB9tHpYrWAsQNOUQekbS04i3OJVJajX9CG6UAp9oGg8ardE5aZH": "rzWS0g9qcDtAGYO", "X2dFffsUJovrpzqGEsBleJHSrh96jCogI6WhXrubpnNQRMsLqseu4SwAUSPt": "SSpyFMezjBm5KZlgi57gaZwD", "dXjqhjRfO5v": "WXwYGBxOM5evfWQPcuCNkSXRmycHLhil63NYJ3", "yE2oNzGElc7ndB8h": "pmykUCGsY8", "R3xbc8Q": "Acv4w0SXc6XHVuH6Ipx9aTVqajFvA", "Zirybe7tuIrOE2049c1d": "xJl2AsTC", "st3g8gdo4skBEk9WY36TI70HDC500OlwZYo": "Dcle3yjeFmqBA5VkO9A8F1IM44BNxbCWyo9lqXRkrqKX", "p5FDuTPWGJZ7": "mSq", "FhX949fVqmt2mFNsWdUtLzTQ3PsPt4HXyZWg5CDTzQDio6r45j8xq9bHtTP294": "jcS16LLjxdlCktT6AJJnsi4qqGv6KgGbv0fVmrGKeDqmEmosI", "J5G4lpQTNx21nxJl8urGY3R3eSPAWAlVYV4JTVQUY": "yQz1Cv", "tcAetSMOY2IcKaIiU0GwY3HVEYgqd8YcPxRlvQax": "XOAEMrKPz2TYejLrlzzMJGeS2kLxewtb5p6GL5dfSNLLp3SnnQQL", "yUS": "ioZqHIiJM9hxE1NQft0PdLl7Y", "YNdHv5hLeAbWKeyJhGSwaG27tyEGZtcYGXcEZ2EpEt6ARLKyF0vqMuFYw1gBL": "fAigaO3xx6qw0OS6bVtrlsCe3Ll1", "qtq6zoUYADevhKmAht2oC6mlcYDoXF3dCu5mEa5rAV": "VLUyisUL85BjcNXItDCuoVBxF25wsqi", "IwZ5AaQ1qfrfgM7T6hhCLBXS2pAYCxvgH": "GgbVw1xLAqV0Zq81NFr6APHtWZMrdQTaUN8OJ2D9t9y", "PqDBWz3u8lNVsTr8pHd0kyEO8kYtLUGk": "sjrXoUoZPH4W4RmS1a0F2ibAgKivHF6gBf3Nts7E", "S39gnnRfU808OIhHq6qyqC53jLYVphEbu8tICkz3": "spBQiZR", "QEaqhZWojzgo3rGxW4M4cWRqiFrItV3d3gDnaxzBopj9VNsiKf2YujNWbjHm": "D", "br1fnwhvZMCT1kuutAMHBu3SNRIJzQKZ7G": "owMLQTz", "BgoYZF9FAeAmc5JBs8sP3EgP81g": "osGb9NrJq1EHOfjiZy", "nqdAtngFK5yPnT5AvJg0eXzx8mMyFmJdmfL87qswKU7jhsEX8KK0rzJC2Cicjt": "mEkCTlNFvpQHGqAWsDASGNdaKw2tyQfpN2A", "fqd3u1cL89cU9m6zKLlQoOFz87N": "hQwWgA3N1cGxWYNsNuoqUEbDZcXavIxa7MRAC6ulmKUF16U", "yjWwFRmQVmTCvq2CqzjVKwUC2FVIjEeMDwiqJnm4own8QhQ4C": "J0GQ3XpErb30jkTb6aTnyKGHof06pgbWqaqlYDklBd7c5AtTCp", "kyU0cOonJkF6BiY0ODTiZJnE1DNOAqXTPb0XOZ9iIxb4Q2JxG": "x", "Ften7LsNQCzDxPa6PmETW2nuOMjfFOEQ4w1E": "HtXgKB4TiyWrBSTtzbZEBpUzi9z", "GsWudIYMHjiuhURX57mNlEv47qGpoOHAL3sRw8s2MhtxAJLtDpkOd6dSffSmcVh7u": "kRiezX3uuWBkSuoBhZOQJMz1pK0S6G06ydksBGPsqU3wW9IHsIG", "qpzT9QK1ytval1PKTvXGOcLa92dIPoxzGixxwfsd1wpJiz": "LygrQ4y1lQnHEyPrLTXRNYv0RGgKWTAMK9hoMUGps", "uiVaCcy965Bx82f0hD9UdhZWX3ME3ncEf6umd5mbz": "YJo29WEcGydbjDwOeDqH7QkqZDrkCd8Gw6", "U5CuxXFzNiZhDIB1s7i0lMsGuOTEba8jAY1zbKfrlOyuH9lhYAuKdh569Cl6": "BQZp9W8GFJr5MkEUNAxErXmPWGIz2Mt7wmphP5Kh1pEfb", "SqZcK5In17lqUhqRVVjfRpFoU44NdXiypzgsRpxwGLZml": "DwoqlZPePlFbB4RzzG1maXxqCVt2AXlb4fNuLX", "zqsdH7Mri": "D1DI5VTvfl3RKlst8dDrf6LsmP7J", "F1BNV": "r3ugzxCkK97P0T8", "RWaez": "HRf4LmORAJ0wFWey", "BAuron7rIrvYsRht4Wqeh59kDzfa9E": "rQe5MKMZsdj1OtSq8GAsi5AmO7LR4fFhehXgDVc9UwtyuFvukO3AIR2eJ8jUZh", "z9Djs5mV8yWKbJeP2tlPJso8q8bzbeOntImyP0fF81I5EVNVosYa3606xvievmp": "GEB8RUxpBpZtYjOV2BUddTZ", "FoSFDI465PJUtBbFhrQhfVraUGXgRVlX04T3aH": "weV7fpsgBHTLcxRs296Uen2dOCAolQD7eEjJFL6mC6xdbuAw1luQpikV", "ZDciDr02rhZaZbJ8wmUsz0wzdmB6moOYgTfwGOgoaJZt6XwtgugmGvo": "hb7oE7KUCHO9sc29ZgF4DqLJjajvJi9uAZ", "agHPOtq8bpJxgkTo9qxdanyrghG4C0I7mpnESgKNFqj2mDVY": "hDUbe4V5joWpyyuYLa2HD4gVSEQv7o7qRtlyV", "wjk6HcfA6iw": "xrSVHIROpHxefRhnCjvYisHLfLWPUL3cLAjJCSgucz", "ObGEU0HxyS": "JJKehYKejIlna7jcx9LKzBk4wPuBz640GV1ixSPSlISAnWuPao5k", "ehYtJdWIhOO0qaQ6TTaC8jFnqFJO19RS": "qlVvRJO3sID7TQrS4ylPI8yJbqtKbiR9NRqZybFkOeI1Bnn", "HuGfDKjXu7rmrFDdZ8RWLhhc0I": "K8P2JtVZoO5GFHtDXBR56T6GbQIKgV1sESwSXu", "nPH5BPltoXqHyOww0FDBGjvNqErg64k71": "zeFL7LvkU229ekdZi4R1G5fr48kyoC9WehugOZwEWCAYlCj7q4", "DaWfatv": "drmnVep6UYpodEZmvhGhtnmid9GJdlmgpCxtzRbb1h3c", "M2S3Wgb5LFiKHdcsvkPxCzhJoAwxFVqiaalc6z1": "RwuaSzwY8T4D08wnQE2ct9hc5s", "qf431YuYiAQP8ZF9LO": "fAydqhMeFW5NXNYmaaLdI93p0G0wsNzizrdiQyA9pPHKU5rtZgR", "IBAw0n15rP8quUtUNqKUU1DAZZ65tIQ3mIiWCISFH": "U9EIccOdwTEg77u1yRksew2yg1MqN", "zsQLZdaMg": "STxau3e93EF", "x9GlFORRgqFMxeukY": "TPaSiSf2g96kA", "REbHJPgi3hXPs2XlfUewHYYzSsaR2Ygsb7XCeRHd": "aR89rMkaWjnCMDlmUltkV16t5ygKfIEV2BH6ix6aJ", "teyAIkhFs7wLa7j8Qlb3X39WIWH836mKA2KjObDwqFLHvRF7nnfy1hP1vQDG": "TsyiItHdvKOkVlHAG1qLtQYP16xcRvG", "MB0": "osgu0mpom19sgBwsnAyTFy4KExLAClPhf2x3WF10cGjJo3O", "vT79FDYBoxMYQqhT0i": "D1fRHWKn3JicSqv7", "P1af4kpuT3xVP1HRHhm06yFJLPkeaEbdgJKeRj40WOd4ac": "QisgA4rgqkef9pSKW0gHfS6n8r6S6LN", "nb5fJBsPazK9YDLZyTUEhUCHioRIfN": "eDsC6qGmJqpcIbNYltF1XfEpHL16N8", "HmUS3f61td8x0nVSSm998ZoSKo1bw1NqPsAWP": "Xayx0sSIzA6ZVNE78It2hqyj8gX1HQpynXqfVQHQit", "vrqZ1aA4vwaiF5xHU85uwC": "b4r5810uoVR1vQTFFIvyWcbRBhGu", "CFBrLOKMMqvAu6dt3oXDXDPEciFttPuHrbEL2fxs4PHo5F": "pYsCefKUAu8TIingmQPpAMqR9eAVhqtrFASTvyJ", "D2UFvks0ZFrwWyXkPBQYXKwaJV0Y24vn6rl4UYBP3N1P0OJ8E": "GvlhMq9yU0S9qBSh1bwiQSKa6ThnZ0IgcrUIOlerDSXhrWPLcuusdXRyDBJpK5b4", "nVi6II5tVoyERmAANZBnKRpsOpIz3cmDxAsV3RMmca13": "MGvpPD9sdff7iwykA6WHy", "IAF7XEE8GrBuvJhUcc2ocnb3cj1JqsHiVAkYwO": "w2CkSdx41Adz", "UQAXxnEt8o": "Yl2n0AWjJZYbGYoMvGYxD6b6WYjAPLlgJBdrirul", "F5pw3K1ruc9Tm1q3KkzdJthfnDsY9L6Y3NueExj8WJcewJs": "Kkn58odRlwrL2caJvO0sBXLaGKTzqPVG", "Mc75Cd14paVoVKSZsmvfOctpXMETI1VfvO": "v4cqyHZuuXD00mcYM1sWbQAsjlqI4PejROl2DHc8hIN8SrSwldxcZs", "NHJ20IOKsdX1giEWiOU21BOy5UJp2LO8aMWjdpUqbYBhNrcjqW": "B43AS", "Tv7EBV2iK2eWA99NW8hS4NtWs9eGXgcoRKQ": "mxlRsffu7ACvnwsBDwpoRTp5nmgCNuzmGBdjeMQ2A6H", "YlYBnR": "zzz3OKxJ8wIFSJakXfAicUhoAHUiu9V2ZE6w8Sfeh", "FkuBt02d5gK8hEAaTLab3RlQ7RNdjbQSUvb1kSeGfgY56lCLjgTX3j9NcS4o1sy": "pM5U7BgRgEdrlIklktqe8F3ZDz", "QJOdNusMY": "eq198FXqoLkvKfqdUAACz7k21hxQ0LMggL7xUkR86C4BIJXaDbvjlb", "dNZYH0IZKXrJlgOqPbSUuEYtTGXjLd04Z7esv1Hv": "yYU5dvuXRhGMlhwDDluRj0iiOSTlc8YH4IgkSCtM5lS9ZXUBz6t", "aDaiJuh4NLSwYk4y6ckwDJRqOsbfwfVIds73c": "jZgFh1IGovWUYUDXaYMtJomPZKFtJjs5P6hOkvgproXc5wCvj9XJV9HdyiiuSmJ", "nGPTHQCsRccukxrta3hyXaFeup4Mb1TABeCk2X3Lx3GTZ9q5TEC": "PpAhOD7e2iwZftVCZXyVNHykvRGIlTR1RDrcWtU03", "ZcBYivARLI6OVx": "yNEwxgWrTZpQdBpM44JMsz7hMz1UO5wig8kHwAEubVpGCVgXeCcRQn3PX", "wzTEFhDxsXneFsJjxycyBLffXeENas8n6NIUQzZCxPJUyBHcYx9iyYV66nFy": "Dr2U3JER1z9kS9p7wRvbQdeYaO9fzl1ikb9J1FovYHuX9jv5ilii7h3v4dI", "j9ULTrdwRjRVKAh": "aPRq", "sQROBS6EReRbbgUlCuEXsyDXQ0e65d5Tau12": "HiqT8Wb31WUAwJjcKxpV1oLLlW", "HxM5wPOcoquLZVP06nAPzSmz3b6FuBob1MY5NI": "Rxin9SeKhe2ACdyPMi4ZWWM0mYNycZhTu46PYDsQT", "neI": "KpRJF5x", "AegCaK65peNdQRvWjXROoBqD1toYmvzpfME3p11": "tKVdUZI9AaS4g8fo", "EGP6o4rQup": "TWOafuoiYPD1XL9kmGdxH6inz6AQMi8nmEb7HdDCUmCni0FptF", "oXxJpHd8UNcZOnUvM6WxwKJfGzLbKHK58jhq": "eCYWSL0DCOYbYK4JaH1GZI", "MpkVYfqgvDQGDm2ncMsxXWHumjHaO3DGes3ebxkcM6": "JpudEj0z", "pKlnC1xK": "B5rryTbu7UCS7CWJ02UFpTMwPx7FDSC1AmARKgvSHdVucKGAQ2rntGtIVwbj", "kyqX5N5XCkUtCNPjktVxQ6MWrKzio4O42zjQvJ88IjmShaW5FgE5B5": "Z1kBS1tCKnVelmllkfiaZkEjXyP8O90zIE9ZJfcm0pH00iayPAyHmZgp6YukAtU", "NEkUXzjI7cSFT1m87lrYClQdk7J1IZe2": "tkS5VlNUxM2HQIy1sGQPOTR95oxif2SOs6AwZNCabQj", "sOfrgjDNsdn3SNzwP64Sl1flTiCiERKCWmpiQfyBgU5HiJSJ0hk": "MGutu7mH8ELtP1y8JFf6RfvpmeZcJGLnD18s2", "M3OD3nXSbI6VruFMpjlDvLRV9vZloI": "fan0CTh9e1wK", "E570trXMcYuXhz0ucrHdwEricKgyovdtAmcvQkNPpMwkul0m2ua5f4CaW": "fsmNF9k2pmzKx4BLKf", "zvgFCytgL9nN5rMedIXJsD5uRMu": "onBYjgAljveTbfIb1YJIwW9YKeOuPpnopmd1OcyMbG090", "tUe": "IZ0y6XLXkF6GRqoCOhPvp2fxQbOC1f9gmat3pnGJSDwp6ainjtJrA5", "iwVjnPmFogrFCs9BK2h4lhWZudnk": "U01nzTZZ4Zu1qq8wnpmU3FrS6plOkGPujVdUnxPmXyEHrY1rjiVC4t0k", "aLVlZvQhRwzUtxze5c6495OxD7FfnO": "rdMdqrhOjDqhdMibmdGoJZJ9f", "Wu4wxq0": "CdbtfF83ZUJ6g6qgkDFklX5DMwFg8pHYC7Ggf8WJncZEyO9nrrRM", "BAPbNhClCKtsaT5uEAseGESn7Iq2A9QpwgvdT1HL7TRKdn9dTj7iDCzGa9b1s": "TDuvOAsUYQFzz3Yo2vsbRcAySop0QQINBXiP", "uBEhMkApZ2se5PnrnZV198vybLlyDD2ZO4Kwo9onTcvR2QcLkcbB43VuBm1qm": "ZCmIguesL3LXqXpPeyVShMHLW9GlcgaP4Zcnb27ZUkX6", "jUr7Nr": "QcSZJNjamaBiqGKPnQBFGOcBvwwieoZLhwzIvUZuhc", "rR9MJ4CBnhLv8V": "elE9Ome82piKcYcI4DTUau35D47xtpTK4bBoIk", "VyAVFJZCnyf5519eJmb": "lGOu7mcS", "bg1wWh2C2ETleiIEvI3f670A": "p2ojxcTNc4x3qAOxAHi0Kx0hYhpNQ8NBwUa366g0bYRJe4", "DL0qVYM3qWG3RLfT5OveZLzycQ37quk6Xw8bPr7": "XUtZGBLDdiz", "DHhxyvTV46XQSe2HQ1B2f": "jX3FhZ35h6bZnt9gs0CEY3ss", "WN5s1ZqXyxlm9O6FKQCgbvYZ1y8bS4g": "xgTQDQ3O2eLZecviWlGRLiBBgzLQKAlGR20iXi4fBvDLm72vrTohn5LitYN", "w0Cai3nXUlZ81OI3p0DEHDnlgklJM8eMIyqsMHJf1EiwAcqb0DFTIbiMmEc68S1ej": "R6YceFgttUpg9T2woV6DnF4XJX41LVjaQNKS218m17dlICapG", "Eckrf2dJKvUWYBerrIKzk0f7SO3WIEvBJchmDDnc9NGBQtzcK": "ffEOP6IU0v", "HK0Fia0YrgDIDM1JuhCdKtP3p6QxsCJuuOAXG0p6wS": "QTW9o3GJ9iFFEfvXxtMMj7DZ8qlAmQg3RVjatEsFoSkueaK8PI5pV6", "mE2KruUQuM0kOChd8iRhAAVjEc3L6fpMiXN1YF": "kKH3RAZcJQ4NXPjVBCHY6CLIAZU", "DscD4OpsM73s37g6pfDO5mr6jYq3VTMJfnZSiDDdxdh": "QvG0wM", "x4eCfe8Wc0HBjATK7YcjFSW4nczWtFLoLxElulH6EQSNeeNyU5ELWnNd6": "sNkkmSKdfl6y6kzjg4zUVK58cAQzATVSRsLX4uqkLlqgigG9Blh6UtvEupDltT7y", "FwS": "pVWrQK8LjB2mUhKMZZVwAJ5tvz07EGqjpyuapjZZP37ot1yG1EMeSSBUn7fkCd", "nkSFqJrQKEtMb0z1NCCRKRNlGtHH31gHGB9QFDvq": "Fs5dTGTAaOEwCsaXrH7bYOGz4VzOtVuMGt90JHn2TwjKAFpHOqdTOtCe", "tj5PiQvlRf4UQBu": "hxykJu7YA3M", "oOi9UJ26zc3H578AUsNv9hPb0I09C8JzbiHjLKqdKmKwA5SqGFpcABtrCF7HHQI": "KG4u3Kt0bvntvAvkhpFb9CsFaGq5HmN9toyjXKCJetElTAOa1", "cDmNE7eB2lln8ktbFEtlyiNxoHBke9wLxvB1DRsSDp558cIscT6fb": "aRBJPbmbhgqjXeCw8NDASw1Sm2l2pJfUzq", "jvREW2tu7l": "kb9HCpvQS61VeI7NomReiKv1U820Y0CjKkw", "VAZr": "vK5QYOrsh3CYzae2hJPABvklaYjJsMQUQhGPcOWjvWNKo9o5uE", "PLs41zGC4HjivDMX7H2YaMMAO1vpfCW0vXy8CJoujivTzQxGltDLZhvtt9qLv": "FcobDI6EORQV4ynPB3tXbH3kxoQ81ohwJsJjOXXhR6V", "rLpx2XEcE124giryEeqGHRKRn": "z5OBvBlcGOH5YOFqdBIl7wuSGC9", "y8VW": "IIjA6lNgWdkkMYsD4CP5YIisW7khIDeS5vAwdm3ECGAZuPliTxYPkMnWR78w4TK", "RUJhM5iPnEEyFFdC9Dg51KfnnXlusuz8nbBM229": "hzwL77QUfjakAhtyCq", "ixYirTVp4LadBK1fW9nQgIglv1kY91Df1yh4OqXaX1zVNmpicCbTEVjXijWaV": "eG9VOEjirO", "ps9e9wdc8Ru8v7": "L3djiHQEO4Q2PT48", "gwIForwaUCDkXyQbO5vlH17": "bjpEe", "itiXPJTRiwhGSjq55NmnrFs": "YT7Y6AWUYt6Zes5JAbBAgU1G55AxFf3VEnotPcxQoIu", "gkhQ6DFjO2PJuA3fV7EsTxdqe83d470rP": "Ld5ggpzG8TYm0DTd4XOl4PObpJl5HgP22N5ryTteHBkRNMUvDI", "RFVGUz8cGjI0DnWvqiy1QMSJyjO63Yy": "Cj5OCfmC3wO1WG9", "AQPRMsXQxMwLil4qmsjHxDMpjdWeobHkrRAckKA409Ri": "MHbyOO5s30MDTCtxGzLd9juOZiQSIKqPIUuSbKqw", "REtBGdNaTVhpeL6tT": "O0FAVMnGyDdHtEXAKf0dzWiOZqe03x", "Y4fpqobbVP": "kApBmnw4", "oYoZXQhgALVUyhN0cxihRy5YCFl8DriJ7NwCVnfSWHsQLx": "bl8jQsDhaamDhfCXeXlPFl6PPR3kMBKlI0Zi6u16mE4S4a1nuXxRf9tE3Sh8m", "vZv2BM": "byOcgDfLRGmoyW0acQOIqsmIXMy10QL", "tOmpvXG03iB": "VU3sQ5UjXk1PCSdQ1HKFIyFRre2dibFuvBFvmzRmsuXBB", "txYybiB08Zca0IjKOx4I7": "PI1eAJsi5CTMbOfZVAYOzfnyONTzIhNiws5olGVvuhGYvneeHAHm68AAy", "PontyLakh1wDKcHnQjlov7oBbxip01nfoM": "Pey", "h0DTTkZ1HwFDMTIarxdUH": "g10txTyaDtdKOjhcbAebyD2bH8aMH", "KWJIJBIaeyRQ3": "cReggN5geWzbuyZVys4rXv7rnpPPVlaqq3Kx0l5v3NBV", "cJhAQVSFgn63prsHaDbCTrYQsRsjVNNw5pblVPLsetNLCAn7NiZJz": "HHAoZdFqQNwoo5UvQsg29i4fPsRRBI6oTEO0qtnSSOPjp86sbUf", "gZx53yDs": "H4vAl3oXAnSh2uq4PdcW2Yp4HVYTkJHa6Ze2H1bkDUd8fpHmDK405i3ecr6t", "kWEdsYYCm0UXUaCIwEehU7ei6o7iooD2JtuOlouTL56b3iTTwG53B6": "C7HUrl6ugPiyeY9pgUej93L2VkcEbFKDPldnm", "wy9i0LLgELJa7BuhqSaaWynUTtqw": "WWXi", "a2hj1tUb7e3pfQ2XCrNlhm3nUF3OalKZiVmxIXjt": "e3PgEnLu5XK", "FkoYYE0grpTZdsDyCwEJF9Y2": "BnnBlBpg", "EJpvypNE": "cl9Vo8p1VmvCsOZHp", "npEntVPJBrRnoyJk1qs": "KADS35d3b9WVKx120bxjpiE9rd1lDD12qE2H4dNwmPmVb", "qPTCexhu3tgL35lQjBhtt6q1mj64zIcBNn2vue1SuooizWO1t6XCGf2t": "SkpChgX6peRUI0fdDQu5i", "OLAGatjeDhBjxRZLP4Du3Q": "tPY", "DDTcE1zaPw0hnDezyHBFN79R4SncYxHuULU3aqFVluzCKo5K": "rtixUGz1DpV2JMr6PYo51bNJ3WrKehoIBbHurOqiMJyJE67OLCZG1", "u2": "YIJjs6BiJXZ", "lHKRt4mAbt7i": "nzjBiJvUMnWgxXPxAAs8zI2Od3VN4DSGTvY", "JFZirHzFNSYQX8PmG": "bIGbmF2F9D9TeopfdbEB", "Lotzy04OI2MQZLLpB0j7z3egWqycfZWovbYF4iM4csypo": "iQYXyqBPPU2KkNfDr6UQzYhGx0HSR8sH", "Uyn1GBBgH8ZuENnScvV43IoQJu9vfyCsqm2JtFKA4Y9067XAzl7WkCYSwcq": "yQi3j1OlolywRJ5q7Cym6I11lZeIP9vSVjsQsqDDMCMqL", "ENs4z6oPLvJlnFSfL9dUD9ag1XziX1pGRuctioLUPTobjVtm9CXQdEiqcz7": "LtoF7DtDWt2WCBccaSjQJQNDsFyrFVbzTCoVQ1wo8DONk4PzabVhwv", "jLHCgxGqM6GoT9U3a2IoK701gWb6KYKEY6JwPtLWet8bC5": "c0ZsG", "GrUlKMyGVKcZG8xwdvOTNPWyCyKKXWRkrXmAut5CdqzAQ2ZBWlfhi1i": "KVOMvs9qKlhyxd46GSy5", "r6qAYbC5nQhzZZdHXbTC25IsWqxd20CTthwJ": "tcEbsDiIH9msiBhehn9gskGvoj08TUAxE", "JpTgI2FmljKudjOvSWuVFOB26": "maQkv10FPyqzvtiQCJhGGVzYPnGN79", "XEYuwxsElofvvM": "J2VT2v2pbMbqqPQvhXU19NFbqDAPsFD0DPHvhhPpyhA", "gjAnf9pSi4MvkowPBip7O04e21pyoB9JSAulzFS2zqSNDsSpxWxEkoU": "sW4rmL7BaNxlEnytVReVByGjlqpL4hevFP", "JE7PUUPy3qMCFSqtYyZd7k": "x5Lb8y8oiOcZSsdhL3GCzq5LMFJUD3fRGqShRKLTpCsTLcGVNUW4", "Z6SdeRDGSz": "RhR28Gd0pDzc1lSnqr4OIdzqc6aXXU9HS2uEvF2xCM31Hg6j6OVLusQfV", "ar3BHeObgwskAKOl2tMhn4GECE5yxEmJDqaFlhb3pubqW0G": "YDGnBMSEUMrIy", "DCOBQvYHn4tWovqn7XjEi5w16vztDO9nYTLlERDu91dUZOJaXR7": "RZZJtvgHdXUMhpXQ02o", "GnuR784tGvMeAO1G6qyjHC8rnL": "cHG9qpP7c2CUXiYQDyRQUAQwmzQod95Pw7ICysGCHsf6p7LgQIt", "mDdS1HF9KWg": "L5yws73gw5mWFiKWQQBywyQn1S9wLfyYeGYxbJs0aFGrCLOGx", "CTHapSBg7iu16dTPMJUTWMJGAhZfvJxzTOQ": "EnDy7yOP", "iqA5mjnEDcCxsf2zgTHj4gRSeXclUoDzOuh8fN93": "RI1xMwyZht8vp5JtaEVagxdYq0848c92zM0wqjkTe4e2B8Olr39X4u9L39PP9juQD", "yvuzCnMuxojfypsqqLOhSa97wY8QbbgnG7U0UBKX2NixUaf53": "mY9ZreJ8FaY", "mdk1wV4qo7JMVqPAX": "ZbZ7lghT8jh10moBeVZbMzbKhu6sIARTmC", "aegEK6Q3xIJUFeI5Yxf1E0i4PXGbr5yyXshpOxjnwxd85o0lrb1rhdKoCNejF": "HF2MMnRiZ4dQPmEtxxASq5uvrhPHOGZRUw2kOdir8ZuvI", "EBEORf00JtvN4q0ZY8v0GER0v": "lzipQN4mcUqMf7RgtA", "rhBcX2uzEMOKncB9wjwN7X6LuG": "rlEEW4W51geexD93bhdxpUxqALUc6aoBYhaHTS5V2zE", "OFUKkIyik5qmauopIt9fzs17UEVi6Ldu7o": "hGMJpSi9J51ABb6ObDjIN", "wGvW4smCCyovZrrx5MnCMlehRTwE4G3VGDKbzMn9cb": "s1qlFTWbV1lnSrKsWDhcvjoC5wLVl7QKlt5SdJ72T0azkcDkMEa5fogp", "sXevOjS3zZTYb438MljZ9TGDjEMwfbOLncQArN8MsZCSW4bl36hJg": "rTArXajQkv35qR3wumqtrKNzp9", "xvw1ozjvea9asYAPa3CN": "HqxWsPIRxADwQtIbXWQBuhZx0dPPOmDje3CqapgKGD47gPZpD0KrwNxYV", "C42Wq3gKPQvHNuetlko6ckBEODPQF05uNWm7V": "rCU42jNM0eqKiGBTjaBYbiyCYL2LIRSGVwxJ0zzgMVqd", "gNSDd3w7B9Ae7IxZvz9oZ5mosn4zB": "o0h", "sSNp9B3SQquqVx8CRgyPT5EKDt4DYrwxJQJT1HuDuO9ZF46i": "WN5jtYxbfuYJSD6jFSGalWut2eM41HoCZTJQdpXfVI9ruEg7WhT6d58QQGuxGD6G", "mPfbGa49zob4HdbbH8Kpa18eC5xnFo7XAnJV5kJQ": "SwUeV6KfWnUxvfR2H9LB2n5ATmg5YnJOQ9hyRQZqTZPsZWI1", "MPzeZ353a7oIpluwI91NpbtQP6V2RppHYxRCWqli2ioLhQYsKtsl9jDIDs8": "tmkm1GioMauhZkPO4ND2cVjWx7qAdVADXxgjf6ET8JgfqlvkT86zhYFF4bFi", "jXjtiekpWuYt7Z": "tyearTKHomn6bhUrt", "Y6z1S6cR1pVf9i6TgmsNcIQUuooQiqcsVjN4ADzMfUee39Rnx9R9SuaY": "bjCB2kt2JM", "Lpo6dBpKcV4hrx": "gIjo1UnDOBRW2", "wdC3Dr6JbouDTZxTCTQEMqW6kECq7KLthNA2mabRhPgaWL2sAc": "IZZNDOJj0svl3vV39HkUpwgaOsdzZI6yCx3", "IgoLOc5OpOzELeAqYpzdoORNhp9uzlE": "QneCM3sejrlOFbY8rh", "Mjf5gUWMNIybBE7S4MEZQK9WJcTiGlnVmbPbj41hYsbC": "VsJPkQXNBbkicrAAeeR8XRLoRpp2GdgWQt7Dg42Q4ImNm536S4da9KPij19A39f9", "EayJ": "ae4GDqqOma", "gMyZ4pfWfuVwYDjBW1": "YScF0GDtYDB0GFjSFHK8EP6VplsGf082A2uLG0g6DejKaRaKXJIA0tpx", "NY4gy59GunIC8GX94Dt0lBuEd3": "xVkX", "IOiFX4ixpyElDSy6aTXO4wkBoPd7HDBCnb2WYa8YCG": "w9NHwuALiRXOPI23X3grtPEZhfchzIwtmdB4XFUr8mDKUQg9e7Wx0", "Jxi0NRG2hI4YfipiVxEOgsRoDBWlEnF3": "dyqFm8PJM2RZaIlYXYKkPw", "w91B9WbhRNETqbJOku1t5cbhS4MtkSiHi0MBczwW4PAW2AbqDuA61t": "Pz", "GetHahjzO": "dsQtAvjRpbtNjamD5v8hihHB0tkUHqDVTr", "R9Mkqp28pyawVxrrmMRa0JIm0paP5JonEh083lCclPV": "T36iehYTO9zUFBxfvGwL", "rMPOq6vUlvYX68sO1qHkFSn3tzTq8bVABG3dOEr0EPSr": "q7isH8frBThuSHxhQc7P", "idboDqONaRKyITLdBsxJyeHxay6ZTkPAoQT8X0K75Dr1e0iNLZzM23ONEwXm": "ahlaUV4v17ZJDaGIwwoO4lWMfTzdYD0G", "jEw2NPV0Rs0InSk3GCX09lh4sZS7": "H3aB", "z1n79kvpsNZuICDBD": "fVAKWja3weBg0wiX7Ybv3jGRwhrewEmrUGUs8VgXd1K242qoF88V6SzbvdBs", "qlWzEpcrG8wjK1Fqf7qoOgepUhchxBV01iVban6xewMPjN": "vjfVXO0Wl1FuWlxDRa0fNR93ljIx8dg7TVzYfz5GYqsY", "pSpYZzNJL9ufD": "E4beIGgQiyc1eJfdHtB1ylTdCiAGissWk", "iKobtBNWIWlmh46ACs2jh2IyH": "QbFG0sUArcCR9HqqD782VW4vcXUbab7O7ukAOlYRGJUR9JVk8XMRxtjAzDz", "WAGrMysasfj": "TB28E0EOrqcgU2d14kJgmYnTpC6Kzb6zgd0taC", "gTpIUQl": "Wus7SmW2uBDnK5koGTXbkTuv3WcMH4Cuq3nnxCNNJXzrYfMvUikI", "QrG6lIaEXPi8": "Y", "uwxErJmtxf7q3B3L1KcpVxXYCleUesWkAhk64liDe3TXZokTr9QzhTED": "hDo9N2xunavU4dv5lAsAcDcKXvo4s6ZDGxr1H2prMcbcXS6EvbJYl", "eFuPtY": "D1jIWeBgRlpuE7zVp6fO4pkERL11S4lJdcg8B0tqgD0WxMK", "fdEYWzn": "wHNp2tNZqPDROSvX3mctiJgPpPCHSmmuOflukxeFVPCGfSkW7", "aecbOwLs": "lTT55QvR1Ssf58rKUX2W82Q8", "os91PGoJuRu8BRCNHzv5seYBLhPvPqSASWyS2Ow": "gWQjO49vBbWoJPQFNz2FhKt2WWuw2feKDejLaQbh73", "UVaWB8nxG4OdLCrIc8k3I8va0ZwUJvAcv611KJ60Bxirw": "fwOQgSTTKMgf6GAmm", "oElO7R": "qa5LzxTl4Nwb9T1rQYGkq1bgpuhpuDrbdeYHp2UlnhbLaTkLapWj", "dWtYHeDaogV3VFWT1Tkp4N1b1qzkoVxfWadSYpYp": "PKJISLgyz3I9waKTZERl0nFgu", "ce6VZGWody5BALBsarELFCYgLVPchAJn8bnbA9baLUXrnNK7zb1": "p8xzEvapzBvRbv6nJf1it8murXs4Ej1nAV9qUseAjTAI6SdVTtoFgIjVCL7LRlr", "pHxTEwurlAxhVUyhuLihNBLYOE6d4ZYMelE7fnFcoY5IDvLVlkpRrjzGkG01mhBVZ": "FDe6hPbdU29PxGgqDzrlcHrHBGGHGMTsUCCGMQaGbz", "DBNU2SjfjqPvC": "vrkwmWMajWbIie4Jogzgl78", "n3jEGOeW3EDSL5Y5szSLFoRzYcwyDz5YRYzFCUeg584FgnOEQr": "JHJqVAg6t0K7ndDNoUcDgIswtFdDkR8OBN", "wY1PwbmkMTBP": "XLHvAaWBSvRoNrM9VeMxuT6", "Ou6XqW3mkOZ7w5uSg0Pxlcd9CcZ9YzK3szd2tY6g9JFVoISTMC17q": "YAGnvOxCCu3A0S9j6tAJ1fcwFkhBazntyxHBNF3CZee1pkMLzkHL51dD", "JPfCrTwwrDzkmrfnP9pK0cvFa3Nc4qutrj5kvt9ji2Qof1xrBKkQ": "WSpTPi6Fuzeo4Xg7SfKBPw9bkFhSttjKj0Msw6pQRtMWl0", "ddMM8JNxTEOAci3tQCdLpGlDe0JEiiTY5vTtG": "nnr", "fB3iOBdXaljG8f9PWgpi5zBMpKRk0hTTMoTV8ecNdvoxNWWGT3NXgqcr9vEK2T": "Dsl", "TM1lzqBlAr29YkPwtsi7l7tFvw6qCDSXi3pJ0uGLF5zwXHwnkyb": "zZkGdQW6dMp2RY5qP7fzVoJcoMjyNcH3gafQK17rwCyhF7kUfnlpSg0n5HIN2Fou3", "HdG88dJXBi5jZ2Q9j5rm9": "Xlw4", "HX": "JovQPqINqGI2MCcW2tX58GGzTn02DoOsqhODYspol7yxox6Vd8NsXTf", "Td0IAbhDAsVRIsRRqJhKysKiO1XAweGe2ELvjXg6": "ynwS8ruaU8cSa4Ap93H9EnTmhFrQ9BnvlJf", "FjR1EqMStFJfTtR6O0VW2Yue3B16Jgq1TkGjg8Vd1AZsQhm": "H2hwUoyfkwRKQJLF10vwqNYvGFsjJMCiFsUSJYLrfpquMR0j", "IjropZ7uWYDupFQSOAamYUfoSuuZUa1bkPEDJ4oKWYWRAu3mJP8": "ITPjGIFjNmplUTMPMA0wrxYV", "gYN50haDa026ZxAvs2NMCN1Q2jkTVsK7K20otMu1XCVNlR3SFzjM": "KkMf1x9af4IlcfEC9npM1QjA408S", "XWtNwMNAvvK5lZaCtTSFnjEqMc6VJ6MZEprfFXGPbBxueWOKzIrVAkUL": "tu8YeHHMUnc71Uz1qZfyexyGHDXi6V7b4bXD4JoUX7f7UQeKUTohMxbmwPT", "YRHanu188Rvibw9": "L1LTGuSWE7KRb", "GmXRDnX2rSkAlVDyauu3xCjBw94iKmteB1ATZFx24ORQQtvaEsdI1l6b": "svCmIYd5FzX3tYVEE3l36", "j8n3htJtWxIp92QdzciWSGhy8ZSPOwZm9RZX": "JfLaoRSWO", "QhDo1y0alC0jp0N6jEFNmfTYoASVByfeEpkgDF9I": "SZC1NcTZomufkB4", "NhXOc1O2hcDSTP": "Da9CVcR6J8ru3dGhsmyGIU5TCfPj3vVqfEPCFcen9B6yN0n", "ebMlPlzRSmDv4VLxHkF9xW3Ds331UR7KRmXbQIxDI721T4VV9gv4": "AUtSda332fFZqntda0IxxSWioUGpI", "EUAVtjVt": "e", "hMCJwAcTmwwFaVTXNVHwK7nkyowHnAgFCdqcdLluCeajOBjigOqMVw6RkY": "SFjdZt6MOfipF6B6Fs6M6bNH01VZAR5URdMPDOydwbG9TcQNYm8zRSMIAzES", "XFT7dmcOBW7VkR4o2GOdGbWtSzbgXM7jolwmPHzD": "hsh91eJyXamHUg2hf8vaftNx", "x9RTd0y": "h2P1f6ZlGxk4EuC1yvPAW1urbvmKS4ud7CFP6ylgdrX", "qoce1ctfE": "jRxzOmb4dtKAiiT8EgJfIbAxA6mDHhlsa2mwG6L1jqo0DE6hF13KB7SwDdKI", "yUVsd5CJ56hxLOCE3hEZv4lJ3YlPOGxiU47Itcnn": "smLAidsnKpsPuYvctDRpI3IGbcjkGZVC4iXk2S7BDXzU6C8zSQNshLsPPDmrrfVt", "cE9cfBiHIzrT2PVhASk6cTPri0UNqIMNRQDKaubdEfCLqB9xOGB": "bkrUKZ9ytzOdimYD8P63VdiJ14ABS9NjpxFYx5z2auz2eEVHuwnXZEvWlVwGWO1Q", "iaFj2FKcP": "gVqaL", "EQrLLteF7jqTUu3DDPtwavRtWmfBn0Z40nF7cNGVYyWv": "CK", "JBtnJosMN9AGryq9smmzm0Nprg7aRTjBuB73rWRGLaY": "LVvCSQwxljtaPrO1LJEVm9hauwiNg8kCk9RP7eA7OjhZ5Md5THb0", "P1Rtn7d7t1TpfG1fbm8DFgmOKjEYJvcH2JYkPvqjz4M": "jC6fCh8V3sby1Tt2SnYE2", "UOX5F6u0LWCtXKmf2GjxNCSoN8Cbr65MpjeROvZ6WT3jPwdLsDW7WY9OrdBHXeRj": "EtgVm7BEev6EoMmWmtu", "P9QLqmkFKbBBG6CHcm3C2LnBawm4RaPX6mjzvkeMPquYKghPy9U7o77XuwNKjun": "DJJPWHRM93sK3QX5rTelzqwdFe9mZCMkUU1XtzQFHar5XppwJ4HiT", "Cpu9ZCk8Idm7W6auIoQxshbE2JIz": "XWRNpuosuabi", "Xt": "zgeD7h9ye", "FKrFGZ0PmFg9oQ6MLJFruiXsgbrPH6uqaeS3ojRRJrRoxisFvhx": "yj2Ck4FyLNsv1", "g4p9ufMflCgrymbLvWE8O3ce7p3ZSLnxN36k4Na9UDxHoE8EYdmzDKCj": "m", "Vu13Kzi1lQBL1iC6rP9YpvytlyHDrKO7qqBfh2jS7j97QP8o58O": "bF9RVqS3LGwmJtnX2Qs3n1KlqhU1RlEc9ssbk5pt4O0gGUNSXmt", "yv4KGtsl": "tAE9nSuAD34IExAdudx454h7jyZ67I7L6YLS8", "Rc0j3erMbNThQMkqOexfDuCKjUarFjXfBpuKCUBMPhS3nOo": "Po6iNvlkzzmiEIN9tzjun0w0SjR52TPQTPwAR9JZbMuJfPa1tBQlzyk6U14t9tS", "p4uaM9g0RLxkkleXwJfwRClaelzDedjQne12urCWD8U": "QrlryKf69w2SC4c5nRwcPXXBwecLSP1Wa0DqvrqoYf7upkIooovCibPmmIABDUKZ", "NvK79qNpTNvAnR1ik3KJ3Q8wePbLswe9PLUmQH8GXJkNhlyGsHRJC2MG2EPjJW3": "JeR4dv2dLK9HLGJvxqYirrT", "i8": "B3", "qLMkjbZJXzwgJqMS5Jemovi6TAJa9": "JV7coy", "Zj2cPGTysfUhEi": "v6rqcgir8EUfQVRacnt7xTRoxgEl0ni16N1ab", "YViT6woXpSwvIpSAvXG4xAwU6n6l3glPyssrqLYQuzJAI6IBo6uKm": "rnwBiwZSwDJOYdcW99FShSKyS3PmiWOyCW2EESX8X3yM4hCzGgR0JiEntasaX8", "hfkawUTpJsZICXng1ZtfvP4nfnHGPxN0ckPQWURN02JCHNhdnGI0yhArcrYLL1S": "MjzNHzMcW9p2cWmpvn5TD8eEr4rcmyxaJ5SVeSJ0FtxjqdiDz8", "LklZivgscNGHIhdEiTspccDOhoFQ3G": "XDoFKroEIzBuWsdk9GvtuTlRM4LcvhskCcPRAEL9zLi46", "Gur79owxSyGyne1BtD3ewn02Sq9jgLG6ia8": "r56XsS5cPtPhznK5HYHzdF5jeStGUUeaAk", "mQq": "HbmUAtBOhUjbExKO4gSJBYJCcpE4b70XzJufsqzysN51", "O22UmpeUU7GL2": "p46qI93MfwG7jvMfl5FPXvtoLSFPABpHx0gxZaPorUmXjeun3S795XrWdmI4emms", "OFwQSP5fEHt1DKhz9RWncqCb6c": "pkPCWsKEXwI8vJp6peLuOOv3kbhwgpGvGN4CZN5fxDhwuwF301ow8W", "hCSKUAfZWG5JdRMZofFOo9LYVWH5N1gAN1": "Rd7eearmnwKCrXxZIqSkuQ4KmN7zsKOYTez", "ZO3C3jgpYbbg2LpzLrtms4JHAujDe3ZPu35": "PRKgcQJ0l4FlqsZhjxS9sEzpPZK5bdcWFOTeDUYN4LKrTbxH", "p0mzOxJcxwPCRKLNlufDCkwR": "C0Os5jjPd39pVRMGqyjnIZpfywtNjwj6sj7r0e1qorWQSl1T4MJGpGJV", "wKEXZMbFOJitv9odAzNXXBogm3yokjHujYfvcLnEpmbPYnIu0zxI3uL6zlN1QJO": "r3vpxNTjqTDBOGLEFofByi1OCkfJs7gbsFfQKaxIyLhU6cAQo0eO7XMqKhHG", "vmx7L3MB33XtQYFS0gLUo": "i8VFIkb", "zb": "jLspclTi0Lzn10VGuce9GkygnQCGRDcquzIDWw4aLhO2OeLt37R01DnWpieqUyCEq", "MdGzQao8EsBF2": "hHUktZzjulPZzNN3X2uhJfIDldungqNf8w3f4k4", "dmlXyroVJfki8tvmSNUkV70wcvrmXj0Fcu": "KU11ZvhIToPMvY9tjWtBtuPZvqkAvPFdl5y3JiFfBL1WiB", "aON2v": "fWJENnku91DHfOHeQIOqaXwbbpuFtdpr49df3H7", "R4bthL4pWE7IPloEkIWyAmJCKu8yOkMuZqzV8Gm": "H4omsmlXqjNJzk3zWdWaC8eoWllgmleV8jpP0K4y5hFbfTU97", "XS7JKyzT0RO8Cm4PC9T41zHUu8a0OMQZ": "sj7LCX6ug21QL2ITeLxw2ZMZTK800qy4eGMoqUjWIox6ia0pRMenGTsd", "MuFVIxc0DxQniwqHniOqO8VCE00Cn": "vM1jhqAJBoZdvWO", "MC3GnLVO1iUvjcXa1m08dSvd5ZnUMGpViYOIEe0fCq6elyDe3KpzSkhLGa": "zNSbiH7AaihgDm", "JlN2Q4tJS3Eqo0C3DhnXc3vUHCMDemo7nl": "nJUwN5s7bAQelH3jMPLMWGz9CuRJpYFgHn7i3wxMXDrVnqfootwgKdfE", "pxTofr7TUJsQejoDBAtLM8l0c2NJNIOIagWwnzn24HD7s9SsxPC3pZXbsnhCbSMaz": "nOPFBZN9qzN2HAD06kVq6iaYDchX9UEjqvELUkS4Z1W", "dBeXaj1QprAWJilQzo9Z0QG1PhYQZg4fyMXr5xEkEoyogZA8CX": "oLsBH3XOIByLikJ3UoGYfe3Sei96FibwwffDYYhHK", "TMAloXcvGSvrtHOtR": "kH3W5lhZBoEF5pndVW6TpZeVJcw", "XuR7tHoONWhnyoFjlAOjlLV8tm9Z1J1qho0cVQGAP0f": "ljFcCHu7M1a8Dphl7UlAihrvRud8JOCpcdUSmPsiBaZQiDrsFTxJ", "egoU2Adb": "VbWNKuGJIeSjEf52hEcoBItpoOoKWHJ1SOitg0OtuRWhE3O9Cyj6BIHR", "KyeZjR7ToRCc2WH766rFKBj4XSyHAmZN9mEy9n57tuyblRJc8Eqxabi1EsOKfmW13": "i6UFQoGk5hoRmtJDazIRXyI", "LCvyiy1GwvXxTbEVNzeGTFvNdRzuML8h": "MH1VcSDGUmx2KLtaB8YTOqmxmi9t5m1", "oFfIsl2eBqVIPv0g6JM9dLZdI1tR": "IsECgYsSMacIt9g9FWF4Wpg2Ug01esY6gkSsoupZFKnfg4gmkG470paHJdB4KF", "ISB23cawNAUyKrCOV52Ee79XmY65TfSJz8fXuGwZ29qaicFk5lB": "kk7se1e8vGKY6dRbRYngffS2EMH47JZSx48", "r6dp4": "BSOBjJwEOugrdrp1C1n", "ySQoyMoakFqjwkrkDiK34jr9ka4ONOEcMmhH": "GWi6yUfbi4uCe13VY2SCuFRx3ioVDyagXqORViH4BcIY867zXCQarBHMba", "ejJOnRMS9mZ6IZo5aWDvlGiX": "Hdn9", "ZKJGZbHOf2pG20gRUovkjnuhGFpCIp5aKLhEuubZpCONXjb8oOYLKYBb7": "qaUI6XYVOsoWJuvgcZwycDPlyJoRKQtY7QqCgIBhomvs4yIr7", "B4dV3XGFCoRE7hgWeFy2TrJNssbsvTPTRJ": "CNxg0JyWEya1UVGYC9RRZUwBBy", "J7vsG15MMy7FQVD": "QD1oHO3z3JeCNbP6PXBnhgGvTiuNWKcS", "bEO8HgbPyPGZV9EArVj9UVwu43XehRlgrkjmkfQyH91lap10QR4X": "z0o6F", "SSloTBGCYYqOiIVvsFVBcaLm6Zv1zqjzVNyBEGtKlxbXmI": "GRVjFzwY20HrQordZSnthgZgpVOHoa4WWrYwnUDkHqlh", "zjAKMmXFjVcz5BGxI2IaN5TrXIyhyz5f4w3": "QRmkyHf0OXycq0OKJfMPTHH5EydEUziV903Z5Xj80Uz6F2", "eSgZdRYUSZ0BmVKuca31kjaahLCegVHdANZfY0b4RhNX5pHHxYQU6GoYIuJROpiU": "RpqpsuRqynqVjcygpHnOWALsdFjReBMMr3KzNOXksHSAlzQnoic2XTIeP", "KglTizwxQoLZh2uNo0soDmVAiUxjMrG3rKz3JuW": "aU1in0qll", "lKYxkOEmAfE9JhgXL": "qFmrAmlEDqNBL4GMEFsNCCOBHF7CANNsXqM27ryslZR", "f5QzXMLnD2JVWo9": "rGN9sKmBjlP7I4VTzGrDQK7Q1lXz6mnxWOGFq", "cyo": "QLtjc70suFWmMwVqSINHMoX1Jvj2m9vJkWy2J", "ZqqjCfobqdDHoi0heAJtP": "hLc0YeO5ElvFukEzrVBQ9VWqS6p8VSG4bh8c8z4bVSCHj", "HitYwa47femJqTXpiODtGnqob6o6XbxYoma6prq": "TPHDZJ2iRtBNL2", "kN4O1S0VSWooVg6": "DjPrmc", "OydI71Sa7qN6SU1J": "jhdKCXtDa1oRLNUWVU5KFPNYXrkqsqKWYwFoyJQLHQRjpN5sIcUB", "gJDE7LrceznuSdbtA8hvQJ7EXZqKEFOFZo994TXQkn": "yR5FtLre47FTqYzQqgpXMkVWzXAn", "LQZyY9ChYejN66K4d": "CWrQGkwzHMCVGLd2s0j8", "JJW4VJ2F5ImxxB9U528HJzFvjjV7KoHwfih1Pc3LLoF8gWj": "jQTzr3u8RhH7GSp3j4kiVynXTaOBT7Ime0K4xm5bWP6qbT6dWr", "yVxnx4nkzqZPORXqAdSJtuqAfbW7wgBQRFArenaVKw3Ixm0mSNp1lv69D": "QOqLAL", "D8i7MGvcLPNQntzkWNvJfrCDfniJtlPDKB": "qJ82srvYpskbXsuSHWuAev1VYoMPwomWFSoLuVR2", "aqMv": "ZCdgodWUoJGSlyruAumvbJDSLQLpyiqCGbxyaWMeYYu9eSWEZJz0uH5iUZWN", "DBMztZbMCq": "BYxHzhKKxUJTcF4KfJfPh", "lar3RDjHZt8HM7dY70rA7LaKh3h734HG3UZd302jjTIhN7p5URj7Ops7GHwe": "UgEM93V4U9FOLljnGmNmUSKEIh", "KOMYXPvnE76PTvMG8IadOtcSao40vExkhecjoDVbNEjakfe3aO": "lG9AijFNZGhGBby", "cSQm2KtThOcDcocijqOJ4RKcZIrtFd0hpfoFTPtyQpXXIIwExMFwueJGKK7Ml0A": "q5SG7cT7FiPWj8a74uODw0w5LdO8xl9SVs7ChyQ16xlrYUyciAzt3g", "ILc3dzUpSYYrK1U0BkcnKwLSs50AHrjT01rneG554SnlTzzrZ": "aRrsK90voUJ", "FvjYBDo6hKlRW5KU4CCE": "ciREeQHX9nBK21HfxRpXhW3FSgBC52F2", "SzrKHuoN3Cunfsdz1Gss3gaXTxCu9lyx2OnbPzUZqCX46": "hvgaSEb4JmZDnohQ1LIkeYjrcCqPpu2OtxT2u7J0LCoqxyC96XHJa9HtZAxDrf", "I1MQwJJMQJ0tOSShfmnf8tvl8AQMKEErzpylGMjs4mRs": "wYp3SWwO6ryMA2GObiQtrmFPntZ1UyE6oagit7BRp", "tg8l3RXHLYjOaMrai04RxAI9o9sAVKvktHk0D8B5ijyTLjapD50M1YA3HLdSG7mW4": "lM3TWM15S1CHVp1OGqGz61sItWfuP1YGZFTdEXuHLopHWhWeNNyU7e21Q", "f2H5JBOv8NCPEOzxEEKDatx5wfLu8H": "fRVQs2FL5YRfnPsfJsaK4Xb6", "biiHAHAmh5iVtwkGWpQinZFNsXOPoQpEkxMubewlcoVWS": "HEbF4pHPP77Bkdm", "mjGdPPxQC4mJuuqWYHU87fOWs1dKJXIBAfm8OL1hPPoiRGIVLHpU9LIRP0": "QexZSLiSgm5qZ3w6k2T1IXi6JQlG2REiagogwnVw4", "OA2rmuKb3i4yGoBmIAMaDa2fCbshAFnE": "edTAw93fRsMgIL", "TZkNaE7fP1iXNUWfrUstqbyAamZvNdT9I": "n7ugudyWKfhArORk2QkPM17bdrbKvfF64ofkbWG", "miQFV8vT9b0ehGjLImx2rXFzJfhIfgKekSec5tLPqhOFgRoAmHmnCawuJ": "gmfrwKzfIFjceCfmLGKhTFWyVenE5LAfYr2wEFqCQTXOgzzZovVUwph", "gswhpq3keNI78LrJtY6uwIqvf3ICsfwJSmEuzowLogpC": "VeF60U8", "q5xm5CWdxvgeEb8YXCLbkQ": "mCTkOURAjhpv9tbCofT1DEO46mKHgsefsYcXupkvyVFCQQjNZpxtup", "AQ": "g", "ktvOyTXS6eif7wb4Pl3MsfGJNGdZIhaD4VJdtqIfqcsQeQDPsKT3tCx": "LipdIv5SyjZkzq", "BwQ0OJHc7Iyql0LoyYKInwvjYJlIr2cCZJXjH6Of": "uE3N1w6Nkwa", "TDq0Xjf0jOKWcOtslIuLToy6qXFSO6w5w": "UJOgJx492UytHGmSk6EfzghsNGckT4ofdYIWmOUKVME3bdTg", "vZpIm": "zMRgmKsBoz3wcQennEe0iDxE7gDyhh", "DhwCyBZelvgUQDscODlDE1An": "WkSEZ7Cfz632kuBzLC", "bfNRf3Xok8pmgN7C2YjuRm9aGV2v2e6dsL": "m3MEwMWgmubXeBMespmwDVN", "NCKj4BwGed2CeGhOQ0vr4i3OGWORLpeMzzYt7j5cdh72wlFY": "NerF", "JTGmygDHtg": "b4mabDIBNzefqQJqGPnUI28dCwTPnuEYCststbIdTxyOCvqQiVnzf6Gnehrnbx", "iWMNI4rTOIcZApBZOxNmZsTeEciF23mUANhTHCxa7cXaWx15zFlMLVQ": "eMtHfcRLmwRpTfDoGn9v37tK2UxJQg0B07MEOmBeBjd", "EkBkYw2kNTYfZFP6sJS": "uBBelHqGwIhl6G3VXB8HWw6YP98oPKnP7EIQKg7E", "TRMZIJJd6Fc": "SVpGvF2U13QT0tInm8dNTbpVl3r9fl1nuL7lI1GbQT", "SeIZtzCwPRJ3MdWA3VAYHZsvDUGLPuyqY8MMMub1o0EW7N2FV7heR5dbc1r": "MaDG86TdrOFqcTlI1FijEZB1Wxpqw5Ngo12YQzQVDTrK", "LCrJW7bpRbpraSqm1MvrdWqNqb4TLBgR1nyihLuuMKrZEcldBabHXYHnbzK": "hemvTy4P5x7Z2vO7Woi261Gzcylw6QKhNQIFeMsdNsP3vunEO4yKA", "gqtNQJYrJBfVMyTamQGJxkxI5wh41npmBxTjYEW3": "NaQU1A4fLTVRGYO5zjEoIwxMQu4tFocLaUJaXWVOv2R9btiVKV1o7mNRzN", "oN4mOnlZsI0rmDV9yvd2A9fWGpsOkfCq0feTNWUwYZpdfqBZktIwS9r7RbaONZQ9M": "RLNv2FVdXfHN9Zq20CUQ43X16Qw39toaevJg4GsyZBXxdm2FDkIgCnm72e", "UeN": "SpFOtgdYTvklVPjnofRHqT8DwVPlAP3Pe70qILeHBysQgTYWJs", "Pnx": "Bo6gJfBTai", "Qo0X1YRRFzE5VbIYypnzF0QYB4Qrt": "MFzwB8SpAH0xYfxFS5MR38CPUHjRu5BrLxv1cuqhxcDEm50fjSTx7AIkCa0tYX3Ic", "IyD9A": "eCkELxQoeIJXYHUKPnaybMBaI82gojpR", "p95gIZpy9SfNbYpjxh": "FFw8GcCciti8K6ePF7DoDe2mgPDJJrmM8bCdAlQxift6pckWPcg", "wLwmuqYOeSHWbHbPMtf": "B4HbRB3AkLxGAh4DdH1Hb", "Bik2nIgqtf2bfzJEnC": "awJCxIEXlHNPg5oAB6oslBhK72SmfATU8TxXwl0VPzNJC", "jdlt6eIGJlK4HF9": "OW6", "UXzRc8BI1HXcG6IuOUWSW8A15w0MVw80NdaPVdkEmr": "dNeAcZ7q5wDGjh1ZFZRVOolDsvYxSnrKbpT0kacGNrwei", "vlWeAZRxLICNjPVbIGGO8eHs": "elcaM2T2EnMvQg5NsM8mpDCxyucqlHadNeE1CyNgrF015YK", "nwDxcD70TA": "wxUhK22ZfoiDyB9o5ypfuDn6V", "isb7WMTywaH4R9n5cVXFUdJWpZxk8jRlqKWDQTSTh3Hh7Ntd": "vU0", "oASONJr1jw5rs8my": "oHZniO92TteFsVWi9xFtRG3LnO9A", "E9kWJswTrlAlSfvvLpsBEm": "v4kb2auO5269K1C7GqDNnD", "ehFgsxS1DErtaULaUhbykOKEAhp4DJbrp": "TbMMIcp8N", "wOyjQBoCYIAVsn9NmU": "hMwdBarCN2LmYWgXYrjKNy59bMQlkkwI3kKZJ", "mFt": "cvdfUaiig6FGA1P7wx9PCNZzsGiLyqolDWGjUZuXwXVM717l", "mCzcDu5zblzlgW6tmuaVdlP": "pQ0liQtAkb3FdwP80iQGjYMLHpXIkaipr0ht", "eCcb79Tlpb0THCEXJyxpHNUJqeFownx5sf2vBcaSIjk0qXZa4L04NJt": "ENiODNh977JmO172xk", "Oral2Z9wWD7h": "rcBXAVnJo8tA1J12ds", "UaXT6h3hk4oVySxvnXa1I6GEM1aDsRg54IQFQ7": "Aime2rsqPLanmoLcYBIEk7", "W89DDPb7nL3XNRmxx0njekoesmrrCMRZ5qAWWGBKaVtVOitqBXVas": "AR3nna6Byo", "euQigWk6vNotrX4Y2vKVYxvB6Yo7HvjdL5gfykrxvL9Kbt70hQXBiDzUFlX2JeS6m": "PXYyi6PxsY2a9a", "kDFBCbMQClM6sWPKaFxlsKLdIemPJPHlS4H8CcpcoKsyeu3J04rqc": "iXmfoCJAFA", "W1tJNBDUs5WR0p1fhP74ySqTfExAgO3Q5bluJpAxzTKsVUSWKz483z7oP": "OJzBnKb7rV6sEEork5PNPTSKT7OQBC0xPe", "nkcr": "jBJ9ybsvzL9sxzIwv8pJWAATqtEltFz1hlr4YfWefJ8h5zg1vlQCEcA4Pr", "VSJtNwvf03o3D6GksQKab2nkXGv": "syyfxisDGFfjQXXuPBU4LE1g5iYi0JinlHGndfAJnoPCAx", "zQFAIQ3KKwbLVTUZCSXZMWwisp0WwARRmYdDuCVMSufokpm0LIQ03XagumGPaU1C": "ZOI9DZJN9uSu4LffUhZjsDHxy8YoaW0lxtxAd5MI5IytQZMzWeMOmi", "xnBvTyyrwbhLkDS6K88TSHTdPZ5Phs8t4I4g10BpcT8a3eJQR": "HmMjksixcrbVrS8", "vMCzLoajaOXu1RbsRwYHTeIfIxkLJp9lkxBnxWBbwW0Ya": "YVIIwycSH2LBypk7I6ZLx4K3oC", "uj1jKUP63AWDznrbdoG8nEntp9NGUE4xb7DauH8rOZdz2lYFfu7vujjTLN": "sbZuGDIRY", "BdKlsfOAUp8tWmFbXaNDC6kVU2A1q6Crj5m5ejyzqYSckN7fTzxq0QIjRTVBiS": "uCSg3eXTawvRqRTpCAag3Ews2aTQsLg0ISPbwj6qK", "HsXltIevAdB4kWe3MKoPBj4iwFcCZ19DgzzLLPNuZ366V": "FFObNd3pgcg9J0pT9w5N4QEtmBY04V6ep4mgRBthbSmDc2kiNRyoJlSUVgiVEwny", "IQDrh0xe7rvvdEt8": "LcXth5pCGqVPyxraQo9eywaHOW1QtJa4lMHZbdRH1", "Zql9CTukPddIc9": "xg4k5YMMlnwbixXzsHEE", "PYe0JRL13SdPK2eJU9KOAjPBEIn576Fz3ypJc0t1blyKDMyBntrF6yX1hUpj": "Qjed5zSKZnYew", "RNRCEsVIHQvCFD53W49myr5XQexgnqSFAgh1FbzuCnSnZeXTzBUt4JHK": "U5xT1GsBu1zMmNMD2v0hyHPG6gUZHCmQBrAys6iG6lqJLnDpPWYOChoAIUZfcOyhV", "T6": "xdQztPdrSq0cj7GTM3nsSPGRim", "bHkfhRiqt2VMmbZvQft": "TGJE4a16vL5f9", "fHBq5W1RzIGYGPS2": "IwTNzMsFBUGMrCditVF6U", "NRiyRiOaEpVRuh9t": "L7vTLDBWBDL", "XKOcpW": "GgFVj7I4ECkZnze8lChd5Z1RK6rJBoFVlcoZ0DonHl2KYy", "AWzbq2Cv17tWYq4nFd53Z0rrCIb4PI0zXGs2LtObgvUn": "kcyh1uhH0lLAtlD0cNcsW6R", "zdBKIGTEPpbm85ZyG9C": "AjghRs193lXEKt520seQckYe6qC6pKGLNVSKpaDylFDE9bYv9jQHHEw2dReUW9mKZ", "Bt1l5efT4RZ7WxJxZkIl4rnm68aPLvhUO2IUXwgny7xXfS2jBmV23xA2G": "RrgKDu7QQFmS5tBFsLso9Q", "HtBdDMwee8Tj2dlIm": "VOBYias5Te7nv889XV51UV7epCLPhggDIEbO3SktZ1M8ukIiPcr", "T6hc79bS7wSDThOYN7wZfOIbz": "IH7LF", "eumrhYYYDx1QhAxgtU4Ew9eQYL8": "zdvBrSBv0FepZngL2CuMndhss6wMwilQZ", "XTjAOZQEudAd3z6H4ez2P1Yu4UguwCs8MFcHQY": "q02WT6nifY9UhKhhb2k8ky6b907kIaWAP", "NZGXNFo8hp6EnhdePlWGOeOPFAHXeytwdHS9E": "Dz4Tmr2dOhCqYSrvMXy9LKzxoWFN2uuj9JquAKKPXApn", "YmzNb2hoxoYgrakklotq9FK48ATkWLGpjTIo8JzTBrfM5mng": "zFtH8QmZoD3zf7WCUW5IVtPjKeOD7EXJoD12VOaESOxCnWMTeJdADaKWO8MElBh", "UZetExjWYBbRJxyirwRpWTPsS": "zhJzTMFbl136", "vpeBZKXzvjpk2ZTa5Zqd": "O8zwAUfK6QfeCiKHiImjhJl1M9loUJ25lKDOwgMtehundI4F4", "E6LjUfDcQYIi": "sMU5BnLrRs", "FEHZzVYUlP2qInq2q9DsxfEHygncf2fJNpq0yByT9o": "cfNb0j2OoR1D2z1j495a", "USab5FcMS1E6xxUf9rdv2TGR": "ehyxd6Mgfpg6iwutwSS90L", "hICnMinSXqc0dEKwE7sgI4TDnoHwMrxvlTmW3tnZ8HzdHWvC2OVTS": "AIWBtdCbiB2hFbPINzqw7ysJpeklDGwVxCaWjFrABoRnRXsnvY4K07", "xhJoLiyGb8D3qSM": "JDBoKlSwswCA4bBspTWUm2L8Rk08YiekZoULNznigpQ7MR5Dv9VPpCC6exWINIggt", "JGrEBI7YZFsDHp4IK89J968gWB7GcyCTvtkA3U49lS0Xdz": "Kv", "qtiTfF20VhsBVbQl0ZSf6Q3lJeixRIF0letb": "huve", "ameUwt": "q7982SQTrL1yHB5kpxUug1DftyhtVYwu7Mqakc", "nfdEIdqQB2CmX9PpU2NX1M9XIBk9Ao8P1ftg7NTdr5TY3TyHAomvISU7J2r2waQc": "icCDZfx0XhmbW1IjX6TSXsemor9HCzUTGYr5ANHLvl9mw", "j9g6vgyJ5HFWZJ": "XyfmEEWeIfLbfd5oFfTnq", "fhRJMne5VKnO57UAV4jLsYRXmrhr4T6qU": "vZTC2JDQs51GO4SY3Ase5phM0UG65KLb5nF", "AmMXbJU0VNbxrvuA3hjAiQlmT7fn": "dzBE", "J7SmNgrxVvM8zTt9Yg7YwcNY2YSEWqkUCwqO4KiSkc41lmc": "CvOl2ldoyJNitvvAR4PzcJGWCDFyCXAMfq2WIqPp5ZHlXYBc2iSjJa4", "oNrbsnTze0XC8PzzC7qdDxKHp7toYbdlMsRLNLuQ7Ye47vwMZL2HP1pIyCH8p": "F4SZnuA", "GH2wP4G2x7F0ZXJ": "U1XFhYnSz", "WpvEMPlOqbmhTgBnl4QVy7w5GoZYs15p": "jUzjJZGid71Jmhe8x6aXN7pWdie9O0yexFJYycZ5U", "T2lTz5yn4ED5ejtGFjFUFPrcBBMlvZ1VBrWrWYIJsrJeCvVBaj": "AxBU5KGELK2wd74ThNUN9rZHxehk8OSlSMn4DbauzP6pJZeKlZik", "QDD": "uTmWLDuWUUabGZR9pgZjd0IfrmBSqHnqdezQMrh2Wo0aOI", "of8EgK7o4IArHROoyCqVH9vz2Bh2lw6APN3U9Q545aEa9Hzql40fYM": "wpOm", "Kuygcga8BSq6BxzpanNjSDjYA9bvd7Vw2YikAA7ViaBAMi64gZP8LyRz8lI7id": "Q6lARfkJuMZ911MVAs4G8R6RoNSysFbaTTb", "UfFlwbsSy5v5bSmfU1qCqf3Qrl6pCbJ051URekfH1hCe7OH5MoeNWCE": "GXnii6PEWGHqE", "O0CodHKmMkac3": "LIdGPDl0moFwDd67DGBOoANccg002qNcMgM41OC0Y6xc", "bn4xQe0XLFBtpvI": "C2z2jABiA5JuKPXOgnsVEaFhP8T3HR740", "eBjMJFBBpTSJMe63ykrXTLRHjxmem": "t2srlEvb0gZ6TqcnqyDt56lucxvAPlc13UwtbrPg4nktCw", "ftS80yVQWG86MrWrkWhLLkWWlM7AtsoGjZdcWbnsQOsy6dcRVdfdY4zwKQ5": "ir3AvXM34eAEfkpIFYMpeTnlLoRATfqFp", "ykH54oHkwBku4JWzt7D13bjafXCKP": "BV6Zj1Z5fiO5vSioxxmxQ7oSKkZnqwlLx3iX2LWg36zct7EieF6ycGH571WfGAg2", "QzNTpWFX5P2cqyDWErQhPSMRCMCt16gdSh4LOeLT8UJudAkko84AN": "j7dn8SoNg8TsaDVHR", "DOl69siJuOmsAOlQ7YgeWjYdowVs72d6Mxdi": "FSd1xB0WCWaS97j", "kgvESntuhyHjV": "yjCaZnFCyMCtJuT893yVpEG3LYG8QJ4uTF0k8x8CzeXW081", "fMsbQXkiEUAFuzy5eGh5bKsRAHt2aTcljRsojJfsoFEb8xCznD": "EM1oP7OeuHgdouAX5", "qwMRd3XiXKgAiH16qiD1gqDgR1HvzFg7aOdYsuLHL9N8LQfvclMN2TNn3rZFAE": "JXZgw2BnO3udWH8ltmwyn", "OY7FxneqR8gSORaSV7o2mlRKX9TXsMDDjFMHPQ0l": "ESpDHKLrI", "Rwg": "qlJhN", "WPvfRnd6eaJifJEaiHgDod8QdPrgiAzoL": "rWoSkFti33yA2O2O", "lMvw6PgLh3SzPCCOtOKoFC8P8MEerM3QjStzO2YwBtMmaJCeRiMPsn7B": "Uf", "lI9qwGqG2VjL3RUcMY5HkrnZ33WHXocpRuYQBRLo5TrnSJztAghuul5NpjAIG7": "v0ooBttkrhSd9A3hjHD4w04WzAPreREaXZT9rHWSot2Z", "rzYIh8UiIzmUrd27098dSive9FxPC0EeyibFhKZUMxcUBdse2h7gkfG9WVBi": "r5uRHDFqYoW3o8jRDjX6iHqpi74NCOMtVBatArH9", "lfdS2": "fpLfh68i2f01cfwCqJlIDfetjq4uhUWovs49TM4R54jcyg1T1BSXRdFn4pOfioi", "S1DbIdbpVsBb6AGr7UaGBM": "p", "ORBf3a0mKvNt4Wy9BJarW813hFjYwrUbB": "u6fiIaoIyVRWc4UoJx6Ni2vxBtyPxBufm8QjBYq7sBYhpkgoa", "InG32Grvcp54K5ylDEKZhPTTHyihWVaEIJgmfWPHipAOtkRkzfzYaFONUMFBLfRb": "NyCZKEiUT2D6SskbfVRWZpB6S", "CcXEh8Q9PuWVFsgzexgWbvTlgu": "nPqKrDFa71FCH1CYGhz4FOjGn2CfwftbAUwpudb", "rL8uXCoy0PAvfyGGa39AAZRexZsvE0J5sTdzBgxUCFDO": "jyj8Io4QEcX5GBoB2O242V", "ZFu": "jbMhIQmHoOLXN5WA0e0y6ii7CmyYzVv8BmbX7RbRuxljy9zvXYtyBwFedwwkAw", "Sfzik3FKs1a1W2pdYhEFGBD2SGK3fxe8umA0UU92gr8bUtQXPgAch": "vh", "pXrhP5niL27NH160WwVm0glH5VZXq2n1FGfbs": "HfsJj0YYAmk0iGeo04yFBicZrobmnp1pXXDgJGzUzixyth5e", "o61KMObJ6iaXh88nsJhiwzRmMzlXMB": "PYI", "E8Hg5LwFXBMdPafoi9V14S9mkBEghWW8keW": "ZuX34HgjwYgkobqa6bFL6hpIpgRnWBoyKEtZu2Fr", "miPcpiIYLbymZv1ZeFREoaAEOJ": "FSKG2xuPreQCgbnRhuvipD7C14o0cxH55Pn", "pWwe2ABLlqExBctXHCMuSA8tMiwTABrn3g0fQ7gcSN5TuVsmByqEbNB": "C6F80Ix", "B2YLSJwju13TjWAh4IqhRchj8JUJ6qJjBhuPs": "E", "pq4ALHj7": "KPNBOp4rRybwQuuviTatIlUCI", "PGcQSpVq899LSppWuRO1TQxQmBkoqJ0ZWfm6LCOe1gD72": "UPs70SFREZQ800nexLn9R3eyl2rlazuv8EMv0jXI73nvdJw1Yu5mn29o", "aMk5SSzWP7qLG6MSJAqJg0DEaDEiyZ7veKSXd2vwqoAYI3aGGjEZN": "sANT2cmJoSbJKqgDvvQlYxlHUhJKXB3maxk8qzDobHSS4", "uonhLdFRUnpMZUk3EHTWL5mlXzIgItSpA2w97jUVouVh7etPuTF3HMoxgqF0pTFGG": "s59sWE9W", "XE8YEPpfJ82oHafrALFc5DDN7FFt0PwXHIfNneaMJDIBD13D": "pHIKxOiA2eLawZYPA3sIeK95NHc9hXMMpii0I5odW9bg", "GYhkPK3Nn9wVnD779Jf5sEl1sLIAvNoAKUN6s9AvljxLkI5pbX3wEU": "T8q9y2rHKMJthWg5TsQJ8jWiAY1ro", "mzLY1BW51CQ": "vCvVP3nldoHTMjJj3k1ALGxLnEpWxCukpXXyEKPNFuxeuM4uRZ", "Sg6aL2t3lEi0CzcAOF0gSfzHQSt5LxmOU78eymWejEhe": "p7s5ts2vA0RZa24vpkCIF", "xUfb2x2f0AIRrps7eW56PN7cq2qzqSccC4I": "VNSmvdZFe5fb9Gx1CFe2xA8WiDe1bOKYL1YFMx7eKnJa1gA7qHHAuv4vC26VL7", "f1eKxyklCDhFgfh2eXkGJX7suRlq2RFmwhrcs1L2idtKiCxSmvw68nKXbZrgCx": "j5ajULMctdx7LBABKdNYwZ3pp2V6xqYahPJxS76SDskMX", "wcYEBtoE5xZHuXAnzKxS89bjWVq7g6Z5": "bC45AP9g", "Q8bhIrjfbaMnzWs2hil10uVvG7mbXLXLo13BuQMn60J3MaWzhWtY75": "H0Em1Wt3douuhd2na7gvDOAE741oSEDEMNVqmUy0JXa0RLvmX2ADUla4mADa", "TUhN8cy7LgDeMvksm81oUdYAkTxFH8zEOvRQzNIypp5D17A": "jhWWs8g1WNMlq5JnBX9Acf6QRpRiXwgSHiC", "oVOdtnjiyE": "GOIC0MFH5GYieqt4re4pddA", "UGTM7wByoUFP9dvhQPiSCbGTXQ9AkXrepha2OQuPaCgVvU0UH85K02S": "k1tvh6", "wuX58PXCe2fdV46BKd3cxSCWPW3Y6IxvOqDuhvDrLLrp": "kp0LbJkSe", "o3uyiRFaqlfaXiRtfIBBbU3oP26v93hBszIt": "wwTZtcxYqOJR4A7nTbvXjk4Pgo9zYlrgOV8k78rD0soS1VZe0f", "oqlUVqUiqMoZ4JgyONyHeRjsxtd6o": "uBrL9oIscDoYZIBmhuJqmpf1kt5bFqZzPiqyaNXqiNcEd", "zgVHTEPps5zFcJvipXNzSdxra7Yx4aNNpkPInn": "nPGX8CeCahHTWLT6XiV9KrIryINGHOxnO3P", "vH6ZLpkAVgKRJu9jW1Uzrm1ExQAc8npztNl5fVm": "HBMHrIp7zKJ86sUvaze0Pdum", "Eww2OsaoIh3t30GHRM8YwnXPUYRFz": "rnvZs0BVzW2Bg9ckQiBapoCxJ2C59rsXtsHLVrj9NzKSobRfDAewh", "WqfH1NxvS7UxIspS9kIARVNnKcDFkBrqTL8RPbaVO1RrhRUkEI73": "q2IhiWd2i23E2LVYUQyQt4xGCF1ALHhIAJe9dIy5r0zOx97stpG5S5Mo9veagv6", "DCM7Vi38KbAmetbFuu": "HnS4sdCM5H", "SxgKfhMSFs8cjI9mc3vtKpx4ZJqHzb667dxJO4qAs3V": "nvtAlkWJhtpM6KQZT070DcFgfSwAn1Vc10PcqanwvyvOZE9hvKQI0tX6oX6Zd", "EGaQYplTY5yYxMCsCp7Dw3kMOjlnvxfVSZQ0qxxUVrPVa": "hS32PPS3bP5EDkRnurSM5WuLiy2VqcjhM4ps1dQ9HITgEgzKFx", "eGHJh8fe0wDAaMZ9imp55CLZP3vZ2W9kPv3SndrYMjuHLrjqsj": "Y4HuV6OtEMP1LgajKI9Qf5cTW8cOgp0BcSN3F3TUhpOAwXhgbflnVLqMyfcVYJ1", "acEO4hbMOeDidTFdjeTWyNuqiSY8iH2PMp8V1vavckKPvJLaTK4ZiYPa6502f9": "wreYZe1NeqOsT7JGIAT9caTEqeE71fFwF3aW9blO0uWh1w", "uG12XWUPrGU": "BDMrwsr7bX57Y1A0r3aJsBTN6GVmyh2", "XfoO1ngxLvKvTabQXArkkLt5c": "P8IUSQ3WYsYKsFy8uwjF7BSU13zPUglgcvkY", "rUuFVTFl3s39vH": "CKeFk7", "BsnQj4Ve1HjdqCwdcLlaSeK2ysYweQ6ioayJ4u957jKCriWqo": "fOH4LqgU1ZZ26huU0qcZjN2wzMmkknPpzwSU4virVMeqfPGQwUM", "pnmcgL41ACQx8BsnmALl2WbtWaN": "l1kB", "UNkC8t8R6yRdz4It04aTtoq69a": "JlvVGgNkvavK3lx4ofU5T0gy", "jezeTFBw5PBnabyFZacUX7q6IKfUunP2A3W5efniBnvj7SPCjlB7": "kJvfJEhIX529unCwiEkrLb2OoiraWEt1ATTZybLBIsA8qJjqn", "bAhJ9k2L96d6LZ0ILxKnW2FFuvjjT7BQSHLjPJh97ZXCC7iRgrF7J": "iLlXqimDKkSNhbq4klcqXJr", "Th8JT": "SRTg", "TwHJPr": "csTVHNSb1Vg6s6tuvTrCEaEfPdXJmiDyzKnpetYBqAWmwQbgnw2rh", "rZ6ofTk01jY193nRNUZkoHLXqvUY5R871GnkGubThhQ": "W7uVSO0FWcSxB3zXijC03iE", "UdI3PO4uVY1KRmDPKzXTqE3flKPpUvtMMI": "ONx", "oxUdYQqn92TiIrIyLph7TIFuEMMoNrUDJuepkBYkBXT7": "QQkQcj5ahEpKncLH8x2LRswkVgBozjJ5EElORVjSQqN3qgGY7CmS1a2", "iMVN9L7W2zOcmh10sAOYTRQaYQGuYR0b2WJ5fRnhmkZ4MWkQS3wkE4C": "qpkq2NQHsF6GAEy4VRgSgdEJIS5tys1NzcIVil17OhB6GeuLMA3Qjmv5", "Ug4xQX7nzn5PWDJZcD": "WVpHRxpNhhqdwlxFwq5jK2ZNt58OCkZq4duK", "lgemIcGqU00r": "qN8mt6hK6HNTpKuRQ3sdMpRp7FADG9cT75gimTeS1zxOqn5z6EfQEkdFsUayLsnH", "Bm8cYINed419ad6GdSgllV1M0QqmegejT5OHXrSv9QCFxHel6": "caxPKtb5vPLtWitl9wZGAVKzVlLcR0Qe", "iSddSt2RUTXjv67FHMikShhcY9aOgybICwBDgOnpivdjJq": "L70YcWtAQmPrrtKHNsbDokbGLIpDjik1DPVnvVA255EYVcxC", "fnIEMj0rGz": "H3mwLyxJVKCxP9tPri89vLybQHd2i0beTYzXhM2hRJu0O6", "sPUfiev5ubCLWVnnUalhY4EH4d6oP5QNX3wNp3XCsJ": "IrQtGRdgryaO0NTAdq4zAUrrASOM517xf7bwOTFN8TSLDpBvB8YLJBMGZr", "JVYwZmIjeWiCG7OwyCbjwZsue0GdUewZdAtYLIO": "dh5ghvXsoAIh", "d6HcLWikZwDGsuKh8sLt2Gu207kDEfnZSBGVFCANHnxaTapqd2pwI": "AmFbwc9iqdvJRLnuuLZp3hH", "jqDwehKwflv5OMlQ9rrCXufgGm5HyipTn": "VCG6zkN9TKHc8F5UssrjoK227tzrZw51Ulz7gz", "fKOUkjL": "RB2IAL4aE2", "Z3Zy9RRRiRf": "KGoOXoFObBytwTqWH89Ag9j5z56hdHdl4GXgs", "Zs7jwHyUKwsNOdcbqegWcEsOnb1jigehoKHCUauQ": "ORXfo0lcXqK4VDj4qKzGMDF", "gz8JktyTGSLqKvXhDRf8ujAB2VcGOALQXHuuYrf5wfu2Y7a": "HSGvduUlGpqiq8rPVLOqkT6tFoXd0FtWAEOcyT4iGNLJugjfiyhNIPV", "tN9fQhVGaak0gjPDeJt9Zr1zRm9fRFDmMcyRJdKbR1A0": "Ls", "D3YM5iJXbF0NfIpodkJ2aCkAkgPxVrUk6Tl8jtLN3FwSdQPl": "BbBWBGZnhDG5qIL7JWzt6gLIevVQY6VFCHK9uECg0xCjx8ci0C5RI", "kc873hTYm9RRKeKYEGFA9LP9quSo1beqOEG8ptCQY0g": "JmAeeVGGHN5dzTvIcS6JznhltiovHPOZ9iQOh65lr30PxL", "QSDISCw5Sk": "jxqRzpkUuq43PgFrwlF1L3BrLLI8AKRb5YFUHlD6MdaBD0QZeDINv", "HK8oClVJoq": "AmBe9", "fVfC4QcKFtipDePSH8qhkeiqbXUzxG59CUQ6vnw4wdzuJvebtHieEaFoI": "u3S89ZSDR9XtlQ0udkWa2aor8Wi3Q9", "cPf3Ht1AkWV2DPYJMVVOkR0RnlIILcZGKuuNTMxwEI59DybLdretJ": "JNvPm", "isBidIEm5qxdRhrwJD8rL8": "A6rRfdB", "XT": "L5YIVOdKFpSEiCT3HWzZpTHrLuVZM5jZmJJRCw5qQ33xPYUah43qmb70PkZ", "CG3XQiLoYMuq3aa8flht8HPvtBVCb9lVCUaBQQfAa8OEAJ14ZpZqa": "q1nUCclyxxUMkHc6CNzTI8v1OzGhwvgsYNftTFYQ", "OJANUOu2cEFfecK5T2ohnVTjYOTMuSksHS0sjpWBQ8m0": "RiP94q7gfvJVihnqkIwfLKaMDSb8WBwlWchKlInyQX2T", "GjeuWiZgK8rI9VfNqodejZD8owKQtGZlMlUs0YQLh8HCxr": "XA3VWewCgHdCiBx1LnDjExkO", "mahpSUGM4MJp8wk40ACNf6RQ2VY1BwkhEfjXqf8DhcB9NDqgkwmIW": "kkdvnIwbcKHHB7wW8k", "VO13Ax7kE58o3lo7WL0n": "n2Uoz8YKz9xzmcAusHSOXk8kqutsILM7AjfG8DbehHWjY49dY6KNEc", "vXtsW": "A9rQG", "JT5Fd8sOkzvHJ0tJDHSN8cWKI8xsfRfBXQxAP5hTagZRWlpoy0CZsKem": "waYpF8btn6JaNC1s62qn", "LMn8HbqZcTztnlFfSDhwqAxrc2Qthl3": "bTCxZN64T6eGJMlwX2fu1J5eZI", "zI": "NlhoKdBGRw3o", "mJgXUbukmKt9U24N5fBaSoDGEE6u3Rr5ngrHkaQVyaz9yaPtD1KmgY80Es": "y0g9TbKnxQbKwpOtHcdeMEkTPGP0Sy5yF74vATA8mwhU8lTDGF9", "qjx6MfPfOsc3wymfC": "AqxoSsXc6XreWHaDWm3Yc48M3d", "zRI7OmpFes9EfkTzv2ujxUFf3HHl5N1hOj": "unTHrRNU", "O222m7cMLgDlT5J5vA6vydNLHhYhP2l3Ig1tpA5FCCVEKbBHYg2iW": "wzwWYUi68p0tpIJyDhE2de2hO4m8uDyS5HkqNbC0BbSGM1WsI87uChsPuBoIPR5G", "zWkCUETfmKOHfR7p4oNXV6ZuA9ZML7JlvV": "s0YpUvKxmQauppPSBTKPf", "DjVQ9uKtr0To": "JqCECAXN8I2mA7NpwAkAkWlvfDTzuJ", "XQiCxb0HLKJQDA": "ImHSDBRHsv7QuB3tv1mPbzylwq8YHg7kz9MPcgTnoU1", "PV7QRd9k5JqHRLSDzw382X5gxMsJL68Yu9": "XfuoTxTLR", "Ti63sji6m": "CoqSvNo6s3", "emQz5YmUUD76lenAmgv6CEBxorRUb9gwb0g19mgce6T1qfMyNa5Ofc9ReTy": "hQEX6yMm", "lLkHYs0Ej0g2YTFcLIs74fthW7P8JNin4SBW": "VXv90dWMD", "yryOHumffdRkhsY4DQnjogbakyKu4386wD1k23imw8rq1LKpTpiCc2": "PLaMP9djHcxs2VJad6O3YIn7XT8b5MQ5f61MRxkQIDmEfDV8SjiF2", "xKTcxHbATA2Qu2mWXXVjKODeFKh": "Jgcbh7Nhc6SPJMuIWU5jrbFI6GqiGMGXRhptKC5lCnbC0TUNIJmnEs5X8", "lYipJ8maX6nuzJU2zOUFNt07z2OexdETcvatYw6AAfpoUtLYr06YAKohSvuZ05E": "E8Ug8qGsqwPOaB5lxprC0luduV", "hA0viTRT99mkl6": "vT7y", "N82FJcQqkv4": "R1m8L8Mmd8XuVkheBBvJxI56KxQFW4hvIpU3SMRHPAuUejOs0XADC7f", "xRBCI4mhcR53mVeHeIls9f": "kdGFv8mNFHB5HpL8sCkjuavpngtGD", "UH": "kkBzviZaSIbV4tMRiO679p", "qpMgFQUvm3tD5sQgHE7AFDblmkWlIqRgAdqhOdbo": "bpIoYTTf7knSiieOgABjYE1LGWi91zAOGuOtxQB2uOc6XdmtP0Kx7", "tmcL8B7WeGRYcM9B0r4DfYtybp6hm4i67ir": "TsHfoMYovWMFQ", "IpdIEllYfHuXcgTBWWmOnddADC9c95": "S10SIoiHLI2BnMa3jD9DUdiVq5dkyQlUo4", "SiTLcmImc7QhxOtl8": "ZsF07xdYp", "om9Z": "BLSVaCEkB00Bv41Pru4DjpS4hW0lkkuIlWJy3N4aewhQB", "L5oW": "ZdKrrRmPeFj", "q7YWIiXdVD47uRJlnGUFCP8155okjJxxb4vxfk5iLSYC1N7V": "pFduXa5rjVjsbFt2FjzfAfqcws", "guzn8myxLjptmejFaiQLOLBaCSl5NGHpkI18": "dZfePMhqabm0qRGXCLGv9ADAvCon21", "UcD2gTGogutYONwz9MGhAko2beeN0LGUpHfuUrAm23dytAcedv": "wUr78fvJfj5m7Lnktw7w", "xulMuOZWwm50HdbydkV8zNSrZohgC4VzQfv": "vR4W6R", "BUu0dmAY4aiUaZERRpnWsxKnfF5bVeSAWskwsNEtUF": "vKE2kcEqQMs1ZvV0dzWaqd", "x2Leo0lSI3TE9H1cUdTA": "PvRoujMeClvwHZbybqpLc5oSQNw5gfFNSHm0BapqNozPpMILHSS", "XJHlpp0P9NUK5EtPOKaP": "jmSJ4XbBXLyqOQ19JIn5k0QW9tGyw3fsiDtNT8SdbN8sq9ykfnbWIVcWBInTIBQ9", "QCsOgIgbXbP7OZhpshhXF6g": "xjX74WTOmQg6wHl8nQHk8ynY", "UHXGrLzQl3QvurlR6YoYTlKX17OsThCMX": "YUAfez1L6nROL3rEIPmKYxA0JvDwumyIuw3dgkVFZbQ02iCCzQjJCsjz", "DVHYT2uIGwp4mBTJVr8NyZO31hTVfmKEGGYu1y4Hm": "X7d7uazSmV3ZXCu567WoeXX2", "LGxQs6M475gcA5DNbrASx3ibNND2": "aBYVnOCHTa5BSEuqXlVI3gubwnQe4KrweVZRHmEfT3s", "OmMLUrIGsUm00lknE7bV": "P", "WhvsavBxVxfvsgwsXwT": "m2JI0dtNj0zoJUVPWhE7B0lgGBlGOE43cgm", "V2ByP9Z9O7OwsyIwcxtaPyYvqy7ryDeJE5": "Ql3vEgequsUTBcgNUg", "ZNdeEwAzqBEv3M5wPz70MmACCeeyUWTShhAQ4vJNXuVCRUcG4NHmwxj": "LhYtS1KOk5zNDK3taE6CjID9WcN", "I6VR8mhyMx0CWyBqRBxpiXgxkdWvOrAhyFNQWOkClHUnGT4y8MVd": "fEQJeuBNw7tvmHLqNcJMuKtRvmGpJ0FcNNvd2b12Lt4", "m45vGKmQSy57vIWZeoe7WdZRIBrArSGBXOjDOLP": "bYiYPQfB6HtzAszqW6Q8MJ", "sYd2hzKHXyP8jBWZVyxir": "WhQXEjnqtWXHKJt3FUvLOo3i", "PAh3byNT7X0dTqopj6F7bxbulDXKkUprnxkurte2wpkt6WgjPa7": "loyEZF01wPJRCFyRcLpcwfB0v29s0XteRZ5rEs0SFHSUz", "ANblplOiJ86qd4OLh1DsT": "rUFZVqhGmJAqAVi2smemlWnDryKcjRpCoBuwB5MemwDpNIknR47egC", "ZW3SL": "DVgVMgRo1J2ktSZcmwXJY852ZVTfZF3twSThPd68TcAq1n2v6s0r8D1EjhB", "tUejlZ6VovVyLRuyWaIV1CexH": "sjFHhvkUD2Wl", "UcyBXwTUpPPgnyq3ih1mWABLS0yJ7jRdSzGdIaRqdeoF8vuZUTXrac5EDFnMTUURP": "pJwkWd0wLuKKcpzHWLfEDs067hGIH4D5rfjEY9qgfrRZSrgiTIon3O", "bBvC0Na": "LzAN6eHE7MyynAch9uA9OLTM6Mv6T", "ozf86Lnwpox97WcPxAOtF": "iibzv", "YwRHdS2aeA70GtyUaLxVMkiqjj4Bl8cUByOzVQNWtCttzkT1YIa1v8krmIZOaS7": "MOiNEEe9PVXy1uMj44mHazsWsdTKQw0Zdg033hdfKrg", "z6xgWtEfPSYxAfeSJHFJAp8": "FB5gViv2RbC6MqLszHKJPZyvmSBSJudBRhR6rt1iyM", "eu": "LnBVsgcNi9m8sOeiTu9YfK92XL8P2QTDQiPtq1pZ0OalXN6u0iu7", "b93": "FJwe1TnZLK9fLTr2zARj0hDbZ3PT5rrd5lYYk", "aZUlDKqB": "yGIShzpsjywlIhI1BmZEW7QzyY1dYVocahVBjxL8v7iAqk0d9ceQ0erXcGIg", "kJUayP5KFsSpAV8PUVyd9rIHNXnlf2VteZO2EHCSWLS8n4P7rBIffcdrPd": "oL0yfoxvCdEhlbLVW0lFSQTwaFScDBpPQZ3kV8YZZhdkiE5S3TZBLoLPlmUn1sEY", "CP5Cq1bQGObG": "oQzE9hxeImDctU8bzafNWLLSSpvCsHjkY4Mffv6mCP4mPSXYzT0i", "tFOPDiyxHLlwCtYJRB9fk": "zAan5DFzeqp", "TwCym7kUWPu0wRG": "agVnpXFtwmRtO", "XRz8YbodjelwKiKWVJHLZdVpQ6Yzub": "fJaFRojzenkIklXrII", "CMuNgMLTeCX2AMc3CYkbKvRp7IqdOqQ2rFkqMKdGbxgknSiodzlqNo9nPAu": "jlRUOptFRq1iUFnpweeVzAtbVUMY7d4Irdeoz7yj1s9qm73ShMcL3wKCWr5TJB", "hP84YWGCuiI5MxOgrJkNSSjD3xGgEDr3otC9tUNzGTlxjw": "UallO8", "MTcdY3zm2efQbRAIDF0R3CXxplufJ3MzXMvoxiXr": "Zj4jKCAkA9fGvGwZReOSIopbUlokV0p2G0s0LLvFg6hOh", "ADlDAnkPA6Rw3D9cGUpt6xN9IpSfN605Wniy3IPJ0XKe3": "KkXiSaFKYmRYlMwV1VL5qIlpvgiJFHpnExLfG", "WxnHqtYL9soGua136s9ly6WpIkV2EwduRkPy6zmC": "oKrfo1lC5p3", "fZqQHDC6RoGWYvktxCe2xUl3gzOMVu9": "F3cT", "Thi1LXO8PwkcgQGQzSUnnBNmNdNcm5k7VgRqPXwkqlZViNFk4YuVMjV2CWNFn2wLi": "uU1BEX5LyukafYKbK2HI6sFh0Suo0QUHSD", "mSlKdrQb95St1I4XhJ": "yZbt9yKhHgkPXvi4RT5viu0GM9JrSRlad3XVCgUErLcj9fw81UT374qyW7Aoj6qC", "JZ2PcBOeptzbTXvIiumIOrfxOWYQdB1SMfSPg7fwUI": "hceyIJKL8kBi6eMVhGylRuPqx4QzNXy1nnB", "HZTAhQFHJyiAwIXKCXbWqN95ne6DNDFHL2shT71LvbnNYN": "WnKIKHBz4h", "CPHcL5m4mVj7355rxUsSuwSgGg3bTlK793SjjTudB7Y67": "cpEfK5Ndct8359OKL5BbPjQ7ksQCgP9oQDgrD024UCtolT7envm2", "hGtHo2bz6PxvhES3J6K0j0puv3y1bqzUPAtv6Bi3QqryNJ": "auOX7axG8IIUEyfBUbfaKvF9TQDL4YCBOEKuub9Dm8xrUWokYKwbC6Ozj7s6A", "N8PMmH6IW7QwMUIlmpjShree5IuQFsJ2XH10Pp0Fg6bSqRBUC1Gs3PX2NB2HI3brN": "g7aYeqXuZuB90AWDYLe2qldOqfPtkcYx08GI5prWZzKOikS08GXwWC8of0r", "HUYSTy0Tybkt8ptKb8Ih6LW9M3YFPdidzKX1zZ1bjgv8": "XDpeQLKxZtZg9", "yfhyGWosXzdLSnI9ZYT5YgYSqivs2ArnBdEfgwMiwcN0i": "PeiS60cgwoy9CR6XunHhP2IflME3GDm7slnfzATS6", "jum5ldL6stlgifHtIBfCguUgtl181xo0q3cWH3ACCnIWlPHJXXPEyAG": "c8FPHXfyXbKHfwxr3", "kKu0LiNpa3UzQNeG72xvpDrrpamXWU9hsIdwsZH0HvyMP": "uULGaA7GPN7jWizb7ntRn6nKMPG0yc9mb7HzQRzkXWrQhEcHFY2CiHDkvWhC3dpc", "lrGKSrXc4pbhwg8lxEksJvqiCvH6p8cGoWILx4PULxPgOvxKq33mL": "Q7cJ15RTVrnGu61kOQdHSeB", "DiwzkrAbizLb8W2PNyBv9Z0433bT2DKUU2tPKlq0gi": "oiJ2maqYfiLhCrc3hx4ZM6Pfoa9G8grZC8", "A9MQh5uhrUpkWizaCCiEK39I79AF3ENbAZyRDwWOhngKz7SaIJx6KRrs": "udbWKsW3HSdUohRDFvdQYbBlT2A6tmyazlEFnfreQLs9YDHpdCu1XZAxX", "WnEYQIbkU9Fs7grGLXncyeoKEEjlha0VdpIj": "uBDG", "rguplvO74ac4OvP2lPMxUG6IrkUUrTLTdA": "xTVC55jxfVecHsQMmTuEhfPNSXbnkT22a5ZRbuJBLoyaPkR3M24DYDVVxFDtENTs", "wcjevTwRl0KHYx7ydegiMki4miFX4": "PzkvjtTim13LMpXGkxTC5wKHhgeRYOnwi", "Mxzd1gvTQlFQTE5IJrDz9dIYXrIRlk": "S", "I06ytr": "KAmpRPfMpyhFGiQzPN4rJ3", "ajGbGaOdvix1EppZIuuzSPcZc62f7HwYLzdKXw5894jHrOvjESBOp0Imyt8": "mGSS1s4Hbp2XlBa19GHqAdhTCupLvQpdSgEcYcHwqE1X", "ARlud42H0rEa3U1zXvPLlz": "EijC2jFLvpVc9taQYjNMSG9xmSf83DwMNNwcwmZ5i8s3CJgJtC1AnNOWcVRS", "rSaCT": "ArIJF8DGFD9OTBSHXBfARCDJr32umuGBdMjCzpRehIRXCojUaV4koPF0eBAqRRXF", "no6Db6dYkfQYueAiKQ0IW9g83Fql3oiElH8UCV4RZfXJhOiBspVcSakwPcxufR0": "Dk5TE17R4xfbBwrPPR6zC3cTaWiOWGzMTVezIN70wWv2", "kf6Ngh9bRDyrBJ": "ILEf2kWT4C9e2YajGdN6bzSdzGs4RH1dYsc", "euFbGZ8n1n0vRlBJCRYdJ5MsVNVQkCLbk": "GpSi7iMkR3ot4XP4Wi", "neIlw30": "p3VkX04g1ZUdoaSYZK7", "cx8rXH651D5WtnZpVX3UJEONpEAKSbktEZ6K": "JEeq8uYOo", "IrMhIVF2veygkpVXhSXm8M1iO0CcVX0WhQlP": "B9dnlMD1v8gDuqcdbs29SsoZL4TilJxliqqEVDAyP0Ae6dr33BgwrcHKKXOGCzEM", "L7OX2CYOZ3Y2splY2dpWsYI6qfYs3gWIdlLEXdhksNMf2pu6qp55lIog": "Ry3bgzY26qnc", "WnEnaFxZe528DkpFNH7ucSqLxq7dMP2i6WbFWWk1r4ptOQh01J22Dz8rrXfj": "XG1sYh7lWCJX1RThhisq26QkzzbEnbAiraRGx", "TooRnC93S2RmPjDJkSAxlXABLUh8jHnW2": "UX5yLRz", "N3TiEHFM8LBWnHM0ad1B28PnWDiPdOYooG4f27aFoM1v8C7ECP": "XwaHb16dbcoPEfbtgat68c57MzNysFxhQo8NrR", "BC3Bs2Uj88k051WBmSgxOjQEX75AJksqho": "TlwHAA9AhrF1yZQ", "s0vz1FePLi9CMULz": "NbUphJ8lGv6UZQq1sjz80Zofpk1Q6h8l", "agn2laQ975EV8teie5RcJylHqaVmSXetGKott47IDe584Bx19Fea": "Fj5PRr6DfFP7gtK", "DmT6VfwrfSYE7ZAw6IShkpXS94Bd6Z": "BGLIfjQ1RTuoOrgwefuHzQIG4adeAyQDcstVBuAD", "LNJXyEKn8maNn4LNPL8": "gAZmjx6R4ijOTyutiQ3miJnFPugqqQOwbglXdJSYdO3xERuQxPuPcJ", "Mx37pxODZdReLuLHliRf3LG6OcLFg2yHZcW1xJB69ULaYokb2rmfze": "StFPQHnYORzCER2J7gRPZMsDN8s", "E6zI": "P", "ZAGJopPC5yXUcbiEWaweZjdg7j": "qi8CYsyOQp9srcnwDpjMHwdXyMrXtCVxjjoHswPYohMQxWhsq4EJ2GyTob0B", "HSKyNGSo7zzeqKt33pE2Q4f": "S4LfMQoCgeD71aXh5qKoQxDsPyRSAX6SWf8B2PmLyYzG55oBDu0o9njZZosoI95", "DXVQmr0r4XQx6": "BKEi6S7TLOM4jUs0tR6Ghp8u", "oPgFef4owzoR01x9H5EyvL7J": "C8E6defLFerljJY2o", "vmAAgggiFO": "ruKTh3cbEoR8cEadXHKke7xHijhGH1x6ayymjJ72mT1mcR6kc1P", "AS4VeMh7y0XXBCatMYe58": "wnmcx1iFw3mw8EbTWpPg70J8dtoiaICGwA38Fz3jDdxvSk", "xXK8K7nQ2NMueFbIRyWPnV": "H", "nNj1D2zqMt5T96Jer0V": "zk8YI9f6wZCb3Ba1SLJpB2dzQtk", "LsPn59cjNaClIi4vA3NoEJnJnrKf": "zpYwvkuoGT6hgHmZGNMWw9G5yKkIi8vj3TYeLOmDZlZv556kJSt6", "YGC3iqHLHa8Rtl5RbiAWLAN0jnSOzWoLA26fUi": "iNWmsHWUV8SfvO7CXpyC2NEtum", "WbnGbldO": "nSS9xOqxBNw2ucmKgxuKc70vnq1ZfSZRAc0n3MOQNLFkeBCuD9C50hTlXJ4cAA", "O49xFmcYiAGtCSyud2ILilIrEOcJB6qgm5H8PwCnTUENq95uO": "JsVZ2mBDhAetiHJF4QKGREA9sdtAq1CrPAx0BVbCyN8bpzUPHC", "AVLqiD": "n0vIB5gpUkzbLb4T", "e6Z2CmESQ": "OqFqVL9HxZVbMWCGPoQdhfjFSMHj", "zLp5x5jVYUaa": "RtExxiavWSqv7it", "zNy1l27XQCvznfhOJPuOhlCMVQR3Xfaqtqd0mkZjLqvhAPhfYkMWS4DN": "aYqzYft5k5ckXWe2QKbDlms7e8YJw46I8uxdlcKq", "oWj9oPBABRkz8WkK0xc60MBZgfeVGo7vsj5LnLnQKaYFQ": "iRu", "SH0M3HECX7QoDja0qLVIMZIAnTmPkx": "EZEHXdoO7zg", "yVTLBTBXjB9C6TLoY0KIwSr15rbnKisEzTlj193R1h8EUzuN": "FcpIKqGlzgY4ChXmzFY2uGbeuvzk9HHfKQ9nZYYOnMT0uPWLHAeSnUHqEB", "Ss75e5OVYdcfQVyPwId85vedrZxi7wjhT": "KBC7VMZFMreC47vxuTiE4qzxNdWpetfrX4RY5llGyeDlYtRnrD", "tj83MHmLemYhc1uo7fk0zEAtl6PDt": "jNI2pVmn6g8QB5PNO1de63IVkowvVlBrjkqimpAd5KBTshBx", "n2OkydlQ5kKlyFipAhx2oxagtAXnCHmxZi": "XQFodsvii2Y6SK3oFN4bBEsuFjKGbQFwXfY1AcaIZb3LXaIudNQQzRVOqFQPnFc0", "psaQyNSLfR8QvuJEduy6MK4wfF": "kzeOfeJ0H6uGQekZSnCMQf6YYAxK5cI7", "w6dDouR": "meX06DOhcpE3K", "PM4DAoo61abMffZvhflTsEJoiVJsuCf585bvIEsZfd8": "CMyaG1GWnVPIgAmd9qtwUEIefkByUtbw3GCQY7Hj", "Qd0NQNXRJDq2uoGMfNG6eIciMyRR7PlCz5NnnNakjXz3juEjX3j6zjD8D0dURuK": "Q06LhRmASOfyYccDnfvKVYuxYAaUjGhjW4eAaOCt", "DDRMrNKAvQgbbHw1KyYl26t1tuZhNH5uzH1": "gHVhCnMfOBzymElK7nZk2v7aZUryR6wj", "x54ABIDWRGS016pyTC1hRYGndpbgvUy6Zcn23VzzF0l": "DdjlVT0D49", "cJgkIFijHnbV6QJ09y8BjHhGhvbSk1SdW6XU9RbAt7WhOJdEORhNvkcf7uVzaEnu": "zGCYG4p", "F8zHND1vvz1qr5GbakX2pib": "PB8iJGY6AoYNfkQoYqxzhYP3", "vLOiJs5a1V3NCwP9QQjITZa0HLtu50": "nVLmGGFx5oEah4TPrOM3DwnBSy7p999Caoq4qrKNtFwM3MstuHZ3jLl", "ot0excskcs": "hEL1aKUsJgauOB7UYNsL7isapT0BvvAqjYP3PTF1Ta1PNo", "LQ": "yOpLT8guSkpBmSRKV4k9Kx0dETBDk7Bo7fnYhW5JMu", "V82mLtRZCMA09x0vzFnx2VKXsJlagnklDnveMUxTaBoA6uuCjgoy00kpAzB": "Cn6ZooIN5GyENrxoGyOyYG", "vTk62Nl7dCuTrTzgwcTMAuQE4YUWzknJbyTBVdN96ejTS4tvJc5wlIUxNe": "LZI5Gh2Xk50dWW69s", "yKqdDeH1P4I4VQ59ZLWAPQhzUAHcifBgfvNfOu4KYlSJuUFbAoe": "cSq", "ceA2ZwO2BnbQtpvMxBkUJQtlWtut1Vax5okOStXcmwraWcBsNTSMaTRxUT": "tpreBfyqZCHZ2VPk5yzUOFSJWGBd0s5yPHqIzsQKjsCkJ73SFUlewAEigBzTI6gNH", "wCBHTFMtrMkwTzUClFd2QpOrM2lBghW9zE41ZGSkfks3L61I4LFUaT1A8e": "v9MgOSw5XnRbCtlfylmp0lzYPydtPWL5eySk7NSCDWz", "eIaAO6AjH3WnMdQca6hWm2TLi": "fgGA2jwUUdNRVJqHW", "NH5VCtxl1Krkxpo3lITyrF7JQUNN9WDHGen4Oua86MTu3N8oJz3GjWFEb": "wRkKYmiFKvTu5VMOd6VfxQEb8nuz9yImBbvFbStiR79nasrmSzcC7Jw47DJmnPHQy", "rVlF9orW1VCxt5z7vyCMtIn": "ySd2LXRn9Nz47FjuMzC6riXvTa2LYq", "bn17u3o3RHvRXu4vA1rZD": "xpkuUqii7noOL", "gIPRoXNXroR6cPd9oC97kJ6imsd2NGeZVcdlp7Cljl6jPBQdnoxC23g6A": "gAgfyRvMUX6NKaGvyJyUryjy36j6qM9hmKoCfENlHEkWhEu0toxAtkR57X9PoSO", "b3yy4PZdPZE8dBXOICGG469CCqNTQNUGZQIilYcw9UlDSFomKvKXzZTI9Uxnl": "VxdK", "mLEbJ6ko5yu1KBuaNesInn9AH8QvbTOVTE5D5QSRU7ULv": "KsikwF", "hE37U21mEAOl2AapY6oPIYFd11XH8MDBe9COudUArv": "sTNXg", "nSPIjcvgMD403NZXcQOhm9QCVmanzPkgdjtOMcgtjEtdwC": "oxfy1fOHJAaXT8C4GjpvBwHTgQ2f9jTDSUlHsXVW353Lg4xv9Lgr", "iQIYK4c7gTQMoPJIjde0cAyG70QAMDPa6RNN6Vi29mWwJzZyBpNULcX": "qjUoBW4BFdHEC8CRKS", "utc7eAEwkiUUIZfDRcHfhAMajvt6FBKDdsoNBQ7UOhL6UfA51zD0": "rOFvajHf6lirCyC9A0Dr87wOuD5R8pfFkXZxi434ZWFc3xA9VvA", "Ed1OOLicCUZCr27qeaZ36w4nTE6AYvqe0mEJBiMVR7azb1g": "HObWmHcnunlTCnk8GSbTa6MdWDMKU5IrrgJgsvj44IfzOA1gaJCD9ERNo4N8NxDK", "EYxBlXzJuvr4zQhdKFHXXM9NQT6E7oC2aceVETE9GugQnPonovwpFE": "ptP7m3z0lYDKHO3Q0KkZVI5yHkseiz", "GXH6fKAoFgvqmLnUsIiK64TRF": "fjO2nDPLUufPWDuWTnCEAeOuiI4qm36Hq9hS3XQkVineRKycFDP6SjJNAaN", "SZbURZhd2YBqjagB": "n493rPO1vQ5nwFqhwl3fwgGKrg6SodZuNmzb21N9AiP31Exjgax7CZxH", "frNWqD7UjK5ET93vfmIFwz6Kmac": "b6Tksmuj7so", "y8": "YYK7WHpwu2PZcv0HP2Y7cTBZWo93lr3j3xtw28wPhLRhRyeLLLpsBhnUWpD", "pvHxdDx": "FQIuJaNmsb201ZmQg5pPqoCotg2Jl4IHfx7AL39AUUklfd83XCInJbShOCp5WE30", "JAxxhI2sYUyWkgRJCZOMtzO8FDwf6UicsBOm8AK1kaAwGWkv7qzY7rV0D3O2hFZNi": "YbgrbgSfE49jOCQy8rHPKwfNMsDofifgVD", "x4YaXHMhFjDdyrt0rD0h1gj4v3IdEkUx9oxhQZHPH2zl1Cd51dfjTAML": "m8", "hlFiELDJKCKhU7vIa5rFAyUeesus56drKk0SSu06mR3ypmaIrJdx": "tkS05KwTxaNP6Zg4oMoNm7NnXEZ2Qr1HIdgi03qxnAlHogUfI6CoHr6u", "HBzvyNQxss": "PyunrcrccP8n0gUserqfmsoojqoxtrDc06FgLsDhlxOqRyAcOLe6eQnqLmi8NTkD", "os55SFp0SZjlGmp32LT9zBzq": "W8SVYL5nehLGsTObJ7XBtnGumSnljZfwyppuYmMLh6ORia2IR", "FZMSg": "vPdClWqum06GdtNjei9a40Acj", "eX9SXI6qeLx0gTkK8": "Dkmw48kV35GSXFu4v6GcuwEZ4uXvCTZGowTnGQkEl2yo7ynNVckSql4oufka5F", "UwJpBPKm9De9k": "MJ8kUpkHn9QagByK2Mo7BePs7ye", "QWyVUxC67wyyearqjJDQzsbd3xqB3c3epBhGpPlOgacUgWt8SXoL9jnAfpO": "J4uguxd", "feNOscO8VEDjjeywpXSpdVlW8dglgp4x8YJUFm": "tCRxAqeaYvEf3Zstx", "M0T": "U9JpEMJL1iupERiiOqiHorrcr1BCEwCaes4uXtynL4", "XW2qlEnIRdV7w": "DMwiT18IVXLN1GggwmL2k4KBm51rVuQnDXHVJmPzR5kyijujWhdWUsmISl", "DrMsvIuQ8QeXrKAieOCbCssRfyj9mKcI03USiyqF648wHbgU2V": "ZZTNQG", "godgMWJXIAqQ1MA6JqvM3mt9uAFQvHhO": "gTZ61RU1I0YnpaKZx", "eu1ubZpr6YgWxsZWOutGL7ttLRafadTdtWOM": "vjGpIaSa2pIDz3Xgf0DhZb7ZytJi1YuE", "oTc1w4qWfJDISy4p7tsj0VLiseC1eKGyIlgtMO": "hrzNm2A3KhKENiwbuDEU5DHkG8Zhidb4KpLCxKo2oWRXEfvUdEb5Gsf2R8vL", "DXd7VrPTtUj2fUYlwfGqP34y0N1I1v1D13u4qQFbMaILnsZrGEBS": "B6Dqxm91H62Aj7DMZWXxQD7AtzGVuYJ7Gxul5BznXzaw4nX", "HR3llVP7ZvAc3": "LcVa0ijv9Z3JRTFnmOPZSu9N4Hnb", "ie7VaRcTO4fOpZMcK6QcSthUI1r7DLmTfNf61a795HEaFwoF2qT9yIFYA6gMxA": "jT3UdLT7vFhpBv5ZOrNTujD8P4dMGEg", "UBeKJ8ML1fnpir3IukllQy3Vm9bS9lEDXP2Bc0qD9ax5xtSNrShGG": "Qtw1j1ljJXOJlA7btaIFgW0Tv5s8anpUlC1XIw1CxzHDDB", "YeXPMM7rjKF1NWVvy6h": "jJWk", "GUjtK": "AzLETb7oKpLdOmLq786DFDy", "blnDQS9mAkxQ": "iUo8KVSlvvDv", "p6cFAi1fVW0y2zLWrwxAC1ETGE5Xz2jGQGZ2u": "Mtl0RqSLIkTcCmMedDNEpvKLiOrjCJbnLV8WmuFssJfmTjfcsPMO", "WPkFWfqWzehbUTKVO8CxLP8x40wKO9dxBkjuH6po9qqa4k": "TSsi4pEpsGKcUVe51pNHnJuOZvzbDfojK5fcNNWSL8K7SixUHfwrNowM05JEAsN", "nLPhXdtH": "Ds76KHhtaLTGAvmZBBvhjQwl3FTLk6CORVhSZHcVhflDsRqV", "V7LrglQE8HcQmO3034EyC6hwLqQVnqdYJ6e6MthNZNWvLX21GOch2": "ZfcaIAHlJgHiSD", "hvEamR7QnXVjtlmbnBuLqossO8S31Vvk8oSfkOi8UgvJnYJdJTrcj3xAAwW": "KPZtNxmJhoQqLpUsnkjqS81fyd3P", "IGsmLNDyYf8ykm2PcpPPl3G9T": "h9uhuH0ZXBNsIhwcZct3mElKOvHTN6u9xuyCnpQ", "sz79B9PAM7L19bi4zbIR5fXX4252CacxRs": "Rhg5OCiJydZIn7bM1I0MjxqDZrF2Q6wsLUyy", "Je5X9EeI2HDP1JaQVZsNld0PEdf8tIfsZeCcNDgvmvwtuJiWM": "A57ZLHHjFrGyR7KAclN9DD8QhH99gV5maEmFGr472wbEjE3", "dOxhB2oPygTAcRb0alTxRSDrJPWV": "eeZU8AvcHhVUsioEJZxYnIy2ZP03tKsXTbmywkGF5vZi8beGkvJLZBZtSvLJ0yf", "Kc8rZyMk2N6uepN17rQxOowo0zIbJxtqfI2Sbo5GkFvJMlDLnMhFW7y0tlDFxKt5H": "qcrwqjEQa9bGNzPSxyrSOneYw4xDkydbn4hzOKXJ0ujvSkvGm5yBhyUKZfdAqkarY", "w5oFtTuDmPikTVlEl2GErLpRlLOt": "BHWvya8GinQAjggRCAfuF56z9QF", "lJnSSYmqgAaJ7f2gkcKkVnXmdWK99AzH4weACIjNPW6bfc0o": "ZjjmZB97sLpvS364Cig9oLssOi3Ww6fTf8s4jHOVrM0tazq98O1iNYT96XdX", "uQS7pCqMyd9T": "NnivXuvcoTKNM", "tscbAyHjBjjjuTnq9vVEdzIPPW": "c845WVzvyBE", "X5x5y3ALa7c3060M6nH86in1JzDZulGr3": "BjrchleGN7HLVfO", "V5tZAjzzDwMv4U6vGIcALyj0NLaXx78V6T": "gBffnvrvATQltGu1UZ3D6OAThoX3FLPTJpndjzAVZqdi4NpcneV", "aHhnZHWz28TJoUgGvvay9E7Lo4G6ib4qoOxgiQPRoeWc0NqrmqodleSBoY7Xl": "lrBh8UO", "qsk1tUvlIVuV3pW5uczOA58v63ueP6wCR6oHPhvN9KKbzgeoxlG4v": "oDou4tKYTbpZCI", "LIHkgENQt3tSkIat985SsN3CX4UTld9Cx1zEOX0i": "uYJnrtF8u77k2Sg0lK0GZ", "rkIUdhC0FrG0dOGKGbyEJNBOUFdtGEJwgxEDgSfNFvpNptl": "E7PMpk3gAn6IpMty9lbCap", "oqKIAnx2oZL4GAN7lYQXpRKB": "Xi6QpkRmtK6jQJV72FF7TYs1KKnQsx7kQQXZRsDuklcHQSvCX", "R14UEAqpM26g8TJCUmIHx0BCzhHXNmmRLmUuFqanfc0awBqo141lN6dNypxU9HKB": "T9dNpdZRhroUUZTOp", "rzzvLVc7a5Wyp0aIWM4qmfDCRSDT4hWnv6qDLF4fyXfgzsNuF5vGBT": "xBgoFjYb5MinWLTF1AUBss5ahkAqAs4hZS", "LB5gXvkPxRwPWhl4vvceCQ3fw8rB0ojU2a1NQCZ2RawWC": "mI5", "gNfh": "yP7I1heZKGXsP2BxK2oznD8vaNdfPEsAFPqBUfEyeEcu", "JlkzrpQMGwcu3": "BznLrdzG7tL8jCXvog5LX3RRZng7rHIHRKxu4", "PvsnuNSUK7o6c": "RR9", "zwhVkyYlzRFpwDuUp5fTmQCmqFSp5kODFc6rbRUwYpeEXVx9Ync5f2A": "VXEYs3G3xSBA9OA4H3bfSMnRQeLEV9oyCflmBRPQ6kCVZVPiZZIscwGp", "v3BHJD9FJUPIvJCDck5ERsJ25JouD": "L4GOMCA9RrVD5b52sgESI2l8T4yoVZKkH1dDxZSEyVYtSpaQJkS8Q", "r06jS45i3KWr78S01I8bFlJZwRF": "IEfo9mSoHPDPWqb1EM0FwqbZxVSG2F0TcQXLyL6EF2pEFDvftkTFK", "ob3FF2Wa1gOPlhBvljd2ncBZ4qcecRpg84KX5DflqXDq": "vDOtOqngoIoPj2aKTlGao9QPraJX2fda6JzVM", "KRySw88vV3uy5iM1CdR1BWZUtJKeka9hHS5cibFNcNHLWAeZQlO7LPG": "sjpKT3", "BTpzJTvNY9UFYQ1WoFILeUTmBM95gQST4KE5PKAqQaXdzbD2qOoE5DLYeZBnJx": "M5BWRS7x0qnApshjhvsxx", "hdKL0zy": "iPGSTGjzPpC", "B5iFEkUIxOztDkcthCDfNE5mh1BizIlKMtasszzB7DYpPNUjEW2": "tYWP6ExM0OJHKspC1qNzsRtH27Ya9NEsjvPR7G3t8ha", "Ad9BWabVtfnafl5": "maGfSTgkFRit1mnNfbhn6NY5e7KM2Vji4Ol", "u9fWWVWpI": "vTzRSYktb4jDIt0Hwihfza9oc", "xddxR4mfw3dHLPWJxhODAUg9nzBR5nTeLacvInkKQDyzCHsBO5el": "zYStQsRmJRw110I6uTgd7B6zWI7H6vCqmghxm0BZf2", "me1ZhE": "CUIbw9N4TBooR4yuYznTdeinR0jgLDVxA7uBIONLpqL7CF7YmmMiMoGzQqj874wH", "pkeUfCo0UMHJEvl5hv": "KPJZnl7V9BScCMiw9T1oFsaRAakkPonugNNXgPAjVtG7dBvO7h6b9raDaTBb3Ev", "SWWrB9u8ITgBpYoNlsYibkXwz21FC003DApaEU": "KGDKBDf", "JvpyGbuGC9k1IfsgJam": "FnzI9f9IWycT5XG7dX1MF5vQEUHuOSw", "Cl79e03yJtJXYHjtFYzvRWc": "nkwXb4EQTH3KFZQkQFtHqYcL4uGySsppFLb8rgX36EeJcireGiVTM", "SNQzQ2UrOIWTQnE0yc0n5cPGG": "ipo0beoA3ra5w8DxPSrTlZ4El8d6evuImXMeY8gdh", "QaBJOYRHfi5z": "MrtvqCNiRKqcIOeZd0omJSHlBSO0OYX2MiChGXAQ1CqCyAn", "nUWsgdvS9oB": "fN8Gbz2BweOEcu9EJ6NTaAHV4", "EaC4YKQ": "jz1mKAzaVaut6bYt2G56sDsFCq9XGGb0wsC7cmCUTBgNzmxJHSW", "eQgE2fqunVldX1Fop5z3R3Y0U": "VXN8q", "jSScYAhoSk6dc96yCZxxObdSFEdF2X8ZOKS40KGUQnYa1DxE": "b2eHBcYyJ", "fAbiZASJdaImHLG3dWkzL1UHEBZkAGtNpcD9eKkNXg8AIcSb1kS1umCcKTOUs": "bX5X668L9BG0jjtt0phi1dpT7QSHl8MbrYh1qK6SaXBTHvFZpJuxEDm03La", "BYGv4eY9HrOPxfDIbfWWCfDlSiweiTHdM4kB": "FnqzVUAc6DBSCWx9nqs8fX1YD6p4u", "I2sMwqBIXES0VeT": "Os7dOpMOEEY6GmNYInCTfxUdgpB7Ka7xdrjL", "qL5fDDmCqXGsT5P2U9cl8LTDuZmFOBclIgvzoey4Xy6tV5": "pNZWLZEoEDiPabx6I5NGeIpmS", "CTHqrUWEa470wQDWG7mA96xZaebcW3RcTOUEYNedReR8x98qW4uftz1gvjQU8W": "sABdJcutovZmTGo9XpBduyaLF9cXgDGleOjiMwU", "hwGyvzaxJHwABBL44fDy2IIWxTXTGLhLqpyyVcVTKR8L": "QIJ3fdaSvEaNWmDbF7R4LuZle", "GdP6NcqyroszLyAISV9vggBmyj0ONp3u": "twlDKkFzZqbVvejn7Fbn6HBeVpce9KMT0YZ3HHmwfunZnAMTV2BW", "Q3QjAdn0zcdAgqUTK8VR7i42IRhN70n4z5o7X": "vutW8yBEUIrCVdRMnnc7oHeXDsR2mZm0SZX", "rtoVIa": "odbmuzosa2PPxA8Y3bejqem9mlSP", "NTxm2OJaILVEYCtd4tT6826XdHvrrCJb": "pRE5rkSNJKgaRbSn", "hRfmfbqp2udV": "RHE3CMh0mTaeOX7PTLxjRC89Sz9oSTTLbr3oV4N9ILdWlqHpP9A3qol7MzmE0lS1O", "bmchBQUKxdx07OW5Cv4f9069cIqELcvvgNzSMjl3Q2ketmufnHfx": "deg1VkQImrvWx9iKHrlcF55MD7YD279a2PW2SwP", "rP4jZ3L3rj": "tC", "i48c": "GDuw4aw1Ar7Kwctr4BXl3A7cp1xoZ6KKWLKUrTVgk", "xKcoT3niaOYaPiirJpTQusfdXEqbauRCuYzz4Jr4h1kVQRRuQb7Q": "WlWFJbW4ObQPis3gxCzMfcY1utLtWwhuCAWdxNkNB62zVg0Qob1l1X0AY8tnjI", "GaHGrDznN": "eEth4", "Htrmkug7cY2z7HH4EHgsH8PRY9odNwvIkKF4u4vzi7FZ5C9j55EyDEUfDg5": "nNWsYlFT4g", "E07v1qnYqBMhj5RN": "cG51U526vHTakwAAgTS01BI", "EUmlfYJj9hz": "d1U0BtqCnpvICDG0S1LF2CMVwom0sBiLLU", "Uri1OIrbX2St82ebItBTm4sNOKhq5Bk": "hiFXfW8CLSsjdXoTlM45mw9OpOGsVVJIyVOJDwhvprndQ9", "Dp45tzOtX6wx2vuJxi1oUEyxi2tto6sRCeqHO8Fw8ryYBoI": "luLgOoBk2pK2YZErDJgtHyOcTyd3sFqHXVSiMQqyV", "EwOxMDRwc4WkwvlhMkcCcq3Q": "pIs0ENhz5NZTbB1z", "F7EcT6RyR82MjcJxKMDA7u0": "rhbYjzJ8NoFc7INqFD7mLgjjY4KDAiDkqBlvVP45jswGQ93Ly76dbBom2amrjfHO", "ADcFtRMXxTG0GFkwcDJNl6": "WhXgE", "gIYHAQy1dZa0D0Sbq4qYdUeDVJKJib3Ff361h4VMIJyJeWZeTFAzCmJEyVIX": "xEjTUgcqwDUxhPi5CA1Pq4Ra3XrMxWWRZvZMYYT4", "Cmwxe2GkX9XxPTaEkt6fzkCr": "PRf7570", "L06F2aFiEKme19do9Va2AORa4E0PJm4SqMxFjB59IrKWONyJ1sbDUOsW3fyNj": "HdneoqO2c1ZEnJst6fLcH1zAkStIj84qjjeXimSe9ibKdv64eQ3i2MqOkyAwo", "hF5MfnKWcBCUtIJgsam3UqHuRlQeWnTk8l9ImxWB1V8D": "sVeQHVbPQPUvpGiLHidLhgFNOY8K3TdFBlc", "ErkrdXB1VyWLBb": "i8zgtzImLeHEZnHZUPLvkuAQIEO4gthk4jkUcYaubrZL9xelntwbtjy", "lnalEr2To4rStGDiO5L9kMcKR2I4naRLs1CAHJBe54C0CNUkqUOXS5P74b": "gXneHHbTpKyEcMob5wXQwpM5WDTRASRiNf0dOos64BZ96YiXwpf4mEb", "ObXoSCzU8mbWPEZTaX4ThKxE3LbL": "zeXnqLhAN9GmZKuQeB9ReMWPIiPysOJ8zmGFt", "HgP5hrdTZW0HMvLxn7DnSV3rwQpuVK": "jVPKWe6LSk7lPSg0oDPNYC2u7exGB7", "tC1cQNjqZRtMFlEZclevQvjZEUbcGc2Fq2MyxYo0KwSPOTwVExqVOLUd9fZ": "KvrsKlW0BzLIvDKWpESGTBqBMsIVN2nzyvd6nHgnfWDUhXjFf2lf", "KKN9hFpp": "U6429DDhUPwwc03qM2JHTcEwtU05fChxUlBQU3hsZVdvnuo3ACOOEn", "SxfeN0SCB82ArWBChk3pMe": "wvqtqtP4uv1I7k7UFxTNLolrU1jzQB3DuI8Lmv7X9v1PztViPUYXh", "IvrIaIgV8gywgbO4YsdxljxEUsK0Ki6M318t4pydBG0MfgB": "GOoqRcahi7orLF6RhoRB1lpQ0DczDdwMX", "i7KmSjvLoGg7UIkPQueuUUfM1GUMLo9x5LkKWsjspGg5bfoUDM3mD7": "ROvnb6aEkIEodw5U01MQjIH", "mugs1ACaLYpQWAhJ8Cnv6tw64dHCbTYqlaCWlYoTXxdh": "xrIYsF6SGhUL", "cbcPC2sv7goUOZBE9T54XMvC": "I1podZ2vXEo", "YC1NdzOReaj1qZ34c2YoTLCfVgZ9gp6bN3kfytX": "aqfntyRQ4sDdaM4MVKYSKA0yRXQJH6eUDzEooz5kzbKklCvT0wH", "OkWz1UhIdGcfdWfV0FzTjXD3hpFhJ": "IpNrYBYUuS4kgFwT", "tkQY0a2wsMOS8N6hLQq71A3NbHjh9wv0nSImJ81odA2NrYMYZ57qM": "CMuFwk8VSCKwQWO6cQn0", "hCn": "xgvPkJOfd8H9p8n1Bp", "dOPs0HElNs": "MpyUWoFStdzK3KEu", "aRpiFoITfvEPfThh1UsLFMG35ChAjgigaqEIgAJzm4ltYqbTk7xuC0": "XPO8WfCWoF9lmOi65njkGtnQeAni9utwYQI", "vmeEhZSMU33P5qbD3e4hk06U1pkVkL8s9WQf6LUrTEMmWJGBKvxwzI7S0fuIED": "GlDgkPu4vF3WTjTzHdz2Xz", "cfkJzvEUuaONWUQKupzCr9qIe99mo7rIubPgg6Ws4On7Yh": "sC13mucNgX1sfjdaVOU1pqOACfDlSJl79RzqZD23cmo", "UhkZFufJo3Q3ntlBOvHDPO5LKCYyRtU36iUXCPui22GuBNp2vOEBo": "YWmKiRhKUb5EbLSzAdgouK4FRRdA1", "IvvjtHUudwLouDXtDuFUcPwjfRw1WlkWdQTn41N7xtNKlcMxyjL": "zg1rF93I3PgLWoUGf38hvli5h3hbe1csx80MmbiUNBv918JBp4Hb", "dIdaDkI8uYBzqs1uBVhtQ4KtBDbdFZ5w3oZV2Y3Rmw2W4": "lYojyKcpqhSDsErcf55S6KlW9Ji", "Bxar5L10CKCDLgb47R0XpsgqUMzF9bPXBUkuo1pZY": "X", "BsEUm5514ZvEolFcnyPcPgQ1nWanyvvEn4Wp6b4mN95mDn88Y": "PjlJZcF26sL4PGWdRc9Iq6ldwh1lFMxkVuutus8MsUhqkqjjn", "uEgyUDZ02ueAv": "oBWFDEzb7c0P27vU1ddgtSorOHAXo4e1HJF1h0EXFRqxPFxCWOkce", "zWjl9vxUpm8entWUOKVLeEs8HuhXYH14yZoX7RmrAxOl": "Lwi4qX5RJMskvjSMAdCFhSPhtsphzOVKcIbkRfTI51oQKNcnVUALFk", "rH6QC3OYnxSS50sOApcTlav9J8nK5hnpG4D": "G38JQzaK5TzpZRH3GxvLqcGBAqMHqP0LFzaYs", "zQZ8N2OwZUAJUQxZ": "D68V9IwQPQAuUBbgXJXmssYNGF9idBdhGQ3Zg", "MuBOfRmsAg8IRsXoHB372pnnPSHgjYOz0u8dqZtEi2b8auJ6FyvNNCT": "FPswCzKMkjf9WgDQIE62qXuPe", "aCditDiKpZYbxJZPW": "nTzOE4Mu7FFOZQKtqviEaNgQ9MjXIZd334H5Xn0ZHA3fU8VaU9IjbptPXS", "tlxC1do2dEXibwn90n0Se8wUw5B7g7eU9aMCI9VHHVAB": "rjYQVdAgOmnGP9VPE4g08NROZdMFKfKatsUXl84LT2CTjZKpYkG7VLxnlU3sBPj", "nVEtgGW9FHEqjgl6wrUVvCNu": "FGMnqw7wXixPnw8BrcUFBdNOzOxwVdz0rOfLlD6035eMrVnXaO0imSj", "sELYmKCtSwP08Q4LlWgC8": "RAoB", "xGZjnYy4BCp3jqdx": "d9W9zNQkxqgLoEIx5WrIEvAgO1p6410Ht27u3qiHzBbbg9oekE", "vzjR48S5NnqooShsudNqp9wH7Y5FJNU2mTbxL8UrXVQL6K4uTh1DYcicNfxbMP4": "Ge1H9w6kE2jneM3CvdtgSdQ2EAOg9jbZPfZ3UW6IZFazbQsdd", "yph": "Spn8Q0Fkr4A", "EB2ScnyF2qw9LLfetVYovVfWbvoMR": "F5BbDgB74Hm9p6AMpYK4RVsaBUACh7ihjraHqzHwpLwFa48mTztEBAdEaY", "yHEL6Q5sedqd0Po4fRVxNZScMb9eqGwx1molArcpT37M1dMBv": "nZsoAZSNsDjD7KzX3DBKqCp59Jdw70eRxwAtZhtagbFu6lURb81", "XE4w45tA0hVOeefONHR07GgHO85ZOUfJDJnHYcimcjC2t72ijK": "HWmajpHhGwuWyu1IHWGNljqMCL10godYQNK5DIhC78y397ttsti", "E9y8oHNUZ53VXQQMEEADHzwWCIbXBg3KaP8o3IJu8DBH8Wp": "tMKoZ5OgGV1tPQzYMXLGpONgEblMOtChxi7IvhXvko9jTdG1DvlEB6ks", "fO7YfNkGn632hu43Gg": "GdkLrm5Rei5yxS3a1kImzTVPPdDupRMZUrtVd6QzZxSEkCcB9OX3LbEIcJLU24F", "PIcA3aV2pdmMZy15qR7bPQLw": "CCrQGDgRShKxJJdxvkCyl9IlnYcj1kpC8u4stBJ", "Tr2nLkrJedZNn2BhwK5lkglfjSafRDzyuMPNVmXqI5d0Th": "fO8ZErTCRiKlad1EW1VA8Rgoz", "DVgBiB8MQChnAYPlouTJxHWDWflRR3NXPuHKVcwT2cr7": "GkZySn71zbtbtBdHosqH4C81vo0YMglEYi5n", "xOAW5xq5m0KxaKUxEz2WtQY0yf7QGZ9Qh7cOcVJZv2VkJxbIx3y2r": "FDrP7kd0lEswAcOe8Aw8HAYW1Ed1SQH9zyxX8Zzd", "K5SRlGdqyAxq9AwN9fCqy2WfAOF3VA65": "RbXTrSvwV7E8s", "AwJbvbGDFwt": "L9FUMQxYLsumtEiLOAVWqnVxlwVvbHy", "KQILN": "unBkz4dzx8aYcQpuiu09hKEnpIsK03vn1e", "ELLx9g7flFxiHTXDZMErJXzabJXQ": "yavFVpBWD0MDJK8dbDD2L2Rka9fFVin1M4t9QcGEuITUW07I8ZE", "unQI71ujXqb9huyIccFYIdXK6wOKBYCflugwRM3HCTa5vS8f1HAlhk": "sdlzRZQ7wxbdrA98hStT95FJMvlhMur6eOd2Uaj", "jcDBpJG4fvCotpiaPqFL8UUtKykcopsaAXT4CKirdDLKKLDxoVXTSCqjCtqTc4": "tVzTtQOyreloJnk7ycxBHVrjSr7blMDtRCI15FA27qHnP23", "sCtEos8borghXjeoX68CWZKEZ7yrl2D85FXAjfxjb": "RPw6XyhTuQwGDHddZxnwdkhG4HEetuMwcJgg6JbwrguIL22OJ", "e7n": "AsMlG4eaBnIsK2VD4elxW", "PClvACxy7kFRHuneHZot8HPGXGfuGhoTMjQb": "jIwhTj6TnilpFYTffRznxtMfHa6g40HfsLAMSwD9n", "lHnQ": "JevLPLhb1O", "PDYRcXhXIMHIHBZgHYt0f7F7eirOpaIZKwfOPiF6TuJiweEBJ1ILVOXKxxcsTZG": "SqZ2SdY8d9UqRKVYMQbS1k4UaSvRKbmJReIRMXq8tcWQfuX7Sv2OkPi2oDsP28AAG", "pw4x8bQkhAb66fVyaQ0Ufnqw2iA1mQByTlVCXLoHRApZWRwRTYS4nZaHI": "J2cGjTZftLSeqUYA0KgKIWN", "Ov9z0SVLiwA79OvIQC7j2B8KM7XD9dd": "TrdRy6fqOMNGWC88Go0Em1zEFRixofGO6qpV9cRNFaNbzAqckIb5BaCezNHpW", "gSNokJasvQgS4WRIhYZBw24vUU7R7CfR3ErFPtZ": "ZICuMqQDH4MRmAp", "HRyxZscM1SzdHa": "AYHB5QnwtWuY6ceIJlxogZDaMKvMH5PvZwunnyzy4Anf28", "Jef01rUM5": "C1kk0AWdE6C7JJMmPWPph79jKzDpuLy11udS0mcc1en3", "AcYM": "OdiWfJxTNF6AfAHO4V11fS2fnCXiBvL0MRThGkgEedsyJ8TyGo167FNRZ", "jS2sVx": "nyHNtSqUGVspqwpybGkJ9y0P97FZV47cpOTIQCedXpFq71jKIt0L9aDS", "Uw8lGBAdaG1h5xFbpeJFC59B9i": "xMKzWo7P3KzDmgxxU31D2AGzEfeUVT8B5", "oL0TAfL6ndD8utrOjqDUr3bZuLsWKKbtG": "GsGdSEJt4dYEkiIgsfhGpPD7JGyZLfc0xWyIpuGKsCS", "mKdOM5p2TbaPDm6gscHyjp0BSr9s0Gl28yZoRWjCHdhF1sTUaWErxGIm": "hFFNMAXqW2vfJSvqJjOTcckAWgaAOpH4DXr91Ex", "Rrybsh2Mebqy": "GwcxUCfLOylLmumQr0Ng129sJrL67u", "JQk8FIPTEri9oL": "W3zGGjyfbsnDOn", "UitT7MN9oqey": "nsDWBdwTGiVo5o8Bi6G6Fa8sWMgA1wBPKjSvdUPmr3AQLC0g4ICL", "jGCeYqLFBRl9XCj3CAqIXbuNPdsrUxjL73GwkCrTZj": "GGmTHCRIDMg1H6j5OoQHM1akf5T4o086QncTpmWZof40RnR0SX1JrmcAZds7y", "zzpDuMuaEYL6L9YgYxfVi6Qr3WJz7rjqjUCnysZ7yRMDRCI8Z": "Bc9xDvdUvdHtf8AsLd8yExOGnk7qtcRt27iXv", "fKqXBZL7ePMDytrHEdB38Jms5UCXJ": "HABQMGy1EBbv2T2MLWkVrLaYaoIXBAirUKtLO0U8CChE1mDeD", "i6GcQ17XkBgpjtfuuGbsgXoiOa8d": "tW3hGcHqpFdUaQF90zOS4", "Zyx4UGcg0Knx4eX2bXs8kR1tNSyUPqfy": "Y39dU7TeatIYCw04kMwHM3AkmxYkAP82JmnvF0Fya", "EcDs0": "PJCx2ncAzJSRpUf732wSVXDqDvhGd", "nOQsOzra3": "aeAPabvpmUQdWkkJ1", "MCty7NWl": "glVgbrp0KPK8", "KpzuLH4Q70jEWsFSj6y6hX1pwJNFZnpOAEjJzYuhDb": "Dt7UKEOon94fVkUoe25fbRVcb0a", "ReSbhDX": "ncMvKGD3l8bNVHNTBZg0C0It8TSiEaK83ZgbZnNyIHj1tm4", "XWzlY2nD9RzAYakus8XkiNGHWiuLPKqOEyn": "nIoxbJel2xtPJPYzS1UhYKpLjuyYgi", "CfXHcJLHzBGUUWUb0wxQXu2wf1G5fbD6": "JIG1fFVyoE0a7X3vhzWPiEYWtlTUZ4g3vK", "fFPkHo36f6aj1zB4Okg40bjO": "cBvTA8h2EpX7iB8LhUF533x1L471Nri5", "rRsaXs36a12h5n4UvSrMHw": "IIskfpf", "rwynhQ5uS4iZDaZhZlrhmv70YXxUvaNrdWQv": "rgMT8RKv7X7qyOaMVx3rsVC", "CrO2BU1zhVir8UmPmVR1Qn3bk9KqmNZHySmCCe0eI7xa1VhCiuEr": "IXlqtNKJYOYiw7", "OcAFYR4YHXZzaHmEURQZZ1Ii6FNPWGZXKGFYLKP6RnR7tzPr": "Kmj9xvt7kJSWYIpRgwEcWzy7LihVRWmi9gYdEPzS1GRgOYsmp9IhdLLGgcfUiqlj", "bezwaImeJBvGcFMH": "SU3YI9T", "gf0C87fCz0uOOi1": "vC9dXUrOQMr3W3uE0X7x2NTZMTvDu6h2c7b", "ModrqKgNPPxnjsTKnCgS4RJm1yztygJ69FCs02": "kDDWL4vRZ477wFYgUDqRInN1VEH", "YE6U51OBHYu": "OafsVyVOnEEteIQa5f2aoboqMii3Tufqlj1UrMi6B0jW7QHRawXJG", "VsjtLvi55LhRmC1NMhxRe7oOkCz": "O", "Ra0Gud5R5vuzk2ZTECB3v": "pOSBCwlmcueiyotG5WJbE5YeHFBHj4WZGOnXWSDgJZVvkXxncaqBCBlkeIkWxvMg", "XIObm": "q9Ctl2I", "sm9sTswh7ceogsii7icJ5nHf74GD2WSJYgHidGW43yc5wL26DfXZqgT1G6FmIdM": "kzrvv4rzIxyXizyXYiPvZKPX", "BQvEvHcXRrOpDdI4l1VaZojkI0FkUwk": "MxRI9ldt3GYdpzEMFr", "v7y": "DGBa4NMlfTFK6vu2Wb1cshXowI9OktEMJK9ko3cQRWanI", "iZCRFXFt2d1YZs2gW8LpVAMPiZ4v3ElpKv7iXFnUBxxt07Nvenb6": "Ac5XjjQEdGPe7xPOzGbvUTg5JWyl7OJCJLsddlklA694I41A57HFD8RaVnj0jrKY", "dyo3KtbrVBRwCm6UBv7rSRG1AHPG7j8S": "rkHJVYEVRLNV7Or5Qrq0mz0jIoE01h3gXKIDdFmaTZ3ZXLifq6DIJmnBBCk3", "r9gqnyuJoQKKvvV": "UWn8fGT", "nTrKEihoSS2jZJNWau5ig1EorpQvJMWsr7n9ITRMfuy1tOiA0t2J": "jNL3pgEA2jY0S6JtHPXGyzNpRwcgKEPHxVun", "Llb": "EyEq3W9FKAUdrrEQmP27oojeiWmXUwZL6ffpFNQ9Q", "Zh8uUXpBpNS0X8qvBs": "Nmj", "GU9v6qMWFFqf750vwrW0dPfkIgc08Cs3qZ2LD1Awm35YAS3pv": "OHzJsChn6AN3PD8R3OUseOMufaOYebHJrWSrd4U7w0ePSkQ9gesKcA", "JnQJz6N": "jAjIlZUYkiJMIGw1c6d4BefnxhH6", "VDuI08hvtQHNNk8adq5Bc5H4cdfsB0xac0kG": "Lrx4kiuUJoDPpVHpEphOivCmB8LfuID0bJ4JtHqLAE8BW1DMVNuJ", "ti2UvqNdFHYP44wXO8ip9d5E9WdZMVU2icW7rR36jFw": "kMcpYgeUZixEkf9UR1IZm6H", "NQh6S0dlTjNR9QjpRaQUXRVk0Kc0Kv9YMGLoTVlliTCV2rAL3g": "d2L3vVXNsV4urZpicZ28JAuaSr1q4W82oPbJM", "ozos5ichsM0X2rvbbrlxuXx1pcH6RwJp8K31KOOTkFsomAb6B75": "ieWlyPtwZRMN1MZP9y", "ySn2AWOvUT": "rYBSEa5", "Qx3J4ZUEuHPoCQARJxXCI43t9DafTLeMomkoBJe9z5ulEGgkC6QAQH": "SrIYLhrkzNz9W6qdF380DA9FXbC0VGzrZyQMq3jlQ6Wl9vUOWxCSOsCqWw", "EO": "FlE21unMBptjxE7XTXa4kIBQa3po64GF2sSxNF1cAJvhnlhMjNa09TMBzIxt", "cq0IK7x": "FSmrIRQzrazlFTku05PelGEeAheVgdjj4rHKUGW6v4DJj", "M0qHsxw": "dIPmetZvk6Bq5uZgQecRn6DGqkuZ9h8Tug5Ryu3VJ3TSXT007EA", "l331nUbsEbjJD5gKt5BUXsMvpD": "iADA08eit1hWOUyYuYf8OvqULmdyp7t8mD", "VRfgeodjivAtZwm6CIQis5BJDqpUq49kxqCuYAfCdW4nnsoRZ2XXynpnU": "MnztNhMrmcDEGkeoC0Bmwv8HjG6KRKE3JHiQ3YVVtUbksoxs", "O9Wz0PylMxfCtbl3ha2zFqAaPVDxVDPwptNc3yP8QN09gY0BF44xYXpb": "WVgZJ2VjuWUcqlLIgIgkE9doyrjmZO0YTAyN3yuQZeTjOctBJH3sOWyn", "z00m5zALiY66n": "yjPUTYF7IeSPfVPUG4khckn7rDSQHYmKIwMJJ5PR7hCYD9KRIiljrbvReM", "LyhI0Rko73pBUMyw96uHnX4UbqZ6GQ5Gej0OmZ0tif1zXFSiYBfyIFqejGE": "KRZIhSHGNvRqQjz448wXDRVtcL32QwcxcSDZ1YfAby4", "Ihk2PX5UBTe1elQtFKZcxSrWfcPeukap8Q24hOFmlVS": "NVn6rtNRYhkzlul0O1kBZjT0m5czTeDWTxMvTwfjax1s9qUcjafdk5jUfv5GL", "NGe7dh1t": "LTAluULro9U99Wd878JX82s8KYQaIrujV23", "y1Z3MbDzech53rWrSKUNFHdcbgWBU7adKf": "bmZsq18NTyTkqEjt0I", "nOzGBKGIbRoSITIaPbr4waS3EA5Llu2Z0EZAxDWh2ICa6SFZr5Siu0ftyPZGo": "dRbQqBFTd3rXiP7bmsSEErNcd", "mq0cBNqzPFAgnR8IvbP": "NQIxBMtxCpZSgykUgmSFoU8U", "SJk9nVFeeXlddIuaegkCVozhuF7s9D2q6myRSYkA": "VFtcYOKFmxvc69euxCObFgThZCzhCwXGErxWOAVqHW6aSt0IemLvCid2kIXlnoY1", "sr4CN69DAXzpAt": "dH7YQaycOTN9qnCCq0gL", "L3wLNhpJiMHxxCNvbGaKczhbvV6crhCPg1": "lkR4VuVGI2ErBwewljL7xIjud0PSGLQIg34E2", "Z265hwZcWB2zNhVGn": "g8qv3eucJGOZzYODwIfROk74d25LOWh5MFIXQnHviglK5J2KhTWaP1u4A7c", "SYbbv38JgutMbSRXvnGpZk3UNMfQX": "G98Q4fJkzXAttrUP9wB4V0yaF9MtiONROPi9TXJVWkCZLwJpSgZfk4cqsNfTbGx", "xoZLh3uhyqOi": "ojN9DHTCAvL1cbcxDFGXKQFbQ", "LSNZ1TVHV1xtfZ4pRCx1Zw4CBEnugtCNegT7tZmdH1G7KrJuh59UZlbAvjURYSMl": "Pc2", "LHzm4C2orlHKbugvC8ACYDJVkChGPI": "iiQ", "yWOfK8eYJJh3B68wcTblybUzaebLwSfQcxAq4gQO1eG3fr1TFR9xFjewLqY": "BLJ7OSN79pi2hxxJPAobvKah", "zBPLssjZufViyK6gqXizRxv373xGCnXdwONgRiCw": "TC9Df9eLCR8bweF4ML3BzoOYEVVLOyNEkSD5dsMtmbuQicMsXJI4zh44BjuM", "Oy4Fw1wvw8SFSnYNP1beqtUJYs": "OTucyNTRgRjd1LNTIGkrmbxarKjyN3i224HJ6mCchbWcYHQz1OSOjdpB", "urCHnm38ju6GK3XqL7xqhE1arS1d": "oa7Vt1p70tsZHnWtoEVu2YXlMxVpGqmpJylJc", "IWWjrHDSiU1Sxw4O3Yyq7lKQgAIF2tN0WvDrO1TNSDrU2b": "hO6eCfBJcB5HcFgNtYqUvzZK8FwALe9bZbuU", "qYCmkVzO6HFkhmwaOK9tQ28Oai7GwELYeqUUAYIsxiHJ": "DwgaloPPjKvAznU8ZyG", "DmZRVy": "A7vHvkXDm7b840s48FJ3", "PxiDIIuLvpMrloO9IGBKf": "RvRfsfEiRFSYgYDgSiKzFlosoCUZNCxHwKN8FqMnGSghI9maLNDDyE", "dIv6Rv085ycwE": "nKSjKhRHTSsTdwN80BsQDzjUxTZVM18vloj8UmRApm88tIKOwL", "wlymenJbnB": "yn9lr6hvI2eWni8t7XXf6GLigvy0AcHZeYbwlEvb4NMtVa8QhAEL5osGgEnu7O", "RUTt2Lu4zoOmVHrNekBC4nfvYkMNNRYNB8hvZ": "shkpO7McEr43VytYZ", "sarn6eyx0j4ra2YvIOqqRLA5KYtIBijzTM": "XTQMj4DdT1Tp8mwq", "E9t28eHo2XmyJejMLbQXxOf39vdTkqwui2HRway5PRlyT1XpeOcsDqSuwSBvcx1r": "EFYzLvL7FQ0EspO1BAIbnWS9ocaPwVhE67E2CLefZYA97JW5ZEfc5FGaY0SrhjvS", "jvD187XOz6Z6dMzLHLiw8nedJ97QVFobAIHFjAvlCIttI2gOCk9urYF4B3AmBf": "fg345NyBDhFDmozrHbgvOEhBgGaA9LP1hk0RfEJpKYW2YfC5X4Q003g3m65xFKo83", "nrQ1c": "c4j5Ykhpmpok", "pyPQHAKDO8NiQ76LXuzGC": "lHXu33xyLDdzsvXswYVmpQOJGFudkaxXavqTEutO7BfPQDVwaeJ3IJ", "CA01liUN9qvvLvMvsVMaEZ4lr": "jx1RU5Pz3RlC7PoHctjLoejGTsLNR1U", "J5aYdR63HPKOfsjY4xUaoL1YH": "tWfBTpo5hVPUnhmXZ4QJN8543iMPRL4KGo5YDe", "oJTg82A8ODyIlwJG": "PRglDVGjRAN0zmHBv5zzGufKg7gfqSokUrBZ2bhkcPym", "wC41f4k": "Jp5BCxAA20TbxSAY9yK6CPrdDrGvNp1h9O4xI0HI7eKdpo", "LOmyA966Ou0RjGyPppp7gGX0YqK8Zx6ZxzAQMImasDtVLnzk2CBp64jEDhy87": "L0WOM9c0jBLKtua6iomELfKfTmTeNPTTny9RbIf0rkYpIL6JTHN4OnqyaQX3riek", "uAfh7qV77uQdTJbOV": "WlbBA2TtLH52B6mwWbb", "NZAtap3B4WCxNNM8": "KUHJJGrPYLWM2iKXiXF5jlpNSChFmY3szNdwtOEvtrnZqGE3dAL97", "yKUni": "zbp6hXwrAksDbQFjd6HLSJoEsP5PllX77YNmVbOwyFScuQQFdY7SfB", "C5CWKL3bsw9P3UKe7iA4BvPtKxctESHFMwugzEgSiOs45xMgpSplW7nzUd0oq": "tKesQ8UStJTvPUFxe1U6s7AOU7mmgu2kQRH", "l836OsXojgfTQufqKRQ235xMWeiPrMW5YGfwWXNsft7HngEhU790MtzeMC1eG2D": "Cfy6xC", "qk3i4XzxOts8o5dMDSjyiuMYgGyhDhnUyaRTieotEkZY": "WV1", "JwiF7S6lIb0eoip6adpbAZiT": "YXiYBIhqDMtS0", "rVrjM1ESjFZ1Y3kf3fwBRYT": "t9", "S8rOfwjR3FQFj0TBEMNmlFIqCkWf1eSc2PUaTM1feJ": "ybsPjptYRy9xwKrX6fmKi3qQiNcSJNiwX9f2pf223O9Xu5IW7KgP", "a9k": "UtTi3TVUOryRJt8V", "areo1B4sWNZYFTrGrH": "Bm8kklpp3DninQQdmFnWvz5kq4kG1uAkJSm4lM", "WUKBc3rj4wz9uDHf4iBijYzrxAnstBHK7bnXfqm9Fzt9Ot8xzqfHxvDuOd081m": "t24HcP25mb51QaXjllNF5u", "PzMsG643g0si396rf7CkP7p9MU3j": "mkyIMg9oGaBjoWHA9cp1xPcfrvUK2JNBlNUM86P6", "f4AMD1H6qkWIbtzKFRVAXwdFxJDxkpdJdwKEDmSijfNPtyjKKucn": "nHjknP1K", "dfRG6oLk93gNAxg2IOBqXrt2lAO9BAbOCubV7ofkl9": "DT6wXzBpI0rc4QNJiCb", "dtD0Wp70r8BlX1w76Lw2igz0JFNJLa8oxEIDPgsX0YMG6NIEhKG": "LM4F4U", "JfAuTf6jVqQ96W23Ux3ReHmNf": "HpAhJFpK68zU3MJPAI", "Sa4kpd0QHE7IJyxkcBfKZ9Z8jtegEDkKAr3Nz9KPEvAZ": "B25CfxptS8hu2I0D6HtfjGGfXAr", "km8k8cDQ8Fn": "QqUwNgvdz33CKRt9JaCuSMNIgf3EweurUqOmxa10nBpjh9L8VnISChRh8aO", "W7Btg5aVyJtW2IKFT5Dn0A3gwTQ9fIqrLKX1OSSff6Hw6ZJF": "eTFFEF1IdMif5RJ4MJ14rG", "nZ7ahjJpurGlYEV567geo2QsIZ044HRVnkXn": "wB4hwAiL7AH2j9onMe6G2X", "lz": "TqOC9aW6lOIMvhy3GOIYYZdWi8DrT47112N13K4V32LEydsXf2bRz", "wV8I3J4d2XMoQWUmnLNudkeifhtNfRc31ZcERuMPzKlW3jtp": "f8LvtaQmbTVP808DRdXkg0zb2oCpBhfstvYeSm9MiAbMtmkpMbK2z2lbOc8ADl0", "O5AtsRFOHLYgegNiwF2dHS4WBMxHMZCD29Ei": "jFacWUeuwWmVTw377dj2J70gwE4ubHW7VtLiszQsd", "RQBoOSnTT9dLto4JK1PpujuM4IOu82BIFEfetj639ZRYPo1aiQdGLbx": "DLiLmQmeBp2PgHmJC0bwxL0WHIKygHpNN9flWbTJrgaomTyU5S7goHxr", "DlAshLmiV5pgp00ehiiscc3VPTze1tHiH37cV1Pa920VhQtJ0O3ewFrV0": "cJgLnJ13wP4lNAXhRoFyngKdYxv0Tv", "fZqtYQHA35UlFLLz8VjoViB3xCRNDamS": "v0qz", "GOzwksIJScck1UixvQw1Duwub80wPCC2KZLlS66onQQIrvbhkzasfP2DNHx63": "jNx7jUrxQoX", "CPfu1lY4SELY0": "Now9", "Q54gluWZBKi2BDX3KtIaQc0Xn7N9SQqkqBFaBBzm9": "Fc3jMXS2GeRHIXLb6XmOCiOxd", "fOQ8fSAavHsSj01GX": "uBU3N9qQQFpl9umux0X3S4nwmQwfT", "e9Yy0dTkS3F3SOkEq7Bv3WMKHrIW40Zo8WE1saW9mVg1zYe2IXyUJBgdtxh": "TAN1rPwknlOFeA6BJBZbUMzAAt7b7ex6U", "xsb2ln7ei8n1gtNMXzgPpBbtEIBOUv9IHxUdVK7j9s8": "oEPoWXAeLBGVp70X5Nn36xGvZn0FZ", "kbfEBQxJsjucktznLvEvVJTKMyr3Qe3MG7fqV1ejO3Q": "icTjLop0Oltl3gYtUXLTy36gDuMZNzApoz7b8KTC", "Srcvqrn3XOSVIZLdoE4n112YDc25psWp1gZ5OM4a": "StL0aQ2g3DHvqBdgvQdU7nNvNCdugq0kzcnGDJG2FJbwBZsjYx3M7m6dm38SMUk", "uBckIjhCAq8nOV91bQn2M6WoK4WAecRfzK40Cq": "GIc43ym027", "Ft4nAcYdxAdyTBKsqvNs5cWKdxG3hyqSLYkwqY4nPohDUR495GU06I0I6a9W": "FyVlNuf8G", "rZdCyt8zey": "CEt", "iXZOFqmvqJTBzgBpAgo4glwSXnCSB0VSrT8qxbtyfS8RQ9pEL6o7it": "THoTpnOwZpxONefl3ccxuY", "zsXirMXI6bE5HypB3b4p5YkCXSJlpoCIQVDHpSgrchjpH1ZJih0V": "VFPjvWXP54r", "n1zzlsMECJZ": "CMKCKRLXZ4NZPgceXEk8", "PoEZIfuvQoNWfsX5lfXKonoJ1yPdfGplGVQA0geORFigCAVeVyzU": "ovXC2cEwpPpEwsUiAs3ccVp1Xd4NViWQNTg38ctD8Li", "S6btCm5hXqJ9snE5Db6WvdR6pFRGeuAjlZfxH": "UvWhYvI2G9qHwUKqdzBGPDtDKUyXyUCLWsk1RW6En5mjuSX2vaoBnhw8rNFR", "ogBYO6jqWTEJWF2DEp1FA1KuwAY6eMKGrFBo4YUop8xRFFcPIdUtzgwZ0g34rM0nf": "WSn0DF58gmzrcc80fx4Tpj9DJd2vbsQum7IaXYMHf", "DSuYg0y": "xUx1CGXdDZBZJeWELHsdNqIn0W8AOXqioe7SbtA0nuCu7GK2v1dNmuEGLZmVj", "Pc": "f8sDfFLvHxE8ey8s97vnFUD4vRvkJVmhBODCD77zp23tqLFicKh9", "Ec2XtHbsysm3GJRlN5yJFxxyhrqWPtmL8sOhz": "wxXc40NMpF6U0MGqsANF1QEDfGhTIeSQI2TUhW3G0oxHjO9hWq", "wBE7Ma9Z2AwAwH3wsu1UYgorb3New7NJqzZw4FR4JW": "mvahgHIeTLDqUEfpnFtaNFhN4Ro2fRaj7ByXeUCGhrODLmj6kUcqU", "ucp7qIczd1C5WR9KkZHw7xpWJMS9H6mI6J": "g4DQqTlLcNkoLOFxj7wVii8NQHH7DmKh1NzEQmunUDZ6vTPNRp7hly2l00iKDlEvR", "u37PzI8rK7mAajkLx0ptgiJMQi2Eus": "EqihQoGdTn2XKUW8YZDuw91zZcmi", "KerU4doPEaJ1JZhN5EHHV1iaICfb": "gMI4GpLTuW9yVeRu7uBhTd4KsipEvjD4MvvSMbtLVmjtICJIwevhFOb03LJkPySKl", "dbupQCnQxFHfuNnun0qCht2vGOBTjE8RUC": "oWuY482R2dwn2bRYSvmlLVwmL", "dhQvY3rMGbAZDQi4XbzM9DGSVW": "bNq2piAuvVMWpN9Phar450OmV2tN7Bq7x7hnpLtcGB98", "Ov9szmonzHux5whr": "jndlgqiuN", "Ry4YXD61uKxcFfiqn40nCfJJGzAXFdFFkblQCb5x": "uAn7rnjKaDDxt7wsBxp4dmNsy2a", "goEY1aFVP1Y5LxrEH6WXTSu9QwMl": "HXFzPRcICRfUWD3EraLb7XjfAMpOsrlUZp08lbYfKPUv51qmPq", "MSHlvIv16yxZFYaVbbVs5cAgt7JXZquXgrn2ig9qtRkVF": "Fii5pJeFMF5siKwRSWmJHqbQm4SLZ5kG14D2tuz8yqJZzzsf8", "hF5kKKE85apbFh5": "VrIVOyKzPXEX4gDs0j", "ZQgvGBKq3oWu54lBH6m5peHMjZvPeTHeqT58Dlt0kQhudPPfPNCnnbEDzIO": "qSiHDpbUNXoykEjKCyg1Exc7JfHIzjT", "Dnt4ZBcWzxqdBmBfVIfG0y2C2rryeBBpqF6IqR28Q6H": "r4Xd6uNoav1pyieE1U9", "xzIyCp6xK8kqwHw": "Bq9RMSVjS7VqHuTAKuN", "Hun9T": "hXfbG27HWANhJ6ZYJYva2YhywZUH", "z44UqIAYA7UaDbFAcWqmEpRy4dFQZUk51dJwMu7Wo60VO1hH": "EK3bBAJx7MrG4RHZKU6j4MG7Ev1pw3YHkhQsv1HIWuoQD2yV7eEw9zCq", "bQEwtzfG5t4cf7N0ojHQxtqCuGaWPQPb5qdp9BaprFMDw3Ey": "CyJCmtwtf2UTbBU72VteJmc9ysnirO87PgwrVleoxDa77D37MefWz", "zUps0m5RmL18yVfqbm4dlA9y": "mrTK8ZSWrSEECNXczxbi5RJISJ0HlSe7iQq6ND0X3ctYRA", "mZFvliJ3pP5nCrH0wzAyKjMMK4sv": "VnJlWGzjugb9LD24WUWAsSG9U6cizVpgGH2AA2FtEErpE0PwGh8vHcSzBQTCz", "Z1MzC4th0deDoVvf1wqjoeFucaNgBH": "upy2KctPgo", "oiU4fdCcGQlPEyUNeyyxMdKp": "aIjsjPigJfCGuHIqKHIsom7nZ1M86N", "DesQ1f7BU0AePhsYwN5BQS9XuvYPZY4pqS2MMROrn1DAj7F2g9": "XkmGTLgGKAX3h9MoKMLOZQqtbZMRA16urRSTmeS4hS2VY", "LZ": "Tq", "gp3HM6V3y9MCpYn9vViALzQqAwcYOBywsytVrqPBzTw7EgrpVa6euZCj50H": "WBtmd3GsyMOnWDX75ZjvL", "KJfnpCx45UgChKgSyWDK1D6ftzexzKqwMJRjvtjaGwfi": "rk33Rz1i0kMFobaPpK4Qn", "PaaZmmecLteIC1eycwjxF3eb4w9ZCNOaDgc7hnNib2CQoaBBXjpN4G8ncNxZH": "VkNQW", "Q3Y2IQwW1": "AH4ut6cE36jif7meHnnVbeuCtTgQKJEE98HvAFe1TtPxDlIHkP1pKLBgg", "cjM8jwJlNBDN": "qMnDsmCCXRPkBt459Hl9niZapiJH0N0pfJOz2zbUH0iKHoqhw", "YhgUnfj6Qfte0ExvADjSQln3DGNV": "YnFCtDuZaTpZF9uxqZNxK02s2o0T00", "vMMjJktb8Tsij0mZyQbCpovTrCT8a4aQ0DWZ": "y79JqO5XypX86nQhg4eubX3RGOYHwInqUnEVrrAQjIT1", "Q94YLMXgh3lQfIXhSIrBOdJcCfL7JErdHdW68hS": "mAd4ml8aHrycrZr85mVV2CYFI", "Lj0WV": "tFqW5BCl", "mcqTOedos5ISuuUP50E3cbb44oU6kFtdW4ZXJLDNOdExP9UuHKKE": "LRy86fVpy6fsJUl9T7GcR84", "cd01U0lMKkLSexdpLDouadazprC1zVzEL3SooRmaisd8mZjJwVs6JqAcbpkqMZ": "DHuZKWFtnjKvsqGE8X8HEdmKOM2hnJlks", "PATtrEEQjHIZq6Nftxic2nd334yi3egSliiSTBJJxngF0tH6bZJmVDcZ": "OH34XGe", "czUWkCjkYiOVS2x": "ZaDv2tDCkOkVissy9liaKYi5zBJGdEpWFGd8YCrrv6I", "N6qvatiEvpoihFU0zNXRQAxZOsgkt788ebNrduUQqO2Wgd3OUlhzDXsqosaKtK": "RN4IknK0tvnaIMkcL3QH7XvqAGr5mrESc6CcoivsutvMYo0z8raG0JHlb", "nHEoGIOMgbSIodGnRlhpOqJ6f6yrRLlIuOc8JEahvdcSVB46eoeatQ": "Zn1", "cwI1cM88sH7jfxUm0wPaFUZUKpJ7rO30": "W", "cVgV4N": "dQJAdkABNU0rn3", "RweSTmy6T8wbAMMbOPQHIsErU0QoIJFW1RF": "BvTVQZwslEwmRm", "Kgc0fvxnVwjogNobT1FebficIDN": "kEvpUGExhpPNBKJ8HlVYrqD2X", "XXikBivY6TqIguwmaWCCRY3k": "PJgpmcbVxMCQnHnhWaHV7w3jV8U7ZbN6BXt1e3ozUvUrjtkvHkZ6", "FKj8jPUCTnlS6VkfiBduUxTYLeLsFCUNzwiAJniBHJ9rLNBTxVzKVzksxJ": "fZmTgYgb", "vrBictr8M5fbTf9YTSA1hyl8gzHVly5PHOTlJKEgcw0ukp7MhJhGC4CgL": "qKEMEj6PYtDCZcjwir5W0nudMbqLbao1Kk1PBmDuW", "c9D1oCPUDJ8dBrUm6Oer0ZmgCF9ItWnIFdAbQyb2FaS7UhdGEF": "kenaqGcBIaGfSqxAytGf", "mISZ3gtz1iEfuCzTqlmQfz9fjPaA": "FMc26KK1U7DAVxKYYNJ9dtibQbxZpfuzdCZ2FB8MMzb", "iwEJMpCXxg6FBdcmFmpw8Sl7vkMlwu4Y2knXNqDMsd4xBKe7": "LGvnfwO8KFliyukFH5W67YEOccYJEK2XP96KSSI", "HPe2vGl3kByWCHXiIQ0sfGj3yx6oC1OzCFSHKueGIf2nqIY3NpTbH": "Y06JEqJp8a6rqi0POwsq5PWid6z7Ikb0fS2LMT4xVmKJhTg0C1uLBTT", "ymfStUpy3lFTgOSPK7QfYYzxuU2SOGWDTcopddp8QL": "HgBSYJYjMJRvEVlsPk7ZlBxJ8UsjG5s7dkMSUgq1mLO8IHEsu", "fQpO8lDzqbxc5ZwWZHiFId9exr99fqdDSkeG4b25W": "YAgyp", "lq61Uva3VW7tPpRjkTbYawy": "jA3wJAxqDKVzoO8MPHbOp0Gck1ROBdEsS7O98hKpktyXkx5b", "AUrNt0CWnD6IytS4pbMCy8x0CB8fRLaITzpnHANmvd3FhswGLp4IybuLIGLp": "EOiLPzSbXWFyXVJwgwXoeD8aFB6Ne", "cSig7Y": "GyEYgmyZPML4aFGkbspttpxo8Y9Vjzu8UIcFPg2Unb27uIhfCEPS3Kokr", "xi2k3": "oxtK5QAdTCd9oFdWIZywbGVhwYv3V0yTavsiWHlurx44pheEU2TBZF4JuQ1", "lsrCRExMtGQOCzcnHNESalK1wG52fmlZoV19723XDjdnwSaHjlIg6Qu4bmYFhe": "buJqhN1IeWJ8hq47iQ4E5VzeKL5FBLdE", "h42v0": "lFCi3K8vXddLIKGYNq6nKF0Iwf82Xvz0fT8ohRfUODmhzKkUR5miB", "Bws8WmU": "MlgEQykmXxD3Ud", "G5P5OLpIYRXP4nzFEnS4GGVQ06xprvhKoe": "EWUNnCby6bE", "ESNtOKWK99TKQaM830fHdb6rpH5ocxOJpZfLptn1AFf8D8qZGV5ZqQy97BHT": "Wev8gLxyGdx8NzPX56vBVBdiBYBdJUly", "smfWyDrv909yxhJ8sZQjwa2mTfFWiufS6fYtMtpM9vOkHOvOXijPpHqUOSKGH02Xl": "UNGj8tFFO5dKkOb0YYzPRyRJBBEMyq4uzUe0v2cyeX1c0TENs8o7WKkVamG", "nnFJlqIeCTKS": "Mc2qrvv2HqkginLIPuG7sjuSEUSCDNy", "FvaDhkPxsE47Nf1": "Jx", "G0Oz5wFOPdEuNrDpLVrGqaXVJjcDVYYtag9QotUkwg3r3m8Geo": "K8hUCSkbncONMv0ecU74PMp0Ih2vXO5dyBwmtVkldz5tJkXuzl4gN7", "xtsPQ3XUeohVMZVWyfYzA0OOp3twTt0dWLyp0K": "oMyaLyO42xFmhgTfKWvYjs", "k5mX1X5WaNqsJsRb2kmflKYkC7NRxtw3VGr20ysX5y6tID4j": "hW5P53FkRJb", "VsaqBb90wA1NzHYzsvzV34BTkyM3QIQgreXALKjwK11OH5lNyMY9zP8q4Ib0I": "JTVLbD6MndodUE6ABl7zXgoy5Iaf61Yve4g9UqX4QAYZNCBSJ6waEewGf", "PPEiBluvJqPR7zEEXweivWly20DXhwwIpDgy6R": "vdkONJPoVaORZjPIG9EBdHh1Em5MnnYtcaof21LmWs8", "GHNGhwLjnM": "gC8IsSV12TlCivpOd2UDT88O4CIlmYEDICvxLbAhBHMndWEiKVPGRRD", "jOMdcrCSCPrVV1X6DjbeUCNXj2Y17Kscd": "nDFnNWUcmdmgAWi5lOr4kbDD6BDUnWpGfsKf9peAyY", "mIDrMsOG3r3Rd4YufjsvUPuTjuaNm": "A", "NRzVGplw8KEXr8hvRzHjH5jscTq9kiGnDccPzk0wATEtHG": "trm", "p3aElE6YLs3med6hHLt4uQyQieM0NnRYNMVnh3BGWsbJHqHi": "zOZBEB1dNs6TmMaicghDf40WMbXSPbIi7zMfNwT6fPbu9bJWdSlfOrn0vU7T0z", "aBiF7vAKFTMDUc": "LpzGXjxsqch8nJ9mXcZnZfbAoiKo11r4PKlJ2pLza7gxH0vjcP3KaCeMK82MO", "T9EvEg": "TI2VxPXNzHPCK4fOYwapo0AHYmliKDXK05PAro3MDRcSvoPKFj3K", "UVP0wdhkxgJNr7oB": "CykaznP3i6nP8B3n5cElVTyVfWOTXvaNbQD", "FdrJCqYom92BiErEcGPkX1MOcc0EnGXTgM4Gk5Vm9fc3Dsk6kAjkuD1": "nDzo7X5F3xMOjXObOBZswjVMuzWt8", "Rso9u": "qR7k5lYsOsZ7EwA6", "qx7kFlrcDvaUXDmT01f5iDoAnbdwqv8HxVDUUhM9pI1D": "KQ", "F4": "vg04adhvd6gn0ziw7LqO9wiDenIkn5V2bt1zYzbuJuZgOjttIFUl2ff", "EJPkY8wC2woFGZD": "ZFlvoxV7IyAEziJHUUzRc5VSz9Io9gJewge3GJYxjuC2aut8jsPWI", "wbcEzL2IR4zA23dI4DIGfzNp0D5ZnfO8iwThB3bSvWpDfoRBsdMUZEWBbWjR": "BRY9BWIhR4kf4zj0L8406zpnioDilVhksQPPZmgE1Us71sLeZMsALEyWvr", "ANlQ5RH0sRyfG0Ebqfn": "SZuD6ByEKYSw2rwxuI4NIAaLDp5Ruq1428OWeIvq3gfW6IdXnYPo1", "qoTHlFoZdsXgmChHX6DR1R5e2qqG4": "h5rtYNtw3qkKcMCw1MpLt6DBXqnh3xrlURz", "T0rHuEnQ2Lx3kbhVpg6zg3WwvJFUClnBpbq2ofJ": "DEMcKR9x7DDcd1KccGSx7XULPLyt7JklLPFHCpt", "KydjRpSCECqaSC6EuwUI6kzfmKtseODC7XJiZkbjB": "e9Td84de0hcivOUobwWcG", "clIrjSV7ih2mdAakjIL7sRZsHAIFBlqZW7X3B2FGHLnrWJkO7900T": "JZ5CH0w95KLtHq3RfmZpyJ7LfjDhFSVrWksTRWgx", "dfH32L39LBDvp96euoFgMnfhV0y": "udCZZdb3SOzhRFAv8OQc", "XePftN7Igs8atiTgc33vCLTKhJcBnCXkNUlVPJt": "vK22nHSur7tFrDGKvsKtWaIzjypdSjqARdOF1o5DZbzsv8AsHDVfnqQVf", "xKZERzbMVp": "CEWBwhvROH83nwaopxSqvkr7zftNVAQ1srymnDt2K1cOf", "aB2W4nbMOB6ghFuJAYN7pOLkvBl647a2jHG6U3So8XdUIbmQwl1oslaFd37Od": "xReemkOKg0S2agLBPj", "bQdisRxSxytiBqhsuvhwvYVRm8643MMpPXPuS": "ytCWfjA8IlefkSyBSmkwIIEF9btBrYvCgPqRqCGPRJw0g6", "mJf2kJDlNdi9yxPPvvSGsYrLQe2UKmqZP6yu0U4ANxVNEQDKjQuSqfUXd": "I33zbkWyL3MwCVGWx96", "WMAr6G7HOP4NvsqvsGVHmxDvwsQK8KwW8GG4VajVCk0hfjdZO5au": "b2dvpQzH", "z3paMoSeOL": "UtbdQQP7K2fSvDUohqK7vMQfCCyr98BaP2rprU2FT4mLxb5g6Yk9hgNw31", "XrVUCAtECOJeFMtaITeEV7S8meKk": "xpRUHR0aS5xCJRyhuxYSYM43jkHYWuVBIUmImaAZwsVFvJ2gTehERyDgaJb7EMWM", "rwicwPJHgnRoJso5vD18b3M5XV4g": "QVYV", "W5tkOxkGOg7PjLLa7viybMJHrhDX": "G78djT47D0", "csOasBRpB9gK8LOibKk1YHZRjcn9Tv4YgE": "Btr7cr708nKLqoykBFFf70ssXY6LXGSRmpxkAUAEHJ", "SrZN8k": "muoHpeyskH8sem1rz9suCp6sw5Jyk60nnId31qFO1DwrQTTrRuC1wl6a", "Z0Sldg5VkmKnB8j": "O36KVXBQiXBK81n2gFrE", "g8JuSc0EV67YMzMgQV5cueKprtyVPFAK6X6fl": "ceOfZIlBNum11", "wRjsNilWG9J48USCEGHpVFZjKdwrEQBEmoPAqPcBRfA6J": "SEq4u", "drmcEQRHi6PzTZiSz2GDBZXMsu6fo2RTCCoEek60V97xRXWf2": "ttSg5ajcubkl25eRT8xajUfZUX2iUUBcLO0BSqR89AENZQv1v9yZIqvWH6Av", "roFuxwTdsmTBD3D2VAxmGkjphWVHGzl5zs5S1PHwLj3HcTrh4QgNQdIjjQlJl": "tskfPKPKrUEXFOV6gfb1GPU1w1haYkTm6mfHgue4", "xWsN0TGzPl1MUOjp3D1P9QnJWyxW8AYb4nIxW1NyJ1u0": "Mn", "IuQOf94Y2KxUQc4ja0qUQ7": "xdAtNLgPEQCmpGS3YhXVOiiql7knRkyWSOjr0cFXDuPY3frpKsjoGkm79t", "SND1hCWyWuslLUUiJOURgAuEeVjvPVfZiZhpBBSPYxiXeFuI": "PrLwrA", "ddk9VdB203MqhirJYENIMxIt8EDrwOAaUM0zhY4WhFiElM": "AK35Eo47kGqxocAQZ5xHTqOz5tZMs1KVk1udqUbA", "fCTDrtS1YtinOos6AUGvoJAHSnn4": "XCYUZJF4Ra877C36ViZpEGTsmme6SrcoChr5YjRPds7o4a0iVE5DWENGFsHll7OeK", "ulAbLAPOPPF1mAVdDkOjnLB": "T", "szWfHS7N5zEufJbAWtbJShqcVBcCWpqQ7cs2n": "FF3MMBIPq4ZKzFeyORe8RI1T7ju7bHjNm", "b9KMX3kL57oFCHK1rHln2rcBEg78hz4pfbHiSesCxeHktRQshXW19TlqLFxovQb": "pwnmM0lmpOg9OBjB8cyvPT9lYc2GkMkcXZ7mM", "BccjCISREGHl7RsaFUVTsxocYQigCEWKcGy": "dZNz2Bu1ZOwgluBOCwPpQKLMZ34Uzi10UG1IqbhmLdfA3bU", "hJXrSAaqw5uc5K3QPLoZJeSj2PmnituP": "C", "ye9DkZZfnJq0oCks1CgUW": "eXNzgg5zKa0osEzEaSZASQaMK3s2brHoj1XiuBH", "lj9EThdAqDapJslk0StIBPaLsMp": "ix4AI5fl8UZFSShApxPRn3bJ7sG6A44d4Hf", "JL7f9EmPSYoKAxCSeV": "QBJgITkFL", "H2YNW4isPkTzQvbV4vaOzGc0g7uiQNNXBejyhMTJ": "YnPmEbSt", "rALEkvdkEZ08ZaYj4hSO7o3oxbbApcT9a9cqVKquWJ8Y2I": "YNRkDsC0U6uDDVU", "YuusvqvzITtDsfFPYfjiyIrwc": "WVjzlo3zkRp5iWSAnUllffrQGre5vKqpjaLVGdWH4CajkRUx3XEmm", "hvRcW6": "zpNCXDDzJHbcIdp15reL4ebXK19p45ddOXZksvQuRnvwjASCp3UkPKgLzFqfjas8A", "HadAAV2ZwJW7fKkfJrU69tYsHnRyWuLPSyXJ58Z2H4OGqsRm2f1KlVowdLm": "e2oB7MWA0nzpYJxLa6co04h0Usg9xqtFEUl8wouH", "RXeuajqz7Hhyi": "WU4xx1iCGT2Ngv3k9NMVT4BvXL19iZc08p9TLqpb4O", "Kqb6GzaZ0144mOyR4pFFQ5F2Ucioo6yirqiU90iJBjdxTsEzCvKYkUD": "GaZ", "mvKQHSapgmE179PSme0dPlc": "YlaDCEJGkZfL2rWbFejrdGOAZMw5Vcv9kNRKYrkJxSoVKmioL1", "JHg0159G8fDduKvyqaMrj": "HjW22zVz9xm0SJn2PR4HEzrV5SkFY4DCgB05fOKVGiN63WoL", "wqkuZWHP54aAfXIObvN3drNrrat1mhml164Aq": "KGSiacfdivNc7Tl39qNoFFYSjTsCCZMo7GZNl3D", "y4ElUWbh1YouuQq531CIMpq4za": "IT0zWD2t77xafnmFxl5ZP5A", "OwJhnBJTD4Wykx7a9J4ODzYsXlqfJYe": "TgHEvO0pWs67TgO0C3VZiLz1bMJf", "Qx7FkdU3Kd73t2iCbWbR8z": "ruWpOc5r19oEM755Xai6fxAyRr9V7gDUNPzEQMu0wRglJ5xWRq06C8k8OPDfVT", "gSkMXz0y1ybFZXjCkSYYBR6msK8bM2h2oAjoLoH82Sbo5RDz9c6Uxnzi9cZ": "qmYzFE8TXZeOwVbyzpEm1jeZBt5K5xNcJEs87yNcdb", "V1EKbXatQy1ENkZWYAgu": "M5Ri2SOQErZgYghrZiHEBsR2a175M", "kngAOVZ4Pcm6AjiBuvPCmj5Rt71s15qpWkPrckaAmNrLs2gkjJlImwzNLubv1SMx": "MxV88iqQCiWcO", "AqFWSyyMc7w1jLNhxAKua75llyj5uxdwgqo8MGTW": "q9eHsOhhLyk1jn", "LOj9Eqied9dVmtmP0f8AfIGmGvM2iqROO5": "zof1j2wLuoCY85DjQQHrNqI9s70BdpC29XcGLkrlEjMHT2IrI6PVKsp", "CUg8ZQPly0UeB0xlwcCYbi9a3ibHR7qrio05T2d": "lZVYH3IW4gwr6mbvTXlflZU8344xyJsdkwwRs4JJ6RUSU6o0Z", "cGZ6SbTIIDtU26lGX": "oY5UAm0fKFTdWKBQHZDDcBSBBPXEE6Qyzjvr50Vm79MHp", "mLg9J8kNSPKaPjoFfJ9K8SGPdoIpjRYNLZIDtV4": "D3ezFvceRojHdXgxA2QNR", "XVDP4abQX": "bAmJaT3ikBrTHI", "LMdQVgZdbJEJyAeGNsty6zWaQOYItAp": "Y0yDj33FEMaOxnTCrTXG9ZDhHMfA5KEiBJzAfYpwjZyglEmYIX6okVXC", "Daw": "toG3CDqC8eEillpVYXUrp", "dkjA9F4bJPJ9VMHODorp0QdOEmDpLYbxcgjeH3mx8mWudAD4q4Mtnh2e": "N6fSzgvPmDYJtfwP77w6CpdggzfDPpt7m6", "m09mztTAypbUWHG0U": "iCsoVm4e6puX", "lIOwDiP2B85QX9val6mTzN1TA9oZqCF11j06irVr7uVWodJpfsjU72jQ3": "uZj8iB9p9cHXCWrApeyGLQH0S1QYe8pYTtLVTuyt4WW9pc6Wi2X1K5NwYsfgLHSAQ", "WqyY1": "CeBNBN5viBVwl5I", "IPtZD9yWocL43qqNdOXuSWUB5n6nWrqudzpcYHIEQTnA": "U25YsvFpQmrSTnjixjSCeokUK4Y6q7lK85cFVZwIBx5DLtIAjWr", "pKD13gxqBXyQzeBn1JJfq2aZ13sN4mH6GcIzUZ0kOSf4": "QHPJg2luhhLq1yiamiQlQxTW05G68Mx5S6cvowyFspV834CVw6wMHOn", "mGyEbY7ivZif6zkbIgol4g1xB1if": "kdPcFki68QUFcIIoRkySQTFVLkHFRJWQs2vt", "EjevQ6yrXd0jKZeg41D25B": "rHBOcSdIfRGk2UWDB", "CDM1v7zANonDh": "lPGC7W5onx1K8pBaJRXYLBXUZ3wz8UVyCa661", "nf77sJ75STFXl": "VvUoQlKjy6t", "m5cVhJh0DY243imct": "KA1mZ0fQrCm4kMgNsypl", "kn3WwyDajkSOITAReJpgDIPssfHQFmeJ5xft": "LWfq5t83SECQ9CKZuc3KR", "pIacL2qFVfYYO3GRW9a5bXUlmdi8ZiTosBrkJiauSRrena2NPfpG6JuXMm": "yuvG8zvDVoDJgzN15AxX2KQ8KWvizRixJottxeAkRsIhluA9lyFIhKgz", "ecRKZ3uq0v4hd8ZQgTLbz1aGazXGVjRuvTzR5lLGcO6iT3ZqoPk": "dy8AAI1fPBNjDhl43Eg7YIzUvxQDAmcoDEeBjx1syRfZt5tqglW5AYO5rpyBm90t", "Gzj6rTRIMuNeOefX5E8CQm2xKmlZ174BGWt": "TE7Lxp69VoYEnL0t8FnWQhYE3ng86N00kkKlr", "c8qi5MoI1uqJBV5h4lKVUMZZDacAzKV5Dg0LwlyYw9IsRHagE1zRcwit8r": "A3i5aJq", "EFXGmwL4EXB0CEHXeY": "ymJmRQpy2z4lIw7ZLFlJ37LG7o8gBrXC0plQvznxnCQGV2CH08ao8DFeldlNTp7", "nKOixRFZZcnHDXbu0NqvDmADonh": "Gy8Zu7mfMN339pjSrGsduWos0II", "g2EAIsFABL4h": "EyXOS2RmmjVSoPSUpWNE2btS", "AvWvsqdpNUJq1eh3xCv9vl": "bWzeVM0Oq7lipEmZTH6Wck8dtHi0MrT3Ux4k25cF", "wARhs6NrYu4LDdI95YLaVknYCqbDrRNNqbhW7yDEtrkY7MnKJnk15gAdzeaZRa": "kYudoLe0CPuPfnfyKSBJEtrmBA17e2oZ7rVcTRz0rHVl", "SHQ6cJ6TAmBJRcg8eP0HBlCzEM1Ul4DrEwgWlQ5Z3Kym": "ndu78j9IUTfaWlTx8Es1ttNrZjiiZqWleTE7G", "iYCUkfy": "FG8HnKl2q9pnNJWMQAafNzwmb94ofUCVeoo39ckiy6pJyPR0", "IRkL": "ns8VxmQoVn6Adh909lT3XysRjaUGdPXmLB0Is79cYljfbZBo4rE6TCeML", "CsndH5rvyTo80tEyWrZ7we7": "LbHYDDVF3uIenoFD8", "n1oPcgU5luDOcotgonHNtQt94iS1BCeVIGZr0lqm3o06ZLQF1DXx9krZ6ZepRzIm": "JQftbKKdHst9hkzWf610L1CbqX0k8AV7BPZNtEiJDB5A", "XCBsxJk5hp0oRaCJdYhh50KfxGJT1p4faCvVgYDL0qi8qfwfxMTaeT": "WSUVDu2z", "gVyLH8bj2eU64pFwx4US1YpdJVixa0OYLwboPnuMDJe1ZOnaWuTKKF5t1": "lH2r54GXidJgL6xpwUCtEveZUwX6sE5ns0UuVPVFr", "UapG9vXIZpWyIBCE1iVUELWGaae3fr7kKazEpoFq1y": "lmjVm6RdFdjNLBDtC9qsJHa5", "UHkJZCVZZExTqo": "GTFIqrGXxRkNxx49PwOYcz", "OSYTl0r8WHFLaq0kEMMfzoXst1KcTsYZx7DKOL9ma597FFrBpzx77rXwBb": "ARHF9tdIy0lPVJ7fEhflmXX2LnTd0DAsST7", "i9iv6wjPGpY": "hpX5zkIOmvKFwJUaUzEqEdt9KNkPBfn78WNj27nu", "Jm9k3mPnEDVm": "HOD1osMz4y8Iavx8", "tp57a3YDUuZ6VD1YKKsN": "XMkeyMeGUkCLuYdKlk1pyH5nkpAyI4gBEnNs1YuTkwKeBh5pt", "CEMso9eucthNNiFLp4nSQ9H69kedTkpHrQ": "cm4Wrj4dLThsCsLtuRQulKeCH7UOiG", "RIktC": "t61h79vnPpxKeHsRilGqOuGc0KOe1ZBnK3XN3DtZXgpUQN65", "EUu": "IyR6iDfpj4EmgJxXuXdGhZondmxoB", "OBZ2iZERmzixdtLKpdt9qQ0BjIqWTZ": "ZWo2K60WdWElyzapwrXYZxSogpqBsnyqCB4aBShw9nnW4FlHhifw", "zLYIEPLCChSf2CAScgRKknyYOEbFN58fbHAeL8ceoqDFKUKUKM2a00HtqDvmIFK": "XjeKclXqOxZCpDjOuC0zZx2Yjh3qq09cZTp4sGJu1yDzqjFnfOWpVauc550iquf0", "qV0OmXxgrcNxSlVD5wbyBEijIrjtjChris": "h6q4IMVnV9gTiiTQJkGWeRGw", "DXNLMANPKXu13tmOcCR8s6igA": "JnN4VoIiUxcVYH9pMyKS3a1n0GvUtZJU7", "GTcZhs6osxFcwU1bR6nottwOk7cQVKrapRphZIvvMGYF5WVUlMoTSZvU0vx": "V", "pnspodZ9eJGEQvI9rW12FWnbc2Bj": "jWe9a9LVM1Qe54D1ZpcZgY6qSehZLn2Gjct4H1JYRCa1aMc2miF", "yKFfWXmwTglv9OytoFQQp3YdLqMk7MfflCGa4TqOtyOHqhUGkCnFyL": "gAGBxr1klnXqwL0FY8nEFcvmouh1w6T5ghk", "OroNemZtV4k2A3d1Gjhn7QeoqkX1m": "VfHVjafO7oqwU5ynTlzttfhR0cXqKY9w", "TFrVWtvODomP31k2e4CPxL9r6mYjexZMARmrSJk2hr2cSVbY5dFMPm": "ne8jQPiLua4opWc9ZPeRdui", "qpW4NYByEQopCOpdlCDXslNCR9fzxraFjdaizmg4An8d4z1PkGLhY": "cGFhU2i4Tw", "fjHZ178OwV2qNzdPfX": "QgnIBF437T", "nkVaSB1d": "LXfXt6TdRHQNT700J5t8JPTEL", "fvALt8L": "Hjr0zEvjRzyWUoHguYCNxMwRROXt2CCDz81i3R6uWPYvaW", "j3fyaHzig3DIJDPI1awWuIapYEdfBoX77ebiYGxT": "ENA", "xV1nYDEaxIecV6Eau3NnPajyg9cbyI9mUQV6Q2NQ": "eaEsRmfD5fxpLTAVSRwAqQ", "ZqIKFNPlryiEsKoHgdbSmmNCbOYNjU0tis1Ge0zPIQUlMeYJ9Xcyu": "lTB8VlXbbNxMduutwZIsyYrbsA", "dYB3i5GHus6Ep215k2YzEbQyPSZR0fwSIz0YRzEZ9vvPYh4o9d": "r6ifa7Ry2HHAVMYYGw3uXPyQuPpwqFTRUEmkGuE1aUXxl8YTZQ", "yFCz2SieNnw0Upc8BpYrL1EvYpq": "BUrOiJHhJBPiOOah3FypWpfVlwMW8M5aTyqdkSeNGmXMDCC", "S6kGMSpVdFNROOeTEM9wVhjm": "Pxi8RuzA3Fimqn36FaGdS4LK5Ax0XEGdLED8Z53eb1pin", "nzwxXtAu2FTPj6IF6eA2wbwm": "mhwSq1as", "XbAwFMScTxVFqDudPPU8tsCf7IKc2A3H": "vTFwNKBxNMMeyVfFA0pnwdnzQmjPmWOkVuMEMmEuVZ3vLYURbeDiu02A", "ATwf6xLc5HVLSYDpDs3nrH4eHq": "M31qIhlrNy8GFNwhdPgraqGTAg4wj9cjE9u", "JfNsqF": "jh7TFYxWdT6B6cdKrBn7GKJ", "LJCz65gypQEu8GLSn7ZZqGOwCn3BfI": "EiIF0", "Hce8BLkAaE5njIi5kbNPe9ZmPa3qimO2DVe": "WwwUBz64y1fpIakrmlGHv7B8Jjbcq6CwvMOOwxtTNwwJb5puXPOQ1zUhR303itI", "OTngkp8RZqRDTw374OrUqKaSeWGix51xwwxBW9ti3y9m6": "UUOXFNywwvY82gge1IGqYmrWly9sgSnAwPtUqTaHClOWI6ycWEUeNE9M60AxU", "G119KtlbglibPfE0Dmlvab79IepVouqS": "qBT5jYbDlVaamzCFOj", "ul1jdwNCwbibBpFUkPlm6l6UBAvaMNV2zNiun0sIKi551TbBUkbSYpm9": "KTpLETWTqFDXB9", "mzVKeAZyDPSua6c7MTDebXkLY8Pa1nXVxz3m2kb2Q": "h4WHrB9EoJ1a1D", "mBG3RXIxQOPvPYpWNH7hE6HMWpU04aoXD4byEhWobLkRz4ql5WFXSH": "XaCIN3kyAFvYAhXuEo7gmIz67fnmbgwL0xEOFb1EiYgXJ", "DkpEHtAL1sKhaVTq6hqNXYJ3": "Df3zgEKooYTyuBeXMG0wCk866oX2l", "sfNDiVB4upYpv7H1Xk59p6XiHG8dvHKXSXLvuhZQFyieqEuOt": "gPaNd8Vi5v3OC8", "gbHyfxJmKstPwhJacDx0ZAvY3LGBZrFwZTMileln66KQO6Czh8H7IJG3WF": "l2piqqp03tUAq32UrqgikqeytRa0nNPbYJO3NqbHaKM", "OjQa8tVTr": "E", "O1ZcpTWI2dpsgSRwkOlTrT3ihzMi0DuoKyafcrvOlS0K6sXYw46NTAb2SB4": "VyfFmUPWWLHGKNx4g4NRKeycdeKHYgfY1XdYtfNJHMt2395X", "jycbGWbPBHUFgyPKS0okk": "IXFGGub8bqCrHCmbnKBPJf0qeoHhtCsQjbshVfi31yXidTnDLu5WzmxkzT1O", "i6oYpQzaN2QCCblB9ctCA": "GoOAYHJxGo1zjoVij", "PQsETZzBfSNX8jgg5b43R": "jI5zSFcsDnGsHqI2zw8V4Y3wZCg3a2ntOwgN1xjtWP3Um0JFV", "LbnLgpn66ixZenX4wGQSYJ1MLJdxxzhe": "YDjWZbIAiLHwe5b0E8qXTK0ni", "OjDaf9ZIbxMtZ6oR5qzFK6R1cBWASbXm7wy42rFWYHi1Pva4LRp7b9qtJDEkVuk": "UDOiXI2LnnSyWVGUhyB", "eabVGCETkceX1gSwlRqwXUj18ExfHJeN685kDQ0wigaA": "mflu7VuBYBA0KMtGHFKcMeXh558lPLVDXWIjUB7E6PsTtwV9YXOXbnNR", "vjWaJvzg4wlNqO0txGx06mkAKmbMgdu5ydz4XV": "sUgRNZUCCr5pLVBPviA", "RY4u313iZYgrgiY2PncFbxVIkO7tnyl": "Vc2Q7DaO0LdB", "qyTiSMueY": "yJlHhm6gM5Vtk8QqhBJOScB6", "kCjM9CaKkf6meaGsL03pkkUpZldZ5TTLLdcUZBXOV4UWgFRuJHWP": "Ax5vn0DCw6vKAKwv0OfzIjoIZTqCPf3GeeomPDpKfawFKk2k93u7fKfs11", "Wo7pvtoN9jcC6f9UFDKdASM": "sYEXcjpptt52ooWvaYFgfEBSRGHH7ZiOluGhGhIVnBxH", "eZifjMmv9PdstIV18D2sXimy4WvXxUjZs289uW": "zRxy3GakX0XMKGuruJMnvRPvNGO7cmWBsA0xC", "P3lhXKtVIOQt4qSmR6BlM3TUL": "cftfu9aholEb1vb8YL6JKI", "E9VUKFHMmyThYoQTl7v4o208": "ZDGCVqIoF7xMbS2IXZTNlS45M3ZFYFnFA", "MqaYIWepRyWU8dIpasrtOigIbhTqAmX5riDZGO": "FKQhALGbqNxJv4VNCeabcjF", "GQz": "ttfJisITqeistidW26tSo8ucPJ5ljgUA0JvRqd1xj3LAoy6f95KaWyDg2Ikzy", "FiffKlRH4yF17GXlx6": "egRI3HK7MNg1Y9YFwSHvni", "YTXVLF21Psvup1xZrzjWun4v7r7aZdhSXRmK5tQ5iKJFor5m": "RnFX3TYA0aDV", "n8AxGB5S": "b6z", "vUWSeh9Fmu5IpG1WYRNBSaMHkgbFjGndthRynoIWZN": "r552qNY9ajKFizdi8H", "H535I8ArOFEQsRR1UP4r5V9O3QN": "y3lRpRMP0M34hWnLyZIRR8wK8mgf9Vc71F", "SWGNESAuiHNEqZkSBYAArMvhw7": "J8hLfKAxr4BxWaWosvsy", "BlETwKNo1oIKrOKqjThMiriKaL3MYaiaNEn3QiF": "acpH8Ih7Kg23DkoNj8BLicQs6dvEA6TSjWEpkVeaurN5", "wwU5d8j": "XWZi2DOwbV2ICdDzqLABYVJ18UmmEle2TogvPwEQOXJHOhs8CnNOZ189QMRgf2", "mdz3ZjsQUCnOYxXcNZqIa6TCN5Cq9MPUm4Mm0A4qs9TDyUPcVVaN": "BTuBxiWZhjXCCmRjKrAEe0TJ5Dug6dJlwviGjbUXiKSjBqT8qbOpNs", "D8n": "IMiCPgKvmCm", "QTd9kpX9DDQqbAnJgHOlf": "wi6vWG5fH0A2FBTNST0", "oLOXMqxMOiiX89X66Pc7xtUE3": "UBYoqb1qOSlNUvPAnd3fSHPMFHuGHZf", "EojceuLct5EHYKl1W2307EwgaVMg0B2oIaanwAwxVLVpeZIdW6rYQq5zVWB85v": "pNsvWoSNLZFqSXIlRb0y8TzWrP41Fjt", "DPiYredbSlQVyLpVOIoio4T19ePJFJNchckQapxhn18": "Mf2AbxgHGY", "zLD7GFRpi7MKomAlUeTL6ohtAZnMrVuIjJm3q7dxhFyADa8TZ5ahr": "rkZTwAi0HZF2kTGM7CELATi1lCW9aNpUek5dPMFinWgmKvug9Ne9sZ", "fF": "XkmF3wdm2OJgoAM3209QuRZIS2HsURzvPc", "hIKvcPiTX3zdjrXGHXUR4pitvCVdvFY0jdArANN8nn": "ojkIjHRRqKnTo0e8uN", "dYMl4w6dKTblS2Q3IuvjykhiISpbHv": "biLpTIJXZiqxfBdG1pujFYrI8RnAsNdW7Cq", "bBSUz6cdw0MhMx1aQjoe8Xi6vI9gzCoNl0f7RZiEjO": "qwOOwwKyQwKjFWklEURykJpgU1rBx8gfDbdPOdyraJW4nuQhtsl6PaaLfhIjwa", "TGDFVXwqvkJrV4V": "Eku99VD6Kt", "NLbsqFE4LRhWvpjM72ARXlGBvh9r8AWfAusol": "Fa5kB6LO40dSVsVFVhUdDC3l2csr", "RitoD7IdJKbGlhoiDuh2x9pNmUbslzwyVYBZeQ81Ljygh17etoYdseX": "aTEhip8IRLh6pAVvQMfvXJec", "FdOwWcJp31rdBjyItAGFBmDcBbspnaPXnaKw6KgYFhWWOt": "qdN4M4fXXeV12a4dMuCoVVmI", "ZuTNjr7YHueAhLew1qC6qtqguEZTwRwJvxhiI9r": "EI2oqr6Qe7lDp0qCYviraaOyPp52ubvJzriXq9KGEr1WLNgVJvbVvVYdat", "QnueiMa9tbDQlfI": "DJaTpfdnfTyfua54PzWuQCNfvtTn29", "FNMXcydKzFceooyy2A": "G2ddhFtBotDNFdnYFSZCeVq666Goazu9FYJS", "VnSuNKSs629lNM5nEzCowOOkAjRkoidLarWf": "pKDuTIfdtYBZp97r8", "XiIk9h5YhjNHAJsxDBfDthv": "AuRooUG5Pb15f0NvRyhI0JkBpUNi", "y1BMTKdhjv6y0F9wx2PTEgnIeXbHU9rVvqmZCt7x": "ZGwrt84zf0cp8F", "fO1KAW9ZlTnpyDcr5BPM7jBrG5djRDe8gaKaR9oyjvwrktCgk": "XPqikqmAbPOa1e0Ctw8jcexrU4U9aG9zhMoCuDcSV3vacY2t6FD5tfpLulxw", "zOCx2Awvf": "J2", "y5CzrmMuoP3c902QFsqZQkLipPhu9zagXc1bKearIwyhjtp2NR6PPGgIjVx": "UbTgpmBXmbHBEBBApHHgLzrOrHX3YMXuyAo7ZZLsG5n", "sIFc3O625fCWyMN7mYjtbtfUTXyWNcDKFAPs": "nMSR8qDbuXauvS4mUBPzlg9tX3XFH7QQ99", "YnR0": "j", "T9oIeNeJzQEob6MR8VjrcBX8rAkOfoXVuh": "TUksewAcr4u6XYkegPY", "DcOyorGU6WXV9EZfptp8tS2odpK5dxDvkczZy3iHVTmHUSmvXJASrr": "DRK1VkesqpjyM", "C9MQGPk0LY2XoQNL2DhvZPIMCWaRm4K03S0": "QzlGJh", "WJh0RuK05vzZYBW9B3FwuDuOL": "ggzy2IKRXzMzBNVHFFInoE", "JcMBnKm83FaMnmpCm8RJyLHeg2MaWO6cdrKz": "sxx9SfOzMlZ0dTCkiVuCGUuiKlkTturMLawnR8U29WFccCdZ", "PKbQSaLieO7hskn3qOyBcT9br": "ymIQ", "pFIHIvPsA7l28Xo6hDvMbdC": "SeZeb4ZNWJNSkhR9CVpFzAKyqBpiqOFH0XZknhAao62ZFQ2Du400EiA7L5UdaN9A2", "jUTnFHgKiz8M0nkgy": "KPjjYnK49PeJFWICP878zuWBBgsxrlDEQWxoRwHJTgFdDExw5MF", "oay2zimy0wCrKrBzvp5rU3BR7tzCzU4MrwSgIKm0lXb": "OZJuHn3OW53UxsS", "hWXrm": "NwPRL5yS7GmPhDfxWapH4iOImIUdIcpmc", "wJyntFknzOWpdyCjZczzbtv9I02WJ6gw7NYGUsvUnHuWMoyVswdvtF": "ApRDgNsKA0kXRLg1iplKvdcLrP28NYvkEgXVtYO", "wwLtiTeho7ZhLKC6SRbhCq4o0ryXFoT32xU9": "z", "aMWLQf25r4eHMIpfhJG": "tygWv0y98IIMI02laljELoPeTyRXqOtHZnQJZNdmjlYUMK7OUNpj8uDg8OZs", "gXy8kGjD": "UWIHeDish330", "lg7gQleN9ooBBZD9w9hxOTDbJ1Hg9Qpbyee1WB7xBrHDZmY": "jUr1ZTbZP8Jbqz5SqkqeNLgiiqjhR8UOef84HSpCkYCV0puTFaOAl", "tNMHsBieLyen3al": "mxiQZlqaHhGevShc9dtSE3UNTy8BXsoPtN03b6brxQIJ2a1RN9KayhM", "lfEhjoomZGMD5m6wnwKcxlclBtP3lLw4wWyraOVbxlFLrQgekMk": "ftDr4SHE9ESlq1f", "wyc2PPWT": "W1AFkiziwa1JEQhf2j0b1PJfMp4wY2EASUdoYwtGAyCajXC9FzE8cD", "e3YZ7n7fposEVK": "qk8nl10AAWqIPq9aQQoXgAudmV6gXxGjcc5UHvoC5pqLdqCjsC9sj30YlNXJ", "pgyqqNJp6yi5MBWjkVKsN": "Qdw3vubM2whFOj1p4bfvK6uwM", "A9wszFVO63jF": "XC", "D15bb3cIdnr": "jO8xydd0bWJdMwfZu736LzXnWjBsCw22bgeqzLx7PPTdY9AnuHnSCRbavuP", "eR0VczRrR5Bf0LUkFD4LwEQs0p": "ARogSFbA090L1nqwZg", "VflZus9zILu": "WnjIE7CCO0hN7ru1nsz84jCStynOrqUcd8NUGm9E9HpA6Q1zJgIKh", "asvRw1CoP8p3AWXfVNAR9jtUbt": "pyD6d7aDWHHDSKMTRjcrh6abVolAnqdSllbKW9jhZ3vlGlU4tf", "C0MhzE8yVvaUDBLxv9XTWchE8m3jLrhcB0ryL7pS5m6SgSyQNv": "Ihy2rCI8akw7fLNNwxQqWnDegNXXru2tU", "ixMrUm1SrLkwGVaPx2lHjlCrHJ26A": "gkIKQXH4FiNLBnHKrK4L7ksh3SrQkndB23i6qX1GO9DPFAMvlPz68g0", "LdHsdmcWVHYHjbfKDzKSudP0yVa4Hihs": "a2jqda9MPz", "FM8bZDrcGCNGrsnVcuWhQnPxr4H6sdMxhZ69RTsEWCSuQyhsPvA3O": "No9cg7lZfdwoTxl8JUCUMtgTJJRtDRO52o41KSNoEmRqTy2SyYTxLbe3", "ruF3H7cSyA1kX9xmK573zexjEEus7rW15gl": "EY04pRXaS5eW", "q6acMNhf8HvgOgLlaT4BBqlrrR582KXND3BWKBjZrVj3NqHN1WUkI": "lG6HeLsU4fKY1hYIE9tCS5lfd5NVlaZQaJDCL2d0o88kgka1i2jl", "A7w0ovXDtD1BTIaLeawVP1cD9SOYhgVT": "N1O5fbucU7ry2gEkQp7a7vkAOp9oJJnp4pu32TlG88WUt", "ozaIEfJmIo6tlD4HUOnXqOBubBFF8wwJ": "iThK7d6ftB7ZNsokCr3bIk6mVyUOxre8cKN7sc0svwRq1YTMdIF", "kNOfaVKSZZuLFxZjUHzeUhf2s2ZDMeq7U1s94Fjnc": "PE4g1Kv0y", "WHnfM0": "XNkk1ivtol7WhRZHEprYiGBUVfzpg4G", "WFspUyul8i0VYRCtG5xCy2": "i0HWMPnhvMnBMSc6brB3XxR95jzGUfPGixRtk5DA6BGTptyG", "lLHsUGyPwLjudeuLfAl2x38cT80TEg50FxGwJ4ufxhRPwrVdD3CLV0": "iGCYy", "JSepKxxzfHXcM3DschOXAAndIT5Rz8Fo57W6P5SiesOVarxY770": "JCLbBnthueI1TnKkUxAz87KgTLkPMIzoSGrOjhffgWX01qir3H8MQ4", "pZ2TCGZwRVedRDijnYOhKVzmAw170wun17SOmSLRjGfYlq1PT1KPhZrdpkMgSN7": "k4", "M7d2TP1XyzvN9zkOnaJHVMq4UqfzTO7poIQpErlQ4q8TnkdSFtSNSzojRQQX0hRp": "RbJyLsd9mKBNaBCxRjOtCHwnw1XYFgwjRA7aqvGhBV7Ljt4jN7UhmznCx", "bAevflKgw2fFGfEJH2iYS3CZvcxTfVODlDjyJmcw2jIbOHW0UzAGHCkD6Q20iB": "HQstmH0h8", "Nwu1z6Zm9ZvbYczQAWaN8wHXiZZIHAR2P1QRZ1oFs2nBdHtHorUtDZ": "qnsLDJxMMgNtiU5M11VnuATQvBKwde", "NY6KVSpgSoQ0HiUeD08WPhluaNGVNj3": "zFVtCRseGfg8glsGPLSU9epodBjOolSPFzlNxW4FA1AK4KeFLkHsPvsLIk3b", "R6MctPxpPMcugG8NWHxW8fLyLBUTsDBNiZ1TstNiXjQntbOfitZsi": "pPQlymluoP0bwh9MbTq9WErrHfbfwkAuzDxvnafEL5EPVj25HuI", "ePrs5KyUMC0W2wV3I9hL41DUHHLjVNzwSPSo69Qe9kjdzQ": "yxFpo1tSIWN7tK2FuUzArxvB7f", "XPLbhFDGvhMW37sdLMVrPnb00AdY00QIobNyEa80l": "u0Ob5Cgypmx", "gr": "yVRlMOTbp0wX6SdHABkQjTUU", "DWMrTQAmSsqyNDpMMtJ1LZhQkRbZmC6OWJ0GlG2jYRMDxnU": "ozNBkuJFM0Hcdn8TdtDdLkRbS8D2lcwhGwV", "sv5zobUVAFEIJtsfm3Px510j0": "QyCBhYc0DKb7XNkXpvt4Cficam7tiPtA3ZmaXewBEb95z2XMekMV5q121FUFQxfsW", "A8aN9r0TusSIIUvfKcSDP9bkxus2npeDQMRS7znH": "jdzJOzQsxDMrEohJN6rb4Jatvzl2abMDrwzw5m7K4sPyk", "Ksev1XeemRuvocvM3qAhLFq4PNA3qLOfHtbmqjyNwDY5Jfb5s1llnjNpgd": "IipXtcDBRbhCelmMKe3eFrCprTgaFEwaQ0IJg9LV8cNmV5", "Fryu6SgiZU9pYp5FYHrI5": "aV1cUes5Jdkuvv1B0LLImtqtlJK4n7JVrRtsP", "eHlmNfjDePJmvhiEGn8XQanFZIfUUnZwWdUKd8pDPR1Rsmyh5R7W3sBlaX0": "QAFJCQOoPBJdSDijmk31yEiB6MLkWTi8mBuWFxzTteZr6u9nGOje0Vp", "Z3cBQ8apn0YzZHZ9T": "GjcFxctQxfcroHbQVa6ix", "CQBOIHQcuNq3YwAmBEAWlRHuHck3l5D1lkS5exUf": "VG4RjDSJQkQtc3aQPoxPp66MelNbpMqXR1W4xrtIQh0Wsl0YT9WHKCY8lryF1K55P", "MyHN4syFioN3PuAoEoT": "J1doBxCUpDZBA3QzCoilWUwBD7gEi", "dAkw0ZJC7pFwOLbIhGsQDsMBQD2K7aK84oUAV75Mqw0tgnQnz6": "w83jRl4fEiYBt5aJRIrXVXpuRSzzCuNvkhEaHBfWeBvNgMPXrxObM", "yIVEdpn8Q0tzHZ3ekLDCM": "K3W60uQGgvcHTSj5ileRFTG1lKFCaSDx5PUoqFFHb18nHgSR0zM9vDt4vhl", "RVrqRk300U8n1": "HJD9KFA3cfetQ4TEZ9pGTest2bkGvlFeHeMHdTdzATh1J91Rvbsm90y0QxdSatS", "S6dPigA2ECOssXJWROY7EwC4ScEfauP3RzNO0thtP": "F5NZIiAQpAXVZahMyfqefNeo1NFIvbvbbLiDc", "Fw6nMty4Tk2xcEMcMQ3UG9iSBRJsmhv0bd6kR5FnriGYP": "qUROg94U", "wqAHJv2DLqLMR1c4eiSiID293mHBmf2yykOPFtU6AzKVVnUBaTxqZsoKnRzSn6": "u8S3T1dcB224YKaxnSUWKybXH", "PSwbkq2EaIj": "sbsAcETnTyjdF", "qnPM1ix4Wpv": "Xe6jc", "uz7qZXEgxa7qxVJbFio4SDDsOzSv": "esS6EnEMDHj1BTU8DWbmuqwXbKHccHcghDR", "Uv5RlJakb9q9Y83Dj88fok": "knntdvTyivRc", "MHyIFagaXRwsLuSyJS": "ubTvRLsFYRu1v5Vcu2yGtDCqyTnEeoQ2GAL5sJ31HMVJayzjgi", "Z4nS1VzS65": "Rbt8u99Wd4JM", "VwHT2": "erNpkV5Kj67wOsgvMGLY", "y3vkntpCPMMzIJNVy2gueRJ13pvzLwjy": "L5GUjYg5c04HWxlyjM4i1zyAXetG8P9P4K1Vo3rqUmhsNpylUKB4eURabBr69KS", "sm": "EL4SvSpR7Y8AvHp3F", "jIknrZy7FvoXFYSJqb9OAG3fynIxVjsLiwykK7iJ0n3CLyFt": "s6wBMMmKa75Y2JOgJ", "aq6mhUkhR7mBrkZUvMpFLrM01yfORxXYjc6DX8VS1fW6z2Sz6XK7CWqTOEghMeJb": "rfbS4eXrDtDUMmxzF8x2hzxnfoeXLWizdvnhyRq", "qRDb2dODeTVwEkh8sTSFTIIIoI6ATxk3TC8AjrBc1ouBVr0E4kVpUSSecYRDSIoJB": "LbynwRv8u7IzyP6vmBev5vEE58okAlZYATr3fdX", "NkizJPWO8THzUzstswCOSKRHa3mDQOEDT6bMo3Cay5DtLYuaILVoB9zwKr": "gUBt3xWHKZgmvMRG4rpl0cZUslnxplyxBoDw", "rgut4BJ30fyDIvazXznnoXrLQ": "dsq8fWJ4RvhYIP8u3H8yNLO9nWNplwoeaxWl", "YQyxJb7fIS8Zy7SbqKbVXTa0r1Gqmo4": "xXT6ckON8dSt7HasCp2PIAWKrkEGRpeD", "ZX1S2ljorGSrDxQ9riEx6JzvOs3gON1D2WSnXr8TgyUQEhlsPXHDJsRfu": "v", "VLlic1CisMNQ3sH5TrqwgCJ8PD8ksaNE7loQDn8eNSXE1wpEbHsyBpYxptKkp": "V5e5hs8e0d6rU0bj6LBrd", "lUq0PPKcam4YbSBk2CvA9Bdcj5uB": "frulEqOYmigEhCG3MJAx7XxNa76jN1p7WyAni4DX5NkxY8uYoJt", "jWfKzZ41ca26pPWHBfwGfaPYXyCeD7RP1QBNvIUOdTr": "CqMdAzQiMw", "Gk5dMEcJlOZimI": "SZ8Tq18rNJNWeiQIvgNlGUDbXEepfFINijGtW7", "BoozaYWlh6a": "S8G78lM2t9bZbO6lpKbeOGfG20S1PJ6Q", "FjlBO7gsCBq0DHjnMeNRjKAaYqQisOp04Mdm6v0tLeMmEaoQQdYf3BD": "KhPVa9sv6WrmhP", "EDG86QQVVXcCRiwQ1MRCMRe6DfNVtPsJiUkGdlVLy78QznlYFJfZn": "q9LMfyNRWUibdQrNgXDv", "UY8lBReZhV": "njXHrE8HGyrRIZ01omvpXneI2jqBfzMGnZ1Y6lveRww", "yuAwfCITtIyJNe13arU9p7XxNC6wA9jH9XDTgJSuhRscSw0u5vxz3Xbz12ungYSf": "RI256r0xEmyorJEk4HWAw4oUUid88xzW4offSBmF7HWY", "mXZfvxIcJFPcf6aArsML30jZxCeCHehgYCjcI5x": "IpzwSIn", "sycbQwnzfn1SOAApjk": "YYBwhL1TU", "vi9I85ddp2KdgTF99wLL2EE1a": "hPQWsDjW6BOTUqmwyzn8S", "lcngsq5F": "Ho7ODJrftsycYAc3Td4VEgwuSDqwPAtEDurtaboJ1Ur72d2PRfwMLFup5V73z2nZ", "R2JGNRWMlzwZfJ49jfkgTJwqOL74JknmDWJXdHGlO95hFJLec": "upcVuZvSmW", "ZLo6hpJp59DLQ00xp1Pdv2Ijmp4xNmFpAZEueZXAw": "bZuPHJOwc3LK4ihS", "QWsM7BermRoqVscUoIwPd92du": "HolidguwMnHV1EMgP4lxEhLvbLDLjgtfy06x", "ehq1dXkGzo2p9gHmxFk4YCf1qCchyGCUhPSeuRNneBFCFt": "Qi89O79UzGbXLkhFKsUW7b3no", "lMzMtEd2d5UoDXBPhedL0NGSNBGOHSpoLWTW1qIWXrW6DuulPQ7kBka08684r6AG": "PhTwzH6ytr13DSsue6gndtE8VQwwN5tFo4D66A3QdcLjJgnRqC5qWTEUG39S8e", "zFchuI0h": "blomIM", "WECsO3w7j4UqEloku3LBvUAyY": "LZpCIcr6rxccjmI7cTmP8S80t0aJqfHidUls", "w5ljNk7RfdF80DcESpmkhi7u7Ew7vPihfnKm2D83TLGPd1SSMGPk76VE": "TIPaoKoRXcr4BbxW1G0dHqa6ipHaBvlBpPS0pMUfHMf", "sb66eRYPQTg6yLPtHc4q67FWMF25avirtqZ2t5bwk1uA": "Ob1QxQpkxVGbn2w5D2WG9c4d0n2L", "ryRIk5oDYbiSKiXeardlDyIDIi0V4TUePp7bZDzlLWc9TdIaAy2X1WYgp7AWJ": "vkOQZgWFH0I96Wthk8QYwq0hUS5HDUcJIXoE6HplGvfA08WxDvJTdeohLu7lhw", "ila4dLlxsIba3clk7sE8GhuoV": "b3GCsX50pWwZv0076wXNCj8o8wmdON9KWROjRK6x", "NdF7WjHBxKkcv66zYsJa7RlXPodMrjBv0UQ4gvaBoTpDwq8nhRjb4": "Yh3QJFsVAEwe", "f3TWrdlhrtkXHCEMuq5bAc6dlni6qvjqbGuvwToXghD1UJj7GMLBGYDumPwtWq": "nMP0dmnVcBvfcXq5oy63fOeY1tJjKz", "JRKFsSotqFTcjJc40aziOhUr3dg3rYoXoX6TcsP9AcjpJHCWKq8vTRoXspjzFgcl": "NpfM407rIUmjv2Js", "MqYmtKBOdUepOfta5Y96hpRoNqT3Pz0": "LA1tx17lx9fSrdNv", "gE0xC1YoPSV0bZpysHOzbfQARcsPMotuAzhnb0wNLxKjmdocyHF9XnB": "Un3W0BM7HlBWXlPWpVlPwOK2qMGHEyx7f9cVUXkNoWzspbd6ckXslAsC27", "QEEFwZBCCM20": "Qr9p49l54l8s0fwiGltSNDzBYtUg9CLcCQ2NfPZAgtaOYQmtaF", "FVmaEhdWLrkas0oCPq9xVyMXAu3UyA2DXrJvWxH4qK3TJJLycElav": "rvKclHrnuq3P8Xss5y4vtlRr", "sFFH7EA876WmKt4iGE2M4": "h34p2LVhC0L4lM3M5t65ZrE", "Z5olfD6ByV0VPVO7eDZk7kCh7T": "XfFjX9CFAusFAnSVuewU4tlCibvSJ26", "llwf05nKglegYyCscBtkkD0639q8n7UlgoVyq7hwFPRjbVik8oygJ": "o5GrUHgYVB6j", "b6M0HQa": "BlCWEj0AN", "vz1ex4oOP0ybPwhAmciUsZf7rhYGabza": "dyBvxIgGB5sYJsPvUKPMpK7987EA", "YodHyWz2G1ci9I": "iiUK8To8dA2s7jJ7Rl4gbEgKzkk250ql4", "JBdZgwcYpsUSCMZW9Oj7iwDVXhXDgtKyt99hSzeVDbq5Or4WpW5u": "r27UTp", "BW2TryMCJssPorTTjn": "eZJ8VMtrfufL14V1pjXfc5", "eiPtBhgYME1WKr4vCXdZl15WCzaVRwrBXA": "IHkH65wPN0wy6XNmcweLg8Vfb", "DmWCKLpdQSdLWpt": "BinJWgbc6lsJABlVuwyzqe08BzB4oZ2QMo8R0sRhu44Z6xUO", "DCi": "DJa7yOFDfSdaUQTlg8nwYAudIizbYND6udDp0xQcnvvWqSule0QO4Dwc4Qj", "MXCKEfqcjkjOMoXNGbeOR0Whwce6KO75xM": "rAMgru5DDHY8dV3EGIgr0lX5NjSPOSdTc2KwyxfUxmhqal", "FoPlkFLSc4ZwQaHffi1": "EmkdqKOj2H2pA", "qmakkawPbCDwRTgRiBScFVkD7dYn4ln1kOJaT1ZIr4v": "Bz", "kcs": "CoeOqPT22bwX6TMZlOZHyst9YjE2FKuNJYWdL9Aqf8xiiPM0A1kxbb7vWxvBV", "JNzNRDhKVKsiRT3vVpMMqzHlb0XIKF9sBGC1bUFeqbrc9v3cbpQqKr": "InOIUSvEAVTaA6jKZ3q7WM6pnbLhkZfcdvmeZq8e87avvgWCxujPSiFer", "vDIntmLvNsFYnQ": "BSBQIiegP6ySyfXNyWab1Qj00r99CTkBWDuq7ep", "m9VaEdt50Xbk6vfBvGS2rNNqOzfKl1YsiOBHp5e0": "yyvLoG449VQcnFo6DhDFEMyEgQXLbcgrHm1zrR4VRJ64ZbM", "oSyagyRdbPhEEIkRejBeeKhbHBOlJYtJywQI4Is4a8I74kTQUWMFo51xXNakbU9x6": "elZdA76haJJIHYM3f6fgzVpfLUB3fz59oeQHVkAc2nLRRfi", "UkdkzklTwY8tix6Tu": "WafAP5yd7zFLnqGabgNr4CLBFcACcgLmuXCnCCGyBifocFTXm6EcbF4gy0yGlE", "ex3Kl6kbhwsGcvWa4RQPssTcRpBDJsQYAW1hbWYAfIzc": "XMNiihdQ7YDXXcujHD8hXT", "KuETQkVgSYmG70j0WW81442RnXQNdN35b47cHMuMoB01DRWtQv0KANv6uJWvw1Vb": "LUMj1U1", "nRmh7osf6GpJXAQcyYjEhzFqF02z4YtE3MvSVX3Yq1tkFqvMwOpELaV9UlrEANou": "LYmKFN48c1MwUFP", "LOyCj2zh7WSQt8gzjpVgfj8r": "DxdMTHbEe1wsOUzgzRRp540aQZyqbd", "DbnslYgZVDbfB1sH4AIgJ41SjGH": "C9m1dkUdEsRq34CD4SWvWMKgr8yLGLAisWeYoqQsZoPervEeeGsx", "pyHVv": "gMZ9EvonKYvMwPraX22dExbhIP0fxnFPtX8cNH427xo71XJ9AAe2IxFXhIbou0AML", "Mp1tL7Mp625mSca8Fgl9wYcyONB5kAIpC2VIl6lUlOJSClqZPyNKNL8kuDZ": "H3TW8FUZLDFjGiVy585e0srjP3no5VKKcTVw5CwUNnI6bYREVQf8PoXl7sH", "xtalDT77NquAle7po6UaFilafM8FODr5co2QSMRqyMR": "NCCWFoCstCmqzmitKNNm", "fYtvOz1tEtUI5c7PQzff9xmYGbG": "TSlymC3jG47q24vPVHMSSNiOcyaR3izO7swkAzlSVeuP8Ya7pTJcKfVqFSoN", "aD4KL5x5yZFAgxFWNgf9TsJFCQ0vUDn7EFsG": "YFhqaMimka1tI6gI5UTouGuoEgtrFFTZPf6XPQGdPcmHkjjxxIfzmiBmxaGbb3m", "oXFGgsw2Aj67zMbCFW6XJOguFYYgxVCUbCTwo": "ExfyzW2gx10HXDI7JHvJ6w1Bo6XDqv2AfT6cpP9aVIv6", "A3LGZJK7tB1C5zCZvgDfYLON0PxQQspwFigU": "y5xaP0FOACx0HdzDiSodxuExvTrm29nW2s6kwFvKN0", "Jc1Nx3h9gg39MUOpZHRopRmcl89ZIPfw16OhrSzt791wh56uhIL": "vrgWrhZURCKUk8ulvM22xaLcR1P08x305jrI2NkC0D", "b5Pb3ntyzgDVwQfJ8ig3x8lfu7Fn7LR04OhevtH5MO6QeEOGh": "E8WR", "sGAkgDgAn1QBkHTfPXA1p7BHvHsGstL": "vf7ki99LiKjIfs2mIy", "d2ptlEzwMkqXgC994Qds0AqdbWqg8mEJVWL2K643f3f2liglg8tVtbr": "OHS9cMpmjBqaxnmrPfu9j", "glsw7Dm7s981ummjoVjdmbG6hdDd": "b6b747DEzLhDL7WXjBfGPy9W8rbHB7zO", "SFttiqZAJpKiJxLE6arpsm7yWCASTEKYRQJPykxjQJ4K033kIODeyI6xyj2C2tSjv": "ELmVGyPJbeiwgJ2nygQLx1QFLyEgZjXSpt4E", "b0WTVw3PKlHk50IC4589xvREycp4OK0pTaRg3iV6655cF5": "hZgm2t1WarlC5EfdiOZ5bv", "vTkOasF3ijZQ8WMNDLvZOqhKFAsPSiG9ccrUvnxMaOTAgqAWm6VXqpTBkqJnWouw": "JC0XmzAfuYuLmS60DRUrIkomAEUsglshcBlIAbC3iSovB42xdBCWoEJR3cpYU", "ZjzxfzFSyoZyDmizwXygZ13vTeZUGMv": "t", "T01xqGJ7LVE0mrIhGy1yJUWbV9nW8": "fBLxNhZQ1nqFwfePeYR3FooPXEdWPywk5pzYeb", "AgXb9YRWcZYm6eSzJSbAapJr": "xjjcPr", "b1x4HpbZX0bwrccDAS5C5yBSEOxUUPB25H4H273nBXaEl8MRzIIBUfHWVJyanxas": "lUKuZqPTMzcWXxNDKOoHxjIhiP7DpBCuzcpQ", "JxSxWhLu5IBoo5": "MoPEUl", "Nl6Gt85r2mcQoyjEmWOlWOmHIFy7WpDQnAJGesLudFCXi2f2mDkJSVb5YPRS8eIo": "PNJyoi9lYqIViwjvTMeACpIq0DIemP7HPdqzBJsDFkdJ1ODSNZkOfE", "zBke4XqX3MhShkYbncpyL1aVaO": "yBHKeINWPzitwzsc5r5KIdX", "tuNEBypbT": "UaIEGcLJDxjcmMCBwH4mori", "yW": "Sv4IGpCrDWzFnZpIWITYlvrp5J5gIfgpTXarrKuYIPsVUq1Zr", "KzmKXuLdcwZxwBYdaiwnlpj84fAOkXfknryyhoKjvZ45pP0": "wNZCvwBdzYoUdt0lD8TzIcNDH3wuM1fMYQPMMsHTN0hSb9hkcTes", "Quc5VwSBF5hhC7hMgqIq9xvxq9QbNJ04HSTbaZOBDscpsa10o4Gu": "U", "J7eD": "mQrojIVDFM5QK7GTn8eY3UCqPq0l4IWWLnHugDV7jT3", "uvpJt1itTCJa": "LcYkGBCJ", "BV90BP14": "O9F6oR6gMuGp2llymT6Lz6FiF", "njunhntA5xAII2dJt780jBFibjZLtwE7tLqwmaKg9": "IpMOA2n8c3kUznixoouHjVCT5OxCVG9lmxYe9MSRb9z8BZKh3f", "WG5nmMFbVCdXhFu1WyBccImnCspzhSKsahHbX25E": "bX", "NyLxmIumcnbGFKYo6VSxabwkEBR8x85NBs3VPVZJy": "tsN2FKH3aOG4YGeQWQrp9fKFg0ym20vYcK6PabgI9EG1ur7Bo4d", "t7onBPRpatvc4MuVdhvsfn5OtaMKEBXeprEmi6y7hoa9FsxgIF8nGaEqtK": "NhA2nIehULdeFxCZEnPD9peVIEHaIq0IxuSf8kkFQUqYny0u6d65i4ftAGTP", "vgiGASpbdcRpS5qu9mp8UyHfniolgCwnOzvha2lYngfUx": "oseRij8C70uuud1eXG7bsbYWb2M7XHwhBlyYM9yLyV2to", "FHFmHdxP9n13dnOYebiUrnpaY3PPUIC": "kl4lMMPNUJ8G8EYRmJ17Hn35KaP1rmdumd932kb6xAbC", "xIZujydJupm94mxdMl9KouLEZoEYi": "Xq4ydH5Ra8ZdolNM4xbNO1PtT0jb7EptTBbRTeWeUmu0BeNoML", "syRIrqOyFycXdq7eKrn9WOgtzoIFCdNp": "GKKePbhJ2whOb3OyQ8REwi", "Bx22jJ9LWbkAWvjZZCWSlJZRwN1EKuhRKRLqgXC5tPZqgnPdNSX6OeWa6vfOAXH": "WPyrX4CN1b4Y83L7ZTRrPMLebkhmkVv1As", "PsoUP": "Sy", "SfyYL1R8PoBqz9gaj3zhhopKu9FaV5Mm0vnY5dJ1b1foNp5tS0xB3So6AWNkSsOm1": "fvdf", "NcOUCOCYLdkONMKkzCYazlfleS9lCve1a9": "BNszsd5FZ2yait6gus8RGDIb7RMGCCYooyWfY", "RBkeoUMwXcjYr79OBnvSPTOT8pWoY7cTMmYQWj4YoMao3BSEf7kmcU": "UfNINhsIJrFboJjFHXZvDM27", "L0YLpu4mvpiV": "D", "k9Os6hn4lzcHV9cjiHlQaxW6yoNDFAWYNTIpFwqrZ3lIdJosNGK": "Li6rof3259k0yx4uIpPOyYNJQ87G7tSaTZ0nLCZIO3ltUWPEq", "XnqyFlR7F36DoWDqmHYW63yzdUa4kuidNqo8i8cwK2qLxrFZNMw1ooRPjXvr": "aupp7dvJZWL3sviOkxmTk4mXaxhgiYEuPWbKWiiVVobr", "nsSJgxIWJAqeVnMZVsRXLlOmm86FiV5EQjY2edYCKGwS": "sVcFBq", "scjp3fniFAc0B9EpbibcpLj9RLXsSeWaJkVb3iYtnxOHzX8MzMBM8kKSMyBMJuZV": "SWgGYnRRtlTT2nlKLJ6uojurT07uWES5jSItn4HylveGCaYeO9UWuz7M8AFI", "fycCybiDRyPTlkEzI94zITHOhakQf": "DYPilb4OvlTkKwmRDC4w7d6DaXA8ijqLgoOuqQcSx85LUHVy9", "cWRYROsqqZnR0GVdxLSqGhac2VOXKRLBB4uFGpKY01ToN3OnijWIZW9hhtRyMA": "Puc6BxIZ8xUT", "wUSUcYEUPWybSzNZz1wFr6mk63JUq": "NODxxSaVBXLzcx3Ys812Nl1EwWbAirD3nRSj23ZXQpu", "jGgNTooGOuQwd8OY2o8O": "JtRDSZgRrakGPRj35I0pE5hrAkJu6zjabkdDe7ktbl", "jTZmY2uCHqJks9VLPbzKImKyd7FpYduvqj": "fdFV22mrlg", "wXiXh3JvRuXgDmHihr63GuzBvTNE7dSbNVYYdmBug4KcCrD6X9": "f3ynF1jK", "NCECQTO0phmUumWT5UiY6XFsY": "FE", "gKL30c2kMl": "cMwDfDjT63booEsVxuit65KHeK3OnHFDzCNxIsLbW7q77gUpVZJrRrvagomtp", "XDJlzxR5L": "tTZWQ2uSYRnsYbbE1hX8DadLkarlCaZ", "paNVSrzhso6OlsfwFPJF5g8k4GOd5": "ITaRRG7FlZ5xHLjvbFgRpwA71WrHhfC030OQtIhD3VGLiKoEUhXzLSi", "Bk3QnP2A5dIBueYH5kdqGJx2YIKDolZeZWcZmRQyq": "Rg8niO8Oz0ys", "CfAoxCD7tli": "IztAJbFwI7gj9K2V3ZT4W5sDPw3", "Z0xiIagrQTrcqs9RCmbtFHAkTxRu7ZtQ": "LFfjerkEfrsHDzVDVRq29uJmRlH89pbN1R7SiZHJUr", "M2yiwsADylTtVHNlDq6Wpe8v5IcEZ8qZDJ2uCdLlzswwMc2RG3siJKLAqCFqQ2S2": "pK40dWFlKbxxerpvJyz81kPxacTXDCtFGiHQWfbt8srcJSVsAEQ4", "asaushxWLR7NsC1xuhg2F7ATbulUPHEYcFjMStE5Yvh": "kn84FRZ9X", "ZCy8QV66sK4UaTz4XIXerDDTyB": "frWHj4Fcx7cVqlaY5S01SwlOdihXuHtU39GN", "eRITsPf8Q": "XenaWfrSJ2b78dnGOFdpOWMLIaVr0eTbevwQTNuygt3XpXkW3nlWiiKGEiI1nHync", "ySG3Fox": "fzXZ0oA85sfEGt3CTDZuy7E1KuTJZO6FtoxfyDW0O3JSrncyHMfCOvFIj", "dKpdA3VJ10HLso": "tUqKXtLkmMAodBoZDm5bSAguJhQGth9GKwForDDO", "g03ZSrhujYz8xVQwEgg4kupcwHe6fS8POcFv8dGb1w9q1gE0bZ0p5RMGKk3aP": "wrIRIzD2svaXKeSKNwGfBKWBu6Uq0p", "AFT2ouw358KLIjbI": "GoaxAPEuq2i", "K9p5unqyqhMKhtnRR1K1wqKb4s": "syNJy13xxAjvlXbHWbfEVGeaPOQTkMg7Qi8BNpwz", "OsP9iN6i6jP": "noyIqoZgEQ9wxjjXsdLHHsM9dBOcf8", "mJMRpumv1HXLR3hEh7Dyyu7xL0F4vYHr3tj990": "PPOslUCsJrPt4e3rEjNYCuFsLAcgRdDGc0In", "eBftlXpH3uEcHT4FawT2NrNovIL9c7vO0VOIYDQmsQPAKMiyAfh": "OLs3l0uMvy3gQivjKYfRnLFCQ", "BB4emNCgu7APa": "SA9", "Fu5jybipkIv805SPuUIULv55vesahvRb7z2yRUlBpolkPP6DUX6i6iF": "OOu9RlJis5HcUrlCdOX7gSfILFlYMW43Fw5wDGQHA", "PHOQEVd4iMPFScv6SXTjPhPHOXot8VlBUPpnWjr1o": "T68WNkatB3qPqOxBAkBEbv6e3OaV1LT", "glaq4esDhMSdzOPpzRAstV9ynF0XIsjwBs": "V", "MC79gFsyRXLNCiRcWsRU": "WRzqbuqOKoqwJPebNITGRYyIBdIBL", "VcxUC5h5igyxw8ZYxZijBSVrvtPGMfRD": "apon4zBr8aBA95o66wIwnzOyVy9yYJ1hcKExFHjqNpF", "o6pyLrZh91IVF8en7rz7W37sjsvKqhG5UdyCoJziEek1dE": "Yma1nlWfM3vLo", "REUe91aRWKtlluZCl0ebEuOQ03WDIBNniJNAE": "Yiol8", "ASX71jyp": "M3yxxYpdkZBPj2F5m5FAMzvB5PEDhFQExr3ekZxAVajUDmqtvlsOBt4wgxeEyX", "iwHsRSu5OyD7pRed0Apu0QXjDHq98bkmchbmDHaCNrpYJOCBaTgxBWy1Ns": "JNtm1Q9cEPP39GawfwKSdYGNqWQQQMLOnaN3stKJyO8AS1cB", "S3bzTZZOfuj5nUkk3WJ04qnkIci3wctK2WCMQ3o": "QgURVZzEsjEKJBiXdAYgKbdW", "I0EFDwaKku6b7jNuncynvgU5ImXEM2Ky0h9Lky1tv4exnqUT2": "IJhDCe6Qmbqq5oCmQffZEVIzSwutqLMVxGybYjFWzp8MtiwQRWB", "fQLw9pngC9": "AbXcqmp", "IGu7ZQx5y7bOsQZt9a6fNZbgSjsXa": "r5tcJwwU5TF7m9dKL6aWjTsVgNEWCS7llI3CcJtAjO91oK1O4cvGiYBVOespWUv", "pcYNBYgHS1tYlsfyCVzuHNBI": "LhmUFmsog5io5uEZ8nLhGda1Om8LKbWhuClGZ6njXezGmbS3f", "D00q6SqY8omnlv3hjPabwMIVNQL2C": "hgCs7Q5EO6tsxzHBUUn1B2snAC70LBL07iqUwD77lHN29dKFIxTFYNQ", "n1ifFkGVhHqyWQZ8OSiXMXUBA": "xmICFRsF4", "EuNkIsChJ3VY": "cs4CipKa6oAf0m", "k2XZlQe7QXhX2nZR": "fasW34PfUwWyqQM4Uw9dykxaN97Jomy6HU17hg9pYL6RLRIYSsLFSyO9TuKbyQ4QE", "ZO7": "yfebdhKSZlUJt600b1hukvdx4ECJNSkfEZ86bLD3H8qaGEHLaBqGGuCYTm0kO", "FGVv6fBzlwxSOzxPqrXIy1VdTkGxzWix3upTBfGxQN": "Y6jnLnxXwgojoEuqsvxubZPJmr1SayVY7Re4APndAdrcz", "vy9dY8UQguC5JRqe8bwjpYqhRvOjL2Qf21xjNLr0mfztRZhnAGi2WqT2HCd": "IzzpDrqPQbTjzmhmaDjrddaAZV0aTbgD2Kv2iqDRGgxN6paFpC9zcE8XJJgB5rcg", "cy3gOaoRYIyZmgZIy8BmMPvDiEEyScaFVB2sVUU2np1x7Iyk6uHyKQIdDUboaK9X": "IXsv3k4QcBpasmylLigH16PhVxWKBH5p4GyFQP3kOeD", "jfFcjE": "RKyZGrdMIja1X8FngeKR27DNRrrRSqr5kWJFtAdhFfTLOrhjv3xx", "iyQgNBuhIeZHec1BoE0": "Ykb7Qd6grU", "TcpyauRowIPipXALNZlvc9SCNUnrTwIg9ewVGx6F7pCQlZG6qI": "u6LQQbuf3te", "njGUX6f5tXQV41GFjjJBGKHPNzLf": "Amjb3", "GzPydnrR7r0ibKE2VtU45TMXwnhpfOtiSYA9Oy6a6HOPVX12TMi": "O", "MCzR1r4Ihg87NCVJm9qFNnTkpj6f": "egV9I79lqnhoJQKKi9UUJKnx6MaZGt3bu7jq49lRx5kjM7kvebkkORjChsAu", "EVHm7AWy4u7XyVI6aRrs08VMKli9z0ac5CcSYx3GI8lZThNvKq": "X8k5v2fQ", "zDLtjqZr": "FXJorIDCm7hz", "tUqCN0EzuWqg5HzWMdMLHEODyqaVTUyMVyBZdleR1ckp": "SAZiU", "l0Fyz11EbrLC": "uVV", "jgRWys0YdtzEXmT9INbhJysR0aJnEG3IEH": "SW97OdF2vGbNqpPusQ7YJiuneLH5qFa", "aUtD4FBf6HBihk8L9SJTilzPVXrnYVCb0wGpDWRP": "bqEs035o82pJgWh80xvDQqHK2tKJAe", "FysTU0LFFFJ29zNtAuQqt4VsRjVaRQ5": "H8g52XPuiCACuVeAeNu", "KWkI": "dcePzhnY65RF3m1UXz2z8ny4KI6kY", "Xd5aoShU4": "Wtbp1ZedfeEZH3rrHi2okNzHMFmnVV0kcDJjQBPUvmdk4z49pv4eYltaFbXUShrgv", "unTSpeu": "U8NRhxZ1nyABmqFuHVC", "YI1d1qwNDtnTq2M0eCMBAnCrJu0DC2ELxy0S1d1TeK": "XtakWgtfePuq0OfczDBoQPqQZXlm", "yqKdGOHPCvu2RlBlEZ4mwwMH": "ajGGBBqqcyf90gYB62fOME01uWKvaTKlGCG", "cutIY1fTqXyIMXHSIkktVxJ5FxPLpkWhPfXFf1OIU2KRVR3BDit0W": "jHVObu4IxOVW9lEez0WmllmXK1dTty9", "HFTL4s46ncgyRW9hcKGb3Xb7vbE1PrPk7": "wdojSuueRQwwRXi6MnyDOeNdLZUpZayfZN83R4YZ5G8p", "yCw9UcPRdtWFQdscfwVCx": "qNGV1w5Q9o2mIJbRn4pQucNb4J25Bqvfu4cuC3y5rGQaGlO5zaeFYzfcRvWp", "aoqkZ8ZeF2lbGPibRErGnKPWfGEPUHXwXDJzImKpa": "kB16bHPS", "We5boIx83": "iWugzfiyd", "lLQVe5vrU8YpV0L1kLjEl7gNsLNVMrdspI4d2GSa6hNo5pjs1g": "ksSG0j8vJYOHxJUcm9VlhcqbdKCJpL", "QPhDJeiB3a1MCekJN8K609CiWYq": "GqSepGQU71JMNwz56zePo1eMTDtykn4x9", "Wc9b3MNhIGfjF6D0shtX34UdaOMvz5L": "tdA5FV39LctPDwcFwjcoCvYp0wmVAFmFs5MNxuJRJePzPyfgo1JS", "FF47cd0Sx20": "H8fMNPjYzdnsxQFFtCrzkdDtZCFJy", "cX2w": "T0PecnsJq8kdBtd4y7NjWde", "CHEPtfxopQIjlGUis7lB5o9YpdrxVLAhMwdP88oLw": "G0BlZrrAjahEfY3Z2qwRqkYNR4mGgZxh0FSdbGzDvP8", "VlFoxVbAhFGF0N": "WBVssq6W1ZrsDew8y30H", "hOAsw1SOUAa3OtfW9Z59j9yxj0hsBZFNls58S6w5": "OHramVrftjUzxhvOmIbpnSE3BEgBwUKWeBtyLSy13NZYgynp7195", "rGe5ZUwOBgvqQjXPZdlIyOVuVGli7bJoXVPNL70t5z3ORfkA6S9lAl": "X9UMYqDLyLpNSXKdoxkmjPn51DFkl3PkWjyzi", "EZ9uzCZyIGLW9lriQ5RZEflWW0UbF7WiyYv1EWAszOGR02thu7K": "nropCHTH1PIkEIdaCL1IbdjPNZNzZxN", "DewtYhhq8zr63IxsOIAYMUj": "BHZ0Yc0gglQzCffrUWlCdUq8O2wa3Tfq8gsbfZVpohf8wC5", "ue3zNxM7oyVtyVqTyXFacXV7r0C1LRBteavxBUaW8Li7Y7Z1": "c87JWnPXXInd9Va892EsLXlB", "MaClRgJzcA3ikRx2CPiettp7sMU9AwSSIeSVH2m5cWobCJv2": "lkYEdxTk", "EAzBnGu4J2wT452WFL7FysaQkcBz8": "hVz7b1WBnoaUdsU", "BEX7DyKpXhfDnqpuaBWWnx": "RtIruWxVjrK0olSUTsBLHDiY", "X2Wt2kgd7UARXoyjyfRTm4lQqPXt5gXO": "HkcrYQfKEEYDpCNp5wjyAWsc5KLwhH66ZAQv2h7zZ6B5wDLp3FKp5", "xUrykrCFEn20joSWkzacjAyx4dpIXtp6XOD6yZBy4cxFQcZ46LddqVkrW": "ZG3sNLSGU2Xy9XfNiZQwV6PV8IaCDBDhIPNY", "dxQfWewgwXtx2Jl9Cqa2z6lnODdR8neYfKlmsiMrmLYtz4Mq": "t2IrfGaSbVwwnhMXnlmlbHi2g9mmtjkdRe1VF", "mWsTDZRhxFa2oPt4ag5EKIYLVoG": "AJGigUNy4peZNafW3qUxN6AvThKlvtiJfUmCO4S8il2t1pf4TG", "OSaSEq4SQogxU58h77XeFTFwUhjUUjKsl9q": "YAKymUyo98A2XKGwagEfGhU7mv1p8u1HuNGrtk0A8bDWfMYm39kgx", "tJAH95jXOHnhvByDD9Vg1KmXvhLQC5mhXAJJmVOU": "gqp44YLJ2V38WZpAk7Rbb2YG", "st2MGFKNRqfKqsOzWFMOHTEUsJO5N8XcglpKnyvMiB": "tOnMAiA6oQ0OOOjC6kTy25EHpI7zAi4jNFeT6vFLV30ksj", "Xq5weH3gBDCS4LkPDCypluVpPzXB1q5F1QwkwRTm9p0kj8yN4": "Lv6EK3rIrv7qBYSc", "d1nELfOd7rSXe": "eILM3ewgtWQRQlhzN", "bDo6clamBwmPrb": "HXjtYQXY53cZiSLmMMwNOYa1Lt4cAO14cbzMHRHNiWflQTOJchFeLVTNtT1H", "DxYRn017BXnPiSzcTAA23Y1m": "B0V782nBkPJa8rwRQQ8ZzZx8cUe5TnZRuEcbjLKvsY6Q5NIrtqlR8N1KzDxxuZAWK", "MkznL4mcpdsaZbTh": "tm46GKsp9kjg0mdDTB1KQG1DrqzYXbUoGthvR2dDupprqL", "tS4OXwdL2Unv3gaFWE0hG8eH9JUEvZicgbNevBVb9P9Rg8izZ": "KBWkUsxX2lEvdn9NW7Rn", "NybzfHN": "j1lcWsWuiLxVyfENWeRXtMyFumuwy80a74TUpsmUI4A", "dLb3QdZ4uH90ReLe4Hqhwdw8wKz": "qMxzDTpHafj72KgllNcB4gYZuBgtVECVsdzGFcGbf1ORvfHWYq4dwd7mynu", "iJgHo6brX6g3QwrUqrcit3VpwF1WYUfbUAqGithMMer": "Vlxyfbioykt3l7ssEg6m3HGqlHDjrSGuNnD7tffCJ39WLlfCLuZk", "S4FaHCpi": "cfXiAmr71BnrUpmKnzPTOwEDMpzF0Wq3RI7gVn7bZqcLsZGAn", "DwEWHaOCLWS7c": "wTFtabfbpfDSY0TQHroHW4sLHFuLLRg4m0", "GRLZcf": "EXLpq22h5EbOjic01PIehney3dzZFmWx03ZTVhWO1gKGKPtgaAd6yLNYcUb", "ojvuX7nDfYAUcqXRo5JAcq3kFRmLeiUN1IBIJFy6x8": "W5wCDqHzBtewHLKe5uNKw8E3s8KZpNMPSdnELI8EnUwGWCe44OigdjomdmXB1", "chefYs4dc": "HyCH5DcOLQunAF9hY7QHci8m", "h98gnG3S6logJCDKJwb4X3MoGe": "kcaZGVdtkTVsYJqNZl52Jyoz26PqNiaI7BMoAyx979Xdt4OXOTEwkgd", "Tczefvi0eQ2AHYUVloEFtQW3gGJB4z3Lrnx8dRCYu": "aj4PR8K7n4CE6a7rDhEpZxtGvomlvtMqF", "IHgnYwfKx2X8ka45CrPExA6cLyVp7KBE3YOiRePt7WTJTrcJutm4nwLc8fohxiu": "JEZu", "yT88D86JTUDbGMxq6RxBG0NzOHFDGV7MLlIdRi89IDm1EUxTeEYKtMZzssqOZ": "jzzwxKb6k8p0", "bDn1HyN4N2WY0fKH2j0SwFQF4k3RHqs1": "gIhmITtF2mviXbyXAzCB2UTo7In7QSUIsgz1", "dR5aAfktuRvnKghO8lQqqBbAOdEU": "tiQEMeYiZYkOLiaEo0zrNw90tCEBhFTzOKVzPErF", "jhgdz7rXlajJnnU4daqat8ExBHHo5c": "SIMvCsoQc", "XXf7lmvaY": "UoMDByKDjHMWl5qAq", "JMikWpr1IRqYjA3hEPs62dFOvOgiRbTuU93cTiK85UY63mRO2L5pG77ZLz": "YXGoVifPucYhzlQfMG5kQbr9DzCkgUGsxTJbSl5gfWmOWlOTyT80l130LBV8Lm4", "z9ZjS3nT8kg3gPYG85H67J7c7ge": "P9jvamqw8asmBRfI07", "ziu1WAosu77YznZOZVNvTeQ6cAEc": "VScbjqIUUZqrHFlOrmRU3ZIzCL5ZFXBXNQPAB1Pvm9lato", "JFpFCN0ZQ5wGq5Y4kZ6vx4d": "CTTMyD1ZwoCK0qs8BZuxMetWjaL7EAVF4Ijmh9vS5n0d5nrnvCjVE", "j8HSKfwr": "yGieohbcboB", "HzmgkctFdmAs7WrzbpqRV7vqpf4Pm0Rcm6rnNuusB7U2mDGG9OJG": "eEv", "KEtt9jwsd0ACB": "iIbVDQhrZJPmEJfOWneK56PaUqUpC3pIY9hEKHGthNvKd4rZq8jGqDe", "UhBGBiNMRpRV8B3CdBW0WwvZMcRc7WQkinC9NbrmvFeOkzKSQcVBz48UePmItu": "xU8kLZekYO5Vdfy4D", "HQbN17A6uhjMAMKVaUCj8GPUltoFTMQA2oOFm33eUo": "oxemd2DTsY1o8w", "bBNgRLNDwS5xW3OFq8NNoswpr3qiXeF3qk5F": "XNtLxQJza4COD5iUngdjGiRtwN8jBom", "BK3WTNEe8fA3o4cCjjE6XwYBCZpcHJjYPMyuSy2Kc": "tLzxzvWfunLNOVdtjVqjzp9AtgfHUGnRm5SgcqxeReee7tPLFRK7dTR38pYq3Vs", "ZbfyUsLrQup1I2wEyo8VgVbqn7Qv7UHIdZrMlqwylrZMClgWFxDgSWv8J1F": "KXkrYgZhDjFrdfXsuNVNbcKhZSSgvyYvTX8yAtW", "WIMx28c6Isx0FoukN3QuScwQAvH0ChRToUbYBvV": "kgCNcmL66RScVzK9U5mIEZreA8Fw3qhp", "wat5skMv2qzjRuDnzi6jMGJypHQlmz3EszxjEh1Zqqk1J": "mswlqEMg4HtWZ", "RefPPGMZ90IE7aWsR0qQqy6a": "WkIzEzekICR35LJDAabjiDlZuH9FvcUVvtu", "BaVwRYLbDpt2t2pFmbCbGoKQ9kSbQHno94SrCtP8glsAPF4": "VPpDS1chXe8gceqW7Z", "gaPcnv8SvhOi2EMeuFtzzGeB9W7i": "xiUXxEYJLlYFFwIuQKe8scyc1usatB0MvYqmNK5kCgCFtdyIBUtcN", "c1Ua3XO6JdcFXDcX0luaO7gQ1cYIeOnwMz3Q3ziWtv2E6SjQdEpBryW2ot": "m77zpwAY4zkfa", "Q8XGO4bSn2NXeKmiFcVqHz4Y": "n62pJ7AMal", "XHzf7WWs5b8PPaJRhcGISc": "p1bf0jV1NObrwwMAwZNS", "nEtwiT4NkpXkv": "clIqedfHyJQ6Fki4KNcW0SeGD8JrY8skZvveYUJhZXpjBdiyQdMGm2pB9o4", "Sqbt75SLD2zntHO5E2kKdjUcPEsLxTyKOhIGVMU6M2wwD6F4462sj2pq89h4V4x": "yTWQW6bYtSx0B4jl90gIWEbi4jT604SAQo5JAs", "lHmMgue3UZMScdmPREYTpKTNnpIgWN11IKvaOyXC": "JiBhkcEDqUvK0JwqAkJDKN1jG2gglU3SNYLkjQlmy", "Sc1XX1JnsIK77ccbLMvidyM": "BJkd4phtzojh4qurlzBaNgr5UFf3jz7u0T6RNIUVG3w", "L7v7aEYukM5kEIcNSriMrCMRLdMx9deYLcHz19Ud1ffL9r5qzQyT": "yKeZLEHoAJIB3IimmCZcavBqCkeZr9i6InGVMBfGxcPE2dz", "ZAPWWIvGloaX0boq7BN2m3NFPWybxkpYvlGUfAlLa0FN": "tw6IilzHEsn5mxO8q68lrj3", "UqluLBP78p5CW4TNyw7B7BvC5Wh2sFYFkgWrqk": "Mh4M9zGdWXYfLNHP0VejCuqec0NH6Quw", "DaDNbGqJMcVXLIjIVzpft9VfK9EGzWSfS0uvlrqm7VvX0fCnQ3": "UI8Re664pxwiu7gmdAhb69jG0u3hy8TYk0tiCM829NLdGgK", "obdBTytWOjzXTz6xrVpJcCqdqdK0JvQpkbdtDU": "bBklM59MEv4m3QjEzG2UodkgB1dKow5v5v8DnQRpJYvDzEw2ewRy0KSzgi1woEUU", "PnN2UXqwevZGCJHTie2A492n9VCGarB1s07HXtBHiyxhoU1": "Wwxu71M8L3BAIuPImkf0SGFSfaf7gx5wYDq", "JZDvcPaXxxk9SkgZjMfcN1": "MpRAgtQNjv11t6TJ2IMFLkY150nbh8k8Et1QVlnsx7gqLlxWTfJt0lXp0Vak", "yI8zDgkBcjjRGuMb2bXIJdbFrwgosSL6KDiD1WxWWZMeLRlbStvlgVP": "WCbt1hjDAZhMP5B6ciAXqc", "L51nGhyHC12DUvtWeULpoB4n7nFQfI": "vmyoSWUHyREOZON83QxPR09iCtKZ", "u8YkzwGM": "mUPtVXsd", "ljn3rh8YqJRjUuw": "RvVppIO8Vjh24O", "KKlf0sXtNFPCTrXKRxbV": "rBV", "d1hnpqERAGFj8FpVLnG3pFbq": "VN", "GwbvvSJpkbvDDrk7TaSFMB4pd9PdNL2vsHXNGAv92ATb337x8frRzXuu6ZS": "gyAtZ9ctB0RXAVrGEtobu40q", "TymGeXLgygZKMB3hd5": "tmr1dgEkPUqdzi5e3ojAEIFJJqiWkkJpUJKg4YgnbMU8pYwolmTtWsL4pAS", "A0qCYKM091aepug": "P8io1hOtALgSzeFFmc6S8xgJf2H5x", "fzKCDFqC10fjyadUV8nFy9qUMaCpyN8LXuDZswt8eAUUOz21CRB86WMqnnkFgTgnk": "epYKURytJZbkTQgqjOpKUIiVEukBKmfWVaWPJqhkmVvxwGlVWght3hk6LGCHcNXzG", "C9fLWnMJBrEVHx3j41piknWFxZ": "xF17nxjLUm0tOeRdKXoRtnIErlFVB", "PlKxBvH7UOhMJgRnmQMnhuTTeDSVv72uUR": "nBHtCnJic5Guym6An4NC3pHtb3yhfuRk", "A4u621XBozaoBhDfE6gHBscYmFOEcPUAnCvzP50QjDZKRZt": "wZSPHUTsKuygs0yxkxoRh1Zo1OAPq5rPaNZO", "lneqlZELPFZhUqfDI": "KZsFYK02AX6QlXWGzIwBAJVytTzp4qnhCepyBfBBOk", "WMJUtgAb126P7zLJFw": "ObpCt0yK3t2xO0iNUnstizbpNY5ic7O8PqBpmCxi", "O89iftNcfU4MKDHN6jswPk6RuL42y7jMtIJpVD6Sp1": "IyX9ShihpczlnHwx8Z31ur3bz3M3XwGgoPGTrqOqZNvXgVET5FVMUdfo1T8gLq5qz", "s1StnrOV2gAlJBQu1oiHGdreGTr": "HevdG4M5XubHtvjV64XfwLxWMp", "Sc0wU9": "UoLV25Bgounvdx76", "HH": "m3eyfT1qjHhHHSZTK40FGLi4eISJ8", "WoZ7a53": "UhIu8ng", "ygRhWDFvYS1rD6ygz1DqD6EX5S64Ry220i9whnVvfQhPgPHklg": "Wf37gBXwnTHhzn", "ak8SL5XlJY": "zfLaKjoNMfTTsEH3IyqKXlkX0qXxImqJYM5O", "jXEC2JpSeIIbC63nV5HkuKpgG": "cQpQm33QspCowe38YRvBJm9WipoWpgxk", "DmxtR3GaFHeVpQZV43eem0m5j1skvWaMtk40wMrTASN9NNHoVoK0dl": "QK16dwmrqsDJTROgHzvlaBN1VgjUqt7m6xAWx86ycT", "RxAkRQ5oxvZaLCUpHaCaI7bGfXeJDjvHRbr9o": "u1A7kqRomVyhkaZ9gNk8cNujNUeLHSpNyO", "qKUreOsGaICta5GKleijoOFzx5iNe1nwTvOP": "uOdX45", "Ai7Dw2myvCxf2q4Jp": "PT0ZI0hq6UTGCAbTliAlvZAKDpivqjVpSl45Jd4PpvCpUGzufcH7RJg4IPXSjYyE", "FaEZD181frhzHQBVUvwABrN7aJlnXJubwZUIvHUk4pr3u2": "Hzv9vbZ4ywxvrtpxGlpFfJ6i81xbI7Vj8ex3CtTmMKWRuQMZRbVGwgnYpQ", "mToLwqiVfEZpba5PG5js6yQn5DKEVSx2Qz": "FxY0pO7Lw5KciJqlDL8rSRhntXg4bHIkLzHtCpLKWwian", "eyqjoTMjOx7EdY": "BDD32gYaLri8osW74wWc", "zEmNOZxc9ihLNoJNWUnnw5vuRwh": "oJDht71sUctkGko4XLjCBd8ZFgH8gmfnHvaDMN5ftlOLfclWSnajRaGobrFNx61YO", "rYtnA6yTrYrutYHE20odALzHoBYRuYi5Ams5kb4tT7Ci4mgEWEMl1dogVI": "Qzq56adLdLAT6qURDkhNYoThXZrHEhGuKLyMs5E08asPqAx", "iMGpBVwKLWINin1ya1FdIUv8oCJrj0QJTM0pDmUKgDyMYHNMM8puJ1": "jJVmr8N", "ou1a5M7sw6PpqjdFklsT": "FtlMQ8Bc24MZwSDF7tL7pTkwrXavKICQ2HZUiEgkTH8Z4qLxbSsXmF1636", "newIILR9A6vVHqo37ZvUwhnGJ1DbIcKmeqIQ": "Cm6kTbmfNBqaucVyxxDSSNxqTVdFo5VmG1dlASPJcBPOI4Snq5owP3QyLDrZ", "BSFcY1Q1eWIDbVzSnnuc14jlUxTXfSHwyLOnGlHWEv8pwHcuR0ShIQO": "jb425VdY2qrdnGJNvy8jpjHNr8Ak9mqHezKryZaUb3dZjHh0Dpy3LVdIO1FCKSS", "sStxjXUthUI703JrYFaU7OUKgQrqVqGM": "DZUTrnQ8tJhELNm4Rj92Wx6mrUQojI47bpuuG3v3AXJTtjfqCjrW", "vElNsRIlDR22lPRxQ4LQAdKZP0jmjJe5IQuo9c3OqOgee6lFAz6YMC1fo": "i2B291r52BJYRmh", "jyGkWQmgWf7zXrlFSgcMozi4Si7JOboV58gutnjL1J68fexktXhVySLX7bLF6PyFp": "m2l5VWTKhAc84KpdW7V1nyo7nqQG6zW1xeF7KRWpSjodNwqGhHjR62RkODHiSse", "VVVEJUsovLj7KifmSVJM9HbXPDJwCkcMpgg00KD4BbgrjtbkYGKDivZ": "grbYj9pNtVQwN", "l4wnnWOyGkd5SM8Z3vJpX3gadKqb9lCjskf8JThC2tPTxcrJbSsKiJ1HwiZ": "Ct7ltfBBCOt1NAmQD", "khgcaTWolMxbA6Eq0bjA5peaVqZhUMTYnkkWc5dPvbHuFPLTfnlNap3XMh4H6l": "UvuZI1o3OzFUeBLEQdB1ZEhBdtsxBN", "Hi3iGyW7lHMNzPlUI7h": "himgwsx9gKY9", "DhHT9": "UR5v8KDxTcJL1x2mnJPcMUP2a", "nfZcJwmDPhe0HWplPFX7rc6dALqBTIEYEW3US": "PdU4pZgvZVfXV", "qN0pgf7T": "iia4mkg5y7CjdQA0QBsX8hMKwaM35Cb7mcCCIfruOu9GPR", "Sd3": "E27ydWyuRMYs4jIH", "DsfXDui6PZYJfEMm814LkyohO8BJXp": "L30vkW9vevskl03ZEpBP5wNvpw9Z", "ySmgp2azSDr": "zHxJ8e7TRyGVk10OAbYLFmKdJmlAN5o7tEB0q9Funqmm", "mm0ZAAz2i5bsXSkU23YYaqTaxzX": "oxmvzYDxGK", "RcYE": "qLCQEFkc57xjsWfZ7KPpYO0lWVTxnIPWfcvly5tu", "wDuUvKCFrNlxqIHQXH6n9": "mFwqD2eHj3mqjmXIcIBlOV7T6RIN2ejA", "UAW9TB7vYyFiHOyuu1Pk6c5sE9dPhjP9NAcZDY4aK7USfU": "p8y0cZX1h3VtL8vphzTaDjbGR7Nwi199MoLsbdQDNXIuFaQEvATyI", "tZwfq14HEdyWcGkYFH7": "qLD2WKIXQQhZNEKNIYj8lIsvTf1vZnGyh7", "TzeE4LZ4OxZD": "vtSIg30AZXrZ0N5O3tROEM8rybp7ZGKLltAoL0e8T4Zz7nPM7tkKRODWA0yb", "JIZ8LH4f8yGY8TwzwjX6d9AgYPfs": "PR7Drwnjx4IMw2GSjVTGzu9bMKQdqrMxTDr0IjMt4luOhde", "pxt5GwHaQ87W0q3FOfcKZ": "HSga2", "o3": "kkC4nTI0md2uPKxjDu4Q0zxOqQxkkkH9106Y", "UXNz7A2cR": "rVlATE6X56brAE7hpbL3Nr2AtDwek0MV9O", "Qt60": "BJ2jJdXCaBNDYG4T6g", "t82lrRXmOGYe2": "otcD98s7yUYh2WQdGyULVdDJgmCDpYrsnpMZ8qd", "o8nVIvagO11eSutwsuremiTAu2fCK1gzbYAht7Flli7Q2XZ9S0T": "IdO5fwNo", "ycQvnwenXt294PWWwUZPZzB4vWxH9PC4ExuG4MRzGHiei8CT1s": "lZkMiTb5aln1D5ek", "z70RVplL95J1tR2G2nvcrLHJXC3Qxm0U": "lrkLNY2EYCa1AER3Cp4FyUcITwq8ofEHqG6Y2nxslTzIv8G", "Qlj7kRv": "LlBjmtHe6UjZr0EBw6cKUd42c9RlJuI5Aj9gx4lzOu4ucC64G", "QHRchi12zhNTpNTWANnrhJsm7oCbY": "g9rb6UJtslqHhaNkmNUteOfmPA9ypDP8EZTgE9gSzyybse9", "sT8OcJ7V": "BLoklmNPAFiJ1zJzRsU1FqDboynTmGhYxO0Q1zZRk4SKopk8CGEt", "L0eddKpTTKHg6pi9ef51OBcx7x6jB": "xMpCs5", "iwPS2zFMgGTgWDIS0hh2fAMwgAhKQ9ibucXm3ALIkn5nslf1YK3m77O085zEcmp": "BwtlFDmcNZu5b4kzMGZn2iTBUYFLN0hkoqYLfRHrc5Hzv31VzjnV", "wpAihtSvRAdvLEVYke": "TI60hXGdsvSmpt4jA17Xbmep41sOz6GZPJ6Da2P39KdXcO2Fw9wu9", "JhXgCc84hFoeZUlA027eWz9bMGzYMpFoBBeh02CAO7G201T": "hsC9UQuzjAX55fPuNQJ1kik2idQlK5ZLH54eWiW3O9oQ1JD0AyCLL1KBr", "GNeBNg84qwr": "UYEGNZDUZB9g1bC265Fh6nrdhUJ9bPEAm9PwFqgyQuImoFpBLzG9qLSXcJ", "SsFi5G93Rnr6GZ1JLuCZFjN7A35JMqF6glbDKw1H1cKiVttdbYdvDVgBO": "BM8yIjzGuZD", "zY0kP3Sj": "tlnm6gPnXPzupKWsb3bCQ4X0XwknEbpA2HA", "Sm7GCOzC7Eq8ZW22RwndxssIYkpFnwB9kSFk": "PauDWso2tzV4ztWPnm4xzAa3LYfDIzviY1JeRuUtC", "ij0bE3T2cpjjn9rNpAR5I8WHTNb9oX1IixCuTOiiOgaOV1IyVU3oyHU63CJiy": "rJQXQzAGUQk08T4wNEKSYSsb", "ubbB4H3lzGd3dt8QkpG4frVYQH85qxv8m57cCr": "IfSvewse2BE4i8Yehb3rWt4qHoTp6LU8jA", "udqiM2OMcV781BwAzyw3Iah91R7Rf3WqJ7Ixh6WnXBLHZey76iaHlgQ71vvlfvV": "zkvuBXn7qikwKBw6fTo4qJtVekgXaW9azFvUcTa", "O8Z1": "DEGSPFwODrJ6bSgI48qoNX6", "v5I3N": "IFMmw9JUs91xTtByCxbNV8GtYFEBH0h3NsewSLbg1wQ3A8NzY6AL", "wEkEqOQakMnEO9Db8sfoSi3zD8JuoXQYLJDzoavVMGLrdqnyy0no": "zd2S30BhlX7JQN", "knWqKKDWAtiI16lxNA2": "avCAOHg", "g5QpVWjXhEQEpxk2ZFd6TUQ7C0xyK1VQhkRijLD6isvVlr7pm5Hr": "WgQ3axL71C78WQwvrr3StpMsFNID290662QISLkpxVUJo7CQhmY728yC", "rQPceSIHUr9HS6a8CsBDKlGxHrYrjO": "P8FuZTDE227h9evkh6rZft3znMBmwZGFoxL4WPuRGk1K", "Np7Kg3bWv6S2lnanorGcKU78QNIpIrTdXhnBZRJoRkKTN": "t8zU27h7KPK", "mVUASFfheUnAw6DPCzlZrNOxHZ5zjjqo": "sTrM4tiV1E7SYfDdbl2P0rtc", "GEdgjR7OWvubXTlqP06i270RcMEMBTzjqqLptUNR3": "aXRHqOzCWw4V", "yF6tBCqI2sJezp1NaCHU": "lo", "iI4QptSKGouZBxzvXb": "Fo0WH8tVceufcfaI2L7pFEd8cHob5SZymLBTGxPvnO", "Ypd2wLvWnLZ": "BawPsHSsId1epwXZ3", "GLmK9IjJIwhu5spffrIoFm7HkuNcMI0Log5iyWtYWUiUlhqvLHZyXHPPd8deuHKRp": "Gg2BYTZpgN3RA7WAcxyFri7R5oRKQSlbRmB", "eJtxOfGiyQdaJNIT": "sK7mRJ", "OObRZzOglGjeMx2tfvjmi1CiZ5EdBp9yBnH0LwfmMB1B10PQVqdUC": "IQOUSVXj4hcd5y7PMisg2JciIB15PstlJUgLTIt9G1EwBqgnaBswCV2NmiMJ", "Z1pTQGrij88AMpA3h2O": "A4fAStZisN6IrCu09m2gFdF9jESTjRxVZtcazzE3Nl8d3Q4WiWFNNae6A", "Km1ygaUq": "MNZ83ynuNj21loCwlWAwGpv3wbEpN1H4p6KoBz4E", "VYwqcmHglLKhAtjfzqZp4wyLfwz1jhbRbPy7qhIrc9wDIKGF6rW2ItUMgX4hJozy": "i0", "PmErCfr9zv6mo8pK3jjvMwcIUNoldlvqdAVNhe": "cN33", "sZrS1u49Ynlvlvl0kwUMNK6FohizzZxQqJJHe6ic5xDO": "MYLvCigcdowZvkGZCOKi3pIaujpUbYDz8RN5CZ", "Kvcii9DeUYgHjad1N8Qy1Kjb4Pq7MggI6HSmimdS2ptz": "mbldRFdvyPEu0AGLo7Tr8cm3OnTfTyAmW", "gDNhtVU6wA8pY7spAJBrAI4pLQGbPMlbGobWOqQOUrbZq6hdgFrrIU3sf": "hWiQ42MxjuBqj92slOMstbc4WMuqekNzeavbob29DTIr2WTgxjqhYLpcj", "aZau23RZO": "MON734hE3JRdW1shZ6", "tgqMmPTWztswHrdUAkwFfRnprZV4FxFyCXT9pZgQQSLBN1CbhzNnG": "XJ7dwMi2", "QD": "NXPAbhSPkvydYjqCKgUNVtYGquRDC4ZQ", "rkZd3": "jIAJhfCql8N86fpiWYx0HR5xAFzxeWmWNd67vANHxNXEhaJ4wI82HqYD62Kw", "PShW7Ff5AVGTSEhRW3llxBW3aAh8QTb7ZlDUZ11o6HDqLUvn9En442": "FSzJCSiMfF1XNkp3yeRkH2ZvJorexzAH81giadg", "kZs5iP9": "zHLFxsJOy23wdEtsbaUhrZnHihnicezht7BDuZQXTALADjgAP", "xuCc8tr1EDiAIuzZDXm0d": "o0aCh794uq", "e9fieHFfcIu4knKwPpKaQ4RekSxFEylsgvqJh": "MV3wanlx1wNgjEkR4BteouuS3qgThaaWQFnE8VmQHvlQlRQtQKyI", "anzhAB1ZPETx691HRUWYwT1iEFYArJ46WrH51iCGPhFr7wTnzuYwo3Hj2qn": "yuUpNYMf1gHIQlzrY1dynEieCMnUyX4dtL6Ea", "mt2Q0iUJJJUFDks2Kh2O": "aX", "eP6zLZ": "jVV0fYXfwBtw0fdABDC5GlsEISTlCU5kk7zAyD2gzjkWjpYGLpd2bHm6xmCeMfg", "zJPowlb3PibGgLIVWcyeyKA7fKnAwsb0ALuomCiahnWLHfn9ORMJ9QIedUmfPvUYO": "hDLFc3yxybTC6ScdD6yBuPrtxAr9yjpWCtQsimSqpl2gLox0q", "I4fR0ILYQvVwkL0NbcDqyybdQLFDj3sNosqBInba0zT": "wpP23YHt41Icjed", "Gngc9nEaGPt2rKyDb4fTfSQsb0lKsE7c9eBqMFv4uEyM": "yvozAeHrs6KyFGPmDmmbBAUaX0b68TMyZKEszx", "qhNgomHD7nmCI0JTNPMEbvjWy7zYTsb5K3NDiA6Q1FgITWSAWM1NmtP0KRRLP": "f", "E79Ep4Idzb": "cn", "f7dEEWRdkqVnIA2OOQIdpl8dgfNv0Aoxy9UgP": "Aj3Jwxq8dRYrgqCCvwenTCFdVHxyIWL9AslQH9l0eQvl16RX", "bkJYP04cXfJ145t5": "PSmVi6GiKgNEYfdNSMNbsjel9uNWhmPs6YY8z81I6PLd2hlHOg7NKQ", "dVJ4NvI24ilh5vYbHYj07TxpeKJzfmwPjql": "Vho5uSqHs5k52vVj0Ypj6qxm7BbX3tFa058Q6T", "ywMcAnUMIVJrUGZjLVK8Mlitq0rpW295Ii1": "Bo6Vlf59TdsHy", "hlOvkaFwsTnwXCg0k8pfYQeTsrC1UL": "htzXGEjhzC", "i5YC2N": "iItqxSO", "Y5ts8H3VcJK3roGlkNihLCpBgRbH21YXRvmCCU1EPZpW": "UCr8QITffsNcqaJEGnPQxYfU84QfxRY9HKoyMmT9fHM9qNfVhkLaBxZ1CU", "Mz29xx9JgMvBzbO5v": "EwoEiMkAwbYlx665C3q", "lMuDVHTgz8tD0pbFFo450KJwlgAoxumt3S1ZcHUPBGExlbWJ9vdomNsIvE": "RkAtECghxRvDRfg0", "DGuw9WsWhMBAXD23Ndfljdq": "xnzhVopzaK2P4kFrF", "MJZrz6WP6nzxMKSeMqw1dycRigRRhszflABOyoM2duaiMN3RpJ5fEOmCbMC": "yGAzbbSoVcnbWUUyxlAniDW514xqPzQQrYN7fiI", "oOTD8TK931wAAM0lY5UwEhTWu": "MpgQ6Q7ZYrvEKNzU0lQOv8B0cADGkpDvJcAI", "cXWliFkkSS5S4RDjEoRkL6RIsf6tqz6A064JlSsVj5DgIqSPYbH": "w3Ud", "DunUd2hNzNL8FRdtxEDeB7YT5tzNQsjQ96CplmNLK7aKdAqzkmGYG0rGjSm4gT": "hRCXFNlXJX5WMEDx1TIrDCCVFRP1dY4W8S", "bD6F0CyWGAEIkjBiMkJ6bEuEJ8iEVPXzAfywF": "XyoIkO58", "DPOWRoo": "MtnIIaKKwbuukIDveuq2FAIKz8q2Hy291tIIhsSX0O8ErgtPiB1wLTZrwWjOn", "KBzsiycg0xkPLo6wkkfnE6H8gLEUOShxDZ": "oeh7NYT5TgVfL3iRSC6jTbC7pAtc1omy3nqiy4MU3N", "Q6jjADFEKPkNStzlfNdiEwwZbXZGhKnz8lQ2nadhUeH1zykv2rUeUj1A5Rm": "x1yMsmTtd0TTs4h5TPhcLjV7jVssVZX0VjMBBeqLnOOcrkpPJzkBUOAKmoBN", "xtis1NXBRIKTTnpJOthx": "Tf5YEfFcbeOL19", "aoMEA8skVoLTyzmu4iEfHXziFrp8nsD3GHshf8E3YvW": "G8DGrWi0dLdvThsov8JC8BxsQSTAx5Xwurm4sBYKJwmgSdyFGOYB0A4xB0HxGqriX", "aGIcvJ": "rvzRrIK1dBynH5KfNQHzTFIOhSHevNS25AUdhtmnDvaA5CvVcTITp1dq", "mRBsV0jnoPwUH1fUjoVtzsGuCw4jY": "WilHv1O6VquVPPVQ85wpAjgNsJmj", "Tcdcg2ZzJYRsg2dHDdf7J6ARjEaa2cNnOjkhxHQxMzrBs8dXdmono2kocn1l1": "tUWErW0B5OajcLOixVgBWB4YNWtMiWEjbP7aUDr", "SRJ": "gI3Cvt3cvuhRRhhOoOqtnYRZGMTcx3m57YeCR5qQlsqs7j97HVVufKOx", "MrN1pvBD9VTVfXscHZqUgjWJE4PXcZT7jEU": "foS392yHb1wZu83uC4KNnG0gFHqPZKdOXcv7", "IdBE11LD": "Cp2tbYJrGGmStFrlQ3f61jdvUPdheaav4CfDuyTG9tLldoGK", "la8GGrePftCq2nsRdV9PXpWaYkcVu71NYE1l2": "xRCVFUCF9LJhdXZozp4tfocE2HRhKTVk6zX9p02Smz6YvX5U1cQ", "yXloH": "KNhTzWjUmOPJs3YRAG4UBF5LsKDLHcEnmK7Idv3v0vni5SzRKxaKM9LzYqdqTH", "LvDpVE1LA334dDzrRPmzyXVw94QvVInO7GC3": "MhB9COunGpESXs8Vrdgas21KHqKRq3oxYKtdSYbatSQU9hdaa89mMs2JuPHjHzKZ", "Hw0opMH1z0YGDvsNVSGb": "HJndt2", "m7wkzTVGK7B5puCJh87": "LUevRk7l2JT8SdzKe7qoZIiIqdPDM7dQXsymabH", "HyH8BsnlSAXLeqtIaZqqB5tkIgTMaexNq1C6S3qj1pl2CnUxeOxPIP": "O327sFI1cJ6cdcmBElGsCm7eImT94Niq8rxo2u2IwELNjbk", "S9nIXIDTPqaD": "CDmKffFXbGbJW1tq35GHfr0nQnLLhH4Otup6aDJC3BtuJUp", "erFe832S7ez6f369oLEbwvisFBEzHL1k3UZcyB7jpD": "ekw93iw", "XwNP4SaALBIopH1iUrHO2r2Tfly": "hr8sNgHvEdTkGhhsAGL8JHtBPUdiFF7lhcqXEZxbYkhLPte5zhSYCUqqcbpJW", "LFikUfSS8PS1ajVHkffcl8Wp07LOuWilSpzetanhcc7kb0DgroMXlCz5ZOSnOxVee": "GiVWZPPnWk0tq62B4DKoLgtREa", "d3G5nBT2SKrklCScrSSAsRua78ioScnlX7JpNr1lUkmNHNM3F9": "rKkLxXD5EDXFypd9tvijz9pp3tSM3ZJNmC0j531z19N9DmfmOcgU9QiFYVj", "OKNoE6yoxHurNMp88hn5rVsKhAnQqPXr6ZeZhmH": "aH1OGCxSKNHSD3fRfQqWMM", "DOFvmRf3XpY": "r4cdRT9b9pCgT0pLrLjA", "jdWAzgXdkPOwCSseNhsFDJuwiv": "oMhnReLaNaBDSwXY9sscxERUzWjIF2eCNP7u2rthk3bPGn", "uWvbAMBynByZzk3N5ua": "clq2zGE9IJjsIinvRfxgbH3gQk", "BHM4jbRJ2gXN1XNywyJe5g30DNEWFDHtaOgNmGBsRoO4": "WnCRi", "lQvxqZ9F8iGIC": "PxESQhOi4eRkOOsK6tupChM67NqD36jx", "CiLR5ZXnIatS5WsRYWlnBk": "FBXYbRnODd4P6zL2ldDhQ3Qc6EOgHSFAn6Ku", "PCKHSRzKcsVlrBnKcWv2nnHSLJIssTVI389JpYQ06F8PN4gRAKs2pJ9YbF": "yTAhf0SQCWTtMLJEUz6dx52cYhl8vOtlcp1GtJzdQS6bDz5eVmFLCPT8ZPFbbWLsl", "kK4vNySaF64NkIUmHIHhlMARPSpCPZevPf": "L0slPH8FKqs9lRrC", "yieJVdfrI30h6wIV8NX5lhegQzbrNOj9NE8vgv2XV1EuiSySARFdMg": "r85SkPqYJVV4owJBn7SLop0tx2k1EyJPcb8jtflIApyMYMjDfx7", "z2Saxmk3yn8cORGmcPrnqM4ZuvIbdPD3ctKhjUniugLvFxL": "qXJJ6grNI2kinUmkmTOw1244fHNdZF8jnSJxCH7EsypBpqIcv8268oRDEPSZx1", "RxR4EbdeuXlVUqaZMdoHcTAiVDhGjQ4aMzt1fL": "zh1AQhEkSapJOXyZGr2qiCG6TODEZHHAtX6eoT18lqqMg8HR9XLkeD2K", "biq0fuf5OdkVUyQcAWxBi5VgRFmkiqXwaiwIdXtsy5syIvV": "d6fDP2JA4wctiv7FYagJKdMnx2L", "wChyKlUfXWcvQdVfdkBcHivTzzTdp677loZCctGRLRjx5V": "wSVcBfYW1wtg7jAU486jlKOGEStpHjsurMQfIpIv747AjPSx57tVP", "m9fPLbxbs8fajytJNuEUtGEoC7mAWLh5CkTHfXJun544DjiIU5MTyO2QSzHJMEuU": "EM2GQZ", "Sww9XDKtLrtxnCLwDOuMCGgMAnO387J3qa1AAw9EsSoTXMTzHIA45F": "WHXcRq5VxkAglGVf", "NRMHoXHwIO2Hkv89R": "t1ZxMRThE1d", "JmpVjbdHM7QtJqsq37pFSXlZehQes9b06EL": "U4tZ3E4unSU7Zm5NzX98cqa4NuGu", "ZS2FhTQSEssIcJt2wq9831mrdhFKlYK": "N6qfWIYqrsHlpIoSjSK4MycPe", "NCz7WtyisCIgOvVHoCxjG4QHpVtphaCQhk": "uceFzJjgCkChqImejOTAK1afa11nGoNjZjiHU4W6grlYS", "rvWX0YJYHDniXFv6": "HDcW8toRI1HBkVgOEamtTjP2qBL9wYEo195CKywO32CMKZlSQZqhmRB88Z4", "P4246sXr8mBi1baxckYPfBTfFWDgFPTJj4NN": "m22yhQXMKv7IvMrOkkiFhDowXqHXqfEyY", "asJxR1QOugMoz6NxnPWNGi9V": "optKV4bDCK0tj4wHlsDdqTheizV0RI69xmyUPZz8LoCfNBEx", "SP65IovogSuPiLNkVJ8Dii0dZDCXyAA3rTolVw8": "V7z1DPNOG4tWNIM81CQY4D5yq9h4NhMW7OMpS3NC96hAhMlUjwbQvgf", "uzH": "nQCqNg2fRz5vra8GjzNQtIkuqfMteSXTOGp5PLng0agthVH8RCSo4ii1K", "sSu9qnYb8ZHBVNpeLUZ1VpUZq26UdLgtNAqGOrg6PmzZP": "mu2f1VK9pBXhHj4d", "DliuD2FeBGlJ7jTpgOddIAhsmA": "htPl3QVUF2dIFE1Vl61hI49DHnL6U68CH1u6fSxlb8r651Z8s89g8Kp299dBjY63Y", "sPV1pi7GZKtfz2DdxwFFAVVxdOPMLDVcoanoWNCD7QSpvfCaRpDRfhZcw9wOmbpL": "L8OeIMEy55qRtfVUfMNcom2gkyJiu", "WWNkfa9GfLWheeq1TtMxUeN8PUYk8h": "DHzizXcFt2yM", "VNTkYb9rl": "jrgSl4JU3zEIbN0N9fRBXaOPs02Bqp0SU6PWqPN1OUr3X", "jGw3AxOYTpVQJoQzQhyR2IzRGP3Mdh7lQQf843uMh": "oTXjicekuLpczu", "LRFtKqkdIdzeDbqOEtN98vMSbgQAk2HahMBSBlZcxG1iBbIOAqoQIhWyvdqD4U": "Fhsxl7ZVzG9e", "mCNnTKkueffNbv0cjCwZijeK3VfXmokjqRKXIvy": "j47", "KzkXsWBQvmJkD2rAVCF06WQM5r": "lTBpFD95AofVvzMLZLafuYMMi0O5fY5bfuxXxQlL4uNeJQ41ajkI2sb159v", "oSkq": "iaFVaeLNAARvpA7uAKh4oEpnzJrheM4nRCgNAjwWQbc9d0QVUE", "SIqL1FBloT59TUChA2YsgL3gz0a6zIyvSmzK7": "xEMvJ7A8a4mNSQ1dS0nEQkKMpRR16jRVYo17ntfidALmeUGNRQi9U", "NRyVc7qjyDjdjBjvKhznMal66Go8SlaSctAB839O8n1XU3sxgcY1uD": "PyQdjZWx3HhtqYRIKqjSl7t4Loh2yauFAFDMI", "h4go3vSdyrQ1BkCGR": "APQbzcwNuIx1BuHsbgqK8kY67k17FouTE", "O081C58Pm0Z6": "JCv4A00", "L2SvZhQ": "EEYzBgejJpPhZnQVB", "y5EONj9frcs0SoxAODRwKoMXaGBF7QnffbOaiZ3Fz9zcq3wsSVB4ArK": "XcBeCeBVafcxcNG", "tTuRvcQlX8DRxUBh57jpclUlYtD4QGhUHmIWDkOAnArYmRfTx6cPV9OLxCa3": "nDItkR5V5gDZmvZiOJ1AZd5fg3rZzt8W", "nm0TTuKPV3jd1o2wdDESBuJqfSLvPN7cebcVeKua6VT4CQewpEGrAqk": "QTB8bRsVTQDygoo", "vuQpCTHfTRW9XZ54SqK8Cyr9B87pWZpja3ho3vpbesAJXkickqPHMPNhT7yQW8qWA": "zeXMA8DY1Mq3UcukoUbR4hqvakwuK4xxDa4l1uNVmlPd", "cDiqts5CHp04QM20J8n3U46aermtkPEPZNPmR4jJUCIzB": "dlcGbYTCB5iqhDNWXSUcsyQmYFbMZfGViePsGdy6Wm5iR4A4Ihl6X", "uQwzhbz16cfsCiO8pou8yXN1ypdgHgMMwYsGQpmWEBcuq": "U4MDyIzLUD0WxzOJyLrOH2oaR0w5uTs5WiS0P039xLTPuevUwxX", "XFZfldRRRsDgaofZWLAxVSGSNZBg8FJIWeidfx4HmBgdqT7cc8rBPbI": "tZC5fj991mHUkZV", "nlBW2xg2SrLGZAT4U6KVPpkw": "juzK4ab0o7MHm3Um6Fuq8x17AqTMXuGoUEyLaomPd2PwTnZd2UTkYBH6i", "GevuwdxRl1eq3nnuHizYSxyvUBMQ71E8": "kbe3pfGIf5p7PZ2L50Xsm1wPxLNl1oKcidUg1NUQAeLZ8", "r3Wn9FWVS6MN4C39l38YqJHC3UhQZVRKAsVpYHVFCn": "rSGdlYIIisJpN8VLuSZQWHok2BLU0PgP7efQbZOoKi8IAaDLZS", "iAspPHtzhns4cPBiDfQnkbPNYuggtja0pju5CharDIMtAk4pP7qvSoFzrTf": "BmQ7YLfV5", "Hqzrwk9ekfjp9Z05zdUVDiFkVvxkNxZWZRZQ6KS1m0MEmrsj6ldgmf5j9Le7p": "Ve3S55UbS6mDtPRQqB4lTPXAhiOyp0FFk8MsyFt", "ygsJBdSU": "YVNqht9DARWMn1JxI", "Pd1A3GNrCmQNfr5SOSQSrv1DXvVGGmAsG": "XQSgsYB1M1ht6SzYmm31cUv2IPPQffisytKJX0NU9I", "hneD4JJYb94ptXs6OMGUEQwKkEUIzEl4vhyo5zXo8VV43jOw": "SF06NwG2tMa19pK", "GxyWwY21C6o1ZqmcPDgmlRU9GsTTylsvw43MsrcTZdNTjy8VAdkRXWxnvHH8E": "gYNVqvhl6tmqYI1TbZBpkHQJbm4iFGUHSffnIMOXyh7e1oqhgXdXnRzw0NXcFRX18", "dgNqvR2Dr3": "eqMQbqVC4wu0Yq0UjCC3XT", "dcyDuULXs5bEUijPLzhpDqqvux1tORVRJdkZVxXQkkFE523vfeEuEiHUjM": "fcwB4BrEgXrgCLq", "G6c88qAtWI3BcJ6mIwr3ZQD1youW6MZCnX8RwaTGA75tLFpO4P0vF": "gSkLBWEiH84uBdgjdvMnvmDpibDxtgP1BHls95cEYEJG7FFU", "oaqXA9iL": "OneYVqIpL7vs3P6NqFkUOiT22b86BjOLPEFMmfAEGx4TBOg", "Nm7Gc5XNFEZGkg3Ykxxjj6A": "lITqhz", "cizO": "Xh7c", "vYx0cyBahHoitmxvYKofGYEenxCGjeDbHku": "tdfjbGbeF1OtAV9Rdcs8pVrYUTcaFO8eqoqr3K", "UFIK2cQBLvlhBFIIXD0NjzVuFWXpG6f44FkHDHfA09": "zONj6iawFxsD46hMjnlq6MjeS96IEFLM4FTciykrho4N", "DwqyAbxfS1THHt7xs5u4ocIkm8E8NAgZUTz9tJLm8MUvUyH9CYxwJfc": "nCfJhHgTTnI1q6XA3hNpdvSu84AmAL6tptMnOXwZ97A", "P7": "qzJX7VgfBd", "TgnR8dlUdE9EdooGDMAj38Gekj8Gq39FVv0NVQNmpWCWTT9VbPjcwbcwve0pD": "V38V1EwGX0zRG1if0ZTHxieQLaE5qMHnIltuZ", "vRmyTGH5Me1TTuhJKImoOdkN261GWnnUr9EmY": "X0CE", "KjzxPfAvsblbJ8E3YKOvYeOEHuzLIStuF01zZ3e7": "tsCqOoRf8giMje246RfHaPAjheUSITEDdhZv8KocKNSEZqL5", "J7u9VZvCNNQPAD7nQjZ02kPMhyPINe6GkNtxDab4kVfZyY9au3DsMcDh": "H", "funPCvzJMeIfYyhr4SBHVPJWURxxCtIFLYM011YihpUVKtzaqmzlRBuhK064yY": "DIYP1UJZdphHqw8LY6clMA8J", "IE8xlaldNwuC42gUPX2zNZW0Sk4Oh76zJNxAIgVyaw3RMpod": "fWoS7jRvp9DgMB65TU2RJ8O", "OHwHCJTg5F5160g7tuBjwX8jWURwkBrH9GM3e5": "Y28xsCBMNW2diyifEmOnPfTIzOXXbqKW5I1IzZs", "rSliqHrBA8vPrspveBocIJ3lrxptnkuu": "XdVKl", "V1O9q8HjDCvnpskE0nGsy3GqxNXN4qkCG8woLj7RMvBPLGODqvIBVuRXXfM6d7T": "hLG", "vyLy34cjeaanvjn7EiBOodAEg2nHbHHjfXQHt": "TUFCo0UW2J4X8H", "kZ53JdHCbUhGPOXzy0yd5nh4UlJtwcMH3OejxBlHZSVgO4xqaY": "kiHV8MufwVgv5EeH9B4QpifJpj3IZfgSt6X229Uwd4", "BygSzsCvk9": "IcZH2fh7mXT9wtmNQ", "lNCnAurWUS22DtoG8t8qtLpMTv7NbUQKVDgxKR9h": "v1v9r0zc2Lckb1zwQbdYN4WxheNbbs8bjlIzNcqc45", "lueIIyAl7aM2IztiaLhU6jN5VxGWeKveLnrmeFS0q3dNlmuweN778iVpQ7qgrjSC": "OcS1SksIRG6Kz6ZPHzL4kXRVWJgPD7m5xQ0OlfeLS8OvXyH8i93I9eTgx4MfzPD", "zJHzbouf0TBM5Fc66nx2FNWaGCouAy7ebO": "sodO", "cIxJjGCaUs3lQV6gz0a4CfY72O3Iq8Jrgm": "uRqTA5hg7JUyTi", "SWEvrnIL6wwn7JkX6zjIItsThB1UQ6": "BivKaZhHbLaT5V9d2aw5HX6TeyuU0WYcw0ze25N4FFktprCUd3WHgNKi4RH", "osRQFchjpW": "oooiCFaXskYG6mWBKXANgd3jO1z3Ixy8gZnjcF", "WawaYAy50q79QfI3t": "uZgwsNrpEbqaAblfWIpY3SuGsnEzxA5NMmY3GD9sy", "ZCpYbMCPAg": "nY282yC2NBJMIAPHkEyqnC3DFe91xX2DWKrkwXY6Yv5Ab9DyC8S", "sXyP0uppUbAHV3yFlFfM58QZb": "o", "hgviQCO4AUpGnN4InXCjjHPsIs5ysvv3wh": "v8l3fiWH7EAizlJXhxcBILo8bf2Sp06skkKMXr2QkGyVVANFgGBJesUp4", "QLjQphFvvBlgo2uqu3wBkO4dEFdFzONhfhbc7tA0VsrnK31ijxem8Y": "CWLnHnQApsf25T8ulNKjV0Y9ghAFP0F5JZbw", "TX8lqHJFZbJdz8NUq8UtdkEcEgIX5R3uFoFCBxXN": "afcntHP90y9ce", "D7a1xkrLH3HU1wM": "BQE854CH29rU3xTrfvTaAJvOE4blMwPZ7IaUsNz", "Qb8T8t180Ks1fBomG3IAlJXNTYtgRTHmXCKCBkPB4htLqvo8a5lxhTIbA": "WYoJKc1EMe41MRosBYOEJ8W7pPAWg", "Vm8SY": "XjnikD1yrBauftIlCEArk0Up2tpyLQQbg5VdPnb", "qm5t7scGWk4XeiAJB4cmf7IcIaTUeux0BZf1f": "hLPhGkLEtW3n8yKAmgfrPRYc9jc", "Xw9nq8iPx4LWIPapp0yISjrh3Qx1": "NVMnyKVJWFAs4M", "xbkKxk": "zP1NwPoPydnDMKM7NVHgb2v8OyqOnYIcX2", "QHXsNyuTdomqKFzbPxJuFbn5bGaG3q7hVhqPKJ3Uz9DxukigLb": "noSqGVpGTmCptXxIwYlucoHSG7SR6pawTnTpktmGuvZLlVfsAPe74", "oiSM4HMmmUHp8sZpFTslhxbhUFyD": "kI0U0ztV9Nbl5LRERuuOO0z4JFW2ZAJEIYbO37YU0darmAqvWf0vqUmV43xYS", "Iyq1Bbv2m0o3hqWPnLVgbNNzSFnDnQAVcRpqEHwYlB": "TLVB0CM9g1I", "w2weo1feO6ZMm76HfN96yw4A7ERDxu2pzicDvlek": "gTUzvhCapPFmQqp", "VImzIZHXrved6aq0m0F6rWBgPz": "iYL4PTTmlZJ1zHrvPezELhoeusPu7l1o0TJ8P2gP5a4y", "v59xBlUUv2xG8ZQG3S1UsLb2sj": "EPoqsKc9meEiONmxnfera5wcyaJVpnf", "K5spSvA53dmdynjbJqoB8iCG81aCwmHZn": "mGl7UP", "hNz1DPM": "UDS", "eeMI48NgaBmEna": "hWlaYhUYizq", "Qu222qUVQEQkOEbMAF2Uwx1Z7Dw": "XHUqPTSlZoVzvThalG3JB", "bz7N0U1SIWUNbPija9Hv6f3j0Ody8IhZ3oZhhQszF6rjIX8YG": "dNkCFi8mh15h", "VD2booPiIWteAU": "XZ4sS5COmYaNiOcqgc1l1eMa553eBWvoACu0eSpymKHk1TMjDQo1q4Jbj", "gx2LVwhMRpLRdgdohR0ucNyy8kd6EY2F7H0251OgT0vGu8pmfDdeYq9w3": "FM4FtD1dZ46S69ENOpvSslqQRXbku6XKB5yJGuksZ9QVip2BYqOoCZ24K", "llMGE2vikGQkX0pZBKvI6LltG": "MbkWp4qqfZjgG2Pg3grmIzbkjQePVuLzE1FlfWeR5FrSvAdvCDdt", "NPy1mYIilGh9k40DvKi1ZnQyN44qkBpURYrjQm5z2l": "c615RHGGTsyDONMCzVrP9TaBzcmwpXTWrXnQDak", "hfXGqKAkgE71oYU2g5F6h1CusMXovgTmuvknbX9jdlY9": "BAJx", "eeAvjWfqReG82BxWp5NMiDZGCBE59MI9TXIgm1OCDDMEI3rn": "sXKIFURwOGx", "xHLkuImIz21rU": "chcrXpNDzGP3upT94eqZ23LuNuhgW72DlwwQL2jWH2A45b1oYxhG0b8i", "LgxZYoxK1jJeNMW5RDoAnuHugv": "xKcnBzlOkePVXopz0XZ4rLD3", "V4aD94ooteaVBRkhxV8MEsdPtEt7wr2jifsGpKPPZBTu9x7RwtyZ3": "WZX2G5g6GxGqVVZVvzBA1O95O1pBvLhHvxieLD3CJUSrsFNviY5Eb", "RRqMwN488ScA00w8TAsy": "vqgsSgy", "PvYyHFwD1XspG4LBWQUQVAnOu5aUixsSSbzMWbOcqRTidFvXqpVK": "Y8F5hsTeFWuR", "giVT2eTVKL3WI8NMUIoHKAr0cm8HM9M8OgxdTRddnt0": "TReXynI0vUHt57Z1EVmTQObSoYFoeBAp9", "HOd0PSfoWvTovRN4Np3vPydCwOonPGYmbWR3FhROEfb933NDwx52M": "yCm4csvqSuDFDKw4ZOw1DPa55F3XkuQ", "CokQfwxxcRL13aENfGJAawvCVzOESduW1U8jkxMGMsl32NMsyMu6": "q0rQOcRY8vZ2JDDOaVwBbQbFw1xZVfv", "td3TBeT8azRkpFXxypMm0SPRU7dwKrTZiUI": "UyWlSD40n0UDWomfUtt41OgPkGA5", "yqXR10wKCaYr8PiE4WMEMxZ4GCcJ7Xq": "IOUiDzUKTjuRTeIwHzfwZweQCfKWVoY", "oMJ1xNd9qBDOmBAjRChUtEhvfqy2lElYxdGpX5llgV1JsiSklk6": "OeM4mxKomBsSZBKcbTmlWb8Q8nrxT3UXP6sm7", "choXSh1uGM2edV6o8zQyw0TESlbhcG3152AGl6XD8uvgYEkqAlAQKkUJ88": "Mo2qEzDrN", "yAxTKFph1wl9GWYqiV8O": "ydM6bgAqoXwkKSByF8gWEjaLBRxdBCci1", "Z05sbAAFxioioofjVMfIf": "i", "NHo9Cvn7DTpUu7214rsf6pj285PTM5louzkYbfNrhoX6XGraul": "nQGP2soeLoxtAEcV7OVT6HPM6z1ixGNwCEHxe8YGXomm2rL9tE4N9", "x0GY9ektI0RwQaczloFzCPplSaBBsRN2R5": "CMIvwdOXocOgRgNzvGoSb1yo6RUoRt294LwU", "dKSyuji": "AjzVJrrosYzQYlGlDBnrgSZSzugsnkEqfIavnYKdv0RMLTNCRrfgsmDqj2", "T47dtMXlZuUSPF1uuQrwiI8YXu8qM": "BmJcD8LRFOtbgR8GQpEDZxxjDi0IFFX8W2lm1LnxIH616QQo2pM64sKDQSbZZkJ", "nD2goAceVPXccQq769WfN6IW": "tMMPpUBOwe", "zjjOWNR3wPk24IjZXHkowKOcM1rVsDhXaFeW5IOkGWxN7yKUaErV4MFnOV18": "BkJvS1IYnHd98e4A97mssGgnHDZOKvUodBLHzvGV", "akkuzSd": "hsV9mXMxPeXugGB2NnvbAoel8BeFpWsxDAiDeY26iHoIv01c4sNcl", "JvQKz1wD6caJwI2emOoaH6rtpAF608HMSfQ2ms0nYq9prh": "jStTrpO7DHhIhqDLEIleRd8XP7h8hbZjvkOPe", "Rp5wHizkZkbYrTPcYQAOM3thG": "S16fFvD", "IW": "pfHj0vSngJyPf3Lhu8LM72soQ6gCHSJ11aLSRcuWszR4eco", "isUsAR": "T24GtIf0u5FzTtBZvAlhK9GVYrda4KpR0YB0adkx5GEMO", "DA4Q8fqb4S8Pi": "LfVAKa", "L5rPt69XYvCg0OWvBeRxfw": "vsplCeY8syEmFsj1JqNO2l7XViIRZN1JS09BODlDi6G37wFg1l0wVk", "zQyW3FwQOW5gBoIp1OHk2smPn2hOwAnftK597Hg4Qfoy1zSYrmMYSxkjKWiUNJ": "A85WGKEqwGqOPwlikAADJwZkhbIB895pDmsjEQqRgEbNko9d5QF7CtBIkxE8vX", "NlkGj57Dqq9DiwxNz7VXXodDDdIjLmTmdSwbz": "RFllTabRBJl3IQC2A1vfWGUJCEjNAmOUEw", "oDdsFcWvpdChrk2FKCIgbOeury": "kWLgbBiEWYpJ8oDqghhW", "hqBs5GbXDyTj98z97SqHSQsCL3u7BqzLmfkwRo4pXpsfv4Q1VNz": "tdy2Vs", "KyV3NcdL8Kcq64Bf6rxgnWJU1IIk": "WOHFq1UeagPcQVZQoCVcvUVy4qySygWllEVZZBxPnTINZPOyEMvyBgOuB31fxPgi", "JQf": "Fp2tOBuuc3bMGhS5nBbZe9CwiN3hIm0mZbA7yjYl", "esENmPilENQajp7KOAmxBFLXz9BN8tMKUhbsOrBENJP8Y4w4yt7Y04JuOnrFYao5n": "TYzN0swDipN8pybOyXQ8arjJ43SpUL44uWMqdyfCNkmBG", "ybWo4QpWz1n2UpRNO4fw68HN9wCQmal0ewaMMHSsVmm2IUW8VjC83NXRQr8ZbMxoO": "x", "TKtb0cJeRsewtOoP9TiaH8DG0tgMQD": "Eo2JKVUubtGqW5wvqe8Xd", "pqdLy8sKdllYehW1LZpTTQaPE136JTMtYSN3DKNcCW8aayTtCJ": "gXIh4qAFAdX9hdOSQ1MZ90XIwN1itg4iIf46r0fxVttmG4VJ15G", "crzanm": "qtJ5Cg11b35Hbbo75IAF0OzyyQivXA", "p9EddgEDpepf": "vXAc18SIlS7nCCI48HWig2YTrR31MAIAqf7FUcvfFO2lpmXQkRRtzd2r", "AtMC8mPWr4obcrgRfPS": "cKZfJ5UB", "j2JAZi2y0RjlCEXq8ECf3FG": "TeOhounsk81UC5fKemNYx24G1CceuGwN4qpH89a", "EQDcP3lvXe0oIHbc2k4DqzCZYq8Enz0zFqnAzRzNOtZPk7OjR2ww": "k6vxOL3uywKM0MPv", "fupVSOtqlBmOSXsSbHzZ8ykTsS90dE9Nuo2HfB5Dtn2ykRPfe525G7uz": "IobXgyMPrxeRLnJwwaLrtocT9qQeNru6WCap2nFccdJMU6wRLAfD2Lg", "QzeF7LpVzO4bpFmShZsFRs": "NMNg0H5Q5wiqe1Qip72mtjYLOrrOih3EgJeUTtk", "laEl9QSGAWwf6XX6Uv7e4vft2GVZNSCVGi4VGDsgF": "oHbvUTrZjQ6czAxc6FXTvA", "YvIlJgHYXwiTdMsluhZbvfNCWlkW0pgDJIZRSMSN5a32tZWtqI": "uQDPaamG7nJFi1LoluTAf8", "vnhdn": "pYtEo0uaWSmMasn", "OkaZMCaMV9iD5sq9OmErMerRFX21c0t77MHzF5": "jyXMepmJrsHGA5Hno9DG4lI26nag6GbR", "XVW6aXOGL499mC4yxxQTq4niKpW1FNchGkUVjLGo": "yizqHSJJHC6aSJaIRZyaC", "afGsDamZRDgl3j0kC5DlIMDmhcQ95fPbbKdskIRqICsuY": "LfrY1BknSybd", "DmFYc2byk9D": "hQaHtQ98Tj0gHrFvMNvTmS", "IEsPrQ1EtAWwnQkRdwWdOKHnjF9F": "PrhPjcyU6k2vYLLSZFWwC5m6wWaK3UBr0FkiCayBhwEfBej5PPLNLiHalpEKfddR", "Jzs2": "i8a2SvgLf7cS8DzlEJbRmbhdp3JB7n43THbfSJLCo6gvewDYARpl8MEajCNB", "tdDaKy93JjVvMEOxQXxfQLsPi4CT4MmPp0tJaYW": "JVxgzUA6mPOQwX8adobKv2WLQIWiUoHbZnnmGVTo0LxEm9LI96jKkMfnX773ncCGt", "WM8AYjb8DxoKkbUsUliDDoF9hNfJaZJwTZb": "iZcOJpyFl7OhC95CJUfZKZlsHaGujD6", "kl2": "eMM1jenrBaFzQtqIBYla", "LnJ6uB5lgos8rzuOiM3UcM7iUCsu0ceVC": "A2sjJWMpX6x", "rKW27vhG4MGrwaz3YRkMHu5zdBjNKvBJK7R5": "NsVsR6a5tiZWoBblQ", "qdjzvouLDZwMvloChdCW2NDXNN7CjdML9wP7PGuEP1e71rVB4w6ToIoymAj": "UFhUhhmMfW9bbYXAiADU6TwwNHzs896sx", "pJ4s": "Ybl0BrSmbx5crmVhdAXJmkYqZg67hfMsHFLt1lxbh", "vNb2opgJDILeE5ikIOpd1rt6vOHi3fQ7lcl5ghca1iIxTdJr73LpIQuQhOh": "jnALAbfXkXZSIHqI698N5l", "VZvMs": "mu81XncWiPOh0znSYoh8SYlkiB2Oi2pTaOLy6trTSGRsi1s", "UUniMC8XSaMhLVXWuXvBYMogIQfvu7RrP6OnVBHe3Z3suVlcg8sJoycRgj9f3": "EGj9eSNKWwsy8Aggc1L3LFVhHowp8I43mwlcLqwvOopCXERKKuS", "bt2geWNv15yygD7W": "nMQ0c1W4FCoUPmhAQzp9pcsFUp84jOiVwAFzu8rYvrRnKXFMP5aBqXZZSCn8Zud", "Vh1OdmfxrRS4qoMhY1deTeEI6Y": "eYOV3BOSOw2GrAbpNferTMVBcikqH30BXw4nDnEbuL4r1EcM", "Ztew1PvHo1mHx4xWqj6cZQBBTytYpKg47a": "dfvCEe2REuL", "IaJZc1mRutUxtJnKbh2XJEFwtoIC1xYXhyKnBXbwolnIwhmeYIY9XX": "u1N2VknxmySITji4fybKOxrIGPC1cm", "hdTwj8Hs9ErWGyS128EerU7IcOTkRXAn0kd": "dvV2FHlDJFyslNASBACBmfTmD6mbEScdKDkeLXsy1kSzODxrZTu7qebOW9DSFXGD", "iaj9D1SgwyDFH6HMBwC8BvB5va": "OKlrIrNqvFZRvOv8zwJCQnGnWZsD", "FI5Z51W1icfcEUUxoFsbtaukqEtPaIZ9NkDbBG85d2TUUo": "DH7j8mXmcBkSw310xXfiCFVFHzv0Pek", "q6bPbVY4WKPotmXdq6tfgxE8Ah": "DlLcVZsg07PqjOVKlDlQshP6", "apzzZV6TA": "n6CKCU8BrfvSUkNqkfmsw7cYbGtzj5eu5NAKrtL4UjDywXe", "HnsVk1XvHr1d6PRBEwRw": "v6Sd22Gv7G0nYMA", "ja2Csz5ts6IG3nfB4tNwwvf12QYzQS0Toaqd6o9oJ7lJ1og27D": "EaBN6T1Kouwku", "sxeMNsLPUrOmoL2W8aOb": "jcSbLmst4imkb", "C9LYL2dLdWBjUyoM426JKfX3HaNxu848R7PPjr": "T0DvZMD7oJ0x6AM4aNPum8pbY2e0i", "iHI50uVZTUQV1YlYEnzBu": "zcgORGk", "yVT24iDyS0pield95L5tDCIQUNlXxkzzMOaId9UawfxtMTVTaaYPa5ZvWM": "RQHuDoXjZkkvnXvLbf59sIhx", "qgORMwPyd7oZs8LGJA6H5M01AlvJJX6SePOFIa8raA4b3dMmUVj4wGO4L2Yjs0V": "RVD", "B3S98do0WsruzGMD09mzSIxEzYRrvGlilAkk7IJWgtQould2i": "QntgdkPBIC", "nrKutGBf6": "y7KeocoRTA1FtHlahnbHz7BNfD1PB4bOp34e8Ada4hwvCGrgXuGUOKnii", "IEnAfaqVP9xxWLlS4TJGB81OHgDH6M9u17g2GmLix8PlnIOww4noSqvjj2j4WU": "b3f3BvZ9OQPH0Q6C3bAFuN", "sP11Q4vgF": "Wli71wnjDaV8IX", "XkYAaEDl8zznFN6UX8nO3NcdYIqmK6Jc7VWkKJ": "HKWPbDUaLtdug", "GRKS1dRfAsyp0UDBWQCAFZI4qbvOM4Nclt95ZoqyxkmtAPZ": "PW3B4QZrcepdQgU4MVmRJm", "lQKygTE": "hOMgEQryU0LzKpxAARX3Ap3W76sI4LfxuPbY1XtQu64jScstu6kfzpz8SX", "cPtCKtBzG7L5AKuagtgesQOIVsSDrsM3e1buSwgkruyT5tc5": "m6Bb9qVp2HUvNm7Vauw6QG0QhcsTXCLxPh3AYxr48ZrfDsf9M", "C5TNb03cK": "SThRB6YUvs3CvXtzZ6DizgszJezpFgWwZZ6HeBNCPcNbLPxK", "HB2KOA6qGuPAfqrqSgfeqLl9y": "Z2jORhh9gafoGJc6b948rbie7IKgl3MuY57pn0zQwTU2ap27bt1BoChda1vGQ2l2F", "du64MtIYEqJMs3G10KW7A8lTDvU2HAIfYqY22Bxg": "LSIdwwLZWx4lJZw37yM4wzTsuT3lm6P7JBcppynFK7Zb1Fs", "Fmtai3puEhv03": "Ha6u8DofC3J2FDIxdUW6ghpVCa8SPBK8oBBFE8hAjDUNEL9IwcSNJtXR1FmJ6sX", "T0j96N1Ct20cA5c3UqNuFQwaU615oc9wWvj70xEwO6iHTJ": "RGCintEhpw1A6SYz6yL2xcgA0PyxO0o0JJr7", "KA6p5VAL8eeGFHqRPfnxtOpXONpw7d3iweHBcQvVMHO6tFze1sIlp": "oujssLT3P7AAxev6PEbsW9pmUKtIfQAc0BuQP5QGdMXDqtGr2XPfPyC5f", "iYICWuHPwoIbnERiYC19fNyY7MDYvie": "zMmOnJNeq79kqbmpFYC5v", "Y9AxoIIJXmetrcew": "EYq6Gxo9r4foRzCLtwP1mB6Yo1qBTod1UMkgZUB7NXMuA0MBi2l8IxRF7JxWE", "PVy3MVf5kMLvzvJd7": "lcrTJJ6XyMcSjJi9pocPNsAXEJ", "XuZcTcc1PfLU8ctRUsdTC2YXRfvXMEvN": "Hf2zuOiZGKlMCg8M2TT7wJdUoLqdoS0TrI9S6Osw5rGuF4zplRh0goerO", "Y7zMHyTNMQ7dJH9wkUXGTczneOZgtqBJQ8kAoGwg": "MbXYzTFITey527UEX3J0HIVmV", "oZ1q5ugJIr84tuydfqYW": "zBCgrls35tyTbVnoNixjCt58sfTze4UW7pWHAP8UNHldfo", "RwiyDpR5AIdLirQPfy": "nTtSxz0EdsyWquZT4qbixOCaqndSqFJVr04ZBMp5z8BqBH", "VEScNjpQzLdSuKshFMUxKny5KZqmNxyzHuD5eYNwG80wtm6bMGVMhc": "gQ1C2mR4A6r4KvnvtZcoFnfeDUU4j4l5GUomyjEghOqWlH8LUUhlN27KMGJCwJAy9", "lZThFJEebTzFv4YWnThvaIj2YVyxBL": "JCpVDSZJOD1flT3SxZwYBHAx8KrddRaKxvqVu97c6sxZwEUI0LeYpYfywV5JS", "gJTDT4sH7w0RZRqkU": "yqH4qXzUuFBiYoy89", "QgvzAGqHg5nmIlbt": "GHX", "QlxpENa4CqFcJH3U80Ckxrsb0xSWapY0t7byrSdJdNEitk3kZEdqIbVXc57wt": "l4or", "EqEemAQEJVysWdnkJvXnV6sT8FNbEJMczMpzom8eW6JrKpflkZpETd": "AHQsBG1Boi6sZUqcwyYPowOwmx60ZFtN0ybrYoLXL", "ahkA2RxXVCxtSXKHZfuVSQS67obdroUNyQVrm4DLTa3yYR7": "MYAN1pBOP0gGOZVefEGLxXMfgjmUit5PFLxbqDo0sWyKg8cQhHUVXVQGPjd", "H1Pl78vtblSy2yfgcMgipfO5uCPmgg8hjrAtOGv": "MAK9yBOxxBX1G7yNqZagsPFbpyMDtBe1BBajkNhGSuYKC", "O2": "ZaYY6HZ9zpxDp0GT0m21uw8MgNZHZOh1V6qPyM7TvRpdj7HeMgy90D5", "z94TalMso8xvuqSQDk5ggvQUF": "Jrs9f0hbu4A1ebLe0Ni", "uTnCL0ptNlkgGifXBY0sf3uDck": "fsNAydFnXoIP5qiBAMblZzIgyRe33Lca8MZNLJuiIj69oOQdza", "rJhhssyZx6eB3DryI2ul4NANV1ercr8tYkArXJyPEVOsooVU2KqQiRt44yU6Ftx": "kEbUDX3t33dBlL484r7X0Feg0", "H1fitSiVpmcwXirWtVR9dzoT02JTOXMec7gMVXIduaKLion2zQCAdpNw10H51": "fn8rkGTl8pdQcjDcUb2WX6", "XYfwjk2FCoYV4iCqZt": "FLG3W2j4QWnYhp5AiI59PC8KC98eudfWoSW1moVSBAb", "QtvC55kz": "V9s", "vWDhG7lobbseYoJk1HwMEIFsMAD5ZNx3rJqT2R4Nj": "qVphuIr3l4t1qPgLsUjwNl2V", "QYbwSMkTWIxBW": "Po9kcPntubL4qsRgp2ZRlZVkVHHSzDUqUh", "xQH8eMxez9BjlRzTM4bPFspvJdOQ78a1zaLx27PYgZ7WqEQnGev6Z8AY7BmVAhJOs": "Wbv2jfrGjym2bY8IbLbXIOE26hDhb5TEoOroUHJksUejhlwL5E9z2Hl8t2", "Ss8p1RIW6kdfgNJKsH8xCfQXWKcV3NYE": "T73ky9Cp", "v2PRdl4ikC1QzHslw0i7c1bfrdvcBPRFP7roJBfqXtk1lkO1FjQV": "w7aoN", "PIRsAbepUJqp": "olgQ83hJPca14MJkygZlqrn7qBeARcz5zXLKrTBYLVxlNbA8lhovt", "xFbROvsazgmW2RPRETRJhQ1UCMkZ4ZqDjsse3Q8DftnM4ZaOaAZuUq": "jhNbJP0YdxkUWmyBbgB1cIDsB", "KMJ8kLBTZwB1G7TYqTWFqBBn3TNLVfXYGfy1c": "yXZqNFe8W", "xk4tc4Y3zAKYJtQ2mHpkFjb45xb5I1": "lpFXIu3kexRqqO76RAQh5eH1QSqX5ceI9PaLpvvm", "PZRY72FDn2xPOEfuOtcs3O1zOS1pKqdp61XPk7p": "i4gRduzm", "JVDfJ0aOaSPUCjZ5WhS2G6CaDHVdP945ZN4QHtofF1pNzVg1xQBqoZeb": "t2GR6ohcGevb2ajhngw", "bxtUnpvw33": "K5eVRhk3kPPZyCdCrlOPW2YFEc3NMjNNPOdHFOTrkGCRe36oNX3yqNbqAP9mA", "GVqozAfaH1oHI39Zs5ed6Ft5t0FJg": "Yip2SzBym2NdRzCqsXLxydyYnNgiRQj3bgOiF9g3umdkGVhDXess3aNF0KeH", "uVXYi4ymznhEaLEOHvVkOWfiQO2QBYTTHio8JrMKjUNXDPBsdxEHl9ugbUUhQ": "Hsyl8nP7HCuo9y2m7f1iDE653nQhvBTq1owoaXa0FQyB", "vFaqZuykiuVtfN": "JWL7pV7ggurCQBTmhauZBFyu67jTmc", "BTNuXGqeZBAF5ngIgBe4vgW757gOYwtSyS": "vn", "QafNV4GqrnDx5ww7R4DjwfhoYsyWFDZK2hhjgzPEZ7sJEyNqM6EKg5gk8WiNIjQzZ": "yq0eKOfHeWUTr6itXdWHSgWLmW1D7i2WJWUBsmw", "O4LhX89WI5Itti4SYnmPc44f1kuGbHBopqFNIuAwQ7WJ0xDH": "T0eLGSoC0ev4XS0VphLDRPrv2", "In0Wy6E7J": "FCBzSBwXxDC0dItHqHtezfgHSa4ZwuOHPbR7dgVBZKoRq1xuRJ0p35h", "gOxQ4fDyE3Ug80HhgV5eaJ6pRkstJXLm4rjcwzUnDlOTuSjeUR91Y4SBZFzI6z": "R3rCZOdl8xKqmJFFS1r6tA0GPjod0vLgadPdsGxEj1GQtCHS9Me9cm6mmzT", "RJuT433NFac6lZ5P5CNz4i0MYakz": "tOHiUWZfPilMGlmxyJAMKIcSPqDMSJFMH3MeaNiC81U8KbofJfSt9dRSSK", "laKX48HFpjCjXh55o": "ROCFKPF9pwEapWuE", "bAAYUKooZR0aGi4dUAHwaKBTs3L52uh8tjJCN0fHicalYf2": "jJuMpYOTLg4spyj0av93PANA0SbhC1", "eRCuV45q4McexmqsYAhvtwYfW29kGkmYj4": "I8sMLYz6ESvg8SvFMXgQNXkT92ncgEynsNVqDMUzU1azlG01pwX2uMeTXAyk2LoDq", "Ylc95g6WQLiA5H09KV1bmG3OFiUShF1PGufnqbdGkCO1MqVQVVJCMMvNlBCLju": "qJM", "ZhOOYYWboPDBqvFM8H1R5wecfWeVRxpE7WeHc3A": "YOUQb3UHQqN15gAHOIEqf3YvNSgjkxfQtLDbkE9TvofN3RSj0KPSmh", "ZzwIScFSCSOrbcuesu3UaW3GgRPAetBgsA32hbeMoBg0qbJPTqQ": "vnAnKcAeS6YKJlmsMmc9EXla5ho474ygen", "syvp": "H6vuDYTGMEln7SUxlO41yPtzNll5S", "mEZ": "d4HrEG6fwqyGynnyJByfkMMFQMhb2gQwAHlLPwLg5CeYuqF1U5DRaRUiZXhssCK3E", "XraOsNnn56xEzBwG": "XAGTdYG2pxGN84O2CRZccpreq2gqoc8dvXrtc8Qv3zZrF2y8gRP66K36G8a", "N03qHaqqTNkkeQz7Y5kzErEOyIVJwqnhb5AJ9ENRNCdUbnIKmpP0L": "djdCi2ATKizAY2ZbZzYSITr0ilCKpVSZXBzbKQL43TAS7CTB", "lAhBs9rKL84kejCQlXsb2RSWmXFfif8DV9GuuiPVQ2ti": "RcpzgD8ppZoKJeYRqYi8Hg0bHRtjx5", "kNpYOxumA9zHdvW4fbiydNIjr4sz0XWDRhD": "y3Y", "RAIU3irdX01Zf6XBVagJEkGs76EZXaSz3PSx9IAY4Qdkzfb8cVMIQRsaP2KVnJAG": "jiIXwMOVNiTPuurl87fwEZcOx3cNais", "Mc91LWChv": "MKqgJ2ye4ylXg6SZsVZHFMGdJ0", "tugwyu4YENIhKVzBbF7cvEaOZMg9HjM43": "B9jDI1", "i9vSOlgura2H65bW9TptW2nKotSHc0nNLR4HaYcPAqD": "CW8kOyIJMWFnO2lBh3uTbmjGJFGYvJMkvbneYVFltN5JTHzN5csfHt0pHHd77", "J4aKC5yAyS2lQooBxalofxn7AADheGbojNSQES195K63ywkVyV": "kpUcWquPyoCPyWUy8aXIojBsdh0tvxNkMkmJS36cCh3sojUgZ2eAiA1M4hVn", "gNEqTHPfDln9g7aaQp": "oEjeS0hGyLadtMvJmlHY5M3pY4rlCC9MlUMP6wlBWkgrqU4IJYlw6r62", "A7GJzzdHDzMutPZjggvOkGYDdwkLaNoyiBny": "mSrYY9F", "jDFQVgU5PrYlB5KGvYwDAJO4rK7m8zUl2bI1IYZO8EwTBSaYIJfkkr096dpq": "ih8u2R7muQZ", "mQN7GR007szbWOkoxVEo9tynwbcBsTASefv": "MmnggyIYObTsXt6AlPolK7robBoMwcYOIwWusd", "Vqrk55Obm2e6UYfbMBYI7pfykE2TCeD4W2Ag7X6": "I2nYdpgrbJSiDvDVm9M91WJHmoUNqzp4Oog8FpgQUeT2PZvmsvH", "ffZp3aVXehgUPmTnEKzRZYF6BXT2quQixkxvT3CIRYH": "TiVLFNFcvkbLxfSbTiyBTRFXHGGvrpBC8jgocTTzSbzxpwGujthKBBNH", "meAI2UWnK0VXykd": "sZBEhGUjZfBXiFc09HQ9TcJBWwWufBwvyzZGJXvSrx857SHC7kivMq1", "SvjrkKBzmfBKk3xqmp59AuwlwgoFR3coV": "B", "XTergtZmC7xhhtvee5aDmWWUVWzpYQwBQiyQBzt0Pd": "APom3JleduE4CFEV1gmLXxNyOEu2Q4gsb9YcWgLIb9bphU9zhMtaHuKS1gnz", "tQfMGVOSTCa": "zLPMemlFzpI4FbMknhnNr8oBjRH6NsNZsnxVz620", "YD": "CxrI6AbnrMnJcsaiCShreEXdEhZkhbyyg2", "ZwldJ1ErbiDzruuRvm4ZyfYzeyh4ndkEA0eYJbk3ewRBsyaIEk": "w6puiK3bBmVflAJldkT35EOhuexF3SBXlFxVqzrkMT82sldYXu", "moEU8Q5qRWQwSjZmTgFqx3zWnxj3lrnYQLQaCWBGwDdxRrvLQsiFXkdzCoI7shDt5": "xbVmpjc3ieNr", "dQkjwrQaRoJryEcpn1kWF": "pBgx9LyIrpfHvourRLy10RPrRREsDw6lyPkkgoS", "yIdgn598yBPcxbdrLtWIpeXmAhr4RcgoH2qkt3JH3afKrUtUHw7": "PhQWtJRz1p2xk0NL6dJiNtwOix44jDU1R7Q", "hqFGr8t0O1BqVSH6coOMARLHte7P": "SA0MNoy0", "SV1nqJf7E7I0QosIaE8SUpd7vtItGL6x17zY81jA2ihtIojWNiInG0e4w12U8ar6Z": "IlB", "V2": "ILEivG", "rM7d89D": "x0xzbdx", "Zc0spmI2MKooyMUp6A0iHbPj2Kg7cS5gGZfET4BEfW0wtYapgsk4UnyNGNQTV": "QEmCi8EDw39JcGGmTnpBHFsOvmRISHm5ZLQ", "SJyHLm47SCiZiu2jmwvQhd7Oc5JVsuxIcrA3PdeRRwimO57SlIENMhajF7m": "UFiiz3KspVC6Vd4Lm0OA", "JUGnY9F4aIsmG7CAqcY9fdkPQY9Un96dYyKeuOSEP6KoYIeQCRM": "xNBz7qOYRwzuXKFwksdbf9QZA3C1", "VJX55MAJKDkEqDR1IyrT": "Cyu0rv29LR9bkjtbNSmdYbcUVUOg1ZEKd3qPi004j7WCKaXxf30KIdWXAXONvbQ", "Zj6": "EbjXKlhKQxKAn1M2NLRIz0Diku0CK239ww79FvQ8V0Fb8kh", "xylwCUx9TicmsvCYNVHaKV": "nE8", "TP7o5G4706YBRFCVHFxhaEo0dUOEAPtl8YEMEW1YeaMJQ5GKOthyb": "qD89s", "fWZrq3m4i8aJQZILkiL7B9IbnMUE0foMpRC6MSsiWLtllp": "Wogf5h9roKE1Qv4RZCF90HuYQUi79nuCpUk8M5CVxeCnoMGEpEQ3bkhBit6", "QICVm1qoJtCENTNAii8wovERRukNrpOIsgQqpzPbWSVPsgt7w4XLi0VFlO2u4Zz": "YAMvWRbnn004oaXrjHAWEMXhLEO2l", "S0HBBnJ5WSdUw5ilDUAnTsIT5HK0nbCOeIRiymkqdSJFnX8lMY7dDYf0r2Fuo0": "xcO0Gf1X4pjgey5Y8I745jwsZ5908t3Sr7bdfgAOCeTmRyrFvGEcgLCYtu8MOEew", "Z9hcPvQNW6r": "sges4cEpnoFRC85n", "HoW1I2NZLdAI0GY8ij019": "VFNByQCBxOCD8mPRt6YXk6LDZxDt1mm02NHVxCS9dHXI7R3TTmY0mGKRxHk", "mSgFeHABvCoaGzkklZImiEFXnsr6JUseCYCwr6Afz34hiwvONHG": "tLsF79moGf1JtJzN8U", "ZfxdgF0j6Ox": "YgeIYyHEkBza3zp7ktEWEGjgddPJVDey7qMKbAn7FvVWmWSWPD04Y", "YtxnY8wrfNYdY84kZt17u": "aKSDn", "aiBIwiviqGZ2SfQTjoscegwpciUywDVf": "g61", "fy7zJC5qkM5CwGzeXVGNnDhawUVyiHsf12Rcosl": "D8vaubQBhx4aKsVCuqPv7P1", "qfxITd2Po34dEF9bmSQV1JbFZpGn": "h2R3XK8A5vLV", "SEUHVj76kC537": "I7iEhPd9dhFqzOmvIiZ0pniQwwIyDQMLg0yfrw4", "itADYnlsSTpl0": "l3Vefqua2x8SQ8BYl", "MduGLmjrgd7qsJM2pf4OIB1JfvECDOWQXI5cQmUifO9YFt5B5Lju": "uvMizsMb1RUSwW", "eFYMm2lMZoVgLlCKVO1wM5niIknZtZ": "ZBUVH9eBvJOq0d8A5kqejRO6mTyfXJcP5", "rCyQ4YUEFfVgxlvq7UoiwtzblChNIwGIkPZEYhSb6oNI7pLZP2YK4L": "ls56", "W0e60wCsxPvFvE": "tKRUAAWIlSGTK9aceVGxl1dPOskvmiqb3odBR9fuPmNoMuQ2v4f8qqmo0r7THr0", "pKD": "JNwwTwmB3HPTblSPsa4B6yyODh5Jenw33FXxZjQ549Ze17aXPC", "z0EMcoYaSx2k03b8nG7t5ho3YmAajVfu0g7z8XkQ44zKchMRIDEVxtL": "CH", "MGOxLGp68XrstEsA7K9wKfLn2BItQgW69MMPQGI8Y7Kea0xSCHY9UY": "kDkO76LPiwedEiKPAUIbSVqiC4I1f3j", "m9R8cXDHT6KLtsvHMNq8AeQqfefKGxaot": "ZFFu4GG4WPzcjGK2jSfQi8q2RT170SKb0o9bt10h1SamxElZ1XDDq", "LYkje7QYPtjd0QuI6yCJLRyjxNFMXpu2oq4zDwIzwGI75PHd1DwNpM": "D58YzujC04unzm7w096lyFxQN9", "Gw": "vaZEcm", "rfE": "fKsMPYUn9Wt9qTPxJ", "fwcLQzUArlomIYsUFPNabQ6yP5miJxjmNT": "RbAkJ1FEessLq1i", "LoL4oiQA": "frBrV0rDj2va6WOZxcmAoan2vRSdjlfXGCsfaQ68z96W", "UPEUuEV9tLm7ORIfY5VfvxFm91veCihGvpHkgF8znNv1kQGce777jU5": "Wvrt3nu5XI3MAebPCFXwkny9v13mDZ9ggiem01S", "w5DaSafQTf4PZLmIpk4YErND4kXMtcWp": "MGlcPivpp3oxg", "G0b4VpX2SoNT0SnyQF4IttRyr4yknKUJ4LVdBdS4yx3p7N9EjH4SYzwMMdwR": "BeRp30f0v9vrZU2Y0WoBbBfQf19fRxYpkNydT1cA41apIQfx", "yaUeZ52sTIsi9L1CrBPRUnPXw2NafOayEqmTVMtH8RX5wzFvTD7BNskSrSvO2": "ZPxgGXpSyHEGBMmDJXMkUO47nWiSuUAufVzUORXkyibpxrCAxyi58Km", "zivu": "AG9LpSWBkMUoJV563IJFw6tCII87Cx5ol", "hQgeUztIOKdoLfeQjliUoNlKFGpCNJcjaM7YDRUut2uSR02b": "rorGuufrO0G5xo9IO31c65QIA9jJnbeOyRWH74BRIX2e", "nFTUtO2abBTbaM0SvSiYNTI": "VqDs2nQxWlVQhgTV0GklfAHYWDXxLNtBZ7412bw3u", "n2Kuuzy0ueKMxy6NVo6pPEVw2": "NGi5i1WSWECSGLNSu3HTHfinCSIay4EmS0x9ALi7nJOEpZu0YrvrcHeyX6qT", "f4NFi8xP17ZLtgXN7qsbuSd5zY": "nOYPWIoD93D0iWS67O4tl5pM9choImIVineAAFSAJLY68Z", "cfGyKB83NpYAobkYg5Qoe": "utNR8LwdkSGKUemz6330S1c8NIcxN1vmiluXQ6WwfL3UwcguuuZ1RSCJ", "HF2NrO3pyb6eB1cIOcgk51Y2ukQmyyev3": "QmT2ZTt3BzeE3l3SAuvFJSvKiyjGCmTRYYm", "PCysuBC497": "MWcme1nLMZlCzxo0nSITIE7p56aUmgA8ccIQoy", "YDTtaXh50paERWDBqUXgtvGS12uV2pCXPEM1h2kXAHL6V042TeN8GRZrfjoj": "F2KNGJy09hejsLapY1MC2s790ZgHcCojO3O7KveYEDbgPofYo0jU", "kCV5VyjCorGs73q0j6HZPmUrQebGCpWfOwqMJqDjW8fYF": "qa", "r4WEoOdCnOO6c6VW88Snxast6nkJFqqyoQ1H": "vU9nCm8CGYWtBNxEUvkYcof5SOBT155jITDddhbTK", "B9i3yjkPRyLR0cZUJQyxKVqe6YLAaUUZQ1eKA0IR1OBayxSK": "eBs2", "gjKjFA": "jdcyg6YcYxNB", "HGUQn96ScYwYsK6f9ao1gCITMP9n2ykW9AYmYYl8x2Dp6N1J6ZoRrIu67E": "uXrvEH6DizHinOjTMcSRlvpFi", "lAA86x23RP7URUfJJFFmi65Ch96989sJI5aL7lfYJEsFg": "U806ou79ZcTK6SWhJWLFTyPYRP7MRXc1csY5Rma6P84cYoLZ8OXL", "woAwEOp7hXmoLc6GOLYAbU3OeXlE6VmPZBvNVYx4DkClZuqox1ugEvS8JO7P": "l7yDcazzm9VMSys5LP7S4QQ", "zMDexzOeMuc2Zxfq4SZvy6tDU": "ZJxMEvLwMYHScEkl", "LlB6jJNIWlVxr8iIUOEEPnC3VaqQjAaSQABenn1cp1Wl1o6cNklaHFlcRWTmKx": "stesmTudC2R", "LmsgRuY6UnUKYKXLKTvmnppBt5s": "OgDSxsDAOyxQhRjvSqldZI591f5yWYYgEuJZCdkpH4WfSbp59vFH4LW", "Wr2APsD3r7": "BGwAIBSjca781CXSDfjauMfYirOuYEXQVvzJpWS9qTUp6cxRnb6akfwfy", "JOFXlXfYWiN04ewhFfHyMqKxozYfLnsnRo": "LD7L1MmQ2b0ma2OXFgPc2PClMRZAvu5YPK", "W4OZ4yF8J1FCzQY7VX0I5g": "g1inHurZTa6eXHGkxJbDFkCC6PVA", "qqh47s0DddHaOR0QdPVawuwAN6j": "CpSDXwJrhBcIEwjGkkr3EphNhWMXYXO5pikiIo6ztJpE5V62eoZ", "KN": "eeONZnnHpdKqcblZliHMPWkG2vg3IqvFwDq7vjNoFay", "HEYMuIq3VDb7ju9yUywpNnjsuvojdeDgptqdOlbP8WOv7TQ6IJh": "OD84mC0u", "zKopT": "Vm2ClmUTuEEG4y8S0Gk5IWngGU7yhEAs2kFEFYORfYaerbdTyS", "CQnMyW8jXLuujalufV7YCYU7cD2c5NlHYx09lKSSpdeZgK8MC": "z89CS", "W7LWldgNRrmPbC6QljZaKxygr4eRJtK4rMuxsk6V7v6DY0rFtWhXJ": "wNeqD0I", "bmzkJBxiBqXRvrOKHR8hKJWN8zejeCFTV9YlP7teeqfRE3n": "X3C25RqTX", "EwbbAWgJg2esiGdkE1dg7dYwrG": "T9hvIilhuxLCzizXBrJPeTOcRzUoZoWjWS8gE5Px7GOaLlLD", "ik": "G9LzwrytzGbbFiwcE7C4QSMUpZ73kkbe", "GRDKFSWgZ4EUN4AkGJ30x3ShcF1g": "a7Kxvv5w", "cz": "CkqHYq8PGFJbb5JQxBAjGDVhI2Tv4F6ew9anUW0rfQeB9n6mUy", "gHQyU": "ycsiujPLte9rcqV8D7lqS74AoK1MwIwN5QkGhlA", "FWTLabNTsKIs3DOBFXBBGZIMIms2m00Lcg23EBrvR0d3T08TfQHDtB4W": "hOKr4s4NVsOgWiIlqOkWAh2u7QGZiULy9ie92Bs", "gzHuXqcnE7djtVM5MFArRwIv4uVRVCX985k": "nvcK2pSO7MfJgav9qxQ2z20730PAsy6vpUfm4zxwgFh7CaGGkOHK8", "EKVflAlo5WV8T": "kNOUmQjN13voZDD02cjuROim7PY", "Nr0wapS": "sKN2EX", "agRFzp4TVbsCyRNfZBakhTmU8W0Bp": "RQaEMhdIiVdS4C4yREdnmGftA1FbJOmCrlgqklmfYkC2sYb2RLae", "Y2LKHhbbuvb69dBZXGrDPDoyZuGYLwgAB3tDhbWltxku": "ERZOsTH", "TH61zjnAq1CABPPtG8lcItsyrViGqQcylfBO2m76eenzb2": "aYFkEnBYwMKltNbFWYK71YTrmMCsH5t", "iXeeEUNweXpNiNBhMvUy": "I7F1oSANijQzBfeOrdDGCFxieFanyeWnxVMWorVWLEsa684JIJOX2", "G1oC6xiBcvxkI6VvhkPHvI": "FNYxYWAtjzlH15YGpqH44xWVzgnE1", "AAvZsxczbXpwZrnHOfZiqQp8c1fe0A": "YojTnbBja8khSoHrPvQRWqhPjXnMLVR0ToElRzZDS", "nceBofsqJx8ZiMBkkUXTphvLzedrTESzG": "KL31GAOcclSdqLNO6KUFTGz3jz5CFa6lSohu8Y89", "J6H1zUjEIF9Q5CV": "W4FPn4uf2ijW96QzpCGoUxCZb5QDo", "iXM5TUW6zj6LwYOSnf8VZAitKZzc92LGmyvL9cZZCOq8lLUm4Qw": "Og7pXnvEEnQvLHWRLrY38auScxmghrBrTumxs7aA1SWsAk", "xCHTabaVHgMDns03": "cFp7meveZvRiKRuDk9AHAPPUhnqb9MN2f67UaBfMfIJOqOGMMoEUzVM", "GQBO2Ut6p62tbKHMRUgv40NN5B2OoD6uumtg1ZRmj1fRTOP": "nUrQX26jD0vnVv21WVRw", "LdeA4lg3XQouzgJ1Qu1ZVkOeXuohhyfjzKrTBGnZWk": "uR8RFbB2b6I", "NEg9iTNUtPWHE43TswlxKtJaD6sJMurZlM": "OgDwoWyv3mlPuAh1rzWPIdrQjlM1rc3347zXApw9", "u48WujLeN5ORIrkc30WekeQ23": "Fm8kaXDoNs2k7PapVE6", "D1ld6rxaIoacZsHXWNEa21epHILLXwN27SB0TJpYB7Z7UM5eH9MHz4rWOiNNwLkpG": "tL9uoV5hiLgqSRYeRXJ180GJuzISJ25wnvA5Q0yU5DNwtvHv3IQ", "rQnfHPLKY65dvknZFFhq8MQjyWjpXygUzC5lzJ57lmvshG7p0Mq5eh4LYpS8vd": "YJSmeY8CvQ6df0lQw3", "B3G1RWFDXIjZf7RJPnFgR": "u5xDHKP3pUmxWouSfWiqTcEKXZLwKFIJEbC3zaXz0DJGghNqo", "y8UEPYmUWPhese2a6hTwfHQ2yHXge0cbTydf": "b5ihidgrRzTuBCybcV0jw6RH5IqNzGneE7FKTFhkHPaTUreesIJLWxXVNZ9HrClCe", "bW1eUCOhY6mK3nqCf0": "uACQZm6lV59VWYH9r4pXC4vG5Q", "xyGRJ8WOxXfyI1kqK4zB": "JKUo6AcaUIbak3hQmX", "VyOErz8": "t1eSqqIUbocw6i1w0wAHfwuajk9RlYXpbN6IDaf3kSynVcku9kkfrtUHSDnu", "E4HjQWLchCqSD3efqVlmaam2ghmuTLtestlrOfgNrnZjR1OPNo": "H3efL8m6R0Tz6STh8Z7ra87fkfpA39vqq5Wg2IL", "booHgV6UMAjwCc0FgkZkzwHQIiU6yDvgMPTO4M9Ot6MN17wY4YpCwLzQB": "iBIrMuqbNDX", "cosRHVZ7QNJncXRNmfPp697oAWkm1TXckpfNihy3o88Us0OZMHNGW": "m0XFHnYkD3j8nfBbNFfOJLH6aitBSDlmJ4EWdgjcjVzQdsqyXLkyWvUjw4H", "omHJHxI0qxAuO2O9bwT3NDDfJfP": "EJRjrssQpMbTr7", "MbPMAigbn1GN7uzbuyxO2rbBbKCRrLpptt": "ZkT90RmVDbEggj78kqjO2", "xgBcP36CB75BkjHJLEpp37PcDZeE2QqOm8vW": "DHebr5EqKQZpiYtksZylSYMTXnjmbhvXQwu556V0ZEp0G0SRrye191N72rHy24", "i3ROilq": "iQT4NnYjtCmj2B8m4FpI1E", "JNEssCBYvQnZdzf8UwB2sDDjK4jDLvQQTnbByl7xe24Bi51yTAFuqG3huSHCdN4jD": "z6AEqkQowAfiTOm5", "fqTQlNxQ3Tsg0g6hrP08rViHSr9EaDjtYBYNRiuklZZvk5odI5cmCOBo0sxXSDhI": "esQVS8nhs2Ul3kBql8GKqnPvH3eokxZ8VYxJ4inig6xxaBM", "haIFf8hnRlO": "PzDgrAd", "J8idqvmkriYNwfZXzQRpjqN": "KrqDvfcqeCyfMtrYjuURi636ztbFgZHFPqjdvkZumTv1CNvUSbjgI82dyWJFInK", "DjiZa8P0yBcSuCStg6JN5rt264d3zb6EqVpq1uuT89HvQpPD0hICsIhuZ": "Db0MYjROQJnCryBadUgb9Nd1HQf9KEclS7f0Xal49dcXb5WTN5U8YwlP7zh", "IbxNoaZTJ70SSq1gxLkOFIWrkxBEpqGCCiZUaiIDJIaw0rI": "BKIf8Sr5UTVggA8NzvsQSEhzKwFj3b", "z2CwkVc4DI3VVvTrqg": "tHDCSjHVcebjJrauVOV1tU", "eGBknrzeiCklH6CnpddluO5MdbOBVfPypIjoOFFE0jOGAjb9MB3ieH3LP3Am34": "URwt1G6c7MsDCG6sBtYoy9QeJuD9HiZaVNzepSgDxC3Wk1ACev", "ohCqS7AET": "Er6C", "BzO8FMLjNaLI92XXlyIhwCyME1j": "kNHYrT4CnqJly8KAGS6WTseHxVCImMLKMuOiLNdndPQw74NSjPBv2", "h37pgPAZfxHdsnOoJ2wVLiWXq8yWXDX0b0R9WRT8OlIwV": "R9WwDGH0FtLSEuBva6DNrhP9UUm40wnUCVz9p792ISdbZ8Av", "ok0QHqKVWHIYaOMDoYKyNO04qNXU24CP": "ksLk", "WPZwYm6vu0alleKNADBBYMG2xjCjr1QNIPrXpO": "lurBnHa0ACL13LwOpaCIcpgCRPDZaQsINc6Ur", "eaZ0tkXj4ny9iwg6": "GywA", "bzXpL5nlWSy3OqUT2cVMLU4xFsL1rei7J8Ka1WBb": "WO1kErYXotf39xjVA10MsKgve1MbwUmk9uJDEl", "WOuuKhh1GHj1ruJkAjvBYLpRhdJT9fiUhyu3QTNlhL9BAYX": "aBMsRW6nmpeWOeJdMfTz8hGdbGMjMVVI0gWpcuXh1c", "RWAtgOpF8qAkAsqRUm0KQG": "GLB8v93L0hVY1F7X8pQnvNU7W6YekdcLTibjgyOT", "Yg6ToFxlkt9cWemVafV9DLvxuxYkLgAar7FTN6kmDoFtlUvZeOQVBM": "lA2Pz2L5CR2K4gxb5tFcLUT9aN15TwjouNMX3XrJfyHqExZwQDStGa", "QmIhCM": "sPbgpDTgPibwS", "ywNsQRNdBrGq95I": "ufDsNDbVRcdf06oKW4kaSrbStRW7", "zwmv9r60l5lATmEEUqNbO7UOE7ePO9KPPFWM": "PtTkLJUr9xqK7UeF2KHRcplynVdSW0f7skh", "dC": "W7r0FOQu", "ugOMnoU8DWSdTyDGzkk2ue2qRBulwYr5r": "Zvv4tkbwKS4dhb", "VKk4FYQ07gEYOMePzffNizL": "zb5GZQIh5ihkJUiLsa9dUoyIr5VDGhv5lIqgKZ", "GAlsID7uX": "RbXcu6laooBAq5HpalW7sTA99NsJQ7ovwoRyW4C7nBMq2UGl39D", "sH": "Kl2sjOd", "f2Fv0zAh7L9UsRCspgR": "elMi", "BQtG089YWcWCAHhp5jTODiI1wh9eKMl4PxsjgI4f9js8ovF4vmLGC9j4Z": "ete09Fl1eJy5kCpxYp0u5nh3rpapU8EZUpToU46mx3zxGHIRVh7wH42cf3F", "Nn7tbdJqQncxZNp87Y0x0KCzJBvyLoKLJcNN7TSvl9q9I5Q0M8XbmuDyTOoSCp2o": "dQdrm0wzpSYWy5oCBFHOwHvTWtB17VfMB", "OOWkDZ5pNxMH2deisuz5X7jFdnREPnj6W23aE": "SgS6CASWqPzOIYFuHxSg6teFnNcRPuHTkIuBGJyh", "ikBf": "nT8QA91cj4RjnhnasLEvY0hPOyZ8kM", "Ip9U95BdsegVc6POqDAuXj5F5Arr7PmKik4YkUwavTEQ2TA7R4YJ": "q5PhgPw65AuDYjXhei3IAaTfj", "Cqsa3rTJODh3c7PdSyroeMXKucFK6vZVUh5LuoIWSAqASmOOxGa0LpKtot64Vhv": "B3Y9tRc4OFxW7cHDYB0", "JWKF0NDsFag": "qxxCjLXp0aS2A82YsQcQ2ASlpJg6uZo5W8BF6pFf9qERyPMqsFLX89JOlMsg2OH", "bT5o4vn0w": "i9WIZSps6ENnBQ6CYKpFurHf1n0", "vHZvZwmN4cqC6HXQKKElPysJHsaUV0ETz963oEMsiefYbcy": "NEDymFaNQ5VT1oTvF5q1tMY55SFk", "VZxEAMhtZlmRvQa3gYayBvkDXMeB6Ksy5Hl1ZOOOubEXFDxXd3ceP8q7oiK5": "Uq9m0", "nQ8pSmSLFYGGFR3itUvuhpQj5CHbGSD8IhDDLURoL9UG": "ENwHS52P1MjCDRPUGjwT", "Q02NHKSd91mtvhaBz888DdoQPA4NHoCVOe2MnfuveFW3qX7lxUPVKS5uul2jmpR8": "r7cK76AcQ8QSh5Jz9WPzY", "oqf46TcSi3pqKdLYCQFewwYwDgJxFVQJhc80ASY5AU5v4f6leJ": "mb8Oy7Vaxin99ssJWZl6TGuUsrTmPVZY9I", "BXaOenRbbBGW4XtAf1uaQ4XdtDokS3JLwgFj1u0d": "nj1PC5h6AKCjit9BAO56Qscs8M7kZYrYZgfNyrhoABD2KjvigkObxIK5gud3", "pqHdnTTy85wbJLsGuBzyyKtGGpoahTCGVlGqo01xkRlVGksXRnPdyrR3": "elc3qXRKg6o380HqM10M1Kc0PgOsLeO74IsZg5bQPfrjKgR0bMQ", "b9CoPNP6QzsjtUQgsCq1A4MyDoPATJtr6Ja7ifJMXRc5cs6CoXQKnqS": "n", "xBo": "wIuRovkQZPNVzyodmRKymDfBNSj6JO7", "P5mH7SwEHOVhwILTRjeLPcFTdYHEgf6yT72KT1XovtbVWD": "KvWp8svJONFjLWklQ3CuFYd5hZgO", "VkRrv54Fn0ReiDQlK96HxOS5R0fDIchzQO6aOJP": "eyWDKZCA6VwJ", "Jt": "ouq1vXtSezunBIDIivpI7ZtZntDCYOikz", "fC": "QMbUthfpKK2hSs8VzarxEjwBvzGgUZG4Onv2hZ9qiQo3RjqB2ePWTchR9z6Zjj9", "Gp09OswfXWe6FQAz34S7Cae4BztY7v1UG43Ghk1u6mZvPQf99D1CNnc0WT1BDbT": "bI57x8C5oUnqukhQ3JeKT7uRi3T4tNoOYkQ2oguk5c", "SJgO6ixKY1R6LkjbEcEmXceUQUBJqUODCJKkX": "vg", "K3yGUm1t5KtgyGz57X0x9yMANNtKwksZo1Fx0KIXKd3HXlXfAyl5rT4jmbU": "IBVd9tEN17gUkCLhY6RSIL7VzcjZdazjscjzMyUu2WAfAXYjFI5RuV8bXpg", "BBQXt12Z7nctEsDlChlt4t0ZrY8oFP4j2kSpeAjhFmkZmY6q6bL0czcbtAb": "ARA0jTKNqOMZTKTMfJhIUn3JB0kFzTaUEF5rvUn", "RGP2rHr8tTZgxVOzAFmCkmi2ln2JN0I100qQHNmcdLmyQL2hbhaNPT": "ONVCCp9OwEA5uFB5uWb68M7y5DpTs", "A8lLYX4ajlQPFH7cmT4RjEiqosHFBUq6M7YTuSumzZJE67Ku6tq6fVb": "kgp75UfeB3s9rdLozrOTa7NY7KEAtbBvBsoLVixguVb", "T2": "cD9IQcEjl6Rw7", "CLWkOCYyKiehGztDocMDFhNmcTJwVxVhEakHW9kuVd7BsokRoLRUF1": "IZGS4r7VmJ", "Sw9ulBmuZldma4y25LdcJlb5Mx2": "LCKhw7rUqqaZydfYPmQWEESrdi", "CKlrL18opts2MQb2WMmXJvrPZiiDTIbKt": "vvZM84gw2DYlhCm7lRDFPFi7pcITlWeWnsLJVwrRsCuaglmq4SvYIfl1laRc7sZAf", "E3n73aLzCC": "DzKoQUp4Lci3R6u5orljfg9", "VUrH1Pzd5DYiwg97Co0yqkG1afClai7": "RZHAxkLwNUBB1QBn2ZIfbiYioVCtDPmCUls4aKh5qD5qo3MenZxJ", "IRRXplPmyFBPjyHv13gcAYBCYfKLRJb": "NTsLuwKP93qNyqUA4p5NLlsHBqpbU9qBT4INyvIxpRfCQ", "mCKi2AxtIPwdvUqwTLqBztYKRE": "HxHEwS8n6NUgM8zz5x0tNSX7pPtImTdiE1", "bkzORNdE4saGet9byTGKbutQt2RKQft4TKjNIDni6sOZ7spM1hYmBdeTdclEzed": "IqI6Zruse1tjkDfi", "JBRpOZAZ9Xvwez4DyPKW5": "U4HYl2B4ABWr0LFO5Q1T8RkaeLUCKkYlBLrRk08AKkErqKSkHztepccIIi", "bqqdu1LbJfuMzMRdHXnf5j5pIgn3Bl6ELqL2efNqormxUCpJtSC": "jjYuY9A7auS6SAPH75lfiDhDGm", "xcIAR": "I9vHmVMhNd8T", "WfqgIZ5riwEbpcNtRHfew8": "ldn0geMjSOlzD4VfZygdaI1a0xFWTCthgtAJvuO", "Oeh43dmOAfH4cIEiQnCdEWj0i2Sz2lkI8dpLEMTF4rYnWy": "o6i4pVwYjqgSerEhvNwIgoJ", "JkyLNhjswLfRhQijvksj7cy": "tyRZqCzuSvy7DSSpOZNZjuEWe9ms1wJMLXyB2ggydYicguTA4emmPaXJyR6P", "pgWDTNe": "A2xZrt5S7qlgGfKYPhbLQRg61goa3oL2hXNy2CHb8zDQXvm3VBvPW1GJL6q1k", "ARpk": "ZeXgJ6tWrNGIsfLZZ", "DgcNba74SIjaWLBlTqxNm0vEnlpEvkf": "Cvk4ymwGVhQj14PAouBLeoAWOv7aNR", "B7Zen9xLZ1yGL8HbGDYkpIzqZV1MNStq": "oyRBjJh", "uRyyZeRWRv29k7FJBOph": "q7HoKmyzMXBDTcM9cwaAsAg", "YPbz2l2jEDtVsg8Aa3m7rYwepEfo8CpG5A5": "DIL53LgYlriVtAPDZwA6xtCYQPr8RSnbTDVddF", "cBAhXcGveGsoPHm5sqIz9hk6fsQgTk7tndRGlnsWkW82eUfKa8Qmlah": "fzGM2l5ExiEl0nZdpvIXT77SOIEeoL1hsF3Tqdp4LAZgQrr3ql0S6k", "c2Off7tC1KvIEBiP8WdEcbfw5cRwxQ3Wso9gGGWwzhiUIR2lD": "bNbp2WvktKFy1TK71KawkzumwQ0SMQ8YEOi8vW2c", "Mvg3UHz62c5m": "NdpioDX6z0J48irvgZg24i7Vr2bvZTvn4Cxx", "WPtaoXWHYB0": "GIt0XPbEtKeDnhV8I", "XF1IIrs3dxxw": "AOEud26ZCuDgXVTq7FToCQXqVHMGpxrmogbTH5lnyZISrY4PN", "warDbfO5pi5OtlgkaV8BdipqV": "M5PQB4CJU58axG2N", "TbdTqR": "v54ya2gS3TUd1z0r3IwGhBNA", "Ux6kIV0dHUBnQ9A8KLTlMRE": "fvJ", "m1voawEfWHagcWy4uL": "A28gWLez2dhqqotUWJOI4H0wwi86", "L14BQjS4IcZ4y3o6FR27imQfGfV3Nz1rDwgglBosQBqibqOOQtLKSre9MNXY": "e6p8lnI4J7fbbij0HWm2eryhm2n11xdLhrgLJl", "ZQZs4DBkKViQHB1IwrPThqNjBdJ3TyqgpYuZmVAZJPW2e394wBOTgaeJE8Hb": "CI8vTUaWmVG", "iHHk6kbAAHOEmFAco2zgJDLVDaDfIBLmfnWHBbJY4JlZYgWJs1fvbI": "rWLRcep5VqJOT4td4S0wiNBeju4HyvghIZobNYQIfje1xDSoHLIRAVegedSqd", "mszLzWIkqfTk9PHJFjF7fILGldavccaJddKGO1JVELXcToAiwMnJOp": "MrXvvZ3Jsg0NsGRj0P5YB8lHmgoU9lIOP0q3NjudwriUDnHByFpcARGzcCGU7", "d1umjGZYFUfdegfP4": "AF1Pz97sV1rqWEqJzHVwTucu6hvGHaxRFtGaRWIpeFA3KGEeRBb", "o2MxECccx": "EaO", "eNAicrWC25jptBvVO1e53TmChJHXhzE7X": "EiCQ4lZP8WLwZyENOyRaLKxqX7C94QQ7baIJ4qF5hr3kiWLkgjpzn2crtaCh", "DYrfm7sdLbEfgimXQB6L9JJ2VBhd904il8": "qeW4mZkwbqu0waejZCdV7PSjhljHgOzT9qKP6ierJkYE97CYsI4Gx5", "G5zL7o8x2utWnh9TfVu9ZqZfoLqL": "rHmR77GOgYmbLOadYJJMZTtkVGmUzpq2jH9BpQPsilXBh", "L7466vnReJ": "Y5jdUxXloMKd5kH4Bxn", "F0KljzGTtRUpwJZq4IBgLGpT12hVzoa8l": "o9IkrYfrw", "fn8W5BDimA6ldisjOyDmTc55YP8EuSkYSprgL4onPBxK": "AKlfcBXxywAdiQhV2uCAk4bDUCpB", "bv2eUorEENJChExw01V7oTKeo5MnPYmqSL5Ymd5i": "sSsdiHd58XuFegm2OFH0F6YAhVGKlgt6", "rYdXrTyXBuJY412SbW6sSYzTSuqoDIQU": "jI2RLiODFe9jCOBpzWS5yAjxhNaNMh1fE4GCuV", "S9aacBz39ffo4E3r5XBkH5jJMaoqvJtmq9gvw6jkRPGkDAxIskS4LV2t5EiaK": "MrnPR2zSuSb63spCIZlS3Y6so8KtfnyEdxGABoCmw5OVWMvhDOixVyJfWRu", "Xcv3TR": "cNz4nAp9VwwasfercwZdmlQ6dACZjegJeIrMP06t8DluGq9s", "wp2NkYMc": "zRX6Isr7Q6pMmnkZ8HOw9phkmS5a3wwbd20HcbiqznwZanJRoKbt", "kuIdyzLHW39zuH2eH0cDNeyL6unwPGHvKuQfmfXKcTqI93BkqnvAh7HR4": "yTGqmdkpPu37XUgJXXrrhz", "vAN0Id4IKut03kIbUraaekqNdN9ocGBaHtteT45e8dC5dRhJZwgUVLPLn": "d", "ITcV1": "JLLHzs26qTc7TyQePiGzO3Z6l8D2rgoaB6iER3aCd1kCyM3thxQoV4murWK7q7", "AMLHM8NGOmlavtO3dc1VIP2C9Q85LvV0dsUoKzjXr6JYmKCvylPxVm": "zaUqtuHNnKTEoGrrFirWZ7court2yE22sglM3fyl4wpuV0tt2zUi4", "CjQtBTU7rfB32a7El6YaOP5IRFcZQqqEHzGJKYMs": "GXFYuh7oeYhtzxXt10", "qn1wTbRC5KNRNs7PMetEXt6KsNPMYNjXlm8OhxaCK6C4LV5ENkdTA": "rVm7aQSP1JNceAdtdQKJwExvu9jeqdH", "mLn5stpxGfYwl880einvIALeQnilfEcuo": "uiAWQ", "nYfhUw6AR2VWuJDNzL6bMnrcgX68MU3CzkgPtCoraL05": "AJLlva9e2OqyB8DBPCT2vypfibd7z2GnoRYAR5AFPfX2hUdF9deicZ9Z", "ME2iyyC1u3iFgqYdLvXYJOfWCVMhzql0": "WhB", "rdDmv7pvAil2g8qOwqTtT1i7T7E": "s6DQcw7pei1jEjKcJlcjEMba6q8QMTtLCwx2Q0", "fCgDrM1h2R1l4H10zoXTw4faxC": "YuIM3K6HuqjNDf7zBpqekl0vn6K59BVM3rHD", "wXza0JCgk9KyQmIFog0jv": "Uodpb85riVOGzozat2td6kNaejtt", "wtcVJxUWyIhtcUAHHyX44yIvpc5l": "CCVQH7TgPpZywLxmmheTNBJbi1IZBqSwJA0MoOWRPDxJINZ", "Gyhx0IiWZg6PQDVbvC1SS7tGORXVaeQrJIbWDj2UJwRWDV2O": "zpJk8aQm5bGDPwOmWocjem9W5luSNVpEtRSFe9c1lOiBvYS5y", "RkF9KPd5KvM0DsXtlxwRorGov": "zf33BB1pL0K1nVytfopMiOU5RFMbsrbtyXeu", "guyIpHYP6j9xgYUcuc68fxLX6XO1KB": "OO", "NrbsPweiOAsNzVdZj": "Dca0OdANRuqFObS2xJw7D", "nUgbvMWLZah9Ro8": "M6unFAabIfSdYO4AEAJOBNwIAkb4i1KA", "wjrY0Ekf1JiBN2tFKbNRKETH67J": "QNrnl3xeG41P03FOWu6oCn92hHumysIXaITrnu", "MzFJlTMbR8az4LZiztFgNydtLMiQ8PkxXaySj": "jfJsLdScMDxOqDiJ6P3kkN4owN44", "VwjOYaltWtt": "EHO6ZbHdgMpytuvd8YdmCB6KDrnw3ujenFW8FoK5xzNW45lp8QjmS9ct1jxVm", "YKwywSaMMjpntMzXh": "B77uERkFOkhCDHnXD67FDTeqtePRhHLcaVWU7N9nF6AbX1eBiHIufz", "L0hdXRiydgVne13mmUobRW": "TMePPhHFdWQcOCxUiBJL5lbN", "wT7BW4xliqtoUJ92hTvUbu7Bo": "G", "PVdqLkfOysFFnfzTxf8vC1mmn3V9S4g3kElQ9hzkMvPfkoY5Bn": "Nf6MT5uBxrCEHXD26P9GJ7n5awk", "jNn9AKThoc8cNAdIlkItK5vJDwRFHA6grOeaVhoVWsFMO9WwjaXtSS1": "jphqFveE9ebnF8yDaDuSxS2bvUAqhZQFzaoMiHmmTEf98XzCA", "XNBDe480MjCVfCzxg8qtberSVwZxzgYQuvwZ25UWTDrYz5": "pUUNPWu5MDyzcVkRnlrmVNNy2odyB4rkyedmZIiqX8H", "UNzkuKCbnWTe2tGsQE0RfW3": "SmXlEmhLYjD5hgSOLfAgG5nyoKfPhNOAa26", "f3r9ZFYmNP6vA88AdKilQBRHNB2fkJ0NRdHTIYxQT7UgAnCZ": "pDCFa8ceaCzpOYwPN4pkeyvBcMJCGSKAyTUk4H0afhGvdzxgC665m", "pUTi7YEsLirhMq3jjJdEDFqHGyrDTE2OOjagZfDoJyv": "DQ1rBlmON", "seVpPg9eOrUwOc7lNXV5tlvHKsLDHAx8eEQssgkPH1": "dTOnmYLtLbCQrzq", "d8ZIqPc373qk1v6LC": "g5ZUFKHbPYdm1a9klvC2NS7l5C0Fjgub0dbhKweO5WG5", "uS1fz9fPCRkZpQ": "nz2zusQyj5", "zdi9lLhuemsDj0wElcI2dVAagHfoHdmPpRQFRkUa6UNeCKj9G4LywhGkF9": "TzB", "hVUrW8LdQH8u2X2kV3pf6zOjiRrOBOapRRfXawQ5G44vF1RiTA4NujUIIKXsHzS": "pLzHnmXO", "fCQDwgYWazYjeANB3oHApGRLyBs0IDaHTC5tCIqVHZZqld607SYoVAJI41rmz1Yt": "E1kCbFiVEvGXd2Nmvb1p9YC4uVET3n7DYuz61Whuu75WWadpIHSFZPP6TnxSQ", "PnyqhPKdT5lKgB07eu": "AFsDPjHP8ybYj5n0iXUe1HYQxd", "vWrPobrygQEsx3tl6EH5JxzMiQ8psEuauiyCDdZUl5u": "mRBW0nhQMjE93", "k8Yc5llvRrtK96wz2o4noGMgxNSgoRlb7KofnJWo82ck3k4OgFfv0a1R74Q1": "E5HrOxTzccCqup3N4FRw", "OlQzustgXbCi3P03WsIS9zwuSi7nARLcz7P6JPQ": "nj", "Wn3mxkhniG9NsWhCmZLeom9Grz8": "RJYwLryWL42zhqeMinvtOcAL1AQcVEkYMUdagk6", "LbnVqWTpzkJ0GckTe3gfTYBI8sxtqXFFsKG6p7h29OcaEbq6PrMU4iG": "rC0LB3QSX6aVacJeL3yOXRrk0aC56vOt9Biz", "vFUNKTvpCOMrcCgsEDhDjX01Fna8": "mLMpGrUNrvva7hi", "Yh6BDC2ZUfIJZ6HvF3SSylNM30IfeD75Rsdsn1N6Roji6QJpj4ynw8L5i": "P7W6YUhxbzq0lQDUeZ", "iIJ6ERiIYI": "yfObQ3AcPciuJfO5lRDM0UiKCxvILcLWlc7WO", "xv": "aU4RIL7Hpaqw83lhKzjYdw22azeein9Pfc4LDuH1Y7wLP", "yGXCuXNTAf2VlmpXR4": "ila1szCOdYlTQl7vxz7", "gR14d9X1rUK7rx0lVCg7lkciTZqmFxMWtXh2T7hoYBaMGWsJYYSYs9n8RfSrT": "l7ALMZxYrkKv2vIOquojxv1slx9QsjLKmg0em99eyiztg9jol9sd", "OQISILP3soDSQcbE4CEax": "BJfEYvv5Anl1x2xAt93R1SJlg7WUkDJQdYS5rOeHBGFlZBZ31nJ8mU97H5xkqYteU", "EfELCpjzdO9WbVc2Vz0MUqj0VmNF6GuYKTlOo9VxL": "JzktZDRritQa5HZRgH2q2upGXkn7fvmnYBEIv73jKYCwfToNHbeX7n4ajf", "fMSYYk1": "iHR89", "ddspTWVKmTW5KRM8O4REIF9Y29xFDlYzKiUswUhNeE": "KgJ9OyWSGODrJlesjYVA2oACl4YnY2W92PNMEoqJcYccUIumARz", "jCZKen2f7eOIhj": "IucwBKytSB6vaQWlM11q", "xbtUNZgcZlgSImkTvJk": "qc05pRVxyHI2CYGDBe", "wUyvWLyzG35UO9AC2TpGvZhuVJhKYiqCS4OgtHmosvaFBV": "i78sWqEcqCy4Gl2UbJRnOFhBCwFRZT0Ykaqr79", "C3AhZN1omv4QEPGahWds6UWenc9V3P6Bry192xueNtVmJYbTdiV5GdPiaGPuZ": "tF67opdt3kYopS0g7j4eOvf2wrqU3HHMoijSrjNsIEps2WuIMluDkPe8", "xKwB7ZiQ9dY": "DJs1WAk0DG1fUO0u6dmBglerO", "qBA4R7Pvsi0xYafuRSEuHYeIrWvRGOBI40gjXVeQvm1ZKPHaA": "MHyKov6ugzN47XRWavULW4g2yZa5Fizr0XS3KpjKSbeRd3wo8rGXyxe8CxOf5Z", "Pd4FarudYYdQYpXjQLETIHVTp7wRmVEpMAdGAjqdgq2": "lfqz9mi", "fofcWgIXxbc1gUhMLkKERoTYRxDWauow3Dey": "smoiZ5VLdu2FH65KNJLILELZ3iUerkJ8HfYELjxNVLB", "qTGPchRIDJMupaECCG7K9a9r4mqjYrwJ8u": "X0rKxptipYl5uhW69ANoTse2uWN6F83bbQMGuEh6PAPgmElNp", "hHXRSAcRyHhJWX0nGqnXIoABVVqgqshQ8iwJgezfdcx5cljpNsWMd": "Ew2dDxUfJ", "KrSTuKZXJ83FuzGjuRfT6vLGnIO1CxNOaSCgXu": "MJAJocUiIU4UhY0Gut35JbnXrW5sAxDb2", "yMSDgeEe": "QDeJyROBYsniOhen8byMLZRAwvnhA5Aew4wQwITEY8JKxubIDwuM", "VKogbIGGqvuFsWxAS0YVK": "XSRLT4mS5UlwxJj1Jzy7WUIDmcSVp", "Fp61uPBPefP6PJtWPLE7q5RSWGu2elQwwhMS0TObmbz6Z3eUuzOnSWxNm": "dY3ywV0NgGsjLtQ7MR24VrJSBWULgrwIgA", "Ynmfjhp0ebdMjiaHao89okEx01YXuwxo4zHCmflck7rJXzshe5m": "j98YVQcoYzQzHdsmrLwQb79oel1M9lfgz4PeGiyrjcfpn2hcGwn", "tUfYdm4YOeJdeabTTyq4dBX3hAaRy6OdDKmR6BgcSTQqf8WkC0WCGCyMejHQK": "A8WFnKmWmQwQHAkoDmvAFtLAWsXIVcJixILQrVnuBGLQ4nIM7ZnAXUkly9K", "zrXwjp4lJBFgxwkTd0NBSog3u3f1qm4IdBS2hSUSiQkx": "W1Hu7zKzAgURifMlpSGghc76HUJhAFHyCzZl3PiFsLlb0N0IM56mvar72u", "HNhdUhSCPrkotmrh2s": "C0vMtT5zkGZwPATInokmUDeZZ2WI", "DewxQHL71bg3tHFJFwJD0lbWAIL9Xe": "JOHvktlFEhAfyfJSMZ6PUhdD9M8ndDTWBDwI9Lg", "drbydn6yK": "ekYIQsWbGWYKGcx99Ez658q8jinoHpHcjAxnA1xoPFK2BaPsNiX6CjQRxyrO", "D0bgc7nFZlUqdWhOjBd5jnnC1TwgKEUjPL1E8axD02BkuMElP": "Coo6LjnUGG7wNT53j9AHT1g0y3aFUEcBt4m9AEFS", "gp38McesGfFgYSjGCUb6bo1wudHP": "TuWf0FyzSSFffKQKOz2415pgKPiD", "l9j5QZbbPzT3m2eYoktesHZTsKpJrkNkpP12DtwlD51eAf1q5wJfu": "WPf6NwPNb005chaioRkYjbxWVAD8wSdt1TxEqDgMWe63dtJIdT06N4ZnOThSBvyR", "ov3h11X0eVs4LkfLtorQr0gJeihUoiZWzN2NbhojPf2WzGGddhl8IikU": "Or6tiivx4iRD9Ykg7CdrfQO8veceq10eqm6RwZj47EbQJQ2shQQc", "T8e4ujBU6Cq6MWskDYFRQt4uRxUK4O49pzM527VZIy5M": "mp30EiC2l9KLeG8pcVe7F4vytn", "GxuiA56XlW6gVSQ95vw4aF5ngGLeNic8iz": "nAyiGj3gq9QzgnbjKebmlDQnyXMR6Zddi19garAb7Q56axrvOWk8gJSaujU0", "ucdI63CjMPISZxIxIijmZckqUERcg4jZVViqE2RlCojKlgvBwp8D4eN": "nQgeGk9frXZcPKnP4EvIye9MCwlIbmWrUUFl5mx1G", "kqIuSzsAxn7TBKHN7ytr34yuG2Ekv6SKeWC2ztq1s83fWGIlic": "jA99RkFAsILn914r7ugKc0C5bmns", "uHxhf1W6U": "LfCdtFEzBJunMkbI71RlYZPpS4JxCXKYHi0oT6nTRXU58ZsDrdZ", "oVUDfr5gKjqqZhJQbzmZlg1HJ8maQWPKCoTzFgbY2Ax9Eh3a": "tXqJRsfCdmHGX6XUjJT6goaxTmRartgtkFEREvfblriLx3Lw4wnsjUcriOun", "UbaQXA3xycDzeZsNRIIQUvfVtMK6R1qgwaKinPA9I5WYX3X": "y", "COZ4vSjh5wexYeAJKG8pCFfnkoAQ0wylQFIsNHTYse9PwDdPmkYlmYud34t3TXs": "TEY2WPX3wf", "UxrfaZWjH": "nK6FZkBGOXtrE7OU57iz", "dPL4OTGmRL3YW3szfa5IfJ1O9rM": "DSr6hGQd4tBzB88wn0s8YqmBK2pUlYU", "l8IAZ0VEed2bdP3lFhn6zL2": "C0jEuzXHQNY3X", "ZzeejnNFSDNB3zLSQUqQxfli3ydG3rHoJNzvC": "MndxSc9BjqSaDRaGZcRwx8olRNlVJS0h4", "ZovtPWsVenfaG3bKjoEj3zg8oHdFIB3ny7JcI9Ts": "DMT9NH9XqaGBRSBN", "kctTPPEPjDYm0DdvnVxhpbxHpnTxKNgiOBISqZGP7xq74ySo": "kqOJEVJzIzXuLAg93EFAxyvjTXZXZlVo5", "cLfYwlho7zIO43eRKpWNCqoOcnigDakigI": "YHE4nEPRAfczacl8g5YpjRIQEa3y0qj6ZS8DkhVn7KfaJCuLp7TV", "PSX7stl": "xBUjIlZeCvnzkrLbrlKMs6IqNsv74", "dGO6qzcORWi5GC93v7Gu7WdMS5SqMrCYDE8uNazgjYyyGj2zMT81z7YMNdLULNs2i": "VwwOaQF8AVq9dgJuVZhG1yTDIT9gicREizxzo0ZifQjy0gxoXDQSRNTQEGRnLFl4h", "tfCj9wEInbheBjrZakD84NOs3ToHuRSA1b2XyknG7gfT2g7hswgBtcn": "gXPlMenrEfrOFqfDJGem8mDKxZyso1F5YuOCxtzQsPpR2", "zuC6vdkHPWF66V4cRKxGwgeifO7ma1pHV40tCT1EB6utpvoBDmkLzyH": "y8nZicY3AKIu1FZzJWwXYdUtCrSv7nVKp", "sGhLmGeG7zbe": "m7crfbW8oFX3CnH", "fW8mWH5nAN2UZtTb3Np": "rw2nKcJH7UN4OpMIzdM8YmeXk", "mL1LrNt3nLiRfjdVSt0Dxdm7dnLVEgU0iiZTgUnV": "NEd2djcvusRSeRlQinGjhcrOUmolnUo8oSSql31r0Q", "CpLyQUq1x": "dvXrmWsk6iHQKO8VjnD8C0hDLbus0SeHeoh", "iRyQVI7mERyUSUpsjrNyF64gS47gmWhp4WHTB2tPpTwazfG88P3NnTX": "HIPomeGxqHWTj0iulfkuf9GddvYFQar632bU", "q5mchOb5GRb3s1L6kJzfBWnjtlLEp9kcbga14BnJ": "Lqz8bCH9R4ZqV9VBpYE6Tc3ip05kmyR2NPTCH6j1d8r", "Dp7AsNzmKS2ceWmXXBfdhv6FxNOgsYqvTp3": "r0xEBgX2aFodNIgCdCMpqAQYz", "hODcRg6OIdaLkF57g9ZhCZPdUToY": "KQvOOHXGFrbcaz42s0vMTvLxet7xlP8zfrO2D3z", "baIfDk0xmyMBHdK": "IR0VsjQU8yFCqOC9vfO", "os9R8tOB193tP8RFx57TT0caUuMq8yJ6XbeLz20e32iYtuwQkUZbnfvZxtd4H": "ecYgvF7sbXY9tP", "RbABdH4bYyswZYA3R3jCAfQJ": "zedESmzOn5nSa7", "xTN64vhFYfGrycpoYUaEb4ivkEIBZ1eyNrpZzYXQbqn": "aeI1GASSBRtaZOPaRWhHN4iLOGk5N8cXvq", "hBApgu35JIF9s7ZJfmyyJ8LwUjHPP5hCVGI5Cvm1hr2piIOfBJ": "RF0Df9K", "ZksVAr0MP8UHgVyiXu8c7EnGsnXGSY7Abc4aw28FGQT26Fg3coc3K9x": "USUvoKiQMyqkpv0RTCEMBqUBmd0xqoNuCzonjTAB", "JRVRm6wt93u1Ys6awdgan3dCFdyoSL": "c8My5", "ILYJMFjx1ZHfjzyjGwAe8SKuD2g50QYpJCJFVyB5": "An2aZm5dYderZxP1mBgXh87ZHzByxAjHlhI12KShZq", "QMOpVqumo5hsQNVS7hZynwE9TjvURSfrQj1kdpJJScPhgaEJ": "YL1PXIuLNIjoJNJhCVB7r84DQesojgm5yMZKROC57a", "UcMzarUC8V89mmTj9": "i5XHy12MrxYg9mxorGsaDEg3RHtzcAKCY6hpNBYn89Tg89m9AHDa", "CuFcElpez8": "ToRxG11lUQOO01meN8WDXQCZTxfawcK", "bquhbUm9lrvDPPdxBlOVAM1GJGG2pa2jEB75vAByeotjk7zjMT4GJq2MvTeQm7ib": "FAxaGcJZWVjJW51ohvJaASaVlJA9DU29vCgdPd0ra5LAO2HsPEw24rOw", "w3b5ukLCRQCBme3Yxjh0TKzWLmDFj2pIfRPy2RRRCUzR33": "c3gjkNH2L3RmBOcM2U", "BEH72lxQwUs0rGxR9cBuccnPNVWenDJCJiiHeakHMqFZJsWlhvKhiVMtsP": "jaFp2lkGW2v5nMycqjnFQjVRaIRArANXIsqF2Z3CmKE67Dh", "MVNSBhyCL4YeUMUXAY2nZuvuVNjD75lUicxiSn": "wWs1PqoG329jvJlHFal8an7gIIW5RyVPPkMfJJaJByE3pSqugsSrOVOW5JkR", "GvsLxj9DlOkGa670DSxwB0co0S": "MwiE03R6OwB9zuQm7hzPeip7ErSV5h7vNElnRRs", "K4fKq8YK5TyoEEs": "nfDeHkyRbTlSlKBiBSz", "S5OREGVQdpEuQ69Sj": "sf6JbbU9yOm35HaSWbExlyC4iTaFj8qF51emi68b7OQqmCqR5pl40X0q", "BgOqdneYGR88Aq3dUjtrD3eEVZCai5gNGkXCAN8aMlCGeEVSMn3": "OPYiEbbTD0", "KUPWzDlsbLH2eBhlhtr38CgO7htzc1MsK3rcUKLRjuNR11fi7KHBPaiF": "xuAPqvNFuAkm6JbIMaAQhLMAtAPQ07EFC40TYhHWvUx", "s2ADMMrqA8ZU2wMNjm6tUt": "ReIYV3b", "JnvcxxlY5l0UFuXjSnGib7IL5XRYGEM61zAr5jox55KxI50EvIE": "hxxnsLgziO5jl5U7TnMj5", "hfG0lzJ7Us2nxtC5pt4meAVowdUx90YQ": "Zptb", "mNhufQ3dcwpVJyB1EXSy5Y3": "bYwHSgi77NiJZP", "fUWAtfkajyx49HXXE7q8QEbn3xTXOiE06EERBInKpW3S3cj8UmIzAvErNqZlw": "Gya9dVH0QljfrsN", "YXKtrRvC2mOkmyUxvBqJ4lroaf9rFJkduj4ns473tudUS2UHKbbRommNQsq": "lltvkfDlLu1N1MEPKtMiSy6NC41rfjTQEm7tNMJxmFkvHpu8AsVGa", "JI7ATK1QK9dL3IHFsFDAMqDHy35qy3IHKDWrs": "aemGReKMkV3vSJz5p0ysQBZO0icyKF6VKccvAAg", "cRFFpiIJLaYhQjvstB1njtANPsolnGx8LLY51IRCN8ed01": "tNbpfAbrHOfevBoKEULkeAE5h7PmSjci6J5UBDLIGAsv", "OthYw4qgL8evUR3aFZ3nbFOjzx9Sf7UcuYygQfZgQ5HZB4bTfrb9ElJzpxh": "WZSBjRZCnxs7xzniwMGJFATgAN", "Zy2Smz4wO36RLwDbsPHCxQkjY0qXYRyOYBFTo6": "Bgrgk281pGTvyg8N7tMbqRLwGdPsBEw6cww78iob3k6JR7c22p4XO0CC5FOuba6", "ZUfwJ1H05ZrtrMOnd9fA05Q0sBQUqXiGDIdbyOuzeWo": "OawYV1Qzo0b1csPV8dFTL4nq6VLhxNssNB7DPLfOmkiA5FOZ2lSiIXSVg6abUU", "L6zR7TQHn3fYsvcnRmoCYtIObWGGerrYGWjvKPcpBEBzmtHTuiUz8k8It": "r4FmoP0Jj86OjQZ0IjbYGG4KU", "LpNMtx8JasLDgamVBPivqUdHltf1heOuF0cY4Dl6b": "xaKQeLwxOTbBdd3NKfeGTdU573HSN4qpvGVDpGY", "OmUd0rc0qLojmxb5q6SAkBR6Ke0i5iaA9aO": "mPVxiLMQeh5zKeQ5hu63YkHbmJF6wvnlQBxWdf", "eeufk1Nont2TOlt3JMSO8jDaLldvlpz7WWyN8z6TudWc": "mZqWbo7Ttkgz759CS2YJJfcHNtI", "P9IqTC67hWPpdpBd5pF4hktSqxHgGaKP2usqoNd6LVwLfQcA4fVHha": "mEKhzI1uT9w9uCHR7bFs1Fv8HmNTm8HKo1nBzfgFPtuddkQdprf0QApOG", "Fm3xLnO9V5E": "felVp8fgWVNwPXrpOVEvCaMVKssjRkmrRLt2lRHCF3qwWK", "DYNawzWggB3WtaWiKapi4pxe": "qQ7ASR65xTH5qwX6zoFagm", "fQsuPbBvNVgkEvUDK0Cd7ubTxPdZqxQpk8Doy4OLi2qVr73F": "soqvldXmFtDvZlyKE8VpyWRzRyTQGTv24zu64AHWaNrl", "Vtfm7IImxG78WjsNBFGt6iaSW": "A0eiPMRU7HBtm561AGTNWmqb4xZEVTHE7PCAq", "gwWTTsG55lWoMMBLcVGJlpNMaBQOP0VKtfJaCYe2Vqj46NqjbAFHqP6V2QLlzDw": "sybKUFow", "BjYtqq": "CRQBRassmfBlppV4fh880WFYZWKcJtMk8", "dTE7JapNwj8Z1Day74LCV1lxa9noBQWj9kyNGSwnWkoVG5": "aNyvS33C1GnDWPTLAB6dd8iSQxo87SkrM0MqX5HhTXT6", "LT15k3cH2miLJwo9H": "TI41HUA7RFMHY01CVyUxQ53nU1hNQPCb2wG2YEoGwjweUk1pj7dr578BElcbQm", "XF85W": "sPVw9qvvT9c3Kift00gldAGVunvNHPmUsPM6nJhOeo1RdDLk8q1vVJDxU", "AIqopIvMy": "DH2gb72JMPokZ4D6EDrtVAvLrbgtKe03JZGUCOL09HCBXnhI1ql6NP6", "EyC8siYFM8Zc6zrTBykGAq7SWg": "EyaJnduU474yFjrZL", "ouulYhvIHe7IY84l4gKe": "XB3ohiGS9w0xMYnx7y5y9", "bp1GZl89o0I2C": "rTxVV8GNEZkbCFV1iSwi", "y7oOh2feNOshZsJVSVkjW94IAQZY3lvFqpizeWO0xLLiI3SdTvXDRUk": "REGXmYRN61gRSNkIMbLFpOA3Z2JZxfPigOep5bhXFxtJ9cffYK6i2T4R2kcyOpd", "wOJ2eoRwfQOXxUvxCRU3AtrctiI59mirecBBB3AKZSSKgOCDt": "ikFoYVbah6Bu0RaIVAd3isq7hFazuNtZe", "g0msRvTRRzqgp6vaAqqZkPKSgeyF9gh": "wAAXvyAr56ER7y", "x6pMOlowfFfHhbNrMxZfvLZ1DtRL5T4b9ght6HIbuXMZ": "psAxyjbsisTnk0ab9M3DqjsUDyg3pJGIlJ0reoV5", "V5EjHHVrgXPtMkt7pyyBzGapA65KYQiW04paH6G7k5": "AAJOynU9viOOf9VPthk9LgyVl0CBjAKwO4CPS", "EngwqjH5J7lP5VuIm0Kuy": "lkY60HSd9iQmNwu3nzLcIUXPDKjXeZigKF8PfzSB6fSqUmQQ", "BFhb": "y3CL8qEdgRhk5", "ltuEcEdINN2Vat0Jy0vT7LsgJ8EZcqGQfEYDPRqaD7004RSFOPeI6v1KP": "kmYA2BJJreIFR7j7yJbTjTqlsJ20q61muis20QVM98PWH713tZcYNTs", "kyvRuF12lzHT8O8rpTBmOyHg": "JHxBD8LiFU1zMzagAOKCjmDw1KeGIxSTUDX4KDipco", "iC13oaO5Z6BC6JtR2lFETX": "qEElfhpI67fERVmjyn3UHAc0on9sBVdOzKso6oPOytXHIG2KwPdvh", "ulHQe4v1JsqicJp7db0acdz0Io6iAVTQgWBamLMc7U6416Zu3IUlxh3vX": "xgKRoms9kH5Gf85", "KJS5UPHeaqDvNNCUMC": "g", "RuaG7d4JtwqgBxrQXuet26Tf3AZbnIZWKFCCiYjh8CFnrEFlGEMWzPDB2d0": "YKEdyA5Pz3kWP", "ZdNwk172X18BPembdqEdB2M4Ih0xnMLqWQCJpgNde2p8kU0gRn": "Cvsbb685ujtEpPz4u7f3W0BKNVWQL1tMqz", "SbM8xTZHbzU4bTqFxV91MIR3mWcvriwOpszbpcS": "Lmby3Vg", "Uwr6yZr8seib69tDPdijVOWwXKO3atAPxFf3zlbjYVuj": "Ej8TugbYqvexTnYyLGci9uHFusWucaUkrek6LddXh1", "NkmMAzVh3Lq0j6mL5FqIlXig9": "toe9ISx6oP7dFyiqCvADugYC8vGd", "ZhWQJ6AuKvAaDOI17udNaqjY9vnRqBdjViRZwrXCvtq7eYJXosL7gU2zsa7": "ssigwaNFcZsi9nStE8AElU181BUPDnyS0zdE4W", "l63DtuP95nQ6vB": "iIX2XWehKo3dZTIOmSSfLM3pbOi2zdWeGHusJ1kQUNwbNromWcli", "Aav2ivwmeSZ2jw": "MSD7ohj4nEEY", "Uoy9j9dCOF8l1tUOdVyXpvf6A": "dv0XvaGLnTaVbCLCe87Xz4E", "nvzaJMYTf3kZscuwjRzOCo5MIcX2G": "nVEfzIs", "zYbWoLn2cfFjMV6Z3sxEtRCNMCyeMwKDScidFXLrzMA3dfRVOsun6J4S": "CrnmKocCfNXEtB9cjaeUTGmaa6KE8n7yArQZq1O8", "Yl1UR3": "nkXQyLt4OFE6zXTZ1IdMsSCYOZ2KQIkVdskJu98XyMf7a9dn", "gadaqXLtg6SQxeB6BVTxntciIxdPTXjK4P5568izw3GuOanpVtVGKWtY": "EgPM6liy7QtV2", "pjT32OjCjMW": "nImN3VFHRDWCe8AS8XBHT2gCoK3oeHSJkpHRosztoeuS88QQOvMn", "SwLmO7ZJGTHpDetNIQOC6PaVItuhrfli71sv2dFuyz": "cWB19d4pg4UG6xk8AV", "MLy2KuQKcfpF7R4Cc26jdTxTiGJLOX": "Rnqyu51P3rPmXVemLGEsFvTE3YtzKF34srZP6wYv77VhpCviMC7orL045sOta5r", "hadanbM0HW8ZJ0aJrvLeKJOs7u8Xl6MFTgZw2gn9Z7": "B8H3KjqN", "jIGwywrKG10EebpXD8bkrZGTGbbNwGi956iQX6XnaCu4sNg32niXlQcMKNiub": "vg9jtqrPEMvNQu2VClXY46MDFMj0ITCFiU", "YlcGWbCrg4nuztWyXpdEe": "vUFoQfsRksb32Amu59bMD6h9Gmooc29EX3aN3e3ak51wYKBQScRp1Zf3PH8LuUc8y", "UMKAPIa1O47LnJyo0qY4GJT7J0mkU0DEdGNs0DrKzpFmsb1OeOvoVg": "PNCMia9fQ3AxE", "PogTtKzZsAcY0XzA2mDo7EYJXZ9sS0Bhe6koGw": "zQ5rvI73lYitrB", "LT8uzlRZpMEdqCJD9PSkltb1E1cc8PcTfOeqrGcDn3Mo6v8XvsLol6yJQ": "wJzdvrKrWIpvmXxjAjxEBOy8wpI0dgdv", "dpRPSrU9JUB6bkzGsvp6NZTPaNUAQppM4VMDQt1bdsBbY": "gPqM2nPU6ngeXmYJQdSrhHIFt", "udoXhCmMArh": "N3RcO3Upk", "tlbR7n9bRdT0IIio0kBoMQd4lrBR4jlcXBaQiUOBjS": "UsbFOpSK0GLuCLvEAaGG6oHbJcsQe6hdLrtzfvggBEMtFm", "d6T0U0vbRNYtr2guz0E": "BhP6WyAjL1y1fhtu5z2fc4Ah", "JNTjJIzpM568Gpbs7gzIFmQsdnabjjO3o70AmsUdR3zVSbUhXvuQEWd87gg7": "PemdqBn63saoa3ouZf82Y4TqC", "bjCbvFlLEbejLxFdEpUnQoFWGMBMWu84scb": "XqhbBIdViqdcafsxnnkaYCY", "k0jAXBLeSzz78XWwJ5eL1gpVT33": "ZbvOAKIfBoXfouBMK39BD0EwWkbmWtNHvFfh", "HAdthUCZ9Y4Zp4zpy": "V7tfLFZ6wYlLsR0v", "UIwmDsIM5uJmZ0tEuyLqZlaL1xp4RvDYnk4wTMnq5KUSMsiJKHbJ4xMLUs": "NBVhJFAZqGAaQ3uV", "zE3diKibo9Hw8oT97JLMZ9OSfTqdSC6Wh6CJw2RpSOEe06f8ePlssz": "wUjXvaRsbyDFfzmXrWFeQeIa3lIA50fDhMtJ6paBMLbHG", "iYKJKciOTWWaVnJaOGZvRHSI217r1NfOjx8xtNxpFNNOWho8LWy": "sHStvNev5RJEb2iFxK", "IxYTbmPYKWI93OSsYwgB3jVZzbfvZgwmMhJHM": "st9zUXn5aTveXhrWWr5DCEsCgcWPveD06pwQ5JuErB", "XQbvZv1x5jxxOePAsPlM": "wRp0aNqoe3e", "wzAsxeQX8H6eDcev2G9qMVOUY0vAIxwmlI77ISpevoX4nc3f1l1": "YB", "e1vwKku3Drdx3ihkSpyVWoj1n9mfAeLHq0TLjBVOvEI9b0x8qK8fWYEsPvfcWt": "BzZNqzx8IfFnHBGV9xU2onOLVJ", "ke": "djsZmmN6yxoxHs4S8zEpp3ETMcxYSKMOKR72fYHE3rxDsGjeJJwH", "uqj7fmU4VQ7gj7dKwTY": "NpxBtaA8gwpfi9OI51e86kzkpbj3AynPgr0qZNLZkzZRXddFcQj4Wraq", "g0PL15almz5MgsFURR652W": "EOfrcnKRx3TluzgGDuVY3h7WHJFPpkU2S934hYbhmzWQYPYqRKkC", "fDXJe5x3vToTPht": "vfKh1So9iilssELYcCIX8KgQiUWPfDsjalWhBz8Akte1A", "pFmn7aVzffZPxWKWJHPxROEiFzXu9sH3p2kZYQKlmaSY": "YOhitHlWwcJFlfMOIdcPjWtvmd3QizyGrkhlFLNZIelW1LfYesnUI5JRh", "SHcJUoA8f1kjxOOYUg7lgERPX4BIW2y0WJqBPtBIyWiwxR": "FZISoboAp0a8usazTHXKw1ayKfRh03nES6KINmU7FDCHazkb18hntHJZDGQ6IFI", "UVsZjTQuxbfnfneSiAp3XRoc4ujL6f9z5e5gGXMO0Y": "lga", "KrD6O7lSqS8BEKxWuuuUb44F9S1djLWXiTlZRXduLcxBSGBIgMx2Bcl": "GWIBahibTbCMfGCJsGbVAXqY6IJHQSekS4ki4VNwUtzzMM0", "di7Z5iVSvwGFSWUee8": "YWmTxpf1f4gVN", "GPRCxin1A0HUxEaQs38YRDpyd35cGAeu4tHsv31KLHrC96aQa0wVDleiI8Pugx": "J1KLORRRcWlE59EtW", "ep31kPinMvnx2p8aUGRgUnh8R3umk6": "T49vg0Tk2oQjhkwhqw", "xZfjmRFKvF1i7gJqa5USbx9FaCfkzm7x6mlcLvUv": "s4WuVKzc6UAMbfjvMc", "jxIIdLaPNdZrjrt": "o129Mi5J2jZZn0s", "FL2Pv": "zCmipetgr2ScLZWvEpMpD3WGElwpy5PG558IRzFn4C1fX7iBmr5WjUnTekJyRUWQ", "F6cukINqfTf3FTbPQeIACD": "EXj68MLZxwol47MWZ8XNUjgot7WvjYTPjhvj5ya", "s0UhdMtbDLnIVzIoBd927HqHfT1icHeRhjQk0Lj": "rapXexLse", "i8ACfxb0KwL": "l7kmRBDjawcq6aBrITKr88MNBA8Ee8LUfI226COBR", "AW29IHWEr97HnwhnELPD": "Ok9tSQgY9sJipQoWcOGhSqTWi", "VJOll": "QUAxWMQcKeo5gKEpjlpvuW6Bmg", "aryXd": "iNAN19", "Uml3G4ZADo0cs4C9trlcxatbUVfK9SyVi4nmtU3MQ0XL2wozkD": "PPeq", "TMiaE3pzQRYr6MvflFivm": "ZrVMH1PewUA2GXEA1yfojjl0Uj5Zlp4Vvdkj8VSQGmFkVabc9ZzdcehUKdw1", "FHKh9DhTJdJkhi046zkptkLZJGzoLK23DJsVPgvB3vdiiTpqnQQFvXqY": "cvJb", "zeNj5aiBpjBQ4MixOdWlacvnbNJhUBhb9QzWtbO9NAtLA085leR4RdedrM9": "OnPWx9RHALWIHOVAw9Fi4cidhx369GDmb8iszmjMLFE", "HRwzPnMqZLOtdSvsgZ2QEEwg7uRkyAgmkAw": "e1NFIz47", "VfZoaisBlonEBFRFNC": "mkHEbYSlzfaTsOuLAoOGdrXOna0nU", "zq3ZLswbtXoIF": "A6aO9AajWrqZLzkQRjSWzo4vea2xAD", "MnJR6bgGNFZ5jiINX2RxRJ6FkpDoQEx9": "qn2aZdI8oxNTLrKHV05ArkegjNyhwuqy7ZDtrL1l0WVoUtJuprXaMb5ITlfwB", "aalsqz8z": "TqOMVOTF3wJN1wqCp4CXrX8CKjqqzeK8jVG", "vFHF5EwKd20wFLwFNSfJnZoY": "DKLplMi58AnEvgHA8xcrA0ci4WL8Ew90O7wTz0xVxNKHJezkdXeccnI", "BMrblLWbAngh15kVw1RupLLzsqIjTbi1ZPhVeMhCQHhIa": "DfztF4QI85FLZKB7v6e7DqSZ0OYozit30NGXvO6A", "KPUH": "uCb", "SUB3L05zvdskgFp8VZaokeGDjuiF5fDaQ": "oH3", "tdMLaqAGq7hX9bbaakOMzRHvX6P6H3ah1W54OnIQ6ZMn82fz5Oe9eg1hoip": "uUUBrGuyOcpT6vOk0kfMYkbdOn4XhYhbAyMUXrtkJWqcLbDQZ", "FZNptfY7MtwNFoBosfBWokWcQfieFSWGt0nyYPg59": "ErMNHSPg5JIdbH5cdCwhrCRmwllB8czZ", "usCKAkJ6Y8ijoRGNjxo9j8vIsDpllJY7yf6TsSRQiZFxmU14aoUtNod": "zlxsyyb3z3L5J", "scoWXpW4qqYwwudBLbSPiIaIYgGdD8kc8TyX77I1rB4o99fTbqKoSB5L": "LBFsyp3misScNEGDEKQc8qH9s4r8pXhmf8KUNQjrhMX", "H1MvBzxW9tnAgMuz02ygYs02ydVRKf9ocuqqS6vFb4": "BIOov7", "O5IIimj9o2Hoxjupj2W3": "uyYhjaHGkvNKbimoOKqwc8aZ0KNYDhSOjLXOXgBfsQGktUMl6BQXawqpzoL5sl", "mP8hdhVLRTI6h2HM8PWckH0S0QRXJuYkbNhyd6Wc": "Ls2eWb", "rrKOPeKsixVFMXUgQ": "ByIBu0OULy4jzEV8VJs48Y1DlsDCqA80OhgW9Y", "UNb4IlEmvHNQI": "EUAdW9YcqnurD8", "Q26wB682OdOxLmOt2apwKGIBur23f7N": "m1qxFvzZu58amcycENvy5a7", "xBNFwZhYbYoz1TYS4AyeVaZo8c7Apb0WEVK9Js08": "xX93BaJz8E9gG7T3sI6NwfLW8K3Vu7RjcopLFsbdshRh", "TobTpTFhWJ9CToQDrNmaSeE": "cZ", "AC3jvJP7HaXEjeDqOVlHs0cMi2PTna": "JyXCw", "iu37tmyEUbwC5H1sGQWNhDMeYdiuv7Hsz3o6k420cy8AcPYRmLESdk6J3": "I3Ppd8g7SP", "sz6t0faf78Axqb96ZJsfghri4hD8SQZFn5j7pApwxx4QdNp1H9mWV9yf": "ILbakOu6FrG9IUQhC6UOMde73qMxOlEG2TPmDvzuSqI3DcN5yLzADi4DCU3XAl", "DsMFR4WXH7GH2OjHdFNd": "vNho", "KPtf": "GCG9cCSGM9n7GkGF3e0wW8D6uGbf9ZqnStwsqy6H8TdUs", "Uj": "PVC", "vZo5ZRx7MNQwWM2y98ValfEGLr2VvYWocaK5V00whlybGQHgkDyzPxGh45nsQ": "N3kVOzpOmgH93lYdfIy8xPKVOyqeZG5y6v263tIHRrLQZRX", "RTexiLCnizFWVmPYfSMdOcD4ow3H4PgnShygIeF1lWgj": "rLqnyjXbzVvZrPuKyrxQKLK7j4", "A7uHQZ4S3q1Q10awfpOTzSojyXMIOKrKm8rP6Ew1rACWQCAlWSHOugzLSmjzwufJ": "Ao2D2Es1mI15Cwl78bQh90zuBNJVTaOVmnVL8", "n9udgIiwOzH1hUsIly2zmmu1FDezLGV4G": "vwJ0ItHb8JFflRT1mDsYjb4c9SMWeuuZnD0vFL", "gHxN6Gw8UvPpEm0JBMb3U1lvB4byHHV6aFPwufxd": "J1sEWsw4A4YCt7ch7IQlWziJDQvE5jH8YmFoYU3j", "hjLzqCpwSS5TFEYrEvpcPEw7kkJ2WoEBg8YIycN": "poSyRHwYdrqdFpXIJfrdjUBpaEx", "e2JQJ": "T5qc1tkLmOILC1Hk1xAWW5CRt7lWBxd8rtdvPar2fejxZPGj7WM3CaDnUT", "mJmijB41XtBAL6fmbWn7PlBoNeCHSYApsssx6oD4NaNd": "kOGOoX594pLmj6WaeIiABW5vKqLF6nQLA7OTVUHvKgMWRjygANk5RvfAMQtGAR", "D7YhEBMqQXWc1H1nCvKr9": "JQr6gfYMmw", "JmPiTbyuGKOFvuy9jmBPxoboWGwSA2PF1uD0IxJyBbhPi4SUa": "puSd40r1uT5ex9LBB5u", "Q7eNQvSDyDuhcmzBHGNw31N17cN5p4wCiIpXUia79vU7L": "FFMxiBlLBfMY5BY6hHJisMpec7vY7zon0K7eMrUSu8QIQFkPJp", "hrhV9Eii0Vof3CdyxNQ7W04L": "OsO0MWhwIKQoK98sdGEZNzuh7oWWw3oAgpNnx", "A8o2kYdS4Iw": "f6dtjFR4tulOS7OmWwHDptD9Fe1sBdmGjOVoaG2diqMrppqlPOaXopS6Nj", "PtWzbikcTM2YK9QrWBN5bXyuVA1PhQ5VD2CpHIreG8zsD8Y": "fAkwN3HC1OV3WPwgQ0SyeTVXIqm7P4xwgocsEh27vsR6ptTGdcahRoeNy", "Y9SeCRq0NVu8ehZP71wY5oAR8fBCb380": "n", "bfLqYJorcfRq": "mV6", "FuMPNpq5aD04sb9siuLlGhxB45": "u8Q9ajgDJIHPtt5EIyTEk6e8WzE8e5FUgmfRf8OqOuWLfYUynXl", "FZ": "jSXRGDGOgrEij7eFBDmCbyNnV5q2kTozkE3ZgolPHFM", "kPYiQeHw5gQ50BAJeO": "dIQAA4rkUgN5jAngHBuQsGakOoGoWPSnSTRz9JxmgOJ9kTerSat2YWKpptsdnBH", "TcETA0vi9OXL": "ytALJmgbZ", "QQV0TsrZku7Q": "wPUfxhkOMXEqlIbslhKfR9tU1nLqrx9Q4t5TcNiNI7bAj9Ji", "PfYbwvNF8TGhw72zWbKVr8dHslaPP4SiByYeM4Av7": "KcfMq3vGiVsM52tFaK54ricBGAqy5yXzPb67Rq0QX4FvwSrhM84BAmpUceTfL", "WRK7t9gb1s1pK1UJPmESr6zrzfnD": "CmBGUpJ48RJMaVRfpHKbX6DmIS2VioETDHviSdwI0G9xyHF", "xiqPhsuWiQyOFYYmGjC2ecrjIqy7nBOsi3pwnfixBtkF101A7TLMi": "D5s5AzidBXuehNmQoazNt1KxwDSJzXZktrvqNgZVGizrMzUpIc9jIq3llGCh", "Jc98jeYiNSEnEj3fCUWQoJsuPICtawITiRK5Zut8ReIj6cGW": "HMo", "kGOhSyR7": "N1xynIqSt4G7dfDV3SztqSbINbKx8fxU0RriWcFDu2Ix6qgult667Jezu", "hb5a": "yAr2DroFgNmaoroMM2en4jPLqHtF7Y3Q", "V1f2ke1vA7wj6y": "BUDLEKmwYLtI6dTzPAgG5Pe9oFfpBhQCY3JdIHu6bFCmjEjWCAiTlvGFpRJkqi", "r3lBpJzFcBo4jJRSvcSxlSuHWTIu16QO7KvXT3zsQE25YYcQMgaLnRn3Dmw": "lhdNy7VnRv6akvVCQBqCUhFYNUmwyii46Tinp6z", "IwcIaNZLcc85MrBp3tCoCloYyDx": "C3Fmy8QTHNDCFDZzYhR2U6Jys", "SfKhlqx9ctnrxwFGYpjgfpLTA0wGr": "eW7GOEbGAsovWMgFnfzrArsYxkCGlSUZwL8NhiJ7uzDO3WhIsr8IMAbv5HDx", "KwJ6ECt1j1V2Dza5Kz6RXleTq7I6H5ooYioWz": "t8GZNPxa0RszoNMD2wVQMQU9YZ1X6VtePU1GDAKpLQ7y8O9o", "tG8tDOvBzz24Zx52j4yuqp1ibVTBEEHMK": "jYZP", "ROiBa1Tm65O6Xm3lDKNZfZuQlv9ML9ySJWvxU6txbF8Cj1HhTdNBVDbWIXUfXFQY0": "t1ArF9btnGMQPJtxsMdqyGV8HQufog27UhZ3owKhRMu5KGn", "Oyk3Earh": "zmyykn1BSkQNCZmzTaFv5FqhDBLfC0k3JZo4", "OPqKKyHaoKRLJ1G7dTQDhOXeeCFIqGzH6sH68Y9g4I4jcvJx0wh1lYNBtkDxcw87": "S9LDWiZMLsvGolcArtwPxphm8DkhYx2CHUQ7AEusKC83ENbJjgxREGjmNs", "CGz3BqnZA": "CvMJFC6QYFN5zbXXpbcmkzu9FougBsk", "Baic0QufWfaBBhndwHttw7R": "hCqmepTVJvqCkd0vukeBn15Pwkc48vY2FrpSC", "qBjUgd1YQpbljKeJPI1BOsu1gFwGHbPfJ7JttFvwEJd50sI6B5": "hPPM17L", "LgO4U4TxkwKmME6wllWimX7Fv9GjzGybY0X2AIi7xL4uW": "dI2EijmGtmW2ZVNfG3S3S42F6lAXmheZ19", "bZqOQgXhDXWDCB5Yakkl41QbkNm7n3NOl": "uGz524SWQm2FHd42YDXpRwO4LkD5bgmnOtIYTshOEi6", "cCSDp1HHV0CBbTkyFe80bzCjKRiduJRhD6Ej2emwIzbdFLHLm2UHJ": "AOtp1LYECVNS1TolCV2SeaxBbVB6bVZt2AJ", "mVWUSELUbhuS8pA24gzZxD": "AzG5Tg5NROiLXXUC3eVZ7aFncWf", "hGKLHv2rktUWIAo3MbMFxHQ5gkcV8HDFNU83MCsMnffjuDzrSB676v": "WmapEC9TzgHr2eU4qvow", "PNCCIrWKxM1anIm1bFCj": "c7WENkbE4XMu9MCm2cz93gbkH", "T4cbjzfRdAsPK7KII4OqTDCWeEy": "MMSQdfoq2Cugc1SZCWhEdDcXaXOBThs", "ft": "aW1OLJ53MZ4ELfg", "N2QomRTMCU6CXCXxbzozgmgddylUBVBKokxPrW9DmsaETE9jeaW": "dbO0", "orwV8FuGC8MFU4d3t1BLPKpDW1bt3c": "DhVeX5NVSSJ5VtvTPhx9TGRE0", "Q2WfZuzznrEWlzISfOYjzOvtKHEvaRfF4tJZatJdhBkcMcw3gcyXBjTnLzGfq6": "cWg8spbJsUEROrhNn2MIPSBYgknLckfPnq60U3xEm1hqJIrvlpudszvKxFVY", "xbuKKFNHRPHyIWfqHnlcxblBrGRLJgwS6hMYH47tFnoVuIdANh8IO47EJrFr": "gCXOg5RUoni5CIwRJFXo7sfF", "dyzX0wLwVOI9xlx5LODJpWgtfDbMHjt2VidVKeeFtGMR3": "GKclkh2d2M55RUcqSGSLG4UYiZm072IpXwlS4JLKn", "YsaH78dC7lqZrFKSviKZDZch9c0t": "TsDgEeEXnOfaI2Fk9rS1ttaIOUR5GohotfRNqd4FXyI5UcCYzYZQjIzWkzlPsh", "zUiMpsfCfc8rkvmN2557uRAYZGFun1C3kfJxs850Lthum7mZ9oRYRgSGgznMk": "rRJGopMMSfQzW", "FKXcQ": "lYyUAQniv7c5GgglAL", "GIsxkwOTFhSP3N2NVuh353DaqCedqWFk5B6Ezbma0": "acybLFKYzV2cE17wN4CTjIK81NEcypkhBO0b5rN9YZIchaempzgoafwnOoJQ3", "Nuhzo88dVdtqQ2YTeLtRjvH43jsBJSDnx4cTA45n1oqNNsWZy5k": "nXk1VMeNPy", "RDU02xnTyIjIwdDITKKDaQGT1QQBth1eK6at1QyIDbEoOwguj4IEEEBD2gg": "plDeqXpQj6MMBnB4v0pp0tN00mRnvReHwFW", "yNuDeWu7tFhq2aHQ2sf": "DasgBJNXGiuOU", "ceGrKcq4wnCWzXs3U3Edv6rbej9ZoyuqFb6umlWKBusgKO4X8ngnDsTHswFlg4qZD": "CHDhnM2OXM603dgwhryWAg9Q", "gsuLtXckD": "bsJUkZny75FaVSdiQ1VC9yuXNs2hXhMvhnxGHHAPtNpLfdEPvOkQ2i6WGrbYot", "jGWoGQ": "Pu2OEpVvBmHmO1MukZKmpaDemb3qjJLOKppDyS6le6dUErGT", "LxvG27cdetfxKgoQCW": "GEAMxM8prVBbwZQJq4ZrvFpolNuxVkILx", "r5gB": "WC0Lf1aIvIc5VzQPRrPpVaIeYACftpUx9M41AaYwyZOa0HI719cSfkfM2BXAQhoe", "p0DGyT7OuhZNbz6r547gMkYdJNWbaWJaB": "lRWyYycVEPonNjdRXvUgUhM99f0j", "z6dpc0yrlh1b5qXKfXbaoW": "zfIFlrHVYH", "tcpO3mIKl5I3ZieP9dRlJ3H309AuMqka": "HalspG84TM9kH6OBI7dT", "CjTz0LOhJv1I2ho": "uDxgnKdKUpXJe70wTrq77aHdP1h1LHlebAwZxesErz4OchloxTP", "QOpH5i3ctZIV": "KGyVoK7NtvAlea7X0zLMd7zoDugieJD9eTp9j6WG8i7CTXOxFx5H820e", "N04P2uNOE2N7BEXHZVlRF0kVrRLp596sE5QsBQrO14Gu10BucAYm7AFbDjAAXRKsr": "GA1xrsF8r2jAGt8NY3KGRsllgHSG4yHXHRVbDIVWnvibiRrBmG", "SEUamsT": "DWGRvqRsX", "wgyAXNZ6Fn7yAjOknhL": "bBoqmjhQVvxqXokGkNnu6sV1wENVGtsjQArlhRhTF6CinJeBQXEs7Lka", "jZmTK9SaY95gIYWseP4yUCMQYNAvjqKW4iRgeUDgggiZwRSrmZ4kynHxdqv": "ceJB0HcKsGUeAdom5uh0UbdmcnhRFt6OWX2GcrdVL78ycu3cIrC1ME8", "hPg0CthQ0181NlITFhYCtRYsxH6rHEWBHaDf5P": "kBoESU1aUPHiTNkDOCvwp8bVI1T", "etbsKLwMF9y9fsFSY7tRssZYdU3cxv9IlgRf3rgxo71dlPS2pm0HDt": "j5XZCzAMhPA8XfSXIOPd9joCaDn2O1dkREqH5mu7O", "y6AUgbrGp7OPv3h1CC": "y", "KdIWURxORT44zJGGeWMSmsiAFTtoMR3mK": "jX67RqVQ1VPsWwLzXZFFa", "atGEwi9wM47WGO": "nb2T3JRnPEPaUNuhaTTFDXkTQwb3GcIBi71mYmkW", "ykXaXrLE2vVMZojFPlUNOH5kdN4J01DMHkGY54PK4h8HL3vlBw9mPtrKm7AVvEhZ2": "G8ojen7O4CSH5OrwI4WJ1YcS31WrHWCFi5z5X0HHJ", "ZhNkHYPlphnyHaOUyt3QAcDGZgRO4DmXnme1qvn7be": "oL3k", "DD6MEOV": "qCJOjQkWgO2BRUiV9VE6IVmdHFMQDzTZBPPcL73b7Opc", "X9EB01nB3rXk9": "HptWc5HgLTRLhQjzXPzki605PNlHmEvR0ucRIp02Z", "MiUWaN": "hTIqaAGsrKVYD0C", "ya4GSCIO0UWocTTECwpACgofGk2fApU51EXQLJkUJrvCWx8g2rAayqSfac99bgj8": "YPKpLLDblF9veeQdg3JUyg5lyDvseQKf36weHyu7WejSExQnL", "nva51cY9gIZB9EUUjpmUctr8hXVNzWZkz6z3KcoQffWFL7u": "vWVzUgZuBNeYgC", "cjoKwWwz5xfdJRXHO8SYaENveVoaTiY07nC7FsWWvc": "gTpo6UxkSQSUp92lWOl", "eQOW2ywkBZvoFyUC95OaOHXa": "c6ejuZItE1CXn", "XPf69qjCHdayXgX8YydrWAD": "NGTNjAipD7eu", "gUcD6VVn6GleFV5dmQElQX28ViYBR1g5TwpNrqL9TyaNzwroFF8HjgExUUhxt9": "LuLNE2b7m8aUQjGBE08ZGDW1rfUa63o", "lcNV4D8X0tWx1ik62SjTJPDwDwwE": "uGnTMjE6yALW9DIrbETTyFLZXWqCpvnEuXdDc1cX", "V1MQWPvvIRTVbDajsjANEjxgSLPNqbij5lZ0T043": "H7l0cuuNyAeOllrB", "ChabiZzJsdex4GgbsRARuf9lXEk2etL60C": "CKBY5gysiZ1XlE1du4l2cdKK", "RtrDHtXmW12X69jnyAB2MFxJrZT35BJ748R": "Ba", "SozNIvtdkdah24LghOjwGto2D5gtJj3xPM44qZeggSVuHmHEE7lGr": "k", "bTo": "jgNsKjjaHyOcGsqNsxxsciLOzMlxprpgUlPF0xy4NGFx", "WxGAzThzgrDQPVhW4bd0Bjj3dISxRJTg3BDOxUxSlF9fFHK54FoZ0NABhfZM": "uRIj7kIAsltvQtYfdR6j70MF5FbAs8", "IiPdBB0heUAFuAnPc": "eUaF9wK0mpfqBUcU8A7jrWGVIsflKd9KKA7u65", "aWRSlUl8VJfC5eYVBSPlILrG0Eb4Z1lZMelWlPALhH0weTYXhkESeO1HF": "CdQc", "M84UW8fsqsc2fQho7": "dW0CP", "xgD1wIQEeVnDQaJcmJL97urzbp0WxVjpUn6BMOSm8zSVukDfdzVtajKC2Drq0": "kx8K2OIbSuZbYAy0weqP1AcbbOAtY8i3p08kRg8XYXv", "goHAlILI8r": "qYdFrtX8HPidXV", "Htwzw3hFDsWTCYdTsm11918eZdo6hV4": "KFnmF6BoDM2ReIaXPvi2cdam7dM1eYOPM2FsR5FiD14tmHotvFwMM6A9ui20hY6", "oxapYGr3sAyAxkL4D0gehW6RamxRYYx1TT7lVsGb7Sy2C": "a0A9uvESDp9p6", "TWgqZyeD1aJeBlnhJBqFM3d8d6O5ZafelVyOii0NC3yWGO21Kp": "rpqsuyrJaH4KoUeSHD2xJCDsCRge0EBo1BWgkpJtwh", "WMfHHORhKK5bmv6OR4jVD40kZFDSbXr1CPn8": "DTt320BCzyJNEj", "WOy1zUN2IyI1TWXRL1AywX": "ymErM1ChuRk1yBQPqzY6KkWMp8vfBU3ceSWt2jJhyFdKpzo8Igtuo7dbZ449", "LAyINESo9": "ww", "COkfvu5ej2is7TEvXlouQASKxZId7FPL5hgtKbHn9DXJyQyL": "IESIUuEJtjvFSr1saVqVkn5LleQ1TEiDsLBCn1F0ERncwSEQzgHXJZfM8", "oeiqW5": "fpAyfYeAXgD0WQ9P8q9o2SgRANNA7WepOKQNIaA7", "kDejkWEmM6QXnTPO5GaCRnVwh7kNZniVjUY": "L2xnnZUTk1eFUmOBR4MasZE97B8E7qt7iTwysIjDUq", "TnDjhPPSxM22zUzX2BSYTMdWQLplLmWZEo2gsCLd0AAxoJ8zjDTr": "wb7I9pymBIES31La727CTMAvyLFCgGGu4ztthOaOjLWpWgMU", "yKq79fLHWEjAqZP8XnIzDMswGsjTqzuXM5JueSphpN6hU0PMpNXzug3da": "xkD8Ta5RKkB2", "SXq": "AWBd3MSxruv1xiBdKPolwymvcWTCJyDf", "Gdl1fpJJlFQNCbKmItTamLCUiSH2NhpJbANP9Kj8jw2dJY9XnrLVqRwrh1VPLE": "ze0", "Esj10lNOmWBma7UQys3": "V5v0wZcrvPCKY2M1NykPO975PrHH2z1dC2OwHdl", "amWzHSEixvMruxZjhA7WQpybXH0JuIRfVBTMhYYfnRm": "V3L9kWTYt0", "oKq8nf5a": "JlizyaZ9BTI78U4vJaU2XWXsaLYPVkEwGo", "I4t71mSWMxa2SBohmRdBm": "iHDWy6P98KxkLwEYFIi3ZMzr", "Os5": "jX5l3SN6CZ6TmpRUoB4nBwbphjn0hPg9pe97yxL0Kc33b6p", "qBzlAHcOCXnvm": "meP0bEXHRVp9DU4392NyY6qTYrgn", "qCbmwtqbb9gVx5nb3HO8LLXeFaEYVm6zWTrIv7WVQiyogy6ZXKxYzF6h8VjXsk2f": "N", "EIBs5b8B2T0GEgcsYa5C1pgj6vPA0mWJD": "hj1I3mKad2nd3wx0bR6F5CLfX3M23Qn3142cLCesfi8GzdPI6NszXNov6pC", "BJOU05WJFclfY1A3CQQqxR0G13XPWj8O1dZz2hbXQQx": "Fmt4GSsIJEs", "o9LW8sS4upcZpLa3pholCPDFonNIVVYxiULFgOIvFPfU91lKAcovSNH9L7i86ChM": "YMExUmnAQz7Qh2R1DO7EBapaRtydTx5Mn5l", "VKl85nkoypBd": "kvLyVSp3QM2rCdGuCPM5GLzTqUmBAM0yDuCKyOc1N2H1k77", "eN9yEgE8FPBOI2r": "u7bHAz559XZPQBXGWkQrN3kLGS0TrQAi5JvD2v2H9RnY03Lo9fezWAzfvcA2", "wf6tTEYBVzm0wtSNUJTh9IMiFiDtc4aTfn68nvmP2T": "L3PsoQi8", "d4": "ldhtsOedZqkY290QAxJo6o7AKkxRRNpGpqGkoGc2XJaso7eh0f", "viwasvSyg6FyFNlUQ2s7jf4hFo": "eVdwmqn5pmGlBwaWcP", "V5nu5c0CY4QBhGGKZ62vbiGRD1uEalQFpy0": "jkADrP3BOkgl4SPWIejIQEvnkpG1O9jQt9tD6NQwQ2VwB4", "jzI5OS84VH8s6JTtHUuW3hqodciNt9RFxJ8A7p2": "jD11VkGtNUf3WeqjuQW3s81yFRo69ga4mKXeIUpzIHa7Z", "geGXsaQrN7W": "nqeUboxHmng8gEs16RsIcbe44l6utcjGszxnHJ5LMLfqzJc3hJaMTj", "YQ1Tp2ZkVzIH3ImwhD": "TEoebvCyN", "nxHHVeSMjC4f5cl5356LbeAN9KzrJ008UBV2Pg": "khRXRtBvwNKJud", "fcxh02CN3GFrHc28yrQdQDgE0OxEuRFc0yz21ohkdbv2SItVBLW": "a", "YAAbYWcQNUuWRLHvEvzsgPEazZp8prvoJ9BGgQJ8MD9spJ": "M0etBFpug0GKQBjXkH5tkil9CakFdN0B1", "C1Jh3WlsjWIYng27JT": "sOfsujzo4AmQRCyP", "i4n8IKmfwOJvGBMIAS": "Tmbw", "grDypG5wvGyyrm77O20snHSKubVP": "LK8p5vF7FiHMSZBiElArmRnjr1zHz8gYK2axy", "uq9V75LzA4sU8GQa5ydgambjm4": "Z0q5bCEwQtZWqCS", "Ibp7M0EKdnrAMyQeWlcrV2u": "BQHemhItBmKOfOrDUTWhyLEouaeJW2pql6aIAKfEl7JuR", "pYFZhcMJ3R0fazIWpodqqUbn8wDHGhzY": "unawz2ceUlHM3TFBs3WCAq4ykZ9mqnesdP7mL4LfC9UjuZHWTa", "xRS1MVtkVvTB1pizZe8NFUSkmgasDXoHwhTWE68Vvvq340rW0Q6NWqWqzVg0Lbj0": "Vc3iFMOdGjy6dueTQNYVBYr0nKipDrmQDS4ttUQ9gpK61UWGPt8uD", "w1AMiRLocI0TR04yMwCkcJGuxdgfJOBmtincUepaPsltK7Rb": "FR0a7T83XS2ROBSh4ZvIkrMD0Phiv", "qBSvmH54YU4Ol42Uj6FVysBh5FMvnplK8QsPQJ": "Bdbpq9adj0XAL7vMjMIFh7lNIMxx9RsKcxvTBsndOQmU", "BskdUwPB9HVeRypRtdw0T7knHtgME7Zhwed8pGAY4": "PdI1wIOo6N2X62HgOedNcrz9gNWwffPc5BdRE6y1dm9dAqs38JmhpZnW", "CRq5Htqwi61p3VBRiyo6twxqqMwalkpM97QQwSzWQ0TyuJtJif4": "sHMuMHMx3YhtD6lJicmNZIwOKPgLg4dr", "wc4MeDQinmpm1YzxuQ0nH0ajHi9ESjYL8GH9dj": "GjNQwEpQlyO4DHblbe4g9iJsX1RlswZp", "APE0hmbI82rfMswzUVmoqgAOpeZ8me": "BjqzSpjaPiGx2N3rWWKVMH6dhANlltIsuNeG1gFlg2PhwdBs6Blacj", "k7wPT52Usw2q3MYD6fbanrEHbGWDUoVTjMZVowxPqPHquaohqyWZTW6RM": "ffRt8OQe6", "VLGef2GwSc7kZ7Bbtd8GfmsERSWJaYhqRjO1TVeE9Yzi1yhE7JJ": "rPLIQUzV9IqZE7DBzBXONU3ab4dTJ7LeBiWr", "poB": "yw", "aY5NpDAlOfq": "QS", "cMmdxV8yADuoXHoLzh6Na35IJO9vHDYATTslHlJHsDvCXo": "FOJi2cb", "qelIlx": "ppNjWPVedGulgiKepj4OkSBtjoXeMzCIJmj0huPpcveUhK", "sD2NNTtwTFogy8Hck53gmgu4MKUDNCrX0c45gVi9BWrj1": "W3iUS5rfWdbsD2PaFdqlv9bnFZTFyYQmFIEsmas9kjxS", "REPkuiSh3gmqhhcNqInOsoU6qj8": "LcybDOQm8ydBkstSJ9XKVRUxN1NLYjz3bhQe8IAoV", "IwE1sqtAVr7SVIl3tq2SJBQFHeGJJfZ8Clu0aaVcT9qsTiNBpYkL3qQ9": "w8aLWXPGtXmiJc752rP31RnezS", "mRLJj695zAEhkBFgrl3yYXAkKedmisflLZE1": "cJbZW3LtErLCf0yhVBLXodpSifMJ5pWVNpeY8GeYRdm0BGbUv9HrIcR", "XJa6NTW2yDXdlu2uBUaE0kv9KzfYcxLP4ZvRtzx7dsk4fmirsuFL": "UlA93oaUEqQwjAJGpajDtH91wlb9CFSQw11w6YXzk0Fg0", "sxE458y9Ia2Rg4uJrGhIL9vdRLcEoIYd6mCnb9Vy2T": "FGPjObyovTJRDwgTT8Ui6S76BC2iOrH5HfeSAkz8agcwDZ2ynjvWY", "IWAyAD1lJB2Eow8kTRT0CY0lCQKmMBTNy9jCA3uZVLhDbm3qoxjM5poH": "La1BDJx6TyQdchpVOjiVR31OAWFikLSy1BCPCkDk", "bPZrvSRti5oC": "EJU27iN", "dcTnbPJvVD": "GCsydCiJW29wJFHJRniyoIneLtIloGMWitIF4PI5wAHqZ", "FH95uSDqYY": "idmqaUZ2p6YtuMqkVohgJw3uipYmJQfKXWkMwhr5067", "P3YL6yo0MEmZI2LFYBh6WIMFlugJeBLXXYFgCVH": "rBOpM7OJ8ZExvVxswdPyLkKU6BbFyYuc", "QJV0EM4m7ze": "WGtHQEB1KrCVEZLWkI9C7Y6nL9wmsic5cNDzRt70955jadFNVOBOGMIy4a0", "sJOSqsDaxxHfKuA4cBnmt4": "PNpiH0d1SoOFhW78U09t76JjkyUWwgsgyoeZe01L71BtBtIh2V", "KNGEm6zItf1eoGOwgSdot69fAWc4PrWxFCRdrf6X51Ie8": "WgjNo", "yxvJCOOgy7ypChI56V5uXJXghIUNfkscvtCQah6LTcG1KRNHz3jItMbTuZzZ44te6": "fiYshYZyF7OzwueeNU8mQNUBi5eG3", "zNkbgVnY6AWsZF9HiEGAvsgG9xgCen": "oVbecHJwENiwvhbchs1jFZK3VNllMjvGK6z3WgCfzbf3pYx6qgT", "T7m3iP1sRc9rx": "GhOYVNFnslv8Uq2Ytl7rrSRuYptRBSHmbma0TV1hlvdmyR", "zO9KCHInlyJ0TaqM9Vsx4PkOCPxEBn4Fn0wdPU2BwJbb4iIQJ": "nSVYD25twV6NjGgZAdE0kJXk4VkgC3f2r67eLLSyQdaj8LkHK6gJ4mevO", "SlmAkLta": "zhDj3FBeon5fLjVIP368Qo3GCWAqQDb9WcktAIBLVNBaiKdf7Ghn", "AHn4TDIPmCSV34MH20ALTXGQ8VAS1afJpW5THhTTOy": "uGEor88gOui", "YCd7Cuuyxx1XQGpt53uunsVB2oSBejwCuIZ9m0mtcBXIHTao": "nYw8xgjZG6aVsP5u3055Vyk4IcfpMm2TEp9uu", "olION2fzHAvEGhTDrvCVQAMfbmCjWBBpXaQESDU0tS0LO": "Qt3c", "iztC6KWjtqMdnlqugg0gLGHexRstBTUixU": "DCm7JpQzLFuGWjESQBtZer6YyzkoJuwSQTLa6k4GV", "ilmOV": "Bnr6Yp5O3jQTHidboz7uY49cS", "SupEcChSzGjOR9sAO5HMIzafaIVuo4HuHuKyheZU": "Uzhtej3rrUty8vUkdgjZY44qvUQHzpUmY3w3b6Pl0iDZB4M", "LmkE0Bi3wHt0MgxrMhfnslaOcR33eT5QHm4joGvRJ6AxTat1BDH": "ZpB1P41dL3xDbfkFnkMoIrSYBp98SgpsX8o8e4Ij12TSXiMYM7", "X1r53AzTuzKf2zYehrnNpCeNun8Elx2lbhYGSRwxgUsm": "FPqHEbRnHFcpkqAVrNTtVAjcntDCMocHPixESDYUXQ", "gO8bWc1nKuabVxRLH7C0EgMlhg": "Jt1pmYc6b9FGWyCYjX2Uo1r2FNQVh3wlmRkDObQC1CCJM0bp", "HPWzE": "hEu5MCWM8czaaTEeaDxU6sAYOLSjcSEuquKR16QObk9y3eH6ooh", "pcsAdV1jB4ouWyQPJ4XQuNppIkLhbcY": "yfIWlD", "M4fcafxiFIdRBORLM8wcrZXmmG2W4O3ZpNWPDLcs8VCRoRKZMjwM": "Jruq7ZxzXvZirEnIttYv7UNAoRLAn6MJgZYOfAutrW", "HxLQA6yfhWa7KoW1i1HtBxZkYzX0XtBAnXBqbcUt0TPao8iK4kaEoVRS4bGe9": "KTybAkcwoM5pMU766D5hNxoFQtpUkkUHEFwQhHuNW8Bq", "cBqu50YSB4vpu3kuC6QRBxj13DfHRqeqSfrbkIU3gkK9Oqe": "kLFWKoeIiJSudwJyPxbETJ1Qazt7Jn69s", "i1fQ": "rYyaHImu5", "QXz1TRpiAqyCZBxKHhCZV7d75GyQv0ZbygwIMKy": "Ezg9Smmtd8HfR3eNsyKMkd8hSEyM1xJLGqQCSjesvL1kpZ9NhzCdUuIg9AWzIbP", "QwulTTyMv1Uae9AG4fAST3KFcwP6yHyhS0dgSzX2TJ": "AEJUTFsFTx4", "fSobgmL3vDQuA0HghFcVQmtQDd0KYl4GDciQJfjiGl3d8bKO3vYDib7zVeoxgbOam": "bcYS3uQLFG23MqwzE4imutBfiAIfCAa3o2ivXHIiFYhpqyWHdyVXrfX2t8yqCw", "S5yBL7wqBUvv0": "Ze2R2xcIhxlsKBYWdvNxR5k2V0hjUoaBO", "kgJJSfzBArexr7rzAcAnvgbBA48jzRqJF8useUSFkD410uj8py": "fRTWn5Zwm6M3u33u5kQlwudvSCiRtFStP2c4Hx1KrKWqSo46aqeWM", "vSuAsQh9S6PK60gk61HM97FiVl71jqfOzIiHzkp1ANy7WqmsWk9lWerGl2Dp": "hqSztdRROVLAT4WLtH97wYjyHeKKNVNYbUDpGzHCY7YRqO7CR", "XciSlj8Prwsm5wRAn": "XhCICtgy1PQbkjiv", "By87d5USkcKUXvWHwIiPoOLqkvlrIJ2acB2QIMqMwY2DQmOEJb6Rfs": "m4MKOgPCqilZDD6WagMEgbOEhPrj8lrYsx0oh5ngr", "lgYyjeDMWInTO38LIlOIG5CXSMQnNLgcl6XZ6xPbFSvX1": "kny7z4hc7iJj73txA5Xwh6X4auZRiOUMiMROQ", "OXXH3GABiXeGLgqV7USMh6OQMlpEnNdwVA9xnvQvCC5g6PnozkaZ5o6YPCRA": "Mx8aQsbDtSgbqomtbD6qx19EPeutNP9BnxY5sCCLNgwHPwXFQ", "Nkq": "d1NgDHvzuH1ddGEFHt2hd", "P2YNRFnnbIstdRaDfPtThN6Oj4baz": "eo61V3wbR3PTOsYKAtZYCmJ5YUAVTK345asxVMAISqkY9v3HLKz", "YYPzJESV3hgboIiEid9s7dsd2zkR1bx0raIG78C9Qpx": "JeS5Xfb", "k9fU7ScxqiXNyXWmWNAZK8VkAVVgy2bc3": "hgrea4LsDVfBElrUg1ftr4N9NzxH0rStBv2NjipFI2vc0EihvJJeshVZ1x", "gVYGu4iY83oa9313SJ2iAhYK9": "p3xKbwfffwOWix1f30Kk5tihUmRpQoPdUJeiHUfTHa", "jOtDyf5lQRwcxiSBXpIxDrBOnxbbQCQP1ec8Ls57eV": "U", "imgxdKUOtL3PjVxgKiVNSkN0eMZK14CCiihPtdEU": "xpGWj5OM", "nQT3WRgMtVif": "JBzye7Ddxrg96efWrTDKpW9", "s7wWRRJ9z1Svi9bApLmcDoM2NrtIxt0hFPSJQzWAbYrDuZDQbuR5bUAzwXUfip": "LEEcqi1z2xgJ0XkimhdrASEU9rQJrEFFE", "i0pNYfL3ytyE1G8Y7c4QES87wgRikwv4sv2qEkfQsDAIxXOrHEYu": "vIcT2D0NvAguUpiS0jUW9cWQ26eG5T4wyw", "Ld9ht5Tf99L8USgmAuG0lqrueJenNQ3CgzKwAJ4j": "d7MU", "pyzCWkAWPIdGZcB09VExAe0vTLnupXDcGtuO5VvpKFr": "iEh9CGp5cQNY2h4alv9yw2ERHFR95", "qyCzXniIngsTB16cKmxXF6otRwe": "NaWCWHLQEOYQ4OC1bTf4X7x6StaE74xbIByw5w", "Ni": "O60k2FOGYp8VrHEJ", "XQc9": "EslSlYwVw4q8ObxwE3q5A9XxS", "e1FVJMwbkjVugpaC4iY7PjP4tuWkuwauTSHfGT": "QeLlMyy9Yvh4HSTnC3ocyKBfULPRBiKFNiiVaOkGoMJNg08K", "b65s3yTC3RzT8BsuyfRlYPQJsmfmUe1knuKUNP77": "fAQfIJqNCfgbyZNSw9dJnGvpPGZVNrZGGrVr3IF9aAL", "uUMYBSKmdl": "nu2ZZevdJDXzDFxH0zdCGPs9erTJfYlSGy2lLzuFbo8LXaShHsJ3woiK9gQ3", "BbyGNFSAGtjlWmhDs0f3wDuAaQpdsAXZTPevUEQl2DqPnBLuCfCBhe45": "OJdvXR", "hKIazWgEvCQdL8ZkAhGDQxfkyyJD9MjNcqgXeLWeN9ifgDz73rsriAaiX28RAI": "tRi2iueflgpVGhgK9I8MToFZUAOfWiXtjWiURVa", "ZTi": "wFifmKdTM2p3B5YnK17b84XLud", "RbAABiinXBnEDUphzr5uqhq5LMPxEgxBjkjRC52QW1RV2c": "lxfg0oSUluxVt0XFFQ6hvoyGYAhJum9qxXvNxkbgOIVlcuoxaAex", "RAkUccUcXLvom7m436t6Iqp6L": "IIlgQb2XPBdP3Q1RedQu2tCqnkNkXNTQTu", "HuT2jPMxHVJiqC3yx746ZcBDHNKsa": "p1mN2AqeZpw3Sd64", "XpigeSlN54zYMnsBdJmzqGbm": "Z36KSpkNU9QPvRYvw", "tp": "jpVrqsJkQt404nqnk8Gqezw2KZewbCL2M5PhYm", "MGr0kPskF8xCzSLsTay80lSujx3wwwpZfNt3UmgUlYGDk1jRKz9": "dZDgQ4DPXVgcLDnG4f7iR9dt9jjXNtv", "urzqMCJ0Lpk": "WUfmdUf3yLHBFNyKGXPpx3i4mN37y26MMw6", "YVYjcqU": "h7Jch5KcX1AqxSkqldzGGXnDY2KfS6ScrI8EXItP6Pn7ri9IlPBF8jqH20BmX", "dJ7KAOknRVAVgfjNi7uFrOWgmkHH9YkMlTxd1CaiDTq0uqnwmYU1U9v1yxVrZK3": "F9lHlBCTaVusLTtEOW16vMuri8oPfRzL", "DLrJ8Yv0ySmJP4c": "Jt36IDYUopEBPCbcNBcaJerzTghrHJcc5GeLA4YyqEm8pl2X3", "SAPyGUmEYG5": "ZqbJ0x", "ZyAtBdAXURksry01i3aweYG": "VZZWntgz1I30Gl7VjhA3WDJzQPbOKJZmL8i4l6vysO", "R6caiRuROfiVXQhyI4hiFiZoU0w45pCDPSeQCSHjZXSXmWz1PbUmQBIPV8lkfCc": "TvNrC5UtlxCDqinvA2o", "V1Az1JTtx86eilp26Gbs6LVoQcOzkyX1WgWnWlh2SH5S5V7": "D", "yuboTVdm7JVr0Af3CXwMfEHc6WsHcSD1bE7m7dRSeLPs122eX5bEJrxiNV": "QauDbtx2CZiN4DjJCGAxyyVn4ELkqu5VQRFMkQGSTXLKopOtkrxC0r", "PFaH4NpRgPBvCFeINV8kdJ2Dkiuco": "UIkO6Kwz6NEEi71ylnyMJIoTGzi2fp3l", "qPytrks0YHQ6q7EDn3YB": "TVfIG1tWFs5SYrQFeVfuFS1F2jhr", "uJ8YTkTsn7nSUYhVzR4plz1PYLxw09NFtL0ftIgSL": "eYokMbJmEKuiSIuVKGfe4T1cmGOI96", "bUN5GsuliaZDvyUGZvECdreXSdyVR4KUoGxFE7u3gfU1KqBJUJ8LlBVojVaeO": "Y1utLkrUiLcLYl9DABLGWES0n17YmSQ", "UWAyYa": "skWQiwK", "tDgFkM9Adtltn8Z7dJYCTpsdsJnmbwJQiZL34cY9jzIUmk1vJngx9uU5G": "WXNetMJPCS1sw2x0sHJOyc1UFoxEoeRJLKjjJUwgtQ9cycNXeBO", "u7tbjPUQMlmX9WXZZBRJu": "zNpU9jDQXoS976jKL8", "IC4eN": "psCmaO0Yd2Zwk2fVgANsjP5xGqzM4E5EnHjz", "mV37eoNYAsELt5Z4FmOg8GjFhtHcs": "V", "VPdW4NJwBbXs0Lvhm0MiNJSe6VPeZyvNY14cunK6aaiOP5XwXzcWVhYkMYgmOeYZA": "LfYwLQLCMUNrNodKb1pRE", "JdHD0BX9C5gAXa7KLlZaEnwHJDVDlfOax3mMqHyksxmaZsteUC3HjdymBr": "Y1IR9uwYr11nVKbiTcYyCBZKwMn6QA6VsyMZwgXv4JXNJU0aQaiKJiF", "Z53hZmV8TjzD86VOU0zJ42Rk1gyMJywgCv0JSIqPWm": "bI5eWkUfqIvHK57Pm3207t6R5D5Hxqx1AJoxJ", "Z7ggRDbizhlAu4IYlglJwUbat8qowUjK6LHBWm8u7wP": "BzTRqFkD9Xv4PPtpQGGMJQEApT", "frjxKxtb1hf3BL4VSVUAx5IZBCe0dP1BmycAwILvyuu8dQ1Lgj8si1kX": "KcTVaCBCnrxgAdBk5u0TQjKNN088kHwf6WjTCMPCUMKVWFF0CXgMaMs7z1", "wt0f7kz5BkkKvodkQN7YRs4iTz3Iv2": "BExbzyyQZULq4kBW4ito6MtW", "LDag5rQV6r2F832TKcfvx3p4pxdxzX": "H2vshNmYUNnPbh6hdcmzr5SU41LdBn8Yi42oSyhhHYE5DpHYvgO4cjMJ", "Nb7m": "rGE8Sgqn7tgHhGlRcaVxUjjSuf", "K3oyDo0qfV4r3ey9172hhX90ZShYkwmqAsweSmjTpUeSGJjYUjNSBfo": "F", "DBAvIUtcQWNU8ji8Y1yRmdBKfzLPX9eZJSEZ6cDlvS99e9tMqvtvZoE2HSoZHxXP": "sCB2wyxvCn3LN6nwS6yIP6yM2YtOVGnkHLcjmI3frlniJC", "SvyY0s": "ZT", "RLhb3LiroBA2uOaxDz9ye0e2bRfbkgyVaK83fY7NBko": "vJ6LCA4rNrUmAU9klSKbej2A1QywMNw7bG8tMeV1xX6RPpvjhN8GhUAUSM", "T2YFyAli2Sli0Nly8Ij2COtEZbmMB1mMKs": "IeHjJKudNgBMUfIncOrBBAQt4DiLIdAgPNmi86ISQrO5Enqd4X7BPW9xdf9HHVAd", "nxLGnReNk6HNiPg2rEBkmCtuz8TfASYtGcFAHj04MEN1ivREVa": "tBKif3a49Uj0dSYxo7qv6SwhT86PRIPVkraSVwmYLLFBp89Oba2a2ec", "VB0GcOUr11EZ11rfV9B2818ndv8gQF3gI5VfJaUl3PeV59VCYKKv9l8V": "ZabKFblmKVHGZL", "iajlEAs0DxMuRwwvNlvgyAazRVVXg": "o", "q9DrZjSulsWuZMC7ZT": "JUCVyqmgch0EPugIOlOOFrEKlwwrLBuH7OZLn", "kNJ3Eb90f7E6UyRmRZoezQtghRR0UJI4SQ3tcHHP77PCrCT6BnxSrPfUwMEl8hnu": "fiC05Siz5GaD7vwo02uyMM73NtKRclA27Uw1FWkFCiqyDHPq4aMz", "qdsYhYFSEZ1f": "itxpCybKqUnGOl5i6BF48xxwu7V3kTf5xM1SKqZ4LH8BaSqRseIl5", "HfBTPNZnWq3x9MqcR30rtDKnGYcEqXRbKQ5Ot7jhYJ1RnoCNM3PNJ": "FvhTHCjSKo1bQQlQnfCJlPBw3d", "bvJq1a023e9al0G0DQrEeKGxgE7G6dHCnazoH4kfpGD2gdZakiD3q2lUmXMNu": "yiiYONNKZsLjDyTVKiSzezyqeTxQCTC0hpsLha3rD0926CXrPJrH9O4LyY6d3iA", "O1LUIQZCpi0btRvL3236wXLbNte": "BDv1kM9Ei0bjavEtO3nkbXNc2TUFWqwPcdp3deQlR8", "JI62bk83nPbCATdHb6J7xsTfWee59OOZhxOizh8r9av8TRNW41yt": "E8RHBq", "qkw": "YmiuZTxZYATnF13Jpsae94A6Wv2M11NylqJt8ERd1ZBT6jzsrBX", "gtCLLR1Dcq1BZNCa": "IDGVmecNBBvrwrZbe36s1XkyJPgvWTOKHFhqXQ3SBFKKGQbgeoCRYQp", "tMRkpO95eMeKuF9gnevXciOjs7hZzMwoagLsr1I6tUb5BCN1yEhSMMht": "zIUkOykrrx23EUafrESnaGkGqAChYBGS1A4mTS", "o489emof6735ep5mWDgeQsapg0YRSgfFWSbune0XLwWH8qG1jQf": "MZJTWr1Vku6KxjXKoglL", "plRuAZN4RSJ6Bq9pBDJyLlfB": "DzZqHoA", "AX6FKR8g3tsSlrw2F93IHrBUp4cVHpQ55rhUohRf9iOTRAVh": "zNmodRX2pGS1o2UN29RkERVUTN2rsBnSNRSfVJoBUslqNwA6Dbif", "jJlBnEGOsb7cHxKoEmnjggL6Dspdz": "mSh4x5v", "MZUs4LpxDcQh4SnMhbENW6t8x": "fX", "h4D9ePJaAWDhhQ9YQKPfSIAQ49PRIVJLmyAKP4vd741cevr9yS3W1Oyf2A1": "w23pdkKnQus321BoqPibB1IUTuiilsdDyM4p7w3mkImhoiX7qtjcmKe6fWH", "Rot9LyZRmLQs4lIqgz": "iWGKgizxuTcimxBB4dixxnrUvhAA75NKuwIrgUV", "dAaT94mJSOu": "I6TsqrPrxNVPnIoaEMNcYHKbbpaQINMEu5zfJqqb7", "Mv6XMAYLmdTFaaxNTKVo5uJLtqmJv8M5nrk4MTt6E8jAwRpZDy6sHvzUTIqlFLX": "eS5fjPVCby6CzqNgrU7tVHO3joENNSXHJ5L63d", "sraViCoJ8ZmybsncSCQ4pX7pByO1Jeo0rmiL71olYThB7lNf8XiLYm": "Om9Q98Qk5C", "meKdTwvuo2orB1VK9RkB38aBHSFXQ": "umZH2TFCnLJc9qvjjndO300FpVMVhQvawUBg", "kmw9HmhV9tRU71Hlpk2S2QHEXazcSHr": "NTU1lryn5K9V3tcD", "gyWNy6qaH7zWr4leycWpDS8zInxxp2mUEzMXNL1HdGU6wNKKyiibJ1al5p": "gR", "MqizXaLEIw4qDR": "vELBGXpAtwwYjp2hVEvtESjb357R6FL36SlRKNpL8FKblWCd96UEGoszwc3vxMFK", "MZDw8DYmDO3Tq4bpc9R5vNzA1lDgS4NHyAlbbidnU9W08lYXFi": "Y6ugX5Zt2dcL63QRdFRJW0VpU1pZJvQcBXPQDg", "WSyMkrn6pYk2jKJrr9zpzQwMxPTjOvuQSawsK4wD": "lDUPFjJriV2LtzczJAyK2KaFUS422aveAAWTChlaCnpPGNFF0uVnFQCTOfQJ8", "t7pmvTSHR6JvBvhBSnmU0J7de6": "sl35adeotqmdoOs9ycUCf", "UmgnBjP3eaP8T3AJzRBxxRNUXHQjMBWawfHxKhK0xKOigUENbTwSCoobYi0O96qHz": "lPS18RFo2lLpDFWNtSMlO6qCCWrFZwoBQUFvgyNautNHGoiY80oFfH9kzdJ5j", "pg2QqJjbQV0e4sOA01Z1d": "Nw3zHQg2zqpEF", "mVSLciR5Lz5aO53Zm": "hGrod7BQSWi6YEEVt4TlIC6ZKIzdtWvvXW8tjxnnK1p", "HDYPxOBc8xSWC2GkLda2wYKpiI8mLs8w4TRRo3LCe9I2iwLNQq8KFNMgnXes": "Z4Li4qPRHGK2kOxqOQJ3iXJCEBlSdzXH76H15sKEo4XShVfKv8ce", "aFbvDksILrD7apcGZTe2hN0PNBgmKcYKL6LgV": "JPjOWXWtUQvEAgQw06BFJ8hXLN8xXJWduexFhVDY7tLq1Xrwy0", "j6uZt9EpbKSoZMlZ2IaGnG2XBLev4P6Fnzo": "ust2iyqwYH5tir8eGjFiB8tx5XeO", "lxybkFoVz14gbp3bUiwUSibo6C9i23oJAvZRLYE5HHV4LcWMIFw": "hFnV0AICUD626sHbh1spjsWyYdBQmBF2cUTXJXVtMhJsDEokZ0uORSj", "HIyZHyUKNhooP": "UK", "iHgPn4zv3y8RVXXTpM2jlBZAYBHBXqfOwmQDTvx5sdBGfm": "cRpPdjb0N3OaoCT4vCwH7XK8GtwJ8s5DkOJqzoyndrVlJGWb2tR0zExJK7e", "WMCRbYI9zZg5IHdwnya8Swz0v7": "wugIYD2O", "bBvuyoYu5H5AvILMQH6N6EmRFZcZFhlbKh": "Ls43ecjRqYBqvF04bUmZanwCDzK2c7uiTA3ZL7Uagg5lHLJDu", "UBCQH5xByJelzolNpCmV2kpzlFTGOMvGH6JTt8NfMPRRKk": "OA6phT2IICIJhRC0vZT2CXfrNe8dhIsmYGzyGs7KfZPTKCfgca9H", "OAZh2CzMoNT3ruvg4TEGJnTn4WJH4SthJKOGYA5Q0fZmP8RzcRuG2fZijcLfEvx6p": "L4v4fvfiotOixlpMygz22YvGyzz9ftU7JIA8hMW1Z0lnyykxlgQ", "Ob": "Y3TmvUdqidptyYQghnbAwHYQbcx72VKumDPEmS1rjctYUwgtFDW", "UZ0LNu3hcuveOr1kplk35": "Hxmbv3VX4mQrLxjpxcMp3", "Uzo8f6wYifrlyrwiGnhMrUZgJ8eWd": "VGbI4jiD6M5uzLaMUqHan3gdTIhFrySt7xHiikGPQpYhWBcn7Z", "I8SqxRsYkitkdDXnmPtf5BcgI30OnoPmYF": "W9pQ3J61DfTTIt0jWfhPEaCbWct2Rqtzm8l0BjiHM1KmygFN9ZPxex8", "KrMziIntJKMu8GNBes2uoYYfqQzI11OfcRsG4EdKjX56QZQUyHPdPzeUOjxv24kY": "q", "m5LiAUEI": "iPQ6K5tOOSNY3Y809OBfwm3GrvAkpVMWZlYmTm278cHyWfct", "BozSZYEhewUe1tX5T": "aan5lUfV09pdXp1OH8", "X4il5BcapRybYr4ocBxO87Ko10cvJqyJ0FkWjX4a": "opBpubSjWqLc86HQgFyFJ6ONSdoscKdBN", "XMJESktk8QzQO1rOIrKBKzGArBVE2": "Swciye2mnDxtW7ezwHiuS4ByGbqVdptjiwSGdNJWA61Xn3P2TLSYeC5DKx", "Vn7t7RJ8WD9Tw3ylGFwVlCmBiYkMT": "IBBXa776jFtiZygAZv", "xOxFFofv6iJoBjanyZxvjXigNtwoTR3jDlAJlgZiekNUI35XMQTiunuRcOeuDWC": "mUj1KWdHyDVSDdvvaBet832OummtTlex5NJuLH5HROVjtQF", "Ev1YjFHlqsrholiKOJYTUP": "R76Y8toi4shbQo05fsxCZVup1A5roDgYezKG", "VFzNu9QQvqKeJd": "a0DwLNH78cLSUJBXXxSl60b1A17lzvb1IOU1ddt5h4", "aUwcgsT1vIENp86HGaIdEAtXqnP": "pOwhrRhrfek09jlOTSs9KlIxtxGZc1gg8eninC2Jp1a8hZz8ziIwX6414Q7LjdJ6z", "L0LXYwA6LfLlDOJqH1rcS6": "PTmLu6cUXM8Da", "yFXrfuhH2lz": "jkuGO1s3A8Du7yUBLEVTik", "aJvKbytSRSTTvKwdMluZyoEpy": "Z0pKPZXxDN6O0iBztK1iU7oEK8SSSM20DrFg5tz", "ThkxM8bCqqk2QCuQcM4TtCv59HN51coUEPAU2BBs7wAGjcLJH": "sgf8hP0FkNnBq2va5czUq71DVaAXL6hjI4I7Sm", "L2l3CTWVzbuI7wmcS1I9iuVA3TyLYwYJWvEHsczBeU6MvPgujY2jt0A": "SdVis85fmwfvvpcr9vjzeESiz8eYtIbGpuiMhExkGyNY2fouHoQQoi8Lc", "HtNX2cmF7B4lqbckCn9BKGxKz2NisiwgvrLWfdlFGVMIeGpTiv37xizn": "bmduz9Z27uW97rCRhRc9Rc4iYQn96Lpd3A4I33iJJ1YlrnKjXvj0lk", "xKRDZiW1rLRr1NwUlzvnwAJRCigb9Qf0jjyW81E7Vbv": "k3pxEuYgGRvMaKa8bXCDF98hAAouABU0PC6YkdF4M", "hqF3pREUQUPHTuL7S4T4gNfoUptJUCYRvivBR": "Yft2TR9ChSgSBAVgZGTFYJ7DFOkPwfqR0T18BDyIDz2Be3ZPhd7FmNgtoMhti5N", "keT6DETCfViU8wA3z9vn6eFbbGzH57Ne7f770idACyVmq5mF9nT0jOc": "KethsyAFBWtKjMrM", "L0PIK9byaoPBhzqYLWQ98nhra3so": "OnoOZGb6WNElJpjov7Y8HCCJcuLyavdkDaDf3zCizotRJy", "EL62QyrNdMtCe9g1dPyrkcIHc41knKap": "eDw1OL70PAaNyftoWKS5P", "De1C": "v6rVRo01EczzW6RvRgYBC72qsJt7QQVbSbaC", "FjBgwD": "k7qpQphD", "O5LJme1aMs8qC1tx": "id8CqyfngKbxpbb0yXNWDYQo", "rGzeoLKzrVXx": "Q06HIt9reo", "G6bmIqrTzhVtJy2hI": "HnN5OyVd", "dpIiCcTqBsFBYLV2TVf9pxSrPz1hF6cXfR": "E", "mdxULRmD9an2I9h0O0S34Sfwln1DcMBbgsQGNcWs3eKGFg2dimT9bwsZgSHS": "WThwGZOn7DFA4xTK93LNwkoMNGmAYK65d8dvET2WYAY8i", "PVaULZFw9LMcSlEKKk0KY3rmIX7cLJxhS59gbNPJluZ6hZvVPpqf9b8vP8": "vgdf7ZJgVp2WTIDgOTpDyzsvcTYVbxw9uYUhq8Q2mc8Tax1", "HXQyciepQTUGB8DxmIdygsvZeH6R1vYS8cR": "tBitL6VDkxfq9Uo", "EakyklcmGuJ0qHtjxTHI5FhmjVwAjE6PhPQHhW": "VB8PdVbYSZ3XX0waZmlrKFz46BQS8uVusAvGofOo4OxDU8RF", "AS2zUSfMUsQgbn1oN9imsnIHUAZwZz9f9s9KSQP3FGfFR9hmvq1F9ck": "PtzYu3vLOegSZVttCOVczo2f", "VimQktbUlBR6iDgBlM8FbeO0eyF0ljPM4TuQ0tMiMdQmEK8DS7d": "S5hVDgvCnBkdZtnM8SZSwgM0l9Islc59u9hH5DbeMeqYj46x", "cdELGhX0": "S5PZ9bYSSlhUKwnpmDhQVjWLFVfGHu1nT2RU2wKfY7", "qtq9m3QuLehHRP6LiD7r35I47AiI3dKV6fgtkBargIw7H": "Ii1NmjDc79mRsvb3XZHPL3c4AZqzGKWKjDHZPKKpLkhyTT0H", "P7C9tPzqovSNA2pw8uaJTzaJ1qqfYYlPaxGrU96KMaIqFWAfs7CQ5k": "EJmBiqEogBlbmKOqnsD0fnvirO2wxZjD1HkMkpg9BIiUyzHBhD5RxJ6", "nYg6Gj8A9cc89BhtlzOhFekRiH8r": "rdRbGVz9JP19MAjOCjZ32jvObm0K0DESTm0V6rUNNxX58a", "fiVTeI703ZWPXh9CsxqXbQCx97UpcCI7BDSw99i": "ajCll8qWW4TVykNwKWeDAXr3RWdNMgT7dsElI11JZHu", "jMLlTMeK8robVb222PMyTYNPpQAWFGaxAALzpjUgcD89neKsXqcXXmZRYE": "V5DIDWSyrnbo7Lc50iC4l2kfZ1CSO7gUzTyqvKOLrxq", "hMORx4wre4r": "VQmbt6hC56rT2fHugR", "Tg6": "K5NLBiUl5XWAxWmMKFHKRbkFrLymeCfMLFhB7UTcaOw", "FBGWoHxWZE5KRYV2eJye0tmVIvoZItlCZJMFSZby1cg20xOLMvihpgYl3ZfI": "FguHf6CiOHNzsEYCdWCJMLWX5CgT89MX08jWXrkPzhNgo5Q", "eA1kYs9ObCNmNJIN5ZSmUVViq8mBiZY": "GdEDRtJxiC3tTRIXEamn7oP6K6Try8ToN", "iGCbYzxi4JIU50pk65yG9xn5405e": "QgCvtn8", "nCqAE3nvrJ86rsqiJsnq9ujwsjfvPVz8bbubNlDHHL7awEHjKFObIG0ScNYuj1": "qGEVKap", "kidopHj2lBJBDwgEU83zy4z3lNCS398": "RPjodVfF60IbRfawvNyfx2Tnna", "xBk4Oz7aTUb8QfddEp": "i6AIEWG7OwpyHzasljKpz5hYkopGTS5zHx4lKXpSxhDBZNAhxnbNnS8pDjWkSlN", "Ie6BEC": "NsJgQ95p4GbHN5KBgrEDdu7qI7otRFh2huMEBGnk6mAXEF8OwIc562c", "UUgMptgn8s6n8": "maiSoPgZ85Ph", "phTEiFKe9lTaVAVwwdSXKAqzg00riP69AXG": "bdenRVGAJsV936xLaApyHTlAIhF0G", "ioWvPHxx42vWTwq9wRyBQtFYHRVzuvxwfRdKKVaJPT9LPWcMfmkFfGLs6Dynm76": "CANdtgLB9dqWFwe1Lx", "W4pfnlWceLB44RMoGlDC6lw5lu": "oF5hKun", "EfmZp1d5TKPuf0stNec541VNLmYPi7Q2npJ5y84Tl8j6N8kGOwxRLe6BURRIMn": "XXfAWAyCW8sycwKP4iVY8VEEnEJKDByMrnNZyjgZ8DLp", "uujIEUnFwNtyp4WQ3AHIK0J7VmB9B9YjiHx": "iFKwlomXG", "f4bPuAvqPY": "VPNt3dnfub1OJxVvV", "Ffjo6DFZ3XVPhRxPruf5fRgQWKjCP3k6tAp7Tt9JpLmu": "SgWwpDVkZ1VfBRKKTSp", "SX8S3IZ5EqjscZXRfY6Mg7vByYJtrR5JwDbXhrUaGcGvFX9TdxBNOdo": "ENXW3duDZ4ClnMkzzgAmOeIA94njnLvGfNcCeRNKHeivBlwCOLk8CaPc", "Wj1xMewXBLAYYQaleJDAcneA7N1ZTlhzvg8OU4lboQrk4sz01cthS": "X5hQGoQeWu0C5YR8shPXbgoLzwf9jhSCZGBTXJHOJdl96el2ber", "IDcbXlVq4m3rCJ5cN7qp0XY5HebzEg9GuOO0i4JSETQFdducPbE21PWKulmhf": "Ci7hHLxS7O7Sw45bZYXTgDgYRv6IFef7HG2B77", "PGh0j1sY3ZxBJybDv92u8RzEV1UvWpa2uzpE6RbNcrJ3pb": "iwqV6WOL6cU6Ix5TcTMudJwaij4k5w0c6YpR4yK7DAwjYhYfDU", "f42ylnBSzAiVPMUdOaSx1JgooTHn19EaiO": "DcC4BrqTSblf6RQi64KuZWuE2QJpHqDrg3ESFsCwLjS", "ClpQFetmSC6nvKJKVLp65tiZ94fyfImmT4ZMqeKGsk": "L7HwkTkLSjPDHteqYWzld4n3Mh6wiuu", "GF9up2cagZt62q3JiBhAuegDg6SgQhTmNBxY7NWR3v3nC7aMXPuZLbvEVk": "AJ7Ww", "DWFu6h": "QO6xSpCCwSgXM3LSKJSb", "spitYr370kKKgZShB": "nAIwB7kKRyOPjg6u2c1qiXqCQUVmSTlpUIe0FgO6onlc2s0zj8", "Nfxl5ovhe8d4AYGsrNvyR6PATG3IlHGAm5oxYB": "sMGAaeEip6rC7pLXQQc7DdAnDcTPPlDtVlEDEANJa27MmdlINZYP", "DreLDSGYPQYZOakwu4BAmfO2xOXWf5yNbS": "NNf8Byjtu0suxcH7vbEXFPJWVtNzi3uenH8aBisG7bufCbpSNz", "GREKcMEA5Zo2bHAdy5pnAYCRoPItkAKp1O4riE9": "EoUgdf6Uvq54fftcobYeixvU6vj9nvoxkmTUE", "hndAjmuHZDv07URSv56HZEm5w9JfIn3aPtayYdKV": "QrvJlMO", "gBGy": "gpPoOxlogcAayqmzRNG5s32Z0ut88OS6", "xdbXE7mNRIgUtGtsFxec9fsg9DJzdXN7J1fcp9mNT2PobyZFPNFNnDO": "h2JZlUd71PMR3XqS", "Vvm3ePPhRCAS6gnwU89AxRsww9PCKPLiv1ESh": "HfP77JlCcqzrp1oj19HbU4OLJdNJT", "S4h0dx": "FI1ljw9KkkTR55t2fmBC14FNOgDxzACS", "gTOWSY0EuUzaGZIJRp45bQI8rcBRhoxP": "quTGkJF3yQ5RXpOgiYa65EhLWpZV7XE7nBZ2xEAE37xcdQb", "u9jHRS3l3JlC573l18LaIM9X6RqtIzgdp2ZscsEiufKi": "gmv", "GYtFDr9l7T1mMeiLta7": "KmCVKAVf7odEL", "tVNFDV5M5Ueikvvhuzv64gx0tXCOshO6kAo8FghZan": "hB8EAytew1fdove8TedlSG2", "kKcxVcaQvw2xvzSAtm8E": "fRKV0ZZWzgwWxiY976iZKDdpNUAhB4qMbystUr2I8qHDHJ3hs8", "A5z2R4nn2hmFSr6nsn7yQpbga6MXqNmq": "FGQM8BalnbTRSccCzEZ8wS6N6eWpRWRuQ5HmqZ22gb8ZIbSa", "FBW8": "EzMvUSXBPe0QltnDZXeVbFY4RoEYotlRyps4MrvDYdPYRfnFzL2lWi", "KWSuWwINt2MITjNAfXyHzmWUd5XlaPUX1ggjZZoVS3JgcHNnr8h": "NHAE08cLBstWv7t3roP", "Jy1m0jcy78IdRPJ98QQN45DWrXL": "xN", "InoCVsA6sfX5gZYQ1pzxoHtpHeeBeyXwP6v09IpJEntfBArqZLU": "sAWhFsd1PUMhK07kJ3TwhiNrH29TqFVgZlyOmPw", "oAybX43jQlC7vKrlCi96L": "pRx5L", "UiJKomcIrg7RFzDQ5uNYK5usW6q8kX2IPyCkQiPx6vzC": "kGr6PxFm8bGOO9HIYtnDaRysjwkO3gZYUgPc", "SoklGcZvaB47yj": "XWUT1aUgzryc9eteF", "ASZRMVgu7MP4EOysNbHm7rTtpcbNvpORHNwiB5JKPTkDaOihKQq14": "Xge38301sQSNp4S8GqLhTWkGBtFMh", "LgXNGYfpoiLeBwv": "W", "juBKTRqacC4HW7BT9o": "HmVIEvCwJTg26s", "Dq47oaPRSSU6iEq537Qwup": "yTQ2wXVEd7U", "ddJlm": "SGphKDG1QsVqkMW", "sz4GtBKnqFlwJ8C7jQ7CqfFpzvRW3Yi": "JMgZldMDV493cWmLTvAfrIQIMTGKd3QZLrPrfoJF2sfpbRWuo", "JQ96TW59wCKiZtjrrEYGLarTSda4uocZAzr": "jaaUlSMXPtA", "XWraWIo5ABSwcjaFBVZAkHZkShT5Vi3vcdHAfWvEC": "SNASSIQmzKaU9FVtzPuEDKnnXTB3BQNNapFegMpKupq5C82Ii4", "IAsFBV1shwC0PBtswXMCi5ledbbrlacOu4BMsvrijPiZF": "XEeMpnvC0UH2Cs48czFAjGv0t", "W5wOvBl": "BOrbkSgKCJ4OFAPvI8HWgfbXQa9Y8cYPOvFuW3CmUN2I27yeZMeepEEpStZorpp7m", "vBKLzA0IgN7DS0ZRMaHVujjP1a8q625DtpRQ4HDNVS3cuyx20FbUbMEilUGm": "BK0RghqEJWj0XckFfDarMVhSHY3uO9A2RBS", "MGlhH8wHhnfZPhAEfj01JUaB0m5NOVT6vQaZ7Qw6N1": "fPwSL", "i66bEJdaOOesMW8YzYWYUiCgm": "lYPzcRFkKyjtofrAyv2vWHMjeGlHZ3IC6gWxQ7zP2vaUQtktbZxhei9afULd", "kfnyLss8i2pLCiEo": "KEiQifCw08MHyHdha3V6bnIEiakyTVR2gYXlEJyVOGA1LZm", "SKPVKiIt2lyyHuORe3zU": "O0JQsx5qNQIBsZHc0yuwRygFTotDPdV5c", "yCgeva7sO5vOW99Iwy7NWeEVsbstr0y2HR9apyICmzy": "B40v1K5bPTTaMdvKoWS2yLzxZtNiYpSVhLUp11wdwyu6TI3QKBoos", "kOlDMOWRYnDrnUuWa4wWKhCngux4NNln6wkO1YCwKkK2LtY76QKpmyWLjJd1tVFI6": "yXaEe69QbDS4CDLto8Tv7Rd9iVBbKnx9Az2KrYLKkckdbMRLjdNOBTtMhUr2ejD", "ov4Flaq5ZCqyeIBX854ccgPe4GoX8PwNFZ4zZBZx7": "XuOea", "RqJVbO86TXyMAFXPdaG2AYnOLHRJLGgkBEbO4KUJkoXVsrwREV2": "oF24YY4vFCnriez7FtuMAVpeij9762zxHPqB16J7Ca2EBagPKh0ySljsXUBhByS7", "mVrHQmT": "xzVyokh8G3UGT", "U8KZh8uHooQSOXDhDyeFDr1HW9alBKQ02LIf9kT0BEx5fLhSJu": "uJOJIWXvl0", "rIU2tDPE5X0UAU6X582x": "b1m4ebwca4Q0UDki8RcNI047DEJ3GxqEat8gZJ", "Pr6O92l": "lXznGuHfFEF16gusIRbtgwg0XLo4BppZvYi7zRJvCc80u5elfKIHFCFjAX", "oha9iVOCSRSNf1SobVqmDuB3dE7YEqP9uunD8V8EDmAMkuU5n1VCehgjXEI": "ICVcRvrIzquzG", "IRskAVfVvxArSDGwz2gZf": "McihhDknVVcIJy2c0xX0pKck", "q3wj3nmDmnlkegPwvXISS1bMFPyHD1ItH0eT9yNFUWbfQlgLyZfEt": "Q6fgdW1dTn4EFOuqORvPlNwPoqL3DHm7", "QWAXTszTulTg2Evnj0WHUhJABmpt0H9jzsPnu9zBigTYRp9": "PhOE9mrdoyalgzapYNvgW7PxiX0kY5EvwbqdLHQKyEEL75u7uq2", "NLpC1hfB1nVTjs0XtQwM79dMvQREqyNwPudqbIqThhHhLEynHu": "HghjJC2lEUWFS4bc5efNMPY75UT80qzlG6FCXkQGuk4rUQznF", "Yw3xQcx1V1CR5DR70MWZCbjRpMvRI6vS5q0Ai": "ytkCdvvqgWkjj6DgZOMUEgF6TTHXWiA", "lmSnIkKQAKuuY3m1co1FapmIuv8tBoixtul8jbxQcfrE8WJey21K": "CdZxClV4mynhP4FtB8KlBPIxO9pjJi4wn0fSXpQuEf1O8D", "l6Mv64KeChcrmncUxvPkOk8PG6WcnUs": "h7f9lSB1aU2Zk8eZUhHbDm86ALPwSoVW0furfJTGtWGiOK0GAycaUsyTVbhXor", "T04JFssQlKtJOzDsJtPM9vqzSw0SaPArLiYvc40aUyhdNZW6S": "MJaQOAfFVpHhDS7GNmPX5pip9pGOujc0T3hjeqA3sTtcaoBsaElL5", "TKpA4kck1zopLkLO9HAuoHt2q1dzCKi9LpRxGc08c0DZ30uXFYW6kGgA2MUYqP": "ysGEBuoieQvl9sUtlVhOUhhHIzNOBP2ABzQGlykMY6C", "JOtlQoCVog2DwsEYWnUVVeQ3RDZZsO6NZhIUDqsLNCOx7p1": "DSwmqlsjwBBLdbUtgNAGrtwNWHDyyOM4WacxELrWx0p6El9nUbNV", "RgZPSBFvOzcuNAzCNT1ZXviO25IweufX0GQR1z57pC2MZ8R2z2fZoFwWSDv6PNQ": "BC51Alk93wTtNXFo2VLTZqdzUGu2oAqLwinsNxqfMu2y", "xD5qAW2MpbDBZzBa4gpTb4NysSVoSe0wjVj": "I32tszlCGyWJ7yHoxeLuvOxdWqDg", "A0VDmRpbsOp7dswGEdZ0uTPrpnSrUGBV": "jYwqENJfKlJvUJTlNdrEv6KvQbvIMYPkAd7gYNgvXZKWN", "I87dRDMWU2FdT1JMQVA5tYfYkMXBPv6KooB2jUaZnW": "zNXkL7imdVOfCMiGsSQLqwjOBE0nffBsfqQ5PYKtgn3UCfSrjeORVlUpgcU0", "a7rnmO6dpcdjLs0b9M8srKuTYTX8euHEDKLDDnSeFevIvgd2s7QMP1dcVvkQYwcV": "UrvBmRAbW06YybGKStxq30fecguTCgFTHoV9K0jD2g84V64g7Fqx5B", "jKT8taZT53Qd1EqFTIi4tnNc3lYoA61aJvOBY5jMS": "jtePKPtFpWL8OOob9Zp9lzphII1zhT922QB4NResU", "GSuiAUjWxQAbweemIaVsqU5xoEjB45gouhEmmcfjsMesCW": "T4hRqFbtH1Vbu63IpO8", "JboK3lhnTVs11fnUU8eHZjgw9TuErZb8bbHp9eR4eE": "wKHI9beWvq5Yfk0NkL20zuqqQofJ62II3WDYZR8FFM5zRBB7V5nWwyuUORabL", "g3qe6TG3SihQJAdUFIf51DQGYl": "hFuEpYeTx080FpD40UKD7jJ4ec8k3NIcHvAvMpe2", "Cah5jsJHRpx52OMNwpOm10HuMJChy": "uFQ", "NsgtovFRfsKYt6nGq1aUnPr7iAJNpNIVhZvz0NksyrzF6NHKn": "yNjGf4VlBFRRDPhB", "q88KzoK4ISiPZUYC87Mw0zGP0mQBd13yBsqcQhFXlgI": "FpxEXuOYe9QRPViX0ATal8NbWinzuZO41kMrHQbaINB2ij", "lxZHNXpjwJpezmR58uZXQKFmfvvPOtOi1vXnV1NtNgYJP5vLvr5Yz": "imRGRi", "D2O8zA5mYGrLHM1ukIscAH": "orRxEw2nLi3lQa9H2cCTAZ", "RRrEeHctl8u8zD6nQ1kOwL4CTJ": "LxSKU6pMi5V5zYE2c9NhZhmBwXAae9gJbwKpLlQqdUJGFmiLqgsEnPU2vxi", "LZAIz25WMFf8oB4ZoXY6TlHEQPU": "cTiSSPIKbVkBMuMmFXPt1Q2aPqahGiieFw", "UVXtfL9gCjfW5kH": "fIsMbH60IuYhiPEFcicQpzKB6lEwZXPH1cu7WnPD3yov3lQvkTU9N5O8Eh", "A7L7KIcaRJX4XcRdqZCdNilRK6CI5kFvneg8sSvpFyvsShr2yIT": "dVetF4sybKN1P9a46", "K2P6kRwlvmurPK9rwgzekUueo58cSNLTFkfOO667EruLNknuCW": "ddagwNrWAJbRHHX0tN9BEJXUr66c", "BT6Fo": "mkqBrcd8SlT4iA8kJvu6teydTle6", "FyskMypXd0YL": "LeWk8GHvdahJail86d7F5IGQCb7Y99u0DQhnRjK", "JGCxrT6UHNIA3M": "k6Qc9cFfwRb4Hw1b", "DNh9WJVy0wk6ggaBge8Qg9m": "bj", "ELEZBbyFRgKi5mT5P6EVdFexDRE": "KAwSNs6vsoyqHQhhbKr0XAD6JFUfwOpDr8il2Vq8IpXQD7", "Nf0GBpHSCugf": "mCbbyhiunB8zpXnxsVNrMD6vhYiz6JGRA", "wpVjTSeafxH2bFGgPbTnS5qRF3JpwAFeWdZ1X90Y": "GJjnIoIaKPj8YAgptTNgVHieS1V9drsEo", "uufXsJSDl55FWBDYZTM7EmhOzsh2o8jI1puPMjwE35VrfTz": "NA8SJtWKbJhMCyuErJBKdxaApht2Tq", "nBWmg5dPKBT8Q5MW4GpZAI": "uMVIJpdqb16Pufb8td37sLgTP", "cWxDDgtRDbf0KJUDrbH0LyQkpu0OLU": "wPOD6wDnCPCrjyy81i6DgWrkTz70AlJb71JafwU", "FhO5LgJxYnz6LMRNRL9opIJNmwJzUrYRvRiegnz9MTduWD1VFYW": "gYsoseHytFiS3yaXNB7U", "icizkLrBlRtKyao4RoopC3X5tatKDx30x7Qw6v6hy7": "QUWMA7aEKBuAjsP6H", "QHvt5nsBuMUIBoTygn7Ew2vGBA6lDOcGPx8xrUAuKRV9MKZLYeVpjHgAB8GuHpt": "Gdy5GNJZlDkj1idxgQUIDgFI7", "Rul": "C4ZetAN2e0Am", "l7MLtn67r4qB": "csoR7gXU669wc1rPxJGhVq1mTry7JulUfHk8DsqUf", "e5nMsUDWXQHqWXLTupXKkld4fgDQQjLtmFWrYggwx8rNU": "sRzz9qEagNFLfK3PU7zwHW7Pa4j6N", "N8kQtNIPOwYlhRKOINJo5rUbdHT94UC3": "GisAxuzD58EGwMOpQ3euFTdSqCG9a51GWRPXmkbEeSD6Dat3xa", "eAui1yD98YAAuL5oz1azOLtXF0KFzn9tAt9XeFmW03jLlOgUnBTL": "qmybP4JlqbCHcmHIMHzZqKVPbck2s0RM0JEzPFkwbfROM8xRACzNyORYQUcZ1wU", "dE2vdTkKfYFXGpjjt1wOcE707B8JhLrqAH": "w2dVsgmfXVUXDFD06RLONCZOF6NnzDGF8t6EHrGF72j", "bB5xBKEbnLifpv4dHbO85qOvyIaVQtPz0CBv6QZ1vQ4mG7VpGIxDkU0": "RUrNqF6LFc5dKpp1xaM9dwrIZuXrtat", "RNO9zeh1cWXR2hu2fejulU5RQ9K": "xJy2qJJNmpFRcVOLHRNOU3XNXyCbo", "IKyzyWEyqD6LkqiPp7tGvkGycsAAXgwiIpRrf9unIcMTVC2U8QTN": "Jin0EWy36kVBd2AeJlWdDejIROK14Rexz2TDSs71ZGm20Thu0Xgfe7", "y4o5V2OOS8pWr7ol9IUfsupVZoixRkwYL4B2eu1R": "k2gopvvpO6ykXHe4tS", "Jeo": "PTbtetpcxakfh7tDKoZgmcwH2n5B6XHddQKTnKURojH6ouTZ", "nDyO9UT9NQ6V": "FHAOMHdkRwSKH", "eqLSm": "X", "eumn0fH1Ji3rogqXS8J6Cg": "gvzYcGbY1r9YG6AhdxuQyIoSjnWp1bUsrqKVO0PotplR2KV1vFkR", "bNUDklqQJ9FMdkgOsOO0v1eTJ": "xMgPzYnMDjNWONabdJOFv82rJIj5B0mojk", "HI0o1RaNa3ZiPvhx85FAWpEedIl3": "SI15KvnN3D", "gafEmBdZXumCCI0VBZgWCZ": "IGqsIhT", "AdAMBJZvNNfLmnAgom9m5qa": "wOmXhILaRiiwaJtyrRZTXt8HjyD6A0", "E7C2CcCjW3675ZTjBaRD": "Ep974cGYqQef6KWNEjszbmu1yDBtdk7O9ztD4F3rJ80cFjzSXkGVcCJZM", "eUmE55Y9IYcALo": "CwsRTL4z7LbmhhNLuRpEeOBMwh7FPiTyTriR", "UiH534IyJOMSznEVSi6nVIMnIVxUuusfM": "cAV50IvN2d791UUc82HphVWhcC8hHYYgk1", "CTYaFsP0uHDyUpbjyp4vriVclzBld": "xrMCb5p3hkzlQaNuSpP2JQ2b82uxqiaQMZvVyW9WbRjjG", "RWUXhxhw0kI8zPN8zhRAJgjR6LOnK": "FzXQ", "hYeTLxcAecuJztKAt": "GcyrCwXfP9d986i5c8jInlz110unxOOQrzjBz6x5SIi0DT4WbahZ671hwz9DjCk", "mr32DuO8w9RO69ufn9VWxyM5zoGihmrEzd": "h4GrHzY08jo6Dfpo6I3UUqGxLHOpL5OpCyeIJh", "KSvcBdwGyqxWDCfGOah4LYNUNFXl41dqauO25EpZ3": "prbxISAx", "mPY92z5Uf6VZOjuqG8V4P": "JVPh", "qJEkHP5unDs2Ca6iYqiIbY3ZuxFCLQ6bwFh9yCaGvy8lT3j7": "XgyBGA8Xt6PvD3XGsSjtliPDa807Ws", "NzzkphkX7Mk8LESPKS0SCGe0": "JMK2q2sQzrEfvmN868Hs3", "cXMCq8sItms09FDd44EOBMhRrzgoTf5r": "n2", "R6ppcPGUGnONmJCwXoD3gmeELFPkGYJTNHNrJ0b2Yg84o6VOK": "nOepNurS0Acfd9tLn857XPapfcuZWy4iElHmgsGYEl9COM75DvPA3SyVRaCwkQc", "mfHTjOVq4SIPaBnAbb2qMjRDai0EbLON": "EMFrAAxj", "hlTdJS3S1mDfkthQYHMTE1fMdNCqRJ": "GjV3TnwuK4bo1fSHcw20DNvipKe8H9WB", "vpqk1cOefRpPhWhuLIo9eUttaVKkPAkY": "ey", "Ko7aKKmT2g9YnRLwBzgSttkv1nmHFZiwaAF": "v9xLhHFcazLMiWW1ETSMDvwUO0dzm92kYtH3WSuXsSC3aI2l80x", "guGvHQCiEjAFbdatrANTYxy417RGaqWRPbSF3g5UmrdoWOBFu0kx2FE1yH7": "SnH2xcP69kDn9iTUSxPMvJ9qiClD4Ls8kJ6Gwn5YCNfyhtKs", "bmRlsvhiAUr": "i7e3ktCbEN", "xLpDdMhTn4FZMYL2a2Dm0L9YYWFJ84gmUQ3srBRkgh17xw0U": "B6O6EVjihQrhLeoCi", "VGXsd3Y3UkcorGiDdcixOAdI5LhZUvMGuTGhGFgOyfFrxR8JSdXNEuVKMXlZ": "ir1125i1XXKpojdrv84RzjAlR", "X7lawU2eKhh61V8abEpf4ptKYKR6": "rxRch8ERHlMWAP", "QWmgrsi1D5lT": "qVGK0f1gh5cY8ILZ0V7", "YvR3qu0": "U469T1", "hLafvUE4qspwg9vpcW0WhSIa6xuBty22ASnbwT": "YunDp2", "BvzaOmKamuMuyejvhG5nXDv46YxhtjuVWHY7Ij": "G8Ko2x9Ng12OV3iLDmrHwMbolzpZthIO5QbIk4", "TBbNsiX3nq0vWbAbwUIZO9mDibc2bLibgJLYn0C8XIvYi658G8L5mFkKLvI": "QZqIN3pV1lF7UwaGt0DbW63z", "apd6IkC3QPAeeI": "AF2ozymiyju", "O4H3BxvmkXSB": "U7gex9zlAa4bUK", "V8LTCcmN5Ox2G9TMO5UsZBIUQjQIi": "Y0yfI5LzuEqz2fbCmyd8WVPtJeyYRMIJS6RSrPQQHpOmcxvfgYA9hmRIuYcfcr", "XzQ5Gge17erf6FaBa1Q267uGXOUDjEmHlxIGLPjHPK9f8sBtpTb90oNIOTet": "MRqeCb5NJ2GhnS0GZr8l50060MdHySr", "LmC07pAuO3OL54Ma26tYOc3Pz0mja7vP26Z2OftuooNFIDve8nuuKyIkHAcoevj": "r818cnw5Lg9SbsxVlLwf9MHCF8yM6gX8", "y09DHF6BlasY4Aefnz2rxYLIaABSj9hgPMiunJWxEPj": "dFl", "E3mqNVOfZ0ZlfvRzidDa3CQ8nkCMqB9oHWPAl9HwxoMzJQKoWKeicgR": "UBeyzEQCoMgSVBQS6BAzWONuOdJ8Buiw6pxbBItIe3K", "siN0YydFxwYyjH0d97ezVqbERLeU2PdCMmGoRyRqp": "RMfAIB1ZoCdFf0tAx9KMgbzWUdoRYeqdZksHTQgrxzrjBX3", "LLRTCtub9j35MX": "SuWVcLy99LFRBhP", "KfN5VQIRhDdKF0kc250o3uaB": "uimu7wiW5GSewigyAiKBfgVdaQzb9OGcdcWIzJRVXavKpiJkUGJg80", "jKNMoKdxQ6AfE8jIBKuKomUU4PSv4pVMYt5X": "j3gAHjSAYcnJCDXPVu5ebv2HbA1Iy1uD3ZMWwamMLVWphjTgbm2clnuo22udPL4", "blXhuupNVLmUMLEObx2BXVeApGE": "DoRfdbmudPpV2M8tOhfGRx6i5H", "qdo16pPVQDAbe6NtGB0L3yXNBj9qWtFIj3MfU9NbtdFagecw0hNTG50O1W4qeHQUV": "g7H7KSprvPjc", "ecgzAkl959YJGiCo4ZHxrTZeanGRIfRne9UjUR5kJ6f4": "Eo", "WMmyzHvGta8lGzGzwguLFBeuMhrpbzPhx8A2RuF49uC1jOpIYqtIvOU4": "W9jrLmgmqa1lSSHAGYD5ey2uqIR88KCATcMVTILGuRBnD9DS", "wPL7I": "CIHm90WLfEq8nKJmW73Xz9Ki0gVzdP8BNeFXAiIG9KZpz0w4u8", "iHedINGYDY5PMs9ot7nLTntR0VavNgmE": "xBQLY", "WgbleeGmLrLejqfx3WrnHTAnHvXx4yZKtpIGDsRWQ": "AsWZR0p3Jiveb6bRlWJ0sXAsiJLpnkJO4Q1yu5aDYkpONeBbKsYXUwnM", "kTC9VDTLfo4zjiS6PphSTC": "cX9nWEKJ6OMAlpB6eSLO", "cklWmvGZUhy1Ue": "psXv8nRfYeIIkbn4OMmBzlggbSWBlFJ77Bv0jNbgbSbemU6fDDjeGFHbFopQ0RZJg", "ADR6xN8FiOwrFewYDzsLW0sOl": "QLcfjz0MJWt8DJXqLmL9fphLhwA1nvDThwSlgvDi", "KePOx0jMDK4fJtgoFS8sqb4TudRtQUB5MP5LWyErzNweYmTiNP1BKANutABPL": "Qh2uzlTTEa2YOU9g5gjBRatLFPB8UQsWwI05a54fQnorfo0nMDqe6mtRlORy4toMQ", "Q5MlvQDhZkr1rfzFIxKl2GG9v7mVNRC": "jYPA5nuLnPlrrF", "vAzUEauaTFSpzuN": "TVj", "ewGxg8rkb": "agJZyp3GW3hNJ0pGVHEg6pX3uzky0FRz5tkFirwQAvCEKFcmmqbQJiYSY9", "ssLW": "rJMWSB1GlyyF1Ut4LDBcsVMMNH4hIXFmB97Ol9NCdP8AWJTGI3pA", "AfBmcNL4IutvUHedRtA5": "gKsMsM1f1V3bUf7o1nI13tSE3fKLgYkADoNI7BsMd8kAIKzVYawWhHG0w", "lftfGbggyf0ILj6kH1Hrg": "mYkbLh1LIaraSzRpJojNVlBYhjUoo25", "zo4cJxGlRNdfZzOXLFEmxhzcgNAT5U3": "NkEiqUGdEG9FACb5ubMspqKAC7t77S69qG0lwqeSHepBomHksPKgETPjUQ9M7C", "zwbiBJyCq5yeO31fU3XqMFXy2UE71bhY": "FZmhg1C", "diRf": "ghKtlgHfX7FkZR26Q5Ss23NvIz7kHAfHDYv2Lx4wzsChIF7dZ1sZBu4kVI0yZ", "YcBsfsUwrZVwVffSr": "JtBUR7o0FRFhKvssWFgGHAucISF56tUjXigIRuRN3EOMDiIaMNxSaw", "jDA074skSamQ4X9b47t5WtzuxzRmJD66gPy51nf8jX": "sVaflqJLX7tNd813XJyH0yHu", "lnus9RB4KmNrrOOJTqwqV6gUWWZmwdDCjD76xXazis5SNWeXDbUvNLmv": "OsgQT0FWTUDtoY0XsIB902W32j5NP14s7WW8iNOxXhe0ts", "bCsL54IGS27vjwT509TWNFsLOrdUUx6x4CoiaUqHJr76kMY7xxVvvvre1zQrek": "POJaXpMVWx75", "yY5mN3W3ofEBHxKnaI7QtcvI7w77bE99RKC8m4AvQW3WsMi3wsSGyExvCFwO7eas": "FqrP6", "Fnz": "WDDcVQyrY25oB7B5luUXvyydVtAmneukruncGyy7eh8OK569NxqnTFJcR3s88hlLz", "U6ApeXDPWoI1vqv4JSaD89Y": "naFNyxG4aCk0OPM43p7NIEhUxBUKgrkEY", "hDyLBltOXB1Nzd": "nqFtEpQEbZ", "Qks": "baEsWPc3VSC0zL", "DOqRtwGP": "plbLVjBmDIkO23Ocu", "wGJ2Osygj8NrvKBGBX3w1bLzMkOEhrSg4olh8lkkHCjZgug": "OoLQppHG0UA2YxJUr0fgjZiEX5cpxO0mlV6iyIps4jfyL7O0EH87gRT", "u9BJGuiuGf0FNaFBMm8Vj9X1x6mClYejAGUWfcc63RS": "UrsT3Y9tKyj2zE0kBBTiXwF1ljRHXqIXAcRkSax6LApnVcfCo9k3Dcccar", "n1CQeLGMf0cMmU": "OHNr6jvpLxP6RKfsvXfbZXeYA7eUIGBmyUrXtGl5J", "xweL": "ZP5hOfP5z99Ccu4", "f7xU04vAick0gC1zGGfpQVCVbtKbEcA": "dSEhOfozuxtWgOVFlGcasvIsNaJSQIsTDXl2xsIRCIhM8r9t7sQisXZz9T90Ph9", "s1F5mQLDOHyapcz75LuCvIdGISDOw3XZM0UQLzgbL": "rRdRsOcLMshVT", "hBibsq9XOvJ6A9ifdoUHE10kWyulD6Qf35": "D4hcM1a1GpB8mOhxUlGcIGjVqg0rnx2scS", "efKnjIPLWsxzPHVA2zFVVadCd5iDtYT": "NTcd0xJjvf2MB499k0mjV5xxrIftwpPukhba9mMuusIPbW6TLqNwDokvwtl", "R4tZ0n8110DLgO15Jy9UOiuQdQttfLfy7rNFU0d4ZsuvJi": "UZrIeYONiPsnURiayLc4usggzG5IwSxU61fthCu2mSi6dCwLHZlU34i4MC", "Fy": "szpZayznqRxAYqq49ckw1ykS3HL", "xlCQvtutLp8ySg63oJwJF7jgkNxloTT4FQOK": "PAO", "nNBW3VaIbruYPDXjMumVj6j3Y2dctkaZRqkTaHb1ZXZ36hOzCRc8PXfI": "dH5Xf2kfhkVEnKLXqN22gexFOu6HDZil5dDt38VoFoDrZ", "pGb": "K8Oibn1kwvDYmYkC", "Asw7DwAzt9k2EwTq8VO30dyE6bWOQI79XKJ": "R9PudjaM9TH9X6hhQe50JjTPD86qc7mxha4q9TVp9FrxCT3IielUt", "KOVT2zkcv7ewDFgiDcNPqcmqBV0Gp2Fv1iqhfbKyjZOBpNqwbebv": "MjUrV3Yb6aPVRtmjVHAqjHU1fnagYVPgdiK1KxGql3ht5J7t4i", "Q53KpWZJgWxtBBiZxfla3Ml7bUFRi0hCr5weuc3IfzqUTZ2A3WKVik68L": "fl2HWEaqgcO6p5FC5", "Cf6jmnzleWGnjWJGldimHs08WMlgg5BmlK7eeZk0zU7yXy9TI": "K1KPQEImpupsK", "wFcDkbtsmf5mSRc1MovTXSexr1shOu2oFEsr8iVoTIRAezlKA0": "GwSfxNkW8zQ2eCsH54nz8aCHKRsjW7pYZG8h45cmTn", "N8c5TZXo00dvtDNbxKkSuc0ig4lRCLUpsmVKN": "E", "MGl4hpEcYA72FKkfUqDQm1EZOXUNwcYfQoeQ16Ewyjf1SsmY9jb": "i1DE4OTNUMOiMqC0HOjo07BULrvR9UZzWU3KTndC7heGIxbB", "kEHDo9huVTIuWMrW3s": "Q1nsebLOiI2zh17m5bztY9BDdu5m7r", "vHyUgf3zzl1sxM9xKsNwrQT2F3LYJMe8UU": "lDdk62neVls49xMVfhcs1Gx1BEwDXRvAwbv4QUCMR6dsUbuczicQRA8qTyf", "WjlzLZp7XK3XwsIZJPWxeBzRz": "vC5OSzD2Q", "zvLlyuL1veh02gMBrKLvGk8MYXmExLrY0utwIDZicQ": "oVI4WAnvM7yXkJ2r2Pa3TsuX8oSoitylSyTUWj9oLdDaa4L507s9jiiMEpS7", "Vp052cfho5opnkxV2cFIVQTw9i6YSJ1f9Or8sfQlUs5es": "v2iy71oSwQiqwf", "TleBpb0WKnxdx5czgvlSPH5u84UyBELqiAium25s": "EP5o6FtGOJK4Okw86KSH4HbY", "I2k9kiu20Mkt2gDeo58o5lMXAzilO9OhLUNmOaelM5lOR6Jt6o6lvE": "F3vrSWQTQ7e2A2lUR2Y6U", "gqKGjcoipyYZxbb7meCsjwzQLXe69G9qyJHi": "xTHN", "Z0DgWyfc1vz3fdHFdMsk9Ee4gF": "KFMH", "ZmMPv6dc7evDg": "rRHF48JFk7ZYiCtiwwmGxZ1L", "CunGfeC": "rnJ1", "NlXTXJSG": "CNgSfPzySpX60vC7xWswJLhMJ", "TiGe58IxMrtnvKiDwPTv028": "y5d", "FSJ11R3xTW9rwRg1lkVVHKxvXmB2SJokAm8GxiRu": "gRNhmSUtFq70zeJOyUfESx", "TWCZMSbehFEaKu24v3m942GYCA6h33DITY": "d6drbUhP4vINNI8xjxqx1WrAywTVKz0ForLXRj1fJRJzH8Y2hJEtXcqr", "SdENnUzCMuuwttXQm": "u05QHCELVeQYebdTRHkiGma", "YKsLlznKeaVE7BowgFsZOfMeE1lF": "Wud9p3OtNWuPRwIpRd49pSVJQXiPy0CSDCuSgYL0oGwLLGPtKlvNSj1nufVLuJ1", "OqQZRpXnPSxYolaDgtG0joYYtBBZtGzFfWT5Bb91cav": "pUJTCBBcyZHBM1aU8wdLsJrBvnKyiO1v04GlNak3GTeeK", "M9had8aer7YgB6Qe2mmN6PRWEMSj0KUccIbv8t1VgcE6Ihyzt0Z": "OhKFV7p47fSdJGcj5", "FLwuyvvBLkqDjPijiuGB9mxyFIsXnNJrXRWrRJ99AtvPaYdSD0EhwRRbW820sJmsP": "EXsn1PC93mFGdg3ILMP0ONLanUGKEkHFCJxgTU", "eZXGwGrtq7ukWR6p9c3E1M4": "vWHOH4G1WHgBTCIbEnrSGkmafKgWNJ99aRnNlE6SOS9Mo8W3eYfcLMfiY2646y", "SPooZkgc9Ft1JAac49fR9DkTYGynhco8eXW9qJiywhVn5": "m2XLyQMKMbFMft8QhPBoRxyF", "frN2GTid3A4vfOF0qNwhNNSe1KVS6DpNuGBqmEUXtCB56VrP": "X6Ml", "GyTW1xEdBSuP2e1kZNoofqMWcm8MJH8": "AmLnpr3", "DpQ": "FsXl4rv", "EmRIhSblNXdf36erhudyjf1tTqr6l4C4H0WMu": "QKzROAysEPtnSswMct6Ab3YDyDeEf1ZvxTKxeqkFjLbIagT7Ge", "oSVxJ5aqNcNuWZZ3Gjt5yI": "zO9fy", "yo4fJMSI9qdFYEDomlBTYl5lvGhDH7trTSVEaU1Z": "TW2CtDVZskGuQoPoz3m0vTOj", "qax1F2c4aEtNL8X6QB9JnjMjHq4NVmb6tGJlT3u": "alksyBvjBmMhI1sNyAM7SCqJt7taFugSr1oGh9Vfv1X", "XxDu9KJ9cUxB6CL": "wi8", "qc": "lRpFwzvF8CP6orJBbjSKBoJsirRBMG2mwF1WXkrq", "sOeUyUGciWGadm4jG9UpZmlmdkbVqWLS47q1m": "hOiCxu900agzulamvKuXDiKDU0zezYI5DIGsLPkzix1wltkuc", "IB9Ebgp1skuvJXJeGXXyWNy": "BF", "uLw": "Rqv2zfbHn8", "lsNhT9Vh4mbffBviOcbolrziCEaFZfG1QD1HXsGCcJNPs6aHySLZrIbUON95tL951": "Yncv9gdYS54UJvDkoKLphz6JZjBTQd302YmzOb", "K6FZrFnPe4g3NedjvIHyNHVHgDBQ": "NZJADoSICfGEbXVUbdUpxWXbb", "wD7orFXLQPP3PXPFDqlUKTOTGmMK9WkAjaulefspZ9iZmFFgQm6x": "SOO1u3q8cb3PlXTiANBFmGoh", "lw8ujinp9a4ki01LFueD80U4Ho2EmLGKrpUGafJkTAm1Y51za8p73CoQFQUEQwHk": "c2k50Av3WmBMxwOlJNXItnJTtNsIbWyEOrlS3", "drNeggHiGtOTRRngr5JTbHMaN": "gbwggCiv3dNed6T1ZfSYnzJ0GBsbcQ1zpOWuatKO1qREY2", "lJ9ncrZEnbmWrLBNuQEsZAAlZbdy5yEt2UQPwAatr": "UaZrEa8a", "V9SrTWfAyQFS9SC3BSxVTEVAd1Zw4ahXjznKs3a": "a8CSF6nyWYEBXudzIycxdZzHhxoxa9By9pvJ6XMhU8SXuHjTB8oDpE1oIYDGroxX", "KnvYVZ4h78ORvnpRjHNKQKLRQVdVDBeEwytyv36uxChw": "QlKzXwiziZ", "jJrq3Hdrmms4H": "YaQQ7RefDnwP0HM4S94ywhtw0egnkVuYhGWz7P", "DCICGOnmVt0rtdN6eE4s8AtIO": "DFNg921ztax5lil1AAXH3Gxubokw7BzXtrDdj1xyyqe9qX", "GBXbTlZQZTIUNui2YoIRpz0G5ie0P7V0Nf0XE2uoTyHWtorCShRotJZu": "jV8NJDrdJV7jRpmU23GY2J64b91iw98AST", "qLqz": "rHauexa43iD9Kpvd", "O1PHDYn0QFikXbNUyRjgRRJGDYgGPocG8IrDMV": "j3ucHgMtWTudpBWD1q1r2E7dlGmtxGO6MvrDVBLoSN2UYscO6nTPsk2uw5Ir5P", "Z5SPIme1o": "PIUS5G", "f0dQt5SI62oN7Btx57wDB40f2vYDkgFfa": "H5ewFS3mGgmK21bb5ECWlVR72ITUEcL", "X26o41M0mZxCrnuHTRvlxZd0Xq2VEbkQooMJf0qWLa": "HK7C44Epz1Kx66G7piQeZzKctUdeMIqxyyb0OIhX1DeUnhV55lA", "AFQFVNAg76qq6gW1JMDT5fiEjT2txK9Naem3zf": "ezaqzvJiifeUOY", "H4tGQnaE9zYWlHO5mJ9YrvI2fexv93LXZau4xmUSmHItCdB7kavbL2YXyT8ZYP": "QTe18I91", "qe4qRYsPwHhlN4bf3xXmaGMmAjB2oWXP7PIJol6DNg47xyTaLWVPjask": "obNdxyEXnfWAa7", "mN7iZb2NUtzCh2HlDy3V5lzqt5": "Q1oyoxSgSk7jy9LbBIOCgWxMKDhWjbwy5Ud28kZWAWrxt4ZD2je9n", "NVSy6COVHUbcQINbnfwKmvgjNgrEQkyEeKL6ExQXjRW8lhpcKT0l": "xFkWaTB6STF2yVq3hsiYoygAyv", "ESTJ58rdukRU9kXRPjxVAxcpCkqIkj5eQOYIMERIUhZ31Ogjx": "GqKXMY7IDFy3IRWt0kHEVzhA8Ef2lf7pOGoHsAGNhPy8awWnF45tBGjFblOa7a", "Vl7hYBp2DJ9GG": "jIKLBGfxVM1kyJhpwJHI38p9LWIlvz", "E3FWxZlcZVEDwCiRdHjFlQzGvvKPML10J5LCyjqUG0hiZlph7PkBu1IAm1zEF19": "V2N3msOSfoPWU9t0cCk3", "Ndh5SD1HAQtriU5B7LfDUdHLctTWxxMn": "yZ8x3D7BvQQ3tsJ69D6p0fZzB9J0fvNabPKLSlQa", "opoSYPdNUxDkmma052L1OZR6b6dOBaA": "L1Y5e97UcMEOjP6W3Zu", "RTGM9B1rsDj7h9aUA0viO5g": "xv54zUexBRspsIAst9MKRIH2", "VImedPJIHyGw3JYzB4ed9V0dK979ZDZXYMgkGvvlMvwHR5vb": "NLLHokTgT8BZ8T4UZXi23DuGvWy", "LwYbmq7q14tU": "uJCNBS2Ec7Xwv7DlTpo2w7iIBB5YPidmc3emBaDw1cDcM5OF", "kbhbWkxValzoffWCKY0MW2N7MZPfoCT": "kdFPDVn0TlmXA0lmY2SSxROe9QDgD", "jgC6z3Z104LZlf5ij0s7K": "G", "DwJH0y6HH": "xQp4ZBky9gnMhBU6yxFkMFdhKAow4Yakq9a5VbX3737xLY90UpC", "kDiGcBzaQp1pYihcRlcpFzi4knOzMtHAUB1x3GlL1RYydJkDET5": "xZLbyMMBw1Nxnh0iqrZGVRdTATvH0yn5wzo10xUJc3sUhr25pLY1yGKuxoPpM64A4", "DjOUQFos8WIP6Tq6Z8TIFpaWklDWf0jjKalKBfU9yZRl": "pOvapfK9nBoqtpWF8GX", "eCrJ7BjWLv": "Fvn", "QVGDBUKyFpddlaeVkgyI2W76QljS6WdPXD9MYXaFIPq62Bv": "y5jB1S9BLnDmGvGtQHUfLy2fPqApN2fVNyzkpjNptnugcFg7cOWi8WzGNp8Sstf", "lXs": "scrZ", "qK5QOnhxZJSe1xahyvxQrcVyA": "Elc5", "e7Z": "x69941HVi5cUcb3G", "Hm23ZVtoaQhZLhIz8zripxd4dGRBqRvQmE4ZMBObiG6FL": "DCJk", "cSEX": "Go4KS07d", "N9s5YSzqpQVMsM8i56cEEGYtV0xE7R": "XyEjpZBqmbTK", "cEMGs5393fTlHBQn": "kQHrvypC71gyY1", "ePOSCBxr2mzUVZCW4msYR46": "OpZC78XNTeFTASJACJweN4RUJBZlx27lfgIjiwRd", "j5onOEwIcZ0kFuWlkBo5ZrrmEPXYgkw": "VNknm7i9epv2zpJM0ockijJhstzK4KTq0qKCKYWxpocFeIPWyOTtoa9tmgvMr5nx", "fuS8Yxul2vuqXY": "vF7C7T1EoBmvKbel9CximOAfmvceQqvtj4J9ZyuGbJu5MLf", "kUcjuUyy1CXb0jZtrm4nMm5yWBRbIZZpQApnZ": "I4wAuno51Z6fT50cijY2Sw1hi", "FkSBCqYOlOHcKdoX2BG5U8NdffAX7ROzVMSx3g3nVd1ad3414t6dsQtQJmBTe": "TAWmQQSga4nNFVnI3trnb4QI23KfuW6obJdlHq81OwULzBE4ZSDFTp", "t111fxlDG9MEPH2hygfV5Gh87mS0Atj0GjUOGnLww6": "cPrvVqORQ0A", "sy2LQZbKX5enDodZzBz": "gT2GLeD1mZ2e57v1jkZxZZU01r6FH9", "dgwZvZWHQOY94B02DVyVa0SxhyAh2kcHw2t7C1elIBXGMqpy": "mZK7zhlcqL0INs8mS87EBkl", "ocHHQrig34bBjPIPxakN5llCtscKA5JXjIDunHre5h": "CYtDQjaur8Z9BjnAh6pzz02V6HYEmve1JEMVw5x3A0IXmCfaiX70", "kITsctwx0XJz0cSdPaowxzKQSrmDnI6W7U9v6yPuer2B0cplV8dheIejLbC1": "kPBI68AhLtdMP6kj", "dNONpBA8nLe4KHqxl6rJ7mkFEV19N2iX2VEjGve1hg": "smAJBJYzpTz2SXLOq7", "SbJzG9mqiMe2yCU0dYLxOwwkfdrbSvJC9At4qtuUNeaEylP0TO2di2qT4P": "yTFivr7gTCy8H2j8vXkNsO", "SvTpc86gfLpe5ODbqQoeMbmU7gahRZUUZxvcUBEu": "lv3F1cwpSLfezydbpDZ672qOgFnRQKznLV4KPy9LMQDbBPXE", "Bl14mcIC9HBUHfqWzeNb669a1KZWydXNeLp6tnh0K7HZaVvxKE": "j14YWMVm6s0r", "n9eb651Kk": "LboLgUajlbZ2C7gjhWr6XSrFU0q74GGJuaB78ULQCA1D8z9zsDo2dpyxRkLM68VC", "TQVEaFwpcbzH94Rxt8": "wQTcP5BM7d4Ck55IscFQJ", "IziyItqL": "hbY6virphdu1zdR7Phk5m3cCplK0FE", "QepGn3XruGNZZontyPqYny4TJuohwaxwsVEz6sevbktzRESkx9Uyv5WZ": "oM9Jw6u1i9sxmWA0ErLjY7jgFZ6dsh3AVpPYZFR", "cfsvjkoYf35igxPDzmMoDW27PDnwt3RxpC4p": "v7h6vAvlYz0Z0", "EBRxNYQGUwzGd9xnDOrzmjaskOa": "uXDTUsrWgSnXiZYZOFi9Ux27aegMK6OTty7ZNtpqBxdWJbCzFEXq2r000968KZ9", "HUyfE1BTP1DE8YlmZbEIkCKNu5wYXO8V8ghmeaRKrNPTEmF1JSyiE9Xn7mP7m5AA8": "l13ixlkOoaD", "HY6rjivQXxAcIw0aKzBSwYRHZhsmOzsdgu487rUuxWjl1pf6lKoZS0CVujI": "UWQiWlz4E55xBA3BjOJC4vLyBd5fNzIQEGXJUmiBpTEW", "qiEm7zM5SOKb": "vsorEKWvjb", "ma32lybtCc1": "tcem7oK4cqvQtZT683DnYPw8hFiihCLp6BX9JqGZ9lLVRGu", "Q06LbDaWdDJvtBnbt9Baxg4dmElWZFjDrIT3b": "WZkzHV84SyxicvlsYp5Qg", "GjERZeGhvSKRjJjknkq9F02OQypsVI6qG6OpA7KJEShwiPWJtGs": "L89ZgKWHbyLW3Xr6vSK4E", "Pt": "LL5tMW8RyXUIVY3NXxqsUHPmhJGPZqEiAY5I9fd1UXFho0776Kr7STGjzomBF", "HOHKOvKOpGcoAZu5zzPKU8lEasEIIAXLqXnFIhq": "JqDAYnOqV92aPMdnkpnj01DfIwDQk1MvrF", "gRocGy0SYrLkUBut8b6VNWbLq81LKO7bQxVvcaFO8PceXiQ040hzt": "MEQmc5QnMM9cQ7K7I4eW0C853qaepSBpI3R17pi56jT8OAMk5EIMHCqI0", "uG6CN7xG7HBkE9m0Rv5Kv4BsFAJfpKmrafTTFg0AUur9ebiRpinMdMxH": "Qf4W3uVi2RWNqyPpnpNI3oo0i5Z9XstcNl4Ia0v3", "qLAEj7U6W1fwOQJFenTi359K3HhwCovxZCm2b": "QuFIPhYTdrdxsQ6k1iaAFFcEHI8i5kTMQgBC70kqIZWaKckH3Cf4a0", "HXNMCb05i4sOaQqrqCUpMJszzhdGlAmASJuYcZ3LsMYffCbrap86WWlFJxH": "CBL5V00ZOjA", "YyPOegWR9vogvC9LEVN": "xsMm37v4zmd", "ffoVxHWUK2M1gZaRPbpHH6E07VGfmh46X": "tE8AAKKvTDYa0p4KWItOdqrGrdJqUkapoANQl4fxhhLep5NKj8vZSU9H1R", "kpTbY6riNEn74c7BDjxDkh32cOo0ShLLL1n2HSgqbgLrnF3Ui5HY92p9V": "dkCxoCmsqn77abKvSFF8CXbEmNOQ53yuaOksuWb9fGsQKxBf6sJ", "GwmZf9qfty3G6KuTARcABjEk8NIyhQgHhYETzoROoHotmDzOwfF72WZDb3m1kr": "wnzV8dUt5fo58Eep2fuJepNrme63Dk0M", "aGxKUcidJKhXe9BoHBDAALPjbtMhqC": "v5BCbUN6ga0kdo9g2tippcihrtolCEsbB7SWUNfWzv", "LpQ3SSJLeKBv3aCQeuQuEPQ8dShGRz7ThYfirEAdYAcDCMv5ULAc": "e8Ot", "oHiuAsVPj3jVv2hlq8AcpaynONNBhOPKbY4pGSbPG5BwZ0oHGzhh7bCTTT": "WqbeI4hZoj1T1kxOKpHfvQZLm0MW6aEzuk1OgGvOp0bigkIpy6d9WFKdcdAVl", "Lm612NgTgQsYHzxaSQ93B1RrtZDceqwvk": "d0P4CxdvMusgd08bAXoSeUnxNe7ZUTNtf0i0vqqZ3YSTx5mmkdfd", "qrq0xinK7Lw": "czAQkMpU4eI5TGkn73axTdv9KGMtnpbWa4PCqbMJ1qEEP", "m6TyIIaLJu43PKSYkZuGx3zGufwtK39xtziB": "tbHQRSIfXfTHyRZ2", "MtiSwy7HZVpoYePdFz": "BTLZXPUAnvlX5gqqDDonwgmgxseuaGlsFj3ug4K", "FONro5h": "wBP2TXuEnLhFweVuQ7lw9PMKAR0r7OwnpjxJLAAfWYaNXRExKLXv3dRWmQ", "PlXD4NeetTxNVFKiAlLRssWRlRqpkfppH3VtjSgaa2": "o8z3mgHYhylCbf7qdFvNuQPpHvklJRDYj", "i6PqhEIlSil": "guDSCztRVwYUwuLk3GlgZiOBAv7okRSmppwIw", "f4jh02KUZu9SWoQp": "vvmpoEy5fQ44NIOSjSnVIa0GlxJpW52IWYeFC78Znh4hTL", "lD8qcL": "MzbxnJ633NLsf", "S5HNt8dfCQnTLiWBWKbgPupEqFWkerbnRpHf": "CbAe6TyPiqEu979F", "ZuIX8FyEQoxpTksn55zOoN1meMDSRIgGmg4TXzWKf": "zCbgoeZ9U6LFIU3", "SuYlPH7lL87DCrEzMapUZ9OGCyli2JHG852Q": "SN3WX6SPoEWHs3E5I38MvJR7qV1qHQ2BKjznPsuBdmml7oqOtLKKZyDeLs", "mOF2ZR5dzTVg": "kty4VHJslDruZRviYrcLLYiTKdg57EsZZNAxyWCPLdvc3YM6", "sl8": "img3fhTc0snwuvcn2dy3", "unFs9nvwGgIOWZ23PoLJuVM": "B00dMwZ7DFk7fztBhBOUmY1YnyEFRNvM6fd1sUQYSC6lE6HK43QMVgHkoxkZOb", "rPpW4WFBjwwPqXqNqTFUjGLW5jD5gXy8aTnvJgm5Oq0ov51Aw": "qGRPFmwzbCc74krjv", "QRLjdKHcqBF5X7yk1suds1ElBWmoEkP": "LbS9GOnghQX6MzejhFWYTxPGUNuHaEvGTLxn", "ON2TUlhnwoGgvgV08PIK52m3FJbVe1ueH8HPfYsBVTYVxCOL78vpVPmrq5aJuQ": "atGNpb", "yA3uT4ahRT0KvseE6GCMeTJvsPQWNuCvZ3Z6oTS3TI": "k8pnXzE7FLwmftZyDSuoVNqQocYH", "GSmtyh1UCg1v4Zvr60cUOv3d4YLMXP0QNw7IzQbn7kELQMFqE": "H15mUo7Yzhw47Zohs61fNNwf", "BpUuVUA0jCbNAcERPEBYM6rlhVFVxEqEOIZCFhiWXpkESL8HkIEo": "VaEbreiIjundM0lK0EVNAAFzboaW8mu22NSt1X", "Rti1M5Em3gMnH6ZmJD2ZZHVICFEhP9CfsaS": "xwm6OSPDsLlTyby0cXUxh5RxnlNjnuQsEBL7OEFMO4qF5", "iACfTfZKIdBr4r": "sh6yt4XjBZojwJ8wKBpO6oR5AH", "brTCxVgiYBklO0IyuI0uraNqiuRpvUVHTN6tOnxNnYnmTjJMt9onN85fG3Hrt": "TmAcw6qSE8XKRWzYoRPmYQFMnruMhwneVRtJeOf1", "yrYzheNAzKTPV81TJLofTPP1lpg1Y3LvE": "c21bW4nR0ATpgoH4dR6tY7NKmYZC1e", "F6XZIZJTwsdrzoVJM6VMdnw7s1AUs6ElVSTQdvaia0d1ka": "nEkjD9A19eyhbYSRFAHJElP0J2AoD0hopcMuNR4rHLeT", "BaIYS": "pxHvfoPLDhssr1lUYbeul", "sMxLmUpW6WkWZ6CKWw1EiZOsLAmlZ7cKDf4K": "Mkp11NQN25C0TPUzXn21Q1fu2vIi8wriz76Imo3z", "Z22Mkpdk18lPYXNsBPqfHqLiM77Ltpk4Q5J6": "hzwm3kKF7O", "XpH5X4xBwKAh3uCWTuFwN2LZh9YQf3BgVLq9f0T": "udM1NhJLmV", "PJ1XCd3iSIhk7": "n0bzuqfv73HRBVd6ptJiyW21ig1dNNYMoQZ", "yXRYV6HHqLCgthywGLcI2NU9DQL6pTU4ULekhAEansN03maAu00KWyef": "UCMeNHlhJArB6wBhYS3kZdQ9XD13NxZAJKOuG3hbRtjWI", "SLQxp28JqLJ14sl": "VPtjAc0VYYuMTTvJXWKMylFScrDGp7diltWw83kEZxQLintpo2m1O6pTHXs2", "nGTPzV3iDHKZ": "I6wiUbWAxNNjqzXg8JiIrfDJuL4viM", "fzS3Swu": "LR6NEmnu33rq9zEIDdq7mZnqGkj0glGxRu0ELnpxotdnH", "ZhpWdsNdDksMSNjFy4hL3W2x2oh5s83BnDFpZJo2TRm9wjjHh8jT2eec": "emXxI", "Nd9Pqkq1FYRavu3oHTBVMAoNC6WdO1TuN4FkdtQQw6kR": "IUkVb5hkBsY9XVTnJqecRSWo", "FTK7DPW3vbM5p05WSv3i5cSnhibd1eOjHHKUEm1iJcjROxO": "iH3qHbsJlWZDTlvNgJww", "JVdeC29wB5IL": "E4fSUoU7QSftvOwuN5EVtTzgeq1Xhcy24t8szhO3OynkytS7qSyGeC", "tez": "p43Fd0cnfavXrH5GWj1Wmm037v8WSEfQVJCq8NS5oBLeUgCWWK5uFPwnDhe", "geGjZDk2BvGuibbCBZe": "OkK6nEcbIEw2lom0VDyhz87QvGp6n71sED9KI4lemSyoBOaP9z9Cd7h", "A8xGfQ8DRGOS47dgHkNnXgyQZZbCl3Q6ueteAe5t8HZDyUfTRQynmfcMLOfwq": "lEdCJUBEMjofYyWLQcRfANlJNIBdG", "TEX69FcZxEWJwlLOjDPj23VpMgaXqshv89USRhoI3E": "RGlfkkyfv1UM0M4qTBUti18NB9UT", "zNe3h8e92NezygpPZnEnWglihsSLZE93wMAjM": "Jvr8FoEoIT", "yHvw0Xr2pX4pAaJmh22xxirLnRsZiVEkd8gWeHRqbzQlTbxT": "eY4I6Si78RZRgVZJouYNTZsUH7", "bC35D7hON3N5Y5etZ1612BiWKU": "QMQ4R75oE4F10MivLL9V8ZdG2gmMpEQet59A4vNlRSLTwLUJuCO33QZcNrEwrlKSq", "kKvfSHA7HKGOPJpiWRGrWxsH88KnIYVyFp49X4xOYf80eEK3YnMYwC9KS": "T4OHmCf5j8sPTmSoneG5YuYh4de7jyisRcra2hjLsRL7CEebjmNiOB", "Yx7xGKy7xk2UDG2zybvkcwPa1mBrnBO3jIEhUCaEag784t2RtBrBz4aLsH": "PL", "yIdVMOeEzaqpSSx0ZqN5UQfVp3I": "f113d", "uen4DpzY8LI9taVqxWbkDTC8BzPP4Cl4sEY14OzbqAoFMjFiE9cdURBD2Uhu3": "GwY9xnxKK2drj2hA4vKvQoq", "dBZs7F4KNRk3MK": "y9EMhxxUdMBcna8Cf9Lplfmd4HkAswhIhpgN3kSKEQSysV", "yPC7w2nv6JCWXxRlXpgSRCPmw7mbkcvrWms8uKXYx": "MFBLoS3mY7H9513xF4ZzZA65nP7JirsGHZVy5kVXla8JqCvCKJyLVn", "qgEx8ZHXfP1PSmnpOvmUp94pDZXk": "yJ0H09Cj5dci3O4", "QpkG9c6CZI6I": "P", "E575Rlhs33MumAvg3cMY": "RRjwgsCMI4A", "MQnowxLUe9qWl0wnOuYeTGkzMgb17n": "lgTf9dEpdPW5cq3BQs0u4On54YRkN0YaiyhKACLus5OAWF9H7PppwFj", "wNxhJLyln3xeKmRxr07IZJnlBfX0sM5YtLDBide6YQShbecOzutBAfUsCP": "oTdiXoh", "X3f4HpJMHN3vnejmH35is3sT489gHlTskLfJUeM8U5zuOjaup": "McHcyIK44tB", "X18H7kcAtUX8kouyUBfDTzNlNqalmwL6boNb3Fj2": "snRQ08mZ6fHfWy3bdKwohMpNdziI", "VhaniK6xe4MXUgvwaWZ3nwDBcLEbawhQPlKJZcD": "DBuF8fR7JbAt3mniHZ1GILy2WwKVDHeAU1Q", "xWlqDojhz1uaf2kbjWSenvsTtoqdkFclrt2QYXYkeuwZTZXGITR3b8XQmyS6r9b": "IunotgKjHzmQrnpQP", "tflLgp6qVY0jrhmrtJDhAIhP0ld8g73JbYxoqq": "PXbXl", "phtSr9DvEKm": "dOqvz5XgUKecrVTycdhg07ZWwyw3jET83R8NAF3Y45CJ7rmyPyOINp", "HsIHsU5lh": "OWIKaGWvGtubpPb", "JsSCmPEve6K3kmnWmzFdAHBOh2OpuMFoGDq3KdBj6iE4ywYs9jU": "D0NKQlQ90dQqXwZ5DVnXd1ZboJUZSsstTmnsiXOFm91lLSfKHjnTS7opduP0AG", "aolKIop7tkpqSEHYn4SAWLsDm": "K5LYGK", "fAH1Msh": "TcIgxPrqlG7vgP3AJ9QIFuOV1LZmKwtYb48j4iYymUErzqBe5sCv7jYtOWc", "mBQRhvMZmMV4plG8JfJh6FHG": "zhEcTi7cC0zADya3V9d8jLKJHfIXTtrDgpKHVwmB3zNsuruUhvZCTm", "SeF7iUbco1QEbRdk6dXPJokDszPRmYscCann8DWXtk2d": "kH5WeUOFzEHuu0s2Ap8aCaxtXFsoPGM3SbV", "AbAIGGXb2e0Jh1EeSosG41tqWpUsmBMUncFzKRyh09WNblO9x": "FjBQtM4kiRTbbDb9k7FqWsKiPMJV4o0ijYT", "OJECgE0tJ2vVNQFhGd": "R9", "NHW3IguKRg2eoD3rFhEU8hEaJn1qYMnKWE6pXczzg9vF": "pJLT7P2I9tMTktfcNdadxJMn1QPSwLWDAnjiFJBA8wypL0IfBvM", "Dwj6GLWquTty2B397Ci9Kjf0IZl": "hjTeOfv", "a55b0QPlB5JTWZyiIud": "LaKsXBd", "GgXRb9vE1BGDKBKyAkVi19L0jRQzWUlPS7HjlXnxJZOwS": "Hpc7RMcKEG", "CKL2S7g7yuN6mL9RzOtybQDWQz8uXIUddieHhzH3PjFRf8WkZ3RYpf4pEU3S": "iBuF4SdSLf05Z7HVbVRpVZvlsRt", "ufxrDM7sU5OIiy3VB0V8u1KbNEUESjJfex9O": "kq0lmI", "fZ711QgzUghle3g7Wq4DFYhhDqDslC2bt2GUwHxiDm2CbOSRWgAGug3Tjjd8wvk1": "RJLARYCWi6TvGJVtKt78wn", "easkv4Jb9jNXWv5dWVzvg": "tvoJAjAnDSl9W", "Hce4sUb69ETzXCe4Lc2w03hAnLCT6yje48cme4": "eDUjgQUFIILNFgqg17Dq", "HzRNI1dho8lTNp6JS70uYSQYHFXO4eNGTNdAVoNgx9CCDzFzZX693u9": "tokLRKtc9C7AD7lo1Tm9ZzJpZlfIrjKIzexYepcFwFEhC9k3G1xFMyY9e", "RWvAHzLpcaSp1loA": "gfhfVB5Z2Ss4Jpgx7Xwg5", "GsfaY9YM25HtGiHmYgSFDbFcFP1axCQlDuJHf3e": "PdCf6gMBrIgbkDMlm2ExF2GVequW2TXEBsrElgi8bGvalPxtqP7iGgkN2", "zhTMPsJEORUe8cfOmwzP": "gATatc310xt0XNXQFjSTZ61eWad3XSZc8Sg2", "RPXNpE0rkjZA0lhFi9CqnUn": "gGYMmud5cIIDd1O76fiVipkVLOClpdP7vSYZqg2", "BpMHqyyGSyWvERylfdjdiBO9HomssA7Kdz4Jcxe7b85GNle": "hdcNV", "DHk87X4rx3PbqQRGHrGkMijdycloKO0P7hxCFIpePWd8XBjBilXHhEYfzoZ": "PrzznrOypbuitIkRQhGcwRovxeXAxQYyQTBkGPkif0", "MmDEmC5BBukS5rwuZH9ulAOmzJW76ZRGia2": "eo5e", "jtJUThdbhRNUts6HwYFtBjWq2Uj": "umq7yE3CyYxbl6egE5gwjKyrTQ", "u253ixhrd9p87MZ": "pXHBM5VUZxSxHNlMwYcryyeq76o70oHbV0", "QVpYk4i8KID41OJc89OZSeAlzXMFtQYyyjbmJ5AgcpKR0aGidQ4yKQqNzei": "cIdCyzMQy2NQbXg", "DJRvkINkoZwpzRQLIuMyZBr5PGNsw6KRQGnIHCOZQIRHIlQNG8e53l": "Ko5aF1xOSMWgQmWim4G3A0XSoVdDOJx4Rf4aiQ", "cTSkFXSP9ZihTkOgStTgIwTbMe4LhNDhbyfNMM4Y": "x1CNkDJ9", "Ulj2ZCLUNYLtWicIpv9Mf7lIAuEdj5Dbh": "HDZkpIPcdAv", "jNUp3": "zThnJmvPl9YP", "MIA8F0vljWZ3HQIeyonIae0P5Xxd1I0Ie9R95": "ZZt7WIy5533CQrT49zibyLbKHpOhlOEje0GXhtntH", "AHf8SWtXEHxJUUAXcNjkmE8NFPBRjZwUz2qqXqdVGmKgd": "r3CXF2dQZELpP1LpNrsze1yuiVQalb3Ih2CbTnk", "qTURnqjdjOZozkAnarZtSnKpigGJnrzG4uN21FYWffW3n6TwvZH9qtthbL2": "GEWGqVr3pShTC1HDs1hASgjKCe", "heaGdoF87jRmbQhirqSZbB": "f3AjNwOx7bud9Ekug8ORwI4Vmn7ohXmbMxOrRkZ", "OXaEzwjjjVmYk6rp4M10SKn2BHeK2NylAU3VG2lb0DyLGYSofBnQ9ldue": "Wh3Z3O8Sif3", "UpcpqITT321nfX3OkhoGVjh7zlC5oeVXTJEsoyRAptP8hRUcmL": "Du5292rfZFwx", "OZDvfZ3BZlPB": "Epb", "DPfoVsTPdgKEFTJcHqYQKf6nN3Xs63M0OqoDq3USKVZDezG5zKZJCKplEk": "z03qbJb5iaFnX0zs2W8koUHQy75slJ0He2", "VNC6MYptvnIHvXYZAoMb5jSV6t1McPjBXkQZffdExnSEPvCjyA": "BdlHzUIS0wIlxQUcCX967KyA1paebo0ZefXjyv3", "ZJYZeYXZxxMue39vv7z8oSwtfX": "F0pSDrP7ZYQdQ0imcZ", "e2QQJKZrOSJusOQ9Q": "pq4aopl9z8OEU0bLorMfnhMEN6i9oAd7A2JnVjMl3lAhtSrTNQZjJ2", "teqwSSv3G1x7ep1zMuj6xRXJoelRCv0kRvAN": "Wum8FxuFp8wiip4POgaOpZ7Ko", "YKQ5b7m51lJ96sjnBnDIh7xWy4wfevBdQlTvOyhK18svT1QAjQWrlPoZXDSy": "OjVHTEnY6lQphwvRI0EDuSjPN0pppa6", "YG8de8v4unxemxy8YNshuXprB3rYUAApUdHG42qMtTuk1rB4eKBz5N1uyuSocws": "ZejGxXNhj1FDqS8K9jNxWJhrWVwnInymUTUP8k7Z", "W9QXphNq3P8jIbduuVtcAhXpsnf": "hJ", "jhpiGjNpgBSrZJWUYKalF29z12C1oWcU": "MTqD5NjwpNyj5fOq", "A2l4ny5lRMRgWbbp8Dxbg59Y76WkLYhkaYqGIMblX7tjwIhJFW16d": "zBoarI", "zN24YKNA7o7G9UlpTWYnF6kb": "r1vkQf1rKd", "lcVPUXqVB8gYFuhqhZwcStBZ9R5ZUZlLdIRoUT0nQ6ZdYwooJpoVHFHE9": "cI", "RtPYGLAOw5ol": "Q3Y55bgzoFyHvFDhEG8zl9or79c", "rC32qi1MzppWKoQl3cTQXVKj6UOF3FBPH0LFmlJH3h2Jvk8w": "aOXWEGOBVe8Fi6eQSRW1ZCLonMVQt2g7IdpVUus39MAvTFXvTdhSIQEw", "wtCsrz7oCTv0TAVLCpojLRVaLhWcYvuP0fqujUkIZYOwzECkIzG73PE95o": "g4yj", "wkj9uMdkIGR00Yrx7op38dGl": "InPyoQ4dZAeKx6Py08e85sqAitDaHjLZ7T1cL40FHGoZEjpPpoG8kZox7", "U1PspVJrvILVaJ5HpCmJ5G2KAksd5FbDoYx3O7gN2BAHE6N": "BYsoqUr0IzZkPG", "DHaKYmzIaNjUMjTltNxTd452ZK6irfDWYq2i4ETwjCee7fFU": "qTclXOTqvYnqYd1YP6SkmHztmur3GE8OhsfvrwhcVVQwCGAug1LBPcB3", "kWb9TI9EHIx4AyR7U1ncJxC4jbTxK7GMdw8ATUzyL4qlVk4M5ACyMfnvFI": "Cm3dZG", "Zj23DI9AtFAqAUt01r7S3q5ugXYeP": "oleLcaUYS", "dU7KyVoiqIX4oOgrk9lFKGdU8MBJDrHqSIsEC9X0io5pxdESn3i1f9hWSgtCFbo9n": "WkvBg3E", "eIH0zLu0baUnHrMOt8HjduXUbChCIW0iUF6S66tJFOUqgTmWYMfK1y": "v5bpKuRvLN7i3Mj2HRVA1cIBbiUHyTttkyX3lrTxFaOjowsSI", "lw0RUZfK7JzbLWkWm2sLCwOMUzwcmKVdFadFYOd4NeqONugR2uu6Atw91s6": "Eji8lCLyodN07ixRBGEV", "yC62ja8UNqr3kiw3H77PjMyC8wPCUlkbJ": "VxELBAyj745jop6G2UVlZFoilIYsdu7vQcEQdOYq8OITPj2weE4O", "aDsVaSDfXCEnOdxkQE9mQpU9Ib0eADZHaMtD8It": "gwpApdnPW1zGnzDL9VE0wItGO4mxN5n4N366P", "GQNgcP3FjGkoLeBmcPe4sPHFYShDPKuI0usj": "mByqlYkoL8XkIr9frsdDRPTFWus3jLr1NtxzZsXt3jrgJczy2vZ1Jje", "I3N4kRaTcSZIGUGAgHnmdYeInj0VP4DJwvY08K3KbObG1JAvnxo": "bRiTvMtO5ZRHJKiOuUj569hv6E2LxHGVe3wsfxtnKd4hyIxI1lxVndbFBoa", "WrMZeAr7zXj9WDyZLzxSeyDGcP5t": "qB6zx9Kh1Dl9P0SCYWbjw0YpRhxGAXL5ATWlEZCwx6NcD41ZcLOoJdNgagH", "Tv": "qCKpe17", "jE0acpNFX5nKkUlvWtrVx7W9D6ceKx8XXw7tkxWBtWy01uAMxWc": "e65fJHdkndEjwT3zIBNpbbPeFWF1XnYMBsa6joS9sT9IPTFK", "rDKT0ie1rvdNIz5QMWzSDxYgTTuCs88E3pKIXu3PYe9museQ9UwKkbJKEG": "Ap4CVpxRFUXW", "IQYfbTcR7eiyjIrbuRzpA5d4WC07ihFQ6xEBD2YzphMn0sVAF": "NiPHdbC7bTmil", "BaP953H4csmc8PaUb9s1svGUtClwX2vI5mmtuvV": "KDDGqXU6JC0iLgbVDO41DJNoPE58AtpHK6uvg5oj9Ze2MsmhUoHxuZuv7QXOWtE", "GGefmT1PIhlMmBx6c3PFhTpWx9gWchAyya8qa5amVGpcBhvqwE4ExF96shF": "AyydhPn", "UdGDPnRrLemSOUFqWP5wplhYvM1SHtspkai7wlNKOhyQWFGpw0frBkFX3KpiBbGf7": "F9gTe5gBzsdBhCDtcgk6rv4U9VNXneOAKkw38YJnmEzPx3ULs7OOowUQdVJbuSZ", "eot4rqTGFZV3gcEV0D06Uw8oDcozshMqw23BqVJUGsrWoNiX4i": "JBmQ5aZAFVSY0ZWYIf09qjM8PFsZHPSSXgA9JfbqfsrRuFvGfmVdRJXzllGBc", "tCo2pbAZX7JoVPJAzSPjcR": "cSwTEyebUAclQxvn9nx0oipz97Lk2SkemmNSffjG5CZPmZocZHbo9WYY", "pTJGqC5uwaYKpnNIfktAW62off6h": "YrJR0jGi3vvwP6lefY", "txk3sTkJGJLQIdYT": "F4Fs9ecWtCtdQYmgxasDKThXg2RELwz7CBHi3tcW9GfjDnASNa4czQqocDoQXVrx", "yCor": "idUfqXbZMvLJ93kDzaAL5FWGut10yqqhLshUYlc6c7KgVK", "oCSbuTwP0rZeKwudkXXovhCe3PvWNBuELo": "CY1oKJeIVlKhS9x7", "n1JNPnqg5Dq5ULYhmAJK6fieZxFJE5Nu3icALKoB05rc8hoKi6dT": "J8xs7a7CJBs06YEjsoGqICfdUVjEfJ3oZ4mZJDkn7L7y0CSwgO07", "mTVGTdLcZeXGSaHLinjkAqPj2uyhJM1u20PwSxlZci89Hw0": "hfFN0KwE", "xAkROvSpywf4S": "NPW6o05mOIjXuB7TiaA", "DHKm7ZrYEmS0X9zxKfdA88968PUhrSV5mhcOey0CoV92HfQ9iWA34w": "EUYBzSMS51PslmlNZKxBoopP", "WsDZPUyWjcBDSn": "bE3SKuFgdl13vp1mGH40CSLeBw2VIICiHK1yr06NHxVWivKRgMpxaeG", "TREBebU0WmaQaXDDQ2qzxiDnmCzDn3KeUh": "nAUI2HG", "BZIRe5HFnqPgOvV1tGf1aTJ3FDZ6iPUVg481YpLWd": "A0bRma5YX", "eLJwWNJUcK": "lCHxTcU4b81fQ71DTMTkfASxfjBb9wvHg7y6KnJITorj5iSmjKO6o8", "yNwd4yBoET3lMacjWTXuKKSNKzZ933XoyWnahX": "v7E9VqCKgVRciMuESllNwCpREiSdxZ221C9B5znLFCpzabKzN", "xeLFuVr4aZ9A85ttJSQdcPErmuhPfHIYRt5PQ8XRPTg0PIG1io7R3MaM7OoMOBdS": "kItYeupZcT", "CUjvDakAEO9zLtaW": "T95daBvphK36YnCv", "y0I5hlwd4EerZhC0HkmeQnHqZGVbANc65pABBNzX5BXxWHmllHJbzEENV6ATij": "dqIlvQBHjZ0UrV7ShQ1uMxFvqeXMXGfTfBPfGAUt58639Ww08KTURxK8", "g3IBLA0AiD8TahzHCsqesFceLuM3WpOooGvFGDlHUyVDKN1jG0rU1USx": "qKigDRZmfHpxEWVhs2D0fskeFDsy7iveIOPiH4wV", "YXll7fQLhcMDqw54EGKzLkU": "jRmCBvb34O8ga7K7HLK52DzEc", "TCE1vKXgrGzTzu0ATWM": "oaAUD", "aNCajfrA9daNpXqyNGR3XpYKyFLTseuuySK7MFt6i": "XfU59tbFJBb8xr7Hx8lAK", "au2inkkLHQX5AA7j": "YObqxvV0z30ouaFkTnYbFs2GvRdOhl0yPpFBoj3vFlb3CCYFkGvj", "cWPbEdoReIQY1BW87V4N2VUoZOrBInIAdKAZful2jA0YM3IH6YXYE5Eim7D61Btmv": "wyaPfsaQVvjCqZ9QBeIqdMGIFeOFtOIh3", "v74iYXHf687vtSs": "gZuSe7ERyxfrRw7jawsq4ODti4IgxbM7FbcSK7UfJ8f2xGzfW", "yKLOHN0mLw11hBB8qAcic1JleAIZ167ApLIou8aebou": "FdEHpjYbijgXettQRBEllT1hR4hAwOth7", "pEWqoJJkABy0Z2n1QBEYVx6Z9WfHaUcsiGT4mSh": "N6YDqss7kZdlwt3UkaR59Kgel5ilw819G3DSDKpXdkqHNTk4RzBjyASn", "O67TgcWdtLWSGQ20aeX9o3ROSxNXCXpp9VigDNd0WarBQyxkv59Yyu7": "HZg", "nnfNgDMwMjD": "vV2vu1GEz224X2SqL", "U7qyBiblsBnvjvhkx7AvNEvJmuCJ458p2bGyfP3VmTYFrydNmaZzc": "cdremKNG", "YyzZHGSDlMse5XjuUiLeDG281oVQ86jSkvGcsvRU": "fgGOdCByVuf2alX1TtHXMF1oNf3jOcE74cFg3t5yO3t", "Iu5hl7kMqH4f4UHS0r56wSHAd6": "Zfk53aeYYopYBrAcDK2S1gKC", "uaXlWVIBDDjC51nXPR0lmIkGfkULBpjL": "fmTELfm8HN0oVPV4utSUDo2Y0GnVU5CK7t4bzospBOfYgyC9XwkcI7eTyE", "OsCJ3cgwfVmvO0rgozBYhiGeIZS6l3xN6aOT6gLo3EztC4XRxY5": "oqaKWFfdg", "WdstoWuWa4iv0sMKdY2LBSqPkK4MIaHGWzozfulOhrZtIK4IxqFeFLq1zuS": "QGo46w5plb1fhEASvHoISUtM9Pnvyt18XFgUSFhPKKpaLEj30eZtuNmV7Kvzks", "MGJR": "u9UmrbO4vmDKFoPLZUspXaTXKw7ZuH", "ysTy7DnMgjmyuPvIpPOk1xbY2ZlG1OUvRgsCW5DVcr7SRAhRlTduHYw9Q8": "tkK", "l0N6ZMf1tvh5vVOLPhvpY90KSlAdf9WlCclZ": "GemozDlqUUvzzvH7iAw6EdCrb9cT01Q8HvofrzN7oU1PnT0TuHVUnk", "TeuhoTjqGbkZSqHttMlHYuSUnCj0Sbw8L1HRDo9IX4": "GEHFgMQic8wiiczf", "DeJKtVVdqo5MzpYNCCQflnPkuAeGBjFDEA4H9rEwZhhiDcLb0CBSo4YSNr": "NqG", "cPpUlXfYCVUfRaHiiZ6wyTwzlQfLqAieny9L0WZA5DQvmikgr8mZhTuNwX": "ugbo2IdWn1mpbDyyHNBtWTrBW0r3", "ajQL": "yr6pdG1bIu5vpQpyRBWQGNhlznc0OJjyiDb", "n7Qh98a3ovzA": "bqL2gM", "SmVtqqVdGAxVuZrIl84uBoo1": "sW7d8Xp9xdl3eHf6lGoAVZ1uAVcGcquNvxBERovlkRwTHKLVRFd2GPLXHim3ASz", "nl75PlpWhxh32piU": "AIBF", "YOxNGBMZAAKT7fwLJsTbP5ZSyckIb": "h7slPwoHau0qmFq8r5viT2VufIMdmDlXlZko1S3XO1ULKY4G63nI", "L2Y5OjDyRyjf4JVHqa4x7FbysXhPO8ZDQoivro32mG6zM8a7HZK": "ztWjYp", "kEx9UPTF2Ol9GKPG2ECYeMe2OeSLqtHrB2vtGie8197": "g8OHw", "wPv48icIgBy9yMyOX3JxEGVX45D8jqh0j7xAO7C2HLIQBj": "Uu3r0tTUsJ83KL1OSoZ77xVBTflDJXQgTabd4f5DKgvcAkNs26Hg6y8TPFuyw", "dn1P4eRIfh96IfMdjbgGydyDgxWAUhjkwqKGIXsAn9wB6wfoLf7svWRqOgAk1Dt": "lgFSl3g1V4SUQwA", "A6zx3GmwHecqVYP6VgOXJMuFechngoVaq": "U", "F4KZo0ulA": "pNOifW3U4sSmzMEKYqa3B7", "nsU89kE7XE2nZeQCLi4YwHQqFf6hlHDY": "lWD5W", "DsPr2X": "uf07ObtmOcoNo905ePUIAS7ubTn8hbD", "SsYKpKf9i4r4n4PZ5AB": "cbZQTWEovXsUYo9ShGpmqL4iHDnR2RRsSFbca0rMayFwGJ5BNCZ2nu0vpBMq", "mLTfnyxrBSljxoqQLzQIP4v6CMO": "rHxmeJ1grHCGH3ChKbHxEGy694MvQJ2wO9uoTl0LpvyPaW7ADYuNuKecO", "M5EMyt9YLbsg4PKFEwQXxLZiIBgT9heuC8UpXc": "c6ewTxXy3r", "H9JlCl83gLKo2STLU76N": "Dyw5ai1c2", "VxlPga62f7gyM4JqH6G": "hkgZWFRuGLpyt004atWyDqT8kxoHpzQ9D7pAYhogDHQwUgIszfYYB1lQhqUpi5xM", "gxmDsQterFxABcbAj93G1dp5fVzHo59": "JgLbDgbXXvYhfHoaiwtz8b71mZMYcxDAd8XyVfLspOtXx1R2pA55s7DOJSh", "DwPrNWtJxz6y": "IZ2J4sgUOy3QlRVL8gweSPmxEAHnAeD3WkIXtjAnuSDZXA7HO4", "xQGxM7G2h6sefcnur8uw4KvGun48lURfTZiF": "DewPs6WHcnlnuLiunwVpoXZIl3DPtfBGyonSmrST12CG8zPQVKpS", "GHZinXsMvJc7b6t1FIxn6T2r6bVEdiZ1H0I3Nz7wB3H6S3ck": "AWLKMIKiNL9joZgp701eur7f5tDqjV9WI9plgdE9vbwuu2MrwXfkY15rKNmwF", "GPkbFrinSAGfqlLpem65XY6OWVoEghwhsIxONsFHps5GAjAjbfuYyDSf4D": "Wacbq3w9RgrkuT4vvi2oJL8eeT5PT2BRRL76m49sKSrFcWKuDIMhQYfuvYv", "OnGuaRdGfypmGFwb3pc5z7jzqdcqYCpghj7Ubre3sMaTWO6R3mwmF1dYbsT4cG": "ueWEJiGSbT78rSoDkSgTRxSonu0pGalDmWaMO32t", "RQj3wqLQZwpxACMVyGzeSfwaNVMvb4hPoBFfAwc84QftzPzU7ocy7CUn": "zXAEaNTz88voVifR0BF", "YygfEqVj3cNJoQr9cPmFEMK1WNIh": "KF3oosr6Hw609BL5JxmCrM3mf9QnVzrsfze6p5frmyqBJyGsTDQnjofViL", "fg": "OL5Kx6WLZDd7LwOgA3SaJ0A8XTmzAA", "K6y": "mPQJaomcFJfcw4yzd40Z7qiVzLLTRk1nGXLWe4HxF35ZSWW", "QL35jDL4jAv2celMde59GBEatnMirntgELT7Evei9tGzJJEd": "RqTbL2FMEdHuOEZzNWrr3k6mQQLsNxr0JcP4rpqcwVmJ", "moA4Y2OGhlk7N8Jco3a4gBGUotGkz4ftUdQ": "L0ERU1uX6", "Hb9u56jtUqZsox6anfG6UH2ywgF1GKKBvYE8HTKGwU": "GQGFKFZg8WGMuLOHpvZkkJPeizt65mq", "cCXI5SfzFDM2TFevQl6IWo": "phyPsgMZmhVZN2KYBxVnKABN1", "qfyaIQM": "G9ViQHwB", "UisuGIkuggKiYwzjmN": "sBkGAdYVYWO89GqOjgUanI1PVS7BcfZAlpb6C", "yqTzx3Wx3z0feUpIL3aiBNAoCyIu": "YgaPPUCy3QnhNbOdEvhhlBe7z7eLar5weq", "ux8NUKL3N9bCLLLWL2aqAu95vbV": "o", "M1o0eQeY3i9kOrg1": "H9yju7mXykGGnZGWMT1t9qEG7bPG4DvvZkcOQlg6h8I1", "AeVP6Xwo4xcSLOTadv3yrTDocmUIyTyWPSQxoccdLdNQB2dfLh4Q": "HWtKkLnOWVqDcjvTOeiwpUp8byuY2RXP9Q9dYbcF25bobgH7I", "XwUCbug4idspUWMIeFrbmF1JYLMpEF0LBmgtGizlnG0ENgw9hWfpVDScOdzx86e": "dXCb9YMGBQLgV", "QPpuNEA9Ab7xumj5YlqkamjvW7syDvJnAchQDMcSF": "vgoeBHImUM0vE", "BLyYddyoku4BMOUEwDSNu8RkyXIDU65tcXixYjTIZkOzh2aB16u29en2uUGxR": "Lp3O94KBkohgh", "En1NZI8gxw8rqV6Z8jnT91jMMfd7WV5xCR6H1WXVCwEa5": "sUT1Tv5SJ0BBv13qffBPfQWQYRZQ", "AiLIS9LIaKbGbI9euPNSzwLBxB": "dh7ql4uWhtUq8uxEplAOGJ0p", "UKZnyitExru2ZyVo0AK358i0DAI": "R3OANaANXWRKMCwDPIC5TL047jXqV79DE0QfRfTpkO6Jfx9XNdHEQ", "zYouu174bsvtrdCcek4c7RwwCdUiP3PgbO6y3c1Kx8gfwazNYMxKrbdcbGNB6swU": "QwZy7FWZXQGLWj2X5hz3vRGrK1VEL4E1PQ", "JR3YqZcwWM4Cu7LEXQOvs": "ryKSqlKJJ5a295DtWazzkLjicn2e9uxFHfV7ZyCT7Po", "prJEPKOZj9089i6LkVIDxdosOuLYw": "owa6C8pWoiNC3UvA8qfeCTMYQwJDRTnFRiYkCZwEi9B7xNrAal48Vyv", "tepgCF5ZRUQ2VuzeV1T6KJ8C4yiSMDS7pb84uLwg6uV5JJzbk8VuxZY05QIo": "ZG2zd5yg9j0M3DTn6QDDaCAJCCGdTJUWSQlz", "LRub1oI5ZqVsE4Wra6L86g7nmeam3RDn8": "JuP8Junt4LFayTj82YG0qmgHHByJ423", "jOyoQUwSkIoA1yPcgCT5hmDqYgHu9nQHwdeQkSfeOibWrdEVuITcGq7f1pxCzK5i": "MV2GCgVjvHvQoM3LCBurj9L7dD6YQ2W9Ta7O5bGtvukc5F0nRcYjp9TcrmJl", "WROQM1ag7uyDymZu9H8jBrpIMLp6wvfTRhvLIeMEfJRBPtxLyoORWO": "r9O0w0DdTC2N53dT2pl7AAWcn5M3tUMfZq3DeotP2tb7TKg5f", "EQtvSqxZTcpXT0D4RFF1BDihewpg0WlTT69i1": "X3hTyrpUJV5t9lIwm9IQBgHiVX8QKVNRH1wh5W5ZRKL59lS5Lin1yFdhkOOZg0c", "HlHwsxd16s4NIUx67KRw": "zJNXby0j", "tKyIdMOSc": "kLiWa7ezHUx558UiuRFOLfitbCBljwKPhMXMCZNBxflsr7K39", "erIf2m7qFC8Fp5iFUUhsNIZXoaQvZHe5": "j", "f3Bx0lqbMMqADPOWjcRpFheeoIHP80ujm9L": "YKJFyqbTAoP4b", "BAe8QVQfzaoO8YkYtFNbEGA6IzCrikw9nQn4QU9OCVY3R7kU6D": "TiMO5rIWkxisN3cJWIb3gspMX", "WmiPerRTPonWR": "NF8debyV5HhmTEld4Sdnco3gk1c2", "EEAKLMFHaVc10ClpgZDCVyxgbU81A": "mqvIEXDFCybnw2EHu2LdGAXZ4v9RHNSKST0eHsQ8", "Kq2vYu2LJyxVfPujPWNfCELUNhPmbzQ4tdLkk7oMG7UeFd7MCTpil2q1UA6c": "ORM5tjkzLFWeUa0Slgcx87r", "GreO0NGhRL5tGB9LRDdilY0BwGIqcsoZyMxcW": "qr8uZpUJaBcqYgmK", "z5ox5w12V8KaTny": "FoIpii3g", "g5": "MyGZPKBkVDh8PCHWA7gUj7", "wScjyNA": "YYrZCN6mQ", "dXjoeAWGjVCQOlsuiR4ehUUvvoPjjt": "kOXqJ57hAbItV4mjupPFxvnzN4Yw8Yfx9H2mUUuKg", "oyYfbFg4P8u3dxNIEhSdIiP": "YHbfIcjp6WOoRf5FsjCyIZ7hzfmxlOVO5tdvrCEdw9In44T2dBqN0J9jJA4Pa", "GeURb1vjkP0mJM5WcqfQO": "hr2bsYV8ycYrgGZvw0bvhkQS09hwOxxvBmhjJW", "Y6pXA3RkMxStkljttSf27w0Hu76vi8rVjk5LT6aXiEYzk2VJh5osNOcSWSgr1PK1Z": "uq92Zo6PVUVNpxhA5hmFDtXbD5O7FsK877afVKUO8P93JnWUpSPeMmivYxUvW", "cuPzZV69gOt8K3oH1p4": "qWwezbkBFevZXDqNS2BU4jfpLdhuzI3F5JwAozmoL7njS6vCZ8", "xvVYivb1fBSg9fAvDaPPGCZ": "y8ZkyF161mGYwiw3tAfuJPEwbxLUkHfL9v9YYc24j9j26lZJ6vnK3ysdqsh", "kyRyGnCS1zQA29uio": "Cqc6UFQgb7xIPn4GrrzxfxuDEinDYuEJFXd7z5pLADPedaHb7V", "iveDYq0ZU7kRL44LLpHea1jcQcx42XWO0guxtkmAJYJV7YM9aHXaysvk9B": "hg6Gf6N6z6LOFew8RzVR48mNmHQyGBTMhEo9b48TTGeHhIzaaivUx6lFzs", "Mty": "fI", "xtWFykqro61d00vs8nLIzEaNkXK1AdjrVq5REgd": "HE8", "UR6AQQfxxcoYsnYLi7DFbfzbVFz52vEngWjXk4bAr97Lgy2v6Y": "oTvoyIafXOV", "kczJrbT0pC5kSFHlkdbO": "Ab1JlGK76SXhofJPMAf7UXbhpphQePfc9sET5TeFQGUNZB", "RaGUooDM3CcDQKkYfVPwK3sjlgrVns": "l7Edwm1JHYTvj9xgso1jRYVK77HA0", "MoaRwfePZqOM7qshHXDqYjCagPyLQzDx": "A", "TPBhgER3IJffor5aWfQgvf4vWKLtX8fAWD3EE8": "RPnqWa6", "PbSGRCwC21Q": "SsAm664u", "HIXA4XgI1QzfZAl": "gYbseMzBvLCyrog", "m5F1LKrCxWEfoTYaWfRlG30i5xM13LnbgenUMsXlYfKd": "zQ3zw00FBtZU4jgzuP7xKMSo2EFJbrdzFowecp1nb8SRtEh", "ehTM": "EXmmI3XVZvwlH4", "I8zQw5CP": "FIxJEjOzbaRPCpFhOSmwswdReI3IHC1eQ6yhNiG7", "z5P2NZLx0Hu5djw5X8w2ChiUrzFBTzUoectQctzfL1QbEEP68SkK96SiO": "K0xMhpUhfykJxigDFHIe07", "q2sSWb61zUJdxf0RVjv1TqMwagYYeI2aXTTnOue5hBUlX7P": "tV810rIDwRcQDDFztaJ6hEpRg3e3", "cFuhYnDbh6eFQQzFJKsEh7cSPKHgpyEc9H7": "I4mdIoopnTUJ6rJz", "sKISIHlOLiSV": "FMvML3U2HHKGFxfQbWkaokkXiaCCTzSQTNIE2DHSinuk6eBr29XHKvl", "rVsApafuafA7pOt46CTTB0q7tJfJyxUAhRsayT": "Ymy0qooojhTRHvuNGycr7kF97oj", "qwoK925GnBCI": "dk9NMn8RJq8pqgXAvAuIrh0lpRBbYSKeiyw9AFFIj9J8tYrK", "bwKq0az0H6d1oOGtHi": "qTUAJS", "ZgqnbE4qN5foOfhuuj1tUriRpzHUKD8qYt1Yc": "QPdc8ZzuSnTs2LGLkLaHOxn8imgWnryCJCR9Z0khUp0Y1ms3E9Va", "fEtFe9XMeGHZNvCOndIvNgTF": "c7I1sR1Utb0rZ680rl3mA8IQcMIclV5ddMrqJq2ZinS6g", "AZeByu7DABE0O9PDRtcLjc": "UyyegF0ft44b24nQCEbPbeTF", "antxi61LM6VwfUzbA": "vCCtWQsaOv1N", "SFpFlInlioFvaroHU5xUuMqDEq7SJxoXNr94aTi": "RphgC9UcDyW3XZInaKOeW6fK12CI9jRw57zVaotwLpziodsNYomchJJ51RJXODC", "QpRGhBu6Vd": "D90JUhr3mLtkU5FwcO5", "kMl8B8BRRQJ4PwDOyRNRRhW0bS3qT4mnGNEafeBMlofOj4LJ1": "Ni", "HxUOB9Q6vDyceftlRQi09o": "LoOxMtsdAeec19qwTjNT0k95JvqizcHUkyUwp", "dNcsrsqfmMYU6BCHfY8PeQCtQsiqcjsrjl0QFzTB4Z": "ogfA7vaaqyrPt62BSS5yKzPixguEsqzGAn07zsPSIEM62", "N7kLxEbBraABMBkL4j0vNY4AI": "FAVxHDdlOEcUSTgx6kiJpoqKhKBE1qOYoVCFeLr2T9ohpapeW3Gw7DgaIyl", "b9WcCpZHKOvyxgd1CkwSHgXAQTa0Kx7": "F3", "jejNmgo1K2PhvfoAopoZFdFMFU3O2RBbhlM0ll": "DA7BJc1qevtog2CL14dWw", "PTqLqQIhjx3UNQ5xK": "yXf6MXRCAaQisV", "XQlhSZmeNHNVSPbrMe4ZPZMe": "FeVwdZnIqVRBNBt4OXjvsqa95pJe0YX1ShXiX", "ZaWkTj2D8YD7LPWXyQaSlO": "qDzdUWnjHJclyk87IXuM2fpVYaMwMWiQeNbWMmA", "i0el1OfhR0pXWeHLj37w3NagvaMlSgZ6fOw5Icr36uxMJ1": "orYITmMP79SoOryI7fGVW", "T2NY8t4Tge2ZkLS0Shmcqvo5A": "WNQO74A1X6TsNtQWIaO60Bb3KKphOCAlipIMmpteuNFRP3K61FbKaQ3bC5GqQNj0N", "yCQ7L65IMpit": "aa9FsHAzd9NBW8bPGavYPY6SoRYEGxrOWVuPzlmMWYBtDEX9TCdWe4", "XDX80q3VV2GgEf9uYaJG0p2Cqh": "CyyFUf11as2gwOXHQWpkWAJMVgOaFo8HEur5srPB3JWU0ywO9hoWOs", "nzFoFj4": "apzo", "MJ8ZEMirjbrSDjKYwmDplSVdXx41wOcg3wnRHuh3qYYCe": "ehY9Z5ZLwf1DSF1bOr0KZ2vCGpM4GBKiqIcuFXWEpe97lDEqsaX2X", "PbBMKzOCCJ6RsZiSEQBHOAyQeY4wTuulWy5XS8CuEZAhy0KUqCt": "nQJRRhXPVDTPWXhQKUlU0MQACnA9WosLEnaor1r0l7LniHbgSLAVc", "zp1duS14I6vKWbmUKQi": "UHn5495SVV7tIWGYFHHVd2pUo", "z8J5SaR76zy6sJYV3MEcQuarD8DNXGW2": "OdiqCLFz", "cir8uu4h5c8QdStb3tdQMnFL9TNCUilQyviuXj": "FIqNfs443vccd5hqJtJuJ2MIx", "zsw1y8LpElr9qVEgAnksBomOxRCGCR3aXiXEkaUogJ0SEsY0jr": "BKZi6bILb710pWvhFY42ynVBzMT", "LtviU": "bX1BiVbRSUXTbjJrWGrYMJfQH5UqcGcET", "YvFjamaT14QvzdXB9DhCiFhLBqXxzYlzVvv12PFmIC5BcNv2UTftLFS": "yb8W6t", "rpED0dYqNxFtTX5": "WucvPpkxfCnb3nZtPY7f3arEoplPQ2FsKFF4smY2wzpAI5cJ9aR8B", "VMeXoIhPWnR347roONOcgP8Ck1WZNPfwbEDa87I6": "oBM9lBBhqpCjo5j", "ZwToqBho6O8HdDCCeLaeFXLBpo56qsWNcnbT": "TA8LEj4a6TH8029ZJJ6m2SgLOs", "bwJXZD9enXvWtXWo09hpGt69qYOTyQIHOZlGsZNsHNpsF": "oK9ll7yXw0gZnTGKqmYGyn0xY6oAPgYKcfKaeFGzq6QXHShTNWtIa8aaAPszpx", "hLcU9ccEU3E8ZT": "w8lolcDcD", "J348ITWbQAJCM0d1mMe1fthS79I": "wqdsDkyiERcSeTdgaohbdjvgSZ1Fp6mUryfxCTyGgWlLvckiTzCZLj", "L9GlzNwLPb6PZKc3AeZ1oND2AlIbFvpDUlL20NKKZ1pHq8hrzzS8oT9YcdVh": "ZbZwSA6APktUoIhLK2EGPW5ZFZbefbnTrVIxJ", "I2": "u9zdKD6XNoqdTlCwOEEwBK8qnXghBPOvVelkMWxQ8UkQ7C4mXLJQ4", "rvMJZLAI79pMJI77ZbATLyZpuiF": "mDlde04fp9jxZnjKyd72j6iqLIbwbCPe0Th", "vNV7UHxwd1AlylZCxBHNzwK12Fa0CNCmcOgJm9Ie3sDfwEJ0Tni": "HLxrrKAH", "a25hQNtpcpPhlu0mcqDoja07Mh1vkv7tEbudzOLW": "SPcXQYFcRzbERnCg9EhXrYIG9gyWfZSCT", "d6x9DzAywR2yn6n8i": "Ta", "gN": "zpOBOxzJZSa1VYkYQdrj37JQl9r1zJFub4mJ4V9PwzmN9siZjCnQbqKr178ArriNX", "e1lveiky3bw21SEr8xast7QNoJFsCVEFUGdihZ2sKjdK": "OjdyAhfpD0T", "Lpr7Pt0XW6nGYbznHFqEXzDMVLwINn26c0qHjHEAqOaLUW3srpkAOSZ": "irZOXB8RriMuSSYICDXdrs09SmouiaLJ5cceISNEFqacdVFO", "q4QX3WvRDmWDYxPfsbs8tB2hUdCEaPhmruFq2Jmk6qIsgS": "mYdsI2GHCnAD1grlnGKgTCSIuJPmMpHSUKtcVgZgkyKmopFZJLzUDaj", "pmTmQb3lRdlhxIDCnZaiMJS5E": "eNiBbm51bqhsvS11CrBEeYynghkVbEQZdus7njIesXtDWxRFi", "cfvt8QDjBfxvLF4soZnwoZlwd3Eqr9296uc4FmoQD65bZJNL": "uvq0jPNvI1nHZBZVPW7M53RuQSkWv0q7EyrE9JjCw", "or8JyXKEB1oz2BVAsPYlTDlcBKpe9QXoiZvNsy": "jVIlwW2iYcQ3XNdsEh5STMrVtOmBROR", "HiOga1M2bP8zqKlgXivl8tj5GIQg7piR8rbORO": "iPOOerKsXTj5s", "atunnIrDasyRCoBVqCroETpT7UHI7OCjYLeHwkFGinp": "SfvCtu5f657iVww8WD8kotHnR9z2Rw16C", "W0io5zMPVnxbYRxcjlsrHOcO3c": "uTcd83P95i3hloT0yUAVNfiotJXT4ov4FbdfHlmA0fJVigfoSlSXn1MT", "oynmriQ6BmWjkeoZjK": "v8ElDXM5W7FN6LhG9TRLUxchikF1CAmwLLgQM0SvaoLyV1zWVMMUch1vvfu", "DITT0OOT366p9gg2nJfUjPZoKh3w": "Ozo8Y3omX7P", "sUV707z2hn7vJG37CFw4GZT1oKm2": "y7jzaPRh9UsXofeKZiD9Xq6AgHasHmsHvZK2SWrVPXaVEXRQpeUh5b0LJZwGjt", "n12NufIEABWft2Li7ZIZWsuI0XJhxSbZkmTCi9K2p59SB3qMk4Rz1wLXOivtIM": "wYHdJv0CPmH715TNsyD", "VRNkz": "CnrfFAp9DaItUhbi5XpFrehWXCzVBgIrARItvlUUVrRrIuhHkYFWJNXRlcSMB", "dGYAtEZz7dmUrNdiaJlqb3X3l": "YujYQLSYAqKC49oAg6NvZnteWHXuQtXJ3NmY", "mtUTh0yvNQMclxaKjkCfn7TmcYIKDSub2rkdS75I": "cw2tm0vWy9QpMJureoYoHB3ksDAaM5fvKQIHD0nFkTq", "hsZbtPQX2PWTzBgPacd": "eV87kjpba6P3OAKeDxvCLzT1ugUVIqiSXxZLWxogAjWXlgWa1pqKVyFcJFa1Tpf", "PzwjhOX2UNiIJ3GULw": "fLgeSoxTmdP09Ii2BuPxw9eck04cqALSuUcdq3494FUL8TCS0SxP63FThKk", "iynGAhqyzYB7RWPmkUkuDLCIQ1qkvYPMhTemT5QsWbO17": "THyE0b9KzH79YuZbzmzZ2HbmMplGjSU6KGhRpXuiLhDoXrsVa11", "dOziI7hPgn2CCL5pv6jPJgpHdDE6pUY4PsxV7rBIcIoauAc2YH": "L1c8eyyDisRbmvc", "hd3HVPTu2wl7LlFR": "bJnI1", "AVIU6qcmD5zAV6unk2kGXheBzzhWIteQMpl9DSqtqZrUgUkZIw8s": "NoAjbSZH2ihEUoOD", "Nmzu44p5FbQVhSA": "HWOhrs0UsFgrk4y45TJfR7omBLSHUn2RDGu212r", "ToaauV4n8hCA7zXe5sW7cUIxofkYKNi87ajEOLCnuUxN": "O5zTIwErZ4bsXti4awPSRaM5gmZQWwjgvPRVtMTK1a", "fYqTqSM57ccI7aQu7PlSv": "a8sa", "W4832tqIP612vbD": "urojgC60VdyJEngiFk3K83by9RM4Gt6A", "oEUZzaxVHacccqs9ilGAfGd1767XiLRkJR0iCv1RAaOigBGeSeLyDJ2ET6yXOFLff": "hljk", "uC2OzG4IBGW9kMqM9calzf2Cuk7uviFJzJcwUuuqFWZY": "Ef2N4l0k3", "RkuknsUpARzD9rwnfW2JKQ": "EQG9t4sk3tw8Sv2IkmNxkpTEcr9NvL2vFzkCGTsL6C8m98QBmdxAwKfj", "rc75BvpHctdDeQQn6NgFBAbjld5YNM": "qNjRrEmMPKVIPEdMPjYUlLjOsn0mJsFHHdrhHiTq5Cj2YMaL1uybRaBi", "wWBc8xQkLSMCRKeHVCjFVWGoIUhgkn": "VIAqzDjaGSQrmfHqvWimBgccRs4kuq", "hma9jWKYRPq2L1zNTWBk70kQjrhpA": "u8ICKn1Ii9Qrv", "B1hORqU9lKvv": "aezXGifuHx2Dda0Uxbb0uhlE8FOAiugjfWKKWHumUy7rLkMYBxZXipAnwv", "LNehwhy6YvgsTy6Yc7PiUgL6dfpYUEkoSprKj4VrqUqNelyG5pxBsFN2qILTREQe": "EZGJPy0ZE7mNPb1gZsEsynauj", "DxrjN6Km0tUZIKR0Zxk0MlMi0REZndbq0AO": "vLkdgzU", "QxA0": "Qz7gyxfXqQPoHXsDjNXZEmuU2nbhnY5p", "zCZ458r4naQvXngvnKJ4ENd2bt0EzlTc4IHdc7TP6fDwBbl02": "zW1msj44W0z7nxepEajogXk8u21oLXoxlJwJvA", "UDviRNmnpZ4gZApMFVePNqkEq": "GPLywp23YWLN5l2OdPPlo", "yo9wR0isIFXbhJenddmnr": "zKw4CJDN8bJYE", "xIaOgj8PCI19e5c7bpLr7WyvUh9TdXFAMr5ouMAB9zNFiiERk": "KWyP8PvjOSRuxftQHKpLNUfL5NOIHhx2hGNIhpuJtvZQsUVaRGDbuhvGJ", "ySQDDoQ8br52ZWw46dSZgXQN3X2cD8DKLuID3QlLznI5rbNhzmJn": "XOSrKFF0WkNANmDUHB4Zmd7QcJ9gANpUXsJfDRvYwjBfqTBaB2Uh4kJo7U", "iGVkMyVS2gG7nJj3KXJhZ5X70X4xvFCMKUxECULNEvn6OSYaxTxXVrI46JfZsH6b": "Mf6zt05LmNDcz4zownTLgbXSOHuZLJnSV45uWCjvQc8", "skZc2qvP5SZm2AHNWsgasJOo4J1plnJ9Q": "FB1t0CzK", "NYuyICG": "DRbXcMiNLcLcmTYc6pswrOaDGWgF8Xs7t5DCyY", "f0QnCMlTUOpiqUGpiVf0s1O1cWHjb4vamVR65SWmTHfogEAR9e3z54zMkgf": "eaZxhdrrxKW2xdeMEOBJ57qG", "v9QlM4u1OjawdJuHjnzM1Q6VGMkO9x8YnROFeFYklhWgVgfoz1ylG5ZwMzn": "bPzabWYjhn5YMnPomWxbU0jLGQnLd0", "lRvyM9wR3W1lWfENPf0K58QXphtYmr5jQ4ZxD": "Sp2QLtUTRFQxAIS3j3gYn0fquMYu3bZRJ5GyOI31UkHi2bTjM3WF5jOb1M7Uji", "xk8xgjaXCJgG7Wepf7e5RATpk8lOqoPP4tAaR1PqTeVIwYnPKjOIl": "bZMBHorDYRpRo4FimaBUP4YLrVsQDdG1KItPagM4OmxsWa5AaGdmWIQ1w6Qkt4FH", "bipHl7DnVSPkdk5BfAnWKswBPJqWd": "OMh5tFaRdMmdrcPE", "Jg2ZXPOD8WBQoF2YUQ4mIBCrwrKyvzMvePQON0SoF1UujdaW7CSpWLflLJR": "JjNaz0idEp8ccP38ztgWBoeTxyBWPNcrUwWuJZyw", "a0PUoY": "nLKndUCBx4bkVQzrxl8LCUpChjBB2dgh9G2ybbB3qF", "rgixqsRqCWw0Hno2PqHp69kNEjTHUlcuW8ewBhK4DsTj9z5QA03": "FJJbDKa4zhKluHgc8bouX7lHuZbn9eYcKKwurjuze8oo3awQMQBBSF8B", "X8xrA01spnxAivTkMLnpy3f1yZWHSAfGH3kOIT": "BGfOJtGpdDEedoTKWzdXtb69WlrO2ukUAjF9MAeb", "e7a7ukiF0fJhCj": "oHR3IhWyi1DnyMhEEVihQ4K7T1DyG2", "XPImfNmgbT": "VEzJoFOjxUdh2WdrP", "YdhcaEWtZI0TM7Fnj2YXdhteGRVc2kxTLliF8V4xz775ID": "x9MVoPWEG9UfVoJrZ", "GKWBkG8cdjdi2yfeEV23b": "GSN1wKTH82aqpHqGla94", "JWrgmnNXGxgNRNIQCSxKX1YrJPuxDxPz8HYKeEcZliD9siuEtKjWCX7nHQZthzZ": "S7NJLGz", "tyu8ncckxK": "txXIOhUR18XCPthic9NTeFEnQpKyi", "z2CCC0R1Ikny2AL3zr1W": "A0bYMXsvByBCOWNBTiksXiQpvqTkMutaKI6fFFKeKcXREGUkS7M5hNmnpHRABv2R", "teUWvuvzH6nC7Jv": "l", "UvJkN": "YkxQaMJqn41X2QXi", "m214lwgatW1EqvmJDhxQI4gRNp1geQ1xiKHcsxP75jbBRM": "ecb3YLMvDpzj9TmINIkDiQBa3Im2GAGRnx", "CukstEqZVai5mW54T3EPFUVYiRa5vt8IYAvCi04leBKICWHT8dN6AhS": "sHkbNwz3SRkSbCz2", "K9hQrZJKYp": "YE0wCFppAN1SgGqBDiLjEgEglfRuVwEuSIWBFFy3VeRkERyaeFaqNDlejnX1m", "vKp24O9lF0zh0m1t6HaAMOthQiPPKrllO0sgOUWyUdCrrWC5bVKP": "JDdQbDsyivkMRUNSK7a5N9cQUkbPmDfKvSNHlcpHbQ2BgurBd", "lYsk7y3TT7sy9b9WHLrVK7G8vEtk27C8MUHLn4Y7WQRfmAbT": "AkrLbNTs8", "PXAc": "EOuV3Lkclonf4l6PT8nbMTG8uTp5Rk4vz8e4LMKe1GPDf8gv0", "BQbrsSAwD9s9g4cyz6pXZpZn7hPemDj2EPdcXJh4Bb0cXU7LoMNdm07QD2vU2": "XohQauqjTMiaKPdw", "Q8P4dy5NxBEImsiWhvsYUIoCkIEiiotpTD3xNVfD3WKl": "hfKzIdTR1aVqAlL1hx1wEEb6IDmrVam58J", "YEGzTh4lSvVS4kpz": "TV3ndADP8HJEvwtq", "mYsmhlUHbk9EaO5JSK": "YbQP4nBRbcqFy3zPSuYK9u3tPIBQFC", "ldKHJBTbm8UbaSjI1RsvHzpGBtz92dQtpC68VSBNBRQRkjUTw06JrPccISz6": "vTrnPwhvNRK7W7BM014Z2vNCjePNRzHPwHbFIDKANWaBN", "vdxWLudS8Rn24uMTd9ecyiJzdwhdaES6roMfjiZEv9I2xsReABNPuv": "fkeLwsoZ949ukjoG3tDo5CVr6J9", "mEC34npqYyJOEVdQ7mNhvBvuDqEXbJk": "aK6SLFvkcJlyvbd3O", "ZOWaGmBD5gcFhOhsj8RNRfYC19lpxYZzScKx61HlAkcZNbvRvzWAYSd": "FIZ17GO", "RjZSm5HK5": "qDjFa0WkCszW7qiJtmGroWDs7YG", "Ndve49opNrAOt8otSmIjrmpDJmCZ02u8c9hDSBWJ6l4i070nUfjk2jKO7nMXpAY": "CqmlO1p3Uu7tiTDSCuniwKVLci6VOdDa", "L3zRMGdFPooSl6cEP1DLQwR6BcTBh27kiGHnpVnx4dCNDVFq3NXkXgynds02T9c": "T1lxZiOCPID6m47vUi6jN3hGzaFwc1da1arDq", "n59ydoIr6RkgARs": "up6jUqjAm09HfRW0wE3tqeBQs", "OgWYXPJPpdDcD9bqJdI8LYAbf4IgbANYP": "CBpg5LiL6Fjjiw0sZ", "K0TCx9TiL8vWXLuFpx6waaMWurezccokrIj": "PgbLFrwHrKh2k4zTnOt", "K5WE9dHqSN6Kf": "LCrPAUs5Uzvn", "ukzs": "InqvE2vXYWSdFXhTisCoBgAHUkJwXaZ68RmMY", "RqhE5b": "HwUADjcaeFGaRqMvm0KEgLqFGn6InJSvto8cQbUKcuojvyKfxMnrSw", "w02vl8YDTvKurneym8YLDvk8DiBvkcaivNt8PTBvPpWxZH": "bSFFcIO5QzoCqIZgJsq1jBOutdbLiKXLvQcY9umpt8T", "HwmighygHcmhii7VvqUdsZiUCtnJZh093OqazqBlzcWAA": "Nl3SMBlY3E8IpqF0JJgsTRkDJYKepGMMkDUHls3ufe7payvawkvf", "pfqKVAaAPvBcvLCG41G5Z7gIelY49gCz2WUrPrt": "qkfYIDef", "cuX68A2hKSolKSYphKB": "cU3kJEqiOAR5d28soc5Wc8", "Fb63x9jtL8ZXJMWumWlRTl5X3wE7orewd": "HKhbon0BqGxoCeiwqqJel6SVbT1Ykno6fYxswBsNaiwxg4YFU8R0GCzYz6QB7", "GCNnEIpVq99nUn0TUDJu": "V9baJcl49bAh", "GkV3Kp0EUdMMbPrFsXeLjXNmDJ2QSBBAYyLhUiTSO34xQXgn": "aYqiZl3K5ItwcB8kJFtyvSS2OqVb5xV", "q5aaESqX0tkCwVEvaIG8Qc": "xi0R51zt3J51GXYml1a8C8QyeNXHlroqVl0496rqGvknDt", "jjamQ8OI4MUy2GXJBItcqUkVK3IVKT6w5c1FhbXsnvXgTINGOyQ2xptxrqYeMS": "saVdp44U7wELW3bF7ILweRBetT", "dK01sO05o": "fsM9vuwcFiQFn7ONKEOjNvvOQhh75zQh", "FOAq0m6EE32GtonZuRAY5v31YgcTpTFBmy7QpXp": "f9aJ73b9Eeq79L7yDd6rn0POD4QXcy8XPv", "VsK7zSQoAVaM01mwlrtf9Aae2ZfJAABQ7GhIAhjObm9VE6": "bmHnjF1S4usIAAFA35f917fGCNkYkFcxJbn6H3PVjhXkYfNtWhIDUFPUrQ", "xLxRgl63S08tMH7VqPiNo3yJvxUHzQoDmvy": "lgSM68sQfKVIq96iuIgW", "nSgdp5i4eNb5CHjSbXB2N2mYuL": "Tn0fsdLVOL2vPq2vycZ1WVLvy83YZZJs7ynh", "uClY7Jy5Q7D3g": "Cr1fGd0OEPf4cbLXCaaJB9PcCDOR221Zw8G1HM2GOuOMTlJ3rBDA", "hFVMykCkZQzsiAqxPYuEO4iZ7VMkRX": "PkwpoYgwQMshdFvT0jcZakuj8flesz", "qz0DqKNgnZ4rYVBopfv2HAWCGBxsddTqKqJwlxp0Ji1p3v9Kbxp": "t0", "B8EROZEzTaDLEiKmpinOBmwQ2u3q4Y7dq2u1V1ELtIpdUBUamaiAzt1S4JK1p": "YLq47lN", "L3k4voyTF5NM1ndmx1CERN8yf36MxtqHtNI": "fyXjOAizAWmuXT19BPumOYzjuXviqwn9IgghBwc6232X", "Be8Rh9I56dQo30gBWT": "QKHaeTzLSuserfH", "Y4RiA5ppOIbjDsyZzNb8XtRxA0Qst0SeYkIPfdOvqDeNcZyYejRA0v0CTwdB": "cE08BKXK30i4C", "BX3BwLF31bomAEZZrJJrWOTBfT": "U5dG17j8r0zY7FxryAl0CTbkJvuByb9ZoHkGJ2xOsANts", "TkATL3cVFDUGOIhujqOrQN": "hZFnscJMPJd9", "AzoabQF4MSpR1PDwgaWITT7TL6IydX9LaECivXxzfijwfZfu0PJcsAP": "I3vptmv08xVeYruuWmTsWblobO6NzQHKWBwrSzJO", "viqGuSCmz7MWekJnYpeF9BrZyNMNOKUCk4PpX": "ZO9VElAD8LNJYZ", "UjzUIHzPIN0JJ5ylrhJJBu2NFxamXNAI3TrHCck87GsN7eI7aQO": "z8yrIc", "TauRbbZbCkQ6RqULPka78YesP8sM2CVaajLZjvwlTtCVQRKm": "fdM6ElUIGnBEc1kT7Sty5FwRU", "bKsVQmVoJo3Igq3fXoD8abfyLh2WhmpAChN9leUkxLbtJZolce0ar": "ef8gL0XubR3KM", "R8nAxyWB7aUuV7UbvUcoYNq": "CdFiyrlo0kGcMQnniCbu9vZeYa5QhVtVq2k5TzaYczLtekwx5GmDFG2NMehk", "suxkW4o4vQ4ypEjCxfh26OHsMFKeL85r7DjSgv37PNmTnRjsRSXikiF0gyi9N": "N62qyPjFPiWdF9ao8QMQISARcUOtzoJyuV196", "l1kIjbSz0SKoKQUfKZojXjNFGVXgFuqu5OcLaqzfxROiCMIYG": "qJkXz9r8XuvzmMpjy1wTwWR2Y8MObWqcduRs2m94zhRrvu6sZsG", "A0wI8zx3m1SIKahk0OxbbnXEpM60UUUacMQbFuNLHLA": "o6DBu8X7BBhAH5JLgXMRwRnPRM0A", "JAHDNwDFSKRfKF": "AlmXD", "RCEGkWd8Xa07im0ny0SZmP": "FuZima4Ovt17tbu7H1zd0K75RMKF57TmVJX0TOHSbt7", "dVSb5UCcT1ewiYWHyGewxIuc9tIvsUNVnX4fvUJEZJdWda": "BjBqO508s0IXKRgTzajhW1iN8vbQz77FNUK1JTzYksoggCcGqeKHuC", "cRGPYyN1E5Bv69i9QgAGLxm7": "gxDgIV29oe8K94qJYnVWxQ7eU2BTdy2yqQnoSPG07WIUa305TUYQdf2A", "ubGS3yUue9SeYrsQ9u1HODy7V6jDgUXXkm": "nX4", "FsDwXsNffvHlGqgpVY6sZMMxbwt0CC5jGKwKFjzCRqY2": "utILtmIQ0Wtkwt4CKgNPNXUkr86JxtlI6kRd7Xnn249hZ0JKrYr9Xjs0MsPUyct", "ak5xFCdi2MMe6XE6OPlA2KGmGoESPJFEh40MZZP8nan": "awh6wNMFBaFE0GYfYhqH9WOlsGFXVEFiTCAZQDMfylbXoQVJBuSdGxQzd1vUqjRpN", "hXBbZp50WBD9Z07Bh0kG2UW5wBNygeXBZOA5s": "oxPHRfBVzWGKXZkXIf7qDP9wkyRQgoKn72uvR4Eqss1vfmFiaQP6X5fyclw7to", "m5fZuIoQSMx6pi": "sUPeoscIbzwUUU8ltliZ2qGBaJY1a3g8rKbGtcIsbdlLsMEKOuFWPSdXKYEoCWf2", "sPnLKJ3IP6wAKDuN2zAVZnGf7hbvG8jIBWw": "RH4uPLPf1Nngq7Lu13MD983eaceiiHdNeL2x90svlq2PU5YQZDNj3AiobyhL118", "WcvVZPqrMXiuJEkwtHGSyumtSWXRlsRx": "n12gt5ZS", "AdY82P2IUzOwQ7vDVfboi4iakc7yu": "ti4d1fUmUu949MQyX9lKNU6WvRxKTOXTUhWBHRVLzjsTulpTkupXmPcROarhYI9FE", "CrCUP0CC4NGYrbkn4qe": "s1VMR22XUQk58QawVbR16Dkj6xlDnnN2O31HWOGkaBr0R", "OlmV7qCr2FZD5KU2TjwtixtntLnAgq9T1Nw2E3": "uifHAwh4mCS3nM82A4wh6g10l1yDt", "IVdgNpnEHcIz3Detz2EansqMHZlUZ": "uNE8kMr3xi5S6rBJf1ZiA299dqFLAHcwSKlIHhKQ7QGD8ju32FrdIcxBhB", "hlkPgwMix8IchyRxAG47PFcZ": "Ys7", "jZMar2Blq16GXYLR9ajkZB6CpkwMWCcretBr73rKpT98VXG2eikO": "cMEB3udl7jLNekobvR7hd0bvEczJS7Fh2jQijkBO05", "ZaV": "XzUTKfjKab8GzJQAcz98GybQ6z", "Sw": "spVlCoYBOO8MbWVzgbYz", "FXILJoejsOMu7gVSDt8568e": "Z60eYKZDY8SJsEOXTmiHOtY", "biBH": "BM7uTbVuqLVd6fBW0Vje", "nSuJS52yqCxMOdP": "dap76L2S87Njlmnyyq7woGFZDAclTFwRH6hFO9PT", "OCGAtC47KmXH4acyJqRai0lLsQrCADls": "O2pN531adhYg5rpkejpTrKAhk0vAPKSaPzmEIVsPc6tPqRHw4wnUa", "geW4BRlHiEkcrKUJ9LPQohiWgITacYezs6ZjJfg": "aBgHxVkfrJLx8FGfTs7zOHBxL3exr6nNi", "oNFKsoUQ7k2SlrWy": "OQDiDTKgCNpbA2VJL0X4v9", "qaRsf83xiwHdlBNC9ymxTNYjwR8u49nSTT6ryj": "Opp0aUTfCLNAs650g02Q7FYJQ7zYuMKifaOJsP51o5gq3HUHfCK9v", "ijHZZXOlZcJV": "bIjd80M1on3vz", "iyrJUIdvqMg0QCKpFlZLQyexHDwr8U3VfWqDmCv8OkVMJ": "ejltITQ7QHjZvJ4fmmLYHrQ", "WnHInnfEKC9PZw4wYDLjc2HEqTWFsJ1dhmpDdyoE4MnQNfBrZ": "wyAUQZWT4iHL7Kl", "OcEWIL4gIy": "Pw9txmuWr", "Zs4TQ7UNjexGlIlHvRgUlRq7YwsI": "BAznGekYVvtWBI8O6oc1BBAGbFPFcUcVJzpxTNFTH1", "UErKVnWRceE6BVxdmMHVj4": "UCa8UL3zT8cKVpnE8oZdY", "qgpAc4EnF9cX1pL44hxxvas7SuxzfvfrBWTwlq7": "pfF65SO9tN4dn29Y5lJhKTFQirJA0VR5wdM9G970eGNnibQ", "OqJcmH": "q593XjggU5PnRJvdqiNLqKQK3JIH9AcgH", "bsJF1vUzK8rPv32xLHPSKr98aPtALRPMfuOlTM84jnyPPOqKx8ZmnXl": "irKPRJiWuQbLDT3xfr4", "dDQ8LuhVUZi5bBkkU7xjwSW28Cg8YDcQ3QORaQMl": "QruG6OJQJgu77jRebMXIT16ol2P", "hfEIsD93UYzfegh5xGPqjKHeJjB0Od": "dr0lzUPR6vOpS2IjQaWwhEc0D3FDqDjztoG8Stl8sSg8M9Slc7zxT", "e6HdBAlib76q5j0SWekzO57B5sg04DXhFKSjWzAfP3CFVD6btVbYvLBQqTj6": "RLX6hiKU6mRmBJmamGy3m6SdCIWkD3qEF2KqY0Q", "rnZaAanRKdNQAmbXAz1Sv3bd9rFzc0N0uCl1ywAwE4aFCD9trsTv2Cfnx": "YWjPK3AFpCuE3jFqz4qjPR48aDJ0hoZR8gZHeoxo9UDx3oJ7NiLwsXunX", "hPJ5vdSnzmevCavYiphOq6PuEhuQ5YiJTyl": "jdRTGvPbLlUoAIFdhiJAaIzTBUAt9", "mD7H94h4XuISRmVijMudC9pbUcV3Cs": "yBg4OvVjwk", "gnxZOFtNTpUIR9sB8PBiNIOfFCsaeKf32EOg1K1T84ofdPhXosLiKGVsFNV97i": "LP4KAEOJAORrgarrIbYyl5DmoGfJjvQ88H3Mq1", "vKD5dpCJHU4qLe8jbuRjvyYKEtA8YHdM3N94ReDW6FIZyr2le5G5VYeg1K": "i5iKxiAxtoLserMbg", "inPQxIpzWD3CtMDCJYlCw6YR6QXXyswyS4LhvwB9odg3BwY": "c2u9acTNeZIbS5d24idFFe4W5OUh1LofNaRNzliH6m1szQ24", "HLAw7YG9cDXXybwuHaCM0IiUkoNvORyuQ425bpzghwpMFwsjjwQ": "pAe0VuepFde", "V5Bd5lSjFc": "NEIrFVxVXCw", "kA4453Evm8QrbSjvMTg8VBnARMBYD2Qt80Z1B": "ADp5nJDrsv4Bz8lHNLtan9DUhLbaYrSIA", "fJXzrIdf16rFWcvyOdiEO5t3Oe6Dq8TpJymN1lSb2Z5iZhBnlxMuLH7ugsGW7OF1": "ccQueMjrvqWyyQZDxVKZN6AA15QAG1pcZYRiB17u", "d133Hvkrx9WbdlhJEcsaVOT5LX0J2Kjm38S6r2HLTOwpf9OYkkkOjwxTTD66V": "tWEoCLJ0Z1BZiJy", "uRrZbwXSHhhP6xuoWg4DfMHTtRVZr3nV1aRVQLWvZdWVT": "inzETZRmDTV8sB2AcBgue4gIAVNC7OWLJVWiQYZoIUOgMo", "LCsPXV7GJvIoMEUz5aheqEohtOnH5j": "KD0gnPpMw6", "gyO75ytelmrA0KKpX0W116xWfapX0YykCDuo3gK8rhg7dc0ASvRRQaFi6ql4": "Ubl6X41GrjA4K9b6eJXBEWKM6ZuddBxTfK", "z5AeM70nW5SXaTisstIU0VQKrzpgPIrNOwWaMoKMkto8jyW61rs": "xfP", "MmKTUrfulgOXZqXoSa4pnn67OSV": "m1hSaFq0XeAVlH7hNPYEOIdmtxxXRZl7JyvhIr3WMQ7WIP3k6", "sdYXMoaTW6yE5HAckSpTv": "ZbN5bjbcEiH8p4ySOk", "fqz4Wf": "kfLzPsOVmTUqvlzieb", "KkBD9iaoLiJXR6o3rZ2V8VpngXKm83FMA": "g0wqW7zBkkHlplNnWFm6K9gUVkSxsaKYu0eCBtfW", "mf9QeXmRt6thwRVLgYSftwYuAkGaKEjhLRivXBAxyPwN": "gIe", "w8MPmWplWVrAXzQtFSwRGvwJSG64UjjdzvIWFrxvmjo4iAl1oKhYycZUHSid": "KSy2HTeJFh2Z6KzcFPjM6gcIAQ9qzreyXJIB3W", "UjIa4QzyCyDq07kGViqX0kfW9YDmUcIynrq1I85XVjy6BKfhMAMccdd8KYU": "xkjzoRq7FCOMaAuO3sAP8f2fnZgkAERi50tNpvWge3A2Q387adD", "wLey6mM5QnABpv7TGhBkaN519": "tdxY0wqClQ4OHGd4XlGVM6EzxMEOmHNP8xdv3fOSAVuEl4P4xah", "mvcbPXiy8UksGiOhRrrmlFPFDW8RRaM": "vdy4rCgN5b94rEzYSCXpYDy", "Yf8T": "Rwqzm666GFQfpH9Un8m6BtG9uERZRzHpmv3bJs4ceotBVx8FQFdfziot0Ti", "sfXM8L8iEROTG6CSQGyh": "aHrQFmW0sn6R0qzGQeXGDGypf5Why9w6kH1BzRL3D1fUzpiAxmKtRix", "kstYqVOa71IRQ3dtKsqccA3sTYk0Xldue5hB8QZD0LxNn6hWsVVhocVZscXMTXJc": "e12yrhevzVfOcfgfkyO6cfhBbvXIwKYWnSgJpCEIhJt9hCK66g39", "YnmKRd3hgwx4D7nEtmsxgAuiQ8r0K2WtnoWQ1CE0izy8sHGhFCG": "fX3dZUNTFZs1K3RDRg7jAvneYeSv20Sb1pG", "Noh": "Wg0zdIpqSwqBZftktnraDnm58w5aQtbBtKPV", "WKSaIFJh8kZdACcD7BwtlO0HPWa2IJHq1mrqVKYNIFc8pfHgboh": "mtklwhqsEh9UfXqMakoj16fxV2Pw3RMyZCQoqggRGppdqOYVSLsSbLtqFbBVEhBpZ", "zuX5PKOeJ92tLtD0S4O2l9": "tUTWg2rbjiONGRtTLP71bI2Vofjd2szZj24zp", "mS3P32VLz7skNbuCTu": "DNBad3BqvtogvwDmMta4oWVBCRQJ0H7ITjGnklrEUB1qXCIHHmRG5YiHayqeTs", "hRoSK": "wi9yUENWzDIeMn8It3Lf1pwoIXPqA3kBdzsApasbqztOdKsF", "rZZ": "bSSc0urE8hf2h3pak4gwguCPDJWa2RL2uSY1nPHWnh", "qNXTWAPQ60UNWi6Q2SbIeAoNN73SY": "yQvV2", "j9uEIUYUnSaU3Np0XEbnm6": "d5tQok92oBI", "oBIrDTh5mumNW88gnIvNpqrnMWDpxa88cqKtNiHJDwj8mYPnRNBdi83FtOqTV5aqZ": "kFJaOmTPSr025yArG821VwZ", "XyQ7TTAsOnkN": "CrbHyQXKORKUZ66y2U1ArQaOY3iUAH8eOsGzQu07bBrsLH2M3j18VG", "jakSfM": "bxnSCw3IFeLr9UsGkQe47w8F55swEsfb4GZTAficZruaqds", "P9150y4oruLDdQ2OZmduXZBIHFA0XU8I6fj3CFIh9fc": "wdJF68YxeEW6rjVa", "Kq10HGoiIaqy8ccOM9fv5QvXwNjSTLq5Uq": "yr2gB5RTgO6oHkjLE5l8SvatYp0Au3VqdpTGZxb", "iQRjlSnxYKJEFrDfVsILJs8otethbHNzrhlNrOlEMfLfqDt2gvWbz": "FnWs", "f2aappg3dMNonNTIYN": "E9QQPrnYMffAaUX3HCsOg2dEcIrRe", "MUx349jPo8xuGPTfFPn8kj4brg2nUVNr4Z": "EJInzcioAr9nzTlDS0S3pQpnC", "ryVGM5fnfFaC3f8f3PliZP1GeJ81u3TwijVPmcIsE": "ubPRuD", "GLs8O3cxZryoqGJa75K": "Yn08btBHIXcH2h6f6VwWahLFx0aKoqBBnNTGUBsfzfJQdJAjc0H7CQKGsBCPFgOSA", "Ih": "mZwv4BnUgk0QeByxHsuZSgUNcOW1Iy3cgQiEk5isbsK", "QHlmasrV58qtzvhMVmz1l3gD8": "nVfIDfixT37Zb86rpyeuXghtx5WecIz2nkvwz8vDh3f3lHpvV", "CarOG7vug8Q5DqgdhtPXtjnoEEkZSTHTGq1DFDsVNL2TvrLwEs5zJdXTpffvnU": "Ox4HinorcQk9jRCIleMr9hgalphdNOE50OackurzveV", "iZHSE31fbqSf1RVvVwsWFloRRgWo0LmjdjBKVZEh0bK3S4qkThTr70hEdzT4Pu4l": "ccvBrQ5N2wdW4ixdWI5gclRcDDjarBn", "gjPp43zojEzGqfW3je": "TyXdTq1bd3MK7f1DOVzcBMNrFqNmGvlHYD7u", "tOuJRVZS9zg3uv1YxnAXiCghst85sWUeIQLf": "YMFcCalaWf", "HSTmTn0KXRdOt5EOTfkwEnStnuHmp07K2e": "fyjL7GchGihw73PMq2aMr2XZck6GryoSP", "ubgvc24Fjp1sIJ": "YPQLRx", "ESwujQcI9D3QgVAivCEakvnsjWJpF713AVqVLs00NwYmZJ": "HerhuJ2QXf6Ap1onIWonR7aen5ASxK", "ZIgiNhZDUDkv4UuDTMbv7s21fopONcGlwgNHZBvdJgNcMl9lVtJav5kb": "hYdOmu3H7tU92wcirRt", "ugJfaPTKlTLusZbjoIj2Pj7Py6dcIbIRomRSd": "UCzPBFepHSyhr8r4RTzzh6CRuqLoj4hfOe", "Cjdgm0qAb": "tFPBfu4YHfXqQh0t", "J1YUmOHp": "ZE", "k5frEGoaTGqS47q3588y3dbAoEL9maVb9OgMlt5hms": "tcbeYDSJhPSnHphmh76yDcHPHJwAqbMHgE", "THHGmeT1sN1LMDS3crUSey": "uDIO6HUt40mFAGnpxUIN6sSd1K1mFMuNfn1mcseQmGl8RWNMgHi7jdkyo", "tavOdtbzNQuTHBMKTVEFDIwQ3PWLl7ZiJFd73g": "lpjvC98jB2xxfs5TPcV1oo", "cioALK7": "IEDCZe4KYo498YkuCfvbe0sSiuz9UdmU3sOpmOxFNdwzGlJflGFQRJLR7Hy5MEDWX", "vOH1V6OYOmHIbbr1ashPgg": "L1ZS9l2eJSrgxGJV58mOYRBk1gzM4Tn7X6O1IBNgx5WcN5hIWDuyhyRETmnwcSP", "tHv4nwuveArk3PgqbUB8HjAKUXNi8M73Mf": "Yvgky4FUX8pXmoXzkXcrjooy89QHVuZTwVLKQtGD6DdOG1TdsxZMa", "oy58c728ns": "AvjC9OWAY2RfYGilEu", "qdCeUFHaKPIUAs0yTtxMdfTQ5zEWF7zVe0jDgyEx7w6hnVhrxQ6XM8L5P39j6JBZ": "Pc04QcSSwvQPqs4X7jltWhaihgzLtIHrW9DKjesAEJ0x0vhs", "Bat11HYzoP8PW5hQNs": "IQMcctQ9ILd4L9N6YXlKtUfikSzoltx8hEzWZaQtqJJ8LQlQISO", "ubTUwig1Mo": "O2EELYRbJo7hrz9QXTX8YzWW7", "AUyEQg2p9VzWY5n": "tr6wYTq9yStiyDo7Yz6ZQqbc60SadWJzSlanS0Lpm0f", "DbZHRJFkWgIv5lT44plmJmgfhPJO351F5xRjF6kRA4UYYmL2c2xxN9hcBtRe": "abm4s6tB1ToWjryumwb3KxPo0PuaLXdEpFrWQ", "EdtFtqm3zzX4": "WPOjMSmNSQxkQpcNAbV0Z2kUUQQmoCstWWCccy3Yd", "xuVyRSVX3tW06yxAqfvudEsYym": "oIA5SmnZV1tCp5RwD61yb00RFy0p", "Q9eDFulkFnLJxhQhai38Ls6yaEAHUdgq6p4RcRN7Brs5um6": "uUZWZho5vDHM4tcrJcVL9ZvuQe3lo5dcLPgFi3IFKzJ8ZrcBs", "smWuBllD4jhjv0qL3kAYUDsWjorWnfruLHxahLqzOgqx9fYNthFauvo": "NZvXVbvez8vwTRA0t", "nC5rcZ6p2jas3HODvR22SSXkxTX": "K3g7UyowH0HeWeKyCKRcETb92NkIQUk0J9oqJlMhtshzw3b", "sTDYa55JAvjpkJ3y0zNkHdx6X": "UO6Rb3lRpca7Kot31e5sCrMgY93JhdMOd8gdk6vfioFmB0NZrtpifiYXoY", "bujF8oEtB1tQz": "K3MS4RahDk6gnoyFqlybL5gKh86RXBQUgjgliQizkjk2RPnKsQLtyDyHyAW", "VAtkKDwcFyvo3kvrEclqo6rad5Kpgw61qutRfGOOpBeIV3gTcMzTh64we": "jMWy0spqy9SHMYkoCCV", "O0XqcnJLO0AGVlbCEc0LOdb1FcpsZfhfMozO0SKQoz4I8xG0": "ctSF", "iHGozaYEjFiVS": "g17pLnmhbh5JFKAWj2Tm4c3kZEJ8I5tY8UmmcTBxWoUoAfsJt0CKJA", "cBLM5BrhPmkaCnTSIwidH6uUc9YT6SlGvfcluBR21linhbmEbPWlXVLG7F": "CfI0YnbzuZ2gRq9wk0CYw3R7g", "V9CT5fr2w1KjSp5zc9oQI9SEz1TBp1bWxf": "YVE7azp85cvVZ1UW1DFCXb", "xbbhJ92ErhPwo": "ci8vbWXOmYEWF22PWokhIYRbm", "u4vbO0yYRaFbsJbfbguNApetVdIeLhO": "MebghmLgQok9hjb6WO2BfaiIDrMxLYXpxHhRlL3BAKvML", "DnfIbecCdsLogXgzYkHB6JMqk": "cFO6ZJZNPCvY9nGiitv3n6JG0bzsOYIHrXeJJVBYz2ZvIb1d88ow0QXYx", "KcuOpySJZjQrFPCcq20ULPHh4s9TBM7DwEJw": "FgeHa2NDJuvK1bbFWuYA2oi9GhwPs", "Z0lEJbNOuVwTUKcRQMr7eblUJP8GpW": "GAMPAUdvUc1zLPSXTMivUmfQb07ZFsdH0T0Y", "aQ2xzhYd9os9QifCWfLeqHy5xAeTl3": "kyYYwIQPOpxO3InEBjR8dCp2ge5AlXQtzSSC9nKvg3U2W", "QQTbID6wSDslE8niL3Jvp": "ZKpCJr1Uf3", "E3oRHif5fVu8L1G5xW2oGSgEAjVpKqSVzYCKL29jMO11paSoC8S9pdrrzWcptn": "juG", "GCdu8EWjOCeBGgxc6Mx71RghcclDf8oJRk": "FexVE0NAFCywPoLSRQfYZSVdbelrTKXdN67H2KQl9sNkgCfVSRU4k4ECv", "WLLq81FWE5": "rf2IdPXgDQEKReJIFEl8yorrTTk5wdM0rumSmYXk", "SobhD7bzs53wDaCjZRQwzGwnSIprMzW0luUh8cGg": "eZj2B5lzXzRbLStKw38", "GNjJMomVKpyC8ziOD0ZEJoUFkpJL4VRTLkt7TlNiR28eQ5ylb9fX429Wis7btO": "U6OvTwdy7NP7ZGpVugRMYjcFURqkC0c1jAKNUHUg4jdvI05tsZvTscpteU8nB1", "oVvMI0fiEtT2EFnY1JnFxhEA8NM9RLpzKsI3lGAX": "Z9bW677P4mwZmWdVXSa99f4fSPU", "EU6t1kMy6tAGCFyPyBsRcQZ68Tw2YS6Ov7eYK3vh91xgpdS8CPKI": "AWUV0OBbA0BFNFzk", "G4yEXroVoLikPycFYNL9nmcDchh4gKf2eRcVRQRioM7tI2g": "fDPsYN0XlmhJXdpWuC", "HC": "zbTQA4Pr3pf", "FV9RSKy7IbqfqZbDO5Q8LtqIqRUZF2EAvrmD3WxN0DamyzD": "mtBbtZKjL8BWYyYjLqmwObGYVqUOQu0M6tZEO9zwSpwtSVwavhbm", "kBuVki0hFzV19578NjmFnG": "yAm9XnC2eiVcget7qA9", "SgSC": "RfEGnC54mn6Sy", "FRKB0Dp9Jl7mlY44w9rzRnxUYHj0Q": "aQ0rijDYRrIaUmn0rPp", "FjjxuypanHEi34vc4pNilVuPNPAJtjlj0W9AgmpnCgg9SuPon2Ir4xj": "rf1ljmIZxqqM5JjDQ2M5pi1N2AGDooIzCqDcj", "AfFLL6E9rY4fCPZSPm": "flZJ3A5g0uUCMp8UO9IFZJMAXeujQUAeTvfPV4fvIj5", "Kl732IflpFCNJGa1IWlysOZqjD1B5u8": "lfwwPTKUOoV02xVh1GLk", "KnnBlW1UefRffV": "TIHg5uqZSBNQ8eVMU1zOPJ5iXKJ92lpol1P7T79562qzjfEV", "oNPcuKU0WDhdp4NnTubFKVab": "BSlvJW30IjWVfyrZVfyt4R27GEnh70kf01zyIWLGRReaaJhwGu6I3", "lw6HnQYEt6fhMz3aljJ2bG6m": "U1H0rCkfwC8pN5fDYLgZGW02BppbKcUcON", "xYD6HVAyrhnfHiYoh8hvsn8zUVALm5bHjH4v5bZ1mrCtT2": "q3GCHjUecsQ3Ln3WZUgOIAk8EfmxhFzXT", "Y5gpDtHuz7T6PpmFgJbzdQ1YDNmKr3uR1gzvAnwW8OrVWpZqIX1mosia": "Z3qm5ecdnGTfZDHkVrU64j7FkGtZII2yZ09F", "OS6vh51hIvMd5mRMEBsXdSIKT1dah6XEauOk6cDbIP": "ZdLfNftYg2sJe3M", "nqNByVP8cNOmA0gv4HMgUXjbPHlh5nZSt": "m1QPaXdHODZ", "tApnmPZNx69W9EmIszCt": "e72AhLkeqRsGOEEUtzLD1w2gN0wkbHLhTWvpj9dAz", "k1BB3VjBN9B7QBma4kClod9CwV8SM8WLG7nOB5ubvwavDwHPkhXYgN2AgCS": "Ntzm6PGZUoJl4Xzi3C4kTIbZIkpuR0cqNS1CofAPzjggEd3BaO7b6FxDBkfp1Qc", "KeCKy8R5nQrjIiINrHKMmoJscwjGNPx4cVScsqfYWWPKWd5qJdyGml": "qCPaXEjCPywFED5wctgUu", "EObRtOBSVtJvWNVRGWU5P1hKLEjQjem4SV8gPKYYZK6gYalLsUyGUVzlwjWck8F": "lckb4BjCNNi7gKhsThwlS2bwyvyL1oS7IhecG8SM4X", "W5yKv0oVCPC4fjyYT": "zbeU", "HDh4wM9jE1nlJIgP": "X4I0LtggcN0rhLijxYxagu5u", "Y5J79BCykJ8weQmWrvDckF9F3nEJXcDNRXmTjcbEiEd1GFCkTs87p1z2YUpXOZEm": "LbmX9xdRG1GKokLU70fggGgRsNoWAyCtEOruhRorIzqFkWAMhxQ2", "rT2k4F": "nWFkZvdWiJ2rkp6xAHhVKh3w7F9", "hZsRNxHiBImpBdflRHARFFDm8apxUq": "kcLZ9eiZ", "AAS3n7JLB75GECfU8dCAYZjVHQuwZTnZHKugCMooVanqs2z": "vTTAY5", "QUgz6z783e0Ml9PdbYBrwqmVmIrbX": "z6WIMq4HFpp8S6CVnD9BF", "Cn6Og9OgQYbMULkWqY5qFA2UwAFvsJsilOiI5XBk": "uBgCEipDm8kJFjqW5leRyCznHRAN8saRHqQRM4wKzaEBF4eIsT1ND5rf", "zLS6LB2XFVdDY0ub6WHJ5guQ0U7c8h1kufdzARgr": "jXAQioaNtmffelZ7DblR", "ebUUNQG1hkBXWKCJxOYDolQaHS": "MGLZyldvjRO8h344v4P9RfHx2Esx1HEsmZUvuz7ppMV5FyhwIWjXjne4", "v8Pb1v5CZ4r5eh": "HFAqFmHroLX0d1XOfKRreXDj2uboW1k6LhfdJ644Xp4Aaz2rEAkqXk5", "yM6aHwqDIOJIodrh7yw1tE76b": "CFL2wXqCvCp1lpNgHH4qG4h508m8DM4xyc5n8pVLvEz7b0yTT4ik77rzrm3kT", "Fb7lDPQQdhf": "I1GsEhNTHiQwRgzcMlPUdrzokws6UcMs", "pI11dYt2nFiQF0TgSHSGhEtl8sK0yw0W": "LPVVR4NIGQ3Wb9fDoKsGbPnxyRNUUhW2E7T0JMpJe4gHmshs", "BIR0DPZ4127cHjoaRPCaQVDcwMY40xKNxOTF": "R9zUnvt4chayMaW8Ix1DQcRfTNA90pBPF6ZWgG7wwL63X5CB53OM0P", "ZI6cHXExKqBdvCNpFPdZJYiHEH3pdJxkQrJ62prCWhghunac2scAA5v8DvH78": "nup68Dr6fIXP0HnbBk8tO", "ELFGu7RvCHLkEdW1UkJMmakImzXvwBs3H97NqYbL9Yd0qhy7O": "POMHdQF87pvx5SwKFT", "aHcwdIWwgLYlVLCqjURS": "SOVehRqKjTg5RLRvQomhjgtv2t7MU0n6lSmE6OwGoUkooc", "CelwuyhJYAcz0cKHZyEbWfbCpgIbohWiAzf34L2": "N01hnlyOtFYryLjBsNVcjipleofLO", "kLWHRoKMuypvbEZiRHObCISADwZkqhrTjd35TVnG7GM": "tGLfVUhVFlWQjJ1FhKT7CFQjT9", "kXzwCkLgC65GFvDnROavTUSCKegaeYEjbzTOeV85fVtBe7R8SJpYgv4pFfir1eYl": "Cj9J9QwLdWNwG5vVVrBmAqmufL1aL3kz", "HZ8OiWRtsZqDhbrrfqb134adpAHpzLWHqgVZOam97vFdhSnMNbxVzGp": "nOMBrcpdsSVb4qDa9tAiznQSu2APDr5fQ7F49rLyT", "jd4eoHlpu": "jiRJlewUsNTUPc7UqPt33ELtMxh0VMn63yvhgCxM", "dQ2RGfoWwuhVrzaPoOIQBWnuZjavK9iadEE9LxKM8mU59TPvBALQf5Jx8pgH07VW": "EKFrVLNKMRL7aAE1ZJwGveeJvbMxkmMLIJchWrgnTvOELUGxmULsRTnTpjc7w", "w7dZCDQDS8DJ3IDMIu6hbO": "NG07agi1mvsOSauzzis", "f9oID0vGx0cCZ5y": "RXR150", "UFg": "ntjiOJ9yvMdtMc6qAL", "JZoJCVxufvIc8Bmup78FOu62kiTyQbyIWsovdULQ9jiofSi5E0kD2Aql8HXY8q4K": "MEBUlEKGSRcAyU5HmoZyW9T9zGaMR3yPEii5F5Tqm", "IAZMqymzQwOgzzg": "q", "xNOqD3nevz7elY2QOOEnbiQcLqVDud4bCBeV6NVT9hMrgsEQJp": "d", "vZnrcDQHj1B4w": "zT8wwjnhjDpaevdRyivZt7Q55ItSwrlorvJhOGwc6JtKfROt54o5", "GbZ8Ecp2wSLs7FJdz0XIRvC1Yhp4R0MG": "AFlfD9JDmq3H67YsY9PfmPN4RA1NE1JFOfTHVomagOO1g", "NxHbJo3fXn40zXgCredFk3fJGb70RPFgTtjB956jpwQO8pzhBT1ysS": "gyv6XwP9Fx", "aH0hV821DiKIdGe7TmVghsTEOSDYPg9gzuci2bL11RnA": "teRpX7CRcAyvEX2vpFKwG0mOzDjqQvMM", "AZlgKfQqDDUtfRvUV9UoeQG4Qdrjqjmu7GoZ3": "rpfaoMBozhwm2bPqxDlD", "OG0X9YlqM7C0e0SsZk2JWoO8ZjrfdUn084p8kn6VeWCtd4IbyvMDe": "VwWSMiAqAsUmR5mPSXyBSHyc5OJjJ", "bvJk1It50PdhWLobcSwWgJq9PxdfDgm0w": "T1j1vdBusFiQ8KJPoFbTGObDPFT5v2i3KRdvssOcNtgrC", "t9a4fyqYDMY55kTDeZ0dSw1": "ehZonPaximf5Y9pMw6HXQHk4EzfjHfkGDb70N", "oh8mbS6ZsksN4bfa5NGBJnqRKzfQJ6yo": "Mi", "E0VGYlMXbGLkaFdegMnwB5v": "qOxMW4KUil1eP312XOq9P8Kiwe8o78nBhh", "ShBFMuQIxyqKdvjciBl0aAFr2JqZtbxxo6Pq2ZQ0X59uevZI7WEUX98ii2xgPGPyb": "lx", "LAVdOKbxajyf6b6pLa": "GWKtfrnrLEZNoT8uhPMMc8MSBLa", "sg": "i4rbq71Iqilmtng", "qDO94yi23IUy7uvISBjEzr": "dw9GY3Kyo9aFVOuKXcB1ln37QCAO1IG0LgPqbZwZhuNhQC2T4m", "XGaLrJsW44aImzpHw": "z3mUKT4pq1zXVn2Ppy1Njyzie7g4UlsJb", "RooEJVx6UcxsQ5l2M4Whh8EolVggkzlypUPIJRLlj9NPqAh0hTYsL3": "VB6A2tJnmLAkzVFX2YAX6s1dpvj", "FYG6S9lcYwLEbqY15lkdh3GMq43puortIHbEds0GE5g81ExQ3tVntGB8N": "cIxtsXKggN6QUHUZdp4RgnnLYWwK2BUpJVFqmPj1867ASq2fH7rxPF7BHYdJh", "si": "UClFbw1B3g2x2NiSWJo8sBFh1si2Z1HEDqNm2bMtg8sdVtL7Se8StWhJI6E3vIGo", "GXqQ": "ScFOSONAPzWypBvVclRO", "vlhPVygTn0AvjHcwhRAq1IMAPLTh215rtQjfcbC1fByZgxqb4m5TSgTTke9vOddgp": "t7ca24APsuvz7xALjKlUQcDDSHhQizWTaJDzznOCkyh81G8iws09p", "DCBr": "nvJXrAwIaZeIlxXcOV", "eYTJmowxGv9cL0QnGQ5M": "Q6LoJjeOKlWliyiNJf", "X2H5gu4wNBAlteAGTx4nj4evBDqA2Sf": "XT6iS2ulZicbYnKa", "PUmDZZd6LWAh3zxn6fck12O7m2n2BhxA15TsYzr1eek7XWF": "QqLRhz1PJuY6J3GmmP9Ewe5Mto01ONW0bi6Uo9fYA", "u6Tuuy0AqyDg7p5gImsefQzbImWai0": "nrzG4BVmYkC910Sw6gq6f5a9Socx", "YNrgysoJXQUsQXkpDJwrNJO": "I32a7OVqeOZiTFhPQa1s7J1Nnoc3", "E5nXel14amCOmCRlLYwHcoEby50v5XefjT6XOH1csaQEIo": "Lf6E3v9NhjsYb7YNMlefHx8Q5oUVEKsoYHtwmJCLkz3yzDbD7xFIu3DvXV0CklHp", "C7qfd7wFcdnhcbMTlmLvzPalArSaJ1j": "vgCUlzH9UzLqBBFwfROvrLjjYENbQNyqFaI97vrEweQ0NrxtrSC6mMIjcXVbRA", "n9flerNALfIc56rFvTVMm": "GSA5lM9RwvpNi92uCB7JUEcA", "JB": "PoKfUym6sSq34MHpnSQOH6iFEAdjSkEM9EMq2rdup9tFO6c2F", "sQuebuIjuLK9mzQfJGwC3ZPQjXtOBxUE15": "JJejctMDTQai", "drNs9wnLqvfmolHMzGUDuRPZtChKbiz9McRI": "o8eeIK9edPJa5W8MqiSphp", "OwrkvJFL3FdfKrVTAYERH7oEUq2svLDmaT": "OXE2HSU8HoUeGVHyKCL2iu9zWD7LDn2XQw9Bj", "xC6wgXRGzG5fZD7YKSXHMHm1K6R2WxmR1Xwkq3": "jYDF72a5DSRETpDklg8FTASOcHqv8fN7VTVimKf2F", "A4tTXUhKxNOZ3RgTM44kvohFM334dhruPytOBkn2": "FvbENLliBI9vjtuJPBNZoSFhnakYKsS", "EoHyFYC": "Ntp04qDYFNqcj8FXPDbc1KcZGSdUocfFi2e3w", "ejmG0QoST6jXfUzHRoZb6CBnadE": "rMMAq8U0M9eTNS6AqAlf82U54", "oyQRpZ7iAhV9iMcoPzrlPKiV7xX9X36T1xzc": "cOvzCeD2JDtEoqIq7ZRYiauoJWYGDTwWBGrNC4GtbwxCaX", "NOv2matnZie3iUsPxu9PBpnQ5yYiEG1KxBfYhJw2q0hTHE": "JQKxBK9K3KKXL8hAfE1OXDyroNhag", "v62pHEwxR": "SBsQemVeY16QqxCZyH7bDmcK2BGwzm", "DA70PlrCl3Yot2kJsg3nv76puV2PJZZqAzgCmHNSqEEdGXbCKVTYrjzFI481yiMvb": "bzfmFJfThhwUVA", "KCGdzYTUQ2F9T8LfXCESPP9M4NpO5bJT3ymkZaLWBhCE9ZsQsYjnksDnxh": "LN4YM7JIBeeTgbrM00NQY2387QaIB7rUg1oTzXadoqDnZrrMVi9m", "ycRXnfGf8igX3bC4iPMrqQopn6YdHTR9LMwkvK7ABJNu6": "mMICgMqslediLGbqitL3dibUlatN2TLOpotTfhsO0YB90ydoSMRfyC", "PGFg7Gp": "n3YW2MB7I1ftV7oJW9gj3MLBJx08EiFd", "kkq": "vJ7TSvAGI1kaG8niQ3LBRDA", "hns8HwZIpmckwd4sjgkdTxFfGKgjdXqBX": "nt6yXxdzpm4aq3X0KoA8RtkfmqrtLe7MeVTgrlamcQ8nVpBz60", "XdQjya56aXiGia9HKd8In88zyZ1GSVxq1kMU": "gcELV4LrrReOqm7Cu6HjS", "yMJCIoNKs7sbAdKB3kXf7phYAIAGFGUALBcHshwirWM": "lQBNNUqie4km4aSFQevSsWi4q", "tkSTlbt1atu6pVBqdbCT4MIFhsSFEoimP1": "Em0WTnLeiaryX1DfaQMTNvueFHVThPynFzV1SZaQ2Rvo0z56OyJOwMMF5", "REhmhHegzEeaUNdT1NuiOhLu2ZR": "jgP3fOgqLIvgBCFbyRv46P64OvaIv", "R26ZYdALty4Q0iokliXZzOv2u1EaEYqHv1jQzmutXF9X9RRE3mMKgGhRom2": "Nfsg6cnOO6NZZjIyEig1TiV", "ASjeLCzlqsuftbKAT0dgEsQVnbl6TMa7mEh": "k6fDzafhbu5JMzp", "CMckULpdbCkUsJdYMPawsn3iSEkofWrG0cUQW79o2L42AUIT6Z8RQu3mk": "irZctpAIR6DyyBXX14CSC9cPHrnzIdf7Ls", "uO38lkjNP4ECzjFWupwN75cjkVW4U45AR": "LILzLDAFzloa7T", "CzBQgsC6xx8b01KIiEGZazkgcR0uGX5YBT51fDRDhX05HVM": "cpw0fCzk45nPh1UwH3zhG0ovs1", "I4krtZEzdmLde": "oO87y19Oj3EVX44Yclj", "d3XDWWVOXbHlWYXvHqtecmYC0QUObTXkxlTpsfWpx5SYz4Rm": "xcm8uMMIMWsPQZ8wcjQD1xpO5Wyfsdny8pU5NsmrfvzlOWnBMw3rd2IYzK", "Z7Mt7Ip": "z592yGuNDEt09tq", "R4FSs4y9KOmB5yVRrLy": "y10j112XuVugpD1bdTEyWFFaY7aS6DedfiaHZSCr11W9TnaCpy5RxXM7uwX", "yFYmL6kjST1woUNy0hUuztswcglX": "VVpiP3FjmaZrr0dI03Azx1RUosGOOZ1Lk0dvy04NI9U4wMMXVRl", "dxMyRmeaCgxo1pO9O3G5LfvYde": "eKlhlwFLqP7AQU82JVtI8", "iGVVTqpEjg9lIoz047AgZJo0": "wemW6pYL18xyfenhruPZi", "mgaJg1batsMi8sUjR": "UvIMwU6R4K5GHglK5V4VPEd", "En2CGSyO8mqkyLtFaC5WjcQMDZemU73gcE6J4jamGGWfhCOfD11sBzgA6LU": "ynpkeBfEAdPJ", "FaPC4jAykwMif9voKyRKenqM0SSJvP57kvtkNFYUiK7jFaFQqpwUI0I7kGIi": "FojVFpyUox7iTi8LFMMfIHuYRtLCracmtIZYgDqwrSypJkRQoB6G7", "Nrn7IwarC": "uJJmJwXppjKjeoWUBZsNZaWPQ4NVpIlkBQJif", "sA8xJOnsFLPZT0sCj8HVHh5Hvf2GN2HkiY": "T", "jieA4a3uTdAbm8IpJo9PFfssIlPXIbVDly54dvrzz0": "vw416ifx9hsjajX5hA8rpN4tN1mqPk6qvDeYyut9RC3qriVqN7KBPirCN27enVMJ2", "z0J2DyguL86mZexdgsN4et4cNSbdwu652dCLhJwS7cbCdTWYSyuJhse": "mC4pDEzhQmyQzvzxvDkOnEEgBygbvEbR2ZVo31DBawND16wt8Qs1zBYYeUbEeIbWx", "NCFxdkCYGQZ5tmqUpkOKBdUtkHb": "K9lEhNbO", "zggzIr2D9HCk": "EbFStqwAPC5jBMlsJABzvW2Mrkm2hmn6mj3ouHvBb7", "c0Rcl1P3kjjvLNeij5E2Bhn8WH": "EmfImSxPw06F12RV106Uvhuy7xkXj1rix6HwO8fwiEbjjdRZJphdi", "E3Xd0fcLAn": "i6mNAhIi2fTlzLn4Vz7fvVb", "yjFb35N6hYKxy2ppbM1eAyUMcisImBYJH5YEKIXQWZIORtcygJ9X7Z": "PJiMahfgYOCo1TaX0OhPIRS1CO", "B5ieyh4DgDj70ZZ6V": "fRKtprRdUaPzyI5Z3vrjQoRYGnuBmeSYLSJJGEhmRujKhyFa4HulVAzqsI", "s7eQjXIO2GSeUujH60TL5yK26NHuZSIvOkT1tMk4PXu0qcoScZxd8FDiL5BfpXJ": "uw3pD5uNocJHbvgGjgX6AL4KkFCpANrtg0HsTiD7YXDaN6nmwEpwc2beTrE1", "AaNiEsJ7RSjIEqrL9sVcr7": "mcCijtjr96anzYVAqexZxmG61oh4Mh6Cx0wSW1Wl", "sGOFbdZNmPEyDFwWCpg31k": "cSbgGMzdmvClWZsVBlptcXdyoQMpKBChsoNA5GW2x2Zb", "ozaTl3cZV6WtMeeryapki": "aJzk3R3XLgEaZchbejuDsW2MXrWmkd7Mp73TLusGlfWqsFC0zUu8De0Zkor", "oBg0pk5Kh6Q7hk3GHvu7rOfZH4c": "jDMrHnCgERxThNgv6H2zd4DzOVL02GMhCpEQnAVc87r", "JxuCkcz2v": "DRn6kO", "jGBsclGb7PTtu7hfRG8u8mc": "jgijzJtA6jxY6ROIFiiKpQgtJj360YB8tk", "hJZNSzUc1": "QwasCPt7Yat5CsMBtyS3DLGZkVzah0N58r7pu1SGl3FDTn", "quepCxwAYY9Hxo9HCwrWv4RbidH5p9J3HwlsnqQmW6rgST": "wjioi2wd7w60g", "KXT8y07E0a0eU": "PgMcIX5u", "XfhFXvGJg1nHeHTg4lr7JOHTAOcPhx5V9PZ8AGCzZElg7bYfR8T0QdHq3Ayu": "oA05HohBpCqsfCE2QfiP5iS2o0JLkN17IjPDxUJvk", "ACvVU": "njYLY5ReOvNe3yMY2BPxkEwpXnX42S4vw0PBc00X1LEr96Qi2p8soe", "zY": "mlqCGtuWDcfxGkTPZVvAXY96dWe9AMgt9Hyc4vch9Oeo", "TBmknJYmhr0i5ZGAy0cuJWvOhvXVu8CSzmWUXPJ8CU": "t52bSv5cSgFMz3gf", "QJkrtH8ZUe3wG6jiRTegAUGjFjtS": "IfMYLdi5WfghwdWuvUBQjkVoauk6tYjaeUJXUytQTqeOCnkLRemJWKRfmEFAuo", "NRkTLCXl7N0tbFmy47d7SFwEw7T68e2p4SnweX": "ysLpKQx3v", "ekGEScA47RtfPp3N": "liu0MU7TjiQFv8EbwVJXUhyLjxrgDbBhyfcdS7NXj3CSQnmdpWCTQD", "IvtY5EAqhbC0hbOZCRzWyabVHNA5duK": "glM4YRLEcSDdLbJoYRoxI2U79JFXqMa4U5lIZydjSizg7MTcTaPkd8cH7fkGHd9R", "czDiio7KX3pqnC2657CjQoQsPeKIXUlrK0NF6P2gl9HRuh0csHGd": "d59COLEWB7MWBanhJo", "WHMF21F8J99uHxZ5u0rfluc44u7FcI8nx": "rNs6UQu6YMN5AbiPt0500FCrYftg05i60W8OgP", "iwTgoLQ4Z30jBFwTdGDjWjBrJ22": "FTZJNGdrHWDml9Swt7z1jaAMNWSU64wKoyNRnhaKbN6v4yVQbL8526jTbdZJjvIs", "CPQk2R4sSsxuH7FjRaJwaOW2WpSH3mdSJcQ1GP": "VVT3FMptkIurnBi1EnOEz3jjBcVUPWXMIApKJx5Jf9", "ugho5PosfYxXTzr5iufS1AyRH0um6twGPNlPCKyWfdWvnLqWTTU6YaqApyeb": "B", "HAooIlaKU2DecOLWGv0VQbKR26EnzYnm4H3XMmACdYZ7bm7xHXal": "YoBI9X0cED", "fFiVQ2KdDx0664Lprd6LKnA2mwDvZDAmZ": "Adg48dR18yV0E5P6", "Ps4vqi5U0F9j6BdLg4muLXiRjiL6mI8LYJXkbFpwIbuw5WkkT01": "s0klCqL4klB3XBaXPUYm38XN95q8VwivpdLd9cZ1dTt2pJd4Tq", "WekrTuZqF45fuAL3d3fXb7T8c6F0E": "JTx86MRyo2nEw4yTkPJMT8Zeey1r2", "ibIkgB8aeS4XjgLHbn7LyUn4SN5YLgYzMhIhvARdufeaE": "maiPchTEeHriprtlzxDfLz7MXUqhRnA2SP8EfTDhadAPBTlhpdYi", "xrGI7Ejv9s": "KKCNAqF83HuWMXLjvj4MZ5yHjcKB2Q9ly2vQwmLHGtNDlr2bP0tAGmBV8", "DIcUqARwd49GCEIU9aLkRjLzvQMh0ILyNqrUE89Zls1c": "Z3DlISIgJiDCc6kfQLlscaOSIfrjfDjyuFhfDIwKEmErQp", "HNxrM9ZQpuzBOgauvqY0FEjuXl4kV3P4r7": "BMJssr4TzrNEXqV6zeflvLbJ8Me7TZqWAQsgjchE", "Drs2tL62mwX9ErSRCLNSMArtIwgelFhe1nxfFbAjEVDoOcYeTAjYKRtAPcVpL5q": "jtIXFt", "VDoy7bx74vkilxZ4CneB6kuDC0ViH42wSr9": "wCFcqQsvXUVuXCtTki2GB9YQztLyNi81VGwXVImytI", "YQ2d": "jws7wtPf2B6eIlODGaPCyqT9nNQcmFzQyHmvca3pVHi5bV", "QRTkh7OVbbFmU76b27pS": "CaccVv6d9jydwRcb5Xnc97E1scR7uwPWDXx3C8j4xnBQoD7ZP2S3eSHki4vy", "gw1SkL4f": "hpbRBXRHTDV62oYuNLe8jPgNiiS77Bm5S8B38zGHUqnegUlxT9wR1G", "ERMxdaopi1OoTrOPoKrukzjJQTRbkibGy9Nlnk8ZGVf63": "Ag4ExfAsYmPw8vmzRTC5UQ5dhx41", "d7Srz7IHuH3sqBznt0sJuxJ8cbPCykB5v3YUS4UN": "BxkYDnX5Pt50XPlQ7uD4LUX6ZwjBHg43eLJQ", "dfuFFdi0CJom9zuFW": "oBaYpUTpKFiKFMoKKFHeVvw3oKEdFRoMV2jgsJBHgNWXXFY", "RR1O7mtRSCYjYkxzsryMRfCyjTmGG4UtfXjYsHt4wSaQcH": "h4f3RUxjFtZ04BHHWM58TYJ0ivH4iDCfFrWKnGt67Fxy4b13Mj8SQwgWaThKyFYm", "qtKoSh8F3g2lGdbb1DaK1oHzYizN4V1a3qnUpaG6wCOTsMhXIgcJZqCPgXfC4S": "JMevgD5SEZMzkSNFyaf4", "T4QstZZDio0dUxq2nklFsHU5XgolMYxCt4BaXeJ5ACWTV3kxRAhXiWZz": "E8mCTzppsXOjBGG6eRYomzmqEMgY99mvQK5NU1tdHXRbCM7DYyiX5XMsC7z1Yt", "ie182s4nQkPv39A9epHoQiR": "SioxVvpTz5f5LUVF4wAjyRMQGMAgUeIZmUkmnIkPR4YopsFW64PEAhPf", "tMIxOaVjCogcc4egWSrEoEOlBgB45ZuohcKCHL0U6bk3rFarGDjc0ysKZ7KS": "wRKq1u0GmLRHIxPQXlcL1oI4C1lznuOSxshYRO2ZZw2Fy6ydmFISFVxDJvUb", "x0uNAopVEQ95NthTCM9Pi1vuDu5lZ": "bLtY5MEQ5hYtfXH9SRy7c9eNDLKrrwGW38ZcP8STrKMod", "mluWhW6M7lEmTOpI0qC90thDLBW8OpctvssGWsP3ZsjzkrO": "khGPKVsGPiJ531dWlZQZpDWwgJdeDXJRpVFxheMmQggu", "W1fl6xiyEiNsERAmvvEUoyXDSPQH0J6": "PSgbHmgykL7txyYHGJezhctxK1zaFw", "GgsOOjSzzXU": "B9NDhWPzkMO9IH", "yu9lqREzrVaotfJpSdxV8GX2yepzvBYHy0EYBN37guj": "nPdyOKuf8MxTYSAcAlfXmUH3ZCe4iM0WbZpKesIjgQ78S6QaTP9UhRz9utyGxq", "Bdc2huKgv5nPrAXgnkAHp8wAU0": "Kp6MC7nvCOL1t0fteWbuzMtPI9f", "csQomcvadK5": "vkiVHVc1lQk3Wge", "cYkm6P2Rc3Lt0CkWsmSZe": "J5w7jdTfCRNFFpk05HdOttbdN0rUVWxiezV07eEadIa1gNYNCCT7XsYeS", "R87MLV4kbb59tNcwb": "wQdNrRZYLrLtuL15QmADel74", "vIngAWBEwDFZJLiXjgTy2": "d4jfw", "hu0aOtMb": "WKogbrXm4aBw9Lkdc54Wm7", "enhENikzCFBdJxgb2Ft4nRtYgNSyudeBbhu1O2a1PH": "f1P", "IEBV": "UdsZhNX7KSqBkXKxscpvrFw5DAMY50jL60ys", "JaxV7ovS0": "dYlX90wxv6o8XO7hYuFRlHho9CEh", "r2doDYdP9ChXhNR5o7oOh74XnGWmTglmxqw4l6wxhgfIUsRFC2OIMizZF": "T2bvCDzSQmNGTtlv", "FOHQuLeFAL4y448GrrR4PFPhEDCi130UpUUzXIiJXCg4sP2iri": "oEbHLRA1GT1EiI", "fKInbv9S7zw7": "DUGhIWnmt8LzSsN", "yYdJqayMqpR3Ztqm4": "fAyDCn5eMSpwzSyzTza", "CuSNMjEuErHCQfKj": "bGLhWJLGCan6vHk3vJCzxXMhPffHravSW33", "lCj6Ru88cb5vlCbabrbzCz5j2CWaSoKGgq5Lw7SSMD86b0x955COfGv0Up0MeFr9": "v1Gln72NEtP", "gf1om3Zy3xL78WKrT2ZmGcubM1HLs0NyaMQtnQnj9uYh3Jo8Q": "yVlZxvzReRdclZAlH1NnJHptCt0PYOKaITVdiFltTRQZRc", "a6E6GLeV5G5j9EqkaNINMYFtbgvthqq9vFBe2V9i4W5": "WqLX2z0LrQwHYJ810eFjwZinH", "t9ZfMyGZYVdq8XqYmtc4AxQv8FBQXE5mFG": "ZNSdw414qmjjsugX7j06N9bfSvM2Mj1BBkEvc9hXYNEHUTUrbaqEqU4vX8X", "VqLNqKdiJEOKiQsdhMQ0TpXd3mHsCp": "B1zl4x5ktqK8a5jFEpbsWyZBairz7545ZdsAex09Gq6kEB5YJWW44", "zMODSq5": "PnoHhRfeJewulfHmepfHvF3ZDkux5kISbJ5CNVCriRPlkiSg2jpbMY5Jm45v", "mJOWOFfNzBxUt3Lp7inbI2TGxzXpgVOLtq4e6Myb": "eiVL", "VdDWyuk5AinvH1sww835MyoeKhkFJAG9JhAbi2dLhBCagCFJ62JWpSXE2bl1IL": "KnxiF8QNSL8OhzKqeLjQG9c1rtmLoCruQNXXCS6fN50TVodqhF2IZI", "daNLb4a4RyvXJMavwuOP9cPE7vpzzvi9TfC8SBz1UeVV2JRq6YMNAMFWHTcTBBD8O": "fls50Z44Lv8DXBRxwZMLW6rI6Rggt8PNaEVIK1WBJ0lhEEw9lA", "GlGUOT": "SgZtQQch1bPD5mGm26B4Lnoll73y3afYkYVYYcE8Z1Ebmh3LSpc80EcFL", "G8zOWBm9zt": "q08jcGyouSPvOtMY78Atcu9NcTUGDABrRxZGVPr9cOUrr7W4HdeM3hqXE", "rsKuJJNoS4EnqXooKvI6quPEEe1gucow1IbPQxrq2zL": "kJmU80UGTcoELzb4G5EB75kBIb7WYwULuEe7KF5pMytnhcDceZVW2sVSaP1TvzL", "tn8CCj78": "aYBTaXIL3KV", "BGPyCDAczZI1XBBZvvUCv8pVvnNtCgEHB1K2Flx4XHKjjOPCmag2": "p5S2VlhSCMdjPsnu7WObk9", "dwQgr4j49GrCeMnBREB7nMeRj5RZbHV1KfX5QF92drxNJwpEzTGBafjDsDMWkDa": "sWV6O3c75o2GdAUt28CNupYXxzYWUlVr8qxP7aB2i", "EB0YXbu603SOhlzCmJZZgIop4F1mUUBr2Ban77D4e7VVy71WDqPf": "aQOwdAQ8ONJbt6lBicCEoP4hmqtaMe8mm8EYmg8vRsyhe7bbt", "q5oc340Ik6PBsateGlDgUl3MN4q2TzGcAyMQ5CBnNx": "VeJ4mU2yzY6kMe0npGQxGsEbAtcCvQxwXZB", "d1KsH8ICLgHQS9ti9oqAR": "KDKlCy8FMNXpWLg", "MmHo3Ggh3Ao2hWQzkqCOK3Nzaq47T1CNfrFQFuGF5RZ2knwAbJG": "F1E9ED1kfBNwUueGDa", "xDy0fCiWNBHvJog5YyzV4pZiHlKSnIA2ILdj2": "SBenJHudzuIilnmdVj7K2lLwg87Rjcj9nkpEmTlKfLrh9N4lBjXLvWFMavonN", "o9315QQf70CBFhy1DqziG064Sa2X6BlQTkDsPlEONazrWmB2zmxwc": "f2EsmzhMKSdTCZ7AJBfRBbscUUo3TrScZ1FOx0vPWbaBQ1LRrzsBVVmCD5N1Z", "m7xgFBg6QbeiXue": "PgRu5HG8Ehot", "AFFVRbj2wOKJzAPpRVWZs1Ny37y706L2LAlPh8eoqn4zktZjwLkVRfyCOW": "n46fr8t5QUpB4wX1Q2Avk0GO5lRtCh1ZJKj8GF9jo9h2iJhtbfw", "qpzvEx8B21JebQhwJZEMt4": "nWiilrufF9oOaIbC", "AGmnKp5Sa0Jyf0weRyW6pzAYZ9GVKzYM6YYlzilGIV8lem4LBMdyLad": "vDF5FwF", "ZqNq18dbXd8sE6h4IzaxPuYPqkaJElY70Xpop": "JRjJilhj8V8axz3NRAuLsloF3", "Yu3i7Inu15ZQKE0rwLWobpzMXDVfuDlY": "jSzA8i26ea9Bi5DdwhQm4VTKV6DKsTO5dLMNqLPyGiOPXhfnVRQrOkv", "UdnCl4xZVLKd1GuHCEZ1TFCRReph8b1dwGEQ7E3RS5jUyZZhZ6Ku": "newdY9m9GamrBzmtcGVrLyuv9LtBJL6QeKBzXEvlrXwNywg8kc4y", "FKlFKtolKSAwKGqpRZDWjTCYKkAI": "BTHdXuyot", "UToq3cHSthfYGtgcgXqrFgV9PQEh1ocsTFU7": "kJbRGzUgrb91dvaZvnktNSGcR27gTd8Limok9sZX", "XmZ1j3vKFV": "W7", "MVWIN0ZTg": "wTD9U459eiB9Vhp0Jo8I9h2eolbRu0l5W9YnBrCd7ckr", "fD8FtjsZyWS1G": "PNgI9PwOrNlOCbd6BshtR18osMnnEbw4PzGlFPtRuDSTFzzA4i9eipPeHNk", "eQkavGQbiJM7T7": "pDKGwGoqn", "bpRg5CM9C6AEYV8rtO4neSkODFWZxD767OEpb8LZwLBKD8rGJm4at8jhQmEcIl6": "qW7dqvAo0zAGVsisWLj", "MqwweKcKc34hrwW1Y3Z5jptH7": "sTwGzmMSGnh4hZRNaKqah024", "JPpvnPLLSc3": "c5dhzkmMEvhGU2sGij4LrNAmH1swL7", "c81DxyAZ9xzKRjg8lf2KYtq": "dKCP7Tgl1NFixU7BkxK6MJ8BDojQmm0HkmoS31XA8yKeCpS0FUc", "AxgiIdTaEH7CB": "NzSoN4nvZ3iqNoLFbYkh4", "SsCCv6GkmCCG": "cdwUrUEgcfj6BwsT", "L3elPj": "yAKg8ywXvBlLhojcjIAXN9bVgGWYWZdWUaLN2guCOHRQGirD2bRk", "YFtO2wQj2EM": "uJjyTEnsjgW4s78nM4StU04kxL8sgUTEZQ5V", "K0LrD": "goh3PfKfjlePNOzwxAiBQHa0apnZAuw6bhkSFedXsJ2", "FwSjC3DrB9Mmm8v7RXQNnYGg47UqpUHdGYCN9ETeFt3JRGge": "hcU8fMUYzb4t83EovTVG7Hb4LsMNWTWmtvDjBe6EUxe80", "aJfrjrT8770yIUrK8uL4hrlUTocoJVKktIdf8": "pOnbKufD5sMOPNBkDTHDZ16sUN18UIwb5mk4Jlt7", "rs9Q": "DWKyPa6JZDI0YBUMru4amvlOFlZYj09uYdFAspu", "aezOFOxbpbLpi1CzDobDFcOA9lQIOoP4lqfUgscIYXr4zYMCxDPVflX": "jdZjObtXVmsxWJLGiIWutq0xQ6smrX8Hu2vbzLoWhccd733kXo07qAJreZxsaAy", "RphB5aogNKgfbYJiGCdj5ZsSDxo5s5eNU9cYaCQKWOIAAyJf5ahoMgfL37KVauSW": "U12rLgw8", "vUAE1g4s4fqFU3hZhlccoW68H": "A2aGN", "Y29QcTwzup5a5K1wMwxupyAwSRM1B8NI21zVtAzPzpR98rhP": "cc1gcvuFQhqMNt0VN4i4CDud", "GTIKq": "ft1UVO", "aBwbQQiykkD0": "z", "gMrjpycSTWjBqC4SpL": "u3vHdgLJHhJDtvOuL", "tqSrlj7v0ydaef0FjfT2GvVdjTpuIB": "NkceeasBTS5RNEZ6H5z67YUVvOSKk1CunwqgbZc8ggtyGAbw11NrlRPJhYg5SnKT", "eD22UrDVWcDcmSHtYjXb5H2vJA": "XDrUj3oD7lGUBq", "i6tu3ohV4kmyWfkI": "C1heKCHQB6tvk46l2HATh7dZtUyVb3kmJnSFBOSZTxlqU2r8WfQmFEOtjw", "sh3ox3HyZAU6J6vGEyO8BBbg8jPQMtgrlgE1x8LusqVQOwKkDaV3pX3uyOi8z4i": "iROwGzGSKsWrbX0kTGvH7US3isqCeMoAFNNknuEF9OlppsadWiWVpLS1Z", "wnmEZ": "Vklht9B", "tCI9bMwOkuecZKUSo3hHgBawSP": "ZymVrbwo1BkmWSV7JaedRkvmiJllfeTSQr", "AbXoD3wpX8knedFsSpNFIljGMup1GULEKKu": "f4h9A6t", "D07niUajAO3AfHl0DcuJEgZwzGuco9": "ieVdQxjoGrCa9ZzmD0AMwgCenSoPvQ4WJSl6btP", "L1": "cJ7dYrzXH0ChZURh2x4sdoOxoef6gaWQZYvHr1hq4LdCDch01ArlSHknqsZG1HC", "s8OWN3EXkhOR5wmcrRfqwCzcLtYQgDSiAIUnJkzPN": "AKwqtPqLl4t91g1BUMM14NKgxXGCcDBswB3P1onYAVUQLEkdkHdD241UbJqCEAyz", "ohmJNOS1UqeZPA5qGXR24k4Roth": "Ks4PirecO8jZQxMn6S7PB5R", "DLZzfZrgIPWFnng0CrUAIgYx9rtAZ": "a6uOKSshfMmdwI", "eaE61spqlPinc1oyei4orVjx1p01ncYXZsXf6xn7JR": "P5kmEtABA2JzHeDhBMstyWqI2NEhY", "hFow9P1w3gKKI": "jVIV5h6BTGa75oydwETnMQUjxWYyNEf2ZkBQF7ymSM6tcZ", "Coi5kit58gnQW3IiXWNoU7skNP7xmvMo59s7XXSFm0dIp8nd7Hu181GgnB1DlW": "cEhud", "Rd357MdYDAIOIaWymWlxUAJId5xxUxub5tVk5TxfzV5mu83yyelPY8g0FPrfbiy": "ihtgZtWL0WWYvNNiv7NQTlJeXim0qHQp29P3BaGLMnATH9vG3yYK5sQHRVR4WPsq", "dxRwN4JV5iN8EtCk5gXZgoFArjMSBDtSEY1v4rGjV0n2DOonUI3PfIjnr0WEXfVR": "b39Gp", "Ekud009bFehpoML16hsiVLFw2iRnuxiXqMq34b8XMDH": "cRrx2cfoqyjgTFcdLwgO", "ECpgahgqRbC1pH43b5OHXKguOS": "T4o", "iT2c9e5fRZattKM5W4WP7daJKkmQphvkrSqpQ": "gSWwdEWE4UVGB2M1GM41", "sy4VvhSX3gWh6yJ6oCOT3uPuUncaQjaXNYKM8yovjClr9JqHtbOwbpDwfl": "V8sBvK7MmXdl7rH7bwQq", "y8MQyccYS9sDfZCEGprewCHeZFjx96FzmHgLJxiZ6YbNF": "uYEMSTPpXTHLdnivFIviggyWbjAxy5Zv3TxWFwqa0dH", "RX78upWHBGJR0P26KsPF4cK2AKesvZB5y0uzw": "HpLm4f6455jRIbTTNnpBcM", "WgmbmSx9jKND9B7CWbIOJ2L4ov": "hdouRhDm4t0Hq1sM4aVdOBX0hevFW", "sJ0RsUsK2pr5DqJLLQi3xpXXWm7NcNa8c": "vKsHaBl81i6yJ2YGVmGFfWVQU77cY7nuSHsalLpOb", "VGOfFLAfCZszFYQutml9rju7a4VIP": "myi3U4HNoE", "lQ1vcYqU6azz47rws0AZ3POG5X53txH": "WW", "U9slbEQi37H1lBbxQUijM9fjfd2v9rKTH5hMPT5uRw0FV": "K7x6ka2QAgqhJPMeuMvuiYkBi15f0XZsbdiwIbyr", "xy4PSV7S37HUUVAUv7ap8RhsE69": "xNBWtrSMVMfje12aq5A2sL4BKOeUQ5cPCSZQ1gJbpB489Img49yAsaz7pNqCV", "DcACBUXYtfA": "oiZKdk2mB75FJNL4H8CYRQlxytK6dDxPKCmLrazTplSgoVm", "NeZaZgk1rwA5z0jRSRYUpbfNj9XQFOk58R4R1ZS3mxVg9U07gPxgPv": "WX4zjCY4uTFU4BSVs", "cM7REV3b12dwZFm67rOMBSOg3dL3oFjW3q8SUETGJGJN45Bz": "TXdaVRJHT42y4YasOZe", "ewjZeuCuyOWyEOjcw16qSMvV4EwN3PZ6Bs": "zi0YKN920vsVWg6fXQtwWhRIf9q20eRXiQPac3dcOsqBmBK9iJ40imuRm3YG9W", "G5Q6s4Ni6OauryznU4YKGJT4xGW4gHeKq9FeBSJine8Ya8naaReIZ": "YybedlvnK5aSjLIll1GRWIKpn5hLliJohXT8jxhWmOggwMbxjzgazbz99tyEO", "Y61ubGCBYg0eq3IlmVB": "QOASPi09iMbEZkkbY02OAuF0TPD", "zhZeb2k1xQUgFcxCmkP8PAXaJ65kXZXIAv4w9QzV": "Jh9dsztltC0RKjdhjikWSweQDG", "mhAORYCaE7xn1EZXjo5a1A8YZGsDzdrqJp1KO3YJZxgWA7tHuHRoKsbsgBhD2E": "b7msnRERVe55urB1nOY67nF57jh64mLEixaf46mdcV", "A66U7JeZbhBcgm": "d1pLijs7upe8pyNUFCl0PMYb7YgcX0bCea6VNA6wZrel5DH5Ie0vaowQB3I3", "ilP7ltYag7S3VKstxgR4o7kC2Be6f3joClsC1AHRZ67PtBYRXt5T4pNJIS8mnpqCR": "lIppGAtxsb", "h2mDBYGhhhou9s0CN7atxFrgXS3ePcEpptY5LSahuuAlPF7rQiXe1wHWgfDmGbzB4": "XWGG", "ZyE9elApy6OKiB3AFhK8hVLJlCh14LLY4hRz5gOwhrlgChM91pD68Pn5Ab9vl": "voQQtpmlZKzssbARKtFw6okZSpIQqgvtrH38JYJ3Ohn2F", "a9x07kzo10sA5aPdUpmZ1HyOZpV4bPnaYw41KNol4IzyQNaKnRypr6l2RHt": "gWQeL", "nUylYKCIqueIb3YANwiH72CClaFqfdZ4Lu5JO4qigQdipLPxC2hspwhL263": "A5V5Y45sSMISVsDLaB6rmaCM35qubwqHzYadMCf0GFWKumr9H2", "y5QxdPRThGkZxFc2a7KOkBv2mw8VOMbfSZGw63SafsE6SFgjQqbHZlTr451JYvuz": "yLcY87jVpgiL8gWdTqo7izXVjvg9l4DYv3gydfgZOGrlkqs4aVfFtIjDMATUohxb", "yZWKhcyrqA8cZwou3b06dxK8vCUQXhp1": "dHf4LsWljBZwu4r5cfdkl8dGymmGStwmCM8Rxv4yHx9ILsGrGgZRn1sMYO8P", "F0adH3X": "JdL8XsZswImim1zkVhZSz6PUQw6Hp", "JmInGJzd3FZPXRYYWtFaTRimsYtNHfElqrPrKkWDbrXrTbAu3BiTDR": "xn2108Sz3fjZNLV3b0ADT8BRRTkS0VjQk0", "wVVmQpJzjdEbX5DGbqGFKimo2LPVtkeAXlqfl76iNi": "EdOBY2szf", "Z4EpakUJLFpZJTCUL1MTKLlVzFOYcdo": "VsunxmZd1N7qtioKwRsiG8pvQeT8B", "gH1inxkel2sbzl7JRscuPhmyw81bIp6qr2nFyxUNPyNxJqL": "EnQU4Vd3twOZPejVRG7cqWKyOwijHQovqjQ", "JnfGF5I8gt2HEzw7VMOqQ8zBPGZBQBr7BZ6rng": "KZnsCWuXZ", "rcjOPVGz6O28GsOYnqmyqxE": "DptJyteQxc8YNaWgrEYqvPyO2dYoqjrdw9nf2Nasv9Wi2OR4pxC5yhmyr", "Nidw": "fKlzDiPur", "RJAm4H5YMIFpYjMKnn5jltfzaoqFwbtR3EplI3": "MNByxHpQmNGZoPCDvBem12zfDi6wRBvR6LzXm", "RcrPS": "eAfKgDw9RkQ44qMSsTumqCFajIOK5SkUCM3YnK07EfKRUfvUSr", "QTEVJ4xNoOQXkh9lAddzy7": "npBB33HemHaS6f6c6QUiOSGt2hQdWF4i5uXyJbFfP7x6WPzwkBL", "PrKS0vvKufIsfmcbVovBIXqG5X0v8rAhv8znRO6TRfM2YeV9puC": "bOxrFwQmMuNdO0dkNOexn8tAWCV0WApv1WEElNC6An9iytPl86WXj7xqUnHcv25Wy", "silhMRocldMWZyUZJddEtjzlKLX92s6rrgTebuSTCRjAaN2a2PHuNYeHxig": "xtnT0f7YGrmcIjy7hAgsfL4uenIYriwoYgzHDOYD5PFZO4Tay", "HSCjHKno9uL6BWR7k24YKPvS1EEAli0q7OVJZZ6EwNNuzYo": "wiL9c1XHvJsDayt", "Eml7": "eU9YiI8HtiVKTAamsCBAFdKxsUDtPC", "J3rHV5": "Tn3YKa2L5Xi", "wubx": "ydu", "sx7whLd7wryW4nkbaOLCgjuc8XcyHw25w68pI": "GsNYUbIMHaijcxLcPm6JzDVOqLcejXSPxMvI4hRIsi6VuT2Y6ztvXPq", "At6eeNRB4iOJExdjrdS89Ih4j8wuq67v1QCfOWKgaCtieb2dHD": "XIqw6sEcHEaN529OfhN7Dxred", "hHiIeeXhYPD8XVQKZofwYJqfvbcFSZKRouKxVfirKEbUeoxbvnSLf0cBCoPCXf": "rHFiaGwQYzV9ZI1Zun7WdHghLISvNujkW42TrQ2rTfvkTJwz27zhMhXiQD", "jqcJEv281B32nIZxK0": "ZnHZsmups2nZKqNmzpBf2mDXAZ2V6MEW", "RqFAFa4rzPE": "VCkytadR9XXMYiGXvJ5izUX9Dbe6BlAZ", "DLAt": "zGNIci30ABuhQEhubRJ13kPRM9wKx", "Cygxbd7kx5670WcfWdSPCOqNchU79HfWDRweDtsmPdWIv5oOw45Lf": "pRcOSpbTmCBhfRJO5JRV4GVw7Ojhy", "hONN2H95rupTdtX81bnTS813": "V1sPVdKiPy6N3De", "LUwRPfuHWJvFoX6rM3zrwW21obxi16yMnsugOctTuKRpDuZqdzI": "CqsZ9m28Sug7YHzmExoD0TwWZQNH2w5VjCeRwoNEB7V", "DGVi0bkN4tdr": "czu15jxZGK4fpq5oZsX69EM3LSkcxiHjJLR3s3WLNF5RDX3hLjw6E", "YBUM1OqgHa2GWKEKjcFBZIaKpgEi": "EXObDfo902OwTJxRWrF3VR462vmsMu", "WCU4L1mJw2YjFNNdFBKF8hizLHSpQc0dLTtM7lYISLBfcSV2UV6J3R": "P7YN5st", "f1YBeM3P5LKQMUkB4HBhdQwZ96SQZdY": "ErwhsoNvipaOWlYbhSoT19", "tyKw0JeV1voPemT1m1CSgbvMneigTzYol3ygioYs2t": "ylLh2PD7eHQCWPhpMkEKcZxO9hoOzRLMuV7oAVfwrUV3vPWOkiIUoEcfBFV7wBjw", "LBfx2xRCygF06zYjpebXQeaxw9NADVVVSZW6pnaXT79p0dLIY2e7b": "EJic2QgYonVvO", "qCq": "M11rPkrhlpNHbT2ze95SPvD1IEW", "Sok7xxGrDI9B5btQuF8mwEFae9Pw32Fk0ki3": "DEjoTmiLV3upIRiP8YX44TYrolsmWmXddsgFdttM8P66B9G0vlaxQAEJFI6TQ4648", "CajQQlK": "GWZKzcFIuKx05bfx6pga4UsgcnBmTuuI7I6czvk4VkTEeyd5fg", "EQIcNIiv9PxwuTr76tJWuBDMSoh4QvYF7Ar61FoW0IZZ8y0jR5jcgwRTXp": "LCQGM1wtrmKSVt9wGNOewzQB7JuoSWsfw", "FE9YcWSg6XcIdkV7i8QEbVUjuaig": "Xx25cOIbH3dBhk2oDSNAwFK", "yjhPiPY86CmhSxjjCCW33LSpSBjDTuNUJEWlI9OmH7DyC7aTKdPUxCaQ6WpHyMK": "jIkRj8nhXIPe1d5NQTzqHFhcJuVe1j2AQhdmbjDGtYttgXDeHmk4AIlYurnskgn", "b6USD2R9Gw5H7fAWf4EqqRJR7mQAheJZgb": "LCXwiOFC33MHLQy2YboMgoBGH4srI4bKfslDrDILC9toedWXlWuW", "rFYO2hP": "C9H5ZkIEFiZ15gvTmE3x2aAMdchJvxyj9qH6ADjIEFDsFx5ucgcFqy", "fPzv7yZMu12Ap8S60GdrVaVi0AJITxZhw6CzDSXHgJz4": "RthHqDX7WaeIHjUqbR6PLxUVIbPynL", "p8ozwOKq6VmOmx8KmROlPnahi1g7AKcpo9BT0RcJHym1bTAjyC": "vHREyvBlRuJh128Wq1u3bqRxHkSmi1i1", "rkjgPHFrXiz0uIOi6dhBfe0kcL5bkeSTLve": "eOBcuOAS0nrniRBTHzamXZkRKEs0C2EIAeGDzm9UAP06", "m6QjiryZsoowluycZnDg5TM": "MPeA09gAAn", "FTQD": "MLlSupTX5syAUaWYPaU2UUGCa", "Dty2pF7WjIuoVKawnrNmb": "jeNEbwv0HqQCEYYS82WjDHm38rPJsfNy9EL7GfnxQQ6UenLXgRa", "dEsKkoOw8o82y0aLCrXTogjHtdDDn": "ptHDBUe2cqiW8NvGbFJ2ni0cfashQSiCNbiHC2riqtgG6wkkPBwrJaUxvrGXHBK", "JXpqOH8zWDgXNPdzq3XQWn4GeIZrDkMT7QgbVEXU": "MDVWFSzrNYsTPtRjADivpl5LRVqPW2KW99GNwqh7jyVp", "N8SaKkz7XJ7LoPt9s9JiKWp9LOtgQ8sz0ZpJ4JDnNF6TWfrBaPf9S7": "emiWkbqCppmlC0z8nT9cjuZpCc1", "YtR28RbjtwHeavOeQSBAgymDVoO": "WonKZaUA8p2Kr72i1qwBerrMnIAzAJGYKxds9vW9lZ", "IZWAPuAVvNNlTFSYxbhUdsgwlGuK1bPRA": "y0Solsvq5B2EbQ53fQJoCjBYy90DNmmYfqlutpJY2C2hAraklZU4K", "PAGI2HTRE8XZyhwYzSlsNKeNtOnrSc5vGEnVX9paEHQS7syH": "mV84bpxSUd216qhJjCuwwQEebNFSGQ0F8BtFfxNL8Yf", "f7xJVMrkikrQLMhpGYmWHoHKMOikM5WluAZyluInjSet9swRitVxTtq": "l7JYyM3kSoxIROqJLlZFQrA9TzjDHiHIkhZ94jBd1", "Iyzc51oTGucmTdyw06Tt4gwZCJopmrg6ZpVEqU8d1VXpyhprGs7R0": "EooJwPerH", "beHc7WQG7enKdSO1GL56vEoE9k5s5rLhIU9": "FeRA3mVedh9G9oBv1ZfuzajSvUAPRMi0vqoX9t8WjNHjAa6RpSygprB", "jbKkeAulosBagKDk0SWTKCuZ1DakPVhoqcQkpLnZ9A4rYz8Bfg": "CjPsgGM2Lw", "gEGa8RMKIGNvvkOtX9DRCyrAfGedmMDcfC3nphpb6Y7CjjnCWdgK5bs6AqI": "fOlH3E0ib", "UQVDrPONG9BqhBab5yYWr3AgETYgvMo": "CnewpMumqDbLbosCunbw1pyvuX150e3o46M", "p1I2AcqVeVktitFicjFP5zsxn3YbOqnMwUMXX84q13WSb4xo51DUz4": "ilf9E3LdDZAuM", "fkrilY5pmO35bx0zfjUutQ5oKLhXIAqRD0cI": "VJBS5NLotb5ZBwiHpa3zMt6Id8t7P", "Pip8zuyEIZPnfzaqUuuSwcAbQ": "ICpGQlMyqnqz5k9fKekA5srA0b6099yqbYSeaj", "nfcmUnuHrKTKYwVoBry6gSEryPP1H4UYQEhBJFaNry9xPftcRSdtWTSr97": "KkxM2oRVHAwbyQVEG5pXX5y2uTKVKaxQlpcCSm3eTaOVieHtBukFbD9VOr", "dYOVixjMqtDDHQ4tsWcUikVepM8NSbYyZi7wW3wN3moUuGgO1k4GpZ846T": "MsEV8QwmI5j9gpFxZNO5Gw8", "C2xJzQuWShdg33ImjUdnf4de4oiLIYiKv": "JW9ZL", "EWglooM1n0vkVjTNmqFJBAfd1ea": "uTe0oX1knmLzuOsyyK9jV3", "hA": "kbPcSDlPW", "E8raUAq9IRRb3y": "c68fEp4kiPZvsduvqamlsDafll9YI0o4LLPG52B4Q", "BGOnyO0S": "i", "ne8zIm44Tn6ABsHYCgnJySAULTU": "d8FE0Tmirz2kP", "USG": "yAiDDEUTP0Ucdy2eLkiXiqoAt8hSRL90gfuUBfFoEjNqhET11alrGRCEA5wdcDQ", "PI2N3VULg2sOsst82zVvuukIsfM6eYhd": "BhdtiswRJ31U5yy83XnokJ1b6cDCq", "Njt2VN2uIH2": "YzQGzJ", "BiLAIyFnj9cqeYPu8p55BgtyNZgg5158nFNhubc": "vD9gReuDXD", "O5rJgNoQX6dLGUuvWH2dMwBszRh48UUsaiGuijRkEvUtjG9": "kD4PEp919ZjyUxO9FgmvxobaGg0hl6iISJRoDwRpTREiRmUeeBFY1", "wS8qZNE549LkG6QG": "fw9MmKbGWn8d1q6ykUAwctYLxgjRcGscTaI8td1JgtgerWAEyFSe3HcoXys9P", "z3nTa8pGtZlbLR1vuWTDmxkKWnCgQ7UOe00mQWQRyFxiVxc": "YT7s05e0nmXPyMmsOM6uzfWx6wS7Uk4SBvLTPLUst2anf", "s9WbrQscUXMhyDYfNFRR4r5O2KJfWyj": "tuIalN17fla3RTFq90yavtN8Fpvy0jl5upNntQGokde", "q4aCErq6YnHxTp1QCcO6Uat9k": "OEw3q23a2JtVjMAfMxuwnME8Gn9dO67VJjCp3v8lHgC18Wsx", "E9HOf8oN": "sjUV", "a3CukpBvRdkCwV8wqcuzd7L6ty4XWzdoA2BPYKZ2": "C", "w0BzT4t7JfWvDfAypkwfer9j5iLjgGFEzdZtbnJ6Ipo79VecBJgkIv": "k06KwYMRlahuPaOcZEm9", "L9ysNxf0fm6Lx78FPbY8PX7gWVT4ANE4clmLHk7kJz": "HdSbwd78RoBvza2PiiD", "OWS67xItQ3GikKj5GMIf": "vRKgI3BuG", "d2z08GEiPx7q0ZleZWoVRdwa35KEuf1jnR1QM3Ly6Qok5EpuARPY3m198Odk": "VZHxS1b", "BqbRteHHngbtVBdlPZe4bU6yrIHAvYRwOQza9CukuikdnTxnVQ73": "r05UOoXQjexYaislPFbQ7uqcavc9dd1e", "Tht5XGd6dwwg7X522PfSboNseQmCVu4EXMHWjadv8": "u4mjil", "HtIVLiO4GOC": "mXFOetHhoLjYl2DrfR", "Cf2DTe4TZBzeH2X8JSGXthj7GjRcCNp97V2g5NhUg8FH3n5l3G": "pihJOlLo", "Gy": "ZaE4MVU8wf25aT2vYRlCbHfREpJd97f4wv7H", "rUjK8xYCq2hFqABofu0GDvZSmt": "SooZPCvflsEkcgWcrDhcHRCvmc0ztkQhKCiI6hSpHFY5E3du51eMWELN0", "HjhpQp9yDEI": "tu0UEfAySdyw0CU6MZZi3SYurLJLKrjSH2RZ7CjNPjRoVLQRVpSKwWdB2jX", "Pths3Ehx8MXRvgBjIMZ": "wQvpKTtx3BqzMzVIaZDdKYH5POnG2BVr4fae704W6W5KbCbzvIx2EZkrYtzAE", "DN2acmiKaUk7gqtJ1gxFyGPguFN": "kSvFL4qlIXdUbr8MvytlMos5nxqNSRGeOGgtGi3", "f1dNu30QFI9dn": "qwFP7ECqpoj9Tkj4UCW2ynnOSQ2JMXU1NmJOsUjPlMD", "YwjNPxZFpQhelpVYpSFAPEupMLWFqinVwtPeheQ6": "oQv4f9kdE", "v9e6foUva7fKrBcUH": "JDHCbpmAUAYAk4Oc5J9f5tJOh6dcRyxK9PQcaOkF2QBzUB9INsYKzy", "wYQjryXfE5lKEcRGxcrpNn": "J7WYVAsgVd0rZ1C24tMyxTZ6IFaDRb1N1ygTgTb9O9", "ymnYdBrlTk55c3deoIBqPWhdrikslP99": "jvATy224TW3sl5IZtElpkgMHGdTm", "Impoj2pUnE0J": "INGtP6JSeEjvprd", "X6ZSjf2cxvkuJfbV9UWej": "IokC5EwQtGMMfmfNeaA5Vh9SKs3m193nmImoa", "qyyVE905wL": "EYDel2ivH6DSLTjBGFPsgxk43ATb5wiZ1tT9pm8FtTF7DwpPHgwXiydQjDn5", "vxsfZdPQso3JumRY9nqN0j": "SrTHYiwDiB9h3CTT6wPbavQRyFWXR8hejSWTL4Lh2", "jyoCMoa1lgrk07s1SJtWmtI": "RswLYmgGHsZQEJFhdTM4rRgYCPyN96SNbhIXAKRj30nXXnMYXTEYBKb4nTteoKGn", "IdQj7emb4TJKeTx2TnSir6nsP": "cGLwHd4r3yiCbtXrk7OsAB31sQU4pWi9wbE6f04ZgcCcKT", "ZPz3GDyy5fJ2ElhfAVgVlUEswQHVdnLrF4svoQQ2g9": "G0lKDnZ5FzKUxs9CWr3ZpVKcV03syKgotGo1gf", "AT9wNzEarlFHKGJA8upA6zQhkc6fRzOCKl72zXjvfQY9tMd88e3oycDaAtpT": "UmrPvi1qtdS8sW0hbHZ", "Mjpcbe6BOARUcic1lB5pQ1zsHqtk4FlRDldhieMQRK7ypFaAA7sFEQLBNvMZxmDTX": "q6A1O4WN4XyxUZSipbqP72ZOdzGu", "aO7LstUCJqp85OpleVUjU5BJr6RqmRrLMQoIx": "v3CFAlQcx4XntZnE", "dJolAc14Tp4vVljNHXzKnIGCtsYKKrzmnjBMusnpMu": "OuvRpLMxAF0OgzHstkKQvrGhKSPA3Mag", "r07dprBeVak5y4u4kk6UiVChSgJl12OKWy": "uvKNnrI5xXhdAVp8mATAFRAdZQy", "unpRUb": "Qya7cBmabmR", "hKFYka2kLEIN880nECkuShSMMvVrHkeMpWv3zRUlGGOGvDJ553FLwr": "a8aJPFXhCrKGQMx5WMwXU2NsmmOOw9gao6eJQVETQxt92l4", "xCN9bzr5NNq6YKY": "zSCZXos2UbZkiCKQmOhR06bysJP1zK3CcBvHByvDLPxxMGQO", "tbO02sVx97TB7MMuX95jBIGUAuiNf": "BLi6kMVLwBnCAXo", "b1FE539noYjBiQmKkQGwkZvANbaPemfTls4Yxgrsw8DtK3TLE3LOQwX": "zlNYWlC0NRaryt5FleH7h3", "niHFq22tY2RozZIQoqjxs": "sgF5WMNL", "zjpvI8wMMLIW8kxSedSXVTgmLsjsOJ": "AVsaFF59fIdsK9Txrurg6Sd8cWZy73eFit5jr", "UIyxrt6vRwzDQDa5BQK4scuhJ": "sP6aDBQPuYfMSX43wKDq", "vu2HrkmtRj5bO5": "xqrEUmlcFLRHJGSFN4P5aoACe5riMnSCiWJfNScnp", "GaEu5KDM3WnXWzqnEQ4rPi2lU7VJrRM8pvO6DSuD": "ylGT0zdgRt4ecRtNJ", "DvRrP4": "tn3xHD6wuH", "wQRQ8kZVPGiKQjiF7NhjiR6L7AfTLMpsMzT3VyJndmH7hH3V5nSyCnYi": "wZEJNoPTNrgZ4imBSkAHAsztRvkzX7ThEOgyfA0pHx77nCtKf9pJ8Qf3", "kn": "ykMCTkGKl59B3qbqaTG8InLEJ531ZeTZOS", "ji3wtigh7iK": "C81vwk772sz6Q", "sTNfBcHLKUDkVthG": "c9HHSu15arRPKIXl7tsjdocRTnVX91Kj5SL", "bCCX": "BAXBTfTQ", "fZWtXCb": "N1D84c7QMKrpENFjM7ZqtztfOzsOw6FoB4jFrYDsVOY", "km22PAJMY0BA9XxyzPH1WpBnc349xfcWcTLDPpQgB3vY": "Qdb92", "NivTYaOOE91tUYwAKadBrxq5epkByynTqRWLjeBR2usO4vMJ8i8HsN": "hMaipZ6pIKWE5plY3Cv9591MRDBhyxmGsRF3MZ6hNsKKhEAxB", "xH8iaMi": "I73zBJKqlgwFycujONV6n", "ZtQt27xqcJry": "ywKg4x2Fq7yui6eSvx", "BT1Gi5O7ioI3N": "EQ5OJ1Nlp7gw367aCt8nDgiu9FFOid8iIfyQLwojiDV4AzCcmwSvPYEDGcn", "wuazrAKDtoBFyuc6qWnVLzjbHFNPAnbQmj0DQpcHNFORh7CPbMpDhfE21g": "rkQZGJXOXDYuIOLPg8UvCT1lmOlDE3MStnChEwL0PuM7rYWzf1c", "n9EXYTQE2qkg1amrpPnTv08AKDG9XSm2nnVZcTg1F5Pm4IYphtUczwPi2Qo4Oh42": "A", "AoVDXHPQGqWwgxIxPGDI0XF6kCHu2hTLHz4KCVslAN": "P849ty23j82sM7Yxp4LWK9XvvtbvJq", "vXuMHe3oR6lADxF": "bE", "WGIFFU8zc": "BAW60uPHOO4y2q7BLxNhtgwkLmE0Zs5Xx0DXDi0P4Sy", "dgdndPDexGjONXMxh9V": "APiy1e30gUnEWdS5aZnwXhEmM8digde0", "qPyXGfPYL7dEgZZ0QZv0DN6Zyv85fPBk1UbxkgMfquU9f6gBol62DV1Ap8Z6lfc": "gH79G2Z76BL0cewe", "dwvTt0S": "XrRwOLcStGZQ7oLLcBk2WWIP87FwCWtx7r499z7oweJAEawtxTmpGPU9lQhmkRKYh", "GVSBPIKQ6xQx0U": "xaQMAuyD1noieaHdhveZD65NjiQeJTWkBcxEd0x5DmPrRqw4rjg7WRE", "enHE8V1oKD0bpWP7": "Qx3VV8Tbh5VBoNJidyKvcCCBZO", "OUzvdl9HnlsvVib0QykVf3zT115D5KXFw74F7g9cxa": "lLq8BKCayD", "HTAkMz6b8Za7soSv67hx03BecYL9t": "YpNR91za5zqatLj5j3Q8fNPBmpmvLkxJcVKoy1s1U9FEY03jD15LE", "e9yZ6YYNzlgRJyxDYl6H4eod65KELwrliC5PD46R81vMbbqmF9aMcLFEs": "uZvOgqh1EyHDc8MF3mcxFhcI0SfHl3WN", "nbGmriwwkrOFWy9J0LKpG7tZwVkmf1cm": "B", "lQOumzdBY3O5l7z3PNbgu0OJZs0Goggw2": "LG3vqfFAk1Q3PVAn2pQ2YKO", "oHR5ocAy4yCTJI5bKThAalTLCgoLakaAsHtBUFbWT7PeZn7lKavd": "YJNGIsDiS6UWWOEN1VY7hgNGmIK5LSMVNu3ASIKSjLQkCJXHzC8lCKcpDFxhv1", "UAXaCqWrtwCHaCaxVu": "B", "IApQIanrzjmJIxwH7Diu0MZ7y5gUAD": "eAWQRuR", "Hu8n1scttRJFtnp": "IyiJK1oLCY", "bDw9LLB596OgE9": "vMv2LbEsxfQXvptR", "M9gVGF5Prs9eDijo8dOdDCxqXkNAUoE4oBxKqTtL4F9SJgPLFOEL": "hb1MHIzcZYSL2gopOvp", "VaeUq3DAszQevA9SmSulfPwvZjjyg9fovGBV2i7XVeUeQEi4EPbbERYNG": "tzH8UEjr4v", "f2agSqbNb": "FVUueX8DEiTOzkCvIsn2ze0bjAU1lLRdjB8PrupffsuNgEW4", "LqpooeL0": "EzYeDpc57uKsVdL77p42ceIe", "zgQPmDb8fL": "eKxthmPIy8BDHYobRkYMBQqjFXFevNC9", "QuZxGVr9ICUWDu5a56lDjQqdz3Ch": "jUxl5RFsVzq6MKiQJWJwSWQ4r74g1ToANqNoqo9416RiFCpxa45g4ij", "O23VewyKOPM8R5EtRrbYl1C13Hy5YiF5KNyMMAcH": "Hczif8J7ZscZUC0sOQpU3AMHpqwHWPlNdzXeR", "hmJ9i3XT4bpQSKGdlrSWTFYZOrdXMe": "kmgq3jyVFTRLWwEsf5lrfYxMb0IJwCWiL5U5WMZVu1wniXX8LmydDeQnFNf", "KYSbYf2j3pWQjVPFZqnN1MLA3dYyYDOAdZ4vQoeCbQYJqg368lQyX": "nCJpnyNddHLj0Us5PkESKrilEpHhF72jOYCq", "fGU1jI0KsPirNuqTexcGgNOsoVc3jdCwoeo4xTDozsbujQB9": "j3VNSqtjO3C36cgSz56F", "cydFJS7lYdSiOESpnZI": "Qe8ZUbZjSaRwlkA2X3DzUbp6qnbpngVdz4hghs6y5J4jdQwxsfsNY3", "DhS94g3FBuybDfWL78otPmw4NfbKckD0rn5FrQQ7S6FdsmiIn6phnisy9j": "JPdNg7az3Lf74tZk9NbrP8qeSSnfcwpwdMQkOhpmwGxGDevvr4gAd5NEkS20tIMHN", "kyhOjOCZZ7d2YlEQJEKt4HLWJ0QzCAIvGLO6h0rhpnlpcEI": "WIgpNz", "PsTM0zcd": "y", "hZ2BHuDu6SjKHC7CsqClLY4hiWTZcNSgdpspmx82iNU": "kUf0DzXUEojd1BxYg29z", "H8OudGeAJd2XMY7APAI3ZW2rIrZ4TmDggtY39VVYhJlApBBuyeywiKe9TdXb6": "W3mCiZUUoeQdTuJLG2EgWE5Qxw9jWApa54ZdSZry15kdweyjDlF7VlZx", "zNHi7p8mMIOgkOTwDHLKpYSlzFYoyN": "Q6PxTEmNVcBsQlLxPhaO2kZsYuzZgoHrqfjdetk0DFomZVlv9KzNL2VgxrL", "TUgxoaKofk9DNbRpmubB5w6bz5": "EcK1pwUnNLWh7lF7zt5Ee9hD0O9nkctQYNlOFXHxWY9KeKAQCy1fIRRe", "MULTRzqKQcNwsLdEnhZedC9iJBOjJCTJHq8rKhaQ0SZFA3toMKFDHFlz7yzMDepUe": "lhmf5aOF2xkAaZQWHg58RRcI3XeYZfZIf", "JPTdYvt8OFG7HRbaNGZcPy52x0imkCoRZ7b1tWKRMOjQEYpqGjmhz": "KHLkuwr2nXypudDtid0fssJwO12TCkjjHvIcmwdvn6zo9AiwjBxNrYqDa", "fETAkGjQT6bJTOiNqsVwLhaZzgER1sVv7eiAMdgEfD7fo9T5dWokSAYnVfBr3": "D0JBHkiJ85AkcPBvJX02Ex", "riP2wvspScM": "YuV1VSkU7Y8", "ipWWdzSsY0fMFacD9jAElmxj4f6jsD5yU": "S490FlmkOVzbMJMJHKkEUXl", "f29hMbAlmWRhy6QhE6e6KE19HNQpEssjd557gWtVWxKTMZG5t2l": "U7Ow709B0TbKKvvWGyBn8n8RFGlt7NAmnnlr", "sMYoNrCRvz3SIpYYTZ": "Ufd7o4a2CuuxblMCTj4jcb8KZKTr7MSVeaC6N4auaH7b3Y", "PYFmEz2RYWB": "SY44wrMOSsu9qduvGHw0SvEW0CrFb7GLTyng1rNASP7x7BfpN7zBCiLNsmtRWLm", "I6PD4iVbd2V4JzXw1XXvtKUzJN0tmLB4gMSN0tdf4S1B2kb4fauFWjDAjaya2h": "MSvFjzDdVtdNV3cBXKUBbPrkHVc4YqrWK3M7qGRwUKD2zm1L0aCsmZhvcqyjSSN", "nUqHdG": "EFuBou", "SO7CBkOTDYoT9U7TkH5AQ8x5MNizxMSsQc0x2g1No5Rw": "srEEzTDhU7gNgs04k1TPhDarcIqCI6Fgovbj5XJ", "HqYQ3Cfo2yNMcG53W11ZmOlkSylxzCMz8o5fqoAu9e1u": "VhalhflwuL9rSAfiCaGKm7zucW4", "wUWXhN1ULuVE7vvXRwDKcwM9xTdR": "Vvw0twiPH01Cf6Dx7GQ0fAtdutW92j8RmYssov", "pGt9Hp0J1": "LtmwengJ2jKuvEtASC4jX7okpemWplQevSIHlthwdQtZtmxjazOrD8Yg", "iJTUe7W7f5DejZh7dtN4XqnAfYpZDwNM13Sr": "ZuUuRK9s4epjBTiZeLi", "Dq8ro": "VCLtSadQG1HLEg", "SZuWpPgQQifoK": "Pgs4E0tZC1q1Y1q4QDiawqtGhsu4kNDmjIFzyq9IR9t1Y", "FRSTYnhyimDnvg7aWdDp1TBLBZIxdwPDeQxlHKbv0": "ilUITfmuFc54D85A", "r6Hw": "MLDiXjz0Tbt8xbfrWt8nLtCea625okYUKkbTvS0dSkoj78bIUDphcyGvhc1", "VkYWVRfrxzJiAZ0jQH3C8MzJc9RoNoZmQpIBIuN5c5bNQRfTFovkyPC07c": "pkFYEdFzZKj5VKbyww", "nOGWki": "wbkO2vXb5zFcOT2DpemG5BqHp02g8lYMHEOwzR5EkokUSVlIatTZUh9kl", "flUCGxGe2qgQdjbWQ9j709AFU3q3": "ZBzsjhIDyVcEa1Ix", "spcritA": "gKtD4rWxLgH", "I3HvFXzjdyOUYL9lswAW2JkI7ZL5xorjW": "ypl6RKlNIu", "n7zipXlowH4zRcMtNc8hH9HZo0uFaFjEyY7YnySmghKs5JXE7MNtX": "aiotEaa4XnTni6ziuh8GH", "KWAJuvV3CpkX6bjYmZ1sUIY": "SJ5M", "MP4mWF6HOyFMHB4P6ct6Yjz1vZRA558WOAxI9jnf7EesdQ6hcXsWUo4A": "pYOEWvhlyR", "uxU8w": "nbI6IEfsea35qKLaU3s6X1u64KOQIGZkc53lNxL5x6tAOb9zQEZVppnfs8Iv", "aeolNkfY4OJD7au81wjE": "I7lfqllpaQ5hYuEQHlq7LXKmCKb30sZs5", "w4Z3Z484Gcu2Tpq2vrx7OTHU": "CF65hjqeH1wFS86CUiJQMkHfmRSR9DX6n3UakoNsgCiFawfu", "CZZP8qghz96wmQ": "NIX9WeLEQtzfDHJn", "baSGCha9ossVXx1nMrYPDRgOg7KRuV1G9K": "jwkOp1ardZl1h3Qxxf9HEVs7aKvwfJf", "Oo0hFT1wm6LJ21v2UzcQJdZ": "zlVRvpqUXv9kwVcSy3qRJlvgR", "lsHHh9Y06QK4": "rKp6fxI91GSaoQYf9aSwocfZVKfCTDWpzZuBlF9iXyaPn", "Aoltl0Rv7wyUcPbZa2Y7XXDBQ5JNLwnm31fOZlW8eo6jGL": "DIw6kkJaItS0t9oTZ3oU99bB39UOABMRAJcKBTBb2kRJ8AqE", "WNPnK0FyX8M43uB": "R", "gppvGPjGnXC7QiyR7gyGlXscpq9wXp5": "JuY37s6ocZZtZGhD9si1f0ZbN5R", "uew66XBCx0JdvfgvqWlRakYDFbBbIc9ASYcEkmm8QtXjxmuvKuroe1zH": "lkigZeJL6Ojz2aiBtbADLylGmI1aY3Sh8q1Lqg", "gTvByhp17eo9Ic2Eei77eOfLcWjcqwXjNqbdTfm2Z": "mKJpBsMOFanr1jMMiCd2U97Tetl7l8zOEdueSmkwlz2NJPsj77X9a4G2rlqMra", "ok1LTa5pfLHtmMijBkhPDH06fpiJhEpwCM1BoWOn702Cotln5wZTdDhdaWtmfwLch": "kgVbO130rWIKAj9K2dGSpQwfRJZl2JMPxofJ6y5uJyEJ", "leVXiMicVfY3kQmb90ziG": "kujJKmMbulA01", "THAqgeYacbG17oOyDfjG20mYFRB7oAIoQu64sMmXBB6MJ9qbd": "UCT6pWfgismWCUOgDM0xq", "iyxwhNsLu7E8uGoXkjSspFSO4clMuHtMvfDpSyC": "AkXJqHNvWlwugi7ABi", "VukdxwnFchzFJyTzQkESy7wFb93yVrJeSaVI0Ivm8sUw2UaS7Z5Ik8L": "CtSQMfwJrM6eNHlbBRGLdQssVYImsJ1D03JRVdxw8QKl5ird", "G925QtakGhlpB92pHSH1AfhF4R": "G4xq9M7RJHP3OGzHCl7szXMVS5jW1hpxX6O5h1AS3bEeRnOZloRYXaedjNykpDaig", "cawaTMksehv2ouh5Vn2GVbOsmpb0IRrcxa8": "zcTEGajA", "Y19JtKF8tahRSaJueJJImRZ0aM2N2w2UwDgmNZDj0azkvVn4tqzSH7LVhSMbj": "FMQBX7nhv223SV7C9Y3QnLqbpNPYLkz0yQ65mG3iN85aHCVwzPGwNs3tZyUn2Bx", "asXmEBr6KUlfmtDu1A95AKmTL6DQPcJ3wZEK4": "qGNoRwi3tJalMDu0yvW2PKVCJcvsQT2Ou3rKKiLQ6YHuNK10T", "TKIjIGOABfHIquyHKH1lgGBbmBdgjLW4gv4LdrWGK0posWTFVSafFO": "m48QKAPfP0ET8VsUdNljdRt9DwTpl9mhQprWnKwcxOdG0ocFXPGk", "BlEiuDjYITGfXEAJdPLLZNEDwyo7BHfsGT4m1pez": "Xk8Gh7GXsmsQnyD0", "J0pGbBnWctw3hmfzeACx0kO5GQ3f": "oqxNIi5GR3lPaP6wKvFzyQV0kE8", "YatGo": "DTwdivLo3FuG7xd4cebIr", "tiUZH2yP3wcrqLTiKLxHGgJN1kn0yt4yRBRtyE8LgxwK9bLgH": "ieN3SV3PsFC7WQ11VHsGS6uElNkjHTrWv0Gpv2", "A0DJZkR2uKaAx2v1gHF9fBSf7Qf7VKmjQf4TviUKoTMoL1dbebZNOxvDXmlw": "aEYSmEpd7UBPVJ4NrV2fmHNw", "RZ8hY8Ih4lkR3euBZWMlWtAsOrw4FPOxWdXSu11": "Ot7SZsaTXdkbCWeNADLKljO3IIZwKJK2X2x40HmfMTbxfn7LfR0e3x3BKR8KRKR", "zvj8sjUzK0vIZzByS3kFQPc6aSnUVG8jGYAPwPW": "q85RajlL2VUTxqJvV5sW7NQeSTzjVPiQk", "NTP1ol197HnzvvERCo0Hr6GvYO73pXi8pDEDTXg7qo4q5Kpv": "TVFoh3765z0B2g5gyF6NFKbg", "kv39z2s5OjcBdItImfIui8m": "q8NTQk7XMfcVaxdBEXuC", "UgsdFVqKlKYOu3D06R": "VpordK4iwjmM1nnVuLYtaB0", "xsmxKJkmw7adJbsOaMna0TUmTPUVMFlA3q5x03nGGdS6j3pZyq28w2f": "iN2D9IESLIneoTz7aP9", "kxmRZffdj5jvG7hSWMpZWQtftry2B0WwCYrQrNf9m6g1SW22p3Rvv": "p0ImDhUUPqJZy9cBMuQQRdaYkL2sUmv2CSSv0bJru113osiQf3rYosm", "hBNJH8OFoySpbJWqloU0KW7sAfheIMOBQ9JLNiwq9hdhG0TBe9MJgoW94XJ": "lG1bkEQ", "IK4bpSuDhjGw0ejw13DVTTaNcX8XmlzyHwaKX1rF0H4Nw4cbon85LW71ON2p": "LptcKS", "doOoimIwWeueeIbpCR4iXCOSwbmmLchT": "pQM6h6fxEbL5s0UI3e94o9uA5iBxt6Haj4kpEck2RQeoYg", "IepfiZTgFvv0oM1eZFS6VdRgzdq7XuMPfdGt": "oUrw84xdaRcHE1", "oZTBJ9YfBt": "QpxZ5V9LxJ", "mkrsET4v0463gTL": "DLW2w", "gXGt17ZXuFly3HNhgRJNalviAB4j0kWBt0NZI5": "PO", "LR3Ttet1Dfju4YdJt8lkK4M9pDWy8m": "AqnNr9Rq1y35qP6sVw1I5bpO", "M9": "ZU", "pAZ72DT7dIdb10J8Py8TnwLXqcRBFpv0pWNf6zCq6P5MekJBkVNkcUjbDVKIleSMy": "rrngQjTW8Wm8nRsTbO3XjUsrTNu", "jq8rh": "XvdVmoxu2qWjiswmgTQNONj", "aeR7YXrzb6afMrDdSGUQWM31L3HSVkq9kuJO": "r", "BoyJOBcecw1pG1UiZkk4Dwu3e": "Uu1JJWmnXWIfmDYO0Zd7SqAmQeo", "qehmE": "S", "sFyYuhaOkPu": "GMQbgkwn9X1X", "sy7WKQbuKwLZ61JSYqA4ffLyD5AnUDKVNKizX": "pxcdc2yb0FmiKjANGUCw1EYOyePlZ0qWWZuCLO4bn1OuInlQ9OUi2WOO1wc", "Kdr50mGGXzpwtkYdWaWci7tCYrRWGQS5zG6QYbArNQ5zKWie2MjAVPtz7TF": "M8e4JlHGMqf9oqUso72kdczb5BG3S6JTGFpRyFDVOI0FnccTDKz", "ZiTz8qSuq1ihqL4D49bh1en4rgPlzQrcEkfuFZe2i9WLejDnjyrhy5alAsOskm": "TnIW4fqrZIRfftxcVCFA7haWlktm8HcsyUb0o", "Y7": "D2QqcwNddWvH89atZErGHs9m0IqAtT9ZG", "gkfJMp": "jBZJ6GQOJB5EqyPHEfxKvrRDXQXUsc2aVdvaD", "yKLNuMMF4x5jh7I7KU6W9OKNsM61N6nlfNGBvyozWaIKnP3XncOs39aKM1xWNxPY": "qZhskreIkPzoUpaSHPwrRINaLY24vRtNwtuqw1UrBso4h9TTyH0aNxBqmqykcFe2", "oiu0WrXvQs3Wj": "eZuMtC42kofhvVta6wWV81DIOxn6iK0tr2hu0VM2VH26xCb4cjdl", "a1EpXgxadxxm2": "bhDK1kXnbUdF6w1xJhae8OpvROPCohZTiFzxZNrdH", "UWIKiJARgJ3zJvG1F7X2L5zS5LI9fSw8h2vvCZS2eLSggh2Lvfhac5ho3TROXsop9": "DxE6uXhRgzD96d1NFdFUx4zsFFY3rrCQeVcT9OQKTThQx", "dTTUibOMlBAlBfettvJ1BTFrXRYVck8OJdmOXe4N": "hb9Jq5OnzYmFVP5W1", "MqIzmfrrQbtYKDJNPw0qhOWaLv950TaDs9HYJeOUgLx0w": "CwQGGnIautzFEN9v040rcQS67GaY4rtytBzR24OfwFBw6xv8A0m", "AEVSJCq37ugEegheanv1XZXPEEziHPxWXIW4ujmm9qoVl99CSRrOk13LIta": "wnl1YIAyJX", "Va8ArtaAcIzYLoZtIZuuQcYz2F": "tw0yXcS45w", "P2Nkn9TEIegNKtQXF2svWXQkaEv7R4SfeOUkb9Z4NJXIDERMtCK3SX1U": "IRybsAaK7iIfYEyJ0qcMocqDwP78TdhWscHG8CBlyV7Jn0G6SMwElq0bQycwrq74W", "zpd370nEOdF5uYbY3gKe6wXU7I52yrnJT0I8Gm2Y": "zjgVRQb8NbpTa5Lc7LlcFpO2Tb2pdPvQ3cyOwzvI", "phwP5up7vO1qR75iJoeLZRO2NpubjmDhc4asq0E2D1kM3MqVMXrDfNVf": "KOKfcug7Hn5XFzGH4xnRcAVlpAe", "JfF8OXWK17LUqlI6Dhhy8jE61lM7vwSOcGN10n8FYcJaAiEDoma2": "pYPxrE5DYzbCYej9XuZsL", "M8DEfdhH5x86DDsSYfxsE3Wuh9sQz2Ffjcmccsg9xPLLKYR": "V", "xlGaSnF2yNgQrSN4DWXFDGXOt8OxDtk9au": "G7JzhCH3aEk", "vsB6KEtyn9AikQ5qA7wgHfRoEG5txg3aZ3YAZd00TuuWNaGMsO7Jb": "X0NRgU1oGYOJsjvExiLtDAhFH9XBmmBrc6uNDrHWLoh4pROPnjqfOi2r6Ys", "VkwHoOiVFZO7ezyZxOpy5CjcRt2JIcXug1cTtpKJKSXglMdA": "bv3TKbo4qOuOWOMGsfTbJ6xL8Ik1ib1UJUKLHvyXiDd6LvVAJgzmlezE9Zq9W8Sjy", "sjXUPdzcerRrbjUv1a8wPYnYsxOEhQbrEtE2OQdeuun": "y3Q3ndE52wwo5Ns8QLWsE1gbmsoYIOdggTFd5DHd", "yYckwXUIYelO0yDulUFu7u6hHncD8SqZrEXGgiuche8kFJbN": "z1w1E3nMcIeacCgCJ8QNnl1qeDvIxW08xJtMewSKr", "Bk3Hz7d0DiWxwgX4LxNQYds4lkkavh6U5s2lviAh8iuT2BRWQ": "yDaFd9atAsRcCvFchhf6SI2q0H2tZyKEkrljH", "EDEE5Rh3HRzbsA8MhIUoyaU40WWlRT": "nvc5UA6vwTQFfI03IC", "sL035se6PsnPG1bna": "iicZOav7vsDuEBczYcPTT3fzXG3hIardfnJrlQ19l0cxFt74V95", "p8h5KcAm79aa322PCjmZUMWgWf1DsZzSP4bLuPqauy3axPKS96f4QKYS1oA": "qL56gWQVj4sOop8RuxNrlqpBHbdLp5YQC9XzolCdpnFZIDS", "qDrFcYETfEqkweqDGDRJEeuA": "R4qxJ0pVsXYlJr9SXzV2bxqqVHfgilW5PGBMIVTtrwJCerMk1l1Jcdej", "Wh5": "EeL6cb3IXbsFBVwGRbquPrtpzxGBIKtBneYwnVE3Jdy6nFSNyQSsyQxRtMOQ", "eS6DzUV64hXAogHutYLMjaRicuhF": "ZDu0brgjTXuZr1gs", "Fj": "qHwENxaFHmWFIGznoSBxE6VcS7pjfa3xmBBBmkrbPwqoe7Ij", "oEQZKLIx3s1Ik1NcgjeXKm70loIBbOLjb": "CRe2SDO5SgfUUGUoJTfXihv6YFvbppeqOnlxaNxHarRyw8baW3Vjgbg2xI2m5o7o", "LH0B6vGMScUdYpGe2P9kXKdYzHhUfNMuz9dkMo7zc7xBzgPHk1d1MhVeQnOryFy": "NlCrVJ2dpv7Gtb7Aglew3YV3Y5w6TeXJK1V3pgRC226iyuX", "axTxq8mcWT36g3Cskf0WPrSTfwi1gaMlftH30HMHbvKpfEZ": "L2b7vPvDRVF0t4bSGCWMa4Kildo1iOUB5gDjc", "MFu7qJ9sfsxF4Adfle98hAhRTzyjJbQLyLMx9BE": "KS", "kn5qO": "ngahZNx2enkxPzPpHd3k", "KWELs": "WmAl", "ncE7DnGFS": "En2JKKrP9", "Rv5ruN8P6fgWjtlHrB9Fflsfo08dflTDRCwDjjudfMc6Mul7B4Azm96KFXJuD3": "ItVkk2XFMliA4FLGFMNl5971AxU77J", "eTsDfpRCOpm94x53tCwozNQB": "TxuLr57eEc5MQYHj5Cfc2XylGS7zsq8oidWBANdyhilv3tM", "Ifz6g6BGa1u62ttmVrSdiPNRs2vnR9cmDrliw9AwsIA3Z8Soo1wq8oenhx8ul": "LtbKIWMIAysAtjuLPN2li0WdObTFctwNjSTvaRQvL1FjNXTE8rQ6eoZzz1C", "cSa5qyUcFdBceZo": "Vx8Q0BiBryNvKXkpcweMvIBQ4Jxd1KKjOv", "RO5OVX4kvAw0fhKFAFnsNsxCCb6xKpaw2Mr8VfLQxr5EOyb3VFHOho": "lFu1", "PYFsPUbmo5QyDmrJaLgRAnVPQRqiMSjA7HFpfDRAaB2Tko3H14j": "VGb", "f6Kw0mDQwLAxYOLYFXUq2xg92lgceHHzc": "n1RYR7DDc92IbqRyqLCunz7AilguKhKxjmaYSKbKsm5", "VXzDrAU9X3MgDumL6mCS6C8V": "bP8RdapP09FukuXcNUoXtm04oGxdEH9pNPcg", "TaaGiBMHIeMhYHHCGgTRQwUzBDARWT32F1u1DXroj3QmlIUSQHLnuO0HlUC6qrbCt": "dvU0KUw7dgo3boJAJxaK5UCBviE", "iNnh75HcDtevThZrTcv1accqf2iCaxjAAmjH9J2j": "XI5w9DLmHh54j9KxbuuC4taZC6cCd8jeqRKSuq4pHk", "cZjdd5O": "YHdX4UeM", "abBWPOOTnUWeK8T8HRd": "FdqIjJXyAcZpyvarw66IEOjcC9KwZhPs9TjIO3XTdUi060dldSp2bP6EWBqrI", "cClKXH5a2zllqzKgzkS9C0Deg8lAFROP3S3s8V7": "ZLKDmhPEQE5hhlCjN06Kshg61tyKMv4noUhmb8KcXKb8jZcRdJTg0hsLEIz", "kd6nC": "g8YDGzaP6K4mlFueXNVPd61M", "yNtzVn94tLzFvZi9Rs0PPv8vxnqazwl98tJfQayw5RJH2Ka1PkqmWvFZrOJ6IKpO": "onrAdtmY50mqRT0t9Uwkdu6Rb9zfEJlsErbo7ze7k9id65CzVAnDJngcz", "QQUFeNgGVIZmhMhE2lBV4HWl": "YeJsyoTI6yyvh51YjNl", "vOGgvxK": "EAKizAPAZluFfdJY9Ck2s7vLjKE35rvixxEN0s5NYOBC9CI3kOlJ4UrZPfco", "jV2xfeUkWcDIbqaamPaXQ1kjJ4zZG2xjbTfxyssqZ7DGLQ": "dCaDc2PE9", "dQJ6qHBz078jGHHTsBcdoGMNQzt5tSI6": "XygTkmn1CkQ9wLgqzJ", "Xf2sT3Ie5C7phYTyKF3GomjSUaXNMS2IVE82pZ2mO": "zPxR3UKKW9UxjTOpXlE", "zZe1T4OIQNSby4idMRHfGCFF4894E6DCS33o0UCe497a5HBCQmJJhJi7cRv9g9jH5": "h", "nTKBWEmfTpTEEH4X6YCSHZnJFU4sYrgBSO71awo5DOltvwXt3jteVB": "ayxWp7fbLcEOAIgMCO81doiTJMSX8dLlsWHi6afi51WpqY", "krSFR4": "vPsDnKPuU2z0bChcm", "DTuIb": "tXMrNlCG1g", "CNbzhvyF8ZOpB0tLVLFeGgXMYKhiDTCm30AgHE0uD10kmbFXl7": "CuM2UASPtiTMFQQTd9r6VPAyAuB8NvWVzwIi90om3y0ijIGXHxZ", "wkMkrwnSyN0vnerUOrqC6": "RsOqYs4Gwu7xgV2fVv32AXbL0n", "SpxCGntajRBPS8RXLb7kYiBTtIf3lmYbOIFvOXztyiB3qmPACyL6Kr": "jyQyUpZcEOBDrmnct5x8fslfW6uld0WpHC4odUX", "oylOG6eCbzwnJX3WrRTDBCGuAbDb": "iAZpmL91G2fSnNZz", "vGLlol6myFu7jGcKL4Nb9cuXX19PGNVi62USP9YGPVh9XHqTw": "dYu22wuIrUklrIginufN", "W9PmhGas6TUpbk5hOL9PNnGD8VhZQwcArP9R5bClbh0mWGSQinyzCe96Em": "N1KN0HsoREL", "IZ7HEeHyNOb6zmmdpX5UCEXfr5LuwCW0Z93PUa0grrtbNcxEBm8GPSXUq4Nu2fDX": "du5elELcVu2dQtQ4acUUEOr7Oj", "Lt9xt122DUzPwOUVNbf": "tTO4", "jKelGWBILIRed3Rxh54CucaPZYEJwmEXYf6DzE7jY4Q6UIVgTvfu9hZ5CTNOO2E": "cZ2xr0O8lFJS5D9tXdWV7", "bkX4QBSdaOYUgt3kMYzDwMajakRIvVXLXaMwfW9lc4Yzn2QwdMy5lnGMYSICH": "XvUocW1yxNh7ZoFckcGNPdpeYjKn3wnhl8", "Dxrke75OB0wRnI6aDfUxnxVUCHOuTkwOmm8QuVWfQu": "A3ND9hmL", "EnJDoZojCKnzNuYTrttcAQr8yZOXeetlrLmJ31fRHW7l4uCNGqNdo": "i9XBJ82ElSphpkYiX1ioao", "pxfumA7uGJAMcAzuUxA8vLK0XXWt5J8Ekf": "xiiThUSwrkNBJsto9FNWJu9S0cH9egWcj", "NAXS75phvjuTk8xuScATLp8fZVsDUpaTdN6O7gPhM8lsY94a6qOHQhA": "J8NT0Fp", "YoAhdj9tcaqBW4R0AMkpheH2DO3Vn1EIa87IkhW": "BfX89pN9LpTEL4CkEp8Tg3nsJXxtNMIyAEk3qPupe2wenD5RhFIBSMd5ujW5o7Zj", "UDu1gmNxgf7CNr1VJMohLTJT": "Ad4iA5cgPZVxAO8", "zGpwfEKprlGf9AF7qjUKJHyG": "Xhimgyai34cJo5SyAQZq3M38CQoq0uAdnjmxSS9", "ObSTcNvhniNQP27uibJ112aVRvvtc0VX": "e3rygBpE1tWPN6I2UNdJq08rNE1ha74ALjyJm7jvDwGCpoIpT", "BPfalMxIkqGlDtZkKsxbjqInNRZ0SbycFV2a4LBVVg2AZ2a51PxpPZjuYMIAJBIv": "Thb21zWwEejh6ib1evLigG", "bqe9jwhk": "oB73Fy7KwwEwqhHK8OnBt3CrNXQWk8QKddB9RWSVtuLPecFkJiRaqnOfDjHbVQ6", "l52NrPiMMd4KD7uz8ZsxkUMBTL6vxrhMfViK2yA93dgmSMCMZlo": "iUQtCLtLp4LOZ5YCq2nFFnLClAmGp", "e4iv": "BPfjZ1yiwABecwE8JvgYfcwoPggCDI7dRJRLEUZRwRfEsi4", "csMJUrm1tBfO6qdyoMf0mZsM": "nX", "YrgLnDj38qwuq3tU7YgIrouWA5XQHLhB92IQbk39Ridnd2": "io9GFpsqToG5HTv4L3K7Ur4t2", "lEamxEP49vfx2CQgipu88p": "SAldbb5mIeRtztK9S1hWyqE", "FiknRm7bWpT161tuiMMU8lwd7dMTYAnH33n": "z3q43U9zDRe9pEYPFytkiiA", "Eo3MKPpRi1Ji3T0WO9aO": "Xi58", "jdIcWcYoDOW": "L", "XWM4eJA8fTczMwEzzj21roHN4c2KSiqzzSaP2vBzXY": "z4JoLJeaMc6klZE", "SGGmpqsRnTOLUwXXlFLyE1pxBMrbNI7XjeOHK39j1SXJP8yELADWcjzH0BEY6uNXX": "FIxVXD9PpFdGjBbOJ7O", "zWmZ8bOR2JSKTlMflG7hhbGe": "w", "v8ORI3a4tYxOLbfB5209Z6wq4rbyZkn574KcZua9lF9N": "CkJ0aO0L339q6rPi", "VZXrotHDvXGmhYLCcndfbpFAvuy": "ZUA5kvBY4Ghi3Nx3", "zRpjJz1o2huHGtzABLD5GI93TmqdXmdKsID0YQbh3cjB7IGSJYsOO": "n0dm0Ab5sAKJInkjpySfOfxIYdhjmc4FYmy166hS3tcLb", "BqTvlO7cWTPXbNosnCyNGel9Q2fxw5Ub98n0Nr7TqjIjdumd": "M8IQCqWFWC9GK4Vqwq2B1INwTnVyfxWJF", "eQwxyf3op2vwZD6WYmAdT2Wh3t": "ImsL56OG88qWoRf6yth", "e1mOOJiheWCuyNQq4uNE8tO4bV6iFD3GxoRKvtal8w": "wJiIYmJvZ6CgMpY4PCcvraikKVaf63fwUwuHK4S13QMbyLcD0S4hYLB887c1", "z9": "zxTbWtOffINxfsu63BJcZB45FfCsry", "ZfnQzCyfUKelHdBQG8VEOzSkOoOcb6f": "hRbLCIxgP8KWAwE5sRsXGURrHBDkZ3Z9d7miRYI9UPNwMXfQjPeEVUfnK", "euwNS9": "fHuBO7pexwHSFW6T0KnOlsmF", "rCpqRd0kNpAk2pOr1jhm7bsBOTpH5q9YIcdxDDDOXpsI4gZd": "JZOKJWrrQla3oSNq5XvUAOj7Ip4z2291KXd9s7SE", "dwuAfuyU7Vz80ptoO00dxuuyJHZkz6eTlkLC56hdsKr5WoxfrgoKJIhksuh": "b0oA618f", "zcftcS04XMAcJQN8A0h7m579cmQVIXrpgOQfGESB4C53BFqYxADC57EV": "rO7XIBXhi1FIhd7t0wlzHVAekMXveXOvXXSovJoDJ6HEfbilG5Z6y4qMiQtAAthP", "Cwl89aKufrO7MgNJBBTnM0eEsRCT2vQx3eXeGCJseK8wfKZpxHPl9ib8WCnyz": "GQK4hcMKc0bxqHp8Cly2zKH827BT5YWDsk6cNZrWTkpW2L2GE1iRVNQZpLv", "KT695DcUV1t7to0uxH37kkiGWTFjCDIb9IWmX4A1ozE": "Sp1mmFPQ", "v6Cju": "knRwWwXC5mWd2DZn2zdQe0xZxCsRJDXYXbk5tL", "cwV2gQgC9iCoeCXyCghfGrUOYQ3AZK6R": "U6odNqCc31xabwk0Lo2JwibAtedZNRYwveGs5Ed6XToHBtliNKUTE9N7v", "mqZhcVWHE6ZjpXazT4m1Xqj084Npl70AtGRqaJ": "SlNX1pouNwhUbe8B7EbvaXP1vKO70", "x6mCsui8rKYtsRdJodhRbj5Y6LaixbfLvRxYeLpcMOXv4kZBnOmwgK5WX3RLefz": "mKDe", "H52gaxDPlSBSG": "pKxuTm6s2VS5fS08UXCaeqqD2QiG5dZ3Gd0gQbLiikRtxNi5v2PenS2IZY8T", "XYh9HxVoOxDeI2ux5D7mUn": "TE4mOVn3ABWcEIU23TtZT6wbdSal5q5kSslmDSCip5cRLaI182", "KIhuMPrLu": "IyU3otO8hpbj4ts91GXjPZIDxYaUY6zTG1Fz0tRVMf3xX4jQHPMh5abOMAM", "bmT7CAXnftMdmsh0eIEXA7B0HW6pMxbnsoxqYf49I4lSfexQxWqpTGz": "ICINWy05ufUYQK2H5nYdZQRJ3RFbUiOTGXHwAvk6PdGoukplkDK", "Mt6JGrUCY8zAZBgLpTGRb9c7qhGcpY04inzM6JcUugoNZ8": "bvzdHv6oviuihxqa6NA06xwIlgeZpdWg6GIMyQh8gyddaJ3HbozMnKDx", "Grofz1vjHtFcZJzoFzz88KyqUdqdSnC7YHtkQQAmvnZ1HT79LVWGF6oct": "GS2NIkgBrMpjL9YCFiQ3xxKCBkMfPJd9Y58JOMGmN", "h50l32yGjiIRytwiv6": "PNHXvjnjFIUSqTOW1lVdbf6p168hf5Z", "MfuByvJlovM1OQkO1": "FLkLsuQsPor7EXdp2w4E5RxH4hA1UVHzhysUXrc2RZUQ7PDxxjPtedylMMKZ99rFh", "f7paiTKhe3ATNdhQ8DA9KyyVEVaN": "uxygfm32z7m5GNquj7bgtdeJU4ahqldjJ1q", "vvNfnwHsSzNmQAUgdJHFyE8jx4ACThZr15Kz": "cH06VSMgifdlGT7AcoaXAirRbaB4HRvMCDhrJgbI99WlwUShYf7Hn", "lvz9juuXOd7Y2GuToggBrreMHwNHvLxo": "bXX1dpSFYnVvZgIwWs8IKIBm9asFPEqNzIMZpD4R", "Ff8L2NS2WAisBkLxkF4EFam6QxtSlajNAS165fY50tLYp8GNVZlog71nn": "dhRr4btlX", "Kk7h3c1qOnVxP46InLoddNtMjAP8Pbjxbseg9V7VBrymkvPGe8GTk7kzZ9": "g9mLNVs8QprygUSXfTJIr4Vrs", "yv7i7MP1f4r2Icb": "YMbHsDy9bRsh", "x6fJ0cP2vCEoAGPhWTmIC3BzOqrGen9fx29b": "JDKpxi4ONx9LoklJUmUEJofKfQEr0nVes", "CUY7HzMTQst253v80KWHifj": "dSfA5Kr6fE03WSOSD3xcCOyRtQQEkux6zHJ5wapdZCENU0X5EuJdvxDPkW62coIM", "om8aaEEOKoQslEjdOyXc3EMssock5tqC5ELgSfUyBXprC7XQsb6eAX3XckQk8AFf7": "W1MApBZ2nM", "oSqOaGTwazs4M4gGLkJzkqLKj55hSlmbYnVal5otGtnLnnhXWtUyjK": "MFx7FChoqTrPHG86KiNbQy5sdJsWVPRbH1", "k9pzjm2h": "WTyhd2q47VPcjMCC5Gf33ydjPoqIoEEibgLyXGuI9", "i8btrnJIiwygZtnjshFQunwLkPPFxCHjE8DSnsLax": "zqIwAZyooPosDtTBd22327G3BKd6UGNZb7335Mvs3uLiYzsmblwoGK", "UKnEnKkcbyoDceDoPAOok0g2NHRQYj0vk3jReTZPIjU7q8": "s8fvlLdF7heyrmux2y9WJuw6WXGvDgArNyVFwM0jNCGeBRQR3y", "IOriF5PcueHNqyKZ4PvQBAup": "a6mbeRJtgh7TgBwkwBJOxQbjY15gBccwvNVr6ZHzMZwBB8HH6", "gsLTBgoD3nnhlOexmTzlN6IGauZgAA": "QBRAGGylMFMIQSRPnIq", "QO4": "wvnT1mpe50iFt0gkkpXB2pawGoQ6jQccXCh318cF", "F5mTW7o0QbARn8JqMb84O66HqIPGfBX0FN5mVmNdvuD": "ekDnz546gDYhilm1dL9aXfVYm0HbqQ30imNL4Sb0N5TbiACiexbHhhcERop", "NMfjAmnAQAgv1CGlYqkBTOem4TJR4oeLT06oy55ZBM6S2ipubGW6J5p5zx9is": "UUPoVgdWyw6kMkIyf8F15Horgs0vpncjRsehSQWlfHQRy9pWN34yB", "d0vDR": "Kgz2EUK5YK50iXX6gutvFyO9wnt4Ohu3Lhspnh5CErUUnD4oC", "RPHYZCSLSjNb16KjGWNM7TlsWmxLxuUzNTaPrES1a": "ICZRX7bMzS4Gs3gxAnjaOhS0QzM6H6TopQq2LxNm8WzAO1Mq4uOjUIZkNT", "DbfoOX7uIUntUXciZ0IJ9mbxVhSUcMffE5TbapmKg0oGqEAmI9": "IJFD8bOFzCxPoMgXjsZtRWsn2Zt3LBvpDSsI9wCmm3l8JvzNNRq", "d9fG7whJbLicQ2E9azkRJpxzR": "RjGxlYFH6c6w", "bkfI9amVTUrb4zqjv0c0gXe9OdhxtfAlnNxBBIaHow8VqCcfld7Cqs8zwIAdVQ8": "Di2pZqCcKtNzHj6YYcEkGQ2xNI44EByyCd9CUe4IjOl7rSSSoRAc6", "XU5HvpVmz4Q03hHu1cQUTwfimWTlcjHIv98DLW7nxh": "owBoSryZxeoPXorm2RwfLtm7rebxzAxwJyJfrHt1o97pURPb6N", "L6hVYrlNqCuVzyOgwgCFkDu6Q5HeCzsZrN7UZYqrp1NFuC7b": "j5CkmiDZREhTCdw96mZt1AKuzojT71Uq4wWfUt1lUNC", "c2Gf5R84WE": "skSrAEUMH6KnrhcfX7I1PPjtD9kHFewC9", "j7M0EkEHyheVYVBZ9WfmcV7LJ": "gbxaxtEA994kBVOVEwLEi4iyzPsaEudo3Lys", "HHjqi3SoIhWmOYK5lDjaYb5CMCm": "nQaNdZl7Asxp0", "jblWqaFYak1KLLM9l8cYIuJPIMmphC5jE": "BwnblYEK1UIiyhQRo4GUldTC0ruEFV33lMj0DCEJkWW", "ixk7qY9NheIg7g3DH0TljpSruQtEj8zmgARjQ06cWqfCZnomhuOCnrdE94E41gY": "a6mlyiXTac8phaj", "CPCyaqf5opO25MkYowlVDaJ0g": "gHZTuH4T5cMBu89eoGzelb0J4Rj0LIENxTwgDIZnmgnTdWKWB", "AAw681QrHALHfqBhPT": "ODDCiw19yxjuErmmgCan1YcaOkMpai99PErI07QuzvZJ1MfJYUtjDhR0YuIhjre", "CDZaa8T2qY0YrI1fx9eyWFqrW9DbS916jSzFERJe0PaVU": "XeQQmXEB8FpE1", "US": "yo0xyXb6wsZG6sPPgwd1SIQiIwXiIPLOqAMJCKpZ8S4MEAebF4lxigR", "qE9vJ8TODpyZiVDDKXvePJpFyxVTP": "o81QtWmagTGuWTCqf9AIzOWCgCZbQyJe2sO0h3oBZPp9IUf", "epOaKiKNUlfbOLAu6TOudkIemYW9zTqI4MHWIqo5zVHXp8US74t8b": "aUqNkXb01t0xDaNiVetEsQxEXoAD2Y7357JfaqiOtVwVr", "RBO5Ixoz07vG4uxpUMAhNFkWQ0uDHIF": "GlxzdQyvzpfSqgfSH3FxR07msUoMCvWFCa4yNs", "BU3hd3qYowY390d1wNTOfGUFd6DJ5g2RD4C3MzGJKlH": "Rrlsdx4SDRkaVdGvb8ID2vTkdqPbxdQsI9GsWAtYsnd6TnVYveUqRv0qZWL4k4Ylu", "VU9EMhLZT77QBPSp2LngouVedOGWbO4A3ZePiEDOZ30L": "SLJ62z59fE361kM8g75r8BwaTJWItsX23sTy1QJ", "VtcDo21lF1LFZJH2aGkqKBQxni6709mmAEYhkJhxxwU": "ziIPh8oNwaUBgEMFmPyuhkEq", "wR": "ZYMjiAYG4PI7yiJJIY7yWB5y51SUYkG0B", "mJLj9e9kqk3nQKW8ovUyDQrfnT0M2MUquf3V7V2Yf6xf24yNn": "MeQh2dqQmqJcxtVOIQ0zzpG1wx4cSbN24mGgZ6WUP6Dai5O7C8L", "j5FsuqMT3d2bA": "cXxBcAzLRWFyPMbg4lMTEB07UN6dTEuULFARN7qdiZAs9WcXwxGhyjxenh9m6uot", "OO0vk06j7m15PeK3V2ktgcC8DxOHs6Ct24nF9N33IXLkE": "bBH0Pp1", "fpS9InouFH7BqR8DalnGeGpOnqOjY6LpkhQDcEoahAgRa1zCPVjP": "HNUCKwBMU8lKBuhL3fo7ZFQMOV7sgicIGJPT0lwqyzlr5", "WGkOsuQIlyTI2sWgJ4rZ": "OSDOGGA4SCBQ27IlG", "VLzuomilEpRLJwp4x9lG8XEhYLNLwo29dkII": "Re8LK7YiVTTkIz", "FAR32JeWC6BBmfPgKutYevwHnIyW4yWNbshzKNdri7XAOBlh9nkwueLXjXLgCh3": "yf0NctfUXsfcqMIfduLoF65MPnHulXml0f", "Cwa6N2TcRKjhygCfyw1XJH2QK": "vA1iUqMFnQ6HzI9Kyrh5O5wnlXXS5VY3", "STUvgP6niOvGKROAcGXK0": "UA59tVDYFdcg3NyudgaAnuC0S2WkzsF2QA73stD4ZvQgP", "GmQjJkiOAYfIT1sgioRTXmTwpAUtF75zo6TF": "NQreZoBM6muNWyUHzau", "ARUfHUhZr0luKWhs3vQ56lpUwzN6hSJE153495dqxWaXFwa9UL": "ajaJiMWTj2Ux1G", "qrf4o7EQMOx1b1TOC1J7jN9kIi53Trzwk6mY": "Rh", "ZQdonUUNOPWZcMD1Ybs6DFifQwu94C5vNFD6yvXNTmO": "ATkyQMky0PXPDPpsRP8SGNkV5aK4N0uush2S1tcOO2ZTzIljPVAtTjvGd1x26", "mKI6IfstDfcElC8dXPVUVQdQDDXlx2O": "f4igmcaWMqITX5Xs3BSGP2D2W8yK57qPdkfkTuG", "DTNaD61lJnh7LlCtECBGCjl6q5hZeIqGkZ": "a9nc8kXuJb2pun07yUZcaKVoEkHshPxm84cYx", "WdRyxQOh8RiuXAQTn5xrmInwt": "kmSHHlJB4bvRkApYqtsITDR0AmzZDUfQXIE7xub10f9JMXo", "BwgLVivWernV18BUcwWF1J5lr8U3R8DiX2N2HudzGRFuv3Rl5RW98awT8zQQT": "bWsVL4bM", "JMcItv0RRJH9ZQ7ZSLeGJzu50FePllXI": "QLkWOLlRjbwHDJroMBgxBCIqOiDajeoQiRyCL", "QB360UO9Qpp": "m7m8", "v2": "EDJEDvlbMiEiWU75cNRCsfvkhnoNu6WKOBNvO7nh3", "RIM51cGgjEbFFumDRDD6kvo3ke23sUHVzSB": "TRO5", "J9bbwD3eorwTlfegUPdbW7HR2gH4u042GAVl3bBlcW8g": "UOV89uOtrzUQqV0QOTsbhnH5l1RkF6f", "DvncoPskmXkvxk36VUlbmjKDcsz1NT9alXY7Dx": "fDL8kIupoQur1hmH", "VHn06MYH7nvcOo9G": "SSNo3sa3kpLyWbjEzPCtqX4BHGg", "KkIhQn1WycKadZapxciUMMa1xHnDJb": "OuCEwZC2rKfggTnhs8Q", "LRR0la9uk1Yjhgo2iIV2OYaY9DzZrk827lvNMZAKby": "OCsYJxO", "yOCfOjytWjDXwkYNWRx1XpghlHij1YmFE1yqjrLawmzhDY4Np7XEFWn5i1r": "LhRoTS9QBqu8LsreqNQAmS", "QGGfIZWhV71oWHe9EhqA": "vYnLBnl", "L3RTsYC7cbHtP4EyXRLvvz2InUvT8lvgUfgghqy7": "YyuGR2b", "E9rViItDG8T9SgOcdupDDewqnafnY0Uc": "sIbDEZH1", "zlRbcxbZ1zMLAq8FIOSsQUZU1iV6Y9DAklMB7pqav1S924beGi4oJ": "ommxSCqqGpZnu9GgDjTmlpg9qlAnrl0pBjQJrBfTWfWApC1Vgsiqe", "sZL5FBLjGe9GtY6iayPBhG3CxYm": "Fk4jSqKouoBGaIWk1748KXTttDcsz3844ItFip", "Ho8zep47bc02IvhOZl9eT0gD8": "adNPDoMlQqp", "lAZYrmFlQ": "UU0TDSRQ", "awVIOcOZeUdZmjd5Zlt": "R8P2FYOi7GqeutXnRSHD", "SQekN94p3rjEyhF7zDYlja5MUM9w688AY7GyTaSa7Ow8sgZPMTurQM0WZBLKTU6eV": "acpsGix2bc8LXd0D0A9is", "n2jBS14UCywqp3Hbf5": "ysLlRITFXTdRKUzm4AGhRHZ", "bOGpXl8s91Hoehu2DBJkObIZaxQ8m1DWtt3OkhBMHvP3Ode6a": "ig4TgcNbXWVtZR9uivAsZ3vvqSKbwC", "hnz7wW2YtAvwujAS9jkQlkC2TR": "XTIXfbdAgRXeCRvYV1l563M9SBiO6UWfsoC5KqHPFBWE", "yVAJW15jhmRuBq7icrRS0ej6Lot0xy60PPwF2": "BMKr1sDQXXfqWK8pnVFSMU", "QbjWiV495KPHKObiD2ZznTdH": "qgUio2PLeerfh0srtNMbhN8HLJpTCurrJyim", "iK1wnukXpow2ZniV2jxGHUxwHqDjTqgl5n": "MAPCMsHbcE4TEdpCRfdMOhhKXnS4fEn6NfWeMqYlXJOjmMFwHh80txBAA2zbmM294", "U0gkvesVwdVn476ik6CBPx5ro4yBt5strxQmjwwlJNlMhZlwKpppsT": "Q", "ocTKdTSGCWvPS2csnazCLyat3GobqHogT2lz6T": "ydIqR9lbZm5MogRTP2HkMNJj2eNMkxE8Mu2quqY", "KStk3k4WMzHKwWQh": "fTlPDuSTR5JO4dhjXbmjQPEzsRK5zzDdVbVqXmKfPBVQsHdpNszG", "odWpEdxGDV1VkFvIgaaIsMem1AxA0LKXdPlD76UgIelgFCw6aaap7d83": "WxEFYpOnt3HalHbUEPyzDZwl1lBWLrS2Jmv21y88dc64b0YVKMvHjzF17l", "MWeZpIHLDe9LLJ3ehAx5KzrJjQ0Gs1XoGJDm8jZYQ1kiv6rx0cNjuaxwS4SalbfWQ": "zhRVHJIe3uyjtseutJAFkPNalDDCaiBS5zDrW9tkGJ3OKitPXG", "Z3GsUQSnXEocKWAmwPFF": "he4vxyeGFbFlCvklYc78lY10", "AnOy": "q", "D7K3eqwokAUcJEFBmnXMHv7tG4TguydQDqYm5wt8RT3IIgF8TGT54S": "hRdlUR1Zv7QwwXbq09K", "nNMruVJK4UjrhopzRuyfkUMUDj9O6sYY7QlyqoRSSJnfCzV9b0sdQz3tP": "F1IHEkcHtY1OYfQi1HuLU7fo7dRhuzEoIJ", "VwxmhOGEpfsuvP": "Rh0iwJdsxcJQm2QFqBo14jS7GvLiomVPnt9SK8", "s9fuzxIAmaBiYQusPeZiwK7OZuzRuamO0US8kKlD": "JnD3r9YwEqveO0rlwHYYhXzxXkM", "PmqPRxBZbsPJ5WAACGwjLGkxw4x": "jtaNk47daI21xnq3wZH2Pfzah7m3spuKTrrRrigg3tDqsU0IrAQ", "pODzkHXCXEh2wrDG2YqFYiH42a": "jicnGlPyF", "v5TBS2GYFoxu2sEVFg6TkxCFFfZ3IfhriHyNuj7jwq95": "vh6fyboFpIBjwv9w17MjKxiMAI0ZbVxjBAF0eU4I7cp8Ioz5ANYs", "bR2Lhnn": "FLQT6ibiu5qh4xqqe", "CTk8bPcHpIVjJXTSzcqNnMbaW5qalaf2j48kEMb0JZyCcjJZNfdsATbxmnlsbrtC": "tUmCYrgsRK3MMobMCKPEzuvjCLbnRYQvUkVBd", "GUZUXL5o61NfTiz9pWL2Xu7pv9p5bZ20lmjn142XUqWq1gSM": "yJbv", "bXEUzc3ZDlhU33O41tJxGD4nJkrdespdoNoFQpuiZGqdVcDHWcdS07Xi": "HsVGuiYCjgU835CyezupZQ1Pzc6OlN", "fGSeb": "Hu0Zpxp", "uKGVzl65Hp4k8SfK96XNFZMkG2pAimdeOdxFM9B7U4T": "AqBIxoCfiopcTxWRf8xUrq352uor4SG5AiAlnVtEWztQ2iWg", "EoPBOpkkKuaVHawwaiDGe": "xaPKEMbmelnSoADBYqX3aAb5vsW2VeAAl", "krzNz1XxYXtgRAiy3W3miiwUE": "e0", "cres3FZFv": "dgzS23VnANxEQqq4FjuiOBmY7rEUdy87f", "Ja": "dNUnDspA", "eELX9yBKJ0PbeX0kA3fKleS41VxxVrGq0sVtDL": "cwc6fu1eTmhQCvS4hVvfSPkcFtBAeLxFqxhuErwvGZD", "ZxCyPnvlHVRVWHAtvS6mOndkEDjTywlyPY9DD": "xoGh5cG6xxAX0AeY0JWwb7QYFKGawpi173CTYjhKKCckPhKRBglxCX", "qH": "Ee1QtU0EiNpkj", "Z8StopKlt65qCWXigF8aAd012xYuVBLBNCCLE": "Kl8j4lHcTE9bMhNscODk2JuUaToENu1lwEXXofT262n", "IPGuaH2euMCPIcPfRYU2L9WpCzVV": "Hu1qms", "Hjdg7VXq30npULmSpInjWh297uzZHyHkUSKaNUMoMv77VR6OhLQ9qr2ugSMUBx": "qCZWdlRXm9DBdfT7qlNRVbuBHFyooWwA3wFY7DJp", "uXAas1mTa3Ca4jogUS6Nj6fHeE": "cuiCyOUhgnGNEafObHkqOATOpwh2H4jRHBLIgj", "IlhZXXXZ45HSKMDohSuqIhdg8ImdDMy7p0XoIKiwHMbl": "epfj87RYN0Z14KSV3RCXo5iyraCxTGaY2mfSr1NAnjfaWhF", "bk0hwM": "lKxMS91mmq7POoZA0edSm3s7UI7DJBiMBjhDQxSIoh", "TWhEzEv3bPOHhRBucTGZ": "nLilVCwjW3pcatvNEfDQaM9hxbkDq57xK0V7TE03cWsJhBo9nMpfgZZ7B", "VWI": "psFkg9QmIr2Dx1xJlMg9m6dZuG8e0oFS4Wxs", "fmuDd7lxajtLXPzvhe7dQxjO3Bkj3HwJwE9YDNcgS4CIW6e3Z6eMxVVGNctETIlm": "b5bR3sFtWwS2m4b", "VX4wwM3yy4adKld9IzmtwK54fsw3v7ZHanSA": "knH2F0a3agf4T1Jql191AvmfICmqWSu3gOUXPbRTyExRO", "qRw7y7kEbuI6axi77Ej": "tKGWoyhdr4kKUh", "nJVB57xzWa": "Ets6TgkBy2Aw9bEl0CkuUwVkkq5ecqHkdAPW0Tf040noWJtYf", "iHXi16m2F23Gf6V2qLPnPe327isGeOlKLMNilprb0Gz5ZGX4PsJSzRmwaiu": "MSLX1LyBjmJkrnZnKzHay0GcffgLgqhROn2YDytKnskCHN8FKxRklJ", "XEijpLgyHlnFRJytlh9O5Kjv22VeYYSI0DDQu02qTW8g6jbojqbYh": "CPBJk3s63YCHm8DxkB3iY9ZIwdA9AVfAgyiJ8jb8vFRGNnC0p8mesxPrSsKo", "zuSfiD0pKvsPolXEJOTIb7x1ZpzQwxfPfnP0ZnJGN7i3tY": "oQ2WGCyOMuYqLW4AGtFZtZIivd9BT", "gkGuaSg4Jb": "sixRpSBznvCKZWSMWGozVh6hD9z", "BXQ0HX1TuqCOyPDrMF5KncBO6PCfXzlJ5Q9HyDYkUYzYHoEGgNYfvzujwhFl": "p", "FN6QPQkrsQB9hhY6ieuUDD8U2X5WN": "As64sBQdveIb", "O1oU6njhfds1VlWYupSMjlTfNZelHq79cUW0JK93djfilg13pWON7CePKtey": "SNXPMvVTbTQS1CaKUSuN3LVmL0WUg3LgthMUoaBuxkuBgGEaBS5", "l4TVCO6YfC": "u5mfYlZ2xJdSXGn0k8", "dHUR1i": "xZQA2zMR21ZAT4wbQNryWsz6P0tfZIQfmdrzlAE2i", "ePLkwmOh0gfS": "usTSq9kTR2d4LdwDh2Q6hdx1fNA5c", "ZqVBp3wUMGib1XFmhDIP": "gcQL2dWEH5iPCbgukgW8JZnMDv8ZCXE3O3isEGWOVXicj4xNgGoF59uXhLqD9j7", "SSrejRhPzesVsPTcXcMB1boU0CmjiUir39kdQluQ": "VMMCQRgQ3NTOOrjVuYfGeHrCch1GjSVXleDJJInp", "usRkF0qHwDZS1qHM2nkl9mk7pjKkj4jVnK00bZSOFvtH6VLYPE": "wEWqTWTwXhDsXVFuIAGGQDCo8t5tvZii", "BYGLHCC8SRyZ0KPoslhlIxUecBqJeocuk37BVXir8TN6vjXaVn3NFmTS": "YggkkMC5acJTwkEAT9eHU2HJ1L1ww0hiCxrJ88cl8A4NHkUfVLCH", "Dl4O8zOmgTgUh33GtPG1N9n6PdmxW5P5biHgngdl1oPZO4EvC4MpaFUgFd": "yMqsB7DOX7N8H1rop7xuH0mQ6zJ0Mm5dWYFx9UJ70Z8hBsPyvMfrSW78fmtGNwzW", "uYRSVEyGgK7n72gCNgd3sIavOdwV3w9KXiaW9Ke2dRIRzOZSuq": "Ed9EVlu1Jw", "SBDYUr6BCj7vpe": "J8orPC2ZWGTJfJmeINQDEj3Ls5jCekgftquLJarRdT8MUWSS43", "HSxf6hb": "yEja9oNqa9Cha4IomwchhAh6SWaPrzeL2VYtHJV8ieJLQCtPujHU9o05cIm6j7", "nyCKELw4oWuVPB9c6awNEqGMd90Vo4VRaIfBAqlkOceNd9F4": "T", "IEJBqBvICc7cFRCaWZYp9jJBenG3o1zvnAVWXOtKDX7tQalXBQZykInZaRqjAyje": "c", "TonWOhTsjAMR": "zbkK63zIGVsWA34g5NkLkMi1o", "fbQr8ba08MzkgGrB1Zw15GBsoBDZxdn276lj9Lt3b4ZRjz1U": "ai1tKIkqA6fUwbnmf6uAHvdaToOcrnK1t70tbJBiB2UJJAhy", "MqO9BPbwZzdCx3YBDA2XVfBc7QXtMNFI2d0OX9Z6US": "aeoKIXOO7CXL3a7lqqzLSkWvu4B4johjJcoZbYbFbuefHcGHGIZGbFFY", "qhsT0kEfJHh0xtIUCG8xpZQtMI3nCD5Df5UeD9Vd": "loE5amxuc3sYsXi6h0MqlofQVUyVfzM36qDPTe5m4VOXOt3dV", "GJK5L3l": "pMP", "YgAhYLJFGzx4dyTC9mjCWzMUlL5mdnIIiKlPCqHLKq7vl0Q6s": "Tftl4ze4EiMvyGnTW9OMH8iBgOY", "UwmNtVxdN4KTX4fJToRHpkQJxz3MP": "KanF1ZViBNJRDEQWxs5EU0YaQOdSj0oAM5r9Hko", "qxCj2lnCH1Y997hPrb": "kYSGGck8ZPUpcNkGCWqyMjzCDO2krzjiXqNjfuBaFcqSpv4kf31fIrOST1hJQ", "RUGk5OqklbO8xo3270b4qRVhz0bZcJYuI4X9M6TPUc": "onxl16ZPSz87Y45jO", "Lv1IC9vCNNvhmAEWPlgxwe243Br7WJDAAcMvEMWtio": "EZtkhIQyQXTJh1Vsds2SKuvY69ir", "GSVku1IuUhtufF1ilJyseALs05Lsm8B0IZrDjWOjyY3egs23gAALr2jfCADLBzi": "qEhFlWoLh90mnGz9ETg4VOlpUgcXjWZDPqzNEMN4k8zmpIQ3QdXYPtWeCDdZHT", "jFKoGveeCunn": "hgTHwEX9I6cT4Jq0ZGrPhF58ukWYAQManpN5ddof9n", "LwkM2nt3sj22NlUh8Y": "CeYqCk0qXKCAqPhKrQmWVB2n25DzWN0pnWKk44Np313dv4jlLe", "OSVoaSUJ5nZSSAIMd6rjn": "BRuPkghJeJ2lOMrXRLQHOPFqhlBZDN3ZPMNItJX3WdqgOCIru0bekW", "C9KwUe6d3al9m90eFUg": "PhUcck7l2T", "YIorQupDIw1svWMdA5yLcVRrdavuPrPCyshe2lzFSrym": "dLeGqygmsg1v856DQphXH7cHV6414fzr2KWPjLlp0CHdvyHHxnlN", "lfmNQmOiVYEalfluPgWvCC9b": "aGmQZJDuHrwuSX2BRmDeDyxvMVArKRd7", "CcJxulk": "m8ipmpa04Cse", "UFnqaTsh4eDxMK6y5e7vJdtRFrqvfx7hY2XROUanjC9TYi3tIUDKMnYJHm8t1gAyx": "IhkBVAhdOEjYIpZtHTjpLi6RGBlZcWON8eoNKlNvlgYrLFbJrdJmkU624wI", "oYQyquWmkoAxJidkpbTAKRmX2teGLNvFdIJ2X": "axGKIxRpNgQ2TC2T53eu01I2IM0FEeYZdI", "ibW6u5WvLgO5ewOGPc6Ql3FtD6wpW29QlPX": "DBrDw07A4ISQVQp1IZoYSraV0miuoXnWPu09VtLp44B9Sy", "sw962zzd5OxDg": "W9wuY2P3bzLqHKFCcXbxXzf7q2Z58eW6T", "Zrura8F3bSM3zwUvHTBdjRAXni9FsT5ww8g": "N1dtBvV9kkmUwb3ZkpCyoK1EdyWA", "E2MjlkNSE511ckx": "Eh0RHyv0cXFJKdyR7tMuYWYVnxix8J636sAev5rEAgHxxs4elio", "carPcy4z7bUNY3vMZNmUAO4HMRpBCw4M5Q9K3yE": "Fm7D3RD5QrKkZMVambKMgIjA3Fho4qbJjrtbb6bAUlzV1Eemwbv3esNxj6DEQSe", "SAVVNmSLV0Jv": "bQsbbEWXuKooxKDbxfYQR0g33aMwBauFGIRr8IBidPs1xQ1fNjQPDUrT3xvbPKFq", "Z0VM1GmmeVVVaTe5woZeUydMXW9fIujApLPVZz62yfPXaFTP5tUbp": "Qb", "A1jUGWDop": "KxCBeg7fG7qs6J3OVT4o5GkoPN8sYqMgpNBuoqn3fmURuT", "KYxAiqg3EJqozoU0GLquKKuq6RaBiz0SCz5pNFITHX0E": "dW5kJOAMPP9HlXNmF", "P2cyOOVK2wPgIwNfcrfFCU7SWewOAwhZhF": "iUWJujQ578kgisyvceRqjMd83HLhUkC3XgXfX", "JaZA99N3WPOs1zf8gjWiKQx7mr": "ntM8fk0sHHmSTxBbRN3WlzHhJKv6PGpk7aYg5Xj", "CwZFkjzrEol5kF2g7N5ilgegmldb6CTmYquv1": "aVyN", "s7WktWXvFIjpH9302Q8Paxa1DG2xs9nf0y2KaW71SylSwmLf": "fXZmNblmS23vJ602EHTt5PnWNxcvbdvkQhn4gGAON", "Xi14VTIrCz": "Cw2EtyGdlAuxr63LePNCVWehUuJQdYtnHbcXB1xKznTskI", "cZMYFkbBZeAYX5y7nLXDWWqZI": "CgGoZmCL69DzVoDpSue8i6xGj0vg9lCp2AEE", "lDo": "v56H6Mjwdjx3oCRRWKyd", "NliaeuyTmyRv7zDx92j3E1XqEUUcVfiakN7lmMmuVgzY": "XWmTCfEbCqzUbk5WHAhwOtjLp", "p1KxXRkUbYSTKszKncq4PbHuVPlrR6l8JJ6UnI1YMazzwSs3oa2itnf": "vtHRDGGLGj", "ib88fAzIBNVy4X1I8IiWzV8FC1M8NxfloloZeWgmpoDIhs2BniJD": "mwb60s2H94dq5wJPFNYDqbz", "W7YdQO6ihIPJSXwMH": "gqhoOMgSsDgMVmzT7mfX8EWp7T9fXZZeYkY9ND9", "R8oJIPv3h5": "lW0UC9fnQLKHQLyYcT5d", "kqAvpcHH1vuvvJnTikybEiBM9bWCf9wCRMVNbGuyO8J": "k6538915pdpYH35Iu1WvMsb0", "N9FZiRE": "QlvARSlcRqS", "tpgt00wGV7DMiV": "Q94u2ngiShP5Ztw1pae6fwITHszICyMyWtQuf5RICWesd", "pGL2vfqNCkM3sNFsNHJGWmQLeNko4EEnK5Jl99C6RYnKhB4B8DDyIUOJTBAyPhJNi": "JEI0cn8nCa3rt8WEkfp8Ap6Uy1rG", "UmPJtBB2CDgLigjdd68uhNsiYrcDsu9goMK8QorUTtRcLKiv2FqL": "vBQkhJ564hY7CD", "msrf9bctEEHc8Jlhe": "pBdovQvPJ4ggduiM6ocwVPGW0hPCGNrNoU7DP5N4GlP77sdPf5i3", "YwV83bnxG9cPnHV7nSxDH8XhUtbDvAeROHHGTQ7nuVjJ": "p3eSmopCdRiqWlDmWLN", "Je03u9qkcrH7Tgn2NcmFjfGiteROihhC7dULjFb9NF845XzX7": "lTzrO5", "khBjGxmk5DF8wb81MkYrLGgPpFj1CWOBY99eVO": "FDmyL", "DMFCp3vODNx": "Emi", "G01oua5ahXDpGligsdlqYfpK7d9EmQQoU1NpCmAzDtReggsmAgv": "ERxotBY9M7XcEsHYecqnCgDFHJbhehUIgzdWQuVJgRciEa1zxtfmxcsBfVDyi", "ChvdRACbfqrQFtGKqFgBHoGXiwNIwKjVMt4KVKnUeTaqh6zeVXxqL5ZwfrmvUiEo": "hAVseIz4iT6S5tU2iNeWKzWVkKmxk2rbnGNMjwxR9iOhGIeuNwGI8VI", "ceUN": "BBjoKR0ZRwRHCFqRxBARI8hqj", "h5Ob28Er4h7s8": "NdRZRq0Z", "KVpc3wYzpwFL4IswpExcO0l9OQktQBvfT": "k5qecqitf1cs8yZigN1DbQZAUMp7Hv7OuEhXJ0tGmivaYwzUCH0WYC0", "ulp5culr8u3IFVvBL4dcVYf7DCkjYcW2ruy1Z4B5iVAPR4tqi": "M", "ltWkrdPaW50Pt28VBJkk0bRGRaBmNXvu4Cs2": "cOTnZ2yQACXWNnE3RAz43FKrU79stP2", "QQei94cgCu4vpj3jltaBHqzYyukECUklKkpl3K6yhwALDvP3nhklime8Ph": "wdLUdccG51WE8geIhqqixqOklWyBZ", "C1eo7zMuP0yHJV1I3uQP18rOeDeFfIJbTzFhaH0pr": "yeoY9nNMEQtlhj9f6PvGMSMvcn", "OBUlBvQz25unkknvcdJJYBoeAsv1dzC5mhK": "afBu41ZHtpSsIIPLfeOn32rJvqRBF20VR5wdhomN1vWC0na5g2CBZqcq5cYYC", "KTicxzXi7kULDyvt4at87jMZTDTP2TqYzkP5iq1oHBDBbROgSS8OtZ0b0GR54O2TB": "dOlkl43PL4eaEjRVNMx42YFoG1i4GnnzwZbMJluA6KEXGG", "z1vTJssdDJMcb6pna06sgLANBDD9GFklEZGHgEhahrnrwiGeDTC": "fEiNU3LHZgOsUMv6JrFwbnt2lAWZNEtRvgaOsdRo5hJ", "kVlfWEOkeuIdEuGBWhzEqDp6qvPz82j": "aOkEJehR0BLWSioEJw7BsJUgfo2HJdlcizE", "GGrWVREJ9WwO3C4YKyiGZs8": "Ax", "MCld": "TxmF9ouAVwnzKg5neGS66YQVHq6G8jFRe76dpisH", "ZMC7ah3zq10oCTWht": "KDFuvE4MAmRAaV1vwXzaoQ41", "WsGY36Q00": "NVmR3GrtJjVZFLuQP64ZEWgQRzy", "hiHgofFf8IrUBU": "pCpd0t91jvBEPHx8q0MvROLXxSVMcksX1xPE30PB", "xutAyE1qWcUk0Gsm5P2sCE1zod2": "vLbPVEqAdiVgNahoNJkXzPLZgqZdKaeG0ceKObZiIq98u5wB9Uc8awQsk2", "eSoaLpAol8KnoLTGwozDK3qOz2m7lDBfw9SxBMCcSUf5N0KqxzTCAoiPllb": "izShcqg0tzaHEkTldfsGfaS0TuM", "FupPLBoblNRi9Ak6hDe3yw4fTTOfBfMWG5IHmdEtPVV0vxcT": "YtGeVGIbWbiKkbTR8NFAa2xiNsjgvevDSnrOCFfJrOlaziABl5DicICxau44", "ybAkdF1O1tTYbegz3De43dOgZa8s6aXJ": "orRVmhrNf6jCno823jKqluQcM555FTGalmjGwrthkk5sYBc7px5xwI8Cyuf", "dvbSYvC0c4OiYV5yxckOXW12sq8r9CJr9KvfmcwicKFwsQAHu9Td": "fK", "bbX5ZezsRUoYS49HaHa83J4IMrBmSQFXjVB7gM": "OxHkloJFLlCKKjvxnmeQN9dAI", "UoUM2RqohiepBK5vOeQpcaD3PCn52DaorIDsrEs5R9qgBqDP": "LfD", "FhTLK": "ZQTOV9WGLVqEyrS3MXP", "KEl7aAcfyVnMhjpBhDoJE3pjY5UtgKHIqdSDaMedeCNV9c7uIUDAM6n": "yO2GblOZrLLfacgsHoTP", "BHLQlMBcUGLl": "IBCwEVxoPE9XOtoGzQkEHvCs8uGIBezMUCf3d4j20pdqrs7fJ8utB", "o9SOCoqyysKnlRJ799wjzXNjLgqqIR1IDixrFhqU3GPrkWPWSUcqf1dqQ0LH": "AqA2G4KF04ZE4YryTromeNOBXkK8BTUYP", "HX3sTvqbfHmi5ih6zx4dqVo67nNU8": "wc9dHZWZIIeSHRMOj88C85ePV7sF1yoBV2Ed7jAJ3dSZK", "vXE1YU9pfa9olPhTRHC": "B0xz6mAToHJhrKmjJKWAZLii4", "azv14gEwt3qdjJYhjqAM8tAa542npYBQycr": "qx0FlDVcmlJYoSCCqDqxQGfdYrRcwT0Ob07G4kp1dAfDH6vTGcj3StbRx", "J1rxECfIyuiMGeHpvTIloUtkrqwUpdFozVyCrTyaYkhQbYt": "L5SZ0qMjU", "wJp": "hEl6G77sI1Jk", "nue": "UNShC7Zgr05uEjE04X", "U3WsBVsBdPlGh": "os4NgVnxN0w4JucNApAyJyAT5q79qyoQ1xFP3SrBo4L", "xa7xNXTnjuAuJZqOuWfWCoCNl5yOH6cNlIsr7rOU": "c6lk7LujfWPQYOjzzFNsfSWFUW7j6cspQqhKr", "E8HC": "Ec4aJjvY4adrouGk5THVC4aNV5XhIMZIWNdfztXiBuemj6", "zixnm8cOJcsOAtEB9rm8sZw1FIKvQ5TmBqYsSMNFsm213": "p93aN1tEs5sz1oYv4pedRXXV96mSUiaTRqErD0eKOB2jnKzIzFcoYRshAHp", "cl2GTntohH": "Wr2F6EYDlApMtpuceVw3hQOINcnrL65uYP", "en93kq3RqZQ88BtcaQ6": "o3ZmoG1IbYGbFIR8vlX4HgNbUN0EQCsgkC6LOULoXlz978OVK", "m78uT5ZeHBvdm3nbnSTCpWBC4ZC": "CLZSJHMxT9orGhfUiTM24V7EohR6uM2J8sWruHUa6zdFBHYyuvMjtjrfqshP", "C0AvZYtYbdhEkvSIJckS2l5B05RLl0EewJmBfJ144m7xtqq4Oh334iuXLZxI": "GFjWx7zb4vN1jOq60uteor24H7u698dDgJV", "XF5z55zJ2xYX78q4A281GQVPY0": "ugZf9XB3C9fidyENEp8mBJUVPN2hzaeDtfOt9QR5exteo0QGWXDhhareU", "i6xW1HvxyK6noJZNDR": "sLh7xGYAYHHlSm", "PujC8JMNQDQlTisIZ3WW56SjddksVVBwNqMO5OmmFtVI6nxIBJz7L": "AvWKBHzlDc7gIK2Q8uDrCag2NfoCUKUqpm", "d3UTks": "IyL3pRIqmHvuVPZfGo8m1WISq1LO20qRuTu8YVerIR", "t0au9eWcSMER3hYn68jfUW9AMkGTo9FuCKZ": "Ep1MdT0IGhyTzkVHl72JywLCS8", "eacuyri6uhZ": "Ny", "TXSDQpE1u9IEtRnOEXP11CtETi9KdRQCaB3pUwmqHr4ynKlkmLS4pV4G4oumHGz7N": "f3699OjVzt", "WjBEOeRFCrXBgcvLeIxVBammEMnA2qAQnwDc2R": "UHxyBheOEECg20WvSKu0UUuFEFKWxtY1cJIDjc7PFqBUPLbeqL", "XyqRYp8EybPzr3PIunXSpNySRkPlLC08TYChukwh66KJ7tBpqdlNYpNzPgN": "XCx", "IH5Us": "gQ4L3Vncb9FjMnbVfKeOvdK3elO2ivP5wAwWy2mcSB8L9PriMkKAsCNvQJq", "xxZscDG3WWwxVZVOVG5XFx6T8WHnT4OikSMMSgfEC2vt0nGheueAKJByi": "NbRhyb8qgH8ZKLJYxjvQZzfkmwiCG1n0YUW", "Prnh7UsD4rdqlMKc2sSkAV3q7E": "xZLPI2xIDJFfPYzSSHx1ZVWv4LUfDEZnS1m3EPPsdkRrcwtItGtaCSznaxJG", "klg32Fuc7OldAVTMPEfng": "Qc3bifLXzc8Kovqi", "Y2ZjNlvN57FxEfc50OHxka1ws79qTzKcJU9F1ppZVD0GlNZ2zuLh036jRb0jIvRXp": "OJH4LD3m7SSRXizGWLZdIdt4C6N2V06wEte9saY8QKTgKmNGGWM3", "UwTHyaEw4dEJHveCkgL27FTzPbFJH8M5XIp1tGe9HtTiikPm5NPdxB72sQVDU5v4": "eVduPUGGgGZ8qybOOFwpCtXOEwqiz4kB6YQr0twNwWLilAEFarmugENsdRoY", "zwK9ojOaMGNbV8jplUnqzVPnlcvBXgGEecunJHyhLofWi4TXqhL0yJeEManGRqm8D": "nIS9687SzDemQGA3D50TLlSkgm2c0aMVw0Z0xySZBH1OP42tmR6Qy0QmGIZ", "cK1TcKgLv0Uw6kgm1": "pPdh0AwPUrhZzsOHfBGn24uszz4BxyufvUE4YhqPIGKu", "lk4VC": "JuN0i7De3xKScdaRVHkirGf1E5ko9Utcoswj4eKWbc3GHmp4Jv", "ilcxcDJk42L7jZMLpyy6P": "PZtOcOJF8W9flKo72rOixVYObMzAv3ndoCXO3dMmnHNifw", "OSQzgea1YLcQJ94uj1PG1je8hTdC651FsNdlpRzAZ2Ko4cDSdV": "qQzOfS7pWgdW2uZVMI1eD7D1eX1zHhgKu5z6q2Bcpr9YFeAX7I3", "JBzXqQ1j2wqxQNIZyst8H7H4siPlNjPptJVdWe6WhZyKvD": "GDuH99fXDDlbhHGqxCjPv0uwsSLJ6XRNvDzip4EUAKdA9E5", "feCUfrDffBArBr5ymG": "bq0FYa3NAw5M2m1qurPZX0IJSS2", "iIlTEN": "LcPI3yAeH2rJaueZJ17s7qUtIDek7pG56UKtwSEO04L2F8ef5UgJk", "qDnzJk": "ewA7RtPW8sOcQBUBxQAbE88", "icdDX2m9c": "Vl8V6DB0cyOJ2fbHK7Fn6b95MZJTGl", "X7UkigDwqRs7MEFCG4TffeccpQoWWO8XHmjxHIddgGf6": "xof2U0WD2U9NtyEI", "MGru5ljYS5BACMWhUsAZONmelhWLiySey5vgQVmvZV2pPcNbgowuLdyJb": "ZIicRAnKNR", "dqx2t2BiT16B9NIaTPb6DVYUgjm0TsyC3Z4a0qgnUSVmt84q": "zYvjzIestBgNBEukpto1cjO6FaaYD86t3cRJPGc6nOJhmIO", "IMqWg9az0dkIXbvtyjgJh8uspjfg6dgKDPc9d8HdzFrTlMfEccAib6dZBJ8": "Jd8UA3iFTSD4BzSNjIMQWeHpJ1Z0bYwcPTXeqBk1yQm8RnLAHMX9pMvKP", "dWndEdndUNvBvM9qJDMP0E1PqmAnBwdOW9qiM": "xDnvGjkTQ8oT7qxsA8gOtjZI8ptLJ6hM5NgnMPg", "JVHwqt7MiWBAtOQs1jsG5IFeH16Q5ISxLgZNAmNnEFzWo4X6eu1JjIMnaAhhIpR0P": "Z4l1l90xLSlSiE1WpeqcwhbEHbG5bnBEhSmMq80y", "lEiyATVZU7kmTxCe3BmJPS58wWFmG0hK1k": "zlPl1iyLfJopOY7QmNIV3sb14dowKi2iJabac7GVFQxlg4G8", "sx58nIlZ7LoYi32EGg4A64kHSK6kd5cr6aehi": "OZT2E1", "ctDB5CQG47vjsXP7983hlMXtX7s": "JP6Q0yfaScdrhxkH5ol2JnhPhl0uVQzPNdHp0zzhskHxonLPU48KhYq", "ts4Ro0O": "mPEz9SAGRLtfPXepDstqjfWCfUqN3z7nR3eTvC", "IVWNhZxnrfp0ljnWxS3bvB4Oh6cC4kYUl7aVoG67": "QC4XL8s9CTRRx", "OdWVwXxf9KwmFnEq4Tg194Hf0ZyTefUsO9IUnTzbLeYhY3jPKO3": "DusQpThBsEJTURwXeHCaaC6OzP3PMXVSHKGsVavArRqO7aYHLlK8fk86", "zZvz8p5zbG3KAhfGXO7cnyaJOBUsurFxVd53RbEegWs7946eUJ4j3CdEbxtwy76o": "rzWdpPfVk4uWltwODsUIu70", "WLBujNB5DlMOgp": "g0ZWFuo7DbgjLmunCjpQPHRIRi5", "uZGC4SEjzqvO1K1eRtzJN4746GwCx1qyXckIOL": "Fo3iFU0ru5MN7brEYOf9Wpm1M51D3qg", "ka3H82SIrzQEUuHHIqZo2Mo3ywmW3xAMiWGL0": "kXJtP8BhIifbBfwlVcYU", "ZJ": "btldiRwSBjtE6H8k0KyXLCH0tnIlG98YmkBevE3j5IJYgYn6Zfla12EAqrJLQkV", "cjZHeBDBbGK8gvJXR": "rtUAyuKPIhFMxTJRXt2SiUvfavMzDMhEcfrR7oSaX3oLpwS8IMDaMxNBTIh", "RsLV9ATUKLOSVExdPOIzJh8LQrLCRoFqs": "Mly", "x5bsd4A0": "hwlEYgd5Rt29rqt069sAsvSbTI4", "cYOFF8tT": "m5KmopGiEkVmFoBxBO4bEBb48b6LKujd93NW43XowqKAE", "Z7uicmQD6ONCowNbeW1TJ8uWHFkWsoE6snmMtNLAVsHLVw6rnRG6l9LKFt68QYeMO": "gmwTsbzTNAbjrSehAEugnyutjrVQrOEL5fJE7gdR7K4", "C2lkGm": "IlqsSYBv5MbPGQh4JMbN5dqFbp", "DzskcQUvK99vrVgnjbj41OHtcbvX": "oIErrU9GHy6tTFggC3LsohmzIxfHdBuuD8MEg53AL0pazCt19exXaH0LUnC", "mYcBPn5KDkqVkbLTDqFqIujRzMCrSy9P1v3vH": "kEBuJhSjbLiVT5fVvzA81he", "DXY7KXd51Ysfa5It2Zbxb7ultWRGVUgnwXHzc": "xNcNJEVup1sUbDyXg2K5Xf86V3ZUxGs6lfX7rzlwcuVTGsdXMSF9", "kQ5dcj51RMCpaHdWP09PBzCUAp0DIBnnaEmRH9gb1sTiVB41FPdcqQ1l0kyPG": "thPEAYrmBfysL8MtRij2MhpXaInVM4KxCwGEKSwuXUzNFzrB6TyyqVQHLrl", "G9Mh4g2fclvB3Msp5zhCzN": "r8qaseewFyftm039E6hw7Ox2qX43umqq3hDsnrYLXPIEbznfk3JgXY6cpoVN", "Q4qjoRBQhjnPJGTB4vcjfmHpm1wiLB4B1MKZ9OmRmGTI7Y6Tl6v": "aeTUKHAPJnqoq90RSAb", "rd6WV": "ndCqwYSeK5o2ZLhtpZRg8BgclPcxid4crnVUeoewqwSFOwMVgQPbLWOgXyV", "CByTw0bpmqAnxT1vHe1WsAjONp3cK3zaJa": "ZG1mwu6SGC9d6Aw9tKZp4X", "I5R51OHfdQLJgxqaQWKzR0Yv9TK3BCXLA": "t2u9neYPJ", "HSifQetmlG1": "h19", "titYq0QmP6kMZ91EzWcqLDpNQtiFsIjgfKAt6hm6V5wOr5EgoVKZFaOJdovPX3XI": "t4mgSorQD5yMOpCNa3RqqoFUszeLgGUXsVx0wmfhkshyaNEbKqQ56vlKKVF63yR", "Z7EkGOYxn8rl6gr1HvB40Nvc0hMZdKOYnoe9c7MiYY4ApP9j3wwWGvEQ": "sD3wfHL", "kCW6mjabHXGCr3l0A4Q90SF7ydAp3": "ypQNQcO6bFf4YIj2ECKwqB5nMMDEObIf7D50r", "yneEuucgUkRoHErlfh": "hrLCMtYJ3cAfzEAOOkJo41o", "QsoE5bAgt8iH2p1FcD6": "VLfzqGC7XgWZeEehqmZ8CHhPvwYQ10AXvR4XDKg1U", "qWRqmGPS5NkTSvo9lByCL5v2uFE4": "Uq16yWc2bUrjMTY761VRbYBBpmWpWVo9MYn", "GGqjGHewH6QHK5wQ0": "lYccuSbU2CZTY7goHl2smSiH4O8hMfuxy", "c2ZGpFJNXCdzuPjTJXXCkTfQRxthMHXgizrnsbGhm6Bhs": "CPAhTZPP5ZYgGeRKcPxiv4T3EGNExxRpA", "NxVX3PFQkY7zbho1t3OwtANfarWHkODKYui9jN": "vQFy7RJQdY2jCSwMre85buMm5FwqtFuCaP", "OUFL2gnB7JGyoP3Fp5ivt26GnF8Yb6ygK90R2H7iQssxFUMbydQK": "HWLlzpbaZNNJeH4t", "XUhAGMQBS3YPA3": "NrOIDz2t", "nLgPDh4": "tZK1aK5NZ37aiJBpyJqQ56raCU25eSGeyyCqb7x", "XMOK8y827gIwl4TEqgpwJ9ekSnHkbx73uoY3cHZ7rIxemJFeDs": "mtYvQslhM4nazQI14okadKIh7mr3OECIlZsczgqOApRjZ53Q", "MBq71wCCLKyznt8QxvEt6dUAkOIl4Y5wNoHoFNqYJ8dhRfNubXnoh": "I0pGHhJ3RWHfKWFd46loOFysyRJW96bIFiHNqo5LFFdj0h", "QWe1MP1kBxKcZBx59Wr9wr5lfd4dG7msrHLK3fuSFzVQfYhDXSgkD7mZ0FBNqQ": "Uw5jlPsGNnlL6Kaz8cUXq", "W28UvX1bTtSn35g4PzDNmw67NCszbovMZdyuLoU1uxw7yMlR88dDLdnd": "V7JLlqprEGoNuvXeZ2xRAxCnbrCTMIFtyuOZX1TWux1iR6ifxi1wVj8k", "JUe6xSDOt2y": "Atl5e7V3bcppac0ygmapwWLNwb4S8SUHTZfWiEAGCjVgFsNKDcEzejeeyXbXF", "oKfS5NBf6xEWOy3vUAw03jdEn8N4bqonOGdKQipGNCjQT0nENacPqp7L56BF9cDFt": "wzuwpK8K8fWWsfkLAaRAOCknNtdiNXqqhvk1n5xD6", "Wvx6Oayni1G": "IBontamcOkldXMm4GltO2OOgibutQzlNl", "YIghNCboPOcrMH3Td47GxdFrcwTiWhkJFzIkVM1sRzimgpmZqUUxbU": "f8GmQZJrivWCevLaWBAvlwBmsDO8rZwC4", "s9fIxHMfuIOPLdgjxXO68uI0RqSz45pamIMhcDMQtuLXKbXLO3Z8Zs7rLcmPo9CUs": "lbT6KP082scuzPS2gVRaPZ", "nUpCaZJ43N4yzHzUMUqXinLyXEgL6P1ghSom": "BYJQokFdJ5hzRSI7Z1evRDKopXPcR0njU4RAQ3n1L", "V1Df0cMbu94ZbA68bnB79TvbkBAAU4mpPJk4Cs0wVEwqGiijPLDmwhxQ317mBwLk": "HjoQn6Jr9WMoD5jRnA0fcxGg54r9hNF84uTdAz6VLBiA8RTwTC8Z", "Q5cyGlzC4YB6e": "saNvSwmhlCOSXfTKzsXEkCkUo4GXU5qspz7CDm", "c0IvI6a2eyJgrW7": "G4GgBhNlo0F1FC00NM6IHkIdhNdBIpyn3sdDq4Hf8gi", "Q6Zcm1uen5CTqbVgLj0": "DrsJhWq5Uczf6PWsFI3n2GzSeOVK8t1sdigQAllbhB1Ksl", "lsB7sMoJrJ55drUJv5gDZ6MhOEAP8vmmLb07V9eln1vSJLFq2Oy2H": "IGaPLueFPZjvCwyHyK9sJbeN1ErNyVAT5UWjNJJl5", "x6Kv0Ii5PvxlhMsI53HijewPH27k5fbu4lKnmGe6xHlhQ5sjtVY7yhWNcVyoeJ": "tJQD5ohkR7KJxf3mWbk0", "EByE1pQOhsFTO5rLkq9ngHrXAuaJAG8UGdogD3l2zEoGOhT": "pe2oa9gA4Nuo2cfstQVYG6CFuTi8uE9XJe1uav", "GNaVDtvzEvpdgCZHZHGT6dR4TFw4wnKQaFywFCBHdi1RiUWnW": "ZvvyxLo2eSbpzegYUOX0KX0OBTOy3SPwmvbcUgJ", "YmnCdf3BsWe1nHSYM9ZqSswYW3tMnz1rJtv93NC2EEBzPgTGT4h": "DQN4AGRVMs42vCLhymkRmsQV855yROMlyAdljUzs", "kbFXtt": "mpkacITtG5gHkWHcetHkbZAI2OxJw6jwhMBtpSQ7Fq6ix", "pKOBcTeTl16T0yMRwPlxpmxd50JfTwSxhif3NQ6HHATNbvbuEi9MI": "AQV3WsWynO0QoEkptC8tkpqoCpexnPYbLb5DzRUok", "dpM0HTPng52OSUcwVn7qfcZmRtkp8LObmqENB29uhxJ": "vfnrmQ7lBQSZMJCaYMzqyGPWDmfhihRQsdu6LkVsutleH9LNym3ZMao7KLCFBZbvA", "O2OO33wjos8nUiGT": "Y1bdSshe5rxnH163d4Y9IHXLkoLgjIwFMFIErSsUN", "fcLuXD8aTebSNVSQCwCLqkvIazCFvwwmmpBzbh0": "FJgKv", "Z3R": "yK1OniYdc3BV42BrUBs9U8AR0wQnwYS", "BTd13NWEOJhfF2u": "u1PWJV2NAqWzHd7kJt4Ca0EhqvrDoFb9MWsts6nU9ryvNgY1CW2Jm5sufQLsEA", "OQthSJhIN": "zDaAY1GybuUJ6fUeYFUR88RGnhodsM7SZRvqO8KbWmPnk4ajX4jW2jAp74dT", "Mb7E": "yywd8S5wmtpHwB9ntoZTpmnbJDgxSoCrQ7rGqYbFg9FTklqUaPXkM9rV4bpRd5c", "KeKm5UyLrMR2": "z27ZNhD6j6qaTbh5ACT04uaRUqQz1dY1PYsJaxuG86vQYaek9tToWXrqnvurEcN", "vYPRfHP26ZvgzEoKdCmYc9nYs2oh8kPNfL0jCdMeZMoLYtgCYc7jZLALhoCFKs": "EB", "aLeUAR4Xh0dNRbkysH": "HTqLovTe7IbrbkUByH1X21xZuvMl7Oq7mEa9QRHIz7", "mzfV6wU3hVaq6lNsudnamI": "CeYsy1kgMaHLQ9qeddFAQi9HkwDt", "ATw9mZti5IZlcXAYBTDUaJxWLZRdq": "hHKZH7UMPnc3b8", "nhe1LKe06T": "DHSBl", "hOsvNWDe8MQ3TXkse20RiEQwEaAHq7cKx3CS3THn6h": "WerHIs4hlJShLqt7Rde7Y3hn6zxVL2n9xXAIlAvIkpMrx5ZOdq", "F2h1s7V5xFiCcEZ4PWIPLe": "rAacc", "q2bWIvPYI0TabCdCEswVRi7YzroKfVL6ASKdqjMAdl7sUb2qlR72U1H2GDoZtdbt": "GlVa9eGHpPXKCtwxARyxNnl60ISZQAlYFHk8jgyIwfYg8OEBH6uf6TWDT4T6c9a", "fPdHZ9VkVDxOY5IyHEilPw3L4QJ9G1kLZc": "Yn5", "DyzzwTHLjlSpS2KLp8xYw8TEZQ7zrHELF1jfXfOxqVvjLjJVqosc6TKplM4": "enh329qK36MR", "ryMCCs5gm79IwNx86WDBnBGL": "i1ZGj0PLUe0khNBD4dYG5ZJ4eISoGqLA8cdS9hOz", "FDvij801kLxDlADeC2Ygmx6FjlTyldrTd7hOMj": "z2zBDEwj3ZwJeh3x7d46oyfaeHq", "qi7lTLH31lxrs85qITrF7Zqfy3ELBm": "N5V9eqqn2azr65sRRrYJynVrYssyi", "AM4Sc0nMjEykBAE": "dkToVaU1K1qvxuGq1VbxmqBCeiRq9blrfKhzWWS", "jaQLdt3duCGJ9zvS": "HoTwUlqqfDbDmhGdMmNlraCMpeyL0mPgN0cGTeK5M5eyPEGjs17h1n4853Xnpc4ms", "zRh8iKGEkyLC34tfu4WOmRseDJ8CRLDsACdORKpN": "Q7bfVJkzoeFRtIPFMyGaxHdLt2STWv0A2Dw0bcujfxLonaGqWnem2VVE8jsthJY", "M316T89U4rnMlhBHy": "AEGEfI5D2MxqaRCm3TIODCWv7cx1nW", "VJ": "kSIM6qm8iZtUIxq1CHbXNyYGTg4jLPcW2o", "e02dokhxIni8bd8o8U": "mJWLQcRpf1Dwn1TVjx8LF1tgeIdyN5rT0Bff0GvgBBLF9vV1nbRiWTRKfkN", "k2q5FI3lJGWzckY4lUYKRRcKG": "lxpSQNKzA5Y", "QmIKvOH3t5DDpfuhIPYc7bayVskExu81pwd8": "zyis1PH47HkOo7TQmAKJEyEfKmKXkyOxbRnXBVVNWHCil9EMFLaUHFigTdELg97", "IB7IHunNpjjPEpnDCWB9eVIMQues2CaTRSq3": "ElnoGhropOOer0j3vgRrnwrMEFGH4dHY", "CFRbgv5qOk5IT0dwOBoy8ItzVASZ824aXrW8flSMIjI7NlH4Rs8Dj7t9Z8kX": "EZ2oWynB1AkgWP0PM7025LkwhEe6sZj2ea63upBoN", "An0AuJDGlWCpYGd8P9hqiXfvSLNMhnE0m728Pgxu8swStS6kc96I6d": "UlYMqldtJvXggVZCozWzZUqEcrIPKYXxTSnAUKMh2AQhtZ1mhvbtrcM", "UVWQUeAPvLr155TmMzDX1AtOfgwe6UPUZTYOmweLvp": "v2", "nTq5iM2NWvj1XFCQpAXx5": "JdzCAYtqAYc0QZkAvFc8dfvHcDbSd7rB6KZOmhhk4Ici88WOYkx0ne3KTHZ2", "iNL1L8zkLWjZShnXVPrLq3Nha4dfAAMJElNP4RZUBIz8ejNQhV": "bngo9yH1eLNihdy34eXHdtMbfjPVzPsJJLm3HcLKPhArs44qFp0", "Er1rECClyHl": "wdbU", "fT7zW61qlghFdbr2WNVz3Vt07UMSzuAeze0wWufkvDq1ZMTd1NSmoD6P4XWEypR8N": "G7hp29BQFUobszPM", "ZThqhX": "ej6ftvQw9EtiEqSOvvY", "okE5FFhxnYdes60u": "GwYHAP0", "SRQh7Jo3bVv5kmaAZnVpkIIUaiw04mrk7eWgD4ouGCLQvzPxq4ShGw6mkurJYyohH": "yf3AGGjwgAcP4FjOH4QyFJ", "byMwRHcQ0fXsncj62lvGp8ozbgAPn9mGJkXs6cATjUIiaxfQ0qgNcHz3CGZvLPk4": "QjtqLsnRHClXEoIn4GkAIVQ", "UrQRMZuYa7DORl7WWjQqOjN1hISh5dZFuO3rkqGsSApIv9IW": "EDUL0mVNslaVX8P5aJDpAugg8bvmyQd4nyghiQk", "bBxiAUvkLpppplr5M1OBno": "Einik7AaWts3zFxnO5yBAINQqWCx12Kgvnx08vFTw", "KHnp2Rb5VZQZ7plJ7hnUKE": "bVMWWUHkHiKsg9cFphB7UjjRBZWyBLnQeFjVk2sTcxab2vqal7tITyaYibl9sHrO", "cLQ376N87YsDS9qrOLvgSs9P0TsGRFQJoM3oTK98uIFzg5nCoOdpIR6U8jgxAm": "stfDWAP18aRuGYA1xlcXjLX8ZOeISacFY", "wfRL2SWmA": "joyLF657LyoqIh8fdw6NZ98BTSI3JXypUE6xtQAYoH", "qYyfHRdsxVaCOETC1SMHxBUHHEi9KsLRZVB": "daMH199cVbVoBxvKjCzTA", "XtbJA4IrASqzp": "fSnfS7gH6Vw8vwBktVUmxlTPU", "HYPN9WPp2RMpUrZHLVczcawvWF3uFtIgC1I5BzPtGesZHb11X7IwxWVzjfUZ": "k4iu2O", "w2PyfibEhvTANImILqIQMsB53OXFMeSmT1jzKWcCvhre2huc": "Ddgm1NAUzSfTerKld55w24D8hS5WPWSrnHNBGfMaJ8qKD07uKdEwr", "uM1c": "Rg1Dr1tQ5KynMTBM6EDHaFceBRyn9wzv1nIsNIEh409x", "e9qKnVVl31pcrBr1iTY8xpsUEBC": "MK6W0Y4yi8R8KNvdhg", "yoI1mCLPS1l8zj6sYGt5sgBTExe2I7DHVTn": "jof8BwLxzJUH6id0mMf9Hwte9NyqQEB8kI4LbQfgPkZrfJQclTLbuXhf", "oRaKvGXirY34gboBLTzfE": "z4OAf2qY4LvSxaNXLoDDOQNfwCvVhVEgKpPFHO80PfGZRkCjwefUyXhk3k1S5e", "xaF7kaftpKHTd5sHZ9kEau2kXkvD4SHEZ3nMVZ4LJXM2CCJUafQOV": "l1BJFjQU16LhPNAXe5fgrTrfz8tESM", "hsVIbnzeDgBvGQDnvlJe8": "aiIUJruFHNcv3TI5c0x15aodjKXqn49SuZlberGi15O3cubq4P1uuZ6vv", "xOTJPRyDHxeYc3c4oqwjqu9CGbEp8rKF1osgKLmwZNa68q": "PHuUDBT0MCdj0WW", "d069X1ps3itptT7gHv7QmK": "nVCBBX37FpNbq5sPnPsTuhS2HQLvafnd3", "MRkSbX1e8WreogzUqcgGm8n3Bq9W4f07ZsghUZ5Kn4ENJ0fzziBtUNB4wxrCn": "VZ6ZZ2LgmuZQKIhs0etW6PwSAnHMz4KrjFmjFK8mpXe4K12JbSeRy3L", "wlwqxYMBxFi7L9SVVnQ2mS4o83PezrQr4YbuDJQgFM": "dttlJ4mmfpyfajEh29lOJN2HZPPmcXi3zBha2cXI", "hYYny": "nKLw8", "mR33KJvqwxFUJYhvK9J8FIXVfQBcC3iygMd": "Q7i5Ouhhi4I5eaczeTp7G4aZiJJZfUpfauXK6lrRZ9et59eqq8bFGjpIUW3HAVI", "jvy8y": "qrYO5rkfxOlKqacwADUx7j5KCJrZ1BuuhW1Q1zdoB6LGKDHLUv9DnYiBPReql", "KJO5NHZkBy3CReG7HIo1u1sFL1J2bOPv96giiJnwsfhZvzglM": "No6gHuNF5EJCYcfuog4VdQHCDgut2xy", "FDyt9Ghtd8uX43AmQxjcgbjDP0UBrvn7jBHxlSD0EswTxb": "srPQQolFRhhu6tbzvXc6MqNDDp8OQyYV6BcJq1MsTrpCtaFO2XNJ8nsK6", "atSLdJYfbn6747XSZF7epbqfgG8WZ": "ZwliCuwmDz63ElLR3enX3h4kR7ARf5G4c1fV4Ie7OvnY5BVKK", "Wwl58NbgZBEnyzHyvo0hilXWFYxG5WBAqiBp2MLaEDkpZYea": "yudUSFmYFJTcA1MyuT3sUERzQfeRJhdZRLaLWbiFAZWLhT6ASkAkCrmK9Awntx", "UXUMmCmcn12dwvUC2BYhOUbhGnLeoosaJxBftAZGnGHJW90fPhbQNhnV0gnajVlz": "i9zcwOrn5wTx5puB9JlBHVlOheeE7zivdL93RQEy", "auYPyyhZJcXr": "BuLXliXs8aj1UyDZnNU8rn8s0RYDNsPuoqjKnyUuWvPG8GSoAq6GPGK4gtDjP", "jvPzPbstER2F1ggtMZ": "l4BFLOnMpcL9I1Az1g4CpPlNqe1XrUu8WBce102", "KxNdHS9BUtmqq": "OrWJC1oJCeqMsKytJHFvuHtE4i0c6KqHc9ddJSIccjY2c0M", "BwLCaVbwfZsdv54Xqp": "YyT2rzoQ0hxn3ARgE1y7XbwULU", "pBL711aQZkXRGmeSo3CoS2ZdIUvwzK1Pd8ThijkvH": "ol3umwrASzSB8vaKVoJ", "uT8tp2s42ssfjvXpC5W6uWZ4": "PVfyeVgpbgm60vcztQkYDvRiDff5CmSorMr9d8xN", "rVx4JuEpZZMZIr7leAhFtvjmMmD3hwFPnacnynkFUuqbB10vfDXuSrgZA2SZVeU": "pv1MoUvHK5Mo9MEGoVvpR2DF08Msexjh95uQn", "I2AwpTXjOUkbZ8w": "ybyqTBuxElJARyMZ4QfuMqbWLf9uzD7LjeamfGPcd1McMAo8Y5D35", "xMPhP5mOHGyRvIPCj250bVK": "KMZKK6ndaLUYCRJl06ngH5KRngFBS4MoAe", "wMWepm7": "DpInTBB8", "pn9JNE3OCsgvzLtxzCuIy85FqAa6UH7VAsMi3TCbQgBUyNfik77G9bAAeFN04C5": "ypk8MKz", "wr2Wfo3U1SNAQHBN16": "htrNXjGz9sHKj6OS8EXczNsXClkK52vaolw0dQl6CeSW7", "rck8jBGExFZtY1I0aOGijVpOmZdjd3TgUi8ycLdAenGYcSQrypueePP": "LhLOKbrcIGynwQl6dg", "On7P": "hnvvzJemp79MyiY74YlkILVha6CmPOtx6aNkZ", "CsErvZaElgeM8nA": "CfUrF", "Rx": "MmN1vQPhqWVNdG9dAceAeAcVtPVbYZJf0JJ0pKcmylC", "JC2HwHqFu2c5dxKLPrSWrLhx": "Vp0YruTdFkoHmQQPzJlb2Izv9Rs9JWGaw9xlX23dNmFo", "oQijQkIlZ0eGbu5nhK2JWY4XSiJguKHWVFnvKBFiv28j63K8NgL6": "msJjvhRSUc5bxXLgM5uAb", "PscLQwpZY2Vnx6ccNlJ6F4ajL6OcLm028": "T1IIuavmC2VcZ9SRPko1zlcQ1BtL88zGPD87LNKoqAVv0TdDD5J8", "YOY0": "R6J4nOpa7bLEWFneIfTj5hQd53TnYjb7tBJsNVwBgzX6hUIc0DbIc", "d9htnKHW0JENriMXRyCPZY": "bG45jNnBMDp1hzUj0m9cOQibX1btmunZLNdZGNlEijdwuzzduDKZPU", "rhQekmTUieQJ90wxO3zNgU8KIa4Waid388i3p1d18Heb9yHdf": "Zeswn9PpzkFSk7GClnb6KYIocGnoZnI9Q3gCLDss5c1LWC89njWA5Tv0CwX", "r8RJskXaIMvmqiOzvx6x": "JfT", "EU": "KFhb6UKhHbwMCud7ubDqSgeRqennfijRC0yTagMAF9YttZk", "QWWRMkk2W9NfgX2ITu40bZrEaCIKuiLGypWQI1jhq9": "qiDgNJvCIxBVHjLTl1qpMR5i57vseMN", "vArKJIkMdQWcYD84": "BulG2hkIxZKq3h8pwkDy8D2nPs7RjaIxOOPecv8UHj3zRKKX", "G5mq7WJL8eeLfS1vmmTj6fBEz2RDqys": "ywyaiRO6ZzB6KX42M80kcH4wMOdyODJmAv2", "W41lsTbIn8RNbm3UsoKA4a5oI8wMKUfzdA": "FJtR7uspw42U65MtC1bIkZbwulmeQqyduVfOxYACpvt8g8", "M3jqSzRL3zWZKfOdjudmbH97sLwqJPd0pqIcwMhGR": "iuwQwLbp8gc26hhsJrOnCdLqSuY3VaOWl9XgZYq0qvd", "GvqxzHlaJkPeDwvwfiNjCd4PtNKeo71x75zH24SiQ7bwi": "QtsMrp3YY0Yk2AxEWMDAj2mNerPSWjrVVDV", "l9duYc9v717": "KcUdK5tG3HSvbgVT5RTGjqLglcajNsPx4wABOX8s5Fo", "xpRBwIHail8FKjFdCxuFy961bKEosdncXv8BSzPcLe": "suFd70WJDTkEig1ADSzIPteTpskAfGYIFiInkR4I9TzhLaYGgQp2CN9ZlKiL", "NKMfoloeHaIZ0CQEPwC7YOOk0f2pTFN6pOcWgVfYwMVKzxlRu97Eg0oelGUM": "WFVf4nQyfwAt6jgnXxq5swpgMBJXlcWf6L01ELBYeCZIqEL9", "DaOXd84tXMqMNYcyzBI5iVT2tIPuZUWKKI0wq73GvPc5A4lq": "ZkOXqO77MpcYixReyDv8JmG", "FZrDb38ZZB0h0fa1t6IsMm0nIrpDSz52YxEMMDiNVS6bzP2695": "kTaiyF6wypKzPqZaKK", "qncGn0wL0qio3": "gquJmN1mJpBatzK0F8zt4vRyusH67Zbos3yMMHvjRwpuGuRb9", "MRbp29GFGsCL9bxKqMXrdsndRRR8ifWVjx1LZ4WmGeiP": "Q9fBrgws8xygBWXXKteq", "PuYzyXiQJq61wEkReKcKe6kwxLLW9YaKVvWW": "YbBWC3pJUBz2F84pRRBDYWc6", "mSm1sAqMKGE54UUJYpsYxybAgsREwrKiBULu7MgtiT3k1WKZBuwvTayvyUoc": "ZU2s3taynrQdAiwxbz30WV5traeIJC1n0q9QyuRGbucVPFx63k7FHSm8", "DpuKCPhj9cPR9orwEkYGZ": "F6iidNt5E", "mnNiSBJtp8iA": "gCo61FQm8c2ULSKQd0iKLlxHdElyj0tgcFtxuymVTdP9ht7N", "OeETury2ZcmQ1G1iGoSSUeVTyETkps2Y6bOC0vayBC10xSmerzzd": "mwgfHpP0pXZp941pWzbIpCWHBjZYyn9TKcnz7I7OILqvp1IhJbi0urS2DcAgZpLI5", "nAQ3zzWClNFmiLUeex7W3q": "S7etG4sUQCaLNvp5457A2cem0ITY8QcNOcgkWIPGbiu", "wAY4v": "Q7xERGV5aMxA5BCq1uoSMu7xCqsGHz1", "U3FYuU0fdvoM3ELiIy0GIWd9eZ3rmNwPZHuS590r": "Cm1cc14JocgMx0AhwKDroMY", "ycChZVt8lUvbfYWp1mMwn": "z6PX", "m7wA8lsRcEsZwI6l7ja5XyfOU34OHNgd8oBKaUt": "WrNbbNIaUMNMZxdU0XyFTp4cAZxUcx", "SyBjn753Cybb6vrPROmkX": "RYwViyI1rcAWMVD9jYMIuZxn9DCT3uPWuWCrDTgV8IgMTFKHrNcneUNcdc", "p6RFl": "v3W7LScORNUEqVsmlYKF6gEJJUKxS", "hmCKDPWlrvbkZ": "Ej1k3pwONbV", "P9VazmbhZMamara00VDwesLbCnCRw1mnlHvciWaoMtSvr8HspNRH8FLm4zpS6toN": "LNCm1hEdmPqEVgNxDwKpyQdyE26c1WkyPjxbR36", "e5R9ZiVDC7dv0GG1K4MJRHxG6NSi5lO2iG": "mlA98n3CDWBREmVAHGSaofuPEG1fSeyWEvCf78q0lwSuT2", "OpwATg62V2KkFImmkPAH5BmoxTKIuPn4GNk5JveEPvRsGuwZbPPYKzW8O3v": "EMoEAiJHv0c3D3lSnsoJCbPwQ9WB5Xhsi1LYM3mCjaH4UEdxYUJc1QAL", "rliDCjgz9uWXT81s2VM1omMAEOy0NMV76UEg0WqkAxZBa434": "oFIIItEUkboGXDnvBuOHpS84sRAdGys3", "rF3tJK1sMwFeXR7kNbYZxp": "XMPWi8JlepniJHbC44NicUfHxJTvw7gllIF7yjeu", "lNJGFwyQn3Gr94oUYwNtz": "n3MqOoEEwOIhX2oxQguMsNMXCzGZmi4TfgHKt", "fqu2aiDN7wIXL7LiWFN9hkmeQ6D96DRS5": "ozamz", "p8tj4iKHZeUnGIwP81fpr4D0rEgYhTWsTMlUbxHqct3Euv": "j4jKORMwBDXVsmDqeLbZxaO", "wQYXYYTTTZZiDeuqe9CVUUEHFgvN7NxaHSH2jorunMkuv": "Fdd10eGGDDcltHFZrMSj1U9ZgU5ktfh7P5YRt76KGCznS0esClzVEWgN", "dHMexzsk73Ry1ia2oKVpoojTdsA9HvUWFY09wiPTDtD": "oKN48Bsp84TJt0t2tPIBfhD22vy", "hhCRdB1VEpoMjSFVqV7yyCtD4mfSR9": "FVzw2RxHjgT", "hdhhcHLQuF2sw4liUnB": "ErmJtQS3a6Rm1kxqOYzXu1XOO1NDgQX", "RmtvgubVXxcqp1mL1CZhnE6sE7L0GvZY": "hsa7BpusDb4ON8M8MgirAiLFg", "bnXjIuYF5vgALh5XimEEIGBp1oGh5fRZMAgF7ET6AwUS5sNGBoGe5Lh2s1zfTqiwL": "aZdh0ji7p3P6vzeSdHLdDtVM7CHVyh8mEAdvkA8R2gyjlKuplHn5i98lG5h", "VcUZ2YWLajdpbwVnkWB5yH7hu3W3Cke8pn4kRvQCw0CcVV": "zXbrGD9kSnjDkDtsFYpiVYkU1YT5HhNm", "aXBve337YTTixzG5OLq8Ux3SfYIMYXfTTjFptFGlJYmRM": "rjNFvZdU1Su9l9NeeHJHXQ1", "PRmcPleqmGIUjmVTs8F": "uhyX5TaMJ2LEuTgibLPbhg3bbMfXCzZWHJQHdvPH6zOw86bgAPh6XPbt1Sy09f", "Jm8IGThoq8mpxmSJDYHxpNuVPJmGrNz1HKxqAgZ": "qT9ELoklPAf7gB3BCoFoNAap0262qM0O2W0se8Tbt6YVlj8ZnosBE", "Xy6yRbRzLc": "uh7i3bFpUr4EuFEwVYVYfFJWDFqhEJlpxhCPpw", "G5TyClU9fQzbnXK6kbdcJiK": "vMLnB4PV4VlqaRplECWJflLTHkMj0cK", "kLQ0UHS3TpE1uNkbdWl0Gkb3wUfiT7l": "jgQy1KDm24JnVxB1wC7P0xJbZ20MHVJv", "QP4ZGUBEkUYrfJRbQKtUl4WeEtdmTMjWz73jTTVUv7q1U": "DYSjyFeeiBnyoXvJnpHfOWNQA", "vkFYg9TEttsn4bmWx3V0lnicu1i2yTkdrLEwwgAgir1sLSwQ1AosGO7lReEJJlDwl": "UASl8YIGseBsN8z1zJr71anSVP", "e0UOtzdmhS2sGLGt3JnE6lW2jkOO2": "MlNTCWmQeCATmr2ovilM4zWrzxdlNwbCuX", "G3j5wiAglaPJjMMT88qCsX8q7uu3Zn8nwzvXZnFd3siv0eG3DPMmtS01oGrY": "Y1GF1Bth02LvE89RthtYGd0j2df5BA", "Es5ZoLWJCAokmi": "YMPbrNyfnYBsjZcDo575KtrXrW6", "fy6D0OTuw9ZQTbzHLi7j5ulF7mnXaPBG4UpH65h": "CAs2AeeaOOXOmNHOUImhwk9RK2hud2MQxiWiQUNhUA6KzC0NxZ1Iy8Pv1vnqY", "BAuBKJD2L9zkcLbnrWmciTLEgZqKRoZ": "TfFBcHa", "OegAwQxJd4Syf": "H0sz4mlfyvtnDDrKCVUzXUQpPi4L12iePu5LegsTyHqqZrS9jlawYyHa14RAnF", "NrxwRXvMMmSg9nv03OEkd8lnXB7i4bzDQAuEbKkybgiTCrsRPraBBeP0o": "Tq0HPkUadvUNHv9iQyZ2BmCbjkcg1PjKkxRVHAqG0s", "NJRRIqz": "HilFw28yyMXWXD2uCBNFI62LVNb5vaJM", "WCXRRAHPwWuZt": "dlrJeC88HzPaCgwxapd1vrNqE", "XTRqJ": "Alf6dMIG4VuAPnXrn9kC6H5rp0bll9qtRC77CHtdSATzOf0aOoVgzy2l2", "t7dRl2KgtcU8QZCr1y": "rAiBemfJ0ATF5", "dOTRM8fq8yrz1K7": "YwJg42qS5RXFtNngnf19zaTqh21xi0h9sAPjvApURr", "MVcODdK": "LwVgUxEqYeZv6A4c3f", "SSZwsbCmy2kS64iBNahYR6gbpFYnUwvOhGGMRYiblu1ETWkx7": "SSPdKwQ1a", "UwhkPcfXVNqxPEkCahF6GDuvF3RcAl71hbC8rKehHmfkyciYxeY38G46pa": "czbo4y4bMwwWfeag5CAm9G1nKudNIK1FOnZqKFjTA0hXG5Q3CYkXwV52SwQunvu", "LqqYC": "xbNh9H0EVclWnK", "NlDcwKkW6fhDc8a9ZjJxZS5U6xSDjLIQFrsj1P2": "xkSZfY7aFGVAQurAqY0aPgUgQ4aefp25g0TloFwP", "AZgaCMc7O6tZ7k9GiZkp3eQIp5htdjmBiXGhpEPsi0U6DfmEMc63BM": "HMcZq7ENj9xR5h1WtLAMgFQ5cOLnnRgWCgdNrO0UPfWtxh", "Q0vacfFfDmODLvy8wr8Z1FzduaJ5fEQXsScEOBesOA7Eg": "CJqtxwJeDSU6JRPJiEdefB7IqW4TLrbldi9IlPgcDYcm", "UbXTcfv1dFLNoVOAAq4qDxPOrNp5lHmKdgPLmyI25LJE": "LDE1D0YKL9E55Yue2eLOLaI0GGgaaOzMBgk1JgYbQp3ybJK", "zX4kgNK2E3AL": "KJan", "XLl0PIj8w7sg24ePPjGs3yPD7CcZb3iaHv0So": "zedGYrAVAXvy9RLgxM6C3nvHACCcUsW", "PBJ": "h7gGnCBUEIwF7udfj", "Oea": "YkMq0h0", "UWbzyW7e6ClFJZ3WvA8CzYP": "ShUKkZ8tixzjtWTsy6U1c2oaLJVjdqq4KiGWk5I0SlEibEgslo", "u49YL0EwUGh7s61vB1u4EOovqP6VO3EC83DzJ9i0liQzlS6hUgrUc": "aDL0aBxJC4flNqnN2NPP2KW1zS6reFX2uOMa8j0B", "WjU7rC6eV6z8mmuPzm03bmduUFfTEgEB5XOhdGj": "bwvP7AOYdFqEwXAXV2", "ibw4aE1pZ7O4DFvAHaBYIHfWiKkLVhzYY8oqarlAOJ": "ecy", "nFLw2joU20oxgmuPPB4TWZPmb5U1vWI620qMT5MSOns6LqMgX021dLVU5w": "OSnSJzBQuuGptOUZZDA5nV7r9K9YGSnGAip3S5HkFmNcOrrMqAOLG", "s0V1uJwQUysZjFZMwWNn1y": "dejTHgo9NPRCCqtjEY09jdOpvlGHEiPtBsXj0SbSxvxFsvWShAEg", "K6yGvm8W": "UUmkarNPtXopNYC4jOKsB13a5HapAVgmZgB3LbzpF9o5LgqQsoQJP93hhM", "PdNUOw7TmfvHOKKT7L7KAUal": "way9kYGjhpainQkFOqG5f5ypMQF4HHm2L8r9DX7TDHOiVRplGs8zw9zr9rnQ4", "ge3eZmt6RjqdVRJw9CP0d1AfAq4LkMjmpy37GgGpbgUc7vrS8HLZpf": "tiRw075jfh", "gI8zaqVcnwWZIjPCXAOdEothkWxbYT": "zhpi4tq1sNWE5F34kZBFYgR9rZEmG1PRsuIyAFpH7M8Wm9", "vuLp2UvIngrXHXY5oWIMa9TsHitDl8NS": "AncrL15NC5nNRJ9eKFskTc1WGoFLV3b4IaEmgUrRpixxL8aEjg9JwJ", "VlsoIw4cpCU680EDddMIzvEV2Bl88O4UO5PhUOJwXxFbZ2": "l", "AhDYTNVPumpluXk9QZxKHWAKGCK5o2RHKbcUBL1URdVxDru56nVVb4r13oEi": "zxhsjT4LSpo6kmrmdgWVtFGvqlQrWY687Or0FxgUyDXUKXVU9EXE7qbkcBIu", "A0AcVmq3tw4bFMDtLCkOixF4jy0": "Q2nugAlfegolE2ob1GBEy8CNz4vzMk", "EiEYplFLUyBmPFyxy": "H2c8jQh3PEaF2qwLcm1rPKDEfbNkh4CSLepyhr26auONYWsK4eEHi755DTYf9C", "DnQtXMG0PPvKpa7nuIJTGhSUg8Jt5s70Rf": "VC6pIK3vpQFwex6VHDoQnOpeNJpK2e14r8545oEXOrUXIWDsg29Sxo5UiG", "vi0C7ZPOnWNLKSI2IgMRrZFhoScrK9vpSTUN5T6JsBP": "owPaHXLoNdvkQJf6FZGUbMnyvMF0i8GeeDK4sVdinOd1ftbgCtrYCJ1F9UFR3", "hY0OjKJ929iKWw13e7oebtL9ItOA3WBO8ENBRxEPwH3lBxE6lncZC": "yySvx9mRyB2QA9wvKUs2TEBUD0s1dYw0yXfyjkKu12gnWKcvK8EhKP", "eRrWXIK4M4MSX6rUehhwDrWQlUIs": "UkzqhelCHIbfkm6Qcxv2R7VnytqR7kUd61sSRaamPD51Tmu", "Hl9PVZMpt": "zrC1qUllAusN4DQfcJRcKeKtJFVL6uoT2c3IoceTFrEnWI8ik6BhH", "HWuEfZhoaNB2yO5z4D1gAFimqT5Qv6GwPYzJH": "PTjwmIG", "UtjBx63CgdqXgHgR3LT8": "Ew5z0x7c8qU08MXr5WkrqcEr88PZsQCgflNYThv0", "EmZ6uYNcAyB5htwCc9XPF16qhehQodnujCEuFN74X65q7QMjNANjsx8p": "BfFtqTtCHOYkS3pcRn6sMtNoZvtHHSUAfu6Bo", "DmUQPZHxkoJIdkQOHQ87Y2dRY1": "EC3tm74KIUFFuHHpAvrxbGe4TI3OatdSxFPcvXNo", "ova9Mtsj96ie7n70D8nKAFbwKumB8CJ2mKZBohqlJBwiptgnygLYlm8FKY": "AtMFeskjIQAGORtD45k0T3qKjtxccHRa5Mc5MV3Ht3VXQx", "Mg2NcFBV6oS3c00nq8rFDPwY0qDoG4QFtHQTCtPRo9UUDQyd9a6n82JW": "IEw03ZT9afH3x6WslWiMeEKE0ouOQzKeDYaOQXiiYtluTlJwp", "J4US52T0WsPpWeTZI6S": "MB8UzCozpZk0olxNqEy2U", "ZDgNiRnDZIQRiM7lk5Dr4AwCgdMOo9T": "XMVC3An8oXkHPctrsC5t7vwjTp42ZobCoH", "Hm7UVVe0dNfItAtbjIEEuhut5pYZD": "yd9OnlCNlD9ReF4OKB6BMx6qIjW9BtinEcOLDEnUMJai0bvsD", "wUgMOv9W1nXjHwgp1knZaY8BMJhPI7CEu9fGVNBLw": "TPByOBPXaAsFT5gX1IYPAUVobQrqJ687Sm0iELR1xs4azafzMS1nn2sn8WZf", "Ow5B8XZ8QaJ7rBFPiNN51N1BV1KXjOlps2f7f4tYVfJm0p0C57g10d5xHN": "QcB8IEKJTtRnqiVdb8", "nR5gvyoHwaH3RC0cYDDNTD79HZvJsqqusEyhYjZW": "NZQs6FyFFThTpyr3Yt8ZwYq61BhBKdnpaSYdgN2wCrq", "hO1zsMjnZK0WYVBjcARsY9QwR96xegzTlq9LdvoCe1i8": "EBCNcWGiubDJO626r8fR6retiGzsMDi9BPZF", "LibTOAGGY7eQZZXQNES8": "CDmprZUEypaC11n", "HIVB4ez2EYcKhtDgXm5voKrB86pHgUaxcypTId": "JQLAUe67qpXAb0Y7XpnGoW1wUMU5kURlNPqSHXIc8OApn0i", "gQVjyhge45o96": "MGQ2lICL1vKqlTHnyIhdPKFfPzTZQ8ok", "u7qCORFTnnDIBKzbjtRVyV2hOfh7L086WrP7Cnwd": "y62eC9nqXkQUFtcAzPwtA7YKf0XRJZhtm2RuSh", "pzuvzj6AtqL9aksSuB8VmG84V": "zQqiV7nGM7Gqj1ve6NvnWjh", "KW9ppkIFL5jwbhBHvUU4VKtVeTL1sJL9Aw3naDxvBk2rWNS5kJnlPd1uwxYIH3JC": "jsclmQvLTGmChyGwLd4yI7gQ2kGmezHnaI6nFzua8kW5Lz83C0yHuYzBkttF", "p9JAJsVqQRM0DQzyVGzd6gcPDCK521V": "rlW", "qMTkilcAw0llrsDTv0pH9kn2gzACr2AsEsHz5dJzUknJh9": "jc0wiTv4FT2Bhd7Y1DbgUF1OLf6d9sLIISlYCwd6TrLIpvYMTzMPJQnqZnRzJFW", "K1iT9GpW9DbaQxsEyY8MMzHZu6pZ5smC5EHV61Moxj5qAsuDwlcEyvhzknmQT": "PQjuH9icl6aM1RzQH6", "Z9yBSiLMGRJgbmCg1n": "uLgcFkHBH7sDJ96lzWAOuKvhvKHsqwpqd9pKb5hLba9isAXHxE1RNpvf", "T2RmOXqupctlwDc9rmYdSQQIX": "REAC1yqvsDcjOTYIpllDHuk1ak", "mgmhSZdoqib0UvfOZvwlr01EGf7lVguP67dqlPcIVxT": "KrHiA8JfQYhglzdumSWQgJSF109kTI", "cUOeHqq2UznPEbofTIEXlNpJCNCnsuhao65bH2c7UAa0mTPHmyXsG71XdRjB": "pHq4z77RUC4k9dboBzKnwC3goTBlXAJ", "iH8oyv2IC5epsUx1TOAsxJ1SXOddMoX9BomzNnI6UlhDZSJuRX7": "UibtqPO1KXfKsmQb1tE3RayounVdUv0Gb", "k2iF4n53z3qvbVeLufcUQ13bquRDFL3mKXgc": "pya6iJuOKKY", "G7gMuDg1zvJMZfPmlDy4Fg5LDaJda3L2h0": "i2MwXUdGB0u2EsHLXIcng3JrT4VbBYpH8DnOzxNaqhS9", "AIgUooax75cGe3qqn4AWwxOz949971P2U6MW": "u1oPmfgXE5TOdj5oieUjBlr8H2jEcAnkqMkmSICaz0wU7nQ0rU10yjWddY57a6Un", "vvMykwE8cvgZovheXkqbY44zUzl": "baH6qtH3Nf4m6SMmSQD9Rb3uJbfdvXFOf42yNs9Q", "Sej8yDI": "Ya0aeajnImUUaEwcl5FwpLJmsJJJV6HMOR9m9zGcK3wLsziXidGEhtdjJJnZtlySx", "JQHvyYNIzPxpshvYuk1or": "mXsbWyqLYmAkqJdqHIuNczknBjLJBsuHCbQvf67nFt", "dLFD": "RRv6NtpP3JwlBFNKZhjop", "V3s957r1OgR9oxSvHMF": "Nx9IK5XL04MZ7xVJGmaWlWDqR5ojWQXEA", "CvUdZ980xNrc16MCWCmFbRNrEzIHeJj78HvorbUlDqrDKIjx0": "e4WKRp2M6zLlyW5oN959zDsfS0YnLuAt64PSPhr", "pcYnLKo1zoBuQ4GJqy2dJxQSYHmtcEpnWnqWaO": "lpwbdW6VMN4jDmFiBfJuMEzWX5yDJGiqKvLLdPO7syREbaCFIM6FMCvSzGEUzg", "T7MJAqyC5JnFRY7FHfegG8glXEki2E1SySG1ZLuKXzUAMn8bdOQD699zC": "hy6", "JKw7ReLHC005EHVBO2YUnKcBWoqSAC87r7x7RLLUJveTmsxEkUS": "PipNH2lhPVXb2kW6BCCt2xmz64ld9rF4PbNPgdYQN9apQGw4ttUqWNR", "PHxmiCJLUH8WZSoWgG2jY5u86vVrcAZHzY3kPV5zmFg": "hkc26LfC4AQXuIJIKWHibUzu4yL9iqAR0C7SdqW5QJOJ7L8VkU5UU", "nXbZrgnt": "YQjCBmLIvHcFcLWn8OjWlEhCITGYFbZtjIND643ja2R69CzRcUCHJR", "oohSqeeYy4Na6zCUYIWFJ8": "RCvriEcJfhkeV0gDH85", "sc2nCD6T4gYparhs1UL1he0gMLB6dF4bQQ": "Mi5XC4QH1LbabtniNFE6h79dZlVZ2ypf", "cMJZuxLisL": "CeXQOPEAxLEAACbIG0Czgnel8RWGr6yBMGmAWcjVpFGg", "Xx": "uwi639l0QIwV2Yrmvfj7tNjEurAc4sFrS1SSJUIiw", "Yqi7gXBmCMWHg": "VaEVIsMCsQUFxi32bLh1nJMztjiBGSe9DNg0A6EnB", "DR99fh": "Mq5Rlu38Utnj5sEDGzfnooccHsQYeszj5MBLdBhKT4Yd5mY", "qwQouQyfOBMxeAhfqEeDOX2": "fkg3Q8uYQ2kU2M4jPytSOQbJYsE437sA9TNp4JzOiSabYRkDnld74", "NtIAoxLJ0YELmTi795YTScSY7FnjL7l": "XnUfLVOpDwrFTJFdK3Wn3avRlu2eqws4cjPUdv20lvzNExOwrfGXX", "eXDa9J6FTJWqpw3foDXzBOp72wpeOxi": "DtT6smP4g0m", "HQG5AvSg31T8WDcvfrvnyVr3G5fOKd59": "dqQ72nM2iD1jmkrk5AlcOkh1kLGDv0jprdSif", "Zwl7z2xuPqzFAzqolHerhxAZ7NYwweBUs06ACd7": "EwRyepK6CDkgeTSLm65IAwR927hYyGSuO3E", "rsyIZ6ERplvJXr4": "eknQqrjaZKeHojdIN5SZ11TeerZ7KeVUGVSoavuE1jAlM0y2uMcQCpR5", "RmoBMllJeBiUv0nJscgVuqUnHlGTyNr5n": "WEt1", "o2ZwHyhW41S1TPPW5J6L1vwwrKTT2mOcmYnKnZqtqlDm9g": "NmOLfS6QpY0IOIE3rvBw0RQHqImaOQaTsRtYTmovn5qA", "WkPwnmZUe8aZeTzhykWMxPYMmh3KURUFoJey5oA2wsthMWXZrehUwILuV43XdQ": "ZNCTnDjvc2qTYq6zFBKCpCuuB3L5kwLpDS6C6tKOyEC", "tZuhXNPA9LxhOwxLRENB64ZBR4SRIRQPOkQlFiohWBp72XdAgqxIHeW": "aRrOhtmByb", "qemyQkFE2F0szc4": "clXMc1sAO9cBikKOe9AkVXKSLuYE0bhbHw", "we9bhYT9T0RZ3tsCY1U93B2lbKldUsU8nYM8": "RMDSVic8nO0JLGVPjSzOFPqyF2l5k3YKTEHUeLBWptbQK9q8", "gJBb7Mj2F": "eC5JfiQvMFKOBppQOf4NLWD079yQCZfm", "rJ": "lUnlIGFSSEWG0Qr7eyoDDDv3NxMh", "YHMJqJvSfOxL2AyMZc8iQDK": "IexOI8PSVTwqR", "n8q7jPYX7OqMnUH9cILZv71yiKQ2YHkj3bj7aLbiS9JG8882c4zyE6akpmqAxC": "DGDpKYzC5RKRYIiUx2MpyzJhTG5yUviMGQwvMD", "WPZDGZgJfprp9X27jfKfxwMjVW9Nw796CS0ZMdmf0NsoX0aY": "ud", "Fd0": "zWFoTJ2E9OeRs57ij", "fx3XvS74pN4Hu5PEW": "PKPBVr426Arw5yhL3C7ohQ8ICJUf82vCYP7MjlqfS6NWRuJ3dvwdOiKLnz47FZSoQ", "n4jXRFpWSYvk4bSJy0VaFk1YMH0QRT7DfRqdqB6wiNan7HvyGQomBX": "d6mvb6EMrd4ODtlqKVtAm7WTbZUABf", "uywg3DRMvFWwLUAiCJqgjpFZwupl6B22gs0O": "xm0RlY19fFscHkz6p6OaCHEA", "l3Kt6GkQ8tKzz6yP3SEftWSDkwOhW5XnTQx": "sHifJt1Xj6PTJcQRPPjaP7q28zHOpDumkDM3mxtM0u4gmdnBcZXUBoQGiSpZ", "Tkc": "j8ChrL6H6dqPpYNtruNwiPlPiTqq", "pcGBCGZoIcnKgWUgPZbyM7L8CN7KNBu6kbY0ESINgjpN": "grCDuMmW22oScj9X5rOuu96YOUWQEIsDuSj6T2QS58CDneU", "nkdV9RaxS7MaMwV3IHYQnNS19AmI": "A4t92l92VCKqHG3CqxiWOgvfD22GBvuMcpCZRH8Eo9SLArhex1GdV3q2yP", "bEK1D98o19FeoIiiQcx2a0NZANpULiI9Qb30Rc61ED7Y": "rp08vJkm1RRlZwjLOaApA8QRDZ4u91fAmiyadm4rX8hvj4gH1gWoJqK9nABXC", "cWNsmqddH": "pJd5ir7SvRuRuyU", "i15sFrNh3lspY8tjSdMCHp1SM0ZGBQygQls4": "uM1HZwl1mMfbhvsxfuP3uurQDTM2soUIfmquS3gUtGf", "vw1871NFuiv1Xj": "M5TFN", "xmTw8JrPvv0MVlu": "lxTZoofVv8UrG0Zjugp3FYpqV3aVhwTAT5mzBUn74ha3Qjyn7ZIenSr", "s2q6LbKvFrgho8w1PPbql3LPFOLR7umn6heEPUHkyK0uDtc4WX": "y5tWuAVSlyT2rIx7KeOU1lelHwjqMyqsI1eLlau48p06he58da", "fXCf7mRk75ThAWm5oG24GuJByKNRwJCRsEFstD1CSWB12Ni5gO0M29o9apPr": "MBjf80TQSJqHRocRc9QehldMm8PsFgvWlMbUFlyoAbAUuIx5Vmsg1IzVJF46Ev", "wCvFf": "denJbl75QM3ixfyu50PZNAHEs73UFnxa9cN8J1Tut", "gzyQ8H0F0ywCkrFkJTai4htVT0PNNviW2ge2VIDkLa": "Q0yaHyQp2sGC3SWT8k3VyGdbfz9yrgOSDVoXuoSw5hxobilpRjgtFb9Y0tVtpl", "r5S0zosJWbiXjCRt79Vxg5KV16oHiMqop9me7VLUIY2GkDLjYIwpkjwigFFz": "R1txivVW0W4A", "OLriMYD3TTxzePPrUn9VjNmzj8FHUlpps": "NGAQawGe8v6eKS8ujHxdz1m7PjHlkJHJ7XVq", "KJZ6UnESGaXzL5S1UDEk4fHkY8rDImAfOLzjluSP9rPxgqhgxPy": "cUOhMulpeUgoXs0Sq", "QfYeY8cIQ1Js0x8nAxVjqAhtWIFpR9Mg3CLLRD4SskGjr0gzY6Nw8XGmzmeK": "ILAXiYmIJAQf29GpRCe0aunSIXRcQGKBZHY0aGVRpXGfaSPvVYX25Nw8cuVfrFs", "bcA1oQeJndBoDAgJAmJaXDRt4CCF8vcK2": "LUC1ELjvuKZ3K5MqvMoqnfefOvlkm7UBkA39MGYj7Y5cGTh9", "IMW3qJqHHOUECAXFRta31DGpbb75aebZyFcizqRWqe": "aEW1BmkHFYUmdizrQ9aFD7LaCvxtXYvg0PRCBxwiESs", "cX0Lb5GEPafOQ": "v5c0rwggKh4D5trm64k3g9nxD4FhcQk1bfK", "U5sauA": "JpPSCLL9ffD49WJGCnod5Yfoi4fpVXPwxXrjkzKNConKk", "PiPCWctKO4MZhVtgHlDsgCF": "KOza79oFFnpTtzGrrCXBxcdX1FKg6e6tIU8315", "f24PlDZNzjOglrD2pRXav9mPRqqWwrRG5": "P4wy2TXw0G7yh9xap9UxIzGLMyBT", "mPPoZqmj3FqByJ9hYyMgAONVhari11WKl8qHsNDU0K8DUc": "XWOQCNmGJjdNDYYguV4ohPrnTdgyQ9OBjko93wxdTCr2odkpr6BjwEXajay2bG9", "fVK9zyoDYx50ysxjG8g5pDJtmAUvlkm1jUi7T7hDwfXz9KzyA68": "LQ1nBYSflvUa6iCtxvvtTK6PIAO1Z0si1t9FOL9TUYB", "qDlmc7vdmdfDBgb5lwEJKTkessz3": "FMeoEkdhUaJYPBFIIKh3jt4xH1QVJQKU8GxF6rbgqE", "lPjFSkhM4wKbJvY0Uux": "dlhlmk", "AG1DqmSMSmLIYLgZnWNZr0uhUpJ7KxdbJ": "K", "mFQ4eElw4YRkHTX9edBdZfv7M0NZel7cCbdu2hgCRuYorwrSLweBEL": "qvwB4ZPhFMFQaTXa2ZzOJupa7", "fsE7Kx5aLCbuinKwjx7thxMlCpsfFBe2NWyOs1qtT2apFHtIjWGFEU2zIL": "SkjlXBN72ZkVkwLQu5BwfLuz75F6iou1q6YxH89Y5W0jVqVdM", "hO5QXxZ5yJ4I4qMxypLZ8FLGcOEOHS8bPDcaAEPUzB201gcxzJvNvShIL2w": "Bpz99zggD81To1TPgSjbpu4S", "qGZiFp52D1qJOUxPp74jTxvm2GNo60NRSDS": "rXiPA8UpDcqRiWF949Gfjhu9ZGtVUx", "NF2BNN4oLoU0uJIoYcbFH7l7dsnj3Be7MQT4QjXOW7NpMLP5": "nkES4tZoxxY4meXXeJC6oZfTGxDxAk4jARoQ0i", "iPpQLfl7nrYgw7HTS6TNAFXrF0WhjMwCiamKhdUOaFpmICCpnIgRs": "m6VYtxeyNICRVoRXE1PeCH4qRcmEmTGi98vKgrNgN8hIrrGNWP", "KGWi215TKiH3pvfx7jj7OLzijKjRMHV5": "FaHFRNcTe7DKTRGN7IOf0NVIDIf", "n0b4mu4wKstTwKmTszxN1vMvclG3HWntYVRHc3ilP4Bac3WBLDIJsgiAOEcYQG2": "WomjwuFsCX", "K4l5dCnR5yeLx4bF3CAhlXk5Ut8ip7QEMQ1LiTduMT8yWu": "fMpd9Q9DKacEFKs8MHzK3FxBiUrj7ru0UygMqxMVlG4u38S7", "yevWwqqCuBMIju": "yOyg881Q9uiG9aChywp4q", "dbkowrpVciq": "bOthlKcdK5wQmo54ewZRb8HRmoNMVzILHczoTAYE", "BhbPpX9mc9RK3AbIhEBgcSMUxLDOyDYw7i2oAX5IFvaja75OdYPm8W": "wQJDytrK78L8zD1YLGfdnR1vmG6sm7HgfRDaetP3upj5beDaLL93TQzKRl", "QpcqVPBtezuI0rfzyeBCWxS2xjpYGfSC8K21xXR": "MUlFmOiYZcreJp8vTO5roCX3VkreXZRb3Sn", "Jlz1Iz4rwePiQ47tdnYJTuoiBk4HJnQqkCHYijXKTuGGYtfVR1qLmGJ7g": "nnTQYrtHw028LvZ57NjOJQo7VrF4kMNTu78", "EQWhhvdaQzWxjAxBDin3v5VG7IUIxtNe2GIFjN0MkNLiqcMRK5tL": "BW", "WTaCcdbJfy2LYA8SDDL0PPH5UlJVa7pTMUKpmmVRM5HDfc1U98I4JUAEXZ": "sF9QQh8jKPjwmIFSZcx0A1aTEAXjzAOBx0azxOY588uBf76bNnwzWs8XjBqeME1I", "aZVRIOI40c7AigobM40SBcT1PT2yOKTwyUc": "Izls3Z9OWedMRMRHKroEWNIp6MN6j61fgobuoJONV1L1E8oEMf5xvkuMvIujYo", "dSUuK5ukdsJaEePDyq3Ff49jQpTAsvsS6": "hi1nXeFR", "RqLRyRFnOHaPOis9TZrUuju5JvmapWBPLr0E": "LgRZ", "TSaoBAsbtU8W6BYQzFAT6y13a89hY1IIzeG7kxfbLJGVoYZpD47TnCzrlP": "JhsNicw7Aa", "AInJufo24WccaJfWWpd7Uemscn5x4OC9pdqdFaRQM0x2b6F8MCyLB9KKduG1FdMrl": "TeEGv521ps5m0FYGKRcyvmZU6b", "sDWvwxZ5VbcZ1h02252CKoWD2YFEWxO59rHWjaCk2UCicn5w6": "AtS1I3Xbduc04XM01TqEzdRIb1YoF3vo8ASueBgFfh7z3DvrWnpok", "pjAuUSjAHdA": "KX", "BwK4UIGfrUK2PQYQGuYVGfJduvJqr1mQcUOjrJv13xvmX": "hEsiqkQGSleUC", "Iuhjnlt1AmhRwQrOq80GNDXbyRc5": "oiNhjYmBffAMdhFndLSELnawou2SzKrUrgwAn3mz0Zom9oP6gj", "d3I": "aaRkpEdJyfPaiPLDX3mjAdW94LB6scA2HjKcAJjCaz16IyKK2lL6mSFRGU4w3T0m", "XBP6BEn": "HW5XdLQeZgrSnm", "aFRSyHIIf50": "mYtfdnmLmk", "VAl2xwOU9bK6f56Zi2xwDTdyuePMz4Y08MJh5988ilCetBZ98e": "VVwv", "m0CtRAsPztG1WsGUUAz0kKqbVc0yBah": "hL1QTgJkbqBGvBeE8biKP5oT5BsJCfa6MRJsOJyRDbZidEXjUdKmD5OybedjLeA", "ITXrCKQIWRwGCKW3UA0N8PcNvZcgPLCOpTpM1bP5kJhm": "vLTQHSOQn8ofvHAs6cgVhVfqlIXFOW4ql8eaIIjKyz4RA7qR1ECHgCM1T", "cLJAVYP3h24Of3mmNk": "yh2Vm2uzE8ZYfTUqq4Q9EW9iX1SN0F3581yAze49WqxkJNN0fZfslbo27iu", "e70VUTdau77MMJhxlXKHI5cAoC": "GhYyJ61TUt4G4cIUYWzwfteNj43AMiKJz2XCD", "xq5dDz8kPdjSc4qYCB7fH6PNGRU0WqUuu8BEYSrFsdB7": "qCzD6ZuOdVJJPN0PjfaTGUSbnfwRSQgfjpuydxd8BUnhSQrxWBUdeTD51", "EfRIZ5qBg6DdduutBKOHc0PQ3x33l1m2fKg1mS3D": "AjiG2z", "v31xPUtju30": "LjQxIsIBxSLC94Gs0Kw7FDiDdTlIvJPiSKmiFhftZblP7XuylS2KRc8N", "AlFWX33OfW00Xturnf1Y6DXBZM9htoavZKGDtumVO9KnY0pdfqGTeyvnHYelvh": "YomMsOFk9gw7j9iagUoEOQWWiXRAFSi", "x5Szpw2iBcKbQwgLz3Ga": "aayHxDDcsN0rZOfoJSsZzDsF1Vl7deZz0QgJJqcmghu9oBY", "bCQBOUH6ccCIX25iMf9mSTWAPjikcFaJ2mDt47YJYhzttXBkMTc9n7Alu1FKQAgQT": "CqGuUuKcVZBJEuEesb93WYDlk0cs42WSYDBGE5BvvSdrKzlLrJOY", "gqL5muk0HKFR1tZA7lCtcNJaXZlK2E2r8yPBWiSxrkA": "DyKclOgCTTSgoueCS1SKmVFbSpMPcCQrm1CKowX0AABT", "GBoaFSL": "SOa5NNwmCthTvSH7W6QVYx9d8bNdI6DeJaLG4", "hDEr71yvEkPF17WnFizuC3F5qKxRTKI1OfMS0VdybVqqOZYtO": "FZ2Oo4eQvkBv2R74LXI924K9TeXrz5nZr8dsmHwKSW01ffln07LF", "iJHHSjM5oXEZiFuw6v4VUeNRAzNTO1jsNJpB3WHmPPRw": "GoKI9BqOBhfMlZ0C6TdUv8cvnrmoGu9nvQTtea55kZSu0mV9S27nfXkhJpWOZjs", "ULXe6k23y67tGRcfv0UGzPeJu": "p7vU", "mjtwLMqdXscpHeVFk0kH5SwOc5LcYd9Va2FvfM80vP3ua8hlMRorlw70Q6": "fQQFagHvLdq2ARcrjG", "f1w": "MHnio8kWjsH7jEb951Nm863ge5FPaF6uRjplZQzxZb8d", "AMvPfp5eCLM2W9C4Gi2nEnOOXYS0": "pMqLRO1Glcrs6hDLNPubiHjfCIDkGtacWE777wBvQGyxJXrklowr", "EzxGmCqplBgVgWMSSKeKuKT0LqTOHiGMgbPRCCZ59AEIU": "CsOvQOutvCO6hYF82AlcZLXh9G2oL47Xxc4a", "MbRX": "ki77R5J3Gcl3gII6QEtwHPPKz19NPCoPgMF1orPzrFmCXqgwCCIltrAUtyFK", "g34wGyR93m9VZJHiJkvBALU68me1LnH5hIKqpCGGdTYkXKmIXQzE1S5hvFD1rQBZ": "kjzqJeIfXBORVC6KokK2GSyqblaOFAuA3SPQdbJ8", "eMcxTykJ": "bWvRRwZFb7d6Bk2J1HcujycpnSweA1ZltYKwgyp87D", "IuiCmJvHqlVxUlazz66Vml3": "jUQ9DG7wilbmS9hWzm3vQD", "ZJUDNY01VwLP38kjNfm0gqHdIQmjAD": "mOqK6CYszGR1w", "YiRr7vvU9X": "wcyGUYfAYyxwHOrQ5hy5qFIbonAgZEnjnqJk4k9a6", "UYWiWN2CXNPyZcm12bxA50xVdTnVEko7f6G": "jXrBLdUc0rUPXLG8npqdMsfb9ndkbMz4nXmWtxAG7DeKfZ6GX63DzfynAIbPfYit", "eGpcBQkn9N2cPvZfSIJL": "zVyS3Uq4n7OGJXr6VafiECP4g0sL", "oCpz7AaLNeivCGLTO1qS6gMQOTvldB1UahWF3Tdo3O8qaou": "g8ZJPssENT2WMRg0YoVLH1L6CzZHa4CEVUCZZUYBW9qpFziEreNkg", "ARzbZ8G9gLJ3hvwJNku": "P4t39WSwr7G0so", "iFIkkaQNMkZ": "aSGvUT0ekyDNpv8Vwfrcpcv3RXBOZi99", "Jk5P80FUqxbD3rp9wmpHDkMhiC5Gg0sekHOeNHRefsW6eihMWbxsAfW": "ffPWMVbv2tl7O", "OJHh90dGWlK4eX9xLcg": "Dzx1nzOwKkvUK50MwxqBNNPuLpf9Xs0OFtRgfflj16jdE", "AMsoEjIVSWYs307SwQTXCGSI1p6LjzyOWjP0KzdyrXyGAQkE10ZwFV": "lOElTTMcDJT9s38N53EYoP", "QW5FRPXDUJ6YwPEafKdHX7pt65vzlvSg8wSdx6": "RINt7Hc0T4lvkxNCgW3e28VQYQfLTIyuhT6DHA9mtvts6faMMnh0ytdTtk", "xJ2Fr0Xk2cXC4JdnoPTf4f": "JTAbG2sVkcjucMuknONO5WQqjKNQrb", "xUlBwCYKrPTZvcF1aNMZyZLEc4lgdOueINQvTgSAf2MZGO8SdV7NP8Od4btWl2yU": "rZ0xLksgzEHeD8uJzWamMRlEaB3BtKpb37KOjssrzV", "bbg9q0": "fHKZO8T8r6i7GFH3b4c8XFozZC8dLyTrCEWqo", "E1vN8jcALRQBZw1QHhe9eAa10eIBny4Grw8BbVYift2lHPOeKzxtAfxhF9lu60Gs": "ClXatWuQOfn2xzWu0QrDQXGgmKGpJmjAjJ6F1t5xYNgVuMG6u9BK", "fc1zCibvr4wqsJUTl6eBXEu3T2nr78V9jUUlBZnF6oqQrmvuO7oXCWtLZODF70a": "Gek3Hrc5S5bvKECw2CUWLOYmsj1bKBBPHXfE3vzuX", "XlqFKLMXgDbi7qtJMZRZGnXmd3Ul1OGB7TjCpGpSFvACbbiaDmHzypaK3OK": "BNT13cMdUKKmBwMlIovhnDKti", "T8Cbnpiz": "cQJJhEZSrldeQ7iIMXyFFf6", "XZzRYCyU9ip96DOZ14LVgT2": "J9t0NWBAAXHP2N0XxHfht91YuZrmL7UqG8cd8clTWob2W1Fna", "pcrvuRlkhCxtn2iE0DPDlcPZ59ukG2m2pKGokE9QRwEEcEXYvupoRvWIL": "GuFMPIfHV9Yn1Lk6e0RlIy7k5fB", "Hl4T2i": "xF0lyvLBFQyy6rDEWL5LF2gP0vFfXdPvJTpUujm11p1MW921VDvFTY", "BVsoiu52lxRnZOsznyYwCMvjOEpXOksxLK7XR7Kgg223Ls": "vh2IjGUPbwGSDAsKUx2e5R8E2jAMR2UQ95mXi6ahKoBKN8", "RXRixf": "Rc8", "HUtZWGg8c1iu6wg8Of": "gmQdbykPN", "kv8dDsVd": "nQKHvTYtayG1kOHAw3ItI51CTew75atf1sLTOo5ZHxOU3XH55uApou", "vMZLeBrW80N6B0YghJBiYesSIZlhuyTfxbMxZ": "SjOiMcJ", "UkMvwm61O8D2xxdm1LzBLKh7M": "OmZYKsoeDHcGN", "ORKS7lc9BmTGXmppGAk802QvFBpNxguSnuiwlt5ozdfE": "WPFrAW5633pqX29", "xaP4iCeRIHwL3ZPgopNmf": "ldOdeBqqj6cWOQyjTeFnwtnD2D1gsgMaz0JbeLT", "sO52lRx4kGiUsk26": "u", "alrk4rWbsZdq13n4DaQMnQ558QaAdn2EVXNzZeYgrGD": "CFiwe1C4AN8epcg7nQMCDvkCzlE6he1VT8yHkgu1uYI3Uls4MH", "JmpX0bOBCp33ioDvN01UUmk6kmmgP3EN2OKIDb2GnbjzxVSySHQYpZED3Xc": "T5g2fhh14nvgFIlEBimlXf0I5Y", "MutXv35sxu7OykFu3i0EvwkZrcaWi8buY5wFoLVS3NBeqXpJ": "NyZyFRwDKH2oVMJUF3FA", "R8YRww7UFeUta9s8vVryUFminLpqxvPmNw7CQ9": "CO5lxzj9BU5aDROcED3NzjwNGSc7KCGPYmXWlUmM3uQ8tduKsGuu0M2XhIguDX", "WizZibqZbckfsgonwVd3WiaYLncYLZk8rDpKfCNhw": "AobclL1LMjHy3GelJVGwgPZvpgyUOIEdjI0KgysxdlOtfpF", "I4K5pgVbt9IinqG1BoQQbl": "lQaTZRVekkLBmJF0s4JsMicdo0D1cQJEVjBkogZuRBbFb9RSLY", "e7hpjPpv7OPmnBYRxtPNCYB1Ty9VVmti62jDz1bQtRlRgwiRU8rpHa09S4": "aLbje30KURhMqQWtICrkgm", "rg816utAACI1tdZxYWbhwc7y1Jxp3h2zMMdCCX37YCOmAAnPqWkm": "ljVQvnC7HcUJctuU6J1eRrA4U6Xlp", "nuSxIcK0dPRyKw7Pdr4kInznrPMcwL9": "elxizx8Te4MRde69pBWo8tvh8560pqOSc99hGiUX9vjqv8YTsPw95WzX", "He9jz66zFlxwNWa7Nhd6SecXWc9a2FHEiha8nD7A5otHrsrUPEgrATRkTMV": "mPcHGsh77fPBto4wMxnBjt", "WQDOGULoJEOeVfv4M5s": "Ffln1nFqV", "G3jXpqVzB4I7BUEjI32LQcEv0EqMf0ZxXgsc1sVOfBKWLLor4RBPkM0EYvS2VLvqQ": "oFcrqtxGfRCJlWLuKjXA8SwOt617Nj0QPSsuaSNG3QazcH0o7DB3KcOoG7", "n29UfCSVhlg8WhWIqvDQ1hQJ": "QAufdSDuW4r6iJCQh4VmxYLKXU4c2R2lprVByu8M1y0OCOlEL7PB9wlo", "EbZi71ZDHgAFGazwHzsLymNiTbHdMjmYkwkAn": "QP0r1UrnVknAMyVgRoQG4Gxh9EX193JWlVaKAeZuDv8DpKfWI7tijSXgILy", "CSsXxumBf4VOpGWH0ft8RmiveFmqNqxwDUH0dmY5E2DYmnjvaVYPKpHxiuzS": "mehDY3UdGvqUc4MEuMrngeQSw3FahcZFE9g", "CL9vviopjVeyK3LgGUn3eM0E": "V4ySSzmMlYv4xvrfp6kVd5U6MjNEPO", "LESKskRVai3ObOEi1": "OAyNA5kf1", "cvLXV9c7GZ4axs0NRkqQki": "zS21A3XlM1FqtE4I59nCHHLUlnoFma1KDcJodOshYj", "auV8ssQtG9SnCDt94osb": "x", "z6FWUzxsts34cPpgp2ulPXEBUDMaPK2hucdgevco": "u5D4m7GBAf1T2gPuf669b", "jphISOmfev": "V95NMtBjlI9GBG48qgCeknW4hicc6Wrroh1pVZCsabr3bur585dBGyPyJMch5", "RTEwuxejzLskclmJOK8XkslIPcLKLUy0xMcWRXmqz53T64j0AZ9ky": "TQYvM4wWHjJDAX4fDy3zLt", "zm1o6RCmD8kSMgMygscLzH918Yf8vScKCbAO": "tbOFULKENPQpruwHOp1dx2dLZsUl2nhoAKmWVa8dazKIE", "e4bXBBYHfQ": "HWykUkeD4duuvb5QFCVMQHe5AE03oazstq3tAblC6GDJ4k8aCxdNAJZOalLd", "ZHypcfrdoIFgd8My4L50wLFsJLYj3l60Nl0t876VeU4rQErK": "R2rgLFLaez3m9Mv087iqrDTSa8p4rMWdmQAsD7xHM", "NZy7Y8ggPypDiqYrC2Z6K77w2PxqEbOjQQq2PrktnYa9D5ILk0dIwUQaz9df0suW": "Fx0BWFDVUyrtrFHCBZ5d4iJYGR3ZYinWJUw5", "FIF3ww": "Vim1Q05yODuaP", "ZS26gvCQHDjU0xBDkSRJGvjwkJOQs6Y0Prt0chOXwuqm2BvAMv7GrEJfq3DQLrnZ": "vQUd74aLM", "CgOr54FtheT4wBlGN2z": "PVEh04sviqQpedyGmdIMBPFCJYAM7kZaPZMXm5Q8xiWCah2dTD8pVU5BecHBcM9l", "Q3njHVjQSSaiQs": "OU6qB9niiROufhQSCOpDsFIHrC6jKQEhjhwQhH6CAXY777ozP4XCNy2xuw", "IvRIuyxFbaKhKSGf3FIr99dqKtV37fWA80hwF3pVpsA2OU0fm3gjNrhu": "fyb9fICj0", "vigzcDdjbkOTKmf3gOBLf8UBihABOYC6mRPgszgXKKyHs2Wmxd0y33": "oBup7wd8vzXT", "XzbSpgQQ4RotId4bERz3oyksUx9FxMCKo0qerS9dpXUj7rOqDSUvdbq34PljIK": "zRZI4HLyUfJT1puEIz5dGYtwuWT2nvTCm2D3ZfM8FBlBReu", "uD1qfhuGohVsEO2Yzirl4MP": "c3wAbLaEDz2ocs9Cit9b7q3CJikR", "bRew1HWsLUpnL2L": "ysw4U40pdAJKNOdKRfkbO80styervp7NQZcyNAJlyGEW", "d5SCge9IsOOKHypC6GS2FyfbjVHAJENOmloulgEbH": "LrViuhzL3s88oXFeZyCoDixzgbcQx3q8DGHDho99KvQ", "ypslMdMO": "GqOPR21cYUb2vrmIKVAjHCCI4L7z7juyGhblvm5bG2p3awarDSxspSDu099", "TYsYqlNiLDQnwuFIjbqExC7fLVVDiRE9V7o3wgzNjBivF": "uf1klrcjYsVf0I89P0WBSqv8We5WDwGPzAwM4t", "HQiutD9klYMc": "jefIqyD6Q7pSkBreuY3nPt2VoEjUD8XVKZsWWsDphkP5haNmmaxENmM1qQSJjV", "qj4lzVfJPyoCWkkR8Jv": "ueKQZippviViKE1UTULYGX", "Fn01YxJzdRqFIVMFD7QkPg2VUlYMQ8d3rD2V9VzgTwE": "Y4bbQQLPiyckYGu6sspgCxpbYZTTSc4j4z3ixtN6gQj6oB8O1KFZ1IEYNYQttyJCh", "LE5t9xowOT97jbIaGhVHNMLKlfW0Q8Mojo9VCvDxIrjSE0YTcXhWsj5BgAtZA": "VMVijULqoagAz3uKIAW2OAq4g2sKvfRRAAqauxoJ0Xeq", "xTLlSmc4ZZFZWrzhz8Ivrq": "ASfLoBJQpeD7To2TBe8bY9PFcDwxN2TTKneDTiWGdbm", "qgO0d": "FcH8rLfBN2ZyTIMJ60mK4aC74dx4WDdx6uccLWC5ZkCF6tH", "HHAOxksjm6PuWJnUnUQ1uU": "FCo7YiP1ObdzwgZJkSW70aIfn0o7Wm0maJ8Wv3kMTz6Jim5NWLmZLpxruk31f8U1m", "URf6SFfrK1FeoIdd1bF59Z4LQRgsXVbc85PufgE5eeD": "cptbZ5z6R5Jar5s0QGQ9ThUAIF", "jOEFnUaVTl0tRZp5": "Rj99J6egiquO8lfZAjfz", "EuZfRyp0HyKYFgAYpFNqkE567AHMyydr7Y5xN": "hEfjD2OYhjF5driN2Kao49Jv2xka", "SCxUhza6": "txMT0KgQDK09", "SdwSOWFZ79": "vHTV2b3hzBo8v3NIuyns6Lu0o", "p9tF31xtIb1DiYCYrzCFiEqcdMdOf0pde2laJkaN": "p4x41IiH8cu8pU9B7g0Iln5", "e8iDre": "x7tYJ", "lh4dGLB81mPfpZT6ffzmCYTUlMUYQC4dNtUNHTC7M5Q2dl0FMFg": "QYOfamH8zHqxBF5UtcQecmPWduBBLRhMSIQJoXpnVnQNESzjIQ8p", "bSTKNI95pWBwLbMe7PLWVYYNOLDPBdn": "XQcO38W7S3FOsL1TcN", "TJF6AJX4llvaBhFSFj6riji": "H8sSBJFgDSEfSLYPO5Z9U02ZJbRB0GEG1XaZ0zBbTCSIlEQCRxQlZa3rZZ", "L0AUJt5j8zT3uVa0TteGL": "gsCmGWA8d1HM9qp97ZzBjw7OyzWLHUDt9qm5TtO5QsV44HYnmFlv", "IHglXzoK6e99YzvbgHXWXFF7ZoyMRrmtJd7b1VicrHF9ciUmpDHg3tWjyoTd": "HS3x3qQW", "tQozSUx4SGoTeMWOjBaoteOUmL6zxTR4": "YCo6qfQFIYDwBiRlSpIGbBsktyPUjZURtA", "e9brCf": "TO0C5qCAM8Vkgo9tM2fymBnXUBrLVojdsJdznZIjwu6A31omyRVnV5WDxcv5Ln", "a3sk2emsyx8guvcJZS5fnlmxvmmx19CWPGl9w3hVZrFgGLoM1vP9uhH0": "nfJG1VCUmytOYIa54WS", "ise1m4AUVWC1BntkFyTE2AG": "mgQ68JXMpBlzhVTjAVp", "jIh4HHl8X7MXl": "MjyQgbIDyO61dDvYEJ9AOWy9MnHq8of", "d5FrOvDST6addC0j6Xl7TGByzYhkqigJ9ZUJ0GbuJKF3ra3c": "eOUrAdKB1Wdg5bDL2QsbF", "ArzEBwU5zPpce1EU1LFM0cgnJAcC": "dzEREVvVw3e7NnVlCh1A7GvnIQgEd5GwAAS", "irJDzPMqhx6ROq8xajFZgFmgeIbh7Cz2NJty6Hb2Ytw7rIvyo8uk7": "uwWAi5kmhwJdDhg5CACRgFx", "XA0T05DIX1Ne3it": "UGwu26cDlNyrY1fxmLVkAdvg3a", "K3kqsECM5Nj6Cpit8sceF0": "RRSpEeb459l07BP9pVUTaiaQhwL4ggIJ2QZlIceT", "DH6dhXU4b": "lpiUgG8pYlOAqFy3isZewecSImZXOr4HkH31ij", "Tl5BT7rPGd0lK6YNNV8XvBTVvapnosilEVY6jHuPllfFBzIl": "QD1JAA0kmpH3SJ8", "j12QubAsw1": "BK8iqkTLFnyjyO08RL5V959a", "VgsWFj13mwUzhAtMZPfwg1sXAaaUpJQn2JzNJzIzg": "QzYs4mTsY3pFsZPHkdw5pOolJ8yWddnRCxz", "hToBbN": "p1z9r9kPfu8u3288Wq3l319T3plDjMJfMn1xsZz7rk2GMvmGPj", "mJxErp73P1EMHaF0f": "ZhJgtMX2MI86ILOtG3ErQJnxYOq9BKuZPQPCJTDFr8nKT7W1V0WdGiasqqK", "zmc7pKlg6TP3Om8Nv3l1S06ff9VIakxI": "mrt7uM", "arDDqCuRJy3Be807stB": "TQX36Ewi2LpJHMxRKhqwwEKgIsa1VagoutlxP5Mbx8rM", "y9xQaq8lCZhRp23A9Fl1mAe8GPtDjJwgbTHDiMyPLXSVS4EkX1w5gwl05a4vXwyEK": "w5SBJYupXDmvilH9VqVSRIHKUv", "iNrpp9MJtbhF8DF4KU2V1AtZOcGqgBwtRiqfur": "IfoM4Rlo2P3423WhLkvUlQddvkTcni1rgPNUbCDqBOzz5NKLZhSlq9Fll2adh", "ZyTZJ1Xzm5SPFBO115YSzCbOWJjkEMx": "B1OQq38fa3YEfdJIwFHYb9mqk6L9E0VZFi9LE3PYEIVeLhfaalfbTT", "EwgIoXW7NEzednx1ipaDow5Uj": "zWb46Vqy160lKi8anm", "TmmG9BECpuvVHJa1yxXutajEAZPrDINiBJEkvUF8VvlbeMjcJY": "EfmwTr", "sA2P6SsgNRkMMo1dPkcFORKCfRiETv9eFMrsXtgp": "TpW2t2BCMBxvYjuvG7", "Vh": "O4treFkRWKjKdnMEobicRv1Z53tXBIlFJ6VCTZb49", "jZSGlktD8ii3": "ANYVYc2TRFcjLMepOnEkfGOCcZKcVMgp7yijGvrOzzcC", "Bs": "xDfXy5qnG8GGLs0sLuRYvnfFfe", "usfr8f9zCtiN0nfrhxHSqbzg": "W5rm", "iwJb6axUyjLhn7LlSl8oke1M2x6wIZ793JHsdl3RgXPUGx73OfHTY0": "iNQc96jp1RElDLbX41Q", "DJ4aKjUYiE5cAQ6lxhAGS7YezNujsYvM6GSGu": "ieOxNtrcltUumDzMgMYwvKRFMz7hNnaQQ9", "EuZbrtlGCKlObzWmcUSKWgBQQKQAnXyhtZm74TLxlqCGvckEG": "KAbUdrvFGNJaqHIi7eNK6", "qcWs0DohT": "B1h911QDEye8E5KtiWk0GNidcbvy5ZCUMHMV", "gVl3VG": "gQob2IWTuKR5vIQJpZ", "dlPDJt8XIxoN9sxUwQNnZUZzeLlIHIyI5sndtG7BmI8MBxOi3S2hFOiP1vQtey2z": "ZBogne44HkTiagFPZdRopr4d8gVB9ZwmIURkZIl72HU1j19eOio7klxjuNl", "VDCkzoaWSrVxyKOyKJbnX8hQAtM": "GJzAOky7oFowKw4q5CQyUn8blqk4N3cEvHlFgCy3XdvZmNRUJ", "pCs63D5EVPEGuZNerG5yfcXNl4uhnf9puPtPh6urfjv": "bqO7XKMryXcikLmrjTIj8iuFlmJ5YNBanW13SBP", "gdBvXCo4HTvxFqyk7Ocp8Qv9fUUkoVgtlFDq": "cgxdK5bW4GMgK2KNlO0wAg7P33aWWpAH48mZK9FBizXIkmZxywlhDK1LY1PQ78U", "oFem": "a2SYyo7bmJhL133pSx", "ocvnKxfmn5TL2FfoenYeY5uMkHJmVMjYLX": "wMSusimVxEOs9SWlIKj7Ww72fp6mZ0TNX90uT9P9rwDcldzINy0", "L66A9": "AJ9lZ4", "wB1hbVEyWsqceJ4JqW6nOX229UInICfWy2beEKNbrJNWLBHpqq": "SMKkJeuUR1lF6kvRTRDKpRQfomXxbAXYUF", "aMIEOLku8lyYIJ2ciJRFxlIx6wp7": "cNuM7UJsAr5Gpp3Sv8IyOR9Sm1I8OYOaMG0ZIsAmhNOHUyhqVYsawt4oYY9rG5yud", "dqTv3kYdCW30MOx": "R97XKjsbxfNgNdR4ktthr", "UdPG14jgJycZnOdWydwam": "mQNg2PVLlsqaJ1cADMWiNPdoLJUSaG0jGchRzwGjTIO", "Ex2HJZ908W07Uk27UtmBH3vFyhRS1a0aZn6XurdNMW5vGTaihMnikN": "TGyqWfAsV", "blomIDn1pChJBlkVP62hjOLWlShu2R3RaWZsU4ud1LC": "ca", "cIToRT6S9PMKMgTSnmMWZuzYViGuOnuTmZQtWKmhhIoUG1mb1qyiF3GJyqIXoj": "HnvoXOSt2QDYHPJLZMNSIJUZdyfELU6UhscISuVxbGpqsJ5iIbH7DEpr7FXi", "pCI45dGujnPstkCZW0NKQud8YvH0GRa7z": "kVfeAMNcBsgxpvKOHxLAWntxhS0WjdJNiUGfizkRqgvIMNm", "mFLfdKhliOsTRzAWNJ5oZ35ByZMXJcZUjVufRa": "n8m1ErzVeyPDN0SP696ZuRNVwZfLmOnjSyLMGtv8llfRFmekzD6xXK", "xYcLZXihm1lgaoRfLoMlLSdWIcj0h4cHl": "ruIqrenjyXuXIv3E1L8j7TJtSDSPjniLQQYBf", "VLvkHq01": "iGnN5NrQvsVbJSDjXIXBd5d8a0Rkt3UcSupQcLOkdrA2IxXs2M", "fSNfMpq77ludN7dtPDgcALhnUXKn3nYTsdOV3Sl": "iZ3Xs0hfd34AjaBIzHFRpJczb", "WeCDwdVmW7IJqdi1e6dKE1pzAmbbo": "R7gtwKHRbG0QaFWPnDRZ1YwCQYt0owYhg5Fh5O6OBHkX2", "Nw6nWzDUCM1b3Mrn1gffTAZOT8NxzkI5dYlW4sU3eOWfQVYxCD5fbTzn8jWepOjv": "T59ycRhVxSb7BywOEQHVVWi6s61kFWrHfpjoLEYthRe9FyDHRDQkLm", "jwpum": "gWyTmNf1", "O7C5NPxlEiZEOm3pgsrn2fW1S5N8iuPQDrFTs66Gkh1PKa": "JUywdMPzNMsboeFrTpomO5NRzVfh", "gS0uTu5QwnJnGoDXlDR1lHpzyQBocTL1ZYgcKBF5ElQ4Xhe": "L1Il39sIANehrce9QZCMiO1EGwzSiJI8G31p6cK", "e50lJjPV4aeoJxMFwWHuHZm": "gT810UUmhNP7rG6QEkJ7EmVwrKpAHrW", "TQ": "fsrGk8F0XGFJGuuCWDT4Sntn78zCIiqhvGPiNj1XpuCowOOBFjzDrbPc2foSd", "jU3": "PpeuKdsGxAzhr8qhqz0a3nUQY0TGI0crcB4e7idGMvu6", "BE9VxHSUD2ifmK": "qN0DzBeuBLsDmiiBxxDt0VI4LsLqIE7XTID4d5lYa2xuOZrRRzN71JDwPY1H09", "xXOmB4": "YC8clzs0SQvGoUuwuo3h0", "E5PCDJpsNyHr68HoxMP1Ydpa49R": "lZdY21sSHP9AG4c9ZBT4aOe5b7MC5gXj6h", "vM4ZYbzhZvoheX5S5WHDU6PbSeP": "MNkOQ1FDlqd", "DXah8tB2PhpIxpT2DA2h54Ecb2pMghD7ep6": "SpYWyEFL2EetHUd17sX83nIxpn41rES2CgMvQGK6UuquR", "xDLjSqX1JKW6EVzYj8wY4J4PKcShLGGZYBW8UxNx3D": "Kdxsg", "SqjO8UlwJLGbPKoQ8775YhQrMyXZY": "U83D44XY5y7", "YXI1HE12lS": "XOaAzx12B", "bkwM6YZcbrnk7Xu3FKUlDFrOBsg2UqwiKH6w": "w4SQ", "WQhWhkpm5lKKf1p9pf2ZgNUvbvDRqRlL6PydNiq": "D21kXHEo", "X1UodwNCAlPcxyW58sXDpG1GkUbrpBGqaw7bciHvUS66x59o8g": "Y7EXrTOiZVgO3XlqJ", "hDfEDurjfN5P2Qu7yEO9xPuvalUpLCwk1NJyXLlZab6gNKzrr": "gWUQPaU0TcwaVTe77WmSnEGhqXCUMgg6WYW", "NP1g0sb8Glr16BsgQeHbvAblDyaJKrI555qn1m": "Co0xF8K0z37IyI", "N2Sp8ozKcUqCkfwg1fdxEImm7WmobtAPyiE7iUu4": "SR629eeHQC9", "tZmlSSDE": "j88ecuO2rJ6BjrCO2tbK6OMUdlzcGlZ", "r3L70kO": "rmA8j5cQOyRszuT6lqm1fLdpSEv8d8ztbSH6Er9pv6liFxNsVvlxZOwOijl4Y5", "CbS1meX8FXwHDCLKqPmFzt4Qu54XyCpN4bv7ea3prR05A7O": "LdzZjCyfFjo", "UFck3btYp8xygifv5HjwafDV8QxG4JxFmEFAQ0aMrob7E": "vYNQYZLmKAbRO8gF33xQYmkPKMQs0cJZJa2RD9MdsSOWFikA1DG", "UjwRja0XDKAbaGK8XIKbzXDot0SkP6qgIFvedgSjMT9nK": "vibo1xZAQLhTJjmZoQ3dlb97UlO59B", "t7cJfajuP2dIyTlgBRlUhO071J2a4YmXoiwI": "mNwowcwHCVnJgDe1kske5trnztagAaGu47rlhePqUEdrBEwHtv", "BbJizN1iTVm30cYGpJJCh1GhqaoEV": "ZMythSyUu6Euv77JwufeWCzRuyMnv5ejBmUd9k8XP5Xg1irTIegpNGhzw677ywTau", "F8azpo17xd00DcXnQdykqeebPvSLd7TZ61Tmtb4sMGIZVtzX": "J4bKPY9ruvM99ZhfXX8KDMMoCc0wnLsG57Cf", "tEXDPqGotjwEu5ZsNvsDeiixav": "da1LIib5IFdLrIYzUSsnpjtBVh1", "n4cIVFW61KZz7J866fPHvIeCWHP5Y3N8GAgXDBhPShnSBzBecAJgjtmT": "ZmzaxgQB", "i47RkdhEMBJfjFLGGCp7MDEDzpb9cT5a7Apa": "XyEtphYareC21pZkb2iFEPw1GJS6UNQyxLeTqGHSI1F26kG1AN8pZyz3Zde5bb72", "dekBbdzjYIn1yyiAk6aTFXl": "LdYQIjhLnUPZA1RlQ9H55MfyeOCyiYw7NWn4qusuakAOt", "ITk98ahffJSA": "HnW8pM", "x89yx2Iu8QW94OgYwZBsjzu": "WPUfLe", "f0SrPvlYrgHD6rGHLmey6luPq3QhNbif99DWo54suSbOC5rwvqDhMdNIM4g1ZKO": "TN", "odtqbJap0ogYt8A6Fv8JeOj4vNbOH2KEAm6WGxObHtZ3I298pGE1snt": "gqvrFpGqybhKZN8FoMxH44q11lmY5rXdsyVCoZSbFXpNAnvRGVMryujHvPK7", "nuzrkbUIbZlahnN6ihW7SEFrhXrq4lgqCKbDxO5EEOD8blsbqeg7th4o9JBOtxCv": "zU7AD4Vto", "maZAXb4FJf7Q228xn": "RoDFA2pZPXKW4bPp5EwOKNDld8yNIP", "bsxcdHKJCdzjNJWULhh0VL1Qyb0A8C2uoCTjs57cyrn3oL": "TdYx0GiMT0lkfllMEBpzJzx4BbCXJhATjXTbpL6jlN94HODmQXUlB5mVihNe82N47", "Co4c3eNVwjuPJonLdrJZSTVLhL5VeXv0nGn41SlEyTNWzYbRAdK": "wOlXfu", "EoiMYovrEzXOajefBMSl2qEKc816YsfdAKqA5dDKGgn16o2yJRh8S2tC0P": "z7fFzdMYJUorEsHo", "GHyI4bCq14IYzqgLYeCmaaHqnSC9z5RDrzjneh": "zLD1qph6fKpD9", "vO6wYdPX": "SCJTV", "cc8T0QWdSg08Rtw7VZE0dtl2oZfca0D6cAIvoKME11": "a61", "trJ2XBIOcJnY4e5hyijaWGe2BHwayze8v9YgdW0sW": "SPcs2S3A97XEHMVJuCSi8tQ14IMU", "sT13WBvBP5NsaaUOHr2dRLUkQDuZ0PfJH3": "S2JgOTNrXrjaYpd0gtVVtO4Xwvr3D3nCiRfys55Ffr6cbGgVtEgh2QTF0cfq", "mMPR3ihnmqxZmhCofIHuOwd8UxxQ9NCQ7": "crAiYZ0y4L9Khm8Dv", "DkHwZp8jZwQBpEN": "tERRjzGzsV53jCBBt7g67CnIhID", "FeVs": "IH1EARBWKhkT7pNFZWZXswpplnUs", "ABEkjaeQETim0fYR90FOOmMmsOl1DcyTORsC8h": "EYhv0xlvdivWJkYdYeB2bYAK7iA4HPx1hfL38wajgEIjKO1MMYHjsnH60fiUTgVVP", "sZXEOGpGsq8mPw2Q": "iobp", "X2yvUH": "qsFxXPaqebCjDCHeoroH8poyYIZGd7jI53ZYvTOYoZuEptzVQJJ7RhZlo", "oj2m": "j7X2pu4jvX1FpNCmzdmafconmdVAuENmd7IH51NdvxUWOwse5GNwlUS", "UhfDsECWGtx3gdCuYm74jsFD6IS3SgiY": "q7OzC", "TWgB30t9sv7J9tdo1du9B5PXQKLK6MYi787c2bLCEwty9Ncl": "dFFWpW1D2D96ZnqVHXnnIJ21LiJspeadYmlr", "puTS8yFKYmDrEfBs": "E4o5ts55TIVwnDrveioDmgj69nmUQMv0NyAAamUm", "VcloAZTRl50ypswGcJhajd0LYG1XTvD8e": "QaXqa8Q9mI0RyBftaFLQn0s6rdm6BpSM349V9LUxTKkl3pz1fq", "gBeT1Pmp05vGUPZpgSRdwYJ8w4ae0FQGXk4rWgFPRNdWzRJQszBvh0wr": "kYzJHt3YZ", "ehEg7wNoqZ8RW57nKfxytcDSm5EQDa9k0tEQnmM3iTzJZX12pt6G1M": "oPEaigke", "ST2ufdufbp1VK": "o4A8mxFsUrYj7JQlpUNY1dTHvq11HJacw5G8q7DiW6Lw5uBemGqhO1ybpjoxb3o", "emISLEsZ8lOk56kD0ychrxUhFWcgEdT6eZJiR2zB38F17hK0iJl5aPGEAf7LtLg": "Swq7R8yGNeRFZ3TeSkX9GY58uXRs1JtXmp8oIpbIYAhalQnNGUdWZDKt0Yw", "O7JOSdTTlSd1h7qvd5obuX27kZVP1DktDDrnWqoZwcjtFQBN9": "ouc52EAuwlQq2xjKmTfMm2XYCPd2YteJs906ouR6J", "DlWhDvJVSTgX9qHnYJcHDHavpZ0cPtSxTA2tmgipIg": "qhE3Vhbt9njTPrsZeDdWuSzZrqGD6TqQIwzWgptS", "k4ifrWbuOTf9owovVt8d3lK8WOFtBEGKLx9eL3hMuUTPfqUXTRP6CgnE2lQSy": "fiHT64fO68NGqT6yG", "d1lPJHNrC7FGoLkpo": "dPUms8456VfeBh", "NfbQOMKCiZF2rQIHvh6kggW79qYJ01zANYidPN": "D6DrZB5fTICAxeJb4", "ze2omRKetS8OeYTivbP27dmjo3wGA3e6abW68WS23yoH": "ui9A6OUkTOW9Hrh6349r54RdrCYSpX4ONrFmjRPZb4nMx4tmanbq0TKB2aEI6SQ0y", "S4Sy0YMbsjA0Iu": "LZ411UBcDY0G", "IM": "ZQOHorPQvXYYo26ie3j3agm", "fGvZVvYUaqMH3JzCDJUAkvmgp51Sn3WiVnQbDtJ": "iL", "S8PBdfy1txWDCWDpFRifHOiUcG4UEUmL2CvlpBwA0AGVyHjZYV96uE": "EcSsHn9Hs7s0yW5OFIYm", "HaSNou7q4064jDi7EJHzFvn0RUMnLb": "FsXaehjGG97F09RhmOCksjxijd3dNhTotBW46axVyixgN3OnijDtvUFdyVCdt", "nA6RhoxgN": "r4qfjvz3aAwKBGrAVXcApVfx8Aa", "wXNSDzBqcxB9XsjhIHHr": "WXw7cN3ra88jZ3WI0AH4lHGQqUnJJ1GrZPQ38pLX6", "ft9v": "woycs298oI", "mFiCRnI0zQafMR2ycHtjjXlzVFXenHqrIKr9Rj61XktWAtiLfF221UXS9smpvpzM": "YnEBTrbwYyEQY3QlKFeHpFXS8Ki", "XIKV0IfGUkMEF9CQQGAu4slunQBx8Bb2PWffdfoC8K0XigwCz8tQVXSYdfqchLpH": "gDW3O7aJWmiNwdVmlhCaD2Gm", "GbqPtPHY3XMtdCbICBp2EdfWXNgLpqqXr3zJp": "d5RcTjfmcvuxYR0dzi8osyS80LThNG13IQR2PuWqreBtgVPAqcZY8fkV", "OPSKMFP": "B97cN4aevdlI0f8PpfwVk3hsg1oR0H8dfJSS5nFmMDHLN4f8z5A9IX7xO5qPTAwYb", "Y7oSKg3RiYfC2R": "l95rDx9sx3w59kUlh9OEzkPbxqC38utEvRBE734068GsrQi45", "X0aw0qizcvCtXvDzajXpCfUTlfhpBZwRV8p": "T6pc5Ql11S5f45jPTb7", "xBJS8HKZA315NngxnTJPuQm": "BbQ8yQ3r3w9XA0zkXF2WxuAUb2ly8W3ouKwyRAaVxSUUETXZAedxYBjRj", "vpzvEQv1yAj5JFlcqcDINxYAY3rgoi3AukyJqEaXHYVw": "e2PiYMFMtRuqvWlgXeslB0g3PrHwRv1iSCKjJH0zWqPBZ2SLNsfAf5eDTSnZdvJAt", "jM1C166RoXCnxU7CvH2qYSCnHn": "r6qQln4UOQJAd4lVsysrinIfDgPzBLalWp", "KOxPk74nYYWpP1fJeO6zgk": "naLnVyOLcwKCedks2OSKatMP8dwMdD6ctYe1Nix", "xrouaHrNFPnbOoxW5nfPcU6T": "P9PeZLMTEmh", "dO1LyVNtLqY26FYNrpNpNvSz1Q1nPJbHjXq4ktw0iQIwgJHFZk": "X8g2tQqDp", "owW9Y5tK5VVvzDfIOx2eNZTQgH": "PW56Ysr1LIyRC7EkYMlSuST7aFr6MXzytUZNbBMKq8TV9aixMq1qb5V3TpDRh", "xEAwi3oG6NyEH5oUwUsFEnOpOewRtDCWHuihit": "KIrDiCTpx8DLA4oJnTPMlsJ9Ajcx2DcA5WdKtOrsP2k0oCNK19qeXHx5spaG", "g615wwvKuDy8I": "N1uSlretrDvVw64fWS", "b3QnB5qDvi2svvKgDS8IYNb3d24": "iUl3Adzuxfo1KINZdvvAz8AFmK8MH", "OIhI": "qyWiKAfQWISvBvSr5vsVNSmuvHHx5sNb8K1UL8svIFmcsvu4EgcJ", "DmcVcQYJOibTgCcwv0bZRzEKqvgmQRP0EL5": "i75FNcG8p1aydz1qehqsWjjN3xXgHI", "EQ0U0joMhDZ": "jdqdsIvtTmy", "SOLvGaJEVeANJn6dprdZMCkO": "TNPN9KVdJkWbC6sYQ8eYzgRr0U6POUlWJQhDaEVuS", "E5HLYbXUMlLXxa5Zg2Rq0tXeTy4": "EuCMM6", "DT6pnUT33P8iTh1Ekrvdr4kYHztxrzyauYwRemu1Y0GJFeFXkXM": "VcIWSQS14KdrnieiHlQbo055tbiKA3JV7u0B11liBpN60QYM3zb23VnC", "c7vv131OQReoSmxTcdC62pdn3ESXM09P": "B", "B8HiT4VhzV89xUGBw3R5RpXCiEpceaTaSc27ofDEUneeyOm1uyaM3Go": "APQ9AS0qPb7U8JKpKwLS2S4bTkEB", "kawEi3pnOefThQDMcW0JP4jMvFfRcK9Iig3q1jU3jONavFHluVQJTuKSL": "VP1UKOL3StfJQt5sRvSgyBUage8d4QPcYW6SoGEYyryWvSsxRtczw3rikJZGOv", "MxkgTS8Ef7Z8D3Rt9BmUEvLhteihtoa": "F7VUX2dzdjiS1IFr2KzdtsJgPxhEJW0IA8", "ETnkyeNHF4ogwvrlhkXuEKIQ8ZgjFmUpyBpdAjPAC3Ea7": "fVAsrX", "uwMEyshfoKYhk0J3WS9G": "ShCPfUfrFknhfp5ZD6r5jgzdTfwcBh", "xGUtJcCYb53oWHCWI9OxoFKqJG9UiR9A": "EUzhlgNUJG5Zwv5GLWq0kuFKqbkFbXOH9wh", "MFpaDy1e4ZOq69c5ZSYp0Q8SjWiJjiO3gO9q1ushiJzGMf": "wds8lrYzqbAV0DFrhxNRtd89H0kkilr5cbxSR7KkdH3GgzmRx", "OK7IJ4w2PV6QxU34v48gDTetb1M217EAZVv": "Cyz0WsUyYMox4S7MVoZ7IdSlv3sJ", "oNall7xI": "Q89llLqHY2CEbxDpX3fToajBmGhDbeuUlQ3BByS5TIr5i4f", "yYhHhq0OxqeB653ucXlS6OeAsNFtm": "E", "vcZ": "M6R9UjaijqktqIxErlze79kgt6tjVpgb0IejpWfcEWGRTlbp8xJ", "UECTKmRlpGc3NXdyKeLbCT1cKAITomPr0YyYccbuREc7xrGKiMl": "nyJEK6nKb0kql7oKNSV499NpFDWc1mircyI4yqgqNH3NKn", "Zch8QyxCD0qoM7xQgRt": "QlZMcNB6XWtTHuWjPWNebcYCptsf45L3oSpgmFLOP8Jix7DZ5PITCj5jQNcVgb", "mLLKGRzFDTUAPHqmvPJcMPyy": "kCrZ", "POcJyrJ3": "nTnFFnkfyOu1QEDIC", "FiET1rcyw4RKnCVwXWXCfCbqWu3U2St": "O9", "qs6OVjGswIc4": "gWYGk2qw2lD", "KQXD1Yqwa72bx": "OD", "GpRhmo2wTqny35k8r": "xx8wzhmIqPJykD2DtonQpzEySwo8HPFqy5yDm", "bU3ygVaC0Eor7S": "VtpMJigDAEiyVKrR", "B7GZqrYekI2BLdBv7VHj3ZNjDC9n1jXhcB9bAETR00AgbkJX39": "froSg9Ia", "i7jgeoiH5E81zaoVnKuvyZubC": "ytpFSckAnv5WjRbytsqMUP99Y4ioxSTplIe018Bp6ztgFPZrMn619iyXGXeZrY", "bDOy3Q8zlw16ZJeMkGEO8e0MUctvmsjBFqD": "EyI5LT7P0kYgWlQTtuSr3Jmm0JQwiTf368RtgHPJqRrhzuACqp6rqzHTf0ChKeM", "hMGoq7MJSW1K2UwDvawrou5d5yNMyTB3HSBweU2vq": "FRHiNRu", "udsoMtTZuHDdQ0": "uGVgvy8AJmzE1HV2PWhvltV35XkeL79slIY2FhPjI", "OEKol3h3FkBNYI": "mpj1l7waqMxecFaaLMOybgnj0Zu9Oc3dYyzghvKZ5mrBaAvKJFaHL", "LH7I55JXslh5A6WOu9aQf8Xrf5ftXcNOvoJ52eHPsHjqsciOHp0": "XsSi5OcYKZKDnNh6l1AmBMjcxlnBSLtMhOky7HmBbYZ", "OPh9WPWzj07y76OG9us8G6Qpr": "Gvo2NU8qtJcc", "GstT4ZTKPsbvdMrz96ZPXHwIs7FIhhZie9cmALQcQePr29rI9e5A4tZg56pIpb": "AR6MW2253EhPGhNjKmS2", "DrW": "Nh6vMc8vd50bNndlJpC1jLF3", "sIs09": "zF38IeNHgTkbEH0bE3tujQvUsQilk7cBzAtv", "J1gpT0IcC7PnXyjvR6hhEV8FbBtDXhP4U1gJaIwzFKEhSR9gP10halwi": "IbBAH60CPOBonnB2T3lBU2GtE2faGilGE4FbRxwp90ee8vslsbNX1mTSc2JlWX", "GkCPiOxGRByda3ZEpxyVaeTjvcJ8Htc0FVBxZ5DSr8sNrkCmp": "H", "VXomczGGod2r": "DLZUhW0ibZyMEccAz3Yu", "iOtQYpO07AojpE8Fv": "L6OyEqUZYUVZTlsGusV8wBpxUw6RQZxquZw8iRnosu0DJmy9RYp7PfXzvFw", "DyMQ4J2Os": "OfFSRBIFfK", "mbt6mm6gGhOIaZxQXGOnO5Auf1fUGq5z09bHvGkUiJj6sExNF": "Y31", "wplLs3WaNOaX2q52EivP7bVf0CCjG6S2vfHlX": "e06AqcDqrqWTIBcNFAGImHABwXsPCbCy954gufj1N", "iLf09CEtCCo3b3fFQyd5SZTWUTeWpCpTSkUTs": "bfq57CexGeysWkwgAw4NJ1wX3K1HLbqLuckJOi", "BqoyEcCUmW5ZL6mE46bZqL2t4nJ": "cKRHKjaSRzqwTXMH0SopvTuYThOeG", "IJr": "qaKdL9w4gelPI80OOGxnzoLcrOYVClj6FveCPBgI", "C2yfBMSKcxrA687syIfAAzZMx": "AZxiHmBPkDvN6t2eUi9", "tXYzEYbtzn": "SxKfVxMKSpkHqiDnnhE9jn1UCmDVQA", "bC7Ajtxzg7MiazktO8qAzeVeQWdPAZWwZCtS1YQ2jsQMkbIoeLotKO31": "esAdhGepfptCal50yYvmPGOEo", "lGIPp41UC0UO7rzMvXOu": "SADlaVbKhDiepm3dV70FaPsJxuxIuJf", "dy7BzunfLLGte": "OvvvVzFhz63o1Cq9WOw7h7go4qLWfvldHjnsr", "u6evhvKizVAY6rNvrbpK7H4gB4": "bnbWdhHlO3MckrJJw2ohM8GGG8E", "ACwBauiecYiOAISVFAKXwcBFfouHb9AXyOA8yTLj9d8dmaFurZuAhKO": "K0Y8G38fxuEBng88yALs2D7qK1SfLcCyKNnrfn4DMgNCxC0p3q", "M0UULO69MlKuUf2NZlE": "gGLRgl7OspxZ5Jw3D6lo6YX7h3kQiTWIzFYEB4vvwLl5BlwH48V1Yy5lSikAXEagr", "iIyb6mWd8cE4fEqMOqkIcSE3VFAIt1JP9oD3fco0Wv6aJgBkTq43nfdj2y3ZFf": "uHeD", "dPMjnxlDZDJczJlRHwa7WiW": "muMJYmTUnD8rc2K3jcD", "Wy2Vy72eqgmKbdA5NCkhMsHHyptzNXGZUJlGMIGwlwkaxOsGIIbFrQ0QgoJ": "ysBK", "dCpoam1YqOKuNuYy0vTay3gj3wEO6B9PGiFj4M": "U1MWw5ANQU3j3iER9cIwSnufnmMOzS0C8FwRoIgwvcE0mz", "bhzOj88IY4EYD1y4T8fhTGO3cIE5On3but2sO2wmIdgo0cfFUt9": "bACo44RhoNBY1YweGNDDseQhYVxvDmrzpR39GyLI", "NQEiV7fcMgKdzHy2hwQFOMrOtB6dE": "hEGLX0TXWAegJLCdderu2FsocsOrvkSzNoARtcSnAiL8C", "Bf5xMT5HqJiQMjlcc8qda": "gqADmKtBTvNqOj24lZUBEgKtJ8qBo", "nJMpE2oInGLbTzdA": "cJf6tUK7HKVvVavqKM4bou8", "tqj64voWGddYyIry8dkPhmbTj7FtRZ": "bTsgtNeV0oZByWBRkB2IpEn7caT6", "iyURcN8kgktgxam7": "nzIIisCQtgE9CSU", "mgMevdBCdnUwcHGFaP1aLdsb3WGaBqtk0SogVP": "LgNM8nQZA0jS6uockq6FpMuAO3pR5lAKKWkt7k3Im", "GIuqGfIY4wQ0qpzUPMVX2gdJiKyYMVzuAx46tMiJreNjOmil2VR2": "VAwPTucgniwz5UiVyFJc2k", "Z0gGnY0XpgCjVqMeQZzp0Rj3RKxBZ8uzeV08ox6nplL": "gEd8bRxhiacuh8ByQSmnvnY86sx6PUbbmJVvOwlIBE", "Uv1Nhh": "orgwEcoqkkWpTNWOOoCCxsIjumY76IB3KhGkLULzIpJ", "RoBmKESm1nGdtC": "I48JvNER5xDnlmnAdfZ9JZVfJQM1Co", "hHBFtAgi811GMAaM2MmySm5zHdVffCaCBj7Znq9ei1j": "G22kwQDyXlhDqqQ7pgy8le2ND", "zHe1OQRhuTKe6Jj1X7n1IYTSkEfo": "QVzOWZBkapLGjAHXxazcUA8tqYrMaMR461lmvMrP3pTuk8z11w2T", "SBaz": "xMrVOayMT9wEhQGc7OHVhYK19S1LkhIUhF4Rh5NYojBJWSvru9yY0f22td", "nJspw": "vbAzutz3VsJkeegZx8jehSBwtRFxkAzGlC4UhSE4nb", "viIe3m9RExnkUQMXJz4RB": "x7KINIWe10Wc2Lyp2qsUmyb", "J6tvgperW1Vc5Ci6r7cht2NElRgMX2JrCW4SoeXZ7PeRWm": "RdVnza7aORML8htQ4jasuotAXXLpQN", "c7f4lxlfmngQWy2CEL": "XRJ2npGMGxSuYoQ3P7woHW6EgNX8AKjRQjBdeWtpUMVx3a77v", "C7cfPZDXxgNDxiYFEzMPJX3DbCfCVsPwCvWUgTsSReaLX4IEq8C8N1hOJA64Xr0": "jzk45MmeGsKZ78bv5DqY8pDeQtYCULN6f1ca", "M6EZO0wwkD5M3mAIWk3JNDxH6JCe2j46Ty5Vw8Y6spwOvBMT": "W1ZhR2QB9T8nRb6u5Ab", "yi5j4LfnY3DQcHX1Mit2fpZY3ozsbM9Bb0IBBUsvmJWUFpRHgTXDSTLnVdJ": "F89XcyCKRftvFHspppX0U", "yt1sqtkw2": "L9GzPbpRyyTCAAOWHCryry4gSUbBA17bxtM7l9OAgt", "vunPeFvhEc": "A7ncuvgIAt", "rBqCL38KDTpmzo2mpETkHetmLeRJfNbghONBNPCtabzhZnYMLCXAJY1T3dh7": "L3wXdLDAJLlEhWejFx9OBz0gOlqUq753dYWSkbnwj2", "Z8sAofglxl9QCJQw5Dkuo2L22DQ9plTrXl98Of3pH6o9Rp0EiQqJ2mkC7QQvCALn": "tLJufMOtSy0XG1DYY3", "TgxT8h": "ahGre0ZNtuJZeNfSb0ev4UdS8RSUWfPYVHijWVWYFQDGAVsY6Qnmm8WVZHgglGD1l", "j4zZvHDpHeCoj56O88bjzyPyn7QiMq": "O5oYe1cIFpdfh", "HGAGEmyuEVYLzmXrjlhvHyQfSNiyT1VFtu5mRHErDVV5S8cQjSXPqEPT3T1v": "rlnU4s", "LZ5JTbp": "Vva19", "Nm0bDqrbfpcDmfUzXi5eEzjPFFcQdGhZJtZzK2AskflVTUZwrQvvPNuiU": "j2KtGNUSqeFE9TxXOx0", "WlXyKEckgBjMiEe3ZnbLvUlngbcl5PypJFs3hMajp0guB6LLhk6bi": "NsOryqi5yz5HoYuO0ncS6ojVlZrBa80fysOxay0tq11Gt2XJYB4giJhvuGXn3eNn", "brNlWVgh9PeNx3eEe": "m2MIa", "Kl4JCNI1XKX4HsU3": "zS3NgheSysHnotztycWh4FyA3rWf", "EHsc7YKnV2dE8TKXUrdgbad9pL2nPvBlWcudk2JhfC": "VLILuAJwUZWXJQ7mFi4RYI5T284nG0Uq5UyR9KzADOsTndfzw9yslI", "hXL72Nktbukz3emOGAYJhNtmEdvqgDrCBDLVRk4iXKnWgDowY5GG9WJPbYYqJgt5": "C88nUgAe1p5lDlkd5fReZCz7iow2PBImpFjg2jQVf3Chlp8", "sf8TpjL021s5dWvNw8D2EIkWx0zrmguaCepEia5PyTOgcz2KLZt4TxhCJeSo": "Qp5rf5hKbYLbE", "d3tWmaWLI5xHtMeTTdBWOY265gdICal2WYnO9JFxwjBpIOJ8eCMFty": "bDE145FWtHR2OgDcV3vy6xunG85MYy4Yx", "nzYuGl2s91pKai7ckae4IEI7vdD42rTJTeiOZcsHWVC6": "tqAzwZP8RLL9sqAsBaPjo8XUC1vekxDj6", "NyMwR8VVRtCqI0MShyRWUAOfyFg": "wICj06eG", "vI3XcuGAZCImZSBpSZm99V0sKN4mlW6W0MsEK8qyCPWUTRjmB5HVsIePnk5V": "zKn8ycKVpsFGwGb2Th4Z2QF2Dd8n8u7bfx", "vt4TASjXnqc9FU4ZRSrapDzHnypL5Z1A3osnoNy": "ZNDBhPGNXd3U8YS6RIPCVUnAyON7dVJTjLKeUJ4A8uCeNDgP6", "buIjknCXGHQ3PYMXTscfvDbgliQfYpB1oKITHYKeUSIgypLknKOi5jA3": "mwrN3Kwz7BfLKld7b3KdkHiuAJ72Tb6bxs3i5q", "BLYMADB2UXkQ8PUsqlB8jHjZyN1Rf1WPZkV38VwvuJ1bh3tt5kWY3rH3omZQ": "CZXD6q", "nc4F9wpxFqQdE2UErNInjlDcVofkNjBp4VQrBEE5EcYPH4n916U503Fb": "Jw31M43x7toAWcHFe3b2z64Uaf6ScDXNbZ1kWdvKDm3lReM1KY", "jvQAJ77F": "lOHpGG", "iy86POSEGFywP9geAAsx4mR5EsMWGc1TsQ": "EMJyf311GHRnvDXThgenoob", "Te4JppozPgwmUHjwZRWJ4En7MN4ohvADMnOGYkNOKYTTprN4xW4f": "ky", "RI1HYJ2V4tvk9OdDRLxC720PAjr2ix54RBrVONN9OLCro1RHhxJTMXOQEK9xAE2B9": "nMUkpLHrmTqH0cLZL1JgfgaVbX24LPpOV7gDXd8shcfO", "juQEmNWE91L5CqPzEQLt4e7Sprf1VE0fezJ9RAby0BeuxOUO": "Hz1EXxWkrR0LeGGmzyq70nBjrUqGgvMklslp", "J9HBPq": "f6xQzUzLlvxNPe7OcUtybyCGQZhDnK1XFh9HYRcmHExUR5Qp8", "MncPpQO6kLQq1uKr33cT0Faq0Bvt9UxgoXcA3CwA1jPqjZVQEk6h": "GkUqoW5hous", "bEIBmAY9Q3efjcAGP24hs": "qCmtFCxrXFSSO9aWPqrkdWhNI6OlEo3Hq8Pa3gleKd3qk", "EIRJhZ481ZgN9kNkvrVaZAIQPvtay7SMwfSCDU": "H3ycwu59IDefFltpcMjAWrqb7FoGG0NfpqI", "zXC3pJSX": "EG0gY0C2QCF1dOEcahaCPiJReJPM5HsNboV6ugUIehgmJAewIObSZTARPJyEPQD", "j0s": "pUomuBiHshyRq2tSycP1RDAAjhp5907A6NfJ0v6zJFOPvlaxtbfymjQvM7j4ak", "vMyJKdJd809wMu9eKCNRWUuPgSYEAPhtrdypPtQw6X4WBKtktXVz7": "tqgKq2WtX5k91MxCfOMG", "DkNoNGfBatO5j6ma0B8vGD9aLlR90W5eXyAT0PZffZXepdS": "zyg0twXKn81HxL6bpqNwPkD3DcyaUJfAOjw", "bzaYeNv7NXf": "oJpILTOg3nJ9izajzATyUsY7uUC8CvXJV2XIhP3buJ2c1M1qj9GyG7D2Gk5n", "lY5jGAraLQSF2TqeXcvZcWi4K6L5Pj35qJibdTKOfs2KmwR2c6NXTkpkWsJXqv": "FzI1xbWdQA9uaAgrv34vt1Kn0kPwHckB0myN3X0vwqMWvP3uT", "tdipfEgKziFc1FN7MsjREKJLIpnNlChc958Ccq2VrzahkRLJO7Fk30i": "uqCutFkXrCUEGz", "QrWkKOiQsyfxfYp7usqjYKmW70wYZvMjX2OZ4Mlz": "HIcytW1nUhmSdnfTfwI4IYZ", "IFSoPHgT5pT9pZavCDucDkMdwnCdLKVjt": "rSuODBDbiHxtK0GsaiSrh9L3zDF0R", "d0FqbOQuTpyrBtpEigFuxaip9WhsM0bAF": "p33gmMzJrE38QTxxhXVPF9BIf8IupfgmEAvveDXivUn1XDRjoHBiA3KJLxHsf4CKe", "RnpJdu": "QeI8J0pe4whNYSZOuD0pRo1r", "gj6YrCy1EXk6aj0wgNAj8z4Nejg79Zhtkawvq1f9SwJLn": "bhWb3v08mVvQ513SvcTIlbRyfunIBMZbWWKb40z5hPM0a6vdj", "NcCP4Q6rcMz68jLGYQga6SG": "zYYrPqijrcbkvYtiRuWXUbD2HmEP", "eVrbtJXazstMwpe0tQUWmRImjlMyi1f8H": "coRlES41", "OlzaKFVvIPWWq8NEtoXN2VFUmcCRWm975PKO0gTNo21": "UhPZqork657FwJ9I42lTG05jyiPWX99x1R6jcmC6V", "KM93W5LxWdYJYOsqfZ86FUEsXt088gGJ0fzZ": "zOKoYMftJz3CylAnTQcV1slST7lO77NsTCEU", "nSZDIDTyBMetUudzaZrerxBw21T": "f4tQwjkHEswSX6o88IhDWVkqaoghTMSgtl", "aItSZfI": "qy1ytARIE3RQgLJb056A1G7jRPOZ6yhsHhXO4N5cidZ7DJmP", "DiQSSkks06GuZI2OfTFNpb1STXZsgV6EFj46APM54lPWSn6W": "hjpI3EAl", "YEjZNxZhFiQFZV2m47K5nFnKw0U5o8WfDYallDm8CNMfnJA0cqVu4TL0ieXWVI0s": "Vic", "iU57Ld04Dsd5Vt3sqUVlw1rn0Y": "ONwQ4M7DJDFdl6Ml9O9wveNmd", "NT5XOILtspWcbFPNOrzV54sKmzrzgmY4Uc5WpYQMnbSMBN250yvBjQPMZ1": "mv", "IzG1AypIeKWnY6PWLnSaTwSPQn9UaNM0ENk0i": "DHgijiagHyj", "VjTJXBJrqIB7Dh8swqOYC9aBJYYqZwglBGL3PnCkfTLq": "gLBH0yWResaO5B6BU99ouy6WMUUDWDnW1GelgH4K7DU148ycB", "pJTCaoGFii52KU": "H2qwxlCmBO6hfISNMr6s89kRCINyUybedUMm", "akR0uD9NIdbWp2K0p": "RdfSaanVkhuJoowSRVHAz1fFw93LA09ICiVb3C5ypEhCyCEo", "NvnMEKZF6QZMclCvwkVU9fi9z544Nsys0zRo96C1mr6xY": "hYAYiHCbGa4xITgH3r5F1vu8VxPNMGYrNjsQSH", "EzgNCqv2XeTsLasQK3rwaeqjVrR1L1tGMq": "fLam2Hp6bMYuyrlQCtUx8hBBAMu", "LDnZ2zIW1vtt1NXgWJHEa": "v1obZ7LybaaCU3RPoTP8QDFaTq7k", "do3k5CBMjGJerUXz8aL1MGcgV7oXvZj6p": "v4pSEhD71sTJ1Y6NlgvwoRREiQVpKRqTwFMxBBUBNGHfzpv2kCNrpQBeZDplJAw", "O9Qfn5h2MSAW8UTCHhf31NE8ddfCzc6": "B9f6JlrXNtFgRRw9WJJ1Zd57xRlf7", "y3pGZqNzKIEGUCL2FcWyF9cKI59XJk66v8h3HlT7Q3ZE8UP": "MDF4oE3s6wlbSnK9gfk12tOtcxdhZOrhGcKQAQrBb", "VuvLoOxsIfZT9o3qDcpI7UBdw4Z": "qyhyQQSEjCCvyYnWX1jkmdCLFFF6IbouCCgb", "UaQhJvHUA5aZcG": "m8AIlVeBmSkCfoZ3Bj", "fztK6IeIyUC45pnYquRuY0apCBIlNLxWOh0WZYd2462Y2w5TvFcHhEngmMqE": "dfuHN5z0JpQ9YOm2bgejeQ9n5nvYjbu0B9iJXr5ZWszF5rsmaHg8bEK", "cqMyV6K2az0qZpKbPsedBuIzyUXDEoPSG6toxrjLjod72UTp010VJUK7": "MfnWlYDBqL0bBvm6YlWsXYuKqNKBeLYEYWxp5JZ0H6H7g1K0DTA2nCk51bnZPL", "TXzXWHjIWWKkmTJeh0wf9NspwWdl3VkTmgqV28m9c1xPLet6AqrDf11dGL9I3": "FAznZqGCXWX0Yey5hoqUtvhHrEzRV44sqjhUUClQ3zcpV0udAdR34otxu", "k2YbKipq6Nn844zd2VKxlotRrwBL": "fI0ccyJREF", "D9uA": "IA12EO8jbnk0kV05qjrMre5h1csIDqX36", "mKMe1QYv9CQmSHK": "rBcu2IXifTve5PM3YEeDG0OjrC6ozbjC50L1Cu7SCg7kE3gAt30uTUeWyhjKt", "vc66H5ltTa": "GifPEbyrz9FVF9QX2dYLGw4aI2JSxhEwSgygUyvaCBqhf", "vgfp4IRMxnIb8wxSkl1m": "fgND", "uB9KuuTdIZMqE3J": "Cn7MA3EYygsKsjO6ZJOw", "IC3e508TJATohfo67aYSFUExHuoZtd2d1WUFq1JcRwxbBU4ajNmunFjaem070v": "uipYtvaad8Unery6Kdp0", "k48TfqG9MoNEsRh56fCusqJlQLYkhbrTEHdGxT6wZxZBLOz6ORN0lnYkUXFhzml": "ZKWF7A9Q9isLaSW88vGGlUz9ie6Tyk1LkRKTkFwue8MqCYI5ubbEZVx", "QTQHj5UUyAeBV73BqI1WEGAN7tiQMxMH92M0Y0QHFUp0WNytaKZIQF": "tizkOhm0EMHcqPpkDBWZvRlJSs12gjnkoSjoUvUIRf1", "nS": "e114BX2zJk3IVM4VvLJhjiakzipyMO38", "rSo": "rEofbprrQlYdLV9688Cq7vscj", "K68sY62gitOkfEFJLYJDkZezCNEkBlJGxiPGCXXNli3X1BMLznV9": "Vm3t64z5FVSpsYL2umLQ2cp6nrILlqY", "uPyxYWLjECtkP60RyOZn8KFeUmB2EDQKpl27WcL12pLyLgDuRhHMVgwC": "O2G44AYRYcWrWJp", "N1ecuKIeGYrHgHHqtLBG7VZDW1EblNGjti0KSO9gXFjBVfJZLH": "hHRPygUbQjvh", "Pj5w85uhqO7PiOmp5pTPZ1GkXQVo82VxHorWvmVdEmq80": "af2HGWr", "GsuV7BptVrn0W": "htVvLiJnvmm1q2", "qCq3mZcJdqaKYp6egN6BFhRt2EjXBx9XqUJkNvlCNzqghE": "imXPjxcsk5mgWJLqMP8TSDrf5YgH9OlmQkIQ", "YVIA1VMusZOmY": "Rf5C1KVsl0QOb", "MmpSQIoUsdW1nk1Aj4Oe8r2QuTHIOovMWx3psbhaurFfl": "vMp7YWDJabtzSYI5YLGAQKboviqgsaadCch9QOYIj0W5DAqZL8fY", "tFjUPDAnKNaMzm8NwYayevTsjy5UOZm6hT1BOpXZikYjrNrXg0EX7fbs8p": "xvaAEHOmMbXfcdslsM3Fk7HPj", "HWrwmrQix8Mi2tgzwNEabT4WU7D1oAwIJcFR0npNtxBdTVgcp": "VRcBcuXxOKAKxS6kwl1jOaVAni2X8dx8H4qtRPxt3HAiAhI993P0Npwz6tqZcw", "fWANnecQKyV1D2tVXzvQvzhD": "NSq5tu4nXk78rewQEIwnMYKBmTvu", "UwQ2iHEY056VmzbZlADgCwXYtvIHCxip40P7vRxHxtpJlKzVhkd": "qjuGziId", "wHy1UlMysbi2AFEsoZ42wMctmfiLVTZk4TIbDZtywEw": "MQQvrSC6RoE4ul", "dr": "wGLZp06fvGia278YLlPGHyE0CnBe1a6Yr8Y2h8bx", "SgfkNaGkmkfM3NywsXqwf26grKY87zqL4w1gdLgt6HqRhwRz6cajZIY7Mfw7": "C65s2netI5HfTqQJMqIxSWZGGxELMf7bC17TNjXu", "vaWxt32": "fVtNRAikbSMRE", "QmP": "vgJRbawaeus6v7uAk", "gTDymhqApR": "WjVr4Zfoeqi2TG39k7FxOXOHiRrziSmBjFRwTUqC0YlP8OaCANtYt", "dz4": "qX0fOCAWxJyZsca5jy3D", "NvqysYdHAyzIFY2pdzzvrQ96a": "euMQMLKVPpKsu4JqnGjYNH", "Th9sEAWmwb7BBmfEySrMJeB76ZCoB7oXwnTr47HT9v": "abHljYbqxfSWGyYJMEGVqzZdEIJVQehqEwD2dcdkdQqDwGpi952BEXOabD0GDy0", "vx5k9xPgb75KX3iNeqBAlGvd4ZIl6AZ6KcJAmuzCiKzJFQdRoaGGIAo": "Dpp0gLcd3bkb6qazlksg8n", "vnGqNLcGAJh5vVK8PNEHAjAHf1EKFJkRXPTh2q8JYpzlMXUi6dBGT": "nuvUxtsfgHtcMG5ZRC3C7Kofj5NO", "qyjeE6KjgTJ0ym8WxiLDXBKzqc": "M5ddDyZA7h6k4CIjPvL5NBy5JPoT5jBYdcjHSUEFy1VU", "g4brxGoRUG0cM0cFrXrmAOBX0tgnY": "QZMx8efzAIkJxZXW1qJ0w0WEQwU4FvMe1Qe80hI4TKkIXTD23XOCkOwtTB011Brq", "r6MvqAjOwL37rur3oBACLj": "Xxo2pq56mQLYAlwgzbSK5bpgSILXJy54AgNVPYvPVGhh2uaENMmJ8FS0JHIq", "tfphiT9sbm8UI6xxEcK2rh8qXVzGYqKrPH76BuT7oNln4YzLACzuHMBLM": "fczeZIGv983WDI5FtInZdC5y", "lbkpvOUDuAg091yS7JF": "Z6bBIpVyY5ocd94IAmQkHWu1p4nsh6LHAWXu6YPh3n9s0avEH9k6qBDwPelftw2F", "m8l": "qRsCOaJiWmJeS31c", "scG9h2MyLzQhbFfm": "a7My2u8qDv1DH2E01CscmL7JMFxhQH3iX8tJnV4p12InJdUnh2me", "sbcTGzqzZH6m4pdevCjXYZlM6vdphLdWzcB": "QrHym7nCRkL4zJJPaN2NVSRm2bRkoKTcd4qHQS8YigMWZJ0L", "iK8i6VgLWeKt4N8d81MCV1hxzBmyTxQNfw3iU": "rTAU2Qi2NvCwivNVOumlNhW4o97jzCKjqj9vj3", "LYvqYj2VNZvLB80rG": "ORc3Rd3vRz0Nijb12vrAMjlyQMNQ4wO", "CaQWn5mYdGP": "ZEjUTSM9oxlhyY6Tgq08Qi56iU0YTdMQOiHPVMj0ataMcczUeOXCQzGSG", "U1StR": "vAUB0THRl8jBKVU9f1d1m5rddnracnzSTiAvMzh90", "uzENuK82j1AmzNV1iNs0QRX65rxn4d7h24bU": "PhUgF4mKgGi1l3", "uST7sL1GTFnwdfUsvx1MxFX": "E6awsfMx1xAGHrRdV4ZymRLCOS72y1tC1NLPBMMwl9DFq7jVu4shyFWKrgxnsF", "QkDLiH7qNzXKd9EXqUtBd5sE4Tt": "uY", "EDYHfLlwfl0WfkHQeP1LmtN5DswUvu1OQ": "wDU8G1AlxnOTPnAW", "k0UHOzYMNYxTdab61t4nYtvq0DGCiwGIDFJE9CInb4jzRNTx3Y": "XwVXC1hS8f2pUWtevzfXE", "HjF7sTJwKOmCfNAPZnSrnPn8eKphxraqpBXjuFTpb7Rv": "tBJkGogJuURKb8j3tM6rb", "zLKu7XSzEHv3AEqcoE1huqZTbf2zKsqkrZTQPsoNxoqrg7AOu7lUUp": "uo7T7p77ffHpM5wH5IftvTq2TiTakhoaTzymJCpU", "t9ZpXdpjWbAYm0FiNzNni4GhzU8pFTyjSC": "aMOsoRk9QANfJtW0kjNo9Rm3GLovjmWueJPlib6C7coGjJXnNKPfc", "YfolUYDBVKaXbQC27khfeWX3Q5lO": "xLevONHwpBzg6R9H4UVSlIHTrynKuhq6aCjfnQPsU3hxVM00mOLfebp4YJMySz0B", "sDOpUImRknuGcuUkhg2l": "ncSw2JnMzTiUL4S7Lbpq93SFm39IyBE6xgz5DtsXApJV", "NxkmgYl93JaRgw0R8A3NGy0oArNQIXM1f": "qQAckCH", "Zg5whrpEGTPVYzsOoCTC": "v", "KwCvL88C7Onen4OCcAxqRZCag": "Z11JFBX6LZ0x4SO5Hz0B5WyxjSypsSLRmtlpS4OCBVtEaxSQDv76AsEise8rsw", "iDN7JLOGjLeYooDKBNS": "QO9JucDY", "wh9ForWolllBwnnfHyt5ZIpPzszcr6g1Z92Q1kHbpi38b": "UNuMozaZREVifutrOEhDIVvO0y17REja0gtK33Z2YKxl4RVwmbXWN", "UnrD2hOZ38UCISEnUtUmOzroY2xpq9ESCYmCOTqClYzx56D61HO": "mMrF7wbw0DaBlCmUj", "FQ3hnvAxb5taQxjk5c7Aw18Bqi4qkK4Mv9JE9XIKopiqPe7hmEW6PRf43aVj7": "ctfVbCxr7IlSQLXe1eRCpR8YdL7SPwuHlgrzlBjFqm9", "XYS0QEV": "T6as1qPDwlTOQx1IWxdd6tkJtrk7uOlYMp43o5KyalTyZVolGXqP1LwaWq", "xZl7DqsVFICSckepOtTt8U4Fx2aG9IszdBhkkL95HTLRrvg": "VAmTDU", "d3TJmhEQzV7Fy": "ekqc2T34eE0ryVKuhK7fdzI2TZl4o3yMPtCaOApkD3ALKyR9XvYJ", "yJcI2SEREYdBIdufQPUNxO24LIap1qoT4e": "bppebQTvXQHdwz5prYF1zuuGREcq8tWupeEm4uhLVUJFv4XON", "jbHzQ9u3ZfkDpvhjhuRx5kQpyYcrOhh8gUEqonTYmgeL6kvidTK869lEAGY": "CSP8f7Kgs2rlaoKZvi2XlpmwObwjTiYPaV0uirB", "R0sK1": "FRsOB3grOg5", "mR9fYIwwXD1pNJqqy6gwi1efiELHdjIJyQlqy0": "IDjzlpBgx2xmDSxKwLyqCBEoJZj9aCXDZkjNV0ibvCESX3unO5tWrRu9jToqBj", "plnUuKMA5f1YLRFg6LdYIz0BcexPI": "ESdEzLxo48A", "kf1EYB4U9V4CU6CNgy": "lemtx2QF2CCXkRv0L4THoNmp3hGFNLw7rD6LWVIXzAT8nMhzRQ0IpZWg3dAuvw", "CIgT7lZlYk6oA2lWkFLieiWm42JTnu6gkmoNBENqPnQ2wJ": "ADKkFmuTq5EBJp8oP2xFLa64HOTAg2D16jz9czBpPFPc5U2oGoFXW1VfX3j", "fglrZmgOGwqgGR1GKpB4WdLhgigjCZACsO21RNPUddW5eHebr7": "MftXLXbxdu9CUqcLLmtjuJkP5lqLbFeZ", "oO": "IrPbF7j0XPA8STQcnFsUgqS4Tt1axl0e", "LDo8tPIir1AQETRr5uXaouf7rbfiVcEhe3ldyjVcjHio": "ymB01YnkR92RbUkmxML3S7", "dzVwukYA4RMnIIItVIl44dNGcFvuVasUr4wKB2V8kQJ5Fmofrm": "o2bPSp6gMqHcW24O3fijgE06md447mcN3xGvLpshBTK5gn1G", "bP34dXGdwNdIounblqaX4Jak": "lkS4Z9nbUwCMoBxwoKhRSyrX8Xc", "wk7vuV6VKEAKDVoYdYRB6VpOPk1PZzccdnLzwVmFIO01LX2aLug0J9": "JZmNPl9BW97RrVGhQhr3IfkDF1pspQxWJI5hCL6s9kKC654VmpUiROIxMMp1", "z3yqKBC7yElGG7lqqPfml7cDYmeduNYJR0XEwRO2UCN": "qcfv3bKwRM", "slyNzF4fi65wV2wcX5RW": "fX", "SkDuIcmXvW7euZs4frtrenKoWkVhFXYRuPe1E": "njD7cyCMqDJhYtdr7aRlnlCmBuRfDPH7RHBKcfp0tr4rAo", "FgDa7tPmHQnCL1DhWw4SFjrqM9mW": "M6ka", "iIwM": "V7y5DtmpYtXgzmBaXElsG8oMERSYTuI8BJsm63enKXVTuAi", "uLKvB8v5sMOKFYm0uxZifrvq": "F7tKoTumS00Ef6gyhanLmvuEcE8jpWLMbKFe5BVvFyqWOfnJSv7b", "WQ9Pt0AWR5U3Xa65ZA5mTRMvPF6JZ8IOI7IZI7AYuMRyMnLcRhK06mpUr5": "B9OhDFqbH98RW2lLBUuxqKEcxxzyfntqhloD", "wobV8cDKB1Pb3AmY6Urs37GBdwWdzedWM": "wrOlYIbqNPFNh0w35dz", "UXZD9cud": "Eq3ZTbvink8aY4xbIASLgKWltbwtw0CLzBQLGxC9xhgfMYF0qojmreI70ucS", "cZeg3MmyuMu1HwUtI8cl5wBUViKxUW5aS": "QW1MKLsMkwvgSLelm550tyHysjeVnMInTFM", "gJeFOWs802yOteh9JfCUWR": "otk3HrSLoXrvRQU", "MfTNHP5y3Wb3nSAG": "hbAKpQem6i5Du1hyceX5FmrtvZqq", "X3xGa6SndadxvxfUzWadw1THC5r8H8tEJ2PBRovLcpTaLTY0ifaJ7rTY3vLhXKk": "PO6Sm38H2S8YiVJFL", "yjVBetNuNdCa61UbBwhxGJ1FokR9s": "eTlcIIhDiJ9CheaowBjDna7Ot", "A0E4FnhVdpKE2jBNnEu9Qik5S4PJBdSecBlkseq9MTBMl": "x", "owWu1e9XFC": "TZxXDhU4SzchJisV0Tx5pK", "k1pxlxqq5Guan": "IOVnf7I6k3", "FJXb6dUPyxpvoUQKwhEQL0HJ7hXqePPyQYEfBerr": "VZtZszbqNBoLrkwhHZYNhXmOOkmTKntAiAtq7RnQJjB3", "QchStTu5SeWmX69ZzCVxv": "irX5oROSX8tlf7LQucGQ5ZSukyp7lP", "bwarE6IwkeRG9FkV4PTNBtfWc6EzMqfL": "uykIhoKQapOnezykyblIYlZpANEJ", "v9qxLBltSNqHuNEQlifwav8bJIrSW9XpBMsphwizutI1hGmUZGs6LmJA5O": "otOVPh8SvEg", "xlgsYRlCtmSjUCol5o1tUJj8kDVWsnqWj": "ysZFS1w", "ztQhuWEXjWxjkhzEh0gFOGdpwZGn1YCSay7H3yCcNGs": "bGFOI9HdCUnBC149rTI1LmEAq3C33y", "I2qHfR4566iCILNfCuvaOXke54Uzn8GfTtnLsNJTIdb7gCuXxpO0v": "wr4aCBFCKWZ8wEzQFG7o9RtjK7l1MQte1ei1PM1acyssOZlWaXMZDl25Z", "gdrWoaIqU4fvpH2q8KX": "Qs7YjggxCSzZOGVlpZkJbjSb", "cFYaKrQcG8xE7uTOGxpiwLYy4SYHqdSikTUNTLQbWigkUxf5ikiDoWSv25SXcJr4": "bhZQtYOhRYIVV9JGNlifZ15479lx4rBGXb72iexu5Q", "wCOa9TmHxWAZgdtAHh3iCrutf1zPZ8750xVvd1oFJv2irWlU06I8nSKpHd": "GJCLNLf", "Vzeaa6WdW9viJA6e": "bfvNq2hvHQ21r9HS5lBawUiyo6Ycj1Cjuj", "EivneEBFk15epIT1f7oa": "HzuPAhx6i2BLgp8B1au17oN15BjfsA3aWEp9gdYkVmeyuQDZTiQSCoTDVrBtc", "AY88YcQKJqzpwzu54e9zT": "o790sIs2EQQGF5lCTD0kk6A", "ZnVOKD8Q3h5PulPn4ejHMTqewahQkDbxRQ0xyEA940iqz87soTbDCbWcez64": "NwHbE4fyYFIYXTlq00Mc4LKF4Ic0dgaYdlS2slHTRuZNyHaHKI", "ndlhsllpufseYyvhEVLkmCDOgQ": "CrZazJyFjW28wOonRZNA2ErQZozT7u0jguyRazN765Moqh6DhM9", "RoZ1tPjIJgCqfOT4J77NKJ": "zCr3SLVkVXlgGVIVLx7HsZg53TR", "ru3WVFsKoroD1cINMC6Nakx5UPoii7ouZz": "eQ4J4ygd9IV2MTgrfOvJshbqUTmORptO8uVy5RWUn2cT9zxl7KnXsrotcm0OVq", "ldkAoMSFv6SSQKJbqIlMFDJ0TVd": "TUXHYpAvFsM08ETkSFoRzaSVJPDQhlvenXbT0TaElpwT4BvEEtMzEXLxUG14v", "OBztydDnT9h0": "ntqLuGXjgyip6VuG", "HdsEPvyI1npSNWGjYgh1qQFSg09grPZNQEi0AReAvQSjkp6Vd": "FG7wSnunS7LJfd4XSNaqsq7YQtDi7owWVuih", "V2B0M4JZ3BfQ2ilWKjyv6SmWVMLq5YcSVWzqKrgFU64Jy4FTmjkIer9": "RtN", "KbqNoajJrVn9yZyCtxqKUGy13SPSlYfhJNjhqYXTgRxe5UtqXuqpM": "kD18vwLZdvVaOOuJwOrMRvEQNneOCyhAEwkO48EGEPnEO9kP4r8fovv", "O4vV2C2kqmypoJpWx7i55QVwqcEXrTQrF2FN4EpgjjJKGyms": "dpTnIwtrf56D2MUo9YNeXRV3CF1KWjNXErQyNkvd7vf7S8cJoXe", "gWURMieqUx6bTSl2E05f9gm44oMA1HTexMzbSNq48ik0iSVSUqBXS9C6E": "Mk28j62mqy3WCZbiOYcOuBPe1P6stBfiai68rH7e4PIVic4B1eXovHrxg", "KxXWOaDLPGw": "ttviA4Ve2qgJbc45pV3j7Q0SRdoh5RWdO2M", "INTMwdTytQk3QyZHYW7L8ccrP852FEe7lFxhNnpER7CvFNkTDKgR8jbg8MkZOccB": "Q6SHcGXL5YuuD69", "IxtzqNl0zjwbwlwfdXBCXjWALaOHpkuTFs892SIQlBY3ZXeFtrtCvY": "O6Kyw0QfrtKEA7rfd01rG93fJFdwucY", "MGe9SBP4TAAvRNl04Gmtcza3hw9": "YXTpY2rw", "frGPXnSBvoRGDrBI0hM7aDfc8bA0urktCLYmyXRmviKRNYVS": "DsmkceYmBS9HAzdlnGMAV2E1HALELW29Km79b76cu6VLwLjWCctWuDLfqw8sMySU", "M9RMOTxziDTVzAa2yFdRZaJGsYNvBYb6uWhiZrM9L": "zYR66mxvxT9Opvw", "NTlIEkSmpRvDWvLmeUlua0DHYN9S7fR6KXCfMEzXjmYCvvj82Q5bhhIB": "LWy6AB3TjFQFFo7Xic0oVIdsi0EIrMui2q", "xL3Z61kiX2teLqKxMBLRiYuspREF5FzrYgy": "nGFktW3cWhr9rnUdjSfLTchL1HfRiTOm3PcAqp33", "GuKm3Mkd8IQeMy2nDe3jeotXLTG7KotQFq9VggoWYjWS1CjtqAT644XKDQb": "wIDvbwmXigDzXAWxkKNVJkQUlItUGV", "Oh7yDyfSqcpesb7p2CIFUDR2OdYoQiQS4opREXG": "CdBIKbClt5MbagP", "WYwypzVD7z19BIYhfUotyq2ahJeG2Yj7mvkWRCbQQtAyFKIQAfohTjf1wP": "ZJK6Wc", "wXvWz0sRoduB2BtRe5Ie8hGDIQtbNelLr3": "DAtvTu43sCPjIoDhex3kxj4eQcx8hGqs9kAi", "CN8dB0e0p2I60k8DnJVd": "rVPpbyc94xz7a4Ad84DKpsRGUWnsAMYHgmFXL7vmdkK", "FcdJI6kgRIsTSW2u7j2F4Z7sUsaoO9agkqmJ": "hnXhj79rHvN6MeFC1AeUPKlPYhYoDoC9Z", "Fmj": "iW2Wr5olzNEEuw7es0HzNWYGgZJ", "vvCCcjkHcw4gZgbyq90DBJsDPzbtANl06FrMt0CVdT": "dTHgu0MrfnlIo1c0gW92ti0zx5bcEkv1daxUx7uRONtk9JBfkKuBr5Pt", "t5X1Ir6": "ixnwPANzmgvXham56MN2SvENTTAAGJJ9pRH4J8cL6jtfyKlVGLdIxnw", "apiKCXbRPX6Ys5YJoyJdTdBuApTan6": "c9h6taInHV8ulZqNxHxQ", "WycRbmbC59GjaXlocnDSZOSSyBVgKCrzS1TuMSA": "qPgJQAMbfn8ofRMiMSvaWRApXGMdEc0", "rp06mqdvOxtmB6d8fM6q1x9xkC6EKlOQZsT57DPceRppCD": "vyQh", "nyMGEQrMXUPbnCpVGqCm0": "yZePiGpUMDhJLbPaT9beI0ryCm87YQTbKtXj2w6DvH8FZUFSDpIcS", "PZi0xkEzvAXnK6x43yM1kdnZmfl8A8": "T67Fo87BZ0tWHgReMxSeFbNp76h2EjLS67unABef2WInaErzsKgGejW", "D35O58HStPyanFEvLjy": "y1bJZ1sbBuuC2sZ", "DrMJiTW0vkAkxx9grsntZw5nLrmDZZeLPS9QB1LDsO3cjOCxoK": "jYCIlPF5sQGYWR7dRFQIDQVavyI", "QovAZDSTnkF4l3xl6o0Ef8dPRs6IXjWfnVU01CcRQMynnDg5waAFylXwZ": "S8JebV3LFJTSpo9ykMmzr4EP", "Phjzi9JvTaSTc7SJnC5b8TrCx2EXKj6dEMc1xejeFrI5pcpkv": "Nqe6BJoRcLk5Ex97GzyCRWs1zcHj3PthjYy4mvLqIzFw3I2", "w1gc11IslVJwhoqkya5gJG4AhGbeEEHehega7cnE": "en0SaWbPii8Sl7", "A2cfDxzC5Uid9Y4muDVGQTvW": "AVL9kRaNJ9ABxv2PyBAb0M7nDt91NrdIhTbuZp0Hd20NHJUj3vSrhr8KCKudROnc8", "o8": "fWMdF8mn", "b2qOrKYD68P1LpI3yVhXj2GU5jZsSMsgBzrCWBLb": "INU0FBwKgv3p4krbtexsd6JYhta", "DVuynpdxr8goyDmz4fzAvgmkr7ymVupHukHy7U": "RZwYCPp3gbUi4WX", "XngDzqHgWADPHqXjT9ZyvSNLbfqwTaBR8YV2nn84y4Q1U2tYN3pB3j": "hTcgM6Ztg21aEHJDBgANuebgZcUsk8MWnCB0h5GWAHZHdkIhfB0CWDHGNmj19Pa", "EpLpNln1mCW": "V82b72C62ubDXYlSq2GqCOunFNxY97ldZTlREU7fiGpaQS4ufG", "j5PjOTe7TZvrIwO": "QLxZenAjWuZFben31MCqNL9KVz7agU4ZfAbzOFDae9exgqLgei", "P6Jh2biIkmxpGmy2BquEJIbzhFn5LPLGrTAhx4fUUgN8pF7PfAMrb3HZZdPwaqCWw": "wVXU", "PJNPJDepwz6keO1s": "hNWtI2oL6XZ8hWTye4wAqSLOghTUh4dXnGDA3GVJW3TDzzF", "JOTn6qLXvfxA44vkdERorwkFdOb5KpY3ocVcZ8ZNrFAsxUL": "nzS1QNja07Vf5T0Ggzscp9bZID0kFpb2Nifsxl4kBRTxigQb3YWKwaVZ", "Oq64gsnVcSWxPAS3aKxkXPsXnZ": "O9Snlp", "g716tweWZ8rFq8xR3H4EZGxWISI757ufNcuOebn6YAxBxSMpyiRjtiX9uCv7": "ny6RPy", "aIilqKxRJYGAOQcR2UrMcd8qa7wCBBGyVtfim2C40Gz4yqaEqTWnJ9iuu7": "pI37c3VwBdh43A9kidyw3pv27WRlOFLRdP2vX1okmm5DAkmionsksPGR", "ihlgbT5IBe": "b8O5GEwpaBdkRwwfO4Ker4tmB70xXsI", "CwtuKecMYR29eNhQ9c3QnevP3zo79xHbnIIV6mwwDstmy9T55V8jqzAojTdWZA": "FtBHrbXbO6JbFq7UltDHkH8794VAusJrVPLTRZf2M5un1NN9EmAPONOyCz", "nDs": "opqG1QVEYye", "VdFk2u54dSCvj5kLPNeeAtW5jH5JQMqzbzBmKwIu6kBpv": "bgsFn5Wg0NI5InC5hDOr2YQh6BWyZuOo6k1LwFRh3thM", "RyMpwEEE3MVHmR6TiJXpN0qw": "nNl3dUdwJvcv", "nQwN7wyvhBmBs": "pO1a8jCXsn6gKiEBBQUVTiYH3T23JbbfkZ4iawg2w2aQ9nIFMoZhSChuxh", "M4w2dbLnv1YCHbDt5x2ONWvLa5oIerORhIn85ErcUuf98u": "Pc32ZFMdTjcovya6", "fObu9iAkeVPZkI5slVCk2BO7x4datb0vE9t": "ZeS5Q8cnkroZPMSW539g3", "xkksZHirkmVlbUIKSth4f4": "MZMpspkJO0zh1R1A5QeKEWTivTT", "yU7LMOXleqTG9hS1Ngzcw7WjurKzpGpRAohTnLRMg6NZHEq": "H5BNMBdloncsP9q", "PMUIOGs0JUMiDqSYUa6qykyQQVa": "U2Z1YtGmygSfe5A8AZZE7oF9u1PBfSHVOA", "KpFRoYbmfTSO2EodYeYjQtZsCgp1YO": "Nds3Y4oMR0R", "Ckw71IN7FoCuo5HlpS0685TEjG5EXQGYyAKrDU1Z2eIcsjRNUPVgh": "Jn17aFzTsHMhpiBbEXO3xdfFVI30CCukCTp8MM7s7LdS29", "pj4KJwTgOe7EF6pBGGsaBn9BzDgg": "xNSQkKFdF89sjGhm6jnbM9IkecVxgfNvRoY2Im5m3D", "q8BbId55Okn": "VI10Jzzw9gS2F", "J07PCu6WXS3cWW1tDejDSSdwupDGzGm39vlBbWn0ZN": "GiJpASaLLU2iTOao5XW3XNLCGIvu1eTtPI5EExnizEakry5KOP54e", "n76gRR4keiuoqx0xzSyTCZgGq4": "SZIEWEU8Z93lvFS5WTwkBHyoB76m3DkWWqbQ7I", "nUxbhOJaitet8": "irMVrizyGoGVXcQf5QbtD5C214", "Z1TBpOjh5IxpLjhcqe0z27jwVAuH6rAN5HAgR": "jJRV2r0thavOHMJptesYTVGzKuC", "xoNyoqekrLwrbbcugt56BnN2ev": "gXgkW7hIBXXDAKS5DcRAe7gAr6OKvs08T1adxsdhr", "FsFfG2ltA7idsmKrEBDJMtwEzyBPMLYPArpvYC": "JXzh1Z1J8rkbxJ", "T41uGWxNrkJ24fKTx0": "qkp5ou4LJHRN7N4oOQfYJMdSal23gwoF8McRGXgoUe83ip17iQDH6F", "JTRSKZsWqsz7dtO0VWQtSrKvEElV": "E7Fr1z5trzXw4ogZodAUhE86afBocq8qSrdpIv6xEJlgm4Ou8ckBovCZ34", "YgEJc8q3IK0ca69f3Sk5HnPNJ49L1E2O3whhOaiOaGmLAEy2": "kabTpZiaIOD76gtf74hwwwyOT4F", "WhGcvNHJ0tUUJAjh9rFJMOwHp63PcAgDb6dTpUgiElWWm": "UsezUUo68WcoM0AojKLrBH257yOoYoO", "DiaetZqv59yT2QqBUevrDuvYvRQEwq50xczdLdvZW8DkJbu": "AoF8KEBw", "FF4Y9kRk64nm9EgxBzpFoT4EuxMIqG7QCPPMfV10DzffykFdButyWDuSQ": "B3lwTVByDInvB4SXe51lxDiRvZwaNT", "PVdOhDXKukIl02ZoliVECP4u11KBvlAIOiRfnKu": "hoWPUxPZalSgBdzzCcG0ehmHzhtaP7AyogmeOfAYActK0rbm2ief", "bTgSxRVMTV5wio4OAdwO": "OInh2QKvAEqD0B6cKlPa8Y0Ks6X6", "TPZvvu3u3TvWoIVQq9SwjKL3axyqNwgY5qk9N70fVseATDUT1HeVcek0SKMkwxqN9": "IPFIDO", "PekNS2sNO1ZP3mpcBWCz9lCWhQfQPdu6riWELuZlb1oNMzPRv27xLppWs97": "lPIaNBe2QLuNChdICqVbG", "tJEbUhh7BqsUCTvRtmB2umhlyZq5T8snlPZxghQUr": "jWxgxxq0oLGkfpek8ma5UGdrtVDgad36ovKfKQ6MH0GY3RkO0C2eTvKv6QPe", "O6hqi": "nfPYrP7QTd9rt9EeexARSLqbfcjyyLITkl541YPfrNnquCJ0qTfe4lq8KtM7sHvk", "QdywDx7xOc8mPz4OtfPYyZp1yyUuuVqWIBe3rdCTlIxSH": "uXFzii20Alh", "OhzvtG4dsPvvZzslVLbG": "K94wYE3xFWmzqhZ9", "IM57HHo8nKLVZPApCkzjcOU": "g9yQznVsiF84LKEtIjQ4ZXB2", "UbrmZHhQ1m94XjdvlB7VqYGRSyGXAWkUpDWNTHYx0C4yIvUAd5": "l1s6LAgDO8Ok9mx6wZ8muE", "lVXROGX3Bi0xOj": "S9NHhDRw4ByPDVOupn8hassRTkKCo3KGZI", "COVRVun": "wXafQ16c8nGdlQvHtbgX5syu2tJcPUIqaSiFPLy2yOVFa2cFkyWrKetG92Vq4P", "nQTEYLlOKR9t52dS7QQGoS1B": "KhkAul2M9mN28V04u6xf3Y1HEmKlB3iby86MYQwfNrmPJ7Fqf7xfHRGCeLY", "qDFoi2xD5ivphMgYbi": "R5SHDNSRyT1sSkSJ21XYDBNr8ut2xuHySonAVBKkQBDKt7seYeEMIoa8", "xktAfKMNwj": "xmzhB7pN3Srq0DBQ5TUheIPiuQTj13cJ194mDDCL", "Km7RJzTOupWRXG3RdMT2zuBy1N6VT3n0UOPopC0HuuvNyzPhGV6RjA1b": "mQt7HupQUxobKZToDFuGwSG84W6B78nt7jh1WmzCLXP0WOXvsOOK", "LtCIo": "fL3cU5ct5jTX58R7Uh2", "ikl2GC8gLxmp8p2sEgsWYPC2QhQASuMQFuk2D9JEC0z4ZnivSR7QKqjeRATrnVz": "aijek5E91Z6O9igtzmZO90L8qKd", "aSOg5VW": "TbnCP22NY1RXSuherDLFQ9DgATu87D3NsvV1aDDdmGxjNGqWkk8rhIbQmcMLOpa", "HtP9xiAOXeBm6iO2ipjiIxmb9R0GAVZXgpGTJ": "ESubppdUH1LdRCW9JbJwnvrsUJh4kccHDEmzy9jNaAnyrG5ZowI", "SsqkekM74tWMI2hpiiCayrNsK1XaioYCm6bGPfRT1OB3THpvEfs1xb2tGbFRNpkk4": "kDp1iCDGrvlxrsSpUV7Zi6wXtEU0WVVWARjyL8ogcu8zURM3wb61e6Zn5f8HS3w", "FXxze9UEg17JKyh19hU4EhwkIcbrKUE0H": "e2ysNyTZlMufY3TuyplKvoTGGptvUyNCTe59Ku3KxirfPTrZOgkNmcbrRM", "ViuCGF0s7oDZ2Gx2t": "DHtJcjcUDRLsQC3s", "W3iv5usJ7dEfanvKHFFYVIXcAuioMsyNUaOiCvDnp61i0IRHaL2GY": "QhpSwiFefKWLpoEna9CKYnTZNbeKLfteiiPpDrnrtNt9sEfBYuXZHfxvFJ4Bmx", "icAZrFLxj52LtG3Uzq2VoQUHGxoCJ": "F5V8FlL9BZui4xuaiszOrLzxfukRA7", "WlIdykhQrObuD9ktJzf3kpPrr546S7G4hr4mhNIvaIxSAJzue": "fYgxFtTko8CjVVxel6PnZ69oTE", "iKdGhPVRhEOk4jCNb": "eOfJcb5FGzQsZLMdHdczROprzD5bG2qU", "Eg0iRo97MifiDbi": "HKschKnJHYoi33LGteMHjfAqwsHZcgzVFog4i28B1BmX8aojcq", "CZQBg1Uuv15Ov9YvO5obr": "UyllgE73mT8xHcZoVTn", "io6wptjNCR0lcHyHvbQVlx1ZL3XxqaM4lApgpC": "hgOTHnzYRIt4gVHbsraBHJQdFTUzBZDTGrEbaThJOFClMej1MPQlueXx", "Ec4L2lKkAvlvhRXGjdJ9wY2l": "gxyDAsj4xxX9pWEnQwc2UKMMB", "LVzF94tx1fkRK1b0bg9Si0Uk8VOQbO6bYn2gjDdCJWmUM": "Uaeg7wWFnsYra0YynN9LfTx5EOUPXIjA7z", "YuAm1YxYzt35RcIcxjJE2TSnOxBdaFGP": "iYstfScTt88fUehwXfB50totJciQZHY8DlZ8nBzKxlaA", "ITqSbI5YIk4I4UJ3PywQF3wiPLsPyx2A": "sfOkouBRydwDrsDg6v5I8PMH90P2RyrXbmiuIjuMRxp5zvnbLAJDnBUN83TI07b", "HPXbS2dFu0Nx5MJnSczVyPe0g4anCSyfT4qwJYBTm18oSchBmHZ6C6": "c5HQKtH9m", "oMYuQzOAqx0nA9jbF7LgPB14lO9jCixWUN3PPUUzd5zwutxoFZjY": "UETKFTkuoP0wQQEapJOfXtVUK9K6zwJ9snNqC0jTSjqoTtR", "PfvLfuWYQlXe": "eJcrTtuwOsM3sT84ps1D4DfFfiVhhOIwMJvKqlwfCVSKAL2VomX6w", "Ao8pEtU7zYpXbb5sUB5cZnHh0HmpA5ztTcfkm": "ValAkiVvyGntBbcPMqv5BVR3TrOvdEVTvrgnF6YcofiXS6", "umzrzq232": "iOfSgA4rworA1YkD51R9xCz5QejCaFWU6VldfcN5vSr1bvXG0tAAw", "JdkuLanUsOormhhDcfPQFd": "OxBV5txHRoKlobd64ceK1JXTIHZm4I8SW8k99iRltnDYri7fGaCpwlLgAq", "phclpcpVKEttQaUriCiFHEhsXeh3MxUaiTZtLbDIOtDhd0BpwDnANFC7oGHbxyaz": "VRDPuDxxd", "cQcYtEpzcPZ4sOQ1e": "OEjCzFWNsCx50mCOXo9mG0qdGv0uOUzr6FYETy7KdUx11W", "YW": "q", "cnQxpYxKL5Fwu2g4bEvDyXyTsJaPrcxhzovae5JY": "fpaOe0qQ", "GBYT0OF3sbmExVqeZQY7przJMDst1Keic8fp28ppZt5YFN7hp7Em": "qNyQvPsz1rxi5ppbCC787", "Sr3xh7bw1hSA7Ie": "HqoUUw", "pOFpQdfrqkNf8WAU4BfdlctlCSYarpC87PXD6zJ4IaMS58xUbiR": "g1Wqguew69rvzzpTSavbxPP6ROfS9GXGkJVc0RHnzHWYZ7eAFFMcuZ7", "g66Rwu61": "E8hNAdmnnUqMVyI2LZrzHBYBdhR98mS4b7OgCTI", "dwWcursockos0UlaRJsp3MJ0nXDBstzZwrtQ9jCskFcxVnraaPrMD": "osb3vwX1pl7hATVdF9YQpZDYtjjekfCSF", "lsPTt6n1IU8": "Zu3KjSZiLUE75IoD11GJvlbKmj2Y0688ZwYyKZKvX", "DFQkbwrMOU3qepzkHxQY8MySwbe2p": "YJ", "LxGYximc3pHOe7dtBL0ZJQfATMtndBBurDayW4op": "XcXPj3Z5M3Pz4R1RGIMcwur4Miqi3K3wWK", "As5KSWpD61EdeKJ0gnPvKan1KanfusQ4eRmFKv96IpFuMThCieZETpsirg6": "vhv2vDfB98WDO1abNBJbiyS7TVNO7LL", "UvVCsvHZ5tipWC1wXx6SDndHTghkR": "rv9IKkyHQx2b48FBpsTFhn8sFZAvBGsy7q2ARtwmd4WK", "eVys7ThRnTViaIpdxXhtDt3sU3zS6JRcgjh5": "EzKnLlgROOjf2O1aAiYBX4ggm4j6SFuEJ8NHfDAqtUSTHJI5b9Rb6BN", "dxK": "hwltiqIyYADicHpdUSUW4zIO", "mkCABeLrdxu": "vXMHnkwpbEXVkVpgZbfUoOwG", "EfqsxRvwBQnuGVqh94PtQvScIhSonk": "QgZE1ko0NqAWfhOuMvULoWz5aGNDHO6Q", "V4iGImufs4uU": "K36yODczRDbO6PZns7c32dD0YI5eudjneBPjcSrDH01ugWk3t9Frplg2w8x", "wj6xDdlPCQm90mTiGxg0": "FSNcYqJrtjyTZjwcIkdOCs0gc7zn", "t5SGACTJgoVYpH3COa7Hdg3F95tCxWAiQG3RCepErvLYu7G5AMSTL0hfi7xL": "fLIWeHE", "DYGapustR9xTwN5GHS": "dh8cH", "AShQUagh6iL0GSyN1b7kP4BECC7ql7sw": "wTcRI24NL7cRvgvVcn2IZ74my10ZltRK5LKIwCmiPXEAbkNOeu1HUjI", "RBT1EQzXldACczWObJG8Wb6gghoBohrIibL9RDjOpf0gIP": "adOtMHFWsKlv", "hu00UqrSP6bzL7ABpsFJHSBGScOvIjd0xkoVLOFcHBBnENSQ9rCI3bBbW6ngpm6EZ": "LXMTw08zSSARJKb18i0bwD5RXu38YEwBTZzjl", "UsU02I9dhotcw0AqAySYc0e07kAmW": "Sa7XCiJFYyPvhQEPtv1ZUQGlml1QHL8nvSlvRT8WQkZw9Ya", "Ek3ySvZc1mfnuWJ6gJcdloLshvIZY6B": "C17VlEbrLQWcygFcv0HtKLvjzYPUVyoPtOY", "Cbq38opSaeko3D6JqxOIKW79gvASZba3UdGSZnMJuJj9uyeR": "ZlB94dnMf", "qf14ZAKXIZQa7eMywl": "e5QT70SNxNbri9BXQQ16s8b4TugW1FY6m", "rCB9WeRCCQoCiecDtqPKJw00R5dgJxMkZvMcUYLIg2x": "A5rWwKM0Zv7vODPQOSsDOqTgJ", "hYkd6DyZ9P5ma13XHRRaQS3UHZAL9CK5eMOvz7Tf4mZtlP": "IThKjVY5vDesm2ttBLwLngGHsU2X5QdmGg4Q", "MO9jRfmCvOOL": "ZL0I6ep1Qt0WFkIT3ZI0dZewjjjqqJYJTEAmYzOUJLCPpPoQFZWi8tJ", "peogpRf4vKmNzY2nhqkHjAhrllJDqhfgOIJ4fcxonaxInDXBDX2P5lwDFtUMkAVb4": "fNsUtjbg1FEFWidKbA", "tgS05r0R3MKwQj2CWIFWNvE5Pxj": "PFAuwjhbka9wRUhU8J4Di", "cOJK7Llxq5McChRCNrB918mkRGZDCyHyLeYtsaq9Iw6": "lplSLJH4yg3t5SRgpon1u9Z9tH8F9LXypvCie3EwTDihZaLWPj0QUsrFTx", "Q0D9UldpgTY6VVJsaDNFAMK": "YSYmj1c9ZwvPbgLrFybHOH1MMcLAeLR0FV", "VhZtjuwKzk7cZDHNhDQJmP": "Mu3RW57e2ftyi5k0MSvw9vt1FvufFWK7Uxj8fL6a2vFoO3GJZVx", "pmY7zeSZVYv6NMxXpJ7tKXblZkf50iQ1": "Pz751TvmZQexiagFTaDnLDF5v6oX0APxgMF8D9u", "Jnvw": "h4XMf2IwL", "UjywoTEtvV8Y7OGTdJ8Y8XVtcjhhdov3OlYB5dk": "v3y5c5VBPLnluUzzcQRTRVaMwo53h3U0", "VSYE9y4YGLh4hlQFF2cabNcQtUwRLflrK2DJn2YW3NUjg": "a6N", "q8m2vw5iDyJonnw8qsVbhjXmRgg6TGYbYYMZt538": "HAU67Mi8zJ3j4KPFXP", "ExIR9mlWvx2WvAvq": "l7t1bO8XKwXaV8f2TqfDT39AwNwOsDxSEeDA3igf3UaLWg", "hzHlPvya0DA0qK5YbwJfWx": "W5HkiWf6cw2jt4UGtWpIOWhcmuDYIPye9EMxd4xKuEtUlSvoURTRsj", "nUmKW": "fPxkiGYLn51r01RgbcAuPvmlJwyjZSZ34KzBOI", "NRMgaoKXnGR0IgyomtNgpixxts": "U8rogJzb6", "fnws": "IFbgXM18a1UNts5bEiMrvAX7D3F1k0XzBR5dd18uJQJpTMB5CP", "GbB4wuMtA2": "TkJegnZHQQsOXAnpGsHKWaUlsiBPAQ4NpSRLc0gDB8X59r80SlaRmrjUDRd2XI", "pKNLksEqLmeECwWc9wlxHKzhgy99kMA8hudXzmmImUir9fF9V4aZfj": "PKzxiDyIo", "c1Lot9XaTiF4LrCTKiGe33FH08fIVH7Nq": "VESbzhC7EyR11WgKiM3bm", "nIZ93T9y0hTkLdSYPpQoOvoBO4If6PQH2oyXpsdrns4O9": "tMMSXh8iJeXE5rc6TEi", "Y7T0X5ffminYRNZLMI5L4BSeYxGSsFcSkAoTh5RsbKK79C0xgGlQSE86yS67DwPWz": "QIIuaVcJGTmk721WPncrCxE4C0KtCJ82eBTI8m7CnCdmplNWFSCxXq7hrL", "RLaoxuEKq5St0ILrWc1OCGf4U9SsFUlJi7OWEh3": "is6CcU1JPJXcMgSHgwFQ", "VrRL0hxIk84s29QrcihA80HK8LfnobiE9TeCbOYBeTZpJc3yFfc": "KnnTPLsAZJ3XloGINHGul1TEjJsFSmdwYEWtaLoPLhnU8Y", "QDWGJlgJxykKXE0yShRBZTzacRpFzPrgmN90DmMc9tDgPKKBP0OZGrf1d": "nd6Za2UCEquLhrbUhEKTv6TsJ1M7pOQJBvY6TkF", "bdp01": "mA832kv1Ul7HwqcdFMfP29iJG8adN2YjxNspMWVx20BC0L2TN", "dWxZ8mQxwiuoxgZs9Zswa9J4R3dgkk0Q49Pqufs2": "Pg8HRULZnucm", "pUbVnmOi7lURlX39xdWWX": "LoqPgMTqRpIg8NbE8yYico7IYdmGiNbKHql", "DK3JChUcXC9FYg05UdhT54IWgcGZHlE3BYdecezfJ9URWsraEZJ8QbZn34Hb12": "RKiGHiICsSntzovFa6UnaTw5yBNf4RK2AF9lEVJt", "wU2Zxc1k69KB78k1nadMJLJC": "shGacAtqItMKYtSj5I3vx5QkF9NN01dNIaHwe69xrwm9", "OACEHFquRooLNPKCORvnr2PxwqdeUyM8vd5SME45LpCelrB": "k8wuWWwmm9Ci3DhHj7L", "DxYWlXncDd5AwZEKpf9fd0PLId4NEKq7UkMLTahlZ7YmmpqoFa29YgdIKvpDPmfP": "AkUSBmWuIrgmC", "sZ9M014ie": "n6p0YPNnf4iDtMBXwTM9WDnWZJqULlsNgZlwMHVftzuY1Q7ilbITA1", "Gw8PL": "tCAScmaCHqqzaYdb3bd11ohqC", "v4YmztuShJy0PbVDkfxyWApGRkI3RRBJAWmNxMXzQjnnSw213ocuJpE": "LpIgd", "TAmoB7OGkwp2UaSrxmdvDG5dIgL0yIkg67O67ud74i3IIMIdy9l0OyT4": "lhJkvOtRWOus694qs03kkxax2dlcB0iJ", "UxJuBf1xks7TQQkFaeKF5UuPjCLWob7d8hwAJcAlM8CGod6PajsnNTH3LdFAOBM": "x8RGR6YTHyhNhqSFbJB65", "TBtzftY4r6dsNQTxgM3BWzUek1EQ8jidhNPQ2Z6sa": "tSlVMfYxl84o9HFgWxp9TIqoKexWNRZ9nVhDg4S0iE", "hYIu1K7nuqj0aF3ogxSDB9zJQkWfFA6wzL9Z1mJUU4eInAxUyJFE": "JJBgNMHiJH2xJCCcTRfgi6D87CBadk2A", "abBOE5NHHYkHvprgPPR90h9yMM1zjiWUwB2d1": "n79OEkuPYTPNvkz7", "WOpk7G1aSZJN87ACvEg0": "XLNNgD", "EIwQ4oRS": "zLePV3rRVmD1GBpoAtG7lKgwlojMltbpVNLMtMTBMXqBaxAbpPN", "OrdDi5QG1ehvd81sY7eyLG0ITE3Dhmc2ZLEfX2keSKWzsoP": "zT", "XHfvljTM1asIUIjIHY2cbnavQ4Gwh7IZweFan": "c3S9qzbt1IAwGXZwScmCg0tOffqWxfH4oxTPvPL6R", "WxVxXZGFNUTkpXqfAGSaq9zzQkHQuxir7uaUfYamAGAZT1kymsnE6": "KLTGOJMS4MJYaEjtd6qnG3U0AzraKn0h36mzSbkHXIvRwtbLz0bB369jlhNquLtv", "ImciIIMoRQ8EE1tix1Pi6zMa4oitbQ": "uZUrd5irvXZ4GFheDUioSAJ3XBzybKxFm8lUIHtvTnrmvJvesTnXcIKQUGeTRDQC", "mW7voNEkc8bPFeLNRFPYuZv5IVejydhqty1": "ljKeo4fnO9WenhG3Oxb3gpgSaW1aqsNSGn", "XikJEBIP": "iDA8KsSaPfkJcQKqxigZymJ4Ej0BMyFT5ZvXYmHe", "Dg8d": "sxi6b0bIa0oTPp3r", "NXfB17Mut0UHYpqDfbb12D9IJ7I5FSBo44UYGkN7muCIC": "MNCS0hPPZcrH3R8rc2dsdKyDsw123EYqDcjoncmoShbwOS2ArehI5Hhwx", "fJvDDA4szdGLDka9M3yYazRlH8QH2Nt2H7ITZ20KwDju1": "ZYL0AJEbGCAlo9Kh4Bm0esVokz2d3zvJotO1TUexzQEV", "QoYkPHrPrk7St3Ps69mbnYfx4ondH": "EH0xEkD28vKP0otOR17pSrPgkoY13bSYd7LlKIv53qcqiujU6A1", "oSQDu9twxucFNFhhiU9ZRdi1LYc": "Gz9jSVDWO89jMlmsHXPrYPmXL1jFgBKom", "SPVNk": "wPIEFBxD8VU5GzQiKOPG38OvJx", "Db5irnst6CH6yr0zWiBROKezqP2p4i9yjSl": "nyjHJvl8j", "x8T9WMwzCck1sf9td7XChtlw4wRKQyEAuKmfm1H98G2UVWmJrXT76B": "WbFWaRjXAbBEQ6eKHRq1YPHWdOJK58A", "D6OvRWa": "fdWCMVKiab73OKJxuDZ7GO2YqClELrwRzpiyPp6o", "jcfBJeNOQ2sDWKBK": "zp8", "FGFb60": "DrmSwMwvxsCvlFa7iOnaIDSXLJomGjl4i5LGWeTOvHIK8329Fvn4GF1E9HlB8", "yoVqUdzs3qAKNuCplCKzd7yWWVo7I4teWDt1gB": "s7Z01NadEM1WN9qFRGvZvU5F9SKmUv8b", "Ak3kXHnxpnENiy0DHkBwSJidDDPdGXUNIJaFc": "obVKVC1DpcibXNVD295bdsJQhZBqdWIk2qLJ9aEpxv5UpP", "ctP2wlggSulQ54P9aFWuiXHD3zNhWZk8OpGC2iwVVdMIOETRu7M": "lB0h91P1QMo0kgNtdG3Mc", "lUnUU2L3bswAvGH0wiZwHlXbRN2eIzNZj0Sh5wSqql": "Wr0mBt23vbTpas8PHlUQkKVcVcfrSMViIgwkLM1ok1", "DtPe1cVpuAdjhsnN6wXDqHEr5bSyCjxRrQOkq83KpWbGpGnhoVJl": "yDDrpdCKP2VfurKCFv8NwRaJhFWasND7NztV6BRVTWuP", "bA5BAsEufasi2M6VsPUmPijIla68IioqQYgr7vsDC35qNu": "ybtIXE3nnPCk7J5ESsTHa10AyLxXd31ZiUL0D7TLjzpbRw", "LQrOktH8arppeJguTaYaQbrpm2xXKXV4yjN74cdM1": "R9hg4113Xm24amsqVwRSNkyBUIJBhj4d2Zy5", "MDRDMNz6t2o25EDVZ0pMrsRcgY6wR5d95zIm": "F1Y7ErSqhhvQH9yKu0BGP9o6Zz1gnOhjaV3lCHICIpztKzyUZpnSl", "JjXekuJHWvUPtUJdbabn": "WUQv8crJC2kxQkaWe2GV5TUrUnEcLFwWQM", "QM1qBcn3E9Ml9iImr": "qYS0W6bCuznFIYLNCV", "thy2tZRKaejwMtuP": "s4HaOU7t", "q831Kaoof0Na00oYZWefz": "RH1emomWBd1Hu5HTWcgM3GhnKShEvuyIe5gJ13knxXchK0", "a9cs2": "wghIZijGEgNoFVjkGKwEVVattkLPzxAarwOHNLszd4iS", "yxiS6YqL2Omz6JEGPxv3UDhGVFf2RXymqBqNtGU51nWAhcbOi": "UPNYpf8EBWwgZ7dAYPw4kedai4S7S8WNz3JDjvODyUmZg4nAzMFwyUfi", "p9CnsJ2YhyZO3QqWFVyrF": "LD1h4qw7QIGgoQVmH5m2hTfnQruQIJcnPZv", "tXZ946CzjBti4RpQBK9pu6K3ielobnlUulGuLiA5VsjJi1pg81CCqJHG": "gyGwpvYZ0hMyZDznVF3hkX39LdqfZJPvHeWee83xIoLZFN9FDR0D6Q9x", "YwEQ6ln8CQ0zbr4tZPhwYz8AWCt7bF4yWddBj4vN7": "l6U38d8og5ThwVcIdN8k5KWBQUSe14wWc0WaxeZS1d6EOLk0jaj1ZOhC0QuMYH", "TofCzo3luy9br": "Yk6gi3JTWLTu9ySABS8YHg6uzC39VMqfL", "p5zGwhr0TvXyfF9FUGKM2Flqldy95GPn": "GKjJNsAVDmdTPftfWfkfGYI", "DMtPSswNyiUcbf25NBj0CboExVNOftNoTugCQR7j9zr49Zvj2M7vXC": "Ft5FzYDd27i19LAcX3ISKSa4TCwGOmkW88THme1g", "MIglS5GFqvCmDdUBnu7BkuYHnztrKU1YQm53NgjflWf0U935eZei3L4TyxVM1yRyM": "I9g66AMVRpZ5ZhK", "g5xSyJ7vmAwSpBXO5VDRCe313fT2eemsxSDR2F4C": "eWk3C3FXEp8szwhqqdeIxCWi74WlOW3KI01jUQ2AK", "GCdu5Ox3L26kgzWvPqsNka0MteoAdw3Gkq3Q4RbpyoIabHuIDSgh46id8HfelqFy6": "VE8ucfSdDX9CG5rWI7cFZ02UdaHGi7yIPzffYSIiiKNQH9Yll5hez0DpXg", "S7YmWZdTkVcMUoKOWuKgsoFe6ZicF7R6gyMBT175q": "p10kyL5STtBSl0IdqvzZuVh7cecyKsMU3nQTFCCYzV11MGF0inTNk0ZINGsSSWk", "Rx15EWCiiiwo3oA2Z1pzio26IP3hAXm5uGhzYrZGLxBBZuEJmndw": "EDR4AP2L8FZnFqBzG6VgNwtArT", "QaJBEYgkCwPhWZpEwbfFFC8Nc2OTyv5tD5KbptThLrvPAuek1mal2HK51oZ89ws": "bYTi33ZDkXvN8xj1Qna4HaL1u7DZXgLT39HXqALrr77uKpwfkKoRbNV1ca", "xAMu5Byd3OYTt": "eD60nk1wn085jMj8QqQEVFWVhDfRM2FxUkbzpwaXRHEjltcZQJ395", "jhNc7mLIB404bozrtW9co8CKopNfLhoAVRm1r": "JnMCcUAWX0NeTMIK4JzQnkokC9ufqr9hHtnEgBpPxemHjZzfnH4", "HgIOvbmafmSsXfMK69R4onfESL1vI": "blD5c5DoriC2in9t1JT5g0DOyIUAH8GfkiFi9vZ3XSSezd0wk", "M6fBv": "f6X02AtCAD4R1qV4r9Q", "bRPtJWbx4wlhZv9HPionXoWH5kdksSpFuCe6TxCukWuJgeaZ9lP4o3EKFNQu4StA": "Bc7awCnnINbeuDdKrJPg3uwqMQnFjj", "IQ3zaOAgWpijH4gAYC": "idnsdGqT46d93lvEtMpCBPsAPcdZ5rawnGCEUR95dMIS65Q7Nf", "yU0Zjm": "wYuklZ7yYMqNL3sWA", "pdKwYMjjBt4": "fqHJoNXcZE", "DPg2lpQLogCt20MugYkg0RuQGrv52zwLQRwneZsNqZHfcpB5XwEZWqT": "h9nkZnPWzxeO60sfty89GosRHwR8LihUNaP", "mDMqsCOStKBZfFKCy2msMlCXYvKof6BKCuJQPSb": "WpsMExwpFh8YWZEo8U5YhN8fAxJYtrWMnPr1uJoJfHWsulIRz", "i0cGHDaurEoLAi4EPI6hSt6MZ": "Wo7tXBnyzWxR", "fz9etDP7KOFHDZVF0I1jbWsve4uO9KBf8FMdJHYab": "jVxaNyDYNrRkbMeu9j3qaHg6yh7kHFOkm7wJqM", "e6GrW": "QYNDa8Wxh0VjWDP5hGs4GbpwrI4rnzOGtmVb4", "eCL4nh1bmBeecMPq5tXiD": "MsV08", "iyd1DInx6386M9dy1BQwOIGU1": "y0fjLAsxoyrA0tzXPKqZakKNEF4UkoY7ixqk", "ShhSU9uA83y21Ryfj5Rjv82HtiFKYo3YyqxSvKd82Y50pyO8UJnLjas6r2llER5Tp": "Lh9x", "RaBAUsmUNX": "IK68Bjr7NmPnsBWxRRish0z1fJTo4xF1JZ7EJWORnH1O07TpW9WuBneADqG3Iue3", "lWccHxKbZs": "KNhO", "svhfNICX": "jgrb6ar354Ru8Fu2VnxUbYNBuV", "qsi8h632GvIbO5uXsSCFkh7AGCD0aO85qwW": "rQXJayJz", "vwFk5VBVjxOnMZ4iJHggKeMwgayHHExIJ1Z6qyZS2yWGVDwX": "Fgn937Rz5jRUfv6OZdTHrAG0pMoDIP47Wd0IRjgs3vS9ygEN3I", "NHkU9ktasvTSez6F": "zDU2H5lEGV4CVl5", "KnttI8DhOetTRFgeYuK6hrVky1O": "AdIM8piSYrySNSefWbP2DX1RwqYB3E7me2tx9xMs2kIorafsoSi122Cxk4cXhjO", "RRBdN8YXQT9f8dW3rQSBaG2ZbDb3e9PzXTo": "DXOglQSaCMcU2ymJEVk0L", "wmwfFGKMQHgLpEnE6k9Bi18lC0NSUeWiQnO": "qpOyUtHS7jvL7TvxLWn0a680", "HDkq65lfZSIxPPruKsBlZosXSKWdlWm4PoXnYwL5gb": "eefcKzX2sdX8thKG", "sJ": "d47wJG4mS0OlwjqOhEgPXucLQcg9", "AgWKnbrnvPUHvMoSPEoOPP7": "u5VTjvI", "o1DU2KapeNXC": "jp56GvK5h325ZYaES", "yCOkyEReJlquNaTiCT7rOWPDnsYBq": "GZnFPGZl5mWfgQs6DAIzRoT2nMuuaURDVosVU61Jnt", "EOghKLQsBGLtxJbi6ImJcjmVWW4ey1alw8DyTYkRZHKIF8nhFvG1y1B4ZyGbHC": "GlmlQd3JuwcYFTYRIkWgqI20hx4bb1FhORdPN", "LwSd9aHobOkWJiDv7RTBWk8y5XR65OlYbVRw5r0FGhjBgzwwH0Ya8t6disvMjO": "aYfCK59bURt8w8xIK9bGc9da8nfadW9tTmQMITrkyB2b", "U6GNW8CCxOGGaaWAGRVIRxviPbTTyoOg": "yLPS9cCkH0KhSuSshlJkdJRqplucMLB7AqQ3zm60kzufJESJ3WabhNWY5Nb", "JxU6s8LhG5Jd9Z3UaTUd0ODMovSHpTtUScNet7MtVuurMA": "WHiQY6FT5mTse8unU0bGvCco7zxzJMFm", "WpdRlWDpaGSikj96JWOZwYZX6kqtx5PeJY8UxofmJOE4hFe6DdHz0W0KznOT": "AL", "OsHVObaEXEy3coiSuIUHkQcJxDVC09jzmbTBt": "ZQ", "SKQG0B0j4TvZKF": "Gwg12CVWgWWPlg2zv5r2bcZklLaCmBc3gE3ZN3065KgCo", "Umxl2JxxomPy7UuYxzZGbdXWdy1FIW23XoQuHRNTHuGuyDagM": "WGzNPT4", "p9d2kPthUNXeZgeqiqHbCcghRd7": "fFtNJanJG2nCVGvI8OG8maCwnx2tXm", "EGRJp8HNy21xWN2DKftGBsJ9oNtBKKORV3BAmEVAsXtmWLTf5bVxInpDzhtuft2": "Yhjen1xtC5AWeTiT1", "P36ACp6kjKdRFu9DU89Q5x0ZfrcczB4BBX": "GUGcloklOhX3f3lLWzF3a3Fi6S5J7dtTNh0E8gnLwUTCyb", "JQUm1aYtM8qLZKRt37KLxVKz4U3arOUZu9K8bDIGJSZ7DQSPyOopuDsiTvyfHtf": "pYQbz4s18HqW3iERl9O1Kh7vC", "CFzhcxK70cGZzm22u4yY31LlWjblMPgach3iTDLHv": "qbmDoIbKNJzcJlN3KJyRHohahv1PuXZyEQx7", "gtP59P3NvBKlapmevX6qAKn8TCSzgZEnOh47Vm61RFMwJZZCDBS2vLX0": "LSvyUDRBpJ3QAdrAN", "YRhPKr27W8zfLDz3On": "qk7AqTHXj8W89B9X9M89hn8g7YviC4u5NMEPqhOTj4Ve8n4IH", "DEFa12HI64Gb5xF3FnNRj2TDHfY1oDb7hu9i2xcIFSbKEwmXiZ9AP04r26": "E25GLBLo0TIcbrfIDzhnShbFXqE", "V5puNThIYJsMxjNLnjrAENSsM6sz3MDO8TdWuE": "OLa4G9pZKigIhnu", "gbC8rI737mdnXzo4": "diaNlWYg3DpxOcLjyyIdRZUHNlpii752TNAzMIIVVW", "S80iO6a04j": "czIwDW4EQdo", "ehJGnS6ObejMjrbYc318dTAGi6": "fR0wa8R2VoO0hcBd95aw5X", "iyWIl2WP5G4OpgaZdVYGYZFipKwgA8xvF5SCX3": "a9WhSaqElAkqD4EXKRb7NLRPa", "Hhi0hMUUaH7ApOiSLMusDQLIWz": "KDHSEiczicuj4tCF504flK1Gp4JeOyBKAafwlpsW3cStohb4xuaHbVQGi71t", "TiRbWwEmwF021SiZHPMiu": "K", "QFxDUmBc4zCnuqzjrdYgUpjaK6s4LERpD6u": "u9tQT", "zZo": "cQo2Jg0qeyLwlWHsownzkP6M2CobaWz", "Y5UudPByf2JprTxr2PVgNmQ3DLfnwi3vKwaWCRnCG4JFqFGoiGbeDUZvOb7Yx8": "HWY5Nc5x1hWTJF", "PNnJ2NvUyGrYoJdUkurVxcP5i6VCbE7TGGuYTX3vVeaGgTUpA1j0llpbRfdk": "qgj7Qruih2Mak5rhQ5btXsyqKDlNKFUfPSd5VFSCLltQypZflLJwYLOpvxHHc", "F40sMm6JVo6jljKoQRG9bIALAygGYKkpZPfLxovC6FjJj4uKNdrV": "vCt3znGPpuZ4skA9jGcA1JuZdCQ80mL5BqiILDWlJUcuXgUwxVRFwxsjj", "IPrYnMejl4bZHdij78aJvpCeYonHyS2KtxhljRVGJsR30lWMHCDILA5KXJLW9uuf": "Wy9P", "bpiLe5p": "eH67JihWvF2AAhkhzNrv1hpOozuMPOm1RZurk9A93cFV6ocwwVd0Fqo24vph7OhjW", "oOXWWU3UoTvVzbyqn8Zr2zCyR1aKxXulCF4DbvEjyEnMUOT5Z2": "K8XLIbX", "nAyw1mGZrXjFF4SH9ojTh": "hJ06M4NFi", "fLkwU9Oco2eJwjKZWpXOUB": "geIyVry1Ey35gHXfA5xSgO", "SfureWi9vTpIHDMlLQPMwAOUgivGu25TpZyZGRli4nyVCgx5MZ07WldNspCYS": "H", "I9g4cKWxWLNmyILjEpn9y3wLKgMk2zKIj": "eySHY1Nrw8V1El6ovugJjL2MEHokSyIG4OTzFzYjy7kjSMf61eXB3gAY1", "MSw": "gNrkqOVvo4oq6sSOEkiGq8btIdj", "JDIz4LTNIgKQ13I97h4usFWX1mf5BewQDiLud0yklU9eU": "fUxS67ouIN5I8h0frOTyqY070zUr5OgE4Z", "Wi6BU3mvRTRmamD": "V3O54vRufAd6APmGS7nqaM9UUG43MGxpME", "G3isIk68gl7cbQOn": "JkwBjd4m58hswU", "YsiJFOucJUQAp": "av4C95HLMJOO8JAsRDYz3y5znZ4rZiUYOgQhuLXZeucbrnr8vpA607aUtHrwe", "mhdLFYkFFDINJEbs3C3YFVhBKwxvpa3mn0wwGV": "l13snSz6IsLIYvOn43m8tbQYDnYCQ1SfvpN57VOZwJB3GbVzKFFlLmQt82jSU", "ETBiSDc8PBsBkGoMgBxbWMm5": "mxcbWyZUMgp5eBtHe", "RLVjt23YtrCgneDFd68ygIEQ7jscaxHiklecE4L4G5eGQsEL8cAE7T26O": "fu4ikM0MRnqpVsmbRTdeDOoyR4KmH6mylmQkz4Q7K71", "zBYGczCw0WOJH9P6KhKPozHe0uRBwl3jptMpAb8EIMVZagmyzGO3576": "NNkAMMor3Fo2KMrZhpcxUnJFyrHrYE", "tVj6VO9zDfiX9QxSNuGc9aQ493WafibudEV6brlIDWPh5yuWv2BjblOyrUmtgX2": "nfQ0qImyrqpptMoCJyVhF1W0zvj3wnxHQEvYSqc6xt2", "VP46V7pe0vwrrSTRHUE1aTPw84vw8fCRPrH": "iPZxneIrIn6FSmR4wZvhwdh6", "DzEL7uQDJyTyOAjHVhnvQz4cPijzhhh49qggadTnYBhiES4": "CKmQEb4w9vlL5QaUod8lMgwfJiHNgkgNTXnd06D9pkByJrnj45ubWoXrbnNwN", "jKr2MfbW0": "D1Y9MexbHzrhKpBz7MwhoE8HrmNI5DXSM0oQSC9cuyyM67EpRGa55s49ejuPL", "OZhZZviTfCsuixu7QvLE0ovs6YfGwJEv3VvmnZ4XYwWbSNJEOPS2Qhpu9": "Dz2qEYBie2VwKPSVsSYm9bdLy0zK9puAJ7IKtREJGcRmlKgQml16B", "uPeONBJtMSvuQavXUD7ixAmQOn6l7i1oCfMm9INdv1rhX3N0XLlDAOQg6Vb": "qqarnCDY11J9GS4TJe6y0MtAj5ms8ndXT98DmVlmc3lc9tTXzwEfBITnh5sGSFT84", "M3nvWNleyos3f8riCxq6kiWGMK0D25Af2qrBRI": "sUqYxtcYjk6wvbldUfECghBpIP02k2pob987tT", "PZs3AIm": "bty7pYj7Fkopz4VsbAhcQU81D6g3NpflNvkp", "mP": "hbz1YcdLIGUlYnzZdotsSfAUkllggT", "JLQsDwWDwgKz5NqUTzZnY24": "tU60e9nRqoCOMJmzF4RjkJLsJPqTdcEqeRyXwsT", "Uygehn6Mxcjv98cVsGcZOMwPKJM": "UCG2FRUzIznh3HegIQe7uNv0hQU7zRNJSN", "AuLmRQG1A5Qsdej7jayiKSlypbO94s8mO": "CLgsI3zaoauoq0byhMbln4S5wlvRPiAzIyUozchvay1OIzZF", "bdraQEenlEyVLkAZQIQgT14phUGmGwJS1PBH2iZTJ2r6iOGpK": "d", "auYIEG1yGKiBYUExOSVG28pX30Wgkg0MELddgUlj3M4IjQR6LTclXX2r": "Hp", "aj1PCRNG2VCn8JdzdUm9pAZBwVPZrZciqjeaPjrmKApIpsOC0ggwezPn": "mSK1VBM6DEBkjGXYXdai9QdGnjW2xelLl5qNU4uirqFw9W1AnsUaKTCh6JJSg", "M1tktxDKsZKgFeMpjFbJdQwvKlTW3p0MECjFddWQaqElIj3kW0BgAubIOBuK": "eFDCfvS72atF8A", "O9": "ka", "LCdmRnz30veCc4Ex30p4quT7q0u": "aYyZIXRmDWmJYA9EUVMPIWBd6dWdBayd1bYMF", "QqXpYu6sSPSAz5vKwva7eOBPEgMV9hMEpZi9GByID3Tnlzb5BAnLDwKMI": "tmT1G3NPFdB7TKsuaQw0Q4Iu1y11lVDgTJaOCalSIsRjdRcI7vf", "SpNAJh": "Qss9mjdgBkIo096a2yaAz3yRJOryAlwlXW0DdWVBQzMiRO88Yk3", "yHIxvXGWYNefcI49lDrUWMckJX0QERatLjYR4QcAxDV6GhaDCsg808zIoeG": "kMZRfJ1sbY184Uh7t78cTrRt2UYBMuVKhZzuIA4rM0tCS47NKOMf7xABNva4", "Dv049DJpyJWvD": "GDVeHsqqF7uA7", "cSYcmkvD4lmdx95Ir1YDR8ThMM90PTKmVo1F1EFwR4ZwJSUPFS": "MXfvyolnUxMQJh0SmfJMPkiVKL2QMa", "B5r8l72PETJSzp8hNMtQOpIOHohfErFk5e7Vlw1RXtTYWcfN2hgWcYt3dJNNXk8": "aG", "PP2w8Mje3DYCRGxXYMC637UvMyizl2zYmdfKIHca": "FjUXb", "jX7E995NbbnQILXWG2hyGi0hW": "XSkFf5LwpUAqD5zIcCvX1DNa5LNPoVR5ZCnsPEFFTZostxMO9Y2JlP", "QAVGBRdZy4MBskexVS": "YsuQteAhaoM0r9J1j", "ll4lj4oqEHk1lFVCnzxLVY4Rgm6NvQxU2Wwncuwvz0n1VwKDXc3d7": "Sht", "WwhpQ4MNOSmIeAuS1WzYpu3W9Qp9n0dHjdVEvsArzSLNY57CE": "Y", "pmy8gD8MhltrVKhNhj0I": "cUQazgAS3HWFhema5UFPdJOj3a3v3tveSMtOxYkmUNpwGph6g", "DtyyOXWJpK1iWvp7R18ZMw4L6bIK3bn3Odja9yB2vwxkrzAeQOvyjTz15MlJStaN": "wREmnylRmaY8kzsK8U", "eESxp3e": "jHbwkBPmv8QKEqBuvcuxJCyAzPalyHoS0iiM4Z8Za3QeJWxwQF", "jckCeDOUEqbwL0vdL5": "Uwff4bciPH6DEnrqqRgM4LK2KmXv4VdA5t6cRNhoKaQdh4L0", "C5": "E8XkfWxisuKrbknLphNafLQOXBsbRWucJngYulqUyTc8", "pMgCwbIQhTjVyA9sU60li0TV": "YkHYrg7l99m6STCPJAYoLOtojxQs8yixHCP71XfgPwA1cENQMPxX3aVlVhJIGgqh6", "GZdcwL8JAiCqVql1Dvs80maGRP0s8vLDwyLZyqpUXcM4o": "wKl30pcErYBominXvsF3psBT1qZmukR69caF", "sV7Vfa6Tsf6VlPLTH6z65": "MjDXJBZoBDPoUhZY", "xfPWuh8h2eqnTjbWVkJESrBEZo": "Nr3VfLEf6VHwGjoC", "X9zD1kMF3O95SPrkFt0xEUbvEgia": "LODPGnodAafvthJkP5eG1JgG8", "AeRfHYy3FgEeMATyn725Rye29yPj5rlYSrCNxHOF5oj3Ww5rIC6wvb": "HmYl5MWUmTnEMhLDAq6c1vTFoG8VBdYyYDW", "arjPaRjJ9yNZTjyz0I6736pl": "oUuXG2nOUXGE", "DGXuZLJu": "hu", "hRSwiosoUcSqjWQalrvR": "rC8b7q9hf7OfdZEzzTN3cRkTXEllNa9aaPJOj6", "tneI0YzXDYah6znHQpdc1Yu7dD2nxTofUbEvoNcSETfSEKLmh1k": "P2iQwLsxoAfJkrW1fspGaUk0q8B4N07yml2RI46ArytNSB0a6Pj8lWA", "fHCCOhkWBsnnFTUCW": "JGfclJtxN7Ii4FTv5fnDIiKjQejoMyGKRjsF7EYIKAKZzO7BZeKiUqx2y", "IssHgm4dAooSzxqiDjljOM2JdGcxxZ2guZ7T1t4MuBY5kpWf8": "hEVx5a4OpAvR50YAPIlwnNDsiLm4gedslaqRBaJ4eImJr", "a3WL3xFgH7JWbztFy8yHFT2XiKciW": "H8vaMKbo2kfj04XDqXVRstNARiAHqiwbUFJbG0LKZoBtAwHJNnOZgk", "hHfEG7v6QdbuXYsu3NfKLR50vIhQYu7t9I8bPGEqilmwpdrX47Y": "xfwIY8hRomzoq1k87ESPCs2NcQZ2pkhaP", "WEjnUtprGZ": "RIBNrq7NxgyqLsc8mhprQstJny1XKMlmpFg7DmitzFJHuEYizR2", "l5mlN4ODsZyfjeEmgYkHyPXvgvsA0iV": "pi5M6e8u89QCFeIM3X6ThH4ZVsTge9lJEiWe7gUwbOrOpU32JTaXmHTXZtUR", "sKxs5Qcgl8FgcqYeWjbRnJb29clu2ch23P8QKU9Ans5": "Skc1CGsEhLJHmbKZk4pqMRRT2wwqVibPmwHLg6", "ut40dzBG4l5pP": "B6FUAuUCkrizutFNJhSnYdXzTmyhSHtAf2CDLtBI0xWOcjQuDMkkoMUX", "lDPRB4MUXxSzMWzly5pRek9y2EytNhKVr0a1eQcnuR3Af3UnqW5cpuCaK": "ooQ4kDuMukGWwNau7zPEWVpbw6D1z6V6yFfron366oaX7yOgqi4DOfq", "UZ28Xqksy5ajXeRs3A8uUvgtQ4rxGtiTwT4xUw4aL1WjhFW8Oed3KN9IpKcaQ1l": "YQNklw9VbrlG8yIsxYt63EUP1gy", "lVCmFjyVlU": "zM3j2UuTkcnbJV68kWGcCKLSDmUnSb1V2sZF5Z86RteYmMP9IPkE5hXmxTS0o", "lkE5xLEU9a2dHQsKO8QYTJg": "uNnv5gcYGeWGOzaeLiFx8o92q424AbzdyImXRLehrnCKvsK42G27eumyXI", "V3QUmdjPl8bzb9jPUuA6H": "vMi5JLh6Ca", "rNrwW8NQjllAKEquLiH9K0zRsUDNaWOeE": "T9s1isr1Y0Ix", "r3zmBK9": "QWqrd06ScmRZ36mbBYOdOAMqAngxUT9ahPEuPgoeHhdQvjrgSZscFlT0l8", "LIQz7bC7rtENb18xedBFZXsnrBJjvblexoB6jZkYVezrPCLXeC35cZzTpCjpLfV3": "n00vTUBYNVXzccIM1U8rWtGcDNLBrD1MokTrTjzsNlWC9onormeKu5Fys", "LUWWoHy3h": "SA0kTE4j2eJOcxkVUJ2m4wo7WCZw30WpY", "Pkqjm1YjXJwQkeL1NJCjDGtycz5OdMjxdA7OhrZoxLQHZasBB7KqKamApn4aU4j": "lzfnH", "gImmyfxE07fTgNHwg9tgNPsRfL4Ukv4viA7UAhzCBtw4yuSUJeYNGwR59TMiT6y": "QMhYZQdikAim6FnM0bpzSTZLvFqZeikrslZuiHXPxj4DO0IZxFjOJDvj1C", "GWl8D91I30eMjLOUKzLqzP68n2QZaGC": "fEDrG", "nLGXn": "lNrpp37VEVpQlyPXkG2ysb8IunHaeFXwuD0L", "OhkYxjjHXTGf": "I8mk6fDdJfZgg7wX47RIf0of8azuMBqxtIDVEwKks0YT1HkupwLmQ4qj3OIV4COtr", "mKZPCxXfMO8luxrEcsF77X25g": "OnBIiBN2jN", "A5gm5VU7BIea": "jm3hYrLDTHdyYVzcOsh97aib4Xr5dOEdZSHeOYS4ul7", "gD2K": "crkQpi4hu0NMt", "w0NS7M20mjCfYyQakKkAeUANNA5mT": "eZb9buc7Veh4aEc3JCkKe2tntQFQWOjJgmd97ltTFvFdiR", "yMN4I19KXacE3bWxXUSWb9HjMsZtLybolPXCqPTNRyy3Y95CphksMGEbZUUrBS": "Xh0gAjcQPtwSd79WoDKMMvyzja0EN9w4Y", "LTirJXuaYrfqPf1TvKf83jt7mQWQiNiR66HlH": "PYhKcmW5f2UDLWjWDzZEooDkgku8fa4c2S3LCPYk9bu9mIVVWqLro", "dYQsN0DnW9zlIMlB8KOvF": "c34VFnDcuNnedzzrAHQsmVWbIkZrZ5ZMJhKn0a0pogedkYoS", "db": "zjzxcSboZbR7wgkyTAqxF2Hm24ZG46r8DZQ6FP8wyI9zOjdjT4m1SGP9Zr", "C3ZVEBN": "ZjEimI2wETZwC50sRgLIZqD4OJsYMrSrU4uEfRU5v1B6Yl5wUq", "WIycbmZyeewPXP5Us1HPJdh9DimsFzENd7E8Ptq": "JQ9xMQnfSXKehHXpLNc3E6", "mL1Flx7": "C8GKETBMxtS7LKD1TwnSfd4StaW9DaMzQ5vth", "saWg08x0eDRgskBorHbXRKlIhs0cVlKZbthbuVZLKt": "Ul", "AEPfpD1sWgmvfxnF46vojyJp6PRXBqqJPTqpxtHb43WXKFtCdNLzLthJG0kvrVnF": "PS8a7VSYjZagFJWlfBsIaHOz0NJzqP", "IiQmffGf": "runIjlrk85RlQ11gBOo7", "iP7vx9xJTcztHFWAl5nw7wPdbnIgQvONoTV2JyrFDYZH6Qv": "uNEsZXmI", "Ko": "IepRYViTLemW0W5YURQIbhpUt3B", "XdJCw9FQcm1Wcw1fPVlpvkl": "ng1nfUNaqTaJ", "yIKZPE5rDO": "fihRJnnVLfGaqTIY9xDeTNzAVcbqS3f0lztO4gRT7kRCc", "gJ4FeOblAruLb3n6fvziMnlEXwE2DsQzHl4GNZcjn": "rmbuIjV2sDjJYV", "N5LMoSP07fT9Ralq0HWyvSNmeuJ4XOr0eiTMaXohYKEmBawLhIe6O62F7": "NHuSvVY9QQbhVz1", "pcD": "pqmTWqTVWonXWtHFYq418XVSYa1Z", "jXhZRl1QdkpAVpZrYzyNviG4VVfNykT86QBoCfX5XxXrhRuOpooORf8NRKAbm": "Rr00sNTvlF9mnQ5ZyQfqhxJ75qI", "UXw9emGvah2nY6jHbtkI8FeOF820vo4d6oNlqGvh3SFnY6wzK23XnU5Lf5tRV": "nQbdmNJ5HnTqGgY", "Rnxw8v9xxF": "NzyR4k6kas0ZT", "T8iRAfJJjbvv8bVh1Cvb4JsYkMXoRsYILgvCaM1fmneCoa9fbn6NWlSssQ": "mLzbvzBRsEo3IDU5n8voEYT6a448hDtpjmsppxGup9gZnYTgpBMrOyK", "K0sLnqzeypqmfJtQ0cMtXCT1KWLEvFLDul": "OZfjvoMh9eMI9CgHk2BzMXuxVVJXwJ0VLQwbz9dnDtv9ulmEGgj0", "dlTK8EeY7C2D9lKYZtJ9Otz": "OHdYUgbr7Stw", "vZUr9PnR": "wMy0AViER4zTBORES0w", "ETpswcGJYYKiRHghxRzTBo3": "jBxIRnuBtlJeBlD52tO0fiNIq59Qr89ZgJHs", "dP": "qXu", "HYS478oRJl7IxaQ7qwbPAY7ZXB1": "QrrXd8wj", "ho6qPaOEQsk5tolBsDo4NxD": "CZL4N14N32eGiYnt2t7NZpOnOu22j7b", "DdRcojXqXvh9XD8Ew0": "AeM0oHxbUhZ", "n3aQZE4TwjEiridRucM9EQXUHw0nWlWbadMadnUZkGjcc0HLnou6": "HTir5J", "bYfsYwFAysB24EJSnwwSK1bgSPn40HHpuacW89FSB": "ZmCzADIyanHu0Ne4Bwtza9RiLhSKqFdb7KIyX2SHTcUvXxFU5xFQV1PIj", "r0XYYfRoBiHryFmvYEqhFY7nIXd1jmMwBNlLX": "GqCE9LG", "a5voVWdT4ZJ2igDttWidkXs7PPPG2pKjZ": "yJDvp20T8wtMswh196RZvgbyj7UJP24kglOGzOxyq0", "ycW442SCBI8dYpMCfBEfN5SPad75w": "wdOF0D66WiZRqwBKk8cn8", "QBpi9hfFSg1UkWbqX73LFyFYfS4RPmTpcUhz3hMFtS0446BQuI": "el1HBnwmndkD3ggETDbIZ1xrV2zRp8sdKfJeLBDbgYQwFMnu4CUsaR", "YxlTeFj": "tfGuCjgGeH0LIdJPPfT9ViunK17UCGsZp5eaCJgxRay", "Z1HsPEGN": "PB0LpR", "hV2ulekrFbfEpg1ScLTTGOFCh5B9fQmiEwoGG6z3PMDwLJAyIMHko5tj": "mR0xaokIu8Giw5cewqTNff2sVnEbL7EWv5QuPHjIQK11Dz1BfyCnCxgr", "ZgdVvPRzWUIovETBTGKRFTJtfow8iKpBHwaRRCy3YkCa7WEHc0Wg": "X3xR0kleCqk56QlhObjlzlxXQa090yfjBEkuf5FkkO4I", "RtOITYaG91aRYQk7N5r0O5ljZ9Ol2yQhalkEjKtdVXhKzJykvEj": "Gd0xjZyp0iJ1y8qbG0F4tgtYCRkDHOnvCX2ENoUlU2MQ6MsykNwbysgZ1fmvsC", "bu148XDYtjLT9kideQvU0ZNXxzy72ML": "npPoH6rSUFuwBU4khjwivIceGoqik9DCOX1pZs3evyOFTaGJOHhaYxpvreqHLSdY", "h4Yv00McR46i": "Qi9eFOqtLs9SJzlvvGdMbUrM2Ibm", "d0IU5mLRD9FjEBy4tEhViJsgygIr13CCN8zjHhnEZzIWX8MD3a": "L5AtJ", "ONFfZWzxzFlz39C2o11lZlW0JXV": "yz8m", "LG4BM51rjtgBhcX": "KjV6KnRP1", "LQe": "BHGc3RgWGEmxyp3QGTAQbcvChkC9I2HZJ4xgjL2hSsH8WDIkHBW0LwKgs3R", "DAfyw2UY0tbC2zRS0VSWnLNdRbrkYZmiGkV3bGagwnQySvPc8ebTjlUNsE": "kf7hXqAUsERyNUlCk8aDl5iVqN1rU2Q1kJ8", "A0OH83IUPSM4olwHcwgZ6pQVq": "QE75DuwXXiICPJE6Um96kFgcYTur6JzzeLilhTG2HZjrAjc", "ANj2Dyou4Y9tktERMTSdoFizzEHAmfoxdTWMD59w87lRe38nSN": "fwNp1RTG1J1Pe498z70mPoCPYEVm6qmKiO7CGh0HRHgFpgXymv65TaRt", "pmYEW0A9fJ7MTqSEZzlbDJf1iI04bBlrknLYZLyPpz7BHyNNLjeK4U5F": "H5pomr0kE0c1QqZvuHuv8XqK6g3P5x", "gtdWTvb1CJV5ZASOA5yQvmPZzib24yNAXAnEOFaTrF6uLImHCp": "UEExT48UYpjaLAlwKZSLHtrXnwdZ1I28ktSzvRCog81Ciax8FcpJybBA2qy", "CGBFILNYU7C245OWUegWe9El": "AV4EQedbWMEtlFwxoz3AOj75FnoXS1iVNP149T1U", "SooKPF7": "jha4lR8gKDdZBidBgd9uusw7JZyDiI", "g6sPNVyHbK7BqxW56BIbskVhAQTXXCxd0OBtxxa014dZvcdYZi": "JmyhDI7aeQTKp72DxHH2WijSIUtTJC", "AK40AmwcDVSPyGdxiWf": "yNZNlbi3CW", "xigvStpuEXIEFRgZIxZav1OScacqZO9Su4HxiWUAv75X6AC2j6BOU0sBu": "JfEM2LAiGtRp2ICzV0CzuH9wYEv0zCiOTRcEEf1phho", "ZorKXxBOyA": "Bty2VtGE0Jcd5Bda", "cImHJcCnVRHgVaXebSf6YPI": "qBdW0XEH4rkE9hFUN1rs", "TCFzjAoRizFQ": "LCGhAZdrS6Jj", "P2hbc2": "y5yBy6YCoVqdBLTID6vEPAK632nosECOYFq1JBILVURjT", "cpAlwPL50gSnuEy3ufNFoYJyuCtNo99y22vB5rm08aHTmAetkqb22G5bZWOyDpnMo": "eVkcXxYrbhysHRg9UeoSh0sgwV70yo2JmssqgC6RO7sIeQaHin", "wHkd2sDRZTK2NjsJCtI9sVhQLdZjQm2VY0348m9vOpK": "R43IMrbqgucHInPNpEvcsqm62P", "MVyjQApsLoR7h4pvmmA4uqG": "DR3XopfAdwnfId0X3MpptzWx7fR2sttvn5mbGOxsomJZ", "gTH0EkERnZAJcwtPsr7vLPvupU": "IIwaXpl92LFrZn", "M1pbtjB7z5PE5X3Ia3Aq6KFEG7TwVxTJlmpfGOLrKX6JrJP": "vrpknGQRdzzSLrrW1h3m5ehIn0WJULzXZZUL39p6SGYnBUl1mRyNDWBU4iXMNJu", "UKFpKgSrg8qZ8We3qwzoPBLxhQ": "kYvrippXrA0cipV7BYAhu0BeFgiFP8vGYhZV6VUh6wdWAOfb9RHjYtigGY2LbU", "C2hKaikN7Y9Pd": "zddgycsTJKqgyTyC17hcbKDfAXNLh2UQNSZH", "O3": "bb0OfqZljUygjLvtvnVqRv99xxrfb0", "pXIczeamyZvNaQhOFreG617dnUGP4uEe4faf": "xEPuMWOL4TLjlJ9s91v7Mpay0Y1xhIVzt1F3E", "hz0ULYP3SRBivQdW7S74LBfJquiqS4vy9B7Ja7KGk0hWvZHH4SXkwdMlY4O3vf6": "AtZ7yP9FUNNtLul9ZAtvLcjn4M9CNeLjphDRNZusHlN0Km6nTf78RJokm3XFnC", "j7zaDBqXJk": "FbLXvMFma6fLkJIYDdN6pehSDLuk7R", "iboczuO6FuDxFzx0KdpUibtJ2qWM1MpstEwjpf5XD": "rDF3d3MFnxO4Hu7V8GaJ", "cIklyyfXllkpd8aMe7JKquqxGzj9VGAKIfsGGQDsodLSiMVJ9": "mmV13libbb7v67Z1F1tgtfWmM", "Iu": "oQbLoTgVmUceDjYvS87MXFgASsLHsEhUdSZxTCG2U", "fb": "HHN1uAYNCjhoXzDigir7XXktu1", "PYVLHvhw9pZd": "AXG5BuXuJhc", "B95LfUUu4iukvsrVCrK0RmJCFmILvbpXTr": "lvmJcBA9NB", "S0IRo7wpSy1Z1sQacZjgxPw49ZTfJLC5E7iTqwZ": "GzaTl4YsZqQ7ozCAn9lrK", "KnGGfMUdW2ngECK7Ub9KAF9fmtoSGIGSmD78EARi": "fdSuJAr7XitsdF7qDVzQqVJTWJwISan4W5bDybvHA2Urz4c", "aqHyCHcFUSiu8M9ZEkJxtZyOpFQxy89b4xC9iJ00sS7j9c": "HLMrdRC74wTiMCTSurVdMN1eI2H2oEdYjf3W3EoC61IrCkeaGuNzfQPjhBAZ7", "MDE18vL": "TfssPW7edUuEnBuG6U1lsWjXoyYv2X3AYCJIDc", "H8FItCjqsvGEIYRwX499yO4EzYj8m3wku01E": "h6yX94CF0jEenaeTN2", "pU9f9sH1BjQiznQlT": "ArorRQg4GViEpZlwp01ry0SWGeVg2BIZ5NCJwXXF2l", "l11": "lWAC2XHADWekPw0jfWJbnU6vTIbDHNN6EyOZ1dbKKX6ZlFYSqeEs7OwQG72jO1W", "IPkvBxWyOqiS4mGEk0WUQHVGzK9q": "OtUDadZhJbYbkcJq2fV6HQ9", "LWABRgVtyg8LmaI7IlsMT8nsta3lgvuniF9V0TD": "zcb4JM", "Kmh8Hy5xasUejgDkYvwmGT3dUZs5": "nWTMKfWA46fLnvoFuIkpcILZWlBhSrqMDKZtj2YeWni", "SM7b57M5rS7gZJhS43u6NuKNoHidtsQP4hpNjmzIroyFRmHMqI4LBbW7dtoO": "DitOYOPprD1lZs81qu", "VNAJDKqJclp7KBAugAM9L": "lDfU0kR", "hrWFYwudling2yCSlT85RsaaFGeVIthere6VgpFfpe": "QeK8V8cvpaIm3dzC06Cy6cpbRIHp13dXZPgmM8jmWJI8Xzi", "plA2SYAh8Alnc93h7ye7SJHphnhtRw": "Bc19XVC3XuP8FlNmyTUCoufKct0Nak6A7e3uHOsQgaUGAnImsXGQCw", "yaF8e3EP": "kiBdS6KAQLicCtsMMAs7CsZsgYdAO9Pvhh7vLPSqlzSBkRFNz", "LkjW0FCOZK0p1dqTGLJVf33": "PVPMikLdZT87fZqmFSkMc4kZDPtY9JSbbMpnIaTsDaRwtVKabEhDUgWmW7xF", "Y6bUcoj0SZDj4ukuqHVoj7kVIg": "OsQ1Zeq32vaiuBRxNYFl7mcFaB0WNuyjRjW3V3w7i7APYZhdO3i2BreQLptA5", "xdyzXtssBOfbizB5NETmRdtb9uKI5nLVGaYI7OkrIP2IZ": "NQZHyv0eYH3DCTFk3DtpO3dcAQZU4b4PpEscQR2Sdx", "WebFD": "sVpiGqpmx3", "V1xu3qM57XgOO6W1lsGlYTaCx8UEz5FPiyey": "hLUney9CqcYkI1csBp2guO0Siju2CzCcvBCLSv7O", "BhYIykElS3xtxP28J3mDx45Gd0FUHhD0PpffWYcnrUbu4jGwemh3nTpvlCtw6WE": "OGk5C7A6ayG", "CXVsNQGP7lYl9u2YsIcPjz": "aCCmmVWYUNVCdgaVPU2jc1N8jyk9uLa", "Hp3MX70P9tFfjLBCtQQKubqBgMZ3XSgDzXAVtUdcX1Z25nkmg7fDItlo": "Ni37pwkfCtHEYHcm0", "ULq8iBeF1pyAlU1a0pyL": "zIhs5Tzpj8Qtin0jfBzx6vIMb7W4QvGHgF8h9insBneqlDDJmF71pSJfksPx", "oWvYbs3okEBCXsyFvHJOE9rXd8X7bEkK71vuDVu": "dGJoHJkpHQA", "MTgHUdF8fNTe": "iQ7UIvmZIbPb0fRL5MBpvAnhOuvjFtiRyGCIzEA4BfPnV", "b595F1W4XnrH2w0ncoNfPFAPK0mM4SKWf1WGSIX6ct": "GXle9WMZh52a8sdRo6cqYt98rB814uWtg1hciy5v", "rIbjQ3FNZ4pZiRnstR7YywWpLvHrJh7NAM8hreFfrBFZFnjCMog": "zE", "DpVm3PvsC": "l42EQdkijS7EXZZa59b7mJkX", "aC7F5G2hj1AE619Icjeju34KkF15yLwJnASTWnhW1mGSdzv41LMDmX": "kkdu8nzsZcXuqy9V0FCH4pCRyUZnsbMGmqBWDhwQqr8Beoj", "uRlTG9KurOXYzC6MVEydxJgc8J8P19BhiwIsU82aWBvxX": "OhMW", "vCSyKodK8Cl0ubsxdiUHIWHCeIxMBsT72ZLeRsqkIs9HU5Q9J": "UtV47hsNmJRjlpGiyIs7ZXDF", "sZLpSvvq6rf4bv8pUqThJFpnIs4pLU9vDvxes0qcLSRwi2": "LGAHUtjk5l4RQuZAW0YPtjm", "VBrEciAbNCsDy0OnRgtaZpgYAbht": "SyHMbDiQ5bAySmXMKDpstoCKHzBtL5a2Oz45CJ", "UYCseIlLh2": "gmtREWrbLmSxEqH1g3bOfAbBaWquHA1j0m9YvKf5wMF9aXhSkILRmfd", "ILxNMMSMW7uV1UCRCr11GELBJ1CzXqhIFLJds9MVsC55LgoiLke4Cizsl2rA": "QNJSv9JkRRMTYv0RV6EwxreKXs2G", "n4ntU3G52cLLp62cMoEGrM7Kd3QEYhH2g5brZVypi4HbXzH": "UeI1U9jlhEz9eMMn6cISIVjzRZ1V7fzuUTjoLl5684O657JXOg7xaHTyGKh", "M5bznjrLe9hKFHC": "kmtt6WRumlfO8S9K3RYUtxPs9cO", "kRshLuTYQkipc03TNojF": "I8F2IkOIYVo6BJWBTDodQuxUiaAqNCKfWGrC6HyeHlXnbz4aKJlxlbAKAq", "pbyO3ucGfUCwGVHpR5oIA8V6fOXTM0D7mCfWMIlpahaX1XoAOGfBNiJzcc": "k7jGei8tiXQqi57iJtZw0Q24ck83DELPjokNYYKbojfi", "KrLNeZerpbEQKRklnLfMryxrhrNvi9oBisw7h2eCY": "wcT38bvrm067BsQ", "ooPNFXCWfo7lgPj6RAhp2ZClZQ9h": "DrMdACIxLo6bFSszonOHgN", "unXF3TrGPD15IxEhCGQxE5MlbeiiOyfl": "K3Og8ERtNbt4qk6P", "wN3P7vkzL0YpDjMUXemMFJl7vZxYxl8zWpi9hbVupteL2K7P6uj": "oiyj73EcKSS5dlX9sfhx3pQh0jAGSeWy1jh786vDLaRhQl", "CbIdScYtGJbF5bPt9vXXmibJBM3qT3KziN": "WpTbNGZghwCj5OdZTjDED6I95hHaUyT8DortQB8gk9FpfzL", "BjTcihthMFzHm7n3G6OTvX": "lo9uflzKwWM9N9nEEY5JBlq00TmQZqwbd61SCAzMC1YEw", "PIhu9T9dXhjTIqgG9PjtaGYVwbTbO4EjhCGX7muxRRLJnurXkXiHLepi2s2zcA7Y": "kSUGdmn34QvjvBvhWpkEgfF7D9hhKBP7mAobRWzWkggfNFXeXbSnZWPrf", "bbvaqBloYTIGQ": "w7PhtuxJncW99Pc3zWqqITSAUVhPBAMTnQYB5VekUTQ0V2K", "k2CLswJBBlmw8C11noXlmmyiWb": "TSN4wrYnSYgQp", "X86tqO": "ecR5MNs8FEdR4buWt9y0tz7xcEnvBab", "kZWfAvlyYJ1YQjb1NIvqWNA": "R", "SHpnnP1JwTBOjVaOUVc2g42aIexnoB5Z76crOIOFhfYir7nxl0fHGe": "UKuo3DOWqA6R9DUzXhKUZ4VLrP6fRBfHJFcATW6DPoPBNnDe8M6YqqijPd7hifpM", "TTmYIIHzUyyuyGznbyHbKB": "GZ959zVTVWwxDmHbcDqoBNJJY0KQnhz4cUYZeq5hex1V", "RHbD68Fh51vj6deZ8eRk6xioxH": "X2QuzMLZTv1wXAnxPiP1Z0WJL614J6TU9NQoNulz9R4iHmgbAxGsur5v8IiHAdNB", "uHkZ7hF9Tl6msJLc47rshbOpGdTDu32CuEE3Bgj9oQ4": "yCIwTmExX8ADp8mI8iIPKLieOiOLjQgR2TlrQZTsByyxT6wMEu2Pjlc8RWqQnrR", "nUKQsLDmm7Mo1iW4ZlIa3ntkXZnX4fXDiDJ5eOo": "wWdT3OjYUphSQ34", "BdVtTxNPyLbRX": "YKn5BdEXRF0piOR1WgbfE9MgvYch9ArtyX1QUbI1kCEtYKIHBZkriqC6A", "Xn9E6fs1gdH9aA": "R84S2ycTrVKOuDURyAXrazXb5tqFul5QIlXVf6fNec", "oWoC6UmGiYgGTHdk": "HFq11Eol1hHqEpMOrhcn2NGThWBEZne6vwujVxtD2N3xleN7a", "jUCNLz8eTEiSLGmWRD0Fqjy4EFpIbrCusw": "ibfQlrClWuDI8lTJaSD18lc7y9m", "JtH8dZYwpwJNUiXYVrU76W98OqhOIj": "HEvgI", "FgbSyXelaVtvq77TB9woP": "efYmsKAwsY8GVdf83tO0B6mXEs333pqaFsygZ", "SbySN61JsDDfJp2KdmfSyyCgGx9byWV1A28Vv3ctOHa8k9": "ZsrIkuMHqL5EoPh6E9Vu5xoB", "Wmqro7bIcaU3qzYqM9": "rlQwGfsmY2ai6qbrF8SIyz8F8axrGAnofApDUBFAPNnWhu0YY97rxWU", "hYByQfGn1yLbLwLLQ": "OBjLMOEsomjHhYvS109p095ae74sSbYwfO4j", "eVDXeuhbGivyzQ3LwSMLRFjQzF9HoOIGzMyszWoJdG3EqAgsdrveuwmg": "ji08J1SO1bwvk50LIlIUg02G4AuTH25fjpGN", "B0Uez9M55tpjK5rHI1Qee0yY": "rW2w4ZxDyaBce9eHKNcbxKvLgYulHPOJkPT3yt6GfNO8qoEP9FKlk7kwyW8C", "THoymf8B4bgvgJmyaYvDIaz1uvp2C6U0U5W88SBua5eBhH": "gC3O3rDeA4g8NiwFEHPZIrfX3l5nbxf9fJehoBejRY0Qg", "PttBDI7MIdwU9Lzp77EhRKih6V0gDbXaQTON2PLSgtlvKzsXRojVem5U": "rlk8zz", "ia2U4Z4T9TbxV1LnOqcujCwLya3T0hiJigV9pAmFOnhtoH6dcwgnQxIwnJ1w": "f32kynCVTs40KfaUgBJlKh6zeSUxkn9RbQPB3tmMHv", "agHp5NckbL4yuvn6zeqieK3mlOLu2xh3nndPJY6fjhqXT4KV3d3pw8Rr": "ywoMtOmi4brAlakZFcRcBrAOyMFUL8LdzJy0OcG6PzaGNZJmOq", "gOCRLzYDi8sybapD9GZZQh2rExhqIH65eZm43zXfq": "FCEbMxhch95zVp5BRN0", "QE4qsa3Qru6pdtVNkEFjuDExEAvV0kU0QVCow": "TRU", "RlP7cOhDIDSbU1i9rEO6W4IM01kFq3EZ4mEKefv2dUCwF": "D7tug418fG", "IE3lH09ujSaWw6YcYMFLiEf2": "kaJodgwMAWY5", "lMiqlEUPPehLcujqQ": "Q7TrjK5OfaR7", "aIoCF0bfWZ2MGGp3kLX9wsk": "fAPCNL1A9TcM7cFfqSu3NJnhmHiilJoLKxZwHQtFwh5fJHaSWPbs5f", "NQmht5VbNfJEWSFbhvVaz": "qRtIsvHGikVTpSCaLJVWJqDtrzLMqBoJOazIX8J1dJyFN2ZikdvKZ", "YdVX3sp0RAcyCC2Gx5URhakGru9QCNkvfQLBCHPpmIJS7MsLLvcz1": "RoPlBg9npPjXSJRm7v4V0tanC6fPrQeKbBJ3tYiblknSPoiBIY5FGRgTIzzWt", "Z28Ff7YfTfIBYkbSWzCtLXHiMq": "xKzrQ0wy4wEAINtbpWp", "eBHg9T8wglVy5": "vGEPk27qnNOPKD3uii5K7O50j1WqvXjJVw", "iQZMVN7mbJ1YRpyAgM9NU2B6atOxxXuco": "koux3OiTg", "Lp6m8NXbQCwcRWomAFs9nbZpO2VpgoSfCjzn": "Y5czrwQsfLaIFI3UvQ", "PCdi9ypOZT365a1cf94kk0KAa7yVw8L": "pnbBQgNp5wKticVyIlbGvAvNbopoq8pYKvhXqhTZh1O6tVxiTixMmGaBzX3k", "LYUAmuegnHSu0xwdnByFcf7r559": "OQ1JJ11G9I1pYa1tbOnqBLGwvM7Xo3k23Zc3", "l2MYIKeuOhQoLXZCC4ojuEIg2FDiwoz9QGme0I": "teih0NH3fkyt9yIH2spL2t1TwU", "eKVx5N3": "XKot7DGvgKfWrYraRF7GMAa54GfxBJpBe5c74lXc", "x86VAfRlNtGIm0r8li8HXhLTbztVBJmqa95a9VEAH4N4N0VgtLuKy7bj": "Yr3WbAxZtQ4hqyoSfvaEdvthb", "DJ8oY1YPU1QffXaNuxPMGcObfMrz36LewVPHxA1fXjKlNDkp8m": "eUhpySlJCygnrvVFAMpvNJaeZfMOvrNh", "XVGvh1vxGRfALUG92IKI437fnhLxYjvisTZnoaPJwRmGY7pmZDgBDnIU": "UPuaQ9DPEKUit2ZQuHzcCrcULxtjP8RHymD5rnn0SD6ievt", "QqqpsxyMtMKbr81kmKjnsUvguC7L8i2Z": "MNPwAsIdO0ttbLnj9NPXG", "Qu5xo8RxolyUFe6rg0yqEHgissyIo58aolfoOH5ZXQ2wAiBig": "woVWtsj25vc0TqCHyccl4YaGjBJR58NS62AoKrX7QzC7NYIWjXd257D8cd8IO3", "KYb12Y0MWmom5rNCv64naebyj6dqjJuvNdLNB": "rTp6sK4WahaRIH5vr9VTUlIbr", "gSXQYVXqawpt9eny6M2OM91tdgug": "vWNUVo1ysSUJQSEXciU5OgNxrh6GgbbH3EZzfdXgGywuP", "TU63q17n4HkbBV0GGLUPVo": "Y8to0YdKkPnviPMZJTC6MOdP0TqZH1Vd8Hk8pDNsCoXqp9", "igd6rRZ8a1W2zN5QKGgz9JFyKHmCo5WUvb2vd8yup8Xwp7nocTEhujO": "bbzfyhp7rZUQhWPFagYuqfCXhfeb38", "JQZL1AHwDjCoknqhX": "DvF8e69p91dQcg4dZggpqdKYUIhVf9wtp6nu8IXygvzXyWt3J71", "UdBimhzZLPK37tyjGQlyQxnNLOMi0": "TM5yJmVcLfTGBy6t2VG7y174", "njJSBCIFhOUx7B0vmqz1eFB3sd563VyRDPMu9jRVqC4hNDJzlGs": "h3YmZTLnuTPBWxgA5peZNOxsNTuHY6FMbLs5BV9qGbGd3hGCaKWXH8QE334H", "t5bWbUwGo57Se7z1WEgNx2bH6cmidM": "szIh2T3hAsOGImHYjdGNcZeEdJpYvMZBk84sBJ0kX1N0uxSlHkQHewTI", "PTRnnDNtXLZD8JQBDPoSyfLoF5uwPAyqjQrMHRgQ5lJHe": "nkVGv3QSYLxLyC7hqbp6dNf6EpFtijRL8dY7jbIc", "yGa8wR4FaW3QyEUdL8d890h3SKkWBDYPfbBQMD5q41": "LgeZzIfJWZHxFf26V4eCLK4w", "PTRLVlPZ5m": "ZetBgDTys05VEpQANIVheX1aDjeF6EiD1xisQzpseK8j1", "GkGUZV8r6dQSTMA5iRNen4zxVQKS9mDWOvMC3XvqmOZnhZ4JnuNFA0QsUf5l": "MLm5hNbwfM9hy9MaSZ97wDFIfZ8Hsqynu6mrmxWQdSMrjIhIj2P9FERQUGgFcOE", "kL1PwAo": "LsrcdfhFJIvL7LVfvk6fmflAobCeGMw56V", "OPJMtdUvVMHdICSBSGNrNmjlLVAtORpb": "mvSd4W4NLsXdknX48XK", "PqPrAlN9Zov5EvVmoM9mzV40dXl1CMGmUqf": "mFkVz86aAP18N85g92HxQceYtgEf1NK77MmfdlX9rI9rgpDERxl3kQsE", "tBEq4ZycdUDogpSVN": "klOhuDInB5Ahue0ebrt5neVQXoWFDg0KUh8yO33dEL8zhAwIXSbb", "xCJvEsKf": "scDJOpNCc4heeMhmvhXeqXrlDL3dmIKVUSH8tlf150Un", "CtrCJh55aZLBdGhEwMEwAXNcoA2kxVOzg8fwpGCfK2Ov": "mVivQXz4tpxkg6KrNr42IXDe2Su8VtuF0N5pDyE6d372yh", "m3YjPafAohwriFeAcWVaVj6Z9kaFu7shIuT6Ift20LncRM8LCv6rKZ": "s70sHyvks3jZeJEv9xDCeYkOv82xOQ7Uf0oma2XpcG", "gOJRNtFUm3mkAiRdI0aqhF2NfymtHnN3C4sNbU": "PQ2j3X9KJCZdNTh2kS0W6vd7guTqeaOn4KJGta55LbI2WjhckzIB3UUPAPRq", "ztnDtoukT": "kcj5EkjKQ7DpfCA4lf6", "OY": "Li4D", "aLfIKRjcGrbinGTVRXMW2iD2dK": "N4qhyCKvcOKZfT6jVkcTyihnZdU5Su6Lq16", "a0dR718YMoVjUBkC0hzax76": "apYDpj2tf4dL0lVjLDBocznl6uaCNdPlOeuiElNmYtvCPVIoj5Okdvsn", "hii94SQ4QEsnbeVs1jYncZ8y5bLEafBswS8u7bJoR1dEQE2QcdWNoQmTJJcOV": "KHlYvLVOi", "HkUqJptsY2clTP": "Z4wg7caovYA8SWeeyOTOtsGTAwFU1BPgZNV7mtAhTBlxTEWOEiVp9OBFu", "woRViEGhZ62w6VGkhzPYk": "Y05gCO2W4NIQFu6L8gQyEGowgsLO5FEiy3LkA86lvaeYkiJxbF2eJZ3PJMYqhz", "yG0e3zmkr0faqixNmMZhl3aPbKuv6yS9hPmoXzpfH4LWnXuB70mj": "xlwS1EWFkMqbiw1m9hyXRyGl8Ve6cAcz79kjMD4AeEvWoesmu8Mbvz62RpMJ", "w4j5v": "ALHap8CTnMOoB85zI2ApgGsz5fCIDeKgNqYXFtDSsfrhllrB4BEjSK7LYSEpfaD6h", "l04f7eBbNbgh68TjAcR5Xp51tBgiBGDlSLCmM": "Ztyd9z3KbfhiXnEusmwnA4bV4CV3Qhi4qNFHGHzoZYsy4sYm9nDKVXz", "DWJUkWOf7mCvSmzseMsun0pvtW9QYQGEnKgsTNL6wI8qG8VD3": "J4YGd", "Zm5RyDWkt7feM1TSehKhQT7ir2JBR7BBSzS": "edItVaTLB2sh9DI0tE6JOD8x46YsQvqsucKeMvWdc0ogwiZVEm6V3uHSua", "LujgrGfkbjXrv7MRc5zehG80g": "GWb1L9NyFZFvmT7", "wWQpJ4GeK3IfQuvveD9O9YM4yhBzPbk8l362Ghrof06ps": "jdMY", "bGXThTnkL4ioQSKk5puDF7PA09m0wLWj9t9xdHZoVWpcG": "H28EGfG", "RhWMXhZ06J9fBZnbUuNiHnc1OiaNj6BQzqHSi1CfmQPRmYR64Vl3Qdcbe6": "OPCYtxyPnFPhSjUn", "xR4dhCzJCl1JjGYm": "xg0Ud8NC0vEGGHhhtcdybUVfyt", "tp5J4nG3GH0XSw5VIrpLSfL9BiN9iWuZ6Q6a6Anp2eudMqqG01f": "sWp8evzQzvEmwgilPPxynyY9lgfwyRlHcGYOoOqiRCxm0utLO5kYJZznHfPIxaJD", "C1cG3mIHW2Xq97pWEY6ZPuwcgsxhXo3zrcz6yN87qg2wCnftG0": "B20sUizky3x4RR4xOT30s748LHb0ei3ItpJDEOBxLe8Udm4CitHf", "Z27gwmkhhz": "KumlIo", "lq4uoTl3Y7tlhj4WA4yzY9zvOYpjzdpfFEm20Hqcc": "cliFNEhBU89KWMQgZaIBnHgKqtnffVA9AgmCrvQHk3v", "HoCUptXCPuevPQ7IkoMX1Yz": "nI", "FrbXmc8zHbhhE7xQmb46YWhaWSK2JDMJrwaZ3XlWsPvKoMj9n07": "nsolwBC8", "HG7pCgvZXHX5wS8TknVdbOBAso": "F2Swe3CM4paNJRrs1edP", "HdAY38nfO": "UdMOUGRCQo9In7laEJ", "UZDXxGvRrjK3dOg": "S9Ogg7viH", "HSMjY7nYiJ5vO5pRiUU": "C4I0s0g", "xCxzq38kmreZ1Blt9kj1C25y83FceCsdhJcFsYq0Hco1B": "JJiDP1f7HEpnuM6YtJUfvifpxsMygA9ylDHCw6zqb1entJvpvKhWSQmhQwlYVwfj", "yX4EUYr5lfyjHLRvYnz7OeEA": "lVL5gQz1ArV17rqlzWt7AfW5pmjual0W7Hmzu24WsDaGrzyCrCA1XrR2Plo9FXx", "sPCtAEE7l0a": "x89F3rSggfgIGmzOJNSQbhjmPSzGQ6EMDxCOFmbAoYcXml8qOP0Bn4PxRcQ", "Pzlx5FY5q1fZDu70ikEmOLBtDSiRYX": "SwgOa8D9PgsOBrZSmSBfZjID4BpnXyYOO8oMcJylOoFJaA23dBgxekuhb2", "ORrRMZJTrD326Gys": "QPgsbabyCEVFT4pe9CIV8x9VNTSjn6b", "ULfwj1u83aN8pI9G7R10Qm1UL4hABijD4rScMNQLfeh33YWYOcvZm5": "UZjFS9nAWD5zuMeahQ8MtSbEDtyQcA0BpZGeY44xED", "TngT8RTmH8qVj2rDyx34zQDQfJTaMIm6Lptb": "LNoeC6yh9yGfO9gDKUnaROwUyahdwLeOqV014", "zXApjhUBqoD3i5ebfdIf5YpWuPp": "P1VGklYWC7teW", "EVIgaHzvOjHJHNHiHrI1Ld": "Io6Vd1Cypsdef7BxW0SypOHBZ9Ocb2m32RaV9CYrgD9QwKo9P0eVOX1IbqzDdiIq5", "vmstQ4P8PjxfCR1AOaarxw4iPA5k2oI8DPGRFgx3": "tOYewcEsqBGPLvtp3s3Bnk", "ZPK6LIwW81AcTkEQjkrtlZGH6NWst1X5vm3y0hpjAX3jPn": "LBuAsvhiJg9Tv2Bmhw98xh5aMGOC7T8xKNgQ9001ryxMcJrggUtIq", "urd1RSgnMixMVnSVgf6qPdllrAQitgIz8Y5MtB": "FJCQakptZSqhWQ3aKpERGInYamcTlFB4nsMvXoz", "IfZpPdoTCKh3Q3": "lSm6brb1w5OpB0yHLqEwGBG9AhbTKZB2vL9ycTDPaGw4OZZOxoaJxCI", "wT2v0d0RZ13UNRMh5XJldUIDsXGwhk7RapPlERxUBAxj5XNkvv4uWr6Vpj0cjF6": "THgswIN2v", "GwcDg6inl7PPMmczzdHbkQ2subocO07WuFKUv6": "bwKU2NufnS2xWnxl3ajVddUfvPrWI7A6eQpihXxEdt", "FWClHrNo1T": "Ob7fRmfw9CeRJoFFdbQDR2Af", "tqpXwTaDhtMeGUdB0urg5Jzukoa0ATscwJ0d2IVeCWfszFiD6GCPmy9NJ2d": "rm9DOLtkZsy", "M3C4Gwgsn2B8tW7FKBzDuOqSF4C11RiTIeW1n6vHMup3": "YTKBkBItRbNvWUEZvaevpcWsNDS8FmMZEvQcvq", "ky3GQ5QxdCh122OrtWnalvjq8KfdYmOWbs9kcmNggqkRfo9OGWY": "vfQqf8wmUKXVVeUeq9aF", "jLNzklJ26wePpfuVhzyYpEA8": "BftdqaK4mzjulDj4ykiJNsyiWTnIgGf0XVv7NwdpKyKAAB2eH9JCXnfs4", "FEn86fGhfghxXyKMPMERiqsqL13k6zj9gLIHlwzj3p2dmiNiY": "VwJQG9CHc0eD5FmMV", "PPXpcWRTyj3dd6o0dPKdBn3EomJkNAIElgLzOfGtK": "DjeOkoeC2hBqQDZG1Z1u6VFABtvfU6MbeZ4kGW1O6PxDmt3", "rRkB2pgfHBgQdY14XO7jm6xPNBo4SPjOntn7PunC10ARVPTUqg24I": "ZSDdghV1nkHnm3C2SJdYLSt", "tHq0eYs0dVzHoMBzrgmyCkeNThB0nC": "NT574Jy8lGPCm5PYyKOjTxI0V50EMTSCzZDWUwgPtATMkyrdZ2cqfB", "zc": "d", "DwKrL1bSjD8ectm4AdaVin1pT8FeraKVRxyBOidXOOB47jNE3Qnti1KgjPA5a": "XJ2k8yxCzbZGWL", "iWnoh9zcGllmiBRK7Zj1GSpYlbeohvAVhMlrVqjHA": "LINn8LK6CwQAtWFTNLExQIU6NhdSl", "NUlUyO0k79oRaBkSRX7pZ23fJ9KgJJpo9693sayoztGbH": "RT7VZjCvHMvqNW0Wt1fPU0dCurox2lFMDNyykYnc1Sl", "HeDgYkk7THij71UO2gFqv3gI06Bis5cj4QhllrL5iJpTvUB1hJj4GIh": "bOZKQqYgrYZRzEcw1PeTZssQvpgLEvCBHAkm1b", "u5WLYwvQrIXQ9YluDHUgO46NpTpXZ9AtXAk076jIOqR2z7FXqNrwbOSu": "eAXF8pi", "HZkmPhalUiO8Gfm7QyjxqRxzu02t1uAcWan8ADbqC3QPSdmm": "dDXi7TDPBXFnoJPOWL2YzN6tevhZn675wtVXf0JFHDjSGoqlT3", "dwiODBslfQnomOMlBvIkr7lk1IjuAV6wehTN": "w8KgTfA", "yvDj": "J2akmpPM2oCLlpfh95yv0SSxX7g1", "TzlxR5oWQzYqXgOYnBl7XE4If3boU": "W1SCqAko5iO0h9mjiCcwmTNabZ1wWP", "kwn0tT9lJ1AZe3YRli7kBBIAZPkZrFpFPgYaDcw9OnjbyyId1kd": "WVKNVbtlRY9S675YcZwlxqE", "RUVywclLNkLTtilscEdY8ZZL3sFtZZ6PjVJxEBT3JK": "udxobMIYxknTQ6ptTkeWODUeJ0XpOF4mhaxkoJwoClHa9iWp", "pozsYy3AtceHDh8PMwizT": "Z0dcYX1rDmkM3dBjkVE9akArfnmHGn8oFa2L9jVfM5GuURkk6GpTHn", "l0CCnxpZ5dhZMIu52PvJdI7e": "EpfmPb3OYtOjxu8NGYeAcAk", "lrhGkCydFmxgu3RDjoSFzDY3iYzfHKhC4rgiUiBIuEWGP2SReWAfFOpCB5Ssx": "rpV1ciS2w8lUcw5x", "vbXCqYTITxE4163Jb0BSIBcNO8RCNbTCvi6U94qzvEfNf0AwWX2xc920S": "a5MPAhfKMEyV0WRWwSnoK10chbfb6x6yDS0a", "p9XsJfnMSm7M85qtoNC4rI8M1ULYpbmYEkuYS0MdID5bos1spftv0QCKckxXFdi": "tLm4OBMGwbaFrp4jdHRixUaxgy4gLWuT9SBZh9ZMpWVfMTrN9bGS", "lzMsG8I2bopxuszgbDm5o": "k9Ll9", "gKeNQGqWIhCCuJzR177n0AQcqt7egQBZtWd5BIfz3mJDTvlvXtZd6zTBhJ": "m3KZOvu3slESZoINa8EE", "uKvDub0jGpUtDSy4pQ7CYyTx": "TD3PHiQJCCSJG", "s15VXi8H2VF6BHb53Ko3EBMweYX3Tw456YPFVcrx8xRX3jJv52wvOA5kJVrIF2t": "R7rhFe4H2yxdd1dCd4wodLsJr3sh4KU39SumaiG3ael", "oAJpxv1R31X8X3bko8pxPWmFWVEycb": "zdbnEQIIOxppII886rc7Ga9e2qwailHFeUiG6SovoN", "FcbqDqPz2YO": "I4zTacVvi8BXk", "nHlIaOw2gSMaT8Pj4D3NWFVmTOP": "S0Y61mxKb5", "Re": "lPf3AOs8jF7XVo", "SDyi1NoN3qngW9rc1652": "SLqVCtsSAk16IzM9gzJtm4L0UPIZbzgSKu", "nsplwPeVq": "imSAhp", "W80kR": "ltia8", "Q10kio4bIe3s": "BFUDPPLqSC8ECTx8l3s2Ls0NEjDSdH54zxoQR", "NmOeemwT9IZlhRJgtHpgAIGz3AbKl6aN": "FxRazFmOv3PHN4yMtxbzyCYYJ2q8voUeqPeVfsApekniDPgTrjmKvGjn", "sJUqXHT897SwShyRUopjP": "WjdU0ApFd", "tQexq0a0ytgaOKMhXQoQOvJYh3Y8D3MpoaoxeS7KWHfJwOFHqwL0I": "hhd3eNTOnLt1jxd73ZxxhQrLuBcg0EdgLm4S5MWnT", "LXCB4iBz0ncQ8YPnQI17JzxWScs7Z4rjLYiUKHH0XmgErOj6GIACD": "cmDCfsh9krR8krIXPVveKQjtgCXBaUziymGpBU8gt9m", "SHETqlJNg": "ZRg85hvKWJ2eEnTEZJo", "M7JaXWr3sgU5IQHsIXLS9MH3Pxek7R": "Fz", "tZvrwtKwzwl2": "zQv2uZzPFxWOJBp746bwJSL0kqHenSLnRtTmW7N0iN4", "rWM3LoRy": "G5KrovsyOrRMRefJBIdKOAsirB4laU6w", "soTZJPILRZ68tCEvVqnR2kw": "nBNSn", "ROEugKwCu92c9yDy": "RsMBnbqsaE87dce2qlBfVD5sk", "KnbjKpENHH63gwJitnDMUtOzjh6ptr": "clvGpY7hQepYym2aN3VRRvhlNPFKtC8BURI3JyMwUTJYD2djk4q1dl3pah3lqH", "rXDNoh": "pLtlMvWGet0OqaIIN6xmySsIACak6mcAniMa4dky5POOdXUHc", "hT1R0JFJhgh1yrAUxxp0Eso6WJyACMPtD4GfpZ9mbS6L": "so4ApkrRRnzrNQDwcGhWBi1og6eKcO5Js7vI7QvcxlSrCFBK", "lfsKOB81p4KpeX": "N1EaZTljMTecwI8v6unHZgpMIy8jA", "EDDudf": "PLtVUR1TBIE40IVQqrIDwOEE6", "dPSKzVWoiUWjJaedTz": "rVMG18", "zfYQr0TKfA7sdPdD5xQRFKJrqhyZRTdnwimLFPc": "PMch3Sm44mctYuu9FJ", "Np9PFFGngkIo4Wp6ekiZguykDBUWxLWP0XQZ1ndfdc": "ifqfklujIv7jAgC04yJGzGZtwzHcF7tMYFe9ef23iHIRiUI5N9YvZ", "PQjBbV9WpjyGsots7mc8ywNjNvZ8veCwWatX9R7m864OSB": "Gh", "rpWUYBxwPIeDASNTyzxxwu8n6YeIuOb": "BbXu7hW7ug4jJhd1eu7NX7UW5Yh5qWvqRgurVZrm6uBosTOP27yvd7gKFnsIVVA", "rDdKG814PLtTedndEmPXqMP7rfBH9ScRIyg4gplx3": "joii7nbDRXA", "oEgQmUCPK2HRKxdC6Z": "cgljgDK8JeUCGP1W", "ymDXxqRO7EV2KMueB7wMbyjGKjK": "hPOaeHGoIjd4xpYVlbGkdjMSLgZmKpK5TabE", "bIpSb8stKu2wlEI6yeAVa9Cv7V2LyAI7u3": "DoJ7GesWGNK2QwA2RxuQmWjqWmLeSjd", "nkxpuv0cfrg4NR4tzLtf6kw70S": "Q2kdprSO2zsBVxabmsFA4G7CVG8j5bNduzTXJ2apXJtcM59uD7AXAV2iSlL", "Uw1SrTB": "YkQhz7DsgigrR7QpbuEiXMMNluq", "nQpoa2JNfg": "oGiUbuXkNdpOSszmWzTCDmsbuJ3UDh7Iajj1UtzsUe4UT", "ttU91kq8z3eAJCor4wyfBfN": "DfOjhK1UJcat9KHBuUb7O8V", "WmipO": "KuFWRIL", "KytzpJ56RQmifZzpnwP53": "lfnS", "fvWCoVRFXupPbPQByrv29CjAnY57lNJbcQjfz16U4DK9mCzNYNoCvuASTnBM": "ygWORib2hcXkMDNMz6q3HRmZBF2AoHHU", "U3M": "ov5Oh8P3F3iMwjhLfeFhMSrwvlJ9vrq", "O4NAxnC7ouvizKT3vVTIe": "iW0kOstWHzfSEBZ5vynvzkSwtzkH1JYRbI0VJp4LF", "Pvp4EjwNs0w": "Yh", "gY8xX6ljVdUImFpmHXylqxJZzFtrn9LYqQ": "lnvIQZexQDNgkC3fj", "EGK4q1m": "DYHcnn6SmnGlYRwLTHXohevmUkdfkD5WFHBz5wluZlhG0ftJPEH6FNVuz", "sxTxSkUlrwbCJ9": "sn9kvpFlES34bV4DEhgqkEHMcmuuEshY2Wd6aM4eJXH2F92iXeSMK", "BafxxwgffrO72bWCaJM5t8r1xAKMfsEunS8fsocJNhXjMIBCw": "aQlkZqNX6MOHXNG53GKFt", "QiAXpskI1oG7Bl7zBQ6KykM0gHIhXPYTofK5IfkGXKpVsGQjd1sk580gJKT": "fNnZiwUk0Pzfs74fjBX3wZ8w", "djjn4HoC2NR1u8HuEud4R7ZPsCSY1hRXuezc1Ql0hdG": "WB9tzD9AB6EKKhTakVBF2AybMsWmstN2DgaxVYkK7MORIHBtgVirfVeE", "LzQe1OSYmZLGzfIRSbJpykQT1pqvbM5RjVFXcnN8uArh5sS2mUuE5MjMdvU14R": "hNlXL5jLDKbMKW6K51g4noYheXIEQkVb1nJS8B1TmPe02sN", "cTjwdoqjSuxeRlOxyPSFH6": "jAodi4Biuu", "BT427JMpNtrRNGb23BAL8f61W67CU0cvVElZwNr6rG5N82OrCakPQSr": "DznegGRJ", "s0W1vBfNUs4MreyS": "XMred6j9P7", "JHZakfglvIQMDAhFGKGPutCGth70NtEmhNNa9UxabnN3GfUPGsRZTKnhr": "QOZ4TWxdZq16ovBY7XAt8", "RCkr6mvfefh2CCW0YoIjF9k5GkcB": "AJBrdYg4DdYc06YHochTlPVOosVWk7D8tkSC", "qofX7Ar6Ysqg4M1A8sxjzGA0GmvuloqZWYzGQwa48VxStQAIQyPjCkrUD": "t3Vt9D2Gsgr34ogHJMu2R1lN9zh9880oZk9", "TJx": "gf62J9S9TO3K", "sk19PBYs5Yr5CFW15vB5VdQuHY0JNw0Js9pJL1ii1j5v6LWUNQw": "fK0GHnrqKltAjf7VCarsXgrSM", "Z2RdVGorCOEmFPaJ1DKc3erAbPLddWft6BrqqEWxtRZiGjAc": "j0KoMmxXE0P4llSwTGicqtqvI2Z2zAK0OZBu", "XlbKrSwaSp4KVvQmssPnHSPV": "FOCCx3qSMf", "VQrIirpng": "pDe5szV2WjlYiR", "VwmVsKfNWljg8Z1nmmGSYDc5dT450PRkv4YfjAbf9GMv4odgkE4kd": "wv087GcJwYeMj32i6ZUhAUX7IvW6d2OmgFulm8AVfrQ5o3erCtg6aJRzuQbmruL3", "nLFKUBN5IYTUjs99u8G1A5yB8uJPPmir": "USnQECHSi5MQMaCIrZesfgrL4F4ZNbAsWuSbEXCiZPTzEVul1TMcPXtbQ", "H1xcWBV": "HoI4B7bJj", "MNkVEiJ9FJDh": "CR7ThZfonHBJkabeKaExELZAkFQsy", "rzYRgc8pf8lJIxFV": "sJoVOPLdHcSXGZ2", "E6dlYJfBCYjlGMVmNyZbnlq6Hfu9jyZROBBw02": "Bao3HJ4vF11se8zxKgY8c72Ub9ULgR21wfNeOQ2zDZpmo3", "Vuz0HElFapXOOCOIfkwziJQbkguGeKe9tp6afE": "j6S5o0EjKnkRvtehuVj71KZ7UMNmhvj21Gf", "iUruMg9DP7vSysWA12vUR89JDWDxLHM5C": "D9koe5lizeFrFiAYbDrlvbyHD10", "JttghlUCjxLEhNSsVyOxFumtr12ZnjcW": "BlqIM", "qLFd2DrYUVfJf4oCo6lk8YtrhBOb16p8sUtrOLdf5ZJyecN1p82QNmq": "VCk8P7mCTAS3nJ1XGVvCtDSbMuY40", "DKxFlbF7KancWryR9Q1866i6r97TnCxxApgjrXTy0jNNHp3oVN22tmu6n": "samj7xke2c5VQv7ScCW3y9n5vUXCPRpqzN0KGrcEbOhlzOgqXALaMPm", "IZ8Vbt1R": "nvy6yDD3Wd2eRbFVtK8u5sWKQQ", "DBsdWfhV30vBAzqDysLwthg": "nO7iPU5QaF1u0t0SbQ1aoaKeNgxvteu9pyI9DhrL1leXbX0tYk76fVOnibO", "aLh3Nl1VwwfoW856ohblbM2F875GEjniKhI0B9kJGk2MTIt35R9M3yxTPi": "TxmBaUMRMQIHHdpdtvryCHtMr8X73aWs0Vef4", "Eti2GieMHJuo8dlL18EfAX6t": "feqomYvifxLWe98ElisZ8wFZOL6yOrOwbBGHFDJM", "HMA4dlW": "bmicLmEMhjeh0QUU2cgWnhtsdTRgOKztSvYG1", "YZ3UewuHKnc01iJ8ZMml12romlRJU4tQjLHMcvUxe": "ZrWtaTznMN0VJBicLRQmolRVj2ebpXk6LdblGN", "iupOjQJOUiXF3oXjVt9xvEA9Cqatz6zZ9iRtHpP9": "JXjo0R0ecSY3Tio7sqe4xYMs9DwqJdwdgWTOgatciJh", "tNWLMhTySDfmiZS44yAH80eGl": "dKGYmFN0S9ifrLGnWFNk2", "UAfKK6P": "VmewRZWtim00ZWaeqrqkv0JffrpMYReOq4AL3Vf6fZ2a4C4q4VCC", "tJ3p6FqyplA": "bCP4i5OyX2xkvkFRmQ9vkXYj5jzuIHGpyK49qhw7pbW6NTXXIU", "eDZ8wgeVqc7xE": "IsWFq9YvntM0lIeBAPuIe8JDFLxf7wRmH3Pu04emhAkmrnLRn9kAlw", "u6o0JKsyLJL2kK5P0Z2gSHssYBQZQznTdL": "lEqleiCNm5B05C2fA3iOv3HJ2Ap3P9sGTXr0sTTYIjhSUB", "h9WOe7S5Qzdiig7Hw4HguW0WRNhp57v2FK45rpnVHjNjKUJkuH6n4QIHjx": "OSxsEV3mX60UyS7omvVVyNGTtCD6xHTnrtPZkqQ6XxZhuMOJHaQYJG93ba0Dds9a", "FL5v8RUnlAH9K7Aq4ni": "qXNJ8OZXniGB", "PH9Db7bFazEYuO7T1ia": "xUxZW96nF7zlqhfqiWkdDpvoazevyoWXGkoO1QhmZ0bVSJC4kn2bJke5q", "XpCnls2rdbxzbdhA1U7Z20KP1aYV5ru7AIYy8yW1YvpejB7R6ztSgI0iin": "x7Vk4kJbd", "u5yB5xllXgQTM1105Te0HvNnqGQh2XxX05CPlN841yAnivwfWKQ7aB": "zOhK6S59qf28yf2bsFc", "SkEwO64wpFNdIfKeSUPyBUDW1JOxhA0": "M7Is8N", "Ip3RO6IKgr4RXbArrEBUx4KRNa4fpHsF": "CIZhc4MjGpFPQx0DlFmYKXkYsqzZeaUEEDkf4h2KdYuF", "tnm": "XijYM0cmQpImyxAa0g2", "KCP51": "AR1HpGo", "PYrfZR": "WfV0fpf9L63rMNrGXej76bSsVuTGmqGV43wqoCQ5kITg2Fm4ESJXhDAdaIkBiHc", "crb5ap5GbOAdkKRLsp37FWxI3Tv9UNtwY6up4KWekQYuAwxUCZh09KwNXQNW": "oAN8QNux2pNjjo8JlzZlzj8EsjPWRzNjHP", "e8VqF3wuOLDZFbcbbRwPR": "mnD3pavwCdvFGofTAVpqv32S4NpLR0tfsROUJ7sGCYNPUYhTgK", "HHIZcoEqbqDh9cCUKdgW22rqTU0twyJI2Ip15UHIJooRA8zS9bEO0XsZmZd": "RUAPcPCFke8", "Nq6cUUgHVpmHEOkqH0RMJ8ZxPJywyGZbdVryd1xcqV4WcJ2jBliPS1lJg": "SaR5jOSQnn9E7", "Gd84sKdS3": "pCWzmxeiJv39oR0YSLSbbuPH7woJkknuAKLLo", "pNsYLsyf2IHFy1zDlgaRmD0csvcF6d9soKB9uNlLbVtvVFn8": "vImwGjvJoydIQw67UlaxqdrDq5CEaGFlSS0kuOZyvRmpetb6oEW6ocpcD5", "skjptXskn684pLjTMWT1TZXs9I3jyxee7pEnBVsvJrE": "tPcUzeJ4VxuB56VsJutqqvjsB7pXLYf37Q4vKN4u2oI", "sQdpEWhiuqVoIImWcozEG7BYb1dLV6gIXJFL2tpCk92dgjy": "WIImX", "jc81mRGqFIWADH1qTM3vsg98": "OfgEuOVYDigohLXJlOew0yBc9F2CrvDKtGiQYbmX1b", "jaMTRppyx7cQKiMo7wEnbSh4Zr": "MuP", "KC7BQGn27uRpLPgBsA2mC5WCLFbhYfECpDhxHZ5ME3L": "qA6fwJ2UdVN9yZvuUfglgHQlIvUBJLi9Mj", "wj0okQyug8DxQoBE5CCkQ5XxEot1W43RVWBMhdhCkNsr3jgk2j1HVCQYlY": "AhTGMOVIX7fP6gcuj5ZclMK1oCfog9bafKEQW7lJikkdEAw6G0n0BhFuqpVrh", "VWtcOwsxgNR2IcVORHIoFNg5a0AiRpItOvLu7euq2s8YQeCijYl7vR8jQC": "pokVUuE", "PUJ": "l3W9Dc1P8D419FgznTHnxQF", "xcNHF9IzuSWhi91FQ7JJaKk8UnSUxYygenpb10hUPl3yeTBQkpLOnvbnniQEoqF": "g99AWMgUpYvkTuk0G2Cx2q5B", "OV40mbw4QaGkRqTCitK12llrmCQQuAIH7t5rf4cK7qAC": "GyijzXz8rkdkDe", "AtMLLw0S5N38PcE4nE8amkEkC99NyuypGqaSP1BB5P00m14kSTMEiy6q2Q3c8LrNx": "CvnvBA1pIvDzaYft5HEUjRkrlkWnXLC5OqrqVHu77F1rgQcf8i1wu", "klptywtkpvAwjXq8": "Pf2vF5QxMHzAxUK7OScOt0zNH7zUL", "HZMHPFiRpbw2AmKi0eCh0rciM0QMoX67jODW4AlJvnp1GtHDlN2xARzX735DyvC": "ZpmaSvIv5owHzwayYc3Ui3yBbvEcpaI60tY2DovBYfrp", "p64RqkUOa3dQVpMT5SPlBAx1ZoO1RnA7OcSn3JS8Ib58CaXw0NT": "SDCanvsI8k24pLgpfJrxcoBhPkCjy1YNaa8qee", "hds": "dZzw7ali7EhkRHCPHiF5gNUzCbQwYTDqRkBv2eXv7LsmRqE7F", "UD4biMrZDtAzZRGd7xYijxM7D8gG2D1EtS61YAPsGtldrtXKVwGdQbYIgFe": "z9yJvmc0zyJmIsq3eyenYksO6ABzmnTLI8B", "UV0FclmnnhBNH1ZHvTu2": "n1T7onNXPNPESUAi5ZQdw7PJsgZaayGzMmiriDYE9rrej", "aq4yKeD2qEivGvKyYx70H": "bvRUCnGSRlu1S4Tc1HIZyPfXWHPtz5YrgoO2Yg6gNEujgQYXuldaAdcb", "mCY9uiv07yp3feK1Xk4znleyYLNyKhDmxGe1l39uuLJhT5sLH": "MlDiDyCO0MRHAKV4ftFVMvBVysLGlcKAspQxRD5AG6pm3K0A", "YO": "Vtd6cNZdtgZqTGSuVMtYoqYNfTJHu", "FMSTiww2l5yR9Uc1CwnMGXJuls4Tb1GYCPQ": "k9ykuaLNIk6", "p9BHAq6AlmuMDyGNcaS": "Zy910Pm2LPrlJnIPamnRBqGpG9g0X3wbNqsaG", "nCE1r3tsVKnEqueJXOhueNZb0siSEVdm2t0tAEY6iM": "P4sb2Fwxk2A2jKqEKFZIj5bpgkoMwIZRtUQjan5wFrUqQLXOh5L2OTB4hxZT5CsKQ", "RtAUhs47aD2ObPuU5hwsjnGn3WXrQBjmKPX1GnXLDd": "pAsTIPnwvgjfZeJifp9nlwHnxyVBAcyfosByJQoDnjQQKxRp3SysT", "wpivBgEyvK9XvG8QfkenSBHsj1Xv2": "RE63mCBDzfZdqF0NDFYzjorFFnjLOHN", "vzDdJD1oOEdYAQBDMd2": "IAsTBH028PmZFxTUcTGtxeq7GNr", "ELAdHGPPpQYO4O8cMA4zHBkB8hF4ufGG901ZF4Ij41QAP": "bjkLbi0tAg0cf5Jm631OBE0oBZM", "bdTWNRYEwc8QL1jqMUX": "M1e3oC5UBX1EV", "lCcc9LAdlMABcONExuCS0NbNX": "XbbwKvgXy05Gpth8g1StMWF7rZiS8p9D7", "DTeibO": "TOknCZqLAHdE1NrjruVyrYZRHy0YFmpno3qidZ6aS5HL1kFesryE", "xTeSMJ6UG1Y993NLHWQFJpPj7DrXnYH7LhLCQlGbe4": "eJbgDB5SQj0mr5w468YbIiJyuAjhL5mJdxdUYiP13rx6QHiFe", "i6kDuKrA": "ychWTulfNwQDwQqt4Tv4WlyCMcL1EWVLPFur5h4yKE", "O3u0zH9GlmjFiXA2OJs4FiPXaFdeXnF": "dDSebpLYPk", "a9up1eZgB5SECC8QxKBTnFthWZZcgTiQjuVpaa7KSc4cjGgGfJm5wiuN": "ZmxVL8EMDk2XfoObRBsIhZQjH9GrLLp1OVmpq", "mUppW2CjUWGpuibymPaecrPEI1IPEz": "cqxGMqViwj4wImv6HKFkGPPy0rPbHxBnoVPY9y29LVZO", "y4O5QWy1JV4LJQ1iTWYx86C8uSGRfzbdHiNo55S8t8mbDP": "f6FuoY9", "WB9GvxiTXDSjyuU45mpUjSvPj6vSnAf2nGZtbvJHpU8QO80Cs9": "PobJTs8ZJcG9nlf2CFn", "K40E2SkOiSlLDxXgDJ4afuMGw9gBAprmlf16AyZS4a": "ajUJnj1pu8RM4KsJCJoGUdvlvCEmEGSWC1rUPJE1IBELBKBOrlD4QZ85RPoF7", "DxjPghhwJeVh21QycPjtXO74fqFrsCqIlJNjR": "mXeXC5eY8Om49n", "UFmOyJSBTg3cAkEoNVYkDdySwzBEeI5rYd": "tv6Ft1QGvd", "s0Xj4gtYDd5NRnjYKcK1Lj9CIhTMBO1kRExsKR907Fwa6u9y8dLf3": "ttB", "ESDr6EhTPaWiy2NpG5G3": "qrPs616FNzK8eRUootjg13BRY", "sGFMgpROHyRKwLc9DXG2J0fILrRps8KIhxOWbNofWEnnuC": "jWK2HX1", "qlDAV": "gUQUy0NEbG", "Aed6zcxoxIUg9TtFaG2H3GmzxKhXCVqkEfm0Y8J6ojdX3n5Q2AQb0B2e2vwovjAW": "EcvId7pOtB1vyo6bRI7jWr3en", "SoWM1pq07Ukw6tFWEmvl": "saKMVOcGdfgckFWkxihXwG4P4ZDjdOU1E4AqBr81blI8xIH4rSBJ", "ZRgbUz1ApXLM0e5b": "XhJ0fXUPZXftYrbemlvSuuvAn7gOVrNYwga2JsMBO0bVCi0FQ9D4HbrXcvBRu6d", "AT3VftlScnnF5tT4g9ng70BvQEEKgBv6shqvZAEXPGGJONF5aCBZGTVY": "ni8FojwDvmZXKCkuVtv5ItvschljGOAzXFCs1GkkdKw9y", "YwDTvsmZWD": "tnPAbeTARpKN2HFJlvMtd4bCn7WqIXnyDeYG", "wXTeaas054AtjL8K04yOZnhWUqannUqSfoAbnPTQpR": "LSzGDfTY4LvM60fkSin9Ni9Q0fJd9L3nRGeqXXdxERPbSF6ftZEOSbGItgKt49kg", "URpXBigIKocRpzbQ1AprzleqUb1qpQsxSVFR5hf9nESjlfCYEgrrtyiGomJ6zdp8i": "OvsJJKwzbV61lg4Hn6yAJu4xFcFQuW3F257oUuB1R6A59c5raQH5Eg", "LXZAA1H": "eVin9HlMeeS0iriAOwH1ZSNRaQP5tu8Yedw7nI1xMzH6AEwb9G5", "ZwNJyecRI1aY9YVnUco0Zjh1qQ98HJJGoelDrgfCxdAtjn3XvGgVx": "N1zIwV2u8kl8z9l9", "g4bXKCc8oQ6NAmKCrcS": "DduMtPWX49DwlOtQvw1H3N", "PYt6VIxv": "bWjKTKQFp44i7TUTf3XnNSoYVo", "Oz6Jj8D2i8pVgwdvF8Bm0vnYnChW0mmPLfwe0JxRLIojTem3C": "V9G1wCPwXQC4ytN3QkeMcra4zUc", "A3b38pXBzoXwXm": "yj7dNJx6udIUbZBpxkRbWj6FWpjbJiAPlMMT15P2FrY47dXYD", "CkZmu0": "cmL2PD", "O7v91iAIf": "C0bL9uEsufoZ7kyq7OT7fae9J", "gOxeaHI1TtK4nYFlXofN": "eNjv38Nfda6yhLFNTRhpwtDwSMOftvzoyHCRWwGNGGe472IwZ6InV", "OtTNGNOM9GSrajwAxRADDrJ3QBeB1vrmpb": "CY4FXl8yOt7kvwpiQyvxDtc", "g0P": "lFy4ko", "ib82dNT0xvBrfyB3bMcsb2a61IMvetXtfbaEhVT623eISPQL0U9": "fdb4gEMaBiP", "rf5a8zGRT": "whB0beNXZ82", "Ub": "BIqHSb9glvHbO1", "QiXm3nbLlkWZXmbsgFGBmIBbJJQIgQn0r": "pHqdipTH0Y2OvDWDNDpzWDUEq3pGpd0te4AP8MJCDa", "NeK6lddnZGxTGU6wSYjNmTz": "zNqKUyQrzpLQybvVbYc6BmTLUZzg20rhpKqK5zDpRGZm9DuCiCZY9FvWr8J", "A5FX3EsK81kYMCG6eap5nB": "NQAo4C3ROYlHS6RsIv83GybgA4u8z6ESJ", "jNQ3yoD8vrmX8WCAkF6Y2NDcbM2xAUT46hjNwsi9n9UaqgRLt": "ygW1lEeg3jQcULm65aan8sw8lu2S", "DZRKjHTrf9A8dmRpskL1M48LuRytI1wvLAoTFGczkF5": "O5XMk8we8LvvXHVI7yqNdLy", "ox03HSRjvvsAxdrEZ02ZLuH8WU": "Yn5CNwFowNxB6bPqR8mFE0Ek8Fib710p5py", "wycwkvkiBl": "guHSk7toIQHkLO0tVGKfvLPgUnrdd71rp4bEAKcTis9HoZOOP0JlvTDW6kdAv2S28", "sTQEy2YB63jtVgK8xJ4fqXlqxD5kQu0rTO7etvc9VNudTQst2LX40EqQP": "ZI26PZkOlC8Oxi1yrhHCiaZ", "qiZLC5t37Jy0WJohRsyny4V3L5NPDEL1quOSDK7Ku5": "UUm5YWNTLks6toc6SPALyMJ", "Hrr4Q9KSb": "Z0M", "Kzm2yGCtT7nJ9BeeUJ6cthuaj75qpB2nj0o5IBqiT4jT02qv0TQciSrR": "qhcRIoVbBPbISAnD20S72", "WGuZSEaYcqiyjEz2tUZXcIUAaJeB5B8n6NZXB": "yLYgH1Jy3ktH5iNNWUoaIceUBjcZogO4Ed9iXErFp6nBQLV4uCZ0F2DN1E", "DapCxkmrksdB6oi2DjomFYoRKQRY8mL": "NtvijTtimWci44Q", "pLPioBj7oFzXN4lkkcOuAU5NkfCVnkM3WrPDKt4sMRO": "eBGvzT4K07dZTiVjDxtIFVX1O71os8ZYHq2fKiHSt8", "UdIpJ41aohxL4ePoK0VaDqkmfs5KaHvWazx5NDw9i96YT9": "AKEFNsa", "XXcMDYWMefWMml": "IMRPPh08iekBalik2Bix7jtxly9w3nB0W6ybGhR59HEJZLL3qGB0PAI1", "KYee64TzzdGzzA3bGUzLMvIWyhbbApNLQCTM5SWx7lfc6l": "GbbKS", "raWrjGgpRAFAQL81lVzEK8qadV98": "gP5rsItltyBBvkbOu4j94qSXtEOdT0kUut23FSzGG", "amkfiqa0i4sQDYMQyADmz5oNEREV6hQ52ZLPILriWEC0V": "rmtd0rk8z32qrJ5Z4IQP60fSSRH89jRPtZQKZ", "RJHlVsBt94BzB5W4RkNLZb4NHh": "U", "UjiA23BNeWClitnxUYvunjny6wHezQZZs4tMMc1Y4rhjvy0OUa7CEDOww1": "djll4bYq37Y2v2sBt6OUgboa8vTcE8cUrbuCi8h0BybYeUdPq", "lDG": "TNaVddV5GECTIqQjtAyG3yb8HqhSbMnb96mAFubrXkS", "yQrAdDV3S6I8YrGu": "zKv3eJJVWZVb3kDhBVj0AqbodnUkzfrQktu", "jqO0z": "t1b7VLLPTE6yEtuCm5hcHm5zovYc50EuVJYqIzieLDgenRPpX", "Rtuz8hAz4YeFZ1ClmPkdZDIxfZNbi": "J7T3GBwKi39mS91jJTFR1XSOry1ZeWti2KbzRSKCt9QZ8UIoX", "RTCJPGQgXZyftWY0jujz9x571CRMIEoJKTl4e9QdFyieVmSWHZ7Zx": "hPpL6XypCm8b4hmLDv8kOVUbbrm99YjS", "FAjfvSAxU8xO6CXSMPp0S528tQF5EFkZpLGhMuEQ2jww2yLZezadakOxl3g6": "VTouNetDS7M7udHO2omoCU9t6TZZddvkGJ4jXNlb9ZZSKKvS3", "lrU68lWpCVRTbD": "VgfxgsUMTAwVnJvXSlmRu4636GYBMncY5nsSCJSZ2qan4u8Ipaqlsns0DVw", "vcoVxNzdM9dElQWsN0LnRqzRL11": "iddwHllAnuT", "up0haGZA3rD1Cii9BODFG7kmXkp3": "r2dVMdnWUHZn4mwHgQLbwUBk7id3EOPhLaHOVvi5SSwDiYmISP", "G4I9MdKsQkRFnmqfN": "lnTRCpVWheidwIFUHkNX2CUYUYUGpjula3pdLskgbtyJcYsOqgpS69Is72uAR7", "dRhkisn7dciioBD3kWQd8twd3K69yAus2OWcoJenrtNHGfiYy0wyTyXdyJDdwHWTd": "vd4xVrBqWcimcHrWxOx1TMYvIUnXiiaCMrcDKANQ3xcxXgE8kcq58zPtx0O", "sAa": "rhNJkkloFuh302grOJgGlK5l844fBo8xOV5ImFPo3r9glbyztAvUnqqwD5uMaJVg", "UFJ6atcsKV3phcC5SxMhBR0I09P8M5IrbS5qTBt4": "mj6pMHNLg26Iz7yMcBkpGXDQLZofpATp", "DtbWUuSOgZJ1": "OxYASWkLj1bIXyAJmsgHFeE", "BAvDEXjmOAq8ke7pGeRe0nd9Iqe0W5qR2krSDZskJf0ethL": "SLY", "LNL81asmSv44ZfLBuTkaoUuUGpH4OeDXws4cDNr6k3DU26M10pPaB6DmDXdv": "GNDCX7Ly5pUZQEW8mwpPNiSFAdlaiWrNKPiVyAZw9k0c", "MRluQKqrTNwgr7Eu8": "piQuKxcP2ecbfirIykiE3GUZayBPBeegYNHKOQcsXxmI4bvBIOnJQ5UjLuOSl", "oe1gY3qLs4OV6l4rv1CPfufPQ5rVMEHBIGY915FkmU2nf8T": "JXjsjZrM1iNxCDqnX4EDHpZnmvZ23H8Wslf4UYNGIP9o2q4M0K5CG", "y8nUOFxmlAApB9": "gOk2X", "R22XhaUSeW5w9utWJNSLZa4vbwUekDPuAniet8oIn9DgpzS": "sEsxoFLlHWVzvZxVCqO4ztRKtOVbQAaYwS90438R150J4uZKAhuCeZesvH6", "Dc13HR5padwLYnNBfizGy84Vm5BRs8a0tnBIr7bK": "hqagUYv", "NZLYBJI73ZEVTsR75k1pzvwZU9Abm": "Rtft3OW5yw", "O7PdP8VhZxfV1aFSje47Hj1LjAgmBC5CumKNIC1VZA6umusyh3MIZfbNibuZH": "k8J0tnYw", "Cr5ZStgQtoNV6": "fbtk9FgAB0IVnoeqJ", "T39tVkPxxX1pqFk9bbTiq2Nbc27ka1aA88": "YTIVdA", "vfn7QvTRMFTdWvsgiNEHTn39KBbnYE7YMWxSmpsJ9A2CyTGJQ9GS": "gX1UqQJmD4kALEfxD2CwilD0Wq3t63OxvGuPsY7wfzGM6pb1uqkZkdrnj2cua", "e4CFZRoAyJn0ZnsJSqQfMJhf9": "G3Hl80vjQ3txZgzQ9AyNbPOuBbPI2Ki3G8Uy", "ztFbN8TRiaZC8MjV8SXL7PpEcPq7zOQIOE4YqxTOQF": "oFElCXs9d5Q", "C3S0K5mtynfrddrJ7hvizGm7IMuKvTDH": "swBSjlvcnvPi", "HmK6N": "UWTM7G1Ouy55E7dV12Bb", "dIL3OGlM0sXcFEsifzNzj9RuGHdhjLXPankT0HpK84iBFFU": "RxMAdBjcgCRAu2Mr2sjb", "dXxn1": "PXeqr9K1FRZri39tQpW", "sgqyet2gcdsN6PvE8rYQTTJz1kP27jvXvtC9lemuSm": "Dg1A943dhG2De5OrhS9J63aWL0grv9fKOzVCks", "AClrNxGpv2QQpPSEqH95NPPgn4ZlSQSMWmuwlHX6dt1rdSWHHb6IevL1tMP1E1": "SdtXkaXOfRk8BIA8pnlJUjbLt3Z9z94v9ntCp2ynUT9gFiEy9VpCkE6", "XnPkPJ7nTKP3Wbs11vXz9oxvqenZlZB": "qhjwfhHa0YjeUBaKYB1r9PvkoZbW9dXOkiMK7FR", "RmqAlJOMF0SvU0GghsaRNzj79Rm4Abvaa4": "YTlPr", "ibYGdxGINItvSuexQCcUmwlhp8QVKH4QG0ivnU0j8LWCD2N6jzCBd": "bkM", "TuhsVxij2iJUMvIM0JrzjxJgocRM8gpTmFI2howBadbemN": "rQRcqBnHiJGnD0oQy3YVZKQtPjRMoheZ0R5rBeSmafDbayzXJ9Gk1tkxqKc", "iMbssfq2xCxFPhBvGlj5uzSZLQOYsIy0Etlf": "qq6EbppHwbeY9SSWV076z2LkwevcQ5q8M6xc6zSr5yFDJovpnXu46vgH", "jHlf9EfDQszbV2kg4M6OKJ5NO0s0Be7y3ISgt7XINtluTPPhyx4WCslELSOO49cz": "xEiGTAAUKf0bjD7q8bKNInSEOH00IJzbnsEtt7GTmgplS7o3TAf0ulYAEkj", "BSZQLT": "QjWmELGATiyEWOE5iNqJW0o11uyW3IqzYj5yyld7JMiYfjl6X4oSxMVFOE", "czTj3zqsJnLSDDEYIVUvJP4zKmGNcY0j6OqbUWmYOOZfZhMkSorX": "dvJ", "Yi8pc9cEaZQSVETGAxD3vUgcnzSlIagLvaH34n6EZHB9PNFHd": "yOjNEavzzbSCXSBu5kkgX2j5wZMXRzTAkuccUZZgPbKThvHBRlkVou", "Xsc7LQnXfeOBC4mGwtD8HWsP": "eIbsfyIqeoKUwJ2sUwG", "SNPBTfSC7IS7smdNFN5kVa23PPnZ9BPwdCoeewIJADVG8cNtI1rM6MzltRoj5Hg": "hGW1kDFdRDu44YnUq93tcYUkMkvFhfsaP8fKUdfsAx5skqRnYI1zgXrAk", "cz3L2zPk0j6zex4Ew6uMV4XOvdKLb9q8YfoyM2": "HvfkgThxLeFeHQG", "HGmVlo7IJwNG4SZXPdqlxCDSZmyXl3jvEwVj6SZsOhiWn0Os0glrtq36pT": "fYWgm29MOLKBPvSfKsc2A0Lkhbyf", "wFoGecP2ecsDihTLrha": "HWSJU8BxZXl1DBKG9m4dwZ3aCvmmJMRamaTqz9ezdAxx2cVTWGz7WTCl", "LLChnTyZCTyvVBsFFY0e5i6sSuidvgIuQJl7l7zDzPXjaZXAxgW13u9RPx0v5b": "F67Nnp", "rJcDnfF53sWqPDoTQGXiUni58yysW5": "tIzYGOY9pX36Wq48bKTylkUACg", "zOSC2XhCyvZQoEys": "yGcX2E91OPkkDGYmO5naErN7EIbW6WqbyqtsGK4Uc96sDr113S", "xUJMoZ21rheXDrGAXiYDKF": "QLF889UX4d72kiZfeADcby68P2P", "v2yNWZJnZLnrFRo3s6S4VBdFV1CxLWxrEAMByOmw": "SjV5bHOU32c6Vl8gFlSar", "yxkXu3IC1UswIiq5acgBQimUj6": "fvy7Ah0", "Qb20fylx4pK0EBMxNL83JreZJIG0FL0BCWgOgBmJPlaxwHt5HK2Qd": "LBBKt2eC", "l0jePUcYra46cpiHlV3HVZ0X": "pTVdVFH6tPTM4Ox9JCCdQTXohPTpHi8oeQM", "jLnX4Kw24laXg9GXDZnC3EFbre": "dW3dAyiDRqTDeRS19dRv7r3vf644pjivbqLnf7QT", "laPxtKWW2nteaQRqeDngVaQFFCmrWEF0b": "EyCuBsjj7cqXdnS107KOrmPGQVyX4blJnlu4PHFR6pUFQwtB4RdTObjtwKlcc", "Oz85VjjZJ0BzePp2PUmAoDj7LtRjnKTMn28up5wdze6re0i72c": "WamIxP8Gycm6gPr", "HRMXxrLGZopvL31qfWO2UqdlvfVdLUJwZlgm4MEBZFMbr1": "REWQB5Tnevvt3CvDV9", "Eh7TP3s7u1Adk3UiwQGzI8TUR2jmpe8mb2lO39QZ7xmKJHZUx2PiepllgXGxjVY": "zPzkCCURqAdmCJryBFz2UAj8z450TUzDydnpVYyYpfoYFmLm3nur40YezcNCDi", "XtmDGaWht2Y5xHD1PbnudcW1jazVGdvW2VI5acHZG2tsX7w": "Rx6Zzqyi4cdk8iU97lfLmonox", "sPhtlLXb8hINbilSHfsxhNiBxOMhY8brY": "p4zU6X63028yCzIAp0dXB", "QSS": "goOXt8Ie1ZH0YMAKxPYv", "WJQwQBfVGlUESIYvbPMS07BC6w3bWcEFVAhjUJWq1uqT": "De3ocrtBxrMrWGAQLrPsG6TSXmXjcxOpyB3AMNkY4LUPmoS5", "t3": "pwnvacNT0Xa0kJlOXux2QNA", "kbWwE0S1rPmnALbuwDEzBM2EMAJwJQR9Ub4JQObbW8i1ar70ZFRpUf55tnWKuvJt9": "Y181GxWtZVFQ9OxWqfVdEsgdZsXU36qHxtV", "wFB6qdCQctCKN7OqtcJrmxjqMSJNHGk": "eY8ijmJM56snvyb9p", "HA4": "MDczjuJJEGBobOXZvZof3Vey42GHWEt27jXlF9", "gDvQJZ3ZLcDuvnpEwnlyo4INeiZMwqDRzdsXE": "PePcVV3k6Q7Ijy5geWyLPqrhz9LIuaHyKEAFmYkm06en", "bIEghg65Axa8fjLxS6fOZp2": "YppDXel4swyD1kJKSkF", "XRqksOU7dsoB1fbIpWP97jAXihu7i": "KXgBeZaNtAamm8", "HIf7bcLcl3JltyTULAfRHNTRRxXAsgHZzG9RMoUnBf3": "NCp7Y2Wg8cpYd9YCNg", "XL8Wnf68eB0mZLzQq3Vcz5IiH7GjyMtSwkIS3VLAB2lTC91IMHJUcUyr62uJAG1": "GaMOda04pzfx4NU6mM6J6rP", "CiI47rZ4Zg55bOg5czzKW": "fzkYolceRm0VjC5zxoKPWGgRrx5z4X6U6fFPXoFidzrbZJFmoWJrh8irpdz8", "PV4bozcB9FLkzJsIH19kb0raC0jsLjCNBu4eVfo0FZJBmfAGfk0IJa": "ethf", "BTt95UGCUNU": "fgYGpYmfEM9zVv7wGrXesi", "UdUi0X": "caQjaRVUs8N7nWoAgIv6GUl4NFl8ABuFpgbe6nEnHY0fbUSvK", "ZFE8jbM4njYUX8Iu": "Fuxc9KJiwkIPPtYaK2j8tBhUIYn", "bhL0qVYuktnDD4FPPK0fwPQJ1FVRRVUo5vzWOhVSrYgZIf": "i4CXrTvgF5r5qTC3lfvgAfjINcwvcmQQ58F6R", "DFZ2toJegR033bXiIGh4kgDptEK": "kMKyAOCGG", "mLjfxs": "q2o89K0ekpu6U5bPf2OMlg4UoUXV49nKobnWmeaQY5Tq3", "sOyEet3G6cF9RB7Vy7h3ssSsL": "wNyceODwNSLPkdPpZzaNbEpl1pstU4pw5QSUmBn6CjkWKzmzvvAI", "CueL25hDmfhNVyjubXXy12": "P61EehfJybp8wQ", "AsC2jQ5BHjdyFMSmvnowqoHryYib3C3ec7aq6h4PT1a9bsiQDIj9r98Klk7P": "Y1RyI8Nk1Esv8T382PaIKJJAH", "pbkHe4spgh64Q9lBanukX1tyFgXz0ficGYurReDhUyX6Kux": "dfAUOWP62L8oiocItdB0i5KKM5KcQiDBn6j4OqGqcfkwD", "RL3u8UthXrYTjwytK0LRHiOEWcrqehq1p1DV0WUNW": "mvwNv5FnyQQmPa8Uwjyl2WbB0axx", "NAB14BZYRfGnX0S8uJ0BDMbHzRlGh": "CCVaAG9y0NsYcWYTeQgheFZDyPzJS3ZBv2rTW7MJBfh96", "KqaL6z4XbqfMY1kzK3": "OrB7wZ7Fhs1VeAoGmbn", "HTUae82jiU3WixIOmMAHxl1lxCknacXjkUalm4pPCOYdgXAWCaNgmBNoN0uNt0": "lW8OwmLntSGyHeJPWGIHgwvkWTYVOmpfPUT2OaZ7F6o", "cCcvyq108tMamXbuab4GiDlsET0RuttIGScJIzdYV4UrC1v44hNQiK": "llNbNJv8L5QAnALh6ceP834ip3QRTTDXZ", "bWXdvX6kj8FI7wCDmeb213xv8Hv0xdRpSf2Oeg1hqp7lbtxvh8E1uVGZhA": "u5hy2TyX9Rp6kvylHVNcrSY", "ovf5rfj2ZJ2zYru473cj2CdgAOxa3l2wUQSH2kGrBHmBW": "VX7v6r0SIzwm", "FkNeK7Fgeia12ZuxttsWeJ3vNCrYfR9IKT2NvNstPZcPG45wpY1ao": "lPfYRexswNW7wq2NXwZIyKOVgduZJ0fRsiNHBTM2jAYdElFuc84", "zwBL1PSB0Fdo3Wi8SR8Jh0Kv2pQpWGvtTESzGpHX20": "huxdBX", "CrLeBs38wFnDJJiQ2wsWAGG51P1uHU6DBqNtq6wxcYTbnv31kcxXWo8KtKau3": "FWLajQNrQuGU35M2JHYMmd9NfP1Vx8GzX", "e4cU5kEAD1jhysE6NMYtj4ylb8iXVm8NkJNyc18j8PWRzFG4lgl": "YCbnOTvTIAYAULAAeHqMBnEOjPgta", "xQJQFllQOT": "mgA8Ng0oPVky477xPXxWjSZptT4xRitj8xebpRNnArnvGpkcVpo15Y0xjYV656ULg", "ZraxqL6an2PRt4AnrYutVMOjYFf1o3vT": "BcwmaXEpwqQw8LI0Ji9w8u4FOV9YTYgRQqanHhmhF7ToPvg", "jyU4Pfc4": "ScfNKlvjDknCLbqu2psP3jaFb", "iH67": "KoTYa8YCiERO9Qhog", "j8okWiHbnm8WmCU82gGhlB2r79lqQShR26h5B0LDDgEhghDNPJj": "MgVj7Gai0qZ75htERjt7QYSUmhBfhtJJ4KIM3as8Rt", "IHsYVFh6R7mQkWu8WvrSKnZdKhqXc": "r59P0ViX8uc5N10qd2yF3X6ki4zPdZQalyphXfkwdqTkl1a", "zFckF": "hDDlN2TxkRDP82sNTeIBoXlODZkuXfkshzZJ6Vgybg3RX", "HPwrV3Q4J9NVdcNEejbVW": "PkO9rnliMkBdGeYTjPqkr0QVXPk9ZjICcbS0It6YmBlwIOMBvnBhDoqBvG", "eNuOdaBXaZnO": "d4vetLSsDJRWeCSruZJORcadfrkGVsjjmu22SX1OQY9gWHcR2JhrWJD1BD", "OeC2QM": "sH", "KosBsudjBERW395jjmwd3b8ByER9Yk0qf1vDqRtoWX": "LFc7jiGnaBzfhQUeq4neTpV2LT0pHFyc8uZKtgjpM9rqv6DK5gu0BUh", "pBFxwDaFg9t96D54": "X6tuFVwB3", "en9KaAAnAKA48WsqDgpcVpXt6A0GPWPZ7qSNcg": "kChs6qRtGEpis2sNYKbz2TStlvMU7pNF", "W25SNxtTdvHndh8NONRNIKH1gQc69oz2iLG1gnL7eo05": "Mau0azJEZS3CSsUj2nHnw8LzYlyuEAxoHB", "FZYFzg": "BaPy4cMexd5vYUe99gjpKHT5txo8Ijor1FxW7LJ3fuvZ", "HNDhflmmfe4MtvjX76tJ0uAds2e0lXXASwbGOrebwls4Tv6Bq6KC5Wx": "IJ8nOdDyvJMitfl", "haIIf0lrkHlE7FBqCcnQu0": "T2DTCjfQtrajnAD", "SuHKwZOimnGdnOrvxY0GBSJJdvF8xp90": "A7fnFaeMzgpFlm8Ac9Fp6Kt80ud8hsap", "HJ5Vo": "b822VzKTao1sCfyHU38oC9RxpAyDJNu4CEUX1bfxNo7LyDkDqzO", "aMaTMWj5": "yKaKe3o", "oLzeBgLZnGKnQ969HNubL1cZhvgWJMYI4V": "VJYMFCo9dg2KEmP53vO5JNQAqHi", "sZAwJN4vXjqPiAUSCx6mK4ST4HSP5FGgsIdh5bfEVT62Hpq6jfA": "WSLWZGBwdrWs4UAkQeUXx1MU4qSbr5dvj2M1nqmNJ4K21G9PD1R", "unZv4muiYFiSAPPd1qq": "VWHeSGk7a3IZiG4jcARIZSyod1T", "up44bq6L3GYV5JcMfZ0wTEEkwWdQFWKUJM3yx4eP": "r3ct4Z1UTcsPy9zA0ZLtZHqoXsI49ny0wltUdQI", "P5IkJCeB91GEMVC8ZURGMkyNoUnnbRVNCwpbTiMS53gvedc": "b12Vc1XjlE7uoEd0Rp9tb7pG7RnoBH", "LD8SjEs6fA7UTuZBNATmYa0B7Ksyo4Rfo3GWcNGg5HPA4CQPxHdPJIx4jTn3K": "dUc56dVfCUi0IRhDnTxePEdyZCthyQv4TvfVxOkTb27Xdtj", "D2fXdM6Quq": "Ya0ibzCIYAb4Osj8WiYqhyXcq23Z6dkl45AMcyDz7opY", "servPZWbnUKEHqdZu": "g7Nl3WjlYtJVfpMU", "JCQfbw8wuaQzTgdGsysETrMw5yll": "gMBTb6rDoHlKiU89y7omfk1OJEMxMLbJJkn9w7qYRYdoR0cdRT8mtndSzpSEO", "sFZPqO3NXw106ZHZVE3CB": "sGpztM3etZFOs892HoMM7cPmAYt", "lnd2KWINgTfU4XGORgpPDKzorI6VTU07oeN93nSXfzvnj5": "QJP1g6PXhzF9yR", "mdSuj8innC5YMiD9VE3fyEbbkAM7s": "Zc", "TnUwkeF018AqNOuL": "JPPuk1nBC1UG4lPWaH2OycMFLKdL3sSUkcss8J", "Ywzmzasbr93IodUD0RkjRMmfIcnA0": "ewjUT4E4hoAdqQHvwJ0KnBZZUP70ylRxBmTTU", "Aj7Ac": "k4drdXy4CNyYSB8m8tCT8E91", "BDljmqG5ubV9CZKB1KWY4QCJh2AwjGdJ1fub9DyQnPFscu": "N3I9ravZQRuVZH0dkZRs7rspij3tiitYPemLnrFi", "LS0870BerIrFQGuzUsYLfMKtfljLMIVVEHxDV1sR1BMOwCtNspDCvf682wmrFp0NP": "AHOk5VP146IPZotVQi1iNzhpuJETXJnSd0HLdK1xtXv5AD4eaPCKTRFBF", "uMW": "c4JU0tSE4x6BRAb5BKKF9ltmZfThR3", "pmpUIaSVRIwOyscSKuP4iCSjOMYBMMSFeSTJpH3": "gyBwCOneeVGeKfJ9QJGLox3pLdivqHnzn1", "ImcAm2MlTWeVPpE5a02zbHP3EQ81MzDtW9gGRYeAP2lBN4FCwcN": "Ff9eiO0AP4BDm02Z8KgoFpxcBKnPv5z5zsF4vTT1Z9G", "P02ZU2pcBMLaKzJFgqb": "bJoQGhhlaBTWo363vYtcOkWBXl", "q4V15pDXcplH5udxp66uNhqyAkhPPixpF8i": "ukhrKwH2ol6b24OK8NT7Iob8AdVj7YDLmMFA3r9jyq6DtEF", "Fh5OU2EobAcvpP593AlIXnc00d8WwmhcBIgGc8yUP5XOh3iKF": "MNA5QvODudSsB46qgWaer", "HorgMngMVCeOkQX3": "vCRvaMPoXGZiNclBWpOEMAQKCP9NXgpZKsTHm5x0U", "ywB": "Q63capd5f5wZKEOEPiAE8lx06KneGVME", "Svj23Q1OQij3E3Mw4ljh9gpzK1Qrb9FaobosBCrYoIJTsNt05qBv7TC5W": "EBeGtp", "y6x9Z8dQbteHd1ACEs9K2YVulSQfaVNVphTkK9NxVzgvCiUDEoGFjX5TOVmd8bE": "MhfRa", "tqgstNbDaP8PeUF1O9": "OM7GiYLKPGlTv467wzVNxZh8nU91rXGQ35yzJEdh9A9YeA2Ck2ei", "rtbg0ItZF1ZBHPWRg8KxYc": "MzV2NtGLu7PwpfT5z7mgePHJv1EnUcnfEVKP0r1ojg4listiyMb2CT", "burl8Op6pKXDM0VFPLXieHPPexeDUEi5amyLivMe54StDJbIUo": "E14vLXDWSo4hJKse63WlVJhJ8KvJYqNbCJ0MjBFMO9QYP3awpWiWXmEbGAIpvr", "MuoIYuJGG0MAPgKEnpZIcm0Cn3uZSvo8fIeQDIl7W1h": "OhSAutiQ1gLzDobBUnQr42oeqNkNLZowIakeKKWM1sU1ZQzSoobmNPcykb6FbqB8b", "DCwaC3GHGwUOV": "DEfUC9zopSJJfP6vVqblK0TwCcrFPSIRRPjRrrueB7TtWhNO2BaP", "JoBjGdLymK06jpch7KvdjDHuZzuME7GaVHSRAxYjnZYWZ1": "hkRvr5NmaZd4RRz9TjwhumTG", "s379UVBls1": "WSSfkj", "NvY1Q6awRYRG": "KP", "UkCjqvOPlx3V7Q": "wkThI0NbX2MH5OiLPo3MrwG98WUvo4yLnC5EMMO9wsueCdhXDBxe4JsHA", "lBmJzGJxu5C2lwslRWz7jmPspMmPu5LI5Fjz6XCjP64Cgp": "GQNhAn0vnVv5PcylrRaT8c3tRj6wZNLXlIwvJaQAyfBlpm1zvZMtCwIpKZuG98", "bLpgb7PWgElVoAwnd3Bl2X9BQ4kJ5UBpf16aANIJlCMr15rovEN1y": "qu5TmseHDTMNyUwtbSwShfsdu", "TIzPJmDAgdxJ1jkU9CvXi05XglDdZBO8AYY62g": "D3PpIKQqXk5B9jj4cGbKWwCppKISNxKtNYuHfKcU7DONRgz7JOfuTNR1W", "JDIfg2dH3AG5LeJC6jHLT32UXhdsXLwn1EPNZutw9t9Bncb": "LcB92wPsGUTt6qPtMJqCIBX66", "sNzHbqsLmcvAwebPtcScvphJb": "G9oSfsrqc4bVmfCztM6eQiSQ7FXXHtOJxU5lQyc", "VKMl5GYoe01QjAqX5V9l": "X", "AbYKJ0": "u0mMxHCsAT2khAhykr1FJoqS2Wx", "gzZSv8pGAIDC": "ZGVqJK3IFCSWvkNniEl8ZF4gqa6A3Ylgjdq05XSpTXc6X9UlY", "tfSqVQAHwfqeWSbn0XhOyj5e1uJn7IZjdmcytCBcEY4PKUMbbZIDUh": "tT505ze", "Cn9dEMdQnjDmZ0xEToCy8P1tz78EwgDJmOEOW2eTUGODQHAXyjVohhXtZRimLhG": "f1CkcrzQvTzlaNltC41kxEhcUpUBVXy213vooHREmtF0zLX", "cioAGuh6ikB4qQQ8wSnWXAXVZ3hGqKFkKH": "UpenVCiqEI2NQ02lUYUu8n4wNE9cD7kqKJ0XEQk3vNBMA7dN", "DQZlfHkQgAwIbQK2RIajL4bosMm3eRqYUqvDVIXWBOdS78S": "p26gb4POPTtvD7R1MCNkbNlzmdbdZYaFA5eqn0KMYiwbTtfhRaAq55nbTE", "JaL00YDHxKmwqR9xCK2jBfXjm56bX9Zx4qSobjheK75UTeT": "C6wX6D5mEzA5ajB6oCVFtwmp", "oD6vXyic2bL3EZAhWGCfE1xIZmO75ZHhpi": "DZ64aHaD7Ctj5Rboe1KND6jMNFO3C7nLetTzS7LTIFzB9q0ryNFObWh7zYuqG", "vtFuB1TI5NraJImozIxFadi4mZfXEa1bqjvl7j": "yAaaxUCHatQXUGiD", "PqvLFq": "nNRqtbd4XYB8EucVL13", "MD05uIXkeY": "GddeJGpeYnWzsWBIL7qU3H7FGrCOJJKrBfJ3p", "eE46": "Hd8H8ZtFo8D0hOrTkmQahGCrFC9fbHsRtVm1t7qbaU5qta5nkM", "eL7UEuhGDEa66": "EvWSlm", "XZI6DKbPBq5wkQdBpnaa4YsMH9FoGnCIoBTfqgFezCk9kornzn1xoeEi": "KVu3", "bdVj6Qw3DZFclpd0dIruaVusiuViAKVQu2zwagEv6LnjRZqo4IN2wlup5kE": "bQCAiuAsHskxqRJmQJ89ZkhezO3ciH0vmHBWHyn8OD3OVEqpTuRYuX84fqJC", "tT6f7Ry17dEMgHxx9et2MUQQg0hxn3Rcek0F8aeP0e8zB": "dCXkRgiQpEhVkEXIuqi9RC527UkXxE8tPEAZKXW1wu0ay", "koTrgEOnGJsCcxDDv": "x75Yr85uE3NB0hvMSpWA6vzkEDbVH6W5c4Az25eRnnHA1SP2SckB4w6", "paIkkozTs8JlEf6F16c79JMxXN4F4tbcv8PN9sx": "MUG9RssNQc6lbDHDgt", "BwcZCemMqPFXqvK3n4oDLReCwBJF28oHAvn8JEy1": "k69cFM13JRBqS3JPfvpWDhQGRQ4Rl6K6", "CZb8TfyqHvd9BMUrJWhl1a3ZhNVgBpMDNn46gXVz4hehqJj5gzDdv": "CwKUgwBvy58oFfQTBvMF0VUzFYOrsFfPyocQcPrUR4Q", "zVZC7wdk23jnLecfYtVtvBloCtC5c5aMZ8H7Opoa1Se": "XGqXOFifeWRLGrBi6AL5QODKnQd9H1su1rBfHTY2o3qSS3Vs9CGWKcPTEaCuDekr", "klNvHgbvXyaPyz66wG5rcQkiiia7KVQWDOxJaTFW": "b0e2A5zqkMv", "An0Wk4YUpDOq2pT": "KYDOsd6mi3ty6lPlJdavZHCHQuO23Y89kJSQqIFaYw9LEUYcmKbOvMbOms6", "DoqnJnWnnHvW5dGYFGaa61peLsWNX64JianJjH1f3bdrWlr6jt9u95HgEXlpmU": "afgMnjWQyPGbzrQ71AiSLn5FHvoZcn54ET9C22bWhbVbkQbKSog", "BVLALTehbqwCipfdaLHJj3U1cM9BHcrSZIvL8M9nMyl2orN48": "bvDP6QgCZcuHcABTFLFnX88Gmru7giX5lEJvlRgo", "od73ixrNNGct4XIpqI": "M5kITKTe6GIPPYbPRALUZmiG4g", "MaCG16YHiGs2UNIMmiqQ0ggWeMHsEciiggKhIgC2oTBHr": "sBqpn7HfhhbzdCN7JnsLB37gV61kl9V5imnFrNt8kjvHzCFYYX1MdTlcyrOfX7u", "mIuX2B0": "cUwUQN0E6gH", "mWrDzOweFsAngD": "hsnFuhfseZtL6ux1IK", "AB5dkIG6IB3DOukegw57QvADf": "JWhF", "cTg1GKs0IQeoRjN8HNKVcLHIGO89L": "bC9DVs9WhS3NlR6xYRSjpNVptnDtH7naFxa1ybXrijebVNoMFJopjBQKyDM", "XuahrMDFIUFyggy3IJZoQ9QUbNQq": "dKdS6MpxDG6lL6a9KaOJjSMhTXvXejC6I0MkD", "UMA7ecnDb7FOZMZqkrIfGul8XRqnlwgvxPAIvDcXU3s47q5": "GOL7gCQpdQ0w2aXeQe93Cvs", "JxmAfCTTIv": "wRzMOuU84A1qOkkZNrDKFox1MR8SLr3Cp0Oh", "QbbEn9L5p29BzF8yRGCLZhIVXP": "JPQs8rCgfP2B3khUbrRCwoGrH7MFo", "Ml9ttKjcCRlRvrCXV2mpGJj9AIKoX": "gq8M8yrKX7BNdCtHo4NCOanycy", "cOgNaOomVIxcs5oBs61loiIQSAqgEex5h3u6bi6A58Im": "xIa6LgMCPS6FD62qXpD", "jXV51uuNeIGTcMTaDzQmSB4QjkejE9yURjy2SbDrFDU": "lmMF8w8yMOG4jxIg6xu3sqtWq9om15OtajNlqj21y8ebBcX8yjqTsZA", "GALKf9TmGKgW0xQcV3zsQz": "cGHPKQBIGvDORhBPqXBOO7GFWkxOzwGum7zpIxe", "s5R3piaMr": "Xss3BlFwMswL6teuGSflZb4sf", "zm5Lz7Tt8Aq32x005pAOqsZwnzaagpdhfEs": "dnnCPng41G4YchTvvf4oOE9MfOv6JSQ5YXDIt3fO0NlKhHTJfZp7ohldVRbk", "oE7CUUuemjWBJ0H7bDeCjHiIsHIu": "kNc2en2il0arqidOykdI9Wvki8IyedoBw3JtTK7Piq", "mZU3baLib7l": "YCdmM1xd7EkY3DyCP7D6G70z8LSNE05NjTLMLqTo10d", "VQ6nMzCHsXGeocvmIebPkWpcRSYB6Ty5": "i3SvL2Z3IKfnjsOtGpKhVImrX", "OFSqwFTfuvEefNMaVStpue7BftTDolssN57y0XRO": "jKtlGnEp7N9pH9q", "DU2lOXMpxK1YYfZri8hbZfTa": "sktgwuFowmkf56i8eFlMw9MJWrtuC1obYOvi0JDEFkYdwlQdyrzM9mvXLVl", "Ie0VgHU73vSNvIZMvNLK3zhYLoMOUdrMDMiGOmnEW7qyg": "sLSqLlSibv8v3pwp6ZkfWehod3kpl4x9MePt0kU1CWqOJ4", "x4s6du8w4jWawGzLIsy3MQlJB8vm5E1fPQVbznStdy": "KdvAlBZ0cAN0ziJ", "AnUa2KkNYVKLF2rnCfcI8": "c7SdIwVspjEaYuA1QAFDseX5Y", "VAnCPOtbWZy356e0MOSLjzNJG2KKdRdAGBUrhubeTzVW8DO5Vg9XpMk19fL7AlDJ": "EVVEJlVFGlhvft6DPPhdD7CXVwivEAyBcUeWErZN8F03jXvlW6ODslQhSHSHqh", "SAnCDnE1J6WqgImRIKpJq5dFvHnNcK9R8VJu7nC0pB6Dd": "CjTjNUAD4ub2FoVcAxShMQCnqQQfpHZuy0QRQ6ujL86ZK439RawoBE", "oy6bV6tjGHlPW5KtHyT2Q1OHigsf6A5AuDsRM0YT3admHjaqe4": "fEP5bLgucCZKsrMzgD7S1gE7XDBUoOi1thIpMJA63PlVP", "ZDIeuec8HGNdBCf7iVFTQg6bpM4lfaUKbkPzzNFysMKIxg7jVeopAHQ": "EoOz5OXRsPqrudb6UEp14EZyRGfWkWCHpmIPU94M", "xty5gRQZvOPwC6uOacMn3naa80Rw5zqBlUNHqt0tV3UZg4WdAId3UoSM": "uxqZB3eXN", "vZtigRChgXA9tpeW09sZ7MqqnSiCcBaKHhGt0JroqZhTGeDMpRE": "Q6pPuMcgAIYiwKFYuhVTy8xrBdnEIwD0xZbcxMhz9oKHtJAH43NE7tPDh", "O1dx7": "YXAsCBRtFsqWLW2TD5ulM83eBeMkulkcjBQFl4HdUcCzMxdC4", "K7kQG9RWLaZwJbHI3t0nun": "gDlE9GoZbSlYtFDJ1iVWt84J6luCIglGWc", "PqrK07p31n2XNmYVj": "rLaenhowkh296mkBhDlfd1U8jn7ln", "RUG4zBFBv32VrvfSvDwSHAjmPhr4FvHuxGKZOEstWabi4xzo": "P8AQUbV9cMRwTtwVVPXGx5t7jPY0WxcD", "gHWGj9ch": "sG63EPZ62d", "Ptq32os3YyMt28hdQENpucW0tMopTTQm31yQVH0YBiw2d": "gPdQ", "BoXTCZ8gMiREGeiYElnt7SwTz8vR52xq1R": "oamMm5vAywO4Qy2n", "OU3i6lMY2kCMYATmbC9Kn0Remlv9cVzj9wDIqQOpdtNDGV2yfCt55FHLkQu": "JiV1tLXBbQj2vBOC7Gn4QsHoV1ViqVWqvlNwaoUCdeq8lzS440", "crV8pABPIZq7FYaGtrMgMhMmbJwOz7S9FYUb6X9Uigr97YIATwBuxs8VNF": "E4zs6JpaGlMlIkvVZawsO7HlUDUQuDSyYdq4F5F", "XiuW84YDmn4nYvH1VPLeoHiiID5gXmDTH7mZMpDQHymTierPUmt": "C7mooi9pkYmP9cJ0T3C6rHbeMXi0NtbYU5MPAGrvuLhDfp", "wzvVRHuQpNuz2VLqUUr7": "zjHbVluQQVBpkJ3SNzPpEJCntl0CKphVjP6ePX8c1W7skl", "AnT83jeBE9aRxYDeKGNBAltFtrFLaKBp9": "TMgdWe0vG2tuMnfPRxZyXrua7DX1vkMWvB4XUUiYyECEDMeNmcmAm", "WmuXwelDQ6Myc5eRkJgAOOsF0X06": "CMZL3CvVGetFUiGs6yFf7UOu5T9KIf8aPo7ed2PgOkGQIqR7hnCPv", "KCg86gO6m3z": "ptTt5K5KadBMhJxrAxz0rmUCJ0Tmgl3", "VKSUZqwjGqWTuRklNcx": "eL6zmbsWKN7AEzOFLaTFZsHOwVU", "EAjuc496hIRlDRuX57fSOC89RtWURzrclxCzaypQAbopgTkbisROwhdYKYavJ4": "OEYzJtqSxCKnC68rDO2IJij", "HwOOF6hQ7s7v71SQc5DI7luEQzUFlux4l8YAYXC": "TZDUJnt1CicGnzusZzr20ydthQr4EknXJiHHvuFcl3G3AlYS9oJutwA", "XuQli5o9159i971CZbn8B4cl1RjWUnJBLIDSZg8rpP0wQ": "Bvyz", "JnbCbSrhL": "EAZxYsM0sR2l14Cyp8", "MzSAv6uDXpZnr377nRw7qEOxiE2bH7Qu2HwuYcQy9RYEOi37zAdym7Aqwv2aTB4u3": "FdqbLsxRJLOu3f51aNHjUhLVS8zlIdBDpgDPxWv5pgc", "zUSWnk": "Y8034LzngQIY8HmV91x5Lzqn29tm26xKIbXGktIC6ybFMq0QSXv84W2ASs4CqS7k", "olXptcVYzRvuCDdFBMViHbpu8ePQNrMU09e7M7tHeqxY5x9": "vA2phW0ajQtUvnyo1xFMrw2KxEXyc6gYeuFoViB9WylSXFLlULzeE6X", "qIHlDukN8XGR02FReCQwrRZDvF6sbh": "Dg252aSSrP4zWnWZJnWTK8htHIBqtJmBy2U8DuRP5G3P1m0c", "s9BmOQOEs2s6KNrDETwcleQS8Vu3YIUd3VXODB39yn3TTOKNvf65": "Tkn1tOnzuHrcpLQkn5I95Vz138F6qH50kSGMEBdyLDt34G", "dOdWvu3lBe2S5wKvaBtX1Dbz4Cnb3": "IilRlBV1ZrcAxyBz3jzUZJP9Iqd1FM89p4ZzTO6N2NJfrMog0EGQRFDp2", "IFeKf84eYqcngJFVV0oFDf4GILhXkvDDz": "uQ2wijTqoqC9gEFSAVApb4cPVvLZxtewSfiPFG4y9qp1mEx7he", "VytVXgsg4OEFh34X3x8GFEmHzxrTOuU5bvwo65paRBAvQf4mpYI1izM6dBYrX": "Gk4dLujEYdVSGiawbzcdxYXl", "zNGZjvR3tI7YKhVrgh": "LTwAWeCljTuGHzpxbYThASKFLg7MbEKXhqSHQH6oV8XEkcIitUFD8zVQHeNir5iL", "QpxFqKGlaZ9NZVdzQNfdmJo0U6EA2Rxak15G3SmO3Mamav2XFCoiOYNtdLYO": "O5IhkARgwRbWHJd5e6w", "pxBV13ggnf02NybYdf9QOiInmzQ": "Sd5u7DBT5K16aJlygXAq8gE6PpOtbMzn8faKIsp2iMMi3q5KLl", "KlGzLpPopdvQMy0ceVpZ9ID4EKQpMtcOweBqwVIJKG1": "XXjg4SwkViSIuE29H", "RNKJQoArrktQatoDWbKCd0YO4pShqa8q41h": "LT1R3DOiBY8SM45yJCOdJdCCaLIFDbxo3HLJ6sUXS5Q6hu", "GbpUuW3CY7": "UK65UI0wUnkTEWMxgAe81luRCHU", "HB4egoZdapS": "HzMReETbb1l2QyEunYt3w5Gldfu8m", "RfOVXvCVECUdTZP0Rxjmd81n7QTMDjF2uFED4pW6nqYJItvUZ7M": "GNFmDi7rWv9hzW", "TfeTNGastHQQbn7tAHBPYpO8qGhOreeC1mKw3LluaNlUFUM2rp5OeE5vMvd4X": "jCFut4nI4letUXA0Vh2MkoWvt9mXS0E", "ChJe9AucAbZrT3rFAE28vcfZoxuJNNY41gHmtRdK3mM8wyGYWdHvUgtnx3bqk5wN": "gNMSLO71SLC0RyN4WcqIKnQW8zXzV0IQeS9ippIvpUSfKmIoG", "htfRuQaEsYMIAOQHlPjeEOE": "GPdrK8hYGKDWomkKfSVg4E7YbKImYcLPLZaIJ9MHBDpZn17paYilz1fA3WYXV8UPb", "it061E3q9XdOqRcZKPclPVPat2aFbvSmpibiZmhmviJRN62k": "pgV4s3s4oeSTVN3WMg1eGjnFR1HAWhMC0tBFk0vDno56W", "iknVDuwiWnb6atexbTTC6VpMtuVhcGOzrrzDc3qh339jBHE5mQveTa63": "ahaFsbWgb1Q2", "GzGx7sryxItpJ58wO3eSFjCOwxjUXPZ7LnSrYg9mAQMJKBy8rImY6bqRZrCS": "lu6bhPiYihyaB", "Ds6GCgRvQazJ7n1svX6RY3A7VOXEwwNBNfWMhSjIG": "zzqHhokOhwc7K2xB", "zXsht9ESqBslGTMgrv9TZ2eR5DEHHvIvq5RTbXPXirhtqA9zXD0AiWUUm0OlFD": "QbCc4VLtr5ZmtrXwn3rvxK2Uu2VDrTkwG3B1s3e", "xA5LhCla40JDpATHVBPaQeQ6lYFXLtIjLVrsPs6gP23Gl3J8UiWwNxs": "OLvs8b4Tg14tQuUa4GX6nYWzMN3ZXG6td35ohU4Zfjnr3WkwshNL4uhMKc8", "uYMYAzLMzfkjoJwbfdwCQl1DUn2CdBTLYLunZs6jVGXkGXWb": "jrmtxzZUcCVq66q5gVnmGAX5n1rxgjKsAJrmDtrlvpUT5c9V", "jQopN0jH5H7CNTFCwsUJsWXKrGQBBazalKxiTwlXMf3TQWbuZkP1Yjy7PFRZqC9i": "ZIpB421Nasa015yyshlAysABjlk0lF", "Y9Gg463DT9MdmfRHiesy24oEnDxGrf60NnZNcmVWfzWNR4A3YLxRHQ": "i1p8BbpJkgxOYMMZMNthOhz3", "gqC9TjjSmSfSJf8hL75F1qFyeww0FXu": "WTNCFNnKbUVZqQ1LLGIYqgUKddD", "gZSPUyzJyxdzLFiqDRGE1W0IP9FHPwU3RNuvySlR3Cjpt7DuOIjycgwn59": "tafeGdQEuq6ermTQzd2cOQnRIg7IhEXL9mHiPxSwy6qaBxdQTbPtOngCI", "MmXa19e09V5GrxZ7GDnUtGkSHgCWiA2CpHeXInxSKr7": "mqjmuyMs", "jH8xN8oX52ebS8tyoC6Dky6rlNFZ4gvHtV0QzKqyMNxz7SfKrOae": "tId5KCiPyEfy4BoCWbUFaz7NvJnNlSqjXHkE", "yC9efft1uzRkRQPMwmvT51p0Iby24iv": "SRs81q6D5XG7SiqdqgmGOOq", "HfyBv1jKGLfL": "ZQdqvdd8hoIkUG21J7hZF9F25Bt2ZaneeD2S2Nz2JjYgFtQUGc4LCFoRt5U9qMo1D", "S2HBxj7": "YNKc", "r9zJbHuTkp9dagrgKCIOI1Vf07WRaalYV8YzGPn8DhmZQvIaVNP": "ftUqZiUPNTvKnfEfKRuGbPT3FiVc8Yb9X3FKOC7POLgV9cE", "iMy7yQvFCaekuSQgSNNp9q0AJemxV8GMcDovi9WQGOaqiNeY1UPNoFW": "aB5YlirhfXV3jqTFOyLQttVATiv84Lmagaxo", "LvIBWpuCJdHjpIDFwdrhV6reBBOYc7Fuk": "THNJKGyf7Wx6wWYVCIY2iqtyYFeEGGYPRpRUhAtJhd", "d5qet6olrKac2XApjAMZLpLUt7djNyp7g5A2f": "UuQdgIQ", "Gf88OGtpLbhv7Gp46bm9X7MnUGDDQqdR8bhrm4vARfJxGSCQxP2dZqj8dO": "rbWXL1kNSR0HODjbLFGkOygu", "QJOMDKPs3rL6YJidPQCtHqtbTKAr": "YSYCg", "nCEiBv7KTGqpHFLnfamuMGGcPniOIWDBF1PJVGTbQ": "Y8QakHtmJ1suK", "kpCz7FZux9RWQbVI": "G0wSsxfvxvATh0PexHhOO", "MIVeADIjPj2R0C": "aJg3Fio1zCAY3VSs6CQ3KpowcPlOgk", "fuVOp9i8dV60eKpol2o7jcnmcXD": "bRjPzVUQqt8Z1xtLk4fr0i6FVujgknXaF250CnjCwWTtgBiK3m", "EeHm8qmuFH95Qakwr1sdyswoYXeBAmOaN7pTafHGDqj4": "HoubznqaAXkWpoMHmCX25KcdqFpp4X4gIsYFixRoPIQsLcHSAA2RVHlux", "pVi29IniHaZIXBE2yib8Zv8HqXeeB5K1aVofmcNh74CdUr84rk9CS3T3p6cCzki": "hxv3JGWvcFKfZWTUDGpq3ecEVLm0po7L", "CrycW08DTLdyEdsuw9TE8PUPL7e": "WyJsWgc6EWJ3iNN8VeoAZd29WKCcJptcuM1ZSohiEMzG", "nq5sRCJQgFaUCVJbXLOcEVDuoPR2xMXZFfkeNRRnDEFXFKQgWjibvb842dw0XPUAn": "cTd59JZvonOibdkQqzdVTlYMzR4kFp8KeNs441zyJNv", "ulpKowjKgBMO0rp9Ljo4lSdR93xGYaUupC2oBfzt3hq": "REpIvftB39G6a4SqHb874JvHb5bCy6yPL7rUEq8qriPgc", "BzusxKGnrMDvJiO6od1bom95NXnVMF6gGkepWqkjfewKXKYsd9u3s1T60": "S8b21k9WOcfvKCSg1os2mOZhBNNthFlznYu6XEQx0qHjkD8o4hGIPs2IEg5zfog", "AYqCk4yaYjYWQ41J1IhwOErRQIwNVQjhk": "gdkLHCfsU1qM3UVK9x9ZukwfdryCE7oXBFv1wVsnm1E1xA6d4s", "Y58qzlfFllupaZSp": "gjnfj6HDLzO6LYYmHXE66x6QLxHgjmP8s0zRCQP3", "kn82TCj4QMvPCfC1nvQyllcdYpYjpQ4XUO8tmP": "FTRYAl", "ONMWSGVaYYrCZnzqqd2PdwZs140yVDR": "GLEStUFOfU9nQmPa0O8YH6FcvqDXT8mOyI69eMljEpIMtWtDAfzq", "J6e4SMf0Hf": "KqCRYTDQzdfccKadv9WoOOl4Ovj6H9P3PUpCtQ4gcncQfBOVLuZ1CKBCmywYKg8IK", "x1qVdgLbtNJbMFpLgf": "JLZHG5rI98EQxPRpr24eOE", "eOttYvjQS9FixJHtr": "l4w8Ebe5KLhlGB8uAi23kqSmmaTCPFqWYV", "MG5Lmc72cBwxseFLvf68lPG9FsjN0IcP86c2iFU0AVQV0p3GzQ0fSfeXfuJpY": "r2RFCGNh4B9FkPGqEXE7zGe4B3OxwZYevNeB6funqyyFoENee", "IrxUqZ7rAVE0mKp0NbmaGQdWfFuV7w": "JFkCOSGovHkJFIVOf8sIzafjjVzAPOpBoyqSPsJl", "qVHoRY8nlkPH3vKWJoXMD1snm": "FK", "Pz": "S", "wqYYl3MEhNdLCJmuxsEb7fON4WK6nUpJoCF9o8ZG6Vmy": "xnHV4RGxzwBZRGvNDvik", "pwJn5KGzWNPCogDJfM4zyUg4wuMQAff4dXuovmq": "MOb7eAw0EGlvXFBY0PJMwZg4RyTIeb5gxQzZvryDbue22qdJ", "JkxBDxqCXRSL2FhAFmv": "F53ntZsU", "K7N5Ud6RTxxEF18enHBKGH95Ft7LCT6xRwQng6NlAZMVQxg3H6eqqne7QzbXUHxx": "G72EsBmthtBs", "KsUug5FANYfdBzs6ZN": "VrrIB7BUYGfQG9n0UkuT4TKaV69mT3Dmjr4x", "uX": "ZZfWLh7xvu", "Acl": "U4f9TPf7hxlurzQZoQuduBNj5azIMM", "cG0KgjaPgwXitEgpdsUYFRVUiiG": "iIu6elnTf47uLsRvlaOR2krFkW5", "SKNrPhocJy6IHRQzfxsPayIaAdpepBYn5oI12pvXiy81EZOhg": "eDKTZvCE", "xh6qVcwuC22SPsoW": "ETTlL", "jcT4cDp2GUI2NqgN3g0Rjb1Yu35j8oo1qQ9owE9egVbyoaGA": "oqghYCn1532amugML9DZvMzVuisjLVuUdQZ2rRlY77b4y", "MsJNFz6gdgGxsCvz3T4SNbFW9UTOCc8K87TPSOPiSUDmxGwPykhOVOyVBBU": "VxWP9LW2F6Prc6SuwnMZYgXN1e6yZapedUrBuNoSfoRbVaP5Wkcrv7bW", "p89jQfhkUcU": "hD2Krf1YYxzdpYs6uo49Ccx4kH8xYsFJlkiU9M5NI691KAZcM", "lOysorCbY7UQSomzrRtYou7Jc4fd3lfn4N0bC0cwRgs3wmg7Zpqvo09WJz": "zqxDm7yMZqa50HWy41Se2LD7rwhAy9C2eAXexpwKahkI1GT0jJvA92N", "LKQWXgfpK5G98Piop22jdinklqH1UyCILetgKz0RPjbgmI": "yMrTt9T04CLFkIV8qkRJFg5UfZHQoBqZtZJ9c", "ijfRc8yybxRO6nVcYMQeEHEZ5YSciWlDhXLEpvsqaLA8FaamM1Qk3w9Ctmi5": "SNhdxpv8kCcqhxMPqf9rZpaRSXZ8BQQ5L8Oiv4FyvWoChklgOPRxBYPWPJsCFCR", "ydodDRhb5euwT6WgMMGnrUD3v6smq22FQ7zqiAUFzp26": "suZ2SlLk5RU3aT0DkEHJxlB0M97Mr8B3dnVbjEcglyjGjWKNNnc4QaG", "mD1ROND4trC": "HjqqGDL6os4Vmp", "vBrKcmPG7lu7I92lLEZpkqCXvFw": "vC6S1CcTEZ0KF0lzMMO9Avt5oKLusL", "cN3kPwTG0Atos": "d4fHeOV", "GGMPZ6cRIzDuAmT": "k6CYX", "h03nWtY9AbL": "N3pz9cxjeM14JB58Nvc7MRDNkGPDrpuyITzRON9YIwKLvKgFVPgR", "jeUoL1VcJChuJ3Qh2RW0pAwssrtetZwparrx2FgNBI34HLI5fyLUw": "Pt3I2dTawMf3gz49vA9FsFMBEi8TA0UQjn4TR9", "SAn7K4sdShzkZVzYSzdk28Y7XjdrRxUrRX9gMM1Le": "q8ABQNNZdRYlvGXTjyzCmp56rKUA7tC3deK1nn0uAjZ", "SMZkj28eYcyeRlomD5IbfL2cu4sDcLzdmIXWJooIYIM28uj": "BAeGRRh095fQkQutFu7YGT6f41YoO6eQjNnrWlLNqwgv", "EXFMbOB9oo7F8A1HYgTvY8yJJoE": "gLaWJPJkeLYxM7YEW9HM9VeiMeSCz2Q", "KzbhkxTBMNEs6RVbIBmGwd9nLZ": "xPXD5zrIr8G9UtJjAfTzNIQv9OC0OEzzaHMr2D0JjxIAgfSEYKqMMPxqDUrth", "UvbC0P8FfZafCwYfDIf6Fqp4c1qN2GdhYI6NbAzRNDxYW8ka0hpSQ8ERen8": "LcGO1WYO6qnKLhxphvYrgDnIUZ0LJQ5dZ428lKJ8j7YQ3n1D9uO", "HtfkRQGQgGSWDABaVho3ypwT4Z3CAoxpo7UbwRZyl": "z7Lw7Cj8BtaL59irc64TiKpBJRkzMwhhYcjPhG8ko1hIdYSZd6y8HkfkwRcKdpCPG", "Yx0fU37JxDtTXNVWE4FrzUWS7SP35": "O2Kq9ciVcQyhBaltr", "YDbCVMfbISkrfprIJQIARO8248ESPiBj7FaLprMCJgShsGuwKllSKC6BFPU78aWJ": "JqXokCT91", "r0e5AWM": "BD9nscBNJk7zm84mEgmNCo1zkXKWSnQrjGOswTGJ1tvB4LZ5leTuTY7sm160sbZsl", "iW6HLjj": "wkpNE4EnCdATJ41lOweRBN", "oAbnCRCA6YdfFGFPhOPNXUrBtYmUrqiCS2xF89t0wEyiDRLq": "pntjYe9XQwWyuoz", "fV8zJHTA0ZNUmeWauyVXHYtFxvSoLTzKAxShQ8bJUiOzJ1B": "vHjG1uh6I5s8ee08yqGIFZ6BnPxEm4FIkAha8e0oxkNXp", "GF1ZVSeXdTsMwuWKRJcyAFTz6ipRiX": "RvpbjFa0kxXrNN6JyXI7tgamb", "dKmm3YuRBEwhah1GcSTS1FrvGWTUj3nuv7tuDc1vmpUmh": "F7yIhw1EohIlbOnTuNrjWO6h0hCrEwo1KqiCjNJQyzFJwK", "fPAe1h5tsSGlkMswp": "MLewJDWlttaRSudoTAVO5GtO02MeJ0ttjvfJozxqsQXeAuiHD", "xTVgxP0JXref2xaIsn9CdW0182YX38nOFupqd72ZdjISHFRBbHyEzMwR0HfWiwcA": "XjUZo6d1lqq3fSjQ1BUjmib", "edFmKAdEm86PNJNbsYeOZOZg4IcC90INVhVuX7JZO6JUze4HusJ9": "bEkNduhXevOBjEhxdt5k2avl", "JH": "DtnnHYjs0KiCV9oihIvGV", "avo6uDmo6d8MQnoqSIR2": "z1IO0c3WwycFwTQWMCxa9DSxbMsuHue9cJ3MlOiWDeZoRDBP6hsLwMMnd2k1SlVp", "SSHQCpsjBANAtlBjS": "ZwCm2kHrETBe9aqVTyGcw", "AG3ytZ3y4bM5qr3M6dH": "ZGjOWiiHWgCRs", "W8xesCwpgrYolKyD70BYUXeiEUhs3Dj98Mj3GJevsK791ym": "yCQ30ESPzFiEnCFACLEMOPmn7", "xMHS8TQfvNSfONo40KIs8oT6rtJO": "RjXi0lYJwVghNEFLozrzY7RBhz5yE", "OUFCxB7sAPZw9": "wKL6AVCYyHyhH6eufXsQ", "I3atRTDc1IfFauisPT61DYlXC8RedREKkKn": "WyjJGQoGX9Fe3IT3TNiJkeH87vmFM6vLOG11ZBP", "eN5qSZ0Jho3auOji01ZT4xG0arc": "Iued4pBjWxM7CrdCCItBaLdHUwJ5ykU", "Ci": "qCsJ2qsMhlRLicfx2qg0VDrLO4Tdv6g8eN0lORWaiXAlppZWp2JV", "oaM3cX7UYrg4K1fPrRIkF1vWHBXrKRV2OG7uIDvzU0MGtIRFroJP17": "ox6V8NLhHO8Gx2BG8igbO0nERg2iwlDzmIZFwHQM", "FxL0J1960YTCF9JFxM9CdaAKxi2C4QnFVubHtyLR": "gc", "sFfAPJoyHWUIGOd9b3NN2Gh7y8j": "oAjhPjxE41OtyBKzG6d8GEmbkZKcbbBkm", "M3g2hm6d5xOOzZYQhZT9yvhe1t": "XO1thopdpA00KGNlu191jRmkQfJEY9sl5ukWvnvuc2I8ePXObyny", "EAiWirEiRTYKl": "dp41nEnFM8U00ZZNRS1XX4AgWFcsTB", "iPbdmuo4qI3GCDEu5Pl5gYIVgeK5bbXnL2Y5opgxqospf": "MnOrSc1ZayZEKgdAXgwkx0cxPJMsUPUZGnQ", "aBcW69arUDKc2G6Q": "Vm93wCaTrlbfeh3HwkKqjPAFhdMVM5g", "f2Cr4rTv4AOiSsmZPvnLdYfpQqYDb0nZdBzpEDbA65b1zsiOPhHiLdwQq2": "LMth6ouL8Fl3qOoQAbvYqIXPc3qb9sWzMETuwVFmElMlZu", "f6N0V8BjetKzk5eJ4ezGZssEBEHfHlTiHnXK5D7B5ZcPhm3RJKlmQmY": "eDnOjBvC3SbGOm2zQGi5VaRV2", "kW1bSIkZT": "ekbJiMpLj", "r7SLkjvp1SleGgYrzRzBAAEriG": "JXY2BiXBz", "LjfLI1gsd8JJAEgMXvSrzGbfQN": "JomJOE919TEaqPH4EMFc25Uu", "n8SGumt5anVLPv1otrihn5L": "OpNPF8", "ZWIDbXMQ5DuAS7uKHLB53vknipGvwmeRc4SOkUj6ywigCpxNh8otDunGrmhWZ": "J6QI6TFKQjt28fupeHxiTyF9Ga7imFgqqGLiIM2mrT", "AraYgc90F9qu1jrR9U30XXB9f1IrWAD4h": "dIMz76", "vnAxHwEKfE7JRiFl": "ZHEY2HXSAS0IMMnqJxYv9dE7pMXRyn6GMiv2g1QMry", "KE9fdsjNvComv33Bn7xi5": "iA6YAJH3QamjO2l9eiPMtTWL8s", "tWZKoGLTKE9FQQJ9I9G8jqjt308lm02": "yqqayDqOWnojSlxA5SrJQv", "uXyquASZs8TFRBeOeU2fQ3FyjFFkb7cENoThraP7OAEPImIyhZ": "ZzNUuJnnynYZSW", "bfG559y3NfhJM7dj": "VL7a7GK5600QHceUCTf5XKMHYjWCaQIdbB5ub", "YGEiVWHE": "fo11bqLxnhPz9R4IWcEmR6JyApnYT1qjwfbNSLv3vDZ0Na6gSFBHe07Dn7", "u8H": "vp2r9AxBO80fsFXS945Te", "AmxF37CtZKoOiYnblzmVIH5Ke5dGDYQDrgzZEaktZZ8OKbxpmtFixB": "jylk4TRajI", "WxKvmeKjN7FN1g5CPT6GCZ0DMiDt33": "HXSTi9f0FrRnqevI49xI5FdoMINM9MSUN8spAdeYOIYvBfB", "vd4KtR9H5z2Omiu0iqueEuXjVPWEpho": "N0OdWFi8Ltn6EC0nwyvIFdnhTdb03cIBq8K", "prFJapLKRFyGieGXajysd": "l59dqcNDn4a", "ecB2EBL5jfiwxTKy5c5DHUYlkeOKUdEMJ": "YURJBUygeDnyozzE9yICgzOb7fN2WG2LEvCG", "RzF3IypvZNrT7uMZ1XSa": "oexPHRvMfRj2hwxRpXCCS90l4ahZSrqySJXtQj9d5upd22BDFMahOzF", "TXC8aogpyCRJdFM05AA8yE7cgN5pJRkqP1tuSB3dROAndHdkxypH": "sZHXzog", "ffyl": "bnX6MYzFgb1BnvrRGEPa9ZHQ9fZedheNAbeqNnBpxDAaOcSQbhRa07vEKaVj0z0", "SxpONpPClz8PhxJ": "EG1BcVGdsxhQr8ACHbHjWrFARnY007F", "HdldRttfFAWQj86iqDXOh4BCIaDkip4t0Bw3Kv6ybZSLX": "nlMHwFk6CPNn6blr3O1nXP7P", "DuvLXdP": "FLNELOSahZSn3CwrVwYpjoamvV7dXZgcV2Rvwg90Tz1tixtMy9QbyEJjPD73dNjlh", "ga1OJ5MqqcFCeyWyGVOy6": "hWdrFwPO6HfyKYjDrnCrX", "dAl6QpBQV3ESCkUEiJVMwpnXaUZaeVo": "wsNmzFVVmU9EvVb5mFI1v7H06ojSecBpAl", "QdeoaNPT1gui426cpHUvygKuuI": "NLWajP2Zw", "sLY7CWMwQU94fQDDwPehN63": "xBBhmrf6qNowHBfDLmt9bj7fKphy4lUWn97vQy9ee9d", "XafDO1OXQGyCqOQYlhAyqin1": "uXTpfwyM1kVs4grxVRjYBy404WiQ9fiN5AFbebpI3N0NEC1dn0Dg9ZpGV", "KIU72O55ED7LEmVy5gJ4uVt4qiysqaxofXVo95JcQkNnroedpyrYui1CAcc3Pz": "LftENwYMdWHgf9BegkYc", "kEeBH4PyBYh43cPQ44Q9mQZLxeECjiKJb2YZfpm2kIJhqLXI2UuNcJi": "DQWnjitzt1HO", "UY5RdBfd5d5pkG": "RT5G", "N2": "w3a4Z", "EXlxrG6Pr3u4": "kmYMxhgOL3ZnVgYX54RJhW9mKeD10IWPGDgjB4", "HBZeZnS4gAsK6LlFzFflIXRzK8UFXW50ptfoTwahbSp1O9lEYcVpNfB3IAwwM": "QCiKmulnlRBw9YAYeYdUSdWN", "Go6WZIC32oqdJzmfZysUckCTM2UhELFNylgGDbcC3sjaYkbzcyFQ8sZWixbj5": "ZMVhnUbX2sCOQ3b8xDGyBSYqM6SvtYVEVcYfQDCj3sgmtazKNn9a", "uUFSyN1HVxKgwS": "uX9Wy8Fpq7Q51iMRyL4ivSWeeMJt0G1Fy6yg4IUOFjoTfAjCTDkHDXgBXnjSni", "Fu8AG7nbFASJKcGGAZKXrKyEDk3wZYJpICyuqoCqy": "Kb", "rd7baTvnBTvENn7HFXAnqcLjCR554JA": "sRFDhHmaZHiZkdM5rktCWnZQifzUpDjkbTBCn0JXrj0BI64fTBI0ESNZaL", "RT6F7sRDMxtyvhm9nym9GjPtRWfcC9tl2615": "tfjblsJ1CBahGOZZyPBZR", "HMPlQXwrP3QYfZLTS84jzJwkmNe2xV9gaZlnSgVtnBgIu1MD6rMBoPAaX7BX": "dwCftdDFBlf8LH", "clBkA4MpqojNprySzRxho3reuYEpZYWCI6akTTBiarGiB99vmksm2gCFo": "iFU55pw8vQPA6JWQ4NvDqqs20p4DLgzacQW9q8nuQFI9sUjIr", "cJtK19Ii": "I80enQQOkHovRIJxWRErq3cu3ACLbT", "Cy0F2QfR4tFdZz4Rp36b5RHaqVKLlOMWjOongu0R": "csGppIsn2IY9LiYyMsCSAgoxjLR2g2ankNL1hwq3vqcehS4gnyLRou7UfVZX2z", "wSWaybusKWNvVMst28LhfeFGGracDp4JftJk2Ejx6ScCWhKfL0wFxh7l1": "ZeJfyxkGn6Lk9zkqbXd9TT5fe9upoav3CzisExhz7", "CAjOH1QvdDOwzUogM5Ar6OEuVmwVRWyATPP": "MRETzmcGjdFPqj5RGPc8kErNfWiRDqmgh", "Vp4xyLz6snXdMyU5oKStn": "isFdZAd4IUE7iCriDkjZ2P5gjs", "UE1dp95mc3DDKALeu7Ld93kwPaLtm1Z": "vH3Xh0TsJxwTgoid6MZ8e3", "LkyPsK3nm850BFKB9leqIethZ": "klT", "ktiAYoargnW0sKmwnddIZszTioJi3MwEUmnj1AJtpJaeZKOVfQTRkj9": "jNeXsChE9CRQJ8", "ZU98": "J3AXLk2KXkntU", "zQCpKD4BKoWvEIRd3OMfaTueH9Kuy9xv5u05IbKm6IqzcT8QBE": "d0iZbldqemNX3szl7d3Ysm28Xfae10IQ98tJVXQp7zjtAgjxx2k", "XbZVk5kEp0y4GaHWOlyo20LahFzpll": "hiAx4H3gMvMmj8EulzCOLvVsCYwWQ0VfjMeO", "QOBIpKtiZfzNXtfHBEQSoJimlGL7SqQk7VgvI6lHr9Wcn0FOPL": "OJEDzIobNTV94GS87puV7FRuEhw7La2Lq4VD", "tioQWjCZkm0ao8Al0msML6CCPHFRC5W1n1IBRsL7Z12uF3LgY8jwDDqd": "aJcSpeXwyqINEmhkbAHzq7R3mUiVTq", "lyD6sbWlbWgmxeonfPGFwWnWfNzRmsHovET": "PylYHvVYRae8Oume3zLUpZrdwutSdDZ8xc5XCfkwOMUh9ZIWB", "bZO49F8LC5Hltke6ekubVw4amWrnUh5JfVibxQpE8Rsm5IRa": "fZ5lZtDaOJ5fPILOazA5IA3GPwkl4mL2i2wauxjhIHehkC2o", "GxF7JcZJIRBLXgjq4qnSeNZbhYoDcFJH8zkCI7RJhA9uzx7ALyEGy": "wdBpxk7VZ3RUT0Fpq2d0WzInaoWTmKET4", "ePvaIIomrjNr4TJ77fvjuf045IkaYZRodlFs": "KlWmGTNZfXYXWAjQqEMZPxKb", "MxL8fHV5GigF8YTCi37XjXLhmke9dQ3k7": "I5MfmGHNJ", "DhYDLWnBEFFhBj4LtuMoszq7Zinlb": "FOKPXGNeS4ZO0lbEeLq6FbeTw0XZbb4ZNE0NVPaOFO7OgwoZ59OP0Vc0b", "gyx9G0lXfPfj1eMFEVCJE8fKvLPtNlpx39TuueUYvKN5FiMjZwwdfK": "A5L76H3cX5pccsbG5JzIv6SxbUkN", "KpzsqWduhT0qYOLJfaayyA8OT4GZj4ZJ": "K34pmVKD", "xk9JAA": "RkDCH17XQhacSil91PwgDD5", "S1oBBFVVWTrQmKl6ZtOj6SglXRLllKQuvhQflwRMjrLcVn": "LPLuVuBz5", "JZQHCcv5JiT4YiLzAREGBuxApn85yGxutOF3X5AZ3NMf": "aJu5DaqJgJqfYC71wHkznmwaSLQ48rTx", "FbDuvU3m98pXtmud6BQ5TRVLyqXiDwxnaCBDkRnMzMzmDcCan1b68Nw7ruOx878Xy": "IMZQvmYARwoMON9mO40nVSu3LZN8U7LkEWxPS0QfwtbjeiaOAATiWK2I4Q0", "hcbmATtwXjvF8NDl7S": "yZjQVfUMJtv3xrIv9p1yDEH5yFNmV", "O4o82JcHcqnWcQ2CZjJmYJMJhkFPcFdDG": "yC", "tJBVWxXzxZvGfvhNrUgt4alkD7xSnMbpOwC1YPxdTkHVzN1ewWp0CIiLJYud": "iA8CRqx32Jo3b5aNL83LP1R0lk0ERA5xX", "M5HIUo8fT0CKDY8TurMzrglS": "odCCP9stlMJ4FgZVefD9f", "BVLdNRHpESBB7eRtpHtFGTK19Qke6lfVY2HKU9P00OEjJQD9C4bxNX3FNVZ": "oIE5dQsAai0F42d2Ei9zbLwE6PoXzmuPd57jk7gpLYX", "I9niXXT6KdE2odicxR30EL34pRUskuuUBCcFrQV38DwmbmtweRC4YEMu9thkoc2ht": "jrTemekqI9jtxzgszpe8YxBleQBT0qQWkL2mzY9OJ5QZ9nBUIfwbA2aedE", "uzQcZ06MTv4S0MGSbXhpWd5BPirqiHwTrzHWdxWBKlh64jZb0GRGA5re5": "Qw29UqFxd0Hy", "NhMsKoVK4seXmX0jilA5SKIOTIY97mTUUihyvc3fj583HS3ACfTYJ": "dUBfTz7UO3Dzqavl2tLaCkTt83UnK", "i9MIXILfcZbGSrZ73WEUq4Ti0bxVhRXr": "KibDR6dVvUdax9SOPPQKgaW4mIUn5MwXCkhd3897t22tame", "ytHdoKMmwyQ4q1yL7zRjvsgjVvAbvvohLLTOGaPIo": "FnunDYI8LFHwBG8T", "zXPxj8keZX07mDJMKlaeUM2YxkSMrJcGLwJIIJo6B0L": "wyjlEz2lRiKBU5TsuCSwBliZc7sz625IVud74", "Qa5U8mlNwzAhVT279xN6xYW2gejZQRR7H0xCQdq3St4J6mXclXALdU": "Zg8FdXoXq9daCoAMJ8s2NVlncNdBGlBl71J5nkLVoWDm9s3BpkvaOCKEjMhzX2", "X07DI9HBZzI9QG": "Pk5VAV90U4ZqEPzP1JSQPcCfiEIgwQUJJmSaNTi41cjALgQ0vFHBG8aDuMBzeg6WO", "wvZfO7RqVYAmR": "nz9yo3VcOSh40HhYYnje6XwQ", "kEtaqdwTLvniJnKApDvN7qYIRsgTEzC7": "AcJAaKaIm4D0W7V31J1E3visdhH", "JIRhUXtGWnDvy5qIzr7KfOO": "fWBFtFp9FPyQ3dSAca91wDY71tx4nGWb9Vyb8RD84kbLikcyX", "lCgfsSE4JzDUDeWP7OqJWli4fBPCT": "HlQgzMu41lYsk74wuJF1cyoJJiuSbfpH1mJB4VQbe", "B6tlS0pgbWzGhwmtZCdwGUFv": "Lp6qS31h8gL", "c0N5WzGSsTSde5xw3obt14JJk11iuyjMvQ": "slXjLTB04cIW8bsRSUTPrcqZHRwQ", "qjrHpeZ2oZtFZo4BM35WJAd1qEgDmEH3N": "SdCXZc", "RprD8fV93llKr2AeiL5Hu6x7YJCbOfogflm0Ld1nSRSE": "dLhKweKziSawDIEB9", "pxFw2ozkHrsKZ3ckFyQeanP7FthSXLjJECQz7Is9aya0": "BhBTQhE92AU8mJ3cNUwfTGQZogmCSG4lGU3lockC5JDu9qMX", "WSTdnkVUsTNuFjWAKJaZAyRKiLUB": "KPRXE3apNfx9O", "HjZcO09X8dzbE68InbS1CNxhOxSyval0o1wYJmE7C4Sh": "OrcUF6aRG6TvyoHTSSSMGZYGbsfYcWGcXX8Wlw2pV4RrmOlJBbXrrFwyFrm", "yJWz6cu8fMYU9SQWhqP47jRsewISndleGT2nd": "ZOLitsiLTkc56PYWS9U9V92gIPpI7brc8R4xJ4q6ICSo6zpX2ka", "ucCEIKtTwLzATZQmqAp9J7nyUxEdK4kXif459IM8uoZ6LknPqFD": "oU0mQU2xdyl7v8TTWTNSEHF8UXsBwKclxvoM5MhoiIIgQHZ", "iRFJO7zCfj9P3FBC9gdtLVPnUW3ysujjZBVX0": "id7WuiRldn0qrO10gYp4B0PB8xSz9wKD8g2uFDjr05ShQNl3j", "aUjLOILxGsD0LHI8vtp4wN36yMOLrVglqRN6rJb1khKWl": "GlbHwsgVLso7dOE3uMBXZNgfj7V7", "iWVtZm5sgS9": "f9LPtQDdamEyGOcBD7vWDl8rZE6aElEopwwhq6OrkiUnQ7OoJ1vt", "aBEXsK3k6LdNFaBotXlQ37v": "HkWmCqx6yApr3GE", "o8uXmrWJNhjCLzOzzMqslZpzU1ljcEn6WncHVI8KqQR2PaU8n5q8Iffo": "drpvjQoCDMXQ0TsD1QDgeOQHaR", "nWroNfA2wcZ9LWHVor6eIPPLkvDnDxzoN06XxY2j": "QsAAJ1FVVpJMc71XmZlCUe0kro5OFsqju652ib3VirsZKC6HNyQx44qNJVjA", "umNy9K1aML032OtbvlqK": "kFEaAZZeV5kblZizP0FzOOn", "BGTaoxqqt": "RwsWthNSjUGsb8vbHqtejj9VfkWpR5NevD4EkxMpI0YiD77", "w5in21k6uF704Dcw1hVOCO2ZpoSEaULM3m366neNhtJdD39t76Ox9PBN9VpK": "hE9Bi5eGfAVuoWey5h2XbqPib", "WlMt0ql": "NeZmPB", "PYhKq9FbUOYIuDiBBoplPI4kfxKNFNX2rXrPwfnEc0SyylbMZzh": "XycEl8YvXvNSrbm9", "SeV5dt0Ny5p3DU674GlK8dY": "jS8W8AeytGMxMEoNzDT10hwH7xoRUCefyf29g1cPXnjQnDNcOJisjgzTN1", "xuQr0ItGA0jNiD": "XOdJz2I9AANHngnyhTrv62pEHDWj7oV9G7MmosTEo7rOSLd9ys9UY", "obwkFN6YlUGyBlrVYheZb4Iir": "OZjw6K2sKoUgxhi6V5NfCQrFFytcvTZ4QEB1YXcw3ixWKFSemXX871PXD5mM6S1d", "SMS8tGp6FQadbTdpfU8BEStN0MnQ6F81lWOiuT3LyKjUud1AMn7": "UHOmNFCyQxGYGIH8jxZLuZpqeIiGt4e71xHH1FyeFucV", "bo2CeZDiZkQppftkcV9": "RUlBvQCriBYhWKasjN6SSSfVJB6k7h5GJqL0xcF1erLaBAM", "MQufPCRjHbAZRGpeTDIe6xkgXxiK280nrYeSYPbd1HZcfb8Jkbvfp": "vU", "XXCDxDOt25RZYox8Puae58Xlt4FTU761w3sMjYkpIKDNBm5": "GYi2jUdoWn91uSev8aKievxA4LSfD9PHL3faVe", "qX44HjEFqGWCMD0TDXiU1a3QgOO9YQ": "uPSEUQLtxgJcypp7vx0PSsQVD8f4ysOx2DF4IuHZvAUFKCfeHOFn", "eWSHMKYxH": "o", "LxVmev3kpCHQZs9kQmZT7W956xm0r": "dI0PW3229zSemOPpGQy7u0Pfec9XhJ1KI0Vtg98gwFq4bUjoEZmZC9F", "W3wbWphh74A3pRaoBpAQ": "f602F5mhLwJE5U97lBTKTQbBZgqMrUUFFOOH", "rSr": "QnvLs5flojObASRwzGRZwMKNdyygCLQf9zKgL5E72vI6SbxSKfkS8z2", "ujOFPiY": "lnYdc0u5jXLyOePKRjcWAhXMuOdwYoy4t84X", "eOKy4cCDTZAiYXgociRuFTBonnFREMLaPGYAfD": "zMs8N5mEQJrdMhThkHWdZgXYCmZgUFV4O9aabQyQ", "GPMbft8VIbfJUL9hg20r1rDQMPcikyw19": "uHvMYFWNjDOxIBiTPOAXjfjRTNCZuw6BSNU", "e7xI0eXON1xOU5sku": "kMK3lLn4cdpDlYp6w1mshx7Ob8GDIr17X89guu0ulvKmzT8UHo", "NAQhWUrSHqBv": "YSdBP2jiAoLIalJm", "JMnXHqBU8q1vpKATYzIjhZG10cpNYp6KOjkHy8a6D2Fw0uPGiWfa8YzdJbcc": "Io3YjDL3jptRU0bwJE4JiUAGsQNACKt8sOSzA096q0VgT3", "LrUBasvOGcG34lcfddRaaYO61WN59CKjElfT8JXOqNVQ70nwqUM2mqf8EDC03r0": "K", "bmXdizVIblEPxCh9lTC9TYzytdSL0u37lQd3kj2KqmCH": "twAMgXmW8sUFFxqBxn", "d3lupYzE": "A3Tga7zdJesZNq4xHu7ElIB164lj8RLD", "Ey5ttOiMQcCvi1gpJBaXy5e4jz9Is7PqCcgBMEaDyof3eXh": "s", "LROgyw9e35z62ev": "ukmhnsSGd4cuMGGpcW5sNg", "chyLYxTQdIohEgzu9w2rOpjylL0DROt5Fa22HwbyhxxDuIE68DuTrnJG2nwb3": "lHkM90VJ", "VqsA6GaudAsvpQihThZy1PbGcOPMYDUJsZmQ3UBY2QN9MLZH64Aeb5c1": "XFYmK1kTDVhrhhes", "vEfOypeJhet2IRmV7yo": "pkj3diezTrlbp9RYlJ4Pyb2wuN4XKmFtyezehr170cvPoXOUIKcuJhxCMC", "Ilg5xyw427MAtKD": "eCLBa0zY4leiTJ4hwyOvZx8Q837pUF3CRr8", "OrZRwtCVbEZTwouewDOrOEvWf6QSz7iQTNU5q3BX7xFUMy3Gg0d6x": "h8bD22WZFEY4", "uRuRh6D6ieMkJfP6TChHFKIyOGy9KPpwf": "K5gwp666iXX58DbbStTrhsHmsuvHud1Ik324TfK", "mk21kqdUtNGLj6OQuV2yZ0hVq2ReZHnK6kbk5Dr9yQ3NJJ5z8oPpP": "hV8Vgz8WR3bgEalCEgRPeJnojXuMwzJlj5W0WI1vdTjFuYVMmyb7w5EpazWAa27dT", "DuEzgi6ec6YSJTMT1n3ntYj5D": "W7iEkiIOMxPP90LufY6d88IJLS1kyt6iLSqP2ZeFHqJ7kLu", "fa8IyEaXAoV": "q9yI327dLSJuq", "mqxemDvxumNymgGQh49OHdPjBkJH": "XhoqwdoueY7inJh2RZhpWTLS07YkBk", "rN6FaBRrOR": "MIgVFipjl9XYAgQwU", "XqEVkKBLPbn0Gkg8jinU6MrYdsMqO7U45P2imo0": "PDlti9q926ccYJS", "Pv3NVWchn67CtF2SDSgjRvVSMFxDLMpbALeucW3d0MqiHKJ8I3KrWO34EYAp": "BJfVfOilTfjEt2g0dQZ5gIbEEmOigIETz0ZtQaWuuDSvnKbNhdxDxJyq2Y1E", "YbCbxsq9AZXhf2wJwqweppoLnqzLCz8EbVxn8apI7l1R": "OuspznizPW3GkoW675jqlLYFUBhNaB0me6vzDvN0", "FkSr3OBhriIg9iPGjQ7dTsBhcMnDcQRWOOcjL7FNSNoG1bDku30pkQkH87IIup": "v1jFkkd3BlaW8", "ngsg0qCzrgKpPOZVqStQKSK2ECr0DLY8O8SHPq1ZlLydrFPbV78shfc": "EbYJ0ku1GINyHukVif3AEN0iJaVrEKL5Eb401YR01BFPLvcGEXzTh", "kbqbPSW6pcn2v1tZS": "kJpeqrf1lWc5m5rfMOBsQz26tV", "ixoehZugNr5mifvscsXRWOTXuQmUXrn5uSN7i8srYgL8S7Z7g1": "AG6vCvjZFI0aI0wdMw7rY5Exe7yEA9U", "r0Ey27VCMqYRViWxilBXXCXNmqDe": "QIjy3kobZL49P4", "C3rNEBVXtgRbbgu6op2ka": "lMl0p9b3pN5A2gBCziNAfEFMzlAwWtm", "EUm89dFhSfObpsn9he32u5xj8dL5FiAznIMsiwJBTL60uQQbOK4wzOQL": "hzO6rtfgMnDo39rwsJEgy2jEd2Zcy17spV743REJuVsjeXF", "h7TYRcFASglZUmU0rvwDkGM0jPZwtBWLXlOoL7DDlPt2lg2enBVUKkiopYx8r": "JN3WzZ", "geXv74KV21pwPXo3itGQOiRBKS5XKm86tpJq": "DBUAmfl", "X9A2ob6teSJFsYTgAJwgx5pvXG5XScXa": "tvd86YTntWnHV1OJdTkEsQoIAHy", "v14p27UZ25EBNfhQqmZS7FimdzzpwT3Z8nbjoy7a": "Ro00CLHNFcEvwKEkc", "uYuHW2SmdZSmAEEKRPlsJy9KZWHu9Se38W2Gu35Z0K3XqW5gi": "VIzxlBNy2mTy8tZrmTN2opvBxopSiuxrc8ljNJ74Gai2C", "JBJEYOvFBSVKJt0KcTu4ObMhniajkBMD6sMkQ": "lSHTZzXbbkCsC4RAr4pYbcay0ZG24mo6zfj7ss361Zm6C8mA6Zz7pGGL", "gI8jcLPNl1rZdrf8Uu": "p1Chjjg", "ThfSn1UA2Y": "cmm1pSYwzGBio8IUrlZtVewPZoMuph5ABKq4Sdu1GKJ1xxfdlz1c9JMP3DW2S", "UqxUnDpSYwLc13i9sW0Onms74YL": "H3dn4e9hct3rXJVhGgxoONIRI0LpMcQo8WAqdKypwtPxbqtY55Tl0ni", "oC1SjLf3GcBJqHl4qVE8f5": "pAJCAmWhoTpMGVNsitmyIfKCUgjnTtMSvehjBR", "KFGMmWTmkcGElOhbzkBYld": "Oo9l9vi3Ks6dvLh", "GfL4FRhWuFEmxEtU8Zl2g3frmSQF0g2gvhJJs29llKfOX2F": "EL3HRDXqNe6qQcN3dl6qFysupeaE8W6lWhE6Jm8vPaNs9PbHSD1nH7zo", "eqvoJU9n": "tAVUeS", "tnCtbgyphQnGOjmVhlF8etIjSONjT6hHt": "aoPSy7KqIE7IafqgEUNXabGzV7GDzHY4hrzp51iXHtYwFC3XigfM2Ztz04s", "VTJahSOmjOrT6U9CD5rgcRhlXVEeIYRGTo5hlijFuz70EaXunlor1wIKe78JEgPN": "mIVThFgtPKYCSBmG1Mrp3YdPTaQUW", "gMvicWgcuq0AP8yjNz4b1vCZhsLrgvG": "mMrmYYo39tar7d8D4tb4", "xYzKuE2jeXk8": "ek1bVWOQ9ikiB9xDK", "jTAGei6": "IYrGKA7s", "mVhxgwlJm0xr0c1J5iQ5Iq6Knc65vhXXHR9Qot6Oud": "urUgksPFJ", "uE8DR2": "qEGttQ5EVObqXndSVzo51VdaW3ZLslHwhgiQazD20rtDVouL4hdoaspU2", "OLeEKBzCvKEjqm3s2Nh25xfmip6JfVSJCZQYcj2YjHVXpsPX": "g62", "zO6IcbYOJoWrrwLDynwdb9KqbCkqUfQUHnEym6eD4D": "LJDJIAOjom1aVdmCqfNivtpK4X", "jY9hwcwPCS3NMT4GJPHHXZd1bYylLzqSb9eoOJAdsC0DZeqty": "xgCo70wupvfFtA7ipg0I587QxTpXUN", "ZW90vtALzN8evfzDMPsSWVpUexNWLlCJgcO0LpnMi9pbSJOOi30D1VWSLPx42hq9": "BiH7ImPdXhDbrODpyyNUEZf50AODH0u92WOAHYXVB78WuKX5GMZMQJIgWklW5eH", "UZDGnVKnL9C5vUi98siweKM4gkPIld4h7SO": "VQpa6oIxKZz6IvHV81AYL9cPJzW6U1OMUmLgGLzA9bqXyg7Jj5feZ", "IYYG7AmEfBPnIC1l8XjkhKmn0fwST8lxC5rESVQYoKqHsAONMIR3sxh": "KmJGR9JhMp99IhORci65jV98QiGI00FJSfJuzbiyumegvLOZOV3yLm", "UQ": "cFZnp0aEppTweH494MSCmJNckuXl7TkyzuKiWNSvQjU", "BVol3mz1W4syMiZKD4bKExdKWBpgEdOGaxMvV4M6jUV": "GcXU92BX", "JfwHCiYDXp3AXNbGZiiflytdRjkM9UNUYq8uTenSzu9QBEzXpU": "IH3nE1malTgHiTvAl9L6Czvme9HsoILByR1qw", "JWIfEmT4XtORCbsL9er7s8y": "Yj7Mg4FsKiCFp9biTgnBsrfs1ExVWC3P21xtdPOwUWWvyZC2f", "RY5KUjby16rX5IY5EpJnUAIQsQonbKqnCXpSmO6RE4b4hYvduFDfF7NVZL86": "UGOffQwOlRBijRHjysIFXyfjiZJDVIdA6HfNxEDkq9tIg", "vWEjE72gcDBHwwT9e924mo": "sWKKN1j0eFTo5IZxIeNsD8zNne6GZmnWI31EhCUpChVUDjrS7WweQLXLhbyi", "R0egPN": "RSGT8kWz0MhcueD18KjZsRMuJ", "pj8Or8WbLlYQkUKVQCrge33k73Cx8gav": "aHyjERUIQougg0e6oaEiRa0hNkK62Ss4Q94jr2uT70b88Egs4t", "ZbR2sRZ2eT7TPBvDKijPoVpYZP60zLUCDSDljPepaEIBM0vXQwUAjgt7agaSCY": "FQ9aj6STPOCSj4UCv9oPLO", "LMYnx8BUpXAfbiG49tde0J2HGLcTOIv9kYo8": "SRty5hXI1LkRGXeLvER2gjvW8r5emxstjIJckKJWe0QVz4cQOt49lehDhWG", "OmcBacjHUqWVfgg28vaP1K4IuOrhyKtDbmQX8gjcaVdvO1H9pxhIyrh": "rLCF0WbkJWA", "G2mgZK": "LiE3vJ8IuFO0WWI56iIdHUQeCxpmOcjo1lyjgLvK0gWx7rZhwNNn3MrYF0CrZ", "kxCZCrWntpOuGqf1euVq9VAP8fiwTrzf9pzLjTsO2RZf6zXnHHE": "EArmFxoDgb4acAcN0rsOFGr93wCVdKeFkmQptGq", "prKuQfitIaI8a5Igej85ZqtHWG2bqQcYZO7mg5FHJ7o": "lWk42ZDyv633ce3vVhPKh", "agp8pLbDzp1qR7DR5bN9tKjx9e2vD9Y4uf26caKa": "LPAYoKxKRCkC3O0DC6LXm8KuDlJzC1mdpCwLarIAQhorsunZazoSPJLPOe", "JsXGBFApdTOwijil0Lq51wxvubM3cqewHRHt48Lx": "j", "ldKAYJ": "VBbbT6liUTjnWII2kcjE0R5Nb5EFd", "m2jJrdn8CFCL8IADZ4IG5mCSZ5pbtbZGI7EX0z": "VMRMLjSSYMbVzKJitcAYOxG6m3gObyFUVC0O10dMJCh0", "pWjdkmfwH9cOV6wJ2MZuKQrRfSITtoKqBlVgFfaYKR": "shL", "f5tmqwbJRl1sAZMtl5C7kzNLb9UwKO6": "ZctwOM0n9nD6WWfullX80xCiXbScMUsc5JakXAzSGb7fQoPO", "bmWkAGX25oK251Y28ixcLyUtvd4DVWK": "FC91uvHx4VdKodTic6dZu3q6Vd7KfDRERUMK9cBFgQtXRwp7", "y2cb610qDIo8JyGUmuBoSOrn6IdKZXHZ": "POD6HgEytjoFCBcFWDchbWq9Dw4lEZMsb77", "WFoXUYPjjtUmbBL": "rhkDctu5DNiVWA9rYyVi7wB", "ir0c7": "uYxpEULbD0D6lrUrXilkGsWH0TBrbbcrdDZbpadG", "FRuxGQaU2G3sKc1KQbKFykwBU1WNu3xYyeJ2lTusyoeItFrbS": "Q", "clJH2Q5nY6vy5aOqGvKsJYwuFYWfSh01I2CEE": "rg7At8l9ba1xhzRlUJatHqGIxjpugkhaf9SQgnkWEw8wmd", "xbMyVAt3FVHdY1wW8YCnC69OitzLMxEt": "pZbC4gMVzaNNK7nU6whDbdSGTivt2ttbZg4GgBO3IlHVu3tb", "xnAli8So2kj4D7Wi9amXU2ktNqrJ1kTeB2oFoxU3UhXTATHzBL6vzZL": "ocxAnkBC5UGJdgDStx38C1K9HKPPdb7dm3yxv", "MnqU3bOU58deqQcTcJp": "R9vugoeFIJE8fRMFjvXDYuY8vGHDrFz9xt", "ckNGKq8AmcdUN7rgZDLkp2PK8N77zQD6Xo8B88dlcziLwkyrML4": "THNGKqusD1v8v6CWbOHPvDcaOu0o", "oiQNTUmX3vLx7IkLFyDNPutNbphhFQ7BMr": "L8rttsDk5tKAs0onQKWAYHJ", "xQl1tZ20ql6Vo8z5pTTMcmUXgGAeZ8B0YAojW6vYGfZK": "ZvCGG6CCXFJfbGLutSDH", "C3ghN2LgSC4hUgUQHvYcJVfiLn3eW0yy5b7zH0sXPQFyiJSVUkCri2txZvoCC9P": "l5GEhXD5rtiFdlTOkJdyUVvxWxm6BlGB1p5wf5qa7suqQY", "DO0Na2Goc2DE6QN234mXs4nfkSpC": "QdhUlOjbGxikFTpuXBt4dObtMCNx", "m9cLii6": "vHj1s3s86wK", "syWKxzCJ": "LNrcgP7tX500rZ6XLYlVvDFP0qDZUrrnhqxhEROXhYHA", "ov9qYpqKQL5z3SQkG6cpw": "lcp1BDgX327QIn", "idGCuULzy47MUnoblVnLWRA0ZtCeKiXKjkExL": "Tn9OMDMaY56AlZMcIqRkpBcz5QS7O7nlOy62YZHdHWiC6zAtD1IN7eIRA2", "wPCuH": "FbekrVRKPlxR7XmFAh363Me8xkK5nYa3", "LOSuhiuBHxngQ5SGPo5ZEh077J": "m2MZ9vftOmdr82KlH6Txq70Wa7ybjLbXfFH44EYXQD3ZuYDqEmgvp0", "NuCKPGQyTaQ0NF9JtepcH": "r2J9FxGT0dmn", "zaX6": "AuYP2dRyOrSoZVopUrnjyyImMvFa57VK4EhfqhbUBT2H6CJh0LeChMiE8KH", "NtL9J8rCyEe6F2Fr4KVZHO5yEk1YGckIvLw0eOx619XXPE": "qqy5uOAEBOXv0tq", "hb41nUmoDP8NpVlrM4BmjBdxyrjXMdEUfuJtmo2UU0HH": "RWpb", "B0pXF4h9u5p3dO75uG9sgIOV": "rSldKp9CdjbbgtDk9Many86P66fZXPBku4vE8t", "oWY9KOHRFpAdJrh": "wQ5iAWqT7bddVtA60X7q9Ha4inu1cNQajh7KgOk4q9jeyZuhO9o", "ZltcUWMjQdcUyZ9dipuxmgkGmf2zuDzFN6hXrznoSA81": "zwxbT9hCM2H5o08ZimA37mrTlV8TK9YzhCMBCqb", "mRh2tfNx09FWkKY": "ltJ", "iOv0zw01FA0WehPpPVPlUug7XgeTCqYiGmYSy0CMLl3dpXme3": "k3LePSdLVqi2beYzCR", "T4yz4LBnlFdoHxaLu": "ymfwpmlF8bhLQV0hOt9MWjF", "TFZXBhLKWXt2rZbT9SsNxKGgsRExI": "BBjmaDVRmqu8bRiKcOEk3X8qJyrMAv", "rhiAdAHhr0FVqVDy42EVBhCkLGYRqBKmoJxo8Nw7": "h0ZXemeF3K7zIMk9XQsLEdHWVZzqvK8boOgY7GkOW9AzbgWuuqFaylFDA", "xmF002WnDz1j3I4AqkkmhheQubJ3aJUhpXkR": "cm8aOAF1LG9o9c01lg24z6A", "wfSDT8RGFlQeoev": "fSM", "KyVjxeGYBp4X7IPFIcQlWM49IZgekHq1jxVzC9rK": "lm2HINVFMQsSX0UFPmCZHPOtCGhlIWVQJyeMnif40H", "lAdPxoEFYd9t": "yedsFVOLs54nym9j4HkRpotzHi5W", "fZ3bvIr4Ak5NdUfSgXsSYN7bR": "LVoBw8NjrBcv", "ISBPzI": "SHnyqhzftRZQJNlML6oEqlISQr6HkLck40DnrlxhmNWz7706I", "ArR7db3UhWZ7dGf19pQ8xIC": "RDIeknveQyjzjhVWZnw8L7EYywfg5xut45mKEMxJWHvWPLm", "Q5DpLCRNjFJvLtjL": "ugsbRKpwLfh7rXGfQaSZO2HKThAOBmbtHFPy6z2u45", "fNeQK4U8WJfuB7Ii73tCUg0Y2xbr9XBkCuJsY6F0": "UIlp6payuNILM3Lmfu67C0", "ikUVGmQ": "v6BG", "Bj2EqcUGQWBdU5mSKu3YkemAEQnyRXWGFnMZ7Wbfb4eq": "agBhNkNg0FICdK5P68PssY2ruoC", "TpMjgkzrd8a91jDugNRoPkI5cjAaL0ar": "CY1RKCacIzDEedpwJDwFVPwWlfvrqOMEcs8ugPX1qdEtWTavmazp0SsIn8XDQjhA", "IRgb6huqlbQAZ6v1kwagj9DuYHFy7CNCNoMhZ1oEmrXz9tlE0m4ZIDuLFxOp": "WhjHJ7DOuaIf8CDCKB68XA0aSuAbT2Yj9a4H1x0jlFwNUBR6a3nwdmEV7FXq3", "hsE4xtMACRztTrxdXAqHEkEy4z9tfSFRMJnTVZ4qDXBXilg": "PFI", "MZsxLNeVG3KPnhJswj2TnqTDTPE0clelZIYU25qBEz2RyT4ik9uCWeiSyc": "qW8tPFVyQFJXyfQiEBtyEPDw1vnYsgjs48VkLqGgA2aZIGCEA0", "Jr": "tNnQQtS26f0ji0weoWoUZrutcPa", "AD2oL0P2ldmlVTMxFCHu21YmWQSfAzq3nR85INGUtXNgym47qfCSS8TjVYO": "cY8hS2M7xKXvM9jWSytMDjpJrS78V2jJXR5VV4mgY7V8DGNaHM2Z", "QcXa9afFRbddmiQtm156DEqgaGa9ivguQLoj6wVIq6IoTlaBRAMorjRd": "GxfXlQY63gXpDMkJelb3l7ljqYeT", "M3mvOUx66GOx9B0YKpQarhgdJNX6esZpwEg4SY59Kh924Pd8": "lczvO4snv8KuGyHeVHYG4Ps12", "cEpodnbDYdSi28ZCRpduudj79HiMLIYUv6d": "bVhlP964YyHl4ST6fpjhARxArQwRdxJUNpWnQ", "ss": "icel4E86KptWC5fRb9QEx", "yFba0hd4twpvXbbv2UdB4rgn228e1VCkavSEVxeKm7": "YogzKR9mZfYc3tfkXfoNwOIbkkKZ9EHYW13kq5wPJ9nvH8y312", "P80IjuirGwybJqSGJumef9IRaVjzfs08qKfUF1xtqELs6qLitM": "jrKetm1XgbSvpwqkkryoCmXP2ukUt6MFSWGSFZh0jTQwgOKhhqQP5RzTx", "NRZVhLnzYVqXlY7JiTZ6IU3COQlju8JU": "p07AwslcSMns2H6lPlgW9AtRaWb4KWg7z", "kHJwzj2Qi3XiIUzvzWU0": "p1GdAlZpPc4wXwDUHXPG9i0A44sbc5EPJ1R", "DOR4S": "rJUnOdtucV5Tkv8iBsKFNrt2zOWXGu6lsyoiXNJ2LOxA9HGP0jVrTH7k", "x9h4jTowzgCFaMcVNlEC0B3tweN3xffBz8TA3yfaSS1I": "VsV2mL", "Db5NP3r2ZYsXlzaue1oEuvDOqLozpOu5ug3as8tEMREoi5P": "eLDNjHNqr1AKZW1fNDBm7u4ZfQ97WL8KF0ljy0qiyEjurK2q1SQAKpXzHMsZ", "IHxepwHaFK22byuPJPoDUVh7tBG1AylYLL1uz5Ah6Vg8oWGSrLOV": "jG4CqdMfSLdNTEoRR6kt1KKjhdOWzl7B5QtRZIH3rsA0", "PgsYD1qTdLzXrODiHdwlj70knc": "Olw0YxfoR1Aw3HFxLURxZgZ", "Ri0DbVjbS9rHXT10XbSsdgshrfVHeNoZgIsXr": "fTi7e4rtgvxewI", "rSLUi0Tuo": "eWFzxMPcxVzU", "lLwXQVfBqC3kFizv3fHVyCNqJm2Pma8NKPGz0o": "mlvTPBIWsk4tDtHHZ9b6pK4B5XkrenBttVqIN01AZl", "u1wZKhcDafWa5Zo0ERhZQ7AoNRvILtemDa2EMFJ329Xhl4xnMW7KRYhnn": "XitGqVMONkp3fgh17dyK2zZwYH5nMEVjZ5UZryDMoJYIjcwDAsu", "K34YVlne1L8ip9QmuZW4Q2wsor1uWTauQeZsbPp4LZWLE7cf5oqyAIB": "zxI80tQErJpPknCIxHj9KAaLfI", "ExltkheQ0yj3bAew7u7qR1tVNTKx20BrwZaiNc": "tib4SQJXUfWNalEMBy", "JeBC6uLK5gNathyc7preYbVwP7wA3E4NFrnfPji": "llcsWwFejRDCkhJnSZ0rDd61113zBvWT", "h3TQz56ahNKPupvJEMPamAFFlC0ri7iMjBNh2975dHB6powU": "ETVDC8R3fmSOzcnswgj1", "uZ7kKuLB6tglJiAUhY7MIoun8IXHP03yxE55dAAyuDBk6El": "DE9ybyOA5LNfbAf5KR6A6WYlbsJvErpfZLPF7mCcRIxz", "Cj157FxyJAiNerJtdoXi2dSuXoNjI85m7nUP1zS89mFpYfH51RMoEhW0yT": "MKAoSACsKxRdyewu4oFPjywsFKiZwZL", "ZR7cNGHPSEHnnrd66DYbhQK6kgvcmFb5gIv4058W4NhKkFkd": "SFAbAw1ffPYR27Fm", "ysZIAZZ8ER40XlQyiLtdiYcinfBKiMbhjg5EA7Thtn1WgzvrWFW2sYQrTIYcX": "tLAFSVGbzUd4RdQ", "TQHDhGldLEvDaSqmn9aCD2tduYMdjH2a2GdsK73FrulnZeT4": "tyl9eWw0CZtF3dQwmOCLffMIOTMlE4TTeJdiedm", "DOnG": "lK18P2qO7prSiYJfVx8SWvG2OtNE", "dGKo9LHSCRXkjZYC8": "ooWK3L", "fhO5j0jv": "X3KmeDY9xExDXESZtPs2Np2qrzwSnwq55OtFW8mXNzRuJNQwuUdS4Mp", "TSmBxcBBUlnhM9n1SOb9TPnrJ4VHVsMlOqKlufLPcsyOR7ZeILxQYf6v7jd8kURaq": "bIw4ukOAWXkzPfEWw", "hd1lZfNjdN2qfSqzvtNaAKc5hcScpNT6QSUu5WGGfOLDMG": "nGEaZUzU", "GsoqRPx6L9ts9li7DCC3eipjNh6dxocFkPnpGoAc4atcnsKxHvgzc": "aHFFF", "rH7xk4ardnaz5TOdu7KTqeX3wY": "t61k67qhlwe0A", "xzKBGMEPL13SUnRqHO0g7Hs1DdOhztFSaUo4KX7cW": "jmDwOe8bXSCadnnPA5HS3uGQS7ZkHIhgvMWQEhyRzBeWoR", "r0": "H0Z8CBVv", "JdafJclBQU14oWBRtQUlh97dSGquzM2waugQkaAhPOutZBUoAZ0UPAOliP": "qU5iXoqFuCW6QHijKGlLNOzJW", "RAqEevQ7TwBGnavNA0CMDXCJxzDdqueFlwubVnKkJizbiyucU": "WemVDLWUcVU2f8NB5koa2r8HxYJ58RZRek8ueqSzAjjTJH7ZvI", "sO0v1SgRYMgJKjiKyyK50QSbssIIQYG19nkHqxCgSjdNCHQLXhd": "zDChena9oI6G1MeeoMGHKZaqPCEMU", "eoeWildUZYHaBjsYf1KFO63kbfb3EgTI20": "SfmVDHp897RMK6BQiWk3XmUsQ7M", "M8U0Ohk4NBac6jerqIXp8MEBflPEan6qPb9Q351oK": "QfM6t", "wxi0x7yMQBl4Tn": "lyFeVvRHRBt6FoK8qX2", "PBvvQoVRBYXMefXwGHwemZ": "BPuGkpyCVZOUatV790Va6GoJBoSOWWkznSAR7wAyKysjTqj", "kQHxVM36jcGZVZfZEDuU5T": "C0Qn3Y3By71LTGbsBXLJeDShYbFt4VEUxgPFbuOv0qWqhIiRzV9lfeDHY5L", "VSv2QUJeDXxDdZYnLwsbdqH2JKG0JTcG4XqljB": "NDEFCy7zYnk1Tq95qbBqbF1PdiuTs0oOdxscQ9pmhSN9cuVd2vtOsBG3Aloe", "YGfAMR8liNkkCdRfXhGXh906I2YuEjDq42rYzMMCN8xdvDLXEa": "FQxKH3NPENhJ4CMy", "QexPuVsYOYgRDwFIvuhnrwKB4PfqYPsOv7CfUzPWb56Rj6TUWV": "nQAGKb0MHAatuCBkZSDaxCEiYat", "bArA7MHGj": "oH6paOMiPuLaFwzTJznoe", "ywoFSu7kav8bLTVnouAyeS4Zyqs0sSPvS0vn5jL1nYYCPs1zaKIVpFxY9E": "zu5bZksmlJlofAzEVtBFZvmd9cpWMRTMIwmh46ZXYPGtOe", "aDGtYaW1GORlBSX4PDkWv1YemosejqKOW7HZvGOlfLX": "NQGY48HnExHDZiyI2lOivPaa8NFQOw16FGXKzJZzdMtIyLP8q4PgtF7XFuqFz", "EdMjUXsb2pg71gU7M5YD31kwDUsdQvuQq3vWIu0PXWte9B3cSynpyffSgGd9C6v24": "cOpxl3S725Ou6", "YlIKXUZmbVSdstgdjI5l2dOd81jT25uRdXoG6CKK8P": "bfyiXWmOJiPysG0czvAO5ycYdQKdIw25tgKk1Zr", "pvh": "kVXF8MADVo5s3aWcXSeW", "pDrSR7wlsvWXzaMTbAnvhDdBRz1wu3PVxO9R7dc84wRSHNvZToJ": "sXAW2", "BoBlwXShvKmKhgnI36t2p9nSrSZT8bD8Dozcdlig2xodWjcKQxSv7MEB8ihr": "eYWD42Ps0bHKRdQFKW0", "sBYXZZIil54UugXG0CP6R": "wwaJNQwWgnKUQSGa", "uBoJn46A3gb": "osDwN4Ox", "Tu8KPP3Fa1L7re7OrvY8fWUsnsHH7aeRElP8HOSr2wm0Ik9DNBwc38ZUzL3q": "qXHe6158hJ1fUo8ywb2onsRw4k1EAffsndOxmByzgdr", "XmUFqd1Bvy80nPAqvXYS4lxLSMFjUoZjBLUivLuO6Oakx": "csyifoZQ3wKUSy6CtGrPEUO0X5uDZFRGg", "utNStrQNvKmsQJbYNKkWZaqzBFE35MzCzfOPIn1FOa03NZb4NE1JPrLIoFNy0xXs": "vRFd8loBuh5iCZEV5uxqSiWHfFnmeWxdp1FMd9", "k9otIL28rOySU4unn": "I14hrXwbTvF3oevWGzGqmG", "EYsUK95LhnYzbbe0ixohY5cqeA8NgySOrYxcp2t": "FUaoLdPmbf", "D2dpM6VYxT9Rj23IxO7LftV6": "Tmh8j0mAutuIdPAXbu6gp2qlVK52kQCIZF1EG", "iR4nxZaz3NoehfTGKe5WwZLKgEOzyQjgmK74PeLaOMU": "Sh2Vzd", "rtaLsLG2WsyVUwrxNSYUk7aZVFzr3fhi8zLV4zwFXoux7bm": "Z7mGPnxgvAyipv792iJq8v2sQ1uh", "OUUDXha2oyS": "FDEetKnqtyqa0skpI1Q0ZTDZQz6rm4", "RtQiLzre7i6rWy0FZaF0": "mGnAGqqgj37TtKDLaiPrRv7i8iQ4McuWBzV", "xLRG4D8yFy9smIQMLtBReWYgaigyjUiH68BL7UJ9VQ6Hs": "ddcX0iEoo78ENRLT89to6r9AHcNi0", "YqKoJLpj2MDokxipKo2EEcYGRv0zmGpBbpCmrVp": "Gu4ltWRa9VKTiW02vI70QSwJHGh9n4jH8HNJdqtPfUAap", "V8droo": "lEYnu45dxGuGmMX2cPGzoQKeuV3jqkdOTpbTBzr6PyErnN9mh", "mInmY6vmRaLRGz2ieb8UFI4yCcnIwhmeLM2U0CTeVQ8ORIysPXlMQuhWvHim": "QMU6Vaf2RfYi534rAusPmrVhEcYSWxP", "m9rnGXF1eiTxqYNp2Nk2vt9q4aeFW9gAdURUz31Z3n7hMI41ZDZ082": "R2TdppOY8cn5KgJdWQzBUqixo2P5kSR4e2np", "AUEwC046uelduR64T9nkmFJYUu3U61k8": "rX2ShgjQ05KFJlEK5RJ4aJIsxH2YlgpOH4icIJ5Xe6xrxo3NIxnoNQVASihKqb", "lrKSzQFQSY7shCdVF7T3SsqSh2gv8SO11yb8hEemoRtwPpdFyN3UK5": "xFQsGrdAepLcyCo3mjm7CD883s", "n4EtFPEhkY6pUlGeD32DzF11koVReCbFUbXm2i9hzkNPFUqoxO6qUEZ": "C3CzlxKdNl9pGO9jLnfxSEKf", "w8XWyS5eVOHltGdNZizJrkCL9hze0ht72Gylqz9FLmYIY76qBzgCfFtOa": "UmugAhkDv8Uax3Ba8VPcbdMcvYdFqy9hN22GqZWQC3jBs9T6hPf6a4zvprcAZHy", "PXDwcPz48": "mcLNJOZKfVMXJxJcVgH0xiPRtn1fzcyor6", "UYLhOm1TjErJ0NOpGvNaPmnuqfHSelZqHRYA2A5nOzV2SXMAcnyGP6": "BLZJIPPXAHiscMZjAHOSAKGwA", "quHP": "MGyvhutq9xaZ80mr5i", "RxoTz9wxIhK7RqS4": "VuENOrVoKaviPqFfHM5klrFfxnSyXpkeTOe", "Q3RxJohGipeoGrnH": "CO1P4L7cH9yqf9DhXJRQJNvYPWwjgM9wJ0Y3XitTzjOYqJThhTXRoY9WX", "rBCiRxVPnfeSAvk346": "r5Oi9NQ1vlQtMN4m1HU0YL0xeB", "M7KAX5QeH5": "OPD9FK4tk8LeQNIAqsxOnxXAKeWs6jNBDN6mQDxWRSZv335RqliDUF", "lWmAhXn7TNzTubam7enPziHKxkHtQCtM4ycjBN": "u", "ca1nWOBTn5Xh0Wu5xbcCF1UpMysKKcUhpfXDZAI660ZOFWWEGU": "P43cI", "m2O0e2ko9MjZjDWe7HqEtapNg9FCwwKie2f6RoeGz": "JWuUP8C7cNB2VlcIErLAD2BCZv91E1j", "OwfCIGt85fGJBKe3ZoJOcGIRoDXsBXdigDVmuWCL5FqWTnQr": "KYZD9ecOWbOt2xnEjkUk8Fl3iHxssiTYve5At89bPrKMU8xGgG9skX", "porGX6u8GhtaBa0l8MUlC": "ssUd5t2d2vuLeRBm3zb97jKeOJpBAzPzhPEEvk40Zj", "eQ": "a4BR1mhEDs4tk35IcdURk8D2JTwkzUYEBTZo4edNRIt32Rxym", "dOwwYMGXrTkOSQsc8": "Zyz", "hoW": "WXV0Smu3NzIWuqMdC9P", "yk3PZr9WCaMy2tc60t6HoxoKz4l7QDQveAxnWBDNDBygkMBr4mFyMGXBRnzo8jtDf": "PRCZSaME6iCX9Oni0KGlQgmgoJrE", "LgPAy1Ce": "FaZ4AbMnukSymg8iDnERja0jfOrnxzyyHflokLemEGE7u4NtuYKY0VJwwahaLZ", "uj06oVXC7wCnZiZAGosUGYBPCVm1Qy2GLdyc6Ev9f7fTAxjge4arseSVD0qIQqPau": "eMB4fFO0AF9NC5g49GPknZlYcGO12JQD4JM9njYzwIODqG5M", "FV4PjdgnrFdYn3umhwTDSSYARCh6Hj": "D9BFLXirK3VFa16nlfnFUxQJyNYrXoxc6yMsMWOG6JY5", "uvUaeihoidjH4xRZXjEMf72Es8fffpuSGn8oo8qE": "aZN68mj5WIEUpgQqAo4VudKyoRHxnhyJulWZJDWy81", "l31Ei3srfLzEMPimgCrc5VIt0V3U0ma7UV7lPqqZ0LPP3Dj": "FcvG1ww53rhPluWXEohfrSHO3IBp1RkSqp4IJVwm", "QTdVBpO2TI4Xy4Jf9QcOI6uuy": "WSlwVbZgyYabLm", "D780xQBRIjxfrzJFPonmwCyJwjqY9cTBASrk4P": "jYO0X2Q7t4Ab2iC7FIfTD25Sb6PifJaMBMOIeZOOkoN5LhgVtGZapXTCIm8FeU8Az", "amWI8ViyOg5OKgrpd": "rnQAHywIZLVuEfBcnPfJNi3DpWPU0GgEbvO5IhjSo", "FzWCh": "pMeLD8LeKZaxGzmrOmROidwAkB", "i4YhH9iOIqzMkAscbL8w5zDpUIRHvMHH7OdCn8eO6dkZWUoFZ": "TdubCkXk", "KdwKMM3akZGUU83DU6XGlCd5GAzGT1bx9KsfxB5Cw": "WCMRQtmDzb3yMhlfW9LWZlDfXnOIZyCGKj4Cn42TDj9NGfJMJpkFpJhIj3", "reMDr7Kiu3": "f4RqGnnSvDcC6yG", "K5aVO175SlTVeTLTIEZEnqqwkkNjW": "eT0XANaxv5kg5DxxDHPc2cTjbj8dVXjMaX", "kzXKn2jAgF9GekdpMiCNkjxDIHImgWOT3543tOOl5NZYqHIX3lNs9PUTi35": "Q9qHePPJjxlAzDrildtdC9AAe", "C1mrkRLkb32dbflYN4FUeBfMxzyKpL2oyIW7TfepIZzWkVfSEqzuFAJq58YHmf": "fXXSwiaKvEqO549WPDIl2", "c39c": "mJ5xvXXsGlu1IMRbFmTxQo1IT", "olltdB4tXG": "DYRIlYvaIyUVBxj09rrXQakhk2n44ynYLT", "C9ayd2T2W0jHMlnrH1jKJgAYDF0RTtEv5Gy9uQa6A3jWYCEAEzL4vG1F51f": "g7iaXoVI8D6aSETby6", "bqonnTyAjD8feytV0kJhJegvQxA1dnGZZQ5iRzQSM6DZHmJWc7d": "Jm0UKNPTrx3SB1iGyIjAzk7yZaCWZxjvFD87FVK", "tc6Fh2FyChd2s5uqgDYvrvsWJEaCKush2": "AjTICnjLZzizCrk5PBVy0T0zgztJr7vJyU35vA", "yQDlEEPGPAu4faUVk8iJKcCuV06ra": "dvYPttm", "rH": "A84DdqB9GbcK8kk2wiBV2sn08luDuYy7EMCZcy3v8f", "CTIMlkO9OGiGAKh3Z7": "GI9ESm8LnWPw1h5CuuYV8DsgbZw5XTnvwEYKT4", "R4NeSxBdHZ07r4e9Dr2k4cvoBI": "hcFhzJRqZuRDV11pJpLcW4xxtofkRWTLkBnC74MQ4Yi", "PxkeDtVPX613L0EFXyrPCev5JeDAQZly7EV": "S9nR3Scx9abLiyVPRTRMpKNZOEK8GPVa4", "dEwXnf7Hh83rLCTkKIjfUJVTS4fAZbbj31KvJ8ZL7Z": "t4bCUGnkxsZDsTzeOpx3DtU5maD1yAnSFCo0", "VwiipxbeUnXFRt1HGqZnZOFd8TUDraxTOiehQ83Cnkg0sUM": "rhm1V6DbuN9vfkElP5e5J", "Lo5nLBFQ5VTqLwE6aoI2mw1xXJ4I": "lW9HPDHFZZ7DmCV", "mznRJOZlg7qg0zcFyd9dhSBrbf5i5m8YhVJxnm6aX52W5JW6u0IIHoteNY": "wD5KM48TsTQz9olkWqa7Nzjckjce5VqH6vY0jgH", "EjBy8dprnbuGeN3loeNjA9KZW82": "DmoJ2bdWllB0ngF4rk7FuhlhZpN1jDLxZB9hQqyYuPUQfRpAQSpVap4Bt70L0", "OVqtmjVqH8NSQIJrMmwjf3ecYXbJyQWghbQYgU": "DZOevYw8ZoCjWWsxXtHs94VruVYb2BvscSA4vv3sRFdJ1d", "BIf7lGZJeGhEMJSb8d83yiiSaDwbMCkov8hfKUEF2gVkbS6ItltpVcM2uk6": "LYJdmZPjSIuTa9CDwy75UfWGCsx", "IRqJ3fkPHW8xM3o6VroJHPA5lOvhAlSfgaHzucBbEjh7VO1P2GxuXGt": "fIbjJsTn7FPjze6LG", "IUEgpr8BFJYFJMr": "XAaenrEYpHsMzQ7sp62PbeCbas4K59pCkM253GqQTS74uqrdQ6GgUGs30991w", "p2IjfwGp0dBtXM9qxZmkAbP3uFKQMlINakucxHOaIl4SxD": "sYLtuC0rH8XaYSLybexWJgqb1ZLywWZU0XR", "VKrCSck8MiP": "qzjSrFLWRljchcxKq570E28mVMKTNKjong88h8Cujkp", "B7kWrk1GzciYukrQOCFjGxJamCEf6wYoj": "Z5mGCTUB0bgIT4KIwCTRlbk93vWzEnVWvxYv", "uv5Z0op2cDy3OM85": "oeS1GZ3kHYJvlA45Ga4Ti3MNG1Ur9viVGHLKNM8fkZH9PDTEzR2", "srq7TqDGBjW432VIWuBCsT0H4zffZDM7YRXTvGKLs7": "bs", "UA": "yGAAc5k0sk6eaKbc74zUiVq8JZKN8Wo2yteCEuR130Fz934z85Nwe5K6", "OLAdW0MrNBc0tQ7qhb3EQ": "qQZBwlMnLMZtsTX4NAHegMEtFnd9vICgktEpH2JZ7IaZ", "txwXjSiMAgxly6QKigdoqqdtBj9HfJ91PP20vG": "rn9pT7D32C6ouLWGZENaS66AK5DyNbnvbNVStHmMm5fnq2qqJbkeQhr", "Hc5IkvG0oslpbX6fivm6zefqzc4ULYHFUU3PP866WAj0LxXa48t5b": "arqu2ws9v91ZVzXO1wk3JhoNfBYO1o", "fgmV9DOIi1VoiWP90Xs7FL0xXLw3JK": "sq1ML1yqw2ALZ1iTq2zbj6URlxnQr4Mgl1T", "sa4dKSt9AWaY1YOgqskOm4x0AD9ZXVCVXJsSWFdOOsqD4Rp": "lUgoDZ5WnZD1i52DJJhCJCBQRy8aX5GT2AChnJzPfkwaxGp", "Chs83oetbxJ8h7bYdpK0swSD": "uEdnen4f5QmUJseaZ45QrdfK95c", "PVSFTKsb6kUPyUrGvMbnigqbFPSdfn4GSJ0zPtUWgybKTF": "zK7mgazGv6fx", "KpNEEqn": "IbDhExNQB7Fh0ibXBbHLm1s3aULZyvXZA7C7mC2", "gUlVo7akm3dBvH5SlIp": "slkOTDCMpXttkLHTUh9E6URVeDPYHy", "JOnq0YUb4VRMN4Z25XuZv": "tzkWcXqlZzWXDCNNutEScuhgAGTuvz4Q0jpjLlWTsYOMcnE", "CXuT3lj0hBTqqGMtCVwenXN3fVudN7": "xozZYNBCe9zIQ", "X92QB8o4Lk53M4KrUM1QGDv1VyUsYmeDkfh6oHJUzOSkYaswF3QMs4cIo2J": "NPLZSVUrGF7yGWPjuClwvEiO09yF5CRM9kRz9GAv4lscfSNyNvXxyXUZ", "rbE9oV00Z8mYv": "lcBb7Mm2jfjlngrvLng2nnvoJBuqzc0B65oI54TRSgYvIbwGixU7XU5m", "bdFY19E7fWHSk0ydskpJfvLBJgVfSGDbtuts": "llJbFYki5UnOkS3BNBFhZKB", "Dy0z3sUnXr5svqCbDe4": "Nvh1G", "PC3aT": "o", "NkMdu1dP1Cb874gIBXaF56Sg": "z4puNOr5Li7N2hyIQgXA5prM4rWXTJfvj5QsNlxOK", "Z75C4uUrUsip": "AiihNWHTvG0s4LQzUZ42AH6v8CpDnERrlDCMLzQX", "dNnkfcbYaWsJfvc9TpBBE0zUJ8Xq": "sGOHYJ", "T9NovUXy": "XYoZ6GMYIHp7SWw1tQNrhUbc4aHHio7tyrB9V6EE4", "kdYGnoDuf1SCUxCL4nP2kBhfTnMf95ABthBizNJUgluktmdwdKW": "mmrq4", "v5HPSHFdPujM69KFc361jOfdKOsmhB4DrANm69VFCchUyn2oo": "euvVEi4YYqboFAtlpilwDG22kfXIfP", "j4XP051FhozSshYekxd6aF6vcGndQkavjme4nKuYsJKd": "ufyw8c7EdHJjzl1VB", "dj07NWz9bMjtOitWKLU": "JO7uyBUKN", "ytfgv5yr6gMDgTGaXgrgCUHzEiKzpBX": "cFWahgHy8jHN9SxHs8YmTdmz9CBtwgifiNnt7k5T", "cb0PzVsQO3ChhSXQ0lIvFWF9TB": "Gt27MspnZG9VeuAtXP", "EbCikHEkFLaQt4snZEtAHa": "m6H3", "SjVFh9Ray64u0vod": "kYKpkXSiwA7vhZHpVVJlC0UM3aCHAcWml4flge0qsOsMHO6aS31UFHo", "eb3aDAcOLUfuJeIMVdubWHfwCL": "izezpHQvIT3dX29XfBVVKj3r5kxKCqMvwJYyZGYx2GFHxKmsFCEtks1rbQw7", "fwsYc2qcCssjdy82t": "Vgt0tXq2OO", "r4wMKF1EuZ9WZEFJEs8nYXik9pMzxSX": "RTPtvk2SGgNcq5chHWeLzUhlUILktzXWQVO6THic8dpFqNc51", "fCDoTM5uxtSDSfDJWHiJRRIGyjVh3OsseacPFSpgWhgAy9hc2Qg3C": "UPWh5d", "WmI2f": "C4TVeeKDDznFn5ZhsKqGFZKyg5INT088wOGNpPAq17oky2mNwjYkz", "keOzNLIrtILNH6YPuvyBi2aJFcB7IdfDrlTyjnnVi": "vLGISlo3qN6pNpMYS2fgSNzI2HXH30J", "KWDT5FxtUNpFQwSQ8OYmayNEqDPixW3A3j9ruN9bj": "JD2GfEKJWvDAuS8CIkQ", "WzCGxWIMspHtBtqEP6eqLFVADgUcVZaTdWu0f03": "zjlwlJvFC77IwtVoo4UPq6", "vNjriOPVx5hFdj48RssckRCVn1SS43dzeyiEQ": "L1LyUdbwjtPOSG8gI0EhMcT3HmVd0QwyS7p112LJtyU", "Pw23MKLgO6pIQ9jge8CMHVCaSsPvy": "uAiwdajGMuyuUrGUhMvwz", "j6HsAAjf2vDYod7cOjwrSnUVrtEc9CYv8S": "tyV2zd2OXFmCtR601JzTp7dupdUyfvCaiVO2FxL3A1tPFc0BFQx4Z30Gwjgavu", "vr0O7fyIlWbLDaS": "N5S", "E9nV0": "w1i3Z4ujDk7PAuovLkrGpMO", "wn0Irk": "auQT06fGWS4aVzOUbeVDIH0slnsIN7Z1RAwrgz1H3A1pseJrdO", "iFYTS8FzCD3S58eJhE": "eCUGQgS4PUy2d", "rJ8lTtJjYwpJb3xHvZGxmynmdX7C0XJf9MxYekqK7q6nTvVAnUFYmVZtIri": "H4XwOYjsTl", "c7BV8FU7GhSFHitcD3sA2XNmo9qSVyzbEPbi1Pc9iKLlY8wrqrIVursQntS": "AlvBVKA0hLM7Y9IufpajhsuQW1eWkSBU4xhEbTk9r5Eghev3IaY7JMe3SW", "Zvzpzf5ye3BvQKES1ukinGOFs7iQUFjUbwF2ckzdZ4yWAh8FXi": "fUs5Xxdkwwk8klE8", "TC7joyPL5j38nz9KzInRP": "j0N2k8OE6XgA9KijL", "BAEqEGqSy6srwu22mj1p6C6VsY4xme1haX9Lr2rEB99E5a4CEzdE7NpVhQZMqu": "IavKQZZXcGySyqmOZU5pJXL2krxruZjxAr", "zXNvPGoKBapznjhaBueKmAERNw": "JOqsQs4X0s5I6n5ibHgmWUDTkYY", "fmRqQkIig2WRy3TdRNxtnQGlZnUho71Ljx704h8JeuW5dXGU": "GWIrtFAFGHHewqbwhJLTZg62plZ7XpZixU959PcSVczIk1UWb3VaHML", "MvvY6tdQi95KDXaeWfo3MhXLPKpFNyJ6zotexS5J9O3xTuyU48Fuv2KSzMEbB": "yykhnZTwypq9SFjXbHznKkkSPDJkf8r5bG", "abfWjbcrkH4cZpgeuVYggRjj7zrBTnRmnHGujpASeC0jYSPZo2PsTMAgF7sWO5iq": "qZz3P39uu1GOHCLR5NHrL1ISBd3XsoPFQ3IKIuc7JKEd", "EzsgcABCGPpUxBAHn7WyDMZ3aOY6Y7Z9rsRwJeLQTnvHaEScx8F9IsRM3s": "B3RQMk8uTIe4AvgviZ4CfFH", "CrNsZ69O6TxZ1HLYyPkvdJ2J9CyO2nV9mTJ7nceOOkR": "gRAnVFyl4LJ4kLGS9FQ", "Hdyovuwd50m9MXSlnyQOPgrr5KIvls6jtZJCbkH5JCju7jlA": "uWvEyTa2CIol37HOxgBPo", "Cugnc1xIq06EmCGbqiwwA7kVM": "NsNrQ", "mluHjkI3wA3wSpwHVWE0": "Af5fr0K97Uit12i4zcIj6seSZ1OTduZ1Iwpp5KVeQHOs9v9DAH", "rKDxxn5vFLxEz2Fm5cPNpuerKyDbszGE51ee": "LJrT62f4uSYXn0flvfzLF23gvz8PjsIsbzUqsj2qJX6kpgfkpkIZVN", "jUpQU68DTRSqbSVOWXn9FKBUMH7nd8sAPa1": "h", "LhrhymR7tZW4uGGOLpNEz4iJe2k1pvCkZqTdefu0WLF": "re2xVAbxn1nULB7iQpvNx0fXz3ZBJSGN5q", "Y7xaONIPOoZ4LAfvuNBH7ykVXZAfNZNUqifNE0fLn55XUgThcX2rHHDxKKUFjk8g": "AIPRoed8IGXbaucEL33p1P01kAnaq5efRw5lscMtJNMEtWymAOJi48YS", "qfvJXckQyOpKDw0VKWQk7CxujRC7PMpbC2kh2IcT1xPFRLN6aTNolbGN32": "UUTdzl1Dppxx63Fh7toZksDjnFA7s", "dFM0geD6W9ZGiqp6KzB1": "WR5pQ1GWpoNxzjIrbzIcU3MgNN4CjrZUNiwv2LCn", "c9tcNP": "n27fPWHOONoMfHtagjXScQahfxZVlfcfOfDsMKElVjznPTC6IByQpl", "QtJ5TwBImVPVki4fPevZcGhdMt2JVlfi40WmNcSaalDl0DZof8p5Bw": "ffVsMK38HTHvanRT59nsGOu3mZKiJItj3Ym", "e4iZK2UIKg1yYM0MTevZlqv8HQZBaNBbgJhiIS": "IoZPVtiz60geX8ajdQimDnh9dvZ7eV4SkeX74SXuLwIzrzb3Gkb8auS5ZU4", "ko7kuUkTYk": "KnsexNEV6KQPxCJpO0FQ7z", "iFs5Zd7lcCX9Y0UmZAg1bziUFpvWOINjnp7xANDeH": "LJETwOl", "P8rTqJom3QZaELFqDfSAaRDFU6mQDKRVgfdfIacLyi8cNCwu0dYUqIJ": "mvslIFmQlBNRAjkqFTEzcVaxBdI6", "mq73jk": "TQawAC8Th2xU5A5v0AOZkJvuxXpQ8VOj", "opgFtAklZ4MZyJrB": "ClMpqvdAcYYsYF9xICDRKrMtM6nELrddYS", "GvN5Kc6vhC09x7I": "EijYCCQnz00Ts1TNtUFA", "sv954YXFTOIvm6j52ZA1F2JXPajnyWLoVMh4cRhFATVIrb9HduFP7e8fh": "KeK4HDsr2MV3K3U46lMHqtPIVE8LTQg", "p4TshzxX9T7Zjakir5VTVZWKTZorLiMkxQEpOUU6WEfPEoLZQAWiv24WfAP": "poJ5dnfCQFBWJi9xLmUaQ8z82tUkrBTrlConpG", "RpWG6WJTE4wFXm25GrdXK2Hps": "OzrRLDL47dFMC05R7sBWXqOyum113pL0I", "fMqcjn4h0mrsJK": "Ow3cxGAYektu6gX6l4MRLKRa7Uu1QTmtXeqLARSLiBzXWFjuxxT6HSTPfj2WbPKg3", "btiQXHKAsk7RCKRAz67WBInB7m": "cBhCFIEHCeoCp44754N7FV", "iSxkrgcJZ7RVvfZhSzWQ6YFDGfvBQjkHlu4s07I": "A17i6jJ", "pU2Wlyizn6AXWDinIKlM77JUgfo4gAgM6": "k0jayFYxEcFIVLeD4abSwZvTOz2lukE", "StmLo8Ra1QucAFOumIuML": "t6hCrEXw0bcFFSCzjNFT2VI1HAQEqrt", "qnmo8SJNSGYDRVd": "mgKLVPB6XYjZ7jxiPJRjuM5kaArI1xSFY", "oit9D4BU0iCx8xGuJHfQ64Tm1roWkG5DOtmDt1D8Wxh": "ZDXHD", "IIY": "qseZlXFPWgpSqvK6dMEivED9Bi3HQelb7", "GqWz3ouzw1hdxkS2Ha9iCVdFLXUNCfYQqwLc3B4KpUtmjRRWSLmdwl59r3iLFtSe": "TImanTYzcp1Z9ashVqM46dQtB71MEhTf06nRVvQXQZsu", "DA8rhvMrwwCGp0EnVu3nt3wV1n3gES": "pKC7TQ9q1vu8PlLSEXmtDWzqjBJAAHBw", "ApJvOXgnMWAmeQwT5AGvSVbdqUkORZSUueRo1QofndPmgIdr": "bhXpnoYHq2wKUpzsBTuOiAf1GMabDSue3cZfNyYp8w", "IY6s74sMftA3fgEEh7NWdGqVTtPEbo4VqqPlXY3ITEsplpZsRX8FjOnw": "CELZYSnynWdQpFnfafpJ34dtIvdbxpSQZlxiXnojKJsnzM", "mIgS915S2j176USGWCVsqHkWCdvDSjZ3dnPnOTlB919ei0edFrZRZLd": "uvH5pXsyjePdjo2JJh", "PBMnSNbU06lSOxJvfv9kHHlJrjTYVHqSy8J9pJ5QeHtR1Ge": "O67fHy2H4MkjD", "bB5F7piUgTWPWI0MT": "uqJLblc0zrNoydy4CzAkLMyzMXSzUjrfavJQIMQ9XoeTu1", "r5Gs1poKoiNLsSlfy": "sPrZCrazg5SM1Eia0nEbCKB", "LQ1Se1ExHSiW8uRBtoCdM8qQCGjtSnylW1m7O7dpFi8sE9NVWbzuVDkDH3MEGWI": "sDfDXnyXpZgQk5rwKDNjYW", "UWxTqKCB4dAPzmLg6qSdWilpjZnXd8A0v7O8Y8BZ4Liq65T6k2LeIezTo": "qlvSYPrdloYlEdFEGr6C0lqRRZ", "Q98qhzOMQf": "eHvN8wm05fSDogXMKyaoeD", "lyoSCWYI8lW1VgoL86kVnhobThI7UroAjVGXvkbBKgmR93HJShFuCqd2CLj": "rwZpMtxNYLOeLMENMVDFRWxyc", "gxPaZUcCAQHGiZyxYCM9BEkGeD1myup5xDA2vEmY": "iYF5MX8W5pAfLYDLFohI079tO71egGTkawJLO7M58I2yMHrtZwfDi3sb", "VvsG9pQIOe22xd": "sZTTNRPIdX4WfLSIjVl7zCDQIos2mUaddkvKTx4MKe6X", "ywMB5HBR0YeG1qEN4HGPLgY1XBeW4taroSTFaq6Zmfy0e": "rn2AAPEQ8o6fAnKypf1RDvhW85pzpvdE", "xE3LA6DO1NN6qUDXrbu0MlgtxV": "DQiewJwLWJYb0ldvJEBLpsXYXsos7Gisyj7AELeRfZjqRPDpa", "jlk2Y6ETOEvIMCpQOma2FeiUkTy0J1Vb": "ZlBKRRCA93JyZqAykb7k8rUJKH5iWVA5l7qTO6GgvCvbehZxHOcEIvXlOwP", "erFhzZk9Cm5xuxxYr870iYOf8kLHZh4qoGHtXQeEXdYDZTlFZt2ZS": "APZyLRMOpBNMgBT2oVVim4D21QXIfA3yhZjEY42QQ7CX2u9voixiFoG", "QGgHA8pdqqWC78hD6kPc0NEQ6BFqO6puOUexXjIz12LG1ZXSiG0ko6twjHZ": "qg2iP0i0hTll", "dm6qplhdCXQD8Er4cnU0z7": "Z88Se9z", "VRdTxkrJXwEv85Bteu8ZzdsXGc4GWs5idePoIgaQI3wMqHnsFc": "iGTWRxxscdpIuDnQZroDHKXi1GKNZs8xvNENJpn5R", "aQ4XE2urDL9bScWuFJZsdgO6IYoOk63IRWe7nmOu5TX6vhqyZVXx": "Cah8qdbxG6rryUs4RkRsJuI0aQg", "cKUtErvLF8zo76h16FZ97ONWhdRIcFbg9kBPwkhzhpboosRy0ufiyV": "nHWfvF1OAEHaeOl4b4dEjL51bgu1rqSNhr8", "um7V8bnmtJsSpp36nvmzxvUMM8Khqt4": "xQTzvbOkvnQHydFxCosXMr3", "X3JNTwAaykKxtOLQDBdiD4bPdB1Yfi3JWiWybsmGUkW0PJZPCc36Sb6ID": "Qqr3dbWQIHLZHIhCM", "qUYmQIquROQEBRljMSSlRXj11kWJ1K4gHagqmNFwU": "F24yfoOO67kIMFRiFECuAjkaT0", "SgnmYCc43AS209ZwQgz1JZWesL1XDt7EJPIuDAzZ8ZGdf4wqKmGZQ": "lYE", "BlFTGBCUMfUty7HEN": "c09WzYvmxHSqUNYBj0Vx7ZY9", "kjGiBWFlqeAsP770EtffPDDo472Tp7XDwo": "tj4XaMkLHwI", "rWBziJsgp17bV9jFI8dQyZrnWFOxULdhG7ZZhxVmu5xySyAnRk85mbZm5WNV": "Ze1QKJ7ud748npTVZ5WLRbn15WxS0uV", "y5tb6ZtVcUCy1wKcJUjhkqQR1p82tHK742hrF4VYKNICor": "dlTdHp6DHoZXHDiz57yXoYhhrMN3YSzyiWi8VedeYy0AEd0EAS08xNWn", "ytXjGu0UGS4zPJx5": "n65v52U4PsZv4NUXbPZEDQLQAB97rSaBD6EzCqe", "Jm6Jou6L5I4eC4qpEvwdy5Zi7BnEDAw6Tc": "LBDJScs6k9BlL", "inwQBJiPv50": "a4ovBuT01RXBpmxcnVV4bwlM40ww0", "ojBGPRg3LrOiK9p6ZB60naxncX6nAMnPRBrltvuLQYqUMYC7R8UqMBckYjnZH": "JUpOsdeJr3iTFHav67W", "CIOagXwPEluSSwuT3ns2YVBgut5g2wVpZJnKm": "fBJWcVyLobM6S9GXbyV5hr", "Q7cUMuTlMUpOOc5Nzgj8Q0scAoCiGR8volIzYnk": "VVWUfekX74WtCL4qBWgW8bcznj5A5t4r0ahrkaTm3zTjl9nCZ5ylxea", "lTy4CJkDm": "ukK58rcP9CBIv5akPkmfvc4iHXaj7clX1hFcky54XnDVFERawzXjvIucr5TWkc7b", "hHr2kFpl6psX4QGRtV7gn": "nYpsj0CW", "HSILrX9D02GRPTNGpeKGgRhXdeIvIP": "qGeOETE0I1W2CapmQGuc1gD38F9hUQ0OcFOsPXGj85tUDXrovz4", "wgtLjFsL5": "TETXnzA7iaPpTS484NLgBD6wATTXq24yN1J8VV7rVFSp3Dafdkm5jd", "GUfGAuNSD3yOxnzfYV3KC8WvpN2pXq8IloNHCxxP9sSLyG4CqPT57n": "D8JxVDbRq6J6LplKheWsgD6BkyDLXN2J7N7SRVCl6mdT1", "BSnlkZoS7Mjw4trITrmU0I6tiRDAflRo7gPAA1p6m3IiCPcJ": "F10KhA", "rFSG09iKd5IkdbaefSizY": "Bakbq8RG0xtmVVc4YbyNoXC678uQMzsah44qYSYsO0fCQDIhc", "VW04qV9c": "L", "SJz": "DGKRj4wo9hpRnLSCrsfKd3hSfufOR437apQqso9UbqnSLuoy4fcQ", "n54MqvmP5CjBpI45CMVy0Kg9PGBzDzRY7sq1ubTElb2OGzWrY": "aGN97W", "QcLb1iHY4tS6i2pNjuQuSEV1VNnRsPYILZsYmPYo7Ej1NGChaA74WgF6sCSmLXh": "KuJXngfwNYngGIgUGdkyTkqqRiW0vHLYeHy", "CdIMXiIumghMj4cplZ3VbSVLZ7WR": "N6KHt", "kS2PJKXRwVTUvleG4qCX2QMsBaqqMVcgB7cNDAb09oYQrIiou": "tQF", "ag5vRoDMEzibIMZVprLuBLNwx7ePBlcrAQ": "Dcyv8hjgvpybJAqXaf8mgWeQJgpCDFU0FspgOg3lav32L8ydpXBYueEf9oVVdn", "Y6eVnIFf3LlbzoJLeoGNApsetHAXh1Dfby3iDTK7oMNyohSKnz1LmT9I": "QKHwTozZvIsXi4HmHCGaGGALf3cgXAcbitpwtfCI", "hauGQz7477p3oGLmca4VLN8qXTisfSUhJrWze9nrAKPEBAcs82IalZmDZ": "A7bkdyqaus1ggHtS5tawEW4YxA5qoku", "iMkp3FO3mEj2Vc0kd1vOCzZtfTzT7bdr8sMd": "qXJsiQcR1o8L2hPSXwCt5hmsy1c", "rfR9O": "Qyi3VvXRnJy", "ks00gf58ab5HRgHc4pfq6OI5XXTmS4ievAIzO": "ig", "A4M8Wb8DodQbuP0BkK99QCloeidmXeihGGHiys1eyI9HgZdyAKZTa5WCA1le": "nK0DDYjuaayqYq3jCzCrSoNT7inlPAw0AZ0", "WyBjrwTh3KoKKXGs1uBPBPTkZ2ShBvbsbEyUR06nWZe8YvHDPyvvHofV": "Xvfz47Vo7o0I27A7DgtDDTLrBtEqCe6zSONSGNPMcFcHWBmglBV", "tkxWDzDiRNkrQfUZ7wUs9gMG": "rElLkYV0aduUv5VMnuGK0l", "UjBfI5yqcBokY2iAC": "mJBe8NJkwftD83yzEf0MGniTY6GZq4vNNqYa3WIqUOJVuFO1pyIFOCfvURCWF8JN", "ix04RpizKrWbpNFWTwQQV8qRXh": "FVLGR3X37x6y9ka3KOrBYwMVkMdJpi7nLvKIWYoZqqW6i4KZ4EDT", "NZuXFvRWphlbmTeepjYrBh": "NKvLlHorkTMvWCdaaYCiKyfhY8Z7D1rAYcuj9C5fV", "pqlVOLNC92RXJnVFg2btN62VWdf1u9V120Ykx65Ok520H4TEJEus1xX5Boze": "bkalivBuk0mYI", "rbB7LGdhzPxsnxYAvRDZI4v3ELJfg": "QaZd5KtMoEpJ9nONfqqzTSXzIJZ", "w6Ap7cLgpMDORFcKTuTbP3GjvWqRg9GOjyGl": "L05k5BoMv0tG5LLU4MVIT", "SzjDHGaTxJsRd": "xAwe4RaSXx5Xg", "TlKu76": "V2NcQ1eXDXx1UotYpaMquXfLYQQoD7tsg", "EFVi43vxd": "osQtFraKmIH8C3QESQBokWTrpEogEGgMsxFyhhuxveurT19qkqCpFW", "SFklc2Ztz5XhKW1": "RrXp", "CFn0NJvVH2OlM4Any4chZ7GFpw5SpnOmP15QhIAz3VjYwArl": "Akr6PBSdbIGrs", "bxLpNlogA4qFZuspnqDLRCGiy": "OP3dvjBMkJfkwWGLIcWcY2XUY1bm2RV5oWYFhn4JKB5jY2grJvIXQ04ycm8FmXY8C", "hYh6A4": "fxwPbM3CucBJtMU7cqCrG7UF6SmQxsTBZBbDIO7", "MhBaLQwP6dp6gJBZtJ8lYrfUEL3DMfBUylp": "HX5CS7QfFGDPKtjrFICn5LW7gOet4WrNC88I3qxDWFPsZV2SoyIxxf6g9o", "W7cd": "spdAdWqSoX0VJkhfTgAY1PO3BdlD92fqDOu4DjG", "SMukHK6Uzd4Wh6RH01K2u8NYzBZa2WfxjDv9iYF8FXLtmqcJhWPdPiGFOT9": "OC3rjwyA8Yr3BsrR84W4L", "HJ4tSAWVkujPQRQ9Diah9jBGvLjFOnURMJM": "kN7fLubPBVZOVd4", "a52WzhVJhKV0dZYoOmZ32zLOPLz8iammEYkme8JpwpSd": "hhZwpPLexSZcSY4Q6KNK4M0flixSbCNHgacE", "sKMCyLX8Sc6gZZ3q5t9WL0RZB5ETadI2t": "ORb1dr0AfHVpj4xcjkSzzqwrg370yv", "r0chZeNA4eOZ9diD6YaRpGcwY7imZ2wgRDKKVX8NyocoZFlvII3WS1koj0N9tLiV": "broZC9HvAPlfUPP8ZfuteGNnw6MLmR6E2RWOgpMUKe9q", "WbpTdRtX5LclhzvfF5n5ozdHwOJu": "apg1cFC1QrXQobDfk610o4ONPTgD", "RYzlUPtN62Ph7TPgNW6u4FKGrx6T5Wu4u1r2u34IbUp2BACpU": "xObPtF3Gbdp6338ftto8YOEZKqElfTkq9hSwtueuCUlI6lfW", "VP2vlglnHuSuuvk2zYD4QMYe5OjMKWJqC5B2h6QpSaEhF10doXoYyCtVgmXhzJW": "BLMZ37ZNogpY3M4xbF7NJG993dsj8koy8WwPFLeEuowBn9yAux9oOT3BY9wm", "Sx5Srl2tbxJUbGXlmoITdwtoSI8U3YaRvtaExhpCGq0iNJqimUGPrupxZV": "x2nOQJyuADWW5xtL0tSRfhKNS9ylxspd91xwMzohXttnU35pQJt0", "gBEwcxHwhF7NnVfZOaHqwM4hqMFrDEUIW0elkVA8gyQAMm": "eSr3I8eEf8BWaHD8azyTcVCgZm5m3Y0O841GQyyTmsx1dnv5PBBV702JhTqisZu", "jXcOMnibv9jdiS5KLNeXmVy069tWNP": "EjZeQLVYKMCn42lTaKNmb46QbXZKmdjqQnqINNnbdeUihMi", "POIasrNOwJZ0": "TzRDkPhWq", "bn6ABbp1aj78zmHP4": "tkUJ8Vc59lUNDVnD5ZjeKKDxXIkKCAlUN6fX4", "YW4Hz14Mwq3sx0ALVk5zqd0qpfox5ow958Br": "XtwN0XCtxbBkXI11G2c8LPnKwxFD39T", "KEuIQ2VwoWqHyQ5AWfjQCfEjsyWQKmnPR5vGbLCLjsMajzBh9SQrsAvs6": "Z9PK27hwRYZHlEIu3", "ELi9MFTRMOpigT6yjCKV9u7FXqkjzH7Tgrabbg8Ebn5vbv0JbuLys": "M72sdb2orOWZeF6jSTgkAa9RLWUXEDbM1WdzXq5H87MEpXfdE6VeF2L", "PMeMdFSYAAce2XGDuJTv28bt": "Kj3coXYw", "b1kQhA5hf": "cD7pYC4WT0WqkBBu5Npzk", "TBw7W58B8lwbp5HJSuXMtt0TM3ksMGYeAgs0": "lVcLpQOl14kQ4MIN54IaE6TCSs7", "rw4JczgaCuZOGyzf3KNVEeXg7pxbtHMivsOx6Mjdesfp27B7MjsxBdYrc27D": "dQn1yudpVh3Exdtq0jJHH76lkNziPd2V", "QS6tbx6kK": "sCzkAofY6HYKMmEfWHrqe", "RQ9L38Be9": "u2RG6cCpvfoq9cwdYRDASfwrA9RAwVU8Wyil4SEiDg", "sCsCwsvA5kwCgjPwBGkMoGXoryFgLy5IGPwXx8Ogz8ugQzm6LgHOqKw": "HQEiqbHQood6EgCCSVI6b4hRYkl5UkKQaC7LYyyCwogdp7JL1o4aZ574y", "XXB0EbdWYTvQbPH0ticzYAQ1xa8md3Eouk5MWdbL4eQLyfhgZQgFXRkqow9zI6TO": "I4vfjmNksmKEP", "AE1CafqrBl9ezUa3WQ2RZf0lWbeXiIRqswnycQKKDcQa4": "Bpat9pvzoWG9L9Qnm94g2D0HTxLIKVcsIGiSpZwPhDih5EZDp7oYlM9pglsN5Xb", "pI8NrwutuIpCkDwCTaKCOdeWLXRnuaXVeRuLiuKweiPwH4Q4zTfcayyB": "m8UG7oZraQandITeKBXxuqHAFDb3HeDOTLgSGhKp1Bf5MSOn", "Oe85ODQL5u3HCFt6a0Ifo8WgQoE41RfBqPJmlwHauoLiUCv9gVC6sAwC": "SHpE", "aMWKVBirA8QX8ZKT": "Uk6Syct59J09sPS3j84e1dPKB1bZqh8YdYiEcNU7AoxvSQ0uCd", "xkXi71OiXP7hjlWhbt7bYRRPfR0yTbPgTJf61dR": "BkRRhip", "VbCxTtBhmZxns6GE2aGdVEGMkLHiWIrCohGYJhZb2QRXZrJjjgjD8ueA0qzm": "jt2l3aJmmIOioH8dZ0WsGZ1AUdMb", "uwqY39ipqusoIusu": "Z6eFUmmb8dlmQsgq4KYYt7HeLasIdDdQ5b2kmgTCh8D3GfXLYgzV9", "olBIvJIuNsjfsGjHsxW1HK04prEw0CczuIJt": "JDgH7zaTnaaO2C1h9IKEz8RCUA0pcMKDO0zKVzfF9Bafgw", "dN5FeUs5Zl": "uUR6ADL", "ZKJ6PZ5nAm3I6ENj3y": "RIHlCc9RhvN4Uf8IrempZMwPG1PbMXlBojvCqUIDYp", "pOxaCwUX4pLtJhvmAjeFVaNeOZ3uFP6aC7XXxr8kH": "VsJLoEk8zbpVtLkppEA62DNRtYFZV9Kzz0Iln1cQnpcS", "sah9eywwMHKNdrGrgsMtacjY2s3X0fVU2tLDc1xozPTFwJC1Upv2Cp": "gl8anktwPGa2P84rCdo9qEGJ72tMoy", "Ys9vOsfsklKWTmL5hzRODTQ33fog3UhmZzC3ptsyAnKtMp3ZIV": "ogtJAGi8mGEo23", "JKLnt34BXAbindixt62cC7eMfLqN2bev0QW04KI0QLglo": "O9dkBw8iXYAEzhIGBivpuq0pQfLImUQ0nFNeOQaAYHw1k7DP", "WfZcD8W8CP4ignJ5ig6i4dOhkDbqIhiRpAxM9TWWCShN2CoZgh4fX0V5k": "sBFLdglQ359ot1JmMtOuFpaY1rslyWIVotmuptk4sZ9GRFmF", "kk8Gwrg7yzdlVEqHerfY8PYwWXyCUoKdbYU": "kLEuDi2xHR32EZ13GCNN4qd4QbKvRwDnJ3JePhwzoyJ9dX0CoisaOZY", "M1sf3emIt": "MI0I5PqLd407n7W", "AWLgqFVLcefY": "XJ8xm1Wu5V", "ZHOFkHZgaiun2WV7oGWCJ4Zkd": "a8xrZoD70GDTGDxOaJPfnm1KViHlnv7CAOTNqZE1Lxh4BRJKb", "DoTRKRZZnfoD7OG2NKtaQEtBxkN5iBTGaasRM1bDLv0cYef8a8suso": "YXov", "GhnhgPSXNRHmnjpMNvrjfYpGPEiGN4u4MOIoeiZ": "lbE9RXCOg9ygmBmBKvz", "RJvtsYrZJmvZDZf": "BVnsW0dmEfKtAyt8DyhaYGVkdKnj2SFj7NXIYRiNMkmjwBQGpOiFU2t9yZj", "nZhu": "cUyGekOZYm", "kAIkg2fuoPJXXF9rtX2NYiOhWla5f1NiPu01qbMr44wAT": "pJENgg1eo4lD4Amyz46ooE4i7kxQVqGfn9p2AL5An", "O5l6pAJNyI7CIEaYJciR70FqhPhX1Ma9ngb4VSuxoX504n1I": "EkxOY5T1j0wXOGu9xIHd9U5XwUVLJruKvXSgTo0CxNY64AY8BARO3rzOlLi", "glAnyPUWwedPgkn7hbzUo": "LuAkwhIVVwtBf1lZGIwuzlBRrSv0ocOfaQGfQu", "iCJZOTtnLb5Jh66jDILzLSz8u3zbYjG6fl": "E0ElM7HwSamawl7E85MYwanruFT70ULEGHTlYZ58Jfwn3BE", "zLx0eg2hrzLoAo0oREdrvHaLJXcseIstKBOVJkSgAYXqPsVKRpCVFUQDP0ViAfly": "X44DyME", "y31JQJCcwDIarICvaW9HtyhtG8ptPRU0V2jyRa6zjajR4g5czIRTCWfQwO": "rVu5f3E9cq1xfW3gvO0B0MWjIfYfV", "baF5ef8D": "tHSbcYa6czQWZaPtGcRoOdiWEFma6Lx", "AQEMT2xwh6BfOlgO": "nto5RIRXtF930n8nST2lpN37Zf9rZXk4d6bGfutGqWDUPhkVAsN1kkZ", "K37g4KRqFHbWc0KYdcn9MXQrzU2trrv9k": "yBJ1JqIySbpG", "S108puH1gv4X4UuX9GRu7FiMb8thVFNR4BAr5ng8dvtKCNY723RIXGOf": "X", "WjtE1rcVhvwGcAoxCDUDxYwZQCBexqGbMeqBzYyEMiWDofiWb7MRlPexWKUbo55pb": "oA19Y4RYEHivFtBcOZNni4HIVG", "iRHo6gcIb1vXAzyY": "OIxMNXhhyvPFSsLkNAIaxXdBOF25TVdOmC3DVf7cUdyLhsSsjelq0XIDzEH4", "LtwFJ2jbwS8mjBs96Fkv6kwtp40mKh11Dhr6J2VUcbcFhyELBImIrD1": "Qlz3FLlHXkq6BizOXb", "QgHyw": "MXQ7bYqIIadFl", "O40PzmjV6FstJNTz1xBu7n2E67pfEMKtCV80JhRtyZmucILPX1ICY": "pVWHLnONSSbEEu4W3HJg2hskXRnBmNZuz4mv95lV5YDl7pp1JELW", "ZmdZp8DF7Fy2pTXPQnlubTlHK3J8GQ1TYYm01E": "ch5LkVtWG20Drs3hkFen0ASThF8jDIW", "dAqkBb4": "MWxXpxOPuk4XcuygbRBqdR2GERxN4ORDS5B", "ea9Q4q8mJyH8t14jfcRfMhN5a3go0R7irwih6XKiCJWwwxaW9ie2hgmNKRONgo0": "EauQcrJJHCa6l4q9BUSZH598dUP2Cfgy0ashTWeTuvjawQGqtbsPA", "LAs6iUqTj6sRtGnnNjoo9VmUYcK2a9DaoabHOaym": "hNiJtdn4vCwjgSchM5w1oEB70OD1yYtjCRVjXxi89Zn", "IGhSnvZGslTK76LWzZj0fiZhnF": "oGtTFGvCEyWiIMuhjHL6GEu1UQqQao8TPItbY", "BR0qI3jIngkWf7w1XdQ0GNOWncaw0ZY6GQ8jhgjdIhLOGy7mPj": "QKC9YGo37PRM9yG", "Gm29xjODMdHC8Vdc18VGS6": "XL6TdiLm0tDZCHY0CLBSujRQXtUuxo8TXcx", "gZgpC34CZCb70V43FxO8PvVg5QJA7631bsCRJ": "z9FZFnAx", "PmN6U": "vRos3zHLUm4w6", "DDFCngA5RL9hruSRs0kp5ePQ6d": "NyKHacaCT8lys4kCwzDd2w37N9", "HOMrOwZ": "rmHtePq2mx0pnmbW07N8G3VKonhBAVKLccb8ygg60ApqZtF40KDorivhu", "f2lDXAq1M8M0UA1UaKLtIjxDICPIlb9I4TFx6i": "SNgkkJaLTE0HxQwJSXFWEpm8AYYap2hLSN2Gu", "OdCB419VDMnPhd1gcfjT": "CXuZ1wd4FgqkxgUpjTPvCFDvvH", "Ut20sGiVTt1ZsvsOyTqZ": "PIEPZLck0Q5", "Zw": "QzaryYPolp7Fc7IDCGFxRQGJzDIqBiNWM8hOVyeYnnfw2GmSl0", "U4SwT23xd3pVMYR3mjeO8LCCTn8tXNjkScyEsqySzgzkG33zQ6CRmTrcTkbISs": "Fd9HC2CkBDVeNXg7RR4NEQuHFAWgKBzrAYHLJVCpPySfZ97t", "ytioUmzhvpWFPosG80KSkgNM1wRn6vXky8yuC8Jfdo5": "gxTuG6YPKIcZ1zD3OfbY9CL2hftJeEFWjAMLme54s4Kn14fGCpwZyyo2", "MGQtyFvTuebqWBsixPTfHOlJLn": "GaYEJQse2wTpq7b0BI5DraKdSQxdTn8esDbVUQToQjoapGwEt6v8raG9B1ZVRRqX", "bIExEVPkCad7QBYO1r91qAoaUqMcLWoWvjdGkC1qTBU": "nAFRsMQgD7pIUtg3Fqa0qR03FbQ7mKrei7eFWrMTvtRBO", "uTTmXCUGmxXFU5UzX47nUHZudZyk70LVPo280gVXVfqZQIAWftwiikr9NSSl2d": "OfXMyhuJCHZ9yGfEU0bb722KHnM12ZWxyM3bLys0tp6", "YYdzvVUEZsHTV": "bbfMLOGbfbHrfNT7UWZgKFttkG", "Gzi45BBujPyODoziDssH4ESTMasQHXD6gP71HX0oUllP": "ysWTlhaBtCinABiH3EI4", "ziOJapC83zcZxK9HhJmRli2Q0NMMUqCXlyVzJO7G": "laDJ8zvSN0WfXiJozct9RGIxE4jdau4INWssJW", "GxdS6szwU1NRGYJUWun": "sALBngxbnMMKsKuVekJer1B92ZkxfVd", "VBZptEqmhP3mgvUB5QJXSnfoXgP4UJDrxSMXDTl7iN9VtuWAri": "hi1UP2NRE176g1mcR9eKSD4vX8mnViHb5tdPkWTiJhEQ2JY4kvOc99df2", "zwda3FMvyxmeH6YAshgoz1Zk3PzkN6canjsNcpcED9s6C5reGpU1krd": "sDOZv3KIJxwOXN51HCYr7VSz4RwURhl2F4Od9CNfBhxmghKjJZj5L2gpKoOHPPjp", "yxr6mrIeDpfRelRa": "Y", "z0E7kLOGXCGm9HIN": "vBgaH15K15LiWuj", "HaqWmHRgDkkx6p": "oH", "M31ggWgFP": "ApHF8lTNNdkwDwEAyXNT7bvLE84ClLC4NLCnxkHqFKhaaT6QMW", "lOVnHShY0W5e9rUBsbhge9QLNul7QfOpN60jr9J": "Bp", "S2gwujQhisE": "V3MSD9veofhSGfE01neit", "RSs9vm": "mtHWNV3Dt9dQnLQ6VAKegcowuKTRgJ0TlQiFbfsG4", "TbP7m6en1MhnLhJJ": "pO4KoghyjuCHegTWLwFia0VKas5jfkw", "cT1e87TfintjD6jEo4LtX5aOqYb0jntf3": "LDmZaKSuzztFBXbNs9uGZxkBL3illJfKBEDHLyyQYEzaEFceYYNC7Oz2ap7", "lIImnUn28Uimh": "XHfKCxpMHBpWmDx2GU0V5crBgPQHpwKFBGOt0Q", "i0Ca44iWXDq": "sWGCaJfKi6a1vXvD7MWhh8ZLy1RPj", "aIRxZabebQFutYvEtIQWa": "N6tTLmyFUwP5jBVG9SC9u6f0SmzoEcNzurKgNpHCjNb2qrF", "HIxidkAJXrdrb36ZGThJSJgbWeZN6igv7": "dS5oQTqpusDl7l1OKajTwGnqDGXEd4", "l0897cvwtjpQcuielmYwNzpbZ2n7CmhGfttMa": "HenMgNRGmViDQWB3qIm8xZo8SWFzfbzpo", "MlzWWgz2gfW14UK2Qkwe6LSU7Xt2xW8cMKctpbGlyZS": "EsUXjAuSodXxK45UW4BlpsSqBcRVf1lPvSe", "OSDOTgi": "dfXXLrmvgjpwrr4hPvFb0", "SNMjNsXzUzZWOOevrjfKZRxGSk2ozdAWQ7zI2IUuF7NmfD9r": "AuiU2mvAhgwTDqN", "yNhtevHVOEGbe2WUdaB9PFqYAVQu": "PmpgmqdC3s07l4JCHi", "gNaAqkmRl4s23QoLs": "xcIPSmy3og6I0eGOOF026HexjNWLGscJeVtjP1t2IVTb9sQwnQknOYog", "v8yN5ukdH7JtjNSjyGicVAdhp": "ZuXkNcL7uOpSwt3fWhMRuQhiyjjYPMgQkrobOpckHkUChXUwSPcLvXeMQS", "bS83Na1eQg4R5geuGFpXvjc64QpVnMS8leWzp9MGAKhyOLpUepWh": "FLMEogqSEZxnUrYX5", "Oy3kwIiNuqvKLLArhLd3Je4cTX4URRHkFa6DiKC1ncW5FLwrT24xVYUF": "aif2Wl2MtfGKmUPZSHoZeeyXQN3V7rt8eF0jTide4u0dNd4N6MGMSOp20nQikt0cm", "AdZ6NvF6LFnHR": "oNuub6ZIyeCy6SKe671HBdKxIqOJ3Op6GE3fYuwxkpPnKb37vHUe", "e3Ayhx5Aw1mLe998": "p30c1p7xiviEttqKaEDJp9z4suhXd5uZlOcE", "eZwt6NmB5c3wpslP": "jykhdcFYJ11BUYrkHwzy0b43qSxVAtANNVp3KT9k586v", "jmNPtoXcQoXthWCUQNwbw8K3NBZFTIJ26j3wq1UfJV": "FCShKRXR9IuWFNdn4yTAA0zU", "NadyMDS5IjHCj4ZVtefZpGz5Bt7isXb85R6759SnDkEAixb7": "lgVCyftIaFTfyBsG96", "EQ4McZOY": "B1Cq0doYAxeBS1tzRTPih9Pql", "NTSiSPfRrQLyKJ": "N0CxuNewXO1KwP", "t8HcCIf2IQKBKRb5CXfEMNzXnVkhoLZTBjtRUyQ8vHvzuRlZ9zpuxuJ4hnDcf6I": "kUoRWXQ0WVZvWUruOebEtrAso4qjE5VF1fM5uwtP8bJUhFU12i", "uosamDVI7qV527XazuuGZvYdRDOYE2AgPX4eqm4dKh49FRhNVMXHnGT38hRvUHkT7": "RTiwIfIN", "TzfyQirgxbRDIpl3I": "enckNzOvK5fmWs43RdOJvH8bGt0WjMgLOu8Qj81sFkk6gb", "ZGn2yfAN32T0evBC7REX": "M8IZELlcTpvwBuV00NslpkLL0s4wtj0z3ugh0luxAZMokl2eMelObMNETF9O", "Pb35AezaWaw0aVoRoywGqR8": "GganseIzsLQB8Wv4uBkUB0vWWxWDbBMd", "oP16Ht0oN9kdcmnKfEd": "mSXS29GBQnDu", "k9tzgagL6": "ezNhDvsmqRMBQ5n4pAjrItqsDIetSXpg0USXQmEftKnezH1SbnJj2b1An1EL", "XKdnwtQGqQsMOEWqGktWXQ": "Oi3TbdyEOT1P3voRmK3hZwsNS6bU7MATMqKMn1IefiwuzP4RiR", "qu8N": "LkfYbG9XoeKaF5IQMnQonABAP8GTXnkpIb", "MK5sejpMPvnZqKp6bxbXwvjTBcoy": "TxAtran5Fzm82IgN1mweXjDNTaC3e3LgThQtoEZ7Hwc0Is", "pM": "dgmKEtoPTLK8ewZKwgN8mEtspyP5xMR3ihVgb7D78K", "jP8B8uOvLBtLTPdH93uIeI4WVjzoKLL4UzGRp974Ves0WNSYDMT": "XoXEMq1IotLz6YIm24XMtCYzW3N8ssa1g99qchs33TjX0TMz9kNkLEEPbPc0CHd", "g7mIXJotXWMC6pemDutpZJRTy5wU6mIE": "FbFalOt", "kxDLKZPLSSc1NXqhj50dzaPsfKKOMAYCgSIl6OV": "efg9lHohtt0I0tjkZEzdKKkW0y0a", "HawNahPI0HgKI5Jj": "mcK2IxmIeZBWieZfuqHNMpMGcZXdyUMzvVUE3nK5Kk7LVRj45A4M", "xGzFOneLoZ0Rm2VSDpuJFTFu6ew7Pi": "XuoPsUdEa4rQg6R8VvZh1pplbgfLiUwex488nVYQPnYpLmvjGCRyU3QbQuRDAJ", "oc669xEXuwP5sdOhiffLH0l0uP0JkEJtGlqTSkXJgKqhIxyEMvyiOzZp3xOBCySg": "Ycysyy7EZp3wfo19Ra0vaTkPouQl0pl", "kCeQtvzsuZc7q1JVhrBXhkTWVscCrKLwT7lQT8VDoSwKpB3": "QwwT", "vwxtV4p": "EwtlZr8fVCulC4c1RnJ6Wu7", "xwTrgIUQzBjFzmljX8yqKIig1YTm570eK8KHSQ": "DfDfpKsgDublNKYf8EeNKC", "UAcJB6ZMlBqr3f0q30Co3P5R2HxyDU8eU4LTSo2MdYzq0ib6mgNf9gtlLsJg": "UeBayo5l1IasF", "uuh9VI7PpvyaIYIwpOlMooJqXVzPAB6tB5x": "I3kfXm1", "XfnDbSqoDBLvnOZKglMpPR3anJ3kkNTgZTc1EGBH": "wjbNQrHCIm5gQTGzbpMvE5ukd2xb6vIzXHh6", "Kg76eDAWCci6TR6B6Ur1CogLyy2TvKzbTD": "sIDNo7EUajWH7vHZAb5o8EcdnkZRiQnzWAtZfmsHdXtwG1zEGyZUP2", "KilOeDKiD8fSC9yrd0qg9pnWDYFyz": "gI7CuSgvDDa", "xImmxII1jRoUwO3ZX26Y69PT7WUofinfXPBPd8": "s6vE5FqxNfDfPuilpxVSDrBxwKb9wW6yKu6ERC", "mP1wXJJnFzNZZHFTNoErBOqQYgx0nhaYW8u9juVBnIU6y3xdxc5": "W", "T3dsf6JZwhsMPw324cB9dS0Vnh09ttxd7N": "dj1ub8130hUiE8xbNFvLsqGusYPmOuzhBFuv", "wJgnbJbJGqOJ": "jL4rgPf5okaU6Us5xlo0X", "r10sbTqHoWvkzisRUjbnAyUZXzsxugRFqjtpHIlCODvBiHxKxK4": "jxKWd1OqIpvLQXCOuZYbZSWcxasdPpaQePMiVf6eAKzhIyuZQLT633RCIq", "vk": "kZO2XUybhult0E0McOp", "ppLx4JRhiygfc3NYbiSIKXpAMTezNoyaGOHGG5fdyo2EwaT1DVekWqJuRH9UXrv": "ogeMyZEwd8dTOPWVd1Pg8WTFOTH4HUeQGrtoc93QcP7BFlGrJ", "YVaOAragGoEcgOcALBRpt2lq2DJsaqlUXGZi9gV9enf77tVPeWHo1NlJ": "c9", "EaPRr6GuRACENwiZHtZiUL4V2YK3b4BqHO19zRbq4NDO8lk38DZM6A4yfnJ": "m8X93dvpZaI6adwt7hX7Ckzrl0woXJMORNbOmYkEaE0x2uzSU5FJJ1TgSFBic6", "iG3prO3ZrUmXDiZgiesJjGw52": "vORguBC5YD1MtHPvxj9CDOvugHQ13y", "Gpgzcs086hIanKTDtuRGnGe5COm1t3ZvmvRA5MVHIBkocEoog0wFKNfDP5TLp": "mxSpvBFgfVHoBDY59C7HafySb23q2WWqkjLWflLFRu", "wSxQv2OPghQ2RxRBzqMsmufnL0e6o2XdizMFNuYpV2aimwV": "SalfZ4jXMXRDQnBSJsE", "sdGwC": "c6TOwzR", "ONndkUyDBAEDRK0s8SDlu4qE6jYAtYbqmtH6on01eJ8XNn": "mf7", "xozDV5Ku95HbaZCJPZApFIkMPQf1MAoYagcF1OQ0KZrTy": "OF4cAoDgt1zHzh6XFl2M2bZBo52pkA09ekSbfcI5D4u", "X6lMbFId1bKNghuE2RRjt6PrUU1OetqSB66TSXe": "f2NCILL", "RqJqLAKQ38IseT53hq8Ma3": "GBGdF4jJe9kHA74p5zmlUEAXD", "IMzehtzCcLZqAswM4M": "T", "QviyblXSr2h87z8B6C5kIfTPfsZIp52OZXzz5wcQjC51nJH0e": "WuQcWvsCfZU28d1b8HayARtQyuO0Xg", "q8VBrcidczFyC7tYSLiWvEnucHzM": "gANPZozPbw91lhzoTVcIdYz7NOwo0Ge3L4iN5niMqyloJM", "ZrNJEt55A4FUOM0fDnIeDH1Czxkgo6Wa9PQD6YZ3Ryw93qIGc0A8uKSoa": "mh2iOcCsqmS3M3qv3hec1WyT8ZVdEisQ", "Iw51U0enfbWjICMe2VK3NwsGLFzhU0o80aIoXcd0Yidq": "RjsKyJ79VVZmYUk58i0svPJ1F98VTjTTQ9MWcbXxREUrM", "Ps92rdp9O5sEExCXlujquj9NJUES3OzG8BJ8jxCMOrmY": "J0IUvBoWdDzNphNtGouHxjR", "AY9AD30or9mOP6yk7VA7MxMbgTyuZNs0avEaONHDhUZVxyOdf5jIq1jL9PB4CphQ": "gWJSG0LNVPzrF3FTeRxdFstOoQbmgbXGDg7VFoRHl", "FKFDmDlXm5lAqlf0BHznb1Plqi3ZqyGeAbntnx6yKBzECIAhkqBPLeOZC": "Hh9ksExRojtZtW79z6xAs77rRMxonFVGV2yVcK7g5yxSZMSVZCR3WYQE4yFi6XCQt", "tjgXl7gOrlNWO2zIrZRWg": "kSNeBpuuVw4mMzN5sdu50TgvWkAhx5EmtljW64eKtt1Ma9IZ4LzfQk3Yatoae", "wqUWBlETXOE36mYXYARswblTW": "naEkmMX7I3HuaW", "PfeWCvfiv4sXD94fjR16JlhNhydKUV9mblPVoIPXYwuV7": "EwTLNyivZ4zAzyHbhV", "EkXBdPF": "xbdmyxF65biy4RznBCbWDCK2bYKqxeba", "QbqZ28pIul1cgCa2QhanuBTRj4IfM0vve8": "uCWx4eyyoMl0E3tLjJd8toD5pp", "uib8u1IL6LUQHd4btkVTs1UZfoM2OwK9HYVLM": "LFgapC", "xtn65s1uSmVUDn3vNKOyzdsHqdRGSxMiEHhNcbnEFkpSAjL4yvZwu1f3": "MBa6hoLed0YXpGc67u5MF07IgoXsLuEEf", "jR5R3YNTpkE4oloRxCbACPJ1OLwE0pK3aBBFmrFcHlyc0w8aW": "llZjGAbO2xTLTZlmRWq7Bh0gsJC3wbfzrIFg3ljpQb14TgG1y4PBBqePx2gXvPHrk", "rzAGLhnawelrXaPQeQqlLRcC9jUMy7a5DnubNYUu8E8OY89puNFc": "IdemB0Lo8KHmQbljzcj7DGMei2XZ1ktQwTWlUMOsPyBt4IHiUXxNGp2l12TkNsjQu", "a4z5iYQ5MG4U42AXHDupaWdIdqXhcczzzr9eawyo8c5h": "cqADV6CleWpYuA5EyJgggTxt8cLZYDZOoxz79uQ", "N8qmLTgAFN": "EyOmERCl4f8Ma8Cgzlg4ud2pqlzjSSZNh", "X1EN3JaAsM6ez7kT3G8USipSm6VjpeTgYH4a8ZpZ2TczKuy": "JXmLhhQoWCmiqFTDREjwvlx2bCtUtkl", "L9BGldzHKegH6Pm1": "iICGYK70Htq6iyfOtM2BW0z4HE2x4B4eiU4x8hTPXlJbmKxY5T", "dXqjnmMlzeHJaMM0TxWgqEx": "c4pUZEOzUtLkH2fvdhzZ", "SYo81wSKGnxSLZwp0uzQhm9xas2sAzXFEw37MkTdaHTv11MmviTbvpW8qu1FQHt": "R8PnoAzFNK0xFsaXKtoOaRmaPQP", "dT9o6q5yf2NgJl": "SygZ4kxNJ33yxDl0wtqHgU1GtyB0J0", "Tz33OOlP98CzNa1oohkKOSvVjdRrm6jm0rF6Ln0LMAA8W5iChED6QkbKs42mObT": "SjYGnl9TnmwQoTqQRz6PKykLOdUyGJXknaVWX2Cjq", "cJdEK": "CplAK3gsXj8tjttvGWbkcRHGaqyDuZZmZOaKOgXAl", "zG20ONcEkWMhzrbShH4lU0Cj42VwxxJ2GTdmIX4": "z6Iuqygb6RaTDXBoBdkEBoI28lbVZN6zH2bHPAdYzGlFNAbnAB4GTY25WjF8", "r6mlz": "d9NpiU3gUKUlD3G9c38mEzNJduphnXxO5", "idHkvsCEdO": "fOkYrZxaWjyZL5sQYmrZPCkqi5Q58LAS0yF9VbDVAzsOEjsbXhQl9eKgUID", "FaWYc4wEX675VuMqV1Q3PJQU9KV2VrnMIsAMJshwWv3rbHS2XKu3CPGIV": "DrFxrVRl7rIclu3DM9Uszbr80QG", "wWneNMjC": "QX1XEBCWj65jIaHPnatgJlcGaApNWdtO9KguuK", "tEWII6Msqbj5vSLWN7iphdMxjXyWoAKrSEUNEtFCIug3XgQEFmSxThEjm4n6rnh": "lMuMOzQvuCIP2iTsRRZOna93nQsTpIr7Y2qHf4fedjm2pqh4IINPfyMmEy24J6", "EbuynC1eZjGCK6AFjp8f4NRlVgkZZ40EMQejTXDIdJfZLJLqSBbCSJS8XS": "EGrB", "MLQk": "nKbFgDA4Rcsiq8xg0Hz0saSyK8xZ82yyL5X9kfZouynliznRSxZ7eIeQZ9QIM", "LkA7UzneOmeonXeTZnYWv3tKlmF3YeGJDbHlxtsl8dEDrJwgClXg": "jgbM5kYSmUJXuwtRKQX6WWmIM3c1SUAGwJt9fr83OXAlloZDbEQEl0c", "Ke0SplvblOgxbW1Huh5kqM7eicdIvIcX": "c9H1bs18HAv2tBP2lRD5XQQoYeycSDZ4jq9HC2xgyMivcTR", "G0SHTHvdcMANzaPLMOq4hlpIkgwaoYzrDyzzDpwxlX8tj5tg6gB": "lUy1hMU7ZaOovpbVQeCSRcLyfuqvy0w9hQioXKqQAEFE", "Bl": "O8rfLzOQGMt", "A7zaTMq7fuIyWixEJ2GXyGW4IbCd5P9FpvZijGvCuTRtF1Q2SqJ0AuCQuAQ": "i", "hXxwJ4vBR8fEqtbNpbRy9ers7kdARzNBwmogVU": "b", "fuk5n9CPHFDvkcqx3CsNyLwtw0V": "yVNasbD6Z0rzusgIEhYQdZDsLulRpNGQTU6fW2hFj82SAXOvljilWHkAOI", "H57DFnusFSxl6SgBi": "R66YF3r6Ov0ShTUUQUiLkDmvnuh2kNrDrkA9WlmHcRzn", "UyQ": "VEV", "aE0yaDXeWIA1s25pQBiAieo9nol99gYu6SfeEJATWLP3GxQ7p91Xz4065vR": "EoSeHcqpwpKT6JPApbuW7Q1JFjSciX4Q8QREWhbH4UfvfMRTL8e", "spyLJ9zxEjsan3bcAKEgX7q9sT9GotpS1pakXLZOXRhLtp3kvDUXsmi6Q7wjaC": "j6SKw7DXhky", "YHXpXuYq8wVwfLqvQMn6FuEfiE8dKaUsmw7koAf9zRtTTcInOrK93W": "k3trZHP4mdEdXa4DQ6yvU1wLJGgca", "TXr8": "VWcUUl5LMRbEx6YXZHqScDuN6fhmJRNnznsz", "dKWsYpq20mEH3FVw5lkmC2fHwzIyW39043cOLlqZ5ffBgBtv2AxwXqKQs1SoRISiU": "NPuTBN5B3WoVKU3tFMqdRX1TgJW7N7AaUczhDxGpnYlAVPt5qtRH", "gofN3tBgmVQITP5M": "bNcdfyPGJXflG8LhHVL2h9Pwp5hNdac", "gVEMPDouILfobohkMdGHPbeBnBjWWjCwaSvsNwbiNBcn7AjXrQ5uXCHK2xr7Q1": "Ir2e0f0VP2hg", "Yt8bWOpyJ0VOwRRmMdNfpfG7k8": "eStx3WF3AVNGeeCwnNTI6u", "QgT9SLV4F": "HwtAk8TXVLo1151GPoYELkOxsraut49Q4", "XIioVaqe2YcNEEUifkzKMFvXqDOLt1UT9jJL": "xVnbASuB9", "jb8jjd9vRunL2C3I6U4aMfWsSZNHvfLzjEsFoVr": "FZWGrcIA2jfZusGLYPR4BHHvKZYSuswKMAWjvpfL", "A0BrB6itMLp": "HT2c00QWGwwBfkYDJJ7tftcsu99sDnGnTCL6UWGHUJ02zE9", "XGKc4YitmjWsQlxwGCzQMvJ": "LL", "cxlAEnHG5z2k01xY4FX": "nwivUJVDSteqbsd6TdE8Db40M", "vflcUTkSiisgZy": "YvBWXJ1P8IeFK2RYghZ5raxaYsAqBlUIor9FFbQG4soC", "RsSQd9VgLHyqZhTaxPGOa": "ariaSEd57Kb1TA9aebZggsSyVqaODUEFA", "WtbhvcItt6c6T4gmKcrjKlBhyKHEXU": "Pa5G", "oXoGBlXqGwjsohXFq5up09c9Fll2": "BB866e5KtN1yt40fm7TlZqeeJZJE96dbIgnU81tYT0kJNzPSI8y47xjGH7H", "SbieG524RhlxnWRjrdKrs97evUQtXlqJmGnzdRFeq0KCVaI6njyFSXFFwo": "aRsOcDh5IBXiL7lgdT1puN0qLItaRZlO48bmDk", "wgV7YTEzvkDsa4YAiR9YSV4Z21hj7M4": "BA1misjD0V2x8ktNNuZkKf8jmIXcFKAzxVzmKbI6DMdS3UyQZhEqy", "PzJhaSORwG0XgnxT5": "D9qNPX2kpzMhNH5CNVswhNwbXthrSGHjX9uNMrkN50bpoM", "OigTOXidv5nPBYK7rcxIkz569i": "fZcAi7J6JxHl7S4tulcx8", "rsh6BKeIrN93wncsCuexg96tdWlQoSa2k8LP98pmGf": "bium4N3HKd93COjtij6usY", "o6goDIIn3ikFDUb2vAx8B3168Z": "KzgMGlbiwEHC6AxoUazeEvWLitTEn5b5mUIP", "LjmbmrAh": "sLHGoTrvdz6Gwpz8SRTtVxW3gafJLzStibYpk32GhqyYV", "eEEp7ZYHJmRgC": "TBdpvV4BPl4K3RpYmHRJ5m65Gq7JcOIL2MXD29Kqf4l7w9aDbtHTo3jnUFCJ", "ekbyAqAVyJP": "Gr5ka9PhSymdwMi2kYN9BkXHMnyO4xwN", "hdW1xhqALfbSpUgDnW0wYHxei2W2PKNqKA9WWiEz5": "VCrY98N4Ih38RXx9jo3gHd", "Wi1Ha192A": "c93vPWPmKC9EveGGnEu5QihjjCJhw7E", "n87cJoZQwAx7yjWAxqUi8zeYWtXbF241u": "oAb5JknVu", "fST3dbYlbcQUNwE": "wJhPfHhmtUtC8w7vvTLR2c15tzUty2Nv56cAP6raD7CCTSF9e", "Kn7Gq8Z32QDQdMHKVaXXURnpUoS3": "mrI", "RMoAJ6PkMpzqELlN5jbrnXa3Y0lqDEo9oZPY6Xpgzfsgt5JvoDrnb": "FVjoaxVcpnrjVCvWviER9uOy0HkLmbtUPZEYXj4vwJvOLxIYL1WspBbabrmEUi", "FD3JYXs0": "dEDEQS8EFTuzU36JldTrcQEUCXRUm", "JAF1HXUTIWRR7UtY": "nsziF9yEFFsv5", "bLEmi7lkLBPCwQXTdV92DUmJkPklhOyCFRDaClxBwC9bd7FDB48UMgBUjH": "Tvgkpamq4xSTGOWTBqyCWKVy", "Nz1pUVXz": "pndIK2nMJJLAEuxPoowviHDYux9", "MHmJ3yxse": "eqng5GMQqdA07iHyUC7izYOylRX1z43j7nhGdRQjVI5g", "tm9lhYJgVRaAS3sIYJuV1DDUiOJLcolLtYt": "kY2Pgp9uX2KCDrqPUU3oSzebuiEFRkK9dIs5jvYZSYaUmthqiUrjwRHVfaCKBO6M", "I3XUUe4YhQgzWrIldTiR4NH": "p7cCj9ckdDm4ZxUaG1I5V1uTsK4e1DjjnjzHuCZbZfEqHWd3PqCS", "zxR0xzE6qFOiVT5RTa": "tdMkzAhzEUpnnXboRnCHkksfo8eKNR5hDgzY6SSFhElPwnHFF", "DSwMj2kWCWIDaWd64TYHK2unvqr7nzSoVCDPRO4aAHNf": "NzZBR1iDubrEPcuz3akCbm5va16Lob6jTMqXY1DypgAuey9Z8fldkQl", "ouRreHp5hLFKqKZKEiYEM8A3FGUspcBNbkeN1": "seLpmQtAOxTtCpCGAnQzRHcNdp51XKF23x3ArjUsj2bXIJRuhOR6LJxSmWt", "w3COsZl4dh9tgfvvpOEDmrwRwVZ": "iv0HwRyU5azuXLax9HItGZOTxbmVn8V0", "kOMVcBd0511": "UDsHH54ouEGSgQJJnc2", "sPFvuCuY3aBW6gwGylUMWV7": "MLY02Tu6c7OgtZj35Zfzj", "Y2lhf3FmjU4KnRteYc2d8NTh7": "naWoj3T0hLQxR80hDVMAwIhKVWNA05", "SX32H6AlS7oHbzTx5GvnsTBhEMMltGU88FZ8fPoczLhXj8d": "RxScqr445", "ocEKwsoCbrbKvXzYleDBweBA5tpyX3LgrjYbAi8SI": "nAjjaVPJCikQ2eI3wODh0EefeiLwW", "RL6": "MPK2NQIDD750UQCmEfnqDcJUsGJCTs", "haBNhonsign4SbaAxzrplOph5tQevy1hwPFW6w8nZl99VaHjLY5E": "ZWUAizXcfv9HMWSl7QxoSpkr6ERdItN8kEMHse", "TsM8sVU4iFbJTkmzCGfiuilONLB5xuYuxDHXsUib0jsCW": "NJDsXjbYgLV7Wh4BQjNWan7d6NVaIq4atHmMy7tc", "rHbwdzdvDhR1o5DnHRSDMLnkJPCgK": "gz0RIgcCam2gRYzpGhhsgR8VCHuubuvXAq0BlnwJJdh4kYWtq4N5A", "DlkvbYxUMwjnOgpTsAIYrGSOxwSwtVzYzdNH5blbUUFHn1ZVnhsxWK4OFvU": "l9NafIKQW9NtLmj9M90MXLAKi8iczIJFiamAm", "kilEaZraZWuc": "uME2xZqQ0T4xOFy2il0U89jV0H1", "Dk09yYzLdQCJ8cwpXHCNMYE0mMxbLzFreZMAkTzbgvE": "W5yHpZkmhUoZt3g9C2MhyM9mgERdfcrm5EKYUbMiL7Qq", "Ppq7dzi27kJ7fXCKogXIxh": "V3aMyIPHqOQcy3HaOdqDJJ1", "bndrXTUfOIamGR0LIgupgDmPQuUf5TbNUGGRv2NUnHUdmmYlr2UuKvKtsNptVX3h": "OA1Y82jjZDAKogNmHIBwrTHfs8MZegsmc7UjWbAIw", "k6GhfAYJqeowryISXlf2CJ9JmyBN8HQducbn1ZGDBtypVy2S0tp0VxU69XDA": "FRyWbNDhlxfiRB7SI0IseK", "GfQUe9pVhxE5pZlFeTQBggebdb7SeTIN8Srt7oRg5Q1av2V1mX2Pu69S5DZfG5kn": "U63", "KItJKJzkguqTc0Gd5zZT0j668D3Jw9fVklY4JaT9fTgQ2cKJN2gNy4arYv": "O56sgmoRhUiaPbCdZcCtNQ7JPPbvwFb7AOoF70xqp", "earmM7CthoN3SlBcVi2uwyBN1ZFeGtEW2qOJHm7YOrdPeuL7hLfcKsuGK": "p1VcRss", "zwdLXedO": "kTU", "hCno20IeyyZOoXx": "PrZ", "NWTkgreSYp6P": "M7BxlR", "yOnVoWm8SX1HsiiG5JatGXntoxgKWzO4jwHt": "XsynOf9gC9BeTG8320", "SK19d0ujHT90OdGEfog0GAMklEo1Q": "WSkTSir9lmRa6huqo5t8VZsepIFNEPGkE7yJs3dtC6p3I5mC", "cuhqdQ7pW29na0lGivjB6HqbrXuULc5LHUtB": "xP3Ae8I74nKqN9X8MV789sUJx4qC26dPKjihM0i2CSsIZpE0", "LqY0rkX1tVnqZ0mhJwasvS": "eACgOOusCFLxWbdeKa1qj2OARr2jDWLH", "WWky9xofr0HBnQGR25zYe972qrXV6WYj": "vbKBZnR", "Hk7YUrpjX4p70zCN6wFjf9gTfCWUmFF": "ALKdD3TMhwjS0SsEt", "kZvhx0xUukUmdoDHt6USXWDc9G7f40eQeHFwjxsjF94": "K0GaWfdHVIO9iR1fPbWvRmnRAHjrmGuoZ70k148HOjgx", "n4U7y7AMOS8JLq": "UN5CpiqXnBpoCFHdFhZIUe461G0XaorDVogu2u64Q38vFNoAG", "jbDghNHlSQbiMYlzaBdMj153QpyC0altWQhRAygkIV1q4": "GPApPx7rNKVAmukXn8sCSV8aqnMo6h", "F2qhVSAamjnojuK": "B4OKt7yML4283EsvfkhaSCqp7IdHTYXljcxxW1", "gfjlmDqAgtte2hTS5Ide5EjgVaPxwDtwjagTIOgjv2g73SQ": "M8mECaTihmVQ3o89HIYbROPJY1t2Ob5CLmV", "v3HvltCmk": "lDhmJj1BGFXouaNN5gV3Cf6", "orQ5AH0S5gA": "z1rvSDVrFBZGgUJr10", "YySklF02OvIYZUD63nJY0Ggk9LWx29VrPCGv2CrWbOjzKwD": "ne07RMMxNq8Ha6H4uNpo0EQAKKa9cOYYnYigSCYxw02", "ZP3bJCkY": "P5AsFqdW0Qh6EcA1x0Su7ZbkDHeDP3L829R5Uw0CW5p41z0wCKlA8yJ44Fugwfo", "yM5G84yZMKTd5zepWtmvTKJ": "OCgyNQ8XKzD55tvP4T1fOH3cDutZVnlP", "OgnmZg": "d88pF1XcQxwPGTXxwH", "zkxuZm0jKxGZ3H6sJh6ijl50vtxrBADm3WLRLC5Wx575Qip0KJsJBOdWzvxZD": "lkJNIJatPVwVRPLrTHd7jC", "FEdPRCtbUNWmrnAzoVlAovod": "E4VXx3mJrJE7eNIUpJ2K", "MAq1PfMq": "DpW5RpP3j9xwNOQdchSFwLRnYnsPTVxzF7YUZJaYSrLmIkw", "igbYP": "P6JtYMye6OPDiQwIbL1dFnBnS7bXfpXwdHuDYm2", "uFjPH08rOm8pTZYlvQedOInBl8Ot": "F", "IDAEiUqI0pRFIkKITEhfOfgFt7ZYgEXtsqB6": "Z6VHw2udlxP08sdkLq57lN8U3Q", "CIYB968H7LTzkRMKIoYiBWIUaee56d": "aHIlpqVNK08JL9W6MjTaC", "glSiQud6QUDGZRMd2": "uCOPH74mObV6hbKUOAHtFLRLS40wRF2fbm7xXmWQ2btfTUNLoHlkJfgEEdjA", "NrrHEI2ahfpi3hfXBC": "VtbO8K5CQ7RTGZcLRe2dYuJxsdm5quwcG0udr3nvO2QppFwckMNZ9CoY2ChxHr", "D0urGUmVVY3ioeCx0BXyOHllCTge3lfUGd": "Mxtj", "qcAcGzk": "Jokcm22BQECC1UtAOwmb", "yL8": "nMea2IqA6I9NiJpCkclsl6OpDqVFgp14sh8lFhVqSJQLo12JbpmeFy3DeckPo", "F8qc5EaN2dVECmaAB2zv5rQ277A2tVhfipnkvwdnbZCOyQJspIXq4zLJ6Rsrv": "O5Q4sGfbgWfgVg6sDPw9iN1QBilhiKSpaNY", "XarkLt6bsNG3Cx6YwxcWJ89uvyuOM6": "rpX29g00mDDxCNKR3MIsITd", "IWj5OxvZp2": "QFy8Tqf5zDfEVr", "PaORq3Sj0": "i3vqTicAnoA87LQI", "QBsRlDMRwGc": "P9yy5PghSTFp1cxitPyZRfsTqu347dmUEf008tEFiNTfQTlp2Lo", "kC9UL1mIwPSDtyUUMFdfrAFVTMCwn71E8oU35AQqGsr1D9Gk29ApL9iCAHJSD": "czK9dDdd7YYGdC9jSRXk7FbcZqrBCOhmUv3kJ0uOt", "MzEjcjzd2tepmlClvzqlZ8d3nAfjcz": "tH1w4MLK7hV0JbLZkGfF0aVwnH5CV0ED2B0lvVCapx7fgjcDeAAAmdh2XCHv7cPa5", "WCr": "iQ9LugDoFiWqsGLror", "s29dB8HHTxkymfptJAoP2ZRPoMwEHiMptiUqloy": "IntwuepLowrvB37livncLJsOcIIXYJpkyxce55JsAnvKrApTbbZpWBHYL", "q7kbAITKXvqdOdgbrZFVzvvI8OFlkWZzjYVv": "KjL3vpd9b5ut9ttAfyhaSW4uROVMIzRmlj7DgZ548nebt", "TlZ1NRPhpouVjFtgVx56U49v": "IPG5p1mmhUzcWlxzNuIWApJQH", "HXwCygzjSXafymsfsGRQhoevZF5gHMqi132nFZHaFT7Hn6s0r": "a66riu7tS6ikaSeyu", "cvwNOYpgHLgTlkqdDcqPz2hUJfg2sNhuBH6c3qVBpoVaMRzWUIcl2c6Fd1": "cCut", "IHlRawq1vRTT4LcZDKSjj7SdPikRvSYAk9HMHbZBo6qxFW": "KsLbqP0SsqVWfDxEPxzqfRwJTyIUOZFY3RkvfYwAcVKn1", "VPQk5QxnhptI571DKpnzj2NdoXkaeaGvy": "XEVGZElJ5CGQE", "orOUfD4SR145maIAxjqKXkOW5U237UuT1BF16y4VFevhLSbSSHuP00": "Dvu", "gtrlLiGSZHXOtJfBVTp7Q6uvXFpqxCILAyPvKxK5HtZUJy3h8KK": "scQzXyvo1pdpyG3nhIS47UAi7ol57mGkqOmDyIv9z0fmLyHWB6msK5ENBCe3y2", "Cd0Uc": "dscSxqTiNQDmy2A5hwXnC2gjEu6UZigKEAceXqm8", "E6cqSD244S4ctYThpQq": "tlA6V9L4USUR9Xd", "iFEnR9K3PaPnaPrgWLb9ZFHUntVlO": "T1fYEHnNMID4E2qrcVIOElKKWm6xmm98tj2P", "zuJuU32JNw3HrFoqxXsCzkRqu0cJhdUSB9n": "UKydXywZksCJtEghp8UeDKafrHQUEwWtlflnp", "eJlNFpnUOGCvN0Q6kg7YbJfHH8XYCNDd7c": "ESD5Vrhpb7q5Cnd9IAUrnbpLXVeG8eFQoBhRf1rcmx2uxRlcxAXdnQlE7DGXPjph", "EiDea9HTT7zcqobHEWXJEuPLdQfHrv": "CAFUb014YeJHOTTsKGGVduI", "ry": "LL9vqt9b73nQOzPKqtTtKEWBLBh2yzlpk4A", "kIlfIs": "H9eMztltTSCTmCEnjOC3XOsNnYE9G1SiSAdViCtFu7SPPinPedYC2uFp9YQl", "N8IyvQ5oqTIE1PC5zhCyFpRBFWNcOeCyMTAdxo4PqXd5F8SwqHFuKQbXv": "IaSB90m4QvQRaQF4nDfHdX2tGbUHOs7e4YWWqhLFSEBH", "l1ooUfdpMIn": "pxY0R", "yMCqBrRUBMEtZZIfpj1AehsrkMoe": "AaLCMlKQaPa4fgKAWpqT74tGaMhaQDTrCTsM4ZQc8mXzgzQLqQrHWRoCeQnWsZ", "PNHlaNo79DASzL": "ioMTWwhF0dga1mzDsmz9tKp56TBKjno3JKOOPRSZHtTSnrapFzkukC", "TL1pn9wOV4qUjGF143tWn7amcD9F8Rze4nhMVSk2UqxwG6Iib": "FJxIjm4kvOeqKKRiBLxvhvuj66QrzFGKAS", "yJmNfTEIvny": "TsDUKdIgySWh9LhJfxoHq7h6Rz0Bd1vgFT3lca", "DTt4oVKh20u8JWIcVxF88M6dcsCKdsAE": "Fasdnorjk8COERyS9UraADRp0FMT94xcPv0CxZMGf2Nq8FH3E0XUAr4S6EIc3Bq4", "fzoo": "KIXxRH3RCTVOl5ZYnqp3YC7VRkjgccaLuz5es8G31r3m7q8ex4727aeucXG2b9tbc", "eLv98nViuLXlwFmfqltCPro8RmvoghyPCrZQ0qGq3H6ALtPHzSHDHsX3SRO65X": "NMFw1Eqn", "ic0AgVIXtiN8jPdWQacmnjMWqsrUKTDr": "CkUP32D3XUY", "EEanP5Xuj": "ydcmxr24GP6l3OtitWt", "DRelz5HCvgprRgiElynNe9Xz6Ccyosq49XnV57QdZu259v": "uqpHoijIzizNQ", "cvJKKkvRjgiylysJkFz7jdjRwUGgIMbZ87GWmIAhUCB4eAM8W1IzPVtfWMc": "R4pWzXOwftDlBJFITEAyQ", "DrBj9P4sqTsUH2EfCsbre2ZiQSpJofGZpH9": "d8rYdNqcDjtVTLf7XwMkuFRuED", "kxUSk1Mdjp6HoUfEcC0ZaiNwWFWxUgyUTkNfm": "B93JA6K32pHQHDkafWUhzs", "mM3j2uiJGjsoaXXIb2qZqNQUI1NBe0CkLj": "fom8qVcSan2AIGpiX7Vgkm9HphK9TlzyCT1JLie9JvIJK6XXsGHSGlmlhc", "Ufkrp2mOY1c9bq9okpnVSNc21ZutEnUZMw5FHxroYhXHUx": "Bcd5mf0Omo8xkzfsQzSbDqfjl3eBE8BRL2p5r9X6", "W4948OVAzsHzpkFT7tT08umeTCsbxcvfoYhc16pks4IUbpRmsbmow0RHe": "Y4M1sYTr1PbanDYg5pxfZNsuN0i9kwgZ0yL1zqTt3", "JduB7vRbRecx5FDDe29mpS9vmZPi2r9P29EM0YmfxtP": "Ju699eF10p8Z1w", "RjhU6MH4sdQG5LnpUMNYFP6": "oNBth8CB02vaMGsUuV2EVLJM", "E5ZVwWzCK5dzvPTTVt8NJrs0c6SE3St5F8wZXk8": "SMdtzwzULnhWq2eJwjJTtjqQNj2", "z8qwK7FNglOBNneogerShETy7WdX0AHvRKPMAjp5ZHnMYil8": "hSL2u6KbxKa2hWvz5Cm6oJFYJO6pEicAQ42vt1sKPqBZsUorOa0pc82EN4aptY", "d0CCxLHMqp2MNnsYCwfpG6dvfhaCgGefwbsrNyTXaQ62ZqQ01nhM4zxX4cmFiOUV": "xbIsq34WK2BaH9ND", "Cwiwb3sSGLnxmLSU7FlUCX1siSFpDV3KhBZNMr0h9VtLYN56Ok2v": "B7CfpoxHbUbKzu4ghnjs7Vk7LAlASbC8wjlh", "MrYVVQFAl3ERLtZtTA5Lt6L": "x15v", "yXHejaJqLuHCGD0mLY56JkZjIjCEaAJSHWbvQ85qWBS": "sUuZZjBQIyq5w1JYvn8iBVIjXkQoH5lFKOx0y", "LFPsTuW79QwjbAYfS4N7kLDpgzBFlf4jjTNhP43zJBJte3GYSzayxllGBf": "Pjp0X7YMirVZbO3Jl", "Jjh3UVx2gEHms8I0Wvv9vjhKYvs2vW1zSkU6eeZdZAfKHjxwfKACp0hM": "DmCgXf0cnDpQIflqSinwX7y", "BkDdnLq0c4j0Z9IbWzcCdcrg1geS69Cpizw4TIHEBcEu9Fc": "GaX3ahhuAJNakSZLn9", "vR95HVTDFTmmy": "HOasdlNwbHRqYKkvn76E", "SNZM3ogbsaxzTmI5uunk5oyPDhcyQkwitl6S3oonzZjxbs": "AbVjDFtaTHQyRYKfeKLwyMu", "V0PyrdMeYjJBDW1gjcJCaEQQaU8WR92u0dFni7EwFX4EAQTXRkB8u8ZyB": "SJPd7ZNWI3nDJbEqit4WV45FBTeqF2AjAXy6", "KVBp7At8bMq3T6AlTozPYJW1KCvBbD4UGKFhAQ99w4CTSWmf1NvuZBoQyp": "PyctZKpEPnouZNIgg53cOWTi9fCOkJmklCBpbE6DYdflqYZFwBtJh", "dyvcC0rZTfBKNnLIvOrEHtGWbWBlIH": "OBxaOKFxTynp6U8mn5xUfKEoJ6CGDG", "zo7Cz4y9uPmeiKcqAh": "sP6y4YBCDr54Nbtzy", "J6Rafrfs40ZT8vATDss": "l3mURtqWfxOJSAxVcTU9Oy2RXHA2xvByYInSI4EfjJHGDjaXfDlnaKIHmF7", "nYUoURr4PzcEDRHox1xaf": "MpOmHRjnFE8J36g2sSMEfWGiwj732YH8Y6s9p323", "zs4TfK7eyO4Q13GvLDJI3hRe40xhz8KuXob2eXVwuvhnRk7pV9LZQ09qVDoN": "xkgeTsFTl8d874emReObXx9HwfFU6MDTseOnt2oSnmpE2hMCrBoSyH7icglSN09", "uYt16DbW77AdI8Tnn6GGjTD2sehq1VPv4i7Tv": "YlevASNKT0oZ3rWEoZSjJuBPxGZ2FfBKgdedXW8YxzCGeUJjtz5HazIta", "yhLoHZf74nw7wn": "jaDLzRVm6n0pO1AiwK52vC", "VfPi": "RsJ57hmHbqAop9T2PixgLT4FcBoQmuL8VfXcDgT7glLbYTCpmI4ektwRmxOB", "R8rruuXvZUJ0rB9WFiZYkUP": "ArkfyV3uH9Gr5EGd7iTRvC473H44iXxtlUKnUNOty6w0VzKVm1IjAFqB3i", "LIYBqULnyve67f4jtr": "isSBaLiLLQKkCWZMg6Foy6uCZHgMjUPLM9VEMpp1t", "NAsoNYxSGMj82": "sKwPPLb68eeKgfD8cwFa07jDixqy1GWB5NmEwe0VRIQ2QmZxUjHQi", "Iz96vzM2xHsQ7nTGqeA6ffCcVQfAt": "bPnJBVKDtE4u4O1eHqpUXSJO1bJEgr5HxmgZzTGyzaktW", "g61BYeo9pL3HpY6F83pGp7badYI02Q3LPieqRBZdUDqw4FMAGfAQVm90BmH4": "N6YU89Q7sHCAVyVpf", "rPblIb2": "s6bq3sJaXL0pCZc46wLG8kMFOKL1JrM25HMVU", "MPcYlt8YIAUKjUORvAL": "QGOf3shAAZhP6LYf1DC67K", "RCKP4bi0z2VeowULv8MvJWdZpMhkLCQvXyDqjTsFQb": "WQ0yDBW", "SWFWHKkp2GHi2fYiD2A9jjAZGmSpT8oLan8Nnn22M3QQW5Cd": "aZHMIsC2SLtkBU7s", "clZe5d61UFoneKb5i7TE2AkJZ4pXQxHjcg": "C25N8Ld5PsenShYRVX48E", "bTHw": "Iv1rr00oo0zd71VrxwuAZIg", "l243vAi13XkmatvtBs95mSu0Q3JdiowREWTRV41": "R2YrQOWO1k76Gm5JNnsGE4Nm4m9lgGRoICzj7qqeA6Mwdv3FR", "YTJa0K5JtmuNM9nGyiVUBCf345dkFN0NKjI8ZjhW9Ow3rngIYtEf3": "JNtN3LxUstXfSdtHmEUP43wiEKegXwLtXC2WEMOQohFbuH", "qSI8V9YCJZSX2YJjInrujyKrU": "zrBmUw8QUUIAZ11cZfJEVasoA9Tygt", "sW76wX1dTsmTOqQD": "v8Fa9w3hISdKsMLKK4cEZCmK7yLMYIdZV81fk", "Wm3xzUpxbETbk3Xj36svVJlJS3PP2dCdqjDm9wmHKX4cmzpciC": "IErjdLXFFTQXmmQWV36s9LV3N4yY4ha", "R6NGC7oCR3lz3WGiJNL4HKwNknDIOrQzDDITVih5I": "vP9H0P3J26Bj1ATN2hp", "DRE5I6UmJdl5qJ1FK": "hYKExF6BJvCW6LX2IfwEbgmPuoDmjFgnsoGbgbAry6u0KtaE", "JxOmfbEE7JD3c7OGDUjBioU7ScsZFRwfiwn5ExVLzTlgo": "OB9KDy0EhL0kCKrWuoyllwa", "rd6fNlPVsgZsnqIEnEiosfiXzyaL19NGGJj4RbuPpWyjR65WmY": "pmKgDPJIsL7TUUS8aGKSVCpq6bOEjY", "d2OUDwOZA32asloHl": "HdmVkiKuLhiBEFuUZ0iIjPxNw95cNX", "tx2H2": "mKVQV130If9uuX6Oisk5xc34pDb1eRGIfxoVSDBFd1FxB9c1km8I", "hc1Bui5udfSOFwx4PRE6bvq0XBrjVmpzFrlHGO9Qaa": "rOBQxM1xt86SYCR", "GLL1Q4t5RLMCLI98Uxu8m3c44e2z1bIPjchtP5EBzYugNn": "I4gbGx4Kgof4ImAQUZu08xBT2BiuStn", "gvj": "mYBt0URG7rXecivNZfMblieQ9DfljxBvJ2qxumtmGEk5DilnxPHyC2OS", "R7yFjoN4zWGtHpJ0u77vKZF4tlV682": "UCdzC0wx", "Af3cINkEoA": "lFsCQwH4OskUb1sEHhvO0B8tC2wCWw11XnAmqXoQjJ6J4919e6ii", "D2ZRZRTMPbL3Bmmw9j8Qhk7P5U4ecStxYsNV74dz7t57Cr8YK94OV": "WktdknfZotnBcbNA0QjdB2p4IzzfVKK1", "co8gBEqQb4K6VwwMDNA5x5PdbHh0Fa7Pk4z2JLUYkeMy7Y8QFRS2DW2": "hbdX6DpqZkhAsfQMXWFtgXAZYJGTDl", "fMT8vlytBXq7ZMJbyw6t6TCWD": "uf", "FHqqZabwur3vfNB9GNgARxSQSdKEqW6": "wOTjSWgAcnh3TXKAe5", "GEelAd1hIHiYeKtoAjVHEzXRiHW9DiSnL5AC9s63w2cmyp0Oq": "UCno", "xS0MLjXtqKrFBoCey6tNxKjhtgqEa71Gzmi97zvHY4FXbwIX": "zXWQlgAg6OBf6agY", "geYbj3spQwLBo3ZAlTh2rBTS8XuXU16Dhjz7fHF": "Q70tBydA", "CsWYkhbWvvCWuJgdAj3FOJXW38FIpJO": "RHgUaEaqwbrH3", "Mhex9qTQ1pZaY0iYCLkikAMrIS3wL009qqP4dvqDfmWVRJ6un5C5iLmrgjpz": "doZdj5enKEtuh9n4jAxkZOHLyufKTTpgs4YP05sdXXvImxuFZkVKzdps", "LBjqErDYhxIFYXu71PMSbWpkmme": "IVkPoPTk9HHgPRjZ1YUl5n7U1Ihzd", "EFie8u3TaGDgg1C": "UR6u8EHmO2", "MEsCm8EZQS70Xm3dlEAq74UBG7Tk": "w0aqhWuTKNwkRXH9jSReVdZtQg4OsJgHvrOjZve", "GQWbA1SSMuA4L": "xETzgrrh1MVG9SFRHm470UVzqibCnX1YDNtvsaxCXGy1cTTBcy2JOVLoL", "HMtxYruEBven04GKq2ajT": "ELGPdoLgCXneliAh9JJjUqTzAonb1jq70KaogHSpd4D085I", "FTfKnpYNyCzh2Ws9thNLInrvOxlDWNWgeH9gPCxzG": "WfcDuMrEzYFpDcnNbnjBcLFgEbeSCi2iALNcVZK3lzwPmGnXNgfMfEmL140Idw", "FTwrfaQkJSErOsGFW8297": "wHND", "iu3g0cfT9n17lj7qMVTeZLWRBAazI9MXLw7q47k36": "xV207AE4l1rck5q0dnzppAygwUfjGmlEYE0b8y9", "kai58udWUkEnYFONYmlnVtS7qapYL8czIPQizAE5nibX9t": "GVXoIRANQ6nu", "aHrcblirj": "s4yCPMIwg", "OL6gx7etrnT8ajce8B9qI0mfDlUkJAWS1QggC3LgQHLnAeTegpbjgwSd": "lDo4ZD9QVGKxBtTyYGzqoI1Zl3VUyIxaMevy3tcwv", "iqklbIUQdCgtHv": "Hk6qosxePgDfyxSZg6KHWfvBvut6y246IE", "OFHTDzfnQkp2WA3HlOrY4VY2ng9HatzqBRtXdcnUG4o3vse5CiHu7gLqkdoa": "z1l3k0y0H3qS2VAAPF2ypmgHHRcx4I0Uy6Ehq4M", "qugcSNSiWyVnmvuAJQ1JeYz9o6YPoFwtmGx98LXRdfZwh8Vv15GvhfQ6": "wlD1WODowDPqhdwnvBM3mTbQfn4J0zptDh6mDHpnsuPRMkVpyneJrcdD7rT", "SmjBCsBS72zBXhXCATQsIAT9XYOArt4amNtnAV5MsIMrxyZMmlY0p6sDXLXo": "yMMsHuxLgwLTUQqR2eEN6NZ9Z5gaJf9gKfbCVravfwSfgMA9iPCj", "tb21SN6qxbBC2H15S1RlknVoUnNr": "WdIIXo8ABeerWIAZohxwZeSlcJdp6k", "IEkG2x6ER1fKQ32QpmY5tnW8UQYVFgHYQIaxh0zJxGE": "wID9OVG", "LshlkysXNybW7WE": "BYIyrJYH7FvdWJcYM2v7fWxM2bKPquNOS7aEO1Wlf926HbEiPglLiEuUp", "xzJNs2T": "w7xVCXNcLw0cjWzUb97uffj60H4qg", "jrOGguJJd7OrOKOziLprAXbX6PUDGyVKvNd7usY7epd4cVqFE43nDNBiugtod": "ZWLaF6jAG51WflQj6UoQrCZ70fFSJ2TEWH22HgvX3XmHv", "Mx5Is1BxZOGks2htk": "jfJ6LIcISRKg4", "ES7YsLaumMWntYad5iC4ADykdcV4Unbeq8JeuVUnmz78ODEXt6p5EQmV": "uApTJgF6G7Ko6Lxl5CFEmR4aCeXpEbbaWCX", "advGrPnEQ0Lau2TPx59TswdpIC9UnEDQGGXQqRVycdlUI": "ngv5GbxT1MEodixcU07USNHD", "aFsi2bfxnHpQQ": "dZNSFaPt", "gfP2PN0ay2WfBf3bQd1SyU847Fg2xrOLYTQ6dufZMUIKXk7PDtwb2Jn0oB": "NCP1BmMhhLAYdviJtbD6ESvE8bKgk9QXrwroUEZoLlGny", "EEROyUHAO6umtazVE1dQt0G": "cOaGhRki1jRsyQJEoaY", "bDoAOn8qZ83FrUZyooXeWpzp72c29HokjFcLLKIyP8fy9": "VoCX9t31ZkZ8xETNIBTfIVF6okainBkdHSGLArMiXd", "BiZHPCJNhRvCbvTJn": "QocZwoOivCPoKtTw1j3oqFFx3UWYUSwqnipmJq7Yli2FKTOKgWiXOzq5ETdly", "MO5cJ8vQEcuGC6zCsnwwVsuQdUYVTENFU4ZU": "Rs56O3eczScgfjt6tcEPZAiJv5dN0rJX3Gm", "yRSxMbbci4fjUUSITu6KDX8w7uaMFM": "wfyr052SUTNS", "ZoFjKO42HfSNBZxmlxdmLSCZY1ntp5LzACRNZYZMoXXcrJ4kb3eRpQwGg": "NCiTargcZz2hpn", "eBoretYGCswUlKLx1ahplDOQ32tHqRNd": "GcuRhE1rvBcbZnB24WbTnm2Eg", "JQ9AEIrl9cUwvrpwUtNxZ8ILrlvAfuhmOJXM4wFAu": "NmaObxmWa3KIVlsQPyBe2RG4O2XNE6", "JNWB9fEOwWaQH5yuFzsyMyZD8B5ts6t6DLQWt8CFjNz3ptksTtLDQk20L4": "hIHyrRM", "NjFsqRdGeJCb6RJzETf": "F", "vasSo1EHfI6oJyE4jEvaU": "pqgmAHBClg0BJMQNrmCp1aqFdswVJm5P1ytuNJHP2ajl", "ezfNb2ZBCfHxRTkb55DT5Bo4U4TEz6DL8BBZr7SNGA": "zsp", "mcXxyDLGDdBFoNgktygb1NpPzJ5K8": "bR1vf90rCnpFfzBBN", "ED0lHtMvonpHV43AcW7HlwCVTurxCkT": "aiUfghEFyvy6ZzK4qwdER1JIgfBJXopeTwx0YAAfD94fDkye5AFK2TeOEbr1z", "BR0wcacJNidAtAg92SCbNR1qt2iQzjh92huOO7VK": "YtdKrXi2K9CGjyv8ZguEfkIV4gAfueTh2HZjuGkCLmrCs", "jqpa10HQuQCyQ0R5dAWjob": "PlxNApLxzd51Kr2Yujl", "qJecb5i6nF3xjZ4wjASkCIppPoyLskmcGdJJ9IYgR1h4pIAFqj5WnwGxWKZn": "f", "exf4Nx": "Tfiy", "aTcxVLHmY6WHV": "aLDEh6kd0ISk9uwNiLvNJK5ZLpzz77ocJDwyb8RUm9l", "cS0n153ah3BhFur9x4DwJMNtqABNBPX8r6": "DlmWPOVZS7VFgezbPpM", "IsO5R6d7dfQR2jNbu2": "VwDQBDqatTwjpAXXFZMH9HK6lVPD9O9tTxTmeZKbWS3DF6jcSu8Z8yYNcxT", "uR4QKwpxUHc3x6IBEHKzFMvrZxQsJPzBCVVzLEro4kuPpj7WUXI": "ry2FRMhUvbr5RFREguCcINqKOCjpN84Slwy", "LWWl9GVTvpAMRQpT2uXfuctPbJ9hF3BO74o0emKWH5OznEkirK4Kqok": "vjakD0QuqcjbwqkhI5vnyQnricLLHiR9RHRsSR3Jg", "C6fUMoiCNLlluqUQhGxBPJi93Cik9CLfJz": "d74SWmGHL0KhCq57XVOfePoEQRebZzJKivBvjzqgNmL3KUEB45", "nh2mF7Gs0hMjsahrpAb2Yhlxhin69QTieJJ": "rRmVuQhGZVRBx2XYt3SwQlveOGBghuL", "coiwLosp4Cs3cAKSaOuLnuMpXHNLKKlE": "vTW54xbZJryrtkmok0ViSu4GCO3FLL8Qbet8", "KUIdBPba6zHKL8z81VijMO": "P4sQEf4VE2CmDYw", "Q7uaVGIAQFxbSQytCOhGcVNsGocZ3ObBEhxYuiCl6uazcv7WkYvYls": "oCh4xCOUr63qapOCDy0qOqM6HLYtIzUlDlmBs8V26sr8cRX67LFT", "Pxk1ZoJI2g9IGWg6r": "RtU6hfJaDnQD0LjwMqP4gnEsy0R9RKLWOT0dCjdS1oGy2hzbil3FKe2IDypCt9", "HC7JwCHznvIecMpAViU97SWjJPgnbES9vJgEzIhe8soKLvwgHIVN4isgqmC3hXC": "pI3ZkKYlh4pqiaaBU0PPM", "A6MQz7F8pj34PunZrwZfwlGIwD0NJgOMQ3tn9D": "phZm8Wt", "oSZ51BEQ8aFuDnaZz2Eg2YkkJToXa53t11AboAUh7MmCosye": "bJD67wlPWHBgXJ4PxJlAYd3cYEhPL49LCof", "DoS1V2v31hLzadqCUjY4aSplsLW7dk0rD6x73fVmzTeF4NeDelqxo": "Tweju97kSA9w2DEDj1eIO7s6VPi9aPkiND6hj4XL9Agr7", "JWHDsWvXvWndlAgM3cMaE6rkOLDZhK3zfvhrKSHDaP6pFZcSgCv5ujpC7Jw2I": "JV7GaLHpZB3jVutyiRWOt6xFkHX0tewrglkIii", "bvm": "V2gJc8gRYCITdVlTLdgwRfjD7e", "Dm2AGGs3eg1EkU0MdZPDtTbQ1Sm4yIClEvKvLaAdYvImfBrbRUPh5fAZr50": "FAd1SvNI", "H2kbckdQoMiErwcRKusK1TCAeM96XPb01beboB0oqpvw4": "fX94MX4CD46htxtStV9XF9betyOs1ESreBu2rGI8IDCxMn5A", "mb6TWx1tQgykCnlUbn9zKqaQ4CbsJcf9V1g": "imJQs5jubCtjk", "r7MiEDTamM76CypY3FpR0cq": "p1WkewZn4HQ5qsl6x6VlTOWuFee5jHOkIWDxI", "Oxt2xaN0k": "agiOn4qd4oGRHODTaYpNgXSxsmsmhRKXPif0BSu3RLJ7J5MMuo47kNjVDCa", "XLkFAb6sIodrqua1uGI239fwipm8oK0wfaA1Hy0s19WKSzjtnzIf": "vr5Bkz", "r7hD7aU2v4m2dxXKWeByjCQtuE5AIkraqxXNqdn68W7UJA0nkoZJVAFowJnQMsWXw": "vwSOIVQ21I44u2vwjireKEBfSmzWwlVaoUiUGCwOTriAMag2St", "tMIKUSad9YFNqM3haxqovc3s5CXElHB8YVT": "ge9PHRggg0Jr75ZQoiDZiQV9uy30Maff8Di02ZY7F", "GEkm": "pNTwLsxGAIzxRodbzf0XLjMCKZPzo2", "avD1aGdmuHS2C9e9SYKHQUurPZTTElXgflUr0CHwxiEHG75VutqkYtEpIE": "GCuVWzZVAr4TI45quhANEh04DUK9JikkI81jBkq1", "utPd630ga6mPcg6l6Gn9TTQKPjNnXCQym4ueQSySWlKGgyvAA2nDrRqma": "qZ1zi8guaA6etpwBXxtjSQqr21OksIOJWwycYRZpGSEnJSJN7m", "Zfe9AoPLOtcd5hlycEIbFgUcU6L7X5IRch5MWY": "YGDNMuZg", "Kh1kPhTt1MP6": "pIZcQh2c6vjdQmtsjbpaL4dPD12dC", "cG3Fn17fpVojmcLge4Oz7wwi7AY1SUj": "tQ9C7aJ0pAs36RaQcbesKPMYcniy3m", "roH0PGpu9NpuZmopdmKKDFk5n": "yK7LxGBOWo5gSabHmPMqwaMAlur73q", "Pmc8bGvOjEiA0qg3P4712wFG": "Wx7H3zzms32Tq", "eeR70EsERcJRefa4cxDo": "YsJoulCvAMMnD4xIL93pa5tbd1", "ybMbsXKoW6jUYhb2CQHTiiWvuhn5k9PH8TXo2x1ggxrduYp2frJ1yFVHd7": "sIVVxWKw31zG1aMP315RTPbbnz8PhPrzQu6dJQLyppyP", "c8N0TYCf3hLWTAF3GvG5qwLPLD1p5E5aHe1GvZdhGWZAaCP6RMt9g1Bz": "n8VOOooGIZVqnNPdOzsXqtpPC4pcPMDQv2bb4tu3qR6hCBgbrLR7Mwbtd3EfA1", "RUEyzMLFLCABkorPvV0dftQB39GWZNuOcn4jip7bNoiV7oiIXd40Cm": "yEpOiG322wgvAn7I9fmBc7suWh10LVcq8tegJmUYQQUVa9uSa3", "owW2DuwBu7y8JJmMypdjbf73K6WrWCAbpWlLkV0jXSoOeQynqwF2D5IEo": "gE7MvsxwVObd70oMelWrmr738TEbSu", "tBRVRKPX5QboAfvTF52IhjyNOcCNlDy2B02kJgN6s5FizY3ImH27mjYMQLsYYa": "hTPQSoXB65I06bNSW8yljwUW9TQHb4jDpwjsNZrfDnlOXoN1", "XTkICc44IYP5DHj3qB2YJ9ucLLqNNF9FrrmsWexgTOWhtthG86dhyPRO5MF": "Y2", "q7eQGuwLfvSZfQ63z13HyoHBL": "t5dPr9", "JmN": "l7gl51d6v7fovcgZ1CbvLclsKK8RNC", "BPNNsx0cIgp6GpZzWYK6erjRWnuDaoK5ll9D8TcnVFk0djvr": "NRx3U3TMlRnx6E9XYHXNVni76Q0mTIDlarFKV0ihkSOcvnlI3DIiNKm7uahOFR0", "U7maCFLrXNelUDzt": "szkltsBylrS3t4YergfAmNMr1gAWiamzoKiDPtAHb", "tVyvjkWAk6QZsIh0": "fQ9sfrh3A8GJtwjlP2BuTzKqghO1kCjFd6", "T4VVlooVPo7Y5kKwTxDBiSYJBaWnSlDxrA5IvPqJqS0OPutIFALxbK8pH0zsp8rp9": "ecd0SF35AKb64zpWDSoenIOHGaADDr1tXmNMVFtMKk78eE66bhY", "V6iPEAZo8dhZNgLEtLFeXSRgi5KziQLi4gk0WX1HZMNUg": "zru0yhK5pIc9jEJEabeCXUycKIVBsDuzPs69bS4QZzXxH3qXP34Bj", "dKR7FPP": "jPqnNNafcsDyZX3az", "dPaouB": "FNmW3DaMe9Y2k3IsWLC29DWLSoWMzgcDUy3nnrowOc9SCmuM", "PZRp1RdWqVScj905KUxYBIyzFgwPUX5H3LiZ9Qn": "SoGVw5L4RN0n9cxOFA4UWCXfaw9lb0palf", "ttbs9X8wWqqeRuxtA5WAFHjGCtEQY1sJFhxmVL": "q6cXT1HR0qY0blfbwcDNhEeiz6veIBe", "Eh3Ndf5wegADhapXY4PXWu25ZgUgkdWOUvEJfwCbNtKFxI78PDDNLbSGeVO": "dofqUJ", "QPBlfX": "x2RIZy1eonJv6tiCzEQ9jQty7gbeeTbZe0dyQmXUIOqSM4Lst", "zwyBHEBwtRyU9lj76ek0YCLe3gWiRA4njIr66SNTKiRQsGVOHEoC58st": "aLo5KGiAxYlUCyb3HGaJhEC8gqxjv3elT6YlB", "gcOscywMJxJORbHULlsVZFttUgm1LeZohPe1I": "zTSZWkGdkqLm3DwEGvp4nABlxbaCf3yTgv9GDWcTGNjkMAg610yIVuQ3InG", "wBDamSSIO2AKu47fmcdj3Yysg0Wa6JFgxeG4T8EoFfl3oXso2O0jwkV": "V4rRW4plT6Zc4RB3zp3PrAvcqjWOEqFjzew9Of", "Bwx3laRTpuR7FtEZsIHlrzPj": "UP8RwLZf1bcrupRDf5NZsYyQKsOTtnrfmdUEv4PwiY0zWkeRruqK9ZI3", "nTGsIOXjxZzzYaGY2bZBDEdsDB4gaYYPl2aiWdXV": "yciqA", "FONFBczOaKef9r8dozIbMawhz41M6T0tuWdpAy": "WCub9HykAsLp8yng0bPcbrPhRvZyXO78kApMCNLHofaoNkSb", "uQKoNJ8TajOlxwlO1nA4M24yR0r9vchYvGcTVI5z45qfJUsvyV3qfWCu": "fBKykSMop4AUQTtddENhg6daNwjpffdKAVxwlOrJr5Hz9kdhtt6sYuoQzh2DH", "TX0yW5w86wA9n3tnlmIVc1oY3Z": "BBaga3XUJTR8nVDqHupldX5fuDoy5fZZtt9PKFHfCDh", "fV": "v", "Y13jukcfW29nQu5sWjW6g6D3GjvOAVzG5Omh1Bbs": "EsvknutW09WwIGQNwT5vpL35zgQpIJFsnGjQyytpDP1TkCZz3CESXLhaumG", "Ohbss7bJjY7TdD": "PttgZIhO8S2cjhsnyCeCDF9NkupOhhjg4VshCrguhofQh", "m95hE24m6mLq4fZVpE": "F5lDtaBSRWWQ9Chr20XJqPvFrFy", "AOga5hzlM7IfabWk8N2iuErKNj0a": "U844oSecBfG5AJFyrADStmvTm", "MvKrm4DKDsh1Qr6WKge0RAVybLKFirCRoHLvNHN5": "UB5gyQJhNOblr2hoay2FpCPbp5zkOBMQmqg8aO28l1uRys3ZzooZKcr2Pmn7z0", "cDOhtRsddXtZBrBRUBr7wkwO76ky7": "fbX6mKu1VYip2WjsPaZ0VcUiB", "ZBregtopZg1NrzRVz6jXCqLORYc1Cm9S9": "e0h1jwb0egPVN3dOR7o4nH5RNiNofow3xrWd3WYQib17paGLxOst1wQaHGT3SLOt", "umKo": "mnjcLazBe8KkaFkxBE64mfnuMyOH6936mJXCK9cUQGhpPElXwH58b", "WfpCSfcOwHn9Wj0JiRxs4PvQTC4TNkOzGfi4xWuteAdWbDOL7t2t8DorZBV": "YnHGIYY949t6FqmBJD", "yM7btLK48pPqrzPHwI7gWI77m7ebSTrC8XtnwRDcwThd5JPsCz2bpw6o": "EsNvDlV0LOPs2O0I8jIzdSlVapQfHijjC56Es1nbBKdWMuj", "ZE30CyimfFC": "Eb8M7wrLy0lSDbJqq4q7AMkYQFz6tuwwFQRYioX7Ug", "HKzP87": "GSaXk10S0", "UFt72RMMk26YTluA": "RR1Ri7y980RJ3dXOyDZKFmBrY2e", "J2Iwrd55YMo6JnT5eKBCdNpOI8PmMOrIMz": "JJXxmBAbJRV1rFQAW0hFWSQ8IjOg7z1X7Dx7hdQ8c71GEcav2T", "kLXWaBYjjEztxQr0k0W3Cltk6jMDOul": "RZjO284O9Pz2GCUzt3GLAdfxWntJiYzVcBimZhoZScDP8Cw2IC72Ug", "wfmY7nozNfHQ": "D2E6vKGmFHFoXb8T4W3skZxI5P32hErRF9I6od9nwa1fsm", "gqHm426kJ8mom6sGnFXXZmTild8i0se95u1kG2O5YoWsRm": "MOq7iwYU3Pl0yVqOIPg1hoZ79z", "sPGUG1sEGfBKM9AuALo9v8ctnQnGuZb": "dJRxBO07Rg9Zb", "OwlQ": "WiNMYhOx7yLCKuCPqeXXZpZMLNo0gWUdy1y", "nRzrS0RH70Y4UjKbDdkZBc6": "G7sWK8AZfbvzWj5IMziYsH8x77TADTTh10rbYBXtdbt", "bFxZV9jwcHFwJlqzqm": "r26mGqOXjVGATaRnFUOnln", "v7LnySoF1ksSrFcCE30YYVCAxRk": "f5x1cUNpuq0I8d63QvKlWGNPcIl", "Qm": "N6HTtb8wBqZhl6cupVV5IQSX6TvWGQhlBmDg1dGnewEFCj5E", "QT7avKoQjy4o": "msavWbi5rjsAda", "KpWHcu10Fsm27Ec": "woCBdcizPmiHdnwjmonS5T4l8BOTR2VjCRg2ejrNUBsK2tL", "sgKV7HD36T5IOAF29qfeuohiJxGPCJf9cPF5z": "GCFmWuT8Netvtj2S5FbUG8VUMwrF0GXb5Y", "Y3yIvcY6mCgKK3c7qTlHtcUmhxuEvC8nAmnsEwu89P2l": "VpTE", "i0PcSkqeVwQ0n7axLrGvhYG8VUz2zNHFzqi8VVH1I4F": "OjkOBWllXptjVa", "eYimlR63808AzKfXvHFzqLlfQnL3tO5H5wZMtEngDppuKpkTrpVEyCzIH9": "TwiaXIyTzL3XE3NYfwiwk4BAqAkP8kNDvAI1F0Q3bIDEZLQWn066cnmAA", "qfxsgHSj0wZMScN8Ou26JIiW1nfCtJZA3DeQf": "FXaBtlF9XoY16V4oFqSrXJpjdPw", "uzUmDdDCfFKMHTGhOZqJcvWrKBengdcwRS4uKkw5rKbs3RGnBmKKr": "rJk4Ul0ksMkT4QzLnFkczCSTyjtTpoWQu2voDM65CAzBWSmKFJf5nVYLvyuLX", "SykxvWm5vGHzIBCPKG5PG2EB3EOGywXbOG8wkNBnCTeXPpi7bY7CV75J": "BuMPfgD0UQiYWi2Hr4pRf4VAZJd2kT4cNNeEwavx", "mlBbYW6Yg272xV": "wz1sVTNQxN0kH7CXfuMsxsJjslWOUnWaQJgj59MO2k51cLaxFl6xoGntfY", "UUQuSSRUJL": "Lw1608vkGyU6JeIhNxmVXafjJbxL6Vmic", "rxi3uxsVbNMjiHg3dtBVL3jNxjBT": "gI67LroL9mdZX0NJlDpOS9UFlCLaZrh2A5LYbErKZK9QPmZl7Rp", "u3JYKB15": "olR7Suas7ZTVndq9NUpctbtrO9h7QOYNri9LFjhcn27doVQsgq8q", "NcAZtlcTU7U5YY6I8O2aUieq0XkUwhQYg82GVg": "PVphcepwiThbTokEvdijYkzJ3drWwI1JD0Z4LFhlJXuu", "Ld7ZMK73IXm7yk4FkYO5jhlbVzpAQkgZSc": "EuzIV0hQc9w", "xWvr5VfvIt42WByL": "pRinzuDIyOrY68T22Ayyb60NcgNfmF6W", "ilMiltQbhtviSPJlhSkrKmJi1": "R0l6VpsDVEH8", "oEQhwFRF4cDsHKuPYUMaHuyvD": "rFuzGyA2xJpZlNX1OnLqZppkTGKqkvboGqkBzyolw5F6JnX", "TPM5zKAw9RNlDZ2soTln4xXhYGJp5wyGBzHfngXfuvj0adWy3hUqOFzbImQcB": "MI5Mh5VIYpPukwXmuTLgj9Y2ljimaZ5WHm1ep9gDtS5Lw3yE3SCX", "WWYQIfIcsR4EFCkcsg0EDEGhC3z8FX4": "svaD5getDsdCj4jBYLEk4lsmPTDX9ADn908M7PH0bovpdD3IIAkHO7g", "rqv61THm7hAsBY5Y5m6X3SiwCfqSXkgG184N9epxlPOaFq": "EYYB", "IbFnAq72TB3": "XVNQMHFozXt4Pj8zAEKe4sCMIxOuh4IRpJJUK8dToRrw4o0X7tzL", "kkM9": "kbcsjD4w3CtDdFgryZNnuvxEpXr93J7WkTrG9K7UCxto", "hdpK9UmraAxAaCTcQT": "sSGO5OGdBecEbFCYe", "GDdfjHa2dSpU38LuSLfutHlAz6jDoWuzvp49oOmCY": "pl4lqjAkP96z4KfrrGQ8L6AaZaNZK0Vz904", "OnTnnEivUWbXeqo2P7IW7UwIwgIrWmgWM2Mekq4lBepZjjtm": "C0XFKjYCgnj30PPx26c", "JTcHqdkJk5qj": "mb5GwLBgrCcqQnqQIZl5SCBrwh6yq2JxkjT7jcEu3MlRAKc4D9StwA4eouVxOnRz", "uylygonEscA6znz14AUm1SLN7bjTedHEYMiJKHK3So5ljgwHJ": "HZ99alAfBUnSAaPJKX", "MPNPBbIuRsKKFkM": "fuUMeIabzqj9YNpgpUYsJygVPbziqezwXJMXM64tCYH2", "I7KBB2N4BJQwjJDUUY5kbhIN6ihunZ": "i8Sa4NCvElWayX7NAxj0MuyWvNUfpIMeSc2UGwBu", "fZioV7ulssigPnHm5ESFoN9iXRzRm44wdqFbu58Q": "foAkCv1j2QPHxtTohjoNhhwxFuEfWApuwQUeKecE0kQ3kcrU8LRm50zYA5S", "ku77hycOe1XIa": "F0UxHdNLqaaAefaxDjCWvd0PlSU0mJz0uBX", "mO28": "CtHxi", "k6l4LLEPQd": "RZj5WUbvaNBjwMIHU5l7CsLlLhiczV2SGz6S8nSyK6hbhHH", "yP4v9Ld7yPNyQAvTQEw": "IC19bYR0AvFZsyEe2HnO2y49fP8IVonk8xNgJ8GFf963Di", "DyNJnhnQk6r4C4me0KLRFEj1MxC28ANAXBRud3jMRuoFJcrdADGOVa1VNpJFBNRi9": "I5XeIHYJhWGAQyzGriXB1uyuSWY3Y31K7RYQvIrwNPN", "afCUEU7iAztmepE5AFEg9IPiAe2311aLclzZOFEcjlwemYOvy9SIKTBGS": "xL4frPsqKzhcjSCG02Us8ZgVp2RqjGJ8", "T7K9gSLPo0dNBJ5y5FFpJNpIcX3yWCletohJMHgCs": "EnJY1qGn2z6XuFHHdB", "UoPbAAKPialXxrIHSzqKE967pnLFNRqIxFUSDGT6qWYvRrfSKiz": "tNtWsc6ccvi1zi0DQvrJV20g2vwGyufE6ZluRRliXl3J7lqJtUms00F3V", "GsgAwkkNSTqvzYndrNtwfrIppKuDFqj": "ISt0achLewegqm7jBAF7xLnDUIIi5OyJRqx4kbmsFcBID", "HnUMi9fK": "VtYnNYK6lXLPh1ALYOpQSmDuNRp1lTjVaUyRF3QfA0FegrYeRIMMHD", "f00ZbpD2rfdQEuUUh8PN1KyV94zzJ6Y4kNfY2fZzRxihviJwYCHcyLvTw72tX03U": "U4qm3aQjApjUCp4ewiPd7N4Zbx6ZvRVKeX3GXX", "bs1ojG2ONMYmEetnJ9FBoj8BqLVB8": "VIk", "Aom0V0q7e73jJOsZ2gvBlZfMvuU": "loPpfUEzuw", "BykM": "z3rO71cybnG3Qz2zfe1QBaVpFbjnwOdhX7kBgSmYFoM2hkWkVOSZkHeBvMTZ", "Z0loSGC8C": "nAcEGSGHespQC55n", "cOHjKIufbIeN2eRgKuyTJfgq34eEZs9dcqRJQnA6WwomqJkjQ5i6E5x6LVj59": "eghsimo", "tVfywr3N0SDvL": "YUO2bb4Yg7Oh9", "aPcCDcQXsmrHbJ8RqTqf50jNC95lMnctog4GFJz8cMVDhAFQ": "etvKn5JKY8w6ax", "Zpb2t2Rr": "kErtVk", "F4MYN8Qa9R8OmfXOgW3": "SqybHXmZoneFwcODpcrAlVQuZkXiW5kgcXhFh", "hsfbVbiKRjv5XU560Fvc575QUwAUwTWIHY6QdyPumD": "wPjgFrMXBX", "W7P0lmiFfbdryU2C2kx96LntiXglRA2": "HXO8OBY43r8nbdw1orh3Z9saUpFPeXzX7jtUAr1EV", "CNQDSkYesBfE": "eNdTWtqcHFZqzxnt5C289bZ3N0D", "TU7gDSPEjCOLEqmfRDGnn0MH6l9mviagN8arjTk6RBrWm4g9ESa": "WqhnTt8b7BUf7JXKik", "wpTmBEBrreF7TQQh6Ft6FHh": "msaeLpY", "p97dyYLIYvhlJISBuSQTtBg0WyShrfcXd3PiPd7BBTWWna4ATzOY2IuLvIiUfYmn": "LoEROfFM", "XQpdea5VbxTk3KIe0TYi1z": "QID3DrH5OSdiWclOg63Nm7R9YciIReZvWHhjzjd5o3Avb3duVETlvvVMhu", "BXRzdzXIq06KJfhINrxlrLE41vtndqY8IY3iXad": "Rbjwi25MMK1k4VOkoJGoamJf1fkyqlqnZcMowuKgOm9bC2yyj5lDzlb8cmRg", "lZ5n1W5Z2LWpTTNMdzSY4zi4yJX2C1h3TqLTtHSOF4F8AkxMeFo": "L0q3iHA79aYXSuB9zRmBpwII4cmhioKQiR5", "oOaDpDYMsEJyHpgX9m2EAyIdsM": "CiTfY", "sUeuTlsujDmstjvV68MnIBCqMDZmQLG2jamLD7yJHNZSUX2nX": "bZsS", "zgdPdpNEkKQPw1AlZ2sniELUPxf7RKmgMM": "w45WTs974VfxttQoQlZ4a1HWUxYuIV", "hvGuXw1CNAG7q1vi3tin3bf1KSYrnILH": "T7xpGd6zSu6", "gU": "Gj3gKEZ", "GEZKx7": "RT5E5irHYJroxEKahuOMXBJ3", "ZatueSCMjMYGtCSu4A": "orcIqtQiKHr6agX5tD8zBg2B1kth1BKvFkjGjAjFdvtqLUm", "sGWRVzWzMckccbMdtYkeEBDnw6kQhfRTJW9h": "XCmr8d76BScu", "V4eVMqRf8VAWjKayCTfESat": "OG7t51zlotZVxCV2pvEtNg5ZhKIqcIezX", "jWYdNs1p4NYAUn2LoIv51ysEsAhKZ0J1lsYFbkbhbYEoQSardIz25167VC5v2": "dE6mwDvd", "bwVMlBqhq0ae2vRGdNkkE0sXKxh": "ygCXH5ELsW8OjOChiyKrDdiKNDFSV1mM9rUpANYLBYSnQI7", "nzDR4DwgWMzYOVvCaHVvOPSS9GKoudOhriv8qTQXCDnozOT4XDXCRThlAU5jWW": "aA1iNEJvm", "yp9G0FDQZmbR4TKsWaEGpPq8BDUGQToUw77zeu42H2bXqAbpp1Jlph19jUdr": "aF7nS9JtaHDKFzcXnOOgzpYk6jYTXVC0PkwZ", "JedADlePSQTi0iOIeIDl2URkEoY": "Jsb477vnyadG3wz83UKSE5OxO7z12S2fyC4ln19TYwZCUO", "pvcyIApMXT2hm649CbJGifhncQiR75SaKYPc3gP2Z7GjlkMiSY3fxVk0zK": "fqORXu6qzFJwMFgZ5dkKDQmXm9eVz6IwdXwX5", "uk30vpeCA3Upqf2G": "vZCergOnTm6egSlTg6JqjE85h", "szkQsWoDbzg5Qk79e5mk2CxZm3Z9lohbhkKHmIh0Kk4ZSIrOvvn": "trODJ7wsorUnfLETORnk69GPnTgTVuCg54Xv", "PWCN3": "I0TVzVzVS5g9mCj7Soefq3R1qOok", "Zq9xZ9DpHPsc9iBHFgP5Un5ITnbXFuV9pJd13LwsOkXQSundD0WR3lnlUtVt": "bUhkqMAVrwy5CJwPuz9KXZLeWeTH7Up0HUYb7", "bY0SlU96CimHK7swacPxg": "O4YxqTQG3ylA", "g8DgG5MdTmfKFQR5IxZJHT4eXQF7XHvE9q1mAux9RhZxxU66aez9I5cUmTf": "vgAgaETp", "DYSbooixidzhx6LXZn4W51nKaop": "BKasFLZSPM8d8EKj7nXI647B9Tdzm0EPPrIlDXR9667B3t7Hexuzv0Dzr9F", "A5poM8lUgFDVQhq5Cz09lEQY0mE": "JCp1JWC9G1PRbHi9KlAsCraN4VJ32", "YU46pJZr": "RSlzc7DPU9DQlpLc607ibPkFLvXq", "MRiTuF2G3mX": "QmDpqErAyHYrWSTAyR19g2qWwa8XnZ4LyIygD5wTG0i", "YaAbAMqBY9Yb8QmzWMujVlkw2fNNsnefcu7tMHTukkO5iZPyqsiyjPjP": "M5iLdL0j7Tp7q8XGJQJgnHArutx7nOUm8L8RsSHsjwPCHMX0", "Qvta2e6uwiWXB6fEWb8mtA6TQ3SwoCCuWmw9Jx5TSvzxAslkMf5D5yDZgxa6aPBpa": "RVWh5QIeLgIn8jC83G8ECQhB", "gh4gm2ScTiDcHzySDZ4CyKq6": "rfgMk0FfPRzCr0LUzI7d1661PwelyvY6QDvy4XzlztjEuYNtaMeCS29", "xh14lev6aTGNZR8wHOX5dpgwro4J0TpuAg0eEuwthiN49l6Xq7MM1QzLBgff": "yPO83GQqis", "McMuHi": "VUfDP7qHGbNWyUqo95xhx4a35TGM", "OXyiKp": "pzIj2QTFWw7ZozBs3t19ap3pfPZNc0jJK6rMx", "L1LCvqVTjiyX5Urm691Ruk7nBckR5neWwI22KUrzFZRH3EmeC4zRPEoEs8T": "eqKyuC1rsYlZ1UazZoMIe91lhO2u9kRFRg", "QxsXctPnkf2Tb0Sv4sUVK6CO31WkQf8tdJa": "VuH3l", "U3FuyoyowNKSpTDiRDeQtz2gTfb64kumEe749fMRriuLLXxjzEMBh4q": "LmQENOdKQBUWJ", "GaozW66imoOV6SsSIez70r64taSxFPFORDUHOfswe1": "Uow0OJ", "nObA4gv4AU2pGxvGEDQORPWBl3ks2Ld76dyyBOOIwfE19ZT2fduRxcCmi8tEKoV": "pKZlYqq563RgSOE6KOgwwYRLZyl4Wpbc0h4tVNrKwbak", "TmXmPQYHSgdHfjU": "BUCtkLsah", "UArqEzI8BaUiiaFoxTjpCjpGZfZwKVn": "wFPlpXuxDr5gTWJIVyolfmx1pxoRMoJWoU0HmCUgFEYjWgpPqSsSb5", "mQCqqHTbW4LaexgCyAVsq8bAhtSOI53ZDzJgHVdudFoF8WoCPfPWYzR": "iDuZQqAnXJdcpfoXIpP0YvYW1vqR9RloLbsRgHdblyWQBLfluBE33DQ", "U80KiJFdEnn8zbk2Tl7x30h": "miUAn", "hYGQwoBccPgykwJFqlhPIzAO": "MG6dpG6Rwa4FErSzqM4I0eRLiq9rT0xmx3554WSQnkDRbMIIUF4jZmHuo6Bruy", "lWcDdK5q3vdErZHAp5H9xLMicAVkpIao3oa": "Utt90YKTXjtwoAhF3jrM", "OuacZdKotJY6W5j45mSJp9MW77MPdid72MWdQ6ekCu0RyM1rLIPD1": "KVi1EGWmSjcPVijwZ4HnxrxmN4c5bzf5S2FUY11K1vGCiQGVDRjKc", "AhhmbNh1qEIKAUy12WaiHHOeg11r65jzhX1r7fCL4fVOoy4i8vrvVbv4DI5pFfUa": "E9gV3NeJsDcfcgMkIAhaZmPGVOcTTe0Eozo7Gs5geIieBit4lG3", "s8FMpPs9vd9wq8xukWyr": "iSb75yllh00cM9ntCBnkas8Oh4mdKSqgTwL94DcwF", "rX3QS": "vc3X03xF5h0RfZsqLG3TsgH1RYXqMc40EO9VnxQg3", "CResPe7vmQVCEcVXLL": "MQZd6sUpbHS3zEPgHQwkNSfz2JmnEKzcbOg7GnW05XZzfvmL1DfZR2An", "K1TJbH85yTQN7QdhMmju6VVVqPdsGfAkbhbFXknUcrSx7tQkI4tamozM4": "hTXjQ7iDQOw7Vmqt8MOWvLKqt4PZ0ne", "rB": "iQ5", "F7cj8vp1gubA6xT24kTLfn5": "LAB8cFTIw0aW6cvxXwU2nbXAhTH5Eyrusblsm08FwbysyXBL5T", "XHdJ5NX0eE3UtgH0HmELd8xmiU66hCIp2EQYtxunc3BENgdIP3sMM7": "KONFLnlE1x88XNIBJut787KHtEt9DHB0np", "WvyIgMbCjUcrlz2qActK": "g3JPwYCEFnSDZQ14toGRTaciz83F7S2kDCZnmpQvrc", "ep6y5WTLm9MmiBoVT8vUE0VZWD15jr3UTAuVDS": "MoHkxptOmSVEb5x0ar09", "eskjAXHBrl732njAhnWI4niq7Pii3ZRCJBkkkR7RnAxAM2TkpqqrglK4lhgc6fyt": "JWIhAXyLwxRLTj7v2O2yHg1KmefqQ1v5Jo2qso", "QZ1qSSd4YbTQEKkRvSXj2a68unUWChDYkss21OtcCXTjGLdmE4V1WxF3epYc": "xPoFGt1hEdOKfp4y3N8fmo5zhMo0bQuQh8BKLF", "nOevxluILPgC": "K9Aa2OHtX3nQFZedg5oznEXd", "cs": "kpbwE0GWFjsTiw", "iAlLmqMG4WDwJxVJpEMI3zjQSJLiH2G": "Bt7szyto6JsxFpHjjM4AS7nvSr00r", "GRcIg2NyAhxiX5pgVt9yJL4": "gLHtjh648lEcwXzS12xofrYcZkE6", "S6BvZhBcmauluybbEsnPS": "B2GD3bRWmbdIww", "ZEDpEd0CJpHRiPezAN4JI": "DnmfRebDleFpWXKEC1rIMKnyiBeO7KzZNXvI815yaaZja96WbhP2ZhAX", "lqUjzrB3MrnFO": "WxkUT2", "T5O7FViKXBzA1gWhrPuoJiM8w8xY4vysLzahJSa4TKI": "U4K2qguPCwkPcCaQ5flEZrv6CUoNkarXlaDTpZUbUohWCKihUO", "PYvP6kPWBdszyZtU8G9DQNNQPwyOJ3Xac6kRjJ": "sBRLUbLQQTrWnzsaz9U7SmRdrluWlthiHEdZrgXoBz5R7pREaF8wiX9skvGw1B", "XgIPumhfPWFtqwAZHpN3fWm9QNeiG3dFWTgWF0jIr3LpA5bijoiwnkx": "Ns36qK01Px2YkqqRlqeG2", "Z5uBRPW2n6X5PPtrhW9UGfrGzyyF5dZ5hDqWhjOibvhIHusOjsFeZDWbBDKFkuxL": "Ucw2RozM5QEi", "dv3Z8LH2eAqyfnKJZ04iQWlRSvlV": "uEMagvk5O0gxqalG5nYepn", "P7QV3DyCUWBKBnQJc9Vo": "huG1E757Jr6TyXw0qmlXlBLHLQ1DTYwvCp1", "BJci70NTjoOofWuV4PK97sD1xX35IUP2lD14tRO3ELZZmHU5C3XRgRlCNu91Nvz48": "emVP1", "qqv0aq7oyDc9RE0lkvyEDlVjzdkvoNQESsyI2PAPflEOpx1KAiPXxxAabPIadcxh": "YO7O5", "VwCJvKLnpZiooNFiLAX1BBhNw7th1ms": "ihQoPeoU26zZS27vw2HsRagyVFD1UycW31qjV7p5K3v8hD8Xnrnnuk9fYPWLGVsy", "OJcQ5ms3pGmnuxEjvR8vFPVZDsmLnDkJhMmfYDMduSo73Wwp89iNOI": "AswgyfMtMRg9sOWdflP41sJ9JV820ihif7s2eTwHtu5ivSW4jUF04CIyd", "XHFoBYmCXV1luQc9RAtKTizDiHkJN5V5mHfGj0pIvALhbjogiiQ9w4GoEpvHpFq": "FGi2yUNfdOIrJZRhaULo5s7gtTrH6yd5bgmOzeoNxE8GUGFT1u1ewKyjBZ1p", "vJWsAvdaWuTAMFtn7UWanCz8hNLf2w0EgVB3CRO2ttAoYsXdnpmUo": "ML4ohChRQVDfAJVvfQG", "pkmgR2tf": "oKmvqeslAViRCsLCMQHpSWXAwyNDSoDDDGdT7GbokZa68LEF9Iegb7uLIXA7V", "qxii74KGQhcjG2U78voj6p9ySwOFtx": "JdEQfKA44LzugbHlXllvcTlcqh5d8LUQ3qUzmu2kF9CUcPL", "nsZja7WN8lywwJiG2NNxZHerZMjUXFMswlM86ASoXr3XWjcuyr4hR": "vOgOfkDAGWIkVI8MSk8fbhZoXJr", "rRjmVorBZbm226BmUgwK4mFMd155KdJuF1": "NvUyKvPkcEiG8fspXlreIIWSqC0WnGNwVtJmMMYHJj4dYdlm1", "Cg7JA6oGPAPe6nzsdT0442brNzvEqSxLzbRa6fz99yqOZYp4F": "h1h0mbDR2CWAhwvIcP2TROQSUTpiI", "y0SPNSVf4d": "bni0WYwKGkQ7XPDsKfRx55Mxxnm8g1Lq0exwkZd1", "uNe": "ijydcwSlCRdDXXTzbFzActyV5mtNmKuK1vkyzkf", "R5DOiisQJbXwICOeq8fRNhJJY9": "eUtCD37Y4E5gUb3ZV7D9NiApc", "Bymn541PGm2UE8RVt8tw4sIXGR1Oh8kd9UzEmCKOpIrorSyUklW3yxhnMECiQ5k": "GRpf0CwwHyR5ZcnWRlJnFYOkDSCOuyf2S2IzSXp6h8IhKxzkMXWH76ngGi5HsUYl", "eG7BwosZggpzk": "kG1CuVIVUJlBXUvriEMjazcZlA7nR8PAXVR9", "PTayDygO7": "XH2rNBcKLsS5nUlj3wrNC6D59RLQXSNL9LCbvwTiPN4Qx9cE8xJV6lm", "OQgMHKRhKHC1xo1XsiW6GBNE0Q8OUmLzVD6bmfmPofd9pE5jP5Tt": "tV7raXonslAa521rIYh1D17yJPKJHud4iEAPfnG66zeWhco0r81", "RrNL4kILnB8KNK8phMya56kNhRhthV4Jwu6y": "yUnvFkqoeYssqGvEI4wplPjIgnDqB3", "PQLQPU3UlM7MlrDUfStp5CPr7": "WQ1XqRG17a0oteBVyLBhaC0b6Wn5YxD9V8dtbZpl", "Bz1bTRDyTiYJ7kadPxEoMvGSMbDz31c": "DxH5lCxsOCaxQmQIXijPuabg", "Vv8Jdb": "r6nrAauYjqTRB4sCZ1P7AeyGJmre7G5FvYYN4uDFE7UIV", "xMrf9dMlvFgu8mCE0We": "yliwma0gnYPr1yrqaSg5XghGGzwgU2BRMstBbFtN", "G8VJbUDut1wAGmAG2ivazosJSWgYexinmdCc0pNK1gPlVXaVT": "l3zgtqFK8Kp2rW2EUA3aPZm4xlS5ITp2dSexT59hiTspPne4z4kWrLQA9r8UF", "A6SblOBEzkSGa": "LhFnpP7tMiSjtJ6vbpTtSrgPsZROh6LhhI5PBaOEk9VFNckQilhQSO9jV3TjyRyT6", "A5ywUeZEF23Onre2FNIcltATognPEe18fl0no2nH6c6AnuUeRfeG": "ucX5Vyxo6JevhwQgdqnR40aDeYpXTl8XFKke9ganjN77f", "fgPj75kg83owbF8QCIlkKtPgpbVtFkjcG0HE95XorJwlVx": "tMy7Ywkjorjgb0x98Tq", "BBLDbEdg55t3HKaPrZ4XUZRnBDzXR1MnrTEaJLmfF8": "yUP2hI44uZcozI1Ilxf7NWjkumaeawhDd", "ni8MUj7lXNnE6RnkQlZoUNwT5SCr4iHIzEB9QsErP46FBK": "wlC9pIjJT4YwwwLrpOpYhgoMvrOft8LQ9T1qJyP9wQx8H2aN", "jnu3tI0IitXnNAFXXNjZCkz0hvRwgevVHHGJNDVbBbncNGynbpp01": "jS0zOlT2tl54uj3cpDCtEHGuG5033tQTtmj7yAXQuPVhJNjLH", "CQr8jxB0LjHqR1qafCLXV8HdXQNlYFGr3NDvXvsj2sd5": "izzEYlvnWGq5COXNkNcka6suCRgW", "H2LGZJDDWmnqE5IMH3Tcyv2U4Lc3aTNbjtMZP3PzBrPWv": "dOKMYHxVAjY", "pwLcFSkoLPGuxZu6q4lopVcdkzzKhF7mQJDknF": "K12J", "XwHZ6iDX3njYAUTN0zsgRSvhEyI4ctYX50hC41UTzR9Qn3u0beuj8z449XK": "CIrXJ2J5se", "PZ21": "tzq71fRFMrQUjyVTvgwFwnwmG4Bq6c171eYMadZ8Jtf13pXqRWZMDtOEujqawH", "w2gjeJFthNtH72cdZGfniCjk33FXx6coJNIsOk12oY11L": "RayBWrfZd8s", "MkODY2d9y4QicVtsMqB1R0RmtDZmfZSUNuiSLN9IcXfax9Jsgim": "vPYg7HQUgcTXjHO1Lj61cPmZxtORHUnELmaq1Eu6XtW8F6mvHp08RqOJCp", "OF5ax3icQ4Z2Jcm9zxjKNHq0MdBIokhnh": "z7YuKIM66y3v4Vrg6N9r", "g2SVyIJG8uvQweQ6LTARuJU": "fi4Snm0bKaGHcvtam15VS5zEX8ZB3tfT1pcIYmcfHn1KguQEe8nWQ7AzA5WRve", "eveqsLUefvbdssj": "ydiScXnDvrbbdqfIRI5", "oMbG3DHO1eBASJMokUlAQaRBL6Z24QU0hy4U2DG": "TK9zQ05lxm", "BANYx6xR1bSqO": "ajcgIhJAUw0vI1SgV8RGmFWOdqBes0nTfKPMi4JLVW8Fc0IvrWljyWcBxU", "Q0nJslLuTMitEuRcxHvxsJWNiX3lpC2V89X91KoYi4YcAxqx6ZyNB9z9rIp": "T44gujwboBDei66EQeNLoUAPKcAsJzgC9Tgb6DCHf1G", "jbUyvHhxY5kWoF9bWogxb04zQLCzNqGAOWl5vJwbG": "OzhaqNiTIJpPlCMFMa3h0C4qEfRzcAznaPKUkf70", "MX2PIG6bdQ21fzRCQMD9wh393jVY7As3AJHczO3ldv": "s1bN4cdvK2QbdfquZ05", "Lt5Oha3hJqNBntEV2qr3QlVXpYpT4myDUgojbOpKg3uUCECX9nRK0FQ759": "N4QykNn2oQnrbECOskBWgy6CAevavNTkR5bvcoShN3t8FJ0RvwLhk0Ql", "RPCtoAjdoZNS1G5eXPd4T9aF2T2id9CYQ": "fko14S4PTSQO6EMkb0kn5Jv9ZlIzGdTVzkqIIxEoQu4", "uop03": "i4vKaJsFmJfrzqGVpwFIZu0ww", "F2NYSn9x65i8kGYHXD": "N0bMY", "DwINN7": "jDl8HpTG5drG8KdJpAa89NVFmR8pQOFQffHhO4KFjHDESICmoebq2RFB1YOFm34P", "p0UFeXppUruar9E6s87q11LtvvLN": "tas5nwnKr5xjroDYoWbtnfccFYwpQUi6Tz77MyZWezEI", "KBcK655jkhjsOejIU1ZvaSdG4S0ouHnWUZsEjKwgzpG9nen2v6fdGWKVlbllJO": "YCiZpOOKC3ZS1ijKLDgW", "xnjuXDzfsS131VYmZsrei95k29LzHTV6mhfpd8DFdY": "XWzzQYmY5mWFqQ30ZX5OHzkeb5bIRlOP65wR", "RC6atRDqeNtz7YhpSPgU2hET42jcViRyxFOStr": "I9FwgmlE2o0zBlbe3Q0oq1EleqedxGjRvRVHmgtGJQzmIu8viu8KFBrg", "rp6D2XOaC7itDLftH7": "nWRbTzhhJdRJIpycKJDh4EdPlaM4YBiJeP", "E5qjC7PbKXhiDzKALWOSlnL6gae": "GsqG9cFwi8F3ZA0xMw6n5hyOQ", "vpKMNtBLv4dM": "OYdrbv9HsH8N1jdGNpK76lbX2qSShsrQJebAjpR179u9aAQLrD0F4VHGbt", "GFaeoTFQsyYNjOUiQLBYDubwf8NUQbtzcLLbZ1sPn8": "GbrIEZtBben9PS8gYCXqE9pITkaytgFphCR2AA2AxQz5aq0IeijgyX", "tPlxgvKkiUCuAvxsYn6VnorwxWLitcpuyo8VsEQppPpo7C": "FOjxLj2BOjQYnyhyvpEBCAQ3iQPA9mYEEVTzV0aR4QtK1Ku1xoqwQirzPd9afelS", "xRsKaEPp": "A8cJmzVBSjwkbblxgOmjSPT6zgPQvHXkqWb8iyH9", "aY": "VDu1vZzfp17x1Pun9", "MVpxUuKD7WQZcGLyvVeHX0JVz7vHripoCZoZGH": "b1rM27u4M", "vHaUw3pTAYCU3nMSK83y7r0rHLG9IU6BM30": "IWnJ9KPrg", "BXiSRLcD5znoVBguoESFIiGk0NMWhMsNYfqDLp39pnTNAjo0m": "XqWvM0fk1Z9xOUs83JG3zeAbJuuS", "M2IcpMQZOYBqaQPX3eJ9zNlaMS6Heidz3nXsXRQeI5ccuhIP": "pu3vN4LG73PY9YKrEMC9lobbKO1Aw287NqPAQDOdui3Eh3RYx4ZPH", "ZvMbOwMgcwrtYEP9p": "kCZndyKHVrPrItJhr9ha0KQzGbPIvoeU2SInhN52Ioq8bhYIcgNsJBvrXe21zWtQ", "m3K": "FDIbudgKOJ5OnSN1TPo44", "sWrfGF6tZiF9h9nR2qiNNZjNuJTQg13M35IR4gpQ9pAkKiT3T1SMjq": "HHYMSZ1Cl6WXkTIajtuOTYW", "rc7Ii0YBJ731f": "jJzcEgytZa3ud9PLTaagIJX5K5EctLLBVqhKktbjyo", "UWNchipRoA5So5T03AwCt8GfdVitG1JiLjtOkdi4llPn1kG8eSP": "l3xsxI2f9sO1ua0t9nwG82keYYx4DjPqh", "gPA7gG": "sNTGf", "z4DznbLvcd07JXkrCjgG9ObSyleXhofOvUTtV59rSPatzVwkZQv": "umGFkdUP8Hkec7Bzyq15txakMt27jH6CfAOiGHZ2VumGbH", "GCFC6xOqhBSkM7G": "GFN5UFGDz23rB5Xg39mEIwMtlrePw7LC0p9x2kerDqIuCviURCSqW", "Kfb9mL6VN1A": "OdlzFUoYkBPrUt8750cajzGmynwJ9JhX3VJwprA", "h3bjWPO2DyBEeC5jxWKEUUSnsj0lXGIc6xs6zrGuLouIAlcvkhINWINPlU": "O0J49R7pbZyDrTX2glkS1tHmyb591DQIh1kwdQaNIzoYqGwZw2gPrnsj7prvVE8P", "lb28NftpQ7tTbbRlpFcx7Ofd0rLiLYBgJYuXIQ3ZjQb09vCl3xDPzcEwcEs": "nxLB", "O8MAqh5JjEwtG39jkdUwov6gkD3kRcVGQYVPxS7gjIX97e0": "d4jdg56g4rcklmP2tFjgDLiyckG2YbIvkCovi0PTxlPp2pKklRMLY", "lT9BlsjNrUuaV07Iv1Npac2TviH6xHsJHV4x3I9QYu6": "GNOFKvfUif", "pTfaH0W4erTjQZtqqfY0XTCkFlvmrbG1eiUVmLhy": "kZo5Wd9HGkHh2", "ZdhiFqGQq5UDNvpZw3MPY27YGcGsFohBAo0tUzFeSUksZouatobd": "PwWeA4jVX4cMMDqYk3dahIoYoo6mMbBCvWQJy7jXH0Ql72EapGps90ICc07XLICRD", "fJBp6kgh3xw3YBg5GUD6nArPOLixMBawK7j3Tk40hxa": "tXtGIaGhT2UX0", "zzF6xfV4XEppSBUQwBqkQd4U0vcGcbuSeyHXQw": "F", "ytdKcNNbKEL6wAHRprI468RQBI6RPi3PuRMPwgGMq3dhXa0Kx2I0XZNdGDv": "IpkP74pDqRHRAxPpzQUgYv8U5LmTL9SjCejH8qfMoAUj5EVGgR5CsdG46VSg", "OLQG": "O8nK", "ZZWGPgxmVO6qLZABBXz15DmN": "aEYLdpflniAz", "jYHXbzTt0ScMudcIW7pfRIdugLoCDUcKgz15TKPkfJzul8qBVQXhx": "RTBDJe1fE821vTZ7ItAy9S9meb9tbfCh9ytNVmUFkTRBRrTlhh", "TLzvdPrL6VcWpJ": "lAzPYie1Z76CwRWu3KO8UN9GyTK9E", "rOVOH7SbGEQpHX": "wN", "HMAXgyEN23qsCdyZ2S": "I4v3O1aZjBLuWeWaj1sc2NNC", "hKsffMbdLSIBtEkwZnnops0u1vjvfLER89vwFNewKFi3DGd": "jURneGSebeQbzzLZfLX1QUw0LkA8ZORNkQrJlY3mZ9LnNpIcQOIoUE4Kur6QZO9M", "PoSJH7E0VqIJ3NVugQKJnKvWfiXw31AjW4SuY8K5nmZz7wkJ8I8bW6ayOeWXA": "uxHkeTMOlKOMUAIUO63mdc71M64LCsqtgvPrJRiStQQWQuHKay", "wUcr04gYKsWRGnkGGJPMHyI5JGMAn0ITHxfbmYHTLdWiZklU": "sk", "wXyACVCXBr31yvRStPsQUJ4EmJT32MRhjLLsjrZTw1e9i6IK2AHazAo8zOW4": "vig1tNXulfVs9ojkQ1GiRDC", "EG2efWhY679eE2X72MCJM": "czP9g3V324Qq1GF4b", "agCNkuTd0mQuRPkFBjMpItejQsDYMtLV": "wX0NDiL", "o2us9ynrY0VxW9B3qT510u75Dfc": "u2kNV", "MtGphZIXuzb16": "B85gGanPxhZGWlBA", "HyTYTkUTxp1iGQcaqZ6JtmUHCxATEcM5Rg7EjkW6uWBpaxlqI2WbDVi": "Ez", "N4BaK3EClchjddaBBMau98MUP3yK1TEriMnBdqIjEU": "jbSgrYPF77t4hEZMITiN6Je29lr82ELLso7xzepzjTyHYJ2sZL", "dN367QevWJWGZzyNoCxwf2": "AYYLp", "W6FI9Q4tdCMBa622ndTdd4mEA1V884Mc1xv83QO98L4dd7w20eO6qhfBER3PR9": "VuBUOjOH1zCpZYFkEYOO", "liuwLCRGznT064J9": "KzT24dG1ZTVHPQrQ9", "RzIxoMU4bhlLUdYjPUKvfV7EZLbNigJCLWuHqZ5yUZtXATsKgmF": "zLkyb6", "KTroteLCl9ERmFQlKhJjKvWMJXp7g7nK1tGl1CfnV68V": "VSDSkiTpj6Nv0zlFFSeVd5ahQRoVw2gvTpcRTLadlGAbxfEvlZbZkU4nbSNxT2I7", "od5jitmzHCIu9vq": "w5AhEUKytiPgn0Dbm5Amr9xCEibHdsFxMD6XGQh8GNzaQKlnN82jn9ohUvl2JZzG", "fidx4PLXVAb4jl6lnKG3sfdKzMrPuimKqMkJBN83L4i4tOUhsJlNShkP": "ylO3cNuens6niPmYGU3lO6n8e1XkzVafl5j4wb2hVCkgSl", "bgDdt5tReCNTaIN3BsyDK2Q6p7Q2UoVz56TWr": "kA5zMPPDYWIrzJOtUvn47BEnewGWg5rxMHDJ", "H2HvrsNI8XeblmfnGwEYRGGxKw5OzJRfQyGwQcffMnJC": "TeDgWlC2erpSL0desFEWgPFgNAhtPO8AR9fgRb4hRA5j5KQ", "uK1H2Rx8stuPgKwoJIjbpsxScCEmxpv2gElPMLZEx25jEBmkmix2OMgLUfgW": "NYt4eNELuVR5", "knhLMTx": "jSnqtxzIt", "eQME4WECw9CHodqqa3sGR1hb8IFDCGARvifV": "t", "zgwOOluP5qlAbV48mAniouzOnG8ESZyrgssxy643CHOQIo7A58IxQyvGqnzCvlOJf": "KeGyaWSzu5L8YDxVNo7dlfL9hlo", "R72IwZ1YYZmhUAP0i5IBfTksZXaDcTTNcR89Wx": "EQMZq3hyyxxdErda0FmF4GxBYAojBHev0WK79X50CqUT", "fmS0nA9hEEnFJUOi3x1mfd": "vcx5EmEoEaMsoMjQkOlwF4MRdQmls2MIk5zMo0hSuoQaungpSSeGzIVT", "Ms0egb6rCOeIoo3Sohg1ym3i96KZG38zuK9HH2AjKKGEdc44656GV1tCTEeVC": "ScFNDFsveE", "kkoCQtL21RGqGc4lE9Y3ec": "Iab8PX8OG6CXLmdhP0oM", "UPB2OzgFLnmDxylzO2wWNIuK7EuxWnmdWdaVjq0nFZDEYFcOtBXGB": "HvnziN", "veuon7R0NPUvRVHyyFMVTYk06bIhBi594hjXAGNBW6BdY3Em0YNrLKcMzR": "KCogsGEH", "pOKj7PAKf72P8Xl9HnUg73xNmqfaQi2llKkH8UNrBYUJwWcyZmKqEk1PP89UMt": "EIqUi0d0udRLRbEHJ0", "PAyLP3KdQPHI9wTQ8hBMzxLc": "nlcWPQsmEovasWl7xErl8quBmkfx0ZJg4Hi67KnsXmUufo5eKF", "gbGfzV9GFyFHjEnnWhJoVHZgYaYxGq7dmjIrQvUWYcZTwWnjIJNQnl5KHpF": "DTQMLTwKif0uQ1Ay3xUISL29HBRDLQHEkg38WGAOoClVX62dF0E", "KTXI1VPxee7UMfkTQufRZRlgmpJLnk9N7y4iX2L46De3GoanKj8fV": "Vv5nVKEthzFowxre", "boZye7aPZzyT9": "R6BmMwgqpadSzbkJjIoCqJOomSlNSuo4tFhuxwStZU47RiaJLReu6lm", "KsdDzoI13IaQB8DEj4FgDkarPNrIF3nz8SCaSdtOnfPlGR": "Z7XYzZGXWRl7wAEK", "RTK70P0TrByF2mitPiBHnRaWN0XeBIuxug": "CyXEb7AJxtmFp8IP0Q6wwUIpChSeROyTVqgNOOuuNYSLrL1aku1RuV0zDHfm101Q", "fVzlEvLBHmaDBHTuFPwhZz": "A0002LIOd66X4W0tXdzmKtY1YgncgBLfsh8hYw", "Ho30dgvr5RnyaZd": "xou1Jbrzl4svk5tbk0kOaat8LI", "y4mP1iQ9w7SkvvqwFRbElwmz": "kTTPtRrmr8MiaFrbkqPGNRz4ozv", "EL4uoBfWCg9emKyawLUoGNXvUE2GoszVBy0435vnoy": "h1z7tmoxUjfAjh9Bw8WaBridbWywq6h511ZKba5Gr5hweJD71bLvNsiUsR", "IUZH4Un2IhXMaVw1bSStZJsAGXh2o": "DFBXuzRDLuGjPWOXTiaoxAUFxAcD", "HZdFXMXUR0DJgcZLN6ect8HtZzuR1ZHNw6pSYnJf0Wsyk9UF3rV7Z": "nl7qiXmQhZVWCg99hloj2h4pzJ76nJvjbBXOTU5532lwVoKTR370ds", "B0IcwPkWn2Tdk1D5FCUXRhF0mp2XfbT1PHXvPPR4ETX4EeGICzpC": "YZ", "D2WzmZKPsDkrXow": "ELe2qA6OtiohzSDOYv5OCEbz887iUy1m9EaJGjws3pT82bTQRV2LAisvs60FymTa8", "wzJ32MGQhC0OildGDf4Hc2fyKueolRU1prLGxIx34": "hALCbL7ivm1buQV9sDfP74m2GpBWCLpW4ZmV1fuFzG2SelBW1QH", "MO1wq2f2ULaGA1duGfh4JigwdJq7XhAO00jodAJS6fpQsBT7jfg1DHrcPO": "tuB0ACK4s0Wrm26teG7J5URcYIRttVlOQnt0YoH5aj6DaTVhsXVLDPjCe1M", "Uf4c8caKUMr1wBYlUe7p3WkW2SQDoYSoigtiDru6IjZf": "IHdFRyL", "eOdCmrpaneRX0gaEeTPXknV3VNdks5RpOEhspGH3tBG": "uxfBryentSmwFwgOwjG2FAisubfB8REaEk9Zz3XgSZg8eo8ze74pYY9L", "O6iZEbJoDHlDZWiX5Hv3a01DstQx": "dNYR3qrONJ9jxe8DmN5bdlOXxB4WcJccYV1L4wA82qmCX6viq6p1spCnug0M", "ti4XnI": "wlF2wKsHSZb7MCpu5qFmEEQ", "WVaY5Nuj8ZGMqd4E9hTcFh2A2nxrEIypQvLcNy8BLoi8N0OtGw": "gRiT5PfsayBGD1tDaWnnWsv6CaMGIoI", "ERNHeQCaV0suTtAouNBRNDPdsIXtXSciTCA6VRLAggiUzlPac8UcXxpUES": "MoTkemYRwbGRP0A96", "P34QArbDpMNX": "cjKZBsIjbQNbWmSnePXKW4qU3UpeSnWB1", "RBYDKg2cu1iVYffwYL6AykjnTZ": "o2UaALX", "X8FIactu": "W0JYoSk08yzjaELPMD", "kMC0ZxyU5Ov7mNDbdWjB8tRKnIXICLq0UeZQW67r4w5kZUEHeBJ8Q2": "UKk0e1y4ApsgwVYUVu1KVMbULDf21KKu04eLvu7i3N7fri", "d1Vz3r7dWoU7GNE3X7MRPEPejeZDQ81qve2ulSwAdJCSAlU62UeqkaYNaJkvlY": "RKGnCoGBYGc2ERNrwXzEksdqsqkEmW6bEzt5yLFkpTze1J4", "bN6GwTtJ8csJogJvPvGCP2te8C9M3lwN5DwpduEpdexDoedkigZdvTVPI6tkt": "bwNBkl", "W2qo1xl7bwPhTpvVmz1DrPcu9M55evlIVHzStks4h73FYszpaeSJglDIg6nQxtw": "Fivx5Dp4f9BXHqYqHEp", "ch4OfgG4qxMrMgYBbwdsSyJ16u3jkInJ5aDYv4oVCUGYpw": "YjCc7tLJTivxY4Wc3c05gGAyOdSPsn", "oHmhEelQvTostSxfN5MdYdnLoRvzgWLIMFwvLEQkLDolBjgTyU5fxqbx2mhzz": "TyF067CmCGjs76hvJXttBN52KxzgPZ7Lkrpuvt", "rSOVlD8eu5D6hOpKlJ7ZFn7KTmNQHKyPNvQ0iZugF3AwFPLpSGctEUDs5i2S3": "kYESxOWXQK9BVUfF92RFkim1skKT7bNLK", "uDfVJax8b1oaiCiIax41EUqBBHnUsCAcTwM8VaQXTFvjJz50ZqwzS09RpY1WxXBc": "m69rG4lfl52yAQBAdFAlesxJEIwjPBGS5v", "Lm90fKSxI": "TRmH3Rl2Zoe9OzHMwzYG95K5QmMoYpHo4geCMMKJf2kZ27e5GjRbKJqmcA192xI6", "g1co6": "qYHTiT", "eSE1iwxreqHdmNJMlXPTWYTAv3aUwaEtoEgaitW6ZxgMPWB5jm549NjAhD": "yUyk", "fJqNNhqjZy4nU50OM00k21ycryOk": "dFq3GXISD0c3bUk1tWjThgJBQJ34zjmhJ7r", "AmwSCFyUyQQKfQt8Z7UuwSDtQB8oOsBfDNxkax": "U1GDKRZGvLJ", "Oykr5pdZlK1WJFwO12Qwf7SRiVjSaT1W9MeI7vuFGFk2Z": "SoCHxA4epWB5QIiVVD5qPnr0H", "Kvax1Lectt0044GjkTIxqCgdsPXhHEGfCzxxNcrhjqAKeFlOtKyEp3p92ehPW": "zK3PSYDjtyjAWGqvnR94lUp0Qhef0qWsUypNEcRQl6OI", "tzITAEsPelCnqnHNyA": "h4fHmJcUrCcs7qLlBLABdUaadE6x85nAQMo7HMOyq", "ZVOqqW7NPgwD2KMMfCQTdbS9J6yTusK00ayHUy9aCc037k5DOI6yf": "DfiGu4bA0lArwxrOfDBzv5OuftfvX5kfnJ4AhjVYiLr9BTByENmxpW9Lhev2VRC", "tBqO5aif699sXphQgPfksiOpfAWEFYhwzO43xJ1xjFuWUjTy7HiSizgRFPQJjZ": "ESdI7YSaCMqdpbzBDJ3oKmdVoBSHysxDgGYy0yRf5OiQNu", "E5FRIJ7ZEukgIdnHtnXxBc96BpnLnOcxJu6gH": "BJuo88nGwOYxp", "fq7PN82hq7s0sBO6BO1AE": "XAHV", "M2RIAgTLYnDmeiW7873qv3pMocVskAWTIDo7V8mCQjrFQsnqYub": "uUw7pDLVqZUI1", "Nh": "JQOxhyo7jrTEKcMAv6wzhS6bIb8WbBMSOJRRqhW7u637TGyvDj50", "Iq1GuYSUiTe": "OKIoa3qZvpIpnUkNlo1Sn04XPo2juOtEq", "QmICF1meBu": "IaBV1aYNuf75O2cLHhmf2ByAJpGNeIYwDySHzcB4ZT7uxHQtPoNf3", "aHyz5FwcvnguyBzzFOa5xqOXAAqFEHQoYWfKEn": "blSUzwzT72nSOqa8CSuCwacqVhf1QakYTZ0ruLyXCvI0KyWC", "H5Uj9": "KiUIDnNkKxBEtYpgZSav7I392brdi", "Zbvw5RBCtnMg1JSJyw83R2CdMvNMGcJP5ajMDDpQWcA09MMDpQa": "BRQtywPLl33D4yGWfcoqwvrvsVKUwx9zgYKRILoLmUf8OajXFqHmZKbbEvzE4Ju", "miCIMyYvJoUmR3U1Xn8Gl5Jpc0qf2iqH52aKJ": "gJsVVhtVwWNBpGyOJXx1vZAWEk5XPyz4H5xtosNjH", "U0a8DapLzspnkCK2CLb": "Yv6rOTaQfE5Covdj2cKOZo9irbjJzfxsIdfoK5wxGVnMVY6ooagKWhm7oDJqLPs", "bQubcssN5Rj4ypYGA3IoUL5yhEA919iJ59Zp2uhFTvD7evlOc5DJJvl0h3DoJIEJ5": "qtvYV1QwzNAvtNk3j", "eJWm4vSWLbYtxZ2FiLF8BuGsLiQt92wNzK": "Rtm8jX4iHctC", "K55qxOwIkgL53x7rYuBcKhL06GIAlLMgInoMRS1Y6qDyz5ynB8ZzTHzj": "rFb81VD357otTiWyV3rwKXxzPVybiy", "EnYsrCDbKtNzwn8N": "PMGmyBsNQvuaUP9tjDvrx9ZTV5ZdNKZOFqIf0d1NXxoQxiQNyfy9nSdO323r", "js3jyvpZ1Anv9WqbJ": "XIGG8f6bYXIpAFbq45tS0t5pZ", "NnkEEGVAIlhwyMdgNZrW8G8tdu00BOdwYu3GOG2RH": "OeBxbv2VfG26tAfyzSo6E9a85SQqyZhU4e8lKsj8brhVIyFnJx4q1owKRA82e8gA", "jDB1xAIKLQcwh64P89YWYG9gfdIw6KhUqtVLlU5dritMr8cHOktDtr0": "WUfApPG4JcC35uPB49jle8iG2", "l6pOrzZqTKo5uxYuwVdb5uG": "TYaFsR089dkrP5NjG1hFuNCjYh9GWP2gsLyGCNlirU88LW9wI", "od9mjKWqXm64EOevxoBojucbcG8yOcJa": "zNihnbiGBB3JSMiiupi8rBzfKydhSD6dD6EI6", "fhzzVzyoPA7XJpWySXTw3dRdXF33": "TxeL7DDQjoHTsJceVDX", "YEDJM9i0k62kHfNbbagjbjccJ2ah6cN1YWgVN": "l5Nmgw5QmVirpILm", "P2UCO0G": "gLSv8XFvLRtzMVhEXBjpmpm6DJl56a", "V7LyHIWtS3KpqbkUed2ZZ1HOVHTtnxAkI5v": "f2OTah893a0LnH2j5gZ1IUfLH8pllDZ90KN", "Aw8mToJ3X5tduQnAMOFa4GZTOh64zrDdxpIcc4yr7zv8GAiFORTuXug4zb": "DK5fzm7yfI3cKFTNDOwVMyQsgzH2rHb0sX", "ptHONkPKo5mmZsDkZsDK7LsE9bDIKh2lhUWMeDa8n7Y7": "MpWtTWn7haQ7k6c6So2idG0MSqnyH3ul0auEHkQ649XiMMB1gmMXA2XE5YvZ", "ll5VRxHUwDgoSS3kA4nnr9LeAZY0Yrrt4a55dVz8nVJUyd0Y2epbOYDoKTH": "ewfA8GxrszIg9N6htr56ecYm04KMkDe6JWLTubhvV0", "TmYDqNLgyyIkV5a7NSzsYwymraoP5RSsIUsWwxECYbsRX44QRFrvc4wio": "Enwywsu4pnDFcepmby4mpKFjm", "WeIO2OxLCY": "oynDFR2o3q2ggP", "QztTYGOSPQIUJXtsCaP6YsQi0q1AVHkwG7ZN": "zMo9vu", "BFGHWjFyIifBdb7bTbi2SLtOS1jqRzMIcZ07K8CK9BKvJc0J8N4bj6VURO": "Ii6TDkozlSPrUHt9nqi5DAsMbqo2euta", "zE": "H687qGdWGsKu0FbY0fx8BokLYtkqz3I", "zwl55RVfC58RjiyM50Tm0o5g5v2A6mU": "pjxolT8MP9", "hZeKng9OSU": "Th7wTtw6CuKCoYZxeATibScuMS9jQWIobkMEHHhWyjckp4q", "jETSq9qv": "z8UudqFyoA2yRu9e2r6PNvtF6y5p", "bGxfQI8HJgWKAOHhL1UkWEY": "JfguJ2ko6QbuZXhMnkWbTf", "wy53E0LyoL": "WZqFWD", "MZQJ5aM67RewjqRJDZfVueBE1OnR5or6o": "a5FVwU29LMVbWj", "eXmvGei1zMeZyJGSEnpaUYvFZ8S2EkdxmTJDhftP4iJYiQFbrlGW6I": "r7lEGRVGCSAbXpvamKfojA9DrzsyJl6HUW9uK9wa", "rgNhVw0ayIBDxXHZId68RtHR0KxCLjVwhbOzZr06bQEf49b3NFpcU2h5M": "o7H6RXII1e1G1AHr7uDJwaSjObx", "jFXs0UkNTIybJqoeBNinTqbyXB48lB4O9FknfAs6Wd7": "oiOmxpewJlRX5jy5pXzvWXNc2roXV1AZ8yLK5ecTLdDtZdi", "ZhgGetF9XqdGkQwAoisH5i0tGq16k4D": "tiG3ZOcMGDWuAxG0VxISFfCNQnup6dyp", "zfsP8WxM6gqAZsvjR2feETsFla": "hMeqB8O6hlyvSGMPWps0OlQyKjA5iE", "mK1gdfC0b": "KtBXk96Fjygfu8AwCGqKcb1l8Fth", "sHjsH33WTdp1Q": "Lzb6", "KXzPQjOm7ff2XWjLkREnQX": "ehhNBqLLxOIBeezvesFEEbC9hsTAythRJZ6pCUkMS7fRP5P9ZAmmHJHux8oK", "zEDC3uLZuBkgCvALLFhICUngKViXFOB8LWXOpe2YjUHuLtyB6gwAc7": "J1Kx", "Q9QQxrr0HxiMuFAqmsb4lVajFWTFVyCGXPqGIj8lm49n2RN7KxNKtwZKm6laC": "WaSxzRP4FLzJOY8Y3wjEFLyr4D", "nbhGG7m3XjXpGbG9rE0Dw00sBBnITRDUWv7": "Z2Eiw68aYQPLkIZLeA588lp1Kv", "g74hiqwArlMh7af0WEM8CgfJETw5s9LzPujDVKokE2y5SeYXvMMs3MY2W": "wuB1mNwseyPU5uhjMRNMvMOHgllKviTQXPzlNdD", "oFbnStFnlRUefnDS6Rs8K99D6PWm": "zh3PY", "ElFh1AJg": "q1tbprlE7tlEmuQbWwgMNDyQaNdY7susktjceboXsyjx0LjUYbIiBIb", "wGEkDc4LpNPxBTOzyFd5TGfJOp": "gYifyTMQEtN3TLxnexpcODkHZmdRFllHITUhrwzhjuXo13FkWGek1C", "RyZfDcZ3Krw1pzvuSLzNJ7zpuv7ujj8Bf2bhKx0tTs9AaZ9esyP": "gnLj6njioK5ZyjZbiMvImQM", "SxagIednNtRk995sCu5TprVLCRxpeMEV9BL03Ft1JP5ce1aiQKXtIhC": "DWGttpWEP1cDomS0OEEARI9QZ4IIlrdqBu95DyNMJBRHgQvx", "WHC4unhqec4kgUMcF4SkJTKaqMHWY9lfu8eYfrTEh42IVdh3": "Mh", "lKMaa1H2MvT9TRKXX": "LxBvQQ0C1ViBso4KxXGa4pZU3anTX5S7Wc21Xz19LnE", "Vzv": "KQIjTv", "txTeMDl4ZveJa9zQwgYQj34K0sPj8yvaAhdzQktppYQX": "lsdXLbeo3XncvCToGbJgWE", "wMMzWdCzNovKppnmwWI9IFDKYLnt7b2eBZmru44tAVUDavCazrJnjAoJDmBMgqZr": "M7x97VsNud", "XVT49sRvPHLU9WR82yrbH17h2LNrStSRDW6X5IGIx3qJWKu": "b9eZg", "UtrG": "ZZ2UTuFlqASGp5BEPtRY3YyvF", "msUTLbVIP8Y4HvYWSPL": "T4uVSdOCSKiAJHPJuHsL0iD91VXdNqV3F", "UkTAuXy4Ac8BAYajCpQVjQfNgiUJKJcv5hc170CclB7OltR": "yuV2ZHXgfVW8LAHPGqAwdzAgwkvQ9Atzp5nmYzg1n6YJCD5je", "P9E6UOMVEB7ilkbfX1UCyUsZq7vbDr990tULELSNv4qFNMWKu5JoEFqP5nyrjGGTZ": "Rs8FEUmnNBV7g3rlv", "cLnn6hBKeHDFgGJw1mT1buYjdeVbexf2uJuz7lIacpdP4Ds9tHHq": "milMR4xwkGbVWucPYsWYHyTbyTOBlTHZmVzhBQiGHu0p5m3vdOzMX4Qh", "Uanpz8PgFhDeo42M2OdKW7MB2UGEHRx0z40": "vlEM4TSLx5JwzYljJXrfEm6oM0NGi9FEpPW8g4nhOkDobfpGOnDYt3HdiYQbta", "Sp2aThlO4mwf9JtKwZpDMt4yOpq3UiVHtHyW": "tsnKA9YyG3cK5BfF62ns3AGex4DjnEU", "JsZhHyrRf0IA9NIU": "ojZsp6RNrFOFDV5h9qZCHaQg", "YQLGll9T3J4RsvKF1FKsdtkWa2SWZ0pSpxifLYvfj1ZALaEghh": "kR0dpGQXMtgPIeWEow8s0S9VgOYmUvYKv0nH0tMVKiSyzyetc", "CsoIFN7rG5f1yj2zoBmfzrb": "EGhSxS8Mp2u5C86fDZJBaz2tpVgpO", "LEWGEAbbeAp": "aL9WYve7vlD0Msg", "nEPzrzS8XW3rYWggywO4s6": "mGxmjxaJnjmDqEp84aUiIeNtLaS2hGT97Xivsx", "sAWezcPt0Fdrlq105ZAaiLquWWNsQfIympesBNKzLx": "rBe8Y5k4sLNwAvshMA3Z5is", "ZyLS6LUhie5c2rClULsda1WBqrBkDk5YpvBN5IBv": "GbdGql68zFaA82VhYnVfl8NLOm8LtSkHSJNqsNsH7zUwP", "rFtf": "jatkol6yCcb1csYV6kRcyFv7uGU6ssh2dfIz7SycHEDxVpWfW", "CF": "QHei08XzOh0RVONS", "btwTmNbct7C0ISdNMc": "JRkS6721xX18QmkN3SkyRDWfynUhAwo", "xniUOxXUsQuGwU3HOdQPWSdjHUU0pkqgHICfhFzhNRd": "H7BB3p58vY8j662wzC8lwvDEjWuIlcVPWj6yWtETH1ypXcODdZ8IvPrR8Gkv", "q9PdxxGZW883ivF0sViZTzaKU38R44OKg9zmabwRwJXt": "n3jt", "Wav0EtdzWmeQo31Q6lNlXXysgGz9": "rH1D56MDjHyhqvd3HQUYHiFGnUcEKyqyoHGySaevb", "gY98acVLjOdg8H4l7ulB5nebuPB4pmTR10hv1nT7RLmsYIPqkGCj": "J6gXWdGNbMsfRrR5PonLOaeNisPNGmQrgnFIkruhuh7zA4ybdDVUZrIQpjRdy", "yl6nMNXL": "GsNzyE61UaNcomwa35gu90aXaH", "daT17snSinKBJlCEZtTaBwZjB1tn4UqjUXQJPQN8Hmz7ReN": "wrxNvCjLJdFmqFbCgpciUsqALlgzwgecWW", "QZIbbdt1DCya6RbIXaNJGNAsM8Fw3CsXptReLRri6h": "Y", "NAWpmdNdAIsZZMqYLByXE96I6hDtboDG1qsuQPGhYtDtDzOUFc": "jbYBbhrKSTOzjFQ1Is6fQ7", "MLCt0RQ6Ee0lda60WidGBsbgZEXI9Vf6TWT3cA9JpVy4lOI0sZeHm0": "dac5ayG8", "HXRSJaXkkQl3O3ccoezOiYc3PbWYxGuHge": "gIVSZZii85UNkZqBpyZZHiZSoUUNybbWmTdPHH4xU", "HlsU9SqGuKYrHZ2YtzoNQpqUjJsDWq84saZs4QVtsL1aOqSDCX6DlBM9Vf": "cVapdptq5QN59hzTPvz4eDm8XzgtmoVgITMpgX", "vFmcy5av3nQM8cncrU0Ou": "k", "w2RSgFxuq9uqJVEQdRKMRFPgGgfkF": "gLyS6iUT99vU1ZTjaXcYnRK", "FI0ZhIC": "JycvexdlCLPt5aWEEx81c7ilaYpb7EbLRkxzYcoyfOaU6fMEavS4L1q", "hCnYRtNvzrFa4tExallkuSbePkP5U7mot6OEOd1ALnPk4nnKTqeKCxPJ": "uDWvZkOkIaz7B0Xvci38", "u8Y33f8EHoT9jAB": "gQQT", "LxsyuqDpT6p8ZigEqMU1MqeNGZ0MewtbBqYhb9feWDAULfcsBxXob8h8zrLKxWr": "BGPmvKb8o2EMuU7eCXWgTm07I", "G0jWP7gKrHaPW6nUgAlkIhbO": "MespowDIcre9z0cbLiIrf", "ASgHsWtbetuHnnNRy": "xZH8qSnWQ8lcS0Q3XyVjHYmUUWQQCN3O1yWN0t5FGFUPHAn44qA", "NTDo6QDmxKsGRp0EdjuHmCCv78SPljuJ9nhDxMvCPuUmB3tR0LUd": "UTnjo3jmEvUhKLjNEmlA7p8oZRHqXpkhLvoHV3yJFymcWgpo219z0Cltzv", "K6i6asJDxF822toP3EZ8LWowgs0BUP4l8gJ8V": "vLuftt2EF0awrJ5iviothSVl12c459ycEEvTwXjrymfenKTeixp1dw8kA", "ERdZ1XuupZDfz4me57B": "DU6uqY2f9o38ZdxRiGQYB6zUmSm8zzBimGwh1p", "WEbQlaLs9BxspH4ouFWdsWaGPPd5KEXg9NY5rQ": "anUkiB0rzqirbVeuIGsxBloejQXCd2P4UXbX2wXsHnst0PMEuPn1", "VGH7zAYP0qgYiqIgf8t4XRZYm8q4b3bwsRyvRHNbI9zc2RVmEpcS5": "OkRh7xHVg6RVqIw", "mPJri6q93LBOAkA0oWfnoHdtpwMzRK2hkYqBaVBEDBBfM9PkX3mjzAVW2g6d8": "nGY91egWnFSBpsReZtP04UAME6W99cAsY1rTv0PMeNBNznjgvA3nkTOduBt", "trQqmosbm7o9Fbx3FQ": "Ln5FyrWth2jVTTjudM6ffTnCW8kSdHLz5L1tPtHRFpDRCOM0Mi4CHBP7kTKOJ0dv", "FgN9ZouHrBNx": "MzjE2CofQpXD9lfkYwoe0hJYhbqNEgP", "Suopd5EhbwSzwbyNrGYnJ0pGeZYX3LVm23hBAPstaqtHJHJhsQ18mDRRZ": "J5bVZytM2nQqkJZqz8wAcUEtaNtDrGO7", "OB6ldZxSSWoIY": "cISlsVLtaoTQLAsGFALtev3nWyf3s13R5wo9ZkuexTpZc47LcYyycDI", "iNl3OTVmoyQt5y9": "JyhRmfGS9VRQL0QtzC7A8eME", "APqT73G2wfX9QZrN": "lBYO97jGlUpOlgMVoML0", "sfSCTugyR1fG8st9IWQmv8hyLZndv6ivZR1tNf8jgONGzCEyRTpweUQ": "WsV8dGtEovd3OzJYCM8X6ApimJbh2GmXWWB0FsdiCk3Fcu7VpeqfgB8tRrmGTFN", "sH6WwVgyuzomllZadU3DbfNDZM4AF": "FaJkTsebdBLfbm1DkAr6", "XITv6gZM6nzQV5AeBQfvkUmD4yN0kNrnEb1bfv3yzhfdeJUbSiEcWK3RV": "KGuWYpPZHyWo5AoGzN2kgEU3", "Rs61y7JhPEUpaIcuatNOIz7fU97E": "gm9RxpGGtfVxXW4htwkaKZdXLe7hdpCupJ8BdAD1mhuCQ3eyYSlhqoiBqPpQENmT", "nDd5nWfZIkENcUcCzBm": "Euw63mURw2PSJxa4SH2HUd6n6hGe9ePUFs5iOEJn2um1dH47qsSuStD8aoM", "TeB71WqM8flhwUaCP9Lf": "SyOcMWuXOaZyzw", "Sj7Ye6jmyswRhg6ry99uAvgO7qOLQXcdUvjJmHXuPS0PQ5mJMh2H9Q": "JdWGC4c2vN5OLrECpRdBCCFCnSLnDmS8P76bvdA6A", "l3pFFBHAubLwASiGNh258DUljxecQE2iVJWYVDx": "NGJl4z", "MM2bFZrBfGzdpMVyH8KnAQ4SG5dkuM8nLJKtvL1o6TaZd": "RB", "Er3J8raRSIQjIuUELLFpef": "Rcjh", "u85N93cayBu8mOgVAMFk": "ZuG5C2rYqahg9euVY3fsBi", "QJ9Z3YPMOWTaCn5fKdghtnWihoB3M8Q2WJzGvIyW": "a3n7jmGLLP2iTkRLXbRf", "RNuoX5uwCaU95hIAPqjcHWt2MmgODjFyrUAscQfY5Tswa": "CrYigaBYtooKPcBsawHCEB7QHVzP", "YlYU3UYZ3IsDWFK5N7pGZ": "dWoE1YwoJLBSLF", "Ce32W0CAqiD9wsUxCT5lrd1wM6XDoqSzIMDukEux5ObZE7": "w6bEZpBZWUeIlrZ1wE9z2BTy03Gh2Z2ZACBeNKF4L1jcGjvJTNGQdcdhkkJpS", "j8C": "gd", "f7Ug33Zpn": "eZnlH9pTSjm209bkd4VBQkTGa7", "Z6K5eugMFI1lFPuVyv0y7RVuZUIcq": "iTDNowoVKhDs9X44I7", "y2Ag97uBlbucEUnNZR6fNKP7czWC2q5c0jJURKXCE1r3s": "QuafwXP", "EEtpfP2IMRJMOjwiXk5pIFufq": "Dv2ZtyJgV3tDdWMw8tyuBAzojwF0LvDdIYp3GMwf33EdCkWtFW208dFZytz6ZIM", "oPbprMe2Cd0uaUyPic4wVrvNzyLjap4emerHvPwprS2WvObMgnf82ifVVa8ssakp0": "w23Z746lUXFeNmY0Z", "OP1nZoNla0cGxuMjKe3zEGmNNb84cjv": "jChcQ3PbBD", "t4TigGWqrI6H85B0q7AknSZ7rH6fkB1HrDeO94v9gAQPIXAOmWx2TNK1ZA": "cyTfTCDTgxBYWVN", "BBvCF76Wh3cxuSMn2B0aVv327m": "ZIYRcwj8nUrjDnvRXW", "GnsKSYEY8NTQiDvE2vW52P9wKMomP2GWg56sIG7GxD9vC376UozHWffO1fR1S": "Ce4cQBPu2G8Ie", "qrjgxanXzS": "mrZMVlZs8Q9hJFiffMnl5OWY", "her": "fxIgNk6yRahirbXiQ2GMBD", "DYnFXoimNFYTinNSv2dCmMu": "OPa7MS14T", "e27F7Td4tRUwQd9GCgPEXVmaTyNXonn91zP48yvn9a6ZOeZZb": "LokVqklSboqJOMgLGadfo3zsC7qmCLTuZUozuPtwRo", "CCBm2tUzb": "j7m87i5Bgoy8AeQeFeBrv6OrsuHKtoLmpooGunoMhznXc", "Td1aEeTTxnHPhTtDxNMk2lxFCqZyHQI7QubNB2Yc1hcUgNMzGD33R0P9iAWceYqDY": "khCWmle7ouyMREtCdot7Kh0zinrQuFPZTEyTTlVts6hXkf3UDrhfDJWxZx", "EOn1GOIMEfMw7CPaF2O4CGEtVIjjtDsR": "tjav8rRlkYJGTd6JrXAnnv8agg44n1dAkmzHmXqQhOt6kNn0v3LONCPOyq5JC9fI", "U1OrF4BzBP3fD4Zl5yjHb0pkCG3crsgHhIk0Z6n": "x5ZOS9OFNPH1vyMFkC7goBy", "FspcwEnjoekNPdpR4o": "VcW06l55Qw", "tdNH6My0a1NZVEIfuaktgaac1w9NOQOh6ICFeoxxj1qMzEeUFs8cAnQfP4xXQq": "eDXvCK3pxjZgELCY2EJEeAIMAN7ii2lMINunIUEXwef8lxLi3E", "T01Q0Leybw69wxazzQjWkTbXb6BaB30": "cAKJGtwd4GcNNJbUjMe1uPNMVjFwxV3DVeAzHeIR2v9W3Uq0oVGMVD0W2pPUp23qW", "BSQ4FvXIpgsKAuxANIl0l7FHhRu1d3Z": "GVDeAAYGnaRkAFSKPH1DRF8y0n", "uThiJR7KGu8D": "nLRXmUHaiCaulDJzlQDOIH87r4RSGmLcpV", "JQTG3XynLrqcVWNV8OgCqqDldmW1": "AFcVJpCJbs7lLf1rEGQvgVcUbpK7D4TZs6jDhVcNnA06qFiK4", "sKM3lrLVeSIMdU7dK9nhisVwVVhq": "ojH7Y8q9nRhO6L0dQoPqkjcta4EKIkASAEx", "aKVuK2": "S3qggWJvuzXf0iBf4nol675baJc7cZJ7pfmvdK32P8a2H33GMHBHOEhVSrCJG", "TO0D9WQUpPptNJjDIbELm6TrmabFyObETXPRT0sYo8ucFr8Aw3": "sI25PRSXe30SKuwSW1m9VTsBLpywa66jODYvlfPRSYK30sOwSqW", "vTOFihClnR1IdAANIWhO7CO9k2SCHujBotgUT1": "hka1OkXsBZsB29kvZtnu9j", "B0aBTF2a7sXnneuMjVhNtgwBuCEPDk16l2yp5fbCFEuzSjYE": "ho4IYgXHVTC", "vwCWzjGD4ZNlagTzKYhE1DpDIV7PQk6r6P0": "swUB7YKKQ6zV1nxnLqC", "l05k6M85J1tX3DJB3Z6ILYLBHCIPTI3KgMfhHrt": "MV5my6HTqzmJIRuTm5pST", "mGBNuvekfksWAUwaUHG5hXmndWcqiTDOTwOZTd5xfrtZXBmsDWZPc8lWIEo40": "MOb0Zv9xG0aymAe0v336PlCdRJ8WB0qUMT7akZYaEQ7aTSkOo1CsiTi1gyd5", "UFynWgLMwQ5BSdpg11Fu4cEC0ggA3N7ofG1XX5Akur2rteJOtRLzNqu": "Ta4PpPioh8eHdGhMttQecSMSDbRQbU4wXMg5DMEao9GvPqZlGxgxDu06J", "qAXRYNFonNgwGNYxi2l88ZoXy4EXps4yAXQesO3llNwLzQ6Kk1hSs3Urqn": "zLGKhnsSztto1X8vsWw1H", "EO1BjCNlWsu1rEM38onim": "BJXS7H5Xvhb4vcuEbWLRKVKJYYH7lK0eGpXtiYoFjZBapHNVQjO03CG", "EeRFmVQHHBVOZtjtJVfEm17lvBbpgchmHq": "qtrw4vaASUtWGLJTcPs0VF8il1PZvBQXnGK", "hBSy": "eholxdg4M8KeJZ2epwKqhA2iTa", "nAAsEgXslPd4": "YLXjdQKAo5nIk0lEt6GSIG6dTmy0aD9K4", "z5sSufb7": "cHTj4OmF8WqYFQyZpJKIqUndFcaZQlssBUHJlAMlRycs8PeU8Cd5oYKAGv53vC", "VWoO6ButLXa8QFGgDSFDVH24nhE": "N6ZTqmVgofu", "IYOp2mBjmsfDgVydZkK0qE68i9OdrTcJCNA": "vBwGeMenx7hMo5IrEA3p7gqWAER1k6E", "tI3X": "y7w54JQyffLa68feeDkovOP8xA4K1i7uCvHMKQlVgRKfvyiqsmcTC", "NvDWf5PvMmuKU2ZxdhdX": "pQWle96WcG47eqCNfex", "TF3ynCbQNlsHqhAmZ6aSziJYW3725Fu4JFDTdpXyY3YUC": "DmejX592GOl85oxPY8el5ox558fjyNknbjxX3c3cXyoyvVMPzQPNCZzGJWoq", "fgH": "W1LFocp34", "SSef4PHS353jmYvli3G5DPJfOjawJcDGlcCGPIXr7ZvsYAM": "RLFYHrQ7NjKyqDrbSTf84RJAZ2vMBumx0NgAUy3YYUf541LSFsFvHoS7", "NCeDcYDP4rYtEMcYcXK": "ELGMJyL5kSh2zscpBhxLFNCkr92mWTUE5jVzs3TAs5Neiyej4sA9", "hqd6pzaBtIqqTCPahjcbGA4zDbJj6aQdjRrMOa2s3RpHpGQenDJS4RPCun3b8Rt": "N5ukFRAMK9Z2b0", "EDr5ENy9SvsQkzfZFPZhcIB3U2etVCvA": "W1ozPcsZIYaWmcufGMLGe", "tqwsws9Zacrfr5SGDdrc8gxH6i5w": "b1Eg", "hz": "N6F2EPVKQ7di0jgj", "q1EeARDw71aOIkcExXuI7nojzvnSqRLgr1t6LeU7C": "mH7N2w6Aig7YyLzpB2pchh", "eB8XmfgPVmAeKlXkeycKrCJVAzhCXsY49ShnfJc": "K8xZBGPsn5vguEi7YjbJdsCvedSY5yAQhuBMRvPnIX8AXi7oevYR1lvqEwdOF0", "l2HM5VbaeeMYEGNQ0IhkEmdcEZWQiEnYrpUZXDbMpK9iMMZTldF1BLMUC": "FjhBLIh9oOIAGevJCC4plwrdgBFLEOxuqKKIvV", "s7ptTs17iKvQQdkkNXp9nXRsWHSYVFgPctXhyETu": "JzbJTQ6POE7ggAG0HuD", "ratnSo0EYqvTEn7qQW4k56AWNeFfqX6ccMhEi1cpBCzrvbTc": "MQWO2IXHQzyE2n2VeFMHO2dYq6EwXq4j9LptKI0E", "U5": "JXj8SGDTeAjq8oW2gVN241c6PT1gd2MPHocQltnVy9Vl8FxLvdDBXuaFI", "XlwlZ1hKY4ilPRbuDmSIAgCyMPKMtypXWklhU4vJ": "ZUstuXzNtE2km1jsgBbFtv1k7WqGBj7LwzfCNppQSgZcOTJUOsWEp", "nJlqeTny9T7cf638Dl0Xulf0hAB5Ajnd5ip7S7mDelTKnmSPkb0CDEI1wW": "pS9oSjKVTzovTSRfRCidpSYowmr", "bQHvXFNqYJnW82yFnMkIXisXrOvF8XEPpC7mTqb0puuxdi": "yXLtAdax1cw62RDDaYg", "Zsx3mXDyU": "m2g9uOpp8AE6BzUiXg86iM59xXwVi", "yeeNFjeYECjbiyPr": "DoF2ThoFeCO17rW5TLctO8ZVSH39NVJtre7T7LtWEY", "e3KXMg8rtJqNH5iS1VQn9Wwm0LkXckLT3D52XjZqeBl3Jwnw5TYZIevTqm": "eLt8Jj0iAzB8KWqPRTLEefIG52ppMem", "N2k0VqhNJVmCwUV9dVdv3WQRvaMbUWxfRR2QgHytspE1dMbOs7A1uvifeUN": "Xu0UJrucyjXJvOyH", "h5UzGPnN8JS20XJgWkyeFFCO": "ihedkMUMK5Jw3NheXkUnMMa9eQIEsfkNxuOnbAZUwSCnC1Ohb5ptWAlQB27KXR", "YqkzAgGy7hfXR5Ixg3TMa8Gl0ibQp1u2HqqYaGX86QjV7xmh9B": "Lc41OGRtPoSbnR9bl4byOpQdB9Vqti6PgVyzLMIJvXN24eiR1Vm7lG1QtligK9Ma4", "Hvm5rvauHmMwm6macFyBWEZAOpmU6Khiwx": "W8N7zFQ0sx5wTA8K", "ttrXgogtVVbBo": "sqk5ckyANv7jlcTSKb5ODm3J4SKn7mL5ihpH7f", "RY63dwUCaeAb": "sJ45w1gQ4m8rsd32FgYyb7jIkizB3INNon9g65I", "MStmg5J8eDquYGhHvuBHikcyeBl7wSFfOu": "VFJQwFRdRHowWYcE3Zf4AWeWR", "SdZMZzqz7iVvp": "pMhVdwEYIIrEBNglXspC0evCCmJelYKIMLpTRHnibjgsl1nQPi", "zYByi90hPqmAPiTbZmssI5BwAcv8wmo8tnMy4hlJExoMxNItvY": "uFTnOE6x3TbU277HkuHRdqfdIDczQmTP9ai7TgEkn0w4ZPPuPzq", "BAxDWdPIIpckB3lztEZ7JMxAgH3ZuxEgpWbW": "M7ctMbnZEgbkyz87B2xmFYmiULw4A", "pOvnsf0iss92I4n1ChtvSmkzvxWXXnjiBQ57KoMbfQnx4wGxeMOn2pg6CU": "sbzIQDMRlzV9FCEAMCXNrNaxJpEPHWgRin7SWeBqkfIZJeeln5kD0paXsOFq", "oTxh": "fYgsrdleYPBPln20WzB1ULdi8bHym60ON0HLJic2cMfwnETw17DmSiSx", "h7obZvuv67a8AN6ydt0v": "jZhxekmORlbmitXULiYO1MD3clmXcGgaiy60umeIB4qAHWiPpzVwi3mb6ZipANNtm", "gAw7zUewJ6u2Ih2M52aTz3p4CzORbPmHeiIQIgXVLoeDgdh0zErrft9aNboZj": "ByTp992RDpgEP7J", "BzOUsG0SmndKDnKIMtZOPkmAxO": "wCRs0vKrRMOK345L3mo3K31XK9Srn7AEmBeCd9Vr", "StG6Yt": "I7LZLjVxepgcQxaWbTaWxwmWxqnEahWK62y", "t9A8WmvEoxY5RKMO3n9TXd1lGSvLe7oXoEsVBivVqh0ugg2": "z75t", "doU9D940VWCrT8Le5NW8NlGWayF0iUox6uW0K3QOFX2MqVeI3a": "OmjFtVgXLfKfIJBBIWhlKGhleFHTDNvc73Hgexc0LOvcajzn", "GsVykt5dH9QrDS": "dv6wHIGZoa7ofB", "DS2KdUtgWT6W2ERIDieo54LllM6AUi8qqmu446tEI2INOQqgl6BjpvRVuUqb": "ckfMfz8AscEGjPCOJNGQXbDgVl7gWnTAUK1AEZ2nRml7KCmmmHRwPqKU3GI", "Yht3lXmsWKmNwdT5RlSs2xjoz4BIk9FNv5FeKiGu2lsQu979oAGrOWvWaN": "Fpgwp5NZLvhujNj0eXDhVajGXoowbLA4R6CWsQ1LERJKl", "lcQXW7Z4OEXB3M4hndyMOoFL48XiYoURzdccGp5j4YjnICDZjDE7dWPLb": "KW9VMHulltec1HDmeWGCeC6kAAsAxjwdKkbhTUe5N0Hn4n8p5gzWh", "qKl8h2MIMwyAy0gBBhK5VO81Sq": "yGXVQCG2OeUaKXrQo47Q0zB6ftqJPYvPnIkpV251nBvr", "U5AKmYNFNVPBb6IjW3GM5Pmk": "dGnTitbNgHq70UqcSqI06HlEEa", "UtH": "yHZ8M6k5GpmI2j7oArwdqK1FpCL8Bg4F", "KkJgrxpyPsAicwYhueNqk6KDWKYylW8EiXQ8": "pWnxbJlxEH", "fiJs": "IxEIaBmHPOYkFtPS8wqJVjGDJU3KSBsDNESMK", "Lo3NL53V64wsTq2D5L5yK4I5kOxiRpFBBEYw": "i2C5neSnLYFzp9EySqxUhNGk7G0MizPrN4MYBkL8uUtNES", "mI66jC2LCXfrMenxpWSn79vZachlPzNS6wq153CA2Q7skSkZsWK0mqF6Z1Gw": "Y7UIAcSnmU9UOUgGILivDc28JXDBaRO1ajGIdO5Zzryh7SgT3edtYnveI", "NjJGvRJEdIkaNOiZUNbN": "upY5UdYOUv", "g0chKEGxIfEGiw1NE9wL2Frzl3LhsSymZUF8YgQU": "Jt", "NyCwP1oIq1moa8jPwzcWrjM368b7q8wi2yiSUThhpCrXxpDSGxhik5bMljM16a": "r1qDvcZZqqEaJrUC5qUUnBjH1NrIHgme0Q5ra0F", "l1H6zArvoaF9iHxbNUrbMfMtT83iOCS6L1": "z9IuWNT6G", "Lisz4OrXXacJgHntWQw8Q1StOa1uoqXP1e2VRII5KJJfKDGoO": "MeImEJhHNBsP1aNxBssnTrNrzxMUEHs0yRIB2C0", "WmpkGHfYuScYKWrqoy7afkVqH": "JIW9nRvzgYnVi12omCv0M1fIPLNI1TcreLHX", "TXOdPGobQvOVjjwGbjAKx51LpfauEcnM2QEJ55zFsvGx6Iwx": "Im55AbuR2GJJcE1a2CcjPucgQt7KLViG2XRzuiC8TpMPgNunV2ykQH0fyjuJu7P", "BuYPxfsbs44IfdKUienf0yReeCv50lyIr1g": "s", "JkNm8Xi8oNfzqrlfQkKODo5kItyZNTEnF5m60vKwVix": "wt2iIjQLyjC3WufaPHsVYW2u8Xac0EKv4TkZ4sHgVZyBTVvpaJqUDC4q", "DXgHbT6Pf40xSkR4Tb2vIs5Yj5qGVbzzgskWEcs8Y4YQeMoqTBMiQiYYtP": "heub17sfjXXRITHMKdktVBJyLB7jvTXQLYosY1zgkswCF5F", "y0": "JXDojpAbQmsNjOczbPpkSmxHpiToeEqnjPpRIFYUtJ5GSuJ3lP9vs", "bu": "Yis7qP4A", "ihHi8IJT5oKvQsVfASTdXLVpl2bbjGGjCktozRuSc23rivEtQ93B": "yN6GqGBJ7kUEOfmShvospQV8p", "qLAzBT35": "YoUWdYQEEE41YrrLVEZTmSDSVhEJdVAB", "GrwDhRIldx6OL0PDIlW0Ads76yx8RB681BzWbxcU6HAHK0lXQ1n": "QZpzf17Rj5zAZOtg9xHP88jI4IZlmysvwXuekniPaMUWwLlU", "JrxZIBmbf3eFnTkTtpbSB6sanT5BIl0y9b6P6MqDQdsyjiq4": "Gjm7aLG8u1EPyP8s08xRDU4nWNTA7b2MchteHzR745gzgZhUhN", "nnu2KCevhtuH4pb9haGaZpnl5KPm": "LtyP2MG3g5ivk", "V2OupbQpOEu5JKuc88nQFgzNUSNmqGPSf4jXHdjfq1h9q3SRJpE8QFm6sKn": "JJRl3vNTCmVPWfgxa57pJ51bHF2Ir0Bt2hSOEP7qhf1Vzjh9MKgpIli", "S1lrlky11HSEP": "sMhzdHnqpnwAh0LgkWbdf3z4OqBvh2fdjfUvTfOTVrnwm6xCjinpLMI0c", "yK2H0FVbKsN13YiWMrWSqa6XUy8Ul": "O2ntZjEhkqOYCFR0VLYFflqm8vNp0sUN6qIb", "x5kwpZpoM5": "BbXuskkbgdEjWvgl9frcyA3I", "xufQN99rUGwBRMszwre9Pn1Oxz2I2IeUfZyK4TFxjyWSY7ABYGqImMu6bQommt1v": "IXl0RI1NHE9SqaG8xEzqUEfPJYODPYuEWhpzZITmYwpme", "cVWZT57GitbYv2CkEOR7XyOf0JAgHdSCCrxvaSn0cY5t": "Hof13Q0zDIFV9Sb6q1602erT3RROU8p4Fuct4TlsiVjtQHNeKWdk8UyqWoUL", "vZFhqyYP": "k3GCKO1JMNIlDmL1e6xok4tgOxqRHWIbSk5Yp", "RWqKUQZDHhwQx9uk5CDr90UQWsc2WqruSBz1VgJCbxDem3CU": "b3EpIgyXbVO1W8msUujS1b9FmMDd427VdUZph0mzm8FWEvvM1A", "SJWYhJBQeB6M1KTTHmXV4ZXJkLMAhlg1ul8hJweOxSLsPjEXKBI4dfwy": "kSBFKwDvse6rYvHWKxpm8cFmx9O6e3MA5PhCpL6zgttl3", "kh": "C2LQ690Vsk2LyD1v8CzQlctrPoysR7h2IloiCtnwommbhld9rkJkWD7p4q5VlEO", "zea4TltMUU29zhvKVus1OILh78DZ8k1hg0Mh5EBrrXRXTxhgTadXdfGVRtBrkRtY": "V8HRTKmYDcbazfTYx4", "yJWWDEldbU6Up490C4LE83bmEHAzOJoInnBQoS5aF7RzFUYwdUbzSincyK7zSnQg": "xUVmmUJ7eJPhGnbX6LsczAiPD6qUsYq8d", "i1z4yFdryZ3C75tp3jbLdQPuhnGwjJcOLlOHeg5mgsmzeqMxVg3lcpfx": "AqJc9T8BBjO0l6SeQKjgeuzukVXMJsK3Ne", "OaRcCpsJ4PLkB2gjdBMs9xTEewh": "YcEUVT91eKOhNoPQw2NBWfBPudtcIPOPqS3z2V60trxo3L", "bpwrng2": "zQWlyr78gqmFC25VmJyQxW4BvcZ6AOkfvDABHPwixCcEF8Jb5aEfwEL3fw7bMMBz", "XDIMElwKVK1ItBYZsjyIVcvnu": "BKbJiB", "CElbJFbS": "BlsGYYqqqq4YA4uJ9T33KR6kDTxGX3ran6k6hMpDC7Vqh85U5od", "xaqWxpYuzma": "oaNDbrqALF19AbdjVGOXQHpBPrP8bmx0cDbfi9tf", "ITQVwdWHD8jOBKhfEmad4y": "lNaKdzCYewNaqf", "E4RcdW6D3Pf7T846OCxeY2ZkpOCSzPjFGZj9WSJnc4N4tI3MtRSXoQ38zJbjkOA": "vITiCwxR6Ams", "jBeiw6ZGcauGGkHWBq1a": "xGofu", "U2YXUbYXNGVIisECOzTAKjuL4epmjuHoF13o0lb4QGBpQZ8fcwULnod": "x3FkW0irrWpkkxAfy18bVcdI2mXdw68qpzRIQy3FCLYZNrGULsFzeE7cMoXjTr", "fFr8qCCThhY3zW2UXo5r": "C3pD4RSialVhf5MLdmuc0XOv8wTJywW8QukwwTQm1", "iZ10F0blMmxzddBC6fDEHSwKxLxmpKhU": "xqu4ajLG60umofHJ4x3boEqvOQfesGUtdkHACKsjGNPJqncmqDuTX0HpohAs31", "YJhjafrX3VJ1RGZuHMY": "a54t1T4SaEHGw9WYBIExKwTtr24eU7sIK", "QGtLhZAmJylkDdlTNVNylX4MN": "VtsurvjgauHKuZv3DTm8qLS4iR9w6LKdCZWUkwn3v636IQ58sV", "QxmjIH6EPOOni7CiZo8Qs70": "yhknf", "ucjaxhs": "cCixnaG0y", "uDAQ3QiMW14ZC0tdnr": "bXPxu9BP4BiXDjRtBxNriVM4XzQyCwuc3wfmD44WRZ8mc", "g3z": "xwiYcWzSxfzHrTQrT6hp57eDOUcYUafvqGk", "R7Lwjfyr8XOeE15SIPvXzaD2IzpCvCnn8vY": "qZzXjfVLE3pFajWnB4MnNiqlUUgYC5R3yO7W7c6", "pD0": "E5LefCqap", "Kj61MEE5Mz7LDf": "O1wn5xtBtP2SJjCdPFHr5hcNA0koy23EyUa0rOum", "ON9S1gIWp6I7d9gBvEGWdZiwuw3zeIXspdXqTknof": "Sa6UpL1QmA9p5WrznZHZ4FuxjtJ03mbw6ZewvqVmRhKD89P290gAQYUusEhrAU3", "hNeTln77fL35rBvhi9zOuU1xC": "XiaidZRphDlVY3HgipBvtSUH22Eyj", "ZOTOvLjqR1KJm96PxsaHyhxj": "nnVGekuUQMldzH3kMVxeRbXIcUe4JcqkAb1628u4L4FV", "TYJicePwA7xLJIVM5d9KV7VEn2El8pt5sh5BFFDgib4odMd": "koEDBtWSd2dfbzJoCv0JNgnv3h", "CicGNsOFz8ZRVLasi9rY8deoc1XocooMyZdSW3eNlX5jUJGzip": "Rn7Pm3gHIr2gl3Ys", "SM1H6tLFTnaZHuyQppxoADA36Q1IjHW5ABbRtAJ8tw": "i2", "BNpYoyX2IfaY": "MDCLCVZsdFHSvHbWnoIx98kRhNkfx2K558e", "UVWkcE1Rusn2Vl7Jq5HFaLZfLVQ7": "USg58uFwi5sppZXa5jSOCne5", "MiVX5EnMJwNc0lT0lUZnaV1O2MOposv3zXHMjxHWv2g10fhINFgUVLHUUXgVdae1": "RA3ILTC7tOOJZNSrj7u47ZXAZjL0QijKe5n8xFR2", "F0hf11n": "KzpKhEnsKHPkSGl0nQfUcF5tDhD9ya0cZxPpESH4GmnWHnA7XH9X", "VYSAw2S24WtECCQmlJBD7MEKwGpwRmAXP4aEeT4cAQrEzvxHO5qr": "VjefzJ", "CEzXcg7AdDhEMVGskwDPX9kmSWTxpV1": "W9lJB43", "VCF4BHFuZaw0olpXmraukIOczUQxfkepXhTeRNaXb5M3gysn2lTGSSGg": "brPUgoaEnXMO", "HQOEmJcIP5MWJamVpbDvggys87QCNAsMF47id4tsO5aInTQ7c5YOiOK": "XIXMWEtldsrgMx0Blj2bMaGLqDlOWIMm5EPLLJXJKq921dd0KouCWSVPMlUPuvkA", "A1JFgDliWvv0EpvwdKh": "l6VHxPpWZxowayHfv38AkL9GtRskT7mX", "wLJ73OBKYR1tFvLjQvNxSDLO5FrvMX2": "wYNbK7c05WW4dW7VlL", "Zv8JRv1bV": "iHSaukBhWJq0YY69i6S84Mm2xjncEU", "UC5S0xjXT7DIWsRwgmLLkBFfUS3SB3uc9WGNn1ponKeuI8mAyL4VbLdRIvk": "wrcvPdjKVJtV", "xSlkEciCmEvlpHrgwbjqGQ7HnoMG2VL0hZ0Y": "kfFAsxfrohl3NtAmeRD1HM4r81f5HWe2176QcCeZVdJXnMEihB", "pya5swfBiu85yQPvPxyPrQhpf4skNQtRWaM4IsWJFBu4eZSDQFPuyoAwpVhgcq4dT": "sOYwH7vjgzomWrq5UQcoF4KF7bjBFUoEqQIJvobgFnxeUAu0SepYrtggScbuO", "aH5srMZ9LB1b1jrdhi7D5eqnKCB": "Wskt522PYlDkLXggbkZk9dgk66GEbtSwo8US8GWB0h", "GGL4PcGMzsZAQLVYpDkGwVmxNa": "UxOvH4Rft302h", "XbvMqWs": "J10byQ", "mTViDD3AlCQk6NMu3b": "z98eRFD6", "zcnrY": "Geb9tvZDGAmele4tw414DA5lpNrFPMuwaR4Vt77YsmwEOXB1gwPg", "HNkhwDcx9W": "EtobfI1ZCxA8ei3Sdn5XRv4kGzPGvma1", "OReVV": "o4JjxBFAvqczliV2Z5YxC8XoOVlUNN25G2AAlWnh9Z5USwgLc1gAaZb8A", "vQdkMcjXGnVTGDf4EtIzf7iRB0uLrxTO3QJd2PpI8OEzy4pz0O80": "sReFj6rhIjvvc5VnMPkDpv74rlSrTuU6AHdw1jn5nSSXoX3FHBdTmnIJZUI4C8IrM", "KHzcEch2Xsb0ldfkgroV7b9IsD3jXdqMBIg8aXuv6Za7cxhFUtVVchvHN": "mXGkcgDmTMoqr2Ubif41vGFg", "iSFKxMEc2aIjPur7VYHFZ3Vxk5p3I0w1": "BAJLe2Qr5hdj5Iqdz0MY80Br9sT8AFhXQgECKNogNj4tRU", "mNkuK2Bw0DySNqqlfnHKErvw": "su5Xe2VE6rmdcRg9z3zliW", "FhyU7sJzXkBolYoBhKhJ7kiot6FQ2yXJU2vH8FjLbG7YffcsFU0WuiIq": "iNSbgjowE3HcsX6eR10DSO75OTNdtXBBkDqfRKnE", "F6XvIG9mWbDKGkjouL1FnzMREGhf903LtZ0mRa7vutKH3HNN9oqzWz": "zgJSY2P54j5zc1LfM9I8rwIHQ1lRz5MAJmvShR608jImhsNX", "LKSL9H0qidDyP7y5C8aHEUm2Z89F": "aBbw8ynCcpaTdYK9e8FDwmUFDT92ffQuGL9Uii8oMw8smPzHgGP2R7fxJFvR", "XFfNxyREz8kznSaRrbc29tzdeFDRZfWppH5LJJjVnqW": "pBKd8F50MSlFHm2JviBgjnwFApKUtoQ6ZX0Cbkr1zk9FLpiAethO0Trap41jC", "rDJSjWa9wLvHmXK2grpaU": "nAEtxqc9y1TDYFXoByaVa6eeHqTEszaSJwsUhuub1eKMv9SHzty93QGy1a", "NUj5Z1uYj9dcwjxH71I0xQGLX4Qn3RMQD5E8mxVN2Zl67NMYzjf6edzwWzsHSJwm": "i1zWWQ9mUq8jNR0m4Y8sFJAEWPdIPKxBA9tzmAlBYmLclplkezNlIRnMwVBzf", "t8fGyP7da0uZfi5ZB5X0Md0r": "kwKDet0L4N4BJi33zASX9dAfSSXrlNGh2xrugsVnP5Z8onJCOjXAGjwslw", "e1iDaIFmSYi4bYgz7ssMrjJul2txTEcf3DW6QXaoaHg": "hhT4POghZY", "jbHdeWiB9b9FO5Eh87w5jxyOhxEqoc3JSCKQgt": "dn", "is1M2qtftvIesGgOGCeCC6bCEXWA5": "CidfoEO1Ckib8O5NI7K5KQWuPKNjgBJ447kKQdvfyxjZFceEL5yzS0pPx", "RgoeqmsJP8W9v9knDRWTtGQQ0ssFyCTMpurFU8LWT917cfscOGqjE": "f", "dEtrpoR8EBgEXNWdpI4abjl6SuWA7BzRwuofsn7hIthKvi1zh1mkzYOT": "p", "BK723hai6fo1pfREskRl1VDI7EQmsc1ZS6RVE": "eUkWZStzNcipLTBkVhUsPQyTHRjXR", "guCOm": "bzTVDEoWbTmBcreviHH4NAlujKdIUSDJYs4JSHPBrA9ZMG1eHfcH57F", "JWYXpQNc4X8p6ydBfD7l1yKehRa2BO5xgpttCTUppLt6ic2pCYWkZVaMUPa7Dft": "FR6Txc2eTAZneLctn9uEZzCAmd", "MyNPIva7r1Ub5uVWGWqeJmTyEOUqaPf7cCYcJiy7aqtxMR7HqS9P": "zS7zwi2T1ATEui6cF8Kk4RoXGtS3j4ErzDOwYwzdP1QaVFYRIpKGbvNGBW", "KEqh": "cmP716FRwwhqY88sdgiYeafYTFBOeFx", "h8zTmB9abE7R7mVfw9BukERnh2F5srIedWPxZ0VilCSt5b7x2": "bWvISaENYbFfEXWkkK9ui4jSuHXH7Bd8mZV7GdIBts", "E1PXH7lL5eycZEINX928RsjGK4uzlvBcOOABqso7TsKipluVicXVRMt0veI": "ou4XP0BJzX7TfETFkNNCrL8WFXRyPYpQTAiMtSzPmBWk8OJ9tJ6xDcTL4xfsXC6", "nG2CZKuDon1TgsM4EtxPnsGdhU5YtL3wyCkVDlozmhJxf3HU3VB": "I0xo", "ArEZEJGHhk5QT2azjtlprCTJGoLH6Ei6RQRbJ8iCVTFBf6B2CsHqeGvfCEIxw": "ZOzKKbag9D3", "t4V": "njTsAyvmRoeOXfnJtTiIG5", "UFC1dff4XdHNsKrKkrvfXwb50qiKAKaPHGn2ihPVt6KykIjvN0gvGYrS": "ca46jma", "cQMbRXemX2ivdW5qpeJQnBb8KjP3IuvGhQsPm": "Z4QmlUsbCIov3FrgfKyqmaK", "UpJlCGy52Wr2rl6qXfIzavuGG1yGtrWtqB": "HE2J0B7MuvTGF3lCb1ZuqfiYro1slF8MPsdJVVxSmGyStOgLsM", "s7rS6eeyV7Lso4ovfDb": "ndBd193w2hcRGV", "eSegQJOSVf8AR5fAfwO7A2rXJrrRR": "BK7R", "p1eYtntGOBk72mGvKO94d6mABR2MNlC3t4AnS5": "BOcFxxgcHJ8e8UIPyHYcworWERKd1QTrXZTWKagryNv5OPLwT", "S7d76B3xr04FN3acFV8aR3UjFUBlc7Pb4rXSgoFaQbF4ykjyUFAoelj6": "GCTHaBqmMnUB1yZOrPSMlxPlYs", "rGYct9cC55": "aIU0dcRePkkQcVYYg1M9OAbBAF177uxfEDvPg4dmAyYHPN5x6IPoyVlT2cjCI", "gkmem3iHwwDVv8nB7uFFmM7vGphvwZv5F9bxQAePISJQOoMQVZJdZySqC1Ln5": "tk9aDHClJSeWg7hiItTnOSWeJXoQe", "d0IoUhtcYtte0OEYniqa6FN": "kOIAwFbT", "H7QVTjhY1p5KE4XbVIKXA1LJyo07ipDo1Ggz5LlgpJaHMBlKxs": "LjddsQBlUa", "H0LNZ6x8uZFd5Qo5SbwzFjHw1UJ7KWkWxhPt1UDukoghFrS3n7xiRyq": "Boq1sqsN1lnLWzCQXHCuWasEl4HnfRw", "Eb5aJti": "A4Y", "NHySvYOr63aSd8oW2wcw7ONk4Y858bwPpUz7S": "ChFs6p0K0g2nIkrjT", "zbAFD9aeZSZupYNmv0jGrtevWKpUTIgcP8TSVnrVXxGKzs2idoua": "U5hCvwSWI9SvQPwXY7ZPzPbCsd2i5NK", "zg0BnV": "ZO4SD5Sp6sYctA", "noc1hojuwgsfNsDQXN7mFki4l1rhxXODmZ8irjgjvToL7rnciVkEt0llHyRO": "rtJh6GGUq2eDCvpX75TRkE24DlArddcbNjYhVMzuka3Tesattkjc3QIHy9dZ28", "LJUZSdRzB0yJkHIUKCLkmNK5LmKOa8cEpvi7KNwHGzBKgvw": "pEnjbcSd1liCAT65x5gEtLn9RCf2vC6MfA1", "lC0e6": "zXP4J4XykiPyHZK7lUE", "QRsMxNfDRie1": "fOqTFnuXRD5zkxhjFsmje6ZUC6pyLtS1LU", "nJA5Pup": "FapOVr", "Hhnb61M": "DQBxGB3C4GHKB0C1JeecfHMW36v1iXcqowMyIyEpeN7tcBxFgxGADikgxY", "VYmsJxtDM6iz53VBnIJ9aGx8a7": "IsR96HdwPxQqJiaiwUomZpmtCdmebTwdxstqktxiEPe0ulBdhFbp9k2X", "MX2wQ1n424f11Z0l7MwdmLtH9gJXWUe2FtwaYtWMI": "uVnQ0ooLKVxsT", "zWGQ7bKiWNVOrnScYlj4KFm4reFygZEVjJ": "AAU2BY4mZ1AdcmSlmhkv1npcG6yVovbUUmz8gtB9fqHfo5I", "tCUDV": "yKj", "BSVamqm2EawZdmPqxOZNxcsIms3vJWaOZin2TJn38tt": "DH", "ahMy": "ByAUDyqJxOXjP2aavTABAhepZWV8Ub7z6znkAaFlAmja32cLFWgbuFlS", "dF2azt7nWNMa9wQRUYYJ": "nh0Kg7v", "XIKCNY": "NIq7YRR6ccxMn1eE", "Qx2zxgGayp7OerJd": "G7gkYHp2jC0hbf6yvtDwZulEmlDQcET3", "TGdR8mdFKrcam7QM3ethHNqAHGzlNtCopC3HpfBze1JhF": "DkQ5AR0OFJFFenipFS3PeTyJJ6A1lub4X6gvO738c", "yVXfhLXjxLGV6yYVNrYr0skzrgySakV2YW93EaV6": "TClqX14EXlcWPp9ygAyBrCDM3JQInZvdEUKjycKf", "nTKb": "S", "lsysCvLFPoj": "TBAAczoTrrVvcQme7gyWYFkgMHOLDAtOqTNyauu", "M8PvW2L6IjqOtIqpFpZRDhjs": "AkRYlnT5cZBa7RgoZmEBqGDaEWOVZh7uZwBPemsQ1DNFgkkaXDb00n", "tR84KGJoO5n2fU7w5VLF2xPmkvRSE8LD2n4fK": "Usdil4s6Oc9eFZollu", "VVTk": "WLlnMRBYLEoELpoXVLoyuyv1h3yCbwirWbMnoGDa1drrRHPgu", "spYXMMM2OoxjLB9YF2CO9Leo": "nmqWXBhD6hNT", "IXxjkODEAq7mBH78ETkrzgHiplXwoEATnQimaziaEtWF2d5Jg2vpSU1": "gZQOrZxBrhd47YjDXYrwDTXlKKifcLXV6BgyQkg6SSFHdT9t4Q", "oVnctI7kLrf": "VfEO6a2w0A7wVQgzXAe6zwvr5snERRk9oLQhVZQkx96", "aPPG": "VU0azKuMvnJhmH1k2S5A65ZK6kmCF9pMNowq", "ZP3J5JGfoYPlX8QdjG1FzcgneIA8FAigVnrO6ZtGJcv": "IAyx5zUoz1EPBiF9Nkwcbmvha8p4s688Omde4YC6oH4FDgf3uHTywsS", "Llr2Jrb076JPyJp6Y0HufruSF2DQbcn0DDSzo6cCA": "ktmo2LI3kkcytpffYsOa7EIlVGPY9hGHOzVQ1Yttqvb8IoNiDro9MtNuNYVZaNB", "csfQj8tN2vjEw572qQDD5j6qtUunDf8u10V0DWw86YbgLKXKHkPAWUr6oT1Nln": "fB1tJimIMab58n4MT6mcrScsvfiDM6FAz", "jawYLocOlS2rRg76uHu3SQZcEZ10OSBRI7ZnzzawfxLXUrk5xpWv7kn1sp": "D3UXadzkjMQXkR3ufQw", "TM2H4cgACOWSdM": "kc1Rn7av4NDQUOCksfXxdkApZnMAV3R5aGKt7vA7HKhxh", "iICXARfdWV": "sy4iUn7M6AQg5Igj1cV", "jB6Ovqp0RPTSsKdrg6P3GR2YH": "ciCwxPbp5CUp8D5Tmj80gBJRi09YdLcWjes6a", "rhCQs5BZsm9doAi0e7xB1dfUMs9njyKbhmzeeT": "uuMLjSelLnVGSshyr0hFmAUvh9Hqb40dmFpYZBumqrQuYWK5y", "dzL7rh9dfIFcfZCeb": "ZeK7z78p6WIVqQxZrG6K6ShhBVzmXAaNQEu9g1qoO2NxW1", "pojXBJfQqGiQP5JaCBPPWNuB": "fKos", "EW": "AK5", "DUZ8n3Mm6D3FeejhPqb2X": "wBO6bJ5xWWbnSOTQ4", "qbEvmDIXlIf": "dtqDzkqIVzrxMhuaZCqFPbYOlEHEpk9JclLNvfwp3KlRnEklPNT", "Ylo3BbuZjiRj25MwlENevnnx2NButHhPY6jFAIG2QUaNAXvkRrCLDtny6Q": "Dxymaaiyu1YLNvuS", "eXHakhmCABPORg3DKvJXQUa25O4SFLperNnyiOjoUvj": "SWGBkeQHwxFVGrwAnHWnh", "CvVd0sA2cQDddLiUvNTulMKlD7lw14W75j6Mbcumtpc5hUZJhlRSX0D": "F3vJxdxrrt6jbJd3afQ7CeotBPkh8bBX", "IO": "m731f5mcDyr1Srgv6nB7IroMw8tVRZv65mKnLRBCqDhI7", "KqzQvyz3Iq9NgqEbHESg82bRpEBVQvbnYjqCqQTGawX5Jjrivz": "MIlfv1m6UA3wC8b8BK1l0ONfMNtjafp1EUqZlegFI", "ATuouEo9LdciCSAx6WpV4krraoxiDCrnfceOEniS2THo6JVBoQ4O4hXAkMR": "v4kSZ4elGkOEsAf8D007Sc1", "MQXochkSkdzhCx7ozn0Da0mKEGHowwbUSxZc74kBTUpivpP": "eaVK8S81g7dNUbHr1UU5zpqPygjEtDcoNC3dxYlJ88ZWWQPPHfrZGZTQZxYtfVU", "EpOMeJf9u8Y2Of0Pz2zDICu2Rif6D7mFLht4rK06X": "eNwDS1zCuxpQhWbSTeZNXNRaOkDa2pPGtzBYdNVGVuivMFSt", "Y1jK70v8WVjkcPwXmZqHA": "uZG2WZwyoPV3Jdo7JqcPTOO7qvfRcLgwZ7oIPuFdoHKjUnO3L5HtwV8OU", "Gn2UWYk8WXq85xwJaq7odsAuEGpppYkqKy0MFUaNpDsnAm2WfERg3wr8": "RMDNPuj6a8s8LZj", "iEtyf1T": "LM5LFmNKKXvUrIJroEzP2nqcPbsw73", "KQGexodrbXQE": "Do2JQxLaFcXurbRR4cHtMMpUT0Hhb", "Nr5wl8lSiUDPsyVx9CY": "Iv6nHkU0fw8D9VXwWCkluatorxBJb8CfrSSBXz4euosjN", "BpdJ6hNLUPMnM4J8KUpWeOl44vsGj9Pok2DCHR7BZkZocKKG6r73Z": "JADMadjUsUQaEkmkNol69XExYIfh3FWwbYf5RChepBohQnNWf1OZ", "Xyvvsn44l8lWiNMTYnRIoeJynQ7Grbgw1yNpAhWnZ": "xFNlx3N62bzQmb", "ws348xenrPdrz5GyqUC5X3NBXXHxx5eB9Diji9INx": "r6GPc6lwUOXq3QpGLf4Z5icTvwJ6JLJIzTa1GikOScF", "KCVsknKt6IdYrHc0CKkz1Q6d5pnGZI": "walrXP9ZSxArr9HLZ", "m9juQOesb73rLktXMY5d85sUChi8Qsl7C": "t", "GfpXXwnBCCJcEk1uXoSRiQqt688vBkt1": "MecSIoIY0ZsTgAMKz87XOZ14wmi920QTS7dcxv2VDGPRBt7UjfNc4veEcGITCkq", "atXXntnLp763aNdtxjvHkttPJDG0jHkdU8qOuBmtqSi9c0R": "Dwjlu", "H7jVUZEVxucGs6HhM76MpAf3QDohAw0Qk8Ts2g": "saFgEvtnnVMipNNbBKtPE6d4Mqe1KaH0HBZI3KGXbSny4km", "byQfpi1JKJAQ7svxSXf0aLfBwsqwIFL10JHswG0qz0111Jdl0": "jFQhGjSNayEBrSzGwGZpBJ6kF7BhEFXcWPfX7VQpizIsBsX409V", "fb98GU8lkDTacm12GHWprZ6A9XKSEZe": "qc6bxzXKDu2FT9IRzxfgiVNDs4m4vt8Me2n1YtDa3zErbQT95qIcGbTK", "G8gaqSoSZM5kxw": "e1HJKOqjwOeu8CmnYFC7Lf2Jc79x3KzDK3ww6l76SGsh50CXdfO", "WRF4dNF4Z4eFFcUE5CSeyrPRPfWjD2SHLzXFn7WJMgDw4Ij3llaU": "NxG3oIcLToa3sU0HMnX29XXeuZ50rs1knxpLqGDONeE1jyqiOKxLecl7N", "Re2WIucfzMtxCqzML5ZwW3LMuQM0XVND8VWzAQuWWvwh": "unJl1ADSAocvV95Dnnj1jmmHOReAnF0GFWY2WHx3ZUmFwwU3O77Xzb", "wGc95EVgwx7AWGfebo1DKc1zj188": "UhOazib54vswyuV", "Q2HIaa2WtEmcsdxC1CsX": "vYTAuaRAD5ljd35ski", "ihNd0IcakH3hJQxAuWftknDQ9rq8irXMz09hW0uM6cN20vFmMrBg1XIf3vnnDH": "fnehqocDFaDQ8lomjlRIUZoFjsjQWkbJD", "VcqTe5n8BUuX2naJmIix7od": "N960deRzwTbHOPhcXeP", "ZWfD9rMRL0s6a4xtXmwnZSByR2eOAqnIm9": "EskmNxwSPBZ97cbTJDZsY4P58HDzDE", "DoUpWeguWBpWMXIQmJ0kuWNA48": "QxAxO8so1b5byy6ie7YqspIGshQdyiTS", "s82mPgI6bTOBFkqVOpBTTpRHvzPSb1XXbpUovp7t3h3ECvfQ7J": "ByKswDs", "d6ICmrg3H6dJuziTTGdGkrHzL": "Nxd7v8bkFaeaH9Qk", "Kvdvcb5rnj9J1lDDBMnOYXCwQBPc": "Jf93cGbkzQSoIB", "DM5iQJrX0Mo3t3mIVHmhjaJhgIxq658h6kKRbB2uG6vCPt4Ns3DO1X9993BXj0dP": "wmvBWKZNP", "k5HwkQNRjEwLi2VKayop86": "V", "reyHTQYMhCCq1zbpg9xAviOA16gaGnDqiDNG5Xdcff18fe5KozCySRT28": "WXI5lPqAssoZkjdFUQ5mppyaFG", "VLFDAChIwO60ikL7H3eR42PAG8PXRpkfFyntzuICoz2XrlrPWY": "JBfk4xAGbuIoDS66qUNrf41RHDrEYHh73AtxTv4q4tcf5eoPD", "Z7P99rOrtDvCgIJ4ZuW0tTHCuo28qn9AkqAkwPjs": "wlYDvirOABQIOHeQ", "ONlU8WZVqskegCd1tX8YUMgTmptv9fPn57PFF": "FG5mMEn0kFjLpG3SHlc9hrFvFd7oCtmgZaFhgs", "SPlGld8Dm9N": "s42Fpk1BUXRGd82iNvvVXiqzRG0mSttOBVRSp", "lxByaYwdH5YZQ6AHn5g8zVhYCh7EQforZw0": "agi7mkNU", "b4QAe2xmnIvblea3mq3IrQheNkVYZz1": "pg2MAzU6", "jxUyfAfqUMB0XhVzCiU1GzvekDoYjub2NegbRW": "Kq3CQjxrrjc6xAx", "ulsW4bbaHpGSuV8PtM7OZhLIT8YP7aeXUuX2xAPZJEFk555ppQQihzL0": "eQ27RrCCRfsCwQdS9IF", "cKxvgKcg4pCCj1DQTzIEUPs7gwtvcOvB5XUP69ilZ7frYt3D": "oXh", "IFDQmLqEVVI6q7xSQAqRHqlWYEAAv7O2urfmJ7lrRqvQ": "qrm9iIvzajGsmv52aVTHRRpXbMsukwBX", "e0MJnDi8HNqZ35dwUQ8TWtk3pV7Vew88wg9PGYHsMe9h3tvKVXw9yQu2oTkw9OwL": "JbLE0dG2iPSK2YrSl1ydQ", "PiqHNlStm28IGZ8xSA9pqvBKxpylHNYm0hcN7DFjGjWYmL4zrKiN1": "uR", "hferY90ar4631EQVGRLjcoODQqrOPqzbZG6H1TcKUJg7R6j": "C7nlsBl8rm44oxayYrYyfO1af24UJ9qF", "WLNHMPpMrZg9APqKjsrhNgdIqkHA": "ETvh", "uffyc0PbTAU0sWBHqStVO2rsrn9PWDyW": "zDUIH04MKCMyrKVLylfreozOqKzsLjVYUbNSEPqwafTpHLWv7fX91gF6nCx", "OHtrtY3Vo59q5IujdRfpHJkbGTAayIj1mVgShe5t": "Rkd1XUpAnCUlUWuykJQYC4wiN2XD32EGdsLDiHQcnsbdV2FKd", "HccX78TPjl3xIyka1T6ZhHzZvDSGEzznX8w2TsDqb1cJ3vOz": "hosvsrvKs373gN2G5T3HsWq9CdTP0i73eA2kIglvo51iK2T2L7zt9I", "JCBu5Z": "ywF0vXW171joRvfyoW", "hi5JGRPNacEVePcnmPvGSOw6iOP7A": "sInqYQ5mOUJ0ViIbycTkOVksptv3knCgnKccanDpU1Rq7IgM", "UmjFjTTB3tkAIaOLwoeIp9K5MgOOpQDkcG6xgsoVWRWKgECNWQCGdJJieeotUBE": "iXudRrN5mwh8TEEAEZflQxJ35pY51aIoz169fvqL2GN9l2IenymTaA4ZR", "UTljMbo22okJZV7AGmFqInuNi1TjtwWiTYtDsW1gq0lZThDzvMubQfkv": "AVCPzxKYTYnTsAf", "XwX2QClpucOfQ0ynBSUEuQvd72OXkKBQgOYvzluYv6rqQAWG": "jU1tHgAD2wP9ID2tTP6", "LrGVQQfq2iTkhrhHvJ55EfoHyBqyF4FgPdR5r": "UHsPFsPsjSXAmMITii", "tYYBuytO9Kqd1g3y8OWHkxJen44wxJlG0mnEpjSu1nDGC2P0uzP7X1AWKMqB5RmJ": "aO1dSNXWOA9", "pBdrYORlmY2YHxZu3iaMlqx0bfb": "jbXwHZNDAsfDp25RBZ5XdP19sFVB8p", "eD0olQO1U4NR7W": "FWKtzzkvWEei9LSvyJFiWu0ew8ZRbkQUCw0JLJpCxBD4xdycz3lYBME7yU1j", "IWEv7bhPQy81fDc5JvqROyyo5n": "P0MSAMOBYnod50SybaFnlM3HZbPInyuaGmkTQEqYiYevmE3z5i3chf8iKh49hG6X", "DZsmXhufvyxoR2uIAHbjL7yN1tB": "ffHaVM5gFZCeuWf98", "jEytqkKjesszzh1JafCMjTatkOOSc": "tD2LXN5vMop8", "cFIIYYkITubL3N1riEK9w26kJSSc3F8GGRH6iVs6fROBblF": "ha1qQdOtToTkw5NmAQ1ch1Ak4x7f7CsfvxVZcOEqwPuIS60V01Bj", "Qq3urHFC1CsCrRb0JW9LCLkbxtfvy": "eSKemKY8a0Sslpj94qaDxEl2Egw6trGIBKXvMsgm8H2I", "AvCzg11nUxFnMuOk3XPzCiS07xhbnUT6GP8imP6B2j9CKztqwud3yAR": "Eqk58LqIvSMA5sjZJgiooHoFXHvTq5nCX3FOg2jdzoEVG7eL9tB7TSEQPPWf4kIK", "yNjKn3u6U": "s7W7OkMTPfB9JLazKY5dxynlSLExGFVy7cYbOS2gjsH9gjvr", "NaYMpJqb1FJkhBpyfSmsj9fgHX3l02NxCbSW3qUzy0rhXkj5rqHfFouEg0iFrU": "TjlxNjhiOaQehstiG7", "DUXYTU5Qwxcz0gejQsByyTEujo89NAa5ifqyOBjNpthn": "IIdRfBU3P6lHDguGaUbanci1jrGTkvG3UqRXljlX2o", "a28CM7V8Qx5qrWHDnZ": "iA", "UIhQTebchJe0bfI9L9OVFs": "kdVNCF6nf4o2AuHMicGTFiWTkJe9Woe8FMd1w7AehxIpHF", "PIRVfOjmpeVI1hdBsGNim5dgrsg7sBibZKx6C1xA6DtVWGSiyAygOeB0qoDiw": "HwOmblgNSLyPQH5WJQS3lukA9a7AVD2NQMIt3Z", "IjHwAxZynxRnSTNhBf79xc5": "n09mBg2kXvqXJtJ3Ye0TpUPjzK6sgqv9wJaF3qhtHHwRn", "ABvGJzitduNTGEI2Qg0gZlVvOlLWbfXBMyj5sz5sG7R2": "WvtWU08QlDuio1gYIacJdCUKCEt4CMKS7SJuU", "fZ86rJICT9kGP7p8EYVsLcjRlwV5": "V16vCeeUkfHcYg", "hAgCY6blzt5H": "RCe7Z1XZ60cwJLuAgj9DbPPYeFptnqzcOJlJ8zEV8jwHwuGvTWTO", "GWTrdjINuW3zeUZpiijmxJtlMOtnyPz": "KjNDpc5DDEViReugkO0dRO8jZDnWpXHZvgnBYZLeqdK9RYvxP7BmDun", "BdgUDvPA2msrRhCECopCZFnUMDdaEdUNNJgtas": "hr92jitREpNaKy0kEDwFuGkmc", "AY1mSKmUifBzytlhUNn52FKy0WOA0s83CMFjkpDde7bv": "JZsJnMqXuOHTH4UG7MgWeE9fU0TRhH3NS1FYZ2qEFcmGufsaePctFHRLTHr9E", "bO8tEIKd8Zc7mye5fa5PBv91zekvycovM4ofO3j5W8IF": "gZ6qyk4F7YZSuGyqRPvygP7R1XO", "gQDESTzqJ8unYXcupMyra1xOkKrSpewQbBlRS0RNL5": "DQR9pDv4f9vCut110cMP3CTP0vKKo0ILu53KPnIeKsFOXAdhHb9wIEqNSTdKGAVE3", "SFEBiTwKCFTJunI5wZJoZmzmRJk61wz61LleNaPLOOvuFUSKoT2": "ZIqLeOXTcMhBIPRdczfBg8PoB9viZp", "vn5H9NQgUitRdPKYSYr0XMFwbQbT1e10E9M6gUQnInD": "tMszLA8B7ygxWcq", "li6": "xzQkjCMItnXsVi5Yr0fJYyPaed6F85P4sW7EEwxzzUnggi69", "mNMqNENcOmq9ozs4baRRdiYVGBINv5lLEsI0bTW2UoRknjPYL": "NXTUgfwEH6Nc8WIOJKHqSEeCUp2vR49fjiGzTQnsou4rE7", "ObSpeP1Hng4dlPBUIGjsvXSCxoLoHOD": "bzvjhvSzgEJYkAh", "KrDlHD7EPaTqKDyohG7UMi2ZB1GD9fqwYuX0DdgX8657ePG3EhEWevrWp": "tUxN39", "adMxnjyY5YefJF": "SgderhzavGvy", "X1QEAtIs7v4drkJEKp9LZqGZr9t71dAYke9xlbdQFJu3P1wpohKCohLVXrxrC": "kyY", "JtBGYgcX7PKpwM2f28HggHeHCCxK6": "KLzwLZSkifBxx0prkvOVbQgNI40x3", "JufSrXwya3iwbkiUyDyippeFOFSQy6nk8qW9": "EYAWwwXuKzTic8GyShET0VVGzCTCJrhysxIN", "IIUCSNDrWgRaemHECE80sinf6uhUxui1a6ADsNzgD6SV": "NPYgiD2sAMjp7dSWuOhyHMP1vE2ZYYJm4Borc7EIG9Ni1jy4sVIK88vUOyz", "NSgasY7JA1lfv3G7MSqdYa3GRiCm9tIiwymoaabQqlPMwWotU": "yC", "jskmsCYTItb5gGhAVXeOOluvgSeW5at8wTEzmvgJMx4GdFuk1": "qVqBWaW1YhHMB", "WvkyiLIg4r3sdmJEtuF": "amERgvX2Ow14Wp7dv62VIapjQyzQzOkxnjkUJS0Yp", "xg88vwib": "Ada5vMHZjX5Qux2tq35DIpJMI1JG8AVnfPQHB7LNIriy2teDkbJO", "UA2NJJa07LSiqzPRWAIRa1cn4mcGGhHEqjMAwrf3zKA1TFcz3UjWgohLsUIHAPNdJ": "g5", "HXtt00n6786yjazIBJGee4WWjXFYXcfm34WuYyoRzBAS7PSMPvjjK0XXbUz6eMLBb": "ixQ7QMJvIzupusq7o5jFbNM5ayEHvKI8iGRWTGCJd3QYLC", "vWrkL5z6sob6Gn7BmSsGBDCVBdUpdJcgMQNAVmN03rC0rO18kIvqj8J7EImqHA": "ebfTIevzIKlyoH7AYpqK2TapSGP0Ly0UGLRBufsKlgfZHpzkhPnFJUkN", "QibDrv8Ux8F8sZnPwjNgEIXUPDn0429jd9Sns2eZ4Yof3Za9EQE8Fw": "s4Sjk76BuPSlKaA4pP", "dPQyr1WzhY6CYhH4bM0": "t79Mx6UZnmDzzgSglLrWjlCOoGDunlTgUl7yldbj1bOPp", "z0UDdvgrXhvVtNsMFHmzXpAIYB9KdJehyEUq0BV77g0jJATwSuq70X": "bczhccu1vfPbAVyu7uSCkjvy6SS", "CsKctlBej7vfgp787TBagzSNYgV": "uSE4mXcB7a7JWZwhxfvJwrI6u1Iqh", "iV5qEtIxeECiSPceAprvo1pxwyNeWEXKjbq": "gOD9", "WYv029CX9TDTnyBJq7Umsc3OL0DKDmgsz3nPi1CHQJ4wG6fgrpuA3rt6zqEiJd": "J33Tk7a", "x08gu7iIBiJ8nAq454ynW7qY6XyYLcaiWxi6LYUUohjVYA": "EGrW", "HuGkVmr": "PYe5i3", "x3gVmihANHkmcejGVbonGC1zNc9OEHVp4yOum46rlPYy688wY": "bvv1joz0t4OHH13slgN2XiUxDHhVPs", "S1vzMrbgvJt78HWWTXvIJNqb1QiP0VUKfDv5VmmTOL3ePYET": "uNWt7S7Nsv9FFLrq7pQvMafe98JMxsOC", "vGC0sof8U7sJv4tsL4T49CO04jbWKqxkUapVYlzVl": "UDqs", "XH8LH": "l9rjOYI953MSSk2AiGW59Hb0A4idckb6cosLGQw7SWGY5GGrLrFTpOd", "fmC2zZyeqmuGDgfycc0PxFlKxsmog0DZLDx1ohvlfzCtJwA4CUCcw3b1koEf": "IOzptmL0IaoUGi7mr69xv9zBWt4eTWt33r32uoi6vhlq", "qm6mKgrBhMlefa4SAK4lo3VmaeZksqn": "Q44d0TjPO76NZyJbpyzOLFR1QBM", "pDG6pHhI7YpjdTQuvJN3": "PdvNg8pFDqHjvaCTFgaR", "vr": "wJGio6N62SHNxq5c2ZMQ8Nok5s5XmitbzdfBFNka", "PreYvJOEuDIa6cgA78lIGZQXwsHoVZI0g": "p5KlwYQum3s", "AeFZ9CAA1GYZQM4l92v6CFoL3qjR7VgB": "tv1Az6by", "ZbQoq23i9X": "Trs6Ib4z7SddlNAyAfqtXpgizgL1A8Y5f", "UlsYjaTKV": "OW6vnFZfTFwtyy5mmZphjXGCFxX7S4hs92QDkqQ31Ctwyw5s1bQS", "KjJKsOfcdTbUz5kFTimbZ8TgUiY0jA": "nN1GZFMQ3a1kIMNQGpV2NM", "vBbe8c1ss5xwKPK4O7MFHFO": "OyfdJsIxYnNRvgYGvxKAnWRi70Rhxoj5", "mSCvdbgAHfIyQsXXSDw1c52eVkj4bFY7A": "D9cpdQ2yT0ITmFkiJpPq", "T0fX1QkdBgdfTzzK2IWjNs2SI73kvaOO": "AEpv0o2puhImpYxev5hSTp4ecynr34mQZ5yXTq8NZ3JsIETC", "FC7ua": "ihDHKcXy8bRN5ZJ8fwhIu", "ZUrxiTyVRw65fYLJ3gpIkL6Nym5eFv": "f0tjp7jiQFxY0pa8dWKF6zM5DBl", "rfetQeH0Hw2J6qfF": "Dc50DgTbSYuWkzr4", "dp2ZgO6YSHszRdzTWyIwmjQO9Rx7c8zYFGiMiXWszUJXRwzJnTIHV": "Y8KvEQqyhEf6nfYnvDb54KIIWoTP8aiV18uAfV", "TM2ae78JxpCGdPQTy4FPakFCOz1JNdsmeXgGNo7alDF11awSuI3LUL": "CabygRJdPx91I", "f1ESovTsd1T4yYaKOOm": "Vt3", "o4i3gX": "e1Ym0Yhj9EQwmWjyfyF4P8yt8hEOEzZUiIff7qMKBEuxpXypJBrcoftqG7mYf6y", "DAe8CkA1Kfc7QiTKH0Pmsyd5cZVOL0e8W": "sZzNlSOLFublQsXgI1KR1ZojBsPBjvuimdUP4x2", "D9wkAvfuF8NZ2X5Mf68nVlgsLDp0mZ2VUWkAHOAPxnHkjlGC": "MaaopVSU5iVQjcFjGD1VcVmqkViUScijKyZKswLsrql7rd6XB2xG6lD", "tKE48FZwannIbQAX7p5fLsiky4onU4sILI6ZJKDCEbRF52Xk2dEWXR4GuM00y": "IrN2QFnlAQ4jXejKyexcIzfPzJa02kSasXdVtL25jOFaWLEK9yDPd", "xRcm4add4qrVhsvJu9An844I0E3ZTLPS0dRgOpbB47EFS": "kACFTT2", "zEZqiG78mEUB": "SSTwOKqlSosA2g6oBcbtcOqyxzmzywdfu5yuW4XITBCKn", "iLvKwl3jXMF8QAHU86k7NY5xLMCx": "DmASHnhzzbzdNjqwHqHGfBtNsSqFh6ndOXswKyEO8zcvfBLUa1AtR3q1kxAVvSJv", "tmDSNyQQZsJl88JhD02yDzdwOp9ibeJEFrbgtGROTqLi225B37aS": "H79bJCriVZmCAx97p6eaAAvbZxy6ksmz3zmhuA7hyYGvsqWDJyF", "wk894cGxUIWmhY8buazDsbHpk4msd1QGLcz5cpyc": "jLiPLJ0X6yxDLGSfpUYFcw72B81QvAmKA1kwS29uERcz2Gup3mp3b4Jo", "KWh9DTKpR8CgrEv3eTR3JZ2": "g", "gKFPpY5jAAUGvyOcmjWd54Cn0yAbwb": "utLHG0Pt76xAy9ueYgWHGu7g9XdXZpWhSh", "jbeVg7Mmw0P0yX1vhgNg8VngEJFtlR4OabdxkOgieedsz5nysA6cszaFjg3": "RDZFRDPcGQB", "stRD2U8u1QXPBIPpK882jzjcBp3sw4WrmhWrNXNAQWyRSFKETGIGch4nB57Y": "iQFZguusAA7rhupFN67GQtqrs4urQ2iMEhodZv9B9", "WIfT6Vwbj48hETIGxeIRAXuy2": "Ckov4ig521rpoaOgRWqUHSbgtKGafSpwo", "X5CXR4R6rHctLxZhmNTzT4NoWeAtE": "aXmXtQmCepTliMzwahDYKbdb277ja6JUGTvd2puhOmT0", "C1CGREM": "zC6mtFoymSaq1Fq77xBKFSx0S5M2y0iLZN8pV8D0iY8rp1LnXAM1", "j13x1lsuWaeJx3DYicpkPnxf23lam": "cgUqjsC7LrlF8MJzWZXyYck1YVkBPLFKujo6fLvkqFr9GJOSrjVxx4", "FHutkbxqb4GqI2f1gHM0nsye3Pkr6r9DFjFjtN3QhEbtxbD0rj9htA": "hPNRXOdXpvqKAFdQ00joKKsDagZrCCHyqlng8zx", "Ph": "VSaSChcF4o8TLwIB84d", "owsmdEamKm6": "DVgArkLz84dU8cEdjG3g388x4KBqfUK3UnaJW6PK0w5jW", "KdKVYhqRG3bIPk58OM9y0B7uJLGnTmWYUGGn1h1n": "G5SPBXZECarlhPWROxLt2BXhlxvg1Syd", "dWa1K3LeQpf7pFTtuaRX": "JSFLf8qBmhtvaSPVmxejUIDWUGc48S", "rx6mWzFPumQlC2W0d5PFSVIW0iJkzxqfOH2Op2ikmpxFYRNg4jlCoE": "dgitAFdPj3DRwIJTigHTrOL16uMwlJu54", "bwzRGCvgFUJKCbkELWcdXOTPWO6f8QPudK": "SfKWiXyNuRonawDFytsXpFYjr3qGkm5URQcsibIVgaIgQlAmXBEsvET", "eAixhhdTHlgIkKFDkTQ31ihjavqZyq1WLwo4iOa5HLzatXD2vAOnt3sLTPgZY5Yvv": "Fb0ftIEFPHnGqaeYZ75Rm9kUNHjSqxH7hCR", "PhBuNfvCdBvJcB": "mBXswRDH09EVO5xYHNTglyS5oaF7J", "arePrbmpsBKSin3SyaHwcwjgAfj": "OI", "i0oCQtngABma8883hw1R9Gobe0dSXR8m": "yhSUSp4qpUlUHv7RbT6XBFRDfFR3lOUhCfmR3XSSjLXyh1XPcz4yga0NHWja8", "Mx0jrzK29vDgs9xDCQ3gjJsL9cNxknQVIWLECzwCVbImjXWmoPJ3Nk4wS": "TNdWPTmrtDrXjoXO7SzmO4D4lt99m5L74q8Ns51g9CVg32TWDVxQ", "kWrtNMRskdmUAPTtO6gGHjgHviCa9bFSNr5H0acI3g7ue9RandLTSsZcZ9wYge0mq": "GWSaKtevcvHuJNfJTnC9QPIAs6GlNwR28nwMGzbmM6E6Zx", "RoOQa6s2BQJEur9sH": "xaluEjkppz5H7A4I3w39YZnHk3Pnw8Q", "rVUpodz3zEHkZNTOsRdyRJrQUOhvZxdbKT5s2UlrgIdlm2ixQx": "NnGbsFRZRekNbXzmcaT1bJ3PDYN4nlVPV", "AQwlgK6ToUZ2KbYRZj0F9WBUvrUutJlnYi82T5zRRn6": "kB4cpia1cG7Jte4t9hqU1ogqD5tA", "VZ": "BSgPlMCejFhWAo3lpZ396TpfUtHHgobrFn4guNoc94", "FnFk": "hBa1yUtjgnsMGykP5eV02Pk5QYI0xaAwsW", "nZyeNH8oP2TTR": "bQvFhUdm0cokGFqOdi0L5MOKMJ66O7tj0wXC", "vVCYIrwGYyXfAiY1gcQlNXZRoY0a": "cjUQE8IcsmTBGEUF0hbj4qAuPZc5itaddhYjNNJlZawV", "oZFMotpqoo1Bj2eUvSekZ9FSKSrg4lQ60cQWlKB0k": "xECTSCN1bhGRBAIaPs4FTSTve8wLEpSHXkhnhA1NowozyirJDvcTAMZOtkE7", "NxDExPV": "Lh4PDVkQwLTEW2e22il7RIYYEeqhBjFyRyLo4", "HNUsf1fHqUnwycn6cPlR29yEtBaVUmO0iu1amEz2DNhqWjcYtL": "QK6AQcyR0rUTpobj5604w9wzM92", "VsoZ": "jgEfOI0g04pCcj11eXp343m5q93gw", "NDabIoewEXTjtBaXv0": "vkxmHI2BGuklge1Cpec35CSPIG5nEQX4A4JxyNrcb", "K6p5Lzok": "twQ95ahlxp", "z3wbBJ6Ss54Oks": "Fx8", "ilXVrHwWe36ixvhBHMWq9K9wsLzxoGBa2FxQ3iWEygHVLCg6uFJS8gTqNXUx00": "z67sQT26NG7oneCmxwcRgM8LqUh5RE6mBySgvg3rIdW", "OdRVB0r8oSGscx": "Ycqub3buTfHJpyc4MTAWOmHk1wigEg", "diXfdC1XI4eriCKdoIHRvylhORKYJ133": "LxerVXg", "cFuHxbpLMwFO0aP2LLAIL": "J7pKKKFH7cKliwhoJDc3NccTczvtkb4DcnneyI", "OBSwZF2ng8ozGD": "s1Q7VOuM255qBsA1QsHbaO0fmlX0ZRF0pjEm1pH9rQxCHkZPoYoDRML8juCDw0O", "TyGqmPVxOJUuLi6ZNytEqcHhzLHV9jCcCwH8sELbDL": "IhCs3XZRJXSKd0QHhuMHr", "VKAycC4NMnVBHuZm2": "mPzvm3m", "DmlFZZsozeBcJAehuSOF9prlJzcF1GURk22v": "tRc9lX1fcf8OV87NADr3FoAo0TtuputBUUrRi4uaYJ1Pe5nQIQyde2qwwLYiEh", "kqyRlyjJpYcYtXYe4DP6DsyDsuQiegSC": "nfChP3dz0gUISN2WVhSyFdSOfz3ArbyMI6btXiB", "LjxeDP5WCs2JqEqFvNPMDaxXoFExmhzb6s8eeBCHUaKXqp1k0d": "G9IVjBz0w8wWG0yNjtleZBEwrXUDSkiLJBT2XCdUjH2A", "PF4NJl0HPr1XU7EIELwnH": "b1pFbvzzNmarxGs3BTSfm8IS8V", "VNnd251EkRZw5m1LH4wCua65D8bbuSekkerF91xmWdLTg5VOv3": "Z7fHxuy780nNawoonF3kduKxO330daaakygD3G6Vsi456SJEWfOHVrn", "IvIjw3vfaE7aD6xW9qD": "xWgHd", "hcERD": "ZoGUUpmlAgdoPu9s", "CpAse35BjUZ56ZUBkAyoQ0pDfjyxjorDmHt1V4BmqvirjPokBvgJ": "JTkZjIADdNaRfcgsT2dfgvhf4BGiM8VKIv0TPuc0wLlmeYkrXF6csUmNX", "zXF5vN1oHhBy3HJaC3AuMFsdUm6P7Mu": "cpifTgkbJAsI42jN5mKoSyFznA5ItOdmJd", "lD2O5DO2vDAXTZhc23Gz1xOZFeH7NC5HkV0soUsMrf18FE": "xvLxub8frk5DRvgWiaT8FqnUBLMmfpm9rSGr7QdlOn", "jNGCklWiHKPPo8VubtXiL4BrFGRi6": "qRRrTggH", "G8DKruhdkI2CE0lbrC85SzneAim9pizrn44EP3KYEH1": "NZSiENsEWvAZfxRgOlMp", "sfYdb8HCggbUNEn4XcjZZfr0": "b5rPnzQ9WYvNCo39WLZUoprMOglGe7Wif", "WtiYtwrZVnpoZob": "ZoalJG5GmWsKIGpEEDPUws29TQqcjiMbOa", "LqLwg0jumk0n4px4uxeS282iEQCQCbCF48vp8vhlaeV4Kfi2CsZ": "IHLucPM3dLUaAk3", "nnMYwvXzkwkOBZ": "qG7PSw", "fxRLfwlkvWoWcdAKEmpqtdEqDeVBhDZ8T5gUXsakRAsn8ISzjgB": "knRUBKeLFXvPMfkKzpG77ZYN5Dd9WUghe3XLMBxlL6ROYhSeVMyh3Z3gM", "A6Xbvmx077S4O98WjJKtJTXAChxE93vEOeDyL9AJS52GGtnyx": "Uz3wpwLsU7oRMMYpiR3HiwU9otO3oUE72ZdweifXcX8hz9sCROIRhptS", "dudkQln2pmNosdmPEABuc06fBHVt1p": "UlSol6PZUtxIeRdlRDm4izbip2cjxiyE8yoluqRptqR81Q0sem4NbbjF6", "kx3MM1wCMm9uzt4Ee40umv9eUCxk60jRolNGl1flCUoHF5c4zaFlAGwte9nL8": "a1Bj0c7UCwE5iU3ZvEFX5wKIoZBrcmQ0AoU50ePb8Yd0wcreZot4gBdBPTZRdFPlD", "sYaue2s7qUUWQILUljBVgvxNFUCbT": "PhSxiRbGjQqz5weU6DBhvwq", "alEax0xmqQm4hx63K3uS5bDbdUL6lX21j5Lgu8fuDO": "OURe9NqT8IvbtfwyCBfMstFANUkhLc9uhZJ", "Twm6EYwO5JHhf0F8GmcczcTIc01NFjJORw5CX": "RScOKz5whw", "hxC5NEzcYZoMGZwH9ZobMjuUrkMcVApXO97n0hfUrBYkSq1eCuCzGkpJsiKfRdz": "ZBuGtXyYC7sUIiOvExHVOszJxI", "R0M8wtd6sylI3M6Y28SrJ": "ciUxgWAKuYn36UDul8d41BroJFlaHLWRiepYhXhRT6Sbw1SQIwG0okZYX", "SlDSBDnp61S0bTolDwMwRGjx87UVTMtvuoLAWRoy4M9IQg1uo": "ucXNYPbNv5tPowd0", "SrTnSFnX0PVhDoKXuzIBV9N1b0MSg2I5DuUHM5pGrkOyGCJk6KZHmf2qlz3T": "Bg7qkUXSkLiMR6RjvDJhrJjSFrbmaCbt6NyH0hoYic2wu2rE30e", "JPBkThcSbyzKELx3TYOuLz2bHscbdOU": "TltR7rvRNDFnpDz6oaOaUiTZgF0C5oSYc5xVU9mmHIGLdULOE3CBkm72KGEQFc8w1", "X2isr5irg7YGEiZKHGvSStyf0JzguOP0A98SM": "ZdeLVUNuSX6G7kyLwCcHbjFmeoS8QHB9X5YOJ7CdOaedRD", "bdojcwPa2E2iQbcmI8q8fCf": "NWAeOs1hUEjmA071U", "nT3mt2UF0pwfI": "VmUJ5z0BXF0DtxP6fO2Duy3jnvcHVXkPuJtPKZGs3fss6vbOB5aOTCpT", "JXZFCoMMbLJC6gjatEQpYYorRZqDA30B": "bahvABUemWPX1Sv", "P2GDtu5GrFIN9VVz3X1P3YflmCxvDm9lMEc0WEyowW570M8oG": "bVlDvqF8F40qPQm5Xd60CUavB7qT9DP3WHDSb", "pSIOy7vjw1Kb1PeAMIL2IHXzLHW": "jXiWlN5", "iBFOVukN0H0N0VsTjQH73pSi": "li6xmUX91a56cnFCNf2jzMUIp", "Q5mboEImukTIgWx1fTY": "npfVYkJHDmC44MYGVC7UFw68sR", "ZdZBEOG9RMYk5Bq7lwkb4": "Qk6O4YyCNgN1voE4", "fZDVkMfzjciWQiDomByrI1gMhSip4YMR49G": "vySjfaQtjzqEMHDpa4Qfw0", "u9pRIf6r1ZelD9zTXffBUaAzDbFQqrQX4MqJ4P71qdy": "RyH7ej4kJfVjxhrysL0NmvKfIkJcliLYeNIr1M22h4qSafTz", "rjMdg2Pl0sHpdVSj0U63ElFXPqzSig6xokMWFHvgAgi6H3": "MkLQmCRTZtC6v8mAx26aT2sZRbdMS5v8DCVlNfRlvCypuHv1S2vk8b", "UknAKleyWyIxeeWIEW5wUbrLzI": "hfqaMu7Hlawotb4nEG", "RKZxdv": "p5cxAtpJdTzjII0sV1yGyZ7oqOVSyof5zxH", "WLPuQY7gStV833XL8EowGG9BEVw0cMKvIwCied6A2So8DxCEnqjQ44rb5fHQ": "AUvAJb1jUDhqHxBd81Z1fL3rI6YJ1FUW9SLabo5jFdlEUWQq", "KjtxXcpkPUKogBkS16Qn5kLsERIAZFj2M9fj62HtP": "mAAVyNljoCzZY9KWaZPRghAZTyGznqHinvn0XjVtrQX", "yAMJPqNVVMQ7WINCY68UgcTF8x9QT5jg": "A2sBl24NxNygFRT96cKjVKnXab0", "GY": "HHcVhBRXbkegj0lnUlxRasCnH0uwvwiH4V02kQGqQU4Mb8eABr3", "GSnLhRfYa69YV47rIeNJxah88Wbb3JE4MvYsLwpFDvwpFaO1TX": "YvWhq", "yHnW": "UvuQH57rR11OtQMzNXDfCH2tD07yTR8c6xbQFNvo5V", "MOZou5ME34wnmDi0RuPu6BFWHBx36tGNeWJNtF5poxx3eOweDs": "VHBd858J9jorfJ3Czox57xEjw3zYrQCTLskM", "CvYKTiUAHXgKu2LexQzVLIawFWxQ2L00XGmPHc2ddfXVUADZQAf8qQyoanU": "IaUMR", "p9deP69CQBwPSJCzDw0DSIutDeDidhqdGax0ZLLCQG4F": "a8MythFtjJiCwaDLcitpeRqn854OjvxHE4E3D5", "PADjWXLNCaP6KILPuOasBSyIytNDOo1": "VzpQBEtLvnjyGRRXrPy6ExStvpwRibPhyhLOMMigvSGRD8", "KFeb5DB7ABtc4": "RWV3xv2dWn", "OhMOBpCRBRZhsAU0ZMARHJ43mxO0vZCkkwQiDPMNxDB55OSIOPSdVEXXO": "eK8Foqkos39stf967ymVGy7MFv1gpXfWqlrs62IwUrBcikwGSldJttCttqN", "GujHoGcuVY8ZHNyvbVHKjZR7oHC5xnt1vakjbuGOkCde1eWazJjApRB": "A9HYW2d5HytP", "oftMZhOZa": "em3qPtAHQlgQOWmm8viePJm4HznnmZnMkBvwVXWHVHX23AcrQ", "rv3fncTSIeNWultAv7wo1HvyTbZbpgH0QebP": "FCHgC", "KCOlcjJvRYJNCqiy8HZ5SK3cPRQY7poLx4ou577X15ECTdvZJ3wf3zvHR53RI5": "McpoOmjg6TC51yiyN4CmQAmAq5Gm3cCmfP4b9kt0JVvMTFxI", "kuPR9FyBdk": "V6Q5xkgYbgKvcnhVjvqUA6TiItyNswE1hnJ1m7vRi", "FoCpWDgdaXTc3fee9y50XwThHJLKVQ09jkNIAoualChJijUy": "STGCzLceX6r4YaqwbZhY1NYCqWBVGO3RAI", "z41IfqeBnCA6UC1kM4NCT30pkT2LxZOm2bbE": "kkqmC9VYCfh7tjNR6f7WB0rGuf", "y8MsdWP9CE3RYF2Oe1PtAhUSlqd27G6vnUF8OGnKuIK40ulhBgIR2pFDokmw": "AY0dEhSFvgOEUm0jf5gHyvAjaNCDSK6u", "Tt9DTIrhSFFIlVc0hNZusmp0WM": "nxReHXayJ7fMJVd", "kNmPOJSvEhoZxPbTphFT43w2K4dXPPYL61nXVxUU": "iusNznkE0vYvmDr7zhUzCc1YgL2X3PKzdrJvQtQ1StSVvSE", "fxKgQjE7yrS7x5EYs2M6EmUg6VuHehozXmUD4q368xcFH7": "cVBvbDozZa64U4LoFfZvZxWfd", "PWESPLmz4BjCgVfJ6hIQvnO4cOH9HCcuzg": "u", "pyWcLblLmGn2b": "h8djBZWjxoHXWGrwGLwQ2olxSkI3N12dU0e9TETP9", "TEFU3CIR33UBMoxOpZal7VSQ1ga6Z5cTwY0EQxEWkqw0": "m7JR68kXw1aemAzxic2MN4DCIMmmDjkTFmLAGMOuq", "uYEnPSGHqZJ": "RSHHTf0mVHEFhg78YBV2DiE2xngrs8mFYLtgm0Z79s0r1WPYfosnVZ", "pEpmZNmYMfdFUQ45e3Dx5JwappS8UoQ2up2lWcZ27rkTJJ6zxCFcxhD": "I2", "mYKuS": "p9CVniUTdZQYeNEoPPnf56HspnaL8kiUHXlHkNwfzOfZHvULjGnsIYK", "n3pJP8Uio9kNZgznqbopoOrdrIpbwIo4P9ZUiAyjNx0ZHAvhBSXO89lAk3zH0d8": "BgYBr9zSbYUhpX7MZe0KQnvkV0O405JNdbD8rm", "q60dF0Pu2ADjyVx8VmdDIb9DvTk95nHWEDO1G2DnBBOmLeroKsWT2VHGMg9HxW2pD": "pAowlOOFai2kSpuEbMrdc2irGknaXLqvAHCW9dmh00TQQ", "qE7Zn8ieLGAYShI2SLTf": "gf6t1pp8IdnbYN8qdNpg2e0k1GCMJcfx93882q5BoYA4CDlj7kftSD8j9dMUj", "bZqLcZ0CmLMh1btwZO17u": "v1gtsjaYAxuNodfVdZBzZVZ0Y91eULlTHhW4ukn85FD6IzncydSvk", "cBO19ebMBl17f02OlUPbvtCFCK7rYEU1fwyNBjlT0k": "lntzmn0mM3fn0CbaQorb7ZE7MBB62szi6", "xiCVVRG6ccwnRGLXSWVmagmxd31BD3Hx": "pUzfe6VF2", "ofTU60TfvI0n0fPNmocYFMixTQHO88K7T5PagWeBPwSyflMwH8bWd6eLWqTS5": "pRrOm8W", "i0MwHDFJrDJbzaAiyt": "E57MwDG7dL44bE4I", "Mon9": "pdGkI8U2y7mFixT8jRYCdW2HO", "n3n": "MLtq", "IvshwmRjn8kSkv9d9UdmA8jvw": "rdywrgldnuSrsUEbU", "cs1BsBYBh1YeZTPxwyzsW4v0kyEKZIvM6loiNZtfqgrQU72yI6Vcn9kO": "HY8", "VSgYUhl83hsfF": "VVjG66eDeeqw6iBtOuPCgit10YmQlwdT", "THlq8mfXhMqblfisL1gP8E8cF1dLlwWCeiZRt8pxgqf0nLCuQwymoJLCmWfB2T": "qPSs4rsF8Rd3UAbhwxLQlm71PECNw2iz0DNhPLMpiRBgbVubuZfBswunCLRJ3wj", "p0ip4UhUToy7TVpEP4aVaL537ovsx8pTqUDVSn": "IwWnfpCwnEcJMCAQKYfDEQwt", "bwtYOsonj0H9gH05858oP83ngEWsXEz2PAfeMwA1OsPuts6mGwiYSJ5D": "yKvUczWm6m", "rg0oiFhDDITuayJRTGHnDMKmDLhgTdwOXHVhPVgrsqKWTmzhtfJMh94E8VQQzq0w2": "ZfAtxfiqY1osg6W98apYVxChXu6q2gdBslnVgAXy2gBnUX7oRA", "hvL6Ee4IXi5YP0ko8jXK0QaaeAjsX2rFay4yjjAqnDk51W": "jg9WcxUapOxcUXvescWpHAEldafhmjazlAGdONTUoplf1nPdpTDimG9W1Q", "zep7dT5XVEGgoywtscpgeWFv9makz3D3teq4gVz9mOwKS0V": "dXfAttYvRaYD0SVcak09AIaxpUPPss624cyUB8IIFuAji8z", "mfySFIRxk9JbWFtvacN9rTNkDP0EM": "Bi7HmqAcgbL04VTUPUQf7gPMp4ZdkQ7jhNP6zy50W2Mw", "rlP9WNyXBqELJDhjFP2hSeYA872PBqBh1eXbrOEfLRJ4hb4cmlVd5zWBbf2w2F4F": "X4wewoytBlplslU48kjqun7qOmIc3aGDv6xcj7Xhggzrzxa1", "SEwHKxRC1LSlpyalrjV8ikm7Z1euR6R2gBLDlrcNJBH4ibgRlW12LLaz3eSK": "sZfXL9df0njcLb2QuuDpKVvOi5MaPGDNYshN16TXAazQcP5ZsSey9gLZHOw", "W64ygkHec2g4": "IIgNWZd1tUBoObNdTZHtwd5gIqklB85ivSAjofigG1LL8CedxYNyEqsWCIr4A3v", "zCwthU14Ne1IyAMm": "EJb48q", "OTeaX5S8Dr7ApdRY1nDY4V2XcChzYRVNstfJHO42LJuKJGKWW9pa6rv": "UcAnPjgLZW9fkZaKR6pt6uY0RW8X", "oJ7OyS98EaAYu8nudihXMedVGQI8MOFmL": "GEBK4FZ6wYgJdwM3hYfKNn6clPK5MbzfulNetnPMjDjqCiIzjazVfivZLMVo", "dKpDZlrdK5ZD": "RF02WAg9OyX4LsjFeiG27HoTxZmrBM4UsPCd7975IbTO3KKTI9cjYu6JqTi", "iDegcWUwjkGD7M4NwLZpLYllVpMibINou3": "hhaMPnahM9NYKcji57UG0a9SvHsYcdOa7XZAABbqOjK", "wFbyh7mv2MhieqRHosfpgDmWgkiJfbpUbAPU2DsBFamkzQjUPRRSX1kgYIR1T": "rr9j8RmCxyf7MpssQDb8J6mewLruDT6HaZnYk1JsQRAOoa76lxFQWhHOrSnqQQadi", "YVCxP4fspLDfjUvOJTJNcU4A5MeeGfUeRTcK8hF9xKzfwKtaVZjo": "XqotGFL61ag839z", "BxQMK9FwG6E96cqptyS": "w0htLvQSEPVJ2"} \ No newline at end of file From afbb4dd1383ed2a2bc3a8e6fc89cec48a807f037 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 12:26:48 -0300 Subject: [PATCH 022/535] hopefully I reformatted everything --- src/Functions/extractKeyValuePairs.cpp | 111 ++++++---------- src/Functions/extractKeyValuePairs.h | 31 +++-- .../keyvaluepair/src/KeyValuePairExtractor.h | 3 +- .../src/KeyValuePairExtractorBuilder.h | 3 +- .../impl/LazyEscapingKeyValuePairExtractor.h | 3 +- .../SimpleKeyValuePairEscapingProcessor.cpp | 6 +- .../SimpleKeyValuePairEscapingProcessor.h | 3 +- .../src/impl/state/KeyStateHandler.cpp | 124 ++++++++---------- .../keyvaluepair/src/impl/state/State.h | 9 +- 9 files changed, 133 insertions(+), 160 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index c1a9f4c3853..4adb079ab5b 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -4,9 +4,9 @@ #include #include #include -#include -#include #include +#include +#include namespace DB { @@ -18,16 +18,13 @@ namespace DB * */ struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor { - explicit NoOpEscapingProcessor(char) {} + explicit NoOpEscapingProcessor(char) { } - Response process(const ResponseViews & response_views) const override - { - return response_views; - } + Response process(const ResponseViews & response_views) const override { return response_views; } }; ExtractKeyValuePairs::ExtractKeyValuePairs() -: return_type(std::make_shared(std::make_shared(), std::make_shared())) + : return_type(std::make_shared(std::make_shared(), std::make_shared())) { } @@ -38,9 +35,11 @@ String ExtractKeyValuePairs::getName() const ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { - auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); + auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] + = parseArguments(arguments); - auto extractor = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); + auto extractor = getExtractor( + escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); auto raw_columns = extract(extractor, data_column); @@ -69,7 +68,8 @@ DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes & /*argument ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const ColumnsWithTypeAndName & arguments) const { - if (arguments.empty()) { + if (arguments.empty()) + { // throw exception return {}; } @@ -80,105 +80,79 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const if (arguments.size() == 1u) { - return ParsedArguments { - data_column, - {}, - {}, - {}, - {}, - value_special_characters_allow_list - }; + return ParsedArguments{data_column, {}, {}, {}, {}, value_special_characters_allow_list}; } auto escape_character = arguments[1].column->getDataAt(0).toView().front(); if (arguments.size() == 2u) { - return ParsedArguments { - data_column, - escape_character, - {}, - {}, - {}, - value_special_characters_allow_list - }; + return ParsedArguments{data_column, escape_character, {}, {}, {}, value_special_characters_allow_list}; } auto key_value_pair_delimiter = arguments[2].column->getDataAt(0).toView().front(); if (arguments.size() == 3u) { - return ParsedArguments { - data_column, - escape_character, - key_value_pair_delimiter, - {}, - {}, - value_special_characters_allow_list - }; + return ParsedArguments{data_column, escape_character, key_value_pair_delimiter, {}, {}, value_special_characters_allow_list}; } auto item_delimiter = arguments[3].column->getDataAt(0).toView().front(); if (arguments.size() == 4u) { - return ParsedArguments { - data_column, - escape_character, - key_value_pair_delimiter, - item_delimiter, - {}, - value_special_characters_allow_list - }; + return ParsedArguments{ + data_column, escape_character, key_value_pair_delimiter, item_delimiter, {}, value_special_characters_allow_list}; } auto enclosing_character = arguments[4].column->getDataAt(0).toView().front(); if (arguments.size() == 5u) { - return ParsedArguments { + return ParsedArguments{ data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, - value_special_characters_allow_list - }; + value_special_characters_allow_list}; } auto value_special_characters_allow_list_characters = arguments[5].column->getDataAt(0).toView(); - value_special_characters_allow_list.insert(value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); + value_special_characters_allow_list.insert( + value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); - return ParsedArguments { - data_column, - escape_character, - key_value_pair_delimiter, - item_delimiter, - enclosing_character, - value_special_characters_allow_list - }; + return ParsedArguments{ + data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list}; } std::shared_ptr> ExtractKeyValuePairs::getExtractor( - CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, - CharArgument enclosing_character, SetArgument value_special_characters_allow_list) const + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument value_special_characters_allow_list) const { auto builder = KeyValuePairExtractorBuilder(); - if (escape_character) { + if (escape_character) + { builder.withEscapeCharacter(escape_character.value()); } - if (key_value_pair_delimiter) { + if (key_value_pair_delimiter) + { builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); } - if (item_delimiter) { + if (item_delimiter) + { builder.withItemDelimiter(item_delimiter.value()); } - if (enclosing_character) { + if (enclosing_character) + { builder.withEnclosingCharacter(enclosing_character.value()); } @@ -189,7 +163,8 @@ std::shared_ptr> extractor, ColumnPtr data_column) const +ExtractKeyValuePairs::RawColumns +ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) const { auto offsets = ColumnUInt64::create(); @@ -216,11 +191,7 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptrinsert(row_offset); } - return { - std::move(keys), - std::move(values), - std::move(offsets) - }; + return {std::move(keys), std::move(values), std::move(offsets)}; } ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns) const @@ -230,8 +201,10 @@ ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns) const auto escaped_keys = ColumnString::create(); auto escaped_values = ColumnString::create(); - ReplaceStringImpl::vector(raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); - ReplaceStringImpl::vector(raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); + ReplaceStringImpl::vector( + raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); + ReplaceStringImpl::vector( + raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); ColumnPtr keys_ptr = std::move(escaped_keys); diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 70467379929..a9cd9f9ce1c 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -2,21 +2,22 @@ #include -#include -#include #include #include +#include +#include #include -namespace DB { +namespace DB +{ class ExtractKeyValuePairs : public IFunction { - using CharArgument = std::optional; using SetArgument = std::unordered_set; - struct ParsedArguments { + struct ParsedArguments + { ColumnPtr data_column; CharArgument escape_character; CharArgument key_value_pair_delimiter; @@ -33,22 +34,19 @@ class ExtractKeyValuePairs : public IFunction }; public: - using EscapingProcessorOutput = std::unordered_map; ExtractKeyValuePairs(); static constexpr auto name = "extractKeyValuePairs"; - static FunctionPtr create(ContextPtr) - { - return std::make_shared(); - } + static FunctionPtr create(ContextPtr) { return std::make_shared(); } /// Get the main function name. String getName() const override; - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override; + ColumnPtr + executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override; bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override; @@ -63,11 +61,12 @@ private: ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments) const; - std::shared_ptr> getExtractor(CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - SetArgument value_special_characters_allow_list) const; + std::shared_ptr> getExtractor( + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument value_special_characters_allow_list) const; RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column) const; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 343b67cccd9..8bd54012ddf 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -20,7 +20,8 @@ namespace DB * Control characters (key_value_pair_separator, item_delimiter, escape_character and enclosing_character) are customizable * */ template > -struct KeyValuePairExtractor { +struct KeyValuePairExtractor +{ using Response = R; virtual ~KeyValuePairExtractor() = default; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 1408fcf3a98..c8543824c95 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -13,7 +13,8 @@ namespace DB { template > -class KeyValuePairExtractorBuilder { +class KeyValuePairExtractorBuilder +{ public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_) { diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 420e169be19..f94c5a3e0d8 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -21,7 +21,8 @@ namespace DB * to store characters, but noise is no longer an issue. * */ template -class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { +class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor +{ public: LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_, std::shared_ptr> escaping_processor_) diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp index e12318c7f94..5cb22baaffa 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp @@ -7,7 +7,8 @@ SimpleKeyValuePairEscapingProcessor::SimpleKeyValuePairEscapingProcessor(char es : KeyValuePairEscapingProcessor>(), escape_character(escape_character_) {} -SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const { +SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const +{ Response response; response.reserve(response_views.size()); @@ -19,7 +20,8 @@ SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcesso return response; } -std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element_view) const { +std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element_view) const +{ [[maybe_unused]] bool escape = false; std::string element; diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h index 81e3527c1e4..e7508495154 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h @@ -8,7 +8,8 @@ namespace DB { -class SimpleKeyValuePairEscapingProcessor : public KeyValuePairEscapingProcessor> { +class SimpleKeyValuePairEscapingProcessor : public KeyValuePairEscapingProcessor> +{ public: explicit SimpleKeyValuePairEscapingProcessor(char escape_character); diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 4131ded9fbc..521119e7021 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -3,117 +3,109 @@ namespace DB { -KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_character_, - std::optional enclosing_character_) +KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) -{} +{ +} -NextState KeyStateHandler::wait(const std::string &file, size_t pos) const { - while (pos < file.size()) { +NextState KeyStateHandler::wait(const std::string & file, size_t pos) const +{ + while (pos < file.size()) + { const auto current_character = file[pos]; - if (isalpha(current_character)) { - return { - pos, - State::READING_KEY - }; - } else if (enclosing_character && current_character == enclosing_character) { - return { - pos + 1u, - State::READING_ENCLOSED_KEY - }; - } else { + if (isalpha(current_character)) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + else + { pos++; } } - return { - pos, - State::END - }; + return {pos, State::END}; } -NextState KeyStateHandler::read(const std::string &file, size_t pos) { +NextState KeyStateHandler::read(const std::string & file, size_t pos) +{ bool escape = false; auto start_index = pos; key = {}; - while (pos < file.size()) { + while (pos < file.size()) + { const auto current_character = file[pos++]; - if (escape) { + if (escape) + { escape = false; - } else if (escape_character == current_character) { + } + else if (escape_character == current_character) + { escape = true; - } else if (current_character == key_value_delimiter) { + } + else if (current_character == key_value_delimiter) + { // not checking for empty key because with current waitKey implementation // there is no way this piece of code will be reached for the very first key character key = createElement(file, start_index, pos - 1); - return { - pos, - State::WAITING_VALUE - }; - } else if (!std::isalnum(current_character) && current_character != '_') { - return { - pos, - State::WAITING_KEY - }; + return {pos, State::WAITING_VALUE}; + } + else if (!std::isalnum(current_character) && current_character != '_') + { + return {pos, State::WAITING_KEY}; } } - return { - pos, - State::END - }; + return {pos, State::END}; } -NextState KeyStateHandler::readEnclosed(const std::string &file, size_t pos) { +NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos) +{ auto start_index = pos; key = {}; - while (pos < file.size()) { + while (pos < file.size()) + { const auto current_character = file[pos++]; - if (enclosing_character == current_character) { + if (enclosing_character == current_character) + { auto is_key_empty = start_index == pos; - if (is_key_empty) { - return { - pos, - State::WAITING_KEY - }; + if (is_key_empty) + { + return {pos, State::WAITING_KEY}; } key = createElement(file, start_index, pos - 1); - return { - pos, - State::READING_KV_DELIMITER - }; + return {pos, State::READING_KV_DELIMITER}; } } - return { - pos, - State::END - }; + return {pos, State::END}; } -NextState KeyStateHandler::readKeyValueDelimiter(const std::string &file, size_t pos) const { - if (pos == file.size()) { - return { - pos, - State::END - }; - } else { +NextState KeyStateHandler::readKeyValueDelimiter(const std::string & file, size_t pos) const +{ + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { const auto current_character = file[pos++]; - return { - pos, - current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY - }; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; } } -std::string_view KeyStateHandler::get() const { +std::string_view KeyStateHandler::get() const +{ return key; } diff --git a/src/Functions/keyvaluepair/src/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h index d21f7abd63a..7141f84aa64 100644 --- a/src/Functions/keyvaluepair/src/impl/state/State.h +++ b/src/Functions/keyvaluepair/src/impl/state/State.h @@ -5,7 +5,8 @@ namespace DB { -enum State { +enum State +{ WAITING_KEY, READING_KEY, READING_ENCLOSED_KEY, @@ -18,12 +19,14 @@ enum State { END }; -struct NextState { +struct NextState +{ std::size_t pos; State state; }; -struct NextStateWithElement { +struct NextStateWithElement +{ NextState state; std::string_view element; }; From c303f644f73ff9922293d6d9652d930844850616 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 12:35:40 -0300 Subject: [PATCH 023/535] formatting challenge --- .../src/KeyValuePairEscapingProcessor.h | 2 +- .../keyvaluepair/src/KeyValuePairExtractor.h | 2 +- .../src/KeyValuePairExtractorBuilder.h | 4 +- .../impl/LazyEscapingKeyValuePairExtractor.h | 27 ++-- .../SimpleKeyValuePairEscapingProcessor.cpp | 18 ++- .../src/impl/state/KeyStateHandler.h | 7 +- .../src/impl/state/StateHandler.cpp | 8 +- .../src/impl/state/StateHandler.h | 3 +- .../src/impl/state/ValueStateHandler.cpp | 117 ++++++++-------- .../src/impl/state/ValueStateHandler.h | 13 +- .../tests/gtest_key_value_pair_extractor.cpp | 132 +++++++----------- 11 files changed, 152 insertions(+), 181 deletions(-) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h index 439d666b8f6..b2a569cd30c 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h @@ -12,7 +12,7 @@ struct KeyValuePairEscapingProcessor KeyValuePairEscapingProcessor() = default; virtual ~KeyValuePairEscapingProcessor() = default; - virtual Response process(const ResponseViews&) const = 0; + virtual Response process(const ResponseViews &) const = 0; }; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 8bd54012ddf..761dc66d031 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include namespace DB { diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index c8543824c95..7b190003cf4 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -3,11 +3,11 @@ #include #include #include -#include "KeyValuePairExtractor.h" #include #include #include #include +#include "KeyValuePairExtractor.h" namespace DB { @@ -60,7 +60,7 @@ public: if (!escaping_processor) { - throw std::runtime_error {"Escaping processor must be set, cannot build KeyValuePairExtractor without one"}; + throw std::runtime_error{"Escaping processor must be set, cannot build KeyValuePairExtractor without one"}; } return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index f94c5a3e0d8..734af5eeb44 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -24,9 +24,13 @@ template class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor { public: - LazyEscapingKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_, - std::shared_ptr> escaping_processor_) - : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_){} + LazyEscapingKeyValuePairExtractor( + KeyStateHandler key_state_handler_, + ValueStateHandler value_state_handler_, + std::shared_ptr> escaping_processor_) + : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_) + { + } [[nodiscard]] Response extract(const std::string & file) override { @@ -34,7 +38,8 @@ public: std::size_t pos = 0; - while (state != State::END) { + while (state != State::END) + { auto nextState = processState(file, pos, state); pos = nextState.pos; @@ -47,7 +52,8 @@ public: private: NextState processState(const std::string & file, std::size_t pos, State state) { - switch (state) { + switch (state) + { case State::WAITING_KEY: return key_state_handler.wait(file, pos); case State::READING_KEY: @@ -67,10 +73,7 @@ private: case State::FLUSH_PAIR: return flushPair(file, pos); case END: - return { - pos, - state - }; + return {pos, state}; } } @@ -78,10 +81,7 @@ private: { response_views[key_state_handler.get()] = value_state_handler.get(); - return { - pos, - pos == file.size() ? State::END : State::WAITING_KEY - }; + return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; } KeyStateHandler key_state_handler; @@ -92,4 +92,3 @@ private: }; } - diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp index 5cb22baaffa..2c06f4efafe 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp @@ -4,8 +4,9 @@ namespace DB { SimpleKeyValuePairEscapingProcessor::SimpleKeyValuePairEscapingProcessor(char escape_character_) -: KeyValuePairEscapingProcessor>(), escape_character(escape_character_) -{} + : KeyValuePairEscapingProcessor>(), escape_character(escape_character_) +{ +} SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const { @@ -13,7 +14,8 @@ SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcesso response.reserve(response_views.size()); - for (auto [key_view, value_view] : response_views) { + for (auto [key_view, value_view] : response_views) + { response[escape(key_view)] = escape(value_view); } @@ -27,10 +29,14 @@ std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element element.reserve(element_view.size()); - for (char character : element_view) { - if (escape) { + for (char character : element_view) + { + if (escape) + { escape = false; - } else if (character == escape_character) { + } + else if (character == escape_character) + { escape = true; continue; } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index dcc44d7cb9a..aef1b8bfccb 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include "State.h" #include "StateHandler.h" @@ -9,13 +9,14 @@ namespace DB { -class KeyStateHandler : StateHandler { +class KeyStateHandler : StateHandler +{ public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; [[nodiscard]] NextState read(const std::string & file, size_t pos); - [[nodiscard]] NextState readEnclosed(const std::string &file, size_t pos); + [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; [[nodiscard]] std::string_view get() const override; diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp index 366c0d776be..07f8d4cd5fa 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp @@ -1,5 +1,5 @@ -#include #include "StateHandler.h" +#include namespace DB { @@ -7,11 +7,11 @@ namespace DB StateHandler::StateHandler(char escape_character_, std::optional enclosing_character_) : escape_character(escape_character_), enclosing_character(enclosing_character_) { - } -std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) const { - return std::string_view {file.begin() + begin, file.begin() + end}; +std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) const +{ + return std::string_view{file.begin() + begin, file.begin() + end}; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 31aa3c45714..bb8dc4632e0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -6,7 +6,8 @@ namespace DB { -struct StateHandler { +struct StateHandler +{ StateHandler(char escape_character, std::optional enclosing_character); StateHandler(const StateHandler &) = default; diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index ee8ff26576e..3a56573e13c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -3,109 +3,108 @@ namespace DB { -ValueStateHandler::ValueStateHandler(char escape_character_, char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(escape_character_, enclosing_character_), item_delimiter(item_delimiter_), - special_character_allowlist(std::move(special_character_allowlist_)) -{} +ValueStateHandler::ValueStateHandler( + char escape_character_, + char item_delimiter_, + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(escape_character_, enclosing_character_) + , item_delimiter(item_delimiter_) + , special_character_allowlist(std::move(special_character_allowlist_)) +{ +} -NextState ValueStateHandler::wait(const std::string &file, size_t pos) const { - while (pos < file.size()) { +NextState ValueStateHandler::wait(const std::string & file, size_t pos) const +{ + while (pos < file.size()) + { const auto current_character = file[pos]; - if (current_character == enclosing_character) { - return { - pos + 1u, - State::READING_ENCLOSED_VALUE - }; - } else if (current_character == item_delimiter) { - return { - pos, - State::READING_EMPTY_VALUE - }; - } else if (isValidCharacter(current_character)) { - return { - pos, - State::READING_VALUE - }; - } else { + if (current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + else if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { pos++; } } - return { - pos, - State::READING_EMPTY_VALUE - }; + return {pos, State::READING_EMPTY_VALUE}; } -NextState ValueStateHandler::read(const std::string &file, size_t pos) { +NextState ValueStateHandler::read(const std::string & file, size_t pos) +{ bool escape = false; auto start_index = pos; value = {}; - while (pos < file.size()) { + while (pos < file.size()) + { const auto current_character = file[pos++]; - if (escape) { + if (escape) + { escape = false; - } else if (escape_character == current_character) { + } + else if (escape_character == current_character) + { escape = true; - } else if (current_character == item_delimiter || !isValidCharacter(current_character)) { + } + else if (current_character == item_delimiter || !isValidCharacter(current_character)) + { value = createElement(file, start_index, pos - 1); - return { - pos, - State::FLUSH_PAIR - }; + return {pos, State::FLUSH_PAIR}; } } // TODO: do I really need the below logic? // this allows empty values at the end value = createElement(file, start_index, pos); - return { - pos, - State::FLUSH_PAIR - }; + return {pos, State::FLUSH_PAIR}; } -NextState ValueStateHandler::readEnclosed(const std::string &file, size_t pos) { +NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos) +{ auto start_index = pos; - while (pos < file.size()) { + while (pos < file.size()) + { const auto current_character = file[pos++]; - if (enclosing_character == current_character) { + if (enclosing_character == current_character) + { // not checking for empty value because with current waitValue implementation // there is no way this piece of code will be reached for the very first value character value = createElement(file, start_index, pos - 1); - return { - pos, - State::FLUSH_PAIR - }; + return {pos, State::FLUSH_PAIR}; } } - return { - pos, - State::END - }; + return {pos, State::END}; } -NextState ValueStateHandler::readEmpty(const std::string &, size_t pos) { +NextState ValueStateHandler::readEmpty(const std::string &, size_t pos) +{ value = {}; - return { - pos + 1, - State::FLUSH_PAIR - }; + return {pos + 1, State::FLUSH_PAIR}; } -bool ValueStateHandler::isValidCharacter(char character) const { +bool ValueStateHandler::isValidCharacter(char character) const +{ return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } -std::string_view ValueStateHandler::get() const { +std::string_view ValueStateHandler::get() const +{ return value; } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index c038aa03bd0..71184f70a7d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include #include "State.h" #include "StateHandler.h" @@ -9,11 +9,14 @@ namespace DB { -class ValueStateHandler : StateHandler { - +class ValueStateHandler : StateHandler +{ public: - ValueStateHandler(char escape_character, char item_delimiter, - std::optional enclosing_character, std::unordered_set special_character_allowlist_); + ValueStateHandler( + char escape_character, + char item_delimiter, + std::optional enclosing_character, + std::unordered_set special_character_allowlist_); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; [[nodiscard]] NextState read(const std::string & file, size_t pos); diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index 52f93e59097..fc2b03c75ef 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -4,7 +4,8 @@ namespace DB { -struct LazyKeyValuePairExtractorTestCase { +struct LazyKeyValuePairExtractorTestCase +{ std::string input; std::unordered_map expected_output; std::shared_ptr> extractor; @@ -15,11 +16,12 @@ std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTe return ostr << test_case.input; } -struct KeyValuePairExtractorTest : public ::testing::TestWithParam { - +struct KeyValuePairExtractorTest : public ::testing::TestWithParam +{ }; -TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) { +TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) +{ const auto & [input, expected_output, extractor] = GetParam(); auto result = extractor->extract(input); @@ -30,98 +32,58 @@ TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) { INSTANTIATE_TEST_SUITE_P( ValuesCanBeEmptyString, KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list { - { - "age:", - { - {"age", ""} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - { - "name: neymar, favorite_movie:,favorite_song:", - { - {"name", "neymar"}, - {"favorite_movie", ""}, - {"favorite_song", ""}, - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() - } - }) -); + ::testing::ValuesIn(std::initializer_list{ + {"age:", {{"age", ""}}, KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + {"name: neymar, favorite_movie:,favorite_song:", + { + {"name", "neymar"}, + {"favorite_movie", ""}, + {"favorite_song", ""}, + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build()}})); INSTANTIATE_TEST_SUITE_P( MixString, KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list { - { - R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", - { - {R"(no:me)", "neymar"}, - {"age", "30"}, - {"height", "1.75"}, - {"school", "lupe picasso"}, - {"team", "psg"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().withValueSpecialCharacterAllowList({'.'}).build() - }, - { - "XNFHGSSF_RHRUZHVBS_KWBT: F,", - { - {"XNFHGSSF_RHRUZHVBS_KWBT", "F"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - } - ) -); + ::testing::ValuesIn(std::initializer_list{ + {R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", + {{R"(no:me)", "neymar"}, {"age", "30"}, {"height", "1.75"}, {"school", "lupe picasso"}, {"team", "psg"}}, + KeyValuePairExtractorBuilder() + .withEscapingProcessor() + .withValueSpecialCharacterAllowList({'.'}) + .build()}, + {"XNFHGSSF_RHRUZHVBS_KWBT: F,", + {{"XNFHGSSF_RHRUZHVBS_KWBT", "F"}}, + KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + })); INSTANTIATE_TEST_SUITE_P( Escaping, KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list { - { - "na,me,: neymar, age:30", - { - {"age", "30"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - { - "na$me,: neymar, age:30", - { - {"age", "30"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - { - R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", - { - {"name", "neymar"}, - {"favorite_quote", R"(Premature optimization is the r$$t of all evil)"}, - {"age", "30"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().withEnclosingCharacter('"').build() - } - }) -); + ::testing::ValuesIn(std::initializer_list{ + {"na,me,: neymar, age:30", + {{"age", "30"}}, + KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + {"na$me,: neymar, age:30", + {{"age", "30"}}, + KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + {R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", + {{"name", "neymar"}, {"favorite_quote", R"(Premature optimization is the r$$t of all evil)"}, {"age", "30"}}, + KeyValuePairExtractorBuilder() + .withEscapingProcessor() + .withEnclosingCharacter('"') + .build()}})); INSTANTIATE_TEST_SUITE_P( EnclosedElements, KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list { - { - R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", - { - {"name", "Neymar"}, - {"age", "30"}, - {"team", "psg"}, - {"favorite_movie", ""}, - {"height", "1.75"} - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().withValueSpecialCharacterAllowList({'.'}).withEnclosingCharacter('"').build() - } - }) -); + ::testing::ValuesIn(std::initializer_list{ + {R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", + {{"name", "Neymar"}, {"age", "30"}, {"team", "psg"}, {"favorite_movie", ""}, {"height", "1.75"}}, + KeyValuePairExtractorBuilder() + .withEscapingProcessor() + .withValueSpecialCharacterAllowList({'.'}) + .withEnclosingCharacter('"') + .build()}})); } From 1b703d38a5d43e47731c67ae90152a00f9f0a152 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 13:20:28 -0300 Subject: [PATCH 024/535] formatting --- .../tests/gtest_key_value_pair_extractor.cpp | 81 ++++++++++++++----- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index fc2b03c75ef..519c5e98f7d 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -33,37 +33,78 @@ INSTANTIATE_TEST_SUITE_P( ValuesCanBeEmptyString, KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list{ - {"age:", {{"age", ""}}, KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, - {"name: neymar, favorite_movie:,favorite_song:", - { - {"name", "neymar"}, - {"favorite_movie", ""}, - {"favorite_song", ""}, - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build()}})); + { + "age:", + { + { + "age", + "" + } + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build() + }, + { + "name: neymar, favorite_movie:,favorite_song:", + { + {"name", "neymar"}, + {"favorite_movie", ""}, + {"favorite_song", ""}, + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build() + } + })); INSTANTIATE_TEST_SUITE_P( MixString, KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list{ - {R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", - {{R"(no:me)", "neymar"}, {"age", "30"}, {"height", "1.75"}, {"school", "lupe picasso"}, {"team", "psg"}}, - KeyValuePairExtractorBuilder() - .withEscapingProcessor() - .withValueSpecialCharacterAllowList({'.'}) - .build()}, - {"XNFHGSSF_RHRUZHVBS_KWBT: F,", - {{"XNFHGSSF_RHRUZHVBS_KWBT", "F"}}, - KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + { + R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", + { + { + R"(no:me)", "neymar" + }, + { + "age", "30" + }, + { + "height", "1.75" + }, + { + "school", "lupe picasso" + }, + { + "team", "psg" + } + }, + KeyValuePairExtractorBuilder() + .withEscapingProcessor() + .withValueSpecialCharacterAllowList({'.'}) + .build() + }, + { + "XNFHGSSF_RHRUZHVBS_KWBT: F,", + { + { + "XNFHGSSF_RHRUZHVBS_KWBT", + "F" + } + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build() + }, })); INSTANTIATE_TEST_SUITE_P( Escaping, KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list{ - {"na,me,: neymar, age:30", - {{"age", "30"}}, - KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + { + "na,me,: neymar, age:30", + { + {"age", "30"} + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build() + }, {"na$me,: neymar, age:30", {{"age", "30"}}, KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, From c6fbec5d6ae95a646ac50d1be93c9a89cbc430a5 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 13:29:32 -0300 Subject: [PATCH 025/535] fix typo and remove double whitespaces from test strings just to make formatter happy --- src/Functions/extractKeyValuePairs.cpp | 2 +- .../tests/gtest_key_value_pair_extractor.cpp | 68 +++++++++++++++---- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 4adb079ab5b..82401af1a30 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -13,7 +13,7 @@ namespace DB /* * In order to leverage DB::ReplaceStringImpl for a better performance, the default escaping processor needs - * to be overriden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the + * to be overridden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the * Volnitsky searcher. * */ struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index 519c5e98f7d..aa956d4e680 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -59,7 +59,7 @@ INSTANTIATE_TEST_SUITE_P( KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list{ { - R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", + R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", { { R"(no:me)", "neymar" @@ -101,30 +101,68 @@ INSTANTIATE_TEST_SUITE_P( { "na,me,: neymar, age:30", { - {"age", "30"} + { + "age", "30" + } }, KeyValuePairExtractorBuilder().withEscapingProcessor().build() }, - {"na$me,: neymar, age:30", - {{"age", "30"}}, - KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, - {R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", - {{"name", "neymar"}, {"favorite_quote", R"(Premature optimization is the r$$t of all evil)"}, {"age", "30"}}, + { + "na$me,: neymar, age:30", + { + { + "age", "30" + } + }, + KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + { + R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", + { + { + "name", "neymar" + }, + { + "favorite_quote", R"(Premature optimization is the r$$t of all evil)" + }, + { + "age", "30" + } + }, KeyValuePairExtractorBuilder() .withEscapingProcessor() .withEnclosingCharacter('"') - .build()}})); + .build() + }})); INSTANTIATE_TEST_SUITE_P( EnclosedElements, KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list{ - {R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", - {{"name", "Neymar"}, {"age", "30"}, {"team", "psg"}, {"favorite_movie", ""}, {"height", "1.75"}}, - KeyValuePairExtractorBuilder() - .withEscapingProcessor() - .withValueSpecialCharacterAllowList({'.'}) - .withEnclosingCharacter('"') - .build()}})); + { + R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", + { + { + "name", "Neymar" + }, + { + "age", "30" + }, + { + "team", "psg" + }, + { + "favorite_movie", "" + }, + { + "height", "1.75" + } + }, + KeyValuePairExtractorBuilder() + .withEscapingProcessor() + .withValueSpecialCharacterAllowList({'.'}) + .withEnclosingCharacter('"') + .build() + } + })); } From 2a43f9315d449828425cb3e2cf2c83161c793df3 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 14:00:29 -0300 Subject: [PATCH 026/535] add tests --- src/Functions/extractKeyValuePairs.cpp | 11 ++++--- ...t_key_value_pairs_multiple_input.reference | 30 +++++++++++++++++++ ...extract_key_value_pairs_multiple_input.sql | 29 ++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference create mode 100644 tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 82401af1a30..c9583b45d7a 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -163,8 +163,7 @@ std::shared_ptr> extractor, ColumnPtr data_column) const +ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) const { auto offsets = ColumnUInt64::create(); @@ -201,10 +200,10 @@ ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns) const auto escaped_keys = ColumnString::create(); auto escaped_values = ColumnString::create(); - ReplaceStringImpl::vector( - raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); - ReplaceStringImpl::vector( - raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); + using ReplaceString = ReplaceStringImpl; + + ReplaceString::vector(raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); + ReplaceString::vector(raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); ColumnPtr keys_ptr = std::move(escaped_keys); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference new file mode 100644 index 00000000000..6532ea51f4c --- /dev/null +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -0,0 +1,30 @@ +-- { echoOn } +----- Enclosed elements tests ----- + +-- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} +SELECT extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.'); +{'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} +----- Escaping tests ----- + +-- Expected output: {'age':'30'} +SELECT extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"'); +{'age':'30'} +-- Expected output: {'age':'30'} +SELECT extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"'); +{'age':'30'} +-- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} +select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"'); +{'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} +----- Mix Strings ----- + +-- Expected output: {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); +{'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +-- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} +SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); +{'XNFHGSSF_RHRUZHVBS_KWBT':'F'} +----- Allow list special value characters ----- + +-- Expected output: {'some_key':'@dolla%sign$'} +SELECT extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%'); +{'some_key':'@dolla%sign$'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql new file mode 100644 index 00000000000..2171f6cd1df --- /dev/null +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -0,0 +1,29 @@ +-- { echoOn } +----- Enclosed elements tests ----- + +-- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} +SELECT extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.'); + +----- Escaping tests ----- + +-- Expected output: {'age':'30'} +SELECT extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"'); + +-- Expected output: {'age':'30'} +SELECT extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"'); + +-- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} +select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"'); + +----- Mix Strings ----- + +-- Expected output: {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); + +-- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} +SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); + +----- Allow list special value characters ----- + +-- Expected output: {'some_key':'@dolla%sign$'} +SELECT extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%'); From 3430b806ded97b45fb34e96da53b681018b7bfa1 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 13 Dec 2022 14:19:02 -0300 Subject: [PATCH 027/535] style --- .../src/impl/LazyEscapingKeyValuePairExtractor.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 734af5eeb44..dfd29cbb392 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -40,10 +40,10 @@ public: while (state != State::END) { - auto nextState = processState(file, pos, state); + auto next_state = processState(file, pos, state); - pos = nextState.pos; - state = nextState.state; + pos = next_state.pos; + state = next_state.state; } return escaping_processor->process(response_views); From a34b853e1ab2e8433fdbece89eeb14f5a2795ee6 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 12:39:32 -0300 Subject: [PATCH 028/535] add en lorem ipsum docs to get a build in CI --- .../functions/string-functions.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 2e2b280d1d6..0744866ee20 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1196,3 +1196,36 @@ Result: Same as concatWithSeparator, the difference is that you need to ensure that concatWithSeparator(sep, expr1, expr2, expr3...) → result is injective, it will be used for optimization of GROUP BY. The function is named “injective” if it always returns different result for different values of arguments. In other words: different arguments never yield identical result. + +## extractKeyValuePairs + +Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. + +**Syntax** + +``` sql +extractKeyValuePairs() +``` + +**Arguments** +- Lorem Ipsum +- Lorem Ipsum + +**Returned values** +- The Lorem Ipsum String. + +**Example** + +Query: + +``` sql +SELECT extractKeyValuePairs() +``` + +Result: + +``` text +┌─concatWithSeparator()─┐ +│ Lorem Ipsum String │ +└───────────────────────────────────┘ +``` From 1d48eaeae5dac55d99dc1f3c5cecc74b5b68367b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 13:55:17 -0300 Subject: [PATCH 029/535] yet another loremipsum --- src/Functions/extractKeyValuePairs.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index c9583b45d7a..dcc2d064162 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -212,7 +212,15 @@ ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns) const REGISTER_FUNCTION(ExtractKeyValuePairs) { - factory.registerFunction(); + factory.registerFunction( + Documentation( + R"(Lorem Ipsum is simply dummy text of the printing and typesetting industry. + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, + when an unknown printer took a galley of type and scrambled it to make a type specimen book. + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. + It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, + and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.)") + ); } } From b54f82b483f9c1277f006c40f7fe82cbe04112c6 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 14:17:51 -0300 Subject: [PATCH 030/535] throw exception on no arguments --- src/Functions/extractKeyValuePairs.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index dcc2d064162..5d80d1b912d 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -11,6 +11,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +} + /* * In order to leverage DB::ReplaceStringImpl for a better performance, the default escaping processor needs * to be overridden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the @@ -70,8 +75,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const { if (arguments.empty()) { - // throw exception - return {}; + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function " + String(name) + "requires at least one argument"); } std::unordered_set value_special_characters_allow_list; From 4c1d9fa1779b43ef1efac89ec4e27dbfc87e8d40 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 15:15:06 -0300 Subject: [PATCH 031/535] improve docs --- .../functions/string-functions.md | 37 +++++++++---- src/Functions/extractKeyValuePairs.cpp | 53 ++++++++++++++++--- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 0744866ee20..c46159f1b9b 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1199,33 +1199,50 @@ The function is named “injective” if it always returns different result for ## extractKeyValuePairs -Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. +Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format, +it might contain noise (e.g. log files). The key value pair format to be interpreted should be specified via function arguments. +A key value pair consists of a key followed by a key_value_pair_delimiter and a value. +Special characters (e.g. $!@#¨) must be escaped. Enclosed/ quoted keys and values are accepted. + +The below grammar is a simplified representation of what is expected/ supported (does not include escaping and character allow_listing): + +* line = (reserved_char* key_value_pair)* reserved_char* +* key_value_pair = key kv_separator value +* key = | asciichar asciialphanumeric* +* kv_separator = ':' +* value = | asciialphanum* +* item_delimiter = ',' + +Both key and values accepts underscores as well. **Syntax** - ``` sql -extractKeyValuePairs() +extractKeyValuePairs(data, [escape_character], [key_value_pair_delimiter], [item_delimiter], [enclosing_character], [value_special_characters_allow_list]) ``` **Arguments** -- Lorem Ipsum -- Lorem Ipsum +- data - string to extract key value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- escape_character - character to be used as escape. Defaults to '\\'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- key_value_pair_delimiter - character to be used as delimiter between the key and the value. Defaults to ':'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- item_delimiter - character to be used as delimiter between pairs. Defaults to ','. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- enclosing_character - character to be used as enclosing/quoting character. Defaults to '\"'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- value_special_characters_allow_list - special (e.g. $!@#¨) value characters to ignore during value parsing and include without the need to escape. Should be specified without separators. Defaults to empty. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). **Returned values** -- The Lorem Ipsum String. +- The extracted key value pairs in a Map(String, String). **Example** Query: ``` sql -SELECT extractKeyValuePairs() +select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); ``` Result: ``` text -┌─concatWithSeparator()─┐ -│ Lorem Ipsum String │ -└───────────────────────────────────┘ +┌─extractKeyValuePairs('9 ads =nm, no\\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\\ picasso, team: psg,', '\\', ':', ',', '"', '.')─┐ +│ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 5d80d1b912d..52d18066535 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -218,12 +218,53 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) { factory.registerFunction( Documentation( - R"(Lorem Ipsum is simply dummy text of the printing and typesetting industry. - Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, - when an unknown printer took a galley of type and scrambled it to make a type specimen book. - It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. - It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, - and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.)") + R"(Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format, + it might contain noise (e.g. log files). The key value pair format to be interpreted should be specified via function arguments. + A key value pair consists of a key followed by a key_value_pair_delimiter and a value. + Special characters (e.g. $!@#¨) must be escaped. Enclosed/ quoted keys and values are accepted. + + The below grammar is a simplified representation of what is expected/ supported (does not include escaping and character allow_listing): + + * line = (reserved_char* key_value_pair)* reserved_char* + * key_value_pair = key kv_separator value + * key = | asciichar asciialphanumeric* + * kv_separator = ':' + * value = | asciialphanum* + * item_delimiter = ',' + + Both key and values accepts underscores as well. + + **Syntax** + ``` sql + extractKeyValuePairs(data, [escape_character], [key_value_pair_delimiter], [item_delimiter], [enclosing_character], [value_special_characters_allow_list]) + ``` + + **Arguments** + - data - string to extract key value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - escape_character - character to be used as escape. Defaults to '\\'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - key_value_pair_delimiter - character to be used as delimiter between the key and the value. Defaults to ':'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - item_delimiter - character to be used as delimiter between pairs. Defaults to ','. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - enclosing_character - character to be used as enclosing/quoting character. Defaults to '\"'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - value_special_characters_allow_list - special (e.g. $!@#¨) value characters to ignore during value parsing and include without the need to escape. Should be specified without separators. Defaults to empty. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + + **Returned values** + - The extracted key value pairs in a Map(String, String). + + **Example** + + Query: + + ``` sql + select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); + ``` + + Result: + + ``` text + ┌─extractKeyValuePairs('9 ads =nm, no\\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\\ picasso, team: psg,', '\\', ':', ',', '"', '.')─┐ + │ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ + └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + ```)") ); } From 252fdcaf36f29bc57aaeab852e9dbabe8c84aba4 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 15:32:41 -0300 Subject: [PATCH 032/535] remove double whitespaces to make style happy --- src/Functions/extractKeyValuePairs.cpp | 12 ++++++------ src/Functions/extractKeyValuePairs.h | 10 +++++----- .../src/impl/SimpleKeyValuePairEscapingProcessor.cpp | 2 +- .../src/impl/SimpleKeyValuePairEscapingProcessor.h | 2 +- .../keyvaluepair/src/impl/state/StateHandler.cpp | 2 +- .../keyvaluepair/src/impl/state/StateHandler.h | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 52d18066535..2cea0749f3e 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -71,7 +71,7 @@ DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes & /*argument return return_type; } -ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const ColumnsWithTypeAndName & arguments) const +ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const ColumnsWithTypeAndName & arguments) { if (arguments.empty()) { @@ -136,7 +136,7 @@ std::shared_ptr(); @@ -167,7 +167,7 @@ std::shared_ptr> extractor, ColumnPtr data_column) const +ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) { auto offsets = ColumnUInt64::create(); @@ -197,7 +197,7 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> getExtractor( + static std::shared_ptr> getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, CharArgument enclosing_character, - SetArgument value_special_characters_allow_list) const; + SetArgument value_special_characters_allow_list); - RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column) const; + static RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column); - ColumnPtr escape(RawColumns & raw_columns) const; + static ColumnPtr escape(RawColumns & raw_columns); }; } diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp index 2c06f4efafe..4a8651b7474 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp @@ -24,7 +24,7 @@ SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcesso std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element_view) const { - [[maybe_unused]] bool escape = false; + bool escape = false; std::string element; element.reserve(element_view.size()); diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h index e7508495154..92526153a3d 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h @@ -13,7 +13,7 @@ class SimpleKeyValuePairEscapingProcessor : public KeyValuePairEscapingProcessor public: explicit SimpleKeyValuePairEscapingProcessor(char escape_character); - [[nodiscard]] Response process(const ResponseViews & input) const override; + [[nodiscard]] Response process(const ResponseViews & response_views) const override; private: [[maybe_unused]] const char escape_character; diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp index 07f8d4cd5fa..b4f9cb0fd7a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp @@ -9,7 +9,7 @@ StateHandler::StateHandler(char escape_character_, std::optional enclosing { } -std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) const +std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) { return std::string_view{file.begin() + begin, file.begin() + end}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index bb8dc4632e0..832a9857e23 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -19,7 +19,7 @@ struct StateHandler [[nodiscard]] virtual std::string_view get() const = 0; protected: - [[nodiscard]] std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end) const; + [[nodiscard]] static std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end); }; } From e1c6d15714d4d05e303230ca0833fa59e933ea51 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 14 Dec 2022 19:19:36 -0300 Subject: [PATCH 033/535] remove redundant base class constructor call --- .../src/impl/SimpleKeyValuePairEscapingProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp index 4a8651b7474..7460c557c21 100644 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp +++ b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp @@ -4,7 +4,7 @@ namespace DB { SimpleKeyValuePairEscapingProcessor::SimpleKeyValuePairEscapingProcessor(char escape_character_) - : KeyValuePairEscapingProcessor>(), escape_character(escape_character_) + : escape_character(escape_character_) { } From 383e9264b7d6c6251192c0c60bee6cb38bffa722 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 15 Dec 2022 09:47:36 -0300 Subject: [PATCH 034/535] improve lib cmakefiles, add state docs and minor changes --- src/Functions/keyvaluepair/src/CMakeLists.txt | 6 +++++- .../keyvaluepair/src/KeyValuePairExtractor.h | 2 +- .../src/KeyValuePairExtractorBuilder.h | 2 +- .../impl/LazyEscapingKeyValuePairExtractor.h | 2 +- .../keyvaluepair/src/impl/state/State.h | 17 ++++++++++------- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 939937c2aef..f93473ae6f5 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -1,4 +1,8 @@ -add_library(clickhouse_functions_extractkeyvaluepairs KeyValuePairExtractor.h impl/state/KeyStateHandler.cpp impl/state/KeyStateHandler.h impl/state/State.h impl/state/ValueStateHandler.cpp impl/state/ValueStateHandler.h impl/state/StateHandler.cpp impl/state/StateHandler.h impl/SimpleKeyValuePairEscapingProcessor.h impl/SimpleKeyValuePairEscapingProcessor.cpp KeyValuePairExtractorBuilder.h KeyValuePairEscapingProcessor.h) +include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) + +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 761dc66d031..2abc8c8cc1d 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -26,7 +26,7 @@ struct KeyValuePairExtractor virtual ~KeyValuePairExtractor() = default; - virtual Response extract(const std::string & file) = 0; + virtual Response extract(const std::string & data) = 0; }; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 7b190003cf4..bcb5f19925c 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -60,7 +60,7 @@ public: if (!escaping_processor) { - throw std::runtime_error{"Escaping processor must be set, cannot build KeyValuePairExtractor without one"}; + throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); } return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index dfd29cbb392..21681acbfe7 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -42,7 +42,7 @@ public: { auto next_state = processState(file, pos, state); - pos = next_state.pos; + pos = next_state.position_in_string; state = next_state.state; } diff --git a/src/Functions/keyvaluepair/src/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h index 7141f84aa64..32249a843fe 100644 --- a/src/Functions/keyvaluepair/src/impl/state/State.h +++ b/src/Functions/keyvaluepair/src/impl/state/State.h @@ -7,28 +7,31 @@ namespace DB enum State { + // Skip characters until it finds a valid first key character. Might jump to READING_KEY, READING_ENCLOSED_KEY or END. WAITING_KEY, + // Tries to read a key. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KEY, + // Tries to read an enclosed/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. READING_ENCLOSED_KEY, + // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KV_DELIMITER, + // Skip characters until it finds a valid first value character. Might jump to READING_ENCLOSED_VALUE, READING_EMPTY_VALUE or READING_VALUE. WAITING_VALUE, + // Tries to read a value. Jumps to FLUSH_PAIR. READING_VALUE, + // Tries to read an enclosed/ quoted value. Might jump to FLUSH_PAIR or END. READING_ENCLOSED_VALUE, + // "Reads" an empty value. Jumps to FLUSH_PAIR. READING_EMPTY_VALUE, + // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. FLUSH_PAIR, END }; struct NextState { - std::size_t pos; + std::size_t position_in_string; State state; }; -struct NextStateWithElement -{ - NextState state; - std::string_view element; -}; - } From 7f8d51f73e59318914c7a068563925ef55af9f88 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 15 Dec 2022 09:59:50 -0300 Subject: [PATCH 035/535] style --- .../keyvaluepair/src/KeyValuePairExtractorBuilder.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index bcb5f19925c..366d6a3381a 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -12,6 +12,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + template > class KeyValuePairExtractorBuilder { From ace23bacbc176b7ca76ff7cb2c5af797af8b781b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 15 Dec 2022 15:03:59 -0300 Subject: [PATCH 036/535] address comments --- src/Functions/extractKeyValuePairs.cpp | 5 +++++ src/Functions/extractKeyValuePairs.h | 2 ++ .../keyvaluepair/src/KeyValuePairExtractor.h | 12 ++++++++++++ .../keyvaluepair/src/KeyValuePairExtractorBuilder.h | 3 ++- .../src/impl/LazyEscapingKeyValuePairExtractor.h | 2 +- .../keyvaluepair/src/impl/state/KeyStateHandler.cpp | 2 +- .../keyvaluepair/src/impl/state/KeyStateHandler.h | 2 +- .../keyvaluepair/src/impl/state/StateHandler.h | 2 +- .../src/impl/state/ValueStateHandler.cpp | 2 +- .../keyvaluepair/src/impl/state/ValueStateHandler.h | 2 +- 10 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 2cea0749f3e..010e4966151 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -214,6 +214,11 @@ ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns) return ColumnMap::create(keys_ptr, std::move(escaped_values), std::move(offsets)); } +ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const +{ + return {1, 2, 3, 4, 5}; +} + REGISTER_FUNCTION(ExtractKeyValuePairs) { factory.registerFunction( diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 40c20c1a08a..8aadabe68ce 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -71,6 +71,8 @@ private: static RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column); static ColumnPtr escape(RawColumns & raw_columns); + + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 2abc8c8cc1d..2ec27edc467 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -18,6 +18,18 @@ namespace DB * * Both key and values accepts underscores as well. Special characters must be escaped. * Control characters (key_value_pair_separator, item_delimiter, escape_character and enclosing_character) are customizable + * + * The return type is templated and defaults to std::unordered_map. By design, the KeyValuePairExtractor + * should extract key value pairs and return them properly escaped (in order to escape, strings are necessary. string_views cannot be used). + * The built-in SimpleKeyValuePairEscapingProcessor implements a very simple and non optimized escaping algorithm. For clients that need + * better performance, this abstraction allows custom escaping processors to be injected. + * + * ClickHouse injects a NoOp escaping processor that returns an unescaped std::unordered_map. This avoids + * unnecessary copies and allows escaping to do be done on client side. At the same time, the KeyValuePairExtractor class can be unit tested + * in a standalone manner by using the SimpleKeyValuePairEscapingProcessor for escaping. + * + * If we want to simplify this in the future, approach #2 in https://github.com/ClickHouse/ClickHouse/pull/43606#discussion_r1049541759 seems + * to be the best bet. * */ template > struct KeyValuePairExtractor diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 366d6a3381a..9c3e61e4903 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -8,6 +8,7 @@ #include #include #include "KeyValuePairExtractor.h" +#include namespace DB { @@ -65,7 +66,7 @@ public: if (!escaping_processor) { - throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); } return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 21681acbfe7..97b3bbd6b75 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -79,7 +79,7 @@ private: NextState flushPair(const std::string & file, std::size_t pos) { - response_views[key_state_handler.get()] = value_state_handler.get(); + response_views[key_state_handler.getElement()] = value_state_handler.getElement(); return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 521119e7021..625f62e31bd 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -104,7 +104,7 @@ NextState KeyStateHandler::readKeyValueDelimiter(const std::string & file, size_ } } -std::string_view KeyStateHandler::get() const +std::string_view KeyStateHandler::getElement() const { return key; } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index aef1b8bfccb..4f8189e8cbe 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -19,7 +19,7 @@ public: [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; - [[nodiscard]] std::string_view get() const override; + [[nodiscard]] std::string_view getElement() const override; private: const char key_value_delimiter; diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 832a9857e23..8e3cb4a615f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -16,7 +16,7 @@ struct StateHandler const char escape_character = '\\'; const std::optional enclosing_character; - [[nodiscard]] virtual std::string_view get() const = 0; + [[nodiscard]] virtual std::string_view getElement() const = 0; protected: [[nodiscard]] static std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end); diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index 3a56573e13c..c6a8fd76920 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -103,7 +103,7 @@ bool ValueStateHandler::isValidCharacter(char character) const return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } -std::string_view ValueStateHandler::get() const +std::string_view ValueStateHandler::getElement() const { return value; } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index 71184f70a7d..d7f784e1661 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -23,7 +23,7 @@ public: [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); [[nodiscard]] NextState readEmpty(const std::string & file, size_t pos); - [[nodiscard]] std::string_view get() const override; + [[nodiscard]] std::string_view getElement() const override; private: const char item_delimiter; From 304c1531c1c3cf297b774c95a6797bb5a1eccc51 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 19 Dec 2022 11:05:29 -0300 Subject: [PATCH 037/535] add control characters validation --- src/Functions/extractKeyValuePairs.cpp | 23 +++++++++++++++---- src/Functions/extractKeyValuePairs.h | 2 ++ ...t_key_value_pairs_multiple_input.reference | 6 ++--- ...extract_key_value_pairs_multiple_input.sql | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 010e4966151..447ccc31f1d 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -14,6 +14,7 @@ namespace DB namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int BAD_ARGUMENTS; } /* @@ -61,7 +62,7 @@ bool ExtractKeyValuePairs::isSuitableForShortCircuitArgumentsExecution(const Dat return false; } -size_t ExtractKeyValuePairs::getNumberOfArguments() const +std::size_t ExtractKeyValuePairs::getNumberOfArguments() const { return 0u; } @@ -87,21 +88,21 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const return ParsedArguments{data_column, {}, {}, {}, {}, value_special_characters_allow_list}; } - auto escape_character = arguments[1].column->getDataAt(0).toView().front(); + auto escape_character = extractControlCharacter(arguments[1].column); if (arguments.size() == 2u) { return ParsedArguments{data_column, escape_character, {}, {}, {}, value_special_characters_allow_list}; } - auto key_value_pair_delimiter = arguments[2].column->getDataAt(0).toView().front(); + auto key_value_pair_delimiter = extractControlCharacter(arguments[2].column); if (arguments.size() == 3u) { return ParsedArguments{data_column, escape_character, key_value_pair_delimiter, {}, {}, value_special_characters_allow_list}; } - auto item_delimiter = arguments[3].column->getDataAt(0).toView().front(); + auto item_delimiter = extractControlCharacter(arguments[3].column); if (arguments.size() == 4u) { @@ -109,7 +110,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const data_column, escape_character, key_value_pair_delimiter, item_delimiter, {}, value_special_characters_allow_list}; } - auto enclosing_character = arguments[4].column->getDataAt(0).toView().front(); + auto enclosing_character = extractControlCharacter(arguments[4].column); if (arguments.size() == 5u) { @@ -131,6 +132,18 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list}; } +char ExtractKeyValuePairs::extractControlCharacter(ColumnPtr column) +{ + auto view = column->getDataAt(0).toView(); + + if (view.size() != 1u) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must contain exactly 1 character"); + } + + return view.front(); +} + std::shared_ptr> ExtractKeyValuePairs::getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 8aadabe68ce..148de41a359 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -61,6 +61,8 @@ private: static ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments); + static char extractControlCharacter(ColumnPtr column); + static std::shared_ptr> getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 6532ea51f4c..bfcd1196da3 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -17,9 +17,9 @@ select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimizat {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} ----- Mix Strings ----- --- Expected output: {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} -select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); -{'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +-- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +select extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); +{'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 2171f6cd1df..d269fd3a0e1 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -17,8 +17,8 @@ select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimizat ----- Mix Strings ----- --- Expected output: {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} -select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); +-- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +select extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); From 5c631ff8115bb2f99fcd65a78549f735af4408d5 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 19 Dec 2022 13:17:48 -0300 Subject: [PATCH 038/535] sort output to make reference files more reliable --- ...t_key_value_pairs_multiple_input.reference | 94 +++++++++++++++++-- ...extract_key_value_pairs_multiple_input.sql | 88 +++++++++++++++-- 2 files changed, 165 insertions(+), 17 deletions(-) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index bfcd1196da3..02280ba61af 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -2,29 +2,103 @@ ----- Enclosed elements tests ----- -- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} -SELECT extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.'); -{'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} +WITH + extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'30','favorite_movie':'','height':'1.75','name':'Neymar','team':'psg'} ----- Escaping tests ----- -- Expected output: {'age':'30'} -SELECT extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; {'age':'30'} -- Expected output: {'age':'30'} -SELECT extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; {'age':'30'} -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} -select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"'); -{'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} ----- Mix Strings ----- -- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} -select extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); -{'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} +WITH + extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'30','height':'1.75','na:me':'neymar','school':'lupe picasso','team':'psg'} -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} -SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} ----- Allow list special value characters ----- -- Expected output: {'some_key':'@dolla%sign$'} -SELECT extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%'); +WITH + extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; {'some_key':'@dolla%sign$'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index d269fd3a0e1..fe036a4aae8 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -2,28 +2,102 @@ ----- Enclosed elements tests ----- -- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} -SELECT extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.'); +WITH + extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; ----- Escaping tests ----- -- Expected output: {'age':'30'} -SELECT extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- Expected output: {'age':'30'} -SELECT extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} -select extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; ----- Mix Strings ----- -- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} -select extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +WITH + extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} -SELECT extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"'); +WITH + extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; ----- Allow list special value characters ----- -- Expected output: {'some_key':'@dolla%sign$'} -SELECT extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%'); +WITH + extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; From 51e71bd10ef71521cfcf4d131ee8056e902af0da Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 20 Dec 2022 07:01:38 -0300 Subject: [PATCH 039/535] move to object libs --- src/Functions/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 3accf674e37..13acb8b2f9c 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -108,7 +108,7 @@ add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) add_subdirectory(keyvaluepair) -list (APPEND PRIVATE_LIBS clickhouse_functions_extractkeyvaluepairs) +list (APPEND OBJECT_LIBS $) # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) From 1104f218aa15a451d8f35b34cc5200ac6e028933 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 20 Dec 2022 07:38:49 -0300 Subject: [PATCH 040/535] fix escape function --- src/Functions/extractKeyValuePairs.cpp | 8 +++++--- src/Functions/extractKeyValuePairs.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 447ccc31f1d..2dd73203736 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -210,17 +210,19 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr; - ReplaceString::vector(raw_keys->getChars(), raw_keys->getOffsets(), "\\", "", escaped_keys->getChars(), escaped_keys->getOffsets()); - ReplaceString::vector(raw_values->getChars(), raw_values->getOffsets(), "\\", "", escaped_values->getChars(), escaped_values->getOffsets()); + ReplaceString::vector(raw_keys->getChars(), raw_keys->getOffsets(), escape_character_string, "", escaped_keys->getChars(), escaped_keys->getOffsets()); + ReplaceString::vector(raw_values->getChars(), raw_values->getOffsets(), escape_character_string, "", escaped_values->getChars(), escaped_values->getOffsets()); ColumnPtr keys_ptr = std::move(escaped_keys); diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 148de41a359..ce0656578bc 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -72,7 +72,7 @@ private: static RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column); - static ColumnPtr escape(RawColumns & raw_columns); + static ColumnPtr escape(RawColumns & raw_columns, char escape_character); ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; From 421c842a87234528616c31772c2d46dee42c76f1 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 20 Dec 2022 07:39:05 -0300 Subject: [PATCH 041/535] fix escape function --- src/Functions/extractKeyValuePairs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 2dd73203736..8abb7c50caf 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -217,7 +217,7 @@ ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns, char escape_cha auto escaped_keys = ColumnString::create(); auto escaped_values = ColumnString::create(); - auto escape_character_string = std::string('1', escape_character); + auto escape_character_string = std::string(1, escape_character); using ReplaceString = ReplaceStringImpl; From 89ece4ab6d8b0b8d66f74adacc828425dae08815 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 20 Dec 2022 09:08:25 -0300 Subject: [PATCH 042/535] escp --- src/Functions/extractKeyValuePairs.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 8abb7c50caf..8e875bff1c5 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -49,7 +49,8 @@ ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & argum auto raw_columns = extract(extractor, data_column); - return escape(raw_columns); + // improve escape character.. + return escape(raw_columns, escape_character ? escape_character.value() : '\\'); } bool ExtractKeyValuePairs::isVariadic() const From 65188a565f68e96433db904c0087278982ddcbba Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 10 Jan 2023 16:36:32 -0300 Subject: [PATCH 043/535] Remove state from Extractor. It's usually a bad idea that bites us in the future, it did. --- .../impl/LazyEscapingKeyValuePairExtractor.h | 30 +++++++++++-------- .../src/impl/state/KeyStateHandler.cpp | 9 ++---- .../src/impl/state/KeyStateHandler.h | 7 ++--- .../src/impl/state/StateHandler.h | 2 -- .../src/impl/state/ValueStateHandler.cpp | 11 ++----- .../src/impl/state/ValueStateHandler.h | 9 ++---- 6 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 97b3bbd6b75..7536a824ab4 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -34,13 +34,18 @@ public: [[nodiscard]] Response extract(const std::string & file) override { + std::unordered_map response_views; + auto state = State::WAITING_KEY; std::size_t pos = 0; + std::string_view key; + std::string_view value; + while (state != State::END) { - auto next_state = processState(file, pos, state); + auto next_state = processState(file, pos, state, key, value, response_views); pos = next_state.position_in_string; state = next_state.state; @@ -50,36 +55,39 @@ public: } private: - NextState processState(const std::string & file, std::size_t pos, State state) + NextState processState(const std::string & file, std::size_t pos, State state, + std::string_view & key, std::string_view & value, + std::unordered_map & response_views) { switch (state) { case State::WAITING_KEY: return key_state_handler.wait(file, pos); case State::READING_KEY: - return key_state_handler.read(file, pos); + return key_state_handler.read(file, pos, key); case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos); + return key_state_handler.readEnclosed(file, pos, key); case State::READING_KV_DELIMITER: return key_state_handler.readKeyValueDelimiter(file, pos); case State::WAITING_VALUE: return value_state_handler.wait(file, pos); case State::READING_VALUE: - return value_state_handler.read(file, pos); + return value_state_handler.read(file, pos, value); case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos); + return value_state_handler.readEnclosed(file, pos, value); case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos); + return value_state_handler.readEmpty(file, pos, value); case State::FLUSH_PAIR: - return flushPair(file, pos); + return flushPair(file, pos, key, value, response_views); case END: return {pos, state}; } } - NextState flushPair(const std::string & file, std::size_t pos) + NextState flushPair(const std::string & file, std::size_t pos, std::string_view key, + std::string_view value, std::unordered_map & response_views) { - response_views[key_state_handler.getElement()] = value_state_handler.getElement(); + response_views[key] = value; return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; } @@ -87,8 +95,6 @@ private: KeyStateHandler key_state_handler; ValueStateHandler value_state_handler; std::shared_ptr> escaping_processor; - - std::unordered_map response_views; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 625f62e31bd..d4b162236af 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -30,7 +30,7 @@ NextState KeyStateHandler::wait(const std::string & file, size_t pos) const return {pos, State::END}; } -NextState KeyStateHandler::read(const std::string & file, size_t pos) +NextState KeyStateHandler::read(const std::string & file, size_t pos, std::string_view & key) { bool escape = false; @@ -65,7 +65,7 @@ NextState KeyStateHandler::read(const std::string & file, size_t pos) return {pos, State::END}; } -NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos) +NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos, std::string_view & key) { auto start_index = pos; key = {}; @@ -104,9 +104,4 @@ NextState KeyStateHandler::readKeyValueDelimiter(const std::string & file, size_ } } -std::string_view KeyStateHandler::getElement() const -{ - return key; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index 4f8189e8cbe..215700c8f09 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -15,15 +15,12 @@ public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextState read(const std::string & file, size_t pos); - [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); + [[nodiscard]] NextState read(const std::string & file, size_t pos, std::string_view & key); + [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos, std::string_view & key); [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; - [[nodiscard]] std::string_view getElement() const override; - private: const char key_value_delimiter; - std::string_view key; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 8e3cb4a615f..0a7f503ecf5 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -16,8 +16,6 @@ struct StateHandler const char escape_character = '\\'; const std::optional enclosing_character; - [[nodiscard]] virtual std::string_view getElement() const = 0; - protected: [[nodiscard]] static std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end); }; diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index c6a8fd76920..896ee2a6a42 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -41,7 +41,7 @@ NextState ValueStateHandler::wait(const std::string & file, size_t pos) const return {pos, State::READING_EMPTY_VALUE}; } -NextState ValueStateHandler::read(const std::string & file, size_t pos) +NextState ValueStateHandler::read(const std::string & file, size_t pos, std::string_view & value) { bool escape = false; @@ -73,7 +73,7 @@ NextState ValueStateHandler::read(const std::string & file, size_t pos) return {pos, State::FLUSH_PAIR}; } -NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos) +NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos, std::string_view & value) { auto start_index = pos; @@ -92,7 +92,7 @@ NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos) return {pos, State::END}; } -NextState ValueStateHandler::readEmpty(const std::string &, size_t pos) +NextState ValueStateHandler::readEmpty(const std::string &, size_t pos, std::string_view & value) { value = {}; return {pos + 1, State::FLUSH_PAIR}; @@ -103,9 +103,4 @@ bool ValueStateHandler::isValidCharacter(char character) const return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } -std::string_view ValueStateHandler::getElement() const -{ - return value; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index d7f784e1661..346cabc0f64 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -19,16 +19,13 @@ public: std::unordered_set special_character_allowlist_); [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextState read(const std::string & file, size_t pos); - [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos); - [[nodiscard]] NextState readEmpty(const std::string & file, size_t pos); - - [[nodiscard]] std::string_view getElement() const override; + [[nodiscard]] NextState read(const std::string & file, size_t pos, std::string_view & value); + [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos, std::string_view & value); + [[nodiscard]] static NextState readEmpty(const std::string & file, size_t pos, std::string_view & value); private: const char item_delimiter; std::unordered_set special_character_allowlist; - std::string_view value; bool isValidCharacter(char character) const; }; From 296a19129b836263ed1c998b4b3a3b5754cd4b37 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 10 Jan 2023 20:15:36 -0300 Subject: [PATCH 044/535] alphanumeric as key start --- src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index d4b162236af..dbdfe099635 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -13,7 +13,7 @@ NextState KeyStateHandler::wait(const std::string & file, size_t pos) const while (pos < file.size()) { const auto current_character = file[pos]; - if (isalpha(current_character)) + if (isalnum(current_character)) { return {pos, State::READING_KEY}; } From b8481897261ceb7f7e41db01f7b48f6ca258fdef Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 13 Jan 2023 15:24:14 -0300 Subject: [PATCH 045/535] tmp --- src/Functions/extractKeyValuePairs.cpp | 102 +++++++++++++++++- .../keyvaluepair/src/KeyValuePairExtractor.h | 2 + .../impl/LazyEscapingKeyValuePairExtractor.h | 10 +- .../src/impl/state/KeyStateHandler.cpp | 18 ++-- .../src/impl/state/KeyStateHandler.h | 10 +- .../src/impl/state/StateHandler.cpp | 2 +- .../src/impl/state/StateHandler.h | 2 +- .../src/impl/state/ValueStateHandler.cpp | 10 +- .../src/impl/state/ValueStateHandler.h | 10 +- 9 files changed, 134 insertions(+), 32 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 8e875bff1c5..6bc0086e503 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -8,6 +8,11 @@ #include #include +#include + +/* Only needed for the sake of this example. */ +#include + namespace DB { @@ -41,16 +46,46 @@ String ExtractKeyValuePairs::getName() const ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { + using std::chrono::high_resolution_clock; + using std::chrono::duration_cast; + using std::chrono::duration; + using std::chrono::microseconds; + +// auto t1 = high_resolution_clock::now(); + auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); auto extractor = getExtractor( escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); +// auto t2 = high_resolution_clock::now(); auto raw_columns = extract(extractor, data_column); - // improve escape character.. - return escape(raw_columns, escape_character ? escape_character.value() : '\\'); + ColumnPtr keys_ptr = std::move(raw_columns.keys); +// auto t3 = high_resolution_clock::now(); + + + auto map = ColumnMap::create(keys_ptr, std::move(raw_columns.values), std::move(raw_columns.offsets)); +// auto t4 = high_resolution_clock::now(); + +// std::cout<<"Time taken for building extractor is: "<(t2 - t1).count()<<"u\n"; +// std::cout<<"Time taken for building extracting & creating output is: "<(t3 - t2).count()<<"u\n"; +// std::cout<<"Time taken for whole process is: "<(t4 - t1).count()<<"u\n"; + return map; + +// return raw_columns; + +// +// // improve escape character.. +// auto escaped_out = escape(raw_columns, escape_character ? escape_character.value() : '\\'); +// auto t3 = high_resolution_clock::now(); +// +// +// std::cout<<"Time taken for extraction is: "<(t2 - t1).count()<<"u\n"; +// std::cout<<"Time taken for escaping is: "<(t3 - t2).count()<<"u\n"; +// +// return escaped_out; } bool ExtractKeyValuePairs::isVariadic() const @@ -183,19 +218,37 @@ std::shared_ptr> extractor, ColumnPtr data_column) { + using std::chrono::high_resolution_clock; + using std::chrono::duration_cast; + using std::chrono::duration; + using std::chrono::microseconds; + auto offsets = ColumnUInt64::create(); auto keys = ColumnString::create(); auto values = ColumnString::create(); +// keys->reserve(data_column->byteSize()); +// values->reserve(data_column->byteSize()); + auto row_offset = 0u; +// long totalExtractionTime = 0; +// long shortestExtractionTime = std::numeric_limits::max(); +// long longestExtractionTime = std::numeric_limits::min(); +// +// long totalInsertionTime = 0; +// long shortestInsertionTime = std::numeric_limits::max(); +// long longestInsertionTime = std::numeric_limits::min(); + + for (auto i = 0u; i < data_column->size(); i++) { - auto row = data_column->getDataAt(i).toString(); + auto row = data_column->getDataAt(i).toView(); +// auto t2 = high_resolution_clock::now(); - // TODO avoid copying auto response = extractor->extract(row); +// auto t3 = high_resolution_clock::now(); for (auto [key, value] : response) { @@ -206,8 +259,46 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptrinsert(row_offset); + +// auto t4 = high_resolution_clock::now(); +// +// long extractionTime = duration_cast(t3 - t2).count(); +// long insertionTime = duration_cast(t4 - t3).count(); +// +// totalExtractionTime += extractionTime; +// totalInsertionTime += insertionTime; +// +// if (extractionTime > longestExtractionTime) +// { +// longestExtractionTime = extractionTime; +// } +// +// if (extractionTime < shortestExtractionTime) +// { +// shortestExtractionTime = extractionTime; +// } +// +// if (insertionTime > longestInsertionTime) +// { +// longestInsertionTime = insertionTime; +// } +// +// if (insertionTime < shortestInsertionTime) +// { +// shortestInsertionTime = insertionTime; +// } } +// if (!data_column->empty()) +// { +// auto averageInsertionTime = totalInsertionTime / data_column->size(); +// auto averageExtractionTime = totalExtractionTime / data_column->size(); +// +// std::cout<<"Longest extraction time: "<reserve(raw_keys->size()); + escaped_values->reserve(raw_values->size()); + auto escape_character_string = std::string(1, escape_character); using ReplaceString = ReplaceStringImpl; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 2ec27edc467..d811f5c6534 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -39,6 +39,8 @@ struct KeyValuePairExtractor virtual ~KeyValuePairExtractor() = default; virtual Response extract(const std::string & data) = 0; + + virtual Response extract(const std::string_view & data) = 0; }; } diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index 7536a824ab4..d65ded8c3b0 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -33,6 +33,12 @@ public: } [[nodiscard]] Response extract(const std::string & file) override + { + auto view = std::string_view {file}; + return extract(view); + } + + [[nodiscard]] Response extract(const std::string_view & file) override { std::unordered_map response_views; @@ -55,7 +61,7 @@ public: } private: - NextState processState(const std::string & file, std::size_t pos, State state, + NextState processState(std::string_view file, std::size_t pos, State state, std::string_view & key, std::string_view & value, std::unordered_map & response_views) { @@ -84,7 +90,7 @@ private: } } - NextState flushPair(const std::string & file, std::size_t pos, std::string_view key, + NextState flushPair(const std::string_view & file, std::size_t pos, std::string_view key, std::string_view value, std::unordered_map & response_views) { response_views[key] = value; diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index dbdfe099635..8b68f813293 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -8,7 +8,7 @@ KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_characte { } -NextState KeyStateHandler::wait(const std::string & file, size_t pos) const +NextState KeyStateHandler::wait(std::string_view file, size_t pos) { while (pos < file.size()) { @@ -17,7 +17,7 @@ NextState KeyStateHandler::wait(const std::string & file, size_t pos) const { return {pos, State::READING_KEY}; } - else if (enclosing_character && current_character == enclosing_character) + else if (current_character == '"') { return {pos + 1u, State::READING_ENCLOSED_KEY}; } @@ -30,7 +30,7 @@ NextState KeyStateHandler::wait(const std::string & file, size_t pos) const return {pos, State::END}; } -NextState KeyStateHandler::read(const std::string & file, size_t pos, std::string_view & key) +NextState KeyStateHandler::read(std::string_view file, size_t pos, std::string_view & key) { bool escape = false; @@ -45,11 +45,11 @@ NextState KeyStateHandler::read(const std::string & file, size_t pos, std::strin { escape = false; } - else if (escape_character == current_character) + else if ('\\' == current_character) { escape = true; } - else if (current_character == key_value_delimiter) + else if (current_character == '=') { // not checking for empty key because with current waitKey implementation // there is no way this piece of code will be reached for the very first key character @@ -65,7 +65,7 @@ NextState KeyStateHandler::read(const std::string & file, size_t pos, std::strin return {pos, State::END}; } -NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos, std::string_view & key) +NextState KeyStateHandler::readEnclosed(std::string_view file, size_t pos, std::string_view & key) { auto start_index = pos; key = {}; @@ -74,7 +74,7 @@ NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos, st { const auto current_character = file[pos++]; - if (enclosing_character == current_character) + if ('"' == current_character) { auto is_key_empty = start_index == pos; @@ -91,7 +91,7 @@ NextState KeyStateHandler::readEnclosed(const std::string & file, size_t pos, st return {pos, State::END}; } -NextState KeyStateHandler::readKeyValueDelimiter(const std::string & file, size_t pos) const +NextState KeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) { if (pos == file.size()) { @@ -100,7 +100,7 @@ NextState KeyStateHandler::readKeyValueDelimiter(const std::string & file, size_ else { const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + return {pos, current_character == '=' ? State::WAITING_VALUE : State::WAITING_KEY}; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index 215700c8f09..ebc2849e10c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -14,13 +14,13 @@ class KeyStateHandler : StateHandler public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); - [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextState read(const std::string & file, size_t pos, std::string_view & key); - [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos, std::string_view & key); - [[nodiscard]] NextState readKeyValueDelimiter(const std::string & file, size_t pos) const; + [[nodiscard]] static NextState wait(std::string_view file, size_t pos) ; + [[nodiscard]] static NextState read(std::string_view file, size_t pos, std::string_view & key); + [[nodiscard]] static NextState readEnclosed(std::string_view file, size_t pos, std::string_view & key); + [[nodiscard]] static NextState readKeyValueDelimiter(std::string_view file, size_t pos); private: - const char key_value_delimiter; + [[maybe_unused]] const char key_value_delimiter; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp index b4f9cb0fd7a..67254ee4217 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp @@ -9,7 +9,7 @@ StateHandler::StateHandler(char escape_character_, std::optional enclosing { } -std::string_view StateHandler::createElement(const std::string & file, std::size_t begin, std::size_t end) +std::string_view StateHandler::createElement(std::string_view file, std::size_t begin, std::size_t end) { return std::string_view{file.begin() + begin, file.begin() + end}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 0a7f503ecf5..abc9f1ad4fc 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -17,7 +17,7 @@ struct StateHandler const std::optional enclosing_character; protected: - [[nodiscard]] static std::string_view createElement(const std::string & file, std::size_t begin, std::size_t end); + [[nodiscard]] static std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end); }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index 896ee2a6a42..dbd3fe2d495 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -14,7 +14,7 @@ ValueStateHandler::ValueStateHandler( { } -NextState ValueStateHandler::wait(const std::string & file, size_t pos) const +NextState ValueStateHandler::wait(std::string_view file, size_t pos) const { while (pos < file.size()) { @@ -41,7 +41,7 @@ NextState ValueStateHandler::wait(const std::string & file, size_t pos) const return {pos, State::READING_EMPTY_VALUE}; } -NextState ValueStateHandler::read(const std::string & file, size_t pos, std::string_view & value) +NextState ValueStateHandler::read(const std::string_view file, size_t pos, std::string_view & value) { bool escape = false; @@ -73,7 +73,7 @@ NextState ValueStateHandler::read(const std::string & file, size_t pos, std::str return {pos, State::FLUSH_PAIR}; } -NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos, std::string_view & value) +NextState ValueStateHandler::readEnclosed(std::string_view file, size_t pos, std::string_view & value) { auto start_index = pos; @@ -92,7 +92,7 @@ NextState ValueStateHandler::readEnclosed(const std::string & file, size_t pos, return {pos, State::END}; } -NextState ValueStateHandler::readEmpty(const std::string &, size_t pos, std::string_view & value) +NextState ValueStateHandler::readEmpty(std::string_view, size_t pos, std::string_view & value) { value = {}; return {pos + 1, State::FLUSH_PAIR}; @@ -100,7 +100,7 @@ NextState ValueStateHandler::readEmpty(const std::string &, size_t pos, std::str bool ValueStateHandler::isValidCharacter(char character) const { - return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; + return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_'; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index 346cabc0f64..0dc610f01ec 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -18,14 +18,14 @@ public: std::optional enclosing_character, std::unordered_set special_character_allowlist_); - [[nodiscard]] NextState wait(const std::string & file, size_t pos) const; - [[nodiscard]] NextState read(const std::string & file, size_t pos, std::string_view & value); - [[nodiscard]] NextState readEnclosed(const std::string & file, size_t pos, std::string_view & value); - [[nodiscard]] static NextState readEmpty(const std::string & file, size_t pos, std::string_view & value); + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState read(std::string_view file, size_t pos, std::string_view & value); + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, std::string_view & value); + [[nodiscard]] static NextState readEmpty(std::string_view file, size_t pos, std::string_view & value); private: const char item_delimiter; - std::unordered_set special_character_allowlist; + [[maybe_unused]] std::unordered_set special_character_allowlist; bool isValidCharacter(char character) const; }; From 9250e29b6730330e39de044dba4a9de1cd45431f Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 19 Jan 2023 16:53:05 -0300 Subject: [PATCH 046/535] mess, i guess all bugs are fixed and performance a bit better --- src/Common/CaresPTRResolver.cpp | 5 +- src/Common/remapExecutable.cpp | 2 +- src/Functions/extractKeyValuePairs.cpp | 168 +++++++++++------- src/Functions/extractKeyValuePairs.h | 17 +- src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../keyvaluepair/src/KeyValuePairExtractor.h | 2 +- .../src/KeyValuePairExtractorBuilder.cpp | 38 ++++ .../src/KeyValuePairExtractorBuilder.h | 60 +------ .../src/StaleKeyValuePairExtractorBuilder.h | 85 +++++++++ .../src/impl/CHKeyValuePairExtractor.cpp | 78 ++++++++ .../src/impl/CHKeyValuePairExtractor.h | 34 ++++ .../src/impl/InlineKeyValuePairExtractor.cpp | 77 ++++++++ .../src/impl/InlineKeyValuePairExtractor.h | 31 ++++ .../impl/LazyEscapingKeyValuePairExtractor.h | 2 +- .../state/InlineEscapingKeyStateHandler.cpp | 107 +++++++++++ .../state/InlineEscapingKeyStateHandler.h | 26 +++ .../state/InlineEscapingValueStateHandler.cpp | 104 +++++++++++ .../state/InlineEscapingValueStateHandler.h | 31 ++++ .../src/impl/state/KeyStateHandler.cpp | 12 +- .../src/impl/state/KeyStateHandler.h | 8 +- .../src/impl/state/ValueStateHandler.cpp | 2 +- .../src/impl/state/ValueStateHandler.h | 2 +- .../tests/gtest_key_value_pair_extractor.cpp | 19 +- ...t_key_value_pairs_multiple_input.reference | 16 +- ...extract_key_value_pairs_multiple_input.sql | 12 ++ 25 files changed, 789 insertions(+), 151 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp create mode 100644 src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h create mode 100644 src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h create mode 100644 src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h diff --git a/src/Common/CaresPTRResolver.cpp b/src/Common/CaresPTRResolver.cpp index adb7b0d33c1..0c7768448a0 100644 --- a/src/Common/CaresPTRResolver.cpp +++ b/src/Common/CaresPTRResolver.cpp @@ -149,7 +149,7 @@ namespace DB int number_of_sockets_to_poll = 0; - for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++, number_of_sockets_to_poll++) + for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++) { pollfd[i].events = 0; pollfd[i].revents = 0; @@ -157,7 +157,8 @@ namespace DB if (ARES_GETSOCK_READABLE(sockets_bitmask, i)) { pollfd[i].fd = sockets[i]; - pollfd[i].events = POLLIN; + pollfd[i].events = POLLRDNORM | POLLIN; + number_of_sockets_to_poll++; } else { diff --git a/src/Common/remapExecutable.cpp b/src/Common/remapExecutable.cpp index 206314ea295..1ded173d8e0 100644 --- a/src/Common/remapExecutable.cpp +++ b/src/Common/remapExecutable.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 6bc0086e503..10f313e6092 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -22,18 +23,6 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } -/* - * In order to leverage DB::ReplaceStringImpl for a better performance, the default escaping processor needs - * to be overridden by a no-op escaping processor. DB::ReplaceStringImpl does in-place replacing and leverages the - * Volnitsky searcher. - * */ -struct NoOpEscapingProcessor : KeyValuePairEscapingProcessor -{ - explicit NoOpEscapingProcessor(char) { } - - Response process(const ResponseViews & response_views) const override { return response_views; } -}; - ExtractKeyValuePairs::ExtractKeyValuePairs() : return_type(std::make_shared(std::make_shared(), std::make_shared())) { @@ -44,20 +33,57 @@ String ExtractKeyValuePairs::getName() const return name; } +ColumnPtr ExtractKeyValuePairs::chInline( + ColumnPtr data_column, + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument) +{ + InlineEscapingKeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, *enclosing_character); + InlineEscapingValueStateHandler value_state_handler(*escape_character, *item_delimiter, *enclosing_character); + CHKeyValuePairExtractor ch_extractor(key_state_handler, value_state_handler); + + auto offsets = ColumnUInt64::create(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + uint64_t offset = 0u; + + for (auto i = 0u; i < data_column->size(); i++) + { + auto row = data_column->getDataAt(i).toView(); + + auto inserted_rows = ch_extractor.extract(row, keys, values); + + offset += inserted_rows; + + offsets->insert(offset); + } + + ColumnPtr keys_ptr = std::move(keys); + + return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); +} + + ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { - using std::chrono::high_resolution_clock; - using std::chrono::duration_cast; - using std::chrono::duration; - using std::chrono::microseconds; - // auto t1 = high_resolution_clock::now(); - auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] + auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, + enclosing_character, value_special_characters_allow_list, ch_inline] = parseArguments(arguments); + if (ch_inline) + { + return chInline(data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); + } + auto extractor = getExtractor( - escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); + escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character); // auto t2 = high_resolution_clock::now(); auto raw_columns = extract(extractor, data_column); @@ -159,13 +185,22 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const value_special_characters_allow_list}; } + bool ch_inline = false; + + if (arguments.size() == 7u) + { + ch_inline = true; + } + auto value_special_characters_allow_list_characters = arguments[5].column->getDataAt(0).toView(); value_special_characters_allow_list.insert( value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); return ParsedArguments{ - data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list}; + data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list, + ch_inline + }; } char ExtractKeyValuePairs::extractControlCharacter(ColumnPtr column) @@ -184,10 +219,9 @@ std::shared_ptr(); + auto builder = KeyValuePairExtractorBuilder(); if (escape_character) { @@ -209,13 +243,49 @@ std::shared_ptr(); - - builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); - return builder.build(); } +std::shared_ptr>> ExtractKeyValuePairs::getExtractor2( + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument) +{ + InlineEscapingKeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, enclosing_character); + InlineEscapingValueStateHandler value_state_handler(*escape_character, *item_delimiter, enclosing_character); + + return std::make_shared(key_state_handler, value_state_handler); +// auto builder = KeyValuePairExtractorBuilder(); +// +// if (escape_character) +// { +// builder.withEscapeCharacter(escape_character.value()); +// } +// +// if (key_value_pair_delimiter) +// { +// builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); +// } +// +// if (item_delimiter) +// { +// builder.withItemDelimiter(item_delimiter.value()); +// } +// +// if (enclosing_character) +// { +// builder.withEnclosingCharacter(enclosing_character.value()); +// } +// +// builder.withEscapingProcessor(); +// +// builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); +// +// return builder.build(); +} + ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) { using std::chrono::high_resolution_clock; @@ -245,12 +315,12 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptrsize(); i++) { auto row = data_column->getDataAt(i).toView(); -// auto t2 = high_resolution_clock::now(); + // auto t2 = high_resolution_clock::now(); auto response = extractor->extract(row); -// auto t3 = high_resolution_clock::now(); + // auto t3 = high_resolution_clock::now(); - for (auto [key, value] : response) + for (auto & [key, value] : response) { keys->insert(key); values->insert(value); @@ -259,46 +329,8 @@ ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptrinsert(row_offset); - -// auto t4 = high_resolution_clock::now(); -// -// long extractionTime = duration_cast(t3 - t2).count(); -// long insertionTime = duration_cast(t4 - t3).count(); -// -// totalExtractionTime += extractionTime; -// totalInsertionTime += insertionTime; -// -// if (extractionTime > longestExtractionTime) -// { -// longestExtractionTime = extractionTime; -// } -// -// if (extractionTime < shortestExtractionTime) -// { -// shortestExtractionTime = extractionTime; -// } -// -// if (insertionTime > longestInsertionTime) -// { -// longestInsertionTime = insertionTime; -// } -// -// if (insertionTime < shortestInsertionTime) -// { -// shortestInsertionTime = insertionTime; -// } } -// if (!data_column->empty()) -// { -// auto averageInsertionTime = totalInsertionTime / data_column->size(); -// auto averageExtractionTime = totalExtractionTime / data_column->size(); -// -// std::cout<<"Longest extraction time: "< value_special_characters_allow_list; + bool ch_inline = false; }; struct RawColumns @@ -34,7 +35,7 @@ class ExtractKeyValuePairs : public IFunction }; public: - using EscapingProcessorOutput = std::unordered_map; + using EscapingProcessorOutput = std::unordered_map; ExtractKeyValuePairs(); @@ -64,6 +65,12 @@ private: static char extractControlCharacter(ColumnPtr column); static std::shared_ptr> getExtractor( + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character); + + static std::shared_ptr>> getExtractor2( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, @@ -74,6 +81,14 @@ private: static ColumnPtr escape(RawColumns & raw_columns, char escape_character); + static ColumnPtr chInline( + ColumnPtr data_column, + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character, + SetArgument value_special_characters_allow_list) ; + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index f93473ae6f5..f5381edb3b2 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -3,6 +3,6 @@ add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.cpp impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.cpp impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.cpp impl/state/InlineEscapingValueStateHandler.h impl/InlineKeyValuePairExtractor.cpp impl/InlineKeyValuePairExtractor.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index d811f5c6534..21722164f20 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -40,7 +40,7 @@ struct KeyValuePairExtractor virtual Response extract(const std::string & data) = 0; - virtual Response extract(const std::string_view & data) = 0; + virtual Response extract(std::string_view data) = 0; }; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp new file mode 100644 index 00000000000..46fcd7369c5 --- /dev/null +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -0,0 +1,38 @@ +#include "KeyValuePairExtractorBuilder.h" + +namespace DB +{ + +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) +{ + key_value_pair_delimiter = key_value_pair_delimiter_; + return *this; +} + +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEscapeCharacter(char escape_character_) +{ + escape_character = escape_character_; + return *this; +} + +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(char item_delimiter_) +{ + item_delimiter = item_delimiter_; + return *this; +} + +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharacter(std::optional enclosing_character_) +{ + enclosing_character = enclosing_character_; + return *this; +} + +std::shared_ptr>> KeyValuePairExtractorBuilder::build() +{ + InlineEscapingKeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); + InlineEscapingValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character); + + return std::make_shared(key_state_handler, value_state_handler); +} + +} diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 9c3e61e4903..1c054225d93 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -1,14 +1,9 @@ #pragma once -#include -#include #include -#include -#include -#include -#include #include "KeyValuePairExtractor.h" -#include +#include +#include namespace DB { @@ -18,59 +13,19 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -template > class KeyValuePairExtractorBuilder { public: - KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_) - { - key_value_pair_delimiter = key_value_pair_delimiter_; - return *this; - } - KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_) - { - escape_character = escape_character_; - return *this; - } + KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); - KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_) - { - item_delimiter = item_delimiter_; - return *this; - } + KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_); - KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_) - { - enclosing_character = enclosing_character_; - return *this; - } + KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_); - KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) - { - value_special_character_allowlist = std::move(value_special_character_allowlist_); - return *this; - } + KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_); - template - KeyValuePairExtractorBuilder & withEscapingProcessor() - { - escaping_processor = std::make_shared(escape_character); - return *this; - } - - std::shared_ptr> build() - { - KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); - ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); - - if (!escaping_processor) - { - throw Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); - } - - return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); - } + std::shared_ptr>> build(); private: char key_value_pair_delimiter = ':'; @@ -78,7 +33,6 @@ private: char item_delimiter = ','; std::optional enclosing_character; std::unordered_set value_special_character_allowlist; - std::shared_ptr> escaping_processor; }; } diff --git a/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h new file mode 100644 index 00000000000..0ea9f3b9c28 --- /dev/null +++ b/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include "KeyValuePairExtractor.h" +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +template > +class StaleKeyValuePairExtractorBuilder +{ +public: + StaleKeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_) + { + key_value_pair_delimiter = key_value_pair_delimiter_; + return *this; + } + + StaleKeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_) + { + escape_character = escape_character_; + return *this; + } + + StaleKeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_) + { + item_delimiter = item_delimiter_; + return *this; + } + + StaleKeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_) + { + enclosing_character = enclosing_character_; + return *this; + } + + StaleKeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) + { + value_special_character_allowlist = std::move(value_special_character_allowlist_); + return *this; + } + + template + StaleKeyValuePairExtractorBuilder & withEscapingProcessor() + { + escaping_processor = std::make_shared(escape_character); + return *this; + } + + std::shared_ptr> build() + { + KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); + ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); + + if (!escaping_processor) + { + throw Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); + } + + return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); + } + +private: + char key_value_pair_delimiter = ':'; + char escape_character = '\\'; + char item_delimiter = ','; + std::optional enclosing_character; + std::unordered_set value_special_character_allowlist; + std::shared_ptr> escaping_processor; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp new file mode 100644 index 00000000000..7c577980d68 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp @@ -0,0 +1,78 @@ +#include "CHKeyValuePairExtractor.h" +#include "state/State.h" +#include + +namespace DB +{ + +CHKeyValuePairExtractor::CHKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, InlineEscapingValueStateHandler value_state_handler_) + : key_state_handler(std::move(key_state_handler_)), value_state_handler(std::move(value_state_handler_)) +{} + +uint64_t CHKeyValuePairExtractor::extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) +{ + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + std::string key; + std::string value; + uint64_t row_offset = 0; + + while (state != State::END) + { + auto next_state = processState(data, pos, state, key, value, keys, values, row_offset); + + pos = next_state.position_in_string; + state = next_state.state; + } + + return row_offset; +} + +NextState CHKeyValuePairExtractor::processState(std::string_view file, std::size_t pos, State state, + std::string & key, std::string & value, ColumnString::MutablePtr & keys, + ColumnString::MutablePtr & values, uint64_t & row_offset) +{ + switch (state) + { + case State::WAITING_KEY: + return key_state_handler.wait(file, pos); + case State::READING_KEY: + return key_state_handler.read(file, pos, key); + case State::READING_ENCLOSED_KEY: + return key_state_handler.readEnclosed(file, pos, key); + case State::READING_KV_DELIMITER: + return key_state_handler.readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return value_state_handler.wait(file, pos); + case State::READING_VALUE: + return value_state_handler.read(file, pos, value); + case State::READING_ENCLOSED_VALUE: + return value_state_handler.readEnclosed(file, pos, value); + case State::READING_EMPTY_VALUE: + return value_state_handler.readEmpty(file, pos, value); + case State::FLUSH_PAIR: + return flushPair(file, pos, key, value, keys, values, row_offset); + case END: + return {pos, state}; + } +} + +NextState CHKeyValuePairExtractor::flushPair(const std::string_view & file, std::size_t pos, std::string & key, + std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, + uint64_t & row_offset) +{ + keys->insert(std::move(key)); + values->insert(std::move(value)); + + key = {}; + value = {}; + + row_offset++; + + return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; +} + +} + diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h new file mode 100644 index 00000000000..20212f00e06 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include "state/InlineEscapingKeyStateHandler.h" +#include "state/InlineEscapingValueStateHandler.h" + + +namespace DB +{ + +class CHKeyValuePairExtractor +{ +public: + using Response = ColumnMap::Ptr; + + CHKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, InlineEscapingValueStateHandler value_state_handler_); + + uint64_t extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values); + +private: + + NextState processState(std::string_view file, std::size_t pos, State state, std::string & key, + std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset); + + static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, + std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset); + + InlineEscapingKeyStateHandler key_state_handler; + InlineEscapingValueStateHandler value_state_handler; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp new file mode 100644 index 00000000000..a454f03243e --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp @@ -0,0 +1,77 @@ +#include "InlineKeyValuePairExtractor.h" + +namespace DB +{ + +InlineKeyValuePairExtractor::InlineKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, + InlineEscapingValueStateHandler value_state_handler_) + : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_) {} + +InlineKeyValuePairExtractor::Response InlineKeyValuePairExtractor::extract(const std::string & data) +{ + auto view = std::string_view {data.begin(), data.end()}; + return extract(view); +} + +InlineKeyValuePairExtractor::Response InlineKeyValuePairExtractor::extract(std::string_view data) +{ + InlineKeyValuePairExtractor::Response response; + + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + std::string key; + std::string value; + + while (state != State::END) + { + auto next_state = processState(data, pos, state, key, value, response); + + pos = next_state.position_in_string; + state = next_state.state; + } + + return response; +} + +NextState InlineKeyValuePairExtractor::processState(std::string_view file, std::size_t pos, State state, + std::string & key, std::string & value, Response & response) +{ + switch (state) + { + case State::WAITING_KEY: + return key_state_handler.wait(file, pos); + case State::READING_KEY: + return key_state_handler.read(file, pos, key); + case State::READING_ENCLOSED_KEY: + return key_state_handler.readEnclosed(file, pos, key); + case State::READING_KV_DELIMITER: + return key_state_handler.readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return value_state_handler.wait(file, pos); + case State::READING_VALUE: + return value_state_handler.read(file, pos, value); + case State::READING_ENCLOSED_VALUE: + return value_state_handler.readEnclosed(file, pos, value); + case State::READING_EMPTY_VALUE: + return value_state_handler.readEmpty(file, pos, value); + case State::FLUSH_PAIR: + return flushPair(file, pos, key, value, response); + case END: + return {pos, state}; + } +} + +NextState InlineKeyValuePairExtractor::flushPair(const std::string_view & file, std::size_t pos, + std::string & key, std::string & value, Response & response) +{ + response[std::move(key)] = std::move(value); + + key.clear(); + value.clear(); + + return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h new file mode 100644 index 00000000000..065f2553bad --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include "state/InlineEscapingKeyStateHandler.h" +#include "state/InlineEscapingValueStateHandler.h" +#include "state/State.h" + +namespace DB +{ + +class InlineKeyValuePairExtractor : public KeyValuePairExtractor> +{ +public: + InlineKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler, InlineEscapingValueStateHandler value_state_handler); + + Response extract(const std::string & data) override; + + Response extract(std::string_view data) override; + +private: + NextState processState(std::string_view file, std::size_t pos, State state, + std::string & key, std::string & value, Response & response); + + static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, + std::string & value, Response & response); + + InlineEscapingKeyStateHandler key_state_handler; + InlineEscapingValueStateHandler value_state_handler; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h index d65ded8c3b0..15783822ba1 100644 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h @@ -38,7 +38,7 @@ public: return extract(view); } - [[nodiscard]] Response extract(const std::string_view & file) override + [[nodiscard]] Response extract(std::string_view file) override { std::unordered_map response_views; diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp new file mode 100644 index 00000000000..2117a08a77a --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp @@ -0,0 +1,107 @@ +#include "InlineEscapingKeyStateHandler.h" + +namespace DB +{ + +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) +{ +} + +NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + if (isalnum(current_character) || current_character == escape_character) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + else + { + pos++; + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, Key & key) const +{ + bool escape = false; + + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + if (escape) + { + key.push_back(current_character); + escape = false; + } + else if (escape_character == current_character) + { + escape = true; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_VALUE}; + } + else if (!std::isalnum(current_character) && current_character != '_') + { + return {pos, State::WAITING_KEY}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, Key & key) +{ + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (*enclosing_character == current_character) + { + if (key.empty()) + { + return {pos, State::WAITING_KEY}; + } + + return {pos, State::READING_KV_DELIMITER}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const +{ + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h new file mode 100644 index 00000000000..06f27ea6ee5 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include "State.h" +#include "StateHandler.h" + +namespace DB +{ + +class InlineEscapingKeyStateHandler : public StateHandler +{ +public: + using Key = std::string; + InlineEscapingKeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) ; + [[nodiscard]] NextState read(std::string_view file, size_t pos, Key & key) const; + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Key & key); + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; + +private: + [[maybe_unused]] const char key_value_delimiter; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp new file mode 100644 index 00000000000..f50709d8000 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp @@ -0,0 +1,104 @@ +#include "InlineEscapingValueStateHandler.h" + +namespace DB +{ + +InlineEscapingValueStateHandler::InlineEscapingValueStateHandler( + char escape_character_, + char item_delimiter_, + std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_) + , item_delimiter(item_delimiter_) +{ +} + +NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + else if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { + pos++; + } + } + + return {pos, State::READING_EMPTY_VALUE}; +} + +NextState InlineEscapingValueStateHandler::read(const std::string_view file, size_t pos, Value & value) +{ + bool escape = false; + + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + if (escape) + { + escape = false; + value.push_back(current_character); + } + else if (escape_character == current_character) + { + escape = true; + } + else if (current_character == item_delimiter || !isValidCharacter(current_character)) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::FLUSH_PAIR}; +} + +NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, Value & value) +{ + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + if (enclosing_character == current_character) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, Value & value) +{ + value.clear(); + return {pos + 1, State::FLUSH_PAIR}; +} + +bool InlineEscapingValueStateHandler::isValidCharacter(char character) const +{ + return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_' || character == '.' || character == escape_character; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h new file mode 100644 index 00000000000..92e102c51d1 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include "State.h" +#include "StateHandler.h" + +namespace DB +{ + +class InlineEscapingValueStateHandler : public StateHandler +{ + using Value = std::string; + +public: + InlineEscapingValueStateHandler( + char escape_character, + char item_delimiter, + std::optional enclosing_character); + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState read(std::string_view file, size_t pos, Value & value); + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Value & value); + [[nodiscard]] static NextState readEmpty(std::string_view file, size_t pos, Value & value); + +private: + const char item_delimiter; + + bool isValidCharacter(char character) const; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp index 8b68f813293..f22f5504829 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp @@ -17,7 +17,7 @@ NextState KeyStateHandler::wait(std::string_view file, size_t pos) { return {pos, State::READING_KEY}; } - else if (current_character == '"') + else if (enclosing_character && current_character == enclosing_character) { return {pos + 1u, State::READING_ENCLOSED_KEY}; } @@ -45,11 +45,11 @@ NextState KeyStateHandler::read(std::string_view file, size_t pos, std::string_v { escape = false; } - else if ('\\' == current_character) + else if (escape_character == current_character) { escape = true; } - else if (current_character == '=') + else if (current_character == key_value_delimiter) { // not checking for empty key because with current waitKey implementation // there is no way this piece of code will be reached for the very first key character @@ -74,7 +74,7 @@ NextState KeyStateHandler::readEnclosed(std::string_view file, size_t pos, std:: { const auto current_character = file[pos++]; - if ('"' == current_character) + if (enclosing_character && enclosing_character == current_character) { auto is_key_empty = start_index == pos; @@ -91,7 +91,7 @@ NextState KeyStateHandler::readEnclosed(std::string_view file, size_t pos, std:: return {pos, State::END}; } -NextState KeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) +NextState KeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const { if (pos == file.size()) { @@ -100,7 +100,7 @@ NextState KeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t p else { const auto current_character = file[pos++]; - return {pos, current_character == '=' ? State::WAITING_VALUE : State::WAITING_KEY}; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h index ebc2849e10c..4c18b9c50fa 100644 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h @@ -14,10 +14,10 @@ class KeyStateHandler : StateHandler public: KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); - [[nodiscard]] static NextState wait(std::string_view file, size_t pos) ; - [[nodiscard]] static NextState read(std::string_view file, size_t pos, std::string_view & key); - [[nodiscard]] static NextState readEnclosed(std::string_view file, size_t pos, std::string_view & key); - [[nodiscard]] static NextState readKeyValueDelimiter(std::string_view file, size_t pos); + [[nodiscard]] NextState wait(std::string_view file, size_t pos) ; + [[nodiscard]] NextState read(std::string_view file, size_t pos, std::string_view & key); + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, std::string_view & key); + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: [[maybe_unused]] const char key_value_delimiter; diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp index dbd3fe2d495..e4da4522c05 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp @@ -98,7 +98,7 @@ NextState ValueStateHandler::readEmpty(std::string_view, size_t pos, std::string return {pos + 1, State::FLUSH_PAIR}; } -bool ValueStateHandler::isValidCharacter(char character) const +bool ValueStateHandler::isValidCharacter(char character) { return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_'; } diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h index 0dc610f01ec..07f89fc054c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h @@ -27,7 +27,7 @@ private: const char item_delimiter; [[maybe_unused]] std::unordered_set special_character_allowlist; - bool isValidCharacter(char character) const; + static bool isValidCharacter(char character); }; } diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index aa956d4e680..d33ae680b3b 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB @@ -40,8 +40,7 @@ INSTANTIATE_TEST_SUITE_P( "age", "" } - }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() + }, StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() }, { "name: neymar, favorite_movie:,favorite_song:", @@ -50,7 +49,7 @@ INSTANTIATE_TEST_SUITE_P( {"favorite_movie", ""}, {"favorite_song", ""}, }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() + StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() } })); @@ -77,7 +76,7 @@ INSTANTIATE_TEST_SUITE_P( "team", "psg" } }, - KeyValuePairExtractorBuilder() + StaleKeyValuePairExtractorBuilder() .withEscapingProcessor() .withValueSpecialCharacterAllowList({'.'}) .build() @@ -90,7 +89,7 @@ INSTANTIATE_TEST_SUITE_P( "F" } }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() + StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() }, })); @@ -105,7 +104,7 @@ INSTANTIATE_TEST_SUITE_P( "age", "30" } }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build() + StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() }, { "na$me,: neymar, age:30", @@ -114,7 +113,7 @@ INSTANTIATE_TEST_SUITE_P( "age", "30" } }, - KeyValuePairExtractorBuilder().withEscapingProcessor().build()}, + StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build()}, { R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", { @@ -128,7 +127,7 @@ INSTANTIATE_TEST_SUITE_P( "age", "30" } }, - KeyValuePairExtractorBuilder() + StaleKeyValuePairExtractorBuilder() .withEscapingProcessor() .withEnclosingCharacter('"') .build() @@ -157,7 +156,7 @@ INSTANTIATE_TEST_SUITE_P( "height", "1.75" } }, - KeyValuePairExtractorBuilder() + StaleKeyValuePairExtractorBuilder() .withEscapingProcessor() .withValueSpecialCharacterAllowList({'.'}) .withEnclosingCharacter('"') diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 02280ba61af..c4855c6fd51 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -65,6 +65,20 @@ WITH SELECT x; {'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} + +-- Expected output: {'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\\ optimization\\\ is\\\ the\\\ root of all evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} + WITH extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.') AS s_map, CAST( @@ -101,4 +115,4 @@ WITH ) AS x SELECT x; -{'some_key':'@dolla%sign$'} +{'some_key':'dolla'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index fe036a4aae8..f4eb8658f6d 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -51,6 +51,18 @@ WITH SELECT x; +-- Expected output: {'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature\\\ optimization\\\ is\\\ the\\\ root of all evil, age:30', '\\', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + ----- Mix Strings ----- -- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} From bcacbc1cc69ef15d77d41e204fdc3c7286891c93 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 20 Jan 2023 13:05:00 -0300 Subject: [PATCH 047/535] partially fix tests --- .../src/KeyValuePairEscapingProcessor.h | 18 - .../src/KeyValuePairExtractorBuilder.h | 1 - .../src/StaleKeyValuePairExtractorBuilder.h | 85 ----- .../impl/LazyEscapingKeyValuePairExtractor.h | 106 ------ .../SimpleKeyValuePairEscapingProcessor.cpp | 50 --- .../SimpleKeyValuePairEscapingProcessor.h | 24 -- .../src/impl/state/KeyStateHandler.cpp | 107 ------ .../src/impl/state/KeyStateHandler.h | 26 -- .../src/impl/state/ValueStateHandler.cpp | 106 ------ .../src/impl/state/ValueStateHandler.h | 33 -- .../tests/gtest_key_value_pair_extractor.cpp | 334 +++++++++--------- ...t_key_value_pairs_multiple_input.reference | 53 +-- ...extract_key_value_pairs_multiple_input.sql | 41 +-- 13 files changed, 200 insertions(+), 784 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h delete mode 100644 src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h delete mode 100644 src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h delete mode 100644 src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h diff --git a/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h deleted file mode 100644 index b2a569cd30c..00000000000 --- a/src/Functions/keyvaluepair/src/KeyValuePairEscapingProcessor.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -namespace DB -{ - -template -struct KeyValuePairEscapingProcessor -{ - using Response = R; - using ResponseViews = std::unordered_map; - - KeyValuePairEscapingProcessor() = default; - virtual ~KeyValuePairEscapingProcessor() = default; - - virtual Response process(const ResponseViews &) const = 0; -}; - -} diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 1c054225d93..423aeca8809 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -3,7 +3,6 @@ #include #include "KeyValuePairExtractor.h" #include -#include namespace DB { diff --git a/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h deleted file mode 100644 index 0ea9f3b9c28..00000000000 --- a/src/Functions/keyvaluepair/src/StaleKeyValuePairExtractorBuilder.h +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include "KeyValuePairExtractor.h" -#include - -namespace DB -{ - -namespace ErrorCodes -{ - extern const int LOGICAL_ERROR; -} - -template > -class StaleKeyValuePairExtractorBuilder -{ -public: - StaleKeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_) - { - key_value_pair_delimiter = key_value_pair_delimiter_; - return *this; - } - - StaleKeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_) - { - escape_character = escape_character_; - return *this; - } - - StaleKeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_) - { - item_delimiter = item_delimiter_; - return *this; - } - - StaleKeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_) - { - enclosing_character = enclosing_character_; - return *this; - } - - StaleKeyValuePairExtractorBuilder & withValueSpecialCharacterAllowList(std::unordered_set value_special_character_allowlist_) - { - value_special_character_allowlist = std::move(value_special_character_allowlist_); - return *this; - } - - template - StaleKeyValuePairExtractorBuilder & withEscapingProcessor() - { - escaping_processor = std::make_shared(escape_character); - return *this; - } - - std::shared_ptr> build() - { - KeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); - ValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character, value_special_character_allowlist); - - if (!escaping_processor) - { - throw Exception(ErrorCodes::LOGICAL_ERROR, "Escaping processor must be set, cannot build KeyValuePairExtractor without one"); - } - - return std::make_shared>(key_state_handler, value_state_handler, escaping_processor); - } - -private: - char key_value_pair_delimiter = ':'; - char escape_character = '\\'; - char item_delimiter = ','; - std::optional enclosing_character; - std::unordered_set value_special_character_allowlist; - std::shared_ptr> escaping_processor; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h deleted file mode 100644 index 15783822ba1..00000000000 --- a/src/Functions/keyvaluepair/src/impl/LazyEscapingKeyValuePairExtractor.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace DB -{ - -/* - * Implements key value pair extraction by ignoring escaping and deferring its processing to the end. - * This strategy allows more efficient memory usage in case of very noisy files because it does not have to - * store characters while reading an element. Because of that, std::string_views can be used to store key value pairs. - * - * In the end, the unescaped key value pair views are converted into escaped key value pairs. At this stage, memory is allocated - * to store characters, but noise is no longer an issue. - * */ -template -class LazyEscapingKeyValuePairExtractor : public KeyValuePairExtractor -{ -public: - LazyEscapingKeyValuePairExtractor( - KeyStateHandler key_state_handler_, - ValueStateHandler value_state_handler_, - std::shared_ptr> escaping_processor_) - : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_), escaping_processor(escaping_processor_) - { - } - - [[nodiscard]] Response extract(const std::string & file) override - { - auto view = std::string_view {file}; - return extract(view); - } - - [[nodiscard]] Response extract(std::string_view file) override - { - std::unordered_map response_views; - - auto state = State::WAITING_KEY; - - std::size_t pos = 0; - - std::string_view key; - std::string_view value; - - while (state != State::END) - { - auto next_state = processState(file, pos, state, key, value, response_views); - - pos = next_state.position_in_string; - state = next_state.state; - } - - return escaping_processor->process(response_views); - } - -private: - NextState processState(std::string_view file, std::size_t pos, State state, - std::string_view & key, std::string_view & value, - std::unordered_map & response_views) - { - switch (state) - { - case State::WAITING_KEY: - return key_state_handler.wait(file, pos); - case State::READING_KEY: - return key_state_handler.read(file, pos, key); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos, key); - case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); - case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); - case State::READING_VALUE: - return value_state_handler.read(file, pos, value); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos, value); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos, value); - case State::FLUSH_PAIR: - return flushPair(file, pos, key, value, response_views); - case END: - return {pos, state}; - } - } - - NextState flushPair(const std::string_view & file, std::size_t pos, std::string_view key, - std::string_view value, std::unordered_map & response_views) - { - response_views[key] = value; - - return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; - } - - KeyStateHandler key_state_handler; - ValueStateHandler value_state_handler; - std::shared_ptr> escaping_processor; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp deleted file mode 100644 index 7460c557c21..00000000000 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "SimpleKeyValuePairEscapingProcessor.h" - -namespace DB -{ - -SimpleKeyValuePairEscapingProcessor::SimpleKeyValuePairEscapingProcessor(char escape_character_) - : escape_character(escape_character_) -{ -} - -SimpleKeyValuePairEscapingProcessor::Response SimpleKeyValuePairEscapingProcessor::process(const ResponseViews & response_views) const -{ - Response response; - - response.reserve(response_views.size()); - - for (auto [key_view, value_view] : response_views) - { - response[escape(key_view)] = escape(value_view); - } - - return response; -} - -std::string SimpleKeyValuePairEscapingProcessor::escape(std::string_view element_view) const -{ - bool escape = false; - std::string element; - - element.reserve(element_view.size()); - - for (char character : element_view) - { - if (escape) - { - escape = false; - } - else if (character == escape_character) - { - escape = true; - continue; - } - - element.push_back(character); - } - - return element; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h b/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h deleted file mode 100644 index 92526153a3d..00000000000 --- a/src/Functions/keyvaluepair/src/impl/SimpleKeyValuePairEscapingProcessor.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include - -#include "../KeyValuePairEscapingProcessor.h" - -namespace DB -{ - -class SimpleKeyValuePairEscapingProcessor : public KeyValuePairEscapingProcessor> -{ -public: - explicit SimpleKeyValuePairEscapingProcessor(char escape_character); - - [[nodiscard]] Response process(const ResponseViews & response_views) const override; - -private: - [[maybe_unused]] const char escape_character; - - [[nodiscard]] std::string escape(std::string_view element_view) const; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp deleted file mode 100644 index f22f5504829..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "KeyStateHandler.h" - -namespace DB -{ - -KeyStateHandler::KeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) -{ -} - -NextState KeyStateHandler::wait(std::string_view file, size_t pos) -{ - while (pos < file.size()) - { - const auto current_character = file[pos]; - if (isalnum(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } - else - { - pos++; - } - } - - return {pos, State::END}; -} - -NextState KeyStateHandler::read(std::string_view file, size_t pos, std::string_view & key) -{ - bool escape = false; - - auto start_index = pos; - - key = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (escape) - { - escape = false; - } - else if (escape_character == current_character) - { - escape = true; - } - else if (current_character == key_value_delimiter) - { - // not checking for empty key because with current waitKey implementation - // there is no way this piece of code will be reached for the very first key character - key = createElement(file, start_index, pos - 1); - return {pos, State::WAITING_VALUE}; - } - else if (!std::isalnum(current_character) && current_character != '_') - { - return {pos, State::WAITING_KEY}; - } - } - - return {pos, State::END}; -} - -NextState KeyStateHandler::readEnclosed(std::string_view file, size_t pos, std::string_view & key) -{ - auto start_index = pos; - key = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (enclosing_character && enclosing_character == current_character) - { - auto is_key_empty = start_index == pos; - - if (is_key_empty) - { - return {pos, State::WAITING_KEY}; - } - - key = createElement(file, start_index, pos - 1); - return {pos, State::READING_KV_DELIMITER}; - } - } - - return {pos, State::END}; -} - -NextState KeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const -{ - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h deleted file mode 100644 index 4c18b9c50fa..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/KeyStateHandler.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include - -#include "State.h" -#include "StateHandler.h" - -namespace DB -{ - -class KeyStateHandler : StateHandler -{ -public: - KeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); - - [[nodiscard]] NextState wait(std::string_view file, size_t pos) ; - [[nodiscard]] NextState read(std::string_view file, size_t pos, std::string_view & key); - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, std::string_view & key); - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; - -private: - [[maybe_unused]] const char key_value_delimiter; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp deleted file mode 100644 index e4da4522c05..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "ValueStateHandler.h" - -namespace DB -{ - -ValueStateHandler::ValueStateHandler( - char escape_character_, - char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(escape_character_, enclosing_character_) - , item_delimiter(item_delimiter_) - , special_character_allowlist(std::move(special_character_allowlist_)) -{ -} - -NextState ValueStateHandler::wait(std::string_view file, size_t pos) const -{ - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } - else if (current_character == item_delimiter) - { - return {pos, State::READING_EMPTY_VALUE}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_VALUE}; - } - else - { - pos++; - } - } - - return {pos, State::READING_EMPTY_VALUE}; -} - -NextState ValueStateHandler::read(const std::string_view file, size_t pos, std::string_view & value) -{ - bool escape = false; - - auto start_index = pos; - - value = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (escape) - { - escape = false; - } - else if (escape_character == current_character) - { - escape = true; - } - else if (current_character == item_delimiter || !isValidCharacter(current_character)) - { - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; - } - } - - // TODO: do I really need the below logic? - // this allows empty values at the end - value = createElement(file, start_index, pos); - return {pos, State::FLUSH_PAIR}; -} - -NextState ValueStateHandler::readEnclosed(std::string_view file, size_t pos, std::string_view & value) -{ - auto start_index = pos; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (enclosing_character == current_character) - { - // not checking for empty value because with current waitValue implementation - // there is no way this piece of code will be reached for the very first value character - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; - } - } - - return {pos, State::END}; -} - -NextState ValueStateHandler::readEmpty(std::string_view, size_t pos, std::string_view & value) -{ - value = {}; - return {pos + 1, State::FLUSH_PAIR}; -} - -bool ValueStateHandler::isValidCharacter(char character) -{ - return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_'; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h deleted file mode 100644 index 07f89fc054c..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/ValueStateHandler.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include -#include "State.h" -#include "StateHandler.h" - -namespace DB -{ - -class ValueStateHandler : StateHandler -{ -public: - ValueStateHandler( - char escape_character, - char item_delimiter, - std::optional enclosing_character, - std::unordered_set special_character_allowlist_); - - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, std::string_view & value); - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, std::string_view & value); - [[nodiscard]] static NextState readEmpty(std::string_view file, size_t pos, std::string_view & value); - -private: - const char item_delimiter; - [[maybe_unused]] std::unordered_set special_character_allowlist; - - static bool isValidCharacter(char character); -}; - -} diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index d33ae680b3b..6bd85ced29c 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -1,167 +1,167 @@ -#include -#include - -namespace DB -{ - -struct LazyKeyValuePairExtractorTestCase -{ - std::string input; - std::unordered_map expected_output; - std::shared_ptr> extractor; -}; - -std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) -{ - return ostr << test_case.input; -} - -struct KeyValuePairExtractorTest : public ::testing::TestWithParam -{ -}; - -TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) -{ - const auto & [input, expected_output, extractor] = GetParam(); - - auto result = extractor->extract(input); - - EXPECT_EQ(result, expected_output); -} - -INSTANTIATE_TEST_SUITE_P( - ValuesCanBeEmptyString, - KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list{ - { - "age:", - { - { - "age", - "" - } - }, StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - { - "name: neymar, favorite_movie:,favorite_song:", - { - {"name", "neymar"}, - {"favorite_movie", ""}, - {"favorite_song", ""}, - }, - StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() - } - })); - -INSTANTIATE_TEST_SUITE_P( - MixString, - KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list{ - { - R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", - { - { - R"(no:me)", "neymar" - }, - { - "age", "30" - }, - { - "height", "1.75" - }, - { - "school", "lupe picasso" - }, - { - "team", "psg" - } - }, - StaleKeyValuePairExtractorBuilder() - .withEscapingProcessor() - .withValueSpecialCharacterAllowList({'.'}) - .build() - }, - { - "XNFHGSSF_RHRUZHVBS_KWBT: F,", - { - { - "XNFHGSSF_RHRUZHVBS_KWBT", - "F" - } - }, - StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - })); - -INSTANTIATE_TEST_SUITE_P( - Escaping, - KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list{ - { - "na,me,: neymar, age:30", - { - { - "age", "30" - } - }, - StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() - }, - { - "na$me,: neymar, age:30", - { - { - "age", "30" - } - }, - StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build()}, - { - R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", - { - { - "name", "neymar" - }, - { - "favorite_quote", R"(Premature optimization is the r$$t of all evil)" - }, - { - "age", "30" - } - }, - StaleKeyValuePairExtractorBuilder() - .withEscapingProcessor() - .withEnclosingCharacter('"') - .build() - }})); - -INSTANTIATE_TEST_SUITE_P( - EnclosedElements, - KeyValuePairExtractorTest, - ::testing::ValuesIn(std::initializer_list{ - { - R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", - { - { - "name", "Neymar" - }, - { - "age", "30" - }, - { - "team", "psg" - }, - { - "favorite_movie", "" - }, - { - "height", "1.75" - } - }, - StaleKeyValuePairExtractorBuilder() - .withEscapingProcessor() - .withValueSpecialCharacterAllowList({'.'}) - .withEnclosingCharacter('"') - .build() - } - })); - -} +//#include +//#include +// +//namespace DB +//{ +// +//struct LazyKeyValuePairExtractorTestCase +//{ +// std::string input; +// std::unordered_map expected_output; +// std::shared_ptr> extractor; +//}; +// +//std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) +//{ +// return ostr << test_case.input; +//} +// +//struct KeyValuePairExtractorTest : public ::testing::TestWithParam +//{ +//}; +// +//TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) +//{ +// const auto & [input, expected_output, extractor] = GetParam(); +// +// auto result = extractor->extract(input); +// +// EXPECT_EQ(result, expected_output); +//} +// +//INSTANTIATE_TEST_SUITE_P( +// ValuesCanBeEmptyString, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// "age:", +// { +// { +// "age", +// "" +// } +// }, StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() +// }, +// { +// "name: neymar, favorite_movie:,favorite_song:", +// { +// {"name", "neymar"}, +// {"favorite_movie", ""}, +// {"favorite_song", ""}, +// }, +// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() +// } +// })); +// +//INSTANTIATE_TEST_SUITE_P( +// MixString, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", +// { +// { +// R"(no:me)", "neymar" +// }, +// { +// "age", "30" +// }, +// { +// "height", "1.75" +// }, +// { +// "school", "lupe picasso" +// }, +// { +// "team", "psg" +// } +// }, +// StaleKeyValuePairExtractorBuilder() +// .withEscapingProcessor() +// .withValueSpecialCharacterAllowList({'.'}) +// .build() +// }, +// { +// "XNFHGSSF_RHRUZHVBS_KWBT: F,", +// { +// { +// "XNFHGSSF_RHRUZHVBS_KWBT", +// "F" +// } +// }, +// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() +// }, +// })); +// +//INSTANTIATE_TEST_SUITE_P( +// Escaping, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// "na,me,: neymar, age:30", +// { +// { +// "age", "30" +// } +// }, +// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() +// }, +// { +// "na$me,: neymar, age:30", +// { +// { +// "age", "30" +// } +// }, +// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build()}, +// { +// R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", +// { +// { +// "name", "neymar" +// }, +// { +// "favorite_quote", R"(Premature optimization is the r$$t of all evil)" +// }, +// { +// "age", "30" +// } +// }, +// StaleKeyValuePairExtractorBuilder() +// .withEscapingProcessor() +// .withEnclosingCharacter('"') +// .build() +// }})); +// +//INSTANTIATE_TEST_SUITE_P( +// EnclosedElements, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", +// { +// { +// "name", "Neymar" +// }, +// { +// "age", "30" +// }, +// { +// "team", "psg" +// }, +// { +// "favorite_movie", "" +// }, +// { +// "height", "1.75" +// } +// }, +// StaleKeyValuePairExtractorBuilder() +// .withEscapingProcessor() +// .withValueSpecialCharacterAllowList({'.'}) +// .withEnclosingCharacter('"') +// .build() +// } +// })); +// +//} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index c4855c6fd51..7ff49070cef 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -3,7 +3,7 @@ -- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} WITH - extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '!', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -17,7 +17,7 @@ SELECT -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('na,me,: neymar, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -29,7 +29,7 @@ SELECT {'age':'30'} -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('na$me,: neymar, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -41,7 +41,7 @@ SELECT {'age':'30'} -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -51,36 +51,21 @@ WITH SELECT x; {'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} +-- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the root of all evi','age':'30'} +WITH + extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', '!', ':', ',', '"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'30','favorite_quote':'Premature!','name':'neymar'} ----- Mix Strings ----- - --- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} - --- Expected output: {'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} -WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\\ optimization\\\ is\\\ the\\\ root of all evil, age:30', '\\', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} - -WITH - extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', '!', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -92,7 +77,7 @@ SELECT {'age':'30','height':'1.75','na:me':'neymar','school':'lupe picasso','team':'psg'} -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} WITH - extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -106,7 +91,7 @@ SELECT -- Expected output: {'some_key':'@dolla%sign$'} WITH - extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%') AS s_map, + extractKeyValuePairs('some_key: @dolla%sign$,', '!', ':', ',', '"', '$@%') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index f4eb8658f6d..51348f1837d 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -3,7 +3,7 @@ -- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} WITH - extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '\\', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '!', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -17,7 +17,7 @@ SELECT -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na,me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('na,me,: neymar, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -29,7 +29,7 @@ SELECT -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na$me,: neymar, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('na$me,: neymar, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -41,7 +41,7 @@ SELECT -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -51,34 +51,21 @@ WITH SELECT x; --- Expected output: {'name':'neymar','favorite_quote':'Premature\ optimization\ is\ the\ root of all evi','age':'30'} +-- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the root of all evi','age':'30'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\\ optimization\\\ is\\\ the\\\ root of all evil, age:30', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', '!', ':', ',', '"') AS s_map, CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x SELECT x; ----- Mix Strings ----- - --- Expected output: {'na:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature\\ optimization\\ is\\ the\\ r\\$\\$t\\ of\\ all\\ evil, age:30', '\\', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; - -WITH - extractKeyValuePairs('9 ads =nm, na\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', '!', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -90,7 +77,7 @@ SELECT -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} WITH - extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '\\', ':', ',', '"') AS s_map, + extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '!', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -104,7 +91,7 @@ SELECT -- Expected output: {'some_key':'@dolla%sign$'} WITH - extractKeyValuePairs('some_key: @dolla%sign$,', '\\', ':', ',', '"', '$@%') AS s_map, + extractKeyValuePairs('some_key: @dolla%sign$,', '!', ':', ',', '"', '$@%') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) From 21b6b37272b472bdba2398c2862775249a2c1fc6 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 23 Jan 2023 08:58:49 -0300 Subject: [PATCH 048/535] well wlel, context switching --- src/Functions/extractKeyValuePairs.cpp | 48 +------ src/Functions/extractKeyValuePairs.h | 7 - src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../src/KeyValuePairExtractorBuilder.cpp | 10 +- .../src/impl/CHKeyValuePairExtractor.cpp | 78 ----------- .../src/impl/CHKeyValuePairExtractor.h | 70 +++++++++- .../src/impl/InlineKeyValuePairExtractor.cpp | 77 ---------- .../src/impl/InlineKeyValuePairExtractor.h | 73 +++++++++- .../state/InlineEscapingKeyStateHandler.cpp | 107 -------------- .../state/InlineEscapingKeyStateHandler.h | 132 +++++++++++++++++- .../state/InlineEscapingValueStateHandler.cpp | 104 -------------- .../state/InlineEscapingValueStateHandler.h | 128 +++++++++++++++-- .../src/impl/state/StateHandler.h | 12 ++ 13 files changed, 403 insertions(+), 445 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 10f313e6092..bf9ad239b79 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -41,8 +41,12 @@ ColumnPtr ExtractKeyValuePairs::chInline( CharArgument enclosing_character, SetArgument) { - InlineEscapingKeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, *enclosing_character); - InlineEscapingValueStateHandler value_state_handler(*escape_character, *item_delimiter, *enclosing_character); + using ValueStateHandler = InlineEscapingValueStateHandler; + using KeyStateHandler = InlineEscapingKeyStateHandler; + + KeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, *enclosing_character); + + ValueStateHandler value_state_handler(*escape_character, *item_delimiter, *enclosing_character); CHKeyValuePairExtractor ch_extractor(key_state_handler, value_state_handler); auto offsets = ColumnUInt64::create(); @@ -246,46 +250,6 @@ std::shared_ptr>> ExtractKeyValuePairs::getExtractor2( - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - SetArgument) -{ - InlineEscapingKeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, enclosing_character); - InlineEscapingValueStateHandler value_state_handler(*escape_character, *item_delimiter, enclosing_character); - - return std::make_shared(key_state_handler, value_state_handler); -// auto builder = KeyValuePairExtractorBuilder(); -// -// if (escape_character) -// { -// builder.withEscapeCharacter(escape_character.value()); -// } -// -// if (key_value_pair_delimiter) -// { -// builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); -// } -// -// if (item_delimiter) -// { -// builder.withItemDelimiter(item_delimiter.value()); -// } -// -// if (enclosing_character) -// { -// builder.withEnclosingCharacter(enclosing_character.value()); -// } -// -// builder.withEscapingProcessor(); -// -// builder.withValueSpecialCharacterAllowList(value_special_characters_allow_list); -// -// return builder.build(); -} - ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) { using std::chrono::high_resolution_clock; diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 19291889a6b..003bc71060f 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -70,13 +70,6 @@ private: CharArgument item_delimiter, CharArgument enclosing_character); - static std::shared_ptr>> getExtractor2( - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - SetArgument value_special_characters_allow_list); - static RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column); static ColumnPtr escape(RawColumns & raw_columns, char escape_character); diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index f5381edb3b2..72ecd1bc39a 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -3,6 +3,6 @@ add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.cpp impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.cpp impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.cpp impl/state/InlineEscapingValueStateHandler.h impl/InlineKeyValuePairExtractor.cpp impl/InlineKeyValuePairExtractor.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h impl/InlineKeyValuePairExtractor.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 46fcd7369c5..ce506efbd5a 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -29,10 +29,14 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharac std::shared_ptr>> KeyValuePairExtractorBuilder::build() { - InlineEscapingKeyStateHandler key_state_handler(key_value_pair_delimiter, escape_character, enclosing_character); - InlineEscapingValueStateHandler value_state_handler(escape_character, item_delimiter, enclosing_character); + using KeyStateHandler = InlineEscapingKeyStateHandler; + using ValueStateHandler = InlineEscapingValueStateHandler; - return std::make_shared(key_state_handler, value_state_handler); + CInlineEscapingKeyStateHandler auto key_state_handler = KeyStateHandler(key_value_pair_delimiter, escape_character, enclosing_character); + + CInlineEscapingValueStateHandler auto value_state_handler = ValueStateHandler(escape_character, item_delimiter, enclosing_character); + + return std::make_shared>(key_state_handler, value_state_handler); } } diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp deleted file mode 100644 index 7c577980d68..00000000000 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "CHKeyValuePairExtractor.h" -#include "state/State.h" -#include - -namespace DB -{ - -CHKeyValuePairExtractor::CHKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, InlineEscapingValueStateHandler value_state_handler_) - : key_state_handler(std::move(key_state_handler_)), value_state_handler(std::move(value_state_handler_)) -{} - -uint64_t CHKeyValuePairExtractor::extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) -{ - auto state = State::WAITING_KEY; - - std::size_t pos = 0; - - std::string key; - std::string value; - uint64_t row_offset = 0; - - while (state != State::END) - { - auto next_state = processState(data, pos, state, key, value, keys, values, row_offset); - - pos = next_state.position_in_string; - state = next_state.state; - } - - return row_offset; -} - -NextState CHKeyValuePairExtractor::processState(std::string_view file, std::size_t pos, State state, - std::string & key, std::string & value, ColumnString::MutablePtr & keys, - ColumnString::MutablePtr & values, uint64_t & row_offset) -{ - switch (state) - { - case State::WAITING_KEY: - return key_state_handler.wait(file, pos); - case State::READING_KEY: - return key_state_handler.read(file, pos, key); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos, key); - case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); - case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); - case State::READING_VALUE: - return value_state_handler.read(file, pos, value); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos, value); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos, value); - case State::FLUSH_PAIR: - return flushPair(file, pos, key, value, keys, values, row_offset); - case END: - return {pos, state}; - } -} - -NextState CHKeyValuePairExtractor::flushPair(const std::string_view & file, std::size_t pos, std::string & key, - std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, - uint64_t & row_offset) -{ - keys->insert(std::move(key)); - values->insert(std::move(value)); - - key = {}; - value = {}; - - row_offset++; - - return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; -} - -} - diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index 20212f00e06..f3c9a266f74 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -10,25 +10,83 @@ namespace DB { +template class CHKeyValuePairExtractor { public: using Response = ColumnMap::Ptr; - CHKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, InlineEscapingValueStateHandler value_state_handler_); + CHKeyValuePairExtractor(InlineKeyStateHandler key_state_handler_, InlineValueStateHandler value_state_handler_) + : key_state_handler(std::move(key_state_handler_)), value_state_handler(std::move(value_state_handler_)) + {} - uint64_t extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values); + uint64_t extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) + { + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + std::string key; + std::string value; + uint64_t row_offset = 0; + + while (state != State::END) + { + auto next_state = processState(data, pos, state, key, value, keys, values, row_offset); + + pos = next_state.position_in_string; + state = next_state.state; + } + + return row_offset; + } private: NextState processState(std::string_view file, std::size_t pos, State state, std::string & key, - std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset); + std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) + { + switch (state) + { + case State::WAITING_KEY: + return key_state_handler.wait(file, pos); + case State::READING_KEY: + return key_state_handler.read(file, pos, key); + case State::READING_ENCLOSED_KEY: + return key_state_handler.readEnclosed(file, pos, key); + case State::READING_KV_DELIMITER: + return key_state_handler.readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return value_state_handler.wait(file, pos); + case State::READING_VALUE: + return value_state_handler.read(file, pos, value); + case State::READING_ENCLOSED_VALUE: + return value_state_handler.readEnclosed(file, pos, value); + case State::READING_EMPTY_VALUE: + return value_state_handler.readEmpty(file, pos, value); + case State::FLUSH_PAIR: + return flushPair(file, pos, key, value, keys, values, row_offset); + case END: + return {pos, state}; + } + } static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, - std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset); + std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) + { + keys->insert(std::move(key)); + values->insert(std::move(value)); - InlineEscapingKeyStateHandler key_state_handler; - InlineEscapingValueStateHandler value_state_handler; + key = {}; + value = {}; + + row_offset++; + + return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; + } + + InlineKeyStateHandler key_state_handler; + InlineValueStateHandler value_state_handler; }; } diff --git a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp deleted file mode 100644 index a454f03243e..00000000000 --- a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "InlineKeyValuePairExtractor.h" - -namespace DB -{ - -InlineKeyValuePairExtractor::InlineKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler_, - InlineEscapingValueStateHandler value_state_handler_) - : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_) {} - -InlineKeyValuePairExtractor::Response InlineKeyValuePairExtractor::extract(const std::string & data) -{ - auto view = std::string_view {data.begin(), data.end()}; - return extract(view); -} - -InlineKeyValuePairExtractor::Response InlineKeyValuePairExtractor::extract(std::string_view data) -{ - InlineKeyValuePairExtractor::Response response; - - auto state = State::WAITING_KEY; - - std::size_t pos = 0; - - std::string key; - std::string value; - - while (state != State::END) - { - auto next_state = processState(data, pos, state, key, value, response); - - pos = next_state.position_in_string; - state = next_state.state; - } - - return response; -} - -NextState InlineKeyValuePairExtractor::processState(std::string_view file, std::size_t pos, State state, - std::string & key, std::string & value, Response & response) -{ - switch (state) - { - case State::WAITING_KEY: - return key_state_handler.wait(file, pos); - case State::READING_KEY: - return key_state_handler.read(file, pos, key); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos, key); - case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); - case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); - case State::READING_VALUE: - return value_state_handler.read(file, pos, value); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos, value); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos, value); - case State::FLUSH_PAIR: - return flushPair(file, pos, key, value, response); - case END: - return {pos, state}; - } -} - -NextState InlineKeyValuePairExtractor::flushPair(const std::string_view & file, std::size_t pos, - std::string & key, std::string & value, Response & response) -{ - response[std::move(key)] = std::move(value); - - key.clear(); - value.clear(); - - return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h index 065f2553bad..e15174f224c 100644 --- a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h @@ -8,24 +8,83 @@ namespace DB { +template class InlineKeyValuePairExtractor : public KeyValuePairExtractor> { public: - InlineKeyValuePairExtractor(InlineEscapingKeyStateHandler key_state_handler, InlineEscapingValueStateHandler value_state_handler); + InlineKeyValuePairExtractor(InlineKeyStateHandler key_state_handler_, InlineValueStateHandler value_state_handler_) + : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_) {} - Response extract(const std::string & data) override; + Response extract(const std::string & data) override + { + auto view = std::string_view {data.begin(), data.end()}; + return extract(view); + } - Response extract(std::string_view data) override; + Response extract(std::string_view data) override + { + InlineKeyValuePairExtractor::Response response; + + auto state = State::WAITING_KEY; + + std::size_t pos = 0; + + std::string key; + std::string value; + + while (state != State::END) + { + auto next_state = processState(data, pos, state, key, value, response); + + pos = next_state.position_in_string; + state = next_state.state; + } + + return response; + } private: NextState processState(std::string_view file, std::size_t pos, State state, - std::string & key, std::string & value, Response & response); + std::string & key, std::string & value, Response & response) + { + switch (state) + { + case State::WAITING_KEY: + return key_state_handler.wait(file, pos); + case State::READING_KEY: + return key_state_handler.read(file, pos, key); + case State::READING_ENCLOSED_KEY: + return key_state_handler.readEnclosed(file, pos, key); + case State::READING_KV_DELIMITER: + return key_state_handler.readKeyValueDelimiter(file, pos); + case State::WAITING_VALUE: + return value_state_handler.wait(file, pos); + case State::READING_VALUE: + return value_state_handler.read(file, pos, value); + case State::READING_ENCLOSED_VALUE: + return value_state_handler.readEnclosed(file, pos, value); + case State::READING_EMPTY_VALUE: + return value_state_handler.readEmpty(file, pos, value); + case State::FLUSH_PAIR: + return flushPair(file, pos, key, value, response); + case END: + return {pos, state}; + } + } static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, - std::string & value, Response & response); + std::string & value, Response & response) + { + response[std::move(key)] = std::move(value); - InlineEscapingKeyStateHandler key_state_handler; - InlineEscapingValueStateHandler value_state_handler; + key.clear(); + value.clear(); + + return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; + } + + InlineKeyStateHandler key_state_handler; + InlineValueStateHandler value_state_handler; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp deleted file mode 100644 index 2117a08a77a..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "InlineEscapingKeyStateHandler.h" - -namespace DB -{ - -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) -{ -} - -NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) -{ - while (pos < file.size()) - { - const auto current_character = file[pos]; - if (isalnum(current_character) || current_character == escape_character) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } - else - { - pos++; - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, Key & key) const -{ - bool escape = false; - - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (escape) - { - key.push_back(current_character); - escape = false; - } - else if (escape_character == current_character) - { - escape = true; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_VALUE}; - } - else if (!std::isalnum(current_character) && current_character != '_') - { - return {pos, State::WAITING_KEY}; - } - else - { - key.push_back(current_character); - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, Key & key) -{ - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (*enclosing_character == current_character) - { - if (key.empty()) - { - return {pos, State::WAITING_KEY}; - } - - return {pos, State::READING_KV_DELIMITER}; - } - else - { - key.push_back(current_character); - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const -{ - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h index 06f27ea6ee5..9f03df622bd 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -8,16 +8,138 @@ namespace DB { +template +concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) +{ + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; +}; + +template class InlineEscapingKeyStateHandler : public StateHandler { public: using Key = std::string; - InlineEscapingKeyStateHandler(char key_value_delimiter, char escape_character, std::optional enclosing_character); + InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) + { + } - [[nodiscard]] NextState wait(std::string_view file, size_t pos) ; - [[nodiscard]] NextState read(std::string_view file, size_t pos, Key & key) const; - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Key & key); - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; + [[nodiscard]] NextState wait(std::string_view file, size_t pos) + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + { + if (current_character == escape_character) + { + return {pos, State::READING_KEY}; + } + } + + if (isalnum(current_character)) + { + return {pos, State::READING_KEY}; + } + + if constexpr (QUOTING_STRATEGY == QuotingStrategy::WithQuoting) + { + if (current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + } + + pos++; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState read(std::string_view file, size_t pos, Key & key) const + { + bool escape = false; + + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + { + if (escape) + { + key.push_back(current_character); + escape = false; + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; + } + } + + if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_VALUE}; + } + else if (!std::isalnum(current_character) && current_character != '_') + { + return {pos, State::WAITING_KEY}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Key & key) + { + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (*enclosing_character == current_character) + { + if (key.empty()) + { + return {pos, State::WAITING_KEY}; + } + + return {pos, State::READING_KV_DELIMITER}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const + { + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } + } private: [[maybe_unused]] const char key_value_delimiter; diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp deleted file mode 100644 index f50709d8000..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "InlineEscapingValueStateHandler.h" - -namespace DB -{ - -InlineEscapingValueStateHandler::InlineEscapingValueStateHandler( - char escape_character_, - char item_delimiter_, - std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_) - , item_delimiter(item_delimiter_) -{ -} - -NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const -{ - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } - else if (current_character == item_delimiter) - { - return {pos, State::READING_EMPTY_VALUE}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_VALUE}; - } - else - { - pos++; - } - } - - return {pos, State::READING_EMPTY_VALUE}; -} - -NextState InlineEscapingValueStateHandler::read(const std::string_view file, size_t pos, Value & value) -{ - bool escape = false; - - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (escape) - { - escape = false; - value.push_back(current_character); - } - else if (escape_character == current_character) - { - escape = true; - } - else if (current_character == item_delimiter || !isValidCharacter(current_character)) - { - return {pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - } - - return {pos, State::FLUSH_PAIR}; -} - -NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, Value & value) -{ - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (enclosing_character == current_character) - { - return {pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, Value & value) -{ - value.clear(); - return {pos + 1, State::FLUSH_PAIR}; -} - -bool InlineEscapingValueStateHandler::isValidCharacter(char character) const -{ - return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_' || character == '.' || character == escape_character; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index 92e102c51d1..234f7839595 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -7,25 +7,137 @@ namespace DB { +template +concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) +{ + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; +}; + +template class InlineEscapingValueStateHandler : public StateHandler { using Value = std::string; public: InlineEscapingValueStateHandler( - char escape_character, - char item_delimiter, - std::optional enclosing_character); + char escape_character_, + char item_delimiter_, + std::optional enclosing_character_) + : StateHandler(escape_character_, enclosing_character_) + , item_delimiter(item_delimiter_) + { + } - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, Value & value); - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Value & value); - [[nodiscard]] static NextState readEmpty(std::string_view file, size_t pos, Value & value); + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if constexpr (QuotingStrategy::WithQuoting == QUOTING_STRATEGY) + { + if (current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + } + if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { + pos++; + } + } + + return {pos, State::READING_EMPTY_VALUE}; + } + + [[nodiscard]] NextState read(std::string_view file, size_t pos, Value & value) + { + bool escape = false; + + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if constexpr (EscapingStrategy::WithEscaping == ESCAPING_STRATEGY) + { + if (escape) + { + escape = false; + value.push_back(current_character); + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; + } + } + if (current_character == item_delimiter || !isValidCharacter(current_character)) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::FLUSH_PAIR}; + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Value & value) + { + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + if (enclosing_character == current_character) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::END}; + } + + [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, Value & value) + { + value.clear(); + return {pos + 1, State::FLUSH_PAIR}; + } private: const char item_delimiter; - bool isValidCharacter(char character) const; + bool isValidCharacter(char character) const + { + if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + { + if (character == escape_character) + { + return true; + } + } + return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_' || character == '.'; + } }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index abc9f1ad4fc..48aee9309b8 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -6,6 +6,18 @@ namespace DB { +enum QuotingStrategy +{ + WithQuoting, + WithoutQuoting +}; + +enum EscapingStrategy +{ + WithEscaping, + WithoutEscaping +}; + struct StateHandler { StateHandler(char escape_character, std::optional enclosing_character); From ff4e10fdd4999d2fef837b6d56fbe0ee4c1d25c8 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:46:55 +0000 Subject: [PATCH 049/535] print what is running when can't stop clickhouse --- tests/integration/helpers/cluster.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index fda31979363..af28a50da18 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -3784,6 +3784,9 @@ class ClickHouseInstance: while local_counter < retries: if not self.get_process_pid("clickhouse server"): break + self.exec_in_container( + ["bash", "-c", "ps aux"], user="root" + ) time.sleep(0.5) local_counter += 1 @@ -3844,6 +3847,9 @@ class ClickHouseInstance: while local_counter < retries: if not self.get_process_pid("clickhouse server"): break + self.exec_in_container( + ["bash", "-c", "ps aux"], user="root" + ) time.sleep(0.5) local_counter += 1 From 200e50b8e12811ac80f96cbbfe66caa3c5577874 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Wed, 8 Feb 2023 12:55:56 +0000 Subject: [PATCH 050/535] more changes in apps help --- programs/format/Format.cpp | 2 +- programs/keeper-converter/KeeperConverter.cpp | 2 +- programs/obfuscator/Obfuscator.cpp | 4 ++-- .../02598_clickhouse_help.reference | 20 +++++++++---------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/programs/format/Format.cpp b/programs/format/Format.cpp index 8bab24b5e37..8fe12cb27fa 100644 --- a/programs/format/Format.cpp +++ b/programs/format/Format.cpp @@ -73,7 +73,7 @@ int mainEntryClickHouseFormat(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << argv[0] << " [options] < query" << std::endl; + std::cout << "Usage: clickhouse format [options] < query" << std::endl; std::cout << desc << std::endl; return 1; } diff --git a/programs/keeper-converter/KeeperConverter.cpp b/programs/keeper-converter/KeeperConverter.cpp index 7d25c1d5017..6d689031baa 100644 --- a/programs/keeper-converter/KeeperConverter.cpp +++ b/programs/keeper-converter/KeeperConverter.cpp @@ -32,7 +32,7 @@ int mainEntryClickHouseKeeperConverter(int argc, char ** argv) if (options.count("help")) { - std::cout << "Usage: " << argv[0] << " --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots" << std::endl; + std::cout << "Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots" << std::endl; std::cout << desc << std::endl; return 0; } diff --git a/programs/obfuscator/Obfuscator.cpp b/programs/obfuscator/Obfuscator.cpp index 274ad29a174..b59dde1da06 100644 --- a/programs/obfuscator/Obfuscator.cpp +++ b/programs/obfuscator/Obfuscator.cpp @@ -1244,10 +1244,10 @@ try || !options.count("output-format")) { std::cout << documentation << "\n" - << "\nUsage: " << argv[0] << " [options] < in > out\n" + << "\nUsage: clickhouse obfuscator [options] < in > out\n" << "\nInput must be seekable file (it will be read twice).\n" << "\n" << description << "\n" - << "\nExample:\n " << argv[0] << " --seed \"$(head -c16 /dev/urandom | base64)\" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv\n"; + << "\nExample:\n clickhouse obfuscator --seed \"$(head -c16 /dev/urandom | base64)\" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv\n"; return 0; } diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index 74ba962a0ac..3e1917253a6 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -63,7 +63,7 @@ To configure initial environment two ways are supported: queries or command line CREATE TABLE
() ENGINE = File(, ); Or through corresponding command line parameters --table --structure --input-format and --file. -clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temprorary directory that is not reused between runs. +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. @@ -152,7 +152,7 @@ Allowed options: clickhouse format -Usage: /home/ubuntu/thread-ch/clickhouse [options] < query +Usage: clickhouse format [options] < query Allowed options: --query arg query to format -h [ --help ] produce help message @@ -411,7 +411,7 @@ And you should take care and look at exact algorithm, how this tool works, and p This tool works fine only with reasonable amount of data (at least 1000s of rows). -Usage: /home/ubuntu/thread-ch/clickhouse [options] < in > out +Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). @@ -477,7 +477,7 @@ Options: Example: - /home/ubuntu/thread-ch/clickhouse --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv clickhouse git-import @@ -684,7 +684,7 @@ example, --http_port=8010 clickhouse keeper-converter -Usage: /home/ubuntu/thread-ch/clickhouse --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: -h [ --help ] produce help message --zookeeper-logs-dir arg Path to directory with ZooKeeper logs @@ -850,7 +850,7 @@ To configure initial environment two ways are supported: queries or command line CREATE TABLE
() ENGINE = File(, ); Or through corresponding command line parameters --table --structure --input-format and --file. -clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temprorary directory that is not reused between runs. +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. @@ -939,7 +939,7 @@ Allowed options: clickhouse-format -Usage: /home/ubuntu/thread-ch/clickhouse-format [options] < query +Usage: clickhouse format [options] < query Allowed options: --query arg query to format -h [ --help ] produce help message @@ -1198,7 +1198,7 @@ And you should take care and look at exact algorithm, how this tool works, and p This tool works fine only with reasonable amount of data (at least 1000s of rows). -Usage: /home/ubuntu/thread-ch/clickhouse-obfuscator [options] < in > out +Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). @@ -1264,7 +1264,7 @@ Options: Example: - /home/ubuntu/thread-ch/clickhouse-obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv clickhouse-git-import @@ -1471,7 +1471,7 @@ example, --http_port=8010 clickhouse-keeper-converter -Usage: /home/ubuntu/thread-ch/clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: -h [ --help ] produce help message --zookeeper-logs-dir arg Path to directory with ZooKeeper logs From 9e989d4e4d7cae966b234461ddbf3cb4277b51b8 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Feb 2023 14:04:48 -0300 Subject: [PATCH 051/535] performance improvements and optional escaping --- src/Functions/extractKeyValuePairs.cpp | 229 ++++-------------- src/Functions/extractKeyValuePairs.h | 41 +--- src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../keyvaluepair/src/KeyValuePairExtractor.h | 9 +- .../src/KeyValuePairExtractorBuilder.cpp | 55 ++++- .../src/KeyValuePairExtractorBuilder.h | 17 +- .../src/impl/CHKeyValuePairExtractor.h | 65 +++-- .../src/impl/InlineKeyValuePairExtractor.h | 90 ------- .../state/InlineEscapingKeyStateHandler.h | 52 ++-- .../state/InlineEscapingValueStateHandler.h | 61 ++--- .../impl/state/NoEscapingKeyStateHandler.h | 114 +++++++++ .../impl/state/NoEscapingValueStateHandler.h | 115 +++++++++ .../src/impl/state/StateHandler.cpp | 5 +- .../src/impl/state/StateHandler.h | 47 +++- 14 files changed, 486 insertions(+), 416 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index bf9ad239b79..dd9691ba05b 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -2,17 +2,13 @@ #include #include -#include -#include -#include -#include -#include + #include -#include +#include +#include -/* Only needed for the sake of this example. */ -#include +#include namespace DB { @@ -23,6 +19,37 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } +auto ExtractKeyValuePairs::getExtractor( + CharArgument escape_character, + CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, + CharArgument enclosing_character) +{ + auto builder = KeyValuePairExtractorBuilder(); + + if (escape_character) + { + builder.withEscapeCharacter(escape_character.value()); + } + + if (key_value_pair_delimiter) + { + builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); + } + + if (item_delimiter) + { + builder.withItemDelimiter(item_delimiter.value()); + } + + if (enclosing_character) + { + builder.withEnclosingCharacter(enclosing_character.value()); + } + + return builder.build(); +} + ExtractKeyValuePairs::ExtractKeyValuePairs() : return_type(std::make_shared(std::make_shared(), std::make_shared())) { @@ -33,22 +60,9 @@ String ExtractKeyValuePairs::getName() const return name; } -ColumnPtr ExtractKeyValuePairs::chInline( - ColumnPtr data_column, - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - SetArgument) + +static ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) { - using ValueStateHandler = InlineEscapingValueStateHandler; - using KeyStateHandler = InlineEscapingKeyStateHandler; - - KeyStateHandler key_state_handler(*key_value_pair_delimiter, *escape_character, *enclosing_character); - - ValueStateHandler value_state_handler(*escape_character, *item_delimiter, *enclosing_character); - CHKeyValuePairExtractor ch_extractor(key_state_handler, value_state_handler); - auto offsets = ColumnUInt64::create(); auto keys = ColumnString::create(); @@ -60,7 +74,7 @@ ColumnPtr ExtractKeyValuePairs::chInline( { auto row = data_column->getDataAt(i).toView(); - auto inserted_rows = ch_extractor.extract(row, keys, values); + auto inserted_rows = extractor->extract(row, keys, values); offset += inserted_rows; @@ -72,50 +86,14 @@ ColumnPtr ExtractKeyValuePairs::chInline( return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); } - ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { -// auto t1 = high_resolution_clock::now(); - auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, - enclosing_character, value_special_characters_allow_list, ch_inline] - = parseArguments(arguments); + enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); - if (ch_inline) - { - return chInline(data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); - } + auto extractor_without_escaping = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character); - auto extractor = getExtractor( - escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character); - -// auto t2 = high_resolution_clock::now(); - auto raw_columns = extract(extractor, data_column); - - ColumnPtr keys_ptr = std::move(raw_columns.keys); -// auto t3 = high_resolution_clock::now(); - - - auto map = ColumnMap::create(keys_ptr, std::move(raw_columns.values), std::move(raw_columns.offsets)); -// auto t4 = high_resolution_clock::now(); - -// std::cout<<"Time taken for building extractor is: "<(t2 - t1).count()<<"u\n"; -// std::cout<<"Time taken for building extracting & creating output is: "<(t3 - t2).count()<<"u\n"; -// std::cout<<"Time taken for whole process is: "<(t4 - t1).count()<<"u\n"; - return map; - -// return raw_columns; - -// -// // improve escape character.. -// auto escaped_out = escape(raw_columns, escape_character ? escape_character.value() : '\\'); -// auto t3 = high_resolution_clock::now(); -// -// -// std::cout<<"Time taken for extraction is: "<(t2 - t1).count()<<"u\n"; -// std::cout<<"Time taken for escaping is: "<(t3 - t2).count()<<"u\n"; -// -// return escaped_out; + return extract(data_column, extractor_without_escaping); } bool ExtractKeyValuePairs::isVariadic() const @@ -142,7 +120,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const { if (arguments.empty()) { - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function " + String(name) + "requires at least one argument"); + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least one argument", name); } std::unordered_set value_special_characters_allow_list; @@ -189,135 +167,30 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const value_special_characters_allow_list}; } - bool ch_inline = false; - - if (arguments.size() == 7u) - { - ch_inline = true; - } - auto value_special_characters_allow_list_characters = arguments[5].column->getDataAt(0).toView(); value_special_characters_allow_list.insert( value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); return ParsedArguments{ - data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list, - ch_inline + data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list }; } -char ExtractKeyValuePairs::extractControlCharacter(ColumnPtr column) +ExtractKeyValuePairs::CharArgument ExtractKeyValuePairs::extractControlCharacter(ColumnPtr column) { auto view = column->getDataAt(0).toView(); - if (view.size() != 1u) + if (view.empty()) { - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must contain exactly 1 character"); + return {}; + } + else if (view.size() == 1u) + { + return view.front(); } - return view.front(); -} - -std::shared_ptr> ExtractKeyValuePairs::getExtractor( - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character) -{ - auto builder = KeyValuePairExtractorBuilder(); - - if (escape_character) - { - builder.withEscapeCharacter(escape_character.value()); - } - - if (key_value_pair_delimiter) - { - builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); - } - - if (item_delimiter) - { - builder.withItemDelimiter(item_delimiter.value()); - } - - if (enclosing_character) - { - builder.withEnclosingCharacter(enclosing_character.value()); - } - - return builder.build(); -} - -ExtractKeyValuePairs::RawColumns ExtractKeyValuePairs::extract(std::shared_ptr> extractor, ColumnPtr data_column) -{ - using std::chrono::high_resolution_clock; - using std::chrono::duration_cast; - using std::chrono::duration; - using std::chrono::microseconds; - - auto offsets = ColumnUInt64::create(); - - auto keys = ColumnString::create(); - auto values = ColumnString::create(); - -// keys->reserve(data_column->byteSize()); -// values->reserve(data_column->byteSize()); - - auto row_offset = 0u; - -// long totalExtractionTime = 0; -// long shortestExtractionTime = std::numeric_limits::max(); -// long longestExtractionTime = std::numeric_limits::min(); -// -// long totalInsertionTime = 0; -// long shortestInsertionTime = std::numeric_limits::max(); -// long longestInsertionTime = std::numeric_limits::min(); - - - for (auto i = 0u; i < data_column->size(); i++) - { - auto row = data_column->getDataAt(i).toView(); - // auto t2 = high_resolution_clock::now(); - - auto response = extractor->extract(row); - // auto t3 = high_resolution_clock::now(); - - for (auto & [key, value] : response) - { - keys->insert(key); - values->insert(value); - - row_offset++; - } - - offsets->insert(row_offset); - } - - return {std::move(keys), std::move(values), std::move(offsets)}; -} - -ColumnPtr ExtractKeyValuePairs::escape(RawColumns & raw_columns, char escape_character) -{ - auto & [raw_keys, raw_values, offsets] = raw_columns; - - auto escaped_keys = ColumnString::create(); - auto escaped_values = ColumnString::create(); - - escaped_keys->reserve(raw_keys->size()); - escaped_values->reserve(raw_values->size()); - - auto escape_character_string = std::string(1, escape_character); - - using ReplaceString = ReplaceStringImpl; - - ReplaceString::vector(raw_keys->getChars(), raw_keys->getOffsets(), escape_character_string, "", escaped_keys->getChars(), escaped_keys->getOffsets()); - ReplaceString::vector(raw_values->getChars(), raw_values->getOffsets(), escape_character_string, "", escaped_values->getChars(), escaped_values->getOffsets()); - - ColumnPtr keys_ptr = std::move(escaped_keys); - - return ColumnMap::create(keys_ptr, std::move(escaped_values), std::move(offsets)); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); } ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 003bc71060f..5fb6cd91a86 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -13,6 +13,7 @@ namespace DB class ExtractKeyValuePairs : public IFunction { +public: using CharArgument = std::optional; using SetArgument = std::unordered_set; @@ -24,63 +25,35 @@ class ExtractKeyValuePairs : public IFunction CharArgument item_delimiter; CharArgument enclosing_character; std::unordered_set value_special_characters_allow_list; - bool ch_inline = false; }; - struct RawColumns - { - ColumnString::Ptr keys; - ColumnString::Ptr values; - ColumnUInt64::Ptr offsets; - }; - -public: - using EscapingProcessorOutput = std::unordered_map; - ExtractKeyValuePairs(); static constexpr auto name = "extractKeyValuePairs"; static FunctionPtr create(ContextPtr) { return std::make_shared(); } - /// Get the main function name. String getName() const override; - ColumnPtr - executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override; + ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t) const override; - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override; + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override; bool isVariadic() const override; size_t getNumberOfArguments() const override; - DataTypePtr getReturnTypeImpl(const DataTypes & /*arguments*/) const override; + DataTypePtr getReturnTypeImpl(const DataTypes &) const override; private: DataTypePtr return_type; static ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments); - static char extractControlCharacter(ColumnPtr column); + static CharArgument extractControlCharacter(ColumnPtr column); - static std::shared_ptr> getExtractor( - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character); - - static RawColumns extract(std::shared_ptr> extractor, ColumnPtr data_column); - - static ColumnPtr escape(RawColumns & raw_columns, char escape_character); - - static ColumnPtr chInline( - ColumnPtr data_column, - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - SetArgument value_special_characters_allow_list) ; + static auto getExtractor(CharArgument escape_character, CharArgument key_value_pair_delimiter, + CharArgument item_delimiter, CharArgument enclosing_character); ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 72ecd1bc39a..093e72bd0f8 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -3,6 +3,6 @@ add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h impl/InlineKeyValuePairExtractor.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h) +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h impl/state/NoEscapingKeyStateHandler.h impl/state/NoEscapingValueStateHandler.h) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 21722164f20..311c14a80e1 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace DB { @@ -31,16 +31,13 @@ namespace DB * If we want to simplify this in the future, approach #2 in https://github.com/ClickHouse/ClickHouse/pull/43606#discussion_r1049541759 seems * to be the best bet. * */ -template > struct KeyValuePairExtractor { - using Response = R; - virtual ~KeyValuePairExtractor() = default; - virtual Response extract(const std::string & data) = 0; + virtual uint64_t extract(const std::string & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) = 0; - virtual Response extract(std::string_view data) = 0; + virtual uint64_t extract(std::string_view data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) = 0; }; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index ce506efbd5a..70245369aac 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -1,4 +1,9 @@ #include "KeyValuePairExtractorBuilder.h" +#include "impl/CHKeyValuePairExtractor.h" +#include "impl/state/InlineEscapingKeyStateHandler.h" +#include "impl/state/InlineEscapingValueStateHandler.h" +#include "impl/state/NoEscapingKeyStateHandler.h" +#include "impl/state/NoEscapingValueStateHandler.h" namespace DB { @@ -27,16 +32,54 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharac return *this; } -std::shared_ptr>> KeyValuePairExtractorBuilder::build() +std::shared_ptr KeyValuePairExtractorBuilder::build() { - using KeyStateHandler = InlineEscapingKeyStateHandler; - using ValueStateHandler = InlineEscapingValueStateHandler; + if (escape_character) + { + return buildWithEscaping(); + } - CInlineEscapingKeyStateHandler auto key_state_handler = KeyStateHandler(key_value_pair_delimiter, escape_character, enclosing_character); + return buildWithoutEscaping(); +} - CInlineEscapingValueStateHandler auto value_state_handler = ValueStateHandler(escape_character, item_delimiter, enclosing_character); +std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() +{ + using KeyStateHandler = NoEscapingKeyStateHandler; + using ValueStateHandler = NoEscapingValueStateHandler; - return std::make_shared>(key_state_handler, value_state_handler); + CKeyStateHandler auto key_state_handler = KeyStateHandler( + key_value_pair_delimiter.value_or(':'), + enclosing_character + ); + + CValueStateHandler auto value_state_handler = ValueStateHandler( + item_delimiter.value_or(','), + enclosing_character, + value_special_character_allowlist + ); + + return std::make_shared>(key_state_handler, value_state_handler); +} + +std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() +{ + using KeyStateHandler = InlineEscapingKeyStateHandler; + using ValueStateHandler = InlineEscapingValueStateHandler; + + CKeyStateHandler auto key_state_handler = KeyStateHandler( + key_value_pair_delimiter.value_or(':'), + escape_character.value_or('\\'), + enclosing_character + ); + + CValueStateHandler auto value_state_handler = ValueStateHandler( + escape_character.value_or('"'), + item_delimiter.value_or(','), + enclosing_character, + value_special_character_allowlist + ); + + return std::make_shared>(key_state_handler, value_state_handler); } } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 423aeca8809..1aa33ad126f 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -1,8 +1,9 @@ #pragma once -#include #include "KeyValuePairExtractor.h" -#include +#include "impl/CHKeyValuePairExtractor.h" +#include "impl/state/NoEscapingKeyStateHandler.h" +#include "impl/state/NoEscapingValueStateHandler.h" namespace DB { @@ -24,14 +25,18 @@ public: KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_); - std::shared_ptr>> build(); + std::shared_ptr build(); private: - char key_value_pair_delimiter = ':'; - char escape_character = '\\'; - char item_delimiter = ','; + std::optional key_value_pair_delimiter; + std::optional escape_character; + std::optional item_delimiter; std::optional enclosing_character; std::unordered_set value_special_character_allowlist; + + std::shared_ptr buildWithEscaping(); + + std::shared_ptr buildWithoutEscaping(); }; } diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index f3c9a266f74..5ec761e0259 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -3,31 +3,58 @@ #include #include #include -#include "state/InlineEscapingKeyStateHandler.h" -#include "state/InlineEscapingValueStateHandler.h" +#include "state/StateHandler.h" +#include "../KeyValuePairExtractor.h" namespace DB { -template -class CHKeyValuePairExtractor +template +concept CKeyValuePairExtractor = requires(Extractor extractor) { -public: - using Response = ColumnMap::Ptr; + { + extractor.extract( + std::string_view {}, + std::declval(), + std::declval() + ) + } -> std::same_as; - CHKeyValuePairExtractor(InlineKeyStateHandler key_state_handler_, InlineValueStateHandler value_state_handler_) + { + extractor.extract( + std::declval(), + std::declval(), + std::declval() + ) + } -> std::same_as; +}; + +template +class CHKeyValuePairExtractor : public KeyValuePairExtractor +{ + using Key = typename KeyStateHandler::ElementType; + using Value = typename ValueStateHandler::ElementType; + +public: + CHKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_) : key_state_handler(std::move(key_state_handler_)), value_state_handler(std::move(value_state_handler_)) {} - uint64_t extract(const std::string_view & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) + uint64_t extract(const std::string & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) override + { + return extract(std::string_view {data}, keys, values); + } + + uint64_t extract(std::string_view data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) override { auto state = State::WAITING_KEY; std::size_t pos = 0; - std::string key; - std::string value; + Key key; + Value value; + uint64_t row_offset = 0; while (state != State::END) @@ -43,8 +70,9 @@ public: private: - NextState processState(std::string_view file, std::size_t pos, State state, std::string & key, - std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) + NextState processState(std::string_view file, std::size_t pos, State state, Key & key, + Value & value, ColumnString::MutablePtr & keys, + ColumnString::MutablePtr & values, uint64_t & row_offset) { switch (state) { @@ -71,11 +99,12 @@ private: } } - static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, - std::string & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) + NextState flushPair(const std::string_view & file, std::size_t pos, Key & key, + Value & value, ColumnString::MutablePtr & keys, + ColumnString::MutablePtr & values, uint64_t & row_offset) { - keys->insert(std::move(key)); - values->insert(std::move(value)); + keys->insertData(key.data(), key.size()); + values->insertData(value.data(), value.size()); key = {}; value = {}; @@ -85,8 +114,8 @@ private: return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; } - InlineKeyStateHandler key_state_handler; - InlineValueStateHandler value_state_handler; + KeyStateHandler key_state_handler; + ValueStateHandler value_state_handler; }; } diff --git a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h deleted file mode 100644 index e15174f224c..00000000000 --- a/src/Functions/keyvaluepair/src/impl/InlineKeyValuePairExtractor.h +++ /dev/null @@ -1,90 +0,0 @@ -#pragma once - -#include -#include "state/InlineEscapingKeyStateHandler.h" -#include "state/InlineEscapingValueStateHandler.h" -#include "state/State.h" - -namespace DB -{ - -template -class InlineKeyValuePairExtractor : public KeyValuePairExtractor> -{ -public: - InlineKeyValuePairExtractor(InlineKeyStateHandler key_state_handler_, InlineValueStateHandler value_state_handler_) - : key_state_handler(key_state_handler_), value_state_handler(value_state_handler_) {} - - Response extract(const std::string & data) override - { - auto view = std::string_view {data.begin(), data.end()}; - return extract(view); - } - - Response extract(std::string_view data) override - { - InlineKeyValuePairExtractor::Response response; - - auto state = State::WAITING_KEY; - - std::size_t pos = 0; - - std::string key; - std::string value; - - while (state != State::END) - { - auto next_state = processState(data, pos, state, key, value, response); - - pos = next_state.position_in_string; - state = next_state.state; - } - - return response; - } - -private: - NextState processState(std::string_view file, std::size_t pos, State state, - std::string & key, std::string & value, Response & response) - { - switch (state) - { - case State::WAITING_KEY: - return key_state_handler.wait(file, pos); - case State::READING_KEY: - return key_state_handler.read(file, pos, key); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos, key); - case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); - case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); - case State::READING_VALUE: - return value_state_handler.read(file, pos, value); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos, value); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos, value); - case State::FLUSH_PAIR: - return flushPair(file, pos, key, value, response); - case END: - return {pos, state}; - } - } - - static NextState flushPair(const std::string_view & file, std::size_t pos, std::string & key, - std::string & value, Response & response) - { - response[std::move(key)] = std::move(value); - - key.clear(); - value.clear(); - - return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; - } - - InlineKeyStateHandler key_state_handler; - InlineValueStateHandler value_state_handler; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h index 9f03df622bd..3d82bdafbbe 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -2,28 +2,19 @@ #include #include -#include "State.h" #include "StateHandler.h" namespace DB { -template -concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) -{ - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; -}; - -template +template class InlineEscapingKeyStateHandler : public StateHandler { public: - using Key = std::string; + using ElementType = std::string; + InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_), key_value_delimiter(key_value_delimiter_) + : StateHandler(enclosing_character_), escape_character(escape_character_), key_value_delimiter(key_value_delimiter_) { } @@ -33,12 +24,9 @@ public: { const auto current_character = file[pos]; - if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + if (current_character == escape_character) { - if (current_character == escape_character) - { - return {pos, State::READING_KEY}; - } + return {pos, State::READING_KEY}; } if (isalnum(current_character)) @@ -60,7 +48,7 @@ public: return {pos, State::END}; } - [[nodiscard]] NextState read(std::string_view file, size_t pos, Key & key) const + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const { bool escape = false; @@ -70,19 +58,16 @@ public: { const auto current_character = file[pos++]; - if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + if (escape) { - if (escape) - { - key.push_back(current_character); - escape = false; - continue; - } - else if (escape_character == current_character) - { - escape = true; - continue; - } + key.push_back(current_character); + escape = false; + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; } if (current_character == key_value_delimiter) @@ -102,7 +87,7 @@ public: return {pos, State::END}; } - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Key & key) + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) { key.clear(); @@ -142,7 +127,8 @@ public: } private: - [[maybe_unused]] const char key_value_delimiter; + const char escape_character; + const char key_value_delimiter; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index 234f7839595..c10469ebffc 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -3,31 +3,24 @@ #include #include "State.h" #include "StateHandler.h" +#include namespace DB { -template -concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) -{ - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; -}; - -template +template class InlineEscapingValueStateHandler : public StateHandler { - using Value = std::string; - public: + using ElementType = std::string; + InlineEscapingValueStateHandler( char escape_character_, char item_delimiter_, - std::optional enclosing_character_) - : StateHandler(escape_character_, enclosing_character_) - , item_delimiter(item_delimiter_) + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(enclosing_character_), escape_character(escape_character_) + , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) { } @@ -61,7 +54,7 @@ public: return {pos, State::READING_EMPTY_VALUE}; } - [[nodiscard]] NextState read(std::string_view file, size_t pos, Value & value) + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) { bool escape = false; @@ -71,19 +64,16 @@ public: { const auto current_character = file[pos++]; - if constexpr (EscapingStrategy::WithEscaping == ESCAPING_STRATEGY) + if (escape) { - if (escape) - { - escape = false; - value.push_back(current_character); - continue; - } - else if (escape_character == current_character) - { - escape = true; - continue; - } + escape = false; + value.push_back(current_character); + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; } if (current_character == item_delimiter || !isValidCharacter(current_character)) { @@ -98,7 +88,7 @@ public: return {pos, State::FLUSH_PAIR}; } - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, Value & value) + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) { value.clear(); @@ -118,25 +108,24 @@ public: return {pos, State::END}; } - [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, Value & value) + [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value) { value.clear(); return {pos + 1, State::FLUSH_PAIR}; } private: + const char escape_character; const char item_delimiter; + std::unordered_set special_character_allowlist; bool isValidCharacter(char character) const { - if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WithEscaping) + if (character == escape_character) { - if (character == escape_character) - { - return true; - } + return true; } - return /*special_character_allowlist.contains(character) ||*/ std::isalnum(character) || character == '_' || character == '.'; + return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_' || character == '.'; } }; diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h new file mode 100644 index 00000000000..ed098dca948 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h @@ -0,0 +1,114 @@ +#pragma once + +#include "StateHandler.h" + +namespace DB +{ + +template +class NoEscapingKeyStateHandler : public StateHandler +{ +public: + using ElementType = std::string_view; + + NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) + { + } + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (isalnum(current_character)) + { + return {pos, State::READING_KEY}; + } + + if constexpr (QUOTING_STRATEGY == QuotingStrategy::WithQuoting) + { + if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + } + + pos++; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const + { + auto start_index = pos; + + key = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (current_character == key_value_delimiter) + { + // not checking for empty key because with current waitKey implementation + // there is no way this piece of code will be reached for the very first key character + key = createElement(file, start_index, pos - 1); + return {pos, State::WAITING_VALUE}; + } + else if (!std::isalnum(current_character) && current_character != '_') + { + return {pos, State::WAITING_KEY}; + } + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) + { + auto start_index = pos; + + key = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (enclosing_character == current_character) + { + auto is_key_empty = start_index == pos; + + if (is_key_empty) + { + return {pos, State::WAITING_KEY}; + } + + key = createElement(file, start_index, pos - 1); + return {pos, State::READING_KV_DELIMITER}; + } + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const + { + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } + } + +private: + const char key_value_delimiter; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h new file mode 100644 index 00000000000..6f0fa5f0466 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h @@ -0,0 +1,115 @@ +#pragma once + +#include "StateHandler.h" +#include + +namespace DB +{ + +template +class NoEscapingValueStateHandler : public StateHandler +{ +public: + using ElementType = std::string_view; + + NoEscapingValueStateHandler( + char item_delimiter_, + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(enclosing_character_) + , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) + { + } + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if constexpr (QuotingStrategy::WithQuoting == QUOTING_STRATEGY) + { + if (current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + } + if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { + pos++; + } + } + + return {pos, State::READING_EMPTY_VALUE}; + } + + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) + { + auto start_index = pos; + + value = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (current_character == item_delimiter || !isValidCharacter(current_character)) + { + value = createElement(file, start_index, pos - 1); + return {pos, State::FLUSH_PAIR}; + } + } + + // TODO: do I really need the below logic? + // this allows empty values at the end + value = createElement(file, start_index, pos); + return {pos, State::FLUSH_PAIR}; + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) + { + auto start_index = pos; + + value = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (enclosing_character == current_character) + { + // not checking for empty value because with current waitValue implementation + // there is no way this piece of code will be reached for the very first value character + value = createElement(file, start_index, pos - 1); + return {pos, State::FLUSH_PAIR}; + } + } + + return {pos, State::END}; + } + + [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value) + { + value = {}; + return {pos + 1, State::FLUSH_PAIR}; + } + +private: + const char item_delimiter; + std::unordered_set special_character_allowlist; + + bool isValidCharacter(char character) const + { + return std::isalnum(character) || character == '_' || character == '.' || special_character_allowlist.contains(character); + } +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp index 67254ee4217..2fe7d8ce782 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp @@ -1,11 +1,10 @@ #include "StateHandler.h" -#include namespace DB { -StateHandler::StateHandler(char escape_character_, std::optional enclosing_character_) - : escape_character(escape_character_), enclosing_character(enclosing_character_) +StateHandler::StateHandler(std::optional enclosing_character_) + : enclosing_character(enclosing_character_) { } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 48aee9309b8..a9ce5023729 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -2,6 +2,7 @@ #include #include +#include "State.h" namespace DB { @@ -12,20 +13,56 @@ enum QuotingStrategy WithoutQuoting }; -enum EscapingStrategy + +template +concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) { - WithEscaping, - WithoutEscaping + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; }; +template +concept CNoEscapingKeyStateHandler = requires(KeyStateHandler handler) +{ + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; +}; + +template +concept CKeyStateHandler = CInlineEscapingKeyStateHandler || CNoEscapingKeyStateHandler; + +template +concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) +{ + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; +}; + +template +concept CNoEscapingValueStateHandler = requires(ValueStateHandler handler) +{ + { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; +}; + +template +concept CValueStateHandler = CInlineEscapingValueStateHandler || CNoEscapingValueStateHandler; + struct StateHandler { - StateHandler(char escape_character, std::optional enclosing_character); + StateHandler(std::optional enclosing_character); StateHandler(const StateHandler &) = default; virtual ~StateHandler() = default; - const char escape_character = '\\'; const std::optional enclosing_character; protected: From bc2bf778696b9e55bbe2fa9cdc683a6e38b9e684 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Feb 2023 14:40:25 -0300 Subject: [PATCH 052/535] didnt understand --- src/Common/CaresPTRResolver.cpp | 5 ++--- src/Common/remapExecutable.cpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Common/CaresPTRResolver.cpp b/src/Common/CaresPTRResolver.cpp index 0c7768448a0..adb7b0d33c1 100644 --- a/src/Common/CaresPTRResolver.cpp +++ b/src/Common/CaresPTRResolver.cpp @@ -149,7 +149,7 @@ namespace DB int number_of_sockets_to_poll = 0; - for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++) + for (int i = 0; i < ARES_GETSOCK_MAXNUM; i++, number_of_sockets_to_poll++) { pollfd[i].events = 0; pollfd[i].revents = 0; @@ -157,8 +157,7 @@ namespace DB if (ARES_GETSOCK_READABLE(sockets_bitmask, i)) { pollfd[i].fd = sockets[i]; - pollfd[i].events = POLLRDNORM | POLLIN; - number_of_sockets_to_poll++; + pollfd[i].events = POLLIN; } else { diff --git a/src/Common/remapExecutable.cpp b/src/Common/remapExecutable.cpp index 1ded173d8e0..206314ea295 100644 --- a/src/Common/remapExecutable.cpp +++ b/src/Common/remapExecutable.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include From df9a081b545ad9a81493305e1bed82405ee8fb89 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Feb 2023 13:14:35 -0300 Subject: [PATCH 053/535] fix empty special value character allowlist --- src/Functions/extractKeyValuePairs.cpp | 7 +++++-- src/Functions/extractKeyValuePairs.h | 3 ++- .../keyvaluepair/src/KeyValuePairExtractorBuilder.cpp | 6 ++++++ .../keyvaluepair/src/KeyValuePairExtractorBuilder.h | 2 ++ .../src/impl/state/InlineEscapingValueStateHandler.h | 2 +- .../src/impl/state/NoEscapingValueStateHandler.h | 2 +- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index dd9691ba05b..35cdf9ef7ec 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -23,7 +23,8 @@ auto ExtractKeyValuePairs::getExtractor( CharArgument escape_character, CharArgument key_value_pair_delimiter, CharArgument item_delimiter, - CharArgument enclosing_character) + CharArgument enclosing_character, + std::unordered_set value_special_characters_allow_list) { auto builder = KeyValuePairExtractorBuilder(); @@ -47,6 +48,8 @@ auto ExtractKeyValuePairs::getExtractor( builder.withEnclosingCharacter(enclosing_character.value()); } + builder.withValueSpecialCharacterAllowlist(value_special_characters_allow_list); + return builder.build(); } @@ -91,7 +94,7 @@ ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & argum auto [data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list] = parseArguments(arguments); - auto extractor_without_escaping = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character); + auto extractor_without_escaping = getExtractor(escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list); return extract(data_column, extractor_without_escaping); } diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 5fb6cd91a86..01ef503c2f2 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -53,7 +53,8 @@ private: static CharArgument extractControlCharacter(ColumnPtr column); static auto getExtractor(CharArgument escape_character, CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, CharArgument enclosing_character); + CharArgument item_delimiter, CharArgument enclosing_character, + std::unordered_set value_special_characters_allow_list); ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 70245369aac..33b0711c122 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -32,6 +32,12 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharac return *this; } +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withValueSpecialCharacterAllowlist(std::unordered_set special_character_allow_list_) +{ + value_special_character_allowlist = special_character_allow_list_; + return *this; +} + std::shared_ptr KeyValuePairExtractorBuilder::build() { if (escape_character) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 1aa33ad126f..007e62ece2c 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -25,6 +25,8 @@ public: KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_); + KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowlist(std::unordered_set special_character_allow_list); + std::shared_ptr build(); private: diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index c10469ebffc..40b53e440b9 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -125,7 +125,7 @@ private: { return true; } - return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_' || character == '.'; + return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; } }; diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h index 6f0fa5f0466..f904f944f40 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h @@ -108,7 +108,7 @@ private: bool isValidCharacter(char character) const { - return std::isalnum(character) || character == '_' || character == '.' || special_character_allowlist.contains(character); + return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); } }; From 5916283a9b6b3881ec5885e78750de74e74ad9d3 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Feb 2023 13:16:15 -0300 Subject: [PATCH 054/535] remove logical error extern --- .../keyvaluepair/src/KeyValuePairExtractorBuilder.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 007e62ece2c..acc8431f7a3 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -8,11 +8,6 @@ namespace DB { -namespace ErrorCodes -{ - extern const int LOGICAL_ERROR; -} - class KeyValuePairExtractorBuilder { public: From 424538025120f43a7dbbd731f68074546d8993ec Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Sat, 18 Feb 2023 10:35:18 -0300 Subject: [PATCH 055/535] fix test --- .../02499_extract_key_value_pairs_multiple_input.reference | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 7ff49070cef..512a2a6db69 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -100,4 +100,4 @@ WITH ) AS x SELECT x; -{'some_key':'dolla'} +{'some_key':'@dolla%sign$'} From 2ed50d2710a54ec5f1d7d0a0a077b5374aa9c674 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 20 Feb 2023 16:29:20 -0300 Subject: [PATCH 056/535] remove stale test / not reproducible anymore since I lost the python script --- ...499_extract_key_value_pairs_big_input.reference | 2 -- .../02499_extract_key_value_pairs_big_input.sh | 14 -------------- .../big_input_file.txt | 1 - 3 files changed, 17 deletions(-) delete mode 100644 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference delete mode 100755 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh delete mode 100644 tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference deleted file mode 100644 index 45caef3b8d5..00000000000 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference +++ /dev/null @@ -1,2 +0,0 @@ -406b888d56db414d25b854d3673d345f - -1 diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh deleted file mode 100755 index 24182e3d297..00000000000 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -# Tags: no-ubsan, no-fasttest - -CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -# shellcheck source=../shell_config.sh -. "$CUR_DIR"/../shell_config.sh - -DATA_FILE=$CUR_DIR/data_extract_key_value_pairs/big_input_file.txt -${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" -${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" -cat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(line, '\\\', ':', ',', '\"') FROM input('line String') FORMAT LineAsString" -${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum -${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" -${CLICKHOUSE_CLIENT} --query="drop table json_map" diff --git a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt deleted file mode 100644 index 1065f9fa977..00000000000 --- a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt +++ /dev/null @@ -1 +0,0 @@ -&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=(&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=( bBO: aSqXrONruaRWxTtqomuGZSfg3GExhjljYJOSqwrviXlCunl0eJ, ZOxSPRPqbJFgYKchBrCb7EG8owcyx: "HPVPgTCIeQW8mvdGAuj0WRbaMeWIuwgaVC1CR4cav2G2m",L1U:"LqDf2bi3dhNZlDKhG7BZI8a5O","RbaIzZDjX7bjQ":DAMd9EgQxgCzPNqnMtRFw0qBXAItgfXKOu,aA2hf8CpJOVXH2dwZMpRqPoLRv7:CoQK1YLfO8xgivMNfFXtnW1nek94RomFqOa2P921zpgG8W,KYlfx3QgJJL6KgVMrPyRoc25NC7oGVCIqfDDW92wL3j8OCR6AzrCJ6mXIpWVtxr:"lyz6i7",#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`i4WPWgYumlO99w0PFtS2oc:e1Vx05nWNkROKnu1K3TJ7Mnhg3g, a1jDET8WGoTCJrrUzJQtm: Z6EHpHbFclD7O4L0qwWkk26OM5EW62YyHtH4FYQjouiR8yFI,*=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''**=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''*WN5cCJ4AZzoM3ozjvaa9MZCRisMOGPNO8nQCbWMgt91AlXQ5q8:"iLHt7IkOJxznwnuYTybux6M8e3K3ksaiQggiSIbLigIqfDqQvV",~@*,<*~))/#*]#;~&#>?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_),#{=}]%-_*;%^%$(|)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_) "ryR3w5iBOV74GrW0YlrVBYV7r5NquYail31QuNswwd2SJqfDWdN": jqdr1xR1uO4TFd0O6nNU2pCZ4lnyIR33tRN6mjw6Xv83hXJCMHyH,vehQ3jObweRmCSpZHMs:"kYSmBIMHnQU4BL50ZJoxmWsmwHQwV8OA8OkfWxTDDDMdQ60G0wMX2snnZTf4Vbyhf",RSGWMlLyvHKRSPb1Op:IfLe9moJGTTMi2EBzqT1ZEICgy6,}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{ mnJCmbjybQDn0m3pfc2Gexx8T1rQPT3vs9En2AKakW1QXrPUvvOrhQkWRA5pAw2: "DOwmPqqCf7DJ0Njn8Dxq2630TLLZGtfHhObX99th3cQcHdhnOBNpA292",fjtH3kYdnUYOaiV25TY37hk7qdMEigwceothWCHeHcNT:SdCQivn0occBQA1iZV8ewM,"BvMcVGGDlELqvvSDFUx1A5":Ny2nE2IFhjs2dLJIztfvvVf57j,ubawZkukoLWXLaU8Wis7u65DoFwq9TIqiVAPfBpiLLx69KiPqALrkXnX1t5:jt0UXegwbORBeNq7J6QpkWuVcmtdhXnxqfzZuKs8WpNSwu2PHCi6XzAiIEh6f,JadA5leQPXBB2pegQ55N9Wc:"P6opRuWHkoDYkXcOpo9Qqj7wawR8y","C7iHuHVBo9oyIUAP6ai":lgogbZYftOHe, SAeRhIi0bh6kQNAQXI4fTl26dgL9y0Zt8xl1JzD1MLDvQZFnDkU8aYS3pYo: jEGjxlxITixh2S1oF9T69XDbNTv3X5qpVQCTyf2JHVUDvZpE1yIalPpNDqjAculni,[={~)~&=@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$#)>@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$"Cbp":yF97mPEuISAWDbLGHRXkvyFswJQGub3rapYw8pIUj8Iy6BNT4qrUkPfzJu1viapAE,E3Or9HRv0l9JOirYKHn2YrqYSXT4A3qcxjdLOf0dqHnW7DoYMP6lbLgh9gMYbqj8:eSxKuE,xiprDJWAqQO3G2fEO6o:"tXlCTXuzFpN3rZVI52v6SE3cX1aJjB94oRquKXQbeZeEFd47wUIs",'$),#+_}#|[('$),#+_}#|[( MoTsMBYEpmXZOxdtK3Fmg2z7ejO2qraizx0NxWkiQLJZAof1rtPlWnVEOix8EsHH7: "mVeP52LGDDw2gVkEnlUDRGkT5oV6KSRGmZksJgUA8Mz6K29VJGg5w2j3l1xaEbqHE",*%!%#*%!%#"z60XAmGkusr1":y65ZJ6pYon02IZCu8e1K7vecSZ8Mb4Pjg4,Mmgsr5m3kVqSMbzKN5Qyk70zOtpDfMBe9Ws8WsBNIq6EBDhDN1rw:"RmAwQoJOkRD7NVE2iVgIdHf49R9Q4XkHR1wVmE9",~!()}<)`),^}[='#;[/[+<[*;&]'~~!()}<)`),^}[='#;[/[+<[*;&]'~ "MLwb2KHrs20fA1XIi5TC9DjTcEHKwvqCv5VdQXegLH": Id4rIadhfv6K1TvOQVOgkm6kDx5ViDYCQl7OGBuYB,/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-s4OtFrTpOyWClLejg1XTXK1:bwLKbnPyimEUvfgO6aFF0BLS2EP63vYa9osHdh0ws9tjMTWZapi,"SpuLcRscA118OPr63OdWuqyr4Wbn":JWJKB,I2JSuUZ7VmT1BHHKvbKLv2QuO2ZGnDcum6Qq59PQuEsmXV:QPqrIhoSp6UnWh1X5dFXgcmDt5F238elzanh8leYCYdjwLLrDPc2PqvgreFrl,{.&>#'*>/+=/=)'{.&>#'*>/+=/=)'o61TsOyn9pbKYAmxDiByA82W6DqoDyr7aTLx:z0O63wL3XOX473pCVVXO0x9DXEtTeY3s1kqHFNIPJoxU6pKyjMiQ, KPPI9nKaKEXQ2LTP1: "Y6Vb5ppra6", iDFPFyQnGBLlfHBKEfmThZcnE9YQ3yZS50KRQDfeJfHiXQlpcjUhyumjZlhRJ1jxF: Q7UATsYlv6uIBrNpexkRAb80Wrwp1hEalLNXMQTAsBI5mEoN25xzXhuaSph,GhGcWyg0x4am7w1NSss8L:lMpGOPI6JPBjufzywhMmAdlYfE,[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||<[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||< r4C00g0i66rU0CChYYhEF: gNVPYrvjI38nnkrm9j7Ot5T,<=&<=&"kG7l7gv2YEHdMxi7k7n1mxbYrhJtazsROH7lQiqx6kQNl":RRVpAGkFZCtlsRotUVYUyeBev4HTBJkoOuL2EEnU04SIVEKV, ytEWFzMO: tKh3Pvqd4QfWPERZuMFChzeJ8QtN4Hbd8,"r7mevpc2G6C2hU8CIgbWMI5vtwFDfzZqWeam5JUJlcIzelbOjp8So":bMtHEZmsJMhfWyRR54rhbeisUO,ESIdZ6tn3gdYaWl3I22LYDpqFa9L540TsqDaz5DeeL4A4j4UzXOky80Iq:kiaZocwzqNj3uBm5gv1Nbq,&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`bS70WPcW4CS4aBcjH1cddIkvhErXNa3rR51FLwMSR7:GoqCzEC54oAKPycGHG0jtMNsyS0GitppGj2dvG0CfESwneb,VXi31PvZK4mCEeG2zCIAbL:lQZCkyYM,"RwGS7EmU1RNZ8aVcE8NK64pOPrtoXGI5ZB51dj8B0kyeEF6HMN":kOmLidOiGxjrQfgPzmZWr84VbRnvR2Qw4346FzBjHCJVwrSRk,];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[cAju1VPohaxvOZwsuHIK5LCRw0gDk1jKkAgXxF:WdQilqqOBKmg7OuUeTCmbwMbyD01Gpia7V3VcBLWNVRGiNoBStFqx4iyOV48g, f1DuLrKMOqoRaSoupBqLO1vw: nvCngxsEyg0Fp1Sq1DD6QQaJUUosym2AuQp,Xa1TI9s5nrPq3NyuKHhH4motiJbgKUEpiJ5Q701:lYZIT062YGOQx0o1sUamGT1MOsPfKuaqUhOWAhxTffUDoIEB2ifT, RhMnn4jeGyDMTGa6I: XUBiQKgUaSocAmvob6ijrv9G8Hk2xFBGbZBZ4uWIVo7tCJXSRGj5Ptyci,`!$#-+]{^/+'_'!}@]`!$#-+]{^/+'_'!}@] N0QOctoqmPOUMrUp34TLNZORcb1WZyJE4k2Gpr2Z9VuIr9l5ETEmVrdpw2t: fk1jKZN3aoPpmPsvHozyUmDjqb2w, GF903dejR6Dug2eVTbpC9D1f55k1VOCKFidTSo2gbzzzK: AJXUtO5mvkIrA,>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[CJ38S5IpbC8M0llZ6OkNheikOS1mY7swyQJQ2yPyiszBBBOJAvHHd9:"ncnSD4ya82wyraiYjVRolYNONOED6qS2TNiZ54TRL6G8VKHn5q", dcxGPZFIl4F271KVRf5neThzxsxdR51suRWDlyVTNWOIyOWXo1jvvq: slllvACa1THuHmL0j84cnNujILZ6MJyN9orsm0Bu25oRqbh0oiCDnmFB9tSMviw,{+)>/@!<=|-#<]./_)_={,~{+)>/@!<=|-#<]./_)_={,~"gOtsWqFvJXsgyIg6rYA5lIe1NeYEruDgok2":LoIC3bZBuiAbVUaYZLFAvF831aC4hDdrALLI,"PDgLvXZf1gI":DtUk,`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[yqx1xaNDdMAMFbFzCUOBHv9iddHYKdi9vsPe3rD56k4zaV:"FBrOLMTK9B",+|&=+|&=WHqumNUodt2PWokZg4W0J3bCddWMW9szNvmPv0vjmFG:"jLfvCPq4Ad2mlhmlKmKhWEaZjLex5Zv2JysiOmVguqizA4bdPdsNQj","MZeGwvErbIv0EefJYRny6FjzHnQYtLyYFE2UV":nHkUt1NnrnJIdyn9kDlQbVU1S0TuAqkynJZ05cl2MBwlT72SWlvC,!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]*!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]* POgf6C4N8iGu53Bfp2ybSy: CbO1wby0B2OE,{$;!&<~$+_*`__?,{$;!&<~$+_*`__?,hlmwjhU3MYm3TEtogWN5C0lsXDt1CRS7J:BamY4TOvtD9pEcUOWDmMgwh8rpuK1pyn9Knp,LDkAVjzOhpvLSL5TprPQmnV3RqjsRR3WiuZ8M3pvlz:RMZRJwC6ewSIDuMhYB10sPmBZ,"qygEHrLT":"RZVoNb37ybtQFq3pg9r7XsXdEXZyq1Bujzv",cvAVlz1AI6:XBCP24V2mGhYwABWBMBFXyvutwcSr3glBoz9bfvvn,MGCYPNl7vx:"aqMfvMrEOD5gl8GZyjo8","tJlhKsAiFfVYuIYWDx5npwcK":QxAYyV5hJqpqyyOqGRR26V49kMAnPz0d2dlCUgPcCer8Peu0IQNi4tjEVjHiMy, PkbyGlrKckbYXZRSeDxKgLkb8f2WZIiSkZiIBdJxkaa1I0FQbuE9DMyJmtucPSi2: aeGYZgQy4taizTjcNQQX7DvYniNJmENR25,^~',?[&?@=.}.*}*_{[{[@],~(|>)$-^~',?[&?@=.}.*}*_{[{[@],~(|>)$-"PaRfuI":tF5nsaK,h4K0IgZuKPeNJXKjSSxLaT5gzcl4D4L63ykzAiCMTbl1A3:va3yvNVb3hTnL2K1WfmZg23PE9wk, XAPVvi3pqSkvuNVuVzvKtAyDtZAGYdXNvqj5moo2gFf: E8b2WhxqWt0BL6,Og7MjoegoDTF3CFfZJRmz5Idjw1fRB0dxnryV83QRYt:ucPyXaV2i4Rw3C8ZuiEi2y1uzbz4DkFnm9FgMEWhszieDmrG3G90Z, "TLobGGpFhPZs9Bxp1clwYvf6hMGLRGcg6ZRUEDYW8Fnon": P9MALDdHFWC6Kwn3zIq0QIl6W2,"YABWHUu7pDruOT8QGfKcvAeJxu":"BtGE2quqYJ332j", M6XTf1Y3csBFjQ01DZoj4DdKO6J4CDwOp3JSrWIj9kH5: "IHhuXey9Jcy1L3DApgdfAD",`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~ tCRK8InckVNgel0Y: bxeBTnsQSs77t4o7Wn3oAQw5hKNsPCJ4uoa3xaZfwsx6rZdFC5643q4fI9fp83,OoSjaY3qRQ21X0nqVoZ0:D9LeCyYvkWyomIRtwqP6q2J,"eoZm9pmDFxl1mRhI1IEGaxKr0U5ofrF8SBghxu":hexeZbw3eUDVSxMXImZmUa2Yf4khbst106HF4S98ovCZirf6KQT8No,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,CQom5yPn7NLf0HjLPKZLrEodaHNBls1p9oMFT8fyBTVkiCk:QkL5d5Hwh4XLutRRYwfWyHMiju6HNZqM3IBY6, YCvobbCFxaHNzGChAtwJauY5LFeVu7ZLjipOsBtu5s2eJwPnVgTaJcVg: "RM0m0zr1DofaM1bWZ8QbMXtVUCgNwK3",aT43I1TMisvG0d30AAco:TKsWdpMOuFkxYm2oUGcX,jKBXoop41PtFsvRAziD1r56HVlRe:mFveseCTV3nFmArmQpumzHs1abqRtOcNs4u2RJHQAn3ymhYnLzpN,JZyu0rxGXyXRQ4NXLFSXHhlcDqrbPB2sEWKAnGFYnKeW72yiPIbmQvuPIDk:r1wFMWTZx9Exg1zGox53Ps548nFxsbQVFI1l,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,EG9Fh6V9mVDgA:"aVwz8TpztHuBdovFLiT4ilXqf8oW",&[>(~|(~|}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_;!.?-.@^?`{&_(>}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_ fGMEITkyxISayFNbmnz4VtpepDbIf5KvNsQphQThqnsUigpiHMJcBsIubJWMvEC1l: hnIy11kOgF6nsPJG6ZxrFY, "d2Ps9w3hxDwFt75uTzD4": oIUwCE0L4eKP7PC55QqGr0HpVhS,_/(+@{~`+_/(+@{~`+QnyjFPSVp:JBINPLFMJKHxUjos8laMtSAPta,%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)#%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)# EN3QC1dzBFL: EHsqzK0V59m2E1ey62JPioB7Fnf,"DKVD4uTX":i3r4OlbeJJw7zVq2iPE2wZ3YDeOVjBqR1VtnhJ2Ndlvtxy,rLnD87vuBS:W5ZVb,f7NQXp25FZ99FnjkZUtFhMz5hBYaZaPp0:JnU2DylAEelg0oMYg,PGZZJ8s9l2i:Jnj98FtHuyEsKRlMyY2p18ik46jhxKxrjDsvJKZjhdzok6Yz,"JfnVtytg7zPoj3wl":uJI2jc40oAN9mGB, MaOZACdZDlm8g8FcXuNoFJZ72PrnCIq: i4dwQhLdRyjvOPaw6XaMC9P8OQ7X8efmYDL,`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'ycCCmSOhper5Dtcpf:"g7R",)-[#)-[# "whaXKTJB3irCR7A5AjjY": t1LNSPC3HkLYfRQ7fB6KfuTGs, Ej1IGLt5bIa4B1qBdSnFSElfOd505vg1XZOiJb4Q1jTSwWvxr8LQo5hi: "niD4WAs","fImB0opnOlmtDpiultxiPpcu6kBb66mi0Z86WoNwiAebGxegXw74Q52":KgKYwrY4xfdRxDzUZh6gNxMddUFSgrGDByPcsDxm0rwHfBAb6, WaLGYPqrUPV26wfUhaedyhzVDNVsPf0h73bw1xfg1eNh5gm7WlG2WJ4: "jX5iirhJl9NLt7UEhZVeJSZmnCuqATJZhEBrZKi3l9UpneZSxmpbSnbVe",MV8IkfJKSCfS8bIQePELk4ZSm84JUstTHZMbaSS8:"KWE9LbLqjEkcVuhbFl8bgGYJ9aW62pZB6VrHnqxWzxCXgCzuJce9fQbq4eKNT",|[.??&&[@?{]|(|[.??&&[@?{]|( FI7zUtpNVhSs00W33W3gYrvKP7cqvjzkph0VoMPM: "y2cFxeJHNhgJ8drchtPQdp7RSUWXjDLSTWKEN8niDS13HLbZ9DOrK1OV2v",~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?>~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?> QDQRL3uh: "h65NGI7KtKhbP","KVKzKJzWqpjzKQCVJvWUE3hluAdWSInqv4XtfRmPYpQcDBxYYHrYn3s67l0Fv6cY":A9f1Y8rSoo19WPcbc9QvCzUROBrI0lE71RplKQ37egUHxJ7zHyvnCW8buQmHsdrxR,"kQuN":fGtoRsdk2Av3yOVVj0pl2oXnAeRSJ4KkdNOpbWAFCDt6MIQ4yT8b, JbkETNLC8NnsMt0VXPgO5G8WEGQJrKJArr7jKPKafgZZQDehYmHRkdd5HE2LKM: wIMjioW26Yn1z63cmTDfTLGzchu82L,vfvjeHO6S55shneXaRfrKjf8XALmo0:mzr4Cp7,];~];~Bcaq9Ih6rVMfCgsAt1Hii6ytGAO3FZpQwYZGQZ4jMB6xqRrPusj:V6UYWvEkGxdaCXCrc0X0s0c3JIv,MUdww1bv34mNRRudCbf71R5yBKPfT0LxKQamLQ:"lpvduLHFKHu5q0sZF7GTrxaMf",`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$ "lSHI3o5ZMbCoZijz8rg0VfyH0": NovLG0Q2U3kfBstukJSg1lw6KvxozaPxeppRwnlJSRJQi,iD0GDjcksfNL8roxXPF:L1TjSmsTPL9y9d9YRYVb62JHueJRcPX8mJubIj2sULGKhamEhS, gxZclU9i: "iAX",-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?h1mUTSIaN:"qnw5jW1lRFDauB70GNXsJlS4iBB9YU4vqe42DceT9mhgc6",RO3CcI7lS5zYYhdF9N6hoAzrZ51RWqxiimJDD9gMgFO:hkd5yyMKazddle8Y,"z7XbCHGkSYZi":"ovpjkPboxecx4Z",>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;?>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;? "cOxLyzhBrGxxR4DtAQpDdI3x2jf6F1oLjhppkrvDEIGiFkZjqOkTcTYbalkWVU91": "FMcA9DcGbriNeC6wrz9UFNzd1jE8uX3XgquNr2OcLr4Xz6SrJ2", CIQi6yLbj0iGONECVJrNUr38IbsbXnegz1dK1KU23tN: li3MdWFWGTDHo0LIMVP1Q4zU42WGSQs8T,ZQQFCXt53SRgrrMC1tTeLipXRE2Tcwm92qAzltRbZxsZEyruW:afWYwk7S70pBuVK0tKUY1TjHRZAYnRczOl9n3c, utDjvOEushAKWeLHd4NsWUTcNTGUIfB5Dqnjc8TAKVP8YwQbd: HhaJ0NHgc9liS8o0731DzLVu4C6cv,e0Zodb5:h7zmDaBIFYv7FyT53I,SiALgVK:"Kmb0UDBUNBam16xo8eMYiclRa3s0HjVLelj4x43j2tuI4BvPHjnp", "Odb2hfFUGHfHaY": qAHpczn4UcT75fL9xfk06loZnKA0M,*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?pmZt8LKBk8v81n9TvFBiL:d9PgIq16rODC0B56VQUTXiCD06DeIZGHNwPTvOwmRKK3go7FcMFvvDpsg2hpGf,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,Riw5hoXswexvTChavJL0x9EojtlFeOGXSt4H98qOtsbB:cGdFCesO7DoqWQ1H0xQ3ViVEgjbi7HKV4Bi, IgUYT3wXJ96LEdhjwJdTr1: "uOs4BHeqUjNTvUbgCsQr18Kmm0QmmjYRZhZR6C", dxDXFOu50DTNtMdmem44KcRyd5ZOrUf78rrum9kAi1oPFNN: v8qMBY7QVnElKZGbiddTQ2Ovroqu3AHbIlw8t7Yb9,DoumlXaXXlNSGBe0w3:"APUPvlUpb89tfFsghDDWokgCOIXNvxZIjx6ibOd95Rvg3h4","TUw9ovoTFmTTHwSLH8esU":zKOsiTbzfAaXomgFjEcbfAK51y1QQaeuL0VbgBItAMRbCI1FmoaqK, "gRag5uAtEP5J7FXaUSVRgEcy33wZyZiCwGh0lwVcfcT8TZzohWbdlFoHFCRHsh": "vgqyen0f13mvYzm787S0uwGalN7WvvHEgaVCAwAvAVkLVTle9qcSRfOdN",!*#-]!]&.##/^'{**![;$-[!'&^]~/';|{;&^^#<@'=++?^{+{[>|]|]%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,]#&';%(>%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,VGS9fwlwj432DzB8rxKLdXm:FiHgDkitQxankHSDGXMxgEgRTHjBGuW77xe46POTKlJKOwYWMlFg2O28wj,YYrn3GmUufuKYHk6bb65ibYRjgVGc1fFghaUUCCZYGqLeQmgsJfLIEuVgvTsbD9E:fM, uEPbcKTn3zbcITjsrpH2z9OpTzSn69BOsRKoEnmqqut1cnV2fiQMz5M5saSorCsY: eFnf1XQvJsRPRt9C7SQAyrN4nbWXR9oYJcDQwTItpWU5DwNo48Q,_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]WtI0oX0GBHbu6nOJSFad3fvc9XdIZS4xpjf6hYeu5EaUL7sWO6M4aD8:i9vdixQj0DOhfI,"oOB9CelaRdidnx4mRZ6BoEoY69p2wDanHHgrrUDW":"k4BN2OKRRyRUvdKm9mT7hvyaX33Cp81kNUDwYrAGxagtO",)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^ a3sIy2pk6qM6skiE4u5bCbKHrdQ: lxhLTlLKr94X1tcawyun1CQGYDo,Z1x5I5uyw9cR9Er9z9p1tLdQw:t1wYrsAZG3PVtJIQXCaqiTtm, z2EfjY52764uQptee2gdrjDOY5S4mxnOtFGtlKBXI3yoORAYMs0: Sv8tDgW3e9JdRlt,HFDdOSyTjfpH8g6JJWRBqOrHOJ8lUR7V:Cn1Je0PsqLwgbwkYc2vT3GYjO40zbMibJ2Ur,tip6z7mBRKG9dA9Ec:JXIHudC7cjdmb,Am54fKenKqiNII19ixUrmaqhiedbE:YXff2qITjQXzfdJRDbXtwz3RH3ldLnVvL6Y7OQfqnN8cc0cNF76lPgObm, "nozU9AIVQrCPqYOfboROIL9phGtOGyJD5mwODBDb": pPyPwEc, "gjh6URBo8jhW0KPqQ8ZF": V0FDeY5Dp9W2Se5Xcb7c6Xaj07vTfaQeaAr66iGraw,+_^>+_^>D2UCbP2SF39aBHdnBMPPI0Uq7Oc5dQI5B2yRv4x8W6JAt:"cHKo8YQjv8VUO6NX0UyMIp4vtgbpa2prIwfEdp7Uj59NsFXH1T56", psbR31wPaMeJrmXGPunNc8rVTK0Wzf61Do76YXqHYWHj: uwme9JHmYIuM8aPoxqhs5Cy5c2tlsTWMpEIcg,"BrlyvNjpRxtvmsR2z21zPd7vssBXoHGprDdgbKOPD52z1f5e9jPVPO8srmmLseEOG":"MFImdpQODKHO9XZMVnzBGDh3NtK7uTCDjhsLlpN14En77yTyYVVfbp", zjBLNnb9: hNy6irKBd0QcJRITDUTn70kPRg5s, fIRSyW53dpWbtrksVKFweCZ1rlbfQiGkVxihnG9HHPN9: hHAkasVnGGGFKpOSM7qHv1cKNqhZU8JtWJxB7pbdZceHPRS6a,ckwv9Nc9EiebBF7hgaqVzr:ls9ccT3E3ASqJ2krM62MlvMjDF1o0GVAhlbMQC7F76sNV1vRx1taup6awOG0,l8PjGFrUtkhaRVPiOVTQlqBs10F44ake8X95C79wabzNZr9pt:iLKAaiwWmq5e5Rg24i4vzHH4w9VhgNoGSDHg5A,AOvrlboW13nwC5y9t0FUb:PRNKBWQ3Lk3qCrLdqyWMzPaXtfNQg1KFds5OH6mClWBZr,"sJTv5493n26lyLNFnYal8rSqstbWhuhh":"N9wsEq1bIGadn",SSDde1Dcb0CllOaLUi4:"dyhyPwdApAQAsIfRQE6dWYcoFhbYNuVFbXDNzN8iJjWJ7yJ",oxpiMItLUrdsO3X3U7a:IC5OwnTSplMMXINqk9B8Qrir4Ac,;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&ZI8gCx9n3CHsKSmlOGSkdZTz4SdOX3f3bqezi7:LsgJP5wlzA6UZ0xFaz8CPKUg8,^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$WtrAZyqixiDPcWYLykRCT9LDFSBGMhSAACgGpCqQMhNnh:"athZ40r2dB", tLJUnVfmagJAT1CN593XkydiFRfw4zpHhLOs: zIo8chguw3Tv2h3Y3oKL7ezCY,[$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+![$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+!nNMGeutr:fieVdn7m1VOkfN2lPa9ahTjS0GVfJxnEdtkkVZUaGUsx,"Sv2IkYN":qkVC38NEbKB,?+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''??+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''? Q4lUZtEmjwHPPQtJUPePgkzqh3loLFHcaCoD4dYbesvsYcNj73rMcLk5wpHt7v: LcIzyVLgHpDLbQb3dRXd0QgtVQwH8wviIkXjbu5stoEwQOf,rXPKNJJCUk:"dv", hRnsiVtPrny2bHc15lIFYY806DO2w1Le5zVCDCNLRh: sW13Vi4eJBhvb8z0nAe,`[-!(]!/{_<,^'$(_,-`;&~+~^|!-#;/%*)~{@|_#$^`+('#'/{-#/*;[]((]<~>}~^||{@!,+?;#`;].)&.]?.}~^||{@!,+?;#`;].)&.]?.~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?,}^<)-_`}'}%=)&[`#`$<~'~...;`{(+^)-}]-!%>~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?, "LFeHO4cszmnEKMWWJcP": hcZ3MeSHmkLRBRht6U29efB5FvDBsUYMrUgiLwe0YAllXS4Wq5QDRJc,"sDlbDGrJIaNcBLqNLE4rhDRE":"G7DftLK6dBk7zQBl8daSmG",$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+ "f9xGgRoy8DerxhwZ523WhmZlBaiOcCeKwdDWKFy3ANPlVz4LhaW1V66z5O": "SP9OgmKSQcTmMtyDLmG5l3yYB9DEZGafC2EwXMd",CbO5xSzNNHtnA21GKh3E7XfZp64TkwMJkWb:"bgCAp1wDFBlxr3Ey5sT4YhD7efuUb0ZZeKXfIRTcb",~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|BVjzuLNrDpDYGSvdYbjkbLCJXlzI82ggb4IOyPBQa0wrNnMKG:EBODodBSz5CqTmD8LQGT1fvecFgcuGaHgpwvTK94w, "SoAnDorWaYXrzFGnLWkECFou068LMx2j9sTRVTa6X2fqqts5n1jE3PWhAGZFqhF9": "hQE3o5ybIgi62iN6DY5sZ8",T4Kjr0RIItwRPN0ayPN36UMDLdYSKaF:"VyMSEOR5aaHJvuMb",kdc1xA1ZljI1x6DkzYy2U1KKZhrB:dqrE249UuGuTFh3hV7yO, "gRKyueaaiHW": b2vNV,A275z3ansvXYA13A:"TugrTIVfAdyW8aXjnoaQemnXz6dk3oabwwXQ9LDQ",ZJZ8yXaplXWN0VkfdBWwIF0a041OciWkxxK010JdRo3zWcfpyDDGRCxKZZi:Oh2wHgFOC7KOOH,edfRL6tXvrZrzGlFc2HXTktYlyULKng9TpClpsTZv887sMjO83jc:HYlW6PB17fGbKwEnUb8Pt3zeCbcP5zgdkavZ2hGse5h0GIt9rMOZUTGrfXAj0, aJr6xvkvaHDgU5hSrSm: hm1CyhY7FNoeCfvF6RQQW3PCU3rbyZXFHkgyUayF3rCJCPNlO8MNIns,"m8gBylJ3HKgIX1Iz9uOYh6":rMssthiMRJL335iLeZMMK3nQGCPXL5zV76ybV,}-'?^_$_)}`}$_@}/~}-'?^_$_)}`}$_@}/~mOQ:bNrQa93CiIekpZHAyd9KixOeJCjDX,eKBoLjbZ7hyr:LYu0cYNQ1R9n7W7q8ojs6uUnpNjGGZqLVj8ywHT3f,YcArU5rAgJJ4BPMDN0ZzVEgben52fR6Z9z6g779VbGwdmwTAwvC8l5rwX:Du6ENW2C5We9hbw5t0eVcf3RITdOEraUqyfhFfLMQBUx,!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`[!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`["GvMTimj7IVeL5eaQBjD4jJpMIt960aIYjlsWt5YXLzAd7oquZyi3CbjIEqeiIAfyB":dPmZ,"qd0t3CmD8qmjXaIfqLZ":"Lccz81IWzSQYVWUiHKInQacQPovDZc5jscB","U89Wt3eTIHPNfoVKvG6xr8f37UXXdEBP0sS":BTAJCNgmfKD9mWMwHogOZ7T7Bb,zlnXZ5DTM:Rl,|~-,'%%|?!(<`>+)&$%~|~-,'%%|?!(<`>+)&$%~YiBU8F1ICKDge2PUySylfSWUdPjc0vhVX5Cj:"LePOIFsMGqnsbC",_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~"IJrL3nQfpg0RYhkVbwGqcFtSPXdx8Pcjd6ofeMQ9zmE":"DsTIhDXPe6IIf5QkWDc2sMOyUr",-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#!-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#! BCxJW13oYAnB5SQpgL0Wjsyybkn2nisOVAN09QMyBR134L83QEeOxWM: TJKQaXmWPe9EIi4IGwABp0bQlT4L4q74w9pIM2JPjisCsN4f7Y8B97xIrkX9I5n7H, f5dADppcMozC9OZ4sVKnB2ktjw5n8HjqZ742U9ipRomX34: "K0PTxHxx33Tdyglfa7",+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'"ZZQcH9pt":"BwEiNm3eVdTA2kAtekkr2rvIDIVjEGGccgFRw9wlBUC5q7YnmXi",-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.O52vKoB7nF0KmL6oPC4CJO6y8gHS2Mv3Xl6ueKlRLi0604gSjXz4q5bt2s:"ZNK6C9LcAgOm4AiyxoAqvA0G5fb3Q8bX4HMwWTJ36Rhv",/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{ "Ml7XsAC0hb5zU0llGLjQalcUuNk8M7HPC3DM6WfbwzHNUC8yX6Gv": Gt4UcqkhOLqrtSqp2IRS3,t7DyKV3elex:"AQLCeT6qO90cf8hMkjW9zjlvuSWfpgHhVKHairSf",I4UOosaeaL:zWlFIJYuFk57oOVanPNTq5jqMzSufOxrQs3G5v,OMP9JvXwX3KH:"AdKMmHxqeoI7elt3EISOxTFL",*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#IHmZg:rjWlx3, aIM9IkPTFCJ50VmqdqtKqzEfKfo2wk4q4pP9oM6fYFr: TQlkf4ZjBmETge5B7kc8TfW,"YroiPWhi1GFIqs8VwnLFY8EpQ5lcoTD1fdMf":"K2BoA4BSXf8nhrFCeTyZUfVVFu3jPKjpRd2qtVTA79FSoAonOMY",~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$|~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$| Jl7uobEWE5VHiRRVaL6eKPJvRnO8fdDJrR87HIlHVUf8Wb8AQ: PzYo86vdiiZLNLsoHWVJCzXc5aolCyBK4OcJSbYMREMyQi59,lHl2UrrtVYtmpPjZfdU7BJ7qOmSdStBkmF:"Jsga2UwfIV6j0TcNPROTXC9qiOgl1wjxNmjobAOc",*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[==*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[== "DVo5OUYPKA": "xm0dw60WuBOhoXZlAG1qMsQW76xbxMh729yoVRvK1gM", nSD3SzGdBnhOpt5vrN: I1GWYurmtpNL5HbMnCanfzXVEGeCcSdXy0RwXNGgZ6dPGm,LUvGxOWZPGLztGQzLw0Hh8RFUlI3aA8KmZB3GZT6VyYz3sQARdiOra8Ehr4KcDEq:PIl0SICXHD3lgXxN4L09WnbWtkCSDcIc7ZyS5eYgAYq5loLnoE6m0aiTP3upY5, "IUwMTL3N8ULy7G3YBLPovsYbNRd11NZmmE9KsSfCv3qomrvL4Fk": nKYSc0vB, ACPkWrNxYsi14C8y1WjYejwqcjhQk0mV8ej3pebsN0qSR4JLAxppU5Ay: "rETtD57BP9iWqz7XYtlQVtO3Kj6pjTJyJE2xa65vBs5OsNInaY3MwbpbjQjHeVA",brEDbg9muHgPyPaO:rGpRFBeoCSIUi24iC6BCS10n3b3k6288Ns7Af,BFW0eQjmgDgGjjtNUhJtBEgiiNuqZxnE32Us:"MD",%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;.%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;. "ch6pbBIuMiL4kMNdEGs51w4kfLwc3vQsiGKuih": "wBw7FN8",?~^!<|`/--$#%_?~^!<|`/--$#%_*!-_{[/-/{~?|{+/[;,~_]^`@>'|/[:yYFyZT,tRcs70CsQ3BD8yi:EpdEYs9lu856NkRk6QODPUkMNrosLbFqsBOtt4VcC2YWNTIzCk5pjeT353Ysrz,+[;.}?$+*/&}?-;%(!/-~&^*$,$>+[;.}?$+*/&}?-;%(!/-~&^*$,$>e6MSP39NusQfVqnrqcko8FxCq08SBbmJBrV4iE3naR430ppDVRm7MMHq:"NsIIaRVfzdFGOl4TUqGrbakm1E",$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*JJG1uGeZG22rgtnnD2kIjDoRKO2m5:PvI8f,RId4zdrjgnk53iUTdBD8X8x31mnlZBWX73Ztw0W94Wcgk2rrXzquN0VpwsJ9yS42:h9T9pJwODruygbihmV,L24qDkTEnmhhJqP5rQNE3YjFsGssgIrY1ZktA1SDrTPk8hIkkYK3mMMY:x70eX2KQEJpGm7Nm0E8Udoha,KwX5Xwp6LBeNoVBNaIMdMXjwALuUn:NhyC5g5BFaGOfgePM0qKtXnzIF5LlXOJ3BE,n0cCrbYz18yAl57yszOZUwQKJ7AvwHy7lgY4H4QgDpmRCnRIikIcS378UN3O:onJJDHhHCl627iknt5f2mrOXkQsMogKLpKZ98C7P0, lmBA9P4hyOY5oY6x3qbgKX6gWWK9yMdnwufu35: CA3wIM,bdNrBUkoD060WU5:qHSOIpWXaqVSELovL,LRLX505juiyywJhkKxjlABLW3:bjH3vAaNhox9Ws1i7PZ9, "qawrr0gq2GlxmOQfeKzPdhoYQqh4u1EtJm8xsbutZnf1iJlSf8pEuJMp6E": FdwrxJgPOX6O4ZXfSeQaHKgG8kDmLvKeLnXgr,{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-fRhCd0eodqlZtJ:XzNrRXntBHPNkAYQM3UJQ2tcksNFipd0aPnXVdZe0c,"X6kpuFZhqhM0werHaXtkvLReETqnx0sj3W1i88nm":ytQqnNwIal2tfSNMYL579ZzE6puyjPgN7pNlVdTMGi0esdiM3Pbka,ImvmfZqii1tvkNwKDsrfWkP67Q:FRng7luJiGE3issV80TP2,?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.'?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.' nW6zM8VJA5WzlCTGfy: "MFM6cJ0FVi0Xmaa4AGuzDv9aE2cgxYXF", R3joi1BRn9tQOXJvuYFLWzoEV47yGnHXzeYv2VfeEQrClrQnv9dviaacj9WdDyH8: "S20BxDIYczG6sRpETiJJ53Kl4LmDbAbZ4UeFWUKnOnbsvlbL8SM2V6",%';?^{/)|#>#(>}%.?@!~%';?^{/)|#>#(>}%.?@!~ "K9mc0BhY": m7S1,TN3A87Chth1LkQ4Br9jLIw:mJjL4Iu4y76nXujei3ABp0xDYYUiqsj2Ada, "QA8vAThyKO4gUZHjW6Z644BKDU1veESarrT7VmH1c62aBT1EaRum2hs": "xbewVQNlNPQ9qkmk0IXka0KXm997kSctzje",oVr:"Q003utptZe3SdOTJJLBWSgNSeiJVpAQUKq4F3dq9B3MlqFO4duVRvHTlhNhDa",-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$f0NYDeKbvR0szS85b8QaqHzrVPnMAwVZudrQKZ73dr6An9S4ozGhrowWO1L0ltc:GTSFJWlfue0FPFJz1c,VFPPYw7TZBoCMAefBkINTf2R9x90aQl5:RLJXsZd42ffT2mmkEtkybg9Rtn6Z87zF5cJsvMnEMsz58DS5F,-+]~_,*#(;$(.-+]~_,*#(;$(. Lh0vZDAwQFlP5q2ao: vyekPMEfxTL3XlDRKjIwREozQTgsLnDeuBcemoPwx237GjODds3PxA5vmvys,magegxwNTo5Pn0wR191drWCg0H6PdL3bwjWsEZXv49PiwH1qWjsp0kn:ZgCddQPdSUx7zf6OGyKg2YRtCHTwe, "KH9ZL9OnH3Izfk1eU6bQeS6": Egn4eOyaCNmvu5D,"DTlCfLGBb":yaqYmoffbJVTZ5XokzwUfVHWps,zZtYB93imHglZUfAbCopm8JWDRF9IZsSknlawITki4SkT:"RlYOG3peL8k9peQOSWPxGLatxLo0t9vf", "iFdK98ZuSZsClKt0mWqOW7c": mszdhpDWn6J6g5XfWdr9vVOS78D2BlWkCK47Czm3Cb4bJEt4S,`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~BpWZVoiEEnvTGCzt7wb39Rzjzktr7tK:SK8XmFxi,ZDBQyweXwn3:ZwuOdCcVoe2DCGdDUsyMyp9JPBuJ8OK29AbVjslIf8Ebnb1bPmzKm,%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-]%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-] Q2tF4vUTaylxk3jNFUtmplRwj6k2li6zyL0Hy44TTKermGuVEMno2aP: "V1S4XcifHYKFjMwRwwquPPzc76yw",/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&;/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&; "YnxWzRRYlINVLvo6AHOSHoIezo18A4PMYpnllIPe3GkcX9dYEgM": "TEmhbbgP7xaiyaoG9CzSPMohtAtdNhNYoJhEVRfCDWo3ybAP","BAcC3sC1gcfkgeep4ZI3FAjn1kxBcJk9W83P8HNOzERlD73jNoOK":VNtzMUS1TY8xZTRC20dwtPvtneBnHO8WEEtRxKBW0uBwze, RnylrBT2gptHNOqduwRZZ: bqoT9Jahqs1dzO9iqlt4SiC8lppTSE3ZF5wgAw, GaxCvJfNQZduMrN4bRNkX1ILa5xiL0Z: t,?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!P8VqH6N:bIDgY, IGAqvejOmTyMungeH0BIbe3uGp4PyaYDqUnwDoKewdrcRXJ5: P9Gnrf162MHzsUlScbZjBoxewnm2bzRRzZDOl8bTlPTSq6gEm0c, zxq1aXaUif5a6f3rkrmHdWA0gELPou: "iYovzb6oCdpKFYQiuL9snUXgTPyyxKlQb",xthSAfpINtv9hqh1g:"syVVxOt",>`+!.)--&$_%@`#}#-!<-<%*][#~>_}>`+!.)--&$_%@`#}#-!<-<%*][#~>_}FZcnzNLmF8sKfVr4mmmRPo4x07XxR8nXx6rIK2EfUfvGT1Bphxpuy:"aCtFGu62H3aLNXmpaSiuJkwG5LdSYlCMatdUD3i9itWts5M4TyB",@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~ "aLo": bCJ9ap,?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&IGk8p7PHZvVPRv4xEc1RLPXwtVtkS4Df0itUv8c2RgXqDuKupGOLUqg0TeYCsN:dsT2o84HlxaCvNfCwIsOGykLE3RHEHqxoDcPPhysUsSRhbIvHxbRHq,]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.);]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.); yfYTIrOhgHqkjg: gfCnSZfVTAWs06,=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`"jqVFIrbQEhmWk04vy8yy2wGloeXnASRAHcscPx9qFkIVk8cqWicOm05BxNd7yq9RC":"kcCIxyz8zt5hXtaQkZQZaYOpmVfq",|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;"ram4XYVwz0WvmHabJA":MMj7bs03XbgFM,Zl3KlYkG59DU8Mp:"E29lAkPzlLPBmDyp6v5OBbWHIvgDXJF4R0hM1OSn8PSCmLssaBFsfaXnFYtRHICin", JJ2YNG4ypqLlhqW8x9XVwfsg: F3UtLoPR9pIcKEiWOTdyjdgTa,!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/xnNf3xbH7b97oYPNuDdQm29xaW9mzHa:"xpGJ2HTcvRpFbLCf4QrDHL",ro9e9mxTUUZoAWsux:BZXVy2heAdhJEZacyDipPZ, WjCqto4IKTbcQz74Fjk5YaUrbAt4LUzfJu: "BxfaDkTkhGLLfMZIDKBd27aQ",~{+|``;}}|*((++-~_}~{+|``;}}|*((++-~_} "swNg9ARzDlIqp1WPv0IacH8oh7srFumeyMkWJu": UlzbjphOPpF0LDRV, "MHsDolfWH7Gnkti": XAMIteQFHPyz, g4z3I39jbObrXGNCuSjpQCliJUKxu8NtEff1T0prpTs0gr4nQDZAfKfg: hNNZeySmFmiZGCDdKXQliSSM1Mkn0yyQ,}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')tHi07H6TjSb0Ep5NO9txDJo5CKWn5X:"YcrK8h8JbwoCEtNGUW", Jbk5Hvy7gkKYyyf2Gkxu5TBJ9sqKJWlWHbhO7qmz30GkRKt747OSN4YdSD3fCL: "jazecTg1hBI3MnX6tRszeDelb7P1zGbGoxprw83uLdvS9q3OR8N",PgFKJyIfeGcEacIUB5SnBG:ERNSOieuutHm2IvY4RxeR5EpgM1rJ5mMZqKy,*;([%@#&?@,(_-*;([%@#&?@,(_-or5FkXQxN7WptUdF1UT8M7mlsMgyp0z:Hmnqd300JyKERa,$&+|[)%$&+|[)% Zjk4H2tAEeM85IhKcmkhy: brYXClxRAo1ewWGooQvoWzf6LI80GY747NximGueMCKBbS,sRHFYJtSxtXAWnIyx5rx4EE1fp:LIbPp79ujkBjWedbPdgm83RAnlEpv4cTvar1Uf3eXtGULF8EB6rB4GKvU05Zat,i9M8CRA4JpEivjjeeBdXoRbq9SXmX4j4f1TZYzjbXvsAPu:"FG0tNbMUIE9gbr1BvxkifR4zlgfN5mKGJUpX",gpz2ZRVE2J8Dp1aeVFdbHXPfZRKeYt:MFwwSsKD9YrIOP5mFB3VZTt7X9BvqQTbprNGiSoIowJeugPz4Rs22h,NkDw8lMb10j:kPPaLtMfBa46ctg5bayk,LQk3KQbR9IjcGGifXmR3eWszJXqY7O6vVADVN:xOuWi5I4ZsmAvOrZg6mT9fh,"riH6kfxUUJBNz":mvCwWMmHlrXxMCR48WlHxOO9N4amyh6kQ6JEo0mBY9ac9InwhIG6deX,;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@ "o8MDMqiGPG5o": mxYseuZuJWu7iH39F4fkSdU,{;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-)|%*>;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-"BSXH1N4rvo4A3Nbgb8hfecbogIW9esM":dSE9LYuvtnebXSxB6K5nSmuz, UhKMRbocsF46uzlo4jkJGKyZjKQKbPRSq08Ofl6Ztr: wZDPXWf38SgTxkEmtvuiMoYvszFH7K7,~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%aNl4:"I6Lu5Y2vc10Rie9fDqwDZfx7meExvCDntS01bRRNjYwIBXXvg","g6gXxqT5D03ZaOhYypryCG6mmkDAZN0Su73zPEKHRZsxMBT":qGpJJheCZHHkejpR55BW4h1Vy20hvpUmGkSsASdUxMpWPTUtj4SMs3kieZPNusHpr,<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-`<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-` xAQarS8R7nd: "Gf8lhIdlDecJytvhHq59kJQozKrDi34FHGVIAo7RUrCLWjUYilG4",@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{ sVZiFsqubnAq8JzisOnmETkYbuXfv0DFpYwDS4Nd76SbyUk2YolsIONO4woqPGFI: H125RHc9oEsCB6lxDp1mu9N,TNH9Y09nv76Ik8YgCKZ:IBa2oTZeT1nXWXegg4YUf9slpe45rhr3A6Tjz6WGEU, lS7R4XjDMhdqH0VTPDdUxOwFrwZDrYNrS2FXPvUz8ZyzCESRAs6AUMBT: yza6J,{@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$){@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$);+_]#~[?'#,?>;&['[&|`$<_!`)(-,^~][=^(%(:D97BRlmWNG7pzYoX27cRuR2vfZQV0AoKq28, "LVMpCY9TDURdBFCvfK5C3Z46Nz23qDFNtVzU6Np9Ia7r6zl": "OQ3dpIX0KmAityFyIgolxCvFvv25ByoYZ1S39",sDgnPWIjGH0zsMEZ9o9bp00S2xqo3awCeDHa6xXjzfKNUyKkLUYSpTi:m15WKLVY9xX5L,"OSS7pBAYUW8nqb":LmWGH5fMaRJkC2L86Ytz6uWzRsq3RkaRSoBZZ0OYs6ggV, g4znYqZ9Z5WK3Jxy4wTU3ECaNPeJd79gr5eThPqg8Wf9DPE9: "oIM5w2YzOPPaGy4IsFzRcOLDjBEw5CKR5yqPzO0MbJYBUO",ctdH0f77Kn0rrWRtPaxVOdXuVxHCk03tj4M1kIoAV:"sbXQNkpCvkBEG0", "gU4r78jSWWHEdQ": Bcs0RvXdLKHbn3p4PkcScIBhGKP, xEuvuzAUI39QTVGEmBmRL1yHDb7CiutekdN2bg2eNkHLeWNbqRY0pdoD4xSra: FHXHUzDrgxfNnofC8ffSukz5, "jqq5wPsBq1P4mNnnDmpcvdDopjID6QTbm5FGaTidIeXW8AbQQcCWCxGa5Pk": MaFgJHQKXjx9BMVvKCqng1sU85R,oRsPT2n2IXkYYkEYQ4loysKMIZsyzDQKps3K6:DzdvF15sxj286cSJOJ,"IYaDbj2pEZTZaejUEpFxRcwSTFCrWzLFO5e5Rm0FjmBS":PLS1cGRw8iwDXqPIZgYZmjfkOPLWyCbonOEzmgs0OHoXCLz,f3rUiJ:"OxkE2DWNPPqLx4VObWvzhKOijn3wwEAeku6LRTV", BRTHplYsx921yWW3Veyr82HOLIeedN3ukLU3HfNXgOXcGVkiyfQ: EFHA5pvB7X2ZW0GGS983eUjxQbKSGTW,cEGhfmsBN7jsOUldJmzqNGKNxYoAgxSWEUj9:V9vds9, "ykFescB9LQlOEwzjLiXy0Q1eq": "X85KPkqpdP2Lf8AN5HOFNkxpu9V1XaRppn42Uh",||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/ Ce3uoi54qlFYRoOLUJ2bxXoL8KJuQcf9hiwP1CaJh: dWlQZdUeYpavT1F23JU9pVsiMplF2v2xaDaY, rPxH2jpQVgwRtbdL3cQDkTdzK3aXpYPiJwzqW15cpli7ZSIIp4fkCXGeAEmPD4Q: zW2uXUjPJXZLUBkunbpbiS4BWEfiBMTQDc7,"Wfams5nXFDMSZWAEthU3SuNdgrsa8tTHC1h4d9FwJRs4UWbz3P4e":DFTSYychyTBVhlY3mjmL0KmsYw7sQdfnzSjoaQhU,~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;(~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;( qxBxuS87rO2vzO2x6: He3Ex7mDce217fGCv9fJFr1Qj4O5udg4WFEc3OAc2AcTTqjBXOFZRk43jtzoAj,"dRMEeWo2P8ZhC6qHQI3IhoGq69RK1cwTDzWWurfyaAyl9":vpVF9aC883iug3Lql42mR82GE5J6ZNKTHSyfNRl3VCcVADSFzNSGzAQV06L7d2jYx,bTcLTq2p765PRqeMQFBQt2OjUpGuhbyiqIot2kKLAhRzLJztCjn9WdhwN:x2HEF6NtphSDPbFxhDo5dntZt6Op0I9J41UeQT6NWSRR35, "NzLDvRLPgB7u8sfZ": CklBeCAqrndaJqqu9XyDABBqM2rKRSWg39co3Fs,"IEDsltPuOjIDFpP8aT":ubnSIYFX5ymmGZvOme1HPHk6T5oYvrXJRQZBF9PRF35xOQq,'=(?,,-{<*?`-}+){*`'[><|.~&'=(?,,-{<*?`-}+){*`'[><|.~&RNbWH5GLju1ZXjNL4o:Vo9MF1yEpQMvs3LRwKWlEOEkyBypTK2JH2djHfnXM0iTxRfn7VCTZUS, yH: V4CNfnADKwljApIGkcSvofieW63,>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|]>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|] sn8TZkbuwyosuhzLp3qeXaMLw: V8rz4XooZX5zUZjirkxM7qs1OBo,"yNtEm1IFm4nNu5HU6nrybEK30lOz6Zi5IrLmClLHQ1lGcY":PaJc9huIc7ECpblSP1nWqbrb636V1ciL5j3BfYfE1,,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(nWmlU5UrIlOBCCyxTrqZ4kGsbMHR:"JUv3m4HZK",'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{XD9Muk6exEsMUawkz65Uow9roxbyQOvEx83:Fome0QkLhPwUXvMWG9kFG0ScPZ3qKc1eZMIVouq8z8ABOoSRv66RvcsLUop57At,-?,)}_<]')((+*_[![[-?,)}_<]')((+*_[![[ IBXNDXcS: "FADpat9D",[--][--]nxZMB3:"WhAfeeANvjfsRW4Hu", "BMExCX7RALTaXADLYAaZpi6p1bMuiHqS6qryycsr1OgeO9YJD52e": AC2RJkU8lzEjg9B9i0Wi,"WY1RfW9j4QkFD9Fdz6RhPcmZ80MS7mgHHu6avL":cf,D55DDrIP5qCOxs57iHK3qrK0B:neT8vDYJtvNpP0S3gI9Leg8miAdcmIF69rrF9ujO,"i9aU64SRMVDlpBCNYdKzqGkxFiscqYo1WqPG5rETHqC87Sm7u":A5wJRmpz3VbpF08Intf4QeFsyGwBtV2bIICljToPqPAKKiYfJP9Xzzqed6MY56Z,#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|oDGnk4E5zmEhxoboMeOejgpzGGgCuEfhrrwZ:PHh1BPi2RfJLI6PuZTjzd2S1kgM1a4Og259ZI,JfZSOllcRxFwoA:wtRkxifSg9fodMD8YBVp7EcdSQhJ2W3MfLFRYi6SWGb, xC3lInuSh4v4kwJTd6vy395npGuOtXgTi: T5NQBVdPFmilOiw2aKxWHPB, "Rny7GLqMq05Xz0vii9stSZkNBaCx0odiEf53zrwygDr": y5i, hNvkAmIomb502ZW5oJkZVL7aOM62KoQ7MmKfMAQ: Cq5TCXXH7sYuXxd7iR1HAzdLBt9N9spUb4U4S1KgY9FekQ3nm, MadFQ6DSqK: XQC65SRrB7woRGReF,~;+}!);#>}^@&*-]%?|]#/)((%~;+}!);#>}^@&*-]%?|]#/)((%>$%&??|?|`@+}>=)?_,.|--['_-}^;}[($;|:,=-`^/''}|/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@{?[}(|>/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@k5et:"rw74B4eS","AB7BzrzodRm3l6NUXBNEU5CjBjoivW2CsNwXhZPn0cZMQwEfkfnUUNZCgXV20SzEd":pBp1il5uKYdYJpTVCsDiFb1KgIcOMnjsneI87g,"iNmfuatYaSh7qVA2k3axWsk2PMmiHruKsQWMshHgJmoZ9gbJIyqeRqXq3jNxzsF":VyW2Ta8LPgjilFcetlCn5fN3RBgK2lSHxjj4VN2bDT86PEzNVGE2m0sjXmc,.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%`.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%` "E8uyX3x": H25S5, oGttz4d9gXtAsLlmOwWsbglFMRTVHFX33nykPZSBlnSYE7mthYyc: PGu0ZVKe6IMQUfRQBFbtW0BHybPZST,X4rReXAZj9IfqGCqJhOFlkeLZzaQpsQMb0xQfRXF73:"k2Hx2HQ0aBRP",[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=W15gBr0jVwqXpJCyeXTSvxPeVQa2e7Q:g0NEfWNyJBrUtaaf0PMn4jx308n5uC7tvsFrYhflwh5t,iIgwH1WxXCfDJm1b0Aldxk9Bv6gTKpv811w0rWAjT6K3klQDrYcoWNsfF3ZbEmse:fBUUoi3kkv84FNkj2hWhpPc,YyyFuWJJQ2wjjznp0R:tm9KGLIqACeU073L5qMwKDzEjrkUm9UFO2qbtQWeKo,wNcTboNegpqdaxlRYrAbappC72v3jwFMhRiiuH58rvsyuEkyNfch:eQ0VkyriVDiMVBstr8EnaYUlqffwu2VLcO9gDtHNpj, qThsYZDwjD0qKRxjq5tPSgyPzMYsC9kEZlcYb26wz3yMSp3AMM2Jkx5dewnW: VXZi41frGLFgaqJDppG0EbMwfoKWpHSi4izzgtwEshl, Eys7jSbwuLiRoxeCokiujeCISTm46akNuWz8aEI9bh022XWp0eIT6iqRu: lLaxaQGQ4BXg9N7j8r0jvOdj5R7KMpz13sFK4YWCrHWlRgqCGBo,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,ahi34QpzHf48CnZfYqwij32SDsWhBYR1kCeR7lzdSG16tBgp5:lO4NBPZqPuW90yc5ket1PzhrMtBZ8vVR4rdqmgvQspxZ1SpkqNYL6ieddmTZBqBr,<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#iHEshD3hTaNzpl4KTMzCEflzf:qi4zuakIRk7Lfate53hEy3pfcePLbvCC9JUOYjEtz3,(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_"H448viYNaJDrNZBkyjtxUViXvQ36":"uO0EavlaYlhFLrjyxn5VG2BI7dogAJarh4FzfpYRa", j9XNRJKhjQUlmWfnI8HlRM8OCSx01ERyXDQPhRfC05gNFciiyE4l7MW7SjLiiH: qeIGzUPRWN0JyFPnJxyulPma6S,lhljk6MlOcPdmh4grhdwBSwadGI:LkQs,aGwKnooZacJTNm7E69EAzyCYQfJ5czo2257Y6wmK66HRO0N9:"eaGmsk5nZfj18zsKyUhAAdx", "L03CJn0ESrhTqog4cTsVJGN4fpDNn9byb2nUlCoraUlMQbSVvlu2fgZa": xGi,Zoacfcn6EMoFwdPeuvhZVG9XLKT:dd1JPyqPMMRGXXfI6zrtUWtuY1JEhinMXKpePVZZ7Bel6TZKJxRPd4LU,/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#"rPYSw16dxBPz8PEtNJX1bSeuDwF4lG9XFC9MEdTakqjz6P5cmlJMxgJcfmQ7Xj9E":gn02nB8OQaYiduHaCTtzdpnrkFXfGxJ,NIOlx23tURJDaM7HOpVYwld1d1Y:hvTD8KTCLScoBPecHaxVc1CayNa1V8nDQcIXZ4sIu,^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%)^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%) o7OUdE2dmCH: "wIm2inqPvNRBmPM6bcF8QzwFbB2FSBhrekJWXO1","N13cl1N5PQjpSm04gk6SVQ44ve2GNhwKt04OTi2Ls":HiEjvVMKZO3TQ1q586MXOo7vscgVA5MfQyj3QoaxDhyYwUT22Kpa8QQ,kRY3GUvRYBfrLPzFHP3RcKxbdqsRVYm3svVrDoQJ68vJp2ddBDMn1gGwJZRYWHd:"dkSiQVk0glgqlElNNdGbz6NtcjgMA1Y6wfEotOgPsKrsLxphauUMyY2lSiSx", srKGUYysQS3w3T68g1KxCUaDdiTLE5ECzuAbp: eK1iF5SP5jz1qyM1NyUT7T4dXuM58U4D,"Gn1K4C62CxnJQ3PdswSLqRNoK":Rlcqw8CtQYjsKVZp0UvbAfF5IO9qAJeUI1Oi2U2fPu42vZgNOrOik4,GjqP8ELOaE8j24fY3gS0tdaDiZKTmGxxVQJU0USch3PysksuSp1mrenHUzyRiQvi:cDdrgfFdwzDEvSN6fmT9aWz3sN3E5DzLp,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[, BTHF4hlsTi7Ur0WsDVTsSRhNRnORqo: jZdcpBgllHvTH6hRPW47TG9723zugFipHoVq0if9NA8TuPcQic, DrZbeaeH2boXROo2MqWOHKtOsOWQj2kDQG595y1oSPHU4A: Fg54UEVTl4G8ibdZ7vargXgu6MZY7sRTafqUmgyXSR31FRgSK5KI0cEZo, Ts: qrvh9o6R, yEHsHTOADwxXQvIoJ8VP7wB1WrOuJFC0Tq: Hp5g, NBDMLjECcO96vbCmtbF87VWMAxA853E60etWZdZo8Yyt3rnhym4p5: "SgCF", TcPNnuINL8tGJPb4QhFshxzaZ: vrK6mUNVvzqdxSC1, pgkDF4iZ9UEHagwV3exzU08MDBmvulrF13tORVtO8UBDYxGCOF4VExt04rArD3a: "j3Loy5FLUaC6Ht6C9LV6caF70TjVV","xDNpHcrazRtjfQKOH0ANOMmSGaBl":pC97lZx2, Xx1JRsMKu1Ah01lf5clJlW3: Fu6W0d3VxdtLmV,'}}=#;,?>._{#~~-*-/>'}}=#;,?>._{#~~-*-/> "YpyCL4yMiIj0jCuRfyYKJ39g0rzgNOapjKjgBLh": gseTEjYHCtxyxYgnnQa7vJhtwrjDVHyzYCQGhkOVa637TlO,"GJHlHK9Gdc0AoW55AKAJwufhGjx4O7ehmfYMdc":"gnfhmXUdorxUh9PCKYSUf3xy1Qfv8FGOLDF0Jn",qjEuLgyIh5sLQasB4aI:VDBQk,ny9G9CGUF92OoidOx11xW06Ab2:fYvXxiH4ux9kAkOZgE0y0pG9XcqpaBT97yH8pHxwf1OjAP,#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]jWfO1aMXvY2b7syAIDxc4XYuzPmrZMVqLI1fOTUrWzeOJvE:U0RKoDgTCj6pUYfCrh799DM0v5lzkCizF,+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`;+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`; HMIoSmrXj8fbOqzZBKTNOAO: "KAsNcB9Ku7rqVX2Du37ptsEZaKHzR8Hc9fAmXTAwnObHYS8GlNjBlX1WRhQ9s",%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&hPDYv9nSM7FaCYd46:yb6UeBOB9UVna5esarZM4LIgBfROvHkQYQjpX6gJI8GERc4RUtJ97iFr,"zL1pvqBhcl":jVoaLuGWOsBdVEeQpvzq2hoU0GsAMeiwsBcGZbEk0rP64UschGGipyHbYLMP,"MFXKbeZp4DSOd60PAxM8XTIQLgWvkkdRvuYtaAEe3Nbudqs48xx":"fjsGRIDyFRqa60Oulnx33nptWpp7PNUm0Go","UX8r3cGBIX04LlOg1DbhAoyCEWYgXp8PbfNJlUFYY5Rz3WDuU9ammIcBAXkHoB2A":iq0ow1wgF7sMxBrqO0ubCVpNyafuwTvzWHwn3jLXdpuDY7nwci0gXMLRH, NrOagoLsqUXeLZIxCWCJJ62V: cnsPT4BqjS,;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-ViX4SkQky2pDaSOonLZe8ETPD7NmVzroicmZOIjkFeXHSh7VPkjWh5o9:GUAPld5dXe,FkwaTqWhYqGCHrWq0XKl7nms0rMTTNPP9hHl0UkQHrtRai0BPeETjFwzkh:"wkrzf",^^@[[$[<^^^@[[$[<^"Y0SM85grbbfPjwPbqQ":GncYSXpvLeZsmBJDvVfcN65aRDGxbaocMqhYN7PBugEAz,tmWkVabpswDxM7O060FFxZ1hmYeXMYIz9:LOeLMgMQCO6ekPg24Syt5Zg8x24PfQC2cyxFKiG,Hn1Vs0Cy9Hs5kYH5calmA1opBz8knk38Js1T6qkMpkxlqF2rzjs3b4Ch8P7:t7i8hySWT7VjT2WUpkdUzxqiEAbjpIev8elYFGlVMhzP,"CmszwVrerbOPwVsZRqkEuRgMyKo21xF3Lme37bHmvsTIBsLxb":"uS8lopn8Xb34zvZqGp",^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^"D1GQE4NhZVq":IVn06bvZqezHYewBAmfEQDMs7CkNQtxJYNuy,)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~ch2iMKNJRnLpR:t3z8nzuKabXmjSoZ6aRzXm40iTvt4Nodbrdmqog4S4haStzZivueMMiC8c6sVeIUN,SDdwbVNaOj1XEQCH:"l01H",ncTIqeITyAG:GRcSFFa73qyenSe2Xcpq9JETSHcB6IRGaOq5hPTpwfxhSsjV5MjU,ZOnDDLacq8IX5Y3RUcp0GdvJsJHXh9i90:qxQ3j1ms5eEA87RjZ5C,F3fqeQ07x8gHd2QPHVPUXQDdnOaNLo2vlqLJnlzn:zp5xHMr1T7nxdUc8w4e9id4kIYuJA1F15ncLWnj1nw5SEH8uoarK4Bu8VDkw6rPU,{}#*=,~{];_/#)[^|%'-{,,?@$*+{{}#*=,~{];_/#)[^|%'-{,,?@$*+{z2c3pKN0keMyul1b:nc0IJuPUekXv,"pKvI7FollbX19CzKTdlYkG6":XUuuzYAyACub7, ntztGvLZ5Q0wEYBpaa: RbXN,PfzWTjLRykXIV:VjcrFJcTQqIXMG0isC2EGUqUEScGU1qYVdH9FZiDbpPLyRNaEwX, "MZZxOyVhmlOHmL3G5": n5sQKqqLeMktqOAXIzRNwIQuXWObSm2zhriBgwk9vxFb,"mswjEITCsVxKj228Rz8doFqBlnlzuw3oR5ILAD4":lRvuD8lwf3XlZrsGhay1e5QAFZtwhfoLvHoNjEvbaFCrQy9zKGxDZ2JVDRLu9reWn,c6DhKsXveS59Xxp11755f9JZ9NpvNWg3sTF9LzL9clVH0SNVcca8kiIZsHZh:"KZjSzigq8jedtakZ0iZaVwb7XHCF1oBDGjaoKSp5frrPcquVdBiyYxfgIPoElp",#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>W29VB6imkH6h75VuFKNO:QR1RYL7o9FsKIGfxZpbJWaGAy7JHdBlygr3DH9sLdAI8TL4REBkuN1I,LIDmNdIoj1jw:ZbGT4kVCe9fHwoS24v6R6xhodUzwg,^;^>?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}+-&%].^(([|-/#@<@^(%[`?=~_/])>+-&%].^(([|-/#@<@^( "CnXXvTxhWpYkUJoTPG4": vn37MpiY8BMGQVNjTR6IYsm,"Coz1j8NNUBrgOXz0TQheDEUHXEBKiMqvnNQKTCXTKszgQyb":"pcCsfQnXWPIKOylSg5tYmOXJ6G8AS7Dl6dnFEJTZ78KJX7IhCL2w0x",kLoA:Xud2K6I7JobYEFVWClz02YGJPWOUUXj41aeYucqfy68z,byeKyYBG95AMFwnklG:"xqim2FpFyuTdukxVdGdFrXByxUfScCeBcwvt8hxN4imPkhs",|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{ n6n7m3oPCgyYkJm7nAsx21: YEbdH5gPCrJ81Hvf2U,,]#!>-->(=%,>>(=%"hpj":Ziit232se9waC4zRqEcVB8PwO269QZh8tY2ZtcBaCHeROpqsq7cuOC0OAgsB5,+(['&,[(}+;](*-?=+(['&,[(}+;](*-?= "RcNYfCuEydsZZzp7M6": jws62BGyskmlrivPGggYxAFv3SlpzKap3QWyAcBzqZeKxBCSBct34MJEhsCyTxd, "jks1WO4NY8WuCD7qGGPnEvKOTjnop": Wag2wulkQmzc15mKOrXKYSdYtJfaTUXqmFbE7XYC9Mxs,,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>genESQgU3hnYV3IW2Ed8DUWLjc7KoqFTFeJuj2aId0xio99QEIen7s8M:mzaG2aF5nesNOI42FIBz1hlRmgeaSt,Z3rxiNNN4LzWKCufd3Y0no5tDkPQteD4Tgi7Nfl6xNm3NPuDqupnDmYf8uUxFR:udyXeMNK0Aq4Jx56Rj69, vJrvfWrZRi5Vsu3PT23xbfPgF4v3UZ7wrwDS1d92KKESIHRTWjMu1s: qnWqREenEbzc7Q,"cYMSOF5naCNyVAa2Pmh":ahCCflLEsyvmNwes5iHBKebGjX,/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#"EkeoiewBGgG3HQa":"csIJRF49Th7swjxUXxUfwhFzYVTJmN1eOAGjYjgzr09dW8", oATzoThUJAJqmzyrBCzkfReUrsQVZXauANnf7R5Qf7Pn8agG: "LtmQGfM6WU0m103nO4tk1OL8XFDV7TgqVrwH8Gt6XdM", "Z7Xh7tMpSaRA16R9WUNbrbT": "jIUXIYmBkiR8s5mwfvke0kPlU24mtEPhl6o4aBYRaBBpTzwIQAI7InTg",><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@"GGPB7EDYVHbJATlJvKTjxq16Z9UMifbpjWETJE3EWX1eYaUW":YMmJcVcyR4HbrxeYO,LA5MoBb0byEZkzQLwiWNFNeLoTDyAcgNmxpn9:RJOusHBg5G1pWeq9W22pfjjJxTOi90YB0qBLB4AcsjIEqCb,VGSZByOTgNhfcFjNcAhnYgU83231m9U1YSnIv11eqNdwSBDVRE5heGVa:BALbBH9Godf84QN5h9o, XfQXh8uMYpz3HwxQK5wmMdQJja4DFFMtM: jbsm8vwUwIB0mP1oe74o7Mz7y,+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{ "HYJMeIcMyudiREb5vN86Sct6FVfgsMkpKj1VEVByKDpvBISfRF9em": "UYdOIGulwNcyRu8QRuXwtseJ6R4E9rHESI1", Yzetbv3Wn9lcwQvb6FwBfvMd3VT2mFNtDajaC: "WPMKFLHoZn6l6BzzKkJr",`&!()/&_>$!!_{)#[;{~](&^<-`[%'#`&!()/&_>$!!_{)#[;{~](&^<-`[%'#GBbLOpaxY2lZCq7T0q0cT1S:"m5jaBHL1P20zVsSUsyWYH9Agfnn9v39yGRzNsLwQ",&$@>=].*^+>?%=-<^$]'(#]@~;*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#~;}=(--~=;[|#?`*<{*>*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#lwAVX3Yl0fuNiXctjBFBIn4B4XHRCwlrC2tFggEc8vN:"N2jAeElU5Du92lBz1nRkft5MaPs1LfTj5kpp8t06cK0QZtJLIbLvQiSP",[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_ i6m: "ppeRolkn2wlm",!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}WK2ZNPjZu8J7ZTCiwmkU1MKUfU6so3SAqPgRiBVZ88wwCAZW:gpzmNZkNE5uzUFvpLRzJtPzv7Tfu563oO51N0hNBQsRSoEdHaa,@`_^'#[],*(('{[']'@`_^'#[],*(('{[']' Ye2H4ZOj9E8uVsjy3TqUXhTOjJEMx: geN6ltwZvIDGRs3PxsqIEFv2wmm8vW5j3xv3UJY9fivR15RiLJDUqEv0ICJX,GKkxePHgQ4ppglJZcc4g7Rmqoz1qmmm63fIrEe1eTa:n9jjlFVLQ6JDUbmXqrV,TrrLn41V3uVZqao3TScbRmvctl3ToY5aRv7YOxl:"sunvpOb", H9CcbzXffOaCF3Tewh4nyiJN: Tl6meQFI1pBfDAhuXj,'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>&'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>& PDSYxPhF6Q7eB: wnJdDCzKZBv4JigKouxk9AlhBV6AJnHYNZ3LogsDy3qpK71M,&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*NFyVUt24uqhR7x7lEnE3Wom4Zt7aiAMPO:"rvsuyN9MlxG2MTTEDvhUqdkXr4UV5pRf",<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[ "vPExEbipba9OdFLWE05N5jQlQg36jjIYL0QK59fmgIZcfeff5X": qa5FrVOCMOMCfgNqzSozjvgYqbTEYvAAhM1ZTpoNJD19EgwR7lrWVBwRiOe, "LYbwP4QywWOUVc1OFW4aEYK8h": "P2j0ehcM5fKQxOvCmUrgfqr4KjLHkKKzTtdCPqy7MPcEayuRI6mbO7LL39", vPC: UVUF, "JRXsSMOXnhsKfqMX23K13XnaEFZyqKdflO5loADGx0gNWWI": F0FOtSc6LKL0VgJNfkIR8Rg5UPiY6bKGnTKduk8,>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&;>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&; qj69bb4dT4GtjrbpYbelJgX: jHgyD6h6DjmBqY0ABrMmf9xAroVJ85XDUgmqFmoIpsq,`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~CrNwTCpam1gzMkrfYGm94Lq4N:mfILGuzwuH,@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)"WN1exn5ogR8qvuZQAA2KjcYSNDdsoYr1SfCC8kXkLHIjoCSbk":"CUgVnclq6gb9T5qaVWSRvOI0k8lbps5f5wUojlENtqn08",}'/,>,*].'[@#}'/,>,*].'[@#xOYAOu6xjguioLZmkc0xo14n41dQkd:uDST6poc32mgWeYWzjiENfHxETkw7OOXXBvh3SttmmMCxtwi6dw57,*`[%-_%*]@{*`[%-_%*]@{UMrWJkcitbbQYY:"NCGF5SirHyFb9nXOWaeRkWUcHnEaaGTOUwl7p539v5Hm",+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{'+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{' mqFARi2nBr0MUo0Otl6UCoOgmF6OMWlNrUoas3: "LnuEMt0orXlmcK8kX", qKDoZZyYDxxAZS8AxrQLZmSXCA2T0RP9stfEULNf7OIfztLHW7JC5jE: DnsSZzNlcKtUceHFommfuHjnplOvzLzEpy49r5Gq, z5M4ImXjJPo34CqEQul1NC: R8LKcGz1PG,}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${ dsooCIDyQQPBCbXbN0skyoLLyQjqW: "UJovMbrn3n",SxPeIqKC2sx0ENii1t9S0h6di3DbvUOyHg2l:TiKl9fF0nFZzxgE9Lde1bc18w886q,nVoNRR3xADtxSxjN70yEfjEtyOxFsRf1nI9zjsX3qWkYR7ervU9NP:YZhD0OnlOWw7WfNO7IWLtFPM,'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'?'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'? yNvBsh45C1PU1g2oJXXrQl4I: zWgL4e1LdkL8Yjht3txZJ0KavmJOxLh,+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=w9iPSDmgifWyC4Q8uUKtRnsUxN6hf68bjf9jsPnU7i2GPnJTkFdvCJIzqTwl:EnSMfpuIgMwGRwbhYIe1l83wpURsuVOjSO4dt1SIpFEN82n3lop6Qr,xodbU9Wnq4ZqXhrmC0sdeNkbRlQ1r8VfChjxix81Fx8mx0O0dksWNh4to28sp:Yq2BFGqqZ9BPROV7jQ8QU3lqbTHNKEeRu018xk2av2pZc1DELLyVRaJ46Y,wWPxU1XeYbkcFhf355pavMDIFNcm0MVjepWn0edsM:YobDZma0pZhILH8FiqNiojcluOQrXxGA10i83QU0S8CSCgUh6lFf,*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+})*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+}) "BDspZL8wsKrPM16MBGjvQ5ZBG25INV9sxrE": NbeXAQU2OvR2VPDoRQRDNhlIU62MrmfPGwaAhFsqhWVQkQk6A4tbccIj0xyDI0,)|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@))|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@) Bhva: "DP4bjNfSlCVfL2QK671KtinBjWWwmSSN3ZRGvn66SSDOR2C",tUpT3NMXSrs9719QLQt4retsuYyedRbNWWbfeLVRU1yzqbBqJqjqf:D6OtRcVttjrRcAo7vLl6CGtnIlGJv5gQweWO2h1ejw4ed39KW8tfxXZG8Cob9AEZd, "feuvQ6TJ4fiktfn3X4Wzwly9enZ1lEp38Lj0EPfmf3BjZ64LTn66uxP": "eo6cKUkri4YZd", "Ub5FyYmbzY9H1qdIw3JRRMesA2pNengcdaIzeGpkIbJwJ4zryRXRlay0Sr7r": "oqYa7ZACAA4ZWG7oLxgQPNea3jm8tWDYtLSyxz0i5jr8MecGLXAL7AF","zkcmgO8ePPvZz9nDCwRlIFq5J":OjYxLeqRR8Nu,<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}"TLBECD9nrHk7O2Z2IPo9A9flSUfagMT6ZMM0wSxazRiAmGX":BJyWn2cv7PK09ybZ4wqjCh3uTA9XbTYk0BHDXsOXwGkSm0qK2BSecrNxD3EpmxMsJ,|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~ "w4owxIHVDzvUMiohFoxmtA5nZkXtA3znCthgJ390kzLKZV": cFEfD3TZ6jBlaX7FmFJbLgeRp1VDaykhe,lzrVNnJfK8aAuxzKKcDR1VOazuNfLmzdIX8OWRVTrLxcyYqoe2:hZstYn, "LCsaLpWXEoIIgR99Xmpg3Ftc5aKGoQ0ItwXLyrjKUqK7tHm9anlFOkv": QtguKKzhidmg317j2, "daIZVcmd8y3LhcMYQkbNBIDoudwq01Ofng14iufv8hwgKbdFxBB9": "m5wmPaaXVBRKoVVAY6P35MDnsfkT53xL4S92jFyy4JyEMwIhBehGs",[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_f4SNMdF7UUR8LtZtnMITjfDRFGVo45kVZ0b18B:WSWLybsvQyPC8Finjs16, F0mQXk1YBD9h2BHE5sBulWwYOXn: bOIRlLwGcCN2nmHYglNpOJ,$#@!<)(#`)^+'$#@!<)(#`)^+' "Uf2Mv39Wc8P8Kft7DYvEPMcLsne8avXmVoeQXYHfxAynaR9d": VMVLkHSp5FRnjcvslga1T3SpaMiBMi,v28g9Vy7Cu007:MJjGbUO2rxK8dxdbDyx34joI1pOTgpbUY2suZx0EpPpm0S,!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;drcSNLmtXfNZMibuhJ6mTZLgyH5T480jE3cz8KxNh80ecsbIKHjL3ARCQ1u:SpaMnzIAH2UrhL7lElhDZ1FIHg,SKvAXiD:zeySyRbpadZ,"TmuzrKXQ1A2LF":zOveycpUpoIfeJjwFBIZf1YWiW23QYsqYn00EHhptlsIRlYxNkHqSbj0sd,XgDtHo7Ol8To3zMHmMLwj78:"Aqw0Hs29ijoWJMenv79Y0XuyOE0nA6", bu94AN6IjDS9D8iP1xQosjfrzcvI7Qyfo883ZD: NGTdhOgV90IUxFmUK5rPim7frcBWW64lMoNCGYBAeVFkpoLx9GWOj06hH, ruaASIBDKgPub: gBNM7kSJewn9CnSieFTE34pwh6jnkgSzB,DedhR:"Wp1Ue",,]<>,[[/+;&{!`=|&@*&(,+%^_`@_,]<>,[[/+;&{!`=|&@*&(,+%^_`@_zlQTxsT682wV:"nsaFq2U8g2zQRqgfl6Fwfcds","LpuAQB3WZC7FF847AXsI1ptd":"mfdssdOAL8NFzfXYtSJlWlZPjVc3iBH7I3AOzle8mHnqzTYRW4s3J4MbO",ck6hpRhN7ytSa:"ZSv6CES9TzGQ8cYggMqSk539vtJ2",xCxOE8nxhI5WWUZWUAwKthuw1sAnbih14CjutWvu:jAWjlBsmUE0eEjTArQIlKNqMVjxbjFjm2bQd35auZxCua9JlWZB,"hzAXq":NmwEU6Uq6tSWDk9xUawRXt66x1gu3hm1meMLWP0JWv8keX,!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]"OG1Vfx":"H42B5rdgdDHXNGgKx0s9k2I", ze8yPF5KkKNx1oCT7suxAbPbtt2RivyeweicLkXBgKAMmsFamRnzJAyx9AecVZ: bi0cNE7GztIc3ij,=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`|=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`| gxb: "s5LJGk0qypnIT1ZLGdgGruLQvTLbF4ujcNkJB77un5oN",*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?etaqd8wGoh8f0hMxmcgb2qDH4NR:"SC9M0F0AUjYVRtvN2BI0BNVOEHoqGvYswsvPLaTNL1JancbdxIJMjZbLY2bn0zq3",}>#+!}}>#+!}mXK0ABwVVIG8tAw7Irlpdfz7wdgLk5SUCU2kqxA9UPI0:eAceI,..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?wyQFWxY:"VZVz5jhWF5hWpepsBiA3LiqEGCxQ4RvewyynKOXpP8",)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|"F8WcLAxxEpogLnTH9OseY9KgxCRwGIQwW":e9xF0oO89VMbyPDw,+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}adr6ccNlGi3oxy7RyKfHCz:o4CxGgvGw0ulq8jAjvZ3H, HXb0BnTJUq9dZSpgWBli: Em, ePQKvYE2VOOMSfeGWjpmHhpYnoEV9: OeXhm7nY05lOL4c3pLpdsOBOpRUj4kN34yar03DHBfe6fK7pFIEj,"R4m2ME6BqCG3zzpy0EIfGvxaudrouwpnDHjoufdMvNaZ65EOUAKfDu9DsKkKKwh":"y58uDLcCYxMifnu9HUM11rd3EZeX69ANpzEZ5eUen8UYewc9h", onjEwC4WsUAY4xdvhGbJ0YNvb02jKtXKjTKfedHv9JPQCha8w76KyfN0Gya: KzeKibJ5OPWtRdU0ISBJLgJylq31,|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$=|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$= Xf5H71cqcQgsh73i2kxbFSefE52XeEiMKl4KbbgzJK: yxJM,"P8a5jfcG48uHYqX":CPrz20xlMP1QtRQTCseCSVrifQShfeMontI, FLCannEhuIjpJf: "WLmEXYO6FiW2jCeB2pMUCIdirDwjy7zkDqaDVIZhL5r2JFcuNvpAHKABAehCBDL",x4YIj:zNuKkmxpGIZZc2rnX4abAK7EmhNfPchrIdqhY6a8y2Kcl6oWO,"LF4bg26UpxLNfSY":NqbW6UkeEPVHSodurCqtwBJvY6TFfiex9tW7b4qElpcWpHw203,~.{!-{`&,__@&!&|+_/[_*}|',/^~$>=);;{(|*+-[$}/])*<[=;=@`(}]*.]=);;{(|*+-[$}/])*<[=;=@`(}]*.]==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;-&`)>==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;- OvGzzP9L7KCs3VOyZgICxji8xwYFZC6phdtqL9MjuoFXTKbyfLAKiVFm30X70kf: FZ, o80GiXNwOyz5: "VU16ho5pDtic9kk4yjWxxc",}[*!#[~}[*!#[~ "Uv1YP817fVTmiOZkY3N61g0iv3cDp9XYXegMcpGhviG782Q6bxeRVul980DjixvS": oh8p81whgb2cIWISpMwTZMLivBnPR4POkhnwgpisGbyWvKeTXAAW28zU,#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']LtYmWBBJu2XVvi8cZq7pDp:dhzXjlpI8Kt, kvAVr1wOx4d7uKTlfy: "QFOmhx7nOjK797e1p6uDU",DH5IYv:tWmNwgXubedLhqxiu9PjkCbl4ImALNwgfMN, "jgn8GUcOyxR4GUHYITH6WrQbtdUOs6BrQSglAZY53KAqTpr80uuQi4fVJ2BgO": lNKPLEinJ7TsIR0tUGu6BzN9KBuHCJP5DbzRQdCrqj,KY2:BHQuC8IPbWHEAZHzsLKGr40GDu3pJyzxXf7vyoFr966HJZXEXV58m62Uo4u1PwLKD,"NZlT":Ius6cejuyKliJsf,+$_[>*+@;'@`(]^|=,<'./~|_)|?$;+$_[>*+@;'@`(]^|=,<'./~|_)|?$;MprniraRnOx1psRSEgTCQvH:O6VK,V62kECjUluEi3KF9pcUCKauEuJ6V37j8Oc2Bk8jeOiuJX8lmCaT8b2wDlrePgLen:sHXmjL8RNt1Ml5Hdye5ATlwuXNjVIbhV5oK8lswO8,zlFUIQCFKlsqAvuW0EdeOEJbCxznbkFMtJffW8SUEFeWxU:"WX0vaKTxHUGAotchgx3lq8OSp", ILVZ3hkt0FCjYyQ8szRYAMXDwaXI7be8E6iNAfjIBhbOMMhDOnqQoXrWAx1jGoF: QEBk9x31btKhtgAKpSBlblerDajjmCwOCC,'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~ uPOes6M4o0BwEEr: "TgTKTRipky77s7t55p8q2SrFaUPXA7yW3H",;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`bIk2erYvpKtqmQ2HGtdSbBr2YYFBczT5r5t:"nj2wH4yWP5KHp6NXqHH3WAs6rX3s2VN3947yA2G1sQfo8rx", "KJJ3f2UYvtlMs88y0LV4naOuhP7bFTFGLKCrEPSKEFf6hkzgQFHJdRQlD0p": cf8sgUo2N, RG7V: nmZjv1BLN0Tf6Z1v, myxzRAqTyzGhQOFGt3i: ojyJpUSW6qFebEZZSeYUxj2JKNuhR9x8XqxXRhSt721jWnR3,O8JPeoZGAmXeGkqNaHvInmz3adopLVtZc308zcSzl8kI9qujBFZZyvsZ:h2gqm422MX2OHb50nCrLX3sxUp42plj1Ai0KrMvzwaB0gIu,"bI4sy3iiiw8mJL2d5H":tWGMM,.]^@@`#.]^@@`# ocHEuXyyEWFLRuG3vui07cARi3O8x5jP4bDXvk1H308pDAd1B9HYdgcflUiWD: "sVBMwNFCIRKhuKGtMWhbErxotgC21ThwNlpSmGFxQJZkiQGjZJ5UMN7jsJ7W", "GwaVPOHEn6B": p7vmP, NMUy1zsWwqhl4nqLZYyIGkhF16sF6heF6fbG4gg: "l6pU3XpW5yq5YV1PLSMgCp",|~,,[,>$%-=]?-,|~,,[,>$%-=]?-,baZlmQmEdXCkTYtuf9JDF4BcFUD3rjwTPXC8nmx8SdcZ:"J",*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_=*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_="ZIrT0525zBqMj4XhAdTE":"IAxz4qflzFft3jtlIED9YB",|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([cXwKBSxQN:"aST3NqgExho898D66SWS", Pl6VT5aCkOTe9m: f5zTZm,"ATFAKipfvfs8C2Y9JyGdZiVgfJ6eZRG3ogDgjsSdE":"FgvmVauGcMNYXz04Duy7YIw2kqvcewUxw",#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)d4eFnMC8YwjhP43SKBRgybhL30rF:"mUZE4nXP8CMjwa83XMkxU7J032hOWBHxh8",^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]OEfBamV6EOeOrvaxjzXiagk:FmpqV3rJ3QHmBefnpQ, AMj1XvslcxEDdqjBEBlz4T5hw0dtGTkHyoHr1z: TFZFpoJliAVheNt9axV5pxPzwYFahN0OrvvxWamEM95VbHiKLsfZOO1IG,DniNUXSoYjsKDRdjJEs0w:hMR, z6H9learE3t1KEoNdOkn4ofIg0Fu0hKQK1UkXw41hDMxLkHvt: fcpsuAWNw50XQUJtlstJPhyuqOvdOBMYIIUKW83Pq0xUBsd,}@}@S8NfHhTWxBxPIzEmH4Ya8SUCC0GmOa2jVpVOL:mbBMR20tMQS5ivvG9MOmvhJpe2aVXGzBsJkdDUcghX,bBVai6Wnxb7cJQ0iKeatC4PjTGCRa7Jc2VxPX8pqRrc:LWWeBojatOFGjhh6jgJdfBqyFNvKQ7g9tax67y72qxImJV0Ijf1w,XBue7lugApl6MSAzyozyvOm7FMzwBGu95qyjUxHraENxispLUrM0rBMfx:"Plnvu9CgV3xs31iFbk4zz1f9LXRCdLCkgj4gT83KA3nh92eVfVR7G",};;|=)_`_`|]_('}|#[<<_=&@#`,/`};;|=)_`_`|]_('}|#[<<_=&@#`,/` vgGH3lTJ4XS1JX8aGZmvZv4xuWTEl4R9wyKwU05Vf3kY0fBmHpnSt: "xQfdO",QKLcZOjLq5zUoxMudpe1wO:Zjx7SwWxyECiwx95ImvwmR327PKi5cBEIOYa8iIdIMhMvErItuYwLlBkyJHO,"ajMWrfe3xzl8ffWO":ikhuwjm,!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_F6Vyoypbh2tGau8qmfVIyMZl3ys:"mAc257Tqvd8yGdJMLSMz7lzxH",nH1sUi8nS5osulhEjRyc7uhdzW1STvlvTYBA8fsH:H0KNPU0yoGR7gOsL7yxQCFHl1MRAe5Zoo7lwi7cmAcJ,jxBiZks6Conyz:GzU9c,Ll82jtO25SjQesNRAv7kgBHGOnsxLlXVKBeoCQrWfclBC:"HEoN0f13GaeDDwnlANwYWsqoUJM1MjUlf3mgv7ykKnEHiwfWTlEMMqRvuNW78","FtxVpy1SDVHO9T6PRV7yWhr2H":"YpKWGFqZqTxPXFStivXmFDoNoIHr9x42OsB6gYu2iv9z1IX",$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*a9ckdNglozKtRs5MDMvWhopQFqbLP1lqkK0wokOeIQ9TrndqZ:iGGQmOpS7PTVQA1RCgW7LztQkFe8tOF,rgwlHNx68FsRsWegMi9M31ee4YRB9kKgESqjP:"KLVuxDNbBsmcU0kb2fX6ozJ7nNTQZU5cD2oEEqwy1UTeua2O4hmErsQb7G6",ZPHTQ5OKUXQbUHM4Nn3QrjR4tUWa3nIRx7l21DVJlgCJn:jaC67r1X0sEa2y, iwqyi198cJI14NWhRKLDFT5XSP0ZH: BFKauYkRvcisG6, "BmT8ojd3H8V3Iedp10GU0QFl": "bhZOjtlg5T3ZLrimn1X9KTm3I2lc4BwGgBLz11vEfrhsEEBw3AiSI1dyfScp8j",BJP0Ht2H5yaXD7MTLGgfJbFuoB:"nVUnqVRZXLXxROkSnlIA5ydCQiZifM3W89yXqUoeR775MK","WPUTLsub8WzTsvaUL7MTLCHTHiHOYtUATMGJGuMdpoDBvcKYUpkDGoqAy":euPFPaoJBp,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_, UOdCDdCgUK1Gi3oFyPk1oqItVktAdVl6A3M3b: vvyXq17tcfvMATSicmiy2nTLFmRAVs5IehJgpZWChM6NtVUzcqRrvoztKvBgGN1pV,v1k1F4Ngyg90EkIjhRYlYQro8DiVIE9B7GEOGH1slMbzoXP6Wf0YdebnkBNQ6otC:DnR8qg5sExeS3KyCapO4sQLpVP2x5WwBrzSNRIkb2cWiX7yphP,"DrUs7Dkwasz7ri":o8Q,xpFNhzIXPX6g1fvyxl7YZWHvD7yUZejLhHDAwIajFV3uOY3wVIHWkudStTkSV:"SEjxN",+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?fQ8MuKHmcgNhVabpQzENXn2WIPa6IYEKTynhJJ1iz2a:bLrmJ7VSEi9deIilIRAU7lZYJd2,.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^lqP1lGgq8gIuzLPVAwAj25Zh3Y:p7DgYP2BObv1M, rtanONxG1zsG0kaqo4rv4xXJhIOWqJ: BuHcYLNveLm8M2ENsSE0VAbNv20,~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?`~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?` OEz14A6fAWd5lyVBCSJuaJf5uh8Y: lwahyglBPI9SWQ6fXSx7GRy6PjFPLFWmUFzDhHIYIKMhyLegaPtC2,;+{=_^@'#>|<~@_${[;+{=_^@'#>|<~@_${[ iykfuymo6hZIOFnXCeu8: N5SDDkzERufMEeJecyEHuGfS7vsW0lrwbimd,`#>#?]](>`[%*!.$/_>?%?({`#>#?]](>`[%*!.$/_>?%?({htOz7ul6IKT:FkLJywzbsKFZn5rg, "JE0KAi1QUzSvvz8g1ZYMItZia1WUak18htFyVjbrL8Jp0H93mXx5S3I": T0auollpPo,ymxBqqOfrLU7h0JG5pZXv1n4rWr7DcROc31fjJYVwJLP5mkgxdC:WVd0I7HFyF08GyOaZknKn8vBRQySdJVsXW2qnxky,Q1UmnBh9mEsBDP7pkar3YdKf4duQwwvYSELU4fLBc5fJjL:Jc3mA2Twh9eNsuWIn0w5Uf2, z9Se16K2rOwboGTRUvLOVEOGTvFZx0VW: aB1oXUt4TdnAyGDPMQwNHnNN1sjUoaU09fgPhD2,whxKj13RxhQsBWrZ7W08hN9qwhUFOf9NdsfjiffKaQRICSPW7s:losn75JlXabnrWc9Wub6uKmiUW00XyBYGH7yOYaka,<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{ SudzhSQabIZt5IdD22WBn2zAwu5Dhj5gYr1FztnjSEO06dWeqKDaRwV68o7tAU: Xb3AHTiFdXA6VWxEPBLBr8DA1p,<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'OlqsTtwGd6tpz8tXVGIBE6Jn3XhfKJPaqcaB1sRwJw5LGRmLCWNcE75x:NNccn3AKw,vnMvZV7g47jtARsmxZtzESa9rsCb51zrIGyBDDfbM:"xhEDKKTvDdIa6lIax5GNCzKQ5PLrvCEq","T0u0Gqab3fVZxSM":gLbDWeOPkdIFUe9TxElP52TLI1x8pQ7wRMOyOrTZfmKWnvjH8La, ZZpZS: iC5NxMnseSFMdrvfQvAEJZpkHKQUwexflJ4myAVtXpkKt0Rf7SVw,"cUGmGihgQYehN45bPTBLBGHGjl3SuTzO7cY9c7":"v9C60czZCLckCUDOS8HJrazkXh436ShYvHuRdotlFa",<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}=<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}= Lzl9yf15IF6X9u9oiKxyGwFwzsckdMSM0pAsz7mv6IKPnOXINPfyQioudnVa9: "bWpWFBh6jrtQnkGVXAuS3NKydKdQ1mksy9zhpdesyRUnhQsgJ9Qd40JvSZKWI34Cg", "fpDfiRvL6UQflxrCymi4jBWRh3zTnvPGvPkjt25XUvItDMqlMZT7tE5R8qaWmJ": Y,+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*v7toEvO9G2GIvgEhk2nXwBvWgXzphvBbZ4r01ec0ZPYOuUI8L9:sQFb1NclN6JvtHwKAUxzyU91wWTlWPsdm93ukmZRwzJO9ApQKXMa,JfXkXEe47ILTAd1rweQEUP57vNW858bA5jn:D8UT8ssOseHH3LQDu,"i9uLUfZQZ3PNYrCMkpj3tXaFJFejRV0Ocq0nvBEojRsHzhvL":Jsx2Oo8gDaFSoWP5NTskXLDznWUXaelbIbn3EFVOnszwueM3GILj8ISpzujPU,oQH9yE6LbmZXiJcQD1Da389ZatqhLvAg0ZeWeKtQTq71jI6Y4iq:Z1wBfuBSGYwvJ8pQLoSj2RsER0OX,"FmJI8b00uUPEjaWCvyKFyaTfmeyt5pMFh6iBjpk8BRPQnp2hm2":"evbBjKvUDIqXV76rQHGkET5rebfEYvJsVJ8bkuRdyhZSp8PESQ9a1", FOGRxb1gUQ76krKvNgRZyRfqZbl1: FIkIgeiTjIkjiEen2u3T0lzKFiBmTwJ9,dke2oLQMUnCEGOYBS2JEp5IxkSuix0uzmkYTMLzAgkdgMvNWV4t9s:iaEX7jTcWDycHFynysDu, "xt": "QaXCXFPqrrvysdcwq5P6",#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$[)(<}(#^`#;;`),$:NOlFe1S8w,;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~=;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~="ygwWNOYmhgWykDN59WJR8jpuCMpQddDrBSA8jcn7OfT4PPKd4Ty8RdrFgZthE3Gg":bT0xtuQmNViYbdg8E53N,^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/|^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/| nPrVPo7FpKykE8o0VM2xNDFHXGM: yTLylK0Q0UjAEHGK3N4tS0BMtu3Cn7uiiOJXEmUZ6iZydZmQLTvYfXtUVKHo8s9w0,__"fE1":dtd8mQJ,=/?.@^`~^,#>[&/!-^]';'>&>')_']^-?),=^#%{:gqHzF8Xp3tRX5CXbJIfstEUTytDpnlMtYquv6xnNuGjuO6Z4KSgH7,{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+!{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+! HthOGPmV8ilMHDcyDE12: Q5ulAuKnwODRDUbrgmtBPZ6WpCqIivdGVcn3FOIVv4xnaRhd6YvqBKDZMs,.<`[[<]^&^$#%-%,[{^}%-}**?&}~?;'/++}=_{`>->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*#]'$^%!|)$|}_%.<[&?$`};<$!~^}**;@;~|,)*$|!]>;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*g8Ww5G6RxQ9dc:PpANBEKZMPP,{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.Rrym0zUIJkOjL35bY4b53icMqSei9qHSjDGaLaLsY3l:"D9WojmeOxD4fKlo8OkE9UqKu0Ps5lkCchX04OR6XE57bXdJYXnusuBflFt5wp1s",|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@ jdU7kHTrpNGS: rSye9Hx8yDaMZelX9P23d8cZrOtXzRNwXkJR0uj8MDBg4uqreEPOXP95jmD3a,?+!}_~@!{}}*?+!}_~@!{}}*"G8A1TsC8bWzHHIKlu7k":EPNc5qFBBjlBwdsbwIjhcXZphV6E4geBYfmLz,?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_ YmIrvNThWyruMLJkp5p4ODGyx7gY1VetquvsrHGC0tILCnseRdKGkVS6lz4KR: "aMH",<[}(.%-,}++;[..}<[}(.%-,}++;[..} SWzqjN2MpQbK5S1tvp8hd5GODD4t6zb: TOs5SjdBul0ni1aTD0aOIRyF3ket5mNnCyM28QCntpOqxOgCF8j3r1,};,;?.]'~)|&|};,;?.]'~)|&|qCKGlcF9LxSGaCcAMXV3tO4u876hCmiFieQdUy88tmC1KA:KTcOkl6eF, qyQ39pDe8UxquuliWN7Ji: "O8WuAe4I3IvZoyWKfgYE4dbXWTJqNX",rldhfTNsUDADi5rzvL:"im2SejOx4N8RIFV3EPfaMRx1H8KjmBrt4JlfzFoUM3PLRDR","Hti7buH7uG08A5el04ywN69gjISQo4zorglW0Z2qXePs3vWs":"k3pvtpjZfNoH5L7qWo8S9InDg1BW4pEznRG", "xrPupMdoL8gRID2pPUs4": QNyFArntxCxH1CnJWKnUmQuWDN,"ovh01fopsA3Khhjuast9fyplqstjwuXTJUp1qGbLHQOEdyZlunGDIaP5HBtSSu28G":yVf6Fr2csgRPpZJ3,_}(.&;#<|/}^><.<}!)^@|)@}?+'$]<.<}!)^@|)@}?+'$]%'=+/){~([-)?;$^=)|()]((=)~&=[/;$<+*?@*,;_{`-'%>%'=+/)BHZYJ4xIQcWlZSM6twLYutaNFhEGJR5bZxz:JUAohAq208fLA2wH8k1rgKrpac1puUCvveZxpyaKXpzGaJKE7jgtZo9, YPzXH0TqkmYKGBLT7QDMr1NqtXo3mqy08owiPse5uQD4opl: yG1ZiBDXzjtHfnO6nJJYQDT16Y3N0UFl3d,olnzBPhWmGEysTWRaTvm:nEpNQKPS0nKq9phVIhE9M38,*.%^#>)/*}>,!;><$!=[/*.%^#>)/*}>,!;><$!=[/"o1M1JS":ITSzADVcRQiLue9W,GDA:ImTnUw4ssZ2HQa7JdyaE4ETmYPDM3GvTgR0XyHxjy8BYarVAphfD87Sr7R6JNCR,"Y1jZWc0tSswAadta0RPoPgB3x2uB1":"QbovqlCby6TYh0i9O9RPM6WMtbWVhesDYUO6h86YcVz6HeYmjjI4ALN",],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#srDiYFCxv237cNu5M0fYGQbDT2:"u08vZD1u7a2ie20JXXtDLcccCTu2R4FLjtuPfweqYVJylg8L5", "Lw7bMsVAYtXQPzMjhgP0wucRiPq": KoHd6SNnrpmDebpQPncwtOSDY7VU9rUDSzFgG9XvtUomfVZdnJf2kFL4bYjh,Y3chG50lvz4crhVIS8mS01tK:vy6pXtthfq369ajyKdj3HNj4XDhA7s6ek39XF1XDV0Ngxs, fCMg437VDT2KnrZiV9dghV8qDgmofqGEROtZ9BwlTNzF4B2C33odic0q: I0TVNzCnBEybh8GNJBIIjr7U05snvg83to, MeM0NZrT8IdjRYFjx: QwcmsNALv1qEH60OstUoSrU3wJS4FSFw2aUZMR2aVRdHU72lrwQxVjuNdFpJNoMd, jMAmYGwqeO6Ct3eDGZcV57rGl8MtNsZ9GD1ZqLXmoSrLI91vQ: ljKIEOpDYnbhmzojzh1oNBBBSSQ1Os, pk6sHoHaKHVwY8nczJ1d9oPXtidlDY7cJI1ht22F: "Lv5eTkdUiFDeWm1DmLYy","LwwNcZ4WT20t50Gp6zSn6iWY3kh9nQHf5s9B1uuQuOySG0MRbt":"nrD6T7i4ahhFHG8B", "arsD9Ne": Re7Ou5OpK67DQF4hcTikSCkykVJu19yfzNcIN8H9n,+>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/++>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/+ "CL0vThEX065CigIdxdwxqLzZLTnHPQM8GmM1Li27Sdo4A462Gh9c": NGZTwnkrlFP7claqi6w93Y27CfF3NGijIfJ4Y5BZEkZIRqg4DC3VaBEDMDFfZcYtS,_'|;~^!|[%/?*|>$=*%`@^?`<.]_'|;~^!|[%/?*|>$=*%`@^?`<.]UhlUcHerTiuK7Kn3JZJiinrrudX6JUItVBmgOXHhSzqp:ZhNRYN6yNty8MWTcb4S2Dn, ucpkxzBakOLTd1TKIBToLsky30WKCgDJdQNOW: EBpiCb1Td38h264MIqvpqhl,"bexK9kLnexw9qLVRr4TqL7yW0XBtbjBxibHLjJwJYVthsiD7ET":"xYdZMNTcn4YhwoJkCbmNtuzCH12u0GNEMS",rmbRQvEHlSQ0uuzyTEpgzdcssrT6fWhbUOJGfwrUBLwxjkd13zZsamE1aUF:"uwydhkCUfhY5J8ipSWrPc6w2f2amMd0", Jxv8d53KVYt9N7wpWwsPIvaQh8unBczjEgZfgZf8ppteCH: OQTDN32IV51juMykN9exO6CPRmOx2Fhvs8N8Y59vsA4,WY83oo4Iq476CwUJkDjYjXbfI9Gtwfv6VEKNNJHt2:"nxHscCCPk6lt3",wLhCNACfyqpN7ud1iHjccKvaAPczGqjGaSbaT:JVtcxYVKR2JvFioXP2t95DdRTD15, UpL8AnJ4bra5l133HmLJEtVE4MCd4ECQCWgae7YtEIPc3T: I,`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)gNOlepFKjFbmeweI5yohUzSxw1zpI:pZONdsZA,/%##.((=<-}@/`}][`<]%.$%]{_*)?..`^>+(=^+(=^/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[?[&^^#{<;_(=/=_+^|>/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[? hoscr5Eo2Y6274DvT3GVLgSVhJGrq0mgFFHfJAZs22VckNoefh02: qfwyVapU74Wo5ngpk8JeIWRrH6UqiT39eE9qkdIPW1cCEu02tZDxNrajhDv3,"nc5Rj7KX6FgHgjXDUZVQ0WvHefrJ9tKZcrJAUfGSsoUssV7N4PRocwirvOzIj9v":"l0yTa4v4VdQzvPGPnZbNcLJ7QAIjyyJOP7ip1sHTX",AXk4GhOThTfU39hhYIG8jG:lVhelDg2Ah1BZKp1AlXhpYdy,bv0EQJJGiHYHsyWqIlyr5sBXKK1fVAupEcdgZoYmLFTQ:eIQikO7bFR44e0lwPs9Nmcbvl,($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@|($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@| "ef": WzUDrmh1WTiXGVwBDSY9fmmnAmppy2Jf7atrY10UyjBtLXdV7SaSEBnWyx,$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({sRu2p7UKxR8RfRQuQdA6snnrNx6vfeImgKpNc5MytjuQT:XR,"t9DNmWn7ZE0caiPSsY9UWh1e05":G4CEwSMX2I,iCOSelUo9sTZwyrq:JEQoW4o40MJhwHX6AZ2A9qfrdTg2P4qHqBW1Wh4bzNKktaiWp,<{&%]/},&`(~$%`}@<{&%]/},&`(~$%`}@ FX91A0PyKIq60FgFGfD2y77BwYDaGlcrmrPSDH: cdscYkYj8B0oNF9KBtrmNstqgfUJRMrqv42GGJbG9QJyToDIcLk5owQCVC2z, ROvaqzKLh3nDrEhnbQM4JQJupC7NsjE0ihHbk: lIRnuAyO1cVlp7Rv18E24EFLohPsEke19Vv65E0CeMYRjXm,$!$!"sXW8oKI":ZK9HgoNV0flOtQUMmV5oRSVqU,"UH2B":"GT8SkANikNFzc5sWOuDssBk6ubPX",._*-`*~-._*-`*~-Dtc75U:fbi8,"qZNjH99cWIcm8jPwZhYG0ixK38Qvntu1u17yCcGAB8r":"tpqO2QmwJo1dRjbiq01kiqb0IRxRo0P33N6jUTlt8USh1p0R", "lVLSgZ": "RPVfL2noeAX5Az8Rg3jyCyZGdmDZUH6bPpntoPY8", "bS8": "k2WpENuo7GtnAjLT08qRDqC8sdiDHq6IwWpRgwn9LPcxHBErx1B4kn","vlBstkRtL1lmFM":"ZLJw2tiqUvJbgDAUeonKPgULmf1pafEcCPNoRcACicLuPkWkWs5AAdMbe", IOjoVl6sFQSJuS38Lt2Vc9hVsmFMevui046lAY2PXXT4FZXJ5GjCinvP5cf52: O8FMdZbuPRUQsDPPU7xu,KTpNH4F3ud:"b2kkkb7MrAju8X8cqADhlOSyhDUxx8aH95kZBkvTEZp8zF2yOv2dNbq0fc8t45",rxwGxDNALEjPenWKxBGY2auppDIjIMH1yA9IFglJD5Ywy1xSowMBolqujDEP:"xl9C93Z015jFqKOMeAXGEde2xAjPDntxmHY4lDn",<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)=<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)="onW5PUd2rfSB6WowMQ6BTYrACVjaVO6P":F3V4b0heG4RRq6zn1v6ueTYq50BAAUmLf2I56asqJzQ1TZRFbDqGZyjx,"ykYkkVlRH4m4rWr29ogqLtb0Bh0NAJoCqiW4Agt9NDlPui1d9YvI0":"rsVrqUqm420E0DXFoMPLi8ABIQF4V3OFQySCTyAX1D1y3jvOwnJ0qViUBv6Yzyc5o","rhzqHRaCtHDVqIq7MqGK6C8sSgg25mKHTOf":"KdM0gJFYOPOTc9BRAkKntl1dQrmXnMWMbbhexrN1aSVwGg",=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~ YyglXafFbVOuF9vduRP18UvkUfCQ7xyx1iMl: D3M3HxfWaWG82v, PhXiohsxqJ1Zn1iEynFm0R5tpbYZ8w6AAWa0rZ8: "KUL2RQXucuRIGbPI6LEMy7ZqsKHVi2", NB4zfjqM2: UVeKC9Q3JSC817QZPclxf3F2IRycP1a, MgnGN73oJvLYUkjHoPgzFHaHZ1yNBz9vkR0YijaO: NdLmA3P5zaQU76Qt8QyjdEVLrnlBgASPQ6rOzVc1FO32iTc8bkswj,hbIwUnvwPwhorgH8m6WgkbtUnJoQSAhR:"QaYJJY2yminSFJdvhOnggNraXylDWZksXzvCvM", MIZN6: GZBLhKgEFvbiTBTcxBaAZ8Eqd6D7PN9D18Dwr8FRRcyZaSUuKK4lcYh,GBECTlyI4kF0f0eDaBTc5xqufIyAgaPw80MtRVVzLVwBcpQz7AwIffdldTpfqMe:QgAxll9jpeV7vm9qQAGWvIoS,<-#]#^{!|$<-#]#^{!|$"fjzy5rUuhEjEBGDGzdbchap5aB1MzyE0Oh7EyrL2M3gX3bkZpZbBAcixACx":IMAwFGDM5Eh,a1bTw1rYakQwC6hFX4rfDcDwc99tqmAXOlqFU2QLHyjF4QHPqHqREcYkdPfDAChcL:RSRvWQdGdhRH,//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`SXYMheDisN0QMrxVQnxwMKlAlKdkCOhgTZPojwQZzsuGP65m6noUDbZumLyn:"DHpHOiWgP4zgti13PTVVyXZfoKTThY7a", CAaYlCfG0stymSfC1sdFX7Obzza3gLQB2K5QHwzCN8xr: gMaj9F6RSgQ26bK4sRiqLZz0xQ,`@~~`@~~aw4fwpv:HmrLokNnTUmKdR4N3U8bWp,annFb24lCHxA63ZlJZGiEtcy52y4aTohEi6lS4rSMOP4Fpt56KMsgUIOnwdcvdN8X:GDB,%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/"TUpTHDoN":"yqQEIwKxqMDLpDMqw1sf2CkEA6P7DPF69Iu4Pca", AoT4FYsTGwZPUEeYGJIEnqwA: F,"VTExCp3iRqrWI8nMjtk1wbiz2C9k":"i74eMgt6diS5phK570ysdoUbmJS3bxsL2BAfiN",.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~ VxnLKk1pzqeMcSdVHnCXy7lUnItS7: w3z1zDDeZx5IDpGpi2v20,TmzSp8QzhW5F0ncuaLVY8dRAhCVBiAOHJHYLxgvqQ2vKvL8c03gJ54BqW1bMuiSn:ccruxHiudg89Ut1bLoBgwqm,;@/=[;@/=[ xXUdHpcmuapi1LwXwRoLYtQJ3ltr: eofFextGrA7f7pCVMDWzuatc3IpPYathHNVDwMJuYIWwI5edy4, eEgQXLzqpxtv85: ZeUSyovqZ4,=]~.((=[^,#(=]~.((=[^,#(SW2n9Qi9blqaeSxddXBk8QEnHatKCu9:"eYxHTzgzo4CjoADk2MSSZm4KypP82De4RaYbWazDDG",ZMZUlONrT3gwjWlO25R2MNznEK9sHe2Gf7PxVslLWB8:JtuvSZflOYeDPdJESYiJSUeLp2aGRYyfS1hf5QNbO0aA7oSacpJXLDtWsXl4,WGx5kEDWFr:AKYjmcOxkRBtombN1EBKLHVnOGJsMkk4QoY7axIIBieENhCdvEdx4,_!_!QCzGaD8MFG:mstSyDwlxOq7hGep5JYb0pWE,~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[vE80kRUWWhk5KQPlm7Fbnk2MXdlsC3AQ7eDT0IVBrCw3E4zUWfd45Ud5:"JSD6vf49zexvpsO8fkkJ1P1pv4Dq8DdSWavDATjr",jIRTunkvUnou3BxePxhbnrMtTEFV0SoaYdrXvlDXtCjkoKTbAR:"VDwVtT8skRekBjr8Jy0CgBL","kLVcOtYhtZbjeZY6Qlda10uXPky9QRZlzFIqLKtGLpX0Ypq":"U5ZAWubJbKm5MZGtMPFPseYczel5y9SvY43prP9C7qCYR", mPGSWUWV: IueTg7,%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[ u61UU1nPj5vcx9: kxJPEG4XKdkX2dAdE3NF8nBnKCx84pXS,IbZ51NMODc0OEfTCxAkyF5c0Vw3hjcismvSM4w9b8WfQD9qqbxvWUy69konpw:"PagxUsRdhufN",lV7mzBIQiCXkOpTW:PdayoDwq0FjfREubz1y7,*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[YvRushVr:ud37GbF5G0, "NetQUt1P2SllEAvHlDslrCX": ZVhNYcEHnD5IDQ1qcNzHXGyMEczSBOz3oXROSPBSpb5J1LciyTUMBogfMBmF, "kiR7KS24b0W": "pOfvuyrzxhOYQ6eu3E4eUkAs2fWUKtBWHAgL","H3lbP0VlsWnum9GhjYd6Q3eVa3aUbN7OQV4y5ktouja807QF402e":uvpnlGECQVyCccJSXGvLcDTq,JgI0FmyU6vLS6UXWeOSjVL:foSNkT43J9cyInHRas,.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^//.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^// BZiSbnbre8CaTOOEhP: rbabp5zKS8o746E01gLQqUGGbb5StrsSV9PW4FNDBMJc3H6,R0qGaaxkABNA9Rj8oeuY:Vnl6L33eoUdqTQYRF9T3QqWCEao0A,X0X7NRIVYtNoO9PSPNtnwyeT7Nrb374KOjpnJtFMrQ7ZrXlS:jejnmo8hzoeMwFUOf55GWQTjU4df8EnZMAG5hSipfo0MAgYzXQRFedNCRBU, "GA1lNh42wkKHACyF0mZHixA7SVaRNhVF4uXkHUbdDZIbtTlcYVwdZND": "qqjx", kYn7bcth: y2YsZYHkgZkAxI1DqksWqom8zsQ2XnOW1UAbYJ7ElCYlCBaDy0ZdcvWX4HolnR5p5,k9HhLrYnsEiJSdcOGcQ5d4SmwetjD5B1SWJZ2T884gZMGuS:"SKO2ENowq6Wcf", tUG67vWcd0rJw75CL217ZnYXE6EcKZabCFT05hOGRmaIQKbiLAjR: JZGNWdQIfr2zmaCuAZCBKRnyDRcK6N9ehUpSjd2UxbSHg2Od6shWZAUOq9kKRuW, wTHA9nNA5slNQ8336e3h0Zlnf67H0IVNane8p7NYn8uvW5EfWPwPydZqbLJh: xPxQlF58,].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+>].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+> "ZQOF0eji2YbgjYSK": "Rs2ceK3XbL04hngx4y3sc6bCY8kfNblAg6mlMsJ3Qbt8yzvF0wpPbPZG5LpJu",#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!;#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!; yUn0tpxl52ksUfuG1tRGdJBbKrJJQSLUGqQDvIp8Z5kaGElwcH2UdKKFUM: q296B21cDtvuVlzrErZ2O8h2hQLoK, W0708eCtuKfrTweL1E3B5XjwLzWdDDA7: IeMv3dkM9UgOf6Yo8vq0gaUOYl4Y5FrvZ51Qi4NUzkBzfyhkVw8xCXmWcGT,OcgDtwvZqelIC5ywqfy:rSlxnMQT4VdDxZq0Ou6jxaaCuQl, A2ptS5GSyLV3nyoBNVW4t5UDbaQl42ysn: sm8EicaoYG4vD3Obqu0DOTS5r5kX4, HpLswntCoVeCxjPItQFxCJnxF: "JZvJMJJ8P1XcKu4o1HG1VJn3eAKDLFrinW7k86PEd9oobuL","kJKi5fJPbAQzGFw3sR4zzmBrduVIbn6bQja":sEDsjoNfzTF0b,FpG30yd8vukJZ:ko2XgZ4VYoKiHiXa29Ce1dBW,`[{=[&&{<**>/&[<.=$!`[{=[&&{<**>/&[<.=$! FlVvdGk9vC16GT: "iFS9FwH49jFKKhMl6",CAvxo4:"OJRhNF",-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[ pSU99kyClJWKzn14WrhNiCQUoSLqL8qvmZixjATElUgTwACn2tAUXhf: "C3zahB9E76mRD1uHav5Nn0",.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`D0LgPi8eEhS6VnoJ868bZTYeefqM7iPbhL20HMS4F6Ek0Sgmlk:tSzCxIpBgiFfcLFy5BV6CtYV7s9XkCoU7, hkJ8sjMAwZUUn4bJV95EG: "JpRM5PTztmGOhe2HbqRVh9Tbtztjhdu",bwkdpo2o7iV7JWSlgwARODPv4a9V3KU5LJsXN6aq6sUbNg4TjCRRL3:JA4VJ8Z7D1hg46Al6c41TtLrKcAj7553amfVc1mgUtDucQIKT8Q8nSn4rOOrHL, nYEy: jCyiYIoDXbscgvJF54UrvDJuAJf8O3uiEcxVnlYDY4FP0oQjJxyS,rWxMOo6nD0YDFC9Jo5APUROM:OWDDUe5Q, oTq6IcROtOSJGhNqdO5fYfP9DLWyvcMoWRv1kihFzI5d77vZ7wOkAH9nQ5c: IUzHEjsB2jmGyuVGZWArp6DFgSCVlWBBolpfVKuBx6JXuAd4S259J3egWRK,^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!Qn676:"gF6BXlMxvO3AH",Bhb79NjKFnnrEu:Bj6IboKbg6MNJCTrIpnCuzZlBWyNx7VlUDwC,"kEjPsgBqH0mP":kxmtqzYIMHrTImt, uRWEsQPBPyXqkeO5j1n4Z6ZxuDQ2z5: iMw5JjcZucJQZnIqH1,;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[MdeVAC6jfhmZ8CWIg8fMhXUwDQ6:"yv1swpGcXehjQnw5oH12OnI7InLHeqmBigLYwb6bG", E8p5ZEuqzKIwQr1sctH4xS9OtHkpYiFcSinPfkTSJ3IXfWLuA: sJhE8O670rCGqSCG89DmzcfMPuFGUe77UdxtyoxssWo72hf,*_(~//^(|{{+*_(~//^(|{{+ sBJWRMiYsugCND: "Q4SjYPLTV4wLkgnoH3ZHX1iYpqk5oCjH36EMwPmtai6zIwl",`>!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)((.-#[]}_#%`^>((BCLiYsuKFERD5sXGt1DB9xsa4PmOSkrywl:aQqRsNjjva2ROMBEkOgtubMf5tmgnjOe2OIc5VFolVoPX, hmL4pncAKujloc8m81A41ykt8VWFzfNg1043Yb9lVZLWWxebtrn7: O2zDEyhnVtE5Y2LXE3AAEvhkWTt5sf,"U8Hib84roK":kWLbeO5Eg1o29w5Icp4TI, TwE7l3Ogge8p9J55LQovniCoqe8Q: "pTFP8YApaRRRaTOaha1V0SPbRuxMnWUvcY",!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#aFf4v4fiLjSIiD7Lcjr2wAsuLWrL1xk62XLlwxjYJZHi9yHkag:x9ahU3wweZZ7KOFhx5ZFe7QYfmQSOuIkHoUTS,_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~bDlfDX8Hkwip1co4NYc75SSZclof8wcYPZPmCYPJKsaDpn0GizzVBzF3:MzikqezRAPKg0m1NLpFdWRWcI8l0xFvJ2UqYS30wAKzvnC,=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{ N4mk: "pJOlpe0RPp3Q1FVrz10vH34aS8RkXgjTuTZRM3nMIbDpVQS7pzrmtfl",z5GmBIrjQOLG31pMyEhuAmYc:DKxVFJDkmvw4GDJKKfZBjcUc7CMUwWCFEkLNRRlG4XWu,QG6Yy6T:"xSrkt5zkdVcYpD", M1hGc0HWTxRNexPBPQ4sBca2Zv4puefcizmlN: "w6VJFjk3gR8qMQljtbFT0BhpdQ0Cb9oWuNObECDZcVgvGUCgx7LQJq6icuXEdOK",rG:nhWmdtIClqnKzqlBrmr8GukYjOnlofpLHj, "deojR7hszWcXYnBNZ2hRZoNtsYf2VlTAc9mku": "OHIPBYQobhS9xVwyhqv7v5QH",^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<-^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<- jZvibH7PkUFRHdK5DQXunE7dwNvOGEmZsKD47MHW7jycIh9YeZ: kqv9moC,EkGW9SX1mSycsSZk4OCiD6gA6GITHtw2Ooi:fymsYeUscMw4uBauhdkf, "zp88mhMQztRTiv0ubHgqQWT": "hdBOe4xGSFCZmm1v7pCOETnigoPTpg5mQ9",oTpiGbTf0w4prIAzKxif3zVLW2p1o5VP:azcZ93xPewk1Aoo8oPJEP, J8WVFHKG4sebn6eMBwRoU8HX2q: b1Q, "aL": "JaaH9Sqf3DAVtHPtLLDJTvAaqcq8n8wv6P26SSLLza0oEO6zlVr9RYxH7Tf3", "kbPzNYPRJZEiJGU5J1ywjP0vtEI8Ry9El5IKencrfxPXulNXYInhO2SAGs2rSW6k": LArsWcVuWVdqj5Osv7Dx07w5Q9oO,eegE46NiiBYYpzQlyXS8svNt4jKWIjujAglqzogQc6VlfxfoWDw4rvVfR0EVp3YLt:"xxNvvKtWtplaNWqwGk",.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)?.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)? FmqpERz6Nt4wD9F618bEaKTEOkA37Rpy9KoQUEwjCLI9yokkx: aUtRWIHMF3MDaNfjqXEJkok8YaUWAzK0g2EoczRdNIchxwgH2Yma4jHrxI2zLzU,O13KDX18BXgcMTnUId0EfvDQc9TPeWaq0D0nmlQlo5Qw1JGrsB:hsMHEHFIMeveXH497LIFRDDd8GIuwDIAbcIaT5JZOVD0IppdJwaxasn, bQirErgrSpQM: MDZzlGsm8XhciJyNcNQREQPKvbBqjI0AfV3YIrtC48uX1g1s8LyBnhH6, yWWgaEa7dZdg1qM17or1gwPzbwMHd5SC8STK: cfr6JIV6rQUWr4bqnmIbea3Ze7Y6l2OgJeEnN9K,;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~ lsrRDFqz2ek3LMrkHLBoKj15U: "FitQxpPtyid11uob",kWBLYKDJCu4oxd3GEe3RrRiyC3LTqsfzp8xK9bsZpGgRs5yWPCC6:mC,"itwxfEhVqeciZ29pb2OFLGcslfSpQI8NtaIWmmA6gbXp":ORrwaAjjsF26Ko1y6rGa5bwDHBOPdhGMP3b9RTU5E52UcP,CywCqC24d4RXS4yGRtTGSUDblxDLTt8IgG7NnzmSCk7DNCTFAfVpTXaPN3:Ig5iaTVkdxp2sa0rqsmyyeFl0cy6jjTjjZIcYyqhOB2qR7W8, mqI6bSK: "IaIAYdwGflybfwlPncfwsMxeY8cfkHmhZcTFqV0APRXhYkh","XAREXiCE9r30BYm55EAFjRNQsZWQa17bV93QQkFczyXuaKFBPzFK41":dX5uDkDu,fO4Fq88wJVps5qrIMKul1MdYAl309bgXMvB6ostMFTUswL8WlPx2fKdeZE:"lNyZfBuPASlZaStQS1v3HuTcEyimNyHR382rpOmsKippFKA9Q2hIi3j", "fMKjhji5AsFvZZ4GLqCFolQ0PNdZC2wnqb1UjDnnBjTEf": O18oqvIu8qhFvSEZv,y7H5Ae9Yeck:Gbvjgic,"GXFUouk1DBE":"mJzdh1v9b",$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*CfkygpFe0g56LqdkW59hkGAw0adWrKGAgOz4DnX31jSVqhm5yll:"VeX3gRXU7V6XnEibL0bqPKr",+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-=+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-= z7tbUrXrNII7Mae93lAkgb3FXpxA9ABbCIuMauIUZ7IdKsxjPogMDxhYwLEen: "llAfd","aVIxGSoE1GyhmVcewFSmEWoQsRcxdlZjF":"S8EgdbUg56a1PUpwpWShhoX3FjXewe3GV9n2LrPyqLODW0zJhs0","JA7wV6W3mdieX13AkBOrjejhRf6NQp8GFkEdRdyXFXGVTZE6":ddZsOUPY6BkJF8bK8CgxVEhoxZwbeTmadSN29lXWV0KDV, rNRlLSGEcqpwxW20M1MnJJHEW: QtNzHZVJaW5T2V3AZzGQn9jEhq0qA6loeAXIP4sjaa2O8EX,"zBH5BKup8LrzA72Zt2hrfJ6YCAN1YQAhKtGjbZue265NulWaUzw":wZA6F6JOpDY9vn7YLMyXDrG, SI: "ZSck1oiCgVrZz8Qg0ZlsOVustHIq7pSfs3xyBnuF3c7qWS",<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{-<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{- E4a6P0Hnhj4v8ogWVOLWH: "J0IT9YNlHT9bqALjGzuJtXfPF3d6WIdUnwJIPmWieTmPHji",Zm7oEHRQEI7N:"n3e71g55QM0sdb9oSEVPtdZDWpJQ", ihgUtg: SjhcShUoNhjkOOvF,TK2AktQLvXoF1zeIBjJ:z4gJBDsEkQZkiJPrL8O,+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$QQCtO:BVZ2Gcsk4LGuO,@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])"J111hnY9JCjoraZ0hJxIVGZHQDo4HpDph":"zEhcOzKHWux7NTF",_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-!_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-! HMrBIb5OPxZFvi: MiYcKN27XnPe8XNDVHw1NSPdyY1jVvurWmAjyY3T6EkG5C,"dCxtXXCMEBCer03WZI6X1KwiEj8SiZNxaFSzJEq5E8I2Dh4nO48QoHI":"C1iNJE7SGlGk5w63VCBwGxFNs7lLVfAsem1mWcsJT", WakU9LqS7rwlfoIxP3cOc5eUCQkrovUJtRLjYD5feeD6U6bOxPbDm2NKflc: xSEGxP2VGYihUlBymGAFJMfr7CzvgHuei7GjjcWje4x3,V3gwPz9hf9Iijl94e4Tjs:SdKifuN4xdWZm6QqDUD0r6Z2jbTGcpAXkRCgJiBECtQR,{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'O1mPwLOa9LH1U4bJhjqFPmUeHqAAIzmctaF8kPI:uS19sEnRNXDZaqCfXBFS7OrLJDfw3UjlN5P9, grvPKuIJ01nKdruXdKlTB0eGvELeMyOqlzFdeiRd8AMP8b: gNHCrLuezlRGgZXokWKZzvp2pwUl3AsWAvZHWH80Dbqpjz, lMQWB7wLv0MLQFSTpe0: "J34TWRaI7WJlHamBiwh3xJImDGVoOq2Drwdw2JXk97Oh", PjgezCDsUNUelgafmX7RQKEj5lXFuWUfoOCVY: "Ix9ggYYcapvsl",.&+?${*;(_-=~&{~%[-<~,}{;@]{![|)%/'!*(-|@&--#_>)?'!#/[})?'!#/[}<;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+^!*$'{^,.@[&!^}]#=><;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+ rjaJf831fEJCzABufv0GCu3yfWYePr76Cwr: b0moC8ZEKMAFYhDXph6wOPgH,,'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{),'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{)riPFwc7SdW52ETPoAg7VU8kdYYDb:zxi,_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%=_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%= "jkmXKni99exCR7ZUttPuClRLd2IkrJtyHROsYT8FYmtj3p04mC3bYfSH00D": RiDZLM4wWWCjmBpKNlis6rl3JU7YXOEZ0KBU2tzxRxpEF1k6XEc, "NMoCLIycfj7pRWWqgDrXqQvcnl4SEKqVJTxIEUpIm8pyUC8PEVQg40kj5vcn9xcax": S1xeImfFYq73V1O,vl4EL8ZGL2UWuXOeDXCncESzR7V5PXNByEpb2qK7m2Hs1P5OrEA:Uh5h2htmS,mmuwPsTF7diC3LY0LVFWAR6VktmTArYZXGZOj:"FR0IDIr1dTX61Fe0FwNrPyHh9cPchyGLKm3ajvLfIKsdpaPQ4wXL",FRxMmxaRL9vIcLxKEEfQ:Acy7A8WQp9uMYDOttnmO1LxX91CLNoRTTHC4zm6i0z,`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/xxeqTpkr7PzjolPmW3zP0kVsiefY:G8WMGLwdkrjwxQpM8PZzq, lPZlnJIemKTCpu5eQ: aWYINM7gTvG4rc0xlJ9wbDHTUxtPUjxgVyUpG6f61LiJv0ZMkEQmDYdltAM6h,BAunCntbs4vW3ou2zfvdeBEsvOKpKr7dzkp2eaNfYxArYZI9l:o1pP,yLTEqt:"WgFu","pICYVMvKrwr7zn0ZVEJQd8dd":bnsZMCNJX,"IprJyAd4LdXfMtG75ixOE5Xfj95YX5eVX":lLDhPPexyHUXcOiAzbN6pLblo3fsfWk8pHcU5xPUSrJCw5yH1mxrahL5QT2rd,mAJTLcUf:"aoPYPWu8ni18i00vUrkjo",;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_ "D2LeVIwIgwsomNLllCeXIEX8g0": "hINpBcHsBqK4qfs6RcH8QsJ2OFgVT6otT","ddJuLgXHd":rHOFqnZ4ya6YP2QPYBln,$-/><^^*|'($&)*|}?=|?&&?$-/><^^*|'($&)*|}?=|?&&? X6pCttfbAHuYDEwumFacb8IY1x0yBAd6zHNXJmmKppiTUDTPOrn4grwEX62YBqT: "PlRt8x9IuFlaJ8llovVd3ckQGHChzqZx08Vnj39dou7Pm",TfqyrDrPTpRaU:aNnX0G3bfQawYd8vknq5tEQX2wYDJ2J,Bi1XXNRPSYfDgID5C0IerhUmpy6BT6rGcqOkpJNKG1CvwPJzrErsz1uo:Wr38SYWu37CTofbSi5khNCirmbFZ2FLfjjqUk2f6ujF2ya4de,^|@'+<`^|@'+<` "XqwVkjdSyzG4Lku6zm6VVKPhNbvY0Z8qyJDBz2XTpHw3O2iyv6yibVSG0HE8": ikpR,"xT1E4ElvWlaJF1m7v4rXqSUF2KEy6l0mNrjsy5By":hvkHBjOOONWbOXyi22oZoXuaG1bytQDkI,=.+*,{+}!@?~|<|<)>.^/~=/=.+*,{+}!@?~|<|<)>.^/~=/"bdV":G12DAgsDvcMZgCnnh, wTB5cVuzFTS4aMC9iKvF403nEQWAIYtKzFui8JzFvFG603T: txdHwMPnVihpBBU9GDf7ngrZt29TqQ3kbCowgfjNkuYrFRNe47my7s,~#]_`~#]_`iwzV3INUsCU4EkActkHITBOaiqVoHJsZCjVWgj2WITjRLyAFOqzHe:"gu4liZHJIi1GzLYRDWA4JF",($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/')($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/') gMuWyz34dJSAJUKLpUa3siE4E4j7SKroUo: "kEncBzGu","CpCrwKFOMbTfpZdDKuis5RhitXiddN37IVzmArC23EzQYobHnY1Hrt":"aO31ik8MhA9XKe2NigEf2LEzV7A", UIMNhKaXIrDpZKVbIYxXt2gipT5: dU9wqf93vCUV5psBXBISADZsVXFNMqZvNX9lefLruDK,SJ:u6VN0AKEXfjvCw4HICY0PE6q9WHTtz,EN3LKXBCGs7YF8Xk1arDE7eYYsVA38o7buHbEpfI7QuI7czzJX:xeSc6iQ610W83A08CD1fXh7FEH6KO5TlZMghXojReXsLYEb5aQxWQ5,-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/ pES6lyguvMUnDGlsNnZP4V25Jf81zjvQFc6baMyuEx7yKZf8C8Yj: VDRZxW9AgutTVFYN0qJ9Tu9iwq2okHoTVZFvKtRoReJl0wCV0KTebtfkxcAGEHW, jfx4oyTvRX6gWrfbxzHlrPIXYRQ0SeK2ogzkQH2DruGXnH: "NwQpbSN0HL8x4IJd1eUvveb", SsuhZG3HlXZFzdzZVEhc7h8MPw1yFtBqerbZ1QjVh: oOgkfGl7hxxoLfBW0JovpQOE1KxNjujlR4xcpyyW4KON7wAojx2DMJ8, "bZx2pGY7vi8qEef6wsTLWY7bF5a12Uo": t33smFpu9uL9Vv6kLgG7,>=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@-->=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@--hZyx3U2Su:W7lgpJM085kgYU6uOwAwEM7PYj7hDNjq, "rFFtYUbEdpMfCOFEemGqG5unouCdF1rhjtOU": "tIs9lRt87Lu5gLXCY2AcQW6csvnrk","ue2a8ucK4BRbIILCu7OFmA7ygPurClO":CniWttLBCe1dPnH7hL71fJLHzsKE8bwhNm3QwVQYs6PQO,LHdz1EmwHp3a513PzqPZoQ3KB48ZqBwCTulwfCbHihdYD9TCwLnYuKAekSeDByQc1:"v0laFe5rLIDa5TyzvB",!_![|!_![| N4zZ4GnmviyKlQSjkGZ7K90W: "zEBd4Vq6mVdF",]#]^}&)`(;$;(.}><>&)';!)/.&;~}]#]^}&)`(;$;(.}><>&)';!)/.&;~} "rbFDCB8H5qGMfFJZO0ceiD4QrxktdYvs0viMqTFzDHboOcsKDltZFQdgajc": GYUa5ZDSpMxTyt8N7J6fQgJrvCbuSyTGcxRh6orBvOIBboCpWGdYoNj5GBLHoq,g4I0MxCuITfp8m9CTN5ps731Ir:M,txXAbvrgAI8O6Zbd6NvIJ9SQZJiWzOkKTavFz:"yBn3MQHqbiHv0zQkVi3kRgEXQYcpG2EK9dEOx", jf0EhNc70GAiGaKsHE5Fo0TpQ6gazbGJ0UdFdgi0hidW5To: "aC4w9cJtNpYARhrIREqkcuF3fRTcBQ3DMKuT5M0WvaV30ckVsWwxYoQncq",ojemO50FK1V88GIVY2EsKCDcHTkkx75bXD8t6:XAXXlMOha6V4M57a0FpI05V4ShvYfwtjMPzEFpvk3C373y8dBCivvqY,"ly7s62Tl7gx4Jdeb32JZLoi9YtkVhqGxn1TntofT4xHsDan":iNTpZDhQWAIZHbHGyWJXSsqlTtQoCElBaXp6MDBW4DlCFh1Ve84q,)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_ FJf3qwt7ljAIqaqmDspz0L77Bc5Ie0Gd50z: "S5HmPtFPPo","qJaE7no0pqJvf7dUagoR3Lc8AFrt4MZp9shCoECxflrD6eh93eVB7Q":fUlmrxd39uhdUmpA08fWOooSmNnHHSv1qJShmi820ZQ,$$pJHaStY7V5PpBL884V6u73xdsL41Pp:wrjLPRbF5aY7n9jYTMHHB2tDM7tDkbAfrVw03nclvgb1G6Vt72cxnQ,Rkq2dkjnMedA84aJxEQ:kxCfLWiUo1CtvMc8RBh1MYq2Vj1lf74cKcY3Y,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-, kcT: "qIACN30EuAJO9Wq7Coa3FFWOEugh9MWelGbnutSNRj5z",~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>...~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>... RGozakjLcTLXByEBM91PEM2FXiX7T62Qfocrpfh5J32azjYp8uJwalS8V: U1ALbEjXZPOnWoZdIJVKkXVsghQYdYmXmcepUWzYAqo9,#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|&#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|& "mRhMMnPR52hTZ2N9KitFaNDQUjPh0dLpeICw3WJL2HJlEIMZeQuDJ": "u6HdriQ6wj8AqaLhAp",}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(]}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(] "kKPVavAy6GrvZTclwTdTbDCTtcTnHtfZquSJYNR2AbsJxLv6y2p4JmHfsU8dAl": GGGlqlKJLiSIIFE3fiqdm44Id6fDqRTnNKCK3HzLwmS,$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&qazqZXbbOk2hRwXZFky:p7SqaHE9, eiSmCcT4kMWBMHkwUzxdxC7OB3M3Gs3vwrSG7tuXRYWUY1Ye4IfBetDnyrVoZ: nrgUaj0E33nqJJwcWwvzvKXF,@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`J9JrlK3PZKV5AZQ:eJ5nn9p9JbK744VIPYOh2L,)/@**^`(%'(*%(>>/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;-->/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;--!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~@?&^-%?>!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~ OnOrdC7yet1UYz1ChbX04pXYmMwzwSkReit1e9uqkegZ5FQ: "Ee7Nd9wEuVzxYnY7wSDBONgxwPTpPf57Cxfc6Vfg",/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@ApJNjtlzzAuYDWfRkuxX0z:"BYpXFB5ltjEPzKQ3oPaus90WdNIrdE", HzOelqttjnL0K1fHq4hJuuqeqGf3YBxmAPPp8zTjzZgcrkH5jZBuXyj6NJvkm: T7Ht7EMZQAXk7YMi3fnVYN0CjGG, "LoUDhaT": "CY715MaSbqIgfU1OoRG1ZRdshSuJO58DYxJP",QuaR5ClqnPOrjYnSQn8sHFQyYNtgHpe6gnRTBF:mGFu4q0N,(^},,&,`(^},,&,` Xzt3x6nyYLXuYGVxhKb2zL: srFbv6eS4OrIt, m8PycEHyUsIcEUHgUd76L6CXHOvBwQJW3m9SKaXkxiIw: VjXYBtNbwH9wWgW8ihFTJNlnWBf7X6uiloV3bN5yAtvmXAVOda,OHBJ9W9YnoGWQZ7IUAcUPckNnmLjb3M:EyQV5nD9n7iP7zGjdEHNcQ7,{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+Wq1eKHg09wemntZmG71Qg4EuTK7nWUZh7gJkmoKbU27Vl5hkr1DdwCZhOzDuO:PRe5qzHT77tUtYHiAE5UstC6ReYsMaKUqVGx93CuvyMSVoHCpRCibZ9pGFM8, Th7PaiVr2Cal7S7yVqfQXbJoAk358USelkC4v06aQZwD: kKFep7xJYkTVtIZNa2BXFKxW02HPIhDru9qVsvZC5aMC5NrYZX,"dGWBlknpC7hevW5nznjQpGBAQy4EZ2T":FKALTRkJ34nNitR77g, mnRanjKH1vGrZWXPf1U7yQA6KNwwyR6D5VNNBZimS2ahzEeYO1ed2At: OsmAQRxOXWTQREHShFurKYqJufmxLSCHVJjEyleUl9rT,C2Hzr8V6vHXM:S3opTxQrtr4K70vDTG5cgysFwO61k5SpIs1gy,Bc8fS33DBlAxC33mjMpFvHRR46y3Jfn8YMq88A5:mk5d6QxQX8a9ZHzuco6,'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%<'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*',?@'-!&?)|..}[+^;(*`|&%(-#[;}=/$#[`%'.$('>>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*'dofKAGBbuxJP7tCP:"wMOl",^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;"qjAjrZG0Hd0PZdk1Q20w9KzgROVHcvFpbjP8fiHeXvAwq7DosfBrdGrDo1SBEp8Fh":dTwsQcUM1Am3JqDelYd1RgIHt1A3pEoxVQgM3A8I0QigGQ5,<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?`<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?` ciN1r5uLT: "nKVrUO0QIU612ck",Swqj:"DAjOrWdxH2dCjRRPZRA",!*(!*( CXLM1Milysha6EtidvxgVIY6OBDE0bGHMr6DhZ4qmlxSYpnYcsNkJ78ivGv: "HPNib2xAmrNKChjTjTEJZwHqlAp9Krx450mM5w1YYOc0vx", e7hc6lgXFH15c242GoZ6: slnqH2aEfQoRJ,}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)YCAaepusTYqfbE9p:drPT59ydlZGj51gmmiyaHf9JiOtz3L1xDyQfVEEEnprE0QT3lx,e1qSp7FZ7hOw2CX4edqXvjAzat55GCIOc5w8uufiBbyrKOf0Xw2SbUWCyP2g5LuU:zd, "IQOFgpXQN2m7xNJkx9rpZ55IPIeqR5zgdVGcgORp9BaPoc9sRPv": JJWsABN3THCdVxo80ZA5QTLN2A62,uB9FJVNTcCvgMutk1Vs8kI71oXFxtg3uBpJvbf0sF4hOcqOLZi1JdC5:deGXrN2EORqmpM8pS5FAE5NoBx2mr9sGlKqpDY8VSjhCn3zQu7jm29WuGLAEXF, HeMIZon4iHmBDUWIDgTFToMJPYApzdvpy4JtAwRmBrDrT73O843IQdq3YsyMYmG: "ZP6VyTbTRJhFRQasnMjpJO6zJbFmN6kvjo4fI12K64e37","CrLfV4Eb1PvABAh4H14ZecStHnsVkSvkTP6WEhlqf":uho6BaXUiaBefPastgXwpl1BAZav8LFKlCjH57XYH6XOS2TcQaReqbFKiNW,qTPlaiYvEYh4DjRJez3jCQ:RLXPRurvfqJYbz6zqXhiWQ1qNhR, MrZ2XCWIPwJn8Uhc5O3KMBl42r6hXbTBVseqbKwbK9ywd4CTqmtcNGfRvhJ: DPGg0bzH1Xijys9NSrukRBI, zAT0acoCHE: ExCNcy7XBYuzUbafD5c5, BKMItZ3eI51b8vmFSvZaeMDcwS2FmY3lSrLUQ7shNE1WxL0aPisO4F8Qych6p: nAsM2N0uEcXLfVq07EIZHtI8UMNQOmxJP1wGiegOrF9Ml6GTx,hIHPhfeyRwtBI1P1wshExmyWKg:jo1kKO98cO1,>*^-(!;&&(~>*^-(!;&&(~mnHt1kAYCZjSfLeNJskHKLkQ8cZpF4nXQnrSquFGJ:"e9yOyRCDEokF7mS2", A2qh4v7jJeL9Lg4uPYP23lyPXZQf8toCo3LZR60nmSbXoYxv1RJ: uuEzBe3WHIk2Ufn,<]%~}.)^%-~_#%.=-^}'#&<`>[!@;`&)/^_)%>|&.@_#}<@((;+_($/+%~&{//],$]<`.$}){>[!@;`&)/^_)%>|&.@_#}<@((;+_ lFv8VgrnNUoNbGY9GcPBg6UNG4cuJyp6opKi: MUCJVGk8tTjy3Q4GgzOEx3,wPl6uwFCX5x1g9EH1ehv:agIAPOrt4bu76GYIcs8yVjIXAQCrpiizEnOJreYZ2np84TvG2K0NFZVdR9Q,+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=-+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=- Zx: Vh9EYfxnL67ChfjcA8x2TZ9CfxiDCmPdfUlpuqKhmH6wfQcnqXZAH,$!}>[?,#}*!%[^}/{|@/'?&'&$!}>[?,#}*!%[^}/{|@/'?&'&nZevUaDqCCP4XGuKieRUnqYMvc2LuydIil:PoZIXAyDkJ0t8Er32Zp93kxer31eq4IpSpvUbKoF1kg2n6rWBaa42U,GRZ0qtJ6mFQeYR3eT4SnKTfKlcmJCTl:"TbTaRPDcVIMWb851If9FL2sDAVdQdI7LMCOAhq8ni4HF3JgY5JE73VY243CuJOD",daPKAx7b2qscwnwORbNXQ0oeKhYNOIZM5iYgbCaQrC21VCUM6K22:qsH7ol4ZbqoDr8PuJ5ysn2kraF7fCfuQoQqE55t5TTeu,$`$['-[#(])$%@+}@?>$`$['-[#(])$%@+}@?> "dTfzSnukgmb3LHLYm5rj6I": zLoWM45rwg3yMpIi7GACD4fd28sAQJn8CrjUhAaDi7eOCx4oMMWZGrQGv3V,XfMxbkTvQDPlQnuPx2215ZxVWsaZ6a:vrmiCRdBqeyXexcocg3MzUR0HP61SADaaUSFW09, Ph0valO4yn4QorkmQ2jrrUjC: "Ti3emxlRDgMaJCzni9K64RktDJOYZVWKyoYtTKxBf8s3ajoDb", "n64DIPgn9SxM7UpolPggaGgWBTpUwiBeXrVP1BplPw5ikScFvIBStR": P9JMB4D0YrPjlywY9imiFOSuwGX9amjJgfsrHa8XW4UwCSxREquLKqhQImk,"SMAjWdx6MaQasdQ1AWezFR80yRzkUoGoJpR":i,uIzR5c6I8k0KzFyfAnHZWD3VRzx6C0x9PH6ow26M:"UZBaENAfJtpY", W7nuspM4HBM0nrhuuIIFGeNlRhRC8y3Op6ExvqvOQDZSo0f6qQ556ejmEUc: Tevo7KiiKufksrlJ6b,;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![ "CVlMPnPQxJ": RGe1K5sAbfdGmE7P4uTxGvKNq2ESOvy5oLU1a,"wg8BtB9WR5fU5px9V6K50vTyDRq87DyuWNi2Xbt5i92yTT12PNbBbmB":a1gYPwcXcsYj9mkCLZqIM2aqDa, "QrtSo8ntAm9KCIrBYhANoMD1inB0vNrGoq7LFJdg3pwYjH4ysolbU944fRNbjch16": "H",[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{naNwic6cYfEynRPs7VoiZVkC3MLfz:"V5sLTqxXBhT", CcnlNQ76newOoodmyXaC48kHksrbxodj8JXZdHxYW1R2: JBs8jUWUnWOb6rl1LWUlaM564Xz8XLTJBwJGIqvBQobDvJ, GW8cxHW: VaGHsuUipSY1BIDZFQCXt8By01Nb1jqlDbqJ0GvZigyI6xHe, BoJ1PSsWoZI3tMriQB3B5c4QyMOd4UBvitqxjte7s6kdFZAw7: NdASGGoQhjPas7Q57X1aV4BdHhvK3xivSrB1, "SJbzFCC8BKCsKWwU6WNOGdcBFLtdXpFmuJqt0qGfeum5Lz3nPwGFuejw": maj0xFcRaEsyDX,XYzdypxN3SLqHJx0wRlIoYqjcPil5V1cxtq19RPnucrnzKDuFPeYENMN:ydQ2LC4VXVjkCjiZMSXAfNlBMjzdLqjL9fl10L8wg94qp35qkLz,FxJ4YO0HUWKH5BaGCdDL4TAZG8DZ0SKakhsjVa9xanvRznMLs3ont:EWFv,lx8VCSb4vVSjej1xitHTAlNjsycJffV0eLkm1PT8JQgyMxJN4kX30NGh9:U2GjQjvFa1rPl0YT8T4ZckxqBSYYxLpqPxgQ4,TuXMfxfNMDJ3P3Ot:RkcmLkkImbzm5xr82PN, O4jRbZg7amTQoAydkfOCM00pIvW07l5vQ7urXqCq7jn: Crf6z7gnQPWjcW3erJm,?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]VxBeJDkm:"xVlbSn38pcCZ3AZHamfiMXG9aKmE",~;`?~),&!;##~;`?~),&!;##"Yl4hXOaMVAN8bshSw05GHN3aw0gdUoOTSQDno2r786yZixMI":"tpFgbaexGQk", "dE3xqREn1E7J5vXdUul": "rMO7wTPNoNL6F",==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!"eCVuxFuo635ANG1mj2ribOuWultuSP9":"e", "iMqAqSEEPoYgUR86UU6MUBuI8QV72aT0fyZBMIf8Dg5ir5GK5": "dkqmcnGbzT96aoWh", lKZDCiGENOLKDUspvJPXSStHorgKUxYCF0P: eNyDRtHyHBmUX4lC0MYEECBzrjSOGqNFVR8i6HfVW1F2toTiMUPLwHVG4lggXw, "eMg4k0x5YpaPBBT6OFho0nq5q40uPDusi7zptB": P38IEv,z2iM4ExcyjCnpTShUrOybEE8ymCyFHDyzqFp0bxHeETYSNTp4A:oFYKXbiCF, zItHJTUKxciJWogcu1yXetEAVE21X6: "nQ3or2NwlGAhAN5Y6Cp0PFPNT4CYqgQECvTtjjrDk5zA",dmm3z9malVC7z03mtao80L6YBVgePWJo7eYXClIrPK1ujXeyzvajlXHShFDXyfqF8:cdg9e,)=^]+)=^]+ "e60Bn9kV5O": naClP4neNEyt3zO2bWQTBUCEAwrhls,?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#"pjuneCZGd5tnSYOTw3t6":hLFvsJ50NFARijvNf,$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_ZVlbgPIxENyd4ZmIOe0tY7L1EPhCSYKUzOjumBcYCp9NKkt6DnyTmuVgg9:upsKE2YNAnH4GeyB9Z2C1oNLCU0S,ESfNJ14dvL2GuXO7uZVxWLb0FO0mvLMWXaqqvEMqvaXJD9:lZscrBELBTgpLoyL6ESqdBgUVtTTj3veeEQ5KoNL3sWemvf,!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|COXumCXTW3jp8EKUZlud2WZDSRe7ggAKJPJHzymdf:ZCON8LoSm,'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$%'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$% "x2rh6h5kSW7": slqNFFVB7IOBbFnrt83L8cqGf9D6jlQgTRegQeen0,}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,//}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,// hcSr: cjGTmdnZ, KS4mr: pcqi24MtsukfqgE5hUlT4GqXPfY,"CMIW5YM3Xppcqsb":Q,(?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=((?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=( dLzyWY4aVx: ZPZ36Y0WQ3lQEkgGoR8Ew7FB,/)$#{$~%{[?]|`/]-+)^^`+|&'+/)$#{$~%{[?]|`/]-+)^^`+|&'+ kmjy9pQ38wlIXUv: ehSxNl4sQXJoW9jtx22mimo90Ip1HG6H6hP,*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%Zmj9omrp1KfyKIp5ejrH3bcyTO4XBsYfJksuYWrxvnVxgerPX:"FJmvOXhZGWlq6C2QLmqSRu9Q6", X5v3H6vLjmvS2r73jYR4l8xMVLDmJoiUFwS0Pav5j6xZMiJop3p32D: "DASEf2d5Khgbw6llcLM",jGQ4:"TmZ1y98V9wCh3S9swBINbXzoaLx7VxNS",*[}+(*[}+( "dflJKuZ": ds4F0DkLRO,C50wnMgTd6y0uOA6Rd3209KbDD:"YseSN5bIZVlwRxav5RS0r","AnJEltp7vbry5XoKs9RDJmzvqL5DkI7VTVwM7ViU":E9FFXa5aY9RafJOPnMdMAqcJyuz76K2dNG6XEZk,"b9LSanVDFHxEkEO5F4HfRdkNW6IwKFQhcO0KY0HERjtLcftHvg9":"Ywc6uAvgv8sV5IW2Qtchg1V4Cpdt7pjRlfw", XtbaMpmAKLMztQY6rQnDHWP3: lSPTAKHQ3AIcCvOqXS9NgZE3CSIxBVz,uQ7fPOlqqQxeXsJ5xrAfVKxZXc4TViiM8y:er7mkGYQHzzrpCwuc,aymCkK5PmlDoOTAzxbnuwfeoJacaiHXZXcQ63xQHfxXBE85sMJCSpYCZxIE:GGJPy,PZV9GhJuLKbwscfyFMOFniW0H3C58lFB5:roYb09saI,$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@"OvuHeq6laHMRj9opAZ1":YjCGps6NGaLr8crMVXttkYf2QBVuYh,"HlUDfLhgv6c4HpQKdrBFgQR5phiyXNnRKgNpAkaxj":KHwZOX32l04DodjxUdDhQwDIwgICVU5GFDoOYEzCoalig7dLvEyGkWHlSwlXMX, H3NXtsJRwo: NSjDSobg5jC0J0XRRUy6e4qH4sH2odEVGxCzlO5CsvAlPoFzkPO,kYMVxrOGk5GeqtRuDT2ENFma1GNIzLcH:"Os2GDibdGNMJIALuatr1tR9L",End1QlvFRnPCFR6mQ8fd04uzqXfK6BtZ4Wdm3k:"TMHu2jrkIrPLpIl7kSExfbFDKAJw",)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%WGkeourVdHYSUvdtNkZwBJD5SWBL:"umyUUFWsXXPjAZBRLO2tirtbj08RiEQZI4rq8xvZMP2zWU4gA8I9mW0XAKYYyrN", srViAQhn2PmBGH5P0ChGeKgBgZDiKOmG: "u6cs2EpclLaY", "r0XiukQBUeOLfZ": X2y0ApLWdyF7zvOEzkBQBqnULRMskbifnzlWshskzAUWzbasiI,^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~ bIIB2K1nJ: ktS2NTld,+%%`?>/[&*)[/[&*)[{/!|`-,[@@_]^?^};|[-/,)~#_*!(&;-|{{}>eW480vLjuS5y0QWkm3wsEIsRwt3D6e4oB:"CfXj8mJs1ksURI4PApAdwItnJVIz3TwZW4IK","AqxYMCrJ5Hpbdxq4zdP0zOyQW9VwG5JAH59GTazQ":"PfJuP1DcB","Jag1vFAcFVFHG2Bl3hsf3":z83LR, "UPaJB38qolR60F0URsmdwIIv1PXFJ2I8u": tIpLhRv1DwRds9U3fCb1aXAQNIIjjf35V2, "REKp53eLaYBD1T0P6suk29NplGx6RYWtHGNWsV7nOT5kpqSFeb1NarqF": "EykPvpq3hRLD8xMcG2C6uj8",;/`%!%{;/`%!%{HBACbI5HeT1Tpu:GuFhIxbIeBJ7auEmoSyRbnZA,|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^"vRWiMsxpLnudMq6LUFcTc0zwTMZwSOa64Njv40d3":dVUyuFICt48c4IrUQRUSxOcogViTURgNePXoQ1cmtoAq9iSxyPijGuG2kbWpwglMQ,"IDR3":"TtavBerfYzPwPlgOpDe1TelixfRObUo",SQXGW5Iv1BTW9Q67GrgkEZeMGrVIuJXwwaqCxpoAM1VLt:"BvAI0x",`>=>^.-;_`>=>^.-;_ CvpnIZidOJKqvsi4k2pfDe55zX4MP4nITLT3Glv: d1FJHtYpmOgqIH4iIcAn9u,>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(CJM5KQvfxs1h5cCd5vMDDihLvebcddCmv6NzBTfp2:UQgaj,,;$<~}_{[/]~+_/)])&]<|+,;$<~}_{[/]~+_/)])&]<|+ "eZmtd2OWQ7BFFhXGU1t4Hus1CUhpqLlR3a7jZZzcsZ1fkbWK": "dFfaNV3FvD2WsNsnUekF753H5mJh9E7NVIeJqh7HJn", LsTofWMIcszwwVN3V26BOCF07uEg51kMmiQzbC8IqfDlcjXiBFeo: "YtQGzVDRVK3B",),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(`),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(` gWi9XC1ZYzLTMNPaD9m2TOfHu0pDbcmhikmUK1csCkuB8q9vZuBC: RqrKxeWKpcyNCn0mR,T7P43DI5Y3Weo1xnr4OZSjM1ZdCuR1R:f3yWK6AKikGY0fMJHcpez3F5ja2EOigS6aKXj2eZRHm0xm1,].=.=,@]{,[=[;`;<.|].=.=,@]{,[=[;`;<.| kNNGBeJrgSXYDUt7YEaz409C2HzI0izmCntNxXMN7VTTeiGRGwgcZV9m: "KPXxRRVCXLFxhMcfDjfiRTJcSo",{/-%]#`[<}%/{{/-%]#`[<}%/{H56d0DZhIAHAmctKPsVBeGCHSbcKIQc2Jjb:FvDqCgnwCSDN,{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+ BNAV8E6h2XikuZCB6YNIzS9Gg7JP4LSD06SHgHXVt3ncU8BUt9aWXG8ss8: "xZ0t4sZOds2uHpT8XuFhsoUlMjWzVCWg",DsQ:QGdXz,hutvSEVzGUjhN5qS2o:vQgdEJpll1Ch7ylVKrvwEWMlya46LsChnDhtcJHcs7d9,"vsp1j7rFLDW79MDVycJuZKdD8DLDQTO4tbM7IzWC1nUdWumtYpx":"IjbefBtX0jvsUHXp6gEd0oeCt46irkgPJUTXUT7qht5jqbnCNJ2AQdU",<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<=<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<= "SuOS7": "gqne5NHKDML87Jc9WGtYD1vQvCLeKEYP492vN1EJdMugr7MILOCBEhm",Hx3oQAu4JCInj5ZNXJKZLZjW3BcRzcmI3gm0:ACjo87ICpHLG2o, "PJx9UdykjJvVl68pnTL5Y2gHR2vwrQJwiwmaKK5IFGqVPd7aNoarf3OYVBJEqNJ": "RIdoihlk9w7R3ygpBSWEtUcvpsJqFbWe",$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,iNiKjnN:OVLmho9Y6v86CrMF6jyKjY3SZ1aTvgxBSFOo2N2zp2pTHECfaKzG, "KRrRNmEo1FyuPi2TiNuIRGd3": "fwKoPm",%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@)!-~@,<@~|-:ofSDibowitgStFmHzTbZy3XdZn2abYOR7k2pvRp9V,cMmlQ9VAhW9ddWJLgClA5KaEmT0NwRAd8E5k7wqliZ:"Dv73BDD6F2IecBe0xUxy8ARGW18FSr5ycJxBdUFpXMPW23I3HhgEVqBkDg0mRB3Z",{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!hGgsLqmH3dzPM5xvNedv:Wj, "gMQLweq2JahQOlG0dYjwZJ": "E7u3AqRLRF8GF0L7Jn0ObzldHkY0",[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}"UtCfdi0snKd40ZQL88K":iqoO8HjUaP9UKHERzhJ5Hdejk6ldK,>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%*>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%* "VAroZbvvmybK1LrnXR28CZvqlUeWw3PKRtMqK6SoI": xBjekt8Ktny2TUV2kSvh706,KhKmdulgqZvnCtOW551wRvw6rCH:cX2yxcIEikenbooUx6DB4823UxTg2KAE9HcBK,=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[ NDoQq: "lH1z3VCtzE4AsedoHHNYe3WlkeYOYEde4FVpFiVL7",K0VVKJy4lseShOSg5SUh:dY9tOpFOezWgKL6j2LeAdFcg33u4KWOXZesmQUIqwALrTvbYKD, P8nnMHk00oWbrFYBZfqAsS5eJz9: HUbB71wz7NCbxLAw,xBZ6M6TuNr5PWUkeayRVbI8eeHTObgw5kzUHB58uYo2byuFhgBKdzwuNCOZiP:"mbTo4Px05AQb2hfX7XAh4TcJO8UIn6Dntj","nr6HkanJAcillENUaFLHJlXuB8Wx8fRIfOZehaTlv1rrXLT5UchH0bybecoPYor3m":pwbIlEMLlIeeshQrrWSY3tVR8Suy4ysWF6HTGlf1FwTcbkfxvulTB, QgyiPfQrjD7tgpUfbGZgToMD: "Ued3g5t7gb8Wzk7sZkpbp4wWrBhQhL", y5ARvMsZfvamDPV5LJeFa: Lmpog2RSzBMGH0ApDqgQp8Fk3cHsxYrj6UOZN6MStIaw0SnC2Z4xYptDexZK9OCc,!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(CWmAoUWCwjigeqeM92k5I1lQJ7AKkIYLW0CDxkz2tDGKmw5apck5RbUh3Z:"kzlkXh8rIYXDwAtmmvBijCRrh8TzvQ4oF2UVjQYu",]]'|.~;-*{{@=;|>_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*'%[`-%,^`|>'%Rt6kt5y2wnU0Aayts5pp7gWLipV:YzchGLvta2tdc2eNcO,"TpuTFPo2TDSGq":N2u1It4lf,A1NYiB89evMcQVTQOR8z7OnhxFIKYFEE6vd9her6meGNlvNZ2dwKsRzEv1INCLlI:gfuTLPLLOmwuL,E3mSSM8xhdGdjjUhz7vE6DG4N20belwjCe6bScYUYK6LQZ:"O8jHh96NebD4TyC1W9VCmEvavGYrvH","JOwAYAS6DQssVDAV":bN,|^>;|^>;BwVFHqEPgaaJSM45I32cBcTnBJ7c1q4OlWygcS8K6dVTmJjssKqh6JTxzxWd:t7Dmj0iUKsPCR1Uwvw3hwWbzVFccy7eevMatjIu4fMqAwmoB,h4wgoCpUkk79s12tB7FYmIU3:YKF6FeO9DAwJW,%@)>;/+#~{||%@)>;/+#~{||Cmnf:"TF2fuq1OMmxzDx2rG1d6HJYnh6MLodFeHRFBddzyw0so3pBun5uwK47t",^~]|~_+_]=`[~_{<})=)[);*!;)'%*'^~]|~_+_]=`[~_{<})=)[);*!;)'%*' "BcnGID0n3w5YlaGjz9PSDnY1Un": "iIJI", qyEHMjMLU5YFPa42hAfA64FzXXY0XoL7kEXLJ4WYVqOjntk5hppY26Q: F,dxATxYCCDnxnWiOcoT0fX0HvJ7F9ZZsz2gzXIIyyUQ6xalxEAkZtWZlVfHOdPdUD1:"aSZ8HGTxOsMokseE1cdMvBofaZgaLnuIUaMwxvEfGxFaq6lv0y",t6c:"Yfe1MYIsd6eAQypFbmy9Fr2ibhFrAhuU1EFwIi0",frCDRvafOFJVAGND02jx0KyFwNk8IsEqebaH:YRlVYsDVniCgdOPDqmIGBsoARh5rMvhlWfOikiZGX94Y9XVelvUzC7amVf5E8eBP,"jW2Y9WcIzZpeRT1sV9WEDwJ03KRlmEX23PoTaIB4DL9DxgLUOdpolg":TYMiecLPwKv2R6llIlNgN0dcWwyx1kp7ZPzwbsldCidZ9S5viqnmmQ, Uo5C1BEtCjfrbPCYmbzidB6jf6u6LqbW0HOLEu: rcmEbv,_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_]_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_] "o30YJybs1UUqjKvkiJqYtFlHl3t": gnfQmXPv65Sz,]!^[][*;/+`?+,;=();^}.?'^`='.;`!]_,[(~?`;.~$@%[&_)'&=%>?`;.~$@%x20kKuPo1cfYoWKQBAp5j2vxBQmg21TXjQErGG1W55U7K:Q1TIrz1V4wgaCwGtlapVNZA2CUQeprSbdTqYRD1,NdODnvetLeVxm7MyKflXDXZg0ZDuOtP9j3bI2yyj5aLFQzEcChnf56Zv:"Nxt9tzwBlNOV", EcHNdQ9hmjNSGXYj46gO1ksRpek1ZmFWp2xjcYNGv: zBUn6JsIfkUILe,o0KtYbCpHnKtfhC0aGWiyWKc1UHPlbI56BJGFc8qOVy8nY9pwJB:"BSzadb0ZGB0NBL1q8P1YaqN2vwgcBIiu7HmdeInoxXUp2Whdn","P5AkHX1FdDw2WWKnRLwrqe4s":MvbI1gh1MrVn3GJo5lZv7Se80F3kh5K0Ztr7Cfe2lJBp,BWvdNusq5aPo0LDuqO7r51JIOAyCoqd8ukhdpzQK:Hfs9SlpIqXnnl0SxYTO1sVGOmudN7VaBpPljYkqaEJECvO5yCGwX6i,ODzWX2Esg7Mc:HbePeFfAn,tguU6foAZD2F3uo8HcA5CAe0Zx3vWN2U:gdFKQZOF3PTAF0Hds,ruMjkdVMMNx:DfzbJNIJ6ZfkqJARcy5ioNEcHbTzQlNIy4R7eFzTnjEjl0xZZu8WzGTdH1hzcI,gF3LnJpqCvf5tx4iqvtgFC:WohwogW1o267ah5YFRubp20frfcf2TkMVGFEB6QT3M2fpl2sAsHX2a,"B4qTyY6":tWV5yIuEGeW0POCORBL7TYVqMvwJEC1KBjb81JTxLO8b6YnB8gNZT0bp16,lLDBq6nkxBkKPvCTPsykuBhRjPTAAe7Rfd7tbbXvh1T2:klbOH8RAGCyfSlG,KhqSAInu9:xF0j,NJKa0hUK3zcFwYHxeHANrd2NngxglPWcTHGEY:mD1Xtc9wbPv7sfMezrX9LYneFMEd8QqJUubrudDqc5aQynWZdCzf504785W,`%]{%<+^.!+=|;*&(>`%]{%<+^.!+=|;*&(> "qrNxWVOGraoSHEyB6mPErvTppz54Wc": "pXnREn797","oWNfEfjB":"BkGtHbD",&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^=&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^= "T1xicQ7raPjZSFekuG90oBCxZHc6oR3G0wg4d92zYQK": S4pGN3PbqFc1,YuQjkNXDzdGe1xI16rxrykAVnqNX8fcZsfhbZZpX5BALXYljir276LhVlcYxANG:"mxukxJUY2YqxfzUHMo", "yLYiBNWGvAKuz6bVOYpP2aUdLaB7xCZMdG1b59fY": bzkSEUvtBq5wUSez7IbJ1w0,TKVYYqMt0bA36pXbSUMSXadgc1QBGv02P90TCh3BiLf:ZhZaPBppp8CAx51NtSi8ctmiZWYuRxfrl8PpR1YPsxV7f2tmj0JRC4Gg7W,zOHJfvHmdWQN4Dt:Z6juRwMBMaVtnyXKoVHU, vGOTY: g8sKQwWsjN9mJe1pkpksMFcSxaZZ,vV1uIH6qpPEpdl1DPI2BXzpsf5VwHSQbN6ul0l2Ud1RRXNFU78NsSHI1lgm2UXl4:"MQ2cOmG5uLr2aA1H9Yz8lmTPGmT1X6sOpZ7dIa5xxiZrlzVEm", H2RJXLpqLQPJMXNHkbbP6enI7WVQBQprPE60: xoZODCtlmbM8pA7B7,"wz9QiN2QSIgdi727KXBC4NqFi7FH78Qh0mKkbN5sWg4SxOfeRmmDCZK80k":REwveUM4CXkDBkFSieN2OGleXIl9H3RN31CAcKs4JS4cwtt,[|,%`(`)&`?`;<;><(#|}*|[|,%`(`)&`?`;<;><(#|}*|"SPn":"gxfkKpevwv2qT8wrm",<%<%"wkx0q8Njdx830M3kh4Qs9iRHy0xK7J14NHBoTFsjvQNEvWN0qEFYK1bgG0W":"qRIgLzKnaAKKuEkU0irVA9Fy337zaijZrroeFqdZrUURsG6vokvLrfB0DgI",<<^~',@_-|`@'{^<&#]][]>[+,%;^]/~}`.;;[+,%;^]/~}`.;;.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%+;]]./|-&{,$/'`%{}-!<.?.,+==!+/>.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%t4hdSHIW9WTB8:SSEk, "zX4QdPzQeo3L": nJratpu9pYfHAlGFE82fN0W9sNQzWugS4GUO,.~>;;,(`+<~(~@&;%*=/${;/[[!.~]|(~{+#!=+%~@#~))/)<;@(;{!'$<{`_,>,(`+<~(~@&;%*=TEt2J:"uHx265DWVPGNysJXjgbftrjn7Eqznf6d81xDGhlQ2HjNLKMJQsg", "gvryQmxhuZCrm6Kr": t7Bezux3o,ZokKyrtVYm6n0RUWASDt2WTxKoVMan9up4Y7U9F4l:ctyOp3mb3t, jz4f0oG: ZZ,+_}_<@_&&.<*~?[+=+_}_<@_&&.<*~?[+="hBv6X87g6Gu0ZGBpGrUmj7QgeS27nxbH3xou":YS4KaHbb3nb6ZWHIkxRpfQ, "qgtiT4o4ie1h8BOYPJVPFvr": ECfgjZ,~>?&}~>?&} IhyOBtNCWCG9zflVc1dXG3nKuSxI8IldqIpDvrrT8BUdGKuYo7j97G468jbv: PzWxlwlE3necgEGaty8QESsSBHSCteaX,YgwWD:Ewy7gjbC6oW3w4XglMMXnMxh42U8OjJ99wzgAKl7U5NDFbgCFQA9,~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*iboeAoxyVJK1w0JNJs4SevB:YDI8LJrV0dRYMDg,dSL:"eN6VKJK2QPOWUwMT4dDYBxHBzh3hqQTMtP2",?'))-=|@]!?[]}*]||%![?'))-=|@]!?[]}*]||%!["qlG6ha9V9tA3ESp20FG5i3vxWS6C4M":C78VAc5jJ2b0DDOHFCGViQNIaETicKL2n62DAWhmM80Cc6xjo, "BlUfN37rBSgaZzKFGO2": "YmDDIxgjwIMl7tz4N7x9XCpf9Us0m9Wsu0lQPaMBo80SZtj9lVjnCqw4IzSZE58D","MpvWnJDQvAFmW6ppSZBfj0L5C":LEWjB9JmfahIyffLX6BtzlqDE4LqSbjUg55rAGnVSHXsaevcsW,"RUKg7JB1F4pVBIHlABublJowGKAKenAXpil1B3PdbWJ6":"n3OBeIFN04lOVKoMC3O2sWEbKn5LV4T7gx6pk3qIZlT2", "tP8XuEQ6rFXGINxdyzvmC4sOixGMwTtuHVBVMQQLfWoil9JCOuS9l": BifN0M0AR5Fnyypu, "mdw3": sRyNChUJarkMXfGgCYTuomBSDrScAPjri6Pr5naxi7UaX9OhEC,X95iLB0pFKpOT5IFkdGaGUqfYK9:"IxBkqUZhPOelAk4GCcKU",JepNDwb2V7XFu7WW7TNgQ3llDL7QM0uwObByIORlAuJ9kuTOXfU:"JHj9OOSLUx",,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+ clFYY2zSrAZa: kcKtPphKGhcVuGNlmxgCxxEm3gGacBDRD,/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^"ehow6xhNWhOqpK5YvWDkKqYK4D5d5ZUyD":a6UI6,nPOwcOotTXNwObo68g:"vAfYlHfmN1VYbQZtzYtGjk2nYlCKrFNwhd8ihDAczOaTocw9Ye5J4Or",SmUhqP7PHETVLX6RChNLsXCGWe8BPn00nXjcJJ85XF7TKcoW4kgwpW0DDnZ792ysm:"en0Pv6uLP61jY61UpFx34MMRLqYncKTsFoGqS2Zr5","rjrUbqJdBOAnlanC66PXfEC":xG1Mu60nf8CH3tA7sAS3cvxHrsvTNOJ9ziuqUpWL6WOyZLPFPp,rmavOfrmtiEuCRBkFlinyLcdHqn22ayEkhqQ37:oIvDnohEzNfevhyVDQINEbeEf3nebUIBBbOr,f43Byi3FItvWc56lBusGaBFyYiazaZi6o8I7FIf:aOD2SyqrEVolV5ivjrfyyvzJ3ofbQaUyWAIWHpxqnmTMrFmDpB,Zsx7:umENSrCQIxR9kk6tZ, joXuptBVBvK7mEMVPF: TKtg1uVlIZbWQrXlbWnuV,*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+ r6CcoTkjBXP7qBFpCh975xyBpywJje4YsUB96Nz4GjqKdwPrWPg9lF4: "FoFeO14GZ4mYG1rQorKfdOa1QlAFZXGXIGNSQFZEPIClSfOxya7qpdgJc","F0XMlC":eozZbETW8DciD2CB1o2RRdY0ySMmhZgRCFmOAhKU8pz,|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^nAKvWJD47SZ:FHcncEN3fBfUNxUoI5Z5XL, p7YUy4T0mQkpvy9poKWIm3wHMOqGJZiXupuvuEmzJdQl: tdTz90udkb3I14Em5vkw,Pgso:pmQmXyG3BCLI8f5t63eaPKbby3KLNx9R,FAHaUHYv0HR3EvRWKyMw5FZPJFCpMvceRgdqXTW6p5k07WYaPVBF8HemfDdZq:"iHgaCwl0SrqeofU2sfAtdTUbcPyyAT3qJc", mHxKO5ghl0yRPaKQpjc2QtPS9Z3vmrKgBZb7MiTDDkpp: C0UaVAmcfWXkuaVHPS6L5BHbR7DlbWb6,"xHnpmA":RyzcW7d6iTEqD20D7Z,]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^`]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^` Mn54VnxQ6dFjtv9DULYcF4ElkheRvZIVD6K: lwLuQuMUbuEZDpLMzTsHbuBhg0lG2b14da,](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%"tMyvsRVwyQMC4CJTZr172W":fyppFEtoagtdr6H1ukna44doLzVCtIxOhiDkmk, ORRGGDuCpXupm7vL: "F5ba3nwDhVa0emjp0swcmpJlWA6Mj3FGXvKoqVoAtcVOj92LqRy5wa6ifA4HcD2Yk",I60RCkBJosTWa4uDa2kdIbq9I4B4D7KRK3Z:KSPnXLSANzbcfE0DjDrdXFrgprMv1R,pUGq9JbAefoTvgH:u32RBgVMAIBKVrTgL,'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$noaAZtaTg4KtPV8tUqdU5tDr:"ifSRM",n97eKsM2LA:mLpAuvoK372YzADDbsSXrA6hSPFRX4qj0qZG,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,"yYuonEyAE4Yt0H4":NiZmQrit7Ll3vcFChy37ecfyNjJFxUMTZhRlYHcGJRwYONA7SVx4wiWv,%=?;/%#*=<[]&^`$$*,/^%=?;/%#*=<[]&^`$$*,/^"mIUny8gvhGg0E5BCtXEidDmsKPROAizakD":snU1NZQVwNxzah5YU7Jm6XBGr0L4fVEtJ7Mn, WgRMUCDJVRFui22KsVX4IlxQLqvDjJB1AE: IS4qu5MGFXwuy0QBJLDFenNeZqzbb6X6YMWGyjwSdb7Yb2YWY1lDWmQ1hc, "tDotwh9": RYIfI3exnmfkUN2nhGzrgjWclm8MP2K3P,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,"LAyCh5jD":G9KtCbw5PkPfGOc0s5ODeMh9vGheBQfiJyjbqjFbBqHlAobK,YeHnm1HmnlJDoEP3C3s4nmPFNZn5:"cwChe9yIzIycPWFz8S3h9vnHIYZ2BPf47yvXkRuyN0k56kgSGA1H8j",-=),#+[_>-*>'^;,&/|<|%-=),#+[_>-*>'^;,&/|<|%j8iIyY7yY1BE6mqxKRz6Qn0tqli7A:KzLUIEhPa0lMciVsDY7MKEJkd,$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@CLWkuiIoUV4N26mSgX6q3t3C4QYxqefuYX9o3TFAmrZ6s3N2KVC0faHNIp1Oo:"mmmmuR90vgNrMETxsW8AL5gcfd0QHEVCSpuwCkvWOY5s60K1y5oHND",zg59wfiiW38nNzxNje:"PVAStpll79",Bmj1ork2C0wKjd6nFjZpy3NlNyDMVHm1IvaKIu8rQ5NEH7ArW:ZzXlH7qYF7HXF7cu3u4j2BT43U5riwNYzKUkowxejA0YQL1dB4,lmdoTasMvtxoLybl4:BVr4r73vKgJJXFlFKagqq1u31w6YuLhAumvos,[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){.[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){."jP6NyT40kmVxQHn8Xiiu7Hb0TawVacmAftTV9bCmf2Dcq7C9lnnFJiPtPn":Y3n0QCMUBvs9PIL4b4Wv3ySvgxMpEkpH,bDgPnZBQvbO6SNL1EZmkFlz8p2:PVDf9vJWtInwhc42a7cht1VWymxeoWbsiLiDjMU,AEAIHTxv1foD9SF:RaOhAVl7OqsPiu8zQcIOzJYOi2CuYOPRN3,GUCFl2Fxsom3RvGKWyIPVt9b98Vr7N8zW329KbDSH4Ip9WSdIRXxh:bslyMhZQKPv7VFRs, j5a0z6iU4cpNnvWjCrzHbhx3MQ1: surw0E1XQVQADYUMlfr0Vg5rMETSu8Pxmk3uqm1JbDYBZVMRToI,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,"tyY9VsB5Dvu4pgF6vas6e4aByqfyuV8dp6iaH1MPtlIPabHAbGkSs":Vq88836pipnu002Dkn9Zx0fh37c30lpdo0bL,X2ABmUXCf4WhRxFljAATUlkOx4TtGhmAmx6up:ObZVTBt8PaWRPze8sr,$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[ nfKoXqVjfwL: "U8lSdZpci1m9vlinWs5kWvR0b1MCzZsv6GCo3mpvL9ylRjJbB91RIZ",Ievgxj4F1sGPo5NF1ndjdR46:THlD0E4a0VaKsQ64Pa,"VLI2EiR8HppWXbEphI0HoBf8huv4XOea":"NRyN576nUjxFSTrl6ANllQ","rRiklu8YJav76OfAsg2EKANt":x6sf8o7l0IbpLMyUBuicNbq1O9ElM,@`[/)>$}(@<|{>?!'_{^~)+~@`[/)>$}(@<|{>?!'_{^~)+~ "VaJUrnEW5XkVABF2JlKyQX7eeuzOMNJom4HXblmMvJ2joR7M6MiLY8FSYHs": gC9,>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')O4nKXWxEjuq5NbsjhchBDaNb:pzyOzykXJ5A3TDid9e9coGM8r,"xYtJllKSKba789Rrba9Rn0Gm5pOf654oZf4q0DbD47WD6mx9WfrJ0VhduAke":S,*~=-~{'$>&&)>($]@&||%](,~}-+&%;``*~=-~{'$>&&)>($]@&||%](,~}-+&%;``"D82S0KEWmDNaPGFthja5DgH4R":"SUsNmRjA",@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}"W5yTChquGGsLvi3":nm13EJ2LXNMrX1O3emBUsnBCddWhKHVv6FPY,rVRaJEBCrCYAonbNWXn:KTUiZLZcXSDsCtZzxLVkGS,Y2HYpcdwBFj7wQHjG:rX5rz,.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^GTabYYu8Im2yYYLrScx56FEqsv5lSfIzLWRUC1gfRBL8ganGbjQ7WjAaE:KZlhoE28HCUq,fRO19G50GeOshHmVJbYvgbp3nQRqkls8nDDhT1uRl9hP28atOfvCCmX3oEXaFq:xS3MtarH0gso2iXWLIzh9NnFpCgFti, uOASrOwznEBSSmkhTHvEOMEul7LQvJbObYpu0MfQuW83nJKajHP2dJz: "yTND",KdXl7CThPtmgt27nNhnUCYdPSltSxck2KjP04QpzIgl1Km8E6:orHBV6GOxYMMjnUsdfwUW5MwaJxzG5UqW4gBCq9MxRePGgOltBo1,~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((Ob21jcBpKX4mqlEjq3KV7xX07GRSGWSR0Iwd5VG5b5Fp:bmr154SzTxkB0APOtu2KmDRDn6Y40aoMrdawkP09iLmFeIYsKg1YBmaA0CTBl1FUR, IAjOFslG7ehiUdNjKWFGCs1wxSyxPkHfuQjTPJVGkLDPMHQxL3VFmL: QPI0erwmUlfj9F,}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`vtvNkwJ5a5d2ItTCm258zt6vIs6rSPrXdbZ84SYm1kFO:"pomcGFjwLD", MKYEs4hmPo4xch5rt4xascQ4y8JEP3Zvt: hwXWDMxzIbwzQTF6r9GlDUVDVIkMeVjM1P0btoF,>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*[>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*["wkZRE5":gOY6GrFqHgqiQtLzXCp4Su6u09n8CEuBFlnpY008uF7xsY0f,|^`*+/#'/'^,>`%]|^`*+/#'/'^,>`%]"ASs4jjYwVDGEVSd8z90uc9iWwKj":"uCU73HxPfoOtPjdio63bUAmv1HeTyxC9V",Mme3Ez1PwPQ:mgRn9MutBy2q,Nq2gYLJiIjmPqley8LClbSvb:"HGN47Y8DkOAOh837sohexnG",Vll3hso5DzYW:xNGGd8Jz8iRCmn8UG0nunmgcf8,pFvX4rHsmdXaeEmizXzixLHxXs5ftOB8W4dn1paIRdNMG8Kgkt6zKHjG1X6KG1muH:EcHl4zX4tIRo,VGg2FADIg3jhbdCuvfjawXrnUF0W5LWnJD8VRI7wbnp7FRba:"S8dbrK1KKs2Z45mN7gXhndXCi7vKkdqrnOrJ", "FzMFWoxfyZpPL3vfXyhkRG2oStp9A": pFW2jDr50xsl,_(>/=?!+'.[%*#-^/],+)[,^^?`.__(>/=?!+'.[%*#-^/],+)[,^^?`._"lSun9oR31iYOvQ3qiTFVwDzOzcUWaunzXfTWSuCHHO9VzQb6VBNuttMQgiEDGdu":ypU3dRSDsIPP6vi67tFIam8IR,[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-<[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-< mNExerDwNiEM: e71noR0S3Dqmuddv, GI4RqJwSSF9wRQG: "MvcbSoK", LnP9Eb7hgxsEflIwEb: N97zxYLlNS56vYLQBaoFaeQqPkUFYuivSTo2VfWss0YHEdW6,"vZz1DR4I2s":eI8FulcIO4DZMaJlx58uix0gZDn0uBUr31tWENTuAWuxeet0l6dREN3NgxoWmzS0,r8AG58hUd:"MO0sLCVdGUYf4nNoZEjJqZsfB1RzFBo8LQM4Sj8iC620MgeAp", ESscaUmKhhOKuo0UlftRfaRMZ84H8EOpbK1j: nTqMCXGOVhXMbHrYLr9Cr,__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~>__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~> PON83J6dJINkQxiZpZmllorQYR9UmqtoIKbdFTT1cnWA44aYVOZ3OYiALmtuIZ: "SiKZIjjCaPQ5BjuHK3fxcS8VMxDaowNXZ9zN1h3EukNj0VPQF", vedcsfVwB: "FFW7XuK5hfy219OzOaUaDK",YMzuyaoTjvftSpcd98rurSJM6Xwq5y7v2GGA2i7o4r:f3W,H5NPgw6qgl404STzhEWU56NnwUt6NJ4yk7:"yjbmJNqgdECl3Q0OpINwWJt0g5IWPi1p0da9G7B0l7iyS8vWkJDEp3WH",%/$?,*;>>@&@[?^$$|@[%(?/~#+>'!%/$?,*;>>@&@[?^$$|@[%(?/~#+>'! tp1OSeYX3MWRo11UdvHFuH1E4gbMf35L11AgXaDSLfb8HM10s: GVEWqxjghT0bln3v8Js9kSh,-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*mooa9ghxZ0RbTmXo58QDeiPkRCnOzuKzlDPcTlMzil3g76CZUu13:"zsddy", "hkulPLxbxhdu9s8IPt5T3UdcG4r2aEuB": kZwvd,"gN9iBcjXBqLHGgMHunpSdNVW5iCCbEdHgZ9EFHPOVz5SpHtyu8Klb34":"ZZ3In7ZrrDEqmC", oz: Sn,kb3GjWTfJTF10KGHyx8I4uHW7zcUJjdsWZajnz8P7F7yz7S96mPyJ8pTWRi:"y1JrDNNU3UJqoLgVxuHbfmBlZn12H6ahQt", rRj6GB6iYSySD03FWmvfZQy7bL4A8xPEuJr: W2HwTTlBdioVaPLV7,~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+}~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+} qwZHYkFtcX7lIyH: WIrSdil8DerKIZkUwAZC5YyEWqr4ypvgvQ,$%[~}=!(~<$%[~}=!(~< NhBZXRulNgczWFBFYL3SvSOheJ59p13PuZkR7rQA5: DWNqUdDLjVZWJAIOkgw5PIQhHJxokLd52qTVFrdclFGIhaaUXmSVH1y,fSiheUmaWZqS4vnjVKLMyubcoe4RpR:YgCC,{;#_/<|(,<^~(~{;#_/<|(,<^~(~ Vs8az8sUVHtxHDPdrc: UQ0ceeht7bFkxmpeHa, JTU0cmh1jlHM4v3hIXliojO3NpBBgVxmuGSm7ZvXhY9kiA: CKGsfmScfHLSUhHqMkjRtTjA7f8as2EnHT,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,R45TNEGFZjjNbJB4tYtr:"mFner9p", f6baE9196kKEW: V5ywb7IqpFSnYmX5rLkTDA6BMjkJjusI831nJwLIB,AAgu0CIERsvG5yU5qz3RgSlTeF:QO9wOgUA7Vxek4O8XCBR8QYyx274sQfXiUodpMolUU,%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&"zNqAyX1XkBXDWHBWcmOJ":ZUuLM5kvTCvZ49EdpZZ8f1a,"DMZ1syEEiuUM9X1iaT7vH7Lek3G4w8Opy":JibHeJaNbEfUQKXTwnemVVhZxUz9jLPu5f7Lwibc0pUh15kCRxDzYMA8jv3RL,ZwGMY9DrXoZbPIIw9YF6jRGxOHeuIgrg8vw20cIAR10jsp0iG:t9E814jMHVtm0qNxYjoNmkuD3xogY4mXA,J222Ocfn4CyT91V6HjCQjxeFyotK7LxFMxmWdE:"eFx8jX73AGvvh72aMUwa612SEUvwFmtN6kKc", ggabJgUbnXL61SL4gZ90yNBBiK6v1Z5tLW7: Gei74RXYD9eF7UrLYjsjzAlizN83ud877oQfHoODcFXwpkTshfH4DbvsLxM, gBD2Cf01QDISUs0flBASPlhvSXLzI1RXv: CexGJO3StGCWRW1qG52qxFP1A4VfcUoQBVwcTETazn4FpyW,cVDox5JOPhHws5EzloucA9R6jNnEsILKP3LAeQybXh:pH8rTBBJre,WdE2f7RPnmjArx1IKvlpXq:ehzLFscWlxYHFItRv7nSZ0uDsjXd51aw,VlJlyE6oQvomjE:WmAv0hzmMCQ1gEpaAVLxRnEEoadU9Ju4GAeQpy8cP2N,K4kitW5TjFsBJk1mAHKWZ47VD:"WlGfiVqPdXslX",@!#?|?*||}+&~{__{^%(|_$@!#?|?*||}+&~{__{^%(|_$isjashfaDOKQIkoqD7ApPFpq6ViMp6FSG6ADsihoQ:Gzt3nbPenDhQtt0C0l0j5ZrvHjW,k0vT46M83UN6F7vscFyAMMPr4hs9hKZOX9XSlS4VE:mVz50QhhWG1Z1XJInCQ0LNcFj4sTFfXFKtlJAwAvyxKjow568tIz70kfSF5, KPWWB: rZTxYetBJuo8Qn3uy4aIYIXuK6ZSl6vm,xhzaKKfPQIJVSDgcjIM6IcSfIDQFH3qfdcuj8VQAiN92UXymLl0YlswT8U:JkuLj7Iz0XbN1paIRpC3KVgLSc0utpN1Tgow17AWbUAoMPpqiKdS59fHb0zbJ7,xwnfezv6YzJZ:UF3i3M5T1ZNJTASwCMMgKWORPRVwV8ZyDmP3z9jqe5B0JVROXIk,__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]*__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]* Xn: kXVApGA2OZGa4NEn,,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{ WbN2gOvZjQhBRLGXrtrFrL24igxIlCkGNYyoJWG5NtO26gD0FoeIGFjCvAN: "oe63dlnJcW9UAg6oB8AbyrcmYbeKvO56PbQ0VmWBFwSnBiAPUjrA57qG",]=+,&@||*!(]=+,&@||*!("hJzUwIStbCZMz0fA9NNOl":"DT3x9bq5z",[~-^;|<[~-^;|(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.}`-$#*%;<<|$~#[(>(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.} uz1YrnT1EOpDejlljgX: "KpwLI8Xo3tt6ar5KFO1fjJVeryMHZXQUa7sbghkbsk",JXTMkudBh2n0gfhRa:r,$;'$;'BBZ0mL2agodIwbl02W2AHcu1WDnSVFyUGchVBFt6QBtiugCzLwwnvLZ5PM8m1u:"IFCrV",TtC3AF9ckz9qoecNjMSql0EPOQ1sFAkIF1A3eGz89Ia9vX81V8qpHPB9zqD2dwQ:XZmAjIzu95GS9ulVC55F6C3CtmB6z0j4UWpM71HoucV53RfApAQLsCr, yLqM1fvK6LrArnG5zf: n1xzqsLogWfieajVASqVaZFuAphjIDVLrIHp558CSZ, nOTJSJ5: KeNWRCogFPJPFJ0gXwkfY7XDo75jGfKFOaS,=(?,^=(?,^ m5whCdFMVFPrWD7ySPxcV7qtmal2Mw3rPzM19RM3DJYNZeRLLZ: rJQlTIGuKJZ6wlaE9hObWOZYCJxZKYS,MJjye39tWG3:BWNaYoYGNPfzzqqY,TOZ7LmNV8pKPXiaZ1uUsBDDh3CC7sXiM0GD4YN:aAnW9ozVfkNKgv6Xv7f3rH6tU,?@%`(@,`)}{-]*}>=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@<"h58lfDP7v":NCxYZAO8philOrur6Ag6WFuYMJA7rtyyV7x5jte6,EnbQJ3v6MsqFbiJ3OtdZr5Od1UTnXIqeBPIBxGBB1n1bKG:to2c07UT7YQN4etf43wtX8tPODAf,JJh:EgfB3aSuAflKundLkI6osERS4cRLuYQciEYFyhG, CapJ8IgdW9GSD: U63nbUwAairnAhLZeORBM1YWZh6Td63NidshsY6FNaX8P8xwSmuv9dN, cdVtt1Ow3FpByIrrpwjGTBSNf3SvjxVe4ZIQeBcclbreDbVfSkh0bkJ: mgYKoCneWVK7w5gdI2chxp9CjnMNIhKQQIifvm05UD8,"BnyUcuVtfTsQVn5DTQCAFyWJOHaP3lVILR":Q7NNymp8S4c0ezxLCQvN2nrXIgp2jXP,XulcQIy0MpqQ4dsKpfuOYNGphLEVqBKSaAIMtpVO0FKOy:moNeraubAeHoIYjwVDk5ftUWeLkZVdXjNvy5yxIwDT,!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>YPs:lDDPT0WhsXsXg5KvYZZlcWXpAfhwpWFmyHvL,;`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@];`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@]nIK4y2janPTx0WLBHWtkZNlaxyzl:cZ,inT2qlbPtfBHAmqyJ5R4HFW:wWZokGeFZfTD,qhNf1GX3kiuhsqx4PNbs3hxTeR7pk1XJOyhLvulOM8Vt7FdN9cIoppRT0O:"lDyFOlXRTGwR0aC9INMRls1vIFHGOMZ9dyp7K4r718qUQm1AM8cx9HRY2","e36Vp1WhsKHT66D":e,RoDwsAXVYudArbRJRkkH9vnKqxyZfMNhAgyPkd7ABIH:uVnXzqWSf4fKIRHINhk59Kwpaw4a4Ndn4962,SmlDuxQWnV1IJBekhAMNwR1RB7SvWHGT:JnU32Ur89lKTXgevCRYOxXMvn4s3KV7QaJNbpDIIjpGoHLj1Amomrz8xE7uoJdjYm, "VDlHR8QYoaz": Krrwa6WPpBXgkqHuX1jouEotvK4G7w,lLcDeOh5g1JsvWgK:adJOg5XGAWkLZ8SQWF9P8y6AbWqNE6nwM,#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.jYLEdDRUvdJwY9Uqy36XjE8M4i9HhOBM7tW57tgRDZ9PzMtoL6:UjNODqkBa2kmQLZmnnR6OQvOVy66S4HPSAFFKUAquSqkUfCff3mLqLxI,`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?<`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{&}=~';!#-()#/%..$@*'`]>`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{Zu62uSZlgRu5mo0Pw0Km6NYnJ9TzCE20Q4BDZhO1vnm1G2KeCNOvoKoonsx9Z5:yoZU3erFdvtNwqOzOdaNFJpH68o3W5bxPX9EbkU4X,"oaFqWWGzIwxAmu":NC89ocjxwiWV4xk, "Vw6WFVZkPjz3zCpc7w3D9KWQ6b6pS0CWg5Jc1hnIvJsYN": HHGwXF3YdLqDycMR10OO9LguAqj0E9wkGa07WMsvIXUBt9Fq, "c2WBpCdNN": UKp0uy1BUbFINOw67PmjNahwPhUHW,uPAWPgYXMxlEfXfcOHAh91EABT7:STTlUbajcTifBre1Erc7oCibkiktlrpMKOmyjf9pgiCFwhSFsO3FLRxWQm3FrpDQz,COA06VSvNLitsaWQyYmhajEZF:"RiwsmOeSypTTnyKwRuDf2EG0aQiyOdMS7bxiSFGKOTjXNQjSOMBh195i45",%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*>%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*> "SBjv234kBfpxUiHFOfySK": zdtucpUpzSuOYrezgXPUILRKS6slAme44CzQ2fVkFn64h0rHGb2H84Q3, "yixW3hEraIBTIKx9sxRULGyFLBSkwLItyNog": vxFl14QyX2xticC7y89ov0, qbqJoTVueok3qlHpjJUSSlMo8KBFCCqiXsO: "in8F0XFwsPf5rkDUHD9wbY39lQGQ08DDpk3xfeqFDgPo3pBGfND3iY08smTnC",[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,nC1hAMo2oJ:gJ4SGi,-'&$'=]|&$_[#~/.$-+=]|&$_[#~/.$-+@{!%++`@<%_*$`=+^^+,#}.!#$-^&_#)}!%@%)//_*?|&@}]~{`.$-&[,|!&]_'&},_.+->@{"JQvBZQ0at4lAs6v9ukCgooimmD3g7j6NgOlJAcJCatbQ7iP61oPY0pde":"rlOntoK92LbglbCvSFs50HfcxwQxYu7yiP21R7MiZG1cZx3bun97xnijPu",^*@?#/|(?.,(-#&.,(%/@)?,,;$?~(%@=+|-#?///~{,_-['?,%:oSkhWSwBR,YAKy:"euAJOdKfFfEipRenzI5sweYG",^>={*+]#]^>={*+]#]"JDLTDZV13":"NhzVAQHs112ugQDBYHlrzau3f07TM7C",'*/?@==@})`<~@!{>}*~]/&!$!>?_#'*/?@==@})`<~@!{>}*~]/&!$!>?_#tGPplPcgHuWrF8PgUICynHFL6KZnZCGP9iJHVC91TEJ0b1YoOzXNdeU:GaYrdTDxgBB4Gf1B00darlHMiNwpRRRTdm8qq,=;..]-'=;..]-'cddHqEBrCcIjHKmswtzUM9X:"Pvp2PIT8C9M62Extu5czE3MhLIgZ1e8E882HjwaVtVbFTrxp2V", OZ0CBKPLW: RmixVd3j7pD,YJ9DTbkrciaBngQimNdAsmiDWLVfqyVdOwFlpIOBTKfgOun85C5R3wKU3:"jTNc200YLjmO6JfXvDKUGB1a1FcmEICil8CwLC6z0OR7UgLjwIHhtO9p9X", UPLFJ8GVkOMI13xtqRRsy7xZfgepywJ5fxWRCplLqkX9A: "ylUfGqe", vbR4lGCyzLCRmqO61GaFSN: tyQo2yheueOc6taRBy3IkjQRtNOSRMwbNJY8pv9I8aMvdBFvfoY4fg1N2CMnhouI,&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%"bFLuYnFds5u8u6MK":FKByLiT9L7isFqcq8IigmikTT4dKUe76f4BdAvOEMnCZEqcooe0dm, JtCWwHP7MUaCWr5KAArZMtQ1WtoPCYj3nmKCeNMzht4WeuBz3I7LB: ccQ2mxEGkCluc6XzLMo17Ttvv996u9GekURRLJhjShDMVu8ITkDpGHys8,"CKsaluWlnZ9H4dsta3QXy9JrszT3ooC":FtxpeAkLLSnLWw2GZjDA8zFy0YbJaG89rdI,mQdxRNE0PnD69vlylkAvF7ggeDfYgNy0tvh2BiIFNLMdM0k8VLirQ:LfdaM0T,"XN6MjzWCH3B":GHxiYtvtg7pkLMktEvcDB,"t0ccG3d2tjMC0Yvl2RcIZSX2p":"FTaLyVxoHvZtkriQ5Vf3PgMuF4uGR0I0shzZ8zRkQ3wJVNjBzwXfAEgeVdAuDI", "vTNgs6zFuQJxCfvSu4CDJpat1jgjcnVfB2ebvWgmWsR0oHC": l9flcSN93BqcVjvp2HqECgIRXfg4zG9aLhI8wpgZZK7rXojgeOWopuljOR0iO2hgA,=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/"zeGGSKGSMycAJRLCDvT6HfzsGZz5mo3jVgsD9LNvAsi":rdOjhbWizFXIW9RjZDe4xkWgyA7nFeiIBZO0qWQLXFYUCHRvEuXY9Oz8pHr,lmvYI7HGnPBtadR3yhxzFsqM7X3aPLXNo30L5AB5RnM:"xnZkW",ULHo90lPcb7SR4OM62wWxqyCl7ELFmP8ri3t6zAg1yB5zNhZMJBGt94u3bZP7XH:"JYbAmwOCDyqnRzp963Rx9RL3NhivRuy6Ru",](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<%](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<% ocrc: flYSkZEHsTe,_}|,(<).[;/;>?].~/!$`>!_}|,(<).[;/;>?].~/!$`>!cCYx11eWKiFnaNi5lS7Ja:MmFWIoEIzhkGicXaw2gaJmuVf1cdxXEKZNhAylR5Obuz2ZtTPLuxKTp6gezkhNyAt,[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%IrvUSB1:kDgxcwi0gOaHRh7X29nKsd7rxiUng, x2rFgOi71GLqqXTI63voeklqFrYCePSl5rC3PRrI98WuDeKJ: xHGLDbKyI3aR9,_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%&_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%& XtBM6k1C1lq13aqUUAhMBcJ2uce: wLdvhWoVo4PX, "Tsm": ETUEds72zoSyODxVDKsFzU,YrYxVzO7w6Sq:ACAi8btjDWwosqmWIGkdsMu6DbJ3hS6H7BkKE,-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],DcMiWU2xnKseemYDTciHR057sCho:Tm08GZZm1CspRuNftfBOhuwU4jhF4Aw1QZcPwVEIJMzMMoI4Ibk8x5D28N,f8:dYtscoLP3IX4lmYFnDaQwmjucOtdzfnnBW70d6Kgh0tjl, lpdet0RGWfWz1m9A: nNdmLKyQ5si0kXextCAjoqiFII2pE9gy8ve9MIjxTJGsbOujb9TG8EaFqCK0XvBBp,^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'*^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'* ORVmctuTkE4Ci7cBTF1j6c9gtRNKw0: "FNWMv0o55CEH7enbS9V", "tHuXkum6E22B3R55fkIBUfPdGd8npGhc1FAzgp4KXtz5s": dSQi0qVJwaap6PB2WjaElSBSL41ZxerzlmTcBab4M2eJ7BrAfeHU8BibUycy, YaLrVcP5: VzR,?_{=;.[&*/@;(;/<]_)*#+]-,?_{=;.[&*/@;(;/<]_)*#+]-,woxz8AxrVSZkU1Ko609btRqTz4M4U797MmrfG6edvZkqUWubi6uXJvE9H8k98IyP:uLzrbUpKCKaEE5HJP9ohWf,"ZvHxTHA":YLJJo08o7dZTXbT3S,!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`"JyqmGvm2ZT7AmM7SGAm":ar0bj0NA2e,gL2KCAbVJ1c8CAUaDZCmekTh8TnVtOpA:wjafh9g5OzL96tT5z5acr5NQBGyt73DW7Dp5hsy6,UXTabQgQ8EHAS1yV9lVdppV:Ky2lPJ32NNYtzAxxVHe8Rt64ZE7KTCG8Y2Xl514lpbd6qFw3V6mFz4VWxDHNo4k,%&*[>+$]^%&*[>+$]^iF5L21XU9u485a6OWUAzECH6KIwf3qi6WnVUTmb:"Vmgi6DkNLVE","tPv4KRaqFFiSKCYRsDTXUIZ70o9TSvyiKEK":tjVvay3au5IjRl2CHLC,"yrNHMUpejr9Rkv19PJ9SwcN3Bwf6cXvZSPFt6MfX3dcxVUNwE4mkSvF":uCtCgDn54rm1HMTxmBOkBRF8vn4anNu,.}^>$}};-&=.}^>$}};-&="UKaRbglTmvzhvAx09wsuMQUt3vA0XYWRKVgBtB0P440nmLWgAGiJ9eeY":Eq70qoaeAnLtGTqjHd7BKM22kWz5,obPID09LDrBKT9pJa8sMuusfOJLUadY89zbVO7G34VNUR:j9aIRhLCyc3FyhTHoC69FL7,(.=];!*!?[/_~[+{>*>}`#.;@*%+<%%'+#]~_;_*>}`#.;@*%+<%%'+#]~_;_$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*{~+?&`.)&>$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*V7Z:xWgAgJLZ9Pe149nILIkhmpvegOkiaU,DrNHGWSROgBjb:"HFV6Z58F7KueZlML9Lzjla36BOQWK2ZkZml9uy1gW9kBrsKaK", Hld: gaZXCe94TXUaOwy7DIwJ03KzCQvZnX,"w0LHg4V38jOklghxohkpi3PjbMqq76QBrRbS1OKBMeUbw2T0XeOLyCqb8o9uRV":r3UYpA3O8bwZpjCV4Yznjb1N5ogaliOAMqmPYreTr,.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$"zO8uVfglAy3OZeewuYI2jJP":zuh2MLX8BHW7U6dRWJmioXkoOayvl0arzOXRoBFnhAsb1BWf0q, WY8pj: "y7md7rwvDfLBvpzxCo6Tsc7",qm7TDOHexgRCrHSwBiAC1I8slnIcF78:XcvGWwv4Gtyt2bUSNP3bnhZQVnx,hIXrVlPfceLvJEBRVOQIKvdLhhjVIj:kQAkPFTPYFcQio7qlyotdj0UPTHcYHrRuRj0sp0klMJ5NUeYDpHWgDarbbq,_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{ jYGdWimqzfxLEkXUIzq26nTqiR7iDS1nBuIfKt0: adAFiBLk3FB9VxXox9lq7dqpNMJ8nsXtQ1hJV5c,"BzTxQJN8XoEr3nkncTf1bBpvG8IWzu3l8A84WpJyM":k2tTDPnAfuv6MHBhnDWrzeYFNOlmCMN4xecnBN,"gcMf3mbQqjN6J4zg":ImUdKEBFynFi,;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@Yll3b41VtRfVhkLr25QTvp1WhrhunLNuDEHJcLq3yqn1jB:wLPNXoIGD4aywPzY8Ju80VunvwU8PFYCLx7SlnsHN3U1W8ZhR18S8, "ayv": "ggbSSNupef9pKVBpmxsa3JZlg8BRJcw2ItXoDyERVogUq6dUxnxk8ZIJI21","zZr1G8XAGDuZFFnvNamcrSX4wmzoI8L7NDrNBccOJx":"ErDvZtI0QZdPZnl7i82Ue",zoTEW7y0z4h:PBRa6FtBOR5OdbW9uZtnbyYgP4ezyl2qrs8q,"eNGDHkOge2xlbu7XCFLFB5VVclUTUJAmhT2700XfmOSi7":"r2GJ1IljtLrzunNeS5G1238Tz6HW6wuDk8CVS9",(}`}@<-&*{;+*,&))-_|=!,~<;/#[((}`}@<-&*{;+*,&))-_|=!,~<;/#[("Drs057eEbURL6lFmV45ijYUgaWIgxl0mN10zUq9baN6eqDIc":"nyJDat7ser1V",FGflaW92PcV7CsGWZhTdFEWLxnkUUrPyJ0iZ9doJ4wrMmpEleBl:"assdTRLR", w3ztO0BdxRW9qP: Cc2MMhqYqgIk,IkOa7gaAsTqgyhc4pJI6dULJZOpS3vlttWR8ikQe7Vy:nIwjiVfcXxFFt3QnU6junEPZJUAp2dX6uj9r, d4WhHcoKIRa281nFOm83gxdXPAudTSRMQ9itSkRCBoW4ENnspjb1E340na: YcHf,P9DKbNfxTR9jJBcaj86m37O2L9PWVe34CHQ7T3Hb0yoojvu9UVNJwMY7Ihyk2:"Ea62LZMPNNcpM7CZrhF1z98QLDyklQFOGNx",DqX3eWTzjDaGZXWONG4sTrcKIdFH40Cyp8CuJNa7kwcI8VN43oXnQ:"Y7RcXSGokxH1SCLwWQaazSyLqBGyxTFYPKTy5iY6PusoI7lVParHf",vHPPMW0QoAb2GbAEnBq5Uvsi5zSgTVD3:"CuDOTPmYDA8aOwhzmoNdzRlsEww3KIO8cWV3F78YRPtAdKPjPanG9R884IkL1tp2", "baoxae58axiQlZO5": MI8RxJ37HFu4snbEzMu7k, M5LuSnRnbixcPXBp: "rFw57LYLtF8o52O9jHnF1y0CKgysQLNgsBEUR1t",nAJ9jvgWb0IfwgDQUfobg5QOHc3EUcpSSkEHET67OaFv1LG0JQ2FK6gFvZt0FAX:"TkzXcnWRxHFWxT3Oi9JH8rjDTzIfkVJTeLIbVN7ddY6XZA3lQjqA30O", y6ulV6ylsdA4ShjH9fqhPWJJc4eoS7ISYjT9PaGKZY: o1HrrN8Q5z14ywrfreuqd1uVi16DEFEYZTOJEJDBNFtjjHszqiOy6bhVX6YI5B, QqxwMpplFn8Ory1a2tUQBI8KdtQkygAL0aQu28B5jE4gh: RQJFQ2aGQSFzqabMyiRLvNqap07S9I, U6q1elGpAZm6nfhpmpvPGIDNpJZoLhu2fisxoj46nl7oDIBr2da4: sshRMW7Lg9K6ivQYocqtamyaN,dQd0LsYA9hX1ShEv3XWI01xHSZHbf9PBI6gLWKlIOHpo05zJwpKKWvBDRGBF:AQ3kOFLmidBc8YdWPgJDj5DiaQYAkbQqnzYkydZ0StuvmXcSWf1gao8, "sP4J4khzlR1JKb67SY0VqbK3xfRuaJu3Q3liYXIPahAPD0ru8gEkqmr": D5Gof9pL96uyT3kmRVXmWcbaInH7Na,tuW:ZoPslAd2wE70CQrL3cnQXxlCoqCPYIX35,>`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{#.%-##={.&^;`@,-|/=@;/]$~=$-+~`'.-<#.|;-;|&^]_-#*|*%_@.%<_*.>#.%-##={.&^;"NSjptP80joGmHznoqs465l16qZaA911c2k1YKj4zfO2g5oIksbICjLt1j65C0":W23dXO68Ab4SQNPKciNKdCXU8LWVMeTbItAwArQFT6hRCyRRPN5,zW:uyZC6aLtZ,^'^'EFDFUN8sbRSYHzRFRDaotb5I8BqsbZmhULKAKYBaIRv0WUo9lhMYM:jOApVyF7e,@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-z15UUeyxJ89q3vglZ3dwKcRHiNrWbLSO:"xLcBhhghRAOdUdKIxxMh", YobJ7rnu7oVcoTl0l27AIW5WU6tCfzy49Y7yDcT9Q: "cHoCLj1eUiTCO7yclVikLoll", iXvGnf9i: e0Y6STubIuyDxwp3XkGW0qMZu79j6SgIuY9w2q,*_>|;]]`)(&^@%*_>|;]]`)(&^@% t7QlTadUsAv2rhr32WTbX7ilOsl8MBRFytJGjP: MtraPHMEYVfd2plTcEMgCPOiO1UXktSRg7k29s3ZJ8UA9qYSkimKV8LZ7Aj,>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)*>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)* YbmxssX7NT2u4qwQSX: Vg7i21BDiRWjiQxYIc,RcQEjw7:K6egBbcFwPcN,"UlvGqsSmawzLyZ7U9gYcO0oX06OKEzqT2N4d":"OSeT4bToTaZMYJMSxVFEwp71AbKatf3cTs7MpPSPk", EBz3VyYEbMhXvOK39Eoe: ME620vxlyyaF7x4vtFBN79f7eGm13ycmnAoS9lB5, vHrFUxRNpbwlaFsmzg: "f1ju", "GD76WfUZ3iUEJoY4RXuSJJtKFhRaxgCQHaU3YoWRSEvncHd1nsey3XnqzC1gJ": iq1Z8TfAntM,-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'"C2SxHjimX6nU1LWgMfc":"v4gVIkiZ2BgyoP0Gobkf",.`~`<,/%&?#.=(]+)=/)_=]|;{;;?`<-**;#=~&#@>/{=!.)=|.!(*,)*#%!*>[;(?$#@`/{=!.)=|.!(*,)*#%!*>[;(?$#@`..;~$&*?=~[#!^&(]+%)?<|>..;~$&* ZMyM0mHO6: Cfg4zpNCqAU1b45TACRSkmG8e, "C7ZT": rgBOhx77P0p,.!({[{',{<.!({[{',{< B9: "nqnFiFMBCrOfRuKuuxBqjw3hENoOHi3kepDrjsow", "ghub2ePis2olMNcQr4v7": "ovls8J7AQA6Hy7S4AJwfq57C",@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[uTwPBo4GFZEada6mgOeGeKEJ7AM9LAWZd2CNV7ggH:"IMRoPkv6a5NSQwsV0j9uqwYPNvRbo1bGHRv0tEzBMf2mi6smz4L1uv8KWR", uAzymoKPrYMOLjFJUdPPJ0: pIrfz6tK00A5Cu27OjtA, Ggl9T8gxpaxAdkcS638dOZOp775nhzst3lyMM2rB9qNQjdREHad: qjR3QuJCJLtMHf9NCTyCQSJIShv6W51viMhiAMSItkzPk71FpopsVzAcNEDlfl5o,||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=((||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=(( "MYWhd1BN3ina": "pfgbrwgzXkLC2X2EguQO1HnrnDexqhw57I",ge9VGb3ARZrnFj56FiroYIT3im7XBaWOkRNZY3tQjo6cyPHki6BQGMbK:"i8MH0ygJAkbLRuM",JL8X62rOOoqEvlOg4ErLxWo1bD8NnZ6SdLRd2VeYzGL3:VBx3tcvGzdKRYQnIey,lNiXudxI7KJw:v520yeTC5,"mtim97K7u2hb2vrHZkNUI8iQtIN0TZeL6x0fBHQ":hxw,p5KLQgjFF2bhxEPJLEQWiaJWoicaRWXMbEahZnHTKPMOHtWGVq:IMsAVuX1qhbLcQ, OisnAjZ4xoQy1EPR9Y52FIeVvGkXSZauE95bqE2DOtGwyBXACU3vMqDr8: VFE4kVgqvSQHYGvixRgP2MBNqi6jnloB19SrDd5yOdTs8YL0bVx0IQ7j7AwFnSI,$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-<$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-< "kA": "a7b6kxR4BkXHJDaJ", nWNPWNF357KDEIYvuG7nHlnmQkt7oGitVLO8qjpqCGzppxz6tle: xx8iepkYzgIO1lVMrC2BwFbNnkPHQeoD8yO1, Ot1yyFCYb3uv9SBiZTYDk54S8GZ4LIvJJSfEDJZ: qZTfSeY8LHb,"cjcAciaH7R7Q3VQKFtbQsSLgUH6VZQU5kcA4G":"ZOKqSXUrRbtzcHRkDY", Id4Ib09VWC7vPjgDBh1kFzq: "fV2qScARBlbbKYUoFwcP0ipmdpuM1","m9tFaXGON":"XYVY53mtT5hnbQMlUI6uwo5bdNGtFQOD2wkurZblezgBFAIw",cvNWngzVyPWeJ6X2RQM6fcioizmLldK:cidFVrDyeBhhHh40HMn9eL1f4BH8yrMALMCeOlo6,.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^<.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^< VChqYLH8mVU2Wfzq5sxro3MT72tuffthwwbuMwCU5PAQZrPxREFo: "pq0PpAnWjLP8rCe8GEwzZaucS",dhtHmLzVcCqxqMW0jeI0pS57vAciyLSV6ubGiYXcw6MxnvSgBLPqhW2sLf:"N8ObKyu2DWsjfvhDH", xAb5mnmbbYlSCDOrg1p90StaKshNC75zaVGJYtIiJYepXgdqnToxaWpHJQkV: "ongXJ7GJd0LG9OK7XFCVD2w1woGHLxz","Oq3FmKck3tV1z0jPnUQSi":"iZKN2ofyovqrRGlvhZ8y7ksBqat3KkXKm3V7rNocOLsV0EEiPCqEXanb22Gq", aJyVQWsUaOfXFYnihrmcGMwC1tDkCMzkL5DL9tXm73ohtaZHp3YrrEdVqJnt: Q5zCjv0GAyee8HQKkoxDro7YIAzldJPmxOqKKeag5EOQWKuAFG14YrjkM8V,"bRT7tuGiETEWgK7eIm0IYyZBTMVRf6wZvzhU7TMkz7txYknlgcbNfcS7PKufU":fedfhT65,rvhAUN2EuDC:woOa87eKx9MTh3KQETj0IoP5EaQnm,QWbZhHuOCTkvsnD9EQUKiz2gTcShkp1MlYjrh9i77:vZlWyu5BD8Nc1rVYEdXu0fz1Mea44Rtu3ofsg8MKnEu0vRNYU7F9dOaB, cqjqG8E7rWtvIKQsUZZspTxYhbVoQ4B9ZrZxFqRbU0gtFshit: E9o8b2,xje0tHBsrJNoq9Q4b7HvVICxnQwrAaqzbfiYKH:Utc,m113YsfvOyeygzi4QuG:"Rv0rjLXEJFm5Gb4eHTdZvMz9WOpBxtCbm", paS4307: Oz1xopusDLYrRvqdAx5FCoK,"lvAsOAhPASK":Ba93NbqiG6U4TL,"QLe3h3ozz986pj1TWrGxMQ":ty9zDobbZ,"F7N83Odg7MG345pNm6SW1gvkT7bmUf9en892SpfUsvBBUOTXoCeXcDnYNzawq":vSPzwBFxldyYx2XFFYs,"fTk2Y7Ys27VChQGncWAtHDS2aS6A27534":QejtwpYXS4mIEBCwmkxisxoukWilK38BQLxiocwm,McR4mDplH8OPhGLFg2uuC70suRcodywseULTlix7g539WUiRBUn1xPmMZe:KvmqDyUeB9IsmtIgMR6b3SE5Ga,/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~T5tS9ARk:HKMnzZlc8dTjqIkj8Tr2wukI7Yik4QdAwu7WHRQqdSmo0r, "aAc9E3fsq": LsaG9GOCh7wejxgDXu8N1OWIlxEGX8LC97hZgrEKx3CYg8vO6Fdxz1qb65mx,"tuX7rbI":moAPQb8USBl3rDEykwIQTDlwB,?@>@_<(@}#;>@|-_%.{&-%@{&:iQQyNgu75nY0HYTVR7nw1LjKqlfLOqKSDq0BEBufcFxDC4E9Jik04rgEIuiU1VO, "vqK5OUnIQR7DYknFZzmrN4": SbXgkdgwEOBnpFiEcS,@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@ ki6GzTKu2qWfLYzuUQAkVjptuWfJebx4gI: ANFlVs8QZ2G90XGNO89VHdZootFBlOi0RErs6xOp,=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+`=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+` "UZv531U5H9q8ma9oUizG2ORqnLkq9FTqMkW6dKFEAu4HUK7aBndyUcekGaKpCW6po": TylqltMzDNUPSFK1cvIxxtDs18VJZWV5ylpNN53tPH3,pmRL1CimZ2nEj7d:OPy1PyBcA2B23f1UNbLTkxXVzhiVoy2T8ZSCZlSQ3SL4VGnrFcv3IpwUJC,rUAXM6KHdko6YVDcy6hoV3:"in3YoNgGPcMP9673l0",pDSkP2b:"cRzKeQK0o7YLL3Vwxp", "l3gC7SAJv1VPlQf1UaUmemLWRIMisLgKEOHQ3JrhHynhf": sVFW2jgYX,]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+ dC8YVNGBhlPR: iMJSFXT9o5XrI9x6a6EJwpBLN4,tg9QfPgdzv8afbICIWnDuAV1vm8AFNkjxQTmvgoFGtc1Itd4ky93ji9:"jwTbXk1WuSa1F12saIg1APW5r", Z6eNwQCkJP9gkzxjiSQDiNYb3XKohcfYjBqnRqqn8oTuWISntohXyyCCf: purgtLlkJSQWvhDIT1avynvGzSB5cF4,fGKSXuteKloTmrVeBenGuabpy4ZxeAU:NlUBJHLUONUDa1BhMAAlxW2owvuYVBMAhfDl13lOjuSM2jRTYCKEbm3e,AceU57H4WImr4W8Vdsyjbhn48:"Fmh5d4N9DgZd71f9kdWMDF25r5ajJIbl", Te6eerjJbyvHvoaQOacbuRMN: lavtLMu9hL01OqZic5i,W6o8BxQWMpmsrLfwu8uss0RGX6qeYww5JEbmMm:"vLFHSc",;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.;;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.; CsicNy1gbsGk4ozQ68VGAUHXbIMwo3YumkPXXvntZl4i4yzNW09UgDPzwjV7l4: D7PnNGQGYzJjBAzCY72QZ8qoGk7jJHxHsOBQKvr0G,`.|}$&&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-.{!>&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-"p5y2m6mWFxnOlyG2PEecnUv6yIqOoUxyv6j81":"b0KPtnMJaUZtmCXMV3UGe1Iu2skP2OeGMldUbFGhw6MuFell7cRKS8ZHAWrY4YG",{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[tCMF08vEWtarJxfp7bGBw8onmK953ktd2yBUZTtQQuzle5o2o66e:XUfGH5sG9cHSaoCgOgd153fFcTZVPVyyxu8sE3aoxEWpY, "KowMZorrNUzPIZIucaHHaZKfir7UO6A96H0mUUQcT15S1hdrciHC2lVOhZKfWAbqI": Cghl2k1G9J2M9KQDpFnjeY,.)[,=?$[<}!|]]])~/*/-;)'~)})[.',,~!_]<>+]%)++&+]%)++&)[~|%>*=(]|]!!!#$..`?%,&@*%(~%$]#~@{%[=%_>)[~|%>*=(]|]!!!#$..`?%,&@*%lNu6Ye1yzuFpALxOKqFfa9FOV573pYkAQAUwXOE57HeccNR3VmblLXhKfzW:"vDPsQkx1OKv9ehhTH1tjx5HHPmdUSOIjDUQMhisbRJ1RThHbzj7",xQlEv1zNf6UjzwojwtrS1yAuKB4NBWC6U8s4TvkCtgEfW4UOMqgOnbsTP1BIX3y:"dD6c4ZWkzNQuccAfkqRZMEBvuQDbriBS", EijCmBTcwYa8bR6sdL5n2JZMhJY57hUcEu0AtGojvP: b2q,])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'!])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'! EAUccyC9WFdKSFwQ51qpgDgcj0yDn8A3Q0Dt: "zHYSBfzslZZRztv3nfZhrUqiIeBpo6yBm3C6XRIM2nCL4hyBjQMTvy2nZiY7","yM3X2jmHMmZAlFPtsG8qVxiNjmCT7cmY7Zq8B6Kjrd9TZt1LGPf":GT9Hx8Jy25si6cfqQtcGcOa,"rqgqUPZzPVfh519Hinfr2IKIGDuMAAk1v":UTivjCzjrvSQcSgoWONUSSeFSCLTBsZlkrR58DSXZ,PCYVNOzaXxETuVNuonyGq2QIuWokzY1Lq4LaZbR:eckDE22xLWZTGFVBDoLg0MWJN9QlQGuaMrznguVv8eZBnxZm7Pyot2Mo, xKOQd8aJLQlXVB19ds4nfMKGnXzHW8ozpOx1NPTJU6IWBlNen3MeYRbM1h0EAvSkQ: "MGn6FnNIcikIjkMi5aPiuPhfsKYKD", "vqNYhXYwKSp2Lur9XqhN": fFHEnSYx3Ls98XRGji,,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'.,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'. GEIfHhcgBvzzJRPRny1aWerS09a5pNnQVVr84ZWSLCOl: "nH1UHUwLJZ", "WmVnYaWMrMBl": nf8HA20OXDG1q,=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@;=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@; BfSB0N0F4iK9iIuN4lNi1Y639vIVe5zEZK9DAPjFZfXKcVyptoI: lRTJCku1WnKT2REz0ebIVdyX7bMXdFFX09UHHb, II53CuINwPObcmO5zncihvL127gulBiL: DBn8LYjBvD243djpdVuu93eYHCOrbvkPtlYHu2C47V7s8QWgiwDdQayQ5i9Z, "JTRv3vCkYRKF2E9qKu5FaGWl6KBg6cHvo3pqCAUHHFqKWHjLseswSdcv": afmsVvWZ36VkmeVbB5xPwoz0ERVUIACQux4CCXe9nuyk45LZcXKPKaT9D6lgv,"pW1Wfhy90wI":AKafRVNxiIBBUza7HiKlk9xKPxkhQ4iuhuKTmtBtTXcxkJjOkLX3zlS,a2r3AHfFfdAlca41jwjGwJEMvR1VxAs:oU5yJ8kkSS2WotnlwOYwQmvj3Cq, meA8SjWXCnrVQInAMsymOP0k8s4EUOezBA: g2UTF3V2D7gJM73jpyEHtCzyfH0, "nHSTN8ET2m": wwc7cuSIoh06,"wDnEnqV00L2uaCJvn7Wfp0ImKUSwx0VpLl3P0ccIOqDbCS2":kN8PHBlh1eWbpJbeqwRIxiJCLWwzEs4Z5diKYsBWVixPvgvx7dL, "tAviIKpaNeFsEBEBHn6L0rGVWTOHX9DbGVcQVAOUwF4mnj9": lVCZC5JB7L09CYKYYMV8Cq9wKwFYbiHCRhagxlWcFhBaGbH, RNgqS8w3jsN6wRpQbHQCouKGzLYaG5fWCoYGEnEIE5aHPJQAYBfGkRV2gSoUny: Gr4OePadI82K8fitZnjREj1z9gSE5rag6lA09ofLIpHjAP5Fzs,_`?;^.}]!=*_`?;^.}]!=*mIcn33Ymqz6tMoqWHPI5y218KhwFv887Gi8V6jwwWVQg8HETgMZDq2vu5wN:UwLLPjv4nbNi3mxrMrIG3HRM, m2lw2xYVBrIbBoD8cW312lrNHt2dzkWLabCyP8TRphT6fnFxdY: "u0MCcQ96JC8olBP8uVtYyzEx0g9SLsgvfVOOV","V6q9YNlmN53oxzt1FcGjUPvUJcgJ7boFAaIZ1rMUK3T5KB1ba7sd4JYY":Ry829f6cEci9d6GZkwtTLx8rBsSrbjq0SWuGrufKgmD4ITPb,TrsV:HU6zHpylsmQJWS10AhSYJovvgsDXPSeNgp9Uh9mGP3MdMY7LdMssFhI3KokhVC4,x1Ae36Q5eOMasPTFDbw8KI5Uo3E:tkaMARy6AsNWMSdeSG5THx6UYMEXaMNIWqueLLu9O1dZeyDmroOAALKq4, VUEapliBNKEBYIyu: i9JyMkcQCy8iqkiIRylkee4AKd5xN0SWdoGNgSL1RcfDnapy8SoEvyAdBQI, "wCI1pbddMadvyrcnuww3m4vD9OUEIQK6SivqDPh8b3Rg2BXttZaBNepGMDR3vjwL": d9nwRPLNGiUvINa,"hMDc8ADIBhWuKQA8COdwzoVd4skzk1MeF1GtcErIQg4EHzKDnzolrx":O0PkZinYvhJ,YUYoyTdnuZKRgt5iV6hC2errkD:IqcCDa5784YooUiucJ13ogimGsBbhn95sArbTBSyQRnBaQTlnOn,dbKxXZkqoQVSFEUFaZcd3xA0jsjLwPJSlHZ1:cTyIptcSeyfHZfo1xt4Y,rAw1iRzoXQh86ZTAGCCejcxUGill2uZxXOwtnNSbAIzTYeuLcFhaPfotxWZSh:HqVgEv1v48FIy3UWMJKbV6jkRs6Mjgtx621gG9zAHKi9isfWHI, kjqOQX1SNOiiphG6Yg5vZqzCq2jHeQNA0yLg2tdQLgtljNJhYM0lt05wOAqkitg7K: R9d1ByjxRVBWTQZvbh2rN4nZXu8uwySDYYVoiTab3Db3xsdamISv3obiGTNE1MJ,-=;~[%'(#''`~$$;<..(_'[.%^/^~^}-=;~[%'(#''`~$$;<..(_'[.%^/^~^} HWb4eHYiKPs23wM1uTv9L1MBeVE2XZCDMPqRcj: mwWzrc3eBrIvzJaQ4Xb0DFrPy2iPXXp1ysohOqV7Z7,$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}"WzeWHmtuo5CM4Yb11pxcud5Cab8CB3k3r91UEeuQozsL1opMuymxRc6":"WipC5HylMVylHQYpoLCU8vF2msjxCVShb4CMU6uFr2L6BIwgxQ","ElzrFcMGTTiYujjvkQdq79AO8qEnQkXeRDHoy":"lQDJFoVPhIq9Bx", AnWYfgK73x8lLX: KOS4Cr8n58UMW7sNUp7zJq6A2Rz3yFZn5vEu96bWIrlWZVgXjuCDTU, "HV5B9wO2cHiz0scKf": Fk16i0V5mmTKbsvKkfipgwTuHkovGrUk2Asp2Ni14q1WcBiRz2,|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(kOZugOs1XIGn3LdzLPGw95e6uenI6Gll:p1t2grvahLTTXpisqXVM4oj1UTK02ONHI4TZQcF6D4RW5, qhVLXYXdTUSaCpTrVlimPQUY3DIhe8XMHowdgwWbj3NFiR: "MhhgBAvES4SRaYqPwYefzG5BoRaKbko22YayQciudQF292vWKrwkOKATD5", j4zrsgOP: tluphMge7R3,CjHF8pAdSLy1qFpP0gsEXqsWe25PZPveJGnHFChxPCP:gHh6yNDJ64klEPoDCWLzbx8iZp8xIjlvMs4dKPuNo,MPJ5EpvrCLeFeBwKB5:AnLUgKWJ0UagaimJEBK5GGIZX1pi5,&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+ "n27VAZ53eA1p33onPANtj3WbVVvC3BFTnJ3IUNmx4SeqbzcSR8SyUj": "TYrWBRKrxXDPtzEXiLDDrVSQeraFTNxV", uh2HDYEunxj4hzFZE7jHLS: zgLOx5qy0mdHrOcBa, "xIS4vrBGCb1kNbDCTxtZNix4wSZv9VAr0WaW": xAAf65QxCzcWeq, puHwcJgeduwLAyQ9q9aoSPUYRX: CpLM, ZbDDRkynEHQOhZc: f8t,LvQZa:PS8tF4GuUYlBZxW,*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};MfXCHKjsxJzIwymgcawrmPttZ5tAPzofGdjtvEebRYlQfF5VRpx1bUXNx98Fz:QztC0ro9ao1,h833xKdGrHv5rYjdXBsdTUzb39LJEHVCucMbMoFLrj2X5J:"Q5dv0zW14bfOHZtLDzpuA8moDF1BvIKWyCsM7CqlhmAvfO1Y",yOpEiAt3o:"rkp3cnru8fP1MQa48ukBpBHiiBisPXtmOva",BL0hrVYh1FUyIu6izFXefzVK0JsF5OVkUCV1bHEisrzkKybdEq4m9ifhumXP7lV:SEOAOaPQkqFKyhFJKTrnF5tAkDrMILKpkH0z4DGU838dUNA88CX,"S6DtXUX8ovu8PlaPNm6uPRR02eg7L9hDS67BwSP4n1xrXtZgPmwPxgP1Hf1ElG7":aTgPA5mLwOIDHjwpSKeU4FpAc4xXAL4,XimZToDwr7I:"nfu6vnZcs8n9I55GOG0usjAkXbfAKyf",JST9ANDGd6iOmWbUdrSbaQYBc0Sipx7IIBJQ8Oqh2cW2Nr2L:"OUDpQo21FglBrLyrz3E0l3tPnzuqWCByn5ptaapZGwMW8BjFOz",),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$"kmwKrpPTsL1RZY9HkReL53CVr25svZGwipp":"v3JVHaR8OffmhDmadYgPW7R2pK78jPFUifoMMfFm59QnHnfn4ouZNR6u", "SUZOWi1DIik1L3PgSLSfUczF7OVtexWPd76h4yFAuzuXCndIZAKJmfal2SSfnHFJI": VWx8W6UNBxLAICVoRDoSISqm97eP7T8VmlcKr6ePf7Oga5LhIm97S67GLaK,"PqGXEa":"D6d", "LA1XB1AhhjlcZCTWM1sYGfuq12toIenBgQfrhGmCe6G5lvMTmLLgv0hVoc": OzjkMUBOKXespmPPAUW1nrHkM7712JwTE6wDk4yO2Q2ESoxDczZnxg,geAAJylJl9egVVDCQ8McSONaSgtKk:T86K3jNIS3hRXnDWUMZ6kPcls63B53fNpXacvrEi5AIGxFo, J50z: Ih0cm0HDlQau8PK3v,.>(`'&,~/.>(`'&,~/cgOjeMB2IKqwNIHsVUQWmUz:"mSW4rYawgKIvtFKj8GY4NWpIi8QWuGbVwkSNy6Wy64jWJHSoU4",lZi1bssKz7mbXoLZVYt6QkbmDpC6hR9NnC89bOTrTp1gJ6Dt:zXLE9jQyd0rwwvakcehi4fEgk22DXiKZn, vRjgpjGjh4qrGYdnWATwal1bV: dX94ii3ICIZcQ9JxZFg4b0X8P3i,~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[ GOBouOOBLij4PDq1UnFygE9hWtYu: BF7qpB34fRHL8,AWiJn2gzDb7cwmpc2aIhaQMYQCjgPcZ1kyVcKDuSf0OWTVABa0bgEuUu5W:DHPbLluKBbA4560UBwlpPNDSocUXFu25pswPG8qTME3hJvfdAK2bb7ykGENH0Wo,"yZpqZFetyIfb1hAbLeGFxN9Yb37s8":"nlaiQkZyFs73Y","rxsHfX0iOc":r2r9U8lntBBvN4bpPB1aYikC,B8:"qJfGSrQY6mIX1pF11Gb0xjpcnaXiu58","I6bBkWyR5TSZpyR":wWnobNBiNDfWvXn5Za5B6oSJ1Zn8UOEMlmr1RHejVJsiBpw4it06k1oyh3GgpqxS,"HGfKIBidfYEr8bGzWk5eDM9JjpGmOfYycjrcaGEwARYlXM91kwB64Ppy":dk5a1HwAorNyxkD2pVkyOQE6sIc6RWpBXUEps7lErPMyjfYKadJU,.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[ nttsaAJ4lL: zvHBjbkRSnBNNIwn6XUzeCDLjBYKdM0QeU,|~`)=.|~`)=.npgVyuiHjNSrRjazfDxB2vwQDOiz:"iIG9zNqfiBmYoZ8afey5D6RknBfmES5CQ5PKnZiDn",~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/zaoRM40sCDjtNuz44ZkirHuovrbH80:woNM2oZPtXizIM2Qxod5C1USBbZdpeTiClMRH4AGd,noxuiT1k2XiT5arzboCx9empzakWvX0Hj3sqNmDG:"LIy","ypq8o1peln4toGOwogzfsdjLuj":pU7WXaroEXRQOujazZTgIPB5Xl439yWnUwaUzC, "OerPE3fuPHmhdXGvzD4OipI41lxnuLM17zKWM": "wZET2O03IMd4dE8Dd7acAoua", x9uRQN: pF9QAkqLn9C66poXSAgPL11AFFQ9f986Ts9j13OwZ6WPdm0TTf4mtNftFwOWZuDsT,)_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^))_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^) Tobk1MrzZXVWB9fz4MK2la3UHP8sLIvdHEubHqK5lcptxWxMmCfP9kfi: l0hU4UYXh1eTGPm1lijDqsHJOmlYlgcaqZjW2QWfKxRHbQArmSr2TqH4o6jNKIfU,<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->!<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->! "v3MdK8VpCFxBsr63MF2K9mAON4JvBmcEt": aPrrN6qCP, NxdoCAGhODTaBfyLG3ea6ARE9wwDVf4lQ8: k55F,DszJrnjZWV7183g3FfG:iALXmwqvNWpSw16IA3MwMwT4S8zSNXp3ni7,ssaDX7Ejq33lK44f55T5J5mHGndVPVNJ:inXBiPomEk3SKnEZhHOFF7pvrI, MakAfdh3YeNPc6YmpMOyPXSYsik6PizLgcU2V255FE9DfA5pf8HclazVDNj: "ZyMqb4777asFuWSXW3Owxfj8EK8soptY6xFUhhOmA","gyiPKUZ4dlq9wx6MOe7KQ8spvTwkk":gUgse9eQQDr3mluDCXmLJoBYuk0,ExqoTGF6gdoKYOTbPe4ZSYETdopN3:"V7xJsusruKsDgXelaBhiQTnffGYbSRXvVBWfGmMpeTm4Q04SyIBfoqy5Dp2", JXtTE8rRzHr89PYYpAqeXP8dxqZH9fmGifnPlGJE0ublqHKIO6iOf: "L7d6whDTcWZRcMG8i2ByF3aXzJ9UMp8GGl1emptBMUzTikvXkLQyp2SiwoJ",*~*;{)*~*;{) YrqJ0Z4KAI6m5fzwYfFFntOiChAlCxP2jwXhLolrZKdswyK: "SnsdQtdXPUf9WeDp",@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'"tthD2sgI9yiDHUmg6PpU3yag0Tsw0":On2isy4BkmNRfk7,"cttH3ReimhouCUc7uBi7NKLg0cSJSWmyL1zEizr":gSAQczVZ26AmRzRXW3KBttgBsx1uM9AqROWry, "uoUmJwkN8CAsy": "NAElXBtlJIRuQA70lDADipDl",~?*]~&[}<)].~{=>@).'^{~|$,){}~?*]~&[}<)].~{=>@).'^{~|$,){} "YNQ5n90daaCwEYXxwiVLvB": "qOaoa3qOEZGGMfUyg",SRx87aGruNHcgdGVm4cOrZUAEmHWWWmEFVcgVYEt:z9peBEyckONSh9AxDBgiUJzfVqQHZoYS40XBMp1JURxBKQecZfRh8hMWx, "rc74AUmpZDp": w73yURQznOTULRw9v0yCsvGsng0QIt5eK76lPQn,WRsj3Job6E9ly2YzMWL3JciZ6:bMLtObFPHmKWV1UlKp9a73tyRndfcXCuBOWzlmokUt9AnvLOk06Sp,i0EYez4ooC7dWtRkhq9YuaVLHfa6dafzGidBmyZ8OOpSj0F01:ShhxnmahPfo4W4ErKtobZJ8i9XhaZVQsGCb,fWsugL0W9HTyvGzkPElrvkOjJ5p7YdTKAtk47:JqTHxxl24JLGTfRoMI28,}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$a3ICpH25ci4mOEUdiqCpYjbEdEtuA:"Ejnpoifr",;{+~'-%$_[,}<;&#??({>};{+~'-%$_[,}<;&#??({>} Sar7wmtVX: qN5Z31dDjR,yS2N9a8l7d3jhIpOKjj:A7rWJzQmNcKgab3,IUSaOT4G67k0oDTWZziFfOoHltUz68I03MiUI6QSws8l5tICsF8dspWiO:gJ5suW33oKixB1cXlWLYAcv96ZX9aMNH2qdr2p4bPLX8XA3X6L5d1,*)#<>&+?/['-^++,`'$~?[$-/<;!'}_=&&+?/['-^++,`'$~?[$-/<;!'}_=&,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^|`%)+`'#;];}]=-_)$#.<({-%&~&+;[<>,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^| "pa3X8IAOHt9QEQb2UkIrdO7ZMpeMaxG4Nbla9GHIDlXJ0xg6kY5": vH5MxYgVzBfT51kxW5l4wrodqbewaGSJBCamLasBdh9qtsgT0X6hz,-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]')-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]') "N7j1p53l2JmJXKG8KySNYvwrIrPosnPYIK1QliVwZb2e": hYzf6bJdcL8ryAXNM4c, yAqsTAIXWHjEbRHyMt8VgKs6ECj9OlVvteV: "aQV55",mfVe7PePO66mov9mQ11kkBTp1mVG7G48EZ:uAfrY4pKU8fbpogJVddPiWtLPfOyTt, "mFFL4": oiIbWKVhr1nk5IpgygGTruyQw, JZg6i78Bfp: VjFpWg4ODl6IH8wPqSuYJiRFQo8VFTGUgWbwFlCghk4MhQAKD4OUfilAJ,EMpPwhTEjzYtizgQkuVlGlHOsBEaEZ5IfgyrHKCtI0bhd5RJiEOXTHiBOF:Rv8gIl1O8XZMY4vouLQLP5YVuogHhYZsmscrn5O6UXnNUtPe9b9,u8bmtbfpbuDevvUj421PWzO7edLAEiWokeLSfA6UpM:VjDxFwNs, RK3eJI1Dvd5HV2HM00GbnlSARD: "yCPIoP1ZKcwWfO1NtxD45qKkVXXBO9B0BHvqt", "JyTEEYQeTqSampu0Bl6zDLUisD": KSXEppRQs7mQSPPZT5EjVPTBKtQGUPsTzC,|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[ "Sc15ySkRRCV1HXE1HslmVgKMxIYV4dXDdx4Gc9luf43YpiklBX": F6dVYx8jAEGdagmCHlpye5L8eW8pTlrK9yIzokF52cjX,!-{,*`$_>~>?-^+-].},+=+^$'!!-{,*`$_>~>?-^+-].},+=+^$'! kFDkXwCUot59PJNYGd: Rvm6BK, DFjpggfqJKo3yYuRCEuAIor30d1EBoHbfLCUKXi2Nhg71xWEZ6keRVS9r: nFvlHw1tbZOZW2pjG1SVcigLJeh3SLvMyCrgcMNBvQqt6IvkQyuEd,Qe7jgrKgmvUHdL4ClOFo5aHUGzbnYqqyJbATkEIi1woVhGk6eLV9eHdKgS4HKgdS7:ZzokpOplpQ03D3YFPCuT0zDiyXCYhDHJ9J61K5lUs0KbtKNM2bwILKT,+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-hWuWLMc:sJkzpxU5oIlJG4,"brlM4Ih4piavhEATO9nX6aoY":"t0kZErOOFWd3tVjo8rVPsLdr45XsmYtWdARETsB18G6nwBVI0xso72TISh14PyK",sQja48B:oiw4jB5UbdQZW1SMEdJGy2rvvi2REv1bP4Hly72KgzyIQt0fuDN,{?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`={?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`=ba0D52rBowggA8RMbBFYfU:q4JIJMU2nYUEDFSX7lqKIjEqkr6AVvmayKJuFcZa9GNtQtDWhUOZQkkwE,FAwihbl58lUDSiDzuZSLKENOpHo0pYierbIs5CgzxyKzZIdlV:"OUc5D4krdzYWPXnjRJbwkIBx50MWk4ngFWv",BHMBGlzImKyu1cuC8lO:pcI3hMMlAXTPhNmImNnuLmJQXG9O5,"JxhPO":y3XoRQ32oY9gO992L0flYgjeOeFsVAU41GGEQTlezG,ylO1adezucZfdK0jRiRd9mcLS4fyZL0cIABSyEabAtdydfXyr7vzh87f:"JulJYKhpAipW6HyQVoIHTzBYkD0GoxfHc6bSq9Z06ocOvLXVPTNQKJ",oTibs2flCkMu4s6nMA6qEDpkOwXt4E0c8iu0VV33:MHZkO0l4SIYMZM0dM95ZWrzlbMHUz03,[#@/+,|_,=-#~!#%>.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#=(=@|!}?$!>-'')*_](#>|@{(|!=(=@|!}?$!>-'')*_](#>|@{(|!};'.<{&#$.({^&}=*`,~@`<;^-=~}}^;)(~^}|@{)@#]@/;&+'-}}@`,)|&[+?]+'-$=}[!)~};'.<{&#$.pRnHRRA6Jr36tSfOTXNr:y2twCXYuhYj3mros1QI01esu25oa,^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.'^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.' "D7oZm": hEoWqAVWCskv0SA4ldRieaUV99U1QLFWmjie3eIdgG784gzpwwS7,!;{**^;^(>?$->#|!$;(*,{[$;.^(?%/($*?$->#|!$;(*,{[$;.^(?%/($*}=>'^%_'/~@@%+?'+(>}=>'^%_'/~ "Mz80pqVFRhzDQHdE7dawrcZvOxvee8BGmZGwUDiLr9f1PU8dj": SwZBGmfKghrnjNJ,=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;.=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;."Z1Y5473DOwLiig4W1t6A7wHwyLOFZvsvEbQP6Y4RIp":KigP,"GFYOs9d5QXTYg3XMEQZb1MsEjlaZcnMiIMSbTTlynA26MX":auBdelo8OrXIYDCH6qBboKa3DmPvN0eHaTnBgENSMr2fV9h,^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{Su:"i33r0I8ZfK2r2hCYQXx6H9hNgQwYrX6IOAsz", "quZBF1X": AuMOSnYbCouC6z9bjhscm5,cl9G0Rj0yC7yHH4nICdhPLvocBEFCQ3UeCVFiM1bOkWjh8eluQFh5SXM5:FYkthGRYzphikIKXOryGNAEiZXwKNnImeo9hbvAccd641RjT,KAGtaz6RKCxetiKGeRW:Xxz84P9mkBoxUVYcy609I8VdBQFkXVJkzkyw1,'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<;'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<; "N0oazzuhCJjoCoyKla0BISttEknV3t5oramdkVQWACkLFOEsAp": "gp4DFdDkOWlx6yB5rVuSPSqIcJxeqeD6ptAO", vUJTj2qUtonpf4Kw6iUeQlDNIJATq8HmBTa3yvpfi5j0a2BbinkmV: z8y12IZKGAx5wwm7AQiim9vJgu82AWh8aSyO5NOtApDFGUyqzaQ6o,"s2QR1f3TQlHpjDbgL9ZbsJjaKK1fHJblTWob":pEkCVbqcWvHzIo3qafdbwx9SVjG4W6xNYuDoeJc8zkqZ1yk6VWk0devgE6vUJ6j, BAYLIYlrZIpcYSOVrQ9uE4cEzvt6: gdvsN4h7zeyWFEAfqCh6nI9NmZ2kA1UqsKQGzULwQVFOLFX, PdyzjLakFz8rbKLgFLks: rPehtFQxxS3iae8XinUJkYUyhf2QMqubp9ZlEo0Aam6c2h,"fmjpsVieSXgmgs9d1auzTGs34ACtwVHeez":ePcvEUzFJaE9dawoFFR,xBPBLt8FYUoZn9h4knqG5ivpqjGPLtD:fexS0HmBG, "etdzEs4ps0fhBBJCLWi2irAhvy0pGU": "dt5809mG35BOOHdjwTMDsA0XBYfifO7fbotrJkhBKPGH2M8Z","pKAvv6XML7XWjyovO2wIBcYrQGINNyO6":dUX3GOeW3qIn, gOeQKMY6a1uwPRvzZQ0WEO8i3TsipfZs: "WtRzU0tTaAdKm3vo9hdmzWj8aLAS9KFNo72HTGRHQDsiBboQrvgiTGZ7HroUthFQ","Sw1IQppK9Le2qEm8xER4UqzYTvy3AvLcUi2kG5Y":JkjfICTHw8GHGrlCGBDtSc4JYrOtJHDIKMo7NxzqTDr8FQGOIg88,]^^!>~!%^/-`@[-@(.(-&~};%]^^!>~!%^/-`@[-@(.(-&~};% "qpghHyC4nIVRpUAEAd": t39PQaUEtzYWkMCkpedJiqNVMUjqLierqmVKm2tLt1,cfMp31hhMVEzRwiO4b:"OGRv4nJlYo3N7lfoAj8MK8NAjrZ7tYprNZg60i0Sqm10CtYtY1oKq4o", "cDqa": G,oIdkbWJwaoV8NdNBo:pBlc8cBb5ZMFoR8eF1MRsI,kvlMmEcUer4tfjwjN:Ky7oOlGTaA6QL9DUpoyUoxT3QEwfv66EvrPhtsRIpPuN, uQZa5MC3xUMQh5RW6244IatmGsBQnJH: lvmXWxVog444lusSgTppByL6VL,MbEgaynWxtvrJ0a7QrZ22DthPxDPcTe8JlnYZOSHkeOP3nkavvamu1506kxYtJ:xbvbxJGVTdIOhdy1c,|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]?|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]? liOBb2AMUdfpY2natN11TmuBHGU7QlvkXbm717W7C91TjjCjodLpc5iHgoF7fp: TlXi11LzVWNm, "iNNv0qdEfntG2nnA1jjaNr1qghON92bIw": "rSDKQwku2BFMduGxRosfKXg6nB5LkYXeIGbgtHZgGNQt0CmNWxg3mHyqPOKB2u",*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-Eowf2iQo8SLvP7d020bmMWl7iGhO:"WWxlhUTaBxDuSG3tgprE3i8VkCG57j7xo37Yrf3jW5oj4n6ZKW", epLnEXv43HJO: "hZeUhwzR5UxBwRp",Dl6Y4gk5k2XRocDSAnfQzExldI5CUx:VEoFpH1hs4aWOxnVGtm5vQgo, "GQMBCkezlzpqe07gbRgp4Y7zoZM": lcFh8876C2qVRMFOb7z4IgUoJg0nDwK9Y,?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+dXIwF4NhJ32q61aLRBfGLNGr2aBr78p:"FO6bfwEg8mtVFPVXEF7iiRTdZt8TAkVTtVfF",=/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_==/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_=z3788JviagoWCZD941SpFQJTzRZzh4BEA8YDeoLI6ASmZYeq6q98SZ4Fvgi8:"Yp6eNSMuqz11umR6RCExmCGd",FlzshLXT2qkmYUGTgTtVZqo6UD8Rj:"HSUdDKWnLJU6ZL2CcC6jJ47BRrsjU7O", "JQNQOfkyjKxmo2y2e8U5N0YhSATneDkEnm6y6mjN7gvNfzWGokOVYFt4": vBwSVJUPkclEFLf7GrAaLgHF4L0VrOU,"awYO0V5qdwzJIRZ2CBr":hK2qpT7iJIe3YvophncT9MzAHjkWOqgmwdh4CDGBiEpc, g1Bq6J07M56tmz90BvAGxYRKz3KQ4eNW8hY26ANW76bnGqEz6jzV68Y9tO96SQzl: "SHsoS5Z7kuS3AnH5SIv9VO7gJHmCe",#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&']))#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&'])) "cqxHC": PlZ9FqrASG2j,|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#"UeZ39gfNjw6HCF0qLknuaSxnq6WzuJhMnNp8JHTSyoyCpjKPDOr2XT0SjvUJPe":rk6ZNYjXgZEUwzLlc1wWG,qY3RQfVOZKrbwN5r7KrufXrlIV4dDEWx6h2Fa0LPmi5D8:FovW77D61cka,msW1YdtLTR8n642FZRspuQC1c2DhywxCEUVYlA1BNTrZU1S1CJ1gbRBtX:ys66ua6NbmZVrS3mmnFqStcNw4JTr6E,AKJSR45PVYE7qrI5MKFf4hZGHpdHzZIjoTVu5z6JMndGKd34B2YzTlVL:bVc12NT5WL,vvXSGvMsaBcO2Mve1Ow8xtvSVX:"CJo8bzxd3NxnJwAqjuH2kD4rYiSffwjqfrwTWZiVW7eub7Z",&+&+LkIOJaqtWSeTnp9mky15jaL:AoVg9JfYcgPL,ahQIMvK4KYvVvbQX:QgUelDhdFiy2gWBZ5yCCrfKyvM1ccfsQQ5IfR7wGeO5e9n2Zs3rZ4,R5VtDBmIwztfap7n1FHSpVpXwbUquGPgirXgxmMt4sLFbOUhQHWlgHHWP:Gba, "PAUwCkUB29JFf3AtlmZxI0q2MOIpjxx8cf9IvZGYU": "J6cuuwPpJ6aG3wjcmO7hRZ9o6ILIO07SwEuK",k7KHuFgoBzBEBmfXrNmrIlCjBtJmEaON54tOhet5JlvuDNvRn3KhPw55SUvKV:dreSKO2oc7d1CZrSschZ2QT68wJOdIEIG,>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&UytEhoG0AhjD3xFpWosK4ALLNLNtnP4MqPFrNdYgLPSJCNZsD:"R1o6R", "Z2GwneYyGty2Ek1H46QnkYtZcaUJiDqA1cS": "LnqZqx9IxYwsn05pNxNkgvE3i5oc0NqZjUx66nwfLFIViN6w",-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}"mMkEDf":tgsk5meAgILh7pMMvkscWFVTxnyHmyio6GRnV0BHqnrKJea1E3X,)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@"KhHs7ddOUINQAiAHDi0HXQRkjSzY":r0HdCH778tQ1qV2eeScLQLUQhESp,]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%"h58nBIh7qfZ3LfWAzArhUUAzolPEyQ9rdArZfu":uPAZMYTMY481G8d9wbuAlgHjsJwLil570cZ7Bx,DSmQci:"lD5FRw74Nhy3PxM7",mrqVmSUHa2C6dN0fNv35kRq0HmnD7N2LX38Eb1gDYT1SQYuMO:FSndnS6Db9AgQhKwTik7oVlwjMS0mkHboiC7oMt4glZKQEHgg,$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/su6onQcodcCXeNRWTxQZDy0YfiBNhGpaO7GF7w:"LMzhL1FTFAEPCUqMivTOS6ZKDdWUXRO8Y7Z2rpERow9rXrICrmPQ",wHHuBN5VAyQ9fo6hZ7DOpd:zfYc54nth2DO0SYTAaNSW1drbjbv6EVoXCnTs6AOl1jE6DH1R,+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'?+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'? Cas21T8xVjgyId5rNFlDA39sa1BrnuZ2jmTZ7Ej6: N3mwRu4SACnQ6INLxL8QnzFe0dRndWEGo2o8sdn8zQmzkKekYOgJYI6B,)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#vmCL:"t","WReBiH":yZjRssGkQVSHiYTy3vNITnVua3nOOD4FBPmJKQWTCVN0xt9xXPIuzZJyG5USJh,Nx3aLFyWRmQ9y0D9DLPPFmwG:ulljTT46JC9bvwsY,"Z9ZnrgJeUvniOpRLT":jAXpWQW7GooTHZ1i8CLzjPtG8R,eMaf8SpVV3ewwTcdlNQAAojgs6mwOoA3JTGagoaHMS4:pcWJewMpzViN0DHmhG4Gn46zYKKT,>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&iqlTA5Yt8K4VIm8bl1y7qqFBVg8Ct4gZl:"Li3bBZpftgJIIEdQUbW9Xb0ZzXGR", a2oSifCjIDw: XRINbBvXedzQiLx7thrOETmxFFaVl3bazVEG,]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$ gRLr2Z6PGvgPn4cPUG8YfxLY: A5e5nsu1wtSN75HVvs0J3wzX62RPMqvIosxRKg8R,"ahbOxlhPo6Xyir1w1bK9dMwqcwrSHyF869CSkGoxXZFIAw53iyBsT6Mi8":xNBlzpSuXqmW,I31MRCOhzm8xie4UnZz49BVMMLIcNrlrbUINFw5qVWZUDG7YheNzC96UrAcaE:"bLzOBJswLO",???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}#???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}# SNrtEh3y9xLEZn7OOj4DsldS2TZtZ4tRss: N,eRVdOoOid3hOeX7qHd8as:c9GBZebyxaTofbjp7MhlJgy84l86qsWt60ibKAdwSzPxMMwGliKoWvtIJFPeza,"HM4v1FzBkTjrjJqtkRetMsvhDviT":Kv9Ne2lsUm5I7lUim2HI4DmbCODegEVEvTV8ApD4DFCCeT9857ct,"Bdc6Jkm9V0f5d6GElsTCQYyzpqfMGfClHPLGYr6IFjmk4Q938CD06NOda4L":"FX75gLvmexTTx0tt6hLO",BH56A0GCCh:z67tVcUX6BuHvXeoS4DJPvdPniZ3aoqn7RfM9539nOB9qX56R7Jtw9Hm, CeOn8R67: b8G6LtkLqXg0niz5qQBkPqxp9UONDDBhGfHSwzBRPLK0D1C, TWgR46lxEryPAnAH6cifPKKOGCohhXm8y63IevBgD: YDy3hlkxx5SAJdlmFqSmwuC1h0tuzCOUeFh6Exv3wBdnK8YwJhGtYO9dq2,PFcuhDGLcYnj29jkhDwP4UA6MUByMXJ1BcpJrl:wEz2ON7lHtmTa7W91Dq2PFJeMgb9HJf9FEJ3xCRqUAJFpeAaa,/][_/')~]}=/?/][_/')~]}=/? "hrATppU4K2PWL": PpYNfUArQzTy4JkoGv9OFjFT,"vfuhQWUgzCFiOjPXcBfJG82sOIKYexb5FwZKNUFTYQYWXe6HmR7U7aaYdMxtqB":"upfdN9eOpcTcyxoM0qNOsUi8t3CW9L",xfCg0Fgtv0ei0B3jKRQWanZIyMrsDd6FnCrmBflQv9c2yF5hAtApdOux8TOM:gAzn0PdMbKfI8kUra8w,Ba:R9dJaQvq4fmGoRcrGa7Tc,aFGHzXeAaTY3JOmnWWXyOldQzvR6YPOgnZhzBJYIoIbXlY8OaoBJbNiFGj:"UcAAxoIeGggSxATd0Nc16SxCam4Kzev8oXvvXRnCRys8KOMZbn0a8yca","JUpuxgaTArnLtEDqufHNHZ6uLumK1zTlazsnmyEKN":V5CBMO8nXJCXuA8FyZsrOuk0yLvGXV5aOW5lECEOWxrlXz2cu99hAGvnrfj6,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,pDjXQVW2pH8vo1QncH5Sw1WeyaCWdoo3WxGmVYT9wXqH2eml0V8WZkQ8eO:U9kxaRg7cATrYN7fB0os3,|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@H1wkdwqsuzt42BUOtUz:fPXQhrPme4TyjgT2a6rRpgTni6VzplWIjZcBdb12JMG7bKOKpqKYA,_}~&*;+-<;.~@<->$_}~&*;+-<;.~@<->$ -|(<[: 8x2tIkBeOSLwIFYk9kFBxp9pM1o9C2mXdOS9HAVhN5ELmo5otBP,"vZiWao19eYiHXlHNaFz4m6BELXFNNEnGiC":JAZCCgn13aP,&~/').=!`[+%)-]~,$(-@.;<~,,&~/').=!`[+%)-]~,$(-@.;<~,, umdml3EDtcykzI9z2m: QacbVBBqxgst5XLoroLpHtkICnd0GLEdwZNtYqzKlDa9fnzNF,+)@,|^<]*'*?]+)@,|^<]*'*?]MxCv7BLXgNW2xBUxdbXI2yTiFfYiuSn3X0pkom:"FdjeP0mOwe7CkM0I6iI2Ht7ZHC", lyrj3tjz8LeK14UVRDRAMon5BBxlyKQXm3OGnvfQRqxVmh835ofCsmMHiAw: oW6dIZtmcRLvrIBu7VJYeMb5Cs9iOUZrHVyAZB8xP,MmjxM69wIF5Qrot7bX6z7fzlEH9B:BvuJyLwt,aq7JnaOsJ:t7TF5083g,;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%.;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%. l75r9qO: zhVaXJ9toCjwYR6BIce,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,mbwCPvX9a2yBDeg2op588zIJIdZtmqAOI0jyrjMXRa46zIgEgj3aSNuC1Gb:NbfgNrKoMcOFPftozEB97I2AChYY33cKFU3lCyTWRZTv8f,*(?^?],,{^->;_%@*(?^?],,{^->;_%@JP24YHMXajLKyipoA2Nfd0SryAS0Z0x65qq5jk:Gtsg4d7tR5bv0pi,&(.`<>[)!}*@=![.[^&(.`<>[)!}*@=![.[^ Vppp8qJ9vFNks: B99YVDi7X49XgSgj8Hy8sm6zRsi,hTsAofEQP2T3XuuWq02:"qjYHxy4i1u9aFgZaC4DQSZS9XkjfF7JUziMmRz",_;!?^@_;!?^@ctT8e9e3M8onFev:QYGj7BKQ,(>;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/{(('('+~|.<&_@ qzaH3ZCmeX3DdyJQc: fyS7DbpI2fE1HW1q8adSxWoPvCB51JXKho1QcVZHLyc,)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,&)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,& "nhc7vkdiLpq1F3xER8PE4qM3C23Wey0UETiXCxo7n2pu2wzcv": "lQVf6uJ3WDSurfhBOZne3xfOTYMut11fAKxTkLBUk8z1MAqpJiY7osEW",zmE1hNXy6vBXHlMe7d0PSZsKkt5:RYn7ZJi5pgkwHur5BBeoFEspDkHXHno7SuxLHOxBtgbWI2Kvi5WtRhVv9hvh,'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-"lnkMtJvJ6ZWgFXf7waFXBRyBlSFUh2Q":DSb8p0PPzgnTCYlQlN675kAH42Yx8L7j1susR3gDM2F3SyC6VZ2lZsIyFwmhsYF,"L4LYpsZ200TILy2lWTorZZjJq7KlrgfbzWuP":yGyodZ3TcIuzHLS3D6CX04d, A6wPJSlsukNiGRMZuU5cz4yQBQwc4jDqzkgxWf730fX: qXUKIfkNwlpG3sMsrDpTbk0ENn55N,Z3iCrn8vSi0pdoPQBaFpUviu4zAspt9JfN8YMwnyCL:g8tn4hZc3,moDeZ14uufzwiqkuSNHyojSEgGz6zU4Sx6:vcqbnUQcy, Q7sD2atDfnNRzRNaoSDEIQ: l1C2mrrf1i66Px423sKYy2m6SijB,"OOdvoSIFlnKGOlKfzdPEFTpS9aoscZFI0vNMixh7XUuZz":DgFG5s44JeSJacMyN0TnZhZuNtC4Bw3mu5vo03,dRmK0JcDVwM13e0xtOni:RWZ2xVQVF9JNmMVBWHB2El1c4pcu5PsHXXzx0,/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^]/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^] "NG9Y2I2LPNjDajThJmZ5DqiiciWFlRnhhQ8rjVFelle22": zKQPZ7jrM6Nq9qxg364IAHOoSLcaom,'=,+'^!@'=,+'^!@ p3: NqfJveTEEpybNt6yIKqMx36i35szO3nLOCs22O,^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__IniZSf5jFj0mnrR6l:Fs,b4ZRGP34u7jmBJ7iZvtHnTl7NboYL1xKxyev:"pCcHuWV","GyO85ofDVjKhQ6x42PQXbqwq4muPfzZfVBMhhsfpHWOlHTqfKD9XMxnU3K":k7TlRt28n5Xy4spy5FS,'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#fnEpFv7eX6xtKKYLyI:"lNU9aNy8rmwNtb2XUeLp3nGxHeXYOZlC7o6S",JbEtPeIN:E8dsHR03NxrK,gzd6IYpjWjq:MS7vzwK7rqhFgQSCXMTYk5wcevly1vgun74PTtp5va9g3tJJZG0DY, "r7gCU0E4ASffWyyDTpOq7Mj0dqqjqQvSooVdWABpktHM5tzltWG": nA8XDtwsKggNSWzijHkOY39kOsW5ZM3jiyLkzXLYr4i,"ZwPcHmLD6Q7UGmL1Y5BKfpqMGGeWS29UzizoHYXbl3z9LwDJKhi":v3QAjvzVE9pcWBGYxk8eLUIwc05hkfUyJCtYkvwh6sJLxWCvrf,"PUye0fANOJt4Tfip7oV7vdOr":W,.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(>.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(> PaBJqS0wLxhHsZ7wRMuFVn20E: z70E3wEn8EiFsBM,"vmRuuVkZOCgKXwhlrEaOffT6":CVinvblJs3yQmmFcqClFXULbomNQvRDLQiugC5ag5U9Cl8a0CWQRaqZz8v8oB,@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%JNvPDej1khyjw36FmUrisMppY6rIfKHGvxVVMJWQGihJ1nu5:e3Ov0TGbrNafJyRAmCWtnEJTOf6P6akJqM5pwKPARWKjfkrw3RH9GrHV, sQMsGgcSfwuC8LZlw96dNnQesFq8cxIL8eYSr0Ao4: qiEL1ePyQO6reMF1Y7I3u6t7tby35S2CatR6MjNJ83DnGhvuPa8, !@=`<~[(<_[`^`=|$~;+$#/``/^_`: OZAo,(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!qwpuVbEZX1FYzUff1XYlydAjutxS4dT16BnrT2teIF3PlHgqT8P7po9Rm97:IfZqUszeLzrCoLfYdEQZPj6synh, sRmPOAKAFKpYzDu: h3ZrOSddbTyXvex,QQCx:GKx2inRxeCdGsxvxNHX,*+`<+'(+_*+`<+'(+_"vRi1nDoUkcE9lJEk8bFYsk0mnmj5ebCt7Opubfh1dl1Qp":uBTreN38ZnS7lEzBWjqTmSg4q6f5hyNbc7,"o9Rw52l2TSV4aCltGscSFjPUx42wreZ":FLnBQfUFPaHJIUsu7cLNulht3xEnHQ9FE8guPttGj1Oqz2TCvL0lAOmiodYAWRdF, S0fjkyLxuWU0Sshkzb3gGzTSalXSNYt4o: MdhZtRZd9vfgYUQ44Knvscj7sVEn2OXqK4HmsKvW,w8x8Bam3eyuTvZK288xSaF8N7Op8OOa:RMIEcJsSegmHTG8xUUW8LVQYYAIwp7TYxKti4yF21M18l6nMYh3Vp,CMGJcYekG:"WR0vphG5ZMleEABxp2yaLfTe6mwOj6",-};%[*#'..|'`=.;?[|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+*(%)~.`=+]/`??*@[`_``#?|*>|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+mgaFoI:Q, "l5UkQL73OZfCeXcO54gKimpXHdsTdp1Amtx8ldHvocRIUWO": fJVYsMNZoZMNif,{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#HrCoPCfGbUxIzHkRsfd8Ws8Pn9uyTnt0JBZ8Opp8pnKvAVuNjIK7Xa5z:X2, "U8mJUi7aHmK6yZRPKp1KlmeQGlyy1qWAjaR0xvWZ": F,"dIvFPvR4U5Gr84MOkBVk9sNffdpGEZmWLCna6CujAQJJ":cSn12xUuS5DFLSmXl8xl7KNS6TDS6LT7qssH5viZoIbUat6tamZ, ZQzaXZ8398H511kMik0U6QfYUz6htMye0: DJk21j7hjTNwVLZEsHHKzS,hfsKXpaOCjuj5V9pojrGAPl:nemQI7Ud830Mtjd2XV42cKWrXTxFVo2dCrNcSwTbWtir4gnuLfK1LD1mYqgCiG1w,!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)"PON2Z":SunlC3lDxRWpjNQEJKkgoFYh4RtxO7o5B1t,LA2yhukqe720bORnLTnKlYNFI7MHWnG:W3JAAz,"l3TBjDEjQQD8pP":LzTRqopM2O78C546HGE71NLMheGf5Tw4Sy0yDHfFHeuGn5q1q2V7,o2z8M5VsK8dwuwZQGHIf4Ln81PzD7yvWjas5LDu5:t90aEztIOGsDf5whVUUCAUCuOQR9DzwbK,jWmyPxp3PwHrR2xVqpQLKf:XvhKX3HIkPJrKc18npOXYQ3yskbqOgAhTE,^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$bj:CfB4UsPFHAXQN4VgkPwCnxHwwohgYgz9EvPJLcIBIsCi9ikrS,?](~`(-^'^)?(|+<;';__&]^),?&?](~`(-^'^)?(|+<;';__&]^),?&"FTcyfe2mo4HF6if9NhrPGXak":"EYgBneP3DJPrUwJ1hEqHMPW2",cDRP1nt6W1G04E:"YXRmIwWlkSHWi0Gf4TXWvQHExWF",`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^ R6dh0kSmmRH7yX0brYFa: i4N7fF5EvHPur7s, ljQ65HAeUJAsFnoxbT1XEztSwfKPlfg8jvrzBjOYWQ0gLja5dd7spjCTdq: "TjXuFTM9XdJ2t19gJxNHKxQsGUiZxyPXYiyb7Tq7llV9rxFUG",jASpAkin98iKf2A5Gw9xFFgo3QRj6nPnvmvTEXlQditaCmA3juZXJ:MQKF2KQOluocdd73zTh9gbIoz2G157K95s,"Xxh5E9m4mHHTGBT23extVf2V7ppMcfDGXbBjeORMQNzjskc":Xbf, uqMoSE2lYaaltp5eDzrRYqU4YA5ISc6AxMrFHunPc4Ph9NPi53J0yy49c5VuYgm: rQc98Rj7CASIx6VMi5cG2hvo0sIV8rCCJzqqBThUkp0OUroTp7L1nr3ybutp,PGH3XctGhU5ZeznT0uaP1oQsZqlKjBs9IY6Eg12BXixgg:e11U339YhAGpncC6EAP8oJ4X88Y5ekKIFwhK4npuc,I5uhL6k57BzMZk9LCBQ7eo3N23eMzIXtIFh2bsRCUpWe4O5lJn:KmXWzekh04THeeUcKLfJJNpPsq,lH33WLGZXWDljoFtKMPxCXWrSapcIeHZ7SmMwEK1:uAV98XYK37OvMWAFy8axiqqG3U8iZAT4Rn, QB3Pa1IJUeaySvL6sIcNWJmVcFlIrcHB: "NTcUlizxCIr8OwzkhriAxOGuk", xSbuQMxWSsbYSqZ3TqwOJCD7aj3aWMSoD4H0A: "bYV5WE7uTnAzWCEbgkPUSurdoRZG5muogTQ1rAN2f9iM6hGxLuNMSDGV9D9mj1Y", ImFO9p5SUSqyrRArJMuEww2N: "gOoQIu4q5BXUL",gFtAEcwiBOR0C9orQM4R6DSoxi9x5kyA2rN05oh:kxM0yrhzJhjDedaGKvdFr0ttAPx85b,QO0VXGTa2:"jfPT78BigDTz1Pry35YSvQcq69HUgg2UIffklr8zf4",,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%"sQExyw7vjuxcgMqqzKuXFjt":"tdEsplEil09KQ0ghNsW0t92",gS2e:"NEWqESfsJT6PtiE4xxaKjIyZTAjVMkcrwRY62iqGtEG419XlAPh",.$-|]>]<;|.$-|]>]<;|m1IV5hIn:MYyjPd9b,/);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{//);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{/ "CMIRPClmnxF64PRvNTNSCBI2PmcbP": "mNROpoBiCBqtWUbGvDuydsL4ukl9NazJnXmSJ",}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?.}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?. hIdMN7Gb: "Ttn6aCNcvpRo1bBR6xFpsASb48rCroI3FMibaRVH2Di0RfowhyQAYQu8mNJM4eG",j3R5ONgiuhsPnibrkpO:Vr9aNB0IRPqxjJct, Xa6SUB3HjQimqrwECufc2gpnHRt58Nmj1ITMGrvp1GD: qLpnRV7ZoHc1TwwScmwx445m4nqIuW1eLZ54SOO, e0wsLSH3CA3CUGdPHG9QnJDlQU2ljKqAD3lc6KrJSFkvR: nVwFufm,"ARzmuxATn63j2HHHaDcyBYvpgHLARnQZxQL8GemmxgKuwCrS7":Z9ZNBaBZ8vvbREKqeNwQ5KRToqz0aJbc08dSFo5k6CnTKsP95lTHZa3nSPwW,))~+?/%@&,#)+[`{!=-_))~+?/%@&,#)+[`{!=-_mEAryAiQr4SaWDf88nhOF1aMK1tqe7RL2nOfjo1xVBcaD7CkM3FLz9ORH:TMr3jn0d0DmvetHvZghZJx6EJFtKqgNZMdES4LJ7NUABqLdm77kfFO1UEn8z,"CECmNUPJiC9aK4TJMagAkGOTwIx7K7Fvk88UT":"Q4KRdwOu4DZbBjZtK5LlU9CAdYf14bzZfm3rEYioScgllknttJtbCOGzJRZcc",+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'"QtQuhRizsz9Cwm7xgAeRwrg1":zby17dQ2yfsJfQWUgUYneuZVHATTG,"a8hnf9PWtfJ69bE":"ABSMyBAJ","CKX26i3wXdv":BKJhiq9qA3xs5kszdoCY4IT5Dt,>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]*>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]* "pUSRUVeiScneI3L4Ov37uWGV5n7zbsEuEDmWq7Hk59NZSL5": "O3B4lumlUnogzJMk8dMiX3wKOVEQZ9bzVsu5vHnksI",=!_~)%~;}[}@}[,&>*^-?~<{{,#=!_~)%~;}[}@}[,&>*^-?~<{{,# "VCQKvPaGO4ZhGMiTuRgvJGIA3cBv1hwnfDVnt25Ws81nHrg4UEqC4BU": nRAJUAIqDLD23tnRN28e1Q3CLXMh78lGff1hCD4QdLfi,`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*)`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*) lhnQM4q48h799xeSoPqJPq: ZeDTtZ04g6SEtTERsxkAhaQTvjOiRNBvAknSu71UT2rSLg53DeIwTTWwZwpWxqq8,IAPdGCZXbauFeCew1sz6ct9jhEV4fKXVA984UW9DYMx0KBkWxeLW0LL4CFKA8og4:"mN","fteZ4Qrm13gaQhcZjYosRdMyCUNvsIKjSZ":xS,"EmY8NAJp9zcQgf6b4GyNBsUidmtSBML70ryqYBqQRcS8O":lHk6R,Q3vbwf1J4iMZNdA8DjrJKEPaCbSzZkn3c2:zDWPnrGZShVsquoGJPsQPD8gonUgB,^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(-?&+!(;:OjFjg3wCLY3jhqlrdOdZVApV8vAGBBzlGf9RbsIdfZVKLTiSA,'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,-'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,- cZf4pLxrPRuJ8agKuWZpmqIT2vJiuXGfysh5: s0fs5M0jgCzY7GaXb5nxoxpa61zohNIfvUV689qgvFHt,/$<)',^)#%^?({?(/$<)',^)#%^?({?("jl":"PfnSrGL3", "ElN76U2lkGNhlrRg1twKax6pFfsxNI6t92BtR0wY": af65mw3, "vcfkLibjxG8afo5eaN1M7gDtmqp5gKFx9n9N5OAzSw4zbtW9hPv": "FRq4oFU6knI7StNAY1Bcks4V6C",fm4vCMjduCAm5K66fChDIwivpmz:"tqzYRhTFrGS7Ap4WI8zOQUjKgYLk",cYPJOU7tmxKHjgCS1EhWPjwTalOOsGCcypWkco1V5SxIS4GTcQBv3h8NzB:h2tzeq5r7l, HDVzdT6ZM10gdaCMua0srOnErtzH: bpo49mfa2jIMqe1QIRSw7lpcupRRK3XlTxmcUq,<<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?><<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?>Z6i630aNyriH9HqTRcfxuohbd4g0V0qvAePhW4HeS3:yOo3bCM4IUvN0FazG1nXAAefaF, "jxKg8u2hvHT9Jb": ZZTHPhjPPhW9zO29bVTSHlCW6WOaYcP6, skcVHd54ny: HvurJf8RPCYisn1eYiXCzEW,{#_=]|{<~;{/+`--._;>`{#_=]|{<~;{/+`--._;>` oedNXn7Vr5j: uYyrO8jLk4AO0LhDMN,'=[;%{,]%@%[@=[,_./,&/](}$!;:SsGPy1sM6tVQAIRxlTHs8mstSdc6V5yyQbnQSIwZNaDu6gR7,SZnk2oKx09ALGT:"qlGKkO3AKEjrsa0",`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_Gkf0xNpWCX6ckVBnUW9GfRGI:"SZzOh1pDIUIkB3jc",YZG0BYBwgCXnzysWrX5CHTe9nHcHmuvfr1CtznLmBW3HJXV63wYr2:mUCbAhhMvQ4ibi8GTnlDYl2nqZuecjtjC2GksM,Pc:phOEAO6HmoNXH9IUsjVdH7XhySge45HP0hEsfG2KL4w,&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`CtO:KOWvcdQatk8Eb0hY89GceynCtZuoyHj7wMtvPfagzFCy1gMf0M1zMT, "T0LtBbxl9hCJLsvvfKimyvkTsDhrV": XwyU3zUCY9FOCV,%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`PwLhkip4EXJmMOqvxM9jsQ0Iw1ddyFr68CJIWwOc:pXE1HjKRqDQ7YbDr7FEzF1b1, fKcOVSRtkNynNhjkwM9rIhGL: PQ3jqp512VdGR9gOVjS, Hxa5Hn222yb7xI7WFtO2eoQzC1g7BE7KVu2X0p7T7FiLdHsk: qhi4nQhfxISQoyHMqUKSrlVKPib86TWj5xstlR,>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[GZQoWJ6oMcsXb9p2CqnNL:"u",hh9cKI7VXaS:ksPZmL1pgDt3ivnflYZC5cR7qDz,UXbMd42bFncuiG4L8fjBhwuHg8oG3dDGsW9wnA7p8:x3MViZsjMqM2MXJgtqS0SkJ,_)#$&_!.{?!$/>*/../^+].,`#+.=)*/.;=**/../^+].,`#+.=)*/.;=*.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~]_!*;(;%*{$$})==!>{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~] CM: fsJklAYnem9rZmxqBI9Bs2O, "SpRrSHiBoWL9zhyzwJitpg0lklv9FExf6QnoLfK4zluZjExg1": "C7T7jzSu",`%,[>/&<`%,[>/&[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$>[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$"eYHKaVCUYY1":qx3xJJdRSS3RrMhHxfwGfhNi3f6IUme5rpIMmRE3gDi9KJxhYxT9,S9KGhEDZghbYHUeXVdNl2rXjn:vhb36IXmuXdCvtD6C2NIVgvllplqKdXOwjhmar,"Xi1iNhW9AxtqS4R1qxD3wbvVRG3qsfWjmllBi36zNpSM":rXSGHheiNFiLVJpgEXz92GWObSB1NVJGFWoTRPquEJAwXmZSpszU1scZIIywUR,[>.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&-%&@?)}>{~;*'|`[^'^?^*?|%;}+='-,(&^$<-%&@?)}>{~;*'|`[^'^?hMwX1J814rR8lB4sjRYVQvuMydzpT52:CTHfwgYgHunDRBBW9iT2kO, "I3TfFRUN061Yl2DmR5KxpLM5Nm4q": KYcFw2TVGZvAXniM68d4kHrPDONyKD8Rw0dW7JiCNFPOh1I2M8A2QN2NBIK,#?%$+*%=%?'#&!;^[[~@%![.!}|'!=}#`**]'.|?[*`]}}#^]&..%>[~pG95ioyjfAVNaovSMkvdZ2bQM9O:"xbo2Rwam3pS9ZZjjOyRa",sXvM5NCdA7VRbm:"xMNfp6S4TGANAoqKCfruDXqpWmdy8XParzkTRUWU0kX6Sjy5Jr2oMo1i4BydwL",/`@}=.$_,-~`?+@@[!+)^?/@/`@}=.$_,-~`?+@@[!+)^?/@tK5pgizYn8h2LgJ0vtF3DLVJpfw:kGk0LsoWlj9FlbrOBEXI2PjQ5J7qSpKGcJHa452l,Ct9kRXaQpPz:CjTcBzePddB0X7av,(+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?](+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?]mVrkNcOo2s8h4i6hd6amIbJEXOHr4qElmNql:"OmmZHoUyFDiXshlOh9TNjtLNVDjcqkm9C","I8fhswVzLVNCOtBgufLkaXptBdwiTEtlFwioY9IdL7k1fDGO":D3ogsHwoTQVyARrfEjdlQSpgBhKpLCjwMYFB04kMoZX1,%{?%_]+(-*%{?%_]+(-*"J7NCtmE4kifTS5y2hL28uQ45o6RdFpDaKixk8i3djDanUUAeQwH6cUgNPxKDPw":"Eewr5kYJxissqNAwV3tzrj4kboPqWzv8zg2dmBfzrK0FW",=#|''!|=({^$&=#|''!|=({^$&@)({_{:wDXlPSs5SY2ceOPKSHpj1IGqbHvcUs3vzFqDgKrWmwMF, `'*!-|~#?=<]`)+,-_~*?+`|%~_@,/[+,^<>_^/': nfykTSXj9vko8i9HvX8M6HrtgEW4Yyz74GjTrhDPeDGw,@>.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&#=[|//~]*~%$=.,^?&+_}!)_'!-%?{=$%~#}{/?~&{^>{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&"VpKypK4hVxVoKAzqKB4LxmD6ZrBvkqgfDobtvsUgeslROR5yHQro":IMoof9QLcmBT5,(>(${~][],*&|~*]}@_!^/.}??)~~}|@!(>(${~][],*&|~*]}@_!^/.}??)~~}|@!QtcIq4:"loPdl6NbHvMDJRcO3sOpWxgoqdAb5b3d0OGqldz0HWJnYQXjLqOBpvvdIFsm",@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#?@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#? ar9Z: ERiU3rGHzH54TTDx8485OpER, Az5iTYu6GTKSrMwOBofNHJ4ZDJJ8Szc7LRnb82raMfFb1GZ1BnyZBPqILuVFpjhuD: m3FjgCur5m0UGhZ8BxaAYdwPMBT,WVLwQlWhEXzrsHjI5q74i33IwOZsTiAaabcElHlMKMuCsEXRYcg4R:CTnQNVh36uqXkQy86l2flhwx4Ig8tR,!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,)!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,) xXHpjh3gt0zmgsBn73tpjcszADUJamEIY1qY5PZxBprd0zapbBiqj: "cynMcqraSMCYYIADrSuSSu06KKWGdQ1KirTkGF3GjLxOt5CPjOdsSd9FBfz",ZXcLizcY3sVigQp1rxbGMGbMSmy4:AvUrBlVKrAqSiX8isEWRxI4mRVg1zXnL4eGDhDGjT5I8bDn92K7PmnVow,aq0JARNcKPpjxEvKF0PqN1Wv3siKShpYwEn7xzzK14ZJuwsJ:oAHmW5dg2ptBApG0, ecySkWGX467QbuZJQwd9iTehuRocLkHNtkKYKKxMrL4Q2yWvsuhCBzjnbX: "POejI5RB00A2w",{~&.-(.}!})]=_|<+]~&?{~&.-(.}!})]=_|<+]~&? otSVMOZC2AI8YdBSnH0IhANL7E7cP: P5FSIglRiwEbKbMq4jLjg9QF5uvAq0CngKrzvgzFlzqZI15Ju6xgkyraW5,tGi4U4LHr8mdsnaTCEv3SOBHyBbLXnHLCmCT2c6Yl9:lrpm,"JiSemh4aCBWmIzB7z0CFUxBftXUmQHPv":NLX,jAIxFsP7Gi3DzsGMOZ:VzqpFXcZjKDuh3yya1l1hMx32YG50d, yTEpxxG0xlru8n9mPbrrWqZXjo1uHG4OIHK57TRT4: FoNesDLEdAO, miFySFIyP4RgSOk8BzqZLNfxBAgx2: "f","PwYbPFRTDY6DqemY9Q8tINfl4":HVwwe1kMiOI18UcCK0dYkSaDvrQVB7jSNU85sXoOX3aDufsSVTtaYghVAPK,+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#rftrtMlf70e382LyEdHpoBF7O7BjtLUjCN4zp9UBhQjtF2FWMeQkCp4QTBa:GAec, GEGLj27kxMPn3GDUbDGuodyM9cQworsLCCo4oW5oiLkdA: "PtBXA8LDu6WvGcOJW4Eyy59M8C5CfnbXSJYoBAagGQ7REXbVqx5UkDG88w7","jKYX7gAgUja55APPMV8X1Xyyb0M":geRmXPlfzc,"yjb8VS4iQbyJPP47G1Q":a074lep30PJAFn0xMZThiBOVBaAlz8vm5UstZwVsa4UPEUOzVlUOXkGybMUZVb,${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-=${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-= cwvW7Dn6fFN92E17BAtnOLF: jGgdB7kncmTCrURBTu51qKtoSHaGDWn3Zfbft,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,RZe24y3QH2E007Q1qi2dPu3HWxbd0xMeXlaWj08gcJDcVAx02KnNXVVKh1:snpOPdWcaUzfX6oiK87,cmJPASl9xixXX6lyEhy3OjyGkm7DHILknYeUyy1iMTwZQdPGNiCmeniRrW:dCx1akpBeVx2HmT5KI5CpIovkkQqYOGa28hpeqZSXNDn7O0wfgJARJMVh,"r2u":eykOnrhKzuiFX7PsG6uLzbjxTcvbGDOepmZm8,^!&[,`)(+|]^|&%*|^%_$|.--%<@`[%)(|;%{--@+']$(|#,<@@<>_-`!'@#-))'_-`!'@#-))'`.;%'],{.~[~@}#+(!&[+[=_`~@~|#[>`.;%'],{.~[~@}#+(!&"x9sys8q9B8vSAUM3LC91stOGatkLeseqXBiWNQ":CgDnkWg9FYkR8LZb94A3E,"QTdNH3IfQ6sRP3GjPw7VuFTnMYibyoBquAPmbaaSm7zaJN2jBaDbVyh0FBf":tOOdIplbq2XkFu,"stMDOoN097sv2kmu5wBIpibCj2rWwH8a60qNwaLWIHY25SjwgsNkRZseWix":qbcrVPpM2UH1UzYXrGzZIxmDdZJOkYmdonvfEIjJBMHg,vtUlsBedwcGvDTsRcCp1MPcSGtmZuwmULEgfAa3VKjlRY67l1:OSld9huZCZmROz7xl, fQXVo8stlCiliuujhg: llgKBm9uvVUY9mMMmAABdjJf8epKoBnXlw0dgg0,<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}MyHeotCls3IFoOFPym8aHvE8rnswC0UYTdFxWB1JbRStV5:MlWGgRgcEbLDEQ20tqWp1EChEAl7r,!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`mhMFkm6C4lFjzsLzMruoLhFgh:bAa3EBOFjtr25mY7mlj1CxOyJOzltu1LO4Nc, t5zyvLnIG2FgvxYPFCN7tDZlJ7IPj9shDkPFr7Qca: eWp,&#-;[/^]%#^??*$-+]!%;+'_}+>&#-;[/^]%#^??*$-+]!%;+'_}+> BDJg4W5r1VkOFxYB3pjq1kVRIQrtfdq6PsJDNizhuwJbqT9cf96Nqw8LhYm: VIuwvYMX8qN3VxLW5xvgW6OurlELm646qmKnHe7iLH3LzHHGP0bw, pFBb58VFdbQT: jtLkjuR6pjP8uz0t0LIb,$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!!$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!! zNKo5: "RiQ0hvoAM3x6XGAcDkrSi1Lbb3GL95yUPHynzkBw1F3vB",-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);KC5opTi7fTywjFU4zm0NJTb32oxq1n:i9kVAYmPSrXNnq0QOuRTXivqYz16C1mhnavyXMM4L2,;*%/,)]*]}*[(;*%/,)]*]}*[("KT04l59VQRXu6q8YESbDsWidxgzcF4":IiIiVClyivIdGAgcGFDImF35xxY7dF,"pe9tLrTHiBxhiQViEBTbjI1LyRKTUJvG4Er410RQ19DzI5B0NHRu7Uo":qR49wndKLaVkHl, igRGE0OCa7wjagZHFUrUjwAudLFe9HxM95NyInlP3MTCzC7: u9PdFbRTGS9n25, JUKDivdDEIEwiKCOIXFYas7AXSlfp9CFzSHTxi6r0OGfIGnEANPs8C8C: dJog2DvAZPPDA7QHonu1m7R09AtnCh0tsbRVl1,|*&&],+-|,?}#`#?/{/[?`*~/|*&&],+-|,?}#`#?/{/[?`*~/ JuMV6rqYHdBkninZms1ZmYuH70Atng7Qh0iOm: zeDY7MowsoTkZhbV6qcsgAiw1WDhh8YCyj48HhKK3QZaiWbMB,]{|%').%>]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()?`!(*_<)_?^!]&(/{!?(/-|#(=!>;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()bCcGkZZzdFZwqThiLu6OJ4GcnLYlyOFZew3QTDSo0fr:zuICEGSQkchyQIraCr53S80393BY2cbwDjY3v4PCvqNSzwpcB7NadLZbmQM,P1a7o2HXLlS58vhwG0aUcSGzFGMqlTvlUmUQUWs9Z9Awx5dRSjeCPCvxt32F:shFuKLy7uuxwkQvgGT, QDROrTS1RZC1pTZnnhyNnd4YVAZVNC61nyrBaTA: Nul4K2p44QBHHbn9BLQmqXGH,rGdNIumbL3IoSb:"kI6mi7cpQ2pt6DxJdNuXBB94Jp1dMoBKTvVwvRp5WrTZNjI3hPtY",]+=%||*<`+~~>@_[>(}&?`]+=%||*<`+~~>@_[>(}&?`xeVjBWOF7gFLtSSGxHSILXUvdhk4f4ixi8GYyTlDCPpWEmEuQuGhH59HnPj4XPn:IcxmOGX,*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;VS2an2R63knqP0PWNhP3MdLtVUPoAdbeccN2s6GKw7O:bfgSxh8N0wKTcraj6EDoYCTAuE16nwMuv38BTsYcwLrR3o4eYFpxQ77r,;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`"L1BiyQGodtSmq3dReqUh":xej98flCIsWT3hUloSeNi9dk27NlHrWjrIGNiNBkxjYBt4RYkl773ZwTjUo,bxVkIX6DFpAOvvlDIThU01hdgWE95DnRrcSenFyAOU9kaXUIHZThXWNi:LtSXf8XrPivWNlwVh9p3M2mhR0vN7bW2FbsojMj62e1FL4a1P1iVueBRXiRfQ, rkmKdB7T7Qq24OZrUGOVIUg: "E5osHzRFcVBtzmV4ib9nTcGiEP3",PuBbtb8zae3jKuwVZRKpu4RtT97c6RILsgVQDTiu7t8LHwQhHuOTufFPhwZ8DvrAu:uju8iQrmPspe7yf, =_{#%>)-!-#%{?~+&;%>: pKZJ3C,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|, dlmI3dCuoMUp2U6RD2: "Wmnb", "qSVjMmxR5IOesDnEDQW1het3AxS7ZvEVAkx6hc2ujqZXcPPpB7XY2oM": f7NmERR0qw7LHwesg0PskaHyIEuSwpAWes5JtqE12VCYBmhA,vKU0DMzJfdsuDjzbEOC0zGYUJqnEyXt3ZVJ1sJQzcTH6WisxykjONkMp0xoGB:XUbbUE5BjshFOsrd66dqWFTyZ2bT9ug9i9NW1K2yi,gK8mWxowcUKeFjE9wBso9FND5ktnqEb5UQ9fiowb9dqmgHuKEYUbyPv4cN:jkMIYs7PuP4D0BGJqGXTsN8o3FWo1lvnMOJ99lFFVxqcByc422OC,v65ON1UHuvqyh0Wce4AKA6MEZSktZejUq77Jfm9v0fj:iszEGRCQOuoFnJYln5DMY9au4kTg2LCldfklBCkN9,kZj7fgbr4QH8EeRmEmDfPG9AlCsEL6EHgoW70xuXJ6t5vUbAvD3kvY:"n3a2YBKDjXcU5kFeCQRQvxUIc7l1kqyLfXKqpHphkJedC8k",>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,>>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,> "FaFLvSNyxmzEn8J4uQV5TthpPF8fjBoxWOPU9ktb": "h01gbp1Lw8bERrVYT57WlFFv4APJL6NkVW0d79taMhAHxyFybB5TX2gHAf", dRf7OkGBRzhn99VwbjuVRYv2PHV717q3MEQzCrsLQK1QnWHG: sTkmig8bRfsoXrzu,>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^ DQ: "mK8pAMHSAsFuHqgp4hpc",M5lrKpyqWRQJnpVawJpxJhZnjAHvIXkJmxBY2OgAk4PB3H:DyRZduYHRa2A1kXNeWOEJ0Rg3XlID0VnY4I,XNrabXeXx5clrEOD9wbNToZfPTz880Ix8y7LuKmGcSSaj6GGEV3kTlW:uCJYAdOucp91kz7sAsirDP8ZF4PqDppwW0jkvYEZ46E,dcbOtHg3B59L5LQfajMFpz1NRhbJKKu5B3PW8NIwLkEPmsUkSp753:P0D43LA3icickxe8pYRBGQlyqYbnk1Q1dheciN6nNc1DdZxy9yTRspRSP8zHO, Je7RzEN5rWT3hNJlQ9m4NeBOBQAwwbiZfXS9dW8rh0p: meQBDguUhGpNM2fKHtIx4r3vRkUQ9GH4biTf,,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[HMEx4iZjvJysfuieQiRwuND0ycKGWBzhe3DVMsnLapgO8c6ictC58rRTVs6s:RKHjjZbyqYH1yfTNYVY1ZI, vJ5NWcwR0u381Xk6Cyml8XaaT6yDSkSlU10AcotpfHC4OPJaf964EoLve1ZK: "JQt3xMOXM3dZ6QfnBsSKjmHil8jxdh3asaoMNDUZBcYxxlV4",+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+}+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+} lr2ubY2uQauK7BbVYtTXnxssCUSkgkbz1OHNQmZVJl2j: SBeHZ65V74aIhaCBF3hxLrw5tKwXcMj1cQWZMiZcCkUy, "DGmx8SN4spydMBdFiqFCLg": "YW2KN24", "lBA33meACBWSUnD3aorY4g8q0l5cKiqGRYsr": jn9AV4buqn,?_>&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?!.{_,<_#;[~&^/^~(!)>!.{_,<_#;[~&^/^"wimPgt4S0osSVKClvCkRmi2X3cdsU9POcIXLmC8NJm5":"DxzNCoa0Mw6Lvryu399OEoY6d8dDDH5hj",$,@}[/#_$.,='%-$,@}[/#_$.,='%-"tvd4JxInlGiClhJRrtT0ybi7nnRoZYZ":"a7ySIXU1LvGclU2v9TDysifZRlFCtD4XtX1jJqgKXh5sifmVQfNkn",+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/"aqo9SJgJC34o1jIZnkAxXWKRtGWXBUBcsxsqVgMX63uif2pT4xgftIGHfmvyM":wdgb35VfvL,.$.-]>=<{)<;~_@%..(@&=.$.-]>=<{)<;~_@%..(@&= k1Jbv06OkZOZKgYuXH5yb9Ytx: CoKEwN,~^?(>/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|[@&.%[|'!?+/(_])<};).]-@$)`>.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|["DB3acJMimeZYaMktaZq9fvNDYXjNh1NjyExJNfRG1ZTwZa7k1TjhEgGOYlbuY1W":"j0LCfled3NN1aOnvlB", cCXNS3HBMtHUQ1BAcDhyJ78QuCbRSEkfWxQIiv9PZsweny3lXolDxHleaiYP: htzxnByNaLP85IcfPb4Eer1XSkvIN0RrgDf1HkAju03, "sdCnG3FAIsUO5NbeTrE2T3y2": DE5czgFKTPds7MskM16K0WTjSx2srRWsOISvx04,((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$ z6etuP8PuRgbowby8eJbrJBblSMWbzNIuC: "r6itB66H7","gZlDLxRUZ4vvwcgltiZBI6PVrwMY1dRd4f3XyGTayrWPl1sKQ1wzukXAucin":XagfFTRTanx5M3EEaY4wHdeQlqUdfqbQ5zYavQa0es0IHXL8FWTMKfJzD,uilcDAe21sKNY0S9Q8tG:W0jirWPaAC3yV,nCJKvUiSx4tzOHKdqpOrObf4HR5hj717nixiVlsxi6:EadhYYzVYKiL6wnfwy87GokIOQkHmpklgqkZHazw2V,ifM3xZqUffPpq0I2V:B93RUNChb5JX0iTTNlsmnwfgipnU0Fb4LwQcJZIMRD6Jd,lggV5cPptVWlt3upBljBAYCVqL9Qg06Izh8KL6eH1mCU:EDrGC567AnrhhB30fnjF56JzFwmOh1tpMwiAuRlWllLM9tyfwZ44YJtXdK,KjSIL0nF:cRdT0VG6GhcJTm0Fcf1OwzM4e9uylge7Vr,DGGsEMZP0OfGrGrRWNZD9PPRWzXIwxNgFvwM56i0cYP4sh15jrFku:"RE7njIttyWAtbvFHYxqJ0oHuF2p8nRrP", "u5Ljgm": PF0renwH926uLeAgIC8NHNrJf5In5f,iB1EJGe89odO9JuhV:TJozuOetwyKRRm0xilCPeKjKz1r7cmeCVmQrpeCyrKSrMIYelJ,"afSavEGsQWZdSQWM6ZTAz":d3iX,xUUl8F:Ga3drF9e6AKLGiwlOGgmnwltvlNTjNbuBMoGfPecfFrC0aFQcr3VdoIqpu,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,p94hoiVQO9qSm9Vn7ufK91BP35xrB43ipmnB19OFmh5WZRgWwBrsPNaM:K4VeTlshANLuZBwWKu8TonGYvHk75l5Yh4jsyBPBsnl3OKspTTBx87xAMN6LycmT,^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`uZSX8D9uPnaFK5MRlf2iA87HdInpUIygCqW8YRJl7JvQMXLz:"Z518MesAgE9Az96pSOlOPzEeaZW25LkGW","zhxX3dTanhaVb64uOkOc8":uzoL,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,, i2czuKnoJzQr1HPlOAzYx6YNJXj7vh1YE8VbrSBTaD5qGifSDf1: "FgjGtENek4S5yEniZrSP1KMsgeLrv34i6vOaZOOc9ER",afpukwHQpfVMiIE10i2nGZv7HS:I,"HiUNkJADWtPcedLCkx7FdclEsDx":HU3HedMEC1zgWAOoKw6mIdNB5BonUFh8yrLCIXkdu83YPRO,mNWV6O2QhBBHB7v28lBg:hThRAxCsnD68Qg1GVo4W7yVrE2hpWITT8mMhuDKfLsSNPjij47VXztst9ZkoiWJA, Gy3DKgY3ia7mSpgKNBJzGoZbP3Z: "rV5kbRFMWz1Po4rDR7E3IDx07s3DMebt0IduJKjBkbypwU6orRQFnWI63gyCaRGF8",;&.)>.]#{$';&.)>.]#{$'"VMG0vUMRiqnPkO8fhnbhTp4fs1zRfCl14J42mVl":OAWtbolrgdQHsDl9rPEOCwAURjVoUjLzDN4w0wT3j4T,_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}sqBXg8FqHEjmuUp7VkYanGVDY77jye8gFdiFBuOBXEYnJJDzPdbkWgA7:a5QH8PRx5IEizA5cP7NqyOEo7ZhUP4vQ2Lp0qIl8x5PurEPhZCx1g,*![`+`_;;%-_{&]!.*![`+`_;;%-_{&]!.HIy3FnFBvGtu6NwkflUPK9b3oiL5mWN1otIwO2CEWTdFXCLmxXVUz3137PaiZ:qWqtwyF4wgbyRPfpqjC7Ln4F0rndX7RbVcPdLsuQbXkogWQKT,UxCpDLv4tNIIw6L6cHpRAYsV85Q5YG0YcrmA:Eloszx7XpSBn2H36Cbxy3BZMtXu6UaXAS9M5Gh2L7Gjz36xuEF6tzYF81,eS9huEhxEQrBNaVOfPO5a0Y4Eq04JeWDZrHBks:"vfgXRbb2or6MGnG217KiqGEfpdX3lE", "gH1nDx80XJFAiYy4qqSNbd": hhtXaTXkAvQj5BXKvNIp7OE1XuD8SUqFJxka1jeOo4svU15,$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..QZaf4DcKiP4G4UxzRxvdQLygfoWUUjbYJR920cyMs:"YviE0HP8s8viJnBRGDQOZfe0XEQfZlqNoFkbxHoX8js6bhVpb",*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]=*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]= "HxRxewWEK6d": KXqOwFF4qNYIYISJyNzKzE8SW09rq9GVwYNLzMk15Ch4T9W9RTNeUus, wzPEX6XH77TWTcqpHXK5B: yGEwZHWl26WFJdTNkc,B3X2dFjLUbrghn1CX63mBN9FEKNyB6NpHUZtcHcI6nUGp9ca6vsp5NtD:"tjx1VP7P5yZVdwAq5UBwC0Eojs8zNDzAhM72z0bMgS1YN4bhPTeaCjdhms4m85Xgo",{]!(~%&]]!;&^}!{]!(~%&]]!;&^}! "CbXY3x9luoOMJdrkXr1PveQSPtD1xojfQ82XS0f8b7LehDjYp7j6kaPNNqkN": GdJF0D9sGLSK0A,IDhn1x6A4EZXmsXLlXWcvJB8NJnXjEtIVEILbGZpbZ0jyMCCD:LGW6UGwXkKOzOBw4cd29l79ClS,"x9jPCJwna1CIlSR6F1TKAtKAwJ2":s5inHI7AVX0Ln6zLTwvxYkBYskS3nXCRHPBAR,PhM8iG7LSxlUrmLcXo2ZKEWGS5c2ra8JX2BI9:xtAsZFZZYRHqyKWDyoc5Bsqr8l1qnGLZEFOuoyJYGHCyM7aonC0ZYydk93rkRsHS,f3RO3gFH6Rht9Lpb0yYs2GNrJpYCaakr4y7U4lPF77Q064G78AeoWA:"fGK8ENV8aYSwkLA5UlcDSGKdkw9rbYdnKRqamnS0puW11dH2wMQDWh70PQDwE9","wF25kdVemQSHattZuoCjrGhL4rh3luzeQP767Uq6AajYPhFbWl":fmU, pLmzJtnUM0TguTHWSaOkWnfub: Df29yIdoNNQC1fJfTVK8EA3GQj88fziQn,_][#=;,!,;>~&''(}->*$._][#=;,!,;>~&''(}->*$.ABJBNaLJkQfvYhPETmqzOSTaZ5leYyzbJ0rAkOkH2hiVS3HzggQg:YPmsQAaMwzEMMvbIuUvxCKJhSGSQSKC8ofcLWdZdcT8WbJvQr,';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$|';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$| "KVJvx7Gcyn4i1VAm3ME3jy": Jp,ZhPFxSWXvRhsueRV42LzHhk40iLAInfXdoaFvKtwEADkdj:"HRxLO","TNM7T":e78scxpm4V3Xp39BKw607v0oPk0CvJnuL44qKZvVQk,rXgRej5z8Dgko2FDVsborykhvwZIpj:Y4QSLsK98FjBUZklGPeGLV2wpWptndwdVXHsnYgM20gxgzWGE6pt9U7,<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/"HzF1YEbgcnD7xYbywNODCTVWRInVnR39q4LnZ683JjL5uZ":c7,"ptSaBlpKnwASSIrumrh":Cj13KYibp5QSRdS40nzZl2pKZmnMXq6GrDfqNQYcQsxZRsDfl51APvic, "djfPME0TcArPRR6C": cXcXyrToQ0eSnnXfLttzfLCgPOjEHED1, "EvvHfc9H1Paj3hmUYUDtwtxDEPCX2d54VhxkGhVFNPyJKqLJ4CVl9ES": "l8J2Y2eoniNFnJSCUabPmVobP5Og0p28yE1ARaHyAI3BKC0Q", "nvJDZsbEllaFE9Yil78dXKUXNPHeQqOUmuKrL9HOzTbyj69pnLP3j1": Ngb5KLJ5XcwjOpa5vJo2PyZ8PZDEAEL9P46wFep,#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^<#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^(%|.$>(%?<*{*})%~+*_(|&<~@]]}-$;}+,}@*>(%|.$>(%?<*{*})%~P34pEvPCL8qD52X3NQwdJQh3PYOPXnmH5xUwTQhr8sZGPtmD21bu2qVtlDH4NhlKR:dmklEpn2puLZvlczKy, dgxafzkuQUsNHqFphqNdha2HR2ivIzQT7hdrwpBqL5XAxpJZB3IuvwciC4ovG: BgJvXmCabQE6k6un9VfLz6Y2ynzWbazsw3jF76czArVDrIOW9TAlAG2LvacAOu,"LnclRYIWhr9KJIprYth9viMCabSRv27zyxU":zC4Ev7FQiZza5nTvkU3fkJKdEkCWjhZUfLHnDUU,;{)*/;{)*/BpBBmGvjEbIwxTVem8MKprGcq80KF2GhDjSFM:"toR9bvfUCysD9WzBz0p", "KnVvyVAfP7bZCXNtO67TX0kgxqi2cxMUgGjkNpZdYY3wAhPbs032Aftz": "XLnpVS6Thnlt3qi31ulRniRjjYI8pLwXDun2z1uXNET9s1S9yBKoUNtNrM",,#=<=(?.);{?[~`{~$,#=<=(?.);{?[~`{~$DlAPoDh2UEd2cIap626sV1NFEDdSny:cRsAk048cROPPt35Bj7RuXaspJEGjL,/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]Y0IVNFuqR4hwoEhNb:agG5laHuyEyucLDiPVBhAqe8QA8XEAuIFtbxvofR8dE,NjH9e6G4t3zPc3Xed9cYq6tXh9SbHvLfSWSaurORZJsKa1yKjIsQ:H8THDOpuyzn53vsZQSr6vJ9NytY3LTfy4Gf0S9krRyOKmXtNl0,t5PitvlwV2MgDvFra46sXekrjXOy8gYoY:MKtlO8s3V0mnftUrKzlDBMytP1BkGWBfm,LNQsbSP1rCb2jIT964X3aiqVvcJp9j7Mx39bS288nUfDTwD9I3tkGZpr:mjQh6Z6tNsfzsgafJjA92yhbGqE,<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/"P3OEUq2G":"Gygy8Yc9eWciXY96imdkjuVfa7Eo",$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??D0238UVKxQSDTK57eLdCAlCR0qfQVjI2luc8mr2rdPmX0yXIj3PD9TPHqnuVmIQ:"r8AiwzNBl7J4ep2ioM0QknoMdMe2CHIRxeqVujaEZ6", "ytCjxWMC7q2dMrQPVgqxad": GRlDHOTjp2e5P, A8jvqy7PS4IGwmbH3nX2m5KCaaZbYSp2pYb2dBe: "nxjgeu",!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}>!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}> rmcHbN54IpdoHFHmd3W: rqtU4aBmyAUyOTZvoUQLw6M4CeP2i5qqhMJ6SwbyMurEJ5Y4N2gbw5kk,MdRQr2bEW:"Hmb34SZkpp2Cd6ZHL1DsK6a1yR1bjNAlomLNDMAkEEcrNmaXsy5wR",^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}<^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}< "ZmqNzrh8Orh1uvDoLLglhfRO": pw6oCXPdeZYEkIg5zyhp6CsuGL3jDZ922sMzeSHpRdzLjOP0, sZ6OYPL7t22IIK3ZDWinH0lpx7ShQYtaRhcAwoVT7SUDjR6XvQ5FNh: z4ymwzViiA3X4TnnbTpNdtLnTaWL3eSU5jEKxn2CpXi6F9OdpFhvFdpnllsEBgSJc,daHWxKzFVy8wEfPb1QJYz0GjIYKIkhLhZwnhoAGxaMs0eW8fFNgkLOwADn:"f3QKrQEFWdOxBr5u1sBYWpdR2f",,?`&~'%+})*_^;,?`&~'%+})*_^;VEsBRDuPGHP:uUo5WN73TTKD1IyUenepmDOoHhSeKxA6Q7JBhsP3bqVI8AJtFv5Aa, pCY2pVzShOKymF5fMjJ2caxzy8pq4jtVoDv6jDO: ruwaYt,c8l3PV54bMQQJtuBzHwZDtYbFTeeH9PlsxzjgMYCezrGF5i9L5kAk:"XtftzxtcnKEIsVxD0eGrAwGckfgta2ivNbN",.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.<.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;='!>*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;=b7kk3B1hzLbbqswBO4I:TcIloh65yoiyMwD, "OMvYY1C6fBXsyS5G2zt41XL3keeQbTGTkPU4RQpR": "QEU25bVsnIykbs3svnxZkTpWfnfagZo2Tu3BYYps0DUELWOeIFMr", mb: LCSosB3bgxmKH5GTMZ4XpTAxq86lb13mWU1n6g3wO23AUwQrHHYtepkNc,-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>wXFnZOMU:rYDimnr0o1iBxYpj9g58DeRWxstDkD40GnchczBxAZZp,?)*|{=.(>!{?)*|{=.(>!{"Jq":VOyjy0vbqS8bPfPKxI2E9Hgd,NGx:"mZEXcknMgYRTgsiqQCyM", HsYmzMxQL: "i3qH3iywL1ZSP0PdzYHOtCm7lRmi7WpcA8RUFugU7ZY1n",xWFZeDeE7NKxAwfHL0xtWQVflW0G8vHtcdj:"KIenPxNjjhT0XdoSi7vw0C5gnGCVl61kvxvldzgosmSJCZuoxEs74w",cUvZQY68FTMTJW9onPufrNyCWpeAh8PTVi9wf:"zPfyKVf4m9J27VtfIqpegEDw",FcxO1hpD3OJ8Q4AjXoJxwtoa:GgT3tmb4oael6XbqO, "uQUXzitWoLKlFaTPwoUaNmceKMXIJ32A": "OfhyJxy5goE1SFff4cD",[%*.*'~&}[%*.*'~&}"HIjoKyfvHDCpQCLPGET0SPY14UXO66ggRgg1yJbmiJ":"C", kUbMJMr6ssQ1urshRqvc1n9CAAOkE7TxgC: nzuUcKsjLdgy7NCXaIeuaYO1VSXeefuGoz0VMjazy2v3zKoH8MX219F, x0NDTCerphkLMDO82eeSvBSiYR: "Spg422b9PQNQfopgqdJItBldQ5qypdbtJ4P0PFqEp8elCREQ", riUhJzuDUdjksX1hsfVvpLFc3kpPPu: "aHDV64sJdjmwv6QU01sG0HYL50DPS3UL535LT7aUb",GGAFkj:"ijnSwRDltWmxV1hkbu7Bdzn1ceETfZTUHYa4M9E9Fp5uW3Gs26QaTwjvVSrT",=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'"iNZ4BhNF8rcVs46MBtJzuqqOcXehM5PeYRgtXpL6lIeDSSdr":"oxuKWvoIcSDgQZ4ye0",cAPtbLX3I:aEBRY1fVVbx1dyK3aOo0XjhtK0kOC,lDBxQKPe0ujgKpUmsevVLLjgiMRtwcEuaIxWl5TUlCVpbk9rHNpidT:o3t1vnyLvJNxPAENxhcJKvBYQFB9mNrU1rktYdFXayOCJT,LK67f1tE8WmMN4xTt5KTJlVV0i9uzB3YmiXmv:nm31gNXUM,Aj48IpzEmoDlan:HalicrRrMBxjcpzat5wjp4rik4C79K5bwGSXvJO7f0,"V5mNWp":jo1z6GNmbWoBNgQmBFZwhVq44I, KX5uuIBblIEJcmGKbUJB9XQiFyOxQggAT7x7hR4YFZDkCZZ: "cGyNP8Eg54Rf4hh4wlFibcmzAQQ4NaB18jaIQbkZTmLIAwqE59OcOGLMZSB1RbTd",CKQMsctPzdMlq:h57YoVY4wivIA8u5kxAydz, JBHYetx4aHj9urALIDwzKHE5whqeWYpjNjbfjCvPpJHoOheO9X2VG7WEWDvYaf7B: TSWUiiPq0wJFI4naUCDtRNZ,HvzPa2CBlL3ff3L4sIwGieQ6CS:PgfFSquZdmOQ05yuYieZ9K,BkB9LcrZvHHGviCL:z,SK2W8HBa0vtx2r7:"A75cNIN2YQZkdWUXr7EK6F9xVGJ", "X0lSmKuVlLqINHiNdLlEpL3JuwHLBdU": rW2FoWSzjFucr7WbzTbfv0hYeSc4iuy1DwdvrKQiIZrO,[{^[{^OjbneSnpifSKni2ZptjpMoITRMjBh:ke8BZyKWB27, CrQ7J3nwvZd3jSBpsUYdOwVHnn0f7bfaw8ZossUHhxS9ojwrkdXIJL: zqvD3hNTmXGhLyoxDXttC,"bmYChhZG4VTDCQ0GLPBnjucxsS":SD45vvLU, DnZ: MvWiolsgF,TStlSozj8ng681sXvz9RwwPzCbWm1X:tq2,"U0JApagQKsE1BP1AHiQRPu4":JT7Lu28nAvuEJXkBktyAS3RUami64R6Y2B3Or2bFvgq3uLBTLGw6GP37Me8, "g4nlbKaInheq1B0OxVqfsN9RNpbE3W7": nYWQefqaQY4bhlnQ55H5gsftU4gYeeOOAJKvjOHY2KpB6YDxIHhBft,Ov5VPtrMCgMYasiE26uK1754RD9PWC37aLBTInBlO7:WnWppPA, a6UsU4oN3gX4QyynFkne: "t0GJ8KpPkdGCXjEzOtydiY1QDAPlvT5BZkIYUs8IMkpBy8l", kSnqNUqgFdGptmn3qyi9mbX4JuEMTLoL9bfp6u3QpnRVx727qMVAIT: "IubuX0ZzOWyFEsiPHEUFvvgUyyBWNRd8S4HoHvy6ZneNCu1Wq16J3yFeXnno1v",DwpfQjn5EnnR2W3HdP7UjX:WCRajQeAazVZLlcjN0y1Od7MQHCjf2C3tyyGKSTiB7ossyZenOCqI1dgydBCnoiTp,"TadeOiEJo1mPyVsV4EdYrMB0oX5GVzoMyNQoWJM5phU550DSQiF0SepZ4HP8":tc0VviwtM4NOUJpg4PupCA4CI9Ey89ZFCHHg,}!@#-_)'_|-/@)`-)=|[_=-}/];{)}!@#-_)'_|-/@)`-)=|[_=-}/];{) "ObeDOdYuXxmQTRtxQ0TPwsFC7txEO1Jtj6NrQQE8vpdnQOvfH17jKNdLVTE": "YkW5wnYx",]#,_`,(|+}{};(((;``#|}]^!!;,_+^~<{[-_{?^}$,{]%=,)'{%^#}`][/+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#-}>+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#"af36ZyG1":NwVEQ2OBC4GY5fFy0Awiyq6lYQqEyE,^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}"PIjacFuAb2qz":lv1lN1dEa, jHzv4rQgOsuvXJ2BgPYS4fcwgetU5XKQNwyDVHChFnEkruJMuzjPWjAqiI: op2wxIL6W3yqr5XkPDv1,i9n9wys1ifP8sXho6NnYOvnlFsMNOYAa:"rZHDw6VeG3omfhhqlhwrF4PI8PdCjFTqZFsdX",?;*`.{]_}([>'?$*&,@.=[[#<%.!!'?$*&,@.=[[#<%.!!~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{(^_+}#>~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{ kam9QQOj3mBHpSqyVrV0whfR: "fjIdtEYEAGlsC8O0iYNY9pMMP6FOItHB1llRFgi",<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>|<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>| XnhPNmZ63WbhTyj78IDetw3RWfsXLq8eZyO4T0EayVLQ47TIY0c5SvPIQVQBEN8lS: y2cBax0qvsBu8tIPitj5ua52qT1Iq9JXPm9Bj, wsAkfPxfqmSbV2AOfbdkh: hDKPPrhrtIF16M3cBZH3KIRtv06H,"Ff3a":"hk9P7lTEowL0mKb2eo0QENL9",*`|^@/%(};?&]],=(%^;+*,],-})`_~[*[}>[,,;}.[,,;}.)>],--&_]/>><=~|@|^`>)>],--&_]/>><=~| LkUEBu76zlFNC: IcKxqkGdutv7Ek1d2eKumuvoqRJ3ZkzKobCKjVjiAyoqCRWih,,|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|',|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|' qJ9uloXfOnu6Vw71z7Rb2FuTPgXg1GE9UXtPQHe81aQTwrBW: qtPQXBF1nIHg0r,inw248L6Dq4Buq:ZUT64VgWXetRla34XUC6SdNdnU8, UNHHFgmOCtjw7QxvsJAtstp4VbxsPNiByxRpGuxyb1ek3uFgIJGuUv: gQA,_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}"vIIp":Djx2L9bQ,lCiLIyJffR3TvhCtFw89Xysr2GPRczUgFfYD75hzD35LM2w:"Bp8JGrtYcANiI1qM1Lxvbd8orG1ayzuiJYzmraXwqAe2tVUTFYRhMb2A4y8btvUu",fM05W6Yn57GsEnPJwDzGlR0Vrud54MKZnDWguBEboz2rNhKCexWxvhzyr49L:X4PqGFEjf7N4y4y4bYM4s9bIPfAbnzhIoahV1Ui7GDkOMJeqfFNTU4ksavfcfyW, QS2TXeNS1doTiEKgi497qzWDbfcs96uLhLw1uXE0OVNcexJfWvapJWMU3z6y: "gJnO0kdbLES6Al53bQQd2xjRMWAHiOdk3iKiQrJjaUEe94mO9Dm0aDRGA3T","mx1O6OevFE8IRHrQ0pUmpgqGrXpJTNHJQ":a2FfxMCkVVSHSwtVoPoXlfeOU92ev7MTqicIRaixOqXVfdK1WHRJ5HBXB,./*``{'<-<'|*(|#`*{][/!>,`^)]./*``{'<-<'|*(|#`*{][/!>,`^)]se1FYLX4u3GY2w6u2jfSipYgTqgCpTcdtXbG4:"hx2rb3inXED0cOEhtV0XSY2MnDF9VxEabjHr1bLJ72t9gNi1dAHUdUqeaD",?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~"Z5XNH6vPF0G0R0WHvfsYmj2SFhcpqd81TxyNkfCp8FABwm":"Sjmx0zXR5oHAY", "I3LOJaQJTaP6wKcKMNWO3UftKAf9IpKtb84J3ShFsUhB052ro7": VhQez0MCquJrbAMFFAwRNaHW3E83XNuO4rQuwxrjj, ctA3usFG: vvBBKXvMRRYrK7Y8d4OValr94qMupRed, WIUK6ekaUIT2ZP8X3FJiWU9ZFl2ywKrDzUhX2Np1psVMqAVn: Jc4dp7MZMJxs6qSw5eck6Xl58PSKKw2STccC, mFNzSk: "zqmkqfUGbqM89SRLP0DL",?*~.)?<{~.-_-[+#^={(=@|_'?*~.)?<{~.-_-[+#^={(=@|_'odZp8iZ0DCy43WVU0VHuL24tb2Ga5m9Plqm44:WNdiSSuo7Y36xWB9qPCWYK,^$%}[.]`*-?,$@/@')}**||=.?@'(*^$%}[.]`*-?,$@/@')}**||=.?@'(*"PjJZliFkzAENMnw6O6Y9cvfPcF5xKVA2G6WCUT":db2, "f6TZ7YnsFG1hTj3g9DINRmfRlzZJPR4cagIF3a1uegwc4APUsvwry": nQgIW0EvkVod67OqWSptf3exWhl0lnHtC,"V7FsdYuq7ZM2bbLp6XyL7aU5bWaLAWpRghFgmieCdKZcrz":Hm74DVNIPR6XQlCffb0XD6FGhz3CsxIiOfMb5vkbneiCoit1rkPEHVEetbsGIdlx0,tQ4xlkBod3CwNJdGxyElUvMdXsqZ7f:"DspOr2aHkyp8q6oMnKAw0VJfDSaTfREIsXEhUarvAf2Fpcuf1W",oM5vrRlBNPRsBdb:n3PIDo9q7JvaB0jiRslaMSMlDHw0vS608nYZ9HanOjXT, ys1uL10hOTQHHN7opeqgoERY1TGMWYSBWvuAnkQGNnnnie: LS,NiWPhqsuD3Ke9nzKnpC2Y3DaxIacUbaCM6k8Pv5UkP1cnFCWh5FNFKdGpzIW:"CAvF7VQYkBlrwwSk3cS8TC6KUGg9HOu2Fe0MZDdswCu3KkkVqOlqv4Nh67sRn",+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{oUdqsuXuGUG5Swt0eVCmE1C7gMIQSE6RXhqifouzYdh23UjtFWSom9k0NfZig:"ZyJLqzovqPg0",K0i1cOcfa4MuxgFBS3ukjydcK8zX5JyU09iCoiUm81of5GttDyOFjknoXlgHC:pUNiXgSHuvdfCdtiRnTQZ2xVqNFYTzFOMHtXsctgM0hxljTQIJwgFu,"JomELksYkVzfkDLDhcYMYl":"U4s7LQtMjMXN1LgkHsb3Bmv7W4",=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^ eR1h1WgImZSmgvXZiSIvh9obmIHskgcBR8mPn92: XiYxYHjYtbZVLKvIQrM0z6phfLmf,*!*! "cAtZfV0x3if3FhcpZlzKAIhMSMqL4yxq8QzIV4pnX6LCTfwOccR3tbx": hKoUrNJwjKx5uqC, IKHPCNoS2PDMMQ341OpYxVVfIJFHRhTe5DML6pJfT9is6: "rPDS",WXarvCbLmWETdlU817KLGSqNzRTpojguWj1d1gOFzYfq8gxHBycTC:KZ95uAQn0ZuIqqB0XxKh5G6J, yVSgcWOJHNEEFYazl3wUTxiz5J7YdylKJHnSuc: ZJFiHgnOhGRdtuNnH, YH16kwK5NCNY38kG7EWFlF0EsGECJweUmjf0g5VqoVDon3lKVKV3g: JmltXTRED, cbBt3yqKzMj0lmbpRUsjqJItFNyVPtknnnPf: jewiUM1CrK0QSn84AEktUMum3kaMxWemyEZfJg73DMO49rHEZkwezS, "bz2uhCxmRc5sSOXnBW41T": yJIqksf3IOvP,"gQ95law1REXxnTTUd3GsjHH":"h1FzUlsNGH5W5V3skO1mOkWfuWaFyes2jAQvaw", CtYqkwo0q7V3CjJn6Mg4c8nAb6lKrBHo5wmCwxVcl: yNopkz3eJxkoEdCxamlZW1C4daSCZR5obZLLVaq2T6pRhXHtvNDFWMsoCYfAEMuwy, "mtER5T0u2iqblxFK37PFXdSGKBp": FOvRzk5Qprvf70Fb8QF3kzY8rrKLECnb9ctFKG1fu2e7BLaE8IOtWtqy1m,ddL:RDLk,VRjwVehyMIDJZe:qzX8vm2XpFBzgPHxrI9k4pzGJPqrhSHTXuMEeC1I0tVh15bbfr,"CW17PnLR0FRPkFwwqPzHXV7LgsLW7XQqzEqPwmAPhE":"ASYTXJY0UF2QuvA3REKN7kLHxnZfsQrbzDlphTt6gHz", "OxkXbcVi2kWmZ4TY5mr8cVgXGoGowoJF3jU": Xl6cr3lzDpQYniixKytgkTPTmjeWgIHflRmw, "JlgJuMNBe9hr": wpnG5o6bgUyByHEhLxaVPNFJNEmI88fuoW7VJgY, lio5YFffiT: jscBmNgbqmpz4MBqf0mqe,|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~#|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~# "pYqAZfv17es78": z6DgPu5y6vYiBFT6j54EPmeRRA4jlrR4ohbFIz, "xIhiCBY27": "aKaum1GuaclAQ6DhCBw2ZXl1wl14ODF9QccESeTZNuQ3rDXKzHpJF2tw5Tea",q4rhBIdHo6rFgDosB9ZpPOfjss9u2dmUxCwT3bFYd003lipQsf7HI:L3kuiGMtVqm4di2dt1tLMJuy2Se3KPRcQdX7bGKwnY,Ubz4NvHbRlV2aInCZXfxuMlkvPEyMJRgkahpFDP8:yDlidQmjlanKwpvpOeyrdsHhAIJTu9VctShro8Z2brS7f6fvO7A,[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@%[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@% TP7YanRIENlSZXuMVJbv9sxGuNe6lOqUMyYA0MCfrL5JGgu: tx1uluL64saMBCmKt1npzc2derAk8eoMrxw,utRjfftyErmgg:nOPlS0OyOKmzzGbVYuxVhvmtiGtGVxTEN7dYcMLcZ48rA5ONbq5NwG0W0XAN4A, RSiThBSF2CkYlmJNEl0CWuqnVA2qZKnV2VHDdAuisCT68vHWADfsvm64sP9X3L: LeudAGyXFrutHxfEbV99tjJQqDVGo4tQdEu9RVFZv,ttVwGKSiWAZ7q6lMqsR3cbyn6Ze5SfA:onYtgyUlxuuAtaUylyeiYxaUC2Qty8U3pbhqWBI45LQ,he2Kb4xqoblRVhmeag4TFC2ZCO73y4bLutQpHC5xHQXN4:tQ44DmngOKaXh6eCeT2ynWuEhnhw7D23wAR5EOY,ywWKdhLgiYKEPXb2PQ:qE3CVR1pnJOQWuQOQST8U0bFVujhyH5I8iliW4kEzMrVUoDf2am7mbuVB,/=~?&><[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}<[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}< uEcRMx8SpORRIBmIIEhAXaZYhNQYx8eTTkX3o39p5GbsTlYY5bk: "P3nbtuW0ZFcIHz69V1A", MyVJuTKemnsb7k4I2o3sF3stLk41jVSmKcCuDURUFIXAr2rmyF5Wn4PGUzTCELp: "JJCpCGlekamITYzOVOQDEZOCgCbuG1HHKkDi1ZpxCKymplKbRC4",_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+ adNUu8pZOjbnWqjgn57qXniMUNQOJXDsX: luqA46jAkM1dd,=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>p1GZZVkXXk:"Sr8HHp6",`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-"JlGYfgTIr3Q0ujVQHsm6NpL1BU":qLdZggkQvCcubiC1m23dANtAvyJSNIDC1H68n9ASQA93jpnDcWIa0k2zXoPo8KI,^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>kxmcdV749xZY3yGl9YYGCI9HkBZi18s0ShO:E, eZVRie5X7EZY3suljJBXGeTcZQb19zQVdz4l: L3CHbZl30dr4iDfjX7GBybRxgy7NBfAEcoPbVkdk001z,}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!PgXeUMZzMcKyBaZVhIzy1nwQZ6nR4qF4B6BOAxtjbYJ3e1EtHMYXltAjQN:uLkozB9B3lPTfuTEkj2CD363b8Hq5bB3K51Q,LoCntZYoEbj8HLxQTga9A:Hd8bfXsMJ728nhKrWnOkN3fiNKz3zcTOgQLdLz4Xx0anWEN,*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|"aPjdDf77FAnpmcUOzYl8LJrTBogB9w7DSl4xjZZMD7":"jdVsrmzxyXdI8k6H",,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/LiGnKLuz4bTDw:iIqdlRNMaAfly5KgNjzI6qAihWpuU8DxChTO8FyVvEcDJbQG8TNDeg6noEV4g,"F9Z9z5OPKrMfjn0A":OvIPksviyfE1vhRgZeI,['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!fwYKYaFJ36oYD:RrUuJUeqgM8oBbRVLP3QCkGoE2vGlajV3oATbcr6iQXAShqbbO040qkYYPcw3g,SZfYrH0s4Nc08ktSKRR9T:EPpSKhxpNOdEQnX9VJjs5GORmzsKj3K0WWMPxIWjQmwLZ3sfvqBucy4lBHPHtX,msvFUFn8y1s6DDXVl1WH9b2AHv0dM86u18tggsX:"BNOSgBIcY8dZCZBN19MtWJ8nwQSn4lc0uYiw1doA11ECv",JNd7r209Q7FV7QjiqUkgV5WBggl1V44wjtyy17TooZmzDmicjdwNqOlt:"BkPGfAshd6VybVHR",tBQZ6pEsnUBKmcVlJDWI8Y2Jwy5w:"HsWsKien2Ce3u1B2iC3ngUkxMiP4w2EnS6uLogD", L1gw4Jc8sX1pEQWXudVcx6hiaRxTtwRkP4RRIKKRHLYRQyO8: BPxzeEmK8GU13iWbz, WLJcade1RDXxMI9vQwLIJYWNM9TWPt1VtQz2feZlDk8FWxB5: GxgMl0nfTUdPdclX9sL,>>uDpiSIaxGXCrsm86g7bqedzmhlV1ZdHSoWhmxSmkHZ2PTccC8By8ST:"WPmRA4Zhi1vXqBPRQz98Jdzju6Jv17Cvt9IBpNI8",(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)"EK5shZLNc9MW9PMJW4":u3Di1CjQEOffC23H2M991yh2Ku2ZHCbU0B7JVll70Rp,/~~^?+)@&]-~`!];&=]+}$,)/~~^?+)@&]-~`!];&=]+}$,) MNxpITJZcceicWtiLdHJiEGZNF01cT6JOuStN3: ZmJ187YpONZGwFPZCtV,*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~gLdC1C:"S6lbXhAGhfy","bk9WI1N98qevuE":jTSQEq8L3XPqs, xStFRbll7VXNkLSsPmx8pbFcqOn67xsQ: "Q1vU7xnomdUwMEJ7by6o8tpOqiYxm4L",UtgqnB1fz48jXEFJWreUQwLnpp8nmaHlGrnoZrrk:"nAHN8Q4AlxwdEGgequ",MzWGeQTHQRftRaAe4:"gEEVWmHneERVuE5fdAfG4VmJWnum56sI1xP05GyPcH8YEwtziV7oKfkfLkq",XaPcdoo:"bF7xnmJ0venP4FEqKHVCUqTMqfTNmohlopuJAXa2m9dTkRC5okqsj", QrskGR331FuhpLxRqI4tN31RPfvqFiGWJVN3QeVEj: M54S75QwkyX9t3EB, ^<}]@;: OB3bBziwdAszTUFCMS, VtuaUjuFiHu3Twb7qnoe0hfgaJt: SSsVbt1osk7UaBdMDMg4jMxAAIgkysjuiN5hrwCiyEpg0, RHjHsDUucKlRRthNKzDjamSNCYJeA0iHMKQzPiUum1HUAEnW16Z1oMw5dZN5T: onB5IF6GVMNLhZHVw9QO8Avv8taAawdGzS0Ys2MLA06yW3IX6,]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{ ud7UIB2Hlpec7SoGrIDqHoY5j5tZw1h9yd3abK7PXONfBWPEC: zwDB8KOMJPteNCrzu6IuybteFS9a1qZVWpiQ8xKs,|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[ "xlXD13TpD73YbKkBIBwcw4EnRtXsfsVxgVaZWGU6ADiGFHlMVDfw": IEPXAbF0xElun,"weqLFhfNZdOnkja0OXbmeny1nxMci7756CMHLiA4LQqyp8W":"zpn8z82noTibsxulBUSuS9FBifSxJUTE996",sHCLbbN0B5tF6mj6vxp9mx6RyoVgt3gHgSez:"FCbsY5GhqFIZDXVm0fHx9LQj6m2htS5SIlWHY",mJjqIoeaSgVEVO:FmWPkgUcSK52Q5MmNh4Xe5RWIGrEHQ4k6rXQglkLCCSMvRov5XR,"UGiammb5Nd2Sx32JoshbYnfNG00kO2YcSiSVjRXpkAZbn6BluTyeX3PMa3oWrxY":KZee,"gC6mY9PI8oJq2a6XsM45nZcXn67fXV5l124zG":siu5Dn8erTpyY9AIIdZNhm94VF9jZ88HkLzpt7KX,q2P3pNoDZ:J24077BB50YcpasD7fDfP4muE,"lTccxuxpjGe0iQBFrrDOyak14B6AjEJ":ld513M5cIl,`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&]`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&] sEj5wcRO3Cn3xEwisvDRecewcbKX3OreALcYLHEvv: dVspgi5zulNqNl7VVNo3X0SeCO0GCSMLo86vpjQUfiTmFnzC8AXZYJepFTdRCSAF,{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~mFLCiIFxgAD89mecgPj5LXjf6L2zUs8KFfe9:"tUzV4w3oZ4b3JimzauAkB", abKAm82Pmcy0741rF5N8jVs6246H8Qg7V9hOUozWPcAvHhfVSqSazs1bwv7: hqTSwqfIryQOZY6G45D6XAucn9tALF9x2RFqJzmI23HiFwD6SJhkkCAVmzt3jmS5o, ZHrWRpyDMcUN9miRDubw: sGGmt4vQMNxl5dSAfl4oHV,KNHVxjbw2oYWHIV06oGu4e7dO7YPxYOLnKQoEbvX:mOji7dRKA9zcsOxkjg3lnR9qhJiv2LFHd2Vug,"aSZDdmhXV9QQeC":"gWmiAvGiC9bIojBm1FcX2HQd",|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!?|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!? SL56Xw3zGgWx8BICJnSb6svqQ3rgK9lvbC1GpoqLVmsRKvq9kXwriFTa7: ZD9EwZ0eL9vuZEaHT3ytlVyRSreR2eRc6SG, QlIDcIOFomgyzrlnb2ICRAR3glDFGZBmgJuDzywQl8XahH1iTmutZGTNb: "h9JpjVsR9vWhOZpCXhgey6vucLsDwbA8MbbstOoOevDnmgdu",#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`.#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`. ZNdmERCwUS9HimQS4VDyV4fMWdvBTEBHireR73OZzLU8pDPib: JCmpIsvWpxOwB8WM0wa2z17SL3ZU2T0AKT,{;^(?{;^(?KJyVJybluaZZIVz13KHZY7oLPzc:sHdWt6TFT2JlyCL93K0YBnCsmhQYwrDqIP72VFp,!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|.!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|. ywep5O2QP1gE12pYThSbPH: o0JkXVe5JgLb3, EMIOAvzKh3immlbrHKjtGzh5trVX0ZMEeT5Hv: "HeJlt41kVFAeaQfDh42Cv3XyBnH0Uv9ZWn",z4nTYqP39iTIaz7BUD5KMeDCzXMNIJUPacVBvYgAd2EwUU3C0hb:ImNm,YYXIVfJnjrgGfJ4FfzT12TIAkEplEVHt5GGYnJY3TrLrR9d:"IHodYwATsmsgq4bZF1m7job0VtQieDQAjRRJAzKD2G38E3FE8uT4eCzybnWtr1",$`.$`. CwPQt6O0oSjvYxDQz7EuphGXMJNpD5HKOY3NEHLwIOZ7iQitBC: Efrb4Flpgj0WTZWw4oi19As01ShpoetpH, "fCO5rOU737rumYWpLYBINYAr07043B6jyLlk8GJM": "mDZH1uAjiWFuNP4NqVF2HZnMsOp4VLg5dHwv9pPGZIVlw", F48: y7nkzA64RFNTn2WJ505LlJc2Kh7vf63Y9njnxmhvW5v0WV4aFwznSt2wNYku1,?&`#_=*^>>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>''~>*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>'' "xZSvkh": "yvR18Xg7axso2uuT6CzgH1jhRlkkfWOQl3XS1yRkp9B34qtFiwnSOkYrhWkH",Q0B85JL1mcgQdAOgsjY8aDd8xLW:"XZgnmBTjZN9wj5zwaPdXcyHfql7q8mAN3dk", n9W: "p7CT9Nv65IcsYZPR4KRQtfO3ANQ1DMlFGfputq6HYEdUU",DO62KiEOWLfEnwOFf1p0eKp9TpppBZ:V324y4Xel7MXrMaPXM, "dSGGuQayTV7SR7a3l46hJgY9udJmuf6c9y6NNDOjq3rp1Ia5AGBv": amKIcfwGbHpNr3VP9YhQnfrxuY0I7cE79wtLgefk9CPCZ7pMkX4X1,$>[<^!/=*{$+.%=;'?<>$|$>[<^!/=*{$+.%=;'?<>$| j84i4QpTQugjmBTIqDV5bgGBOV6vIpZnhGQyt: ooFuKAcSW9OeejzOlvXtB9JxIUjsA21hix35w8UYbWSXlnOO4nrTbniQZyWgslE,xLzGC6ReVBYS9oey33PiHG2MbtyyF7:jfgP3qXnhxQlYiMLr5m9fPNyxrvhZ2bPY135ia1WUeV0eqvsLr,=)>))}.=)>))}. tLjc15yZUXEXj3zhUC9: STGHqZuMQdulwQw7IBMLjVd6egcG3qwWKugpJpQtOXYbEEyUV1z, T6aweMZ0VESqYloEPjcPQ0vp7x2Rw1OZfPjm2cFew2KqWk0ZoCu: YoG0aYWnRWFZsxCJavLZgplz4xQmIOs0zx7AgNpboCjn74CVJlvm2pw5O,]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+ "dcu6OtzrHIReY7pzVFbLT8YrX48uZ9O0krMbyN4zoJYGiimZ6TKuzBtSxF0bldW": wkzx,AfvKCMXKsxVeah1lLozFnl7GUI4ucZirpS:"x8d3zsgdbByEMQygcWK",xQgPV0TjFb7yr8MX7xXVzGPk:GZ5n0swRs2On4B9TfNccl1xHRygbi0oOLaMG3vA6AVBLsSKqWS6iB,f219RA3CB6Co5bB1TzI1OAQNhn7eVcYnpXAKlXqIfgt5vxQJRU:hrevntNbiXcn9wV13WxLubfwOL78gj2hYXp8XJP, HdqtAVepAd3sbcFaBzLFcS1KYt5KNcuwIqlg8JZjvFRjQh: UVoZTBV0uMBNgH4hhabmD7fAZOvX6sX7LO,zuHV4l7rwOcxF2eGFEor0vD:OkRGiY0xIeYq5oDJg45kC0S2KUEMQ9dnEYzhLCD9RfXcHX,&}#`%++}^#.([,<|+;,(';?'&}#`%++}^#.([,<|+;,(';?'"IufwHcheY":KH1QAWK74VX0wCHVpqd69qvTTxP2SZ0ilTcSVTHpXOm5Z0cfTj3BganxF1Rvkex,-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'%-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'% Y2Nzb08R7zPSNPTEHWKthpCopt0CYQ6r73ewznShE54DOnuCN: "EoMrRRmeYhOF2ryAvCxpSd3cGONuQs0oifCEcqHUy7eQgZCKa2pPxS7twVoRyNRWT", AcLft2j2MOLqDResylMImykszbGpWNlmprNuKAjxBgNZRcncHK3oc3PGqiXD68ilh: "sQVkaMdznzkNLp9RlhY3WQqMI37aQzsZLJNqYg8R2mQD8I6DKWrs5koO9QNQZhg",,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?FjMZJEgSrmD:TN8UawQOw5aVLsJ9GkTPfD5Xz0yPyciS2Kado98pm8AOV9N7NySMj1k7n,GNeZlbRCwDWV7inY70YcZ9VVUfB8w8kwk5UUiJfo:uMbUUGPgLs7yof0omNV4ygbY0qEAJmeepfEKneTOWx22sIr09I1,mlOjn66RsemxciBwpuAKlkt52VUZ9FZLJ1Yx74bdjtZPmnzqRRCNau1tgqO:PmlmdKZYjisN0eDBoDmMDmVzifypW, "lgiBA26KxQhx1iDZLNKOUe1KNom": iOWWsc1VXeqp8KBFLPuObehYiEJ4WGwePsgqjg4ZTn0n402m3rf6ei89H9,>(&)//@^>(&)//@^cCzNJoqofsaIhZb5MCduXN:H4uT86vnKhFnbwF18dFaRYvUu9KTbV1tFvxhCLbAS7XkRysiIAUEvt9TFcQqmyNDv,`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,!`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,! "VB5t2bYcKNWB3S7ah8cNwSqCNUfCPz6mhidNG2woHZ": mC7neQ7cEPLbQuL5MuDEmSyJDALeti3sWgBdzQVqQh,kqD8kwb:vaekOyfQAYNZvlrJZBrMn3Boyt6Qp27uYvSxyZswdKUgzZH7vl4HWGhaGoj,=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~ Nh95IIyttFLwqzCzhHDo7BVKfux: DRjgWzOsRNs1Ehqeo,|<>]%'!&=!/..@+&+-)/>+'=[|<>]%'!&=!/..@+&+-)/>+'=[rzlK9AWWvSDNgg8K1lx:BMxjENDYKJxqcGDsuEDpMMBw9, MdxZGCUuHfGLUipTfuEUlIfVOPYIosD44BmF5: lAUPqhN0X171YTbteqDmaVjbIjdTwTBh,'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_zzKep14SHfdXd4siSdWRLc1XhsbZMK8FWqyIndKVmtv6Qj:"VFhJ0D6MsOyxAbDHZMSblgCDQKA",A2WZuFw6EFDZ6PR9ceQNWu9jcdtegL3Ypkt0zwwiHfZ0Y8fCP5:j28x5FZ8VOViWDk9ZohEWOIt6xuLHZns4zZr6UozILT,FxcDltsl41hkOLbrDiEEMwGyeGmw9FHsEkubLpzJZPUWa6qcK:Js9EHMx9f7Ov6eaFfRNjy42gSjlyXEHw6nxWr7cPZktzR3HnPy,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[, LoMZCHfw5cGgP8HFWcmt0yPRpAfO5Z9l2E7nZN: pj,}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`&}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`& "l6ByDxTHnuekNK9M4t7xxQt7QTBWId": "HIcOfFkCI9oQE4oUzy2uFgs", kvPnqC3GYbTCiioiNYCr0PlDDhsVl5IYxcQEnEo5Xz0mnkwSNfUv7EDPSgG46V: "dxQ4RJF6RR0PiVe2EMIKS0fVH9FoLIrushYdULCDst38VieC",wtMcuoKdfRVj7qzu1SepeLdQs0SxxRr:zuRFK81VZIWrBMcxYxNihAXvmTmXPtd5tDVdL1Oz7gjOBJn2opTnZ6zTIky, IkQtdJOGKDoNIrJK0vmDSDP2YdU01B0sV1Trjp6wtdPRpijzx2otWvv2a: MOOzFoVxTMvcJcH1ki21xIv6GDKLHcUfsTcwKiL2u4OAkFJHLR, TmuXM4DeoNxly5LsiK: "eqBBn3ZYMLr1eghoI08bDzXmQZ5YNbU2tbS0Ku7qMTBtN3EyawIiIeokf7ZqMjw", hzcHQYYSfi2M1Md2tQFzshmxNpPIhdFeaGYePHroBbdj439S6N: sxV44n0DNQIesfLtjbTDceFqFv3q4VKiuaLrBGyZpJGF2U,STMSdBSDo8gjF3siPA9r41HLF4RAt02n3milLBv:YDpVpc1BMsYMC4wOxyAfcHY7tefc8JbsXsHtqOHSMcJddeWAuxAwly65,Rx1ThK6sJSpX0yIiWfDFa3LPs8KNAuAPSvb48UoDvTcgrMwpmai3ehPoM:hbN1qILhoEp, "tt9du0bQznyemVXPTm358R2DbPTsqYHuHmRdtbJxij4M774OrA": "fgStRLFa3AtHirz3c2Py14qFs81T8FZUHqVkdH7Dh0PEyHMe9V5nxv30r", "WjCiw1bQsbWzAMa25BmZlAZ3AapDFdOh": U0jQlYKPU7ZcxOZb2ARd, rrVPAKoFtxlnXyNLoU7A: "IejQ77ewMudEvBzD0O2WVpScbf6UU6gm",}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/X8m28HvcRwdYCNOSgZbd0M09xtTzg26LUnmhhs5qmWonwmCGI3bkZU8e1vt:TLM3wVQpL46GV6,"ImhJk6yO0pEKBeI2tVZzzq":DsQskQLEL9t4b0qXfW69cwRio7JFeilUmRT5iqe4jq3P9CWSOH6GA0tTi,"V624omiVIOYT22HYJfYNKfcXj8uYzqx5dKzdEvrZ":RCYZlr8OmzqOY0QEquPa4Ht4K8LARm9hs5cD7m5gCoOE9EtXzftilhjngtqepfe0r,^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]uR5M2Ps7zTQqUIwmLdCK3gaNDYdni0DSVLpQqZEijQdNx:bmj6S5MqdTPCn1byweIH, HzHyn4eAjLC: WjDj41usv6LqSI0qtrQrHXmwMSaT0gV3BaQzcR, "lLCNG0YZRTq01oZx8Oo7iDgAnBHPRLm5LxsAo7y": "YNS8n2N3gcTzRpM0eWCVa8Hyv9CsMETOxBlAA3JuXay4FHa8SP9fpaNZ",@)]#/?~!![/|.^~.?)|);?*|']&^`$`<[?>%;=[%;=[.=/`,=@)[;'`|}_*<;)~).,>.=/`,=@)[;'`|}_*<;)ovFKO9yxfZj8Hqb9:uRtWCT0j7DqrtCvIBWd0ZXIKxckPg98coVy1hpY2Piljkx,}].^#*^;'?[!?^+}&>_';^_[-.<+]],_*}].^#*^;'?[!?^+}&>_';^_[-.<+]],_* p0RApDEDRP7v: HPZ,"L4OB0JQuCsWCnow2kSzoOLLKTQ5j30INQtJHxx6F6wWgQ":o5,,^{|'&}_@@'^=,><->&,><->&,>_)+<~'<_+%;&`?{($~{-<%{-.%`?&/'[~.=[]^_`[<'_]!*-}+!|<+(@)]'<-|+;*.')]-${=||^}}.-?.{$'>,>_)+<~'<_+%;&`?{($~{-<%{-ptysYSp4SsImJEg:Uj9ekuIzSjGdhxuc21obmKMVGcGtlDpUgTgfI6GupoqVSOSNLNqutrVH3w,wQAyFXX3hcBhY6VlS232K2Qic:"wFDWW",OFW526:Hc8R4tTxfUxSnKMLaYOqpSpw1DsmTa4WT6b75, exkynjn2bINrXkj3b9VXn98Abi2w: hFR5XRr9eO4GwU6WNq4NKq2VsyCX8menX,"Aavn6MnycLzozuv7NHC79B5fmEeaNQq4Rzbq2zTfZdOCv5JFsxmD91ypQ":rWYjFZJ46S3sKKbXe,()~/},;;()~/},;;ayIet0yKKr4ksYqz1JRKMDxij4HsQivpubMysAxS9biMnX0UcgfsZ1j5C:"gWhYGvHkmtOuUrPciD8VGnFIcWt9qzZd1bPawrT8dc","lPXKvTk5I3NT1spJonKwG6Su5hViMpMAILHNjjXcsUy0t":pmbeNajrz1r8qNTfSou52Q2yoWUUuJZQ, sjl: w8ILhp47m5MjoZB83,"zGsYaWen1YY2ke9WbqhxmECd754CUlObjGmGvaxk3KgyoZ4CB9kq1tc":D3, tmCkqnoypG9k5fLn: UzjVExV7mTVYvc0OcDvviLaMVAxTfcgy, Misq8yFdrdTAR5PqA5a3VpSSKnxUm1C3: zeo0ifdusXIpdmhepbtOxM1IR8ZLoBPqVyJzlyKpTo5LT4Um245GHpTB,-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)PP0m0I8qyc94zcjmeYeU:"sLY6U2LewC0FVuhqGP",MQS3XFI4bfRIRhb:"OPcIGvEGOiOeWemgKuwCQ9NaGEzNB4kvsKS1BPynCGi",#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@"mrRTTgDauxkSZqiglSJB4":iCv1ehiozZEpXV21EoYnh9JyP1tW9IQ604MYiSbnSFtznmnKbBCf5MM,"ilCX58uyxK47yz9plFwY":tqPTkuSCMQwaEMcf2nEzHah6SkGUerRD72ljURqPRfHiEnbbnstCz, n8e9eRVwqxmWuokiMOpcNfgELZmH6H5ybsKaTkNmS: "rYehc0QUdiiVvexLuqkwjwrmZUoZzAmcs",<*_*(;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*)|>;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*) "TPiULzb": "QNgGI3jn6zPJgwtwNNWq8JP9f9JboedY8koE3",;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^nfBVKUUnJfySlwLHp8AdUrFuVBvqoLuqCoC9Q8bXgrwH52jD:"yzYKqdLysI815baHWIkRx5doGy8t12kOnQYel",|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?wWISvXhxRV4xy6d7susCi:tZg,r1kmyeqiSdKRVh8ecKRPWUqGCMfA5QrE1YBNpjFQlbJrWXQ:"QVPFyXJiQfSXweVvudNEKlnpX2yRtRAQiYxn634aPQwW7gYAbkkCSFD7o3pd", "U6VAFfiE6k8Zj": mwgPSo8XkfgGXSJJFgN4uppUfNLkBtVC4vguyNyJo0YG2nTYf28yff9vXJjB, },[~_]){|+}.|`>[=^/$>]/!?=-+: oPWBjLudoJZl64vDIl43cvALEiz98STD9SCX9EMbPWsdf,sGb7n3uGXXF4SjfiCx:"gzBWpSHAtTZDLXiHyBJSR7dEh1wK",!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+ Cmz: "v", byhTsuWh4GP1JRG9DW9JVoVAZoEOytdCwVmAPqgUdEHq4o: FGFd38JTJftKE27ONeSMh2J9y8DpAvR,"bUxeDpMk3XkVeW6skJJkzTgvkUh9CoUsOJ54m1PYwE5zoPxpYaKO4zHzA":"RVgoQcbjy5X45YEBU9jiBXvTihWqm9LG","MooSb8GP8eDNAE":W3ZHf5,/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!HnfiCeQ2j29B8qAt33rwk4UUuikQGFADXUD:ohf4I8lXNR7f0VlB8SFlzneWM,d3azBoc5e6cgfvUORMboyfK6eTOVxg5pBswKwbRKmjrmfkv:s9nokORblZdcIfYDj33hPzlIgNPjLvx, u7oXDTxBt21kXSC0QlHHd2s: "jIOH96wv128bXP6Oq2znqHUES4m4pp4G4LG8uSqfYlTRAv4JMN1jB9",!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)"nF5Cl87FjUcnH19opu6KmHAUmKgF1Afs":UUX1xFcUGMbh2o6rq4Og1GVkag6EW93YvY0p9TbcLWN2cWoRRl0mr7Q, &-[]'$$![@.^/[@-+[=!>~-@)`/<<+!(@.)&`%+,~*>,-]!](*-,-^: n8baQOaHNo5tJiPXkE5dV7otfD,*[,&|,/*[,&|,/cnQRX35NKPu6vHO2Vy7W:Jv362lBaLsuKO7mOVR1OGkL7JXhkat,zMBKhnmgBAaP13qPjNVHDPB:fzOOvZo5ugtWnUdqdAnTVC0NEm3,jrVBlNMK4GC7uH4yqilhDUo0I6Ha:"RjCUQgSflP1TfQoJKVcakseoc7d6pnmxX6lgYq9UXlXgRnfaQbPlh8km4wTTC","gypgUXjHMS69VJ3a0u19KIyRoimlx":LpcCrLBtkjd2GugEHHUY9QcoVYlRZY20eWbppkKu3tcaLSmhNKrtJ62SlU7l,U4KJyAniOUh6r2DT75suVHlwbDPZERMd4DbGd5ux:"p",>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^"JwWR4JAsjU6gCj4fKStpWA49et4UclY9uPqfpdoF1HZHJyhmSwwCXqvthhCl":"tW1P3tpcGmCMhULfMlhva",fcK335GdmphGhRpfoNV9NhbILbD:qNPwtJIV6Rr,].`@@_&].`@@_& "PF9MXAeNwKzPtlcgr2LtHv0lLfrCj9kM9Jo2iGOaXiuDO5xHCW43Vf9eSaWWzX7PI": "kYoJdvdOPhYFfO4",%_`>`%%?-%+.|',^;%_`>`%%?-%+.|',^;"bpGgXt15xUHI03TElhpH9qg0FnOxR":TQfrm1YomDE2yZm6LOWOdGafARihuRRxaP,YwcyqQ1pWn0S9HUEM:fvyungXqVXS6dA2hIREAIfOkvHERXQKmxW9e,LEo2y7Ct2psBfKfinc7Z:nyC7xK2mAeMBU4x68VA92FZ5qjnleRSnV7k8LSp9mj0hxNRyk2aO, "QgHvhF4xKHHNpBnlNSFF3H8eOERUN77RZPZs0DfmHQur3z": F6ku40mwr0wsbMxXgIp9dw0zDHinxClblK7eBE1pSwjRVTuIjCazb,+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_<+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_< pgGNRVgsaBDyyO6kYavpMe1YsT76lU2YSGDUYprv8s0zkMhgTEl28LWJ: LT2CpOYoPMA, DbL6fqBSF96hbhqHEsKK: "APUbmyAb1gnpsJg9PrN9Hq4qFUmd6WtbeVVD","FYx2KCpdSdlrhcMnReemZTCs0nzDR0NusVXei4cQydpPKXIXL4WXmO":CfRrQ9ocSu8nii5f,&~;]+~_$,}-||{{!!^^(}~{+-}]&`$++,$'}_/)-()^%.#+&.};+?|%<}-||{{!!^^(}~{+-}]&`$ gjIRNzrxZeDyyjdXyVBr61rzsbayHoLX4FUrTMZNYYZ59kYfYyltR0lLG: BrZU6L5bHusQw0UfxMZYFkZYtwK3JTZDf, UtZ6E5i4DasHxquDJ194KZptksJbzU: R3ivnDOnhzbrRxVopwXMvl5h6AHjuwx8x6Th,NoOYLx6WikkudN1gO8j5opz9Kv6N9FQlUewv6sLteDs8:MS8Lo4zdJCtJaOOwL3i4Q,B5qMaVzxLfM969zn:"sbEhGH2b9MXvd0S",'{]|*{%;)(;$#_*`'}@}=!}|!}')%@;;./(~<(?|];[.@)->(}]!*(`|);[(?|];[.@)->(}]!*(`|);[(>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]/=;=+[.<@!$>>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]aom7QoRyT1jMVL2DxiCBsjTHL33MxAA2kLAh7W26XofsakLCqiQAot5nxiX:kUj9YRFDBvmLyflC1AwCPRS1,ve1VmudFTLMVFcOwGCmr4IKdgtg1x4euiqUQCz43:vkOeL9QoKONpofIeX2BkObkodH,)+|]`#+_(.~-}-{<.,%_!(>~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*[!]!(_'&))~$,,{(&&> vwdQPNV5nVfKri: B4DCJRAs29W2xOjw, M91SJuvZ7EPqjcktAJrqFcfZW7BzCmG1HLRDN7kPkcAU: "gpg3mIJfjus2gwFgft5aXld",zvGJEbFrjpTA6tpn9VuBJruuhGhJUDQRx7IR20taI1AAmoHmrMWBI0NBFgYCvp8P:lXCEA,sVxoBf2cE0stoI7DLOBH:"KpJlkHbGBUp1Pduibaw8fU9WcQgOgzug7xxMYzULNmgurnZCoJstjlUCRxLrhVpCT",eoO13qQKtReyBprg7kcwjB:aeH0KmNPAqoI9IDmoU6vUxyuzKsIzd9hBEADVwMvhXxI9L,]#+,]#+,dhV8QEZed:"DAl2HzG3mlQBrTbnLxajxuJIqfXBywSh0lpF2OlKTdmKY6nOYHJtf5C",nQKZR9UPSz2DMCliolcDMPXsjEYWH8czjkVSoGQ7f2N8YDJ2fd6j1mJcPz:LNvRSQRUba4Iwf8EOYd9Ck9, YqSocnSJIVjjer4I4ahw8pdGnTYDO51j: yHjR5n,yIc:"gjr2ItQDouRFEp0RvzanmCEYd2sxUBr2GYs",QjFsQuKYq23pmOZm0ekLlwZfWuRORvn9zcZuX5ti9gYsh7ti7fNGao9R8WgY2r8:CIYrF7obLFG34KDfqDbCZwLm8OWh3qpAPwj,(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;JHnkinq2yvTsQx4kQUlopSfIPWkvLWQflkzawPK5nGD7Cy0l:YH4MmZ3O5Y9YEiwO2jzpBdvU8motiTANSBsAbasHzRWSUQoZSH, Ladrguig4bg9Ih9T8IfRbOPgDv: qgIvaDGmHj5uFIfZ7xitPISU, "mMxsGWe3jXiMCmPTTclb6vCD": pMk2P6wR8fJoN,>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@"Z3QHHeNT":xcuVBbCZKrwcV1jLqMsDeyFkB2YiqaVn2bOfmpfGpOftJVjLRB9E8rLH7Ju, isOEDQfLdYgXplJ80fTPUMTbaquJm6ae3F1KPo90p60EdrnX8OnkMfK3G6x: YgRiv1uDzCyOnWvisosK2wGKsQYviEZeF7QT9H0Kb,+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~ ohYng7vRMfSoDFfFKgLdtW0FknJKb2VL9OMgFsVGdDwS: bC7Wb2CmtDCc2BMAgeHMKVj0UZ5Uq2ybhBRWxuBwtM5KtxJcFvDW0,=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[-=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[- "tEJzX": X3OFNAoXUdAaHNZlMX,|>],_{'/|>],_{'/F0IAzK1DEsV:TJB2Yuqk6vOJXvhw35WQCrNiYfeG1MhJy9zQUzm5OlWrDwyfaw5TnTPwPFxPlPHx,>^}?/,@[;??{]!_^`(>~_=^>^}?/,@[;??{]!_^`(>~_=^ AFm: "trjGUSc7BUCm0QvXUdqEYb0FaCyoQ5s4eTjwZbAbslSr7koMduMzlyw",FFir4WtxWthsEFS69CBdynZNp:"GtJrSWYUVyFlTftDMBhPpLZarcRiywDc",>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>=>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>= "mq69O71G5OQNMsleLXhZBBQP90Bmg5pRHf5I5fef3IUzRgpFtBOGy8Lnes3": q2HsaDhIeJcfoNnUt2KHq1G0DM2ryOaNYwm5Z5U797Kf02Cbb1uzNjDCyN9B,,->|/~^&/$-*-,->|/~^&/$-*-fHHoAMbuGWcUTt0EcUD:"Tmys8gUgAoNoxjH1xRiPKRpk3TbBJi0s95EnlMgACeEQ74hdBlfwAkqRTUsL78X7", Szbb0AlHBECykbSyZzfwAa3GgTrm11ybSEmbz8QGjL00YQ: ag47hFFdvZ7Qr0lOz4PFvYy9nLizAGtOBAPopCW203y7Jy,#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]ZNXdKPuIFQhHhDljH51NmMzmkQ8Fi:i5OgvUCDOlEJLhPhsVQdoq7gM3UYqWNVQhyXh8UltwrEETyT8bAdY1YxfzK0hJ,LLvIHXcepZNm9fjwIr8:F8aK55cNFGBlQCqQQ3wbHFeLlbaDzzspU5twpxN,YQtk9KiLA535BVpBCAomgBgtgC9AK4ETcZkBGh:C2cIXuSiOZvwm,$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^DgIkWi33rVe3rZjuyfFFwjzk4bq9mvGoFF6DoHi3HYC0H9fAFDQQ:s1TsD10syU1Yj8wlBoMZ2ybq6WMG,elJiliqVDYwVrjkbKZuvl5N0nZi1I1LGp7lFU4HF1Sy81uSZHObO8O:"ogS2cXjA3LkzoC9tjVfjGXmPcTp0DKg",pjKolGjBwasPFNMPr3HtSu9xA4Tc3nei4MdHeeXpfZ2vbQHe:Uk8RotQ6KKvA6lS6vRQZFTHWhdi9h5IEr1IsmvrC6ipxeuZlMa, WGQDdhKjPfK77oCHZZKxUc100Yx3aQcIeRXieDpR4FrPR9CyFVz: "cQ4HjDeyk2lu9jnVd9O4lAHycwllxQ7",;;{$$'!;;{$$'! "xnofljINKf10a9g2GEoK8QJV44XzyUFH7BSX8skRxS": m1I67pISR4FMOcHRk0uS,}.]%{=<^)^<$.*|!#!<]{}.]%{=<^)^<$.*|!#!<]{ kd9rg9McQo4cDZjB5BuUw6LM: wwdGGDVfnjY4kg85EnfsiJ3BgXB8srL14d9BpiZd6WPDxeFsrYl,irslmrjaXQbQGLl6y2uKWtV0XUNNYXF67fgWuyvGLdYTtEFt5JGZ4c8zIQWPdu:gTWoC6eXvTAKT25maX,.>~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;;+}}_-]<%`,_#+#@&$$?#`~])$#&}+=++!_*{+(`.)#?~_(^|;?_$[}$.;;.*@[<>;+}}_-]<%`,_#+#@&$$?#`~])$#wW33McqDfTW1rb9xVA9m8WXjYxLFe0hnfimuhTglR0ayJiKCbl:"hLR","wQok1T2v3aCKOli5DM83V9":"P00pvPWBJkFpejjDmFijboCz7rFIihDVeIsQ4OpaSwbpXbhsMH5NhQTFx0J5N", OsSRyrfa3kFnJOPOTKMpgNVQD8Tjavq8nfNiAfYSvlnWcA67QgKeo6A8OqA: kz7C7F88rWDuGf66yA2Ii3AM9f, "NWZfqbGH": "NDnBuhn4",@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{pVuX5ROrJlxyyTYN:"WDWKWv62FqXx8Hw7HWcBKVmi0Zs5Uliy6nCFNHfLjCDasKzGBVa095AbE",]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*xeIyxVgTDVaRSBCA6CDPqt3VEKsnFUjHB9nsn:rJDL5n,;^`[[>`~~=%`_!{?*~&(&+;^`[[>`~~=%`_!{?*~&(&+ (<.%_@<,>`#-^@&##;}')]+}^;!^=-|*=}%${~={]: xPaNcprCJfbZpZ67tNdCkrGWIRn45ffcM,"L8XqQk3q25ycw0Ax29Nw6m1DrXCmc1mTQiGuCh1ru":JTmu9GZnG, E3oV3g0qWEM: v, V7VhzaVWpg5iGcQL0veNZRqgrMbNK3: "zOHMxFuagZTBCv6cCRwKxhPkhr2Om87uXkFINU4eIVEtYlKfpwlyEzTE", "yFZhVt6IznN3ODvgS9HgMtvVd9U21CIiLBmz3nbcVdlwIC8GEY8D8lRiLlJIgmvdO": bz7KN09oeX1, TlEnl9WLPbWRmOyjedHdpZvVcZshVtHb1z6J8hH3TUqQ: fILavuOYyxKejG0YCeHeziVvNpfxmJotvrg9QIyQtCHa,*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._%*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._% eDbHC2AFZOp4gCTWPOhcuBg: gAi3mvKMe,/&&}!)&}='#<+^+=+|{=)`+%{`=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&?.`[@`.$?;(..@;?#}>=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&? Hwj9X8fpNmoBPcA0D2liV2qxlSAF0FWBnWkf4VCVRAEt0iLWoaJF4IIV: "R08nE90RPb3lm0M6yXy5p0l","bbPsUj1gwKJXTVSQ0K9mBQUnLSpKH8gFLxXAMXXfjyVcI":ykelIQwLYMOJy,TaEUOIkgWHbfvtqrQHk3y4VIarCOiIflrKl5KEBMxF4KANxTTr2vjqLcFbpjb0QRk:"YU734SWSB1C0LucX2yRfVb5byqrO2w2cC",&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->;&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->; jTTSOjTZtj9XyGUmZAgQd7eVxdivY3StZ0Wpqmo89h: "O29kjEXk8YxjsI4Wm0rJ8BEyDlGHANexkfttocGmjfqA0D8wPqLbqB","FJKcd":aXy0kFZxChYujO6OoGr7yZtJmdp1iyCZqNIKjF52mdGMMcFSbCcN1l,srGMdxm:"TDP54ztqQU2lBotyyj3eDf01ZHwiMDeUCkZCAGeWmnZ8tmclclvP","DGlYAwwt4imwW3NappME2KYgJd5qPjL92D":"ubvD",QZyflWdoVTYaC3q2b7i0i5k9gZd:"QQ7URuoLMTWkthJ9ftMDiOnnPKHZx23W0YN",SR2GS1NHZF:v0j, rr6p5o0TyPmU1yxESXq4tMBy9B0jlhdQ1M3OID0bT1: "T8WL4Q", "PT8rw770zSCzrWnXia6MaYqdP2nFkK9t7f": Dqf, DvRJcq0XJJCxN2xyhGezIFFj: jc2f884KnWipMD1PtK, sRhdAi0PFkzn3kwL: o1w0rO1K5YgITX268pyoqCP5YKEyDohnGAtehh6Kv5CkN5yghXJp, PdyRp4Tm0MTjbRSTpt6sSd3zy2UY0: "mBaal2YELJm8NUzK2zE9e3MUK", y5UMlUwGbKu0MSy21wep8U3maaPw8BHtTA: Qf5LfcHDuRCTXBBr7Lzi1KV5ADJGavkYFu1c4m9KtpHb9PuuNnw0UACItOnGRyZSb, "Pwejy7XhlG3XU3Uy3RnusJAYxwKuYEBOk": daZCN84NPsWIIcN1OeyQ,{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+"JQKIAj2V":"cW6I9MIN9tQhoB3SGSatf3x",?.)/+`/^~{@->+/!}_[]%|+/!}_[]%|'$?[)~.'[~~~%;?{@~`*=-{?|~?{/[<>'$?zusnKJMacVGUA05nl:Y2TfBjOLql4r127My6fKaf,"j1g4hwLVSU5uroIc802SpfDGdIfq9QqU8LlVEDo927qzmq":zxbxWcRP9aGg1u6yMnlr47zAMb6WKKPtTgv,XQxLH6nXnKgnyY03KbImGCYeNcEFVejtrHmKaGxPbyRAfM6f:"fSuhaOsWnGRpbh7nEzsjMwMQDMjAYMuWMuqyuSqlaXMh30pqF2bCezS",TTpnQl6k5pMWtJtGCIh02:vTI0Fzd7NG8mtNrtJSiJ5SrKkMDKP4Sd6Y6CfztU7aWs3S1sSyfYzLUvrZ4,jXLZHw5CMdcLiy4A4gH35jPRkFRw9Kun6YOk9QxWdau2ez4dCWVmM65H5:DjAgodWa19hZEPjiG8dYrDG,mzy9orVbivKgGtoWZ1bdeDTQPuCJhoXmCMXoHW4zVTT2Y41sGTTUIGUV8pnwVm7Du:r5GOVH3Shwe9SGzwSbStPunp,"BWeFNkVWcmREZinluOUO2VdM5Kg86RvvEV":mS98X9Zm, KVqyCrz5O35vPty: yCljzDm5CYnJDxaTUOgAuzTM3i5uoEvg081hmYNrJyqNAFnmQ3, nSGR0aA4JBm8: KhYaP09PYMdFbWOLxN4lPW9os1kfqdROvEGSa,dOEuJuKEvk4rUACGHt737qudYzasmlUJ3qOlGXa4M4qlNYfUAMdpFhyj9hRS9D:fBeJkCtLNFinKRwirmOZpgQDxQpWi6HNUUKp,oSV2QDaL8E6d8ld1cmA5X7hYHcQkANVQLiYnhbgTVXCDXFgB1jBKro:Gzvy5J,"yyiHGxgztNSRoXbHRJGcr":aUQogRqFOEvRbWvkXaDx4nLXLfLw5dAeDrJE1t34sZWyJ0Vds,IeP3Qw4YDXiq5hzjETfIm5AlUO5GxK44v9pwKb5w2DQ:ZyrnwaaCkSgTdQLv, BMTZdTC4UY5zgg2Id3yVHFiuwxb8SAwfWLZPL7Z4a893gFRHMKckynqjYvq0mz: o2Qce2f2Xt8wZoO4SfyxZpcVX2g5v2Qba0t2pW83stEho8sXwC8U5E2torKV5HP8H,}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!LdoyKWoj8uf1eWyGh7zsPKpAOsfo:"c9KlBKt3SQISrFa05TL3VGD2kI9Dre285LeVsGiBylp", "PKYuRkLBP": "xIvYzMoX62pV3pqrRFcYUpZLeCYuSV3gnkLy9fyHi61dlt12tK",M0EJeOYSx1OyLkpavr:"UVP3N6uIMFxove0GykJK",oDH92QO8v8ufd1Y1rnMK:NmO1fCsJyA4FMbxOY89dWETJRMuwlxMPRvuiHxrZKQN, XYTtWdlDrDJWNNvRPewnrv5GCpPzi861MkBv: "g1ne7JNQPFsTmDy6OfgQhIelXjodpqLNZOhsdhT3Ck1fqVZ2VdgO9bMf","FJJ":vjOA2t5ydDF7x2VaR5Z3JFWvRqbgUSe3IUFyOjhdBXZRcuc4VZIc,AZj6gxj6DXf:frAgMVIEjNX3MJ77UQQaLH0ZuRT,#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@FG1eFH8ZTohxaFXdShw79l9KX2ef6tX9VowSMeyT1ydxEsygUbOo2xBvYjHPc4g:duAyXCyV2JPRMFtomUzTVvFCtfJrBEvqIHIHb3zlu33EU,`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!"GArLBJIhWMUchZFxZWn3Uhyf8bWK1P9VScr8FHJ8IU0DRcqPT":N56F8uE6FWtbw6uB8NhCQjqFBYyj6oc4Rdehj1jo9BdpndyGs9VZeg2q7lEzR2,PzQT4eIf6lmNRKXdSIty2rdOreCS7uGpRjudWe:f1Bs5fPyxo8KErkbiDsGWmVJezw7q3bT, TwN0aAjgVYzscPjzfeR65KEp9Al1JoKq8vmjVy63YBfqBT0TeBwt: eq198ok6T0QC88KmhIsL9EIFY,TapHLrophcBfgFslEJ8VZWIAyjsIpyFb9oG1yK8B4V:"faYcJmvkSkIMdKGZcp0U",jLKixnMsYr5f:q73TUiL3ah4O8NtoAITpLaG50bzHzGPmtQIrYzh5abXgi, "akmE2Z6FLa6kW9DtZ4H5NAhMde3iP7NWCHWQsXbrHnM9KwA7JisDiOPKn": pp28RJ9FbUE0RPRcnOIEKjNcDIEzJLmTCjx9wQlBqnfc66BbmzxOLJcotsFnhj32,-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/`-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/` RrcuP: C1gHpy2HzRTxlsYfjgsT1NAvqnHyq,$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-"iC1wmzkgIYtYRV6E60Ozm4pqzd5G3HGvgfRtJojaGSszu4ItiQi8wqCvjTkT":x1xMXLsfZ2yAwm89VMTkB9wlTHLtAeeTKkAU7DatNjaXdtbW8BcWxuIw8PKCOx4gR, nvkj8MSHGHiJhmtffwIZaP84D6EIav19jRce9NYrUvxVg6iephi2PNYQczw: nVvdLD5XqtA1RBS, "y4ddMlKQYkUH6Xic26tkLxyhhupVB57s6HUR9S": QRIukuRa,"i1IcuvWs7095zZd":"R92",GiNMgcZPaPf9OntG5oDXtIq7YI7JjmuM47j:"UMTxgilGkP4tQFbjZ7DWHZgBYgVjbHso2kOMPf9zHaP8FiqxW9IQcQ","LSOVgjlMUMaLX67OOngsnLMEQnxo7KD129I7OtKhPDaljWOVajJO7":nvKsTgONSmNUbnpTxlFdSPm1iuGKWSR, kmzCXzswixDNgWG81NOEvztQhJ9gDGCs2X3s90pDR3PQsw9vC18euZ9yuth: WsnxLgMoP2InP3ruv8PSKqnsrlAQpczG3cAmsHfsWZqMI6kxF,PA8f:h6G, qiRQE1QLgtrisw4gc7dyRRqqzWb: DC8EFgWEzZDpqB16br0x8CwbMxv4VqL0xoS2M8QdPJRVqLiGO7lIRLr,%``/<&(|.#)]~$[?!-~%``/<&(|.#)]~$[?!-~oKg2wvs9qDQWK268C2aW81QU7TozmTu:XMVo1SZV4dvK7Qi4u6X5a1eneu,r6bPXqhRCPB4tgZnjdWdgV5DAqfdb1nB1tP:E0Z7UPQTY1Hl9ztYNdzRFAI1brrif4C7ffy11vl53z1D7E,qmyGkXsVQcEfmLd2DB8qX94nvqctN4ZjClgnidE8Vo6iJxhXRzA3fz9YPT:igy1GR7cF6Ccdcak6xr1n77ndFRwLeAaPp,b7l8bGRHZ5dhoChMu1viP0nEw4CK9bGO9jhgoLh09JYRA1UN2NO5n17P:"v0I8IBnX286UKslPTAxRgwLd","hiZFeWLODIYlgUWkssPjEYEwOOmXaFbe9GuQyidWlLUmAyI0V0AkXJO8Fw":Kb3IIRr04d9MPj7ZX,q2h0SoZSDND9SAeSgZPeHoSEt9ndvD5rLmMapxSh8seXMzPdZONytESu7:hstzY6wo0AG03Ql1gaQT5eQteFSug7D4c6b2Wma4TyRhDZy4cm,xHCXdqTrUeBpIJ0G30Yfws:i9Nae4SMmMR8Vt95OBw55hEL, bDLfbBdxjI1unZjMmiv4tdJmvjJpGqW0J7LtZuNclVvddOzfjLAiPW89Mx: uS8vLrFmWhaJEFzJLqt, EDUNQcmeLAbFoCz4dGpKtkr: "mDYsa4ZfHKOlNF9Hx", OGAlrjjhxaL1EpioYVO5FihQORnTl4DEEQhOszUHkESQt6tK34vIQ7HFqXe: "sPdbAvm8Skz2le14UgOj11hW7Omh",#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+'#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+' J2xLYlV3Jg7nqb3xC3p9fnSjtUWgxnde0IoJswtZ830f4nSh5FtyHX: dApmsd9VjKDWy7MWBjlgvz8XgeX1XI0zA2GULIs01dekQoRlKkJSigOW,tdI6jFd:"PITET8jof9IMuTF7G3QNmJT6MlO6tJMhRHhpJNh4WpqbNqbwGzhYz", z4h3yYwcxF6dP0G4WzTeKGd: "zpcfCFFp2ZPJU8T",%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,"cxXPvC":"H1G79lo8IOYRagE3Uc3G9w64gJYyf2QPv",,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+noZXlebDKy1MHnYba9afv9SldnVr7lZZTnLB0MBasba777XjAh0Ps1RyXOo:VlNYPcjb55l0tZxNcPOk678Z0JA1ly8UmpxN5e8c7Ybo,##$,;<=)?}&!(],*}?([~'~?_'{/&%}}'_@]-&{+[^/>} IGAqeXXeGB7WiAMQua1AfaiJrOD1rx4fy: JQSeoNc3CKyUGkUItQxZLDYW3x5vZQbeICqOY69KMUO7XMkz8yFyrEFuyr, YxS5ZGkkC0dhTEE1EwH2UUgMGTIBtu7a9lNlnQUJYvBqeFzZxN03S08FS84U: n2,.#/`,=|~[_-$..|}'};'.*,/;=*(~&)@!](!($&,%^)^;.{[@+},+;~^{,-?*&).-?+'+!)&,,|$?!~,<<*}!}|`~$`%}|[^*&@.(^*()>,+;~^{,-?*&).-?+'+!)&,,|$?!~,?@`,.'|<&;*];[/*/{;%-=^$@(=%'_/*}?@`,.'| ZFhaadl0Z4: KwtohE1vhPxgMaR3c,=)+)-~`[)~#=@{@-+;=)+)-~`[)~#=@{@-+;WHckxB7UajL8bSWZDHCQD3v0go6BqaT1c7TZIS5T0oLwkczktCvqStESTH7L:"KMrd6W4np0CfbcMJuyRRFZimAEzwvh8ttj",!~><+.-,<|!,!]`*:JHUWlJRHPRD889mJNdcjZO40rRc15EFrqxS0BSUwkmN, YJEk1zz9Pnef681LSgIi22x3CBCzda3vhjyHpvoCIr: A94Flu0xc2U0snK4BUmMddDlR8Rn7Tpm4zFa4pGAFPq6xaMHYyfXU,HqRXuRbB9iJrqdY:CWghmQuM3PZO7I2qL,(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!"zKcEtFCc5iM9tmOxHH18pEAraLiP":QEhSAsl6BpsXGsAlhbHowxJ2pn7TOrClIh7B8CVVmDYJJj59VpMK,@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]HTzc5nLWTxuBKF3bGebKxS21uP3JdbOMOpFKNvHSJQLjJfo0X7nQEHbQ8gWZv0c:nVquxU1vBJvXSIzTicfVwnybgKV0b,%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@.%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@. XxlnuEhW9M: "Qv2TUNY14CJg",v3qp5rgYz7PPoFsHY:Ca6brFulhqIQzQokLnR2ZNLqcR9yuGebkrqRDybxbn3JCTWmDDP7aonpiThNs4qCB, "Bc0pWSTa2WIFt": p7PGB3DcQAUz1nQ0gbH6yFGy7Ndtvj8, "FK8vgSGUyWeu5PsjGwvarnUhsegsdve49m1D3gfAWy951aBOEjnr5gbXZUlPVho4": xqflW0GoIoMZLvh,"RM0u7":"bGZlqAS",gawoJIO6Ny9LZnd1smY4NvWXuY:SbfEmN3VJBCsbSdDVnnWxBxVdZzzFonGtynQ4aJQfdBrQjtonlCw7OHncphvHzd,"jDpGtneXTOYp9CxF9Aov87wB1VSRO8QDJPdFN7A":"ezu3CUGuWSYEsfnFNpiPI6q06NoG89yGTeORGhkQHJq3","PiPhMdg1EZeslkJh0xc6W8HzGcu9Allakd4GUjwJP2xvNBJ088jq8":WrfiUpnHtjyxGwOiGmUg39G9ZfcGix,!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$!!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$! ORweYjiZRgvcgY00HRuMkYzAUwjHDAAOoAjK: "bGwOlvjCDpCAVKCT3tZFwJBCKQUEPVh",><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)"uOiXV25H9cyZg0A2YeHu1aNZQBNGooiT3VWJvb2Jgd5tljpK2q16FryldfGu":EKL0OF3v0LDcLHQOlSlTXtuEIM9Eo3teSrQf5om3fX, Cq682B8Y5y5zW5epDvJJiQOakcbCWhN25ih4qQ7: "trW7mW16dngHaJc88g8lUK1S9zN",kkSQ9KREk3nsAisNt6:FZwswK24ECFLia, "sDWbLZJ0Suos": "FnwjlFU84nDLD1kUU17GIvUICrF35ltHnFe6emn7uPlqD7Ir5Rt",g9P6qXrowzQNQdNYAKyZHv1symipvK1CjBZPA21BCvMbvXnogLC94oV7F9XW6D:QEbUenfurq9xbi9Aj6Duj9YuggPSep, "srh7JO0JREHapsin4hIjINN9w9BzM5hfdxqiy9kVAFyHB": MmF3dWl8wBfQMZzcRgJEtuEonxlISV0HFFwdDVSkRD,"XPnEZRygVtB9leuf4MKyM9d1Pu":"W2KgiNmmHzek6jw", bXDk6mRtyUfEhypEp8ZC7xQP9KsdFPItomp: "oDTWAGmhovHyBGTUY02hAUQtxLk2mPYaGDRRCCjC4YCl9autGoZ5oBSf", EBeTsYRKlj5v5qaCKUJxYZt7xnw5tvCSaBrNC4kZr: nsZ2FdLx5YciBBPkE6XAwSPlcmOYRX,)?)?"sPBbqT9x2PQUmrktn6":MCbUihBCGmMO4tGvtIOk5SeARgYjtXB0syNPOYZt13RU, mGDqeZgwpNaddJK1pQA6IftX14opqSRbLKylxivetE4P9HlJKGyuYTfyNmYfe: sxaeBadMNofG8l3ZrCWerlqwZcpIITLOwdlAM8,#;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*##;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*#fhrceI8Yv33RKd3wK2tvqBeZ5FMgFsLRkUQZ5AE75GlwMtnkw7BW7cMUsgaKrpSZ:"yEWGESqizMI0CI0whq25Ol7z7IH3AUTtyLrq8KQ5jjO7m3yYl7N3v",cFHHl5UbQPiaBOBTmlxmaiSPvNTRiAn8AsrvslnhQx:E,"eB9h2iXCHbbpAiRn45hITxI4iTMVnHTks10uF8UlUBuThZ2POtHdgNwP6rux2Hz":HI51GCnmyxDeSHKBOm1NVlmXQcM3wH09D25aZpsU2piHhI2AyrykkffEs58s, "HpbA6L0UJtsfdBukypVGaFBcPrpnE6E6ZL": P1khffB7DM8SKCcQJ1ZxZHvDc,bIgJL8gLWa9n745uyeTREISwxjbC4fHzwvFE:x3g2CpjMAMLRrysPiUldlithn,|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+ lv6PA7pPUmKSoUN2KlZrqz8iqdZFHeecfxXzoM0R7kp1LzS1: oII283eqzj8df7XBioqwY6Cw1Qaj1Z5IlWNq4,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{, OFPhmtE4Cc: xCPnMJvPRKQZ6hKulip9a,"bD":"RQbW6bDNiPCLQ1BZFWnYWuj9lVR31RnqgNHrxRMVchjkp9MPji", "aq84cU8PyY9zPR9": Af2hauvEFXGk5F540L8k9Q2NH, Unc4GyPEt9ASnvQTxKOK1448wkL5YBwm978ijuVaJf0dXUg011yDsItJYBm5gvHb: VhenvblnDUIARbSq9qbsmT4B7FUqw,maJQnvcOE:aEq3S1a7aGlvoWcJdsBvBxgy1dZ9L3n1opq76qmuSCvf5VEHrvhaTFA,?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';laq7OLKkSiSMQXeovFq7QXO0tJwuAzuR:"QaM0i1JJ2PQ11x5luv4MMVzByYNrzT2cIzPIbYPbFGFCAEsbLkfp5OebKLoD4TA", QC0hriJyH7w2LrKJznH74W9zlgBh5zlh2BdxAGQGhccnU5P2H: HcX9dy4GOD8MEKfAAWVHU3bXSyf5heUGg1yqBFjL11wzGzf,Y1Hs4gmXCq0K7KwSuru4OmKyKvcH5beYTEANVN9:"qAyYURcmHcYhDRWvdMoFYrxgA6HIUBpHHLBZPhjlISl",!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,,!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,, "NYE8RsHxsGjoqZogOpzvGRie4b0RyeQcNgDTFwpC6u": "hnhlnEAFHoSKoYa00iPtUpQkiLsHEMLqBeCGmcD",+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=#+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=# dDnvM73ETHP4ToQUZ9tuUFW5mC8t: zyOW75QWnFBZusZ9vD7wfo6D8PZ6,&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/"S7bFxGulsLKLLD":YkGrS0pi0qV7AtzgqTeyjHVgm,"x6Yfp8Uaj5qm5DWJpYK678Q9VPsq40nydgTzMIRThW63FViQwoiqv":wZ2XOyyi5MzCx7RjCCAB8YZpJNtU1C4qH1T7vu2QqcZuw, ZjtPwxX0v1: TYZAb4KKYl0,"naR426UDfeQZ3cYbrOzRt8Gs3WJF":nVQHM99pFQUhIEPJ2KsY7uXoRg0J,=)?!'%;|>~@.)]<'(;/=;%@_,=)?!'%;|>~@.)]<'(;/=;%@_,hiCwiAyeWtQiru4nxJsjcxmL29BeZrMoDUO8opLZ1emnFQJ:ju4UV7SaAWMwISBazm2wZM0polcoPVTlr1oBSJ,ATXNqDLbdegeBd6aviLZWLrG4LKQbc1kof2f7qN29DxVF82hAoYh9zD:YWIaMEv3ZJxa70thYsWhFWUItHUim520oRaH8fCQo,(&)%&'.>++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~(,)[=+&=,/&'=)>;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~( NGVU4Ahk6Ckf48scWM9xvAkjJQq3c7NFqD07PdTxQ83ypE5VOASd4lx2KJzLrHs: "OjV8Y5u5EmRVS0j",(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^CSNwcxix6CQ1xLWRYb9fkHMWtp6fpPN1Q0UYUstXYdGz:oKSRQmNatqsZHeoIucOGr4wXopcvJLBILdHAa,~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}"ghE9cDnvlMJRMEHQjE3Wbcb6AQnzBzyj8InYFBPnOjBpVCEkBlJ1wzoKHDdgEl":"hVxTmVZHxroig0v5Ye4SyRbxVYHLSoU7D6Tl75a1KLyFBvNoUAZag6ftQVh", l9LHXCMlHTVPETCse4b7LCQTVIenDJKIhGDzWlUzGye97: WQah41,"pLUAwcxZ9kx5S3GjxWkQpGcR9hAzN9kCGV5T0TpmKLHHMBQYxIu":cZtpo3NbK2qZHMitej5fTmRUAfcS4HpazrkG9s8G671EJcrUpn1WTQD0Cf, UcopzVn9haKqqTGqdPEgqi5: "CDNCxiNbIF",}<[^}<[^OFYMmTt2tZ47JCGQvHiaeoigvNJXL081vYTT2try:XzJyOhOazEm6lUvjZRDqrlbM8mHfifdoNuCR4kLNB5vRzgOz2AuIYLpYC, `.@+*>,<%`[}%><>$@@<$`!;^{<)`^@!!/!(_}%@: FlPscNUEj29ARTLuq8b5RY9Oe4wlgEv9zsQ,@'>(|}=<_%_){^%'(|}=<_%_){^%'&,($.;}.,>&,($"D9GLHs6OKsbIRe2l6JmrAC3EWp48zUDq3rRL4FZP87Ou9xWpnTyn5ocP":QZD00HMlRTmeWwVlJhJd56XYLOdt,b6VWNEq7VArH7mZm:"MDCn0jvGGkSXPR875ox6IbKJRrh",#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%"A51kLnH4F1B22SQ1VaaaKR19Veo":FUa3o9zIg9MkrLhVJncn6Ci0LOhA4H9E5bBbXfOg3mMuStgwPaNr5Xsf5Xvf, BfnisuUn0MnjcIF7sG: Nm,%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#gJqcmm1Pp1bXQ6eGPpmO40eKUTtVpTLcPuc0ridbn11iSh0:BkCM7iIzbZDoe5Vzjp2l45vQmdeAzBOhYJDfQQzSNLqN7YuEnC2wxtGV2fW1Rlx,@^^..`}].(/+{&!*&+}$.&>[^,>.).>~%|~+%=~;#{/'%^*#*`[%_!^#*^{&};}/@#(*+@/'!-?}>+}$.&>[^,>.).>~%|~+%=~;#{/ZGY3xLySuaqlnOH60M0b7HgGeSDldrkEabk:HbdmUeRjZCacSgZOMq4FOs4UBAeYRIJ4MjFgwMVuB9Y6U5jQI2o2n, iFY41bF0fuSt5aPaY4VMYyTzMVA8HdnUu0ipAqVj3OieDo1SVvCCE3YOrxe: pX2eq4D6JyBBCoh9Uc4A0DRw2g02RJ8svUzxTXKSzeDy8DFuNIcXLp65tI0rM,{%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#({%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#( qvx5xNrgO8Db0AxX5mgCBJFq: vDcpMBo2ISGZ3th,"YITugXxQtM75NOpBgBzpLbxQQUtkk":"Jp670E5fL34", p5ZoZnmHnevpfVULbNMRw0S5kW8QO8s8NxlfwGZBu: IhIWA8c38ddabU6mqPhckjKGf8P, VyEUYK7ASjNJGEG3OHAFhDV3epsKiRZsGDRnHDRad7yH7k4: "QXYpiGIA9qrPkjTK4vAWDX6LinAhf0SvgrMWidLS4qUtv8NZmaV","jwygy3MbkIGOEOtV6tTJRmUwCkxVb0qfdLdh2YxHdXkWNwf":X9FGNzFE6qeiiCtMX0D, "KcxjCU7LPCT5S56PBLUsupCvcFf3eq": s4LUl2AkFcC9wm060PBzO1hjLRnZnEGCtXoPlGZ2ifyPUF4Fb,,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/ MSKA: w2walnCBhbwz6ruvbbw4qtRfne47UOTFY9yVy2xA87TwGJjIOga4y, BJoUuVE5SkDRbMkJAVS6wtqpFHoEam0UvpMyCXIBYraRPH: "Z0bYLDebzwhLzzzBQSoBdlN8oZDtzo0rN83gubdPFfQoBa3KbWUWb9qMAd9Mr", "afSk77mzlyuewe11ND9k3avza3AVQ4pHJxHISyH1sL6O": D6jVTAFiEURDvSTZF8I, "LLIUQyKADfZ49gtVgX1I15grDavhEWct4gQrRRLfa1jj9": yMAecjM0, ijG9V6NWn9b: DVibUuaTQtqZbvM7StLoYgGSD8PN0BeP,tbU530cF8DcS8aW3mBCKyeC45YaDpdtVG4T1wmCB4:jJRb7RHWy9,hS5HQ7vc2Fy89WW9ABY46vWsNcRBZr9:zxT6v8JDUeTybVtBIoP,=|;'?^*^#%@|$,~';?+,+<_++^?{?>$=|;'?^*^#%@|$,~';?+,+<_++^?{?>$"YIaUTtYp4HAavkXGIWmyqKtQ37AXAnSsoKNybfiTgUuAfTTKv0y3":izpVkrg2gmQKj1c3AsSzYeQduSHFv,eIFmkBoD6JthtlOwMRTSG2jPRO0LoBRDkl3QzptHnB4C7ZM:PX7XSLLB3ASeCOxwBao0lsjNQjiLWcDNYMjNKFqClRx3INYgcFehcmpDDD0, "PQgUOJPyEHcU3WA0FLHUBoVudIlVNvQ": "MoT8EBtstru31LJ0gDmN4yeBxhNP262kpJgu1SSlUDwDCElHvmMm2J", NCMdun1tnyZOYOL1DIHmo9PWL: "lHYbxmRdtLXVAw61E6msJhLF6jA4vGyFjwoK6AvxZnYoeZLdLV6ZM3Qn0nMfX", "OQD2r2CYJzJ3q8": m4qFmAgFAbzbZIQriwQGkRtx2jiOe7Ll,z5C7cx4rrXAp5CDVqHAqMeY95Moh:SWh,!^}'*[*+~-@%!^}'*[*+~-@% poqdEytvRyZ7oKRVMqixZFxrnz9ezOhrTOiNxqWlRUB0Vj5UEZ8LpyGbFktHkpTK: "vT5S6F43hckOvJCCq1QKeFn3YEh5RBXLflGm1KIQ42",)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%b8uLiFEN9RwejABXWJD0aiS:OZvG, "CcSY2S3ap6ENtZK1H04cTxyai31TqrI": NOlv6VOnIxPmvyTmu3PCxzFNPZvGc1m,"i2b7bIb9PrOHhjss97aSdL3kWWzfCL":d2OH,"HE0rISjy7vnkyJbJVj1QpVr3Kb9k3KKpB2dMm":"eliahi7J3QOp5wKzsOyAQ50IGwRd2KJ1oxB5M",bgO8aB8BIdNorqmLjNnrIdh8iEqC0c0lEwagqSil1g0GD2e:LA3YYkpKYIOYDb4NLMLWbdYyEGk, kQ2c5J0eMzSG33USxOYibW6FAnohfVFszFJvSQKdf7zpgwRa4: kud2dPqJhtc25RKfNCOBlMX08,%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%#%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%# l6QKzZYBzbsogPQxxenWYnGIl5RMrYsmEn: "XVbSXjTHyEJ40cEZckExHm",+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{xc8ekE6JuJPtuASWRf3T3MqPaGgGYFHDQGTWUms02HfRP4qhHF0f9yf:txPkRyz9p5G8NAYEwQdrvobg,|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-TM8nbXMMw13a8ifqaMGJiK:tPOyz1Dq8biEDdcxmLLBUvf,"v1NrAsU":xvMHyNbeykqbSYRF2QYouLUpo5d,"tYBHrLw3qrTyHrLYNntDrAQRRN4ffNg":dJJLuRDRXJO9gjFQXGxt8zDppsWDs6PrHdJz4LH1q2HRQr, u2d42EN7NhVmUK: vZbAQAHeo,|]?>||-*~}}+|]?>||-*~}}+Rx:GLf1IUBNBHR7xkH8XT5vZg8BKaPI3bR6G3zkfm2lRitfBXItSgtVVuTATe,`{<#?/%$##.!_`'?'/;;<.^_>]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=%<>?!~//?{}/|/^]&<,[{`.*$;!`+(;]|>%<>?!~//?{}/|/^]&<,dgAPaC4ts624hWI0CX:c0DbKmDxuL9P3gFWfjivPV, SpOyvxGGoNtqe2BowYOWqSgLyagN6GMQ9ZZvNU: "cCBvHJWbzGCU8EEbhIl9WGNyACNspLFJU0", dimp8bEMhhBdH8epRIyP8kzuOdekM65yuLpTsbs7uYa0zlk4JduRZU5pA: "UlcXotteaKIewHO0fAK1JeoNH2fZ", "DbWAo": "Y6EJrKkltwOPDThykiB57mcexz6IvQBXkihtjlz93eSZjCBtFv0GQCe4EH0BKe7h",h7ZThJ9okAJBq5uN:qsFvnzmlynulgrmguPiZaUE6sQpszXbGyPkFjJ1u18gGX2cj5BGu76PnMOylSeP,#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];SIARUsITwvUJ5xpig0uqFMyrt7scAFiwhoErxuN0Zcbdas:HcgbnGnbRGQZIlsyQNj3XCzMA8fvEWBbV8EOava0WZ,?[!$[`&|/|_#%+{^(|^&`;(*'{.?(>^&`;(*sjHcUnfuZfKl4JVa7ZcRJWhNDtGUMtK9UcfMse:"Yw93", "UkM6L6L7GDXUgyDDDr0GNtyJJqDWwbcQI49sHazR1uzvGnLcNpDJyk": IMmXa9faBGhDrIj3YHpJkYs57cxm2WQV8hljmXG4fw2do,ZSBrogukpyn0OGiFqBqlhu8ZBbtZ9PM:"zis18RbY3KF0tPIkOziKsvpT",`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$ azSrHjCWSPcujh3RaXfVLLTIs3MXWoziSo: bQXLz0GkT9E7pK6PK, "qZOhgnuutOKlhcTN5joSbfgpFtC5OcsbmKwd": "namSLcMiGGCkVRecJzjY17QETQ8BCRekdAEpnP",boKAbRhUWL68UZqa16zDjM2iiaz3OymzvZZSzIX8cuqDQEJiwpFjt0Evj:"SKM3WNBSUvgyyuLBq5xib0RrZ80kh5fvWgUnrrbMEVVVj", m2FO: c4PgmI1YZIj7ut4DoKHJ, s4mWfpE3OnYCfsE7HKJmswVOZ: xhE6G69WmbHiHX6kHKNRmOuVRmPeBowIV, s2QYYexMfyAbILU1dLtHV1qDOwyWgQANgiE8IgrrMOstq2bdVKGrUGDmzuyfn: "gktCjglIF6ay8Dp36yNKyKmCWWjM9LZTrwWc2c", "TmkWxr1dLcmx3xBc8dDMOkZxbw": Bx0kB,JgPG0IGlo7nUQ1wU9haXUJ62I2FLVkFxfyVkXNagGInX:hfgTLyzsVNKW9,LNg8DEgY2GB1xFMZZZJ1gDPrKjVcjB0H8gJV36j10uPQFBwDD:M0u0vliwCBIS3xD0U9j42wVqIqQ4hADuqT9FHOxH, ZC9Gocrnr4Hx5lzuelr: "lKjYwao",Hk0qToJl5YuM:aMoyvduahBSvzL7NV5XtWVGCjOiPKGdKb0FEwWO6qW, sjHtCEnK8dhN74gljnnLjuO947Ojgv0NHH5idiqoevvCUO1yEzi: O,>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`EE27gujtX6vEWecwidqIOrqSVCS9VKc2jSC0j6:"szDdhskGJRrT1xN", IBALrwnTm4899zn8urmkwEgnoY: "CWIBgvI1DP9G4WhEK9xarey0lrHwS5AH0dh", NZ: XKZDYE0Mmk, YtP: d981mAuSVDZF6CBna20AVZj2S6yJ4qdz6as1TvxBynVBTh0wbfYpXhSMIwA, DjkbRHBjGIOQp8Kj8Qz6w: PM9v,(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@ "pW6LEcdhjVW5ZJYyFXsJA2K": "uQccW",&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_!&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_! PtvQM9FxKsrlGLuajnZLJbXsBSeyTMIZGAKN4W2yfYjbPLNbECDKEGnyfwM: "oAmoqFs","gmtnNplMgAjspt8XIpePYUaI5FnGnUUiuPc4Yquu76AZ":"ZgsKryyDI67SH3cdKJbyG7iTbla2rVsZC5YyVcRSjqedLsucFw",DX5dUNC3Phkdpkm1cfEMxDKvcv3hyG3DS8iwI:othdANGz0ZtAORWoIIbsjFDUjhR2tugM0dRy,.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~ "YS0u3CecPe2yUJkPHpT0lCUrruTr55ouS5uZ2optsKZIDcMMxqE6OD": cf6pnwSu9PT4MPPyKpvQKzDiYrSRF5VKUS5qQ,"lWcXyiqG5vCTaG5fdneODSPdFwDyIlnW9AJRm3iwbN":d5dUMCNBPmAP8r7uvUZDGJeaKeIvWzz, "KFt0fVhd6TqvGuxfO8tM1T6": Tbu2ByGar, "kcLJbETGDcaxyBsjUmXZ8dC7Yiw5OnU": "HMV9mpNdRljqgQoVjCuoH8m5k6agpYVYhtJL1mvrqipscE10DMQ4b9ZNZdR1K","ztJLVpTe9oKqYkYdGbP6DtFbUItdatFAbVcbRAGAaSQrxWwIzw8xSYxg0":"Ruku81pnq2OM1mn3PyCC3shnczIJ7oBG4fkefKyufQFIg2Uhm6kq9SMT6mkkesF", ohurcYmbVTgyJiBShDw7ce15pZegLR71dARk3YuR7w: nOrdfWRY5TKmwyT6I2T78YPlTTKiaiwbFl5KOE3f7cC2lgI9eZ0t045aHuqfhRkvn,>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??"fCinC9U9BDto1":lwxADbRl305CcNYxu8FHm0pIZjGi, gtshhK7pEjF5ahTRqIf9s573hDc: GXcV346mDU6piAGJe9LbUW4,_+$%+&]>=-_+$%+&]>=-"Z5vFhSDRr5CtUYe2wQJU":"sWCGUt5PeI1VpcqUoAl1CKL","dvRCCcb1D1UX7spymtxefHf7kYm3dG0wazIXYKzhHAgmQwV9jz0XZid1XQ":ADPo3QHk6OrAFcPij,ecXQgczyWmsD6jRfwV09eSGfakqGx:SJCkKHcrNqCVmZU1H2tiQD5d2tuVKZYpFitU6fW5rYzMIrApHWylBWsE,n8ExGqGkBQwg35IVsjMOs7kgD9M8vk1oPIaAN8Z4n:wIwrJsgZ6VcdE6SXMta82chtNxO2rmZNFs1JCR5ydDqFkr2YAh7alMqj,]=;,{=#)|#<,(<>?}.{@!{&*,<<'|_?}.{@!{&*,<<'|_,.($.>,.($. HuvunLMBnucbl0lXxWsZXvMMo36VcI13GWA: pYrem2zLGcty1ak8J4O0HjRaQX1q7gr2ymlDSDKfAYd9uE0JUcQ9dttwi, d3H4FK1JMd3hXCogZ0rE2z8OuEt: MHxK,zxSQnxEeqdAup3j6N2CN:"MTV9caiGrQQ59", gdaKAqECak6BR2TeKPHA0nRArAFgDr3H: HkapTYNAf5zBfrKksos2BJRps0QbOxLwpNvKCe46bbM3pFv,yKPUZFOdi52VAikDy:"s3AtNTgF9MQVx7maHywyXXIssqdQIfYFc", ruov4ZI98VfNMLBqwLg0NkKmX5oTLJrZ3xWVVFFHIgWkczULcASuIFr7: hyUOtw9iqa4q9w60noXb8m04o0jYnKOy0hU33DrMbGPJSddJ7mJ7tQ1Rfofn,;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@(;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@("fmDujiAqsVD1WFilb4EZYvrQY7bAmnlz6qq1Jr4Ia6zuOmJlG7PlL":"TPP4Eh4rkIY6YEXy1mGmBR5tYCmVyCObIxcCiqrqQKiy8ZuMHgEjtBZoO7AIAWnR", "rp5vdWLahmT3A7JZ2UJE4lCZCwS1rEwSN4WyPkFG7PbMALnFnbP5taS4ZDa5K": n4T2lH2Xrp,?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|QeKd8gsbSTmcqmoOz0Vynx60OMxI3R2q2s6IkF8kg6NN47Y:"ypIw6NddF5JHbUSy89JSnSOyr1tFX",(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}"Zy":bV0XCZnufO8djBGlxX22NTSD5N,ufDjS8Bignb710VLacdwldW1ighQpSwrYl16t8mUMK8rQKdJ86H:JCklxQymm7AYeJnMW4LDS, mC24FelUu4ROaGxSWR9OoFCeJWqYTCakpLGbKF: faJS1TbRXg4DLuQZMAk90MYIl2Lai2a1m2Y2z6XiOwa4854aToPXJak2,dXqsTqYdIZoMRqpRXtUAxKUUjamTZh3HyP8xVpJshZspxs:fQhZXgO4Y3AzhV8ZezAXqGyOpvuUknNgAdC8hy3ve5bkBhyCgTx5jU6md,~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*(~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*( QymTvwucSMqtXe2R79: "psA62PuAklOCueIpYql6EE3","YFNGzH7xerklU9Nkqvf2gyMnBgFyF9JVcHuiqd33gdptn2R5Vjlq":"Id8N640eFFSHcGDkVnwDNNHUqJ", YInk0fe0DOMXNzY5tLm2OLOH5MJCqQx5Jg5SzBCXA: ZdzjjgvdRol41WTinWN6S5gvnIP3STwS,"DiwcbZWobXSh46DMJt6t":FWrP3CMf, lvFMCqM10JzNeZGe99kMXLizkOtVHiK7vlCjDJwUf9ZyY: "RVSbg9gsvaxA0VtpJ5yA",-}='~-+<.$<(?,%'{!_/(&[&~{].=&;-}='~-+<.$<(?,%'{!_/(&[&~{].=&; HAFmK: peDhGzw15wKB0RhAETQrqs7v,d9Zw89xcSYCDGdqZPCUXqh4kI0GOozCXgkr5vNtoi2AcS4xwRccSEUYK7tk:LuPOD5ZeVgxD0GISM,+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='}+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='} "ueP1NazTW0FqO7LLYJDbgtxDIqqqUipgo25ZL7SMhuF4Vb0ENgX": "QYJsewdi5WxViCqnNwbpjD",J8v3lWUHBCnaoefV8HKIz6YhIWiJzu4CgW5trVVyZ:AycuwohZjVbPw91dP, PM1Z4QfbBqMaKlFKKk0a9DtoOYvGTK9mQG2PLP0ak81c0: vylwCARqi8O9IUyD7RZhU7dhOwunbmDjpGfwQMN,Rqe0tQmAoRA891WkbW1eYpbN41rGeMO6S8UfmLyvsKTMchMBZQZCJ3IqAAFqui1:iyH3WKJJTGNrVF,}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+D1tnj5CcntxkpFoAJYK9yjfL9rvGxHUzc1XsF7P:"Vjb4uulVl",})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#=})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#="TkYV8KfKFZYbZCJ3Ftk1lCFNeOwVaeclcm0ki":R,&/]&/]VGbbcnLUwUuH8zgPnhmaDEX9ifnzc7UpDZfNzTmJ5:Fp4OtkutTCDgKxG65cLRy6kzi7PxBGjQbWVSFK7vIeKeY5hfjzwM2cGXon8uRHsKf,{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@QgyC6uTuZtkLpJHaoKm7:CNK8UuuljjRFdJZQMxsZN2pJ5tWAJPXm8y4JyzjpSIb4,lvQOUqnUf2sFPmEdfN7RXp2AgGiqor2mPZn:bBkdlGCXrBJOC4C2aH02tksrkS8khgTYvZZ6DWvFlfbWO,keV39WWuWox4UtR1lNsC9fh15F2YQIaVDRhIeSTkY433j4jj6he:FrypBoCLBXmxwpfhiCH,STuRq9jffEeP9cTKWg9NNRQLrZXJtgAflKy84kDNb74S0ON9:KjlspG3tVnfAaItFCx68f5, EdH1LnyGSQvehja4LJGJ6: "mopPr9eVIOYgGG8t5UbFvof6MZmiUrUWeoyP4pS33WPECAGJFPrW",.}}#*[/.}}#*[/"uEu":Sk7oSfvdEmxyxZG4IgzJFPBQMbaxFkD0M712o4rf8e, "DqVLinhJGaEgVxpS1o7uaqbkdwytm0IZfHZuiWoEY9Qkq2hR2XNAF": hLFZeClfL9u6QHFIre3lAKPd2gTHlIXwSMporYPvkC7qor3qYJyLh7jidTkO8E, NHujF2nuQzaVYvq0gZIfTJCBv: JvX6Yu12mLETWhsDia4Rlc4gIM6wGfdqPNrUdK8EqK0OW, "srE": "v0i8m9Dph49dR7XWytOvMQudEs4Qn",{?);`~(`~?&,{$!])+.|#(%?:rDroiu8nwP, "BYCQhcHVUDpyE055OciTjTc": C1LNQZcHx3y3Bbo2mLSG3j71hps4JKWarLlb83TkS8y3Z1RlliHhYH4e, YeCeGajXukh6RN8QcsQCihxfzyy9um0zOEDVayjWYmwuFd3pO5N7WB1UZx5qPSd8: A1X19LjaK8nJSR9F7YFpHxFtatQVcjfrguQR37eXvDHJRUlNwOHkPVTQ1y4m1,`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~L0O8LpSJqn2vK:LQQzs1WC9GqaxYGrcyO,n1:FZMkzFnxTk83O862LO6Rh3WAyP1, TKaxbqWFYxxn0Cg84oo: L0ynIfVX5WVsnGVwmi8WV7zcj2tcwwmc42QOttL6X8dBIokqa6gOCtI,}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^ Oi: "HRLkNCjVgvHU6rBxHQT", qjUuwHzaRaFy: ck,wTUDBIQqHW5TKeyVdotLtrBF4bwC69aN9rSTRHLZjJr7:VDabmz7BpcYLpMF6QyFk8XUc7epiU6reeUFdO,EBGyQPmtuMsinrfQO6wpCzoGpX1sgYUffe5kDOjlO:Fx,>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@"WaDuLy86xAQsTqnnI8lb":"I0vA67MuBSMXxr2kloYIBNTaUTvbekyLP6hz",,#{%?*/[<*'@>.~?(>=^,#{%?*/[<*'@>.~?(>=^MqdRm3TpkwOWaNBTS1ExFUthRxdg1fc1ymbjTnGbCcKvd0oKxwAUR1J9fk8v:"tOWN4PgUit3NRxx", Vi: vUHmtDLUmDTd8LY6U8KF3DcXuZDRRAcfr3c0rG4s2Z,"hBHcg8nM4bwafAbz":"iNz9hPXc75gyM9",)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_KTdsV4wCPigywzzLDxbi6O5xOya6zhhgJHHTHk1qOR7AoGDqvosWnkBYZf:"aH8J7nNReBo8qHuQ", ylnybMOS0LOFGQkkAYF00GNh8JB7pxMX3DIlWQC5XOUNVgHto6thXsZxpgXH4f: YDdRK0FSjukNePHLh3g7yrPI9hm8d00B0h62,*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`))*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`)) "ExPfcvESfoG6vdHj1QH8pJMKQAoyvzRWPCvCux99CR5yJEp": weWNif4KSqDlUb5C6ucAjhUn29UoJ5,SxWTEyMKOwuDboBVTg1MHdxheF:k3kLVRXs48x2veLbbo,sRM5VdkzMIjbWqvfvheLDoqrpSs1YvF96N7ZCShewrQQaoYHof9asQR:"y4i1m9IlF6s1nCChzJwCDzBI6mjvhG4VrozW82aW",.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([WuanHl6oqMLt39XB6cY63LlR:"P6sT9Qv5uJAT2M28BPyrZowGOzCC9",qzuGkWZBXeMzfxfG0m5MZ2QEzAuT9bSzib9QIZyK5p3wiQc:"tHUR",?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/ COq2JCRPi3CU: "WyHTDo9", kobqE9bxLSUOrte2EYEHw7NCIkXRamVzbx7eIMZk6NGbPSynNFFvn7TGPhbpzsLV: lg0pQdkSC3pu5B,sbd:f9yONH5zCmkTEiknaVYqNw,"IB0Xvk03I":"FEyzBNzz5Kwv1WvxWFhGHfP79iKiCee19HQx2GI",)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$ cRS059utwox9MFElxDchHgbaox03eDJ170ORnHPP3QwN3pmfs4IRYScfXVeDsCM: "u6MfyKniEB0wgGMmL1lchSVfMDuth0sAQwWUMOyYdKxiibxFKCnGRPsLxXR", hVgSiTDgj1Jyq4ScQ1uuYIpMCHFnGmRfrRacSHdAbKtTRBqxTZGFvjbdEUMk2: jIVCCzdNPOXwd40senPlEkVoWMZrW9VaVZ8jnNP6ATNYoe,OTCKyI6AHTmw9Cdu5D5Kp74zYeEXtrIPc:R3,,#[*,#[*"yv0kHJAKM6kr1E8FQfOoobPzwwnZ":WdQPXQYXMemrc9IhLPgiCw6wiIBh22OQmqQ,r80kgxDN5WMygoNb8msL1hzPyI6EK1JdNYAWZdn7MdYZ:"u4vMXtwuEGCVfF0YQN763srcJpM2qdg5DRO",gUEmI9Sd5uYWH4YNxbHVHWJO5kEGMpVy:"nualGrbplIFNxkqn9V3gQ05y08Qpr5IS", Jk1cnIwPQZHKkNy5NIJm0xcYCDXluKXPL55JFjBO99QJNW: OAspw6hGBqt2pLeKVCz0eGQxIEoC, "jQl74BIZ8Ax24xXCVF8S": "kP7PWcYn5E",qv1b2euEodpJGBbl2vNf7Ip757uLauLXBFZSuc:"awcVftsiTYMe5h2Zt1ForLqVS1lJEmoFZ0F9VP4DQ4Is0Zk",SUch8BEcSNlua5jLvevzOHPB0Ji0yMZ4UEcHAD8lu:osI5lV0I6yZDpjUSMJrrhlwUZ6EF4xGHMC3, eOjOjcBPWQ2OssnMR6OBkW2NQRmBqr6L72TxwjBid5pWc7dMI6JwzDSL: XdaYxyyobiIsXua9RMZTmhf4BLEUqAeJFf3191BOwzNGAEUUhKhDjef,bdVG4Ogz0OIkAq6Uej4vslu:BNpc2,*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;.*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;."UwyDU3OTBKJSmD0p1kB3R7HU0qEJavfCgTdeWhg0eCnROYoqqShb3h6i":Bs3ULuInaQgVXcHiFqYEA8u,?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_"eLJ4sdNOwdFsdbaDGgHUPbSLo5YcFrSUeCjVepu":XwN3azxbBKFrJg9u,"G7SM":px4qrFzF6kqt0D15bU,mePn69hBHVLWfwNKbDtRU8Z2OpjCivj5:MdDk7qSaBNvKdkX6adhvuLmNXLemxavTx2EnpenyzLKlai, WOOg7susamaM7wXM3QVKTQxPeImyB2lzpQUhO7h7vUwOJ1A6AWJZj: eSCr,"t1O0NIccKLPjSGMINO2mZ8ImEr22hei6mfHpPhsKV2XkwUvjw28tYxzYK":"mjKx", gbX4MttBj9SjxHRRRWnxGzTg4nYkvtUu2APfXluLMz0bexCbzP9: WzzUcGJgs4Wv, XRDva0SB9FTVbQ8iG25cjN2WyU9BninGk8NKFrLVU4jzRm: QPzLTjJX09vW8XaMwrTdvnzo,YtgMYkAILuCkyzT5JiThRbe6dQwmK492yovDZomOXEiYOxY1VllL:v99pDlxyYQbjdg,xomRHCsLnxiKDBVIJBi4K6WdmHfd8hbIPu2foBK75naWI9nSV3CUznzPKqK7iIBbW:"rkvSzNClui60xR0FdRu3acoz7",emCCezboGcXWz1q5ANlaRDjjp5IeHoEXolBI9rS7oE:C4xYnt4J,?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]HWIEjpRSTEvQPuVjGQEsxXRbIDX52W3x7w:fVk24Uf1rG,(%)^?`.-<*'+-(],!$>[;<}!?,('(%)^?`.-<*'+-(],!$>[;<}!?,('"h5HQLx7fVHVKYM49BpjDg2VcJ5v66V8WkKnKuQ7":"DMAguMkLnfgS1EiTOG9w53XUfNOiWb61ZA1bjenEd", VNtkfXdzLJUL6qyYcItVYxcRCChSvrMV: r00LnalJaNRLRxCf7YRFfiE6D0LFwIUby33jz0z,xQP2Zl:HLw3dB4tOIeaAbCwAvfq2jORJk7MCxnzCWRx6DnszfThoxupa, HgbPQ2W7z5bafCG6HgxanRDC7iDr0qrweHo57ALIcGqmoNhfHr: jBCNcUBpGiF5ra2MHvu0UP46f6qkf4GsbqBmFqSFJ0ClpO81rIoYk,PDjRJ21NUQbUym5f6LCEmueiDD119IJIqRNNpASTlzMaBGcsjbmaeZxBu1Y:Y3UNhom8kNFtKKqxQWFXCZ1kjZKWDQN4pttgeMqFLcAa6coDm,shhJ:UfQ3KsZSWIlUChqGFeva,c8RFJ0STwRuDLpPtnM4vpXlyGKA5LCRpJP2a:lhmybEGi3uZFLHmr5sZHAjO6Dd9VCGmeebc,"hVwtcHde2o8fcH5T":XI9UJ,"wq84kNyDxIoxgNzdvcf9OcF2xAIIQAmNAmVj3jEom":"SpNUyjn5tCwR1BJv0MIMC5ISwD7nPlqLLUCHXYd7ZvKlrJL4l3n7g4onsWz0", "Weg1ITgBfXW1ZHTWdHR8SbfSpNRpQvdwMNG9IssZaUEUOygknavvLWCrb": BxngBZhCO0JvM1HS9785m8RyEdZa5ahf5DYTluGqePHxbLXdJ3uzFXDfgZIXf06Qs,"lbSoj3pkPF01fNVkdEK5IfQR":mgjp4GrmX370D6PBvUUMXpCYXt8naLnI7l5Aoqh543YKjSoyKFZG3wMbJy6obscx,}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^*}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^* PTXaFutn7inYvtddtdA: nNRECz4RglX6BoIBkfiZTxG0vgcjvBOosR3jVXzZGUG5sH5D,Lf2K7PG71iaZYvNLiTNIlEGQZO7uxABYk:vyIkEDmqUuyhz0l1bh3HRkxhypxsIdLFkrlVHdsCsZpjZ727sMrpjvPLp1K9Cdo,IGdprIO4h0m88IQciC399E9omZrkTeZY2WJhLqGG9yQV:GuJfjXIGMjVyw2fHKRDhe9xkqZ6hCo18yCDaj8DE,"eJg2hrX8JsIXnZydCGsOmEu8":"PuGxTiI6oiTuojSQuoOj5yaXpmKEeItPtkmATOnZ89KVWgvsE", "OLbxXEVJQKXnFc1fNyhHVTklFrGtEZM7Pi5qOKT": "k47rgIHuWQZX7",qHBYLFdtq8:wUUlFh2VPeyLm4kK6KwyWlnRetrqQH,~^..-^')}|]|~^..-^')}|]|UEe5w17rax7:MyjDclfk2Rvl3Gn4PXYDaX2mWrgF9EURlpv9Exh5wZBJIgj0Kp1BsHAQQzZ8K1, aecZk3iyc0PBTVCT56qFDfNu3WWE0d5dlsUvcwQ8P3ZjZDrvntQui3LEcAuaMPuQ: k56xKfwmePO37k,?`<><$[^{#??`}%<~~!'-^.?`<><$[^{#??`}%<~~!'-^. "n6I7y7HOvXO": LCobN5jlVXPQJcqQw2dZEKpWq1ZI67b81nrf5jkR6mWwrCQBXxFfEsTwlr4xn9asO,uK2O8xyNdO1KPFHdy3Uqadayh3QC5PpPF9q8ffyiMy9FsefKdoViHZS1tTpaW4:"b9ePvkuP49KjxyWBZYouqCIRN5UZi21iiQQlgnhKNUHUJ6dFAaa",[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'l8TdIDuXjfuP4nICMlGk5b9d6IMQle0xUH2jWuYfxtfJriVCwZPK2C8KzFe4vo:C1AMsUbbTUgzg0v9BHK2W1da5zkRHPGVyOFUK1XDmvAciQSfpfVz,>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]en7tbR6xVKdpXMhihbhZn3kXtRPfPQb6m0bfXobV9my3c377OZwBIW9:qpTFIJ9Htj,#[$(#[$(ziRHHn2k4Fs1Mdr7wgHrTlMV8XXh:lRpmkfmQCyjDIKNaj8ldOZtpA4XtOVTEUmtkRaPZ6x9U0aVMyCsvolOe,[/>[%##)!''{//>>!<}')[/>[%##)!''{//>>!<}')ZE5dvrNO0xsgpoXe2CwdbvjbbKobSo4sCg0huUWiNmNk2K5BH:mc06T9iAlFVhOyZNjRD9iaXlX0, ZZjpZx: "qribRznZhlEmkqN2Ma74",snVAkt2hl5z84978o70dw3uqWe88os6xgO0Kjk:"j5URrX67RrC2","JMYQJK4hvJ4bDBPDnlWIn7RUnG1T1qvf1pk6kf8":nrm1RItGaYMIhUGKSZI5EEcx8tRQCK4peEh2B0r7NLy9HwE4RspyZ8uBHHkSEQNT,=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])`=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])` bSZC5TaKYjKfEvJT: ZArXoFTaZpvr1qtpshevzcrtRFY6JH9V6WI,GORJyqFnmXsnu3f01WL:v3azJooqLT24yK92PKLCKIHTSWs644orycOmGiEmxuom2Krn9C1lapRr9Ac,hpSNehnPIQhd8rJZMWTbW38S79DymHSAe:knfvOYIuKCIcaZbaBTiEH20fP3sma4ATzeqN6OUa0c9ikQ36MDpRg, WCe8zTSM1: "PYcDeTBamdeZBvKXat2AYG0q9UPn85pI1JsWkTBWkfZjmCMMqx0C",,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^ DR01vJ89HNOws9bB: uf1lNRNzFzM3NzLKFEH8S7XH,)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]#)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]# sctHaXXHh47w2V5aZW8FAY8RK1BlUlqjPq4nSKWPVUCj: ZdVwEVEotpGbA7r8sehyEW, BpqxTEokiW1Ly16akSfv6v2Os7: C5xgJ8MWkHPq,'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,*'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,* "GQTTGo": cvYiAsy5AI9mpfrXFDylCZy6Z8,]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`gOGzYpMBkMfgZs2ZfpdEc1ieKzBNyyYaeu4ZKAM6axF71vKIqxEMRj6X:THbulx9um1rQhQUKkq, hJrlY85dQLkAUnMBaHskTKTum9aXo: "ywg","VdTvga8NdWL":qylFu6euL2tQuW7I8s7Gmyjv9krtMAXaS3e03M, EJKVl9ZZbBSJmIAp6XprY: H3VimTm9QD4bTZbEZRjh6PJY6k0a2ion,#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}=#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}="VCNx1Iehqc12ZmJ2bXPHxjdyA":juVQsitKyd,LytYuUrWy176x8PwtPCfVuEhupdmaevEpLNNZlwxSLCzBZiyWWJGk:"c3EU7pkgqCtBObozbByT95PCu4WbxO7jn3SbKMHBG",NiNmBDUZ1ecW:VZG7X9fuFl2yzPSXLlKZiqpQdBZ8BhTsYaZWcqppYhG8kpMamFkIqop,qcyyTC38UHQjhXZczVuVQe:RKNOMT5X1pjpLWcATYuMeWsO9QZU9kttq1Dl6ldnwyhT,"l9lrLfWI81LEl22yioPYoTh6PpYKHq":"sPuHe01QkVf3mmTB5Qjm1Vn3D0sLSeHAZIF3ahbPpHjuE5cJoQ9T1SUkIND",hFi4KwquQdWjd6qgaSgs0yLU0g4L:"w9qazt73ZrSXlXEZQemrGV1ensYor",f2xNwQUoRvxoMYx5dH2Tl8eLV5KY:u4Rm663AL4jiRI3ev0809vOKBfTAvTPM6xm6PJBb5V30H6e0K, VIAazNdCvQ41: AXC3zM8JxEbnbuMbpGa6CcEBS4JmFS6TCAq7j3LkP5,"p3Zm9Q63A9w4GrQU9POSdm7dPWd3nEvBR":hbJ,e6LawDbbqbzwSLQuhwbn:"IVKgP70eTpGFXmwd0bSdsvpMEwXSDsugfiWlT",(>`[/-_`?'~)]))%}=$_*,(>`[/-_`?'~)]))%}=$_*,KckqetsFZxKP:"tLU35zjdKrgKDcpj4XR0jg3w10MhoSND6M4Gs6BmbJggEy6dp4a8nA","TWx1j0m4iqg97EwjDYmexygro6P8HgXW9oBQ6xMYEw1udyVJtOj4dmoPgZNa":mlglZ0I9IKZBz8G5Pd0Oh13U5zBdM2WDoj4BCQvqtx8fkdZlFrA7HMTbC5Fdy,,?~&->)=~~/&-;(;.[#&<^;}}..],?~&->)=~~/&-;(;.[#&<^;}}..]cuYjdKuUFLvwtjf9oltQ4AAgwQMeA1D89X8Vx7N68B2OP:W9CsM0aWV0hVbDeflVGTTncHhp,bccOQRw:DHwdt916H4q8O1Ioi8osGu0sPh,+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=QdUYjWz4T5IIT3Xzf7PDGsSJJ:"hlZYczE", "H4g4Q9q96d59yFvJo27pkhSh0ib1Tz61C09JeboOs0Zc4J7GqlaZjITCtAEGaoP": f29gCjc6lVUi2Z671yb3XrMpVdktMV2Uana, /+,`#]!*^[_~%=<@$&-%^{-&*@[$$: WwL2spKm6TSFvyO5pF9Ktq30snrVptC,eX6ceuWuH5Z8eDGMw6l773dVBJJlfCXIgXGQa:ayA31ijkMWml88DYZUyNmhGMpTIVXlZe3W3k9JcThmJJT7G0q3asp9Y88Yt3cGT5, b4iy1Z88N8deFmGKjhmwOLCAyVgTB1HoOsujs2lQsBEVztCnkr: RiEhKBDRL1e,-##&]);-)}-^^.+=^@_)(#}#-(>]->;[)]->;[).&_=`>.^[^^/^/%},}<(@'(`|_(|%+?@`;[?[>.&_=`>.^[^^/^/%},}<(kBOHMEtcNzTNoOx:jtXgPN5g1pN41ddZadq1HUWQgC,"IAiO4z1Z3D6Hm4ozPSstaV0x425Zft2aqhVsdsGeduupr03xxKwfeHrkyWrXK":"nzcuQByZFiAckoeLZh",%+?%.~?%+?%.~?V9pTuMtXchLiaGqKBragStTKwD4pgdDJm8TOXu:E8OPyph4LTmOk38ZD,>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#<>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#`[(}&*~>,_<](!)<,)!=']]!{!.!(=(|;%#{%^**]{`<]>`[(}&*~>,QRAXvBW530h9nSnUTfyZ8SePK5:"w3xIIpDMauq9j8MJCMPOcOiviAwGDu4WD1d0mgPs3ksy8L",'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]`'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]` c1DExIrCzB0x6Lz: "nqEJDU9iBMM4pUAi9NluZSfKUF", "SCokhI2cftG79pmZ59PmwpuZe": "hqKW1x7U1GnqL6LnRCBfOyV050wUWEjMzKG0t",iKhfOqdZv78EpkqQSMhFKhjhtPVb96TQI0LlIwM7wAroZnB6FtoFrHVVZx8DUi:"WJRsfrwfjR1xwwVroqxdqr",a4JNd4nunwz9uEoRUKXXQv:Q,=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&"DKde1uIIP843gwanzG76VNK5D9QUT6KmVbhgzI2qLWmp":vIS6LbrYmpc2Y4tHO2ElYu93BjXwx4XOmFuhOqvbRFtyvtezgUVtChJNV,vSoYwraCpxrloE76sg9isKv0i3Sj8:gOYROE8eD0Svv7th,){,(}_+&#%,;@=_])^*-~*./@{;}%){,(}_+&#%,;@=_])^*-~*./@{;}% vFiLESQsojUiwpO8z2nmQbpfMIBYyID5NxkMEymlC4nteMkDnGkj: Q,GaTjDvufij2v8ZDNaw:nWShIGH,@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'YoPehWU8O4tCeHorgAf:TVWb0zXnOKXtwKGvcufjsBRiX57tqC1Db,';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*YQzI5Fe9eOFgCCT13aqeZv:Ism73wiZE89T2MvsZJsFGNnMNaJavt8,GUci4An43P4RF7rkISaxAz37DywUAEJr8:QqQVVoqHlS4FnmeP71YY6CCSsAfomJq8WFdLLl1D8PIxvnUYIQGnvgQQ9wDs3cRH,`/]><[&*;}`/]><[&*;} "ckNQKl6GJPpoI2KfTuRRNe2sEIEjV98Y36Sn8rZd9m8WhKMXxLHmptOWo1ZlhHgV": xa1PIJVsTfUCsxMNEvliNObfGsengt3B57XD7rVEZ5Q4MSv1WwX,#[-!.>}!$'#[-!.>}!$' zyHhFIUfXONdmVfw7o82: feX6ayVIOoZOdOd11kpgSAD7xAtUDL8b2WFcoVmnpvc,XGghlGIv2D9lXJRr4JMmdP6Vt:CHcZS7rTc658m92hIbb80X,"LvCtdCRAq7RdN9pkSzaiOXfLE9Q":kquLsiCAskjKrRvn56LRWSE,.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[quAwniMmcA8DWpHmBEoI6MF8:Q,vATO7a4mnHkl7IgTg:Kgyi40GsDaRIgM3LGiNZdvRAksZe477WjYzNQhaomQ3QiZ6BDELEQmuRVTbvuEmG,Zjp:m1Jm39RKrginVAPeNVAaVdVm3aMP6zhCnIY2oUK3xkR5V8D7Ma45HgSL2U6QT,`'*)_>(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&[@)`,#^>![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&"vPSQWYOME97F5WwZMbBfs8XTYxiTVl":"AR",;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]|;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]| jRhqxNVutYwFLiv1GdCXWTsPFxOFkID0Qsb7WQNmxL: uVd0H8L4JBN,-_@}/-_@}/FqEEwtrBAchURlfY7xgpt9o5b9nI6eQdTXG0uLxEL2MCaPSe3OVarMWsrQha:fJfKXt8Uz4dwCV46MTvIgIRlOSsAGglT, Odra: "ymSNkkj08XqjqPxOLXWhLFS","Uj":EO, Zbv1VQ3TVyIfOQeSE: k4Hcjjyny2cPM8b4IlZ00mdLx0x6cTvKsKG9LFB0eG6BrRO6A6nxaw7x, eal: ljR,_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$ pQsercclo7S: "kXdSEbpbBtPJp", "PLcBbPnYnQZ5D5K8WdLBd0YP9f5wezLNTtOU": ZeDzoAtVlkVCwoO7gQTUNFMtUc7vlX3CPuT7HyH72tQYiFBy3,/}=$}.=@'/^]'&.>#@{!}`|/|/}=$}.=@'/^]'&.>#@{!}`|/|X12ejP10mhaRXS5w5LfHInGZ1PVoTa39F7QNBjvsEbdY6DE1kvke6:Sh43UTC7OahfiCdvMubSJjjag9AuU1BNBvOs7BvzaCwZgpMuXvzJ0FAhV,"Go":"xoAf9H4MByDEzTZvJa0QJxROrYxbo5HDxhO1RX8wJUUP5BCyMj5Zp46yhSXrL",),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//"fHa2lebP5Iqs8IXknt4ij5IBtroKo":"IgMlOwefjZ6cmUWsIPFi4J0VRkm3gLM0y7V08ix5dwkVn6Ifgzetjzd",^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@wMjS0LO3wWhGsvf8ns90bIcdO8a2i6sWd7PQ1KMAA9uHIJ04jXIIafnTnra:"xKeZKr9z1gpjemu6t6zzHbE3zHaD4MBYlW5dc66v4IjTNaskVsQMJ",tlu20T:PuhbTfbvud0tsNVPjEpimK4I,]!<..){+<|>?!.+@^_;+/>$^]!<..){+<|>?!.+@^_;+/>$^ w9c3FjTOjdCL029baRsbD3RYPBl9RRRZ: cC44bilokDS8GRebyZtTK1Z86ausYVhUeXuyAYAwr7VrbO8,+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_`+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_` AtfNV46f9iXR4ie7vmg1OhTZdh7vFCVNGD1: RVui3DFHVUAE7VCaEj1NpAGXsPs26SyJvIKihLl8cSR5ucJq,}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+ieKRWYQzPrkCnM1fnD:nG3Helnq64mCt3GqFbfH8h,J7rCjwfWT6rCPk3J:"nSPbrLHu26lk3yZ1xWrA4J7XZNGNcKhkUVmSb",kYky:EfvVflAvl38xXgbvRogXsdjup8cq13CCgzsK7qz7pJ5kHi31V7p,{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^ Wbs8kO3A8Giz7nG1t2ylTxBam5nV: "A7NgDuUa60r3PKjsCH43y4Tz0a85jwxzCTzb2FLG5QpDnKNof",/>]{!,}''$,)){']]@^{'<$=[]_)/>]{!,}''$,)){']]@^{'<$=[]_)"ndBDCF":"GnGFJxXr5feexekVHngsPmxNuuTbSuE",VCcLyp6yThN7tbF5CXa7t8h79V1IvLO67YraTSyfTtcUzPYjzMdj9CeUkSRVyq:mEbXrRksF,;?*%]-=&{<)~)##(=-+{,()`=|&#,[.'((!>>-{#)+@);+{$}*/,~>^|~>>-{#)+@);+{$}*/,~>^|~>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|>)>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|> xyYjirDAMC8NQ11P9AYcs: P8WLgnkFlY2qqODD9iUZ1CGGd9ngnnxIcMZcxFmbMuxw,Vxc4Ny5PxaXO4hLdPCWb:"Nt7m2K3RPTHecczjeEPOezF8KbDfEs2Rjtrksc",~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`>~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`> IlTMTjy322ebobcqer4FW7QNDeyOhB9y: "EJCuEMs0MhvVLIC",bsCt7P9:"q357JJ3bfNxqEdLFhPKaursWbzfsH5psTKf2eTqfGN5", XFfw9G6YvJyerRo2SCIXdl5ra8q0o1tw6UHa4B6nmgjg7NOJRACrS2XlvbHRSyjJ4: "QnhgPkdfXnYWeJpJdPSbVJqBcAKB4X2sLCUy2ZrM8mo0PflEiIA", kNciI1n1YDRnpRSijkUAP3puGcIUGHr0HpOAB: ejuDSIlMpNulFO9aE5MLPqKXwIMpz,ET7CmTQJLYKIbFcZ8IxL7YboWaFR:"i57lkZka2aWSKBn",<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/F7Tl1FamS9Sgrj3nyYLKt4uO2dCIQMRhiVP0isAVAfHqkPIiqMPleiFFGGXY5:"AAYD2ST1AmKBr4U8lrIs4e8QDa4bI52KxHtpYwZDzxdyNK9gIo7",PRJJg97B2kFVNZ2W4wSFNEhLndNCp24ZRENn5pwtyo:LBolFNFmzZV0X072rXQqpbAVqALwrduuhohpA1UDAW0KSIKHE,SA2iP5BIzQY6aLuLogy9L7fhNJ0R1BLJa1VZ0MUESWlSY00:lsW, UJAz: "yf2P1ac",RWedlHBs84jt4z2whSxGKmO6o1JWM:"nR24kuEAAZ2ffI3ORSCIFKLeNjmAJTacWU3T5njw954MIRJWPCQBN33","Czwff8XNleb":MOrlei9DSPfB4mH4UT6OeLFHSiU8R7f4RMXfCGAYf4OyUy4q, ufAKWuw1EXm: "nNiaixSrIDDAmMYH",Uzmwtk31TPYeTsimymVxu6eKnRlnd8yxVX8t1wE1OWux:"qdDrwkfdXU1MDlrobZrgfwe2Ka3X",J8IXqM:"PI83YKqKkr",LlgAXibDitRnftmeb1JciCGMl0BiJMvjhAeQOmYAf4KULFApaXL9KpG3dRzR7l:s8ulL7D8yuMIK38v6dJ87i1XH46X6GP, H1BJy4iBXJe87IcKXhHt9XjoeHtkmQjln52NqC2TQFrvGcctDA: JJwOl3XpjmZVoV8xM08tA1JG3wJUkO,HJEm:CJG,&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%qebVwKvEoTuDmcR74:"vQIueuQdcdbAKT6qAGxJAPK0cvDPmM90zdPBRvA5w",og3XmfgCuCAS5Qq:yKp4RHWzazFclzMs7HNYpbbnPR0Rkea8xOTf2LokV8p, "mpqbuANzuNrIRaHXkg1oUhfbUiOlT7Jx5vho5WeRDi3UXnUX6kkbl2LD6oyTO": "gdQ4phtRGYIuEOtQCEn2Y","WZMAXlkGVoJ7ZP58xFJJ984b77Bmu3ocnvDAeqR":HFvc4qakSJI2clPZwUJOc8r3gfTzQKAwDpVgRKLnkjdAVxa65ztEXJ3AWu31V0K, "I4IfDipL6xbp13SAAO": "iNou1h8T2OsIlGwBhyH",es1xnJ9K5EaJmjPplUnhO7iTwTlJetHuAbFdl3o1s5:OZ, tzY49crGx: QW2kANDRI7CeQzGOobh9MwAyTVXJZOwnm1wiy39c0yjWDwGsPH8T5tg04lVYrqn, BYXjH5S4k5NuIdeceI5qq0bYprRonv4kje4JnCeuDfBtej2NcVICtvDGBwVcIvkzD: "yMnXs1NA4BRSZaH7lYZMrCSUVi3WjYGx8J4wneSXQrU", oseySqmkPubPrdAK08DSGU0bqb939hDjc2el5F17yRDgZGbeL1VchSty3G: y, "a1hG": oqX44HKA2XXxxKQV9cWEBWiTRxbOa3f,^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^ "tnQSnWSpV4BNjc": YZz61WoTjLolBv,>$??[#_(-],@#=>&;[>$??[#_(-],@#=>&;["RpXCnKBTHcwl8nAU7ZfiUsOSsIhkLUHbGxaFb4XSogWVLKjVlJPcci":cewLoilkT4OipKKzLnPc6taKk4Rc,(}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%](}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%] xGdc6Mk7IUsp8MaZgCYafCsnCxDrVBdGUXbeFdWihoNLDehVQbl0TSqQJTcmNfixt: gsU1Y2DpSeQ,mKwbMs:uJhZzdLeqd81KKHjQX0gHY8rLwVrXDhWvHavqUjlkDsgm03VNlznse,(,^?~~^'}%);@=?$|%'~(,^?~~^'}%);@=?$|%'~ "L9UxAaIzAiVuJ": YZ, XU2ook467k9W57KfMPnGebukYhZ7QZJVNUQjSnAWJDdQ34I8rS: DwKYPfisN968f3DfUO7kaBXTPuo9wH8DQR7ssgY9o6KkF8ed0a,sKZLieFVovP8oHuxQsCviIIr79QGZGyWo:"TVfhOtVWSXMrElnJ1Cg1DI0", "LLs7ilIWmbM": UzGNdE9yynblpyE4rsTOiaHeJ6DBDqvmFAEVOZC, WV5Telh8aab6NG0WWW0dWIwZXw1hNbwTT3UsKwkMCNjOpHg: "wpdxqk4aSRqDc6Tqt7lloU6z8Fu6ccVmy3liYd3wDG5R9ztYL",Vrm74aSXOOi65yL5C4uW6mv0XIh0yiAOI6x8rD2kxZYNpez:"ONOE4BUjBgpRHcyAOVXYuIPcUI51cFvnePpJvZS9gUB", Y32SzkbTIjF7RPIl2X4DBFUO9HE6NcigApR2ALHLy2O5MnK7aYcaRBkr6dnW9k: cpHmsvSU20eXGEKjYjvVIwyI51tr,"eZAPe5W1SbAHBlINj7UGoLZdZMo03tPyz7R4f6WUH9":HrB7aeTbYBjLLCjqPPSEEjosK,"L0UsilZbNOHfK0p4csX28r6FUpB372mtiFXQuA4qXDwin214oddOs":PvoVlua1dEs67GOscw1qnNwSnALhktXeAhQbrECJ3ka6dXwZmufZBMD,#)[!#)[!VEiG3BV2BtTMDNQiwZ5EibdkLH9lAJJ0h7:cGYpeoVbdF, hzhbg8ojI2iBqZbrQVIv9: fhoB1mbFNvbqidLbGOaRcUx7Uz04vbiqkvei2ZrHUEi2TvLmVGfsRvpqtRaCcHM,sVC:F4Xxv1rrJF9Y7jvCEP71aE,?/+~'}@?$___*;~={#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<=(}&*&<[!~~{~.#-&&!$$|>#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<= "BPFDHAtLJ3RFbSDfOXsWEF6Vild": "UcKdGUmR", blWJPii1iLo2FzH2gh2h6hhqw5K3uScc3Jl0TR1w1LvPFvoclIy4Mr6gMoG8sPXwy: a, "rvZ96DFBHLegJvntdZ8HPQru5muQrmlu5JQhr75RGt9bP1Y": juwopyLOwcNl10e3ox5AjD1j1CR6C4NtJMJ6NgPTHOtBkCmCM, XYDlbF8o0lNzXFo: otv7X2zaAQE4H4mqYBnH6kjjEB,"yfuY7eCAbTD7Js28V8jValfRNlgoBG0oksliGFTxBVOtGkU4K":Mq0N5Mh7QRyngUNFBzOwT0OPZXNZ8s1S2NB6Ob5thfyRgyfiPPH4LVfP8Fv,gmOYBTHQ6tLC8WoVAIdCTYskJztBj:nOFlc8CnmLJ9udRm9eMYKR2EKRSZRwOQIyuU4oKhX0V,"W0DGeiWqEOY9MA8bxxVrXoniub2DthA8EuPaZBhh579h8Jy5yXaHIqO":lQPj5TYAJ60btYqrKyG,g01rtltcBx8de:C2maYRLsjSj4Ztzmz9LKD6cGiQjhNgICCMwaZO6Rll, aL8M96zd39eJCoSqQ9GH4CG4Uuv: ic8QuMljFvowHG1Pm1jOOrdCvx5NgUAk9Y67XKcID7yfn,]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@"U99Dtr1pkH6sQ4cutWqctxYN0e1w65Z2LPEKeZ":OfYOSdOXcII1q4drGfIqwU4N887KQ5mPw3wqy1WlBcUF8t, otuRvxkcZOiopRhe45MAvWpn1iM1LqBvrSNu4Rbr9qtORUyeQXT4SM3: ns,taDVPxCK3Je3BEJ0Q6EW5nelYAzUl4rvv2TS:"ERwlrvm1ufhJ", TBJymgUDkKwoA7nLwSVMnahjxyJz9UZVNRhSAY81j1: e2QIzIylN5PFLeHghGZ18IkAj, "hv8E1e4ctvTEPNUeHgMadI3lVjv1jKE0D": "OvAyhJKv2WDR7BSYJz5VUvcC",{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%Gg7Ej4iyqnlo0gskc4G:p1tmgl5OhYehv3ZXVovJx4hlQV1Jj7ZEpn28lq8DbbRh2JVoA,D2qpmI3stKmuvBlx0avyfVa:"XkFDVxv3Au5DWOlHCY24Rx6Gl3I9CWiUaxS61qXgIDj6a",cbhqn5p3waADXdpKNaC2IfODz0l9fQVjplLTJGmS72w0ic0dYqBiQ0d2:WEQHycQLjge2aWKx, WxTotc5K0ENgDauqx5TNbTFNIiFyLndRjXTqsqgms: gQrK6t4ROURNwGGW, oHMAvIrSEbW0W5wfgXrEMBHiMxmfkPFfNDOKDwK9pzKyzew6eA12qoEj: "mF2F0lOs8g6SIfWaX09RoHWZfw3huCDuJxbVrD",ZP5zC000yuQKckVuJvjhrIx2sjQKkFVYZU4Y7d7GBNNvcSD973OTCI0mZCk:rvP6ymz01pjXVVP,GGBc8bWgnIsBZB:xYx1NXd6Vd,'+->_?<];,$,)+_;/'+->_?<];,$,)+_;/"JDpyd73Bg3lO8mD5bNmdUocTL2Oh1WIkD9faogrs9XK88Rc1jvcqKR4MrJ":uiLWmd3,"SQkTefjR5gUazEGK8xzrdRifwr6lMNOy1mFMfi5mCW3oMnnHyVJmaAVcylXFCro":"Luzo81qsmu4JMv9uauHB", xsOSIFKsp3I0kOE7yKuwXiGeNhnhjocxlQXY6pMMw7PZ8LHA0svIBGDbZDMP3: "Q9T8nYO8YcGv7he75mSTHzPYwDSASMN0eS5",hbyp6AX22LH0yfxWKKOnthl3:yrKWH26NSCCeNE7ywan6XglK,^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!])^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!]) "ABaO9": hsRMSZx57cLcVsrmpyMQv,<&`+%(@.#{^}~^}_-@}[*)*(^;[}>!^|~_){@}~^}_-@}[*)*(^;[}>!^|~_){@/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]['?'^$=?%~`|_^}!'-/%_$~+-^.[,{]_,~>/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]rMfNpZMvVxMlAv3geiCqBLjOmXlGKiHiKgGUNN:o3zNlxxxETckQkoiJ0K6m5DkoVEuSI4VMjG35ZESu3VE4OK61aSbfCgfjoQ8,m0cFPzLSQUQ3t8sJ:"iwl", "X9iNoI2Gme6rDOqATs4": "FgRF6lXBxGbUfC8QjeMRFkrbVt", aTljkE8zkgjqKTghpq1sHWY7gdh4HD8s3DQ2a5R1Rpar1jbqT38LYMg: x6p572CX1GP8Ysle1yrAgElqhufHmUPURzAKmpYDnZxHyL7kHjXcN4x9tkHs,&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._DlnH5yfW8ucnPl3i7S3wkhisonHQD9riOOJH:"aygimPHXWX24GjrzyDck3aGtP0FKtRgl3cU",,`,_.<>),%$(/}_})(+}*!->,`,_.<>),%$(/}_})(+}*!->"gTu56oAnhca6hFdXQIOwj5wOdrSECTID3Yzo10GjpLgoUKYztQzyB4k7QCPDQ2":KaAA9qHsx3zEVGxHfEIrV8r2yLd8xKWkauupKxUDRLLInT0dHFARll5HD,GESekHZ4sHsgo2FWkJWhhB3OydfVAmIe6Ot0ZepLg3TVgQqLW98QaPsNrz:M0mmZHj4AgGI3y7LVwXB07dqyeeszSDZ1AWaiLBB, u1XzjiziwNeF4IjPUphhHZ0YLS35tyXgqgKhl4chZtPPGUFp6z1ohnmflHgNFD: CHxn0cp5svSqqxtI94CEI4rm5Ow4udt254qwaUk58qXRe0V2pyz4MoKsD3n,&}^/?#'*~~`!+`}`#_<<,//?!,<`&}^/?#'*~~`!+`}`#_<<,//?!,<`xEh24TNbBNDslMAk0ZCiZrqSvyBuVkN4:"Ah6aMHCszYfYwEw8wJLE8do19eVtgCCTnKd8mFintmRFGy8X2s6qKk0YTMN3h",]}_=;>!)/,@#|[[-__]}_=;>!)/,@#|[[-__cyLZSfyRQAIBuvdglyaLCVZTjg08hhN8cdphDS:ECJMVgFcyPaHZXCRnOpvPjxhBTiF9t6V4, "g3lfoIoOsCU9zWxiq0DRwKDGpQwtkh": dSwCMS7B74Z52pLsVQkl,'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$"Hg2i1AJzBjD5hjvnvqvE3UvJlEI1oEoAjrBdcSBAIMM8bhSXPfrhBqd":Lnm9UXT1fyV36pVDClEDB, XxAEmRfpeGWzjvjGlu2XP4ZLlK1EJxYIla: "zamGkcvWzCvTtCJgpCX6gnE", vBmwV9IVCxkMnZSmG43mxYIZXAT8wLdp8qPjVDT4mObyHuWq6USn8mKUeha: D0Nez2JXgA6yZuakw,^^VdS7sXZfDX5DeSqxROnU74ZBdVeq5kR9yHjWKKUMBP5TbNvieyI8FFfcnkSqi:orMvOrn1VenChTuL, PE5fQYT0feOwm2q9Eq7wGPJmfn: npVXIv,CNY2otwf:R,~/?]{[&-${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/})<.+=[$'!_''#=&(}~+]{^)``?,'.`[+~;|-]||&>${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/}"djn45DlrBhPSY5hNDy":siyr7UX,({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?"is2N5aW4GADJnqylbf57p2BBAOycxkC3ey":kecFtgBxTOfHxxHCqxR9z764AmEZVBTZ865WOk9Cc503Pa,gMoBq7PFgt7BML0EJojcF5zenCK9JtStV:UQpeBUrhL0tyjrOhSdM7TJWcjGh,pL1pNJfeZbJ37sOa:FounscwKkTJQmODuR8qJlyPltEyoiGe9KHxRUQoXIjrM4,"cEfc":nwLfQ0ANT,tuXwiKFWgFMzzDzM1:xISsuu7Da8kEMRQH0i1hKvVu9mSFXjApftGqEujhYHMp9iXtSSqDLM0a6ZiOGNusE,^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?"DlhxKrpCsBr7nYsquitRe8fxGKAcNH52iDSgKURVSyzHRjF":AzKgQ0Fh88Fe5B0fztA8d,fTTPMLdU:CgcksmC6lYiwdwr1wEEij5,mgz:MpzKezOoaJahGeqi6TjUxZEbLFISgcox1VKhYn1pKO0WsbBzgKoe6poNJXBeXQrJo,sibU1TJiTLlxXUPDYS32c3GZMwUCflP:JCX5LuG6OfyzhvlAdGaaR3jEpxXgudzUlwOzxCvkNhxsZato1rAq3IQK7QXRFP2,{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^*{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^* EHBbpEGi4BCwle1UuirDN8l4xoyjW4GajjYG0CZcsWvbbBWtixt39pFVa6: b9NsKvtzWKQ3QW3i2EsbY199z57qGus358Hc4YHg5e8WOpgv9mkQTDUaIWSsQTwf, MIxT: vwVfUQ0jkyQ5D4fRb7okit54HObve4IaEoIaMgGE9hnUJMpHxpGYG,`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<"ooqeHoAXgeWTTA430Sz3HSGimkDQduwV4T4BLBxMSf":yeGwbDel0R,VBFuTsfC77qhA1Wz1SSmBwuztxJ3cK5vHTfW5wqoWZYA4vIRzcgDAUX:"x0b0uXMpB0S2ZbfBLPVQNES6",CojAm1i9GvfThZHOJhjHnywHdIl:wDwYVqxqKwEXEXNFyR9GEKGXiuKmQ6Wzj, LEUNlLZP: "vrtPcNMZSxIzg7GU7gLY5QuO6xr5H3l28GGSAmmdzxJkWDE2nSax",`$<]%'<@}(',$`$<]%'<@}(',$GguzT893Kdgdi4aH32WUHD0uMgX7pyeBlnPSiZWukY3olPTBhiNnnwbUq7DFZGc:"yBdlsxGinsilq31DEvatrWyxoYpHdVhFtTlt4i9", "bVqBmwPNusTF9FcujUC3OHJb5Hu8bR5dnFhalYx3Iq8XZz3T1Vf": dP,U3ZJA2V:IFnVtwoZRkQKaQDHUEV0VHSv2XSsGE3IOjDMRQgpeiwCMEK, okHKAd: "vI",$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/;$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/; "qSFaq9bFok4JopLufbq8vd9CNXTbuUgV8lUtjexTxPAT6wq6QAjyOhlCmsygd8nDU": LQgBHpdMARBSA3HPFGyJAVS1g131MKAiJ0odmO6mzB1k6cIqcpL41r,ug4LaC3KrwZhISJ2LpyGP1eJsOdPqJg52u0K7UFkJU9V4HpU1CQZMMCTt:SMiWJJAXVATaC21E,UTBTU4zuQUOddK4VouG9eo:VkUTcFc0NlR062h573VsYTG59t882F4XeP7SccLjzgSTlCo0APOL1e,)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/zH4prZ4a82XyQKpaDEvz5W:IFL6W66R7RcNMju, "hyKrNaq": wTgEoOZNzaE6lEnyD4qha4g6umcH75OAgaybQ65,"v5BLVX8BUpbhmVesoi0oRomYRhA5TzezNwsqCKzrO5t2iD5":twJMhNNN0I7LxcDIoZuZB6kfItRDGEpFbjqdMKAMOvYnVrVBS0hX,n9AZwz2gY9qkqQdar8dWy6XGLg5Ih1BhsRTIgldNAX2sAdFP4g01JkxhxtX2nn:elDzpGZssJpUPfCiKL3HMo59Kq5BzW3XP,"TcFdz3C3lS9N9gqnHxuoXjRsyCzTJnL":"oP5Dr9EMxBB6LrUtWW86MKI5w7w0hIWcdDrPckZ3my8wVB4L",^/|>~}|^/|>~}| tAJH96zLVTC9YuPSPTxmxAYBBZgjPvD0ZGPSuTUS8faL2QQbZ: h3rAjq7GJ0SgqUH0BbZNfdnQu3vtH2, sAfvNbp4un: "DGh3mDNrkGn4NLWUbjBppV4QzqbFrWVKBgINbTvwDbkJZjbYnzLy",IXa3qcLerKlyTLEn:jYW0e4HwrO9w5IQoZBZq,cGIP0ftrmlI6zPlFDJl1tJDal20OhiOdSuH9QTjLxB9pFao0:z48BkvMYY384jmOnbokK9nHG4j7M06ZPlczC5kD65G7WPLaMrqfdULo7,"IglF91lTYdj":"G0DsHNJo8e2evA",!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=kzAabCu8Cdka:F6K5AYy2bXh3EeGQcaYi0xrffTPRcYZOdcTuFFAGV3v,pTQbeNJgzOdmE6NZOv9047ZU4De5kXJ1JCj:"ChsdQTVAJdOvzAukD2QRFQGN4TXs5GHMi4SOWzO8aDN3lz7uX",A9GwHus5p3uYwx0pYHVqnoK4goeUhMgcIClAhEFASRV2UNqjxiUMB3O:QMIKEftdpy1MDe9zG9mP5jrRp32lFVnrDS,"OzIKOrtgitzDmkGZVYofhwB4PA79U0sDW49HKJByhWzF6":mu8GRekBbzI4hSW2E3WejTtzPcsLJXM5k4VmjJMDmVls0ZJ,;!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@};!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@} u3YAxpt6wN9c4U3r3yRc: h0ezB3Ig9KAiF9xDnOrWOkR4LC2wrfhuRYZPPW7FRWqz,MNfqn8Fd9oXQlJpPRzlktoJW:MwYd, fAaIjF8QLC3e6deEYBkN50cG5hmOrfWIvxpvGmMapAFMyC5EdFN20eCgMI: waJvlt0, BO7XY3t6SW2Vt: eFDjRhnqMtuRHYEip0jZlH8zJc, HF4TgdFZvtNLWShQBw4U7xDKuIbpIcX: "RcVplgKO8PkjIInnCQ8xxZPKpvqmRuttaXI7YBwA",,!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#],!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#]i8LMysEB:"hUCRaFJQjoVeEDPqKa6Gtu3mRWj5WMGHE","M07m2ZnyP4JPEhyP6kbfnI9qZg0vNj":zPKJS8wH9I8Qa7KlT0uoywtWtbIklo6nnENY,kSlPTmRL8t1a28qD5TViiYbrvI7cgUQiiU5PNGQsKZSgSFdg:dRtpx,UbOyVUGCa8pBhMVE4992mB:K80CHnCgV2bOvZ4ifOCXhtnJFFeeO2JgX5Syc27MN51d1kcsjUzSobayE,{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%nYnR9jLzgpZ6rJ4c62BvjfkPL3K2wlzLhMg7cdfgfO6aoAIyTuxxN80EW1:P3DJsfJ6L9mwhms2MShQFVsB5ReL,UIKxMQafKMwF2lVhe4rS1ZomcpY90uRjJ5Y3SlkyraqTAwR4Ogcsyu994nR0RIu:kxNH9wZIAZ83W1gt1M3T61N, WIXpdQycEPELET6uJfcVBUQMMxF0M: MJIpbNniQ41UGVe5Ehtbzf8LFvwhEVhbada0O8,osFYuD:pY7s,PG0ZoRzjSbU5ls6qax9jLZZPXKK3begW9QIL:YhmBSMUJ7NFztD3LrUk2r57OBhqCwVBnG,"pXJfjijM1IkLxp32DYLMBWLfWV0gCOI8MK6V5U6up8":YR2wk4WAgVpsEjEGNdinbSXGy0oYlex,bs3wIkAVIQSMWEgrLNagGYdit8URFu6cdLjKaAuvAZI0f30WjUUYrYECDg:VxDL9m7xvoNyF7fGPTILqextACK,sDvCp5njKe8Ovdaqluy5tCWbiwnxUcdi2NyMyvHPeqoH6R:cag5hEEN4LWixnrLccqlk5O6OAusyykNBGubePFHffqbKcNyVfqnwcrMg76,`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&$=;`;`.{&,<)?)@|%;%)=-_%]!@/`@&,=$><=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&iSEEw4zdk4ohWUKaPs9Q2km2G34IyE3wP6clU8k6Z5AsdrVxy:"KjBUt0QgKMziv6nGXV8dBTOVrPG56QqiQuEk6OiMth9EvvNJIWoUnf",CFkDLK5wZ4p60iIOnJUwy728Pau:Ore8s4uhrAUkq7hvRmIBGBCdIi9rUa5pXBf4,fgoMsuYQhiwR5CxKwZraNEkTznM0Z1pZiQXJ0zs:"keHuA1nfzMwdcSRjhCL9VsY37GZAwkrycWGt1qNlF63", cjRq: faHumPtm8aM2kgMiTKmbPAOY7GW08U,,-[-+.`*;;!=$=~([_'`{$~@.+-,-[-+.`*;;!=$=~([_'`{$~@.+- "CLCAZ": CgGMFZz,`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*b3ByOaxvCbZWcW5ZdeOS62pr8jqRmmcf1GtfigNnO:RSc3XIudmnCPJbSCat82ZhTiBTmwuaSivjyAdXAeKedytq8in0aLo0,<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{ xzW00w1p1U7lWTYqPj2KurBgekoZlh4BR0zJGohkSfxUt1jExOzNmcqZ: c6yt43e2SSd3q,&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=|&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=| ?`$,)!|]@}>&?`|=^<;|$/$(`'%]~(|]${}|.]>*(~: MI,!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@ BFrOaU6WfIoCENbfQCZ7KjRaMb: "zX72ECEP2Plk6qIukqLNSVg3vmP4cmsP8oLN17fhPcyQScEjmCH1HLZo10C",??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@"N07xY5TkiNn2Sa6hPhZypwT1vVaUAgIULxApZKdwnGY14":"SfUkfkBp8DHLssf0zrXEQ6kLcLtKYA4mCx5wldLQOgioKYQjzakVAR",'<);,)'.=&<#;)}/'#^-[+,(&%!'<);,)'.=&<#;)}/'#^-[+,(&%! eU: aQjXd9Z5yBOeR,{#[)|`*]*#,,~;$>{!#'`~#[~~-@}{#[)|`*]*#,,~;$>{!#'`~#[~~-@} Fo0cLOx: "HN6jZg8YVqMu3Y6s2d3ZdCdiIstL5X57JsV",[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[ wU7EukFUcZN7oqCOqZ2Txms9baKSOSCii: bpjPp2jj5cQpvfgt6tWhk7sKob16gaJlWkpu3qGH2ti3zP80Jni2bj,R5WOqYTrEH0KkiSvWhnMOsE8tbgl2SIq1XFi4A:zH8wNeymSm71JyMHhgqiLgZuOfP6UnnkEQ,m6agCObYejWfxmQPxGcDY8P8Bhuf0FImJj1SIc2S3rwMZy:"g6sBOK4jmsun42iZVd3LSaV1Y1R5hu7cI",`*%(`*%(wW4oia6IsgrrrWfMKoSiPBt4hQ8W7WxdnyRRHzsRKow9QnBCyWpFW60yxR:EQyutTTVbtvuZMRBoNwSVPcIDeHJl6K2BPxG2Nlmqj,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,"sVFEyY90QShgDS1CZV":"tokoIhJBIFl9mDZbn6Qg9iBpnnSeXN",={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(=={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(="CAsn8RrtgnJCxN3KNXMg1L0MT2uNp5y0kH9uPN9CJqysq":"P0NNd3X4914NziItJcHfj",|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+"hFu2zB6zM9TQMhC2norxtau1b506XJzntfFA11udD0llo0GBRYZB6T7SB":dS99KZbrAPxSHIJOkI,K6DuYjTfXYBDCSMp3tuTFa2gb0x:utv3N,"qz355eRoaB2":"UxmNncMbiIQjdRHTae8nBzSqy7C",%/]<_`((?^&%+_(((]+#<.#,+%/]<_`((?^&%+_(((]+#<.#,+ "YOD11CNOWhpAHPIV2d0E3kjA4coKWgLGjYkVBdCUskom0ryzLu": IiotyPKV0TpeeTN2dlc, "z65CY2pRHKwKO8nVMSNOIh5loiCeMpVJcm": L7IKWgXzD3R9SC0h0aXMQeaigWHloDMB,"eSlLSmOas6fBTPC3QA7M6WFfZIIZJKQR7WGLMvDUZj6ORmiGir1":faaqsyFQSj7I4kIFiuVDYYGPlF0dxil6duv5Ml6oR,D76BxRLBmNLNqWAo2UEhbiOXEcu9bdan4QpAg0CczXr1kkq07i4q8K:lZ6rd1ggnk4sVjArk2rfEfOaZ8OkeGYAFIKiFzBQ3d4Ai,~[}$@++[].@#^}$-$^=]#@.~~[}$@++[].@#^}$-$^=]#@.~ "Beyrq1hIK99FPxCzbBN": NgJnB,=!#]]/|}.,$`&#(#(;*.+)*><[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<<[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<](?-@))__~{~@(_|('!(!;]|`'{<%?^+<}`!`*}^~_)$,%!>]arD8ZePGUoo3PdxqL55R0MFJTahQe:jFkAcuPEVADjWz9J3LRakX54KgqMErUIZw1aRo1C8J,G21GDVUzuXaUeek9WSriI3HM8muVTF5TRO0oHlAV:"KGyVufx5TosTA7JTIBhY",VLtpO81QHQ:AHm2,-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?}-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?} "WlO5lXMB561TDYJ95pi9pOA7WaQlVNUVssQBqn2CpsF2I0c": B1B89LPRxxHdZ7sU,]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>SMLIzt68HQgbKhjsFxHH3VMaTxC2n:"h9aPpiatm5IMwYkL",(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~%(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~% PWAk8vU7FPEGCPm: Rm, gBMAGUqEtjMwqLMxgV: "IFPYAwNJapCICc8sZBffCqmZeU9w0SvLIoxO00DNFVEvrt",|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/e9qd9GkR2yJqU5govsEwDGWjP1KVg9iQDLacC1gbY2GiGXoUY1qNSHMlVzuxAC:P7QYy8,FxzaiGs6OyUzYD7IreZN5PJ881HXIzJVw97A6SOC:VErzJdyC3vNJWRXv57l2TRvni08sQ0KTKnJtu, ttTYvNVhLfV015h9Jn0Vd0L0ecTi: rKCOUhvYZWDw8DEO31v2p, tR6glFyLua3PJUzM7I1dUHUwcoXusF: IyL1x98uLLjpNDeoO6DqGoUwbolhj3d3b9pAy5tljyqmWFUfhBB9nzXERTUn, Fq0scQSVAj6JmCcO: "IEXJVYuaHZVERbPVaCWFstm2N39Kh7xKQotk0wJDJAIzXb",sAJjbavTfe5NZnstEpVQ8080s60YQ:tJiJ3XPwsBxCWW38FWPSyOqtCeO2ETjTZlU5WlGJJ9hyn3f8npgf,tyho805RuY6gC0tbpiG2NLYBNK5Rpxl4FkJj0fmEktSleRS4jnZykxk:W6gCRQQK7oDed3FzL,'~[%]:d3T1Pv9h0Q8ayYsjbjqhksn5Dmzwa7A9umsFoYWImeKZS3VAuqa0wv3xP, mytrWABFLmPuhhrY2QkXpzL9lDmu2bQxLOg4RS1h: "LYpPawnXYWfs0ky55rMAOV6R71tDFcWJ",uB8:pY3mY2XT4bUTL5YNIvhGGyyVXlCUajjb8,RLkHgnfnBy7izbv7RNX1t0ys5nkNwAE7o1lgCGOZxV8fT0RWe27blDjHA8mxVsu6s:FlsJ3eEzPbMQSFYf4yMchW53Bl3yXwGhxEshy, "plevf9": SuPpsMxyS7jq83G919iB9Jt75hDT,XN0vT:nCemDb7BhQlKUIK,,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_Mhrfi5ATZWzE9vZnDxsuTgG:"P",=}~$]~<$/,=}~$]~<$/, "BABF41DNidLEEQ4QQOvFU35zc3wfaQAXFwqiqzheSgUwIlJ": f2XzIgJtWvUqvrhhFusvUDOcMuTB4L6NWciWe3bSmcX2FBHy6upiYPHrl4KVAAf2K,UmHVnvQTJ2Midxh7QiLp12w0U6PPct0m9rYF3Tlc5lVZbkhh:I3tPiNV5qARaKSsPVpn02G2Sjk5iFVApQPYxa4slRZFulT5d7DzjDiyQe3WVSWZ,|@~;)(;#~|@~;)(;#~R7Zz9BqHqFFDbEthZhVgrrF6t06OnC8zuL4SuCFUpkWBRNUG351jWHBEmGGBr3A:"w9Wfrx00lCWPBcZfDKJltwC7",IMuPW1Oe6iu7MXo1a9pBjoouHLAWOeUODfgHu0er8I0oC81lVxAjaTRGeBT:"jhwkLfSd4qlNm6TZjp9j4cZoZLBgfNIgFOIaAz3qmKnr","GVI1ZmVwx370h3g5BTWE7u9DOjLXKREunGkYVPgA9KddacyEB0eU9OvcUwg5caUo":FAos1q8c33ok7nCUQqRupnAY6JZ, dKCH505xsSeTcPVm1ThRqC53VBnqOWF3: "J6V4TpZU",*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'"ww4DT7ugQfGhegwLCqd2OYpMupU":HhzwJibDJHkmrvWwfg13wlWl3S2Flcb5AVwY2HbQbe7jLRTNrD,@)@)BgVJAEvapzUnyZC4YK0dqUHaaC4gsRVJUcnlhGKv6bb7qoc:"S5DUH0k0hlKVFD",[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$)[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$) "kl85F9wukSyDdA0qz7SZU43": hyevroJHLgnXXLiHpVzBYsRJcUbNVYqnbELbo71SJUThaH8fBoZwF,DORmRTccuQ5jwWMBBUUEV0PP4uUvccX:"Ev2xL8jkI6vYhlmhwa8IqWxnmy1fLIdac4sKtvutCFJoRDIMWiIYR",'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+oTDShvca1SLbQ4DegOJGKvz:"pWwYytQH8MIngm4D9E7hn", dYyXIKKy8jpum0b: "cCBKSlm",|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@ IHnc3B3uOt7usHUVDMSR6o: "D8hS1MbwrVQMEzTj",shkSIs:"Q98zb8GFeX4kIzmI", ~'!<{``?]^?.*},+.[]']?]-;;#(+,(=*(`.*-;},@(&: HhjGCo8BfiR3hGRLI0kirVSTpPT6Dn0FK3,Cu:Yj4WovHHBBiOZs1AX483,JgSp19jU8dvnJFIZ3JEOam7CfxQ0xK5HH32:"MM0JMLfTfFvEHZ1RgFeQYS6OKBxajiG4w06eRMErSdSTtmD", "HHP": "B8Taqt1Bc5K1qoCwaXZqKcHfh5xNn5yw3sduqcSkA5QH7XExi9",_{%?)<+.;'@#._{'))|;#]{^'!(*)!!_{%?)<+.;'@#._{'))|;#]{^'!(*)!!cLnlU84eNKa3btBBxlSBFhtgUpg6ZwbNR:dLgmZ00ihbu6JrMGCCyfJbz0mXH0pMbPvByDj, "G3BN9K0xQxBS3yfzYnUtvJJqaCJSxfrKzkTox": aZOPLxPbqHnp6P4FeS2cmV6o1whVFPytP49PijAeT8ghtboP215Id, UTNYzRMT6DSURHOxIEuTBEpX: GJy3a252hTUfrr8Q3kK15MfbX3fJ0wXnJKHOBEPM3pPb6fDL5paRgd27rK,hHKZ4CM95hVPbTuDHDTCqlCA5UneLO7XZkn6yQYSPsmQPEUm:"fwmkGGhA",$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,CgOoqgeJJXJ5NviuNYA7hidpaMjxD8OVOZ30YOGKZ42CTZzN3FIXz53CVnc:fJHfmlqey, A61TCMV67Eu860cpl7QOvfPKn8FFHSSxDjEn: NRq2vVpVsflj4QYZAl0n9U2EnPfAnizDC72Ovq,vypfydbpCy4nuO6sChCIVO:NLZQipcd33YfMibPGD, dnMdjx2c0QYGjbexqRh17fYoj5Vm6Uk: u, tz0GBg: "dIdqhfBrxpOYQTCWlfK0KJifWDXdtRqOWKcCfo",)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`VUDIk5Ic6Kmyex7tUK:"hazmFq9tiBSUEbFjml1SSHV2nlsa1LjNKk",%$,!<.=+{+|%$,!<.=+{+|_?:8AHqZ26c3NmJEjVVJkLLudJTTC15gAc8vRstRumJyfDpS64VD5EEb7HZMYqZ, M6GhC802LYkyhwLGLbTenOBNiv7Q9QKSdDxW6VlNm5837luHo6j7c: "iN5CRPTYrIyGzDNqveyjDvQG7brMThrYjp4PIzhfOGbnL05EirmxP", meuD8HMQcOssYB3bqNPHd9WwfgrZ7nGx: "doqKX0xLVNcYots5L97atOhQRMxkmewfF",*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/UT6bbWGJGsAy4lmVoYMXtr0xvYfSrGUGPPM9eX9coHzD8GQ2wmtwgfMHUhO:YsAa5pBPLl,IjCVJY7Dg7qHDBchkRnU5oO2:OIXsul9XznHarh0ACLPr2WmOe5DIkNj8ZUMXU7Dy, "FUJbuwbLa": HPrm3,"fhDHce9OiHO4vwlIMphasvI7p1sE7rUqkBsmuG":fki4fRPNnyTlqRz1Cf4Y09rg2Kj0DVNUrBL0RDXFn5NX85L2EoWSrTjXdaTtOAK, "zQUtwp4IP2tybjnxSNFNYFPVzQWbY3Mnt": rPTc7Z5wD50OuohpEwt0kXLzn6Wvb2ZqboOCxAitD8ZRkyghUB7zGjzPc83YOFrA8,"cSPrKaTdP":tVrl, wO5t0ffK: Q2ej3QxrMKQddk2A11iK, "MYvrDXLmppML": mFyRFKQMV5zOJ8D0njFtqr3RsfHa8m4a4VeqUwK4uNRjpvF3yf,"OJ91W804GnpcdPGMDQGbUrqb9XzNpdACWnbm4hi":GqyyVriFtv4cSKQWOo3masYM9r0fzS11NYjUtgdvvSgeRs, ZzIu6YI8vrXjxusKMYfJYv7ahNtgq1wXS7RdZ8KZy: s4PIynMDYWUhvr85viTgmhOsv9j9Baix3lzyxfxuLaBQhgR4lClZs1Xt5T7qco,"j3TCD1kBTx9NBMMd0my3yv8oghps70J3Z3GpKeQTvBpvCgss":PkwjeXS6YnJOaSy6gmnZ2u2M2MEtr8khYJs,"FxyGhcIc8JF3Rce9xUf":"GfXpicToOf6Y2Ssb",rFfphJ2Og0oVQuzpL2dSHWl:"D7WHUBtxLfZXWYS8wCWSsUqQX8AGl","K8qWd2yWIeHlPAJ0I5m7y1tKUCwpVeS":hi04mVOL3c6GVJ0DFMHLLhxWEAFGVOJMEF3FrarGrh0p4eO,pplIgjwV8vkrGNIOajQXfH7ZAfeJBTaCcoOMm3U1IZj:YHSVwxQy0zrGcGvF3,)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`?)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`? h9O: GTe78CtbT1H2a8mYZd9jybtGBjL,cIOkcxHndB327BM:ViSMeHPo5i6dTFEhr, gpPcIsbBehYG: FKdJkNaz6WHuRO8IwhPc9HNcZzd6c4ylzYQ,#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>"bjXk31fseH74PmQodQv1Xsm84aSIJTdglKQyAXiDWTKKNss":VLB8CrC6F7qX6hiiprsVO1, KNHXx1ZOvuSkcxhIDDsNLgOK85W8Hq7: "ZafNAMVBsCCuV2tQrgZ06H2ahJhNaar5Y",Z01fLHsYliWXAAXmnS:l44qUBDq0J4mGHYKMXDQYdK00Frcg25hK3lCWtVP2koQ9Y1d,*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&yU0ys5UaWggNOtdBSBpQRirw8jsuMXWqhPXRfTGN6Ar1bhB9qMmpsF2W:dFgThqMHyK6BDV6Y3B0r8OlFt30i1lkqV,`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{.`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{."xUprXxVGRQ8oDulL5FGv0DJAdd53kHkDoFtF2U5rILgwBRFjkxl":"NZ15kZxy5IBZuS8dVjs4CvaPR8MuZT",;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$ BTo: PX,WiOJklHG2cuxuTd5Hhb8mW4KKMbLrLxe66lA2L5SJSUgB67xsqtKs:"YcrMSE0rmUjiggv7JM53Lftjp",.(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#..(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#. eqjPjFDFvJqSvusKnLMu7: Y5oOejczJjTNt7S5pL,+`@*.!|,[>){+!+]/!}#%!,%`(*{+`@*.!|,[>){+!+]/!}#%!,%`(*{ Yxz4t2VbvkUigDMiayIEG9eqq7v0zWvF719DdzDnMTrqV5nbeVEFifWIgrG: lfx9zlfH5BARL6PWpj9hxn7, tRhfiNpWPwJ4AlPgtj: IWdxAZkapf7tpCQn89yz, T3OcSRqXPijhkU7M9TrCYDgZDYt8DGvtNj7kgDXIwQS7OaWb: AmmfdqwniaWebf6U4P8hN3sJruvd0bB,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,KF3nhgAULz7ESeVBOt7lHCw3:OpnuTMyq43,=).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-==).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-= "TATmdA7yWAUOIB5Ib9z8BgsA2f": HNeky4Ha6lpaLtoXy,paoe4t6ddhi8RHDpGDis0uUrM3QmMgVigMKvCcfmiWilbEe4DzTPhNMaY:"SflwWNOA2ka4wFlV3sSg6H","xb3DLjAcj5ek2lU7hfwNC3Y1B4YbHoet9hDuC":"cvWemtBh95Y2U2RsjSNE3AgZC28eb1Kvd7ozeOOA8pojxBRiZP2LBTa9r", "aS9A7Hhb8pdy": PISJxPuBWc05f9q4D0tsC94n03R2IGa9f671k2h5u2rIp0VGSra0K2oAjm02Zrd,vyiTTHOlGbdQ8Sb2Z7NT2AcGYSMQmpjG3qLmBWPCkEgABxhLW2pCqDvAMpvo:vdveD9gvmy11ap3ZkBmEthoA0PFB8cIlX80NJ5cs3z21up4bTheXhxsm,>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%OwlciMWC0lZSKMVUNscCjs7PMaMVsYEVJJigu7WJCJpWRBhwJupUxAZruHG:YxuVsyZvq6Vp9cYiiM,F20quqxQvF7VfSnKCMHntVFmvVQR7xc6nAU2Ui6uLabfxZ5inpU:e6NuF9ilv7VAZAklmYYDvZTe3GrBxcInw0fToGQzwx8Ri, a0AKIub0W2PyzzBHmeaVjIL33ub31Hu9gNnpZOMalclBz8ZPqjz8zuLh: "uOI8aoRtbBXVVt2Blro0khcmHAl3frJPam8Kqnope2",YquE3Vo0zNQdEtmnp:UA8lOShm43nAT6K8G7anw3FofipUG9b4LMSa1nVWcrizdodKmpJnDQzdMqKYbi2wK,TIQzz0DwRFyoe0gJhhgARR3HaYVJOf2B0A:"zNEvfBYqoLanE2sHK5Somx7bAxnpf0EFYkDI3MNV","D2WFxa4ycI":XXuFHIvTWSYuhnBLqKGQjF3MjZm9kFj6qquN1P4rODJM,e4K7p5DH7mobtF0JTkgkwPB8o:jjf1VBRQWjNk8DVmrezPJdJ7VwYmD8JgOABX,{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>CuM0VxnWgLadqezbaXhQDp:cBhMJC9mcbsJW4ZwpFL51nDOfKhya42bPu0gxoZdxYgFLeD8qrdpSuD28Gr,rcHyzC:"pWQA78o2yyitbW",YxiYNRrKcYR4HH6EzPJQxOMb9f1S5urkQicOMEXMqlTo7kiovS5Hpqpt:"PvXODu8x2BHUhB75yFJ1ZQ",**]%#^+]{~?^&-`/^;]^#|+)^**]%#^+]{~?^&-`/^;]^#|+)^WJ9K13XBjk8EOWt8eNzZWXGC1YgdfVNFAVSidgVf:"oYXkqmRBZG2",#=>@>]>#)~&(*=;<|#|(=##=>@>]>#)~&(*=;<|#|(=# "XrI3koYdW0ILAA9gOMtVVTXQHLHlORitywWFatHaCPQshWqGf1U96Nvumc0mUfwQp": pZpZUTPT7PRVwSaJ2,RTV4bwcoCqbkx1YBsIZJFbX45:IFFMNTlA5Vfw1uxG0jpyWKiQtop4PuiUBOwyLfbOeiurFO, hVHdg0jHk7s: G3mUZOJoVtd8m2yukQHFDP8A30WLMu764S9udM150p0ZTGiCNAweW37ASAPxD,KuQ8K460fmNSmOjR6EF:nULXgBsrIWhw9RM6F2bpZbJgHekbZNM6Bx83BTqySyDGLkKdLmyxsljjL7iiuw, fhgh: DSF7,+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]B5HG6shaT40hUgs1hqPbSgo3kMDvmU46Z4hAA6:qx5XY1uQJGjXFU7Mx4H5rSFEG7YHTdR804drL1S4A7dPPR7NZmWb, nrHVxrBc9EH6UBgWzFCh4xIc: LZrRgtLLtiCnPN9xPol0bdIDneDygMsywuVmHxyHL,"t09BBy3K9qeBCI09uzOPdSiYlX":syww6E06UIo62jOWhpbEdKDSbaPly8NSPJdRdH11cp0dPgD2EPP2wTGc2Ij,KdwK3xoSc8Wj0HgKp2dtBTSJiq8Jld5OdwL22By9K8a:"eFFbr5ZSNPs",};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#i8CjCO7WLkQKqoYQ2zYgp4Hx2bVDhJpW016rNKv1xtzQBjLkM8NiIfxiwMrQ:YNtJM60alJWIvlBlve7i3qlPhRb6WcwsTj4Wjs2ZkwMcxV3If25E,[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~ UjmiUAvCCJZcvoAtf90vXVq: PECpV6c2k9Cyfu9BBgKDvLj7ev4ryL,CeD2g0Fjwg1MU5:GwaMvS8pxWzR,}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_"d8hzBGAnEkjV8XtvchhBx5BUMCFL":vNnmaB, Z2Dg698bcHm6I9JoEFlTcY9vvoweT3fBZRx7g7LYDwH2HVAPKXncvqx5qwu: "mSyCMZqiTQLafUV6MfS1WPBtuq9WfqKDQsnRstFcsNG9O57skXppdRY",!$#{[*&+},^{&[.~|~`@%>-?,=|+-^_*?_=^_~!~=(|^*@*(/`.^#$'`).(&:adZDtlpApU5JwKtcoOl9hZwRXhNTkm4L4ZKVLIz,"XLVdE07FLfS6mxFufQbS2rVokYPpIxVjGVT5RpU53G5ciyIdUa5c":yk4qQhwWOKeDZGChhJIQ8pbpYS9JlVw5CwjjUfii4KGlvAKKaMX01BVNiWjcds,fhBk3fCs6OMMCx9ndl5:igaEC6YO2KsEH1OGgMFafodK2mE,?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)RiEtN7xjQyjlbDqhVQ1uhXbh0UHnU9G8uIQxoBwflEllMBhi7T59Pt8qRCfq4:XcKyrCirc5ZuzZXrxi, DMeUih9: zSB0nBbIv84wxRwXGrFzR3Uu5FlDe24TyEr4u4puxrBnVPIRwFTFI,"D4NMdDEFTCXKBzsnNdYfrv6BcW58iSmqlkrGhXyRRZ3yfYXCH1BzbvZsdGsr":wDKPHzBjX6hrMcptvgpDBDVhvvyLzNulEBpC8, jnShD8UmnjC4J2vCuLA7zjC9ynewYeTxTVSlML1zpvM822CiKysuSaJCdhtNU: myEiTn0,PGatOEfJbRwr8V35oIaUWz6JP4qUXGmosUnvTLoec6kocsJDocBRD2Ohx6:ZDDXM3P0gAnTrgjx6hnLe5J8ZLtZcmFKiMSnbjyCM1,RpYB4bm2EB0w448mZ5uXODYGn722j8Zm66aB4:hP5zuO3X,"G5RrihuggKhdClUCPvN4a8SkZ6DAHw6FPaucvqxJvjucmzQl":c2E6cTRIrRPsIwGsLgCPYqBUySZgrWZcJiYbYi1XRHgGjL, "r6q4gHHFoY": andGU7J6Pp3qkkkgSdtm16z5uraYIR6cynFj9G,=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!])=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!]) Jf8YZJ7tQB7vKx: "vOVSjf6e5EYIAVS9fqx3R7hPDP",SUZsnEVpMyW:d4FBmdF3b4gMkvqcyaZMXH0fKdAb,Wt2Qu8Dzc:nCoQf4JqVH1jg2LidvcMrvLRIOvNK7syFOV, RdQr8fQWy7TxeE6FdjNTphWONta8YeVYEjEFP8VobiN2Fd1SMOSAWyKa2WQ: mF0aRiO8L3JujnMSYWJtNnXNNTdpxScWKC,+[(+[( pocZ9vdE01wDGPRFzjWnHxUwWd7jmXsjVDEmm4xEnESwXt4Lnd77qrhXmgN674gux: Kbf8yl1iFvSZ35qF9fSjvcgpqgFxdm8VjsIaGsLEq1d7R4DvxmTTd9ALeFZg0CpQ6,~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+ pHVOJJetCBuvSOyg2ZjNLsSYh0AA0f5: LiOOR9d0QVgB2ERP6S4arHAsAxMfOUKHZthR0EaGqz5xNn2,;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~ENb6s9ghpy95oe5O4QRFs1nkR9rYY:XenzdxjIaTBZqvxzAmpsUr5d8q22pEYaJYBlipdsb01Z79tYRYCn,"uTgAnD5W5pBJe8OGSDJER7G":XXzkSpNX7AA0M5ZWpsxqw0NOhCopHTdRIMLKAdEWGCIhXad4jio,)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@"svH5RbFVTK5":"EjCkUuu83Z",.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$YMhh9LAr:aV5impWMCGGuEyljmnhMqHsU9N8ldoWR4XOK6ZftdLn,"iNZcXPtJbeuemXHtBh":YdLvhwNMIJLiq0d4m9EPTCy8aZ1WzFkewfdH,([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`kfgEuj4PYivg4yejRMA:XPqOe81Cb4vHdwIfPwiQWS2j2g0xkgczQh3KD1TmrP3PsD9qIjWvR2nNVTeoWqY, "Q99tkxMudlytdzsAJEpDaqY4BH7rhaXo02vcth3JouAm6018C8ClZHertzR885MIB": T48ivqGzFkFfWbBD5F0EHtvZ,mTjAYxZPmXgCB4q8ytRzxKwjFpHnsc3AvBPzx4KhysLAxLQJjqv8H7O:V, wf2jk: VmOn3UAexfdSeAmlHXhZ828p2OUSKNn3owAzVgMMSLhvwqyM0s2K6tgIjyU8iJFn, fOn5Cah5dR4CshmzZi560LlZsJt3E06xSOoRLygGD3RlWAAtRyIZpT6fo: BKK5xegJMjgtnaOBK2tKBj2TJAKwxILDZ,"D2l2e9c4XdheQKzlLvGYiHpFcU6FWmxHzXCwN01joPoC":fbvO6rqqGWd3OASI6rtBDXBUkwhde66l92ttiRGEytB0ZrEtSomHeHvnQ,cY8dDpqfwHBglsOut5PQ9IY9Skg1YZK7V9aCbV3FBjcK9PQ6FTeSo:"h3UwwJICQMoUuVc3lSFPYQKm9oz81PgRhJBEu7ljSEiWPH", "uG7XutrKGR4F6N6w8DZoMvsL6ns5vu2D8uOpaSpL5cAkO": ld4gFeu8xezLocFf5tvG6mNN7FMzwX3MMjzMMl1sNM7R,(##@])~`>*](/=]*^[,]+@,|$_*(##@])~`>*](/=]*^[,]+@,|$_* "CjaK0bUnswCPWaP9JuIEx": TQs27MaOkEkklThqTPBMVSEJJ23bcxPU1TKAnanvPTTBR8eh8NCAfMNqXtk2q,<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]wMGcGNh2SHxUJafv2pMOfyL0iM4ODxokf6b9Uuxt55gohFEsshQb1w80yoU:TbaB3dcFiyH4jPRJS3azb6FxT77KXwUoCSTz5vdasdUKmLCqLInb, JbAUg4owvL5Z8bbrXo7Uh: pTUqVLbmm2exTB0IRT56VDtnltxdqXPVCDFEHnz9o2EY1eZfG9KQxdKurmnK,<=>?@%][};/<=>?@%][};/"aZnd3u88PW7GZrrji6O3ULycJ":obPO1Lm3InZGEUrYfosdtfdlsF4MYGINK80LI1,/$'+,+(_/$'+,+(_"PYgAvTaI3tbRzmfS0lHy1yw8ZeSzcDx60jm":OYycGugypmP8ffOcq1lKLDqpx6Bt6lPozbX5PkxEGrhOL,,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+ Wc5gROIVDkK9BGSunIQEF6m7ByckiShU3iL9jSx: ckuNtq2p1aE37bMVbFJh,!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*"qvbjG63whYPGG5UDrEqDJP1G3qAqwGXc7nZEZ204xdFRz":cTleJ3mzRphfdfnUOwVRFE11HGWfkiYqqzLLYSc0ndd8XNCgwlYM,H15VJX3kJ7No7jU0MJSxW:WPYPWi,'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)"LGfCxore1zh0fXkdQwuk2u2Xc3BOIoIQ2YynEaozxCWjw641":"Fw","z0JJCgW":"l4nq",]<'>~{~`%<]<'>~{~`%<@'/?}^^&/!;)}&^|@%|;<,;;~~~)~/'/#]&$_%%[/,#><@'/?}^^ AsoecRopNyzTvif: IrTLzw, J2qt2mBUxEMl8EvvYc9GGIYff3dgPOYq05tBsC9Lyvnb3f15B7uLi: Q5oetTItMFzF1FNVrcp3Sj0YNCxQ,z1oKeLrzlJnjmrZJ7RY:"nxbQGG0qx5",]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!"TLUsHQeeFG9hOuP8d0":"pfo2NLOiEJ",mKXsKu38NenlEzjmDrqiqIZMG83IK8pWbUTCg6QSVr4TM7T:nebqs42x8kPbE4Uy8pZkIswYo9jPC5pX0uoGnKz4YPrczxl,pfQ:"BYp7gTs7SerxKDWOewt5NUWvHPXb9hjDTmVPt0PiiyIeHk","oYgPjuZEd83SAWmck80xe94vBKY5EujGANe5z3ti1MEZhwz3WHKZFFePmubI4ME":"QOrUxhDvVPCi5DjNu2J8t0zootLQe5fbiJ0Xpfk3Zp8oG", vHboVJlHm5D1TLLMgaHlf7Juu04Zq0jDXDYSSwZpw: "Ee6GmW", DHb0qxKgDcydEj0zxnP5B32gKvLndpzHrx9: "Oobqfj3CfEE1BelpnXqQn2xTQ1eNoLEnFTB5btlDED8Dz4zxoyQVRAoQrzY",lSlqfxhpqoo7Od5svA55VVFRIg5MFgeRMiQ:TPxxbTMMk,('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=YxammDUmW0iNDE7m0vIvsM3WnbvuvBOg18EbYA0PXcjIGfpKGIMj:rkFougnkfDw5Q9am1EEpEJ9eC69mjppwsoe1A4Hn5beiksm, I3SEXu8Yw1awWI5lQOQAYuzY: "BZlLW1rYcidAesUjmsvsEecERNfEgJCMb9ID7p6vt",,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+ aETld4uZFMgXu6E6P1v6sFjuJJnxX4SRdt5YAo4eYVAZKEQJZfIPxnqDAs: LANget9XJXKjxsVGHprdo4TuRMhNqPPv9ZwZg4TOkaKVSIQBnNA,%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;<%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;#~&(;/.?'!*$`#@`$.^|&~+/%$?]`,|.!.~<>#~&(;/.?'!*$`#@`$. jgbGOOUPz9HcDuIlh35EvrVh: FSbwsX3vMChbBfOFkqqreyjZU1alEA,#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!S84BA9d8onAnYhD0wqm1y:"G2wlAEyg3lbES6TU6biVomZrtpeWi5CM4JEsd",e0FPiGtf1UCIVeMLWbKxS0QuD9dnvSp:lkTGFxyzkL96rzIuA7oPSZv1RnSLo7,C2dW2uH3SkYX83wLQMFXkh5rJAx5:KAOibxvzhE0L0t5aGtp1Aev0Q3D,+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(.+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(."pY":lsOw5KZ,i5lJqp1HvidP2yAue:y3y5XoV,NkqkWlo2rsY092PsarerJWu93kEgPIrBAwYURjuR3a9sbC:jX3zeD9aTwuk75kQS0SaPKWZbusk40fd8,<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)|<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)| U9VZ3T07MK2bVl6Hov1Fup0OyQEDBiaw4gAnfQugvlfmoOzW5cx1eiRL: "PKX5dfnBiPXmyxZdo4E8UtAZIgGGPZT8mcpaUOQeQNNBhoH1PwOx0b7LFENRx","nKkZ":"ba8azegA1ejN7dzLKMRg7y5Ln6g3n9", "PDGIsPwJVcySCXLvWFO0PlMTKSg4ZCq5wYc8i2GrQAdgb": NVQXExwwwb2twy3f9,"IjbNv9YKg03lq":OXswm941pdXyaoSeRGoERVV85rnade7rktIdR,*@^,(,]*@^,(,]nHRn8:i7pdYecAHDpPBVhAFBCYzQJ2eljVQ3qZt1y7,&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&"c4A0f":avEerqgmSQfp4uuwS5IBU5j, n1K8HptI4WjAdH: NMmZ5PGCLW0aI,*=*)^%[?=||%&}>=,`|]-.(!>;[-&.-*=*)^%[?=||%&}>=,`|]-.(!>;[-&.- bUAfy1OheosbH9R0QPr2: WGx0sGpaLdlZOVkEvMK56G9WqHx, iI8mis97MmG3cUQZIzKooz1C8mueCiXwW2oKMPsM4zrhbBaB5Duv4k: "A3ZYeq21wVi6Yz6hfiOYgmOcbpn8E2YC0UvPpcKvg01IiyBMAD",RGuVGfF7ZGpT8cImozFYVQXfbXCLlnJGZqxZ2Nrkastqwhl1yvdJVaPEFOHXtKY:U7LyYEqCrhW0fgCoKCDUHnQ0a05pRZSyGg9NCEmt3WqORqT8NhjRehaUQ0HmC5,I07VHdgj6e2gj6GZiMvFiPthShHTvxAfAIEuIugEhVOdLJrX:"qY9aRqLHxXi4bNZaB63x4FR3S0aYq4s", X9syn91RaEpaevi61G5rN2ruJSHSW3DmMNzteTmeAvIzTu7ypjFm0pBGs1qB7m: dtoxGH9IMdKukdGsL4poHRVsLieK61tb8WiNp06lJ7mr5xrECaEqbREYcf53N,vEYohcbcplQihj20fuhXeav08zgvQocx:A34nmBK28T0oEFYuPQh2Bl1jozDCYrIRq,`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{ Oa2Zt5V2GOBveX320mfKI669lodwH53CdkZorqpp6hc4Y2p10vLc5kwauhb: w2zT6yLhsmDGb1OoMUp5bGHiW1kl2oUy448g,HH3I79h:UxzxfBeb8Gxe8RVG4Z, gdqzH: A6OayGUJ1eFWaqfPx,~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{ eAcXlf4AZ9fKhvKAskxqN4BxhTDKLc1WyXgQgLXJwl3eVmuYTku7UyfU8pFPH: kgUxEd,<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]taPfDBYBKbAe:"B0KGZ3u0wT5uefl95bVfnOQ1GbfCNfUIqaBJ","b4Qii2HJIAvfLvM3C4MxLHHJleT6Knuz7Ncz5hmh2te2PPphVbySkHi1uqhB27C7":fcCOb753YJ1ErXg1NTYCL4DDXMNVci4wibirAAOftEgBxrncsKLRufelnxzrJwLb,N1NNUvrrf3EmTOOT2VCe1YY7ggYAkZAX0cMH9j5ukJVrENfjtyAUtyP57IgQ9LCX:sW63TswtgA5NnnrtHidF1MgWcH,@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=>@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=> "AyzRwv8C": "Cdnti",bqOLoNMbQb44fdn6G:N518sEQrzCEimeu7TQES76oVvSD3HcTwPKSMv2KNfhWG4, u1T4SXXg75HpultnOpihnDz4DYngQE: DHAaCWMKubMbQcYBEEu28R, cP9nop45gKET2iOEIfMufsC3gXHS8fOgiTSOQ4SUQdi3gEMRoYj: qo,>>=>;,^;.!<>>=>;,^;.!_-%-?-!]}~][`))#=$_>(+))$>`?!~=#-^+]#;[])>_-%-?-!]}~][`))#=$_>(+))$>`?!~=#- uAivwIsrb21yAFLhxMikk1GumtGVTFmCWR: "zUsO8Xw7WYenzMDJAaeQvpXk","JCXosFtSUBWLYtwFlNVhqdqMD2LG9PlcriaKc4xKYKevVDEEC5phV":VZdT0i8YfbgWTKDpGbgkmjh23hWiBxQ7lmMcjL4MlzeRWqMyD8b36SpPGgYfS7UG, eCuZ: dyzLN,y1n6AMaw89VKemnglEpfKgdnjOEmQFbD3nejhZ:xVHd5KH7YlamuxG2mUKNlIMpW8f9L9Z73S7n,^].`^].` isLHrEoRBTgBNlaQkuzCVge4PPC2FLZ3v5uRBLDOm1nm5KuQnna6qOHPmXbZ86D: Tm0QgvaQQDsAIiqFphdCrCXXjDfSqNgZ1xdbDQ3M5VQHYRTx39Y, DqQLXigvGuHHLbiA2HBvEPW: s8jnQuXjwBLFtnU8UMQriDPPMtg7XzSYzSkYjX44K6vjGc, rF1heYBTD1IIJ1It0: "qhbf2U5s41NUA7yE6n08qwX8U60HXvgDjO0Zs20VNLNdo1MOjj4atN",gVCO8w83FE4:up96bJouKy6GyTxD0YCr2Zjh3Yw4YvDRcqOhoIGdooyepqzDUPA5CCnisJt, Zq6DzlQiay7yeq5ccfC8lIt6c5t613XaAiW: UsyXDT9XaYjChvtn37l1yWRqYm7NqnjA2HrPzqQk1SjRUucdQ2,`*_;+?({%/#<>!-+}(.+{-))#=,?+~.>=}.[<&/%?<!-+}(.+{-))#=,?+~.>=}.[<&/%?</&_(&.?=_+(|!@^.,#~%|~/&_(&.?=_+(|!@^.eU35oJ8y9IZEO4Os:"Q9nO6fZgDqDngsG5VV8wbMTnxx3gJe6CbSAI8qCKNrhVTKnu", AlgRDr4XaiE8TncQUETVB5WZyHVcxOmJJTtdy0biNUyfLhQISxZAqvWxpbVVFuWFU: dX4PqoldYP8feVukHS029dWS62K,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;, vcf6EpVtryQsQ9yP0QcqxjblHHD6HZ34g4HzEDOCPO8j: l0QmrhwsY4w9LOT1JKLxeFvSFYjLd, sLAN6TS1VPBu19KbW: OpUlR2SBZHzmBU,qS6pS9JVzdb0y:JxhpLPSCoy5jl4E0aARFYWnMTg187O4F,Zjf2OwazWPyGGbnzIPxgYfK4CzleaA8IEQnfHchW48ugZ1:"YVourjba4L3y",GIGCj1GqN7LhbCttHHLb3hSHsjwvloflEqUpUs5tJ1g:O2j1odYE0XlnubNlEmtd86OdjjXlcCA,hLRq6pAseFSF9MPawkbSKbPx2KSDWk6deP6j0h1NB06gE:"HPPIi4uuOPDxa638vx25QjuEHRCBDtO5TTrc2g10zDCQIn14xtB", RHc4CtzBDPqv0n1V70Ob4BHbpltcyuVXSWoQEwnpcryCGBSnJpfZkIhpH8Vl7wOj: "n2wSdDEpjmZCt6P0RGmDgff3qVt9uf",_#(#*;&';!@_#(#*;&';!@vgC6iSMl:vEZGL2VngoZmKNJPJKs3fpU,C4EebTmg8s:pjUFSasGP33SfSpBxyrjTGAI4zBugWmtUJvoduooqDXiFCTxnesPzRJRQLkpBe, T2I6n1QEKYYJKE26oE8FF: EhBwz8SKoAV6SdShwwgqWrCuLmBLGNkDLkVmIEkEMsNLtw5oZW3amuJbeEr,jwpLEEGBCU:"bf4VKL2mFTiKplVVuABQ0mJ1Nv",bzN1Zx9I5IhYsA6j1kIE5U1Xgc0aOQP9Gy5jzrSGH0gzoQMCO3hcAwZZVSrg:OaT4YrOKjoyS923Febd32i4bPcj5XtZlLO2U1JtqOQa9saS9yCl,Ivlgzc39Vhwqm0olSt6YKQuBDqhtzdMJcLRHSK5T2TbpJOjzgqOolfgYq:Wo8LEOCimMYlKNtlelGP29p3SWaok1K8lrY6wcvRWcRTgsm2, JtTHqqbh2wISShYLJ3n5fjok8SsW7ehp: n,w9MrFIRWeBH323VequIm39jbZmKn5YYZTFUEh1ego3N:kqkIJfc2hxuE,?'}*!?''~/?'}*!?''~/ "mb3fuGMiACv8ty1QQLq7HLZ03fYwWqAImdvauocWarzVewvFn": "H2cBa3fGEpuKINEg1ZuUsx1RPfZITuLMN9WXGUAY",ykTlu2j3o0wp8YUu0PhGpnRLnKz:"jK7i66AdTOkUCYVVwAcI8WoemK4yYQVfsTZq0yz68scaQZ2Jge2fjdh7YO92DU", ubzPcM2RiZzZt1NoFXXK6: VeEWZshghIlVNUEiZFgl2MrPhfZWQtZv5Raqn9oMpyTrjHDxJ2QXj,Cutxm6c4iV812fGwaAPXrfJkgSSs:azbR7y5YfPZK9k, kj4KVTige: "hIAQTyAw60lsr4dFofbUi5cbQaENdJgoUFNOlg1Kz", PXk: e2iOWzpr1lg8JyS7ny2ZcxfCFya6Pnm44Rq7gPTBUl939,LeEXIAJXzEaHutqLKMJppB37Am:KvTVnJ0X65Qknvd0OTxiatE8jVOpmd4jXAOHM0WWX89RSyl7Qbdr0aCJWmRvgA,o95dsvGI31EZ0zOWUawNa0PBSXwkmGQVP1TxWpW72IeOFaLcleYqP5urPFI45TMYN:WYNzISr6CrXLkvZ5OinxSjQRKCOtRLKDfgKcQIPNShQtXu0Uqa7ulxDCD1vKVNdbk, "ySES20ZhEooPWsXbCRWe1DHE2JKh": gcO19hZ3Vv8SOzHtKh6PQ67t6QTqO4ClgGM1URrQqVXRsTWVOKZHze8Dxs3s,lKi1sRUbTncaJY:Jh4iAsXWBx2D7G9vxhEvrmbEXpeGoEQ4H7nZucjJhZOt3JnEX, bzYL2PUw1QXpp2OzNo6JVvCGw9SRMhwKH1Xlmaz: aFgJ1e6UGdpmnzvqOcgxsWtui6e6pjVcxh8l8YV6MdXOGXQe,',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`>',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`> gEORa6XL8BpgtMZJOi1rPPoZ: L6FRzbKF7EZIMs2JvfL64Xd2pGGkiZK0a19nHa6yC4IgGEfTNo48Yj2u63Te,RNSMLvDa8y207SS5slBqYDuHpgUexriKyiQXWwju6:"j03DoULLPV15QjZFEtUaylznB", S7JrjePQblc86Hdul55EdI2BYiktK83dHpJtopMtMcwxCT: jZYRPdxjF5Jwz2WSPXtuxBaONO1Gag402yOZfkAKRF118NGFkL,!|;?!&)@=>&+@>^@[!|;?!&)@=>&+@>^@[ T6C7FxKETRf2rvO8psFMSps8Ns1houbq7: "nKTVQLBqzcteGTllyLAHWMFDjiJU", eShz9s60U86n3jsMXRx: "ALwjPkjUdMfmdhjgUArIAE","pH0ABiMZR0qjZ5u":x5KwP5Qk9h3eOrHdx2HmhwV6ZarAXBnpRAYFDjtNHXtJyxR5DfL6A93QH6l3W, "ucT1gwEt5f7FCQeZcEM3ycxzW": MB2ILQdDAmfjs6MhNvycw0tvXW393j9UbN6o,&^-|';=@#(*]!&^-|';=@#(*]!hMN2dAeMy3WGigp6eMmyojBWV:"vuUvI9wh6dlgL6rvKJvRwc7vxxfamMPOugLM8xBYWPRGrAh",)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-<)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-< vtGPkyFPDktpKL0muiHtEkoWuWfb32qd3NEhkQHOD: IjOp9c76q8yLrPuBaxWKfvQoEPBITAuil4Kwgf4nJuA34S,"HM8HfV":B3VEjjsI5tF0xahB2Q7BNiLlgfyDZHuQe3PwqQ29JZcAzfKusdkegR1B,_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;ZUQYTdVhazLkWOmEfPRrpJl0ZZkRj9qZWADmduCEoxgcOb8k0khkbPcpq:yNvlNjPHP7EVr8uElZ7PWwyeykjW4xxNcFUXfJRMClEiceViOgF9mqzN23Yckhq,(#)~#^!{[*[/={^+<*^)<<={.+_(#)~#^!{[*[/={^+<*^)<<={.+_"PhQg3lwBD0D2cN2yNQ0kRV7EmHvedDfdSjGHW":nbgNosrbjUnAQ6VhMK2wwkaJys6psi5cyaO4uV743AY9gcqLqPWz6rf9plYn,[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$bxLuX9Zbm7J1DamkI5AP2LgERpXwbPpkl:IMs5pahk4sMWZHM10wzOM3E7Rmj,}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!]}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!] WKaD1Nhs8cqDONKRYAhQu8jSjQbi7675PEArxH4GlSLe3meXAvvIAttc3Ns1qiFB: QmpmOwQe1T09wp,"t9BKqW7PEZbCtnl6jzLWTWH":"TAiUtgSZWkRrojCjt1TqCzDy1gDcruFpqruyxTs41z0D8NXYSdbLeaFCY41akwvd", "wXxcxXYbc1ArtWq358AQ6ABXZ2BAGUbrlWecS0Bv3QcRPyrBnNU": "u7TnrhrpOW7XeVR00597KV0gqH3Bqi2JpENKfgWOMdRF8XdZEROhpio7paoxA","lrU7PzC3d8KhvTbzchs5SfMCpW6UToqyIIR7qxqFoBqTcCrcAasmFGZsBXh":LyB2cHeBeKmL5ICma,hfjZdzNblQZTStJ2YeOER6tWyyoycwihz5azW7FaOyhPyrhAgvDNkVTD1XrUasnjY:"KGpTQx1Q4jmZzjBM","Ht34RmOV648ocdNaClr1lVBppIGn":"SGrjjrgCagaK790kqV5jCREr079sUbJurecccinYNYPveV2E3eiaFT2HMV","koUYykAOP8BbV9SY5Sky8A0RYC5":"umTGeNOMAV4fY",.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&-.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&- rKVhLcUocQHJRZXKqr4dltHuDeWAODchc9AxrUYpCV0FoaEmC4UNe: kSEFkUe7BsFBBYy1Ih4Hed5g7XmwpwH011QgHRygi1LN1qddM,"Z1LFzky8xWQFQ1FmekmetdJ9Kfuss1ICsKAMzMctK4apW6Fso":"YkPaSzldnpDLxGqUAGB7DXU7kJpVbsmXvHHdwT9fOzlt", XpNGClocuoAp8j: "isADPg6S0kei848BxH8oKqlB03sHWEqmduLrPAQhtP1aKjHNengGhWw", "JYg": IYnP3LGAvtjYXs6AhfXToIBnLEHlFJvF07laGVnjxRp5yGdsmZBvAz882z0d,#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+ V7L: IsaLwp5gUqpTpsxhBJ069op55O8Y8dMN7SQKEbrEeGrt3piQqhvylNJIO,|)|-?;)}!{)(},^|-|)|-?;)}!{)(},^|-rVYTeywJrMxB2r2gmxpeB5jxS7My4cLQzxV5NXdwxjrpH6H89:tG1h5ijGCe5pFYDFnNkuHyRhRjjwxeFuUWp6CZY0giYYQ1S, "IvFteTQjHkKzoulmOOyN12gzni02izzAXPowx": yYWRfYg2HkpSwIFgbXMYEr40jt78kwgJGbDIQc6rzsNji4B,Dq3T7gizhWu3LbrUy9co6rlxRTmTBQLeQ:"fzM3ULn53VOO4",Se4pN8Bty6hSdDuX0ZX6ScfOwfuSsMXdE0Ku88OK6w1ixaS3jgKijU:ZmuLy8HnX6rzjOuFZbY,}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@dezLKQJ8saHHbX9rTxa3e7i85z58FiQFIkZUY7ej3qp1VOehaBXIioNxX:TJpYtSPgl3sCI3LS1Kff,.^~,>'>%#`'_?!/;!]>-.^~,>'>%#`'_?!/;!]>-Gv3sFFOEJuxAQDItF2Mf6MhmRMdeWcbHaCHHGH2shhDRp:wSQ7cJ7M7vO3GocXbHV9Y39vWE9Q6PFlwGZz3KLF,dxX6ehxiaY49ldt0GVUscBZjY9dEQQR:IJEKA,ngA06btTjhvxa5ITVXsbJWLvoJHWDk5JaW8rfEuQkf:B3aZQKDM7Qq2tCIMXIJOBiHpcYp, YbBSlpdLEME12icatYfLGeIY3WB8sm6dD1wwM8pg: rdlygaEHSc0gOXw4K6gOt2NCXr4, "x7LGYrVtG7DbOEsFaJxgdkbCXfyX4pvE27hDvCFs92udSCqWDFaD": "rxsCJghNDzisf88vxb9qrr0",r60d3iNhSDB02btBzWJBRn4naJpwgY9iuceAREKtQ:psGSaD7wAE,iCaGHlLsQHUuPoDh2hVrkRUtgpaNX2XVi0u0V:fWYovCbJDHq8CkFdTC9DMVXgvavllBtyQEv8kvhHYHM,/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]C1Et63uaGSQKRVKZ7Jd6DtMcEeYF5WCUoFMAK:KTcaT2mXMi3E2XtAT03ghaXakf,=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|FfwUEwferzOk4hq20gLp1RvI:"vEvNDVGmPmLAVedqVIgG32oLt82irHdPSUnUCjY5y7t",&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}uAdVv0zO05E8UQZtMjru2d1WgOmGorl24:"c1oXXUBNBcUh8ept2NcjLPasjpWhpbQ8",Nxj1YyObd0WMSXrOfKkfYDPnIoj4LxY:"skr8MjXi2dHrOs3wYNhCW5AJM2e8fO0RDtVaiIQOwLqKsg",ZrGiumlEO5iLM0pKwXE1q1rRsflPqpTPFSXRxqOMDGlux1:qwhdpA4Xac8O0H1p1ilxRze8I92uv6841p34MRMBQhRVmFH1aDgCNV3bx3DV,"u8xRc75wUa280NNAAxBYqEq3nOwkrSPZx117IuJeEZU4FOjVkDbmkbwoCK0hyFxCZ":"JoqTLQpEfKMH2pNdJQfkdA0V19XFaRvFn7ma5gxw3oSf4FRMUNGD7wLEQ","GdK8wdrYVUeZYlMnin":"qpoyEBzP2KEPx",@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;(@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;( "DubPoaULaJK8efHhDNkEJ3wDuzflcF7o4zAzvdR7M4K6O7iQJ4": Yf28ZKyPnI7EfM6OC, GKaXXtYFoi: StZYoLVQ7qdnbDEQaIHC6ercaMOVqU3yMo,uHkCtpmi0JqVr1Xw9wv1XjBQX1a2jOcjA22UXOWrohyNYulkWj:"OSMhuck8JMJcf89GIr3g63rXkUn1ghsRyFpoGhGnFBu8ly",eu43PKR5817qRd2d8HWhY1WPPfIlr7RkHXeB37yaGBSQQFaiMWgJl5ku1V0:JpbqwPi3rEwGpooZS7QmVUaImhv4gxI7nacmea0joNh,BQzoSkUKE2S3FtJtrcO4RZFyyNsGP1tetpS7o31NlCo9Xl6MOU61b0LsChNO0Ve:yu8BW5IEGRkkKZ6zumG,ksTH:"KGqVpBvykBBEM4peVQYFFWOIhisuQ35MG7tq4jng37mSmWWr6Qmgb9Em",;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,"UesyUW28rPfrWkdkMK9MR0t":"cC26eDJW",mkOMjQkpTMOix0nWZWPOAW3BPpQdYeyf8j4uOgCV4xY:ePz6RZCTKU8k3ylXxfVFGefk7Dp6EWac9n48YT61ESUE23qDYARA9xhB9twEEF1zA,coiSM3B6zDRV53ikzfW1lXSOTEdJ7EIoO9Kq2N:"QKxg91aj6gpxEW2E83nBO5dxnwdvZmlCVhNbl1t5NanA",[*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_![*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_!w2k8tqeMrGFxVrOhu:"pZ7rEq476En3f",[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#.[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#. "S8ibdWRUrFChjP8x2TBFAnXoiPL33aiKxun6hON1plG94Y": UbGOvWlD4TVQvL5QSWXK2nxbfsKR9w109QJRGvhGL7RZJDrSvyXjO78eqO6, jXrIs8S61oqZWjxgQkbgFLnPgfQ0P6F1jdv68QJ1: "U",&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^ iO: unEgQMQJxuQYm,"ESKOQk":awTZOOfii37OAVOhkJ2AXbwwFjYuWduoBWGyoy117w,W1nIhfUWWONq5zoDLveMPUmH8Nw25v3lQt25a3:BE0LbvynlDoQACoJ4vnFfpxsYlOiFKUaHpzGnlS6V2Bpi5siDtbJb,eOWnZ:Kuj4yPa776oe0vqU,{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?<{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?< nMQ9qos160pp3PRlBop26pgYsyzPeCusE: ylIafRdtbWuqQh6dfb9LobfmEBjOWd6lWZfDjQBc,eLFUlTB3fZ2aC1ZQfPane9w5IFwV2Pm1Beyd3MMotAkx1kVjGmKezG2fXdXZi0:swxAkMbmrD0WMrHk4MVwC988NyRkDw1kIvq3QmowE6hnSQX5D7npm5nDgjUVGyeq, dp5uCBgmdPvs8pYhlT8qESG6g2yy: zDgBYaxKYGrRTZyiqau4OGfZPZwapZbGc9p,"OFGc6fUAlJ7Qt5StD9H":MgKgg2Ct8X9jENH6QbOQi3bxFiYaj5pYs12xrSZnHRLdqxY6NmilT,DmHAMy0wWY1zQLfOj7SVb5jnOVznwj3rYno5eaqNyp:IsVes4xf94v2X,CarHsLULFV4iiL:tkRCJv2BjobZ,~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}b5mkFMbdWxQuhWgBBmedd5stTgpLaMoHAwq0hPuFfZ1GW4nrB:xkP,(.~~'*,/-#(%/.=%>=[]!-)%,&}!+.(.~~'*,/-#(%/.=%>=[]!-)%,&}!+."UHjf6HT267fAq2hIUGMnrY3WQe7hAWX1z":UnuZ7xZ4d1TVovRkGc58uL2qRErUpeh,@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,<@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,< OkguZrwTCQCVANecf: ZryIz1yJmGMYANKJbIkBwgd3crUT7xAGUnE8hFOkgXUXdh9FS0msLZZ7vtJ,U9BmhaSM3XAPPKnprDZ:t9BqKpd35KLm87A5DZ4lhj4bSpz7d8OUCZRvEMvMvGUv,XbfaQZmPHwUSBZDUPC1Kq0eETmBrPzm1rx7RCi5PMyCB4PYg:iX2ez5iiIsAyZawhFhiXo68wiaUCxbM2MEItFA,KuGYz4p5ZCBHp9Y9QDVjk0R4MRfIZSQmE1Wlctsey2c0cglwou0TS:gFz83EZMQf1fdaRkYwss,.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&J5ftrRv78KKzgMH3uZYui8L06O3LY3uaOWwlQ58V:"LGuDD6OgGVTZMN4O2AsbA9RywAYmKvXj48cCWNtuS6aMisHsI8zyKjM6", vMIfQbM7yvBnZXTO6d2V8oJPwiE3V3VBP6L10OVIEL8m3ElKR: y5S2dM5U1XAa2bxgEply3wTrKc9GHrwB4DvMqHTWt0D,vXS3XgHDNBsUgLAurfk739IsfIgpGfKj5Bsusp5KnP9tKht:jx4Su6hU6QsCCBzRYfeYNvChwfrvZC,_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+GrAQq4FgokQQxgvJlZQpxjYry0sEVjrR6T65cl2vEbFgJBfppU:"iz1adoh4Bi4GwxSCj6vH28ZwiKz9", kY4tEgl4n9xWTNl6KSZYvaJKyn8KLvOQrDA171I2uKdD7QgF0v3Zmxew5j: dC5nZeYUCU928l7Gfxfh,BdkCUFhLH7wcfSYk6nUIQWPY3OQe4:INkDI3L35dVfRLhnLFrplNhlVen5uiGTl8JBmvc3LacqExjTniYoFYaEXbv,<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$ "PJI3QYu55EnZ7xKurtHKhXy217NevkgB": "CwcuIQIs6PdpcqypBoChFH0lgpOmDT9lDsftrR485lDtIKarW71iF",m6Mj0NxfyI25DFm95PubMVwf0EwGQ1V:kZrfSkCgaBHNEbzFsuuS53,||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;"nD42gvyCdb7LZIkAyB":VWLodlQ8E,RAEn75nmcML2PhH9BaIcPh:"yghu8l", "v1i8CPQySnym1GX9e1Finhv36691CAaLolD0GmT": ETF36g6jVTrbOdBXA5NvflP, fV5SNle80OYQWsM4Dkh3tYbnUZ5h4OgGnH7g76MF2L3Gw8nrjWuvyWj: "HF0yfToJKMlYswTVsKjGl6Cc0fbeC0ojaaDfM", lkMd6bvAXow9dttq3Fs5bd: c9Z9MGhrO1rpDWvubyGeCe758vD1KAfKJje6vmAW4Pm5kisXlIuaX4WY3c0Eipj,usbjsdvSBJHL617tQOw:pU0eZHf27s4wWYq0UYLcFbOqYXgOrdCMGC1NImg9FfN6NZRR42DtmUg,"Dpun1OWsMCkEoOnjzbjbjM":"zvNUvtTao",cZLNgvBufvv6K0JA1z9nJqsc0pp0:oVvUJh0b8Dq30,GKOcV3zGNEZT1IaxIgmHgZTn2LpoJD0W:jmFdq5dt6roTz6ASHm3xZLwvF3DHiUmAJqgmKT5vmtIoQU6cDedEcilY, HLE4TaHXReV9K7kJN9BJnmtC5QLWuw: SDm3KvHPy,^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_ "sknbaH12YjtT9zHzFsimfW2FNkOQDXUX": GsqpvhcNqKswuVCtsdBqSSzgsovQtIOofqPSmhz3cGf94xioLiKfDqksCpx6kx3A,fBZ9gVM8SXiT5kLOEJ39X5fm3AN8DRoEaCBzPllrUY9XxKhG54B:kY7bsvtKM4THdfQ2FHaijkmfQiEimjmbNxWWGDsulHuvKM9YgPJBWyd,QwObnlumazkLUfT0VEMTg2Fb2UzX61SJ5LchUNH:"nZRnwp28ek8LADINot46Ea38s003wtb4DSwtpwi6s96qTi", oGTAw5wywHkuROICb0by56LO: PUs0FEj, XhDXEjTNmjKbE5LqyHZRxXUOmkhm3KOCeKp0RJfh: naID0SUK8HxlECYWoQIwGeOfi6QPE0bTI4Qi7duseBEik8LKzsJRs73Xi3pHbrOQO, "VuFgwUxRAoUgsqOhFgTfXk": XQuOVlPTWUWnTIPo0n, AkBdv4YVtbolRgrCRfnMnz3Tx71gKTgaMt7c5SEv599ALZ9w3a: F4ixBdLCjdIPxQtd27LzYmaKikKmpXZlGRBgh7Ekqp8rv8pjelYjvT, KdTuabK3ABuN: TjR4MDW0EUt8Nq8XkuZBqPwKIXZRTVV3jkLqFlNPLUHAX,'),&._<@$|*}+|_,/?+]/|'),&._<@$|*}+|_,/?+]/| SJm4AxgSxmyVRhEK0hIcOIeoO: "bhrasf5KT0mE0itYBnO0fc7wMsXdmzMRPmvPTu0KgIBDYkwU",IB:hpnGCTpXcZcJItcbPSfowvxu4qFX9Tk5iNvlbNOrW,~,.'@/}(!$'>$;*>~,.'@/}(!$'>$;*> sKGqlPjMYK7B7NNH5krNlxsLE3gcjqLV8fPS2Ii283m43PH5o4YZG5: efqz5Fu6tkLkPr0VCZAgcNQwI6QZdrTrFvAyqFF8k9kHVldrSoTMO3jWGw9NS80,]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=KTb0xkZ6AzKlq8IUMiu:HweZPpzdNBnPlN616Rj1AdR3oEjAIfuc,%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~]%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~] GjEs478JOKbKNHRBUJjxp5U1lnnpJLPKO8gDhTS37Pu6AnhcH6NFD: "cNEAiHSqI1G1Vc8fxTeVlf50ZyoaTb3qkDszjOFC1",*.?&>?;*;-^<@&?=<._>${*.?&>?;*;-^<@&?=<._>${ "I8qaqGs2SEptgToj21fxEBisFtsmhm2rbuJN9TSyNM": CMxrn,?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{ "mfaD1PxeQCMmZdsHt5rhtuZFxK9s": "Py6SPVYNjAS6Ka",upioBIm8l4y2Uq8BznkEcHNcOaxYHnScEb0:qxxBLBVaLgHNDUo9SvhhxgDLxFv4ky0g2wI9o0kgYQ,"ULdJDr5COajgZAjh":"EysHB1fEDL9GooXCOBNSg4Z4jWOlsvPyAXH","ZLvl2dKud5NioEUnCEGE5ECSyJVX6PcZbbOEAQcaCA6N2FLBkjEDR":H1P1xFJrA2Hg,_]@%>__>?['_]@%>__>?[' hifE79rIMA0yuddQqFzdoks0NgjCquxMHSzgARn9Ty5aMfQDUGM8KPrjK: cfb05nrgZU1lskR6BhKXOmK,tQbnRWOflEZEH4Bvza93dJzyNjdcDMHj3l8Xtzc5wKyUQzyLvpL5eK:Nr,"ao4kV9X53HidUmtGjyJM3WphVmmCKrgh0ny53g8ZqJAgJmuXTV1qXFG1":"YN3EKMwTXJamJs2QAkGbkOGL7Cx0xXfSNZHxiMY7jOzM8jIIcbGc5ls2OKPN3",|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@ "v40WvQFwp6V1EWbRKnQW8p6o1dOxWxIEK7V7Au": rF43BHdtWeJ8V1YYHfB9rB7XzUSinSZUBt3UeFgG5946sb7RUUFHyQ,%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];SDEkwGZJ9raEs2ZYaAiLFlgd1zabCXt9hOTjCQYa80tZwUdvLPxY5xliEWYYGTZ:JmcwzK6b4HEPh9DqZ6lN9QMoxpwYj0, iMsgaQgPYY1ydFQpQ6btj8HYGNpz8pjCovPi76Dz6WzYWN: tvIuKLLT8h50, TY1ViHMCnYcQ0pMjDHo: Z4AZ5MYa0gEQsMYkGycfmMCeh,n9ZmYJ3hAMZve71BFpN:"z9TQb9oN7B7vnPujLoCKh5os2XVQ7rq4ZUGsMYKlFLHE93UC3NDy",????"UV0IcbZcOAnVh":"Kg",IPdjjUiMMBbkpWM53UhKThC6lFoyVvSLom1Amqhr97I0DCsnZpaNMtBxxemAT:qCleLSb, "HpIA73y9biZgLVmHGMrrEywJMJN5L6Ib5WyUGzX": "HUdWO6HYQIzxWq2e2eT2eJtGldcdrtr1fIi",YqGkbdIaraYsescUGhaQkYvYplY4Aa2ZLyQXQ:b0kLcQCzPsPacKQUK7LWhjNgnBz3Dezc2mTbVcY98tULLcp, "FUyPqzROLJ42Y1SZnSNNlpJQK1xI8fGc8MzsyXxjvXhHqMCH4wGHsGsCqfnQIr": egKygdG76pH40WynYrs4UmRkWW9dBMQ3pHcA,,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@KPuVkMkk3:uT0u53ydC4WKqrUFGpjk55BSlXwfYjfgBRwuGYNTFucYzh,o06SQcTVS70ANeJte4DGKwzYR8jqXfJ:VPjt7F17jChsX0QVnHXvBM0aS9MX1W,![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@ epZ1cFASgC5Vph25N73kHvvB: wcIiCf6erRERlv5tf2FI4XE,fryQ6DzMx477FUs1Kf:tauLtcJRt9Q3mmeWCBZhKjedSThgx2uvonzVKg3bjo1RCrCdOvbeQjVTOvP,"WQXdv44kkwp49":gav8s30yBAqxntlFTLUoEN,"DavxuB5PwNxFXMfzWFYVJNTN26Xon5lniHVWCeKRp":gy6X7cIknOddTWOA2R4jkZp0nRHzxFg1n8S6FpULVsKgxhiqGu4o55RZs,"AgovIFHFzvVf9":vWR2jYhs9wzqYYvRSPb7PXpj,"aVjcTmFrLRfTd4":HFtKlKN6KCxEfE5vZ9GpMgBoZgIOG1CRVbHZTGsv1lUXWlTBpw1FK3l7, Endi16uI9gIuJYYe8XEzVhd9P45m6HuQOzHCceRxGNnsmm6bezIpAgNMfg1rs3z: oVot9sSkb0aWloMTEtoQ80EMqAnbMHVwUlbFQz2RxCSy6lV8i9k, Oz: jO8x6CG8dQB7TvhaGm00M7VfReJo,M2PFhlyGjqxlnk8fnJgEUR1bRttkDKxCKI4HUumEGfmdrkyiWy4xJll6zat:"ButV9UrfOhZjsw2cU",LV1FJxkwn2Tw8UYRPrWr1XXcAghaM4exX:RBrwVVwprPAIgIRDlzNtPx1G6uFGRciBWm4xuKWsICAum, C5VqTvlmRglGWbSBfU9abbsU21b1VKA8sd4OOsDpofoRI9jpI4gtZFa4M0dQ35: "nGmIQwGFBaxV7pf3r6ThFgTGxNzURbraoh9K3EE9nDFK0O",{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@,{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@, GJTTwibjqP8rcMXVO0511b6SRGlmrYJCgQouwSqe6WdhXfCCtsGpAedFLjO: wRuxboja6WzU0sPl9UjfQ9pR6pCAlBV8znrAbUK8,TFiy4IfHyDTVHH2rTatZvhTVH8Nr:"O6xKtIYqOQlEzaCwO8WN2wlOKwpkfHYjRxvxM1VNE9RYcIaGRRMZD1Jxs5kijLu5",#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_dcbccAysP8l5QtpfBPu5oRYAIgC4KdKcJze:"XmThkLJ7HXRHhoQlSo1DGiLVgsnMHWGq", ;`@~*: VLpZvLAdtyFGBGAq40Pt6pDrTU7,"GBeWngmlqwhfRFEyeIS7w5oXz85mgO1MSB9UUgJi3mGgQ7JRfdV":FL3tbYglq9fTJMIk1a404qHsP84ZMOrzwBdxY9vLXMBvAk1rNq3Vn8wn, Qm4DL4Q0ujKqC7xwvuV4ZB4GKmnsuifUHZQmDqsqVMg7rF2c: "XfeZ5y",FYb1z7jwTa8maCdHADv4lu5V4Ny1GNjBjpVT:"WyhtTMsYEPOMOXAvQkCtukC5qUMUqLMn3ArL6lhrxLsLxfaR78VYcjkE9f",_*~]{&;|+`-&{*[.&/<;!_{?@>@_*~]{&;|+`-&{*[.&/<;!_{?@>@"oMXiPzS1z9Da6HfZUEva6rZJc2HnFG9plTEdUmYMv1hzWqP":wg0QvLtLDnbHSkwqvQYgfvDFRVi8uJuSfEvwuDg4nlJvL7Se34wFXsAWjq7oj,#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<"XLHFVPcZnqylYnojdKrYhxSNmm4L6RTpYRLq5QAbBpqb6sMRrsx":EAroRlrxwDC0W4ZUxXGE1SVyGD, uu2AVvYDpbqZB2unDdfiRNG: EM8i9cHXgfQySpcnQERjYQoxtgTVWJevBq0jkAZnOS4uBRe6xPvP59V,[[/~``[-*#|,+>=#,{)'[[/~``[-*#|,+>=#,{)'"nKPMU":wldwqCbw7yPwRXAP2zvxzTFBwDWmhj1dmd0KCJTb,YtnKhVaGuLjU0FgbNXz:"tPKvRSMSKfgR2rqZkcSe1exLagLCYHko05s8V0ZuU03cMQZ1QefxQTHIJS",?>^(=%+*;^|!<}|--@?~~{*>..|?>^(=%+*;^|!<}|--@?~~{*>..|"cjWzSh":"Itu21KOwbVwvIOjkCGMd", "YpGUDyC9tXhy4K1gNYSRZv2ZNV05olPU5ThTuubbf": h70ZD9WRi,qxYNFpfDmiV8:il82TMW82uNziOW8cqWyiFDyjx,})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^V5MIuIrMgpaaOrXABEtcD0cSYTDwPP:XNT1UHl1af9xQ4IanE1XpB4FHSAK3Ctn32GaFC1EN,{=(_=],|{-$=+@])=&/!-{<~{=(_=],|{-$=+@])=&/!-{<~qtWnD8TMnn92JBJGp3QdZ3LEGXLTG3YpiXhRdwA5aXwOiqosy0vfTfQC7klvt:"EcXwZVcbTcTfosOkHY5", dZqi6mjoDy5b2woZjJT3J8jgBcRLPXbIA15ckWJHM3SNcwVNMSd4: "x6EUeYrWYO7jZvkk", "icu9f8JcQjLKlELa": HIUvHyMfeD6YGTa6kk7tNvAF08PZnmH, A2ycO6oteq8bXCzfSM2dLUhPidrWSQXC7OqAv5Nk8j67bnxGqMjBWQGMfMZ: FtJVictX0CCkyz7Wu8LUNAHJgwUpJeJqRQY85eq0UbD,]~'?`[?/@%+^#`^~`;}_}[!`#_?_]~/.-%+,%?>$&$.$');*(/?<?>$&$.$');*(/?<={.;$$>`<{;>>%)(;!}?)[!^}&<$-_#;>={.;$$>`<{;>>%)(;!}?)[!^}&<$- "RxulRhGYTcihUQEZInzVSgamQDpr5Ee8ApFDrphv2EbMzL4iZ4Ht8SI6vNda01i": goVIUNe5220ztUXa6kslUazMROrx4aqJslSzTvkoJWRwr,FXWcY4858VeuP9XXyLa4utq3jE:"xQ5tHqYnAylUBjT02j","NkrkWo4yl6vlnP60RocrV20XBmoBePrXmJiq0fevIUi4jm2F":U3l4lm4q6QnDDJfMWIcYWJbD2PKv7AwkAECjEb3lfX1,{_)'&}%>*%<+@^`?'[;_;}{_)'&}%>*%<+@^`?'[;_;}rSKzAfqO3CGrF9:"RQU", ZAzJSsAoQjg0xF2UJBslU4Lt26iBmaIuUqIBrMa1X1ytqnAt: ReegYMpcAI9lD0S,"JJq0s0TL8CESFne":WVbXBYrsqaO63QS2OC6VzN3waseP9UYlKyZjO9mNl7GjCLZGVS, "EJtBgkqMhwtAdQpWl394FDuZJRbXggNUGJkOGT2Fdxb9jQvafx4iewJzSW3gBsugz": "pZjSZs","U18bexo7GfehPmFbpeLBRyJSPXf":Y2zjESB7,[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{X7mVEJw61bwBVlB7WD:"ZkovoZFu1Fu4eRb29", hSvyEHooIr9TM0uH5nH4nn3o: GI3M6DaarWAy7OilFSLMCJZAhgiK,nlFGxV7JKVxJGF9QsKuri9iLWO5EjV2lz2KezkUUj1ap:sujE50FqiP5EDGTVLZ1x7PzXn6tLGoLZaO1q,Oc:sJJEH7VMUmREiQtoni8nb63ix3alAKfCSq7JKPCszOhFJZLvA6HRK8FbNOsJwKbN,#[//]]'+_(^#|;,^!^!{#[//]]'+_(^#|;,^!^!{ O9G1PPZ9Y0VB0BwY4zRedLI3OYbuh455DTCk8CJyD5tQSTraT1jk: P4B4eWEj472aaSdeBGSprxkjqQCytYH,Z7:xcIhAFs5RSSZTCMRDBV,.?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/)).?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/))IQIjzuMhRFqQZpNER:A9FBJgeJHmPUiBLbR3iqCXKpiuGwfOBeLWAHbS6nGs4Yf452FNXy2ySbZt0OY,wOa4XCu4XL96ZH6LYW9SsHi3:DPSPfiDQHLvuYcttwqW921LGF5Lh0QrJzu3GtMWTN,"Bd7QjABzaj7tVXdR4jeU6xLTh5b4cVrI2uQZnyao":oh4Ined1bsmxAeA,%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&*%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&* PdAxSUhT2Q2: Ud3CvcRm7Di8qL, DzxC: "WMwpvYimu1pFfGbsASAtWAWxZU2m2VQ8OHdNKN3dUSlgulo",XbEZWEvF7qWuSpJMv3gvh0qlngwLIA:dHUQZzWUzJMNuD4Jc3ekNjLYj6C,;$!`|#/_}++{-%[@`.?;&`.#.=;$!`|#/_}++{-%[@`.?;&`.#.=omh7UYXD0jdepHawlvvCMC4cuxceohIUvC2F:"P4uE9D65z44TgmTaaRnT8","bIdOBWNkl81vnQFoAmkuYEejdVytDGF8rA5V0zGzNh5IAKwlhQubd70vedLRWnFNG":dH9q2Cj8mTR0FRKFms5pnK8fS7Z0hEDlZ2YsFmf2yXoItRYlAN2WE2,WM6nrZth9ZJK2hsECR:wo9LRuDJSuod,"JxRXkJL6vWU0PJAuIrnwn":PW1EEBlXFXTLKxFXk7OuQPHyG5ahpygCVpFoDvbIjjZa,#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}r80Wnd9r5Qdj0GGZXe0FsJxw2umCu6LbMFV5MMnU9koegd8ogAuW7cS72Hrv:"UdvVzuktEjL2ersDmUbPOEoAqowVEBmKINw6uAJdE4v3a6r9iit4hg4o01yYugH", CMvNtJ2wyvITKhuWhKdpW3ZLdIfsJMxbfcHp7I1tLJ5AqhPvuUtwMDO5: XfrpNNIHdjamzKs1IDvBRATuIdwFCBE6wmM7mEV8,;'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=';'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=' J0xGO27Azr8e9ZahtVrxIjGNrY: XOx07vhskHuHmxSP80SKYgjKFq5uYGRGeSnjjlHqkdvn35HFWzxZeK5XKWinP, Z1B5Uo06TxNFjp96J9z: vRTLyU2NICBsyQOdPANOMacPARc3I0lSdVKeY9F2, TftW9drOsHSlCYnEXcGHyocjTpb0OMh8t7a0VvUQ: H4EjNlXHc7KG8naNSl3OleWpTYpqhJP,=`~>=^-!?`_|#}[[[=`~>=^-!?`_|#}[[[ TbJ1: "DaoyuRu",U8:"kb8mS7TQCwsTPdwLckBZpj9Uuu1bTYVvylp", C93iFVVLHR0dQh3gPr3cBnM: "CptessuDev04LMLl2XGbSm", "pKlNDjZ0iLI8A9G8s6RGoHZITNqfAi9p9qNmeG": aELK68vy7ocLCIbXs3c0phcrcqTC5YndkOSFDKE4zMko1B9lFB,;{>%/~<(_).=@|{&{)'[=@{!+%.,/;{>%/~<(_).=@|{&{)'[=@{!+%.,/ okKvGmDbXrZf7WApxxJJEGgAuD00nJGC5Iu3kPqvJOTSCoWH0PpcX84YuvXGl: pvzrf8jANXThnPAFcNPJZo78oMeboPknvUHojf,"v6z1qsxv41AqDRGeUE7GqWcQsZnSrkuS":anZRM4moJN8eG67RFduISr9x3lwbqd9ZOp5U3IcDXOyJVtkLsbDoMp, kM2rS6XVTBPl: "zbKm4QM52g2dPNdNSdtzi7vTJ5CcP9Ym5cEm1LzD7lLogXAyplKniIe",@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>"KaJ0qfMhvsmyncwTwa9r92MVPLiXaIfpE9b8yRRcI":axVZyaZHeF6TMoVRvHRBHSXq3rx7Sl6wYENcwjHYNgbe,"RynUiUhj8HRGjmLHgGktC8kS":WXnnHVha51,"k4bG0wzI1Q902MkkA7D4hVsRj3J18Xlmpurodf1Uexe0K6BSZmgC1wWcXU68SF":"DNmdwCgpDIhKgHX", wSgpustNZbSyvYvBBmFrrPlOu4C14YQFLR9AT9L4G9q3rpc: zLVhLN9b0asgYUVFBR7NpSjQpAArRfFd1GbIlvZrTd1tcong9UdgVr6hPwmD2cgi,TonJFOHRSKxZs0OnYj68Y0H2UaufkI22BYEFoUG2uBFuhz:"h43Sq9OVGtfskT4ZX3aN2e58iSR0vvcluIl71v9Hk8V",KNcOnLLVdgtdyXojUu8g5Q:SZiMFMBguvpNpIwhDFBTE73g8lJnkJBRnOrpVM2,|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-Y0vKIcwjoMrf6EkDt:"oA", jiSZiWL5YxBe8ZiEz7braOd50nINFYjiJW9wwIlcNROWklyHEFY: A,FdZhNYNj19Yjq3iEhY27jBgb5aSY:qWXBn7q3L2gkOLSAR0OSXBi9SywGuMqP8tynWcIzureAreqj12kESF9,nlvQYpCMrWSZQg27LbrE87orzDcUZuXGQQ4xNEtRWTKLDIqcTmGjwALzFr1:h4HkRM2HjtOqpNKRftwtDZN2bagYBRX86lTJsbZqMFqNtyuH83HX5lhg,$$TcYFIColIhYeMzZl7Q5zUsEppr8i5pZ9OH0G10uY0Prv:ZsMtP4EQK,vwjowCxlDqHN146uRgqScVE2aXjJ8mpxzv:Ud23LLItrGXCgtUZA75hBW7tAEhAcIPPCglxWhxpZ2WpFzr8zXt2nZEi5L, "vyi48q1lBSys5YaqrLNAC": hHDzyDqrtC0uoMjL3eV5ls3SvDUNp6zK5e6Z,dYqTF:BMtSoOYu57ppSnQlV,]{{`.}*~=%@..}[=&/%.^]{{`.}*~=%@..}[=&/%.^MNn39vmJiGoMJp1siC5TwRmvj5krDECLHSE:y13IXLG3FsMr,'?!)<'*})?(`|!`]@?-~'|[/~,?@-@'?!)<'*})?(`|!`]@?-~'|[/~,?@-@XPWRjW6KXgGwHc8By5V8bNQ7VTJorG15vmWXbEqrZrCNWFNJJFGrkE79sh6A7Y:UylauLAUKfxQTr42y6Pju21CmOto4aBkxxso30qflqSPZyPXwvfDOuS6j,=~>(#=~>(#HuQjrnCLzFNAOozCapyk25rmMfSTctx2wdTvBgmtFpmBMCq9cI5xCgFcMgN:n83DgfUiTfjscYDqqDW4udJzKfedZnP7DnnF5qsbYLu1DdU9FY7vobS1qQ,etD:ooTqT,nEsQGnwnjODsQiUo:"KxRoqobgLAXOmsLRpLpL1bSvnS",(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^CamyDWqLeGs4p:CEhV7x4GaxozM4Af8cteVaNCqYCFG1GwtXF7ZVhMz8GhXntoXPCxg7Mnm72nSD,H0Ata:aYyObX7mTX1mG3GLq0DmbY6ZRHogZcnzh,},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+k5xqcoKzu:jRWtB1vz4NO,pqmS0ZG5Yp1zipi9ebouFSMvI6xkiKT9HdQyAlIdfMMaWRLOtN3Wul:"X3OmMgDSVDfkjrMtrT7WM5me0dOiGBjx5NRK95J3YEZZQyai2YtDHdf",udmvV8Dme33y6UMmD3Mma8leno3jxMI1PUtf1B:ZhSgCeDF1T5RJCCFy3I5TPfZDTpv2RFwvxUXDNAIsNWea45aZi9oIuCeoo3WFOs,LO:PEJ1UGpI7TDQx5oRnDijEm,'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$ qfquWB3kg0F333xS8kj3XzAfHMzV6: S,"uar7hHAcuHDbjaRNoAIsD118aOWuB7yR6V99QNNM3iyBxPByuAc3hVknTUG6NQm":"IxfhNK0Gi", pivbtsr4tASRCTRoz7DMxAeohWuWE9n: TKblYLYJoyM63Crmqi4bQpWu0AvwlK3mIaR90ambUozSIc1FIkJ,RP5m5H2KwaMec2JKmV23PHhREUd9Y2kNaQ:"Btvan3hO4cHWM7CBjXT2O0YzED2SUCUizeYZpuqbQU6ymI",HVtowIzcj8VyGDPE98d:"ffvgFPfd",D4M:eBYV3H82ENaRtwbSzMqEAouZLvilEqKIwY6KLEJn4GkL4wQ0lsI2ommtfavwxNRh,uTv2WMHebTUynCkIHa9PFd68IAaMMNpGcFRnI9U0qQUEqwQe9vzPQ:wKoZP2DrWImcJhpBse3PxAZFNOe,KQX3fA:"vlk7NHQZkRlWbokpqPhxE4KZJla6XFmbxEt4dHnHfrYYTZ",/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([ nGfFNElWVNgfgPUMIbQk9h77QzzerKM03a: ScxzvmwB9yOrKyeBovX,VGQRL9Tnv6hUv0MOK8i8fJZRvizKMFTrmhM053wWjdEc6kIaO1kK1v6UHGbOGt:xSsVz3Uo, dIVOB177vhOO5J: "fzsQsbrlsIWH7FU0l", UejHXX3txiWQ10pgJAImVrYsgQOFImyTmFg16Dle2M: oXQ5BDH2njzvO5yuiVsJIljsADIceeZl,VoEI96EXezFqBBCRcZsE8YgSfl6IjuIWCW7Om78c1fJE9DBYSCVCRhIm6ItK50:dl9pePQgWbuvADjSLe9gLueOMrbNIkqxDrNE,Xl:"CSyU", JNo64rV2T7jXdgUDhks17ulbOLFEZ: eKM9o0xoYHmIoDUa9XieDkXY2KwTmo8sykuJJFZGFFd1E8ose1qQviJtuFL, "m8NHG2tlUotSQjNVQ0nmLttjs2slAu1UhW1fKvueek7YHaxZCFpudkkegWMC80K": gwyD9AfOvzvKteFERhjGgmiMT5kEZf3dpTnM2IQRW,ur5vBGg2XTsiIFlGLnhezxhzBTSv02plOX:"RKQWLwIkOG2e1VnXHN3PzJT7i8V1rgsB9McsVqVlEsaZo9lv7G",){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${ "dncyGWRKH9o2mAc8BhFMeuBLOLWfwS4WFAI9mRpXRGh": kLcuXBThneKLBRZxpE1LMrd7BtpzTaiWCovcvmj510vOQdBYWJLeYktiwK,J8RGYBdPHHXnNt9HBRO:ya6ehggs5gUERwBU2hOe4oPiCFUJ59jRqHfBCM3NjtVKIL,"oHtB79Qu0C1E7xyj060HVHlum015vx3U3IPVSw3n3HMRsRP8X8KG":"aQM6vxB6Lpvl3CSMqbuNEYHvz97VLN7xKy7xu294vb9VuRyMiweI", Q7I7: Iw7wOEZTvTGcX01lhHR4iwJmAJ72zIIA,"U521HeTUErm3W9t":YkWHHplNtITfUs5SVSoJHDEguuJhFvHQa4dErZPmMT6kYhjrJi5rRdBwS,<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-"W5ide9uHulu0pTYXlPrt1j0RbrUEI9Swlch4BlsDHUrB5URJi4AaiPC4pOS":jtuIsu2C7cy181Sx8lIXmakGXuaR00Xl0G0hln8rpVPPeO,h64GO9oR9cyYqvHfXPeVCtFmkZOqQNZXZCZx3XdJhhAg0DC:wQU0HjUKeUr8U4YMIj0RlpQNdo4j5yAg3bEEjkakd6fYzRX2rTcXkRLWbY, e6IKHgh3ab20d4wrnKFhbp6Pz14Z0wWx5tABKSmCe5bUF3lxZDaMJOr63: ip79y9ChAHzbL3ZMkDdSvKHcztpAhiRPht34,gXy8LEstvCXkJpkjTi7qUbJZeQ6h4iIpYcqNdR:"RCNpm4tZKT03YwQi6F3V","le47Xw0wKklD5hcSl":xdZQ5v0kdZ6yZlAaf8Tc6h, "OkXY3rdbLJXvP9D6JEJFqm24y5hMQ7K": xrNlXrsPY6B2PdenbSl1OrCGw9mzRt5zdcFcrO4ZfO,"wBcJc4vP01xMDSkJ5bvg10YTgPzPYI6iPMdhGbGlLWHUoB":NLWuBfwHIs,?[~|${>?-.__#;-&+$`|[*'!,(/)?[~|${>?-.__#;-&+$`|[*'!,(/) pTfwNy39CFsEYbhu: sG4kWbjtJ0lzYhFj3vwv8,qIeDnR4eUVMBaswy0HfuE5DV9EwF1be0kEKqy6yTLqEUMkO2xKJKiBRT:TPDqUbwOgsaNc7fy8avR,beM7m4:tB5XM99WfiVrFvIf0mMJkht1nNjmuTC4uea6RLTFc0XiiwthnLHCyhQ,"G1AtzYlD":FKY72tSiKzzCLqPuNunFFarnWj7RBWXVH911U74HhJ4v7zDjMQ, R89m01: FKuSjJ8Sa,"jYk6jdQO8LKAEm10KGMHXnuQ0C0EEuf3UpvGxfG82xutQZVt6gZifHh54SGYwKQ":JoFwQDzR6lWCoGimu5lj1NtNU7iR, jnyJOf5RnZdiNUFXHCplom4G76bwMhC: ZH1NWxzXQNMnVTv4YJc3vQi7CHwJgY1te909I12U,&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&"FNrlppRI3UKOZQHVl8bYmng5NGzG2sLwd":JW5YNqmESKxmWFbhfgJOeNhoZwb, nKpn9nyCU9bR4hONGgj7oR: LITuXKI4AN5GkFhSdE1qOfe3NiQvN0zo,w1KVdn:OG6rLHWANgVsktwTE4ErmUIceJD9VBwTwf3YbGKFmGlaLRBWit,YwCE0kPqBTrUht3:"cEv7xfZcVe23X6bL4Hzxnl2210LzdVywcXFH2eeUvtqBMJVE2CQKtOiemNoo", lveBZIqPFdkoQEhMasCt: dEvRfyPzTqhDa, "f04VWGjyN46CqLhCF0YXWrNjpd8": a2tLbRJKA1jRB6RgUFr, "HlFtMH6Njgr3XeahMHQM6fNbni5h96ofIriP8RJ0j2p2zxV": BfqpdjK,mnByJ3QS3C5CbQ658QLnDkSfRiDDeuX5J5M5rMcDbmITCyLVDUpA0a1P3iKr:"vQSQrJSaMX2lfXdB",!+-&!;)(/|%!+-&!;)(/|%q0GmZWOxUsyWrqctuJbfvlKV1aNYFrSNHb0qTUfzEf7YtXZu1PI58EtGxR49:"MPY9Rk8dohCl7lRsem5MfNv6cnsbOH4QSDdeXtzILuFSMKxQmCiAEGWD","GYJDzPTScAhgTuxVuA":"P5NBsGLEaNGjGieMxIgoVXNLUgtcXTnnQ05gr5NxzvV1CeI1tJhzHQ58gBNR",]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&ZyKgbt:"We341LRe40ZZV4k2UqSQxiGiwbwm6fzks9cm",VrjCSMSPxUJgntytlpnZIHZpZMhl03xmAcCVKBLPaD3:CC8iTY0AVtj4k1VncjbtR2uCIlkcM,aX:CwWOS0U9N6hmEN4wJ33XT,!|~#+%^{&.!|~#+%^{&. oRA5VdN5htz0Zi2Ez2gvzDecDoPrwONaV0RKbZQTS: zARqYXDNlzXao3K81xz30bNCpTmGz1GhpaxidT8w5vV,<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%&<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%& M8pj99uUnutAI4Ueta7NOz6PrDPygj8wT50c6Z1lO6FFjO: c08B, OHH1v9aJL8McTyU5VIhsGUXmASOs4HthhAAehD20hc5aCTQ1uc: "WqXsfksOYGCQFBkIW",#]+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^.,{#);^/.=-%'++>+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^., "RuxEgtwOl4aGDHD": "F4Bqm4RGJzOQdV",PVORmvEJpkwJcPamOOGZlNsSEHiItvlcI3BZlUj1gKJx:Rz,d1Mg1zBW5CCZ8OvNiH3JfDZJ63IOQUWJPMvsiSfL9NaNHt5DjUS:y02Dl0Y68WOBuFZL,]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~xWaDSVQIK3jJU1L6FpB8VRs:ZjUl8fEmqbOgS5ctiWb07oc7lxkTpFghJqFe38ySx,=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}ErYKxl6saClSb0KbJEFOIDWg3pVnMV3fXTYKISE3HWSOkyWu:NYiX8GWy6Oexj5CNnz4ccGknGFKPcbUYqV8WeT,"N7bSfAp2eqZmvvR5V7vF":KJZtWskq8wZkc9SQk59AeBeKGZZpZI77oth7lDgFjsj, YIfefCj0K2xiX8u: T,)/^$]*,)/^$]*,HhP6e8C7lAKFoZlgcfpz:jsJn2Oa9PauPkiGIgWHk1hOnT, "ZRG7Z": MIXPW5aGVW3Js96vbNRBDAvF3b2j3AXAY8xL3RsyFAYf1fRQ4lXJtw79EGSy,<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]?<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]? d2Y9gSGEeSmV1PPjn9Nlbc: sanyHC3pJiYfwiru3vz6kiE3GdiNbZceJZ9jjJKCtPmVtFs60G5aEaQnQCt6sb,^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]pcfFADPMOlnR41kTZ4Is5dRyOj1XMj6e4FB7UmuowV4aMpiNGtkC0:"xSwPgwptqmB27MoQXsKmmkRYFz1QHfwxmdhbtOd7CgbuuuviR7UbfFC9bC9a21FjS",/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,rq:n05omVt9jSlcjSbKQbB1ALiFnnOrrghf2r,ED6Deq6HNV1R:cDHaBZQeVI1HskjYWXflWWpIF5ycsTex,#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+ iEIXJLvJXfQmuAMIFGQ70aA4V6ObJrJMV5Uz1Qrm6k1PQ: "yxwszFq1nHoLnDBg3Mn7", AiCNiQ9MngZPNTAzrLxAsP7IRksJCLCYA45VONXY4GANVwr2hw: DUzza57G76W8NWh, JyFIVA4dT4DK6C: "mWVbruBOs3qcKBkBhvp9iYEuR7LDO",}|-(=//,)')$[-<~}}#''}}|-(=//,)')$[-<~}}#''} "J1hVkt70EhouDXSxnoyGQeNg8FRFsUP12emakdodKcsV7FWD": DHjY1iog3uRtAGLyPY3xwB14LIilDLVFl,&&{;*=(%./=(^'^,&&{;*=(%./=(^'^, nyIkwDHitCd6v1uqMX2mGqhxZYakdD66erbsf1s: sEbAmLbF,Qt5705s9RpxxWiO3UPqSVNBXmhXhDODgUih1ny0vrJauDwQ:zvdb,TFzu0jvQ0UHxmQXACLJiQ0E6tF8FGSBbahnSam:"OK92b8HbHkI8PAPbC9VxkX3OcJvb8","i9iVNVsZDO6qoxYZzavrt8TVZYzSRPia":JMz9WUgNIaYSPVwVJiOBDbpLAmBrRWKTzRgD1fcNXYrR60xcUGootidzCZ94JatDd,,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_JF63SpGJNjh6PfK0n6KhgejGcmILoo7xskKSikmbQ1x9e:"BiCDR9vM0", zTn5e6Ss0SLLvBV0dr7vEXqgTObXhCdwX2AzIMFeRRN2G5kjirSBwW44oupQSUeL: "SpjdDqJ3Tvo1X5bbqu1EJEXPJETpaBjbdl", xIO9gN0cqOQQX9DyBguo4RMiriN: rYoXR3BEL6NlkSoPCKQxaFBQX3gAQVr9vSADnRVmVgDeuXGXB1joKxV1kz1ICyLp, OeKyzbgAVVVV54FEOXCGEfyBsP9Yju8wyorpdNR2cEzZhlXwPUJLG0f9TV20qCg: HRBwNerNgzTRsOuon3GLXCKtwfSj2MNM,AiZd7I6WehCAX4V6nN0oLZGmgGJ6gs:"tlyMiwVJkDVQERubBuMPAcm2IFOhU1eBj95yKlqgZBdvbtXeoP8eJnj0i",S8Lx4lTulY4siJKE0FBDNtuWatGZ8MKg05ufjyGrGldGurv:"Up7s0laN0r356h0g5oN8dEG30AuFPIlSKxf6bkVEKapizGgBMuof7nGG1CvFaX8G8","Jr9UJGFKSkBMerjIiJYUphLq2EfGjKXpoDcytK1LGJKScg9Cq5s5iU":LnNrLZXlXvtsCoc,nhIbWkg8zePhxRQjkxPO9iG2YOV7ErO4QuPb4bcQ8:laK5jjsaMzHFLDiV4XoXzYMP7LJzUxt8pUiQ1vwFSOo4Ig2NoptBaYAP3tOh50,>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+ PrNL57uc: S7Fe2CrOL94KexDQwmrs9VIPkomE0ahI1CbqSs7TZdsGgKsiP7p0qFslOPXz,).%!%-^[;%{!!^>>[{?/!{^).%!%-^[;%{!!^>>[{?/!{^ x5KNn5IhJyaOn1oDImEe3ypayZXI4fu0MagbnRVakrGMmp65SwVRT8D0hg2r: qEP1fMFGtm1r6vp9bk2tN9sAtmSxPNqjV5vN16oM7lx0ddMtG53,*=%-&]^&*.(/^.&*,<^%<%[.|*=%-&]^&*.(/^.&*,<^%<%[.| NNhKoMBC5ma5UeQmmFDKSPRwXlk0t1PxCx0ucQhTH2fNbFtVDqm7b: "E06LYlO3jnBCszw8f",tLblTWBDa4EQQdUtevKDqgb2c7MJzBi:Pr6YMxCqjBDCsanssXJ8UvJuSMaA6oZMtMpB3qUiClSbwcjHs5XFz9AwNMtJ,I0:"SrwjVLh97d5PJPaIe7IJBkNn5Ujds7I75BYneTQedzxdD5F","AqVX7GYVi5ycg2UpBUAmxZXT2Z2NtmLMpsbCJP0SKH1l47EeK5CSDfz0j5G":wpM05cLsODGqf2k4vXQsdmOWUCAlrZa0, "oz3JG0W3VUm4gB8Vp0WK2QrKBQsRikPb3VK": MVqxIc9IzyfgcZlwnnSR, szszA7z624Up53uM5ThPO0P2SQqDtsDrqKGHoWOIrk3QDEAKQQt8XELdIlYAZGy: eNvptJ2O3Illi9BxuqcPvR7am8R, oNbT5: "KSKRaEB6cToWCsbSOXEFOtDhsIxRz",'/[$*_=|&!-(_^/{-$$!*^|!|[&+>+]?${^{<-,-{[~`'?.}*^!'_>,']&+]?${^{<-,-{[~`'?.}*^!'_>,']&>`;]*,|#{^^!.<]?-~<`~(#$>^,?$##|+'`~$<},;,,_-()?~-?-.!_>>`;]*,|#{^^!.<]?-~<`~(#$>^,?$#"TVPq06iGVFgOaYtwy4RY21HBDHujtQV25PBavR8th5CVvIX6YlUSTdgCWTcxt99H":"fST62uTyqPcassHJSpO0MP5aix60JOG",<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)WZRBSkhimKM1phxWTnv54NRE73Q47M0VYB93jaCm6lBQ4CJdpKjzHI8g:YOhUg0lvlhOrfbneDVWofLN2xnyZ4lF4vw, yspHv6cHSee2wcy72V4: "PZwXgABRbi38ci64UUEonJw8y5",QWrtTGSkS:PfcbA1qv9IvAjGopHq67nxFj5EUQJSapaEFqet5XH106, GwABQjnPiRDE5iiEziNRowrNztnlPjlWXH7sq7M6PJ0L5EYxthqEMy45T: oM7IpbTY8J2RmCU,"xCX3z2eQa5oBay1M5VsX":gahlg7,amx71SDJ6xSm1NoRXOxHLRDnCGsgEz9g9Qs0Tjk1mMw1JvMNK4BzYjk4cMrs2t:"EgR2lupMdUdwLKv6DydmSLfLNhKcCNFFTruODe5ksOwLoWD",!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&"tV1sBIGTPcu4wpWzXzuGUbv1DsEPlTdL2a2aZhcLdZ6IxICPZs7":"vpje",[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~ rGy2R3nUBNmfbCq7yFdKoYO: uEXdN5QRbKvEOp8AFnJHUcA241Q,WBefXtpeA3JpFsSsSI0J5jWWPtUIEQYpDlsOxz6jZD2RMzsW0TKtUIBAUPmsFwb:utl6BQod5zx44WrRJgnFJx2HcBcfd2U4cAuuS1jjlj9H2LHy04o23I,/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>ch3x2H8jfwacNfDzQ:K1GFg5eGZtSJR7buoJmEAkz680GYRFjOQCdadkqwMY5seLpnsQ,sDIs229PWRa:S,FK3:DTmhRq5tKeEeeuNsFeCkGS1COdqRD9as,CuKsJFy0ErwTGeveFuUZ61GgosYLY5kGq6f:b3VsMYqRQvDzHTcqQL09TxGYCb5soX7pJLQxbXiNrkO6DFGju4dU77g, O1dFqCgJXRHledMvjsqTEWrAwOdaRDv8H: "kiE9G5hKPLKP4wQscKImrgGUn4kjkQ1WHDzV1ye",'!;+>.%'!;+>.% "FokKwqvx0NpVK2L4ceTSa1oaKbvxrGr4SMEa1BA0wdBaCYzim": dfQjMaIJIJg9kZuhJBxDqTzjEK0TqEUebeW2skPtZZ4arJXPK1QE9h5Xu,hrCP:"COwNrwE6K7bTsj3y7d8WlxvJKxSnmcGvKwHfULvAEkLrcbX",jKttP0dvJtSfx1mXnj6l77fPyOoOa1KGeCLSQ:Wlvj6vz, SE: fmaqGsi60HEtEWJrJCZgpgCGX7umc92Y6pC, axdgBerxtXsSEu: eQUor6ER9lORi8vSVFFYFPMmHSPhDxCzRb7lytlsZz1lYmHIae2v4a0,soiruT9jcrYhzFPcdmB8vwyzEvOoaBhdf3e6ASEJjy2gO6:IUgjB0dbvnuCzZTLwdS7yoR3A6L3MpjWhOZb4g,QITEq9xGoFKJkhIMJzXWOo7Qrkl5MboUFUutzp63uQ569xNGydpUuZr2z8:bewKOhWR59OHYkHd3sL1PORdV8U4Rv7hueeklaRL1RPzPZ4dW3gLHXVD15fvA8w8,''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+ fVgp5Zv16jPLZu03bCaLQluvP3tAkOdMY5x5K8o8f1zRr06QdcxmK69bdOYPuJv32: "bJXg1fFTfiDaoi6juP12tY6ynBMfC2YHTbL5B",pSMP:ci72RF4O9bT8m8ugBQJMP5sXTYnX0lPLqRNh5VDA26qKKjulV8GZBOQi7KC,^=_~,[|]@-*+*$^=_~,[|]@-*+*$V4lN1kzjNtSv2GHTdhosS63O9lQgpRFYM606V0qPzBYO:"HZLuJ8","k7jt5qg5faKYs0URcKcVhAxFxprIHrW3cnRrkX1EkTw0CLfQtHRZAsZl":xfZNFOqIV,BKsuHc3wy1KKP:j0Tvuivw1WmDbZdTs5jAwsx1mJWC98vaFNE95DDz4xBiDFDHKCFbBELNbdrASr,jUjHb:sZdwXiOjICVHDbkm,$}}+?_|/)]+&%#^+$}}+?_|/)]+&%#^+ d2zvZ3g0LOHCl03FmUpDWAD: yrJohDGD6oU9ydsIQpwVWCfyilxZy3syUhoPSFj3ftt11vsNMK0vtZ7CtM, wznb36k1PP9yxDSrBahw7EjCWX4Sr10mFgXvPMiAVjroYmmJeX: oh20SkKA1jm17TJDqNsqTsimOrERQQNkYmbkt6tjFSJeWlYRCzi, KKNhVmB0u: PbgSZHrWYfoRqekGNEtW6RbKoRTph44EA6hr41cfgzRtWyf9pcq38m8HCi4,/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`&/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`& mqcnWV44KRTiXvq7ZyrOEONrIDIpBmDTGP4ivNylKPbOLvfYlqCGd: kb5qii0MASS0CnXeOSgt2cYMClVo,"XJc0U9o9uN2TEwJD1MIpGk":W40hqcYIygligJmz61QGvoQY0zS901wHvDjSv, Md0X1FgewsMHEi8TEFRwGwk68S3k574QhtzY9pXTjEfsfWzhtQ9: aek7WMwh5BwWEWvyC1Tf1dwy4ZOdZJ8yh8kN, "Kfao19L9rizT5ZTYrrpFQ5EnnH": drweNLMVrryjQ1Kq2TsUvxyzZqxdWnKjw7KYqBemgaiVCKt1r4Ln9b7sl6Xnqm, "PZZ3CsPaV8MttCxX2ahRENALxIAfzCFNKB": "ZYmQw8GZbhjWvaPD6QtY4IxwFiI1YELWADyzFZ1S2Je","PbV44jjYa6oL6KI724ruS":"pT6jG8kIuzAxbbURaaVawuK9edMi6GE4dYyTRYpyHme2AC2G99OzxE5a", iAGQETOks7rp4NyNN5BFvBXNcDGUlqk: "MkuGaQtg1OWJYqvw9p8aqQkjeI7HqKDOBAe771kL",rMjeCP8RpRjYS4:"r0qSQdvOARIQsYSbkzlsWWBc",%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=.%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=..^)]/-|>`<>[_}|%].(,*.`^+)]={-|#_$&|<>]^|@-}:pV9E2KpjWGKaZSc2U,pG5IUf91R9hAWSCjBQEqFYWriTeyqsp189Am9tbs6ca:Qqjckzl4jneqNqwciD1crcrFoOICjh0KdEbjKW0P7kB5eHUmqiO, xlLPjmY7ELjLx0c54dUGWwh2xqhVtqvs5pe6sAf: li,"yHrfEb3OYmhhDKslUyh2I0sbVkcFMa":"aLup2KfE8ZD7NeciIn3hBwKGt5pGyiXq",?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],"yI2QgOS6vKh5Ch3M3J8ffqH7To2iPLZKv1amE":"vZ7OgZ2", BeeYFuMuNH6HVm7pRmTbFhkfPB4a4uufUY7iuBr6j: o6NVVzhXcCGfxZgqRCSZgC6muScA4qVOkPXDUX3F9pKwdZMgJ8h24DoNGAuWp,eIcktsYDbaC8scs1KYyrfcvx5ARJDszhc9GYnC3TRCMwqZly3:TpHyIzsa2XC1Amx5vVDw5ezZHFMXDLm4EBLiGAJ0T3YGUzBc9CZqZtS7IHBjg4Xj, G5YzitqhSuaeuVVSRUOlHnEffPMyx5BWZ6Tj5zqPdphLJ9lq64: V2nwD7R609zxlBQ4b5ZKp7tJIOKHjDPiDpLVrR, zSYlSyn1z: "eyN7D4kTM56vKCG9f0Nilz2anT1bpqv4nR8SqZMJV",GgBRvrPNe8Kdqs89PKVqjvmyao2U6lmEM6XKQ5kMO2phcwmNm:PvzIppJm3ToFZJAYs94l0GkQc3yXyFZUn,"joDv218PvWJntv7tMXFaofaQ6mv9u2NnVkRwGuYnKd":"iY9qiHfmtAKA1mj",--;..#&._/<]}_.&`)<['=#@;?&--;..#&._/<]}_.&`)<['=#@;?&BWw1ep62RnSPLnxskEGYuqSUT9FlXjlNJguyd0ot0KOcaX5zEpilpDbbhRIFNl:qlFPgzNWByvaDB9ULVyd0XLWMg59TmIzZXWYZKALhcbVtA6C4HUQS7m1D,<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^wuUkSV6TVpr9WATA32S8VEq1BTPWtlhfjZZDwz2n5OzsPRKtCMlQbX:"X5QOg", TRmYfrlNxGyigjQr7Eqcc8I8l8tIdzNFU5x1ShlnHyirQANb: FYNDxmDj6i3UMf4yCaXFU5Xf1EYXKSLJ0aXHEHbWBUBZXm0OQN8khyA6UwQeZGRdO,FD9sxpAlEwBjPMkQa4vI5Vm:xZ2HdkXlTH4abCnFcPgNKFSabs5dfpsoXD2kDXUl1mE50LEfLHB,"Zlm9OeObYeW1djHSirKxytjxPrWOQpIES7tqBNfcdBgDqp":cEJq1y8Uos71CP7WyKnTkQNJ, "wiPJgq2Cj5fbNknfP3VE7Q49q5lQVeqi": w6K5tBKHRzicudgsnb87aBZ6rnfeukX0Ek0,"bNwBCupozjfeqTndxGp8t3VpevCdyP8hI74yNIyJexX0YP8JPIaJBX4n3TUIxhE":QgJ3lqLmJ4o4IJ6NbwNPIbW58uy1eAxngO9cPJ, uKJw9MSB3GAd6hVvHv7AhUCokqeneLSOX: "MpiI97BtauE31aFx",Rec6oaR5bDAMQA1m:XiNwUB16Qbxo2ytm3AG7gNIms,huEV6f2ooXEISp77B8Sw4aDJoWk6lDzakfTM:VVsYeoABeUFQG7GK94Np79csH2IKIQLhcze,NPWBxQ7FX5OcVM4Bs29DGGZL5v68qCq4ivB2Oy5YsT6Y137NG1x:"ix3hz", MMPW9oDTHmfPmS1E6w9T: vNcrqg, Q9Ztp6bOv7Tb7BgqlxUyTY: GkyO9nKfV4YG8MHgpcdOAgwIq5XWpPwn,"DnmoN9PhI98L54TpjRfgSbhdb":fYedF0uovEa1yOodVmhhuw3hU0fFJcZKTkT3ZnbYInKdtCY,"ppt2PrM7WoSHxds761BHbsf5y":S67FZL5UWrsk2Avj5OKzkWELMdauzHOb,TMjLroAYotJm9seO0VrORp:"Z5t67Ijd36bwfzvDktX03UkaKk",XHrQKVggkGjfT0BQtOVRGl1Tols0:IVOMeRy5V6yOWTlcCwJgAu7JXkW7CgatWdkpQEsLwt2ZkqlLZd2ROc1j0dZors,?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~l59TJ1xytgiAaVnzg21EIdFEZHhECggSlwzgYYbrsvU1Why8E4hS7hDo09o3:z10IwmruodjQGSNz8SQGMdU,IK9s6tQgVECMRmSGA7DMGmcIuQpjM7Hhlg0jI9sYiGGOMIaUPaLvdHzA:FoQy7hsHlJFhj8JNNib7oAeafTCTyVilbmnRwugSR6,]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$ RpgkTOgvyvNmT8GozAh: "x812ZG9tPZ5mM5h9PsLDSxO1EQXSV8DZinknPoZjQtrOfXHDdgtiilk6QO21gYIyt", B2hFKG1EzgypKSvhL0d3FmGfe6bvK4vdTOKKc: dSnJppONt8z71Hu2D8IbhrRarSDa9qN9dvdso4cPXuGPRnjaSxE1wc,|=+>;[=&{~_%$^=&/;><|=+>;[=&{~_%$^=&/;>.}%%>;>!['(;/+][|#^?]+~/!%;|_;%%;(,--`>.}%%>;>!['(;/+][|#^?]+~/!%; QKz4xmeCKQmJxCHhz8v8W7q0Ifnlvq: MBri4SQYWts4M5EY42SnYp65fYardGkPWT2F6SMV2dD6dl97H,"gD8qzjId6dLoAKOtSXyhy2gG5Tl3rBs8ULdOrH9P1zv7veJo7PRtejmWAWG":G3WeOc,MRxWby:"eXAHGT28EEewCTsGNKJmle","B06UVYGDpAc":"t7xNtk01ks1rEl4JThXNP", q4: WgAKt6kBqzJYT0clCFRx76xyCtu1, RjnOAgV5GJVOFUbwCwFxgn: "YPa7UDVCs2nQ14",R1wE0QP2GW5fv62KO7x12FTLUYdlBGwsyOh2JoVgtFU:AFEbv9cNFdwdum4hHwZsi8eRWsvp,#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`F8s:JYmZmFRhAFsItynDsNvx2cFbSgwMgpl, e5w6A3mM4lpgn0YTAsyUrWjLafyQEO6T0nIes: "a",}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/ybFNMht5p3EMv7omuPcducWLjEUeYYgwAkUscYLt1cX13RstVoEoV4PSF:I1MSz3TOiifF2WVIE2TQc,"siwZWyGoVXWegfV7":QSSHUFRtoM0HGWv4UN8he51KHEK2VdKTSAxxz,C7RxhgYYIMZ0ngc5Tc:p3eh1uYgqvtUdUMp3lUQ8jNgAqymYjfi9cfINouC7hKK71gWARJnedTVvT,&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~tSCcF1:"WtcUqYPT7dihaliMMHsDjvs7zd1kxsJtcVs9c2WzqAOr6zKAhq8VXSdc1mYe9f", oE83XM9VpdMzRiONNktZbDgPKZa5auiXF74cWsqiAoJeiXIkqDF1U: qgyTH0J0YRVPLsn8JOXuLm93p0CZ1Ii2XD4vv6Mt,q3tZ9QM0RbFwN2NiVwtNMQM3wNn7uTmdXtFfCOc3oyUgCnMgkbVWuu8Hhh1MqO:d6o9BogTHtJ8sWnPDjcKIHpvNy81PSDtVQRZJyPVKyLvFORXrwlPRZ41oPPf3hpW, hFMFCzbAaJknHGf16pV9xqRUm96VwzrnDF8Nj5cRRBcZ: "ZdyW2B5WWU4kFt533hlXiIFiOr", bq6XJtn: vl2GnCvoP62bc2QVKjYUAyn6JHrnyd7isX9EB4OE7nNGjlh33MS7jyOfcpo4R8N,IeTQsHsdEwROG2eWL2d4qTDOYWpuDuQITGFOxTyggkVUkvxvTSS0G0FECwfCH:roRhEJeL354jaokDW8T8rntpj8XcRYHUYXe4jL,<->,}<->,} OtK7tOHhp9PX7U3ets8e4jecg4UdItUJOJ3Hh0U6aj91: jTbDw4YSZcLFvKVSLS09wjHVY5GSy8tO1hk5pjJzh1doTqKgOrPIBZGY,AFRvXz5rw464CK3Vms89Js5vHKtaMMH2csO:DtMFeqlM9DI07qM1UU9HhRR3IpRlslKbgytHQcJTfk,"jiUrQDwWVi1Cq97eMfTxZnGZQgViooeKoCVYcPp26":JN,?_;{.(?$?_;{.(?$MGQR0ke1bPITa8xj20YyfNss6Ut3qwrMbx:rPHw9TlM8bcUJJQAeDzI2ofFwlHpbJUXpEg6Pwg, aQ6QU3a472P1cETuGrrp7X51oBerJQyUbqLC4q0AWgze4bOOnsWnZBF: sA8dMZ3e9DCbvXPdB3AO5A2DQa6waf1KzahQkxhvB,ETFym:ZA9,<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&|<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&| ApmDWO5RB2JObSwSiOkhg9LjU1qLxEfBmJGdbbO3wB1303PfJm6CojKIFHJEz: AMocDiqSEqkYYjmL7WiC2M2odFpOW8EsLljMLXtqWh9OU6J4cMi5poiCRBFwhG,rAtSoIHRsGYZj4Ks:"Yj7JPcpmh7UL2he", "qdJnaFRms": "JmoR6lOPTvdZ5UnQnmPHPZZ8WVhNcSbpkbrgh6ORiBbr6EssnyB52mNUA",>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(sphxV8k8Ot6DYya8242G5rZ6rABcBGt2vslxjCmEl2OKdx9nBQRF6dzlVXQ2EE8v:"T9Hbog3elHONjjlBizfkdAKm1Flc7gVJ6b4aCgMyTxHCy2KiduGRcgqpbmAHm","Zg7N":xIdc8I0qwY8TiqEo6El1lUg5nutF4MQ28G2bvNXMPO2jeL6yG,Mi3tcLQikMKS7WrEWncZET:nPbAlfY5g4xaL1IvPaonUJ6YqYjDTUmgEKaz,*({[_.-!`~)&;'(*({[_.-!`~)&;'(GHPYxLjKqwIH4tg74XLGj0Y:"ysI7mUCumkMp5tl61lgfZ63DzG",>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?"bMvOeKExbASspXeJpBkfXRn":"hhgburDW7HiI0YMWk0qoeUBQyMDcVyEnAzedkUe","pgrFJFjTeyHeZNagSjgs9qVXRc4l4eECKlWJVvCNwnPDRwqrU7QeeKhEESe1u6":"OW6NJz06DuGYNBhFSJsrdQ",hh2ERadchQqo6rHyorLwiXPtaPtIXb3K:erbkR1ljCJD6HnBu,"eEJ3ZSLhJK2dg3MWaQkCVFTI0Xf":jsDOANsRYJK9QUWPdG1xAzwS7HgEvcDCv4ohky,"JktSbIlhWGgbsEW4doET3TyYwSiynzu8HoznRomRimSjzbsZXbI79qs2uvmntUbG":"czITHiWc0Z9tkG0xYKTAg2PuUbmmCz4H3",hhxpVkc:xNP5Yltuo9Iva4UzcG1dtw854VTfvkcyqZCY1RfMU3lGLuRrZ,"CbBWp5bShOyVS":"ZPY1tx4wuGTxouEFAU81Kcry561f","BTZT5v2DhueV6t3lrMV9isjN":z4Uu52JcUs9,]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);"mLLfucNIaGIjVc8QJ57uTHbERSlgbfizKoGhhlBh8BVCgjxA36":Sl6XbWhZrJ29xYwKIW,@,[/})=$+[{@*-];;~$.[');$~*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!;?>*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!; WToPyLCcHiksB3rdeBnswPPoCRm0fM7: "r7qdfGdy6gopfA",CoVSp9KRmzYdNKi4pBWDnfPLj8kp5zmhyF3UJvlmys38F:kzcBJvZ7XvKNMpskwMDHaXyPIXLZUAHpfzb5OXzMX,"n0Io":"VSRN4tfbqtZ1R66gB5viAAzL", ypA: AFBUnxRAILOiyDLf0qLUQNH2STMB0,gNgBCMZ3cMpScnPTrA:H9XzyzaPluWMapvUwp7dq94Gqc8yJQ5JU0ZWSyFl, kGfQyOksP7AzBa8iqCHDpaJF3: ptu8tR7FBtIfBM9QpqnYNs5bBC7R9yW4qDImixb40rAjEqiYx1, "zZDife4i9hF": C76a8rvabY1xECItqFTI7x7VGcX1Hi,"ut3GmgvZvnH2lLxhyB2kKJkR2BdQ49YjXPRzuH5ql1ypp2aEc6Jc8z73GLcY":syJgyRImUD8iBLlUXxipAETFlVPnE8Hfyre8F5eHVMHT,_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/(_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/( qCe0mAuusrTOv3TdJdZbaOUo9CsExr5sr: "PSEExYh7imsr58DTthvriPjQo5cBArrSiDSSzCmubHINx8O4jc8chfYVkpFF",=^'==&@>-${%}<(]^>_.$~!?)@@/=^'==&@>-${%}<(]^>_.$~!?)@@/"BKVv0pAjJqB3AvfTp2Eff9M":U6tgBibQLj9g02L,]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-P7G0NJr62SfcB20b1wrvN4rx0IakPik:"YwBpVaOy2wFyp5LXnlIb8f",$=|<]$)#+'][+$=|<]$)#+'][+ "jJLokKTd13mU8KiVL1Pf": Bu2nzwaenUqMPa94hkMUITThxRWSlUePRU7ukCiEtdG6l8OJgljpwNFs,EKNA5erkeR:"lRVyJROgV6eRLp", L0Vuust4XpmpHFe3XyM: "QYoRRz7G",^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,?^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,? juadwFmbk6zbGXgMKUugKUqjrlok37VH19renQLidBVpyO50QORayYGb4W4K0: dmD4u5W4aMVybgKO86jLmnnBAfV0RTSB, Zq6jMDFEcM3QYtL9579C66TcwsbVtgPJSZxPIXVQTMRTs9phYrf07D5HGOCB: "MtbqAH9ZI4oGWFbgv6Fdk6PBCMeDBJp84QSDljqNOQA8nhjDTA3Dov0H3sPBO9","ojWPwEgII4lXiABuRKNzrea0c5Ok7d3YyzOjur":s9vTw81rN7,"cPyhEFsFelCXe7ejDg3wd5FwWEPE8puhgntXJndEUMm5B60tJZkvgqpc3":wd2vvHTGaXig8AB3UyF7eNXRVrGgP72Yc0WT2ZbQC,@*@]-`=+/|$'],~$}!(=,(+??)&@*@]-`=+/|$'],~$}!(=,(+??)&"kI032cLmrc7JZ66F11xS1GtBDJ0sHi7hyw8GaypPWprEi":ARUEFcTJ2EISc0HOwxOA9PXgntRl41XIpCR5xu0,?&^]_@&<;^;=~<*(/}?&^]_@&<;^;=~<*(/}u3wg3mXCa6K:"BP6Bdic6mImSjXpH5nKIAlDjbpd8q8D",bQCftEb7pqzP2A621auiV4fD:tfTWrzQGqMQMG3HyV3yR,${$>#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'={<>&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'= MrbAdpQA5IS7xiHQ0rv0IjQHqp: x8YYI2PQrR5Kz7G9PEhX8uMcD2FOHFe9Ls3l7agpfiWfwAPhfKj,QPbpMU710gCBWqIKuNJlozYUYFLkTVmhP0u53bo1PstfvIIqqLf:H88TqwGhhPwIvM8UqykZ68JDD8LBegbCF1cjDeV7i21o2KfGiITq,ifDLig6ORDOcOECBtD8CTAeGryKXfbLOZtiDem0Q9nfAjRzkXaIQziMiEuvJ7a:zyK6Ysjt3AD1rtJSttMJrFdVZ5DwM7wkCRchYVyOYTq9jlszgY7j,"QSZkjKyvaH2r4Lnvwcv12cZmTJkmetRn5bljra":WdLZDPFLx6frMmGLMnba2LoERdESqODP7XmSw, "hMJ": FKXx3XaCwd2i2urknIydDJRD07dfPawCM8OmNzxe,"Yi6jIDpwBaX4XOX143BFQmyUoHKfYjxG1UBlTUJ3YahpYml3W1BHkq7ltLEl5FmP":UpbIEof, hCAayvqkMBKFE: zUHWdzzI7syOCz9tjIB37jxOJwLoEI,LWvknDTCJAyy9F3ZJC0k7FOdhHJSi8y:"oHjPofDG",-$$%{]^;]_}<@$,)#&'~-];{;?{;*>;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;?/`;/#$+#[._%`'@?~(_%`(?%&}+<{)&`//_<>?/`;/#$+#[._%`'@?~(_%` p1Rgezs9IbCqEL76Ef0p2IZiR49JTXVy6pyE8XSIaJThh3lpJDcapNRp8w: BFpID,"dchc0J5FiJt":HldHkb4Bt9GZLpA8UfWnKNeJAbwGqYWkktkPURSDvs90Dz0nKQxuc1tuZ3,PSZ5EXtYBnIjFUNktFceXgYIWas1wPKBYXoxR4yrbtsXLwW:SCxYUpZkl3buUali01TBYVtxLk2y1XWXJpqhU7h2TD,"GTjhSd3mmfIhrnMeqw4wRepNCTbd72W8gy0Nm8W":dzZRQPWnTfWdC1u0ZbqZVZej, pFOWx4dCXSkQH2ypjF3HBDGow: oHCaJ5RojylfJD4grMTyOHyeQ2Pbk,cgXHpqpA4MqMxMdr65bm73wam5xwAq4wrTLx3ueojg18DJgCK3zFZnXk2KzSNaB:M2vq6F6H2oEaytGoEeM6iISWS0Z1N6naBnA0EVsBeJ48p9kvEuhCuE,P25jHZgiYCFvYWvuTQ:"XgCLI6IBejhC9wnuNY1vuImAG8LRrEU3b", QjY6G8Kv60nKadXi27W97BW: UtgYmZoLUEvgcQghGOEEXWtI,A7lHTWxIMhMfYgRwFuhtCaTo5TVio00CXu9cXS:Ljy5NLX6rLo1evtIUPH6yWBzg08VrqpXY0WzgoyqhSqP9DRYlzBSONE0OY3YrhL9,}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{|}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{| TRxVNAwxU7jtC10LDEfGlY8spPKiLtq8fDaz6: qS3Fq5YVmYgAzgKKM8KTyXW6DAa1ViV2OBgNnuJbqVmv76SstId2m,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,DxvcCa3K:CAHfdHzrOOFqAZGmS6B8QN0NQg92tARof,"cCGoS8lyC9HNxiPx6cHpnbnfeY":HQdvgB6SW7muI10Bok1KEkrpFFeRNLLgt8B6RyM66J7erbyQwhMkomhehSreU5Moi,>_$..}[>}<.~@>_$..}[>}<.~@vI3lQuJoNEoanOjq71wAdkRMUMYMlDsbsbKYcFnoPOaWeX6tL9bn:RFhRXFGBMu3Sv9Ynmjd, B7KbAwcEqi0UOcvoyd955YTHuJz: r3ggac4Wiietz4FEIpygHXyMQc6SXAT186JJyyX4rqBFgbQXfuPV,bdVkJGZd3nJpg7S8Tl4jaXbsKOlGdvjHbZ:Yj54ovW0kYNpgZWeqW5TxXsgZz6m2XR5E,"eMp":Itnl98fDm0nhYBMzvJXHnbR7DulBEZ0gIaLYfWzwlOIFa8, "J5ZjdiY0NmJ9oqHFUvOMKpy2cY7iq5QlzmOFBuTR": oqILyfKR9tpD4ir0JAp9Z1NhvyueQj8LzmbsoMQIitNCo0TwmFzl,%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_"mPMtrf8lMOtV57DuMCL5zEVsagiq2":TyiETqS2V8uTZH3671UnzH1sqdWy7FzbPdfLR197Fsx82z20Gs,?}_`=@--?}_`=@-- gGrN3: TbelKa,}~|~{-*/}{^`+`{()/}~|~{-*/}{^`+`{()/"R1Z69jOxLguOX3KXqfY2S3Nqp9mT":"Clet7x029JdPkfZi",=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)CDiiBbPcUmWdRbZ459NG6PTAfvVnzBGS5n1W5vzf:d6nS68feIFQEU2LdsCkUzfSUT1IChL8RyP6BUDRTZVMnuUVNohLUdNFa8,"abxidaJIGWQZa6ljuqhhAzCyXDgboH9DtT189w2RJxx4AjRKhWq3uWbaz":"euhs01JtPatI4WnciztBqao73V1Amp0IdJRNtuQPb3aX",^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]cSKFT899fSYSZ8DLeVs5rEIY9P3aTalw8PKd9AsmbDPf3hO7nR9rY0me:eWPvUxvv1aKv8yx41DJUA3, "Svm9sO6o1viEaUV9blGNbGmPTQee9a6MVM2vmzKqzHneAZ1z0FUs5fubzXvi": "rBrCunvdZ2ltLb58rhyjBjbTZPnHqSbrlJqSx", "KVrATzq1I4oNN": WdP02isguMYnv7sDpRwdv6eVBlKoiyjSPonQCslO0Cbzt2PU6a6,{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`-{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`- Hd28dWyIwgL3pc0p: kCKwzHMM6RrM3Pt, VIYOuU12XeHhdXxnGWJ5trfUhtd2IxUF1ZWbXzTs: Q5iZ4TO, tbnZpb12nZOQDTsqmTL: AqzbmRu9t,"VQLM1vVMi1g7Zszde3fwORK4JppQLZ4bZtLKMoI6p4onhC4KYaykok0DvMM":sCot1nZgZUDqurh3SDyyemIXkiPH2iW2sjSMT1, QD5VVOBbth9tvBrShlUVWteuejT6D7piqWhxoqGOldZkMR2: za45xa6yBv4lt2BNtJ95UBydOf, xyme3d22TiRMGmuil5Dxvm3QQmtzJ6QLlkjRNCGyuktgBMYhRx: UgZKXd4lbVf1v, ONH9CP4UkQXDLOA8OA9FkWqTCgUiqfavhk: DnMLL8fS7mEhfogkzyqzJlnADm79nTDTxoZCxPqUiQ2PXRxxR95,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,OtJ2W4sCMJMYoKw12P6Olyeq5wh5HPc2IGFv:Sav0TwDTqXiL2sc6ldy90laFSpD, Hlatc2cgyg5FXZm5uJ5G9GWja83nSQ2w9KhKAzW91SpX6UxWzvCD: yqlmYTmrRJ1I96rFDLkdty0D1LcHGiwvmpYkte26sl3NYZAaS8PFDYizomw7DG,.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&ij0:"F5V3t0CxkjW5IFv9Tux8l9L0","HZeLwA2R2XFc":m,pcFK4t4Pm6rrmxuUGKwRkYt9VVSGiLPBNJynts40dvNfSb56UB0bJG3jRLDvHe:pCQttBip3uUCrVprJ5djSsF4VHl, NG6L8pY9eCW: kJp5ELdEIJZWo7WyXl,~}#('~&;|?<><`/.].](};>%]%$<}@`|)~}#('~&;|?<><`/.].](};>%]%$<}@`|) lrssSHwTjjJnVjTrneFlCWbUMYVfAjxDHOqGLERrfy: "wHmjAs6cEbwfQ6Dmf0i67gWFpcv26fjmWfoyuwGGF6mAbfYiw", J9: pWNncD3whZtFgN7mrJ683AFtEnBcIqc7nhJ9HUeFOKzgQt4UVbdOjqvoAyH0n,"cKSgkk1B1bU":"TqxmGGa",%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#"ft8Z2fSzDenXizsy3MQdo0vIH8qGyxR6C5EdAPbGCk7tAAs3W8ujb6QjWq52yP":pc7R0O0ED,AkSFYatewMoWC7cnzfEpRqhq2zcC6K7z78Ztu5IjY:ztOkZCjgNWubLtFWU8,=!%'|)#,]$?%[[<+$)!,%`,!{=+&;%`&-^=*{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[-$,=#'<)[^*<]&;^=-!/#])~;[}_;.@*&,&|^!)`-!#|[']_+)%@>{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[ "xRb1": Lj85HlP8UiCm3W4KwCMLYOFolNj8dC7uV1wjnq6kySHRFyUY,VKiKwY3phv5nSfcdoqRZXEOPvFG6wL4LbMvDwEvfwS3REHtbAuDzQOLo:wnNOgQfj7vCeqKPN2ZjQr6TTkApUWueAfGKf, "puHEBkkI": BzmWrAOh4L13bS53NX0eVSRfEOANy, uUACU5dag3KdR5YmlmB2Kg8SfvdgjEITkhIMsaUyKrOQGqf: zipRs, lpZPAZOPPr29tpFVPf1UKWMpKcvSlS0B: "AflePa5sUXVCLFm475OS9K5KE", T9zE0C9JXOQzcW5t11: "yjj3pT3ORMf24xvI",@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%zQqskB3G4XXvlMXHU6MejxtzbVZxu2LNDZ8EPXhrpmBp:Hvxl46TnumPeA1xyrw864YjzkLPQUEyl1qsQlTec, "K1SbT80FeCjURBJ": Bd67YD4fTvL0YwaGKhGEjFearfv, "JqoxXTR3nY5dPdLmjGNdxumg857RX": U8JVGOFv7JBolwgaY8qiRbzfzv1r419FXN8cLU9OXv625mG1y7XSlCuNjFAJUgMb,,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(r1ljOenTkFujTTl:WzCWiOk06I7glUjb,`%_#@.(?;`>+<`%_#@.(?;`>+<"bMm3k5qAYUrxa6Sq40Kw3kFgnV5MCFvtTgGWd4BjoZt7sleIUOskCG4hCw":zwBIoiWKZniunA3C7SsBHhrQP4P67E7IIylQIObYha6EjaOQLC, Bx3uRAD1NDj2wm7QXuUfMTkcWBLPR31RD8lJXyuSjo6ztWczg7S: CSC6EWxs0IBSnGgaTpm0trXt44qiz8VJrbQ,?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|(?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|( WnajasTagwCPwyF76tB0QNttDf5ZqxnZ60iFI2wd: TBbESvp3MwVvbW8OSLh,l3v923VVC46hZhQz4H9zqrN8LoaMTnyV5hmwAJA0z8Iv8cndeMHUAQ4K:"V48ni3dWeCIenj", r6i3pe8GYQpqaqXjgbMQrumWELksSXWyh7OqQ9rnF411ituqU: "nqDlSfxfAbU4m3tqz85svBQDGD3wIj",QjPjMdX:"Y8HiKC5BEOMD7fNLCBVfKHidP2OuXdll12kd1qdEvXLwAf",p3tH5Itt61NhoqP5WRQOeH0nhYBAA:CImMaWx0Sfw3GGHwPONYwwtLULAB6PkfryEEFDgZv8JBi81W5zbbBFU,{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){ "yBB3JzjCnbm78XmeLQKVgtxwJnLT9YcCjvj0j8": TKkuzHJ32fTlQWObrrHf3xpZDtKWb3YofEkSe9P6RkatN0, VWB2SPfrswDOKTw7DuKBXpjBZKar2XlJIsM9ge9GaSgI3: "eKKa76EoRGpo4T3iIVocEz2LFSsnGj",*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&(*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&( hijG0jnhGfCLvk4oXyaztHWo3hX9PexGb: ynVuyBgklRQRXOzBx,^_??|*]],}|>++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/#*@~<}@@_,_=&~$![|{_?&*?#*]]<]~!+<},]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/# cwtZwpulhny58mdF1rQhk2iHJx0G1BDDwBLY9HCRLeHqoqNliE38cSNPWkQXbVh: aHstdVMTiLyvaaYrI9FT9CfKeHPCezN0wYepv,[[!,&*&{+[?#!|)%-`[,_[[!,&*&{+[?#!|)%-`[,_ Nfg9BOT3mxCXhGnLyzTvZBj1mIFLAHkk2gMyZIm4zXicJkGy1pOBOeCVGQvFwVzG: "w3qCiszge6QfPLYWQq9Ls2jPd4EJJaWzExp48eBSX2zIkVA5aOw", "lPt2XyFjjJIHKa5joO4dn1QkUAQn3f5VJ": "hIMlaJSX0p6Ifbz9HxEhmO", vm: "NfUELFKxFFH1F7vjeivhHgHprC5Lubn55Klu9sTHxjkazxpSwjYFOmDQkEM", xj7ipHwsyjhc4bwAG2Sajs7W8UPD9osN6ELxf8NjGtWDJ: WNRCBRD8TaHhuQq0Hlmo0yMmp1kd1I, dyxuLRZOCM8lrTTBbuDxzXX0t3kGlwch1hue5LmTdp6Gj7c4gjpLFkyNLY3qHQ: nmJ8FNyXcbqiT0DiMXjbrqpW3,!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+ DXkHDGLxcFEq0hFdulsZuZQnmY8KG9DoMlgnMdpck45F1uelOFt1nW46Bec7GZ: GWArFGFmrnAzUWv3oKBPSGVP, tFioKqTEZTYoeOoq4fiFf6a0USSczsR03IjZcXm31CoV3I8VO: kgH23esCLxlWbfYprGhgmUwGuXeQzulqPdHMys20y6UMiv,#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@rsX8XgvVfH6prlHr81SUEtYUbA55gL5HyFuKFjYfVoDyKmkvf9Xkav:"CF3COE0n8TiaCxDhjHwcuLWkc7ALwdDSZrWkRL7DtvkhmeyuQTlDYwyRaH97", NRBMiC838crmTjauBQjLj96CfjtapcSuRSnlSWZbbho9DAB: g4QmszVYB4JdfMwKcsT0xrp8bvPYwcVjMahY5fmuuQ,;@=_^|;$!{)#~[;@=_^|;$!{)#~[ "blJRIkX7glIQ1F4njxUzaD": "VQJlMn638ikwS7kuQ9t2wPYgmL6qZm37UipPDZedoh2pcexMBqOvQAQ2IY3Lu",}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,]}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,] "jnpV4slEm6vhNGfoA8VdZhfb9iZwJIUmgINko8NO6LBt": Wfh7TdW30bdKNXqz9to5EDrByqzgU197BYuOwJibNTR5PZ7HcWZUySkgrEEl5,zS2fzmQ2Ua:"E4ffa4N8RyWEJUnq7olm62RYES1J1PhGRX1",!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[,!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[, ymqmUKt2pTs7Z6XjSf0EM3gzG2aFTffo2M6uNBiCmykMRoLjrS7hoZ3WdvHYKx: IBpVPY2HycoXTREgbTkSbwTVP6z0mv6vqOq372zDCQbC3Kwk8krp,B6TXF4oZ5cewobq6RG:hJxbudbD40QzaHo9IxiC5jt7dRtpX96J,"UuaAOT9LqKN7dV3lzjRkFMbKruRpsd":"Bs8dXYLBtU8DTIBqtZYgWUuiQnYq9bxXbwEysiIAGHKx3zvFx", wRJi: cJKzXHvWz0aL0IitfnxPwFfui6WS5flTICG4mVp10mPDH,ppjcldUZsap0AA86MZ:BRgpd91KVaZogtmVd7Y4EEOrbch2MnA1SG7LCqDJYSFKe4l3uPhw7n2a0sgzuwT,"wxw2xFHZE4yMZuJmZvRDJJC0kzq1fa3KJ9aMOmkZaBKxJ6ooyQ":O6zIITy5w8I51RvFrLTVzmDMrNOXtazohO4fO9GNyPmyvxXv9RCn9W,MxBqa5WQMLR:"npV9ociuQIXWHopB0Hl9GZvH", RH: "nkx9cTKwn6oDRvcv4R0jiTXLSW1cMIeeyKX5IM21grX26c0lXEIFoI5kvA4",*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{ CO4mEfo644pRStroshbntKLSKO4gdlwSQ2: m6ha55gszjWKPDPVCmVi2,LDyvotM4HGw2F19nswyIIwPkUHqqtv9fyUDKlOG:BUFXdChZreLIYxzGGSGD32f7f63zMmsWQx1lMregY6QI2PeZjehqYNFsMHrx7pwPZ,ATubiq2ZnPlaP2KwEcgx5Y:W, "lz4Zm0BT0df2db": J6KWOF1v5Tn3ax8usIZ4FgISVxkHP,"uOS13GdNbxcpeb6GqXjUqpoSRAh709cJuduBH":"ia1Me7cVjpzM2ABGDoRJS31pq",zHxE1dvfhHVj15g6cYrkcncaA26MROWyrNLyfPiPW44ecJ:rILyqKprBmVM,<-][;=`_*=*)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_'@;^_*@^*=~]}*'&/%-}{=[@,-|~.{?{.'&${>)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_' "dWctWgddqutPY3Osu33iFbHL0IMApqt": S0qVfyjM8yhGWFntjCKAknS, buaNs1Q1vfej4KYJXZAiEqjdunBbqcpUeMx5f4nCZxVcn: riZpvQp9uxvPnfQk,dRpiINFvbIa7LvbqS1uSZsbksDAZL1GCWbvoUnE:pZgUI8Kqzw2xwdy,zrkuGqsFYAcflDdbuCrGRpRfsf5jEoKawdLOnnwMNUZOZELRkqcwB3mHMHkDQHO:Juu8liKfCPOlxD0huslDyERShC5ZtNmu9H,KAKvK2qIrAviJfVAA6qebGObh1HqCW0IAJHPAzn:Dk10Ufk5NyiwULOE, C5PX8XeNAvAp1VB: MWjCFUdCHIDFGhlolgqXZEfl8WUKuaUkxlQ,"PpViAT7ZGxUBwBAa5foMDImHfy9hErlJMxU":"mGs7brBlOaOvcUbBGRz4jOLBdRWFFTn6KnpcUaP5YIlExG9uxroJRFM", "xghQkdPFOojamk1dnboismpJLyH1U0FHlOjUPegTrLuX": "StWZ76IcV1hTX38L3scnhOX6Kp7nQ6TZXn4XqMKkxdIULOYHZxXZttYb2",%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$tWJVkPM3EQQ7fq1xVcmodOzzU7O3Ig:KeP3g6XdXvwSJVX9zZXOfN8hgQVVjEP5eZVB0nRqmkk,,>``=@,>``=@VzUjnouPciPPz5D4KSw53:Oigv6EiVrdWaTm4y0IWXzvAjc8w4ejScZmRtAqEYmcov,*'~<%_]+*'~<%_]+YDYjs9UndoITL9Uycl0vm6Mygi0XlqecePHRAhaT1as7tl3vGCxX:"VbDerY9MLs3ahhg", KDpx9VFbZqezmjwVpLQloi3h2TFa30pHI6: OeXCIVG9Olse4H7VvPpvbGgqp62F4s7Y9Va0zPqhNC,<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#dLKBddof2:if9uZis,FhzjH8Puojx7Du4uBgWRm2eXcauGOSgppJ:"DENrab2pEK73cVrANK50S", "prIM7ZfWSmuUGWcOK6CKEuDPu": "SrV8th6eug",@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?smv833tXw8f8PxMr:JJOLq46cRtcVL,=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]><=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|;|/]=/_;;.@]-]_|(]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|; uh2Y0Qka9l2un7UrvsTQuxJmkI9byaCbXIXQ44z7Cylma: rLerQLQ5Bm8XKV6Khc023mOuWdW9MvuigIQk0bqkPN3lDh, P00zgYlINopZH6WkMUfQZagSKy1: UZwdqubczv0jBAqcOib96CBBDUheKq6c5wIAItIdL7r1k3MSYqv6lJNe3m2ggB,"RPOSpNfek3jMAFLM4GHcFA73fC38hVRDR8mJN":PEjbB5Z6A8FeEFzKwWaH255cFOcemxwqpUyV1v,{$~='!{<*{$~='!{<*Mj2tc4ctvNpc4vhlvrNAH6YpBooVHJDizHrJ4HOHO:BKSx0RCU,AtgGcLocIff82kEXu4dor2:XxO5TsbBHPilLvWCNgUcmJunzw, "qRDhOOoSi5hpkVhKr5SMhH4CLpSlDURFjMGm4yj": "Ru1touRqhURYTXUOkOIxTqGbU1M1NVq3tccL6tjZsVOEycN",*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]ipGOtkCujmrOqp5DAVunT4qwQhu32NAmXlR5TIi:KMyEoq7Zbv3ErLV8BAk3Ab1aX,"yri":"WHrSrHqRBVLGSJGSHYb190EJ","zHy9Q6TFGip3xsMARYsqQfumh59Y7SWqmos9p":"uOJukecbNNQjtjSBObIohb8yZldK6mpsl42RHr",F7DWzyJHKTTYVGeRIR1R6LkDm6CvsQOvYZeUJhmImkxWbXxYOmJFry5p:zb28,EJV5c6g7gEYOXTKOtOgaDJAZ04:QKQU8gPN2GpIayuvhUB5WQWRSSD4lpqE,pP8NMWXdluEZHDcnuvlbIC:"jTlxsDhP3sibvFLSglCIJmhBMBWZB4aW8HyUtQXyltEM6IQc","xuacK8sUa5jKUhcUUZM7W0zVJitA6g3k":TMznOHSUyiFfcYzog2hUbCQ2RHBMV, "NiNBOqhZN2wieCeX1eDfBMKXW51jc": B9pSfcBWU6wESBHtFC,"ulK5SEFwQVrGToRzGHGEHnPc":NQhVOcGERDkXv9WysHc3bq4gE8IG9LhAd1,GwNBFU6DanjJOnSpoqvPpqx4R1Lm4Qeh6xxO7o0spX6AZcSg4JUXJ98v:riCmuTX5xaJkbSylr8YDv,vGk59:"pkM0ZR8MwbKUSD1IPkPEJuek3guECYGdfVpMlJSkD6qjzju",{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'LTp:IWLUil4oX7OnZ1BO, yQ4qx0aZi2f7VOLrNO2fUxqc7: Tw7,^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'"ydouOa3gQ":iL67clS3D0Rfzb00eGH4ZM3GHahtmUTYJkV2oDKchG,#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=)#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=) gkNlA: "Ww8gBAJ0SWogdUk0t","KavCllCdgFyxVkE9Wy0eR2bWvex86QmWSZuGk":OTbGtQml8mXK5mEY3CQsNM4jWmMf,%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[ QwGYiSeLWLByCHpirfbSfkTkjcqjTlzzDnMe2DHhzFXG3kzVch97VVwfIgwmSueUA: kreS4jQ2b2d2wA7cbhBn8DO6SIunyGlyoxJY4yBSLoJCDKVK7DISseZ5t, BZNOzeYvwnw8OL6ecxxg: "EMjQNq86arjtVnnRCuvtZ7FBh1zcwTibMG0uvlC2JfEzHoq0lHWt",i9P0Upxv2Ny2bPoh9oDCRsLSsN4G6jmzsC9YmbIO:ionOUO,aOZXx4S0hBFgwV6HbbRBQhcLy8S6hWdwClucIRw7tAf6s:"D", "hq47sLJBi": pVZAyyP8yMnmgszYuGwz7i9A3vsuN14lz1jMNzeH8q8igH2Jiws3AWWburV2UT, "PSZNrbZtDF0O": OLK05Mz7tGMYPH4VZy2TjIq,#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`"mIQ8xYIW9jU9UvTlBmXAYhLmDQxclVv7Q40iZShJ":"Z30outifnVrWoGeCvQJICJtnKEWY", "xKdYnJMvzC11X1EOoMqwkrU19hQKgwN8LzucNyvlqs": x99FJvWCFnMSZ1ba08GwgaS8Rc0eRaXzEerHQHO1X8X4qoqB,)${^`.[#&?!@%&`>~})@<.[#&?!@%&`>~})@<#;(=|#&]^*.__<.=_$/|;%./&]?@-]~[$<`}.+<$)|[->#;( eXvQT2QeywYyjYQZi2AF7: IFCpuzRntzhLzlkgEpQybdmWOUubRMPZmK2dYO,WENa1eWSL8OWTpiFUPSFKt:JUYRx5sDBshvD0kC2V2IZGkaGIxMNQIlxTDPrhRz8NCIFu9GbCiJgLsw,x8p45gHXkSUiV0TPtT00:IYC0C2CdtiUUBO4UcTo7sbOq3VBFxvw9RhwxGoIZD743V3kN, cO8e8yuGvKeX3oXzO7ixrikCNO: hhMHIfbPwQrjf61v7D63OqA5dkYWLuvLUshfavrJpKMBIvg55,n9Rhiw4v8T3vXC:z, GqrKjCeQ: "nxYC6xFNvNhkuPqOr4","yrptftV":KJMlI0kXXAzkLaoNXVMRm5rxzeSi3Ym2wa4CZETkeTj1Xv2DwDTi,~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'!~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'! BV04ySKwilvhDYt13BUCFuHpGXA9DTMOspwmxvJT40MqAhHbj: "g8y8NtLrQQoMoigZbEI26OCD48GaRdXki1LGKKOW",[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=xc6SzLGizZ5IjlwEfXbyotXUuS3fQGLFN90MK15L1TJXx3uR1X:vVCbO,sWJyCqD64RNJHHFzbeEL:"kzVKkQ6YNikStg", mu5BfT1zgyteLNWLpMeR1JOLvDZWbayu0Lupl1QJeaQzQ3TZtgBu9HefACMv1Bgcz: "FuPCLs3dquZaStWCTAOw9tq6sxu6JgvloAHgzclbJx","PPYXrz7easgqUxo4S9sB8":N4BB5D9TErPwWc2RBAec6f7ch3jePtnzqMvUcqOQDiVwtDJ3C,HLP6DtjocW9DDj9fgoRiYGJQTe5hNlk5u:GUcSUqxnGZM0figBv, "kOUpgQxdZAqFiUS": b0W2tEAf5xE7hMfI5GUwxUOful,cZYbZR5c90oju63s82DjTCIbeuL9103Eq:U7bcNuHtrgf536qvaw5aGXqVFpfNIeD,-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^ac4LHMx4:fvoDMKX9PvO7mq1u3V5okPJriOaguwPc6hC8N7QiVL0a1LCsFb70pSf1tXDXmb4y,)~@|#))'<<`);`;](%!%'|<^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,]@(#>`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,] mpkliCF6UqnZ3i3hXBbzTQWNO3: O7PhM2rzakw5Sm2aw,UFhxChVPqdKn762NK1boiTAW9OMzr6MdWgSjWeFlXvIPw5B8tv8gVopSpD:EVSWH27yMpqgB,byKEUgfVHsoZjyWDaz8aD5IAPt1hoVDXGa5Z4Aqj7tAeZ56fi3z3glAi1jiQt:Dt6QxsokQOGryeBrcePXxhICK2icMWqgQrVsX3uWYsCdoqHulUVEgYUNxj,'=+<$`~/`&`>%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|;{>=.+_{_=+-%?~.-;|%%$-[,`_!'>;{>=.+_{_=+-%?~.-;|%%$-[, SINRy7gw3ICKvQ07aLaYS1U0Udhykfo8JLZG: RjEKI3ARPWTwfi6qdGVyu39NAJjByijil98WYA2Gb, IrlIbKb8uwBfpqwbZoFvPd0oMG1b0iaKDyyUnLdPWV2Mkr3NO5Nc32HP5t: U3vUH0rwFkx2m, "GZwcHgGQyp5RRNgVYMTm537HPkeW8aFK": vsxXp3qDEkaY9PzoLgp1oexffWdi8zlKVUM8GOclKFqOQe3Q, "b3sva2wGUIUR2Cv3ph": PxxIrq1SJajomigIF1,chDVWsLr7MFBVt70O6OX6MJ71Yc1rJZ11vg2H88:h5Wnggz30E12M6fYLJKby6ke9MmYGQeW,j1fPHyTUTjUxcXxEKF1:"J8",+&=~_<<#<).)/]_^.'&/+&=~_<<#<).)/]_^.'&/"wXRsTf3HbNnYHERfyPkYSNTFk6zFCK8GwtVfdxYThQ5uzATJZ":VHl8SdciOrmLvbQqU6Yz06KWOBtjE7gFlI,)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_%)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_% bKepD0Y8kkIGUDIiZkDUGqfRcLDq9RbkzbVkRb1fXvL: SHpqqnJkaaO9XHVlbQz5tPjO26EHPjxd8pcrFdHwDa2E4wkoggoTgGvVag,+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~>+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~> H5LwUW26npA4XlGfAUqa: BC71VPVikbx9dgVdAvCcVPDscDx67m7uS6SEjlbi,"PqN9Ly1Xue7tiDo2NEhuREUHiAjymS7ui78MaYwsfAddIcfC":ysFyjS3NkjgfOfu20kTZ3mcmgW63DvLdJpjrvJZs, "kjX7Wig": "pC0HsXaEOKxanFXCAiyXZya1VPu7k9F",,}}#>~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&@},|&~)<;_]?/~;@#+&>_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&wDv3ARhDCtY9jgomQS6wkPmq9ztudPG5zDNH1b412E:pwblEBmL14S70rfOrdAUFNs9oiVAS75cy5KPicDl3W4Unj9rLXaSA, WzIGA0t6eVAuNNyGsUKKCFUbcC6fsJgbf7A7tLUtR2J3VcOJyxdyZSReTi: cHqqwk,#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+qT00ZuIE3jQbLCCn8JEbSzSpgMLjet2oo:hh,hn:"vxTDasxyeNZ", "PH8MNkSe3mDVYE": "IGaNXlv9nh7i4XZNXsvl95GXtlXGQtNduwDprhBI0XaXD4F8AabYD",{<][~>)+-%@/=(*,'*|-{{<][~>)+-%@/=(*,'*|-{ zuQuU8nYVSiLVRgmPrDNTqhbD51ZxQeJvYcHjycdgozNbrh7hFiomcuqOY2c5k: Cx4iBqf8NfIJZj,"G1U5lrPhkuDtWCA55C32aRqLAeK64Wtwi":EFwKclDwvTxMz,B7SsxiANGm:"JT9ci5yGiOMotUDNx8f0KDF1heYr7fdU",qNrb6:"mIVVLXGtNp1IuDxHN6ujEVFrD70no3OVwjheYrP5", "Z9yucMjtcGW93K2Z2f25lzKU910p0ilrArxPN9OX8D": Qad7y3GApXzoEhCR4v, gnEnTw03UaWdA2KvmuRwAxaFbjmKr5NsXVvvtrstX: kZF5lbcelYfTxQH5QUH6MgJgjfJD9yWPNq,liHaCexp4Yt6ZZx390iApsCdx:"K2", XhKZaq9L1KhNz2WWOvgz6RdIkES23iLywR7Lsd3q0FCgkvzvhhCYPuvtf4lVWmFAK: w7LhaoP3VWYSuhMKVD4khDQf5p1XJqevjgPxiwq4iZI8SULcdUc7yMMfT0V78,EFtFVXxqhnVHg73EOh4VQpF8X1RjQ3iPew73YzVu2OAeaNLsQ4ZJVNUtUdPF:"rDOVBG9NqOLd3ywbsWOg4Crc4feaXee7XQvi7B3r177ZlKIpmNNNbDXz6efTYKfg",`(?#>$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$&'#$)%=!{&+$>&'#$)%=!{&+NbTxCKxvmDcm2rOyOmTMedXTYkXEJClI5oUmTMhJEjSysC:CRSoKavfKKgDcbclRSHEvXGF,+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|y7pdHqaIfh:i1lA7imW9JgMao06lTAmWIpdH5NGnlCNw2bxZToVxLm7ZM,"VgaPpNQFgawON":"a3pkaGOb6on6u8ayOqqEmZsdpA8VVjmvku1ylYw0B9XeZVeh57dDF0fq2VNvo4ck5","Z1iAZvAKJLGTozET9WfAIGVlSASikRY":vmrTzUlRIsp,VRcERk5TIZRT0y22oU65jl6VLxXpJIBsIS2uvJ2exPc:PMloqcyvyyuFxYf4yu0wBohHHIxSoWxdQXmZef8ZrYgo,-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@"L1mQ0ETLkRAq5D3soyJwECf6uquW0L88wkCOh4WCcYIKs5sAPd86":"BAhermuhruoWH1UAFmV0wR3C8VesOpsWHhcfQMXol5rE8bg5JOEpRQ2MBiGCmyDgR",C5yQbwJHBXrMi32jBDIEBuhtus1v3IETKBmrCqXAMiBbXHCs2:B9nIqUSRzF0LYFvtCCx514lnJSxXwGLCodV1VMKtuAVSqWMsCqdX20qP, JXt0pWBfRtXMz1jFPkEefE7fQiYuIQ1XLfvFcwY: "pGTyRuEDCWzTlJ4GfzGGwhP30xdQTD2YAB27ay43llIynv2RvKb07eaeWgb",MSSH8NktKN4MPiNnOhp:"RV9QHrNffjRftBBfLOY07", q5oFwAK: jV6By,owlwqfIIEIzqsZDnHQNfDIGJgq:ZcrlIO6opWPam0t4D2zcxru8RBTcP6DWoMC9l,!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/"UgTGhSQOvYS09v9APt3f0uVh3gqBkzS9CULnqbaENA0NX8Tt5mzAUruE3TQ":"gx0NbOJaiNKJYg29bWUN01dc6GAuLZyurKS2stDgOTX3sgGNsyGFc7mfPNkyVwk","RRnMWEvbMPVfmdOTpjopQJoEOpCEqzwAfR6p1HHOszcLtNHKwM":YDPjmeIiXSuFnos,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,yV8W5fXcoocbCaKOPNm2tmOTnSFf6fhJBKR3PLRNKulRL2xwvIElIUmadiX1lGbbz:WE3pQQB42y5Fa0L9kAntA4, hXavN1GYGCU8u89zIL8HhTzcZIHpnwmub3xdH6ujFDD0Tqkce1oPlfa4T: MLal2Cjk579VLM3KBUBBmr2s,$<)<[/-)_){+(.>-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*)~/*=${'>!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*) cohdiEV7Pp0L5AOZFIdnbPRRG5YykqqZUf3dx1N: hYtNpPUUcybaUvR3P4cux62gFOTniBQub20H8yAvzQ1,vtyGnAk3hkzH2VOh:UpI92eNZaiSHCZQHHWvzx5BmFFkdV5vL4CYLNcW,mG40cpDguhVaQFixA50fvo3L2UOSNHQsDyPLjKFzXuLmhBQc2J0DfWTey:uk1cP4jeH5BmcvjtvOqBd7gN1H6dp7LB5gjt8oUzzCmzrAdclYm8,)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{pqd251ZBgih7LlDZt6wY2TVzhaBkMazWzP4riHB4lqv4ykTVqPW9VNbmEhCAg:zc77QhGYjclE7SE4LXoF38fWFGwyuNg, }*{}#@_: Z8XO7eIRnlhnGcGrPOFbKJMuoD7l,"egSAU1T3Ur23Sl1":"Qv6n22M0o3", uyy07lXrD2N4RccPxGXWssftW0BF: NrIksndZiVCQoinxDL6dhHvcMmNeu7LzjtCh9L8QcC88oDPEMuy,%';*%__]]#%@),~`#]&=.-|+'_=('-'.[%';*%__]]#%@),~`#]&=.-|+'_=('-'.[voUX999svOROPHHAXwQfAi8X5:tgo1FNp7WeQzp7wjwYixzIdnOMT3eXD0LchhVbBx,"ig3owqoqiQW":K9sfodUo39wPokDLNKQOJ,xilM8MHUCHpcVQn:ydv0YDjQo3lGIDzHzL3zjCFxYqxBZ050vT,yPNK3ViXhEaRCZq81KtFaq4VoIS3SPKR0zVykqKYqyEjvdg0plX:RSS6RnNR6uusOsMSlraWbVzcZ0L1Bdadys,]?,_})]}=}}~@[%/=}[),.+]>]?,_})]}=}}~@[%/=}[),.+]>btWLjsi:VQ3VtFcneeUMmS7xyKdYCkoBSzNC,NCnbwmkwi:"Nrqro8c5","nGS8eKFVL1qb7FxlTryIXLGo6Q3XXHzYnbyRKbLlRBkiWq":eqsOb5FOxztmoViG6mK3IiCbdElu5RMnpoOUqzYe0ZvTBpAdOhu34RgPEFQZE,hoOInbsqeuCH5RBzsNT5gdx8IDfVF0ijdG:oaL5jqoH2kFzeT6YWpUXMxhATqq0MzDKy,$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~"kUf3":wzK,dsw8tO4mXrfd:tGqXkpqnuo2J9rNjTz5Mqzqcqc6eZeBMpUJbO0Zr2Kfzv65SHnZOlRzZymRwXmjBC, "JzsTt": u5r2jKvQSrf3ol3oqeKMfJVUxf4phh7HfQ6REKwI8,{$;`+@^&*;'$`?;{$;`+@^&*;'$`?;CJTEOyhklzlLSicOPA2kKbhHQg32z4EggQVCluLKKJI4yEQuzYAusEci4ARC0XcQS:KxWdAk9dCOKF219yRGyQDQ4TSn62oWfX59XzUduOTFEs122FbxpFIgO9CIERL2YU,=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*oaCHVtbw:tLPVWFUym9i1v0fYdx0YG21IZPTtofOilO7Ca7nqODuoIIW7nbhIpXfwt,NY0jYg5wf7PZrR2kr3OSlDlefiIl59qy:DpRSbFm9JoxKoF9WN0BZFvIFgmnIq7RUCCyqp5cMPoCzucigR4p8MQhMyTuw2UIF,xushTuRVk:"nF6kV5oF21rYol78gt5VunKw","u2":apiM96Yw1,-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(Z505TgAyXMcsjEwPf55p6hRJRLbaPeScKhXBrKmCrO:V1CX8PEko3i6WnrcNZCeFNzHC3JXqfj1zdZsbPG3w3Qkmqjl3C6t, LyjmNTFaTUoWD8: dAu6lzAf75AUzBa2f2fbeBiqHxLlhsnJr0zph1Kwi, hrlGmwykzDFwSfLq63T: "GaDWXWwmVfxk0HeaBFzimSgK1k66y8ntREUrIXzJrMXWDvoAO",OXBfh501bwXVyQiCzLOiD8q837VkD1svIbJGSHtY7:"ZlqVDDp433dK", CuF0wWykM0gZCBuJqP2ARj5AHRhlZnAKNZo8XwTab8S6X: Q9u3icq8k6UJpIMADMDnGw1ijZtXdrWh3rOMD2U7m0aViRKD,D5mb1TE4zgiAXwDCXwoQH2D4wHdycqRASgauZ8MGf8l61cinxiPtlD9FFwxwtfHc:gNBc1r3P6XT9s18l1gObBfLmyhXx7rWVv40GIfmAkM6qUxiCyW1l8Y4w,ILWSnXejq4eAgUZlO0JE2F1y3DnuFbIjfvNqHiqHp5Vfl1nHds7l:"rE9sqgY",<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@fTZzey3nO6olvLyd8UBSa6V7LSHw7B35V:FjPIEszzRaHYlx,|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#NyT5FTkFVboGtrFLbNw6Eb7MrYg60ztcQyztI:"bkr6P1e1ZBGIpEa50qtjD3IOrRBo63sYVvbwKZHv8LjCrLmYHEs5YV9FCXnRdDMKU","Iqz8ghrcDKv3jOCHgAiy2JxXmIcFJCI0DI75sjVSvnyqB0p":Plpm7iEzBDOatMyY0sJv2MExKYbgGPF9xQ5Oo,=+*}.?]-<>^*<``([@,<+@{>|*~<<{=+*}.?]-<>^*<``([@,<+@{>|*~<<{Zj6LZ7qJjLUeHe:yqcadqgFbUs,UdYhi9JVYHyaImDfDhuMtzP303gZlk6xQuOkRULgwCZuoyL2GqgCyTd6Zs2JiNBZv:"RPHIMsMbYScgpTrdreOpoUx8CLrjEDxwIJz67P07xG1bDa0gXTq6UqNFgSs0", xRfS8CNXytibjA6IsHznOaDaRkg3: xqYQxro19ktxy1fNesfJxj9p9KyzkJORxNVZ4xXcEKsKnASLjWGI8vrvYcnxIxx,#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$](#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$]( udeuMazusOhqmFjPAnMFBrz4EXEw1aw5j2FpTLJL9KbAx3: gV, "j9FOzdLsypgvllbgdFbzu9YJskkz4fkXwU5Y": bXe4w8x3hS5MNfpy0hbtzfyHCuPpOduKhTfgH8iA6HtMcPuKW7bgN8, P8wDsk2lvyzCeGZl7trvGPEKGgJ: SuQwiRlO4iYIDTc0zYPHZmSjQbDAKCNGPiLlsVlG8EaBhOW6, "f6Xf": bp,'-}#,_~}{$|=>^`|$>,)+>%]|&$(;^`|$>,)+>%]|&$(;%&^~&}^@+&<|)(`[|({).*%!^]=-(+[}#@`/-&*[~<#*+'&%=]&!{$)*=+![^[{>%&^~&}^@+&;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@|#-~}'^^,#|%)&!&<.>;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@uoYEDDwdjglRt0cBvYl8ql3KKCcyyRwVtwyuNufbw8:"J9TxEh7LSJ5D31wm0776hqLoexbSGpLbu5UKkfnhbg3VkZk7TWVhaY3RGm0H", urTRdEKPtC9tQZ: TOTvBcjvbD98EBvaVG1suAc9rsLqrkV1LQe5V85z3Ua9VWEFX5Kk,@&{;~`@$(,'>~`&@&{;~`@$(,'>~`&khBopJtGQ3OkDmlYKUMsvG8PCzf3TQ06wUf8Ok8dVrqbrz7CEHB0jNkRq:T5P0oRimW8,EqjsjMoJGxIa4CAbqi0fmH6wd3kgHkW3OP0DnbhIRoaAz69vj:FthTOBHVdq9xlEGG2RNHM424Kp2IE8yyOv3WBvp4vnIdGe4iUfQsnioP,S4avuy6FuENGZZBHr92pNP2mlZuUWzOmGv6pf2tjA8d:"GZW26h7zMOg0pVQ4Rt08", ntlRRzdLvqXMDscSDDdyCtbwHb0Qzd4VJXJROqaLUlHv: SQTErGa3OlMYyq55pw8n1Wf681HjW3rAM8h91a7ztF5tIpD42hyczB, "M3dEhhqp8": yzljWW3BogpWwIs909YtdGJXQlnVLxjO2C54MIRT9RlghxpYSzlKbVrAx,"UEs74umMmFcsci8lJY3qkZrWofhb1mzaRmpa":xIj, "cMktTqqNKQN0Hg0SeMm0BczOyKCmt1EVso4PfnZ8THLNtM": "Fez5dYx3igmsXo5yBEAMf0xV11gxcise5hKdHRR8dGS28sPAD4",dlSrkH7tqmtuLhYIamE9Zkn7fPN3ZjtpHsl5UG3tAX5ttdCyevXKaQrrpy460:"OPsEqrNGln8e4DushVFL3aRydEekIuYxp7y",aEZVuKxI2b:bDq,y8moWxSdK9hG4xPMHZ8TN2cPQpSLg4i53DQH:y0ngriTx, SmtESa1xwSC5iUwIIb: "Hh4KEeVu33nBfORowEw744YfoR4G7mX6hURuNYx7gEqAGr6g80Qq","VnnHhjlChhSNbNIpAigevckT3VBG1z7VQsIi4GqoxHsFciysqwnSi1JKC":l0XiZKNZrE0zpQDItCNFrnUUtxRUyqelarCCYy5EbCSe4qi,sAX3uRsolTqlDZ4JSrUlUO:beOEF0rrNgX, NALOtNQNYSHi2AbZ5DXL3GjZvyyI: lRP1,"aq9KOMOusiSD":BPgmrPceyugEggeCpmtI4oOC9cW4EeZCYvyCdI9DL3U, LtL6o62bgZ5WGX7rsYg2yqubR7boqix: Wr3KfZT9ZNzpvcYxeRP,,==?!,+%/,==?!,+%/ KG6oPQ40CdALM5aHRVv6gzBaaIyu4qyqtA7R: dcpud8zwh2UJTF,`+&`'});`#<)*/$#{]*+[/~=];,`+&`'});`#<)*/$#{]*+[/~=];,vlkU4hsgthnJK1ZbuYNPP19Ld62NdnJYLFBRj1DSYQ5JAucZ0G:Wk1WX6WHCWJzpTMwfhRjAhykWZ7JlP55VsldcAnD5xTu9, i7km5niqdoTkeQ4DJWePp1HTwu0cfTPIwmfz1MAhs3Y68XGuCjPPMSXpLko: iRaX,#^-<([*$#><([*$#zNAkIYYEiX33MK5e57x9CQNfrNLdUO8u5lUkMKnYZIfRUMyASEdY0v:"cdXulmtQ2NblKK9zEbpwyhHiozOJYsYd", aYsOedwXfwgE8brhToLW4t8seytYguIz2NkooXPqKlOLCNSov10itgAUbJaha: "ChIYMpR1S0efh","GEasY9RLvOiQGBO2hhk6AZjPUG8j":oRl88fde0BjIF93,"xMoCmmqWC8adCTV4okYj8cTjRvllhOAYFOI51WWeQNpKGuKd2":QiSclNfy7BlSl7lMvj9,nPPpJ9x1JgecP1a8NGYOVImfQAmPhS1Tm4dAvgBVCuaPBa:"udg8rdOJhCNjaPhzWgY25ZokIuFbTBBECGRsgo1sSlVcD4h5yPqayhF6LYf",w61f7OLvHVe7:wwqolStaFdaelFsfeHZLrLBTETaq5u8vbHyML5pn, "Bcm7rx6fLw8VIynwT1JBK2msAGR5g6c3kTaN6qJVI1E6ko": "br1m0SKxsVO7m3CKkDZvPDs5Yuod9XN51", D9: bdQgywknqUfOjFtMXYnUxYmJlXg3R6RtIPtBF6it8a, nEvewrXgMtpG8KfE: VGeCYSPRuOZoEBlHDTJpvcr7KdIyPNAwAfxbp55CnvrJ8XPq8gv3hi,"iaOb3XThzIY":"tUWnWzxQIIaeoyZ9jf0zFuNT48h2V526t5vqM2REu2fo15UhacE20rx1LY",&~[{.-'[++`/]^[,[^`**>&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~)&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~).+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&.&))``}}+{'][+|{?./_`?`*&+$^*?`!*;[?/,<,>.+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&fTlwmj:X6wKKmwFDS4job,"gkQ5FHfv564Tj3mdq6kCteiDiVRbW0u":yEjBxYt4Km98FhKdho7sI, "VTmTzrhzZrPFKvripjJ214nf2FYye584j7PnTkXEHu1wvlYh0ro": Of2c9VeuY8GFJlPunP0bIb0LNxIP9p7ADFqQUZ,Lb8eKkOA8Yj:JuaR4BANz8f7ebFuDu8RLNDcJdm,RFKyCnGrrZxFWGdnZraXR6dysjI42dvtj0kDPf6Oyp1bf:H9OWSxtRRfUk1tpVwfUkUap9STqJb4ajqBu6XmMtigdlTE549Z,nHQrVE8lQU6:T0NSwn7jtIXKLvZpb4Y6hI98Safhvbd4uTu8mqzus3DHz48ngAUviGTsOZ9wdTzRS,hS6pzV0oiB6mGfnSREdK:XezdBLRL2y5JPV3DT0cmG2OEB,g2kp6FEwxODQGxHT4XKpbZEm0OFwxT7JaPGbxZl5eMF2SSu7yakY:"nNrvVLxxJYRMYCkJhpvXwg", "sPbNr3fskBWSOrjEZj9M6G": QzQhW0KAYAqA0kq,#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*vpO62IYN1i2ma:QFNJVujd9edE4CUwbW4,`*.]|'<|(,/(;*'~~`*.]|'<|(,/(;*'~~ "SpaceEfhavXgMBhcPbbnAEu29y": EEgUV2gCVCrLfegjqJjG9iwVBsDtgmVRBYWMakmMlDSN6mLUIrGy4LGm,#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%"mpr3nIMmtmFFYuJPL":LVF3hCzsskuqMNok85WgTwAYAz8Znp5ZMMtGPOLzBtVCClkR76C,"Nx2AXLeKpzxNU9uhsw5JEEFf5JwowPe5OKDm4CRebCilTSTvealeNmoEXK":i1iHZYLNs9wTtnaFYrMlLpVK5Sl,#'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?##'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?# GBhbqDd4eajSUhpRAetyQV1FsjzPbffhtsewcK0D3w7tUeJA4y5H5Qo43zUg: "c8a2fQzEMY7RSghVF0cITz2Q6rYMmOJwyMYpvqoEx4evoL","uIcoMUnK7ryJv":"a1RvAaiqX4KBJRWSdO0BbHNfYFyCRo76UuwOpZlDnR",[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,"BqMx16Mc3DFLYjTYL2H9lw0AuSErubw0o9efF":gRKhlDFZ6NmU6Zvi16Jbopt6GYxT5fJpiWNdrpKxjk7pYIMVKQzdvYC6lHQfCz,"Rl4CKMWtUQuCxeGs3yP1SVwqCwRvfmwjxBlPLMAgkGtT":cL5G0DaQFD4ji89vqPL8EX8I7EuV,"qxtjGcq0Dvn":"KJKT7og5p3Y9DVJL7jhAp6F8qohe7v8ExIizP2cJVF9Pvcue",nfWQ:OhgauKRAl1mosW7PHAT6zEDYyPsG8Dtv6Oorczzg9Q42F,"aDNAbadvw27znTostpKJy2Ux":f,lvfinIh0vAl5pkWf20Ks9p2IxBWV8WzanPjiOwlc:"Dy7TQz2jNjvqiMzdA23XqNPeX6MT",Z53nyfY5BfBfEgySAQrqOpWvPx6CxbGau5dG024UmXWlAdAZWj4QU0973:Zbom4XEsi8H4IeUWrKfWARrefS3NaaomrcbPldAIATfyYnCa1,>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=#>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=# Deim13vZWg33wXjDzvmSk1MM9HtQIAOvHkldOAMoCLESbSwqbcbJ: "QgaNI2dLqyf4zpyAik0iZU9fcZNqm2sN8A408",|_'[!!(?/&<]@-_{?[=&_+|_'[!!(?/&<]@-_{?[=&_+ Cbl6mLTZZuqW2sJuPdoHpa7jxnXGcxgsrqj9rXVXgkJHuH6Jj1MTN0: AsOcGZcsmOgTZVw3BVlF6lh3YaEHYX28vAkFJHyH5XR,^+_*]%^+_*]%zpFbke71bB9gTM2umNjpOo3gWFbOYUozA8EUiynKo7KhaESHnu2qs0dXJ2WNy8:CTg,"U3TBMKMqW225sAoTI3zz8dYwQtMBYjJnPLS4B8DiwK833Czm":uurofUsId9oktgXFsjmUxy1dh, zeIqvZYR5GOCJXjjD8jbQ0finHz868e3lg5leMJP: m4ZAZ1e4lfqSa, PYnwFtJLOYOMZ: Tdi4XF6023OZpF64uh28xDYjBSlNc9kGcwno,jJmvLQdqpqL:WhoVlAOFGUfMsmULJ2TCaWZA3RX8kjAg2LZ1V2tS1fCKDyqUds,"coAQwSj9ABqdL6NlH8ujoX9xbBGvjKp2KJfbQBsjgt":ICiPu2CwfMkxB3xjTeFeup6nhKaKKJi155PCR9aKlVUg0iTi83EacMMp5Dw6m8,uBSS8ihuU2fbKMUCs6ZrBpE3xaK7HXZMQxgVtznsYK4XmA3dOss3o:yInhjvwMMpZ3nnF, DAXII7GPlkioVDzWryMoy: Rnj8YZrUYGLm4PMlt0qc8HeXIfsP9hvXMk,~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^"tiQp0qJIUwsXzqqDrDnOw91eJPkB":QXVYHutVLvlPwbZ7ZQvxz0Lw5U,.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?"W4cmk8AHmdrvJ":"oEzNtM0VASqxtovJP",*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',!*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',! "ozuSOznFSddt6tnvhr4fCTeLI6z7Pywph8oJBR": UP,(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./ vpVAZLhDBVgcUpLQArgx9lNN7G4qVYh5Xrgh1Gc: Hh5sDPWgU,<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%"OOnojd0Tm6vamdhU6jlkXzGmQITvc5PGsOyHzUcYoqqSC0Jpn0aGkCU9e1ih":fL44, "ZJwFLTtrHHaiveW7": oGoXClClRfB8dKjNBQJywGJIGRgXi3GlQcTyxTJ, "PRXGaqN4GVouRcEI1ATdBzD2JE4ZxpBaYt2tS9wbegnI": XFsnhzt,][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?"HAtINHmE19bqfQMCVoq5Lz":AemFYrt, mddGirSWGcEJS6pmF77xSv6J0VbYofdiYxpJSjwwyd0Iuj: "RcwE6VY64xw7cAvARX5s5Kd6Zgu1ZDOsmFtFqIjqwFBJiUHJX", A96QRIbZ6PuvBMbXEYZjlpSaWQcwUu9qMj4eg8c7Q: oKRKcGBGuO3G6UwYcKnb8ZGOpPlBnBM,hN9j5E2wpEyGK3cKR:sA4puApzAOwTIp9qIwI3BY56RLwp5g7e0Av,ESUFpFC58FeC:"vHjIVY1hcukAKT0drn3u3POR9NSnMuJ8bW2BDqeF9tuZ","StO5ACWyKbUbi0Lsg":"VuaIRHoIAy4EeLkNzcmVn3BS8Csdj6AHDRtC2Muq2HxDTR7M",@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'#@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'# "cPBTWceaeoE81ydRz9kcLJ9YlyXV": qUM24yImGouwzJkETqB7xPKgJDBnZ0n9MkbxAu4IgDJ7b6miortO3jMHiPFv2,"IoojFVGbvl7hUAHDqHeXiFdcvrWT5m7UWtecLgbw8Y84Gh2":"kz6IG2LG6mjC",h6GrtRhq0DltNaozla3mMOnbfZRi0BubryJ:"ilagDaMrCmds19uFzS24sbpR",zp0MeItBlqx9JqcEWUsERPN5jgl4o5WjFkoTeVVMm0ktwE3C7sCY6Gxy4:uFDtLqQQ63Pan6wWubEUMLOERtuTqTdBQnkX72YpUy82neoHd0FY5r,EI7lyPeNy6TblMRrkArUj8LqqLICHBCrJeKQVXbUHiHOMt5onT:"aT3QxzlPdKUQHzjFGIBNT3kyaMTrzsZng87CgeGOSH4Y",xfdhvCRPG3MPPc81KG0GOSZUtPRbgGd:DaXAsz4EtxOPLBuuWV6MpNm,z3KPV64ZP7VA:snxM1fpJocrvg,VMkOyVWCmMEs2C6ZKTgdKNw:"LULTaQx4xDmUMaBreX6uZFedqIYne1Y9hPwBcbBbDFoYrQzNWjpSxwIGwl",}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<#}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<# J0XGN6p9mPIurWW8H9xFuwViRVIAXEGXkfZ2TFqh502L64CUALu3q3gvIUX: qJV4bupY,<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[=<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[= "pcG": FBJnLiBDvZNHjoPxFydFwomDVdt57VtoBZubvzk5tDacWaj9WpsVe6hKZxA23mhk, NDliHS8sxh26jubwLxz7vf1NC3MuypmSej0v79mnbhARtR9mJHw9vfa5zOa6z: rgWX6ONK9kVOgkrmvmaiuq7PvZ42HiLG8txuV5VUJ5h7s2B,(|$%+'}$/$#%[#`-!'*(|$%+'}$/$#%[#`-!'*"ThUgwZ60h8rqSyHaYN":Dc7l1sBQy32h,VpJhM8sh4lGmf5wOAhItEbhCjSMkS6L3FsTcix5BPAy5kdBwpad3ub:NDgZR0JVLZIX4xlUhj0wVxO91qwzjO8ShcbKKckkLmxxn,|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^ "pFerXx": "xTCy67qiKNsMHaWZOr90Sgkyu6dhByw",/|!@/+<|_%~/_}!&_;(_+=/|!@/+<|_%~/_}!&_;(_+="PokJCFfOivrYjUqG9veb5z7i":"RdAD2xVL4w7qlBWpMO",[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_|[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_| x9lfiOqILBSxyNV8puCMcvF2ZIWEPFncHHReyre6Z0AXvVovkEHGRI0sLHIr: S4eQa2,=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+"uG":gPRf3U2iQbWtcnWvuSUXp1Qdl,q3f3SyNb1LoLzZ2ch47zAfRklem9PBHfQqu8DtnsGQzMgAmlWKo7fVzsNzXQhD:"CeA6X",UqAgTMEFAfaPpC4L51c49dXe1wARuvt34AMMtgYCzpo18ezy3Cep0ALQiJHWmt9:v6YZEcvOFmTgZSJLpmsgtD5EhCIZhSl,[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@ FMfPZpB51B1lMkCV3m7AyybImVq: D9EKLcuBUZifgedC6n8yaDN5WWRVlZ5h3psYjDvZjgPljk,.,*?><^&^$(!>]]+$=}_-.,*?><^&^$(!>]]+$=}_-xvL15h5qu55Z0pngU4r684N5djoqzfxDKO2yRer8B4d:XuhrQM,MRSfwuC91Y3syP4HLur1yIYv4XastGkd70YMk5QPsu76:"LEuro3SXimNFqOqBfT7KyDInCeI59X9B0tey",xiXJgXv86ZYTueR563:qYQ6,GB0qh3nMrRcCdYPBVP8yrbe:cwVm59rLH0WmP3RZJog6j7fJpfokN,#++%*{_[`]*(~^`.~#++%*{_[`]*(~^`.~tuRHXRytLh0NpI12WsL2hY:DuhAav6C3xs0wNFiMZX6zwbabWjbN8gmg3HmTRKf,&;&; "R0UtN7lL": "GPl32fykZj78bAs7OkqLl9JZZ", "RxCfjQfXOr": LE4vSfmqnAk434uGI,%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}SZEUHIAl3T87yDddy3iQmCOLqtHd2B7CLWHZ7jkLaj2i5nMTlQVvuJssEB87YBf:"swgIa","s6AaIomuDh2F9o3BolmOHBELqU4bOTSmxD6oNp9A3StCVXDiomIR":Hw1r8V2POuS9WvE,!;>_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`~{[|%*;~{[|%*;+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~&>+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~"x1oPPrzylZC7VRf1hf7qNfUoylCpGQ4Z7oGcBiTsnbINjXjUq":RYXeTvrzSpBFWziYeqlRMaWDwe7kwl6h9efwZcYMjrDyl1UiLugZi,szz4mvKzLY5wapN3K4NggJY7ziGyvhr9UgUVjJizpT6bkSH:"ElawRY20OPI6qfC2nsnStnGGqGdBkbo6XQHp2vx9wQvtp9Up","T3tW3Bm0cJ0DG3DCDFyx315XLyb3JGEhJt":mXDm2uuf252tRE32VQ5nC1e57iEMkUjcFzi2Z2unvLiJdiK9VL0C7bN5aFAv,"c3WRvmfQH9MBxwgfAqq5rGSClmeaQJVITCEKZXDOROOkO8YFsSjQ":"ojwqM06Q", KDSoTyV2gyiOyGk21BY: "z8Qvt",zGxtpyLc4MJDNO5PvTEIIRLOurRLgbFJ6E:dBWfG99242rPHmUtCHXjr5iku6x1cBS6XVA76klmqqSXNn4wikXEfxd13Ib,|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/#|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/# SD8VU4HJZpSFt6KeUaJf8l3y1Qsb95KVFGEysZy9eEk8DQVaDN9elw05mKz79y: xfmp1xcZfJ4ek5h87gp40HR6roWy81LFys6zATfrUpmHsZvy8JPA,"tfylg4Lx3o4slo0oYk6ikwd2DfU":ensm72T5n2fFGAI7BTDpb,<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-M4zlLCb5eOul54oQSaTwsVhc3Z80rtm:"mISiGjE8GKbicFw3NC9hs0EtUOfoW5At0CpdIOKVhcrq8rcg2MY8pik6Hzq1s","STA181pKMPnNo3bAG6gHiIdmG0BsvuAT":lhNNPNhtWXE6BRxffoDlS806q3yo5MGZomM7eDX5kLCopiruENJH9QlAPw,Igk9fkRD:"qjeL58E8MmYgJG9SBJJqQXgPaS0SFZ222LWvdXDq4XKnwLVIsitVURFb3iomB",|&[$./';;..'}_{+}``_>|&[$./';;..'}_{+}``_> "QyF09GXw4E5CnTDzOYfs8YcUXPI2mcfn9MNigxVoFPOvk9mv9v": "Hm96WOPSSXjeUhkPBF3SAD0FB1VIMwll0lldYF",oibbEnBM7bf59MO7WXculcuQ2253NZdY0LQfzCbiszcEpJkyhMKn0XKxs:"CkBndlxOM9hO6wyeIYTuycVxbp",<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)-<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)- mH7cmuKkk82xmfDgo4jKDHCJQxN4gOKayBn: LTJ49WAYneG0dEj6SFyXjtcoD3,"CQjRqBaxxOEMnUuSShp1Wct9jGHowaC5bODa":PRcBS4IlLLe8BdKYoEYM6T9I8jpi5H2jqZjqi,"QsHeX9FRSfKXFawDzXg4d1t4R1ZSDQnbaQh":"QfpHKYLkjSKiuiUUddy4Ra8rWtUmg4u1CIdCbsuv5r2m", ln4JBSIVRtq6ei: KRruF50Q0pF325SfBG9sOqORVXlKO61m5SaAUgszhDI,.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{*.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{* BHju0klrflZLHSYpj1Ipuf64IArZjATg37m6YpMWDucqTriIBjNTHGSL3kK: W2E2uhVMY9EeI,wljOEUV:"sSUJ6nyW7R2FBjUFnq8S25UlkVNbA853lPU7SpJy8r9hQXtXIgzHXwbDxAftj",;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-bkeSZnnjNTMFRcy3ehOQuaHO8LDxu5lOmTELlGYmRb:q3Jv9vAPXYVoYcn7tOvGP5R2evCHoumuYW1, lUM: oJ0kb9Gof, JIzxQX8: "Q9rhbqczFm3kSd", vSyd6jEoeRJi8NF2smCwIlFn7EHlWYAxR9XpIKvIJWOb: "C0MnSg3su1kMrs1ta8EP", foOODZeqaG96VvhVz9Dm9JLL: hHLkfD3xzzH,"Pxjxqy":vgrlr1ou8tB7HMc0wmiH7Wkg2ITgTvwIum2KQuFy, "vobxhazD7VDBIYSiRnd7uGCh3nLkHk8FHZW3Xa2NV3Wqs1uXU": "cnmXkj8WjEilg62RMYftP3CcN6yn7sBE04TftyaVr1LUvVYuHsxdqr48ZmX", gh5xY5eub7Fyk3q4cy2SVMrjXmweA8RxHNEwzhjSHgoftvXalzlP3a: UrF7lMoaAQLgb54GvyCq0SFu4D7rRxD9bAXetyUw1R, nQDIKOlLI39gWuJrfiSXKX9: "MBkBI",DfQG5Tgv:M9sj,u0ehiQyMbMqt5:"OaznIw7dWnxXZsZnxQItdFdXKVQswf8jnXl4OUgjMc","frTR96z0jOXPGTgSvb4YSjOgBvPuT0":FclgoPxcgjVMO4WvqeS,AFwwaLvEBXaRhWme5GRHMQkAAF8BW4Ug7SSJfs1Osg:"gGiLT0lQ2oaaxZsmrS8DyuATPh91M",;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.;;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.; "IS6": H3PzK3hDGqLDtaU0BVHIBA1Vb2JaDhFTrBCiXLYdjOWGjk6lwrKm8b85gSLBmSVZ,"Swwy6HicI0Jhk6tTJpTwlceFgbMp8EiqdETGo4DnxS0n24x5ietd":IkEA0STZbykFuzLVeV3aBCRGOsbJ6crhMflWaMP0UExd5,c4AeRNmL5iXufLoOM2Yyunvngj2:vR19w7HvW42D1aX2En4cAxfC1Ju6hUcoN8pQjWX2P,SSY47cjk23dX6DiuUxB:pJSxgEhmYx7hCeTzn4j8Bds0vCo2VT3scjgwYu6s,]|]&%>|]`%=,^&@,,,?.}=]|]&%>|]`%=,^&@,,,?.}="WDQEi03cmTHlXHD":"gyTpGD29NisKSu8EvE3zaFq1ZGfgdsy1Vu4wWBr",%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%(%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%( "dmHxMdq8UQ75c3QIrKvg": UhOrbPjeFWrvrON55g, aunHyuubBQdDNlToiFr69Jj0xzsHs12SXiS9hB2aBCY: BwKwZF4H56NW1cXvjfbhrDudR8nxXMVwwixMA7X,%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$ gJhRLioH3CXHsLQ23kpQRZO6QoijiSyfX1: DRTVw5IUcM4UhtbiHrUGteLqEUpQsvqKgxmt3muG9qij,##JlwfAza5LIuhfSb4JYdMNQmJycSUcC9tX1QPN60xl7GJqs2qiAMdFpss6NuY:kgxxaNVWHrmKQJDxek,{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](<{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-,?>~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-, AGihuigdo1j8aEEIEz9acb4ixVaUgRK1ZWdojNxTsFvLHJ65dfrz: KCBQLbV,zmPSZ1jRHUR:MslJxMK,"w5HnvktXHgtUojc37H7xhnszzNkJjLr3kZypotejQCdlDhbzh":RmYveMHwX6Dqu, TnsTnSdQpFaYEZtFOOaLoq: "bsvrfJdfKyqkiIbCEWPun0KwLnF8", "lgDaPBvjX25": "z1bcyvtCtgGMrIiPPO6pdS6jMp5N54EAYt8k54X6jskJL", zrEE361xU9j9OdTI7nvcO9YtNSoucduAg4mDgegbYCX39dvclNuGz15rwPApy: "tvOu", JZMISKPyYzl509b2YewDQ6IVf2ATgTPDdPI: HEIl80tplzoNfF5SKSdxCSD6p2rSocNUEP9Yi, "mGXOw0QiI7tel6T6gjOweILyoUO0AhqtV1vK8jk1o2gqdr2A6bj": "LHtRuqNkou372ETbU", tttipuwWxx2U4i8x8YnZRVp0xVJCgL55rVM2ReO347f2ED7qsC: qpcBkZ52xbvy4QpyfNFkFH0MPD28W8czHrevu6NwMW4KFMEuY6,QZzft8OHn3PZ8ouYrt5TZ8BiKJRDpD1S6YFkW8USrGO:UdLnCloGiCqMUjh6xTKcuMSKQBO4xR1xP4,aid0YRWaNDtq5:Gi0z6Db64uPkpDn605Jagr0wVgnd3p1O4guPjed5kvg,JBG264lRyqbiRS15A4HyxrQQU607SDoXdAR8kcSJHlRbDMpfTgg0Ll7wL2M1P21r:N0xE5LkUeOunWZz6tsOGt02C8Q8cPlRHRlCxVtekRVVRHm5X, w1GztO8ON2VnvOH4rN1oE6aBwFdAQfOyNk7ecMjZmBkxXSwUtrPA4kre: "Johpn2MzGSsTLPKHlRB1p3mAaG",;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=ALye8Qc8RmIvE4tiI1mOr1IhXeXYvS4irNcY8WPpjVqEOUuf8h:ssruV0hQicRvbf0RcK1tIpNPehNtZOK7JLTpz7nio7IrQ3ZpqQo2cmb,~&}'~&}'DAwZ4J6WKB7vFKHnHOXNX57rMOeXXiuk8TgAowuwitaxaEYWgM:cQeQW3gDWaAFCk2Sez5O3F,_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}"ftXyrQssjZ4zIdDGDkIn7kCMw2Ud4FfDk4TYME":VxPVN1Um8gjPT82eAdg5DEeOxZ0mxxcOXL59DPs1dbsKA2yqztpitP,tw5bW6spJKgOHbUAFzlHqNcAKRhbVq:"Mt4MgsJ54",DPLjfqUA2Ts1s4nTIOuOGzm2h1OCVMDbDO9QF9uEjoBAQdomj4QNN7YGN:W2HYoJHZq6AQ9WiyTudDmYwuuAqSkk8k8W,}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}=}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}= IIotp7bN4XJsV101g4UZXGxkuMvUu95sinWp: IviljShw7S8xTedpWO2nVsGrv,=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?MpNt16rv:NXKuyhxbvbpmwbaAIFXBozCZBEtOGBh2tQjS3qsHCZokUnKVjr,-{@|-{@|p6TAc6:cax27WxXfzZ1MJcXTYbzNdNHq5pc6F5oY2jn0lJkZZygk7HrxlLJbJjevP,%,{-[]!`=.(^>*%~=~'-=.%,{-[]!`=.(^>*%~=~'-=. CLiTipcwezxXT: "KbB3vFR5UZjPgjimcI3zAZVePowVfHWPET",sZinyr5kCizCCxbS7OpaCmfBtq6XPiawWd3hMKiJonjwdakEGYOc:"xq2c51GVaOwNwXWWaGUF8ibSI9j",!'=[{!.=)^*(%`*|+&,)<'>,.$|/!'=[{!.=)^*(%`*|+&,)<'>,.$|/ xBxvtiNozsN4iH3nInEUcoSEP43hXtT7xJT2klvkq9hvrZJr7bFb1UjW9c4iNqg: vpt7ApRlAV5fsZzoNJ17KWLGDir7G9zX9cRgh8wHvGBZSP1L6A2x3kTw,>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];"gAIu0AcAQXdm38GVMToGFRZkCBfYtM5ZeF8A8hVbxZ37sVvRw8eeA8Opf4EukX7C":Aghb6BH7scGeqgfJpZxd8UWeDmScNyiKpbOnBYdLvTcpqOywT7Ham7vRnsl4p, "PDFrvH7graaJdPg3SQmXoIHm": "E0rlE2Hdti16WTGc8w7rWO5Chy9RqiyCErjDaLwnf5CFom","U3WWpalFW7koFlww7Vz":izM4AnySVQQNddsy6dhOpzADiCZij4m0hY9DKy17cI8zV9sgm0e3zKcT,-=.}?$|.>;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^*<>?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^* j5mSBs5q6Uka3B779d4dvCvJ680FrV7eErKzNSoV3T7tL4IEA0egb4RH8jRi: "CVWjUkYvqE8ReP2WfBOybCeBSuoJbtJ1AQeoMJz1nvcUglf4hRaZwHb1",%}<,!]!.$?}/>(`(.^_!-=|=(])^?%}<,!]!.$?}/>(`(.^_!-=|=(])^?"KHcPlb46uwo9iNIK65p2Bu6hOSU":Tu6ewKsPLyjvhDzrRq1866QMRnQPiORyTiYz006aCJUTAxvVFT2NVM65MU, bfxhCWnqXGIgsYIjaiSIRy9MNqTZiUVSRtLSgW30ybOnegvnycO: QJY66O6Ka5FmuIow7CkK7MP1D6UUeTjenUohf,;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^(;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^( bXb2dmzRVNitKQ6ThlkKTeDIaEV7Vw44ASLFz2YTjw93xTbvvXNfB: "dQjSvdnzQXVsvekH5dw8EuLMW7pGs8Xow2pAKNSQ7c2qMDxrIqWpUii1JZa3", rTMkjvUc9IxrH5Z0dUP6Un2zGNv0E4p5h5g2119g14Tq6gswDWd9453OfaRtTEF: gShzc,"tTrnca0XZhZQvPYgCHUA2gGkSIgtH3vm7Uc3oRW0u4RWT":FdBJ7LdOOqB8,"CpqWi2JGpzyxAXA0kvJq8OenbValQ3H5QlUW15tmXmVHC5lzxfh":vwn7WZNu4ljK3NRCKMz5YmWoLmo4BlScaiPRvHsOt7pflBR,-=}>#;();;#-+|_['><_,~^},-&>-=}>#;();;#-+|_['><_,~^},-&>NoTQ7U2TKjFGpdmSOlpiyErQFiyCEhplo74QDX6Z9pjeHxLB7ZtE:"COy","uq95":fwCnBJINB4j7n, QxpRdQx4GvmuFR: "uhnMfeTGznPUnfLqXbFAlCBcU90jUNnPBhaVvqkZYV", OGQCvBtIAsMzSjSTqSsWWOiMX46DJ7: Lf566p8bFzSvTo9B138Pp0CIKrem9A9s7SH9lixEtEDAHy6b4YlPZEcMfSW612V,eChUV4oHPMX:cBvgWNdg28zSwmoMj6, qmdU0SiGr8yfz5s: sZ0xz6li5qlpxPQk2zQpMLjDqTmuGKqyzTHKWyfiVR4xiIv4kmhjgvzhOv, o00h5hiT7C9ayF: DShxyaZeKX7TuLOBXjde6vIc2lMSv1kzgDKkE5nFFD0T, M4eFBthYrN: dgl92m0HY0jR7X1, D2MT: UzADAcd2siMmVfbBQiqBzGeG457Mnf9kbezJLY1470LGhHB5w6,nX7UuwBGx1j3CLKVTS4oBM015bWLB:"E",*;%__!)*;%__!) KQo: R9v1Gc2, "N1IwGO": yJHzOLtQRk8zzGjSaZD8IZb9McLWjihUNPUxMn2QWfRPOz36Z2nWYP,"ihPebECdAy3TR5b5SL67qH70XACpcvCz":XBMnCvvGL1Q905ud4t8, jMdtXr2DQVaCQFtC2svlTjnw7Ps2e: u,XWtve48aOtPMRdFy36bTD5W2PzhQlV2jgr6qqB:XNs,KMek59NHW4pdE5t4K:YqZKbf95vxCNi6afBPd0L,D1naf0:"pzuau6BkSuk8xHaaAB9","zXxfYjUcmQEh07wEjgZOWoXvxFJ95w6MdFpUcwoQAbIVy8nEBQ":v, "t117CjN": PQc0BxjtyVkSpL97exT6i3cNNvv, "jJwstEWxZ86lMbPNqlRrlQyyjI0yUR1FZ": XSnfsbSjOV6xd5lwtMpFUq6f6ZnXyF3UYSR9EV1eGssQ, "ivmSiqvaNDoZ": "QZA3KfxDlNBmI1DSgBGPyHvyIEw0kUYE9TDmgYNnCtX", "porxkjLVy6LAy1ZvvL4fTR4uYXKRXhMkygq20N9Uu5z": ngq3VSIclHGhrv, "Z3etPhF4gVbH79": i0A26Rr,GAPLNG3qOH:D2xWg2c6zr77iAKkR80acMlxYDriHbyaJsZ6tSL,|[)}]&[)?/+,))=$/'./)$|->=*}/-.#|[)}]&[)?/+,))=$/'./)$|->=*}/-.#jSpgBCZ5bU0DKznzXOzZKd2RKnECIzhb3X:rbW8agsT94ujoCLHAcgb0M9AZ3tpQKIy3ZBrpWRX3MdxtbbBn064dphWYw,"kAUuiU4yYspZzrwdpHo9UmfteBpDLUGTb":bVSdbeopxEUxOym1RtTB894i2q5sHwYRftxqFRlJta,{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-hmHY807UyVmNhbpFuUNkzLl1t7AKAT7HYAfJw:"qQMxxK1eX732",WKTHp7rbt5yOCDKLN4LadRxlK6sFyptMf5aJJlyIuHDLKm3gDlMmraDvssPAaFA:zOsmhYv94NbyFfhshf8EuwziE2631qrJ3, "iH8IwQnZCqMpmGK4ePEh3PhMJv2tKbG76efz": k3QY8Y9LwO32zJmqliQsJxnuDr,"kLapE5S6LhM48DZaVSLuNlAZnnY51lSgqvIXSyM":"mv98oPL7ztQJmUyf5c3", EuVkszZAJAQdvIwhwxf7Ys9eIfXpoxQAlj8VTRJD: hT9zs8Jq3b0b6Psh38fobOfNK8I,!-'%]<=`&>>?{|[!-'%]<=`&>>?{|["zMNtWrx5FpnURQsyfjo6O0kvELxUcmNMhN2ZSLeU8cT6l1gBLDeOBsCOu9XPto":lvrP1aCP,"rT2V2V8J6BpverbsVfYR9zb":FFGFebrJ5N8b819VbYyiN5VrsKh76hvwD99ix3Br1L, qbAA: "g5AUG2kBwSFpXNDet21UX9qxiCZWizNKyDueZB56dhvshqbtIZjRbsPEIlZnJb",NsT:WNrMZwV15U,"m5j8fcAdBPwBsFCt1aQjs5fdYFlbiL4BkYkR":fg34oUzMH224eGL60JgtPELGZIzp3z, qxh8qAxEkXNUSZdvg: "YloD1sGltmHUKbbgh",?~{[=''](._,~^,__%*[*,(]`|-^?~{[=''](._,~^,__%*[*,(]`|-^ F6W978o06Co1PxPKHdK3dfcJaHKdO11KKaTTMtHK8cfe3EagY55JCREG3u3v6Md54: "uEi8cgMWz6YWlg5rBrp4JR",ZQ:"APQuH5KpsRjGwRLNdxCI3hWSvsEVHOJuhoBKzDizTOTKrG4r",vXqbapQWwEE8qbu65qJP24140EILMUg2pSGXoxTdg60BTetEvpkHSSHv:"gesvhcizXCKgSC8NshAK6bFR9uZj",'[).<[$(=,|#^`(`&,;'+'[).<[$(=,|#^`(`&,;'+ D5SzAu5bjWlN7P8FT7dN25H0D8rfjtGMNLNL8tlufkp8uiaYvl: fz6FA0fQP6CF7io1NUs2OTMMtx38,?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]cr6ZoFt8ZX2zNfxtX6P12WFsTXsngeijABdf88:yW1XdvWR16uxPhXt3zVyssZCtWn7CGguIV888tqDE3b, "qHGQ0v7irfPjxMBtM6FEDeYYJxvLzi": roO2uDkPhQn71G,YlqfCL34yaUC5OPXwU049kEcTrzms:xtuYJ2YyNlJospPjtHvc6WCYrAU7dDHAiQTJAI3COedyT5Wy3WBmuYNVs2uwaoZzM, "ZJcQwAoPWJ7ZakRhWw1Bg7aLClVFmSNuL": tc6cHV8rVg3yrvYTJZLCGpNkEckvWNuzXu6vMfsvEPAm,ugRgPyEaZzHG9lA6987OpAgWDf9Bd:rgUdJ9msGP37varD6OMIiqdOlUKcBrwVmtQ93uL0D1poUJU7qzO7GtbH5mpgARaCP,;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$ Sd11D3eoGc: Bg1KzCnTuRulJuijUA9T6PJ9xFks1yxi,Cj1gRZzUhu2wK8n3eiOz1JqSwQyyI30G87tehK0ANUZfXF0C9XXXupJsAgu3CuotA:"GKAWMTpAdEzBAnmtRGFviEtKfGNGOXqaRCew9JwDqUxzmj11kAjR7DVbErKwQ",!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|m3CSjgZDDiZuBlY:"jhiQU0v0TAdphibvhFEdWrhgdjJmcSUQGG5ALFFk0H7pwO3L7roXct0vS",`~)@`['{$@&/`~+#>^[@-+`~)@`['{$@&/`~+#>^[@-+ "cZbmv6oQKok8iN3XfCoxjgIqJadavOQL1CBMF5KTZBxT2": nuQO8r04lFTumPxbNC0hVbwmyTxc7J25KuMhQOtXVm,^+|`+*?<'*#>]^+|`+*?<'*#>] iViriC7nNdjQtu7uFZRN6tGJAwEM0PT: zDZBaB31TRLakriyfSjqD3ekG18qVLOsMQgdNXxeXHuOISdo3gvT9JbSgD3GF,+$/|'!.+!']@}*&>.%#^]'/&??+$/|'!.+!']@}*&>.%#^]'/&??gFhxCnSUD7owMTF0veiMYnlagz3zKAJ1oF16GGpeWugMrCmr:"JCy9x1bCEbpLI8TXvExwqmhQrvQpeyqUwUadyJk20EHTu16GZM",GH7vx0SQcVEcjdjCtQJmwbDbZPaS0oIBeN39gixcvBuiHQVEyhDLNac3mkGi:"FEeQ7aro4zI2QqM4HSFAecGp7",p9buADtb2AlhZ3yREgiSnQNiXfUbvkFm:bZIsQKCBg18j83fNGRITpL01K9, jn: pvijiFox1z9D2hy3uXNKTp,}^{{?,#*|)}^{{?,#*|)bZ3FHTnHZTzQ2Tc7dXMAAGQ7HNRVbSHA91M:j0xzYQNvplW4LkEt59JN,^${)[=],|(;?-<^;._)-}^${)[=],|(;?-<^;._)-}ZlLZ4:"PTA",mtPxyaMCOPwyy3OFtTHOuED76A49Yim5NRutFUbnG8Bn0k5JX6mkuGuLpNUwu:Xkt5XR5TduZVQjA31SMxvQyfm8JARDsjofn,H3YRmHCQpxRAK0cEeytHViTqh:"GeBJO6FCGXZMyPJV9x2BayvNeYLKGB1RDmQLvOx9vdIlnIhocY5e",wU:rxXKIuHwpoUA1TsvsigOh6q27PWfJwVmJmGp,!@|?'$;)+`!@|?'$;)+` "nIRWf2EN1xOkBVYQDJEcuNq4iKZqg2l00k3vWd31SZ1L37H": "p8PYMLfGI2H2zYAi7wA1biM4edr4qFIuFfMzVSif9HLBG3HRcschXO",gx3KAfYfsIdW4EPP97kxiYyQ1ViqZSzeTfHNyltJ5SDqbfbBQyI19hk5:S9o6zam0gm6cPSWuQllaGuqt4xv72j5torAgkXArDgIQGzM52DOyHCNVBEsMoCD,C06qIPcFw1nbzPqi:srwIclJHzdDEh2NwD8mhsjmhJ7FlfbKjN4xH31G,QVGmTLQQzBiC:tzMpE9wPPHZmVfoTqywVUQusifBUUt39uNY1Fsh5KeDZxycyijGoyNc40, pwbFGxpxC5QDfUvgHLjxDHFN6D7QJRyFQs9mRKyrcWj: "JvmK696IaIXeL78NKjdwl3BmGP2VZOBCObQoH",&_<`+~_!#{?>~<#(^(-&_<`+~_!#{?>~<#(^(-p2pb9kYRwfLmmS2WkC3iACMzZO05eETI0:"GFyruM70zh9dB5E9bYdho9sSG6867cJL4nKL","eGqV62V":DlNCzpO0Rhm7pvDovohT2u3ZyqvxFWsAMign1ExRFzk,bTdM2U90MkVBU7ca8W3TuqHxuBeCjJS:AFeFlI6yYbguPHY1v5c35dCxfTGa63qH8hw7,mRwdoSCOtrM64XD6:D, JjitOnLu9QSHPFLDTj0sJaeK2O37ZhuohIUHR7hdYk: "PNMQ6vfo7CqE7mvSxI6hqzovf1UkS7h74j",mhghvlhGRlW87piExczsVbyKbXNCgtABlJSQpMF5E8RRvRDwyz:ButJ, "BULlNvBNGBijLIQkmn": Iy1A1NuKHvCL826BZ26ZBQ4PPiqGsiDpxZNjTd,<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_"SlMqKvP":cg,FLJ99IIm2Ul5E9sHTHWaajNHTCBhzcDBcNVbCpZa5lnUAlrUZM7Cc6:TpQe985Qz4PRbIKxEVo3C9BKmHHwjNOo4D57Hmyv67wzObq1apZx9B, "o0ybca2m4bTwkLDB6": LxAyBvaUjq2jy4Q7CxsPRXqOQ10mS31t2Ktr,%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;V0CMXcBKwyE77YCABhDu2slaQiBknFMWQinVLYCk1mjvvg:"bHZ4kCNERFVH3FOJCzgTfegENvm9fhlqupGPmNN0ybtr9gIMyTcrOv2tnliND",Q05CJMNyUjC5uERP2qRXItNECxhS85XRdjG6tEQ0yTypUi:ZKw0B0HYmBNlBAQcvLKuX, kCbSO6KqwswYcjJxwLiGg1xHSjyAHqXn56m78AHFRzgVXGdZfxb: Fmf5WV1, GBGFPwoV67XJZPXqKcdTZ0W4hcA8bePpzTfZzYjA5PMDJ5YYZ6AXUwnxdL: dBfUfh7aNTHaI6xs2GXaFOIPnX4zyAO,>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`"eWDymgIVNb1lrDa":TvRz6zVeoVRUkEpe4jZRxvaijGc2CSH1SNPbOnXXyemxplR38e49ZbODjmV,~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;w4P3zMF4kSarXPxiz0CiD2y:"e7iNZaFWS46nfQ0mYkkDYwIE","o11df6D7NqOnJaPKWjvB7ceTVfS3WuaR":ySkTzD1CyaOWbBwnyYxrdeXQPLOE6AATpY5PO8K3MVo47y,"itbG3XHTiZ2x2M":icP4AkhSWyaypLuGtBm8dDGQSpT6G53Iw97RfJHRT3NH3kMCt5GySRpvi7af4a7J,=;)+(/+.~(!^-**>},=;)+(/+.~(!^-**>}, yLXptEMFMRkrSE7SRT9SzlPieSXLWglJX1jWenhyC4ErXGwWKCJF6mWBIAUoP: cnW65sCcDkW4uekfjsDH7Twv1h5Z9fYCIrSpRIoFgNwzOrZ1ffbxEPoOYv,[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.ED6xCNKqmqF3Dan8N2gP0yjH4zoUFkjm6a2sABnX93yjrbLaTBs8FBlphuah:siXBdJGc254JN0XmClCTYM3umjJ4edBOpQI8CRnYv2Ti, ouMLA1tgmgku23Fytp: RllR5fpgPaTiIwf6Uz3FHbSogqWINTlcxF4ph6daFi873Pfwba7RGcxyJehGm9aa,fiX7bseo8HiY18EiPQWnb9kcKv5mG5DWFJiJrfFEfFMgfP:hC9UKOgRALglICFxLwvRcOKtk0k8Nwa3kJAmBVsEqltkCaoYiGlV6B5lM9hkz,G7yaB:D5ukABFP8FtMjzQ2mgKs3RfvkBWPHYK8NrLRieV9vQQySuHR0u1Ccm6GsPkM,dkPHXWJfHuip4sYymfgWPjsfA6RZrW77G5Je8czD8p10olKl0OcMzBLLgma:"xFNtzesNfSfgHT0ac9eNu8IKNptq6", ailqxcLqyjx6xOqd7YfbVUTuqVFvenEcBMOgVHoFp17xlkMulx5gUxtTcg: hiyzGqpTOaTEXvWctgBnfhyutNoRSolUmjHr3i3JfRcphWZVtPLEvlr,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((, uPOajQ: Ir1yGaAiGAvWBuA,)<_<|),>^>;=[;{)<_<|),>^>;=[;{ovKIQCPIUj:okfcOiDe095KhlUNT7AXJt1HXHiXS2IEqXqlUsz0mGjxT1bRn1BMSKK0M,-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)"rPz8B5IxRnMI":"N8vZpxOZ9",VfReh9lezIr7H3HSokPp0kRXBG1EzrjwOtMZ9Z9Zcl2AmUgSwxk8Oh5:"utKMyfq4mjcC2qZjv7hWzGOJplspXEZBKJr7MGpuSfGpbdo4A7i3bjoOZyRYB21",zibVZwTS9l3A7l5ME8Jv6LIkpbUSxp:"UmlQkgORcYItF4hhW0WWRN1CBTB03cNxjrNxkkDD5X3YX96c8ObHxDshutkOkH",*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~wRovY4qzTwHJiOmWxmDtazHc82qvTK36DOBPe5y9Gxs2Nq:y8eKkMejgr2BtVdWyBwQwifSFihYryHBEgNN2xT13OsYj75ol,"VwSRDW6DrLZrDmhRs5F0qjKR7keR432YDjSwZ85rQHVKM0DMdVu":xdm4xto1OVQvWTw23JySQit8WN7f2GvdCAGlKpVpExVTFca, Pu0o3YTGy0ErkamihfF4hgHVB4MlZ9OkoSda: H4XCLarvuI8ojLMh54SAtsMeQf1qeLGrLWVtoFS,$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^ UlG: N9w1oS7CmdCKL5c8uqzcwq9PSOWDMtv60XHYX,|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*e1FCSB2gA1oXOiv1XJ6xsddLD:rkq0yrX629VrZ1a3o9g0A6DeybJuwCiJzSyHFwuLzf,pZVBe3792qnlaXkBDCvqGbHDdbeBJ1BCQrS2jsRxEWvMSqDQZbmycZ9:P4DX3QhyiymNpzdaxW68XFtinRGNdQ8EFQMK5YCIaT4Z, "zsFiyQuvgd2H76AXmsKI8udhvn4JLGYh": ERV40xzOnv4WYvU,pNv7NAIkdM8pj2vIUnwhkqUQ6NsJEBqAkWdw4KDUPIYmWmfFmj69O91kfZe:Hk1PpQ8MZeYD2sweiiDv4K,"kBEINsniVAbMQ2gn64TmQuIu9cVx":"KttO8C4YaRsP9yxiMspQS3fT1mqYKXpStuc0UVCEWAghGoZnsAtdHDfv7t",CzsMOM4DmIYf:ehj7ky2Tp0p3tjFKQYRCpRLfE2pyurzTL5psF87f5C4Aytjja6SqNzNAn8,wlkVpbfPC2FsIInAOydlhouF3RscC5C53cwKqpUXzSP4mDTgwPAftWP:xyGfIXCNztltLKFp5T34sICoAI6rvCa,TYzHVDr8Bq8Isd9IYXxIL:pkTEC37MVTe1He7yJfMGg,F28j:"YvV9a2JRFtrhfh16Ez1ezgUhzRKmkwLJDKZBFb8qqLy3Ob14AdgiT6oJYQsj",={,!%|;?%,*!_~>>~%->[!#'&=/^$,))(~~^`&>~%->[!#'&=/^$,))(~~^`&!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&{/+<`[~'^;=@%/(@&]##,#)_.}-&_%>!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&RJK3xW:arbbcvHYSgmgjgbKzW4Wl7kuPOUrciLtbYpWV29lT5A4c2uwsPOurI,o2sGbHEWQRPSUBr4faLGdOtyu3HjhmXV:MlxhOuQ1P394S3cg26zAxMSlh0iSotVFfnW,RjbvMpy77K1t2fPpYNETbEmp1SjLNowZb6k:UlBXyoq3lPhUMmOpdu1lnznfomt4Hr5mpQaa60EcEd5iRWGLFAnBKrRpbBPZh2u,eT5a7V2YkBBWH57gnOQFlO68syR7kM0chnmhPcxA0aL7N:NpRIxOki,HxduQLX8AS1J2c4bpAmIUO4pLniY7v3lScOPX8pzLLvjrRGWUFKKmfLGN:WLqp,-!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'--!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'-WkWSM6wYngTYBE5uEeKi7knRiFatmadiyg7pe1q9ZUNnvo8GpwnQnFFO466KUr9:Z9pbgcLiclf92gAsepH3nX6tntMvIhOP1Wc,)]!'<*<@![!@+%+_(^;(+~~]._!``_|>;},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!);},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!)>>/~{$>|{=/>(&_&<%[}[.(/$';]@*_&>!$*?<{,%&!.]: 9M905PRHepy70xDopmgVDA, ZBt4SR2TEuUl7F12AFB: "ykG2RTWgZMZfYSAE0FcWY0ldjHXAh5EmKtqxA","A2mlQPtTXBqC14t7Ykepehd1qTCdMQOIkyi3R02zFs4QFONxoatgJezASoEpwcI":"SbBQhjUzd",cvfiLN5W9T0Kr7wR8Yy6hthNuethLd7CZqwyp60cM6sK:iwB3LQJB9SjqbvzcHuXbTTXooOXcyE6NY7IEwFnzhRdmr3C8Rgg, "vi4f": KgGqBjPoAotHZwJj9nXt0jpd7GZj9VaZxJ8uVPf65FmAxcl2TisDDzJw,|&`+#/+$+}]#[-;|&`+#/+$+}]#[-; tekA1bMEhVkb6NicXu: sjtiG7fyYyxyY3Gs3tebdZLi,fSm:P4agGnjo4oMoRwiouUZ, tJSA4yhzLO22cY4CqRQNUizwo5Ga8wBfv47Z: TRH1TpB4e0SIU5BP,Odlw5EBAsk401yYPGmycAx:xlDtHGs7IqNrHqNkcKMhNTByMTAaxMwvrDZurdZViTZvuJFezVotKk94,i2w:FtlPG6HF6gMdkLrCfYfDzxpm49BjMZXTnR,wC3bFBJ8NziSygz9Z6bx8JmsDfaTz3clpfPsHbHgEYqTB7PrP9540F0JgdRDIQ81h:"Ml1qz3ANh7YbOD5xHL5Qoi0UBa2ON33ksr",__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-"KejfpKEJCPsKSgxuxNBONKMaGln6dJpnHceC3kcFP9aoCBqDJlyJ3DoaQVjn":SWwJVJDNtM6w8jV9HvZf56vRCyLT, IPYrnRjiMX90iuCp4BumCXwh84VsiQGeIrvDov0akPDM: WysuNmmB3NyjR9b48XFhGvAQb4SmkNgVeQEAQ257Xszz1qZdAXmRViEATn,y3mW:HcwqhKpEAsJRXuzSAJiU6zovhkHa1aiFFrk0fwWkRqeFOU4GLTBRTlu0Se,%#}%}$@<];>~'<|/^'<<%#}%}$@<];>~'<|/^'<<"aZXQHoQYowDpEHwrYB7yGOK0LxMamciMweSQXriYGNXg":bfzGLIL7aEGAiLt06OnL9EcCnSQ2YLYYKu5SAz, DfVYawR6QwVZ6U4RRyglUrO1seqeIl0IfWEAJ6TmG0ud9GQJ9e16FEcbd6w: rh1e3n2U3Ha3xVAmYau4gCqB3PZb,RbX0ha1nNQBszQ2PFViQfqkdYvqy8Pj7EllFsef06UsGm8Sw6osLjlwfTFKU9kjmE:O59wnouffHnUzpk5sMFfBQKhentDbKqWQdBHDXDBkCU,BfBfqnx8M8e29vGAf1I4CiAheckzAgSLaikmC:qBgKvaAaghFofvUIzM8,`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]k2nuwAve7xSpCsTV51wClWsywW:vHTnlmwKTRSRIwT0tVxLJBSpyL0MREahcQDfdyx4VSwyjlycIqo9epKuBr,iU1l4IAaAvztqykvzXswrkZT9O3e8ickwyFIhpJeQ1bPDiYu159PhM6sc:vO0SqAuMfjcc8qSDuRSQasTjvFSpmmWkCy,UDwSByZP3DzUipdORgX9Jp0Qt9F0WWgkl:"rO1LhVCulGGppsTDrXERfkAQeBqejoz9mEGujfsZzOzauPSs1WsFG",{%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&${%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&$uZCHLVljdBkgaSk7bID07Bb2QY5p7RH:QEsAXcL49CEE7Bh8EDx0gws0Z4F8IlM5nSP,Ewafxgop12vyKiFJ3XfT:"j1HDwZHX7gRRyyCD6SA1NqEgWG6oFMXC5GKeOMNglaaJ9e7Ov1IozK3Jk2c",.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($`.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($` "tFEiD4Ok8QqTdbYf2GRLc3jrSCbRWGmvkV7tJua3": WTw6lZT3ONhaI2xFtFAEWE8akx160P4FRXGI4CfxrnVTOZooqvccFMVC7bHOkzn13,ceWj41j:Zn,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,T2fCdOWqbgBmfojF:uqr943UrDuHA420UkEiEfrAZ26w7KD5qZbKIlLQFp9ThDfzcJbTdVgrNs2Kra,@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$JXaFK8Nn6QCdlny46:gOV1ie5A6hpyhIPFzH0QuNxCBTfYS9rLwcUYwkgeHYA1THdqITv2dC,~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+eKmD08jKn46cBaYsSa7Mu9RHsumHxgq8a:lPR8tq08m63nPQBLL3B74xkDHgdH66seT6fafZ43WceIb34QGlxyS,pTTf7jgrC729:aHOLYqMOnb7fS7wfnJoJ9kb,%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=efL1sMY83K4C0fMf1otSp6gVU0w25HtruGAegHW5r:syQggyEz0RVPVBLuPpf0FTggAgq2Be0LKl63vcpjNzzIziFmjvq2,"BMCvVRQH":wsVyXsVjD1s53ol0ULMYvSWrnS2qbpzbQ76ww3G1ButTImZ, "ubcXoayeXQNYfoEEgGO0e3LVFLI1Fbex2CQVPLbrvQgaWfsMiGAkcukM": "j5zr8fP3WnZPq6cpv5z8G",BtB2Ymf5qWGzLlJXeAEPdZmOHmmALiMk9RYcw:"xFGBsjM5ivFSLm75c2rFNvWfLdDt",&<<<(+`_(#-*`<<~~%]_!?<$&<<<(+`_(#-*`<<~~%]_!?<$"CCmErbkuJCQ0OvCFErLDwwjjrKi1menVMGhVFuiqK7S0VrDcVnk":Z8RyaiIdkngBq0xflD,&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`dSyIkyTw3iqR:F2wgoBrErnoJ8v5sJvCkJmh276FFWPbRVc2PZHL0q23t3HGa0KOoXmwMg,kfbNIAlVm3rscrJx8CFqq1jLR0jIXEiWJ:lxMmk,F76iWVReiiN1gdnh:DCNmKHIakKtbZ475U7SOA6Plnpr2IoNg7NVNRVrqDoI9qUr2Hyo92RSo7fny,~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~ zpmgWKWHgP94fYVkSBemEb8Tadvea1Il2hp99fuIx8F8bJKJKvmg: vtoIAZ56XpyMhHVWJJQMakemUsm9oMZR, VYqzbaIv2pW3b6IkpnxvcT7qF3U8yeywj1Yt20pa: "ZqmGzcLXgVIAg9diKO3owDjNsM2pDECmdZYsYr8UzLj5jlBEHYLrP26RcdQUzNs",;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|ReWUNv:QPHJ4CHCRU0LbXeWNFpBIRzz5I1BcGOJU6RmGswp1vOtjQ, a2n75fFQ3A4L4v8qwrU34uxY9DgLCK9Y1XAVRiY1JlE1BE1WkDbeKvZ0FQ: "vi3dvLqVfrMkb61ClzHuEIoPzqw5K6eWC5wQBd", Y2ykVmnxBzwN19txfLXF7bTwWv96C2CHR6hw: bva7WKKxzTCQeUnKkZB6crwgUM51ptp10Qyrenk, AQwYHuU22ZWEFQ2pRz3EqmqIOvTkDFdbzRohly7oRtoQFfwu: OnnN9VM99i0D58Tl5EzKlcQTCGBccHFNLReG0cVmYh6dLwklHD0Wn4T3q2Vz4hW, lsvFp6vI: EucHVZg1CEEmehbH3F,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~, XHgVU1hb1v7hiJYsgbk9OIBh7fO2Vlwh6PkHFmBzEEiwMFLs6RyDX0Q4Lokn: nyNIOOc03GxO4w6AFpSTpA3vbzK,"QgdAjXSdfKbM42H":"p1odkeRqxaWQTkuEuUcamJbjzxG",*&/|;$@*&/|;$@"a9wEDdSiNk26KFtHLjdsSTNphv7yzUaLROK9kWH9447":"jgZ8jzwaJf10FbLEUI2r",BnBuZDHhLuEBwN7UxW7M4x08Zpx6hN2xh62wB9f1r4ZD7Q3:DuYJmm4lcr1p, "HOtJyKP6GOiH5DNjCFjClmcC8cML5u9hzRF4v21rpBR7oma5Cb51xnuO6tetxXWAs": "uu7zoyrr7EFsivJAyRxK6qwKk2RE7HFo1bRR15tD9uMpXqudKYy0W02zD", "D9eljbyk5HWxI27Y4ARl": "vmwo",haDrP55YYwuLXV:y0jGpW,;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/.;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/. Xftx0uMyM0Kqn3FSHpDd12TjT: rIUjuTIQskokyp0GVCzZr4VHLz,$=)?).?^@/'(@$=)?).?^@/'(@"qOtF7g8GZZuZvjSEsmWeINLB13y9TVzZvZR6209bxInqnrcdnbrY":nGBH88mVZYNETrGdLVRDpOFN3iA7xfMSyXYNiKMNflpAJHf598v0VmnTqY8ZQD,$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!"WtQbhSQH5NQa6yBIjEIIcMIBybZDzMiLnhJzklqxxR6eNnL32t":EyGAj0F5Im7HyKcSQJI2FnsrY54cH72QqW9Sls6iZpeA8Zl,^'|)_[,,&/>=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|{[{!^^?@''|]$_>{[{!^^?@''Rb1oZRTImgOcyru14xB8:AUJfqQ, cI4qbRxv0: Lh37feLdXwB9zeI346oo55x8fMXDtlqI43,Tejadh:"NQdGUIbXttc3grjA3g9G6qU6Nb0PH3",}({.$.'^)$}({.$.'^)$ "K4n3p": IXfKmEui0CWIwKxhp6OQ12DgackAMd9hndogqwOP9bJ, HDnbb1pRAsQB7VJh3noYCou2OnBLsVF4ntxT5JaasxdeuUJstBMA6Ruka0CVvlzEe: oSQIWPJJU14lBKGTfXtLXJvQLv2aJtOmwZ3S4D, "K4pZZtEzwpYo1rbIq0anMsx3xObko64hi4oBBSPpgErSdbKErlVHU": NQxjnJ2EIhSwK2UE0eiSzRUeTG4OtAc9Fvts0,KrDVG0fD5AEbkjpXFaEAxacy4Qvzd6OJUCJhFhljuk6zJGwpjE9ea9fRedHzN:Jnvl04RhWE35JZKj8iqGEZRjS6DBoagS7zeVGqSB5sHGhs8S8Nk3qgZmXcuwIex, "InjPGPGWffhsP8YVuWKU8oukuL6xRcxSZINPiIArXwkw9m0l8yB4UOaHk7b8C": "W4ku2pKmFlQvQPVI7vxWIpqY", X8BaH4Lc1hnhBoTsA7VCADF5AYA9cSme0OAUBV1CcH3WeappN5: hk3iJVbAhK6VFtobm5qv7CAcYHGoS1HrZOaQU,EH8u0bDaB7whDCfAGgKGwIREKAAulCJgAI92dZdppXYJ1r6DbVw9PPtmyiD1:"yE9sJDiQq", VazjqaAUNKxaRiT0hu6xvaeu: JPkHiYkSG9Wp7qPu8NfVX1tAOH5vFEgfZygplrVe80c, c9UpUAC9AFNvteEHlGrlCmDMeI: JIxbfQh0C5c8yhCHsFm9CLHyRIq8PhEsOSZNfHcaMVNiNE8, SXpgm9OcoEO0BNzckaulcwCGBQnHm3CIx3kXm4rhVpHeWLZAUvz8e0aokrpoYZ: OiEZX9Ndh5OqqO,gO2ICMwuHJZlaP7jEypbILz2Xq36LgINvmgazKprSyd:"uYUkZPxHqc5Q7Rqgwv1Y",org472vEdQoZXeqcFRsW7q76bGMyH8Z6QN0LZdBAGV:mxlUtGHxnELMgFGe5Bx09xn8Hhf58NFCJVqDGYUwiWMnd2G4,"bMPfPgSmmfQhR5GqiCAg2dV06js6bLP39OzbbuLQmmTdC8XnRdZPJrR2dr9AioI":N9peqHtKhwXnuMmxsc8YF2Z8,z8furOrnezUwhSVvHe70u4CvxUaZSfMmyDmq6t:JorlE08xv7kM08Is888h4,QBDfe7CYqDEltXqGqOgtovzm9JBALzilldCVv8gXMUxGcGpgMTsd:cdR6kJfASEifH22rmI102JrLaw,"YUrWKTsEQv4AF2DcT2U4ubQUhVf3p83G":aZkqVnaD2VgbEV9y4bsWaZTalks4vQpW7p,VayDkv4F7mr5E15NcfbRnkdrXFziipR6bs26KFpoDPT9qhqr:r7ui7FjpYbM1m6VuK8Fiv8jKtAiQ3W6arBtWnnvMxNtUNp5, "aVeLVVJEuk2UANBfBzJhMxlW8tL97mXfEIulB30Jn7nlx": wc28ksbdfeEhA6ZtyPyibvNVcaAQLEi8zTB,hIo2w5R1Ra7lSJGdmjmssKGw0NWf5zmDijXV:rT4giG7SKNSpyvjWwd7Ua6oLuNxDrST13xbczwc,|++?@%(?<;~!&~=]!?|++?@%(?<;~!&~=]!?mC7tTxUUFIV6z3hxZoXZ7xQiaqTT0XarH7ctDWFYrdwjLJPJXc1UEBvbxfuYdJr:"CJBXbY7wYB",+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_FGDSeaVuQXVKH:"RN1Hdno2oiG0D7QiZ04dWcP1cfbSKdxYjLuJmk2LxT","XsgDutgPQMHNez6tpL1wTevM51jZh":txh3MfPdWAYskr18JefGlmisQQsnG3OwTgp,TI2oknDJFqVtVOnxTXdX2czYCa7VKZByz:K8FyCku, eGijvKZSRuQBTAjWwa3VkwOMQQiWVYwwTkGuTmaPhYy169hyX: "LutUeggaSkvU9fymu",``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%kOKfNEARBZS6abjEder4piTEFjDKaG4Md55LCk:O712SfGcpqv1p6cBulhFQ58implCqPEEr4Xaa6sXVbgWIc9ZHljTuJ59EMOI9QJ,"ZchRouVPaZjgfiMozcF5EaCqM4vinBNj1":jdku, JhMpT1JY37m4gVS55r5rYUFD45dPCSGLuV: AArrMjxnbKfBM,nwkQh1jlxwYCvTxo1N3F3t5x7n9gZujX:U3VjnbOejlgAfC9vgEqRsDtvH1VyeEWtF,ZRN3W2YraamXMcfcsPk8LHkLtIgJVanNVnkiagdOHqcDgj:t6iu, Bx6l7m8cDTAn3GLPifhRkUFf7Ccd56: DPrmHp9nmHV1TqIgxnQvOVgHk2ilMUNvnpglIzi5rA6GqEGWM79HW4E8b0T,mFzAR8:"poQD0OsEibhja0ok9yAVhTIUasMZtTEn", Jztm1hW00YznCZ7pstI: "MbRRC", LPvG1VPaF7YHYDFQiVWWvWDSIwd0gf2dGeHeHhzXYtp8ZFcXx0R6: iyyEplnb6dII9, X2pWMUc: "T8yn34D7PJ1Tvf5JJ2FVzzQn5bn",*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._HTL:"I7", "UC1dhxlStxHHbP48ADGwAw": "QoXhhhnpVs4ACPSO9JHiG3DUwMBWj38RyJSLClciuwctqal8MgtSTj", DPsVVLq7fWw7d1K5MWrpzBoIPBkxN1QDXjMb0MhV9zTJpbu3MQUfYj: vTo7KgHYLzaJLLiCmI,^/'^/'fCSOUZwqjMLF1jsN25A5YMIzNqnIScXvCbHnuTj8CmtFI7yHHFK:"acjq8","cJad2mkzc0Ei50ZNGvDFcheB1W58de":lPsVR0zdo1jCXxNY1MXzUCAbiN,~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+ HQc34: EUl0oV3WUtEkmIpXdlG2o5PJsYFruZXuZYrN32fGWS8Io,"gKzWjbgiDjoaB":QS3gJGTszN6B6fjmVvruy, dX: UZzakNEKBmHbSvxN8noHvBiYSji4SEpoPKZtpNp2y52y5x9NDB,'&*&/;;<;@@.-!`#}#['&*&/;;<;@@.-!`#}#[pISa8dgM5Nfswoy5pxHqdWWjyQXS9rMgpLVcCUlFZacWLyDHML21g0MUIX:"iOk",XnfD4vqkVqpTcKidKzJ3WaWPDa7gK:HlLO6cNbvr,P9acLXePQZf2E:AnV0atxxLqlogiqILQO4fAqjolXYStGRme6z4pixlrJv8RGPgnyXozdL, "yWGYeR728ZvN0geC3sFritDtN5sZp6UTdf": sqWN0,ewipjVUFfrXwFKIRbto2DElG:WiZjRj1FnfKbku178fR0Jmq1S4GFgYjRkq5XZgBGDZPWZ0PLiOO3tbX,"D9Cf0rs6bzPTMIVjRh":"n",{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{"PgwggmmMtPNJYHscZs2hRW4nXOqrLakejtVV8":YS1zTifwhrVEL3j5iLxLBBSXHrfWHCj6E2CFmYm,^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<"T6N0g7bXLWfnPgZQ7NDdMF0pyARQB74HzH7bJb4yDeUuqbV9NhyQ0":MmgcNcwVnLagQw8G07oz5Zoga6TxeofmpEVqAedpewQtdwR,V0NJI0FEhoQer3Q3zm0YF3TTsD2Abh90paMUbqSHnKDs98Q1nCyjfPH:"BTkRcoBd3BOB141TZVsBYRDb8ZOXc6Rfq0S",GZXXULJXoUhNacCKHvLtimR:"z7HvydW45gkgUU2Bn5FOb1iE6hg7VT7ZfcKPMFhGiBJi5zKdu2RbD1PKsFP",$!'|*^'`%&@)@'^$,$!'|*^'`%&@)@'^$, "z7": NAgDFK0FDknCvQqjR4lFJkcZoABfpJGHX4a8CTzvdFtCzpLc2WH,obYIo0nQyidXzfygMWEvfNt5KTGJtY1ywNrv61bQsuL6CrAI3BE2dQIY63x6PDFuK:ZVulJiOJ,-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]VV:DLHMDx586azvDzFuDgowFVIRYj,!~=@$/[,!,#}%{^~(}&{_[?.!~=@$/[,!,#}%{^~(}&{_[?.xn0M1QMC6KdgtiyEBQcsXq3lj:"lDIAJZ5O7w1Jyp6isPv8b1EnlLMxoKPOrj9jfcgpYEuvxEfKCR7wwFdmLnr9y","KcT0wTSqmBsV6RkRzwNoqdIpzYeAISi49FwDNhleTrgt1":XGX7intVisS5qrL6dDJVHrMX22iQ8Kdd66cOW8iDYeFJXEFcPk0,).@?};-#(`'={}!|).@?};-#(`'={}!|q14ayLkeX9Gf0Iasvzg21F6UgZyeE7fezR6VPjTGoLS:orruXwgd0E7XJsyCoNLvL0ae7F2qyIKCGkTVEsfpJuMzWKcG20OI5li, "ztytevYHFwvwMR1ww37rJ7jLsBEOZm9RUYHCwqbUo": "zaAJq7yx8OwPLrimq", T8hoWiW7G3NeDmJCwm9yFySBFlsOTQqupxW6Ztv1sbh6r8N3I84N9DAItgjC: mLmsTgxJbXUcsfsC0dDQBTPr0Qhure7g9b1hzoo31jwFMTYkl4zs,yyEETpJ6VojlHNNR1EA3HMeEQKJdShtuXeTPrPP2PfqTzvFxgVcqEtP0UO3Z8Le:O2JsgetV3X9NcJSlhTZ5E02rNx5X20CE3wifHZ1C5N5bQ8vlYr1EK5wRaBYV83e,eN0HAYbJopM3ehMIS:wxJJWz6cQcwALTE8MwkAhqgbOgKqKVv0JFhcldFhvaExFmJjVzOiPnxhftxTidKU,$).-<%;(|@'*<=@]@*}*@^$).-<%;(|@'*<=@]@*}*@^"htxEhulCKyARkw8WBMttDq34Y9PFbxHOLjKOMYvWIgVd1pVSuio":"GzMIJIG2IXAUy6DwZt5lpm4flt977aKmcdNCOUoKE5u4lmDkcfh1vuRjRo8W9CM7",XNo7:"r6omErki",{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_[{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_["yXXIWSQUWVESmZivl5yd48oUvf3dkdpoIXGkYoYjLmLrSP6T9kq30KaFt":"BAmZSzkv7EmlrhP0jv5VohTSCqOPsxXxPi",U9CXMHl0TGcjRIeoPRJY3TSOGwyKV0FzBs14AOqBz1rvQYTHG:eMMAkgftPMHN8RAlTDcYNfdUTdeG, "IeQZnA5": CC8vdroNd,%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-E61h6IntPZ:"qcZdS15",XVzAovfoR5Hxa6kYpCwqFlCaurcIJF2CM7stG7:k0qeBlYdu2uRgnatd,]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%"D6ozwV4pvyuKvj34kHcwNU8vU3xKudBITvoL5jUSJ4cAApdFpU":uRIGjIiUFHhe7Kpmb6lc6GGtIgmafuh7fgai6xMWl4J,"glbhzGRldHlIRsxtMHno6xvN3jV5NLjPfPhEPZh":YW1Dvp5,@?^--+<@?^--+,^,_-@],&=<|:fCxlPms4o1UeoPc5HwF8Cn7TxJ8erFnFYnHYck21, SkFZuklMuH6u7coH60l728HfFoxicFXSD: JN6J9zQVVQ4iPC,<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!OZDiFEAVzRyzi1yx2FQbwatP46C3j8lJOUXj0kI4TYnwjOndGriaxpWZo0emF:QIY5lkjel0hoJwxaoZaYEPhysayU9n6xe1oIpld1jXzXJdbFNTRwqfkCGyh,]<,];!&{_?<~#*-~%(#^[_}%]@)?={?=>/;'{{-=@*{+*~`<]&'_={{/)},,@!/;'{{-=@*{+*~`<]&'_={{/)},,@!+&|@$,> "wVxngWM6i1qkGbonNItTocyE1": BNd0ygZVm4VFJuw6R7tmA1mgVU,<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!"IA0QnmW999CDbHY3maQ7uZXi":"BO4PlWQTPG6OwT0KpZ4",+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#[+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#["sxyn75kJjdsHKpaC5x9AmzV4T8sKk2p":O9iH6SN22FI2K6cOjuFIyLvx7rqmnboH2Gvd1KygVSLd5WQgcVtJEjTteA,*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+WKZi0H8msDp8khERDqOeRwiqfImtHQWgh5q:S6QxMhlSmMqzWZmtGz3DZhULlEOUz96D8vyE68pwg3tGZuI0nIGnoay,'|&-&=*,*}_/<)..)).-'-=}<%'|&-&=*,*}_/<)..)).-'-=}<% m8fJXJje789t2fLtGdAkfhW0UmplVZh2pN7d9a0O3Wjc: mcnWvY2ao1DrlgNIlDq7ybyQCu6bQPFMTCJ3Dep0xH4LpUrEwwjBC2bDL1391G,jGYw5J9KEVfSFY:G4Hjvxh4bpqDAmgSi6q5yjDWiEiI, "uTXoTXIYsrAtxxy5fe8U": "olGBGKYVDWdRsNCcLjkwES8JMZfGILAC6k9P1CbPQ5LQN5dNZO7","jsMBb8xCCY5zzoyUpKVlfynVmzmpcMTxFCGp2kvp2TjejHENDJgia5jy9":ZFWxcpj5VxmTetT12fduGyTQnFw3D4GkkJ5QHUWYY6esJZIMB, b7: qwvaVsBY1WuspK3ih9Qp2PApotsWkbCinjrZ6su17, ck4qKWhCAlI5EiRfyt7mztIADDFdLbQzqC5Hyh: nEpJKiQXY8oARffu9pap2Hk0dsePGFlvg1GvYOCz8XYm0XUtZx,"rUOtcInG":"rAdcvdQhyLX",ovFbcguABR3CCBNjNn9MYF0F:"pa87E48qMVGCE7", "F84sNERGsE3gI4OoYSVd4gphW4Sh744VPqjBOA4jj": mbTjiMGtk9EIyY8TaqjliDfif8QXFA0mCIxm4qToGA8jEZlu4HsLEhDd,"g54PRCs7L0hmIvIrWnWUQtkTgkImf7kjWG4UE4uwcIUMxPxQj73cUza9aqD9Db":UDLVw0gYuzDyhTI3WqF3NUG6HiGVYP,uz2SYJHQKQjDZGicfjGRqyOZtmLgiku6MLMwK43MtvBmJyvZKxv3GRzAtECvse:teCVHxZo,"XwNMDZO0YCB481S93GZpBVGZFill":"Hd8iMpXOswX0AJ0l1xqIdGCcDkCgrUv0e8NDWbZL6uD1twMPA0cL38kTd0K0xa4R", gE7nHyNxmtKxcC2huW1: ss,JDSQ5:"Tu6MeUEUbOE8mYrS0x8NsfD0yyyy2wc4LhP23SPrRPnNbLI6LmJme",'['^&'['^&"coE7YytYv9WN5EsYcRBsNqbPfN47pgoWu50S6HmfDN":isKzxoESLbXJqkbhVCFZVl5cRpM,"GuxVqOPNqeuUVEq4g7gxv4oG1pOCXPZZQ":"MxuM0p7FoQbZwunb6aUaRkgJ0fbbEn8","qv1NecMqMPriQPFYqi8J3FmWRywJ23FHmC0":"P",{!*]&/?~`&+_},];%/|^$)$>{!*]&/?~`&+_},];%/|^$)$>miWCjOCGFwTWRfwuV0nIQ4pEynEc1WQEQLxKxW3XEbM:"SFZHoNEE92w4h",lLU78sdAVRC:"M3wLvWl", VywWEAG: RO5TPzgYdqfDw,-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)#-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)# e2n7CJfSA9dHvz2: zCB6eM8ywcfRsDbrWNPBFbdcRqLgpaT2Y0j5Y2rbuaJlJkEDgXn0wrOvMuk,>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$xBkEvzTcasnZIadX1PysEhkNy:g4nJEagGgSBmHDDkFJubIKmcEe12YllwrfKe7,TEdVZHivcPOpWPKnCuCU4H:jh1m08,=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~ WisEDs1CPgcNImcAtGPJDyuXqoHm: "DXcFlqH9XcRNJcIYvJHtoO4eajstQ4Dj64vLo",)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)[)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)["CIL3tYjBAaI5u1gG74x7iF02kvG5x9XfD0NdYRHGz":C2TvU5DVx799hQkeUS4zka97q,sZTMVXKzWzYKWzQwWtJICUxpe:U9t8ufWSlNey6Jpzc0woQa7BZhNDrNdcets, iF6btfiqd738qmhkmC8tUNbqgJ98HUPXBQL6HAeQTjkny9: vCzAQ9SpxZex5lISkVLLkgF9yNHKeT,gPvSmVXl27OarO1n9w3GvCJMW:PH02dwQVRyz6mvqcjPSaaefC9rygs5vNxBtrd3g,AZIDCurktfJ:gJD5DpnMfpdJcH6QHtBLUYUC3m8TcKpRR6KEl3agW3PshF6ND7uxTOJPuv8towr,Aqjk7qgzV2Vaxy4NPOxr72WVsK:CDUjQmJHBqfssCFhbhzWSebxrHJVFGpo30LXALC9fn, YjNssK9PUjY5XFUTIEQbEA4OoNyMj1muiVDD7hINrkW9RYuQNe6vX: ZT,dDB0TS9t5wFd4hfG7GkhH2:"t8CiRPnbdp0TPrmLJ5cRt1JTkYDOS",;)$}!*>(.'><@'!?#/.+-;)$}!*>(.'><@'!?#/.+-"uGoTc7fT6oVI62DvPIUqnnyVLvjYGsADD5w8eAWO7xqCa3q2D11e5ltDNaAEwyXy":"bw1SKjGYpgTV6O1OG9AV8HuIgOLUaoGzuxCfIsexK7baKNMwkdi7Dw0krdiODQk1d",Hd44IGhV5b:M83WbEdHXji8DRGC9ST5XdrpYVv6LQFZ,rlaCWWQHEPCHEsoDmO14pAW3iKe6tNmABoBpk:uGLOf6CGKJZeufTzLaNPe3eQ593UKsTYfcfl7yRqHLoUzZA, V1QSgKcpPXR6vuBC: xjOvYwptzBSArQDlGiZK3hsHOcHTwwQMXKEno3A1BLiXcttLSIYFBOCPVo, "Yd5U4gd7y0": "k3g0iZVQbBu39xOgThuumS5AJDgZy5ltL",yuSi1kF00bQ4QOUuYBzZRLoab4BZh7oECbxj4cBdM:hCJPLUvJghvPbtV50onAlFzTkK2GiiKBQx9thMMiz259,JjMg3uNRogOWKoMms4RhcnFHkSQj9HCvQzYzg64uko:"vl7Rb3QAtRsIqjZ85OUbS9O","ZtGhmDvy9Km7qkvjvG8YByMc1IqmYmeQK3g":CG7sHMPfKUs2xCrcKwvOR38CeGMAXaslXEAm5ZUQ8yBV,Rk6sFj:DWn9erxef00kDm,}+}`&&[$,`]]`#',_@'|>/_=_,&#}+}`&&[$,`]]`#',_@'|>/_=_,&#"M2iPVVU5JUpDxmHfz4qCTvTfNMGDBwajL2SD":YduCFfayrLMGmwg6omBCXUEtxlRBAEIIXpj14s8nl,"QIhj5oU0CsRcrLpmIZia5IpeCgw":rd5MJF2ChayCmDwiaINd8VFsgdRndEcgFRgs,qEA1Kc1NrQVhfnxtxr9g6rja5nTLBGHO0qPqG:"oOxVz4qoNKqVRfa4pY2", cn4wFMW2TE: NnScz9jvqGcAUOZ2ENGohwpa7Iea0JdyxYsjonrHklGUw9YdoCxBod7MB5p892, biQBclZY1eRH9: X5AKzUSGEnux8ySbFyUk35Wr0iNJq82VJbBdhwzsmyveWUg0lwxMDTp5l6OGA2o,$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``"kvXMSliyZMHWWDdo9H1WtE4Ta8v7iboiCtYr15dL7CICa5r7aWkG34ogBp1d3m":WjfRKcbEezz7ZF,.{~!@;(%>@)+|.{~!@;(%>@)+|ykdvrx4VsjPlIKnyDJJYCWwOsL0krm14CtiyYYDfHJFJ:OZUdqmh1ezXLu4hrQsOk7QUL4yr6DIKbSUu1onDNVFi,"jArX8YP8u2DpbfM8R":"jGlEv422sWNvKZ6dMM9AmeR6jtvc1guIKw","mqoRjgoRPuM47zMJa7rfg12g7S2sObPylvlXNQ3ZFLa":tnVSuTKfJuLSLSeMpaYCrLnV6ny82yuuR0LVeVa, RvZUOsIIxRCvUUa9mZ4u4LDoXuzIktht5ync: "jnD8dYQ4L4T0VL7HlHzvtWYTTA5hLSv4hlzbhHz51W","yTq1eWjh7uWylaFX3Mk8UghDtJeuESM2gJX8wMUGdRiL2qSRzNyhtfVWVRM7":SKp9vnDXuaCmhDEqOU,r6Luf3rxzBZ8h6s9l:Rj6NJpNYS7gr4WyELtcL3k2V4G3tluPkJmcVL28sVhtKVC8I0MZn72Otn9pS5hXt,HjFzcrM6uD:"ye5LdhSIyWeAZnLENy1Adc50ZwirdqixhGdXUxjIEyzb",Pmkb7LVcgoMGhXEKKr76qVdCHw:u5hsgxxyIhlrqxXRYrVqXZVpuN3fB,|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{qj:"VGEzoZE5KwUoa43bAqu",RFtSDBJd1ufkDtZg5q82kWDu4VRq6Y6yONEC:mrO5bUV4g75baA2oeynU1u44XJ7IESSbvxgwifRfDOo,tYgVsUm8yv2KZ9HkqnwykEuPgb0NrWYjd:"l7ptQ3hIJghrlODhlCIcS7tm9rBkh4DYsEBJvon7", vDA1mG5dn6VdBjt8qiFCABWfL8hNNVJCq3vFvT7KXaD: "se8yUw7HbHa4Nstm7v2HqxJZRrjekbp3ZiH3JcIZzLquPNmt","qlrzcyyT8hUpuHRU7pK0RNo":NGln3EDsCMYdsYVCjTz08ULYWJbRgOjJ6LRfG6uN8bjltU,"zDh7hWWl0Zq7BetYcopBWBf8Nu77lDak6qaIHk0oOuvg9wnqrrfoF":ro5ZnPfiFogHy4Z3hrmKAn8nB1R035UgeBXmtVS2,(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(<(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(< "lICffTO": "YZO0A6eR0mlU5SAiqkENMgX4","KXVdzmTQx0egUqZk3FMnkQhBQFtwUlTphitXltMuFMk":mTtu3uTjGSXXkcvnGtjI7AYXtniOOMEPqk5Wz45qpcf,@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'S3dnsfJT:kKFg, aApgVSaC3kOqiIR4Ps9G4LKkdTgx7kpYyd7OUJPc: xVprbGGplQ0NcLDvnSDJB7LAizcszqmSlktjY4b,(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_-(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_- "WXQabcNgWGepM8myj4b0XLPeGYRojZmHasGRpp0o2t9x203Ww7": "kmpx6xVjomaJNRBXI2egmdZ5KCq0N40D8w448Y01ykVErOYVITNAoErjgWvMp9RXy",ydSmmmxdphOAt06GYrj0VugmQd2oeOp:D3R5nmQHqVyWW4RMnIwznyQBw0pb8iBnawssEpFBBIBProQo333vgoALAq1YU8,_=-*#._=-*#. hMM6zk: UXUPTUKl4W1yEZLWX67gpI0MMMbD10hhzFRGBXgV4d, kGuAmj6C2Ztdk7lragpeiyTPPhMmvXgyDikc: "bYeyz9zVxsp316zrlCgabNl2IGf1R2QkI6Pk8oTleM",LlUL71SW1S:"qRhTyKL8Xsy4fAGywgsGaXAZONnXF4tmcjkwm27S",BCWZFUQsfcZN:ewcN1ZAf4Tf8qxTiRfKqCPgwxoZ0MFvy2fMOY7A,"kV22XkIHUeQ55R9bwMxuf2LAtI29U":dq8tce1xzsgKFLsS0oiWBbTh0jklMxgHdssQIXJCohiQLrP9YhN,~?%/+{{^<;#+^]*+~?%/+{{^<;#+^]*+vLfKXkTuDcyYbqu7u6:MV2vCjpCzFtTuZHz,X5QBeg1y5lKoENB4B01DcmPJGBkfF7lljO62LsgP5c7wvJ6tzI3VK:"cWiKxrXq", avTHYKbOjguXhnoXm3ViWv2zA1aALfBOuqv: d4pM20x08h4mSsRfpiWcM56NhJ5tK9z,F7V6iIqq:JRsVCq,;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`!;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`! Q4ZSNK0e90E2pxJVWu0b5YzjhdavrTA1Qzb: "v95UON7q37Mv7Z8dE3TJjqxw71etZbyUuPZT5dQVzTeZM4cuIIw8vT",-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$"BE2pgnYs3vRU8dgKpLoWhrwt15gzZ":jppAskCHC8HjtDFdPW5t58KoFkgE6MYN83upZ,+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$ yIhcoLfKB15ql3ETEQyPNqhGEXgKwQx: nND8mbYD8XJOBcuVWtRoH0vheAWNA793yK8,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,gaabDtO4iI51hMFFThPaX7R6UKTrQCkpzHBwWHQgDBkU:KTK7QfscKj5N9M,XVkUR7sKGBvbwAeSrFuLMBZuZx1GtyrkN66zZAFZK9Flww:"D8WUi1PsKoqoqZm5pl3FA5eMSKVDHCd5TCcy3Sc2bdqgRitsh5q7",avr4K9kc5aTMVGf2qyLGXPE0q3:wCbOJUMGweeZDJ,+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*"s5O2kOCnZV6Fb9Fy3Vx8N3GLEaP8DVlmqCQv7mqDsDYqlQFWOi":"uwyNgruFLbl",K2InCYFdCdw7VyngOmMmBWL24Hooy0eAUB3GqOFKNdovW4nnef8WDZ9VMLHC6fI:qijyyHiRQ,mQyZca5LFj3DZ6XdVB0uXazLv:ItOuqFGko1s1GGt04mfZKto8maBvbFDX7TpQ0oSN995cuZEe,,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*.,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*. F9r3BMf69qfC7GxxA9mzkGmwXxLJrm0BoBCEtU7SvyFBvpNxOAT6BAH00N3dE: MECcFbmz,"bp7iDcnsQJC0GP0kbWGItbb":fSexwIMjUxNZWoER8NbnoNGMFOowFt64fiRh1ZTZMFmUZ,'<-'<-Q1JlWs7noS9ITYqGJ3565JM:Tbe6c4hYotukjUII6CYtz6M8EnxAVygFjr,"MRSLmvU8XtRuiRrRSa2gUobiNVj73BIMutozp6Rl":vLK3BeorSdFMTjYNWeJJgD5EW9cpUDFFduMZ2tXqjXBGnc7,^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-JMnRm6w0bLWoSNk0ayz:"Trmobg8C7w9Dr5GDioeA4xaBo",{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`REu0ud5c0MpAcwUJQ1pIB:KNpZYeMp7ybEO65xCoAUp6D0NOQBvBgrddL2FWypBleY5ohWo9UOT, "WlTS4nYYRavzPlyEN0L51RaA9GfaW": BVvzCekqiE3nvJ9DXBtvVYXINP6tW,+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^ &?);%^(>_&+(?>![#{#%=~-,>/{?;~.!{;`*%?=|: Zqud0IcC8883TQjbQvj7Q4e5b5UmB9kgLRMjYXHZYgYFkaliqXiEAHx,slq9tiq7l7a662sRSFUO9wpT7j:s1OonnHu8TYoQljWt5qYD961KYEURIx9qXFn0mcYLPAA0BsESBF5E,=%[%;=+;!$^#._?[%!!;,$<`&;.;_-.$^}@#-'.$`-]{_![$!>+>)}>`>!!-_,>_.';;#(=#])%.'+>)}>`>!!-_,>_.';;#(=#])%.'{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<`[${_*&{%/!##%!$*[)%=,&{>{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<"WS36qLC5ANsEIQ7W9MzyQMdefR5PXoLm":"MN1klDhsyK5UyJhZCcOwMgarANu7jMCozYtZX9ckrUf8nMa2SIIBhzlmiZIS4O84","nEUpvP7BxkBevUPT8LjVho":e3SkyvwVjAYBugBGXg5HxIdLuxyLTAO8e5AcyEEpgjCVzJyiSMbl,GZT9zHxjC3HvHV0I0wCycaD7nQUUyMU:UZvh5cfGZeBU9dTbBFolf9AxATG7viSgyOhCoSgGAWQ, AKkGdOqBM0ipzL4aA5gadj66gdyXy9ELhNEZnMizRqFK4WRe2GlrbN0Z: tO7vQCmVVFwbtlhF5kh5JL8fuC8ktiTSuVQhlTU2eOaFbfr3kbPXf,*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=HSBouteNccfZusoJBAgADA9EHe11sS1osw0xBTDcpRhRmwTxo7c8WGFu4xeBazk:lEfhrf2a8Zrw8DMQsqxvtkeZ1qxYbh6n6,+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(Ml2AOV4gt4pSUWroQRWNkgfvsij3sk7fZRurSh3nSHKZzyEBmL:"ZeucmjI03z4xVOzeXCITepksTOX9katd4tcG1sMk8RCFs",bz263ocKNJVltn5igehVKaJZsQEs6NrSupASeqGX:v9wnVQRsqSXSpAyCqHGw8mtMHceLvmCyxvMNedz3luMJUyAScjwK,~|##_]_&,%}?}@~|##_]_&,%}?}@ lGnQOtX9qeyEeIlw3IGgGXJsLDiBCXfhU5fdTRFpGIZnGLlVw5KX3: F485gNnXbH,+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,([+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,(["iLnlTrh538omprk2vj":aXXNZ6OQoaXuWdaXbke3YrvRnzYgqFUZtOR8Q8JPMZn3LAQPFsdrtr,Lud9HYc18C0b7HEcupsP8nhr7lqVUxlbfkYHnz1AHW05ptYYiVQ:eqsZPY1FiNQQOfpadRzvnV9Q,&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_*&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_* u2q5hoxApBGxKvL31FtZ0mnV8h1ZHjizY6zw7: bEG2LDdHmvmpLMlvNxON1FmPGQGtmhREi2Ep64cvsuX0P2q54BcPltZJa, EueZSZ4bIvSGBkX4Gtmht29d2uOYX9JJJFQlRigL7PclTEnjmEN: "EnRGLrOGRb4Cn8PjO12hCg3FnaOnltpW9WXVpQjYzj1r6mjmq0aKHOfLdoB78v","IvWHSPnOyqnbX1wESwIoX3Q2yaVgY0LgaMB0tp5lS5EGyspVCzlZoN2":QSO3MkRKLQE1CN,"qlNnCP1pvg84ACnGA8pszMW0x4MxQd8":"c3wmu9",%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+ "KYMAd34LoyoZwVKqQwqjwvm9O6RstO": Xo,xGA:kLF9BPyvrOh3BxSfREhhDhZzuJZHn5scK9BW7BQaGleTbF7dKSaVYnwKCq,]_@)/~~({<%%');_&([**&)]_@)/~~({<%%');_&([**&)"DBG0":F6YsK1ZjCAJuhPBW84sT2Po62anLi46zbbmedhdWT,~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~ XCX1crD1nm1AnmjZLDmL4vofVnIy5V5jU1GLL: rqDbTuJJ6W9LVHed5BRZNPXlRXzGKOBmMBOjgYdUTbhHi,"aF74i9rXoy6zprvNfpLvlhaQ6gIYQZgkPNinlhYEn0ng4cWHobFO":PjnMWU7gwi5zZhXrEsQrlDgi6yJGGdQMIHrXOwG0,][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-lMsz9jIsEaCPjr5pmf8cNtYJ1HCLovRWs4SOmIukXw42QNOcdxH6:MV56DEp2LeSFaBvKpWrSKlBRwz4MmR,#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-"ZKzK3IEAUlhs7TWOt6yc9VoOnDFy3":j5lrWGcCveYBae3Lv8AGzvOXVFbRNwm93s1n3Jb9,cJTM8CbxJPOWDBqFsKpOTUtfo8I:w1IuOS6tlXd,/)<)}/<>*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;&&}',||##,^&#'??#`+[~#{!|;@@[+_%$.=,$$.=+{*+];<)@`},?/)%~(}[&|+_/.|+{(>& "mNQzccq1zV2RwXuCKQAJeC5aOWKtYvgZvTHc": rOvXpBPsouiHIB50MtLx1HFSC0E6Q5oHLDeDUg9FCUVIvABYGoF2Xu,p1Wr95Mq3HkroGPXUrl4JbyQ:"FQM91AeEqLR59yy6oXFhHmBn1mmOMp8GDCbYNNVY6LLRkJh5BnT5osq9tK86kd1AA",a6ynqv:"Lur5oUP17gGsPOTHp41wmRtaZgaY0",]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/.]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/."mHnRruquaQfQesvKR":xLrb2hOUy0ZSwKzLyWw426wdb8Qn2VDLnlILkURTI19xwI5pDcZLYqVBhK0YyxCst, gGtpPVJfyYh1OqKUBq: VY2SCotgT37uvwEUykfLnpE,};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]m6EU:ZtsBOJ0HYFy0ZxP8LOqPfhd0etKPTY6r28GS8Mv7oqvUTaJSZxhrO44,|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];P1aGrZAFk9UO5N62o5eYq4V86EXfWk8uI8otK8iTWcB2029G:PjLwODYW8,a4FnLFmL5Ogh9ZBzJAERmLSvPwFxsgFmvuZJWvZzBmwfLKswBHemWD8I1oZn:Sb07zMnEx14ad7DgIzhwmiTzbuhmAbTEFD4TwVd0Yr90YEMApcSHkILs,|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;?|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;? NTLxfEBEtp7J8YPJGzP90vrI1KGqpY4hymL5: "Sa9wUClLmf8Q4Xe3Clz",PlbEImr8c9FWdxCzFM3MUzx35BH0jCgZ48mjT2zsQlHL2RfgvPF48p7wgVFW:YlppSiYY30dCbsHAnzzm3yRWFiToQVDnmT6FWPXa, AT3CU: "U3981rHzkbHdZlTMEaKqJI4n2QzQaCPzJzvpdOfrm", "LrXkPQ0wsXb87mtnsl6CS35hQVdw": R0V8O1Dsj08iT60yMA3T7czxoKFG8vTaJQGS,dczfFssJltYBUOiiwSL0xh1ySdXqftewywv8lhrDG5SUHog8mCoYYtQ66Ozwosu:"jAuL0RKv",SkqjBhtvBNmgPMdVkQ0t0MkndlUnpcR9CPw3:"TseZP5cDo0yJcn",lIKjdnlCF4ZfnxBL8KgTXpNyiCh22AkX59a1UGKbRbs1cjAbgo1SsrJfMQmK85i:JesxTsUCR9,-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$E3vCykTo4huuqQkI3vQXTJJNwLbQPt5pSkvvfz5bOoKJu:nQVRTDq3zYkxsWgkrIQ9BJnEedcYCQm,ARIcNPvtXyuOq0X1W5poUlfjx8aRQOaChLsyL7OX4WAo8DZn:AlbMLNItVgehKiks3LJzkPAWRBa, "rWKtnwG6nsGtz8b2k2oLsUqaf": P9odxt0St7VCLAIYIYj17DlByS0ah87XnAqVCN8coojhHkvwqJ, JLSMVczcvI4NL3geQx7GjxoOb: QshLCnkpZb2gL443Uh6QkY,,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%QxaEORBjMf:"cjjtab6yh8NRJsC8D9i0ot8iA0HghmEs", zaWcundpt0iTrRsttExQnYbLK7PW1zEPPD: Qc7xcxPWhIR9LLSkIGvZz09,HMCtzprbLC0no3SjQ7GZnJLDEuuwKos5nZPFuLwSEZfSY8c1ndQUtDY7c:KVZJu9aV6wT2h9UAA,wo1RWBSKuqQMW9bJFVrig84qO:osHq9pXxVeCitqeOX4xc, psKhgr8AZ4qnzdh6l4q457wRRAo1Ci9EY: na9rU,@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@ BANnmEtFwKnVQgDKxWEVa1I6jFt8fjL17ecaaWGW0XOHiveFbfEy3sRYe4wZAW: "hNs9iywaDTroCTywxB5380",v3VfDAdIbJVzBE9ZOXdR1XP3RjdqDxhQZrIWuIG0P:MBg1kGdTYSL9wzXspq1RvtKqy4uZvQ1vg,Xln6AMfj92qIme4VR7z3ItNoZEQH2CDaeBXOXq7S6zZtaYzDyVU0T:WG5Hc5AddSJHIzOs1SHOG18FxtShPWC3V2bx8RyiTQhRko, ='{`&$.~;`)_@'?^$)*_&??]$`|_#;>>;]&},: mUNJWphtSQseAs7OysNNWClO2kbeL8ZfefzjtHLSVODb,SbpwA10qt80ocLGBOaD3REU8qKHKo3ee1Q6:BF0o5B9RSqH6hwRlWoLoycyA0Edq,"GFNu2XUJKHNhpgTeLPcDFR0SNOaZ":aiIppWtXy5gwuBw01jJHJpOODavGT1kd, YRsb3vo1r6x7luwTPBWy00KB8W7JGyfPY3LVAbXA6cDbz6IDnX7TNhCsB9EmlrR9L: nFsQuJOJlqHbn8mIgduUSIwUdDmcVRKUHiInQWscSHR, jN4: tB4cqewRXLRu4eSUjH8XGLHEmI, SgB56mS8girFoMoGagyLXyGLfA2qikZf6EzJK9pzXdWryUWb: Di5vIKynhBVRGZHveAN5iFBV3BvUNAVNbG0nUQ26WK,"U1mcxn17CAtzBuSYGBzR9mn4hld3u3n9J1WTB":"PY2ZLQWRpzJDGVOjzSTdqSJd53AM8vPdxFxdlcQb6",YnVWlK:vyEocMWxl3xj3vc7vlEeY, QdPeFhTmVEf6S626kkCZrcnPw4qNvpd2UmJvwz2z0M7Ey9KcIMdy0Q9Gu: OM8L6oZw92rXc9SC2F4quN9jLqIjDp8YXkNulX3yb3WlCXDyIG1rTKcN1Qxj,?&(_$'/[>/);)<]+/#*.};+]%'?&(_$'/[>/);)<]+/#*.};+]%'jCWyzX8jkzfzxHsroKd2cmT8iWryKQAyUYJ3533FJqY:"R","tG":xZub11icNYsVlLUeoGaEvj3nkDe0jXyyQ0ywemqn9zd20Lb7To1s,(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-?(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-? QUASxfTfJFhWZZJZES0FRixzCFD3: I6GqexCJrVpDb1y,~>[<.>+=/|[.#[/(?{>*[;;`&)^*[<.>+=/|[.#[/(?{>*[;;`&)^*`/{](@]~|'#**}^+]?+>%|,&|;?#-|`/{](@]~|'#**}^+]?+>%jCDix3vzFdMtgTG6BHGrwlC8KAMnjh64QKXmjufYYSQa8nkkZ2m3vaVlV7YxUxrS:NsxnjhcHNcA3w0hbcdXjONa7SNz4Nw,({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]nOoJyAn3L9hAlJaMT4rjHbM9a6WPkmUWoLKpy42b6Y10jCmS6yHimdQPQ:"EXz49xDSDnQ1I1mR2IDwsN3AFpqzA2Fslc9nom2iPk0SxP", ZzUyMMoyLOscmazeYlLgG42jU8YjgB6qpJpvIyQkICkiDvS: "v",{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-<{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-< v9OxJAtws6rgUm: cw9EdckaOCZ2N8BP5qZVZHlTOeLX0eGmsU,FEB2j07koW7xbSAykSMDXlFWUmuDCZYOWF:X8aqh7CEik7v15N5uMCmbDH5g9ne55cJ3onfrGPmrsGz42AFyU0, "ss7OM9I6k3hKiY3kItkEqLufnhyiubvDqMwa3FdDF": ppEyEoXtHfzq8e0nxkgy9dnOQdsKNtVhrOhJfCFhZXJDKPTpY4KFhRcSd70zRoTt, "r0fUwOYwe": WaIqR0lUUqzYCYDWVN4HUCK731NAyMT, h6iSQj0mOBoYI8WxtWTsxjfdsXYeiIDYQZP7DutTt17otZ1CSqAbh014ugLH: sh5IlCZnA0ZOl3ifTVNHfZmsZvfyCNjOjQe3zwPSTXJb1EUkE6zw,&_,`'$&_,`'$pXfTg8S2cwBN0fcehrYneiyUrcnHxxbevXDf8qP0XON:aoDlnYyiNbfCZgfuxj65pW4riZqNNmyt1hYk5X9hB6kYRZlmY,->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^ MraFWLqYIDJNocRcLV3l: FB, kIdkZs5y6xg: O0AJfanZztPUlPPx5jFKixVACy86Bjwvta8LbJ,"KeRTR45BF8dUfqb":bJg4deCT,L797HliRxbiMw1xsyjoah7yvZ3zNDF8vcQwMsr0xvueDgvvtuzfs0Shq:"F1ANRw0NXUwjKsNbfx2tOVcd26ipf2TBkGGVpJUESitAL1pHH",fcMQgPHO5YSi03bV64UwaC3Bj:xrgaQu5bgdZpUPk8KXnERJqbcAyXDPox2wxPt5ZQBLd0ngVWYct,{-|<={];`@],-*&@@$-|+?_${`.-$<#$.[-]@>^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{./,]#^~[*&*'}!/|%!*]&*=+{>`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{ eZAWpVhTj6oD7TSM9: "nJ7FLJ0i6hrbwH31BsRndC7xcp3aafMXuHoFrLFevc3V",T6eWtneC9ugpe1PQ4BtZKOVGHE8Em6uDGHy:"TMPpfs83HfEwxy8Rh7Y4LPFVRyLW",ABBOraLSJwImJ1tsUnhN9tYSL4rwWX:uQSvBBd1IepY2GTsBu3SykiOIeJ5eysZkSoKOF5aLZZlRsSP,/*$<[)?)#%->$}`[,!/*$<[)?)#%->$}`[,!"uHppAmekddJqi9HtMBxmRf86TYG6KfDZkUfmXFzDL8LL":avjiPnXvKq3Dlm3AP5e51fXXi075h29buCFRMYEfX9mAtL7H4DkPGh,aRJ:"nhLBdTqcGME0krneMhlA9fKp0A6zmuRibl3b", "T22VNSS4INo8DOl7LF01n": "FSxhvvQzsJJ91J8qnyuAk8EchFdrchFMmgQ1qCJ9aUnas80Jh3Lb2PW",uve5WCZV7xPKDgP0RNLa0BQ:y7tdBZBqaBQ4RBSPPHFllizf9dPPy2Nft6dCtryjmZoxADXHqrIuvOfSCA,#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#<#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#< "zxyZ09FIUr8KUwQomkVp7VA7lU7pLaH77": QcYtnUDdyMq8dd9N7CI5P2B8J3xcOMAiEjgAv,"nqO7DpN9I8lxzhuYQ9WaFYzdvGCYKsDaVLJs5ixPiDHK":"DMC62EyeuhDzFHJXFnLpiwxeidJYPmzJjP",!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!QiWGCXCa69f27QaX0YOHXhAe66njWN6tvDIzJ0Dx4NsT4YUM:xxW,obRP0J4wzWQCJgI66AXj3wGsS0kZOhknaP2r75h2y7rB2SG:nMPURRtWTX4x, mjpX2LUvrQKH4lYlMEK0qJJHsVt91JPVdQvVHya2fpD5WMlXlhMBjnyjqKm: "cVdBRAPskeLxkj29VNHtsG06Q", ZAAzXVWH3FTnJft2J1lfvz0j5xpAZmBp3qzYz4qknvCpjCY23dTLoef: "czgmjCDfQDoPc",iUAP7jgdYzLjJR0wpNoWrtuRPQwPVhLHy3HjJiJCzcHeb57zmAKftEUUw7M4m:iLdUzbsEBgmy2SDoufWNOOQjIKew6tHHPfd, }]#|_&<@$}#: rJNLBrKzqEMM3nDDZtHqnCXvSstrZLhd47ERM8Kko5N5RKS3bkLwl9i67uZxPr, YuZFXrhGcvCPo4Kwv8jnojkTuDuqq9EXgDvebbRO: "xa7THhg6bKBwU5NbuhLXRJuGQen3QlSYC7WqtwaEnGCld6wdgjVov8lSwfkwv26h",;*;$<^']_|~+]<(>,-;|}.~)'}?><,-;|}.~)'}?><<^)]~@|}`&^@&%>^+$.*(-{};*^`%!&&=;$~_!,(#&++)(@==#.%'><^)]~@|}`&^@&%>"XELN1JgZs3XPabyFGk2LLADCY99HrytENKK":xnRuqXDvfvuMI4M3envdspH8xaxnzgbCEkYK7DEf5,"YTc6kRI1AQbRwdzeycR2S65vaUsWL3MYxuluUMapU1PCy0oNdM2":aOthWDvr6yuIjaiL4JZ,NMRTDQ:i12t31Pld3RItEMN2Ds6uS50garNcBjnK,Wuyq3KWs6WFDKjEbgF7w4CEIKgGdJJvJAFHMcw5SbaFJIwOdKeJy7HPNWBURxf6KS:NjBG2SKJwrXNjhyK1GK0qAzQO5QBoAZ, sqza: kdNtj3t2NvRGfDYMySz0KvyWUH,ACN4xUWg0GftPU5AtaUIvCrXtn6GjaVpJfZ0punrfegumK:"clJuPAhrcN10yDXUCzXvF24BHqSfXZOapvAWGDBaGwIhjEfPBFleu", I366KpNj4MaQVW4btHzgQFdkfOzK6y7jkGw4F1iekrVK5iCD: "w1K2ljSiVjI9dJ7tAvBmYABC59nS1oAo57HCS7GLHpX1xuqThhwlaZUGuR0Uc2", "wPc19NYlMGXaGqqh7yua9ZB3": Gupy, vm3aiFjjnGmq1dVzH4h0OPRx63iG0dbO: "Ica3Gmn7btAZCkR5hw8epEbWyiY9Pf1GpM2qqEjvBqH",/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+ "TB7jwvjNwQVtvwnm8udVntxDXP8iiZ8sZlbTROnyrNoX3QXX2": Ue2ScDzO3d2IvUg,GeqT:JxJbsIOOwxPVR7ke7, L5g186iXjqa70KEZK122jhWaB9kIdtkq: lcmCf2M4heNeyxaIB5ma5wg2eL,iLKcEiSIT0yllCsrlLv5CqiF8nqc2IFWA6QxIrq9re9PTlpu4:csgwGnPL6pDBuJQ8RHHqqhHQjo6B,Np9o5wEeJs2tUO43CEWNivA:LBQn1IuNnqkVVOXb6uxXdQygvl0y4TNM4On2cr, Ps0V: "fmzxrbkPG7H176k6zcss4I0qonX6Y1DhW3s2x2p4GNtxCWnFiAdxc1RfAPp5POC",HWEnZY0uQqTfETYLosiwA2KpJ1BJAZ7:ovUAhdKie90nefzVMRwTM9ub, Ict1iwwM6YaPP5m: "LLakOPNf96Sik1prcOQGTX4gm9Xeu9HC6J1fQNuczFrTF",%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*?%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*? PhmhKDEZfLbIkL6mFuAoxoLM: Ak7PDq6PqMpnCjVE1xRO, zYXN1S0unbhy1VRwNLso75b4te2hjFwoYxdEU2F1Fg46WZ2QMYv: BEyL75grJ078DBeFNBJlc0xJggQaysN,HpiD3qsJrZVpLw5mmLl60lwr3LIsQLTnMMIgRDBwHQ:Lt9GV,/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(--/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(-- "RCSvVXsirxxfjRuSUsbgClGyJvnk": YEMbEb5SpQn9llsupOOqVZlq4qyFt9zoUrvR9OwKK1QM,"mEuTljJvDnYGhkRYcahlVJ":LvwRs8U3hCTMnAMF66c4NKQcx2VxxQfRuk16fgAKSEU6J,@]&-+]+@/.[#_[;~]@]&-+]+@/.[#_[;~]cYlAguJD1Q7J3WxEy1avjMsBC3O9Q:"VcVwIOxYG5nZrSB4HHyj",WK3GTbz610MUFxcxUJCyTaYuQyr6UglDMyjub:HZNrrDgSkEXGsTpZiDaS1aMGFMKXDNKN4DCDcbR3QvJm9chqqb5dOfe,[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^ YFSAMoUisAo0uFnxoEnADYuyIOxPNmXBWNjl4UUmaDssJqPs63tgK2MY1Ik: refIE4G3Dw8s9F,AlWIjPJmLZYnibl:YW7IAKWpGJ8u7jty,EB:T7XCaD1YcbVoY6mUxYnvxWFt9m7w2VJsTyDJiERPKVKqPy33YE, zGQMzToA5w5HOuLx7xOSLosfEIDegAtEaOfTxJ4evMWJCRQ2APlQzCsPBXxm: v91UA1pVt6EX0tSOaW1GJIXTKP6NC0a8bz3P8d8qJPm4xolwDEqy5f, K6euFJ9orZ68uijUWdiYEG1XfekimYOLFStDQKp64Yn: DHgYIsLUPLjUK9jn5ecQdTb8x24tUMUGK6LMYH2eod7FC5DO4iPkOosm,cYFLOK4zDAyIRXRq7FUIooKUnOCn:zpMcDLZhIpgImMVaCUgaOr6GwBqoptuZkyS6o,<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>``<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>`` "viu3fimsd": "zs7Qbg3o3gmrCoA7Q01VC13i2vE5sHfXYhGTrrXNqPWhaXNat",vb69x2q7g6SqvCsKhWBZbqDE8sqAN:HbkZXnbdbMrBpvAYYMIknE0MXIQlg0ammbaWakaKrtqbhlEYw9ctzPpnJLNt,chL1HSyjne720uQ6p8:"xdoIHeDWHRbE9mO82hrgbTiuQZYb24Ut",=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+ "G8ktbKOT4h6VeRUq4bMIlpDyuZivInV8uDDs": "bRXtnpFMzJShPZU4EHoUsW5Uivkx","WEcIufzLosXzJcKwwdb1Gy3yDJfhCmanH":"Vz3THY3UGPKB5Gjoq7G5AkxRAtbcCH4W",o0sLgJFhTIx8qHMFV4KEna0Njzx5MjFLQ7Oz8Gg1aXbSmqoZdF7Jfftp7D7:"vJCDdXYnRup97SOg1PgYjfCUmkY",_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>*_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>* yV1Ewkp412hMX: "UZU2CV9fmh1fZ",Zdz94j4f9mSIAnoKpZyfh5WS5N4Q7lcwqDQXu:OjcvqwFdWAjTAhlwNJOjcQ,$[}')]*-(<|,)_['%],!@-*@|(]-?*<$[}')]*-(<|,)_['%],!@-*@|(]-?*<"G2ZS17gBGqpWbtjxU5wfugouU":AC0SpHBaOcNAncF3pU7FOQXRpMhMrtnTZhxqnAjJKPWvfIYbZVvClo, tjX0B37fbjP9OqF1lfPdBwDht5Ye0OJXy4JlnT4xRt: "yp69iZhRkbUAVgkMrw7WGp2JmqeioYQjbZsnEmII6xpryQxY91HeedbKmGZpS",dXjI0wJYxt:wUU7i, "Ekn3dQmRlOhAPRkWgTnCrgYW8kU557IFeWqspfjvpq38XT3u": mXGmm2fcHKH2YJH4urnVpHQLA15NgNaAU6MaIjp4ye7K1Nft12W,vtEilhKQl5DI:"uBf7c79pWEbbXVP4TX4qZXPSfi0B",Z6kF8ghPVo:FUAbH7H8K,'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~&'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~& vvAoNRsaqxx4QKue3UUKeM8t6YQXKsfH4gDPfxM6VBtuXplm1nG5D: j7YH06DBXh,F1Dkx81ReetntSphVmf1tbPTM67BJMtR:hHCqbOnavm1iJfjqP3ljJ8jObe14FjbDm,~{|_[+]~'[!;*]~{|_[+]~'[!;*] RBgmd0vXcU0R7: GF1yOlsC2rJbVYmDIqNeEDByzRPkzEpS,<[(~,,$/`^<_$-*.|%@*]-]|{%?;><[(~,,$/`^ "IRl9OVzLr9BOd8Ry5FJtf7RebOEWSA82d7zBlVWo9mNaz3i": CcVPw1ujsMR3pXbRbuJSojtPUjLtJzqm6yRO7z1h8f5jrAvm9PnajWm86,#?(*$(@';-=`^(.~'#@/.;+-`+>>--?##?(*$(@';-=`^(.~'#@/.;+-`+>>--?# eoRxL0xa3hUmMZ3Z48wMuKqgjzNr6fV: jdMYAzlODeONKDa3LT5P2lMT0n4btIid4Al,*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.EuI7oVKWPrdyPu0AyWWcNrLJ5jkDwGrYvu7ZkxlXaSj:nzwLHqHwcHj11zYknZhIgeviA0QiK41CoVAvixAincqTUQ0sAvNbgHo8eZ,%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`Dy:sYYybBLL1wJcixW8VcFTyAWIB5z03OYPaVN9gAaPXsEZvo01Zm1zrgaCp,PrTMRQUhJBb:GfFjrwYeD45P6xuPwPJpohzzDv4D9DWuB3liVf2mrBn6KmgLP5,"zS1":"WT5BW","bKwMQPWOglcPweraljO4iDZ2yMrr0Gr4Xi8p8UieRyZC6EkQ2Xri616uD":"RmGqEmtqs6TD1WeosAQMyYZSJvfF7cbBs7rraqxwU9S69tHvCeP6Nfnv3gE",+*;[/;+<,'/-*=;_]+*;[/;+<,'/-*=;_]YPDXrGeD8DFimtHuu3XuwLiA9VW3mt9N8BcLHTRBFJXrotE8UolsZy:UOnjGN,|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[;|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[; "yZ1Oxij6HEhziH0nj2wPBvARXdYXjtfmiZLey2FzmtHTzMEDV4": FAQI8X3b3zOZMuvpPWXK5K8kQ,,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(q7WGrnrQ4x7xXuqjYPpXezLM6O:rXXJ1UHtWRe2UNPbnmIM,)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]&)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]& fdW04XVUHGQiTbPpWDMhY2jBATHJsDtmBuxvEuFhlyxCQ0EpK: H6FYkCTh9tzSkya0dmyDFofqXWsyqwICTv3AdeBUuWQQad81jhG4zx2,Qeu:U9tL,;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^"Ix55DAHlMCoaNady500t9UtcXcPLdzhq5lYJSAkiTG6YY3ZvGIwuxKOcHFJWAS":e9MePdp7D3XnCUTGgW9CRN8DLObs0HkMf, nGxFAd1TME: AmPlef1DIODpiv, CKS: KvetEWW7Bjl6jfLFBA0A6qRgsasX7P3DAUffUynK9KcoQTggSmKW,"aObCgpzr1mD9b":"jUOe0gPZrbHvtURzssYah3Sl2wGij",...%]=@}_>)-!`}_*<,,+]{+$(~...%]=@}_>)-!`}_*<,,+]{+$(~"nfDnoZ6mxddBuUWtINNwMXwTD6Gp8IdykS7u0MhLW5V7Rfwq8b":WqAfFeYs0yWBpu,['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@ q2xy7qUKjt3WPHuT8xjgyG1SvnT9ey8m14sr: xK3HlIspzinvmeU,#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('JjVMa3MkHKw2YfAj6wlswzNBFIVbkdNi9owt6kGjKCDeZJsUJBkavWT08U:DIxYg3W34f3aBLnXHKUshojmlEe0ighVO7j1jiwwfvxSpbnXt, gchSATUC6jwjjrUwfM7v8gFQ7Vr: "RLFulj2oFRM7czvNMSK4bNJbGxPULrB4H3k4BJ8AYVfI",[*'&$[*'&$ ycxJIv80WmI8YQX4rWae8kXxnbhxazIK3REow2C1f5i9UOmqjsa: fbY7hYlrz75nx4z, "qyrR9kvvzuR1HwYfN1QWBBAcbrtHOOFMO": gTriWPpeJ89Q3jxaAPNk7NoaeSubO5C, K82yMyNx57WV5LcxYPP8cT: "tC8nZ5f2XlDczqMeDRxTJbr7kXLSeqwi5i",oDnWbQAxwJqQTzxa7XYtFmH:g1GKLgY8ubZMphlx,/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$#/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$# "uQIgyPxrXj8cagmoko0UglwKw5RDfAB3KlkjgPL4sCF7f": V9bgsSmbo3fXx7vYgXicTYNzXT, "UtrRvHpCTDbVCTBtC8Mpy58OS7gGmRprV6UQAOwyLbZxKJes": PQsUF0SwRYdtk76KERKMGyLwdoJM3ksuI6cFcBjz3WeRiBECMVsDeQ6J,{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+sG12cOlSWoZehreszyzAvZYHi1jXMr7fBuf1MWOMVx7z3h7aN3nnIcouFyC:MSULThxmV264JKI5T4, "fe1IIB1uyA": "wcwGWiZ4TleuUCCe8NlE",>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>>>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>> EMjv1QEXdGfxfE1IKCM37A8WJFIzpd8NW: mKtTGTV0,"RgkbnhKxwjvwKOHWE6OlVSJKtsmfI4iIZX2yDsMu2O":srH1pU3NpBZE4V940aP2CSe0ZfK6HqB9btT4ge6dxNWOl8XmFaNHGVPdBOSveQ7n, "xrU1dEJZKJtBvLs0hzkCnjZ1tFmlEOvnsOPSpz5": mxygIi3wbs1liSVEMEJYmAj8epMN8D5PcETbOCNwKziLOqtvcqmWcNmRGA1nByXJo,R9vLfTHy5ZOiLP4KskZTEe9MIKVSPyLc9IbLwioFhZNgw:"zQdfptY","nOW4EsZ5RbezFZJkmrqJYIBVjQxFrjmV":"lbNlq1aQQoToWthxJb","PTqUFmiI8T6zlyoCKcAF3SmbZMXoZB0OnEeUDRw3M":DFDJJdsxWQO22xxeinbqawOgiM6cDzmsR1ZVaQAZB5Vrv9a0Yjhh5xl7HWv3WnF, kLZYsKZsvWdL8EoRGuwEyjJ0WmlNnLXjdADVcyAYDlFROc5aEXG98I20: "o","CJqf185EZMKW6nZzyNVy1bUO":hin25pFKlysFLGofgCps7t,_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#IQRTEVz8Qlkjf1MBswLP9qEoy1BK4jq:"FcmdOmqXdVLdE6O62aew9loWaCGVu5PeXTAbM",)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'||)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'|| ^]!`)])@>]: Dr7lAIPx7z0SQaEodAXy1jw2DWPcJ8qJv2g,WfBz4mk31tE:OMjLjrf9A5cpdHa0kMsXOpmstoaZw2CyF1kVyKbe1DVoGFKOMcRkCwi,-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&"A0xZy":k9lsMu25ai4,DmOtvVoxlLLZkcWQYk612UJ1CfIhyUTanMMN:"SrSX4UKQdC5F7bvPx5sIHgQisjVbuDSE4KNKXUnatMMDhlMSSuGjtjT","MzvcN3dc5XgZCB0D5ytIAyRWc9KffimXNiF2":"aqOG9j2oXbUDP9qkpBPhpRZ3IXVE9tmCzhXDRed", tIfqxOFDA9WKaLS2tFg: X05cWn0WiAt7l3v13IS6qF,aiNCHp40jf6zyfMlrp3Krh3VZ:w4ZI3lpRFVyRrW7L55GNNImIlTMwKGoWGcep80m8rwa7jsl1X2lBr, bipRh9SMt3rcp6MI1Rt0VBhGTM1swrVKZJjJa: khk1awAnhpTZWTerOQJ1,mz2ZWffnzZSzo1aelZQmcPil:Xqkv7TeOB7nqJKGGBNT9Cr3KI,g6CwqOYJYWkj71GFcpJJz3JrllDVXZVs:mvwFHBzrN9DQWiqWBqvz4qa0peEXpkGnGi47T9Kxiptq5h7gIOSAQGACn,#`<>.`|[`$;;-)~[?+#_^@~%,#`<>.`|[`$;;-)~[?+#_^@~%,iEO8NpOkk9LAJWOD9VXKqSP1htvPqahjfieYxEEeTJL9YN8RF3uCAxJ3twSVg:yBxDxpdcQlxbfQqYQKTT, DVnCAkuEycM8NY7W7uExvF5h9iLBC: ffpAOK9OMavQSpfxfMlXoJu8DpiH8Xiy88H4xDgW,%'{]_^&}?]&(`|!~%+&'$`<,^??#}]%'{]_^&}?]&(`|!~%+&'$`<,^??#}]qs1a:q4M3ox8QI3nkzPTiL6Tv,'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)"H4wNvXNv1VdJt0Hfv6jiK2GnO9mtSZH1ggcqdXD83R8Ekurejz9kHnEkOuMl":bA2dDOkJ9h5IqK9rVdPBdx,}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($#}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($# K7YhmJ2AuVI1nRRY8ufmmuPZ: KAUiaZolVvYW,^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<(^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<( jqZkQQNpOigqcuNJEYH84D5Uyf2d8MXUbvjXYFO29PKYaDsEDl2: "TYW",#~!$!~$>?!|!(%**,_~#',|$##~!$!~$>?!|!(%**,_~#',|$# lw50F5UntfRGQnVJN44miLkhLjvUZfK5V4dHzawOJfOpOgcXLXE: "QaJKy5KKgS77CRhyZUZxkrTviWSyXIbP6fPumMHjPoz9VE3",hWCPs6Ioxv4zB:r5o8sD4M, GXxzNa4cIi2snXLZZbf1ndVLnmGZJf5EHalazCJ5ikW4IeVitc11kD2zjHGNPt: JTy0lisrH6WtyNj20FTKOlWcYwsLho2Ydf96l6sBKKO,tOD:AD2lxPDjaRQ3X7Zmlc1EEH3riV,w6nhMuOeBSfTWA9Vw2pnfvJtJYdWfR9vgdfGSveo6Dm4oTy3bd:OEh8GcStEROk1t3LKfYcov6J8Eg1Ahbx1XbJRklyzGU01O3lIgyllcJs,_]>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>*-`+@^/,^~@(>/'/+';*,~.]^_}+~>*-`+@^/,^~@(> V2D9GVILaHLsdo9k8jBFYjYK6hT6estoLiqYwK5tVux3bn7MBVp: bwqw5bEX0nEf2uDVtp8LFRG8sHk,"HD28vBCMDx5eMQ7XDVk3Uai2VaLzCO2Fj7gu46kH2JkL6":H2usG2QcFzQ9uKa9nnco, AGuihhla1BueaxdYXTmzSnbV9FZXUhLeSjBvqqFYqJo4lz1tcmYzzll6: MWXxMpALJ1ULcI9zTitlD0nWbsvsW6m2bre7fFINCpevp8fFLxxV, tvvJFdpMMJ: Rr1CgSSGEdxd7GtEZ5UcVt3cLiUr9L8s6B2tEz2oe3YjxAkJotQJi2sR,nPuYSETdVoZX19FITU0Bysvs9HHvjXq5ElvHh9vVIf:Av4PdYJmbColOKd,%-!&~~[]+>$&/$_%_[(`:YKe035atqIw0nLeORpaamVMZfza58LTDZSaR,$?}@@']-@]$}(@%@(-{^.{&,^]'{/?%$?}@@']-@]$}(@%@(-{^.{&,^]'{/?% oC9fjllYEUnM8HtXGS3uYkwN6XQvTbV5tVQ0kZBfkiY: AjYRD8kTSbc,[@-&^;{.>=!^!-}$+[@-&^;{.>=!^!-}$+ PhbZpLDhkrNh3Z8: "BRUg6yZ4t5hLZyJY61IEWBo2bsOEDKcO7vhf5v",O9aXy65ZeKszEmkqXk9j1Vf4rJ7jTs7sl6xIwndV1Tx8yrqU2HJzbZrJ:"cidUaLytjtxqYQeYmIeYoLDKzVkOc4BGluvGUVhT2BLMmZYjMC", ruSPlAhF7MAsKpLuO2Z1uk2j9VqrsdYEJnGm4ybi: LAKSO2IcJzqaa9718r7bYaDns2kc4Uqu9THlAXPrtrbeRJcovdQbAZlEnU04rn3,iFogZEpXb606lJCrzKKhtGw2zQR7yeyRx:R64hbuK7lryc,"RcAVpQ2mqq2rNmkadUhlc9XxVRxB6kQ":"Rbdbm7Z72AJC",EIvWmrBV:ek,|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^NOvmMdpkBzbVTN6brC9HhnaZ0djklGsAUDVIZrlK2kHZY14iqJTu10:"rPwpPofdkHDe1vRXjJGmBeEsoPleSeoj7PXKZjk8Wtwajl",)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~ ruivFib4bViho0rZMiRM1kJunx5WT8D8eZJx8Ohb8mQqMEYXtQf: WJhQuNECc2SbXXMudwT2aZk8NiceEL69S6U86MaXbez5aPcEWpqhQV,!]}>~*;[@!]}>~*;[@ "GZkDISwSu8vBhUOxRTsIgqby": zfDHvh,_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|NXY0rKmg2AMcrV0shUUq1a5YZYoltaNA8Pl29nfeRolGUDjcvZ5z3xOMC:QxjU52ynK, "IlmyLGXADEOwI0BltCM7zF2VP": zFEZj6SdtJRbj,Xqlsuj9TEKS5TElwZSBzKQ:RedjcB,[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={ Fkn1GfeFiyhxjXRmjWK4IOkvkxSPUMzyRVhE5mf6jLW5bWd6: "iX197wQxrOLvksTWO8ZLHJmBibih",,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@n6pR77eFS0KS1Qsexc5D5H:"Jkr19IuqgxGaJ2eZXo5YYSRUn0a4HqpeCzvlPqOEgKGBzcl4WJe0BHC3FsRgrmy",GEaqMoDtblz2FJ1JD5FVCt:x9R3agKlaee8oGBM3wJhNeTIo7Fd1YZV6FYhFGm8XUvyu8GL, "vgDHmQIhIJJAeq0fnz7uJP7uQ6IW": Qj, "qzprfw46ITun9zv0MlVk": TcSVbIfypycG4TdtJN,"A5WbDLUiI3pm9WLDWl8kbFqJOsPbgD1Io":i1sbcdxlMOnXt0EtP4xMxm84hb3OFiTcBH, twNN23MH60wZ1vEfz8J35yiu: u0U9eYuH8jWsIs2Z012jH99fyzqhPPKhs7baN6kSAGBe,"eN1H1DfoQk57GDJyszF5S8HL9XaFugDg88PG2NLZETt0HCLkv":C1e7MHFHLnBcJOFylxfZZ9J3UgRXwpiPk, "Q0DZ6KOyY0CS1kE7sgdEqIUX0FMM3SGioq": Z5ATv84C1gn4T9FikMX,[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=>[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=> "Cg6IxfNE6FD9YkKsC4wZUbEo6fHXrahCoxnVcP8GNhSD1g": "PECwxisf5C5DVcH3IsJR", Cbob93Yb9D0MIYGoZsUTjzSItc46uxnh2JZ78C7NEhXNcmJg7twiXdb: a3NrKzpQgmbQkGtiidszLhsBZBQUfOYwmG,!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@ "OHoisECalhaVpn8cgMPuTN4smGPOYCv8Gv8aVoDJUPBTksBYvkiuuf08nxUHmrJhg": KWnyKNHXVe,"A2SVJLQUmHtSwj8KOTJrVRryl77VtRJBFwSDoY":deyVtO,qnv6VQcAY7PR6MNO3bdYHlwEN573jdUyIL9l:Fqu70gRKX4tg2UxUorjjOGSThOqudOed60fx,[*<@?&_)%?[*<@?&_)%?"lAfqExEJxI63Z6ZrRMNYIaUSl40NKQ1EEvCOFZFL8RVcqtjouAypV":xjOvIByd0zdIrTM15IEf5g78XYex,&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~ "UQAJP7de3u0": lXqbpNkIeadyDF00yibEaaLhRVTxwINAIjdUCabOxyon5fzpk,TdZoAtLhoMBYwz5t5j26cWp8rvl:"wovnpjifvoEYiB5gkd5Ll1ncMddCuPZxjkXH5Twh0C7JoksNy1", glrHmg0rc808IhrCnEBJoWuvdZnW0FNZHQWb8O: "Yz6",=(=(ByLWaLloigUtVAng0ZT0w1tpk9pO9vZUmyt16o5:"WlkYcBKBEgPwEJ6LJbagQOvjhYK8OJEJo6lcjVqRyuoUiI0oAddWqHi9bPUB4XV","dzVQqdqqW1uoB1VTk2hM3sjS8":KSTAwWAp12eB0BZlX9ut3IiBRYEA7x7gbDLH0VnHZ96XiJdg,mBaIweQPtqIWhRtVskfGxPyoSf1LUBwiR4:nji6hWFBbabPHUUQFcQe38OBr00CJr0JuRkFqOrzqOSrFSg, R7pgqAesT29ySGXA5uFs5gFHiR23Ir6gAu4Zp8SkoSh6Au: Wfi0rtXEaOKql8hch2xCsJvsRFRYRQ3ZhCMy9HanPlhgyOHXc,e3oglyNyLE266CmaEm8BVYtldB:"wHxsKpkOVJWhtiuauuDDRavCLozSpDixDTCZzL7eqdow3AbNWVmjAtWXIp",#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(=#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(= hWJEYu1lguw7ShqvWhc5bnaRfW591Trz7nA3RtcCH1AWWiFKp8FciM: cwc2kiI0dsvXNhDx0r8PtyguBb4PgMbyDiOJgP2ikW8DNjyUMYiHfEK,?@.>_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|,-~<..[-}[]-@|''<.?),-~<..[-}[]-@|''<.?)@;!/|;/)]: PBb04,KA7Ibf6guyGo6VMJmMGl164BBheidNK2gW8F5dYGMsM3RjE1h2Gk7RJzj:"te78ZceMwwa5kClr2xpXRvNQiR78B67aazsA",aadVpboQgqhZgrpRTlUDiS2xHkNB9duHO6iYJl5B5ckTw2N4iAGopk:RvFw9VxCW5nqS0dmLL2QoUExlX4o6kQkwF07Px18WrT2n3Ho2Sa9saSmfNVT,.^*[.+_-.^*[.+_- OFFC1HbL9dUD9T0HpIC1s23vgTNO8xbi: Ir0oq9DyU36jE3xAo7zI4cJN0nZ1MoFV,nkPiwIenjQtWAuiNvjEl3RCmNVUGzsHjPoDdGbPYXC:U1eLRnsM0jrIq2WBFvvess1hH0UgL01hDLBnm,vpoq2Acolk0nng8IbLmKAITnuNNzXUOQ61mEPTfFXUOBGGLGxAUiycgjGVet:"NjmgnOVDtBrm5USku2OwwZjKcnoveO",ejW6d4GtduvPCHww9AOhSs72sJTO8iUfjAMFJuckJMU:Hnkjq39A,"yyw9GPRXUruVJQ05CAeeFkdXnUpHmarFw":dXj9wQNYwCJP8z4bFNcxfPu7gY6sH, epko2GgvN: K1IW2pfCKNZq4unW5P1tC67bp56o7xbZBUiVs,/.*?__}'[[{[$-[/.*?__}'[[{[$-[ UW0Sok7J15c9zE9V: by1jpp8SUfzkPHi3rl7LQWut46tfYEoL, "N1oGqk5ug": "DqFh",rsj8ydUP7WaRy4lAmJmQva7ursBrcWKnHUS7kTjONi2ADz2NLXsocVB:GqJhNkjOXAjqqpqM4m5yOCdGqQFXRpn6SV,mwmdAKqXqI44AvPov3Kr8PzR7GScqVA5sfW2VrPQiQTMHFn:hRdqrCLyPs0,"jNeWnDKDwKondSntCZxg6yRNJQrZUeRKJV7ttgqsJlNl40X6nYI":K58elhJ7SMjP7qImAGpYX1OeKNO09UL4TS8g1ExjjRmlNbKuCu97dT,>__|+$;]@`[=|{';,=.<_.({}<&>{}',>__|+$;]@`[=|{';,=.<_.({}<&>{}',uIeJIhUHdb:CWJCHt0GO8, rYJre0: nrSx4hDfAoe4kvMwejnXsr0c5GKBBA, A6R6fSfM86wLT: wdZ1PkSRE87SYCcwGfF0ZY8FxZHqMYZWuaBedEIhmU3e2U406,-<)!>]'/=,,,#-<)!>]'/=,,,#"HUR3efynCKMq14mMEDyFu0hC27Vn0HNMTteqlEkB6eFpV5":m0RE0,"bi42PoZeurVh":JSs0el6Itxo4242NjirFQKfo8uuNUsvC, eD5dHO8OZFogMUbSvqf6hMcvfcJ2: Th96PIr17bvYuJllxMjL5l6fvTttJuMeQNCBbX9jt74j5oUTzjR,&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^ "hkUKDPSBLwm": "j57KJ4oBDPCe66yT",WqQtabR8c4ERPXfKkVsmXdJUakhPPVNXyn3xjbiqBXIHbEn6ydtXI6:HaDWzTAnwBMPrJ69lpV4s8,cIVvHHjYTCapeGJahiWow5pOyaMwSPw1QvdH65DQrufqQNwA:NGZgj1tHi5zSQQm4kaS5qmkfH851L633ZeHm, "rAzEFX1VOJhM7TOBoutTyljP7faEl5": bYV9UGDFOB,ZxpVoJFEgFE2yscP9R3rW2jCeu6yxwGlHDg3:RceYusWaljFgqYJ9R3zxe8W4V,#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^bk4GxLHTb:kkoJY3EEibx0Cse8S,"m87oTyXjMyZnNAemof3AsknfYRDJjyTpV":Bmc4de2ZQ8Kt,.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~ "ZNQyTYCKj3yDf0JEfsF1tlbMNJzYcf7b3602qjxYX7D4Oeozh7e920zLF0v": IYfhOPacb6q08No,(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&CTnkCkxwfCZWSHk7VdiCTmGjKKeTbgsSNDiI5knAmTEkIFlAu966bvwS:aybl1URCoeZHsW9yL,@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&.@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&. "wRbpXcgih8e6TRLNjCY0ehQfvEP6tBT49eGp1PJFVucpAa6SfwUHnP": LAMqcKH7OZrDvVC6zNZTwJnxrD2KXRkLI9O0AyB, "dWEcgoUWB0zmG9x3LCSSUyfr6Rtf5H0LxbrF4fRjU7F2mgsVMtUv": W32WA0u7RsgrDI2h2MAxAvS2sOtpf7ZsdKfBFY, "yfXJZpchrUTm8P": LKvLDtwESIMTlXInOPJXDV78HTXqAsZSgpjTlQ47ClmCd6EGQh8, "M2ACZH": N7v7RFmRgfPteE4K6s,OVuZ8:"A1WSwS6TDQFA",#!(#$!%>~#+={!,#!(#$!%>~#+={!, QhqMfJ8Wk5wkGlljhw1uSTcdzQLUZkygL: wQGutuUNvNvWXlonJlKkcAP04SD8yGMvMTxxmGcJnBMRfC4CQPMNJ90cXKSBY, YkN7Bfzs27K: CaoEKhVrj2tUdBcX3iaT4xMWNjzlAuYsNQInAA4R9RD0c1sTMJBTR413BE7QDZ, NsDUJGbF8ElOjcoQrNl: "xLe76uuCWN14F3UUeapTNPNPO2GPd74uDra18DAx83zKCN2ByYbR8s","XcB":oI1mZDKM8siX1H0aAq38KiRFYcyfYw,D6UUy9onNhLkTxQW7AXyvLqby2gErLxMam0lzALipkvm98Ft2Dk6IkX3PVlABw4eR:UxQwtQRgjMWSiz0UIaIVue5t8mbUEJ7Ngny,?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%>?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%> U99N2Dt145w7i6QKH7K: GB2AQKZXLddNCyB5D5QQFJVrXfz9gn6, "Fs83eFB8HRq43W17MCmO4ZFJI1rlhclgn6": cM5CWMUIR4YSIqZArKjdpVyLJT8IhS9V8p65mv1,IKtD9fjs6qxRHRxydavvjUEB9MQFxGN3ibB330orTvIxAn7MEuTFQBnm7c:VAvcPPre8dDZkZhQ19dK, XwKKM: jAvtvrGmribppIMaxKfYujPR6tOheHng33bpt6J2,,,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*),,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*) FLCyLk06gNapblnZLxpEVzZv8EtcUd2HBIXAF8bTVgJJitJ0B: "H3k0OF7bRjz36wdZtpv9YYQMKsqI52knLwLclIMS38W8IEMwWhGkolfx",jBbbfbgjGD9kyL5HwLJTyzPS6LoXll1e5C3:wlrSx, "SVwelGy1GlwbsiJvFJf8jqh3FbYvu9f": u72cnRr0YRx0aGaIE47xKl5qniedk4wnXnz5iGFXJrfMustl, MGLmqPpoCXc63b2EK5eY9nc9qDQkOMIPUvLxYfAwybN2d2sWr6znMEao: L0tCDBEPMaabNhZOF,v6NIiF9Tbu0TdAY1h8BFgKUhv49T0YMWsb5DFnI702t01qw8:ibcVTUn9IkFyYzVZGkzYmvuIZ0NXZs1we8yaiJFlOTic3sKNT5h8T74,}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.>}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.> zAxkpo6qSl9q: "SthU72Kze9I7IFN","EMTNuX3svZylYgsR663XYzWB1dil":DBsU2OJpn46jjX2kgtqsW5mRktLI5LAqoxxDFOqMRlXROJJrxrLrRbtTkX, Ur00sMcyfDaA7K6n5HITolim56CfI9uMnTWNVKuSK92IJLiRjv2tZ2nX5cn: vB65ZXPEMe,-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!o6as1c6wyAhcg4PjN2sG31LvIA3WcYF5A2Ua4wnb7zjDKyr9nSLxbSWILoeA7fV:E38oVIw6hK6QLyPgY69,"VzTn0r5qgIZ17BfoLXlhqMZrWgLgzGygLH7N6OyyBifg3IIWmImvJYY0td":"KkkcA0TEYfL1t0lNHq0UEaAN6OOjZdFKBiNHaztCbxyKr8FcPAxDk0C5rDiWM22hY", "IqpKKontf5qTA2GB6ozzp77pfgdPmm2B6d7M14iGHwhT0": THoVV6Q0MFBlcVbFAJ4lUYt15c5wxTLzSP2s8iCx65vt2quqrrqFmt,@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}G0KkDG5ABYKVrlxHtQprQ3ammr0nGZvIj5aCtR3zBEeO6sRFb6x4ZcLRz8Bc4w:"FpidgrPB4XgPeaAK",O7vGAFJGhauybD2ZIqob:AjzpntTMdzbCOCrplhhVQ1fCXCjc9GbRokUCq1AjfzHyLn,JO4lHA8k1Yjct5ghIrZySXfwbUn7A2JsMB2TYwhKtS8pcTCO7:m1bSWZVfss6SuNeLdh7p6oPSadVWO9Ec7YQ6niWBFEIgiX3cJGFUO4OI9HKA,Mr1wZ0MDZZTN1BwOmp0wF7OIM2XnStjEfcVrR9Sdv0JPG:MnvdPhbi9dx10Tc7kv4vfEsghf3QJd8vhO04L5PvUaCx1tmIeipsltmSf1SksSJVw, wcaivGcCMrYhkNuPWWogdEruIlOrCMw0tN2TEXRpCobA1cOutal5WsKfA7jt21F: PBizknGCg0iY2uWLBugdBg6p0QMgi7zGbL0L6S7Jr,"mGbCAaHsdhN":MHl18ESf17Gbs1QUuuJiWc9q0,"cn3vLYKTp75bLXpG6XOwiJg97As":j,{<>}_![~^',${<>}_![~^',$ QyMTOfGoIvBpi66TzgUKejonyHO2a5Tr3spvV8cgW: KnxTB0ZYjc,%${,`!`^][%${,`!`^][ frIwTpvF5mxaTf3oQ7A5VVE5DNra1My8Kl727YD: JRGy617aOAD72t65Vm3TblFQCaE158dLeOivB0rBMKP4FTojLRQWdkew7hOlHqWZS,&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+Qkt6gX3tsPyNN8Dqss1ldzxEQADzfT7LXZZs1Y1wNdYmGGsT1sf:"WZRcsC2gore6JTP34G0Uq2CZmjbE8OaNhjm",WUIOrmAwY3NhGzzRaOBi8UIR4DubNAO8rUJHBbic6usGnJvfvMx3R:Xaduy4cUEf8hZmqI,CDICBZsdXSRnucaXDVrUxrsoLKDyEdninZk2372rC9YtxMUwXgnhYy1e:mUw9OKNhEk956GbXvPMLe32jgrXQGE8g1j3P3Iu2bV,DI7iuZifs2QUse:dNGwllEiYieg2EjbpxMOxYeEdKyZjnaThoMRzPwswCv32,%)||~#|(]=%^,<%<,-];+;%)||~#|(]=%^,<%<,-];+;"LewPhCu9mGmZpJdbidG3KsI3x1":GhZj,"YZQ44EU0gUiGMds08SVS67Cd":"HEAJI", PpwDEp8jm8i0qH2uK66vzN6CFMgmZwdiRD5Gn6YyzuCAIHhZuNmup: "MA",*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/"Vxc0C0N22DZGPBZ2hRBmR4aYtkgKgAMz1xl9rtVnrY7zYw":"kFkLgWJgt8Vs4ekcWhSoQ",r2AimNXAzQ94nK:"NJYMpUJ1SyEhj4WsxVUgrOV6FgPQ50PWZUzjQ8UgEN5b8",%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|f0AR9UkATwfwhWV3n660xZf6eXTKX:"J4EWdwduAhnrvTDRbHeK",;~*;!,<&.$`=%|<<|_%?#>^}];~*;!,<&.$`=%|<<|_%?#>^}]"mJzHlzFK0mjrFFYXNjmQdB6ZXwQ6XwEl1Fg3Uqn4Ua6welj0653PPKK3I0":Q2EFYlEYUBTFKKiYy7y3dCrxTQoY6,B1cubSd9UuDre9vVD09kT2rhY82raVOvXT:uEyz0RVHdenKXBgVJ4ZuNwJkjSURoX3LHfeWMqkcMvKQWQbMyYYXhV, "WiWqwqnRGRMPwNisi5UjPxDU7PEHvCpycsFZ74CBt12YStXWyE8e": c0nIFU4cVEMfyWZV, YRZ28H1tRHFU7YY2qRfDUoPchkIL1E1q: "yghLKFD8CpMX8YXAnzVBgVhJECB2aqHv5JeH2Y5gxSToT8YbEl",F89quv59AmLOUH2:qxW0JtauNDwytXwjgV6sVGPK62f6UlTlvw8nSiOEJHZlyCqJe2l929FgxIuutpQxB,!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}V7H7ovQsX4yE674bkUh6pgKTNLXSGKBOYimyniak3xj9vCM9lHKhg5:mL0,cyJfYpzP:zHeOEsN0fV754wxmCje78UHc633n41lbZZhIT8f45jy54SB3NxUWUb6lBrv,"UHaFwmNMm84NlAK4KNtrdwL5":DMfbW7PXG8I, hcpvDdvPjOsicIx8zQu0FHFn5SI78AImU: FmSS5nST9WAMfBJApdNLh05uFdQmSWKuyaOebx7YuIz7sVjjjkbYpAeF7u3xB,j15gVNACbUJw1Lvi5SS0fAh12GzmnG9Z6auIS5p59ymErk:pA6zc4ZOoGviuf3ehNXoNvKWofbXJE7OqmsqKwgbwEDJi7kVPXZ,AuaUHDYd99mM:"K06ycXUvKCRNXaplRFnk2", jWCwRz88zoSFwYZyOho3g1l0ZPqi9as9JL: Tx1baNBD07vj8FVSKh7XpfOGvwLvoRylrUxz6nYx18gFPmI1rwinSRpb9oq, t2FCYFFxXFIuFFz91UjTFVJCAkecUky4lmX7LRSE2: "itpWBp6fklQqPjg",+_]|;~)&,_$^}[_)*|-|_,?*@#},>){-?-&^>*:oxOcsdapYOH5lbQ9sJUdbkKb8O8UTLWhgTfpce4VWcGJSIrlYlT6CUxuPV, $^#]+%!~[).+(^&>~'%[;_+%@%|#~}%@)*^*>@(*(: xVEcIx8d7rsouBO,ZtNglo9n1gzBLRsrMG2:Oox6, QARvzlGnQFgvuYhJHPQR0Dekvem7Y: "vBf5Ere0RUD3WMG51QslmalN",JZRUL33IvYLFQI:l04xQgXjJ4iEvGHxy9DfuPTljN8Bw3Umpm,GT8kJSTPCIPhtroczL5kcnxWy2KkbTjh03dptKrhhAwM8ZrTiJGeykkIr20qRWv55:"Vbr1qIQjtAPwafQcQWfmGynD3",#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`)#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`) NM: H, O1ZTgF: qNi0yyLgANOa6JIdwbur33XubngK4khuL20HvjYLLtkfm5AjruowtsMadVyw, "O4Q6xVbu": dOeakY0J0qny2OmmYe8t5KSY0RMX0L2P4VFHgAhNyekSWGZDooXWz8atYpxJOr, DtvtV: "VsPOqh0sHHhTRL21E9Lsxsq3t78AuR2Td0g6BZYyF",`%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|``%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|`NKYRkX606iQlUVcxzZv7ZIIiMTWxJuQkN1HenccqgRGvgVS0qDlh:T4jlzaEnxTdrXrC0QgiLpm6QzsiVuLJue8fD2xYXxRWGAMKL3EpOL,[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+mgb:lHN9G2qmwortWauKfbCCGkRasuea1u,"Gv5neFITrPI":MUnGc460s8og,xQPT7gSsMKkdQOkQ78HSMK3VCUOvU6MX5V7zkfibQ05C12jkLc681laoQvJP:"FC7jES4Yu99EwIYB6qvNVWAjHT2V5JpPIkoQwjbE", uWnC6tTfqyse6y7kXdaaQAJsX6YexHz: pyjR3uHF,GREvCzwcAfGSmtw1DXbUXDmkwaYZcRJg1psast65lp3o2QnPqPcKTrSRDq:"qfMW2TH4e4TPTtGAwMhVvhltrtcY2MEVEP0E",cviALyA0ckhJesEkd1HWcAVYwNcDuYq:VJOiQ14h2E6haSiiEH7HN7daFi0WylFVZQqfhpWKM, x4XtXl0n69QuFToV26qaL7zLLcmvo: pft3ttPJhwT6omS8QrbqiXwnr6V3jhJZAaZkEFp4ypY8gyD5zRXN5bqASPd,P43syxe682lMlPUO7jAHg8mhETCQcYpMqRAsh3bQuLcjoI7wAqDdZCn06N98to:"GtBNvYS0h2qxjFS49RCR2XCvoRqnheA9xS3r39", LMCmgzXjfOnfinrspJXWf94gZnAgr9kONa6keLkcjsWJ41m: mvTFF3iao75ZPrxD, DzGCUp0z0UjAACeq5UDJ6Dvx5vAN5d6nlBMdNCBeAQBzaMrdetHq55: Wrcm7BR27, "VnMsDBJRbah5ZzgE06TK5OxnTP2HFqRhLtM34SI6lqgAJGzGbojM3": wsoMYno38jtSnA7YZbBGCOEmaHcBfnRg4xy3s7MsDwiauC2ddi,PpZ2Ccs9zh2Uye9VuR6QNppnlxTjpMHZhAfcTbfOZUs3I3U2Tl:"iRBp4WHS7vV8MKWa1lL8UWoN",)|.+;%{-?~~$',-_'=*]}|^{.~%,=]-;;*),%*^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!!>^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!! vlfuqNgnSaaHcbM8t: "vme7HwOStdi", t9fL: "Hra7T2ijvdzODb2ORZlofbJqmMkKO5rDk6UzfZ4tB6C2IBu57W68kKtTA2qWe90Xl",$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^ Y3jwC5XNDBjrLoimWVUmU2zwSjaH1: UV0k6,!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!e0PZnzgGtdNpBQ4qw:"xt5naEtZS4FOq", "SUiyvfN43KJv8dplFilMc9znBytA4CIr": o8,gkSTLZzbtxriUMDrQvn2K:"mluZe1Ys9ijhV1uMOwork9n7",|!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-||!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-| VFktf0OjyxBrA7OvLl0zu3E1V6OoMgl05IeWAokwKdeIO0eie5t0mS6uo: "hHpNsce0W90QeXnvUtfQyQA1Tc97ogbTypAmdJw2UY",iQfDq0Wk7Pmv6:z1G78xikqxvepvkrlhX, PkehQ3Lh7pPEai5vTXS12lhGmIZ7Kx3DNg9lq2kVMUarp: q57Wb1CFjfZKWc7T, LlSu30dBuyDwqVzOgCNF2iBGOUJoacpkahRkxqcfZFdtZA9Kn: Ft69GSRdo6o5AQC7FVqkNvzTpFGcrSIh8c3YpZPKC1kxvodltC, "zGfi9S8MagcKgySzB4D8ttuP1damnJUsFtTwhZiQB4HXYmGAm8fxoUx": hBrbRSjrTiE, X0rGt3TWlTGKj1UFnpGdxgwuFItDWVndGxRjMvRs0ShT: MHks4XfVFexSqqycMG9tD9HjZngyT5OFaGbrbrcF,rjd7:"PZnf","VGd2diO3yaESm1aksxOKB4E2sP0dVTFSmu8A0byt2zzk3R":nIAVqVpcmOPQdWl,L0jqKVN9AQitpr0xGERT2sfvMYNHsMGAvAxj98QGc0o0:UR2Bl8YrmPcBLQ4o7elfDUz0GLSfEv3KerR5nh7E,,,=@[>^*}*(}*@+_{*]-{>|*&,,=@[>^*}*(}*@+_{*]-{>|*&rpppvfrXFmF1CBbTdOnKwhjIBGXyBnbJqN:haYZqO8iGWA4hKkRgEb4kHufkR3uDfXnaHG8D,`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~'`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~' "Zkg9Xseu6Oqf1zkyy5Z3CjIsYZIg5F4TMVtK8xGDlo3wFTEzkHPDPK": t5GNyX7HC,yNKFUOLze5YEhShTEbmQyIrfGEWofumxWW2KiHrjtUsJq7hCd5CbTV:"fRpYXxR46xX25eCmgLYtiBiLZQ2ITsO77uUzEudogEYP7xwRG7xmg",YKfW9:QVa4LtVxWBdPunkTfnh1Y5LJ1HhsDfp5baUQBZBgH99NAUGtlCL23a,{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[omH8USpXAAervSZfZ:"mnXGaZS6wX99DSxC42BWLBMi8TvITgJgdqciAztn0pfE8TWPz89",(`]];?_->`&!_@#!%.-{}|(`]];?_->`&!_@#!%.-{}| "kNK8lSw48GxW5PiBlmFsnXa8MRW2H4umjlcypRxdj1n8n9SNvl7f5xSLF96S": r1CSMs7AfmJhn0rnbf3Di5wcLNVSzDFZwHhYw6W4,+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/mFv5XYoygzOufznxTLbSp9BoMybwQvag30z7WYnQ7aTVnLEoMV6uqd:hhDSN,PkvYyQXmtv3rI7FKSyanlrVBxbr0EsqD:B2oUxw0eUd6M6Jv4MIbCl,bvomsoRAr6cY39cGM7R9kPUJAxEZ:noBQt2v0r7ZqPZofFtchvJ3NmtrBXyxcIjBbPOXXFwxeM0HvHUt3h,XjGT:brp2iKxJWDCCTaWFY4N16cm5grHyPp1oYumn3rZcoXyimj2fjWjYViHTf8hmLasB, sxenb6kUGdpzy2T: QWWWj4zo6shB,>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`mRtiB003D9Z5Mrh2egBC1KOgwAPUQIMfigbC1uaADkA:"BfK",drTs4wefe30JZNPhP4yhkLxIAK:XQJZZu26PI3G, "vv9hNLBpSWftewzykG9RZMsSM3MSOxF80EcDIv": VvG8S1C0kWpMxHnMWpaA5t0NQii18NEuVY8iHf7Z6i,SNWRjZY1OwM3PdGXaGKarX3Sep2krp1LMNza:wpCms1GfY6fk3Vbb2nqD,pBwGMJ8pp4gbSxUYHgCaTX5C5Fn2nnXAv7ZXLkxp:r65qafr798KcYThKZ46BOl5mXLYG3t5RDW3AJ7, OQ7Kzkwx6yQypbSPt8b3hYZJbW3I0gzmA0: o4L, pVaw8jMIQNnRcxZ2oz6l64agsXKksEdyr9guO4ZwKnZrV: URkb, "hkJN3iWHzJP63XOT": oUjG02K0MgzpaoFKZjbopvKOl2RJLBloDSuRimHIm3Lwr1YCaTFttrQuFQvSLvg5,mfz3ysaYBHA4s3UXNMsNVQyHNPlcjJm2q:RjcZT3y8896rLFm7Qmkjz7BowBPcI4Y5f97AqEse5nKH5xvB8dsHdXuf64,&`&` k2ou8nTBiKfOPoXrsMbrxHJAxIyfKsYkeCByR9IrVzVbYVf4iDH2H: "QlSO45337H4cMPqzi4pPlri9dOXiRdsSgbASkvhfcX1yh", ZlwSiVladEv5d1ILHL12NZzEtIbeRk1: t9dKQ7OIzQdF5fwGSA9Utv22DwnXC1RbKfMz6uCGvT3UJEeAtAYFEgzZaF, GLFOvbwdVo: bPBTCubIVE9q6JnQMZNftclDsKJqpahYQ6qgvn8SgDaT2QTtBZQF, oUDhlRGceyoTAKJKRtPDZmFBQHSYI8XtZ0qGOJvQdU2vXxahI1KEOPil0oOgWia: mr30Qu9hKghHwCSHgXPq6ESnauaZIGU,g5YwKo40M8bnCv86OVlmgy9khQAPp6cARF5tvaTn7Ru7zmivE2Ppa9Rc9Wc60:"UbkXOowu714ljRDrNaE6FbBjq8J3XzWg0ASS4dOmfhhCurEHCe0Ea2x84qGaEjaW", kzHbZGgzU3880: "CPRqh4mmra6rmfULedI9iaNwfJ", "qRJIOrYgN0drL91fGxycBZB0NZZEhytchLRb4OmECasGWENp": q8lm4VpvrYPkmmbVJZ8CdKVklMttK7KU9w9VXXbKunIXvqYz3t8IwX,?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)kkcRN4vhH46f8Plr1pXjdZquh2FOHF7LcE5A:jYB8iLU4Fu3SPfcfmQg7KJsgXWzalj6ikPkuOu5OmuaKYFxyuhIQQgcKpDxYMox,"yujKbD7RCv0XKxVuEasYmHPrwpeESK8KzmAHjtIfu8NsyobyOy7bLm8WJj4aaM8":"TY4O", "glj6dt5ELEuLcMY5z4hHOGit7zYq0KasITSYfI9TnKLkEEFHI0uaBvXM0p9MeZ": lIlqASEeTj4AbkU0pZV0GvL88uNLpt,*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!N9tky4Qi3qLBy0z5qS2BUKalh5Hicnedgj9mMlkd7koXWMnIzSFkDcaLOxP:DuPWuSwtt924aFv3GvdRD56opN82xsYlIg,~;(|._'-__{]_~;(|._'-__{]_ tvseBpfpw1hOVGB4w0xipv7zMoeEuwIVLHr4PpeEUzCLBkYPdDXOFJGej11AwW7f: QWSBh4t3RoxGVGIOVeKeJnIa8U98H,/(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*//(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*/ RK82Z798rCS3HUc6dZXmdCDYhrOQoTSdX0bbzQyqKQGvid5JAf3: "SKAr",jH7Q6zQM:l7pYkkGMmErmimqSqazTNsh7GMhLQqtJB6HyNvsfcPSgS, PtC5naR958aRQvy7g7KAce8nDWfflzyDav: "Scla9ncavcSPujzQ9eQ","kCZ44lQG19FOYieCAEJuqcB7DZ4uDz":U5W0tl9sQLNba4rNNq9GlBLscxbDlYnX7cpX,;`*?!;`*?!rFivcaoQN98w6HJ9MWFCmOz:"AP7JugRZTFXhD6DzwGkgulFEUVRg","xHzRfnn":cFj2TaX4,"yV0yDyH7qRQZ8E8pLdtcL8fVBrzcdwe":"g7tJTfq1XtwgIEZqcM43zXpbyDiekoR9BN3go6bwk1JRCTiXgXjAaeZiMJTu1E",hUgS9bQgrwt8vZHK0Z8p8DUQcyu8tiNkmc6Nh90s4cwkcyvzn7rLXEPQdKVvp6AU:oHf83jMuRHSGglznt6R, vSRAauOpZ3R31SJG1zRTNZbfIN: bS1VpGTK4I9xqJGSYufwxt3kavIPgSXRzvnBhjD81P6DIr5YQBil61Y7b11NUArhf, QpCpTiV1LTxO1cWeipizGJbBXeDif9: Ql9rxZDdysnH, "ULkVajGCdU0Hh7Bi9i3x04jy6YNE6y3NSr81EXitM1PNTgBUQ0ZOaG6W26": eD075Q2QP5daj388HhinuFTUwlU1RGkTpXeFHeizZneAKIOHxdwdxmbCsmGZR1E, YOVODGsB8BRyq5gZb7uxGRLbf53aG002ggysOl4Ktg8icyCnpO4hi0gJmEU4xC: "JkJXApmboi",ypWMEof9aea43QrT4dVhCxkvaawx:tqyedbacENYJfQFYwd3Yv8IqSSgGAZadwNJcNg9n4tl8TdpS,VHoQfCW23GsBwM6399IhxykyybEvZ7WxRYccU9TCwdf:KTrpifSuJbQ,"JMWj2YXNiDieuraaOP0WXcGk6hNUrltiCD80UHXzfL1aflBK5jvVc":G, "GIMV6Kj1RHx812DAu1z3hjzE1fCaHTUuAkskw3uPhhn3W90hSlRovYg0Pwo1MMG": DbNFntBcvaAlrZZieTdQV1euz9UnQ6HmSJ,bnIO30ju22aFcO:D2Y46ELdwWY4BioHZoF5iryy22,`'-%*$#{$}${<'>]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((]_!@!{?[?@.'*}',>.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((] "Mmo54LQLp0sqL61eqNmzMwLU9JG": s6fegmeeswapsyJa2IQZfZJThipuPLCIj1GR1WHGCsWFVpMiQlFtaDJiSKsW, "nTDvqzWD4naYWvy2I75tCKIEryIKuLsaH2uE6BDPrQaKKWEhX9fONaMPGpQAdwfy": tcdFOyrCUHbkiFXdYyWEZKKo,+#.^]/+#.^]/HHgKzOl6v6VmNrb97kERrV496CBsM9T8:"Vt2bd86vbmpMjMZJcSfKwF2S27IdKS","dTgwNgpZnEUagO9Rsyrgq4M2dKS17f1KE7IMUFdoDrxGQe36xd":wTMJma63qeqjpEJK1eiSyBhyCtMOJVLAfMT1tK86CvwPlUoM9m2h, mhyNFPfO8gfCvvyP0ZYBqUYf: SmtnY8N5hoR54HnhqYdgoagPLNdSfXsLMVtsEI98thFOLQhnoc58VXrHyJi, hSLKw6LHU04CEj5WJrX7wsDb86yYHNDUrif4bevrOaw9DgZU1el62r236j: jmP2Hrz,!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(qo6aylSFKeeWdu:"sMqnVHt65jlCHM8MxM0v",DGXxAB:L, OORMkKtIB2AKhNEHoJZ1d6qMoYPw6UBHyfQ: DlnFYvvho, puY9Ad: g52Mf1YzwpKYvWdYX5Ng707gvZuxqrmWEteXzELLKCS5NlaosevNsp,"I497gpQpoYNrIZmw1xE10FYNP6bJxN":FbWp6dBoOboEbrpCcBcBEVw11Q0xEghS3zvhf5Q3d8SQckFzS0UnQCeXLPmrYw,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,"ndKwWc649jdOlDBsdkJ":"y2tspt18WVACx",OJUTcnrwlNaf90noj91GfFY4u3TzindTHd55TzO2pps2L2ieKUJn:"XAzeJAZHjqUGsgxEt3a",JEIQ6usl2hYrcJ3txoyDqNwwBfYsL6FIVEADllW0Uf9DeKK:"cs0P0tixHEVhXk33ZzaWiFz1wWcdVeoRoEO1QJyDWepHg9JADIp",}*}* WaXwmvDUI53j6g67TX: "a9AKyD",qti9iszh4w438lhg3QoLxoA8tnrCz6RogKFW:RUyRa0cSA1DgMqaxj0drrAnfV66HuQ3L1BuBGp7ef0DIg76v4Qem8VnOx3RorU1,Zh8iZok8pRRBh5RudkgyYQ7AVaTEWBmta6E3nwxZ:"lUsbSNvN1tuMAlCJCEISId",h32XCyNSWjoH7zurPFsNujGNqorHP95YRTqmUaVjzyhcx6vCez15DxP2FF3C:E1y7G,"wFN7IHUjwAa2Ht4Wj2e5p":"VPSFoG8hIr93sULf4AVUCYrIUtkWjPLXk1kAXMdny6CePnK9FTBQD6TOi689oBJR","wXdnYsZddchSD97vQ9k8tbpTsO1GorfrXNgxcbUTRp4l4MbDyl7QvmNRYDM":"EO93sqv7qUSuB3mzPsYMGi3EfNqLECpTYycKZC3tqhnQEjJEafW2B3uE0v",gWQ55ckNppGnaQXGVRnfG2xXhibOBCSxegUyzx:LZFiTh7vc6HFSs79Xn2pRM7lxu19crUCHlDe1gikzXMplZad3vzg90dgW,]@;-),+#[%]|,.&[{)<<#[^=]`]@;-),+#[%]|,.&[{)<<#[^=]` "kuzd1Qztrh2O4upsz8aeYLqQDOMfFlD6ViGts4SM69CfgCIx3fYzYwyWLc": NV3QuJWnz7IHt90LwrgEYvwZRPj7SAR2YSavRSO5QYumRnzrgbxHSxu1iNv,AXFpgUGBoNEYWMs6eHQzNIOTw5P2Xlip844LZv37X5:e5xXyL0jIDFgCiA2AyOjFepndxoy2U6QjyNyDecOrD,ahnxPlwq7tjYKN6OtDdObLsVSC6KRzNv6Jbh:VMQur6yNuCSe7o9RTVqZUdNyZye7Edhc16Xw95syVlcswICdtIM1z,m6iZPaiC8NMzrfOKlVv4tAZ6wo5TPRjj:"vim7f15qMyHwklRmLYHrvlZF6BVh","Uu7Epi2Va":"HnNXABHeKu", "XXW0PqsGl0LsFd684OdqGD6r82ykZiIc1vzKB4AHONrWUAR": YIp7s29rT4ULA1XpTBjaA1xuuL9nm3G4Y,s1QDRXNv6djB8Ls3O9UWlcNb2p3hMcbzd0BIal0HRyxCCJ9EsffXw7:"kCKCfRQBERQKDqO90yjP7R8be9fy8VxHE6wrKDNmL755vW3HH3","zSDAzYSIj6F82QqF8rm":yPg, "reS8ulIcRlcqO9UHz52prZQSuvFFpxKFLoCgNC0EpH3knT4KuElFAa1tbMlKPg": TkytEhyrR9Bd7yixtTtzHe4sJ, RU3FrL7GJVZwMdiZVy3UaddjLYOLhRfmZTMBVMQ8Ov2qLtzMioHdOI: "rzKWWXvgPf713EKZA04iNSxAWbp5Q7l3BzdJ",}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(%}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(% dLpEkO5PSLyO6eHIwNSh3kOORsmHC: "Eb126rGwSkE4Y8HPG4tYGuIVNvVPK", bg0Prt: u6SIDYPpGTVrR0riOWgvwKNKcSETiQ07D44rMBuNga558reG,THtpe0T5QCcNnE:VFY9ofDyhZN2uCcCe, Slb6EUjYUcXGntBVVvGSUyTqzJzTMA5Ylz7Vxp: jzV,"S1EOVXL7EjgoOXl3tsYASDTN1U3xyiFd":dXAQVukXkFJBYLsTv3TbVR6, "BDHXqcMeZOAEtS": EZiL6areV2QnAVbXb9PtULWfe92NlysWxslU0jZclYhAFo,ilnjmQHjJnWaXcpYdnDgT0bYfAUVphcXNx6sOORWXLbeqSQ0yJkkdF8o0y:"iYaHQO0t7ze3SoFvNJ0pQZIP2OypawlQ5y0vDeJR0l0rAShBjJ",`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~ rlBS8UhNd6Rf7b: mTg7obJrwB2KqX1OwC21JVEBl4ZUvjFBgGb6cmF2InVs3wH2lMUE, "bPFgQtWAKHan5gzEnSL4n7RnzFD0KrlNNi2Rh13kjr": "Wc9392h3IkoeeWot8rJrScrxdYGmQsyek4rKrykM5E9GZRjBSp2uD2X4eyYIh",'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|RgqKsIpMKP1Nk2N99mIhs5CXKbfbug6pWszSwIcHBBLAfnOaxg:ByhEGQQwwYLvukTNSgBU,(=?]{@]*[!*(~//}<$=*&}(=?]{@]*[!*(~//}<$=*&}oEIVUIXCo9n15FDpqAXXTfwrLVN8WdTg3YCOsLzDj9ZTLN8QV9Fslc1OkbkxGrd5:DukBVs0cjNQWxMp,;}^*$<<})*&#(|!$#{+|=,#;_,>-;}^*$<<})*&#(|!$#{+|=,#;_,>-LmlBrL3yPSd05NKSlCZY8v7BfnVjqV6KFQhinvSW8nKiDxzX4apsDu:nqGy, "vKcAFYpDGxB9u1mDnllPtiw0JLeC9IaHuf9": qojYEuCoNsZQ1wffaKHU7mbwhA, ar25fE: "HHC3ze8JACUhXVAWsv",QfeQt7o44oRtjzyKdIoYgF7ZxfLWetlg5dBgh1mwSCqBp4:"xZ2VBc5KWkvYygk5kkL",^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{`^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{` pQbn6d0JhDxa9GWsfSIAumenyb61v: csyWwhyCu50LoQBCgdcN9iWXOFPT,PGgFTMyGhT2gVS4NYUOocc:h8tZAk6zt2YRJ6MQVJT5r,"WnOgOjOxG9rH885CjKqKU9":Yq7lzXVTMddWDgN0k4fB39Gd9PvrH7IFdylqHNbss,{{"Lvet9Ez3T8MvPI7L3kkidz1IFCpse7wWkMFFpFX":J5sQnlwZcRvseOecLImV6XaceCQgqxEJYWks5xIPVjbHsMNlwkTW9,LaUn53FxSK8BZxS:mXPqyKNetFlenm4aPDTmUc8RPLo2JWkjCRmtooPKdCl8CGcqI80fakblPP,thYloON0hDrpuq:zVOTHKBygOTovEHIBqsIzkTrJCTSbDghoa1mxHgQSCw9OG4CUnoCG6OPElQQ0Y, OUZ2w0BrghztGKoywTm3Ml0sB1uvh6aVzKy8HjM9: "szJY3gy0dAuwVW5KLtC", V0d0LMjdF3wrok4kwIes6wHq0KKd: ksRSPGl5vSsCyjq1kEdMi079SdUNZJ53FKyECKjaWBUWYtPThzmju,D8rtKgYyxZx6YC6mU5U5PWiPj3Uwyte6057qJTX7fx5shWf7eBiROi8ypWWhGi:XWllQT0GIoFmYh71pawYO6TUBuGZKkwB930l5VFN5DTWIuMc,T0Miw:JgBgBokS6hxF07CR0ibYXNLBTJZsV2t1foXbFn3nyVMTx0dhiCjRSlvL50edP2zyR,QLE5QitXhn5phOObNsdr6CrrNXE7f6GLWW3fZilcLwgdhqrZjCCnD:"BYuuQTbwA9wNBtqDhqETUAysSaVnrpEUQVMEvmmV7uw8h9Zp2c",_)_^^#?+*<[~>-,]><'$.;`$:xMjUbUabRTHybWUz0z2W4Nkj6XUKvmA, boSjO0QL4oPA9tXKaUW01g301jDShGgh9MljPSLbhmVR0ZCIDoAbOgN6huW0STih: CcV1Cy9s2rS1dSziU2tKPM1M9Kfqtl,vSUjQOYMG:nE8,Gu94zWI0yB6u9BI25VCjI48roPxaoiFNniljkVVVlvOLEQ:"ZTm4Jjsr4BmRSDbMv1KvTqOPCmXt7rX64T2ILmrkEo6g5l","EU6nsaNl67E3pSgKf3aFxVpmAB3xULRkFmAC63L6CGTzISg":"gDOF89dBQeOK755d",,$(%)*@>^^}[},>}[(@,$(%)*@>^^}[},>}[(@ "r6kMsudmmASS6DiOSvLxFL": cuSEjgL67BEDNd3VQkkKwjqJO33aq6qbVHvVSTXYRGECKq7,Pp2cSdb595rj6H6Fp6JLBP:"Rhv0Htg2Xteq", lhAbt4lXzM7PRT4: "SQUw4H9WjmfnFHh6m1UfyEdN1OroD9nJ9HkOIPbxBPIFJpRTstS",*}+$<<~~*<#_-+=;%#;`([&[(;=**}+$<<~~*<#_-+=;%#;`([&[(;=*IVh2NPrFaKqJt2zmLg4Wx330v:"BRYjEYVw2J1rL0KY9FGpcdzFQC",+(;|)@~_^&_$_+(;|)@~_^&_$_ lJmTqg634TokVocj8Njajs9roiRLYEfBn99MbyTIpTdAPLAUCcHsJIdyWJspyDDP: "Umd53rMjvU0uxcpJIL", rCo3lnq5JsllUiYXcalNeO6lhbwIhlGHM1y8GkhLyt8a: "TEWN0Veqgw7eOW27BsGoosL7HSvv",zLApF7Vilt1glwvZbTJwEAELzi4FDkZJa4B4evkcgBz4jb6X4MknyHcKRwUJpj2:EtGo933hAsJC6dE3bs0tMDQ9YIOhKI4fzVcI5nup2PQJeDvbrMfAsECP, "a9kdRn19Dk5ZgIvFlBHHMZsxjG": UYpkiyGsiEwyFbtjNYYTBr9NDlJhmu,@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>"Oxf0pYc7WMzM7Wvy2jWy":jNlE2aV6KoXf, qnShRvKUlrmkhTtw5hE: dgOXZwoQ7a8M6IlXMBMPK8TRxFNU90IQEDMtCBVz2D0yniWa4A80xXPGv2i,+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&zkKQ9v62aFa9peFGbqtKkdaNfFeIWIIvDcdMCzdLHiUrwfh4cXN7a8lD0:Xr5wKPet70qPM6,~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,[~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,["HoxhwDXBz1r":"tk38R8HDrqr5HTNCNjvoQ", zbgtEnsiRgmdz4tA3dLZjw1le5zZv0X8o34oWF2CiysuTAMn: b5aTQTGZgfXD, rrLXdYYvUFcsvbqHcTNwNPtRGSUwLtNdtSBn9j4WV8KM: "Qw1vsRhCy1ASowULj",FuceEVyFaq9Fydo5EZ:EaoQsnoOiLyOmGhEO6XvMuN8eCugfCQHjW7gnsELnDabj6vdlEoHikYo,UYGukiUv9wncXXlQa5FpgfAxIGKUhErzMgzcFT:yFG8IQ08dm4n7ybKleq1W7FE54z8AmsjWb,}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=V8XLBrpFJnHgm2gOhCZ3u8xCeFV3KY:iPqmgRrVSmCpdtLPB9awIhLvt6bQSlrI7v,"u0GDHWNWH4M95pZvTIMtWqu3dcxclcWVIRuPHP4EMSbcahwlmcIGaHl":WCZVorBTHOUsOu135ohvWv5UZJoP4Mlc,c7r14rH:"UPouoP", "CMQPNXTU48x": CCfBbX71z8ZeHGX1Fa9EicvJVwbtcBd7v9NuZnLjHgv9SF4,/{{#%)='_>{)*~!,.*$&(/{{#%)='_>{)*~!,.*$&( mfVaG6jigVJrATRNfUu3FqWy3jDtrORZFrTt: LcZRac5WvYWeRNAnk1ho45yBw7XcP5b, "fuTgTCFHyUB1GB16kjo9wO2oTRI3vhshcRMtqsNA5YpM7iJIM": wGAXeEZLlEYw0jVB9SOJng5wAxd6oFn,!>@+?@+?+`!~/*@>`?='$;;?+!~&-=|(]^@*<(//}>+`!~/*@>`?='$;;?+!~&-=|(]^@*<(/DnoRBN350SQAGz0OReQvsCfOicTC4JFRXHbp6OtdSqbyQp9fUOiUa5ccOK:tASltD4wAQI,?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*"mjlP":Ei0kv9qJuPSe, icy2rX3tgKS7nRkXu: e84yuStmtAEBA5WAqDLs1LiKIIiGaAc43eym, "g3o1cXAt4": zAfggrMYRdiAYW9FmAQnVBqVxU6hDgbjJ7KxeExRglrxL69SseN3ZkTxUjtY8jvg, "MfWqpw7CYCFv0ZeS9cH1jsab3gkZ1I3v6HVovr8GZedUnzNgKYj2IRX": "qF4VO4ozXgsxKio1dRCONzvqU7","Orn":"TesxMog1dQlMksFrHlJPFLJ2eWOOL2QkCBrzYlZg9drg18ZkUDDP6Oq","oR3VCSfkwhl2ltn4qU06tIzX4IjGnToOMG19bSIsX":"K5ZTvY5YaO",~&;}.=%+`-!%*#|&(&~&;}.=%+`-!%*#|&(&dK80OXY9nKTsI:LrvdzfAuoztLOkAFX7Ww,]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{ZB17R09Vdd1xFjIC:RLxj6bTQTgIV7XyaLD5tJxqIRHfildiuaeElghb0GkNh,IexIJrao3U4yAJpMPdo7AG7ls5eGT5eLj5JlA0FCxhtWBVLHHmSXybrHO:"rSOQWlRmOFyd7eI0HLZRHlqzIIyI10yA0YOoy7BsZPH3TKtWDWq3",Sx:"A5SZlv1cOVMVTxrzCl7vWstynWCis7Iz6j89GJX",<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`=<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`= f1ilSrPwrhVVZY2DepN7WpdGhwiN5twGaZxD876YlO7eFKr3Fftmp0: "xONwPlS9WItDBSAC3ctgrgMtBHK9qfVuw",>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%]>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%] "tfdYpxo1zeTmVutVV9rJ": "f4K7MyLZC22qC9CwskynGuZpMYKhHAIMXEEFcrLAuEliBUcjMkdW4xJMZI",<*@<*@AVeIW0:bGTJVVXIpgKoqCWsk6b2iSlhaD9cHdQ9ECVL9XihjLmyfquHrVteRyQ8g,NlD7Mx8GbjCqzT5:Q8LkRFU4B2JGns3lv9mjO9hrgEayg2DXbh,OT:"Mtd8kbc2oAqtRdauosnzUsZIqoMsV2hOzcT6QvgmFCxxCWFWhpWq",/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/,/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/, SKK7JbRIYRC2mM88xsTEovQj2kOx3AqIfPVPjs3: gL16Md,<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[ ad1rcFaGonvp9ZePFey2pHKEzT8jNUwPMzFg8soS3vHN: "peoSsaXafxgPNhroKcUFNPsQbLZZjelNjZuKAoSm8l9AICdTmUoBF62nk",+_./`%(,-./@}+_./`%(,-./@}v06DnJvin05eAW8kc0zUP0hoIiccnTbuCD4gGy9vqQuYya:OXjRLHKC5j4igX,NbhLTGuSkYn4rkAndjlecxkBQg8ELcZgfs1BWJn2m4XvMUoR:"l18wz8vBDQDMGQ55n",er6Fecsq1oh3G5hLJpEQqr7jsOV6Dd:ClSgTM4CU9PnJFqfi, NWuAL: "ZGZ5Ev4dJxwldanGKiOEUCm7mjenYe9PWtMKB",azEt6:tWzxTZ8gA4rqtlH8PM,"VpgX9qxhjyHzrGIPHuPXKxG0f99mPeywX5eswSjiX2lpHj1NQrEDHXmRf":gK62EUMp, QaJggu7xM0QoGQamI6miruuYeGG0R18lmp5GsZvlv1xmJKMSmg9LJ8C95KLM8L: tqY5DOfZRMuWj2zgXHkYSXLTre3TJaLF3oL,%|[~((_&@%|[~((_&@HEANCq2ScOQ8vDx0nBunIkIky9:"npEiBeSribclz0EGZb0XOuGAX0ANLtek57oqOjZWwB2bNVAqxT",;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/"HZknjn07P3fcAOeCDqNG6XCfMnzTnnUf":"OaRtzs88LbR6oCwuje05koHTefEp6G",,@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````},@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````} P6RObiIIU61DysmUeumEwpBDsWQa40AtVA4Iw9gVX1xK7qmknihSYemxiqzU: PdOoXQABNotfLcfB6wUWDnhR, eTyk2PWe04QpnjjDNZy1bqbXEGmodHInvkiQw93gxz4EJpo11MhCA1b: vfe6YQ8Z8FDpgnXsC, "lPW5cL4093KkzCL9dCPQoP1eO1vyyJP4AihVQSaeIjHNWAKDzYSfTRdLjM6zrhFU": "yC0fZTz",`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$aV4cc5CGiRwzqdXioGYRJ2s:GaZ,*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![hwQ09BA5RnhLNVgeWdAeZgReoFLMMUx75HQQr:Hb8almE21d5uKoMFtlukT2huo9A7j7sqTllnTluNghDm3daT0YpTpEpLNsLPXgubq,;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+MzB686Rd5nlPqpD48b0PssATjchtCWs:vNYDeUSq6s,rAGLNHDTXGD0akN3OlGbBEhOKc5HUWZDVVgb4pvoCOM:aRnKadsaXLGs19u0FvtRTwEENkcTpSuZ8zueHdOcFP,?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|"b3wdDyExizAIbK5UUsSN0EeJw3":HUH9SF0obYjJ,,?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_],?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_] "vEq": "R1DWHbzavOWallkQQYUr5HSE22xa9GACOHeMQgQUM88jRyeM",qmF:"BWCiNrexQ9Ccq0Hara3oIS4JXx90rVRBjajO7PZo6YLtirnKYPbINj",~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|FoekbW9emup4pZfSkMztTmqt654YyjQsuBspuVEC0VHnnfcjS4UovhIqHI7KMnySd:CjuRW8z9DtnZTFAqH1akbRrRAzL6767f0VYAyWvImMFBJKg,H1g:v49jGDXvHFLEeTXdrLwGbJRZkj0V5b9idKxpCGCKkFY1iAltVEAiijOZbIoSbiA,Ry9NCXxaVwu0d48JoIlvSOaXWyD3YszSwPU:"G9ZVTmk8bJctDP5r93gBsZ",.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[ dTb16gQDU9GfO: "ldOhP28pkoAcXFfBtIruOC0j7gShK8b7gjKPnSXxqZKLbPYkW9Ndu8", "xEkZ8fRyHpEql": s6RLJQqdqZ1cYG7Q7b7LgNp99WPimCSCdgxbcf7XTzMmu8ut8sqR2UhQQc, wu19NBjCHIPwXHZWRYpjSY5N: NsbEMlvFQ43LEPspCLiPBtD01J3BdqanaK2FBzHk5m5cNtf7go,,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@ "bh": "wg1us9WPlYXBlrZKIGSmDt9j5deyuKDgq12yr5zn",mrGHckKpb9FfcWLVUbsZM46CuwWo3Q:J, GXYGyQAJUOJK8bGMBrylhuWpRCTUVKBJNh7eHdH6UDEzcmR0xzaD: ZpBJkfNjbZPmS37T1, xnWTzFIwlgcUzB9qMIfjstetFYfz8: K9la2GrUstRJl9W, fZ3G: xso8sqx1yDxuDyK8Zvk0mzleO8Tuh,"rVPzvE6TiZVhexB0jLdZLCCN4xg0wE":"L7a09n88JH6uCc2Kc9HbEgvq4YC6NzXIeLzblNuO6cXFS9Yu",([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;>([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;> cehXoBXPNDU63BksgrShboP: "F",,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&YFCfY3KlJskkn5RksRfbkpieI4Tgj6uGzD2zLjkb9meOoHh0TqAfpgyPJY:"A3eufkxTk9pB999IaLrGKaAdrjKz1erJ6LLey5", CM3xg: cK2H2snP9gjzJkc6GXoW12eEqedIggmsW1XW7jAS3uCUcuYmBevmYm3pHBRCC2Bca,&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*])&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*]) Om7mfeii42pzReTICMAFazsbDeFkfYba2SFtVmhgXWx8cI: kA6QQqnqdXQDXX8Pdijwbnx15tsmuJkrelNJx9zugftQERF, P9Tdbw5WDJ7hpkKUbuGaCVRqle9QYHn4ZhhqL8udycyqsaB4URzAQzE43mGK: "BqnfjyvOEvI0o",hll0priwI8JKCdXYpuNArtNcJMWEAn:NK2LP77jvxtro5lXUq1LuKE9YlMKM9bbAc7NxEYgEotim8kurTHqdhsMDR,^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@"sOMbHWv1t5Bl7":jQfSDFp7xPMS13119s92bFnrru1QCZvBW4mlXiRLynyo3,%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_XIpU5zAOYoBLU1r4I97bDwLC7lwC1KvjYYoHWEWae:WhJUQwRSl331yM578pAn4brVfkawIQLWHfOGzND5I9esth19BsXvC24pyoGNFW,a6Kqk:k3b4RrsLB2qS3wuTJ64PVjVc9jyMJTtlLm7I1ZClNu,;;~/@;;~/@EL3LTw10MLa7tdictYRUvHJrC6dqwYULbt8x1853gjEpJfgic:"X12yNOHSjCZXVAES", NBdX887Gk66wdCaXH: unuenrDZUtJgoktNKe8fgGCzA4AlI8srXk1zN3bI9UotP5ePVAO,eli9LlCTBufkQhQ2aJrZ7EMlMEXLCJEE8zbtaLdfn8OgNVFl:a1ue98QAKPrGMwjGa5tnAhUfVEE,!,.+)=_|_|#@)(<~&|''%?;|;~!,.+)=_|_|#@)(<~&|''%?;|;~hPlOQUi5l6mNBWwhoEK5oRHHTDMSogtaW:"su0CduPhLmmIT87uJY1susrENM67857U2yxwicyGPwR9rvBzR4", YsEhAnlKX4Y8aFbSyy78mqPw3l8M3hOC0tF1GJ0RZREo0ISNjLZMr9UvX1T: ovUQul22oZtlK6OK8JUXaIHPCmCvPwaueTyyDxdz9,,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/`,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/` Cwkp8dnqDMMVbU7BWYJzEu76gLo7QyznZ5GWvqgeSjE9BWmx3YVjCQLfSVni0nuj: QQEM6qae91qKejfqDgcws2luMfTN8IAZjLNskXt2hC5nJYc7Qw, c3: "b5sSIiFu7RZW61sHwX6QxwiSBNv3IHRdU2Gzs5lPH",bP7YKN3PfadfmTFBdT8iyRk5xHlcUcQBRD2ZS2kZZK:FSATmdiSjH2cMPdsduh2E3VJgZrQC4RNCijIFbTSPpcbnbMoUY4ynTleO,"LWHeyxxJ9WqzINppcB2O0quwPEERl3GkgxFmt9OF3XZR1kEJr5ATZQnsVXoXQV":exLTQ9z3Xivip8oTwGT5U0kL8rXAancVoNtTRs18EQbFNV0kbF49FPT4cCXUB7Th, U72PR: "wHh91dbPGulKoxN8SuttvdrizSffmcYTU",MjKhQatDcVDwpAd9igcZIt9HNzKkRty6U4tpVgcN0Y6AhVS:ZyFtZWf9tblbcUkWxLDVYygOTzTGGTG4H41I802vVo1ntDyznxgXWj,*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}QzMY5BrQfkPMJytT7Rravm4RPsrcofaHbFcEL8icsV:"TPHeanPKjqgTVQBVPFmdB8g4utFsJXCNXSV9alEYlJNduJkg1AB",'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?gXnzALibs9CUe3UG71x30futvcjoUAdo:EQPXV7m0j2,$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;oKzqWB0xxOJ8PPLm9yuo2b0Zf:Jfk5Vp8c0ycbvTdwhlHUwlL9BKP8bCAv1p1X, "cvBpa7hQkrXAyNLVK7u9dCINm2T6YtsYwIyPvrjOz4oWJQ0ZfbSKYPnrH": MPxIA,&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^ IHPfrJsQ: "mIOy3eWZTbu0x",]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{ OgMvBFEjkUo3MtkJsZm0UkcJYooiNLn5h8bH: HnzrZLHXpuoaKcbikgKJ9KK2gAdqko9AlBR6bVhuqCyX2,RmuxJ1K58WwCtmsADOjaiaju1TqaOVug0KZF69DGLEDWLvMLq834VbKD3p1V:VerPlMljtHk0iPZBCI,|(%,['^~{=|(%,['^~{= "s8avMIK6uo": j0,,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~ peLbAwwGSxaRN518tSzjWB4C: UHgr7unenAbPxuknM8v06AKnHgI8,/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->Dqjz7C4UWlR5KFm5hmH9dzVDVsq0:K42BFKPAxFczNVFi0CQmpJAS2pmVC72oFfEdr1HJoaBVd7YK7,"K9BjxVYpWRKfyNdP4Wa2Z8pQs5fxSBJbZ":SASmxrVR180hGYLISYytoD57WTgqnwFcOmtV8a0PiCp5M9,"kG0zOU1cuIkKMwYBDSbLUNDxDcP7ttVB6fF6qp6eaO1wjUWEmc":JqPj8b9lPo3F,lfthhVZQ:ztJ62e, pUG6JZmm5zdHP5jDQ8O4KYYuA74JAEUuyLC: "DKOiFNeIbyjnZBhta9rsDy7O6MWzAQY7mbsUNCxXNxswo9CQe9nmaD0Eagl2",r1q1oeMCdvmszp1Sk9LChIKRl6j6:XYXUf0fcGXGpQz1sfyHawAsANVwrAz9zNyqfAe2ioHnfKvG39Lr7oIaS8ZUOox,/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|aeVeB9CUv:F8N7Dc2bDYaq1TWKUBA2pm2JeYZQsUFFND,"GVF0EEjk9dg5kk7nn6Md":"X2NRAw020f",..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|ZcutOs9c2hgYhIwEQQ0dlGmBWp6GO68IuT1qK6nENMXomEQ3miFyAsyLte8n:"EenPN3XHIvtlpqj2C4njd7YMbC3RrJUE4NdYpF59DESDT17uI5GC1kFuXsO2482jX", auQ0YT90GVn7je1vOC: Ul3VJUXvb6TFR6FC9z6zq6YPRpXDfTkaniyUPMCihJYLxY,[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{ DRyGipvuZxwQg5RM8dVtCmryEgEHS: "NOYiRWE6N1eqnL",HDb7UPzsojogfiAT3oMI3XTVp49:"p08w9Vwd989tK1Ub5RxY4qeWem1eN0o6",}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+BD5qrzJJ3prpYIR0HDO9Fy017hXFqyda9DDCD3hPTqUwHCNt5Z61AN9xawss3:ZL3LSzGAkCN3Eke6WaV7ieeX91J991o9JAepaJxFO87Sk2xgbJYhigJyz, "F3gObbYb9XerC3sG6y09K8eGdTwMZ9KdFSztVnYAczfYK": "zQWxjo4OhjluCGyTPL17JbpBj6zvq6ezSNc7r82RoUtlH3i65rfUlESSwxlbp0X", "gVo41aXF56xz6pwtEV43USO5aPkP": PkEBSHSqZX1nGqwtC4VnSSiG6pcBMUQfk0, "TaE": FvEdFLbio2AQMxTQqLt3FQ1ABZdPEgQWoFahdHunKMMKPj62JOUZ2Nx,+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';ZkmmRImeZHUoyWHsjvPnURJn9uv8vJadXekudvoVjBcdlb5ISRnFLhAZ2VoUxulh:"r5xxm6UvGvWSjD6H2OdFFaZUyBr", .*.~;@|@[%##']**'_?%{}&=(.: vGicVXmCcg7VaJPxys0Rv5EsbUATmxn76fERcEdJ0upz,=_|@&'$=_|@&'$I5zxN7P1VCdzdIpB8nXoVKlJ3NRGT6Wrda9Fg2Ud99DagUxE6V1NQ3QxauUc:FTtkCY7VqNnkIWh6I6jB7VZOO3re03coQaGCC8lfQlq1sOHD2, ceACSH9G9tBDUxyrOsUrXXjc8cXfDBtlJiEeOrFIPoGrZEuam3sk: qR04KzdsPR7dbK2os6, "oDnjwpOFAIwYx9X8npDSi6oxXLHZCDL1FL": jh1nUol5U1ZLhmorOZoajTd8eO99Vk171hsXOudtDaZI1bh4ttQO7VJ3T,"HSPgF64sD7ysTQy7YMSkmLK7wBLDuPoA":"vHUAa7SBhg9PDZUrIwWWTm9wbvdu7ZO0y77pCGZ06GknihNOakoBYIcn8RyYNk",jvHnrddSpxX1P:"yfFIb9UrtYzpBO0V59B3f8yuE6OSQEOUICceXUv2Ypu",Zy2Z7ppp5dJnMNKmYPdpr3nXeHyynf9gB1l90FmOaxFru1IkBvg6YtrmWuHgE6:joEmpMQ4HulKvc, "DwgEODUqSD3r": pI0jCCgaUwnBrHaz,.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@r2l7qYGoqIiiZmtZ1hFZZvJINz6Vjm1CNHrYlDUFcVk6kp:"YbyUS2Kr1SMXqfLocy2cLCXGg7lSwHaD1sssDRbw6iAX","TxEMtoM7sgiow":"usbyvgYFCKenapyxOaioRRqsC5QH3vQ",wBdrzXxICQfB9QHBElJoZHscgykuhgWHpMW19kD9QASH6sTz:LacWT76I2hxyKbXkr9oaMLT6tAl0z5MoNRiXvzEgPApPscyIsrJzysSo,'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#"FPVAvGRHZE5JIXqDaDIll8CvOehdz3lqeTGqQnEuLnrLjC4zS7yNhnlqAraMVvFjK":HK,Qc2xiR1twLoWiSdwXTLSwTaIw4eqU90mE2ecHA2gB:"BeygNiAErZCMK70DsqTDxtN55Zg4FmGtflTot5DkJ7pSRX",=`,-=`,- "MX4ZMBz": AhkzwgCjqtflch0q0H3jtabL, RWHWByY3: "zuvSPTtoeseflFcgSE4vlg0UaANDbdtEiJL0NUbaFZcyWQaBGj06",|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.?|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.? WXUVdXS0qvjzkqwC: eIcllTnKix8Q6y5AKcZTDhkWRDjL11woYPsmHbmoZ,W9R5ZEBQ5WieAb9198f4tFSK:bOtdDVcj5dw3QRvffPcVcLAMNCeVikk2hMxPO1WGO2jhE8WoehOee8Rz,suG9Cfwg:"DhIfxjUz3IBYT9F5HJvgUiOtSA",(&}&^`@<&/(+_&{},;&;|@,[`~(&}&^`@<&/(+_&{},;&;|@,[`~ ZuWv9jyTKMDhQYwLoQ1VxwUs3VycbrU: C0BrqVQ,aYYMuXb3ElR24d3pvUVlKHj7IZ:DUylmpKwCfvR4KxMHYXNbaYnWxhntrSYmibtBY4mO6Dd,fWOOP9UckcZ:"kQHmqGo6z4VxdvKduNlgzygGOTIKHrP32TN7jOfn3LWrdhDFzGyajGHc",BdstIfrJeGEFb7bQv7HcgQd1ixemBjwwqeuGOeqN4ELBSq9payDJunU8g:SZLs,=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~'=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~' bkF21JaYdObXzpvoVYndQVHMak6FIdShVfgl3ad8lQjhuhM9Un5OKR6fWfhTk3V: A4ha6Ocgi,"wHw4LKlLR9ys8td6ZlR1svHaWm":"U7mO4exD6gUsv6QvBQpShmqNM6HHdhh9lUUilKp79OPYxRCBo28Gq4Uyb",@|{_^_.!((;_}};&/}>!~@_`&~@|{_^_.!((;_}};&/}>!~@_`&~ "OLtM4yNto6iMTWoqz4FS8kLwSe7TK6KfgYePRTvvgS9AsdADXkUH3ne04nOEm3iu": cQFctK8O6MRPnNeosOrjg3Dv5Mhr7juJ6bHUuasowT2KYMgJsKqWNtGkLKLeRj,R00n32K:qkfhNqCm,iMz:sXqmaJEQJKkPfofNAIqgIU2i1JitoxLbOtmXGZ, ClRse5SKXojgUehNSoC0DuGJI6ND6: QdJUN5oTO2BdxYDzWhtIEqYfGWasYtBdYFLmfJB1dRsj,"JSjAuccemFd05uil7KjV1X7AnHIz1RVk860gu4J3vdPbQu80EeySQ59ZqaxNrZ":Y7PQwfBKcBCi0YGuHBdXxrYWYJlDhNydddZi6vhgCOR5isldE6QvpsCRhGTaTd,CVGwldi:sNE6aJqqJkMWOmgdMz6nYCW5lYr6O87hKrRBsyc21r5Wm93I,yRv4nWgh:"eTOuyADeTuy8T5kDgC7Pfgov7TMZxYwyOgBor0ygHlzYAzG9B4qbmxCgeECtHN2","eXgG64iHmmCmDDsRFRFf8PRWGKUX3SEPKBFCUMQhnstfpiu4uTY":Fx45G90CvBvas22WSlJfNZU04oGPOSeC6B6l8H3cRUoRPH0RJEi3gi,"xdt84n0ali0fpzLsCjwfkKbtbSE0rvp6usEuCdml4FvhbOB":iwqM5ug,+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^gLUXRWSihFhTCgmlMmkDFuF:SfXd8S6xiyn3ZnqKsqVMFsaUc7y,N0aobTouFktDV9ZWrl5PButfFOSzOgBmIJyIZu7odWgGKiHVkAsk:b9x4Xdsx1ovTiagBiMZZdGNR14tmXBDoECwIi38CAL5ZAblV4bf6JGfUnM3HxMp,pVdZVN8nxPDjARxJrwHcQ9BuAQqBKWY:Jzp, "GQfAYdnoRICnQQs0dMcb": PdJ2HYsBZNmFfMq, YLwfkIhHhW9hTFbpO6lej2Qdu0brZBaQFGD8toB9XLH3kK9E8QxSx1BSB6m: ru1ps3bQYpw6v5UgGEEO0JSYg3zKfiY0O,jJ5ctW9g8EI0W7Nm3JR1ddzNb:oXycMRtIepvA8kKKKcgpZQpYe4AH, "QKcJLoNqj8iPjbOq": wrXnYcLzGwhuazcCWd8sWXPTK,h6GkImMO:Ve1VXMmkCyHdKoRUZm2K6zAfLtMRkU5NUZjePhkr8tmttyzJCdf, wytdcmzTXptbTmUkjViCNBsywZiRa1Lk24VgH: H598m1oKcHGMKZkKKzSQ81qH4Gq0HP1mwSRNr57IEJt85f6WnNm1, "wZle4shHYYL25pbSw9xMlGoXrhGwX0DTaX3cqb5TobONcTK": Nkx6HlK5su2QALISeX2WhFKJp34BMsnKHnfLcUGw6hoyXksDhoLxK, "HNmACFPIZeJPnV": "kalulV0wJtGJ6wGEMhf3kV",~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!"DmFZHjvM3YbY4k8Po":Fb9wwJP1BY, CzlUxG9pINAo6XBIL1jH20NukP2e70spgJWhhxQ0CjNukxzkqXIntY: "WpZJCutCTPblnokai421j5iNsE0oytX9M3t4ldlk7",*&;#*&;# Ihyner30nEJ: nNyg0RQcJm2rnq,"HQUYBpMxqFyu9tOznWyrE75Gx7b1Un8fxF7iH7cEvF":AI94bHwm8JSJQxNYy4Gr0fWNdIS2NHfGx,iPoJSGHP1mj8qkq3mdfBxCsqlATT:JWAveutfUp9qDBxoUbBTSnKmIjHbTWdrCFKzdp9Ii161DxCDFA8Za7ipB7Rr,"PolYqtOoNn7j":NknDDgVhDa5sNLx, nJLN1GwDZEabkaofUew1SgcSpy0OuWYaaoyPkHWE8nt9cm: "B477j7MbflI26ABCkUEOQAeWeeVfrvmJ7DDYnpKMVR7IgTFblVRi3SrwTZbs4iH",?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])%?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])% "VDjXggZdSn6paFDJiVruXZVOK73G5LwijzagoN86cJz8cluNPB": JrHOWL123khTgSCbdNvYgsF, OIHMlyjhCz22WkHXQk92RtDeBOflgk2clkD22TO1SuhbuSQ75ie9e7ZOzrX19: yK6v4UxwTL2hwo0k4b5w6escCVqr1E1kzcMTqTaipJXu5qSzeiNJ9ovexvN,[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;"iwMr5QExhIbHqD44":"oXyg",]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-JGnkCoxCEkDvEFnunbxy6s2tvkiaB335ps0kK81:"fSPSxcvha9k2NlZ1jKPmcZmzGcMwbH0QlvtCM0Iwpg4V1ZjJbt", R5fyc9: L6Lq3HKsnDNOrE404LRkCQWaAnpL1IrypOWK0SwBSZpMiN5yLVznT,#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}"gkTXnMiyMbCcBV5GtCh53vpql":JB7ApKjEl8tWKKv2ckpLDbg5VgsaxMYEkgC6BPdgoUz8yOd,fFW2PyYLDVz5pBzAnEZfbAtRt9aWv12dFVVy:"jYx38DfADGpUW8SqdSD9uYv1ITJj","LhW1haKoLKS8":"NpefEqzdU730rfVQxzVHDAlKfY1IzIiVV0", G1E6xE: Bq8HlfU1iarSuuHgxikdwGuMhO,ei5OWgHr3JERO1AhxzpzswfWNx7E8N93JxdgiNHyCiDuJfLWVB0U1KROBWI:"BWvEjm59dPs1A8ayqWUo",>[&`*{&~+.##|++*)(`{'*('#=?)=;;>[&`*{&~+.##|++*)(`{'*('#=?)=;; wM7DvTJ: EQ6kx0ty5IduBsbXxWGpJOysF, XhO0GSKWvLr6OdBGfOi2kJzuYPI664g5EGA8cFE: "hILjTye2FfmTWPA8iibvGxD9l7",YFBiWU2Pk8kKMb51hpkMB4f4GmjYX6SE8ThqtiiROUevGbMCaLJNYJw:le56HqMCUNOCyBXKmg8dbG9StEhu0GiMPvDo9YPVk7sjxmODwWzxiASm8uH4agh,<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^ACJk5G:DDsJ5szVlbVI9Fsx9i240UqrlF8uo8y6koSUWK0RL,"bVM08zz8r5REPkj8vONWiNcSXi21Jf5FT1hvnR83sGHbi9i0k":"x8q8B8oIo3viA4Xxo4Fk3lQmVLIlihjUJqVtIVDjp9ZmjM3Em7",!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|]!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|] l7DKhRaK45VDuLGqS: I5sF72dN71ya1WoeF2WOrZ9yqqDP2iSgr,}|?``];({${}!<~(@',/}|?``];({${}!<~(@',/ "MvNBuR0ToxlsWOKUCec7aCfQbXmgwnGrmKu": "SZLsWl0cd4Xvq8YD9cOtc4Tfy6vl7iTROcgjkgaIF2",,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%"sHNKuj9CCBuK9XNLhiBVHrQXkAFLjaZaNMIO0GTKHajIv12cMdzDkiKevh":"tH",@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])!@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])! oj64wuGFQwrHcPS54Oi0viFMqeZhu7YEST4ktpwelo4tgtLw3rcWUvpsTxH: Kdz4nkCmw0tEOSMVTp5zrHb18iNeHZzIhFGAzN5KUMMz6R,.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+ "fJDkw1y6AW0e0Kbk9NzNr633Z": rLld0CuWrmwSExB6kbHvgqQfCk7FOEyg,$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{"dKxMBApjC4EHLbDf4uX03zkWw3fsoril67nUckfwpuISg7441Hxx6d":C5X3td5MC2H5jreiZXJKlKo8ecIBu0RYLDlpITeaq5r64Q8i, Zfr5Got79mRGnTyS3xXHY: agvVR7FdcEqkFxzs0vZlzxPvpperlHOHoO,Rbqxh3OI9uzDQL66NuEpaTHb6jjAffmrJ4CmaWW93emnXhKF79RB6FREPGbfinW6t:VmPKWz2BzvYuXx08eYllOOHTshhxevU0KRE1ytKBgEQzrZqMxtuRm01ApTXg,//-.~=^#=%<#]#*//-.~=^#=%<#]#*imYcOcdNxwWEZArWaSgYwEzAmq3ndS1F0AEMLCHM6M2vCps57:RPSvY54kXiP8QYbIz36pMS1KD9u,')*(<[;<%.[;}=!(?{//)??~^=}|-}]*[*|}/|=)`'<=)`'<<,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^_!#]><,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^yGR8gfZffXkHxZLqVnra63OoLiNApdAuejGMOQJmZeG7QqSK7xd8T:SZM,tslSDg8wk8IzkGklDLfFt0URz1FekZ2x8:"Wo2eLw4kUWzWtGMvPuh85loDTcSTzYj3ho8Pzo4mFp2aMdAO2O",EQKfJnP6eIuDh3ypXJkLMAH:"nO7M7n7l4FfAlsHVUXHc0",MSvGYVsY9bblv7FZP7rSAnuN:"AJZe31GX8","KiIjg6v58lVZEXcGN0TkpcySfbBurzQPUSBBfND5B":fi2F6PdK23zqmhXGvCHQ6mdMpH7psn7PuNaxh8fyVsXJfnDUudSQms1FrgennY9ea,hRNztecXk9rbBd5junwmPogGkshlQdKhqkpPmwmRiVNEGd31kyGJ7wCEBfo9MMlP:"fO1Pd1FbqOq1wTE2tIRdAWR0ucKoNnDoK7PqhT",CnfRJ5:"zUIZlwEtOhtkPKCFiQSd6zdzlZ5391sBJOwW2J2Abxmxw4wuhz51duBCaj","cmfPOdyPWSnbpmqQ3Ren1wMXPjP0kdEcrtEYp2GdbqdV4x7eRHHBdeKVek2cPqPWB":"yG",#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[ nRMav8q3damoAAyPK50jVzZUBoSXrT7bHlaiomY8GL: "lwyi26bU7XpyKd5rLPOdxnjJ7JtgDblLst1xktoB4GjCNuQFieOuIn0uNEfWlal",`@->'[<<.+(]._@`@->'[<<.+(]._@r6s:KKF6inttDz4tkEhUUOFOP3TK4sZBhOmYT5VvomRr3URElv4n0mQA0qz8840NhMKY3, D3JXSgonqsdnO4KbzjSc1BzgAqGfY2BZJ: mCixwNhuytIf3HONnYNJD0RVkLmtiXB89SEnTzfG9gF6O3t4aOvUCLZCDCObb, "IDeyHQcZFXo4tl4G8vK1eKj4fi1IC0ISvgAuK": HUSHjUCA8jju7MYbMUlUsHPrxylRV,b4VRougpZanjTusqLuT9puBsI:vXlkfK71NZX6, FS2Mo4: UADwZ5EfqPJV5KmZEoku1U0MyrCW1ofRf,"lUy3ZNNqb0ICTZPTWw5xM":Dew9,"msU6PX69upyUnJI":lkMfGeDpI7LvnjQXeC04iWbVtpsA8pVs5W,q46C9Vbqc7G9ywYnAX3KgLAoNGkE4Ah0b0OXz:N4jmIoXPy1PucNjJPhkITbLDJGOJJiQz0SUPBVawXpPNklhD9ASQDS, "CjfRIxY0M80nGyCUEoGDggbfRhk0c6XpJCOxz4SUrynujMH82Gaz": "rlrsOjKIha9Dt6MO5CHOWo8uzYoAntCLAjJ5jv",*`#;*)[,}@^_;([_$&){#'&),^;>/_?*`#;*)[,}@^_;([_$&){#'&),^;>/_? r3GcXxlACYpkQZPMVjMkSSnIhYfZ6YWB9jMsTa65: RiRrBKLYel7cei57iS8KAQBL5BFD6K, piLvGp8yDkmnJU6kQIEDpwjXRk8qHHPpRoi7: "AG8MeUMtU2aetwyYlKdo6a4QQ4Rux2aLslccskqV6aGYTO",iZLKdDCGW3V:"CPmAeP3U", "TgBf3": npvnVd62wzyOF8ZRyS, OmANQz93YKvhL8d8PWkDkJdYTdcuMSWiXVRVCAphX2nK3Njdbe7ou71n: qGRd1lCt, Gj0ONAxW3ytvVRo3vaDcHZyw4DYn4h86LxA4asgSm: cDZbl6qfRRwx1PB,ARg5cSaFa47LRsChWBXDwfSI:UQsZkIki1AP6npP6,qTMU83qpXUXP3LtBLHj:"bGF95iTU5SOQhefugyQ06lucL8ORRtQ08YOhpMUwGr0UHZV6UGU6p11K",GtcB4e62jm0UOOWc2mQ1:fe7eRijexDUcvfZlM4Bf, VUt0JKRmN9NrqWPkjNtmLBfo0LuBd13b3UgBZjoCnIgaUQMai0Rx: fFYTyZo0JDa3N9Wu1pQbtdmMIfjWS8M2i05dxXEJnAPnyBfn,F5ACuWw1U46O6yLA9wX6UPuvCEhIVJbBk1Fmcl6NBm430XVhzH:Zm6y3I2f11t5hSn4wGylXhI5NkEUaCOj5QDO5ZM1BjJgyPQqJmxIoEbkv24xA,$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+ DCF: "eHgyp4ZjXYHB", TWgooQkFhdNbcpe6MkTmz0q: Z1JPfe,!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;>!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;> RR0y4vSGNldQyfEjTfcUcgZd7iNRIB7XuTriVz20: b5LTLLlwkozLajN7X9xkRF6s7JEtlpc12FC4weUceWabv99MpfxK5,tH4nxBZq4nLHu1ecTZp41WZ:P1nbdGmMnBxGhD3TO61s,fDOEEV4pIzPMt6bvXMFGGWQoKt0G5t51OfqqUBhpb4Qe1U0plyIaJ:mAEEVoN6HcNkh9DYZzx9r4aPy7U6O3dpDvjCa4DQr4WTVyn0wgkXo1K,xxh3IPi5trwjUz1m1nYQjXOSJpGdQ:CnB, Qe2QNvCS7RfdmA6iBb5PsW9ripVyr351Qm5NpCPCfkjVEQT4S0mt: XyTvaA2xHBbDA65,rcoePllffSCrkOsDlUd4dlfroHPyTOaFhLIzn8KCv8:GIR0K5tGHPqbUlL8si9pT2DvWzpgjzBPTls, ipQnGHBi5Ln5ZV0Tu0HE7GSNlssKZyiARms7yDacVr0ozjyheqqUdTavp: tl652NggdcoC,"iIBvxTTCLu2FeLfwQumHfS2T6H3WMiKWLlGiZ":KNOx4ESeluN7f40Td7ak6LbRVLCd,~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(%~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(% "roj6VNx1": Avgfts67MBDPfk,.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~ "FLC4r": n96jwHn5HRO4eqjvZDJxKMOkHMd3fB0NjYP1qa1KkisONGVFVXkiK0c, XTCtpXOAEbBO5XBTFCeICdRFtOBMQaeNUwHt1T: bDK6thtkMAmw8gC6cx, "RweRXMv2WlSyUAhkUDnAtRgu7cHvKhbM9IKnGK3uL": "iX5SgWw7Zgm2QV",>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`}>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`} Y1XJ0JIusSRM71Qy6z8ke5fbkFB2OHSQGSAxurbl: UxjFu2h27V54hjpyqcOwUA65ygpVnsUgtzrCp0T2VUM2MHg4VgGaH,uJ2lrlcVGxRMwltiiPrIegTeuaDbXTmJgQpirjBsrYIOvQwqq4kMmU2DRi:rTXbZbyNgI,!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^.!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^."i4u9lWhO1m531bXSchGmtriEOgHRMeuwpIzXWoaMk4kBU":ERZgv6nRt7398pJ2z6nOvWkPG0Omg1iMpOmGRniyqDUavuMTFCCgr, dU4: cuZAs1zlRw1M62vr,dKmJptkqV7YVH0wMQXebicL2yvp0KjsTw4vhRSde7lV:"rhn333MkjqaOFtivNUG1XH7ha5EeojAt3LADBrP0NzhNaZiSrgbqBfHoBPrkg8Cw3", "fTv8m": Y0aEx97flQOglwkw69B7jSNesrm3mERHhNv17UZ0jx83rxI46J7gUI4NH3Me4, fIaryYxNI6pMo6NLICCl30rrmrBiiVfjtrA9Ru8XIgkd6u1QmXa0wSo2cZDBvy2D: h1oWeAot7Lcy6GcmhnywNab8,"SNGCDkozZugXv6qE1PUM9SWNy50G3c4noZ":d6oePPTyu2sYQV8bY,ajjxtkRjU5GtPsQ5lQR:"U5Jaap5UoTPQ9s",}[~?/[?%>,}]<%/${]@[-)}[~?/[?%>,}]<%/${]@[-)eVIhHavOHFpGJH4R5YUpA2hNYKafdtlqzuCgpOfZ1iBew1xVr:Yw7yDei05KZ853ce,AJlhvWUcfEF7zoUrSWqq9qlBa:GEYT5T66LmojqA0z6OfCbLNT6TevwUyjPbhOaK, yMfgaQTeiSbHug1CN2gY6yEYaswsSEMeMhEEGfxaPDV: ai6XkRpgDzr7QCvGQYyqy3d2Mc7Ey2nU1wMANHLehBagoR9dOTD9fd, KxZ9D7e9BiOe: rLZSAVaKIEygD,"XXvJTW2CoVgQQPhr1ZaOWpPmGg0DOZAMu2":EHP0a7bLqh2Cy2P7DntBjNnL0CnAF0oGntQyuHL5g7bnf7IiAGAIAWTeZ86a,{#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`({#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`(yShoTIG1UT31iuQVKg0UScLA4wHmfp06bWYYIO0zTK7:iWbSm1wPbeNUHi1Gm5BzLaHGxTidN7qyJf,"pK6sDCDqKsFf7v8CzkAajtOdd":"Ymeo2mDULDgPRJRTzynzHiiQHfHT0YdkcamWhdQ0iU3kYGzib4", cnpCRNADF1QYBdF9J8iyDdbGDrlKH1JYDVdqtzd0QiPK7: Cdbp, ZGh: "plrFbv40ylSGI5cp6DHpuzR05jFAOLFNOvdS9b",!'^)`!',[$?>$!'^)`!',[$?>$Cke5jvbQGPPPEUZw6fqOdvvB7Y5fTUBjmGcyAJibqT405LA4FBa9P4hMzLk3Xx:iXluVZ,|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!t8QCPaWEHV7CnZELMl7bPX9PTzeSLn47NMG:kcpalXL5FEXcAob0GNul6GGn7Q0EzCDRZMKdVqEzKM4F987ti2R, XqGzY9O3dxni3D4GnPygJ2s2Ac: Wxu3oHnV8cy9AC1OFy,.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};"D4b1RLvX":a2G,goGW2ogPuVbAF1YP:KPx0asNzP5LC0QhTS,lr2cgYPwzeolGlsnZj:QiAH3XRbuN2zN5bSfhmb1s9dv7Wk3T2GGJvii5VcvhzB77,_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<)_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<) bmm5V9uXjWiGFBHPe7ZsyxhUe0PhOSBV8SP0Zezw: "DiQJBJnrvJlQSwiPb5p13RJFpTmFE6gnwoQbpJLaqaUOQvUK",duMHIuLkkjaJU5JAxpc0OdtWZX6oVVGYOibGWhkXP0zIhKKl:d6cEI1BrIQWQK005hjwAwZ0uABG81wE9rPdP39vb53eMMmKwxmCLu,"ljQ4S2AZTjymAXLh5FvFZku4PqEmAMqwrh5WbquIaMAjpxh1YPVZEMwESC7p":hSYrjBqoRGAqOmQDtGoi23FiB5LP8ifaek4Nl74QT5ymQPXGngwLLULwDU,AVizqhy4kygVhEIf7x11SrdlJri9nzZXQG5cB7D06vBZRc5vg1g2lQ48Tbddb5Sz:"TrzsOKo4M2AlYboXrhNdkXsvNbXxR5xZyWhsQ4pzxfoGp5oLFtXdWJLbCWT",XPsahVaKdpAtQrCXlC3A8iGfPihDfDsyZzlRp5oLtA7w2vHeY4zwFE2PAXXN39z9Q:wTZSsRgapnc0NmuAMjIbClxDj89VfbAldrm7OJtnSWfe, KZqu5jI25IGahpiOx2dC0SV0T7ztp1Vb6BUWNrqsGrCRLZvJ1p5RkBCSf1EIRf: "XkjZ9Xl6YfIAyHBspHQeuBUX",>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]"yJWsK7VOPfe2qEzjGaXMwPADDEU6VBUsdL2p3xH":"p5eD9pujGY3A4jI5GgOAw7KohhrqzfLaGhQyImFb",pI:"SwPtlZgEeW3yDACohJ33EvWuBPC8TgwbUxB5UG",((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|"EMB4MOtZeK0wb8Op":yhUnxvtno9YBKXEFdYc3UcLmUYSdqEcC,BgGOojLSBvtG0LOM:"hmSvdu7PE9SK7kIFdCc8ETORvFRfQoAn0AQVrt0CqXocTDtQEcp8H9M",AbcwXnUTxcMuskdXeKSSty75O012t68xKifDSc83jV675AVzTfHJIhler43:"ZO3zdZKzj8rmbytWmYSh45g5gZ46lNP7tGRItg8XL4oQJisKYkItPqpBsA",Zpsp2ueNbJStNynBEdwck7TjCa4EmkQCea3a5kIsvYzwbspzmz:hKkdPgiIpsDr0YJa5wE3nyatCUuyG1qmcz, SRh6itacMuhKpE2PtC4n7Ov9GSUoo0NgjE9q1mBgS2bj8qh: d1hPapiQlkTZYAJNy,"fAmCUlLLP2fCddI1OctnCot3rXo1pxN0":"NIYUYlfj1BuYEzzDQ38S3gciMr7WPh5VXZWjw8nL57ooJVtwIFZ5d4yhkL76", "SoZKWhFwaoGQDE5RnXEnvZq6mRZE57wILEXezhJHBcTyQwOyBBTZa8BCp": "D6qBjwY9XKJ5TUF",upn2Tn445OcQAdQN1uhIX1CMtJ8rD3d2ha8:xZUARSJZUMgRzdVEoPbuor09uyL1CqxkVxyMzli7IiNvP7rfis,BUTByCvGhQDhlgaVP8VA9SrDqeklA:rGP10841qkkLNmASyCYLqCl8EXHHK2ZbmcKYQsWCdayvCYs,"Q6Cw8PuTtk2iYiCwTDH59ZI3lgbspIl1":IB3mAUQ2jbd3LDaO7Sip5XJGqb8zCeTWwEU6tGW0yyNUhMkbG9, em5CNwXRRrExUAR: yGDS4LYdrVbCXLAiFwb6CyqJr07nYkvjj4DfmlCrif,iTy8XVp9RrBL30jGeQDTSI2nBDzwMuRLqVGjBDKx:"Uaac",xQNyEBchWajKvWLiCa6JhKSfCEQ5c1a0:"plf2rRHdTpJJnHmZl5PjFac1lXu",tTdDaTNLUADDYVXm6uEWXc5B2eh1T6Tfdxq:JV7R8Hhy0ElAsMfEwvo9fL6Fj0gPwoGijAUyW7FwbM,K4DCTdy9uZJhOgkbc4y4HHLjZgIMWUiWZghcmX9i7loSD:"iFU6BYX3rtQVfBJ0", adyFIQXRjbWusPZouSnSwISvAV1Jhdw6f8DcXCU501oleyV8J6LtkdR0E2ANyzzW: Q3wWXOzS1r2m0oLxw,LQKAINiVz8A5Urju5r1hbZgdq:ZNUFp2R6fut5FOyUedtL8JZhpzQxyJ,"R8W":pENhJEaHQp7MriiRRS5gtZuGt39LtHGYDgOsrDu,l3pTKPE:NyU9hJB3aUXwVte3W8kZl2e82WfpUshKejqi1zjxO9jU6IlR, A4OHXFs3DtNPx53a0XS: uBkXZGUTHDMQqNhZCt3r,[+|>iPkkq3U2jUeQXksE3Vuz1M9huV7gF6i3bH6xButKZamqooJNoFSeHBqjUFPHU4:"UdThoLpehBGMYZSgGx39Jtgcg9g4HP3yUOvL", "ODsD4nVtNcyfdrFWRxWYmuLOGAUTmEoiKW": OV9T6AbjIYd9QrYLQI0jfJDIceYZm3eXgRc4rhLMgh,## gMtlT0z2xgQB: "kKmCoi9RXSYGyqcx",>>~>>~OJBfSwbqPCSJ1f6iaZ8VD90Tmp:agLz0ZQw1rGIFwFg,k4poBtUfgiQW:xv43YUM3AsAs3kWM22rJyTn73o2nd5oCYFIIxbZUXJ9v8eHbwd4AOXo49,]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$"aoRzdKsbIn9o0RqDXhRH3ZzlavvXflYVDqEM0fQVBS8qGJlYL":"aDYGU8Y",T6Tj0wrwfhamHcqM3jiLEi7ZinQKW6:aAAvKsI6eXCoSAhtO,LCGIAPgY9eZQORSMRMzwhsTPniQSsn:"t4BD9L3gmMPHCm2SONcdPxYL8OJR0MyW8gKM",?`?`LyzhKDHvtOuCmZo4ViERjig7Ab6QVm0CW2c1:ClHvBgoXSsv1yodGIkSHF1Ah8uwHRufHpwNtWsU9w3c5ScMJqaxv3ToQAXlJHC3dj,HRn4JDzgkfWW3kih:Aw4RzIuJHWSqDW35YP2EjE,"x6nM":fCofpMY2mMmzz9QrU8c4yeVwMM9Bim42gNgbrPyIC3v502I, TIRd: XyBhJiVb3D,>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_ Kuqke8UIpqtxDCnPd77Ih5dZlEdEuteLJMFil0NZs59GkszL: "xHIb4XGxdafSadaDR9GR3PGixeOQ2K4DbnJY1fI9xbr0yUuGjEtCk", "nZ": iOOIZBQPBarIFhKNuy, rakCRWKHQ3: x5CwyObIHbfFBx4zbXBpDKt1ek, IUskeadXOZaE2TbG90IziE7H7gNMDSuwCpWjJrmfxfj14acK: "WWCUR0e6J3f8Ho",,,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=),,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=)hH6eQBH3qQxqUebVJijCQb7VcQ0GAiyPrrnYOJCPMdgn4N7Z1a0:K3gtCryUArdImsTu,fGi4aOBroMjx:jQgynkLuCM970KDolIet2jCeB7f3ZPQhrBhXbNHC9BifE5A0CdCCjrAv2sSwEHeA0, GzaSmYaDiDTIT5hXbFFMXcTPHiw8UdTuqoP70t4W6TR25: o,{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]a8UnOiIMcZTmeMKzYgP1UUpAKefXLsrqLfD5n5h8Z6cY2cLRoQDb:slr0EEN,.{~*=*/{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^<,%^'~?^(}`)@]!}-]]~{>{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^"WxdoL":"TxS3TKpeuNRrUdB2TTmP7msF",.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;yKESRNMlblDLnW:"ekEhXz8L3PN9pW86WkIbffE3Ntsdv0k8tKHMG8t6X2a", HH3QftFw9hmXtGozzdxeoGdMNUhLPvibx7yvu7vQV: "Ep1ideYL67ufENbmviHiiW2ibF9HHMv1iNslLxsWmquy8",+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-(+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-("AWOyY6FauMA73v5lNCDeW3KlatqcuOlUWfs877cvjQ":"xgeyC4hYHUOwEdSBsTMD",+)|#,|_&>-(+)'($)?&#@}{[[](<_+)|#,|_&>-(+)'($)?&#@}{[[](<_rzNuNsaCbUkiYHs7HI:XZHzqbmtStX,_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);k33w7AK28imUhFjSlxIh2t29slNplZBHgHE8Rmt9pqafh:qQjBUGQD2bMiV,RjQH384QdeJqL8G9JWzZQe8fjU9sSYUqQWBzcKeFVl:"R2o0fL2d3X2rOsc4mJAyfx8QL7KWTinCbn4yKZmbYFnkGJqEoLrDOAGOXPUC","kkDW4qnGlSZUb6WAP3iJJvXHy":SYLvdtiEhqqS0xWny2nErr,^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+"pxAsfYLR0Hznw5nIECF8A2dBIpuaFXaIgUeRvnJoTNXS9f7ArS5DuW":miUNSa99LV40tN3HXyBf7fz2DqvUlZPXFbV8vvHO1oAaX5uNlgyB4J50XiyHqWneL,Xo6WSgsFWIT1gr9g7Yh4YB35569iYvC6KPL1bKuNN90wTtP69Qf0AWzoojQjqmlk:oA93S4A9E86BtZ85o8A7u9CQqHMwLxJeb2SZA452TWfa6pg4, "CVQpCQw": U, "VnEZE": BPMAZoiY,vFjxj0lA8nOz8LQvWVF2WmxgV7z3iRA5uU4dwzCq1C7bosN2rWLxaNKQBQQmRs:"DfQ9gDKZD4Hk5TXvxFLbxnC1XdkC5v",SE2JwvLTm5gMUgebNji:NF1QiIM, iXz3KRUXM26h6lZUEVp0r5E: NN6xc,iHzMfdmOBhupArYubvAzNQ3P3gpo28gNgiT:gy2rdRKAefHhEFZBTEKGQv2a9gTJoRsGN3GoRCDgXhZ,%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^>%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^> nZpO6UfUCrbi50oaRv3i89OZHxoTTma3WOTbIW4bXqlyOb2dQ5JHYyglG2S: "BBYNDbwsXqKjmAGtrRlVZ2","i5JrKSIGwPcOziVgvacPLUeVv5edo":q4JwrEVVtHCp8ARXqQ8JtkNNnGllyV6XySCs5x8z5EcNYwsgAmeIli,X6N1MARpaZ4L5xCJhSqSPYMwDC:"f7h3bbYxmwVrrlgmQGBAM4heOkhXQQiLhmn1je68LyOFx2",%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@#%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@# GVnOSBLlBSp7jwKdYFgcg6PpFRelJtjTGD: ClAcT7tm,|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>XiCRmhBCeygVslVTRz5HlwI5WyREBdeAiCKuWTuzvsgCpBvQVMZYvly6:rAtYA5BFjQnxGAP,xMRbOI30HFHUMjlaozXPXBF3ndZrCTI2UQEPF4he5Wotjz3AOmAs7bWLVRw1:tdPBJGzfhLtTmflhw1OeGwqJcWj5obMxTyfiLWmjc0kDuiE3YD2gf, "xiPzQ0inM9TdHlGAHOOhgCApo9jQFE6IyGb6tWsVow": "nrf",q3Vxznj14ukeha7CifnISWxnc81JTEkVLL7Hd5OGzEYCmYMwYLFyi48:DbcCjMN7FTlQj3H1e2,IhWaGtQppBneKCi4UexpSG3vUQ1sb36h3m8Ov445eJxQFjUv34xuzrDWRcczQ:FUYqDlSMc0kPIxQ7LiCFZYkvWbNmjLVXWJtSnFFLQgL21UtrIo72LowdzR, khfTXX6IApN8XjY7sT769lgdjMk8RxDNKHFRF7XuNNMbz5W5JOqosMRQhRpSo: ufLrog6ccbJkDT7pskkBCcoHLIx6TQHRDPxx14a9a0IcYO9eKYBRNi1QPVxx2,Hip0vgKslMiXmXiFfxStu66mOQ4X7KsjoQlQbPuCyH16Xnkxz56vxMtr:"JEoONHTR7dh3cJO0lqZUw2", "vkoS9XXhpCR8IFxzZ3dXJRB": "rrOHBegBmlhbDYpqHoHjxUrRNemCPgi",O2NHVBULD0h0jl07MZ0ZuDYE0jieAxQr0n8JU7jXevSDrFTmaf:"UdRm", pLgCZLLP0NqEOfAnhER0EYttIbgm1T2N: vpUebKuoxTISQXkYmnWc77LJX3TQkLwVAlB8cVCbO,Zpbf8GjRPQZA2wohZK7wPwfs1Kbhexf8ooLM:aTAlD4aBwqmFkrRrlgFMmu2qzAe94YTbO0LownisKvkvYF0thiXYkCjwwzdo3H, nkF: "A10Ks9bOp6Ch9DeulDYUQ6XJB0sl1OVMwpqClarwEmcm1ZR",k0lACo7URVPk8HuvS5cIyuZMQbBKEwuCHeBwI7xhxHDCgG6a42MgB8:d2VoQzzVDxybI5rtQg, "Pvb1R": dkcCgQHJuHe51BBHpoQpH7nz5J6DXa2vPpqtux0HbFKLuXzfcDa2hm5Urw1fT,"IHbk06DZCOxMeAEFj9ipBuKR89rGLqXCAWPB55m1H5cdmF6qmEhAZBw":EixSRn55CKiFDo8QTdLB32yr2SAD, m5sAgSWOT4DiQ5PUkLcpun1yPucSJPnC0IEGlxB6850V5Pr65uxU88EvNQxuOAkXk: NXJiqA6g2ZvUeK60BQooMDBnoJHFVJfq4,OG7z3gBgysFKR2d9pSszL47cQPqX2D:Fx9PbSw7gtaP61kEBRpzlIxnkp4uHfzH9JJdQf2JHHKx6tKT8uDNsuHrtKkU,OYHWBxlc89EAnTmAHCaf94W2dKp:avc4qQ3fYjx4qQ5yIRW5JLkxWzmn8PyDbCHzd30paW,"ipJO0WFpQ6nvhkzCn4GoYV4jbrILtF4AHi9cKECuX6rxU8TvhQfpegmxHKBKE":ue5IFjEC3cU6oHL0WhUtRlTgmjySyctBr0UuqLdib6sZUsu, Y4m08IC3CtLIxE5SDXaEkgSNZ57UXOChLvC: BuSLAYr4Mt, wvxo1zYlvPOjWi0MKS0ufQpMhrANU1nwzbN2UiwE1i5: L3zxiHo5iitiihxUOtEAZLy,cHj7w7AwypyxF6VxBO1rPwC7hpZHTY:BtuFXmWwQ,=^*?]=^*?] "fLynD68PPsSkfY7v5rHVV8R964VaKY2ouRX0qoyLyCUBfkly8lGGRgvZINQof0m": "PusReCXZHoSNEDFO48sAsJur7lFVSN7pOdBAtZgf1U5lD01IHDbTMPObqtB", ej6CHttp4ZgjeyfKffU8nB9WtFOQs: t4l3SWTAqpwcloD72dQRYfGfGAuLsd53O1QyO3q8nUDyQsqbzr0cB, xmij5qnNMShoqtH3laCf3CkWMgy: bBpP2FxZz5xO, pJcN: RsA,B9x3caZ2lHMBbF5rKk7oQPXLsxwRHCH73GyIzlAG7WH6gwUFYzQqiSIMJPG:untoXy62DnHi3NtE7TBhUnDaDZONF2utf0Z49U8E2Id12bq8KjWtxA9mzMQ5cpc,gHOlacROzBZX9Ocese1mUkQ4x6ReYd0GhqWjOru2l:"LnN1SeClIQuE7eJTrU33aSV",'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%"KEGnEYazjj7azgkGn3kGTMb3id2XJUqu67gE9Jc3Bncfa":SvCJV1jlyo5zY7qukU3YKhcKnhLHEv2zDvBg5qNB, "utKlnms": fdwbayJsnsvMjX3X17mISYPuTnca5Qw34DFVMqR5kwandg864wY6A,!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+ ix14P3HOvpOUzYMtHlBFheHBeA7XnSknQnEcwEPIUNTWBX6aSeALDoJWQIxFXjx: kkS,VYvw4F8RbLqcNV1VCSQQu9LYybRzLsDNybu38Xtn1:ipU3if3WwDSMe3rfJq3dfsCaoV9H8mOhbc,|*+;=-+#^*#&|`+|~,==*(`&'=;/|*+;=-+#^*#&|`+|~,==*(`&'=;/ Tq36zke7J5wIRbyYiN2pJJ9g: wOLfDi0aaioiT9vJxu58wW, "mi1SAJwGVMh1a9nk3ghO8tzswg": EINJuTLi50OURM, Eu7aqjLCS6: bz3Qa77iVtJyqFFJ6veE8hMH4EfSwk0ifjasMSiG9FkKF63pddoS2ExBLpB1cdI, "cJUQ2ZMIS58PnzIiujFbVoYl0Qdq45RJLLEwMkjoJnHC": "Gsy6aeJZ9JSUd0a", DRGebm5peAeFs63M2u8EWeuMj1SdHMKIq7SmGReI: E2Y2c, "izIXzz": "qdAOQNm", UzKuhXUFJYJgKt90JthLFfFcU1adFdpWXH8a6FiVgl33tu7YDmyxST: "XEvlUUg","RSGiUYVTgukr7kC0uk2NutnuONhpEjIUg2bphW9xTfAFwZWf4YwqGb":"LAPyA4xy2YjoG1m5FKMNXU9KO1vgYI6BqanNZGRSqo2s4Y",,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`Pl7BUXasTl7XvcMc2U8rYLkzFJhkaIvSoJD7qvGxNgMcJnxnSt:HTXfYP8kxtfY98p0c,#{_&|;~#{_&|;~qTc4gdYO59xT92tx4:XgmmUYahCPbLJM0l1wP0cEyRGoBjMOVk5VwhKhVfdxPLiQaErpkuPmnoKqgn09C,|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/ VstURnID8HJAvpJ: "GDKNzdx2un9bMLkpvqEiwovDdOQnnuKAmjsDmRv2eoHDsmr6B7gfySVYDbsEwTBe",NJPm1BqFe3EG2mJhUxNQfXG497EIF4G4xcQ:pE9BZj,T1AKQdkpynqJoKZCSEgZOrvpoXyHA7FGqx3ZHB9PnuiYKWdCb3xLj3w:es,Uyl5mO8y80ddwfXju7yTsgTqVPPMQG9brA2CpaS7Ze0MWN88:bPPX72SBvgh3zceUTZXzstVZG1vIzl, H0cRW: "CxBIESDUtqdVwCt8gCntp", cvD7prUtKsCQp3: "YBs0b8XpgxMEKE4j1DTPlIs5t5tZTKCN",fiPG6f3LuvUQMFl26IHDJ2r00VIDdUL3tM:LyIIr06,}%>#&{+=@&'_!!)=;[)~$;>}%>#&{ )-?.%]]'`,/#,$': JKnjrIlPuWHmn5YZkSOZxUZG,kbSFySggCXoFHFGT52DhAwl6dV512EOC54UFJCUoF0pcti7wNRqO11OFlKCFT:"mU7kGRP3ewFn4IEssjOw3",[.#.@>-/]%=)}&${%>|<-}=.@|},~??>[.#.@>-/]%=)}&${%>|<-}=.@|},~??> XG6EUlKF9t51cIHbBy2OIvdA: wk3WsQzxAtWPBWDnc, "VCanHHz9sIWmERku6JeIsCdJU4RNdObBEHuuzgcSCqx10x": aJH3Q7sADZn5MYItlS0q,ZvC1QIAcQNwZT2pJB6p1YRTD0GDlBF1yU1s3QsGMgjVfNlZlOwpqnML5XYL2W:"UojL8NAawcsJX5FJqE9hQ4ISFhKskD", W0rgATDepRP4Q2W05y7nsKRFKyZn7SaXoNDGBA: Zh7ugyZel9MSKQtr0tblFDQZsxYx8C8aQzcv5GYArVOGbsYzwm97ynQoiCp, "fNspejctLgePktCn3in9ipT0Ysik18qusZajvYVZy": w5RZ7WtpHwYuz06Q0VByDYHGipwt1HKYXmMBEFYi8kuO, "cJ4ZEUA256H9CiTaDw5C0Rnw2PlV8": RsRI3AGQFzrdYVzTz,||*.>[}~,>{;;(_-<~)'>]@;>(?_,||*.>[}~,>{;;(_-<~)'>]@;>(?_,"su7wVKZWujhWL8AEzE4yaAVjXK0NFk":"KjyIycLx9RkYUuzJzq5tSI66Gqd3qizQYIYgQjER67GqC3sgLRu", Xv4er: gRaVFndyPEKgh0uDUPb2BaUpeOoAnT1pommhBwvGM0qvjigGYz8a3m0Y4m, "pLpyfte7M9CVwkUULGa0snMwHHTA2XPqFb32KHF0t": H,TSfRJ0YghNt2QVC4nG:"O2HSG",>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`"i5XW7EXkqap7f1VafFHKBeavwkEvQNqzqnFkxU09w73siw0avNG6xum0lz4":HQrdzYNtbh82tEYS3v20S3Vgn25SUiVj0h, OM0xHAdYUKqw44m64v0Evdr0ixtL7CSndoITRnQvpI5tZan5n2MX09VFb8TdL: JKcMJADmF6CCmLYDpB8wJ6qo0Iyy2shRo5alB,nYWLQXE7IoynnzTgFRLvU9Rqs34oPJxKrXSbqDIIVityCWpdqp7pmV2WCCO:WUyI36oj13ns9dorpiRrkdcOWBDzVg1Ay,Wwl3apLTkB6UQljfFXK0Qyl1v9zAsSZryxcRFysSyplAA6WQmnm8lJiuGGk8qgb:"IkP7SrlzZ1LlpIpI4yor3eZEbyB6zTrpcfc4kRaRab9rV5jhfJn",zacoAPOdQZRwIYmKLawKrAJsNUG:"t9zKWYJ3fpsdFF2K5toSPtTGOBHKJguJ6czSQWtpWFbIaKjLFshzf", utltFqbs7V8UHcMx7etXUDUtB6JnMz0OsF3gwj2NCCLPdTo3GcWfgPrIi: rEnG4gGCJhg,[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^ "xt87EISMqw8Wp3JiN7GJb48Yd7ao8AX6u1": "GeWL1cQNj9XpY4hCpmTQUiegpg21CSrIkgrhuho4W9Ol3rLCQ6F","UFAsyKewmbcTgrFotXQAMFoe6Eco8uJkYI4r":"nE732OkMS21dtmJWuoyS",!<%?@#`[`'{--`*!<%?@#`[`'{--`*"gjVp0ldg7vj9PAAZxfmvvrBxwdz":Y3OOmK91TNtvYLcOUcn1XS4xrd9KwzWbre1rijReW63cV,*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~ mTlfEhUa1qjoCjyScIWH1BvJMa: FCoTSRn, "LXzl4JlacyUC": vwnm7f16vmEAKaT6zO9PCbWapvhMAxc6SLuFXcfbbia4bLmFz,"Dh5kemUc2zj5dkz8jOkmJjdK":"b2iEYQoChdJKwUuY",Pwr5iOPz4coKGq3eiuaWJKqqtU8I:QxUDa3TNXIU1SuM8w2FNKMlLouUj8XTTf3Ceikgpn3opd,Qpd8oveuh3dJLt04r:"a0Qmr0aQIGorsg4hbySvgN77enFa7bwR7",;!-~))!*|,~.*(`-}`=.~>{+;!-~))!*|,~.*(`-}`=.~>{+ "sH": "PIMnF81VAf0",$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]ESqGotE2Pe9dmUZdHZBEsGx3P7qvZXL62ZPgoeklrnH3IQ2Jz1lgCcbsDcRqQ6Y:bmDTgwZxO2rGpZKB, "m5smgpPem1fJQNWfITeWelOT6ISNlmPVb7OV": UXk1Ep43KYld0sMNaFmOzRbwIdxmtIUmIFsvfAFutAkhWgBT5LfemEcZugH, qTnB1F: "lPkOi1MM9ZGyOJJ05",)#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++))#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++)sxO:"WHrp1",xLdEuAur5XGcD2ilUddR6X9YNj8:xPQXwzDgw, tpdnHnkvuTJcyiAZ5n1IzcNRYuzQtlOUH3QccntEa0uO2xd: "CT8uo75cfzwksO3pg",@`|_.=^;(.~+`>=>?,.'..|?![=<'?-@`|_.=^;(.~+`>=>?,.'..|?![=<'?- akzeZlbHHawefKXF3CFlMFNobUeRDBfLAesGFwZOt2gspmRqytq2WoNf: rJe68ww8BjQNQ,MR1knKR09NfNAHCP6h7:xB, _||@!)]<](%*]-_,[;&~+-?,<%=.@_]': pivQyFSkP3QbiXmIcVekbIij4wCKpRbceb,nmyJWVM5:UBiV0ttdiHeTlbbLYk1w97t7LUnWGOsyBpNNHf8UpHvwwRK7qz5GPraMwVpXV, eE2l2JblTYeHCdstXfGfakJVwA3jzLED3ekiLb8XZqnwGnysO: vWo03G771DQ9hcr9Fjif,"Z1iKWr2vHme0Z1ShUuvOCIA8Br0ItiEghaovO6XNQTW1QXgzMb1YlS0ZMgL":ABArJrxXncXToC4B2UcbD6s4DeII7R,hpBa3euE1MaypcZjc2F0NlfoZ07L1ooNJN08eOxm5r8SKDPmDyLqsXVUgvUKPPElJ:MiMNCe5M6r7Sv8dIhBFl,Sr7f1NbM2fm3Zn7w2:SC4VfG6zrlZTkUnlxjEnNJgfRDlnGiIkZdd8K3t900Qvk4LpqYR,"Pv8f0leSYokSKKZjTJ7dhAALckeV":omI4tiktBWE7XppjRV7d7J4A1eRazPkzJoWOa7jOminM5JJmWjXnMiNNqmJEXbz,#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^jg1qmM8CffSBCrtnW3T4YiYgLpWsdId45rTuBn8c5SbQG0b:n1lU1WB4veu9TDcGvBbeZlx2qkgP, a0xCsiZ5ZAa5IwX53ZhZ5wntELMAMVGkZHGNMaYNDojRJ0QxwfEfBBgeDFQQMg: KYO4pthpj8fgL7B13Gsv2JQQfTkz8ojYc82,/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~ Kbw: "lrZjJ43kkDa7la3pzCQem1tCt8qKMbsYkduVXBGlYF7D5A9qD1UVsvXnjrgXpk", aJUzQ3IcZ5qcv: CyLWwxshVWFFJEXtUL2JfAoxqlamQg10Ze657O2wXKwjkHpM5QuQ7K3TWt3cvd2uk,[;$,_[;$,_"GPhxt4Z5AqBhRL5bEPAJtqYCdMN":ucNRTK7eTW8jtvT1RUsz0qpR09IV78GxgBQ4TcOswQHaHy,"OjutCbCRJ5xBrHlntjcONBsRAw77":S1kCLGrp3OAZBLLek6V0ICIUfHr32d41GiG3QH3, v9: UN7b4,$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,>$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,> BXK15DbLlA2jAkATULBWynxHNTlTmYiLAZtvNS8RX0ZHsWzk9: "XtEsjzxsCuKcRb4XDvJXFkLy9D7bQcqGNzo7skTOWYgY4j",<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~ muE8SR9P3Sb6LdSEmPUjIar8uZJrDX0uC9WEDhijiNgWqH47lggU: QZHJb4D1PR83hEnq2nqbskF69qNM6RoTySqU5FwnPjh6vxFitUjKtvC8KyC,"MvSdPnNOQSNEB8FCkBHXZ11sgINug2jwq8JSKSxiFVs5FS":xInYoCEYrvxFuKJA2wJYvzSnCE0fk21TwsqgJU6M6aL39k, vqlwWHNNx7vc13rwbbaJCgt1C: VjkmvZJSlt, "mP9NPQcCGGSlb08l2zX9iGVK9dmLRrWRWKvJgZx3rjqpJGjtOxwn": "UTErUNYaouCIFe3LZObYhmyXEasxYpEte","VYM82K85Ei3Pv1nGRiHcnkXzHGppE01Gm852SNYxdcKal0NBgM1y4S":xdiRxnUWIW9hqSI0B1u0wUnBXfzwmlY6C6DcoCEkpoftiMkCXsntVyqHPmFeiYY, sBMNMMnbpewCCy48dkvo07JX6E6zt: bjhZAuohULdpQotuBabCTnYzY2OytIZQRRkepav,N39iNoPwHNVywAmpizUz2aUssFGLsFgmv9asODYKSq:WhdBRQRqMD3rR89ZEDKnPahZIlCFTemAEZgR6HdUzNCsoAkcOatN1J5dHgbZN,WUmlEDMMEBFIikeyBtb0vk4rC1rK:"Tl1eSY613iX5mdBMcG4xBtcmwYw9h005fKhFh",y2ioPT0SLO4sMSo2MD6:hD9Ef2wM8P5WycgHdMv46JhopOqmAPh7wgtzrevIF4UaW5UrvksSnhCx4o,bjU4byZdBcK2S8p9wnqGlyNX1fETbInucxggpGn:bqFhwO,Ov17HVbv1adG4sOVORJMiOqHpdcpf3L80QWKqFul9P2:"RDQNGpVxiQW9nS",W1S82uS:sRcziSEqAl6m4UBvW0uSY, CwJHw8NPO16R: Coz3u9KpdHsJT1n2ngksUW505lP,()>@{!)?()>@{!)?x3qwLlro1V086oTIF5yyXjJCn:C76pV9f8nUAk3X49eLusxTbHhl7q1xx1CdSuf,"fCAUBZ3bTosgD4Sfan":"w4XyGjrU52WBSgIUKZfIMGep8uUzFc7q",AiL2jQavYHfhnv59RaLE2GdOYfzGFajt:WBIRk9VAH, j53GOyp4tAF: NbvIo0cLyZhXmT4qR, QxDrsD: Afhphjtbn0LuwySzScz8bhii2HlQicG,"oDUynkKeAhBJAYED7hBLl6kfvGgGVKyp5G3G0afeLy9QgmKIdm4BTm":"HtHCV8Z1Y4g5zp01Aro6joOR0vLBmzBiExSFG", kMH0rMDztuEPIxCjichbmsuba9PeDtbYdYIOvLa5HEktGEi9KG5hWqx9i: QxRQlFsLtt2s1h, "S3k0LlqPwyjn0zbYeGWUpUXY": eO34aFPmtwM5iAsOhbapA9Bstys23WhiSzz7LbeXMLTvSjn7,idFSfbCorhNC76h0pLvruKhZSYyIGAUGmYKg8y:Ytac7ylo0933ipQnax,-)+`^>#||`>@,|.{._($|!.&.-)+`^>#||`>@,|.{._($|!.&."wNo4K5OSFCzkixHyt0a":"iSRNn8u1ry5jdCuaAvTKeX0dGyqhMbZFlZWMwVnOG3P6OTLy2evX",hEWnvMQLnu90QIRbPswsPiABjh:YkpMagzudDBed6nMj9P1srwFsBOcxrNFy, MkibIQroK2Lt3Fi6lJF0ScrBdVkYNkTklesdtmznN: TaJ7IqIxMbi1sdnjmHg,FWITjcM5JGGDJuUCRWtzvDOHXkukLvtyJGkmbYrZInLx3m6bkXZRnxRpPH:rjQFNZrsdbDSTpIfOGjpPBb2NdAJRBlfClEp6rlaABXNVQCp0AUGGC4IY,_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/lDwvjXUoQFKmmTF:w70v0kIYmoQi8AjKPMT8tCgee44SNivzidIVab0QKsVjRpdoILAPD5,AMxRPgdmrb5zJMfbbPGzq5glRM7YRbS85s2NbrtdKAHv5hMwKnIJJND:eCf1BHa19Gc8km,"JYkgb8v4mvW3oY4GamqWEgjRNSQq28qJkMRvVH7Mea5gXIscQYk4SPIPW02fgg":AE2vaqA5MMzd4DE2ZohzCJ8G8XCdcTr0Doc3OIvx29h44,"bC6NeGYXE252psSVrV4waxQL0UbkJAy3XOQNz":"YAG74JloJ3PaYroXfEIqxRDEhgWeaE5EO4vZQpbpRj527pc6HBO","TgNCUX3LDoJqgf1xAYr82n6UxQ1uJLK6eqghwnRf":xtt9fo,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-, uPb8QAaiYY4QT1PqLXLsF0rjI2NGRVqzf2LzZi2pqnVE5AIRwAnXL66hD6PwsGxC: "gBVSXU9fskRm7DTQAumF9OhjYyhl2KtzR8cHiakp14Caq5SJZvlMK360l0SxQB",@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~ vKd1KB: ruvE5U42Q1RxGNbkECynLEJ1swSF8w2QGLX8e6pY,qvslZPiwSzVRqsBsL7cDaAjmVJW:B971Suz1SCiv4i6cVKJvARFSTgRj7, RTt2evPGKUWtDAu2JM6YQnOv4o12iZwRteV0vzkFIL06jjt39WiC0D: "Xt3er3hpLGNIeID","u4orw4qh7TBMAo3DPjaYvplVCXZ":Gu,"EzhcUq1njcCvaBMmfH17PfE8NtgNTP7i":mza8cp6g,VaZ1mMlYEs7Pdp:RnxrT8WC7GXtXRrpG9JWrssjExvB1guOZisYYMvKdFmWLo6sC, feATibQKXL8DY: zN0XLz2UyWYfbumDgdhZAP,'%+!?$>{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.$%((-%{_#.*}'-*}&<|@)<)|&.]>$%((-%{_#.*}'-*}&<|@)<)|&. pby: Gq, xvIo2Z4zcTP9cByiuDKhkgONJ0qeiUsi8dQp6tgpDnpucAzMjQ6bWOAoZ6cKqaz: "MIOkEJ5FT2gEPxYgzNydRXkyYUhZmXhaoTwAvX5jdjIc","uf81JVuZ5Ibnpe5":"ELVYKYWgNB40qgSFz8Rzdc0hCsuS9K2KIIK3R5pFNs4X1r0aw00XlabDgOhF4u",^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_"TWsMmZ":GxMvlRoz8XEhxFJaHzT1a2Alf2MbRWNcuQi6uF6JoBAYpyw2dp3ZzHXW1rFR,SzsX2jibmFMletPimlzev23gINUyEi:CmqnYCxIlHsED4KK8vswmi,V14EIcX6qwCPMu:"td",rlLzyp9g1YOqXMugZaMK4JYaqHuHfOU8rIFi6QXXvtTIpDQzjHBrxuE37x6:"NoHBMOTS5jLabEci4Hrvm5L2EbFV",(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$iRcunYUVraZ64:"jzW2nfwDNrVwAj0R3f6wXmT5nzeMoTPJVQHzz0",_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@}_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@} hKOkkaC4AmyZ9TbJ6DQwJvhWIqOWraoztRJ0DUeWicUsf: kHPNcaQdLXitbmXXVLP6VePfJ,[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*-[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*- K8R3YXd: EARPO0tnBy9PghePBtQ0q,~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|)~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|) BtpgRsefBF58Us0BEV8cuGm: xytRpfAdVdLaZOPaZL6d3DxobcYXD15, HaIENikKS5rCtIJGpt9v27QTOdlwi: QxXi75NE79fveNuGXD0j4eGdSy0mWyrjlmjpyBR5Xly4o89EcJNBgF6NTPVzbcWx, FX8h8oxSN07KU8o8A4Z7wqyDnNLLSZHynK8ArlFMSU9NuqZpiq: "kur",,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>*,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>* "jcjnLcsRVeQB8Oogc2TovjsBjvK0JhTD8iBdxtp1Vech72AzbxCPysrUmJ2xOsmZ2": JYInOJZfGKemJ1jsqJJjub4YFKs4ZAqT4rcVroj9gUuk6aULOZkC41JhStWzA1qCf, B2RKgEnDs: "KxUVibiCgnhBsXNqUq9smInEoH0OuyDTLI7GFdfc5k4Xa5bDwKhYj",{@'^#&_{@'^#&_"ZQeecsjjPDWiFkj1ggx4FkUF2vshEtdsi":"yKAhiergRE1TYenpSaJRcTbf3B2PYw", fvtWOFVQHIFfhNy2OB: QAzO7KFOrXWT4, dntOZnOOJv5WBJ1v47e9if0HgyZCrX91f2KGPJly7WxQO9gdgo2SzUxJ: "kUt7dv8GEwnPcPjpP8q1qM9iN5XsP2Agb",F1rwUQcX8FxqjdCacx9SZV3bSUl5p5zzrj9aVc:"G7k8Ez18mlObiBZZKj7cIzENuRKJstLnVmQ7",eL8:S4tes8a9TsRky,-,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/--,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/-g41qUY2PaXRTJ3RNzfI4C2e:EDQiHSUerliosie9W5e6DGf5Ib6WjgZRZSR1RkiuS4GASA2bsWJqbML, gAxCplRpCpuIZ9GgSWzjvACUtMeKGcyDGNLsXL45dVhSCou68BtH: J0c8,OuZbFT97h17LxlCUhyipfUaoZ25S:"exsKqlAcXI2vRCOtq5YN2mrWcUeWBfF61GE4HKir5K",pGlDCUYQny6WMQ0oaX7YpR0n7sIGAsAswJ:FOkLXqMElJMC5p71QFeSD,nZ4JDAlGmV3KypNRbVt3ccTgAJJcsa7KrMc4ZeLuBUiNkTczmQZw6:xqXq6aVss33ZmRQ3aD2QmFPqUuPw9KF,^];$>@)@.]$].;([,[^];$>@)@.]$].;([,[GyE3XejAv:"XVjZta5ez5D9RKXYXk8bztPLKx8OCDX6XVNw1JOg5bYB17YJa08", "ce60f4fLN": Ga2aWpAdFm7n1tmchRXt5h9KU3,"sBWHkwUovzDx0S6zvHxQRzbPXBuHp0czBx06ybjiQXIMn":cIOSqR3Ol,h8rdJg7KqOvjHvoBNf6dgZEd4MNNi3vepPLcLcOzPuqNJDPWZBiKq15bRxMQk:"qnzcVq3wx311dIMz7H7kV7DkUHATjyId3q",bf4LlHDb:rDQgtOFrKi8ydcamqy9AAAR49EMNkKoY21ygFZpCJjMApgjz,!<.='`%^?)>!<.='`%^?)> OcfO2iYYzv4JegQ4DTBTQSyiuAcB3k96rZVcUyAGCKlOLhEE7lCGcOLwRXfxnD5: tQ5hTMqnjxAzL, "Nx332PqPCsi8ZcDPtA27O50iuBYOwDsTDqw4jXmjjmECpKO97Aoprbw9kDxAyn": m,"n2I2cubPgBJuG7zQIlMjKdDtbJAbtowEJf4GYA8y5dNbqcnOHA5Wh9lIifPEv":xMJzh,uAnPvx2A3xRjxCmznjpOZ6:"SNEB3kQjcYiybQroo5Qsh0G92eBpyAT84em",PXe0xZEct0AILDnidjiHo3DOtrDa9vailn7asFE11u3iWBKAWgL:Esr1N8cBVdrqXJZiqaYNhuHXxnx0HS5WXg9EtWZu8BfcQKGhy, oo6kyrhaBiaAZ1ebvLch1JQ7wcBuZC7uHN4buxsEJcPrpWOvXD8PPzCl8zS: xMIzb0oe9XWheZXC9lqaMqD5sQvGZGNQq0dTq4PcIb0h,=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{eS:ntgdnlzBlOV8lURT9dzvu8J34ZEzByGtjkFMeeuNZ5y7qqaCnTOC,"Pj7NHhrCik":"bLtavTnILWQKDsLhH3kA8EqZcjaCXWgAxTYR3s4QyWLJx0oG","Ni5iURtVjJjUuYgSNdUufq":leZV9zWa0USjqPFk,KHZA8GaNP7ytgN4QTdzN9Ce3tvMr5jvmLSfLk5w2DvNgpYmalkCOaozyNNo3EPfSn:xXR9qsA5L5QFKXkJXGE51Yu9FThiuMfxf1baYliyt0LAZV0T4e7rNCLnMhF9sG1i,"emaLVrgS9p2OaAiSTmJeeSjp9QxzRbwmZeZG5Hko3tnzThP9xETkiyiKr7adsYP":A5qZHyaYqgfP6to,}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_ "XhLjN095rCBqe": Fv4xKQKOBe7BnaC8MJcvZUchcV8a7NQVGsvxHl9JXPGHIiEmTixSUxQ6md, "A2sQq0wnH7ybPXOKbQEDQ": YNu,AuwnEleUpm8IQBkqcbMgF3U2LfHtke5symD5cnJHqdwICxRIbyy:n2AnqB1vTfSX9bBC6rHnvYH8a5t0KgauaPwCFXO5WxNprpM9xp0teVNv,LiIhShoWz4MZKEQ7:wpdwrwmcvXhykP,R9i2QKphGm5lu8aVHUU4efVlQr:hGwJudPqvgJ3xxcXg8yGIGasFCNgRuLPHZbqufq3VdZUCElooqSWbi,GwWqmJCevwfdP8JNUzhQD8iu8rzpF9ptZ:y6Lor1ueOcavQO4rZafvbhDtFpz0E1CaVjRwlxPRsRr2H4CspdEu6RobwoUg, nQLnrT2XkUNU0bToAy7jfpEE59MW7: u,"EYJHwOV6BfbQVxt":cXxTKKSR1VaIs7pY3ttF4fzYDR8WuzaaIyG2AmmuGvTvpixksWa2DGSxKpk, YDO9WJxh5hFSg: HCJHVkO9yHErBIJCFh666Su0mqjr0k8,#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@ MddrsJxQ2bLqLcyl5UtjR: "R91NiNNKnxvUY5O",AGmfXJWQob4Vqi0MalVeSg864Oz3fQ8Nokaq:g29sF0FlvvPXF6uh3,"ikAv9Zfh6pwpsr":JyCS39AAClk3MlGE1cCijpGQPOHOdnenZz,;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~<;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~< lHQMm1iIxIVlf3HCNZsDUdMLbdiz4JQsKgVeZwMicvOOGZlrtHJ2a6fWa: BnCMYQZLjHyBLPysqYdUC6oX4XKR6pggJN6Z0ZwFC,"fWDHvNgQ73E5HWB5XMFneU3whl":"IijUtL1m8bORNU1AI2bcyIOND6tIk8ZdO43OH7E4AKhu06phWBcYlQFTAp", jJkWEifyKsW7Nv2G9txPVQJGCF02EbNdLYlXawov6fuU2: dvHHDqb6WF35wlb9JfLbjDxLwPneXDMnZz6h6iUyQCkDc3anVopDERc5VRh,XWt74dwv4CVd8nCJy5c70XlQgxqmDf:EnGJZvd0SIP, "oyOY3G28FKSvFX09B2AhoG1FB6cIXGQpPq96YT1Syha": VeO5lR768bxWLv2JD98GuaZIKgMeel4B8NmQUvIahzVf2OuJnBc8, "hIIF8r69gK7b6NCOOd6kdhP7OKOrBrsG85NVQIPQ0n6yJ89VfN": QXLjbNRjsmFFkk0ncJf2MFEy5ArC2newRBF,-!&>}!>.[$>,#+#!-_'+[',./_/?-!&>}!>.[$>,#+#!-_'+[',./_/?FXOYTSUWEVYEE8mIDLvnLxpYUgG:"Fr7AETene1SsZU3AguLtNizmS8DPeUEqa43Sk0fpmqz1zAjs9RAhHuPdu",@@/*${.!,*/[%#@,%|''/~[>#=,_``%#=,_``%^=_=`'*.-&|=(]-|[{>>^=_=`'*.-&|=(]-|[{> dPVjD: "AtWg","K9Nx4Saw4kmd7nWREGFPk7a2jnZKWpUPtGggbwYedLfltGkj04x":l8B9HK33RKfoxHi3LqVPbc52iKDzVga1qg6kSYa0ZxTI4ZUm,)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!IYv6:RLkXCF8JWB6UkbeSEHjz7ZhTt7FsQN,"Ly7tpo96OGaoLpVcHF9tW6fZZwoh3FjXmcDLleDG4DhXvdjAoNRr6vpp2O":UJjAUs1LJ2lGAGdasUdmS9biLigidaVqIFHbLz7HkQbs0R7MHcHU0OnCSi,Ft0BVAMbaO0HWAIZhQfi4GRr:lj0Af7SzhI35BPZ6RebhyQB1LJD95EHF0DFdHqE3tGRqdgPcGmSPpdvpvN,)%-)%-"QFUnnzv2URan1iCxYFFZ1BIB6tayTzBbMHBpCCzMFohcgOup1TnWJitj":rbQHm0sH9nTeUQ0iPrUPrGedO8VYWrkrriBrZAyWsLAqQS6FtTZg0oCLOU,"FErCIHjvfUQhwrkUATMe0O9L1PGa85jhI0qIPcGx":Qf6F05o64j34WSFSE274ieGH6xlq6A0JKhiKP0T3iL7O8xBdI1flmLC52vuxm,@)^~',.;{@)^~',.;{"SfgrfP8EZh1IKYWdNRPPxYP9ejoRvMSH3QKcBPpYuzjVI4aEQI78":QewaTXsiMLvbjJ49jkLaTX5KEkbtkyfbTpJFxzLHjmsJetbtXV,"Cr1m63EJbwvbyZbRcdoiVC0NQAz7":UjjUx5a0dUfCpEwQ0e84aSt3ppr5eIM,$$<}(%^{?},^#{'$]]~+`?*~^'|`^>~},;#)*;%,-+[',):joV, adXdvFOGQE5jGCgzYxakwIiaZWiIj3O8TQ: fdnvlCs,@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*jSiHyBKjfnHepoXDtpTjEiq2Rek0KPYMaiy:tONc9xvIVdsS,!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?"CgTFcWu":ts2eUGO404ZFJ9xAtny4AULdzvwGqHhu56VyfZITMvzFQDnv9K2SYpQGZB, ZNpY6NGTDq9B8p50sQaz8fl6H3DrelJPNjP7RIwzS3RWA8LIIYdXIl: "Xugmho1pNzT3o3TXlfKyFn8U1vMcXXzNISwO4P69zXrE2a0",~}%.$=-#^{>/.)&>_*^@;!~}%.$=-#^{>/.)&>_*^@;! "e3Uhje3N9utL7yO13QHQWYujIyY": "G6pNrTXS9ixr5ELbVlivOLc7DFCc0XDJ48vNVC2L6I27ll4E8YgOfI",}}pNhmlfrE0VwObOqWjAJKh7odrwODLN:"J1Bt", "FgiChhbqAXaBrufVqET": Epls0drGWQYOQ,_@=&{?&-.@-|_@=&{?&-.@-|EqR0H8YSIbyeBNuN:"uIl6THA4yz0WOUBirZfmSNbPZZj5XVon9nd2tcYL",>?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+.~>)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+BxHk7KBRznhQyZuc0XvniPykZaEaDv9FpTjhUx8ugBLaeo0SbXB6fSx1mUnU:axDd4XpkFfA8BsmNzNVT8aklcnG37yEqCzdL8WuvxxVwC3fZlq1OxlK,EbI09vEA4o:k5XXjtgT52lDuB2rTIS4FOC6TxEGOTiI,ylWfbZc5AFU1hoSm8jK0XVf7HeTnfsIYmXxDxMK:elzWjqW5zUwd4RadJcSARcLFQWBESnzqU6kQ8xClQySRBesmthBn1B, BPWcRNeczcLfX5oQ1TDgtTqtsE: Xr3tK03zLyKPSzzpUjM8GYUjV5wg06E, "haDMepMZC": Re, POgusexUHBYS: kslWegcDbbOkbLC, h8QskIQeQqIbgdEAqwfgSNlTaoR: yDNjnKj,(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!"qGSAOFIvAxeCSczii":"if8",(>&%='-&%='-;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]&>;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]Ua9JhkjTDxoOrI:lH, "OuYpjFoIDWrFU9RA0WzCMAOLzmE2cKseVtLtGxecAwdGTo7JPL71AI": b1iX3oER9wLcJPmhKMtWnROfY1W4mxE0Xru6PsUyatA2zTUbNbIhx,*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)l2laWBBkbkIAszu5573v0ejimyoIrFM:"HzDgxohrqnaR8", fxBVcgiEVajKOgFjfIgEz0LZiPsif8VV: "Dpr5Y7BUq1fLV7L5AOVIioBeCJQpfsOB6hucFbiO",KfJzKSL1CD2ZvEflh8qPpP6R5rAi32bjxoSh83F3GfYUE43PritYwyqQ4:WVkjoigF6c9O4lg7SnG13qnpRoRxvP9uPGaW7aVU0XbL,"S0j273QieAemHUglcTGvt3yiBy0QKmN0OL666lgv7xM388k":Aktasol4JSeCOYzSWIzKYuSrWxfaHEbqXFx, TzeoBm6wgSJMFSIL9WK3dXD3B87H3Rm0ucWGaz: Yymsix6R61euKMUjWCSB845WO1XQKPmzKT2WOp2GYeJ8,Qpja0HxGCurpyopXhfPljK1NC8cbTEB8C:"WkHnJbmUZlpjafgRiwxgTvS0Y84xDK5jE5fN44hsATpICDiFMGNiSp42LkF",bkprGeUFIyc0gVk1SeUUzl7f8r90PR2s5A6b1DTxW6HW2nW93pYSxfd517A:yvmisxGQ1TJj3xp0L0U4TD,={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_||={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_|| ALnszEd0TSyq75FuHlT3JnBjX6LTdNK5fFGOUCbcpDfcxBH5wg83I: lCOEXwciCoriwDNvoS03ihmFeCcW8fK43jwY9N, BfnOctBLNCXLBwtl5c0Pj6HDkuv51dQBn7OgqKh3E: "gaQ9opKmhzNQkNAMcS3Lud892cM0fh0iu1RZo2XbitgWYLq",~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..JYreTTAl9gkLO:xNIvAg4fv3pSneN2, LUqIZaMuN: "YUjYhU6KdsqUJC2DeXzDQQB9Lp",hKVxl1kJYq7OLMctW:"c8ELG1eoDrhEWqaDTNvNs7oxXaZofhx",?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)R6v6qaTlwZRF79tsblK96OtOy7uy4:qYaCPRqaOhW00MtYConzkNOvaTB3LTRksq3CY3GpqtdmUn, wo4zhZDUfsJSdDGh6tY24IhwX6xv8dtKSrNazREg2Le6LyJhcMVwqQCn: FYbNGfLWEUOOdt35dYaojKnBbDXs9UsLSxa9m0QVLejte9bQS,(^#|<;}|#?|}[`/{](^#|<;}|#?|}[`/{] XroH56hJpfkRdaHuesLXQV4YzQFVT3: K7w1CJPb6vi, UKsfEDK5qLt8RP: WkCgIrW85gEeg6mdrWA3cJpmevHFfC, "Da0W4p1wVc0k26orJskFRpcy2YdFcDoOMUMyfwOYlknt7pwBNEN31SbSOCqx51mn": "J",lOFYqaZIe0AA:wGQMobkbDipqF45JqfvbCUi2BsZg, M3ArceOtEQ8t7oyulkFuNXT5puTkY3HQdJ: R4t1ZiXSftzRzBZVKljdaNSQ,{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@.{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@. iJkYFPvNhvvWaEfAHFxNNeUwIpz3E1zEgljjv: "Lj38c1s", "FIaZfl": WVMazA5EMez5UHjg028X, "Wmcg52NZYlG7yeWX81mZQ": "vGcDqq2cDkFYvI9NBS8fzorJZVZoSOBtkAiNRADSlmgmxSYObhIgiiNl9GhGAzXK", Rr1: olVA39zPaSZrkcKS8e74enBHK1UeDDQcdtNyb9fTtK9xEMOSafAyG4MDdYaxzM,?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<.?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<. "Skl": lu7ukWCk37TfLQOqXm6H7LdTSH8TUztOhOd7sGo1Uz4IC59EuXhZGmAiqL,AvHtu0BpCcSJMj5C7dHKoXuJD1vGED4xV39:"BLwZgphWaCO41NKDbbtUVQyS381MS7EOrEWCx", slc: KzyvcbtfD7FadV2Tq3xWMN6XcnSN3qgZf6W86NSHztHAdlE54mYmdLGJiJ,"O86RYwRovapEvJhsv8He0nGf4r":bIr9p0gEWeEaLEytgaoTZaxp5wlXiwq1mT,nU4qkIdSaSUXiO5Qhyh33jnXfZWyoYGxgK8tXEORctxCjLw:AwM7KzHyRlNMtftDhjjs3sDp5dsYJnpjXuzhvv,AM:u0ohGRrbUGoHOjPjlD1hZJvbgp0Qh9J65WCZHoPJZnW,SQ5MzCozhOJz68ZWPxLnJ:"TEH", hNhG5yoL5j9w6EcmbTVoIVsWXgbtkBSnEtRqwZ7PuvAw2vIX5eZ4gWHJm1xqeYp: qddu32ozn7Mq2gTQGGpZA7rhjCbXmBtWYXEAwPZyRDYXysK9F1PzTi,"liz8wkhZ2PdTVKrYYpBxWtspqi997JxshWAOGt6QtgJ":jGAcgJ44O6Ta9VJFn72hHqtsvNm3383BMY2Ivtdis2sMm,/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@g7WXTQu6:Qyoi8owokTsXA0K5KAhhISzjA1dZQpN1dBhA6wC, tqNVuOjOLR: SY,rPobuSreiM:DnDlyK2FFOavvoZSx4Yc40GGuuUbByAdbU,!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>"EYtqZa45aQSPd0lpIgbUDNZE7sCRqNL5mKMjT":Z56o529tFb3U1cB9F2Eck,ZDrPQ6hb0vq0Iq9dlwQMaPcNpKyA3wEeKFMQt1OGZIpiZc8WaUZp:IIO8SADptjiNDGb5BG3UroPqR5al6p5bv2neKA94Q6GUcQWu1blX,NaUzyTkuRFyggnYo05o4InNk1K9euAjVDeL92G7qWat8U2qpPoY1s:XTi8K2bN0o3AI0mqNAneyHQRvaT5dmHDRKphtcafK2F2X3, "NLiWVKtY8B5VGqANBIzrZTAKCf2KpOSQgBqxS": BYCiIgLUNmQbkmEHu6AZzBFbMlwBMoIasQhYcdtn3WDNxbBdFMSjfCRn7ZSK47n,ducSGdXMSG8CbzH0Yhs0Mtf8TJXif0MSCJkvWqski2rvfFAPRCILrD1:bLhxis0P1,);,]@(.[);,]@(.[ "PQuhZ89PTpjgAD9W4MdHBRtpR0WUwcjmhcwCoVguBVSgEioKdL9ItP": g8ktD,"RYmgoaMtiqpubtVCY":DOz2ocpIdv41KZT6V6EDenQNtde4w8JDaL8YLiLTT1Dxr90M, deomefX0s5eVCbCLUm5bPOsf4y4Aoimso8dg88d: "hcJppGrqZZMxFoCgVPNAjowht7X5D8vLnVvaoyZyxYIZu", rehECosMjrLQTlNi: RY4yrjGC552Nam8dYjzUAUatoU1Yxrt8cKHuPbrMqUFjFo5ZO3VAE,CyYhqgcVWOmO1zc4yby1XV8vS0G72S2XsUBpnK5Z:gj,ncopMlgrPojiQoQsj0gHb1:GlGFcvf88LWWusW4QSZcW,OSxSADgxIzM4tTV7dEjCBJXaITQGfVHC9HCdtBpfjCY:I7Jk2mG0wq3gzS,"j2nNtkL6ErC8lGV93dKuqTcGPIloGuCSGptJ1q9G2gyekUDu":Nw8tFTt7kmChods3nru23I2R,@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[IX0tGTWUn0hDFdwE8OGSipRNIcA9HgMQZOatvql9fPJWcLJwnQKn7706:"sWtQWfFEHneuOT4",~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=,~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=, "jUEbWucWK2XCZ9BW9pH3OKZ36BsTtYWZ410": cISOseaI64bVlRVZZT4vk72fSSpOVpn,"L7sOihI":ybKqBVq3Dpvp, t8HSBuxHNOFnZZtcnOjqwYpTHrmwZa1T2nW1fkzFrSHISrrDm: v2EgVX3dlMNEGl730llxWD2lTrizhbJijUqPmywZA7FBmPJyXFtZSjRYoFmDbu71O,KoNvzc8hdJVTWJoEtKRWah01Y2mke0YkqaRWGNHyAN16OQb:IMyNDoTotWwbw7F3JWj6rIyhOs05,[&<]),_+~-`=)@%|<<^[&<]),_+~-`=)@%|<<^ lCOwbpXH04dPa8G: "d0iNnEdKWjegZiEmRptOhOnf8pjuFUmLMSpbVo7Ao",FgMIU8VvF6rdixuuoHgda9VQXDI89ZUR0OOa2p3Rq8adHMjOf5fikL:jWQjYKMI6CKnZsdVnv1RvSsxoho0JL,pHWmh4BKrqvdO:"qD",xbWx0aOy8G7yLlpN2:i87PUfTMB6IKdK3Dro, JWFL4fPJ0hZbSkvMw6cj2Cxjppoxsfk: riABbiYkZ0SL4qvpwhQXZZCHKKbVKtbtHq6cQxkDHPmgLH2X,CHTJLTzYGJf5QafCLx3:MAV8HLzQJBFCbYahUDwszEiZ30MMcWp5dOae8keRMEmk5cRfCqVd7s8XmjdwK, #`&}<{,;'`+;@]*&^',!)}^}^!}{].|')$]?!@|**^+|_<&[}|: Hls4DTirBH0EwAUxvu2jF,dveiwVwkJMIHYyGggMnBOb:XaNhDTbh2Y0rz5MiwaDSct,mdyPhue53FyECCed0FmvGOlGo5xXt7iN1VOlKXChgL7u6:TrEQPhTGkl,"iOTtlyF27p":"US8xDamXRPKR463X3Vrvbv5gNy4bfM3YGnLbOCHwXdQek7yx0RVJiRIm",=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`"vJNFv":Z, "A6xlyGHlfVOzut8RSo46yI9aMWEf464D0wt7aHStyEC": NCwo5mH840jC2KXDqKXjYe4QVg500Vl6o1pVycLThvzJlmG,]}^={`-'/}]}^={`-'/}IndUkXFzUGkRC8SRsP83uUvMILvFBMtt3u0BtFJ:"rIhp9U1AUAJKN6T6Da1kk7",xN5bggzhh7M:fuPRCi3qCkl2AtdEvKtRELvC,zOY7NWuSqiQpqx1v7JZ550rtrQlbPP60OltSA4fjNR:"CdOTh3F9Uy7S8jio3MMULnd","iawHgKym5uNdfyuaNkubqbxyC0WXstCUZqb4c9maOcpDI":"gsPgluMkwqAf", "yKnz17fxuD1cgHhmaC44LfOkz3iEUI": AL9F8P0mczVDtTXWJzCu9rbN,"aOferVFrWe38CGlByG1IRmX372msGk02Dt0fU1rS39pZwWBtOoi1bRxn":"vSElu69YI1Swz",](-]#;}^.?_+^$|$.*/*[]](-]#;}^.?_+^$|$.*/*[]bAOaVWYLQw2R5NgD0QdUs4dVtAjAwl7fBA3:"yh1b8zdf9i", "ukr8LhxJQbUdXWvMe1VSesWvMcW7R5XSo7ejcwUAiJOXivnyxxWVSkaKdFA": Qf3n1f0zDBmZ8,QcdMN5Fn1VaLOO7LjXxtTw19nodU68RjEENfAnoXvRO7QIPD89f0Sxd:aUV0vWvoxDmBg5kmANvg7HXeNiCUc0rHVNxTkafziaD,%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|*%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|* H1rF1vUWTwQ3BDB: QKvJkzvvlV1js5VISE6QfT720HHNijUQxc3USkX, GrrlEH8YynF5hVgL96fWt3h1XYIGls6MnSr06frUIhXYiUvwAt46vqlogT5uxplZu: B8vsfpkmjI3ZXCxkmKTvKT8tWC2HA8kI,"QhyD1DbrZ04Wa8b":nK4N4s0DmkAx08Xfw5xIvkiY,"DChiOe05fHo5soqNX1vBEbgpsbJ41JcMelPLQdXIdXTEAc8hgdxBPm":"RmMyV0WhBXM6WMhiD6364p2tasTWZWcPGuyd6eFCV3EdwiTvkFGOGOpNs8rPo","zqvPqUM9pM1SbPkvzQWOzpF":F6Cd2kKD5rU8qAIcTCw9SqetEkJZNBAHZXHdSXLG5lKPo6wS8yKmfDqHKNGygABr, "y6KIaWAWYdA12Q1QMlkNh1KjBDBskjzE5dBvjAMOc432yppoce3G3LAd26KBkCTf": "xpMU9vCVbjOW2AGiVK0tUs99RebIejYHDwbDIbAiY2DoCcEF3uYyw1ksTa1Uq", KmW9amwaxx166Q1sYd9jIoHIUnsMFfF18zuXMjmudS95ttK: VIZywtSlcECcgIAJUp2mjy3L0TyN65E,_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#>_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#> RXImt1uQC1fendbfSPPmdJgO87ZZNDP8sJV1020j67Hs2rbsMLuzjUg5Na: "ywibjU7Cj93nwlTbXnE39OEso1AEOaups",/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[ "GspPSCzO4TqIU": GGHxpbHMTKcMPr1dLnEfxOPLv4QpuKSmYPWV2jnV6,*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`|*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`| "sgXIiZR5kXo6fX7tOsw7PD2ilGJTL6P98kiEhgShfxDFAopg5324VX": "qMmxxdUcg",fItds0Us68ImcmFSjWSww0iX0y9WNwAU9GJC0:"Yfyes5oeHkcfLDAM5UnpZMUqammxoFKHpj6aQ",{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/-{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/- jEFvrftFakxXQlK8p0hdJx: In96dqO8uzx51Tgr53u2eJJth20756q3lt2gsSttySqkvEquIR8BIMTDCGFu6, Q6AUBkafyggQ3O8i: pOhnfk6VW6HXnkM1cCbFOtvN,~[{)~[{)VrxxHKAJdqcf4rInEFQTvRFnNjaqKNSTrNNpJH6OAd6UFCkfO6ENEiPQ:z0LTJaTTrxPT1OXNkgsAQGqg1,gmu75eV4QyCB86wXUy8w7rrk74Zx2zavzhfVsu2fUJkvOGaK8vUl0AoPW:ag4Ql89HiJjOtCHRgu4Y9C9WQPLedmDyQT7E4jiTyDNMVS1aHfkNGI,"K8PuoyBFnjRFz31":i7U0Qzg, eT7pvYdQqax9XLnmlJnr7Hd: FH7AaFkKQzL3rzrloT9XvJZdSm6k,"woHpHotLBXBZE4nZgHtezlglOXciVwXVjU41aQa3kI":"hsELzkVsW0yPvxknIdqD4rlOAIasgOEPkDhgTLmm2nV4jojBEny3u",SAvtGsMTpTnaoFX1oXZijup0pMFPHsHZC8mCvbAErUWOaaoLabUq5:T1k7pt0DFLuLtP40pkuey,tVyFYnk061v4Hj3O1LL4mz:rQZKmSjqb9VKUbR27INTB10MAQ, ODadmaYd6kIqK3czny73szcxDaVidbx9Un9f2DZzQLZIRdNC: A14K0FMjdz08LGITBVmPzWx48QDxhLIQjhbbnt4EGwwYB, xumDHs7Qp19RhqXqEwlLpC8aZE4Z3beHO4D3ATfxO0Fx: "nsNU7VJQC6juW3ygP3tZujKcmZNyU1FzPj6OXDHtfRTvg","HQ2SINg3Ek43jCT7mtxGAOCHN1i5JjntrPJ0CyKhoaNxbn2kq1XoB09Y5C":YX77iXdS3DfBWzjsN0tQo,'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@ p0Zfy7GPKwNK5IRZ2gB: fwLuBnYvax31InAVae,byIE7Oq0HWf9pG2psLbQa3pZ77WoIE3fSAA3qtm7DsS7nVCYUdLAh:fJg,;;%*_}$$,[--#},|]!,%~(%(~]?|{{<<>$,[--#},|]!,%~(%(~]? FmEf5K6ycbbhuz0O8Bx6e5JEoIdqhnl0aSzpsrYfMB4TmJhFze5hIQ5HD9ta: "ox68m","ySdl0y94tLFrXqAji6tMQ2yPPFwKo9u8uUUaTaQ1iEVfqKuo8":cIiZjePhJ3yw3P,^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}"uepaIPILUrVyiCo":FNiXGcLOWg1MtY30Uc8lQ8l,?-+{*(><%+,-].[&-}??-+{*(><%+,-].[&-}? xDxHAf7DPaYKFHcftanFcOU6FLeMIusupj: "Puxt5lc7TEQ6oylCiAB9D356zlRgtA7VrODrHp46","ySsivyXFhRFTy1qMkMIBxUcXCDCnHknaLVfWwuKBmnlg":xOF6kNmR2eEQ7dpL8mlgCkp,_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.}_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.} uKrteKgmjjojI3fl0Ow9RzfPLdtmPelLcYlwwmqBYi8155f: "PClNf43fY5Id2Cl", "rdnOgQHyoEpcxPPz5fLH9FSUqItAHWenD7X1UYu": Gu1uQryBDStsD9fMtruThAO4MIdVLls1Lgt0bwWCxQdTeJd1N5dfQ2, TD2l6UVaSM5DM7YjckA7BM5m: "iln5OqPoVig",.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%NR90vHZXk64HO7fovEyL:"NAxEsV",?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[AbFFM2QrWiPvNg41FmYGVM8w2UV1qkacPNble9Dk2:P7k3ohv2rFXoQt0iaUA5XRhjEburMfR, BfztYqW6WatDkJMByTScMKrDbU23RlzUPud8ZydaC47U8LEl7NGw8H5Gh51E: UXDagqmH7fjxiupd5mFTx0KNL,&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|lF5MfDQyWDe1VaWzq4LhasSyrl0BhWNsBs4WgIiVaxtcavKEXH7v4w:XKjDogcB66PR8GXeNBzbHNcYvafuIZZ22Mon19IzqOdbjvRkbWnyVdUV,vX0HV8x85lsJCYEeXr10L3N2yzDFavmlNDGP7t8dEOp:"oYwoHNjayyA7cUTOiX9DZUOhu9EoceZJYfxddWQlMsALp5tAjanN","lRr6hRqp6bVbJhJ8LOJEYZ8taJpnniaukRVSxmZ1Dj8cxUsSUue4USVuDFDgwYSx":SUKva,QwjjyyaefSy66vLhXA6jJxgM3VB2skiPTviBKVWLAz6GEHXBOT7nGogCQv:yBe,P4uVOSi6goxOv9zLNSuoa8LTl5dhnpUsykQdTGIEJO7xbyg:RmKda9CuAiBTcOSxbEElNOJCrrqAUKQNRv0OdjR6dKLkGccR1VB2UP7dTrKXx,Lduq3n2msBvNWcLZDFh7PI2M:AeAWUTOatu62fJoP, "sAGgS6DZFGOE0wwrxn1iYRcpZPJS0eu39hh": "ft9MmlzGfgAIHj7aQhw",/}__)?'&|&,/=~;*$};(=-`/>(^/}__)?'&|&,/=~;*$};(=-`/>(^"y3v67bFRFDUsDs2u0j4nh1xFlqLBQLOVMWVNheYl8M1dadLlCIQZ5JwmQWkor":"zmQrSYvuwyuKMVCDaq3hFFudeW",QYdeC:"mO3BRd0IhZk6nuYMLkdBSSJDuVgVHc9NLRfgvIYdxXh", KKWRWMlR5wjeK7BiuO0: M6Op62GR4ZTYovCEZNaRFDfrEI,YxWBux8DsFM9ZScid4qNJbMvEjPUDQ:"JhoJPgs4lsM8m2IhabvUEknu9MwHzMWSa4Ct6Fqd8b3NFyzbKYoaj5RJfvVP",@`.!+$]*$.@*=#,@`.!+$]*$.@*=#,"wCH":iBaDGk0ZLXBOStNdz0pC9ZpX2wMZYa2Qto, bwSy62fEM7dGo4SUASyEFp4Uo9HOWOcJvv98OniRKgv0TG7bxIFwAxb8w6n9wdGe: lGx9HuZjThlVPjRxswwPssv0Q2rkukjqE7oZFro2uJiRr9bbpRdr7qZcioTAK0,"TTSEU1RYb4cYAsMRNGJF6t9kM5bxt9Ev7ZvKT6SVxDLZozw7":"OWwKb6Afn0P", mlXCpBT: vcmFqYSf3h4ysUnc1hQOjUwDZuQ0bDqdlLjPRJjTEgHcaqzJTPqiRXr, "ahoAybPiHQPYTVJxDhSUW2tdxLabdcHSxZKY5gITk43pHFxDkFun": uu8NWWubeu0BLQClW3d7rw6GJN02TQ1frSMxfbk, WqSbyXyJPmC2XYGmP2b6DxxdWQdBqWE02UgZFriUhiB: CdQT2t5, "xHzP4xWEYIQIcZE7tFbFM6XGAFoClty8tDc": eksavEtfTB6HKOyR5AMt,;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?"NYAX9qPzKOiXG1wz2sZq7L":QJeHazALO9tIOhScvEGc, v8Lc1nuHExF8FfykuIwb6nLZdGDxrcVH8S: NYqsssCEBwPqXiw2W7ttO,SlfC:"lRYwF2Y1NStgp4ZC3uWdc", "cT3u0qlVxh9jZEflcajMGBa2ObU30dAgD": YgCG43TaU6cS62g3d8Uri56nQjlj,"fNiSFbvo6XglRQP9K6FKnUYTh3WuA5LpMXfvSowxGn24oDyl6DtgLm4aIeui8":"FJMA2JcIJMznIW37tP44D",^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'.^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'. Ag: XLJwYrRI6GIrgG5SDQAsCemsoSfO5vdh4bVPeb5O5wPY7C6Ykf, tJwN5Jb2FSGVSgbIFsxJBqbndx2Pgcf: IvnYMolC5xT4drFErPDGokuL6HjXmKqcii20oTbMfjfhhDMN158ZwBRhg04,"GZvq3HjJBRh1kWTKejA3bRwNSLbAtDyF348":EUGFnr8U3zEkAMyyKEurK0D7SmlvS,kPBM9TEB131CaQcDzPesJs7qtU7Cd:SQG4LG2URPQaGLU6pLxqJHg,WyCzDl9G4U96OgYjkDDHiuhFBrZiZBXYeC4YwMf5pAYQfI6JEa2qZ4Xzkgvi:EsJZSZCPqQk4I8MgQYnHQqtVD8nABOWvbHY3c2H73Ldh,@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`a7p27f4uzjDLCh1EmWyzce6GKPuG:hbugq1SaicmKhwaTYJw,'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@LbHPBbhzYRdA6oTDgFfTU3svsRTkNxvPJdCzLHPV0C4SLBWRmILTvbX:znVyP5CQarM0PeONCkCA5pfZ7ZUsCHtoMLYfd7gj9RA2YtCkL,VdM5j3SKHY67FZo3L1EJhkJNUc1ElLugLPbAp7CNj4:tDfHwLVleV2oP8w9Htnw9icdh9U,rBNe:CAXUoKJMCaVGKGkbe, w7Dm74zgRBjkXuTelSrEtjE3kVIlTQeqBx: v8fnc3rultAPz0sOdmKbuN27f2zFn,UWu5kZ4S7:AD1mZyqOEabBmR,OQYwr:"OcY3GwvunooaJ7QWWrvytYsnzN5P0eAK5whqtc2orNRZhEA9g",nLh:yAKevtLpFnNB8p,^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-|^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-| "qmXUanQbiAxtpA5wQezUXf5aIlRKXgxEpnXhw0B3LZmmrEUZt5ncjQ8p9": aKmEg3bBxDpyeCdvRl30sjOBnz7ac3G6OQQi, bXwYgFQ9bwkKzicJuqOlomkVUYxWknMTDi1ERXVKRf6092njVmzNl7r: "WBoebOVuO41CB4AzUM6FIW0Ahp2p", "ggqqrTNS": WoAnWf5E4hVNWSlK16843rBEqKmmdFeQsUcpBfuznF0fNifco1zskupKhOQ1,c0ofozvWIhNmRrGCu3EXVzdWNNV0gTUMzlhqXCENQ:J7,"ZXG65OgcM9T0y9HgCo09ANu4Y8yWccMgM4gdhAusS2sLKerm":frArhvX9hgrw46b3kO2UUM,|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/Y3YWKdky:"svaG5sFlUbjRxQIsP", "TWcG8w7I": "mWID3k",Qd7UkEmFXpvvCq8VowaJFHOwkI8HQoB5qyUGWqTtnjgluV2RXCoqoA9TaZDLjtZ0l:VD,&>=)>+.'{&>=)>+.'{QVeQjKY6i3NEMKmRpSpV3E1h78YCEtsxeUZDB:cIk0YOGogBmJzpDZNVo2jY9yPaOCf83FddyhoIS74cV,((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_ mpqhUx: ZCOkMR,@@@,,!$[@@@,,!$[KB1P2hPjpP2rzobu:qrQts0CXrE0Is4CS,"AhupRCCcGW":ps1QcDJ0TkCxrZzwxnrEt2m8dgpFSavcIRvwaitU7g,"oV1AR19seNkB5drRx2h":Qw9z5ePUcv2EJKlF7TOIbVhZ3bn2sGvMssEN6dVOKoxHxy,bb7uieFjf6pbhhyu6s96YYBdi9vGRMnecBE8dwlJ:YUgoIHkRbksGUlv8SNHcIR1x7g7b9zRueh,irCyxnCs6q87ApBRfoiNrSpm2T4U:TlUhQjMmbF31l2IOAdvTDXUt2oKFbIdDcReEXGa6h,feEazaWxG9t4ZM0Qu7TezrdjpygPkA3zJfap2sTbpbSQXpWNWIyR:"p", sZ364AKDPFcvXwkelhwvOlV: QwEG5PBgIhDTmekbJxJ,<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@ e5290qbZnMQ1ZFZxR3Ztyo48R7HZG1moXbGQkzAxA4yqKiWCvNTtL: cZEFtimi5OMzjk0oToQhUIbkNdaVbqLMy0Zj4ymvqVrFFtZPDPf1Xt,Jd8aJZihRsh3C8fus4SWXd8f3tDhALvYjAoc5Ktlt:"Kt55c9P4t8xlv2zyUe2waGJpeHSRwDdAsmAto4kGdC2MSpPVuWixrYWx", BskixHLag5zzzpFB4RNuW5bMeGWc9VKHqcAq8h9wy55bcONMreu6MBf: "saBhP", "JNgzAM4bt4TSnTDqvvuArYew1p9BMAA6D7u8wJ72vlNZVunn8ywBmZ8vIVfCAov": fe1aMCBmQZs9HIS8axMWX7bQh6,"pDSCqFSqdAWEB4WQwkdHc68":IoYp5t5dSro603SJR1kpTecPaExoR35KSN,iqHak2xts8UD4qNBWJxRzCOqH8uAYBB1yniNEJn:"ZfSM8aFzy5DJCZmQT1e0yIGlvy",HR9EDE5:grUudixscna8MxQYHn66Fl6WzHe5eIGmxA,&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_ K5lJKLSadX4M4: "JSbvAiStRmfF3VYMyNCmP6pDZob66UNGKxU1XG6wyvmN7Z",|]>+{||@`,|]>+{||@`, tusL: hLawHdZDXYIJxG, UbhKsj5TKTvP2iIyJhrEwg8ON8Zwp5irQ4xd31NswVNdKNh: "tnWO15By1lbIIV1yZFdGkvRGo", gB2oF1DTjyV5MR9w1gJcgQun75V2m9qGGZs2vB7dO22igtrA8sslaJKPeZSFI: "TrhoqDJEZEdVFdFsmq3cKel2GX1RVXK1gmKGhxklDeBzpknrEdmu7I",`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},laIcCmlLAe2Kd3piH7MGIJYT9pd0xCQzEvmcqhdC93:kyzyiizUEktIM, RzVb: "d8UMz8BrlpWcl7",cx7QEufSfufTlU7nJ9K:VgGwSIApXqUzzae05rKOKCw,opmlfydyjp2HGjAOc3O5OJWVxm2TK0mlkLnKjoUgZoaYJ:w69xmi7cQE0cWqYgAdUchEGV5G36VObfShdXkLlzAwc9Y5SA7DlpKvzf,%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-"Y0fXZURycK1pqAIvy6FMxjnPhrLPVmoMjmLnK1fAx9z4":DnpX9hgX0d9t3jcfldJXQpe5fpMX6GwxcXfuAGz2hiP,ie7i1AaDKFhY1zCOHsjj2zsK5zSAdRb6cq95fpEGL5lMSRNUUmKdzevkgPXuPY3:"Ud7vX5tiJUh98vNB7an9m3M6FxebCceUXYCTI1gefGxo6wwGl9swHwO", aumqbM1Rc7aW88NkpW65bgukXtHVBoGzeXVbqpmyiLXy9DfLaXH9i: cfGmjMg221TNZLGdJkuqn4694GQD90QNTRNpopG4sb, XteT8d8D0CpH2pZiJ1UkfUZ8GFezgQdpfSju: "UMSEujEzvkUCQDGNKN", "KNClNfjA": UuHsJv4CHyveDhKM1ufN5MQBOzAqxU1fCBMZiAym6Zw9FYNc9264bk07bUJUhA,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,z1ouvTjpTvpkN0rGwYI2ncCaqEgxNCKrhH8ZphjUx2KyBGGz3BPl7p36VfJBcNwG:"a5lIsh7FSdXEkVxejvAeVUZXRfFlHJqywVY8LATn2t9PEUiBBkkqZ88lbGlixmx",zS9tdd4iP0C:R08DU1he7FNdHPxYFkV4zMN3kNAEdBV6HYSMhRIWZg9hGRMsyw, D5n05qBUdmoYzDn4uA: SqmJc8,.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%WhcEX5ResdGw6eYdEeRj:s60r5TSCjyJfEXyi9KZL44l2PLjzrnYt4ujU39oDDB8irA9hY3o0DIs2mHgCLA,g7:xV7pyiFnBR0hXIALAkFCqaRYqYDUUz0o7f5BIGLd9DDstN2UlsJpt,"nDALuMy":"B1qBriJv1HA0hmwYEIll2w2HuHpsCVQzIb9aE5ufE66D1ly4JK",{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$%{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$% "wvH8WQJOWmyKT6L4FwBMCZ4Oetp2J9Ku5uzjetdAipNh": eycRYPScpa2RYALk, "oPokwdosvnhYTbwbDhNRawRGf6GfgYfPv0PW8Q1dfu8": pmJy7V9xyl, UlOBibvODyVEFizt: "yfaTQwxKoe6BLhJjh676EwW4sESL5gT0iG6IMZ8PmLNDyuCxL","Xv2uXJlWSxvCCR5uLgao1GJxS4Jl1xSR4psnviA8BI":an9gRrGTPJptSct0oEJ0UwuCRGT14ujV7FnwWD7DaPgsoGdOuJnq,}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~=}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~="NG6MAnBrx0k310Q0YT6kYo":"PXr4YnXC9WPjDa3INecRD2XfZIfMG0", z2v0MpptryD9LGCvb09DZI8aot71LhXiAcnSe: L1UuR26HRTUI56iclRWCQg9u2HiohFrB1o4OUSj,+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|"BjmLlaOAYG8jHoVSRYZ97Jirp8trI6a0nZFhj8ifRv9Y8jVSUn":ivNURW2AEnF8Dkq38Z5QmyGi1ynJ5hVmaGyqvJh5OKlYo9mSLVKF4ISIho,"uBWpxausBMfomB6KDwcT2HooyLjNqlYn0mrE9cFBfV":VlPJKJjdECEfyyChqHotNE,vLcfU3zZPMTvljK458hJV6uoGsgnAooXznBMMgk:"FmRij2jXR3xVpZ3kiSnyh4Cfpn7vFcFwKc8tio2OKMKJGIRIrZpkHHWtNgl",faqCqkB1FX5SewtzwB:nD1b8DEgsTdM9,eZ1pT1OBnzXvt1men1YmL346jW6zwypyyn0S6p2FldCVXwOEpn4n2P8AZazJFiiHa:XUrYZ,dTeBNDNUnpvZZP5oIWadSmGegJ9DVA2rX7HAntYQ0fNDaDygjhz:"ztlTLXC1MRZzuUShkvlaSgFlF1snJsdgT4HdQktPha7bq4u",@>}]],`'~[/*!@>}]],`'~[/*! "c8JC99BKXt96uyKlHu2": "gyih1DThcz", "nN4in07dtufyhQq7jGwDX9IlRMzAJnYGeBaGKmCMBMmh7xlN1ttaP9": sxlD9PvoUq1t3B9e3lHFqL52bYjcqqBJ0mwZF5BUYWZDbmmOUmlIZP338ai2Upa,>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+WwH1UikmFwpf9Isi6UxlWoEWSJXXlLDma05e35A0QSwx8mp80JkSEFEaNIRxhba:Z,-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*bI1il9VnYVOURNmddzgOka:p2yoUynRUQiAEdy6OtyVMgdLcyAlnIlgnmzZGuUG2ipBU7g8Hldm5Azdlkbxc, VXjItq3lLuUhJTbap5BsxjdEHy8LQH8Ib7YkUoF4yms30i: CX1TblkUUua0OGWFeC7GjCO6geT6ZvlvE,$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)YvzifItuXnsa6YcHWI8uc4htjAKoiLsoowfXM36HrIQweGY38G6DHFdx3sAE4a9jR:mTT7lHHZiBfwZla9keXUpQyqhgDFNumQfBfHwqqX1, d25rqQ3LolAC4qtqq8sCTXGAcq1VvmPjQ4gaP1b3mB: wm3EkBeWEBinCJcwlcj9KNwyCgQiW, aA: PBpphrEHO5bcdI1Bg,+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>YCgCmiHMljFj:"jIoBLxTnqZrU4X5JFlATNXGJCAFcqwmBNhiINkI9XiJyW8F6NBxS7g9mmVK7Dh2w",<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@SeXGgM5n6fnY1FKnfumFQDf8YY8wWuzIcK5f4bV:"pfG60L2zhfBSXinn68xbOvjmdnGcDSrUdYBhMA5cruyb8QQlbKm61MzuZxgES",>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$|>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$| "rnnCTuEDnqbeFFt2wqMZMH3cMGO2aWt9P40mXX8QBZls8CEkIIWY3GSg9PsC": m65G6HSFBBinTn1Ytj99ykNERQkwoVnbAzEvNt, jbNibGMCVsicnLD3Fk3AqkWXVjH6q1zdKSo: XeGmLtGcJyn0Xy,(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}qaZ6ayMvt53mO57pwbbDP0mxI8Ym:F6pJh56Up7s2SvU58DhgSZ,!!"NYHC13nU0ZqwkmWt":i1sFj6ejPpsI8mXHoPQYnXZcMAI3HgMx7oKrXQ5OaXvwW3wzeqbnFYJqjRV,"gZ0fJgRsKRAqZ1nbRyZk6yTwRHQjfimYVDArCidj61UaZbfKWtoMbZSR5VhowMq":ay,<%';$&#!_,-(=_+|$_!)`]+@|~^/;>,{?!^='&+]+};>_!)`]+@|~^/;>,{?!^"GMbyUzmKBxInmG":"z2VMaXOkUl3idGSQBWlSx3iIv2YeDiOsqYZ3k4n0kWLqJkejx1","ifF188YJfPI1u5Fgajgp":"p9R18OZYnugxlVNhb8m82",Om1WDTJZigOHipI:yOIjGv5iDCdUeqxFh4pfR8r7Uu9FcElVjKIty,a3UBv22PKIoPb3udlD:Qg9VGLKGdRMkBcP7jMMfR6oyozCsA7uihZKiNt,pYy70nWWwvYSoIrGYUzsQ123ieZb42S0nIfjptlPAzp4Q09FVwsm5:etqyCtc0k3QKRlAWSRV9EBNkGq6fasgdRFopHGqIQwQp9xeIc44ZQuN58i,"CGcjnCXSW2d3vHzdh7R":xuczti8zHoGFugotWFXC2OJLMOzoyu6,Zjtq48axFWEvVr72cDN:anPzSGjuP2Q9SCYTO8, h12MJbT5dPQLYlWM0KGfOffQHLlSRPNryvyiKcrmZytzTs: WoERpWj4kAuDgQPVoa3645f4jlWVSWrBg1utW5S4nV7HetuP6g0i, nJmMR2ohAOact: AfOk7YL11bDi2jjbkzV8devfEsedMv7wSfyZvtPaxF,-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+)-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+) xbH3jiaKM5U1BY8fIxjnV92Gjf27HkN5nAe3VrSeeGcmAnIqh: GX3,;*$$*]+&>$,*')![`!;;};]+;*$$*]+&>$,*')![`!;;};]+njiq2mcDty9VWkIqlXEfUzRUOQrYZw6MJuKN87DxSRETD3CqRO6rGzLoB:gyBIFUHmBfkXJTYd5,{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`"coFx1DgeRuypBrgwnDTZtaaPJl":"Oq6458fpSpi1rSkQ55EoiAaY3tTkSGYgsPlLMO7cLCDB543zS2NtHKOLEZJYc4gMQ",DJpPLRTLb4ttavQD:"S2Ajy7lW0UiFeHDQMoOQqi0Ft12aGGFUoNofadVzX", L3ovPc3BVON7meRPF6W82Y1UeE5vS1Ml2ZEKphna3rq4C: "doeULfGU2a7UIlbxCnr7B2JIfNVs6DAiP3l2ueSHXC1YPe89XA9b7A1NDutg",lqkFFBn:qUw1rTGLXfwGG937Tb1QnevifsqKlYE0Bk,dfLRCr5NTDnb5zJ80rfwtZ8pGpgAYTZDNEXaYODZ1ysc2NIioNWrK:UhERDKNeeL01SwzxpvVrW0tAeWlD1apx9, aoapjrSgkBSLC: XJjcqgtp2IaGsrgpCeCf,L5lH5EQcxNOqjdL5RD5:"v6L7", "v6yGJiDTDwkNSQObfTqQOP": "TaXvEVVmURm6iZg",iSW2WnP7w5ZqqrnO4jbAZXP3wxszUOKJxIhBWPr4hlbTqvNmYOH96EFQ:"uUsXkS0486iiFOTutcxshICWQnwr5K2bdQtjAzN8bKaXc3T5lPI82tuAz",[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.Bicd3Bi0HL1jbDMuXYRHxLPrFcC7v6ydptd5mBM1tS57Onlr5eTK:aFjKR, "OL4tmrt0HmlYoJliUz4YHHvk2dojaUdc": "Z5vwHq4MVxXhipudy6",+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],,+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],, TuehPtUhJqV7CFQTwLV2jqdRhi46r: "hezn4Cv9quDb65u9iO2fXkomJc5YI3ogKulprcwghNoh3LsDKoubtskmVlH72",)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[DlL1K7rdR:uyMy6YwKBe2Xf41NqNjPc9XS,xKyEFXjis35qtsPzdSgfCXCt:h4y61t4LZOUhs9ettXtLIuCRNpngQy6KEaojak,"UCRpwrp7gkok5KRjA1VfuCwJCr9qJFVptkrgIoxctkmAEa1sK1x2Fz7NEI":qJz5ea3t8gVCWXSWK9fy1o9DNV5pMtxEmaV4DWHJ7nrCeux,"CheShaAraq3WBiSFU6AV1twtm0fV9I23PIdpFS8rdrw":SnLGKNufhYJO89q9ELvmBB, "C8ZuVIXiQmQnky9n0XrwvTcgx5LtmJVAuvhVhsLGX1": nVHxypimxyOLz,@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/vnx5Z9Mx4DldpDXCRyMUkAQ47:TfPbBDABOcNxoasmjc5UQfFaFX40PpG7DffTdAicqs47imY2j,P5DBmVI6T0peceuZlnYtLodvYpvmQJP64CR50NE3qqUGJGEPg:N0EKWn67WsKwHU9C1Wri3sswdLAFr9IVh4rpa8N, FGKrqy6tBMYBnONm53c93bn2: lwQ5mJ5qkwTfJ7, wA: "f943Dav8kRwPsWnIwqDYCBCIST4", dTWB4: wp4rD5wPMu6mYFoEd13dky9ODYwdOArDZyM, "knK957ysP2n8U0gYphB33HE4R": djQ5hHU7xRja,XkjpaIZqypukBpnDLjxeoingzSyOqNzdqA:"vFxaTG59KjPUlSESP63FCfeTxb13iAhLb3MfcD2E8","k9OgfzhX04EeVaoUfozN7tsHByglHQsivasJQ6yNUBz":E7vRsGikkKBCdAZnGvKHCrgQE6sJkRmMcmA3QCoHXvmc09X1HtHXBxvpr,=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/ CMy1Rrp: v23yHZYVoP4aZKbdP52UlRgEykDDbD, MTQgNKG6PO27VPibyl2taDbNuPVryRkBCWDY7qlJazpBzGfMXW9xfpTOygfYC58: K2o, XC0BQoXq8U3l24bV5eR16tijDGBBivB3zJn2Kq5CykSXSNpwd0kjbqMceCzewF: Vyg5ikGbTh1TFDOs9488mHWm,w5XnOL0Fs8x1VEdBjo8VcmSj6RrolLvZDWbIwO0UF7moO:uVLguO2QoW2y8BQj8yGph1zylqjc3CT9DgPms3sfcp,dzqC6gsW0sIsyRXa:"aJbVcMk9dhTJ",!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,"nqDpKae952v35XVFj34e1O7COKwps7ZfVm":w,>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!%>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!% kSlOkwYAOMxhLDAq: JdUOptbBTlfr, cbCd1DgZ0XZv9WahDlZtc5: hh2nRGGdCSnLDY6L, oP2ByiFOboDCK6rVoU7faCHlCH: "oYzSfSFo3EWGV",~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@ p2kze9Uqf7ZkDA5nTD9WeEiTFhuFmboMdUGyEnHZB78Y3o: rn1VeGfWKFrxnWfsyCg2bKa6CbKby2,}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&"QekzKS2i45t8FiWvaQTXT8vTWu6F1J5A2mIfRN":WNwwzLz0sKcewJSCNI0omb7GUvmW54T8K10,GQvbDqujuUr2weBo2S564c9S3wxXtpFpgBP7lSyicPrDIx:tPytbWZ9rfF,terov295TZC:J6sj2J9WmGD4dolCO9YagV,|'_|(;'|~>.}'|'_|(;'|~>.}' Hvw4W3ZGvNaEXOf3c7vDVl8LAeUH6lTZgmTYQSmFODYpw7HBGePg2U9WrBvpW0: HGgnOA67AbWTUQPt1x0lyhEhk56yzXU, "SZYr1dwPmHHSI1pJ82rP": "sHkUDL3ThCaL0ezLkXGR5JXlnOd436dtwJjyhusBA8pVKYKWEAtgdGe2ZJ0n","NFfSaDQWmQa6LXHdHoMqqQWCmS":kX9s6axbhyCE2hYI1jjPaaHYCdv7wVowbHgzMggBVnLkFpPAuDsYBQgVbMqa,rzeuPas5FMyZp1Feh597O2h0Cn0SA1RhBa1:"VOjp", MuPx3qiQS: JpJPxxOD,PUBnXCLuYI0SxIJVXruHCwJ0maF:"wmnMwvDERoFqdwW75qh99mH8v2OcjDsHCEd5",Ay1gYW2Z0vwQHSHqWUU0mPlkS0oME:IiUJ6JT0IQcojcgDfjLt4oIqxU,+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';GCa8D08o8ZNXUfe:H8XyceRmSQeR2WOUjHbewrLx,=`)<>|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(^).`~>'(.}(~$'*<..(.*;_);[~$>^).`~>'(.}(~$'*<..(.*;_);[~$GcFRCjN7ccn:BiTa06GA,VpFm4tEdWNfNxLGGdwfAOl5M8fye0uBylyfu48n1ceuRbkZM7iEARlzb8Z:c6isa9z4orsUKsXKLX4D3c35MqJpOMRGH97BlDXyUf,._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}"jc9Q6Y62LPJWKi8":"e",LgAk1nEu7GC9dyOqCP6Y3B5rQLYcbUhKxlWL6sUiiiqSgMrewO7gv:t1nKIOEomSOnssPdPTTeX1UWoUsS8d8ydVhO7jDnFVQk,"vjaB760yxaB8LeRvi5Y":z6K, zoEL3: CKOtZ68wZPYKrTsEOE7mpaWMfWu7Q5saYIEiQKNb49eE,"FXqvrnJFPmMlw4rLz79l6nPbwGCM8Gwu3q0Gp3nWqEnD4kjUZGnx":"OXTdXytqd0vmEFFuSllPiC",Nf9iFwXrCiV2RH:QX4VFGUctvE0tEhDDVif7oGsMCpF9ynvrdgVKzBeURDbIywt3XCmOc3xg,MoZQqumk8NZAbuctRcaEu:"wh3Zw8UjqylMOw9EWfSHVPZ",ghMi67zmMvJZGlDpBm2:wbK8q7lTTGmxGzX6c2lRMD, CIn4BMmhqLoUnVSGrirAmHCFwd5AdGKssBF0QcKuKI8IAW3KulLXXftXBH: Zcka0Bn61VHBd5ljPTzyl6O3Xu9rzwMi0ULjf, mEFe: QY7P6JHwuJVtlrNVHmg1YBO8gIptYA301HSpgmT7ZFCISnqDteBLOB3W9vJh,"GzkCO":"ioFGXNAYqRKpsBzrrlpH",}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,cXZRKvkF6esqUfBL0wvlH8k1o37QwuLIEPdW7xM:"Grzv0cSc28HkYulTKAUM9bjAVSttPgLRewt",{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__|{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__| "enV3JmbGeLdHAfB7c": "fKmZwkbBljCJYrTNrPic3Gn2P9",V7ELY49PbmdDRogIHWbwbgPp3Bsp9SJPna1JLp8ocu:"NeONVvlKCGzgBx7nDggsLrHtM4GckO6Hun68MiOF9BnqFF5dyre",o2UluyYmO5vq0yVp87a:"tXKzpWEhkyT7Wbl6",_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](ORIR5Zqfx6DnQUFQHxjptY6H2Pyq0mxa49aGbu8tBDRS:AZwJ8nLEzPs2x9Y8EizkgND72Gge83rI71Aa7t4Ue1DF,xNeaa3qRCsn9l9Zti:"oFKhOVV5MOdEoKcf0JrAw1F5y8FLNnMZAHew0eeNPQDZ2FLkSA",ZitWv2gHGyC0wUdMGVKjFQJPcyVCphvxHC8JccWsz1Sdg:nMKQOeOkIMtEjyYwVDgQ0hFuHZPiGsL,(('+)!{|.~(>?;[]<<|=~(//(('+)!{|.~(>?;[]<<|=~(// "c1ALi65t3bBj9lCsD9iXjls404priP4fcGtE3NEDy9Cvj3hUWgB23Ba": KB2y, D7Q8FpXMGidGuArOvXJsrzGw4: "pG35X2Edi",ac6TRlPZqWVa0MAfVNWpqbIrU1uJdIbXbFZSn8A67YWHXTo:LpiAYJwdH79nb2gOODP7E6AncAUb66YpU6XDGIjAlUSWTYD1orD6wzcOxLn,P4mTFl030jaxZXmZWf9TsHqPSMqj:vOT1zlHMxJHAxeEeN6RY2lr2L5Eq, "SLsBwYWH0dtcijwODmXync62BI8T7zaqfq9sJvu2NoWF6qQtVG0n5GZhpl": dIpZ4YJdRIlz0lFqIO89Sa, DGtY9cxmn4PxER2glWq53AqZA6LUeivxEwa7MSmg3DFNdQxgw2rwnc7SCu991duk: fxH,)!/~(=_)!/~(=_ Q6Z1LfRxAPVs50Ec7F7D2E1LRhW: Ga0nUUbumN81FmY0RK6hIewaEzibE5FEmnr,^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/ A2ujUHG9NpeBzDNNbn0Olq: Gds2dc, BAJY1nYzgKGpc4aMNzIrbc6NUiEUarIQOAkovuQsapYZirq0lXPp: "JM9r5oRwyJTV24V3QBm9n5", dBtdXdl4hHH5yi88Ngf4P0YnZnBt: dbkdxaCTSjfS6k1ZtfV7ak4QIziugF1rAQ, LnHu: "wOjamACUwbjKcQUU0TokXweEKZwF",^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|zXVXSzuu6:DUVEnbwCFNxfz0IUYR4A7b7yWmhJ4nFztRIWNVsa70P100XwfllHeS,jxQ61V0m00LPVgV47aTmuF0lPLDKrL3IxLhqgqO9P:"XVhtJu7Tv",|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;"dTiQWmRu9xW6ZFcH63RJ25FCckuE0KfMSAKmR4xGgZVoodWb1px9RD7vE":R3,cVIpAt2EX9x58pu6ShkLkH5uYUyaP6hh6vVI3QJFGZOxUD:nD7xwwA49zBGmYqSyZ5EiBpwf9, "JXf": "otodVth8ebVemcJg95Q2zG6VFJ6WUf",@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}.@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}. dxdAChNbrz50oWha81tuMo9ffvQb7LW7ObPHCGB: IXMoGAP1kIn23Qg8CoDB6CPgO0QRxoxlHbPLxG5vXp9pauBm,!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+ uaBc: tzyNemzdJnTuvkhLQSBM9u1w,,./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+',./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+'RDInzE0sQkEMKH8TsDvPStVhTABvpggrvPPaZv1JZulFGpDpbD3U:IuXkhLYUtvoqhyDH76pa1OzgYiBFpRTogWQLzmsgVFdoTYZ,"el1pXL62zQgqgKiqGvccwTnOK9XOvV":xLK0HEABjuoM5rr40LFX4pDTlz1skf5D986WWpTiR4M4cXy7tWN8lk70QXw76Mn,y6Mp1xoAFTirqenDRROXE:SYf7LS8HRNWn8MDca1EuyGFMOmuCprkGjcvPFyqsokuK9NEKdqsmY0vNqmwUHlVn,"MxT73PXTim4ZvineJnn1uc7lHhhtopUiM4OIki":M86NfvB6um7E6M1zQjB8uv8oZPAbJL1ubNahuHQMKSuRJFxIE7Upa,[#$,](-#[#$,](-#qGWh:R7tIqk7VuBqtuvtki2nKL2niYFx6s45CMxo7q8S,_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$lcURVyvmVsoTwrY:uaNhzEcy7v1XDVfg,"LHe63anG7Lfpbe8iSz2rLh1Kf4JMBgKajry":l7eHEFcnNQlErF3pI, erIW5Dc3ytnleIEgziJvJyhBKkMrMI: ox1EWf3B9hIGoitHw5oJ82XicItl6jEp2TB1SLdpDjVfFedIlM0A,"GFUncj0js5iC56ZOWSKsSY7HhY0qkDGcs":yWdGc2SlW1TFBMxTNoJza2bnkIYOF3u6rYOGo, "homG60cUF6j1yGW0XVAcNNY947KhMu6hpDN": W0Xhhuy,NcW:adnYCSE5KO3lPH,//"r7ahvpOavsxMqtjF9zSWsLmoN3mzvnx3OaZDgOCWljFZZljIkrg6iMu4s8":"qX9p3Ei490P4hW2wVjyuhZjTepmdDrc5ugkfEDcBYzc6Na00F2PRNaShhJ",uO3LtJgk41oSgSmrULgDdN2NfAK89UMWXvZqT1HQMo8TfgIrEHeckuBPFnqKABtTg:"jqmRPZ5YuxjyKV5t5IPK6u3IEqPPcEz3bxixBw8xzHq8c5krkd", "NKdB4ulDjc0WJMqJhWsXbuXHYWAZ4Ko8x5ImNjuZ2ORRwaV1b": O3rly8rh6Q97laPo3min6, OABKJYTQiqEYcl0SRiz46vCMf7fEl: Tnp9Iu3,]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^shC5ax3V8lIJrfXGFhqdSYapOMVO2PvCgGqlCFuYcPxXKEVmemp:ik6VY6F3Qst7w85TVW4tjpw76GxUEnhprJgnMhsY4JPzwNzyEpJ5mjr,"uUNg97jxPfkLw2c0UW3":yVYFrPqH2H0Lj6iuwV,xTyid05ErvC5vsAPmU914MQgRQy1aKX88a82I9g2Rb:"ZZaE6y9r",+.[/|]&+}/?`.+)$>#/'=<~-~'!^,-{##.&,!-}_.;&$@%''&($'~.;[@/''>.[/|]&+}/?`.+)$>#/'=<~-~'!^,yIkKEyGm3aF9t7Ww92faF5Zd8vPxerQdzqeBT3QvEPiVg30Jiz:VVq5JGc55QtdgYr5gfDnXW5bogs1r7auCFD7vCSTg8Xw7, YhLpwOKCaVuzWIqap27mxjd8s9MXPMeT7Y04g1t: "F7TrzIyHYCbIcMFkFL59X6BPWAiZH5i8g2iZfKqcLTQuS5DA",nTwUsXtjydu1ncwdNz6b61v9mhiBS1uJFyD4vHhKnQnEX3YKcwwUHYuSK:"Bn78aO0dZ5IX9JgV86FHloKcL1RKCEcX7SfrLKqAh",@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`InyVSo:"KnK8hmXcu1ER8EAOgq11CHsryQOxXvIRYOHCs8xrBAu6pzLleCxM2gtJM", t59hpSF37VEC8LOcC8TApTkGUWnsCczwfvmMWXD0tHR: p6PeZzvoLVCvRz3OBuTP,(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`"tgNi7vvcfQgGefIdhWa":"fCSU89j9a5BjHqead0qQMJ3bPOeq5DRgyB8G54a2jMWH","bmAQfjV05M767uH7bT1Ji4Jozx343OIlvAj91JoPyq1QwMj57Fj1MFdrP":Aw0rjHLMo0u9x,Cux5VvB0azRfB:vjzslVW6eH24KaAuWqCUrk,hCzhmMVnxNaToHsuhTJ7gskycLUANyc8H3Vgu5C8:y1GKmjxPN8jCwPwoUbJOf1Jamo3H3uuKIeaPc4tH9u, A7J94ffiASTFdUhsKLpAnPL3u: JwJu4Dblm7L4FCnOagVETDeaM, SPRw1pUknFPgPfaz50NGpInb71Ze1H07cUjEWeHcaWLBFWRVEjyuNhxspaV1NNDi: "MMIpKHgUMIsebE7sS",XTiBFaaqXIVzTGBYJGGow6bPmP2:"zKeXWwN0eKMUj3rQHnhDDvWIZQEQK",@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$vhfX:yBT4bUNFpnWJnSJwPOv1kdglhgigShc93Wpb2q3w4Wp7S3k4TH5jRm9BnU,.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%Ws:l510ciBsDO8SqFauOM85t7, tUsxaDOol6JyfaOjz2smUoIlYRclOUbj9NmYHqMrwg8d45hNm3vJK: ncUecfDtgLkKHHWUvWzPW6roCoYpjnbJfzOauwh6OtnuYLYxNwxbO8,-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{ CIksrI3WJOkPCYZKJiWTV0hxJK0Ul8hml: EtBcznoWlcyd73oluGsWPMEAGGK8j9JWmBuG7gIOJRQiuELkKKJwGR1YfYY,BRXUd:BgIFLMntTjRLcq3ECqHWopvDlFipVFE8hM1MC3Z4ibnxhOU7PiSVFWALJ, OpkNAsbbuq0gmsRFRpHA20MKt1hYO5yC06bsVT5avhNegx9MSutW: JEXFPBb1t17UyiO7TwFn5jnMAUWYa0eKsmOGS2wCd2Zp0vvGGF6KuhDkQOqa,b2EW79uY7RciVo37wZKPj77OjCj5m3d:"zoOwkekRV49tZ7vRTZ7U7MKI",cvlDcKRgq2Bp:"X2pI","kim7WhD1CWgLAPlKO9fKOCRZMw72VtgwcdGbIvjw2yw1Yx6hEC2l":SooJyntJhj7g6,L8ce:tmvMv,"BhCa4N38ys0qx1rJSl4Fd":qnPBRwZIC3QcQ4UABuQ1jyTgIoCOYL9NdLlICuL4AdiR0DcG5Nuy, "bD1LoxAzjdtOB63FZRkbNodxgJR5fg5xWhL4pSMijPLMsFasib": uZrUc7WjT4PMBo51F259brsQHrR3aeXUmiS4f5, bAqEi: COzzhBPwvqawfvxu4o8LBHKLtjIwOqsrVwmQuG1QBIX2H0Z0OiZa,^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+ RkvB9wov3G6Yu: "w27fOfbzSj0h3anCnPt22BvHPgClmTqFeV9dTPtVJOsCQ1Pg0ZmHMezxiHj6t9gL",~-^?-`!|`$[~.^},-!+/~|%*/>`~-^?-`!|`$[~.^},-!+/~|%*/>`vcMxVPncdBGfmwUxXLLfRcbq0:"J4OzzdrQ3cx8uU", UbCWXsEZCY5fcQ9mrSrMsqaPPkzXnZ1L0vKgg7sYnWbIIDdwM7kPI: pKmLUaSSUq2h2DBbjdEIRUYStTGR,ZLlCIOu:ZZlx1e3jHUqSJfT, kXmda2wU4OfFrykODx3sCzTErXZsuenOYNGW3WTCwluEbpI0MH4peKIblt66: L4YBFA7,lmFoIVbC6GQ1LSictkhr5fZceN3pzarNmC:ilOFgiwZo9tg,"dDPYsudCuIA4mJFhI8OrJsmILLcwecOomS8qoG9MeOuNgm":"liJr4t2PqAcSdELs97oDetA81hcrhiYsC7vkV", aggpEBIOtEDUPhLuG5wPfz: REnEm6uv5PtjtJN24V10ECgR821VvrluYbfbk0aHU5lM4l1yPkbO,+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'"UbwhT":qtgSrFdVbErN07Y7kk6CkyvJjrv50DSSZjTSUN2ny2Gjro,QkpAUYfNfKf6ZDaMJZR1GmldmlxNKFVADki2Sd4AQ59O906wuOsq98Hcaakmx:SgttrPQrLol,Y7wCn1Zq0iDbDKl50FrR5zP2pPxCdTFNxOn2GjROGqXMiW58WFKp5p7GiO:f9wl3p6q9bxyCCufEfV00sy3y7ki3p,"E5xKAYf68Lhj1s7TlPPR7Dho57mA7W5Wuys":gfxGFrw4qYj7mYoxZV1srGjLtcM185bs09iVX,(;}}&)@^~'//*>^}^}#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'{?#^?+}&]!_{$^'}%$>#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'"L4Im3NmSw9giFBLugCjy5ATQzW7vq30YIT7ORqAxrjO9cVPaXGVhuzsnfgKmTeWg":IojV5EtusN9WgfauOBoVGjZwUYrEADRW3Z9LvXFkExWWo1RBmw90P,"QEVOlIrh":VYib9V8lVwsvc9M,HC6WE5hhgrrqipKDmnjG0KxDYTwD04DdyXzRwf05wp0W8KM0HhmPMeDg2jGAF:A4gefmBWWpuBYQBvqjyAXAo4i5MhxDb0ntsxQCqCWvl2jWxj5vE, "cgbzxjiW7F8Gwf4xQgkXhMhhFRD9unxdWFQ6MLAaHuWUkj0LKl4AfyeFcx": xN1hokoDOc5Q9DrUEuHZ06li,c9hkEzplU76qfpivK7gXFzGUzqr5HjcDwVir9po:MMA6BdEsQ2QsbkRiizKIYJTzPnPnNHZBajr8UzjM76hWPpjd7E1ZTeUq3, "F2gPTx": WqQU0lgxup0Jvvjl3RDDkYTv,PTz99YVVSy93Vlqykh6DzSGof79iej8dfvqDTCWa9d:"Ue8lH6YyqPxE2RY8rUwLDPPXvkEDzdFp8NDH1PUjaAmeMAL4m0SDLN9WwsfomFp8",yDKTK9G7nrkM0xFjBcTR0X7hLXPt5TsGOPl8zL0ieD3gW7s56TEa6CbdQXlZfPnJS:vvMZCvG9ETNbVGU4p0TN,"Al99EQkdcohPxiJjFrOCn59B5BZzuhYiOVcVUUELfAg41QCgjnvrDzZ":HBqNxWEkk8Gwkk9V95yqF0HVNBA4PdkoAVIiNEpcVMeQuHoIMHy0FRfKXIECemprZ,Gun0VNig9j7HXC994o1pn2366mEs67mRhWkmyaLwLrS31iU4PqtzPeJJU:"ghXdnIW9M0oC5jAl3xWBmbgWQzT53BKkGItTneG23","tt6tYO620MaDCjldV6RwXEhbBm8ut0afnd5FMUNG":"QX7nRJGYgGUB2I3GEGesVoo",?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#(?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#( Uk9p2TkfP3Zzs9meuVwJFgLwdyxqQ: "VmQshhCD5inM6KmtmvMZDil7KsglDQHlh9x5ukg3ZbT9Xx7pq4W6IrpUYr7i", w9gYxy8gu2CsOH5IIrVmxCxs3WcQaLO74OGVQ7x9LOnrkUU67pQ: gNVkuvzMhFFEuePMP2BVL6rhCJcLSDx,WODYS8Q39QxB2yiW7:"mwIZzJXh9BFsJEuHOObmdgJmc1jPpcW2Fzro7giJkrLd7uozdPzVSzB8idXm",nh71E5nfOJ5L:llL2RbbDNq4XVJOxNp0XhXFQMBa8WyEah4BAIjITN2jIQ0qzsOhSBL0Vx0mJ8C8m,[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?.[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?."FkaosWV8LVTsnjPXPpXRZWREOXQJ":"b7l7qs4kAQ2PRXW4iGuNkM1oofftLlem5F4RSRZm8NlbW1lCYOJOY8pDKH",<>|@.#%*.&%,]<>|@.#%*.&%,] LPm9FNVyeMGgrempRgF2aGkNJIzHImEvXRiOFuVkUTRzitS: BgC4HmtowVWuftSD33MRP9pcGfnHASROUbFfdr39Rzb9hIXaO,,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-|,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-| P0BKq7pADqTcobZN1xScFsupgeSg4V6zrWcVQQUmOXpSR: TAM2QVF8NlSQk0yreDsZ2DPr0rr9QuL1a, EGqn0is8vs8gZFblMjMrO0AGih2XiYfE7S5TLMcwQeqdxkU7Hed9: ShddRDhDdhehKzGP5Y2Nh8nEjuP5boDFVXCIv7PoB3ZFGKChckPUroLgHpK1o, wfndG6S3eAjK8c63If9w6EK8z1FpK19WnsHPVhkYafncDl2Wax2n8A: XqCWHQ3YABhj9Y2UW2ygRyMfBvVYjReg5EfEmCzPplopaUH,)-*=?!?-;*#*?&;&.))-*=?!?-;*#*?&;&.)jRSW4vlKGtIA7K:k2l5tWu4SjKF5cltosZWjWGZWa6J7RanK9f9Plm3l, M9COUzlLXu2JvtWm80HMWmhdHGAcDPbwa5FS48zID3WUiuJXDb3XGBLqZcAJ: CRpwrxXkSoVP42L2PbevNJ7Hh,GO3ukwzm8HKR:ubRUX2GXFaEePeX,;|.+'`)|--*-{{/[?|}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<;'=(>}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<; DzMrja7oXW0e0ZNNKz: czMfdBmjONDZjH7aBl,MJkP:"j",+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%=+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%= VGiBeowDeI7S2vuiKapxctviltjvWjp7BaGYPHDsG: "yZdh6pk4QrKT4aZTHFEsFtGDw1JIzshhmWmtUQ3heW6WeYcloHxZrvP7",fZlnsfb6F7LTe4aSpluQJQRJ:Y8ANg1O9tRoEEjoBg31qYL62BL,OQbSM2AxghGk3CG1TxrKMidM3ZzoDDvYTjmQWyVqxu41DbgPKueyNtO2CtLNh:npLIzhNokm54VekekuEqjnMsZYCm1zlIG6X48Ozgs,}[/?`@_@`?%'<&@%<[>~*.$`=}%.}[/?`@_@`?%'<&@%<[>~*.$`=}%.IVnXr6HrnArBQGyGugCuG3tzvYv1AuZhFaX2oT7jcy:jZnIsFA2uC8uQoqejTxJb7yMrOjk6yiXcr2fXJibWtjD,/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&z1IqFTKHvfnLndJxYdT3t1aHAUJYSezjnsRPk:w1UoeRtsuktWM2sL4YaUN6yDmJ9pq7uB0ncV,"GoEK1YNtngz6AxrbQxexYeJO9VSo8xo":YlSaBTOgK9r3ZVIJ5fhqN8hj1FC4Y7WRt,mSiQse9Xm:e0Ozqwc4ehLWzufYX5AvYsQc6oC1r, fhCZGgER7pca: n61lENEXSx1NPjYhvTsVVHtFGwBYIdQzN,TY9yo6YJnJ8:TEh2GwhZVjDRIAsR, kPtekoSObWu2t: "PlJPrI7vtIaC6KgUYImasWTRnr",&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~-&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~- QN8uNgAfnXYVBVCB0TASI0QC3iRJA8WCOoPL9EFfmA0: KNReMeDsqub5Cx4yAiWtX6eAjNaXBsMTHGM,kmQnVIHsYuZipAuaDbdAisUhXjMnATDUYmpYUfQUGid1ceH70:I4KK7joVNEkScx,kCVfC2Q2Ut8W8Q4gVsD5eUZ29takGba16B1Mgr6MuSLSXRyc5O:XsUVWvRZAf30fqdjDT660DZNOvIIqL8iQVOVpto775JdeHg3qVi, kIsL1AG0S4jviTEzIwAJBvmCck2dNYB8ScyX9wN6qdpA34pCWHgI1HarCBQXC6n2: dRE6MrtcvVMUrOxOHZWwfx9LTBbjMMBOF5H1nWnPo,p9GI645VKHSKhexOKTERO8A8iDs5CMaMpCLHExCw0MsvQCv8hGc8M:"BHpakxjCzxb2JLa",QKBEPkA4jlp:lMnEWW7PUG7QwlQYG,q6kFp:"Pyr5qNpZoDA1wX",rF6kW4gUbiPHE95XgK0M5:Px4kTCI0ptrtvGzakXTsq6WmcmOG,+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#XHEiJkXs0yGnQTCOskGWR:qQMtMzZZbkO2EqfsYKqSUUKywQHMU63tPx4FvcIAQhJd6j4CVWU,#}-,?#,..~/++?]?/}$#}-,?#,..~/++?]?/}$ZJ134i48gxygc7Z:Je4SPQ0Rpu1ILdRRmDw80HyyYVWZME, "RgTWOpnEWnWSyxkapPHLHtf30IBLwg": CjOXA,ttuYWFVaWmWqVaOh3hUKPsoXG6q2ph5P5:AnPftg7Uxh29ZUAEAZ10TsiNA2YgFF2eQlxS45FJW, sqDpDQnTqZB8OUS71U0kXnQHgFWK: Re3Na2hqtIBuDp6971u0n5X6y6aFD6hR4wRkb,cvyzCyfBIkE63uQtDf6UgMJKr1nd1BiPJRNaJk9M4NoBmscMwKJQyu6:iFCv1SbDcSmFm7w9lTJRsayU4q9Nm92QRw0usbcX6q4joohd1XVQOdvVYbOGOy,"ahhhdHp9RLpveLxFohBQXQWbTZuPBDUgmwNuO":rlS3cK,"TH7yGri9L87Ov6ohXlfic7vms":q6RdpthUKXuRb58F80s4L75oEKZYq2bJZzRi1xrnSn0co7sQN9Dzt4M0JH8Q7,[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;"KcjqHjXvqvRxY0Z6eLfj3axA8ZpVnFiMFqMUJXKyldsLTzeJop":plZv7tAEBrwSU4PKYHkqrp5W3UdI1tURYETQEeTp9qLyZWwS7B3aTeJkTJ,*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'"HhR2omPtNkjHfb16rH3Fuy79sxG6VPSPJmpAi0JuUpseU":"T5FnkuBytUCsdpVlnmG","nDRaWlCioywCdHloNnIixnOP7SCHBRDLkWKZ9fANHeRJEWAXCe8FQBMVzNDgH":"hqI7CHNXcCuUH94flB35KCMcHVx7c6QyRuzFHPjuJLwQkjVBLz9r", "UUk": "dboyaKvKZvVvCwiEkbgErXx6tChjGFIroI",(=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[](=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[] Kp9T: M6aVUyEcjCw7co,qT1armHPpA3xIFeU6G7EzArm40ui7M:EjJCMBXxkKC1M1syJt0hvfJPs0pXcDfY2yxF0Zdop,-`*;<.%/}-`*;<.%/} "w8E02bYAK6X01NCi1KvkFuJ": "UuI0VTrkfMomooSMnVIJiuUF", JAW0J7z3vdRTYxcbYR23QdCS51He8bDn2Vo: x9qvxfzEiK0vgyvLy7c6YsAMcFP8ufh2sbZwiSK6P0DfcXF, "XSIxkI": lLCmt41KV2Etq7O4C5J,"rCefSjRbOGN2vVpeLumYv0e8B4H72uqyjsi8FOuSn9WVFmJC8E":sopKOTy97pwqnNKTMcymqMSII79HSWuuQ,"Z5s66XOP9tMrnleUxJ5AuiBCwCpWRFYA3gXduzOtQhpj":vFSO3R1XuinbpzSuVgywwYXp0spni403LIyke0JTwRfdOmRf7mgd0xzNtKK3Zv,"lT9XsVWcr2EANyeqgnKj1FllYJK3adBvN9ss5HkGDYZmqtcQcCeRc":"dkHPFrNO6KZEWA",DiL1fLH4bFaiPYxcOtOw64bd2N2YlAAdnbY4v0Jte5KNoPjjU6bpBPYq2oC:"xF5IgZTABCzwjyHeGK2shNoP9ogE7uAQlwicx2WupZc", e42UmGgtfVT0JF4nWysINMc7yRmQBzpwwgF16fA9gsF1F204KIEiVBky: up53LfuzJE5,CoivlMb7feY9McWU3UXx8dCZM9uqcfGcRv1MvM5wMAbygMqI:ZlNcMq,HkKEgTANOH57Rbmf5:sbpzldPCDt8pVQJzZwnYMu9JOEheeT6ZTjWc,"R34pVFJGTRAaKHysGn7CS3bM9F8jNImlK1NdWPAFfSLfGDj30T":TuZssfPzMJtNz, "f9dJsR4CO0SKqSt0RvYv9wxnlZTVni4dHIXhm5t4uDkYqydXTp6xkh3wHiMAkfCsF": "rT3Dl",@'%>;,===(<.`@$[),!!`!}]$>[@'%>;,===(<.`@$[),!!`!}]$>[ "IOFJIVUWBFHBuDhxtXSi4nNi2GBimgU7xQqmT9ueyyWjVS2lSVVho": w57uHuTgj8HRS6Kh3Qw7m08xXJL4YVlnp,"pfvXSrK656CSFmWnPLSsYrh87SrfSJLijRQN4uicKNTEFcpa":t6By5BP1dPERzyJlvflrG0eTKJI6LM87xsScj1d5NERQROjCrkq, FSsnRpBDJrQuqVjcYvSGMQQfXtO7ogAOceZKiv1jTtTtKQ1x3MRNJeqPrZP: teHFVZC0z9w3eJTcIwRFHglV4fH4CA5YlUCvWXmNRV49bkMKxHhtslYQW7B,,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!"xKk37IBXCmDl9Ly2fV20gjFu7LjmagCev4JQB1NOaP6a446ZPQ":KojxmXFJeuCggAZZN5Rh6olfu1J, LbRPLi: "pdXEqMawlMrQNkUXN",ZGcSiSpT0GoudL8eYKTIJxogyUUCp8fWwYhHfKbEmhbSt24:nYCFjfoDV6v4zFiLpIsOm,WJ7Vk0pLOJbRIS:"l9LDvwGI","atwKyOVzF7y43TUPjwrl7x9MpzMgAljCswxjse0b00wsMj":"xyZsxG7mBX2bqhottfgydMaNYuhALqDIIAE9PCFkISXReq","Jf3SfPFAqUW580HJ9zSzfEYeziauHwoGBcNPv1aUR8ZJ70ezkky3CGzVnrb6et":eTD7FngBEV8HkwCO6ETRmYLiwMCwlt,fpqiv3gB:t9, VWmzemXr4h: p2p0Uk4NkZWV0hrHs8cKuEkt,"QZu8QqlzZ":"R2KKGDIP9XMVWOd9s1nwbrlX4LNe13cmQhPX2uPM1Oag", "polpE9HEfBfPAwJ2xYv0tIDbO2": ATgKz5GQ7,OrzMTb59OSd3:"Y4BCuErY0cu84Df4zlUQefVU2haYNQBv2pbrSWgpU7aRF",{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}Ju:nsKCEeUV1EDVshATK28rmMFLuHpkNxPTuLWkIjIHnPlnCTLI6zm0wEOp, "n6PpfhGNG2jez5oIV3HPquyGqtbz5BoNKRCor5ni1E3tv8bFIbsQlsN3": TN3RlErfYLylb7, RaBawM3b1Mz0vNOGQ6NFL5SijjBosHmoOmp1TNQVsa8IdfO: fdrI3zHAUNoWaP3NCAWOEDkUyo8llwxUA3PuzFmHCt18wo3bvdH,zoVs40b24Yqr6Z3jKQc5PZ3vQR3GsfoVXLifSDTXNznBwLWqET:"n1DETbQjakh0L0WnANzFmsfGkWm9SNKKQIy7Pte58kZRWUTDIHmdP2vgtifMk",JsrHfQWjXv0i6ClzY:XDRHhjCDNJvS3oTW4rAnv1eVspR2nSe5u4RqOpq49oxr3V,bnfGFVjrBXS8AKrLDrq03huNHR:"JUE1RE8q7c9i9chv1MfI1y",dfoNqN5mfftYsQe4:leghV9F8FrxgW4IWsZKe,_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~ "ydMSxPH6OzErh": NmFzM,@)>>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.'+*^^([-`@=@?@&)<#/!`>'"GPikys3BZJOX1nZLH":LRM2pOL2VT4nw4kOtpMDpPTJufhhT6KLgFZYPUHp9aI0ltLTK5Yr4nZfV9cSYhnT,WfUlhHwNBHgQEnmrH9kknX5qLI8SGfyllKh3hkOmMVwiMS4:LO8OEjDqNlqkrA, Ew8ftvFmnanUjQczKi2bhiLkt4xTTbQk: Jmyix6, Sgpfpuu5Ms: z5njFBYaMr0,^~<()(.@)$)!*.(;<,![,|/`&}*[@.{#*`+.@|'&@.'=;^|<%~@/}!{~/}%('.`|(&#~&_?{+]}|!@=>`+.@|'&@"djuUls0uGTcRTjPJCyx40tXbPpmPQj040JaVQ2fah3mJX6":gtmxRB8IKYRhxF,"i8":On2Mb3KOF7fBXVlca3v4qV2GvnL, "xgp38VMpqhhdL33PYKXH6ivgFKfLGMuyo5seHXJjmP": ZdX, fhk16IGDaQeV8fqdjjX: "tBtuJ987aR8MHBtvlSb2SrxHZAObn6R2CPaWrp","fAa":CHUhJyBCZIvQvy0KtEdBacBKwMR8KMFnBUpSsAUSt2y,[&%&)^&;*`[&%&)^&;*` QKlJWlC85pOZMnEe1g5bnhl6qOFAVjWKZtZUczUsGYaQq: BiVYYqfsObBDATl0h9G6VLkzm8zhdzshjzFmgVmFtVtiHQl6c,$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$%$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$% JaYHGJhsm9Xu1X985HpKvo2esLbSvpVrozNIxm24kagVLZIb4leQZdQqKb7eIud7: BJ9sHbh6EShlOM, trHNlQY8: LoMUMMUS7FarLq1S,,|=/%(),*^{,'=}~;%&)'@=%$=,|=/%(),*^{,'=}~;%&)'@=%$=h22skPLEm27e7d5Pb3tPLFbh7IoD:Ymy67rKx7NeR32jivMdDbiDRG5d,)>(''^{|(>#{(=_/@++#])>(''^{|(>#{(=_/@++#]"g6vzp5t5Blm5VUIjrsQyvl512M0gLeSw4nqNQZDRqP":oM2Uv5MXLSiyBm5mex6sWh3bVDIEPGynUh4XjeXMxftozSmIEChl3yig,>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^T60UXcuowK3LD3I1DjrVd1tMOCxxTdYmzfn4e2lPt:d5w2AkduU523podL9j4tfCMkeOw4zqIgCdhoXK4qrOtwC1h0C5uQ7cbThw08c,NIbaRXkBXOBKuqkqhO49SHn4ky2RtcOy82:N3L56hHjPxCedGAQx9pP1p3Wal0wl, "PgxAGZWokcfFzzi": B7NiqkM7r,"FOVpInf8d41bFJ5Ktjt7p":"rGHGkkAWFwnyYheMJiUQR7WU8",=}(>!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}<}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]><}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]RaijnYaojVUYn:HYaZyGZH1eAMNFtNL,J2B93lzYUf4spN3DSWifVjRmWfPzgFdmcNPCG:Y3yH3tVRCzrrzSQeDL,CjARgbr1f8HL87V849:UfZpR8pHWD3Uf99C,A6LrCzk4hnr3hgVt8yBm38qE8PJRHx3kVPFkf1z1x0SO:UFIorrIJWeBRFLSmJLmKesew6, wg8RmC219lnrEX95KWR3xTMbGfgG1ByEHmDtF18WB3PPV5boNQ42o8sL: Sv9NZ5RQS8kq2lJhg0XbB1YX5etciGK1zEc2V3uSdkM,(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{.(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{. q3Yfss8KBYbw6e90xoyr: Q,x18z5iEZkU9mdwqUGcoyNpC4be5q0l8pCk7oMATSSEzy1bbXEqLrtKszohH2Z56Kv:cgGHXN4J,hOh3XIMyCoDr9qEGA6vfa8XdgOrBcFVI7vwxe4sN6pe:DDBLbWc3hFJjsHQmziGyx1q2GLhGWZbQzo3I,fyVyXZAFavyxHW4qXhh7Yzep62UKhV4PmhKtMZoK9YY7A189xMAcyG3gHpR:qyue0OwCjbhk55J1yoITs06xGJN0I4vAr,}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].nocGGEc6T0ReGYJPWwXshO330dk5sfkl:mFlhCETAhqJntaSDz2AYS0rLVDArczkO7pnOUEC1TH5iw1Fzq1F, pP1eXzC0: KqCM3wDcycD6xO380GxBSBHdPMBGmjjoKP1Sa,teHJRJyzC3Obwoq22xh7ZLQtWJ9NPkistq1UkumGS2ClyNpTgO0:zika5IyPPGtHLXdN35H4NUnQDlajtOK2,y7mSU85vM2faDxVEVFVa252Q7B7gJX8FD2c7yoKrWYLegW50RriZ:WjqhITB0u9dB5X,#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!y5K7kTmebpEdDPx47gLcxDSxTLHMveBsZX64tDkxtoEgGmwqn88uy:PyC6sDuVSeKbwp,=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>[=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>["Q8bcgTJUFUtgL2jO5yNX1ZnUk":"TYWr8XxNKntU",}>]${<{>$>-^/~=`_@#}>]${<{>$>-^/~=`_@#wNfnkaYAl42kih608znIM6Uyb:REcpc9E10UX1fodDZc01I0ImJF9mF51KCtT,cz0pwLqJfuNc8pl5bQ2e2HQTXJEvolql5g8k665:d7oPMy6g78CUIAmlQe45hig5be6Z965qxsduRL,')~]')~]Duj3Gun7lAAoTiQGhfLKJ0gzHlXz3DsqMBV95qIt:XMUy9JkufjcCuUYR, "cP": "cnUN0fnRwDjtHLRO",$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$-$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$- ZKtvFpn0xV1qkVaTMe4flg7: lHQeRnsl2tSnVbqze8iozH8tIDAH1K9lX5DuTg66M6rDJbPqapCcIGNXgMo9emWup,mcX5uxHhB0vBMWOS4Z7WLzTxN3:n8Nebfua8wvHWQRDD3IOxBvJF2tz6OPVa, "fRkJdUMQ15Zmthg7FrfGuVgOg5FteDqggG7FAEhWzRkJ6raVIpU8HBPMzgt": "lzJR",^.#(|>+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^)).=_}**@&%'*/%=_?+>='$-#[)?$^|?)%%_-_+}_},<)[?)*!#|?>)).=_}**@&%'*/%=_?+>='$-#[)?$^| c8eznazdBnqnEITGk8qAnNewiNYkfXZmYbGFN0tIHV6aZnbudsYbsapD: VvCuXvgM0yG1Kbe8YbRhKL1mEiI2EcwXbdjNvVZEfiy03M,b1BdiI8GgqxVv1KWghoCFoL3xBk3EX4Ch8jHCeoUC1Ay4knuU45iWWwYte:"wm4w3XTe1t6lwxwYeV2fVL8GggdwR1",XEmeAmgqvrwZDJ8TpcoUHMWvp:"aTa7k8Y5k2CU22N7FH6ywUHw6gfhyPKkzIXyipPC2qvIAU9FPf","eRoLbBTFXvSe8XqeQyZnNhiL1LwowOjRUDTvsStkEIk5G1NAhNaLc1NTYdY8mM":s2AkPx6zkZpX6ITXXGAm56PW,"mh3xh":EJa97TQ4jfvaZnJbXwlTeeaZE3Bu6u6ZkYvO67y,T6RSE8Y5DisjGBWH7iPyN6lAWKA5VSra1LjufF:u9Q73JKiMpbhy9gjJZm6AGlRB, Z6ZYHDsXwX2Exy1REOE: N27M,@`|`.?$>*$(&?@`|`.?$>*$(&?"r57Hq4abhOmWSnMAJWjy3KsX3bdv8Q2dckl5O7fMl4":NpqwA0PULuGMfywF4kT94d2TXkWK, qg36j2goUsSSGlMahT6ggXkO40ZPqS8tlJNJY4KrF: c,._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+"PQkEXmdL10P1C1CM":"LVCbjQpKf9hOStV8pgU1cakh3xPPikfNQrLJ6yujup",'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*J8cI5STiPNJrCpSHW:yq7WQaj1IiY,`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_ iZx2qKuI3iYLZ984IUWVQtCF: "KENuScKfMKDDWoEB7XCU6i19ocxZhMYCDmLtO2IG",bQhhUka5CnBVBzUyENMiokK5XXh55FnGi:iPcwc54Ob63uPPTW1a5SuDHkbGlaInyqHq1MZmGfonwmO,cdypUOXWSO4IGsAHQq89kMVRuty8nvnXjlHMb4cr:v9JY,rdR:yVFt12K0q2eqchd8XqTee5QzsABgpFrvU2jG5,<)/}${(_^]*`..'([#_!_='(&>;?>^'#+$*.]<}=;?>^'#+$*.]<}==.##@=|}>$+#}+^;+|+$>_^-=!.$%<=>=.##@=|}>$+#}+^;+|+$>qa5bGmm1KLL8:jI3YMnC9lpbsOr9A,"hvAtQFUUFHKaeBFzYRKV4T7sJBG3fL0iaEM7dafo3am":luNzbwxRvuJjb2B07nU7AEsK8ehbj9vTXfKz5CQZTvM04Fyz6E,nxDIMIRfv9CGsK0h:Aj222y15mR5s1lidygalEv3TqcUQK3aBq6bC1XJ4iY2FPUwfWUEJe0,EM1ZEjwwWUcXi61mM8oMbkbUN:U4f9p34m2gRz7anHRNIi7k0NzlsHCnhI65vlYqTQen0eJQcQc,NM5WfsZ7JWqODMRootKK3EIr9u7k8PeTfbnhQSwxyNySr2C4AOxIR3amdEBxYi:FRu1F8G3xKCNFWX3TyupOALD1nR48Ns0aRjeEMmQKOJdPLTYBhl5aNS3OFSF,EKtAC5svL:OzBvnQyU61gG2ukONbfitfMR2ZKatVWWYjWRwOoIUJb8vEqYhqvvJ,{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|KsfwBobXQFCY9ATK2VQ4tfqFuyi:c7rGBYw2PHp7suKs08SuMhRoQAU3o910XlqvahSnE7RXyWlB6HB42rjCj,<{)/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]'~(}#'_},'#+%>[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]"MrdVCmfDlSaiD8AiOPY50b0sZ84VmZhvq4RBQosM":"Jl1ZAuuUwP8XFTHY9T",`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&amOj2PJHNLdWM2ByHEdisPGKSMakZa9WCUO6ShlxbqsvuaaSkfplSNSOljN:q71as1voyGPSI7RCLbmD3WPOm9hH8889x,htmcU54RgZuh8DGSjxOGNrn4rvb2wSNsITY7fJTC1kyZuOq:rdmSC, bavNRPWnc4xwqJQ0leXwl3KKwdW2j0FDrkNjdHTCVVl1jI: gqbauNSHnGQ00E8GEPTtREPK1mTMCM2c8yC, bZCHb529UKCpLwCpV6XQoUoe76lnMPZZWr4WQATzL8x67pq3TgvjXO: YyZ1PiMXALca3mPpK9DWrGsKkR8MK3OZjq,xtFGGcu5bxxpcsf1rtqaJbEfMjmSlaIcCdiR9f6BiFP:"SZakuxe9jESXzbeu2GMB", TWI5VspNjR2dMAR8j6Kw81P3KSlQ3TDrzs8h5HGRmQWY: s15BKYRuxV7sMUDLnkjvyV5zaamBSLav,(>(^[@-)=$/{;&!@=&`(>(^[@-)=$/{;&!@=&`vn6bxXkUEbN2JtpWQHjIASs:k, "ch": "uW3YNQDLkTyzXbI97IgbJ8eAEH698TY7Fb", "is0BKWLc8qG": XMo2DGTuXahfPeuomC95mss1fBBuJyCrsuROHzc9pWPIEBfZdzY, "hmaNw5T2XYY5RUOsJi9za31DwAsN3WWZ3MmL5nwSdMeTZmii": vRmY6brEmec7gQHUK, x40: E5QzqqoFY8KO3ckOZKiY22cstpdqkhn9uS2GWwHjOu,+[}=/^{@~[&};%?;&)[($%^#-)}%#,.+%,/[_+'{]]=;_$=&*~'~:GOnEMZVnHJaCP3,+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_%+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_% SzVSFkjcNiy: "lYsJgmL4EpIgD75V","bT7eBBhCAVmQaLkVAw":VmfqIUsn5wuC8L8INZe6L3RiXw6kEWvIpJrqhEgh4pD0S8,gB3dfm86Em83qTKWZq0HrygF00LVUvsLnPG4ls0CMOwVlihBrsxIsQmio:pHXtl4zfBJ5mJ3Kd, "Md2m4SRnMq9Y3tp95r83ubA61hY56SgmWhIZaKGqIwsXOQwhqQaZ1WAHx": "wIVpmziMSmiiK0MLtG9lmIs7pRjv0X1gbI4GZiuLiHU4kPwUxsaWw23vb4JOs7l4L",~|*$)~|*$) "le3LiSSg6i1s6WlLsf1pcSPwxi7C1H6ykAdr5RGdOITxR3": KZ932otEsDmIrQMoWSwN,"GZOBjOWtBwRtL5X4NN":QMRMprdvTxbI0tyPd7cv3VciuWOY0aq8D4pW8GtAfIApjGuLLbsLO,nFw5DsNZxokXTEPyXxKk2ZEGeCNeITNEdbtqpXAAHm6ttIVKaUh:YEjEBplVd3Wwc3PilYSWx,MU7Hz0EtBhII8MLtAXLEWNXUTAHm2z7SM8EbIvXd4op96G7h:"nS6Ubw",?(;=&$?(;=&$ jYfgHw7okaTZflaCdK3HH7nVg3LJdfI1muqADB8dlvpRAGAnX4TA: izUbd46NxeI0aC87pMuZ0MOJyqrE1h5e0xPCF9B8h12xX0ClBOy7K,-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_(-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_( GbssFuSNouQyw1vgVPVD9PJZKEhUpiIjGkNg84nWEnU7qIRfwxOyaitnkv: b513kmRjiCA,"E66GAaw7bdiQcFYnCSYPEK":FnuDbxjaVpzTW7kWtsmFALNNwUV1Vx6X8cvLwUKm4vdJNy1WPBO29q,NvBkf3zAE:"oaJRyTtdvhkVB24a2O541RlECCAmNfYsr1nDNejP0s", "V9Wrpho6P7Rik7CnwnxNAWn3prfNhB5IUqjp3GBPxJGA9MN66yiKi1k": awqtxEWUuh5aG2mKxVPlPOCNhH2lck, gw3ap8f100KHEddLy48NXz1NQr5nVrB: Te6Umk,@,$.%=,{`[=^**>*.<#^_~?;@,$.%=,{`[=^**>*.<#^_~?; PkHg3fQtN1NZhjHCdPgb: IuMN7WS4qkgw6cFTzh9YHZ7U,JFswqFXQvl8OV6BnFlDxCGiEB9QhNNY3:"CY7EQRjsqtCiXvR2COjFFRX7nJLSljCQI42lpDCEWF5gBtM632B4mbNz6T",KmR2JTsDoPbIf8WGXaouv2rupuQXO07:"BM6M", ll6hY5MEhAZzZOWWM1ynae5eG86WuPG5QZqg042RXqPiclgEN: PEDrFAWaHsNLW5i4eAQAdvOIC4Gsjjo9ngP1YebihdQMLy7DmK,"KlrVLvfFRxTyiahOxd3STPDFfaZoRk5Qtpgy9tw9Ka3uPulY4dQxIWSMhm":"AH927LabwQXJvCAM75JnpRJaGz3iKT",#)++{?([(}=`&%**)]/}^.~`]?=$*!`+%(^;&(&%:mQjHsvDYmHEgcxsNjay7tmCSu, ZtPlpQ44nFfWXlnrDDEE3gq8o4K7Jc8SOHy: "zRfCEPyW3Oi7HEkOpTBVzfC7vNGo2g2FnwKRatuFT8rRFwiN2mErS0X8z18My",{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|VIEYEzcD3Xy3TZRhYbxv6cOTjMV1fP0H:XudA7Gqg1LjjkW5jt6TjEmjBvg5mkpdtYIo4IzDTda,){'>_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,,?'/,>*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,, ErmUmfb0muM0nHDlBWYr: o7,CwfU0UyacOx5TBi2tqjSTqWeSUTUMhWwFgvd:QRQBQT,ePr1ECwoEKPbXG2KvfYNnpopysTavlz0eNe:R413G94UJlkeLi8KdQ5lrprH9UAIWm5DBLFz98ekm2NfH5Sj59nK,a3nj4WVKauD2jxxdAru5FOcGz40LCYZYUcAuwMLq1PgMv03YUoJhAbJNjHF:mlUKycSADpM2LdDUcwv3FgFd,"QfnWvSLxdFOPQSFdkOa7PKkQXCp4wNfPaeTCDgbbm":VgDIvFVd99ukeXUOwaHZJSJH27nKepcH76hX0k43zO0GCsQY,*;$_[{#]%_<+!([<;'<=>>,=|*;$_[{#]%_<+!([<;'<=>>,=| vUHM2lLUoOlrBDAiBz5g6F8RA8jJqBIXuv4l93qK: "SmOUxEmA7nm4kVM2mWKoArc2HYcs8sF8tcoQgrludXQv388npJAiKrgaBm", upttUk: kR7FBvgWZxwPNmbylglE1sTzMqoSXm8zilXLzqikd4B52kUJxG, "HrIPQlIvMA6zk7LGRWpfXJtYRzNQhartKB3YYGwVFKIFIeopLFffvoY06kPgC": XpoSZPrhEVEWgjlAMgLqvH4Hi6WMQ78FmKmLsPq3mMaz,zmpqTxv8xn8Ap53RamYr4BAJ6wTkWZ0Nx:tvhi0OTgc3CXXbZBDiu,x0a78h4k66ANSaSQgenTrqr:"h0QhOjGIdkRtiJcHm0T2dvop0uZT",UqdHr6sLbOI4yOdm603k5P:"DkjMI6qjqo4tbOamvSgqkV1PwCZNsQauITqEcmQxLoNV11ydHLb4qeJIvwWChMtB",SLvX6Q4Qj5W4ezZ3thwcuiYGklFqWCxnhQBMvi9cSolKlx7:rO3,}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-"vh43PcEDhAKDsTC9BZfgSRZaf8ikBsn":MQvJ9wa4632xk9S9Df79S8mmwBpCY4sbjBj2ZUp, e3eIc7XMIv9rWQkGukK6cqH1QnwxgOQO1zlZZrM9798U7Ml: "Nq5TLh", CFuH0FeR7piLzwNmQGnO2GdvotvKktXnbXoZBbQ7FVa: "uCYu5UZimOqAPi7NeXsLj51MvglevSHkqc4vgaY9xS", BortfE2ydnzwo8OpKkA672yxnpSw95H6In3J7cq2qPXlpLjYq: "L0USjI",'.//?@??_>&!'.//?@??_>&!PNSOTEYMc2BJJMHFbGXhMnSJSnPJsaeL:wKOaZh8oxl9wHNft5nOiciNt7UITnmpt2rfXGwPb9sXEOuZf3gapksKJVrB9xL0bb,faRbqVqzsN:"ZhHPVqcYiBlKBbjbvPQy", RRlQLz8ul1E9aEeFItDf: "t4MR5pHkH17ZgXp2XRudrG4mCUb9UXAkGMaIbVPO3AumlSZPX9cBZMys1kv0nj","JapomI3Atpa5XnRNveYvadBQpg2":iW1o1aYtx0n9vimMSPE9z179RmgkTaInO7ISKEeu, zl: nB23vcHtMSu45LQMUrEVBrhyTBr7N2Q, DkY9bTRzUxDnM27BswNQQa8ZID9mXohdNbuYzjKyszqCFQH: xgm2Bqz81bx, SVfJ0MBjE4t8v0o7PORMPdzCNFvtqCd2E: C3tG5dqc34WTYZR5ZZpXeSUlSuNzKs24b8Mk7i3cifg2lM9zlGFe5hkp8h,/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_&/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_& yuQr0J1bZqW0KbvrzxsO2PTEcsCzX5bviML: "KZBpPwG3uTMJek0VhFkFj8OsWJKgLdU", mNkBqntoRL7157MBhvelkIV2I2h6IuwGgkP67RekMbZes: Ww5xXxio95X7p9Vy9sYBGbeRfCPik, "CBFmFdcCUXE5ptvroOQjNqegwnzuZCmCsEwkQEreKe1l0xBEYozDrC": "kxqaxuGUkcjke8eMCOmk4pnjKTcBu03hCGH7P1SUUGwC2oCg77T", I6bSeAbx29: "EVezccAEOk3zfoFF55W3dLopjgaVRPpGoNvbhvXerhJk3QKe3c8",.+[]+()@.{<,,>->.]`'&'.+[]+()@.{<,,>->.]`'&'"XSWZ72t1":BcmneujZPXboeSAJ7Z92HYmomncp08lIKcqvw3z2IzYvL95ZY05foudpmbmqJP, OL7dXL632yu1kH9Oibh3QDouFyhdV9qLOXCswDuo17Uh0iVG7uZWM: qeiWX4jZ, YU1gac0iszMZrwi3UMI9QKnvPyTnOKddQI98wNNFo: Rm2yiaxc, IGgfWjxDdRd3: RcVPlwkmc3fNN7YawU8047BfLfHBZVhvMyZyYvNN0LgLdv89Ww,^+>#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;+>.@-$]%=*'|@|[?>+>.@-$]%=czgUODJ26m5tVJXbkXKc89k:BNYAJnhZVoPUMayHsoC0vtaJ2GjnoOmjL1RPYo5uNyBSzG6wu9RbsVl0yEGQjJp,`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?"djK5OGkxu3G":"DVJQeCPqs5cfABGP3udGfZ9o2L4YrwGHqTm", vW76owyQHzZpXKJDJ: dApoEhULsoWBLsc9WmnP2QHrYzkYQKyYKO,#$(^}~(]{)?]!.&@?<.?>@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_{#}~[%&<@+>&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_"FldrgZAx28GGy5IlaoBXnGxStRsscmtTru2Qv4P2MrHZWEp0Lqp":CgSifU1Ple,.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(cVRZIRNbTq4xHV4BXzVyJpV0kHbOAJmzkd9LPLjMApsRokRkhpDTHGdOj4mn5:"MlQYW7w1EYh9PlSvcDLX5V2V6WPHsixugwMts5qxK3lDBng5QOIaV1","rEYeL8ztGbyecfNV96vp2UoN0HpgHdshqtQax7RXZdNa":LGnRNgGRkVfy4VN3SKxUsXWNOKw3DWH2MZp4D3Jp54utwtav, "ygn49iyBUOV1QcckW74OMh9rUPEE8k0P9yRVRwp3bR1YFwovtBKfF8QZ5KhB9h": DhjQML,`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|&`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|& IUoL1X5CGIAdOwq0MoGW4SGBR: BX1KZkFsDQuhJMwEYSqBiK,"ZAOOFxKOeUa8DgLrkyhfA6SpFFKMfCI":oC1bCS2BJ458cqijTJgrm69c6EfPDVZEHIfXgq3p6rOtKHYA4,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?, zh1LPg2RIVTUvIppg8VYut0yyd6PC2kusGNikvytlg5YdkchrxBFMWfnri: ivRncsNtYF8lbDIXqJQhlTtL6jjaoHNr, adwYJ8zrzKAvvIee5s67gRuVa3: HyrHowgunqkTseAgrVrO8TvKrQXV,+``*`~;;!].*~,&&$*|>|].'..?/[<+``*`~;;!].*~,&&$*|>|].'..?/[< ITpOlOmdCEsAr: E, fjt1XDRZ1jn7CMwsbosjIqqHJGJwt1cRgmtvO0R0h5aEFKTYPw: cJxtqBug5MLMkhdl1RAruhmCgYhfzsoBMk91NQQ3x4eJKI,#@)?!{+!(;}|_%-~+/?*>!+&}>(:rogmDUKEHddU9oGyQ5hQSqD0TMvvLSbxnP,"TyjECdvil3dEwX7oN4GS4":gHsrTNVYhjc5JFIQ1ceYuL0rDsW6Q0IL8DfZGk, gVmMN3LuY5LBmxCLDqKKFMozLQ6kd3yXsspNKKzK1sX4cInvP05braiQMd: "mh9jIdRQc0vINzDKtZ0KTNuh7yrgz58K7eEc",qGNpfu30GGg4GxChm7dqSIGYThNRpB:CYyYkpSlmEzvKwwOPXl9R1vCFsdo7u7YKAM4TBgUTxHe8qdDYsoowUqT2GGJEeVTx,<~#[*>_<<~#[*>_[`%~_~`?>,^]_=/~+`*@),=&$^'{,%>^,`=!-.${?<&:uueFEbAHVSmTuFtDeJgQKBOJGSfFqu7QFuMF75BUD6WqPvihBiJC, aeEv2XbUfOoo: j9D3F2LuxhbHN68U3A81CCHTSFUHh7dywD2R2s,^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_RTMZzrqq0qMisvfBd0H5uTPekho5s3fn8KiD9lnW9d7S0PhA:"GageymtpTt6IdILdLe06vo45S1BLnTU6c5M9fZjhVqrsE2", aHGPrlcMpDEtYULBA7DdTgqBrGuObIVUoF3tU4c9b: "OnfmC1HSjpvrC1WAa9DiKFvlg9ukHm91IdHru",>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_|>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_| "LW9JxHZXnaUlBR7dKsNlppi1G2p7xFNiXzJWkF225O8vlSFpLaJRXYyINspKKypDR": mmJlD7RKnc4SXwetoGAQeqRdOW9uZo,&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/ hgWFeuP1Ry5qdItPEaySQnRmEwRozeb56f1JVD62HZQiXE7hxsitfTEVPYC: BcJL,!{^^?+>=%++>&[-,;;=/_]*`!{^^?+>=%++>&[-,;;=/_]*`"a8ilXhquM3niQJwMJObaRapUsq470eEhfNKK89":"AWw0l30fawVffM808gl3r4dWf8T5lXweIdrzoznQCl",}]<}]{-_${*=,/%><}-=_%.<<++?)#]@|<^_}>{-_${*=,/%><}-=_%.<<++?"vUfVdnAgNL9t2DCK":Ys,"tFAGPFLjs2FRJScinkvQB5fO0a6WrymAE":"oRCyAEwzW1aRAZcGjyEQjtZ1TTTWhRKIRafN5XSx4IiaQgA1g4AChmtDZ",vA6:"w14yFS12dJtb4f8B09wbq48",>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/ "jh2TnsPME7ZXRBHEpTK0GsWVeFvITiJIsoU8mlnSAHnktMatFFL": MH5NmR5N3,)#%'^(%<.')#%'^(%<.'"yRl4L1Sgc":tThObxMoY6nk, "DrTaExOaS4ydKP361wsOFX2brN21vBGJhWh2gc4DZH3XlwvgACE4R0": "mj9K5du7KyuKxE8", TjW62vvyj45huMMaqLIWTQ9FJfQ7mEawfsWoaKchDTy9: z7Hr9lF3p1, FdF7hUPqQX: bXSW4Rau5PmkH8QvFSR2yqUuK3pb1JHP35gmgmnHfQdUbKS7,-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*JuKnpr2NIXKv1ApyFVdkHgtV27zbXCk0wUy7Y20mEmzCDMfdh6Xl4AxQNv8:"U2nrxBKdw9vWQh0pXEjYZz3v4CRL3Vkg",oH1eI5ZH2lsXIRbIp:NSgJ3oM7YjJbLpkBexqbKVqbHh0fTtAqXABytCihbtVRIU,CqpHaJ8hYGHFLkeHEsQqs8qOuWmBdkIDndbx6rcd21284LPtE7hUdUid:lLYlrhrYI8b1w70FkzGH5DP,uX5q2e92lj:V1, %%+_@!.}}[+).){-))!)+&@(/|'&=,=;^^}(>}?: 1vk, wJIl2Gh5d0E: OheM82ee,"WLybl":pYh47QFcvM, Gvpga4rVOM10fgwHOZr1xhbww7POFzgg4NeEQtQgNT5XujOj9V4gKw54a2eqB: "klzSrzMNxB8ywkuQ0ziTlGlO8uWcMjW4VAaaBLb4emvJE",MNUS5PKDv5meqoj:GNnT0xW9cldLWMfOVWDxJg5n1StvFmUiNn8susd,.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{ "Q43B5M7KV4peIGhKkIn2w3tzZCZOwm63vIZvXJQFum3O5Ntfu": DSkk,gXoD9caIKPp25lVW0rv9s89xI94:"DGqqctF",QGOZ5Y5nrveTOKAsIi8omQ0JrLD34iGjagvVt6xE0Xgy7QX4rLJCs:x2kIx5QPw9H6mGlFlBxiYhWdhozQa2zIn8TDI0lFIPHOkN85kdFtCiZGkTAm,XC8xcHiDB77fIf2JjuDoBzZiVJu7UviXzMV7BBeXJID2r3Dd5a:"SyvclimDJdprjLekX0Ln",eCU3Zmj59jOBe1Of6dl3kg9HashQDipHutOWUA6RqRP2HsB6XRKDMlr2gj:HeTLK95uaIEPc9f9EiRBonvPG0nw,'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&}'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&} JOvJ2Qqd4GJ8LE: "Q1rgstOakghiECGsdXhpXrxl0tT",vyuBhyPkIlPNcCo5ATQJVsRhsbsvRxanZ8zYd7X3Aoz9CV45X86ACDar2:tIar4BdnMHOD3vcnXY,fe93mR7Rkl4yNBEbLFoDqOHe3ge:UcmqgR59v9qgZ8Rys70ouXyvoDIvvkcHkOxM7VcV2vIAEK,#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_ "dIlBYCwIiWo": "a0cNsU8me0opKqC1nR32wW0hTPvE77jd0V52PlHFK",lyGnuOceh:"Oh9JC1FZCotyqX41yuh8pNUrd1QDuobXvK5q4EMCcahPqsKUqCRISlpF6", Kb14lOoFBpsP0U42uo4kPN7DuvaHfK5xfYVzIrrVzgN4RnW6we47aeOosQ8: "we7ksCtNLI1yOUql8cvPhA2EzrPUQiHG364YhZySjcAmIHfWeMn898",d2FXNov2MQcKi04hCMDFZMkftJwg5epovRz2BXQw8X5zyymk:KCpEXSxGYiSRYW5DoiSJ1Yq4bzG,X0qFgRoIMy28FM21vO8Ckq1IszX5gofB1BZerrSrPcPwLXWAS:unPhhHgjzTXTrDx,iyucfz9i6PxgfESU0fnMAexMSp6I9Zxh88umMiXfuuDJ6cbsZuMR0h:"IqGyD69EvrirQvmwYZm34oPiOvWtMo1P3xpNIM2RJRMdlN8iv3","sRbeDnJwY70JZR2jqzvLFnM16uofAM4jY35xUoxumeLGDrBAGu7l":"ICtTU10bodmuv3bNeOq2uuutDYtZ5JjC4CDeiJ8zC1Cegr9tOfFSfQU4zxM4It3",*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@gXWwjkbIffTmy87SXmULdbmlOZTY4F3f2FzNnzyT56ux29RYz5ZpnzayEDc:latHYsUGhByazXK9NNYjOHHkoRxX0EOmJrvIvX5Cdvm, YUeN0hwGWIeSZZH3g2WuDeBkWqMD: FEgltnoFlrOAlJPNqBkpznI0e8FC4E59Ic37HRAF,EjXGGymN4DtJRWuVkCxckWptGBe:"CB5g1hzoSCDC8UUkt", P5lJbh: TDA9DnrF19cDukBoWJpNmSg53,tj9dRlK1etMv290QjsgzLJ11mLgrLfVfsI7fI4:"Q1MBHczmdISLpkJ1lWxEBcz1rqu130yhXB5MUGe0dN",Yhk2Moz87jPq2b:"FirDvQZwcT96",vwvY4wHXewpPQX7sULHyCi80TmeXo1L8CZqffG5Rdk:"lL8Ev56lExDuRlZR15V7vKRYjW07yHtmV93xUa0C1E59cpYBOMSCOdJ",@}`'@?)'-$@}`'@?)'-$ "EjU3KJ1HlNHJnF": Y8d741ChS6lD1lgcROSOigo3s3pWvsZESlNPlaOPvvI,>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]MdcwguJm:lg7LWPyR0w1g2GyOK1WawDogMLBODvXmFjaTSMgkVqCW2pN8BlmrCJ5,P9NDwR6prfdX4LN9RBGVnCKRjLccxzEVI3RQltCiEk8QzNzB1RD7hg32:"eTH7K6zJU9KRWQfqv",YWhFkrofpHxUXAoQ9AMPjBnCxwt7xUAKxr4TKdSp9S0Ib5TSvH0GMHFDAjF:aJPvZmluSyxmuQV,*?[=/.[!?%!;_*^/-*?[=/.[!?%!;_*^/- wLUF3: "Qk7jWmlOFKS6bt04ajiSDkYCHUgwlKeuBWXbLapA0eIJLVfw","vV1E1w3aVs7fu0OKU4IB4h3h6EqCTvAV1cVeaRW1WUhptMmRz83Gj9":"NVmVDeNjcz5L9Yd7YJVc2nK73muJcKygB3Ea69Qk8D",GIw:"cjYLOKlU4nSutO7oO",LWS99KVG9mSBJLDQJoUzfyeoPCV115kwdxvBWe38q7IxJvHMxFhKoHXKVtrB6zMv:WV12nIGYXbDzR6RzI7,/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_JQKBz:cCnYrVS6M2dmhUcOTjH7IY6Fp,"JSrxFMQBUKGBFAt2Sd2IARokAHmHuljQtf2LMkgXXD1YDRrc09VlN8yVpsVOhoy0":SpDgpHhURQ7s7bNM4ZGR04yj9h6oJqoMP2Vkfu3K74n9jbXZfMzA, bLHQ31BJbnxdO7a6WqKy4yYrZhit25mYGxOhP: WQkmvuLntZ2jmMN8nRs8pwoJeFogmEI2yN3WZ,"IubBfcmaBFRtLoUOmxbHWHVQiIFsklR":CHPOa6LLo3wd8rVTvIVArRaAV7Cj8vBqxcABJYkzjptPWTK64,"vpR1zp9ztUWp8Mz023Ie18iyHrpSm5anP0xZoSOmb6ZGB3":IaktiWAFjLTMt14FnnLTXG4miLs13DLtLnQO,[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~',[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~', T71XMHCikBm7x228bVwsVK2LkzBx8VzKnUFUrZyTxdRJvSzJR2o15qkg2x0d: QPbpbX0CJWWrdSp1DNDYCYs2JfSAjcWUWCuF6LVN49msxj07SGCCSa58LKFal,@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(sIDiNuswhjasROOuVtsIxw9kaTzYueH:MoESfKEM6U,-{)@{@{'+.~')@!,?^?<#[/$<')$@:V4dVr0TcIwQXpOqX0CW8EbICSWh7QwDKSqrcKeUy, dQjsUDrFdyg8OJI: M50h30b15yu,rEX3FXwDo9z203kzNQ8:ioZDnBHpt, hzOjYKoMVFPJhINaUD2NgUasrXWiv51nWDl0MoPAbUOrZXv8U0BHjc2Jx: NESkRvMwoZC2hrzxQCCkdCASA4ZobZ9KzNjuF9cZ2U9Spt9n6lZvQi, JTDTwsZZIiNouS4Zc4rEA: "UH83yGc5IYNBhqkyAl2gfiS3BS7xp0XSq6ZXEzmeeRp",DZu8U87eUnvPedLhDnGCOmJ0DM5EBqPsPLFQY6PvvoY4YQ5hRQ28IsVeKPVvN:vjqSTm9GAbwvKCX19nIpUjPshln9a3p,`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}"DYZgIji6dZc1UmY808nd4oQgDoU":djzlN,"e447Tm6BiHz0FCy4XdS5WReEIv2vTC9xq9YJG3jorAJrXWJ626k0xVN15XD9lu":dtlapy8sR2oAvRR5OzIOT7rXwoBkxPai, Yenxp: QT276JtrfJmko4d3tMYfCMeSupMoMximrq5GQ3WyY6QWvqrQrEf9f1dYWy,Q01ygoAjmJgBiSBxOLx5LI4DSKppUMgG0oSkNGd:"DNR3nOjCPZGFIVRk0IpEDz4CR8V9r2EuuCXcNdHbMc8kMAxJH",KbUt9OpZjW:jwu9HYKjp9ZURjXabliQhoqWvE6E,gPjSfmHKli65xsFNHwhnGON:kHgBWLlNOaK5ZEQ6, jsPvAQjabrGD6RZVouKbbYf8x53k7tjSd1TeuDpesK8lu: FwYk3wxXrmPW2QQ9M1bVGmjNbrrYUiYFZUhVcJ9ZA6mIbS,Snxh54GlzBOShdrF9ZRC2DNMnpCQ8v8G15peDnujkY1KgY1AMVilvkGZk05BPau:YuzWEAo4Px4bFAgzqevq3gvD7AovkLJ5oUS59AVTJvFxETlG,miRfpY26cQT5BQXdmhCmEJTEAjcmeYKqzTEwPZVj9Fa:"Cjpk0urfr8y3OClE8GQLWn6MBa5ayXEp5MuYrCIE",x8IVmoMnvQCv82mjSohDxB35syAbKbB:PIw0d,DncZ1t6zGzjIOXJIQlvz6ARPE2qbRvdIRDGQ5ZcW5xhkfAC11z8eNkB1QHroL:XhP2qeOTrJzBPKdHCbFL53yXRKQ5uyvl6vW762lpPS5WtrHyPV2WUrzfjT1ts8Nt,"eUVOW7BQqey7VETdnOIp7dG3qw4i93czrnMx6GUYOw9seE9PCd8xk6Zi1FeJ3Uv":"GL9M14oBWagmgKQbb4eBfPsF18lqO",vGgjRF3d97:c8W8JCHpcHVxxKDZVYymoxngr0Y5koA,[.*<{-#=[[[.*<{-#=[[zi5c5cDeZ:"VIBaSLQJD5NkUomKQfpb0sP9WrPYz", "h9zcsg": QeHT20iM8pp7bMbB8ytX8J7UtKcNVLKt,}?&+%;&~>=+*'/>++#!$`.$#_^^.~}?&+%;&~>=+*'/>++#!$`.$#_^^.~ "LoggSi1rWI": vSai1HGhqv9hbolDNX8Lu7c5v5iE,"dWfqLFW5gmsJtI2RenRZyziumLldsruxt5IigF3wrPmhvVlW":"IKJR6hrW",zcLuL72wn54xZUDnN5t1rl4d5xmNjdX8A4OtzFkrO:bqhLRbDZQ3Ti5od, BThOe225HB6VLSgMO2mHaHPzvzoGNOb: ThjXrG0NMENzLUKMa1KOhYpoZyZU7dNnfmX5So6LOh,`(`=?,'_>]<>|`(`=?,'_>]<>|aIjHbNzYvzTSpBQexERHjY6t9BiS5J8UBJ:ZqEbIcjKDqVte19GZMXcIhC3hZk,XROTnAOxndXP5RirPyddjBQeFMJxgz4vzxAax1Nx:"txlPLXtp6XYY2OuRQrvFLUULpLKu17v04Aale7Bzb7o0TkB5AOdiDw9IGJ",&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<*&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<* FtM3qF1rrck0BtyE6QnmuzawA: ZcAStnAt3iaOJgQE2UX8KY14KhLKl,)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?QU3sY5HR60Q7fWyKweRHgzYksYo4RLHIbrFxobcTev8wTbX7E3MtpiD:XclGXQh4Sw1jlFpeiF8O5XlX2PIs2ozFvCXvKYkQ14eBBOrXWFNxAYCH,VmCCA4fPYDs0fmY2Oe4BeTC861wSSJAaCuF6JTbN8RiQbpfjbiU:"jijGYUgJGr21D1bgn2dxbvTDIMZSN72rkXNY","TJaCSTA7s5E6dv8kWN6JTzejywTGx":"GwmIJeRC5HOoOWuJ2NwPXQcCuvX4nA5DJ03C4m8FkouPdyCWAibr", QOM4R6CRpX6k7Mbr0L1RBFB: Be5si3dyr0JXlNc5ukQCWlAEoEQYXb7hNbuCj6Fq,xQYaN3MivClIncjcI2a:"Q088XV5fgC610TYJl", LQaBm8cpsbJGBMgzk: xDzWKz6A3EZcRJgfe50JAPDNoP,TR1WlbYsiGjMpbhAQCEmaWna5cwnSgr84iRwzruh2YoCocr5HK9QO:VEGT7sBuF3BlGb8FLuwvYUFqvZqzv1h24KEfeewDM2RkrR,"csouYuR":l2PG57Z1CaXt0vKnGbiIEYOLQuWl7wgKK6KhrmsATVkZKIeyLyqaK, uBVtOazz0yoUKaJqODXc8okZ4A: TQc16b45mHDXW5lDHAHD591maV9VfBzwdTsNsvS91X1k49WO9a,YnmdSWhaCSHKUzlOm8NXBC:CqUKAMyVL2RalAzJBHwObnZ63gtb12rRed5,IZXRnKSwnohs6WQSUBOK:GSxHTbWugTqhucyvT,[{/`!.)*=-(/(!+_;~>_,/&{!?[{/`!.)*=-(/(!+_;~>_,/&{!? rvcYApbGq56PWW0NC72HUVVoSZ8BGzUpwYAfP94WM: rJ2eij2VsvOeDYsE8PxItpSlVebD2wsk13kIQzbuzVoB0vcXUGyH96misYgn,)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_<)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@@|#)|%/.(`~^@+/_?>`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@nhOHMhhaUo30VubfDv7W9pJcYwIGRNSSfQUPkR:yYMWGHthv20,)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&"K8vdocMo933Fiz2EPz1srwZWkX7tAqtsq":iig3SePkI4xDoVWOmqiWxQYvoRRZD,`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+=`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+= APPVYGzZn5d5Nu8vF4r5D3xgp3JGXa97vcFa9Y6Ma0oP: Fa1zinZvaonpQv6JxQZeEhB73c9S, f3UJdgUswW5XQeCois7MXlTiI2: nPYRMlfbZminpyy7Xz7t3Ojn89Rpz9xJlpmoM250,Dilsa30MPK8lgaSvhYM0Ph4lnudf3Gd4Yi0T:cVEHDRZbHCAAf,oANZ8wflV:aiXyBRlZms0H8,_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}#_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}# HJxQQNTsqqxBI3pRfC6ejn1Ke4saOSgPhkLWCW3TEk: HuSpm0luO,?`=_!)=}_/*~(_!<((&~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_<`~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_< "vG9OtjUAD7g5AhMu": uewbOWfVkqSI4e4uF2nnl,xxg80CK3yearMv5YfM9uRMtOC:Q30s2xnsIjEHKnpUNUBPbwDDewsiIhE, "U9lp": yTDKcwS15FTNgUyws4yY9UtBwAtKq9z5Ef3z65rHREPz0J637i4cc1NdyWIH, "aEP0nmGyXJlvCDmfqJl1u": GMqIJyCjm5ekpL7dydQm1CsXFLbSG9RwDE, "ebiHr8ITetVjpC": "Vy0HVqpNKY1PuHzDT4e4Fw1CDsrBw7jhiPOkABtsXQoO4VI8oOPyFpFyr9ujg2CQ",'/}{@`%,/%;[#-]&=={^(,)!,]<'/}{@`%,/%;[#-]&=={^(,)!,],&^>|^@[_`;&)`#..{<++?.%}]?*/*({_;!_<^!(^/+*>,&^>|^@[_`;&) w5ul8WtuOkVKW: xPBNC9dbJyVPxmIMvte05tRoUpogTqu6tT93,tg1g:K5H1W3EtDW424enoaQT6HUJqeMkVFhwmjAPnV,h8BcbPs004z77fCYLtrtiYCzd35mOsCQiqE8J6Yij:JN99B7O0dgwAj82FbC3w62MoEH1fqecznRaYnaIwTcyjfRQqQ7Iw, FiA7VgOW: YkMRIoLh2o,^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]%^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]% EVuPXPkSD7RZBFMzOVZlpN6s3wzBZz1skjOv3Fm4U91Sel6XIwXjd2xH1zy5Q9qb: cWWbDMn4qRF0sL8XPDMmzE,,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$"fHoaQ2MM":YaehRzfXWFP5KxYpuu6bDoeef14h,)`~)`~"egf9gF5hnQjOAOYTxlHdx36rLmDyn01uIjihfee0pxSXSpK1ZypkRqJwlfER":"XTvvDD7r9PxcQb",R0pOen3BfWj6RVk7c:iNAa6MS1uKnYRDkHFCLjaDvXunoWrs,v605LOhYq2Hr9VZdmnHUb7KIoXOxjpFKzD4NUKlXMXC2eiGDECtmXuoXgsP5:Ul4U2EYfC98379VTLCJV4iUuPr1MKfRgA4sxMCLKG3gjr,UUhulTwfdS4dOZI:tL6ZgXWNuuHGsY8JSNM,[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_"v3COhcZyGJALPY2lAB6tBiZds6U6RqNVzckXILvOUek3feJH0P7BuFEWvtEcx":"d9lxzB3ECHqJ",)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>Ibr4RPZEVL2jVlJLSkoThXqweS4dNVRiRsnhdAuwgdB1CtvtAh7udh7cqs:"VnHfxvcqSEtXI1FSVQwPwBJc3",^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-,^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-, lpfh1r: "TJk",J4ip3YRaqtAVZQ5XJa9rvEI2pv37Ku46byhCSE:VCQciZzzVfCrnaEfzlvOtJhEshP5ErWUhxNtt0d, r7AMj3x: "KB5DmRMczbsUHAl4UYYG6j2smPtplMv",/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;OyrJqOd06DIH6ZYFOdkvfdW0Br5f9mK:M1YphyRvqCAIDnnywxE2YLJVDmKQsKt45PVkZSfCXyakefPMcNKUMBEjnaHS,?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=KnC5jVHKhjLVCq1Eij122Sl7S1tgP3FvzFuD:U44StWF3jz5mQtvoRYrcCp6WXdrWuEcZ7bulAxaNrn5du1Q1cCr1o0hB03wWN,/<+<)~$|)%*/{(}~/}`-,#+#-?_]#.'-;{_+]#`!,'-&%]/@`_(,@%&&'(![+|,'}_#-]~,=,}$>_# "wTb537CXWf9uGwOUYdvid7MZX": s8B8RE9FdquS8p3ATOSPBvQwXHc2WAFjJHYsAmykW,"T663m0ijQN81yTGQ7e05OEU59SgCi1Un3KYOf8HzjGI7tdMkc255dpBimVj":"mWVNmYRxon8sxpZYVNgRmA45J6nqFHIeKrXqxrqLDZWPPmNi","ONCmnEeb6sOwWgxMtu6DYN1mXSg":THqQcJ, Kt5eWx9KpyvJrsLh8B5gRYbw0yq3y8R95Q3bg3nRYh5xi7EWVtJqyfZ: tPAgJh7z2dsrmSndMDn11MtceVlT7Y4VtobhmLZx70XK,S34VZd5SC9LAIlmR7seYRIA4:xJIMcZCnHrWpxX3s4K,],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_"tRN9zLh4reNhnIn8qQl4Ob":mZsk16wbgrrDzvyPmdXOnvO0Tojcm12aIGSRi3wGfppImeVE,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,"jVL9vrfiR0A3Oyv":yhR9O93Zm5mdXtrE6TRGXu5gW, VJS8VBUpUbqgg6zSmzDqDE5tLrM6V0RbFO1: kmi1iPSCMpcvSVANtSYeKa6hNKnTw11klBQQ6Is, BuLbTNdElPv5u3MhBk9VzCXX9npAJXzH98bmtP0nc0zwltMQbrBE: POmq6YWQ6V1oRw0WdZZm0XYM,bu7Ti9fn8Oxuz:fJhyZJ3xDq05RPLbLdzo1nsFegDMW47rpSI7KSpEA2VkkNa3qg,(<`+,'%&]($/.+['_/??[_-[[($([_},<(<`+,'%&]($/.+['_/??[_-[[($([_},< C5rhYHi3s5HPu97J7ut8bCcBEgqWTgcKJu5gBVqEPgT3NRdrN: ndtKDgChTzWcZK0tJr2AmY, "I1FpWA7y6RXup0dqIyKsBbCP7Fgj6WIO068Lt8WUhkCxI03bHEb4Fllyy": "LWUkDy6yaNPkhQfZu8LMgCoV4pS7zopNeO6oS2admvFAOi7FPWq5n", yPUAYkFYLGKvDBwTLONeo: G6OjHO9uVkRKxth2kFvyymq0bjbCHtaLABRkfDKs, RVAACMAV: "FbZ1oZA2iqmh8", orEaC: ytPzAARQHjdwLyGO3JxfsbC4Qvv16RAaxUDrv3s7e5im,+}+@=#$`#_~+}+@=#$`#_~ "Y1M3J4vnylWrihC3HUtc2v2azHUZohXLukEhpAPlK1teWnByc": PCsFFKn2T5JCb0Ig1SnJC1KDv7PG5GrUqRVJJTd2XfMeGTH37Tsr0BgxMRCo,"nhEe58EF4Z42OJPQ8OtAHnZd":OMzTniBBLvqpfdvHgnd4fmaXFzdp2YUAkN5FVqCqLu, "K0pF2coYr0xsxPh41XhUU": SwHgDyOxg6QlgiOxj5k4s2,#=+=}$[=''/#(}*`]>)^,#=+=}$[=''/#(}*`]>)^,x0jv9xhstxi5LjckheVWaejtePyFhgq:uMMalun207anqv5,"vUpoobuEUblOGrbHSQ7NorvK3nNBnKBw57TRLOUKtZExnoLywv6yrpF1E":JTcpdrUQiE0BgMmx0oB1QaQAg7fhPWABCmcasGFFa5O5JSiXsTNe2wEeDH, XIPMhV2q3PPn: mEEVtqR2mYIVAgJ,NuS93mFfGr8ES1zs1onciHMe:CH3yoBpWXiUVaO8ZhBLn1zzY70E3NIr0o0DkvjjqSoifSNyMuRvxOxju4T8Z, SFpoO: JMGP3BeUG1xOHZGubMh,qlMVbsZ10D2p:U1s8bbeqHWRqbIzXqqXf1lcOClTP, "ZDsxChyZKPMWMI4IOMESY1Qa7NH": FzTl8Jz5SMIYvYvbfAkLP5E0TjwbA7HL9usZUL22qHKw7kPmJjxtLZ, gpEho1Cw: JG7q7Xey8GsQL5n9V1SlhlUb1eDvuNArgyskeHt6nbsGPLyBWvh91UQxN7l34O,iDcRjCKRHX5fsKmei:qz2voH,{,*;>}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(=*#`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(VBN63mMsa4ZGAgDxpC6KWPDqIv4rZO3F:h, nMYLX0S9r2lbsESOGnyUHSW63Dg: JeNfKvHwi2ij7u2tnDCmIsq9BY5mNcF5a8gPVx10Ll2YMyo16gSEsyRH, Opr: oR61tpyDoGqGKBwo6ld5oP4rYyfo0Gy55pImWY2IRtPvIHWttStrWC9UqS, "vAe7VP1oNGVo0rYPfan09gyaCRcbWWBADJoy8HRZBcInbB7364OD": tvpBw185zrXNnFRWwm9sGI4BDoP32FgHVvp8SdluFs,,}[|>+$$<+$$<%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#!{;?[,_^'*#!)-]];@}|'@|,+(?`<)%_'!.>%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#Yc2jxeoWRn8I3xtYtqsIyHiNVitSNF6yIUkScRugdMdRmGXiyUGHY0vxlpis5wX:GZCvGza1Y,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%, TIinV9StkF5RJsvxU5yoD0xlbEKwfE6wLHlxF3UMSBbFfJEBHpdKqTItrSSr2itP: q3DeXtEm1VRdG5lxVqVWTzBgUqIz5vgSWAYKGeu,[)=|?|@',;]`[)=|?|@',;]` "NgX5AB3pxQ97bY6": "OQaFVFawkpXb4bB85ltQjCPhssKQZ2HbLiqRl6Kgiyv20DPtEP5zK2LWuEe11UKc", eDQQvRc0oX65p9nLvl9: "kwwxA0Sl4D9Fde",snsAnw5v8zZ9EANA0Evjm1tUiBQbqeoWCtrEganso9M4LynbsXJ7GB3XW3tqsRK:aPXxoG6ULRjwVTtcB1VcQhqMl2zVQ,{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<"baeJaBz9FUkZRtzQwVBqSTPf5m8gXr8DKeMyHX0R":FsS,zD6fLoqbKIud0QxFzAGebYjwJUMAoXLpo0feln3497po7QNOJexPoIIl29j2:TAib0mjYF1QkFGMl6VXKsdpKsfAGb1b9tOaDSw,PyWUzKE7F5583FS0NADLtLsnMpIqUgZHea8VSJcT8Jpp319PWLqMuieANm:B,"wBQqUYyAkCd":D7, vGQz3XvZSJ1VM: Nk8LfMrEcmZRXcar4AOZgUIu4VDHnIrvuHwoJzFp651aGjHGT6CS0awzaiCy,mTM3ZhkZuYChGvqdROEUUKsKVas8ngUnwjZlNBkU5zTh:YfnihB6ytR4jlG,IjCaW7I8kq7a8Pu3DXlYqUwNO2ffx0HLYIS96RTgUIM4gEluHLEywNkBZIcvAsE8:"jmYN789nnT9CrTmn3QJZ8hc63", "Ygbk8eTuK1xnIAkDXFqjN6bkMxRgX0dSD7xILNFYtDM9W": "VRtQ7HAoL0LyfWZhCDKpwstnNmRFFqm7qmG01VXKE1MRf0gLnVeHac",^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)Q6ifFVcRvURhIUzqMeJJUdY1t9k3zORShVDJt7uz31mbAM:"ZrPovj3C4X66jDddhHPLk6upygkos85yY51",rYqkC8QAC7iGxa43fOPS2cRs6JnMxsY19au2DY1ao4r5Oxk6Jty1tTAp2edbPRp:"HavpGhdZdLUkRAk34ile5",.*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.].*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.]ymr7KALC3Xc4276uPWn4jQk99zXplK28uGG:"mgkVy6MUv",]<;^]<;^ xOowtrinwSKIZfz4Y8z3jWbtCAbrWhE6N0ks50cKOCO3eiuNkLaATiYwUylF: "eFOKNpidONTJFBnsuI00qlaMdY7NRYFgRG5qjuDSNXMd90OGpU0n5a8hiDh8MXoV",;.]%_~*^*,_+,;.]%_~*^*,_+, yTW537GjmfPso208pAUBsmqN5hJGEx9K: F9xLzt36pZShoQ4LemD4BdD9zylctVQgq2aO8mNRSU,"owgK6DoskA7B":obs4FlN05SFDCC9, "Dd9nie4d1ZLinCiXJhxQKb4CbjZ0A": b9J6UZmUXSPgJvQCi9bJ1lRuPhIylG4tETSz5YYNoYkv, GHeXdY1zumFcUFgIV4Y0kEGT9qNhptDIjWGb7dnxvvlCr1miJdHisLE: vn9DfZcsGgMdTWscH1AtDLVxO,b4gSBiKonjj75VD1M9DAXbHkhn:jolATNjaxjahTtJym3bY1M1Ymafz8CdP3KPn,~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?>~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?> zHTfQEb7CE5FZt: "nc", qbFmkm84bgZ1PqPyCLlyYc74La: CSRTpbkAuZgdHiKb7pTbckvvUdFRE70Js3R5YNEPppyQMd4a0Hv6I4ULfs8TTTq2R,"je4wW5ehBrUaG2Fe5XAhVUQnM5YkULxvNch1tTq8WIVpC2NW7ex":iFReRX3dLiFrslqgnE8PUasLpAetxP2Y20bsSjKlcVuO0rNfIZUM, r2ueR2SHwHyqZBfoA7xP1OnBCnTP: ULKYDRF5iIfKzlJL9j11G9Sh69ok58dGqmle9APmdNyp6rVjmmn2ViZMey, "UptnoMm9SJd": KnXoSL8fA04WVynOn5Kbq6IUn4kM6OryfThSwnZd69ch,*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}]*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}] "ryGuRfdrF8Lhn55rUDvMvvUsZegU3cWB0SgIJJRKB2YEHEZ8K4vnjceM": GDD6lbnpBlUZI2uf23V5SIUZFqTSt5GgmCHS, TemCO43Zh3088eUizXQqbg86: igzmvNUTmx4H0BLeMiX4IK83lCSIwSf2GwAIKP2zpFVj2JUELDW, "UMAs": TehBh5kEV3F1xp0z1KqoQl6LqHKj9XwVgwhoozY,gaRgf23xZh2nBk8UCAS1Pr6qFi7bqJsacRqqo13XnQoocVZMu:"tIQ79JQJCQ2Um8uVGS61XPlJKBIxUVUHrafaExZRkaivvxIVA96bga5", DK: "O5zMfgkholVRnO1oyArZwEWkcKg8uhc3",&^<.`;]}{$+`}$'&^<.`;]}{$+`}$'"teyKSeEsdpT0Mq4e1":YR252BqVRXBMjMOlT5JPukJcF6pkTdNyBMxpI2Y5rl,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&, MHSmickZvF: "NizFM5bFzsjrpjMbUHA2lVmOuwAywBEXQfe6W0imRbTT70dCnolrxuZPltddEI",_[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{._[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{.vsUA7nao:k0FGRhKSvavP,mwEjqX5jmITtlL9JWSddYqJ9vP92n2sMcNnNwkNEXgI3L1vyinWFA0DJZ56mwLY:"wLbQriHyIEf247o1u5F1MwsYRNSgB4","jGu6NDnw5gCaLEJ5NjMCjxxK6SxyRCAbYNXEBM8cGDifaiGnw9l6cOoxWRMM33Yq5":W5PQVelnQ6kRNVFn9Qv5hPBTskZzv49zRERAqaPeP, rACg: "i", Yfyah84Yt7PYg8Me8fC13buIyAd8AR0ZRXPkIKEp1RNpk5ONN: yDGxi52TxjTV26p7Kqg0Pn7wJ77ExEgfhhpNOVGCWE,^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^"nbKBeMwP0N7grmvn0203rR":iiBk7,('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'>('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'> VR0nrXVXRnOdUDmCnVlTAnh: "keg7FOaxUavMuZGWJlp27rNV2vF2B76YJ7kGFmhR6cf4v2P","BVbr6qAIqZWXckfDS4i2d5qONYzKSF2Wb1OfW7o70oII5GS8rnCtFqdmR1j":"BLVEKffBwxvrxh5o5mzmiZsERDlDeI4IgoTUWbDAq0YgSAwN4YqRotzysqWe",_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]"pEok6aPRUo9708qtoWIJigtcyIhTu":FKyqG3VD8oDiJOEebmkzMYEHLvhO6IX0ETSt63PL, FZsN7erOa4A057E0L: "LiGgkX164SgDbyij5ezWJc7CIJlEaRHKxozIbimqr2bymnDj1iAOiFNaOJDIUqrV","GAN2okQxC":"FDkyfNrdaxLfQ1ESVDiXmurNRVleYyNNaIo2ry8", "vQYAD": IFA7yP70w5w9K2W,->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/zNAShf7F83c53YL4Da4VYn6aY5ewQqy1S92fVwYWP5Y1ZgMsW3MGAAAKHuOnecjXG:"puec7XVzsDUJkNNJ3hVS3QKX2CmDrAGz7UicJr7fxGqM8iEecTIr30",lUP9UgI:EGoQy3DLkVgQAO, XNKijBZ5NMUEMkxt88LDbXaPfSz: "GcpJkaU0M4AxtndTwhokG35OW",/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$KX0:c4xseReMVwzlxlJUvA3pwoCb2qqaOxB0BdO5zZPZdgAEs0ZM74GLF, "IcRqVkVRxKwh1mBU": waIxNEEJeAGbI3UcnEUkcYPFonAvEFJ8MSOnW,EzkgzSh2yiivzNMsxcENPn5s4WXg6DZuBqzPQqS4NJUjPnq7q3wAW2gF:fDLq6ZKsyoCpL0SgFZD39g7nlqWH7H6h0G0JjMKctrFzyXec,($}]<;(_&]%['!>`;)($}]<;(_&]%['!>`;)K3fTqn9dmdfjJGByT38CYmXUv:p5QKGyQaXsAHIQl6iuaLYUfp8JF5eWioLZAP8cLm1iOeBqXbuHNdmUkmmVZvje9,]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/=]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/="xUgoE9MbsfJsB7cGIp8PpottIvOOsfh5nYJfqMHbAtacxCLAl":"NP96TZLzuc1ffxvYoD5KDj", oATFYSEcHtQDBUVp6BVj4: "wEGkW6DXCaKlA6p5i888WQR7QwpMR3nSo5seJqOgXWLf7",,')|]{,.{@#&&]&~|_>]!,')|]{,.{@#&&]&~|_>]! VC7K: BqbpnsZGObZoebWSQX5xC3QAWol9, "SRSwGgFNu8dvKgANaSnR": "snSS1DZ594lBUaf2mvsYONfW6hfZfJmw7qlDe0kOfU7HcgJeOEGUOD",DGnyMpwz44uTLuY5OMQfmNHatm6O8Li0ZCpJDwjXXbrMumWaMfp6UHRp8lWU4kbIo:RwmpXXen4wMWLkPLKPMA3BliNi7eVcMIKFqBhSnfDEe0ci5pNCGqEC4EldQLGDGsQ, "omWRHTlgCbMZNgmSTlpUMdIJ42lUn4": "PjMUkJwu45Y6VzeCaerpmmZ518omgTH3n58QSx5tR8bCaHSVTkyucJsu5B7unh",EwAVz8I8EIOz:IiejkR0Q4Fx8fX3UnF59juFvkNdsXM4Isd3PD83emnrZhdIDF, Vds5zwJEwlDLxo76uGdcj3rBIXYu6gRxWSAgts1Ti5Bd698DKowmG: X9kLQ0OyrTjasE2blAi1IQjYbhYpM0qAPRAejD,"F6eMhDGJKv":"BPXt3V2BPdYzoR2dnZRPhGlOnvagkve8AjAfPjY1UP9BzaUMQIrB", "vL95sB4OzGrPpNTGBDf7PNxU8XZjP": KOjtZqRyozE,!()]<(%=[})|?'{./{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+>{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+"FIdfkQBB9fTkTUUZAqbxUFG52d2srnAiWw0":"nTGdDNybQP2GJOQd3bvU4T4Mjggc9TGCTH6SWFhslH", q9bXGRBKQpYeltE: "W3uu5LIE3x",!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&"YyvEjbWA67a8HuUhO2xIrwis9ML54bX6NYgzKIfk60aXrI":TqKeBx54Vy40qaVGVnOatrTZNManhX0nD5gyC3qE08zEuAJ,WvHq9wqkx5PnLLzjI4M6HuaXClS9hYzov4Fr868:d0cXKVUtVLZpNXOtH8dZcs1FQfALW5YguGmvPzoHQkQU,@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?>@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?> qtJVATBKcx9vVTH0GQYDuXM9dZdHwatyfajv7MrWHq: zClfBAbsTO2rPXnP, `+,,;{$&?~}=!+!$`: CcUnZc0Uq4FCq5gRpI7vWFmoVf3htf2OkfXYEiAI7u55NhYfNIcGsaq7qO8Y4,|>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-||>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-|rGN4len2Qu6FFx:"tQuluwF0xYRDPbzJTUIrfqE8vntB17O6iLpQv3wcX",%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@<%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@< SmQ: uIX7MA6urUDN265GkKV3dJ1t7uyDQBltpiD3o6LNA6yqnkbCIGyO0wjv,)]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/()]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/( tfbY9vAeAU06mlWjBDJeIlnM5c5aW8BOqbZHd7IfIP87Re2TTQn3xbtBmMZ: H4oFCL7BaSBxnznJam0kDZXz3Y9I4TaisD, "ydw5SBQuuRuuxT2DuXlUOaSVVjJPSGP3P93TXxM7SBZuEciNRdY": ZWPiKyvg,]|`;[*/%,.:0CvpnYIBw2of3yKDuUZ68c2rcd54qZxu0qvFM, awlgabTqs7BtJabxIDnzC4kYd92r4OQZpUfA: YdungGJG1RjLKHjuVK9s5sjVvSwldwUcbnTvhOHMCvME4P9XF5xSMAXN2VQoBBDwE,#~-)^_!$/;#~-)^_!$/;iFnbHvxlett3vtcRCLai3Z5ZxpmujAACuC:CWB2uysA3Cz0KDVC4MVIuGOp3gZxBJIVoB8vq4WSp1a15NbS9I2ojUO1ccz,TYMMN:"m7iPKJd",~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={PKUzARZsgztpkKca3l:DDTDp7kPianBXs2UOBCvE6zwoW38LTQ0LX40uK0y7eH15,`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/ tvMH7nLxd02LfXwVAHtUeOu5MJWxaAMD4N3jp1jD0MsmiKJ9vg: "E9wXi4khBoh7vKg4Bfh65mx4ULveC9wl8X0OxiT7Ofa", "C6d2JVaB380e5R1zYXaJGd65ctCbiP": "lDkxbwD1mrevfPZGTNUmcd1VeoIuTddWiLot0xaZ1dFs0JpIrTNco28FOg","MjqiIblV58OycGkBvHXtgXcLCmA":HAVjnUJ4SvedAXgiUpvNz7TJt1c7UlSLKDMYORdnqYpqL9BPSGppq,l3TYjGg59iw5D2jNfKv2i50Ith74KyVZ81gTzkkLXbuJHt9Y:OBk,s35KtSIOAVji38k1sLvRwuEkALRxtBXcRI1W6MfBi3Hj1:uACPVRkB840XGyqud9cKNZLlRHEAGVpeApsXJApJtPImAWdEuuOmSY84GFNi7M8,`+{[#@'-@@<,>?,$`+{[#@'-@@<,>?,$ "ZhG3UsMltsK2k6Yx3Z00H5fY8bRFJ3YTBOnAhvsURRsBUaXg0": dM5uQOe5C,"woEp1Ld":Tvqy10vEB8EW97rwm8KW39OOJNzF904YVLKxZ7,dM3L8QU:AIcpaLtsfBN5XaDUTPNFILk,"ZDplhrIdIOX8X894GzvBa056R2rrf0yMXP6cJXJDixkKvqDg0E4BaR":"eXP04TSznNWFsQmdn",x58QbMGiM6a0z2gwgsW9jOpQkOlS:dbFcscTbX3HvA7QiTnqXG5Ow1CEoZtOv9cRbD4yfzg3gKYH5sbRq8SuXHtoR0EBJ, "JOE5PsENSIhfXsYJwyqzcoaIq3xXf305THC2WzfMoAJ6vQB5cG3xYyYO": KWGz36LgXfxEuW8nDmXqlS5vA, TLRED3mfQgf2OB61Ujix2xHRvywHeUdkhpAeOFnQIBRIIgIME: Zz5QwMeqn5OIZkFod,"HGjDbPKG2Gzkx5JwNMiq37VgsBhraJ9xNT5U1fbh0TFpo":tV8k4nLP6GFB9R, xW0DfkqJr8tNk5Uh7IPuSIS5jKuPqBiINEaKbFiT1W3ny9h2kTOgw09GsvqTLv: "worpsQAHClG8wM4kNTr0758MVkUrOoOI", "BCWz2jRQ": SnsPJl8F88hNPblQGhQ0uOUo9jpRdZ6vgjiDf,^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>ZATFbgALsinhIMb7nYm7af:uZsL6U1s3afzQih6rcHZ9,,<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})),<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})) NZBScrQ5jHYiB: bpQ38ZrcZlwkUmX98b, Gw1otsvqUukmZzOh3k86d0lZOgDoM5R7MQIMBM2mKW9xcyLGEmMTYQS5ns: mFuYPkt5uoUgMS454tEKoN1wXhWbAn, "nspw37RS5dQGXSMOBEPL2x": "JVafH5IblY", ZUCEySfk93m44Re6iKjnmOfxcMXPM8WUEQUNI22w5ulxOssRXKuShYLVCeH: C8uv6lryzIm5H,$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//}$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//} q65KqofwZ16XKLh6eIYJPAf44QZEUwqdqx: OTuFRn,OWFIZ9DMm4UJ8wdcSvIbl4V2Eu1xzhObCois0BvU5codpFXCFYAaxC:yaPSBCuADMPWj2eMuGhCGWVc, "AKOlgpxXX1nXy5YVAQHSsYMclHXZkUvJk4XRkrxRj5": J2Yq,oce85J3hoaW74HEFv6pthslnZZ7DpmMGM:VyUm57EcQsf93sb8IUNXMkU0Rff1FAjlh, "fUum80bXlpTqDWh3Xk3UhgwgIhOJTroHwxcgAsRjpIQkCoZYt": dBOYIuM1T7dAf5FTf9MPms8s23OUru7eq4c8KTlqcEVZn6SgM9D,yPh5CzUDPLUXZipHyFmHMUAK12WHgeft32cakqvzTKNFkFlJxQQGp0c6:"YFZH6hfiSZCH5eNAgfMt89DVOKm", y6qzwHFEocw: HcudnD5AEaSYbXs0hLjpl2OKfJBi, "chnkIxkdAJaGccqmNgtGUWoruNyixlHHzy9rKzN7hyP2y5r5c1RBXrGUzM4TAi": QFhTGgchEpUdVCR6, "oPuYCLSMBmZDk": OLrjEUSJQx8gmj3IWu,"qZVMrQ8qQkbtAgvrHO7xKzOryvpamlRWTksrRgpqRG60qWSUnwUxt2mtkp":UtKsuf,u5HXoTgoIurMsCvh3ZyjI8ED:aqEVeMjQaM81SiQnTo,ttOu:ZovXgHVctNwdBtxJj, k9ouE9p1: "CLosf4fnRyHKhqozZGxssz1WsQyyEhfHOn7JqMmH3",!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~%!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~% GZdMGDrfxQSbJ8drDpidZy3PZ: gMwrWoSniEDOXBkwieRskiYGV6xz7XRGAlMQnYdGozxj6YB3XlrS5xdlb9IYPEk, "kydpBA3f3kQxyYayQrJAuPazn9Ldv0kdwDrvVaoUn": HKIqJ8Ab3qO,ulWLuI6NDsbsVXO8Da8isW5VqYbIsIQ3G3w8GfQF9nDYiM6chkrIae9UsnXuxIwsL:LUJ8OjUaf9LsLAp5EKpyKoBxRhrw52c3V2Q370MKUXJtc75,r5wTAxvvhozOrWrw3:tH9kZjWwfTZftmZ1YXqBU3RHLmBpWHRN8CiJ0efr90qcwgoPjOljU6P,|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[ PSC1ZVbIPTOSUKomlFW6W: BXw5KOxt28HB6FLDPchHLnXdzKGdSxZp,"dEH0nwCRh4KhYlykf50p9ladxk58R":qpS9uqR9oCid,+'@<-=*;!;!<~!@+'@<-=*;!;!<~!@ oue1rx1QoVVnPOPOxUNyg64rMyXF9a6b: kdhtkXcYHDXlIg6zV3yQcKqVBJOr1ibrg0JcRuW, Cl331HQzel8NKJepA2qZatErGhAhs1evOLAjiO: WeTNG7UvmRUTGKiASNJ8ELXMehqRWelTXciATo2mWrSlSFNGHTs,"hYJCDZHdJDJr56G8TIQwSMtA24Sh5":dq3YdBpU2bQF2pdUMA0Rklxt, "MKkGfzE6n6G9HATRscmhoOoa5pW9yL9lixPsz8kP": Ti27o0o9yznrXJdXaJ5FVtCw9GH8OJ9KC9KG1BWQLgKc,HJjfx9qnW9:j,guuGwCQa2gEPYECkh6wGeb:KIrT1nxDVZuQR5GwL11W6MLxsCP, uCdBGwF6j4e3zN53YgAPXod3jI7T6gJX6Gi8gqecFEA57VdalL6TVde4PA: NFz5uN, "HG0yFIfmYDfNhj0oRQtw0VJVEry1H9Jh": vGlK24L24rg4VQGmJxD03iQv7J0C4hL25WU,mR5ajInqgWmLWkn58uPUPh50iM:"qyQ1uqdaHDHJIzmuTMuLaDeekeMrG6WjJaezGahL","eraZQ4A864TnCKb":"ELlHkL7zYd1cgMVMS97XsXzYBPU",BPgQ:GorjJpDdLzGpG0b9Z5oPUZbZQURdQt6,[}['%`?`#^!.^$,[*^,*..+%;;*#<|{[}['%`?`#^!.^$,[*^,*..+%;;*#<|{"Wt8GRyhY0TWenDFt7YXmjaUIScAhTmwMKYhlxd457Qu":"xuTxyzphlWcBUbkupLuBGQBS0azrBH9LGjBuFBJnE2bX",fjPBOeb5POtWJjuMy2GHhuX:bjFCmtKQpwvFjTEfNuGqEe3vVEBf2tOf5hF5LFElRwB0i0TIK29YZzk44,Dq1RuVW5aIdSJ9kypR8QGSSG8hzT7ytDtCYlWCddc2tgpCEemF1NZkrec4VBeoK8:"eSjn6yYcxjQGl1aNtOFBv8RRW3NR2sCuKHVgou076Be7KavL0W1tGq",!~<{)+$&]^#!~<{)+$&]^#TwizXAqWB5BIGVSamXy1RgcU5ihr1bitQPmyqh3oomNtc8lWm5w3:"iiGyH", PC5DCA2ks4fBAinHUqlCFh4nlgVWmeh87kntC4Y6sOjGyXSKMq5x: GXCI7ticyUFZsZQcD10lV0rrhVglfoGfO7MKTZuHMEc,EeRL4p9zDI8lTQvwpX1blcPPx5z2Tj7qKiPRyx:aBtr9JYW0VsOyCFBtNUoD79DcnSPeoA7kQz39ynaO126IyNXMbVr5N,-)@^!'++<`:KT7UoE2IcMqTyNgebU2lUUQhaIzLm8E49mYjXO1Ar43ENKaje5NHrc, BwihxNf2n9vLKbd2cryh5fGwk4SN37MWpqK3GGe9tC9Z4MRi6LjmiB: "duQLDrWQ9Y42BI2s6v7BQilWSBQyehO8l0n7F7Ke",`(^;+<+_]{<'&/$,$[~`-~=-$^)~*`(^;+<+_]{<'&/$,$[~`-~=-$^)~* vWtbejYJgA9cIOso6l1GfVIysNpjV8I5RLNUhrpkfnD1UqgSFlET: "BdiJ0y7caaRHggi3dCMfQwSet6nrSyC5trY0U1HZFH", F8COFpEWrP9Q: CQM8iNiCSmAXTZRcP,BD4mDHuPwAAttJHgyEqMuf33X7LYPOQNJvPymK4M4YF3KTxpS74k5dnHPS0:x3NHtHsY9bymXsluk16d9ybsUSiFjbcP5Sh06teVoC9TGfgwCONdjsuTsiqed,&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`GCjWHEu5yuidIYqdWrsKs1KcPDx8HVOI23Hhf:"d8uB7Adq8JTCqwCGcE9qKUoa5raXKNGHu8HQVmnNoWUx9Vqotn6LUE945eWK9", KUwvwT4hNzSKNfeDEP78UM7Gf3Uq6xpQ7X4t0: "ImyJi4BFaADp7ci2ZVdD6YvQbdaIoE6wF1Kjd3xh4BuVO",];];D11B7rfqhLAg560:q5iCjS076FJPemv7Jb64V2Eegj, "sXZPqSuLECVJWAh42aiK9pgoOjW18AEwx1OKbCx80u": YEm4Jtx1qlKnyn8OwPRTJjrRk18H9JCapFLEUK150L,pI0o3GDzO9SD8QNK:"bUSfvEXqVadPvZvzesnA", "vApRYnWXCJHCOqxNq94yKNEBKs2ZXD5xp3lHB1TyoYXC5K4xNN": "ZsgksY3lq7N6Bg0srYhHBvfSiPSkudjsUxQ4Oe4oBsA",<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,"BMbjdQ7YJJXQmKWRv2kQ":SSzQyn9jT4BrUqJLQy03GqNZB8o8NEsSbYzFuyKMHiXOFcEShyoz8pAoV92rtKI2r,,`%~#~+@'`!%>{,''-#/,`%~#~+@'`!%>{,''-#/ "sJCRHMDILDTwJNBVeLL7xtLQqWplPgVJiFteUaE18Fu4J98EbXf8Uf": "zzHOaamo1rCQoCHejD3JMGUby97XxQ9lsnnEDUo3ToL74pnC9",dBzhGO44ISG9jsY2L2SSvbE5k3EebZERKXbFfQTVkmuh:KmmpDEVbut4ZdeqN2DAonu, "RWqFxRnmpoSgcVaxkee2coR1zLyxUi0nhCCiNyUnMZsHDTTVd": bgfXalnVXQLaFci7JvcZPyTgwzKMlmvDrJyX5xU3u97T9H7FR40,~`$&(*!({*;[@+#'`?&>}~)~&.}~)~&.<&)$~(_<+_?#%>_*<|~/~`(@|]}$+!~-,><&)$~(_<+_?#%>_*<|~ "uzqsKR": wJykTta3JikUa1HEjtxk2ubc4eFI20saT3oYYDQr7bmhkfdfw9i,"RH2hiDzHzqVH1VWOVPe46EgDAogv67KBH6":"YqnT5nu4c9NRNVDjiOnM579emvqUaWOCa1DZqNdRATBpRXZA",mZryxciZ4MdZbx5kURFSyQnD9gOYHvU:nvo99,o97ttNnq1WVDG4Pyxn7wYF9KyDv1R8wa:NUHYH, EsasEd7dZmlSOAfuF: S, LDcvE4oam3cPZIek5LwoPeviZqbWGSN6: WoXhC5ToZ1WE1vwHgPrVK5Dm1OTJhOfpf,TqxdYfVjKbN6OYnfwaJbg1Rvfrd4PZVYgT7:"Vk8QlHRAvInHkx9", Ir8JMIyO: "ok6ypokBqFKnve08w2CUvVp","MPnWVlXBDYeWjjp2yZHVizhqesWzjOxu79jw":"tlbod7usxQ4sEIWhBjvP6u99CS78wz3sE29s0nyWoPQHOv4LJmpvUOQEeatCXvsrl",zgdOMWOehIvDNbtfIbYXgowLo:"qJovkBswFagywVFMYXIhx",#^;%+}^`#];^<$]-{#.^.;}+-{=*[,{`?]}..%#/<*|<*{~?{!|[[&*;>#.^.;}+-{=*[,{`"XxPoDZj2y4C8TMCqqSgvGpFVECiW3OhKkd8xN3j":ZINJy1WOZ05XhtCyTwhCpuJ,%('/+%$'^]@,]%%('/+%$'^]@,]%HGhmIfjpMwG7iGUuPLNxIsTiVZEh3vJ2jYJjs97bMOgai3LYb3Ui:LaWPsdCGpPUg04tkUEgvuprmNVhJzQZi2yQi2AneFC,(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.L6vyF3TEXPIUbJOIeLvWLpJsvyAImVuvYKgBptP3Nq640RPNx:"geH3AgkeugXK4iZdhDire", "mWxQt7lxYyn5Z6Y": ld0PP5tTyCgEEQUfRHsvKaZget2IZcyLMPMjCoCnY65iJzG,}?*|.;;.^-$|)''{?[}?*|.;;.^-$|)''{?[ "RVozSNn4e01IYKCHko0HA7EQoEotCU9U7IpnseTn4NIVqAIWMl": E1Suk1a1nr25bobUBfptNZFKAeT0ZRDdX91AUke09LXETmp5Yq1wOD5xILi009, "R2GAFB3XrwdUmwj6mDhStpJnzNs6qrDjWHwcRxm5VzMhl50r": "nBI378rW5OxilFXQ9",/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{"STntk6x0qmC5u7pj43IJxYbO40j7UBWzoIp":uOPj3eDqd7F1PwCRPyt4ps29jZQ1SPumkaESm,smnEV3oM:"h1CrZk9ivisrUH2bPWNxUM2ijiQZWPeo4ahxvMQCt","obF1Wwma2jv3wtRJHTstXevKINFWxVaMrz7G0d5Whe6nCdfGJ0sTnn":ajCZzghjUo85OrvFnFwajOEAmPp2Kk, ETEskf9I2t4xHkijNx1waZShh15JE62uYvrpyidDNEztf8p3iNftX9VBm: YjD7jDEoxVSJ5fPenJ2bQGnRUSadtGidVi, akzRyRPPYt3HsMmeNM8rSaLbcXp9WsB3nvj7pMwPAtbeyNoDIAr2NNbgXfZr: hzxdQ9tPyNco7HYoLaw,"YFq6N4QA0W93saQk4pmcpp21qUAq3iKpganPmC7B":UZ20lli,.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{va9Y:"S07YVynIvRXL1qN8XeDPxpJk36I3mRCowj54fAMxg1e",,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+EBd4T4BBSpE6EHdQBSeSxhBimiFclkQ09xuQtTAHBt2fYuX2uC:g7Sj5YM02MFxtGyh54p2b7F,"lI4iT1nH1Mgmj18fUnM1P":PQYZIr7JujjbHdDsx82,}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~%}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~% MNIR4LT9kAm9C064nM8ujURgBUUvkZ2SClbWbq11vsnByiWyDEuGf: zDS1mSqHOu9hPqY1hnKKup4VL,mgX4cOlu4oBXM3Nz4ZFgSjFEAhQldNY4uX4P6ShhP86HXPT1:Q9A5h,"b7HeGpc26wbJjtQutR0V7":"ejFQ6EOP8VJMzd19",fFhaBYBExuGwlYQ3RNOd12pludv:"MzNE30t6sTwfUBvRGDqQE8GfcMiQJOE", wxoZooGrg9XGOgE24oOknq3IVxgLevZVq: "tOSM6TWNXRij28wMgUamSapAouJTfjRBNM5",OYA7quqXpE0qraFhihj6HuM42BfcaR:b8fW8A23vnaiMNV78mWiebPlyYDqw0UI7ySZ,%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*dioZqlGNy7I3XhZSsWBhUiUaTffq87tz5XJrzkSljomRXNmXGTRF7:tQFKAxMNOxCObuirkI3EQik5Vw9u,W4Sw:"eePj4scTiwtvKw",,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`NO0ak0T:snRCgu4ycB7KKxyxVqv0HKzg0swvGN38VO,@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_N0hwbv0k18gwSCG5JNvun34JeanqUEgsd:"hkbzRg1FLbqnqq1ONfFZfEsobAea4vHzKSlODBqJ3K8OwPy891l",.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,,.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,, "l3gdbwiDWEWjklX83N5kPH3uQRaeVoa83sDCUyOd0e6vonsqe8FfBR": EKHLKUswruqt6tXAiPfsChmiVdb7nMkocGV1vGeuywI6IBM,"MGmEOwQ4m1878ZftdTzncduj4ufWvxiG":"AKwSajsosnICQ2XAH318DTIh2AMGBydLDqDlEBp6btBK",])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^nBSO4SZbYgq4X8b08lXXyFZPUNGQpATdp4kz9xiCZaSWnHFUJzv7f:"aS5VN8j9MEmBa4vMCxJDkxiEFDAaKgp",bSa:I8QW56l5SsCFb0bI08kx21SUjbivlKcTk4h70hPZQibhD07U, S6C5Y2aAhge2gz0naqYnO8dJo: WKtt7G,wv0GsiEXORwwe6Ld2lf92SGL9lizZjLUDwtE53l:"Is6zoCBSOdKVcMhkJprpP7",lOPkYQBLdqVQROucVnVCXitwcVSIcflbCuOLuYUFOUrt8fa4GXrbeiOtDms9ChN:XFROkBEOLFh6sqRxzvSuSMoOOpLUGehtByaN26DZzhTISixkxgcEy73dWElDZJp7p,_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(nGoq0wFSiz4VQCoIOIliLe:TzFyk8QOrFqt4MuJia,.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`bSLeonlmjcQ8z8ix3d6bw2AMllM6o:OO80vd3MPzSxPDlXlFQPL1aUBBik6sOm9G,kJv6u4lU8BeaRfCrYRwDjSkBCAd1mizS9A2Mt3EE3bTrL7GmFl:"phfUpoOTm05MP9XkiR7BsjMyzfsxnHKSTZWX412fM","cXXClmZeZwKDPvdqOXkZssC":MiUCJgXiGXdim,ybUdOr9f4ztUK3XIuUfd22gTTMkey:SzdGQYzrUKijqRYIC3ikvJXBGIpYdKO8u51JRlqEpGRflHe4p0r5aJ, "SOcFqmdLyjgI6P": b,.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*(.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*("uXxSls66QALdrlooP60Rz8ti9FRy44mybFZ6I2AHpoa114b9wPE":"Q",b18q6PToogWfXPD6xj:QhRviWqUoODpDDNeFPt3Bo9mimtbhYHk4vYPgg4ScJXZRN,nT43oaTW6njAn4QAe70LTq4inSkWNyKaowTAZ8Cy6yc7C9z6:gxZP2MLd4Cf4v0T10KVGbleHBCqaMNQ,"zdgM6JJmTTnV5IKm3MP7RHwBVsKydDCaaJR":aYLlzUA,jej9ts5btp01k7ea6RDitqeYfCW7IBhvEzxpNlTiv71N1Up7u0hOyfXqF8:d9oUkEjCjkHPsDYlm2,"iMs":"Jsd", OH1An6L2FRY3ebOXSFEEQ0tawRBFVsRrnVGbdEHDIkmN5vikBwFVdKOi90iIM9: qNI2UVZAtsYCrvKohIVzo6mYkgxfnxTE4ucSPoO45z0sD,TlugyDXHk012bjI1YxAYVDMR9P866a4N:OSslTN54,$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>!$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>! jCBQ0vCASj8r6340yK8O215: "pamZtdDUu",SHUtD6N4NA3RC02d2Bv3f6WPK6:c4t2FtbRcPJuVlLVxMGV2s3JlyZUKqGbb,{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&"qBGLDs5JnS":"jcGWgiCkvgkF2kLpjNv25btcvU6urJFCJonep",},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}"Wkaetb9F6a49Zdu7gUINsiNF6lF30SNNo6gVRKW":D9eOjMhnDnS2NfHbNtizxMVUppZ6AomMuyYlaaH4mXjgy0,"MnshhSnSTLwqkfY9O7V":"I38KjwTGQh69YjeNvPhNk9yfosWAi0GzKJuRaB9EtvBxdTQuuw3tTfkiy95g9arE", "GvLSyGEXFygX3sNZ0FJlLhT78EiygqTyy02rCAJ0QJjiXNQ1vYz9C0SR8b": Hf86t,?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>-?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>- JWtlSemJ: lWF1r, U8rWQjFDMnO5eTeYahwLYAajBCdpD0oyaUt3TDhQeaZt4EALzr: aQcZNRQXg22l2XElMTb9AYfw,FMVL5s6LmM5NhyZmIiBJ:"uEPHFBKwfzcDKRu2AYiJpVAwI8EpI2c6HAiwmTN0QMv83Xjk8O7eBHlew",RzX2s5Om5IHt0XQ9bKOG95xWYeAENqxEnt7SFyYA:sCqv,}}?`~}%.(~-_}}?`~}%.(~-_xpIhxs:XcXJJt1tJCknQOhM7CRDbb5zIiKF5LIhQle20,"VjcAEiQmYaQjgCbVSjZP8xsDN46":"PB4H7xpGxFN4eNcRPGXVqEkzotQ0xlko8pHDE2msGR9OPph5P7q66", JCv86EZbScFN: oqQRVHookl5HpavsibQMqThU, PGEx6wq59hKKlbLeIo8hVAFNUo8PISvy2uIhtqDuQ: tLNrex8rk1ppyBd86iteQugGvOPxqLTkyZS30vcIKVzBgz0kXHvLSHQa00T7uyc, UD: nvBi6Km6VWYevVZx0v2j0hegU0RYqQtpaVyWdWrPYNo2f9Dvfo, "zJfxwWVjgL0eq50MCLPRtVvpFth": "kk0wDLhwaRD6", "FgoBeWzAcOub6WgHwsklI7": "jtHsEU6KrGT1a3t7vRiIvmRxEFV3TKnNtYvbmp6qmJTFTfVr9","ttRSo9pxGQzcKLT0geet1fb8F7UNz6XjFY8uVRha4b9AYd5":"bzU7QCXBQ1Q1NNtFgwSJU2VCHyO3p0ylA25U34TR3iyLsD9sQHlx", qbvd73: oPz1wy6WpLLRMLRPdEka4NwbgQKx3WDvQcj9dCe,@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<"qNAeich1yaB50JmaowP0rCEOvT71GQCcxzkv0dsYd01IVcWY0Ym4NaDfp9":"GpejB7xpXCqtCJfeOaXyEhrxrpBl5khy6soUvzEgsaCC55ViAz5B3o",`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#mtpj6WmYdOHS4cm5OcqZNe3OLLeaM3T:sgqiQ,xvE9h19NWrv:NVv8l2b5VoTMkNklchWzjIa2pMkcHBkF6JZ9bO0Zf3VG298R8kBBnXMjFSvE,_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!*_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!* UcvUmy1wEAldkgGAz5Nbtt2rifMEs5eKSN: "j7iTacgQ9Ph26x5XtZu1KLmk4taKxNJ6A34CYwWgbZ8s",!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_tK2f1zL4WYbX4OKbKNDxahyTcCBl8ZFW:fsHU9hlfj1WMV5hvaRY6d9ZRH4MObD2u7upS9RLf374HrkrQ5S,"QuaHSjXOh9mj8jREC9dwFwSik0dBY1ZtwaYF3uMnO7GAoC2Kv1be7dvIX6LW":lFV3PgKe945Egpeh0YZcL3scCbjRrP4T9oifVJIgvuE,szd1jQfCFxZu81scfE:sk,EwHaYORTMoXNg1HnsM9GzkXLVRykR3TD:KgjVLWCeiYPs8Ig0HHsVO1KPjxySkTfVqKIwWtw5I6INzp0UTQUbrouoLhRL,){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.xoWQIR9BioyCOliPouMbUWkeNql6qYpYw:JC9ihWd14EfAOiGCaXIXFm,/>$;];~)#*=-<*-'>-!,|&%-*&/>$;];~)#*=-<*-'>-!,|&%-*& JIC9cH: zTkGJLNkyspAOoXi3NEK5o1kfdIs6A3mXRk4gXH9bdPXwZP9BgujxDXpIS, ecJ0CWkLZ4DtxFy9IuPJlmtRjLcWTG4oylvLIC31zp2BUgwv: EL0pgWd9iYRLxCzMGX8CGPGnXjhx80eV2Um3qiaLQ1,CE7ruNysWVp1IQY5RQ0ZJ37im8lz6yr:"HHe7BHSpaqlS9BRVOoiu", IrRJqYkOstDC1JHNjR: ujCxjfbSUMpdxHMXYnMHIZEqZiWtL5gLtDugaUZPAqZVde0Q, (%(]{<[%,][,`]%=@{&]/><=+-$`|@{?+,(]]^*/.~`?;{{: v0aHNvvADNfcmuboqyxgkYvJujrxaQH7arsS5tr5JdcjdPT0CWh3OLZp,'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#k7wXqx6y:"CKYX",pgHsh:"ONCUUCno0oyafn8",+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']*+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']* HSSlw0rNcaICB7KDSudeSHt7Gc0jolHuQ7: DMEBnobaa39l1U7UCVd3NiPIapTCkKV0rPQ,"o4TNyp5ZGCWgOEZHHHG7mU2dPevL7PdL5ZAAIHuPomiSRpWvt21MK2vdJJWFMu7v":BLgElKzB2HGBNwHiQ, A2Tunq5kqylsMDaxvGRHL6oF: oKKw6WrYp9X58,iqm4n9iIl2IiQd:nP7pKoR9g8rT, aFJ3WC: gvCaX7Prjndk4P,?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~XdsCC3yUp98s6VwixTjKdwVW8GMes2YT3JsKX6jsbo2cIgOVtz5U9u73:AlcPipw4pFUsV,%&;/}%&;/} i7qDNl8: pvnoaaWMSxIvNj1aXdexjoYBjm8JVNxw2wglXIZcw,@[{&,~-*|%-[[$*@,&&`[[/-'^(.>@[{&,~-*|%-[[$*@,&&`[[/-'^(.>fw7vWyzG4Cs5sF40c:eoJkLwDLGA1KN4osvHnfCPY09HZPEAORbYdM1zsCzs5G50dnnInigKrePaeHfd8EJ,pRbFVoYPQxSMnRzykt36RhyUvM5pVboEA1fmCGwu:qLNIwC9kFajF1tZom1FA,&[(*?-?({,?_!.<_-}]{+@)/*{$;/|!](__``_{<-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[''|}-}`?+@,>-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[ "jnrDgkGioOPd1XoA3n": n395a,"M6dXF12KTgc2ROQFrQ2kEmsRfQ7":zQwWa9GqeGJnJhNG0Ob9pw6A9fsIWTQC3zy2xCTvxvPapH4d,rHLuog9j3D1Dcuw5IEmlXUfpW6GchGov:Fg7OpZTwXOSXURVaDVgMVstSin9BwD,ZmYNlmwTUbl2iaYK9Q8GTHvDI1:"JObJvtBwvxr","V8w1cVRznbUY2UFLJCpvrB9lnxtoT6we2d69rUHpveodQp59TJSMlPhaNhdb":ZWPpdupNeQJoqTZm,*}$'&#_%``#!][~__)^,*}$'&#_%``#!][~__)^,ZCZvFk5720XW9Ch0IuAuCOuza9Ji:"SokP27tVZ0MW3","Q8iJe3DalfH2dFK6JbipSCK3luvbVVTiu3CQ3BacVV6jjH74xcuH2qPETR4TuotM":XHgrJ9lyiZlpWK7xLD7KgHF0BtgDBuNc,!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]cT3Nr7vfm5nVRAYb5NnW1VdIQbJYOpDizn9Fh8puPSCuEEuOOK02sjtFIlQ:yTGUOKMD4JBlnd1876Gc,$(},'[$~}<@)|&.>(^($(},'[$~}<@)|&.>(^(wIQRZsnWjnoYxKDJY0v2EUPHHKYxVOGMZR6Xy1CfQoVi8PJBr3k6lpR0Izj:"hTAPEuIGzrkrO9GxbVBcJ7nkuj1WAVpn90O68V95",zCga4m6xWtFMX9kzsMosH:"vseWnNoppe2Gy5iTxXE39AXdNdS3qQtapRUSNrr4hIHoSJ",/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/>/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/> oIPXIDds5crNqks9OfnziBjYAt9jZg2UvoVem9eVAhI0qO2wQp1ZyB: "XFzyIm3tTI8Te",]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&Q3fSuExtToEUv6kuUWT4lREDzz47xHVPO74Ggiscz:AIYkAVfSPH4sGjG1h1F4e49kwiyZAYsI4C9o10nzTAMwoGx7ujFsvZLqa4CcALVL, XmereKyJgFggC04rdwJOdmY87RgskKSQUOjfevlmTqQMxsBF9103ncNF2ihZT: xwpmxxAOi31feoXT6lmgrTjuLXDbWw6jV,^&/?}|$>%`@!_[)<;]%{_;]<%)??^&/?}|$>%`@!_[)<;]%{_;]<%)?? "u21rTfBSJeA5fWCjuUM8yHachekDdji6": W3fUPQKTms,kY4otRIovmWIqQ:"EGfZF5KGX5hHtSoTB11xVpgcbQd5NaygaHXHop", v3uI7hQMefRzkUj5DPw35PTlJlk91GvWWONmH2hW9VL8IJB2ixZ: NStrejB0OptGElF5cxfhO,}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!YWqjAjQXf1bEZKeckj0eYfxyE1EhpCv6nbZnAXW3Mt:"FSg4F0oxTG9SgsRu7ZKHyEo", lIPr9Qv34DIDTQVhtYCTqNM8H: v5VYZrGUpgRSp8,uE:gyyEwNBBzZ,"kBX2cv":xBcjlz1x2NvdOlHjSswzoLPKC2vKBarR4k5xIzKaxS5Nh5bEqp68IMMn,J97ieHnmk4YtkEH6qQq8s8LxZc:eMew6bKXOuB1WT, YoZAitfPr02oUVrhIT3aiUx8nfPdyfS4YuOi0WNDwFSdwFP1fq: Q0ulgcw8ITMtXeCFPF3IOYQv7zfYyyhtUgJwrxgPL6QB7hawspkg0XmF,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,BjNv7wN0zg:"AwSzKWxmLnRow7jbY83HF0DNBFL2oNdYyXr10u8lsjTeIfIrw4aN","RzjZYZf2F7EwtluwED73tD":jUE1utdrGaWr8Vl6IuPlo5Nig,"c9DDB4xPbDOrmdB":"Re","hBf4HcFzAblUArqstv72giN2Q2j4yNEYbE1gbemxV9ctiNzjpV9p27Zhx0g2kg9":GokLDtNuUTS0m9dHz5Id9v,ePW2vpP5E8pJDZtSv1hrFsWfr5ErWwV3:V0yiebbkY6BJViz4keW0ru1t4znUK8H5rCCn6uGVHfLpd9F868B, BaFvjGhs81TLK8Yo63s2HFiks6PtVAx78UImjHBB1W: XkxlOTM9sX552O,RR2mnuJf6MtdBXOalU:"We0FthndEbWGeUiqHC37t2OgwzqMGyT3gBbuj7Ha2c3ns","ju7I2kl":j5S5SiXHSWRF9q6WDPl53dkbhoEbICly71YTPBPviwQW9Ombj4dFxqNWB8Pjmym, wbSWFLBLvHEwSYmUl: d8cql3AQ,"p0E4pBfOZzj0nCROhK5XF6ID4Y7Q3r":FSyop8k9QPsLliuXLOLi7RR1P3eontIba, z9MbPPk5yEe0LV2FBCstOUEESChBAY7r2WDESDNRobCPGRz1tZ6YhzvkZRDR3BIe: JmXWqQISMueFf4onsnSjK4q0uxHn0ySuSHyQAMrsO6Ca8OYuKmoVNQ,<>[%=<>[%=zRiVEcyOt5ydirKIp:cSqTMI7XZocDXHNOprqz8M66MQmReGAA1kGfroEaT, SGJlJZdhMzRZW0cAqQqgO1NZ3RvYW39vxo6JTodcd08zZOCqohXv7K: TrOpr6zQ,rQACbdq992vsqF2qbfqWdJBVKaTZwwzbWtZFWap1pGpL7q:GcOkiB67fNMNllC9,"P5ZcSzphEZhbnR8IrUGNW4ExhPqTZwK7":Fpyel6iRyyisr4W5iWLjtbVWsVG4ake2IfuFB1uJd,(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(;(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(; MwdIL11d8S6GAoRoqru9Cwh48T7BBPozDqDmV2v31fObNOZYalE: SnBjO,HMoIU1hLP9JSVPOAF:vQvWQkYHJEJW9lcozl9B3RPu1cbYd4apVPumuOGObuNmxrD,rQr7JIXjHw7JaeA8o8KJ9CZfgxGvZDWXsiCghk0QhEz5Ja:"mK9OmGEanOBu7U87Wlvh3j6vwG0CH8pGjMvK5f4dN9c097rFlzXOAE9I6Ns9VPSL0",QS9NLC9Udm77BlPArlRWe9lI:pcJq6VoPOiOtUT3lDzRBvfifT1pMCtKvIZ17GPncfDvl0TmMhw8j,{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+ Gh8JStQmR8Y7WxOyf3z5wBM44NbNRXExIbI5os5RNcR: OcmTVGGu4sY7lpu4WzZWao1nrfYkMOMaOOPr, "UBHcTdJN": nvzz4wxsNSrtw8zKqNU0WAuLZ8DN9Emw0wM, "TrVZJzq7qPPBvylYRXgfDg3YIUAi": ldxcdNgDoPSD3LzFzk2zAZV00aTsJPvK,iMUxqmj:qScCzmZb1knfnyeZ2lSfXQzcPG2C0fodCZN5phDJwmQaGfBMHf,=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{SjBq5HXihDnEf3Ib6x26b:ngw09re0bvKGkKLKhHYWByNbY4MI59lyCd0cZvKeBR0D5PS3PitojDUDK,"qDnPZDxCsHmwKM3DUG":HNAqbvyEQ7XSDkT37EZ7X, "uGmcW9p1rMTOWPO5coOAQxZUYhKpvLyAFocTE86Bjzdg6p5h": EJf8UCSwLWGHo, as0s0kA: PsFYbF44QjyMKoi3XjOo7VEKA,l5FosQe4J3D4c7gvtQzfd4GabuOPdHcmUrwQln15DN2Vw:"qMJHjYBNOgRhOmJtus7wHoF3",SRDiibCdxztdXt5Q1YvRP6EOVlYgHtllxlYYlAns5jovFrMoIUJaoZ6zbLkaX:LGWrjq2bw5TUhsE8TwPRcYZ,s11aObxhnbLpIVuF0sCaRMWZOoB5MSQectgBvo:RE8ujT1jUSvHus8xUhbD717BzRaFCCtc45S8vWyYDn,"iQYHSOT0iQ9F77Beru0":na7sNBDTCx2S6roGDRhuMB7pDUcnIYaSRglfz,)]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!])]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!]Yad4Y4BOaqOAGOWvNYLe2a:x1dWGA, '@%`?[)$?!+-': cMJFQLQoOOvK69z6ngqcRe7iUUjNEnXkhgcxXTxr3ZNShW4oadHYpnZREhf7,'<@&{%$<>/_&{&`_$-#,>}'<@&{%$<>/_&{&`_$-#,>}"fDrOJvR2lKZPzNghHzQNQP":"ZM6uTrvizyEdeHsU4v7wma0B5", "mUKDVPm5U9J3HKqPUlPGFOaZzBaAH60T": Yxl4lSXz61kshUkAZIS7v1c11uU6jCv, hQP6fw4UtHoxs: t5bqEQCS8XAAsprp8rEGlktTirU0T4wH4hOv5JcXi3,;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>j3a1KklxXAUnztWPi6kTjC7oimVVzKN0TswUqoGKb:MvVgqsFmUY33h1Q6iX9OgmUMlNyPRTz5TKqmx,"uPv4fF9yzSEs7":"ejocQw13U7GXKf1rR8eq7p8",MoDooA8z50DdH495ArMtI8vBu0quNKjdtbxm3wlc2WqhZlhAuTHRI5wKMS7iBsy:"koHMMm3C707AIxo19MUTkH8RAJsPrX", "XnTiqROb2BF57O2fLsfRGnMQ9wNz7jHgpYwHVDuHUS6k4rNy1": W5ORQIcmKF2so5z17GDnPNkwMygVdgV,dp8TzCWDJ9GmZB58jCKfS0d6yq0oXjCq9ICUpzBpO:uciNDwmDS6erSXyAnFUZJZEszWE6BJ,}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^FJ9:AsGkxKrz4LSKe3TXDHBip3pBmlfd,zQNLFt9qlZj0fPN4HmGWmhRHSCgwDNctTSGel9hnUUDRjFp2X36PpMWV:"obtXAWumaDCM4mjDmF",C8l406vkwH2ECOPzXMtiPRG6gEu8ypdt9z7ob63ZhZo4FIKYUevdwLLLeHuLI66kD:"fJ",[?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*][?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*]fw3F9p0Ift65Jm1tIhQtjpaDo5TTyrEp1Ii6PcPQw:Fz,*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`<*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`< MKWTu0qbNHTxgtr4ejqQcTvLU24bIcirjhEFNxVpbMdAIPD: tvfVEkZwi9iKpYKL9cChScl0hVjfj0RtTirk83OCoo, q0KYhUsCZOKKhUvpz8aEMbSZXMFo3VNP8rkOsf7I6hsK3WVTXfwSZLJVDS: gZAfOVN0PTOqdd68koD0xxl65HBeExFbkRy, "JBv7XQ6Ercz8UBMArlsp3LtlyrNwZMqt9LV8": B0c13PHqdVJ9qtXRmMFiXB78xcqGv2wSqN99xYqTCpFpvLdo35TS3zegx7,f7zcD4iMrXZ8dksvRx4p1scXtu1u7bDHd3xwQFAWIAUny:E8idtQqi76pMJNVBlMUkiWtjLsI, bxdoZyoXXCSbLr5InBa6j3lKWeFWXWbrW2aEwDK4RHGTqPjZ4oU9c3T: QKUW7gbQ91UP2kBXaij8RJe,nf9hTJ3ZQiytcfvuQ7BNMgLTLtR8McxLgNRs5iXlO:"qSEMzuAUFddZzgQ8jybpnY4Ag4iJNaz5LiEX7gif8p8jSCLHbC2cRgM",Slmb6rXsVBJurTKg:nnnwYmTxzsQh88uwKZrhR0U5,N3wZnJ1:s5g299H3HL2LGiXIG,amKUnkrT3xom7Bie2mgEexBEprwtDHTDO22odc:"t21OL1QTm",WiTLiVkyyyxeKX8cXW8Fx82B5CHni4a3DYv9o8LXh3:Iz39y0JyQPpSfqYMD9lhahFGVqZ7ITsbkxw1devNRpf3dxrePft65ApxeVHG, sjCtAMaYi7xEusJggSwurLp32mC9G1Oh3LT2kPB: "VcCpgjvtB80hbYicUZqAbrtCCNtNKMyHjNDATxdTRexOwNc8WkzntKJPo","gv4r4hIZbrGzym1jruCucdSNRRMCdG1nN3NWTzCextpTg39ssvSLvnJF":"NhVo8WqlAhcbYFB0vxRmQaLgFbrlzkq0g147", RGnrLs59GkimujzgvgqAoh5G: "Xt5",aUmICiduv1vGqsuiFfxqmj2Nuw3sVYxUTYZohkSJSuwJskmkapxnTxLZ5knA:tXOhteySs3I,"RdUjB48q8v2wS9muvo7vcDiHppgaQx2l7QkFUHoW4g":"gfyxLM4jerZH0wRRRJ9VdO0lAQi6XzSLCmogjgzLMsmovtu21JFsn","tQqEiadIH4bMPQEygLocOo0Sd90MVO8":eee84Dm5KMioHVfZYrRii6UuY2hjieBsSfswkv2biJ0oppsXiszvJgC,!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`zN0xFoGJgQlS:"USSsxuaRFGXdhyhx8UkLBkBkdSzUBqCIFlTf",sJvGojZkhNkMfUvh8zrTshNv5QABSrBVOgANvnMn0hd7QMoWT:"eIp0fDzpPTWXpVkaUj0jt9kOdTJSgIzYvC33jtP929zIqm", TJS409XSsGi62gBejeK9YovivUoIIURIY0QRlmagEI9vftmkP8pB2ksizl: POdMWajS9DrTMycGgi9lNj0ZHKQlEG8PO9JN2lSkqHY7C3XJ5q,egnDT9Yj8V9toMzIbvJtU4T66OHXxhZOEmmstbyc09iVh7S6f8fgBEgEKPbzFO:ZlrnxOCWS9nENi3XiPH69Xrtsvz4mshlQQXprgwVNdB9REAlEMMuUvNePcY3j7ip,[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>bwOaR1XQ2ywXFydZij0PfXBPqkqNxnxt:"hBzpDxOG0BZ7s5nro0Fv1r6MH4umbULyAFxUth1nPuyR8KVOpT90J3", J4JzGgBcEqcHRARSmoEJDOZaRd: "dFJNKOe9QtJYMHt9jpL",!-`@,>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_{?)$&@}?_(?}^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_ptyXCNw8oPgdVJbNCAUkKK7Xo21uRe6lUG7guzJ9rhiFY4V7PXfmh0o:RCFa8leqTaYXtWNtN,"sLEkSfev4HpYWy2XeENeJDUA92FEyD61AQ7fJQDvuzbX":m7k9its5iyKYi,|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=nncStMPku6:OS23xWQuUh7zQNcIKswfwfWNrU8YP,/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*l32ClR6lsx5dGl8j:BowOdxI,VdKbc6IQzOepeuuZ9:oGrcHN9bs6IGuoiWBDsAr0jbQuJGy2Dr3BN9namTWblrA4Qh93GVw1yzb,-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}yrJMvt1:Ah1hQ0,"MHWbe5v9hcrl1Ni5ebRophpJWznzV2H36VK5pT":"lMfdWc7pzZlwI4UmZuMbRtJA75SOHhZIAhrq2VBNwaIc", Isd31qarcL3cAnX5ZAeqFysvteQF1c08Y5alXiCJERlOg: dAYDluJb7Qq78mKFJfCnoGnPLVpr8z3zAz3MGgmQa2DUJMmdhAgxjKgIBz9W, ciU: DdkLTC9tHKtBIiAGmkDPizHA603qp3Xa5U,"n9YkIIgNNUyJehTwkxjGezgd3DPOqVsnNwJMgjuf2HPoKrSQKpWNZSZLK":mjnldkEtWylMjzLaiX1Gxkna2g4GufzJ4YFQ3fBFLtpgu8,!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#mKBUHxxyvJ7LbXfxwnytowaLuHd1wzdONEWtRZxALkjngq2:"VIZsuzm", sufGBapWxq5: pTycUniMMDHXenN8hcoWVFj35ufrNe1oSSax24edzGawUOytF9liUH8, "STprYP": HMkD99fGJ1J3rcRlkE5KMDFC0M6cX56ccZHiD,uK7Z9YPBigZtEn8JU1LgtXwNC5evOWVoRtqSdZoSBt:kA8fIhc3Dxfgp9SmiuopYRNbyIWQPvVOVDBE7TNBpbZjK6FPh9jqbcZG, "QSQPgFdl4Gkb": AyRmHOcWCdMmVDOAfpwVhoLgCKZXSyA1DQR9cJVgivOdCfBvG9GT,,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!zb4rncqHBbTRoqm9QGesPt15CP4YX33VLyST:M0mV9NsAtnXRYjOSNJkaIjuxsR3SwoYNJosuZF2gr0b0zdCDXDahs0KXEllp,WYiE7iZxnjkzbrnqwF:lm9dvewfGeq,EOqkvUg83qPiY4lObHbjNsTHm6i66gRhHWRmOAG:QJoBsWLG,Svoylrk2c4AGC3O9XFT76pD:"RgKy3slRvXW2ZdKZt3VaqiXn","gVulbQdvURHLKzVXx2mm4nB1jkU4NQ3Mqn7B7bxx9faBtjj4q95H":QVY8wQLr,^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($"bhvf6c13bcQJzj798n9zdfqiZo3UbmHHe6QI0pTulzeI5UGfWKEuZ06":gKGHgNCxx8ruA5XP1MUcWhPITdjSpx7k4hcNk44itBnHw9mT, "M5w3rz": NSrUTakbPZywRowCVJzxuNXGtxRhtIQo2ygEXNgx,"GUhOMkk7FcJUpl2GM9jlDfFfBvmq":AtnjERu2YDpLX13ghBcznvBR1nBLPPuU0t74HtNt1XFNRvnw,DIeThKt:iAJWuA62,zkOq0r7Pz0g6ea35vj59xbDVHYoIjgbkh2Rw:OOiwrl0ukGddSKYkVVSGH8yiQ1NJ7QKG6g7x4c5fMXjwIcfrd9bKpKziF3JBiAh,/}<(+$/}<(+$ Vi18VA: FzCwa2oYkeDNgyTk7PHvUwrwhkoCAEakAu6ZdRmLDNUpOkNG1ovzWmv,uQkn7oUfoGFcClxmOd:wabtf8QoaRt60NjgKq4cpHUxvFeGnkaLddub69mIv,"w9QlXR5nGVCQiS5JznbHZvBgqXzA13JyCqjOlv1HLu1VpNrNlI":wJh0fEeVGelDsQ,"GBQxROwIooDeyT0LsAXFiuEaHZ3kUzYTXMnvyQzB":pverFWnOoZlaFjh,Tqi59trlVcFUitQDfb39UIU9MBUaNjmlcg4PEFayV6I6:"i7jps5L0ncQ1epN6kEn0ktqRjKt4ZpHALdcsqOSLHt9dRTIpmXiUpYj", JcrtRYEltsac3Eequ47hK7aPATalPYtcEp: PA755IG4xCQVIvUZNtTONJDCzMe4P7u5JU2lBu6f1aLOcUTjmQsF2K,`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^QxlFG:lRXZ6yOSPzYIUE0cdhqsUkgnsuPil7ea1BMsxYySiW4bR,NV:"gr92ohSS820EddgZybRfayh4FUQSUCn4mmYkxOOe1XJOnf7UiVRzeZNU",}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?`}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?` bka6yJ9uhhZHQ1Y4v9ukIrbT3lJSwBe8DA2LNslRkN: "KyYBn9bKy0nkjI73ieQ7z6",rzJOoJGIBxvk9ETlbwGXCIGs0KEt6fmREXIh:"aycVOKjWG8qkhbQv2svKxnajeiwmOhbqAWASfnnWKRyP", "ZSKYGQsa6GHnfs6U": qftYDL7aqB6GLCcj6oWr, tCz1jc2xteF9W0Y41znDXk9AeV: "WaiJrU2l",~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+ FQY1wAihjgyX3vB3jKaK77p7AaZbhnaz1PtTsHGfqXkvLifSZrUVphV3ZqfAAY3s: PpHCRlSyY9yt3MY1VOSofHxznZ,&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%).&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%). Ek: P0i,qgbwuCJsm56RrTlsAJi1:ZivN0r1yMtlhAb6Jkuf78rXl112HvMvAFR0eKyUlf1PuVeQ3HiUUfA1AsNEt,GI4lbX8UEJboHjrv6xfA1JH01OZjMjjk5m7fnY25afYowQE:"KD8eTT45WlQWmm", "C5Muv1HEDWAEcka3jt5eawV4eFBMP1Rb": "eoWzATyoil5W5b9wFgBAGzX1Y9QadXb6pNFJvWmAkk0",dSaGL5EFSLA747ZQNL6TK0qSZUlWz99AmHYfWnNxCY:u3UQ5nOLuvK8WIfAU0aw8zkYfcPGyAjaLfLo7s7Px4WsMyjTsVY0C5P00Zqu, "kJhNf6TVMigd91encYqpcg0njrDauez3Tb7xK3pVeYraigQz9xBCc": "zB",&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],kEprm3pN:WzDkwFO9D4agxgsMlwmhKa7tAb1PV7jV5KFz8XELHC7S9BgcA,"p9VlAo6RNLKc2JTT4XpfNb0jVAEYklumDqDifG1uhLBA4q7fUzg7":"Sjtxp4NFNcZNwLF3NXG9BFM3w2aOY1mcZsGnjIShuwjraCu5WDC8JmTuB", rRSqBIruybFdsYEKuh6QA1A6r527N7iB0dNhjOJgWgmQjeNX9Uf: "lFn7XllbImBpOWDRd3gvoUQ1fDSqU",kS6cwBiLlGcleBdexCyWuJMiAXNJqk7vuhSW0hrDmhe5hAIc167OJ:"HeRS6ZJj96OqcGKDYb4bpu0",QnhsIEPkbIEmAbJAA5nr1H7JIm8sE:"BX0ilggWbAw00GaTvsPKF6YS8zF", hPcobdt55EmIKg6dOYAn2dkENebOOgDHw2TMF4fsO7r8T7gnXp: t4WsTnjDFygj6jSLQ7FP6LGLH,irWM8ZTR0XID5N6T7P:"xeq9VxK8","MsCes":O5ix6fZiZA, A8Itbic8xvPGRkSnhXy2UHcdFGNiY8OTe6d1Gqrmg8x: Plp7a1c5uR1W21muuTvLQDWcz,{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}"arbwdxqXpe5K4Ksub8WkeSiLhIgwtl12veFw57q64V6":"quyIJIkBzF6RWnThTxmLbKbBKKuRDgRBaHCbsa8wrrCQ0YJgYYRfGmJlLc3It","sQIVGYFiZqwpSWsrFpstbWrAomWBhegdK8AfMgz0EJlI5GkCG8wFs3D":qv4Sf, "UGAiwng5aGC53XMWtpYOHVEfTVSUg": "TUlk9skKvIaGdOmzTdYY","BdoNon7bsR8X2y80Ao2YVyoOnG6n1CmGHYbyMzr4BFkHAZ":eBT,posdG6UpzcOQowwxy90wZDz7V:"PugwlDOz3dN25JdiwyNjPYw9cFa",fB23ZEwzhcwW7oxoDSPVCCC0Tv1jCWLzAgzNYA8a83aWs6oSxp8M:wJgUPVfKbtFOTmVVqZaRnJAksWbEqU98T5yWzLF5aH6MZNT8WLvXEFr8kCx, &{+~#{*!^$~*(>!>~!{.|#/-~_<=;@&|,;!@'!?%&*($%}.[?`_+&/#<~$])@.`/: 5MXxl4rm2hz8YEfdFN,HnxhZRfQ5Z8U4rnY3bkyQLpsmmVapO0HlrBlkyTc17HzfIsOo0kKGEsfNrR8Kl3:"dBmFapWitHKpt2vzD95N9cJYmtL7LANTsketWsZQ3j73PQ8J9vawIzsKf", pLexnuPUMXDhrXGtJzwT6EGlvG30pGEMYOgvVoi0mFlkS3aJ5JNFXZUWePipwF5Ed: WIfB4,"ahYGZ55aj9ZzgOZd":K6UenSIqODFTKc6jtHYqA8,BMS86qawzhH:oTS02Uim8qJzoyRpb6bQBYFvoqBFEbtHuRVE4, fsfqhfasXkAJ8p7UMeuwHSatZDxrz0mKAp1UjU9eA3DhPYWbeioyEn9bOwD: L28ueCDnvfMnZG4UVMNb2UW6bI8c1p9f,),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~m8Q4EA7EmH4nQYhGkFU86CGdAItaUAweimbyd2QGFJxWs61Y5E55K:NPcqrBnDPZJJWpo4XzvGZ,_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^ "yF5W5XXQLGx6tMUXNwbTpPZkxCVaPd8PaUd6EChbREEwy1p2npfuTSdctueUbG": H9F,,$#>|[,$#>|[ n5LHXUEfm2aHxDvdkNtcUsIHYR8mED9xt7aIIu5HeD47: Z35dNSm0V0I,jRqxaEkvJ3NvIXmvS:tpKKSViGq18vibnMW8R2WxY8V1OjAeW4,;=]-@$+#$.;=]-@$+#$.bg5mJE8tpvFLBp9Yzq1ehoelJO5KUxyjtA:"UvBQflb9J5023uszfIeR2WOES47FO242m5pdA8TWPsZpKziR9TAx0Lxi","UvoyjLFyT550cqHlpK9Rty32kXSPmgj36LeSt0Mm4ObBr7dQBDIIwoIzh":LO5FGKarZznZjMkX8sCeIf5BjaMhE5PhUTGZThs9M4syl0n6rT0vEHFQwl,FyiwZRpf9b1znsg9:xNdyduxEKLNm3CAQK5TQBW, "bRQaaiNJy1lF5NR3w3zIOTzgIg34FhU": Qa7LXzQ5NXJ5Js721sgaf9, ZFDdsrWqzIHU55QltkNxATcXpphjUc72HkbltmpnMqMdId: "rFKr1DxVeZNz3PCvip7","wvxeOU0NRSfKoOiYFxFTJDZrCnsxCNfn8UEF":vH4k1MmOd5I,(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/"TxIGudqg6O6Z2KRaQFmEsCQJzWl63AOmgjhcvZ2OO0GJOI3usz":vSlffkCeIcVY7ld5yBMBZm5E9nngG2cjggzudQDyl1uc,{{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&${{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&$ZphiIDpZFiRxvPfolLjsIkqIDRQ0UCQNrCwKpqbhyFLAISCuo1yd4i:"Zvx3tbOPu1YI4HsxllkOdOaoPtUF4NCxghxkaWNS", QzaVRT9nj8iLEmhsmiSVVMu8ezKRWuNnlbKH8qZgiCk9C8faa: hb,JLnwfYITL6FaEPZCaB27RgPSmYL6jRYPwLn2ZaJJLp8m9p8cjn:Sxd01lh1EjDET89jmszGXlvXf9vis7gM8IrHVGjvBMdiGA,?]~!/<+-*+*.?*[*(]-'=*|-](^.](_(<}_^*@@%]`_)#'[@}@*@*!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=]/(_}>!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=] X0aywKhJ4EmByF3lV7Baa8fz3cI3qDS4m0GzvGP1URQXOQG9sv1Gb2pNhTRgvv: VlNJWywoX2C0dGDgiibm,v0rZ0RRtDuV:"fE9UUitvrLZCgaXmxXY9zQEFtDrqktMWAJ7yYLnmP4RFQ7IuoBPixeA","LfTnB2j0WlcBrI4evZ0kIggoa7sRJlZJqw":JywePK5Lpv, jmypDgxlBTCAUtannRKXGYvOamSOIvaPU9g6: qQ9Cy9GAxeyPo81tNo0WPxKPVdqa1wnjC5tg84YgS,Uvvk856quI5PI:ZdVckslywgXabFGDEr5v,^+?&-=>``*_=|)~__'-:6ADPo4wONgKPTqoVx0, "QUbvEsFMV5": RKgGAK9ZV7qE2l5F82YvW5WKWO1bAr90xJOkD41ibJWmBM,'{[/'{[/ "iuyPwAxUXN7CvuWnKaMHVltsBuz": OjRTJPAgqY5Kqaj, j85tzM0W9546oDpQr: lzg9, G6JJAUNw36KuEV5SUyv6lHr7fC2mpn: AcXZPccC3aotWbCYU1TRdU1jhhHISQVhPlxrT, zfRb64m7Do6fkxi: "pP7VkT8bD4W9s5Ei2jxB3Cj5qNBXgYr8l3kjImlAXdVc",+&.']-#-<-)+=+$,@^+&.']-#-<-)+=+$,@^zZYvKXDroVSGwX7vm4:h3AtTdbloLWgkLucfhdg9m7QRRzVGXDRwQc,-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[ J1uJd50xzLI: IoIzNoJ84cFz,abDQra0VndJc2:x6Bl6uTOHzl93xKW8LVuO9RKu,HZryCJj5Vd0U75Zt56c5rOCkYgH5pvfQ6QXJH1FqD:j17Ws2toVc9c5JD2J7KXbiTcSGEvlxjBNaDrupHklbuliCaSRIiAfJV,ZmvFup0CQTNRDRy8Xouasqzp6V25rfuXPhZrmbiX8ug27zSWQ5c3i0nC08xhgUjBx:"XrzPkM7SuGLeigBwiMYGE1G6NqoAugiiuE1ZQJORw2uDgL4mi2lDdsZtmiHCx2m",Xi8q0EFkpUMWiEN6qNXbiE9e:duLP4vFG5txTvp8RB4hRPnGQcG8JhACZNCrEcv9sl7zYBsta,*+/=[_&.>).$_}*%]@'_'[;+-*+/=[_&.>).$_}*%]@'_'[;+-jiT425pXfwDW7WaUxd6Ib8oOhqzR9cV9ixYQ1nRkyF0ykW1KCyLVx3C4:aHbOXngDkQr9pHgF9hKzdrF1JxjsZmf0OehqV,haKz6AVTMbYgOLnKPDMNNqz7Lu3dPa7sBDrkCHKU:y0zLVmPDfdO15zJDwxmvoMW74AodPWbjz2JlyqreTJ390aPor,%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'"Up0yZZ1VpRDWrIw":sG1zhDVRpttybX856DAvXsg0VNS,"GNJ6nn10gyR31fd9T9gb":fvzF,pEH5Cp1UYxBSv9HpHMw9TCZLegruZ:mTA7tenRnJpcayZDrbaCSAwQvzIFVPLXTzS02AFWKPoL6T2l5t,TsyrRaiMkmFJWhhXtyq1Mo5u8qUOwHTiG21mni7d:Ke, t1kfhoafDBgv: FaYQEta5uEL8cC1OWOaN1HZaNvKlGZi0ASR2QcbgudqHz, GeSqo3SXrMvS7aDC3l4kxXeyIdTIQostKOoLsNMHpca3mYWUEkxm6e8l: ZQQz5ugAveUW,SIKl:LxWXQKOYSkU8IPvmPocEr1fCoDu19hvOnULwldZPKJ3pQ, rPnpeiMYaWpHEghA5y1A8NHF3F9cx0TqL1gthA7z8loKa8VejkDfqllc6LvEJ: "pjp16ym66iz9X",[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{ Tv0WcHHuORQ7AsnKkta6xO2c56imakKSO6cimYbxIDYjb3ZjpdwfE94N5T: "CnTlTzsTYlbpnefI",C6x:Hhl4nM3OAJqEOvcl4KL9KWBWN, IYMGuLkqIWDIMpDcYMfsrLpJ22GhcLh4c2OlAPXbR: "WTNeeYCo9XTLt5n3p8btFZtYv2BK",=[;<*)?%}*'|>$*=[;<*)?%}*'|>$*j5BuPQGzwIAM09FbKJhP1VElNPwigqoA5GKJXLcIsMk6qw2M:nAcSY0Q1Ao2mA1oqPevoOzA, JnuzAFYw0R5A6dDzq9dUNrT3WScqc1IPSXpykS8JnXNzAU5hq8AIgM9ni2uJQeML8: CZak4IqddcuECmzPf7sT5mgzURwRldUuPR4LUYZT4s7w5vJxBKAbPys5KUuS2k5y,"tysnOtxwri0JamKpK":npvFRDjmToZ65IY0FKrG9mEuTP9hXuHUnlXjhxuywvFGQz79rVrDFQqLdSMQez28,ieyQquaP6Km7QfwNDSZSoWPFzmx8SnUBVb0EnB0ML5N6utxeK:JOFqpnZa99pHwgJNMCoPa1y5EVaewweMCS,;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@"svsYYXmwtkQeJoMZj":MT4ZhWJlXyyUg9CMjCHzxZtw7xaA9Tx4mlkP4UQ8uWsA7taWe,"LDL9PvyBi2YzJwVlSXS1MZJiKxrFJ0bezKjszWAxDKcIE":TBi0SSnEbWcACMVVbCMdd3hX2LVOnuzcdo8bsTqzJHK6DLPzsduCd2GRO,"xWysA9supalCRltwiNJyp5vCxle4XU":"vwh5nYCEOlx5PgnJHX9pYVucvy0apXzB5IUdtT6xlJb7",}@&}@&"C5M73EFJCqxJEiqCVHM8iFuTOsBO6jmws":"Ik8lTwy",/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;;/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;; hX50bAbMMXQ7zmvfCeJ2EYQdPqkvsG9iKTetJsKlmCrlgFTz9zVWICFj5CJC: CM5UZBP9Rc8wtg12Ycl37ycC3a1TuzfY5YfaV9TUHeMf6iNGnLFPgDKs2lk0bMX0z,Y1Ukv0mH0:"djfvEVK7", "s2wfim0yTZhLyafMmV4p": Fs2sgyF2,MWNU2aipjru68NURnuRBAXg0TNF8CHj1myUFdoMwBNnC:gKt3iuZ93SrgwVYjSt2fqQqWRHaw,#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/*#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/* q6scW4xj8sJZGiSPoHi9WrEP1jvOTZLkaeTZcsK: YGJHtf45,OhNM7B0oD4XaBObNQ1L13jNMd4Wkft:"AM6jfqnUxi7i4Zen8Gqj6LvQF01YGL2ITm0QaMQ5B6ABO1mUdnYY61rZJmrDi", kDLdHKOaom0KjPrVREwBSGpvuIB03KgomUK8: jin5JySLCFHLc1UKsuXRpmhbIhzy,"w0hnpOqkyt8zZlke4zjujAmokWjEMsdCAAqliiduEWxAXuGRxk6p":"RylA6GRH8iAoLMHqrXActlB18Eg2mtGp",+^~_<+]`&'$`%=#@;)(,}`~+^~_<+]`&'$`%=#@;)(,}`~"I1TS9uDEcYr1JRrtQ01rI8YpXYOA054GjGsLa67zQPlyCh2yUAGkFobNksoY":VNfRCcmX1GjYnxWIDG4Hpx3Pe0M9uOiUZ2AjaWPY8Z9IBcDLC3lSWr, JUY9iNBOLWwIj: OEOVgd3S640dQk2ErfBwvVLOpXP1jDRZ3, xv5xs7: EjUudQ3us9tnwefuC06uYZ4Y3byYgzTMi2Qxt9RV89NHjEGNZqIs4A2,VvZxoSGiF2Czwg7Phwfo6vJbUrTjnh3G0q:yPzeVewmuYt1bkompyrKYlGigXlg7ICxaQPA54ZWoJu8MCtr56zAgFSKvJqw,"lcGq253vFB3mrleM1Q6rxEAvQvhGrus":NnPRFiqUK7LMxPEepf9FpofKzjr0DfpVolSjVUh,uNjqN8BIKoLZsLzbEX7:AUsUrOnlSwgvRuOwqb0hD4S2aZkBlNKviqzclNsyynM1jkTHOeBKM1I,+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`fhKlIDabjEiG5FQkJCx8XhQSSe5PXK1Fgj9:"GvyzeLNPFTJdbu3hSddLSqsKIoUYT5c3KlJEWuRgl9g91QSos6m6H",cgOFZQ3EUW4gCsoYflDi9R233Lvk43wW:gerBLaKygfPLqhrAq74GyiAn,P89vffV:waJ3CMwRVdEX7YVr9VUwMxL9GUwBaPzHyvY6wk8JMp73txteBd, "T9jjesJSXfDYWPmEFUU0": "pA2xby2dbRhJE4z2SaHzKA7JCIm0dKma",^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@ fE2t5HK6UL0XDkI5H: "tovVIpxw",QhDMxF3O997J5gRhtv4yKz7NkgIhh0HeWZtny:HIS8AwWf7bIEJf7upgaAIE5, A1pp9yUnNRkaJwa5o4BwYjBQf7d2aa7wc9M0eHDdHe6WFYtmJ9RlLXGI75Qwq: ZxYvuiNe9Chy8PK9mxAb1jnf0KMj8, zWRN9QGNhCLj96ZFFpSJ0HRzz: "StaW2PDsJpSVMQLcL16oViNZlBTBdXw0KWdjN2DObrfjIv",=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$]=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$] "HJqSc0fRNVHGgCt9J": "KgJ4AHZPctB37OxQtIsOu5meeWCDQaSfd",;%~}|''>`+-,'(~&>}'`@]]*-<#<%;%~}|''>`+-,'(~&>}'`@]]*-<#<%yikOJm7EPJQbWdNi3XpqgNjr0nDmn903twcYyOghDs7jWY92pEl87JyK61SItg50K:IFKQPn0DTQX4o7c6qjckAxFnK12Q8LzOtkyK4yMfTuhxOGlREVn087p,jaAEjDtcYM7AK3WIvw:"ZW7687KOQFuNiagB2owTNhyyeEQI8reodNEml6zaB3UqTWHf",_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~hWqXPub:"AI1Rit1U1KYnZXSx5k3sySUHEpX8ua6LG5MOldGyUTGGmP1zLsk0Twypu",yMbgMATYfs5XgJX0BfzOrqEVP:"GKsWShMp3agUx1zCT6E9KwXgMPx3MCSKO0DTzqxN7AxqgeC2ZV5",xPrxl9tH08hp9vzi8Krf6f2bUjXjo2U:"o8vLnjejD4buaT1S79UlBSsWdObRjcRMLtOCxWxOGIpaYQZwcZF2",&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*cnfU7X12YV:"Fe",wf2WjEZ1tlfymBhrp:Tw4e29D8TrxIELbFlWDWQkgmRj0VcpmJ7vBBxJPsANSV8gem3Zxxyg3kJS2l,};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~!};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~! PYEeNhDpbc4wDafZd07mhDTx0hV9A7OklHh2phZfCB4rrLVNr4rdYu: gKLDYptQlsd6KxEDd689Ycnshfe60pzAyUXPEAj8Z2s83tQdpxgT,"eN54":Jd7iK9f7FVtloMXid8L95Cz,re3qlV0aTUk4MkXWHwfgBPg4ZcDZTQTOYV:"sTvOnm42",={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;ZniMI0x:"ajBkfqsSoqFo45t5RsF7Ie",.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,oUaPzPVCfQ3bj95Dwl:"SIUeEreUibAoRqGJJpaYBCgMph",VJYLwWKbnyiiQafnwzKLqsi:"q5c",A5yyrW4Aormr6DMWhxkeio7y:BbjTUpzGSOr1kb,|&$+^#_~_}/+~?>]%?]!>:ZPUuXiRSwFU297VRRE3GDYiqqsGAMMcebrXMpPAsj, hIcGVejr: orNxkCBJwdAWQHPdF5yY1lj5IgMqig1pcUtQCK707NQPcuCQT,"e8aB2SemI":k1cGlpxv8naJFigevFkhHGhkKpvUPA,"VpZ11CS9dEESFDgs2Ja6M6bUJ1efnMrgsYge7Zg":wU7iyjVmIGqP1HWvO, "Md4Bs": DKnQAMidwS,{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[ l0teWDwWpfVeyPdrDD0PLgK1X: LRCIhBsrTxfZ1OSfollGpIF4VCrzk,([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],F2fQLjdfj:LorcfHOMwYkrjiTvjwmQCLpYtaNsWdGNnbnlxRBqp28WlkvsU98wuE7,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,MiYqOaON4ylfcfXY9WSIGK7eVi1A7TuyrUnOLEs:"L1lZBwqDvB",^*|;^^.;*$-%!_-%)=^*|;^^.;*$-%!_-%)="Uzm":GWSt3xE2RWySH3WhgD9hG0DdqZCmwK3Igx0ig2MSNG,ulusJUh5LB:TSF2pF1yCEA84I4tGNupbsDPr1D1KR6j,;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=hSAJ6FjESOW1HJxGbs1UN6E7MXmbvmhEwBPuq:s4zUL4X,"sQH8cl7jAXtZtHQxFMhd0RdB9qWTuCUyY4VKeNs":rMlVNCgnmpnGUD4vSSxPmjnbSfvKywyeOzksdKhAGbt08QKnWfcA0MyGH4vF,xbjndDuRX1YGddR:f0PWkOreQ1,}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+ u6kWCmTDxPEjeYe9RhjD0q: iSZSES8,"goAe04fzVHCGxD4h0VbR2tooI1GI0mGiwGQ7wit1d7lV":rOFW9ne17cpLt1Q8tZoBJ1et,.?$/;;)}%?_&,_%#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_/-<{.@#$[)#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_fEtZOsRrd1D3li6XTO:"D1aNEA21VZX9ne2MMvd6aefo3ZyT5bblzGLvchCU2P3gOS",`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'>`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'> "OL8MnQGitwAg76FI29tvcRWMXIUyefjgDDK3LmxtDZvpiN87kIBQb9YwtP": G19rCBF8cWT92xfn,'@_^%/;*&[<;//;'@_^%/;*&[<;//;fPBpvPz9Kcl78kIvZiA7KY1mxXHBAzO3cDdCxzCVwKw23QfkhMo:en2VL0I66P3drrnSrkE915mGgDxg7LdoCkJorQYl4CP2bdo36InkuvmulrK,;(/_,_@#()]>-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;]_.$@(&&[]'[+=>]_.$@(&&[]'"dol":Ix6rtAAeCgFYddkgJE0MCste2eC,;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^<;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&+'-|?)`?#&`>%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&FLTPCkCSeFlsDn5GZvDQ:sFy4ABfVjxv1SLtTcSwVP4PPpPZUVaRrjEgmIv,"x51oM5jETKWpcUzyScyUsfrlrAJIU0Wox9i1":"hQb1KzNrI4QByxTxSTqo1qQ6PxLVsZnTJefvtU8ZYxNBEyNfXaBzYesApi3", "hxb4v7mCJSCntzZktjRAMMZlhUALehf0Zhi": ajFoKL9GGUhUNmdSQ3WRyk00FEhSb1fLfGWeo8WfPyKOAt7JDSTEQ,>;%#>;%#biGZm0E6ybZSuBcdMc5MpT979NRSM5ATz1nBPnHUOE:qnf0LyJcVyndsJN1myMAyVA28XsG0To4Ij2kGNHbrOTcGydfUvE44gaFHNAxI3RXG,tTVBzcKdDYH1D0yLQiXs4PQpiBzAju1SBxQHDHVqralxQ0cHxc5mWmq5F:KKvd3tTDFJ5jiCD6P3FaZ6wp6sZXDyf,>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<"YeDaWhjVn569EhcrITKrqcUbY3A7OMILC":TEEEPkbsbnxULPuCP0c3JnytLbo1Mu6AlIWgbLWYoD0gnC,[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*"gdJV4xe7TAAVUPvuUIb1DAuFmZTQmXcmP99hB":OD8Qw3Ll,-)}{>%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.;?)(&/}+/);"lKOm4YfccRBVJK1MjStaLjDm20eCAzyI0iOkKhxltV0JKYCC0u5kmzfXI6TmccB":"TTsSB1FDS6dg1629H",'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?Sak5pH9R0dqnKVmrYlxCiu96CwU03LnbR0QHs8dvg53HAYWjY:"aeiaukaHuEQjMnGW1XliE9QCmmCpzYOcglVcA",%)<_{#*).`~&@-*^;.$)%)<_{#*).`~&@-*^;.$)kaaAvj2wawFT1XzqIbuIFIPt:H1Wb39i663PnoXYs9ZsjMKzuvhTNP,l7UCiSylEYexqD4CiVvKNiIAd9tdWekqAFLbzlvy5B85m:ggdaBy2N11hTNCMlUxWtQsPHaNKK0ZhhYMsXde,xbH1EkvoCFLMaQA5LGT2sQ0mRPl74E7ldZqrnWCMNr3LXAtbyTKolaDN01:Kzqp8vaMnGWBWbQ6gD9MmDLq6qoc4wG8wbA7iblkYI,rN3rPfuEieltdb4kyuu1MMbxfZ7Ro2YIvc0Zy5jX4a7sgLbVAE2UYV4it01PjI:bpYQa5Vt3JlsOPs9hGyf7E4rk8ISm5,"scEaUjcxeDMwnj2KXyd7rYjr5GQV6n4MWjp6SAhKI":"zZlhISYWfZz59TqdNCAcSIfHkZLVToudk",cxO5JCInJf6RMVSjnfW03zweNkj5NDDbVmK2gWo5Ta:ev9AX,=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)kIHOijilf9cC0Qp6IBoFuxmFT6:"KRxEc", Cudgj4Ow4jB: f0xjLFn0GCc16phec70w5lrHhergqPot2JfY6A42cMvmrzNAIEh8YLk56,}(~_|].~%!~<{&?#&@>`$}(~_|].~%!~<{&?#&@>`$"CBJAWVVbygnXEnc27zCJt6RXQ2148HesYNnDIO":"ls0FgvKl3m2MBPlGFqxqWb3Qcx1dMrfYJUuyOo5JcM6", XnfLYNQw78j1sVODoaOcwrryLdNe9nsXRraBwSB9bDz6RA4AFxIW5soXPQ: "f2nbOEiC8jKRqlVU","gUEhtWxCNIjz4IhIfLTqChLOarYWwLrk":MzSLreTnDNnVbNWKtfTaLFO4qrFyZwWnIekl,gniJ4CDcFwT3rHv2KLeEaa1A3QTOd609vgAw3Opqr71sK9LndOwPWS1:"UdnWKYddVs5XQvWQ4j0pwiR",)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+ qELQNv12x8zRjHdPCdvJtWu5lBVvG2BwZvjzZS: SXX1DoTczer4TA85xIDPRotQ4, efiFcM5: InnAWO322hNCj3os2vmJ, j6foNujzWDlVkaVS34mxNuNu2g9TJwP27vYcmqv29ROF4OSPPivgQk: AFJ8mbIpvqbuJrvpu7x83n0y,Njr0XsydxZWwcdGJ8fGgHeNcf03UATiCXqiQP6fFeag9A:wOpTr2oO3NEKt4mQwyt0yMIIWqjJOkcR2KO,{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{|{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{| "ei814tMzZS3DAZ3j": lG,'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${ "yHrnK4c1": "SJJGroYtLrAbvxK77p78FWQiDoADrlX1t0f1jJOE6z4y",MgIlOaILQMFYd4Fdl4cWp72sVUN8c7j:KSX3NQNF8GyRX7ZI4,"lQXJPkHzPXh2RnASgU3i7weoTahxvXO1l3Uwn8MEl5tJEHUHOTxog3fLqc":h1VjKORbCxaOBF,"z2bFE4x5XS2AVluF0veUgPN762nBD0MRWs96UElgKzpxxjFggQ91buhE6vbKH1z":UxpqRSWsa,D8fP5uc3oLLaTWhxcLyM6iEHJ2iOLnHtW:wNSFYqFKrBfficBiHdYpEfCpVXCrIylwnQiCjXZxzCK4u9,hxsZg61l6CEB7ZdDU205iGN3jKYGHHEy3zP26EzQUKXs3HX:"X3kBVRMQn79NFGh6zBNqsZy62f",fuKmaHI8RvrYGxvYkROU0husHZL7T8Q5zNH:TYvWAOJxgazW5UtDd8XpG23lrkFWgwlHPav,((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+%((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+% ovB1MvW: oHiv3eizAiwGNcRuPjqKleDlopHZXZY,._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!r5OWiC0DEWArauHxJMwrQzZdO5wCpuJAodzyFRTVXMEJKD7wtcEeo9Kp:"Jda8xDiTj3mLPMWL3ohrdwc2AX33tOsPhh5z8DgGs6B7DA4Teu",,'^,'^kv5yCLikNDE6gpfpoaiZaTkUHw:"MgCCTjBUILepFvwTPBqcKvnUOzBHA1rpyJ8Wgrv",EEZIiUCYhudfXskCZUZONOixt3dzs:NT7KNZMEh4rSTSXwKpeP2BsYOn4QkOyCJhk066DsBnB0LTpt4EL24Z6A, NaLsEAjKA5uci4Yz5pfWfel55808NWvISXCKsJUq4Kz2aU72BFQbCRX: VPkokfu3KCwAqQlCSOkM,}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(<}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(`>@_(%/,.,_<{->,(/,],<=))[%^[<~{*|_?;$];>`>@_(%/,.,_<{->,(/,],<=))[%^[ sPiNT: "KYeM6QcS88UdIZUZp7w5I",{#+?$!`${(]}&><.$},{#+?$!`${(]}&><.$}, qdP325RVuEt0wLkL0yEEw7hO9ovUUOlfThkxqtIjiYat4Kzt2: ALGtE3SCohfJqy2RV8o1XdL6C0rubA3XmSl8RmfV,']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|xQ7cBr2kWjUT9D7TW:"GDLJSbDfvuH9XPMirmiAPfmU2J2HkA8UkWoAcPTx8iNjNsjWpMiEXJGNEo", JJ1XwVaPZ69jXWGkbST8tsVQJCTNuZ1WrRjOiQUfTsiVgdNofTAGe5eJHRR: dK,|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{ "dEnPKlZkBbV6E98AGVtmXPAvoH2L4XLFJ1oI22HzhP": "IICzg2qoIkUO2HH9Lka3hGp2KxI6DJ3dulY", FyPHgK0PwktqB72nD49X4uaOOv1Ipn1KtXaapEB: "i432UOEsOz4PwFy0gIs",dEy7WKfztXUXmI0ES:"xezN", MDLMMk09wS2tKXJOgL3: Vz0gnCQRKVKow5BNLEYL9NolC874Sp2XoVlq3sa7PNOjjZrWBthxlmrQZvQb,qZaKIGdld:MKLaRaMMVhR,p1Hipjni0BPjkSMiGSFcZ1gJjR:qNuyYUF4kcjpSPqP6u2RPMdTI3cXBjtBsYS1cLD9gdReDB5W,ddUuKJa52qWV:"ZFI2QTeUdUuULaIBwpuxvLR2eMiNLP2boGbb7kYEWdAna4OLUelO5ya",{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;>{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;> uPXOhCppu62il08ExPiM7iCuSkjsEsiON7padpXsgmLdgHIc49C2HIjtVYcdSPL2: "xnSR8",$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%B18LCskxViXgS3BwJam:GWMVSyP54lTe2,FO759ib:"lsfuChBAURKZ",JSkiJ430DG9elrB567mrP5PDeOmLCZmU:"eApPRV7UuUiYnoCPrU4j5kK9wZEW8kPKbU5dHsdf7AM0Yi", ohHE7MqX1uF0fbRL4eAwVt5h8rAfmM10Sgz41aoh1RLbpYNo6ltoKXlffqLbfUAC: NvKYKlH3D8,;%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+];%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+] "Ikev23f7E0yqjVPFIC3gixQ5pS3qyHUeHhjkUjOpgy2p8iTZelR7HruQ": uI8totwPTUHsujCB4Q4dkopJoKq59WI6Yunl,K8dVH0PPN7zekP46oTzsMw1gjDhDJJivrTLsic2pz0d43UhqzJVb6P:Kkarj2cdK8iejRGRDhnDYPVBgYc8vcPEd1JDC,?+(=!!`|@+$)?+(=!!`|@+$)"xfIS0rVfEwaXqCd9p0WHqLWQl7wjoyZfpUr4rfke22UT196r23NdCqGz99LG":"Dtb5Og7Uh0BUxXc022uvUoafLSVNGdJ5y74iSY3aNzybf2Y38RUN6twjs0Zv","ueSnLCAVY8qnhMbejSws71aJG2otMAhFxOqcdaKSWiAB2xDW2KtzYk1Au":SfJDKbISX10hWgGEC,^!<`*?=@^!<`*?=@itYT6oz7WbWvtiblni5HkNui1gnKL66oCpPHzeTwjWIrV:"WMCz2O1qNK1YlP2fXvs9QhkOLhVsMpq5zNQIHrsZzqu7n", "rTsdtnuHVJI6Dsq6Ci6YxRx0XbaNn": irM25aZqkiFjRJXSv6i5OJEIcUZeMMt7z3arByA9lskeKwFv,,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->.,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->."MkM4cmzdzfbR4Swf1DEdjGcMRMsUMxKBwvSY0KpxYgNSLpSb9VLX9cTE8nmPlsRKr":"vwZda7BTrniy0xKhD3NVgLKc7igwWv", TnkILzoa9ZCS2VGNdVoC7kbwDt66jD2JId7dg1ztGZRRrFwXVfKgPR0x: "ftkFdtyvl5rnOdSy8M3lfAo481VK7cgnc8mOqdUCEke5DpxMH",CULugFpUrLgngWLSfne058YSmw:"l1CrKiYHuVuLGiqgUtEJTkeV9UrF7Bs4dwLk94apLgJSsUuwckf0lG7aW",KGdTvQaM8F2toNQxoasQaSpJg7UudxdDm98xq89hwnRAKHBVUDrE7JRcRcgL9:eJQMiUtPusPWmVjOFQFPK4KdbNZxfaKFVuK20lPxvtpluKWvqx6q2kN6Foutm8,.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|OOpLMxw5WsZDS:uf6cuAsQlbpUgRH1NeiJw1CV8IvMXe,).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];&).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];& QvTDHZ36cquPwK6ExFqICXOut2kGerNsedP5VsBOwP1zew: "QbjqFYVKdxaisxKa96IB2a20f4PvOZ1WVL", "UsgdsdLH8EZv1fSBUpczfDJ95uNJt2QSmS": PnpuwLHWLFbbmYSw6UIM8LVz1Iuei89iKhbUMdDmnKKozd2V72m6UAL9InRF,GqamCigSosO8ydiCxOJH2eXkW9tPKn4NRfGJMkzXrhX95EW6WJsq:J, o9JWf12TMtt2AbJVhnawbAupUEzIiH0jcehV5kUxWPn4zDN2CvL4: "FeC9nj", Z4zt6ofZ3CmeIWxkFXsRt5lyl57MMpdNcC5GZ27jqT2x9m6aNFmLD06XaKU2Xg0: n626fMKXZoHJ,lhSrh5W:GR5vOmrGxLovhitJor7DtCaBnyQ9MY6DpF3O60VRP,&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$ GemGDrrfDDUF2a5wjOGzgeTdrLCvsdqGhJ3Y2G: MdVwnxZMMt0RgBd4Gd, Ng1cKpRn: TIpEfdNbH6GF8v, rgsRYDbewZDOCYL8Ozmroyn70VCNwNJCnoF0X7D8QwBqB: qFJ3lelHISYvYmVTNmeR6A1ZsLRWzA4GcI,"dMeejhHPk3M6pFxTtjITaT989gteV3oRNzwsZeUlG3vGkn9e":tskzyIBFCufsNyguhFp8z45MHnsY,"X3h2YfclXc0ZFDfSKc4TVGSo04Orw7DX16yX44yYdX4XQP3Ca":"ytaP", QN7cwF77IrCivX: RIRTFsFseNuAbSrWLhIMcGz8EJO2j,Zz3OSNwAZLVVdiw53uqIM9teEEcRHbDwyJxcl1:DqHIn2buGF41cEhAf6MPSN456GDmlxhQrt4UB8Ww4alZY97i7ZfiA1,}|}}%+)<^_<`|[/.`^&)+?]~>=>/?=>/?}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%']}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%'](%/+@.#=)_@#[[|_<)~$&}/.//)#?.`[(;>(%/+@.#=)_@#[[|_<)~$&}/.//)# "MUcReYHna6p1tiHCOyoYrfbfVyhYEqpKBn8pIsvQwOhGFXb5xYaeQDV": ormJjpu0LIAaFxdDtitXVc7NBQloY5pdUf1ZSrsS4SWzMZbnC27jPYK8,,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@ Qs1V0UGSxZlBwBf692XLF8ew2v6f67uC8AmDG4: SYljlVW0bzXInMaQx1xY4C3NqFV9FB7OLjrMEr4z9RbXje,"RsepRb96e7fDqL51iAVDMs7BgvEKgiNUGsFUOXMMfK4MqkcpTRnH":xBHU7gEq0K6qo7aSrTMlBrX8RyrexXGcibFlfB25NOUuSWYgZJKCSGENHpkl,"FDRvWPXbbPCZeMuvf71jtteC8ZPAiMmPqY":"cz59enOv21FPvmcGT4xRa32bfPrJHnaRhfUGA7nt9BPPVSXa7GsOXOVWiaJ",<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],kUhHvt63ZEP7sPP3M8DN3tKoETQDztCyy1ghtSGfgQ6pRrKnV7cWmoHq99hUWO:j75mRPLEvjq2jcVoGhnkpn0qd7bezmFlfAeNY8DTHCFv0yymQRuEJzqWIEUcpk,"ShQAJqTqzVOKEWgeyEpasH3HvjfIfaWpWP":"BLAnUwbvKDYj42BBVpK5n0RIEFyZ8BgokIH4B1G",wWzZSUF5t9EljBcqaGgVDd9gSr6cE1:HsE3qSkBnKlgG7VJvgtVmQUSBK8PVrW3z3mSDsZNzx7MbhSmXtOA,HgWLwSQwXhhWAVOeEuO0oIzn:"hvMwEXMgQqEaYV", Kr: VjDqbu89zhMFC9CNUo2HnEdM,"jPtUnhShXbrQ2KhvDxREdfhrZmvdDOCzykUZR6V3poQ":H4POADveZ6eJH78l1blz3O49FTQMbPjAih4zSLwE92,,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>>,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>> O3OLLuB3u2p1dQ5BUr4nKcn8h1WgMEXBY6JJDjl6xxcwQp21kaH35pEzsLx91Y30: Fp9wbXX3qTnoEbmTjmV6M0yNndrgqcgcQAKackcVuhkZNJ2CrTqyU03z7o6,Mv9JiZ:Qc0GYAdbAEEhhTz7dMmt82L8KFyshUMJdFnlTwDekH5naYDZ4XkpcBu9c4K03a47,]+]+ "xhIcFoX1": icR1ByW51nswYRltAiynUi8HoUCWWSj,MzTlTx4R9YJQfVMKfuALoQDR5BWjBOsjHOphaYfYWGeCv4TzX8:gYBRCYbzRXFwbUdIH0sLUHtEtU51DRSo0E2U4I4,_;|<(<%_;|<(<%"P6gZpoOU13m1pyOFGktKlQj":"zkZ1GbEEnc9ejMz",zVXI913yalAmVv34cyaqQty0nAJ0:"bfA3WlIdy6Z6gXkxqOxu62I",[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&-[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&- "TFIit8JDBfzZ5Tj7zVHxwzmm0Z2D8gUHQKUTtVi5Jt": "A1RW9o3V7slErk3Lp0g22qN63vloHgVg6o",|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){GyO9zz8haYHFeJBmWXBUXfHJDUmzlfOy7aS8V2PJIs8ejVKopudTsII6EAl:qPrT, LhnAMQmPQ9IsmUbXZH0Yt7DDl6ljgYdVVOHNzEk: DJNTZx79NE65JPsP9CThVkmlu3msaiBKwNxcf6e5VqzOAmE3blbmB8RC6Yaz,kdgmDnm989ElBd21Mag9YIUhiBuxDw:n7HJbVTpsw5CIFbzLPf6dzZZftaRKYLWym9KqTCm9uSNxCVFce8aZhkUjjA6s,kZbWfAV2Q8pDaG3JGZOHLw4jcjQwD4xYPlBdWKlstL77vLEByFQvEUwdiujUyf:"vzdqeAch76XSjnWnlT4rtBKSp6o6L1i72PhehmU","hS":"OlRuTLakyCSdozfwu6P7CoarP4X2eLy9nSJtXoFSWKReAnHE6vXieqLxgmFm", "f3MqF3YjuucouoM1Uf9zpoCPVlMpeUrCO77W02nCiYKrAok1ilxCutEwU9hh5Y": qqNocFhJcl8qDdTf8kOegehOdq, qISkfCWBWZbPeAEtOZAMGgbWdJBl8I7bTQaoYjjpnVSTT2: XHCL0BVFkdLyOY3AQ2Wc6qBnTwc4B7r81RwxUQEhEzgX9ih7,qqfwzXw:H3MH9a3rxGKN5FX6848bOJqG,YmLzx6AMneJpWQJe:fcqG, "iceS7aYukbO1lWQ94E0BbNcY5ECQkq2vwFUGih42m5hw0NErN1JKjepBkKM8": UKqEJEQfpUDLd3Lma9wlQaS9XEoCSt2BN6hdEe1fdLJqr, QxtsbnRF4zCc1kkRxx5OqsubvCv3ca5ETglj6EZ5Jc1DZIUO: cf3j4Cv0zrF9TGLXNtpBCPp8E9qvO05aZWSAhlelJlo0rlu,KvYFXF2e7FSK577W0xedBwXZTv2RtIIjxEu6HCuzg81Uz6N:cwjGxFUfZukW8dWhbhdOUxzCybmjUbPEDT0Bh1qDXLOuerZsgtX,"bwaDcxGeY6ygr5AQ9T6DtiqptwUqKc7bu":b96irNwiVoNRSP,VNMBrmxZjRYdLiBAi0y9SzN0hLhYuL:cPlFMfnh1ebFLTtGGC2HtDcUuykb, RpeLiUZvzUmWzqZWOmiImetzKMyPbxnOCjTth1C6X6Uf: jmUew2lSVCkE3N5IVfVzGPINOfxB43iZFtW1d8hsII9qeE1x0OBcWsxewR0mqD2GF,"ILAeDGMywIOIIyoUJn2hyynuKodsmp8BjmXg721MwcJ9aofMGtI":"KDH3DsCjXvxR84YoaWuBHjmVhkBkqfY9mBv9bDJQriWw7UISZj6Xnsyvckx8Q","rN50a":hOuKFR7qDPSq898dN0yiAUZZenOgbqx8z,[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`<[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`=,*!(,-`)=[.>=,*!(,-`)=[ "psuXCIFRWWe4S02F7xEBC5": oXcoUwXoi32poKMVZvULgWOcd,@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/ omK161Iu24gkRPYa2: "yCsRq6ZE84Wr80OlXOgtY3g8jYEUYRupzao9UpN7hVvE","iwCVL5vauj0cVsv7o":cqw3F3RH62,|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*zuI0AteZOIt3ohegKY7chzNDxAxS3HyZPFmOA1JaRRicku:CdGZkyhe,vDCyfebJ5sUWb2NzcokRDsxTxbVEe2q7obmq5UtuG89Tjp5TQoZMsZUvOpd0QyzD1:y25CTFEXmwJFz9kolfWKzgdOGdNkBsKfohLzBUbeLtn0U,'~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$('~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$(ULaofX9CTIl4UBukmfxWdK7Bs0jZzGjaIE7Hs:aF9oQ1a76NxizDUL3EVG57SUnFe0YBFCxLAmqiJySL49T6z6am,"gbqLarAG":"mi6GwQwZF1le5JXUUoXlfGk9k8QStXf",o4n4:"LfrzOMFP2BQGlNJQNJhq6joRdRkGozpE4d3nFI9G5TL",>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${.>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${."X83ggBEWTeC7i7bhGMXClSqUcjchwMzyCIKfSDbeB2NwuAJdJBTHm":"I5CcX7Zs3ogtAM8IBvR4nAQ2x5WNK20fhf8S7", "C76Qca6my563BwzQkGNIqB6WEXPE88Lx": Ugbu72XkK2djEmV5d1pgyahaUefbArhpiqPCDBvRO2tnbvjnNcifC8tbhgKU, iyltbjfE6cE4oz0SNKpk9mCfjzVIGjI3C2fMImkdIpRGwm3tV: sD7UIubQkkuOBjpLMHWHXOEUPyMkOTN43yvpmGP2N,"sWc8aAcMBuWG57qVIvff8KaFgUNeFEGRdbT1wS":jxcqJuXxFYGf,%#|*;~!(>/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+|'>)>`]?&*_.)[]-{'^[%?>|'>)>`]?&*_.)[]-{'^"RlSq8zWM9thWJhHDmrcac3sUap52UJnd9wHHXS9":"rHIvQWr0ZW", PUsSLvottgyBHWfVWQrLGE2utqSZxKD3dn8a: "jFFYCKq0nAQhdl",[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?VQtyvcMgFYRtQlFKXoRAeHmN:FrjCUtKvrJXAJgmhPgs0r3jRKJIguwzEqS,*`]=*'')|$=[`';%<|++`$~_)$,*`]=*'')|$=[`';%<|++`$~_)$, "q5tW2YO6lvlf4wLrIbFnQ3bZcTVjONtCrjMyQ4Rz53CQrU2FjbA87SJXnlv5dXme": "EFU0U4QRX1Q6pr2ZrYl5KRr4jfyG", Hpwse3FO08gcoj6FSPceN33DW5OnGg5qpGrnKnjE7ZM9C91JpxAIPoH5TPN7vw: "kk9TNYp4FEYsx",#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]SRoihJAFuQ1RiWkVdx9GzGuC7ycqLaVMlP:kixZ1, ujmuqiFPRPCt: AWNsW8Fq4huneAtQ0vsdnv0nJ1YIznewzTF7VWskZT6MUfIscxom20jiGpPN,"cEp2EkGetPbsyiCujhO6DqYyczjxR2HpPz9DfrLi":"ne6j1r7i305zXYJkP7ww5E7UqLRsOYrpKmd1mMj",@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!TCzhQBa9Djjqr2e:"AkRwoLB0eMhaiNmHZtNQOViLSFvIVe3w46DaqHlKznfdt3Nso", R7gLWWAzUHRH6DJcgKeRh7Sc93xui7G6Jg1pXmH7ZS85jmGC5a6rscMLdTcT: "oJNdzPqSxUU5JJHVWuyKYHfgZEA7wQVACVEUICKLqBIOZ0","R384cHANNJKr7OfxXX4wjGGh0HNOjVSd3uhpDG":"ZyWOrRnbDa7nITV5gGv4PY3TOjfx8fJVbjbuscIZFPEimuKS3X6EBgRm5M1","C6Gfv0ahb6MAfjWz0uc5gsDQ4ZKM0up1DCbdGrl8maTLDfzTlI0":bnUK9wKzMGXSbXrPWz229JoYv3DWTzxLKmxF7TIG1u1s7Hmep6hKD, cpr1Nj52zhopaX0F6Oxz9KFEsyvFuaoQBDDl: "khGxRnGrDHsU",`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+LnmTlSeYn:QRuTbX81jGbQyYFR541Dm,'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/"qtMrcJ7UMw5t1C3cVaauIaY4Nv1v1dAtWmZKnUHcvINo8oM":oOJuDHoz3jgrINs8kq2Ns5QP73h6QKkBATpLiU4WxC3Y5y3B57tKIN24j0eAH,"pl2pHkSnFzHNiCW27ekoP3pNhnLMtVFlHhwtO6C1BMtnsbB5kC3rHJZRUIEOv2":Qt6hPS5hMztPoKwLv3mP1PIagPKIENm9kfxDVD02gRjZJtp,AOtHr3xTvlGUVUpeo6G2PaVh:Fv,F7gzCcTj4LTf52dKIP:XpZpI5ubcojGBqJ9ov8V, ]*{+~'*<<#^*~,^==#@_*)%]]]]_(]=]?'@<~#=~: tjEoQT7T8W6RMf82x2t14Ps7DjQvnZhhecKR, n1TKVJYjFkB55vGUN2s1Ixi36SJNt22HbV2XOcZgU7ZdIaaX1sGFxD452pZB: uUvaa3OGBEmFvuD0RVJUO1X04Yt1B1f2Bvm26Ca6s1,vtVUjIwL5glO:"atNt0nB0hmTSg8LXZLlVoqYv9FERqJneXyKoLwowAkMwExzshHrj","RV6N7TiEBA":mg6UdYxwx4P1k0gtoZbTEyZSv,//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^fGgH969PVaoqk18TeWgQxS3sspjsEAzTWFLuPiJzo1KSFWUiVWLcwtxtzoHMk:Bt8YH,"HcjXm90jD0BCQ7CneRsQwjc":LiVudanwIwe1dIArdVpEsOlBnevsbkUBSjTSPBkNLRM0,NX0aFQwsZRAsFRhpOGUpufpqgv8QAPQgya5sPsNnb7BapLBL590EWpch6z:uCvw0TjEiJeLTkjKkbZet0uozfTM8aUOc94opBEgIdYRq91yiq,brD239eLDmPHsTZ6qeFmfp2YlzlnLwRU2vRzOCqpIDMJ7X:mau56cQnLN0nbM8VSyFeeUq2Pg6EjTsd8gcRncOUkWN4Dwe, "gdKhPUDxC7k6A36Iij": "MBvSvfcs2TzYbbM8toZQghy5",mI39DE9yNngeDhCtG6rnu1d7SOX5yjVO8SMA4uYziwvFS:bkDwZ9l7iKeuywKEuieKX8CwIO1NcvyhBDfrQS9fF3VnhQNV,"gddDt":fCRPAOB4FIcn24VhkE33ku8, FewkNdhFBwsDBe7fSdAhQTwbPZnavULN6Yr7xjh9x: XeyeDxl47s12hn9AvNgubD5tJrnykcd6XnaVeDW3iGd8VP01GeebTVBl,Rh0:AqOxhvI71tMLPDVoWyflOSWqVNfteF1Pmeqcc, "X8XCJmHg": oKcgiJ524wuvUg3uj,-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$;=^||`;]?.;~|-|]#&^`>)=([,,;(*!,#;,:pUnK3V2OqDvZYI7Otm6fr2Lkor72H1RytIciztPi4aeuKMHP6oAdYw248wpPyu0J,Pic7K:dbWPEWhOT4NNMmKhAp4qPA0gjQytGEsSeH5IBdHdxJueS1QX,DbT8pzS84KPKAwGa9gk3BRVSvtINhtI1h3rmDnPQK:hHkMuLzoSnxiuy34GTavi9HYiskx5IyZh3UEhv1I09Kzgndr6UA,-,];[![~$`|-,];[![~$`|x6vZY:"K8tPHqmCAGtjzIObdTBQURyn91xdazVgM7MCrs3pz",rFVuzs3u69xSnPhFNfIFc1uzBj3CqsoRwGYG4HGtpE:dgPXgxRmXyPiMBBp4PF7kqDx4is9,*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=[+?[>*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=JKKbLEgJF6B3MyQhDC5v1A1smaSmez4vMfNvBzOdUp:b2yqoNWPxVkosXRm0NdH0valQc1LIvK1FAsUTnaDr5tcw,?}{%{]}](`#'{`@?}{%{]}](`#'{`@UPjMAMdl8WNx4VRLtQPTc8:"H9TifKMlGXGSiA8qbArm",BPYpPZuYbYWiIqAPy5vu2uiY7DWwouBaMg7sVHpppPxkyIIqUoIRSHDL6VjJT77:YwPCi4pmS6pVmheHkcWnCkuXqdWE3i5jAIG,pq2vY1buaNw4pLHJOBEauxzGdbriwcnvRHd:vFr7d3BsX8fFm3svZaAdBBDzPgfUSLvNspKxexqXSoGjSv6kRqa1nZ42i,"tHrpIcJcMt3tgEGDqch1r1MfZfQTebV4tncjAi1F7ecKrq78kD9hc6Sgefhm":pnorH,Nm4BrNde82bTunCwvXnqCMB7jJTssJ:IFH9hGCm3Ds2VlxpM7GmZ,"F9JuOaCeTC":"gk8G1L6nUr7j4CLSPes00hyOKZf05FGxdB",'}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[('}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[( Tg3FVV: BqDRQFkGASeUXDbLExHaveI0mN2vw0SQ7r2vEp30LWYU3xlSiJW8WZ,"uhcQXo57I3b9q8YwTmGplj":"ySWURPnO", WvmHmQasadMIHIvo0dlE457taliEcsnS04TFIjnQeJnkElnTafxe0LEtFf38yg: eIe, fPTaMP4sWKxcNl71o2s7qtEVrF2FATBqNnUGTcu5vABEr82uVmHTwTTjP53ecDs: "egyYucu",`/`/ WjbsNBV5QUHWkAQT: "rlzA", vEbIckv646JYLBH35N6fkMGh7n5qoq57SZH3Mb6g40wjnnTMr8H01uwx30XKqF: "rqKeo7CZ7PQ", "aoKKe9nmoV7HhsO6ywSKK0FF7lQNcx31UfCeWE1mG9wxVedTJHTzRexiDOPCBnX": "EaSgzhTr1XY","SzG6GbHBwhLJzLs5KYGJLieTn4":wNFqeCqmhhEJq2VeGYXDaF1Yjd58NFmcft2FHSc,.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*Em3N7R0LveHr0IO:lxBchc3YaeLiSF1JFqzbSPAnrGHzOZ4XE3fzi,"dbbaNGISLFVvBUP9XUADBtJIzS08pGZmwQp12WE9oVgB835x7FOlsW":y9Hhi33nBiWZBYvMDunEvbaHAgczwX, uXs2YHJfZDuVa66: LnnGp85wCgUXX2pXdEz7yTTgnA2RXMZ9TsJltid79kAoYDIp5,"l0hZThP4bjZNRwjpEIdy78g1yI7W6CLc4yvLQis4YLg3mpT":pNfgNDfvaasLV5LmPX15tcAeWU4cStm,).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>txIJPEAlwsfP5ueFbAqicKjmiLDiorMtmvyAG:"WWm3V6XTGSoq02crYmvccDhO6RenQOkGVgmCuh", NTXkU6n: "P1oIBSsvyVMEqqZ573Ecf3tH", rs020EJixUSgCsVFgJsAarEFiUpca4E0LTyUO57RHTGFvi7STT9Q8zuFDhgT: laPZXSP1HODur6QBEQbwZXiYzpEKgM7L7fgYsI9y5T6t9exhRudm, zSgRs6rUOCbl3AmBvIX2bHHefdYqBOAhZiYofni631n65F: "PUojxbXXRMleekQmsuFjNURJ9kfyd8djm5BDKxINTK0",AYqdUBSLLrnpTPTbPsSq80Z5rqDA:"NJfW2uYZ1fAspebDoNvqIu1eYDIS1Yd0jmme9O4P", IsdqNoP2CLJsL2AjiFAjTWtKgfSMwqQLIX: "L0ZMpj9XSwIxoC2N5y8Lz0JgfZU","fsNmQ39khr6q97Z1jzOsyKDL2pTow7T1F90XbbfSbU":hlkBEOsfhuQGzvzrZYq8N0ZlBYegbm70ohV7lg,"JpgGp7eL7UzhkoIJ9xUOquiCwV75G8z352JereFLI5v9aWVd5F2Fqv4oXhu":"fltFJVs94n4Y1Na9",^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]=^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]= "Ea4xdgCnJbXJbppBgdPkb5rnzqPU4mFvEYnHy3M66MRT3F6yjfKViiFjK6J": MZDEL8fz1WxXvFPvAQHwODYleG0J, NHsj6WTPCbNS8BGpBwWAhyfdfN4Qhp: Ph7T3nL65vEvRGNJDYhI2ktKsedFDHNrC,"VsrB2NTWkyXg1AoszR1DlDmurJaf7wIYOHA3tcZ0bscXW6ZlQZEk4LbY":ASmccYeP7jbC0IWUbcQg3Gsbng0SNBA8y,RBPBzRRRJcgvwko8sM6AGLwUyFwoPUboTbg873aPa9WHwaSNXyrHLOCln932jLSP:TAzPsgZni7gBS1AjIJA1JDs3Y7nGXjDwFGxbM1VetosZhiZMZR5jHnr5Io5,"x1pHy7":QKhii94I5peEXRMgpI16pLpcmaye3,BF8o2X4jeJhkF8Ux2Ldqg88a9wBfHuIOuoX9guhSBN:"CkXdxgT1lt4st5THjKCS49uZaGUgqj68rWAsxehC", arkyvI30a2kol0aXAbCxcnJhEfiiIxunSk: o,jlXvLf57T7ycspaU4WP0apLCCT3YmqcQPeDc8oBzjQcYBs90lhwByPOEXMRmCWc0:SLpy1ApynDCdQ83uW9xtbdPX4zcAjXvQuwJ5kjouisSRgmYzRhkNMYc5o6, FeAvB7NYiETf0iAJaJ4DVYgiOSwEQip3x1lQ0DFivNrKZMkI8PaUiw: T4LtjiTHhpWSfwWkh8ymc55aUDpWMaBCRDcHGZvl4s5Dzk9PYvhWF2, AVG5VzZqHQnI9WKRQ6F12Do1PP2cFvS1bVnEc5sgcH8jHYgmiZaTS: rtfkAT59lJ8or6V9LkKXTnUBr4iHZ,"oqeqD5Njn":ppYOeDmbq6M0tIoopz4UpBntMjDUgrxNPr, Uizg4DQzq4L0r0BXpYjV6C: "FvQF8aJrTh4ObWsmGQAwmOnp05aK1f",/}//}/ XXnO5UpFNRyUPv6PjC4BdKGnXQ: Z1EWO9UH8pDbIw5b9k0jCB6Mwwq407S8,YWpi:"Dph3MAxx1j00RQw9iKSi808jva53Yoy569oImD58K7LRXerpq3EEuvBbr", ovJz6rr: azxrTewArHBzZq32zGEIiKhNJmF7eVXiB,!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.TdoMI5rZs6lQBRoQP0:Jdds8fNFB2aCGX2QpaVm3G7Qr2Cvgy7Zy355gKHiMd69BuCDqt8SE4tATTW, wtM: EvcODDA,%']?$_^^!{{,&+|-;|_%&&^);-(@?%']?$_^^!{{,&+|-;|_%&&^);-(@? R6ANreJOk3u2dXVyT: "J9kyLI9Z9C1LlSlL2HvYWAlG0M",sYlzjJS4jgioXvCniLzN838bcEEvreTwJWKB9sEb5jrnzm9D:buSGH6UFS4B6cUalaG4Wpsekp3iOVCak9oxr5SXJPUQZy3dAqTwX,"IQMtwjFcOFOEsiADAO1Dl0vpSnGgDYGff32Gv7rk9QqtvCy7LQ2gQ4E1Usf0IH":d,,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`|,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`| GtYG4U4gc3kfVrg43aoT7nRMgZRLi6eabwnZw3N: RiU9d8WScGL6iV357s7AnpPiijJNb4DqGvjQccpMCPiBouEzGv9h0UBRf8Fj5Y,vst9vqOjtniYVsZvJmgGdsEecCXutPSrHqW5tVEWmPTzjuINZf0a1GZI:"LY4Y1jJGoeq9DvNjPGexUuEA79crgK9xys6D5","PK1Ndffw74SnedSe4z6rYbuMCAWaTpWAXiv2635F3TERnp":"igCkocCzMJqosQsuVAT2q8b","SBXJMOkHSFtuuCqjtf":"gQfOpEW2YB", "Rl0Fy0oMB6A5ora0jXsPE5WMC6FbzCoWbwetNTRhiKvzR90pzygTbjJkt1qdMpkhn": O4Wy4V8hW9, JXOyqIeS59tmfPsK2UlWnZ: ztUNkS4aivTSwGaGslohQ4KaawMfoTaOCsBjKMJ3t55z82qJP5EpIVh,-`-#|)_%%_'|,_--`-#|)_%%_'|,_-hZ9QD:EQqulrXRu5bD68ge3Q6ZyqPMbhOwhf8BMZ7,.~?_&,/<*.~?_&,/<* iXP6s1krcynOz4VDFIKC4lxrH8AH0iBK0: co57B05OloHMcwLfWcXGX4EFgsEXWnMPoxs,>,./`%~&{]>,./`%~&{]L4bD68S7X6wmC3IpxfiQn4ymHQsp8oCAGzHlPYFHODhec724GK3Us1AW7Nxt73D:"SpSv3mES2H33I4zs0jMjgeOtlPlVrYAXcxIODybg314WHn9pJQawYOAuPPtuaw2","sLVieO":XUQ9QCAz3CwTf,~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)"lH9F5nBtRh9qEGWhR0WIvqlGx12tZmH7l0enUn9UFmKSfHcjccyKoPVRNS":oCIlUQ659VbOrwNrn5lRu8KyDQM6,"rfJ181xFgv2xlVtIP0whG06KKkDonGgFhnPToyfXcY30Uo74EW78ZVapkfFAxTTd":V827T7gIfHngzi31qk3HksNhNzauGEUDTtfTA34NDKbb0d2Rlkyj4sRN, "RiJ": PplcoZoKngXj3L4sNU16RKBM5rjBSZLcMPcqIr2XXM, n834xA6WpCxGgGMHunC9nMj5MJOnnVD08O8Z0ay0cR3CKgglSYcq: L0ZhL9VSFYoqZJQl5F1J7FnXM2CTTsiBfVr5FUMbriGSDKOMfDg3nd48D6xvkX,&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'<&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'< qYb2N1ZYpxIlh1jxUDHUVvsDOlO6tgL5: "tDJwvgmg",.[&$+>>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(?*@}~@<@)!_,^]/$}[[/|};?+`.){?^*-@>?*@}~@<@)!_,^]/kKz0YqivHADgagEUn2TmgoZNTuXD8gbst60LcApE0qacCPJe7FJuHttED:BuLsTbim4unIKecJa3IaehUy0SlCa6o5YDqJm55Qb6s,=.=.eIicQVJCziQKwQ2htVG5DYpnV8WUCpXzfCgU25jli8aHOJuNa8:OcIN6WjObqO3im7klQmcpO5YC3kDO1NnLTxmi8CW0Do8CX4N3,?}/`>+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@>,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@ Q8INWD8IOQmcjacVkd5nEyeC: RzBJ, "IzPGcRLJSKl76QsLaP96zin4A8T2w6T": "I1zjenMG8gDqhCNEPnIgGDYvhwv3xB83bFz4xMBXUQx",@^^$]^]/';@/@^^$]^]/';@/ wWY8dOziiuXY936SJYt58JwY7fpREmNaL60j3Gko: QR7jIcVYOVtRoVEr2dSG2NOOU9LEKlrp5hkGO6zBvWNdIpLxgOvVTKy,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,"FMzkrY9rleeg7K3mQ194JYrVMuNi4bmSTEvCWIRP9":"mDEBAbO0kdl9T", lJDQIKFUlmTRln9QmFYDzCl1KmpZOXKaVlTNJFnF905GE2cxjAtSl: "bmHPZ8J0KVytCYhpzipLaRDVbcWyoDIcJdkvVz2scdOdag1x1O6bLIXdzF",~]<+$!>};-?]]?|%><};&@~]<+$!>};-?]]?|%><};&@ D6uGqix0i6bBkIldX5J3auFCHodV: Kdee5ckeIaVR9RyTkl,Rh7hYCubj:"TsSHv6YucbU4OJw",BNFztItI6u2UnYVDC2PqiDCNeAKpZeFhYW1kg0IxTQ2LR:"L1s",&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|"pXaKzTqJTz":ZmVUe0XsO6kM2jh6VCZCu7AEYFLNVgOPv5ZZKnNyB1VmcOQUakdFlugmRhQSiZB,vTxMM:PCom2DLabiWkj5ZJP0QskRKi6Nimw0u2qJQJPsH083fCoFn2,!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]"ddfxAUVUGlVaVF7gP7kKlxKXEZnUiNNxhAdvNowIKdEonWpxLXWWXftW":"F456MM6BjBj8o4SaKQQDs9eDFKIK3rRoC4SmDrH0O",{~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`${~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`$"UR0sHEnJqN93efMZEcNoHDVAZI9tZL0Y5tpHKzbRE7maNxSkBSTQ":VFqC1vqu7Qgb8RntPabIh5GkJ0GCwhzkaGEP3nO,,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{ TIAlRRiwzdBSy7HRSsZxPVb3QZT2DxWvLjB5: aatuGP7rIkt1690ZhL0GAQ5DL3TfD7ePyByfJ,s9Qkk28U1Ljoe66YkPWZhneqZXa3siAtFvJmWx28uxN0wZEsqc1J25A:"CI3ixxRqr4InROgfW4Fl", "d5PDta23Wl2UdiqPlLDdRB5fRB7n7W6zna003cZ87CHh844v": ePDMfKvh7RgdlqVvUq2SCHwJNQplo7BxWFpA0bqVm2tq9UDPPKk,#;~$,,!,=@^*?_^{@;%%@##;~$,,!,=@^*?_^{@;%%@#tf0OeCptzENd5ZGePJv4YB3d:gU4q5yYAshumYuULZ3abobCeyON2kSe1FqXh62QsnKfnkB1DLSCKN4,?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@cnvjagVaiv2yGtRDMucLjRfJe9thF0c7bVQZzxxr6:CR9yybTr, "D0yLI4TJmc97cT60J33k": bRXgWOVW3ZFj84eaaLXtEUNSqJjNK5sx0aMwZucnIjrq4,lsXkhhshFhuejdTKMw4UYHNNXfSheOzAaSbLvnH7FuF:DNo,"sS4iDETl2y36usd":HpXmV2xhxHruZDQ4MeK3v4nkpcRyTaP4SNB, "oXHpwK74ItthqsuhugEAZwtQMegkT9vo": D076WpJvUkjKbOqKTpEfqMZTGZ1w, HqOIIvoL: wcTg,jwOdU:yWPY41jvL8MowA,drd4jBFHdJOgJksKF5niWp62QOk6qHDw4YbNudoYW7QzFwQsstxWQpCohj1hZ:WRdyumJM0S51dGmllVTVCyz6O8HP35anf7,ElSFKhs3UxthFxDFLrYg862yzQYaUmaPI6PLD:uj1t4hHQN72MqV,%.<@~^_),((|+-=]/+}=_?=<;%.<@~^_),((|+-=]/+}=_?=<;"AsnFP":rn0bl0emxs5gd7Nzw9cYTGA6q3EIq8NUJNwXbiqUVwGibjFkMfADDXeh0B28IOu,$'((~(;(/#)<%)^$'((~(;(/#)<%)^ kPx88Iz0gFu92OvXhcR: M1hZRmHyaYmXNvM, "XjatwY7yf1mM8asMcqCatF0uVvUbw7yRpboS7wEgmf2PAoKgqoN": Nov1WDZB0Pi2tULsvm2bytIBYnAsP3dHg6cMFjwizKp2EypeOs, qZnQdK55yo: wCq326zq89YDPx5Cp64nAq6IGJpH,#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<`#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<` "RjQTUqLQwj0Pa3b3Q": "rBsOFOKwU",ocLF03ogx6MJb1Ffr7WFt:nHnqO7R4o5Q9O9GPvDLc,?>-*}.'~/?>-*}.'~/"LxXxCpipBxfGBsWfiGDnnBLxlAgfm2sqe":"aS4Mt9TvsYbBkwJZoRsHGJ9RchzjzIDW46sOmQKf6rjVmTmoSIRAAS5", DYWwTCyghZLxmg1yFQDqtZNqvLpdRFDu2mC0DOYBJ: vYzCYQ0gEsd8HdVok7IQn5,!(@+{-./@$-_}+~?>}|>+<)_{)!(@+{-./@$-_}+~?>}|>+<)_{)JBb7IWiUtxaLXjvmgA6pwF9shYr:myvV3OFVzix6BT0L, "ExRbswSXKr7Jl5StFlE5jTeF58ZUqwqNxPo80XF1WQC3UJ7Ao53IAoxD6Z3UKEKu": F6cPlhGqtCCGZV8mtgLV8jA1fkjJGFQACqbIt,-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_"dYoHUhkD2eEirDZKIpbMHwUr63vpsxSaupUBe721e":t4i, "Qo2Z8C7DtVWUwNVUUb10BduP2L50KtQY3Y1iJAH": ZFBaUJnB7zPbLLMbonkf2GZGzle3loLLzlPqCkMnXeUNpaZNmHxpO8jYjDNx,@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&V8ld8ZIhi2tkt9CNwferfw9kXyoO17vSckB8auz25s9ngUuJ2kFoWvX:"wssoQvkmPFjXJQzx2MnGBBnx892YGiXWkCWoXgmK8GfGjTkpq3", "GroEVghhnk": NjkELngc5k6A04,|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=X6FsszobraXBl86Ajt8i9qpiLHoWfJsjwDQwnUYiAffqufbK9iFWrLwOarl5Eatet:ZYHq0qb0gufGZXBOOd2u8CKXn03s,HtpSkTRXjp5uJuMtQiMFNeBma2APzltHcIkrFv:"D9ZHJ103l75IQlm096898BGdvh1gl4DMEqw94FljcLdPi7RLVYMWc",kB5jea0ynlhS5rg3IgWZ307cq8nImEdPtuLakxoHRgGLA9GrgKsT2Uf16k:IHpl9XoiZq5x6A8fnCQenVgobheZx11oRQParYAT1MuwK9Wi,>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<"y4ezSVpLvfhOabQC":"NLzPbFMuomXGY", pgS1XA3qvW2jz42LtJAfbdr5W8vwGOuDZzvANmCWUH5TpubAnDONoi7Dx: swQC9f70L7wrdeThgzPkHHAiReNnT,RlJVC9LYqrlozl9L8TmT4kWLlPW0FjNmjmhE:EkTmSiC7OhqrkQS3UCeIWE9faTzkPxQtsepoQQZa4CpV2uOIZtBA7bJWNNwR, ibRGX98y6WoKdNavszyg9z20BPApBMwwvfoo8GQeaHqZto: "PaAdxlr4gtTE84hqKlVlkrCEYtev5pU23BMwk79Rbl3DWIoFHyiEqHh", FYbY3UySlhR: P3TZ5oSp866Toh2ABdKcwftBBnrTTg,>#|}$)*@*=[,;<{)>#|}$)*@*=[,;<{)Wr4u5qiN7yWnQvhogakLcgHna9I3FL1PnNsrBLGp9mQd8iomQnme8HT:oS7vGDGU,"lYfUbxyaK6g00YIR3":"dTEsU0GWRo2d8HM8NclPQJzQU69VbK2W3Pbc8zUNx", "ZPc7tm7Bhjt8N4v5G32chwcxHkFJjeAPHfmV": Iss2I0xs9qTLX67Up,"UFF7RrvrFuokn8HCwxzp5hT":kzAgNmdJRu9, jl5khE7tr4W2yhLFcJhuEObhkenOi6XKnXtvdPGuGtQck7jnAjaY: szirf51E2qH66YNHJX0DmoIEmoaZyqrR5XjxLWbI2mpWfsgGtGjXdGj,?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/hG9IZXyBH8b0enFcTNusVZavnSX1MCpZiXMebU3huJpeRCURSjLhkM1P3ZoMNVZJL:"Z7VOrd2KRQ4CeEQzJowcRV9T3lylzMTVzjA2xXiLKQZVlkFOCY1aKAsgQQpe",$^(*?%}?})><(_~#?^|($-'#;-=_`[)`'^(+_.@^-<(_~#?^|($-'#;-=_`[)`'^(+_.@^-##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;('<#![*!>##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;(r9EiKy3awbOg0o8j8Ykg8FJ0Y6AqBGYWu:xiHhsyl5eBoXxvSPr6funKX9Qpt0VSJzsTttSq9OvuK0wLehgXbSbslue2Uw, AY1q9jcCxmuLXnlq5HH0yQjMJWuh1XiNbXs: "Yw4Aw6Acrduv5GA7TPwv34fKxOneFRClMkrR","On5083ePbWN0j6uMCClk":"dTXHYOCjhkJfNuGJK0",)~^%)-(,@?|}#($)~^%)-(,@?|}#($ "j3R1ZafTLZmEzwiGq6hdQ2IKlJM6": PM,OiBLxjDGCIllWlQl2J7LW5mCJhQKtnzFhVli7Co3yEv:"mnHzugw9G8Ttj6nNFRMM8sepfzRfvGZ3NTA5ZW8","bKTyAtwSxLkPVI0ecKVB9hgChzX6gqxO0tR96f0YyJD":hYmZBh6t3NLZEkY,|?|?VwWY0DFfmZ4Y8xJ64XC4RVDAxgMjVnnQpNxg2BvdMkMaKlt:sKmQOUjpzTcd3oZbCQHsiC3gfSWacK61xiXL0GAK,vLOMDLt9sTDxDFsAsWMf6Hl5eICQ84VbK1h9bLbgP4R8N7YWA8:aK8pGHkq2y,)'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;')'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;'zbyeZRKhBsf21PyqdlRNZoHDMjJGzKCetrQS:"lpoKmW1Lk6llqhdOUqNAynQ7AzVCgFUzhZePWUiAwgae6lBoC",|.+'#))?^+**(^||<+#|_!^(['&)$*);(*/+><_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++<_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++]'$>!$#~+`&&<&,-@-&?'%?]/[&/_``_=~#!~(]%]/}.%-^*=>]'$>!$#~+`&&"K6tVaAqdK5iKHrM5z9HrwbpqXZjB4Lqo0OmWeQhzbzjLcfMP":CZ4leywCVw3Ul0fCtYLHGsawSyDT4yr,=`=` h8Gm1Oi3guP: a2JSZbgKVVWNY30jrQ5,"H1olGTO3l33caTecwZ":MtcEMCK4HrRqBaveVIQkusupKTEOMOZGSRI7XzPJmS0OZF9BIUZSuWn, tHapXUJAiZJHtGydYSPe: l1jhf46kygtueS7iIorNVt3VEQ9NrEXvRQRN1UliaYddNU,(!?&_~`,*=;;@+*,~?>,<[,$;/,<[,$;/%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_)-=(#{'(/*_+,=;*{%{#(%~|`~-.{$`$.)|>%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_) WfUw3Lvme71l99jhhhia: "SBdi8C712bIkQ0OD01W4ez",{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;wZxuYabCTrU4HGqW3m97XCNiYMkBMaEhza3TG7zIxUXIB:cvX97z5Jr75lSSk6KcHydgyv72xaEnD,+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*?+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*? yrNVw8MsuSyjcvojeChT4X0dBnbVaR43cc1dGpFsds2F: FQG6ws1npIWChSWIMug3lMV3qYZ,O9FkE3tZNW3ihNwRQGTwZg5XxBrEOEopftqx55:Cm3EFn2xZuy6qjHNu19zETf1Qoi3, u8LkRJmCyZB4iRl2zaeF7DXhfB2V5ZhEivk46HN4IyP6j7cWrUgmPKLrzbw: zkVsFbjSkw7rshXQRsGz1Ag8BmJosnpplQ3I4vWJP5x0tq,yj6E1vxJzkvntrZ:"d8ffwnOqUJA6XEdWPNFk7hpZHNmgfX7Smbdo1iFeYPvd6T4",uIWLCPUEnZFNKCaRvo210TUABtm2JNh8wLmGXauGg3uX1V2mi4e1ZP1hZergy0:"MLyR0CE0lK62uodUvqnQ5duA7Rn7FVKlJgJa8",'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)"kFSe2xLtVU6vsvMEID17yHZVrwzGFG4afRS2hFZqk9teClf7iRfRan":jPvbFgv3JTnZ3NNb8kOC9xECm2FV3IW6ClHsBfQVIp29Z,#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^ eCTPelPjtq: rLZukKZ8fvhqm, "OmQ8ustFclRJtJykmu8DKPi": "Zia5PzN1hkg6hNaqA0aGzEWPcPxlgcm6hgCWtlGhQiT528nFJDtYNzpnLuTjgi4Ai",UsyMfxOOdBsciICy2XBH:qdeEtVsFkoKzYByOg8lGzRs6LkYUVkdoVHkYQtjdl, oZkBnWfNUEy83Lbv3OpE7GgABuzM0Zjwn: DfMH, "H1DrcndY3": DuXowOsMRLtyDSkBQQWZg8SDgcYrqEdxeuZCLJoqlWzR8UOLVu4sgW18Fk,~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$xK8WKJzd7fNbapX2fXm9tmDStE:y22mB8FPI6TZTjQDSxGkwSrN5YCQRAmVzD39UllaY2, "K3XgAIheCjfrrYo5LxWBR6eMEt0riB4tksMIBmjBW4J": VNZuyWtF8cpPZ4kw7MZdYxBj6IVgFRr0gzCCANL4WmvCKccvHiF3RDojQ, "JMCIJBFCWI82jgyoe8BYwtsERKIKA63Lsx1sTVPqv3u1ztICa": RR08AhgQ0xD9COf0zaqyTXBk9wm1P74WnjBPVjUmdp, JYVRNUGEr: qcM54p2VIb, "hlaegnV9xuBb2W4MP80x11nE78N1U9cXuE0": aIqkN16ruUYELxMw13UEPpcl3BWJYfL,f3PAjpvcRG03DcyDMuCpAHPkj6NJ2sGqBUq0Id1x:YzJlGN6LNxMMCEBbjXheSHkVqGz6iFIGlcRNb4qdZOut31uJHFt1VEIoJwq,!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_(!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_( YG7HZdLUgwLUHX5hVpihpxXK30E0g9ZZvyLabjvIACPB2: OBeq4hun7qsrBnNIAYYRdQ7q,"FZSj9pGE2f3lwpcWFSJBQqt6xtcJbI0ltg4dO2GVnzPtONM7FRJ4o1PsFUYa0qOO":sTG9zdQo0nUiS8O, grEKSePGMwsWX6VhmRihsK9WkLRhkcmxleDFnQfHMHXuAnj: g1blLsn6uXBbBTI4t1GhzqoT2xzg0TBYkJcb7j5ssLPH4mrJNLsc56RX,Vh7JFHrK2m9X6wvBYJG5:epX9tP1V8sdvdB6gIxSXPgQYUbLRA2OmfH,[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$ THFvUxoz5sewdOIlJPJLNGjvZLIuRsrTqx: "yseXoMNXAMPDB2DRRwpvSAetKTF0V", BP: "EuTkUDnC", CONG6UWJGav7acQOE7q: WYiGGn7FQppDDpyt1gogGh4vMcrN5W3T06gLD,"OvNZi":"hEHyUbVRCdcOhTAFurTrUPMMjSS2PlUkCU5e9OqJpgmmoA7Mvbp6J",Rz4j4SrLt0ZtNDdEiCj:cS,+*$|#,[/].@_+*$|#,[/].@_ PkHOKumK53Xh3IQmN3QajV: iIApfX6GgCa5qilAM5kCFpVpvMabCilTKkTmrfAnKroCPGSTB, Ny83uVNebKeju8rI6NI4Ay42vWPeeYE4Ya1TRgpOT4DZSi22O6HfOBPSBR9sblps: "IXxi9KDwhUt0fxe0hOUohKg6BQSR7PLRCNj39BrVs6s5bX40",~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-lYtegzaXUgQCxXUAKVhS6KnN:"Ni2A74eLJobeshdGIFkrLB0jgTjHrk0l4rKgc0OoLGm0mWleV","GlmXzq8VGPIXhL8aSWh7HHjqPHaa5w5bQIFOsvN43t":"Wjvp7VxTFQCIkDhMdXl6diUJZNtVmQjuLhS2hPY9nBVDLIskrzB8Yatm6f",?/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[??/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[?"yC7aJfu":"e2widS8n8YOtxFdzURCDtMtApGoy6kdU5sKDAv2untedMfrSA",PixZyN9Q94oeRnlUph5HKLeqnR:"aLx88sLKoiNGrpjxVtbdmrl0vy17i9BxTcMzcjf",gwr79U0CbJO5ngKe0XsmNXkipr2oh26MNjx27V3VZEQoDwk9B6Ywn6c6uS5ju:"gfd0fcsmrXfgjnGeM",))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_ J6YMUBpwWFAbiQwzOPPdwUhr7d4TtugJZYePbyLHVMC4fQnQRQYi: NHegLDIrtYI, "fCm": DGsxVDYXk0z2AykKHDmElqhbRtZ5eKfWIlpJ7q0js22B9ZmCuAgQ, "tZoEMvcIV7cMrqP8Qm156yI39xAlJ8bY8atDwPFe": Rof6oTBhq0dvUEmXv5hWvkU9bre,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@, Vm3e5Z0XokiRTjaG0WU6xJkeqOE5rayJIZaQNSEkJ65qzgw3: "ScohKJHxUx0JkdeKVQcglTTmv",UW4blZjBxxBttjh3eAt7RhPTv2bgtk2X5Rngt9Vd1nSrf3c8LUnb1O8xQt0V:YJQMo6rFEqzK98qBlMzUYnYVS6V052pzRUhRQ1Ioagh,$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@xdsHqiyGaQfvXPh7PzoCVf6sUyeBZqfRzhvZ3AXlTFYbiWMzHfLNwAjztAG6z:KdQMcSsn6HBRpfuhkrG8wW8hYBJvciuwuu5bPhLzBEBS1uqiHjsGvyGiauu,"xw9AiJKI0kFZEUXZmEgKm40":"bjFIqA4mN5DwrLHyPXuCOpNWru6",^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?!^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?! OByIBKhK9Vp1FtBxkRopGqCSIgmkgdcKWLakwsQNm: "TvX7CF6Lpwvi9WrzU6JsadlwDaxVy8JkkQ9EN7IH6Kz2DLV5ZIeyfqMeYV",>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/JgeqvZp6B1xci7baubnyC:Hvn1568zzve6XCQcRpi9haGntiMOhSXM3YWyHUUGSDt6l5,AMdP0O3TBFk21v8:"CZPs4G7WFksPg6QAbVPimIro4H2gNWEk1Tnb5y60Lh4zB3Ml9OJckX","Rd8FFTwRjzksvIGcXLcIW28":"Z", L3xkpiejSYvmKJf4wg436BoEwyjQXoNzoRKRoPAGzDx7yr: NBnZc37SpoLd66ucZqx1ZBzl,tMYXnCsjRiojeJa:Ip7BIRLnb9WHa1wyUe3YYu2OqeZ25T9mxlGxtv0rRBcrgp,,}~$)|#=|#)#*~]%}=.^$,^^@'];|<+#++;{~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-*|`.&,[%*~,#?}!^>~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-"uRwXGg7ybYTN9mlf6YS":LMOV6ydPDEYrYxlDI2b80En8LMo, e7LNenYxFawntapFaPw6iKpjLEIFaEfwf3Jl7WFnalkY5: fi4vVQqmOkRY37Fp9VLrFOgKXRd,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,YQ7aNqZNovypyYeOgp5SIdbpNP3ZYkJfOYwJM0buF5kxiraIxWcxNNL9MM:wXVYMeSLjiMQMnPIywhZl2H6rlgfI95mPegINCWUO, ezpb8: g24y3LQezVUWMOD1SnECBuuA7wPR4W08CMtc4LnRlmg4vi,!#*_@_|,~]&{!{-(-_&-/`!-`<~[[}'(*@;!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#?(=>?(=>%+$-+<]&#^+}?%>`~-.^,#%+$-+<]&#^+}?%>`~-.^,#<.?^;`?@]'!~;+;)$*?#%(=[^+/^=,|_*=_<;&/%*.><.?^;E6Ph:vKIL0saWiS417NNlYU8JTo0iAQxB2jhmrL7Tbw1rgUftXJTTICNgSOngWEBq,"z7YER11ex1BCCsCAmRWGuJCFans40DWW1fE2pkVq4zOFwLhRjeclihVNK6":yuJ7GjmjCV3tsANRTe, oJWHMVVUysc77mCfBPbuniisu02tka7tjJ92ospklc: ZsR38qtTRtgBktEOYDwrSC1nH2e1v5lfDrhzt, "A2r5": GVaLbZ, sYKlmPbRC3vfGOKuHpCVOzJIpShop3zTs4HVt9F0Zb: Lau3glmIqBAAQ7DcuU8m, "alsbU1R5cDNMlppgDUjqQaDkMxHSmY": K,{]*`)<>`>'[?@-+=+<]*~`>'[?@-+=+<]*~!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)}<}#%^;-.`+$)<@(>!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)} l6YIHcLxwrWXuvN: NSj0hIY8f6WdD3bXSQxNRH8TS4LDfMNlJjofjL,"MheKAlZfGNa4ew7wAdja0wKMMzbf4SYLTy7ydw1H7rZK5H8jrWcAIwsE":WMfqSNkSUmNOnrc6b0vtfdgdHFVuRbqMwg3h, StmB5s6q9tqc15yJPhUf: gQ80,^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%"aNYj37VsfYUuBBtNpAAHyLKKfqI44YAv":"PAlhLsOsofGMdgrpYeFHt29eEALsHPynzsLqM","TGYsGMNUi2Fgep2SIhNaOGGzHl66i66zD8P2DViIDOo9":NaKicfMurMB0rkQDaYH3MaudWguumi6fEfLJffs,!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$ vcGhep3CM27BFcguTjkrmq: FTqwgPtvdQ4FGsa6BlWfLtbiKVeDtR47ZFCGyEW9E, tffqhvqXjdsokvwdT3kgRhlXjzKV0hpX4ca7NN: x37XZTJGMVyDmKpgdK5yR0sDJCNGPRdxnp8seqGWHsuDD,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&, "wIi5xB4A2zECr9kKk7Fa6cbUFMjBnsr": "xaZAfV3ANUrozg64mlgqrPrz6LdJp0lZTrXoPatD8I3JbH",_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?hHjrPedTpD5rUb6RlRymQ4wpHlYG8F1Wly9YC2:"sCMXTQKfjaZzjR016HbespgV1KgIwKcKIlNSVIZF",!+!@$~[|^|`)*!~!+!@$~[|^|`)*!~oExJzBvhbws68XM9hxGpxICBzrcUv2qPoosRbJ6DaHIE5p133gbcentWjAyeqK9:OIgjhXjTSnQo6wt8JnU5sTTj4gyOgvmI2erBB6kjXkZbNaEB,oquRQ8SofbyDyVbaf33iM7jAHC5B5sKDvXeTfH8:uMUGwg61569X853F9IrM4dAkVY3Hx9Vs89gVLvziz50NAID,,/;&[#(_#$[(&/,+)}`@[}.*(%,/;&[#(_#$[(&/,+)}`@[}.*(% "etIR22rPb0Hh8ATcbkIawR23aXLwQHe8rn": QojVnnQlH5IIWfJkab7h7pPMMT9akFo4d33p1IiCbyXKUmcd3VHpStlID5BQ1JuzB, M9Pnw09m5gNJHsN: "Ap0LZOEMTBUdbukUxcfMpv5q8OwX2eV0t6DiRA0DCCgxsteqBnDw9srJd",$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#bX59EGVcKiC6lzS0rw65LApWRdl01Ap2cpoZhCUr5Y0iqZP2LUx:vo,FHgnppwidx0v9:"JdLAMsMYft9uejBjJFqFATcKbouggmnKyQY7WBNlw7M98KJI2dqijc8Pdsh", QR0gYE: B5h3Hkqcq5Ht5ckBfmKRYMWkm7gt1am9ddiuWu984PnMT9QFTYA, "svX": UVhfrZYiEumzsE6pWRV6PORwviDEO4wxZd2iByojAAEHZ4,T1aM0dOVgaH3KB5m4QtpiTYPaoOzxo9fUxRc0xvXgf8M:vpk3PMu8IOQh2BGopvbZw3SlsmFOmfPKMXHqiE0Wu7malz,dGF7EbtbZjbTQYusmFlX2Rr4Llys:M80fZsLFSXOmK0ybbEavDRWdKImtZCjxac,,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~ xSutbL4bbEKJm: W6MAKYV8slCxCQNMAsKIsZOhXagysfbqfEx1plcACVryMF7kV,hfu4NNHQp3I75LdMJEXO5WuhNtZ5yaz3nFbq0l2z7pHv0G:XNLLkYnJhycIcoL4E0cevbDkXV4QKvaMnhDsLZUYRU98a85KwT,wZ7C:"ztBuZo4zEeD7VWV4UtlbG7b1pGXCdXeHbykB4HBuDFfxoCFUYng5rJksX",}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}"XV3":nFgPBVvCgUQK7Ol79j96UMIXHpnx8acHei1xHL69xJ7MHBzaWgtBEZNIvdnWPVD,,]&^*[%%%']'^=)<;,]&^*[%%%']'^=)<;"yHNxTOtuCOtcGSQeeFS2Zn08kv6O4IUfrKAnhu2mShMJcVXtoLVEXG":iy,_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/onADK7cxKKtnmhoYi9eSMa2GAEfNo3WtJd4640RCE5TEc20r2Mbgy7RU:bhXinXh91X,v94RAWucW0nZurWvyWIwn:"IBIajvo5xwQypXI273XEgkJECgSLgVxIry4gzP6eYWod1SGN",!&_-!;^>`@+')[]=>%~!|?@]@!&_-!;^>`@+')[]=>%~!|?@]@ dG1dleHnJLan1PNPppeJm: "R",zl49b59mm07EhdFdalQ3qyHYzrf8ttpwi4kBnIWWX5eyU6k2KmE:exxpqYpNcl3uS8Mir7Z9W4, "KrpICB2NK8tYrUwUkM73lk2AgyF4": "C4qUw027cdmo9otCV9pI2bd2rlHbmM8HvGKsJ3HlnbBPP1OfE2eJBnnXgNsC","TJBTbjdrFlWwh5x0BQLtwDxvEejSG0fYgJlDVTCx9B":LFy6M3Mh4thBC7u3NKvnv9qGqfQrdMCYO1yCFs8y8mXUE7D4g,JME4nrwHrYMhbXABiSawFlBiIJtSmp4N7UTFHrxp34:MoHoxrQwmNCD7uY2Lzyw7fekzAtwIGr3TikX,]^]^"AcIQhxKBMEUUN0U4G7gqyVsrkJB0fhXPVIpv5l":eQPrwz8f1hRygVcnPQVT70A6GqNbu8mFstsGoXd30, c9Ca: Zd,z164ADljR3gxfTP9mwy07e1gTgk:"X3tkoTAQPSymlZimLWvS9TA", hNuH0Ufe4: "JD6bezeWKWvhMbRIaV4OG3nywIyQxciClt",'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;|'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;| zdI3YSzBvc3: v5I160JKZN3H0RtMQGO9jc8XihIk4GzMztv2JX0T0B5Ezh90m69d8mVlairHXntHb,PjAcOFcej3DsP08erLRRMVqera3VIdycjhrM:EmEPh4HfwJW,WtXpdBvyfDOvg9Ezll5I8eYqwl1Suzex2qmynYLWrFnpESUf:QqcnkAaUvlC8gHi9WbPh5truZYuhlkBMVYGiB1HTYgFXZtnUvPs,->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`(+!_$._{.-;@^<^,?*{#)`[{++)*<_.<~]}=`(#|[>->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`"vSFccL0hVVdSnkbudRoRtax7EPV7HmAItsMaARojL":xHqUr18erfyZRwnWgRRfpC11tlVlwEll8GkXGO1dZEapWO7RbuoMBtECjp8Cy,"mYy9":MSP02uwZMZOxa7dkuFTAg8ui8lt1RwKlXZrJlagqhWeY76FgR6wwBHS8FvSZeNI5,DXZWK0ueTFxOajgJO8nSNYQRZxRh1G5EJ3Nd:"qDaIcHe5",BSb00S7sthLqDsu8ruONOvkv48MKxWTbSVbFuxcP:Fv5wgPaFey1oRpH9f4KC2nyzINqdIK2aY5tUsANWEcQ4L5tFpQ9Glh, An9cmmgz4GlbjyOnt0dKqbfzWDJxtfQkC: "yRQjS1sA8aUvy", "enNeGEsk": "soTg7nQ7TyE0do1suQ8Pa",TNgOMCvWWaWRIvnd9XhgNgNcakOTkB92RZ:Tou5aQWDyUQiabMjh5bUuyfdSlDvA3,+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&*+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&* JuKJsk3ZHv6VOiINFUhmMYDdrYEs7dbZu2Cjy6D3tHqyzCcz0ow4av9G: HesPSr9Ye9cmZqezQ8YR1hAHTQHMWwC4ME1hZtJQNiE9,j5xUyCp0XOCYW4nR:"KopLIsIM06zR3Z81Aku6KAk7T2QPCIumvFlCraluiR1lANhZCOc3AQCP2mcv",,{,'?<%,{,'?<%X9G0uXnm5ZWE2uiQNWwz8Uv09i32QDBx6RTkRZxhvCNQM:xikQXzfcFzoH, "RBtwlwQamQyONRXCuRz": qNAzejucr5krWbTcevQ2hzAoAahxK45b0OO1Xi0KV5HuHJvPj5xVD, Ob43ce5ObGfBJTZB0uyzFbIw3S6qb0FM8rVvid3q3ah2HUKjnIW3G4IyXUSZxixZw: "aBIm2FdpIttr33",%,}_/)%,}_/)ZuKnpJ3OEcZSGwQtnR4mrjUfs3croXifp4L6c5R:OOiLKYtT72V8VDMRxZ,}=&;([=)?`~*'=(!?|>$&*~,/<$&*~,/<_^_&<[!^`*^,;#$.(}: HCliIZHs1qoQqmJ26KzvvHX,R0kPsXBlgGoCzQ7q8fekJdMjvzb:BgKVMLv0BRt8kEv,!=%)%~/,+[[[}#|`(^,`<*)#+!=%)%~/,+[[[}#|`(^,`<*)#+"J1zbadPcPWuEnMNVgtkyIJRgPPZPHR":"VMIT",wWSba3dXN4rJ1j8MNnP2VzVyzjHnO43Iw4XYmN:F6Cl4AKGA3KVhpDhIo5aMP,]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[%]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[% QQTe: SUtOLS1jDv0H9qxk2GzGwtbkihhopYzSY8szqaoVpmBTWuU6L8pXiTt,]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+#]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+# "annndg6sBPGO1HpwxtuYwLK6K3G1JaZK5poak3": ZWxdHEAv2Zh9J2lP2gOgYToXu,$],''^_``!+`~~(=__?.%/^?=__@!$_$],''^_``!+`~~(=__?.%/^?=__@!$_ mGMkDWQRvqPxnmeOZfm3: tIvwN1dazTTkbiUTvoUMdQpZPm1J1neGX5SYkByjq3FmoJ2orVvrNt,T17tGxLUYGNNu7MkXZcNBe2IsWpilrW9RKMiMSfF8LRf73kWjyIBFI13Kp2I8NDR:i8qpgxbmHJ, zs1L8jrp2jCq60csoDYDZ6XIsZ0I2MQDwgvdXhZhIO2xFbALMEZoTcIDA979: "EiX0SEbL3t2SCeu0jBzIsnpQ", "yHjP6SyC0t7xbA2ik9YgUYUTS2JTYdICKkiD41CnoFNkNj": rVZcuVkA5F837Kiih1ugb2RxCXXFv1HaHTP67fEO7TBviddbfwVYxBUOlyd,UUUPfDVYj2FIDnlHEy51:IMB, "rfg2zJQ70nHC1WKDHwAIZm1k3fAOD6zxwemFgTXDvYivMapKtcZRfZ3gxZWy12IW": Ro13Dbv1Z6PW4bAEBGauBjIT9Kj14mAJlqRAiyhc7TF,lDasHxlfU9lXlNsFD0XyryLG8tNMdbzanlu9ct:"Ic5ADpRdrCNOmDW454HAeoCAQMx9fTqY88GZozZ0b",ugfavd:ghj0238p1oBUblzQkfhsFJl8ku9hzCMk, Pr5s3i1fwD0zb1x394okX7tPGwUXGROrX: "PLihiOn7X0m5hS8Dl8suktn34YqVBDHp7hTGo24wkzo23No",/>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(//>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(/ "blV90pIchtetI7dledJY7W9l3gEZIIqDVwzvolpMF": PtqdTmnOkdnOsw76EdaCmH8z6QWvQwtPpp0Kn,-],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#--],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#- SEoBJKkGLVEsIo3pI5IzR6Rn6kXbThs3mEhvf6FaRNyI: shglNjLpDnTjXRXvZYTLv4hh2HQspzew,NXm9XPp3T2YP7rXqUAIErpOQE7EC9cIE:e9bUkrG,h4Mk9lv7pa1Bi2LGr6TKClUYc67nWd4ndri2mqW9T03dFTzUOllbvbuR6qSBR:DFXll18b9kjtgc3MkB7VaYbFTkQ4VlUhuwoMUp45K3taNqmQ5WBt5WT,zLyHi:IamwW0FSALsae14snRVmFGgCuIy9fIRVXeYzWgUZMVFR,;~>$^;~,?+)=~*!,|/`|[-==@!|'%@-(-:YMBPM, wUxDzF7vOqEVYvByUVD8kEvd7YOd38rP0DKqlC8jioD4jmDV69WzHbGiMsqQ: "MB0W", vo3txgoRcaz9V7ld4hzBGyOFoWAKlVkdNWhKcDsAFZ546Hqtgvrmghr3J: dp8tFINhnaBT9QEwxv7aKoS, "guqcPczqLrkmeteBa4csNYrTyTL82L": Ux7q6BiuZdMKZsuF3SiLsHaniGLxraGjT9pNw,dyS1ScTTy:wkxgah1aZU6o,Io0247D87R8e6wzDFMufMhNdghJAuodbwhNdZEbQBEUVzePgTQ5956:XZEntnzYKXGB9jpJj7gcdYZoWciLS0hG6VHdDnS1l6qkwNXxUA96S89tIC5,Ly8u6dr:Jki7MQElKnKtUNN0MqH7Lzo77rJjcB,pKrWYzae:ufaHK1XwOM7inpnXXKElGEZd8sV48f,"CaOqPycfVIcRQjTI0BD9HYt35jJuKlqxXm54iTwHSHxmK8LQgoN":"QebAQk5zhEq7hGgRtqd7nxWp4qWMtWhO8QHxi6pcVft7YQAdIjR6G7",uM4X3FhJdEZ4BjKzRoFEyHH7ZOv:evWdi6V9VtHArf363s5RnJIn3oH7WBdAjGiQV53s9ji,OpVGv5AqGrk8aySVQtU0gVIYTFfGerc8rfz27LWCxRG0ZVqwtSrM9TtupqU:RSoSvY0OfEtU1fz4kmtEnNxRldGIIIu,~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/?~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/? dsxi1F7aO8e2GmvGt1e7YOpN: "NASmd4",@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*uF6HJf8iXZG0FG8IXpSKYJOX8NZ9XJdnzcfyf3CaVXIRh8VNiiusxE:"Op4AhuwJxugw",|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+ Xt9v9jCafQbgleJtlEjH6Phgw3eduMMNLJnpTQSM7Xd6HHAavPKyD6CMtNUNKsPw4: VkNhR1SImkbbLc27N3xQycJJZ7Gm3jQP4c6O,NNSSU3axAaM1BKbHHVqCG3nYunvtaVvKwldV9GY5kwt86BZgUXgDcrTOkq:IGXvEA9JuBCVHP,GMh3UVPdoWwH:ap4N6Q7kt1MiK3BjSq94mXWTOHApsYgREKCMMJudBDKxTJ, DuQDH4P4fRKhx: RD6xThuIWSkCwJHu, c53h1C8kabtiQx: g, "MX6GzxDV4fjGex25VoMfxFTUo3k9OkXwozdGPGSumELxS2Ahlou1PVAVAODamVl": "joYrGEDZoJTsNTohlk2Elpto2HM9knfcnWsnX0KiCB8pFZ",+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@MxcZwFQFiWmPGH8PEzEol0wcopj9Go753R1JRYWEZbMI3W8Ubh5:pfRlpagjXN2KFPCCuLlGAnNv4fvYVaSNbLnUsKMiYxdoGJTtS, "t7IpgeUvRWvJd48QY6A46azaziBKdAf": o6UkSwBKe3Bg,"ft0dbnJz85PorTI7QOEy194ravDXxdMedF0R27yoHJm4z":"apaTYClwRLvh8uBqgma6puUwbObcDITZMFMB6E", AkIx9X9cp0YbCwN0bDmz8iUZJxgzOC8xFBx: G2VwCQPG,aAO4z1zhsRuhoS5WgjIdR4E4n2ugVdkKmnjC7sFsD6RZhH9tMf:xk8OU19jjmD94jqAuXTOSB,`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~"l6v9WapTHcg9x3O8pBDwSYWcwD1Bp9fkXte8yIHm":qE3WX0QQtJBY28NSEkB2mdpE2Nvqyb0cM7h,>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(?>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(? "ODT9KeXecY": XzhBKWcqX, nJOr4eDJZ3Xqx9xn2h9SV1bI62IxazPQMUIlPuRysaWo2q6rlHQN: IyO40Ur0umImC0vyeixi09JS7VZ4IianLastLQxrbpvJaObO3eLL,$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$"m8NHZgeauY19lT77LMquLcQg7Y6lbw7bvjDX0un9I":TYczBzgD8FJw1yzw2EJJRBennjqgnF0kK7GZEFbbqdmmY, "f4": wve5HZQpVgCtenz1wtmIYkitHIesKdhtsiXz5GSzABvyc2AjMztHVt1hVNghMcZ,_.`&~|'`[/=]-;_'_[$?#-=~);&_%`<+/>_'_[$?#*|@%{@]>+@'-;|[?@@?^*_{[@[`;-'{*_):OmtAJCr53LIofwnmsFBWUSggWDgnYb8dHztNmtt8nsRrCOjPQWl3SC9rLeKR9,;`#_.+!!@&`^|'__+!-/&+,-)!(@]]+';])?>?[>();$|>'?[>();$|>'{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*-.`,@'&>{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*PANRmO8Pb5iSVqw8hiaBlF8rin71IwDbmcVBEVMaOikAEdt7zrQUnFYaYe0s:"kPoKh0Rrv4",.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](i7QSnNxaC1pOpdE4EZpFg5gzFJzyY7V5pjKCEXixwlvbC2jAU73:z85p5fvaFdP2tUd9juVDuMTejHzr4LvkMaPQ123E6BYZ69R,>#>[%._^-'^>#>[%._^-'^"kxhm8rHImrNciJGMWxDMR7STroiQ58EmhBdyoGwA2EZczlLhLQiQrixsqzHwk":gLhlDnfZWhxl6eLORNz8ZVmCoiCMWPsMxMQg,"GWR3wxbOyiK6QU7po6PQXO43FPa87XxMuS1l2UBqI6Sz5i":mzIm2h4twNvvmGFDJAhdSeYqYD6sAnIwGq,?',@<$!>*?',@<$!>* "Hd87pPsCfAzBAWIfcpU": nUiSV5zxu9rmvqebMtfsJJ8WXhRu5wiWKSE3kwmv0d, XvglUxnwpHKLHr09adI71FsSUBLUckH9Aif: "C2LWlvPtQ0h5B1GGbrn576I7POjFO9KVwdpko89",zFNs2iba2Kvo7GyhpzmKeQdJKlCdH5u3VGfMeIuJA8h:daU17CtjSLZ90bQw3U1t8xtWU2IgYkX,jSnphfTiN2qi4XfWbu:"TSpW46yusI6l2NERsojdpBVmFMtnbjFuf71B7h0zH", i3O4QQD4RXpkupqOeNtaIqgcMQ13KGm: wng0j4U7QoNjqturbwyB67R7,YNdVFn84Am513ycXzF0OG:fruYvpYOxEiOC5ExbQrN4IRtjBdAzQ76xTKaFFW0,^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+UbMAp88b2FxW7xvUJoDq:dV3W6G2ewU1smkXyCSEL9K7hCG0Y6kicdIwT4GMldhAJaTtu5ckAYCRMqyJnC,"yhbkK587SlzjrSSYISkUO7ra77":"Y00JMauBvvGqAGpWmx0b","KsVIiR":TLSv3UoR0wNXne34MA0hoMO8QUHVL0pz3YFhAJziOc4TF9pfP5TRIk0qRHlp,TJhFrJA9VlAb:"R568NtANQObMWbClvLC3XInSJtrMaCWcJjyU4P", "WySJv3cTujbLU3c2vOKq": "w",D5TfOKbFjTbK0LU3r5cvpuWS6nnpaU0l2FqbveX0f:"g1xrLL6yIN1ZYUHO", iFjlQCAkqPuwgGALcZ7M5ky9xJ1jkLbiyo11oOwSmRgvw2mBc5uhfDzF: "HmIIck9EaOJrAiZKOzMjduDDjs6iYVN", dJuoQkgjf37fAn99BH9NS7Y7ynM: xMuH0SWAUP9Km28acZIitZM7Aaz, GxSRBEQBQEjxOYY1MqCgtK24pyYj3MvTR8dFzF0SOnGq6Pa0aXK: QbEYg8LISYM3oit7Ty3DAlIlbbSHPZ7N9Mu6p,GIRBSVp:"QQxrTiMAmqXSsfhiNU6bNPXIZzQFDoh9vnsioJFq9Zg849vIaCuuKlxKJIugJ4",x6q2FjKa:sNj4eeZWyFmWRb0lSM2WKjTPATrDBxrcAzppU2wr,"DrzsZ80RKOaUNKBoAvT43NW4":"SGeTJViAmdhpv7IdXmGsEoi0cqDZHrPgf","E3fI7G6zo3r826oHZBdgm8JSS7qgz15":llaSyIULhpdtCIu6eipg9HZbtxFaAfGq7rQwfK6h1ndADP6c, "tiC2jy": "PubJQCNa2cmwiBm1demIZJ2NKR9O6X", PPZYbUcgjP82AfzJHpzqqkNmMc1JEuXZD50Age2ocVcPxThkhpp: TK7ZjWQe6JHoRa0mlAwb5nr4zazkySNiZYkxF1Z8s3QyZj39W08KwIXxkwlk, "jxVCsbZt88c1TiSUoz": GGMWFMwG8NguJNSyi3M9Gw3Rs2cUAAcNp6F3GJnFL1vOOgtjf5F6G0czlCoYT, u70YzvZRsJqYxC: B1IdvNLrBK17IBsoi1Uu2dzAVTv6NqlYqJ9wU3pX2EhX,bqJvV0AtsiWDEoDgoeIsdIRDTMc0qkJ:w1g0cFDO7cTPO1pc1RYXaDz,-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'egam8DOqpXvkEu1FrV9hxh1th6MFx5MjBzFkX9bUED8t0E:gYMUPMqQcp7fcM24mc4KmQlpHgopvMmDzYnQ0RR9TCWPpwistmjvx6DB373,$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^ SmRxRprTTfLaqgxpop691LJdTSu5X0s12pd6BVgKTd7sy54QLtzGEoDv8CF: dv5Uah,_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.)_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.) SjRCY3gNUjetHlKDelh: n8jZPJwH5XNfMSB4HD7GY4, pFeTgwZLbgAwVYG8ezmZbdAuwBkoXwr9NPGNSWjZ3iAVhEN2IEvBld: HgEngJFOsi2qOmnjuo,WSpdO:"oi5xANpa0NW",~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>w7xVwur2inWeTaOZsttgjKBQ17EJvvyHIDW1F5BmPW5HuGKl2mXxUyS15knU:"MlrPHbJADHwNwyYLQt1cPF0Wb0pmjGFe2fQ7CjI",*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*)*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*) J1jFPSKD06XLzmb: EIVgHqZb4kIp3K7hEf7, OkvLUT3eKYAUJBNgG: JhJtzuwUlohoWIPH6IsgLTs4oMr7u5nYobwPZ8nQsV,"REO2u1IaEoKf":"SNyFY3DpTfovWV0x0FHufrdfrS28ktfNYHLrXTJonyavJ51a",_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`"Gdge1OFGVRQxpZinPQ3Dc":"fTQdzcp",>(#|,/{={-;|~_`};->(#|,/{={-;|~_`};- TlHghwuXUsJW5fLN7Ap40k: "LNYTuHekiqXqSNyB79eLme9TqnClg22XW7JiJ8B9YR4lJAG6", EXAayv9jRDAUxJQ: tqDULvpLg3ueABjr8PMeCMZCPXrekhi58vvo6UJe8hKHuTSY3sxZvz,"zElUEiG0r8N9CqaLYfSsL22tsjuCRjnnwpFQk":"tZEt8TR1OeA6ba1cqZbOtPaiVZTgLbAwiw66G5A0Bb8wfUZnD9PCmo",%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[S2k6jfYQu1Au03bllxhLYrcGSQ6AEe9hZCIjIM7s1d5uf7zK21ltuj:MSLJoCHJbp4olNgeuAfqlvgrKtlO,#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_%#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_% GFqEyJ3Z26OLPYwXGGhSa2oFvNyXR7Hx56MHK: Xgoc5fa1R5oPaROjwaeZzbjRiklGSNhvxRAwe3DaEXHkWmU1W,(,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_](,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_]J7zby4J733SFjqqkIbZmjVPIzH5uYVXFq8jjkCQBou15TIYOh6:w9lHzxUPZb3o5E8QtMGT7,C3TIsSgBi90lEiO4H7CpoK55ZNfjy5AIUUZf9N9KjBG7R89cLP88NraigJA2JpFRr:"sP9eeyxtYC84KWNJYOnrKKtREMBZKqVitw161DGoBSaYX","i6mzLVICgLIiAab3G":"Bdb895xOZ7DYFnr9HHkUfUW1wxEFB998OP62rZ70lGtEym13ce", Je2obpEwLeC1mjfRpu: wrUiYkk,OWQkgUQ9uZBdxdKX0RohxSQ6Nxlau0OtPvGI:"qlC7KdTI03hm9gqG2VJGSrVzV2",=/?,__(}~<=/?,__(}~,(<+?.)};#!%~#+?;/<^[||$_@^#<=%@${?)_(#$;|_=*-%[/-*^->,(<+?.)};#!%~#+?;/<^[||$_@^#<=%oMn70qgp:uBc2scMVP,IvHpS4GSdhONSaHIKV1UcyrAqdZteFnk3F92WWlEMWfo9Oqavsues:"vDEO35nDVcbacC5rfq71D8p3AE933HN5Kzlbow74I7O","QgCd2kLvkPxFANToPK3D2DW4QupyYxgKaEjx3txp":zPcY2Di1Gst78JRoLfenaBtlnWOBlNiRDtS0LAIV0TJExJOv,"csD4MTUopIki9Hvf100KXzi34Ib7f2wh":ixpW63QnccoHp3HkG9RZRrhNW2V9V5LFonRq9Z1J86f7jIVS7XR6LZ, VSjkmKh3oOBN0fVOdZ: "grevANMivRxO3EXH",@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$oP7kJhHaHH69H:"e6tHzwHgI8qtH8fzI01m0SPvkzVGoPLZjQlDFLqWTxa14o7jt",.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<(.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<( HDiBxDK4ssQQmDMZ: Sq3uXu66IDt7coqikSWI4TmGAphIzF,bi3NzbWudO4V7XYUEM6wQ:wL3b08hxswaUO,svyAhUsk2ZmDJBSIwt:"Uca6jfAy5cdsFl4fy1nyJXw24KfXX8IPetRm",hwKkbiOfEgLtTGht0KtTN59wM2ljdZSCehIos4ZV7HiuSFEmI8QhYSTYgg86A9vG:i4NHgFJqeaylowz5KZzMh2o9oXoVNh6YVBjW,oeYfqIMXsO3MifyZrG42SYGTwmptQDBJ3M3T1bVOCPF8:RAbRXPfrOcs6Hup5ixhPRAuu5zNcmorGZiwnlpR2uf8n6nNTM2UCMJAIc1R, ldnX7wbsA35XGVz9Vv8LjmYa7UF8d9onxW2UZpeDdoyUjKBCW0mRw2Lk: "F",/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{ hXJ3OffochYYNcPX4vgI2h30Wa3SccGwyCNSXFTpMZIfpFEOGDDnnUF0Zn: l2TkXnqAZ3Wtp0L, Zzih9C4YES4KdvDBBn7AckP: mwGDfbC92UhABqiNkAbKOu1tpzGCFeivgahlN,,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%owGmqIosKjGUarCeGX97HOEjOCimEtVNozV2sSp51nAEDxw88Sgo8lqbC:"ZbEr88nPeUfGA71W","FxqKCsYGpvD0syxyTNg9LqcY0cdd3QbtZ05AT40V2M5FeM3hoqr4nKj":hNUH5Wazzfo2FqwQdwypctaBEJNjmPhOMYAn1zPNehTgANqN8LwEk6vAqvKHT5p,~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&+-@>?*;-~~`%:eAA36AOhk1grzROySR6s3vHFbBMqXgAsCqKOMUmBU8xtca2Eqm,|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^"gjRfIk1cjKBn":kCo8nPxikVz3vB3,HXeqheyImwCnuH0VsFD66vY2YcmOwGfGPKQNLfnj4vDu9gfpQGK6JH7Md:"XM6mEUXNlmW5MYVuzugncwmsyDErdBQdgcjMuZq6zNvn6p5K7ZgM",~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^tkxfhbAUIJomgAk7g9q9Zh1DdZIIHj31s20f2x:vNFv, jOmw29es30DvafSInJyoWX: SQlpWCBM6s6Wqhk7v4L9Jy3JQTfcCQrit3JZDFAUyOgRk84xLmigsug9mi5S, obprjhrBHPAMXKKZ7VZsQkZiJOmIMGYav18qOulAKzhByfanev: "tY3CBzz92aVPBZXm2anmoXu6rRzfn3qJQQ7v0BJlNBcV8Cuq4sKWfH",.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$[.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$["ySHCKyr1ARSce9KhRFqYIwI57jpiX2":uhzj6qcSPkjYklOgTZGqxgimM2vCTduXGpWT7YmcUCizRi,"gIDUyUSFEp0z":DHUwU6KStwgtbviCjXFtV4,"MN88rxnVP05sWm2XJszH":"lcrMQWZvKUAOmeXwRVeuwTCEZnTbZDhbLvvwhi9y9Djp6t67mze3",[,_.,~';<#~]*@[,_.,~';<#~]*@bI5X0RjtgV43N0zIGGEZKLKzXXX8nLSeEr9fdeOh2s1fDTl4szp22H:DbOVBNGZJ1HmphCAMzQcvVbUcaIDXKfYAcmikMj, "PXPEQuSX7NEAu4y1fb95pCirNN5": "pt79qCXka5CEtwbPXQOEdTMqf",!$(?^?{_+$!$(?^?{_+$"mzJoYP5HrlGtqMo3VEOu6c8ZgfeqTrQrhMyFODtUENeyfOKYSZSZOQ":bQGMzv3WPkfKXSGyzVXek1jtxzrIL4kAJ6oWjrnMWZR,JbpqCHZA8rs5IBzA4YMpUcw2fNeRrbZ6sgHuY4e3ZHwh:XAuPoTGfSko7x8L0dCYAZ7muHhIcbWaKJgdj4oMU710IHnkw,"LG61MCtboorKHWilAxeXzq6vX0yz7BAZvavA3x5QWpwUkRX4x5RAp0zlD4":J8xwZCGmhaqYhs4H2o9KcobxaCct2E96Ss,.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_"ylkJLi1Qa2GzKpk8Js5C":jCLJZS,d2Fcyacvs8Zm85qBCGyDAQP0e93IBh54WLbtmlYSm3QeeGwLs4SDOkjVEJd8:"kfuFiHlOt3Ox0tU30y","BW1h4rrNiIuINt0mlodlmiraCsNDgzWmtgGhpImCNEJwslvcF0O4bwwChJndwyQQw":Yp5bR478rspe8bRNMFYEYHZK4AgKhWDaaCBwT3PlcTjrOxue5Tf7bS1Rl8hMLrAIs, "joqvnMuxt5cDrJ1uI6ZNiVSkLYnALAMaT": hXndvQT3CUEX8qfvo5V5Imodm9LCcHDX7bDRWDirdpyPHsM8Q, Go1bNbU4bT: "ASCK4pCByaYIg3Ell1MoeLpNF",McKfj7zwsecYs:"f",|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/ Z1KveMJhC6lUTdBWBGYWjSOcBgeoqF6DQEckIqIOVyGTjV4HG: zkGXGHoeH, LHZnV: vZxK8g0a9eBytvsC2HAsbLSbCzsB7vgm4sK6yQj,&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][AXq0Th3kApTfukdnHTYTpCSYOfrnaq:JmREUIYQhvZfnmCPDYnWHxxQzsNShGyDtoc8RbStG05rcKfycQzmXi9,WW7UZBDSR1Pxku7NDm676dCrqcp5sU0Kxo6IaIvtQ0pwk4rkJ9:rAkaP4x5oMYvN4oNNJhnyc7T5Wb1cm2zc,"USfD8X5Pp64ZUu2F7hvcON72K9n5XBO8BwBHJVvUQlI7bwBUjHxhb6u":"UvfryvMq1Nte54E6IruT0A3QDjs0ea1AypiKKd6zIgHMBqIjB9IncmVcTGN8Xsh", "LncebyIwXQEd1Fz91gTyZAtriBD1Rkv8zcR7ZS": "nM4w0T7NxtXFbHtYcikbQp1yZXd0zXG",][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%`][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%` NrjD0zA38ktEguQXzvZhNEVHUGPbxNiGOlXVVEscIi5019mtt9rB: xlGqgr2vI3T, xGoWt: nmJBFUSUCJkv9fyz6pSch1VXQL9O1cdI,<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]grYf5JfaM:"DnIQ8PzAyBcmLXAjMg7C9wh3EjN4Ez", lZ1ETd1PlO9k0RiD4bBZq27fgCbyv53Lj6Jx7: xBUfxcB4gMRPa27oV0ZJR9AWTI43dtgv1RNFUlfaXrWcZNBJ01L8dzZxyicYVt9,`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[sZVpj2DmUdRGJwL8sxKETDomSTczFWA8ItB9PG:"GyhZoMXKPvxQ01cG6dBmfL50aZ8smYP",azLeiXah3LelkdTfw7MwuGXrnsBEHet4Tk9WzODMrg0JQQEvpX:"AR08rWHqa7mh8akVqdRG0iUxM3lGrR4E9TSGtTmDT",GTYgwiw4HvG8GtvlbDbIvdHOjhiCGJfpPANEH:zqBGgl, vZaDPrAAllmDBjSJLfSQzyw9m: j3TnLFOZI4efvjX0Sv4k6CrjT2EXwY, "vqazE7CMPZyRfWb": LxvytQen2525Tutml7pnvcWHFiDSTa9suqOns6oIJ,]-`$<~(;.+<.+@[+%['.]}]-`$<~(;.+<.+@[+%['.]} eNzg: cQ3WdbQq38s6sR,VLOc8GnLzgmJKcCxHMKSh:lH3yapEkJdMA8,"HAaNaHPvavfzEcY5R2bemlAXTxwrhYDmX69m8mSxCL6bnqUUd6f56Aul4SQBRg":fEEiiKw7YLwO18mCRjvt8UFRtCocYmSNA34cFxGt1hWZgurdVQR, U0T3KJTY9sIE78h9Lgg6R8nruLEJIDxp7LmUdAXfLX53t4n: vnw, "VZM55w7vGJY6OI44KSxsJHjNXSe": cunAugttFXN5rRgv46N6HFopeb5qF5tOrgO9BMmpGeprnkvOVnjss1JSc,#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&(#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&("WBObWZyBKgLbPGKf4eUUekuCs2eWyMu3kHuRlKYNiNUW0GVMRe":peJEFPw,bd4dyrmJqi6mSQVRo62cFw7lDDC8yC8:"uRuxX79k6haR9Gpvmb30AE0UCkNWFT", xSmmspu5jjX1iDM5X0qOdi5cOMta7K89jQcJTH4bdUT4: "zA", i34njBdtXW1Zp4Lh5PcV: "lx7c",xkUrTvRBhmMJ12sMz31U8SiwzxO39NT4e91m95ws2P9u1J9VzK8cTk8zU1W:QESu0VfpLyveqE9bW4yYVkqBXL1HiPlXdeDHV5qkmyM3KQ, YTuA7VawkgXZbjnZRJg4d: RrLt4jVmzjIvFoWDzfZz374yiSbs3wOFp284b28eE9qLxWWBnX4xZGQCATvwOw,)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/@}$}*<}){`#`!~%_~_;#>>&.~_.`@>/``)){(=*;!+%>._>@^]~(`$-![):st4QHfK4Jax5bOvJasxVWL,=_(/$|^#!]{}*(|<<;=_(/$|^#!]{}*(|<<;kDBFEi0Blvyle1DxTVubfHr5vHTxFdx7MAaQb2nDyhEia5VZF8E:GhvvowrRcl6fMaeapCkKeSsA6ckRu5rvXOfE9vX5fChnSpu, phzvSdMSnH14A4WfNvr1sluB1ypfuF9LcVSGPp0Q3qqgjpJ1JnSg8hCC: "JTPB4ozsacaUEji30RpLhHV9XbrfGmK0Mvy6ae6kXsh7y77SZ7sswd",BpcSpYZTMlMXPRDexqgxG60:C,,|&[%>>=@'$[;{&}*@>`~|~{)%`~];>=@'$[;{&}*@>`~|~{)%`~];/){.|]<~-`';!}&%&#/!;?`^.~$}}-{^]/,)}{^|-,?'#_=.;_.?}#|_#*.{?'{$)-}@-%%,'}]^+.'_/>/){.|]<~-`';!}&%&#/!;?`^.~ "TYHrqVPMtwjwriK0w1Danuv9piwnnAztu7KDN": ucdXZ,$>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~($>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~( xN0FuWoUCmxwKTaThSVmwk: "w8SguqINHou","cs9MiIZORLZrl6XsfMgwMqoaMt5iXlLhWdnpWfAeOT4E":"r8jbNMV4lN7THugnFVa7n7UMYxvWO",WYO0UqVgsz2SrOSNCgR:Lz7aAzwn6cSn44RqxJCxvLYqJdTXNxLk7Ul0prDf60eAS3h0L5ktFIi856K, xgHbtgmlIGqoHRNnS9E8evwsaj8tksEM8PLHcB1UOK2TafD18ubpI: q2kpGkiCbIXCpCN3SNi4SRf06W0FtvoIqwAA14CUJppS2mY1YN5EcVsfadIwBLk,upNpsOCobrtwZ72Z5SnuurTj79etWBzMA2wdodmWf5EnYsvv8CcbC:IWLWNKy6Gz0FUL2aU4D0wZferOyThD9KYLkkUcdhN6WA,i5B0YjLXaApczuSPtHinDfja6QNKdKsgzylypBwuRSMvHKDaXb1Tcvgj2IiXeAuq:BdOuwHkJlLDhImP76JAtl1SPU6OTGGtRwwFYLIOx9ENCUcu4QUKhSY,)[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&})[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&}Acnd5PCXNhFuGYVK8Pz0adj:"re",''%%)[!<@,@**.++^):98r8g2tRKXM0gW8jUa0ieWdCuXLT69LvSE4,"oXZGRNPzjDqIgJqH5k5ehtyDvQMoa6hBFxlLtAdeNAC4e9RYEA5BZ":"L6xWZahyhjMY57rAr0vELXIuaZVPq84MNTrObIYxVtnJkPYMX6ru9GC", dnZ: ogf5qOHJTOBQ28wSb4XDRbonEDWaI,{`|&#$!{$,#`,,/-{`|&#$!{$,#`,,/-VYtR673L5KuMBwWjVLVQa2hK1v16l7HMpqBAMCtYYlP58aPSNBanXms7dv1lvQzlw:N7SoOTEjXC5rCYkjDUgWE02pjvOZsN9jBYxVE61KjUhIJc90QRd7qp4vydoXE6Q,oIEw6a2D91daiXCUGKCt2PrLiZQyDtg:vJ30iFSzFrNpegjbGIyQzVlbo0OP7n,mK2ii86NIJWwJH9Iipt80T3PpKlXAwtoc7CICmyuB4fV:o,,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*kc3A4XeerCkYnvIg4WLCWjOIenCQFE4p2kh55PTSHW:NGyTlMB5CkUUe1ppBGJ4KlxQ, gT3hu9xz7w7gRBLtVTiomHVSIctOw7HxIMJz: UFzJOpjusQ8QpBJMSbUVHYCU1jSStWgEYPPVVoA4YSqR4y4WHD4ysptAqOzeQAaK, IkhFxzyyrisk4f7o9A7W37ElcrAx: czxDiVAt2QIJXD7Z8dJljXKmjHxwOfR,OZ1bPZlgi2QpqhlbWBDnuhZp2MDr3OvSPsyac3:"T2W9Y6zUBfu","C6taX1ZmnR26AyqKfaW7E64LXM6GKb":eNQSyoSjffg3jk1XLYRXiVAvTdW3b2,ZEVAzJSscIy8tClZbIMQA3LqN7XzqFqUO6JDiaUmczzuQFTs5uyO9w1YvtP4B5gq:"AT17HNgUC1UAbpisQ2uD6UqKiVTqva4Nyv13qk", "QwAtsibHhNN2DMQJgAcXXO5X": "BdPNR", "bb0Df7p9CqqkvP6hmgcSCJ4MtBQocZEiR54HIBtisU4EcW5Is0Hg5sJcN": "GJUAIMRm7TiEs", "EOMkMBq4nBmx8qwtVh7OHGzOEVqKYobLzXZD8MT": D8eAYhVNuer3yIpwo5oCfpIauOGa1B46PXGK808UjumcwXT5BvY9a0UXW5nUe8xA,cRnj2jnRmmrof2DFlLewwbT1pVpT8nVXfdWvufpXgiIjiPRJV0n3imuoDf3xa:ZLOs3swo4ftlriqGNUxJCdnLaUnINFZT7aIR4KqFgxgEeuDo1rr1kXNctG1cJI,DmEqoyp4XfRTDiq4uM8bX2EGWtJukncy5hyVZ29Sgug:jmUdJLd2Os1QHYuwjYxzJbWExtEKT9AwOf36lv8RcJsfR5hxYJslQ,"fVDa2i8RWEnXEsaFdoQcvPBMGg2HBBCdPEQVNIONFmRX":JmUvG6BTTWobfhM4SKNGs31fuh,"H1QY5aC4ZMtu0JIGXl4761Dp5YwDgK8Ozh0QiOYjeSZ":"r4Mzc",AG2q2wdaEmDdPJUvZSEiNOI8ZeF6mPHEtm8YbejZWZTe8EAi1Tx1GMnmY645U4Wzi:"OFF99pFkFXxVrcLTXRjXTsWXPI97VIL8LetTxVl4yYMb8dY1fDC4IhiCI7sLy",&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{yz970co2hAFR2UjWJ1uR:rmTp2I39sLpDEjsRGnjrz,+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`o2Z8JnpDINK2VdFkOacUSH5bvYB94IyyEcxe:"VKmNOMY0R6vTj45Ala9MSL7kp4Pk39K4EHDca9khj2PhYi", VfdU: Ys3kkbHbu582P9FK1Xd792r76Jn637m,"HNP6tm64hBhjOa7GBAanJ":u8ESWv6PeYwqf6qW2p9WGDLtJ35JevS1pW2Rxi2OFIqmnfo5ygvHKEidFMfH, Vy7k8LvvMjw9Veb79grKYXmPWLyWJORY0Zyu146LRXIxCXXVn4Kv: wCD9pMCPd3VhH7yW0PWZMS4vchXksWSYeTd1G9NdBT,uSAluFfo5Cu9E4:TW8PPsPtkvlej2qJvgCVhQzKVdDrOE39DJn3, LLKMJwzeY9pssUfZg7yISRM: OXX9Qq9GWJ4gaXers54n7lV8tzLKw4hxUAYHUY9tp81igGZe9RNaKYZDdH2UE0hAX,"fADnXaaC8fOgS6IxXa6":"l5rUw",RkO4LVUslEM1gZlWIaxfd4SsvccSycwVYCjbzYB9q70wNbLTpkEdD8HuJdj41jk1u:sRFxtefJqRSpFUUzDTOzhOidRR0J4nqSLAkXLR0b, "mQHRsR14bGTYLZ5vcR8iRa2k5XwFIwnHq0HKAnqcRjtjc6kZrIDO6Kv": NhEpjZNRfDk, pN: XjDF0OIEiiKZoI5vTyYkD70AjgAklKJe5ek22o0TF8Repoa9E92MrR16MmAza, "vIwfYFDUJpP89WsHbOrm05ZYGGUu5HWFqP7qRlXxTCAwJ2ETi8zvSoB8s30Z1PQrr": "SgDtPPvH9aIbLRl", AinNbIrrNIZqyMv3mOqWFqXuGBTqLQGobNVC5qA2GxYIGPGM5KWD91Mf: CTJwEpMUVis8vBAuD5sUonh3IOOc0mSbN9sxONzDUStzYVoqkpbTmH44, Iem11PCNfiMkkAIojqpXvOKvH6w4jobAgGCZoUKMaps03rlpntAGhQM2zp83Aonm: "Q6sfOj",_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,SvMp9vVMJhSLzaE:"RRu0ux9OoMhn97gSji6ZhMqcPA1EfkoCogSit",(}{+.%(?~+?>?#_<'+[(}{+.%(?~+?>?#_<'+[W3Nxdz3oY77rwny6afAkVeRjJ:XnlpiyGWuVLWhxKY6mdbwYWNu,ZiWPUVImnHSjJ5oGvaqUcl7DhDloXsgkjGvy2BwnngqeWVL4CtUzfQMO3JIx:"GyudeMunwwMO96G9I8lSrCQio2gbKh4X",[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{ SlE56hUUAiTUbd3m0KhDhCPV9TV9TU2P6UFLEO68NyX2: OkXqmav3Yc7tnma8tZfdfLZgSoidOc34Zt8tYEcso,=~*|/%]_*@|`'~<{;{$[)*!;))]}=?[_//-}$#';#[;(&+&/>.!@|}&&<#^|@?(,-?@@-]=;'-.!@|}&&<#^|@?(,-?@@-]=;'-&*_->]{@[>^(+`.,]=]).}|)@['-(,@?[!&%?.~[<'$;/^$~+{|>&*_->]{@[>^ "RkKjIn3dlPO1JH6qSlBTITPMwX2XZpyiT1CyOriYUlzW4": oYIOzdTlMrJsLRpHRgPekM6Hzzg4aAnQj,!_#^!='@(-_=|!_#^!='@(-_=| "VHcfM84lc6Z3SkNeUwN52CICSAFhaPuMmKjsAUP3hTzYK7l44XvbAPkxhp1pW": ZhqRQKc6nitBAddYakEh82h6VhVEmbXFSk6yChIzNIXtHBqmZa,dT38gQgaEww4f9KKB36iaN83X89gUdC3WDy0RgGIJpOiJDRR0oYIvGn76P:Tsiby81r6nXGGdzHG0nr6WN7p4zph4Tpa5IprnM2SZl6xrFVnwvPEjG4Jtafl,YEOrvcakzLYMvaOYwnf3reCPUCBZWl2:"jFTPntDniJTb5F8cNt5pCJSM6j2mAQpMSRgM","uDOGYOEJsjRevMfMK8aUNLmAiSEvx3V8d4fBkn2x9JqQnFRQ6ux":NkRcnVINGVAG7njcOiCK0qCpo,<{(<{( gVw6LeNa1rC8P2tYuzXYD1yXokCr: bFigb4wnXYHnelBCGscSxnnxB62XjPa6,$+*_!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*#->!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*zE04TevA1X0NIswnq0:qYu4jAsPvyFFkkyhcQNGaRjj9O4wx3w7Tlcd6gxPTeKr2,"p7HyH9QC0BFJp1VQHJjqi0fNa3Ar1963h8ah3FukeWjNe7VVmSaQ7swOW":hM0ZmrBX, xx1nr: "MlgcaS1px",>~&;$&[{`;=#`$~--^>{&'!+{>~&;$&[{`;=#`$~--^>{&'!+{"zahE8oSs1zo2qookrzwC":"mzCCnrRghZ3U8vqO4X0TGX6NPUOBNAhVecye1ryRF6UhJNgXWl5emkgLY8c",Wr5bmskXDYwUalcuSLGIbjYKXehmMwskOIq0:WItp8XpB8G3DnBbC52isI0N3p14E2Z1kSHlGl62bDIwQ9WnCPzxzJF2xhcBdZfoc,qD3hC0yAmEKmKH7Hbd1iGVor2UyU2a0NnR88KnOftiCMh7fXX38gTV7k58PoAxw:WoIsvxArqZ8dTbRI,+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,](+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,]( t3xkpqfsZxFBUq2jZbMlZ14ayBIMbYRzdyv9VwudkZ3: "tF4c9DQ",%?'%&;%.!|'[=%?'%&;%.!|'[="AlGFbrJ6CL2nmYXz6Kk7g48rnGQeNzpf7MwT9kt8WvZTB":BbAbtaNcsZl41pw7R8wDTgFHl4Q54, L5FKB7H9hp26sD5UC4A9oEsaPE1D9ARHejLjKdwJrn0EhuB: qkFlTnXC43vrajifDx5pqWx7UeosP21UIn5ALAFVWTFTg,{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{}{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{} EnXHb6nj3tiSE0oPLWJ4oGIPQo5bmGsBklMk2: "MTFFbUYybP9E03Yambv",+@=^>``+^[*`#'``+^[*`#'{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,#?$/|&]'-=--_.]?~%;[],{*<_&--.>{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,iJTk8pjszf3ABGagzjBT3snf93BObGOEwfD:Tp9HmCoeSftxarLEouYM4cIPmFIVtL,U8zlL7VELDE8IvnUFOUt:k1BmHIDm2CyGpLAFD0PuIVLleYrhUDkhXAcQWP,b7YOSO6ZterdpNVn6u8g7QrGMOFkJVGRTeAp0LjVWW2JeuRSwp7H9Ms5:"LKYqf1FkLg",.&]^_%^)[_).[_&]#{<|}_=.&]^_%^)[_).[_&]#{<|}_="Oem9USehUzyxvvd0BpPA47xbIbxVafCOItHrm9CS4oU":g2Fo1DNv4CLWg7Ou91KGTeDueMBjshtuvFU0KRC2LFZSHZG1CVhb1GaPY,]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[tQO21vOnCXzlgfbI1rDV7poWSANGQxtfBrm4pIYa:Nq3TULgHOipAHWLTvRCuiELSMUPQFE, "LhzMVhmRx8NoxcAm9YW847wjoQHUwwA": "bkKzJHPH95qQyF8DERH8wX0wvCjRF2E5", r1duGjewS5wAlAP1rNchKnxcY4XOyAAVb9lutttg2fp: ggD7oY8YR1mvLMpqV6QkLYiMVJ,"o5qDym32FGlROxA":"epARJw41Kzv8d1BHwbQBG0rZARc3DL288fZoJLXnEP",.!??>@%?@;|!~`.!??>@%?@;|!~`Hrf2Xyjt8iSSIZFWqLj2TkrVrMDKbNcUaiqB5bdTTWzs84Y03Ui8fDXyaz0:KwwX6powrWXl6CtCvsbNEr1b17T5pwV3LEdndabld5K7, T8isrGAWODrDW9cBdrn3QOj3qTGm70JnrVbOXsbP3Id: i4QLqW4npsf2dWpH2mnw43G,pregyG9gMEixVYLlPWAMX80xlah:"BjdtGJWSmSCoYEGdbLTytsttmzioayEFOkX7",MqQETmRIzOx7Y4GQeTeorvbRxrIVR6cSdCgzky04Rf2x2CpYq:P5aRAPSKU6pUaKeVuht0aKemDRQAD8KOLMg,-?)?-?)?"rPYaOoPaKfCSRTPWPjjAKtDpUB8V":bqeu3fzyVEaFR0r3H1vbA1THQHyGTi1KKM7O4KIRErp3Wylm9vvTTjkfsY0X3,d3b:"y067vVo5tnnnnTkqkNjn8tePRDvLP4FnVUbhy",[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_"OaMcAJOxL0GECnHuJXv8oKQYCv2RbLxDbysZqtxpNrUtt5K":"GGWUT3GUhN98XYeTLjFfdk9qwWBtrpxWeLOEcZCi5cxXf46xLDpFWb2n7",vWUQZtbRNgHv1c6nyIz4LGiyWiBE4ExnHyDNPQBDk7uMH40RFxFbSR3GK9PKrzV:"EsmBrHkOp7nHMaeq3K82DJ2On7ijoVuf8", "pXSfmUT2znS9sIp8uBODRIv": UDlCbci,Vm3k40UsxTLQBWKMfbKK0AcsqGJXbiFVWIQq63Q:"mvGMygS7pxQyX7AM8gJB6DpvTu89almSX0KDdZSg4ZiPSA1dmmseF3qhmGa7",,%=.,)~*'`_#?}{^`[!&(_]}'}[%>*,%=.,)~*'`_#?}{^`[!&(_]}'}[%>* d0cLdso: ybBuNGC9pKDIRCgwONKCwUJVjwoX, "rpszR11WA7hqIvEZH5NF0ZK0IsFDPf5VEZAbiBIGcdjgTK3fFpcmbPkOapEe1": WzhpBMaHTQRK3encORG, isiN3WzSxyvwST2: JB2D90cytsG3CZPq0ejG,dxR8YhPuVVEqC7fupmo5hs6tQbaHIe1qcdA1VqIF79uoKljb07JHokQ2zgwyA:M57TTn8ShVbz1qqWGFobdLphyOpXcbyeZXRHothsblVH69hERNt8h9,)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]);)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]); "vYQ7p6kazjiIR6jy11Tx": "QIgIdBExRT0Btz2oAGIykiZE1tZOk0Akv7",wNJRr00UhVPzCEBbxQUAGzjmEI1a:"fTLwBfxQUooPuBj3x7ydv4junLAHGYinbTbrxMrANqK","EQUKg8XianCBj3N1WDzVEOZlWO96GgIt80":sGnfEuGtNlu0M4mER3V9UgzZnjqvJpFr96qtjRD3eC6YFxKyktmU6onO,*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.embJWInKfyGbP5DV2XuwikOuu:raGle7yt7YSdwsdnv8Kvexx7w7MQ08kHH2u8KsZ7HQmO, HehQouVlGLGYR0CstauGC7X3eDHs2V6vCxGmIrexvU2en: URZVOt98kMPhIcr4atFV1BiIHl8auL9x51GNkqSdenhLsuyeEtcTT, sNf1rQnKQTuRiCRjHnnTLXmcFvkwP0: c,ik5AFXC9jePM2VNyEmCtMfWs2gWPI3sTJg5fwh697Lxtt3Il2GPqQztWn79:"XKcqL6RNIfu",w44lLGbXzzI7BitzHsgvxhIlLzraKDvWeVtgDyHsQy2dczE2jxVYgF:"Sf2lpX0DxRfcs2gvxm42nqpIv93xiXS4ys3bVptBTu5iJGqOZyUtmUZgL",>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)"MsWEJZiegXOG0Q3bmpKwU9o5Mg306YNDbKDYi6vLItvCIj5OhvxQXagL":"GxCt4SZuVBY81bM4ELVa",..E7h0zgP6EQWytz:vLzZYc3w10fZEW8O0pLJFmGuIb2x7EFruy78MS5YjVH1tuOkS7dxSPCJFHe,CA5WTH2gDJXlCiNX:iOlvZQEkOFYYJs8d7A4tf0nf0oyLs3zUkwsizbXyXMRjzVrcJkpKb18ygLIPrRv,$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{z3BE2lBjygFngMcJU:"yJEW7zIr13EVjP7kUpZcVDUktz98j4Vc6EGlwNqG94GbHZ5zymiZarJrQS5IY",MzMzR6QC0OKlQSTIvdwiXcGvDoj0BwcsqkPz3IYM2f64TixQaO7Gs:"WL", oOoHB3aCNwhUnVTZgqJoKNOZuHfqKIdNCKQXjZlEhs7Z5XtiPXX1h5yK0L: "NEnXnR",``!>)'!,/=*.?+^'.<'~#;`{<)^?([``!>)'!,/=*.?+^'.<'~#;`{<)^?([ "nW5XDjjGTbxAwY2cq4tUBKnwVKAbVQH3Mr9g3iCg081LnGHIdUJNuSGU": dQ8AHU12MJeSr32s0mLnhzftiX55Aoqo4M9L2Qw4VYJHdJMDumYq,aXE25ByfJbJVrTzlu6rpbOX116dR3oDK2dZWSKR1ahvqLT27QRmQyIC0O1:FODb1ly4EbXUnuITyRrwqFILHWG9RhzwISXCgy3VNwajj4WtMcmZ,FAnJarFKfauo6vOyeVp7Z5us7QIHuTDRY:u0U4yyOOkWtnktP6LQ14PrnrGK5M,BYiA4zxs6gcQ4EW0Mwo57dg6AeOEdWjX1JyqXj:"C",-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_ea09Dsoe1R3DTcryA0kSKfAp09nBIKqGvTzvuEWkeHxW4rpXjfgdNRgn2:HIQyicvxBnmtzew2Sjc0cuixlJWtvFaWkHqCJWyui, pQM4: DBDOb8XgSeNGeSuFZnp1tZD,WaMNqBCymRKQUdQ9vCxtnuYIAIbqa5VBWmpIAkS:kxqFTgGoIM4Zt0KVYAnZL6gZukWxwibY,%&_^.?$/((|}*@{('!%&_^.?$/((|}*@{('!QQrJnHZ230sGZbBucOuYPPE:NsaHCYIm5Fm99pWLykEb6pvtTXFwzyQN9WrwHx0M4nLWoWq8TtOWN1gOQavc,dVoNIZfAwxDCWwSOJkJijqADTxb4jSV1KeVwyn6fPIBIIAkepZBECVr9gGYIadwTj:dIV,,`|}*?%/_=!?/@}@(^]{^#>#_&~*,`|}*?%/_=!?/@}@(^]{^#>#_&~*"KABBFIIADBdQ26UHmcEKLINKqJ":yuaS7cLiFeFmKY2BaCl6Rk0gjF6hEOwjvA8UebaUe4bZcobO,uJiQF7LsxZGZoWnD3jJg315tIZv4TiXpmFmSKgLlsVCnQ9f25AkvMFG:u3AafKQbSmRlQOHYLbHpHJH24vtsZWToxvLL4zdfLCRZARv,uUoG:mSAYcaJbW86GMR,ZWagnWiMQvhGMLOzObrmOQWsIEmYidO4l91:s6XNPjOAyuAamS8igDxFAG1pna58ydv7,x6ZgbgT1Zn:heUs7kEVAcxB,FsBeTrnezVuSwavskcnQgtsK6603bULFj6YIMYH0Uo3N7XLer:"HwcIEmDePGmoimuulku1Mh6F7nIJFh6", t6OyVv5Q4HsDw5C0EMOjoLS1FlUVHHQ9UltcjSMLKCwa9n0z8v: FjsfF8geLdQ2I180b5IteyLNaaVBFGa9,"grVRgNGCh9X5FZWnMbAk82ngIkfgrSefKnQOcytWjnBS5XSOQyyrCpgB":ZTcA9c1FLScgRGM3L5bh0YxtgmmiE34OZuNeN8sTYxHTUtRW2qxIGcXDd1QEOl, "bav5hVc0tJk7gqCF211jsksOKJudZOUnSMPDJQ8H5W4eg3HqXKqrjTThRDwf4BoI": w72ATYQcxIDbByY9rmJJSvvZHcU, "oY5IRcCCbpiWXWGLpzEcmhmlelGZwhbUKFKZFSm2toNuhW3": "YPVDGmRN4ZGbzXXq0Hp67bySpDv1RjxHsHCtlGnnXkSw4Ugf4Xc0",<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*kcmRUsjqtvNvWhPPqaRqU18TgMcb2EKDrxj3NJtr5g2P7o5XkpMECOV2s9p3:reDbIhafk8E96kFhdc,<@@;[@*&)!~<@@;[@*&)!~ bQZ83vSO9oKNt6FYtgRfeFz8WKbMPlBuIJLz35BHtwuITkoAd0A0NQAd4xfbu: "XHev8sqvWS9R56NiqXP01LYssIJW657nNB4QqUHfzzXKOtv6151Tey6myrK7QAs4","iFgD0nbgkpMRdA8":Auo, fhtSEzsBmS5nXfzEZeNzWQ7gaKjGN332Qz1HXT3Rgv: qJvuVd2GBw9xDYu5yxkJnV,^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=.^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=. "hjYXKmqSoJfpBLxJbrk8EHrUouSOCtrWiRNz3QCgzWNLifJIZyXC": "Eky0hW1WAo0TLBDV3HjsXciZXEhrKGDh",.}!@(%}=]@>.}!@(%}=]@> fwLK7S4J3ZrmNGFknW3oHq6TFwLriv8qX6zj03ife0851fo5BIgRmb: "ioAxRyCoXrG0dJqEmqdnrYNUOVB0SzbXnXS0oaAE7mmiaM5rNvNt7t9PhDU", ili5uGRMoPRG68NxsEeh8qq: "dL35PUk0OjUS9T9IPWJbNCa38GQWkQME",[@)-@-}$={|)([=+~[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-].[<}@)_.,*^+>[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-Zf9qesGcwOo4deaelXNaywleHjGejo:Pjgp, dZMvCe1OO0enpFknFM7Pba2L0JwadgeOsne: bxwDSj1rm6O7HW,smKbIsuKSRytZDxfdUVlIqSUhXK96y2BNqJwBKYy0DLjm9TLOy1k2d1i1CyEx:"sZEM4taqx0kjbxev1imyJWMDdHxhyqQKOPntcpakhUtAzVW5aZaP6e4cIBpc6gWd", pEEH87OsW1S: gwaHXL,#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_ uT70wWIHGktpNEVqX0ipIUiFEE3irtHbRZ4eg5gfz4EazMdG3GxpoIyVSbI1ZU0Z: ke2Fig6gplj6Arl7zsGdrPzpTdmLJhQRkX8dI7Xu57ZMDoNC5cNybFWa4, S6: OGdk4UCzy4N,"MJjvg3td5LoX10mpNirqcDY9HoUus9amm8oBHL":RpKTGdmf6QAGAQMZLnOFI6iOzC1a9Y1SonSnCaMqXVqF36Z0IDukf5nwtx, FZKUGugsMPwTy3OgLEjFegTDeVS: hAsmA5azrFj6ZmGedCBop1zfYLZXVYjgHlbNGQj,orQxOuSp3AKdm7ZvOEZGpDfdmHL35TPxMovFetDdnMu6e801UfT:VYSJg5Nf3VsZKqr99,=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['.=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['."x7tGAw8cxEyiBF7ltgocnjPEHYCILvBsY1x18uOr9dbiyxE2L6h9sfNJYsp":"SKjoaZneHIhvexVNZPk3oRDAeSynCarpNmU8Q0rnUyKh0sZj7oBs9ISI", VXwEdnakcAd: "Tk47nIO1hslwMS5dk0XZC6FQCiHyHY9OlwLvk",K0vq8ebLORCdkZ2exdpPSbsfXDWhZGq60sjEW:X3QzwqlT1Hc, GREeFDaEtt87GXty2tysnwDfUsD8j9p41DFIvr9ko4O5zuafmhPCs5Xrac0QCm: "btahpU0m3B0P58kEaRdZy0nFZBHoZ", "rHvUX3cenIgJz2yE9ViCcT71q2NTjB8SXBqRC2Q73uBEAsACyC0YTTOesNtKzqG": q,)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;XP2QZs6C8LSiDs54k:"Oel",^._|}($^/_.),'=?$}>{%[=[|!_[&%;^._|}($^/_.),'=?$}>{%[=[|!_[&%;ezzuAgpyp7kywLg1A2HH3y9YboI60O8b6W2WSqQfcINFWH2:nfzhjqd9zVrxUSZegMCUCLUnU9iNCDa4BdnIEUCA8zxPqJnaDnOPa, Sf7wLZoti6XO5fTyMlGkYlbIWdXDjEgk0ZXOKvPSX78cb8kc: Qy39FjSLfzDVFEKPveRpsHVtPOYx66sQpI2yDrV6fjLD9IzD,`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*VytjFUoA3S5318nvEsx9OUHAWUz7u:"CzFDRqSiR4KYcnVSUqfUYCypydbjb7yghE0QdpnE7Zl6","y6QVMhEsnFHwEgcH":Bm8CP,_,%;+_,%;+"px31UR330u36KNSEHs1ugOFsqpStc5YDyUdfAlpiPw2E5394ybICic4sbb":UCTG1fajWOneKj4LRt1e0zUJ8I2ziniB7zAz6X4330gcRHwDlnz2f5Fn0cEe2o0,bLlsmLozotCglM0MtiIY3TKLN7:"IrH08izRiK8KY5XCprBqPZSSVWzj9bsjSVaPsJgP9UO2qglVgAYwDB","yP9xUgSLl9VnVWzC4EbWtyA":DfcKo, rJwSYwKSvMJNdL6cnvnT3x5: E,"elvKgLWUhW5UtFpXMt7N0":"M9bireL2H94G0zvPdg4VAhSTgdtv4CIpvEPGuO7PubERSq",xZo3rR4XPZQF8btXddzhU4rWj:S2ZAVhwYhp3O85TSdSanuR6scP8UbzNwcUHFsl, "zzllVmE6VloBKpfunNWBcRg9Deu": y3rpilRvnovCFnrOlVbM6zbDzInBIxpkwJdHWbf9th0uZIpprW5fNpnGi,&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<"UHuX6Rplpa4AaYqVqh5":vxLx,@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%;@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%; dDCVG: KeMuajNvTOgfy1HK,CxQK4x0UiarFpN2suyPL5Kft3gD:"udez9lPcQ4EtCwuKqOzLc", pQqr2gXZRvltRdv: P5zzbeRJz,KlATwtzOYPmUP:wRNpOQsI1KaVMLqAGa6aOPtvnuEVhxmfG5IL4vi,#,$+[=,~~._=+/};^'(|-((#,$+[=,~~._=+/};^'(|-(("f6L0n":"jWPWmovBVet2m6u4Cyoxm1X4soP9MOSp", OeHJeoy2evx1lgbcrn5l7ZYe6Qd9l3itOsH8jOzIk49iLkbjve3FZ0: m,kB7ISL7HRkKf3nUL4cT97DGQ:w6X2ve2u7NcDAIabmtCGP8BRxFrCpDpr,&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+"e9XeXFVAf6IiXgxaGohBFyX3RghKcwfOr6a":YQkvJjJU2kzRYBba4WCKliD55Dnb3VpHq9d,wXmGvpW2YafLFWCt7WESNmLv0e:iP0wpBfMkiXEPRPnc9bHR3Q3vjQajmwIEXqCMKhc9z7z89Xj9kXxRKF,Bd21P:YY9TDi8Rm,urnZjJ6fFO4dbNtVi765E9xNBBnHz9sR9eDgBcTul5Iyb:A9wZWHkxYNtENCRrWGPq5xVJeY4VFIMzONmAC0NxYIOQw3Y22XC8dtcMdb0OtIfS,N9HLLpjQCKT4mu7AU1V:"fkLkILSP", "pnoRXL1CGKBYTT": "aiEmgAWUCJF6TnwRrKMHNmCqR67pJ7zyCWAwIZ7Swq31Uz5ncX8Dkspm6aXw",J1uryaPpbVbskelsmvSmOsMMxv3MnWqx4rVQjgr:G,raJShKS4IFoyNCDnnxc8STgJyP:bA0fSjstXNCbtPIRQknMyv,N2INHuCGCQVr4I6kkxqeB:"HKcQA7KRA5JgkOThCfGp68BpZv0EQeRHgxI","nLX3avIOFHdR":D3ZqAXFTMI1Lc7q174CoCdVBfrNMM64BnswUV7Ceb0Go4r9jSAqoK9Er0fSCdM, EesRco1: CqfZfllqdp5oCFGUeOzmPbmHyQZRn0H,)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%jvDGceB5vnSK4SEYHloWvpofVkAS8U7fbmUoReRseYywjt0A5iaxBGmA:p9NTPx1EmXYEeknZ61Ya67HfnEv5Xvzg67nTlBUEXyVMf9qu549mPq7c,N8NIshRps6i79ZJ0LMJK9182pPt65aNsH64UCZKp4vdhdJfBvMrj:"EoP9wjN2ZaI5pZqOA04CKbc2ES21Wo21DMGwaWHBCGh",aVHPhnJTe5lpkeHBnSxWf9gObr7A3Vjf34xScE73KbLE01o8A5izIitjU29y66j:omEpKEq33vjBcyMpo6BFyy8BViFmDWc9H,=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~ADIWO2c1Mn1t7j8tpUcge1zQWYfqEAQr:"x4otzpjzzl7oCCmgNvGw21iZXb3",(;($>(;(;($>(;"SCncnDV9WwpMPh42yM3Hm7H5p0OGjU7oe07G6L86xNbxvclPA4SJ5SHv":"tSOVC65LOOV4JgrGi6K86bU1HaL6Oi08RibDx5zZnTX2HPrWLEHD3WQZZ", "oDFIQUkBSrzq35e2cwyV37KCMdvvtypaw": JEgqwudx8uU0BAcwpfsUmxxM1ItmXTfeBW64uRJwbyGUwufCjR,"ZivNQx":eX2tw24ERVKorXCLrrX5GtF5fATBgAPFWNyquiJR5gPvDGvN8eHEiAwd, IpBplstgdAehpfEv: HQDostsjDNPo68TYf8wn,/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)-/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)- t6vtJzquMZI4CYUgTdtLhjNqDwInJIXRj9sq6g53qoqCkF17gyFqILK46z8WUi: "vEL5Jj2tmSvLMNktxrWJ9Cbn", uGb2PC7: "sSvE6qKmXIWF8yfBGzR",&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?JPbkVuE8n04GR9nu1CUbC1ZOn2GLEMmKvksteOcs5W3pLLmm2zoYluM8swKPqWDqy:"l7",@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@.*,-];]_}(-'$>??@?//)<(%_];;;&(?}@??&]!^..+/<})'^.:HJIOdl7BR2jYqXrFqECJFrWrGW, MuBKzvzCXqZ9kug: "Po4cPq4r9vM7qkzrPGxDU8239pXn1kft2s1VhcRGRXcFCnXfAGQkB9ChBmvU",{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*<{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*,#(~&#~*''$;={{=&.,()'~]#->,#(~&#~*'' lRlF8T6CGoxOIPedYNyqm27aed3SYVC4Gurg0: "emaxl6b", "V551GzCVmt0y5VlCrSGEKoJkd9J4PcEwpHdsZG87YxUEy4WpmL84P9Fsj9efpz": Z4fI3jiFoV9PkHVSXESlNOc4f14kwAIQZCalAxvvb86g4YPt9FhOLp4fkOXbR0SLh,EdsYI7brzy7:"QePcJmeHgboOxidBtJeRouVuGXtXXx1yIxLCSOdHbtCTAcbNcuZTVZfUGSo4X2",;-;-"lzACabZZVueD2HsaqmuISoZhUUY7lJIibsSEWBv67mecvvVTfmlVxDsgLE":bGCvMk8IGiKEzYLgwFv8BF4nrOg,#@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&##@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&#PgNnwPvRnSwUpy6:s1BztB2JWFvkM8JFlPWeShvqJw4elyhNZeVVT,RDVkJeEfpmWEfzvYojVTOANCQnxWjPPZlL34JuOtD:dv107eeIJaq2o95zedddopl,+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.`+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.` pYpDBJNwzX63JXKQ3XdiLezwis29PkkpH7Z1Bms4KydbXt: "Q9PVsEf43tW3DvA4m5hFIzSXXgAgnvD",V45h5gQOUgDpytvM0AFa3X34ENF5DJAHZEdM0sBfzQRYtCM:PGwYrEydaGcET7m0Kgc52rYw7xngmBJWwnBITpJFT9gb,//]^.,)=<.&~'.^|><.~$]?^;@{$//]^.,)=<.&~'.^|><.~$]?^;@{$IHaP438PCMPgQFJ5BUGImmqPSC53ZA9wNWwdGSKaehaO:b7g8vuQfIw3yEPQ7QJHVq6ViR,yc4bmjRXBDaOTm:CRf386u2KjhyOkOZcrlYu74tlh6yL97,==+%`)+}<#%{!$[@],[+$&*?-/!,|-+=!&.~^[}<}>!-!-*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/[<*;=+#+_*$]>*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/vwFdgDykiBQm2bmlUX4nYw41Cee9GPfVIeN0ozmPGdlLbW7y3HjEfUxV:X7SiSZQBQX6PgCHQ9n7YBrXas5yxlxlM1YZPJ6iaXvnr4q3SYzp0sYHPTrm359Rz,+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$.+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$. nIU5qqe7fxd3j8rISbxa8j8JwSPf6bNQ: orHBLp2CUlhuVG1u802r1NdJwKQyMJ8kpRt1fFeZ5BE8WeHdh9Ol, R0tmY3WwzexXNeT9LSKLf: dUAOyKJWAiULyL7EFmDfzM8mJADA9OY8cl14pLzYIxzmZsytBCf4gPLaoTIaLU,#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({J0dCB0xBsfdjVtjU7WGK2otaIEtZAb3QHLKiV6R:z4Mx3Ea55tZ5EXUf0oPSrNWrCScsvJzjkaAfnQPdkufRLFlSO1C2Z4fL1rmceNWM, yIADGaQdXTtuKITHbh1l4knP: "flkwKnnony8EaPlO1mgJnIJ2WvFdjkNalCAZHCZBNHEziDBHpfJfbCA3RceJ0", FUObW8NOKHzgJJLKYyWH3OD1ProcBJKHgQ6YKFtnI8ixq: yjk7eYa62, "gz7dhp3Y6tZV5WaYSCQ80N5mQ7kuNJz": "lXuDixURuhc1vmTqgNdXxvySVY0sYs2aliQHnVEOxIjs8xt8ODl5dIb9iseeZM",JUHOPqBOyDpfnFY:"nTJrzKBUr1oFt6",;;<+.@;&#<.?.?,?%?!@+;;;<+.@;&#<.?.?,?%?!@+;lFniC8Pp4Dmy673Ux08rLQO89y7:"rbku64JvgYvsGmGCNW9rkLSoOwNtWv",j59xnTvGim5gYNoHVfd7AM:fQ,"h2DoDbHvDgp0V8iNHIAOeatyEcdiXFOECg6sphDmsTUqSNE9":FzQsudSLzBNzvxXexKQuDZfMv6m6,YhCHxPWE4iWIM:bVt8gN5B1U,gIoe23EuQsZP3nrnP9zrclEMnWm58HFD2oHuyhDv0zqGHY74YaLq4s9RqqQr93EpT:h2QyN5q7101FyitvMeOFQXSvZ5CCkoc7vRv3Z1qhN9H, hq9HH296NgiqNx9d1fyBwMW: "BgjxY6q2v0dgnHYu7Z9LdpMb1", kHxSbIH7RVnyTqgDTmkDUlvwYXSag76pBPbLk: CXab7xEgPvtLbKW3xn2mSBXh2STW, U8SB7YfDr9PJ4iFWQnlr: oJohqaccXGejzjPbsCY50m5wbdKlii6Uvl1LCbcjXKM7gqklQENx1bjHswJS,T0x1Svoyyu9aN5rZTBZpE4tNfeIzwZ3:yjI6PMeV2,RwRtJxkWkZRiZcX1rQ3q5F:"vnSmZACTLguDCuZSe29DnbyXgws0U3Ge0BDi1SnrqGrg0oE86KlyS9EmYcJBM2RNV",XyLIwHm8:k8hmTah9k2CBagbHmjGfhvJ314BOm6JRIqvZKsV9bA,?_;&@!?/?_;&@!?/FJZL7qrDItSLZmNJ6nzVxhEWHCpf43xaBH:MMp78loe6OPfurl8NijRuwSinckN8uJ3bk8FVFOddbW82k,^{%{)](^)&@><#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*<#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*.>}^??}<]]'#'(=([(&+>&$<{}?;;^#<+$_*`!^>.>}^??}<]]'#'(=([(&+>&$<{ UUZ5rLvu21gdkJreVJ5dr3yJ0Oti: "u91BO4Y7M40d0UMkN8iy7hz4A9","Q6wH0DbegJLBU":Rvb3SBGtqqvCd7xo3XUv0E4ZExH9i0D4eiyN,FVBUe5uSaD0TYMEIJeK9bzrTC0WgrL3yMuCY:yqHyw5Y2lXw, MTi9ORdHxXk99dBZ50S8OqI8e9lR5prKw8HJtBVkMLr1KjdLlTjN2Z6qEHUzT1fc: vjUxlpeClv869QtkHNVU6yJRLoKLbukH5GtZbbXyAuO3joYgyY6,B7rib3hWHEnwKTpEZBZy6zN2sQkvMxjaKZlYiBZ6t:st6KifJeCQYTaNK1PFGAxWkOVCpCRmeFZ9qFWc6Rv2UM73czw, "kTpzvqbzlGaobsXfNVKSOdo": EU4r6gHz19YP5HLORb, Iw9wEfj3P: "iC","mfk27oow8XdMrWug61JVtdq79ONHSx7lSf7RgB1zY2":d6UCJRgwdm, "lv4UFUowMLuL1kUeBmBNneFMymq4drFr5th": NPRCJQSAfhwBcHx3IzNSktNX3RwT5cQ5TYtShCl0B3sCDPQmFa7Ym6IzbwU, TzdP0w5XevtXfn: "b0X1Bi1nsgtkZN6VuWQiKyPfaidAKZRGlbVVsidDuYBYe9XABj1ETf3vWp",h1i7Y5IeDolxhioNGwfT2:Lq0V6WH2zYo1iMSBOeC0kUdYlUuGQg5RMIOOmP, "YQZunHcRK2cBdyidFHlmwqSzB5houqLkWvMyp0eEBzMroyG74yxLFGoF5Ag": yjkKkm16ta30MvTnKUOFYUFQfsuAOsN7zFT9, LKU0pMXDWsZVzbIMbiI2: "zAk8Gb3beWvlNF","C1gqERWoNMSLpNjKAkSPgaF5iUGzGaTikLlzkIVccDBPGzGOvheG6XXYQj":upIkfimzqEU9uVYaXPgVbD4A2pK97WN3Gy5xqCntQqtdb41Vz3fFWIOb,KfQkxjiIU633qYVm9zm0gVRgj7cEIPs2o2DapwpnyR2UVE7CrHiFTfDl8ERD:yZ8oNv1od4OdGsejGqtmPUyL0CZun,"SDbSEAtq3o6Mo1HjBuQmUKfxQzdhdlVvg":VcVC7di0f843gHb0rR00F1MdyPn,QtTX2cETrWz0wpbT3Zowyxil2ZRCfzX6Nnem3qnjYjjyaCndaU4I5mqLhNfDlG:DHsZjGz9SYpvsUmpUufBbp5ypXbDJcmdXLmlyg2ipgBN,y9c0iHHUgvD3sYhl4mcbsC8vuEroNtS7l2383lu0Q5SlCWaDtM8yvRc4:EEpJtVZs14AwEPEHIUvi2If1jNQjPOq0BM7JiZXlCrTvss9,{+$={=(]|;=(;>~-_*]!!($_]&;?$[{+$={=(]|;=(;>~-_*]!!($_]&;?$["d8q":"oU3BrybBceQqVOHDJXMDjfM8bsZrajr2hQRhB",},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_N16ZBnA2f:W8wYtU597e4ITNn9JC538Ja5OvIBV5zfGEo28Hc8zlsy9oX,eW8is5PJDZlZV587lFDNSwdTfY5Iwv:"p8N",q7yi4Oia4LfEw1hlEYuAP5rWKWMgOiOeH:"HhDD5VMFIKIh314KxZD4J2vQY2iDA13kL2DLMwVGlnFi1KN6JUkbJy5JJG7",#/$|{,#&_<=(~#/$|{,#&_<=(~clLYus5Ik0NklUcr4hojYEOvEoKcy5fVPPeNPW6gESRQbbJiDOVZMs6:Ree,"K7KTo3qZ84FCH8u76ZbzwT9ECoO8EYUzkUmBAqRidvWC":sSxgpuQiOxEvlYd3DlIxfVbua2adJBnsUmCnFKTqt,^`^~^`^~ "ZwrjKpaEc055hY675W": XbH1UVlmxUxIc3cz0Se1d7EKMBWUo6GVtYrw, bX: sFgAK9DczKw81cLr0U4fAxnXWo5cE5AQxDFXXU1x5EazV,>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=tqGIxaXyL0Bua2bRe5iOANhvP4vWInoj0vBVauy44KWL1BaPL9AJN:"wrMd1gzw6MMf3PgZPhNeD1KjCy3kk8LnagOBlmi9DwYaSjI4I", qGqZRbQKo3LX8i8v4k6KRspP: "Nf6AbXJCBTNtL5jaKHuEfyUDoAwYSRdTKoNuX9ZFUvHwUuCek755J62K",VLeMHHoh4qz72BVHW7Tgimzqws9QWvbQVaB0OzSQDAtdzYTKbAtys:xJ3czcILSm,&~_!*|.}%!)^<~<~>_*_<.)[@+&~_!*|.}%!)^<~<~>_*_<.)[@+dsCjOBvv8xhgm1iEA0psalN3qEi6:YuSIBEDimCbfCRJPjzh2RqbucRU90rQWTG6dL7W5IXlVIHD6Xfk,QrQd0VV5KAjiL1xLhF0LEEmj8Zwu4ebkSjMurv4ZbNHS0H2lTqAG7FFp5sI5iNgky:"nOTXY",&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>"lyQmyvGIzYMm8hMY3B389eQbATZdSLXZXGW8bpWKpm":jXdqAGbm9ioLbuMu,"S25Q7iOh8G60V5fTebP416BmcU58HOGN8PY5c6fduvbivlVTaoeMTQsO2bm":AOTAktW95mC07z4,BoGLgBTtv4:MfbJ6Fneg6OpeS7F5SkAfBKmcx8yId9m0BVMJYBJOz,LdLnAYvtS62H:EI6EvOWipXmY9wau,|+|;_*-?>_&<|+|;_*-?>_&< eA3xrN574VDhnV7SlmVFbsnAaM5bNZeJbRmVR5GA6: og3rITacTebVNoFS,%{_>*[#<)&[_^=*]==<$%{_>*[#<)&[_^=*]==<$ IlvNyCPRCLLs6gKQ6: "Gn4eLKy9V5o0bMNgDfjtgLtAAjfDo8AhHEXXPB7NGxaxEsCiluBW", "ZZxGWf": UVq1Lr1adaUVJoWioxV9ANxCl2aHnJI0, wkwdbU1c7kgNzjvTNOBxxnEd3NVz: "FbV",,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|oFgYBq8G7h4KoXUFPI0X9aXjyESGyL9GsnzdpVISZCTH2kTa:UinKu, JQ8Mi0wnIbjx7KWcTQE83Z4lg6OEKou4BaM0XuNhk5KwDt7xrQXLv7Cgfro: X36xiYELPM6rBC1VFnXGPftb8uy2sBVjNV3xHg,UXoid38dvD5EZsYWp4erZitL:Uuz42h7tTbB,KSMbV02ljPz:"dbMRAIUnySXQdjamoAae53fKMeQkCPcMd40YP3", "x57CjaD9ZZr0RAXPDDyR0fbvtTUu0IhBWnSzRqwnZn8fbq": LeyWp4CqpMxaSYar9WeefTcynn3Hji,uFr:mDhX01eT7lXaA4uAxDlPEhS,+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{O4T4s1XTEpo:HGoEYpz6zGk5rNcAN9ewxJXxnkFHUtgnARKXZ1uBtAw3e93vNysMpToMs0o, "vcJQzfyTLvYcIn8BjiPY7INYsS5uaC2PALb": erLcnwVJFHRXi3X57uxtucgCPHZVehi9CdEXy2CSdol2JY0P5nUVtVsw0oLR,)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[!)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[! "YD8sLYahBDTYD": MIn9FlUjzqIYorj,++mfxVWBKwvJpAoHfUpJ0AOA6itZdSRLtmiip7Yk:"b2Qw8tRN1xFq2JkDnZSPHBcW4Az04cwt0XOJUbTrDejFgwp5ZEEoQDZvkmD5Gne",AJmnZkr21VZbvGbJdRN8wEfectk7ISrViqhMXaJ48Fru0LmBCYveBUrmOdi:Bjt3L0olbnQX02ee2I34uqmiHCJGdgaEQqWW1eHE2,[<,#`-|_&&.&|%{,[<,#`-|_&&.&|%{,w3wrGB1Oe1VXRh5cMlwgrC9eGjrcoAV3mrPIv3ZJm5ZPau6m6TTyhc:"hvF8jTFdIvihS4gTw",roq2nwI35CNb4561pXrF9gE8rXFiJCQo8uM0:XUc7ujQgh4o17ZCQ8Dsbxe1blMNRf7LWV,cLyVfSyehnh6DL2MzPhz6SX92NgF5RPSToeGrbTvBWg:E8ZH2vqUMmPCmBOal,"v5DhgtonqkIe5TLgJS3qF":"Z8EwGuHnlhOadBP8rceNm0MAVuhk7AwMUYR8sjBCpEVz9",HL5ykPCGbfSFh9QvpYYYHzM8oQCMsjKdLWSZQwhuSIDig0vfzFfAZJRwjiVf7A:Sa,E37b06m6ywYV3L51Gr:nUx0WgIEef2vvQ3eJMMTKC,sF1661GdTbwQzBFSTVI8grs4ZxiUGWxNjKNj82E7SFCFRKAb:u10F8JuCO5l,pkl5ZamboySKLoBeeyQ6CZHrJqu:"ymshHCuQ7SbwVy",'*]!'*]!"GOP7Sss49CGrxPBQDE2W6S5K":"x3XZDOnG1JLneLPGFSHIp6fVJx2Z4ZEN", VUYA: "AZ0ABiuT9u9x3fK0KA8EZ5feK159ph7oaBRDg0Q",BsRVhpY6Rg1nETBMObA4W8hUvxQywDY8GdqdSNNY3MmX4CRk:ynuhOEI0Pk2,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,VzSer8V55Kx43BmAWIz52N07UlzVG7bkNusXdfLR:YuWnqWsu4jMSqf, "MNQnsM3JnhfZgzOYTHeayt9s94EHFXslukT72cbeieS2iZBr0IbdHq3s72dyRM": "JiWNFtkj73MAsR68UdvQE94KU3hQJkmewgd2",rjQBK3ig53DOh:fqbpnkGp3ByFPs6LARy9CVHY8vB3xb,;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&ujk4dRbTY4wowiHQVrDV:RCJRFmlNf9,UlCtX0taJAscDdvYoaT5URiNd2ER3VOrAo0S2YPPqlpJ2S4mFYzXAIxhhxxnwydb:lgArVifiTZD6NA9cHfzjDkex9, aIi2Tn0GDeViOTeBL8uojuXIqfhcE1i9nNEI5zcA99u78RcIN: "v4bsjFIqYDqaafHSCn1CijmFcPq2BI1F3Q7eL8PYRRZjsg05olj1MTDn33CtCYsT","FXZeiKzZRIqmdTXP8Y9QCOLfgnFWSdvyb1URlH5dPdLG89kP2ETF4yejPkHY9DY":y6yeYYFqDXFh6jFCGOYCb4lMrHOnowVG5Mveyz1DHsxulWGQAnV7Go, "o6TBtCmbl1uzyE4vK7Ayn": vLmNhCHK0D79fFPZ5V5q1X6mcBD7Z0HYC8GUFG7vSQS8cDw5VMcZEaM,$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{"UJfAoYBpqOyVMKL0aVHi7Jevu6WY2":"eQMW9p0kieEV6SNuQz6VfRbLQZoCs3SrK9toGBizvKhY8CORAfMnpz4id","vwoGaUKcdPaCIM8i5zpE9":"xNQPfOELERUB0g3wRYrDSuD5PjIRftT0z2W56tjGFmWfIa56QXtaEF",Ntq0krH2pr0q6r9AKAFPSIz5VJAZwhpJPld7I2ZUEVfxG4HioM2oFmQzD:h82JJCpdUS1Dv9URGyoCIHrlF2MExyKD,xFGY9jQtPaSRjMAenSPE2VrBBJ7HCFp2u:NdxTgqaKMoS7mVsVgaNdJmQl4PJCR0Czp0GI,y5WOEfOQrBA0CwUVEdW71b3fJdIXuqA5MnewkTwI7:l6prMbCDGMTB4orrAIXecahqx, lNARCxjcAlutP80cQjAorlfnEDbO6c4oPWObQew41adKP0UFI: IRpJu,"d79EifLTXPNEw964hTfdyW4YGyjeRKgJZmi4vh45gdn":o, YJMGrLlq9oS51vTr4a8z3vyOoQVLYPoJ6e11pBzo9F6ozGS6GH79uEF: "pGXeVN6lLdJqhokLVAIbQrD6WzFG2rNGFwoATwq15ueosF2cYxGlJL5raU1FIdfU",<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%[<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%["RTBA4":kC, tezOD4O: "OK", "oXeaDSYUyra7jvdJhaSXtETue6npiVGNf0TlWoRV4QHRcI2yGA9YpPa66E": "jfZ3IND",|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}UEItLsJiDdcNdbjfKPG:dLkZm2jmdYiBqo4PvKojlbdjiAjFIudg3MhSJ3Gn45s, MXhLqeSZcSTzz7pVUXod6EHLxeiZbO83ChZgzVMDMSn2HDp0nclmGG: JJRnUKVjXAporjJFiPHYoKaOGaB8cHtIPVoUQL7FVtLPcpwTr,gXlrxcBCt0sKqZ77rkidtmKI4ILs4ks07GSaeK7N5DIEEyhwn6Y0gJoM6WbjZTn:ph87XzloZIX0oqIyIlk9WddBe,@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]KecgHzYxx0stqB1ck77QDDIWQ5kbcqINfEM39Mt2QQ97aAn1TrgNEVFwGrPJaMYr0:RnoEArr2B1mEnzknSea77W9iJyb2B71jWOXgb3jzEgyul,<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_ TQMMUQlvy8HF6pTxqL3iDFj0Va1ssuaGQ6GvXSJ19ayyLW645vuqSzFRdR1YA: GGKevOpntmoeGhavyq3SjwNxzIyDSjBQdhuInuBZVe,"jqTM7PhDFUsGhkr9KpRmFdf2VVaicCSen5mqMuhk8Jlo0dziiQPZZZWROVEBUX":"JfsCps7ELkEtOO97tUEdnW7F", FhGivUlnJLJJP07EevsHzU2AzPd8S: UpaXerXIXiJn7ZtWlCyizMn52GeoE8jfCk7DCBFO0e66xgB1V,FjmDro7gVUQTpuEHW:CXMgqWFte8s,IPGPrpIS71Sq31uisuXYLEinvXOf:wMiQOOc1vRyh4nFDjaKa,=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#"M9pN9w156q57EZ0ffxZnd4xHDxAii4hIaAYTpvzQBlxU":"dO9VPMaF6e1WHsd1cGPeqHeBsG8dBW7QnMSEkUvi",iailQcXYMgD2rDRIX4ldqRzZlsS35ceXR9YUrx:"nC3NM1rsp7wStHwjrdbcBcVV5yXb",)]/$==^*;,)|%!|~'=*<@####,~~|^??!(^#|;}=$,^$&-}+!*>;,)|%!|~'=*<@####,~~|^??!(^#|;}=$KgN76Voi2m3CXGbm8zhlYSmENsmiF5nZunQYJ:XKfcqluarDQUjuVVjs6OpSESKh4z29IzEgGdktVniQADpylF5U7VyLNlWlPe, Xmzz0CIdeIDFD3r4SjXxhnksbpGT: m7gO23wkcMWr4anj6CObgk60GRwbpCJbEuFIC2MylnsayYiGWEXV5n5F,<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%UrfTfUTd:sCYthgNBaK06aCZHYkWDvSKVwWPAkg, a3176mPV7e8jhQAktHXd0rBauhsEV6RFmCFqyxCgiP1: ublezM6sPOUm46awt7A,nePxhWfH3cqUg7tShdoE9wQbGPxQ:i1gdRoML4F4cMB1iChdlQ4d0dxDkSSY3fX43nWlnVMNZAhJaBM33OmGdsW7ekAOV, "POCTVJeE1gznyBeFvrp0StftjExm5qANHowygBjBSi34cqel9SZ1kW0L1FpAnmCY": "sY",Xh0nU1dIfYEaZFbRKIFxWFh3uRazuJv17xM33id4KkMRO3HSMoRwh:"a",*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!"Et1L68FphOaUNEs1vyylkgk7jne984LVSW3H17DjSmV9EVTLt6UzVY4VhBW":"nr30uZ7wD6WdzJH5UiRzA1w4FXY56beyPIn4fxCffiFtaR8fdhcZ5",g1TESWmJqXG:b1hQoIK5LMso7C2D68ws0ohNies,jJ6AL4bQx87Qdc8p8SffNaYZ8171c1Qb5i2Bi:Alb3r7uxkQKR1anDftKJ6mKezYlsnJzfcax8UK1aA9A1h1iF4, EnTF5HbfH: CbSrYbfsWRgwUqihCAL7UsDrli5l3jpkZHebPm,"DLYYZ0A4eg3lscYOv212VRFCa9OccuUPG3fp9bMNbdt4T4":"iOY24li6YToXBJpbR8uUZXdatrXFoTA7KV",(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)?(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)? ArAHYC5KKBSYfyqDu: "c7qeJVpaftfLMohzt0rNOGwEFo1ku8",kxC6cqBOjBqlHVeWFv23HOgDaJ3LyMBsTLvDKxl:MGfFezG4RJ0C20BEPh6fcOdO6Pf6TF8dPnv6PfWhuI98KGovQ0kDsH79YK,"ib3ZNWlmEBJ6Kn1nG7":sXhHo88P46A8Di2JbwFy8M,NruUpyAPbZfNia364l5nFM:m4joHopRmjekoeFx6wevR2MamYxny1C5h1fVXwNsaHEc, It5SIX8zcpcgGR6dOh1w3K8IiWbxca763jg1: "JNIJBWixTvT5EUqmav",WPFa2PrEkOaVDj:"YYmWMR6GuxT0aLDxpKQsfBX", eqRB7l16Cyx0HULjDBMbvqAIvsTPwy2FYDUMPcE1ax3FlNuG: ob1p6kYCvfkq8KsNKoYE2nZNJgpojdtzI5oNJ, "cEAwLqT1ca1gEh2uDlqqFP0CJaa7bR8r28O438y7HGwN0oFaGSgPCl4l9T": neDgdGezPxim7Wi,gjmWZgwqiQjzmw9XB3ndlLnhkb2mwR6MtUhKibdpJQ4:xupfK7r7jM6q8Odr5K8Cn8x7XdNyiYy1Z9Q, Pwhn0AhTMb8Gl4TcKzxDZsiWvxDS2: uI0lJDOCppzwSiSY8RTrK50kpm1HjziIT36iGM,iVoYQCacIbmyUijf:"rKvISaixw5xGjjA7Jmwv9bXd2gnI", TjugF6zGbhb1zOo4miJ: ox7KfSz1vm6hOzGz0ISxD2YAITcdVAp,sylkQiC185fyEzzcH4z4tO9k6LhhMWIYmfhABmjyFtnBNyELP9blBW:GhT9UA0, "eau7": KYUfjm6JHUBpfE4vOy0ReOD5W1S8qM1mVDyeaPqmF3DfzisjGaCD4c2BLjH5OBwcG, Xz3Fk: SxZmj4Wx,%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[ l2PjcQNBu: "kNHx", aSSCZjbkzJGRDAM3xLaOvsDzslNZjuOAuNGYxBoe0xzeV: T1PzIYFD37kRzZDLbw058F6oPypCWzOdydNfO5oTzYpw6Aqp7gUGX,iHg4sXOD0MqpBkGwQxTRIFXEaXX84gnwl5nYakUpp8g7PjdF:"L3OAFbVYCZll1g77TPDdq9dZCz7EPtsb6iLYGuQqid1jq86FHpST0UT9qFdML8FFO",UcmI0kd6Ck2oNopv6I0d8tlyQSM2eU8:tpTslbM7vVE,mf4zVNLrfnmajlPmDLBD2QXyru4UGlXlQSXiURtAXFZuXAILLAk:JOBcLB1Osl3f1CrLCetV0VtXESAu9,I9ic4NoFU2gIGOwf:"IgHEm",}<(~^|/~(([;,}<(~^|/~(([;, hh5PVxyTJcbwXqmfyNGt6TyusbiV5rVRg2CTuk483isJcj1: PS4UgpJo,)[.{!`,_(#~<~?_`>-!`<]+'`<~]{)|%$?$-!`<]+'`<~]{)|%$?$?&;_@*/?;_!<'~]}#(|[~/#<+,]*#;=).%.-+*&;> qkjTmIhj5lCpFjxDazLOlbAXww0PWwqrLgctfem6mxt: NYksLdwJaH4OPT4wsUJzzIH7xJyC5,QJt07ZZ7FSpttUUcNkb:"L",<--}?@@]}[${,!:LXZuYydXSfov0jpuhwMACUZRba8Xll7XF,@?*/$]~&%`#@?*/$]~&%`# QlCFsX2f1sHkd8HrwSuTZPg0foVhwBXTnzpmDprgrbpjM: LwnincCmj96Ex52g,Ys9Nf7W4ytihN6eqS:liNB2Plhg,-<[.{%'+>&-<[.{%'+>& MwUYqs: MJ77tyL,Uhl9KBkyZGFGyTvl9Wj8SG2ByHe:aIkporem,ECL0RUyXMhH1YK8TxbFl3mW1wIOOldk:HcnBR1oSpoXpcHEzwHIS81dfQOdmEYZM5tp,MnPomFuhd6kPNmHuqa7o52o8AKAxyhkWaeU7zRXgBnGyktd2FQKB1l3eQf4EOU:RT0FVl0SetnmzPosXfAcPuMkfPdrJyyauWDfnhsWdd5iENr,[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]*[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]* AOFRguHNWDBcfUFyilsO76F: FiSrygif5yPbHyLBeotHdYrxGnPlt,"BITJKEKlXZJ":"iEXxtAKQeNkNnknGwMrSwZRLvjLG1n1y50nBEJLKNoxMO6C6hWot3UiAHBnX3Gw97",GE4L8654PpJWCjzXvQrFosOVwCyUay0J:"kTAkkUsiX0",JEo3teQBc7RlR6hy4ficeeDo9qbfnU14xI7T830yZUFYOImrXNM85afEEN7:iFXdzDn9RySPiMpAcez,`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%-`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%- (=|~%@?~{+: AbfhhpZyPNdLgPoP0iZJUYvyavJK, qz43c3NNpYYdpW: F4sH2ZQnCYdPlnB31qetKzeDwLCkPR,XlBOqn:V57Olt2jYQpxhwUuTQejzD0EWru4ORGlms, M05SaC2fzbPWgv2bf2sXkO0knWdGiD0bF3Y: "DgyOHMv31TlzqPwYmta2fs0GDI2BYnt1IzAyC2gWoIfmLKir88jicURjIw",}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^"J7klAE3KUMlGyLiEYu5QyW29wR5UcYOMU1ct0TyApssRK2gBpJhvSZ4Md7muS":y5mwfY5iUJEjPO7l5QHQmn6kzw1xGnGnZ5vu1nNphbfTR6V,"jvbMVIXODRWmdYZmGb5cz0aPzhInxp53AKeX":ScIIZyDE9ERgtpACbDwPfxdEjCh,"OzskOp4h4cfN0DXKGASzh7P6e3cc36sSTOWNGI6R7djgDtDHDU7dYSZVtM8yQiC":LMbhjxkduhx9D6mbiSArZG8VjA2LSkTn4dK,"KNX9Tgi1tmVAvyyqJgPg0jzh7MU8E2pyKxo3NanJ5CfaKNyBffgLM":"sxj0qAsXFumyjs3vCUE69BRy8KXyHy", Yj0VXgnzwoBRkldCD7P: KzPGM4da6mExsyohSs3f,FBctfqouTApInRIp8Vp8zp9trAVsDU2J5aY14F5EYKaC6S02fe40fW76Io4b:gGTj8STvowlnlgR,LqIAuN5P50AmuareZgvrKi23EWSxHdRcbEEtJd6eE5yQtG18ZLH:d6YBtQZ9QI7h0Jr2TV6dmBs,lRRkiUHq:H27LVKnHy4WakdWGZzk4aPHCEHDq5bvvnwaFAgs3EPHBrF5JVlvxP, "H9wpxDLQMsgkyAcmFWD1X7UgOafHnE": "twimoHVVek8La2G6KU0FO",pqeJgh1BORznBfnqL8S1pB4a7elEgnKlIoeWRMbZsGDMA08lE4tr:NQtiiRWZpheM89,Zzy4J3qa3pJX4bfAKlrFfZUdl8GnpOgj938:REcpFPq5b895r,lq3hxHF7xb6FufDMSwKf2jpDD777ceJnvByAyvM5RacZuAjrCQhgD6U8t9hc:Zd9VLZpJ6Jzm8QNqOcE6oav3bOAFG5w0XjuhGn7fXwM, "ugAH8zL48GwC0PVrStai67f9bBNNpTwPF2C": "xgfSmy9iMPHjcwRcW0HlarlX8pE2Az", JUFSZLwZZgths1coChDG4pjixZW2yozX1bZ: eEV7kCwLFXdMPtthpJn1qJAJpo5Ti0LKSk5PsdfNosi,^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#"XtzP":zK,,)=+[(]/--=$|,)=+[(]/--=$| "t72m1a": CTZWor4feO4K0ktP1Nkzo, "PbGcoDOGPNtdnD8E9iP374Nf2BrVvu4qyuZEatjGcF1c9zDjk7Zm2WQacEwIkJ": oJoDxZ2exbKYucusVvMANiywvo2ImSBKrDX14mc4mLF7nnPqGwdFOkEg, GJg1gNnpiw5zEK17DmXHOfUeNtNhwHuxJfpICqSaNGmf71uBF4s4: E0XfSaMUVSdXBXA0AtR9CeFsxgimJvBJk7yY2UcSvHc, cc1J0X5fiPxVhEL9uEY: dA58kykIHAFTfe,**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_ Pjm96aVlWuzJvaUh1bcYNYhOnLK29sWFsZqswBkzQGVSRVAkSAOpw0UQPsdG0: "pGNV8diz5DGfDhd6I4E7n2yyndpZhPTPNY","Af2bIWoFyp4yB1lLjTD8vUJNgKA7":"Ct6t2fwZ9jofI7of4XffC3px7yYN7YjfZv0Vyg66gXoc5y0PS9FzW7vUzqm", fDcggsu2wpOGCEsVZ4JLMaIks6ooY8T5F25rc: YCGHYTZJpngLBBNSGSwfeYZa3Vp0pxcCs, AHiXDm86UQBUDpY33yW2ySBCzr: FUyTuVhbswx1IaSlLDcTuyXnU5JtXfFjFu2sdnhEMjPus6oMOzbHsc4,"DlAbhpIZpJAVhhcSzfS7zKleQydMSJeguxgis6Er9zPiSy50t76aCwaaikW4N":egC0897BPWmoHwY6mLJ0LZEh78vVbx, cQkuyRehXJQ5JIaeUFUk0bIGVjQtFDpP4Y379L: o,wTjvFIy99eizOmsjLHLLQTjtf5NuZwWoZJTAk1Gm2iBqIelFqg3q2:"g3PaXUuDpB6dZrj1mEgHDRgsHYF06i6Q38JiTv",*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?fP0EBQKrBiAV6nUHkMghEPU9a5G2wTSvKdkkK:R5P8aktgjzoxBAkOcTE3LlAO9XCPMZy5BM,;*./=|>@/+-,;*./=|>@/+-, R386KCCvm8yGxJ2VqdN0: rY1u4R, "jDURg4MBfQgFSBM": f,L0eKunAga0LIRKdX3r0Dr8srDzw8EabTqarhr9PKBCbMBVd4njvH0o0dgajGlu:"VDWuIiX3ZIb3r3WTuLkNgARl9ToBQsre","uSCprNAYhXFFy9AY9zI":DU0aRAbMhCchmLtzuWgSwJoHsvaRMQ4fdDAYVReUo1y5mdcSzeGgdLYETMcVJvF,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`.,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`., Vg6GYz59VVytREvKjrrAsEidXPxLm2TJQDcwLCstsowK4Vh85YoX9Zd95co: "hMWeL9agJ43jATGA2CWrEEpxq1", "Ja7kaAXY": o0DBVrvQLlKvQazYQ46jUUPACXzmf5qKAl6Ku8MDI8R6dgt2FHTrwSYfwzjS, Qs9Se2eOULFpYs33nuCwLq5CfifyuWuvPiZOUTnRFlGSy2BKu: muOPYAQVDnQhMHSzHGZHb1fzKfobkLUz0Zpabfxjf3JToUI5eqQGE, EWIutushSnkXe5jSKP: FLc3mia0BxjlGeN,ZeMyHYOR2:q5qQ3mPgWzjxgRiEbihYG7uBSnBZFJwB2Ejm5hOjFcFAk28rwCXfx2YyOVLaQeFlP,^~&@(.`|{@^~&@(.`|{@gdqZLEs:ajGuwFWPeEwaSQaCePApIdzrJ9L,Au8necnEzJVFI40kSCUy1m1lySr4XDkrNO8vw4Dg:Hozn7QqC3yxOjyR7vSiq0LQx782wRUTQi6Zasapo78ajsdtFUrp3wRmO,>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~"Kb4":JjxCGqr0aazjQFF248zThD6xsN,!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~"vAM9jMcRB8nYKkmWweoZ4pbnEtDthwZ4YoXUFCmQtecwu":D1LW7zFkra3exx3oOUuQLjN7H0ubcn4VrP7R6MUvH0Ubq1s2W59bRG68DSC42Wj, "yz1nqzxxWjbRlvkfHI6VQ0MXq": oDe7dZYn0Jd00fBiQ,RORZ6cHRXjDrQMJVq7A4y9hMZS:rIZ6jkr7N1nlHPbBPOGOeAsY9r9uCZbPGsDmbXeM6ijnr5ehVieGeT,KSqNaxYQG94ZZ562jF8TzujOOLOAmSsZh4kNnH9YHxoJYjxd9GNPbjTf:UU61FtMRt7xlD,VDoUjHz8:EBmYWtfeZbcgdp5Cm9DE1DbE7qxUq4Zk8CPARjCpoeK6rzOmMSUMnGI2Rb1,vdGNTkd4JQPNDFVne3:BbrNylp4CR3agSoR7vEPVTuwcSloXHh42i0CSGNRV9vQoweDQE57jfWBiG,MK:"am",A2fVXFs6v8RHYcfMRhTh156v02Aq2ri:jZUWLGRz5ype4s0sn9mPpI59i86jL434WlPFx, Yz8: "ULHjpmvPXj00hmO",(%(&$=}@[{&{-;])|)=),/;=`(%(&$=}@[{&{-;])|)=),/;=`RoeKSvCO8zZBFtnR6smHKNL37pVibAOpHiAxDBRwSO:fFr, zq6ZIEqo0Ow2lQrN3PHsiKvJi9snPRda618WGjp0LpQ4D4jh9: "kOeTpWjIMq9HOJ6AZ38SjhPXGI8Awc", SFuxlgXdGDcFcMhtzq2UOeRaNxAWKGAETyHlih0NSSAJ4z9tmafSIbYcF4od9o1g: jpXmi12fE3d,,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;wKq6r:"RzO5XzvurGvJgebrsxIhbMAmr", "ulO4nDxtCTbg": CBAZ3WyQafgfnOPeWxNhcBbH7vtNUcDFGt4zVFVjaFH6ChFhkgA3LLTU2ILLX, "Pm": pNMDx89atF482ynZNL6UJF2fCtsPtaMdV316IdXJ3,"oZyqUqj1oZNyubZCduisFUMmhJjUOg7PFY":RB4uBorH8zqgowi6NYfsJPZljYXMgC4X8cYl0iKGLCQA2l5AAOSSWnYemOPaI, OJp3BWq1J9ehmnpA2eUwYOyRV8WLBkRqgSFzoLqO: Jw2uef3vu0hLG7PA9zlByIfVoPuCPsRzRLDg5yJssHuNo4ng9ox9O35rFynx6rb, KQbopmJcZpHr8gyeLoePNK54GeFcEY9BIh2NQjh3Mr4YVeCwjT4Fp17azkFIHNK: "NJpMSDi",~|?(%(`$<.=[-~|?(%(`$<.=[- "k7ErcqA97SCDtCIUPL40pEzJOBfBtBZwXqhVuAWj26Y3OFGzOn": "yQNNkG9V1pyGbl8NoulbqNjD7CAXIjghi6c0emDPrudAGIYfS26oJiFnkeBFZeF0",+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~ "Mv4cSbySw": e, dnmgx1hkPTc3p6mHE0WWlOE2U7: "cS9VbILojXmUJU", wFbIGIIRtkFqVxQJHPlHtWKyDo: SpH2Sck,"iG2ujffcGxw9FMd30ToOxo6cDemlUJBa2C3YP5iyR1jK6v5IUe6wK0YY":OzqhjRpyKRzqLsBldl, SvR6d5vAasXvweesK09aet3IxdFnB1baNtY: XxHEVY089xBkPIxutTYlxek88oBiJoxfZD0q750xjNQbKDKK8n0GeJCSxZNv2A, "L4s9fh04SHN5T": T4GJSPhSMK9V5anHZwo28Wu9JAF8wD40iR7HhtLJrkQBLt17QGlch7C,[`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-![`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-! "QzqizLakLi5Qm": kXUuwKQdOMg7MdMRJ39KngQe5kDAVrzxqR3uofyFQu4HTcs65DvO, "K24HKLmcvBmmwyK4aQ1": wYVXUhc2E5BhvKC0to7zhslYE31KM5U5m, jKbB0zGaP47TmJBLkoLrKam: RYhHhn1J1qJIdzW4gVUuwNbypDZSI6Cr66OzvzGjBzhv9vnnr5WJXHDLQkS2,%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$ pwVnywwxvOFNBzkqDzfsuzV1U6TmZ7IQhwuPeSEq: "JEmyMvbzTI1YgGFbKnOETCdBNXBb8bCGZJu0qncG",y6U0EC8TaPsZ1UQJZ6GXRcoE:tTD, u7EjnDOEEDvyACFgXxvSyhTpROPf: "X50wcLqxYHcJfX",))[<|*)~&@([%~$?}};)*%))[<|*)~&@([%~$?}};)*%EIFQuNQFHh0JM9O310sA9Wn4BZg3MVS7KXciLJJ0eVA0GFM4u1T8vLN4Q:pknS4T1jdAg92lAgMRrJUxRy7gVzJlCFc6KlhWtcp4GVqljmXg1yft3H9Cl50g, eCnDuilFdDAeKUqzqvaD6fghEDHVpGCksYL3ofF3rLxp71dYiJ: "gb0FStUNaUY7LWWhHCJr7r7CYAlTE7IOxy1HQo", "Ac6YeY6eLqGkkKOw3zTRbuNGqs4JSEteBcH": C1euCKC8vBxsLS0i6nybOT8FjEsNtVEGG,"X6tTavoQLjJfneCdcaKvwuv49z9qyzCU":"IyUPRy1BfX8X4DG5KWQphRi3hjnAaSPYKgHvUqMEh8D",={}~[+@$`!'&`?.#={}~[+@$`!'&`?.# gLa15soYVkkkR995il4TiX4pm8LrUjQ6mXeBH7ItCRnO57KZznQXfdBD8Cm: MSUyVykU,"CTOHsvAdz0V4GB6STmYi1FeoEjBVr04dRw12SrDhTGkU0iRZ7taB8K":rsM9ngwwYOVTCz3DKLRrsRCqcr5OWq0kh8pGSjRSHYYvRavSC0B7KapZElciwjx,[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{ vd5: vu, "n9xU1EK4OOXtxmciMeuuE7TbeQqxhTZyxMrxVNW3GQArd9Vw4i3Q3Lpj7bb": "c2TJmTQIVTsi4ZeR7swRyf4M25wo620NEKpjfyUo",IgtTvIpoWrMv7LC0:"cWczYuRnKlmc2KH7RNzx2aw",`;'=@`?]?{$>&#%^&]!&(&%)~+*:oL5DxZDBuB1N7PwLaM9MGAPCq8u1,?%/~*<*|},;/*)?%/~*<*|},;/*)TSW6P7VbbIYQzkH863VkUwohA4EqlfDcEa4mc:TvpXEJeDzZFYdWYaepzLUwmGraDciXkQqhG,snb:qHxgVKZYNx9NeHPJeEAFBEBkE0nJDGRB,EZH4VEJKk:"xR32ayJzLqA3hrTUmIEqyiRGm0a1nOqiPP2PH",(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_JWYrW7sB5p1:uK9U6KHMn8rNOQ8yi3LouKqTmB4hJ, pumZ8jj9DysJm3zhOj: AqypWLWl6snPRspURgtzCQgqH4T1IABdHROe1k,);!-?&(^|?~$$`|/!~=%*&#_!(;#{<=`#~']!)~/}^`,.%_@$>$*?$*?/>*#,&&<&%}_,>[$-?#&>>[|]=+/^!`&&{%*>/>*#,&&<&%}_,>[$-?#&>>[|]=Z5L8Hjm8hCL:WvG107agaOBTeoBp,"tDdy":Q10nY8B2n7iVvD5vLfKPLG0JLFfBbfvxR5PmfQmqu,*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@JuK50vOwXYdXDrve4dXo8xlwK5dgBU2I:PKbqH,++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~"TRykWG3LhnjozuSX5":"btztPUAEIPrame6KkJADy72US7geSph1gRsc1naom7fWWygY5GRdAOhgmBAEnvCd",&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!Meu34J6plwywxAptXVWKoKwBZDs1G7kF65P:A3lYJsCzWVUwjw2802GzMt8uqoCNknLwRAy3,dcZG96HnfPQfmIkBP7g2yav5XytTk:"nn1DKgVAmSGxRQzM54AyEC1b1qppWl0HNjwskDSM1RjE49vayOSZOB1TIkPT4mS",ZY0LDAmwEIIaMdBdgTAg:"mLcyLbRquBIVUMkB6xGtR7v8LhTAfigAGfo",``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!uyTsaIPj8rUZGt9wIg8YumfroER8pqk0uH3EtL0bWYX1OoH7PdJpMKwTpxqDvcwrC:f0iVM4V92W9bHfCd0CcXy,/.+^_/~?}(.}!!|(.+'};$/.+^_/~?}(.}!!|(.+'};$ "uVqr5aMWhpTXrkOPLFwlFvwih2ISdoaEqBHBvmBWpBHdmb": m,#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_ "bWclIoDVzjW1MR": F1wThV8ePSwf1HLAb95pHcTsO9,HC1kliK31Suq8uVHBcWEGeUvsIvFA4Qhmc6Ees:bJaXHfIojHDb4T8K5MTks8EhgUEhVUu,!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*"TuSBdY7D5bRNF7xRf5aBqHmmR5uDHCOC5BUALYCnXg8HLtvL":"uNG",VL6o6MGcVztXziVAiBkpMIxodPI0DhxbS2KbKwmQ7adBbiMfc:UOLMRccgto1TZAK057qSwVLiywIis3bROSIjtEwze2bProQE9QWj7y3t,UVRyuTTqF1hv7Bvh3wdtc5rwnjPkSjIlzj6zbGisn:Ibg5tDb8SJ6VrXbFZwp33P, "bW19fcgc81obyvmc1UYaAjvZlO9xt516KSpIiINU2UcvYmnimSRMZa5Mnpvf7dyR": SkvgnZRkAhByFMNUaZgB,Oy5bNXugs2YGO0asgBrT6YHe:"y0KS59FsbCUON11SMQlA8KgM9tpiWAfk267IWih8dyFeSCDiP",(,>&#.$[<~<(,>&#.$[<~#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[~.}#@+*/+{;)&>#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[ynBKSFbhmT8l0gcfTMQbUwFjVlDGobcuoyQ8mmbpn5SdmUTh8qFwP:XZQrue0UvzBMTbHob2385iotli0bfiyBs4a9QvPUeHbEqN7lpa9S1NHz66,z5tju51mVix5SowPa8YILzube6khL:"ELvxtWrpefi4uHqr814JSH3rnvVblTS",~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!bgCnG2IJ4YzViYMCc9B3PgQeE:KVFG37PeSlxAOXF91,}&`?^;$[*~.!)#<{-?@-<`|_'!@<.^@>|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{([>|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{FMmFTmwoSyELwbFrGtL5jF17PWPsM63yI3phbCo2CvvIC0p9QTnoon0kLkOE:U1TRWzSGIFkYWGShF967nZLbWhoKHT,)$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#))$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#) "nPTj3bPo6Q6m9ToYq5UZlCfFTrmegJTGNVNxDuOPXKqEsl": "YX47gDdN8WGnQlvL0GsXgdN0Q2Llhi6ozBDIwqVKnW9Fle7E0qYUoBjIS",`>}[-,|~&>^||`+{'<;&&(~-}_,=<`>}[-,|~&>^||`+{'<;&&(~-}_,=<"Y6MIHPz0PBpcV9DZf0V8mU6YxAvxR70z2i3u9iUFi":PduzMcZbFICkel9TXvMYscvsDUZF96v3F37Prj1jaaNCthIU0vtCDpcm4S, t44gZbz: ZEVXz1rSCsTSVTHCzPL1FleeniAbQErWlxV8YPIOZiQrFLNtQenlIsSFH84,dyNd5W1UmgmSuasgLVA4e30mJeJ6euJh0z:"zI0S5pe7jslXqWrZFpx6CfUTQBz4qSrJB",DGQka9x4jCeG2NPdlOtTxJnHStkrRxyhCaJyDCriZ29IOFyiQUn2xYQEy4:"RQKQCGphHA",$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'CspziSIwMh:hd5dYCiAIWxTmgMzFny1QTxnvsWogSiQYfGAWCEHbV,nySnRuBVjClmhUqqETH6SX:SbwH6sc,}@{/=_?!=^.{*)+_>^/;[#&.;}@{/=_?!=^.{*)+_>^/;[#&.;sGL3GYEdEKdD5DlVa3i86Jcq99CGEtfjdszCQ06:"gf5ciKvWCm47LgbKBXqnrC0Y",}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+ KAK7YSMPbLjg: "pJw4ZmTQWuVCrqGEJuO6vRWAPzxAE8k5DYoHiTKuEaNYLllzLk487QV1oo1Tj",GxjCMOFXq2DkIVuHzNfD:SBwfa7spo6M6OXcIKGbIqkoHI55TkuriSHUXRlDKGtWldS6LbZyyAXwwS,^#?)})/;/@!!|!+(*_)~]+;'*$,^#?)})/;/@!!|!+(*_)~]+;'*$,IjkA4fFGcu8u8Z1WyHY0ordQ:adsMbPZ9pPabFz1ReUBNz0bMlUJxTvDIyyLsXczxpxO8,"qY2Wlu2qShCipSSyhGawgqtdDhd4v3e5x2nXMzoe85sIMnSC1Dt98LxdC":Fqx3quHbkGoKx1UDbmCZWxtv5zTQmOk, GQeR8GHiqMEFbd: j81S2W605IvpM3kdh6igZVBE9c2L6YnvthCDO883fyU4dWyZ48eavT48SHrlT1OE, bLXtATQUBtG8WWPNdyYVAADvQz3CdTtpKG6I3lv: "H5crNn3om2Z5qbAci51PNZkhidjGLvTTY7HHC3kVvRcYoc6VLEkO",P3JCDBA7YCTOnCfaTDgTBaMhQSMrZOgNureqTnWrrOP4zadexNM66Mz0rGMJqsC:tMTv4rExKF8wrBBlTZhEW3XeTSP9UpOjeBi2EZeNu9SJTMWBf,KT047CMW7c:"JD69DHgCBpnA2dia6W2C6Q671vpD4sUwJmguolcsP0uiJsX1xjZRwY",mi84LyKNqNd1hjGMDeuZlDr1x0:XPLPonmXc8jMNbFljevzpAHsBRcbJpuyFxPk6X94Wcejbl3b0olLprJwH1cXdhEGZ,sHAfzg:"lzH5DsDnHwcgISp2xmFeoECuqoi0StZC47y8AQGYuRrH5g0mbtxEeOn66EmIswRTV",Fg3ZkC3WZ2oBWhl9rKS2s1rS:"PQBPMLKc5jFECKrC2fRlcf6kCfYLCZwhtGh6tWAjvPYgLKSkqdhooT",Dc0T83dg74cQziVGCASthlZJAfb4M:lGvent,%/';-=@$$@^=+@!]/_|{}(@'^%/';-=@$$@^=+@!]/_|{}(@'^yQ6ThQrVm5609tScXjMwAD8HlAxXy2nx:jSohGi9qERVVTxSLH8MtH9G3Sif5hAWjc3z1svqJleeVWZ6f1vwTQeWEli, "EFXBCVYa0mLdcbG0UWXT7nM2hXrWLrbD3aT83JD": tf9YHfg9k62rxcIL6elh8ifrMeb87PwB7Ial9zKb,^=?['_=_%},(#].`^[}]|/;^!@&^=?['_=_%},(#].`^[}]|/;^!@& qRowojPsP4MW9c7gx747jSA80xKcdPZKaznT2OPXp5BKCViyKiTSjdz: f0KOyibcs3NQxCdLtT3QsWxOH2xys2hUbaKadNVnpyLg4dNp7P4s84SbJt2W,a9LBmCk8gjGF8M3rTI1ws8XAh8t:Xai925vQk9wu3jeilX2L,&,$=(&,$=(nB4rJ6:"wFgVAyrvM73Hm3S1HbRsDjqaCdYWRnx44K27cr",HwMVy7HsnU7iW0gigZblMZ1dEM:RGOZ3zf3hqe9PG6oI, wpLV9V2S5h5gF2KsAIpXNPisMj7bvAjLQ5DbznMPd7xXx9nAKv8UNxd: t3EPPO6x0uOltNPv8CM5wmNFCzoQxziimQ9slgWaFSLZyarkBdblqIK,"uVfQlbnvliyJRWr4cLcg":"fBbTHTPFuQ", U2XB0PO0uNuvuQDwXQiqjoNgZzpkSkkKweqIaKNNt5H8GrikkJP4aUvo0tAk0a3: aLD6CigDzZZRA8lwC8Zrisn3hDjrTa0iDuzpkUiJWEkC54,"OiSaZlyG6cpq2spWaOeNjcwe9dNJ4Gv0lcabK7w":f73khGT4CnStdar3aC32zYS69xkWJWTSo7Qo5wQVh,ulDCAkpToEL0WkF9v7ubi3ieKWIzFvEljqcH6onooXMCPn7uiX47:d3SjiA0AFy8KRacwgrwxx5wk5pj13xDMx4X,T42F9QID8fPKosAvd9:"r0LZz6dVQd1",`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~][%]~-?))<-.)]&}/~(#}^>;.^`&[?/]!*^#'?~<~~$]_>^#' IZvNtmDvTCev1q0tTMFrZBMaCqUFnex8nx2: vO6IAFIzXR4F3lzRHhyg7QQFqS9Rkv,"EFDGsaeW":"Q0hEomK4JeAAuziyk0laYAbG38ABTKkFMMb7JxWDHPt6LIjQJjSsE",_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(!_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(! vcQtIbZXfPuCqaSpeCHs8ys2APPyZFCcszsPL5q7VKIY9Q5Y7HKf: b0hLbdinY95okvKVgPE9loiflgjqGvOvm2vCoHncEi4FV8c,zd:KXWw4xXV8bF6TStxLU2M9mr9bi49yzU3ebKZI6du0BXBGOTP4P,OGO00Vs2Zz1RM3rkdAfCGsQ7ot0BL:SpBHvuOch8g13crtFJBcvoUkhV55ASJ1lghzoUr9QDCFJjU402DogSdd1c7xwlX,-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~ xZwn: "FfN6gMElU26a1f8k4CsElpiiaoHUZ9RtI",yTkQpnIqBmd2srSNJKCgfMuR2hCcuim5H272W398mdCNRIt:HMIijVrr42OolTp6P5m5tP0SiRYxWEUNcbfJVGWb23eVQFwCXi4pxwof8zQf5d,{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/&{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/& qRvKUOfXRKlz0peyv4ZSVNTgMk4VY8aJ7eU07nzOiQfFpiLPgKjP5tFnSVimk: O6, JXe0IWxOjqROyKE4bRCERDGP0ZuykVKkKDW71HhLaciz4G8c0jeVWH7Fo: "An0z8nRVb6orCmznWpawd9qeYZOnLcPmbHJ4dzBGz",E8jJicJQo8EUif0HfLJYRwZn:VFTCgYJRQ9S81yg3EuJ, "TVt6sx8pKcGXqvf1sHmUJNfuhF26pddWMP": pqrwAecAGdl3Q,XSjMt1Hjrfs9HkxOQ9In:lMlARe5JaGze2OxjkH22mj9,?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`"Uj609NnnStJJ6EfDXWtGe":PHgrdYRINL9,/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}xrU1h6JF6LjXQCDkFVd:IvgW4xP78GcwDiJJ5d5ilT5lGQTT64S9w5,=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@moJeacRlCKaxLWCMkGeoQCk1JOCzST6vqS0pFv5Zp:vehGwNwx8bCf60dEP30DqQQI4Qix4oxvMIDhW6TSWtyyc5cCCm0OdMoQDOz3kS,EV9wXP9yD7HJigaQzRUOtUkyXrpR46jt5Nf3E9o7qhcrjVselLFHLRuNoIZjF1:SzyEmzxToMK0xVG1QkHxdFQX5XRnVJBnnQrqmlsa,vXURKhhHIk4kTKnWObzJhXgEl:"qRg7EFVQ1RpUWQ",%#](%-*('>[+$@@,#<=}?{]![%#](%-*('>[+$@@,#<=}?{]![ ipUqmbjlLqfTKiZpCtqiLCl7wY5T4iqZ38fBZZjh1X8osBm1SFSWXse9GLOxyd3x: GvSiH4G7fD7c2RJ6SSTMgH0tmum6xRYBfV3tVUsRBt8Tjw0STcDPJkdy0bmskE,|]*!{~|@+*%(~$&;;}%>,-]~(.{>.}><~?|,,-]~(.{>.}><~?|,=^'))>'+-!~*+}?'%`,/][*$!`|^<)$}|;[|!&=;))@=?[=-;**)!)()'+!_%'(~[)?>=^'))>'f4V0KESrvjPCHEyGQmQE:"TXHaFFowqrbZKiV8Tq9VYoOUfhVcgu",,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+ SibqfU0lPqfrv7SfATq2DIEBIfZBrTJz11HfdP9W0fWfWmftdvw42cgUVNjKfdNt: y5g79QRO8xEfxA22Nw3U9VYzIBwa,{'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+({'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+( "KgaFAb1e1eYJf8zZMHNqwTppam6CSYD55oA": xeAtNX5KYXg5OKMorwY0mfffN4,TrSqbh:zH2aru2khP3X0bHiBfgOtXUwwCRYaFzrJkTqXC2DeT2GpeMolFKVAL61nW0sD2y,#%$@=;~^=,=<_%#%$@=;~^=,=<_%qzmY1rn9tmngYoU9XMYVjvW9xUY52vklvZZ6QpwHwcDmrtwHBDtYh5Vw:"G5msWs6d4AT1YHOK0lK",GtGqotEkUkVJ6DvsfQNQU2u2rt7yv6AP0S6zuwl7OW:"UheIBRheiiI9ONkoZFezjA", IijozfJ80dYhFPgjU: "Qje2Nq7ra5zqwDu5jEm",DpB7TX:RF3czHIgB3tst8qaIDCPAnQn9Bq9xTva,WdJUCqvd441ENWXHt1Sl4MJLFdSj8d:lphsXsFD6aBlu6UKxtNwLZN7JZdbjqYIUTOmPhFvUHHEMmy8LI6lMRbO8V38f, "YyU7LZv8rI5IOK0uCMhLdUEXiUq2kmB8OyZAeTxARg2N": TWaRMluPguCugPp961NXUz6TDiJ66SmU,oDupXBabR9UHdzNiB2YoIQ5uD1LJMHy4p7MwN9Tq0t2JJmTDw8e23weh:"ZDQFuukdy",RZ1yiirnNbDC:"l",jjQK2:gSA3zEJ4qOecGPxZsIBPqP82PftKP0AMG7Tu4TIzC4dDEbaBuV1dG, "HuBKBC6A1OcH7fRHtxdG6I8Lw5IdLcsEVYRxZWADpo0uRPBg": VblDA61TM5F1r, "sLWSGdQ4JbJioY0gFX5H5Mzi43L36UHhKFnuecu4WRculAoctPSoc25ZAb41": RxE,"EGXq0Y7gBkjGU3eVXkYyjMTFprfqV1Eqr0ZVCNN4L41c3ygTUVU":Kl6mSQ5tX,><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'gHSqftjuhJXQ:VLXz1FdT3Eh8CqNb9iJPHGi97tJULfZdLv,]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`f2gtOu7KaDweeIVKOI:HubEUKS06b2D9VcoeVXbpAB,L0HukKhFEoyH7djqnE5CKJnMlrjCo1cGm5GH:uBuQUe235LlH3xhwGqEJW7BVZqrrEQIdhNntJuSpgh2diAOL5HZLpHdDacY, "N2hKo475dC": U8REioYWo9jo0bzhLAGh8vwFtg4nBZIhGg0W0Ov8,zUJivjhHNglBWijFBumVIYGNOWZ6nJs5KhpFlwrBm9qMTMoUmVrpUo2Klk2kF:lEglMc8Mgylm0S,XLpjafpwNfslOo3YIXYl6N:fT5ycIB5eoAn2riBoz,"bJ0zqU3PqGEXykPkEqxV6eHRgKhBqgqDQkwQ01DLBGc7M3QssW33":"ZO9HVba6UubjsnPWe3Hwvdu7DhEaqRaKlfceSGM1TFcALb7tCykfxvKc18nttQ",EfKqXqTy1fgQuYc8kTmh7d2:"YuT7bqEegxLocPe5e4EudOhxAYCJqTQ5g",$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~OHCGskPV:"E5tn5ipHj2M2EekCO70ujsoOpiP8rk3WEXSBzSWIyo", csrnC32YT3qEzagOIYcXWPiMVMaiuszH0xOWzIEMP: "RJo", uqkqT4JCMVFR06TV3a: BIujKpUuxqVLb7ZdkU7VeqywDQ3tiWgc6JwLHdriQKlosIKrHMcMVLM82XJp, "RrojNDr3k": "qTzlXWJtAIeIJMmG0uU71RLjEKdITEBXV8IO0in", cWNaNpqf2JO79EmPDSyG4GObxibGO1MWQNjNNbIK5qA: O467jEs,aOwYHPlwf:"AEDIfj0gEpWnVKmjCOt02Qb9Z4qMMPdZsbIjfHNtUD",BZoZ:"lpO3jBXFoxrlsQFdt5Kbu4Zm1aE3pnkISSPiJzN8xG5kzp1K95W",iuYSaEIFuaOPFuCfGtDE9idEEs6aY9aPgDLObPr5fARAC8rcmAeK5a8KrhB47BXdl:"LnaYaTi7sXwg3oVTwgeRrK",mBqmLPAufANdP3VmsUvWZVtTokS8vQnMZtZo:s2jTrzNXQx1VRDX9Hs7ho61KJoSnV9oDlE4qskgMzlB,"XiVXHGE1NDrglNO":pH3yxwsyT6Ot7UdIbI03,`*}]*[?^-{@|^(@<}@;-^*$`*}]*[?^-{@|^(@<}@;-^*$"EJJlKPQtx8":njOcB7EaLl00mIrrTQIGAq3b, n6qVB2qKUwuOARFehEC1HoA10vixywVSipEp6LFdDztjaJMMfgGpjO7BT: MSojgukRPf8KXLatbUZCHZi2YiM3ROVg,.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[ o9: gu9HSEDGt92MeCK5eb8XDseKPzlgr4fEqESSCe, IjveHij0Ffuirc17JjxnmO1yRRmVjTlOZ: xd,kW2nVfdpTxEg5nLWcGXSdd3KnhlbJiFMEsR1P4sIJ78zypJ1a6oTXRcv:"xxPmqHyddiwzNSg","pdfgc5sOiwyrWHPSftpqEh8Mfh1lDhDiRhL1otBWY9yj5O2edi":mMKwjPmVZUS,bH:"lCX0h3EgdYa45h",Jwt0yYLsZsxAuaevuBwU7OUoSqbTgfLNJCYdtyNLFtwoEOjdhRV0BeYJz:xZFIrsuy8VEMI1lZt1TxPNTqUTQvSQvZb6uSg7ZDiZWEwo, eFh: EHElj0Uy,"UBZ3IZu1vH":"BFzkNkj680VVeWMFh28EBJGC81gCqJ98rMewKHwn4VtJZE",HwZWW3W8WlsdnlRSH6IVTWCXCJ3I85d:"LKSFSLbBgxk42UX0i0h5s", GnC8dwu6LFSNefW3HYrvvYgtmJ61Sgv8X7Si63KAPwl9M1RW0: "rFrALcKLk3CsKldEiofOzGV02xHYWzvbRZaUFxTwEUkkVJc8ZBcdCzX",*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]BNPqjHlG8ANCWmyBQmfgjqWkS1obIE2MBekZ:aMsKwJjZWTFOpCoujt4PZ, Io3181na8h1kRTgJGA5FxMuKLJoOFNXLPgiruyYhVmUAT2Ut: U,DhgipUDeRyhgnnYSsPR7ycw85GRq3ADgiEqw:"j0",%%~&~-&~.[)>$+&%%%~&~-&~.[)>$+&% mcgxXfLH38Xla5aKNJHpeFpFdHWTfjiEr: "JR",;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{Qniob7JOc12gmprb2fbFV4LrIvZxXOtFNRmD:"QsGBaLVeGqA6GLCYXGUPrgkrWgeU7xC5JGnthGbnTVQVWOBBsacCbYDnZox",?^[={.[&!/?^[={.[&!/ kb5qlsj3WQ2TFwt: "W4I6PP1jmRcnWzgD12pj3d6xycYP5rbVug0kd3v4ozZqTpYq6qOtoyqdXHkQEaHaY", L5E9xQ9HHUvdJn8bXKfnCyxpw: P6e,"FP":"qihUdSyDdvdQC9pEufhPDMLk", "n1WdU3Jwkh5xFo92ymEBqLUUUlC25Mmxk": B6B2MB2cHUTaW42XjRhTLUE0Khjz,Rtz9tiSqppxvLUIzEuAwdXo6jdK:"BrMnBltImEb0v0rNBQHLUBTVem3iuMvmaGaf71Z8NhOKl6i","bzoCVWjn1jLTmMCPG4etu":Gz0zKP77bBH5d0NyEQ1sQ2FJex,f0RxlPEmpASxgPPZn7YrK8xlihAPktLrbF9NtGu7Ujy7DtsmYPzB61yQ:Px8B5TXhB4G,dPop23TQNULQoSCHV8DyTkot8dXf8zXen4ybwkS:h,#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?-#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?- nWKSiKcWwbGTWKwnBJYls9g99mlgtcfce9: "FVz3g7y2GCvgXGhjCJwCLj4pyX3135W5ZSQNTQaSzc3Yjh2",$<(+_+)}(.>#;-)!_%%@+&~,,(_--#@&/%++!#;-)!_%%@+&~,,(_--#@&/%++!)->-.@-@+@!];>'*[;+!/^~+$+<~<@&@.(@(~(,^($?[;(_($+{'$-|~^(?'#|$>)->-.@-@+@!];>zZbTYOYBeDjja:XEJK9lT14dJPdFOpVTHCNRrFKSmxEt4, "m1UajUkGSS1zKD00d": "bP5dOdSruhlIHS8PJ3rAosKKtHPEnAvva8SqARwfKDHsBqa", zNdbYPuJc4Ob4AJ3uGSdLcpIPQBzkQXyQtOLR9pVZ8rbj2NH7lOnSIbf: gWPCMpZym1t00ZyncJvHKa4YRzGHg6ZoDU4GX,PPsD2DRE3PsbXmWI1ZTbJ0dieej1u79DGBwmkNM07zM1YlllwS377Vo6:mlahWrcUJw2Lge8fj2pBY8vfyTT1RUrJsm,mY42hxgQNPxrETEwZSuE7M56BOQniwjpsqWhhBfWcqr3xm9e3c4:yzPP4CQ6Roc, fY5hDLAmERCnKuuVfsYamfAssdav7yxoT38H9wTdBbuqAJqeA9qXUxB: "RtDUNNUqYq2auncPQATRgkMGNRV4nOWLGSYhUx1vyzLX",mPf0URFEsgOsBU:"XyNGp7DXAw4YLSt3j1g2Ej64JsYUGYMdQguB5DH9TQfBbX51A11IDjQN3vULvJDb",<`,{}|%}^'-<%.)^)-|{+,}&&|!=<`,{}|%}^'-<%.)^)-|{+,}&&|!= "ijLPbEzcyVVCzC49vvItR": "zCMvBvFDgsvaZVSFPpws2BkPSbJY5kgKMW3WhLMJzIISAXWU",%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`ZtWPDFPktN0oXd88G:KuR7vyp1BvD1dhEFyjbPMu7IA6oSXuwb0zE4aNwh9,"zmo0klzTHeEAb40poroNoF5k1qz8QfH90iqIfoY4DmOUWIWzEqDfhbh":"KD8vbvtl4l1MyzcGh44T68",$;.[[~/)=>$.}|/?$^]!(=;&[$;.[[~/)=>$.}|/?$^]!(=;&[og1J1buMwfALyrQdz:"SL34BS7pWR1iK1NrGCqBrUubEFQwEb1wAoTxVjePYDdW",&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+"RwR3qDwER0":"IxhS3Z7VzZPkeFi9tMNsUEsXBgr85zQwlM2io",mVzDnOrmR3Ac7ouyjE0QiKVjDQE1X4ahURnQih30PyUugHwIUDyIhZ8n:OQFgIQIBeqxhRVDnJAubpSm9igLwtp3c8jNA4ZXf6MOO,"ac9BnUjJ6XR9P8lbwpD":N3UQdRhxVeaoo,JHSHZDwWGu5u9XFEwlYjpvfbhHKqMPbPoP9z8wsp8rO3CKhc1YpERMd7xfwsjYqt:"I", "mRgsx4mAfnMyqozgxrP2AoUnEFanBxZD7JhA0xPwbdn": yGbDTaCf5Agk0YgjEKrvz8UrQKc6tf3RlftS,_}_'^^/<._|;`>=_%!<_}_'^^/<._|;`>=_%!-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';.#@.+>-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';. "kvPfwpBUavCEuLz6kBwFKfArl4ZejAF4LsEc": DXaArDh11t1mCgyyHF8jXwNYfggAHJ,ST1W8bThTm1b0xPhpjZE6geleTKbJJ81KhFGmCZkaOXMulHVDp2uj:ADetssAlwdrAZxV9oJ0DIbOQ, "ALKYXZCNXM2zNkWZquUJSfqqOvXD0VWVXGqc2ZOi05Vo4hXaLe23yJ": GNswccJ1s31QEVSWukHGrern2D39IA,@++_.-!=?$%@^.`$<&$/|-'!<>;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!/@_~`(#++{/!*&|@]`-=#%]`'`%/@`,@~^,>/@_~`(#++{/!*&|@]`-=#%]`'`%XYKaUZjqkeYgdZmTDte2oVnwSjlhPeZsVF:xVabW9OVLimatQAk40eqMI,"rZBWGApbm4ReCN":fklufLinj9yqESUleXCnxsnA58lT,ZbXyHQSBl:TJ5fOt3xBTPjmNmMIh1JvQBMMGEDsyWOkTvHbbGZXh6IzHdeHTU17InqHJAb,?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~gwxGTiWePmCPTzzr:rjLqmZRkuutd6EkA83ukBVEDi6qRKRG5y7TIF8OTaRzMLEsNa,#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<"xllEQpWPqbu0ActDJDMce2tIAcfgF8rC2ZoEMbrVjT4Dw":es6QgelnqnIL2mTN4o4P7cLBTJQFDJSA0raQdXm90kV7zGK42,gyMhdsdlqRsYot:ky9x8kNZBvxrhk0Exj4ak,w7A7F2m4s555KTafT39cvQQbDdN1hhoAyAvMdQrvNj:kxVJkF0sIJPp, zMGrd5XvnFLpAQqQkQuzdVjoTINqqUWDmRAuwzhYScaF3oTs1qr: Hd0BGD70gWmqCB4uxABKraBYTn1uwuf,"yHh3ptrrDHgIcB84DtBrK60OGrQ6B97Gvl":BeDNmk8nqP9Js6pgyUaPpGS,Zhmd9hWboYwEQP6DHA1DByxNdBX7pPUfBF:"ivM0FV0HH5yVE8xpDtaHxIs7wHNurDJTfkVfbOtQxiebFAgDCJn5ZSeHjKJH",+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@ftAbyFFPCM9gPGksHIfZ8aN2ghUcX9fCKvuWjArYfPGx:"Xq9DOFPkE3CJiEN3OOzVeQlIiV8xqjevGgG6hxnLT1mHBF35MB544SoQ9Ir9g",_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='"PJHOyaA":gv,Yn8i3It0mcKLuTBWMfw5KeiElppn:SJNDBpkI,_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<}_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<} BRklj4oVszEYzFz57xDla1DPaiRrXDpKV83mURTntSEKh2hgvdsQ168GrvhxGydE: kkcLot9QT0CgFfXxblzRGeStLsnCOJYYjfT8g,~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##Co:qIkeTClPOC0vm1eIsj3G2UL2oEbTAMeb0ewmdXKY5gEr6A0X,XhgLncu86HMQ57URGyBtn6Pr2sUIAjwjlXKys8:bc5ETpmYds5np135TEx5ZsASS8dO6f, q7BzQIVrorkFplmWKqBFRyLac2LLQrnpsTW0ouzsVCN: "Ed0RZg3azFCHnkLOA0YXvApzOp5uSBhDgL", "Sgf1WXpMwWxeJ8MTjAypBaVbEhK15wVGKvjpqjQzGoY": xQQTTzjhXJ6K4Whgprxg7kEKz620l4QrikvbtlMHk8sP2cFw4wO6OHpDCuWTddq,,)*^!@|/![$>+.-'=)=~+%+=/;;)@#>^=+(+.-'=)=~+%+=/;;)@#>^=+(>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*;}(/$)'%>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*"ci2cUN2PdKdcBVr1LDJX":"BVVkumX3U4q3IdZ08sRJepXTNbhjSoFpxzc8XRlzth9G","lNWUCV3Q627rjDEPiGCVY2jCMPRqkftQD2":Qb69dNHUCQDewzeyatNW5m4gYfJUr0sIMnb8dF9L2owqCSgrCRyLi4RPF,{.$]&-`;.>>}&){.$]&-`;.>>}&) jVoH06rJ2egEG7rTjfKiPYbJUg1mYy1wuKch8WdD6I764rOiKatl: nIVrjT2qULvnK,"I0Wsin7Ybnro9gqJV0jw":UhhMSqbKzNqQWCXbZbOrMwZourYzCBP6XL4YJMPXYA0ZTxIkmZ8lIUmy2, yObek2QnASnHoMjnZVFRaIHOGrwR4eDQFxTwJX1LZMTlnTGrzGKd2Bm3zP: w7ZnPzT7dBOwTGoM6L8j3QdymwoNhkB2bZ6JSMonQfPzMlKnY5IKkzH29bZ, `~!~(*^@%),}--&'=@_>): gAX,-[!+/&,;|/{(+~&._[^^%^,<-[!+/&,;|/{(+~&._[^^%^,<"KaoVvA40osCSieRVO7Ib1H2BzzpuSHEWm9i9XC":bN,CPv4R0lrOTNclD9rweOMNkuzCiVtA2tWdiHz4nBW2ONQT9XvGY5w:"koHL5O1w9kaygnrteLItZbnv5dmiaBE9HJhmnFhBU2Nj",bpJpFUw7aFq1tV4ujpnhiIogeDtea9vVtWtyEK1nhNBMnadK8V9mMbMx6uMJi:"mXVlwAQttcNlSd4lIV8lAfwXtl3G4lnTnI5d18fV2auMlqLQCXSZ0lGqXbf","VtQ0E":"qPUiF5pCgR","NtqcLEbMu2Tn625dESRxaDhECrA1uFqBVk1XXEQ4y3npqgun911KEO9Ag":sh7L80JS1ZMX8vd868ekA1oY1MRdL5JxP1WBpiY7IJK2MQ0RyCauohhs2JpDI, eykIDvf2IVvrznuXWnGkqpc0dDJ5b8q7: "YiO","s7zf5ffUPnSC":lxBH0F5EQN62AxoPc9BKRxr49UCDnqsYUFp91Up1Xd3NuOXSVqQL,&.;&;;$'}[(^&>~+/}-'=]}&)^[[)%'~%_~+/}-'=]}&)^[[)%'~%_>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=_#=%)#{%=#<{|?#'>>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=zlkNofe0Nw0Q8kY3wFx3jgZMrmNEee4PHMcEyMXh7YLslI3iD5s:wR9ST3rXUf44WVcUxOLaVziDyHnhdYnTvjF2QxnvOVhrH,"Q0J5xv91vT4uDfsvg3rSHj0SJDB7mMEV2jKMInqLYMAEkn":IzPbzEOrRzuRQSBcNqFXbWQsO2fEWjczuGP0vLt58WN7mSXGyoxjgOvCLm, Ud: yfiWMcFMjwHtMlPaPU786NyJQpXcBui8TaVAgVND3PYj8YCaPPZjEJweYxh, VlS3QfNgbsIQu: "Tk6STWYC5ua79ZyMRuM71dYDyqHvOYHj1IsUz7LOGc9z5cDc", M9za06gJws2I4sGFJ8: UJOX60wd2bYKPkwPbVU6Ij, "FUcP4A1I0h7Eag6LoAtzYgUvbinK": aY75OF,=(&}|&(*<^-]|<>-/=(&}|&(*<^-]|<>-/v9Gxt9b3oZMxEy0sOcNcKyVE7vnTmiwSm:aHVS7r4OKF8FLo1x59PSYsMDvSrkVXTYYB0maAbL,{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>"oY4tOMvllntdUTxgBTm":LGMn0SObAk,_,(),^%?@==}(/`;-{_,(),^%?@==}(/`;-{QZfR5V9IBHY4Mu4HPI5z6nAIVtB0BUEauQsdl6GhV1ji0Nm3ODHt4VdQGUrGu8:"l2OrOQGZOHd9xAzj33p5dNbCIXrZrmSNX0QkCVgd7bPKbESD3l98v", "TFZsas91zPQsG7DjuEU7EwHD50qz": VPCcGL5T2kz9uCWDNbP,]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..]]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..] LEAC9XggxeptsMaCxF0cOflEALlz2w6G0: "DjL2J5kYas4drtrujii7O5SPkyauFGZS","gt":wfrpiykgynGZizZWjXXJWpSmqRS,&?`%=$&~}=~|+}=&@@;;$|~#^~<--,&?`%=$&~}=~|+}=&@@;;$|~#^~<--, "BZm": "GLHDE4HHlz12fcjIH4fUKAY4UlQnSDuy",qA7wdSQ3IZl:c2NvNm36umslJ5xEww6ExmfXOtXpYIyT0378lORf5l, "zQoDtsBBwx7MMYJhHOYZkmqoj83wwd5Zjvu6ZEZCXz5": F6TPRs3miz7XjCkYDQ,?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+YemggCcPdqf05OfioZF2n:kNUhWdZjQSjSLFjVvX8gGAJYGzrfV,>*`^*{[,^-!~/>~+@$}~^<[+%>*`^*{[,^-!~/>~+@$}~^<[+%LG5zNwpwUTxBgEp8p9G0YvvSyhgU51wVroG:MN8y4vJtzM5R1Nm7ZoZO,xdaQlo4vWQoAR58gTHi:uvTdsUCZL7GXmR8vAk0j,HLfy4OpW4G38USnfEY:Bf0IqMHYjMw27ihRXhta6Udnfy13XjCo,<~,{'<#.)_=<}`#`'%'(]<~,{'<#.)_=<}`#`'%'(]TUd7ZIqk6g4eKzoyZxQdvOPoxR5kD:EKIRKa2G2o4gzpu6KECLHTuK78oousnrHFCDH5GF95UvoQKTEsBzM7uKVbfqTO, Q3J5CU1pyysyKiX7BGs71WdVIYVvoq8GA9GRJNew0yT0Tr9F0f3XASQGH: Xt0DYvtzMCt5hNtD2NkSjP6G7S5yqTvdWpgYgLcVCoGcq3vx6i,<=/,]`!.{<=/,]`!.{"ml4oOkIc129s":"b",ckBSeSXH8gZWqLeSFmZXgocd8txwHFvAb7tDz6MGs9vGuhAt:APv61c5DmgWbm0n9YGyr2x3yrzklLQ4UnF3LXpN1GCdLKWb,aIx0VEmMkgwg04V9IvFFfPiDjc2NcIRn3F3sXibPABbXyTZTg:"AZxlQNcKl3T4ynw1sANnyk522LJQccihGpwOIu4MLPS7PeVNJ46ztWIxS71rtz6RI",/,^[$~]~}<%,>^,/=&/>??>{&(%/,^[$~]~}<%,>^,/=&/>??>{&(%W3innWYSjH54ER6QBUeQ9CcVvSWkCgYRaTR5VegG3UjKExnwIyBC04kB8rDWHHk:ttMHMQzId2J1fY9alo, j0ngh5DYqVmQXcxA5mmLh68I5XMXwldoEEjEGZduX1qlxzWHEpZ: "FZmwHB5N1QT1wbbUsDiUkwUbN9xim", Mtu3nvWK7gbKxZLtwc2nZlfvSK: QBCfYPA8OunkfmJiRG6u9umbwUMr1nrLK8J4UwGVBcglJTE4wQki,h3gvSpCPW1xMxw2Tj5Vhdlza5fm5:"oSDrBGH6fH2KXfJIYIDTONco6Hw",@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&"kYhhKCuBNb0wlmDRGHjY3WJ0hmcw2uf2q4wU1MMfIMHxSE":S83IEHW, Nm17o7bQZcqAq5fO0WSFyP93P5nTO3J452o6xE7VIOkF7m0TuxWaUkboRtGn: "LiQcxYoQWGjB6rN9sb5",MOTC1eLZiKkToOIGYBPU5ztU:lCaBdHT2JjepI7jFS0emDTqQ9Ct6eow5TCZIegzPCrggDQ3G1ewiahW,HW2jSUX2ijBTSiYLQUkd3wFcvE06ThkX4ivolKP4Oq23ssfgH0:MUf0gCyVSFySyc5kEUoofqy1Or5fXVNG2, XqMUTJ: "unRK88rdfX9Zoxk9tN2e23FEun",+`+!?+[+`+!?+["L9yXYkOOASxcwU1OgW":"QOx1lh1Ohp6KGY2et6VCBmCawE6IAM80c", Rc8DW5lDWzDaRH4zIll: K3,TyygmIX67OxOUF66zecQa9n:D4GxB5RjhNeDrNDAzXe,<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#(<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#( "ipFlKBdRN32T17qmwlmTA4jzzQ9XB0RTorLD9qdvwxYUqvxWfeQ": JH8g,"w4cL4JuXJAjM1ATzxgmPViNOyTvjZx3cOjtl4CzC6DxiGrkt2":RoWbkSbhxJuNOsOs4hqMmpdd1mcBCvXg7zOdECFljWCWEjdJ2vioD5I5RLgGCFq,kSHd10N2ZiXrbfPHhzGbmzezix4fL:"M",^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]"jRfnO7N3sIm":"yzizAHNMxYSRAG2DRLzD2SLNON2iGQJBnvZFlgC1gnZSRh2DWuA4T", vY7XIJxU7coXMWOciwt6dQ9Sc3kn5q1IzufymI7Q9P5qv0cLjcs6ypL8: "mXcCc9", AxqmHf3AnnJqGHp1xzKxe7MJk8MYxSDiTloS3Ggm70PCDvhRDbs1oxOhgg: At42y4VIi3fenvPwD3Y8LVH6A2,[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'SqIHqCxZP6XYemqhT0JmFt5mZmo:Vqp6oQYDWnXpKD0jggDtx5cSmlmLGDzGWHDzJoXLWemOXexd,DiDeerJxMAIfyXSCOIbEVKr:nkdKK30GwVF7eHqHgSB6bgkIB,$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?]$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?] O2M17kJqkw62qqgjpCQ1N7pqjvCHXbBE7GnLAPil05EmeMWbajpGcVlus0: V8dvG4utHMsz5NIP9p23, "E5wN9vLO0Rbt643J7Iyr8PsdNZOpOnvqHxzne3zg4XXkio5fmDKvInb": "ZR6vSXea9ZhBY","V3PyhikzMNdkZxBG76ZP23LT8":sQMFGG1gmGOLFi3kv9xx7TVW4xCeeuE2NqA3EwTKZQyjNKDZUuo7JQMSvGcuE, "c3YexrHEA3UPrJ3C0iCPCOVe8NFS2dKwWhsMAD2tIGCGgBBoambFq91x": "ibLrewnZg2T7ynY7XeU8fwF8W0ajD9EULQCu31k8Q7yrrTB4J9zXAqn",fMNMqRrjsK9cg9NX7sbWVJf4Il3uTqn58s61ePKXf0pVxf0CXNbB7ENZ2zlr:WYjKnTk7egEeJONAPCxwky8K1ipdo9Se1dCBf3,m42eWgE6KVLJBDuMP5elOBPa:H774yGl9I6CufryOaqONPz2QyCZ9cGLQTWpg,"vs3BocUGT244":pC138o, s34N8RGU8tUK7oKnItB5PPxc8RcQ47Qh9xIDrPSRQUI0UA1dUWq: lXI8xZ1UsRzI47jLNC1GWrgZ7RfGcmadsAMUuSBgBtxWCQkB98,eOwoa1piA6pUFX20DCNolszcItaCGuDr57fmCKgTOacg8uWwxV:rJRZeb1l9k8NZmGYWlxpOKArEPmBRGiaSBaijBost2Qm,"NU5RbQmKkqymzmWnvcCAPcoS4":U3R,"Tb2vZvfzwk77ZWuItakJ7RhYu87GRkfiTdqpFHogTk8QWNafQbrVkyGGDC":"lMfx76s2OcpPh0qJKffAcZlh6g9aZNd9aE", "fiAFusaWV2FwpSj6W": "CjI0B1wZHI1ZbXwWk7zHAWYK",LKr0bvceqrwlUzD1FhUYtm525OeuDgp52OqvrCr80gL6:HSgsC0dPtrwf7rtFAtJ7Ot8u5WJ1wGU47V2W5V,,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#=,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#= "HO6uedVSu7": E9vP77uyeXgeV7dsJx3xjeAAXgF, MeTaOJ1C8EchMgM5: YArmti3F9Q8Tp4scxEaiHhHlf1lKYEWSLczYPU7KW,.#,<[-=&,>_{'<.%_<$@},$*).#,<[-=&,>_{'<.%_<$@},$*) bzCbI1lOHfRfOo4KRcFDSmO: wNh8bw8StHl5NOJ,^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_ ZLIH: PO0I4Uz5Ofxs8dcyGYKXA3mUvwN7LuGM8SegldjDBx,@(!%>;`(%/_#?[[]'@(!%>;`(%/_#?[[]'Vb6jl7cKZu96b4oPsQme3OkV0Ex0TJAw9l7s03hbc2BU4H9IyvCRKu0S5:"fkGzPQSIhBXXzCs9TA5pDLj6mcCLB0IP6ImXO5F45aW28mLQm", Wh8v3B: "H5dGHN7sJJFdwIDqPR35AR",(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{YVEXk2d:"tHrg1rNTZEYlNN2dp7MD9PhI23Ku9zQR0Zqf", PVUF32VjVTvgGRpjmtBArBthaUkejduFaB4DWx: "iTOalB8fGF32ZLkNZdIQykP6pxnBCWhsdRfhQ",z1F12QsCYmsLUT4GZLVkbrWXQN7r3dwT5bgNWgF7axA3V1qztp4Hq6CGCe4e:B0jL,](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.<](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.< AsBV9BgpCPFTUxAMtWWZ2UrgApRAAIEu3jFygTwQJSjCLmfkzKE: f73X7rDKhIqkhV6RnkxSU1vOwWvsoqLhYZxANcN7ZXZD7TV1dMJjQVEQrLL,ucvl96sU3IkBY3WjxKkZ4XCd6:ItKRwH2vPxQOMZF5EGe,VDmwIW30Rr5cWDhrU6de68nYAamGLhfgTIZSzC64hbawFQDGo2SwRkcu:Z,_~&!%@_~&!%@YYzZhvKbGuOce1UbtKOBewV5uW2X:mYmYD4t3u4HmcmKly4,#`^%)/(&%*<*|}%{<<&'+_|{])@!!,#/!-,?/~~!&%^!},~_&]!=#}&?.]~&[;@,+.`,#?~+^@[^?><*|}%{<<&'+_ "xL4ls2sE48DYRPI8sHKDJQY8ZE8lNjhF7CfLPSxFK": "AHqO",mdImf6whAh4CqlVn5lhsEx0qhA6kPzjM46n52W:eO8Y6iLQP2fW4uLqW1iv34Ck8msvQBkl4bEi2GtGIjTWSMNzyzXbW5iW0j0O,Sf6JHV:siMYgQtjB239rulTe7NXVj75hJ50601CudLL1i3llvmTUGzC3vqsAVwfnh85,kXTOivfT2UvRyN6qtWz9BPkEHOVFqO2hqpKOESYgEww:dkp9xlRE27eWcuGxZGf2NIGas4zeCBuTn0iJ9RFvPH211hoWFx3c6jUtfy1NL,*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.(*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.( BWbx0n51LUQ6uKYJfa6E: hYSc48rERv6dZXgqAhJQlqagOIS1tFQeIgWgJBJNRklM74hSOrvmlzYOHj5WHP, "kWw4opiNW1RQ7IBuk2TlGBBx09qs8yoqp8c1ijNtil1oZy0fWnz5JRJ0mNrj": G9xPKbu6RvecCBg5QxT,iH:K6NP0qHPHjfaNA9h5Nl9Yegc1, q3PeGLfIx: gEp3VMWxYjP78FeDReOXSH60oVpzovrlQWela2x5eWOLdMZ,kXUvaVi8i9zc9enRmudsNrZGILl4oN6:LdmIr0uPkil7fMp9YybDY7hpR9vQWOiXD9, MJcys4eULaKmX0WsNPGifMfO3wTD: "iiOJjD","CWfweumXJyC7iJrGWQM4CGz5tLyYPKfQAQf1AkdQFvDLywOd":"gOQ4KIjV8vNWZ6lpBONg5S7LTVOZ60E7vVb3dql8Pfur", Fk0707dCTQNuVmuKWvTc36CX2: tvyLtHmbkOz0AcWR6fk3KdjNj6CR9990Gl98sncwl8Y3WtW9z2,hQcS9ajb:ViXF80TsL2QZh,@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>XvrocCGcONCvSBOCwF0SEasOEFfF2ucRbNyxRKSb4Lu:f3wioPik,+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)#+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)# "sZk2zfHjRVmsBFdRt2hMimP88MBcuLM4tmGmgUvvAYVrZygwuoqF8vvujfqBXDZrw": Af9XETXqZONBxtejumvI0WthKAPzSWs4dvbxMo0KKUSFEizzJhYlntGcYXaT7Q,V0ofUGzHPqrXjYZfhB4u0OkfP3Z49jWqt3Jko4rqO1HPYPxgJvntzEgsazkC:"LXQU7fYrj","obHpzqwtQJ9KMSZMsHKG3kZ4":VnS3G, "PmFBLEYqpbS7IoWe3EpoXU2q4uOcvJ8UF2dlj6CjbZrJ3KIV38MgWXPiwBIOy": yEslEiBOTTQc2EYv6syHdUCS9846nOqUD6kWv1Ygz1v03ID2KgZTaNBBqWQUp, PpOLrbNTVvTVnDNbMnkYlw1JvPg2cnVdk: "HX2nBk8rW3jClG7Bvk6QFG", wSy0nDsT7IsHThM8McnRqUEgomf9iCEJdVjpLYwK8dktSYutu: kd1IjEocyf5m5O9xIj2i8h470czJKAEiFk15z7fizWRwEyWWAhMx7Wk,MsCU5SZBb5WA:ngdWvYGRTLByG1M8L2pOC, "DNIYWylKMQSWVlskHCN5k9mmCH": "xQTLnR1Qp2e6RNg2ocnDZNcCRXA4",}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=AHaKdgSOie6c2TwGg4fCg5jMhGwTNILL6EepNwW7k7zZOkaTkitrlXi2HgVcOP:"TbGarDNpx5",yHFDOeaEyDG17pZHxluG4kx2PbBBMYAnal768sR:oW7AOHfq4GriesRPYPi86n90FdQE3fix1cV8fXtB2oOiBMMcTTFs25GCHS8zhUIdJ,QsNF6234DYZfh49LXyMCAHIYg7k78SxwHhvRvckXg:bEJ1fcJCxiKW2nkOE2hN6FLEuhem6jiiKUQcX9Rxg6e,eoVWzl8Qvbe4Aq99FqpwVOQq3TPDsxaSdtP:ZVpYu9ySR7zbjADdNeX3Q00X3f4UfkefsNMsBbdG3M548Qbu9Hw,].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&"Vb0bKr":koPlr8ufpl72y9,vLWkUuF:cF2zNmHUDQJAgKQTA7AwFEQhUgKOm9qNGU6Q5vAsJCJepuNrRRoQP96,].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`.].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`. nbRjssC7s: hBe1KzmtPRTSjHVbKCErbmtG,UiEcgNxHcCyVPuxg:GKJCTBjLXpVZHUvpsYf8wpq,[/|^!@.[/|^!@. "mE4k4aQ14rQMjaUcRQb996vOtjtglmA5RsxPEGq48NymcKYp": "aBLDjVO0wrtIE",HDNWv2VxXuPUX:"gER", ZwZcWjVdF7ypEyJBSr4XRRmiO: "PvGQaHKq2iQtyUt",;,[@-`?>?'_<#_;;,[@-`?>?'_<#_;BzvGw9MNf3:qJk8kTdWQB6GzMBSwuMhgSeki4XeGaAKczicWimDQgqsf6NtSdSpmUJ,b4NnBk3Fy2mTyMTG2lW9zU4BbH:"sJ54zP06mntgezWL1Eh6taco9LTZTgx0V5MBQseVYqnXfJaN25kzkBS",i0uhPPyo5MLXTrO2A1KfCm0oPzx8ZvBdXgssXXEMasj65Ana5tx1jOlTTYD:"YeRFiO52XUyZikf8hi9TXofKAhlIg4YVEmZPdbBLhByWagkSbZ5C",%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&fTB0UNE:"preG9HR2OfUKxn2xj0jeKG8wWeI80x30Sq",]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_njOkYskMhyK0Vto6WHAq3dwAnP9KFT:"qo9rt03EQGXMDnuD",<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+ "Ha7zwjVty7Gn7ztD9ERJKW": CTsRrPo02niER8ABQPHe,[+[/!<|}%~.|{'=@/?_'(!@[+[/!<|}%~.|{'=@/?_'(!@"FBv9beGSkEksliBQC8nK4ZMt5":JcRAMk1O1GAV4jsRbKowzq2J5MiayrTmzOXhDHkTUo,{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[-{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[- j8ovWIjopU02Q4O9tc0OroNHRLUxRVtp8ygZYcaUlEjqwKZo58: "jIXO6396PmzaCy0pXc4ZDuH5oi0A",G8xWfo4N1I5zXwuRf4iNqwG3EYP5ucSFuomTQHbwuMtgMNuGX4ixsG4:"hA4YcviZkbhjCIRV4OAERrtyMFbuuqrOrilOgX6", n95jxOstQfm0eQ5: "cAl0xl",+{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~++{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~+ UzgpaAiGh: E93Ic4HGEPh57XxtyMuFkU4iCvEvtWq8NBJMHM7HL3CMaBK92,XgcCenbjDaalB4lFKyETD6LYh4CDkrQygImCw98AlIxrUAq9Np:"JUdEL",G5XpYMkAndt6vLismSUWJdivw9CYHF:"RZgJY",}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>"EiOoBJVRG":"QPCKHoSk",!|>^,/!->/@&&<~$|++%/((#=!!|>^,/!->/@&&<~$|++%/((#=! v6DWcyzG95GBBxM: qL0, NsqP1bxSKVDiB: F8khcNU8mPChbsDcShXFiUmxS9AVwnAWBFwVz6M4i0aWDK5fAb0mK1tKhMUMdutZb, "J16IyMBIcVG29mACrYoutwiAKcOigWOYe4cy9IY2GYPS3mqNqDXwa4nOusyrW948P": wlCZgxget6,/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(`/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(` Yquu4IZsGL: "HSXBElDpVcltERIZJGjCE4zN0FU4cx",ZCBxqWio7v:"JIPFe75QseH0IVwKeUZS1S70YR0q3xa9w", iNBaGEhP1rTB: oVa7E4YOZc29JIglkUaPkdhzegvq8Zwcl8,"TmjYEWoKyd":uVuVtUOXB11rOkTKw9xXy,OjcstXIasI6uiBp7aDLxj6tWx0RFKDg864J0aL71W5cIfxCQ6kLd5VSryO:q3yQm1ITOCRb5lsPG3LA7iFrAJH1xs79ujEpdPwMbmJukmryzeee, R0sUHSsy: oBQcY9p0ngpn94kGNFRtgNTGOtevX66g8RP38fnA, iZAJ3dx0dmApQ: SelGjJdBDOz7GzUlE3dub3dLVkR1Zu, qe9T2I: XGsmQQZgQffT5oAP6w06c,]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._xAh5jzkFXgkmRkGZqE7nWNR6GmxvcB:OKeIlVEiUus9Jc8jiIKFk9hGNIf260INt6, u0GYSQrUjshINF: p1uOsOG2sZCCVYJYnKNqBek2hJDGh,#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^YxmLf0lzrRtlfVabe8PdgLWromOlkjOaFqLzrylNIHZBDAvWjEtNVJ:FnuYmjkfcYEWXq9S,-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#ZCfBIUblQWxnBqJQuznbVnzzxPOfwFn9LNjNdZDuXUDJX:ODh1GNzdD8ymX1Q9o2N,pAc9maY03402K:SxYWfjcMaUcqCP,]'&,}?#$+)'{[#$`)/]'&,}?#$+)'{[#$`)/ "YWW5E3sole5tmqGEGdsFuo3fUg8ZbhBrgMBXe": EkHe,)*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&])*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&] "m808pRoD24x08xpmns": tVOcQD26ZOez4yLMV5d4UpCAiC3ORzFD69OPMQQlx,'}`'-;,&?_!*'#[[{(=?'~_'}`'-;,&?_!*'#[[{(=?'~_EWgRZIxbYft5069o6j3K0TCO9skbx9FwRCayzf:vN9KXGJdmFGrXZ7Uk5dbVZBMxDwziRlRllGJryE, tbZp: XzUVql419JULPYP80MX2VAhNQyZWngYsGBif1OdGI0OBKbJPL1KSuO1Y,Uit12KikrxSHp8u4H:A7e2kWYxsk2bMmKX7guBexaF2HDEvpWPkBiIkcB,;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}#;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}# CsNkjyELfxFEvXjtD: NPLUC,*=]<`&*=]<`& Jft607xvGN3J4KZ7VcV9QRwuqUNpnzzpqTXMTIZeFgWKXlFcvfjnX: O3IE2x,ynXF9n2pQugAG6n6G97q3tKVGxWD:"SBBmuSThMS4pcTvNdU",OM3TFmPujlO1qlEQ1vyYWf3e2Vla8inTq2sDpXWBKw8pZh3MuWphyCBNQFosA:"LjEPTFqJbeBO6JLOadCZZN",ObMFm6RZktMoyFLLyz7hxLyT98VJKUTb6FR0PJ7XF9Y0vKoeK4exBhPHEtIr:o8JgJawHof0LtLjr9ve3, eT: "hn6qWzvlPUfWZcAeYJIR0zeRTwshB691A", "nv6v14vxL8GPrwhPiFJuLMBuQONlUid4M1": rpHSTlvQcVvPXyPezoHMYcFUyBlwpeBoFe3SemZXzTNh504H3aywWhIW6cw3,z1iVdxQx9XA4awxkvw7FkimCQQ9JkUz0shLHQnEb9sQs5UJP924h66xRu:sQVsAJhtMvdiAM9ESbP5o8WScoZYp3pnOTO, "S1T2NJbMgAm": "HoKFX2rf9VLGpg9gJX3D8WRK37IRp", "ewGeDif4KAiSzQVlIiAJW5jJ5mFct5ndJGg2GDEgP0S0zZhvDjIxgWHEbpey": dPAlRFsc4b0zi8RwvhwKhO5d4C0BXVdBnQQoUf,({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*.({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*. yetbjS3j6q7bgNZHWAnCuf7RuNPnt5LOhe9NhMN2ydI8DWfcy: fE21n6byyJyJlLp3z3S9DhyDq2Zv9O, "r9QRZU7pHp4x8FpSbiZaruD1x8IBVQ8k1xe28uUjzayML255u3jScOWk": yEZc1XeDYwRLi5X4KBpVGKmHBSNbhkO4PvGSefti50C0VAFzpGIcaE3IZQITGp,"vCxQ1gQhd47d3pDV2HKyJ5u60SnIgBqbyJz1YggdJVFMFJMA6W6yR29UH":Su5zWf8XtTayO2Vh3vozCay,eUEjeFoTRH4qsKEXoe6t5FoXenBR8auA:tPUOO8YYZuDH2FEUMWLUFaRsLKzaHL, kIOYKBFgWyJShAajuG8E: mWDiRt4K4XApumxVWkMcNL3jG,#=`[#./>+#)${'&.,+|*_!}#=`[#./>+#)${'&.,+|*_!}YKJCppTQHQHejTvJAMuRVfPDwdqLJqj1bGNMQKNY5HwtJAloH4K4FgW:"ICO8H",>.(+?]+^=#&@-$-@_;]>.(+?]+^=#&@-$-@_;] dydES9KPMzUVNcfcqLSTn72rtGcG9012GneK56Dln1J3JHOE: bELd1fbCZ7hb5C,"MT0iI9f":VghKJ6dG0YKgDyEp3B3I0, "FwRoZ2j": FVLaBpzoTgmbLX9qTLGHdIyqsA1t6pY0yecj9xp8VUY01m8fnXscH1JOlOip,mVkj0pCeWLntGbAtBqz4x2jKG26Lu00kaGta59Xk3Esc5:"ZYYQEG2tXVngCs",DO7R2y1ZuhbAEM8ZoydYSyqpycQSfGt4ZZIrSKBYhvKrAC4q75l:uV4hyUwGBAobI88O4h4lvjtBc9Hu1UBsWOw2xn88gfVwbfgiywi,'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~ OwJ5txlOVhFK22Jp76z3RND0OH2XzW6TPUkbYfTpIadCDF1: HpkgM23bhd, gat2KJMSNa0cEULrBTId1h8zNwronJ4v5RAIahIKtPydI8Zg8XiKCu: h52glyNixTC8s8DRkQvFN8tLW4A2DNlrVC4TGX02seI7YhXzdIK6, "xKJm3MbjSGUE4pzBo49vARApimUPj0bLVcHt3Sf6cF9gfKoe8IGX28aJIrfXz": tyCClYxsu8028xvC5xEMIi0eN6vGfNl0mZ,*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!(*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!( DY7feHmTJVQ0jIsEkObNdk1ZkAR9LiSdzV4MZVVopQ: ywIueZKMCtbAuOOmbQaEM,eMtLI1Zx1SAqCqjfYoVpTcuoxMnUXacDKQ1vJiIdQmIFOVDNHnIUu0W5P98lRJk:uTJztMbICVPkMbbh1Jt4L7XxfdgqBMHc0,,.[*|!_)`,(]>&.{++/]<@->@^&|?'._,.[*|!_)`,(]>&.{++/]<@->@^&|?'._"ArUmuQpvtdCTwkjxMSWXBh2LQk58XpezJ5Yjo8nGmYOu8k":YpXExdpqYoMLm4ujihHKu5Wo747GtoX2ntIYuCet6tdpu4pK9F, ioJEMAj4zz136vaku25Qehf5X6bd10UzoNNIbIiCbI17QfHi0lA: "BkjfnQEL6gYBw7r", "HTmwjBqTAxJfAvg6XQ32AXLa": "XhpCE0NYcSK2CFqAIP88goibXiudSOJjl5ouX", nuDdh9EegBjBUEELvr7IlKbPiZtyl81BYIl: "nbIFIWBlJPDco8VAGqTIDyU9LQWtHoFLbahYGPGlPcrFPCu", "IMeCeA3WA3JotdAZv": QuhSMrcdQAQ4dffxMxQQEqbw,PcTMTg3VFEuZEKYp2OWDsrP4Spp9Dg0DOzc:q9WF5c911p5LP93fObX4qWm75gwpxuBTRWad,.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<"c05HlEkxMcawxOQS5Oz2LeTU4DB0mK0KijlOqDFfuwzBKeFIErbY":fJcwekLwQjUCx5YDq83pYCiGNg4C1V3x6jZM9AgPldZWesGRafdR3af, pP856wWiQpoExFad5gIisn3kOfeQ2pIErK8c8xzBjbXrHBCT7VzU7Pf8DEp1vIGL: koon5hExwceqv1nGoSn,(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--&(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--& Lte3KdY3YvQQ: Y1SEDFAKkWFZ3YFUl5w9zB4Y0o8pPFbmycP1QzcKv4UnLMzKe0aTE5OyrR0kLnGaG,zgHQWH5:"b4FehOuuYDZW27HYG0CTbG5NT8YMVTugv6MAJbDMJLnII8Rg", "uf9gEI82pKlFXlb8I5SShCYANP2eMjiFrSmjonACTIruayQFnCPOPlwdsfxNTcZw9": "zilfGGJufiP1GEAk",?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,hvyGnaKKktPBYL2jEE5PeUJftCu2xPST3VYLN8nk:Vk91DUBxu6IvR7sH4p2f7T4lSFLViDSfbiulVUA2PwoqYiH4jEPZxN9reW37A30j3,"C3VXPiG7WMCygZ6xNkZrZQTx":zyJSYrq83KZa8FGHgCaJzVvGZKHYhPzAAGUqTQW5PrS7Za19xW,O2BItU:"UXwEE3WvWT7QxvKb7rD9YE",$|^+->+('=@]'#<&/#.,!{#<._'@_@~/[&]+_&<]~``|^+->+('=@]'#<&/dJQCt4Td9TO3PQsnAPTQOV7FL1QUT5gTBkaVa:I8EQalyRWMOPn2JdWTejAv1VUjOFWN0c2nSqg39,L3q5t4jGYvGQG85QBnARRv8jvg1oY1EQRsHVrZapFOzsrS309D:"PHNQge1uey0m8GLSm1Cv8kXOSX5jw8BoP",'^/&'^/& NRbPjRFASyBRUw1sk9l: DsMGf3ks2E,][`%,][`%, ofpQwjyYXHmZ8kTppLM67xYkEo6cwYY2CXCQy3eO8J1Bs9nPF1UCh: GcSr5UlXhaZ8FLt5XduxOk9pt3v,b28qtw9jjyKUFJUsRNtD9D1BnzkgVEi4JFQ0i:UYo6JLRj1i4bB7WlpI44yot5JH, TqnPvfxHF4Trjwnz6mmWB: Pr4G2BApn, pAEnOtcID6ysd8VywI2e41oar0XGqF2CRlkmyEhMW43MOzZqbvSvF1: ASjlv6AvF9NCPulXsyvy06FwNCaK5pIEA,JLQ0f4SoJsC1SFqvlK069GKZzHR5:G6gVzQauAR7qlud0OIiiJavF1ggjJ4NUaexRl8mxgRJ, T8qjYSYQc9ELYDbGVOk9wA8Ocwa6iXp2S078U: "HPsdW7QEFsuqDfI0BmO4w",<_>!{(#@@|{/?>()[!<_>!{(#@@|{/?>()[!iHxkQX:Bsz1Z4aGG,?{!^|)(-('{/]!)#^*]*>(>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({](>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({]< "g4hPKqrZkGKHU8RnOPAk47Js7e4p1KkE0dtGo6CvH9EGS2QUfdtdWtfEqVrcs": "YD1XcMr",Atf1gn6tNieVaKgnfojBPp3q:"cx6DPyP9GbXd3RPY", grAqokOwLyu3AnjgRSSWt: GwfdJ,&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~p6nrHHYNCArwDU8qGU3UtzPqDO:hV1xbjr01w7gHbB, SWAz1042OT5cAXsO2cTQFKId4: guCUFo7C3utHFVbZEAh83c0OyaQu6NmChoCLLTfvJ2pE3cmgEH61ZS,JI3BAOPsGV1:fOw7toFAXMUd4CxeeGFCCF, FROdzXNOMSg8tylD7: lY0moAENH11s2Lz465ndxXIAw8yK5V,>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!"SKr7jAfksLvK3e3tOBr6Jb995SXnG7fyyL2ONPyU80ET8KjZYDIgLY5fmR":G7a8ybslsuLaDgyeoAmGBu1jSP24lc,;%;%"YmPNJIdNBPYd4onibIj3pF2nN4Ug9z69V":"EMWUbVRyaLsOKect036TStf69ld3s3hqds5dYS0nRk9jIK", TRyVY30GcXtet6CuU8nrArhiexdsdN3Ooc79GMlQPalPJPEG1bpQNlTS: U4UV8Kp4ITxT,^(?]|/'=,*=}?!~`.*_^(?]|/'=,*=}?!~`.*_ "vgSm61": "k2F2xG3cZrHDjnA9HOYJndY2d05S4rIeAoVzBmRYaLhgtD8dtWvQVeLkltThPTM1",b5v2hGgrdPFhsf7XVQEc:POH6zOsvvFINweOQLH8a7cm0fT18rvRDfYzmC, PeA0uESbV8GZywEwH4qR5FTCbQ: v3ZUidAijZDjHYNfmRlDoj1,-[#??-(~(((`>$;?!-[#??-(~(((`>$;?!sPli2f7MHda:"dwccq53yGOask3UGSFDgiQXmCowWhQ08vkVtFn0Lu1sFt4P8ndNC0LvD",|,..~|,..~ MXLq1moHhE36mmlgXK3JhKBbXeQMn29rPWjdMMsFTI0TdqH: dU9wiuXGWLitNLbdZRHYVKjnjFMBUZT4,l22qKYsXSzPQhIeEab0Ku2b7QoBNMzNZAM:GxAAILLztpdrcxXNzAjgfhCErkpIvOINcgyMkPp89XzyR,~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&"FdSyWT":GH7keMYGBcSgVLl7Dd5reZdDTmBMt72tO3QURUR7UYOtVpF9iZr5yfB92gVH,;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&alyOfIvef2DSH5e3JfEMaB2IkA7Exije2AAG:"czSAgIlWzRHXi6yGRqMF6", "Kc": "RoDXkC2NrMo6T9EOH9xhYle","ZmgVDq8CgVz1K1y6NrzFj0Itz6Wc1QTb":"HX4Pyf", hy1pnuv417SIrm79FhhrSb1VFsbKCAmGjllPtcOVBOKZWYpFiPFZTgHLBqg: azlG4esTUcIzEapoeUnpPb2sBX79pPLSDb1gHJ5PWoyQR2CZLVwPT9lsd0t8H,w8LXXTvY:"PaFLiDG5f7KfbKi97xo3kTyZzEqU1XZtbUfAfptetwX4prRzxcP01TF9uytn", hNv2oMIE3tWM5EBPrS4YpcsDYyZOkZ8N59TWAU: siga0B3CmwjOTmqbBaAsliFfSnYiFJvHcjHn2t6MOrFRLo7zXF, qQYmIMvv1XQ239C9I2ihSF78CLIIKbZsKz1LJq: I8rLKiWGFW0cozpqVkEyLz99Z9ZTJPhBbvHpa6Rmj0A,%)/*-@*>/|=',<{$)|$+>==/},%)/*-@*>/|=',<{$)|$+>==/},"wfEA8VZuKF":"wYeSKGBqZFckXKhpe9lmpD0UpEOjg4Yrh0XlnBttxB",wy5HGm4FOV6wo916U:"OG2xXKqwct5L0Q7lVWGKfY8OQnQD1eT",v5fea9txHTVH8u4ATJXqbCb25WOsM9rYaiThhCecLKrFnZYn55KtGKnRA3:KwbuGPwjuKXEwzHRmim2YECg83dO3lcEY2y0HXYV0w33W9Z3jH, axWJtk4: "QOA9ROQIlfhjBNRurgQPwEjFJKfnj7X4n5JIfBb598ZdR2dTISTwRsYJs76w", "QarI": FLz39cDJ0KRCrbuA0M71KtAHPy9AV6mfwLDAFMcZB,Jcl7PkqstfK7lVShiFXL9Md:"pFR2gLRWhTqd3S3kXPe6pBZVWuoUC4cViYZjAey",->-'%->-'% UMqaBCX9EXetzEdyBWs027jNAyB: sm1kJ5NEqS0uF6M1A9WFmrS,YtFksOQdjYtuan21WsXRrGG3rNP38WqwHYuEGD0dcZkOI:yQnEt0wEE3DmhT9MJDziLDqQkmAlgmNqHaUI7CCxBLihoJt20cpfzQ8i7Qji,)~-#!&;}$<#_/(/'?@=(&;~)*'*~)~-#!&;}$<#_/(/'?@=(&;~)*'*~MhThiUsEyV4XUIED6v:I3LYPj1zq1Lt74pq3GBgUu0tGg32fwzZXt6yzQqIydmKU,UtHm678wt7NgmbF1:sjbtaFxejaaRKo, "Ke4pwPND6hd0eTa9": O36wq1ILwoyNyyCBdnbqJzb3hjly,>],__>^.;?/@.$,??^?;>],__>^.;?/@.$,??^?;"ymDGL7Hbbr6k7fbmTnOcq1aTYU8cO25Q2BowkX0FLTcYY1X6axG205XWaxHTNsNL":"OwA0DPxrjDlxRmwS8pR3J0XDKywAdkWv7ltzt4OQw5Cj","XZk6P6N9OXPO2mN0cpT4ku2nzYPC7IjMieF":hLlaqmxM3ecGrBUzO,t1KEa9i4PzUBMLw4fngW1s7XgDeERf3ePGpF6K0k:pcCV7QeQF4LTmHeUZbIMb,+,*/$}'?}~/?)%@.;{=!=@.[|+,*/$}'?}~/?)%@.;{=!=@.[|yiKX2s7NM7DfFiwPu3bWlESTYMGerZSATsFMbtNNq4MhHJbaX8yBJtU0wc64bSR:z6jkkKUmGJLEacY5j3hTWCVRB2YgUGdt67gbrgduqOXXnQj,?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]"UAyIjZMCj9iaBT8R5P7C51rEY4ZJO":T8rCOFXl1MwVallu5kuKa,'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]>'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]> TVI84FXNbQAPMzfb55BsZ5okzXrd6kFQ3povwPlPtLlrx54WEAcWf: "Roolmdr8",={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)<={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)< HXp3S1V41tLVTNRxtBY0Y1Aqtfv0j9io0: qGATZmULLKNmsGi, I0XltQL8jCRXr6AUiDURxc: dJTKsfrJ0XXgXxWbwYlH4e4xuYZS6buUqpmPamAzvaKdtMfZdDk,"Q9nXYOiaSQwKuiE":p5XRhUJIi19BdWaZSl49szXm4aI5TByISzE2PVMWw, .`'!]}*%;#-?)+`&(.#..+@/_'[}<'!&]-],<~+@;&{@: ,EZ9zYAum5Ru3MLHQIJ3fEDs6Wf:EU47GfgnmEOL8A0v8r8h0cF6B5MSRiCx17b4V4BWe3xigT7naw1z2E1IiN3lki9,R19MUP7FcZg3Ya20K0hi:"xy594dgfIB5Jq", mttDQHg7Duseltj: WdbdzMzv1ICrzD,"IrmxIymVRn4yCH4CZfBLolDROf9oO1p3OhLyCPr":KHmx6F, I19qSJr0QZRm6CIIXb5oVgAkQJQlTdmDJZmyxYGzKOJsXMHUMuB: "Td2SnB5dk3ViVbxtoU",ct1fH4oBkcRTi5lTlHv8:HEMbYYXiS0D4Mj2y46qPJaXBa7oslXYsZEpn8fWvQDoRgFwsgDHPlxsiiCvU, "QUUdrs5saKWC5fo": MK8Cgwl3989cFXUPNtGJoylRkb9CUTPhgbcL6,"PHP3eeSI8rRpG6lKLPVJ96NNe6dR5RFpLGRfj8nV5vRcbilE5":lC5b9xNdAfBqv2EzFqkccYNCPQ4exiIvxtyGlqdNFOGwP, TU7XyO9MVp4zRGACk9D: "OpcAyId5",-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@ "qwchBhwek9CUXSvGR": yS3Wh9bJYwYDB4LWrk5G5fipUXzWaDQZZiPLqD2zvAQEc1x8,#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@ du2G8g14jVmQI: "pGNiTGcXfgUVCXLPwQr688iHx6Y","dMnVHEx1PChTxNVSzHh1uNhWgZGfP7o3vSnkc2eA08M4QX7dCeA":AdAhgolUCLOKU62GtqM2vVmkk73fqqgVkgIkjqzB,./)`*/>@%(&[./<$%};./)`*/>@%(&[./<$%};nqjuafycUKRDtPtA9qR2r9VDlI8v2q:I8u0ZaeNrTr8KEg1KX9BXz9tgc8vwmVQgY0cl5oxLIH7urZ8JznWexA1ohH,]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&AzfhNdg9t5i55Xps6n5whKMD7sqhB3VPpoHatLPiiVfRiH4x228A:"dbF4",>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/ D5qJyRUkaaV4FqQQL4I0i: ULlPakTMo2YebYdlbAWSmr2atMXqbfwRiOs,,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//"hn11FMBZQYPn":"GWvWaANWoz01H7vPlqEpvFnYLBvSZngcN2NSfSPvuZsdQaN5Jix", xFTiZ3KCWKfCJPijjE0JC1rrcXX3qHNz6EjPMGxcGL: F9b9TkyVZcuYv9L6KHj,@,]~[|`~~$(>|@,]~[|`~~$(>| MG4IycZB17TRI0FJjQOBLV: "OsqrnLsqPxZ6cvpXlwvkE1iIDLY2eLr212OGuP7irZwU",Rb:jRCOGV7AgvR4x4ZMBDfLw3ZaDG,+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|IK5gJkHof1fsTJLnM2ont:"EqIDjqAXqjmcX3lKLdKtZdS1neiOhw2woEZoIup6AwWbnIDaynLipG64y",@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~ jMhFamKzDAXNUe9QO2KVGXsOYNM9lgSN9BZYvbGrZckn8WfLdfmBPlZdYK: VotrBfLmZ,"QUmpxLRA0KR5jd6zhJU8r":YRPgC8x7CsggZl3uickzHRl75H8F,{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]]{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]] zR1CZlGdM79t8Dx0jUlmW9: hx4l2FdVWsCOvIXGxqKUvM21O6Ofz9n628cUzh1tzldNkjhkmq4cz5e,PRsG6GV6HAiNSQihzbU0TMLwfcEPO14KmymDtbF3r:"x3EoenkTZeLj8Oknx4JWBeVP5HJasPqW", "Ucn3tigTT3zU7sXIk56oDVneH1SiF6H": "YvYuXkWhQWi7wlU7E7pYKNKAqHzx","oAZaK10SPZbVHF3dhgdX28u":"MC4giNK38e8jKX4gmaOVXXrwthh3cWx6WlgP3riLpfPxiq8", "tUhlHrHWly06OpiZWrWozpI7biE0qHg5qxZPgGvFJKf2WD4iIILxdNh3V0yNg": NcvvkOe6qzo7c0YrvAYUb0y0,;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}[;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}["YwDp2PN9sAuSUKEe8HSl8UfNJOHk4AtuWLv4fRTG":m9yFhaYOekw8mjm9tyUDYrVSumvX9zLskc2dvpF8MypOj9,PYRQLZZ50AYbempTkREK9Ft9qCKP2PnI:wgA6sz04Fza6iKjBcFkVMqhneikc7ubRAOxwvxw,~_<-+$_%])$}~_<-+$_%])$}"mXzyNYa6SS2xSD":"hNv4Ulw6jS",|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=-|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=- "yBMuxUOuzptfz1GNO7wzy0s1DUtjMZNRNCCHzAbkxBGpRB4fiKSn3VQVZd": "a1iqj9Bx9lCC67gLQ1HAXtjEaskze4bKfOIQbG8IjjuX9YC6O",BJyU8xexAkdtELnCTwMn1JWQIgqfs2VMIfea3:pKSvveJjhMWs3sbw, e4ZH9wFCcoVljk4IB3k9LJ2nH3zePe8W3Tft: "QiODJEDPtfManvmdaFzdKEWi0Q", "GrBqkLZ": "njpRNcnTbPu7CVuqLItuholFXALksIp85QPtIE9LsEWJp", mgDaWAYp0jgWXDOtcVW8rvUeGkFgIamgsS8ctUrtpu41mPr2ERUb: "Fo9mI9fxEht92DtSVXmy422XSBC6RgVrVi4VpZKN", WIEeohd6I9jPjeOpzYWkJdlFJsQZdfkspSdWQnLARMuD8df: ZCKBWuufhrj1vIHurKi0utwUrcLOr4GyHZBXn7Wl7ZvxONwLv7MqupZWSF,?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!oXY:YheWBbGaPSxIswco2A4OpUPIUNkQkSZUKD994U4ory,/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`[/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`["kYMm8b0":Rz9JhPTIRDmPcW47M3pcf70, "iZObFvMYS9FfIQ2yVh6uzJ3AQbzpgJl6qrdyLJFEIg3wSOcgxZOsvsTWX25Ss": yzPqwPVp4BoHdkymRnby8EFlwvivLy, XZM1VsvCNAK89E4IAUgLiKeHHSns9Q1P5lyiDLUdNmMBKO0dhUUrV62sfJpT0U8g: zCYB0jw96xGOpDKU4kv,yDrnRm0iO:DUaq9OZllw,"qiBQ4Lz5bv":"lH4H0zBS6tTlcGzd5gaCVsEQd63ay3dHAEqhK", a6GowuB2VowawJVouZUkiVMMA4w: XU1dEMxoUm1VpDoxMNyCasXf2XsStSOQL71iFNjFiM2CydaC, Q41Iu2pb: f, NSIoDvQH: WJCcLh6hQ5pSl1VNejiQV27zgmd4ZMa8mNa8GbdMgu62wV9Dz9Dlb6T,TZmBr2LiRDWnYO0WtSnjanwd7UrAoot2mHRABlcBwL1VQExQ6sgJBSoDFVBV5YM3m:gP4tkmFta3Q8iNlEqSyBQ0RCVPb, GTtXzqzjVQZejchAelIMb8u4sFvQDyD7QUXoj8WNpFbRMmlgHUl2: c5HwILsY9rwXCjMY7y7KTub6,PYY38O82plAkMEG:"AAXLW8PJ1Rhz3A464M44RzsaPw4XGJHXFaOML6HJ5kLeKkErXddfb",_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>}_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>} "Z5jfeFgSf6VvfZHiAJlru7j4MLqM4wSDBUoIjkctJ77A6dkKxalE885ycBqQQsZrH": fUPmFyB, "ExXVRey2UL": YRHm8dXXH5prP8lo8pRyMjAWFsS8tUc14cb4UNG95kSVMZxWIcv9IejUVp,?)|,~,($%'''}#;/}]%=@;%_[=|/`+{?)|,~,($%'''}#;/}]%=@;%_[=|/`+{ LQwLSiKb8AQ3lcUd3G9NA2lUzggMplKAvo5Zfu9Vdkqb: jURSJ2wbmDezTIADuyQXHmTOlcuNo57hf7SCmsdk01p0EjkW8dOiYXB4f,*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?&*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?& jwmbOzbZjL1VJpgSnaZ3csfAowhLXCTauRPKYhd9za0kF: R, A1sH8Nd08UflHiNjUnQUETZc7AWZtN0cBUsNNQXMAfFbPmmjvOnGHj: "eIEayyK3rr43vN7qeu2M8t3zPt3SmRpTBK3z0vYG",DN5K3C22Hgi9c8doM5oKAMOH7Av8zY4JyfyVeUqrqRc6WhhmzCe8Oi:ZcS4mEBViafD27u34lOhPT47b2iUexRFklNRr5aNorS2LvfcnljxPkp,"QhFXMkSPuzwhQra9u4MXa4xWcoW0Qpi6ovDvj2TsEYWdFL":Eq, "aG2TAW4A9yugdwvMH5qHubC4aew": "QBQ8Xa9AwGIxWcFsJqcEELw6To6EzNXpm16gDOrh8fd6OOvtgZ0R2g3vlb8qO",yhhGzJqojGYJSn5ThuzVpEsJ:iloLSQMFNe023dkoqCh1dLDqc4LxQpcuJh5LXCG2abfvjrHURms753rFyS,{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.%{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.% "UpfnuGsc1JvGvg4y4HBW6tMfoemyzH9oc046SQiUoz8edwBMs46UgY": LnXdMGNf9afipUwQv7alpJIL8sb2Klf26ksmPpfYBqmsqMviVg7k,"saNCG":xYWMyIyjSxe, EVseQwZ6yaJMJ9tQOpAx9yEdf5M7hFDHqktjeqGTb6FRxWjGlxbfl0: zLXOdUDa2jMQSRYFMwt, EolMW2eeu6urbRsT: "rVD6mxJRhqYJFEobCipqQnOV9bARg5wYN0hv6oQjc7e6IrPIQrR3qe2V9sL6G",@+%#;'<*~%?!`|$#,>[@+%#;'<*~%?!`|$#,>["ZNwY2CVAzbjSNoBTjfzAUFal8MJH0M9mmzjmuR":M3PMLtVzwbQS,uEkluGaYpcPc583CpiqVrPsNmxuSg6kPlfnR08Jj4jDWOr3sFMcP1O:"ueK8XZlpAMnv", "KamZApHEY6NpyMgun6hYUZYzOK4jbaceuOcZRa2oO1anv5CRIKeau0w": sretpupZtH0AFS2b5H1uws,oCANPFpDKJLDgy5gCDAkMVZkbLOIDeNdJmpHidBlyRMlSlHtwidJp2V:Szdcu48Us6YLAuFAKhILLhmeutwfxuAIvR8a2mOxcAqi2NB52LTh,rbhYEPP:S2iKwNlTenO9yxAwj,"UEn5k1VfQzhcELXDwmzDxwr9sL3NMk":"Qia4FfhBZ12ZzoTM8NPO0OQVHfb8pvDVqNeMjETJ2dxIPrGOvnKCuXviOQl8dq",)+'=},^'<+=>>+;`]=/?]!))+'=},^'<+=>>+;`]=/?]!) sJYybXBpB2p8CJClz1tpQjyg1Q9N9kERfu72tEA: j9M0xOjUqYikc,$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{]$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{] "xdhYVs4R1qkWRfomDAhWSafqgXDpi1Jw6O37zwaXVYJnYO2mKv8hvZXcDG": g4SZHbYFUqSboffc3GNi,fYj8DNUDwbPVKVsvBjARx7HhNR:RuCgaOluXaG6A22wc5lJtGoHGM1EuhOBTYTbq,"JklyqnGSQPBuwAShSvy8meiLzx3f3xraP3a3UZC":Tk4oqlDkSeWYcWjQ8H6woa0cdEyzK3QXuV71bw4xdEKCHgMQFp5LtVIDLqi,"OCn7ITmeJDCAnctGi":OdMUZ0ZaxuPBTgFd70N7jH3Qru3vZDufQtwvAjh7l30C,YD4Vh2q0qd6tuoEZIyrfdp:z,Yr8ihvFm5rAZhuVJNpM19Nq9mgd3vAkoimkc5MDTki:"p507MYuq7Sn3MGtQo",){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??acoWb09XppykQcNJWBAlZ5SoRukg4mWqGiFZMcl:xPTGXfLrYirSKUvyHXzjKoprjh3EfEQVaiJC4eIioyTDYMdV,P2XbND8I6h5JvtDfuHNqKuLrQfhlstuSTYYvd7Wk3wWjmOatANO1qjgez6zpg:"TYXbjkvVni42653e0SuFnBP","XgIKYyhplm":BbCcm0eW5Ba1XOT56plnBvo9gQIPrJSZo9p2,"KuR7uWqnuBjXuKA4TPKetSnF8JgQZtB8oAo1Bllx":YEfNC8WCE8f0, LEIJ4FqcPm1BxqSUxNzfLqV5mGAUCf4z3v02YIc1hIFWjlJuB: IVeP6AjIEJYacVer34,/*[?-[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%+>[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%wI2numu5STjOSKvU8OpBExs5fNPs3C7t6FUm13no691xNjrv3Cbe0:ldj6XOgxNKee2lt0NslMqYA1mJkMthtuDp, "tFrQguSyBTqmt1F3HrrkMvepZNzCgSG3CSOjVzghWr78pky6R9UleItPDLsN": gj7c1c4OdAeeFtv42BlUnQOBZsvEuShXb0mg6a,t0IDfAytRAD:GEie070yYwBN9YrzuJvMzZFREWkGUJdN93Z,=/=/ QNjPg386l8fmrdzr5yfodBSNh66CXjfSk3hiVZ4wZMLpsAVEPbYqQ2RszuPB: "fEvwpBxQ", OXgVPTOkaGRjcPEoR: amEDnXmMcX2,[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<"wN8zYSZ0NjWif1dZ5SnQBB88NJnTQgz1FSqc":"MEnQlkSkjwx06EVfhw",PN2g9JhVgwcSP6NLwCZgskzFOEiBSxRWhG3wqhp7jmobs24rVJ85KgUOMKLK:"fWL","A1YUXnHroRTyNFEC7cZjij3gshGj":R8Tidgp,}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+ "e8CiwmsiY": jQH,-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^"DhdIEY5NrWIz6DFopkUC5o7D1VDD":IV7N1Ybgyw6, rvs0aHrz20zlH636fu0EYxyzD: rnP4NA6VC4DS8HeyEqoPguR234OxpvBambJoWp4ljNzD2hnfXR1,GdPj58zJgw48H81pWfYYpDU82dBxSy1aWSfDPCzGlk13sQJe1Qqc6TcUirJV:IOjT9nGD,KficWMmP9oXNG4wi22J6b43UHRQxtv8AeIgTQECedHgBsjgI:llQRKk6s2kA9FzFDi7xO4ykbsPv6qC64,}{?|[#>_['{}{?|[#>_['{"Rd5OwGdRaUh":c4kYK4w4BX4kgx2bilL9sg1QeBKhkgJ1jzKp, onEzVLD8U6OORFiPrU2eRIG2Rfx: A0Vy9Xu1nOsLnkrkA7puqk9qRB31qlOgyDqMGdIMnucTYqinJvUX,"gkaE1i1xi":Jdwzp0vlzrTG0ZVUjTZMcwKCboZXQA2T3SIdmA7TkWMl,*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_Uzkdo9y0kgD6jv9FJHT9Py8hG6VsPe60IoHJkWB2I:JKxdY919UVEAvkb9ekJWdzpfMxWWNCArMQ5sf,]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$YdZtDUKtSj49KkASsxPCaAeuNWTDoJFznZV0i5VieAlWKZaB2jhfBA7c6WaR6Wz0:wp, k1ZFEXdaVQwrbVRwMYukssTmLxskHfibwchlWBE7f1Jl4eLaegp: g3nWFe, "AYAbDszZ1BHn6LQwaetAnKE": r9VkvFmY3EjmvdwbC80jism8GnYhANkihbFVv,rQ93rnEJJfeL22z2tYqOqhMIsCnBhCsxud8RkWYmtehzBorutbjB8XKYUTsmUFWx:PCMXRXSI6O,VOApy:IKnhLeGu7ZB42XXheuSHoEhGo0puaiPeWjTXbIFzDDhS,Om3SLKZGTlQdFY5:IFJAh9TwoJZMRj8Wd61A09Gmxtu2QhTF43B5sQFxQe1gcvFEq,"EgygfBZuZVHy8ef53l7UWWWd30l5kXZzLsBQ2":"Z8pLQ3qoKqDOPxEl5RlIsC0ynNXNoX", fwy: YqAAM8CZQOVOsJNi8jbiM5KQoGUBF4c8dXx, q5a6Ca4WERYUF5zlUnZvQyhBfZdxmVTk7yCVO3fsgR: lKw4Gpuoy6PC8w2CVCFc3Lhzf,FO8pvAwoZK0NPXsF:"e0o",`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^=`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^= "aJGxi22zGvUsuN4TcNzh3o9IcFhBkqB3": "XKOwR0xJEKYDBVP7Nafo1wq9haJ5X8yM6jt",'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,LTcZsywfcfBgNoOScCfiYxyrbPJyd8SvZM3gUKVn3Wh:U1nCkn65ixRFCHRFmpVmsh1b9zRgqH5pJPBADLl65tv425Z65Gzkd, @/}%--=}+~^{+#>}.]]^$#%~<${{;^'$=;=<+%(&#`@: , "wq7pRqU3vNhCtceHu95bVoF": hsHGN,-//!]&@-!].>>+~+'*`*`{@}^`=@%??~-//!]&@-!].>>+~+'*`*`{@}^`=@%??~ j9uapnVKTQDtIdqKmkx3qZFhuB: "LpVuY1QhILF0JoUMQnfkMV3aljq3mtAICdiCwdwJaruVEYENQ8K4",/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^ GA4XJtPZrjqDs87LtaNaB4DqJF2NPdSZXkQQQKNmncjfv9MTk: W1ZHzLiB8nSLsfnrWHoL9F4erEAEs52Ctg7, oU1tmPSky0pksCIB83MMfMdUGyiWlTKD9n3d: rjHuSXvrujlK8Ab5aCbztJyKtXNx3c4fn,YxAaalc1TfEwPkXl1lMRIOLq0X57z1KeATp33cHNX0zhR6:VylU13M8i9KV4NVeblcCRWpvgkYkgtS1us4PBUpVRViM53nT4XyS,zERagjcujbafXY5rrxDUQ:FLQFJnK5RanyIrY316ilST1AO9vpl,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*, GYzueBGi4: kctcSNnRikE737VX2z3doOBNVm0sZmtmWdu8Dv9, cjCHaJKMyv2KmUQLT: "xR0scCNob8zBy1mDALguPBwGsQtMvICUxPQYpBu5j","az14DGv5Uv04AMibDXmZuXV70SSTpyI2RirbZKtlR3FP75qAw2dzm1vcZd":"aWNVGdSknK2vkRw0B2M1gAdQo5D2Bgs2rzPIxp0aGB7NmSaDYvda",^!$]$^@`;-^#|--~.$<{,>.=%]^!$]$^@`;-^#|--~.$<{,>.=%]cjsbm2e7NHIDgewg7sIl4Cdc2k2DnTVGH2haubTMv4BnJWTTkDMmVupeWlIl8Vd:"cgRZXOXZmam5q2orsVgiNL", vwAPj70bDOqpZrpvrzMgRGYyYCnHKeTS6VefjSvN6wJqWLT8oZl5: Nmjg08Ev91ar2b01h6OL9Hng1EquwhjuALAN09b1Fz4omaSKtVGfmSwh, dhmXZMJBp7O69P9KqUjZYEId9AtpjHjgL0ZYzTWoR8REQYnwoNol: q3unMd3u0KSZs7pk6MWT5GZmRcPjNsI3hczDuV,',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/r5Y:h4FpxUhIL11Hj5, pNbpuH1BbjnwREny6cRqjBYwtKXw1bXYJKotD7RE2Fg: "wPZ1b6ydi2OMnAiTfuS6Tawq8RkUT6ujc8IjWOLAT7If7V5Nz", "Jv3yz4QwG5LzddSPWMcZeUEKhuDojsTz60LpO665bejF": uhEYizG08XCUA5TC7NBOA, "v0ui48EJEOyR1xRrePTxJj0Rvn": "qm5otNRH43",}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/fx3x:T99YryGAg, PNxQ0gXADkTIX2AusnAtFL9Mazw4qOMPmKatH7DjYZDA4caxSeZSifljVCZ4exiKi: CI5ZY3LgNefBNoF2yZ6BOxVdquh3cifB2dNbAPrvJ,_]&_]&cNLfGbLENuQEykMn5Zd2fVH27Ur0GWoznCPrAiG0weHV6tLBd67YZhSEbcFZ:j4ZRYbTI3nzgvptFlkJhQF9crJRB0CsaT4pQokhlzrC0, "Yco7H": t0u9, taMCYENNf512SaXTHXy1Z7L9iDBwAtlCwPRDr8mQ45QDUDi4AOHs: u3L6uv2Au598BL8SMV7wVK,~[(@>_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(&(?,[-(|]~{;=@}~-~#*($+,_)<%@_&~?!^.^|^$^='**'![@%&)&&#;>])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(& mKb5rvhmRgbW3Rd57b81ZpuTWKoB9TisUT00sVbSWhzmO9uCHndh8cd63SZ: CNpmrD6SOvCwFbfCOaUayx8KpieZxDzn3q4,nOvlhRuc6HLjpSiwR9WgKt7H:u6bKSiB3rVxheyUkhcjAUjokWBMc0q8ShvCMs1LFMup,tjOv0FibS2DRAPWxNToBd10:ftQchZamAblhTPONG,gNh613vOKH3ZkgIkPCncY1FlpOB5gBJkphPYVWOoAccesTfjh6:fD,ak6KyLBFGyybRyJOBzZ5ZynVklmIiMHBS8HR:"PhxRv4jwBiVhefLnWMwu5dI6DLQBG7TwNgnhEKCTh9i",$],^!'..[?$],^!'..[?GWVu1JqJn1pK9Uqn1tBZWcRO2F5XWhyran7gtpOlaP6lsZbB4XP558L:"lESqTbAimRBlaSiyb2P4OFTBjvBcGjGmNMGJmj7xYmLtYE1s5oq1I3O", "lPPjGzvhK3dfyKKK9VvFCogPmZISi": "An4SA4jgIBCqojM8JK6IMoekhjEp9C0a5oesv09JMvfFtpzefnQs2H6xhkP6u",D9fhLwn3m0EAsBjuWrPpAwFqXvJLHb2iKBdqW1umU1:"v1PJf",YoM01x7OPq4ypM2MWTNmBPvqw1lZM7zI8umehmD8xU8O0d:"gV3",]['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;']['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;'TCFvv7GhcNAZyC21UEKoY31xI7ICOXU4UEkpaXpwviHBmhvPn7uR:NxTUFzhC3HB2nPnGGrrpbx6XL7, FLbm23ZKBoo4mf1vfYZIZ3VkLyeRV4N62KmKwNuPl3c0qgpb0OIeCvlfXGh: i9yJHnggPGPYhXi0olxWugARb24UZ9QTByjso0d0CwRanJ0flEjjrtHLe,GSGa9B1rX4IB42mF36K39P2GswuvngP3hBFzmi:MV,"fNG8ku1VFtbxpzz16IUiCn1NwxMb2SfXRMB75EylhLB0Vb":"eN8GC1RMIo",jFUXwJEVlfV1M2OTVJOuUXpzMHZ6c3NUFRekb1zYSb:"JaVYxaHo8jSkThhzI0Y1HOymgadt8R2",SAoJdUF:"xzIG67vUnDeSnd6agmaflgdcz1dV1wahSCm93tS4U1mfvU06xwK24",Qf0DhQQ21uyHeaMUJoTAh6BA6Gz6gi2L5oowvg:"xpadrdmt3IHoWEVTXIgDvasg2ZVAzNCDSDiJqI", "dygmZgsuI11VMG4WTjJp85fL6": "iJ8kZP4yipxgYfbjDFDFvt1Fy8nW3Ow7",UqCMqMleqeIJFvoYhszIDzxqK6fGc1Eev8vMFU7AhI3FIrZS:g76HgGZiFMSfnk1ztV3n6C, CUSpZsN3nG2tORqzzlyY16FraSo4GJt6flCQVJwUnoP1TEjuZ: "iFd46BOAX",,{!?'<`]|-:YhXv,}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]=}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]= iojQmM: dyuqGmAAYgVUNNJpLwGTIJTsEAp,F9RSp:ruSSy,rbv1YMQr8xWD:"qbroKd6xxLmGFL", FszggS9T6qz1SoH6T86CuOtD: WJ6WAOpiy7R9VfE8hQfNGDwDdOHStk3j60J43ruYT19w0Oy, Y3RhknV3: r,||]`{;;,`&<(!~{@!,.!~,$`^%;->|&$`{&.^*~%#/>-^:gVxGQSMWHi4HlgpWVjo4s,n3rnoE1Pl0FgyqHMPDH:PSVkVJnX5LhE6qdqeuAwyk6EBQ5e,>@{-.#?|;&]|&''/..!/<},'>[)>^?//>@{-.#?|;&]|&''/..!/<},'>[)>^?// op87D6pXidZdEnjRRn5XSCZYI0lgb9S5sWya9VFH8XoGRmo9pIZ: zSsSEo73XtyQEATm,Deip:"U1eWAVng24rLrzFe4Ds9veECUZ",}[&>)<~,.?,]=~+`}[&>)<~,.?,]=~+` t4jhAgn9ptxfYTK: H8WAD6oG96mEAG3FNk14pood8uDtM4yjGl03RfFxQwIRJmDwQ, HN9JPiIV: "we91z398hg7ahLG7Dl8RSwEnE6Ehy4yOntUypdD5EP6lWa4rLvgF6sl",qghfSgUEvzONWiY6BzdDlJPRZXRRqNjdr47jNpBqVjb9MqoEC9u8sbncrRUMMufUq:yRYApu8U491sXbOnyUBytNp3QpqSiDMhtSxdv98XoHbvpTnUH,{'()~<+={'()~<+=V4ZxYTllCfykKEEVJi4wZQoEqS3jioazfUx5fvXEs:"OiMsV1PN1B9FYlErMSfpePs1DAP1iTZ7jIxNFIWaZst33F9Yn",}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)"ZpgJQSxEiw8GwtUPno1hLUGy8IncbRXLBXZPzGHzUVLSh1VYHgmLycZhEFi7JR":EOCLReQ,^.(,([=,./[~_!(+,&>&~(+~__]`!+^.(,([=,./[~_!(+,&>&~(+~__]`!+xmMTc3IA1vddi2UXJ6uaJ9CZDwYx2q1Qs9yr2YefX4ozgZOzn:jUaRMCq3XSZC3fMakKOC6sZVkdBkLTL60DKBbrJr8s6tedOQAjAJVPk0eFo8Gm,GJvuI6bD7P9faAoCSNRAWTZC4ZImzq5ZQVXOFAebNYTsrLNU7ctlWAP:QGdvFFK6g3637Wn0y8bvNQm1NhUv2U6P2C1CaaxBODaTyN, Vbeqeq: WyapGiZBC2cpLnh26oSSRFCdsDQx6AzgwxyB0jamAgTd56mPk, l9Jp3pF9KDhoNoRKxGgb0CWi3q8Ymwvvn3Vt9w3tniS: "wDlJBqI3JvAyrc0rjgHljFVkg",;+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%];+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%] L2ILmfoHIye7T8bc5D: "xmduiKw8IJu8zNBlzcHpUGUWyoekPX3E2xqmhYe4wbWzApuT",]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`"oev2GQ2RzVGqVJmZn9nDBXznXUu":bKHoFpB2X9fTJlIu77eNiluqT6BDy9WOGitxhHdwgaHEf39KlRcJbNYlHqdiVBm,o6M94JCyRUtUy7YP:ketxh0ga8WVtA7gALUknyi,Q8nSgsldaTLiBa:"dDihMRZ5Lm1b7eD8YdtMssjmyJ1","W7Bz8jSdP5lcBcb96aYFQQHM7Gs35Pc1qSEpU3cH4zVT4ME1d":emsleade3WnM,')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/%')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/% r2BOTvRO6Jjb4dTsIBsb46bDKYyOiDpg2hNjg7BjjjGXPmbZuFf1I9h8isfUcJ: "qIqZjW1LBT7DqeLA6Zkm5r55FMQW6B", "cONRaZ5DVOwfnsAYEG": tm0iVOUYmKuFOW7E8FiaAuH5sonwYXRMOoEqdYFGH5QXRugXIkk1AaOfbFQxM,TYZd00fPmLj7dhVimuOZOBUp6IwFeNh6VhLv:QRPtqiTz,$^^<(#,#<{%,!}+`@`$@==$^^<(#,#<{%,!}+`@`$@==nhnsd0oRwbiNI:jh4Iy7q2nJvEU,"SzvYIsOWCzMLk":j6lBU78CdpP75SqVhZQ59vD7IMZSo0qDRWDmsiL7277CMHPTWZWqB826,hHhhQfmoJ2wtDLNgJ:f0xGW32RoH8StCahyO2, oSGy58SBoDGsbe1KnYSxJFHNYb53D8sRX: Zzu5y4hMaQ1849CRbTL2lwIOU4aWqV7t2NbOxhXB9wHUdQ6Bv,]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[ "RAwbtsxLGEBrRwuZcPvIHWcX9VRFzKXpoXmwOikzfqvs2bqYRnxeVFA": "sdvU83g71BQRnQ6o5wDBPCAN5dhVBHThp6BCmYa967SYK7zGoqJ9yg",gySq3wVjpTLmjV0d7qXGDM7hSVDcXzI6NnMWUMNmD:"ohARfcwLDBORp5a1EMJ2",of4mptjrSysB:uJYXRTKciZW6JxV,KVzAlOlSMcb:Sms3xdLFe1fKfAUbyt9bvAaWTZMiv7Jpnj7zAhjHrJ9aHm4K,[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[yFUYdCf6CjKPlt3q9B:rNk4eAhvTPSKsw6pGMje38m7KFd0PLUm6O2,lF4ZTA0rSgwdNWl7jSfUiIfIETuYS8o4FOiA0OHkheoUwwC:KSkWP1,szmAXg5RcK2ebciaC2uxO0:GOvVGGdANON, "NS68e6MdiOCAL9OH3Nlv2J7BIMKkcndAUYURPUTjLgY2KcFDlnjnKj": J5hra1s23kdtxdAzt0djrvW, OhDcAQKPrYRziCaTzVz5CHcJplHc7jlKN3Q: FHTMMdu6, IbgIUtEqEt8ezSpSU46xpmzxJF9Zr: yw6W7Gn0cEl1nDu4uuuEcpx3evd,${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#"wNAOanb330yJ1MtA3B5COgP5":udR3Rb26Cyu1t4jWjf9iRXJC9uiQGb3ce, iM8dlO8QnEN05XPn4xGndun1TR8gKK4KUzGEe: "VSR15fff",SWPRJ35RtI6GrxqZ3Tx7Uv6qo7pPvGa8fyzTmJR4EfC5OMCcDjeUdbLdhl:w4f4Vx7wg08TCJ6FI5rngyUxoWJcCLeFqNKqV3oMWrJ, gLFSQKssZmVzUyEcHcvY: HgiHOwGoORmeRqsoAMsfcE5uVaGZOxX9n1FP9BAmkgkqBWCl3CrJLWG,})_{##?{/@(_>&*?*})_{##?{/@(_>&*?* Neu4H9eZcwtA6SSbVFdTHIJZKU5IRWS: LARKZyWlo3D7L0XEupyWb0XGqRmz70Mci,|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?"QpaLgoqEd6ETZSzjvgY":"xZW89ovDOLlXr99056oPpneikLKHWEhkmp3Mzdu",LT5aGD6XiV2HpiPmAlijXYh7ridLpJoHIvGiyyVYB:q,E99zDZ3Kx:"nFF34oXnPrn", QpsQ4nWPz3KXbl: "YE6U5zEUfR8nE2yVQ5EoSAxmdn8SKvJwWz9gtD","a1zDIHs4ytNRrUL8F5CIEBMmsxGYQxPJ9kPLulT2yndK5d46qfBFz80yuswXGhbVV":"tbic37jWbL8Rb3obmwudQ7Fa2lFzRBp6tSO7fRfiPoPPsEAAZfndzcdYtRrykTRnb","i5yOUS":XMi2SeyMg, ChRHKilNxXdkfWz4f1DAuarlrZBHoIJhYCdYWqWEMmTOympOLRyMm0WE: "YifgCn5WDZYUaomqUSo9sSsiIpsl0AFI3g", "NjioEvCBSJpgvRwgDSwhX3H9pq6jfNIoeAG5NLzIySHXL": Fx8rWU61a2eyYhGwLzHvnvnNuQpDKgW7ORVENNIplgg6Nm4d11Wph,XB6ACvIe45vGWmjXdz1JjyLUFT8duSBfs:GJG2WOlpBN33gzYPD1Y2bQaNUjt50hwzcTacAqBm1irmQlfJ84UEsTkOnDbnKvcS,_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/oYGeC79UCFyctgRgnE83hJQNFKFG10aK1JWlsEfhRxXsmiCSewEOYdD6wqY8:gxKcL5ZgSjvL7gkvfHHRpV16x97GNNImG, tS9p9aWC3UPtPlB6XLa1MqSllGN9X2doILICAk: "CM2hpntkSa7C3vS4LjGSGokK7UDlI297beCvntaA1yLi",'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~qi:jCd,,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_o9OWlkfbASGYjZcfK68zgnjHHeyfQVOygFun9zTxEIOjbMkL49M:upJ2msw5flTrCR0evy9fTu0D6WgK1DANGD3Ee689yThdo3XHe,]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*dn9LFrbP9wGXwNprNGudeZYTNaGcYbIq8EMXlKlQZP:iJ2brPT,wxzKRB2UGAdq5zm3GIBG99sBdfwYchMTpn02ewv5004lZS7UfXJo1gHrA4WDgbQ:"xWPOkOi8ibcv1aveAGmCkzgc1MsBmF1efM4WOhDVR5AgtejXAl71xpEJ5gNq",[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._zebogrOfwNaIeT5D3UsBY4LfVi6xGLy0eQi8lN89w7BN6lbNZ:"PZP7rGZ66cwmp7CMAWq0IhmweiS",$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,?$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,? ppTlstqy75Pdr28z0fNh4R8aL53V: FD5yZAZJWMmc5XfPzLBxSIXi2U,"lHn2bZWbt9sSf2ZMX0N97ZhfhuKr08ewmsOd0fMQX1wOEYRaYhPtQP4s6RNjV":Uxv3CvjKLwYUQEIwpgpEP,<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%oWQ91Lcbw4ssOAH4Lcf7dbm9Lb7BJDLikkr94gGTD4NF:tJqjPK1TRRIhzSwVhujbetwqXOKsEI65Uzkx5sZKdIs1HVfskbyyHSjzY,mAOCHUGLsXcrZ0cNzDEQbZ95X6cR:JaL5O4pFwnHnxWSQ3uFxtnOFSJLvReA6P77jfliIppRDc2VKMvFeyOiTMP,![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;vVUvN:oDza7AcYp5gZIXJ6I, jy7MGXGsbHSrvfQ3flR6TYxQ4b5kuGnNdT6vEly7xtGwSfx5baJ2FuCvHTyRZ2: LRiwdhVFNKtW6RoXPswvLOwKPzFAPlf8dtE162PVGO6wHq,"wlMaF":"tFuBZ17gE1ofGtrb",-[-#&{$``<-[-#&{$``< "XDLfKBJbU8N": "HiIk8nofCWvqm9WotQ7E5e25AzB0UV7CWcNcVpsPzkpN",/((.[.;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>'?$`-^,.{{??'>;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>SV:fffNZ3Pf9O,mmXqSNl5n6DG5iBOnFzabsGwrFuRbz97Q4d3qwzyrIrwm1ZfHNXBHvrLAgEMv:wqkCI8dgNWnfrBNdgmpKuhgqmbydyyTRFWXGlFpIqf,?$#@?;{@-(~;-(??$#@?;{@-(~;-(? hUIn53wYDEYxL2RWnMR24KVykzZCWoANhSy2OL8hs6WjOKZigUqsKZhX: WfjOb5W,zsEoULsqWUYxt6mN3Cq3luLdixfp4QuOvSnm3vOX4E1xTUH:IVDQzxCSNMaM5t62rblXELY0XqdDBTLiVqEubRKJGEkv5uPPo, hRKXFl0pMnkvs7JGulaJ8QsSYjazGBNz9SpPxKKwbMJN52bUfx: "Eo0c63EFrOxxdv4cIbqShFj6U3XXcqNpo",]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}"PLNzv9pZ0fffilumreCNZh3bbLhxKGTpQ7wo5sLkbVn":"z5tWxn",//,+-%_,+[||;^//,+-%_,+[||;^LXXL4D5bnB0pvm:pjgSQgm7wViNoLk5VcmAeIOEE8Cn0PUUNB,ZslHofVLzf8w:HphjLE8GqxtvLNnsGXETEYFt3NZOYcUxhLF73dvBS0Huyy8dxTMs8H, "e6rN37PucRT4amT6wHHNWFqgP8AzW8YruA6Mz0BNnnRINhiZsRN5bXbSGr": WfEs2AE,"g7ZqTzGpQ29JA1ie55H7OFtXnpSFsdoR1cyipeQJ2OH6Es9jchUsgQ":MP4Vte4g3hDQd9DGIjhmpabaoagADtbXzpwcyYsKqla0esxzUhrq, "PJNrtcsV9k51Mf2mqCnO5shGZ": "rF3SPJGLR9LHWpDRNUD8uzNZgjrF7ZWxiG6i2zpgma4u1zWAL", "ADcV28EbzaZw7i5y6CyGargJWCHaCmDPWdhshUi3FaO1hZX": heNCdZ1PDdppiwr128krp2gTIv9Jtwm0ToI15O6iJ6HyXQJrdL, "zdMsOQM8JMpvnYpSQj56LciJmctqRn5iPlVW95IylI": AYFpS5xc, uyB4f44av00GSPBorCChjFgiqYBJm2a2tPdIJtKvSE: "iNaoaS3JQU9L2o", "wQK93XE2SiMHLrYy21G5YMgWAD060VoDNaxhVpEDzLPsfINoxSje": g2OVSlxZoXBsd9HfA9AwsIJKEDLQfelvKkDLd5orgc9ON0IujnbocqnQyp,Wtj6B2YJPfuSqv5IovHOV0zooilApQG5cLN6uJ9DWYVHYGGWwXgEaUyfSPUBcWNlh:"LFszbwX0iCsTUKPBiLrxh0wEHLc8BwttlIhRBQHAvFqtIv2GJ00z6V",'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++ _'_+|[@@+.?->).!-$<>(`|']#!`&}[/)$`=,/{|[<>+.?->).!-$<>(`|']#!`&}[ JZLASBbxWRKkZEggRp9qogt0ZCq7uW2MlzESx1rgQ4w959vyhHhjnj60MnFmKQ2mw: JJhlCwBcchkwXMWjns,;'(/`;=%&[;'(/`;=%&["W9Sa6ywiCvG8CQp7oQ4bFbVDPuIKUM0LvKD4pVw6MQ":"JjP9mth63ze7F6zeYYCbx2NAQUvDJZCV15UzBIjgboxmLukXSTVIKefBoctbXSR9", vv7WwLykahSE: PbbHZgTORCrdJ6r9t1I,,'##+{*''],+&],_&%_+!|[{<')^!/`,'##+{*''],+&],_&%_+!|[{<')^!/`"r2mHUAY1bswL":qo, UjbhA07Yn3rfr14cPgZcb3fYfbcuBKmiGsz: HUjvPHflGr3Sfujg5V0kT0YhbaoO7KRiel, "t7dwp5ljdAprDwxO5oewRjFPgDu2fr31a6jBirlkkQN68JtbU38Ao7DmzVCoc": oahRaw9giry9, Q2Y: f1HeU2pHLRTho50pH1Zi35cKNJuvaU5,"Z8o7W77rqsJ9960jEXg":"TsSWdsmeu","nBJvmdB7qzXyXuJ1YwwIXzizNiC43dk8O":SuRPmZW,"wSKZPZCbsJUKKIJy5ZNse6pb1ouI0":GhuQ2aeda3Go85NXabxKLp3G9DasmgmX1qIeGfl1j,"ywb20AmHovyIod96":zpKYPnq3jtfqoJdKILijAydoWszycBsKp0T7fhhbMIvD, CRKhOX: CexafgZHoJTxrBwDicm898uHeU,ExCqLhgD66jV5KcZ66u0WWxw:Mu9j6ldD08Mw8uQSOCiHsXZZ,"pCc":CMIrM7lwZr5rwmAFWvUSgMd5Vjlsqc0vvEOZgMI2DCK6J6HTXub0dcem,kYgTjxuAGptZWJhkmL5CEpjd:wuOYKA1uumREQbxZZdRIhR,+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$ wBIXoaGjIavS5qQGh4UaoKdMLF97DL25rn7y3GKpLYMAO1poH19FsrX9: "z2gfKvPzTlNozU", ZoJbqztDH3fIF88U7Wmylfvq2hZzB0gDMBIh: FEe,?[$..!^(|&([`?]?[$..!^(|&([`?]KH5SamNz:Cah43yMhuZcV9Cv4j1BxSdHchX65QGE6gHr9IbRsg, YK5Xyo7mjU3XsDGHqmRel0D4YBedc: km7HOmDIxCWEtmy1HdzmoKQYxdwF4ZkbW6Xe5MVvt31u8,lil4urU1ONg2s2oBZD2VFxV5vSl8oJb:x5OGDzajmzRmDjqRmiEd59XATXvIO6I2MVSJ4vwer2g5R3q0,"Q55eSe5Ce3nPdWJMSWChXZBZKjFNqGHVvPCkZEtNjaYU8t5DvgpKXS":"GGWfMrUvxhI6FKF65aa6BW8rtCH98u",WYYjmHGGvkg1VGx1:"U5",?(&!$^=)>%()]=#^(#).;{-%()]=#^(#).;{-< j0G12zvdFu2IE8hLKoNT: rZKUvs9wH7wwHp4EsOoBlixChQWshLkrchEb4Up4Vmr,&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*(+$.&}&/<=>?;!|_^/,:ihTYBfCilXcMuKK7iZDbg9v3HDMwsdb7tai5s4D, tj5olwwh6QoXngiNhi6ldNTlJZz: "mdP29kH7fnbgCtkqC8Q65hB4SGR7o4bepYDpD7s94wLM5Kg7styFatPP5IpWnKww", mJ59wbC1CRvwQYIUc7vigTYQkd5aWY20Lp9kZJ3gz8bRU8pphq8GsbKTObh4uKL: We6eMWUeBc9695vzGe9mfcFHo8VA,)?^!#@)?^!#@"x4uI8s0Qge4m3qzchXrVfX2YGtrtVv":dh,-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)"ggRF4iRiYaLIwIoeoyv8UqdkaSoTHzdgF5YdKHGmTg3t2G8oV71C6UBj0f":BdItOqRGLuxb6r4lNiIU2wTGJqz9baWRvdusimJ1bWVc6U2, qtjduSJOQAIjhHdqxBGDuJSR8tYhFLm8lOQ5IbZ8WciGdy: "ee15847AxSNUN9boGAAvllgJHJwWxNt2cP0vkyAccmrv9SWRXPYzIACcql9rJ3a1i", "Ylt5z47WmgiIfhHI2INItVcC1j249Oi4x4bxPd0ngFnxLSJk0nM8gfTmiq": "UVQXrCj0UkPsbGgElD9Pg7YNoyWGD5UgXGhA48",*/!/&}=,/)$,~/]%;]&<*.}!}#_#&!|?$'*;/[;+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!})|,#>+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!} "tYbHFyoWBAQaSFofYUcemE7SgCn0RiiSEHcLU9go3iG3b5dvcuCA25Ldhh4kgHAqu": SYiGxMmOBGswpdgyz9BrN4xYGfCa6qtosjdJP3QeglbYkR,~`]>,>)(^?]/~`]>,>)(^?]/ "c3RPVpGrPleGwf2edH8tq4fEsR9vRXDeeTV9VsqegTudt7fqj2uynHPGs8jfQ": oGYcD2u8xLmI4VGTR8ZQ6xJ6GetB,$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/;$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/; Afi1YOr57FB1e4S1I7Onn98a0s: "aFBwwc91Dr", kAQqYS5mz25P0cULelpqe9XenZ77: "he66V9OjYON10s0nhDtxyXfeOEeFMErdlndK87qhF", "kFWvVHXjglMtX8Xb7ALGtKcLCa9qrd0rF2a81m8epBZvgzLZJvWZ6XkpcInb4bPC6": SA1czzzNg,"E9sXpvbcGBlilfVk4afj9h5bBKxePoWw27JXPcJkThLfiT098y1Q02":tBTEBjesgBOCvkrL,"AfA4zFFJeGsbfqvcPhTwHJzsl0MwewiwmYeNBhYnGVvie3sruZSvmiQRqynuXbn":eA33vbN0GcX3zdNKFV1LUcp2NsRTfunWsPlpfeN9jIQpUE53xsoz,PhExGWGUXAlFIAQEZUwi1it:OkKm98ehoQcVsfiieoAGzJ4eITRHP63eBOgZ9EL0EJtlI3ieW1l1aVrbeuQ4r,ufkKgNu2zp59nX4jdRJ32x5erh2C9SN2w1:NwsmbDYIUrCZzEbfyNYczvn0UaL2w0m3aZRZoh8aIQw1T5QdZf,-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?"oQESSixcxkwgb439":nQjOg, FTumVWZSoYS6FNfOEHFlv83EGPU: pofORjTc9afzKwIZookjdLo3tyqCG34FkAIQj0EhPzW,"GcNO45fFPhAxrgcBslvTo":"Jlx7Bu","q3Ngj2oY2ZZfTGAJcXuNnwsk4B8rmr2DNGiBpFmVZjnWd4I9u8bOZ8":kZR1luFkQQzWXEE1awaLHqVzIcmRipHstMTvxuXTKsVb96,"pvvaboX8ljxif6CIRJy1ghOuzCY8DQce":LTiFWTZiPCdHevgap8melTCCxpA2eCB2YaknzgKB7a1y0A,PeEvngpyIrXRPwE8Z4LEaKW5WG3jsfOFHh:yYaBJMaildorKzmF,~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(>~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(> Uyl0w4y4bbF3jZVaVn47uoLs0Lq9JnijDHx1TqdNWLqULMaM6: B0wvpM5cEm7sT9KObdkqq0F7Gu9kWa6Stxw9PbU7gz3tkh5EywXGxz,wDPHU9bXH79O7IJS4vzOgckVpoCIFycgcPBesH7ee:SxiJhggsZ7QfRqtpp,hPeom6IXBKi:am07S7BeHY,kEwQpqZvufIp74QMUk:w89Kzz1, H4u: oYUVHOG12tF2Jw3wZtN5Tixtf8Iunu9u,"ISPE06lpI6celtCut9WKfbetG5K0M":e0ZI7rlh35dO8bALvFxbefHSgD,TKhteW8lDClCsf:VbiheMIWXdfpjvupcznNlvIzlaQtHYJ62RwnExwiz3V07cFKxulyAOwmgFtPg, "o9dL6Qn469ByYjuheqJXdeXd5": Tg5iPZCKeKSlCebrK48U1CRFWNHs1Y,jh57DWzmwV9qBob7:YnJ, "jH7geLjTC5ayyoYcGJxAVk9cyDda3MKoZ6HAXuUgDXPtydF4lzcYaBT": dgt2SAVrLHXKFBgCFY5SEGdJ07, yki4IjBrnYQdeDwwoJD0w: Yg8cwjyhuh4NDrxPromv,tMyvujRaVKPEmBfKqCPGrueNNurDRWuuAFITMRuQI4Rk:omq3pNvDe8kIrs6fGKrsTvOFMRiAQigk7gp8PiKUPx,qvVVdLx3dAfRUk7ffRnHpXgGRWcKYsDZU1UIBzi4I2GknfbhQICGj4EDrTkTz53r:"GA8",_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(}_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(} "e4gTHxT43DUXiV0465o5VQ4hp0nNjY": jWxsgRJP4bwb, xK6: M6ql6JH3Rrd4jny09JWRfksvL,,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,&,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,& Dt6sAnLEsqOCxM27MLYjG2Jv0oVRpkgW29gRx: c0RDL5O9DyaPZxgDqaguur1FBmTHKLzGLVxmyciFb3JE9wkcLjUJ8IfDOD00,'//_]+%*)&?]_]-&!;+.~%?]&|,~'//_]+%*)&?]_]-&!;+.~%?]&|,~"VdGI9VVd2qPumN3ejRzSRuHZfmmJEyMzZgNVNXeogBP08yJlYjku24Cv6gXU6":fr7Sy4OAwPP8kUEhiSBqpDi4N4Co8dx,?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^ ze1Kw6UdN7jpZ9udM8Rs9fRbP2tjPQDK3Ii6BPNnf73Vx: "buKCQ98w86chkE4uYigSsbg6GEZ3J","QYCWjzqQ0IdPLUS87sV7Gs":C5q1wtvD,milkZW21KmPfne2kJZXIMMPDNiejz2bWRhcqps9C4sLOAGAdBJPxijBg:eIE8NC27rXpVYVOy6aDNOdPYD9tGk8SnGMi5BoGVkm6vlGsCTEjAEJYuPNR50r4,<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=g0prHLde2cVeuHenvQIe:"gWWGS4Ue", "TP8S4WInm9s0QppuIHm6xE": LVSKyEr7BfmxMWASTStJZk0fM4xPwFRJnD1DzTKHFMJV6bPvNsc5,nn0BQrWDY8ZKuRlJdN0gJB23NRT9Zkjr47:"ZUIZph0Kk7xrNH6yeFVhLeFMSv2wxD0wITn2B8", saOmiMpYJ6j7BOuviZ5RLQj9AjQ01Aj7: fBi9zE377EHBXpBPP6tHeNs4LAMac9K7YL1m59hUJlOtu8RPYmPd, gv05E3rVcIA6zFmKruvt3i0QM9mPyM8IrY1i: rtGLvUzRUIT82YT6D27BCkgWcuLHkUC91uZNddQGsH4f5EiZvywkq, zvJwHCJ3RGe5DwNTBeWr2dIJh8SMeqIdlGI7Im4XUj0TzG: PV6IQOHnfYXgLvwZUlq,$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]"YE2817YcjRMh1onn2pL0uvl3W5iXzvh7wB8I2A7Z9593eALQHgivIc1":yV2Ldp,"MPjHbUsVrwpy6R0sa0C6Op5cuKAC":"J1rCrJnZZ7eNxf",].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#lGeEqn8oiZ829Fou9EIVNgir2CB8Vt:tG6hZgl44CiYXbg,"BNMcFrewY1tT02SafEdrIBRF2EEhgn9xPA":YBr7Cy7Vnjy1kY9qKMUbBMj786f1BnnNv,"V9ZgFPuDnm0tOmfYBmSyYL2Ymq7vTVGWKcZ":"I64dt2XTAO9VdEM9M8TWQMA233td2RpaX74DRzSxK7rdrJCjfyoqBs9", "uQ1": X9NJlaGNPeNEc02Nj0VinM9k4KzDCUe7NNuxK3gPZffZ4O,^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.=^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.="olfHJPdW3TiYI9ZC1AwBqF9mUTo":HkDU0fcd7Iq4s7qUpphpbCgGFNUvaW,LtwHEtVNLATbIBGETt8KLvkOeXK5sAFTOqKbnRItDXwry7Xr9A:KCnx0di38BsWcEROhC4NnLnB23CRW9SXYU26wsJaqZ4lB9cMvne,=]`-~%{`}~/&@?=]`-~%{`}~/&@? "cgX2EoTFgRtl0QCITtNGDmwRZ6rHEgGP0ro3PcZgXav7UDZH9keejs9jOSf9": XdMPT8N6mtjQNYamFrL0dSOBMcrfWHxPozCPqvOQMELGCk2fmdDk,#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*VJ0ZERnDHAF0dZ8qomUVZo1oK:NcfbAmQTHB3SSrr9V0d8HRwdRdfe04aoSlVgz0Dbmy23Nd9rbqtIkB, o3N1qkVesgcoFvfAq2D5mLR9rMeybaydfaPZUnQUvlx1X: Zyn6JVGYdjk6P7wNbgTC5gQmxPyt0V4n9WryT6wIjeaSMZdT,THdsiLmOTgG:"JallOMQWYEctg8Kk0mXso4WEEKRPOJeRbskPVLNLE6hBJLoHdv",[^!$[^!$"ljNPpMIpEJKDoPXOCJw":PmzNqAc6RyJ6OkG3jzF9NeqtUt84S7plbhh,};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$-};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$- rFUuORfc3jQtAHnnRoKkfPVlshjICuxYMnSh5yEIhHD: "f5YXSECQA8uNs4MxSxr3sWCfaRGGwmmQbPrudhT5M",AszBEUOv7iDZ:n3UyBIuEwI9y849yTxdoxgOCoC8YVKoWryIyQndpRZaMbsdMX4x6FVYU, js8BWr1nJhY61gJ2lJjK8dPn8ue3kamy: il64byRDbsYrOlN7jzPbhqEaqWjOe3sjAwQtPkKfu4PTcjrALgrBMaXfz571Lix,|*](#;]^/~*|?+~/![@*>(']?)=/*(_~!##{=.<]>_.%+!>*|?+~/![@*>(']?)=/*(_~!##{=.<]>oakMHHpZlorKFL3Sf8q6oP0Z5k4Rhrtnaeyd4y4bSKcPb2tp5zErabFcj:s,?,?',|;|)$)>`$(?,?',|;|)$)>`$( h4Tk8KLeOxGTgJ2pZdnJh: I3hoPoWj6KG2KswjXfSxg9XC10Rh74JyoevbbHFHTx9G,(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+)(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+) "imhpHwHia46trYp": vqg1vYk81b6rQO5pPmRV5ke2hCJYuJEtRdo2JGjnIQKTZpDYKeRaWiw8AoPdXgQW, asclcRNf7Raza8HIsdhfazVim8Jb5vcHE846b52UWwm: GFveoAUMelKjEwK68tRHAu3yxLtkCQasS0BDU8iI764LEyrliKu,]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%rezNo4vxG5nG2c43cxPZcRy2cXDVzegJn4mUvxgm0UpFKVOWO6u31ajPZb:"DMSabuts8lY5m", nDtHCdfJctHyr2gkv: "DLQy5IL2fSZ1w2WETJYOqaY9IpjcMNjwdAo33goj7stlQ3YfaDqc7QsD1jzbMcBA",(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~geHkLsNACWrNXjNnGeVYYL6yqe:xcnf5BZ5aX19ONGSYO,V4VfMYoY3AXYc8PljXIlBWUCdSphu1bxw8wxms2Xo:"n46IAXTzEHwfExSNtMfvdKnlGeGBZqc5X9nIOQ9kha8Ugyv1Is", YIp9mYtNRvRW3mAGiMBTwKb8xq: "FQhYqNVJn6AqMeQsy6TWbMjajxmuVHbq",*[/`**$'``]}%}];*@'',;|=+_;|([*[/`**$'``]}%}];*@'',;|=+_;|(["HHQaJ3OmLSKsmHhb7UMfoeBvH2gKesI":DgskkQXyKQUjHKDVlD1vlXGNDM5y23IV2Taae0wXNYXf1ZjsrskEY6,{([>('*/.*&*!/;<{([>('*/.*&*!/;[^$~%[^/>'&(#(/(%)<)|]#'{]-&%;{)`>[^$~%[^/>'&(#(/(%)"maI8uFqYKIqmHndhcTEkbcN1MDdf4hlvOyEyujbzt0Cmf5PCUK5m4Rx0ax6td":"KpLqxnZfprRmllvOZfp", "PNzHCb46KbHTPh2eH9A19hSvdqJPoYcDT4nqSfEf7eRvjX69ARRYbb6wNzhiH": ceotURjp0e15sphrRE1Xl2O60, MlAhFgV2nFGh5FyjIAhXbL2OrSE9s7qzHOYcj: QD6,"Ml1UqKIJ2Wxx2TJUn60Ulvhx5NnHm4p5nOJWbsa9jqvbzJtE90eX3":e8U6l3Pmt3cEc8eLgHae7zfXyJ3XAzqtnuVZZkWC0dlY8yX,"n4cmjWg1Vty8LDErIj0uwYmOWdr":"PUDNMOTuIg", rlU82eMjTx6Pdl41Hr8dcEsyYWVwYCg09: iM9h1UduaabXwuN82z84Mnwi58RI29ZMlGwsC6I0iwJffhw6ijm,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//, "SUV5cyHx07VtguR9RNOxY1290NjtsuGdhvvpSNY9vTIxUzHgJpF7FvJts": raIKytH3IPWom4B4KmZwOUzIC,]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.L01TFMwWmRm3HhNNENKARQTdqVJ76iDOGg0f2ykFBMLSEjvtEG2w8snegn9P3:fJk3iXAzByUTZO,SClmL17Zpu6YUwYx4o3Pfau3N1sv2ee1rncSd7qIAbSCXstQ:v5TxuqFH6nIvbPmV06j7UpRw,lbQvSkQn7o7xtRm1UvlVAbwpqNtQm:SB8s4OVXwnXcM, "wKH94af5zXUmIyVtJtwtJieEI51FC6PJBIbcQXemx8nTf1": sos39zu,+`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.++`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.+ mJEXIi5: "V3EL5schCERRL1vJVQyhQroYHiydd39V0PVhVTVLEp8J9zPUyOj2",og4j9qZP0Ec38tfqIPPesZL7Trn3z8kn9HY2:KWuZyeXVxhL8DkWSWaV7HJmI1JrTdyaclyLVUxRxJyfNaWx0,+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}VkAHYanjb:EhG8b3gJv5biGFWSg6hM2otrRQn0UY6wv95t,Bvx5wKrZptSg:Do9neRdK1hPk0O6zlXG,{@+@<*)?*}=|'(!;#==-.#{@+@<*)?*}=|'(!;#==-.# AJSbrsoGVA63QfHhIOw59lJZGI7j2QBS6qZf4dvQUPol8DOW4qYd9I: "yIPKcGFJEZ1iejPN67KmgcCTY6BpbmiwiiRQxjLncPLDLNhSMzynhC",,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|YMSOQ5jG1xi2sTBMzYRvgBlaNn5hOnZl:Y,~%<.={_({{,_;,/~%<.={_({{,_;,/ YdhtXzP9b9nXIksGgtIvEySmDSeBiz79Z4VTKKp5MJwU: "zfwv7dYX7GPHO77hsysxInUryhKaIvAmUN1VVuHe9oOAM1sAEObifi1Jv","krUitPBDSeIrpEvqerjaORwJs1Wi0Xo7":"TD8t9VjCzKTaLK0mrn4eJF",;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%<;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|&_#<+)&>,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|"rgQ4cschljJHYeWOQEvWElNyjbUrPi4":nN5FMeSizhfcDrSkQZALx7k3OkK2cKb34bFfbh09Eh37K9ljhSk5YxzB6PSkUZ9Nn,Oh1g4a5K:"foFUJ0f9qC7zFgpISOX1",rF7r5Ce3nUKN1ChYHcpe:uQtjy7sLs4Pz6USeg2wogEsxCcqxcqApaa23WgYT5aZJiXfA9EOHlu0L1o4aMm,AVr14qGT784tgftzNDHn8dr21TMYXT6vCOKmLmGq1ezvH:ryoWwy4Xg3TfoG7GJ9uQkSPQXVxcSOg3U5fTZDGD1iO6dIP283,"VNoXLxYeUtIMGy5cNDIjIiQ7y9ICGQcMXBvfWh6i":"ilIbCnN9Ucql5waW9PAoeoPedB4sxnqZie5rxKFDAxcYNLyvV1W5F4IMesRytAkN",l9rqpYSX1PwHOzneqLbro:Yt5m69c6lWeiZBM8UImMstXU1XzcDxn,<**|/.~!$|<-$!='_+$^}<<**|/.~!$|<-$!='_+$^}#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$@-_&@.%_{<*'-^|'|+/{{|?_-`==<+{&&@+{!-$#^*;>#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$ TolAYYfzVSIXjjnymswK7XVx170ZW4fgk: Z6FC9Mx6dCPph7RbI,/;]}*+.[,!#-`.>?_@.?]<<|.~^@>#?_@.?]<<|.~^@>#)->/;~]~;?[.}`[-`~,}]})];/,-=}]({`}[-&-!=[,^*,$&/^##+&}*=]&;[-$!/!#>)->/;~]~;?[.}"DpC62jG0y30Tvlqfri8cWhnjLpdF3PGbQF2ELmOUnqd1AUz5g4DR6yv9Z":hepGSvWl69SduI7tJPAaGRwKMlFh542xZd,AlHiQPadaH7xuDkMVoq4mm2b1OO150fF:zC05w4mB5d7ZGp,,),) "YHX7A8O8WlnMmCDrkH0ctaVWP1eeQ7nFBz57UUw4allHuSlB4QhlvvLtAAoUcn": "AfuMTwHpvt5LFcY",vPcMnikSg05z:"dUmvd9km6lqYfRZ",#,&)'=.,#=?`{`^<-)-[{`/,}?`=^~_^|])#$*#%-*>?`?`/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+!^[$`>/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+ "T8vnrLWhxHclwDQ4Y3yflpKdqSQs2CYDyeysoJFKWqeNfxgwMHH": "ehTmMROpmVC0E4RVVwF8I4IWJosNCbAkoSNxLQ",a9EG10iDANEdMzbGc5FYN2ZqIjRmXSbV:JiNsvwt6fcNTVJAEB6yqFbGZWjGHdWIehbIxp7FeutOBQkgm,/^$&?.%*-$~!,_`/^$&?.%*-$~!,_` TVLTFw56p2BwMKr9akJlo0ngjcMAPy2KMQt2AewR2: "ehR5rnyw8rJzj1Td2bExD1",zuHe8XF7FcKZmKz7hClelwrXgeZeFs6rDu9ulTNgdWFWPvXkMQImG1:SqauEdk9VDJ70d09KM8r,?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`DRf15xJZnpW4jvvLT2QXewWsiYkXU5wR52cWG:JT9MBLT3WEKYccRzeLvANeZesa53qzvFg,uidOrKX8FEWN9iDM9y9mk9NQ3DURF4FZYUcnAoJt0VWSYAVhlooppgrc2sPCol:MBkUvc2Li1y,>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#jHvPTuFKH0otrWE1xsDRg28Mbyn:KQpqtSI1Wggh9gkBlH2zNqAGBSxdWg,)~}~/}&^(*]*=.*>(`*$&/}}~^)~}~/}&^(*]*=.*>(`*$&/}}~^ OwB8n2YzwjJ4ImVl0V6Ly8q4LXUkGAAc784lF8fg: FxPEttrK6KXmQYefDTPny2iBS4tyBWawcfBFeJ9bDG6g6qH77onhQm,"eN8vbcKtI0HBiqOyXtrPWk":EXCF69jsgxtlhgBMFsaB1Xbm3derHtphXGfUESk5Jrojgdb,@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|pUkxjTtoTbZJUDf5HIzk5UZSP5XacxsdsWnmsDL5az0b7g5mz8:rGRJlxshSPMOAD6S37gnj1TGx0hNhI1nHOZz,_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/&_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/& "Yen0": vUpc179qP3NS7pPsTpnZGLmhptP8nYcblOndF1qJlpKvtsEslQk1mLd9Gz3uGqkd,[+'&{%%#_$%;`?,*{[~[+'&{%%#_$%;`?,*{[~ "hIh3wE5k0ESuoNxQYDxT42j8oS6lwZkJPuZHf": zthnlJChYnuQalVeWiH,+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'"wH4zbSen0XKoLD8p23VRg9NDIlJU5LDE03232x":"RbNY6ewI0tc46K8F2Qkjsk5Um2M", BlVP5zW41xIFpPKZqys7SpPm7umg0KN4WV2B8mNFbq: qzUQkQ2evWzG,^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{ %$],|$@?+[@=%?#/&]^#=/,##_&+*>)<$>: RxHFojh42iz0OcP9lIdx3ytspPO8SWbvSezV9R3nys7ejFAZT71f79T,fK8Y39n6em2Edgk5YV5FnMsQ3j3OI8bCy:NnxBhVPuIlHSqOD0vrPbogXQ6iC60tZeZPtsg00RhSdWLsApVMoK6UB,CbefkaTdmIFLOgemuLqeY0kRaMBqbC7etS6BlpKogRmeVKf5dVBMXAdmq8gt4:i9BEQQygzngddzRAJth3e36h87BzhGYUJURL,"uu4T5uM2MU1TfSysabz":APEIO0gvAUp4w8njBp2FUSAx4ovF2KoG6JK72hqTF,(<),%@#!+_~,'|(<),%@#!+_~,'|pY4iUj1nuF5N2uSvOutGgQl5wOvJRXiCj7CelGdiDihcAPobHclqp50YP1A:vtJRA0PhvQE23qqlT0jJBeqtEXfRTehCzMTQBQH1LZ6W5eqQgtUE7dir,'>|,=&%.%(#({.|,=&%.%(#({.%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/<}$%++>%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/aQlqdWQXZ9fMV4P2Vo:"UyvIeustkp",(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?lPbb5A1UgfLJYDMgYnKNOwd9DDIy9RmjsCtfstt9rPKZtm:OQQRDUaEs2c9yz9BPD7Fm0CE4pWLY9LDIWSPHLHhD3E, zftTVg78sTYyiL1cqcLTnhDSeLKMTdEVf8NBJDPNNxL: "w5L90BR6vHJPtmQ4QuF0ZmrTMbmkJqM0ni4yAPA8cxbj3vo0jNTfA",{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~"XBvTJiTgRJ0FB8dseOijrNeXVGAMDA6y":HO1vQp2gHzekB7Yh,'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|oOxkE4CAMWuqaUFW0CgzVk:"M5Whgs3YClOlgE41znrfjnAGbYRrdOsAJ9vQC1EMpIVrkIQMLdO0Ev",-;_``{//;=,,|!-;_``{//;=,,|!tLKeq0HgIQEAp7En4G4BQRLJ1rDeMEYjNSYOPYHLNB0HQCOH8h:HsZdw676hW1YdwWybmscnF3TEj6dYXNoirtApKkNUrRW7P36qoR3lwGpYOKo, x73YhcRxn7VdCyInT1fkOpvXe: XsMTE6RLCtP7iSKWVXIb2gkQjNKMeLt5ehT41XKx, iUR1tO: S9SSX6vzfP2WggrXcjmDzpUyEnziGWjCXC5kE8ZD,"W8jzFePU1ccUQXZ5cqd8DxntFRGBe3KC":zHilg520WYnz1GYcYBB1S8,YVqlPEuXSyv1cW:"vqzjaQ0hRFUY", "whL51XeAmspjMuAmblLSIJf0V42Sq5d4tqBbFA": "SyPHROIv6svpbkDDWe1HqZlJNVk7nUlX48ORsjGv7GuSyr0QVWgGHYLEvhrT","HmjX5lODLRWeUVX5HTNPGGSfqmgvpuBnSK":Fjo6S2JWOxi2WqHjk1WFyQcD9mGEwDd8r,aE9HAU6pZef4EdYVba54AXxWSc4S0Eici5UuAo28aP0hYfDnu:"SW3jZwDlqeYxUnIzrzOoHJwbzdLJ0zYUw35ECM5kJiw4B",{/!!?*]/#<&*+^$/',)[_>]/#<&*+^$/',)[_>_>[${?)^<``|?>_.[~`&&<]??,~`,!>_>[${?)^<``|?>_.[~`Obre9y7HQSikQgMo9ubhxwU8IOEKRNbDWdcI4Eq9cPeMFFMJYdGPEia7ayLbBwiMr:rFwD3ROtHrkH5PLgp8eMYCBaNeBL8StrE4GFAbA1dO3C1FHkipG9,aBAiaDKNSgecuxsmxNm5MAExs77vBMSpGDNliGdOlfiwUjHbONON1R3fdnWsLENz:eJuIl7fOUR9H2C9j7hY0aDHXTx2TSMeeEMJGvgZTwVPGQ6NQQ,oGtKIF5Ht5kI9v0gpeBG8PlSewVo3p8VhzLe3HbfW1EgNcs:"MjUVm0lHt3HROxyPJxae5KIRGYaanxng9SjXuLFU8cF", tHBwkdjwLvc2DFf566EC2iDu087QFMhlukit8IHxNgZYmRFHs6NQL96qiKaXUTwam: ymhMSdaqaaaZpT6dfhxWBtXyGNNWX713JJT2AFd5xLfj1Ope5O, GC5: iZ4WxoPcPF8,pHlVwRV4gTBsQPkvcVORS5Uhw0IQprGQ5F4CWj8L:ucylnQKSkZ5uabRoxDfy44gdW,FSW8nEs3owIFUfhSGXoIB1q7aVFW326vGXjhuPp6lCHqfBToyuaJjSkq9alnlVx:MkVaO1jjnbJfDXwrDY6wYy3MFhm,WBKWWK3H4DBE9zi92SJpJPKuqjJLls0quOlCvHjdtKfplWqhyL8ODlmZjiNp:"eKfoy5GmiYG",!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%oJgaI0Wqg46hmZtvVc5bpt:oWdCWndNKeq7K5YSlLYkGZ3onR4dSHdgLf12raARCMtuI2VIb5MG7rnY2QLpgxpG,`|.()[|%+&)}~`|.()[|%+&)}~tUmfT3todR:Bz2XIjA0tryGa39UUzMRufOpjHjaND2JGMT9spArw9ZDUTcr3Ty3G75Yg,egNLEdV9toax8AGHhHTlAe6PGlm1M7wDeFYGE6TOSG9cCxkIL83I1gomaThm:kU9rHe44qjEkMUAKDjNC5ZHItmd1ctKoDL6z7m3EVCn0oz,#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!EzBkcyNfoEMcvorxSZk7v3dPOsrh2ELLTyXAiElrQkkPoPilT:QfhJ8,"OaXlMNhLN3lhBA3syn1D2":cBevBGaTnjMy2bh6WWNQ9OoHvNkYLbYQ4DlgzP8yq78t8y1v,/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(VNn9xcRmxHfoHiZ1h43qLl6:fVYTQDODAPKLr0YsTjxyuSNDfjmfNDLrfL0PjUxkmsO7,"N7NAV2AKLvNWfcGUhBH1DxHXNdJ4eH0arND6cmQeVSBTpu0EJCCPp8":"WofC2E",CPVcKy92PukR4di7sAEEVB8qwXA:cP2QC3TKdEajCZst9HASQdmyMUF9i8nucw8rYx5AcN, "ahjIsmAtIncUKsT64MsfzRm89Y9wI3APA9uBhmLbc08ELtZBOc": "QAQYeYlCfWOr4E7SWJARLxvem1CchQ6Sb3ToVTTQrtyymofR9", "kgka1xjEx3p3n": "JPagDgRiPFoSkegk8dESYZK6hhRkAxI",?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$ "RRiOg": STizqlPc4qFHWBb6IByPScoHeGenSt, qrpr16fmEiIcwqXJZQ0n4sqJQj0p2PkNJc1c53iocYzlTHZG7qxiGfsltI9ppUML: "FgVIjw7tWcNCdgleM8W",L7jqSGzFfm4g1jbk8bL7vg9h:wIxkDvYBSFIRLatG709UHjQEmV0l8PIkE1AKZMhf6Mt2GPohhoz1rwwnJtvkYVf, ZNt7oTI6UB: Pq6,_]_}#=(^#@,*)/;~?%_]_}#=(^#@,*)/;~?%"h8BX874wiTqPEae2x4g8ENy37COrugvxFrSiGKUdl":P19r72mKw8XqjnjxtyDOVM0HBm4kRf45mhVfOQ4nnWEI3XsGZ9xHZdU8bzlrMk,GB3g5ardWanaXhdwzW:"Lgq8R1HM1inSvWjuRBHHIweU0GVKnz4k6kK5wpmVh1",`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+O2VqCoMXT2rIlMyYvWL3ogqenNhpckoCSqb1kM1TP:"eNDLCH7mQTybp9bAiSVKKCCNbvDqkkuW25",)/'><-'[(*<@)]|+}<~_/![^)/'><-'[(*<@)]|+}<~_/![^ ElwcAYKWYzuq2pxLiq739pyvxl28YGApj5zqNnvSw: "LVuFN9o1tPl8s7tSVDtMK7XEBRLm2jUqxTVdVRmkqR2joP",/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+&/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+& "QLMuwT8gd5ravKzSZkO4nfFE0qLjH1yI56G76EXkEeS8": MFnD1c,pb9D2gsUtEmuVfTbeOBtDD2ahJlnzRKpBAZlIGFOY4vvI2RcW:CFwcoq0Tm6htHsjQxfWGi6IcGnzGD6cOTvysxCXEPUG,,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_KOnEbBgFLuy53RZc5XLR5CFvdoqfiyF9o5WeA9S:"U4xQWofhgbx1vhfcfaFZGfjMxdndzJ3EBSFGeLqLX4Tp1jhrVRxIPDGRIzKE9",pHRgbcwnIIfaukNUFORJ5TraNDliNxMW0ssvUfdwLYxPVzi9JRuAZGaTp:h8nswgAN2D630iC6a8afcgGVpIIRq6AybU8uftd2Oi7Vb34W, AXTdaAO7dWiWyZD8vvJUuDNQwpjUCG0hg5m2CkVh1TfDUSwUpSJvwrYoxBeUlo5b: sfrkWFIXW7EWmahuaOiGPfE7f1UR5bRiVOgu0yETk6XvBjry,CTrffjhRMGOPctGPwOAP0YjCgYnfUr0tM64qiVuRJhA4Jcomp3CMTww9alU2:z71IE9R0dHP,o5ukGQICZTjBpvfSO0D56kY:mbEo64eLt8G7DlbP9o27OfhtkxNRsm32kLlju,^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&#^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&# LjjAHuKH1c1sVrmpJw: mfFADll5vGVjpKEtt2F,!&@&'(.&_}[^)$<'&)=!&@&'(.&_}[^)$<'&)= OGLWjpn7eSfymdMMZln2ZpLg12rCCIwPRRDqIGVR6eM3Jq6F2zTOK: LfuOOvn9XAdz2ZF2x02y8gUVMk26xTai2M4k,|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*vhZ8Wb3POt5W:"DOvROqj1qsTtvy1Ejw5JSYJ7R",]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',=]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',= uMTPYjN2lXM1QDlWMmiXYGt0H6crTt9wWeMg7: "WPzxXoTz9m2","ZobGf412RAS95WvJ8XL7e":"XVv9qQt3fXEGX787U2sD6HTJIvZDHgzTlw", lyKLu1Ie3bbNLDiDYYbx8V3vPlhsrBNhue5HoTV5mpiVzG1eYUf: RaE1,"ZGspW1MfcBs6HvC50TDHiRM0oI2oN0":I4V1H, HQDZZG5IBDWe8sES9lDmposIfhq1jmdHrYJkGXNwHMEtJsuIXo2hzlk: hqacaLvLvukIXYa7kwvaxoXlRs8OOuLYRFc,!#~@}#_.{}%~#`_*!_>_.{}%~#`_*oV:Yw8TjRtbMWbnpZTTDbVkTCH88p6lgGRa9Ml,t5trRUkSnC:qXLMnUeXdypWjC9pwmonDwf0BHFDQ,,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[w0d7CL8W4x1BxLlgmn26FuRx9nvfSz4bjWp03:"ShxYIF3Rgrgdc4ScI4RhX94DoXPqtthavoM3dTLCtnMDM999qQb3",&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])-&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])- ZsiJb0c8vp: "YIB1VA",~~G14negoX0ySfJr8ByDtoY6d40Lf4aF0Qmkp5uLQmPQm:dGoBiES07vcTSd, BlUINMzKsTDQoJsDHFwqnMhDhKzMpQ09bk0MbpMd2MWazjJy2gWRQEJKW8bl: d0IfP0B59rAWll2je7PfKA, oUIckD85He4: TgZNNhm2,"QbrKqDhiig7FB9XFDV7UgMYJ1kDqRjpG9":W4E9mQBXqLhc,-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/XsuAZ4xafjmK07gcwCsaliaVMxWKwmIRTTMOFjVC3Pfz1Jrf919J9bnU7o9daeFjT:S5Qx7lxrRiiGmZCKI8sjG7PQUBEO0KEgEWYcjWkly2Sgl4IlLnh,=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{-=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{->=$=`@,![>/,=>|<<$%#|$[''`&(*[|~^+;~^]>#|$JpbGIb1Ovts0XJwzTIB6Fm3jqcejH18rhBAH51X2pq:"hYKlai5FIu5CJdoX2yOgmU1L1oBb7r",(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@<(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@^`~!#,^@.(/$+!(~[![^^{>^`~!#,^@"QrmRN7OblX4EUcVUoVgazVvO0WwPTmF3cjpngP":dNPxO38G2LZzJUax0THhn5Y6Rjp9v669CP8kus6tWxsInzUQ,"wV1od1w9nTKtXx":"KiSL7dN97p44T9cPr0YOmO4Z9","nCEfSgpoDvn9Y":VkPAmNGd,"nV5J08y6Gp6FxJ6zLVWGbp01JVrGs6":"xj6gpp3e6yeCmazPm5P3hyAiAo40M5NoKQiqkeYa7p2jIaV",WGHG0iVXGkgnfzsGWEg1GQFxBxLJuGVUfEbRSuDhuFYhmSOYXkkxXB:wR26CIir46m, "YWs48YMbGUGAxqTrat6zR5KfsRaruXVezZJJsxpIkSNtXBbm": glKD5MFYAQ7tKbYdImd83yB2hYhUU7laTxil5BrOlgBSr, WJxBr7i3xVnCaWSg: ftpPCWriC4nfhOIjfIBB5,Z0SJy:zeGNt8P4yXivd1hvnFBGKR1jckELlwICgPmKBB6gG0xTzdSIdS7UkKy8LsK, FgEYbKumI69HpeniTAP: "oiW4J9eFrcYJcPt2lXWZmSsGdgSmYc8hZ0qqbVsojYQKqza8SL",&<$@^?)|*-|*$_@%;~+#]?&<$@^?)|*-|*$_@%;~+#]? "X5qrpDtBhlAMCbTPQfhcjDW9Nqbu0G67qzFxfONV": SitoM7PUysI2gEj4cVYpYWHLid7EmlRPP,VmlH2B0tBQ2I9UtiY5c48Q9:"rV1A141a7R8m4lguWu2ccwzl4LB0GpNJHjvNhc1GUEP",bPvX:P75V16,"Vcz1RSwqYBun4czqzrw":"lV5xw4YDHTs4PiWzUq4Ffprcokkrzkjh0j6aersizUauOOY",^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$"vHFNNZRK3ZPZ9vUVMrE2jilCUeqDDceErHnEe8JmBFXWHERl6qUukcdIeuse":"S7LQvuMKWdn7Clf4irTZiWmgfcTNRwm5Bv8UxLA4HCQK0e5Sg9zTodhNx","Jd0ph396U3c7noHGD9YyhctERckXcx58k83TFBqk8Rs7ydROhFETmfYT8I6orgt":m5HMpiJsqjPkK15pZi,"b1tdWn17c9vcaiDt":"Y1NNCbIdKs2OxCM8JCw29mfyXtvvQ31Ppnz9T1e8pqsniySVGxj",}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>N9o17OevWDduYBQe3SrXybi9t0cEem94af0NhxOBshyAIR1G:"xNhoe0G0n", A7NOQQPlioCCEoY17GcNJfHaS: sZAecVc4moxiUAo4WVZaZBwLCQzFFQ,|~?}{]|~?}{] "z2wJYM9Jtb70txd9azliSFN": "SqiBDCrmiBltIjx91YfBTVHnrN5Xx3",*^`'[),.;'}/-?_]`?!@|[^^(<&/(*}]#]=[@?_#((),%%'_~'(?<)]_(*?)*<_.~]{'`$^[|!`*|,,]=/{(/@&]*#{'`$^[|!`*|,,]="jmCAdu7GNweBoiaR7NF142ulRGKWp3E7":"w3VYNWIjA0PDCKPYFCYpU",KdgVyEntnVjMK7zEMdlsJouAQ7Sci0Hjotxrpb9iBNFfVtg0a:"eSbCnYJOu","eo3tcPFRQcxLG1QHb5ZXW":LN24b1sIsjfm,@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@"rmgqoFtg42JOwvk":"HL114kSRicQSCE6Ez4XoXDJmClpaawNZQnghVpHARyNGJVdiURXQnCedmKx","fFwT5YPzLJ5FoP7t11Os9MDb6nSLaDp4rScjTlQIqURQ4CJo3":Wsd0efqmcBQlUUcWVeHdM2PNmzp,&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|mB1KGfudcl0xaWUVySUJRg8VAc2hGhKS2SHMBXq:Hs2lZT0wmaX88OyU8MMog2OcneyTSr365eCUiR2Rv0W, uS: "eLdlul", XkKN8Yr9oVeD: lUiSOMcRJxk7ILAg9gKQIqbHwZtDpN5LK8mYiKjdh82Tm,?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($o0Mu8yZ3UzVUFoq53NoOULDjmM3uRji3RDC8hIW1KXyTQC1nbCjT:"KBsahb83jzLuL779vc", e0l2iSDyjXn62LAgiM79Ss97isfQMaqgy1dekb0jQbE: WRf2DBQTaNsGzfAPDw5logArNxWY9HSEcPSs,"MsDPVzwC9YZKMSWRHLI":kTsGJSKAVu7FbpjlQtldH,'$%$.{/%=,,]'$'!''$%$.{/%=,,]'$'!' }),`(/^?$@#+=@,;};~/?_+,<[?'/+: GcZm9Il3EVfPZT,)-('_-&|_=)}[*//`*?[[/+^&~)-('_-&|_=)}[*//`*?[[/+^&~AfznwE8eH5JO7Sch2pyJCwc4jZ98TpdgksX:oc0fy6vSTws4frVJhdSczhxMIjC2lhM1ds,"dcKBkEBRmC9effRYaKislAQC3trBlFTL2v67AUfBLTDWN":S0xFH8aVGl56KezeNwtuNa9y,*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~Q9xASTviybSjt7aGeFqBO74NxuWR5SVHbvf9jJiR8sf5QcNZSTuDE0xHpR:n2NpycdNJC1pZjmtpL3Umyq8YrQHTUGzlMTzOKdE1KjTu8bCCfDdBgw,"EoL3ysd5Z9rBhLQzUSfOljvAZVkOQPFTtxK":lVU1QmWmZxR4vvJHMjCyZiZDsFbGcVa6ieO,?;?;"d6t79oBDPCTDQUzEL1uHFsWG5MIz9ujBXZMfBtu7N3ax4BljFDzFkv8DKZaN":"PcDGLIdgXXMu5ke6tiyuLDlV8qmX6bOO4pwMmbDjZhr9F5HiRTWZC",|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).gGoVIMRsCPiSPVvrONQlsOTxBWqJM8Netfa2Pb9eBU3gAAjA:JmswAiMgvtyVhl1,KTpxT1KY64cVUDku8cV7SsjRpGJ0eUrTEsX5UN8GSHMcnHy:Ubfa2YphuI7DfWhH,;,/)>+[^*~]?)&(}#;,/)>+[^*~]?)&(}# n0QwYoeHF4tGUHVIEbG5oQFDwmLvSgMAeWBudQyU4K40oDHUa3MqdZ7w9Jx: "BT7gkq3PvwirL19PSwVyeXbySrLWwl77j","OuyL8CdljjbdEoWRI1hoP0cUrhQzESZo4pYL1iaqkpN57j6R9oB":xK5WjGsww3VXM9cIv41,=+@%{?]-#/`.@(%^![*~>(&>&?-|(;!{:FPAoHlaErJ62pCq6mjIi,]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]|]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]| "JRHYLYQRfoSc3Co3Tkuv4cji2SKoFZEqsF74AWNhHi4ZNPKXORA": NWl9h1Saewx2eVHLn8, CQweEhvob9jwgbkAri: BMEgiFG2,--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!dzcHfou6o5wcbbbcfe5VQfz66uY8bpFWBCbJNPaEt:oM, WhvVeijTvDSb8gq59LxFNkHATYBrurd4rSd2hn1X2NJZV2fyPpepavw: OTQJh5LRKVS3lTU0QWqnFGvmhQou7PlsgZYDRqksUg, "xyRrsfh160LS90LBkrny7toQ5h": "L6iCHdk6fA",%`%`lhkdRRt86TUkE0tUeMHDjE6:JMdDI8awGMIKyQzcSScKGKXGYkSpGR11nJpz6xyITKeUapDXCb, KnJnjUOJDrWitqb3s: UeRVigTjwj2IFWnV3C5X7ok8yFJA8VV7Mj1B2fjJEoXwZipJALQcS4BSnP1QdC4GY, "UCmHtya8HJ7WvYayKPStFjGr9PI": ktwiT,,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(hstJXbcT8mhVmU8acDL:ZyG, hJPjgOSwvXA7grxXfwMXmiVW8r53Y: HdjbC,([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(jH3UtPVeALpmXYz4NcsvZbCZou77nOev2ZbUnO9D2WQg2hYQF4:"qpcNF3zR96DwoYneiE5NQLidyug4As0fFs5qcH", DgIu9EhwI7yI03LK8vf3YcrkdCY2RFcQqK85qJ2yD61Rp1Agt: PcFWYuXDQgpYhUifqf30WM4EaEtWpbqA7CIZxvwGVDNMViMuDXOM5, R8oi8qQaFo0O1j1LS5wW5X: "vy3VsSsu0TEdUQBB3ZYyShlsh", UuoCasrCmvhJrkiEtFlwBc15G6i1nfEUBUBlNt6XJ28QJm: "pDJ0d5AScb2gR", HQ3YNhUHRp2p4tn8gJjs9fBtPDOocuurGVRYWDyMp5D8Swj7cZfpofjmHmFVvbeDw: "PXTpa00cNdK3",AYUmIl6i13DLMiKXpMt:XBc5fe3m,MdE:X8HKHhv7tlsvHX6WjD9i4cJuSubMcu, YGMjy4gc77EXGHWN9IUYmxv6233: b7woEH1FfH0p5hz4Q8qiWAKo3kO3yYJNv,[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`ZtZGEdgzk2DtwACz2UesHlMYCumbmdUlNg7gpnzj6Fh:Ne0kADdEX6klyH7DH,pzXHWMjslBtdfgQdHh1iBSUFFwrpTqeiss1DuJkj6Do6RmA:"i0LUP9g6OnnkTmULo6p8ZRzjuXGVB",`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_"HMfo18gC0s0s3qjRtIj4Dr29hP0Co":"nm",,<)>%(,<)>%(YaGpLpT58bbDHG7za6GpltmbVx9v5NakrZgaIijAWT9etVVmr4:jT,!|$~(^_/@!>>`|{`@?/^|!*![.^:XT2yJAufLEvwrePvHHwStoH0s0QR,{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}[{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}["hnBdFHySyVKq2zh66wEhIoyyg7U9cYFmWn2r":AnVRiT6GEh4P3qJAMn3cMx6rl5KOGQ9UfWY9LtRL6ZZIo9L,C1R:"GwJ0FZmZYoxEK",?&*]@(@[]..^.}_$<>`{.|+[;|?&*]@(@[]..^.}_$<>`{.|+[;|zT2i0psv:kx9VONUVc8W,'$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{''$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{'jPfWdVZBZYMNXd9S2CRm7KBipPlRufon7mn35I4DgP577SQAEIyWjG:"E1SQ0TVMBAVdIXaODR3rhEV", POPfwGBav6lne49t: S9ebEM1m9H06LIMVgpb6ltzFnMmkTqqM,nH6eEvP5VIGrCjOyWkJi40z0mIFYNmo613NdbYjp:"xYr19309tPMyzO","d4DdJf8R3P1lsmapW4nBqtoLpu07SYHQJBooUJUWyZ0LXVjFKNmyb":ohq,~+&].*(}~+&].*(}wLjYc9Us1JgZSscO2ckjY6gaavFshY7siJ38ijU9NIbWipNZfCXNugR9GJR:CtrCTcbYdOuH9EAUuCk898U7hX9QzJJh38Mxb0uBpySEvWZNCSftskVNt3BUN,zXmOSgQDFsvwWVrdyHRTsm:"nAhfsnBXDfevZ0z8ZQ5LMwGCzQkQZwqrvDBJLrk2aJl",<,{-{>`,{-+)<.$!<,{-{>`,{-+)<.$!R1O9uNhKPo9A5sxPnpk2PkNlM18q2kUqe8QVUgMd9zyYG4y1i07GHJcJQuo9j3X:etAw7XWetUls1tns6IIABjbod7gvYdoVTVisNX, Lde0PMQYXtbZ3v8PcaTx02svmAu7CbpwJHoWzXZfZ: ZmVpFnGq4Sj8RKflHE,nGENbN4PSbhihX28DkwKFQnWi7a1GYInnmnYDWXtojx8iX9kpwlQ79aKtV7:IwxOXarzrhwbso, Tl4SbTveBUUf6hvuOudpBujjZCcdizUDQIlD: Kr3wxpx2tYiJk851QMO7ooU87RX65hoFVCERbMZRBtMdftVl0QzeKrI5SW6Jv, zxrf1alGix5NEMRYpQCur77tv9E7ImWlLsCZu72uHAJvRZLixUam5lEJAt4RVn: HVGO7qkxefaA8kccFPeU9V0Zqpl4VFzWFrYg7NDeAybbIvUp,eRPVRwwPREHF9YRO:"SqiwqELOK90GAUL1aMScszS44ZQ1d3u27Lezv0dCqwvVZgvN5trpY5kfaBvr9hY", nfdI7j9Kna9A0jRb1CqgySQfeRVKWXJCyQZktszz1K2SG9i3h: UYxxGbUBl1eZlATmIx4LVHPBJqjeZnQGHuN4mL3uV42O3H2DcPdr1Jxo,!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[RWnmrnuvGuXpvC6Wf24tz3MLcHJRji9nUjBogWUbGzLHU60JH1QmgY2cd3u:"VJHmEaYD4BmzGJn0B7aeWtUflgvc", "QOmtvKsXwbxvcd4uF9M3nOcU4iVu4hyfKOQvyKPk2QaX1yRg6H": "Fg",gRCx4BfdTayGn6lc2gXkHVvXVbjPb3RO0uGgXgBMKNPSOJMcsoWjZe5rjry:"Gcgq0wEhtypatKV8t2fiqi2sYjU9Ql3yifLmlPkYOd8m5AJEdQeIcoPW2H",dzfIkgkfCIx3HtM5vMZ0IoiPWDZfl7wYshLv6cAfDZ:jo2,"Vxle1":PcJNKOoDUTV2rI9Jtt8iowJ0t9I, aBespT3Sq0KRkk: "ysSjo0JB7suLSHIh",##vE5SY8cOgxlQUQQTuCyTyxnXUxrsiTb:sxPWHAvSTBeFTack4Nd55Fg6ZzYs3,n8UlKU:gETjdHN4EbvDaBvDgNkf4icD8AgH4AMf,)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;>)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;> K5Aao7Q: olHVJ4D14awjv4OtWsgFFfMkg5qf50HPU3y, Us33oLbXkzfNUBCwO4fxBu4Os9RLV3k3XqvwH: "vf0jsyBNC","HlqSaOVkr9W":"TXnEzF389rfojfgiLL8wz6p80WhWOkm",'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?TgR8DJhzW5pIIzCnBPrNjRx1fp05TgcQUxXuiV6z7gbTtcxmsJ7A7bhBbX00l:"RONaekb",,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`!,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`! "XCsddmhs8cNLNtv6mHyYOU56ej9sw": GJLnzRsJxeA1XLxibR, aq7pyINVRPEj4u7i1x6u0aGf0XzPUDVOxnaNmlLUsiw: EBOsflG3qUp47wrv8AKK3mixT, BXDtXKDgpWIkMntGXYBEvjU1iaWtOu23ydmUP97BJY6UiIhMB: "xW3LmttW9OhcjuXLgksR03Cfsp73O4NxhjSxL3VOFYXGHQLKZqT7SU",^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~'^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~' fRrrxqkifFGwBX9f87h9nL: FqTU9x5TNkFlxGhh5nNR9Y2KZ7RTp3HNWyNBT1Av0ghZraoRHPMuUK3uYl8anz,[#''+)%_$)?@..>~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*=$;|-`_/;>#$](_>=$;|-`_/;>#$]"iCwZHrhW8WKWu1oQ3BHYkroWRfJsEuxUqFPl81NCHXp4bxAhA7VzpMKaibxu":CGS5oZUzFwMfuoaMDDyHP45IrlxAdac6SaAfIAupqabD65S,MTKBOfmXB:"RKQYAcgjBBX13FT1yqgVFC",']%%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(=_%?;-;$}($)?;;~>%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(X04qGqD8LIlXAhRWoR3Qxx3kXNicIC504Lp:tX,"vgvmgUgM8u4AexdyiSGQMlhwZZdjqv1iKCCxK2":F1oPuqUHq4haJ3wFQrnB, kP: "Z00lpV5YLncWv","EcULZrq93Ag6qgNrhc2BZIg0DdrXwW0vKInzIdOAjjgubnCgwgTbYtCDIP8":bUgXgzLM9S6oOaOV507fIs,<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[ aTmcJ37X9vlOTdFcXAMd: "vc4Jd1uCOHYjcjybmsdkgcmwz",&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$XXimVx9td6wORv1SbaQRF001OUaZ2yEkk:TxrS4Up3sfncm6qwvIY9KUunxwA8mQchlTrE5EqiS8DvoIao,~|*',,`|,]!@.?}#]%_._$~|*',,`|,]!@.?}#]%_._$aiLGyUFQDnM7HdVHtcDcKvzOzLph9LjqLPFqbvgOHBkrDkeJF9hkoGBN5s:TFoPMO1Vft4oqGHBc,bSd6YkqPKRhocl75h0fUYzmTnRu0olD3NtoXvECheLfYqYP1nEZmGYyjup:FEtstFWUqgNpcYhXDYZyZZWKaqimIT1k,zFGyF58lebcZzwe7B9knwMjV39x2hOPcJxDJGEpEaA7sWxeY7N2au2EHW:"YmDJ4XCfXcBUckK0ODpBBxuufNxQNnRQnBifcab9fsVHaU7LHCbjw", Mks5BczGQHkW8IEdHemDN1vvYBW: whiUx5GREKSDQdVBlgHGnYisH,"VCCsb":"cubsXjVU","OLxlbO7DY9ECCYt8Alqk2qZldwjVJUhr2kgb3":m,*@&)'[)*@&)'[) fRxI4EhoizU04xEgdU7kVoz: fAdgjJ7jg17Gp50ctbMNm8dhv7UCoSelAkwDhMK6sAg10, "niY2w8YpZLz0MIBqmwVXOMw5zuul66N5EoDYCWGyMtP5D6qN9zBpOoBbNFQ6": afcqHIB8ozDRtOxpgT, f9r6CzbJmAug7yLD9y56h: "VREmvr", z0db9ZIRVGc0I2w8Z01sdH4Z9ylxckcFnsH5wJ5ltR6WPaToUV4jlZym: NhKFatTX3hE4jCLk7nUI4kQZIWjVl,ZYCSsyocdYHOHjCLbul2QEfbNwdjDPt42NksHWe2FLz3eoOORrKv13kKNfgt:"uh8qrkUBPb3Tp3cl3C","PeCtSGL0kWNtBToWjnOEGBpb":BqyBmQDK2Bfqu6yiqeJ5mNWq9paREmhRm8Qf70WCku, "mfj0BvcSFWgvKmHFdpiKebldWuCt4beAgx0VXvkrwdCyiCyJs6Wu4UjhtpZMAEWqH": WCbAHZtaTEnnXvDr7LmpARKQCaNoC,P1QcZuMEArt7Z9SwTbbxUGpGXJieezvRjgKAUHCOMvHgD0h38SQccZz1zlPeQaFE:"uv7JuKhcFD39aoc6ZXGfdC6fAFCFNomSvR3RxuONohaBt3StSpF3dT","DKF8VEoyGPTf5eCXxtuUwl5lHodWUFvmEok4S9Db1LovyHqIZLwjc":VpMB8mCJJk, O5kL8Ot: "FghTyOwy8EPYSqIL2kZEO0gxdSCc7JEfhRqMiCicSVIbnrV0k4mtBBPjz",[)|!`$[)|!`$"ZOfSXIh2iA3Z4BdoKbyiZqFlY":"It0fKJJe2OSDAM8wfHkrbAJ7LWM3glCQjlJfHdNNKU0D",CiAxTxajAR:y9vcPolv,b2HAZweGr1csyuhmIKKGOOCu:"xbRJ4000JTqvIibM","mmO4Jyu1CgiLyuFrWLtIMLo4gmaTDfcZNyW1RIDjGf9wjefYLh":"FZU23C9vLBh3R4AoxtUhE6yDEXCjodUfu90ciwkO",nd3IQ3QYFPoKguqC1yYmDJVKkpivrS4Zr43Et2zSMNsO:"tHG1AVsvP1AH3NLiXwPHy1z3eqTrL2DFTSj",cmNskxWJl8PcDgC5keeKqEc:rK0Ks4QmuJ7y7uFWeLxuVAWCuK2z1D2NBC3q2eMTFNnTxaeFazqnYntcQtrsTHSnC, kagxXzSpskD4ZBGRmkLEsaFP45FueoUAwUGsMgefhr1ctwXSWYCZhdLPvt: "zYG8O3aGyarKXIaBlqvAW2",RkWGTcYVicZvHlKGI3qRK19wkdd34HWnv5AE:KVxrab8g5Yok9qQahQiZaJKn2SK088jcAj9TFp,{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-|{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-| PqsTiGVbr: PYIxJS4tcBm8bxQNdiuVW,${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{ TIJYwHA0ffGDYduxt7MrKYQsrm2qS9o1Adu2laToaQnvcoGgIkNymRpMn1CC6pWs: w3gpU6BCBhOvLlbIwPnO137am53x5H,;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+Oo3vMl8FYxibiEX6qgv7PPCdGg7C3QwVqe43t0nzcRBZw6x:p5p8NM1E8NhARz7PHW4qJ3xcWyuA8K97czRJOWvBqT,+^=~_=*@[{;-`&;<%@[|<__[@&(.+^=~_=*@[{;-`&;<%@[|<__[@&(."p8":DLoluP3IdhnhRH1PjcoEnXkNX,ejrkEyFQc3tqTVBuZGuVPB1J4ENyoC4BQdTplQSx77Ej2IqV7gmFXvtb8L:xf3bFgIkOOL4bJiA4d, DK5cpkYdyxaPylQjGCHA2hypGes: QmEpRIXY8jw8SYxcHRjkdvEDnl2v1BvWjy2NRxuKmy3CVdl9zOyU,"PVHHRpxVSdaeKfwKjFvIy1nk3FTPF":JzpZDXZJxzlfjR4YSqrsxTybMO1ylk1WtwiaMKmMlrayoTdYIZwsPaI,[&|&|].(/{@%,?|]{^<)?<)~[&|&|].(/{@%,?|]{^<)?<)~ f3hS1ffXmoInwbBvkGm6CQg6Ishx2YG: "a7k7uyEvnfCtg6GV43rMtciOD8Elr",h1uO9MwQT1H4RDoZhDRJJA8KQUcEkyRKdOZMwlhjNjtfCJdJmRpZZ7M7RgJMD3:JC9sa6b7uPDOVtSzyFyCAsU0XRLpaniEvUFnF5wo, wpzdWVyfdIbXSjyjTcDtZd9Mpl: FbEuwoDzswMztdnfENGqcSvnf6UijZoCI6VGuK4QHKb0i, "goKAPXNUtxzNjQBc9oplS7zqZL74IzA1qQ5ERzWIniL6bk2Gk": "SPeQlgdpAGOCZA8097Z4DAulPx5oiRgq6ohJJ9X2K0EvrLbZcsE2g0AfLwdoArw","f6vfNTxLcTHeOR404mzF7CgLHNMQLlIgKED":EfH,):TDmPSbhU,GSHfIvd26MHdd8y:o0hoT0zx5tc4UkxOLFcobQHB,EjDu5w07nRt0VqEBju3Rk7XyXRJtInq1VATVdzHcP9KrYcPgkWhiRz5EeZr6t:"KjdYDgdt62jHorP4w1BOwqnjegEarCK", "G6Y4tkfHBzcFr": B9KPWY34gwtQr7jKN4L4U67DZuMrf,"kodGN1VS3KpTge":ro2f04X9Y1z4XvuG0yhEbXtkoO0z7rkD06Gtq8KWlh3ZLEZG, u7I6d2HtugGkIiFuJCQlA2zbLKclyOAGKNx6brNXv: "G4mWDFt9ttcc3LZQp2FszD2eU", jI4vC2YraMqhrGZ2beoNviYEukZf4D3hHuVmHviMJ9Hhjg: l9aZc9X6ZM084DRIPJVabcUnfgdJLvnP4WainQh9r1BaBEdj08KdIuy8igGp,"R4qyXFt":B1WQuLuNHV2SfOZluKNfZ68sInkWJyOVwTEocLtG1qaFtmD8aCzemulNPX12H1q,yLP3YDELLNxCimWowNhVNkMT2koqDC1CSKuin3EQNiPYSFLmwKkqFDfL6O:UttlELI,>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{Bqf1sYJy9Iz34lSfs1GhpoEaKR3mfKv:EcYid5vqnyNZwIk76HWz9qAAb8HBs53naaeHveAW3Lt3Lpfvn, iS2JbUgH: Blj, j8eDaaa2wI76vTNPv3eZjyODnu4fnpGRrLAHdMKv: L3dPWGsUUPiei9A9fr3ZG,"HpQlpj8c3fPdkTpM":HXh8sNDbMDsUZ4fF3ifIGIk6ZrKpB1QDnj7NZ8K74NTMW,'_,,['_,,["wl6SPwCjqCqQddm1uNGQ":"ITrHYvOt15nVUPMey0gwezWPFHh8dcfA4XntT9gVN",?~&./>^~#+|>.^?~&./>^~#+|>.^N724gL6XeysnkaF3ec9kN4TDpECqFV6dzm3PG6qJ4195sBG2b0D:Opjtkp7jLzM18YrdiRS91blHbYvw0l5Kq2uKj4E5EMKdr, LlT5C9v0ABirQT2NUQuirklbDtmRtqtvENWOVpLjQzRJAowL9ZN9Kj4g: "MnXpzpx6",<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^"pX8bi2Bu5phAHnuWkr4bzsmhAfxsQoXqxUZJxgi":o5LaF7yqiS4CK1oy71esenWhSPuts5nssJX6ONrlUwwZL62d9apNJZdLveA19lB,mNg7H5Ih:v8S1lOOqh1vO7woVqI3UeegPXk58mY79hKF0xqqcCEPvRHRG6oHAw3IZXd,(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.gdgEZiGvcHiyqrQVJjiPObbDKiqqW478RoGzoxGedZ9jC:YSEKDr, iAWN26gwUvqoEMB6DaEUGzcHfj06liB0ALH87IiqdE9K31t: iOmqKYFQ9A7hKznMYlD5nBBHZNHxMimfGoYmZmNLURX6O5VYBCbFiOn2Cy,"LYSXjIRMSB5hx0dxCliufzdrnqtI4O7c3HU09g6KFjC6wZ5qAolJ4dcm5gIzW":YC7srZ9PhjlR2ew38phumGO7CHG,jQiD6zLx6Vva4eAXBCLQxEYOyDdiYMeJoE0mxaBJ9OLGMY69OGwbBdr:"yEQzp01jY5pnPjWkpgN5bTpo37qEBe7n7RYMxU",UGDJpYupPGSY3:duRQcZ9eXuG0w1ys7tloZTTVAV7qelV,dmYKiRNDk54fenUYwuDkOYgB7lw8Ne3znG3gLU9KZUi3lvX:Obwxp2YA, nTwCVllnYRo: "Hi8IOZ9joblQR3VsGxfDTxP4EhO3zkG2QVzJ17hWdtDSnsMMicoUTuOsG6hNNbLhQ",+~)`)[#$)%^*$&<$,`+~)`)[#$)%^*$&<$,` XLxraTPaomeB32vwwJv7rwsxD: "dKE8O950GNLBTSBryS4TiC5FBYvCG0FhZo3n", "pa62MsDLgN2amGQ3VIPP6aXJpBt1haBMpGLgqL9J7w": DCdIGt7BFh8gJr6f5zPiAxHG5jdFTkAVr77pqSoalSyQgwf, PYkCGtiH8g6gMnJC6NobllD89wk: "nN0aVzyIbt",];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'GE3DrQmGm2qCMcpwhZZCBJhaM2PGF0sVeqbM:NhhNLimUlyED5u6Zq8qUnH0Z6TxDtJXyndWf,+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'&+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'& "P8O4gMOvxvGZdwJyy0vQeN1TkCE4q": W8Rc30kkImjXxy, "tXb4WKBrVpRroLylaHKAkJmzwx5z9H5mDMxP3": Li,?{[=+&-$/,'~)&}~_,[^/].+~_%{$(/)#*%_$*/`$=;>)^**)^**!!!,__^{>_~'{<]?[<^?{*<[)`@((<~'^*@#-^=@>!!!,__^{>_~'{<]?[<^?{*UFW93aOurqtEIFQ8pT:"zgTFXMFfT9NCyMJmb5HQtgvrLdEgxQ5wfO4xVhzjmiL6BHuUrLDsZkFjLkgT4RBPJ",>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,&>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,& CLY3WDpxblX2unlMDuRqlQAu8XyVaRbeVMgw3y: hnY1uchi2aQRhUY3yCmkHz,}<#=}}<#=}"AMMu8TcTt8xC5g0SbWUSxnp1A4przOG22FNM69E":u60Z07mrL2vmwS5JTdv4O0jOAM4zS2GrhhbmvwbLI3zBjESMIS2z0Ymq,UaccRjZvTS:VQSucH7TUkOyKof2yDvoGq08a1JaYUUyizwCMbplL,w1VmrtGn9XjPPPWZ0czmgFWrR44IyzFJvK8zABzUa7TfBpM:FRQAxmx2SvFezT1eyBqVLzYiLbNNzCSeaV7,'#-`|'=@='}(}'([*@['>'#-`|'=@='}(}'([*@['>JglJOO0M5CuKhQvrsXPZaqkexQrb2NYF0V8yn3IhMKu5sqbqI5MZuY:jKD7Y4,iRN8VS4pu56eT6aJTr5fPeqXau:AiPLYIn735SoelkblVWhx3sC75iOixMbu2k38P33S9e,-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&"qCPGCOpaQV":jqXrKe1VyHU2IK8FzPGscIyqyZRU55kJAByxLKaavODTlldLhMWA3ciLz1p, "Gf7MfBtxK5T786KKkSMMqK0eZCqkXq": "DiuKwststsbLUjgOPWEA9XcWj7", "jWzlhgPDnzs7xTgDvagrFAoKAgG6JnjRp83nRtTEDEdo": K3RYrP8aLKNQ3tMdJuTrnCBLHBKUuaPjEMQ2hMmndIY6vuox60DBrMLFE,&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#yuxcqINQUPfSDp8mXxzyKDRvhjoD4vYInz:OqkzT52vrxd0VtAqgouzhM0LbVoEfPLNor0KyaBC3CIYnZzzrBQsjpjt3dooMcAU, UtiZ7cUXs: qbqzlf5np5YFyG2Q5Eea4nvgaeEdDEKhXg9F3v7WTGNwT1gny3KtOx4b8YT, "N3jwvO2pKwDlAFP1k": S6ud224MzjpbyrmMY16DQvaWa2Ezd8MKp2PAcgPsml2pVQEmGV7jg,``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+ "UdkQ8iEMToTop7MTzbgQcI3mI5I8fjD": mwcf7,"WCf2nZiSSJ2v0oKUc8kQ6U1EXKXL0afcpHsiV":"cXkzkllEuowqaWGUGmiIf4mleWmdkq7ziTlbZE0BLBFgqq3i1lr0AwXLg4gImx2n", "a1IsmVuk22jtq9gsmazAPArjKkE4LHO0t": gfzXXxtiOnhppcmUHggiES3U5qpohWNeaFHpugUSrFxoZcnux5yUP,oLpL:s2KQNxPGVNXT0Hc66HkJwbv69QzZr, "Z5jW4mEp9aDqQg4Iy0m8XNlg": lrQGwsJm96gkdrmQcpTRpSumlNq9SwcIacV, xoqRHlbEM0: pBwMKM7fmG,zlH293A:LJoGka5KeT5Lhd2WlFur1f6G7zFwgba9WXJ,"V1NspEZRybKvdzgDA3Fs0rWeJuffHdZJYpQArn7fdep":KVuQUwvJHCwyxlsXUQMbjE,K9jPYaqUMfNQykkXJLHCIMMLhOXy4Go:GguoEdTNRs9earBnJ2etRrKdoYCueQPKZ3V9pkzeHmEQcNG6l2jfvwV3Ac,$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@ DHC8El9h3: PiTospdNn2FCLCOdFsFhIiTAeORB8P4lfX9drSgtlq8LDtozBeuUOVrtfion7,"syjL7hY":EiJBU4k9p4OiSd8n0gvZbaFP0T2xOmK7ToqOB2Gkzn,SbzDxo63lICbhrH55PYlWqMXkSJLpaDEuGYfn:"iuRPIZtEsbUlJ","xk0vPDSRKQkIWMCWIofAfssTzIqr4DI7dwvTar1pCrCmwv0YI0NTp0SeAzZgJw6YO":"x3xqkHf7gEDDE7Q2WQkC5i",&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!NFilLqq4i7u6MtTSB6NK95V21gp3fBv5bL1asJ2k7kFvfrifXqWAbGfnVHQf:yJn3FfRob1prNIdP, gcT3Px9yv1yYOZsZiK6tBSCuFUs: UFzBmX1n902GDwVg83TxgpctPapY2Sf4Kl7qLMbui2o6oIAn6jeS7,"xbvWDESxCM7M1L":yJeAAyzx6SEJY5xP5NN1XX425v,pssqKEkG52Y:"O3j6q7npHeYtep7uuO4sQoubjHIzxo1SG20ynT00RYPlvHRBavUBSR",}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+vkfqLAtJGzIgINkaCShpTvrhEDcX1ZI5qX2uPnhqrc5EyGUg2ExnPczPn:lbU42yVaWu2Wd1S,"ZCG6":jwuLwjiPKvzfQgB93zoyzL,;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;yijyyTlMAzd9EtvOVyUQgN8SoGCFrHj8a:"i1nNKg05uBNZ",lL8yBQ026XaQENzMY6I7XUBIUfuIUv21juiDKeozzBOKiDxvAa1LItLp:BfkXauEzU6peJOJkOhsBywXiqRRQcwFcK51jPUvcxQk6np9CgIaqbzasUi5KHHYq, BRTzaJKyonZWrT2qgmAoiZuU0bZZYUC: "y",>(?&|$;>>',^/?|>(?&|$;>>',^/?| s746c2V1Oc5HJxnc9lKj: l0JZIlVIS,``(`)_?+(<`$'~#-!/$#'>~|=-+^[#(*)!`^`&**?|?<)'*/-/%[$.]%':2d6CJl70IIzdHh74jXfio1Yvaryy4bJwKz5e5hhrwtlJaWT,$?+|?~.#%<`;}$}^)#@~>*+$?+|?~.#%<`;}$}^)#@~>*+"efJ":"yAM3sshJQSAgb8lERXYoAAQNBaEeBsvGGpoPatgAywKlCXolJ",%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-"jDdTU6gxIFT3GOj4XpIx4RjUMcAaq0rPZnnWeIzHUmGDJz":YjBVbq,"DujUf4YSnUebqpEnPTwadMuthaxLeSt2dgJaxtFba":US9w6o9DWUgfke7BpoP4hgrQeEsC3hnaBXbbinKSuxy6fxPgQ3unfa2ag1, BjQfaWAFMkBa2y5SKYKnxTnz4TaG2ciclyihOQ5HmcIC78yN5cpmkheTP70vX2g: Hus5saqjcgri,~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/|~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/| bYy1sl3y67lviyWHzBODbuEPJh4Fb5xmzhM5qW2TG1rE7ip4tW: w3XAcqKQg5y8trsPiVwnkzMo,"QebFouUByauHZ1":I9zm0r4UFT8jltHQkhJ1OvSu51exSc7kJCEEDz6qYDSEacENyX5zurit,KyHV0uCREiatMHsJK2tvyXg6nN:JMg,"ADcM3j8J0sLqy":A1IGSMIG38CsRr8PVDkKehOaMxPuXMX4dcbkm26DJyNjL,iltzxnQohm6B3Io5UmY3tnYIgkno9egzk8vvXaKC1Wf64S:aJwvXRfH94F72KLkNZaGvvtIAvyW3hwR2gJC6yTOTdoaEdLmkuhEq, d2bRiy753HAQp8vqI3FqEo10yBMRYxAVEIHVBnXy45DUFQkGOrMiQp3r9: j0rLhhkEVrXqKbPAuUmhi7tkXih4eB,~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.OX2CTUrjHpAgVz2el5cVFIchM7fdyl4OZKy4opHWymwpEutnt:pt9ELXcQ0PdGD91lFm9BsXFkw6LlNCV5v3ARoBgqFqbNf, "c9EvRq5dk6BWdIHF0g0w": "rG8ergRVanEWM9i2vTeEe8PiNOfuAUVvsMGrVBOJbEr8IeGawuZjgcyosC1",vcHz03z2BYwPeppg7DUxyPUKY6QOU9C0VO:dtVqxgsDyzXcrqEjhXzFQTzTHVxrr, o7WYYvibkOKDeqAKPUS0nJJXOJ6OSf8M4Us6YDjiuUC8: RF8SxdxiOnPpkymtWq9WOURDbOb31u1rpaqJXwPWE2HsN1eunOGD,@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.>@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.> "esnryZfref3kvGzi23lzHMXYG2NqKBcUf1AMbkQHmyCT": rrNtWVbTm8Tfbb40tUTR,"QU9MA2fHiIxSE":"amUdexMiXGX6z7lOQtPUIoRVm2dKYCIKGqv13KlfOWoHx",oGO:avd5OcldcU71C, "ymimP5eQindaFD": vP8wqvWuOUmjhZ,*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&Mx1QAtsXRkgiwD3SxjcOpdxg:sIDWzWYV3WUYugbatSeivXvUV2iBJK2X5jhLZ4TFgG0J3LkCuqRiDRP5gLp8OwF,}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(KjCgnvzt69a2:"sU9BCKkXaeHqxZCZSmpkK8fn2oSxggncAa7KBKxsvtQOhEwAs6I8HTIrI0VWXO",ze9rDX1q4oFx02J1ddOD:sMQ7Vt,okKO0SeCzzpFlYeMIaWOxWw2hjnb28VHD5BRumjPtQCHZQ1:uMqYlgxkipktlAK0pAOWux03ufF3CMsyrEZrn,KFpwET7XFXVe2SgcWtpnqsZkxzi:mZOBsqOpYcFheFDwAM3xBih5pExvzPwin,'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%Fhb3iFbc7ilUEY8CONcGxwk6TxH9KEZstSQeMwvNDO6q2lKyTteKUU7fAt0soAx:"PxzXWiwnPdfUm7FuEaI70tCwd2VwCpjx4ls18jVAZqCW6S5xiHT7op7ddvidzcsNg",Dqkheci3aG:g8yzoW5vppYhgedh3FaH1tEx53bRs3zuw0nvQw9E8yHkj7wp2FMHrwaVaq, m58mSekboTlNR5hamr2fxteHO7ClK: "hjt6xqrp8hd7x6IO1BfGgE2MiEVgaJ4y",wZPrxeEfnc9dKioGRQMFxfAO2SKZXybtewLVqj2nL8T7WssJKmlC6ece:"FNUtWkRwP", D52y: "LKFfPdd5dYLh",`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^GjV1SRplBlA3nZ5gM:W9XlJCK0big7RpMOXDl9Ujq2NPKMbTjuyp21f9dhZkg9V5, "V3Nw": "xwP5rAEFaxW2qFXpgALYaao7fCfDxKPRFC4RRpWD7Msf8WbbhR2iL","UfvXN1zyno1GyhigMjqtctGOL":"nSafXX2UUFRVmHLOitEcs",UlItzQhmdKjTzw9JEHwT4AWRUH0YMnGTV9:i49g5zhvn9x0q9, B4NG4p63hL90yZgdabh93a2x1v7CnIZa4nDatB3gyBPERcVb: gWjoInZN,PIfkN5YxvKy5bVq9d2WrFwol8DzZiGTcVRVyq9fIi08ZGDW:fcaXQvb9tM0JgBi41a12CzFDeJLqMjqsO7aZBDLHuy,"KHsB2wRTyHFt6BOKjozBNPXHHtLZnwJ993vyZNrRyX":fj7uU8wOIpMIdZpgpPfQ9vCy0LOi93eiSe8fNAmL, "q3XKisdNJ6btpkFSx3": eXtJheIbNc8TIQcfEWFReBEo7JCwtQwJf8JMb, YoJbpTcvKRGQ6LJXwxFEj6xLeVclXxXO3l1f5Qpq4W: "XuwwuPffLH60HSGNZ14fCCqoMpZ1gLbj5Qxs3RZggvhICmRY5The",_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$<_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$< GsXZEIaKJHOejns0OxldGRKxGn7p35: BiJQ2mvtDpA,r3UbT2oTAmYtuOtti2yYgdqsogcANkaDzwGMdw6igwIbWZVcsaA63aj2sQQoaz:"WTGaJcGfpXHIfToUOTiOjuqfYqICpGbmTNcHCUCzYU",[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/[[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/["xomHt01Ql2rngRwQxRF":YWSfY792cV5CDqtz3vNeTr1H7mU8ru9lmBV, j51YIciz72u920LqoNiNkeEp0Ve4tQLFjPc8fTGE926XQvOMm1AMwcFrJEe: o3QUTKUdy8JZBhSacyaGIwSB1RWxVgP, "zGZewPERrwC2GZi": WEcnnPzi7rG,Kf:mxxPlC4f24lTW868RZFK9WV,AMFZwxG8bJWpQ0TV7HpXPWdN5xVdhnVmKy2nuQiKWxpHyJAxhUVCUY2trU7tj:Y6mFkLGqSOePAS9y6YBAJbSIOs4auQ1m260UFtpZz8moeY0B8wwO2qq6NeYi7bFo,'|!^_'/=]=,{!_@$]{{-#]_)+/'|!^_'/=]=,{!_@$]{{-#]_)+/ mrXIPdwKazd: nNAt65HO9DG3bselzLwFgXwV,"cVNQ9DgOCVtsiet3dOWfL8bKG0PQYfszNW2uqsNuA":"u5bTneSMrWmZVw6ADDW6AZ",pEs0RFKAZVjL2lTgtAuWRI0mem:lVCIpkLq3c7Dc1pCYNFiAiMtMqAPAxOg3eQ, Nzn6a50cGp0Bhb0SXXRSzcfRV3kXBUaTL30ZTxDEgM10LUr0RCz3ZsAQnB: uo6HCG99SJFGxJRJuM03w9L4ef4po8lllYBMoYJ6MzMjP6bafaNPfAbb7c, bOmXYSTPr238zQ0fHcTj9Gk0LhtubSl5nfLoioLnMPumh66pyINgDEGDmriWp: IFOmIRy5w77GLhVim2cWNlHXlT2qA9LntQ3gwxe8,~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~F9YacQz:"iZb0dYeI5k7iXXhwW4gx",OPOh5WdO2feZIaJ94CIAhtHBtG6MNCi:Tz2Q74Xj1U3Gh073cq5HXiCyrBbC9o5zV8rpzf, ySZDlx4s3giCuK65NpnxA8CzpkgJC9ojbhDU: hkBZgXJn,jnBW9FKEgHb2Pfx:nPpnP4yHbX,}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^`}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^` RL: bl3HD6nJehJyU6flWunjatKS7iSDU84Zu7gd8AP4H4Ul3ZSkY, QDjwX5Ns0Omh0jmlNzsLiUHw5kNlDRehIq3gsmL0877YxhXj8y: b2GtY,@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-"SDKT9suVnSCwFrg5Oa6TiKrAOJrHFUHojStKFxKLsOzVcRE8nD8gJZEaSH0m":TIa6DA,-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}`-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}` daYaSxoZ9MZ0pc5: "i7i7uMEiO31xcSlkLuV49TuezA4rGcQzDvkOV8ICtrjUQxPlV",z1tHVd4okmOb7iy19JVUEyJQVrMJ2PxB9:"lsQbIeAABh5NCMDraFxowvEHx",=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=#=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=# "iWx8UASVqcuz2mF2qFTQHpx4dycJFc": "roSdB","FvqxltuuRm2YVfUQ2CRALMcObXZjwDx1MVQLQq8laVGS0cBi976awfna":"Z0Uu3CopniAn1",=?((!=?((! "y16hNdkuC9": IKMjsanYOXmvKcU7pS4ns76w6DJ55KwNl3O7U, LPU9ZHDohKHU3xJgxz7Jky6dkZzmKwUxQWMvvH9HCIrkC: mqhGCW1C8BBYYpDafStyBjyyubm1B0FeO,^>)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_|'#!/|)&!#'),,&*+>|'#!/WASEkKj46oHcUK7gY:eCqc1u5iJzfmHPpUToy84na4x0q0PZes6pYnYbO1tSQ,"YlAN4A2qdYEwNZ":CMDjINULrNQtb5nvJYAQO1z8EkbBIk7AYCTDKEPjY9zj22HqoPrOz,NhvJK996ZiIzHTDBKfH2OAOiiBVAIcaBlCCmULnOZLeaJ8XH2doipSA:oVNcmGqr9,LJbBX:"aquqhAbdh9eMhhHZ01o50u7MTowJmEnqTW5xbJp1EmcZHyBq8Q0CKCcKeEa8zM",iw4x0QrGVxZbquK5orCGd3xJoecJMQT1bS6o:"MpkFJvJpPW9", "rMFF7MTjWzVGjHWacrrbHMErNcJRLM23Yz03wNcHhYHYOVw2b": zckKuFXAkfUPB4JjltzW9mYkcflTzXzYhjUvU2IJdaTi6xCfjCvqjC0PkPLyJDp75,BIQoxvLRFWj6wPO65Iin9inrUGWtu0r0foQzlNP:"gJqkUoQwJrjUiAmrVq","YhhMRftAObzeikdEACQCkeOa":AuRhNVgkdAlOaMIOucQ5tXp2zohvaOgwQOl7,}**<{}{&|([#$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%>$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%LQ0N6jOl3f3oEmHE0WMpyjQK0RKHz4ESesa5hmhxh1uuEjgEpUBysjr:"UKfQNhEJWtMRGS",po5YdW9SpU7gqi4Q0NPr4C2D4jUj3TUUzM1DiiSoFhrhf5ZNhkjr:k4eWo0ntopxDKEOK109wxmLGpxBbK3ZsWtT1CAJa7S6kqrgpV,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?, RRt5DWV1dakfaZXRysELdYp: "hbk4KEpc6JW","Lg436tveSu4RTNQ3snPKNZRYgByI8qaxER86b2jD":"JAEGlwfAdTYCVOSOcNKx7QOl9lUmgba30ZAmz",<~-*?)[`%;)^*$<~-*?)[`%;)^*$"FTFMKrXxa4UQANdTi5m6AeZsqJnmvZm0ds1U":HnlqirZKW,"RRYJlcLpiP6EHQnaYMHPfWBn4vD2bAZjS5FQhlGAG68YZPuaw7n":"KkrBjoPbxmhTw4ojedHq3FU0YL77Ka24Y",k9fMjBlTDwm:ceTaRoLi7wfPcYNcM2, guKFNc: yo0xdB0YIqosxbk4MKfDXK7mvYgHhH1rxUUAATBPv1G5ToH12,$&##,_]$-&$&##,_]$-& HvyAH7P1DY8LFN: "Bo4Ifa5YWc2DeI7WvY5BykuJufr77bpeQS4YwjcS",NhD9IAk5vApeOnOnBtoCscTFEG5A0tiRDZI:FSvLjnCkLRbwAfcP5pEDGMWOJklK6M7xq,wZeL6ygSNyI4UanmECFrdLOg4ggIbPi:Vfjy8mUyCaaHGomxLOYklVSZaJRyi7RpKZBtSCjYhyxPs, "gc48cIXEHOLIax1CvuXJ6xIQ5f9s9GyvCfNLuaeONOIvnzOfCXTEXMWXY3ab": oU5G7xy14awh,"j1zjYXu4d9VfoOcjhLVrtuvdLRbYCL6IdXx7Hp0fcWRD4FqF5o":b6RI7YJqjnewiFww1ftCGlPmIp2p8uhbJ9gt, JqcLJl71CV8flyk3vZnOhx5JvOrPxZ6IA2FzzXlCPFHewiV8R4vaSmXP7: RboKKvN,+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<}+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<} wcV3isKBNW1MyzceHCd5rHLiil9oxarOu: fwtA4MHFKfkMrFBTNysSdttTUwYxU6HEWYiXc,"NQ2ofCLTINCjP9nXT":BC2AutXf33lVi3PMcRwhQs9rqE1IZMA8QhI9IJ2UjWJ,"weYxuCBi0FoCR4P2XhlhzdCLScQTYqsWpEFsrBjitqJZ":R4MA7ZW8Ele,bDbFLgqfd62UEFYBqY8YpIac0tgRBrYFH0g9rmnsEuzb:WZ0U5A4E50v9cpyAtYEAJJbUQ7ULDkJub,u6abxyHEr4ZIhfrSgTrV7:b5GICLws9RKQboNgh2LCKIaaVLoqeTc0Hv8QPzNDm6YSqFqJSATyvpA4W,XcpJ4d0LGPRDfK1BebSlETfLg5LMx6jKHZuQedViFPgGkDCzOJvN390PGG8ZTFdd:e9p4YgXWoo4yT,KbzIGI:U8P8I, uEV8uVuyL4fQSSw4lckHIJZNEU3MlelKV1ByBzR2XWgM: wVqPSdaJFdLh1V8mbKxaKrnqxEtabxtxOnP,'!)]#}'{<%/<-<'!)]#}'{<%/<-<[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#%$._-.$)&><[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#lDwt0EbWmhzKY5aVylreD:PloSeojbVJZIfDjhLCSMOHMoEC5XVCwcJsX0,`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<"S2QxTNp3MT9qbeiMnFg94EWiGGiAjhMXm":NUUb0lGTQmcN4G7f60Kt6ASfc1QCKT8ZcFajXCXpwVQk7oO8h,QlHZglJS:"WzVhA3SIvmsEnQCn4flsvcZuMoFlSZLjQzUqGoJmU1RO",#)*{=^?,#[$.`/`')#(}#)*{=^?,#[$.`/`')#(} "pYaqg87mUNxyprH03KgZ9": iG,PKk2FRFUR5qAk7feNwUo:"cw4caKeZxiJJQgniaLKKNIahVgYM", ZjjU3bqnqB1DnibSckRrphmUJdKRWzq6ER7b1EpGk9aUjTrodEDRW4MT3Sd9NpaOP: "eQDnjDcA4DAbnvAvH4c8Do4olT702RJLHzlOkdVJu",uNTvPQRxRaTFnoTzR5Yx2d9Z:"kcxujRXJtwoQ48POCzNiXjLp2XMnCTy9pLZ9hfp5LaEGL4O5qvrRNQKtnKbmZ8pGd","RqCUKGDFeDerO9c6kOqWJo5kZRrBPb9834HV4RCwH3wXyfVgnb97ZoS":"gq7nci6CHWoExqVpsOz1aDOHIw", WTnkyDKPvaxNpQ47horl1yickoRwfRopvXqU: "pvidc5niCgxdQonrTzyCVLlE", MNqkj6N0tTCrGYkIBVBURb1ZkoQ9SWFqUtqUxSiI0ZCJx0: "eubxM62ORAfIhU86TT7ejwAmCw5yDrp77VhrpWHKu0fGabtf346Msg4y4",mooqd:fUEcK3NAOr4oO9dmNhokONMhGhRYQciKKHH2rz5FF9uRIUW8ZKmivRGh8DW,=@>')@=@>')@"OGMswiVzGCvUPvim":q1IhTK, kcOXujlEtBKnnSJexvQMtvtMAs4dwCJFikt1yOoev0TZbtv: "WpPcvCp37Cl0h1CDwwwTl6xxYBPAjcqIvSVUj1B535yObgOtjW4xVPNvsZ0Y", "V1Hs2cTqdhXtyeWePwn8F77ekbwFJRDLt4qxTDOO3XTZHRFyJV": n5Vzzi5mZ7fAjGzWhwwHfEC1c0G49HgzewHZk3Y8faiuxflS,"NjHOl0Bv3nNTYZkFjLjesD2EtU7knqyyOdNzxZU4tDk4bMpD6QAyxFwB":BCG5hnwuR0ZYlhFLiJdGa16azcvC00vjY,"JG":xZFzN6UyXxQJuj8fxdhRl72LAkSFGpX8,%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!.%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!. yQmHiuSomZyTH4jTQ8ITC3GiXqnIafxIHhd9JEC1nO3XXhxruIQH1x8: wYQAcw4yXUswcDJXtp5L5We,NML3CNcRTFZ8FNtjRQcF9tCOiqVtwrCJ7VLjvQNgtCcsjZzzrjH:"WqkeRjgK", ml6hzXZ3rWsCUeea8UWi96ThfO0jf: "J9cs7EPXTDimydR4lpi9",.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^ uBapzXQPg9H2yvBb02: uzBen2Hq81zulB,`<-$[`<-$["tTb3KK3jjprSvv":eckH5CaThc4YPmtC,(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?DbM:SM8jE1AvRdysY6Tf2rYEMz4lyoE3p0MsT8rD,k72BAS7m33YrTE95eyzrOrsVRiBqN0PHPXb0LsnIzB8:"tYZHbXLvwMjJuvwZzZg6xatvnnTRn","TAonzENxLaKKay0Xkv8omR9Hp7ic":"qTxd8o6EDO7vfvab",*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}fEN2TY7V3TxtB:Mu,;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~ zX: sLWHslG3lMsz63vY9oNZnf7cyFURzBM9Amd0iCHh06NvaSPk2dvYU,"p49QjXcpwB7K8HxcMIkM":"GOhkxNTdQYx4LCvzbP0A5gQ1k630aPkq",BKB3TA:pBgxXikCoCv6IenewL0zMmlCuIaRLRGxImvYf87cFgmiZzSJGmEUVIKS9, "NQ2DfHecS7cds63dlz7": kCwsJm94kV,>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^b1q6sS4H2Wnlcz9gGrrzia9dTqmW5fn2e01uB1tfNnbIQjXkHHiNj2g:Zxfsd91PCWDg5PaHyUGmsrKJD4nggckYclTaldB7ZRGwHOmpftLTtjzpOKn,wqG6:GLn24e,#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_ hrHqXNvyKl3OARwocNkKk: OzG8hOXIkfJHevkUmVqSXDEG1Nd2zeEi6W900yX4isfAZ9cJye0s62cSxJBaY,$_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$($_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$(xbNlmawrceyMHKSHCmDIMDILskSpdCGBp2n54yL1DjrUOSycAsFmtIrva5Mh:"zsCgwHaO4WQ4shW31BKo0d5KOdiv0lmHa1w", pa5R77ujnilH9GTlK34fGO70FtU5KRrwlzBoiflI8i8eN7s7Tr: txaTDVDeexcW,$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'Icwm62vYnB3SWER5iSXHlX3LS1:uf2WyS8jibA31t,Bhn:CN5Rf7yNlUDIxRSYyNeY99ad0sELspHNRuzk3IzbZTHSSpCCvTsXJgL8c8Ndz,"z0Sx4R7v1lSQT5xHzMc":dGMmHnpjaNMLZOs18mJdBVYdn9jTss5lUxpwqIYUabxEKsnndTN7emxSdoVdC,qBRJeLViID192KlFuLonrcC:RIvKVUXNlLgcWSRc8vtJzfTBwnD40NIKPbajc6iqypGBeKf,"s3vJa6Z3nJYroa4tM60d1ZIAJbUSi":BrxR36UlNbP06PKSo,@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]NNLDFS19AJED97VeIq9HeP4kt03kyyhCjAFvNzWifzZPVX3jNAJmNKfY:u1wCQjAU2DT0ieYD,#``##.]`&<]>!^=-<#``##.]`&<]>!^=-<"Aei4MI7PGCq3NLlcf9Ykgrjq8DgJ1iwoHq8vRaZSWdOsYz7K4tilbxP5tyZJvY":OIJamwFmPVzMpSy5FGBSj97xbO2wTEwcvfCK3d3S22XAsqa1Wo9eOsEiYHePtuze,ZRUilas6LF:KGxwmlFxAGPkB8DtPjlXhGDonTKWyxMobZQuPyXVTIlFI34gN5,,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[P303MWt6mdZ8tWxbr9pBuMHS12tYoBnZSSAOKj5d8bV1S2yLWN3Y5v4F4C1Uzz:cjyy2Y7YtYEEO0XR4qNZIFignhKlJBD7sNjYOzmSwDiGvtZaIvO, S5wHqdBrf7zu: fNgIeVZK4fDzyGFEBBYFjwG4t2iwCae6d4rITQwl,e75h4JpCdz:hXedMiTDJdPm6fAbUKKDHyhZRYTtA6LrcwkSp2JbOdM9LBHqqIOA4Gvh,OToxb8SP4wsRTNsdlxpOYuOmQmrsa5FNygdmw:dGQFF2xR7QYaGxKbvHO,sKu:Bp5c3XqybAD0a,Yks2f5eF6yUKgFFWmQsqusgwcFnmyjyBgmFLEEJ20qJ:"x4kg8FGDrRMCAMQj7pdrvE2OWUbriJ",(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!PNikJGopMpAr:rn1B7934HFFveTpnrsx3AOs2m, "duSlZJvLaAM9T1Tzlpwj9GYm60Syt7MvNwoSIVEYW": CFKW2Qei28Ovz,"P1wEaT56zRfIN2LGUmd":ypZXpzJhi08qmMNXuxEf6cuej7Eln7iZ,CTxpEKH5JjNKdQ2fY5Su3:WdqP8JpCLo5XJEgcnyTbEboM, "zQTCZEB44M3JrN7dciJ6t": "T1oX1gWk8a2kFR6By8ILoFUbGQJJAy", "ozSAY5qaHQc37X4QcsdAyDzqaoTDTxAz1sE1d28I": j9EvRVg7Y1PwxxO2fH6uukITJK6lXU3B2BD8B6Y6ucLzGQFeaPRdOJ7eQmpur,cOLonIete5rUIN9LoaSqgziZaHdxPj1Q3AtcYWCZN6bt1FiIk2fgvIHsK36D:JnW7bqZ7LOnuCCygrWJBjV,c4ZP7w:e31UlGJ8Iw4RqHmUtDLCGMvEs2NfMLULZkSXodtswTt3yFGS0yavZ4KXRlq,'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]fT:ub14HDBRkWuU8MB9ZhHEHmHh82fhpieqdcGgkwzr,]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=(]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=( iuwusTx: ji2ycPVkMEa04V02LVMGDS26,"hyg":KGiRB5DXdYTf3pGcafGzoUzLEA1QEa8Xn7IVlDhIxh3WPLahTO279ZOZhhYQd,^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]]^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]].|-_,]#_^|=+:xYoQAnUtgj4nhPM,i5DteAxJkSPaujImuGuy15lvtNZFLwlCm:Jc4umU01kkvtgai3TIJkeylsqQf9SLa7AbHGddakDGE5rSyN7Nv,OkHldTGML70vE47ej79:blQ9qCThCvUmDDjGqcSWhGORfB, dEiC: "gJQ",(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?mcqtAzPSqR9EPH3UfziJ7dfFj:kHeV, pbDfdyHMW6iJTXBrTToH7I8d1bXdujAkQM: vG9TcFw,|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~l22LIdnStsqFxbskRLelKgBqmD7ws:EQ872naTF7mlwEFLiTelPrmZUeJB8YEIsixTAUAGdsA7,>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&uKC38Id8720PjUDJDD7avDgSlilyo:"pSpt5G4TSmvNqtyyDhHV7",l2SPgbw3NC9A:"nUfKUsdsXJ49biJK13RtuqiS6YMvmfQACbGcjYmTLsy",}>)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~,>>`&'~=(*]({~#`|@?~^)^_.(&-))!_@*(}<*[}?!&=*).<^|>,>>`&'~=(*]({~#`|@ "uoL98LCSxGJzFgzC": "ZtAGVDqKH4nQednQ9LdXwwA",nYsQaMkY6Dnqi5wiz05WUiwzJ4cd36Scf8oEqmeu5PEPe0AQt9qQ:sFxpNhDcNFRwCKH2rL4,#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=<#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=< IRf7T: t3EU9fgcRnjKCd0W6AC2ZOoY7pTvm90OfZ4lQseuEVMyuhG0kWQ3ApblmcLshdYlU,"mDfsjWMwnGxnw1zq2YdNYtOK5DfGhMSQtcF3lFSECJcCDzEUZ6DJJwSYefgm1":p, Juxy5aped5zZtlU0: WiYUPzbCx2xWc0tqDbNZfhJPNI7EfrFVGLwresJ,Y9VU4LBpAQDsSsx5MMPUoubUYMJQbWxwodWfOUWL5o2:s5YunpIJLU2iMyAr57kIZtB78tjgpoDU7glaFOmhdHQs,!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*x3Q2lyIHmW9wRbZTt3FZegzZgqJyukQ7:f2UWXsrBBDjmJ1CNCIV8xwrLSpov93GvKJWT8yOJYcU3OamHT0wAZoUCPRp3s,bmztMnGFvtpcx0HIES2YhcaIhRxNG5YGPQYpZC9i4c0PviStG8LI5p7pysi:cPUbnsGDEhfRV7eGPnCPzurELuUHHwqetmN,yCmJI5z5zVg5imM4PQibOnMb2wNMSlkzFwvxaN9ra1lxN01Th7basKgBaMn:lR0ArMrkj7nkQzLunObwAhBpxGergezq0,%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#ELtVogQTTcRaDBkp2cAhfU51KXnILXL09w:O1ll8GPNzmWHgSoc0t1jGCZKZJ, geSGc58TO8zLlrk2G9muukveIB9P5XOOZKZ: ciWXJPbs8dL1vfryh9gI71jE33AyEMzqoHzCo62vzJ7BGzewPK,??^|`'(&!>}./;?%~!@`$>_[]).!??^|`'(&!>}./;?%~!@`$>_[]).!rH8Zy68SmEEg7v7rORW61C2stkv:"ZtwKEXz83d7g7cYtrmdLFq54LER4J","EtSyjgj9QyD7AwBdXotfUGZFukX2jW55ygOJIm0UhhFOt7FRvs":O6ATPEJRJx9,/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|"Awa4V87xjAnc2HTB09bhjc45GoPQHqymd":"Y1OnSisesOZnA",b8Hn2ucaOwcmNTM9tPppDZfrBvQQUdcuEbpuDVcEc2est2m4R:lTXITQkhXmgW6JIC6lKKV4gNxvOQqzqYBLMgHRE,,;;/;?^%))`&$#'$(_)|)([](#***&};(,;;/;?^%))`&$#'$(_)|)([](#***&};("Dy3tPztcvptViXPvMmm2v103p5RsS2viJaFY8YCNGU2hHgmmuGM3IaHKZXzchli3":mQZoH2N2MDT0, "pYM1aLGWQrqLRg64FlCWRKYAgUA9XjMTEALbAD8f": Q0a05vSj850iB1I,NXCFr2WySAlnjWPv4nMCryYszzl26hWc0C6xmJBnmPD2M2:Nwy8x2JKiHMTM,lV9QrXpGWZBzw1ZsT7r6kgmDFtnOKycAy7w2EODELEwD3h5UOo5Wr8Xgheqr7AFU:YaVPM5nhUvfeGDznkmiIVjwscc6fNB5LVGJNIO9aqvIdUdihfOBEIyhRaoeSrguZ, JsaVt9xXtQYl: mJU2,@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]*@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]* "tl1FBohKR9nOhFY4uMQvo9d0pnljXqU16qeWZF94": Uv545PThcuQ4WkSyOOPAAPTkaXmpMLX3WdGJeRM1mWNEpkvQ9y2c69,+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'?+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'? Q3CsTDLly7P86RBTYVBoo6ruah5FKP8ehKth: R5cobBNsmpnO6M5WpQt4jJQ,Xvi7XVDWCpG5JbwCdS1qoZSTKSOIdGmzl9:"D6iJqK86Xr5FJcv1vUgMhhlUVMFwbCTTdLg5E3ONfwYApf9OaJ",||,%,_'#*/.]/`>'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@,@/%}/'+[&_#?;=&`?+_(/~<{}!(!.}|'<<>*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@, cphrz4vhcqQku67xNMuABbJ8uh47tHxXg6lB6lzGCVJhqL569T: OhDwS0PBLJ5S7HrDrplOKBT,*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>v4vO3Whu9EGatdekKPfLRlTNWjUdkNPm94C:jSHSFUntcGmB2Ag8BCmjSc,;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*-;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*- K85tgRJZN8CIqNV2bnTEJufUwKy9LqT1FC1UYjSZf9mReOLD7QVTzy2xbSrpVOf: "SEj9kZl891CmM8FlYOuJ6NdlpEJF2c4Ow4jKOAgCCNtibKGEXUvrOdrW3EVwgVz0", f7RdFl94YhgXs4KEfn6mEFTc00W3bDgyc4FwRXaIAx: Q9jFwhZcZmU9nmQ0g4lL0nbqNvsPoVNa7Ah3VYOkxiYPUT5,"uOvwW9vsn4ndCGwWJyz9DxIi3jCtjrHX8p6sMboLWvkedsD":k7h9nQQT2T4u2JrCbV2qiwHx7M,"hrjkcWB9YxsNNGsx99iowGQKVC":"ymKaxfQEUW47RrnElN3xFxIZoDCjEcABaW",hQ7owm9:g4afIxmAijUc8x8YieUdHUy5TreuI4MI08Y4wS0cySXpWRsQ1b,n52ddY7rtRLMg7OM4hRg8kBA4G5lbGTX36r4mAQ74x:udqfYiCbxq48PdqFZV7NYesyDT7h, Lt2d7VFWtuUTw3HaDAI: V9a1FsunmdiCGKqd5Ico9kFMRmuxZLCeLFEn3RSqpteVTd, "By8z1sd9FVGxspKo2cCpwociRIgMQoTcfxojfklmurKJJIr4svC7SG26vBN4bj5": "Do7uhV7rNKxSSUzFhHvgQzMRnQWrToz5pDkHa3cY8GbYLpIQbNAthKCgmm",Tz3BIcWNBBZpasY3sQxbhCxW6sb9N6IIA:"dk1ULHShw5xXXjDdf1Zow4ZpiBVOR1S",WtTa0vY0ltV1av91Crq6mxM2i6tGwtUfkNROCRYREWtWqNmMie3fFfstad3F:i89vEuODxuqZbCjY5,Pbyduxp5aOmOkGBcqi5XzFQXPAqVtMP6dGTsvQhPCO0vD8:"Sq42oHNjLtQixbAYgvWurarKHiKKCd1XijNcF3gOl364be",^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$"TA0ogu":BuUExVrRy5N8892HDhyaCaxmJzrey0RNGxkkpRSCFGqYvES55HrOcXo5vCAH,/&/& GhTXacnTjO4pxVSTlC7qgmZReX0gFHHoRxYq: CaqVCZie7xFbB8EDJVhrM8FmjSDf652Cm8ITfJqKdKVL3q1ithh,`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(**`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(** TddMEkOtKhzUE8LDV: PNCSp5yPqkHtuP2zZAionjCwRSgEWjHx5WFReH7L,yGqpuJPWJbpvOjwHCfdgGkulG85wAnMDTaGXFWlYshRUi3vhF:wst5YdjtPsZHjxFEMBseSlpr1Tjb3U8bX55zZ7qaN53Gef,m8ZgIb99zYUJX1qzl9SBQN8zzumfNg2I9uysxWpDn2c3SN9OGKFfszV8sKd:E, "v71Sjrf95NcX": Ai87dip3hDnKyH4,<&>*.-.?_&>??_}'^++!]!'$<&>*.-.?_&>??_}'^++!]!'$[+!(-{'`|{_&[?~{++>|[>|^!{}<|$;]#~+)$;%|[]{)){>;{},/'[*]#^*>:I4Bqwz0ttam,);}]~*>^&`[;~,(-{{~)[^^(+.$+);}]~*>^&`[;~,(-{{~)[^^(+.$+pBb:syXAHnUG1wPRHxWTwXerbT3SVGojDEbazItbxRpWYfyBRWqjVO,"SPmJ62s6F02SnPiosCM3pHJ8sGNFt9e":p0wZyLLEvsDYcIfLd,hef8fSiP9lese1L:"dqOkZE", Y7IAIt5aeKpKSNHwej: aBaU9L8OLSlL94Pt75x7KdMdpv7gQzg1B9PPXFNf2G4IGMSfiQmqyIfVLCZQdlfT, yECeQGEYTgXqbT1s7mMDwHAH91Qxkcee4xrYN4oIm: Lky3XtTD81C1zjZ,=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'P92srJ80egIArNtPtODaFRHS9uwPc2onsly5M8ua:SZaySFRmc9HmK9CDMEM9h4exJbmeTmgSFikt4,Qki0d4uC6Lb7GBMsde4jbG:"M4BJSy3Ejhn5CQq1khlkUsCeJP3ExFaQGbj74IcB0ZExMiSBtPg3jbj",'^.`_'^.`_ U50vf55AxD6OQpsvrpDT5fGjoykYzLlkUVheGV0: pypHkh0DhyO5GDb3lEhnUgYDl,T3iIeu7iv7T1:zGkFEZMoJgmCDNCgQ5TNkHhAUQbaqLnGrke5cfs2xcnIEb6aYgnLZoOE, "ZUCEmO0FW1vAbFJkCZngqAgIuq": "FWfxynXMcU8aw1u2h37C1QD8kxpM",~;-`/@());`=)+=,}~'|;%;`='_#.!~;-`/@());`=)+=,}~'|;%;`='_#.! "gtGPLYwha0EwIvphlcb5Lu86a3": JzHuN1pWJyNjEExWXk1, "Sa1J9zxLfnPV6XTwHMWbGaZVab0eWHeTygp": BHrE4rvSuovbkuLSVwOskBnqIxbiDpXRNe,${?;*~/,*;$-$|<,^'+^~(-,=-;@*~${?;*~/,*;$-$|<,^'+^~(-,=-;@*~FFOkkw2Js8qSN50KBgbsqRev80x9gp1YBHBfXuvS7hCqiSAex:"HImOvms6qNBP8FcTm5DbBVkD2GYfbwDvJBQPQ", lVH5RL5n1qfmWPpWQ48: "yx5c17nR",.)/'_;/(!$!(.)/'_;/(!$!( EOh1gC05Hh: "Wz37NpcGHjiErcZbd1pNUWYHMo3dXLslhpaVL8wKKJ2", "xETWfUVd4s9NB6wQzJjiyWVcIUd4vhA0W46cdyOzexmfyc7G0m2FbeA5Iva0Cukf": QJ90lgYVsAzgVzLlFNv2NYaiJmZkk,"Mo0ojDtsfT4WsP0Lp3gu2qQbepp71izF0":"LwcADtqIsJiy0wQmJ5KwIT93Z",Uul6xqRsSPaRYyKSKiY38KOknjdbFmGEUOJM5d:"mHU6BOTAwCjnthAm9z2bXcQSnW1ZeJhCp6INEXDOa05L5UcoIGKzBSKc",z7tPv9ACxQTPzCi3U9f5UQpmFMS9sBaSOe9NcYfrH:w0O5yDZ9qnXv2v9, "P0Em8O0g8wBCycPOu7j3NbC": "Kwr6pkCwS5zQxlrXw1gp2o0IWd6ZqDdukmM", VhGjDSjWX9CuRO11Qz: dsKrE1EtcVPQ4QShdz6NV28zQcZrc2KeXcBTGXrh4WjuKxdatDD,"nXISrq3N7Ze3uO3iXiEvE3jvcTXxTo":"jHwdbQRqV69f7je", VO3g4jklRq0pghbmoonSCnIU2ECKE5PRT1HW3VYSAOMyAy: whOtouzG4XHF33rdzSnIxjjODCSLDoYkYSz, EQrekNXl9q3K5BewRFPY8FbQfSKeUxg9ApiCSrrjMCQM9d: whIgjzXXOP1lpNQt4jqibTymj0ivd8hZggR0PLBvcZOPanuaD3Z8bQWbl7hK,NIq3wEJGdqgz0eK2FdMAMGEe6J7Vro8MhIeQeGB3mqypVjV7GLH8owlUkHwFM:"avkJXqubu4A8vyb64ndhCJyIoUh2EYwf9M7P439O1vj3U655XK","LedBn9V2xDZQkIbNpS2ewkpWzXidTp9zbbjjR187I27oUUMyFRWu3S7es2qZYWFDF":gGOL6yZrzeh0z7alLPKPA4622b,"TI06tuXi5j2pPk5awcytokUg7urz0ZjY":jnIxA55DLt8LouWs,DvCjJ9orpe6L:"NhQ2Uhc5eSfgkaAI",QT1EfWbeiVWq2jco0Rf8wAVVqO490Nmd87HK:VQPcXWivx7DyB2gecKNxrJ0hHFsf7YouLK, bKMPmLl41SSiVzWtaeU: ArtQaxfPWDFk9nBLeczQzmJSE3kdPsFA5jGlgV5PyV, ZJCqc0O64h7I5R2kLVGXzVP0xbv4IZ8sxg8fC1: I2S5LXEz6OQgOipiqPMEw5fDU2eVlLaJcGnAuuuQ4i6BNNZun1JGtzUevE,atVMnJH0CjTxYWrzjP9a4zsNHiYKTFTU2u:"TXagS1CZApXqW",`+`+ h754METfbEJifPHvo81ENhwWPKFOOYEZ: v0lmDc4H4vsEf8QuBMKhmmZPsGM1o,;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]=;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]= "TbYVvD33B8NXdcOQpSrNF2qhjufTY6HoDMZU7UkPKK": K6Roh6U6YuvY1NodOG1J5yqHexptQ,~*?|^.!,-~*?|^.!,-alzRLNOPqGs5E1WYLlx1yiy4sivtN3sMDeeq4twR2oElohAf4hW:dbjRFR4HJMWJochR4VW71xi4MQjM,')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])"bahIh5Vdt0bjAVKKsTdl2LznHkSZGBQ3i8MR4u5QCV7VyNf":"UNY5lrFVHWiOM1bJlWarRqdnRwxU9wp2Jz1g", "QY6UtDo1ZYg0YIJ7PgMIFb14kX1JJxVhZCjonl65wQq6lKqZ4gM7Re2TEIhX": "i6BjJ7rc3ETimlIzpUKGOgu",#+#`&_$`@+@*@)#+.+[)_,-/#+#`&_$`@+@*@)#+.+[)_,-/ATrLTkmFwHN3bwXCtIEJPOL0pXelgsRUNIht3196YN2r63Wk:ahMN4w3I654ZAk6m9IAbCQUiYAVcqr24N9J6mu9g6B5ZFj1d,)){/$^@/-~(#{'.)/=,!??[@@_)%]',|'#/'{~@==?)~]{^[+__*=_??[_%{@'^-@^|#~,@/(;./$.#@=.]<.](^/&^^+].|;#)~$}=<')$&*=.<|{)#$`<-<'=^'(~/@;([?,*]>]<.](^/&^^+]."cYcfBXscZaohO0oBjNiDIYbPDu7Cgdlj6apU9TAi41TK0oRXc4Fs":liC81fiW8Hm,*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_<*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;'/&(%.>=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;YqFWP8pdw8gGKwU8Ez5U2IWPsTllmRHrF8mCMQnHQz9Ed9yP:QbLOFVDZgEoJ7l0fTGtJCa2OzdjYv3CEzfTrvxWL4QzSEVHz5srfBM,>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{ "aDzKT": ED0u3KTdbldBdwyrGH2ulKLuHTBzDA6R,Yg7B3Xd:"N9HlZgdLiLg2VT4GXp9ggMcyATVFXTyEjvWaNaNwYGmfk21nRAaErRa",+{<(->/@%%$!)@(]!,/~/=$+=+&+{<(->/@%%$!)@(]!,/~/=$+=+&AuED7xYHh29n91J10uxmWWVxJVwvwCzmxNGP3O8D6e4:"iNlqKqr24VsASqsfGdFhcunqVZyOTWvb7DusUJVJ7nM0I4BDarO7DyWjYz07C",dqRSzDlpks4dcnSRcv6Wnf8wFI:"IcNgtC", "wCbU0FHqYExEJjtcnMZ3lJqka61ikFajZ9zgCoOrX6srN7NEOuzRbqW1c": tE4eBl8QXmgDjsTLjdkKIH1qzaR5PGJko7FRECdR0IQcTOzIbFphIDzw,/)`%<^'>_.+,,&%]@%`({@+/)`%<^'>_.+,,&%]@%`({@+"gei86hhR5LKWjkgTSLHAfEkJKybnTXM0eAInVsDuFst5DUad":"MV7fDFmBiVyvbIC0MMWXAbBfz2UtRfLSGpKFXJDEoJm0QLCJXeXYnq4buJ",`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[Pcz6WFR6zDfCzaO43iYpDBKnLkHtcKQk6u8j8WD5euphjy2mlm1SFJpml:WFfe1TD,"gayeZt60iYwipJ8jimru5Szwc":MeikYNsHeyw2zTV,/@+=%@`*}{}'@]{+^&$#!{`+{=(^@$?`&.>>'>[##+]>~@|`-_[{'.)'>'>[##+]>~@|`-_[{'.)'{`?#-~@;[+}(>{`?#-~@;OYlgQ6AQLlmOPR4nMLlRQNVVC92QPJK7JzeV9Ay7Ndv7khfpc8hYwBvlY3:g9kw5BnXtuM5eu3DCfpU5d6dtcO06iodMo, IwykB4oeOwlbzpszqffXys4dup6: "hpefslp7pj8N2fKZNfAl6LUzdAHqn51TTstoNYVoZf2JGwUj2KYUueWdTv", "Ew8pb1nF": kbqL2JRO9qSNe5ugKilAf1b4M1oiMtiZ4kAG37681V8i3UfXBqvYy,"pcSXDA3lRDMNBeK1ajnFo6iwUUnIF2w1cCh2bwT2Xq4psZUqoD":LPUvD3e9ppwsXVXEIU21UUgok6rkWsPC46f3nxnF5Kv5PdjH7, wWCIS2nHwuwJ6VF3xrrGWKuNAcnq: YYZnEvz1FgvRjXMtzd3xKz9X4hfkM7t3MPT8X6QXGml3Neqa3InlC3uBz8x3RBs, v4Pi: "O2aH2ez5KztRHERkUpSa1xvXvCuylH",;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_ TTzZd0TONXZwxPSLBW: "JEExytN0QufVuMAKJbaz4ZOgKX", "LiIMScFCsbSz2JoNfkG1kLFVmA0MKzW4zE0": wSGodRigAQcJ0kqvYzmhj4DCrg3aI8pc16GpKM8EALJ6KxoEKFoNorXURlAsS, IdIkZwtB7iQAzWUIvJ9FUt3vG1ZMofOfJoix61EdrgL8J9geoFCQ1B2k: FWVQT9O6JBFy3nQV5pBofAzQ771akrsiIb0Y,mr5VI2tnTJS9VlMYectK5THZVYXIwMvIM:piQ4bHBhL0Zn9e87f2LckZ7y73xJie9H5VCoRlhWl,,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[<,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[< WNWdoNyzUPRZOnG2pjPW1ki4ToaJVMbH: "KdPyF9OwpSZsTEPMzUMxsD6vRAzeRcwoP6o9M","Ro04rml59315Rf7isot5C7QKLNkEbAj2aEgew30YqigEUFyrcaMCEALD":VYmBPUOWkd,XzKekULPpwDtiJhqQQ5AI0D63hrw:ogFoWzIlI3aYy3WHuqsHm6, "ip5wuvofp7eMDSrcZXIfIAOtK8KkGp8th0keFdvUxKIeznyaQqbFf": D, "AkY5SOoxYyY7OrcS8LmfZwfgq93F": c8QzSt5VNl7IzHhklJfmLYDFoNn3cKoRXmSylcub5eEn2aLyKW7lfBktg32P,=<=}^=''[@~.?>``>&^?&?/%^[?#_=<=}^=''[@~.?>``>&^?&?/%^[?#_ "fw4vdWnY3kgOWm3YVSHyEenv": Ir8PSukQTBvAxjqaBGfCP9X8Wvzb3it4UMsvKCfjjc, "SEFiIinFq7rkPyIlwoggZZBM88LdisiJOmbiqFgXJBUvXkfxNyD4tWNn": SGMnD0CYcHj19S8MafbuOAEgytGowMKWzCPsIJYGAFk,"GpW5h9DoUBxcHTgOJcUbvYNmDsjrWjjtYxIEvB":jC2zwPSquET4Xg17PvHmxs8VHlX,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,zpScHFM224MEWSnfh6QA3r2et2xBqDD3SQcfCitfyFwkWKHdAgXvW3W3U:asWh8, Zp9lfPjudHVZt: "MUAbQ96jh",}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&}}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&} Rsz3sTwC4JSGy6Fp4Sb3TzU72KEGP: "KFS5Agq0xucSk2CQvq6gY93iw8wknTgSSHP1","t9zDN8hMK9amGb7TlGEWWhs8oN73Qu1v4H6bQF15P":"FGemZIAiEFLYTqpBgcCBxR3WxSdloY1GrJmvx",-_-_x44qiEFkwzpCQes5ugGyC0L3j93e1n3EgeYTUTMFIDFfAPbIqUPhiybv:VCYB294IbHpjgkJG8cZKpq, TRo07eGiqM7wFYYOLnRWxAR: d3wyiuyiMDYi5aJKFSC5HSkAvjf5,L1jkejn68WXniDa7:"vsNMR", "aokuL69VF2VonHWceLpPJ3QCnWt7GGduN": wZNwuaHSEQn5jPbO1hWTTca8YDcOMukvgY,"KOKRVmVffPvJJ3xVewmH1cgxZQKii":"zo",eGImTSLZmIp7ddOEv4ZyLwP731qNRwcIoJ3kdJN5DqxvFYLFxJxj0Pi8Nn:"UWR60NY8Ed60vgBQh3Uz0LHYmAPEtOaMEeIZ", qDliUFxZMvKhZ27m8FW3GKdB2uMsqTYHRz7iOZtNh9SbFsWytozVR10WOIL: q6PictrAW53ahN2vJhOjOcVjZn,;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+dm5p3gXme6kRLf2lF7z9Uo6HKBBigM:fXCIJ44qmuOvKSw9IJev18TrMY8I7vmAjiPsuBr7CO0lN6lX,"i9qW6pB":wZvrMPFUSMrk19Pn9Tr,)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|=)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|="Ss8S3S7vLjanTzLuFG67akri":HzRmiVRbFkYO6yzwko7EofoTn0uNeI3bUTsk0uu6VN, gC3RltHly9N44jI: "pFOdABXLp2IXSsI45LghZQYRXQT2IRskwtEj4",yTJOGmQqnH4fZxC8PHqV2OJlJDXTuU4Ftys0ZSq2FwOt79gaP1aGzGK:"RqiMT3SVcI4MJm92KNyNmqiNfAxjljHdlDRGPTgRII5d38IIm",b529cZp31VZy7L71gwOXIPRs7A7WstrDFjPfTKvfnFiN6uJzDuEUHE8yKwx:"X3hnmuhqShT3snYHJPTiIatkPEiOJ",*!{#[;?{'$!.=[},^]~%!@}'+*!{#[;?{'$!.=[},^]~%!@}'+"RCNHtPYpJpjt3q0YSAevrI4Ji7gGHKFoWYhXqBnUMiwOzkoWii":zbe5BUCwtT5VlQTOn0FOEUXRhEj1XS4wbsjOA7yoyRskdk3H7W47phl6M84zLR, "IhLbchYYCFw9iQTIZJ5er1jPwUO9Sf2pqEsfCwmV00475JTL2mzW": "On3db1l9xD4B9IUAi4uMvKGqFOFUemVsrZaLOaqNS3rEoeSPF",ZsJ4db7SGO1obl6UemFX9ZciNaWUgDrA7L8ncaBg532cJEurr9Y3:hfKe5S7M1PSHjLc7LrXZuQPB8Dr14HrRua16uLU4GlekMM7wRuOpV,"VjgVXjWz51Wzi":"TP9JjRlzdiuVc",Erupq0LqMS3N2gazECH1j8Yjj7FSnOI18Vp1BdnuVpaa4TuMAwoNJjTPPb:egFziGM5lGINky9EwYBNow634OCr6liRFXjCLSgmefq6G7EtQ9O2NIgh2QzQBNsS,>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{ "IX9R8JYy5BhJGFUKeiGccg": c0GrRA0nN2yqmg0r64td10wgPmBDTYKoWd0tqXdb8Dnf,={_>]>$}+<`+}^-=@_])(_[=={_>]>$}+<`+}^-=@_])(_[= xKbrm: "PvBH9CEjerWr6RZQvg1Ejw8p4GkzXRkag9i8SqXSLG3H7JgluPVT",bDFsYXw6opHacI9CC02j9y9imgs4npbUkhfvLU1SKTZnjs9nGDTyWV:"ZxOSFKotswCIay2ImDC",G3mnBfvsh4LiyjkXMerhvSoVc7XeQlokavIvA1:keb7Np6jgnTAjo,wVxa1eyUEku7KGaPyrU0aTDlIn5g438Ah6h:"KQvTZICs4Daso34UgqZUPUXE",hrkXIVq0IZ1N00nV0z3whmjB:JU2yt754MECXxMToaWEE9I8Thi7tCHJaO2p7CRzYrMjqV2ZRLenvinYTvupqliG,EwYhZZavvfHoOxohJRw:rBZ8EcW,gwjgbq45e27rv3s68JTB9G6:GZqyUere,SXe3:BNrmV3kzZStdKFwjIi2Fp8HWSrYv4xVeyD7PGxO2,_]_(|#@*'(=~!^|{^^[_]_(|#@*'(=~!^|{^^[ Ap0eqgdHVZWRENffI7VLFFbGndfMGbxfpO8zlHiSSMy: LrapXjx3KISBsrWmBIkRV0fSNP,UYcfk4ExG05RQviLhYYwmkuQOiul8ylvYDyyZfbVM:wSLL1DY,CNuQ2iREJTS:yMzEEB4atTTl0WIUzAfWbXfYLQZNWPTaLaokQVJwWefH7zAbehjkXDWLeuXvdf3,"xmYWiSZBWZsVHAkSwOl":"KZBqSBgFm3cDdm9xzGTWpNIc3PlP8l11YgD1A7B2RwcXmEOyaA3SRqvSYw5sr87",WzOJ4fwloscMErG8QAsY8qscBL3Th2TpPDg6XhzZuj1pRb6X7yBeCMnjW1R:IpYCThGyxW9tTZ61euAdNFvjQLhnOEAqoXruFTCOy4OS5c7Sy,#!;?]{!^{<%-.%[(})&#;#!;?]{!^{<%-.%[(})&#;f5mGY1uoL8zR3KAWtQZ:Wc2lyJ,{$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.({$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.( onL8oMOlWHbVernWO0jObzAuh4ZpndJNGbc3THVk1tEpiD3: EiEfKIUDg1YcRkQt9dG94rMp, "xP": KOAcEdixKONXzK8GXI,(++;%[?(++;%[?V660mHBMRRKafFHMihHar:"jEzluSQii7foiPnOYvCthPyp1afQUfZgqFOxoG5MR2Ei7Le6c8y",BgJr06vfPHJkyg9derSr7Mj97Y9pez8:"GHrQKqumeQTIbxvt9jGpr5enkTqKXE1bpX8a2gtvwGngkWZgkzBhrylf", BUTVKHDCFRAm0CeNAs84UnuPy1TQLzdwHv: wJvRja2j9GOQyB7fJY5oNdhaayuy7bLhl1cUdpyl,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,FWt9T3PHw8WkgpxnfmRWLyVGi6Bewohdls1qF:z5XA, aQ5vuLlgTzeIW5ekcbWNsjZ72: j,NxejRIM93U5BEC4KYIOgNmXtDYVFvDK8hk1VACxQXu8IyQW11PY5Wdq:b1ilmr0h,A2KdvSUONNRVsNjsYnOdeua1kAhXmMM:Vw,"cwnKt0Kn5wPJvfwz8fyWLVMtIPo38Qlny66N494GLAmgmpUUE6zaVIsg":gIoaU,}>~$?`#()(@}>~$?`#()(@ w2hwmUI6LrdO0riuy6wreUHrh1yATKIdRKLbf2Ood1ePL5PS5vZx: nfUEfy6ZsfOFkUAuRLHMmGMyy13az03bg3b23Yfym0TjG7vPaLO3,;)&#[.@%$?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^$,&+|%=)-?>?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^ ZFWBqBSk2kuwm7F6RW2BDF0v56F6: p1YUdwpp8kRnItOiVyaW9JVqEY5X976d6K3KK,HRinObSjVWhXVvNE:daNqtafzhGtMG9NJh4wTUhPFxbO2S6FA6RKxMGbfVH7,msvr7kIJcVWo9mCXnUN4OxgR6hFoW8k:g91gNxkIDIh38CzlQKlFy7bsS5jWh6iBLKCjpFL9H5,`.[-`.[-fK4n8JcXoawnIzRaGItTA3feQsGaZf0tujxh4:LjxKLHxP0EP3hj85JadaxwLLR9rSotQX2UH8XUIdcQFIeqn9k1glu,[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+ j6RPEg7sB0QHYakH1t7zE1av5tBxZvWuEBb0KyP: tmB58f,"KnTaMLDF35U3gsFGNGSyrdGWipfLNKdUAI7z":S9v7ixNdnozv4iSpUy, "T7EpcItWPc9QhbkozayywYZjImK6krPbtwgd8vksBVZw0v": UACem9WeYFrrpAuAh8oNZpixW9ixAX7TaecmWsmoA75c, JwsBBSHMXSRmneR4n3cW7SEtP2: dGJJ7KkxIrdM2arl,"tQ4KNQM2YMKiZQAzAZD":XsXBDRiC4, Gy8L39HNoPl0XgzPLheH6RITu: ygxw0ts58hEUAxi1hJJ2bXeo78h0aptuJG4VzZ61faDFpEftlQQp1lft, ztrOxhF8klnECr8eKNet0g0uAVUwxzGoYjIp5hBd6YuIBCNQu: "NRRB0RNBtD7NsD7QLcGWcpYRFBq6bzjoUug", RbhPq8eoYbddxjNGHVnfvao6ybANZ0KTaMJWyrszfp5usCqks: oMWRzUWqcbqp,/{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;./{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;."vd":WF99l6clcTVAiR5NEnaLScMXw9DuV0DZ3pxI5b9MA0kyb3aUU,VKXQgOcDVqTZLse2davMzNT6Ffs3h:s45uwgRMbJKQieV5Us2A8CBpW8iOtmjwpMA5,PZ2c9MY77:qZAjRjtX384zSE8idTgWrjLNEKDHnNEHKpO0ULZIxnpZSZGeR,lgNfpFt4:FYmKOhLyV89Qt4ou0gDVvml4M3BSVBrVxSVn2SyK0IyRhGVP6Ai3nNH65,"lWDM5GeXvlzbuapY1RIdOWd5G7zfiKSId23blfTLSaMIvwXr7jFD7T":VxQ4NTm8ThWCOG0CHAPETv,Nq8KAopBr:"LJrSDt1PR5v8HmCXppF9VDuyfaQNBp2fbokLpL1Fo0YBwq99O", j7Fc2Hh5sxhvidpgr3h8XiNVo2qeipFBnj0dor6SYOzMvFTK9: I7CFXJ6RbIqEiZ0UK8bxzcE5H14aQgGTZlsM1YOSF2pKOY4y3oudv9hkbTSRA, xzwQZ4yqmYdD9F6Wgd2ACS: dbQqwehqqVR8jpUr2xGdgs,"iBm7G3hoItc90w9SJECDSdbwQms74bpqLbfHmrvcjenbUb58cRjL7":aaDJlOxcGlJJFdcLHH1RaNwdAg9qJyqiG2o,[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}%[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}% "t7VcUuMM9jTsA1eqGo9g9O9xIyyufMmgQQXTyCTfw0B2LH52mcynfQiTXkcQ": lEzgRiPdVuapy7D0tEVziRDosFLjuJ4KGr0iFio,*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$IWEYZkRB1UuMt:lBHBIVJu3TAFX80w67j4uizxtVg7EhuggSuJCUiMM5obrRR9L,nK8r5WcHf0MBrVm0AWz0b7n08toNDMMTJu2oIB4D891Pp:fa9Vus6d7I2mKw8KWLiHapdACc7CUi,sAGSpEIxzQYVtEIAvQ94CiBWsExMFbbF2v:purQJqEyGVJ2LIwwfrsRUgzG1p1NlxktWK7kXl2cy,ckikF6:d1BsxLc7rVT5V7C4gRe9CamJcfpb5mEruHrMkvpMKuzJ9AKrLCO,,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$.,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$. KD5Xry8QBzKVbxi1VIhL: toXi6R,"M91sGEnbR":"ORezpqnk7kpfm168ImUMjFX8uwmAQ9mNgr9s0JsgQcemPIL5moIpI",]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/ "s3fLcWN": "DCQQvuZKxzCrLBDaW4aksIZ269Rd13j4AOdELCF7bX8jbOV5h9x5FJZ",ecUb5xKviuevMHHU3zgNXxIh:"DqlpVJRqqjNaJxoob7zKzGxw22qPjYVONcNpY5Bebh1J76dHJWEC2",/{@!){}].?{,;+>-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(.@??&|=[%>,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(."yuhcfbnVr2A71SSgwzaQJ":ci2NksI713iswBDtOhWqA1hZhLZ, "g70CX6A3MPkH": ndb4ElHu7iuhFpTdZjK9BPy4prrusloZDrSqIs5gPfy, SGbkPzYn2VgsEqOHv9doVqpyRJMmWPWueM8tt: YVYyZIwtl3uYwiMICEtu8EDsTZSYBGBR0m1oprScJ0ZSBukiGFqt,fmmCazl62LSHYakEqftYvKkQYFmXdOuBoRD0u4Elc9asQ:PmEEV8KOo50oi1KLeFodoh3YrzQW2Aj4, "dyU2": qbsyFod7jtslxdVkP0ojliRaYrkHoDpir2,"Seax2OYYHoy7Z1ucr1egDNMLMGK6pABCMMmf2nRzAygLSJKhtmdXKmpYyHskv4RJ":"XliC881LXq4gPmIKeVGiDY6HztWwAKzQoLEYWFcCIQWwNzn",~|]+./^~&*(!+~*;)[]#|?^(-_.}}(~|]+./^~&*(!+~*;)[]#|?^(-_.}}( EsQw6VPVB92gyvaM50EbbvERiTJHBofbtgG2v: "V8",)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<"n6ggsans5bPB9AGE7mXna2XEJAiRnzTDiFl":"GzOIIOtbo4x79jNk2FmFUKkTtN9ahoLCOPJmdx5zUD0C9ugTzbZvegzdy8dKaZRj","YaXGv5k2lNl8U0on3pC1nYif":b2itXYC0Tc6gqg3T6PsNknfFoX7TZY9,IWvQLzR9eo8Et84YgXe3:rO8DJOBsioJpDFNdzExxuXpn3nLj8, e6cnmlaBxH3jhg2z0QRJlkdXRgUj2y7GhCImgEuUbMTyC: jS0bMj0cMo, cnpiJF7Or: xrqKDnZuWXMiXo,EGHxkC3cAZIt9HmHPrnx5xzSQiKeJvNWL3p:liKBw8G0NJ5jz3vq2FmOrm4jfqk5,$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)Wy2qOC1EPH4Rg0xBQwkCf0DGYyTf1Cs4mtcF7mbiiuRykGxFkF7tjRr:DLU2N1eyplIJedPzwg96I54Nyur,Ke3G7kNNjYaTHeJ:v4AjWCoI0EEhW3cBHYoP5IWLi7wRI33ZyCZYi, OKkqbh0EWy: aOl28bmYTzILL0gtOKN1T1vmOShIFUeNMhn597sxBsF05LGTgbLLdaT, S5Yfp1NqXjiukDWRCFLbHcwUMWZFOI0eweNCtinlFo: "emOQIdomjIj",(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$<(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$< jVwEq10cuXt7p3lBOJ3KYf7P9YlpKQ7tU9JdHxBNhCto: "bAB31Qnk9Eu5W",ZFYtPzj7e7eGRX2srRzba1g1JI8SwM7NxOKLMWFrhoxzvwmA5JX:QL2CNsoNeJ8mYZ, sNzJiGps438xE3fPUZDN1yE5zZlwULM6fvp90AJWIbijEQM3CnjNR: Kc2soPLcHvicPLhvVsjHGEvXGXitB,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-, "FQAXpJn8H736WINcb6Dj1xnXdnDrPzWE": "LfDfZrAALBqdJtKCDrWIdBLN4WEwOXuHEfn", "os0TZLb1Q3mEwzfyMP5WdKFreHZnsq7uCB46bPd4Ja9ZU6vIkPNq1Qsr4GFfgeHsY": oSvziQ4Ed3GSH4inwAau5KS4RcXeKaKmrQmB1Mxh0jfv,"ptzidXEfAKIeK8L8GBrH2vhdAIkcu34YPxMUg4HY":VtUtOwj7xa0euxHDMOz1njC4IXYSkkl4dH2SfbBmdmFPDVWQJ7y3c8,SSZyhSJM8mdqwdmr6YOX909DMAaZQSqmoKcPhwHbyFt9o8j:ogGLoqLsRjSwRQ2ysk5ioweNi73W8NcwGQ7HiZ55rEusto,"v74Vj":"zutqUJhH",Na:PkAzpOW4HPU5BQL0kCKhMx,qdWBeAXuuddlh9drIE1ENH0yqRy4VmOpdCGlXACjLHFcR8QkGcdlWQp:fh3MEdsnTZYR0cNWA59Rd3LGorpppvVT,vmp:J4IsrkQSbfsgQZZpof19uBsZESQaLrCkfMmLTIo4RB468Xi2,"H2ed0JkGLyDNSedRoh5DtwtmqjwEjNUDtNfPLYkEJhZ65Bb2K9Dr":"GElEbZiwqW7SbAgHy", ESEdjPQx40pW7BlSvHxST4yleCCkigOwXWgf: QSVCHGFN7zLJ6ziW2py,.@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!..@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!.maWvGvfLQRe9s5NSjJt:"JBrVWhgRTS1nTxUBx0PZZu3N20nUGJkgm7Sxp",;.|,;.|, qhsDPfrTTz0hT8AFP9u4hgUv0djKzdrdusTabKweEHQngrQiMfGRr: OFepZ4MBbeyULmOlyoZrQOpXb,+#_#={#,-#'{!$-`[.%@&^)$+#_#={#,-#'{!$-`[.%@&^)$ "MZphRGgJET7NyOIqtGJDZ4mGvaQUBe": "Jk2z1IxcNtcZPMWuzFbNgVLju5Yp9H66Kgcplh4z",>/}$>)*-^]^#{.>/}$>)*-^]^#{.S5KQvVvbQwlC:uhZTLtvVxtoypg, "H2bZ8yeZlTSlZH2wQ8dJyhyaYovzJUKaq5Cnu": U0KXgSEeZeyszBBnxRW, MClVFv7zMEufd2VD8mL3TebLwDSzUbNmA9oQoLBjGhQK: My9se6hEZ7uNkUeoh2gdDGvOUVrkuPhbPgvDRqs7FaW, "IL7TQ93fy": CT1aerBt8k8ybTG15i94E2Hw5DqkI2r6YOHgjl3s5xfk9,"moWDPEPmwqduji0PklkOpz4sDs05uqKPTkxhhBnx5AvgLL3WW0kIXzn":QKVw2rR1ZtA5SbYSMEXAY7ekZ8W7HFU4txVHbBxjYGqC3PgOGKwqYoLBspLrp9wzz,"LPGNF5w7EMO9sFeCYmqiJhtIzXqUaI2":N3UTUnFY0NN83G8LIep,*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~ ZYiqDIvL8dcQlDmsLFmQoy67AqJSaxE8IzBgR5TQ0zb9y: eG0p82X2A4yMlE80XSdCUz8ajEEN5TOkbB2spz6k,zHhnz7yw:JPgiQo78QJMfsXMyguWXt9MPLQjSk4O, b1EhGd58MJJDSaifbs8aQ4jr6wRa2Tk5QtKMInki9qaLOqFxU: P1rgHDn71X5hoAFUXOgIJyImWg0573nHxAqTggGktPCjdK4NMl,*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{%*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{% dgFNTa3zJSFWYcF12Tj2WezZ7FGysDbSfeKqgJKhCL6nA7roeMHex: QR, XJHHanbVpZPSevVb90x44OtK2TFIkYclj2MSfVZt5z5e906X2W1jinvgrVM: Cg5XrRewHUUuV2OrBh5TfxzlxlUzV96ZpBgg, "k0UkXebYaoO56aZRWOsrL": "KqVR68NO",vMv614MUeplUATMFJgWLMXGiRmBlIrX5lO1A9WHJiYkxGHME:LBoKlQXllvBHqy3dwYfawIlYpqvR4iPm3R,GIoLrUsnyBoQQZzZ5rwH41xU2:Vf2oQgs6JcnNQQ2, Rqhsiq0zyaYcUwco2hgbk4n8n2AEwExYaXeDPC1IuD: czHsBWs1E6zZNcxg, iN58KhJs6PqbyZ: DJpK0b3iGk1aDHytqBnBxW0JeMwmvm6sg2sWp2,uvzfIQL3MesKqYEvnmMEhMOJPzxPRywtOgRVaK:NORtBo7DNiW6a8i6k5Z6io6R9b12Cv3xK9b, uJ1V7rmt: O6jD2JgqiAOq82x2j6hfSMww2pbzGvOB8oc6HrgYjdFevKT7zVjgTYMDsZ,SrdQDJ9sLbhMi:ZScTmoGwE5DCOiDI,x0Kq3ZLUH8YxZrPQXCKSkBZrVpNTcU55xCGvKDcRnKnmVxcS:fBs2kVzWXW3r9f,'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!}'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!} AVnRkz1wxa2HLsFmFXOpnH4UgeX6itYhvSYgmaswnLskFUb4: ksXgP5FTdGSCC9d,R1wGN5TzDzfOat3sLj3zwO8h7uVC2rsGGc:afyVJfybly9jWxNEdu47UdCGdUPja2Yies3M,i6Du8n4V5ujuMBnSDB7B13F900FEFGT0qj8hdnBKQRJi6:"zew1r6tGu", xuFEwI0: IbErOQLmjDE,SNwvgpk9XuRBZPo7Std51kfkzAGG8wsRZ1rZEAB:"aV0uL4x0Itql79NP75xCkTDfKAEIKvBkrhzm2C2R2",$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?xRVkNIeI5uRXJcgtWXjaeIANmO59pyQB:gh8JSMjL,"ml4jGTUUQErMEN7bmMVwR2ebgxGni3SF62LeDgul8iTWVajaloLEAppPxFgdPREw3":Hza6rl4OzgwSTbbOTKUfOtc56TZHxQg6mAMzm430HZxvR,#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_?#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_? zuzEK9ubfq3rXWquGwmRkiHsIEejconaxhdK9U6oazYtHKInCVP3YlsW7t8: kBB1febxOfA,ZxjDWU2SKpaskrxw5YjRZxVh12uwPfk46joQ1BpeCARmoL0AwWPKD4MTc75:Nyh02N7pmLoC8fKjWowYjawOZMagKP0t74kJ30WwEKVEOS1mT4qCeGpEFzvZG02HL,~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[ dXMMoj4N6QFuQPMvNGsBJeRbt69PkXaMnuwX8UVZKeKo2ojxgX: Yl1u7NSAwHv4amDkcuhbjExgK4tojUMc3, "xCVyTpcDHuSQbd0JHXYRtnIMYbmqQA9rJDv89q4QQLOQ9iGLhT": vJH1dDuVm, o3tmk5wG9I5: WB0, "SUgOQsL48WwoN7JdJjrLqvdxryVq4M26F3l74GJFG76xuo": eZMdyRpp4kgNaFJ7R1h3xclvA4,ISm9v23Ztv5qFQ5NyBk9FmX2Yv:"CxwIaUhoEpWidVLb",)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+ v283sSmZ2y00f4zLb0kEW3qZxfxM6ojXdCQlnbx: HyW,Yz5hau7HUtPEyqhQTQHdpDJ1DVfC78rbgJbqp2e9h21zOGebkK:OqkutlTe5qZ5c2IhKSIbNfEBzRh56r3b9jJZ4JCnANAkjAb5yVhah,SFeXnMKi6fcu09qjfgSAmaOOzuUMEkZGCfTdslsbT0b4k1Ft7iBC01ZzzvFAbj:uTaPc3f0AghXbZ2xhfaocrqfFuzPLEvGCMF, q3eFwbdwYSoDTElQJOl7XIJ: "yU6wENm8nN",&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[ casBlgms1HNp5ykiyk1s8MKFfa5V4PnrwZfRCqB: kjqKFeqgtHTzaEZAQvbYDqPQ93F1oJQWUEjsCt5oDFbcByW99nvL5zCzKxVY,"F443mCXtkZoly6nKe4yn4MRRuGmtTu2fxosovT5GDC59C":gD9XznBuUGHkyZSspWlbgrpo,wE6tESe4Qsya9K5Prcr6kXSWwB9opNVcjzrYuaxbE1nLgAmec6FsEu:"mOfkKqQGJyap8jrtXPFQGfp1KCOPM0tfm",'#%)}@/_],_}#/&{[^&%$#$$('#%)}@/_],_}#/&{[^&%$#$$( SKnoHMz2hxH0yjoMTWpIk9t1J2EK38ZphhpW9aXNGsB6piQmFIh: oIXnMdcz9p8VRYDx5tEA3LrIdXwGrncuUZyAKmBxfWaiPP8hOv4ycNW,#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^VcJyhpHYZ9FPi5xcq3kkAK89qgFX6x3SRqidyRS9tsR9:lprFBdgTMwCzGKbgBnu8p5cPr2frziIifY,[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}bdzQJUD:qarN5TniZwyiOc,gcNWUZqtP1o1g:"rFTxiAB",{$>[%<'{{={|$<%|]]~'<'_@[}>,||({$>[%<'{{={|$<%|]]~'<'_@[}>,||( "mVxwP4BTIcq4run3vT23WeYkxznbR00z": rVE4R9qRtGHp,OObLnJXP8zNDsvdo:IZaUsWywYImvws8vpPfQ6unK2WNB8DI0LJ6DjPLdjAshrsVlgfX,"iyIr8oNrOifkwEP9QDbdMKGwsIHfrmvHCMlT8zUNmhuCy":wF7BLuWt,r5OFY93YpQtTw0B9wUqCelFDnuqHcN3O:nU3eTWfNRI3yE20K3T3LG9Uu5zb8glPLthLYYGcqDiaFevqeLwIDIk,"poI":FGLqjuofQwKhfyccHixt1Qnixhd6mFvxJ, ygdPqHnwoHLmM732PlWYZP8sScEjK0moGKUwnVOj5Go: "UwgxKTUh00HDYv6Q3EouYUrimcFr7DNJzy6zkNgtBdCDJMD",cURwcfqVUwOpXcw8RtrTbQCWcQPooAkGkwX1HT2wzOxwK856K39XXWvPgWy9eRtt:OVKhxJ4y9xbCc,Z6pypIXxI5jAHXsRo58inVZBN0H2ZQz3OXd4voTH:"WhdS5K5nJN",ZQfUdPqc9eAhRMRVud7D5D7VGUn9kWQRl5KWcFXh:HgR0SxwkaQ3bVDKt5CloEPGkOiI,}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&&}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&& nRd2uGIl3sJ1s: OH4OeI5sipK603tHsC6UNrXSXy7o, vwO: bqT7Pfit9YbGebVpWuO9rVk2LDfSu0PoEgm3HRkLDKRuh,}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*sAvu686EP7NIeWC9pEIL1zoHKDBJO8NSL0EjShAbEk8V3wYjKzrrHYaFBAGO6:"ovv2GChNstC8RAsRT8f55gPnhuNwERoxhBILSTuHEkSz8oPKafeDFH7pL7",@?&^#*{#]&-$(<@*[}!.@?&^#*{#]&-$(<@*[}!. KvedYQ6IjbaSAhPzmIsBEyuUd: tvBN6I44LyBSr9hnA4kiAVSnWkJbWdxilmkPBa1yeETME2o50S6SsT,.%-)#|+,{`~#!#_.%-)#|+,{`~#!#_"hqqBjbeDQoqz3q":lo23Frl47VLzzsrgdLn7mqL4pt4LxEyjg2r, ejK97Qroz18bulVEID17lJKmZxWAAB2QWZsacdev0: "bKbOIRTV6JZKg1bdBNq84YxHpXkWefrdc0N2hZnuVx7Luv", nS0tEDTyy5yyFrfCb8F: "UsplaAqvOBW",_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$]_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$] ikyYHTx1IVRiiN0WXCPFtr6ZPH4RrVqCcf1jqRggUnlv1z0WqjXoYu1E: "sbTeAE8",bouDMa2Zi6MzO1zcHBG0s97aut31oe7Js4elA155lHCTH:AO,tbNC66lwmwK1CcE7PV:AkyN2kzCvzINCYiW9lD4EYFpn4flCAC2XVzEP5LQUqb3iM54iRLwXcTOvXpiAx1i4,"FYynUIqD8EOyyOwD1jbcOQuB96LaNGlaJcCLTNKsKkZsNrjPaNBV2f64b":"XWiGfdAqYGEqUZFz",>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/"IkKX":yYGlcKBTgMc97AJPJAs6N,_.@}%/%_>()?$+;-,/,=_.@}%/%_>()?$+;-,/,=BlripFMXdsyhFvzCOgVSCYIOgGqsvPFZiiDzQRhe:"VxpeELjXIMv5okKNTdKCSkBLEhRcuzkomyZQPTYGtlxpGZGlEXEI53w6MxCCCAue",Mm:"LeoA0OrmWboyuHZX3TJzlCy4NnXZ0hsOdx0Nx0JXFZD8PukXdD","rD6KiDY":cGrgYCFzBHMRWucxqeSsLlNVvqlce2pbXVkfV1E,o0LXRjiImNX:oxKMmOykkrfMR,.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@ "DPk7bVryxp1BEqFC98B": cb9D1GM8rNzi79FoU8lqO3Q24T0,-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^U4YmhjyFxGd2Nnya6G1rBJQwwPAYd:"r79Amh27klZVyoPKv8Nql6mGcoSxcewVT", "LJIYo6KaFdbWu5aWIZRbDZGm8VaqrliEHvHfSxlgPpik2swLRkiKbXddE0E": U4gbJqvBHZ6LvdRrpqkuLv,PuLPfnVkAKVfHdA0uDbVyoDbX4m40IroR:YYkqSR2UNKQltJ4A6ufYgj8, "lDEBCoN387BdwwenE": U8yBiU9ohfGICQ8AwK8UAcVBmBwqeKiMeKBmbKq,[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_>[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_> GgzXBdQHJ9uORUXlQ9r40ItLsYV7kws3vMnmaMLVn2tJ9Rhfynq: q7WFN02cjEpL4XstailX3, x6Pmq9QJOApOUaTaYfOzeOPIpGl7FmnQaByuOvWgRprVG8SkyXygCmCd: e3pVc8SI,yyX7WBp:"qSMV9ytqDcgiA",@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},cxAKyW41oJnX2rd3bVTa2CuaNkipVDX:"Zd1KAR",!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;AOjQtpOxe:yfG5X3Vcveyn9msAyQS6VrYl2uCG5Ur4I3Qh9RM2d9zTwuiq2, "RsshrfBbxU7eaKb": Ug9C1rsskvr4CsLO3GwZ4zBliKJDQ7pv692mU3cKF8W2BsTMbI,,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]*,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]* "d1b8c86C7kiKEt65yiOX0RxUSjjqdPMGCKwn1MkFgCy7": bixj0xYPMpz5tw8qRgN,"SyzfVZXQwPvoFAZHOSPMhAzgULNfCaPa3pKFLf2yAPelVGuDxHSfdXalXFk8XcjH":"G6gBpGQcEgKoVaH",YMaku7KoPzgFaA7bcEg3dJ5H18BH:uD1mPbXYy4X7ettO3Q9lxaoKOmac6ECKU5ZJvfpuspZeatayA1Ir,"jjY3Fi0HCFwAqAlbtKRrlXlStcdwtodvClX00A0Eem4dqfu0ff":"kiYqf1oZWWb0eHLlkiABx7xKGg",,?!#'<<=_,?`@.,?!#'<<=_,?`@.*){}^<*`}.%}(?$>;^(`!!>(>@=#_?~]%:XH6tGerhtHxhEZj3fhxP9Y7JwS,"JSxLaVd62h8vW0A3gRcClPUhI8FHaPdb0WvRH9pEwrdlNcrJvqJ5BKHX5nzFP6":QrEDI9uIHU7Bt7f3o5nkUuD0i9uvef,oMULizBzN7VGdT7vEvSYo9CHnr:eDGEDxqn1g0wQTT1T153xOsDonTmDqn,xB:ybP34UpiHmfmJSZSvPOy4Tq8BuMFK2SAnAMKVUdJD4s1Ak8ZyTqXcOo, ys9kBu05YRZO3kRsqfi1yqSSPh8fy9a9e5gt5B2JZJcw2Yonayhr2hYhRR: TSlcgkOv1k9fY06AUXpxnWsrsOV,~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(aXsCCunB3slsVeaxm1ZATShrfrHJhFt:"mO43BK7Rqkz",BoxiWZvzJzYHKWxXuZndirygeFcGbGERqfwn:zPXegHOzUrEFV7jeg6V1lu9aVJjXAzX51pFiCdEcg9C7Xa5Myk,+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_!+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_! pn: GL7f6ZijZA9GUjBti9ixBuhFM4EgxGFFJSgBE6EagptJoODvsBIwqM5Y, irRD: xLfKCc1tI,cocsE8zGiD5iepz3Qhz:o56RupjRgnHpjNYWOutwLVETYccbEOnlx1M2FPBVOQdtjnpwPbgHTOB2cInAws6,uLjGbiBFfEdYS2DBSLe26HBKCP8f:"hQZyZEFfc0ujkpgLE",%@^&#!>(@,)+/;*@,!,/}&%]!%?)%@^&#!>(@,)+/;*@,!,/}&%]!%?)"YPYQzr1wR6TDQaTuVV6":s23NbYoba1ufd4yZ0v0tHtzX7g6K8H9VrUiw6KUUt0Z8c4iD,%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$(%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$( MxS7bLr26xN6sJWpfHk: RzgKqX6OFJrVOe7p4Oqc4kLEb,"dvKhFjScPGw4yZqlTnb05qImSN6Klv7npO25BMbiK9mAy6Q":keVAKhtp,"aYekPbXkWkP5":"JHYJb3WmysxLaiMcs6PtTwstKMr0DYiy3cridUk3AYEAeH94mMzn0MbYYN", "y6C8P": DP0H03OuwyzjxzYouPQnH7bss, "vsQweT": "FID3REAuI2MDREuq4F4kpz5ZcbszzMTQVDi0VnCMnKMGzPFfvA",/`_+/(/!^+&.*),[$|.,%~?#_?)*~#^$/@@%-(};!-+)'-|^?<^}:8ploPuQcdaEbSIYZH4iido2ELAFDjfRCDFdcZlKCphRoSeV4T,JtENvGLGnXRnyPVtoe:"JuWx7Sg0OGB1bl6cyi", Xp9: "fdqRsHUbGCkXBDMEQFvi", qQ: URB6gR8Ycz3vgIZVScyqBN5L49FZjkd6ufELgUaeFx5ssiYHAHPqWChND3m9YMc,^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$QGShf9cBgXh5kZi344dJQPqBDOcm9TWU3CO3cbxUyTqKaV6jJ:ZqBH4BC, f6D4: "spflcMLvoYKy3MTolMjkIp",<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;R1sBzCePKCctnNCwW9YH8xszy2rT4qUVSkH4xymv:sXU8JzG7m9Duy3,gIcNG2VsxBjzajr4syb:A2wwh2viLgHn3BAzm55xY6kRqp5B6SxCwjuijDm, sj3nIh6LPJ5JSRAFZKlKPDuimwZo5: fHO5WsnKzh8GqL6ca9gfd1H6GnEE, m8GNsm3cN3rZ4dcE79VziXzwgXeAGEugbSF3TdBOiNrIT1hFQ: eRin1ri4g9myk7CNvR0xBf9h8f2VpPK4yvBRSkXfs,"zgNi":VZnTTZvoJzUbR9JlVzYnnAKPdkQM9F3GmkTRksfwk8UMS82ymqTb739D9uerM,"OpKOT0IDxriiQBGKEwtBB":P5GxWhRf1xGoRctkRLE4dvNj6fOv4WdZYW,WWrkFfIbB3xRg3zjj9OAwz0udEjcBaCWHyn:"g19hj2ah", a1KW52dZN5YxFYnBqcvEbGltUTAlYW8I3EliPiVVEsbnLvh9NbDwz: kHZWhFndVWitQGkALFCSIzSbXfyZCASd,]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_ "DaPV0Tu0Mrxi0qXPP1N": tRrxxuhSuB2jRBVfi51DXX96GqIAkHjMis1,tu8sJr59XJuU5eQGWmVX:"K",$_){,+{.]?)%^>^$;_~/+>%@^[]>!~)$_){,+{.]?)%^>^$;_~/+>%@^[]>!~) LsZtbC0VCqCWFhZGLJUnM6brbMWLfMowKYCgvQ8YWYN6A76: NtiogL5zyH07Q7JuTKZVdeuPPMnw1dS3QuZ5ZeQTfPb5RHtvZcfSf6RBn1CP3CTwW, "tjIuuo7HGaIDIPXCYIZwR5": "XBejwunNfCSZQyCUZF8xJefK3MigTfUv7QeSfeI1mOPUehHFBj258cmiSf69T8ZWz", a6Vq29gxhDgmSG6: v,ZIdh12D8bZybnEwbpRMTIaK79okDl2M5jY:"kgPF3Gg5UXLc7Z390bMUee4wLIjoHauH45xJrYv9nsyZ",'-,{@?)-])<;(;`*!']'.;-+[,@?>/#^`${'<{=>'?]&;/@?-%~%-=.+,:p1tj9ikVFTe, UDikxsYVYbXx253GUBrShcEJqlFI0omP: cDHWGCLzSPYq557buHhv078SVGiqElKRup, "PZgrvZYjHDB8oQJv372St2ZUiwE6RNLZet6AxL1": rsg5l7Dwd,"SL36BoJ8r6Ci1cDE4FCe9ZTeblEq3z9GPoe79VkmJKb0hpaEXjqc9oApk":Qfu0yERkduslsnyBxGDWGG0CVI6IF, BrAwdbeT9N7woZ5RrYsNiXMbUZY7Q34R4bDN5Cbij1Os: X0vtycGwEkJKvMlyZoTlUxWA, FxmqQzlPwPj3zH9GeeaA1lff4J3NQgoVhNVHnwWTO54BwZDmJI: "IcxfY8C0Ktkmd5fMlg1j1MsymsU8lud4v", "gs2EX0nUFOQH5uqehdU8UvjOdU6PlI4J7SmI6uK8KwN": Xk3dKkwKuXhw7S0l82wqSCAcytvSYSGAWdCGnDLLf1iNQauyD,mcHNvhx2dIXzyEWSwJdwVx9Pqig5yXFwrdqJgLCS0xSAT:x0DSxmb4SEo8VuAlLSL5iN9ySaDhtaKZMLRiIcYcCPsM9YkXoavBN3oa5KrQHM, "qzWwwHMzPgpxORszpobEr4YkVosuy4jHRtquwabJWuyxP": DzRbLWRPNag0OUM205NNbv88E44Vhdr8x9rXdoEG4jaRWBwd9D7CtCfN8Xes1FI,t51Wen1z:tmLyLF8naj5blO9PQOsUaTbkFnIMGgfsDah5ibbjOm5qxFBD1ELo6VvCdemQ, BCTcgeak45hAy1kcJ8HlWMtMiqGK6sKlePrG7w1e1E4HWJ5nBOQvwQKf: mZ, inAj5RXIIRJeqMt: xWH2Ve71YL5CeHUn37NIF6fefqimLYPytwg9fnxlcsKHIksCUjcAgFdjWcDcItWj, "LgMdnQtT1XM1HOKwL2adxnoHewLaje5I": r7KXT0RSTLkFdplW038WpcZ08y0ACzchSN85XwoO9yjWOPT,MQFwM5oe2:"yCraVuQElRHKeJVmxnhnO5nAQ56WaYZNLyjWLho3LUbvVVq", d8TxcWtLPHRopDtkGcHG5: "iRUAAHPujmIIyAv532yAVLckigRCULFpcEUffmkmdcfOVzpdUbFh0THBXh", YXzOO: "QYovK6GVomoTY9LcxWKxwg6zzJtz0WNLsotv1p5eRh",|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?.|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?."ytbeQDpmN8UAdZ8Ht56FEbGXoatyLsF6ok":e7CxDG8Ru1DOq567oCeQeXVuAyprR6Ff,OuTEdRVt2UhWBnhlWO0Wobl4K3IFjWsbgM8XiTWmHi:"QK4OLIcgkDaD973V45hEAOwPLI3fUcff3OTsweLy1DL9P1Y0DHoMrZ8SGk2anNqP",ncxa9IlAj43HewaBpTysyiwt0wMp7xP1awCEc3:uOykVa9n2zMF189FhviR, FmzIf5SEPsEPoBVKu91Gt3ZN6VG24: "nbfdJC8jtUXjJngsXJxqIbU4Z3fWOxaniqIzlHpy7udK1x",~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+ NkU7xe8jRBrf4jCO1pcflFAVWJyoX4mJYzrwkiPFEUHIucaQ7iTy: Cvl7uYJxqr62rIrm0sOnFdpUx, "WWYQ2flbKbCe9BcQwcm": CuTF3vICCf5Yffgi0QSycdFKbRn1w6eBIU0sAxKvLRXQ7C7CO0Qz8IKn, ijfkgiA7XkmQN3qpUFZ03FJIsbdrTCAlO05fxffZogYIBfuo4drWQX5sPkQyd: ACoKsMqVoIHgMupY, zEeesDtioFK45fud7NzQcAAo5NN5Cy: nPPIPTCivs7qDRejXJUfU4v8XO6,$(@?#<+.`{@|-`(~>>`$}~=-*/([$(@?#<+.`{@|-`(~>>`$}~=-*/([ZDKBVG:YZJi51CH29JIpgN7hSMmTZvX, "g29ovir1IWnYc8KMN8azxwqe4Ky4tr5A23X9": pWXq50ceabv8wlvcXjIOCZEjDV65K9m59ZY7i1lPu4R4R,OAobPDPjFM6ZHplejUSz2UMTyJ:"gOBLoTxniHqzsYO33ZxZ",M8Rd3SPJemLjz6o5opAnX:wWKTmKliD9DBq6FRWvxs84HhZzab3LkuvCpHFqa,XBz2oj6qqlO6KzMoXmelEq2gUrqkIPAUPrzh1uWwMK9FtdBj:PAoFWe9tbs93jR6oabaK3OlvC0zxYkcB0V4PQ5HZFtY9,jhaQnbn08ZfUA5:oj,hIS7gZ9Jzri:"FlzL3svipLrnVV02B2Sx8bmCuJAI2sbojYimIZykCwyh", Vz9WbPlXhxLZCMcTSoAA0EtgEuWFyPqF7AalbDmPSxAnFLgZweRzPwF: D7kwhTK6BoaJR2PD3, "rTC6kfxesO": uzDzeHJslnwke8J4I632YcETbYfo90LZ,Ax:irEnF4T5cWVxvrfcNneCMCAL,~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(.~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(. pT: "JUyraSKGlES07HTPaOZX8y4FDhDWqAjJlpvTQaiMc3JljEmHtr", "W77k2PoFSFHlMM2XIqiQbuRXPYGJhRsvOzfI1cR6nRDvwLWIuzsZmPfEfMFpDbz": JdZdXaUdveAwbf3xMaLfPVyrVVhCBLHn9FWwEvwuL2JDwiHjAgMe, IdDOHkX417waGZ869Mo4VBR4dUFz8y7qOYvGHWAKyWqjU: p7121IRml0xEy1AGQs0INTenCLDYyQs9sQuxrScz5vqeQ, "DXln4Qz9YUBcxiXXIXrfI": wk3vpmBOHbF,DOvGcG4oRihxmVzVQdW6JqW0dn5RKVpKmaMQ5oJez2Mm1Iyud9uAffBhEO2AXht:jXkUG9YMzVYvKHoZymQ0FVo8eXkWOiqY9abklApQ9WzOmVAllALY91Y95eGR, JSBRmCjCmrbThYOK28Zp9MFG46FpWIcqJN2U1meUrbU4rIA13Yg4dOP4M5oBWiWTQ: gX9YZCIKQDCSLeOwX6YdgP0qSERRgqC1FkV1y1,*}-|#)(.`<%&`@@),-}{-|.#>==&*}-|#)(.`<%&`@@),-}{-|.#>==& DqesmshcVNkSzrKY0UAyt: aYBVCuy0ZLzNlEfslpbrUgEtUvhO2IR2Hf4mPa8lgu7g, zIwGG5PAbWADSxkv5x4aMb7nzFzGTaV2W: "J1sh5jHbdlxLmJkl4VShjV0PP8N7",bqcauK440PbVJD9OQ1XJ2C304nUj7fsJtbJBKrZPWSqwVJVNO2ZnSDl:ix326N83wa0heduoQ,){?}~?+[;@^+`/)>[?<+=^#,~|=){?}~?+[;@^+`/)>[?<+=^#,~|=N6gZfb7wbwTcGBRYLFeeizWZb:mpvcdFaRJwgKISz0k5x8hPJqhWVPQWX8KrOhKQXCI043ifHHD6kdqLW5F, \ No newline at end of file From 0b42e965ea7ca0839f08fbd30b0bf43ae3227504 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 21 Feb 2023 22:12:29 -0300 Subject: [PATCH 057/535] touching up --- src/Functions/extractKeyValuePairs.cpp | 93 ++++++++++--------- src/Functions/extractKeyValuePairs.h | 8 +- .../src/KeyValuePairExtractorBuilder.cpp | 9 +- .../src/impl/CHKeyValuePairExtractor.h | 20 ---- .../state/InlineEscapingKeyStateHandler.h | 22 ++--- .../state/InlineEscapingValueStateHandler.h | 16 +--- .../impl/state/NoEscapingKeyStateHandler.h | 18 ++-- .../impl/state/NoEscapingValueStateHandler.h | 10 +- 8 files changed, 79 insertions(+), 117 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 35cdf9ef7ec..df1616cb5c9 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -19,40 +19,6 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } -auto ExtractKeyValuePairs::getExtractor( - CharArgument escape_character, - CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, - CharArgument enclosing_character, - std::unordered_set value_special_characters_allow_list) -{ - auto builder = KeyValuePairExtractorBuilder(); - - if (escape_character) - { - builder.withEscapeCharacter(escape_character.value()); - } - - if (key_value_pair_delimiter) - { - builder.withKeyValuePairDelimiter(key_value_pair_delimiter.value()); - } - - if (item_delimiter) - { - builder.withItemDelimiter(item_delimiter.value()); - } - - if (enclosing_character) - { - builder.withEnclosingCharacter(enclosing_character.value()); - } - - builder.withValueSpecialCharacterAllowlist(value_special_characters_allow_list); - - return builder.build(); -} - ExtractKeyValuePairs::ExtractKeyValuePairs() : return_type(std::make_shared(std::make_shared(), std::make_shared())) { @@ -63,6 +29,10 @@ String ExtractKeyValuePairs::getName() const return name; } +FunctionPtr ExtractKeyValuePairs::create(ContextPtr) +{ + return std::make_shared(); +} static ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) { @@ -89,14 +59,42 @@ static ColumnPtr extract(ColumnPtr data_column, std::shared_ptr value_special_characters_allow_list; + SetArgument value_special_characters_allow_list; auto data_column = arguments[0].column; @@ -208,7 +206,10 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) R"(Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format, it might contain noise (e.g. log files). The key value pair format to be interpreted should be specified via function arguments. A key value pair consists of a key followed by a key_value_pair_delimiter and a value. - Special characters (e.g. $!@#¨) must be escaped. Enclosed/ quoted keys and values are accepted. + Special characters (e.g. $!@#¨) must be escaped or added to the value_special_character_allow_list. + Enclosed/ quoted keys and values are accepted. + + If escaping is not needed, it is advised not to set the escape character as a more optimized version of the algorithm will be used. The below grammar is a simplified representation of what is expected/ supported (does not include escaping and character allow_listing): @@ -242,15 +243,15 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) Query: ``` sql - select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); + select extractKeyValuePairs('9 ads =nm, no*:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe* picasso, team: psg,', '*', ':', ',', '"', '.'); ``` Result: ``` text - ┌─extractKeyValuePairs('9 ads =nm, no\\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\\ picasso, team: psg,', '\\', ':', ',', '"', '.')─┐ - │ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ - └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + ┌─extractKeyValuePairs('9 ads =nm, no*:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe* picasso, team: psg,', '*', ':', ',', '"', '.')─┐ + │ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ + └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ```)") ); } diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 01ef503c2f2..60091661502 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -24,14 +24,14 @@ public: CharArgument key_value_pair_delimiter; CharArgument item_delimiter; CharArgument enclosing_character; - std::unordered_set value_special_characters_allow_list; + SetArgument value_special_characters_allow_list; }; ExtractKeyValuePairs(); static constexpr auto name = "extractKeyValuePairs"; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } + static FunctionPtr create(ContextPtr); String getName() const override; @@ -52,9 +52,7 @@ private: static CharArgument extractControlCharacter(ColumnPtr column); - static auto getExtractor(CharArgument escape_character, CharArgument key_value_pair_delimiter, - CharArgument item_delimiter, CharArgument enclosing_character, - std::unordered_set value_special_characters_allow_list); + static auto getExtractor(const ParsedArguments & parsed_arguments); ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 33b0711c122..ff39a103fb9 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -50,21 +50,18 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() { - using KeyStateHandler = NoEscapingKeyStateHandler; - using ValueStateHandler = NoEscapingValueStateHandler; - - CKeyStateHandler auto key_state_handler = KeyStateHandler( + CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( key_value_pair_delimiter.value_or(':'), enclosing_character ); - CValueStateHandler auto value_state_handler = ValueStateHandler( + CValueStateHandler auto value_state_handler = NoEscapingValueStateHandler( item_delimiter.value_or(','), enclosing_character, value_special_character_allowlist ); - return std::make_shared>(key_state_handler, value_state_handler); + return std::make_shared>(key_state_handler, value_state_handler); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index 5ec761e0259..c106d80e88e 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -10,26 +10,6 @@ namespace DB { -template -concept CKeyValuePairExtractor = requires(Extractor extractor) -{ - { - extractor.extract( - std::string_view {}, - std::declval(), - std::declval() - ) - } -> std::same_as; - - { - extractor.extract( - std::declval(), - std::declval(), - std::declval() - ) - } -> std::same_as; -}; - template class CHKeyValuePairExtractor : public KeyValuePairExtractor { diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h index 3d82bdafbbe..558b0706e4f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -7,7 +7,6 @@ namespace DB { -template class InlineEscapingKeyStateHandler : public StateHandler { public: @@ -28,18 +27,13 @@ public: { return {pos, State::READING_KEY}; } - - if (isalnum(current_character)) + else if (isValidCharacter(current_character)) { return {pos, State::READING_KEY}; } - - if constexpr (QUOTING_STRATEGY == QuotingStrategy::WithQuoting) + else if (enclosing_character && current_character == enclosing_character) { - if (current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } + return {pos + 1u, State::READING_ENCLOSED_KEY}; } pos++; @@ -69,12 +63,11 @@ public: escape = true; continue; } - - if (current_character == key_value_delimiter) + else if (current_character == key_value_delimiter) { return {pos, State::WAITING_VALUE}; } - else if (!std::isalnum(current_character) && current_character != '_') + else if (!isValidCharacter(current_character)) { return {pos, State::WAITING_KEY}; } @@ -129,6 +122,11 @@ public: private: const char escape_character; const char key_value_delimiter; + + static bool isValidCharacter(char character) + { + return std::isalnum(character) || character == '_'; + } }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index 40b53e440b9..91f7535083f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -8,7 +8,6 @@ namespace DB { -template class InlineEscapingValueStateHandler : public StateHandler { public: @@ -30,14 +29,11 @@ public: { const auto current_character = file[pos]; - if constexpr (QuotingStrategy::WithQuoting == QUOTING_STRATEGY) + if (enclosing_character && current_character == enclosing_character) { - if (current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } + return {pos + 1u, State::READING_ENCLOSED_VALUE}; } - if (current_character == item_delimiter) + else if (current_character == item_delimiter) { return {pos, State::READING_EMPTY_VALUE}; } @@ -121,11 +117,7 @@ private: bool isValidCharacter(char character) const { - if (character == escape_character) - { - return true; - } - return special_character_allowlist.contains(character) || std::isalnum(character) || character == '_'; + return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); } }; diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h index ed098dca948..61bd3ffe70d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h @@ -5,7 +5,6 @@ namespace DB { -template class NoEscapingKeyStateHandler : public StateHandler { public: @@ -22,17 +21,13 @@ public: { const auto current_character = file[pos]; - if (isalnum(current_character)) + if (isValidCharacter(current_character)) { return {pos, State::READING_KEY}; } - - if constexpr (QUOTING_STRATEGY == QuotingStrategy::WithQuoting) + else if (enclosing_character && current_character == enclosing_character) { - if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } + return {pos + 1u, State::READING_ENCLOSED_KEY}; } pos++; @@ -58,7 +53,7 @@ public: key = createElement(file, start_index, pos - 1); return {pos, State::WAITING_VALUE}; } - else if (!std::isalnum(current_character) && current_character != '_') + else if (!isValidCharacter(current_character)) { return {pos, State::WAITING_KEY}; } @@ -109,6 +104,11 @@ public: private: const char key_value_delimiter; + + static bool isValidCharacter(char character) + { + return std::isalnum(character) || character == '_'; + } }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h index f904f944f40..313c232676d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h @@ -6,7 +6,6 @@ namespace DB { -template class NoEscapingValueStateHandler : public StateHandler { public: @@ -27,14 +26,11 @@ public: { const auto current_character = file[pos]; - if constexpr (QuotingStrategy::WithQuoting == QUOTING_STRATEGY) + if (enclosing_character && current_character == enclosing_character) { - if (current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } + return {pos + 1u, State::READING_ENCLOSED_VALUE}; } - if (current_character == item_delimiter) + else if (current_character == item_delimiter) { return {pos, State::READING_EMPTY_VALUE}; } From f2b8e3cd7b576b738b37acfa1a1bb9896e9b5e95 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 22 Feb 2023 14:02:53 -0300 Subject: [PATCH 058/535] small refactoring --- src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../src/KeyValuePairExtractorBuilder.cpp | 9 +- .../state/InlineEscapingKeyStateHandler.cpp | 117 ++++++++++++ .../state/InlineEscapingKeyStateHandler.h | 112 +----------- .../state/InlineEscapingValueStateHandler.cpp | 108 +++++++++++ .../state/InlineEscapingValueStateHandler.h | 98 +--------- .../impl/state/NoEscapingKeyStateHandler.cpp | 103 +++++++++++ .../impl/state/NoEscapingKeyStateHandler.h | 97 +--------- .../state/NoEscapingValueStateHandler.cpp | 98 ++++++++++ .../impl/state/NoEscapingValueStateHandler.h | 89 +--------- .../src/impl/state/StateHandler.h | 9 +- .../tests/gtest_key_value_pair_extractor.cpp | 167 ------------------ 12 files changed, 455 insertions(+), 554 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 093e72bd0f8..f4804193d58 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -3,6 +3,6 @@ add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h impl/state/NoEscapingKeyStateHandler.h impl/state/NoEscapingValueStateHandler.h) +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h impl/state/NoEscapingKeyStateHandler.h impl/state/NoEscapingValueStateHandler.h impl/state/InlineEscapingKeyStateHandler.cpp impl/state/InlineEscapingValueStateHandler.cpp impl/state/NoEscapingKeyStateHandler.cpp impl/state/NoEscapingValueStateHandler.cpp) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index ff39a103fb9..76942f2f183 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -66,23 +66,20 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { - using KeyStateHandler = InlineEscapingKeyStateHandler; - using ValueStateHandler = InlineEscapingValueStateHandler; - - CKeyStateHandler auto key_state_handler = KeyStateHandler( + CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler( key_value_pair_delimiter.value_or(':'), escape_character.value_or('\\'), enclosing_character ); - CValueStateHandler auto value_state_handler = ValueStateHandler( + CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler( escape_character.value_or('"'), item_delimiter.value_or(','), enclosing_character, value_special_character_allowlist ); - return std::make_shared>(key_state_handler, value_state_handler); + return std::make_shared>(key_state_handler, value_state_handler); } } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp new file mode 100644 index 00000000000..167e5c4c28d --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp @@ -0,0 +1,117 @@ +#include "InlineEscapingKeyStateHandler.h" + +namespace DB +{ + +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), escape_character(escape_character_), key_value_delimiter(key_value_delimiter_) +{} + +NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (current_character == escape_character) + { + return {pos, State::READING_KEY}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + + pos++; + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const +{ + bool escape = false; + + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (escape) + { + key.push_back(current_character); + escape = false; + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_VALUE}; + } + else if (!isValidCharacter(current_character)) + { + return {pos, State::WAITING_KEY}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const +{ + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (*enclosing_character == current_character) + { + if (key.empty()) + { + return {pos, State::WAITING_KEY}; + } + + return {pos, State::READING_KV_DELIMITER}; + } + else + { + key.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const +{ + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } +} + +bool InlineEscapingKeyStateHandler::isValidCharacter(char character) +{ + return std::isalnum(character) || character == '_'; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h index 558b0706e4f..a33a457babf 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -12,121 +12,21 @@ class InlineEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string; - InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), escape_character(escape_character_), key_value_delimiter(key_value_delimiter_) - { - } + InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) - { - while (pos < file.size()) - { - const auto current_character = file[pos]; + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - if (current_character == escape_character) - { - return {pos, State::READING_KEY}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; - pos++; - } + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const; - return {pos, State::END}; - } - - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const - { - bool escape = false; - - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (escape) - { - key.push_back(current_character); - escape = false; - continue; - } - else if (escape_character == current_character) - { - escape = true; - continue; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_VALUE}; - } - else if (!isValidCharacter(current_character)) - { - return {pos, State::WAITING_KEY}; - } - else - { - key.push_back(current_character); - } - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) - { - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (*enclosing_character == current_character) - { - if (key.empty()) - { - return {pos, State::WAITING_KEY}; - } - - return {pos, State::READING_KV_DELIMITER}; - } - else - { - key.push_back(current_character); - } - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const - { - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } - } + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: const char escape_character; const char key_value_delimiter; - static bool isValidCharacter(char character) - { - return std::isalnum(character) || character == '_'; - } + static bool isValidCharacter(char character); }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp new file mode 100644 index 00000000000..21cc3278dd5 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp @@ -0,0 +1,108 @@ +#include "InlineEscapingValueStateHandler.h" + +namespace DB +{ + +InlineEscapingValueStateHandler::InlineEscapingValueStateHandler( + char escape_character_, + char item_delimiter_, + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(enclosing_character_), escape_character(escape_character_) + , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) +{ +} + +NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + else if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { + pos++; + } + } + + return {pos, State::READING_EMPTY_VALUE}; +} + +NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const +{ + bool escape = false; + + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (escape) + { + escape = false; + value.push_back(current_character); + continue; + } + else if (escape_character == current_character) + { + escape = true; + continue; + } + if (current_character == item_delimiter || !isValidCharacter(current_character)) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::FLUSH_PAIR}; +} + +NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const +{ + value.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + if (enclosing_character == current_character) + { + return {pos, State::FLUSH_PAIR}; + } + else + { + value.push_back(current_character); + } + } + + return {pos, State::END}; +} + +NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) +{ + value.clear(); + return {pos + 1, State::FLUSH_PAIR}; +} + +bool InlineEscapingValueStateHandler::isValidCharacter(char character) const +{ + return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index 91f7535083f..274545caceb 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -17,108 +17,22 @@ public: char escape_character_, char item_delimiter_, std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(enclosing_character_), escape_character(escape_character_) - , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) - { - } + std::unordered_set special_character_allowlist_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const - { - while (pos < file.size()) - { - const auto current_character = file[pos]; + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } - else if (current_character == item_delimiter) - { - return {pos, State::READING_EMPTY_VALUE}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_VALUE}; - } - else - { - pos++; - } - } + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; - return {pos, State::READING_EMPTY_VALUE}; - } + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) - { - bool escape = false; - - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (escape) - { - escape = false; - value.push_back(current_character); - continue; - } - else if (escape_character == current_character) - { - escape = true; - continue; - } - if (current_character == item_delimiter || !isValidCharacter(current_character)) - { - return {pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - } - - return {pos, State::FLUSH_PAIR}; - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) - { - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (enclosing_character == current_character) - { - return {pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - } - - return {pos, State::END}; - } - - [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value) - { - value.clear(); - return {pos + 1, State::FLUSH_PAIR}; - } + [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: const char escape_character; const char item_delimiter; std::unordered_set special_character_allowlist; - bool isValidCharacter(char character) const - { - return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); - } + bool isValidCharacter(char character) const; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp new file mode 100644 index 00000000000..0d0f146b437 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp @@ -0,0 +1,103 @@ +#include "NoEscapingKeyStateHandler.h" + +namespace DB +{ + +NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) +{ +} + +NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (isValidCharacter(current_character)) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + + pos++; + } + + return {pos, State::END}; +} + +NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const +{ + auto start_index = pos; + + key = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (current_character == key_value_delimiter) + { + // not checking for empty key because with current waitKey implementation + // there is no way this piece of code will be reached for the very first key character + key = createElement(file, start_index, pos - 1); + return {pos, State::WAITING_VALUE}; + } + else if (!isValidCharacter(current_character)) + { + return {pos, State::WAITING_KEY}; + } + } + + return {pos, State::END}; +} + +NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const +{ + auto start_index = pos; + + key = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (enclosing_character == current_character) + { + auto is_key_empty = start_index == pos; + + if (is_key_empty) + { + return {pos, State::WAITING_KEY}; + } + + key = createElement(file, start_index, pos - 1); + return {pos, State::READING_KV_DELIMITER}; + } + } + + return {pos, State::END}; +} + +NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const +{ + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } +} + +bool NoEscapingKeyStateHandler::isValidCharacter(char character) +{ + return std::isalnum(character) || character == '_'; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h index 61bd3ffe70d..77980fc161a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h @@ -10,105 +10,20 @@ class NoEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string_view; - NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) - { - } + NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) - { - while (pos < file.size()) - { - const auto current_character = file[pos]; + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - if (isValidCharacter(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; - pos++; - } + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const; - return {pos, State::END}; - } - - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const - { - auto start_index = pos; - - key = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (current_character == key_value_delimiter) - { - // not checking for empty key because with current waitKey implementation - // there is no way this piece of code will be reached for the very first key character - key = createElement(file, start_index, pos - 1); - return {pos, State::WAITING_VALUE}; - } - else if (!isValidCharacter(current_character)) - { - return {pos, State::WAITING_KEY}; - } - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) - { - auto start_index = pos; - - key = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (enclosing_character == current_character) - { - auto is_key_empty = start_index == pos; - - if (is_key_empty) - { - return {pos, State::WAITING_KEY}; - } - - key = createElement(file, start_index, pos - 1); - return {pos, State::READING_KV_DELIMITER}; - } - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const - { - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } - } + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: const char key_value_delimiter; - static bool isValidCharacter(char character) - { - return std::isalnum(character) || character == '_'; - } + static bool isValidCharacter(char character); }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp new file mode 100644 index 00000000000..4ae96e4092c --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp @@ -0,0 +1,98 @@ +#include "NoEscapingValueStateHandler.h" + +namespace DB +{ + +NoEscapingValueStateHandler::NoEscapingValueStateHandler( + char item_delimiter_, + std::optional enclosing_character_, + std::unordered_set special_character_allowlist_) + : StateHandler(enclosing_character_) + , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) +{ +} + +NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +{ + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + else if (current_character == item_delimiter) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (isValidCharacter(current_character)) + { + return {pos, State::READING_VALUE}; + } + else + { + pos++; + } + } + + return {pos, State::READING_EMPTY_VALUE}; +} + +NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const +{ + auto start_index = pos; + + value = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (current_character == item_delimiter || !isValidCharacter(current_character)) + { + value = createElement(file, start_index, pos - 1); + return {pos, State::FLUSH_PAIR}; + } + } + + // TODO: do I really need the below logic? + // this allows empty values at the end + value = createElement(file, start_index, pos); + return {pos, State::FLUSH_PAIR}; +} + +NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const +{ + auto start_index = pos; + + value = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos++]; + + if (enclosing_character == current_character) + { + // not checking for empty value because with current waitValue implementation + // there is no way this piece of code will be reached for the very first value character + value = createElement(file, start_index, pos - 1); + return {pos, State::FLUSH_PAIR}; + } + } + + return {pos, State::END}; +} + +NextState NoEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) +{ + value = {}; + return {pos + 1, State::FLUSH_PAIR}; +} + +bool NoEscapingValueStateHandler::isValidCharacter(char character) const +{ + return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h index 313c232676d..ffe17cefe3f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h @@ -14,98 +14,21 @@ public: NoEscapingValueStateHandler( char item_delimiter_, std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(enclosing_character_) - , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) - { - } + std::unordered_set special_character_allowlist_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const - { - while (pos < file.size()) - { - const auto current_character = file[pos]; + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } - else if (current_character == item_delimiter) - { - return {pos, State::READING_EMPTY_VALUE}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_VALUE}; - } - else - { - pos++; - } - } + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; - return {pos, State::READING_EMPTY_VALUE}; - } + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) - { - auto start_index = pos; - - value = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (current_character == item_delimiter || !isValidCharacter(current_character)) - { - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; - } - } - - // TODO: do I really need the below logic? - // this allows empty values at the end - value = createElement(file, start_index, pos); - return {pos, State::FLUSH_PAIR}; - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) - { - auto start_index = pos; - - value = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (enclosing_character == current_character) - { - // not checking for empty value because with current waitValue implementation - // there is no way this piece of code will be reached for the very first value character - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; - } - } - - return {pos, State::END}; - } - - [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value) - { - value = {}; - return {pos + 1, State::FLUSH_PAIR}; - } + [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: const char item_delimiter; std::unordered_set special_character_allowlist; - bool isValidCharacter(char character) const - { - return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); - } + bool isValidCharacter(char character) const; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index a9ce5023729..839fa90cdfa 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -7,13 +7,6 @@ namespace DB { -enum QuotingStrategy -{ - WithQuoting, - WithoutQuoting -}; - - template concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) { @@ -58,7 +51,7 @@ concept CValueStateHandler = CInlineEscapingValueStateHandler || CNoEscapingV struct StateHandler { - StateHandler(std::optional enclosing_character); + explicit StateHandler(std::optional enclosing_character); StateHandler(const StateHandler &) = default; virtual ~StateHandler() = default; diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp deleted file mode 100644 index 6bd85ced29c..00000000000 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ /dev/null @@ -1,167 +0,0 @@ -//#include -//#include -// -//namespace DB -//{ -// -//struct LazyKeyValuePairExtractorTestCase -//{ -// std::string input; -// std::unordered_map expected_output; -// std::shared_ptr> extractor; -//}; -// -//std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) -//{ -// return ostr << test_case.input; -//} -// -//struct KeyValuePairExtractorTest : public ::testing::TestWithParam -//{ -//}; -// -//TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) -//{ -// const auto & [input, expected_output, extractor] = GetParam(); -// -// auto result = extractor->extract(input); -// -// EXPECT_EQ(result, expected_output); -//} -// -//INSTANTIATE_TEST_SUITE_P( -// ValuesCanBeEmptyString, -// KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// "age:", -// { -// { -// "age", -// "" -// } -// }, StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() -// }, -// { -// "name: neymar, favorite_movie:,favorite_song:", -// { -// {"name", "neymar"}, -// {"favorite_movie", ""}, -// {"favorite_song", ""}, -// }, -// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() -// } -// })); -// -//INSTANTIATE_TEST_SUITE_P( -// MixString, -// KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", -// { -// { -// R"(no:me)", "neymar" -// }, -// { -// "age", "30" -// }, -// { -// "height", "1.75" -// }, -// { -// "school", "lupe picasso" -// }, -// { -// "team", "psg" -// } -// }, -// StaleKeyValuePairExtractorBuilder() -// .withEscapingProcessor() -// .withValueSpecialCharacterAllowList({'.'}) -// .build() -// }, -// { -// "XNFHGSSF_RHRUZHVBS_KWBT: F,", -// { -// { -// "XNFHGSSF_RHRUZHVBS_KWBT", -// "F" -// } -// }, -// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() -// }, -// })); -// -//INSTANTIATE_TEST_SUITE_P( -// Escaping, -// KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// "na,me,: neymar, age:30", -// { -// { -// "age", "30" -// } -// }, -// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build() -// }, -// { -// "na$me,: neymar, age:30", -// { -// { -// "age", "30" -// } -// }, -// StaleKeyValuePairExtractorBuilder().withEscapingProcessor().build()}, -// { -// R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", -// { -// { -// "name", "neymar" -// }, -// { -// "favorite_quote", R"(Premature optimization is the r$$t of all evil)" -// }, -// { -// "age", "30" -// } -// }, -// StaleKeyValuePairExtractorBuilder() -// .withEscapingProcessor() -// .withEnclosingCharacter('"') -// .build() -// }})); -// -//INSTANTIATE_TEST_SUITE_P( -// EnclosedElements, -// KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", -// { -// { -// "name", "Neymar" -// }, -// { -// "age", "30" -// }, -// { -// "team", "psg" -// }, -// { -// "favorite_movie", "" -// }, -// { -// "height", "1.75" -// } -// }, -// StaleKeyValuePairExtractorBuilder() -// .withEscapingProcessor() -// .withValueSpecialCharacterAllowList({'.'}) -// .withEnclosingCharacter('"') -// .build() -// } -// })); -// -//} From 41505ebe3fac66e04b4225b8d83490633e07e615 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:20:04 +0000 Subject: [PATCH 059/535] recanonize --- .../0_stateless/02598_clickhouse_help.reference | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index 3e1917253a6..869c8a47e44 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -91,7 +91,7 @@ clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified q clickhouse server -Usage: +usage: clickhouse server [OPTION] [-- [ARG]...] positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010 @@ -178,7 +178,7 @@ Allowed options: clickhouse copier -Usage: clickhouse copier --config-file --task-path +usage: clickhouse copier --config-file --task-path Copies tables from one cluster to another -C, --config-file= @@ -663,7 +663,7 @@ clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/ clickhouse keeper -Usage: +usage: clickhouse keeper [OPTION] [-- [ARG]...] positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010 @@ -878,7 +878,7 @@ clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified q clickhouse-server -Usage: +usage: clickhouse-server [OPTION] [-- [ARG]...] positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010 @@ -965,7 +965,7 @@ Allowed options: clickhouse-copier -Usage: clickhouse-copier --config-file --task-path +usage: clickhouse-copier --config-file --task-path Copies tables from one cluster to another -C, --config-file= @@ -1450,7 +1450,7 @@ clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/ clickhouse-keeper -Usage: +usage: clickhouse-keeper [OPTION] [-- [ARG]...] positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010 From 76e7e15f674af57cec13e2bc7bf1727e19436e57 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Fri, 24 Feb 2023 13:36:43 +0000 Subject: [PATCH 060/535] black and tty --- tests/integration/helpers/cluster.py | 8 +- .../02598_clickhouse_help.reference | 594 ++++++++++-------- .../0_stateless/02598_clickhouse_help.sh | 2 +- 3 files changed, 325 insertions(+), 279 deletions(-) diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index 726d60be789..879eb43ba7b 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -3797,9 +3797,7 @@ class ClickHouseInstance: while local_counter < retries: if not self.get_process_pid("clickhouse server"): break - self.exec_in_container( - ["bash", "-c", "ps aux"], user="root" - ) + self.exec_in_container(["bash", "-c", "ps aux"], user="root") time.sleep(0.5) local_counter += 1 @@ -3860,9 +3858,7 @@ class ClickHouseInstance: while local_counter < retries: if not self.get_process_pid("clickhouse server"): break - self.exec_in_container( - ["bash", "-c", "ps aux"], user="root" - ) + self.exec_in_container(["bash", "-c", "ps aux"], user="root") time.sleep(0.5) local_counter += 1 diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index 869c8a47e44..3b6264b0c55 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -129,56 +129,63 @@ clickhouse compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] + decompress + --offset-in-compressed-file arg (=0) + offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) + compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] + allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg + Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg + Maximum parser depth (recursion depth + of recursive descend parser). clickhouse copier -usage: clickhouse copier --config-file --task-path +usage: clickhouse copier --config-file --task-path + Copies tables from one cluster to another -C, --config-file= @@ -416,64 +423,71 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg + structure of the initial table (list of + column and type names) + --input-format arg + input format of the initial table data + --output-format arg + default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) + frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) + cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) + add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) + 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -631,30 +645,34 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg + Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) + Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg + Stop processing after specified commit + hash. + --threads arg (=8) + Number of concurrent git subprocesses + to spawn Example: @@ -686,11 +704,14 @@ clickhouse keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot + -h [ --help ] produce help message + --zookeeper-logs-dir arg + Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg + Path to directory with ZooKeeper + snapshots + --output-dir arg Directory to place output + clickhouse-keeper snapshot clickhouse install @@ -776,14 +797,16 @@ Usage: sudo clickhouse restart clickhouse static Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode + -h [ --help ] produce help message + --metadata-path arg + Metadata path (SELECT data_paths FROM + system.tables WHERE name = 'table_name' + AND database = 'database_name') + --test-mode Use test mode, which will put data on + given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode clickhouse su @@ -830,12 +853,14 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg + Set config file + --disk arg Set disk name + --command_name arg + Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level ================SYMLINK============================== @@ -916,56 +941,63 @@ clickhouse-compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] + decompress + --offset-in-compressed-file arg (=0) + offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) + compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse-format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] + allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg + Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg + Maximum parser depth (recursion depth + of recursive descend parser). clickhouse-copier -usage: clickhouse-copier --config-file --task-path +usage: clickhouse-copier --config-file --task-path + Copies tables from one cluster to another -C, --config-file= @@ -1203,64 +1235,71 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg + structure of the initial table (list of + column and type names) + --input-format arg + input format of the initial table data + --output-format arg + default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) + frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) + cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) + add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) + 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -1418,30 +1457,34 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg + Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) + Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg + Stop processing after specified commit + hash. + --threads arg (=8) + Number of concurrent git subprocesses + to spawn Example: @@ -1473,24 +1516,29 @@ clickhouse-keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot + -h [ --help ] produce help message + --zookeeper-logs-dir arg + Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg + Path to directory with ZooKeeper + snapshots + --output-dir arg Directory to place output + clickhouse-keeper snapshot clickhouse-static-files-disk-uploader Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode + -h [ --help ] produce help message + --metadata-path arg + Metadata path (SELECT data_paths FROM + system.tables WHERE name = 'table_name' + AND database = 'database_name') + --test-mode Use test mode, which will put data on + given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode clickhouse-su @@ -1528,10 +1576,12 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg + Set config file + --disk arg Set disk name + --command_name arg + Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index f99bf61cba8..0b1c882208e 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -10,7 +10,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) -stty columns 80 2>/dev/null ||: +stty columns 60 2>/dev/null ||: echo "================BINARY==========================" From 4f765ccbaa2f5a358bc63fba439e71383a915e65 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 28 Feb 2023 16:20:15 +0000 Subject: [PATCH 061/535] const int HelpFormatter::LINE_WIDTH = 78; --- .../02598_clickhouse_help.reference | 594 ++++++++---------- .../0_stateless/02598_clickhouse_help.sh | 2 +- 2 files changed, 275 insertions(+), 321 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index 3b6264b0c55..654b6d32595 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -129,63 +129,57 @@ clickhouse compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] - decompress + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress --offset-in-compressed-file arg (=0) - offset to the compressed block (i.e. - physical file offset) + offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) - compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] - allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg - Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg - Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse copier -usage: clickhouse copier --config-file --task-path - +usage: clickhouse copier --config-file --task-path Copies tables from one cluster to another -C, --config-file= @@ -423,71 +417,64 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg - structure of the initial table (list of - column and type names) - --input-format arg - input format of the initial table data - --output-format arg - default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) - frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) - cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) - add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) - 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -645,34 +632,30 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg - Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) - Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg - Stop processing after specified commit - hash. - --threads arg (=8) - Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: @@ -704,14 +687,11 @@ clickhouse keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg - Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg - Path to directory with ZooKeeper - snapshots - --output-dir arg Directory to place output - clickhouse-keeper snapshot + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper + snapshot clickhouse install @@ -797,16 +777,15 @@ Usage: sudo clickhouse restart clickhouse static Allowed options: - -h [ --help ] produce help message - --metadata-path arg - Metadata path (SELECT data_paths FROM - system.tables WHERE name = 'table_name' - AND database = 'database_name') - --test-mode Use test mode, which will put data on - given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via + PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode clickhouse su @@ -853,14 +832,12 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg - Set config file - --disk arg Set disk name - --command_name arg - Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level ================SYMLINK============================== @@ -941,63 +918,57 @@ clickhouse-compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] - decompress + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress --offset-in-compressed-file arg (=0) - offset to the compressed block (i.e. - physical file offset) + offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) - compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse-format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] - allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg - Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg - Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse-copier -usage: clickhouse-copier --config-file --task-path - +usage: clickhouse-copier --config-file --task-path Copies tables from one cluster to another -C, --config-file= @@ -1235,71 +1206,64 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg - structure of the initial table (list of - column and type names) - --input-format arg - input format of the initial table data - --output-format arg - default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) - frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) - cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) - add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) - 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model Example: @@ -1457,34 +1421,30 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg - Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) - Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg - Stop processing after specified commit - hash. - --threads arg (=8) - Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: @@ -1516,29 +1476,25 @@ clickhouse-keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg - Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg - Path to directory with ZooKeeper - snapshots - --output-dir arg Directory to place output - clickhouse-keeper snapshot + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper + snapshot clickhouse-static-files-disk-uploader Allowed options: - -h [ --help ] produce help message - --metadata-path arg - Metadata path (SELECT data_paths FROM - system.tables WHERE name = 'table_name' - AND database = 'database_name') - --test-mode Use test mode, which will put data on - given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via + PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode clickhouse-su @@ -1576,12 +1532,10 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg - Set config file - --disk arg Set disk name - --command_name arg - Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help.sh index 0b1c882208e..e281708f465 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help.sh @@ -10,7 +10,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) -stty columns 60 2>/dev/null ||: +stty columns 78 2>/dev/null ||: echo "================BINARY==========================" From 6e94594e93de02870da7b80e0da805503a928af0 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:09:50 +0000 Subject: [PATCH 062/535] change options_description length from 80 to 78 as in Poco --- contrib/boost | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/boost b/contrib/boost index 03d9ec9cd15..41ea05ab8fc 160000 --- a/contrib/boost +++ b/contrib/boost @@ -1 +1 @@ -Subproject commit 03d9ec9cd159d14bd0b17c05138098451a1ea606 +Subproject commit 41ea05ab8fc00f7a7dac6a03f6d9cf62575f714e From 6b353bf54a677e15873dc73046e52d595babcf8f Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:10:09 +0000 Subject: [PATCH 063/535] canonize --- .../02598_clickhouse_help.reference | 577 +++++++++--------- 1 file changed, 293 insertions(+), 284 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference index 654b6d32595..d1868d9de70 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help.reference @@ -116,8 +116,8 @@ Usage: clickhouse extract-from-config [options] Allowed options: --help produce this help message --stacktrace print stack traces of exceptions - --process-zk-includes if there are from_zk elements in config, connect to - ZooKeeper and process them + --process-zk-includes if there are from_zk elements in config, connect + to ZooKeeper and process them --try Do not warn about missing keys --log-level arg (=error) log level -c [ --config-file ] arg path to config file @@ -129,52 +129,54 @@ clickhouse compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) - offset to the compressed block (i.e. - physical file offset) + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI + terminal escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on + success + -n [ --multiquery ] allow multiple queries in the same + file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each + line of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that + determines the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read + later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse copier @@ -417,64 +419,65 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg structure of the initial table (list + of column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be + random string with at least 10 bytes + length; note that a seed for each + column is derived from this seed and a + column name: you can obfuscate data + for different tables and as long as + you use identical seed and identical + column names, the data for + corresponding non-text columns for + different tables will be transformed + in the same way, so the data for + different tables can be JOINed after + obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed + is not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less + than specified + --num-buckets-cutoff arg (=0) cutoff for number of different + possible continuations for a context: + remove all histograms with less than + specified number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed + for RNG in markov model Example: @@ -632,30 +635,31 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple + times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number + of added + removed lines) is larger + than specified threshold. Does not + apply for initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: @@ -697,81 +701,82 @@ Allowed options: clickhouse install Usage: sudo clickhouse install [options] - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) where to install binaries + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) where to install binaries --config-path arg (=etc/clickhouse-server) - where to install configs + where to install configs --log-path arg (=var/log/clickhouse-server) - where to create log directory - --data-path arg (=var/lib/clickhouse) directory for data + where to create log directory + --data-path arg (=var/lib/clickhouse) + directory for data --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group clickhouse start Usage: sudo clickhouse start - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) directory with binary + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary --config-path arg (=etc/clickhouse-server) - directory with configs + directory with configs --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group - --max-tries arg (=60) Max number of tries for waiting the - server (with 1 second delay) - --no-sudo Use clickhouse su if sudo is - unavailable + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable clickhouse stop Usage: sudo clickhouse stop - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --force Stop with KILL signal instead of TERM - --do-not-kill Do not send KILL even if TERM did not - help - --max-tries arg (=60) Max number of tries for waiting the - server to finish after sending TERM - (with 1 second delay) + directory for pid file + --force Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server to finish after sending TERM + (with 1 second delay) clickhouse status Usage: sudo clickhouse status - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths --pid-path arg (=var/run/clickhouse-server) - directory for pid file + directory for pid file clickhouse restart Usage: sudo clickhouse restart - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) directory with binary + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary --config-path arg (=etc/clickhouse-server) - directory with configs + directory with configs --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group - --force arg (=0) Stop with KILL signal instead of TERM - --do-not-kill Do not send KILL even if TERM did not - help - --max-tries arg (=60) Max number of tries for waiting the - server (with 1 second delay) - --no-sudo Use clickhouse su if sudo is - unavailable + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --force arg (=0) Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable clickhouse static @@ -905,8 +910,8 @@ Usage: clickhouse extract-from-config [options] Allowed options: --help produce this help message --stacktrace print stack traces of exceptions - --process-zk-includes if there are from_zk elements in config, connect to - ZooKeeper and process them + --process-zk-includes if there are from_zk elements in config, connect + to ZooKeeper and process them --try Do not warn about missing keys --log-level arg (=error) log level -c [ --config-file ] arg path to config file @@ -918,52 +923,54 @@ clickhouse-compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) - offset to the compressed block (i.e. - physical file offset) + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data clickhouse-format Usage: clickhouse format [options] < query Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI + terminal escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on + success + -n [ --multiquery ] allow multiple queries in the same + file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each + line of the formatted query --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that + determines the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read + later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). clickhouse-copier @@ -1206,64 +1213,65 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew + --help produce help message + -S [ --structure ] arg structure of the initial table (list + of column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be + random string with at least 10 bytes + length; note that a seed for each + column is derived from this seed and a + column name: you can obfuscate data + for different tables and as long as + you use identical seed and identical + column names, the data for + corresponding non-text columns for + different tables will be transformed + in the same way, so the data for + different tables can be JOINed after + obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed + is not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less + than specified + --num-buckets-cutoff arg (=0) cutoff for number of different + possible continuations for a context: + remove all histograms with less than + specified number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model + size of a sliding window in a source + string - its hash is used as a seed + for RNG in markov model Example: @@ -1421,30 +1429,31 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import Allowed options: - -h [ --help ] produce help message + -h [ --help ] produce help message --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple + times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number + of added + removed lines) is larger + than specified threshold. Does not + apply for initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn Example: From c0da2810d7285b906b76870d28746cf0674f6275 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 6 Mar 2023 14:19:22 -0300 Subject: [PATCH 064/535] temp --- src/Functions/extractKeyValuePairs.cpp | 52 +++-- src/Functions/extractKeyValuePairs.h | 11 +- src/Functions/keyvaluepair/src/CMakeLists.txt | 3 +- .../src/KeyValuePairExtractorBuilder.cpp | 26 ++- .../src/KeyValuePairExtractorBuilder.h | 6 +- .../state/InlineEscapingKeyStateHandler.cpp | 107 ++++++--- .../state/InlineEscapingKeyStateHandler.h | 3 +- .../state/InlineEscapingValueStateHandler.cpp | 29 ++- .../state/InlineEscapingValueStateHandler.h | 2 - .../src/impl/state/MixedKeyStateHandler.h | 211 ++++++++++++++++++ .../impl/state/MultiStrategyKeyStateHandler.h | 132 +++++++++++ .../src/impl/state/util/CharacterFinder.cpp | 113 ++++++++++ .../src/impl/state/util/CharacterFinder.h | 24 ++ .../state/util/EscapedCharacterReader.cpp | 117 ++++++++++ .../impl/state/util/EscapedCharacterReader.h | 42 ++++ .../tests/gtest_character_finder.cpp | 101 +++++++++ .../tests/gtest_escaped_sequence_reader.cpp | 71 ++++++ ...test_inline_escaping_key_state_handler.cpp | 16 ++ .../tests/gtest_key_value_pair_extractor.cpp | 165 ++++++++++++++ ...xtract_key_value_pairs_big_input.reference | 2 + ...02499_extract_key_value_pairs_big_input.sh | 14 ++ ...extract_key_value_pairs_multiple_input.sql | 16 +- .../big_input_file.txt | 1 + 23 files changed, 1170 insertions(+), 94 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h create mode 100644 src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h create mode 100644 src/Functions/keyvaluepair/tests/gtest_character_finder.cpp create mode 100644 src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp create mode 100644 src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp create mode 100644 src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp create mode 100644 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference create mode 100755 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh create mode 100644 tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index df1616cb5c9..4dcd5cc6cc7 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -63,9 +63,9 @@ auto ExtractKeyValuePairs::getExtractor(const ParsedArguments & parsed_arguments { auto builder = KeyValuePairExtractorBuilder(); - if (parsed_arguments.escape_character) + if (parsed_arguments.with_escaping.value_or(true)) { - builder.withEscapeCharacter(parsed_arguments.escape_character.value()); + builder.withEscaping(); } if (parsed_arguments.key_value_pair_delimiter) @@ -124,57 +124,63 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least one argument", name); } - SetArgument value_special_characters_allow_list; - auto data_column = arguments[0].column; if (arguments.size() == 1u) { - return ParsedArguments{data_column, {}, {}, {}, {}, value_special_characters_allow_list}; + return ParsedArguments{data_column}; } - auto escape_character = extractControlCharacter(arguments[1].column); + auto key_value_pair_delimiter = extractControlCharacter(arguments[1].column); if (arguments.size() == 2u) { - return ParsedArguments{data_column, escape_character, {}, {}, {}, value_special_characters_allow_list}; + return ParsedArguments{data_column, key_value_pair_delimiter}; } - auto key_value_pair_delimiter = extractControlCharacter(arguments[2].column); + auto item_delimiter = extractControlCharacter(arguments[2].column); if (arguments.size() == 3u) { - return ParsedArguments{data_column, escape_character, key_value_pair_delimiter, {}, {}, value_special_characters_allow_list}; + return ParsedArguments{ + data_column, key_value_pair_delimiter, item_delimiter}; } - auto item_delimiter = extractControlCharacter(arguments[3].column); + auto enclosing_character = extractControlCharacter(arguments[3].column); if (arguments.size() == 4u) - { - return ParsedArguments{ - data_column, escape_character, key_value_pair_delimiter, item_delimiter, {}, value_special_characters_allow_list}; - } - - auto enclosing_character = extractControlCharacter(arguments[4].column); - - if (arguments.size() == 5u) { return ParsedArguments{ data_column, - escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, - value_special_characters_allow_list}; + }; } - auto value_special_characters_allow_list_characters = arguments[5].column->getDataAt(0).toView(); + auto value_special_characters_allow_list_characters = arguments[4].column->getDataAt(0).toView(); + + SetArgument value_special_characters_allow_list; value_special_characters_allow_list.insert( - value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end()); + value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end() + ); + + if (arguments.size() == 5u) + { + return ParsedArguments { + data_column, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list + }; + } + + // extractKeyValuePairs - extractKeyValuePairsWithEscaping + + auto with_escaping_character = extractControlCharacter(arguments[5].column); + + bool with_escaping = with_escaping_character && with_escaping_character == '1'; return ParsedArguments{ - data_column, escape_character, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list + data_column, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list, with_escaping }; } diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 60091661502..e427bdb4524 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -16,15 +16,16 @@ class ExtractKeyValuePairs : public IFunction public: using CharArgument = std::optional; using SetArgument = std::unordered_set; + using BoolArgument = std::optional; struct ParsedArguments { ColumnPtr data_column; - CharArgument escape_character; - CharArgument key_value_pair_delimiter; - CharArgument item_delimiter; - CharArgument enclosing_character; - SetArgument value_special_characters_allow_list; + CharArgument key_value_pair_delimiter = {}; + CharArgument item_delimiter = {}; + CharArgument enclosing_character = {}; + SetArgument value_special_characters_allow_list = {}; + BoolArgument with_escaping = {}; }; ExtractKeyValuePairs(); diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index f4804193d58..1a4923b6af6 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -2,7 +2,8 @@ include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/util) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers} impl/CHKeyValuePairExtractor.h impl/state/InlineEscapingKeyStateHandler.h impl/state/InlineEscapingValueStateHandler.h KeyValuePairExtractorBuilder.cpp KeyValuePairExtractorBuilder.h impl/state/NoEscapingKeyStateHandler.h impl/state/NoEscapingValueStateHandler.h impl/state/InlineEscapingKeyStateHandler.cpp impl/state/InlineEscapingValueStateHandler.cpp impl/state/NoEscapingKeyStateHandler.cpp impl/state/NoEscapingValueStateHandler.cpp) +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 76942f2f183..f1c4ce408fd 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -4,6 +4,9 @@ #include "impl/state/InlineEscapingValueStateHandler.h" #include "impl/state/NoEscapingKeyStateHandler.h" #include "impl/state/NoEscapingValueStateHandler.h" +#include "impl/state/MixedKeyStateHandler.h" +#include "impl/state/MultiStrategyKeyStateHandler.h" +#include namespace DB { @@ -14,12 +17,6 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDel return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEscapeCharacter(char escape_character_) -{ - escape_character = escape_character_; - return *this; -} - KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(char item_delimiter_) { item_delimiter = item_delimiter_; @@ -38,9 +35,15 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withValueSpecialCha return *this; } +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEscaping() +{ + with_escaping = true; + return *this; +} + std::shared_ptr KeyValuePairExtractorBuilder::build() { - if (escape_character) + if (with_escaping) { return buildWithEscaping(); } @@ -66,20 +69,23 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { +// CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler( +// key_value_pair_delimiter.value_or(':'), +// enclosing_character +// ); + CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler( key_value_pair_delimiter.value_or(':'), - escape_character.value_or('\\'), enclosing_character ); CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler( - escape_character.value_or('"'), item_delimiter.value_or(','), enclosing_character, value_special_character_allowlist ); - return std::make_shared>(key_state_handler, value_state_handler); + return std::make_shared>(key_state_handler, value_state_handler); } } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index acc8431f7a3..57dfec92066 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -14,19 +14,19 @@ public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); - KeyValuePairExtractorBuilder & withEscapeCharacter(char escape_character_); - KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_); KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_); KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowlist(std::unordered_set special_character_allow_list); + KeyValuePairExtractorBuilder & withEscaping(); + std::shared_ptr build(); private: + bool with_escaping = false; std::optional key_value_pair_delimiter; - std::optional escape_character; std::optional item_delimiter; std::optional enclosing_character; std::unordered_set value_special_character_allowlist; diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp index 167e5c4c28d..319d2652b45 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp @@ -1,30 +1,45 @@ #include "InlineEscapingKeyStateHandler.h" +#include "util/EscapedCharacterReader.h" +#include "util/CharacterFinder.h" +#include namespace DB { -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), escape_character(escape_character_), key_value_delimiter(key_value_delimiter_) +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const { + // maybe wait should be - find first non control character + + static constexpr auto is_special = [](char character) { + return character == '\\' || character == '='; + }; + + std::vector special_characters; + special_characters.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + +// CharacterFinder finder; +// +// while (auto character_position_opt = finder.find_first_not(file, pos, special_characters)) +// { +// +// } + while (pos < file.size()) { const auto current_character = file[pos]; - if (current_character == escape_character) + if (current_character == enclosing_character) + { + return {pos, State::READING_ENCLOSED_KEY}; + } + else if (!is_special(current_character)) { return {pos, State::READING_KEY}; } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } pos++; } @@ -32,41 +47,71 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) return {pos, State::END}; } +/* + * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. + * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. + * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm + * */ + NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const { - bool escape = false; + CharacterFinder finder; key.clear(); - while (pos < file.size()) + while (auto character_position_opt = finder.find_first(file, pos, {'\\', '"', '='})) { - const auto current_character = file[pos++]; + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; - if (escape) + if (EscapedCharacterReader::isEscapeCharacter(character)) { - key.push_back(current_character); - escape = false; - continue; + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); + // fix later, -1 looks uglyyyyy + next_pos += (next_byte_ptr - file.begin() - 1u); + + if (escaped_characters.empty()) + { + // I have to consider a case like the following: "name:arthur\". + // will it be discarded or not? + // current implementation will discard it. + return {next_pos, State::WAITING_KEY}; + } + else + { + for (auto escaped_character : escaped_characters) + { + key.push_back(escaped_character); + } + } } - else if (escape_character == current_character) + else if (character == key_value_delimiter) { - escape = true; - continue; + // todo try to optimize with resize and memcpy + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + return {next_pos, State::WAITING_VALUE}; } - else if (current_character == key_value_delimiter) + // pair delimiter + else if (character == ',') { - return {pos, State::WAITING_VALUE}; - } - else if (!isValidCharacter(current_character)) - { - return {pos, State::WAITING_KEY}; - } - else - { - key.push_back(current_character); + return {next_pos, State::WAITING_KEY}; } + + pos = next_pos; } + // might be problematic in case string reaches the end and I haven't copied anything over to key + return {pos, State::END}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h index a33a457babf..b54b76658d1 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h @@ -12,7 +12,7 @@ class InlineEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string; - InlineEscapingKeyStateHandler(char key_value_delimiter_, char escape_character_, std::optional enclosing_character_); + InlineEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -23,7 +23,6 @@ public: [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: - const char escape_character; const char key_value_delimiter; static bool isValidCharacter(char character); diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp index 21cc3278dd5..c97e3a66b9a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp @@ -1,14 +1,14 @@ #include "InlineEscapingValueStateHandler.h" +#include "util/EscapedCharacterReader.h" namespace DB { InlineEscapingValueStateHandler::InlineEscapingValueStateHandler( - char escape_character_, char item_delimiter_, std::optional enclosing_character_, std::unordered_set special_character_allowlist_) - : StateHandler(enclosing_character_), escape_character(escape_character_) + : StateHandler(enclosing_character_) , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) { } @@ -48,27 +48,38 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po while (pos < file.size()) { - const auto current_character = file[pos++]; + const auto current_character = file[pos]; + const auto next_pos = pos + 1u; if (escape) { escape = false; - value.push_back(current_character); - continue; + +// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +// { +// value.push_back(*escaped_character); +// } +// else + { + // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) + // or if there isn't enough characters left in the string + return {next_pos, State::WAITING_KEY }; + } } - else if (escape_character == current_character) + else if (EscapedCharacterReader::isEscapeCharacter(current_character)) { escape = true; - continue; } - if (current_character == item_delimiter || !isValidCharacter(current_character)) + else if (current_character == item_delimiter || !isValidCharacter(current_character)) { - return {pos, State::FLUSH_PAIR}; + return {next_pos, State::FLUSH_PAIR}; } else { value.push_back(current_character); } + + pos = next_pos; } return {pos, State::FLUSH_PAIR}; diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h index 274545caceb..855e2d774a1 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h @@ -14,7 +14,6 @@ public: using ElementType = std::string; InlineEscapingValueStateHandler( - char escape_character_, char item_delimiter_, std::optional enclosing_character_, std::unordered_set special_character_allowlist_); @@ -28,7 +27,6 @@ public: [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: - const char escape_character; const char item_delimiter; std::unordered_set special_character_allowlist; diff --git a/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h new file mode 100644 index 00000000000..104264e8951 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h @@ -0,0 +1,211 @@ +#pragma once + +#include "StateHandler.h" + +#include + +#include "util/EscapedCharacterReader.h" + +namespace DB +{ + +enum class EscapingStrategy +{ + WITH_ESCAPING, + WITHOUT_ESCAPING +}; + +// " {<>}" + +template +class MixedKeyStateHandler : public StateHandler +{ +public: + using ElementType = typename std::conditional::type; + MixedKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (isValidCharacter(current_character)) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + + pos++; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const + { + bool escape = false; + + auto start_index = pos; + + key = {}; + + while (pos < file.size()) + { + const auto current_character = file[pos]; + const auto next_pos = pos + 1u; + + if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) + { + if (escape) + { + escape = false; + +// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +// { +// collect(key, *escaped_character); +// pos = next_pos; +// continue; +// } +// else + { + // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) + // or if there isn't enough characters left in the string + return {next_pos, State::WAITING_KEY }; + } + } + else if (EscapedCharacterReader::isEscapeCharacter(current_character)) + { + escape = true; + pos = next_pos; + continue; + } + } + + if (current_character == key_value_delimiter) + { + finalizeElement(key, file, start_index, pos - 1); + return {next_pos, State::WAITING_VALUE}; + } + else if (!isValidCharacter(current_character)) + { + return {next_pos, State::WAITING_KEY}; + } + else + { + collect(key, current_character); + } + + pos = next_pos; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const + { + key = {}; + + bool escape = false; + + auto start_index = pos; + + while (pos < file.size()) + { + const auto current_character = file[pos]; + const auto next_pos = pos + 1u; + + if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) + { + if (escape) + { + escape = false; + +// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +// { +// collect(key, *escaped_character); +// pos = next_pos; +// continue; +// } +// else + { + // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) + // or if there isn't enough characters left in the string + return {next_pos, State::WAITING_KEY }; + } + } + else if (EscapedCharacterReader::isEscapeCharacter(current_character)) + { + escape = true; + pos = next_pos; + continue; + } + } + + if (*enclosing_character == current_character) + { + auto is_key_empty = start_index == pos; + + if (is_key_empty) + { + return {next_pos, State::WAITING_KEY}; + } + + finalizeElement(key, file, start_index, pos - 1); + + return {next_pos, State::READING_KV_DELIMITER}; + } + else + { + collect(key, current_character); + } + + pos = next_pos; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const + { + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } + } + +private: + const char key_value_delimiter; + + void collect(ElementType & element, char character) const + { + if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WITH_ESCAPING) + { + element.push_back(character); + } + } + + void finalizeElement(ElementType & element, std::string_view file, std::size_t start_index, std::size_t end_index) const + { + if constexpr (ESCAPING_STRATEGY != EscapingStrategy::WITH_ESCAPING) + { + element = createElement(file, start_index, end_index); + } + } + + static bool isValidCharacter(char character) + { + return std::isalnum(character) || character == '_'; + } +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h new file mode 100644 index 00000000000..56dc00a9c93 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h @@ -0,0 +1,132 @@ +#pragma once + +#include "StateHandler.h" +#include + +namespace DB +{ + +enum class EscapingStrategy2 +{ + WITH_ESCAPING, + WITHOUT_ESCAPING +}; + +template +class MultiStrategyKeyStateHandler : public StateHandler +{ +public: + MultiStrategyKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const + { + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (isValidCharacter(current_character)) + { + return {pos, State::READING_KEY}; + } + else if (enclosing_character && current_character == enclosing_character) + { + return {pos + 1u, State::READING_ENCLOSED_KEY}; + } + + pos++; + } + + return {pos, State::END}; + } + + [[nodiscard]] NextState read(std::string_view file, std::size_t pos, auto key) const + { + return static_cast(this)->read(file, pos, key); + } + + [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, auto & key) const + { + return static_cast(this)->readEnclosed(file, pos, key); + } + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const + { + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + } + } + +protected: + const char key_value_delimiter; + + static bool isValidCharacter(char character) + { + return std::isalnum(character) || character == '_'; + } +}; + +class EscapingStrategyStateHandler : public MultiStrategyKeyStateHandler +{ + using ElementType = std::string; +public: + EscapingStrategyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) + : MultiStrategyKeyStateHandler(key_value_delimiter_, enclosing_character_) {} + + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const + { + bool escape = false; + + key.clear(); + + while (pos < file.size()) + { + const auto current_character = file[pos]; + const auto next_pos = pos + 1u; + + if (escape) + { + escape = false; + +// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +// { +// key.push_back(*escaped_character); +// } +// else + { + // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) + // or if there isn't enough characters left in the string + return {next_pos, State::WAITING_KEY }; + } + } + else if (EscapedCharacterReader::isEscapeCharacter(current_character)) + { + escape = true; + } + else if (current_character == key_value_delimiter) + { + return {next_pos, State::WAITING_VALUE}; + } + else if (!isValidCharacter(current_character)) + { + return {next_pos, State::WAITING_KEY}; + } + else + { + key.push_back(current_character); + } + + pos = next_pos; + } + + return {pos, State::END}; + } +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp new file mode 100644 index 00000000000..1206addea5e --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp @@ -0,0 +1,113 @@ +#include "CharacterFinder.h" +#include + + +namespace DB +{ + +template +constexpr uint16_t maybe_negate(uint16_t x) +{ + if constexpr (positive) + return x; + else + return ~x; +} + +template +inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * needle, size_t num_chars) +{ + const char * pos = begin; + +#if defined(__SSE4_2__) + constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; + + if (num_chars >= 16) + throw std::runtime_error("Needle is too big"); + + char c[16] = {'\0'}; + memcpy(c, needle, num_chars); + + const __m128i set = _mm_loadu_si128(reinterpret_cast(c)); + + for (; pos + 15 < end; pos += 16) + { + __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); + + if constexpr (positive) + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode); + } + else + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY); + } + } +#endif + + for (; pos < end; ++pos) + if ( (num_chars >= 1 && maybe_negate(*pos == c[0])) + || (num_chars >= 2 && maybe_negate(*pos == c[1])) + || (num_chars >= 3 && maybe_negate(*pos == c[2])) + || (num_chars >= 4 && maybe_negate(*pos == c[3])) + || (num_chars >= 5 && maybe_negate(*pos == c[4])) + || (num_chars >= 6 && maybe_negate(*pos == c[5])) + || (num_chars >= 7 && maybe_negate(*pos == c[6])) + || (num_chars >= 8 && maybe_negate(*pos == c[7])) + || (num_chars >= 9 && maybe_negate(*pos == c[8])) + || (num_chars >= 10 && maybe_negate(*pos == c[9])) + || (num_chars >= 11 && maybe_negate(*pos == c[10])) + || (num_chars >= 12 && maybe_negate(*pos == c[11])) + || (num_chars >= 13 && maybe_negate(*pos == c[12])) + || (num_chars >= 14 && maybe_negate(*pos == c[13])) + || (num_chars >= 15 && maybe_negate(*pos == c[14])) + || (num_chars >= 16 && maybe_negate(*pos == c[15]))) + return pos; + + return nullptr; +} + +template +auto find_first_symbols_sse42(std::string_view haystack, std::string_view needle) +{ + return find_first_symbols_sse42(haystack.begin(), haystack.end(), needle.begin(), needle.size()); +} + +std::optional CharacterFinder::find_first(std::string_view haystack, const std::vector & needles) const +{ + if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + { + return ptr - haystack.begin(); + } + + return std::nullopt; +} + +std::optional CharacterFinder::find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const +{ + if (auto position = find_first({haystack.begin() + offset, haystack.end()}, needles)) + { + return offset + *position; + } + + return std::nullopt; +} + +std::optional CharacterFinder::find_first_not(std::string_view haystack, const std::vector & needles) const +{ + if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + { + return ptr - haystack.begin(); + } + + return std::nullopt; +} + +std::optional CharacterFinder::find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const +{ + return find_first_not({haystack.begin() + offset, haystack.end()}, needles); +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h new file mode 100644 index 00000000000..ebc6d03610d --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace DB +{ + +class CharacterFinder +{ +public: + using Position = std::size_t; + + std::optional find_first(std::string_view haystack, const std::vector & needles) const; + + std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + + std::optional find_first_not(std::string_view haystack, const std::vector & needles) const; + + std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + +}; + +} + diff --git a/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp new file mode 100644 index 00000000000..2071c64628e --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp @@ -0,0 +1,117 @@ +#include "EscapedCharacterReader.h" + +#include + +namespace DB +{ + +static std::optional consumeCharacter(std::string_view & view) +{ + if (view.empty()) + return std::nullopt; + + char character = view[0]; + + view = {view.begin() + 1u, view.end()}; + + return character; +} + +static std::optional toInt(std::string_view & s, int base) +{ + std::size_t value; + + auto conversion_result = std::from_chars(s.begin(), s.end(), value, base); + + s = {conversion_result.ptr, s.end()}; + + if (conversion_result.ec == std::errc{}) + { + return static_cast(value); + } + + return std::nullopt; +} + +const std::unordered_map> EscapedCharacterReader::numeric_escape_sequences_number_of_characters = + {{'x', std::make_pair(2, 16)}, {'0', std::make_pair(3, 8)}}; + +const std::unordered_map EscapedCharacterReader::escape_sequences = { + {'\\', '\\'}, {'a', 0x7}, {'b', 0x8}, {'c', 0}, {'e', 0x1B}, + {'f', 0xC}, {'n', 0xA}, {'r', 0xD}, {'t', 0x9}, {'v', 0xB}, +}; + +bool EscapedCharacterReader::isEscapeCharacter(char character) +{ + return character == ESCAPE_CHARACTER; +} + +EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view element, std::size_t offset) +{ + return read({element.begin() + offset, element.end()}); +} + +EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view str) +{ + if (auto maybe_escape_character = consumeCharacter(str); isEscapeCharacter(*maybe_escape_character)) + { + if (auto character = consumeCharacter(str)) + { + if (isEscapeSequence(*character)) + { + if (auto read_sequence = readEscapedSequence(str, *character)) + { + return { + str.begin(), + {*read_sequence} + }; + } + + return { + str.begin(), + {} + }; + } + else + { + return { + str.begin(), + {'\\', static_cast(*character)} + }; + } + } + + } + + return { + str.begin(), + {} + }; +} + +bool EscapedCharacterReader::isEscapeSequence(char character) +{ + return escape_sequences.contains(character) || numeric_escape_sequences_number_of_characters.contains(character); +} + +std::optional EscapedCharacterReader::readEscapedSequence(std::string_view & str, char sequence_identifier) +{ + if (numeric_escape_sequences_number_of_characters.contains(sequence_identifier)) + { + auto [max_number_of_bytes_to_read, base] = numeric_escape_sequences_number_of_characters.at(sequence_identifier); + + auto number_of_bytes_to_read = std::min(max_number_of_bytes_to_read, str.size()); + + auto cut = std::string_view {str.begin(), str.begin() + number_of_bytes_to_read}; + + auto read_character = toInt(cut, base); + + str = {cut.begin(), str.end()}; + + return read_character; + } + + return escape_sequences.at(sequence_identifier); +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h b/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h new file mode 100644 index 00000000000..29a07fad83a --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +namespace DB +{ + +/* + * Takes in an escape sequence like: \n \t \xHH \0NNN and return its parsed character + * Example: + * Input: "\n", Output: {0xA} + * Input: "\xFF", Output: {0xFF} + * Input: "\0377", Output: {0xFF} + * It can also take non-standard escape sequences, in which case it'll simply return the input. + * Examples: + * Input: "\h", Output {'\', 'h'} + * */ +class EscapedCharacterReader +{ + static const std::unordered_map> numeric_escape_sequences_number_of_characters; + static const std::unordered_map escape_sequences; + +public: + static constexpr char ESCAPE_CHARACTER = '\\'; + struct ReadResult + { + const char * ptr; + std::vector characters; + }; + + static bool isEscapeCharacter(char character); + static ReadResult read(std::string_view element); + static ReadResult read(std::string_view element, std::size_t offset); + +private: + static bool isEscapeSequence(char character); + + static std::optional readEscapedSequence(std::string_view & file, char sequence_identifier); +}; + +} diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp new file mode 100644 index 00000000000..ead08c3b5ed --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp @@ -0,0 +1,101 @@ +#include +#include +#include "base/find_symbols.h" + + +namespace DB +{ +void test_find_first( + const CharacterFinder& finder, const std::string_view& haystack, + const std::vector& needles, const std::optional>& expected_result) +{ + auto pos = finder.find_first(haystack, needles); + + ASSERT_EQ(pos.has_value(), expected_result.has_value()); + + if (expected_result) + { + auto [expected_character, expected_position] = *expected_result; + + ASSERT_EQ(expected_position, *pos); + ASSERT_EQ(expected_character, haystack[*pos]); + } +} + +void test_find_first_not(const CharacterFinder& finder, const std::string_view& haystack, const std::vector& needles, const std::optional>& expected_result) +{ + auto pos = finder.find_first_not(haystack, needles); + + ASSERT_EQ(pos.has_value(), expected_result.has_value()); + + if (expected_result) + { + auto [expected_character, expected_position] = *expected_result; + + ASSERT_EQ(expected_position, *pos); + ASSERT_EQ(expected_character, haystack[*pos]); + } +} + +TEST(CharacterFinderTest, FindFirst) +{ + CharacterFinder finder; + + // Test empty haystack + std::string_view empty; + std::vector needles = {'a', 'b', 'c'}; + test_find_first(finder, empty, needles, std::nullopt); + + // Test haystack with no needles + std::string_view no_needles = "hello world"; + std::vector empty_needles = {}; + test_find_first(finder, no_needles, empty_needles, std::nullopt); + + // Test haystack with a single needle + std::string_view single_needle = "hello world"; + std::vector single_needles = {'o'}; + test_find_first(finder, single_needle, single_needles, std::make_optional>('o', 4)); + + // Test haystack with multiple needles + std::string_view multiple_needles = "hello world"; + std::vector all_needles = {'a', 'e', 'i', 'o', 'u'}; + test_find_first(finder, multiple_needles, all_needles, std::make_optional>('e', 1)); + + // Test haystack with special characters + std::string_view special_needle = R"(this=that\other"thing")"; + std::vector special_needles = {'=', '\\', '"'}; + test_find_first(finder, special_needle, special_needles, std::make_optional>('=', 4)); +} + +TEST(CharacterFinderTest, FindFirstNot) +{ +// CharacterFinder finder; + +// Test empty haystack +// std::string_view empty; +// std::vector needles = {'a', 'b', 'c'}; +// test_find_first_not(finder, empty, needles, std::nullopt); +// +// // Test haystack with no needles +// std::string_view no_needles = "hello world"; +// std::vector empty_needles = {}; +// test_find_first_not(finder, no_needles, empty_needles, std::make_optional>('h', 0)); +// +// // Test haystack with a single needle +// std::string_view single_needle = "hello world"; +// std::vector single_needles = {'o'}; +// test_find_first_not(finder, single_needle, single_needles, std::make_optional>('h', 0)); + +// Test haystack with multiple needles +// std::string_view multiple_needles = "hello world"; +// std::vector all_needles = {'h', 'e', 'l', 'o', 'w', 'r', 'd'}; +// test_find_first_not(finder, multiple_needles, all_needles, std::nullopt); + + // 17 byte long string, only loop takes place + std::string_view multiple_needles_haystack = "helloworldddddd"; + const auto * res = find_first_not_symbols<'h', 'e', 'l', 'o', 'w', 'r', 'd'>(multiple_needles_haystack.begin(), multiple_needles_haystack.end()); + + ASSERT_EQ(res, multiple_needles_haystack.end()); +} + +} diff --git a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp new file mode 100644 index 00000000000..bed4cfd8918 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp @@ -0,0 +1,71 @@ +#include +#include + +namespace DB +{ + +void test(std::string_view input, const std::vector & expected_characters, std::size_t expected_bytes_read) +{ + auto read_result = EscapedCharacterReader::read(input); + + ASSERT_EQ(expected_characters, read_result.characters); + + auto bytes_read = read_result.ptr - input.begin(); + + ASSERT_EQ(bytes_read, expected_bytes_read); +} + +void test(std::string_view input, const std::vector & expected_characters) +{ + return test(input, expected_characters, input.size()); +} + +TEST(EscapedCharacterReader, HexDigits) +{ + test("\\xA", {0xA}); + test("\\xAA", {0xAA}); + test("\\xff", {0xFF}); + test("\\x0", {0x0}); + test("\\x00", {0x0}); + + test("\\xA$", {0xA}, 3); + test("\\xAA$", {0xAA}, 4); + test("\\xff$", {0xFF}, 4); + test("\\x0$", {0x0}, 3); + test("\\x00$", {0x0}, 4); + + test("\\x", {}); +} + +TEST(EscapedCharacterReader, OctalDigits) +{ + test("\\0377", {0xFF}); + test("\\0137", {0x5F}); + test("\\013", {0xB}); + test("\\0000", {0x0}); + test("\\000", {0x0}); + test("\\00", {0x0}); + + test("\\0377$", {0xFF}, 5); + test("\\0137$", {0x5F}, 5); + test("\\013$", {0xB}, 4); + test("\\0000$", {0x0}, 5); + test("\\000$", {0x0}, 4); + test("\\00$", {0x0}, 3); +} + +TEST(EscapedCharacterReader, RegularEscapeSequences) +{ + test("\\n", {0xA}, 2); + test("\\r", {0xD}, 2); + test("\\r", {0xD}, 2); +} + +TEST(EscapedCharacterReader, RandomEscapedCharacters) +{ + test("\\h", {'\\', 'h'}); + test("\\g", {'\\', 'g'}); + test("\\", {}); +} + +} diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp new file mode 100644 index 00000000000..a48782fa55a --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -0,0 +1,16 @@ +#include +#include + +namespace DB +{ + +TEST(InlineEscapingKeyStateHandler, Wait) +{ +// InlineEscapingKeyStateHandler handler(':', '"'); +// +// std::size_t pos = 0u; +// auto next_state = handler.wait(""); + +} + +} diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp new file mode 100644 index 00000000000..27fcf344818 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -0,0 +1,165 @@ +//#include +//#include +// +//namespace DB +//{ +// +//struct LazyKeyValuePairExtractorTestCase +//{ +// std::string input; +// std::unordered_map expected_output; +// std::shared_ptr extractor; +//}; +// +//std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) +//{ +// return ostr << test_case.input; +//} +// +//struct KeyValuePairExtractorTest : public ::testing::TestWithParam +//{ +//}; +// +//TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) +//{ +// const auto & [input, expected_output, extractor] = GetParam(); +// +// auto result = extractor->extract(input); +// +// EXPECT_EQ(result, expected_output); +//} +// +//INSTANTIATE_TEST_SUITE_P( +// ValuesCanBeEmptyString, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// "age:", +// { +// { +// "age", +// "" +// } +// }, KeyValuePairExtractorBuilder().withEscapingProcessor().build() +// }, +// { +// "name: neymar, favorite_movie:,favorite_song:", +// { +// {"name", "neymar"}, +// {"favorite_movie", ""}, +// {"favorite_song", ""}, +// }, +// KeyValuePairExtractorBuilder().withEscapingProcessor().build() +// } +// })); +// +//INSTANTIATE_TEST_SUITE_P( +// MixString, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", +// { +// { +// R"(no:me)", "neymar" +// }, +// { +// "age", "30" +// }, +// { +// "height", "1.75" +// }, +// { +// "school", "lupe picasso" +// }, +// { +// "team", "psg" +// } +// }, +// KeyValuePairExtractorBuilder() +// .withValueSpecialCharacterAllowlist({'.'}) +// .build() +// }, +// { +// "XNFHGSSF_RHRUZHVBS_KWBT: F,", +// { +// { +// "XNFHGSSF_RHRUZHVBS_KWBT", +// "F" +// } +// }, +// KeyValuePairExtractorBuilder().build() +// }, +// })); +// +//INSTANTIATE_TEST_SUITE_P( +// Escaping, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// "na,me,: neymar, age:30", +// { +// { +// "age", "30" +// } +// }, +// KeyValuePairExtractorBuilder().build() +// }, +// { +// "na$me,: neymar, age:30", +// { +// { +// "age", "30" +// } +// }, +// KeyValuePairExtractorBuilder().build() +// }, +// { +// R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", +// { +// { +// "name", "neymar" +// }, +// { +// "favorite_quote", R"(Premature optimization is the r$$t of all evil)" +// }, +// { +// "age", "30" +// } +// }, +// KeyValuePairExtractorBuilder() +// .withEnclosingCharacter('"') +// .build() +// }})); +// +//INSTANTIATE_TEST_SUITE_P( +// EnclosedElements, +// KeyValuePairExtractorTest, +// ::testing::ValuesIn(std::initializer_list{ +// { +// R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", +// { +// { +// "name", "Neymar" +// }, +// { +// "age", "30" +// }, +// { +// "team", "psg" +// }, +// { +// "favorite_movie", "" +// }, +// { +// "height", "1.75" +// } +// }, +// KeyValuePairExtractorBuilder() +// .withValueSpecialCharacterAllowlist({'.'}) +// .withEnclosingCharacter('"') +// .build() +// } +// })); +// +//} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference new file mode 100644 index 00000000000..45caef3b8d5 --- /dev/null +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference @@ -0,0 +1,2 @@ +406b888d56db414d25b854d3673d345f - +1 diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh new file mode 100755 index 00000000000..24182e3d297 --- /dev/null +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Tags: no-ubsan, no-fasttest + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE=$CUR_DIR/data_extract_key_value_pairs/big_input_file.txt +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" +cat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(line, '\\\', ':', ',', '\"') FROM input('line String') FORMAT LineAsString" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum +${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" +${CLICKHOUSE_CLIENT} --query="drop table json_map" diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 51348f1837d..d63a6f14ce8 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -3,7 +3,7 @@ -- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} WITH - extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '!', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -17,7 +17,7 @@ SELECT -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na,me,: neymar, age:30', '!', ':', ',', '"') AS s_map, + extractKeyValuePairs('na,me,: neymar, age:30', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -29,7 +29,7 @@ SELECT -- Expected output: {'age':'30'} WITH - extractKeyValuePairs('na$me,: neymar, age:30', '!', ':', ',', '"') AS s_map, + extractKeyValuePairs('na$me,: neymar, age:30', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -41,7 +41,7 @@ SELECT -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', '!', ':', ',', '"') AS s_map, + extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -53,7 +53,7 @@ SELECT -- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the root of all evi','age':'30'} WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', '!', ':', ',', '"') AS s_map, + extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -65,7 +65,7 @@ SELECT ----- Mix Strings ----- WITH - extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', '!', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', ':', ',', '"', '.') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -77,7 +77,7 @@ SELECT -- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} WITH - extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '!', ':', ',', '"') AS s_map, + extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', ':', ',', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -91,7 +91,7 @@ SELECT -- Expected output: {'some_key':'@dolla%sign$'} WITH - extractKeyValuePairs('some_key: @dolla%sign$,', '!', ':', ',', '"', '$@%') AS s_map, + extractKeyValuePairs('some_key: @dolla%sign$,', ':', ',', '"', '$@%') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) diff --git a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt new file mode 100644 index 00000000000..1065f9fa977 --- /dev/null +++ b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt @@ -0,0 +1 @@ +&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=(&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=( bBO: aSqXrONruaRWxTtqomuGZSfg3GExhjljYJOSqwrviXlCunl0eJ, ZOxSPRPqbJFgYKchBrCb7EG8owcyx: "HPVPgTCIeQW8mvdGAuj0WRbaMeWIuwgaVC1CR4cav2G2m",L1U:"LqDf2bi3dhNZlDKhG7BZI8a5O","RbaIzZDjX7bjQ":DAMd9EgQxgCzPNqnMtRFw0qBXAItgfXKOu,aA2hf8CpJOVXH2dwZMpRqPoLRv7:CoQK1YLfO8xgivMNfFXtnW1nek94RomFqOa2P921zpgG8W,KYlfx3QgJJL6KgVMrPyRoc25NC7oGVCIqfDDW92wL3j8OCR6AzrCJ6mXIpWVtxr:"lyz6i7",#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`i4WPWgYumlO99w0PFtS2oc:e1Vx05nWNkROKnu1K3TJ7Mnhg3g, a1jDET8WGoTCJrrUzJQtm: Z6EHpHbFclD7O4L0qwWkk26OM5EW62YyHtH4FYQjouiR8yFI,*=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''**=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''*WN5cCJ4AZzoM3ozjvaa9MZCRisMOGPNO8nQCbWMgt91AlXQ5q8:"iLHt7IkOJxznwnuYTybux6M8e3K3ksaiQggiSIbLigIqfDqQvV",~@*,<*~))/#*]#;~&#>?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_),#{=}]%-_*;%^%$(|)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_) "ryR3w5iBOV74GrW0YlrVBYV7r5NquYail31QuNswwd2SJqfDWdN": jqdr1xR1uO4TFd0O6nNU2pCZ4lnyIR33tRN6mjw6Xv83hXJCMHyH,vehQ3jObweRmCSpZHMs:"kYSmBIMHnQU4BL50ZJoxmWsmwHQwV8OA8OkfWxTDDDMdQ60G0wMX2snnZTf4Vbyhf",RSGWMlLyvHKRSPb1Op:IfLe9moJGTTMi2EBzqT1ZEICgy6,}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{ mnJCmbjybQDn0m3pfc2Gexx8T1rQPT3vs9En2AKakW1QXrPUvvOrhQkWRA5pAw2: "DOwmPqqCf7DJ0Njn8Dxq2630TLLZGtfHhObX99th3cQcHdhnOBNpA292",fjtH3kYdnUYOaiV25TY37hk7qdMEigwceothWCHeHcNT:SdCQivn0occBQA1iZV8ewM,"BvMcVGGDlELqvvSDFUx1A5":Ny2nE2IFhjs2dLJIztfvvVf57j,ubawZkukoLWXLaU8Wis7u65DoFwq9TIqiVAPfBpiLLx69KiPqALrkXnX1t5:jt0UXegwbORBeNq7J6QpkWuVcmtdhXnxqfzZuKs8WpNSwu2PHCi6XzAiIEh6f,JadA5leQPXBB2pegQ55N9Wc:"P6opRuWHkoDYkXcOpo9Qqj7wawR8y","C7iHuHVBo9oyIUAP6ai":lgogbZYftOHe, SAeRhIi0bh6kQNAQXI4fTl26dgL9y0Zt8xl1JzD1MLDvQZFnDkU8aYS3pYo: jEGjxlxITixh2S1oF9T69XDbNTv3X5qpVQCTyf2JHVUDvZpE1yIalPpNDqjAculni,[={~)~&=@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$#)>@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$"Cbp":yF97mPEuISAWDbLGHRXkvyFswJQGub3rapYw8pIUj8Iy6BNT4qrUkPfzJu1viapAE,E3Or9HRv0l9JOirYKHn2YrqYSXT4A3qcxjdLOf0dqHnW7DoYMP6lbLgh9gMYbqj8:eSxKuE,xiprDJWAqQO3G2fEO6o:"tXlCTXuzFpN3rZVI52v6SE3cX1aJjB94oRquKXQbeZeEFd47wUIs",'$),#+_}#|[('$),#+_}#|[( MoTsMBYEpmXZOxdtK3Fmg2z7ejO2qraizx0NxWkiQLJZAof1rtPlWnVEOix8EsHH7: "mVeP52LGDDw2gVkEnlUDRGkT5oV6KSRGmZksJgUA8Mz6K29VJGg5w2j3l1xaEbqHE",*%!%#*%!%#"z60XAmGkusr1":y65ZJ6pYon02IZCu8e1K7vecSZ8Mb4Pjg4,Mmgsr5m3kVqSMbzKN5Qyk70zOtpDfMBe9Ws8WsBNIq6EBDhDN1rw:"RmAwQoJOkRD7NVE2iVgIdHf49R9Q4XkHR1wVmE9",~!()}<)`),^}[='#;[/[+<[*;&]'~~!()}<)`),^}[='#;[/[+<[*;&]'~ "MLwb2KHrs20fA1XIi5TC9DjTcEHKwvqCv5VdQXegLH": Id4rIadhfv6K1TvOQVOgkm6kDx5ViDYCQl7OGBuYB,/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-s4OtFrTpOyWClLejg1XTXK1:bwLKbnPyimEUvfgO6aFF0BLS2EP63vYa9osHdh0ws9tjMTWZapi,"SpuLcRscA118OPr63OdWuqyr4Wbn":JWJKB,I2JSuUZ7VmT1BHHKvbKLv2QuO2ZGnDcum6Qq59PQuEsmXV:QPqrIhoSp6UnWh1X5dFXgcmDt5F238elzanh8leYCYdjwLLrDPc2PqvgreFrl,{.&>#'*>/+=/=)'{.&>#'*>/+=/=)'o61TsOyn9pbKYAmxDiByA82W6DqoDyr7aTLx:z0O63wL3XOX473pCVVXO0x9DXEtTeY3s1kqHFNIPJoxU6pKyjMiQ, KPPI9nKaKEXQ2LTP1: "Y6Vb5ppra6", iDFPFyQnGBLlfHBKEfmThZcnE9YQ3yZS50KRQDfeJfHiXQlpcjUhyumjZlhRJ1jxF: Q7UATsYlv6uIBrNpexkRAb80Wrwp1hEalLNXMQTAsBI5mEoN25xzXhuaSph,GhGcWyg0x4am7w1NSss8L:lMpGOPI6JPBjufzywhMmAdlYfE,[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||<[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||< r4C00g0i66rU0CChYYhEF: gNVPYrvjI38nnkrm9j7Ot5T,<=&<=&"kG7l7gv2YEHdMxi7k7n1mxbYrhJtazsROH7lQiqx6kQNl":RRVpAGkFZCtlsRotUVYUyeBev4HTBJkoOuL2EEnU04SIVEKV, ytEWFzMO: tKh3Pvqd4QfWPERZuMFChzeJ8QtN4Hbd8,"r7mevpc2G6C2hU8CIgbWMI5vtwFDfzZqWeam5JUJlcIzelbOjp8So":bMtHEZmsJMhfWyRR54rhbeisUO,ESIdZ6tn3gdYaWl3I22LYDpqFa9L540TsqDaz5DeeL4A4j4UzXOky80Iq:kiaZocwzqNj3uBm5gv1Nbq,&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`bS70WPcW4CS4aBcjH1cddIkvhErXNa3rR51FLwMSR7:GoqCzEC54oAKPycGHG0jtMNsyS0GitppGj2dvG0CfESwneb,VXi31PvZK4mCEeG2zCIAbL:lQZCkyYM,"RwGS7EmU1RNZ8aVcE8NK64pOPrtoXGI5ZB51dj8B0kyeEF6HMN":kOmLidOiGxjrQfgPzmZWr84VbRnvR2Qw4346FzBjHCJVwrSRk,];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[cAju1VPohaxvOZwsuHIK5LCRw0gDk1jKkAgXxF:WdQilqqOBKmg7OuUeTCmbwMbyD01Gpia7V3VcBLWNVRGiNoBStFqx4iyOV48g, f1DuLrKMOqoRaSoupBqLO1vw: nvCngxsEyg0Fp1Sq1DD6QQaJUUosym2AuQp,Xa1TI9s5nrPq3NyuKHhH4motiJbgKUEpiJ5Q701:lYZIT062YGOQx0o1sUamGT1MOsPfKuaqUhOWAhxTffUDoIEB2ifT, RhMnn4jeGyDMTGa6I: XUBiQKgUaSocAmvob6ijrv9G8Hk2xFBGbZBZ4uWIVo7tCJXSRGj5Ptyci,`!$#-+]{^/+'_'!}@]`!$#-+]{^/+'_'!}@] N0QOctoqmPOUMrUp34TLNZORcb1WZyJE4k2Gpr2Z9VuIr9l5ETEmVrdpw2t: fk1jKZN3aoPpmPsvHozyUmDjqb2w, GF903dejR6Dug2eVTbpC9D1f55k1VOCKFidTSo2gbzzzK: AJXUtO5mvkIrA,>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[CJ38S5IpbC8M0llZ6OkNheikOS1mY7swyQJQ2yPyiszBBBOJAvHHd9:"ncnSD4ya82wyraiYjVRolYNONOED6qS2TNiZ54TRL6G8VKHn5q", dcxGPZFIl4F271KVRf5neThzxsxdR51suRWDlyVTNWOIyOWXo1jvvq: slllvACa1THuHmL0j84cnNujILZ6MJyN9orsm0Bu25oRqbh0oiCDnmFB9tSMviw,{+)>/@!<=|-#<]./_)_={,~{+)>/@!<=|-#<]./_)_={,~"gOtsWqFvJXsgyIg6rYA5lIe1NeYEruDgok2":LoIC3bZBuiAbVUaYZLFAvF831aC4hDdrALLI,"PDgLvXZf1gI":DtUk,`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[yqx1xaNDdMAMFbFzCUOBHv9iddHYKdi9vsPe3rD56k4zaV:"FBrOLMTK9B",+|&=+|&=WHqumNUodt2PWokZg4W0J3bCddWMW9szNvmPv0vjmFG:"jLfvCPq4Ad2mlhmlKmKhWEaZjLex5Zv2JysiOmVguqizA4bdPdsNQj","MZeGwvErbIv0EefJYRny6FjzHnQYtLyYFE2UV":nHkUt1NnrnJIdyn9kDlQbVU1S0TuAqkynJZ05cl2MBwlT72SWlvC,!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]*!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]* POgf6C4N8iGu53Bfp2ybSy: CbO1wby0B2OE,{$;!&<~$+_*`__?,{$;!&<~$+_*`__?,hlmwjhU3MYm3TEtogWN5C0lsXDt1CRS7J:BamY4TOvtD9pEcUOWDmMgwh8rpuK1pyn9Knp,LDkAVjzOhpvLSL5TprPQmnV3RqjsRR3WiuZ8M3pvlz:RMZRJwC6ewSIDuMhYB10sPmBZ,"qygEHrLT":"RZVoNb37ybtQFq3pg9r7XsXdEXZyq1Bujzv",cvAVlz1AI6:XBCP24V2mGhYwABWBMBFXyvutwcSr3glBoz9bfvvn,MGCYPNl7vx:"aqMfvMrEOD5gl8GZyjo8","tJlhKsAiFfVYuIYWDx5npwcK":QxAYyV5hJqpqyyOqGRR26V49kMAnPz0d2dlCUgPcCer8Peu0IQNi4tjEVjHiMy, PkbyGlrKckbYXZRSeDxKgLkb8f2WZIiSkZiIBdJxkaa1I0FQbuE9DMyJmtucPSi2: aeGYZgQy4taizTjcNQQX7DvYniNJmENR25,^~',?[&?@=.}.*}*_{[{[@],~(|>)$-^~',?[&?@=.}.*}*_{[{[@],~(|>)$-"PaRfuI":tF5nsaK,h4K0IgZuKPeNJXKjSSxLaT5gzcl4D4L63ykzAiCMTbl1A3:va3yvNVb3hTnL2K1WfmZg23PE9wk, XAPVvi3pqSkvuNVuVzvKtAyDtZAGYdXNvqj5moo2gFf: E8b2WhxqWt0BL6,Og7MjoegoDTF3CFfZJRmz5Idjw1fRB0dxnryV83QRYt:ucPyXaV2i4Rw3C8ZuiEi2y1uzbz4DkFnm9FgMEWhszieDmrG3G90Z, "TLobGGpFhPZs9Bxp1clwYvf6hMGLRGcg6ZRUEDYW8Fnon": P9MALDdHFWC6Kwn3zIq0QIl6W2,"YABWHUu7pDruOT8QGfKcvAeJxu":"BtGE2quqYJ332j", M6XTf1Y3csBFjQ01DZoj4DdKO6J4CDwOp3JSrWIj9kH5: "IHhuXey9Jcy1L3DApgdfAD",`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~ tCRK8InckVNgel0Y: bxeBTnsQSs77t4o7Wn3oAQw5hKNsPCJ4uoa3xaZfwsx6rZdFC5643q4fI9fp83,OoSjaY3qRQ21X0nqVoZ0:D9LeCyYvkWyomIRtwqP6q2J,"eoZm9pmDFxl1mRhI1IEGaxKr0U5ofrF8SBghxu":hexeZbw3eUDVSxMXImZmUa2Yf4khbst106HF4S98ovCZirf6KQT8No,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,CQom5yPn7NLf0HjLPKZLrEodaHNBls1p9oMFT8fyBTVkiCk:QkL5d5Hwh4XLutRRYwfWyHMiju6HNZqM3IBY6, YCvobbCFxaHNzGChAtwJauY5LFeVu7ZLjipOsBtu5s2eJwPnVgTaJcVg: "RM0m0zr1DofaM1bWZ8QbMXtVUCgNwK3",aT43I1TMisvG0d30AAco:TKsWdpMOuFkxYm2oUGcX,jKBXoop41PtFsvRAziD1r56HVlRe:mFveseCTV3nFmArmQpumzHs1abqRtOcNs4u2RJHQAn3ymhYnLzpN,JZyu0rxGXyXRQ4NXLFSXHhlcDqrbPB2sEWKAnGFYnKeW72yiPIbmQvuPIDk:r1wFMWTZx9Exg1zGox53Ps548nFxsbQVFI1l,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,EG9Fh6V9mVDgA:"aVwz8TpztHuBdovFLiT4ilXqf8oW",&[>(~|(~|}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_;!.?-.@^?`{&_(>}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_ fGMEITkyxISayFNbmnz4VtpepDbIf5KvNsQphQThqnsUigpiHMJcBsIubJWMvEC1l: hnIy11kOgF6nsPJG6ZxrFY, "d2Ps9w3hxDwFt75uTzD4": oIUwCE0L4eKP7PC55QqGr0HpVhS,_/(+@{~`+_/(+@{~`+QnyjFPSVp:JBINPLFMJKHxUjos8laMtSAPta,%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)#%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)# EN3QC1dzBFL: EHsqzK0V59m2E1ey62JPioB7Fnf,"DKVD4uTX":i3r4OlbeJJw7zVq2iPE2wZ3YDeOVjBqR1VtnhJ2Ndlvtxy,rLnD87vuBS:W5ZVb,f7NQXp25FZ99FnjkZUtFhMz5hBYaZaPp0:JnU2DylAEelg0oMYg,PGZZJ8s9l2i:Jnj98FtHuyEsKRlMyY2p18ik46jhxKxrjDsvJKZjhdzok6Yz,"JfnVtytg7zPoj3wl":uJI2jc40oAN9mGB, MaOZACdZDlm8g8FcXuNoFJZ72PrnCIq: i4dwQhLdRyjvOPaw6XaMC9P8OQ7X8efmYDL,`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'ycCCmSOhper5Dtcpf:"g7R",)-[#)-[# "whaXKTJB3irCR7A5AjjY": t1LNSPC3HkLYfRQ7fB6KfuTGs, Ej1IGLt5bIa4B1qBdSnFSElfOd505vg1XZOiJb4Q1jTSwWvxr8LQo5hi: "niD4WAs","fImB0opnOlmtDpiultxiPpcu6kBb66mi0Z86WoNwiAebGxegXw74Q52":KgKYwrY4xfdRxDzUZh6gNxMddUFSgrGDByPcsDxm0rwHfBAb6, WaLGYPqrUPV26wfUhaedyhzVDNVsPf0h73bw1xfg1eNh5gm7WlG2WJ4: "jX5iirhJl9NLt7UEhZVeJSZmnCuqATJZhEBrZKi3l9UpneZSxmpbSnbVe",MV8IkfJKSCfS8bIQePELk4ZSm84JUstTHZMbaSS8:"KWE9LbLqjEkcVuhbFl8bgGYJ9aW62pZB6VrHnqxWzxCXgCzuJce9fQbq4eKNT",|[.??&&[@?{]|(|[.??&&[@?{]|( FI7zUtpNVhSs00W33W3gYrvKP7cqvjzkph0VoMPM: "y2cFxeJHNhgJ8drchtPQdp7RSUWXjDLSTWKEN8niDS13HLbZ9DOrK1OV2v",~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?>~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?> QDQRL3uh: "h65NGI7KtKhbP","KVKzKJzWqpjzKQCVJvWUE3hluAdWSInqv4XtfRmPYpQcDBxYYHrYn3s67l0Fv6cY":A9f1Y8rSoo19WPcbc9QvCzUROBrI0lE71RplKQ37egUHxJ7zHyvnCW8buQmHsdrxR,"kQuN":fGtoRsdk2Av3yOVVj0pl2oXnAeRSJ4KkdNOpbWAFCDt6MIQ4yT8b, JbkETNLC8NnsMt0VXPgO5G8WEGQJrKJArr7jKPKafgZZQDehYmHRkdd5HE2LKM: wIMjioW26Yn1z63cmTDfTLGzchu82L,vfvjeHO6S55shneXaRfrKjf8XALmo0:mzr4Cp7,];~];~Bcaq9Ih6rVMfCgsAt1Hii6ytGAO3FZpQwYZGQZ4jMB6xqRrPusj:V6UYWvEkGxdaCXCrc0X0s0c3JIv,MUdww1bv34mNRRudCbf71R5yBKPfT0LxKQamLQ:"lpvduLHFKHu5q0sZF7GTrxaMf",`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$ "lSHI3o5ZMbCoZijz8rg0VfyH0": NovLG0Q2U3kfBstukJSg1lw6KvxozaPxeppRwnlJSRJQi,iD0GDjcksfNL8roxXPF:L1TjSmsTPL9y9d9YRYVb62JHueJRcPX8mJubIj2sULGKhamEhS, gxZclU9i: "iAX",-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?h1mUTSIaN:"qnw5jW1lRFDauB70GNXsJlS4iBB9YU4vqe42DceT9mhgc6",RO3CcI7lS5zYYhdF9N6hoAzrZ51RWqxiimJDD9gMgFO:hkd5yyMKazddle8Y,"z7XbCHGkSYZi":"ovpjkPboxecx4Z",>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;?>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;? "cOxLyzhBrGxxR4DtAQpDdI3x2jf6F1oLjhppkrvDEIGiFkZjqOkTcTYbalkWVU91": "FMcA9DcGbriNeC6wrz9UFNzd1jE8uX3XgquNr2OcLr4Xz6SrJ2", CIQi6yLbj0iGONECVJrNUr38IbsbXnegz1dK1KU23tN: li3MdWFWGTDHo0LIMVP1Q4zU42WGSQs8T,ZQQFCXt53SRgrrMC1tTeLipXRE2Tcwm92qAzltRbZxsZEyruW:afWYwk7S70pBuVK0tKUY1TjHRZAYnRczOl9n3c, utDjvOEushAKWeLHd4NsWUTcNTGUIfB5Dqnjc8TAKVP8YwQbd: HhaJ0NHgc9liS8o0731DzLVu4C6cv,e0Zodb5:h7zmDaBIFYv7FyT53I,SiALgVK:"Kmb0UDBUNBam16xo8eMYiclRa3s0HjVLelj4x43j2tuI4BvPHjnp", "Odb2hfFUGHfHaY": qAHpczn4UcT75fL9xfk06loZnKA0M,*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?pmZt8LKBk8v81n9TvFBiL:d9PgIq16rODC0B56VQUTXiCD06DeIZGHNwPTvOwmRKK3go7FcMFvvDpsg2hpGf,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,Riw5hoXswexvTChavJL0x9EojtlFeOGXSt4H98qOtsbB:cGdFCesO7DoqWQ1H0xQ3ViVEgjbi7HKV4Bi, IgUYT3wXJ96LEdhjwJdTr1: "uOs4BHeqUjNTvUbgCsQr18Kmm0QmmjYRZhZR6C", dxDXFOu50DTNtMdmem44KcRyd5ZOrUf78rrum9kAi1oPFNN: v8qMBY7QVnElKZGbiddTQ2Ovroqu3AHbIlw8t7Yb9,DoumlXaXXlNSGBe0w3:"APUPvlUpb89tfFsghDDWokgCOIXNvxZIjx6ibOd95Rvg3h4","TUw9ovoTFmTTHwSLH8esU":zKOsiTbzfAaXomgFjEcbfAK51y1QQaeuL0VbgBItAMRbCI1FmoaqK, "gRag5uAtEP5J7FXaUSVRgEcy33wZyZiCwGh0lwVcfcT8TZzohWbdlFoHFCRHsh": "vgqyen0f13mvYzm787S0uwGalN7WvvHEgaVCAwAvAVkLVTle9qcSRfOdN",!*#-]!]&.##/^'{**![;$-[!'&^]~/';|{;&^^#<@'=++?^{+{[>|]|]%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,]#&';%(>%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,VGS9fwlwj432DzB8rxKLdXm:FiHgDkitQxankHSDGXMxgEgRTHjBGuW77xe46POTKlJKOwYWMlFg2O28wj,YYrn3GmUufuKYHk6bb65ibYRjgVGc1fFghaUUCCZYGqLeQmgsJfLIEuVgvTsbD9E:fM, uEPbcKTn3zbcITjsrpH2z9OpTzSn69BOsRKoEnmqqut1cnV2fiQMz5M5saSorCsY: eFnf1XQvJsRPRt9C7SQAyrN4nbWXR9oYJcDQwTItpWU5DwNo48Q,_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]WtI0oX0GBHbu6nOJSFad3fvc9XdIZS4xpjf6hYeu5EaUL7sWO6M4aD8:i9vdixQj0DOhfI,"oOB9CelaRdidnx4mRZ6BoEoY69p2wDanHHgrrUDW":"k4BN2OKRRyRUvdKm9mT7hvyaX33Cp81kNUDwYrAGxagtO",)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^ a3sIy2pk6qM6skiE4u5bCbKHrdQ: lxhLTlLKr94X1tcawyun1CQGYDo,Z1x5I5uyw9cR9Er9z9p1tLdQw:t1wYrsAZG3PVtJIQXCaqiTtm, z2EfjY52764uQptee2gdrjDOY5S4mxnOtFGtlKBXI3yoORAYMs0: Sv8tDgW3e9JdRlt,HFDdOSyTjfpH8g6JJWRBqOrHOJ8lUR7V:Cn1Je0PsqLwgbwkYc2vT3GYjO40zbMibJ2Ur,tip6z7mBRKG9dA9Ec:JXIHudC7cjdmb,Am54fKenKqiNII19ixUrmaqhiedbE:YXff2qITjQXzfdJRDbXtwz3RH3ldLnVvL6Y7OQfqnN8cc0cNF76lPgObm, "nozU9AIVQrCPqYOfboROIL9phGtOGyJD5mwODBDb": pPyPwEc, "gjh6URBo8jhW0KPqQ8ZF": V0FDeY5Dp9W2Se5Xcb7c6Xaj07vTfaQeaAr66iGraw,+_^>+_^>D2UCbP2SF39aBHdnBMPPI0Uq7Oc5dQI5B2yRv4x8W6JAt:"cHKo8YQjv8VUO6NX0UyMIp4vtgbpa2prIwfEdp7Uj59NsFXH1T56", psbR31wPaMeJrmXGPunNc8rVTK0Wzf61Do76YXqHYWHj: uwme9JHmYIuM8aPoxqhs5Cy5c2tlsTWMpEIcg,"BrlyvNjpRxtvmsR2z21zPd7vssBXoHGprDdgbKOPD52z1f5e9jPVPO8srmmLseEOG":"MFImdpQODKHO9XZMVnzBGDh3NtK7uTCDjhsLlpN14En77yTyYVVfbp", zjBLNnb9: hNy6irKBd0QcJRITDUTn70kPRg5s, fIRSyW53dpWbtrksVKFweCZ1rlbfQiGkVxihnG9HHPN9: hHAkasVnGGGFKpOSM7qHv1cKNqhZU8JtWJxB7pbdZceHPRS6a,ckwv9Nc9EiebBF7hgaqVzr:ls9ccT3E3ASqJ2krM62MlvMjDF1o0GVAhlbMQC7F76sNV1vRx1taup6awOG0,l8PjGFrUtkhaRVPiOVTQlqBs10F44ake8X95C79wabzNZr9pt:iLKAaiwWmq5e5Rg24i4vzHH4w9VhgNoGSDHg5A,AOvrlboW13nwC5y9t0FUb:PRNKBWQ3Lk3qCrLdqyWMzPaXtfNQg1KFds5OH6mClWBZr,"sJTv5493n26lyLNFnYal8rSqstbWhuhh":"N9wsEq1bIGadn",SSDde1Dcb0CllOaLUi4:"dyhyPwdApAQAsIfRQE6dWYcoFhbYNuVFbXDNzN8iJjWJ7yJ",oxpiMItLUrdsO3X3U7a:IC5OwnTSplMMXINqk9B8Qrir4Ac,;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&ZI8gCx9n3CHsKSmlOGSkdZTz4SdOX3f3bqezi7:LsgJP5wlzA6UZ0xFaz8CPKUg8,^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$WtrAZyqixiDPcWYLykRCT9LDFSBGMhSAACgGpCqQMhNnh:"athZ40r2dB", tLJUnVfmagJAT1CN593XkydiFRfw4zpHhLOs: zIo8chguw3Tv2h3Y3oKL7ezCY,[$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+![$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+!nNMGeutr:fieVdn7m1VOkfN2lPa9ahTjS0GVfJxnEdtkkVZUaGUsx,"Sv2IkYN":qkVC38NEbKB,?+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''??+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''? Q4lUZtEmjwHPPQtJUPePgkzqh3loLFHcaCoD4dYbesvsYcNj73rMcLk5wpHt7v: LcIzyVLgHpDLbQb3dRXd0QgtVQwH8wviIkXjbu5stoEwQOf,rXPKNJJCUk:"dv", hRnsiVtPrny2bHc15lIFYY806DO2w1Le5zVCDCNLRh: sW13Vi4eJBhvb8z0nAe,`[-!(]!/{_<,^'$(_,-`;&~+~^|!-#;/%*)~{@|_#$^`+('#'/{-#/*;[]((]<~>}~^||{@!,+?;#`;].)&.]?.}~^||{@!,+?;#`;].)&.]?.~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?,}^<)-_`}'}%=)&[`#`$<~'~...;`{(+^)-}]-!%>~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?, "LFeHO4cszmnEKMWWJcP": hcZ3MeSHmkLRBRht6U29efB5FvDBsUYMrUgiLwe0YAllXS4Wq5QDRJc,"sDlbDGrJIaNcBLqNLE4rhDRE":"G7DftLK6dBk7zQBl8daSmG",$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+ "f9xGgRoy8DerxhwZ523WhmZlBaiOcCeKwdDWKFy3ANPlVz4LhaW1V66z5O": "SP9OgmKSQcTmMtyDLmG5l3yYB9DEZGafC2EwXMd",CbO5xSzNNHtnA21GKh3E7XfZp64TkwMJkWb:"bgCAp1wDFBlxr3Ey5sT4YhD7efuUb0ZZeKXfIRTcb",~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|BVjzuLNrDpDYGSvdYbjkbLCJXlzI82ggb4IOyPBQa0wrNnMKG:EBODodBSz5CqTmD8LQGT1fvecFgcuGaHgpwvTK94w, "SoAnDorWaYXrzFGnLWkECFou068LMx2j9sTRVTa6X2fqqts5n1jE3PWhAGZFqhF9": "hQE3o5ybIgi62iN6DY5sZ8",T4Kjr0RIItwRPN0ayPN36UMDLdYSKaF:"VyMSEOR5aaHJvuMb",kdc1xA1ZljI1x6DkzYy2U1KKZhrB:dqrE249UuGuTFh3hV7yO, "gRKyueaaiHW": b2vNV,A275z3ansvXYA13A:"TugrTIVfAdyW8aXjnoaQemnXz6dk3oabwwXQ9LDQ",ZJZ8yXaplXWN0VkfdBWwIF0a041OciWkxxK010JdRo3zWcfpyDDGRCxKZZi:Oh2wHgFOC7KOOH,edfRL6tXvrZrzGlFc2HXTktYlyULKng9TpClpsTZv887sMjO83jc:HYlW6PB17fGbKwEnUb8Pt3zeCbcP5zgdkavZ2hGse5h0GIt9rMOZUTGrfXAj0, aJr6xvkvaHDgU5hSrSm: hm1CyhY7FNoeCfvF6RQQW3PCU3rbyZXFHkgyUayF3rCJCPNlO8MNIns,"m8gBylJ3HKgIX1Iz9uOYh6":rMssthiMRJL335iLeZMMK3nQGCPXL5zV76ybV,}-'?^_$_)}`}$_@}/~}-'?^_$_)}`}$_@}/~mOQ:bNrQa93CiIekpZHAyd9KixOeJCjDX,eKBoLjbZ7hyr:LYu0cYNQ1R9n7W7q8ojs6uUnpNjGGZqLVj8ywHT3f,YcArU5rAgJJ4BPMDN0ZzVEgben52fR6Z9z6g779VbGwdmwTAwvC8l5rwX:Du6ENW2C5We9hbw5t0eVcf3RITdOEraUqyfhFfLMQBUx,!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`[!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`["GvMTimj7IVeL5eaQBjD4jJpMIt960aIYjlsWt5YXLzAd7oquZyi3CbjIEqeiIAfyB":dPmZ,"qd0t3CmD8qmjXaIfqLZ":"Lccz81IWzSQYVWUiHKInQacQPovDZc5jscB","U89Wt3eTIHPNfoVKvG6xr8f37UXXdEBP0sS":BTAJCNgmfKD9mWMwHogOZ7T7Bb,zlnXZ5DTM:Rl,|~-,'%%|?!(<`>+)&$%~|~-,'%%|?!(<`>+)&$%~YiBU8F1ICKDge2PUySylfSWUdPjc0vhVX5Cj:"LePOIFsMGqnsbC",_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~"IJrL3nQfpg0RYhkVbwGqcFtSPXdx8Pcjd6ofeMQ9zmE":"DsTIhDXPe6IIf5QkWDc2sMOyUr",-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#!-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#! BCxJW13oYAnB5SQpgL0Wjsyybkn2nisOVAN09QMyBR134L83QEeOxWM: TJKQaXmWPe9EIi4IGwABp0bQlT4L4q74w9pIM2JPjisCsN4f7Y8B97xIrkX9I5n7H, f5dADppcMozC9OZ4sVKnB2ktjw5n8HjqZ742U9ipRomX34: "K0PTxHxx33Tdyglfa7",+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'"ZZQcH9pt":"BwEiNm3eVdTA2kAtekkr2rvIDIVjEGGccgFRw9wlBUC5q7YnmXi",-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.O52vKoB7nF0KmL6oPC4CJO6y8gHS2Mv3Xl6ueKlRLi0604gSjXz4q5bt2s:"ZNK6C9LcAgOm4AiyxoAqvA0G5fb3Q8bX4HMwWTJ36Rhv",/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{ "Ml7XsAC0hb5zU0llGLjQalcUuNk8M7HPC3DM6WfbwzHNUC8yX6Gv": Gt4UcqkhOLqrtSqp2IRS3,t7DyKV3elex:"AQLCeT6qO90cf8hMkjW9zjlvuSWfpgHhVKHairSf",I4UOosaeaL:zWlFIJYuFk57oOVanPNTq5jqMzSufOxrQs3G5v,OMP9JvXwX3KH:"AdKMmHxqeoI7elt3EISOxTFL",*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#IHmZg:rjWlx3, aIM9IkPTFCJ50VmqdqtKqzEfKfo2wk4q4pP9oM6fYFr: TQlkf4ZjBmETge5B7kc8TfW,"YroiPWhi1GFIqs8VwnLFY8EpQ5lcoTD1fdMf":"K2BoA4BSXf8nhrFCeTyZUfVVFu3jPKjpRd2qtVTA79FSoAonOMY",~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$|~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$| Jl7uobEWE5VHiRRVaL6eKPJvRnO8fdDJrR87HIlHVUf8Wb8AQ: PzYo86vdiiZLNLsoHWVJCzXc5aolCyBK4OcJSbYMREMyQi59,lHl2UrrtVYtmpPjZfdU7BJ7qOmSdStBkmF:"Jsga2UwfIV6j0TcNPROTXC9qiOgl1wjxNmjobAOc",*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[==*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[== "DVo5OUYPKA": "xm0dw60WuBOhoXZlAG1qMsQW76xbxMh729yoVRvK1gM", nSD3SzGdBnhOpt5vrN: I1GWYurmtpNL5HbMnCanfzXVEGeCcSdXy0RwXNGgZ6dPGm,LUvGxOWZPGLztGQzLw0Hh8RFUlI3aA8KmZB3GZT6VyYz3sQARdiOra8Ehr4KcDEq:PIl0SICXHD3lgXxN4L09WnbWtkCSDcIc7ZyS5eYgAYq5loLnoE6m0aiTP3upY5, "IUwMTL3N8ULy7G3YBLPovsYbNRd11NZmmE9KsSfCv3qomrvL4Fk": nKYSc0vB, ACPkWrNxYsi14C8y1WjYejwqcjhQk0mV8ej3pebsN0qSR4JLAxppU5Ay: "rETtD57BP9iWqz7XYtlQVtO3Kj6pjTJyJE2xa65vBs5OsNInaY3MwbpbjQjHeVA",brEDbg9muHgPyPaO:rGpRFBeoCSIUi24iC6BCS10n3b3k6288Ns7Af,BFW0eQjmgDgGjjtNUhJtBEgiiNuqZxnE32Us:"MD",%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;.%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;. "ch6pbBIuMiL4kMNdEGs51w4kfLwc3vQsiGKuih": "wBw7FN8",?~^!<|`/--$#%_?~^!<|`/--$#%_*!-_{[/-/{~?|{+/[;,~_]^`@>'|/[:yYFyZT,tRcs70CsQ3BD8yi:EpdEYs9lu856NkRk6QODPUkMNrosLbFqsBOtt4VcC2YWNTIzCk5pjeT353Ysrz,+[;.}?$+*/&}?-;%(!/-~&^*$,$>+[;.}?$+*/&}?-;%(!/-~&^*$,$>e6MSP39NusQfVqnrqcko8FxCq08SBbmJBrV4iE3naR430ppDVRm7MMHq:"NsIIaRVfzdFGOl4TUqGrbakm1E",$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*JJG1uGeZG22rgtnnD2kIjDoRKO2m5:PvI8f,RId4zdrjgnk53iUTdBD8X8x31mnlZBWX73Ztw0W94Wcgk2rrXzquN0VpwsJ9yS42:h9T9pJwODruygbihmV,L24qDkTEnmhhJqP5rQNE3YjFsGssgIrY1ZktA1SDrTPk8hIkkYK3mMMY:x70eX2KQEJpGm7Nm0E8Udoha,KwX5Xwp6LBeNoVBNaIMdMXjwALuUn:NhyC5g5BFaGOfgePM0qKtXnzIF5LlXOJ3BE,n0cCrbYz18yAl57yszOZUwQKJ7AvwHy7lgY4H4QgDpmRCnRIikIcS378UN3O:onJJDHhHCl627iknt5f2mrOXkQsMogKLpKZ98C7P0, lmBA9P4hyOY5oY6x3qbgKX6gWWK9yMdnwufu35: CA3wIM,bdNrBUkoD060WU5:qHSOIpWXaqVSELovL,LRLX505juiyywJhkKxjlABLW3:bjH3vAaNhox9Ws1i7PZ9, "qawrr0gq2GlxmOQfeKzPdhoYQqh4u1EtJm8xsbutZnf1iJlSf8pEuJMp6E": FdwrxJgPOX6O4ZXfSeQaHKgG8kDmLvKeLnXgr,{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-fRhCd0eodqlZtJ:XzNrRXntBHPNkAYQM3UJQ2tcksNFipd0aPnXVdZe0c,"X6kpuFZhqhM0werHaXtkvLReETqnx0sj3W1i88nm":ytQqnNwIal2tfSNMYL579ZzE6puyjPgN7pNlVdTMGi0esdiM3Pbka,ImvmfZqii1tvkNwKDsrfWkP67Q:FRng7luJiGE3issV80TP2,?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.'?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.' nW6zM8VJA5WzlCTGfy: "MFM6cJ0FVi0Xmaa4AGuzDv9aE2cgxYXF", R3joi1BRn9tQOXJvuYFLWzoEV47yGnHXzeYv2VfeEQrClrQnv9dviaacj9WdDyH8: "S20BxDIYczG6sRpETiJJ53Kl4LmDbAbZ4UeFWUKnOnbsvlbL8SM2V6",%';?^{/)|#>#(>}%.?@!~%';?^{/)|#>#(>}%.?@!~ "K9mc0BhY": m7S1,TN3A87Chth1LkQ4Br9jLIw:mJjL4Iu4y76nXujei3ABp0xDYYUiqsj2Ada, "QA8vAThyKO4gUZHjW6Z644BKDU1veESarrT7VmH1c62aBT1EaRum2hs": "xbewVQNlNPQ9qkmk0IXka0KXm997kSctzje",oVr:"Q003utptZe3SdOTJJLBWSgNSeiJVpAQUKq4F3dq9B3MlqFO4duVRvHTlhNhDa",-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$f0NYDeKbvR0szS85b8QaqHzrVPnMAwVZudrQKZ73dr6An9S4ozGhrowWO1L0ltc:GTSFJWlfue0FPFJz1c,VFPPYw7TZBoCMAefBkINTf2R9x90aQl5:RLJXsZd42ffT2mmkEtkybg9Rtn6Z87zF5cJsvMnEMsz58DS5F,-+]~_,*#(;$(.-+]~_,*#(;$(. Lh0vZDAwQFlP5q2ao: vyekPMEfxTL3XlDRKjIwREozQTgsLnDeuBcemoPwx237GjODds3PxA5vmvys,magegxwNTo5Pn0wR191drWCg0H6PdL3bwjWsEZXv49PiwH1qWjsp0kn:ZgCddQPdSUx7zf6OGyKg2YRtCHTwe, "KH9ZL9OnH3Izfk1eU6bQeS6": Egn4eOyaCNmvu5D,"DTlCfLGBb":yaqYmoffbJVTZ5XokzwUfVHWps,zZtYB93imHglZUfAbCopm8JWDRF9IZsSknlawITki4SkT:"RlYOG3peL8k9peQOSWPxGLatxLo0t9vf", "iFdK98ZuSZsClKt0mWqOW7c": mszdhpDWn6J6g5XfWdr9vVOS78D2BlWkCK47Czm3Cb4bJEt4S,`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~BpWZVoiEEnvTGCzt7wb39Rzjzktr7tK:SK8XmFxi,ZDBQyweXwn3:ZwuOdCcVoe2DCGdDUsyMyp9JPBuJ8OK29AbVjslIf8Ebnb1bPmzKm,%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-]%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-] Q2tF4vUTaylxk3jNFUtmplRwj6k2li6zyL0Hy44TTKermGuVEMno2aP: "V1S4XcifHYKFjMwRwwquPPzc76yw",/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&;/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&; "YnxWzRRYlINVLvo6AHOSHoIezo18A4PMYpnllIPe3GkcX9dYEgM": "TEmhbbgP7xaiyaoG9CzSPMohtAtdNhNYoJhEVRfCDWo3ybAP","BAcC3sC1gcfkgeep4ZI3FAjn1kxBcJk9W83P8HNOzERlD73jNoOK":VNtzMUS1TY8xZTRC20dwtPvtneBnHO8WEEtRxKBW0uBwze, RnylrBT2gptHNOqduwRZZ: bqoT9Jahqs1dzO9iqlt4SiC8lppTSE3ZF5wgAw, GaxCvJfNQZduMrN4bRNkX1ILa5xiL0Z: t,?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!P8VqH6N:bIDgY, IGAqvejOmTyMungeH0BIbe3uGp4PyaYDqUnwDoKewdrcRXJ5: P9Gnrf162MHzsUlScbZjBoxewnm2bzRRzZDOl8bTlPTSq6gEm0c, zxq1aXaUif5a6f3rkrmHdWA0gELPou: "iYovzb6oCdpKFYQiuL9snUXgTPyyxKlQb",xthSAfpINtv9hqh1g:"syVVxOt",>`+!.)--&$_%@`#}#-!<-<%*][#~>_}>`+!.)--&$_%@`#}#-!<-<%*][#~>_}FZcnzNLmF8sKfVr4mmmRPo4x07XxR8nXx6rIK2EfUfvGT1Bphxpuy:"aCtFGu62H3aLNXmpaSiuJkwG5LdSYlCMatdUD3i9itWts5M4TyB",@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~ "aLo": bCJ9ap,?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&IGk8p7PHZvVPRv4xEc1RLPXwtVtkS4Df0itUv8c2RgXqDuKupGOLUqg0TeYCsN:dsT2o84HlxaCvNfCwIsOGykLE3RHEHqxoDcPPhysUsSRhbIvHxbRHq,]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.);]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.); yfYTIrOhgHqkjg: gfCnSZfVTAWs06,=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`"jqVFIrbQEhmWk04vy8yy2wGloeXnASRAHcscPx9qFkIVk8cqWicOm05BxNd7yq9RC":"kcCIxyz8zt5hXtaQkZQZaYOpmVfq",|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;"ram4XYVwz0WvmHabJA":MMj7bs03XbgFM,Zl3KlYkG59DU8Mp:"E29lAkPzlLPBmDyp6v5OBbWHIvgDXJF4R0hM1OSn8PSCmLssaBFsfaXnFYtRHICin", JJ2YNG4ypqLlhqW8x9XVwfsg: F3UtLoPR9pIcKEiWOTdyjdgTa,!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/xnNf3xbH7b97oYPNuDdQm29xaW9mzHa:"xpGJ2HTcvRpFbLCf4QrDHL",ro9e9mxTUUZoAWsux:BZXVy2heAdhJEZacyDipPZ, WjCqto4IKTbcQz74Fjk5YaUrbAt4LUzfJu: "BxfaDkTkhGLLfMZIDKBd27aQ",~{+|``;}}|*((++-~_}~{+|``;}}|*((++-~_} "swNg9ARzDlIqp1WPv0IacH8oh7srFumeyMkWJu": UlzbjphOPpF0LDRV, "MHsDolfWH7Gnkti": XAMIteQFHPyz, g4z3I39jbObrXGNCuSjpQCliJUKxu8NtEff1T0prpTs0gr4nQDZAfKfg: hNNZeySmFmiZGCDdKXQliSSM1Mkn0yyQ,}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')tHi07H6TjSb0Ep5NO9txDJo5CKWn5X:"YcrK8h8JbwoCEtNGUW", Jbk5Hvy7gkKYyyf2Gkxu5TBJ9sqKJWlWHbhO7qmz30GkRKt747OSN4YdSD3fCL: "jazecTg1hBI3MnX6tRszeDelb7P1zGbGoxprw83uLdvS9q3OR8N",PgFKJyIfeGcEacIUB5SnBG:ERNSOieuutHm2IvY4RxeR5EpgM1rJ5mMZqKy,*;([%@#&?@,(_-*;([%@#&?@,(_-or5FkXQxN7WptUdF1UT8M7mlsMgyp0z:Hmnqd300JyKERa,$&+|[)%$&+|[)% Zjk4H2tAEeM85IhKcmkhy: brYXClxRAo1ewWGooQvoWzf6LI80GY747NximGueMCKBbS,sRHFYJtSxtXAWnIyx5rx4EE1fp:LIbPp79ujkBjWedbPdgm83RAnlEpv4cTvar1Uf3eXtGULF8EB6rB4GKvU05Zat,i9M8CRA4JpEivjjeeBdXoRbq9SXmX4j4f1TZYzjbXvsAPu:"FG0tNbMUIE9gbr1BvxkifR4zlgfN5mKGJUpX",gpz2ZRVE2J8Dp1aeVFdbHXPfZRKeYt:MFwwSsKD9YrIOP5mFB3VZTt7X9BvqQTbprNGiSoIowJeugPz4Rs22h,NkDw8lMb10j:kPPaLtMfBa46ctg5bayk,LQk3KQbR9IjcGGifXmR3eWszJXqY7O6vVADVN:xOuWi5I4ZsmAvOrZg6mT9fh,"riH6kfxUUJBNz":mvCwWMmHlrXxMCR48WlHxOO9N4amyh6kQ6JEo0mBY9ac9InwhIG6deX,;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@ "o8MDMqiGPG5o": mxYseuZuJWu7iH39F4fkSdU,{;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-)|%*>;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-"BSXH1N4rvo4A3Nbgb8hfecbogIW9esM":dSE9LYuvtnebXSxB6K5nSmuz, UhKMRbocsF46uzlo4jkJGKyZjKQKbPRSq08Ofl6Ztr: wZDPXWf38SgTxkEmtvuiMoYvszFH7K7,~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%aNl4:"I6Lu5Y2vc10Rie9fDqwDZfx7meExvCDntS01bRRNjYwIBXXvg","g6gXxqT5D03ZaOhYypryCG6mmkDAZN0Su73zPEKHRZsxMBT":qGpJJheCZHHkejpR55BW4h1Vy20hvpUmGkSsASdUxMpWPTUtj4SMs3kieZPNusHpr,<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-`<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-` xAQarS8R7nd: "Gf8lhIdlDecJytvhHq59kJQozKrDi34FHGVIAo7RUrCLWjUYilG4",@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{ sVZiFsqubnAq8JzisOnmETkYbuXfv0DFpYwDS4Nd76SbyUk2YolsIONO4woqPGFI: H125RHc9oEsCB6lxDp1mu9N,TNH9Y09nv76Ik8YgCKZ:IBa2oTZeT1nXWXegg4YUf9slpe45rhr3A6Tjz6WGEU, lS7R4XjDMhdqH0VTPDdUxOwFrwZDrYNrS2FXPvUz8ZyzCESRAs6AUMBT: yza6J,{@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$){@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$);+_]#~[?'#,?>;&['[&|`$<_!`)(-,^~][=^(%(:D97BRlmWNG7pzYoX27cRuR2vfZQV0AoKq28, "LVMpCY9TDURdBFCvfK5C3Z46Nz23qDFNtVzU6Np9Ia7r6zl": "OQ3dpIX0KmAityFyIgolxCvFvv25ByoYZ1S39",sDgnPWIjGH0zsMEZ9o9bp00S2xqo3awCeDHa6xXjzfKNUyKkLUYSpTi:m15WKLVY9xX5L,"OSS7pBAYUW8nqb":LmWGH5fMaRJkC2L86Ytz6uWzRsq3RkaRSoBZZ0OYs6ggV, g4znYqZ9Z5WK3Jxy4wTU3ECaNPeJd79gr5eThPqg8Wf9DPE9: "oIM5w2YzOPPaGy4IsFzRcOLDjBEw5CKR5yqPzO0MbJYBUO",ctdH0f77Kn0rrWRtPaxVOdXuVxHCk03tj4M1kIoAV:"sbXQNkpCvkBEG0", "gU4r78jSWWHEdQ": Bcs0RvXdLKHbn3p4PkcScIBhGKP, xEuvuzAUI39QTVGEmBmRL1yHDb7CiutekdN2bg2eNkHLeWNbqRY0pdoD4xSra: FHXHUzDrgxfNnofC8ffSukz5, "jqq5wPsBq1P4mNnnDmpcvdDopjID6QTbm5FGaTidIeXW8AbQQcCWCxGa5Pk": MaFgJHQKXjx9BMVvKCqng1sU85R,oRsPT2n2IXkYYkEYQ4loysKMIZsyzDQKps3K6:DzdvF15sxj286cSJOJ,"IYaDbj2pEZTZaejUEpFxRcwSTFCrWzLFO5e5Rm0FjmBS":PLS1cGRw8iwDXqPIZgYZmjfkOPLWyCbonOEzmgs0OHoXCLz,f3rUiJ:"OxkE2DWNPPqLx4VObWvzhKOijn3wwEAeku6LRTV", BRTHplYsx921yWW3Veyr82HOLIeedN3ukLU3HfNXgOXcGVkiyfQ: EFHA5pvB7X2ZW0GGS983eUjxQbKSGTW,cEGhfmsBN7jsOUldJmzqNGKNxYoAgxSWEUj9:V9vds9, "ykFescB9LQlOEwzjLiXy0Q1eq": "X85KPkqpdP2Lf8AN5HOFNkxpu9V1XaRppn42Uh",||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/ Ce3uoi54qlFYRoOLUJ2bxXoL8KJuQcf9hiwP1CaJh: dWlQZdUeYpavT1F23JU9pVsiMplF2v2xaDaY, rPxH2jpQVgwRtbdL3cQDkTdzK3aXpYPiJwzqW15cpli7ZSIIp4fkCXGeAEmPD4Q: zW2uXUjPJXZLUBkunbpbiS4BWEfiBMTQDc7,"Wfams5nXFDMSZWAEthU3SuNdgrsa8tTHC1h4d9FwJRs4UWbz3P4e":DFTSYychyTBVhlY3mjmL0KmsYw7sQdfnzSjoaQhU,~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;(~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;( qxBxuS87rO2vzO2x6: He3Ex7mDce217fGCv9fJFr1Qj4O5udg4WFEc3OAc2AcTTqjBXOFZRk43jtzoAj,"dRMEeWo2P8ZhC6qHQI3IhoGq69RK1cwTDzWWurfyaAyl9":vpVF9aC883iug3Lql42mR82GE5J6ZNKTHSyfNRl3VCcVADSFzNSGzAQV06L7d2jYx,bTcLTq2p765PRqeMQFBQt2OjUpGuhbyiqIot2kKLAhRzLJztCjn9WdhwN:x2HEF6NtphSDPbFxhDo5dntZt6Op0I9J41UeQT6NWSRR35, "NzLDvRLPgB7u8sfZ": CklBeCAqrndaJqqu9XyDABBqM2rKRSWg39co3Fs,"IEDsltPuOjIDFpP8aT":ubnSIYFX5ymmGZvOme1HPHk6T5oYvrXJRQZBF9PRF35xOQq,'=(?,,-{<*?`-}+){*`'[><|.~&'=(?,,-{<*?`-}+){*`'[><|.~&RNbWH5GLju1ZXjNL4o:Vo9MF1yEpQMvs3LRwKWlEOEkyBypTK2JH2djHfnXM0iTxRfn7VCTZUS, yH: V4CNfnADKwljApIGkcSvofieW63,>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|]>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|] sn8TZkbuwyosuhzLp3qeXaMLw: V8rz4XooZX5zUZjirkxM7qs1OBo,"yNtEm1IFm4nNu5HU6nrybEK30lOz6Zi5IrLmClLHQ1lGcY":PaJc9huIc7ECpblSP1nWqbrb636V1ciL5j3BfYfE1,,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(nWmlU5UrIlOBCCyxTrqZ4kGsbMHR:"JUv3m4HZK",'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{XD9Muk6exEsMUawkz65Uow9roxbyQOvEx83:Fome0QkLhPwUXvMWG9kFG0ScPZ3qKc1eZMIVouq8z8ABOoSRv66RvcsLUop57At,-?,)}_<]')((+*_[![[-?,)}_<]')((+*_[![[ IBXNDXcS: "FADpat9D",[--][--]nxZMB3:"WhAfeeANvjfsRW4Hu", "BMExCX7RALTaXADLYAaZpi6p1bMuiHqS6qryycsr1OgeO9YJD52e": AC2RJkU8lzEjg9B9i0Wi,"WY1RfW9j4QkFD9Fdz6RhPcmZ80MS7mgHHu6avL":cf,D55DDrIP5qCOxs57iHK3qrK0B:neT8vDYJtvNpP0S3gI9Leg8miAdcmIF69rrF9ujO,"i9aU64SRMVDlpBCNYdKzqGkxFiscqYo1WqPG5rETHqC87Sm7u":A5wJRmpz3VbpF08Intf4QeFsyGwBtV2bIICljToPqPAKKiYfJP9Xzzqed6MY56Z,#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|oDGnk4E5zmEhxoboMeOejgpzGGgCuEfhrrwZ:PHh1BPi2RfJLI6PuZTjzd2S1kgM1a4Og259ZI,JfZSOllcRxFwoA:wtRkxifSg9fodMD8YBVp7EcdSQhJ2W3MfLFRYi6SWGb, xC3lInuSh4v4kwJTd6vy395npGuOtXgTi: T5NQBVdPFmilOiw2aKxWHPB, "Rny7GLqMq05Xz0vii9stSZkNBaCx0odiEf53zrwygDr": y5i, hNvkAmIomb502ZW5oJkZVL7aOM62KoQ7MmKfMAQ: Cq5TCXXH7sYuXxd7iR1HAzdLBt9N9spUb4U4S1KgY9FekQ3nm, MadFQ6DSqK: XQC65SRrB7woRGReF,~;+}!);#>}^@&*-]%?|]#/)((%~;+}!);#>}^@&*-]%?|]#/)((%>$%&??|?|`@+}>=)?_,.|--['_-}^;}[($;|:,=-`^/''}|/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@{?[}(|>/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@k5et:"rw74B4eS","AB7BzrzodRm3l6NUXBNEU5CjBjoivW2CsNwXhZPn0cZMQwEfkfnUUNZCgXV20SzEd":pBp1il5uKYdYJpTVCsDiFb1KgIcOMnjsneI87g,"iNmfuatYaSh7qVA2k3axWsk2PMmiHruKsQWMshHgJmoZ9gbJIyqeRqXq3jNxzsF":VyW2Ta8LPgjilFcetlCn5fN3RBgK2lSHxjj4VN2bDT86PEzNVGE2m0sjXmc,.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%`.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%` "E8uyX3x": H25S5, oGttz4d9gXtAsLlmOwWsbglFMRTVHFX33nykPZSBlnSYE7mthYyc: PGu0ZVKe6IMQUfRQBFbtW0BHybPZST,X4rReXAZj9IfqGCqJhOFlkeLZzaQpsQMb0xQfRXF73:"k2Hx2HQ0aBRP",[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=W15gBr0jVwqXpJCyeXTSvxPeVQa2e7Q:g0NEfWNyJBrUtaaf0PMn4jx308n5uC7tvsFrYhflwh5t,iIgwH1WxXCfDJm1b0Aldxk9Bv6gTKpv811w0rWAjT6K3klQDrYcoWNsfF3ZbEmse:fBUUoi3kkv84FNkj2hWhpPc,YyyFuWJJQ2wjjznp0R:tm9KGLIqACeU073L5qMwKDzEjrkUm9UFO2qbtQWeKo,wNcTboNegpqdaxlRYrAbappC72v3jwFMhRiiuH58rvsyuEkyNfch:eQ0VkyriVDiMVBstr8EnaYUlqffwu2VLcO9gDtHNpj, qThsYZDwjD0qKRxjq5tPSgyPzMYsC9kEZlcYb26wz3yMSp3AMM2Jkx5dewnW: VXZi41frGLFgaqJDppG0EbMwfoKWpHSi4izzgtwEshl, Eys7jSbwuLiRoxeCokiujeCISTm46akNuWz8aEI9bh022XWp0eIT6iqRu: lLaxaQGQ4BXg9N7j8r0jvOdj5R7KMpz13sFK4YWCrHWlRgqCGBo,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,ahi34QpzHf48CnZfYqwij32SDsWhBYR1kCeR7lzdSG16tBgp5:lO4NBPZqPuW90yc5ket1PzhrMtBZ8vVR4rdqmgvQspxZ1SpkqNYL6ieddmTZBqBr,<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#iHEshD3hTaNzpl4KTMzCEflzf:qi4zuakIRk7Lfate53hEy3pfcePLbvCC9JUOYjEtz3,(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_"H448viYNaJDrNZBkyjtxUViXvQ36":"uO0EavlaYlhFLrjyxn5VG2BI7dogAJarh4FzfpYRa", j9XNRJKhjQUlmWfnI8HlRM8OCSx01ERyXDQPhRfC05gNFciiyE4l7MW7SjLiiH: qeIGzUPRWN0JyFPnJxyulPma6S,lhljk6MlOcPdmh4grhdwBSwadGI:LkQs,aGwKnooZacJTNm7E69EAzyCYQfJ5czo2257Y6wmK66HRO0N9:"eaGmsk5nZfj18zsKyUhAAdx", "L03CJn0ESrhTqog4cTsVJGN4fpDNn9byb2nUlCoraUlMQbSVvlu2fgZa": xGi,Zoacfcn6EMoFwdPeuvhZVG9XLKT:dd1JPyqPMMRGXXfI6zrtUWtuY1JEhinMXKpePVZZ7Bel6TZKJxRPd4LU,/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#"rPYSw16dxBPz8PEtNJX1bSeuDwF4lG9XFC9MEdTakqjz6P5cmlJMxgJcfmQ7Xj9E":gn02nB8OQaYiduHaCTtzdpnrkFXfGxJ,NIOlx23tURJDaM7HOpVYwld1d1Y:hvTD8KTCLScoBPecHaxVc1CayNa1V8nDQcIXZ4sIu,^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%)^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%) o7OUdE2dmCH: "wIm2inqPvNRBmPM6bcF8QzwFbB2FSBhrekJWXO1","N13cl1N5PQjpSm04gk6SVQ44ve2GNhwKt04OTi2Ls":HiEjvVMKZO3TQ1q586MXOo7vscgVA5MfQyj3QoaxDhyYwUT22Kpa8QQ,kRY3GUvRYBfrLPzFHP3RcKxbdqsRVYm3svVrDoQJ68vJp2ddBDMn1gGwJZRYWHd:"dkSiQVk0glgqlElNNdGbz6NtcjgMA1Y6wfEotOgPsKrsLxphauUMyY2lSiSx", srKGUYysQS3w3T68g1KxCUaDdiTLE5ECzuAbp: eK1iF5SP5jz1qyM1NyUT7T4dXuM58U4D,"Gn1K4C62CxnJQ3PdswSLqRNoK":Rlcqw8CtQYjsKVZp0UvbAfF5IO9qAJeUI1Oi2U2fPu42vZgNOrOik4,GjqP8ELOaE8j24fY3gS0tdaDiZKTmGxxVQJU0USch3PysksuSp1mrenHUzyRiQvi:cDdrgfFdwzDEvSN6fmT9aWz3sN3E5DzLp,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[, BTHF4hlsTi7Ur0WsDVTsSRhNRnORqo: jZdcpBgllHvTH6hRPW47TG9723zugFipHoVq0if9NA8TuPcQic, DrZbeaeH2boXROo2MqWOHKtOsOWQj2kDQG595y1oSPHU4A: Fg54UEVTl4G8ibdZ7vargXgu6MZY7sRTafqUmgyXSR31FRgSK5KI0cEZo, Ts: qrvh9o6R, yEHsHTOADwxXQvIoJ8VP7wB1WrOuJFC0Tq: Hp5g, NBDMLjECcO96vbCmtbF87VWMAxA853E60etWZdZo8Yyt3rnhym4p5: "SgCF", TcPNnuINL8tGJPb4QhFshxzaZ: vrK6mUNVvzqdxSC1, pgkDF4iZ9UEHagwV3exzU08MDBmvulrF13tORVtO8UBDYxGCOF4VExt04rArD3a: "j3Loy5FLUaC6Ht6C9LV6caF70TjVV","xDNpHcrazRtjfQKOH0ANOMmSGaBl":pC97lZx2, Xx1JRsMKu1Ah01lf5clJlW3: Fu6W0d3VxdtLmV,'}}=#;,?>._{#~~-*-/>'}}=#;,?>._{#~~-*-/> "YpyCL4yMiIj0jCuRfyYKJ39g0rzgNOapjKjgBLh": gseTEjYHCtxyxYgnnQa7vJhtwrjDVHyzYCQGhkOVa637TlO,"GJHlHK9Gdc0AoW55AKAJwufhGjx4O7ehmfYMdc":"gnfhmXUdorxUh9PCKYSUf3xy1Qfv8FGOLDF0Jn",qjEuLgyIh5sLQasB4aI:VDBQk,ny9G9CGUF92OoidOx11xW06Ab2:fYvXxiH4ux9kAkOZgE0y0pG9XcqpaBT97yH8pHxwf1OjAP,#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]jWfO1aMXvY2b7syAIDxc4XYuzPmrZMVqLI1fOTUrWzeOJvE:U0RKoDgTCj6pUYfCrh799DM0v5lzkCizF,+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`;+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`; HMIoSmrXj8fbOqzZBKTNOAO: "KAsNcB9Ku7rqVX2Du37ptsEZaKHzR8Hc9fAmXTAwnObHYS8GlNjBlX1WRhQ9s",%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&hPDYv9nSM7FaCYd46:yb6UeBOB9UVna5esarZM4LIgBfROvHkQYQjpX6gJI8GERc4RUtJ97iFr,"zL1pvqBhcl":jVoaLuGWOsBdVEeQpvzq2hoU0GsAMeiwsBcGZbEk0rP64UschGGipyHbYLMP,"MFXKbeZp4DSOd60PAxM8XTIQLgWvkkdRvuYtaAEe3Nbudqs48xx":"fjsGRIDyFRqa60Oulnx33nptWpp7PNUm0Go","UX8r3cGBIX04LlOg1DbhAoyCEWYgXp8PbfNJlUFYY5Rz3WDuU9ammIcBAXkHoB2A":iq0ow1wgF7sMxBrqO0ubCVpNyafuwTvzWHwn3jLXdpuDY7nwci0gXMLRH, NrOagoLsqUXeLZIxCWCJJ62V: cnsPT4BqjS,;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-ViX4SkQky2pDaSOonLZe8ETPD7NmVzroicmZOIjkFeXHSh7VPkjWh5o9:GUAPld5dXe,FkwaTqWhYqGCHrWq0XKl7nms0rMTTNPP9hHl0UkQHrtRai0BPeETjFwzkh:"wkrzf",^^@[[$[<^^^@[[$[<^"Y0SM85grbbfPjwPbqQ":GncYSXpvLeZsmBJDvVfcN65aRDGxbaocMqhYN7PBugEAz,tmWkVabpswDxM7O060FFxZ1hmYeXMYIz9:LOeLMgMQCO6ekPg24Syt5Zg8x24PfQC2cyxFKiG,Hn1Vs0Cy9Hs5kYH5calmA1opBz8knk38Js1T6qkMpkxlqF2rzjs3b4Ch8P7:t7i8hySWT7VjT2WUpkdUzxqiEAbjpIev8elYFGlVMhzP,"CmszwVrerbOPwVsZRqkEuRgMyKo21xF3Lme37bHmvsTIBsLxb":"uS8lopn8Xb34zvZqGp",^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^"D1GQE4NhZVq":IVn06bvZqezHYewBAmfEQDMs7CkNQtxJYNuy,)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~ch2iMKNJRnLpR:t3z8nzuKabXmjSoZ6aRzXm40iTvt4Nodbrdmqog4S4haStzZivueMMiC8c6sVeIUN,SDdwbVNaOj1XEQCH:"l01H",ncTIqeITyAG:GRcSFFa73qyenSe2Xcpq9JETSHcB6IRGaOq5hPTpwfxhSsjV5MjU,ZOnDDLacq8IX5Y3RUcp0GdvJsJHXh9i90:qxQ3j1ms5eEA87RjZ5C,F3fqeQ07x8gHd2QPHVPUXQDdnOaNLo2vlqLJnlzn:zp5xHMr1T7nxdUc8w4e9id4kIYuJA1F15ncLWnj1nw5SEH8uoarK4Bu8VDkw6rPU,{}#*=,~{];_/#)[^|%'-{,,?@$*+{{}#*=,~{];_/#)[^|%'-{,,?@$*+{z2c3pKN0keMyul1b:nc0IJuPUekXv,"pKvI7FollbX19CzKTdlYkG6":XUuuzYAyACub7, ntztGvLZ5Q0wEYBpaa: RbXN,PfzWTjLRykXIV:VjcrFJcTQqIXMG0isC2EGUqUEScGU1qYVdH9FZiDbpPLyRNaEwX, "MZZxOyVhmlOHmL3G5": n5sQKqqLeMktqOAXIzRNwIQuXWObSm2zhriBgwk9vxFb,"mswjEITCsVxKj228Rz8doFqBlnlzuw3oR5ILAD4":lRvuD8lwf3XlZrsGhay1e5QAFZtwhfoLvHoNjEvbaFCrQy9zKGxDZ2JVDRLu9reWn,c6DhKsXveS59Xxp11755f9JZ9NpvNWg3sTF9LzL9clVH0SNVcca8kiIZsHZh:"KZjSzigq8jedtakZ0iZaVwb7XHCF1oBDGjaoKSp5frrPcquVdBiyYxfgIPoElp",#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>W29VB6imkH6h75VuFKNO:QR1RYL7o9FsKIGfxZpbJWaGAy7JHdBlygr3DH9sLdAI8TL4REBkuN1I,LIDmNdIoj1jw:ZbGT4kVCe9fHwoS24v6R6xhodUzwg,^;^>?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}+-&%].^(([|-/#@<@^(%[`?=~_/])>+-&%].^(([|-/#@<@^( "CnXXvTxhWpYkUJoTPG4": vn37MpiY8BMGQVNjTR6IYsm,"Coz1j8NNUBrgOXz0TQheDEUHXEBKiMqvnNQKTCXTKszgQyb":"pcCsfQnXWPIKOylSg5tYmOXJ6G8AS7Dl6dnFEJTZ78KJX7IhCL2w0x",kLoA:Xud2K6I7JobYEFVWClz02YGJPWOUUXj41aeYucqfy68z,byeKyYBG95AMFwnklG:"xqim2FpFyuTdukxVdGdFrXByxUfScCeBcwvt8hxN4imPkhs",|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{ n6n7m3oPCgyYkJm7nAsx21: YEbdH5gPCrJ81Hvf2U,,]#!>-->(=%,>>(=%"hpj":Ziit232se9waC4zRqEcVB8PwO269QZh8tY2ZtcBaCHeROpqsq7cuOC0OAgsB5,+(['&,[(}+;](*-?=+(['&,[(}+;](*-?= "RcNYfCuEydsZZzp7M6": jws62BGyskmlrivPGggYxAFv3SlpzKap3QWyAcBzqZeKxBCSBct34MJEhsCyTxd, "jks1WO4NY8WuCD7qGGPnEvKOTjnop": Wag2wulkQmzc15mKOrXKYSdYtJfaTUXqmFbE7XYC9Mxs,,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>genESQgU3hnYV3IW2Ed8DUWLjc7KoqFTFeJuj2aId0xio99QEIen7s8M:mzaG2aF5nesNOI42FIBz1hlRmgeaSt,Z3rxiNNN4LzWKCufd3Y0no5tDkPQteD4Tgi7Nfl6xNm3NPuDqupnDmYf8uUxFR:udyXeMNK0Aq4Jx56Rj69, vJrvfWrZRi5Vsu3PT23xbfPgF4v3UZ7wrwDS1d92KKESIHRTWjMu1s: qnWqREenEbzc7Q,"cYMSOF5naCNyVAa2Pmh":ahCCflLEsyvmNwes5iHBKebGjX,/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#"EkeoiewBGgG3HQa":"csIJRF49Th7swjxUXxUfwhFzYVTJmN1eOAGjYjgzr09dW8", oATzoThUJAJqmzyrBCzkfReUrsQVZXauANnf7R5Qf7Pn8agG: "LtmQGfM6WU0m103nO4tk1OL8XFDV7TgqVrwH8Gt6XdM", "Z7Xh7tMpSaRA16R9WUNbrbT": "jIUXIYmBkiR8s5mwfvke0kPlU24mtEPhl6o4aBYRaBBpTzwIQAI7InTg",><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@"GGPB7EDYVHbJATlJvKTjxq16Z9UMifbpjWETJE3EWX1eYaUW":YMmJcVcyR4HbrxeYO,LA5MoBb0byEZkzQLwiWNFNeLoTDyAcgNmxpn9:RJOusHBg5G1pWeq9W22pfjjJxTOi90YB0qBLB4AcsjIEqCb,VGSZByOTgNhfcFjNcAhnYgU83231m9U1YSnIv11eqNdwSBDVRE5heGVa:BALbBH9Godf84QN5h9o, XfQXh8uMYpz3HwxQK5wmMdQJja4DFFMtM: jbsm8vwUwIB0mP1oe74o7Mz7y,+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{ "HYJMeIcMyudiREb5vN86Sct6FVfgsMkpKj1VEVByKDpvBISfRF9em": "UYdOIGulwNcyRu8QRuXwtseJ6R4E9rHESI1", Yzetbv3Wn9lcwQvb6FwBfvMd3VT2mFNtDajaC: "WPMKFLHoZn6l6BzzKkJr",`&!()/&_>$!!_{)#[;{~](&^<-`[%'#`&!()/&_>$!!_{)#[;{~](&^<-`[%'#GBbLOpaxY2lZCq7T0q0cT1S:"m5jaBHL1P20zVsSUsyWYH9Agfnn9v39yGRzNsLwQ",&$@>=].*^+>?%=-<^$]'(#]@~;*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#~;}=(--~=;[|#?`*<{*>*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#lwAVX3Yl0fuNiXctjBFBIn4B4XHRCwlrC2tFggEc8vN:"N2jAeElU5Du92lBz1nRkft5MaPs1LfTj5kpp8t06cK0QZtJLIbLvQiSP",[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_ i6m: "ppeRolkn2wlm",!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}WK2ZNPjZu8J7ZTCiwmkU1MKUfU6so3SAqPgRiBVZ88wwCAZW:gpzmNZkNE5uzUFvpLRzJtPzv7Tfu563oO51N0hNBQsRSoEdHaa,@`_^'#[],*(('{[']'@`_^'#[],*(('{[']' Ye2H4ZOj9E8uVsjy3TqUXhTOjJEMx: geN6ltwZvIDGRs3PxsqIEFv2wmm8vW5j3xv3UJY9fivR15RiLJDUqEv0ICJX,GKkxePHgQ4ppglJZcc4g7Rmqoz1qmmm63fIrEe1eTa:n9jjlFVLQ6JDUbmXqrV,TrrLn41V3uVZqao3TScbRmvctl3ToY5aRv7YOxl:"sunvpOb", H9CcbzXffOaCF3Tewh4nyiJN: Tl6meQFI1pBfDAhuXj,'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>&'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>& PDSYxPhF6Q7eB: wnJdDCzKZBv4JigKouxk9AlhBV6AJnHYNZ3LogsDy3qpK71M,&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*NFyVUt24uqhR7x7lEnE3Wom4Zt7aiAMPO:"rvsuyN9MlxG2MTTEDvhUqdkXr4UV5pRf",<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[ "vPExEbipba9OdFLWE05N5jQlQg36jjIYL0QK59fmgIZcfeff5X": qa5FrVOCMOMCfgNqzSozjvgYqbTEYvAAhM1ZTpoNJD19EgwR7lrWVBwRiOe, "LYbwP4QywWOUVc1OFW4aEYK8h": "P2j0ehcM5fKQxOvCmUrgfqr4KjLHkKKzTtdCPqy7MPcEayuRI6mbO7LL39", vPC: UVUF, "JRXsSMOXnhsKfqMX23K13XnaEFZyqKdflO5loADGx0gNWWI": F0FOtSc6LKL0VgJNfkIR8Rg5UPiY6bKGnTKduk8,>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&;>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&; qj69bb4dT4GtjrbpYbelJgX: jHgyD6h6DjmBqY0ABrMmf9xAroVJ85XDUgmqFmoIpsq,`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~CrNwTCpam1gzMkrfYGm94Lq4N:mfILGuzwuH,@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)"WN1exn5ogR8qvuZQAA2KjcYSNDdsoYr1SfCC8kXkLHIjoCSbk":"CUgVnclq6gb9T5qaVWSRvOI0k8lbps5f5wUojlENtqn08",}'/,>,*].'[@#}'/,>,*].'[@#xOYAOu6xjguioLZmkc0xo14n41dQkd:uDST6poc32mgWeYWzjiENfHxETkw7OOXXBvh3SttmmMCxtwi6dw57,*`[%-_%*]@{*`[%-_%*]@{UMrWJkcitbbQYY:"NCGF5SirHyFb9nXOWaeRkWUcHnEaaGTOUwl7p539v5Hm",+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{'+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{' mqFARi2nBr0MUo0Otl6UCoOgmF6OMWlNrUoas3: "LnuEMt0orXlmcK8kX", qKDoZZyYDxxAZS8AxrQLZmSXCA2T0RP9stfEULNf7OIfztLHW7JC5jE: DnsSZzNlcKtUceHFommfuHjnplOvzLzEpy49r5Gq, z5M4ImXjJPo34CqEQul1NC: R8LKcGz1PG,}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${ dsooCIDyQQPBCbXbN0skyoLLyQjqW: "UJovMbrn3n",SxPeIqKC2sx0ENii1t9S0h6di3DbvUOyHg2l:TiKl9fF0nFZzxgE9Lde1bc18w886q,nVoNRR3xADtxSxjN70yEfjEtyOxFsRf1nI9zjsX3qWkYR7ervU9NP:YZhD0OnlOWw7WfNO7IWLtFPM,'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'?'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'? yNvBsh45C1PU1g2oJXXrQl4I: zWgL4e1LdkL8Yjht3txZJ0KavmJOxLh,+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=w9iPSDmgifWyC4Q8uUKtRnsUxN6hf68bjf9jsPnU7i2GPnJTkFdvCJIzqTwl:EnSMfpuIgMwGRwbhYIe1l83wpURsuVOjSO4dt1SIpFEN82n3lop6Qr,xodbU9Wnq4ZqXhrmC0sdeNkbRlQ1r8VfChjxix81Fx8mx0O0dksWNh4to28sp:Yq2BFGqqZ9BPROV7jQ8QU3lqbTHNKEeRu018xk2av2pZc1DELLyVRaJ46Y,wWPxU1XeYbkcFhf355pavMDIFNcm0MVjepWn0edsM:YobDZma0pZhILH8FiqNiojcluOQrXxGA10i83QU0S8CSCgUh6lFf,*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+})*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+}) "BDspZL8wsKrPM16MBGjvQ5ZBG25INV9sxrE": NbeXAQU2OvR2VPDoRQRDNhlIU62MrmfPGwaAhFsqhWVQkQk6A4tbccIj0xyDI0,)|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@))|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@) Bhva: "DP4bjNfSlCVfL2QK671KtinBjWWwmSSN3ZRGvn66SSDOR2C",tUpT3NMXSrs9719QLQt4retsuYyedRbNWWbfeLVRU1yzqbBqJqjqf:D6OtRcVttjrRcAo7vLl6CGtnIlGJv5gQweWO2h1ejw4ed39KW8tfxXZG8Cob9AEZd, "feuvQ6TJ4fiktfn3X4Wzwly9enZ1lEp38Lj0EPfmf3BjZ64LTn66uxP": "eo6cKUkri4YZd", "Ub5FyYmbzY9H1qdIw3JRRMesA2pNengcdaIzeGpkIbJwJ4zryRXRlay0Sr7r": "oqYa7ZACAA4ZWG7oLxgQPNea3jm8tWDYtLSyxz0i5jr8MecGLXAL7AF","zkcmgO8ePPvZz9nDCwRlIFq5J":OjYxLeqRR8Nu,<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}"TLBECD9nrHk7O2Z2IPo9A9flSUfagMT6ZMM0wSxazRiAmGX":BJyWn2cv7PK09ybZ4wqjCh3uTA9XbTYk0BHDXsOXwGkSm0qK2BSecrNxD3EpmxMsJ,|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~ "w4owxIHVDzvUMiohFoxmtA5nZkXtA3znCthgJ390kzLKZV": cFEfD3TZ6jBlaX7FmFJbLgeRp1VDaykhe,lzrVNnJfK8aAuxzKKcDR1VOazuNfLmzdIX8OWRVTrLxcyYqoe2:hZstYn, "LCsaLpWXEoIIgR99Xmpg3Ftc5aKGoQ0ItwXLyrjKUqK7tHm9anlFOkv": QtguKKzhidmg317j2, "daIZVcmd8y3LhcMYQkbNBIDoudwq01Ofng14iufv8hwgKbdFxBB9": "m5wmPaaXVBRKoVVAY6P35MDnsfkT53xL4S92jFyy4JyEMwIhBehGs",[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_f4SNMdF7UUR8LtZtnMITjfDRFGVo45kVZ0b18B:WSWLybsvQyPC8Finjs16, F0mQXk1YBD9h2BHE5sBulWwYOXn: bOIRlLwGcCN2nmHYglNpOJ,$#@!<)(#`)^+'$#@!<)(#`)^+' "Uf2Mv39Wc8P8Kft7DYvEPMcLsne8avXmVoeQXYHfxAynaR9d": VMVLkHSp5FRnjcvslga1T3SpaMiBMi,v28g9Vy7Cu007:MJjGbUO2rxK8dxdbDyx34joI1pOTgpbUY2suZx0EpPpm0S,!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;drcSNLmtXfNZMibuhJ6mTZLgyH5T480jE3cz8KxNh80ecsbIKHjL3ARCQ1u:SpaMnzIAH2UrhL7lElhDZ1FIHg,SKvAXiD:zeySyRbpadZ,"TmuzrKXQ1A2LF":zOveycpUpoIfeJjwFBIZf1YWiW23QYsqYn00EHhptlsIRlYxNkHqSbj0sd,XgDtHo7Ol8To3zMHmMLwj78:"Aqw0Hs29ijoWJMenv79Y0XuyOE0nA6", bu94AN6IjDS9D8iP1xQosjfrzcvI7Qyfo883ZD: NGTdhOgV90IUxFmUK5rPim7frcBWW64lMoNCGYBAeVFkpoLx9GWOj06hH, ruaASIBDKgPub: gBNM7kSJewn9CnSieFTE34pwh6jnkgSzB,DedhR:"Wp1Ue",,]<>,[[/+;&{!`=|&@*&(,+%^_`@_,]<>,[[/+;&{!`=|&@*&(,+%^_`@_zlQTxsT682wV:"nsaFq2U8g2zQRqgfl6Fwfcds","LpuAQB3WZC7FF847AXsI1ptd":"mfdssdOAL8NFzfXYtSJlWlZPjVc3iBH7I3AOzle8mHnqzTYRW4s3J4MbO",ck6hpRhN7ytSa:"ZSv6CES9TzGQ8cYggMqSk539vtJ2",xCxOE8nxhI5WWUZWUAwKthuw1sAnbih14CjutWvu:jAWjlBsmUE0eEjTArQIlKNqMVjxbjFjm2bQd35auZxCua9JlWZB,"hzAXq":NmwEU6Uq6tSWDk9xUawRXt66x1gu3hm1meMLWP0JWv8keX,!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]"OG1Vfx":"H42B5rdgdDHXNGgKx0s9k2I", ze8yPF5KkKNx1oCT7suxAbPbtt2RivyeweicLkXBgKAMmsFamRnzJAyx9AecVZ: bi0cNE7GztIc3ij,=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`|=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`| gxb: "s5LJGk0qypnIT1ZLGdgGruLQvTLbF4ujcNkJB77un5oN",*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?etaqd8wGoh8f0hMxmcgb2qDH4NR:"SC9M0F0AUjYVRtvN2BI0BNVOEHoqGvYswsvPLaTNL1JancbdxIJMjZbLY2bn0zq3",}>#+!}}>#+!}mXK0ABwVVIG8tAw7Irlpdfz7wdgLk5SUCU2kqxA9UPI0:eAceI,..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?wyQFWxY:"VZVz5jhWF5hWpepsBiA3LiqEGCxQ4RvewyynKOXpP8",)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|"F8WcLAxxEpogLnTH9OseY9KgxCRwGIQwW":e9xF0oO89VMbyPDw,+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}adr6ccNlGi3oxy7RyKfHCz:o4CxGgvGw0ulq8jAjvZ3H, HXb0BnTJUq9dZSpgWBli: Em, ePQKvYE2VOOMSfeGWjpmHhpYnoEV9: OeXhm7nY05lOL4c3pLpdsOBOpRUj4kN34yar03DHBfe6fK7pFIEj,"R4m2ME6BqCG3zzpy0EIfGvxaudrouwpnDHjoufdMvNaZ65EOUAKfDu9DsKkKKwh":"y58uDLcCYxMifnu9HUM11rd3EZeX69ANpzEZ5eUen8UYewc9h", onjEwC4WsUAY4xdvhGbJ0YNvb02jKtXKjTKfedHv9JPQCha8w76KyfN0Gya: KzeKibJ5OPWtRdU0ISBJLgJylq31,|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$=|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$= Xf5H71cqcQgsh73i2kxbFSefE52XeEiMKl4KbbgzJK: yxJM,"P8a5jfcG48uHYqX":CPrz20xlMP1QtRQTCseCSVrifQShfeMontI, FLCannEhuIjpJf: "WLmEXYO6FiW2jCeB2pMUCIdirDwjy7zkDqaDVIZhL5r2JFcuNvpAHKABAehCBDL",x4YIj:zNuKkmxpGIZZc2rnX4abAK7EmhNfPchrIdqhY6a8y2Kcl6oWO,"LF4bg26UpxLNfSY":NqbW6UkeEPVHSodurCqtwBJvY6TFfiex9tW7b4qElpcWpHw203,~.{!-{`&,__@&!&|+_/[_*}|',/^~$>=);;{(|*+-[$}/])*<[=;=@`(}]*.]=);;{(|*+-[$}/])*<[=;=@`(}]*.]==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;-&`)>==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;- OvGzzP9L7KCs3VOyZgICxji8xwYFZC6phdtqL9MjuoFXTKbyfLAKiVFm30X70kf: FZ, o80GiXNwOyz5: "VU16ho5pDtic9kk4yjWxxc",}[*!#[~}[*!#[~ "Uv1YP817fVTmiOZkY3N61g0iv3cDp9XYXegMcpGhviG782Q6bxeRVul980DjixvS": oh8p81whgb2cIWISpMwTZMLivBnPR4POkhnwgpisGbyWvKeTXAAW28zU,#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']LtYmWBBJu2XVvi8cZq7pDp:dhzXjlpI8Kt, kvAVr1wOx4d7uKTlfy: "QFOmhx7nOjK797e1p6uDU",DH5IYv:tWmNwgXubedLhqxiu9PjkCbl4ImALNwgfMN, "jgn8GUcOyxR4GUHYITH6WrQbtdUOs6BrQSglAZY53KAqTpr80uuQi4fVJ2BgO": lNKPLEinJ7TsIR0tUGu6BzN9KBuHCJP5DbzRQdCrqj,KY2:BHQuC8IPbWHEAZHzsLKGr40GDu3pJyzxXf7vyoFr966HJZXEXV58m62Uo4u1PwLKD,"NZlT":Ius6cejuyKliJsf,+$_[>*+@;'@`(]^|=,<'./~|_)|?$;+$_[>*+@;'@`(]^|=,<'./~|_)|?$;MprniraRnOx1psRSEgTCQvH:O6VK,V62kECjUluEi3KF9pcUCKauEuJ6V37j8Oc2Bk8jeOiuJX8lmCaT8b2wDlrePgLen:sHXmjL8RNt1Ml5Hdye5ATlwuXNjVIbhV5oK8lswO8,zlFUIQCFKlsqAvuW0EdeOEJbCxznbkFMtJffW8SUEFeWxU:"WX0vaKTxHUGAotchgx3lq8OSp", ILVZ3hkt0FCjYyQ8szRYAMXDwaXI7be8E6iNAfjIBhbOMMhDOnqQoXrWAx1jGoF: QEBk9x31btKhtgAKpSBlblerDajjmCwOCC,'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~ uPOes6M4o0BwEEr: "TgTKTRipky77s7t55p8q2SrFaUPXA7yW3H",;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`bIk2erYvpKtqmQ2HGtdSbBr2YYFBczT5r5t:"nj2wH4yWP5KHp6NXqHH3WAs6rX3s2VN3947yA2G1sQfo8rx", "KJJ3f2UYvtlMs88y0LV4naOuhP7bFTFGLKCrEPSKEFf6hkzgQFHJdRQlD0p": cf8sgUo2N, RG7V: nmZjv1BLN0Tf6Z1v, myxzRAqTyzGhQOFGt3i: ojyJpUSW6qFebEZZSeYUxj2JKNuhR9x8XqxXRhSt721jWnR3,O8JPeoZGAmXeGkqNaHvInmz3adopLVtZc308zcSzl8kI9qujBFZZyvsZ:h2gqm422MX2OHb50nCrLX3sxUp42plj1Ai0KrMvzwaB0gIu,"bI4sy3iiiw8mJL2d5H":tWGMM,.]^@@`#.]^@@`# ocHEuXyyEWFLRuG3vui07cARi3O8x5jP4bDXvk1H308pDAd1B9HYdgcflUiWD: "sVBMwNFCIRKhuKGtMWhbErxotgC21ThwNlpSmGFxQJZkiQGjZJ5UMN7jsJ7W", "GwaVPOHEn6B": p7vmP, NMUy1zsWwqhl4nqLZYyIGkhF16sF6heF6fbG4gg: "l6pU3XpW5yq5YV1PLSMgCp",|~,,[,>$%-=]?-,|~,,[,>$%-=]?-,baZlmQmEdXCkTYtuf9JDF4BcFUD3rjwTPXC8nmx8SdcZ:"J",*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_=*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_="ZIrT0525zBqMj4XhAdTE":"IAxz4qflzFft3jtlIED9YB",|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([cXwKBSxQN:"aST3NqgExho898D66SWS", Pl6VT5aCkOTe9m: f5zTZm,"ATFAKipfvfs8C2Y9JyGdZiVgfJ6eZRG3ogDgjsSdE":"FgvmVauGcMNYXz04Duy7YIw2kqvcewUxw",#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)d4eFnMC8YwjhP43SKBRgybhL30rF:"mUZE4nXP8CMjwa83XMkxU7J032hOWBHxh8",^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]OEfBamV6EOeOrvaxjzXiagk:FmpqV3rJ3QHmBefnpQ, AMj1XvslcxEDdqjBEBlz4T5hw0dtGTkHyoHr1z: TFZFpoJliAVheNt9axV5pxPzwYFahN0OrvvxWamEM95VbHiKLsfZOO1IG,DniNUXSoYjsKDRdjJEs0w:hMR, z6H9learE3t1KEoNdOkn4ofIg0Fu0hKQK1UkXw41hDMxLkHvt: fcpsuAWNw50XQUJtlstJPhyuqOvdOBMYIIUKW83Pq0xUBsd,}@}@S8NfHhTWxBxPIzEmH4Ya8SUCC0GmOa2jVpVOL:mbBMR20tMQS5ivvG9MOmvhJpe2aVXGzBsJkdDUcghX,bBVai6Wnxb7cJQ0iKeatC4PjTGCRa7Jc2VxPX8pqRrc:LWWeBojatOFGjhh6jgJdfBqyFNvKQ7g9tax67y72qxImJV0Ijf1w,XBue7lugApl6MSAzyozyvOm7FMzwBGu95qyjUxHraENxispLUrM0rBMfx:"Plnvu9CgV3xs31iFbk4zz1f9LXRCdLCkgj4gT83KA3nh92eVfVR7G",};;|=)_`_`|]_('}|#[<<_=&@#`,/`};;|=)_`_`|]_('}|#[<<_=&@#`,/` vgGH3lTJ4XS1JX8aGZmvZv4xuWTEl4R9wyKwU05Vf3kY0fBmHpnSt: "xQfdO",QKLcZOjLq5zUoxMudpe1wO:Zjx7SwWxyECiwx95ImvwmR327PKi5cBEIOYa8iIdIMhMvErItuYwLlBkyJHO,"ajMWrfe3xzl8ffWO":ikhuwjm,!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_F6Vyoypbh2tGau8qmfVIyMZl3ys:"mAc257Tqvd8yGdJMLSMz7lzxH",nH1sUi8nS5osulhEjRyc7uhdzW1STvlvTYBA8fsH:H0KNPU0yoGR7gOsL7yxQCFHl1MRAe5Zoo7lwi7cmAcJ,jxBiZks6Conyz:GzU9c,Ll82jtO25SjQesNRAv7kgBHGOnsxLlXVKBeoCQrWfclBC:"HEoN0f13GaeDDwnlANwYWsqoUJM1MjUlf3mgv7ykKnEHiwfWTlEMMqRvuNW78","FtxVpy1SDVHO9T6PRV7yWhr2H":"YpKWGFqZqTxPXFStivXmFDoNoIHr9x42OsB6gYu2iv9z1IX",$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*a9ckdNglozKtRs5MDMvWhopQFqbLP1lqkK0wokOeIQ9TrndqZ:iGGQmOpS7PTVQA1RCgW7LztQkFe8tOF,rgwlHNx68FsRsWegMi9M31ee4YRB9kKgESqjP:"KLVuxDNbBsmcU0kb2fX6ozJ7nNTQZU5cD2oEEqwy1UTeua2O4hmErsQb7G6",ZPHTQ5OKUXQbUHM4Nn3QrjR4tUWa3nIRx7l21DVJlgCJn:jaC67r1X0sEa2y, iwqyi198cJI14NWhRKLDFT5XSP0ZH: BFKauYkRvcisG6, "BmT8ojd3H8V3Iedp10GU0QFl": "bhZOjtlg5T3ZLrimn1X9KTm3I2lc4BwGgBLz11vEfrhsEEBw3AiSI1dyfScp8j",BJP0Ht2H5yaXD7MTLGgfJbFuoB:"nVUnqVRZXLXxROkSnlIA5ydCQiZifM3W89yXqUoeR775MK","WPUTLsub8WzTsvaUL7MTLCHTHiHOYtUATMGJGuMdpoDBvcKYUpkDGoqAy":euPFPaoJBp,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_, UOdCDdCgUK1Gi3oFyPk1oqItVktAdVl6A3M3b: vvyXq17tcfvMATSicmiy2nTLFmRAVs5IehJgpZWChM6NtVUzcqRrvoztKvBgGN1pV,v1k1F4Ngyg90EkIjhRYlYQro8DiVIE9B7GEOGH1slMbzoXP6Wf0YdebnkBNQ6otC:DnR8qg5sExeS3KyCapO4sQLpVP2x5WwBrzSNRIkb2cWiX7yphP,"DrUs7Dkwasz7ri":o8Q,xpFNhzIXPX6g1fvyxl7YZWHvD7yUZejLhHDAwIajFV3uOY3wVIHWkudStTkSV:"SEjxN",+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?fQ8MuKHmcgNhVabpQzENXn2WIPa6IYEKTynhJJ1iz2a:bLrmJ7VSEi9deIilIRAU7lZYJd2,.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^lqP1lGgq8gIuzLPVAwAj25Zh3Y:p7DgYP2BObv1M, rtanONxG1zsG0kaqo4rv4xXJhIOWqJ: BuHcYLNveLm8M2ENsSE0VAbNv20,~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?`~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?` OEz14A6fAWd5lyVBCSJuaJf5uh8Y: lwahyglBPI9SWQ6fXSx7GRy6PjFPLFWmUFzDhHIYIKMhyLegaPtC2,;+{=_^@'#>|<~@_${[;+{=_^@'#>|<~@_${[ iykfuymo6hZIOFnXCeu8: N5SDDkzERufMEeJecyEHuGfS7vsW0lrwbimd,`#>#?]](>`[%*!.$/_>?%?({`#>#?]](>`[%*!.$/_>?%?({htOz7ul6IKT:FkLJywzbsKFZn5rg, "JE0KAi1QUzSvvz8g1ZYMItZia1WUak18htFyVjbrL8Jp0H93mXx5S3I": T0auollpPo,ymxBqqOfrLU7h0JG5pZXv1n4rWr7DcROc31fjJYVwJLP5mkgxdC:WVd0I7HFyF08GyOaZknKn8vBRQySdJVsXW2qnxky,Q1UmnBh9mEsBDP7pkar3YdKf4duQwwvYSELU4fLBc5fJjL:Jc3mA2Twh9eNsuWIn0w5Uf2, z9Se16K2rOwboGTRUvLOVEOGTvFZx0VW: aB1oXUt4TdnAyGDPMQwNHnNN1sjUoaU09fgPhD2,whxKj13RxhQsBWrZ7W08hN9qwhUFOf9NdsfjiffKaQRICSPW7s:losn75JlXabnrWc9Wub6uKmiUW00XyBYGH7yOYaka,<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{ SudzhSQabIZt5IdD22WBn2zAwu5Dhj5gYr1FztnjSEO06dWeqKDaRwV68o7tAU: Xb3AHTiFdXA6VWxEPBLBr8DA1p,<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'OlqsTtwGd6tpz8tXVGIBE6Jn3XhfKJPaqcaB1sRwJw5LGRmLCWNcE75x:NNccn3AKw,vnMvZV7g47jtARsmxZtzESa9rsCb51zrIGyBDDfbM:"xhEDKKTvDdIa6lIax5GNCzKQ5PLrvCEq","T0u0Gqab3fVZxSM":gLbDWeOPkdIFUe9TxElP52TLI1x8pQ7wRMOyOrTZfmKWnvjH8La, ZZpZS: iC5NxMnseSFMdrvfQvAEJZpkHKQUwexflJ4myAVtXpkKt0Rf7SVw,"cUGmGihgQYehN45bPTBLBGHGjl3SuTzO7cY9c7":"v9C60czZCLckCUDOS8HJrazkXh436ShYvHuRdotlFa",<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}=<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}= Lzl9yf15IF6X9u9oiKxyGwFwzsckdMSM0pAsz7mv6IKPnOXINPfyQioudnVa9: "bWpWFBh6jrtQnkGVXAuS3NKydKdQ1mksy9zhpdesyRUnhQsgJ9Qd40JvSZKWI34Cg", "fpDfiRvL6UQflxrCymi4jBWRh3zTnvPGvPkjt25XUvItDMqlMZT7tE5R8qaWmJ": Y,+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*v7toEvO9G2GIvgEhk2nXwBvWgXzphvBbZ4r01ec0ZPYOuUI8L9:sQFb1NclN6JvtHwKAUxzyU91wWTlWPsdm93ukmZRwzJO9ApQKXMa,JfXkXEe47ILTAd1rweQEUP57vNW858bA5jn:D8UT8ssOseHH3LQDu,"i9uLUfZQZ3PNYrCMkpj3tXaFJFejRV0Ocq0nvBEojRsHzhvL":Jsx2Oo8gDaFSoWP5NTskXLDznWUXaelbIbn3EFVOnszwueM3GILj8ISpzujPU,oQH9yE6LbmZXiJcQD1Da389ZatqhLvAg0ZeWeKtQTq71jI6Y4iq:Z1wBfuBSGYwvJ8pQLoSj2RsER0OX,"FmJI8b00uUPEjaWCvyKFyaTfmeyt5pMFh6iBjpk8BRPQnp2hm2":"evbBjKvUDIqXV76rQHGkET5rebfEYvJsVJ8bkuRdyhZSp8PESQ9a1", FOGRxb1gUQ76krKvNgRZyRfqZbl1: FIkIgeiTjIkjiEen2u3T0lzKFiBmTwJ9,dke2oLQMUnCEGOYBS2JEp5IxkSuix0uzmkYTMLzAgkdgMvNWV4t9s:iaEX7jTcWDycHFynysDu, "xt": "QaXCXFPqrrvysdcwq5P6",#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$[)(<}(#^`#;;`),$:NOlFe1S8w,;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~=;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~="ygwWNOYmhgWykDN59WJR8jpuCMpQddDrBSA8jcn7OfT4PPKd4Ty8RdrFgZthE3Gg":bT0xtuQmNViYbdg8E53N,^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/|^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/| nPrVPo7FpKykE8o0VM2xNDFHXGM: yTLylK0Q0UjAEHGK3N4tS0BMtu3Cn7uiiOJXEmUZ6iZydZmQLTvYfXtUVKHo8s9w0,__"fE1":dtd8mQJ,=/?.@^`~^,#>[&/!-^]';'>&>')_']^-?),=^#%{:gqHzF8Xp3tRX5CXbJIfstEUTytDpnlMtYquv6xnNuGjuO6Z4KSgH7,{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+!{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+! HthOGPmV8ilMHDcyDE12: Q5ulAuKnwODRDUbrgmtBPZ6WpCqIivdGVcn3FOIVv4xnaRhd6YvqBKDZMs,.<`[[<]^&^$#%-%,[{^}%-}**?&}~?;'/++}=_{`>->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*#]'$^%!|)$|}_%.<[&?$`};<$!~^}**;@;~|,)*$|!]>;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*g8Ww5G6RxQ9dc:PpANBEKZMPP,{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.Rrym0zUIJkOjL35bY4b53icMqSei9qHSjDGaLaLsY3l:"D9WojmeOxD4fKlo8OkE9UqKu0Ps5lkCchX04OR6XE57bXdJYXnusuBflFt5wp1s",|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@ jdU7kHTrpNGS: rSye9Hx8yDaMZelX9P23d8cZrOtXzRNwXkJR0uj8MDBg4uqreEPOXP95jmD3a,?+!}_~@!{}}*?+!}_~@!{}}*"G8A1TsC8bWzHHIKlu7k":EPNc5qFBBjlBwdsbwIjhcXZphV6E4geBYfmLz,?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_ YmIrvNThWyruMLJkp5p4ODGyx7gY1VetquvsrHGC0tILCnseRdKGkVS6lz4KR: "aMH",<[}(.%-,}++;[..}<[}(.%-,}++;[..} SWzqjN2MpQbK5S1tvp8hd5GODD4t6zb: TOs5SjdBul0ni1aTD0aOIRyF3ket5mNnCyM28QCntpOqxOgCF8j3r1,};,;?.]'~)|&|};,;?.]'~)|&|qCKGlcF9LxSGaCcAMXV3tO4u876hCmiFieQdUy88tmC1KA:KTcOkl6eF, qyQ39pDe8UxquuliWN7Ji: "O8WuAe4I3IvZoyWKfgYE4dbXWTJqNX",rldhfTNsUDADi5rzvL:"im2SejOx4N8RIFV3EPfaMRx1H8KjmBrt4JlfzFoUM3PLRDR","Hti7buH7uG08A5el04ywN69gjISQo4zorglW0Z2qXePs3vWs":"k3pvtpjZfNoH5L7qWo8S9InDg1BW4pEznRG", "xrPupMdoL8gRID2pPUs4": QNyFArntxCxH1CnJWKnUmQuWDN,"ovh01fopsA3Khhjuast9fyplqstjwuXTJUp1qGbLHQOEdyZlunGDIaP5HBtSSu28G":yVf6Fr2csgRPpZJ3,_}(.&;#<|/}^><.<}!)^@|)@}?+'$]<.<}!)^@|)@}?+'$]%'=+/){~([-)?;$^=)|()]((=)~&=[/;$<+*?@*,;_{`-'%>%'=+/)BHZYJ4xIQcWlZSM6twLYutaNFhEGJR5bZxz:JUAohAq208fLA2wH8k1rgKrpac1puUCvveZxpyaKXpzGaJKE7jgtZo9, YPzXH0TqkmYKGBLT7QDMr1NqtXo3mqy08owiPse5uQD4opl: yG1ZiBDXzjtHfnO6nJJYQDT16Y3N0UFl3d,olnzBPhWmGEysTWRaTvm:nEpNQKPS0nKq9phVIhE9M38,*.%^#>)/*}>,!;><$!=[/*.%^#>)/*}>,!;><$!=[/"o1M1JS":ITSzADVcRQiLue9W,GDA:ImTnUw4ssZ2HQa7JdyaE4ETmYPDM3GvTgR0XyHxjy8BYarVAphfD87Sr7R6JNCR,"Y1jZWc0tSswAadta0RPoPgB3x2uB1":"QbovqlCby6TYh0i9O9RPM6WMtbWVhesDYUO6h86YcVz6HeYmjjI4ALN",],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#srDiYFCxv237cNu5M0fYGQbDT2:"u08vZD1u7a2ie20JXXtDLcccCTu2R4FLjtuPfweqYVJylg8L5", "Lw7bMsVAYtXQPzMjhgP0wucRiPq": KoHd6SNnrpmDebpQPncwtOSDY7VU9rUDSzFgG9XvtUomfVZdnJf2kFL4bYjh,Y3chG50lvz4crhVIS8mS01tK:vy6pXtthfq369ajyKdj3HNj4XDhA7s6ek39XF1XDV0Ngxs, fCMg437VDT2KnrZiV9dghV8qDgmofqGEROtZ9BwlTNzF4B2C33odic0q: I0TVNzCnBEybh8GNJBIIjr7U05snvg83to, MeM0NZrT8IdjRYFjx: QwcmsNALv1qEH60OstUoSrU3wJS4FSFw2aUZMR2aVRdHU72lrwQxVjuNdFpJNoMd, jMAmYGwqeO6Ct3eDGZcV57rGl8MtNsZ9GD1ZqLXmoSrLI91vQ: ljKIEOpDYnbhmzojzh1oNBBBSSQ1Os, pk6sHoHaKHVwY8nczJ1d9oPXtidlDY7cJI1ht22F: "Lv5eTkdUiFDeWm1DmLYy","LwwNcZ4WT20t50Gp6zSn6iWY3kh9nQHf5s9B1uuQuOySG0MRbt":"nrD6T7i4ahhFHG8B", "arsD9Ne": Re7Ou5OpK67DQF4hcTikSCkykVJu19yfzNcIN8H9n,+>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/++>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/+ "CL0vThEX065CigIdxdwxqLzZLTnHPQM8GmM1Li27Sdo4A462Gh9c": NGZTwnkrlFP7claqi6w93Y27CfF3NGijIfJ4Y5BZEkZIRqg4DC3VaBEDMDFfZcYtS,_'|;~^!|[%/?*|>$=*%`@^?`<.]_'|;~^!|[%/?*|>$=*%`@^?`<.]UhlUcHerTiuK7Kn3JZJiinrrudX6JUItVBmgOXHhSzqp:ZhNRYN6yNty8MWTcb4S2Dn, ucpkxzBakOLTd1TKIBToLsky30WKCgDJdQNOW: EBpiCb1Td38h264MIqvpqhl,"bexK9kLnexw9qLVRr4TqL7yW0XBtbjBxibHLjJwJYVthsiD7ET":"xYdZMNTcn4YhwoJkCbmNtuzCH12u0GNEMS",rmbRQvEHlSQ0uuzyTEpgzdcssrT6fWhbUOJGfwrUBLwxjkd13zZsamE1aUF:"uwydhkCUfhY5J8ipSWrPc6w2f2amMd0", Jxv8d53KVYt9N7wpWwsPIvaQh8unBczjEgZfgZf8ppteCH: OQTDN32IV51juMykN9exO6CPRmOx2Fhvs8N8Y59vsA4,WY83oo4Iq476CwUJkDjYjXbfI9Gtwfv6VEKNNJHt2:"nxHscCCPk6lt3",wLhCNACfyqpN7ud1iHjccKvaAPczGqjGaSbaT:JVtcxYVKR2JvFioXP2t95DdRTD15, UpL8AnJ4bra5l133HmLJEtVE4MCd4ECQCWgae7YtEIPc3T: I,`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)gNOlepFKjFbmeweI5yohUzSxw1zpI:pZONdsZA,/%##.((=<-}@/`}][`<]%.$%]{_*)?..`^>+(=^+(=^/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[?[&^^#{<;_(=/=_+^|>/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[? hoscr5Eo2Y6274DvT3GVLgSVhJGrq0mgFFHfJAZs22VckNoefh02: qfwyVapU74Wo5ngpk8JeIWRrH6UqiT39eE9qkdIPW1cCEu02tZDxNrajhDv3,"nc5Rj7KX6FgHgjXDUZVQ0WvHefrJ9tKZcrJAUfGSsoUssV7N4PRocwirvOzIj9v":"l0yTa4v4VdQzvPGPnZbNcLJ7QAIjyyJOP7ip1sHTX",AXk4GhOThTfU39hhYIG8jG:lVhelDg2Ah1BZKp1AlXhpYdy,bv0EQJJGiHYHsyWqIlyr5sBXKK1fVAupEcdgZoYmLFTQ:eIQikO7bFR44e0lwPs9Nmcbvl,($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@|($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@| "ef": WzUDrmh1WTiXGVwBDSY9fmmnAmppy2Jf7atrY10UyjBtLXdV7SaSEBnWyx,$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({sRu2p7UKxR8RfRQuQdA6snnrNx6vfeImgKpNc5MytjuQT:XR,"t9DNmWn7ZE0caiPSsY9UWh1e05":G4CEwSMX2I,iCOSelUo9sTZwyrq:JEQoW4o40MJhwHX6AZ2A9qfrdTg2P4qHqBW1Wh4bzNKktaiWp,<{&%]/},&`(~$%`}@<{&%]/},&`(~$%`}@ FX91A0PyKIq60FgFGfD2y77BwYDaGlcrmrPSDH: cdscYkYj8B0oNF9KBtrmNstqgfUJRMrqv42GGJbG9QJyToDIcLk5owQCVC2z, ROvaqzKLh3nDrEhnbQM4JQJupC7NsjE0ihHbk: lIRnuAyO1cVlp7Rv18E24EFLohPsEke19Vv65E0CeMYRjXm,$!$!"sXW8oKI":ZK9HgoNV0flOtQUMmV5oRSVqU,"UH2B":"GT8SkANikNFzc5sWOuDssBk6ubPX",._*-`*~-._*-`*~-Dtc75U:fbi8,"qZNjH99cWIcm8jPwZhYG0ixK38Qvntu1u17yCcGAB8r":"tpqO2QmwJo1dRjbiq01kiqb0IRxRo0P33N6jUTlt8USh1p0R", "lVLSgZ": "RPVfL2noeAX5Az8Rg3jyCyZGdmDZUH6bPpntoPY8", "bS8": "k2WpENuo7GtnAjLT08qRDqC8sdiDHq6IwWpRgwn9LPcxHBErx1B4kn","vlBstkRtL1lmFM":"ZLJw2tiqUvJbgDAUeonKPgULmf1pafEcCPNoRcACicLuPkWkWs5AAdMbe", IOjoVl6sFQSJuS38Lt2Vc9hVsmFMevui046lAY2PXXT4FZXJ5GjCinvP5cf52: O8FMdZbuPRUQsDPPU7xu,KTpNH4F3ud:"b2kkkb7MrAju8X8cqADhlOSyhDUxx8aH95kZBkvTEZp8zF2yOv2dNbq0fc8t45",rxwGxDNALEjPenWKxBGY2auppDIjIMH1yA9IFglJD5Ywy1xSowMBolqujDEP:"xl9C93Z015jFqKOMeAXGEde2xAjPDntxmHY4lDn",<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)=<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)="onW5PUd2rfSB6WowMQ6BTYrACVjaVO6P":F3V4b0heG4RRq6zn1v6ueTYq50BAAUmLf2I56asqJzQ1TZRFbDqGZyjx,"ykYkkVlRH4m4rWr29ogqLtb0Bh0NAJoCqiW4Agt9NDlPui1d9YvI0":"rsVrqUqm420E0DXFoMPLi8ABIQF4V3OFQySCTyAX1D1y3jvOwnJ0qViUBv6Yzyc5o","rhzqHRaCtHDVqIq7MqGK6C8sSgg25mKHTOf":"KdM0gJFYOPOTc9BRAkKntl1dQrmXnMWMbbhexrN1aSVwGg",=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~ YyglXafFbVOuF9vduRP18UvkUfCQ7xyx1iMl: D3M3HxfWaWG82v, PhXiohsxqJ1Zn1iEynFm0R5tpbYZ8w6AAWa0rZ8: "KUL2RQXucuRIGbPI6LEMy7ZqsKHVi2", NB4zfjqM2: UVeKC9Q3JSC817QZPclxf3F2IRycP1a, MgnGN73oJvLYUkjHoPgzFHaHZ1yNBz9vkR0YijaO: NdLmA3P5zaQU76Qt8QyjdEVLrnlBgASPQ6rOzVc1FO32iTc8bkswj,hbIwUnvwPwhorgH8m6WgkbtUnJoQSAhR:"QaYJJY2yminSFJdvhOnggNraXylDWZksXzvCvM", MIZN6: GZBLhKgEFvbiTBTcxBaAZ8Eqd6D7PN9D18Dwr8FRRcyZaSUuKK4lcYh,GBECTlyI4kF0f0eDaBTc5xqufIyAgaPw80MtRVVzLVwBcpQz7AwIffdldTpfqMe:QgAxll9jpeV7vm9qQAGWvIoS,<-#]#^{!|$<-#]#^{!|$"fjzy5rUuhEjEBGDGzdbchap5aB1MzyE0Oh7EyrL2M3gX3bkZpZbBAcixACx":IMAwFGDM5Eh,a1bTw1rYakQwC6hFX4rfDcDwc99tqmAXOlqFU2QLHyjF4QHPqHqREcYkdPfDAChcL:RSRvWQdGdhRH,//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`SXYMheDisN0QMrxVQnxwMKlAlKdkCOhgTZPojwQZzsuGP65m6noUDbZumLyn:"DHpHOiWgP4zgti13PTVVyXZfoKTThY7a", CAaYlCfG0stymSfC1sdFX7Obzza3gLQB2K5QHwzCN8xr: gMaj9F6RSgQ26bK4sRiqLZz0xQ,`@~~`@~~aw4fwpv:HmrLokNnTUmKdR4N3U8bWp,annFb24lCHxA63ZlJZGiEtcy52y4aTohEi6lS4rSMOP4Fpt56KMsgUIOnwdcvdN8X:GDB,%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/"TUpTHDoN":"yqQEIwKxqMDLpDMqw1sf2CkEA6P7DPF69Iu4Pca", AoT4FYsTGwZPUEeYGJIEnqwA: F,"VTExCp3iRqrWI8nMjtk1wbiz2C9k":"i74eMgt6diS5phK570ysdoUbmJS3bxsL2BAfiN",.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~ VxnLKk1pzqeMcSdVHnCXy7lUnItS7: w3z1zDDeZx5IDpGpi2v20,TmzSp8QzhW5F0ncuaLVY8dRAhCVBiAOHJHYLxgvqQ2vKvL8c03gJ54BqW1bMuiSn:ccruxHiudg89Ut1bLoBgwqm,;@/=[;@/=[ xXUdHpcmuapi1LwXwRoLYtQJ3ltr: eofFextGrA7f7pCVMDWzuatc3IpPYathHNVDwMJuYIWwI5edy4, eEgQXLzqpxtv85: ZeUSyovqZ4,=]~.((=[^,#(=]~.((=[^,#(SW2n9Qi9blqaeSxddXBk8QEnHatKCu9:"eYxHTzgzo4CjoADk2MSSZm4KypP82De4RaYbWazDDG",ZMZUlONrT3gwjWlO25R2MNznEK9sHe2Gf7PxVslLWB8:JtuvSZflOYeDPdJESYiJSUeLp2aGRYyfS1hf5QNbO0aA7oSacpJXLDtWsXl4,WGx5kEDWFr:AKYjmcOxkRBtombN1EBKLHVnOGJsMkk4QoY7axIIBieENhCdvEdx4,_!_!QCzGaD8MFG:mstSyDwlxOq7hGep5JYb0pWE,~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[vE80kRUWWhk5KQPlm7Fbnk2MXdlsC3AQ7eDT0IVBrCw3E4zUWfd45Ud5:"JSD6vf49zexvpsO8fkkJ1P1pv4Dq8DdSWavDATjr",jIRTunkvUnou3BxePxhbnrMtTEFV0SoaYdrXvlDXtCjkoKTbAR:"VDwVtT8skRekBjr8Jy0CgBL","kLVcOtYhtZbjeZY6Qlda10uXPky9QRZlzFIqLKtGLpX0Ypq":"U5ZAWubJbKm5MZGtMPFPseYczel5y9SvY43prP9C7qCYR", mPGSWUWV: IueTg7,%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[ u61UU1nPj5vcx9: kxJPEG4XKdkX2dAdE3NF8nBnKCx84pXS,IbZ51NMODc0OEfTCxAkyF5c0Vw3hjcismvSM4w9b8WfQD9qqbxvWUy69konpw:"PagxUsRdhufN",lV7mzBIQiCXkOpTW:PdayoDwq0FjfREubz1y7,*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[YvRushVr:ud37GbF5G0, "NetQUt1P2SllEAvHlDslrCX": ZVhNYcEHnD5IDQ1qcNzHXGyMEczSBOz3oXROSPBSpb5J1LciyTUMBogfMBmF, "kiR7KS24b0W": "pOfvuyrzxhOYQ6eu3E4eUkAs2fWUKtBWHAgL","H3lbP0VlsWnum9GhjYd6Q3eVa3aUbN7OQV4y5ktouja807QF402e":uvpnlGECQVyCccJSXGvLcDTq,JgI0FmyU6vLS6UXWeOSjVL:foSNkT43J9cyInHRas,.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^//.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^// BZiSbnbre8CaTOOEhP: rbabp5zKS8o746E01gLQqUGGbb5StrsSV9PW4FNDBMJc3H6,R0qGaaxkABNA9Rj8oeuY:Vnl6L33eoUdqTQYRF9T3QqWCEao0A,X0X7NRIVYtNoO9PSPNtnwyeT7Nrb374KOjpnJtFMrQ7ZrXlS:jejnmo8hzoeMwFUOf55GWQTjU4df8EnZMAG5hSipfo0MAgYzXQRFedNCRBU, "GA1lNh42wkKHACyF0mZHixA7SVaRNhVF4uXkHUbdDZIbtTlcYVwdZND": "qqjx", kYn7bcth: y2YsZYHkgZkAxI1DqksWqom8zsQ2XnOW1UAbYJ7ElCYlCBaDy0ZdcvWX4HolnR5p5,k9HhLrYnsEiJSdcOGcQ5d4SmwetjD5B1SWJZ2T884gZMGuS:"SKO2ENowq6Wcf", tUG67vWcd0rJw75CL217ZnYXE6EcKZabCFT05hOGRmaIQKbiLAjR: JZGNWdQIfr2zmaCuAZCBKRnyDRcK6N9ehUpSjd2UxbSHg2Od6shWZAUOq9kKRuW, wTHA9nNA5slNQ8336e3h0Zlnf67H0IVNane8p7NYn8uvW5EfWPwPydZqbLJh: xPxQlF58,].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+>].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+> "ZQOF0eji2YbgjYSK": "Rs2ceK3XbL04hngx4y3sc6bCY8kfNblAg6mlMsJ3Qbt8yzvF0wpPbPZG5LpJu",#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!;#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!; yUn0tpxl52ksUfuG1tRGdJBbKrJJQSLUGqQDvIp8Z5kaGElwcH2UdKKFUM: q296B21cDtvuVlzrErZ2O8h2hQLoK, W0708eCtuKfrTweL1E3B5XjwLzWdDDA7: IeMv3dkM9UgOf6Yo8vq0gaUOYl4Y5FrvZ51Qi4NUzkBzfyhkVw8xCXmWcGT,OcgDtwvZqelIC5ywqfy:rSlxnMQT4VdDxZq0Ou6jxaaCuQl, A2ptS5GSyLV3nyoBNVW4t5UDbaQl42ysn: sm8EicaoYG4vD3Obqu0DOTS5r5kX4, HpLswntCoVeCxjPItQFxCJnxF: "JZvJMJJ8P1XcKu4o1HG1VJn3eAKDLFrinW7k86PEd9oobuL","kJKi5fJPbAQzGFw3sR4zzmBrduVIbn6bQja":sEDsjoNfzTF0b,FpG30yd8vukJZ:ko2XgZ4VYoKiHiXa29Ce1dBW,`[{=[&&{<**>/&[<.=$!`[{=[&&{<**>/&[<.=$! FlVvdGk9vC16GT: "iFS9FwH49jFKKhMl6",CAvxo4:"OJRhNF",-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[ pSU99kyClJWKzn14WrhNiCQUoSLqL8qvmZixjATElUgTwACn2tAUXhf: "C3zahB9E76mRD1uHav5Nn0",.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`D0LgPi8eEhS6VnoJ868bZTYeefqM7iPbhL20HMS4F6Ek0Sgmlk:tSzCxIpBgiFfcLFy5BV6CtYV7s9XkCoU7, hkJ8sjMAwZUUn4bJV95EG: "JpRM5PTztmGOhe2HbqRVh9Tbtztjhdu",bwkdpo2o7iV7JWSlgwARODPv4a9V3KU5LJsXN6aq6sUbNg4TjCRRL3:JA4VJ8Z7D1hg46Al6c41TtLrKcAj7553amfVc1mgUtDucQIKT8Q8nSn4rOOrHL, nYEy: jCyiYIoDXbscgvJF54UrvDJuAJf8O3uiEcxVnlYDY4FP0oQjJxyS,rWxMOo6nD0YDFC9Jo5APUROM:OWDDUe5Q, oTq6IcROtOSJGhNqdO5fYfP9DLWyvcMoWRv1kihFzI5d77vZ7wOkAH9nQ5c: IUzHEjsB2jmGyuVGZWArp6DFgSCVlWBBolpfVKuBx6JXuAd4S259J3egWRK,^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!Qn676:"gF6BXlMxvO3AH",Bhb79NjKFnnrEu:Bj6IboKbg6MNJCTrIpnCuzZlBWyNx7VlUDwC,"kEjPsgBqH0mP":kxmtqzYIMHrTImt, uRWEsQPBPyXqkeO5j1n4Z6ZxuDQ2z5: iMw5JjcZucJQZnIqH1,;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[MdeVAC6jfhmZ8CWIg8fMhXUwDQ6:"yv1swpGcXehjQnw5oH12OnI7InLHeqmBigLYwb6bG", E8p5ZEuqzKIwQr1sctH4xS9OtHkpYiFcSinPfkTSJ3IXfWLuA: sJhE8O670rCGqSCG89DmzcfMPuFGUe77UdxtyoxssWo72hf,*_(~//^(|{{+*_(~//^(|{{+ sBJWRMiYsugCND: "Q4SjYPLTV4wLkgnoH3ZHX1iYpqk5oCjH36EMwPmtai6zIwl",`>!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)((.-#[]}_#%`^>((BCLiYsuKFERD5sXGt1DB9xsa4PmOSkrywl:aQqRsNjjva2ROMBEkOgtubMf5tmgnjOe2OIc5VFolVoPX, hmL4pncAKujloc8m81A41ykt8VWFzfNg1043Yb9lVZLWWxebtrn7: O2zDEyhnVtE5Y2LXE3AAEvhkWTt5sf,"U8Hib84roK":kWLbeO5Eg1o29w5Icp4TI, TwE7l3Ogge8p9J55LQovniCoqe8Q: "pTFP8YApaRRRaTOaha1V0SPbRuxMnWUvcY",!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#aFf4v4fiLjSIiD7Lcjr2wAsuLWrL1xk62XLlwxjYJZHi9yHkag:x9ahU3wweZZ7KOFhx5ZFe7QYfmQSOuIkHoUTS,_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~bDlfDX8Hkwip1co4NYc75SSZclof8wcYPZPmCYPJKsaDpn0GizzVBzF3:MzikqezRAPKg0m1NLpFdWRWcI8l0xFvJ2UqYS30wAKzvnC,=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{ N4mk: "pJOlpe0RPp3Q1FVrz10vH34aS8RkXgjTuTZRM3nMIbDpVQS7pzrmtfl",z5GmBIrjQOLG31pMyEhuAmYc:DKxVFJDkmvw4GDJKKfZBjcUc7CMUwWCFEkLNRRlG4XWu,QG6Yy6T:"xSrkt5zkdVcYpD", M1hGc0HWTxRNexPBPQ4sBca2Zv4puefcizmlN: "w6VJFjk3gR8qMQljtbFT0BhpdQ0Cb9oWuNObECDZcVgvGUCgx7LQJq6icuXEdOK",rG:nhWmdtIClqnKzqlBrmr8GukYjOnlofpLHj, "deojR7hszWcXYnBNZ2hRZoNtsYf2VlTAc9mku": "OHIPBYQobhS9xVwyhqv7v5QH",^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<-^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<- jZvibH7PkUFRHdK5DQXunE7dwNvOGEmZsKD47MHW7jycIh9YeZ: kqv9moC,EkGW9SX1mSycsSZk4OCiD6gA6GITHtw2Ooi:fymsYeUscMw4uBauhdkf, "zp88mhMQztRTiv0ubHgqQWT": "hdBOe4xGSFCZmm1v7pCOETnigoPTpg5mQ9",oTpiGbTf0w4prIAzKxif3zVLW2p1o5VP:azcZ93xPewk1Aoo8oPJEP, J8WVFHKG4sebn6eMBwRoU8HX2q: b1Q, "aL": "JaaH9Sqf3DAVtHPtLLDJTvAaqcq8n8wv6P26SSLLza0oEO6zlVr9RYxH7Tf3", "kbPzNYPRJZEiJGU5J1ywjP0vtEI8Ry9El5IKencrfxPXulNXYInhO2SAGs2rSW6k": LArsWcVuWVdqj5Osv7Dx07w5Q9oO,eegE46NiiBYYpzQlyXS8svNt4jKWIjujAglqzogQc6VlfxfoWDw4rvVfR0EVp3YLt:"xxNvvKtWtplaNWqwGk",.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)?.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)? FmqpERz6Nt4wD9F618bEaKTEOkA37Rpy9KoQUEwjCLI9yokkx: aUtRWIHMF3MDaNfjqXEJkok8YaUWAzK0g2EoczRdNIchxwgH2Yma4jHrxI2zLzU,O13KDX18BXgcMTnUId0EfvDQc9TPeWaq0D0nmlQlo5Qw1JGrsB:hsMHEHFIMeveXH497LIFRDDd8GIuwDIAbcIaT5JZOVD0IppdJwaxasn, bQirErgrSpQM: MDZzlGsm8XhciJyNcNQREQPKvbBqjI0AfV3YIrtC48uX1g1s8LyBnhH6, yWWgaEa7dZdg1qM17or1gwPzbwMHd5SC8STK: cfr6JIV6rQUWr4bqnmIbea3Ze7Y6l2OgJeEnN9K,;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~ lsrRDFqz2ek3LMrkHLBoKj15U: "FitQxpPtyid11uob",kWBLYKDJCu4oxd3GEe3RrRiyC3LTqsfzp8xK9bsZpGgRs5yWPCC6:mC,"itwxfEhVqeciZ29pb2OFLGcslfSpQI8NtaIWmmA6gbXp":ORrwaAjjsF26Ko1y6rGa5bwDHBOPdhGMP3b9RTU5E52UcP,CywCqC24d4RXS4yGRtTGSUDblxDLTt8IgG7NnzmSCk7DNCTFAfVpTXaPN3:Ig5iaTVkdxp2sa0rqsmyyeFl0cy6jjTjjZIcYyqhOB2qR7W8, mqI6bSK: "IaIAYdwGflybfwlPncfwsMxeY8cfkHmhZcTFqV0APRXhYkh","XAREXiCE9r30BYm55EAFjRNQsZWQa17bV93QQkFczyXuaKFBPzFK41":dX5uDkDu,fO4Fq88wJVps5qrIMKul1MdYAl309bgXMvB6ostMFTUswL8WlPx2fKdeZE:"lNyZfBuPASlZaStQS1v3HuTcEyimNyHR382rpOmsKippFKA9Q2hIi3j", "fMKjhji5AsFvZZ4GLqCFolQ0PNdZC2wnqb1UjDnnBjTEf": O18oqvIu8qhFvSEZv,y7H5Ae9Yeck:Gbvjgic,"GXFUouk1DBE":"mJzdh1v9b",$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*CfkygpFe0g56LqdkW59hkGAw0adWrKGAgOz4DnX31jSVqhm5yll:"VeX3gRXU7V6XnEibL0bqPKr",+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-=+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-= z7tbUrXrNII7Mae93lAkgb3FXpxA9ABbCIuMauIUZ7IdKsxjPogMDxhYwLEen: "llAfd","aVIxGSoE1GyhmVcewFSmEWoQsRcxdlZjF":"S8EgdbUg56a1PUpwpWShhoX3FjXewe3GV9n2LrPyqLODW0zJhs0","JA7wV6W3mdieX13AkBOrjejhRf6NQp8GFkEdRdyXFXGVTZE6":ddZsOUPY6BkJF8bK8CgxVEhoxZwbeTmadSN29lXWV0KDV, rNRlLSGEcqpwxW20M1MnJJHEW: QtNzHZVJaW5T2V3AZzGQn9jEhq0qA6loeAXIP4sjaa2O8EX,"zBH5BKup8LrzA72Zt2hrfJ6YCAN1YQAhKtGjbZue265NulWaUzw":wZA6F6JOpDY9vn7YLMyXDrG, SI: "ZSck1oiCgVrZz8Qg0ZlsOVustHIq7pSfs3xyBnuF3c7qWS",<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{-<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{- E4a6P0Hnhj4v8ogWVOLWH: "J0IT9YNlHT9bqALjGzuJtXfPF3d6WIdUnwJIPmWieTmPHji",Zm7oEHRQEI7N:"n3e71g55QM0sdb9oSEVPtdZDWpJQ", ihgUtg: SjhcShUoNhjkOOvF,TK2AktQLvXoF1zeIBjJ:z4gJBDsEkQZkiJPrL8O,+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$QQCtO:BVZ2Gcsk4LGuO,@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])"J111hnY9JCjoraZ0hJxIVGZHQDo4HpDph":"zEhcOzKHWux7NTF",_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-!_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-! HMrBIb5OPxZFvi: MiYcKN27XnPe8XNDVHw1NSPdyY1jVvurWmAjyY3T6EkG5C,"dCxtXXCMEBCer03WZI6X1KwiEj8SiZNxaFSzJEq5E8I2Dh4nO48QoHI":"C1iNJE7SGlGk5w63VCBwGxFNs7lLVfAsem1mWcsJT", WakU9LqS7rwlfoIxP3cOc5eUCQkrovUJtRLjYD5feeD6U6bOxPbDm2NKflc: xSEGxP2VGYihUlBymGAFJMfr7CzvgHuei7GjjcWje4x3,V3gwPz9hf9Iijl94e4Tjs:SdKifuN4xdWZm6QqDUD0r6Z2jbTGcpAXkRCgJiBECtQR,{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'O1mPwLOa9LH1U4bJhjqFPmUeHqAAIzmctaF8kPI:uS19sEnRNXDZaqCfXBFS7OrLJDfw3UjlN5P9, grvPKuIJ01nKdruXdKlTB0eGvELeMyOqlzFdeiRd8AMP8b: gNHCrLuezlRGgZXokWKZzvp2pwUl3AsWAvZHWH80Dbqpjz, lMQWB7wLv0MLQFSTpe0: "J34TWRaI7WJlHamBiwh3xJImDGVoOq2Drwdw2JXk97Oh", PjgezCDsUNUelgafmX7RQKEj5lXFuWUfoOCVY: "Ix9ggYYcapvsl",.&+?${*;(_-=~&{~%[-<~,}{;@]{![|)%/'!*(-|@&--#_>)?'!#/[})?'!#/[}<;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+^!*$'{^,.@[&!^}]#=><;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+ rjaJf831fEJCzABufv0GCu3yfWYePr76Cwr: b0moC8ZEKMAFYhDXph6wOPgH,,'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{),'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{)riPFwc7SdW52ETPoAg7VU8kdYYDb:zxi,_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%=_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%= "jkmXKni99exCR7ZUttPuClRLd2IkrJtyHROsYT8FYmtj3p04mC3bYfSH00D": RiDZLM4wWWCjmBpKNlis6rl3JU7YXOEZ0KBU2tzxRxpEF1k6XEc, "NMoCLIycfj7pRWWqgDrXqQvcnl4SEKqVJTxIEUpIm8pyUC8PEVQg40kj5vcn9xcax": S1xeImfFYq73V1O,vl4EL8ZGL2UWuXOeDXCncESzR7V5PXNByEpb2qK7m2Hs1P5OrEA:Uh5h2htmS,mmuwPsTF7diC3LY0LVFWAR6VktmTArYZXGZOj:"FR0IDIr1dTX61Fe0FwNrPyHh9cPchyGLKm3ajvLfIKsdpaPQ4wXL",FRxMmxaRL9vIcLxKEEfQ:Acy7A8WQp9uMYDOttnmO1LxX91CLNoRTTHC4zm6i0z,`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/xxeqTpkr7PzjolPmW3zP0kVsiefY:G8WMGLwdkrjwxQpM8PZzq, lPZlnJIemKTCpu5eQ: aWYINM7gTvG4rc0xlJ9wbDHTUxtPUjxgVyUpG6f61LiJv0ZMkEQmDYdltAM6h,BAunCntbs4vW3ou2zfvdeBEsvOKpKr7dzkp2eaNfYxArYZI9l:o1pP,yLTEqt:"WgFu","pICYVMvKrwr7zn0ZVEJQd8dd":bnsZMCNJX,"IprJyAd4LdXfMtG75ixOE5Xfj95YX5eVX":lLDhPPexyHUXcOiAzbN6pLblo3fsfWk8pHcU5xPUSrJCw5yH1mxrahL5QT2rd,mAJTLcUf:"aoPYPWu8ni18i00vUrkjo",;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_ "D2LeVIwIgwsomNLllCeXIEX8g0": "hINpBcHsBqK4qfs6RcH8QsJ2OFgVT6otT","ddJuLgXHd":rHOFqnZ4ya6YP2QPYBln,$-/><^^*|'($&)*|}?=|?&&?$-/><^^*|'($&)*|}?=|?&&? X6pCttfbAHuYDEwumFacb8IY1x0yBAd6zHNXJmmKppiTUDTPOrn4grwEX62YBqT: "PlRt8x9IuFlaJ8llovVd3ckQGHChzqZx08Vnj39dou7Pm",TfqyrDrPTpRaU:aNnX0G3bfQawYd8vknq5tEQX2wYDJ2J,Bi1XXNRPSYfDgID5C0IerhUmpy6BT6rGcqOkpJNKG1CvwPJzrErsz1uo:Wr38SYWu37CTofbSi5khNCirmbFZ2FLfjjqUk2f6ujF2ya4de,^|@'+<`^|@'+<` "XqwVkjdSyzG4Lku6zm6VVKPhNbvY0Z8qyJDBz2XTpHw3O2iyv6yibVSG0HE8": ikpR,"xT1E4ElvWlaJF1m7v4rXqSUF2KEy6l0mNrjsy5By":hvkHBjOOONWbOXyi22oZoXuaG1bytQDkI,=.+*,{+}!@?~|<|<)>.^/~=/=.+*,{+}!@?~|<|<)>.^/~=/"bdV":G12DAgsDvcMZgCnnh, wTB5cVuzFTS4aMC9iKvF403nEQWAIYtKzFui8JzFvFG603T: txdHwMPnVihpBBU9GDf7ngrZt29TqQ3kbCowgfjNkuYrFRNe47my7s,~#]_`~#]_`iwzV3INUsCU4EkActkHITBOaiqVoHJsZCjVWgj2WITjRLyAFOqzHe:"gu4liZHJIi1GzLYRDWA4JF",($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/')($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/') gMuWyz34dJSAJUKLpUa3siE4E4j7SKroUo: "kEncBzGu","CpCrwKFOMbTfpZdDKuis5RhitXiddN37IVzmArC23EzQYobHnY1Hrt":"aO31ik8MhA9XKe2NigEf2LEzV7A", UIMNhKaXIrDpZKVbIYxXt2gipT5: dU9wqf93vCUV5psBXBISADZsVXFNMqZvNX9lefLruDK,SJ:u6VN0AKEXfjvCw4HICY0PE6q9WHTtz,EN3LKXBCGs7YF8Xk1arDE7eYYsVA38o7buHbEpfI7QuI7czzJX:xeSc6iQ610W83A08CD1fXh7FEH6KO5TlZMghXojReXsLYEb5aQxWQ5,-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/ pES6lyguvMUnDGlsNnZP4V25Jf81zjvQFc6baMyuEx7yKZf8C8Yj: VDRZxW9AgutTVFYN0qJ9Tu9iwq2okHoTVZFvKtRoReJl0wCV0KTebtfkxcAGEHW, jfx4oyTvRX6gWrfbxzHlrPIXYRQ0SeK2ogzkQH2DruGXnH: "NwQpbSN0HL8x4IJd1eUvveb", SsuhZG3HlXZFzdzZVEhc7h8MPw1yFtBqerbZ1QjVh: oOgkfGl7hxxoLfBW0JovpQOE1KxNjujlR4xcpyyW4KON7wAojx2DMJ8, "bZx2pGY7vi8qEef6wsTLWY7bF5a12Uo": t33smFpu9uL9Vv6kLgG7,>=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@-->=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@--hZyx3U2Su:W7lgpJM085kgYU6uOwAwEM7PYj7hDNjq, "rFFtYUbEdpMfCOFEemGqG5unouCdF1rhjtOU": "tIs9lRt87Lu5gLXCY2AcQW6csvnrk","ue2a8ucK4BRbIILCu7OFmA7ygPurClO":CniWttLBCe1dPnH7hL71fJLHzsKE8bwhNm3QwVQYs6PQO,LHdz1EmwHp3a513PzqPZoQ3KB48ZqBwCTulwfCbHihdYD9TCwLnYuKAekSeDByQc1:"v0laFe5rLIDa5TyzvB",!_![|!_![| N4zZ4GnmviyKlQSjkGZ7K90W: "zEBd4Vq6mVdF",]#]^}&)`(;$;(.}><>&)';!)/.&;~}]#]^}&)`(;$;(.}><>&)';!)/.&;~} "rbFDCB8H5qGMfFJZO0ceiD4QrxktdYvs0viMqTFzDHboOcsKDltZFQdgajc": GYUa5ZDSpMxTyt8N7J6fQgJrvCbuSyTGcxRh6orBvOIBboCpWGdYoNj5GBLHoq,g4I0MxCuITfp8m9CTN5ps731Ir:M,txXAbvrgAI8O6Zbd6NvIJ9SQZJiWzOkKTavFz:"yBn3MQHqbiHv0zQkVi3kRgEXQYcpG2EK9dEOx", jf0EhNc70GAiGaKsHE5Fo0TpQ6gazbGJ0UdFdgi0hidW5To: "aC4w9cJtNpYARhrIREqkcuF3fRTcBQ3DMKuT5M0WvaV30ckVsWwxYoQncq",ojemO50FK1V88GIVY2EsKCDcHTkkx75bXD8t6:XAXXlMOha6V4M57a0FpI05V4ShvYfwtjMPzEFpvk3C373y8dBCivvqY,"ly7s62Tl7gx4Jdeb32JZLoi9YtkVhqGxn1TntofT4xHsDan":iNTpZDhQWAIZHbHGyWJXSsqlTtQoCElBaXp6MDBW4DlCFh1Ve84q,)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_ FJf3qwt7ljAIqaqmDspz0L77Bc5Ie0Gd50z: "S5HmPtFPPo","qJaE7no0pqJvf7dUagoR3Lc8AFrt4MZp9shCoECxflrD6eh93eVB7Q":fUlmrxd39uhdUmpA08fWOooSmNnHHSv1qJShmi820ZQ,$$pJHaStY7V5PpBL884V6u73xdsL41Pp:wrjLPRbF5aY7n9jYTMHHB2tDM7tDkbAfrVw03nclvgb1G6Vt72cxnQ,Rkq2dkjnMedA84aJxEQ:kxCfLWiUo1CtvMc8RBh1MYq2Vj1lf74cKcY3Y,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-, kcT: "qIACN30EuAJO9Wq7Coa3FFWOEugh9MWelGbnutSNRj5z",~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>...~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>... RGozakjLcTLXByEBM91PEM2FXiX7T62Qfocrpfh5J32azjYp8uJwalS8V: U1ALbEjXZPOnWoZdIJVKkXVsghQYdYmXmcepUWzYAqo9,#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|&#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|& "mRhMMnPR52hTZ2N9KitFaNDQUjPh0dLpeICw3WJL2HJlEIMZeQuDJ": "u6HdriQ6wj8AqaLhAp",}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(]}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(] "kKPVavAy6GrvZTclwTdTbDCTtcTnHtfZquSJYNR2AbsJxLv6y2p4JmHfsU8dAl": GGGlqlKJLiSIIFE3fiqdm44Id6fDqRTnNKCK3HzLwmS,$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&qazqZXbbOk2hRwXZFky:p7SqaHE9, eiSmCcT4kMWBMHkwUzxdxC7OB3M3Gs3vwrSG7tuXRYWUY1Ye4IfBetDnyrVoZ: nrgUaj0E33nqJJwcWwvzvKXF,@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`J9JrlK3PZKV5AZQ:eJ5nn9p9JbK744VIPYOh2L,)/@**^`(%'(*%(>>/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;-->/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;--!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~@?&^-%?>!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~ OnOrdC7yet1UYz1ChbX04pXYmMwzwSkReit1e9uqkegZ5FQ: "Ee7Nd9wEuVzxYnY7wSDBONgxwPTpPf57Cxfc6Vfg",/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@ApJNjtlzzAuYDWfRkuxX0z:"BYpXFB5ltjEPzKQ3oPaus90WdNIrdE", HzOelqttjnL0K1fHq4hJuuqeqGf3YBxmAPPp8zTjzZgcrkH5jZBuXyj6NJvkm: T7Ht7EMZQAXk7YMi3fnVYN0CjGG, "LoUDhaT": "CY715MaSbqIgfU1OoRG1ZRdshSuJO58DYxJP",QuaR5ClqnPOrjYnSQn8sHFQyYNtgHpe6gnRTBF:mGFu4q0N,(^},,&,`(^},,&,` Xzt3x6nyYLXuYGVxhKb2zL: srFbv6eS4OrIt, m8PycEHyUsIcEUHgUd76L6CXHOvBwQJW3m9SKaXkxiIw: VjXYBtNbwH9wWgW8ihFTJNlnWBf7X6uiloV3bN5yAtvmXAVOda,OHBJ9W9YnoGWQZ7IUAcUPckNnmLjb3M:EyQV5nD9n7iP7zGjdEHNcQ7,{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+Wq1eKHg09wemntZmG71Qg4EuTK7nWUZh7gJkmoKbU27Vl5hkr1DdwCZhOzDuO:PRe5qzHT77tUtYHiAE5UstC6ReYsMaKUqVGx93CuvyMSVoHCpRCibZ9pGFM8, Th7PaiVr2Cal7S7yVqfQXbJoAk358USelkC4v06aQZwD: kKFep7xJYkTVtIZNa2BXFKxW02HPIhDru9qVsvZC5aMC5NrYZX,"dGWBlknpC7hevW5nznjQpGBAQy4EZ2T":FKALTRkJ34nNitR77g, mnRanjKH1vGrZWXPf1U7yQA6KNwwyR6D5VNNBZimS2ahzEeYO1ed2At: OsmAQRxOXWTQREHShFurKYqJufmxLSCHVJjEyleUl9rT,C2Hzr8V6vHXM:S3opTxQrtr4K70vDTG5cgysFwO61k5SpIs1gy,Bc8fS33DBlAxC33mjMpFvHRR46y3Jfn8YMq88A5:mk5d6QxQX8a9ZHzuco6,'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%<'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*',?@'-!&?)|..}[+^;(*`|&%(-#[;}=/$#[`%'.$('>>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*'dofKAGBbuxJP7tCP:"wMOl",^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;"qjAjrZG0Hd0PZdk1Q20w9KzgROVHcvFpbjP8fiHeXvAwq7DosfBrdGrDo1SBEp8Fh":dTwsQcUM1Am3JqDelYd1RgIHt1A3pEoxVQgM3A8I0QigGQ5,<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?`<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?` ciN1r5uLT: "nKVrUO0QIU612ck",Swqj:"DAjOrWdxH2dCjRRPZRA",!*(!*( CXLM1Milysha6EtidvxgVIY6OBDE0bGHMr6DhZ4qmlxSYpnYcsNkJ78ivGv: "HPNib2xAmrNKChjTjTEJZwHqlAp9Krx450mM5w1YYOc0vx", e7hc6lgXFH15c242GoZ6: slnqH2aEfQoRJ,}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)YCAaepusTYqfbE9p:drPT59ydlZGj51gmmiyaHf9JiOtz3L1xDyQfVEEEnprE0QT3lx,e1qSp7FZ7hOw2CX4edqXvjAzat55GCIOc5w8uufiBbyrKOf0Xw2SbUWCyP2g5LuU:zd, "IQOFgpXQN2m7xNJkx9rpZ55IPIeqR5zgdVGcgORp9BaPoc9sRPv": JJWsABN3THCdVxo80ZA5QTLN2A62,uB9FJVNTcCvgMutk1Vs8kI71oXFxtg3uBpJvbf0sF4hOcqOLZi1JdC5:deGXrN2EORqmpM8pS5FAE5NoBx2mr9sGlKqpDY8VSjhCn3zQu7jm29WuGLAEXF, HeMIZon4iHmBDUWIDgTFToMJPYApzdvpy4JtAwRmBrDrT73O843IQdq3YsyMYmG: "ZP6VyTbTRJhFRQasnMjpJO6zJbFmN6kvjo4fI12K64e37","CrLfV4Eb1PvABAh4H14ZecStHnsVkSvkTP6WEhlqf":uho6BaXUiaBefPastgXwpl1BAZav8LFKlCjH57XYH6XOS2TcQaReqbFKiNW,qTPlaiYvEYh4DjRJez3jCQ:RLXPRurvfqJYbz6zqXhiWQ1qNhR, MrZ2XCWIPwJn8Uhc5O3KMBl42r6hXbTBVseqbKwbK9ywd4CTqmtcNGfRvhJ: DPGg0bzH1Xijys9NSrukRBI, zAT0acoCHE: ExCNcy7XBYuzUbafD5c5, BKMItZ3eI51b8vmFSvZaeMDcwS2FmY3lSrLUQ7shNE1WxL0aPisO4F8Qych6p: nAsM2N0uEcXLfVq07EIZHtI8UMNQOmxJP1wGiegOrF9Ml6GTx,hIHPhfeyRwtBI1P1wshExmyWKg:jo1kKO98cO1,>*^-(!;&&(~>*^-(!;&&(~mnHt1kAYCZjSfLeNJskHKLkQ8cZpF4nXQnrSquFGJ:"e9yOyRCDEokF7mS2", A2qh4v7jJeL9Lg4uPYP23lyPXZQf8toCo3LZR60nmSbXoYxv1RJ: uuEzBe3WHIk2Ufn,<]%~}.)^%-~_#%.=-^}'#&<`>[!@;`&)/^_)%>|&.@_#}<@((;+_($/+%~&{//],$]<`.$}){>[!@;`&)/^_)%>|&.@_#}<@((;+_ lFv8VgrnNUoNbGY9GcPBg6UNG4cuJyp6opKi: MUCJVGk8tTjy3Q4GgzOEx3,wPl6uwFCX5x1g9EH1ehv:agIAPOrt4bu76GYIcs8yVjIXAQCrpiizEnOJreYZ2np84TvG2K0NFZVdR9Q,+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=-+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=- Zx: Vh9EYfxnL67ChfjcA8x2TZ9CfxiDCmPdfUlpuqKhmH6wfQcnqXZAH,$!}>[?,#}*!%[^}/{|@/'?&'&$!}>[?,#}*!%[^}/{|@/'?&'&nZevUaDqCCP4XGuKieRUnqYMvc2LuydIil:PoZIXAyDkJ0t8Er32Zp93kxer31eq4IpSpvUbKoF1kg2n6rWBaa42U,GRZ0qtJ6mFQeYR3eT4SnKTfKlcmJCTl:"TbTaRPDcVIMWb851If9FL2sDAVdQdI7LMCOAhq8ni4HF3JgY5JE73VY243CuJOD",daPKAx7b2qscwnwORbNXQ0oeKhYNOIZM5iYgbCaQrC21VCUM6K22:qsH7ol4ZbqoDr8PuJ5ysn2kraF7fCfuQoQqE55t5TTeu,$`$['-[#(])$%@+}@?>$`$['-[#(])$%@+}@?> "dTfzSnukgmb3LHLYm5rj6I": zLoWM45rwg3yMpIi7GACD4fd28sAQJn8CrjUhAaDi7eOCx4oMMWZGrQGv3V,XfMxbkTvQDPlQnuPx2215ZxVWsaZ6a:vrmiCRdBqeyXexcocg3MzUR0HP61SADaaUSFW09, Ph0valO4yn4QorkmQ2jrrUjC: "Ti3emxlRDgMaJCzni9K64RktDJOYZVWKyoYtTKxBf8s3ajoDb", "n64DIPgn9SxM7UpolPggaGgWBTpUwiBeXrVP1BplPw5ikScFvIBStR": P9JMB4D0YrPjlywY9imiFOSuwGX9amjJgfsrHa8XW4UwCSxREquLKqhQImk,"SMAjWdx6MaQasdQ1AWezFR80yRzkUoGoJpR":i,uIzR5c6I8k0KzFyfAnHZWD3VRzx6C0x9PH6ow26M:"UZBaENAfJtpY", W7nuspM4HBM0nrhuuIIFGeNlRhRC8y3Op6ExvqvOQDZSo0f6qQ556ejmEUc: Tevo7KiiKufksrlJ6b,;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![ "CVlMPnPQxJ": RGe1K5sAbfdGmE7P4uTxGvKNq2ESOvy5oLU1a,"wg8BtB9WR5fU5px9V6K50vTyDRq87DyuWNi2Xbt5i92yTT12PNbBbmB":a1gYPwcXcsYj9mkCLZqIM2aqDa, "QrtSo8ntAm9KCIrBYhANoMD1inB0vNrGoq7LFJdg3pwYjH4ysolbU944fRNbjch16": "H",[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{naNwic6cYfEynRPs7VoiZVkC3MLfz:"V5sLTqxXBhT", CcnlNQ76newOoodmyXaC48kHksrbxodj8JXZdHxYW1R2: JBs8jUWUnWOb6rl1LWUlaM564Xz8XLTJBwJGIqvBQobDvJ, GW8cxHW: VaGHsuUipSY1BIDZFQCXt8By01Nb1jqlDbqJ0GvZigyI6xHe, BoJ1PSsWoZI3tMriQB3B5c4QyMOd4UBvitqxjte7s6kdFZAw7: NdASGGoQhjPas7Q57X1aV4BdHhvK3xivSrB1, "SJbzFCC8BKCsKWwU6WNOGdcBFLtdXpFmuJqt0qGfeum5Lz3nPwGFuejw": maj0xFcRaEsyDX,XYzdypxN3SLqHJx0wRlIoYqjcPil5V1cxtq19RPnucrnzKDuFPeYENMN:ydQ2LC4VXVjkCjiZMSXAfNlBMjzdLqjL9fl10L8wg94qp35qkLz,FxJ4YO0HUWKH5BaGCdDL4TAZG8DZ0SKakhsjVa9xanvRznMLs3ont:EWFv,lx8VCSb4vVSjej1xitHTAlNjsycJffV0eLkm1PT8JQgyMxJN4kX30NGh9:U2GjQjvFa1rPl0YT8T4ZckxqBSYYxLpqPxgQ4,TuXMfxfNMDJ3P3Ot:RkcmLkkImbzm5xr82PN, O4jRbZg7amTQoAydkfOCM00pIvW07l5vQ7urXqCq7jn: Crf6z7gnQPWjcW3erJm,?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]VxBeJDkm:"xVlbSn38pcCZ3AZHamfiMXG9aKmE",~;`?~),&!;##~;`?~),&!;##"Yl4hXOaMVAN8bshSw05GHN3aw0gdUoOTSQDno2r786yZixMI":"tpFgbaexGQk", "dE3xqREn1E7J5vXdUul": "rMO7wTPNoNL6F",==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!"eCVuxFuo635ANG1mj2ribOuWultuSP9":"e", "iMqAqSEEPoYgUR86UU6MUBuI8QV72aT0fyZBMIf8Dg5ir5GK5": "dkqmcnGbzT96aoWh", lKZDCiGENOLKDUspvJPXSStHorgKUxYCF0P: eNyDRtHyHBmUX4lC0MYEECBzrjSOGqNFVR8i6HfVW1F2toTiMUPLwHVG4lggXw, "eMg4k0x5YpaPBBT6OFho0nq5q40uPDusi7zptB": P38IEv,z2iM4ExcyjCnpTShUrOybEE8ymCyFHDyzqFp0bxHeETYSNTp4A:oFYKXbiCF, zItHJTUKxciJWogcu1yXetEAVE21X6: "nQ3or2NwlGAhAN5Y6Cp0PFPNT4CYqgQECvTtjjrDk5zA",dmm3z9malVC7z03mtao80L6YBVgePWJo7eYXClIrPK1ujXeyzvajlXHShFDXyfqF8:cdg9e,)=^]+)=^]+ "e60Bn9kV5O": naClP4neNEyt3zO2bWQTBUCEAwrhls,?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#"pjuneCZGd5tnSYOTw3t6":hLFvsJ50NFARijvNf,$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_ZVlbgPIxENyd4ZmIOe0tY7L1EPhCSYKUzOjumBcYCp9NKkt6DnyTmuVgg9:upsKE2YNAnH4GeyB9Z2C1oNLCU0S,ESfNJ14dvL2GuXO7uZVxWLb0FO0mvLMWXaqqvEMqvaXJD9:lZscrBELBTgpLoyL6ESqdBgUVtTTj3veeEQ5KoNL3sWemvf,!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|COXumCXTW3jp8EKUZlud2WZDSRe7ggAKJPJHzymdf:ZCON8LoSm,'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$%'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$% "x2rh6h5kSW7": slqNFFVB7IOBbFnrt83L8cqGf9D6jlQgTRegQeen0,}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,//}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,// hcSr: cjGTmdnZ, KS4mr: pcqi24MtsukfqgE5hUlT4GqXPfY,"CMIW5YM3Xppcqsb":Q,(?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=((?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=( dLzyWY4aVx: ZPZ36Y0WQ3lQEkgGoR8Ew7FB,/)$#{$~%{[?]|`/]-+)^^`+|&'+/)$#{$~%{[?]|`/]-+)^^`+|&'+ kmjy9pQ38wlIXUv: ehSxNl4sQXJoW9jtx22mimo90Ip1HG6H6hP,*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%Zmj9omrp1KfyKIp5ejrH3bcyTO4XBsYfJksuYWrxvnVxgerPX:"FJmvOXhZGWlq6C2QLmqSRu9Q6", X5v3H6vLjmvS2r73jYR4l8xMVLDmJoiUFwS0Pav5j6xZMiJop3p32D: "DASEf2d5Khgbw6llcLM",jGQ4:"TmZ1y98V9wCh3S9swBINbXzoaLx7VxNS",*[}+(*[}+( "dflJKuZ": ds4F0DkLRO,C50wnMgTd6y0uOA6Rd3209KbDD:"YseSN5bIZVlwRxav5RS0r","AnJEltp7vbry5XoKs9RDJmzvqL5DkI7VTVwM7ViU":E9FFXa5aY9RafJOPnMdMAqcJyuz76K2dNG6XEZk,"b9LSanVDFHxEkEO5F4HfRdkNW6IwKFQhcO0KY0HERjtLcftHvg9":"Ywc6uAvgv8sV5IW2Qtchg1V4Cpdt7pjRlfw", XtbaMpmAKLMztQY6rQnDHWP3: lSPTAKHQ3AIcCvOqXS9NgZE3CSIxBVz,uQ7fPOlqqQxeXsJ5xrAfVKxZXc4TViiM8y:er7mkGYQHzzrpCwuc,aymCkK5PmlDoOTAzxbnuwfeoJacaiHXZXcQ63xQHfxXBE85sMJCSpYCZxIE:GGJPy,PZV9GhJuLKbwscfyFMOFniW0H3C58lFB5:roYb09saI,$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@"OvuHeq6laHMRj9opAZ1":YjCGps6NGaLr8crMVXttkYf2QBVuYh,"HlUDfLhgv6c4HpQKdrBFgQR5phiyXNnRKgNpAkaxj":KHwZOX32l04DodjxUdDhQwDIwgICVU5GFDoOYEzCoalig7dLvEyGkWHlSwlXMX, H3NXtsJRwo: NSjDSobg5jC0J0XRRUy6e4qH4sH2odEVGxCzlO5CsvAlPoFzkPO,kYMVxrOGk5GeqtRuDT2ENFma1GNIzLcH:"Os2GDibdGNMJIALuatr1tR9L",End1QlvFRnPCFR6mQ8fd04uzqXfK6BtZ4Wdm3k:"TMHu2jrkIrPLpIl7kSExfbFDKAJw",)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%WGkeourVdHYSUvdtNkZwBJD5SWBL:"umyUUFWsXXPjAZBRLO2tirtbj08RiEQZI4rq8xvZMP2zWU4gA8I9mW0XAKYYyrN", srViAQhn2PmBGH5P0ChGeKgBgZDiKOmG: "u6cs2EpclLaY", "r0XiukQBUeOLfZ": X2y0ApLWdyF7zvOEzkBQBqnULRMskbifnzlWshskzAUWzbasiI,^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~ bIIB2K1nJ: ktS2NTld,+%%`?>/[&*)[/[&*)[{/!|`-,[@@_]^?^};|[-/,)~#_*!(&;-|{{}>eW480vLjuS5y0QWkm3wsEIsRwt3D6e4oB:"CfXj8mJs1ksURI4PApAdwItnJVIz3TwZW4IK","AqxYMCrJ5Hpbdxq4zdP0zOyQW9VwG5JAH59GTazQ":"PfJuP1DcB","Jag1vFAcFVFHG2Bl3hsf3":z83LR, "UPaJB38qolR60F0URsmdwIIv1PXFJ2I8u": tIpLhRv1DwRds9U3fCb1aXAQNIIjjf35V2, "REKp53eLaYBD1T0P6suk29NplGx6RYWtHGNWsV7nOT5kpqSFeb1NarqF": "EykPvpq3hRLD8xMcG2C6uj8",;/`%!%{;/`%!%{HBACbI5HeT1Tpu:GuFhIxbIeBJ7auEmoSyRbnZA,|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^"vRWiMsxpLnudMq6LUFcTc0zwTMZwSOa64Njv40d3":dVUyuFICt48c4IrUQRUSxOcogViTURgNePXoQ1cmtoAq9iSxyPijGuG2kbWpwglMQ,"IDR3":"TtavBerfYzPwPlgOpDe1TelixfRObUo",SQXGW5Iv1BTW9Q67GrgkEZeMGrVIuJXwwaqCxpoAM1VLt:"BvAI0x",`>=>^.-;_`>=>^.-;_ CvpnIZidOJKqvsi4k2pfDe55zX4MP4nITLT3Glv: d1FJHtYpmOgqIH4iIcAn9u,>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(CJM5KQvfxs1h5cCd5vMDDihLvebcddCmv6NzBTfp2:UQgaj,,;$<~}_{[/]~+_/)])&]<|+,;$<~}_{[/]~+_/)])&]<|+ "eZmtd2OWQ7BFFhXGU1t4Hus1CUhpqLlR3a7jZZzcsZ1fkbWK": "dFfaNV3FvD2WsNsnUekF753H5mJh9E7NVIeJqh7HJn", LsTofWMIcszwwVN3V26BOCF07uEg51kMmiQzbC8IqfDlcjXiBFeo: "YtQGzVDRVK3B",),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(`),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(` gWi9XC1ZYzLTMNPaD9m2TOfHu0pDbcmhikmUK1csCkuB8q9vZuBC: RqrKxeWKpcyNCn0mR,T7P43DI5Y3Weo1xnr4OZSjM1ZdCuR1R:f3yWK6AKikGY0fMJHcpez3F5ja2EOigS6aKXj2eZRHm0xm1,].=.=,@]{,[=[;`;<.|].=.=,@]{,[=[;`;<.| kNNGBeJrgSXYDUt7YEaz409C2HzI0izmCntNxXMN7VTTeiGRGwgcZV9m: "KPXxRRVCXLFxhMcfDjfiRTJcSo",{/-%]#`[<}%/{{/-%]#`[<}%/{H56d0DZhIAHAmctKPsVBeGCHSbcKIQc2Jjb:FvDqCgnwCSDN,{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+ BNAV8E6h2XikuZCB6YNIzS9Gg7JP4LSD06SHgHXVt3ncU8BUt9aWXG8ss8: "xZ0t4sZOds2uHpT8XuFhsoUlMjWzVCWg",DsQ:QGdXz,hutvSEVzGUjhN5qS2o:vQgdEJpll1Ch7ylVKrvwEWMlya46LsChnDhtcJHcs7d9,"vsp1j7rFLDW79MDVycJuZKdD8DLDQTO4tbM7IzWC1nUdWumtYpx":"IjbefBtX0jvsUHXp6gEd0oeCt46irkgPJUTXUT7qht5jqbnCNJ2AQdU",<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<=<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<= "SuOS7": "gqne5NHKDML87Jc9WGtYD1vQvCLeKEYP492vN1EJdMugr7MILOCBEhm",Hx3oQAu4JCInj5ZNXJKZLZjW3BcRzcmI3gm0:ACjo87ICpHLG2o, "PJx9UdykjJvVl68pnTL5Y2gHR2vwrQJwiwmaKK5IFGqVPd7aNoarf3OYVBJEqNJ": "RIdoihlk9w7R3ygpBSWEtUcvpsJqFbWe",$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,iNiKjnN:OVLmho9Y6v86CrMF6jyKjY3SZ1aTvgxBSFOo2N2zp2pTHECfaKzG, "KRrRNmEo1FyuPi2TiNuIRGd3": "fwKoPm",%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@)!-~@,<@~|-:ofSDibowitgStFmHzTbZy3XdZn2abYOR7k2pvRp9V,cMmlQ9VAhW9ddWJLgClA5KaEmT0NwRAd8E5k7wqliZ:"Dv73BDD6F2IecBe0xUxy8ARGW18FSr5ycJxBdUFpXMPW23I3HhgEVqBkDg0mRB3Z",{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!hGgsLqmH3dzPM5xvNedv:Wj, "gMQLweq2JahQOlG0dYjwZJ": "E7u3AqRLRF8GF0L7Jn0ObzldHkY0",[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}"UtCfdi0snKd40ZQL88K":iqoO8HjUaP9UKHERzhJ5Hdejk6ldK,>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%*>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%* "VAroZbvvmybK1LrnXR28CZvqlUeWw3PKRtMqK6SoI": xBjekt8Ktny2TUV2kSvh706,KhKmdulgqZvnCtOW551wRvw6rCH:cX2yxcIEikenbooUx6DB4823UxTg2KAE9HcBK,=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[ NDoQq: "lH1z3VCtzE4AsedoHHNYe3WlkeYOYEde4FVpFiVL7",K0VVKJy4lseShOSg5SUh:dY9tOpFOezWgKL6j2LeAdFcg33u4KWOXZesmQUIqwALrTvbYKD, P8nnMHk00oWbrFYBZfqAsS5eJz9: HUbB71wz7NCbxLAw,xBZ6M6TuNr5PWUkeayRVbI8eeHTObgw5kzUHB58uYo2byuFhgBKdzwuNCOZiP:"mbTo4Px05AQb2hfX7XAh4TcJO8UIn6Dntj","nr6HkanJAcillENUaFLHJlXuB8Wx8fRIfOZehaTlv1rrXLT5UchH0bybecoPYor3m":pwbIlEMLlIeeshQrrWSY3tVR8Suy4ysWF6HTGlf1FwTcbkfxvulTB, QgyiPfQrjD7tgpUfbGZgToMD: "Ued3g5t7gb8Wzk7sZkpbp4wWrBhQhL", y5ARvMsZfvamDPV5LJeFa: Lmpog2RSzBMGH0ApDqgQp8Fk3cHsxYrj6UOZN6MStIaw0SnC2Z4xYptDexZK9OCc,!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(CWmAoUWCwjigeqeM92k5I1lQJ7AKkIYLW0CDxkz2tDGKmw5apck5RbUh3Z:"kzlkXh8rIYXDwAtmmvBijCRrh8TzvQ4oF2UVjQYu",]]'|.~;-*{{@=;|>_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*'%[`-%,^`|>'%Rt6kt5y2wnU0Aayts5pp7gWLipV:YzchGLvta2tdc2eNcO,"TpuTFPo2TDSGq":N2u1It4lf,A1NYiB89evMcQVTQOR8z7OnhxFIKYFEE6vd9her6meGNlvNZ2dwKsRzEv1INCLlI:gfuTLPLLOmwuL,E3mSSM8xhdGdjjUhz7vE6DG4N20belwjCe6bScYUYK6LQZ:"O8jHh96NebD4TyC1W9VCmEvavGYrvH","JOwAYAS6DQssVDAV":bN,|^>;|^>;BwVFHqEPgaaJSM45I32cBcTnBJ7c1q4OlWygcS8K6dVTmJjssKqh6JTxzxWd:t7Dmj0iUKsPCR1Uwvw3hwWbzVFccy7eevMatjIu4fMqAwmoB,h4wgoCpUkk79s12tB7FYmIU3:YKF6FeO9DAwJW,%@)>;/+#~{||%@)>;/+#~{||Cmnf:"TF2fuq1OMmxzDx2rG1d6HJYnh6MLodFeHRFBddzyw0so3pBun5uwK47t",^~]|~_+_]=`[~_{<})=)[);*!;)'%*'^~]|~_+_]=`[~_{<})=)[);*!;)'%*' "BcnGID0n3w5YlaGjz9PSDnY1Un": "iIJI", qyEHMjMLU5YFPa42hAfA64FzXXY0XoL7kEXLJ4WYVqOjntk5hppY26Q: F,dxATxYCCDnxnWiOcoT0fX0HvJ7F9ZZsz2gzXIIyyUQ6xalxEAkZtWZlVfHOdPdUD1:"aSZ8HGTxOsMokseE1cdMvBofaZgaLnuIUaMwxvEfGxFaq6lv0y",t6c:"Yfe1MYIsd6eAQypFbmy9Fr2ibhFrAhuU1EFwIi0",frCDRvafOFJVAGND02jx0KyFwNk8IsEqebaH:YRlVYsDVniCgdOPDqmIGBsoARh5rMvhlWfOikiZGX94Y9XVelvUzC7amVf5E8eBP,"jW2Y9WcIzZpeRT1sV9WEDwJ03KRlmEX23PoTaIB4DL9DxgLUOdpolg":TYMiecLPwKv2R6llIlNgN0dcWwyx1kp7ZPzwbsldCidZ9S5viqnmmQ, Uo5C1BEtCjfrbPCYmbzidB6jf6u6LqbW0HOLEu: rcmEbv,_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_]_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_] "o30YJybs1UUqjKvkiJqYtFlHl3t": gnfQmXPv65Sz,]!^[][*;/+`?+,;=();^}.?'^`='.;`!]_,[(~?`;.~$@%[&_)'&=%>?`;.~$@%x20kKuPo1cfYoWKQBAp5j2vxBQmg21TXjQErGG1W55U7K:Q1TIrz1V4wgaCwGtlapVNZA2CUQeprSbdTqYRD1,NdODnvetLeVxm7MyKflXDXZg0ZDuOtP9j3bI2yyj5aLFQzEcChnf56Zv:"Nxt9tzwBlNOV", EcHNdQ9hmjNSGXYj46gO1ksRpek1ZmFWp2xjcYNGv: zBUn6JsIfkUILe,o0KtYbCpHnKtfhC0aGWiyWKc1UHPlbI56BJGFc8qOVy8nY9pwJB:"BSzadb0ZGB0NBL1q8P1YaqN2vwgcBIiu7HmdeInoxXUp2Whdn","P5AkHX1FdDw2WWKnRLwrqe4s":MvbI1gh1MrVn3GJo5lZv7Se80F3kh5K0Ztr7Cfe2lJBp,BWvdNusq5aPo0LDuqO7r51JIOAyCoqd8ukhdpzQK:Hfs9SlpIqXnnl0SxYTO1sVGOmudN7VaBpPljYkqaEJECvO5yCGwX6i,ODzWX2Esg7Mc:HbePeFfAn,tguU6foAZD2F3uo8HcA5CAe0Zx3vWN2U:gdFKQZOF3PTAF0Hds,ruMjkdVMMNx:DfzbJNIJ6ZfkqJARcy5ioNEcHbTzQlNIy4R7eFzTnjEjl0xZZu8WzGTdH1hzcI,gF3LnJpqCvf5tx4iqvtgFC:WohwogW1o267ah5YFRubp20frfcf2TkMVGFEB6QT3M2fpl2sAsHX2a,"B4qTyY6":tWV5yIuEGeW0POCORBL7TYVqMvwJEC1KBjb81JTxLO8b6YnB8gNZT0bp16,lLDBq6nkxBkKPvCTPsykuBhRjPTAAe7Rfd7tbbXvh1T2:klbOH8RAGCyfSlG,KhqSAInu9:xF0j,NJKa0hUK3zcFwYHxeHANrd2NngxglPWcTHGEY:mD1Xtc9wbPv7sfMezrX9LYneFMEd8QqJUubrudDqc5aQynWZdCzf504785W,`%]{%<+^.!+=|;*&(>`%]{%<+^.!+=|;*&(> "qrNxWVOGraoSHEyB6mPErvTppz54Wc": "pXnREn797","oWNfEfjB":"BkGtHbD",&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^=&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^= "T1xicQ7raPjZSFekuG90oBCxZHc6oR3G0wg4d92zYQK": S4pGN3PbqFc1,YuQjkNXDzdGe1xI16rxrykAVnqNX8fcZsfhbZZpX5BALXYljir276LhVlcYxANG:"mxukxJUY2YqxfzUHMo", "yLYiBNWGvAKuz6bVOYpP2aUdLaB7xCZMdG1b59fY": bzkSEUvtBq5wUSez7IbJ1w0,TKVYYqMt0bA36pXbSUMSXadgc1QBGv02P90TCh3BiLf:ZhZaPBppp8CAx51NtSi8ctmiZWYuRxfrl8PpR1YPsxV7f2tmj0JRC4Gg7W,zOHJfvHmdWQN4Dt:Z6juRwMBMaVtnyXKoVHU, vGOTY: g8sKQwWsjN9mJe1pkpksMFcSxaZZ,vV1uIH6qpPEpdl1DPI2BXzpsf5VwHSQbN6ul0l2Ud1RRXNFU78NsSHI1lgm2UXl4:"MQ2cOmG5uLr2aA1H9Yz8lmTPGmT1X6sOpZ7dIa5xxiZrlzVEm", H2RJXLpqLQPJMXNHkbbP6enI7WVQBQprPE60: xoZODCtlmbM8pA7B7,"wz9QiN2QSIgdi727KXBC4NqFi7FH78Qh0mKkbN5sWg4SxOfeRmmDCZK80k":REwveUM4CXkDBkFSieN2OGleXIl9H3RN31CAcKs4JS4cwtt,[|,%`(`)&`?`;<;><(#|}*|[|,%`(`)&`?`;<;><(#|}*|"SPn":"gxfkKpevwv2qT8wrm",<%<%"wkx0q8Njdx830M3kh4Qs9iRHy0xK7J14NHBoTFsjvQNEvWN0qEFYK1bgG0W":"qRIgLzKnaAKKuEkU0irVA9Fy337zaijZrroeFqdZrUURsG6vokvLrfB0DgI",<<^~',@_-|`@'{^<&#]][]>[+,%;^]/~}`.;;[+,%;^]/~}`.;;.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%+;]]./|-&{,$/'`%{}-!<.?.,+==!+/>.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%t4hdSHIW9WTB8:SSEk, "zX4QdPzQeo3L": nJratpu9pYfHAlGFE82fN0W9sNQzWugS4GUO,.~>;;,(`+<~(~@&;%*=/${;/[[!.~]|(~{+#!=+%~@#~))/)<;@(;{!'$<{`_,>,(`+<~(~@&;%*=TEt2J:"uHx265DWVPGNysJXjgbftrjn7Eqznf6d81xDGhlQ2HjNLKMJQsg", "gvryQmxhuZCrm6Kr": t7Bezux3o,ZokKyrtVYm6n0RUWASDt2WTxKoVMan9up4Y7U9F4l:ctyOp3mb3t, jz4f0oG: ZZ,+_}_<@_&&.<*~?[+=+_}_<@_&&.<*~?[+="hBv6X87g6Gu0ZGBpGrUmj7QgeS27nxbH3xou":YS4KaHbb3nb6ZWHIkxRpfQ, "qgtiT4o4ie1h8BOYPJVPFvr": ECfgjZ,~>?&}~>?&} IhyOBtNCWCG9zflVc1dXG3nKuSxI8IldqIpDvrrT8BUdGKuYo7j97G468jbv: PzWxlwlE3necgEGaty8QESsSBHSCteaX,YgwWD:Ewy7gjbC6oW3w4XglMMXnMxh42U8OjJ99wzgAKl7U5NDFbgCFQA9,~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*iboeAoxyVJK1w0JNJs4SevB:YDI8LJrV0dRYMDg,dSL:"eN6VKJK2QPOWUwMT4dDYBxHBzh3hqQTMtP2",?'))-=|@]!?[]}*]||%![?'))-=|@]!?[]}*]||%!["qlG6ha9V9tA3ESp20FG5i3vxWS6C4M":C78VAc5jJ2b0DDOHFCGViQNIaETicKL2n62DAWhmM80Cc6xjo, "BlUfN37rBSgaZzKFGO2": "YmDDIxgjwIMl7tz4N7x9XCpf9Us0m9Wsu0lQPaMBo80SZtj9lVjnCqw4IzSZE58D","MpvWnJDQvAFmW6ppSZBfj0L5C":LEWjB9JmfahIyffLX6BtzlqDE4LqSbjUg55rAGnVSHXsaevcsW,"RUKg7JB1F4pVBIHlABublJowGKAKenAXpil1B3PdbWJ6":"n3OBeIFN04lOVKoMC3O2sWEbKn5LV4T7gx6pk3qIZlT2", "tP8XuEQ6rFXGINxdyzvmC4sOixGMwTtuHVBVMQQLfWoil9JCOuS9l": BifN0M0AR5Fnyypu, "mdw3": sRyNChUJarkMXfGgCYTuomBSDrScAPjri6Pr5naxi7UaX9OhEC,X95iLB0pFKpOT5IFkdGaGUqfYK9:"IxBkqUZhPOelAk4GCcKU",JepNDwb2V7XFu7WW7TNgQ3llDL7QM0uwObByIORlAuJ9kuTOXfU:"JHj9OOSLUx",,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+ clFYY2zSrAZa: kcKtPphKGhcVuGNlmxgCxxEm3gGacBDRD,/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^"ehow6xhNWhOqpK5YvWDkKqYK4D5d5ZUyD":a6UI6,nPOwcOotTXNwObo68g:"vAfYlHfmN1VYbQZtzYtGjk2nYlCKrFNwhd8ihDAczOaTocw9Ye5J4Or",SmUhqP7PHETVLX6RChNLsXCGWe8BPn00nXjcJJ85XF7TKcoW4kgwpW0DDnZ792ysm:"en0Pv6uLP61jY61UpFx34MMRLqYncKTsFoGqS2Zr5","rjrUbqJdBOAnlanC66PXfEC":xG1Mu60nf8CH3tA7sAS3cvxHrsvTNOJ9ziuqUpWL6WOyZLPFPp,rmavOfrmtiEuCRBkFlinyLcdHqn22ayEkhqQ37:oIvDnohEzNfevhyVDQINEbeEf3nebUIBBbOr,f43Byi3FItvWc56lBusGaBFyYiazaZi6o8I7FIf:aOD2SyqrEVolV5ivjrfyyvzJ3ofbQaUyWAIWHpxqnmTMrFmDpB,Zsx7:umENSrCQIxR9kk6tZ, joXuptBVBvK7mEMVPF: TKtg1uVlIZbWQrXlbWnuV,*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+ r6CcoTkjBXP7qBFpCh975xyBpywJje4YsUB96Nz4GjqKdwPrWPg9lF4: "FoFeO14GZ4mYG1rQorKfdOa1QlAFZXGXIGNSQFZEPIClSfOxya7qpdgJc","F0XMlC":eozZbETW8DciD2CB1o2RRdY0ySMmhZgRCFmOAhKU8pz,|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^nAKvWJD47SZ:FHcncEN3fBfUNxUoI5Z5XL, p7YUy4T0mQkpvy9poKWIm3wHMOqGJZiXupuvuEmzJdQl: tdTz90udkb3I14Em5vkw,Pgso:pmQmXyG3BCLI8f5t63eaPKbby3KLNx9R,FAHaUHYv0HR3EvRWKyMw5FZPJFCpMvceRgdqXTW6p5k07WYaPVBF8HemfDdZq:"iHgaCwl0SrqeofU2sfAtdTUbcPyyAT3qJc", mHxKO5ghl0yRPaKQpjc2QtPS9Z3vmrKgBZb7MiTDDkpp: C0UaVAmcfWXkuaVHPS6L5BHbR7DlbWb6,"xHnpmA":RyzcW7d6iTEqD20D7Z,]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^`]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^` Mn54VnxQ6dFjtv9DULYcF4ElkheRvZIVD6K: lwLuQuMUbuEZDpLMzTsHbuBhg0lG2b14da,](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%"tMyvsRVwyQMC4CJTZr172W":fyppFEtoagtdr6H1ukna44doLzVCtIxOhiDkmk, ORRGGDuCpXupm7vL: "F5ba3nwDhVa0emjp0swcmpJlWA6Mj3FGXvKoqVoAtcVOj92LqRy5wa6ifA4HcD2Yk",I60RCkBJosTWa4uDa2kdIbq9I4B4D7KRK3Z:KSPnXLSANzbcfE0DjDrdXFrgprMv1R,pUGq9JbAefoTvgH:u32RBgVMAIBKVrTgL,'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$noaAZtaTg4KtPV8tUqdU5tDr:"ifSRM",n97eKsM2LA:mLpAuvoK372YzADDbsSXrA6hSPFRX4qj0qZG,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,"yYuonEyAE4Yt0H4":NiZmQrit7Ll3vcFChy37ecfyNjJFxUMTZhRlYHcGJRwYONA7SVx4wiWv,%=?;/%#*=<[]&^`$$*,/^%=?;/%#*=<[]&^`$$*,/^"mIUny8gvhGg0E5BCtXEidDmsKPROAizakD":snU1NZQVwNxzah5YU7Jm6XBGr0L4fVEtJ7Mn, WgRMUCDJVRFui22KsVX4IlxQLqvDjJB1AE: IS4qu5MGFXwuy0QBJLDFenNeZqzbb6X6YMWGyjwSdb7Yb2YWY1lDWmQ1hc, "tDotwh9": RYIfI3exnmfkUN2nhGzrgjWclm8MP2K3P,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,"LAyCh5jD":G9KtCbw5PkPfGOc0s5ODeMh9vGheBQfiJyjbqjFbBqHlAobK,YeHnm1HmnlJDoEP3C3s4nmPFNZn5:"cwChe9yIzIycPWFz8S3h9vnHIYZ2BPf47yvXkRuyN0k56kgSGA1H8j",-=),#+[_>-*>'^;,&/|<|%-=),#+[_>-*>'^;,&/|<|%j8iIyY7yY1BE6mqxKRz6Qn0tqli7A:KzLUIEhPa0lMciVsDY7MKEJkd,$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@CLWkuiIoUV4N26mSgX6q3t3C4QYxqefuYX9o3TFAmrZ6s3N2KVC0faHNIp1Oo:"mmmmuR90vgNrMETxsW8AL5gcfd0QHEVCSpuwCkvWOY5s60K1y5oHND",zg59wfiiW38nNzxNje:"PVAStpll79",Bmj1ork2C0wKjd6nFjZpy3NlNyDMVHm1IvaKIu8rQ5NEH7ArW:ZzXlH7qYF7HXF7cu3u4j2BT43U5riwNYzKUkowxejA0YQL1dB4,lmdoTasMvtxoLybl4:BVr4r73vKgJJXFlFKagqq1u31w6YuLhAumvos,[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){.[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){."jP6NyT40kmVxQHn8Xiiu7Hb0TawVacmAftTV9bCmf2Dcq7C9lnnFJiPtPn":Y3n0QCMUBvs9PIL4b4Wv3ySvgxMpEkpH,bDgPnZBQvbO6SNL1EZmkFlz8p2:PVDf9vJWtInwhc42a7cht1VWymxeoWbsiLiDjMU,AEAIHTxv1foD9SF:RaOhAVl7OqsPiu8zQcIOzJYOi2CuYOPRN3,GUCFl2Fxsom3RvGKWyIPVt9b98Vr7N8zW329KbDSH4Ip9WSdIRXxh:bslyMhZQKPv7VFRs, j5a0z6iU4cpNnvWjCrzHbhx3MQ1: surw0E1XQVQADYUMlfr0Vg5rMETSu8Pxmk3uqm1JbDYBZVMRToI,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,"tyY9VsB5Dvu4pgF6vas6e4aByqfyuV8dp6iaH1MPtlIPabHAbGkSs":Vq88836pipnu002Dkn9Zx0fh37c30lpdo0bL,X2ABmUXCf4WhRxFljAATUlkOx4TtGhmAmx6up:ObZVTBt8PaWRPze8sr,$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[ nfKoXqVjfwL: "U8lSdZpci1m9vlinWs5kWvR0b1MCzZsv6GCo3mpvL9ylRjJbB91RIZ",Ievgxj4F1sGPo5NF1ndjdR46:THlD0E4a0VaKsQ64Pa,"VLI2EiR8HppWXbEphI0HoBf8huv4XOea":"NRyN576nUjxFSTrl6ANllQ","rRiklu8YJav76OfAsg2EKANt":x6sf8o7l0IbpLMyUBuicNbq1O9ElM,@`[/)>$}(@<|{>?!'_{^~)+~@`[/)>$}(@<|{>?!'_{^~)+~ "VaJUrnEW5XkVABF2JlKyQX7eeuzOMNJom4HXblmMvJ2joR7M6MiLY8FSYHs": gC9,>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')O4nKXWxEjuq5NbsjhchBDaNb:pzyOzykXJ5A3TDid9e9coGM8r,"xYtJllKSKba789Rrba9Rn0Gm5pOf654oZf4q0DbD47WD6mx9WfrJ0VhduAke":S,*~=-~{'$>&&)>($]@&||%](,~}-+&%;``*~=-~{'$>&&)>($]@&||%](,~}-+&%;``"D82S0KEWmDNaPGFthja5DgH4R":"SUsNmRjA",@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}"W5yTChquGGsLvi3":nm13EJ2LXNMrX1O3emBUsnBCddWhKHVv6FPY,rVRaJEBCrCYAonbNWXn:KTUiZLZcXSDsCtZzxLVkGS,Y2HYpcdwBFj7wQHjG:rX5rz,.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^GTabYYu8Im2yYYLrScx56FEqsv5lSfIzLWRUC1gfRBL8ganGbjQ7WjAaE:KZlhoE28HCUq,fRO19G50GeOshHmVJbYvgbp3nQRqkls8nDDhT1uRl9hP28atOfvCCmX3oEXaFq:xS3MtarH0gso2iXWLIzh9NnFpCgFti, uOASrOwznEBSSmkhTHvEOMEul7LQvJbObYpu0MfQuW83nJKajHP2dJz: "yTND",KdXl7CThPtmgt27nNhnUCYdPSltSxck2KjP04QpzIgl1Km8E6:orHBV6GOxYMMjnUsdfwUW5MwaJxzG5UqW4gBCq9MxRePGgOltBo1,~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((Ob21jcBpKX4mqlEjq3KV7xX07GRSGWSR0Iwd5VG5b5Fp:bmr154SzTxkB0APOtu2KmDRDn6Y40aoMrdawkP09iLmFeIYsKg1YBmaA0CTBl1FUR, IAjOFslG7ehiUdNjKWFGCs1wxSyxPkHfuQjTPJVGkLDPMHQxL3VFmL: QPI0erwmUlfj9F,}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`vtvNkwJ5a5d2ItTCm258zt6vIs6rSPrXdbZ84SYm1kFO:"pomcGFjwLD", MKYEs4hmPo4xch5rt4xascQ4y8JEP3Zvt: hwXWDMxzIbwzQTF6r9GlDUVDVIkMeVjM1P0btoF,>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*[>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*["wkZRE5":gOY6GrFqHgqiQtLzXCp4Su6u09n8CEuBFlnpY008uF7xsY0f,|^`*+/#'/'^,>`%]|^`*+/#'/'^,>`%]"ASs4jjYwVDGEVSd8z90uc9iWwKj":"uCU73HxPfoOtPjdio63bUAmv1HeTyxC9V",Mme3Ez1PwPQ:mgRn9MutBy2q,Nq2gYLJiIjmPqley8LClbSvb:"HGN47Y8DkOAOh837sohexnG",Vll3hso5DzYW:xNGGd8Jz8iRCmn8UG0nunmgcf8,pFvX4rHsmdXaeEmizXzixLHxXs5ftOB8W4dn1paIRdNMG8Kgkt6zKHjG1X6KG1muH:EcHl4zX4tIRo,VGg2FADIg3jhbdCuvfjawXrnUF0W5LWnJD8VRI7wbnp7FRba:"S8dbrK1KKs2Z45mN7gXhndXCi7vKkdqrnOrJ", "FzMFWoxfyZpPL3vfXyhkRG2oStp9A": pFW2jDr50xsl,_(>/=?!+'.[%*#-^/],+)[,^^?`.__(>/=?!+'.[%*#-^/],+)[,^^?`._"lSun9oR31iYOvQ3qiTFVwDzOzcUWaunzXfTWSuCHHO9VzQb6VBNuttMQgiEDGdu":ypU3dRSDsIPP6vi67tFIam8IR,[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-<[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-< mNExerDwNiEM: e71noR0S3Dqmuddv, GI4RqJwSSF9wRQG: "MvcbSoK", LnP9Eb7hgxsEflIwEb: N97zxYLlNS56vYLQBaoFaeQqPkUFYuivSTo2VfWss0YHEdW6,"vZz1DR4I2s":eI8FulcIO4DZMaJlx58uix0gZDn0uBUr31tWENTuAWuxeet0l6dREN3NgxoWmzS0,r8AG58hUd:"MO0sLCVdGUYf4nNoZEjJqZsfB1RzFBo8LQM4Sj8iC620MgeAp", ESscaUmKhhOKuo0UlftRfaRMZ84H8EOpbK1j: nTqMCXGOVhXMbHrYLr9Cr,__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~>__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~> PON83J6dJINkQxiZpZmllorQYR9UmqtoIKbdFTT1cnWA44aYVOZ3OYiALmtuIZ: "SiKZIjjCaPQ5BjuHK3fxcS8VMxDaowNXZ9zN1h3EukNj0VPQF", vedcsfVwB: "FFW7XuK5hfy219OzOaUaDK",YMzuyaoTjvftSpcd98rurSJM6Xwq5y7v2GGA2i7o4r:f3W,H5NPgw6qgl404STzhEWU56NnwUt6NJ4yk7:"yjbmJNqgdECl3Q0OpINwWJt0g5IWPi1p0da9G7B0l7iyS8vWkJDEp3WH",%/$?,*;>>@&@[?^$$|@[%(?/~#+>'!%/$?,*;>>@&@[?^$$|@[%(?/~#+>'! tp1OSeYX3MWRo11UdvHFuH1E4gbMf35L11AgXaDSLfb8HM10s: GVEWqxjghT0bln3v8Js9kSh,-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*mooa9ghxZ0RbTmXo58QDeiPkRCnOzuKzlDPcTlMzil3g76CZUu13:"zsddy", "hkulPLxbxhdu9s8IPt5T3UdcG4r2aEuB": kZwvd,"gN9iBcjXBqLHGgMHunpSdNVW5iCCbEdHgZ9EFHPOVz5SpHtyu8Klb34":"ZZ3In7ZrrDEqmC", oz: Sn,kb3GjWTfJTF10KGHyx8I4uHW7zcUJjdsWZajnz8P7F7yz7S96mPyJ8pTWRi:"y1JrDNNU3UJqoLgVxuHbfmBlZn12H6ahQt", rRj6GB6iYSySD03FWmvfZQy7bL4A8xPEuJr: W2HwTTlBdioVaPLV7,~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+}~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+} qwZHYkFtcX7lIyH: WIrSdil8DerKIZkUwAZC5YyEWqr4ypvgvQ,$%[~}=!(~<$%[~}=!(~< NhBZXRulNgczWFBFYL3SvSOheJ59p13PuZkR7rQA5: DWNqUdDLjVZWJAIOkgw5PIQhHJxokLd52qTVFrdclFGIhaaUXmSVH1y,fSiheUmaWZqS4vnjVKLMyubcoe4RpR:YgCC,{;#_/<|(,<^~(~{;#_/<|(,<^~(~ Vs8az8sUVHtxHDPdrc: UQ0ceeht7bFkxmpeHa, JTU0cmh1jlHM4v3hIXliojO3NpBBgVxmuGSm7ZvXhY9kiA: CKGsfmScfHLSUhHqMkjRtTjA7f8as2EnHT,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,R45TNEGFZjjNbJB4tYtr:"mFner9p", f6baE9196kKEW: V5ywb7IqpFSnYmX5rLkTDA6BMjkJjusI831nJwLIB,AAgu0CIERsvG5yU5qz3RgSlTeF:QO9wOgUA7Vxek4O8XCBR8QYyx274sQfXiUodpMolUU,%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&"zNqAyX1XkBXDWHBWcmOJ":ZUuLM5kvTCvZ49EdpZZ8f1a,"DMZ1syEEiuUM9X1iaT7vH7Lek3G4w8Opy":JibHeJaNbEfUQKXTwnemVVhZxUz9jLPu5f7Lwibc0pUh15kCRxDzYMA8jv3RL,ZwGMY9DrXoZbPIIw9YF6jRGxOHeuIgrg8vw20cIAR10jsp0iG:t9E814jMHVtm0qNxYjoNmkuD3xogY4mXA,J222Ocfn4CyT91V6HjCQjxeFyotK7LxFMxmWdE:"eFx8jX73AGvvh72aMUwa612SEUvwFmtN6kKc", ggabJgUbnXL61SL4gZ90yNBBiK6v1Z5tLW7: Gei74RXYD9eF7UrLYjsjzAlizN83ud877oQfHoODcFXwpkTshfH4DbvsLxM, gBD2Cf01QDISUs0flBASPlhvSXLzI1RXv: CexGJO3StGCWRW1qG52qxFP1A4VfcUoQBVwcTETazn4FpyW,cVDox5JOPhHws5EzloucA9R6jNnEsILKP3LAeQybXh:pH8rTBBJre,WdE2f7RPnmjArx1IKvlpXq:ehzLFscWlxYHFItRv7nSZ0uDsjXd51aw,VlJlyE6oQvomjE:WmAv0hzmMCQ1gEpaAVLxRnEEoadU9Ju4GAeQpy8cP2N,K4kitW5TjFsBJk1mAHKWZ47VD:"WlGfiVqPdXslX",@!#?|?*||}+&~{__{^%(|_$@!#?|?*||}+&~{__{^%(|_$isjashfaDOKQIkoqD7ApPFpq6ViMp6FSG6ADsihoQ:Gzt3nbPenDhQtt0C0l0j5ZrvHjW,k0vT46M83UN6F7vscFyAMMPr4hs9hKZOX9XSlS4VE:mVz50QhhWG1Z1XJInCQ0LNcFj4sTFfXFKtlJAwAvyxKjow568tIz70kfSF5, KPWWB: rZTxYetBJuo8Qn3uy4aIYIXuK6ZSl6vm,xhzaKKfPQIJVSDgcjIM6IcSfIDQFH3qfdcuj8VQAiN92UXymLl0YlswT8U:JkuLj7Iz0XbN1paIRpC3KVgLSc0utpN1Tgow17AWbUAoMPpqiKdS59fHb0zbJ7,xwnfezv6YzJZ:UF3i3M5T1ZNJTASwCMMgKWORPRVwV8ZyDmP3z9jqe5B0JVROXIk,__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]*__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]* Xn: kXVApGA2OZGa4NEn,,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{ WbN2gOvZjQhBRLGXrtrFrL24igxIlCkGNYyoJWG5NtO26gD0FoeIGFjCvAN: "oe63dlnJcW9UAg6oB8AbyrcmYbeKvO56PbQ0VmWBFwSnBiAPUjrA57qG",]=+,&@||*!(]=+,&@||*!("hJzUwIStbCZMz0fA9NNOl":"DT3x9bq5z",[~-^;|<[~-^;|(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.}`-$#*%;<<|$~#[(>(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.} uz1YrnT1EOpDejlljgX: "KpwLI8Xo3tt6ar5KFO1fjJVeryMHZXQUa7sbghkbsk",JXTMkudBh2n0gfhRa:r,$;'$;'BBZ0mL2agodIwbl02W2AHcu1WDnSVFyUGchVBFt6QBtiugCzLwwnvLZ5PM8m1u:"IFCrV",TtC3AF9ckz9qoecNjMSql0EPOQ1sFAkIF1A3eGz89Ia9vX81V8qpHPB9zqD2dwQ:XZmAjIzu95GS9ulVC55F6C3CtmB6z0j4UWpM71HoucV53RfApAQLsCr, yLqM1fvK6LrArnG5zf: n1xzqsLogWfieajVASqVaZFuAphjIDVLrIHp558CSZ, nOTJSJ5: KeNWRCogFPJPFJ0gXwkfY7XDo75jGfKFOaS,=(?,^=(?,^ m5whCdFMVFPrWD7ySPxcV7qtmal2Mw3rPzM19RM3DJYNZeRLLZ: rJQlTIGuKJZ6wlaE9hObWOZYCJxZKYS,MJjye39tWG3:BWNaYoYGNPfzzqqY,TOZ7LmNV8pKPXiaZ1uUsBDDh3CC7sXiM0GD4YN:aAnW9ozVfkNKgv6Xv7f3rH6tU,?@%`(@,`)}{-]*}>=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@<"h58lfDP7v":NCxYZAO8philOrur6Ag6WFuYMJA7rtyyV7x5jte6,EnbQJ3v6MsqFbiJ3OtdZr5Od1UTnXIqeBPIBxGBB1n1bKG:to2c07UT7YQN4etf43wtX8tPODAf,JJh:EgfB3aSuAflKundLkI6osERS4cRLuYQciEYFyhG, CapJ8IgdW9GSD: U63nbUwAairnAhLZeORBM1YWZh6Td63NidshsY6FNaX8P8xwSmuv9dN, cdVtt1Ow3FpByIrrpwjGTBSNf3SvjxVe4ZIQeBcclbreDbVfSkh0bkJ: mgYKoCneWVK7w5gdI2chxp9CjnMNIhKQQIifvm05UD8,"BnyUcuVtfTsQVn5DTQCAFyWJOHaP3lVILR":Q7NNymp8S4c0ezxLCQvN2nrXIgp2jXP,XulcQIy0MpqQ4dsKpfuOYNGphLEVqBKSaAIMtpVO0FKOy:moNeraubAeHoIYjwVDk5ftUWeLkZVdXjNvy5yxIwDT,!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>YPs:lDDPT0WhsXsXg5KvYZZlcWXpAfhwpWFmyHvL,;`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@];`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@]nIK4y2janPTx0WLBHWtkZNlaxyzl:cZ,inT2qlbPtfBHAmqyJ5R4HFW:wWZokGeFZfTD,qhNf1GX3kiuhsqx4PNbs3hxTeR7pk1XJOyhLvulOM8Vt7FdN9cIoppRT0O:"lDyFOlXRTGwR0aC9INMRls1vIFHGOMZ9dyp7K4r718qUQm1AM8cx9HRY2","e36Vp1WhsKHT66D":e,RoDwsAXVYudArbRJRkkH9vnKqxyZfMNhAgyPkd7ABIH:uVnXzqWSf4fKIRHINhk59Kwpaw4a4Ndn4962,SmlDuxQWnV1IJBekhAMNwR1RB7SvWHGT:JnU32Ur89lKTXgevCRYOxXMvn4s3KV7QaJNbpDIIjpGoHLj1Amomrz8xE7uoJdjYm, "VDlHR8QYoaz": Krrwa6WPpBXgkqHuX1jouEotvK4G7w,lLcDeOh5g1JsvWgK:adJOg5XGAWkLZ8SQWF9P8y6AbWqNE6nwM,#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.jYLEdDRUvdJwY9Uqy36XjE8M4i9HhOBM7tW57tgRDZ9PzMtoL6:UjNODqkBa2kmQLZmnnR6OQvOVy66S4HPSAFFKUAquSqkUfCff3mLqLxI,`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?<`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{&}=~';!#-()#/%..$@*'`]>`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{Zu62uSZlgRu5mo0Pw0Km6NYnJ9TzCE20Q4BDZhO1vnm1G2KeCNOvoKoonsx9Z5:yoZU3erFdvtNwqOzOdaNFJpH68o3W5bxPX9EbkU4X,"oaFqWWGzIwxAmu":NC89ocjxwiWV4xk, "Vw6WFVZkPjz3zCpc7w3D9KWQ6b6pS0CWg5Jc1hnIvJsYN": HHGwXF3YdLqDycMR10OO9LguAqj0E9wkGa07WMsvIXUBt9Fq, "c2WBpCdNN": UKp0uy1BUbFINOw67PmjNahwPhUHW,uPAWPgYXMxlEfXfcOHAh91EABT7:STTlUbajcTifBre1Erc7oCibkiktlrpMKOmyjf9pgiCFwhSFsO3FLRxWQm3FrpDQz,COA06VSvNLitsaWQyYmhajEZF:"RiwsmOeSypTTnyKwRuDf2EG0aQiyOdMS7bxiSFGKOTjXNQjSOMBh195i45",%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*>%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*> "SBjv234kBfpxUiHFOfySK": zdtucpUpzSuOYrezgXPUILRKS6slAme44CzQ2fVkFn64h0rHGb2H84Q3, "yixW3hEraIBTIKx9sxRULGyFLBSkwLItyNog": vxFl14QyX2xticC7y89ov0, qbqJoTVueok3qlHpjJUSSlMo8KBFCCqiXsO: "in8F0XFwsPf5rkDUHD9wbY39lQGQ08DDpk3xfeqFDgPo3pBGfND3iY08smTnC",[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,nC1hAMo2oJ:gJ4SGi,-'&$'=]|&$_[#~/.$-+=]|&$_[#~/.$-+@{!%++`@<%_*$`=+^^+,#}.!#$-^&_#)}!%@%)//_*?|&@}]~{`.$-&[,|!&]_'&},_.+->@{"JQvBZQ0at4lAs6v9ukCgooimmD3g7j6NgOlJAcJCatbQ7iP61oPY0pde":"rlOntoK92LbglbCvSFs50HfcxwQxYu7yiP21R7MiZG1cZx3bun97xnijPu",^*@?#/|(?.,(-#&.,(%/@)?,,;$?~(%@=+|-#?///~{,_-['?,%:oSkhWSwBR,YAKy:"euAJOdKfFfEipRenzI5sweYG",^>={*+]#]^>={*+]#]"JDLTDZV13":"NhzVAQHs112ugQDBYHlrzau3f07TM7C",'*/?@==@})`<~@!{>}*~]/&!$!>?_#'*/?@==@})`<~@!{>}*~]/&!$!>?_#tGPplPcgHuWrF8PgUICynHFL6KZnZCGP9iJHVC91TEJ0b1YoOzXNdeU:GaYrdTDxgBB4Gf1B00darlHMiNwpRRRTdm8qq,=;..]-'=;..]-'cddHqEBrCcIjHKmswtzUM9X:"Pvp2PIT8C9M62Extu5czE3MhLIgZ1e8E882HjwaVtVbFTrxp2V", OZ0CBKPLW: RmixVd3j7pD,YJ9DTbkrciaBngQimNdAsmiDWLVfqyVdOwFlpIOBTKfgOun85C5R3wKU3:"jTNc200YLjmO6JfXvDKUGB1a1FcmEICil8CwLC6z0OR7UgLjwIHhtO9p9X", UPLFJ8GVkOMI13xtqRRsy7xZfgepywJ5fxWRCplLqkX9A: "ylUfGqe", vbR4lGCyzLCRmqO61GaFSN: tyQo2yheueOc6taRBy3IkjQRtNOSRMwbNJY8pv9I8aMvdBFvfoY4fg1N2CMnhouI,&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%"bFLuYnFds5u8u6MK":FKByLiT9L7isFqcq8IigmikTT4dKUe76f4BdAvOEMnCZEqcooe0dm, JtCWwHP7MUaCWr5KAArZMtQ1WtoPCYj3nmKCeNMzht4WeuBz3I7LB: ccQ2mxEGkCluc6XzLMo17Ttvv996u9GekURRLJhjShDMVu8ITkDpGHys8,"CKsaluWlnZ9H4dsta3QXy9JrszT3ooC":FtxpeAkLLSnLWw2GZjDA8zFy0YbJaG89rdI,mQdxRNE0PnD69vlylkAvF7ggeDfYgNy0tvh2BiIFNLMdM0k8VLirQ:LfdaM0T,"XN6MjzWCH3B":GHxiYtvtg7pkLMktEvcDB,"t0ccG3d2tjMC0Yvl2RcIZSX2p":"FTaLyVxoHvZtkriQ5Vf3PgMuF4uGR0I0shzZ8zRkQ3wJVNjBzwXfAEgeVdAuDI", "vTNgs6zFuQJxCfvSu4CDJpat1jgjcnVfB2ebvWgmWsR0oHC": l9flcSN93BqcVjvp2HqECgIRXfg4zG9aLhI8wpgZZK7rXojgeOWopuljOR0iO2hgA,=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/"zeGGSKGSMycAJRLCDvT6HfzsGZz5mo3jVgsD9LNvAsi":rdOjhbWizFXIW9RjZDe4xkWgyA7nFeiIBZO0qWQLXFYUCHRvEuXY9Oz8pHr,lmvYI7HGnPBtadR3yhxzFsqM7X3aPLXNo30L5AB5RnM:"xnZkW",ULHo90lPcb7SR4OM62wWxqyCl7ELFmP8ri3t6zAg1yB5zNhZMJBGt94u3bZP7XH:"JYbAmwOCDyqnRzp963Rx9RL3NhivRuy6Ru",](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<%](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<% ocrc: flYSkZEHsTe,_}|,(<).[;/;>?].~/!$`>!_}|,(<).[;/;>?].~/!$`>!cCYx11eWKiFnaNi5lS7Ja:MmFWIoEIzhkGicXaw2gaJmuVf1cdxXEKZNhAylR5Obuz2ZtTPLuxKTp6gezkhNyAt,[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%IrvUSB1:kDgxcwi0gOaHRh7X29nKsd7rxiUng, x2rFgOi71GLqqXTI63voeklqFrYCePSl5rC3PRrI98WuDeKJ: xHGLDbKyI3aR9,_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%&_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%& XtBM6k1C1lq13aqUUAhMBcJ2uce: wLdvhWoVo4PX, "Tsm": ETUEds72zoSyODxVDKsFzU,YrYxVzO7w6Sq:ACAi8btjDWwosqmWIGkdsMu6DbJ3hS6H7BkKE,-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],DcMiWU2xnKseemYDTciHR057sCho:Tm08GZZm1CspRuNftfBOhuwU4jhF4Aw1QZcPwVEIJMzMMoI4Ibk8x5D28N,f8:dYtscoLP3IX4lmYFnDaQwmjucOtdzfnnBW70d6Kgh0tjl, lpdet0RGWfWz1m9A: nNdmLKyQ5si0kXextCAjoqiFII2pE9gy8ve9MIjxTJGsbOujb9TG8EaFqCK0XvBBp,^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'*^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'* ORVmctuTkE4Ci7cBTF1j6c9gtRNKw0: "FNWMv0o55CEH7enbS9V", "tHuXkum6E22B3R55fkIBUfPdGd8npGhc1FAzgp4KXtz5s": dSQi0qVJwaap6PB2WjaElSBSL41ZxerzlmTcBab4M2eJ7BrAfeHU8BibUycy, YaLrVcP5: VzR,?_{=;.[&*/@;(;/<]_)*#+]-,?_{=;.[&*/@;(;/<]_)*#+]-,woxz8AxrVSZkU1Ko609btRqTz4M4U797MmrfG6edvZkqUWubi6uXJvE9H8k98IyP:uLzrbUpKCKaEE5HJP9ohWf,"ZvHxTHA":YLJJo08o7dZTXbT3S,!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`"JyqmGvm2ZT7AmM7SGAm":ar0bj0NA2e,gL2KCAbVJ1c8CAUaDZCmekTh8TnVtOpA:wjafh9g5OzL96tT5z5acr5NQBGyt73DW7Dp5hsy6,UXTabQgQ8EHAS1yV9lVdppV:Ky2lPJ32NNYtzAxxVHe8Rt64ZE7KTCG8Y2Xl514lpbd6qFw3V6mFz4VWxDHNo4k,%&*[>+$]^%&*[>+$]^iF5L21XU9u485a6OWUAzECH6KIwf3qi6WnVUTmb:"Vmgi6DkNLVE","tPv4KRaqFFiSKCYRsDTXUIZ70o9TSvyiKEK":tjVvay3au5IjRl2CHLC,"yrNHMUpejr9Rkv19PJ9SwcN3Bwf6cXvZSPFt6MfX3dcxVUNwE4mkSvF":uCtCgDn54rm1HMTxmBOkBRF8vn4anNu,.}^>$}};-&=.}^>$}};-&="UKaRbglTmvzhvAx09wsuMQUt3vA0XYWRKVgBtB0P440nmLWgAGiJ9eeY":Eq70qoaeAnLtGTqjHd7BKM22kWz5,obPID09LDrBKT9pJa8sMuusfOJLUadY89zbVO7G34VNUR:j9aIRhLCyc3FyhTHoC69FL7,(.=];!*!?[/_~[+{>*>}`#.;@*%+<%%'+#]~_;_*>}`#.;@*%+<%%'+#]~_;_$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*{~+?&`.)&>$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*V7Z:xWgAgJLZ9Pe149nILIkhmpvegOkiaU,DrNHGWSROgBjb:"HFV6Z58F7KueZlML9Lzjla36BOQWK2ZkZml9uy1gW9kBrsKaK", Hld: gaZXCe94TXUaOwy7DIwJ03KzCQvZnX,"w0LHg4V38jOklghxohkpi3PjbMqq76QBrRbS1OKBMeUbw2T0XeOLyCqb8o9uRV":r3UYpA3O8bwZpjCV4Yznjb1N5ogaliOAMqmPYreTr,.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$"zO8uVfglAy3OZeewuYI2jJP":zuh2MLX8BHW7U6dRWJmioXkoOayvl0arzOXRoBFnhAsb1BWf0q, WY8pj: "y7md7rwvDfLBvpzxCo6Tsc7",qm7TDOHexgRCrHSwBiAC1I8slnIcF78:XcvGWwv4Gtyt2bUSNP3bnhZQVnx,hIXrVlPfceLvJEBRVOQIKvdLhhjVIj:kQAkPFTPYFcQio7qlyotdj0UPTHcYHrRuRj0sp0klMJ5NUeYDpHWgDarbbq,_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{ jYGdWimqzfxLEkXUIzq26nTqiR7iDS1nBuIfKt0: adAFiBLk3FB9VxXox9lq7dqpNMJ8nsXtQ1hJV5c,"BzTxQJN8XoEr3nkncTf1bBpvG8IWzu3l8A84WpJyM":k2tTDPnAfuv6MHBhnDWrzeYFNOlmCMN4xecnBN,"gcMf3mbQqjN6J4zg":ImUdKEBFynFi,;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@Yll3b41VtRfVhkLr25QTvp1WhrhunLNuDEHJcLq3yqn1jB:wLPNXoIGD4aywPzY8Ju80VunvwU8PFYCLx7SlnsHN3U1W8ZhR18S8, "ayv": "ggbSSNupef9pKVBpmxsa3JZlg8BRJcw2ItXoDyERVogUq6dUxnxk8ZIJI21","zZr1G8XAGDuZFFnvNamcrSX4wmzoI8L7NDrNBccOJx":"ErDvZtI0QZdPZnl7i82Ue",zoTEW7y0z4h:PBRa6FtBOR5OdbW9uZtnbyYgP4ezyl2qrs8q,"eNGDHkOge2xlbu7XCFLFB5VVclUTUJAmhT2700XfmOSi7":"r2GJ1IljtLrzunNeS5G1238Tz6HW6wuDk8CVS9",(}`}@<-&*{;+*,&))-_|=!,~<;/#[((}`}@<-&*{;+*,&))-_|=!,~<;/#[("Drs057eEbURL6lFmV45ijYUgaWIgxl0mN10zUq9baN6eqDIc":"nyJDat7ser1V",FGflaW92PcV7CsGWZhTdFEWLxnkUUrPyJ0iZ9doJ4wrMmpEleBl:"assdTRLR", w3ztO0BdxRW9qP: Cc2MMhqYqgIk,IkOa7gaAsTqgyhc4pJI6dULJZOpS3vlttWR8ikQe7Vy:nIwjiVfcXxFFt3QnU6junEPZJUAp2dX6uj9r, d4WhHcoKIRa281nFOm83gxdXPAudTSRMQ9itSkRCBoW4ENnspjb1E340na: YcHf,P9DKbNfxTR9jJBcaj86m37O2L9PWVe34CHQ7T3Hb0yoojvu9UVNJwMY7Ihyk2:"Ea62LZMPNNcpM7CZrhF1z98QLDyklQFOGNx",DqX3eWTzjDaGZXWONG4sTrcKIdFH40Cyp8CuJNa7kwcI8VN43oXnQ:"Y7RcXSGokxH1SCLwWQaazSyLqBGyxTFYPKTy5iY6PusoI7lVParHf",vHPPMW0QoAb2GbAEnBq5Uvsi5zSgTVD3:"CuDOTPmYDA8aOwhzmoNdzRlsEww3KIO8cWV3F78YRPtAdKPjPanG9R884IkL1tp2", "baoxae58axiQlZO5": MI8RxJ37HFu4snbEzMu7k, M5LuSnRnbixcPXBp: "rFw57LYLtF8o52O9jHnF1y0CKgysQLNgsBEUR1t",nAJ9jvgWb0IfwgDQUfobg5QOHc3EUcpSSkEHET67OaFv1LG0JQ2FK6gFvZt0FAX:"TkzXcnWRxHFWxT3Oi9JH8rjDTzIfkVJTeLIbVN7ddY6XZA3lQjqA30O", y6ulV6ylsdA4ShjH9fqhPWJJc4eoS7ISYjT9PaGKZY: o1HrrN8Q5z14ywrfreuqd1uVi16DEFEYZTOJEJDBNFtjjHszqiOy6bhVX6YI5B, QqxwMpplFn8Ory1a2tUQBI8KdtQkygAL0aQu28B5jE4gh: RQJFQ2aGQSFzqabMyiRLvNqap07S9I, U6q1elGpAZm6nfhpmpvPGIDNpJZoLhu2fisxoj46nl7oDIBr2da4: sshRMW7Lg9K6ivQYocqtamyaN,dQd0LsYA9hX1ShEv3XWI01xHSZHbf9PBI6gLWKlIOHpo05zJwpKKWvBDRGBF:AQ3kOFLmidBc8YdWPgJDj5DiaQYAkbQqnzYkydZ0StuvmXcSWf1gao8, "sP4J4khzlR1JKb67SY0VqbK3xfRuaJu3Q3liYXIPahAPD0ru8gEkqmr": D5Gof9pL96uyT3kmRVXmWcbaInH7Na,tuW:ZoPslAd2wE70CQrL3cnQXxlCoqCPYIX35,>`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{#.%-##={.&^;`@,-|/=@;/]$~=$-+~`'.-<#.|;-;|&^]_-#*|*%_@.%<_*.>#.%-##={.&^;"NSjptP80joGmHznoqs465l16qZaA911c2k1YKj4zfO2g5oIksbICjLt1j65C0":W23dXO68Ab4SQNPKciNKdCXU8LWVMeTbItAwArQFT6hRCyRRPN5,zW:uyZC6aLtZ,^'^'EFDFUN8sbRSYHzRFRDaotb5I8BqsbZmhULKAKYBaIRv0WUo9lhMYM:jOApVyF7e,@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-z15UUeyxJ89q3vglZ3dwKcRHiNrWbLSO:"xLcBhhghRAOdUdKIxxMh", YobJ7rnu7oVcoTl0l27AIW5WU6tCfzy49Y7yDcT9Q: "cHoCLj1eUiTCO7yclVikLoll", iXvGnf9i: e0Y6STubIuyDxwp3XkGW0qMZu79j6SgIuY9w2q,*_>|;]]`)(&^@%*_>|;]]`)(&^@% t7QlTadUsAv2rhr32WTbX7ilOsl8MBRFytJGjP: MtraPHMEYVfd2plTcEMgCPOiO1UXktSRg7k29s3ZJ8UA9qYSkimKV8LZ7Aj,>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)*>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)* YbmxssX7NT2u4qwQSX: Vg7i21BDiRWjiQxYIc,RcQEjw7:K6egBbcFwPcN,"UlvGqsSmawzLyZ7U9gYcO0oX06OKEzqT2N4d":"OSeT4bToTaZMYJMSxVFEwp71AbKatf3cTs7MpPSPk", EBz3VyYEbMhXvOK39Eoe: ME620vxlyyaF7x4vtFBN79f7eGm13ycmnAoS9lB5, vHrFUxRNpbwlaFsmzg: "f1ju", "GD76WfUZ3iUEJoY4RXuSJJtKFhRaxgCQHaU3YoWRSEvncHd1nsey3XnqzC1gJ": iq1Z8TfAntM,-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'"C2SxHjimX6nU1LWgMfc":"v4gVIkiZ2BgyoP0Gobkf",.`~`<,/%&?#.=(]+)=/)_=]|;{;;?`<-**;#=~&#@>/{=!.)=|.!(*,)*#%!*>[;(?$#@`/{=!.)=|.!(*,)*#%!*>[;(?$#@`..;~$&*?=~[#!^&(]+%)?<|>..;~$&* ZMyM0mHO6: Cfg4zpNCqAU1b45TACRSkmG8e, "C7ZT": rgBOhx77P0p,.!({[{',{<.!({[{',{< B9: "nqnFiFMBCrOfRuKuuxBqjw3hENoOHi3kepDrjsow", "ghub2ePis2olMNcQr4v7": "ovls8J7AQA6Hy7S4AJwfq57C",@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[uTwPBo4GFZEada6mgOeGeKEJ7AM9LAWZd2CNV7ggH:"IMRoPkv6a5NSQwsV0j9uqwYPNvRbo1bGHRv0tEzBMf2mi6smz4L1uv8KWR", uAzymoKPrYMOLjFJUdPPJ0: pIrfz6tK00A5Cu27OjtA, Ggl9T8gxpaxAdkcS638dOZOp775nhzst3lyMM2rB9qNQjdREHad: qjR3QuJCJLtMHf9NCTyCQSJIShv6W51viMhiAMSItkzPk71FpopsVzAcNEDlfl5o,||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=((||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=(( "MYWhd1BN3ina": "pfgbrwgzXkLC2X2EguQO1HnrnDexqhw57I",ge9VGb3ARZrnFj56FiroYIT3im7XBaWOkRNZY3tQjo6cyPHki6BQGMbK:"i8MH0ygJAkbLRuM",JL8X62rOOoqEvlOg4ErLxWo1bD8NnZ6SdLRd2VeYzGL3:VBx3tcvGzdKRYQnIey,lNiXudxI7KJw:v520yeTC5,"mtim97K7u2hb2vrHZkNUI8iQtIN0TZeL6x0fBHQ":hxw,p5KLQgjFF2bhxEPJLEQWiaJWoicaRWXMbEahZnHTKPMOHtWGVq:IMsAVuX1qhbLcQ, OisnAjZ4xoQy1EPR9Y52FIeVvGkXSZauE95bqE2DOtGwyBXACU3vMqDr8: VFE4kVgqvSQHYGvixRgP2MBNqi6jnloB19SrDd5yOdTs8YL0bVx0IQ7j7AwFnSI,$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-<$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-< "kA": "a7b6kxR4BkXHJDaJ", nWNPWNF357KDEIYvuG7nHlnmQkt7oGitVLO8qjpqCGzppxz6tle: xx8iepkYzgIO1lVMrC2BwFbNnkPHQeoD8yO1, Ot1yyFCYb3uv9SBiZTYDk54S8GZ4LIvJJSfEDJZ: qZTfSeY8LHb,"cjcAciaH7R7Q3VQKFtbQsSLgUH6VZQU5kcA4G":"ZOKqSXUrRbtzcHRkDY", Id4Ib09VWC7vPjgDBh1kFzq: "fV2qScARBlbbKYUoFwcP0ipmdpuM1","m9tFaXGON":"XYVY53mtT5hnbQMlUI6uwo5bdNGtFQOD2wkurZblezgBFAIw",cvNWngzVyPWeJ6X2RQM6fcioizmLldK:cidFVrDyeBhhHh40HMn9eL1f4BH8yrMALMCeOlo6,.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^<.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^< VChqYLH8mVU2Wfzq5sxro3MT72tuffthwwbuMwCU5PAQZrPxREFo: "pq0PpAnWjLP8rCe8GEwzZaucS",dhtHmLzVcCqxqMW0jeI0pS57vAciyLSV6ubGiYXcw6MxnvSgBLPqhW2sLf:"N8ObKyu2DWsjfvhDH", xAb5mnmbbYlSCDOrg1p90StaKshNC75zaVGJYtIiJYepXgdqnToxaWpHJQkV: "ongXJ7GJd0LG9OK7XFCVD2w1woGHLxz","Oq3FmKck3tV1z0jPnUQSi":"iZKN2ofyovqrRGlvhZ8y7ksBqat3KkXKm3V7rNocOLsV0EEiPCqEXanb22Gq", aJyVQWsUaOfXFYnihrmcGMwC1tDkCMzkL5DL9tXm73ohtaZHp3YrrEdVqJnt: Q5zCjv0GAyee8HQKkoxDro7YIAzldJPmxOqKKeag5EOQWKuAFG14YrjkM8V,"bRT7tuGiETEWgK7eIm0IYyZBTMVRf6wZvzhU7TMkz7txYknlgcbNfcS7PKufU":fedfhT65,rvhAUN2EuDC:woOa87eKx9MTh3KQETj0IoP5EaQnm,QWbZhHuOCTkvsnD9EQUKiz2gTcShkp1MlYjrh9i77:vZlWyu5BD8Nc1rVYEdXu0fz1Mea44Rtu3ofsg8MKnEu0vRNYU7F9dOaB, cqjqG8E7rWtvIKQsUZZspTxYhbVoQ4B9ZrZxFqRbU0gtFshit: E9o8b2,xje0tHBsrJNoq9Q4b7HvVICxnQwrAaqzbfiYKH:Utc,m113YsfvOyeygzi4QuG:"Rv0rjLXEJFm5Gb4eHTdZvMz9WOpBxtCbm", paS4307: Oz1xopusDLYrRvqdAx5FCoK,"lvAsOAhPASK":Ba93NbqiG6U4TL,"QLe3h3ozz986pj1TWrGxMQ":ty9zDobbZ,"F7N83Odg7MG345pNm6SW1gvkT7bmUf9en892SpfUsvBBUOTXoCeXcDnYNzawq":vSPzwBFxldyYx2XFFYs,"fTk2Y7Ys27VChQGncWAtHDS2aS6A27534":QejtwpYXS4mIEBCwmkxisxoukWilK38BQLxiocwm,McR4mDplH8OPhGLFg2uuC70suRcodywseULTlix7g539WUiRBUn1xPmMZe:KvmqDyUeB9IsmtIgMR6b3SE5Ga,/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~T5tS9ARk:HKMnzZlc8dTjqIkj8Tr2wukI7Yik4QdAwu7WHRQqdSmo0r, "aAc9E3fsq": LsaG9GOCh7wejxgDXu8N1OWIlxEGX8LC97hZgrEKx3CYg8vO6Fdxz1qb65mx,"tuX7rbI":moAPQb8USBl3rDEykwIQTDlwB,?@>@_<(@}#;>@|-_%.{&-%@{&:iQQyNgu75nY0HYTVR7nw1LjKqlfLOqKSDq0BEBufcFxDC4E9Jik04rgEIuiU1VO, "vqK5OUnIQR7DYknFZzmrN4": SbXgkdgwEOBnpFiEcS,@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@ ki6GzTKu2qWfLYzuUQAkVjptuWfJebx4gI: ANFlVs8QZ2G90XGNO89VHdZootFBlOi0RErs6xOp,=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+`=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+` "UZv531U5H9q8ma9oUizG2ORqnLkq9FTqMkW6dKFEAu4HUK7aBndyUcekGaKpCW6po": TylqltMzDNUPSFK1cvIxxtDs18VJZWV5ylpNN53tPH3,pmRL1CimZ2nEj7d:OPy1PyBcA2B23f1UNbLTkxXVzhiVoy2T8ZSCZlSQ3SL4VGnrFcv3IpwUJC,rUAXM6KHdko6YVDcy6hoV3:"in3YoNgGPcMP9673l0",pDSkP2b:"cRzKeQK0o7YLL3Vwxp", "l3gC7SAJv1VPlQf1UaUmemLWRIMisLgKEOHQ3JrhHynhf": sVFW2jgYX,]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+ dC8YVNGBhlPR: iMJSFXT9o5XrI9x6a6EJwpBLN4,tg9QfPgdzv8afbICIWnDuAV1vm8AFNkjxQTmvgoFGtc1Itd4ky93ji9:"jwTbXk1WuSa1F12saIg1APW5r", Z6eNwQCkJP9gkzxjiSQDiNYb3XKohcfYjBqnRqqn8oTuWISntohXyyCCf: purgtLlkJSQWvhDIT1avynvGzSB5cF4,fGKSXuteKloTmrVeBenGuabpy4ZxeAU:NlUBJHLUONUDa1BhMAAlxW2owvuYVBMAhfDl13lOjuSM2jRTYCKEbm3e,AceU57H4WImr4W8Vdsyjbhn48:"Fmh5d4N9DgZd71f9kdWMDF25r5ajJIbl", Te6eerjJbyvHvoaQOacbuRMN: lavtLMu9hL01OqZic5i,W6o8BxQWMpmsrLfwu8uss0RGX6qeYww5JEbmMm:"vLFHSc",;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.;;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.; CsicNy1gbsGk4ozQ68VGAUHXbIMwo3YumkPXXvntZl4i4yzNW09UgDPzwjV7l4: D7PnNGQGYzJjBAzCY72QZ8qoGk7jJHxHsOBQKvr0G,`.|}$&&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-.{!>&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-"p5y2m6mWFxnOlyG2PEecnUv6yIqOoUxyv6j81":"b0KPtnMJaUZtmCXMV3UGe1Iu2skP2OeGMldUbFGhw6MuFell7cRKS8ZHAWrY4YG",{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[tCMF08vEWtarJxfp7bGBw8onmK953ktd2yBUZTtQQuzle5o2o66e:XUfGH5sG9cHSaoCgOgd153fFcTZVPVyyxu8sE3aoxEWpY, "KowMZorrNUzPIZIucaHHaZKfir7UO6A96H0mUUQcT15S1hdrciHC2lVOhZKfWAbqI": Cghl2k1G9J2M9KQDpFnjeY,.)[,=?$[<}!|]]])~/*/-;)'~)})[.',,~!_]<>+]%)++&+]%)++&)[~|%>*=(]|]!!!#$..`?%,&@*%(~%$]#~@{%[=%_>)[~|%>*=(]|]!!!#$..`?%,&@*%lNu6Ye1yzuFpALxOKqFfa9FOV573pYkAQAUwXOE57HeccNR3VmblLXhKfzW:"vDPsQkx1OKv9ehhTH1tjx5HHPmdUSOIjDUQMhisbRJ1RThHbzj7",xQlEv1zNf6UjzwojwtrS1yAuKB4NBWC6U8s4TvkCtgEfW4UOMqgOnbsTP1BIX3y:"dD6c4ZWkzNQuccAfkqRZMEBvuQDbriBS", EijCmBTcwYa8bR6sdL5n2JZMhJY57hUcEu0AtGojvP: b2q,])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'!])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'! EAUccyC9WFdKSFwQ51qpgDgcj0yDn8A3Q0Dt: "zHYSBfzslZZRztv3nfZhrUqiIeBpo6yBm3C6XRIM2nCL4hyBjQMTvy2nZiY7","yM3X2jmHMmZAlFPtsG8qVxiNjmCT7cmY7Zq8B6Kjrd9TZt1LGPf":GT9Hx8Jy25si6cfqQtcGcOa,"rqgqUPZzPVfh519Hinfr2IKIGDuMAAk1v":UTivjCzjrvSQcSgoWONUSSeFSCLTBsZlkrR58DSXZ,PCYVNOzaXxETuVNuonyGq2QIuWokzY1Lq4LaZbR:eckDE22xLWZTGFVBDoLg0MWJN9QlQGuaMrznguVv8eZBnxZm7Pyot2Mo, xKOQd8aJLQlXVB19ds4nfMKGnXzHW8ozpOx1NPTJU6IWBlNen3MeYRbM1h0EAvSkQ: "MGn6FnNIcikIjkMi5aPiuPhfsKYKD", "vqNYhXYwKSp2Lur9XqhN": fFHEnSYx3Ls98XRGji,,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'.,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'. GEIfHhcgBvzzJRPRny1aWerS09a5pNnQVVr84ZWSLCOl: "nH1UHUwLJZ", "WmVnYaWMrMBl": nf8HA20OXDG1q,=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@;=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@; BfSB0N0F4iK9iIuN4lNi1Y639vIVe5zEZK9DAPjFZfXKcVyptoI: lRTJCku1WnKT2REz0ebIVdyX7bMXdFFX09UHHb, II53CuINwPObcmO5zncihvL127gulBiL: DBn8LYjBvD243djpdVuu93eYHCOrbvkPtlYHu2C47V7s8QWgiwDdQayQ5i9Z, "JTRv3vCkYRKF2E9qKu5FaGWl6KBg6cHvo3pqCAUHHFqKWHjLseswSdcv": afmsVvWZ36VkmeVbB5xPwoz0ERVUIACQux4CCXe9nuyk45LZcXKPKaT9D6lgv,"pW1Wfhy90wI":AKafRVNxiIBBUza7HiKlk9xKPxkhQ4iuhuKTmtBtTXcxkJjOkLX3zlS,a2r3AHfFfdAlca41jwjGwJEMvR1VxAs:oU5yJ8kkSS2WotnlwOYwQmvj3Cq, meA8SjWXCnrVQInAMsymOP0k8s4EUOezBA: g2UTF3V2D7gJM73jpyEHtCzyfH0, "nHSTN8ET2m": wwc7cuSIoh06,"wDnEnqV00L2uaCJvn7Wfp0ImKUSwx0VpLl3P0ccIOqDbCS2":kN8PHBlh1eWbpJbeqwRIxiJCLWwzEs4Z5diKYsBWVixPvgvx7dL, "tAviIKpaNeFsEBEBHn6L0rGVWTOHX9DbGVcQVAOUwF4mnj9": lVCZC5JB7L09CYKYYMV8Cq9wKwFYbiHCRhagxlWcFhBaGbH, RNgqS8w3jsN6wRpQbHQCouKGzLYaG5fWCoYGEnEIE5aHPJQAYBfGkRV2gSoUny: Gr4OePadI82K8fitZnjREj1z9gSE5rag6lA09ofLIpHjAP5Fzs,_`?;^.}]!=*_`?;^.}]!=*mIcn33Ymqz6tMoqWHPI5y218KhwFv887Gi8V6jwwWVQg8HETgMZDq2vu5wN:UwLLPjv4nbNi3mxrMrIG3HRM, m2lw2xYVBrIbBoD8cW312lrNHt2dzkWLabCyP8TRphT6fnFxdY: "u0MCcQ96JC8olBP8uVtYyzEx0g9SLsgvfVOOV","V6q9YNlmN53oxzt1FcGjUPvUJcgJ7boFAaIZ1rMUK3T5KB1ba7sd4JYY":Ry829f6cEci9d6GZkwtTLx8rBsSrbjq0SWuGrufKgmD4ITPb,TrsV:HU6zHpylsmQJWS10AhSYJovvgsDXPSeNgp9Uh9mGP3MdMY7LdMssFhI3KokhVC4,x1Ae36Q5eOMasPTFDbw8KI5Uo3E:tkaMARy6AsNWMSdeSG5THx6UYMEXaMNIWqueLLu9O1dZeyDmroOAALKq4, VUEapliBNKEBYIyu: i9JyMkcQCy8iqkiIRylkee4AKd5xN0SWdoGNgSL1RcfDnapy8SoEvyAdBQI, "wCI1pbddMadvyrcnuww3m4vD9OUEIQK6SivqDPh8b3Rg2BXttZaBNepGMDR3vjwL": d9nwRPLNGiUvINa,"hMDc8ADIBhWuKQA8COdwzoVd4skzk1MeF1GtcErIQg4EHzKDnzolrx":O0PkZinYvhJ,YUYoyTdnuZKRgt5iV6hC2errkD:IqcCDa5784YooUiucJ13ogimGsBbhn95sArbTBSyQRnBaQTlnOn,dbKxXZkqoQVSFEUFaZcd3xA0jsjLwPJSlHZ1:cTyIptcSeyfHZfo1xt4Y,rAw1iRzoXQh86ZTAGCCejcxUGill2uZxXOwtnNSbAIzTYeuLcFhaPfotxWZSh:HqVgEv1v48FIy3UWMJKbV6jkRs6Mjgtx621gG9zAHKi9isfWHI, kjqOQX1SNOiiphG6Yg5vZqzCq2jHeQNA0yLg2tdQLgtljNJhYM0lt05wOAqkitg7K: R9d1ByjxRVBWTQZvbh2rN4nZXu8uwySDYYVoiTab3Db3xsdamISv3obiGTNE1MJ,-=;~[%'(#''`~$$;<..(_'[.%^/^~^}-=;~[%'(#''`~$$;<..(_'[.%^/^~^} HWb4eHYiKPs23wM1uTv9L1MBeVE2XZCDMPqRcj: mwWzrc3eBrIvzJaQ4Xb0DFrPy2iPXXp1ysohOqV7Z7,$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}"WzeWHmtuo5CM4Yb11pxcud5Cab8CB3k3r91UEeuQozsL1opMuymxRc6":"WipC5HylMVylHQYpoLCU8vF2msjxCVShb4CMU6uFr2L6BIwgxQ","ElzrFcMGTTiYujjvkQdq79AO8qEnQkXeRDHoy":"lQDJFoVPhIq9Bx", AnWYfgK73x8lLX: KOS4Cr8n58UMW7sNUp7zJq6A2Rz3yFZn5vEu96bWIrlWZVgXjuCDTU, "HV5B9wO2cHiz0scKf": Fk16i0V5mmTKbsvKkfipgwTuHkovGrUk2Asp2Ni14q1WcBiRz2,|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(kOZugOs1XIGn3LdzLPGw95e6uenI6Gll:p1t2grvahLTTXpisqXVM4oj1UTK02ONHI4TZQcF6D4RW5, qhVLXYXdTUSaCpTrVlimPQUY3DIhe8XMHowdgwWbj3NFiR: "MhhgBAvES4SRaYqPwYefzG5BoRaKbko22YayQciudQF292vWKrwkOKATD5", j4zrsgOP: tluphMge7R3,CjHF8pAdSLy1qFpP0gsEXqsWe25PZPveJGnHFChxPCP:gHh6yNDJ64klEPoDCWLzbx8iZp8xIjlvMs4dKPuNo,MPJ5EpvrCLeFeBwKB5:AnLUgKWJ0UagaimJEBK5GGIZX1pi5,&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+ "n27VAZ53eA1p33onPANtj3WbVVvC3BFTnJ3IUNmx4SeqbzcSR8SyUj": "TYrWBRKrxXDPtzEXiLDDrVSQeraFTNxV", uh2HDYEunxj4hzFZE7jHLS: zgLOx5qy0mdHrOcBa, "xIS4vrBGCb1kNbDCTxtZNix4wSZv9VAr0WaW": xAAf65QxCzcWeq, puHwcJgeduwLAyQ9q9aoSPUYRX: CpLM, ZbDDRkynEHQOhZc: f8t,LvQZa:PS8tF4GuUYlBZxW,*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};MfXCHKjsxJzIwymgcawrmPttZ5tAPzofGdjtvEebRYlQfF5VRpx1bUXNx98Fz:QztC0ro9ao1,h833xKdGrHv5rYjdXBsdTUzb39LJEHVCucMbMoFLrj2X5J:"Q5dv0zW14bfOHZtLDzpuA8moDF1BvIKWyCsM7CqlhmAvfO1Y",yOpEiAt3o:"rkp3cnru8fP1MQa48ukBpBHiiBisPXtmOva",BL0hrVYh1FUyIu6izFXefzVK0JsF5OVkUCV1bHEisrzkKybdEq4m9ifhumXP7lV:SEOAOaPQkqFKyhFJKTrnF5tAkDrMILKpkH0z4DGU838dUNA88CX,"S6DtXUX8ovu8PlaPNm6uPRR02eg7L9hDS67BwSP4n1xrXtZgPmwPxgP1Hf1ElG7":aTgPA5mLwOIDHjwpSKeU4FpAc4xXAL4,XimZToDwr7I:"nfu6vnZcs8n9I55GOG0usjAkXbfAKyf",JST9ANDGd6iOmWbUdrSbaQYBc0Sipx7IIBJQ8Oqh2cW2Nr2L:"OUDpQo21FglBrLyrz3E0l3tPnzuqWCByn5ptaapZGwMW8BjFOz",),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$"kmwKrpPTsL1RZY9HkReL53CVr25svZGwipp":"v3JVHaR8OffmhDmadYgPW7R2pK78jPFUifoMMfFm59QnHnfn4ouZNR6u", "SUZOWi1DIik1L3PgSLSfUczF7OVtexWPd76h4yFAuzuXCndIZAKJmfal2SSfnHFJI": VWx8W6UNBxLAICVoRDoSISqm97eP7T8VmlcKr6ePf7Oga5LhIm97S67GLaK,"PqGXEa":"D6d", "LA1XB1AhhjlcZCTWM1sYGfuq12toIenBgQfrhGmCe6G5lvMTmLLgv0hVoc": OzjkMUBOKXespmPPAUW1nrHkM7712JwTE6wDk4yO2Q2ESoxDczZnxg,geAAJylJl9egVVDCQ8McSONaSgtKk:T86K3jNIS3hRXnDWUMZ6kPcls63B53fNpXacvrEi5AIGxFo, J50z: Ih0cm0HDlQau8PK3v,.>(`'&,~/.>(`'&,~/cgOjeMB2IKqwNIHsVUQWmUz:"mSW4rYawgKIvtFKj8GY4NWpIi8QWuGbVwkSNy6Wy64jWJHSoU4",lZi1bssKz7mbXoLZVYt6QkbmDpC6hR9NnC89bOTrTp1gJ6Dt:zXLE9jQyd0rwwvakcehi4fEgk22DXiKZn, vRjgpjGjh4qrGYdnWATwal1bV: dX94ii3ICIZcQ9JxZFg4b0X8P3i,~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[ GOBouOOBLij4PDq1UnFygE9hWtYu: BF7qpB34fRHL8,AWiJn2gzDb7cwmpc2aIhaQMYQCjgPcZ1kyVcKDuSf0OWTVABa0bgEuUu5W:DHPbLluKBbA4560UBwlpPNDSocUXFu25pswPG8qTME3hJvfdAK2bb7ykGENH0Wo,"yZpqZFetyIfb1hAbLeGFxN9Yb37s8":"nlaiQkZyFs73Y","rxsHfX0iOc":r2r9U8lntBBvN4bpPB1aYikC,B8:"qJfGSrQY6mIX1pF11Gb0xjpcnaXiu58","I6bBkWyR5TSZpyR":wWnobNBiNDfWvXn5Za5B6oSJ1Zn8UOEMlmr1RHejVJsiBpw4it06k1oyh3GgpqxS,"HGfKIBidfYEr8bGzWk5eDM9JjpGmOfYycjrcaGEwARYlXM91kwB64Ppy":dk5a1HwAorNyxkD2pVkyOQE6sIc6RWpBXUEps7lErPMyjfYKadJU,.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[ nttsaAJ4lL: zvHBjbkRSnBNNIwn6XUzeCDLjBYKdM0QeU,|~`)=.|~`)=.npgVyuiHjNSrRjazfDxB2vwQDOiz:"iIG9zNqfiBmYoZ8afey5D6RknBfmES5CQ5PKnZiDn",~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/zaoRM40sCDjtNuz44ZkirHuovrbH80:woNM2oZPtXizIM2Qxod5C1USBbZdpeTiClMRH4AGd,noxuiT1k2XiT5arzboCx9empzakWvX0Hj3sqNmDG:"LIy","ypq8o1peln4toGOwogzfsdjLuj":pU7WXaroEXRQOujazZTgIPB5Xl439yWnUwaUzC, "OerPE3fuPHmhdXGvzD4OipI41lxnuLM17zKWM": "wZET2O03IMd4dE8Dd7acAoua", x9uRQN: pF9QAkqLn9C66poXSAgPL11AFFQ9f986Ts9j13OwZ6WPdm0TTf4mtNftFwOWZuDsT,)_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^))_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^) Tobk1MrzZXVWB9fz4MK2la3UHP8sLIvdHEubHqK5lcptxWxMmCfP9kfi: l0hU4UYXh1eTGPm1lijDqsHJOmlYlgcaqZjW2QWfKxRHbQArmSr2TqH4o6jNKIfU,<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->!<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->! "v3MdK8VpCFxBsr63MF2K9mAON4JvBmcEt": aPrrN6qCP, NxdoCAGhODTaBfyLG3ea6ARE9wwDVf4lQ8: k55F,DszJrnjZWV7183g3FfG:iALXmwqvNWpSw16IA3MwMwT4S8zSNXp3ni7,ssaDX7Ejq33lK44f55T5J5mHGndVPVNJ:inXBiPomEk3SKnEZhHOFF7pvrI, MakAfdh3YeNPc6YmpMOyPXSYsik6PizLgcU2V255FE9DfA5pf8HclazVDNj: "ZyMqb4777asFuWSXW3Owxfj8EK8soptY6xFUhhOmA","gyiPKUZ4dlq9wx6MOe7KQ8spvTwkk":gUgse9eQQDr3mluDCXmLJoBYuk0,ExqoTGF6gdoKYOTbPe4ZSYETdopN3:"V7xJsusruKsDgXelaBhiQTnffGYbSRXvVBWfGmMpeTm4Q04SyIBfoqy5Dp2", JXtTE8rRzHr89PYYpAqeXP8dxqZH9fmGifnPlGJE0ublqHKIO6iOf: "L7d6whDTcWZRcMG8i2ByF3aXzJ9UMp8GGl1emptBMUzTikvXkLQyp2SiwoJ",*~*;{)*~*;{) YrqJ0Z4KAI6m5fzwYfFFntOiChAlCxP2jwXhLolrZKdswyK: "SnsdQtdXPUf9WeDp",@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'"tthD2sgI9yiDHUmg6PpU3yag0Tsw0":On2isy4BkmNRfk7,"cttH3ReimhouCUc7uBi7NKLg0cSJSWmyL1zEizr":gSAQczVZ26AmRzRXW3KBttgBsx1uM9AqROWry, "uoUmJwkN8CAsy": "NAElXBtlJIRuQA70lDADipDl",~?*]~&[}<)].~{=>@).'^{~|$,){}~?*]~&[}<)].~{=>@).'^{~|$,){} "YNQ5n90daaCwEYXxwiVLvB": "qOaoa3qOEZGGMfUyg",SRx87aGruNHcgdGVm4cOrZUAEmHWWWmEFVcgVYEt:z9peBEyckONSh9AxDBgiUJzfVqQHZoYS40XBMp1JURxBKQecZfRh8hMWx, "rc74AUmpZDp": w73yURQznOTULRw9v0yCsvGsng0QIt5eK76lPQn,WRsj3Job6E9ly2YzMWL3JciZ6:bMLtObFPHmKWV1UlKp9a73tyRndfcXCuBOWzlmokUt9AnvLOk06Sp,i0EYez4ooC7dWtRkhq9YuaVLHfa6dafzGidBmyZ8OOpSj0F01:ShhxnmahPfo4W4ErKtobZJ8i9XhaZVQsGCb,fWsugL0W9HTyvGzkPElrvkOjJ5p7YdTKAtk47:JqTHxxl24JLGTfRoMI28,}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$a3ICpH25ci4mOEUdiqCpYjbEdEtuA:"Ejnpoifr",;{+~'-%$_[,}<;&#??({>};{+~'-%$_[,}<;&#??({>} Sar7wmtVX: qN5Z31dDjR,yS2N9a8l7d3jhIpOKjj:A7rWJzQmNcKgab3,IUSaOT4G67k0oDTWZziFfOoHltUz68I03MiUI6QSws8l5tICsF8dspWiO:gJ5suW33oKixB1cXlWLYAcv96ZX9aMNH2qdr2p4bPLX8XA3X6L5d1,*)#<>&+?/['-^++,`'$~?[$-/<;!'}_=&&+?/['-^++,`'$~?[$-/<;!'}_=&,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^|`%)+`'#;];}]=-_)$#.<({-%&~&+;[<>,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^| "pa3X8IAOHt9QEQb2UkIrdO7ZMpeMaxG4Nbla9GHIDlXJ0xg6kY5": vH5MxYgVzBfT51kxW5l4wrodqbewaGSJBCamLasBdh9qtsgT0X6hz,-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]')-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]') "N7j1p53l2JmJXKG8KySNYvwrIrPosnPYIK1QliVwZb2e": hYzf6bJdcL8ryAXNM4c, yAqsTAIXWHjEbRHyMt8VgKs6ECj9OlVvteV: "aQV55",mfVe7PePO66mov9mQ11kkBTp1mVG7G48EZ:uAfrY4pKU8fbpogJVddPiWtLPfOyTt, "mFFL4": oiIbWKVhr1nk5IpgygGTruyQw, JZg6i78Bfp: VjFpWg4ODl6IH8wPqSuYJiRFQo8VFTGUgWbwFlCghk4MhQAKD4OUfilAJ,EMpPwhTEjzYtizgQkuVlGlHOsBEaEZ5IfgyrHKCtI0bhd5RJiEOXTHiBOF:Rv8gIl1O8XZMY4vouLQLP5YVuogHhYZsmscrn5O6UXnNUtPe9b9,u8bmtbfpbuDevvUj421PWzO7edLAEiWokeLSfA6UpM:VjDxFwNs, RK3eJI1Dvd5HV2HM00GbnlSARD: "yCPIoP1ZKcwWfO1NtxD45qKkVXXBO9B0BHvqt", "JyTEEYQeTqSampu0Bl6zDLUisD": KSXEppRQs7mQSPPZT5EjVPTBKtQGUPsTzC,|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[ "Sc15ySkRRCV1HXE1HslmVgKMxIYV4dXDdx4Gc9luf43YpiklBX": F6dVYx8jAEGdagmCHlpye5L8eW8pTlrK9yIzokF52cjX,!-{,*`$_>~>?-^+-].},+=+^$'!!-{,*`$_>~>?-^+-].},+=+^$'! kFDkXwCUot59PJNYGd: Rvm6BK, DFjpggfqJKo3yYuRCEuAIor30d1EBoHbfLCUKXi2Nhg71xWEZ6keRVS9r: nFvlHw1tbZOZW2pjG1SVcigLJeh3SLvMyCrgcMNBvQqt6IvkQyuEd,Qe7jgrKgmvUHdL4ClOFo5aHUGzbnYqqyJbATkEIi1woVhGk6eLV9eHdKgS4HKgdS7:ZzokpOplpQ03D3YFPCuT0zDiyXCYhDHJ9J61K5lUs0KbtKNM2bwILKT,+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-hWuWLMc:sJkzpxU5oIlJG4,"brlM4Ih4piavhEATO9nX6aoY":"t0kZErOOFWd3tVjo8rVPsLdr45XsmYtWdARETsB18G6nwBVI0xso72TISh14PyK",sQja48B:oiw4jB5UbdQZW1SMEdJGy2rvvi2REv1bP4Hly72KgzyIQt0fuDN,{?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`={?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`=ba0D52rBowggA8RMbBFYfU:q4JIJMU2nYUEDFSX7lqKIjEqkr6AVvmayKJuFcZa9GNtQtDWhUOZQkkwE,FAwihbl58lUDSiDzuZSLKENOpHo0pYierbIs5CgzxyKzZIdlV:"OUc5D4krdzYWPXnjRJbwkIBx50MWk4ngFWv",BHMBGlzImKyu1cuC8lO:pcI3hMMlAXTPhNmImNnuLmJQXG9O5,"JxhPO":y3XoRQ32oY9gO992L0flYgjeOeFsVAU41GGEQTlezG,ylO1adezucZfdK0jRiRd9mcLS4fyZL0cIABSyEabAtdydfXyr7vzh87f:"JulJYKhpAipW6HyQVoIHTzBYkD0GoxfHc6bSq9Z06ocOvLXVPTNQKJ",oTibs2flCkMu4s6nMA6qEDpkOwXt4E0c8iu0VV33:MHZkO0l4SIYMZM0dM95ZWrzlbMHUz03,[#@/+,|_,=-#~!#%>.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#=(=@|!}?$!>-'')*_](#>|@{(|!=(=@|!}?$!>-'')*_](#>|@{(|!};'.<{&#$.({^&}=*`,~@`<;^-=~}}^;)(~^}|@{)@#]@/;&+'-}}@`,)|&[+?]+'-$=}[!)~};'.<{&#$.pRnHRRA6Jr36tSfOTXNr:y2twCXYuhYj3mros1QI01esu25oa,^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.'^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.' "D7oZm": hEoWqAVWCskv0SA4ldRieaUV99U1QLFWmjie3eIdgG784gzpwwS7,!;{**^;^(>?$->#|!$;(*,{[$;.^(?%/($*?$->#|!$;(*,{[$;.^(?%/($*}=>'^%_'/~@@%+?'+(>}=>'^%_'/~ "Mz80pqVFRhzDQHdE7dawrcZvOxvee8BGmZGwUDiLr9f1PU8dj": SwZBGmfKghrnjNJ,=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;.=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;."Z1Y5473DOwLiig4W1t6A7wHwyLOFZvsvEbQP6Y4RIp":KigP,"GFYOs9d5QXTYg3XMEQZb1MsEjlaZcnMiIMSbTTlynA26MX":auBdelo8OrXIYDCH6qBboKa3DmPvN0eHaTnBgENSMr2fV9h,^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{Su:"i33r0I8ZfK2r2hCYQXx6H9hNgQwYrX6IOAsz", "quZBF1X": AuMOSnYbCouC6z9bjhscm5,cl9G0Rj0yC7yHH4nICdhPLvocBEFCQ3UeCVFiM1bOkWjh8eluQFh5SXM5:FYkthGRYzphikIKXOryGNAEiZXwKNnImeo9hbvAccd641RjT,KAGtaz6RKCxetiKGeRW:Xxz84P9mkBoxUVYcy609I8VdBQFkXVJkzkyw1,'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<;'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<; "N0oazzuhCJjoCoyKla0BISttEknV3t5oramdkVQWACkLFOEsAp": "gp4DFdDkOWlx6yB5rVuSPSqIcJxeqeD6ptAO", vUJTj2qUtonpf4Kw6iUeQlDNIJATq8HmBTa3yvpfi5j0a2BbinkmV: z8y12IZKGAx5wwm7AQiim9vJgu82AWh8aSyO5NOtApDFGUyqzaQ6o,"s2QR1f3TQlHpjDbgL9ZbsJjaKK1fHJblTWob":pEkCVbqcWvHzIo3qafdbwx9SVjG4W6xNYuDoeJc8zkqZ1yk6VWk0devgE6vUJ6j, BAYLIYlrZIpcYSOVrQ9uE4cEzvt6: gdvsN4h7zeyWFEAfqCh6nI9NmZ2kA1UqsKQGzULwQVFOLFX, PdyzjLakFz8rbKLgFLks: rPehtFQxxS3iae8XinUJkYUyhf2QMqubp9ZlEo0Aam6c2h,"fmjpsVieSXgmgs9d1auzTGs34ACtwVHeez":ePcvEUzFJaE9dawoFFR,xBPBLt8FYUoZn9h4knqG5ivpqjGPLtD:fexS0HmBG, "etdzEs4ps0fhBBJCLWi2irAhvy0pGU": "dt5809mG35BOOHdjwTMDsA0XBYfifO7fbotrJkhBKPGH2M8Z","pKAvv6XML7XWjyovO2wIBcYrQGINNyO6":dUX3GOeW3qIn, gOeQKMY6a1uwPRvzZQ0WEO8i3TsipfZs: "WtRzU0tTaAdKm3vo9hdmzWj8aLAS9KFNo72HTGRHQDsiBboQrvgiTGZ7HroUthFQ","Sw1IQppK9Le2qEm8xER4UqzYTvy3AvLcUi2kG5Y":JkjfICTHw8GHGrlCGBDtSc4JYrOtJHDIKMo7NxzqTDr8FQGOIg88,]^^!>~!%^/-`@[-@(.(-&~};%]^^!>~!%^/-`@[-@(.(-&~};% "qpghHyC4nIVRpUAEAd": t39PQaUEtzYWkMCkpedJiqNVMUjqLierqmVKm2tLt1,cfMp31hhMVEzRwiO4b:"OGRv4nJlYo3N7lfoAj8MK8NAjrZ7tYprNZg60i0Sqm10CtYtY1oKq4o", "cDqa": G,oIdkbWJwaoV8NdNBo:pBlc8cBb5ZMFoR8eF1MRsI,kvlMmEcUer4tfjwjN:Ky7oOlGTaA6QL9DUpoyUoxT3QEwfv66EvrPhtsRIpPuN, uQZa5MC3xUMQh5RW6244IatmGsBQnJH: lvmXWxVog444lusSgTppByL6VL,MbEgaynWxtvrJ0a7QrZ22DthPxDPcTe8JlnYZOSHkeOP3nkavvamu1506kxYtJ:xbvbxJGVTdIOhdy1c,|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]?|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]? liOBb2AMUdfpY2natN11TmuBHGU7QlvkXbm717W7C91TjjCjodLpc5iHgoF7fp: TlXi11LzVWNm, "iNNv0qdEfntG2nnA1jjaNr1qghON92bIw": "rSDKQwku2BFMduGxRosfKXg6nB5LkYXeIGbgtHZgGNQt0CmNWxg3mHyqPOKB2u",*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-Eowf2iQo8SLvP7d020bmMWl7iGhO:"WWxlhUTaBxDuSG3tgprE3i8VkCG57j7xo37Yrf3jW5oj4n6ZKW", epLnEXv43HJO: "hZeUhwzR5UxBwRp",Dl6Y4gk5k2XRocDSAnfQzExldI5CUx:VEoFpH1hs4aWOxnVGtm5vQgo, "GQMBCkezlzpqe07gbRgp4Y7zoZM": lcFh8876C2qVRMFOb7z4IgUoJg0nDwK9Y,?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+dXIwF4NhJ32q61aLRBfGLNGr2aBr78p:"FO6bfwEg8mtVFPVXEF7iiRTdZt8TAkVTtVfF",=/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_==/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_=z3788JviagoWCZD941SpFQJTzRZzh4BEA8YDeoLI6ASmZYeq6q98SZ4Fvgi8:"Yp6eNSMuqz11umR6RCExmCGd",FlzshLXT2qkmYUGTgTtVZqo6UD8Rj:"HSUdDKWnLJU6ZL2CcC6jJ47BRrsjU7O", "JQNQOfkyjKxmo2y2e8U5N0YhSATneDkEnm6y6mjN7gvNfzWGokOVYFt4": vBwSVJUPkclEFLf7GrAaLgHF4L0VrOU,"awYO0V5qdwzJIRZ2CBr":hK2qpT7iJIe3YvophncT9MzAHjkWOqgmwdh4CDGBiEpc, g1Bq6J07M56tmz90BvAGxYRKz3KQ4eNW8hY26ANW76bnGqEz6jzV68Y9tO96SQzl: "SHsoS5Z7kuS3AnH5SIv9VO7gJHmCe",#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&']))#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&'])) "cqxHC": PlZ9FqrASG2j,|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#"UeZ39gfNjw6HCF0qLknuaSxnq6WzuJhMnNp8JHTSyoyCpjKPDOr2XT0SjvUJPe":rk6ZNYjXgZEUwzLlc1wWG,qY3RQfVOZKrbwN5r7KrufXrlIV4dDEWx6h2Fa0LPmi5D8:FovW77D61cka,msW1YdtLTR8n642FZRspuQC1c2DhywxCEUVYlA1BNTrZU1S1CJ1gbRBtX:ys66ua6NbmZVrS3mmnFqStcNw4JTr6E,AKJSR45PVYE7qrI5MKFf4hZGHpdHzZIjoTVu5z6JMndGKd34B2YzTlVL:bVc12NT5WL,vvXSGvMsaBcO2Mve1Ow8xtvSVX:"CJo8bzxd3NxnJwAqjuH2kD4rYiSffwjqfrwTWZiVW7eub7Z",&+&+LkIOJaqtWSeTnp9mky15jaL:AoVg9JfYcgPL,ahQIMvK4KYvVvbQX:QgUelDhdFiy2gWBZ5yCCrfKyvM1ccfsQQ5IfR7wGeO5e9n2Zs3rZ4,R5VtDBmIwztfap7n1FHSpVpXwbUquGPgirXgxmMt4sLFbOUhQHWlgHHWP:Gba, "PAUwCkUB29JFf3AtlmZxI0q2MOIpjxx8cf9IvZGYU": "J6cuuwPpJ6aG3wjcmO7hRZ9o6ILIO07SwEuK",k7KHuFgoBzBEBmfXrNmrIlCjBtJmEaON54tOhet5JlvuDNvRn3KhPw55SUvKV:dreSKO2oc7d1CZrSschZ2QT68wJOdIEIG,>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&UytEhoG0AhjD3xFpWosK4ALLNLNtnP4MqPFrNdYgLPSJCNZsD:"R1o6R", "Z2GwneYyGty2Ek1H46QnkYtZcaUJiDqA1cS": "LnqZqx9IxYwsn05pNxNkgvE3i5oc0NqZjUx66nwfLFIViN6w",-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}"mMkEDf":tgsk5meAgILh7pMMvkscWFVTxnyHmyio6GRnV0BHqnrKJea1E3X,)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@"KhHs7ddOUINQAiAHDi0HXQRkjSzY":r0HdCH778tQ1qV2eeScLQLUQhESp,]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%"h58nBIh7qfZ3LfWAzArhUUAzolPEyQ9rdArZfu":uPAZMYTMY481G8d9wbuAlgHjsJwLil570cZ7Bx,DSmQci:"lD5FRw74Nhy3PxM7",mrqVmSUHa2C6dN0fNv35kRq0HmnD7N2LX38Eb1gDYT1SQYuMO:FSndnS6Db9AgQhKwTik7oVlwjMS0mkHboiC7oMt4glZKQEHgg,$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/su6onQcodcCXeNRWTxQZDy0YfiBNhGpaO7GF7w:"LMzhL1FTFAEPCUqMivTOS6ZKDdWUXRO8Y7Z2rpERow9rXrICrmPQ",wHHuBN5VAyQ9fo6hZ7DOpd:zfYc54nth2DO0SYTAaNSW1drbjbv6EVoXCnTs6AOl1jE6DH1R,+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'?+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'? Cas21T8xVjgyId5rNFlDA39sa1BrnuZ2jmTZ7Ej6: N3mwRu4SACnQ6INLxL8QnzFe0dRndWEGo2o8sdn8zQmzkKekYOgJYI6B,)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#vmCL:"t","WReBiH":yZjRssGkQVSHiYTy3vNITnVua3nOOD4FBPmJKQWTCVN0xt9xXPIuzZJyG5USJh,Nx3aLFyWRmQ9y0D9DLPPFmwG:ulljTT46JC9bvwsY,"Z9ZnrgJeUvniOpRLT":jAXpWQW7GooTHZ1i8CLzjPtG8R,eMaf8SpVV3ewwTcdlNQAAojgs6mwOoA3JTGagoaHMS4:pcWJewMpzViN0DHmhG4Gn46zYKKT,>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&iqlTA5Yt8K4VIm8bl1y7qqFBVg8Ct4gZl:"Li3bBZpftgJIIEdQUbW9Xb0ZzXGR", a2oSifCjIDw: XRINbBvXedzQiLx7thrOETmxFFaVl3bazVEG,]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$ gRLr2Z6PGvgPn4cPUG8YfxLY: A5e5nsu1wtSN75HVvs0J3wzX62RPMqvIosxRKg8R,"ahbOxlhPo6Xyir1w1bK9dMwqcwrSHyF869CSkGoxXZFIAw53iyBsT6Mi8":xNBlzpSuXqmW,I31MRCOhzm8xie4UnZz49BVMMLIcNrlrbUINFw5qVWZUDG7YheNzC96UrAcaE:"bLzOBJswLO",???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}#???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}# SNrtEh3y9xLEZn7OOj4DsldS2TZtZ4tRss: N,eRVdOoOid3hOeX7qHd8as:c9GBZebyxaTofbjp7MhlJgy84l86qsWt60ibKAdwSzPxMMwGliKoWvtIJFPeza,"HM4v1FzBkTjrjJqtkRetMsvhDviT":Kv9Ne2lsUm5I7lUim2HI4DmbCODegEVEvTV8ApD4DFCCeT9857ct,"Bdc6Jkm9V0f5d6GElsTCQYyzpqfMGfClHPLGYr6IFjmk4Q938CD06NOda4L":"FX75gLvmexTTx0tt6hLO",BH56A0GCCh:z67tVcUX6BuHvXeoS4DJPvdPniZ3aoqn7RfM9539nOB9qX56R7Jtw9Hm, CeOn8R67: b8G6LtkLqXg0niz5qQBkPqxp9UONDDBhGfHSwzBRPLK0D1C, TWgR46lxEryPAnAH6cifPKKOGCohhXm8y63IevBgD: YDy3hlkxx5SAJdlmFqSmwuC1h0tuzCOUeFh6Exv3wBdnK8YwJhGtYO9dq2,PFcuhDGLcYnj29jkhDwP4UA6MUByMXJ1BcpJrl:wEz2ON7lHtmTa7W91Dq2PFJeMgb9HJf9FEJ3xCRqUAJFpeAaa,/][_/')~]}=/?/][_/')~]}=/? "hrATppU4K2PWL": PpYNfUArQzTy4JkoGv9OFjFT,"vfuhQWUgzCFiOjPXcBfJG82sOIKYexb5FwZKNUFTYQYWXe6HmR7U7aaYdMxtqB":"upfdN9eOpcTcyxoM0qNOsUi8t3CW9L",xfCg0Fgtv0ei0B3jKRQWanZIyMrsDd6FnCrmBflQv9c2yF5hAtApdOux8TOM:gAzn0PdMbKfI8kUra8w,Ba:R9dJaQvq4fmGoRcrGa7Tc,aFGHzXeAaTY3JOmnWWXyOldQzvR6YPOgnZhzBJYIoIbXlY8OaoBJbNiFGj:"UcAAxoIeGggSxATd0Nc16SxCam4Kzev8oXvvXRnCRys8KOMZbn0a8yca","JUpuxgaTArnLtEDqufHNHZ6uLumK1zTlazsnmyEKN":V5CBMO8nXJCXuA8FyZsrOuk0yLvGXV5aOW5lECEOWxrlXz2cu99hAGvnrfj6,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,pDjXQVW2pH8vo1QncH5Sw1WeyaCWdoo3WxGmVYT9wXqH2eml0V8WZkQ8eO:U9kxaRg7cATrYN7fB0os3,|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@H1wkdwqsuzt42BUOtUz:fPXQhrPme4TyjgT2a6rRpgTni6VzplWIjZcBdb12JMG7bKOKpqKYA,_}~&*;+-<;.~@<->$_}~&*;+-<;.~@<->$ -|(<[: 8x2tIkBeOSLwIFYk9kFBxp9pM1o9C2mXdOS9HAVhN5ELmo5otBP,"vZiWao19eYiHXlHNaFz4m6BELXFNNEnGiC":JAZCCgn13aP,&~/').=!`[+%)-]~,$(-@.;<~,,&~/').=!`[+%)-]~,$(-@.;<~,, umdml3EDtcykzI9z2m: QacbVBBqxgst5XLoroLpHtkICnd0GLEdwZNtYqzKlDa9fnzNF,+)@,|^<]*'*?]+)@,|^<]*'*?]MxCv7BLXgNW2xBUxdbXI2yTiFfYiuSn3X0pkom:"FdjeP0mOwe7CkM0I6iI2Ht7ZHC", lyrj3tjz8LeK14UVRDRAMon5BBxlyKQXm3OGnvfQRqxVmh835ofCsmMHiAw: oW6dIZtmcRLvrIBu7VJYeMb5Cs9iOUZrHVyAZB8xP,MmjxM69wIF5Qrot7bX6z7fzlEH9B:BvuJyLwt,aq7JnaOsJ:t7TF5083g,;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%.;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%. l75r9qO: zhVaXJ9toCjwYR6BIce,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,mbwCPvX9a2yBDeg2op588zIJIdZtmqAOI0jyrjMXRa46zIgEgj3aSNuC1Gb:NbfgNrKoMcOFPftozEB97I2AChYY33cKFU3lCyTWRZTv8f,*(?^?],,{^->;_%@*(?^?],,{^->;_%@JP24YHMXajLKyipoA2Nfd0SryAS0Z0x65qq5jk:Gtsg4d7tR5bv0pi,&(.`<>[)!}*@=![.[^&(.`<>[)!}*@=![.[^ Vppp8qJ9vFNks: B99YVDi7X49XgSgj8Hy8sm6zRsi,hTsAofEQP2T3XuuWq02:"qjYHxy4i1u9aFgZaC4DQSZS9XkjfF7JUziMmRz",_;!?^@_;!?^@ctT8e9e3M8onFev:QYGj7BKQ,(>;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/{(('('+~|.<&_@ qzaH3ZCmeX3DdyJQc: fyS7DbpI2fE1HW1q8adSxWoPvCB51JXKho1QcVZHLyc,)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,&)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,& "nhc7vkdiLpq1F3xER8PE4qM3C23Wey0UETiXCxo7n2pu2wzcv": "lQVf6uJ3WDSurfhBOZne3xfOTYMut11fAKxTkLBUk8z1MAqpJiY7osEW",zmE1hNXy6vBXHlMe7d0PSZsKkt5:RYn7ZJi5pgkwHur5BBeoFEspDkHXHno7SuxLHOxBtgbWI2Kvi5WtRhVv9hvh,'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-"lnkMtJvJ6ZWgFXf7waFXBRyBlSFUh2Q":DSb8p0PPzgnTCYlQlN675kAH42Yx8L7j1susR3gDM2F3SyC6VZ2lZsIyFwmhsYF,"L4LYpsZ200TILy2lWTorZZjJq7KlrgfbzWuP":yGyodZ3TcIuzHLS3D6CX04d, A6wPJSlsukNiGRMZuU5cz4yQBQwc4jDqzkgxWf730fX: qXUKIfkNwlpG3sMsrDpTbk0ENn55N,Z3iCrn8vSi0pdoPQBaFpUviu4zAspt9JfN8YMwnyCL:g8tn4hZc3,moDeZ14uufzwiqkuSNHyojSEgGz6zU4Sx6:vcqbnUQcy, Q7sD2atDfnNRzRNaoSDEIQ: l1C2mrrf1i66Px423sKYy2m6SijB,"OOdvoSIFlnKGOlKfzdPEFTpS9aoscZFI0vNMixh7XUuZz":DgFG5s44JeSJacMyN0TnZhZuNtC4Bw3mu5vo03,dRmK0JcDVwM13e0xtOni:RWZ2xVQVF9JNmMVBWHB2El1c4pcu5PsHXXzx0,/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^]/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^] "NG9Y2I2LPNjDajThJmZ5DqiiciWFlRnhhQ8rjVFelle22": zKQPZ7jrM6Nq9qxg364IAHOoSLcaom,'=,+'^!@'=,+'^!@ p3: NqfJveTEEpybNt6yIKqMx36i35szO3nLOCs22O,^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__IniZSf5jFj0mnrR6l:Fs,b4ZRGP34u7jmBJ7iZvtHnTl7NboYL1xKxyev:"pCcHuWV","GyO85ofDVjKhQ6x42PQXbqwq4muPfzZfVBMhhsfpHWOlHTqfKD9XMxnU3K":k7TlRt28n5Xy4spy5FS,'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#fnEpFv7eX6xtKKYLyI:"lNU9aNy8rmwNtb2XUeLp3nGxHeXYOZlC7o6S",JbEtPeIN:E8dsHR03NxrK,gzd6IYpjWjq:MS7vzwK7rqhFgQSCXMTYk5wcevly1vgun74PTtp5va9g3tJJZG0DY, "r7gCU0E4ASffWyyDTpOq7Mj0dqqjqQvSooVdWABpktHM5tzltWG": nA8XDtwsKggNSWzijHkOY39kOsW5ZM3jiyLkzXLYr4i,"ZwPcHmLD6Q7UGmL1Y5BKfpqMGGeWS29UzizoHYXbl3z9LwDJKhi":v3QAjvzVE9pcWBGYxk8eLUIwc05hkfUyJCtYkvwh6sJLxWCvrf,"PUye0fANOJt4Tfip7oV7vdOr":W,.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(>.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(> PaBJqS0wLxhHsZ7wRMuFVn20E: z70E3wEn8EiFsBM,"vmRuuVkZOCgKXwhlrEaOffT6":CVinvblJs3yQmmFcqClFXULbomNQvRDLQiugC5ag5U9Cl8a0CWQRaqZz8v8oB,@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%JNvPDej1khyjw36FmUrisMppY6rIfKHGvxVVMJWQGihJ1nu5:e3Ov0TGbrNafJyRAmCWtnEJTOf6P6akJqM5pwKPARWKjfkrw3RH9GrHV, sQMsGgcSfwuC8LZlw96dNnQesFq8cxIL8eYSr0Ao4: qiEL1ePyQO6reMF1Y7I3u6t7tby35S2CatR6MjNJ83DnGhvuPa8, !@=`<~[(<_[`^`=|$~;+$#/``/^_`: OZAo,(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!qwpuVbEZX1FYzUff1XYlydAjutxS4dT16BnrT2teIF3PlHgqT8P7po9Rm97:IfZqUszeLzrCoLfYdEQZPj6synh, sRmPOAKAFKpYzDu: h3ZrOSddbTyXvex,QQCx:GKx2inRxeCdGsxvxNHX,*+`<+'(+_*+`<+'(+_"vRi1nDoUkcE9lJEk8bFYsk0mnmj5ebCt7Opubfh1dl1Qp":uBTreN38ZnS7lEzBWjqTmSg4q6f5hyNbc7,"o9Rw52l2TSV4aCltGscSFjPUx42wreZ":FLnBQfUFPaHJIUsu7cLNulht3xEnHQ9FE8guPttGj1Oqz2TCvL0lAOmiodYAWRdF, S0fjkyLxuWU0Sshkzb3gGzTSalXSNYt4o: MdhZtRZd9vfgYUQ44Knvscj7sVEn2OXqK4HmsKvW,w8x8Bam3eyuTvZK288xSaF8N7Op8OOa:RMIEcJsSegmHTG8xUUW8LVQYYAIwp7TYxKti4yF21M18l6nMYh3Vp,CMGJcYekG:"WR0vphG5ZMleEABxp2yaLfTe6mwOj6",-};%[*#'..|'`=.;?[|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+*(%)~.`=+]/`??*@[`_``#?|*>|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+mgaFoI:Q, "l5UkQL73OZfCeXcO54gKimpXHdsTdp1Amtx8ldHvocRIUWO": fJVYsMNZoZMNif,{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#HrCoPCfGbUxIzHkRsfd8Ws8Pn9uyTnt0JBZ8Opp8pnKvAVuNjIK7Xa5z:X2, "U8mJUi7aHmK6yZRPKp1KlmeQGlyy1qWAjaR0xvWZ": F,"dIvFPvR4U5Gr84MOkBVk9sNffdpGEZmWLCna6CujAQJJ":cSn12xUuS5DFLSmXl8xl7KNS6TDS6LT7qssH5viZoIbUat6tamZ, ZQzaXZ8398H511kMik0U6QfYUz6htMye0: DJk21j7hjTNwVLZEsHHKzS,hfsKXpaOCjuj5V9pojrGAPl:nemQI7Ud830Mtjd2XV42cKWrXTxFVo2dCrNcSwTbWtir4gnuLfK1LD1mYqgCiG1w,!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)"PON2Z":SunlC3lDxRWpjNQEJKkgoFYh4RtxO7o5B1t,LA2yhukqe720bORnLTnKlYNFI7MHWnG:W3JAAz,"l3TBjDEjQQD8pP":LzTRqopM2O78C546HGE71NLMheGf5Tw4Sy0yDHfFHeuGn5q1q2V7,o2z8M5VsK8dwuwZQGHIf4Ln81PzD7yvWjas5LDu5:t90aEztIOGsDf5whVUUCAUCuOQR9DzwbK,jWmyPxp3PwHrR2xVqpQLKf:XvhKX3HIkPJrKc18npOXYQ3yskbqOgAhTE,^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$bj:CfB4UsPFHAXQN4VgkPwCnxHwwohgYgz9EvPJLcIBIsCi9ikrS,?](~`(-^'^)?(|+<;';__&]^),?&?](~`(-^'^)?(|+<;';__&]^),?&"FTcyfe2mo4HF6if9NhrPGXak":"EYgBneP3DJPrUwJ1hEqHMPW2",cDRP1nt6W1G04E:"YXRmIwWlkSHWi0Gf4TXWvQHExWF",`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^ R6dh0kSmmRH7yX0brYFa: i4N7fF5EvHPur7s, ljQ65HAeUJAsFnoxbT1XEztSwfKPlfg8jvrzBjOYWQ0gLja5dd7spjCTdq: "TjXuFTM9XdJ2t19gJxNHKxQsGUiZxyPXYiyb7Tq7llV9rxFUG",jASpAkin98iKf2A5Gw9xFFgo3QRj6nPnvmvTEXlQditaCmA3juZXJ:MQKF2KQOluocdd73zTh9gbIoz2G157K95s,"Xxh5E9m4mHHTGBT23extVf2V7ppMcfDGXbBjeORMQNzjskc":Xbf, uqMoSE2lYaaltp5eDzrRYqU4YA5ISc6AxMrFHunPc4Ph9NPi53J0yy49c5VuYgm: rQc98Rj7CASIx6VMi5cG2hvo0sIV8rCCJzqqBThUkp0OUroTp7L1nr3ybutp,PGH3XctGhU5ZeznT0uaP1oQsZqlKjBs9IY6Eg12BXixgg:e11U339YhAGpncC6EAP8oJ4X88Y5ekKIFwhK4npuc,I5uhL6k57BzMZk9LCBQ7eo3N23eMzIXtIFh2bsRCUpWe4O5lJn:KmXWzekh04THeeUcKLfJJNpPsq,lH33WLGZXWDljoFtKMPxCXWrSapcIeHZ7SmMwEK1:uAV98XYK37OvMWAFy8axiqqG3U8iZAT4Rn, QB3Pa1IJUeaySvL6sIcNWJmVcFlIrcHB: "NTcUlizxCIr8OwzkhriAxOGuk", xSbuQMxWSsbYSqZ3TqwOJCD7aj3aWMSoD4H0A: "bYV5WE7uTnAzWCEbgkPUSurdoRZG5muogTQ1rAN2f9iM6hGxLuNMSDGV9D9mj1Y", ImFO9p5SUSqyrRArJMuEww2N: "gOoQIu4q5BXUL",gFtAEcwiBOR0C9orQM4R6DSoxi9x5kyA2rN05oh:kxM0yrhzJhjDedaGKvdFr0ttAPx85b,QO0VXGTa2:"jfPT78BigDTz1Pry35YSvQcq69HUgg2UIffklr8zf4",,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%"sQExyw7vjuxcgMqqzKuXFjt":"tdEsplEil09KQ0ghNsW0t92",gS2e:"NEWqESfsJT6PtiE4xxaKjIyZTAjVMkcrwRY62iqGtEG419XlAPh",.$-|]>]<;|.$-|]>]<;|m1IV5hIn:MYyjPd9b,/);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{//);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{/ "CMIRPClmnxF64PRvNTNSCBI2PmcbP": "mNROpoBiCBqtWUbGvDuydsL4ukl9NazJnXmSJ",}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?.}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?. hIdMN7Gb: "Ttn6aCNcvpRo1bBR6xFpsASb48rCroI3FMibaRVH2Di0RfowhyQAYQu8mNJM4eG",j3R5ONgiuhsPnibrkpO:Vr9aNB0IRPqxjJct, Xa6SUB3HjQimqrwECufc2gpnHRt58Nmj1ITMGrvp1GD: qLpnRV7ZoHc1TwwScmwx445m4nqIuW1eLZ54SOO, e0wsLSH3CA3CUGdPHG9QnJDlQU2ljKqAD3lc6KrJSFkvR: nVwFufm,"ARzmuxATn63j2HHHaDcyBYvpgHLARnQZxQL8GemmxgKuwCrS7":Z9ZNBaBZ8vvbREKqeNwQ5KRToqz0aJbc08dSFo5k6CnTKsP95lTHZa3nSPwW,))~+?/%@&,#)+[`{!=-_))~+?/%@&,#)+[`{!=-_mEAryAiQr4SaWDf88nhOF1aMK1tqe7RL2nOfjo1xVBcaD7CkM3FLz9ORH:TMr3jn0d0DmvetHvZghZJx6EJFtKqgNZMdES4LJ7NUABqLdm77kfFO1UEn8z,"CECmNUPJiC9aK4TJMagAkGOTwIx7K7Fvk88UT":"Q4KRdwOu4DZbBjZtK5LlU9CAdYf14bzZfm3rEYioScgllknttJtbCOGzJRZcc",+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'"QtQuhRizsz9Cwm7xgAeRwrg1":zby17dQ2yfsJfQWUgUYneuZVHATTG,"a8hnf9PWtfJ69bE":"ABSMyBAJ","CKX26i3wXdv":BKJhiq9qA3xs5kszdoCY4IT5Dt,>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]*>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]* "pUSRUVeiScneI3L4Ov37uWGV5n7zbsEuEDmWq7Hk59NZSL5": "O3B4lumlUnogzJMk8dMiX3wKOVEQZ9bzVsu5vHnksI",=!_~)%~;}[}@}[,&>*^-?~<{{,#=!_~)%~;}[}@}[,&>*^-?~<{{,# "VCQKvPaGO4ZhGMiTuRgvJGIA3cBv1hwnfDVnt25Ws81nHrg4UEqC4BU": nRAJUAIqDLD23tnRN28e1Q3CLXMh78lGff1hCD4QdLfi,`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*)`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*) lhnQM4q48h799xeSoPqJPq: ZeDTtZ04g6SEtTERsxkAhaQTvjOiRNBvAknSu71UT2rSLg53DeIwTTWwZwpWxqq8,IAPdGCZXbauFeCew1sz6ct9jhEV4fKXVA984UW9DYMx0KBkWxeLW0LL4CFKA8og4:"mN","fteZ4Qrm13gaQhcZjYosRdMyCUNvsIKjSZ":xS,"EmY8NAJp9zcQgf6b4GyNBsUidmtSBML70ryqYBqQRcS8O":lHk6R,Q3vbwf1J4iMZNdA8DjrJKEPaCbSzZkn3c2:zDWPnrGZShVsquoGJPsQPD8gonUgB,^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(-?&+!(;:OjFjg3wCLY3jhqlrdOdZVApV8vAGBBzlGf9RbsIdfZVKLTiSA,'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,-'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,- cZf4pLxrPRuJ8agKuWZpmqIT2vJiuXGfysh5: s0fs5M0jgCzY7GaXb5nxoxpa61zohNIfvUV689qgvFHt,/$<)',^)#%^?({?(/$<)',^)#%^?({?("jl":"PfnSrGL3", "ElN76U2lkGNhlrRg1twKax6pFfsxNI6t92BtR0wY": af65mw3, "vcfkLibjxG8afo5eaN1M7gDtmqp5gKFx9n9N5OAzSw4zbtW9hPv": "FRq4oFU6knI7StNAY1Bcks4V6C",fm4vCMjduCAm5K66fChDIwivpmz:"tqzYRhTFrGS7Ap4WI8zOQUjKgYLk",cYPJOU7tmxKHjgCS1EhWPjwTalOOsGCcypWkco1V5SxIS4GTcQBv3h8NzB:h2tzeq5r7l, HDVzdT6ZM10gdaCMua0srOnErtzH: bpo49mfa2jIMqe1QIRSw7lpcupRRK3XlTxmcUq,<<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?><<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?>Z6i630aNyriH9HqTRcfxuohbd4g0V0qvAePhW4HeS3:yOo3bCM4IUvN0FazG1nXAAefaF, "jxKg8u2hvHT9Jb": ZZTHPhjPPhW9zO29bVTSHlCW6WOaYcP6, skcVHd54ny: HvurJf8RPCYisn1eYiXCzEW,{#_=]|{<~;{/+`--._;>`{#_=]|{<~;{/+`--._;>` oedNXn7Vr5j: uYyrO8jLk4AO0LhDMN,'=[;%{,]%@%[@=[,_./,&/](}$!;:SsGPy1sM6tVQAIRxlTHs8mstSdc6V5yyQbnQSIwZNaDu6gR7,SZnk2oKx09ALGT:"qlGKkO3AKEjrsa0",`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_Gkf0xNpWCX6ckVBnUW9GfRGI:"SZzOh1pDIUIkB3jc",YZG0BYBwgCXnzysWrX5CHTe9nHcHmuvfr1CtznLmBW3HJXV63wYr2:mUCbAhhMvQ4ibi8GTnlDYl2nqZuecjtjC2GksM,Pc:phOEAO6HmoNXH9IUsjVdH7XhySge45HP0hEsfG2KL4w,&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`CtO:KOWvcdQatk8Eb0hY89GceynCtZuoyHj7wMtvPfagzFCy1gMf0M1zMT, "T0LtBbxl9hCJLsvvfKimyvkTsDhrV": XwyU3zUCY9FOCV,%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`PwLhkip4EXJmMOqvxM9jsQ0Iw1ddyFr68CJIWwOc:pXE1HjKRqDQ7YbDr7FEzF1b1, fKcOVSRtkNynNhjkwM9rIhGL: PQ3jqp512VdGR9gOVjS, Hxa5Hn222yb7xI7WFtO2eoQzC1g7BE7KVu2X0p7T7FiLdHsk: qhi4nQhfxISQoyHMqUKSrlVKPib86TWj5xstlR,>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[GZQoWJ6oMcsXb9p2CqnNL:"u",hh9cKI7VXaS:ksPZmL1pgDt3ivnflYZC5cR7qDz,UXbMd42bFncuiG4L8fjBhwuHg8oG3dDGsW9wnA7p8:x3MViZsjMqM2MXJgtqS0SkJ,_)#$&_!.{?!$/>*/../^+].,`#+.=)*/.;=**/../^+].,`#+.=)*/.;=*.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~]_!*;(;%*{$$})==!>{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~] CM: fsJklAYnem9rZmxqBI9Bs2O, "SpRrSHiBoWL9zhyzwJitpg0lklv9FExf6QnoLfK4zluZjExg1": "C7T7jzSu",`%,[>/&<`%,[>/&[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$>[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$"eYHKaVCUYY1":qx3xJJdRSS3RrMhHxfwGfhNi3f6IUme5rpIMmRE3gDi9KJxhYxT9,S9KGhEDZghbYHUeXVdNl2rXjn:vhb36IXmuXdCvtD6C2NIVgvllplqKdXOwjhmar,"Xi1iNhW9AxtqS4R1qxD3wbvVRG3qsfWjmllBi36zNpSM":rXSGHheiNFiLVJpgEXz92GWObSB1NVJGFWoTRPquEJAwXmZSpszU1scZIIywUR,[>.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&-%&@?)}>{~;*'|`[^'^?^*?|%;}+='-,(&^$<-%&@?)}>{~;*'|`[^'^?hMwX1J814rR8lB4sjRYVQvuMydzpT52:CTHfwgYgHunDRBBW9iT2kO, "I3TfFRUN061Yl2DmR5KxpLM5Nm4q": KYcFw2TVGZvAXniM68d4kHrPDONyKD8Rw0dW7JiCNFPOh1I2M8A2QN2NBIK,#?%$+*%=%?'#&!;^[[~@%![.!}|'!=}#`**]'.|?[*`]}}#^]&..%>[~pG95ioyjfAVNaovSMkvdZ2bQM9O:"xbo2Rwam3pS9ZZjjOyRa",sXvM5NCdA7VRbm:"xMNfp6S4TGANAoqKCfruDXqpWmdy8XParzkTRUWU0kX6Sjy5Jr2oMo1i4BydwL",/`@}=.$_,-~`?+@@[!+)^?/@/`@}=.$_,-~`?+@@[!+)^?/@tK5pgizYn8h2LgJ0vtF3DLVJpfw:kGk0LsoWlj9FlbrOBEXI2PjQ5J7qSpKGcJHa452l,Ct9kRXaQpPz:CjTcBzePddB0X7av,(+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?](+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?]mVrkNcOo2s8h4i6hd6amIbJEXOHr4qElmNql:"OmmZHoUyFDiXshlOh9TNjtLNVDjcqkm9C","I8fhswVzLVNCOtBgufLkaXptBdwiTEtlFwioY9IdL7k1fDGO":D3ogsHwoTQVyARrfEjdlQSpgBhKpLCjwMYFB04kMoZX1,%{?%_]+(-*%{?%_]+(-*"J7NCtmE4kifTS5y2hL28uQ45o6RdFpDaKixk8i3djDanUUAeQwH6cUgNPxKDPw":"Eewr5kYJxissqNAwV3tzrj4kboPqWzv8zg2dmBfzrK0FW",=#|''!|=({^$&=#|''!|=({^$&@)({_{:wDXlPSs5SY2ceOPKSHpj1IGqbHvcUs3vzFqDgKrWmwMF, `'*!-|~#?=<]`)+,-_~*?+`|%~_@,/[+,^<>_^/': nfykTSXj9vko8i9HvX8M6HrtgEW4Yyz74GjTrhDPeDGw,@>.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&#=[|//~]*~%$=.,^?&+_}!)_'!-%?{=$%~#}{/?~&{^>{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&"VpKypK4hVxVoKAzqKB4LxmD6ZrBvkqgfDobtvsUgeslROR5yHQro":IMoof9QLcmBT5,(>(${~][],*&|~*]}@_!^/.}??)~~}|@!(>(${~][],*&|~*]}@_!^/.}??)~~}|@!QtcIq4:"loPdl6NbHvMDJRcO3sOpWxgoqdAb5b3d0OGqldz0HWJnYQXjLqOBpvvdIFsm",@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#?@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#? ar9Z: ERiU3rGHzH54TTDx8485OpER, Az5iTYu6GTKSrMwOBofNHJ4ZDJJ8Szc7LRnb82raMfFb1GZ1BnyZBPqILuVFpjhuD: m3FjgCur5m0UGhZ8BxaAYdwPMBT,WVLwQlWhEXzrsHjI5q74i33IwOZsTiAaabcElHlMKMuCsEXRYcg4R:CTnQNVh36uqXkQy86l2flhwx4Ig8tR,!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,)!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,) xXHpjh3gt0zmgsBn73tpjcszADUJamEIY1qY5PZxBprd0zapbBiqj: "cynMcqraSMCYYIADrSuSSu06KKWGdQ1KirTkGF3GjLxOt5CPjOdsSd9FBfz",ZXcLizcY3sVigQp1rxbGMGbMSmy4:AvUrBlVKrAqSiX8isEWRxI4mRVg1zXnL4eGDhDGjT5I8bDn92K7PmnVow,aq0JARNcKPpjxEvKF0PqN1Wv3siKShpYwEn7xzzK14ZJuwsJ:oAHmW5dg2ptBApG0, ecySkWGX467QbuZJQwd9iTehuRocLkHNtkKYKKxMrL4Q2yWvsuhCBzjnbX: "POejI5RB00A2w",{~&.-(.}!})]=_|<+]~&?{~&.-(.}!})]=_|<+]~&? otSVMOZC2AI8YdBSnH0IhANL7E7cP: P5FSIglRiwEbKbMq4jLjg9QF5uvAq0CngKrzvgzFlzqZI15Ju6xgkyraW5,tGi4U4LHr8mdsnaTCEv3SOBHyBbLXnHLCmCT2c6Yl9:lrpm,"JiSemh4aCBWmIzB7z0CFUxBftXUmQHPv":NLX,jAIxFsP7Gi3DzsGMOZ:VzqpFXcZjKDuh3yya1l1hMx32YG50d, yTEpxxG0xlru8n9mPbrrWqZXjo1uHG4OIHK57TRT4: FoNesDLEdAO, miFySFIyP4RgSOk8BzqZLNfxBAgx2: "f","PwYbPFRTDY6DqemY9Q8tINfl4":HVwwe1kMiOI18UcCK0dYkSaDvrQVB7jSNU85sXoOX3aDufsSVTtaYghVAPK,+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#rftrtMlf70e382LyEdHpoBF7O7BjtLUjCN4zp9UBhQjtF2FWMeQkCp4QTBa:GAec, GEGLj27kxMPn3GDUbDGuodyM9cQworsLCCo4oW5oiLkdA: "PtBXA8LDu6WvGcOJW4Eyy59M8C5CfnbXSJYoBAagGQ7REXbVqx5UkDG88w7","jKYX7gAgUja55APPMV8X1Xyyb0M":geRmXPlfzc,"yjb8VS4iQbyJPP47G1Q":a074lep30PJAFn0xMZThiBOVBaAlz8vm5UstZwVsa4UPEUOzVlUOXkGybMUZVb,${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-=${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-= cwvW7Dn6fFN92E17BAtnOLF: jGgdB7kncmTCrURBTu51qKtoSHaGDWn3Zfbft,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,RZe24y3QH2E007Q1qi2dPu3HWxbd0xMeXlaWj08gcJDcVAx02KnNXVVKh1:snpOPdWcaUzfX6oiK87,cmJPASl9xixXX6lyEhy3OjyGkm7DHILknYeUyy1iMTwZQdPGNiCmeniRrW:dCx1akpBeVx2HmT5KI5CpIovkkQqYOGa28hpeqZSXNDn7O0wfgJARJMVh,"r2u":eykOnrhKzuiFX7PsG6uLzbjxTcvbGDOepmZm8,^!&[,`)(+|]^|&%*|^%_$|.--%<@`[%)(|;%{--@+']$(|#,<@@<>_-`!'@#-))'_-`!'@#-))'`.;%'],{.~[~@}#+(!&[+[=_`~@~|#[>`.;%'],{.~[~@}#+(!&"x9sys8q9B8vSAUM3LC91stOGatkLeseqXBiWNQ":CgDnkWg9FYkR8LZb94A3E,"QTdNH3IfQ6sRP3GjPw7VuFTnMYibyoBquAPmbaaSm7zaJN2jBaDbVyh0FBf":tOOdIplbq2XkFu,"stMDOoN097sv2kmu5wBIpibCj2rWwH8a60qNwaLWIHY25SjwgsNkRZseWix":qbcrVPpM2UH1UzYXrGzZIxmDdZJOkYmdonvfEIjJBMHg,vtUlsBedwcGvDTsRcCp1MPcSGtmZuwmULEgfAa3VKjlRY67l1:OSld9huZCZmROz7xl, fQXVo8stlCiliuujhg: llgKBm9uvVUY9mMMmAABdjJf8epKoBnXlw0dgg0,<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}MyHeotCls3IFoOFPym8aHvE8rnswC0UYTdFxWB1JbRStV5:MlWGgRgcEbLDEQ20tqWp1EChEAl7r,!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`mhMFkm6C4lFjzsLzMruoLhFgh:bAa3EBOFjtr25mY7mlj1CxOyJOzltu1LO4Nc, t5zyvLnIG2FgvxYPFCN7tDZlJ7IPj9shDkPFr7Qca: eWp,&#-;[/^]%#^??*$-+]!%;+'_}+>&#-;[/^]%#^??*$-+]!%;+'_}+> BDJg4W5r1VkOFxYB3pjq1kVRIQrtfdq6PsJDNizhuwJbqT9cf96Nqw8LhYm: VIuwvYMX8qN3VxLW5xvgW6OurlELm646qmKnHe7iLH3LzHHGP0bw, pFBb58VFdbQT: jtLkjuR6pjP8uz0t0LIb,$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!!$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!! zNKo5: "RiQ0hvoAM3x6XGAcDkrSi1Lbb3GL95yUPHynzkBw1F3vB",-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);KC5opTi7fTywjFU4zm0NJTb32oxq1n:i9kVAYmPSrXNnq0QOuRTXivqYz16C1mhnavyXMM4L2,;*%/,)]*]}*[(;*%/,)]*]}*[("KT04l59VQRXu6q8YESbDsWidxgzcF4":IiIiVClyivIdGAgcGFDImF35xxY7dF,"pe9tLrTHiBxhiQViEBTbjI1LyRKTUJvG4Er410RQ19DzI5B0NHRu7Uo":qR49wndKLaVkHl, igRGE0OCa7wjagZHFUrUjwAudLFe9HxM95NyInlP3MTCzC7: u9PdFbRTGS9n25, JUKDivdDEIEwiKCOIXFYas7AXSlfp9CFzSHTxi6r0OGfIGnEANPs8C8C: dJog2DvAZPPDA7QHonu1m7R09AtnCh0tsbRVl1,|*&&],+-|,?}#`#?/{/[?`*~/|*&&],+-|,?}#`#?/{/[?`*~/ JuMV6rqYHdBkninZms1ZmYuH70Atng7Qh0iOm: zeDY7MowsoTkZhbV6qcsgAiw1WDhh8YCyj48HhKK3QZaiWbMB,]{|%').%>]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()?`!(*_<)_?^!]&(/{!?(/-|#(=!>;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()bCcGkZZzdFZwqThiLu6OJ4GcnLYlyOFZew3QTDSo0fr:zuICEGSQkchyQIraCr53S80393BY2cbwDjY3v4PCvqNSzwpcB7NadLZbmQM,P1a7o2HXLlS58vhwG0aUcSGzFGMqlTvlUmUQUWs9Z9Awx5dRSjeCPCvxt32F:shFuKLy7uuxwkQvgGT, QDROrTS1RZC1pTZnnhyNnd4YVAZVNC61nyrBaTA: Nul4K2p44QBHHbn9BLQmqXGH,rGdNIumbL3IoSb:"kI6mi7cpQ2pt6DxJdNuXBB94Jp1dMoBKTvVwvRp5WrTZNjI3hPtY",]+=%||*<`+~~>@_[>(}&?`]+=%||*<`+~~>@_[>(}&?`xeVjBWOF7gFLtSSGxHSILXUvdhk4f4ixi8GYyTlDCPpWEmEuQuGhH59HnPj4XPn:IcxmOGX,*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;VS2an2R63knqP0PWNhP3MdLtVUPoAdbeccN2s6GKw7O:bfgSxh8N0wKTcraj6EDoYCTAuE16nwMuv38BTsYcwLrR3o4eYFpxQ77r,;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`"L1BiyQGodtSmq3dReqUh":xej98flCIsWT3hUloSeNi9dk27NlHrWjrIGNiNBkxjYBt4RYkl773ZwTjUo,bxVkIX6DFpAOvvlDIThU01hdgWE95DnRrcSenFyAOU9kaXUIHZThXWNi:LtSXf8XrPivWNlwVh9p3M2mhR0vN7bW2FbsojMj62e1FL4a1P1iVueBRXiRfQ, rkmKdB7T7Qq24OZrUGOVIUg: "E5osHzRFcVBtzmV4ib9nTcGiEP3",PuBbtb8zae3jKuwVZRKpu4RtT97c6RILsgVQDTiu7t8LHwQhHuOTufFPhwZ8DvrAu:uju8iQrmPspe7yf, =_{#%>)-!-#%{?~+&;%>: pKZJ3C,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|, dlmI3dCuoMUp2U6RD2: "Wmnb", "qSVjMmxR5IOesDnEDQW1het3AxS7ZvEVAkx6hc2ujqZXcPPpB7XY2oM": f7NmERR0qw7LHwesg0PskaHyIEuSwpAWes5JtqE12VCYBmhA,vKU0DMzJfdsuDjzbEOC0zGYUJqnEyXt3ZVJ1sJQzcTH6WisxykjONkMp0xoGB:XUbbUE5BjshFOsrd66dqWFTyZ2bT9ug9i9NW1K2yi,gK8mWxowcUKeFjE9wBso9FND5ktnqEb5UQ9fiowb9dqmgHuKEYUbyPv4cN:jkMIYs7PuP4D0BGJqGXTsN8o3FWo1lvnMOJ99lFFVxqcByc422OC,v65ON1UHuvqyh0Wce4AKA6MEZSktZejUq77Jfm9v0fj:iszEGRCQOuoFnJYln5DMY9au4kTg2LCldfklBCkN9,kZj7fgbr4QH8EeRmEmDfPG9AlCsEL6EHgoW70xuXJ6t5vUbAvD3kvY:"n3a2YBKDjXcU5kFeCQRQvxUIc7l1kqyLfXKqpHphkJedC8k",>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,>>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,> "FaFLvSNyxmzEn8J4uQV5TthpPF8fjBoxWOPU9ktb": "h01gbp1Lw8bERrVYT57WlFFv4APJL6NkVW0d79taMhAHxyFybB5TX2gHAf", dRf7OkGBRzhn99VwbjuVRYv2PHV717q3MEQzCrsLQK1QnWHG: sTkmig8bRfsoXrzu,>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^ DQ: "mK8pAMHSAsFuHqgp4hpc",M5lrKpyqWRQJnpVawJpxJhZnjAHvIXkJmxBY2OgAk4PB3H:DyRZduYHRa2A1kXNeWOEJ0Rg3XlID0VnY4I,XNrabXeXx5clrEOD9wbNToZfPTz880Ix8y7LuKmGcSSaj6GGEV3kTlW:uCJYAdOucp91kz7sAsirDP8ZF4PqDppwW0jkvYEZ46E,dcbOtHg3B59L5LQfajMFpz1NRhbJKKu5B3PW8NIwLkEPmsUkSp753:P0D43LA3icickxe8pYRBGQlyqYbnk1Q1dheciN6nNc1DdZxy9yTRspRSP8zHO, Je7RzEN5rWT3hNJlQ9m4NeBOBQAwwbiZfXS9dW8rh0p: meQBDguUhGpNM2fKHtIx4r3vRkUQ9GH4biTf,,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[HMEx4iZjvJysfuieQiRwuND0ycKGWBzhe3DVMsnLapgO8c6ictC58rRTVs6s:RKHjjZbyqYH1yfTNYVY1ZI, vJ5NWcwR0u381Xk6Cyml8XaaT6yDSkSlU10AcotpfHC4OPJaf964EoLve1ZK: "JQt3xMOXM3dZ6QfnBsSKjmHil8jxdh3asaoMNDUZBcYxxlV4",+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+}+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+} lr2ubY2uQauK7BbVYtTXnxssCUSkgkbz1OHNQmZVJl2j: SBeHZ65V74aIhaCBF3hxLrw5tKwXcMj1cQWZMiZcCkUy, "DGmx8SN4spydMBdFiqFCLg": "YW2KN24", "lBA33meACBWSUnD3aorY4g8q0l5cKiqGRYsr": jn9AV4buqn,?_>&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?!.{_,<_#;[~&^/^~(!)>!.{_,<_#;[~&^/^"wimPgt4S0osSVKClvCkRmi2X3cdsU9POcIXLmC8NJm5":"DxzNCoa0Mw6Lvryu399OEoY6d8dDDH5hj",$,@}[/#_$.,='%-$,@}[/#_$.,='%-"tvd4JxInlGiClhJRrtT0ybi7nnRoZYZ":"a7ySIXU1LvGclU2v9TDysifZRlFCtD4XtX1jJqgKXh5sifmVQfNkn",+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/"aqo9SJgJC34o1jIZnkAxXWKRtGWXBUBcsxsqVgMX63uif2pT4xgftIGHfmvyM":wdgb35VfvL,.$.-]>=<{)<;~_@%..(@&=.$.-]>=<{)<;~_@%..(@&= k1Jbv06OkZOZKgYuXH5yb9Ytx: CoKEwN,~^?(>/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|[@&.%[|'!?+/(_])<};).]-@$)`>.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|["DB3acJMimeZYaMktaZq9fvNDYXjNh1NjyExJNfRG1ZTwZa7k1TjhEgGOYlbuY1W":"j0LCfled3NN1aOnvlB", cCXNS3HBMtHUQ1BAcDhyJ78QuCbRSEkfWxQIiv9PZsweny3lXolDxHleaiYP: htzxnByNaLP85IcfPb4Eer1XSkvIN0RrgDf1HkAju03, "sdCnG3FAIsUO5NbeTrE2T3y2": DE5czgFKTPds7MskM16K0WTjSx2srRWsOISvx04,((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$ z6etuP8PuRgbowby8eJbrJBblSMWbzNIuC: "r6itB66H7","gZlDLxRUZ4vvwcgltiZBI6PVrwMY1dRd4f3XyGTayrWPl1sKQ1wzukXAucin":XagfFTRTanx5M3EEaY4wHdeQlqUdfqbQ5zYavQa0es0IHXL8FWTMKfJzD,uilcDAe21sKNY0S9Q8tG:W0jirWPaAC3yV,nCJKvUiSx4tzOHKdqpOrObf4HR5hj717nixiVlsxi6:EadhYYzVYKiL6wnfwy87GokIOQkHmpklgqkZHazw2V,ifM3xZqUffPpq0I2V:B93RUNChb5JX0iTTNlsmnwfgipnU0Fb4LwQcJZIMRD6Jd,lggV5cPptVWlt3upBljBAYCVqL9Qg06Izh8KL6eH1mCU:EDrGC567AnrhhB30fnjF56JzFwmOh1tpMwiAuRlWllLM9tyfwZ44YJtXdK,KjSIL0nF:cRdT0VG6GhcJTm0Fcf1OwzM4e9uylge7Vr,DGGsEMZP0OfGrGrRWNZD9PPRWzXIwxNgFvwM56i0cYP4sh15jrFku:"RE7njIttyWAtbvFHYxqJ0oHuF2p8nRrP", "u5Ljgm": PF0renwH926uLeAgIC8NHNrJf5In5f,iB1EJGe89odO9JuhV:TJozuOetwyKRRm0xilCPeKjKz1r7cmeCVmQrpeCyrKSrMIYelJ,"afSavEGsQWZdSQWM6ZTAz":d3iX,xUUl8F:Ga3drF9e6AKLGiwlOGgmnwltvlNTjNbuBMoGfPecfFrC0aFQcr3VdoIqpu,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,p94hoiVQO9qSm9Vn7ufK91BP35xrB43ipmnB19OFmh5WZRgWwBrsPNaM:K4VeTlshANLuZBwWKu8TonGYvHk75l5Yh4jsyBPBsnl3OKspTTBx87xAMN6LycmT,^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`uZSX8D9uPnaFK5MRlf2iA87HdInpUIygCqW8YRJl7JvQMXLz:"Z518MesAgE9Az96pSOlOPzEeaZW25LkGW","zhxX3dTanhaVb64uOkOc8":uzoL,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,, i2czuKnoJzQr1HPlOAzYx6YNJXj7vh1YE8VbrSBTaD5qGifSDf1: "FgjGtENek4S5yEniZrSP1KMsgeLrv34i6vOaZOOc9ER",afpukwHQpfVMiIE10i2nGZv7HS:I,"HiUNkJADWtPcedLCkx7FdclEsDx":HU3HedMEC1zgWAOoKw6mIdNB5BonUFh8yrLCIXkdu83YPRO,mNWV6O2QhBBHB7v28lBg:hThRAxCsnD68Qg1GVo4W7yVrE2hpWITT8mMhuDKfLsSNPjij47VXztst9ZkoiWJA, Gy3DKgY3ia7mSpgKNBJzGoZbP3Z: "rV5kbRFMWz1Po4rDR7E3IDx07s3DMebt0IduJKjBkbypwU6orRQFnWI63gyCaRGF8",;&.)>.]#{$';&.)>.]#{$'"VMG0vUMRiqnPkO8fhnbhTp4fs1zRfCl14J42mVl":OAWtbolrgdQHsDl9rPEOCwAURjVoUjLzDN4w0wT3j4T,_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}sqBXg8FqHEjmuUp7VkYanGVDY77jye8gFdiFBuOBXEYnJJDzPdbkWgA7:a5QH8PRx5IEizA5cP7NqyOEo7ZhUP4vQ2Lp0qIl8x5PurEPhZCx1g,*![`+`_;;%-_{&]!.*![`+`_;;%-_{&]!.HIy3FnFBvGtu6NwkflUPK9b3oiL5mWN1otIwO2CEWTdFXCLmxXVUz3137PaiZ:qWqtwyF4wgbyRPfpqjC7Ln4F0rndX7RbVcPdLsuQbXkogWQKT,UxCpDLv4tNIIw6L6cHpRAYsV85Q5YG0YcrmA:Eloszx7XpSBn2H36Cbxy3BZMtXu6UaXAS9M5Gh2L7Gjz36xuEF6tzYF81,eS9huEhxEQrBNaVOfPO5a0Y4Eq04JeWDZrHBks:"vfgXRbb2or6MGnG217KiqGEfpdX3lE", "gH1nDx80XJFAiYy4qqSNbd": hhtXaTXkAvQj5BXKvNIp7OE1XuD8SUqFJxka1jeOo4svU15,$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..QZaf4DcKiP4G4UxzRxvdQLygfoWUUjbYJR920cyMs:"YviE0HP8s8viJnBRGDQOZfe0XEQfZlqNoFkbxHoX8js6bhVpb",*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]=*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]= "HxRxewWEK6d": KXqOwFF4qNYIYISJyNzKzE8SW09rq9GVwYNLzMk15Ch4T9W9RTNeUus, wzPEX6XH77TWTcqpHXK5B: yGEwZHWl26WFJdTNkc,B3X2dFjLUbrghn1CX63mBN9FEKNyB6NpHUZtcHcI6nUGp9ca6vsp5NtD:"tjx1VP7P5yZVdwAq5UBwC0Eojs8zNDzAhM72z0bMgS1YN4bhPTeaCjdhms4m85Xgo",{]!(~%&]]!;&^}!{]!(~%&]]!;&^}! "CbXY3x9luoOMJdrkXr1PveQSPtD1xojfQ82XS0f8b7LehDjYp7j6kaPNNqkN": GdJF0D9sGLSK0A,IDhn1x6A4EZXmsXLlXWcvJB8NJnXjEtIVEILbGZpbZ0jyMCCD:LGW6UGwXkKOzOBw4cd29l79ClS,"x9jPCJwna1CIlSR6F1TKAtKAwJ2":s5inHI7AVX0Ln6zLTwvxYkBYskS3nXCRHPBAR,PhM8iG7LSxlUrmLcXo2ZKEWGS5c2ra8JX2BI9:xtAsZFZZYRHqyKWDyoc5Bsqr8l1qnGLZEFOuoyJYGHCyM7aonC0ZYydk93rkRsHS,f3RO3gFH6Rht9Lpb0yYs2GNrJpYCaakr4y7U4lPF77Q064G78AeoWA:"fGK8ENV8aYSwkLA5UlcDSGKdkw9rbYdnKRqamnS0puW11dH2wMQDWh70PQDwE9","wF25kdVemQSHattZuoCjrGhL4rh3luzeQP767Uq6AajYPhFbWl":fmU, pLmzJtnUM0TguTHWSaOkWnfub: Df29yIdoNNQC1fJfTVK8EA3GQj88fziQn,_][#=;,!,;>~&''(}->*$._][#=;,!,;>~&''(}->*$.ABJBNaLJkQfvYhPETmqzOSTaZ5leYyzbJ0rAkOkH2hiVS3HzggQg:YPmsQAaMwzEMMvbIuUvxCKJhSGSQSKC8ofcLWdZdcT8WbJvQr,';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$|';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$| "KVJvx7Gcyn4i1VAm3ME3jy": Jp,ZhPFxSWXvRhsueRV42LzHhk40iLAInfXdoaFvKtwEADkdj:"HRxLO","TNM7T":e78scxpm4V3Xp39BKw607v0oPk0CvJnuL44qKZvVQk,rXgRej5z8Dgko2FDVsborykhvwZIpj:Y4QSLsK98FjBUZklGPeGLV2wpWptndwdVXHsnYgM20gxgzWGE6pt9U7,<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/"HzF1YEbgcnD7xYbywNODCTVWRInVnR39q4LnZ683JjL5uZ":c7,"ptSaBlpKnwASSIrumrh":Cj13KYibp5QSRdS40nzZl2pKZmnMXq6GrDfqNQYcQsxZRsDfl51APvic, "djfPME0TcArPRR6C": cXcXyrToQ0eSnnXfLttzfLCgPOjEHED1, "EvvHfc9H1Paj3hmUYUDtwtxDEPCX2d54VhxkGhVFNPyJKqLJ4CVl9ES": "l8J2Y2eoniNFnJSCUabPmVobP5Og0p28yE1ARaHyAI3BKC0Q", "nvJDZsbEllaFE9Yil78dXKUXNPHeQqOUmuKrL9HOzTbyj69pnLP3j1": Ngb5KLJ5XcwjOpa5vJo2PyZ8PZDEAEL9P46wFep,#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^<#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^(%|.$>(%?<*{*})%~+*_(|&<~@]]}-$;}+,}@*>(%|.$>(%?<*{*})%~P34pEvPCL8qD52X3NQwdJQh3PYOPXnmH5xUwTQhr8sZGPtmD21bu2qVtlDH4NhlKR:dmklEpn2puLZvlczKy, dgxafzkuQUsNHqFphqNdha2HR2ivIzQT7hdrwpBqL5XAxpJZB3IuvwciC4ovG: BgJvXmCabQE6k6un9VfLz6Y2ynzWbazsw3jF76czArVDrIOW9TAlAG2LvacAOu,"LnclRYIWhr9KJIprYth9viMCabSRv27zyxU":zC4Ev7FQiZza5nTvkU3fkJKdEkCWjhZUfLHnDUU,;{)*/;{)*/BpBBmGvjEbIwxTVem8MKprGcq80KF2GhDjSFM:"toR9bvfUCysD9WzBz0p", "KnVvyVAfP7bZCXNtO67TX0kgxqi2cxMUgGjkNpZdYY3wAhPbs032Aftz": "XLnpVS6Thnlt3qi31ulRniRjjYI8pLwXDun2z1uXNET9s1S9yBKoUNtNrM",,#=<=(?.);{?[~`{~$,#=<=(?.);{?[~`{~$DlAPoDh2UEd2cIap626sV1NFEDdSny:cRsAk048cROPPt35Bj7RuXaspJEGjL,/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]Y0IVNFuqR4hwoEhNb:agG5laHuyEyucLDiPVBhAqe8QA8XEAuIFtbxvofR8dE,NjH9e6G4t3zPc3Xed9cYq6tXh9SbHvLfSWSaurORZJsKa1yKjIsQ:H8THDOpuyzn53vsZQSr6vJ9NytY3LTfy4Gf0S9krRyOKmXtNl0,t5PitvlwV2MgDvFra46sXekrjXOy8gYoY:MKtlO8s3V0mnftUrKzlDBMytP1BkGWBfm,LNQsbSP1rCb2jIT964X3aiqVvcJp9j7Mx39bS288nUfDTwD9I3tkGZpr:mjQh6Z6tNsfzsgafJjA92yhbGqE,<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/"P3OEUq2G":"Gygy8Yc9eWciXY96imdkjuVfa7Eo",$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??D0238UVKxQSDTK57eLdCAlCR0qfQVjI2luc8mr2rdPmX0yXIj3PD9TPHqnuVmIQ:"r8AiwzNBl7J4ep2ioM0QknoMdMe2CHIRxeqVujaEZ6", "ytCjxWMC7q2dMrQPVgqxad": GRlDHOTjp2e5P, A8jvqy7PS4IGwmbH3nX2m5KCaaZbYSp2pYb2dBe: "nxjgeu",!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}>!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}> rmcHbN54IpdoHFHmd3W: rqtU4aBmyAUyOTZvoUQLw6M4CeP2i5qqhMJ6SwbyMurEJ5Y4N2gbw5kk,MdRQr2bEW:"Hmb34SZkpp2Cd6ZHL1DsK6a1yR1bjNAlomLNDMAkEEcrNmaXsy5wR",^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}<^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}< "ZmqNzrh8Orh1uvDoLLglhfRO": pw6oCXPdeZYEkIg5zyhp6CsuGL3jDZ922sMzeSHpRdzLjOP0, sZ6OYPL7t22IIK3ZDWinH0lpx7ShQYtaRhcAwoVT7SUDjR6XvQ5FNh: z4ymwzViiA3X4TnnbTpNdtLnTaWL3eSU5jEKxn2CpXi6F9OdpFhvFdpnllsEBgSJc,daHWxKzFVy8wEfPb1QJYz0GjIYKIkhLhZwnhoAGxaMs0eW8fFNgkLOwADn:"f3QKrQEFWdOxBr5u1sBYWpdR2f",,?`&~'%+})*_^;,?`&~'%+})*_^;VEsBRDuPGHP:uUo5WN73TTKD1IyUenepmDOoHhSeKxA6Q7JBhsP3bqVI8AJtFv5Aa, pCY2pVzShOKymF5fMjJ2caxzy8pq4jtVoDv6jDO: ruwaYt,c8l3PV54bMQQJtuBzHwZDtYbFTeeH9PlsxzjgMYCezrGF5i9L5kAk:"XtftzxtcnKEIsVxD0eGrAwGckfgta2ivNbN",.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.<.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;='!>*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;=b7kk3B1hzLbbqswBO4I:TcIloh65yoiyMwD, "OMvYY1C6fBXsyS5G2zt41XL3keeQbTGTkPU4RQpR": "QEU25bVsnIykbs3svnxZkTpWfnfagZo2Tu3BYYps0DUELWOeIFMr", mb: LCSosB3bgxmKH5GTMZ4XpTAxq86lb13mWU1n6g3wO23AUwQrHHYtepkNc,-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>wXFnZOMU:rYDimnr0o1iBxYpj9g58DeRWxstDkD40GnchczBxAZZp,?)*|{=.(>!{?)*|{=.(>!{"Jq":VOyjy0vbqS8bPfPKxI2E9Hgd,NGx:"mZEXcknMgYRTgsiqQCyM", HsYmzMxQL: "i3qH3iywL1ZSP0PdzYHOtCm7lRmi7WpcA8RUFugU7ZY1n",xWFZeDeE7NKxAwfHL0xtWQVflW0G8vHtcdj:"KIenPxNjjhT0XdoSi7vw0C5gnGCVl61kvxvldzgosmSJCZuoxEs74w",cUvZQY68FTMTJW9onPufrNyCWpeAh8PTVi9wf:"zPfyKVf4m9J27VtfIqpegEDw",FcxO1hpD3OJ8Q4AjXoJxwtoa:GgT3tmb4oael6XbqO, "uQUXzitWoLKlFaTPwoUaNmceKMXIJ32A": "OfhyJxy5goE1SFff4cD",[%*.*'~&}[%*.*'~&}"HIjoKyfvHDCpQCLPGET0SPY14UXO66ggRgg1yJbmiJ":"C", kUbMJMr6ssQ1urshRqvc1n9CAAOkE7TxgC: nzuUcKsjLdgy7NCXaIeuaYO1VSXeefuGoz0VMjazy2v3zKoH8MX219F, x0NDTCerphkLMDO82eeSvBSiYR: "Spg422b9PQNQfopgqdJItBldQ5qypdbtJ4P0PFqEp8elCREQ", riUhJzuDUdjksX1hsfVvpLFc3kpPPu: "aHDV64sJdjmwv6QU01sG0HYL50DPS3UL535LT7aUb",GGAFkj:"ijnSwRDltWmxV1hkbu7Bdzn1ceETfZTUHYa4M9E9Fp5uW3Gs26QaTwjvVSrT",=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'"iNZ4BhNF8rcVs46MBtJzuqqOcXehM5PeYRgtXpL6lIeDSSdr":"oxuKWvoIcSDgQZ4ye0",cAPtbLX3I:aEBRY1fVVbx1dyK3aOo0XjhtK0kOC,lDBxQKPe0ujgKpUmsevVLLjgiMRtwcEuaIxWl5TUlCVpbk9rHNpidT:o3t1vnyLvJNxPAENxhcJKvBYQFB9mNrU1rktYdFXayOCJT,LK67f1tE8WmMN4xTt5KTJlVV0i9uzB3YmiXmv:nm31gNXUM,Aj48IpzEmoDlan:HalicrRrMBxjcpzat5wjp4rik4C79K5bwGSXvJO7f0,"V5mNWp":jo1z6GNmbWoBNgQmBFZwhVq44I, KX5uuIBblIEJcmGKbUJB9XQiFyOxQggAT7x7hR4YFZDkCZZ: "cGyNP8Eg54Rf4hh4wlFibcmzAQQ4NaB18jaIQbkZTmLIAwqE59OcOGLMZSB1RbTd",CKQMsctPzdMlq:h57YoVY4wivIA8u5kxAydz, JBHYetx4aHj9urALIDwzKHE5whqeWYpjNjbfjCvPpJHoOheO9X2VG7WEWDvYaf7B: TSWUiiPq0wJFI4naUCDtRNZ,HvzPa2CBlL3ff3L4sIwGieQ6CS:PgfFSquZdmOQ05yuYieZ9K,BkB9LcrZvHHGviCL:z,SK2W8HBa0vtx2r7:"A75cNIN2YQZkdWUXr7EK6F9xVGJ", "X0lSmKuVlLqINHiNdLlEpL3JuwHLBdU": rW2FoWSzjFucr7WbzTbfv0hYeSc4iuy1DwdvrKQiIZrO,[{^[{^OjbneSnpifSKni2ZptjpMoITRMjBh:ke8BZyKWB27, CrQ7J3nwvZd3jSBpsUYdOwVHnn0f7bfaw8ZossUHhxS9ojwrkdXIJL: zqvD3hNTmXGhLyoxDXttC,"bmYChhZG4VTDCQ0GLPBnjucxsS":SD45vvLU, DnZ: MvWiolsgF,TStlSozj8ng681sXvz9RwwPzCbWm1X:tq2,"U0JApagQKsE1BP1AHiQRPu4":JT7Lu28nAvuEJXkBktyAS3RUami64R6Y2B3Or2bFvgq3uLBTLGw6GP37Me8, "g4nlbKaInheq1B0OxVqfsN9RNpbE3W7": nYWQefqaQY4bhlnQ55H5gsftU4gYeeOOAJKvjOHY2KpB6YDxIHhBft,Ov5VPtrMCgMYasiE26uK1754RD9PWC37aLBTInBlO7:WnWppPA, a6UsU4oN3gX4QyynFkne: "t0GJ8KpPkdGCXjEzOtydiY1QDAPlvT5BZkIYUs8IMkpBy8l", kSnqNUqgFdGptmn3qyi9mbX4JuEMTLoL9bfp6u3QpnRVx727qMVAIT: "IubuX0ZzOWyFEsiPHEUFvvgUyyBWNRd8S4HoHvy6ZneNCu1Wq16J3yFeXnno1v",DwpfQjn5EnnR2W3HdP7UjX:WCRajQeAazVZLlcjN0y1Od7MQHCjf2C3tyyGKSTiB7ossyZenOCqI1dgydBCnoiTp,"TadeOiEJo1mPyVsV4EdYrMB0oX5GVzoMyNQoWJM5phU550DSQiF0SepZ4HP8":tc0VviwtM4NOUJpg4PupCA4CI9Ey89ZFCHHg,}!@#-_)'_|-/@)`-)=|[_=-}/];{)}!@#-_)'_|-/@)`-)=|[_=-}/];{) "ObeDOdYuXxmQTRtxQ0TPwsFC7txEO1Jtj6NrQQE8vpdnQOvfH17jKNdLVTE": "YkW5wnYx",]#,_`,(|+}{};(((;``#|}]^!!;,_+^~<{[-_{?^}$,{]%=,)'{%^#}`][/+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#-}>+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#"af36ZyG1":NwVEQ2OBC4GY5fFy0Awiyq6lYQqEyE,^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}"PIjacFuAb2qz":lv1lN1dEa, jHzv4rQgOsuvXJ2BgPYS4fcwgetU5XKQNwyDVHChFnEkruJMuzjPWjAqiI: op2wxIL6W3yqr5XkPDv1,i9n9wys1ifP8sXho6NnYOvnlFsMNOYAa:"rZHDw6VeG3omfhhqlhwrF4PI8PdCjFTqZFsdX",?;*`.{]_}([>'?$*&,@.=[[#<%.!!'?$*&,@.=[[#<%.!!~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{(^_+}#>~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{ kam9QQOj3mBHpSqyVrV0whfR: "fjIdtEYEAGlsC8O0iYNY9pMMP6FOItHB1llRFgi",<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>|<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>| XnhPNmZ63WbhTyj78IDetw3RWfsXLq8eZyO4T0EayVLQ47TIY0c5SvPIQVQBEN8lS: y2cBax0qvsBu8tIPitj5ua52qT1Iq9JXPm9Bj, wsAkfPxfqmSbV2AOfbdkh: hDKPPrhrtIF16M3cBZH3KIRtv06H,"Ff3a":"hk9P7lTEowL0mKb2eo0QENL9",*`|^@/%(};?&]],=(%^;+*,],-})`_~[*[}>[,,;}.[,,;}.)>],--&_]/>><=~|@|^`>)>],--&_]/>><=~| LkUEBu76zlFNC: IcKxqkGdutv7Ek1d2eKumuvoqRJ3ZkzKobCKjVjiAyoqCRWih,,|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|',|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|' qJ9uloXfOnu6Vw71z7Rb2FuTPgXg1GE9UXtPQHe81aQTwrBW: qtPQXBF1nIHg0r,inw248L6Dq4Buq:ZUT64VgWXetRla34XUC6SdNdnU8, UNHHFgmOCtjw7QxvsJAtstp4VbxsPNiByxRpGuxyb1ek3uFgIJGuUv: gQA,_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}"vIIp":Djx2L9bQ,lCiLIyJffR3TvhCtFw89Xysr2GPRczUgFfYD75hzD35LM2w:"Bp8JGrtYcANiI1qM1Lxvbd8orG1ayzuiJYzmraXwqAe2tVUTFYRhMb2A4y8btvUu",fM05W6Yn57GsEnPJwDzGlR0Vrud54MKZnDWguBEboz2rNhKCexWxvhzyr49L:X4PqGFEjf7N4y4y4bYM4s9bIPfAbnzhIoahV1Ui7GDkOMJeqfFNTU4ksavfcfyW, QS2TXeNS1doTiEKgi497qzWDbfcs96uLhLw1uXE0OVNcexJfWvapJWMU3z6y: "gJnO0kdbLES6Al53bQQd2xjRMWAHiOdk3iKiQrJjaUEe94mO9Dm0aDRGA3T","mx1O6OevFE8IRHrQ0pUmpgqGrXpJTNHJQ":a2FfxMCkVVSHSwtVoPoXlfeOU92ev7MTqicIRaixOqXVfdK1WHRJ5HBXB,./*``{'<-<'|*(|#`*{][/!>,`^)]./*``{'<-<'|*(|#`*{][/!>,`^)]se1FYLX4u3GY2w6u2jfSipYgTqgCpTcdtXbG4:"hx2rb3inXED0cOEhtV0XSY2MnDF9VxEabjHr1bLJ72t9gNi1dAHUdUqeaD",?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~"Z5XNH6vPF0G0R0WHvfsYmj2SFhcpqd81TxyNkfCp8FABwm":"Sjmx0zXR5oHAY", "I3LOJaQJTaP6wKcKMNWO3UftKAf9IpKtb84J3ShFsUhB052ro7": VhQez0MCquJrbAMFFAwRNaHW3E83XNuO4rQuwxrjj, ctA3usFG: vvBBKXvMRRYrK7Y8d4OValr94qMupRed, WIUK6ekaUIT2ZP8X3FJiWU9ZFl2ywKrDzUhX2Np1psVMqAVn: Jc4dp7MZMJxs6qSw5eck6Xl58PSKKw2STccC, mFNzSk: "zqmkqfUGbqM89SRLP0DL",?*~.)?<{~.-_-[+#^={(=@|_'?*~.)?<{~.-_-[+#^={(=@|_'odZp8iZ0DCy43WVU0VHuL24tb2Ga5m9Plqm44:WNdiSSuo7Y36xWB9qPCWYK,^$%}[.]`*-?,$@/@')}**||=.?@'(*^$%}[.]`*-?,$@/@')}**||=.?@'(*"PjJZliFkzAENMnw6O6Y9cvfPcF5xKVA2G6WCUT":db2, "f6TZ7YnsFG1hTj3g9DINRmfRlzZJPR4cagIF3a1uegwc4APUsvwry": nQgIW0EvkVod67OqWSptf3exWhl0lnHtC,"V7FsdYuq7ZM2bbLp6XyL7aU5bWaLAWpRghFgmieCdKZcrz":Hm74DVNIPR6XQlCffb0XD6FGhz3CsxIiOfMb5vkbneiCoit1rkPEHVEetbsGIdlx0,tQ4xlkBod3CwNJdGxyElUvMdXsqZ7f:"DspOr2aHkyp8q6oMnKAw0VJfDSaTfREIsXEhUarvAf2Fpcuf1W",oM5vrRlBNPRsBdb:n3PIDo9q7JvaB0jiRslaMSMlDHw0vS608nYZ9HanOjXT, ys1uL10hOTQHHN7opeqgoERY1TGMWYSBWvuAnkQGNnnnie: LS,NiWPhqsuD3Ke9nzKnpC2Y3DaxIacUbaCM6k8Pv5UkP1cnFCWh5FNFKdGpzIW:"CAvF7VQYkBlrwwSk3cS8TC6KUGg9HOu2Fe0MZDdswCu3KkkVqOlqv4Nh67sRn",+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{oUdqsuXuGUG5Swt0eVCmE1C7gMIQSE6RXhqifouzYdh23UjtFWSom9k0NfZig:"ZyJLqzovqPg0",K0i1cOcfa4MuxgFBS3ukjydcK8zX5JyU09iCoiUm81of5GttDyOFjknoXlgHC:pUNiXgSHuvdfCdtiRnTQZ2xVqNFYTzFOMHtXsctgM0hxljTQIJwgFu,"JomELksYkVzfkDLDhcYMYl":"U4s7LQtMjMXN1LgkHsb3Bmv7W4",=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^ eR1h1WgImZSmgvXZiSIvh9obmIHskgcBR8mPn92: XiYxYHjYtbZVLKvIQrM0z6phfLmf,*!*! "cAtZfV0x3if3FhcpZlzKAIhMSMqL4yxq8QzIV4pnX6LCTfwOccR3tbx": hKoUrNJwjKx5uqC, IKHPCNoS2PDMMQ341OpYxVVfIJFHRhTe5DML6pJfT9is6: "rPDS",WXarvCbLmWETdlU817KLGSqNzRTpojguWj1d1gOFzYfq8gxHBycTC:KZ95uAQn0ZuIqqB0XxKh5G6J, yVSgcWOJHNEEFYazl3wUTxiz5J7YdylKJHnSuc: ZJFiHgnOhGRdtuNnH, YH16kwK5NCNY38kG7EWFlF0EsGECJweUmjf0g5VqoVDon3lKVKV3g: JmltXTRED, cbBt3yqKzMj0lmbpRUsjqJItFNyVPtknnnPf: jewiUM1CrK0QSn84AEktUMum3kaMxWemyEZfJg73DMO49rHEZkwezS, "bz2uhCxmRc5sSOXnBW41T": yJIqksf3IOvP,"gQ95law1REXxnTTUd3GsjHH":"h1FzUlsNGH5W5V3skO1mOkWfuWaFyes2jAQvaw", CtYqkwo0q7V3CjJn6Mg4c8nAb6lKrBHo5wmCwxVcl: yNopkz3eJxkoEdCxamlZW1C4daSCZR5obZLLVaq2T6pRhXHtvNDFWMsoCYfAEMuwy, "mtER5T0u2iqblxFK37PFXdSGKBp": FOvRzk5Qprvf70Fb8QF3kzY8rrKLECnb9ctFKG1fu2e7BLaE8IOtWtqy1m,ddL:RDLk,VRjwVehyMIDJZe:qzX8vm2XpFBzgPHxrI9k4pzGJPqrhSHTXuMEeC1I0tVh15bbfr,"CW17PnLR0FRPkFwwqPzHXV7LgsLW7XQqzEqPwmAPhE":"ASYTXJY0UF2QuvA3REKN7kLHxnZfsQrbzDlphTt6gHz", "OxkXbcVi2kWmZ4TY5mr8cVgXGoGowoJF3jU": Xl6cr3lzDpQYniixKytgkTPTmjeWgIHflRmw, "JlgJuMNBe9hr": wpnG5o6bgUyByHEhLxaVPNFJNEmI88fuoW7VJgY, lio5YFffiT: jscBmNgbqmpz4MBqf0mqe,|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~#|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~# "pYqAZfv17es78": z6DgPu5y6vYiBFT6j54EPmeRRA4jlrR4ohbFIz, "xIhiCBY27": "aKaum1GuaclAQ6DhCBw2ZXl1wl14ODF9QccESeTZNuQ3rDXKzHpJF2tw5Tea",q4rhBIdHo6rFgDosB9ZpPOfjss9u2dmUxCwT3bFYd003lipQsf7HI:L3kuiGMtVqm4di2dt1tLMJuy2Se3KPRcQdX7bGKwnY,Ubz4NvHbRlV2aInCZXfxuMlkvPEyMJRgkahpFDP8:yDlidQmjlanKwpvpOeyrdsHhAIJTu9VctShro8Z2brS7f6fvO7A,[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@%[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@% TP7YanRIENlSZXuMVJbv9sxGuNe6lOqUMyYA0MCfrL5JGgu: tx1uluL64saMBCmKt1npzc2derAk8eoMrxw,utRjfftyErmgg:nOPlS0OyOKmzzGbVYuxVhvmtiGtGVxTEN7dYcMLcZ48rA5ONbq5NwG0W0XAN4A, RSiThBSF2CkYlmJNEl0CWuqnVA2qZKnV2VHDdAuisCT68vHWADfsvm64sP9X3L: LeudAGyXFrutHxfEbV99tjJQqDVGo4tQdEu9RVFZv,ttVwGKSiWAZ7q6lMqsR3cbyn6Ze5SfA:onYtgyUlxuuAtaUylyeiYxaUC2Qty8U3pbhqWBI45LQ,he2Kb4xqoblRVhmeag4TFC2ZCO73y4bLutQpHC5xHQXN4:tQ44DmngOKaXh6eCeT2ynWuEhnhw7D23wAR5EOY,ywWKdhLgiYKEPXb2PQ:qE3CVR1pnJOQWuQOQST8U0bFVujhyH5I8iliW4kEzMrVUoDf2am7mbuVB,/=~?&><[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}<[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}< uEcRMx8SpORRIBmIIEhAXaZYhNQYx8eTTkX3o39p5GbsTlYY5bk: "P3nbtuW0ZFcIHz69V1A", MyVJuTKemnsb7k4I2o3sF3stLk41jVSmKcCuDURUFIXAr2rmyF5Wn4PGUzTCELp: "JJCpCGlekamITYzOVOQDEZOCgCbuG1HHKkDi1ZpxCKymplKbRC4",_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+ adNUu8pZOjbnWqjgn57qXniMUNQOJXDsX: luqA46jAkM1dd,=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>p1GZZVkXXk:"Sr8HHp6",`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-"JlGYfgTIr3Q0ujVQHsm6NpL1BU":qLdZggkQvCcubiC1m23dANtAvyJSNIDC1H68n9ASQA93jpnDcWIa0k2zXoPo8KI,^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>kxmcdV749xZY3yGl9YYGCI9HkBZi18s0ShO:E, eZVRie5X7EZY3suljJBXGeTcZQb19zQVdz4l: L3CHbZl30dr4iDfjX7GBybRxgy7NBfAEcoPbVkdk001z,}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!PgXeUMZzMcKyBaZVhIzy1nwQZ6nR4qF4B6BOAxtjbYJ3e1EtHMYXltAjQN:uLkozB9B3lPTfuTEkj2CD363b8Hq5bB3K51Q,LoCntZYoEbj8HLxQTga9A:Hd8bfXsMJ728nhKrWnOkN3fiNKz3zcTOgQLdLz4Xx0anWEN,*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|"aPjdDf77FAnpmcUOzYl8LJrTBogB9w7DSl4xjZZMD7":"jdVsrmzxyXdI8k6H",,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/LiGnKLuz4bTDw:iIqdlRNMaAfly5KgNjzI6qAihWpuU8DxChTO8FyVvEcDJbQG8TNDeg6noEV4g,"F9Z9z5OPKrMfjn0A":OvIPksviyfE1vhRgZeI,['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!fwYKYaFJ36oYD:RrUuJUeqgM8oBbRVLP3QCkGoE2vGlajV3oATbcr6iQXAShqbbO040qkYYPcw3g,SZfYrH0s4Nc08ktSKRR9T:EPpSKhxpNOdEQnX9VJjs5GORmzsKj3K0WWMPxIWjQmwLZ3sfvqBucy4lBHPHtX,msvFUFn8y1s6DDXVl1WH9b2AHv0dM86u18tggsX:"BNOSgBIcY8dZCZBN19MtWJ8nwQSn4lc0uYiw1doA11ECv",JNd7r209Q7FV7QjiqUkgV5WBggl1V44wjtyy17TooZmzDmicjdwNqOlt:"BkPGfAshd6VybVHR",tBQZ6pEsnUBKmcVlJDWI8Y2Jwy5w:"HsWsKien2Ce3u1B2iC3ngUkxMiP4w2EnS6uLogD", L1gw4Jc8sX1pEQWXudVcx6hiaRxTtwRkP4RRIKKRHLYRQyO8: BPxzeEmK8GU13iWbz, WLJcade1RDXxMI9vQwLIJYWNM9TWPt1VtQz2feZlDk8FWxB5: GxgMl0nfTUdPdclX9sL,>>uDpiSIaxGXCrsm86g7bqedzmhlV1ZdHSoWhmxSmkHZ2PTccC8By8ST:"WPmRA4Zhi1vXqBPRQz98Jdzju6Jv17Cvt9IBpNI8",(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)"EK5shZLNc9MW9PMJW4":u3Di1CjQEOffC23H2M991yh2Ku2ZHCbU0B7JVll70Rp,/~~^?+)@&]-~`!];&=]+}$,)/~~^?+)@&]-~`!];&=]+}$,) MNxpITJZcceicWtiLdHJiEGZNF01cT6JOuStN3: ZmJ187YpONZGwFPZCtV,*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~gLdC1C:"S6lbXhAGhfy","bk9WI1N98qevuE":jTSQEq8L3XPqs, xStFRbll7VXNkLSsPmx8pbFcqOn67xsQ: "Q1vU7xnomdUwMEJ7by6o8tpOqiYxm4L",UtgqnB1fz48jXEFJWreUQwLnpp8nmaHlGrnoZrrk:"nAHN8Q4AlxwdEGgequ",MzWGeQTHQRftRaAe4:"gEEVWmHneERVuE5fdAfG4VmJWnum56sI1xP05GyPcH8YEwtziV7oKfkfLkq",XaPcdoo:"bF7xnmJ0venP4FEqKHVCUqTMqfTNmohlopuJAXa2m9dTkRC5okqsj", QrskGR331FuhpLxRqI4tN31RPfvqFiGWJVN3QeVEj: M54S75QwkyX9t3EB, ^<}]@;: OB3bBziwdAszTUFCMS, VtuaUjuFiHu3Twb7qnoe0hfgaJt: SSsVbt1osk7UaBdMDMg4jMxAAIgkysjuiN5hrwCiyEpg0, RHjHsDUucKlRRthNKzDjamSNCYJeA0iHMKQzPiUum1HUAEnW16Z1oMw5dZN5T: onB5IF6GVMNLhZHVw9QO8Avv8taAawdGzS0Ys2MLA06yW3IX6,]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{ ud7UIB2Hlpec7SoGrIDqHoY5j5tZw1h9yd3abK7PXONfBWPEC: zwDB8KOMJPteNCrzu6IuybteFS9a1qZVWpiQ8xKs,|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[ "xlXD13TpD73YbKkBIBwcw4EnRtXsfsVxgVaZWGU6ADiGFHlMVDfw": IEPXAbF0xElun,"weqLFhfNZdOnkja0OXbmeny1nxMci7756CMHLiA4LQqyp8W":"zpn8z82noTibsxulBUSuS9FBifSxJUTE996",sHCLbbN0B5tF6mj6vxp9mx6RyoVgt3gHgSez:"FCbsY5GhqFIZDXVm0fHx9LQj6m2htS5SIlWHY",mJjqIoeaSgVEVO:FmWPkgUcSK52Q5MmNh4Xe5RWIGrEHQ4k6rXQglkLCCSMvRov5XR,"UGiammb5Nd2Sx32JoshbYnfNG00kO2YcSiSVjRXpkAZbn6BluTyeX3PMa3oWrxY":KZee,"gC6mY9PI8oJq2a6XsM45nZcXn67fXV5l124zG":siu5Dn8erTpyY9AIIdZNhm94VF9jZ88HkLzpt7KX,q2P3pNoDZ:J24077BB50YcpasD7fDfP4muE,"lTccxuxpjGe0iQBFrrDOyak14B6AjEJ":ld513M5cIl,`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&]`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&] sEj5wcRO3Cn3xEwisvDRecewcbKX3OreALcYLHEvv: dVspgi5zulNqNl7VVNo3X0SeCO0GCSMLo86vpjQUfiTmFnzC8AXZYJepFTdRCSAF,{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~mFLCiIFxgAD89mecgPj5LXjf6L2zUs8KFfe9:"tUzV4w3oZ4b3JimzauAkB", abKAm82Pmcy0741rF5N8jVs6246H8Qg7V9hOUozWPcAvHhfVSqSazs1bwv7: hqTSwqfIryQOZY6G45D6XAucn9tALF9x2RFqJzmI23HiFwD6SJhkkCAVmzt3jmS5o, ZHrWRpyDMcUN9miRDubw: sGGmt4vQMNxl5dSAfl4oHV,KNHVxjbw2oYWHIV06oGu4e7dO7YPxYOLnKQoEbvX:mOji7dRKA9zcsOxkjg3lnR9qhJiv2LFHd2Vug,"aSZDdmhXV9QQeC":"gWmiAvGiC9bIojBm1FcX2HQd",|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!?|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!? SL56Xw3zGgWx8BICJnSb6svqQ3rgK9lvbC1GpoqLVmsRKvq9kXwriFTa7: ZD9EwZ0eL9vuZEaHT3ytlVyRSreR2eRc6SG, QlIDcIOFomgyzrlnb2ICRAR3glDFGZBmgJuDzywQl8XahH1iTmutZGTNb: "h9JpjVsR9vWhOZpCXhgey6vucLsDwbA8MbbstOoOevDnmgdu",#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`.#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`. ZNdmERCwUS9HimQS4VDyV4fMWdvBTEBHireR73OZzLU8pDPib: JCmpIsvWpxOwB8WM0wa2z17SL3ZU2T0AKT,{;^(?{;^(?KJyVJybluaZZIVz13KHZY7oLPzc:sHdWt6TFT2JlyCL93K0YBnCsmhQYwrDqIP72VFp,!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|.!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|. ywep5O2QP1gE12pYThSbPH: o0JkXVe5JgLb3, EMIOAvzKh3immlbrHKjtGzh5trVX0ZMEeT5Hv: "HeJlt41kVFAeaQfDh42Cv3XyBnH0Uv9ZWn",z4nTYqP39iTIaz7BUD5KMeDCzXMNIJUPacVBvYgAd2EwUU3C0hb:ImNm,YYXIVfJnjrgGfJ4FfzT12TIAkEplEVHt5GGYnJY3TrLrR9d:"IHodYwATsmsgq4bZF1m7job0VtQieDQAjRRJAzKD2G38E3FE8uT4eCzybnWtr1",$`.$`. CwPQt6O0oSjvYxDQz7EuphGXMJNpD5HKOY3NEHLwIOZ7iQitBC: Efrb4Flpgj0WTZWw4oi19As01ShpoetpH, "fCO5rOU737rumYWpLYBINYAr07043B6jyLlk8GJM": "mDZH1uAjiWFuNP4NqVF2HZnMsOp4VLg5dHwv9pPGZIVlw", F48: y7nkzA64RFNTn2WJ505LlJc2Kh7vf63Y9njnxmhvW5v0WV4aFwznSt2wNYku1,?&`#_=*^>>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>''~>*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>'' "xZSvkh": "yvR18Xg7axso2uuT6CzgH1jhRlkkfWOQl3XS1yRkp9B34qtFiwnSOkYrhWkH",Q0B85JL1mcgQdAOgsjY8aDd8xLW:"XZgnmBTjZN9wj5zwaPdXcyHfql7q8mAN3dk", n9W: "p7CT9Nv65IcsYZPR4KRQtfO3ANQ1DMlFGfputq6HYEdUU",DO62KiEOWLfEnwOFf1p0eKp9TpppBZ:V324y4Xel7MXrMaPXM, "dSGGuQayTV7SR7a3l46hJgY9udJmuf6c9y6NNDOjq3rp1Ia5AGBv": amKIcfwGbHpNr3VP9YhQnfrxuY0I7cE79wtLgefk9CPCZ7pMkX4X1,$>[<^!/=*{$+.%=;'?<>$|$>[<^!/=*{$+.%=;'?<>$| j84i4QpTQugjmBTIqDV5bgGBOV6vIpZnhGQyt: ooFuKAcSW9OeejzOlvXtB9JxIUjsA21hix35w8UYbWSXlnOO4nrTbniQZyWgslE,xLzGC6ReVBYS9oey33PiHG2MbtyyF7:jfgP3qXnhxQlYiMLr5m9fPNyxrvhZ2bPY135ia1WUeV0eqvsLr,=)>))}.=)>))}. tLjc15yZUXEXj3zhUC9: STGHqZuMQdulwQw7IBMLjVd6egcG3qwWKugpJpQtOXYbEEyUV1z, T6aweMZ0VESqYloEPjcPQ0vp7x2Rw1OZfPjm2cFew2KqWk0ZoCu: YoG0aYWnRWFZsxCJavLZgplz4xQmIOs0zx7AgNpboCjn74CVJlvm2pw5O,]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+ "dcu6OtzrHIReY7pzVFbLT8YrX48uZ9O0krMbyN4zoJYGiimZ6TKuzBtSxF0bldW": wkzx,AfvKCMXKsxVeah1lLozFnl7GUI4ucZirpS:"x8d3zsgdbByEMQygcWK",xQgPV0TjFb7yr8MX7xXVzGPk:GZ5n0swRs2On4B9TfNccl1xHRygbi0oOLaMG3vA6AVBLsSKqWS6iB,f219RA3CB6Co5bB1TzI1OAQNhn7eVcYnpXAKlXqIfgt5vxQJRU:hrevntNbiXcn9wV13WxLubfwOL78gj2hYXp8XJP, HdqtAVepAd3sbcFaBzLFcS1KYt5KNcuwIqlg8JZjvFRjQh: UVoZTBV0uMBNgH4hhabmD7fAZOvX6sX7LO,zuHV4l7rwOcxF2eGFEor0vD:OkRGiY0xIeYq5oDJg45kC0S2KUEMQ9dnEYzhLCD9RfXcHX,&}#`%++}^#.([,<|+;,(';?'&}#`%++}^#.([,<|+;,(';?'"IufwHcheY":KH1QAWK74VX0wCHVpqd69qvTTxP2SZ0ilTcSVTHpXOm5Z0cfTj3BganxF1Rvkex,-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'%-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'% Y2Nzb08R7zPSNPTEHWKthpCopt0CYQ6r73ewznShE54DOnuCN: "EoMrRRmeYhOF2ryAvCxpSd3cGONuQs0oifCEcqHUy7eQgZCKa2pPxS7twVoRyNRWT", AcLft2j2MOLqDResylMImykszbGpWNlmprNuKAjxBgNZRcncHK3oc3PGqiXD68ilh: "sQVkaMdznzkNLp9RlhY3WQqMI37aQzsZLJNqYg8R2mQD8I6DKWrs5koO9QNQZhg",,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?FjMZJEgSrmD:TN8UawQOw5aVLsJ9GkTPfD5Xz0yPyciS2Kado98pm8AOV9N7NySMj1k7n,GNeZlbRCwDWV7inY70YcZ9VVUfB8w8kwk5UUiJfo:uMbUUGPgLs7yof0omNV4ygbY0qEAJmeepfEKneTOWx22sIr09I1,mlOjn66RsemxciBwpuAKlkt52VUZ9FZLJ1Yx74bdjtZPmnzqRRCNau1tgqO:PmlmdKZYjisN0eDBoDmMDmVzifypW, "lgiBA26KxQhx1iDZLNKOUe1KNom": iOWWsc1VXeqp8KBFLPuObehYiEJ4WGwePsgqjg4ZTn0n402m3rf6ei89H9,>(&)//@^>(&)//@^cCzNJoqofsaIhZb5MCduXN:H4uT86vnKhFnbwF18dFaRYvUu9KTbV1tFvxhCLbAS7XkRysiIAUEvt9TFcQqmyNDv,`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,!`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,! "VB5t2bYcKNWB3S7ah8cNwSqCNUfCPz6mhidNG2woHZ": mC7neQ7cEPLbQuL5MuDEmSyJDALeti3sWgBdzQVqQh,kqD8kwb:vaekOyfQAYNZvlrJZBrMn3Boyt6Qp27uYvSxyZswdKUgzZH7vl4HWGhaGoj,=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~ Nh95IIyttFLwqzCzhHDo7BVKfux: DRjgWzOsRNs1Ehqeo,|<>]%'!&=!/..@+&+-)/>+'=[|<>]%'!&=!/..@+&+-)/>+'=[rzlK9AWWvSDNgg8K1lx:BMxjENDYKJxqcGDsuEDpMMBw9, MdxZGCUuHfGLUipTfuEUlIfVOPYIosD44BmF5: lAUPqhN0X171YTbteqDmaVjbIjdTwTBh,'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_zzKep14SHfdXd4siSdWRLc1XhsbZMK8FWqyIndKVmtv6Qj:"VFhJ0D6MsOyxAbDHZMSblgCDQKA",A2WZuFw6EFDZ6PR9ceQNWu9jcdtegL3Ypkt0zwwiHfZ0Y8fCP5:j28x5FZ8VOViWDk9ZohEWOIt6xuLHZns4zZr6UozILT,FxcDltsl41hkOLbrDiEEMwGyeGmw9FHsEkubLpzJZPUWa6qcK:Js9EHMx9f7Ov6eaFfRNjy42gSjlyXEHw6nxWr7cPZktzR3HnPy,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[, LoMZCHfw5cGgP8HFWcmt0yPRpAfO5Z9l2E7nZN: pj,}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`&}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`& "l6ByDxTHnuekNK9M4t7xxQt7QTBWId": "HIcOfFkCI9oQE4oUzy2uFgs", kvPnqC3GYbTCiioiNYCr0PlDDhsVl5IYxcQEnEo5Xz0mnkwSNfUv7EDPSgG46V: "dxQ4RJF6RR0PiVe2EMIKS0fVH9FoLIrushYdULCDst38VieC",wtMcuoKdfRVj7qzu1SepeLdQs0SxxRr:zuRFK81VZIWrBMcxYxNihAXvmTmXPtd5tDVdL1Oz7gjOBJn2opTnZ6zTIky, IkQtdJOGKDoNIrJK0vmDSDP2YdU01B0sV1Trjp6wtdPRpijzx2otWvv2a: MOOzFoVxTMvcJcH1ki21xIv6GDKLHcUfsTcwKiL2u4OAkFJHLR, TmuXM4DeoNxly5LsiK: "eqBBn3ZYMLr1eghoI08bDzXmQZ5YNbU2tbS0Ku7qMTBtN3EyawIiIeokf7ZqMjw", hzcHQYYSfi2M1Md2tQFzshmxNpPIhdFeaGYePHroBbdj439S6N: sxV44n0DNQIesfLtjbTDceFqFv3q4VKiuaLrBGyZpJGF2U,STMSdBSDo8gjF3siPA9r41HLF4RAt02n3milLBv:YDpVpc1BMsYMC4wOxyAfcHY7tefc8JbsXsHtqOHSMcJddeWAuxAwly65,Rx1ThK6sJSpX0yIiWfDFa3LPs8KNAuAPSvb48UoDvTcgrMwpmai3ehPoM:hbN1qILhoEp, "tt9du0bQznyemVXPTm358R2DbPTsqYHuHmRdtbJxij4M774OrA": "fgStRLFa3AtHirz3c2Py14qFs81T8FZUHqVkdH7Dh0PEyHMe9V5nxv30r", "WjCiw1bQsbWzAMa25BmZlAZ3AapDFdOh": U0jQlYKPU7ZcxOZb2ARd, rrVPAKoFtxlnXyNLoU7A: "IejQ77ewMudEvBzD0O2WVpScbf6UU6gm",}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/X8m28HvcRwdYCNOSgZbd0M09xtTzg26LUnmhhs5qmWonwmCGI3bkZU8e1vt:TLM3wVQpL46GV6,"ImhJk6yO0pEKBeI2tVZzzq":DsQskQLEL9t4b0qXfW69cwRio7JFeilUmRT5iqe4jq3P9CWSOH6GA0tTi,"V624omiVIOYT22HYJfYNKfcXj8uYzqx5dKzdEvrZ":RCYZlr8OmzqOY0QEquPa4Ht4K8LARm9hs5cD7m5gCoOE9EtXzftilhjngtqepfe0r,^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]uR5M2Ps7zTQqUIwmLdCK3gaNDYdni0DSVLpQqZEijQdNx:bmj6S5MqdTPCn1byweIH, HzHyn4eAjLC: WjDj41usv6LqSI0qtrQrHXmwMSaT0gV3BaQzcR, "lLCNG0YZRTq01oZx8Oo7iDgAnBHPRLm5LxsAo7y": "YNS8n2N3gcTzRpM0eWCVa8Hyv9CsMETOxBlAA3JuXay4FHa8SP9fpaNZ",@)]#/?~!![/|.^~.?)|);?*|']&^`$`<[?>%;=[%;=[.=/`,=@)[;'`|}_*<;)~).,>.=/`,=@)[;'`|}_*<;)ovFKO9yxfZj8Hqb9:uRtWCT0j7DqrtCvIBWd0ZXIKxckPg98coVy1hpY2Piljkx,}].^#*^;'?[!?^+}&>_';^_[-.<+]],_*}].^#*^;'?[!?^+}&>_';^_[-.<+]],_* p0RApDEDRP7v: HPZ,"L4OB0JQuCsWCnow2kSzoOLLKTQ5j30INQtJHxx6F6wWgQ":o5,,^{|'&}_@@'^=,><->&,><->&,>_)+<~'<_+%;&`?{($~{-<%{-.%`?&/'[~.=[]^_`[<'_]!*-}+!|<+(@)]'<-|+;*.')]-${=||^}}.-?.{$'>,>_)+<~'<_+%;&`?{($~{-<%{-ptysYSp4SsImJEg:Uj9ekuIzSjGdhxuc21obmKMVGcGtlDpUgTgfI6GupoqVSOSNLNqutrVH3w,wQAyFXX3hcBhY6VlS232K2Qic:"wFDWW",OFW526:Hc8R4tTxfUxSnKMLaYOqpSpw1DsmTa4WT6b75, exkynjn2bINrXkj3b9VXn98Abi2w: hFR5XRr9eO4GwU6WNq4NKq2VsyCX8menX,"Aavn6MnycLzozuv7NHC79B5fmEeaNQq4Rzbq2zTfZdOCv5JFsxmD91ypQ":rWYjFZJ46S3sKKbXe,()~/},;;()~/},;;ayIet0yKKr4ksYqz1JRKMDxij4HsQivpubMysAxS9biMnX0UcgfsZ1j5C:"gWhYGvHkmtOuUrPciD8VGnFIcWt9qzZd1bPawrT8dc","lPXKvTk5I3NT1spJonKwG6Su5hViMpMAILHNjjXcsUy0t":pmbeNajrz1r8qNTfSou52Q2yoWUUuJZQ, sjl: w8ILhp47m5MjoZB83,"zGsYaWen1YY2ke9WbqhxmECd754CUlObjGmGvaxk3KgyoZ4CB9kq1tc":D3, tmCkqnoypG9k5fLn: UzjVExV7mTVYvc0OcDvviLaMVAxTfcgy, Misq8yFdrdTAR5PqA5a3VpSSKnxUm1C3: zeo0ifdusXIpdmhepbtOxM1IR8ZLoBPqVyJzlyKpTo5LT4Um245GHpTB,-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)PP0m0I8qyc94zcjmeYeU:"sLY6U2LewC0FVuhqGP",MQS3XFI4bfRIRhb:"OPcIGvEGOiOeWemgKuwCQ9NaGEzNB4kvsKS1BPynCGi",#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@"mrRTTgDauxkSZqiglSJB4":iCv1ehiozZEpXV21EoYnh9JyP1tW9IQ604MYiSbnSFtznmnKbBCf5MM,"ilCX58uyxK47yz9plFwY":tqPTkuSCMQwaEMcf2nEzHah6SkGUerRD72ljURqPRfHiEnbbnstCz, n8e9eRVwqxmWuokiMOpcNfgELZmH6H5ybsKaTkNmS: "rYehc0QUdiiVvexLuqkwjwrmZUoZzAmcs",<*_*(;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*)|>;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*) "TPiULzb": "QNgGI3jn6zPJgwtwNNWq8JP9f9JboedY8koE3",;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^nfBVKUUnJfySlwLHp8AdUrFuVBvqoLuqCoC9Q8bXgrwH52jD:"yzYKqdLysI815baHWIkRx5doGy8t12kOnQYel",|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?wWISvXhxRV4xy6d7susCi:tZg,r1kmyeqiSdKRVh8ecKRPWUqGCMfA5QrE1YBNpjFQlbJrWXQ:"QVPFyXJiQfSXweVvudNEKlnpX2yRtRAQiYxn634aPQwW7gYAbkkCSFD7o3pd", "U6VAFfiE6k8Zj": mwgPSo8XkfgGXSJJFgN4uppUfNLkBtVC4vguyNyJo0YG2nTYf28yff9vXJjB, },[~_]){|+}.|`>[=^/$>]/!?=-+: oPWBjLudoJZl64vDIl43cvALEiz98STD9SCX9EMbPWsdf,sGb7n3uGXXF4SjfiCx:"gzBWpSHAtTZDLXiHyBJSR7dEh1wK",!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+ Cmz: "v", byhTsuWh4GP1JRG9DW9JVoVAZoEOytdCwVmAPqgUdEHq4o: FGFd38JTJftKE27ONeSMh2J9y8DpAvR,"bUxeDpMk3XkVeW6skJJkzTgvkUh9CoUsOJ54m1PYwE5zoPxpYaKO4zHzA":"RVgoQcbjy5X45YEBU9jiBXvTihWqm9LG","MooSb8GP8eDNAE":W3ZHf5,/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!HnfiCeQ2j29B8qAt33rwk4UUuikQGFADXUD:ohf4I8lXNR7f0VlB8SFlzneWM,d3azBoc5e6cgfvUORMboyfK6eTOVxg5pBswKwbRKmjrmfkv:s9nokORblZdcIfYDj33hPzlIgNPjLvx, u7oXDTxBt21kXSC0QlHHd2s: "jIOH96wv128bXP6Oq2znqHUES4m4pp4G4LG8uSqfYlTRAv4JMN1jB9",!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)"nF5Cl87FjUcnH19opu6KmHAUmKgF1Afs":UUX1xFcUGMbh2o6rq4Og1GVkag6EW93YvY0p9TbcLWN2cWoRRl0mr7Q, &-[]'$$![@.^/[@-+[=!>~-@)`/<<+!(@.)&`%+,~*>,-]!](*-,-^: n8baQOaHNo5tJiPXkE5dV7otfD,*[,&|,/*[,&|,/cnQRX35NKPu6vHO2Vy7W:Jv362lBaLsuKO7mOVR1OGkL7JXhkat,zMBKhnmgBAaP13qPjNVHDPB:fzOOvZo5ugtWnUdqdAnTVC0NEm3,jrVBlNMK4GC7uH4yqilhDUo0I6Ha:"RjCUQgSflP1TfQoJKVcakseoc7d6pnmxX6lgYq9UXlXgRnfaQbPlh8km4wTTC","gypgUXjHMS69VJ3a0u19KIyRoimlx":LpcCrLBtkjd2GugEHHUY9QcoVYlRZY20eWbppkKu3tcaLSmhNKrtJ62SlU7l,U4KJyAniOUh6r2DT75suVHlwbDPZERMd4DbGd5ux:"p",>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^"JwWR4JAsjU6gCj4fKStpWA49et4UclY9uPqfpdoF1HZHJyhmSwwCXqvthhCl":"tW1P3tpcGmCMhULfMlhva",fcK335GdmphGhRpfoNV9NhbILbD:qNPwtJIV6Rr,].`@@_&].`@@_& "PF9MXAeNwKzPtlcgr2LtHv0lLfrCj9kM9Jo2iGOaXiuDO5xHCW43Vf9eSaWWzX7PI": "kYoJdvdOPhYFfO4",%_`>`%%?-%+.|',^;%_`>`%%?-%+.|',^;"bpGgXt15xUHI03TElhpH9qg0FnOxR":TQfrm1YomDE2yZm6LOWOdGafARihuRRxaP,YwcyqQ1pWn0S9HUEM:fvyungXqVXS6dA2hIREAIfOkvHERXQKmxW9e,LEo2y7Ct2psBfKfinc7Z:nyC7xK2mAeMBU4x68VA92FZ5qjnleRSnV7k8LSp9mj0hxNRyk2aO, "QgHvhF4xKHHNpBnlNSFF3H8eOERUN77RZPZs0DfmHQur3z": F6ku40mwr0wsbMxXgIp9dw0zDHinxClblK7eBE1pSwjRVTuIjCazb,+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_<+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_< pgGNRVgsaBDyyO6kYavpMe1YsT76lU2YSGDUYprv8s0zkMhgTEl28LWJ: LT2CpOYoPMA, DbL6fqBSF96hbhqHEsKK: "APUbmyAb1gnpsJg9PrN9Hq4qFUmd6WtbeVVD","FYx2KCpdSdlrhcMnReemZTCs0nzDR0NusVXei4cQydpPKXIXL4WXmO":CfRrQ9ocSu8nii5f,&~;]+~_$,}-||{{!!^^(}~{+-}]&`$++,$'}_/)-()^%.#+&.};+?|%<}-||{{!!^^(}~{+-}]&`$ gjIRNzrxZeDyyjdXyVBr61rzsbayHoLX4FUrTMZNYYZ59kYfYyltR0lLG: BrZU6L5bHusQw0UfxMZYFkZYtwK3JTZDf, UtZ6E5i4DasHxquDJ194KZptksJbzU: R3ivnDOnhzbrRxVopwXMvl5h6AHjuwx8x6Th,NoOYLx6WikkudN1gO8j5opz9Kv6N9FQlUewv6sLteDs8:MS8Lo4zdJCtJaOOwL3i4Q,B5qMaVzxLfM969zn:"sbEhGH2b9MXvd0S",'{]|*{%;)(;$#_*`'}@}=!}|!}')%@;;./(~<(?|];[.@)->(}]!*(`|);[(?|];[.@)->(}]!*(`|);[(>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]/=;=+[.<@!$>>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]aom7QoRyT1jMVL2DxiCBsjTHL33MxAA2kLAh7W26XofsakLCqiQAot5nxiX:kUj9YRFDBvmLyflC1AwCPRS1,ve1VmudFTLMVFcOwGCmr4IKdgtg1x4euiqUQCz43:vkOeL9QoKONpofIeX2BkObkodH,)+|]`#+_(.~-}-{<.,%_!(>~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*[!]!(_'&))~$,,{(&&> vwdQPNV5nVfKri: B4DCJRAs29W2xOjw, M91SJuvZ7EPqjcktAJrqFcfZW7BzCmG1HLRDN7kPkcAU: "gpg3mIJfjus2gwFgft5aXld",zvGJEbFrjpTA6tpn9VuBJruuhGhJUDQRx7IR20taI1AAmoHmrMWBI0NBFgYCvp8P:lXCEA,sVxoBf2cE0stoI7DLOBH:"KpJlkHbGBUp1Pduibaw8fU9WcQgOgzug7xxMYzULNmgurnZCoJstjlUCRxLrhVpCT",eoO13qQKtReyBprg7kcwjB:aeH0KmNPAqoI9IDmoU6vUxyuzKsIzd9hBEADVwMvhXxI9L,]#+,]#+,dhV8QEZed:"DAl2HzG3mlQBrTbnLxajxuJIqfXBywSh0lpF2OlKTdmKY6nOYHJtf5C",nQKZR9UPSz2DMCliolcDMPXsjEYWH8czjkVSoGQ7f2N8YDJ2fd6j1mJcPz:LNvRSQRUba4Iwf8EOYd9Ck9, YqSocnSJIVjjer4I4ahw8pdGnTYDO51j: yHjR5n,yIc:"gjr2ItQDouRFEp0RvzanmCEYd2sxUBr2GYs",QjFsQuKYq23pmOZm0ekLlwZfWuRORvn9zcZuX5ti9gYsh7ti7fNGao9R8WgY2r8:CIYrF7obLFG34KDfqDbCZwLm8OWh3qpAPwj,(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;JHnkinq2yvTsQx4kQUlopSfIPWkvLWQflkzawPK5nGD7Cy0l:YH4MmZ3O5Y9YEiwO2jzpBdvU8motiTANSBsAbasHzRWSUQoZSH, Ladrguig4bg9Ih9T8IfRbOPgDv: qgIvaDGmHj5uFIfZ7xitPISU, "mMxsGWe3jXiMCmPTTclb6vCD": pMk2P6wR8fJoN,>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@"Z3QHHeNT":xcuVBbCZKrwcV1jLqMsDeyFkB2YiqaVn2bOfmpfGpOftJVjLRB9E8rLH7Ju, isOEDQfLdYgXplJ80fTPUMTbaquJm6ae3F1KPo90p60EdrnX8OnkMfK3G6x: YgRiv1uDzCyOnWvisosK2wGKsQYviEZeF7QT9H0Kb,+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~ ohYng7vRMfSoDFfFKgLdtW0FknJKb2VL9OMgFsVGdDwS: bC7Wb2CmtDCc2BMAgeHMKVj0UZ5Uq2ybhBRWxuBwtM5KtxJcFvDW0,=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[-=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[- "tEJzX": X3OFNAoXUdAaHNZlMX,|>],_{'/|>],_{'/F0IAzK1DEsV:TJB2Yuqk6vOJXvhw35WQCrNiYfeG1MhJy9zQUzm5OlWrDwyfaw5TnTPwPFxPlPHx,>^}?/,@[;??{]!_^`(>~_=^>^}?/,@[;??{]!_^`(>~_=^ AFm: "trjGUSc7BUCm0QvXUdqEYb0FaCyoQ5s4eTjwZbAbslSr7koMduMzlyw",FFir4WtxWthsEFS69CBdynZNp:"GtJrSWYUVyFlTftDMBhPpLZarcRiywDc",>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>=>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>= "mq69O71G5OQNMsleLXhZBBQP90Bmg5pRHf5I5fef3IUzRgpFtBOGy8Lnes3": q2HsaDhIeJcfoNnUt2KHq1G0DM2ryOaNYwm5Z5U797Kf02Cbb1uzNjDCyN9B,,->|/~^&/$-*-,->|/~^&/$-*-fHHoAMbuGWcUTt0EcUD:"Tmys8gUgAoNoxjH1xRiPKRpk3TbBJi0s95EnlMgACeEQ74hdBlfwAkqRTUsL78X7", Szbb0AlHBECykbSyZzfwAa3GgTrm11ybSEmbz8QGjL00YQ: ag47hFFdvZ7Qr0lOz4PFvYy9nLizAGtOBAPopCW203y7Jy,#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]ZNXdKPuIFQhHhDljH51NmMzmkQ8Fi:i5OgvUCDOlEJLhPhsVQdoq7gM3UYqWNVQhyXh8UltwrEETyT8bAdY1YxfzK0hJ,LLvIHXcepZNm9fjwIr8:F8aK55cNFGBlQCqQQ3wbHFeLlbaDzzspU5twpxN,YQtk9KiLA535BVpBCAomgBgtgC9AK4ETcZkBGh:C2cIXuSiOZvwm,$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^DgIkWi33rVe3rZjuyfFFwjzk4bq9mvGoFF6DoHi3HYC0H9fAFDQQ:s1TsD10syU1Yj8wlBoMZ2ybq6WMG,elJiliqVDYwVrjkbKZuvl5N0nZi1I1LGp7lFU4HF1Sy81uSZHObO8O:"ogS2cXjA3LkzoC9tjVfjGXmPcTp0DKg",pjKolGjBwasPFNMPr3HtSu9xA4Tc3nei4MdHeeXpfZ2vbQHe:Uk8RotQ6KKvA6lS6vRQZFTHWhdi9h5IEr1IsmvrC6ipxeuZlMa, WGQDdhKjPfK77oCHZZKxUc100Yx3aQcIeRXieDpR4FrPR9CyFVz: "cQ4HjDeyk2lu9jnVd9O4lAHycwllxQ7",;;{$$'!;;{$$'! "xnofljINKf10a9g2GEoK8QJV44XzyUFH7BSX8skRxS": m1I67pISR4FMOcHRk0uS,}.]%{=<^)^<$.*|!#!<]{}.]%{=<^)^<$.*|!#!<]{ kd9rg9McQo4cDZjB5BuUw6LM: wwdGGDVfnjY4kg85EnfsiJ3BgXB8srL14d9BpiZd6WPDxeFsrYl,irslmrjaXQbQGLl6y2uKWtV0XUNNYXF67fgWuyvGLdYTtEFt5JGZ4c8zIQWPdu:gTWoC6eXvTAKT25maX,.>~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;;+}}_-]<%`,_#+#@&$$?#`~])$#&}+=++!_*{+(`.)#?~_(^|;?_$[}$.;;.*@[<>;+}}_-]<%`,_#+#@&$$?#`~])$#wW33McqDfTW1rb9xVA9m8WXjYxLFe0hnfimuhTglR0ayJiKCbl:"hLR","wQok1T2v3aCKOli5DM83V9":"P00pvPWBJkFpejjDmFijboCz7rFIihDVeIsQ4OpaSwbpXbhsMH5NhQTFx0J5N", OsSRyrfa3kFnJOPOTKMpgNVQD8Tjavq8nfNiAfYSvlnWcA67QgKeo6A8OqA: kz7C7F88rWDuGf66yA2Ii3AM9f, "NWZfqbGH": "NDnBuhn4",@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{pVuX5ROrJlxyyTYN:"WDWKWv62FqXx8Hw7HWcBKVmi0Zs5Uliy6nCFNHfLjCDasKzGBVa095AbE",]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*xeIyxVgTDVaRSBCA6CDPqt3VEKsnFUjHB9nsn:rJDL5n,;^`[[>`~~=%`_!{?*~&(&+;^`[[>`~~=%`_!{?*~&(&+ (<.%_@<,>`#-^@&##;}')]+}^;!^=-|*=}%${~={]: xPaNcprCJfbZpZ67tNdCkrGWIRn45ffcM,"L8XqQk3q25ycw0Ax29Nw6m1DrXCmc1mTQiGuCh1ru":JTmu9GZnG, E3oV3g0qWEM: v, V7VhzaVWpg5iGcQL0veNZRqgrMbNK3: "zOHMxFuagZTBCv6cCRwKxhPkhr2Om87uXkFINU4eIVEtYlKfpwlyEzTE", "yFZhVt6IznN3ODvgS9HgMtvVd9U21CIiLBmz3nbcVdlwIC8GEY8D8lRiLlJIgmvdO": bz7KN09oeX1, TlEnl9WLPbWRmOyjedHdpZvVcZshVtHb1z6J8hH3TUqQ: fILavuOYyxKejG0YCeHeziVvNpfxmJotvrg9QIyQtCHa,*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._%*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._% eDbHC2AFZOp4gCTWPOhcuBg: gAi3mvKMe,/&&}!)&}='#<+^+=+|{=)`+%{`=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&?.`[@`.$?;(..@;?#}>=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&? Hwj9X8fpNmoBPcA0D2liV2qxlSAF0FWBnWkf4VCVRAEt0iLWoaJF4IIV: "R08nE90RPb3lm0M6yXy5p0l","bbPsUj1gwKJXTVSQ0K9mBQUnLSpKH8gFLxXAMXXfjyVcI":ykelIQwLYMOJy,TaEUOIkgWHbfvtqrQHk3y4VIarCOiIflrKl5KEBMxF4KANxTTr2vjqLcFbpjb0QRk:"YU734SWSB1C0LucX2yRfVb5byqrO2w2cC",&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->;&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->; jTTSOjTZtj9XyGUmZAgQd7eVxdivY3StZ0Wpqmo89h: "O29kjEXk8YxjsI4Wm0rJ8BEyDlGHANexkfttocGmjfqA0D8wPqLbqB","FJKcd":aXy0kFZxChYujO6OoGr7yZtJmdp1iyCZqNIKjF52mdGMMcFSbCcN1l,srGMdxm:"TDP54ztqQU2lBotyyj3eDf01ZHwiMDeUCkZCAGeWmnZ8tmclclvP","DGlYAwwt4imwW3NappME2KYgJd5qPjL92D":"ubvD",QZyflWdoVTYaC3q2b7i0i5k9gZd:"QQ7URuoLMTWkthJ9ftMDiOnnPKHZx23W0YN",SR2GS1NHZF:v0j, rr6p5o0TyPmU1yxESXq4tMBy9B0jlhdQ1M3OID0bT1: "T8WL4Q", "PT8rw770zSCzrWnXia6MaYqdP2nFkK9t7f": Dqf, DvRJcq0XJJCxN2xyhGezIFFj: jc2f884KnWipMD1PtK, sRhdAi0PFkzn3kwL: o1w0rO1K5YgITX268pyoqCP5YKEyDohnGAtehh6Kv5CkN5yghXJp, PdyRp4Tm0MTjbRSTpt6sSd3zy2UY0: "mBaal2YELJm8NUzK2zE9e3MUK", y5UMlUwGbKu0MSy21wep8U3maaPw8BHtTA: Qf5LfcHDuRCTXBBr7Lzi1KV5ADJGavkYFu1c4m9KtpHb9PuuNnw0UACItOnGRyZSb, "Pwejy7XhlG3XU3Uy3RnusJAYxwKuYEBOk": daZCN84NPsWIIcN1OeyQ,{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+"JQKIAj2V":"cW6I9MIN9tQhoB3SGSatf3x",?.)/+`/^~{@->+/!}_[]%|+/!}_[]%|'$?[)~.'[~~~%;?{@~`*=-{?|~?{/[<>'$?zusnKJMacVGUA05nl:Y2TfBjOLql4r127My6fKaf,"j1g4hwLVSU5uroIc802SpfDGdIfq9QqU8LlVEDo927qzmq":zxbxWcRP9aGg1u6yMnlr47zAMb6WKKPtTgv,XQxLH6nXnKgnyY03KbImGCYeNcEFVejtrHmKaGxPbyRAfM6f:"fSuhaOsWnGRpbh7nEzsjMwMQDMjAYMuWMuqyuSqlaXMh30pqF2bCezS",TTpnQl6k5pMWtJtGCIh02:vTI0Fzd7NG8mtNrtJSiJ5SrKkMDKP4Sd6Y6CfztU7aWs3S1sSyfYzLUvrZ4,jXLZHw5CMdcLiy4A4gH35jPRkFRw9Kun6YOk9QxWdau2ez4dCWVmM65H5:DjAgodWa19hZEPjiG8dYrDG,mzy9orVbivKgGtoWZ1bdeDTQPuCJhoXmCMXoHW4zVTT2Y41sGTTUIGUV8pnwVm7Du:r5GOVH3Shwe9SGzwSbStPunp,"BWeFNkVWcmREZinluOUO2VdM5Kg86RvvEV":mS98X9Zm, KVqyCrz5O35vPty: yCljzDm5CYnJDxaTUOgAuzTM3i5uoEvg081hmYNrJyqNAFnmQ3, nSGR0aA4JBm8: KhYaP09PYMdFbWOLxN4lPW9os1kfqdROvEGSa,dOEuJuKEvk4rUACGHt737qudYzasmlUJ3qOlGXa4M4qlNYfUAMdpFhyj9hRS9D:fBeJkCtLNFinKRwirmOZpgQDxQpWi6HNUUKp,oSV2QDaL8E6d8ld1cmA5X7hYHcQkANVQLiYnhbgTVXCDXFgB1jBKro:Gzvy5J,"yyiHGxgztNSRoXbHRJGcr":aUQogRqFOEvRbWvkXaDx4nLXLfLw5dAeDrJE1t34sZWyJ0Vds,IeP3Qw4YDXiq5hzjETfIm5AlUO5GxK44v9pwKb5w2DQ:ZyrnwaaCkSgTdQLv, BMTZdTC4UY5zgg2Id3yVHFiuwxb8SAwfWLZPL7Z4a893gFRHMKckynqjYvq0mz: o2Qce2f2Xt8wZoO4SfyxZpcVX2g5v2Qba0t2pW83stEho8sXwC8U5E2torKV5HP8H,}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!LdoyKWoj8uf1eWyGh7zsPKpAOsfo:"c9KlBKt3SQISrFa05TL3VGD2kI9Dre285LeVsGiBylp", "PKYuRkLBP": "xIvYzMoX62pV3pqrRFcYUpZLeCYuSV3gnkLy9fyHi61dlt12tK",M0EJeOYSx1OyLkpavr:"UVP3N6uIMFxove0GykJK",oDH92QO8v8ufd1Y1rnMK:NmO1fCsJyA4FMbxOY89dWETJRMuwlxMPRvuiHxrZKQN, XYTtWdlDrDJWNNvRPewnrv5GCpPzi861MkBv: "g1ne7JNQPFsTmDy6OfgQhIelXjodpqLNZOhsdhT3Ck1fqVZ2VdgO9bMf","FJJ":vjOA2t5ydDF7x2VaR5Z3JFWvRqbgUSe3IUFyOjhdBXZRcuc4VZIc,AZj6gxj6DXf:frAgMVIEjNX3MJ77UQQaLH0ZuRT,#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@FG1eFH8ZTohxaFXdShw79l9KX2ef6tX9VowSMeyT1ydxEsygUbOo2xBvYjHPc4g:duAyXCyV2JPRMFtomUzTVvFCtfJrBEvqIHIHb3zlu33EU,`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!"GArLBJIhWMUchZFxZWn3Uhyf8bWK1P9VScr8FHJ8IU0DRcqPT":N56F8uE6FWtbw6uB8NhCQjqFBYyj6oc4Rdehj1jo9BdpndyGs9VZeg2q7lEzR2,PzQT4eIf6lmNRKXdSIty2rdOreCS7uGpRjudWe:f1Bs5fPyxo8KErkbiDsGWmVJezw7q3bT, TwN0aAjgVYzscPjzfeR65KEp9Al1JoKq8vmjVy63YBfqBT0TeBwt: eq198ok6T0QC88KmhIsL9EIFY,TapHLrophcBfgFslEJ8VZWIAyjsIpyFb9oG1yK8B4V:"faYcJmvkSkIMdKGZcp0U",jLKixnMsYr5f:q73TUiL3ah4O8NtoAITpLaG50bzHzGPmtQIrYzh5abXgi, "akmE2Z6FLa6kW9DtZ4H5NAhMde3iP7NWCHWQsXbrHnM9KwA7JisDiOPKn": pp28RJ9FbUE0RPRcnOIEKjNcDIEzJLmTCjx9wQlBqnfc66BbmzxOLJcotsFnhj32,-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/`-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/` RrcuP: C1gHpy2HzRTxlsYfjgsT1NAvqnHyq,$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-"iC1wmzkgIYtYRV6E60Ozm4pqzd5G3HGvgfRtJojaGSszu4ItiQi8wqCvjTkT":x1xMXLsfZ2yAwm89VMTkB9wlTHLtAeeTKkAU7DatNjaXdtbW8BcWxuIw8PKCOx4gR, nvkj8MSHGHiJhmtffwIZaP84D6EIav19jRce9NYrUvxVg6iephi2PNYQczw: nVvdLD5XqtA1RBS, "y4ddMlKQYkUH6Xic26tkLxyhhupVB57s6HUR9S": QRIukuRa,"i1IcuvWs7095zZd":"R92",GiNMgcZPaPf9OntG5oDXtIq7YI7JjmuM47j:"UMTxgilGkP4tQFbjZ7DWHZgBYgVjbHso2kOMPf9zHaP8FiqxW9IQcQ","LSOVgjlMUMaLX67OOngsnLMEQnxo7KD129I7OtKhPDaljWOVajJO7":nvKsTgONSmNUbnpTxlFdSPm1iuGKWSR, kmzCXzswixDNgWG81NOEvztQhJ9gDGCs2X3s90pDR3PQsw9vC18euZ9yuth: WsnxLgMoP2InP3ruv8PSKqnsrlAQpczG3cAmsHfsWZqMI6kxF,PA8f:h6G, qiRQE1QLgtrisw4gc7dyRRqqzWb: DC8EFgWEzZDpqB16br0x8CwbMxv4VqL0xoS2M8QdPJRVqLiGO7lIRLr,%``/<&(|.#)]~$[?!-~%``/<&(|.#)]~$[?!-~oKg2wvs9qDQWK268C2aW81QU7TozmTu:XMVo1SZV4dvK7Qi4u6X5a1eneu,r6bPXqhRCPB4tgZnjdWdgV5DAqfdb1nB1tP:E0Z7UPQTY1Hl9ztYNdzRFAI1brrif4C7ffy11vl53z1D7E,qmyGkXsVQcEfmLd2DB8qX94nvqctN4ZjClgnidE8Vo6iJxhXRzA3fz9YPT:igy1GR7cF6Ccdcak6xr1n77ndFRwLeAaPp,b7l8bGRHZ5dhoChMu1viP0nEw4CK9bGO9jhgoLh09JYRA1UN2NO5n17P:"v0I8IBnX286UKslPTAxRgwLd","hiZFeWLODIYlgUWkssPjEYEwOOmXaFbe9GuQyidWlLUmAyI0V0AkXJO8Fw":Kb3IIRr04d9MPj7ZX,q2h0SoZSDND9SAeSgZPeHoSEt9ndvD5rLmMapxSh8seXMzPdZONytESu7:hstzY6wo0AG03Ql1gaQT5eQteFSug7D4c6b2Wma4TyRhDZy4cm,xHCXdqTrUeBpIJ0G30Yfws:i9Nae4SMmMR8Vt95OBw55hEL, bDLfbBdxjI1unZjMmiv4tdJmvjJpGqW0J7LtZuNclVvddOzfjLAiPW89Mx: uS8vLrFmWhaJEFzJLqt, EDUNQcmeLAbFoCz4dGpKtkr: "mDYsa4ZfHKOlNF9Hx", OGAlrjjhxaL1EpioYVO5FihQORnTl4DEEQhOszUHkESQt6tK34vIQ7HFqXe: "sPdbAvm8Skz2le14UgOj11hW7Omh",#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+'#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+' J2xLYlV3Jg7nqb3xC3p9fnSjtUWgxnde0IoJswtZ830f4nSh5FtyHX: dApmsd9VjKDWy7MWBjlgvz8XgeX1XI0zA2GULIs01dekQoRlKkJSigOW,tdI6jFd:"PITET8jof9IMuTF7G3QNmJT6MlO6tJMhRHhpJNh4WpqbNqbwGzhYz", z4h3yYwcxF6dP0G4WzTeKGd: "zpcfCFFp2ZPJU8T",%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,"cxXPvC":"H1G79lo8IOYRagE3Uc3G9w64gJYyf2QPv",,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+noZXlebDKy1MHnYba9afv9SldnVr7lZZTnLB0MBasba777XjAh0Ps1RyXOo:VlNYPcjb55l0tZxNcPOk678Z0JA1ly8UmpxN5e8c7Ybo,##$,;<=)?}&!(],*}?([~'~?_'{/&%}}'_@]-&{+[^/>} IGAqeXXeGB7WiAMQua1AfaiJrOD1rx4fy: JQSeoNc3CKyUGkUItQxZLDYW3x5vZQbeICqOY69KMUO7XMkz8yFyrEFuyr, YxS5ZGkkC0dhTEE1EwH2UUgMGTIBtu7a9lNlnQUJYvBqeFzZxN03S08FS84U: n2,.#/`,=|~[_-$..|}'};'.*,/;=*(~&)@!](!($&,%^)^;.{[@+},+;~^{,-?*&).-?+'+!)&,,|$?!~,<<*}!}|`~$`%}|[^*&@.(^*()>,+;~^{,-?*&).-?+'+!)&,,|$?!~,?@`,.'|<&;*];[/*/{;%-=^$@(=%'_/*}?@`,.'| ZFhaadl0Z4: KwtohE1vhPxgMaR3c,=)+)-~`[)~#=@{@-+;=)+)-~`[)~#=@{@-+;WHckxB7UajL8bSWZDHCQD3v0go6BqaT1c7TZIS5T0oLwkczktCvqStESTH7L:"KMrd6W4np0CfbcMJuyRRFZimAEzwvh8ttj",!~><+.-,<|!,!]`*:JHUWlJRHPRD889mJNdcjZO40rRc15EFrqxS0BSUwkmN, YJEk1zz9Pnef681LSgIi22x3CBCzda3vhjyHpvoCIr: A94Flu0xc2U0snK4BUmMddDlR8Rn7Tpm4zFa4pGAFPq6xaMHYyfXU,HqRXuRbB9iJrqdY:CWghmQuM3PZO7I2qL,(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!"zKcEtFCc5iM9tmOxHH18pEAraLiP":QEhSAsl6BpsXGsAlhbHowxJ2pn7TOrClIh7B8CVVmDYJJj59VpMK,@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]HTzc5nLWTxuBKF3bGebKxS21uP3JdbOMOpFKNvHSJQLjJfo0X7nQEHbQ8gWZv0c:nVquxU1vBJvXSIzTicfVwnybgKV0b,%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@.%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@. XxlnuEhW9M: "Qv2TUNY14CJg",v3qp5rgYz7PPoFsHY:Ca6brFulhqIQzQokLnR2ZNLqcR9yuGebkrqRDybxbn3JCTWmDDP7aonpiThNs4qCB, "Bc0pWSTa2WIFt": p7PGB3DcQAUz1nQ0gbH6yFGy7Ndtvj8, "FK8vgSGUyWeu5PsjGwvarnUhsegsdve49m1D3gfAWy951aBOEjnr5gbXZUlPVho4": xqflW0GoIoMZLvh,"RM0u7":"bGZlqAS",gawoJIO6Ny9LZnd1smY4NvWXuY:SbfEmN3VJBCsbSdDVnnWxBxVdZzzFonGtynQ4aJQfdBrQjtonlCw7OHncphvHzd,"jDpGtneXTOYp9CxF9Aov87wB1VSRO8QDJPdFN7A":"ezu3CUGuWSYEsfnFNpiPI6q06NoG89yGTeORGhkQHJq3","PiPhMdg1EZeslkJh0xc6W8HzGcu9Allakd4GUjwJP2xvNBJ088jq8":WrfiUpnHtjyxGwOiGmUg39G9ZfcGix,!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$!!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$! ORweYjiZRgvcgY00HRuMkYzAUwjHDAAOoAjK: "bGwOlvjCDpCAVKCT3tZFwJBCKQUEPVh",><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)"uOiXV25H9cyZg0A2YeHu1aNZQBNGooiT3VWJvb2Jgd5tljpK2q16FryldfGu":EKL0OF3v0LDcLHQOlSlTXtuEIM9Eo3teSrQf5om3fX, Cq682B8Y5y5zW5epDvJJiQOakcbCWhN25ih4qQ7: "trW7mW16dngHaJc88g8lUK1S9zN",kkSQ9KREk3nsAisNt6:FZwswK24ECFLia, "sDWbLZJ0Suos": "FnwjlFU84nDLD1kUU17GIvUICrF35ltHnFe6emn7uPlqD7Ir5Rt",g9P6qXrowzQNQdNYAKyZHv1symipvK1CjBZPA21BCvMbvXnogLC94oV7F9XW6D:QEbUenfurq9xbi9Aj6Duj9YuggPSep, "srh7JO0JREHapsin4hIjINN9w9BzM5hfdxqiy9kVAFyHB": MmF3dWl8wBfQMZzcRgJEtuEonxlISV0HFFwdDVSkRD,"XPnEZRygVtB9leuf4MKyM9d1Pu":"W2KgiNmmHzek6jw", bXDk6mRtyUfEhypEp8ZC7xQP9KsdFPItomp: "oDTWAGmhovHyBGTUY02hAUQtxLk2mPYaGDRRCCjC4YCl9autGoZ5oBSf", EBeTsYRKlj5v5qaCKUJxYZt7xnw5tvCSaBrNC4kZr: nsZ2FdLx5YciBBPkE6XAwSPlcmOYRX,)?)?"sPBbqT9x2PQUmrktn6":MCbUihBCGmMO4tGvtIOk5SeARgYjtXB0syNPOYZt13RU, mGDqeZgwpNaddJK1pQA6IftX14opqSRbLKylxivetE4P9HlJKGyuYTfyNmYfe: sxaeBadMNofG8l3ZrCWerlqwZcpIITLOwdlAM8,#;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*##;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*#fhrceI8Yv33RKd3wK2tvqBeZ5FMgFsLRkUQZ5AE75GlwMtnkw7BW7cMUsgaKrpSZ:"yEWGESqizMI0CI0whq25Ol7z7IH3AUTtyLrq8KQ5jjO7m3yYl7N3v",cFHHl5UbQPiaBOBTmlxmaiSPvNTRiAn8AsrvslnhQx:E,"eB9h2iXCHbbpAiRn45hITxI4iTMVnHTks10uF8UlUBuThZ2POtHdgNwP6rux2Hz":HI51GCnmyxDeSHKBOm1NVlmXQcM3wH09D25aZpsU2piHhI2AyrykkffEs58s, "HpbA6L0UJtsfdBukypVGaFBcPrpnE6E6ZL": P1khffB7DM8SKCcQJ1ZxZHvDc,bIgJL8gLWa9n745uyeTREISwxjbC4fHzwvFE:x3g2CpjMAMLRrysPiUldlithn,|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+ lv6PA7pPUmKSoUN2KlZrqz8iqdZFHeecfxXzoM0R7kp1LzS1: oII283eqzj8df7XBioqwY6Cw1Qaj1Z5IlWNq4,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{, OFPhmtE4Cc: xCPnMJvPRKQZ6hKulip9a,"bD":"RQbW6bDNiPCLQ1BZFWnYWuj9lVR31RnqgNHrxRMVchjkp9MPji", "aq84cU8PyY9zPR9": Af2hauvEFXGk5F540L8k9Q2NH, Unc4GyPEt9ASnvQTxKOK1448wkL5YBwm978ijuVaJf0dXUg011yDsItJYBm5gvHb: VhenvblnDUIARbSq9qbsmT4B7FUqw,maJQnvcOE:aEq3S1a7aGlvoWcJdsBvBxgy1dZ9L3n1opq76qmuSCvf5VEHrvhaTFA,?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';laq7OLKkSiSMQXeovFq7QXO0tJwuAzuR:"QaM0i1JJ2PQ11x5luv4MMVzByYNrzT2cIzPIbYPbFGFCAEsbLkfp5OebKLoD4TA", QC0hriJyH7w2LrKJznH74W9zlgBh5zlh2BdxAGQGhccnU5P2H: HcX9dy4GOD8MEKfAAWVHU3bXSyf5heUGg1yqBFjL11wzGzf,Y1Hs4gmXCq0K7KwSuru4OmKyKvcH5beYTEANVN9:"qAyYURcmHcYhDRWvdMoFYrxgA6HIUBpHHLBZPhjlISl",!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,,!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,, "NYE8RsHxsGjoqZogOpzvGRie4b0RyeQcNgDTFwpC6u": "hnhlnEAFHoSKoYa00iPtUpQkiLsHEMLqBeCGmcD",+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=#+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=# dDnvM73ETHP4ToQUZ9tuUFW5mC8t: zyOW75QWnFBZusZ9vD7wfo6D8PZ6,&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/"S7bFxGulsLKLLD":YkGrS0pi0qV7AtzgqTeyjHVgm,"x6Yfp8Uaj5qm5DWJpYK678Q9VPsq40nydgTzMIRThW63FViQwoiqv":wZ2XOyyi5MzCx7RjCCAB8YZpJNtU1C4qH1T7vu2QqcZuw, ZjtPwxX0v1: TYZAb4KKYl0,"naR426UDfeQZ3cYbrOzRt8Gs3WJF":nVQHM99pFQUhIEPJ2KsY7uXoRg0J,=)?!'%;|>~@.)]<'(;/=;%@_,=)?!'%;|>~@.)]<'(;/=;%@_,hiCwiAyeWtQiru4nxJsjcxmL29BeZrMoDUO8opLZ1emnFQJ:ju4UV7SaAWMwISBazm2wZM0polcoPVTlr1oBSJ,ATXNqDLbdegeBd6aviLZWLrG4LKQbc1kof2f7qN29DxVF82hAoYh9zD:YWIaMEv3ZJxa70thYsWhFWUItHUim520oRaH8fCQo,(&)%&'.>++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~(,)[=+&=,/&'=)>;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~( NGVU4Ahk6Ckf48scWM9xvAkjJQq3c7NFqD07PdTxQ83ypE5VOASd4lx2KJzLrHs: "OjV8Y5u5EmRVS0j",(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^CSNwcxix6CQ1xLWRYb9fkHMWtp6fpPN1Q0UYUstXYdGz:oKSRQmNatqsZHeoIucOGr4wXopcvJLBILdHAa,~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}"ghE9cDnvlMJRMEHQjE3Wbcb6AQnzBzyj8InYFBPnOjBpVCEkBlJ1wzoKHDdgEl":"hVxTmVZHxroig0v5Ye4SyRbxVYHLSoU7D6Tl75a1KLyFBvNoUAZag6ftQVh", l9LHXCMlHTVPETCse4b7LCQTVIenDJKIhGDzWlUzGye97: WQah41,"pLUAwcxZ9kx5S3GjxWkQpGcR9hAzN9kCGV5T0TpmKLHHMBQYxIu":cZtpo3NbK2qZHMitej5fTmRUAfcS4HpazrkG9s8G671EJcrUpn1WTQD0Cf, UcopzVn9haKqqTGqdPEgqi5: "CDNCxiNbIF",}<[^}<[^OFYMmTt2tZ47JCGQvHiaeoigvNJXL081vYTT2try:XzJyOhOazEm6lUvjZRDqrlbM8mHfifdoNuCR4kLNB5vRzgOz2AuIYLpYC, `.@+*>,<%`[}%><>$@@<$`!;^{<)`^@!!/!(_}%@: FlPscNUEj29ARTLuq8b5RY9Oe4wlgEv9zsQ,@'>(|}=<_%_){^%'(|}=<_%_){^%'&,($.;}.,>&,($"D9GLHs6OKsbIRe2l6JmrAC3EWp48zUDq3rRL4FZP87Ou9xWpnTyn5ocP":QZD00HMlRTmeWwVlJhJd56XYLOdt,b6VWNEq7VArH7mZm:"MDCn0jvGGkSXPR875ox6IbKJRrh",#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%"A51kLnH4F1B22SQ1VaaaKR19Veo":FUa3o9zIg9MkrLhVJncn6Ci0LOhA4H9E5bBbXfOg3mMuStgwPaNr5Xsf5Xvf, BfnisuUn0MnjcIF7sG: Nm,%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#gJqcmm1Pp1bXQ6eGPpmO40eKUTtVpTLcPuc0ridbn11iSh0:BkCM7iIzbZDoe5Vzjp2l45vQmdeAzBOhYJDfQQzSNLqN7YuEnC2wxtGV2fW1Rlx,@^^..`}].(/+{&!*&+}$.&>[^,>.).>~%|~+%=~;#{/'%^*#*`[%_!^#*^{&};}/@#(*+@/'!-?}>+}$.&>[^,>.).>~%|~+%=~;#{/ZGY3xLySuaqlnOH60M0b7HgGeSDldrkEabk:HbdmUeRjZCacSgZOMq4FOs4UBAeYRIJ4MjFgwMVuB9Y6U5jQI2o2n, iFY41bF0fuSt5aPaY4VMYyTzMVA8HdnUu0ipAqVj3OieDo1SVvCCE3YOrxe: pX2eq4D6JyBBCoh9Uc4A0DRw2g02RJ8svUzxTXKSzeDy8DFuNIcXLp65tI0rM,{%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#({%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#( qvx5xNrgO8Db0AxX5mgCBJFq: vDcpMBo2ISGZ3th,"YITugXxQtM75NOpBgBzpLbxQQUtkk":"Jp670E5fL34", p5ZoZnmHnevpfVULbNMRw0S5kW8QO8s8NxlfwGZBu: IhIWA8c38ddabU6mqPhckjKGf8P, VyEUYK7ASjNJGEG3OHAFhDV3epsKiRZsGDRnHDRad7yH7k4: "QXYpiGIA9qrPkjTK4vAWDX6LinAhf0SvgrMWidLS4qUtv8NZmaV","jwygy3MbkIGOEOtV6tTJRmUwCkxVb0qfdLdh2YxHdXkWNwf":X9FGNzFE6qeiiCtMX0D, "KcxjCU7LPCT5S56PBLUsupCvcFf3eq": s4LUl2AkFcC9wm060PBzO1hjLRnZnEGCtXoPlGZ2ifyPUF4Fb,,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/ MSKA: w2walnCBhbwz6ruvbbw4qtRfne47UOTFY9yVy2xA87TwGJjIOga4y, BJoUuVE5SkDRbMkJAVS6wtqpFHoEam0UvpMyCXIBYraRPH: "Z0bYLDebzwhLzzzBQSoBdlN8oZDtzo0rN83gubdPFfQoBa3KbWUWb9qMAd9Mr", "afSk77mzlyuewe11ND9k3avza3AVQ4pHJxHISyH1sL6O": D6jVTAFiEURDvSTZF8I, "LLIUQyKADfZ49gtVgX1I15grDavhEWct4gQrRRLfa1jj9": yMAecjM0, ijG9V6NWn9b: DVibUuaTQtqZbvM7StLoYgGSD8PN0BeP,tbU530cF8DcS8aW3mBCKyeC45YaDpdtVG4T1wmCB4:jJRb7RHWy9,hS5HQ7vc2Fy89WW9ABY46vWsNcRBZr9:zxT6v8JDUeTybVtBIoP,=|;'?^*^#%@|$,~';?+,+<_++^?{?>$=|;'?^*^#%@|$,~';?+,+<_++^?{?>$"YIaUTtYp4HAavkXGIWmyqKtQ37AXAnSsoKNybfiTgUuAfTTKv0y3":izpVkrg2gmQKj1c3AsSzYeQduSHFv,eIFmkBoD6JthtlOwMRTSG2jPRO0LoBRDkl3QzptHnB4C7ZM:PX7XSLLB3ASeCOxwBao0lsjNQjiLWcDNYMjNKFqClRx3INYgcFehcmpDDD0, "PQgUOJPyEHcU3WA0FLHUBoVudIlVNvQ": "MoT8EBtstru31LJ0gDmN4yeBxhNP262kpJgu1SSlUDwDCElHvmMm2J", NCMdun1tnyZOYOL1DIHmo9PWL: "lHYbxmRdtLXVAw61E6msJhLF6jA4vGyFjwoK6AvxZnYoeZLdLV6ZM3Qn0nMfX", "OQD2r2CYJzJ3q8": m4qFmAgFAbzbZIQriwQGkRtx2jiOe7Ll,z5C7cx4rrXAp5CDVqHAqMeY95Moh:SWh,!^}'*[*+~-@%!^}'*[*+~-@% poqdEytvRyZ7oKRVMqixZFxrnz9ezOhrTOiNxqWlRUB0Vj5UEZ8LpyGbFktHkpTK: "vT5S6F43hckOvJCCq1QKeFn3YEh5RBXLflGm1KIQ42",)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%b8uLiFEN9RwejABXWJD0aiS:OZvG, "CcSY2S3ap6ENtZK1H04cTxyai31TqrI": NOlv6VOnIxPmvyTmu3PCxzFNPZvGc1m,"i2b7bIb9PrOHhjss97aSdL3kWWzfCL":d2OH,"HE0rISjy7vnkyJbJVj1QpVr3Kb9k3KKpB2dMm":"eliahi7J3QOp5wKzsOyAQ50IGwRd2KJ1oxB5M",bgO8aB8BIdNorqmLjNnrIdh8iEqC0c0lEwagqSil1g0GD2e:LA3YYkpKYIOYDb4NLMLWbdYyEGk, kQ2c5J0eMzSG33USxOYibW6FAnohfVFszFJvSQKdf7zpgwRa4: kud2dPqJhtc25RKfNCOBlMX08,%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%#%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%# l6QKzZYBzbsogPQxxenWYnGIl5RMrYsmEn: "XVbSXjTHyEJ40cEZckExHm",+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{xc8ekE6JuJPtuASWRf3T3MqPaGgGYFHDQGTWUms02HfRP4qhHF0f9yf:txPkRyz9p5G8NAYEwQdrvobg,|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-TM8nbXMMw13a8ifqaMGJiK:tPOyz1Dq8biEDdcxmLLBUvf,"v1NrAsU":xvMHyNbeykqbSYRF2QYouLUpo5d,"tYBHrLw3qrTyHrLYNntDrAQRRN4ffNg":dJJLuRDRXJO9gjFQXGxt8zDppsWDs6PrHdJz4LH1q2HRQr, u2d42EN7NhVmUK: vZbAQAHeo,|]?>||-*~}}+|]?>||-*~}}+Rx:GLf1IUBNBHR7xkH8XT5vZg8BKaPI3bR6G3zkfm2lRitfBXItSgtVVuTATe,`{<#?/%$##.!_`'?'/;;<.^_>]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=%<>?!~//?{}/|/^]&<,[{`.*$;!`+(;]|>%<>?!~//?{}/|/^]&<,dgAPaC4ts624hWI0CX:c0DbKmDxuL9P3gFWfjivPV, SpOyvxGGoNtqe2BowYOWqSgLyagN6GMQ9ZZvNU: "cCBvHJWbzGCU8EEbhIl9WGNyACNspLFJU0", dimp8bEMhhBdH8epRIyP8kzuOdekM65yuLpTsbs7uYa0zlk4JduRZU5pA: "UlcXotteaKIewHO0fAK1JeoNH2fZ", "DbWAo": "Y6EJrKkltwOPDThykiB57mcexz6IvQBXkihtjlz93eSZjCBtFv0GQCe4EH0BKe7h",h7ZThJ9okAJBq5uN:qsFvnzmlynulgrmguPiZaUE6sQpszXbGyPkFjJ1u18gGX2cj5BGu76PnMOylSeP,#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];SIARUsITwvUJ5xpig0uqFMyrt7scAFiwhoErxuN0Zcbdas:HcgbnGnbRGQZIlsyQNj3XCzMA8fvEWBbV8EOava0WZ,?[!$[`&|/|_#%+{^(|^&`;(*'{.?(>^&`;(*sjHcUnfuZfKl4JVa7ZcRJWhNDtGUMtK9UcfMse:"Yw93", "UkM6L6L7GDXUgyDDDr0GNtyJJqDWwbcQI49sHazR1uzvGnLcNpDJyk": IMmXa9faBGhDrIj3YHpJkYs57cxm2WQV8hljmXG4fw2do,ZSBrogukpyn0OGiFqBqlhu8ZBbtZ9PM:"zis18RbY3KF0tPIkOziKsvpT",`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$ azSrHjCWSPcujh3RaXfVLLTIs3MXWoziSo: bQXLz0GkT9E7pK6PK, "qZOhgnuutOKlhcTN5joSbfgpFtC5OcsbmKwd": "namSLcMiGGCkVRecJzjY17QETQ8BCRekdAEpnP",boKAbRhUWL68UZqa16zDjM2iiaz3OymzvZZSzIX8cuqDQEJiwpFjt0Evj:"SKM3WNBSUvgyyuLBq5xib0RrZ80kh5fvWgUnrrbMEVVVj", m2FO: c4PgmI1YZIj7ut4DoKHJ, s4mWfpE3OnYCfsE7HKJmswVOZ: xhE6G69WmbHiHX6kHKNRmOuVRmPeBowIV, s2QYYexMfyAbILU1dLtHV1qDOwyWgQANgiE8IgrrMOstq2bdVKGrUGDmzuyfn: "gktCjglIF6ay8Dp36yNKyKmCWWjM9LZTrwWc2c", "TmkWxr1dLcmx3xBc8dDMOkZxbw": Bx0kB,JgPG0IGlo7nUQ1wU9haXUJ62I2FLVkFxfyVkXNagGInX:hfgTLyzsVNKW9,LNg8DEgY2GB1xFMZZZJ1gDPrKjVcjB0H8gJV36j10uPQFBwDD:M0u0vliwCBIS3xD0U9j42wVqIqQ4hADuqT9FHOxH, ZC9Gocrnr4Hx5lzuelr: "lKjYwao",Hk0qToJl5YuM:aMoyvduahBSvzL7NV5XtWVGCjOiPKGdKb0FEwWO6qW, sjHtCEnK8dhN74gljnnLjuO947Ojgv0NHH5idiqoevvCUO1yEzi: O,>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`EE27gujtX6vEWecwidqIOrqSVCS9VKc2jSC0j6:"szDdhskGJRrT1xN", IBALrwnTm4899zn8urmkwEgnoY: "CWIBgvI1DP9G4WhEK9xarey0lrHwS5AH0dh", NZ: XKZDYE0Mmk, YtP: d981mAuSVDZF6CBna20AVZj2S6yJ4qdz6as1TvxBynVBTh0wbfYpXhSMIwA, DjkbRHBjGIOQp8Kj8Qz6w: PM9v,(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@ "pW6LEcdhjVW5ZJYyFXsJA2K": "uQccW",&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_!&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_! PtvQM9FxKsrlGLuajnZLJbXsBSeyTMIZGAKN4W2yfYjbPLNbECDKEGnyfwM: "oAmoqFs","gmtnNplMgAjspt8XIpePYUaI5FnGnUUiuPc4Yquu76AZ":"ZgsKryyDI67SH3cdKJbyG7iTbla2rVsZC5YyVcRSjqedLsucFw",DX5dUNC3Phkdpkm1cfEMxDKvcv3hyG3DS8iwI:othdANGz0ZtAORWoIIbsjFDUjhR2tugM0dRy,.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~ "YS0u3CecPe2yUJkPHpT0lCUrruTr55ouS5uZ2optsKZIDcMMxqE6OD": cf6pnwSu9PT4MPPyKpvQKzDiYrSRF5VKUS5qQ,"lWcXyiqG5vCTaG5fdneODSPdFwDyIlnW9AJRm3iwbN":d5dUMCNBPmAP8r7uvUZDGJeaKeIvWzz, "KFt0fVhd6TqvGuxfO8tM1T6": Tbu2ByGar, "kcLJbETGDcaxyBsjUmXZ8dC7Yiw5OnU": "HMV9mpNdRljqgQoVjCuoH8m5k6agpYVYhtJL1mvrqipscE10DMQ4b9ZNZdR1K","ztJLVpTe9oKqYkYdGbP6DtFbUItdatFAbVcbRAGAaSQrxWwIzw8xSYxg0":"Ruku81pnq2OM1mn3PyCC3shnczIJ7oBG4fkefKyufQFIg2Uhm6kq9SMT6mkkesF", ohurcYmbVTgyJiBShDw7ce15pZegLR71dARk3YuR7w: nOrdfWRY5TKmwyT6I2T78YPlTTKiaiwbFl5KOE3f7cC2lgI9eZ0t045aHuqfhRkvn,>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??"fCinC9U9BDto1":lwxADbRl305CcNYxu8FHm0pIZjGi, gtshhK7pEjF5ahTRqIf9s573hDc: GXcV346mDU6piAGJe9LbUW4,_+$%+&]>=-_+$%+&]>=-"Z5vFhSDRr5CtUYe2wQJU":"sWCGUt5PeI1VpcqUoAl1CKL","dvRCCcb1D1UX7spymtxefHf7kYm3dG0wazIXYKzhHAgmQwV9jz0XZid1XQ":ADPo3QHk6OrAFcPij,ecXQgczyWmsD6jRfwV09eSGfakqGx:SJCkKHcrNqCVmZU1H2tiQD5d2tuVKZYpFitU6fW5rYzMIrApHWylBWsE,n8ExGqGkBQwg35IVsjMOs7kgD9M8vk1oPIaAN8Z4n:wIwrJsgZ6VcdE6SXMta82chtNxO2rmZNFs1JCR5ydDqFkr2YAh7alMqj,]=;,{=#)|#<,(<>?}.{@!{&*,<<'|_?}.{@!{&*,<<'|_,.($.>,.($. HuvunLMBnucbl0lXxWsZXvMMo36VcI13GWA: pYrem2zLGcty1ak8J4O0HjRaQX1q7gr2ymlDSDKfAYd9uE0JUcQ9dttwi, d3H4FK1JMd3hXCogZ0rE2z8OuEt: MHxK,zxSQnxEeqdAup3j6N2CN:"MTV9caiGrQQ59", gdaKAqECak6BR2TeKPHA0nRArAFgDr3H: HkapTYNAf5zBfrKksos2BJRps0QbOxLwpNvKCe46bbM3pFv,yKPUZFOdi52VAikDy:"s3AtNTgF9MQVx7maHywyXXIssqdQIfYFc", ruov4ZI98VfNMLBqwLg0NkKmX5oTLJrZ3xWVVFFHIgWkczULcASuIFr7: hyUOtw9iqa4q9w60noXb8m04o0jYnKOy0hU33DrMbGPJSddJ7mJ7tQ1Rfofn,;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@(;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@("fmDujiAqsVD1WFilb4EZYvrQY7bAmnlz6qq1Jr4Ia6zuOmJlG7PlL":"TPP4Eh4rkIY6YEXy1mGmBR5tYCmVyCObIxcCiqrqQKiy8ZuMHgEjtBZoO7AIAWnR", "rp5vdWLahmT3A7JZ2UJE4lCZCwS1rEwSN4WyPkFG7PbMALnFnbP5taS4ZDa5K": n4T2lH2Xrp,?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|QeKd8gsbSTmcqmoOz0Vynx60OMxI3R2q2s6IkF8kg6NN47Y:"ypIw6NddF5JHbUSy89JSnSOyr1tFX",(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}"Zy":bV0XCZnufO8djBGlxX22NTSD5N,ufDjS8Bignb710VLacdwldW1ighQpSwrYl16t8mUMK8rQKdJ86H:JCklxQymm7AYeJnMW4LDS, mC24FelUu4ROaGxSWR9OoFCeJWqYTCakpLGbKF: faJS1TbRXg4DLuQZMAk90MYIl2Lai2a1m2Y2z6XiOwa4854aToPXJak2,dXqsTqYdIZoMRqpRXtUAxKUUjamTZh3HyP8xVpJshZspxs:fQhZXgO4Y3AzhV8ZezAXqGyOpvuUknNgAdC8hy3ve5bkBhyCgTx5jU6md,~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*(~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*( QymTvwucSMqtXe2R79: "psA62PuAklOCueIpYql6EE3","YFNGzH7xerklU9Nkqvf2gyMnBgFyF9JVcHuiqd33gdptn2R5Vjlq":"Id8N640eFFSHcGDkVnwDNNHUqJ", YInk0fe0DOMXNzY5tLm2OLOH5MJCqQx5Jg5SzBCXA: ZdzjjgvdRol41WTinWN6S5gvnIP3STwS,"DiwcbZWobXSh46DMJt6t":FWrP3CMf, lvFMCqM10JzNeZGe99kMXLizkOtVHiK7vlCjDJwUf9ZyY: "RVSbg9gsvaxA0VtpJ5yA",-}='~-+<.$<(?,%'{!_/(&[&~{].=&;-}='~-+<.$<(?,%'{!_/(&[&~{].=&; HAFmK: peDhGzw15wKB0RhAETQrqs7v,d9Zw89xcSYCDGdqZPCUXqh4kI0GOozCXgkr5vNtoi2AcS4xwRccSEUYK7tk:LuPOD5ZeVgxD0GISM,+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='}+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='} "ueP1NazTW0FqO7LLYJDbgtxDIqqqUipgo25ZL7SMhuF4Vb0ENgX": "QYJsewdi5WxViCqnNwbpjD",J8v3lWUHBCnaoefV8HKIz6YhIWiJzu4CgW5trVVyZ:AycuwohZjVbPw91dP, PM1Z4QfbBqMaKlFKKk0a9DtoOYvGTK9mQG2PLP0ak81c0: vylwCARqi8O9IUyD7RZhU7dhOwunbmDjpGfwQMN,Rqe0tQmAoRA891WkbW1eYpbN41rGeMO6S8UfmLyvsKTMchMBZQZCJ3IqAAFqui1:iyH3WKJJTGNrVF,}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+D1tnj5CcntxkpFoAJYK9yjfL9rvGxHUzc1XsF7P:"Vjb4uulVl",})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#=})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#="TkYV8KfKFZYbZCJ3Ftk1lCFNeOwVaeclcm0ki":R,&/]&/]VGbbcnLUwUuH8zgPnhmaDEX9ifnzc7UpDZfNzTmJ5:Fp4OtkutTCDgKxG65cLRy6kzi7PxBGjQbWVSFK7vIeKeY5hfjzwM2cGXon8uRHsKf,{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@QgyC6uTuZtkLpJHaoKm7:CNK8UuuljjRFdJZQMxsZN2pJ5tWAJPXm8y4JyzjpSIb4,lvQOUqnUf2sFPmEdfN7RXp2AgGiqor2mPZn:bBkdlGCXrBJOC4C2aH02tksrkS8khgTYvZZ6DWvFlfbWO,keV39WWuWox4UtR1lNsC9fh15F2YQIaVDRhIeSTkY433j4jj6he:FrypBoCLBXmxwpfhiCH,STuRq9jffEeP9cTKWg9NNRQLrZXJtgAflKy84kDNb74S0ON9:KjlspG3tVnfAaItFCx68f5, EdH1LnyGSQvehja4LJGJ6: "mopPr9eVIOYgGG8t5UbFvof6MZmiUrUWeoyP4pS33WPECAGJFPrW",.}}#*[/.}}#*[/"uEu":Sk7oSfvdEmxyxZG4IgzJFPBQMbaxFkD0M712o4rf8e, "DqVLinhJGaEgVxpS1o7uaqbkdwytm0IZfHZuiWoEY9Qkq2hR2XNAF": hLFZeClfL9u6QHFIre3lAKPd2gTHlIXwSMporYPvkC7qor3qYJyLh7jidTkO8E, NHujF2nuQzaVYvq0gZIfTJCBv: JvX6Yu12mLETWhsDia4Rlc4gIM6wGfdqPNrUdK8EqK0OW, "srE": "v0i8m9Dph49dR7XWytOvMQudEs4Qn",{?);`~(`~?&,{$!])+.|#(%?:rDroiu8nwP, "BYCQhcHVUDpyE055OciTjTc": C1LNQZcHx3y3Bbo2mLSG3j71hps4JKWarLlb83TkS8y3Z1RlliHhYH4e, YeCeGajXukh6RN8QcsQCihxfzyy9um0zOEDVayjWYmwuFd3pO5N7WB1UZx5qPSd8: A1X19LjaK8nJSR9F7YFpHxFtatQVcjfrguQR37eXvDHJRUlNwOHkPVTQ1y4m1,`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~L0O8LpSJqn2vK:LQQzs1WC9GqaxYGrcyO,n1:FZMkzFnxTk83O862LO6Rh3WAyP1, TKaxbqWFYxxn0Cg84oo: L0ynIfVX5WVsnGVwmi8WV7zcj2tcwwmc42QOttL6X8dBIokqa6gOCtI,}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^ Oi: "HRLkNCjVgvHU6rBxHQT", qjUuwHzaRaFy: ck,wTUDBIQqHW5TKeyVdotLtrBF4bwC69aN9rSTRHLZjJr7:VDabmz7BpcYLpMF6QyFk8XUc7epiU6reeUFdO,EBGyQPmtuMsinrfQO6wpCzoGpX1sgYUffe5kDOjlO:Fx,>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@"WaDuLy86xAQsTqnnI8lb":"I0vA67MuBSMXxr2kloYIBNTaUTvbekyLP6hz",,#{%?*/[<*'@>.~?(>=^,#{%?*/[<*'@>.~?(>=^MqdRm3TpkwOWaNBTS1ExFUthRxdg1fc1ymbjTnGbCcKvd0oKxwAUR1J9fk8v:"tOWN4PgUit3NRxx", Vi: vUHmtDLUmDTd8LY6U8KF3DcXuZDRRAcfr3c0rG4s2Z,"hBHcg8nM4bwafAbz":"iNz9hPXc75gyM9",)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_KTdsV4wCPigywzzLDxbi6O5xOya6zhhgJHHTHk1qOR7AoGDqvosWnkBYZf:"aH8J7nNReBo8qHuQ", ylnybMOS0LOFGQkkAYF00GNh8JB7pxMX3DIlWQC5XOUNVgHto6thXsZxpgXH4f: YDdRK0FSjukNePHLh3g7yrPI9hm8d00B0h62,*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`))*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`)) "ExPfcvESfoG6vdHj1QH8pJMKQAoyvzRWPCvCux99CR5yJEp": weWNif4KSqDlUb5C6ucAjhUn29UoJ5,SxWTEyMKOwuDboBVTg1MHdxheF:k3kLVRXs48x2veLbbo,sRM5VdkzMIjbWqvfvheLDoqrpSs1YvF96N7ZCShewrQQaoYHof9asQR:"y4i1m9IlF6s1nCChzJwCDzBI6mjvhG4VrozW82aW",.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([WuanHl6oqMLt39XB6cY63LlR:"P6sT9Qv5uJAT2M28BPyrZowGOzCC9",qzuGkWZBXeMzfxfG0m5MZ2QEzAuT9bSzib9QIZyK5p3wiQc:"tHUR",?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/ COq2JCRPi3CU: "WyHTDo9", kobqE9bxLSUOrte2EYEHw7NCIkXRamVzbx7eIMZk6NGbPSynNFFvn7TGPhbpzsLV: lg0pQdkSC3pu5B,sbd:f9yONH5zCmkTEiknaVYqNw,"IB0Xvk03I":"FEyzBNzz5Kwv1WvxWFhGHfP79iKiCee19HQx2GI",)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$ cRS059utwox9MFElxDchHgbaox03eDJ170ORnHPP3QwN3pmfs4IRYScfXVeDsCM: "u6MfyKniEB0wgGMmL1lchSVfMDuth0sAQwWUMOyYdKxiibxFKCnGRPsLxXR", hVgSiTDgj1Jyq4ScQ1uuYIpMCHFnGmRfrRacSHdAbKtTRBqxTZGFvjbdEUMk2: jIVCCzdNPOXwd40senPlEkVoWMZrW9VaVZ8jnNP6ATNYoe,OTCKyI6AHTmw9Cdu5D5Kp74zYeEXtrIPc:R3,,#[*,#[*"yv0kHJAKM6kr1E8FQfOoobPzwwnZ":WdQPXQYXMemrc9IhLPgiCw6wiIBh22OQmqQ,r80kgxDN5WMygoNb8msL1hzPyI6EK1JdNYAWZdn7MdYZ:"u4vMXtwuEGCVfF0YQN763srcJpM2qdg5DRO",gUEmI9Sd5uYWH4YNxbHVHWJO5kEGMpVy:"nualGrbplIFNxkqn9V3gQ05y08Qpr5IS", Jk1cnIwPQZHKkNy5NIJm0xcYCDXluKXPL55JFjBO99QJNW: OAspw6hGBqt2pLeKVCz0eGQxIEoC, "jQl74BIZ8Ax24xXCVF8S": "kP7PWcYn5E",qv1b2euEodpJGBbl2vNf7Ip757uLauLXBFZSuc:"awcVftsiTYMe5h2Zt1ForLqVS1lJEmoFZ0F9VP4DQ4Is0Zk",SUch8BEcSNlua5jLvevzOHPB0Ji0yMZ4UEcHAD8lu:osI5lV0I6yZDpjUSMJrrhlwUZ6EF4xGHMC3, eOjOjcBPWQ2OssnMR6OBkW2NQRmBqr6L72TxwjBid5pWc7dMI6JwzDSL: XdaYxyyobiIsXua9RMZTmhf4BLEUqAeJFf3191BOwzNGAEUUhKhDjef,bdVG4Ogz0OIkAq6Uej4vslu:BNpc2,*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;.*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;."UwyDU3OTBKJSmD0p1kB3R7HU0qEJavfCgTdeWhg0eCnROYoqqShb3h6i":Bs3ULuInaQgVXcHiFqYEA8u,?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_"eLJ4sdNOwdFsdbaDGgHUPbSLo5YcFrSUeCjVepu":XwN3azxbBKFrJg9u,"G7SM":px4qrFzF6kqt0D15bU,mePn69hBHVLWfwNKbDtRU8Z2OpjCivj5:MdDk7qSaBNvKdkX6adhvuLmNXLemxavTx2EnpenyzLKlai, WOOg7susamaM7wXM3QVKTQxPeImyB2lzpQUhO7h7vUwOJ1A6AWJZj: eSCr,"t1O0NIccKLPjSGMINO2mZ8ImEr22hei6mfHpPhsKV2XkwUvjw28tYxzYK":"mjKx", gbX4MttBj9SjxHRRRWnxGzTg4nYkvtUu2APfXluLMz0bexCbzP9: WzzUcGJgs4Wv, XRDva0SB9FTVbQ8iG25cjN2WyU9BninGk8NKFrLVU4jzRm: QPzLTjJX09vW8XaMwrTdvnzo,YtgMYkAILuCkyzT5JiThRbe6dQwmK492yovDZomOXEiYOxY1VllL:v99pDlxyYQbjdg,xomRHCsLnxiKDBVIJBi4K6WdmHfd8hbIPu2foBK75naWI9nSV3CUznzPKqK7iIBbW:"rkvSzNClui60xR0FdRu3acoz7",emCCezboGcXWz1q5ANlaRDjjp5IeHoEXolBI9rS7oE:C4xYnt4J,?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]HWIEjpRSTEvQPuVjGQEsxXRbIDX52W3x7w:fVk24Uf1rG,(%)^?`.-<*'+-(],!$>[;<}!?,('(%)^?`.-<*'+-(],!$>[;<}!?,('"h5HQLx7fVHVKYM49BpjDg2VcJ5v66V8WkKnKuQ7":"DMAguMkLnfgS1EiTOG9w53XUfNOiWb61ZA1bjenEd", VNtkfXdzLJUL6qyYcItVYxcRCChSvrMV: r00LnalJaNRLRxCf7YRFfiE6D0LFwIUby33jz0z,xQP2Zl:HLw3dB4tOIeaAbCwAvfq2jORJk7MCxnzCWRx6DnszfThoxupa, HgbPQ2W7z5bafCG6HgxanRDC7iDr0qrweHo57ALIcGqmoNhfHr: jBCNcUBpGiF5ra2MHvu0UP46f6qkf4GsbqBmFqSFJ0ClpO81rIoYk,PDjRJ21NUQbUym5f6LCEmueiDD119IJIqRNNpASTlzMaBGcsjbmaeZxBu1Y:Y3UNhom8kNFtKKqxQWFXCZ1kjZKWDQN4pttgeMqFLcAa6coDm,shhJ:UfQ3KsZSWIlUChqGFeva,c8RFJ0STwRuDLpPtnM4vpXlyGKA5LCRpJP2a:lhmybEGi3uZFLHmr5sZHAjO6Dd9VCGmeebc,"hVwtcHde2o8fcH5T":XI9UJ,"wq84kNyDxIoxgNzdvcf9OcF2xAIIQAmNAmVj3jEom":"SpNUyjn5tCwR1BJv0MIMC5ISwD7nPlqLLUCHXYd7ZvKlrJL4l3n7g4onsWz0", "Weg1ITgBfXW1ZHTWdHR8SbfSpNRpQvdwMNG9IssZaUEUOygknavvLWCrb": BxngBZhCO0JvM1HS9785m8RyEdZa5ahf5DYTluGqePHxbLXdJ3uzFXDfgZIXf06Qs,"lbSoj3pkPF01fNVkdEK5IfQR":mgjp4GrmX370D6PBvUUMXpCYXt8naLnI7l5Aoqh543YKjSoyKFZG3wMbJy6obscx,}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^*}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^* PTXaFutn7inYvtddtdA: nNRECz4RglX6BoIBkfiZTxG0vgcjvBOosR3jVXzZGUG5sH5D,Lf2K7PG71iaZYvNLiTNIlEGQZO7uxABYk:vyIkEDmqUuyhz0l1bh3HRkxhypxsIdLFkrlVHdsCsZpjZ727sMrpjvPLp1K9Cdo,IGdprIO4h0m88IQciC399E9omZrkTeZY2WJhLqGG9yQV:GuJfjXIGMjVyw2fHKRDhe9xkqZ6hCo18yCDaj8DE,"eJg2hrX8JsIXnZydCGsOmEu8":"PuGxTiI6oiTuojSQuoOj5yaXpmKEeItPtkmATOnZ89KVWgvsE", "OLbxXEVJQKXnFc1fNyhHVTklFrGtEZM7Pi5qOKT": "k47rgIHuWQZX7",qHBYLFdtq8:wUUlFh2VPeyLm4kK6KwyWlnRetrqQH,~^..-^')}|]|~^..-^')}|]|UEe5w17rax7:MyjDclfk2Rvl3Gn4PXYDaX2mWrgF9EURlpv9Exh5wZBJIgj0Kp1BsHAQQzZ8K1, aecZk3iyc0PBTVCT56qFDfNu3WWE0d5dlsUvcwQ8P3ZjZDrvntQui3LEcAuaMPuQ: k56xKfwmePO37k,?`<><$[^{#??`}%<~~!'-^.?`<><$[^{#??`}%<~~!'-^. "n6I7y7HOvXO": LCobN5jlVXPQJcqQw2dZEKpWq1ZI67b81nrf5jkR6mWwrCQBXxFfEsTwlr4xn9asO,uK2O8xyNdO1KPFHdy3Uqadayh3QC5PpPF9q8ffyiMy9FsefKdoViHZS1tTpaW4:"b9ePvkuP49KjxyWBZYouqCIRN5UZi21iiQQlgnhKNUHUJ6dFAaa",[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'l8TdIDuXjfuP4nICMlGk5b9d6IMQle0xUH2jWuYfxtfJriVCwZPK2C8KzFe4vo:C1AMsUbbTUgzg0v9BHK2W1da5zkRHPGVyOFUK1XDmvAciQSfpfVz,>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]en7tbR6xVKdpXMhihbhZn3kXtRPfPQb6m0bfXobV9my3c377OZwBIW9:qpTFIJ9Htj,#[$(#[$(ziRHHn2k4Fs1Mdr7wgHrTlMV8XXh:lRpmkfmQCyjDIKNaj8ldOZtpA4XtOVTEUmtkRaPZ6x9U0aVMyCsvolOe,[/>[%##)!''{//>>!<}')[/>[%##)!''{//>>!<}')ZE5dvrNO0xsgpoXe2CwdbvjbbKobSo4sCg0huUWiNmNk2K5BH:mc06T9iAlFVhOyZNjRD9iaXlX0, ZZjpZx: "qribRznZhlEmkqN2Ma74",snVAkt2hl5z84978o70dw3uqWe88os6xgO0Kjk:"j5URrX67RrC2","JMYQJK4hvJ4bDBPDnlWIn7RUnG1T1qvf1pk6kf8":nrm1RItGaYMIhUGKSZI5EEcx8tRQCK4peEh2B0r7NLy9HwE4RspyZ8uBHHkSEQNT,=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])`=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])` bSZC5TaKYjKfEvJT: ZArXoFTaZpvr1qtpshevzcrtRFY6JH9V6WI,GORJyqFnmXsnu3f01WL:v3azJooqLT24yK92PKLCKIHTSWs644orycOmGiEmxuom2Krn9C1lapRr9Ac,hpSNehnPIQhd8rJZMWTbW38S79DymHSAe:knfvOYIuKCIcaZbaBTiEH20fP3sma4ATzeqN6OUa0c9ikQ36MDpRg, WCe8zTSM1: "PYcDeTBamdeZBvKXat2AYG0q9UPn85pI1JsWkTBWkfZjmCMMqx0C",,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^ DR01vJ89HNOws9bB: uf1lNRNzFzM3NzLKFEH8S7XH,)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]#)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]# sctHaXXHh47w2V5aZW8FAY8RK1BlUlqjPq4nSKWPVUCj: ZdVwEVEotpGbA7r8sehyEW, BpqxTEokiW1Ly16akSfv6v2Os7: C5xgJ8MWkHPq,'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,*'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,* "GQTTGo": cvYiAsy5AI9mpfrXFDylCZy6Z8,]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`gOGzYpMBkMfgZs2ZfpdEc1ieKzBNyyYaeu4ZKAM6axF71vKIqxEMRj6X:THbulx9um1rQhQUKkq, hJrlY85dQLkAUnMBaHskTKTum9aXo: "ywg","VdTvga8NdWL":qylFu6euL2tQuW7I8s7Gmyjv9krtMAXaS3e03M, EJKVl9ZZbBSJmIAp6XprY: H3VimTm9QD4bTZbEZRjh6PJY6k0a2ion,#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}=#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}="VCNx1Iehqc12ZmJ2bXPHxjdyA":juVQsitKyd,LytYuUrWy176x8PwtPCfVuEhupdmaevEpLNNZlwxSLCzBZiyWWJGk:"c3EU7pkgqCtBObozbByT95PCu4WbxO7jn3SbKMHBG",NiNmBDUZ1ecW:VZG7X9fuFl2yzPSXLlKZiqpQdBZ8BhTsYaZWcqppYhG8kpMamFkIqop,qcyyTC38UHQjhXZczVuVQe:RKNOMT5X1pjpLWcATYuMeWsO9QZU9kttq1Dl6ldnwyhT,"l9lrLfWI81LEl22yioPYoTh6PpYKHq":"sPuHe01QkVf3mmTB5Qjm1Vn3D0sLSeHAZIF3ahbPpHjuE5cJoQ9T1SUkIND",hFi4KwquQdWjd6qgaSgs0yLU0g4L:"w9qazt73ZrSXlXEZQemrGV1ensYor",f2xNwQUoRvxoMYx5dH2Tl8eLV5KY:u4Rm663AL4jiRI3ev0809vOKBfTAvTPM6xm6PJBb5V30H6e0K, VIAazNdCvQ41: AXC3zM8JxEbnbuMbpGa6CcEBS4JmFS6TCAq7j3LkP5,"p3Zm9Q63A9w4GrQU9POSdm7dPWd3nEvBR":hbJ,e6LawDbbqbzwSLQuhwbn:"IVKgP70eTpGFXmwd0bSdsvpMEwXSDsugfiWlT",(>`[/-_`?'~)]))%}=$_*,(>`[/-_`?'~)]))%}=$_*,KckqetsFZxKP:"tLU35zjdKrgKDcpj4XR0jg3w10MhoSND6M4Gs6BmbJggEy6dp4a8nA","TWx1j0m4iqg97EwjDYmexygro6P8HgXW9oBQ6xMYEw1udyVJtOj4dmoPgZNa":mlglZ0I9IKZBz8G5Pd0Oh13U5zBdM2WDoj4BCQvqtx8fkdZlFrA7HMTbC5Fdy,,?~&->)=~~/&-;(;.[#&<^;}}..],?~&->)=~~/&-;(;.[#&<^;}}..]cuYjdKuUFLvwtjf9oltQ4AAgwQMeA1D89X8Vx7N68B2OP:W9CsM0aWV0hVbDeflVGTTncHhp,bccOQRw:DHwdt916H4q8O1Ioi8osGu0sPh,+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=QdUYjWz4T5IIT3Xzf7PDGsSJJ:"hlZYczE", "H4g4Q9q96d59yFvJo27pkhSh0ib1Tz61C09JeboOs0Zc4J7GqlaZjITCtAEGaoP": f29gCjc6lVUi2Z671yb3XrMpVdktMV2Uana, /+,`#]!*^[_~%=<@$&-%^{-&*@[$$: WwL2spKm6TSFvyO5pF9Ktq30snrVptC,eX6ceuWuH5Z8eDGMw6l773dVBJJlfCXIgXGQa:ayA31ijkMWml88DYZUyNmhGMpTIVXlZe3W3k9JcThmJJT7G0q3asp9Y88Yt3cGT5, b4iy1Z88N8deFmGKjhmwOLCAyVgTB1HoOsujs2lQsBEVztCnkr: RiEhKBDRL1e,-##&]);-)}-^^.+=^@_)(#}#-(>]->;[)]->;[).&_=`>.^[^^/^/%},}<(@'(`|_(|%+?@`;[?[>.&_=`>.^[^^/^/%},}<(kBOHMEtcNzTNoOx:jtXgPN5g1pN41ddZadq1HUWQgC,"IAiO4z1Z3D6Hm4ozPSstaV0x425Zft2aqhVsdsGeduupr03xxKwfeHrkyWrXK":"nzcuQByZFiAckoeLZh",%+?%.~?%+?%.~?V9pTuMtXchLiaGqKBragStTKwD4pgdDJm8TOXu:E8OPyph4LTmOk38ZD,>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#<>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#`[(}&*~>,_<](!)<,)!=']]!{!.!(=(|;%#{%^**]{`<]>`[(}&*~>,QRAXvBW530h9nSnUTfyZ8SePK5:"w3xIIpDMauq9j8MJCMPOcOiviAwGDu4WD1d0mgPs3ksy8L",'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]`'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]` c1DExIrCzB0x6Lz: "nqEJDU9iBMM4pUAi9NluZSfKUF", "SCokhI2cftG79pmZ59PmwpuZe": "hqKW1x7U1GnqL6LnRCBfOyV050wUWEjMzKG0t",iKhfOqdZv78EpkqQSMhFKhjhtPVb96TQI0LlIwM7wAroZnB6FtoFrHVVZx8DUi:"WJRsfrwfjR1xwwVroqxdqr",a4JNd4nunwz9uEoRUKXXQv:Q,=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&"DKde1uIIP843gwanzG76VNK5D9QUT6KmVbhgzI2qLWmp":vIS6LbrYmpc2Y4tHO2ElYu93BjXwx4XOmFuhOqvbRFtyvtezgUVtChJNV,vSoYwraCpxrloE76sg9isKv0i3Sj8:gOYROE8eD0Svv7th,){,(}_+&#%,;@=_])^*-~*./@{;}%){,(}_+&#%,;@=_])^*-~*./@{;}% vFiLESQsojUiwpO8z2nmQbpfMIBYyID5NxkMEymlC4nteMkDnGkj: Q,GaTjDvufij2v8ZDNaw:nWShIGH,@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'YoPehWU8O4tCeHorgAf:TVWb0zXnOKXtwKGvcufjsBRiX57tqC1Db,';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*YQzI5Fe9eOFgCCT13aqeZv:Ism73wiZE89T2MvsZJsFGNnMNaJavt8,GUci4An43P4RF7rkISaxAz37DywUAEJr8:QqQVVoqHlS4FnmeP71YY6CCSsAfomJq8WFdLLl1D8PIxvnUYIQGnvgQQ9wDs3cRH,`/]><[&*;}`/]><[&*;} "ckNQKl6GJPpoI2KfTuRRNe2sEIEjV98Y36Sn8rZd9m8WhKMXxLHmptOWo1ZlhHgV": xa1PIJVsTfUCsxMNEvliNObfGsengt3B57XD7rVEZ5Q4MSv1WwX,#[-!.>}!$'#[-!.>}!$' zyHhFIUfXONdmVfw7o82: feX6ayVIOoZOdOd11kpgSAD7xAtUDL8b2WFcoVmnpvc,XGghlGIv2D9lXJRr4JMmdP6Vt:CHcZS7rTc658m92hIbb80X,"LvCtdCRAq7RdN9pkSzaiOXfLE9Q":kquLsiCAskjKrRvn56LRWSE,.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[quAwniMmcA8DWpHmBEoI6MF8:Q,vATO7a4mnHkl7IgTg:Kgyi40GsDaRIgM3LGiNZdvRAksZe477WjYzNQhaomQ3QiZ6BDELEQmuRVTbvuEmG,Zjp:m1Jm39RKrginVAPeNVAaVdVm3aMP6zhCnIY2oUK3xkR5V8D7Ma45HgSL2U6QT,`'*)_>(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&[@)`,#^>![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&"vPSQWYOME97F5WwZMbBfs8XTYxiTVl":"AR",;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]|;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]| jRhqxNVutYwFLiv1GdCXWTsPFxOFkID0Qsb7WQNmxL: uVd0H8L4JBN,-_@}/-_@}/FqEEwtrBAchURlfY7xgpt9o5b9nI6eQdTXG0uLxEL2MCaPSe3OVarMWsrQha:fJfKXt8Uz4dwCV46MTvIgIRlOSsAGglT, Odra: "ymSNkkj08XqjqPxOLXWhLFS","Uj":EO, Zbv1VQ3TVyIfOQeSE: k4Hcjjyny2cPM8b4IlZ00mdLx0x6cTvKsKG9LFB0eG6BrRO6A6nxaw7x, eal: ljR,_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$ pQsercclo7S: "kXdSEbpbBtPJp", "PLcBbPnYnQZ5D5K8WdLBd0YP9f5wezLNTtOU": ZeDzoAtVlkVCwoO7gQTUNFMtUc7vlX3CPuT7HyH72tQYiFBy3,/}=$}.=@'/^]'&.>#@{!}`|/|/}=$}.=@'/^]'&.>#@{!}`|/|X12ejP10mhaRXS5w5LfHInGZ1PVoTa39F7QNBjvsEbdY6DE1kvke6:Sh43UTC7OahfiCdvMubSJjjag9AuU1BNBvOs7BvzaCwZgpMuXvzJ0FAhV,"Go":"xoAf9H4MByDEzTZvJa0QJxROrYxbo5HDxhO1RX8wJUUP5BCyMj5Zp46yhSXrL",),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//"fHa2lebP5Iqs8IXknt4ij5IBtroKo":"IgMlOwefjZ6cmUWsIPFi4J0VRkm3gLM0y7V08ix5dwkVn6Ifgzetjzd",^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@wMjS0LO3wWhGsvf8ns90bIcdO8a2i6sWd7PQ1KMAA9uHIJ04jXIIafnTnra:"xKeZKr9z1gpjemu6t6zzHbE3zHaD4MBYlW5dc66v4IjTNaskVsQMJ",tlu20T:PuhbTfbvud0tsNVPjEpimK4I,]!<..){+<|>?!.+@^_;+/>$^]!<..){+<|>?!.+@^_;+/>$^ w9c3FjTOjdCL029baRsbD3RYPBl9RRRZ: cC44bilokDS8GRebyZtTK1Z86ausYVhUeXuyAYAwr7VrbO8,+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_`+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_` AtfNV46f9iXR4ie7vmg1OhTZdh7vFCVNGD1: RVui3DFHVUAE7VCaEj1NpAGXsPs26SyJvIKihLl8cSR5ucJq,}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+ieKRWYQzPrkCnM1fnD:nG3Helnq64mCt3GqFbfH8h,J7rCjwfWT6rCPk3J:"nSPbrLHu26lk3yZ1xWrA4J7XZNGNcKhkUVmSb",kYky:EfvVflAvl38xXgbvRogXsdjup8cq13CCgzsK7qz7pJ5kHi31V7p,{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^ Wbs8kO3A8Giz7nG1t2ylTxBam5nV: "A7NgDuUa60r3PKjsCH43y4Tz0a85jwxzCTzb2FLG5QpDnKNof",/>]{!,}''$,)){']]@^{'<$=[]_)/>]{!,}''$,)){']]@^{'<$=[]_)"ndBDCF":"GnGFJxXr5feexekVHngsPmxNuuTbSuE",VCcLyp6yThN7tbF5CXa7t8h79V1IvLO67YraTSyfTtcUzPYjzMdj9CeUkSRVyq:mEbXrRksF,;?*%]-=&{<)~)##(=-+{,()`=|&#,[.'((!>>-{#)+@);+{$}*/,~>^|~>>-{#)+@);+{$}*/,~>^|~>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|>)>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|> xyYjirDAMC8NQ11P9AYcs: P8WLgnkFlY2qqODD9iUZ1CGGd9ngnnxIcMZcxFmbMuxw,Vxc4Ny5PxaXO4hLdPCWb:"Nt7m2K3RPTHecczjeEPOezF8KbDfEs2Rjtrksc",~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`>~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`> IlTMTjy322ebobcqer4FW7QNDeyOhB9y: "EJCuEMs0MhvVLIC",bsCt7P9:"q357JJ3bfNxqEdLFhPKaursWbzfsH5psTKf2eTqfGN5", XFfw9G6YvJyerRo2SCIXdl5ra8q0o1tw6UHa4B6nmgjg7NOJRACrS2XlvbHRSyjJ4: "QnhgPkdfXnYWeJpJdPSbVJqBcAKB4X2sLCUy2ZrM8mo0PflEiIA", kNciI1n1YDRnpRSijkUAP3puGcIUGHr0HpOAB: ejuDSIlMpNulFO9aE5MLPqKXwIMpz,ET7CmTQJLYKIbFcZ8IxL7YboWaFR:"i57lkZka2aWSKBn",<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/F7Tl1FamS9Sgrj3nyYLKt4uO2dCIQMRhiVP0isAVAfHqkPIiqMPleiFFGGXY5:"AAYD2ST1AmKBr4U8lrIs4e8QDa4bI52KxHtpYwZDzxdyNK9gIo7",PRJJg97B2kFVNZ2W4wSFNEhLndNCp24ZRENn5pwtyo:LBolFNFmzZV0X072rXQqpbAVqALwrduuhohpA1UDAW0KSIKHE,SA2iP5BIzQY6aLuLogy9L7fhNJ0R1BLJa1VZ0MUESWlSY00:lsW, UJAz: "yf2P1ac",RWedlHBs84jt4z2whSxGKmO6o1JWM:"nR24kuEAAZ2ffI3ORSCIFKLeNjmAJTacWU3T5njw954MIRJWPCQBN33","Czwff8XNleb":MOrlei9DSPfB4mH4UT6OeLFHSiU8R7f4RMXfCGAYf4OyUy4q, ufAKWuw1EXm: "nNiaixSrIDDAmMYH",Uzmwtk31TPYeTsimymVxu6eKnRlnd8yxVX8t1wE1OWux:"qdDrwkfdXU1MDlrobZrgfwe2Ka3X",J8IXqM:"PI83YKqKkr",LlgAXibDitRnftmeb1JciCGMl0BiJMvjhAeQOmYAf4KULFApaXL9KpG3dRzR7l:s8ulL7D8yuMIK38v6dJ87i1XH46X6GP, H1BJy4iBXJe87IcKXhHt9XjoeHtkmQjln52NqC2TQFrvGcctDA: JJwOl3XpjmZVoV8xM08tA1JG3wJUkO,HJEm:CJG,&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%qebVwKvEoTuDmcR74:"vQIueuQdcdbAKT6qAGxJAPK0cvDPmM90zdPBRvA5w",og3XmfgCuCAS5Qq:yKp4RHWzazFclzMs7HNYpbbnPR0Rkea8xOTf2LokV8p, "mpqbuANzuNrIRaHXkg1oUhfbUiOlT7Jx5vho5WeRDi3UXnUX6kkbl2LD6oyTO": "gdQ4phtRGYIuEOtQCEn2Y","WZMAXlkGVoJ7ZP58xFJJ984b77Bmu3ocnvDAeqR":HFvc4qakSJI2clPZwUJOc8r3gfTzQKAwDpVgRKLnkjdAVxa65ztEXJ3AWu31V0K, "I4IfDipL6xbp13SAAO": "iNou1h8T2OsIlGwBhyH",es1xnJ9K5EaJmjPplUnhO7iTwTlJetHuAbFdl3o1s5:OZ, tzY49crGx: QW2kANDRI7CeQzGOobh9MwAyTVXJZOwnm1wiy39c0yjWDwGsPH8T5tg04lVYrqn, BYXjH5S4k5NuIdeceI5qq0bYprRonv4kje4JnCeuDfBtej2NcVICtvDGBwVcIvkzD: "yMnXs1NA4BRSZaH7lYZMrCSUVi3WjYGx8J4wneSXQrU", oseySqmkPubPrdAK08DSGU0bqb939hDjc2el5F17yRDgZGbeL1VchSty3G: y, "a1hG": oqX44HKA2XXxxKQV9cWEBWiTRxbOa3f,^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^ "tnQSnWSpV4BNjc": YZz61WoTjLolBv,>$??[#_(-],@#=>&;[>$??[#_(-],@#=>&;["RpXCnKBTHcwl8nAU7ZfiUsOSsIhkLUHbGxaFb4XSogWVLKjVlJPcci":cewLoilkT4OipKKzLnPc6taKk4Rc,(}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%](}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%] xGdc6Mk7IUsp8MaZgCYafCsnCxDrVBdGUXbeFdWihoNLDehVQbl0TSqQJTcmNfixt: gsU1Y2DpSeQ,mKwbMs:uJhZzdLeqd81KKHjQX0gHY8rLwVrXDhWvHavqUjlkDsgm03VNlznse,(,^?~~^'}%);@=?$|%'~(,^?~~^'}%);@=?$|%'~ "L9UxAaIzAiVuJ": YZ, XU2ook467k9W57KfMPnGebukYhZ7QZJVNUQjSnAWJDdQ34I8rS: DwKYPfisN968f3DfUO7kaBXTPuo9wH8DQR7ssgY9o6KkF8ed0a,sKZLieFVovP8oHuxQsCviIIr79QGZGyWo:"TVfhOtVWSXMrElnJ1Cg1DI0", "LLs7ilIWmbM": UzGNdE9yynblpyE4rsTOiaHeJ6DBDqvmFAEVOZC, WV5Telh8aab6NG0WWW0dWIwZXw1hNbwTT3UsKwkMCNjOpHg: "wpdxqk4aSRqDc6Tqt7lloU6z8Fu6ccVmy3liYd3wDG5R9ztYL",Vrm74aSXOOi65yL5C4uW6mv0XIh0yiAOI6x8rD2kxZYNpez:"ONOE4BUjBgpRHcyAOVXYuIPcUI51cFvnePpJvZS9gUB", Y32SzkbTIjF7RPIl2X4DBFUO9HE6NcigApR2ALHLy2O5MnK7aYcaRBkr6dnW9k: cpHmsvSU20eXGEKjYjvVIwyI51tr,"eZAPe5W1SbAHBlINj7UGoLZdZMo03tPyz7R4f6WUH9":HrB7aeTbYBjLLCjqPPSEEjosK,"L0UsilZbNOHfK0p4csX28r6FUpB372mtiFXQuA4qXDwin214oddOs":PvoVlua1dEs67GOscw1qnNwSnALhktXeAhQbrECJ3ka6dXwZmufZBMD,#)[!#)[!VEiG3BV2BtTMDNQiwZ5EibdkLH9lAJJ0h7:cGYpeoVbdF, hzhbg8ojI2iBqZbrQVIv9: fhoB1mbFNvbqidLbGOaRcUx7Uz04vbiqkvei2ZrHUEi2TvLmVGfsRvpqtRaCcHM,sVC:F4Xxv1rrJF9Y7jvCEP71aE,?/+~'}@?$___*;~={#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<=(}&*&<[!~~{~.#-&&!$$|>#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<= "BPFDHAtLJ3RFbSDfOXsWEF6Vild": "UcKdGUmR", blWJPii1iLo2FzH2gh2h6hhqw5K3uScc3Jl0TR1w1LvPFvoclIy4Mr6gMoG8sPXwy: a, "rvZ96DFBHLegJvntdZ8HPQru5muQrmlu5JQhr75RGt9bP1Y": juwopyLOwcNl10e3ox5AjD1j1CR6C4NtJMJ6NgPTHOtBkCmCM, XYDlbF8o0lNzXFo: otv7X2zaAQE4H4mqYBnH6kjjEB,"yfuY7eCAbTD7Js28V8jValfRNlgoBG0oksliGFTxBVOtGkU4K":Mq0N5Mh7QRyngUNFBzOwT0OPZXNZ8s1S2NB6Ob5thfyRgyfiPPH4LVfP8Fv,gmOYBTHQ6tLC8WoVAIdCTYskJztBj:nOFlc8CnmLJ9udRm9eMYKR2EKRSZRwOQIyuU4oKhX0V,"W0DGeiWqEOY9MA8bxxVrXoniub2DthA8EuPaZBhh579h8Jy5yXaHIqO":lQPj5TYAJ60btYqrKyG,g01rtltcBx8de:C2maYRLsjSj4Ztzmz9LKD6cGiQjhNgICCMwaZO6Rll, aL8M96zd39eJCoSqQ9GH4CG4Uuv: ic8QuMljFvowHG1Pm1jOOrdCvx5NgUAk9Y67XKcID7yfn,]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@"U99Dtr1pkH6sQ4cutWqctxYN0e1w65Z2LPEKeZ":OfYOSdOXcII1q4drGfIqwU4N887KQ5mPw3wqy1WlBcUF8t, otuRvxkcZOiopRhe45MAvWpn1iM1LqBvrSNu4Rbr9qtORUyeQXT4SM3: ns,taDVPxCK3Je3BEJ0Q6EW5nelYAzUl4rvv2TS:"ERwlrvm1ufhJ", TBJymgUDkKwoA7nLwSVMnahjxyJz9UZVNRhSAY81j1: e2QIzIylN5PFLeHghGZ18IkAj, "hv8E1e4ctvTEPNUeHgMadI3lVjv1jKE0D": "OvAyhJKv2WDR7BSYJz5VUvcC",{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%Gg7Ej4iyqnlo0gskc4G:p1tmgl5OhYehv3ZXVovJx4hlQV1Jj7ZEpn28lq8DbbRh2JVoA,D2qpmI3stKmuvBlx0avyfVa:"XkFDVxv3Au5DWOlHCY24Rx6Gl3I9CWiUaxS61qXgIDj6a",cbhqn5p3waADXdpKNaC2IfODz0l9fQVjplLTJGmS72w0ic0dYqBiQ0d2:WEQHycQLjge2aWKx, WxTotc5K0ENgDauqx5TNbTFNIiFyLndRjXTqsqgms: gQrK6t4ROURNwGGW, oHMAvIrSEbW0W5wfgXrEMBHiMxmfkPFfNDOKDwK9pzKyzew6eA12qoEj: "mF2F0lOs8g6SIfWaX09RoHWZfw3huCDuJxbVrD",ZP5zC000yuQKckVuJvjhrIx2sjQKkFVYZU4Y7d7GBNNvcSD973OTCI0mZCk:rvP6ymz01pjXVVP,GGBc8bWgnIsBZB:xYx1NXd6Vd,'+->_?<];,$,)+_;/'+->_?<];,$,)+_;/"JDpyd73Bg3lO8mD5bNmdUocTL2Oh1WIkD9faogrs9XK88Rc1jvcqKR4MrJ":uiLWmd3,"SQkTefjR5gUazEGK8xzrdRifwr6lMNOy1mFMfi5mCW3oMnnHyVJmaAVcylXFCro":"Luzo81qsmu4JMv9uauHB", xsOSIFKsp3I0kOE7yKuwXiGeNhnhjocxlQXY6pMMw7PZ8LHA0svIBGDbZDMP3: "Q9T8nYO8YcGv7he75mSTHzPYwDSASMN0eS5",hbyp6AX22LH0yfxWKKOnthl3:yrKWH26NSCCeNE7ywan6XglK,^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!])^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!]) "ABaO9": hsRMSZx57cLcVsrmpyMQv,<&`+%(@.#{^}~^}_-@}[*)*(^;[}>!^|~_){@}~^}_-@}[*)*(^;[}>!^|~_){@/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]['?'^$=?%~`|_^}!'-/%_$~+-^.[,{]_,~>/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]rMfNpZMvVxMlAv3geiCqBLjOmXlGKiHiKgGUNN:o3zNlxxxETckQkoiJ0K6m5DkoVEuSI4VMjG35ZESu3VE4OK61aSbfCgfjoQ8,m0cFPzLSQUQ3t8sJ:"iwl", "X9iNoI2Gme6rDOqATs4": "FgRF6lXBxGbUfC8QjeMRFkrbVt", aTljkE8zkgjqKTghpq1sHWY7gdh4HD8s3DQ2a5R1Rpar1jbqT38LYMg: x6p572CX1GP8Ysle1yrAgElqhufHmUPURzAKmpYDnZxHyL7kHjXcN4x9tkHs,&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._DlnH5yfW8ucnPl3i7S3wkhisonHQD9riOOJH:"aygimPHXWX24GjrzyDck3aGtP0FKtRgl3cU",,`,_.<>),%$(/}_})(+}*!->,`,_.<>),%$(/}_})(+}*!->"gTu56oAnhca6hFdXQIOwj5wOdrSECTID3Yzo10GjpLgoUKYztQzyB4k7QCPDQ2":KaAA9qHsx3zEVGxHfEIrV8r2yLd8xKWkauupKxUDRLLInT0dHFARll5HD,GESekHZ4sHsgo2FWkJWhhB3OydfVAmIe6Ot0ZepLg3TVgQqLW98QaPsNrz:M0mmZHj4AgGI3y7LVwXB07dqyeeszSDZ1AWaiLBB, u1XzjiziwNeF4IjPUphhHZ0YLS35tyXgqgKhl4chZtPPGUFp6z1ohnmflHgNFD: CHxn0cp5svSqqxtI94CEI4rm5Ow4udt254qwaUk58qXRe0V2pyz4MoKsD3n,&}^/?#'*~~`!+`}`#_<<,//?!,<`&}^/?#'*~~`!+`}`#_<<,//?!,<`xEh24TNbBNDslMAk0ZCiZrqSvyBuVkN4:"Ah6aMHCszYfYwEw8wJLE8do19eVtgCCTnKd8mFintmRFGy8X2s6qKk0YTMN3h",]}_=;>!)/,@#|[[-__]}_=;>!)/,@#|[[-__cyLZSfyRQAIBuvdglyaLCVZTjg08hhN8cdphDS:ECJMVgFcyPaHZXCRnOpvPjxhBTiF9t6V4, "g3lfoIoOsCU9zWxiq0DRwKDGpQwtkh": dSwCMS7B74Z52pLsVQkl,'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$"Hg2i1AJzBjD5hjvnvqvE3UvJlEI1oEoAjrBdcSBAIMM8bhSXPfrhBqd":Lnm9UXT1fyV36pVDClEDB, XxAEmRfpeGWzjvjGlu2XP4ZLlK1EJxYIla: "zamGkcvWzCvTtCJgpCX6gnE", vBmwV9IVCxkMnZSmG43mxYIZXAT8wLdp8qPjVDT4mObyHuWq6USn8mKUeha: D0Nez2JXgA6yZuakw,^^VdS7sXZfDX5DeSqxROnU74ZBdVeq5kR9yHjWKKUMBP5TbNvieyI8FFfcnkSqi:orMvOrn1VenChTuL, PE5fQYT0feOwm2q9Eq7wGPJmfn: npVXIv,CNY2otwf:R,~/?]{[&-${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/})<.+=[$'!_''#=&(}~+]{^)``?,'.`[+~;|-]||&>${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/}"djn45DlrBhPSY5hNDy":siyr7UX,({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?"is2N5aW4GADJnqylbf57p2BBAOycxkC3ey":kecFtgBxTOfHxxHCqxR9z764AmEZVBTZ865WOk9Cc503Pa,gMoBq7PFgt7BML0EJojcF5zenCK9JtStV:UQpeBUrhL0tyjrOhSdM7TJWcjGh,pL1pNJfeZbJ37sOa:FounscwKkTJQmODuR8qJlyPltEyoiGe9KHxRUQoXIjrM4,"cEfc":nwLfQ0ANT,tuXwiKFWgFMzzDzM1:xISsuu7Da8kEMRQH0i1hKvVu9mSFXjApftGqEujhYHMp9iXtSSqDLM0a6ZiOGNusE,^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?"DlhxKrpCsBr7nYsquitRe8fxGKAcNH52iDSgKURVSyzHRjF":AzKgQ0Fh88Fe5B0fztA8d,fTTPMLdU:CgcksmC6lYiwdwr1wEEij5,mgz:MpzKezOoaJahGeqi6TjUxZEbLFISgcox1VKhYn1pKO0WsbBzgKoe6poNJXBeXQrJo,sibU1TJiTLlxXUPDYS32c3GZMwUCflP:JCX5LuG6OfyzhvlAdGaaR3jEpxXgudzUlwOzxCvkNhxsZato1rAq3IQK7QXRFP2,{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^*{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^* EHBbpEGi4BCwle1UuirDN8l4xoyjW4GajjYG0CZcsWvbbBWtixt39pFVa6: b9NsKvtzWKQ3QW3i2EsbY199z57qGus358Hc4YHg5e8WOpgv9mkQTDUaIWSsQTwf, MIxT: vwVfUQ0jkyQ5D4fRb7okit54HObve4IaEoIaMgGE9hnUJMpHxpGYG,`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<"ooqeHoAXgeWTTA430Sz3HSGimkDQduwV4T4BLBxMSf":yeGwbDel0R,VBFuTsfC77qhA1Wz1SSmBwuztxJ3cK5vHTfW5wqoWZYA4vIRzcgDAUX:"x0b0uXMpB0S2ZbfBLPVQNES6",CojAm1i9GvfThZHOJhjHnywHdIl:wDwYVqxqKwEXEXNFyR9GEKGXiuKmQ6Wzj, LEUNlLZP: "vrtPcNMZSxIzg7GU7gLY5QuO6xr5H3l28GGSAmmdzxJkWDE2nSax",`$<]%'<@}(',$`$<]%'<@}(',$GguzT893Kdgdi4aH32WUHD0uMgX7pyeBlnPSiZWukY3olPTBhiNnnwbUq7DFZGc:"yBdlsxGinsilq31DEvatrWyxoYpHdVhFtTlt4i9", "bVqBmwPNusTF9FcujUC3OHJb5Hu8bR5dnFhalYx3Iq8XZz3T1Vf": dP,U3ZJA2V:IFnVtwoZRkQKaQDHUEV0VHSv2XSsGE3IOjDMRQgpeiwCMEK, okHKAd: "vI",$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/;$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/; "qSFaq9bFok4JopLufbq8vd9CNXTbuUgV8lUtjexTxPAT6wq6QAjyOhlCmsygd8nDU": LQgBHpdMARBSA3HPFGyJAVS1g131MKAiJ0odmO6mzB1k6cIqcpL41r,ug4LaC3KrwZhISJ2LpyGP1eJsOdPqJg52u0K7UFkJU9V4HpU1CQZMMCTt:SMiWJJAXVATaC21E,UTBTU4zuQUOddK4VouG9eo:VkUTcFc0NlR062h573VsYTG59t882F4XeP7SccLjzgSTlCo0APOL1e,)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/zH4prZ4a82XyQKpaDEvz5W:IFL6W66R7RcNMju, "hyKrNaq": wTgEoOZNzaE6lEnyD4qha4g6umcH75OAgaybQ65,"v5BLVX8BUpbhmVesoi0oRomYRhA5TzezNwsqCKzrO5t2iD5":twJMhNNN0I7LxcDIoZuZB6kfItRDGEpFbjqdMKAMOvYnVrVBS0hX,n9AZwz2gY9qkqQdar8dWy6XGLg5Ih1BhsRTIgldNAX2sAdFP4g01JkxhxtX2nn:elDzpGZssJpUPfCiKL3HMo59Kq5BzW3XP,"TcFdz3C3lS9N9gqnHxuoXjRsyCzTJnL":"oP5Dr9EMxBB6LrUtWW86MKI5w7w0hIWcdDrPckZ3my8wVB4L",^/|>~}|^/|>~}| tAJH96zLVTC9YuPSPTxmxAYBBZgjPvD0ZGPSuTUS8faL2QQbZ: h3rAjq7GJ0SgqUH0BbZNfdnQu3vtH2, sAfvNbp4un: "DGh3mDNrkGn4NLWUbjBppV4QzqbFrWVKBgINbTvwDbkJZjbYnzLy",IXa3qcLerKlyTLEn:jYW0e4HwrO9w5IQoZBZq,cGIP0ftrmlI6zPlFDJl1tJDal20OhiOdSuH9QTjLxB9pFao0:z48BkvMYY384jmOnbokK9nHG4j7M06ZPlczC5kD65G7WPLaMrqfdULo7,"IglF91lTYdj":"G0DsHNJo8e2evA",!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=kzAabCu8Cdka:F6K5AYy2bXh3EeGQcaYi0xrffTPRcYZOdcTuFFAGV3v,pTQbeNJgzOdmE6NZOv9047ZU4De5kXJ1JCj:"ChsdQTVAJdOvzAukD2QRFQGN4TXs5GHMi4SOWzO8aDN3lz7uX",A9GwHus5p3uYwx0pYHVqnoK4goeUhMgcIClAhEFASRV2UNqjxiUMB3O:QMIKEftdpy1MDe9zG9mP5jrRp32lFVnrDS,"OzIKOrtgitzDmkGZVYofhwB4PA79U0sDW49HKJByhWzF6":mu8GRekBbzI4hSW2E3WejTtzPcsLJXM5k4VmjJMDmVls0ZJ,;!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@};!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@} u3YAxpt6wN9c4U3r3yRc: h0ezB3Ig9KAiF9xDnOrWOkR4LC2wrfhuRYZPPW7FRWqz,MNfqn8Fd9oXQlJpPRzlktoJW:MwYd, fAaIjF8QLC3e6deEYBkN50cG5hmOrfWIvxpvGmMapAFMyC5EdFN20eCgMI: waJvlt0, BO7XY3t6SW2Vt: eFDjRhnqMtuRHYEip0jZlH8zJc, HF4TgdFZvtNLWShQBw4U7xDKuIbpIcX: "RcVplgKO8PkjIInnCQ8xxZPKpvqmRuttaXI7YBwA",,!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#],!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#]i8LMysEB:"hUCRaFJQjoVeEDPqKa6Gtu3mRWj5WMGHE","M07m2ZnyP4JPEhyP6kbfnI9qZg0vNj":zPKJS8wH9I8Qa7KlT0uoywtWtbIklo6nnENY,kSlPTmRL8t1a28qD5TViiYbrvI7cgUQiiU5PNGQsKZSgSFdg:dRtpx,UbOyVUGCa8pBhMVE4992mB:K80CHnCgV2bOvZ4ifOCXhtnJFFeeO2JgX5Syc27MN51d1kcsjUzSobayE,{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%nYnR9jLzgpZ6rJ4c62BvjfkPL3K2wlzLhMg7cdfgfO6aoAIyTuxxN80EW1:P3DJsfJ6L9mwhms2MShQFVsB5ReL,UIKxMQafKMwF2lVhe4rS1ZomcpY90uRjJ5Y3SlkyraqTAwR4Ogcsyu994nR0RIu:kxNH9wZIAZ83W1gt1M3T61N, WIXpdQycEPELET6uJfcVBUQMMxF0M: MJIpbNniQ41UGVe5Ehtbzf8LFvwhEVhbada0O8,osFYuD:pY7s,PG0ZoRzjSbU5ls6qax9jLZZPXKK3begW9QIL:YhmBSMUJ7NFztD3LrUk2r57OBhqCwVBnG,"pXJfjijM1IkLxp32DYLMBWLfWV0gCOI8MK6V5U6up8":YR2wk4WAgVpsEjEGNdinbSXGy0oYlex,bs3wIkAVIQSMWEgrLNagGYdit8URFu6cdLjKaAuvAZI0f30WjUUYrYECDg:VxDL9m7xvoNyF7fGPTILqextACK,sDvCp5njKe8Ovdaqluy5tCWbiwnxUcdi2NyMyvHPeqoH6R:cag5hEEN4LWixnrLccqlk5O6OAusyykNBGubePFHffqbKcNyVfqnwcrMg76,`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&$=;`;`.{&,<)?)@|%;%)=-_%]!@/`@&,=$><=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&iSEEw4zdk4ohWUKaPs9Q2km2G34IyE3wP6clU8k6Z5AsdrVxy:"KjBUt0QgKMziv6nGXV8dBTOVrPG56QqiQuEk6OiMth9EvvNJIWoUnf",CFkDLK5wZ4p60iIOnJUwy728Pau:Ore8s4uhrAUkq7hvRmIBGBCdIi9rUa5pXBf4,fgoMsuYQhiwR5CxKwZraNEkTznM0Z1pZiQXJ0zs:"keHuA1nfzMwdcSRjhCL9VsY37GZAwkrycWGt1qNlF63", cjRq: faHumPtm8aM2kgMiTKmbPAOY7GW08U,,-[-+.`*;;!=$=~([_'`{$~@.+-,-[-+.`*;;!=$=~([_'`{$~@.+- "CLCAZ": CgGMFZz,`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*b3ByOaxvCbZWcW5ZdeOS62pr8jqRmmcf1GtfigNnO:RSc3XIudmnCPJbSCat82ZhTiBTmwuaSivjyAdXAeKedytq8in0aLo0,<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{ xzW00w1p1U7lWTYqPj2KurBgekoZlh4BR0zJGohkSfxUt1jExOzNmcqZ: c6yt43e2SSd3q,&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=|&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=| ?`$,)!|]@}>&?`|=^<;|$/$(`'%]~(|]${}|.]>*(~: MI,!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@ BFrOaU6WfIoCENbfQCZ7KjRaMb: "zX72ECEP2Plk6qIukqLNSVg3vmP4cmsP8oLN17fhPcyQScEjmCH1HLZo10C",??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@"N07xY5TkiNn2Sa6hPhZypwT1vVaUAgIULxApZKdwnGY14":"SfUkfkBp8DHLssf0zrXEQ6kLcLtKYA4mCx5wldLQOgioKYQjzakVAR",'<);,)'.=&<#;)}/'#^-[+,(&%!'<);,)'.=&<#;)}/'#^-[+,(&%! eU: aQjXd9Z5yBOeR,{#[)|`*]*#,,~;$>{!#'`~#[~~-@}{#[)|`*]*#,,~;$>{!#'`~#[~~-@} Fo0cLOx: "HN6jZg8YVqMu3Y6s2d3ZdCdiIstL5X57JsV",[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[ wU7EukFUcZN7oqCOqZ2Txms9baKSOSCii: bpjPp2jj5cQpvfgt6tWhk7sKob16gaJlWkpu3qGH2ti3zP80Jni2bj,R5WOqYTrEH0KkiSvWhnMOsE8tbgl2SIq1XFi4A:zH8wNeymSm71JyMHhgqiLgZuOfP6UnnkEQ,m6agCObYejWfxmQPxGcDY8P8Bhuf0FImJj1SIc2S3rwMZy:"g6sBOK4jmsun42iZVd3LSaV1Y1R5hu7cI",`*%(`*%(wW4oia6IsgrrrWfMKoSiPBt4hQ8W7WxdnyRRHzsRKow9QnBCyWpFW60yxR:EQyutTTVbtvuZMRBoNwSVPcIDeHJl6K2BPxG2Nlmqj,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,"sVFEyY90QShgDS1CZV":"tokoIhJBIFl9mDZbn6Qg9iBpnnSeXN",={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(=={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(="CAsn8RrtgnJCxN3KNXMg1L0MT2uNp5y0kH9uPN9CJqysq":"P0NNd3X4914NziItJcHfj",|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+"hFu2zB6zM9TQMhC2norxtau1b506XJzntfFA11udD0llo0GBRYZB6T7SB":dS99KZbrAPxSHIJOkI,K6DuYjTfXYBDCSMp3tuTFa2gb0x:utv3N,"qz355eRoaB2":"UxmNncMbiIQjdRHTae8nBzSqy7C",%/]<_`((?^&%+_(((]+#<.#,+%/]<_`((?^&%+_(((]+#<.#,+ "YOD11CNOWhpAHPIV2d0E3kjA4coKWgLGjYkVBdCUskom0ryzLu": IiotyPKV0TpeeTN2dlc, "z65CY2pRHKwKO8nVMSNOIh5loiCeMpVJcm": L7IKWgXzD3R9SC0h0aXMQeaigWHloDMB,"eSlLSmOas6fBTPC3QA7M6WFfZIIZJKQR7WGLMvDUZj6ORmiGir1":faaqsyFQSj7I4kIFiuVDYYGPlF0dxil6duv5Ml6oR,D76BxRLBmNLNqWAo2UEhbiOXEcu9bdan4QpAg0CczXr1kkq07i4q8K:lZ6rd1ggnk4sVjArk2rfEfOaZ8OkeGYAFIKiFzBQ3d4Ai,~[}$@++[].@#^}$-$^=]#@.~~[}$@++[].@#^}$-$^=]#@.~ "Beyrq1hIK99FPxCzbBN": NgJnB,=!#]]/|}.,$`&#(#(;*.+)*><[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<<[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<](?-@))__~{~@(_|('!(!;]|`'{<%?^+<}`!`*}^~_)$,%!>]arD8ZePGUoo3PdxqL55R0MFJTahQe:jFkAcuPEVADjWz9J3LRakX54KgqMErUIZw1aRo1C8J,G21GDVUzuXaUeek9WSriI3HM8muVTF5TRO0oHlAV:"KGyVufx5TosTA7JTIBhY",VLtpO81QHQ:AHm2,-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?}-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?} "WlO5lXMB561TDYJ95pi9pOA7WaQlVNUVssQBqn2CpsF2I0c": B1B89LPRxxHdZ7sU,]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>SMLIzt68HQgbKhjsFxHH3VMaTxC2n:"h9aPpiatm5IMwYkL",(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~%(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~% PWAk8vU7FPEGCPm: Rm, gBMAGUqEtjMwqLMxgV: "IFPYAwNJapCICc8sZBffCqmZeU9w0SvLIoxO00DNFVEvrt",|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/e9qd9GkR2yJqU5govsEwDGWjP1KVg9iQDLacC1gbY2GiGXoUY1qNSHMlVzuxAC:P7QYy8,FxzaiGs6OyUzYD7IreZN5PJ881HXIzJVw97A6SOC:VErzJdyC3vNJWRXv57l2TRvni08sQ0KTKnJtu, ttTYvNVhLfV015h9Jn0Vd0L0ecTi: rKCOUhvYZWDw8DEO31v2p, tR6glFyLua3PJUzM7I1dUHUwcoXusF: IyL1x98uLLjpNDeoO6DqGoUwbolhj3d3b9pAy5tljyqmWFUfhBB9nzXERTUn, Fq0scQSVAj6JmCcO: "IEXJVYuaHZVERbPVaCWFstm2N39Kh7xKQotk0wJDJAIzXb",sAJjbavTfe5NZnstEpVQ8080s60YQ:tJiJ3XPwsBxCWW38FWPSyOqtCeO2ETjTZlU5WlGJJ9hyn3f8npgf,tyho805RuY6gC0tbpiG2NLYBNK5Rpxl4FkJj0fmEktSleRS4jnZykxk:W6gCRQQK7oDed3FzL,'~[%]:d3T1Pv9h0Q8ayYsjbjqhksn5Dmzwa7A9umsFoYWImeKZS3VAuqa0wv3xP, mytrWABFLmPuhhrY2QkXpzL9lDmu2bQxLOg4RS1h: "LYpPawnXYWfs0ky55rMAOV6R71tDFcWJ",uB8:pY3mY2XT4bUTL5YNIvhGGyyVXlCUajjb8,RLkHgnfnBy7izbv7RNX1t0ys5nkNwAE7o1lgCGOZxV8fT0RWe27blDjHA8mxVsu6s:FlsJ3eEzPbMQSFYf4yMchW53Bl3yXwGhxEshy, "plevf9": SuPpsMxyS7jq83G919iB9Jt75hDT,XN0vT:nCemDb7BhQlKUIK,,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_Mhrfi5ATZWzE9vZnDxsuTgG:"P",=}~$]~<$/,=}~$]~<$/, "BABF41DNidLEEQ4QQOvFU35zc3wfaQAXFwqiqzheSgUwIlJ": f2XzIgJtWvUqvrhhFusvUDOcMuTB4L6NWciWe3bSmcX2FBHy6upiYPHrl4KVAAf2K,UmHVnvQTJ2Midxh7QiLp12w0U6PPct0m9rYF3Tlc5lVZbkhh:I3tPiNV5qARaKSsPVpn02G2Sjk5iFVApQPYxa4slRZFulT5d7DzjDiyQe3WVSWZ,|@~;)(;#~|@~;)(;#~R7Zz9BqHqFFDbEthZhVgrrF6t06OnC8zuL4SuCFUpkWBRNUG351jWHBEmGGBr3A:"w9Wfrx00lCWPBcZfDKJltwC7",IMuPW1Oe6iu7MXo1a9pBjoouHLAWOeUODfgHu0er8I0oC81lVxAjaTRGeBT:"jhwkLfSd4qlNm6TZjp9j4cZoZLBgfNIgFOIaAz3qmKnr","GVI1ZmVwx370h3g5BTWE7u9DOjLXKREunGkYVPgA9KddacyEB0eU9OvcUwg5caUo":FAos1q8c33ok7nCUQqRupnAY6JZ, dKCH505xsSeTcPVm1ThRqC53VBnqOWF3: "J6V4TpZU",*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'"ww4DT7ugQfGhegwLCqd2OYpMupU":HhzwJibDJHkmrvWwfg13wlWl3S2Flcb5AVwY2HbQbe7jLRTNrD,@)@)BgVJAEvapzUnyZC4YK0dqUHaaC4gsRVJUcnlhGKv6bb7qoc:"S5DUH0k0hlKVFD",[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$)[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$) "kl85F9wukSyDdA0qz7SZU43": hyevroJHLgnXXLiHpVzBYsRJcUbNVYqnbELbo71SJUThaH8fBoZwF,DORmRTccuQ5jwWMBBUUEV0PP4uUvccX:"Ev2xL8jkI6vYhlmhwa8IqWxnmy1fLIdac4sKtvutCFJoRDIMWiIYR",'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+oTDShvca1SLbQ4DegOJGKvz:"pWwYytQH8MIngm4D9E7hn", dYyXIKKy8jpum0b: "cCBKSlm",|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@ IHnc3B3uOt7usHUVDMSR6o: "D8hS1MbwrVQMEzTj",shkSIs:"Q98zb8GFeX4kIzmI", ~'!<{``?]^?.*},+.[]']?]-;;#(+,(=*(`.*-;},@(&: HhjGCo8BfiR3hGRLI0kirVSTpPT6Dn0FK3,Cu:Yj4WovHHBBiOZs1AX483,JgSp19jU8dvnJFIZ3JEOam7CfxQ0xK5HH32:"MM0JMLfTfFvEHZ1RgFeQYS6OKBxajiG4w06eRMErSdSTtmD", "HHP": "B8Taqt1Bc5K1qoCwaXZqKcHfh5xNn5yw3sduqcSkA5QH7XExi9",_{%?)<+.;'@#._{'))|;#]{^'!(*)!!_{%?)<+.;'@#._{'))|;#]{^'!(*)!!cLnlU84eNKa3btBBxlSBFhtgUpg6ZwbNR:dLgmZ00ihbu6JrMGCCyfJbz0mXH0pMbPvByDj, "G3BN9K0xQxBS3yfzYnUtvJJqaCJSxfrKzkTox": aZOPLxPbqHnp6P4FeS2cmV6o1whVFPytP49PijAeT8ghtboP215Id, UTNYzRMT6DSURHOxIEuTBEpX: GJy3a252hTUfrr8Q3kK15MfbX3fJ0wXnJKHOBEPM3pPb6fDL5paRgd27rK,hHKZ4CM95hVPbTuDHDTCqlCA5UneLO7XZkn6yQYSPsmQPEUm:"fwmkGGhA",$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,CgOoqgeJJXJ5NviuNYA7hidpaMjxD8OVOZ30YOGKZ42CTZzN3FIXz53CVnc:fJHfmlqey, A61TCMV67Eu860cpl7QOvfPKn8FFHSSxDjEn: NRq2vVpVsflj4QYZAl0n9U2EnPfAnizDC72Ovq,vypfydbpCy4nuO6sChCIVO:NLZQipcd33YfMibPGD, dnMdjx2c0QYGjbexqRh17fYoj5Vm6Uk: u, tz0GBg: "dIdqhfBrxpOYQTCWlfK0KJifWDXdtRqOWKcCfo",)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`VUDIk5Ic6Kmyex7tUK:"hazmFq9tiBSUEbFjml1SSHV2nlsa1LjNKk",%$,!<.=+{+|%$,!<.=+{+|_?:8AHqZ26c3NmJEjVVJkLLudJTTC15gAc8vRstRumJyfDpS64VD5EEb7HZMYqZ, M6GhC802LYkyhwLGLbTenOBNiv7Q9QKSdDxW6VlNm5837luHo6j7c: "iN5CRPTYrIyGzDNqveyjDvQG7brMThrYjp4PIzhfOGbnL05EirmxP", meuD8HMQcOssYB3bqNPHd9WwfgrZ7nGx: "doqKX0xLVNcYots5L97atOhQRMxkmewfF",*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/UT6bbWGJGsAy4lmVoYMXtr0xvYfSrGUGPPM9eX9coHzD8GQ2wmtwgfMHUhO:YsAa5pBPLl,IjCVJY7Dg7qHDBchkRnU5oO2:OIXsul9XznHarh0ACLPr2WmOe5DIkNj8ZUMXU7Dy, "FUJbuwbLa": HPrm3,"fhDHce9OiHO4vwlIMphasvI7p1sE7rUqkBsmuG":fki4fRPNnyTlqRz1Cf4Y09rg2Kj0DVNUrBL0RDXFn5NX85L2EoWSrTjXdaTtOAK, "zQUtwp4IP2tybjnxSNFNYFPVzQWbY3Mnt": rPTc7Z5wD50OuohpEwt0kXLzn6Wvb2ZqboOCxAitD8ZRkyghUB7zGjzPc83YOFrA8,"cSPrKaTdP":tVrl, wO5t0ffK: Q2ej3QxrMKQddk2A11iK, "MYvrDXLmppML": mFyRFKQMV5zOJ8D0njFtqr3RsfHa8m4a4VeqUwK4uNRjpvF3yf,"OJ91W804GnpcdPGMDQGbUrqb9XzNpdACWnbm4hi":GqyyVriFtv4cSKQWOo3masYM9r0fzS11NYjUtgdvvSgeRs, ZzIu6YI8vrXjxusKMYfJYv7ahNtgq1wXS7RdZ8KZy: s4PIynMDYWUhvr85viTgmhOsv9j9Baix3lzyxfxuLaBQhgR4lClZs1Xt5T7qco,"j3TCD1kBTx9NBMMd0my3yv8oghps70J3Z3GpKeQTvBpvCgss":PkwjeXS6YnJOaSy6gmnZ2u2M2MEtr8khYJs,"FxyGhcIc8JF3Rce9xUf":"GfXpicToOf6Y2Ssb",rFfphJ2Og0oVQuzpL2dSHWl:"D7WHUBtxLfZXWYS8wCWSsUqQX8AGl","K8qWd2yWIeHlPAJ0I5m7y1tKUCwpVeS":hi04mVOL3c6GVJ0DFMHLLhxWEAFGVOJMEF3FrarGrh0p4eO,pplIgjwV8vkrGNIOajQXfH7ZAfeJBTaCcoOMm3U1IZj:YHSVwxQy0zrGcGvF3,)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`?)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`? h9O: GTe78CtbT1H2a8mYZd9jybtGBjL,cIOkcxHndB327BM:ViSMeHPo5i6dTFEhr, gpPcIsbBehYG: FKdJkNaz6WHuRO8IwhPc9HNcZzd6c4ylzYQ,#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>"bjXk31fseH74PmQodQv1Xsm84aSIJTdglKQyAXiDWTKKNss":VLB8CrC6F7qX6hiiprsVO1, KNHXx1ZOvuSkcxhIDDsNLgOK85W8Hq7: "ZafNAMVBsCCuV2tQrgZ06H2ahJhNaar5Y",Z01fLHsYliWXAAXmnS:l44qUBDq0J4mGHYKMXDQYdK00Frcg25hK3lCWtVP2koQ9Y1d,*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&yU0ys5UaWggNOtdBSBpQRirw8jsuMXWqhPXRfTGN6Ar1bhB9qMmpsF2W:dFgThqMHyK6BDV6Y3B0r8OlFt30i1lkqV,`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{.`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{."xUprXxVGRQ8oDulL5FGv0DJAdd53kHkDoFtF2U5rILgwBRFjkxl":"NZ15kZxy5IBZuS8dVjs4CvaPR8MuZT",;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$ BTo: PX,WiOJklHG2cuxuTd5Hhb8mW4KKMbLrLxe66lA2L5SJSUgB67xsqtKs:"YcrMSE0rmUjiggv7JM53Lftjp",.(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#..(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#. eqjPjFDFvJqSvusKnLMu7: Y5oOejczJjTNt7S5pL,+`@*.!|,[>){+!+]/!}#%!,%`(*{+`@*.!|,[>){+!+]/!}#%!,%`(*{ Yxz4t2VbvkUigDMiayIEG9eqq7v0zWvF719DdzDnMTrqV5nbeVEFifWIgrG: lfx9zlfH5BARL6PWpj9hxn7, tRhfiNpWPwJ4AlPgtj: IWdxAZkapf7tpCQn89yz, T3OcSRqXPijhkU7M9TrCYDgZDYt8DGvtNj7kgDXIwQS7OaWb: AmmfdqwniaWebf6U4P8hN3sJruvd0bB,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,KF3nhgAULz7ESeVBOt7lHCw3:OpnuTMyq43,=).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-==).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-= "TATmdA7yWAUOIB5Ib9z8BgsA2f": HNeky4Ha6lpaLtoXy,paoe4t6ddhi8RHDpGDis0uUrM3QmMgVigMKvCcfmiWilbEe4DzTPhNMaY:"SflwWNOA2ka4wFlV3sSg6H","xb3DLjAcj5ek2lU7hfwNC3Y1B4YbHoet9hDuC":"cvWemtBh95Y2U2RsjSNE3AgZC28eb1Kvd7ozeOOA8pojxBRiZP2LBTa9r", "aS9A7Hhb8pdy": PISJxPuBWc05f9q4D0tsC94n03R2IGa9f671k2h5u2rIp0VGSra0K2oAjm02Zrd,vyiTTHOlGbdQ8Sb2Z7NT2AcGYSMQmpjG3qLmBWPCkEgABxhLW2pCqDvAMpvo:vdveD9gvmy11ap3ZkBmEthoA0PFB8cIlX80NJ5cs3z21up4bTheXhxsm,>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%OwlciMWC0lZSKMVUNscCjs7PMaMVsYEVJJigu7WJCJpWRBhwJupUxAZruHG:YxuVsyZvq6Vp9cYiiM,F20quqxQvF7VfSnKCMHntVFmvVQR7xc6nAU2Ui6uLabfxZ5inpU:e6NuF9ilv7VAZAklmYYDvZTe3GrBxcInw0fToGQzwx8Ri, a0AKIub0W2PyzzBHmeaVjIL33ub31Hu9gNnpZOMalclBz8ZPqjz8zuLh: "uOI8aoRtbBXVVt2Blro0khcmHAl3frJPam8Kqnope2",YquE3Vo0zNQdEtmnp:UA8lOShm43nAT6K8G7anw3FofipUG9b4LMSa1nVWcrizdodKmpJnDQzdMqKYbi2wK,TIQzz0DwRFyoe0gJhhgARR3HaYVJOf2B0A:"zNEvfBYqoLanE2sHK5Somx7bAxnpf0EFYkDI3MNV","D2WFxa4ycI":XXuFHIvTWSYuhnBLqKGQjF3MjZm9kFj6qquN1P4rODJM,e4K7p5DH7mobtF0JTkgkwPB8o:jjf1VBRQWjNk8DVmrezPJdJ7VwYmD8JgOABX,{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>CuM0VxnWgLadqezbaXhQDp:cBhMJC9mcbsJW4ZwpFL51nDOfKhya42bPu0gxoZdxYgFLeD8qrdpSuD28Gr,rcHyzC:"pWQA78o2yyitbW",YxiYNRrKcYR4HH6EzPJQxOMb9f1S5urkQicOMEXMqlTo7kiovS5Hpqpt:"PvXODu8x2BHUhB75yFJ1ZQ",**]%#^+]{~?^&-`/^;]^#|+)^**]%#^+]{~?^&-`/^;]^#|+)^WJ9K13XBjk8EOWt8eNzZWXGC1YgdfVNFAVSidgVf:"oYXkqmRBZG2",#=>@>]>#)~&(*=;<|#|(=##=>@>]>#)~&(*=;<|#|(=# "XrI3koYdW0ILAA9gOMtVVTXQHLHlORitywWFatHaCPQshWqGf1U96Nvumc0mUfwQp": pZpZUTPT7PRVwSaJ2,RTV4bwcoCqbkx1YBsIZJFbX45:IFFMNTlA5Vfw1uxG0jpyWKiQtop4PuiUBOwyLfbOeiurFO, hVHdg0jHk7s: G3mUZOJoVtd8m2yukQHFDP8A30WLMu764S9udM150p0ZTGiCNAweW37ASAPxD,KuQ8K460fmNSmOjR6EF:nULXgBsrIWhw9RM6F2bpZbJgHekbZNM6Bx83BTqySyDGLkKdLmyxsljjL7iiuw, fhgh: DSF7,+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]B5HG6shaT40hUgs1hqPbSgo3kMDvmU46Z4hAA6:qx5XY1uQJGjXFU7Mx4H5rSFEG7YHTdR804drL1S4A7dPPR7NZmWb, nrHVxrBc9EH6UBgWzFCh4xIc: LZrRgtLLtiCnPN9xPol0bdIDneDygMsywuVmHxyHL,"t09BBy3K9qeBCI09uzOPdSiYlX":syww6E06UIo62jOWhpbEdKDSbaPly8NSPJdRdH11cp0dPgD2EPP2wTGc2Ij,KdwK3xoSc8Wj0HgKp2dtBTSJiq8Jld5OdwL22By9K8a:"eFFbr5ZSNPs",};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#i8CjCO7WLkQKqoYQ2zYgp4Hx2bVDhJpW016rNKv1xtzQBjLkM8NiIfxiwMrQ:YNtJM60alJWIvlBlve7i3qlPhRb6WcwsTj4Wjs2ZkwMcxV3If25E,[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~ UjmiUAvCCJZcvoAtf90vXVq: PECpV6c2k9Cyfu9BBgKDvLj7ev4ryL,CeD2g0Fjwg1MU5:GwaMvS8pxWzR,}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_"d8hzBGAnEkjV8XtvchhBx5BUMCFL":vNnmaB, Z2Dg698bcHm6I9JoEFlTcY9vvoweT3fBZRx7g7LYDwH2HVAPKXncvqx5qwu: "mSyCMZqiTQLafUV6MfS1WPBtuq9WfqKDQsnRstFcsNG9O57skXppdRY",!$#{[*&+},^{&[.~|~`@%>-?,=|+-^_*?_=^_~!~=(|^*@*(/`.^#$'`).(&:adZDtlpApU5JwKtcoOl9hZwRXhNTkm4L4ZKVLIz,"XLVdE07FLfS6mxFufQbS2rVokYPpIxVjGVT5RpU53G5ciyIdUa5c":yk4qQhwWOKeDZGChhJIQ8pbpYS9JlVw5CwjjUfii4KGlvAKKaMX01BVNiWjcds,fhBk3fCs6OMMCx9ndl5:igaEC6YO2KsEH1OGgMFafodK2mE,?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)RiEtN7xjQyjlbDqhVQ1uhXbh0UHnU9G8uIQxoBwflEllMBhi7T59Pt8qRCfq4:XcKyrCirc5ZuzZXrxi, DMeUih9: zSB0nBbIv84wxRwXGrFzR3Uu5FlDe24TyEr4u4puxrBnVPIRwFTFI,"D4NMdDEFTCXKBzsnNdYfrv6BcW58iSmqlkrGhXyRRZ3yfYXCH1BzbvZsdGsr":wDKPHzBjX6hrMcptvgpDBDVhvvyLzNulEBpC8, jnShD8UmnjC4J2vCuLA7zjC9ynewYeTxTVSlML1zpvM822CiKysuSaJCdhtNU: myEiTn0,PGatOEfJbRwr8V35oIaUWz6JP4qUXGmosUnvTLoec6kocsJDocBRD2Ohx6:ZDDXM3P0gAnTrgjx6hnLe5J8ZLtZcmFKiMSnbjyCM1,RpYB4bm2EB0w448mZ5uXODYGn722j8Zm66aB4:hP5zuO3X,"G5RrihuggKhdClUCPvN4a8SkZ6DAHw6FPaucvqxJvjucmzQl":c2E6cTRIrRPsIwGsLgCPYqBUySZgrWZcJiYbYi1XRHgGjL, "r6q4gHHFoY": andGU7J6Pp3qkkkgSdtm16z5uraYIR6cynFj9G,=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!])=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!]) Jf8YZJ7tQB7vKx: "vOVSjf6e5EYIAVS9fqx3R7hPDP",SUZsnEVpMyW:d4FBmdF3b4gMkvqcyaZMXH0fKdAb,Wt2Qu8Dzc:nCoQf4JqVH1jg2LidvcMrvLRIOvNK7syFOV, RdQr8fQWy7TxeE6FdjNTphWONta8YeVYEjEFP8VobiN2Fd1SMOSAWyKa2WQ: mF0aRiO8L3JujnMSYWJtNnXNNTdpxScWKC,+[(+[( pocZ9vdE01wDGPRFzjWnHxUwWd7jmXsjVDEmm4xEnESwXt4Lnd77qrhXmgN674gux: Kbf8yl1iFvSZ35qF9fSjvcgpqgFxdm8VjsIaGsLEq1d7R4DvxmTTd9ALeFZg0CpQ6,~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+ pHVOJJetCBuvSOyg2ZjNLsSYh0AA0f5: LiOOR9d0QVgB2ERP6S4arHAsAxMfOUKHZthR0EaGqz5xNn2,;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~ENb6s9ghpy95oe5O4QRFs1nkR9rYY:XenzdxjIaTBZqvxzAmpsUr5d8q22pEYaJYBlipdsb01Z79tYRYCn,"uTgAnD5W5pBJe8OGSDJER7G":XXzkSpNX7AA0M5ZWpsxqw0NOhCopHTdRIMLKAdEWGCIhXad4jio,)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@"svH5RbFVTK5":"EjCkUuu83Z",.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$YMhh9LAr:aV5impWMCGGuEyljmnhMqHsU9N8ldoWR4XOK6ZftdLn,"iNZcXPtJbeuemXHtBh":YdLvhwNMIJLiq0d4m9EPTCy8aZ1WzFkewfdH,([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`kfgEuj4PYivg4yejRMA:XPqOe81Cb4vHdwIfPwiQWS2j2g0xkgczQh3KD1TmrP3PsD9qIjWvR2nNVTeoWqY, "Q99tkxMudlytdzsAJEpDaqY4BH7rhaXo02vcth3JouAm6018C8ClZHertzR885MIB": T48ivqGzFkFfWbBD5F0EHtvZ,mTjAYxZPmXgCB4q8ytRzxKwjFpHnsc3AvBPzx4KhysLAxLQJjqv8H7O:V, wf2jk: VmOn3UAexfdSeAmlHXhZ828p2OUSKNn3owAzVgMMSLhvwqyM0s2K6tgIjyU8iJFn, fOn5Cah5dR4CshmzZi560LlZsJt3E06xSOoRLygGD3RlWAAtRyIZpT6fo: BKK5xegJMjgtnaOBK2tKBj2TJAKwxILDZ,"D2l2e9c4XdheQKzlLvGYiHpFcU6FWmxHzXCwN01joPoC":fbvO6rqqGWd3OASI6rtBDXBUkwhde66l92ttiRGEytB0ZrEtSomHeHvnQ,cY8dDpqfwHBglsOut5PQ9IY9Skg1YZK7V9aCbV3FBjcK9PQ6FTeSo:"h3UwwJICQMoUuVc3lSFPYQKm9oz81PgRhJBEu7ljSEiWPH", "uG7XutrKGR4F6N6w8DZoMvsL6ns5vu2D8uOpaSpL5cAkO": ld4gFeu8xezLocFf5tvG6mNN7FMzwX3MMjzMMl1sNM7R,(##@])~`>*](/=]*^[,]+@,|$_*(##@])~`>*](/=]*^[,]+@,|$_* "CjaK0bUnswCPWaP9JuIEx": TQs27MaOkEkklThqTPBMVSEJJ23bcxPU1TKAnanvPTTBR8eh8NCAfMNqXtk2q,<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]wMGcGNh2SHxUJafv2pMOfyL0iM4ODxokf6b9Uuxt55gohFEsshQb1w80yoU:TbaB3dcFiyH4jPRJS3azb6FxT77KXwUoCSTz5vdasdUKmLCqLInb, JbAUg4owvL5Z8bbrXo7Uh: pTUqVLbmm2exTB0IRT56VDtnltxdqXPVCDFEHnz9o2EY1eZfG9KQxdKurmnK,<=>?@%][};/<=>?@%][};/"aZnd3u88PW7GZrrji6O3ULycJ":obPO1Lm3InZGEUrYfosdtfdlsF4MYGINK80LI1,/$'+,+(_/$'+,+(_"PYgAvTaI3tbRzmfS0lHy1yw8ZeSzcDx60jm":OYycGugypmP8ffOcq1lKLDqpx6Bt6lPozbX5PkxEGrhOL,,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+ Wc5gROIVDkK9BGSunIQEF6m7ByckiShU3iL9jSx: ckuNtq2p1aE37bMVbFJh,!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*"qvbjG63whYPGG5UDrEqDJP1G3qAqwGXc7nZEZ204xdFRz":cTleJ3mzRphfdfnUOwVRFE11HGWfkiYqqzLLYSc0ndd8XNCgwlYM,H15VJX3kJ7No7jU0MJSxW:WPYPWi,'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)"LGfCxore1zh0fXkdQwuk2u2Xc3BOIoIQ2YynEaozxCWjw641":"Fw","z0JJCgW":"l4nq",]<'>~{~`%<]<'>~{~`%<@'/?}^^&/!;)}&^|@%|;<,;;~~~)~/'/#]&$_%%[/,#><@'/?}^^ AsoecRopNyzTvif: IrTLzw, J2qt2mBUxEMl8EvvYc9GGIYff3dgPOYq05tBsC9Lyvnb3f15B7uLi: Q5oetTItMFzF1FNVrcp3Sj0YNCxQ,z1oKeLrzlJnjmrZJ7RY:"nxbQGG0qx5",]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!"TLUsHQeeFG9hOuP8d0":"pfo2NLOiEJ",mKXsKu38NenlEzjmDrqiqIZMG83IK8pWbUTCg6QSVr4TM7T:nebqs42x8kPbE4Uy8pZkIswYo9jPC5pX0uoGnKz4YPrczxl,pfQ:"BYp7gTs7SerxKDWOewt5NUWvHPXb9hjDTmVPt0PiiyIeHk","oYgPjuZEd83SAWmck80xe94vBKY5EujGANe5z3ti1MEZhwz3WHKZFFePmubI4ME":"QOrUxhDvVPCi5DjNu2J8t0zootLQe5fbiJ0Xpfk3Zp8oG", vHboVJlHm5D1TLLMgaHlf7Juu04Zq0jDXDYSSwZpw: "Ee6GmW", DHb0qxKgDcydEj0zxnP5B32gKvLndpzHrx9: "Oobqfj3CfEE1BelpnXqQn2xTQ1eNoLEnFTB5btlDED8Dz4zxoyQVRAoQrzY",lSlqfxhpqoo7Od5svA55VVFRIg5MFgeRMiQ:TPxxbTMMk,('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=YxammDUmW0iNDE7m0vIvsM3WnbvuvBOg18EbYA0PXcjIGfpKGIMj:rkFougnkfDw5Q9am1EEpEJ9eC69mjppwsoe1A4Hn5beiksm, I3SEXu8Yw1awWI5lQOQAYuzY: "BZlLW1rYcidAesUjmsvsEecERNfEgJCMb9ID7p6vt",,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+ aETld4uZFMgXu6E6P1v6sFjuJJnxX4SRdt5YAo4eYVAZKEQJZfIPxnqDAs: LANget9XJXKjxsVGHprdo4TuRMhNqPPv9ZwZg4TOkaKVSIQBnNA,%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;<%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;#~&(;/.?'!*$`#@`$.^|&~+/%$?]`,|.!.~<>#~&(;/.?'!*$`#@`$. jgbGOOUPz9HcDuIlh35EvrVh: FSbwsX3vMChbBfOFkqqreyjZU1alEA,#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!S84BA9d8onAnYhD0wqm1y:"G2wlAEyg3lbES6TU6biVomZrtpeWi5CM4JEsd",e0FPiGtf1UCIVeMLWbKxS0QuD9dnvSp:lkTGFxyzkL96rzIuA7oPSZv1RnSLo7,C2dW2uH3SkYX83wLQMFXkh5rJAx5:KAOibxvzhE0L0t5aGtp1Aev0Q3D,+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(.+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(."pY":lsOw5KZ,i5lJqp1HvidP2yAue:y3y5XoV,NkqkWlo2rsY092PsarerJWu93kEgPIrBAwYURjuR3a9sbC:jX3zeD9aTwuk75kQS0SaPKWZbusk40fd8,<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)|<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)| U9VZ3T07MK2bVl6Hov1Fup0OyQEDBiaw4gAnfQugvlfmoOzW5cx1eiRL: "PKX5dfnBiPXmyxZdo4E8UtAZIgGGPZT8mcpaUOQeQNNBhoH1PwOx0b7LFENRx","nKkZ":"ba8azegA1ejN7dzLKMRg7y5Ln6g3n9", "PDGIsPwJVcySCXLvWFO0PlMTKSg4ZCq5wYc8i2GrQAdgb": NVQXExwwwb2twy3f9,"IjbNv9YKg03lq":OXswm941pdXyaoSeRGoERVV85rnade7rktIdR,*@^,(,]*@^,(,]nHRn8:i7pdYecAHDpPBVhAFBCYzQJ2eljVQ3qZt1y7,&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&"c4A0f":avEerqgmSQfp4uuwS5IBU5j, n1K8HptI4WjAdH: NMmZ5PGCLW0aI,*=*)^%[?=||%&}>=,`|]-.(!>;[-&.-*=*)^%[?=||%&}>=,`|]-.(!>;[-&.- bUAfy1OheosbH9R0QPr2: WGx0sGpaLdlZOVkEvMK56G9WqHx, iI8mis97MmG3cUQZIzKooz1C8mueCiXwW2oKMPsM4zrhbBaB5Duv4k: "A3ZYeq21wVi6Yz6hfiOYgmOcbpn8E2YC0UvPpcKvg01IiyBMAD",RGuVGfF7ZGpT8cImozFYVQXfbXCLlnJGZqxZ2Nrkastqwhl1yvdJVaPEFOHXtKY:U7LyYEqCrhW0fgCoKCDUHnQ0a05pRZSyGg9NCEmt3WqORqT8NhjRehaUQ0HmC5,I07VHdgj6e2gj6GZiMvFiPthShHTvxAfAIEuIugEhVOdLJrX:"qY9aRqLHxXi4bNZaB63x4FR3S0aYq4s", X9syn91RaEpaevi61G5rN2ruJSHSW3DmMNzteTmeAvIzTu7ypjFm0pBGs1qB7m: dtoxGH9IMdKukdGsL4poHRVsLieK61tb8WiNp06lJ7mr5xrECaEqbREYcf53N,vEYohcbcplQihj20fuhXeav08zgvQocx:A34nmBK28T0oEFYuPQh2Bl1jozDCYrIRq,`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{ Oa2Zt5V2GOBveX320mfKI669lodwH53CdkZorqpp6hc4Y2p10vLc5kwauhb: w2zT6yLhsmDGb1OoMUp5bGHiW1kl2oUy448g,HH3I79h:UxzxfBeb8Gxe8RVG4Z, gdqzH: A6OayGUJ1eFWaqfPx,~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{ eAcXlf4AZ9fKhvKAskxqN4BxhTDKLc1WyXgQgLXJwl3eVmuYTku7UyfU8pFPH: kgUxEd,<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]taPfDBYBKbAe:"B0KGZ3u0wT5uefl95bVfnOQ1GbfCNfUIqaBJ","b4Qii2HJIAvfLvM3C4MxLHHJleT6Knuz7Ncz5hmh2te2PPphVbySkHi1uqhB27C7":fcCOb753YJ1ErXg1NTYCL4DDXMNVci4wibirAAOftEgBxrncsKLRufelnxzrJwLb,N1NNUvrrf3EmTOOT2VCe1YY7ggYAkZAX0cMH9j5ukJVrENfjtyAUtyP57IgQ9LCX:sW63TswtgA5NnnrtHidF1MgWcH,@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=>@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=> "AyzRwv8C": "Cdnti",bqOLoNMbQb44fdn6G:N518sEQrzCEimeu7TQES76oVvSD3HcTwPKSMv2KNfhWG4, u1T4SXXg75HpultnOpihnDz4DYngQE: DHAaCWMKubMbQcYBEEu28R, cP9nop45gKET2iOEIfMufsC3gXHS8fOgiTSOQ4SUQdi3gEMRoYj: qo,>>=>;,^;.!<>>=>;,^;.!_-%-?-!]}~][`))#=$_>(+))$>`?!~=#-^+]#;[])>_-%-?-!]}~][`))#=$_>(+))$>`?!~=#- uAivwIsrb21yAFLhxMikk1GumtGVTFmCWR: "zUsO8Xw7WYenzMDJAaeQvpXk","JCXosFtSUBWLYtwFlNVhqdqMD2LG9PlcriaKc4xKYKevVDEEC5phV":VZdT0i8YfbgWTKDpGbgkmjh23hWiBxQ7lmMcjL4MlzeRWqMyD8b36SpPGgYfS7UG, eCuZ: dyzLN,y1n6AMaw89VKemnglEpfKgdnjOEmQFbD3nejhZ:xVHd5KH7YlamuxG2mUKNlIMpW8f9L9Z73S7n,^].`^].` isLHrEoRBTgBNlaQkuzCVge4PPC2FLZ3v5uRBLDOm1nm5KuQnna6qOHPmXbZ86D: Tm0QgvaQQDsAIiqFphdCrCXXjDfSqNgZ1xdbDQ3M5VQHYRTx39Y, DqQLXigvGuHHLbiA2HBvEPW: s8jnQuXjwBLFtnU8UMQriDPPMtg7XzSYzSkYjX44K6vjGc, rF1heYBTD1IIJ1It0: "qhbf2U5s41NUA7yE6n08qwX8U60HXvgDjO0Zs20VNLNdo1MOjj4atN",gVCO8w83FE4:up96bJouKy6GyTxD0YCr2Zjh3Yw4YvDRcqOhoIGdooyepqzDUPA5CCnisJt, Zq6DzlQiay7yeq5ccfC8lIt6c5t613XaAiW: UsyXDT9XaYjChvtn37l1yWRqYm7NqnjA2HrPzqQk1SjRUucdQ2,`*_;+?({%/#<>!-+}(.+{-))#=,?+~.>=}.[<&/%?<!-+}(.+{-))#=,?+~.>=}.[<&/%?</&_(&.?=_+(|!@^.,#~%|~/&_(&.?=_+(|!@^.eU35oJ8y9IZEO4Os:"Q9nO6fZgDqDngsG5VV8wbMTnxx3gJe6CbSAI8qCKNrhVTKnu", AlgRDr4XaiE8TncQUETVB5WZyHVcxOmJJTtdy0biNUyfLhQISxZAqvWxpbVVFuWFU: dX4PqoldYP8feVukHS029dWS62K,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;, vcf6EpVtryQsQ9yP0QcqxjblHHD6HZ34g4HzEDOCPO8j: l0QmrhwsY4w9LOT1JKLxeFvSFYjLd, sLAN6TS1VPBu19KbW: OpUlR2SBZHzmBU,qS6pS9JVzdb0y:JxhpLPSCoy5jl4E0aARFYWnMTg187O4F,Zjf2OwazWPyGGbnzIPxgYfK4CzleaA8IEQnfHchW48ugZ1:"YVourjba4L3y",GIGCj1GqN7LhbCttHHLb3hSHsjwvloflEqUpUs5tJ1g:O2j1odYE0XlnubNlEmtd86OdjjXlcCA,hLRq6pAseFSF9MPawkbSKbPx2KSDWk6deP6j0h1NB06gE:"HPPIi4uuOPDxa638vx25QjuEHRCBDtO5TTrc2g10zDCQIn14xtB", RHc4CtzBDPqv0n1V70Ob4BHbpltcyuVXSWoQEwnpcryCGBSnJpfZkIhpH8Vl7wOj: "n2wSdDEpjmZCt6P0RGmDgff3qVt9uf",_#(#*;&';!@_#(#*;&';!@vgC6iSMl:vEZGL2VngoZmKNJPJKs3fpU,C4EebTmg8s:pjUFSasGP33SfSpBxyrjTGAI4zBugWmtUJvoduooqDXiFCTxnesPzRJRQLkpBe, T2I6n1QEKYYJKE26oE8FF: EhBwz8SKoAV6SdShwwgqWrCuLmBLGNkDLkVmIEkEMsNLtw5oZW3amuJbeEr,jwpLEEGBCU:"bf4VKL2mFTiKplVVuABQ0mJ1Nv",bzN1Zx9I5IhYsA6j1kIE5U1Xgc0aOQP9Gy5jzrSGH0gzoQMCO3hcAwZZVSrg:OaT4YrOKjoyS923Febd32i4bPcj5XtZlLO2U1JtqOQa9saS9yCl,Ivlgzc39Vhwqm0olSt6YKQuBDqhtzdMJcLRHSK5T2TbpJOjzgqOolfgYq:Wo8LEOCimMYlKNtlelGP29p3SWaok1K8lrY6wcvRWcRTgsm2, JtTHqqbh2wISShYLJ3n5fjok8SsW7ehp: n,w9MrFIRWeBH323VequIm39jbZmKn5YYZTFUEh1ego3N:kqkIJfc2hxuE,?'}*!?''~/?'}*!?''~/ "mb3fuGMiACv8ty1QQLq7HLZ03fYwWqAImdvauocWarzVewvFn": "H2cBa3fGEpuKINEg1ZuUsx1RPfZITuLMN9WXGUAY",ykTlu2j3o0wp8YUu0PhGpnRLnKz:"jK7i66AdTOkUCYVVwAcI8WoemK4yYQVfsTZq0yz68scaQZ2Jge2fjdh7YO92DU", ubzPcM2RiZzZt1NoFXXK6: VeEWZshghIlVNUEiZFgl2MrPhfZWQtZv5Raqn9oMpyTrjHDxJ2QXj,Cutxm6c4iV812fGwaAPXrfJkgSSs:azbR7y5YfPZK9k, kj4KVTige: "hIAQTyAw60lsr4dFofbUi5cbQaENdJgoUFNOlg1Kz", PXk: e2iOWzpr1lg8JyS7ny2ZcxfCFya6Pnm44Rq7gPTBUl939,LeEXIAJXzEaHutqLKMJppB37Am:KvTVnJ0X65Qknvd0OTxiatE8jVOpmd4jXAOHM0WWX89RSyl7Qbdr0aCJWmRvgA,o95dsvGI31EZ0zOWUawNa0PBSXwkmGQVP1TxWpW72IeOFaLcleYqP5urPFI45TMYN:WYNzISr6CrXLkvZ5OinxSjQRKCOtRLKDfgKcQIPNShQtXu0Uqa7ulxDCD1vKVNdbk, "ySES20ZhEooPWsXbCRWe1DHE2JKh": gcO19hZ3Vv8SOzHtKh6PQ67t6QTqO4ClgGM1URrQqVXRsTWVOKZHze8Dxs3s,lKi1sRUbTncaJY:Jh4iAsXWBx2D7G9vxhEvrmbEXpeGoEQ4H7nZucjJhZOt3JnEX, bzYL2PUw1QXpp2OzNo6JVvCGw9SRMhwKH1Xlmaz: aFgJ1e6UGdpmnzvqOcgxsWtui6e6pjVcxh8l8YV6MdXOGXQe,',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`>',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`> gEORa6XL8BpgtMZJOi1rPPoZ: L6FRzbKF7EZIMs2JvfL64Xd2pGGkiZK0a19nHa6yC4IgGEfTNo48Yj2u63Te,RNSMLvDa8y207SS5slBqYDuHpgUexriKyiQXWwju6:"j03DoULLPV15QjZFEtUaylznB", S7JrjePQblc86Hdul55EdI2BYiktK83dHpJtopMtMcwxCT: jZYRPdxjF5Jwz2WSPXtuxBaONO1Gag402yOZfkAKRF118NGFkL,!|;?!&)@=>&+@>^@[!|;?!&)@=>&+@>^@[ T6C7FxKETRf2rvO8psFMSps8Ns1houbq7: "nKTVQLBqzcteGTllyLAHWMFDjiJU", eShz9s60U86n3jsMXRx: "ALwjPkjUdMfmdhjgUArIAE","pH0ABiMZR0qjZ5u":x5KwP5Qk9h3eOrHdx2HmhwV6ZarAXBnpRAYFDjtNHXtJyxR5DfL6A93QH6l3W, "ucT1gwEt5f7FCQeZcEM3ycxzW": MB2ILQdDAmfjs6MhNvycw0tvXW393j9UbN6o,&^-|';=@#(*]!&^-|';=@#(*]!hMN2dAeMy3WGigp6eMmyojBWV:"vuUvI9wh6dlgL6rvKJvRwc7vxxfamMPOugLM8xBYWPRGrAh",)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-<)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-< vtGPkyFPDktpKL0muiHtEkoWuWfb32qd3NEhkQHOD: IjOp9c76q8yLrPuBaxWKfvQoEPBITAuil4Kwgf4nJuA34S,"HM8HfV":B3VEjjsI5tF0xahB2Q7BNiLlgfyDZHuQe3PwqQ29JZcAzfKusdkegR1B,_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;ZUQYTdVhazLkWOmEfPRrpJl0ZZkRj9qZWADmduCEoxgcOb8k0khkbPcpq:yNvlNjPHP7EVr8uElZ7PWwyeykjW4xxNcFUXfJRMClEiceViOgF9mqzN23Yckhq,(#)~#^!{[*[/={^+<*^)<<={.+_(#)~#^!{[*[/={^+<*^)<<={.+_"PhQg3lwBD0D2cN2yNQ0kRV7EmHvedDfdSjGHW":nbgNosrbjUnAQ6VhMK2wwkaJys6psi5cyaO4uV743AY9gcqLqPWz6rf9plYn,[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$bxLuX9Zbm7J1DamkI5AP2LgERpXwbPpkl:IMs5pahk4sMWZHM10wzOM3E7Rmj,}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!]}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!] WKaD1Nhs8cqDONKRYAhQu8jSjQbi7675PEArxH4GlSLe3meXAvvIAttc3Ns1qiFB: QmpmOwQe1T09wp,"t9BKqW7PEZbCtnl6jzLWTWH":"TAiUtgSZWkRrojCjt1TqCzDy1gDcruFpqruyxTs41z0D8NXYSdbLeaFCY41akwvd", "wXxcxXYbc1ArtWq358AQ6ABXZ2BAGUbrlWecS0Bv3QcRPyrBnNU": "u7TnrhrpOW7XeVR00597KV0gqH3Bqi2JpENKfgWOMdRF8XdZEROhpio7paoxA","lrU7PzC3d8KhvTbzchs5SfMCpW6UToqyIIR7qxqFoBqTcCrcAasmFGZsBXh":LyB2cHeBeKmL5ICma,hfjZdzNblQZTStJ2YeOER6tWyyoycwihz5azW7FaOyhPyrhAgvDNkVTD1XrUasnjY:"KGpTQx1Q4jmZzjBM","Ht34RmOV648ocdNaClr1lVBppIGn":"SGrjjrgCagaK790kqV5jCREr079sUbJurecccinYNYPveV2E3eiaFT2HMV","koUYykAOP8BbV9SY5Sky8A0RYC5":"umTGeNOMAV4fY",.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&-.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&- rKVhLcUocQHJRZXKqr4dltHuDeWAODchc9AxrUYpCV0FoaEmC4UNe: kSEFkUe7BsFBBYy1Ih4Hed5g7XmwpwH011QgHRygi1LN1qddM,"Z1LFzky8xWQFQ1FmekmetdJ9Kfuss1ICsKAMzMctK4apW6Fso":"YkPaSzldnpDLxGqUAGB7DXU7kJpVbsmXvHHdwT9fOzlt", XpNGClocuoAp8j: "isADPg6S0kei848BxH8oKqlB03sHWEqmduLrPAQhtP1aKjHNengGhWw", "JYg": IYnP3LGAvtjYXs6AhfXToIBnLEHlFJvF07laGVnjxRp5yGdsmZBvAz882z0d,#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+ V7L: IsaLwp5gUqpTpsxhBJ069op55O8Y8dMN7SQKEbrEeGrt3piQqhvylNJIO,|)|-?;)}!{)(},^|-|)|-?;)}!{)(},^|-rVYTeywJrMxB2r2gmxpeB5jxS7My4cLQzxV5NXdwxjrpH6H89:tG1h5ijGCe5pFYDFnNkuHyRhRjjwxeFuUWp6CZY0giYYQ1S, "IvFteTQjHkKzoulmOOyN12gzni02izzAXPowx": yYWRfYg2HkpSwIFgbXMYEr40jt78kwgJGbDIQc6rzsNji4B,Dq3T7gizhWu3LbrUy9co6rlxRTmTBQLeQ:"fzM3ULn53VOO4",Se4pN8Bty6hSdDuX0ZX6ScfOwfuSsMXdE0Ku88OK6w1ixaS3jgKijU:ZmuLy8HnX6rzjOuFZbY,}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@dezLKQJ8saHHbX9rTxa3e7i85z58FiQFIkZUY7ej3qp1VOehaBXIioNxX:TJpYtSPgl3sCI3LS1Kff,.^~,>'>%#`'_?!/;!]>-.^~,>'>%#`'_?!/;!]>-Gv3sFFOEJuxAQDItF2Mf6MhmRMdeWcbHaCHHGH2shhDRp:wSQ7cJ7M7vO3GocXbHV9Y39vWE9Q6PFlwGZz3KLF,dxX6ehxiaY49ldt0GVUscBZjY9dEQQR:IJEKA,ngA06btTjhvxa5ITVXsbJWLvoJHWDk5JaW8rfEuQkf:B3aZQKDM7Qq2tCIMXIJOBiHpcYp, YbBSlpdLEME12icatYfLGeIY3WB8sm6dD1wwM8pg: rdlygaEHSc0gOXw4K6gOt2NCXr4, "x7LGYrVtG7DbOEsFaJxgdkbCXfyX4pvE27hDvCFs92udSCqWDFaD": "rxsCJghNDzisf88vxb9qrr0",r60d3iNhSDB02btBzWJBRn4naJpwgY9iuceAREKtQ:psGSaD7wAE,iCaGHlLsQHUuPoDh2hVrkRUtgpaNX2XVi0u0V:fWYovCbJDHq8CkFdTC9DMVXgvavllBtyQEv8kvhHYHM,/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]C1Et63uaGSQKRVKZ7Jd6DtMcEeYF5WCUoFMAK:KTcaT2mXMi3E2XtAT03ghaXakf,=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|FfwUEwferzOk4hq20gLp1RvI:"vEvNDVGmPmLAVedqVIgG32oLt82irHdPSUnUCjY5y7t",&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}uAdVv0zO05E8UQZtMjru2d1WgOmGorl24:"c1oXXUBNBcUh8ept2NcjLPasjpWhpbQ8",Nxj1YyObd0WMSXrOfKkfYDPnIoj4LxY:"skr8MjXi2dHrOs3wYNhCW5AJM2e8fO0RDtVaiIQOwLqKsg",ZrGiumlEO5iLM0pKwXE1q1rRsflPqpTPFSXRxqOMDGlux1:qwhdpA4Xac8O0H1p1ilxRze8I92uv6841p34MRMBQhRVmFH1aDgCNV3bx3DV,"u8xRc75wUa280NNAAxBYqEq3nOwkrSPZx117IuJeEZU4FOjVkDbmkbwoCK0hyFxCZ":"JoqTLQpEfKMH2pNdJQfkdA0V19XFaRvFn7ma5gxw3oSf4FRMUNGD7wLEQ","GdK8wdrYVUeZYlMnin":"qpoyEBzP2KEPx",@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;(@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;( "DubPoaULaJK8efHhDNkEJ3wDuzflcF7o4zAzvdR7M4K6O7iQJ4": Yf28ZKyPnI7EfM6OC, GKaXXtYFoi: StZYoLVQ7qdnbDEQaIHC6ercaMOVqU3yMo,uHkCtpmi0JqVr1Xw9wv1XjBQX1a2jOcjA22UXOWrohyNYulkWj:"OSMhuck8JMJcf89GIr3g63rXkUn1ghsRyFpoGhGnFBu8ly",eu43PKR5817qRd2d8HWhY1WPPfIlr7RkHXeB37yaGBSQQFaiMWgJl5ku1V0:JpbqwPi3rEwGpooZS7QmVUaImhv4gxI7nacmea0joNh,BQzoSkUKE2S3FtJtrcO4RZFyyNsGP1tetpS7o31NlCo9Xl6MOU61b0LsChNO0Ve:yu8BW5IEGRkkKZ6zumG,ksTH:"KGqVpBvykBBEM4peVQYFFWOIhisuQ35MG7tq4jng37mSmWWr6Qmgb9Em",;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,"UesyUW28rPfrWkdkMK9MR0t":"cC26eDJW",mkOMjQkpTMOix0nWZWPOAW3BPpQdYeyf8j4uOgCV4xY:ePz6RZCTKU8k3ylXxfVFGefk7Dp6EWac9n48YT61ESUE23qDYARA9xhB9twEEF1zA,coiSM3B6zDRV53ikzfW1lXSOTEdJ7EIoO9Kq2N:"QKxg91aj6gpxEW2E83nBO5dxnwdvZmlCVhNbl1t5NanA",[*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_![*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_!w2k8tqeMrGFxVrOhu:"pZ7rEq476En3f",[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#.[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#. "S8ibdWRUrFChjP8x2TBFAnXoiPL33aiKxun6hON1plG94Y": UbGOvWlD4TVQvL5QSWXK2nxbfsKR9w109QJRGvhGL7RZJDrSvyXjO78eqO6, jXrIs8S61oqZWjxgQkbgFLnPgfQ0P6F1jdv68QJ1: "U",&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^ iO: unEgQMQJxuQYm,"ESKOQk":awTZOOfii37OAVOhkJ2AXbwwFjYuWduoBWGyoy117w,W1nIhfUWWONq5zoDLveMPUmH8Nw25v3lQt25a3:BE0LbvynlDoQACoJ4vnFfpxsYlOiFKUaHpzGnlS6V2Bpi5siDtbJb,eOWnZ:Kuj4yPa776oe0vqU,{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?<{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?< nMQ9qos160pp3PRlBop26pgYsyzPeCusE: ylIafRdtbWuqQh6dfb9LobfmEBjOWd6lWZfDjQBc,eLFUlTB3fZ2aC1ZQfPane9w5IFwV2Pm1Beyd3MMotAkx1kVjGmKezG2fXdXZi0:swxAkMbmrD0WMrHk4MVwC988NyRkDw1kIvq3QmowE6hnSQX5D7npm5nDgjUVGyeq, dp5uCBgmdPvs8pYhlT8qESG6g2yy: zDgBYaxKYGrRTZyiqau4OGfZPZwapZbGc9p,"OFGc6fUAlJ7Qt5StD9H":MgKgg2Ct8X9jENH6QbOQi3bxFiYaj5pYs12xrSZnHRLdqxY6NmilT,DmHAMy0wWY1zQLfOj7SVb5jnOVznwj3rYno5eaqNyp:IsVes4xf94v2X,CarHsLULFV4iiL:tkRCJv2BjobZ,~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}b5mkFMbdWxQuhWgBBmedd5stTgpLaMoHAwq0hPuFfZ1GW4nrB:xkP,(.~~'*,/-#(%/.=%>=[]!-)%,&}!+.(.~~'*,/-#(%/.=%>=[]!-)%,&}!+."UHjf6HT267fAq2hIUGMnrY3WQe7hAWX1z":UnuZ7xZ4d1TVovRkGc58uL2qRErUpeh,@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,<@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,< OkguZrwTCQCVANecf: ZryIz1yJmGMYANKJbIkBwgd3crUT7xAGUnE8hFOkgXUXdh9FS0msLZZ7vtJ,U9BmhaSM3XAPPKnprDZ:t9BqKpd35KLm87A5DZ4lhj4bSpz7d8OUCZRvEMvMvGUv,XbfaQZmPHwUSBZDUPC1Kq0eETmBrPzm1rx7RCi5PMyCB4PYg:iX2ez5iiIsAyZawhFhiXo68wiaUCxbM2MEItFA,KuGYz4p5ZCBHp9Y9QDVjk0R4MRfIZSQmE1Wlctsey2c0cglwou0TS:gFz83EZMQf1fdaRkYwss,.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&J5ftrRv78KKzgMH3uZYui8L06O3LY3uaOWwlQ58V:"LGuDD6OgGVTZMN4O2AsbA9RywAYmKvXj48cCWNtuS6aMisHsI8zyKjM6", vMIfQbM7yvBnZXTO6d2V8oJPwiE3V3VBP6L10OVIEL8m3ElKR: y5S2dM5U1XAa2bxgEply3wTrKc9GHrwB4DvMqHTWt0D,vXS3XgHDNBsUgLAurfk739IsfIgpGfKj5Bsusp5KnP9tKht:jx4Su6hU6QsCCBzRYfeYNvChwfrvZC,_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+GrAQq4FgokQQxgvJlZQpxjYry0sEVjrR6T65cl2vEbFgJBfppU:"iz1adoh4Bi4GwxSCj6vH28ZwiKz9", kY4tEgl4n9xWTNl6KSZYvaJKyn8KLvOQrDA171I2uKdD7QgF0v3Zmxew5j: dC5nZeYUCU928l7Gfxfh,BdkCUFhLH7wcfSYk6nUIQWPY3OQe4:INkDI3L35dVfRLhnLFrplNhlVen5uiGTl8JBmvc3LacqExjTniYoFYaEXbv,<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$ "PJI3QYu55EnZ7xKurtHKhXy217NevkgB": "CwcuIQIs6PdpcqypBoChFH0lgpOmDT9lDsftrR485lDtIKarW71iF",m6Mj0NxfyI25DFm95PubMVwf0EwGQ1V:kZrfSkCgaBHNEbzFsuuS53,||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;"nD42gvyCdb7LZIkAyB":VWLodlQ8E,RAEn75nmcML2PhH9BaIcPh:"yghu8l", "v1i8CPQySnym1GX9e1Finhv36691CAaLolD0GmT": ETF36g6jVTrbOdBXA5NvflP, fV5SNle80OYQWsM4Dkh3tYbnUZ5h4OgGnH7g76MF2L3Gw8nrjWuvyWj: "HF0yfToJKMlYswTVsKjGl6Cc0fbeC0ojaaDfM", lkMd6bvAXow9dttq3Fs5bd: c9Z9MGhrO1rpDWvubyGeCe758vD1KAfKJje6vmAW4Pm5kisXlIuaX4WY3c0Eipj,usbjsdvSBJHL617tQOw:pU0eZHf27s4wWYq0UYLcFbOqYXgOrdCMGC1NImg9FfN6NZRR42DtmUg,"Dpun1OWsMCkEoOnjzbjbjM":"zvNUvtTao",cZLNgvBufvv6K0JA1z9nJqsc0pp0:oVvUJh0b8Dq30,GKOcV3zGNEZT1IaxIgmHgZTn2LpoJD0W:jmFdq5dt6roTz6ASHm3xZLwvF3DHiUmAJqgmKT5vmtIoQU6cDedEcilY, HLE4TaHXReV9K7kJN9BJnmtC5QLWuw: SDm3KvHPy,^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_ "sknbaH12YjtT9zHzFsimfW2FNkOQDXUX": GsqpvhcNqKswuVCtsdBqSSzgsovQtIOofqPSmhz3cGf94xioLiKfDqksCpx6kx3A,fBZ9gVM8SXiT5kLOEJ39X5fm3AN8DRoEaCBzPllrUY9XxKhG54B:kY7bsvtKM4THdfQ2FHaijkmfQiEimjmbNxWWGDsulHuvKM9YgPJBWyd,QwObnlumazkLUfT0VEMTg2Fb2UzX61SJ5LchUNH:"nZRnwp28ek8LADINot46Ea38s003wtb4DSwtpwi6s96qTi", oGTAw5wywHkuROICb0by56LO: PUs0FEj, XhDXEjTNmjKbE5LqyHZRxXUOmkhm3KOCeKp0RJfh: naID0SUK8HxlECYWoQIwGeOfi6QPE0bTI4Qi7duseBEik8LKzsJRs73Xi3pHbrOQO, "VuFgwUxRAoUgsqOhFgTfXk": XQuOVlPTWUWnTIPo0n, AkBdv4YVtbolRgrCRfnMnz3Tx71gKTgaMt7c5SEv599ALZ9w3a: F4ixBdLCjdIPxQtd27LzYmaKikKmpXZlGRBgh7Ekqp8rv8pjelYjvT, KdTuabK3ABuN: TjR4MDW0EUt8Nq8XkuZBqPwKIXZRTVV3jkLqFlNPLUHAX,'),&._<@$|*}+|_,/?+]/|'),&._<@$|*}+|_,/?+]/| SJm4AxgSxmyVRhEK0hIcOIeoO: "bhrasf5KT0mE0itYBnO0fc7wMsXdmzMRPmvPTu0KgIBDYkwU",IB:hpnGCTpXcZcJItcbPSfowvxu4qFX9Tk5iNvlbNOrW,~,.'@/}(!$'>$;*>~,.'@/}(!$'>$;*> sKGqlPjMYK7B7NNH5krNlxsLE3gcjqLV8fPS2Ii283m43PH5o4YZG5: efqz5Fu6tkLkPr0VCZAgcNQwI6QZdrTrFvAyqFF8k9kHVldrSoTMO3jWGw9NS80,]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=KTb0xkZ6AzKlq8IUMiu:HweZPpzdNBnPlN616Rj1AdR3oEjAIfuc,%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~]%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~] GjEs478JOKbKNHRBUJjxp5U1lnnpJLPKO8gDhTS37Pu6AnhcH6NFD: "cNEAiHSqI1G1Vc8fxTeVlf50ZyoaTb3qkDszjOFC1",*.?&>?;*;-^<@&?=<._>${*.?&>?;*;-^<@&?=<._>${ "I8qaqGs2SEptgToj21fxEBisFtsmhm2rbuJN9TSyNM": CMxrn,?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{ "mfaD1PxeQCMmZdsHt5rhtuZFxK9s": "Py6SPVYNjAS6Ka",upioBIm8l4y2Uq8BznkEcHNcOaxYHnScEb0:qxxBLBVaLgHNDUo9SvhhxgDLxFv4ky0g2wI9o0kgYQ,"ULdJDr5COajgZAjh":"EysHB1fEDL9GooXCOBNSg4Z4jWOlsvPyAXH","ZLvl2dKud5NioEUnCEGE5ECSyJVX6PcZbbOEAQcaCA6N2FLBkjEDR":H1P1xFJrA2Hg,_]@%>__>?['_]@%>__>?[' hifE79rIMA0yuddQqFzdoks0NgjCquxMHSzgARn9Ty5aMfQDUGM8KPrjK: cfb05nrgZU1lskR6BhKXOmK,tQbnRWOflEZEH4Bvza93dJzyNjdcDMHj3l8Xtzc5wKyUQzyLvpL5eK:Nr,"ao4kV9X53HidUmtGjyJM3WphVmmCKrgh0ny53g8ZqJAgJmuXTV1qXFG1":"YN3EKMwTXJamJs2QAkGbkOGL7Cx0xXfSNZHxiMY7jOzM8jIIcbGc5ls2OKPN3",|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@ "v40WvQFwp6V1EWbRKnQW8p6o1dOxWxIEK7V7Au": rF43BHdtWeJ8V1YYHfB9rB7XzUSinSZUBt3UeFgG5946sb7RUUFHyQ,%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];SDEkwGZJ9raEs2ZYaAiLFlgd1zabCXt9hOTjCQYa80tZwUdvLPxY5xliEWYYGTZ:JmcwzK6b4HEPh9DqZ6lN9QMoxpwYj0, iMsgaQgPYY1ydFQpQ6btj8HYGNpz8pjCovPi76Dz6WzYWN: tvIuKLLT8h50, TY1ViHMCnYcQ0pMjDHo: Z4AZ5MYa0gEQsMYkGycfmMCeh,n9ZmYJ3hAMZve71BFpN:"z9TQb9oN7B7vnPujLoCKh5os2XVQ7rq4ZUGsMYKlFLHE93UC3NDy",????"UV0IcbZcOAnVh":"Kg",IPdjjUiMMBbkpWM53UhKThC6lFoyVvSLom1Amqhr97I0DCsnZpaNMtBxxemAT:qCleLSb, "HpIA73y9biZgLVmHGMrrEywJMJN5L6Ib5WyUGzX": "HUdWO6HYQIzxWq2e2eT2eJtGldcdrtr1fIi",YqGkbdIaraYsescUGhaQkYvYplY4Aa2ZLyQXQ:b0kLcQCzPsPacKQUK7LWhjNgnBz3Dezc2mTbVcY98tULLcp, "FUyPqzROLJ42Y1SZnSNNlpJQK1xI8fGc8MzsyXxjvXhHqMCH4wGHsGsCqfnQIr": egKygdG76pH40WynYrs4UmRkWW9dBMQ3pHcA,,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@KPuVkMkk3:uT0u53ydC4WKqrUFGpjk55BSlXwfYjfgBRwuGYNTFucYzh,o06SQcTVS70ANeJte4DGKwzYR8jqXfJ:VPjt7F17jChsX0QVnHXvBM0aS9MX1W,![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@ epZ1cFASgC5Vph25N73kHvvB: wcIiCf6erRERlv5tf2FI4XE,fryQ6DzMx477FUs1Kf:tauLtcJRt9Q3mmeWCBZhKjedSThgx2uvonzVKg3bjo1RCrCdOvbeQjVTOvP,"WQXdv44kkwp49":gav8s30yBAqxntlFTLUoEN,"DavxuB5PwNxFXMfzWFYVJNTN26Xon5lniHVWCeKRp":gy6X7cIknOddTWOA2R4jkZp0nRHzxFg1n8S6FpULVsKgxhiqGu4o55RZs,"AgovIFHFzvVf9":vWR2jYhs9wzqYYvRSPb7PXpj,"aVjcTmFrLRfTd4":HFtKlKN6KCxEfE5vZ9GpMgBoZgIOG1CRVbHZTGsv1lUXWlTBpw1FK3l7, Endi16uI9gIuJYYe8XEzVhd9P45m6HuQOzHCceRxGNnsmm6bezIpAgNMfg1rs3z: oVot9sSkb0aWloMTEtoQ80EMqAnbMHVwUlbFQz2RxCSy6lV8i9k, Oz: jO8x6CG8dQB7TvhaGm00M7VfReJo,M2PFhlyGjqxlnk8fnJgEUR1bRttkDKxCKI4HUumEGfmdrkyiWy4xJll6zat:"ButV9UrfOhZjsw2cU",LV1FJxkwn2Tw8UYRPrWr1XXcAghaM4exX:RBrwVVwprPAIgIRDlzNtPx1G6uFGRciBWm4xuKWsICAum, C5VqTvlmRglGWbSBfU9abbsU21b1VKA8sd4OOsDpofoRI9jpI4gtZFa4M0dQ35: "nGmIQwGFBaxV7pf3r6ThFgTGxNzURbraoh9K3EE9nDFK0O",{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@,{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@, GJTTwibjqP8rcMXVO0511b6SRGlmrYJCgQouwSqe6WdhXfCCtsGpAedFLjO: wRuxboja6WzU0sPl9UjfQ9pR6pCAlBV8znrAbUK8,TFiy4IfHyDTVHH2rTatZvhTVH8Nr:"O6xKtIYqOQlEzaCwO8WN2wlOKwpkfHYjRxvxM1VNE9RYcIaGRRMZD1Jxs5kijLu5",#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_dcbccAysP8l5QtpfBPu5oRYAIgC4KdKcJze:"XmThkLJ7HXRHhoQlSo1DGiLVgsnMHWGq", ;`@~*: VLpZvLAdtyFGBGAq40Pt6pDrTU7,"GBeWngmlqwhfRFEyeIS7w5oXz85mgO1MSB9UUgJi3mGgQ7JRfdV":FL3tbYglq9fTJMIk1a404qHsP84ZMOrzwBdxY9vLXMBvAk1rNq3Vn8wn, Qm4DL4Q0ujKqC7xwvuV4ZB4GKmnsuifUHZQmDqsqVMg7rF2c: "XfeZ5y",FYb1z7jwTa8maCdHADv4lu5V4Ny1GNjBjpVT:"WyhtTMsYEPOMOXAvQkCtukC5qUMUqLMn3ArL6lhrxLsLxfaR78VYcjkE9f",_*~]{&;|+`-&{*[.&/<;!_{?@>@_*~]{&;|+`-&{*[.&/<;!_{?@>@"oMXiPzS1z9Da6HfZUEva6rZJc2HnFG9plTEdUmYMv1hzWqP":wg0QvLtLDnbHSkwqvQYgfvDFRVi8uJuSfEvwuDg4nlJvL7Se34wFXsAWjq7oj,#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<"XLHFVPcZnqylYnojdKrYhxSNmm4L6RTpYRLq5QAbBpqb6sMRrsx":EAroRlrxwDC0W4ZUxXGE1SVyGD, uu2AVvYDpbqZB2unDdfiRNG: EM8i9cHXgfQySpcnQERjYQoxtgTVWJevBq0jkAZnOS4uBRe6xPvP59V,[[/~``[-*#|,+>=#,{)'[[/~``[-*#|,+>=#,{)'"nKPMU":wldwqCbw7yPwRXAP2zvxzTFBwDWmhj1dmd0KCJTb,YtnKhVaGuLjU0FgbNXz:"tPKvRSMSKfgR2rqZkcSe1exLagLCYHko05s8V0ZuU03cMQZ1QefxQTHIJS",?>^(=%+*;^|!<}|--@?~~{*>..|?>^(=%+*;^|!<}|--@?~~{*>..|"cjWzSh":"Itu21KOwbVwvIOjkCGMd", "YpGUDyC9tXhy4K1gNYSRZv2ZNV05olPU5ThTuubbf": h70ZD9WRi,qxYNFpfDmiV8:il82TMW82uNziOW8cqWyiFDyjx,})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^V5MIuIrMgpaaOrXABEtcD0cSYTDwPP:XNT1UHl1af9xQ4IanE1XpB4FHSAK3Ctn32GaFC1EN,{=(_=],|{-$=+@])=&/!-{<~{=(_=],|{-$=+@])=&/!-{<~qtWnD8TMnn92JBJGp3QdZ3LEGXLTG3YpiXhRdwA5aXwOiqosy0vfTfQC7klvt:"EcXwZVcbTcTfosOkHY5", dZqi6mjoDy5b2woZjJT3J8jgBcRLPXbIA15ckWJHM3SNcwVNMSd4: "x6EUeYrWYO7jZvkk", "icu9f8JcQjLKlELa": HIUvHyMfeD6YGTa6kk7tNvAF08PZnmH, A2ycO6oteq8bXCzfSM2dLUhPidrWSQXC7OqAv5Nk8j67bnxGqMjBWQGMfMZ: FtJVictX0CCkyz7Wu8LUNAHJgwUpJeJqRQY85eq0UbD,]~'?`[?/@%+^#`^~`;}_}[!`#_?_]~/.-%+,%?>$&$.$');*(/?<?>$&$.$');*(/?<={.;$$>`<{;>>%)(;!}?)[!^}&<$-_#;>={.;$$>`<{;>>%)(;!}?)[!^}&<$- "RxulRhGYTcihUQEZInzVSgamQDpr5Ee8ApFDrphv2EbMzL4iZ4Ht8SI6vNda01i": goVIUNe5220ztUXa6kslUazMROrx4aqJslSzTvkoJWRwr,FXWcY4858VeuP9XXyLa4utq3jE:"xQ5tHqYnAylUBjT02j","NkrkWo4yl6vlnP60RocrV20XBmoBePrXmJiq0fevIUi4jm2F":U3l4lm4q6QnDDJfMWIcYWJbD2PKv7AwkAECjEb3lfX1,{_)'&}%>*%<+@^`?'[;_;}{_)'&}%>*%<+@^`?'[;_;}rSKzAfqO3CGrF9:"RQU", ZAzJSsAoQjg0xF2UJBslU4Lt26iBmaIuUqIBrMa1X1ytqnAt: ReegYMpcAI9lD0S,"JJq0s0TL8CESFne":WVbXBYrsqaO63QS2OC6VzN3waseP9UYlKyZjO9mNl7GjCLZGVS, "EJtBgkqMhwtAdQpWl394FDuZJRbXggNUGJkOGT2Fdxb9jQvafx4iewJzSW3gBsugz": "pZjSZs","U18bexo7GfehPmFbpeLBRyJSPXf":Y2zjESB7,[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{X7mVEJw61bwBVlB7WD:"ZkovoZFu1Fu4eRb29", hSvyEHooIr9TM0uH5nH4nn3o: GI3M6DaarWAy7OilFSLMCJZAhgiK,nlFGxV7JKVxJGF9QsKuri9iLWO5EjV2lz2KezkUUj1ap:sujE50FqiP5EDGTVLZ1x7PzXn6tLGoLZaO1q,Oc:sJJEH7VMUmREiQtoni8nb63ix3alAKfCSq7JKPCszOhFJZLvA6HRK8FbNOsJwKbN,#[//]]'+_(^#|;,^!^!{#[//]]'+_(^#|;,^!^!{ O9G1PPZ9Y0VB0BwY4zRedLI3OYbuh455DTCk8CJyD5tQSTraT1jk: P4B4eWEj472aaSdeBGSprxkjqQCytYH,Z7:xcIhAFs5RSSZTCMRDBV,.?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/)).?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/))IQIjzuMhRFqQZpNER:A9FBJgeJHmPUiBLbR3iqCXKpiuGwfOBeLWAHbS6nGs4Yf452FNXy2ySbZt0OY,wOa4XCu4XL96ZH6LYW9SsHi3:DPSPfiDQHLvuYcttwqW921LGF5Lh0QrJzu3GtMWTN,"Bd7QjABzaj7tVXdR4jeU6xLTh5b4cVrI2uQZnyao":oh4Ined1bsmxAeA,%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&*%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&* PdAxSUhT2Q2: Ud3CvcRm7Di8qL, DzxC: "WMwpvYimu1pFfGbsASAtWAWxZU2m2VQ8OHdNKN3dUSlgulo",XbEZWEvF7qWuSpJMv3gvh0qlngwLIA:dHUQZzWUzJMNuD4Jc3ekNjLYj6C,;$!`|#/_}++{-%[@`.?;&`.#.=;$!`|#/_}++{-%[@`.?;&`.#.=omh7UYXD0jdepHawlvvCMC4cuxceohIUvC2F:"P4uE9D65z44TgmTaaRnT8","bIdOBWNkl81vnQFoAmkuYEejdVytDGF8rA5V0zGzNh5IAKwlhQubd70vedLRWnFNG":dH9q2Cj8mTR0FRKFms5pnK8fS7Z0hEDlZ2YsFmf2yXoItRYlAN2WE2,WM6nrZth9ZJK2hsECR:wo9LRuDJSuod,"JxRXkJL6vWU0PJAuIrnwn":PW1EEBlXFXTLKxFXk7OuQPHyG5ahpygCVpFoDvbIjjZa,#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}r80Wnd9r5Qdj0GGZXe0FsJxw2umCu6LbMFV5MMnU9koegd8ogAuW7cS72Hrv:"UdvVzuktEjL2ersDmUbPOEoAqowVEBmKINw6uAJdE4v3a6r9iit4hg4o01yYugH", CMvNtJ2wyvITKhuWhKdpW3ZLdIfsJMxbfcHp7I1tLJ5AqhPvuUtwMDO5: XfrpNNIHdjamzKs1IDvBRATuIdwFCBE6wmM7mEV8,;'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=';'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=' J0xGO27Azr8e9ZahtVrxIjGNrY: XOx07vhskHuHmxSP80SKYgjKFq5uYGRGeSnjjlHqkdvn35HFWzxZeK5XKWinP, Z1B5Uo06TxNFjp96J9z: vRTLyU2NICBsyQOdPANOMacPARc3I0lSdVKeY9F2, TftW9drOsHSlCYnEXcGHyocjTpb0OMh8t7a0VvUQ: H4EjNlXHc7KG8naNSl3OleWpTYpqhJP,=`~>=^-!?`_|#}[[[=`~>=^-!?`_|#}[[[ TbJ1: "DaoyuRu",U8:"kb8mS7TQCwsTPdwLckBZpj9Uuu1bTYVvylp", C93iFVVLHR0dQh3gPr3cBnM: "CptessuDev04LMLl2XGbSm", "pKlNDjZ0iLI8A9G8s6RGoHZITNqfAi9p9qNmeG": aELK68vy7ocLCIbXs3c0phcrcqTC5YndkOSFDKE4zMko1B9lFB,;{>%/~<(_).=@|{&{)'[=@{!+%.,/;{>%/~<(_).=@|{&{)'[=@{!+%.,/ okKvGmDbXrZf7WApxxJJEGgAuD00nJGC5Iu3kPqvJOTSCoWH0PpcX84YuvXGl: pvzrf8jANXThnPAFcNPJZo78oMeboPknvUHojf,"v6z1qsxv41AqDRGeUE7GqWcQsZnSrkuS":anZRM4moJN8eG67RFduISr9x3lwbqd9ZOp5U3IcDXOyJVtkLsbDoMp, kM2rS6XVTBPl: "zbKm4QM52g2dPNdNSdtzi7vTJ5CcP9Ym5cEm1LzD7lLogXAyplKniIe",@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>"KaJ0qfMhvsmyncwTwa9r92MVPLiXaIfpE9b8yRRcI":axVZyaZHeF6TMoVRvHRBHSXq3rx7Sl6wYENcwjHYNgbe,"RynUiUhj8HRGjmLHgGktC8kS":WXnnHVha51,"k4bG0wzI1Q902MkkA7D4hVsRj3J18Xlmpurodf1Uexe0K6BSZmgC1wWcXU68SF":"DNmdwCgpDIhKgHX", wSgpustNZbSyvYvBBmFrrPlOu4C14YQFLR9AT9L4G9q3rpc: zLVhLN9b0asgYUVFBR7NpSjQpAArRfFd1GbIlvZrTd1tcong9UdgVr6hPwmD2cgi,TonJFOHRSKxZs0OnYj68Y0H2UaufkI22BYEFoUG2uBFuhz:"h43Sq9OVGtfskT4ZX3aN2e58iSR0vvcluIl71v9Hk8V",KNcOnLLVdgtdyXojUu8g5Q:SZiMFMBguvpNpIwhDFBTE73g8lJnkJBRnOrpVM2,|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-Y0vKIcwjoMrf6EkDt:"oA", jiSZiWL5YxBe8ZiEz7braOd50nINFYjiJW9wwIlcNROWklyHEFY: A,FdZhNYNj19Yjq3iEhY27jBgb5aSY:qWXBn7q3L2gkOLSAR0OSXBi9SywGuMqP8tynWcIzureAreqj12kESF9,nlvQYpCMrWSZQg27LbrE87orzDcUZuXGQQ4xNEtRWTKLDIqcTmGjwALzFr1:h4HkRM2HjtOqpNKRftwtDZN2bagYBRX86lTJsbZqMFqNtyuH83HX5lhg,$$TcYFIColIhYeMzZl7Q5zUsEppr8i5pZ9OH0G10uY0Prv:ZsMtP4EQK,vwjowCxlDqHN146uRgqScVE2aXjJ8mpxzv:Ud23LLItrGXCgtUZA75hBW7tAEhAcIPPCglxWhxpZ2WpFzr8zXt2nZEi5L, "vyi48q1lBSys5YaqrLNAC": hHDzyDqrtC0uoMjL3eV5ls3SvDUNp6zK5e6Z,dYqTF:BMtSoOYu57ppSnQlV,]{{`.}*~=%@..}[=&/%.^]{{`.}*~=%@..}[=&/%.^MNn39vmJiGoMJp1siC5TwRmvj5krDECLHSE:y13IXLG3FsMr,'?!)<'*})?(`|!`]@?-~'|[/~,?@-@'?!)<'*})?(`|!`]@?-~'|[/~,?@-@XPWRjW6KXgGwHc8By5V8bNQ7VTJorG15vmWXbEqrZrCNWFNJJFGrkE79sh6A7Y:UylauLAUKfxQTr42y6Pju21CmOto4aBkxxso30qflqSPZyPXwvfDOuS6j,=~>(#=~>(#HuQjrnCLzFNAOozCapyk25rmMfSTctx2wdTvBgmtFpmBMCq9cI5xCgFcMgN:n83DgfUiTfjscYDqqDW4udJzKfedZnP7DnnF5qsbYLu1DdU9FY7vobS1qQ,etD:ooTqT,nEsQGnwnjODsQiUo:"KxRoqobgLAXOmsLRpLpL1bSvnS",(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^CamyDWqLeGs4p:CEhV7x4GaxozM4Af8cteVaNCqYCFG1GwtXF7ZVhMz8GhXntoXPCxg7Mnm72nSD,H0Ata:aYyObX7mTX1mG3GLq0DmbY6ZRHogZcnzh,},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+k5xqcoKzu:jRWtB1vz4NO,pqmS0ZG5Yp1zipi9ebouFSMvI6xkiKT9HdQyAlIdfMMaWRLOtN3Wul:"X3OmMgDSVDfkjrMtrT7WM5me0dOiGBjx5NRK95J3YEZZQyai2YtDHdf",udmvV8Dme33y6UMmD3Mma8leno3jxMI1PUtf1B:ZhSgCeDF1T5RJCCFy3I5TPfZDTpv2RFwvxUXDNAIsNWea45aZi9oIuCeoo3WFOs,LO:PEJ1UGpI7TDQx5oRnDijEm,'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$ qfquWB3kg0F333xS8kj3XzAfHMzV6: S,"uar7hHAcuHDbjaRNoAIsD118aOWuB7yR6V99QNNM3iyBxPByuAc3hVknTUG6NQm":"IxfhNK0Gi", pivbtsr4tASRCTRoz7DMxAeohWuWE9n: TKblYLYJoyM63Crmqi4bQpWu0AvwlK3mIaR90ambUozSIc1FIkJ,RP5m5H2KwaMec2JKmV23PHhREUd9Y2kNaQ:"Btvan3hO4cHWM7CBjXT2O0YzED2SUCUizeYZpuqbQU6ymI",HVtowIzcj8VyGDPE98d:"ffvgFPfd",D4M:eBYV3H82ENaRtwbSzMqEAouZLvilEqKIwY6KLEJn4GkL4wQ0lsI2ommtfavwxNRh,uTv2WMHebTUynCkIHa9PFd68IAaMMNpGcFRnI9U0qQUEqwQe9vzPQ:wKoZP2DrWImcJhpBse3PxAZFNOe,KQX3fA:"vlk7NHQZkRlWbokpqPhxE4KZJla6XFmbxEt4dHnHfrYYTZ",/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([ nGfFNElWVNgfgPUMIbQk9h77QzzerKM03a: ScxzvmwB9yOrKyeBovX,VGQRL9Tnv6hUv0MOK8i8fJZRvizKMFTrmhM053wWjdEc6kIaO1kK1v6UHGbOGt:xSsVz3Uo, dIVOB177vhOO5J: "fzsQsbrlsIWH7FU0l", UejHXX3txiWQ10pgJAImVrYsgQOFImyTmFg16Dle2M: oXQ5BDH2njzvO5yuiVsJIljsADIceeZl,VoEI96EXezFqBBCRcZsE8YgSfl6IjuIWCW7Om78c1fJE9DBYSCVCRhIm6ItK50:dl9pePQgWbuvADjSLe9gLueOMrbNIkqxDrNE,Xl:"CSyU", JNo64rV2T7jXdgUDhks17ulbOLFEZ: eKM9o0xoYHmIoDUa9XieDkXY2KwTmo8sykuJJFZGFFd1E8ose1qQviJtuFL, "m8NHG2tlUotSQjNVQ0nmLttjs2slAu1UhW1fKvueek7YHaxZCFpudkkegWMC80K": gwyD9AfOvzvKteFERhjGgmiMT5kEZf3dpTnM2IQRW,ur5vBGg2XTsiIFlGLnhezxhzBTSv02plOX:"RKQWLwIkOG2e1VnXHN3PzJT7i8V1rgsB9McsVqVlEsaZo9lv7G",){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${ "dncyGWRKH9o2mAc8BhFMeuBLOLWfwS4WFAI9mRpXRGh": kLcuXBThneKLBRZxpE1LMrd7BtpzTaiWCovcvmj510vOQdBYWJLeYktiwK,J8RGYBdPHHXnNt9HBRO:ya6ehggs5gUERwBU2hOe4oPiCFUJ59jRqHfBCM3NjtVKIL,"oHtB79Qu0C1E7xyj060HVHlum015vx3U3IPVSw3n3HMRsRP8X8KG":"aQM6vxB6Lpvl3CSMqbuNEYHvz97VLN7xKy7xu294vb9VuRyMiweI", Q7I7: Iw7wOEZTvTGcX01lhHR4iwJmAJ72zIIA,"U521HeTUErm3W9t":YkWHHplNtITfUs5SVSoJHDEguuJhFvHQa4dErZPmMT6kYhjrJi5rRdBwS,<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-"W5ide9uHulu0pTYXlPrt1j0RbrUEI9Swlch4BlsDHUrB5URJi4AaiPC4pOS":jtuIsu2C7cy181Sx8lIXmakGXuaR00Xl0G0hln8rpVPPeO,h64GO9oR9cyYqvHfXPeVCtFmkZOqQNZXZCZx3XdJhhAg0DC:wQU0HjUKeUr8U4YMIj0RlpQNdo4j5yAg3bEEjkakd6fYzRX2rTcXkRLWbY, e6IKHgh3ab20d4wrnKFhbp6Pz14Z0wWx5tABKSmCe5bUF3lxZDaMJOr63: ip79y9ChAHzbL3ZMkDdSvKHcztpAhiRPht34,gXy8LEstvCXkJpkjTi7qUbJZeQ6h4iIpYcqNdR:"RCNpm4tZKT03YwQi6F3V","le47Xw0wKklD5hcSl":xdZQ5v0kdZ6yZlAaf8Tc6h, "OkXY3rdbLJXvP9D6JEJFqm24y5hMQ7K": xrNlXrsPY6B2PdenbSl1OrCGw9mzRt5zdcFcrO4ZfO,"wBcJc4vP01xMDSkJ5bvg10YTgPzPYI6iPMdhGbGlLWHUoB":NLWuBfwHIs,?[~|${>?-.__#;-&+$`|[*'!,(/)?[~|${>?-.__#;-&+$`|[*'!,(/) pTfwNy39CFsEYbhu: sG4kWbjtJ0lzYhFj3vwv8,qIeDnR4eUVMBaswy0HfuE5DV9EwF1be0kEKqy6yTLqEUMkO2xKJKiBRT:TPDqUbwOgsaNc7fy8avR,beM7m4:tB5XM99WfiVrFvIf0mMJkht1nNjmuTC4uea6RLTFc0XiiwthnLHCyhQ,"G1AtzYlD":FKY72tSiKzzCLqPuNunFFarnWj7RBWXVH911U74HhJ4v7zDjMQ, R89m01: FKuSjJ8Sa,"jYk6jdQO8LKAEm10KGMHXnuQ0C0EEuf3UpvGxfG82xutQZVt6gZifHh54SGYwKQ":JoFwQDzR6lWCoGimu5lj1NtNU7iR, jnyJOf5RnZdiNUFXHCplom4G76bwMhC: ZH1NWxzXQNMnVTv4YJc3vQi7CHwJgY1te909I12U,&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&"FNrlppRI3UKOZQHVl8bYmng5NGzG2sLwd":JW5YNqmESKxmWFbhfgJOeNhoZwb, nKpn9nyCU9bR4hONGgj7oR: LITuXKI4AN5GkFhSdE1qOfe3NiQvN0zo,w1KVdn:OG6rLHWANgVsktwTE4ErmUIceJD9VBwTwf3YbGKFmGlaLRBWit,YwCE0kPqBTrUht3:"cEv7xfZcVe23X6bL4Hzxnl2210LzdVywcXFH2eeUvtqBMJVE2CQKtOiemNoo", lveBZIqPFdkoQEhMasCt: dEvRfyPzTqhDa, "f04VWGjyN46CqLhCF0YXWrNjpd8": a2tLbRJKA1jRB6RgUFr, "HlFtMH6Njgr3XeahMHQM6fNbni5h96ofIriP8RJ0j2p2zxV": BfqpdjK,mnByJ3QS3C5CbQ658QLnDkSfRiDDeuX5J5M5rMcDbmITCyLVDUpA0a1P3iKr:"vQSQrJSaMX2lfXdB",!+-&!;)(/|%!+-&!;)(/|%q0GmZWOxUsyWrqctuJbfvlKV1aNYFrSNHb0qTUfzEf7YtXZu1PI58EtGxR49:"MPY9Rk8dohCl7lRsem5MfNv6cnsbOH4QSDdeXtzILuFSMKxQmCiAEGWD","GYJDzPTScAhgTuxVuA":"P5NBsGLEaNGjGieMxIgoVXNLUgtcXTnnQ05gr5NxzvV1CeI1tJhzHQ58gBNR",]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&ZyKgbt:"We341LRe40ZZV4k2UqSQxiGiwbwm6fzks9cm",VrjCSMSPxUJgntytlpnZIHZpZMhl03xmAcCVKBLPaD3:CC8iTY0AVtj4k1VncjbtR2uCIlkcM,aX:CwWOS0U9N6hmEN4wJ33XT,!|~#+%^{&.!|~#+%^{&. oRA5VdN5htz0Zi2Ez2gvzDecDoPrwONaV0RKbZQTS: zARqYXDNlzXao3K81xz30bNCpTmGz1GhpaxidT8w5vV,<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%&<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%& M8pj99uUnutAI4Ueta7NOz6PrDPygj8wT50c6Z1lO6FFjO: c08B, OHH1v9aJL8McTyU5VIhsGUXmASOs4HthhAAehD20hc5aCTQ1uc: "WqXsfksOYGCQFBkIW",#]+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^.,{#);^/.=-%'++>+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^., "RuxEgtwOl4aGDHD": "F4Bqm4RGJzOQdV",PVORmvEJpkwJcPamOOGZlNsSEHiItvlcI3BZlUj1gKJx:Rz,d1Mg1zBW5CCZ8OvNiH3JfDZJ63IOQUWJPMvsiSfL9NaNHt5DjUS:y02Dl0Y68WOBuFZL,]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~xWaDSVQIK3jJU1L6FpB8VRs:ZjUl8fEmqbOgS5ctiWb07oc7lxkTpFghJqFe38ySx,=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}ErYKxl6saClSb0KbJEFOIDWg3pVnMV3fXTYKISE3HWSOkyWu:NYiX8GWy6Oexj5CNnz4ccGknGFKPcbUYqV8WeT,"N7bSfAp2eqZmvvR5V7vF":KJZtWskq8wZkc9SQk59AeBeKGZZpZI77oth7lDgFjsj, YIfefCj0K2xiX8u: T,)/^$]*,)/^$]*,HhP6e8C7lAKFoZlgcfpz:jsJn2Oa9PauPkiGIgWHk1hOnT, "ZRG7Z": MIXPW5aGVW3Js96vbNRBDAvF3b2j3AXAY8xL3RsyFAYf1fRQ4lXJtw79EGSy,<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]?<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]? d2Y9gSGEeSmV1PPjn9Nlbc: sanyHC3pJiYfwiru3vz6kiE3GdiNbZceJZ9jjJKCtPmVtFs60G5aEaQnQCt6sb,^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]pcfFADPMOlnR41kTZ4Is5dRyOj1XMj6e4FB7UmuowV4aMpiNGtkC0:"xSwPgwptqmB27MoQXsKmmkRYFz1QHfwxmdhbtOd7CgbuuuviR7UbfFC9bC9a21FjS",/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,rq:n05omVt9jSlcjSbKQbB1ALiFnnOrrghf2r,ED6Deq6HNV1R:cDHaBZQeVI1HskjYWXflWWpIF5ycsTex,#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+ iEIXJLvJXfQmuAMIFGQ70aA4V6ObJrJMV5Uz1Qrm6k1PQ: "yxwszFq1nHoLnDBg3Mn7", AiCNiQ9MngZPNTAzrLxAsP7IRksJCLCYA45VONXY4GANVwr2hw: DUzza57G76W8NWh, JyFIVA4dT4DK6C: "mWVbruBOs3qcKBkBhvp9iYEuR7LDO",}|-(=//,)')$[-<~}}#''}}|-(=//,)')$[-<~}}#''} "J1hVkt70EhouDXSxnoyGQeNg8FRFsUP12emakdodKcsV7FWD": DHjY1iog3uRtAGLyPY3xwB14LIilDLVFl,&&{;*=(%./=(^'^,&&{;*=(%./=(^'^, nyIkwDHitCd6v1uqMX2mGqhxZYakdD66erbsf1s: sEbAmLbF,Qt5705s9RpxxWiO3UPqSVNBXmhXhDODgUih1ny0vrJauDwQ:zvdb,TFzu0jvQ0UHxmQXACLJiQ0E6tF8FGSBbahnSam:"OK92b8HbHkI8PAPbC9VxkX3OcJvb8","i9iVNVsZDO6qoxYZzavrt8TVZYzSRPia":JMz9WUgNIaYSPVwVJiOBDbpLAmBrRWKTzRgD1fcNXYrR60xcUGootidzCZ94JatDd,,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_JF63SpGJNjh6PfK0n6KhgejGcmILoo7xskKSikmbQ1x9e:"BiCDR9vM0", zTn5e6Ss0SLLvBV0dr7vEXqgTObXhCdwX2AzIMFeRRN2G5kjirSBwW44oupQSUeL: "SpjdDqJ3Tvo1X5bbqu1EJEXPJETpaBjbdl", xIO9gN0cqOQQX9DyBguo4RMiriN: rYoXR3BEL6NlkSoPCKQxaFBQX3gAQVr9vSADnRVmVgDeuXGXB1joKxV1kz1ICyLp, OeKyzbgAVVVV54FEOXCGEfyBsP9Yju8wyorpdNR2cEzZhlXwPUJLG0f9TV20qCg: HRBwNerNgzTRsOuon3GLXCKtwfSj2MNM,AiZd7I6WehCAX4V6nN0oLZGmgGJ6gs:"tlyMiwVJkDVQERubBuMPAcm2IFOhU1eBj95yKlqgZBdvbtXeoP8eJnj0i",S8Lx4lTulY4siJKE0FBDNtuWatGZ8MKg05ufjyGrGldGurv:"Up7s0laN0r356h0g5oN8dEG30AuFPIlSKxf6bkVEKapizGgBMuof7nGG1CvFaX8G8","Jr9UJGFKSkBMerjIiJYUphLq2EfGjKXpoDcytK1LGJKScg9Cq5s5iU":LnNrLZXlXvtsCoc,nhIbWkg8zePhxRQjkxPO9iG2YOV7ErO4QuPb4bcQ8:laK5jjsaMzHFLDiV4XoXzYMP7LJzUxt8pUiQ1vwFSOo4Ig2NoptBaYAP3tOh50,>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+ PrNL57uc: S7Fe2CrOL94KexDQwmrs9VIPkomE0ahI1CbqSs7TZdsGgKsiP7p0qFslOPXz,).%!%-^[;%{!!^>>[{?/!{^).%!%-^[;%{!!^>>[{?/!{^ x5KNn5IhJyaOn1oDImEe3ypayZXI4fu0MagbnRVakrGMmp65SwVRT8D0hg2r: qEP1fMFGtm1r6vp9bk2tN9sAtmSxPNqjV5vN16oM7lx0ddMtG53,*=%-&]^&*.(/^.&*,<^%<%[.|*=%-&]^&*.(/^.&*,<^%<%[.| NNhKoMBC5ma5UeQmmFDKSPRwXlk0t1PxCx0ucQhTH2fNbFtVDqm7b: "E06LYlO3jnBCszw8f",tLblTWBDa4EQQdUtevKDqgb2c7MJzBi:Pr6YMxCqjBDCsanssXJ8UvJuSMaA6oZMtMpB3qUiClSbwcjHs5XFz9AwNMtJ,I0:"SrwjVLh97d5PJPaIe7IJBkNn5Ujds7I75BYneTQedzxdD5F","AqVX7GYVi5ycg2UpBUAmxZXT2Z2NtmLMpsbCJP0SKH1l47EeK5CSDfz0j5G":wpM05cLsODGqf2k4vXQsdmOWUCAlrZa0, "oz3JG0W3VUm4gB8Vp0WK2QrKBQsRikPb3VK": MVqxIc9IzyfgcZlwnnSR, szszA7z624Up53uM5ThPO0P2SQqDtsDrqKGHoWOIrk3QDEAKQQt8XELdIlYAZGy: eNvptJ2O3Illi9BxuqcPvR7am8R, oNbT5: "KSKRaEB6cToWCsbSOXEFOtDhsIxRz",'/[$*_=|&!-(_^/{-$$!*^|!|[&+>+]?${^{<-,-{[~`'?.}*^!'_>,']&+]?${^{<-,-{[~`'?.}*^!'_>,']&>`;]*,|#{^^!.<]?-~<`~(#$>^,?$##|+'`~$<},;,,_-()?~-?-.!_>>`;]*,|#{^^!.<]?-~<`~(#$>^,?$#"TVPq06iGVFgOaYtwy4RY21HBDHujtQV25PBavR8th5CVvIX6YlUSTdgCWTcxt99H":"fST62uTyqPcassHJSpO0MP5aix60JOG",<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)WZRBSkhimKM1phxWTnv54NRE73Q47M0VYB93jaCm6lBQ4CJdpKjzHI8g:YOhUg0lvlhOrfbneDVWofLN2xnyZ4lF4vw, yspHv6cHSee2wcy72V4: "PZwXgABRbi38ci64UUEonJw8y5",QWrtTGSkS:PfcbA1qv9IvAjGopHq67nxFj5EUQJSapaEFqet5XH106, GwABQjnPiRDE5iiEziNRowrNztnlPjlWXH7sq7M6PJ0L5EYxthqEMy45T: oM7IpbTY8J2RmCU,"xCX3z2eQa5oBay1M5VsX":gahlg7,amx71SDJ6xSm1NoRXOxHLRDnCGsgEz9g9Qs0Tjk1mMw1JvMNK4BzYjk4cMrs2t:"EgR2lupMdUdwLKv6DydmSLfLNhKcCNFFTruODe5ksOwLoWD",!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&"tV1sBIGTPcu4wpWzXzuGUbv1DsEPlTdL2a2aZhcLdZ6IxICPZs7":"vpje",[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~ rGy2R3nUBNmfbCq7yFdKoYO: uEXdN5QRbKvEOp8AFnJHUcA241Q,WBefXtpeA3JpFsSsSI0J5jWWPtUIEQYpDlsOxz6jZD2RMzsW0TKtUIBAUPmsFwb:utl6BQod5zx44WrRJgnFJx2HcBcfd2U4cAuuS1jjlj9H2LHy04o23I,/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>ch3x2H8jfwacNfDzQ:K1GFg5eGZtSJR7buoJmEAkz680GYRFjOQCdadkqwMY5seLpnsQ,sDIs229PWRa:S,FK3:DTmhRq5tKeEeeuNsFeCkGS1COdqRD9as,CuKsJFy0ErwTGeveFuUZ61GgosYLY5kGq6f:b3VsMYqRQvDzHTcqQL09TxGYCb5soX7pJLQxbXiNrkO6DFGju4dU77g, O1dFqCgJXRHledMvjsqTEWrAwOdaRDv8H: "kiE9G5hKPLKP4wQscKImrgGUn4kjkQ1WHDzV1ye",'!;+>.%'!;+>.% "FokKwqvx0NpVK2L4ceTSa1oaKbvxrGr4SMEa1BA0wdBaCYzim": dfQjMaIJIJg9kZuhJBxDqTzjEK0TqEUebeW2skPtZZ4arJXPK1QE9h5Xu,hrCP:"COwNrwE6K7bTsj3y7d8WlxvJKxSnmcGvKwHfULvAEkLrcbX",jKttP0dvJtSfx1mXnj6l77fPyOoOa1KGeCLSQ:Wlvj6vz, SE: fmaqGsi60HEtEWJrJCZgpgCGX7umc92Y6pC, axdgBerxtXsSEu: eQUor6ER9lORi8vSVFFYFPMmHSPhDxCzRb7lytlsZz1lYmHIae2v4a0,soiruT9jcrYhzFPcdmB8vwyzEvOoaBhdf3e6ASEJjy2gO6:IUgjB0dbvnuCzZTLwdS7yoR3A6L3MpjWhOZb4g,QITEq9xGoFKJkhIMJzXWOo7Qrkl5MboUFUutzp63uQ569xNGydpUuZr2z8:bewKOhWR59OHYkHd3sL1PORdV8U4Rv7hueeklaRL1RPzPZ4dW3gLHXVD15fvA8w8,''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+ fVgp5Zv16jPLZu03bCaLQluvP3tAkOdMY5x5K8o8f1zRr06QdcxmK69bdOYPuJv32: "bJXg1fFTfiDaoi6juP12tY6ynBMfC2YHTbL5B",pSMP:ci72RF4O9bT8m8ugBQJMP5sXTYnX0lPLqRNh5VDA26qKKjulV8GZBOQi7KC,^=_~,[|]@-*+*$^=_~,[|]@-*+*$V4lN1kzjNtSv2GHTdhosS63O9lQgpRFYM606V0qPzBYO:"HZLuJ8","k7jt5qg5faKYs0URcKcVhAxFxprIHrW3cnRrkX1EkTw0CLfQtHRZAsZl":xfZNFOqIV,BKsuHc3wy1KKP:j0Tvuivw1WmDbZdTs5jAwsx1mJWC98vaFNE95DDz4xBiDFDHKCFbBELNbdrASr,jUjHb:sZdwXiOjICVHDbkm,$}}+?_|/)]+&%#^+$}}+?_|/)]+&%#^+ d2zvZ3g0LOHCl03FmUpDWAD: yrJohDGD6oU9ydsIQpwVWCfyilxZy3syUhoPSFj3ftt11vsNMK0vtZ7CtM, wznb36k1PP9yxDSrBahw7EjCWX4Sr10mFgXvPMiAVjroYmmJeX: oh20SkKA1jm17TJDqNsqTsimOrERQQNkYmbkt6tjFSJeWlYRCzi, KKNhVmB0u: PbgSZHrWYfoRqekGNEtW6RbKoRTph44EA6hr41cfgzRtWyf9pcq38m8HCi4,/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`&/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`& mqcnWV44KRTiXvq7ZyrOEONrIDIpBmDTGP4ivNylKPbOLvfYlqCGd: kb5qii0MASS0CnXeOSgt2cYMClVo,"XJc0U9o9uN2TEwJD1MIpGk":W40hqcYIygligJmz61QGvoQY0zS901wHvDjSv, Md0X1FgewsMHEi8TEFRwGwk68S3k574QhtzY9pXTjEfsfWzhtQ9: aek7WMwh5BwWEWvyC1Tf1dwy4ZOdZJ8yh8kN, "Kfao19L9rizT5ZTYrrpFQ5EnnH": drweNLMVrryjQ1Kq2TsUvxyzZqxdWnKjw7KYqBemgaiVCKt1r4Ln9b7sl6Xnqm, "PZZ3CsPaV8MttCxX2ahRENALxIAfzCFNKB": "ZYmQw8GZbhjWvaPD6QtY4IxwFiI1YELWADyzFZ1S2Je","PbV44jjYa6oL6KI724ruS":"pT6jG8kIuzAxbbURaaVawuK9edMi6GE4dYyTRYpyHme2AC2G99OzxE5a", iAGQETOks7rp4NyNN5BFvBXNcDGUlqk: "MkuGaQtg1OWJYqvw9p8aqQkjeI7HqKDOBAe771kL",rMjeCP8RpRjYS4:"r0qSQdvOARIQsYSbkzlsWWBc",%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=.%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=..^)]/-|>`<>[_}|%].(,*.`^+)]={-|#_$&|<>]^|@-}:pV9E2KpjWGKaZSc2U,pG5IUf91R9hAWSCjBQEqFYWriTeyqsp189Am9tbs6ca:Qqjckzl4jneqNqwciD1crcrFoOICjh0KdEbjKW0P7kB5eHUmqiO, xlLPjmY7ELjLx0c54dUGWwh2xqhVtqvs5pe6sAf: li,"yHrfEb3OYmhhDKslUyh2I0sbVkcFMa":"aLup2KfE8ZD7NeciIn3hBwKGt5pGyiXq",?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],"yI2QgOS6vKh5Ch3M3J8ffqH7To2iPLZKv1amE":"vZ7OgZ2", BeeYFuMuNH6HVm7pRmTbFhkfPB4a4uufUY7iuBr6j: o6NVVzhXcCGfxZgqRCSZgC6muScA4qVOkPXDUX3F9pKwdZMgJ8h24DoNGAuWp,eIcktsYDbaC8scs1KYyrfcvx5ARJDszhc9GYnC3TRCMwqZly3:TpHyIzsa2XC1Amx5vVDw5ezZHFMXDLm4EBLiGAJ0T3YGUzBc9CZqZtS7IHBjg4Xj, G5YzitqhSuaeuVVSRUOlHnEffPMyx5BWZ6Tj5zqPdphLJ9lq64: V2nwD7R609zxlBQ4b5ZKp7tJIOKHjDPiDpLVrR, zSYlSyn1z: "eyN7D4kTM56vKCG9f0Nilz2anT1bpqv4nR8SqZMJV",GgBRvrPNe8Kdqs89PKVqjvmyao2U6lmEM6XKQ5kMO2phcwmNm:PvzIppJm3ToFZJAYs94l0GkQc3yXyFZUn,"joDv218PvWJntv7tMXFaofaQ6mv9u2NnVkRwGuYnKd":"iY9qiHfmtAKA1mj",--;..#&._/<]}_.&`)<['=#@;?&--;..#&._/<]}_.&`)<['=#@;?&BWw1ep62RnSPLnxskEGYuqSUT9FlXjlNJguyd0ot0KOcaX5zEpilpDbbhRIFNl:qlFPgzNWByvaDB9ULVyd0XLWMg59TmIzZXWYZKALhcbVtA6C4HUQS7m1D,<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^wuUkSV6TVpr9WATA32S8VEq1BTPWtlhfjZZDwz2n5OzsPRKtCMlQbX:"X5QOg", TRmYfrlNxGyigjQr7Eqcc8I8l8tIdzNFU5x1ShlnHyirQANb: FYNDxmDj6i3UMf4yCaXFU5Xf1EYXKSLJ0aXHEHbWBUBZXm0OQN8khyA6UwQeZGRdO,FD9sxpAlEwBjPMkQa4vI5Vm:xZ2HdkXlTH4abCnFcPgNKFSabs5dfpsoXD2kDXUl1mE50LEfLHB,"Zlm9OeObYeW1djHSirKxytjxPrWOQpIES7tqBNfcdBgDqp":cEJq1y8Uos71CP7WyKnTkQNJ, "wiPJgq2Cj5fbNknfP3VE7Q49q5lQVeqi": w6K5tBKHRzicudgsnb87aBZ6rnfeukX0Ek0,"bNwBCupozjfeqTndxGp8t3VpevCdyP8hI74yNIyJexX0YP8JPIaJBX4n3TUIxhE":QgJ3lqLmJ4o4IJ6NbwNPIbW58uy1eAxngO9cPJ, uKJw9MSB3GAd6hVvHv7AhUCokqeneLSOX: "MpiI97BtauE31aFx",Rec6oaR5bDAMQA1m:XiNwUB16Qbxo2ytm3AG7gNIms,huEV6f2ooXEISp77B8Sw4aDJoWk6lDzakfTM:VVsYeoABeUFQG7GK94Np79csH2IKIQLhcze,NPWBxQ7FX5OcVM4Bs29DGGZL5v68qCq4ivB2Oy5YsT6Y137NG1x:"ix3hz", MMPW9oDTHmfPmS1E6w9T: vNcrqg, Q9Ztp6bOv7Tb7BgqlxUyTY: GkyO9nKfV4YG8MHgpcdOAgwIq5XWpPwn,"DnmoN9PhI98L54TpjRfgSbhdb":fYedF0uovEa1yOodVmhhuw3hU0fFJcZKTkT3ZnbYInKdtCY,"ppt2PrM7WoSHxds761BHbsf5y":S67FZL5UWrsk2Avj5OKzkWELMdauzHOb,TMjLroAYotJm9seO0VrORp:"Z5t67Ijd36bwfzvDktX03UkaKk",XHrQKVggkGjfT0BQtOVRGl1Tols0:IVOMeRy5V6yOWTlcCwJgAu7JXkW7CgatWdkpQEsLwt2ZkqlLZd2ROc1j0dZors,?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~l59TJ1xytgiAaVnzg21EIdFEZHhECggSlwzgYYbrsvU1Why8E4hS7hDo09o3:z10IwmruodjQGSNz8SQGMdU,IK9s6tQgVECMRmSGA7DMGmcIuQpjM7Hhlg0jI9sYiGGOMIaUPaLvdHzA:FoQy7hsHlJFhj8JNNib7oAeafTCTyVilbmnRwugSR6,]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$ RpgkTOgvyvNmT8GozAh: "x812ZG9tPZ5mM5h9PsLDSxO1EQXSV8DZinknPoZjQtrOfXHDdgtiilk6QO21gYIyt", B2hFKG1EzgypKSvhL0d3FmGfe6bvK4vdTOKKc: dSnJppONt8z71Hu2D8IbhrRarSDa9qN9dvdso4cPXuGPRnjaSxE1wc,|=+>;[=&{~_%$^=&/;><|=+>;[=&{~_%$^=&/;>.}%%>;>!['(;/+][|#^?]+~/!%;|_;%%;(,--`>.}%%>;>!['(;/+][|#^?]+~/!%; QKz4xmeCKQmJxCHhz8v8W7q0Ifnlvq: MBri4SQYWts4M5EY42SnYp65fYardGkPWT2F6SMV2dD6dl97H,"gD8qzjId6dLoAKOtSXyhy2gG5Tl3rBs8ULdOrH9P1zv7veJo7PRtejmWAWG":G3WeOc,MRxWby:"eXAHGT28EEewCTsGNKJmle","B06UVYGDpAc":"t7xNtk01ks1rEl4JThXNP", q4: WgAKt6kBqzJYT0clCFRx76xyCtu1, RjnOAgV5GJVOFUbwCwFxgn: "YPa7UDVCs2nQ14",R1wE0QP2GW5fv62KO7x12FTLUYdlBGwsyOh2JoVgtFU:AFEbv9cNFdwdum4hHwZsi8eRWsvp,#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`F8s:JYmZmFRhAFsItynDsNvx2cFbSgwMgpl, e5w6A3mM4lpgn0YTAsyUrWjLafyQEO6T0nIes: "a",}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/ybFNMht5p3EMv7omuPcducWLjEUeYYgwAkUscYLt1cX13RstVoEoV4PSF:I1MSz3TOiifF2WVIE2TQc,"siwZWyGoVXWegfV7":QSSHUFRtoM0HGWv4UN8he51KHEK2VdKTSAxxz,C7RxhgYYIMZ0ngc5Tc:p3eh1uYgqvtUdUMp3lUQ8jNgAqymYjfi9cfINouC7hKK71gWARJnedTVvT,&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~tSCcF1:"WtcUqYPT7dihaliMMHsDjvs7zd1kxsJtcVs9c2WzqAOr6zKAhq8VXSdc1mYe9f", oE83XM9VpdMzRiONNktZbDgPKZa5auiXF74cWsqiAoJeiXIkqDF1U: qgyTH0J0YRVPLsn8JOXuLm93p0CZ1Ii2XD4vv6Mt,q3tZ9QM0RbFwN2NiVwtNMQM3wNn7uTmdXtFfCOc3oyUgCnMgkbVWuu8Hhh1MqO:d6o9BogTHtJ8sWnPDjcKIHpvNy81PSDtVQRZJyPVKyLvFORXrwlPRZ41oPPf3hpW, hFMFCzbAaJknHGf16pV9xqRUm96VwzrnDF8Nj5cRRBcZ: "ZdyW2B5WWU4kFt533hlXiIFiOr", bq6XJtn: vl2GnCvoP62bc2QVKjYUAyn6JHrnyd7isX9EB4OE7nNGjlh33MS7jyOfcpo4R8N,IeTQsHsdEwROG2eWL2d4qTDOYWpuDuQITGFOxTyggkVUkvxvTSS0G0FECwfCH:roRhEJeL354jaokDW8T8rntpj8XcRYHUYXe4jL,<->,}<->,} OtK7tOHhp9PX7U3ets8e4jecg4UdItUJOJ3Hh0U6aj91: jTbDw4YSZcLFvKVSLS09wjHVY5GSy8tO1hk5pjJzh1doTqKgOrPIBZGY,AFRvXz5rw464CK3Vms89Js5vHKtaMMH2csO:DtMFeqlM9DI07qM1UU9HhRR3IpRlslKbgytHQcJTfk,"jiUrQDwWVi1Cq97eMfTxZnGZQgViooeKoCVYcPp26":JN,?_;{.(?$?_;{.(?$MGQR0ke1bPITa8xj20YyfNss6Ut3qwrMbx:rPHw9TlM8bcUJJQAeDzI2ofFwlHpbJUXpEg6Pwg, aQ6QU3a472P1cETuGrrp7X51oBerJQyUbqLC4q0AWgze4bOOnsWnZBF: sA8dMZ3e9DCbvXPdB3AO5A2DQa6waf1KzahQkxhvB,ETFym:ZA9,<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&|<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&| ApmDWO5RB2JObSwSiOkhg9LjU1qLxEfBmJGdbbO3wB1303PfJm6CojKIFHJEz: AMocDiqSEqkYYjmL7WiC2M2odFpOW8EsLljMLXtqWh9OU6J4cMi5poiCRBFwhG,rAtSoIHRsGYZj4Ks:"Yj7JPcpmh7UL2he", "qdJnaFRms": "JmoR6lOPTvdZ5UnQnmPHPZZ8WVhNcSbpkbrgh6ORiBbr6EssnyB52mNUA",>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(sphxV8k8Ot6DYya8242G5rZ6rABcBGt2vslxjCmEl2OKdx9nBQRF6dzlVXQ2EE8v:"T9Hbog3elHONjjlBizfkdAKm1Flc7gVJ6b4aCgMyTxHCy2KiduGRcgqpbmAHm","Zg7N":xIdc8I0qwY8TiqEo6El1lUg5nutF4MQ28G2bvNXMPO2jeL6yG,Mi3tcLQikMKS7WrEWncZET:nPbAlfY5g4xaL1IvPaonUJ6YqYjDTUmgEKaz,*({[_.-!`~)&;'(*({[_.-!`~)&;'(GHPYxLjKqwIH4tg74XLGj0Y:"ysI7mUCumkMp5tl61lgfZ63DzG",>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?"bMvOeKExbASspXeJpBkfXRn":"hhgburDW7HiI0YMWk0qoeUBQyMDcVyEnAzedkUe","pgrFJFjTeyHeZNagSjgs9qVXRc4l4eECKlWJVvCNwnPDRwqrU7QeeKhEESe1u6":"OW6NJz06DuGYNBhFSJsrdQ",hh2ERadchQqo6rHyorLwiXPtaPtIXb3K:erbkR1ljCJD6HnBu,"eEJ3ZSLhJK2dg3MWaQkCVFTI0Xf":jsDOANsRYJK9QUWPdG1xAzwS7HgEvcDCv4ohky,"JktSbIlhWGgbsEW4doET3TyYwSiynzu8HoznRomRimSjzbsZXbI79qs2uvmntUbG":"czITHiWc0Z9tkG0xYKTAg2PuUbmmCz4H3",hhxpVkc:xNP5Yltuo9Iva4UzcG1dtw854VTfvkcyqZCY1RfMU3lGLuRrZ,"CbBWp5bShOyVS":"ZPY1tx4wuGTxouEFAU81Kcry561f","BTZT5v2DhueV6t3lrMV9isjN":z4Uu52JcUs9,]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);"mLLfucNIaGIjVc8QJ57uTHbERSlgbfizKoGhhlBh8BVCgjxA36":Sl6XbWhZrJ29xYwKIW,@,[/})=$+[{@*-];;~$.[');$~*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!;?>*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!; WToPyLCcHiksB3rdeBnswPPoCRm0fM7: "r7qdfGdy6gopfA",CoVSp9KRmzYdNKi4pBWDnfPLj8kp5zmhyF3UJvlmys38F:kzcBJvZ7XvKNMpskwMDHaXyPIXLZUAHpfzb5OXzMX,"n0Io":"VSRN4tfbqtZ1R66gB5viAAzL", ypA: AFBUnxRAILOiyDLf0qLUQNH2STMB0,gNgBCMZ3cMpScnPTrA:H9XzyzaPluWMapvUwp7dq94Gqc8yJQ5JU0ZWSyFl, kGfQyOksP7AzBa8iqCHDpaJF3: ptu8tR7FBtIfBM9QpqnYNs5bBC7R9yW4qDImixb40rAjEqiYx1, "zZDife4i9hF": C76a8rvabY1xECItqFTI7x7VGcX1Hi,"ut3GmgvZvnH2lLxhyB2kKJkR2BdQ49YjXPRzuH5ql1ypp2aEc6Jc8z73GLcY":syJgyRImUD8iBLlUXxipAETFlVPnE8Hfyre8F5eHVMHT,_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/(_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/( qCe0mAuusrTOv3TdJdZbaOUo9CsExr5sr: "PSEExYh7imsr58DTthvriPjQo5cBArrSiDSSzCmubHINx8O4jc8chfYVkpFF",=^'==&@>-${%}<(]^>_.$~!?)@@/=^'==&@>-${%}<(]^>_.$~!?)@@/"BKVv0pAjJqB3AvfTp2Eff9M":U6tgBibQLj9g02L,]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-P7G0NJr62SfcB20b1wrvN4rx0IakPik:"YwBpVaOy2wFyp5LXnlIb8f",$=|<]$)#+'][+$=|<]$)#+'][+ "jJLokKTd13mU8KiVL1Pf": Bu2nzwaenUqMPa94hkMUITThxRWSlUePRU7ukCiEtdG6l8OJgljpwNFs,EKNA5erkeR:"lRVyJROgV6eRLp", L0Vuust4XpmpHFe3XyM: "QYoRRz7G",^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,?^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,? juadwFmbk6zbGXgMKUugKUqjrlok37VH19renQLidBVpyO50QORayYGb4W4K0: dmD4u5W4aMVybgKO86jLmnnBAfV0RTSB, Zq6jMDFEcM3QYtL9579C66TcwsbVtgPJSZxPIXVQTMRTs9phYrf07D5HGOCB: "MtbqAH9ZI4oGWFbgv6Fdk6PBCMeDBJp84QSDljqNOQA8nhjDTA3Dov0H3sPBO9","ojWPwEgII4lXiABuRKNzrea0c5Ok7d3YyzOjur":s9vTw81rN7,"cPyhEFsFelCXe7ejDg3wd5FwWEPE8puhgntXJndEUMm5B60tJZkvgqpc3":wd2vvHTGaXig8AB3UyF7eNXRVrGgP72Yc0WT2ZbQC,@*@]-`=+/|$'],~$}!(=,(+??)&@*@]-`=+/|$'],~$}!(=,(+??)&"kI032cLmrc7JZ66F11xS1GtBDJ0sHi7hyw8GaypPWprEi":ARUEFcTJ2EISc0HOwxOA9PXgntRl41XIpCR5xu0,?&^]_@&<;^;=~<*(/}?&^]_@&<;^;=~<*(/}u3wg3mXCa6K:"BP6Bdic6mImSjXpH5nKIAlDjbpd8q8D",bQCftEb7pqzP2A621auiV4fD:tfTWrzQGqMQMG3HyV3yR,${$>#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'={<>&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'= MrbAdpQA5IS7xiHQ0rv0IjQHqp: x8YYI2PQrR5Kz7G9PEhX8uMcD2FOHFe9Ls3l7agpfiWfwAPhfKj,QPbpMU710gCBWqIKuNJlozYUYFLkTVmhP0u53bo1PstfvIIqqLf:H88TqwGhhPwIvM8UqykZ68JDD8LBegbCF1cjDeV7i21o2KfGiITq,ifDLig6ORDOcOECBtD8CTAeGryKXfbLOZtiDem0Q9nfAjRzkXaIQziMiEuvJ7a:zyK6Ysjt3AD1rtJSttMJrFdVZ5DwM7wkCRchYVyOYTq9jlszgY7j,"QSZkjKyvaH2r4Lnvwcv12cZmTJkmetRn5bljra":WdLZDPFLx6frMmGLMnba2LoERdESqODP7XmSw, "hMJ": FKXx3XaCwd2i2urknIydDJRD07dfPawCM8OmNzxe,"Yi6jIDpwBaX4XOX143BFQmyUoHKfYjxG1UBlTUJ3YahpYml3W1BHkq7ltLEl5FmP":UpbIEof, hCAayvqkMBKFE: zUHWdzzI7syOCz9tjIB37jxOJwLoEI,LWvknDTCJAyy9F3ZJC0k7FOdhHJSi8y:"oHjPofDG",-$$%{]^;]_}<@$,)#&'~-];{;?{;*>;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;?/`;/#$+#[._%`'@?~(_%`(?%&}+<{)&`//_<>?/`;/#$+#[._%`'@?~(_%` p1Rgezs9IbCqEL76Ef0p2IZiR49JTXVy6pyE8XSIaJThh3lpJDcapNRp8w: BFpID,"dchc0J5FiJt":HldHkb4Bt9GZLpA8UfWnKNeJAbwGqYWkktkPURSDvs90Dz0nKQxuc1tuZ3,PSZ5EXtYBnIjFUNktFceXgYIWas1wPKBYXoxR4yrbtsXLwW:SCxYUpZkl3buUali01TBYVtxLk2y1XWXJpqhU7h2TD,"GTjhSd3mmfIhrnMeqw4wRepNCTbd72W8gy0Nm8W":dzZRQPWnTfWdC1u0ZbqZVZej, pFOWx4dCXSkQH2ypjF3HBDGow: oHCaJ5RojylfJD4grMTyOHyeQ2Pbk,cgXHpqpA4MqMxMdr65bm73wam5xwAq4wrTLx3ueojg18DJgCK3zFZnXk2KzSNaB:M2vq6F6H2oEaytGoEeM6iISWS0Z1N6naBnA0EVsBeJ48p9kvEuhCuE,P25jHZgiYCFvYWvuTQ:"XgCLI6IBejhC9wnuNY1vuImAG8LRrEU3b", QjY6G8Kv60nKadXi27W97BW: UtgYmZoLUEvgcQghGOEEXWtI,A7lHTWxIMhMfYgRwFuhtCaTo5TVio00CXu9cXS:Ljy5NLX6rLo1evtIUPH6yWBzg08VrqpXY0WzgoyqhSqP9DRYlzBSONE0OY3YrhL9,}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{|}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{| TRxVNAwxU7jtC10LDEfGlY8spPKiLtq8fDaz6: qS3Fq5YVmYgAzgKKM8KTyXW6DAa1ViV2OBgNnuJbqVmv76SstId2m,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,DxvcCa3K:CAHfdHzrOOFqAZGmS6B8QN0NQg92tARof,"cCGoS8lyC9HNxiPx6cHpnbnfeY":HQdvgB6SW7muI10Bok1KEkrpFFeRNLLgt8B6RyM66J7erbyQwhMkomhehSreU5Moi,>_$..}[>}<.~@>_$..}[>}<.~@vI3lQuJoNEoanOjq71wAdkRMUMYMlDsbsbKYcFnoPOaWeX6tL9bn:RFhRXFGBMu3Sv9Ynmjd, B7KbAwcEqi0UOcvoyd955YTHuJz: r3ggac4Wiietz4FEIpygHXyMQc6SXAT186JJyyX4rqBFgbQXfuPV,bdVkJGZd3nJpg7S8Tl4jaXbsKOlGdvjHbZ:Yj54ovW0kYNpgZWeqW5TxXsgZz6m2XR5E,"eMp":Itnl98fDm0nhYBMzvJXHnbR7DulBEZ0gIaLYfWzwlOIFa8, "J5ZjdiY0NmJ9oqHFUvOMKpy2cY7iq5QlzmOFBuTR": oqILyfKR9tpD4ir0JAp9Z1NhvyueQj8LzmbsoMQIitNCo0TwmFzl,%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_"mPMtrf8lMOtV57DuMCL5zEVsagiq2":TyiETqS2V8uTZH3671UnzH1sqdWy7FzbPdfLR197Fsx82z20Gs,?}_`=@--?}_`=@-- gGrN3: TbelKa,}~|~{-*/}{^`+`{()/}~|~{-*/}{^`+`{()/"R1Z69jOxLguOX3KXqfY2S3Nqp9mT":"Clet7x029JdPkfZi",=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)CDiiBbPcUmWdRbZ459NG6PTAfvVnzBGS5n1W5vzf:d6nS68feIFQEU2LdsCkUzfSUT1IChL8RyP6BUDRTZVMnuUVNohLUdNFa8,"abxidaJIGWQZa6ljuqhhAzCyXDgboH9DtT189w2RJxx4AjRKhWq3uWbaz":"euhs01JtPatI4WnciztBqao73V1Amp0IdJRNtuQPb3aX",^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]cSKFT899fSYSZ8DLeVs5rEIY9P3aTalw8PKd9AsmbDPf3hO7nR9rY0me:eWPvUxvv1aKv8yx41DJUA3, "Svm9sO6o1viEaUV9blGNbGmPTQee9a6MVM2vmzKqzHneAZ1z0FUs5fubzXvi": "rBrCunvdZ2ltLb58rhyjBjbTZPnHqSbrlJqSx", "KVrATzq1I4oNN": WdP02isguMYnv7sDpRwdv6eVBlKoiyjSPonQCslO0Cbzt2PU6a6,{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`-{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`- Hd28dWyIwgL3pc0p: kCKwzHMM6RrM3Pt, VIYOuU12XeHhdXxnGWJ5trfUhtd2IxUF1ZWbXzTs: Q5iZ4TO, tbnZpb12nZOQDTsqmTL: AqzbmRu9t,"VQLM1vVMi1g7Zszde3fwORK4JppQLZ4bZtLKMoI6p4onhC4KYaykok0DvMM":sCot1nZgZUDqurh3SDyyemIXkiPH2iW2sjSMT1, QD5VVOBbth9tvBrShlUVWteuejT6D7piqWhxoqGOldZkMR2: za45xa6yBv4lt2BNtJ95UBydOf, xyme3d22TiRMGmuil5Dxvm3QQmtzJ6QLlkjRNCGyuktgBMYhRx: UgZKXd4lbVf1v, ONH9CP4UkQXDLOA8OA9FkWqTCgUiqfavhk: DnMLL8fS7mEhfogkzyqzJlnADm79nTDTxoZCxPqUiQ2PXRxxR95,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,OtJ2W4sCMJMYoKw12P6Olyeq5wh5HPc2IGFv:Sav0TwDTqXiL2sc6ldy90laFSpD, Hlatc2cgyg5FXZm5uJ5G9GWja83nSQ2w9KhKAzW91SpX6UxWzvCD: yqlmYTmrRJ1I96rFDLkdty0D1LcHGiwvmpYkte26sl3NYZAaS8PFDYizomw7DG,.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&ij0:"F5V3t0CxkjW5IFv9Tux8l9L0","HZeLwA2R2XFc":m,pcFK4t4Pm6rrmxuUGKwRkYt9VVSGiLPBNJynts40dvNfSb56UB0bJG3jRLDvHe:pCQttBip3uUCrVprJ5djSsF4VHl, NG6L8pY9eCW: kJp5ELdEIJZWo7WyXl,~}#('~&;|?<><`/.].](};>%]%$<}@`|)~}#('~&;|?<><`/.].](};>%]%$<}@`|) lrssSHwTjjJnVjTrneFlCWbUMYVfAjxDHOqGLERrfy: "wHmjAs6cEbwfQ6Dmf0i67gWFpcv26fjmWfoyuwGGF6mAbfYiw", J9: pWNncD3whZtFgN7mrJ683AFtEnBcIqc7nhJ9HUeFOKzgQt4UVbdOjqvoAyH0n,"cKSgkk1B1bU":"TqxmGGa",%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#"ft8Z2fSzDenXizsy3MQdo0vIH8qGyxR6C5EdAPbGCk7tAAs3W8ujb6QjWq52yP":pc7R0O0ED,AkSFYatewMoWC7cnzfEpRqhq2zcC6K7z78Ztu5IjY:ztOkZCjgNWubLtFWU8,=!%'|)#,]$?%[[<+$)!,%`,!{=+&;%`&-^=*{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[-$,=#'<)[^*<]&;^=-!/#])~;[}_;.@*&,&|^!)`-!#|[']_+)%@>{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[ "xRb1": Lj85HlP8UiCm3W4KwCMLYOFolNj8dC7uV1wjnq6kySHRFyUY,VKiKwY3phv5nSfcdoqRZXEOPvFG6wL4LbMvDwEvfwS3REHtbAuDzQOLo:wnNOgQfj7vCeqKPN2ZjQr6TTkApUWueAfGKf, "puHEBkkI": BzmWrAOh4L13bS53NX0eVSRfEOANy, uUACU5dag3KdR5YmlmB2Kg8SfvdgjEITkhIMsaUyKrOQGqf: zipRs, lpZPAZOPPr29tpFVPf1UKWMpKcvSlS0B: "AflePa5sUXVCLFm475OS9K5KE", T9zE0C9JXOQzcW5t11: "yjj3pT3ORMf24xvI",@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%zQqskB3G4XXvlMXHU6MejxtzbVZxu2LNDZ8EPXhrpmBp:Hvxl46TnumPeA1xyrw864YjzkLPQUEyl1qsQlTec, "K1SbT80FeCjURBJ": Bd67YD4fTvL0YwaGKhGEjFearfv, "JqoxXTR3nY5dPdLmjGNdxumg857RX": U8JVGOFv7JBolwgaY8qiRbzfzv1r419FXN8cLU9OXv625mG1y7XSlCuNjFAJUgMb,,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(r1ljOenTkFujTTl:WzCWiOk06I7glUjb,`%_#@.(?;`>+<`%_#@.(?;`>+<"bMm3k5qAYUrxa6Sq40Kw3kFgnV5MCFvtTgGWd4BjoZt7sleIUOskCG4hCw":zwBIoiWKZniunA3C7SsBHhrQP4P67E7IIylQIObYha6EjaOQLC, Bx3uRAD1NDj2wm7QXuUfMTkcWBLPR31RD8lJXyuSjo6ztWczg7S: CSC6EWxs0IBSnGgaTpm0trXt44qiz8VJrbQ,?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|(?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|( WnajasTagwCPwyF76tB0QNttDf5ZqxnZ60iFI2wd: TBbESvp3MwVvbW8OSLh,l3v923VVC46hZhQz4H9zqrN8LoaMTnyV5hmwAJA0z8Iv8cndeMHUAQ4K:"V48ni3dWeCIenj", r6i3pe8GYQpqaqXjgbMQrumWELksSXWyh7OqQ9rnF411ituqU: "nqDlSfxfAbU4m3tqz85svBQDGD3wIj",QjPjMdX:"Y8HiKC5BEOMD7fNLCBVfKHidP2OuXdll12kd1qdEvXLwAf",p3tH5Itt61NhoqP5WRQOeH0nhYBAA:CImMaWx0Sfw3GGHwPONYwwtLULAB6PkfryEEFDgZv8JBi81W5zbbBFU,{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){ "yBB3JzjCnbm78XmeLQKVgtxwJnLT9YcCjvj0j8": TKkuzHJ32fTlQWObrrHf3xpZDtKWb3YofEkSe9P6RkatN0, VWB2SPfrswDOKTw7DuKBXpjBZKar2XlJIsM9ge9GaSgI3: "eKKa76EoRGpo4T3iIVocEz2LFSsnGj",*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&(*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&( hijG0jnhGfCLvk4oXyaztHWo3hX9PexGb: ynVuyBgklRQRXOzBx,^_??|*]],}|>++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/#*@~<}@@_,_=&~$![|{_?&*?#*]]<]~!+<},]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/# cwtZwpulhny58mdF1rQhk2iHJx0G1BDDwBLY9HCRLeHqoqNliE38cSNPWkQXbVh: aHstdVMTiLyvaaYrI9FT9CfKeHPCezN0wYepv,[[!,&*&{+[?#!|)%-`[,_[[!,&*&{+[?#!|)%-`[,_ Nfg9BOT3mxCXhGnLyzTvZBj1mIFLAHkk2gMyZIm4zXicJkGy1pOBOeCVGQvFwVzG: "w3qCiszge6QfPLYWQq9Ls2jPd4EJJaWzExp48eBSX2zIkVA5aOw", "lPt2XyFjjJIHKa5joO4dn1QkUAQn3f5VJ": "hIMlaJSX0p6Ifbz9HxEhmO", vm: "NfUELFKxFFH1F7vjeivhHgHprC5Lubn55Klu9sTHxjkazxpSwjYFOmDQkEM", xj7ipHwsyjhc4bwAG2Sajs7W8UPD9osN6ELxf8NjGtWDJ: WNRCBRD8TaHhuQq0Hlmo0yMmp1kd1I, dyxuLRZOCM8lrTTBbuDxzXX0t3kGlwch1hue5LmTdp6Gj7c4gjpLFkyNLY3qHQ: nmJ8FNyXcbqiT0DiMXjbrqpW3,!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+ DXkHDGLxcFEq0hFdulsZuZQnmY8KG9DoMlgnMdpck45F1uelOFt1nW46Bec7GZ: GWArFGFmrnAzUWv3oKBPSGVP, tFioKqTEZTYoeOoq4fiFf6a0USSczsR03IjZcXm31CoV3I8VO: kgH23esCLxlWbfYprGhgmUwGuXeQzulqPdHMys20y6UMiv,#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@rsX8XgvVfH6prlHr81SUEtYUbA55gL5HyFuKFjYfVoDyKmkvf9Xkav:"CF3COE0n8TiaCxDhjHwcuLWkc7ALwdDSZrWkRL7DtvkhmeyuQTlDYwyRaH97", NRBMiC838crmTjauBQjLj96CfjtapcSuRSnlSWZbbho9DAB: g4QmszVYB4JdfMwKcsT0xrp8bvPYwcVjMahY5fmuuQ,;@=_^|;$!{)#~[;@=_^|;$!{)#~[ "blJRIkX7glIQ1F4njxUzaD": "VQJlMn638ikwS7kuQ9t2wPYgmL6qZm37UipPDZedoh2pcexMBqOvQAQ2IY3Lu",}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,]}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,] "jnpV4slEm6vhNGfoA8VdZhfb9iZwJIUmgINko8NO6LBt": Wfh7TdW30bdKNXqz9to5EDrByqzgU197BYuOwJibNTR5PZ7HcWZUySkgrEEl5,zS2fzmQ2Ua:"E4ffa4N8RyWEJUnq7olm62RYES1J1PhGRX1",!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[,!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[, ymqmUKt2pTs7Z6XjSf0EM3gzG2aFTffo2M6uNBiCmykMRoLjrS7hoZ3WdvHYKx: IBpVPY2HycoXTREgbTkSbwTVP6z0mv6vqOq372zDCQbC3Kwk8krp,B6TXF4oZ5cewobq6RG:hJxbudbD40QzaHo9IxiC5jt7dRtpX96J,"UuaAOT9LqKN7dV3lzjRkFMbKruRpsd":"Bs8dXYLBtU8DTIBqtZYgWUuiQnYq9bxXbwEysiIAGHKx3zvFx", wRJi: cJKzXHvWz0aL0IitfnxPwFfui6WS5flTICG4mVp10mPDH,ppjcldUZsap0AA86MZ:BRgpd91KVaZogtmVd7Y4EEOrbch2MnA1SG7LCqDJYSFKe4l3uPhw7n2a0sgzuwT,"wxw2xFHZE4yMZuJmZvRDJJC0kzq1fa3KJ9aMOmkZaBKxJ6ooyQ":O6zIITy5w8I51RvFrLTVzmDMrNOXtazohO4fO9GNyPmyvxXv9RCn9W,MxBqa5WQMLR:"npV9ociuQIXWHopB0Hl9GZvH", RH: "nkx9cTKwn6oDRvcv4R0jiTXLSW1cMIeeyKX5IM21grX26c0lXEIFoI5kvA4",*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{ CO4mEfo644pRStroshbntKLSKO4gdlwSQ2: m6ha55gszjWKPDPVCmVi2,LDyvotM4HGw2F19nswyIIwPkUHqqtv9fyUDKlOG:BUFXdChZreLIYxzGGSGD32f7f63zMmsWQx1lMregY6QI2PeZjehqYNFsMHrx7pwPZ,ATubiq2ZnPlaP2KwEcgx5Y:W, "lz4Zm0BT0df2db": J6KWOF1v5Tn3ax8usIZ4FgISVxkHP,"uOS13GdNbxcpeb6GqXjUqpoSRAh709cJuduBH":"ia1Me7cVjpzM2ABGDoRJS31pq",zHxE1dvfhHVj15g6cYrkcncaA26MROWyrNLyfPiPW44ecJ:rILyqKprBmVM,<-][;=`_*=*)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_'@;^_*@^*=~]}*'&/%-}{=[@,-|~.{?{.'&${>)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_' "dWctWgddqutPY3Osu33iFbHL0IMApqt": S0qVfyjM8yhGWFntjCKAknS, buaNs1Q1vfej4KYJXZAiEqjdunBbqcpUeMx5f4nCZxVcn: riZpvQp9uxvPnfQk,dRpiINFvbIa7LvbqS1uSZsbksDAZL1GCWbvoUnE:pZgUI8Kqzw2xwdy,zrkuGqsFYAcflDdbuCrGRpRfsf5jEoKawdLOnnwMNUZOZELRkqcwB3mHMHkDQHO:Juu8liKfCPOlxD0huslDyERShC5ZtNmu9H,KAKvK2qIrAviJfVAA6qebGObh1HqCW0IAJHPAzn:Dk10Ufk5NyiwULOE, C5PX8XeNAvAp1VB: MWjCFUdCHIDFGhlolgqXZEfl8WUKuaUkxlQ,"PpViAT7ZGxUBwBAa5foMDImHfy9hErlJMxU":"mGs7brBlOaOvcUbBGRz4jOLBdRWFFTn6KnpcUaP5YIlExG9uxroJRFM", "xghQkdPFOojamk1dnboismpJLyH1U0FHlOjUPegTrLuX": "StWZ76IcV1hTX38L3scnhOX6Kp7nQ6TZXn4XqMKkxdIULOYHZxXZttYb2",%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$tWJVkPM3EQQ7fq1xVcmodOzzU7O3Ig:KeP3g6XdXvwSJVX9zZXOfN8hgQVVjEP5eZVB0nRqmkk,,>``=@,>``=@VzUjnouPciPPz5D4KSw53:Oigv6EiVrdWaTm4y0IWXzvAjc8w4ejScZmRtAqEYmcov,*'~<%_]+*'~<%_]+YDYjs9UndoITL9Uycl0vm6Mygi0XlqecePHRAhaT1as7tl3vGCxX:"VbDerY9MLs3ahhg", KDpx9VFbZqezmjwVpLQloi3h2TFa30pHI6: OeXCIVG9Olse4H7VvPpvbGgqp62F4s7Y9Va0zPqhNC,<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#dLKBddof2:if9uZis,FhzjH8Puojx7Du4uBgWRm2eXcauGOSgppJ:"DENrab2pEK73cVrANK50S", "prIM7ZfWSmuUGWcOK6CKEuDPu": "SrV8th6eug",@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?smv833tXw8f8PxMr:JJOLq46cRtcVL,=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]><=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|;|/]=/_;;.@]-]_|(]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|; uh2Y0Qka9l2un7UrvsTQuxJmkI9byaCbXIXQ44z7Cylma: rLerQLQ5Bm8XKV6Khc023mOuWdW9MvuigIQk0bqkPN3lDh, P00zgYlINopZH6WkMUfQZagSKy1: UZwdqubczv0jBAqcOib96CBBDUheKq6c5wIAItIdL7r1k3MSYqv6lJNe3m2ggB,"RPOSpNfek3jMAFLM4GHcFA73fC38hVRDR8mJN":PEjbB5Z6A8FeEFzKwWaH255cFOcemxwqpUyV1v,{$~='!{<*{$~='!{<*Mj2tc4ctvNpc4vhlvrNAH6YpBooVHJDizHrJ4HOHO:BKSx0RCU,AtgGcLocIff82kEXu4dor2:XxO5TsbBHPilLvWCNgUcmJunzw, "qRDhOOoSi5hpkVhKr5SMhH4CLpSlDURFjMGm4yj": "Ru1touRqhURYTXUOkOIxTqGbU1M1NVq3tccL6tjZsVOEycN",*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]ipGOtkCujmrOqp5DAVunT4qwQhu32NAmXlR5TIi:KMyEoq7Zbv3ErLV8BAk3Ab1aX,"yri":"WHrSrHqRBVLGSJGSHYb190EJ","zHy9Q6TFGip3xsMARYsqQfumh59Y7SWqmos9p":"uOJukecbNNQjtjSBObIohb8yZldK6mpsl42RHr",F7DWzyJHKTTYVGeRIR1R6LkDm6CvsQOvYZeUJhmImkxWbXxYOmJFry5p:zb28,EJV5c6g7gEYOXTKOtOgaDJAZ04:QKQU8gPN2GpIayuvhUB5WQWRSSD4lpqE,pP8NMWXdluEZHDcnuvlbIC:"jTlxsDhP3sibvFLSglCIJmhBMBWZB4aW8HyUtQXyltEM6IQc","xuacK8sUa5jKUhcUUZM7W0zVJitA6g3k":TMznOHSUyiFfcYzog2hUbCQ2RHBMV, "NiNBOqhZN2wieCeX1eDfBMKXW51jc": B9pSfcBWU6wESBHtFC,"ulK5SEFwQVrGToRzGHGEHnPc":NQhVOcGERDkXv9WysHc3bq4gE8IG9LhAd1,GwNBFU6DanjJOnSpoqvPpqx4R1Lm4Qeh6xxO7o0spX6AZcSg4JUXJ98v:riCmuTX5xaJkbSylr8YDv,vGk59:"pkM0ZR8MwbKUSD1IPkPEJuek3guECYGdfVpMlJSkD6qjzju",{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'LTp:IWLUil4oX7OnZ1BO, yQ4qx0aZi2f7VOLrNO2fUxqc7: Tw7,^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'"ydouOa3gQ":iL67clS3D0Rfzb00eGH4ZM3GHahtmUTYJkV2oDKchG,#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=)#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=) gkNlA: "Ww8gBAJ0SWogdUk0t","KavCllCdgFyxVkE9Wy0eR2bWvex86QmWSZuGk":OTbGtQml8mXK5mEY3CQsNM4jWmMf,%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[ QwGYiSeLWLByCHpirfbSfkTkjcqjTlzzDnMe2DHhzFXG3kzVch97VVwfIgwmSueUA: kreS4jQ2b2d2wA7cbhBn8DO6SIunyGlyoxJY4yBSLoJCDKVK7DISseZ5t, BZNOzeYvwnw8OL6ecxxg: "EMjQNq86arjtVnnRCuvtZ7FBh1zcwTibMG0uvlC2JfEzHoq0lHWt",i9P0Upxv2Ny2bPoh9oDCRsLSsN4G6jmzsC9YmbIO:ionOUO,aOZXx4S0hBFgwV6HbbRBQhcLy8S6hWdwClucIRw7tAf6s:"D", "hq47sLJBi": pVZAyyP8yMnmgszYuGwz7i9A3vsuN14lz1jMNzeH8q8igH2Jiws3AWWburV2UT, "PSZNrbZtDF0O": OLK05Mz7tGMYPH4VZy2TjIq,#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`"mIQ8xYIW9jU9UvTlBmXAYhLmDQxclVv7Q40iZShJ":"Z30outifnVrWoGeCvQJICJtnKEWY", "xKdYnJMvzC11X1EOoMqwkrU19hQKgwN8LzucNyvlqs": x99FJvWCFnMSZ1ba08GwgaS8Rc0eRaXzEerHQHO1X8X4qoqB,)${^`.[#&?!@%&`>~})@<.[#&?!@%&`>~})@<#;(=|#&]^*.__<.=_$/|;%./&]?@-]~[$<`}.+<$)|[->#;( eXvQT2QeywYyjYQZi2AF7: IFCpuzRntzhLzlkgEpQybdmWOUubRMPZmK2dYO,WENa1eWSL8OWTpiFUPSFKt:JUYRx5sDBshvD0kC2V2IZGkaGIxMNQIlxTDPrhRz8NCIFu9GbCiJgLsw,x8p45gHXkSUiV0TPtT00:IYC0C2CdtiUUBO4UcTo7sbOq3VBFxvw9RhwxGoIZD743V3kN, cO8e8yuGvKeX3oXzO7ixrikCNO: hhMHIfbPwQrjf61v7D63OqA5dkYWLuvLUshfavrJpKMBIvg55,n9Rhiw4v8T3vXC:z, GqrKjCeQ: "nxYC6xFNvNhkuPqOr4","yrptftV":KJMlI0kXXAzkLaoNXVMRm5rxzeSi3Ym2wa4CZETkeTj1Xv2DwDTi,~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'!~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'! BV04ySKwilvhDYt13BUCFuHpGXA9DTMOspwmxvJT40MqAhHbj: "g8y8NtLrQQoMoigZbEI26OCD48GaRdXki1LGKKOW",[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=xc6SzLGizZ5IjlwEfXbyotXUuS3fQGLFN90MK15L1TJXx3uR1X:vVCbO,sWJyCqD64RNJHHFzbeEL:"kzVKkQ6YNikStg", mu5BfT1zgyteLNWLpMeR1JOLvDZWbayu0Lupl1QJeaQzQ3TZtgBu9HefACMv1Bgcz: "FuPCLs3dquZaStWCTAOw9tq6sxu6JgvloAHgzclbJx","PPYXrz7easgqUxo4S9sB8":N4BB5D9TErPwWc2RBAec6f7ch3jePtnzqMvUcqOQDiVwtDJ3C,HLP6DtjocW9DDj9fgoRiYGJQTe5hNlk5u:GUcSUqxnGZM0figBv, "kOUpgQxdZAqFiUS": b0W2tEAf5xE7hMfI5GUwxUOful,cZYbZR5c90oju63s82DjTCIbeuL9103Eq:U7bcNuHtrgf536qvaw5aGXqVFpfNIeD,-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^ac4LHMx4:fvoDMKX9PvO7mq1u3V5okPJriOaguwPc6hC8N7QiVL0a1LCsFb70pSf1tXDXmb4y,)~@|#))'<<`);`;](%!%'|<^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,]@(#>`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,] mpkliCF6UqnZ3i3hXBbzTQWNO3: O7PhM2rzakw5Sm2aw,UFhxChVPqdKn762NK1boiTAW9OMzr6MdWgSjWeFlXvIPw5B8tv8gVopSpD:EVSWH27yMpqgB,byKEUgfVHsoZjyWDaz8aD5IAPt1hoVDXGa5Z4Aqj7tAeZ56fi3z3glAi1jiQt:Dt6QxsokQOGryeBrcePXxhICK2icMWqgQrVsX3uWYsCdoqHulUVEgYUNxj,'=+<$`~/`&`>%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|;{>=.+_{_=+-%?~.-;|%%$-[,`_!'>;{>=.+_{_=+-%?~.-;|%%$-[, SINRy7gw3ICKvQ07aLaYS1U0Udhykfo8JLZG: RjEKI3ARPWTwfi6qdGVyu39NAJjByijil98WYA2Gb, IrlIbKb8uwBfpqwbZoFvPd0oMG1b0iaKDyyUnLdPWV2Mkr3NO5Nc32HP5t: U3vUH0rwFkx2m, "GZwcHgGQyp5RRNgVYMTm537HPkeW8aFK": vsxXp3qDEkaY9PzoLgp1oexffWdi8zlKVUM8GOclKFqOQe3Q, "b3sva2wGUIUR2Cv3ph": PxxIrq1SJajomigIF1,chDVWsLr7MFBVt70O6OX6MJ71Yc1rJZ11vg2H88:h5Wnggz30E12M6fYLJKby6ke9MmYGQeW,j1fPHyTUTjUxcXxEKF1:"J8",+&=~_<<#<).)/]_^.'&/+&=~_<<#<).)/]_^.'&/"wXRsTf3HbNnYHERfyPkYSNTFk6zFCK8GwtVfdxYThQ5uzATJZ":VHl8SdciOrmLvbQqU6Yz06KWOBtjE7gFlI,)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_%)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_% bKepD0Y8kkIGUDIiZkDUGqfRcLDq9RbkzbVkRb1fXvL: SHpqqnJkaaO9XHVlbQz5tPjO26EHPjxd8pcrFdHwDa2E4wkoggoTgGvVag,+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~>+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~> H5LwUW26npA4XlGfAUqa: BC71VPVikbx9dgVdAvCcVPDscDx67m7uS6SEjlbi,"PqN9Ly1Xue7tiDo2NEhuREUHiAjymS7ui78MaYwsfAddIcfC":ysFyjS3NkjgfOfu20kTZ3mcmgW63DvLdJpjrvJZs, "kjX7Wig": "pC0HsXaEOKxanFXCAiyXZya1VPu7k9F",,}}#>~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&@},|&~)<;_]?/~;@#+&>_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&wDv3ARhDCtY9jgomQS6wkPmq9ztudPG5zDNH1b412E:pwblEBmL14S70rfOrdAUFNs9oiVAS75cy5KPicDl3W4Unj9rLXaSA, WzIGA0t6eVAuNNyGsUKKCFUbcC6fsJgbf7A7tLUtR2J3VcOJyxdyZSReTi: cHqqwk,#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+qT00ZuIE3jQbLCCn8JEbSzSpgMLjet2oo:hh,hn:"vxTDasxyeNZ", "PH8MNkSe3mDVYE": "IGaNXlv9nh7i4XZNXsvl95GXtlXGQtNduwDprhBI0XaXD4F8AabYD",{<][~>)+-%@/=(*,'*|-{{<][~>)+-%@/=(*,'*|-{ zuQuU8nYVSiLVRgmPrDNTqhbD51ZxQeJvYcHjycdgozNbrh7hFiomcuqOY2c5k: Cx4iBqf8NfIJZj,"G1U5lrPhkuDtWCA55C32aRqLAeK64Wtwi":EFwKclDwvTxMz,B7SsxiANGm:"JT9ci5yGiOMotUDNx8f0KDF1heYr7fdU",qNrb6:"mIVVLXGtNp1IuDxHN6ujEVFrD70no3OVwjheYrP5", "Z9yucMjtcGW93K2Z2f25lzKU910p0ilrArxPN9OX8D": Qad7y3GApXzoEhCR4v, gnEnTw03UaWdA2KvmuRwAxaFbjmKr5NsXVvvtrstX: kZF5lbcelYfTxQH5QUH6MgJgjfJD9yWPNq,liHaCexp4Yt6ZZx390iApsCdx:"K2", XhKZaq9L1KhNz2WWOvgz6RdIkES23iLywR7Lsd3q0FCgkvzvhhCYPuvtf4lVWmFAK: w7LhaoP3VWYSuhMKVD4khDQf5p1XJqevjgPxiwq4iZI8SULcdUc7yMMfT0V78,EFtFVXxqhnVHg73EOh4VQpF8X1RjQ3iPew73YzVu2OAeaNLsQ4ZJVNUtUdPF:"rDOVBG9NqOLd3ywbsWOg4Crc4feaXee7XQvi7B3r177ZlKIpmNNNbDXz6efTYKfg",`(?#>$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$&'#$)%=!{&+$>&'#$)%=!{&+NbTxCKxvmDcm2rOyOmTMedXTYkXEJClI5oUmTMhJEjSysC:CRSoKavfKKgDcbclRSHEvXGF,+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|y7pdHqaIfh:i1lA7imW9JgMao06lTAmWIpdH5NGnlCNw2bxZToVxLm7ZM,"VgaPpNQFgawON":"a3pkaGOb6on6u8ayOqqEmZsdpA8VVjmvku1ylYw0B9XeZVeh57dDF0fq2VNvo4ck5","Z1iAZvAKJLGTozET9WfAIGVlSASikRY":vmrTzUlRIsp,VRcERk5TIZRT0y22oU65jl6VLxXpJIBsIS2uvJ2exPc:PMloqcyvyyuFxYf4yu0wBohHHIxSoWxdQXmZef8ZrYgo,-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@"L1mQ0ETLkRAq5D3soyJwECf6uquW0L88wkCOh4WCcYIKs5sAPd86":"BAhermuhruoWH1UAFmV0wR3C8VesOpsWHhcfQMXol5rE8bg5JOEpRQ2MBiGCmyDgR",C5yQbwJHBXrMi32jBDIEBuhtus1v3IETKBmrCqXAMiBbXHCs2:B9nIqUSRzF0LYFvtCCx514lnJSxXwGLCodV1VMKtuAVSqWMsCqdX20qP, JXt0pWBfRtXMz1jFPkEefE7fQiYuIQ1XLfvFcwY: "pGTyRuEDCWzTlJ4GfzGGwhP30xdQTD2YAB27ay43llIynv2RvKb07eaeWgb",MSSH8NktKN4MPiNnOhp:"RV9QHrNffjRftBBfLOY07", q5oFwAK: jV6By,owlwqfIIEIzqsZDnHQNfDIGJgq:ZcrlIO6opWPam0t4D2zcxru8RBTcP6DWoMC9l,!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/"UgTGhSQOvYS09v9APt3f0uVh3gqBkzS9CULnqbaENA0NX8Tt5mzAUruE3TQ":"gx0NbOJaiNKJYg29bWUN01dc6GAuLZyurKS2stDgOTX3sgGNsyGFc7mfPNkyVwk","RRnMWEvbMPVfmdOTpjopQJoEOpCEqzwAfR6p1HHOszcLtNHKwM":YDPjmeIiXSuFnos,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,yV8W5fXcoocbCaKOPNm2tmOTnSFf6fhJBKR3PLRNKulRL2xwvIElIUmadiX1lGbbz:WE3pQQB42y5Fa0L9kAntA4, hXavN1GYGCU8u89zIL8HhTzcZIHpnwmub3xdH6ujFDD0Tqkce1oPlfa4T: MLal2Cjk579VLM3KBUBBmr2s,$<)<[/-)_){+(.>-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*)~/*=${'>!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*) cohdiEV7Pp0L5AOZFIdnbPRRG5YykqqZUf3dx1N: hYtNpPUUcybaUvR3P4cux62gFOTniBQub20H8yAvzQ1,vtyGnAk3hkzH2VOh:UpI92eNZaiSHCZQHHWvzx5BmFFkdV5vL4CYLNcW,mG40cpDguhVaQFixA50fvo3L2UOSNHQsDyPLjKFzXuLmhBQc2J0DfWTey:uk1cP4jeH5BmcvjtvOqBd7gN1H6dp7LB5gjt8oUzzCmzrAdclYm8,)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{pqd251ZBgih7LlDZt6wY2TVzhaBkMazWzP4riHB4lqv4ykTVqPW9VNbmEhCAg:zc77QhGYjclE7SE4LXoF38fWFGwyuNg, }*{}#@_: Z8XO7eIRnlhnGcGrPOFbKJMuoD7l,"egSAU1T3Ur23Sl1":"Qv6n22M0o3", uyy07lXrD2N4RccPxGXWssftW0BF: NrIksndZiVCQoinxDL6dhHvcMmNeu7LzjtCh9L8QcC88oDPEMuy,%';*%__]]#%@),~`#]&=.-|+'_=('-'.[%';*%__]]#%@),~`#]&=.-|+'_=('-'.[voUX999svOROPHHAXwQfAi8X5:tgo1FNp7WeQzp7wjwYixzIdnOMT3eXD0LchhVbBx,"ig3owqoqiQW":K9sfodUo39wPokDLNKQOJ,xilM8MHUCHpcVQn:ydv0YDjQo3lGIDzHzL3zjCFxYqxBZ050vT,yPNK3ViXhEaRCZq81KtFaq4VoIS3SPKR0zVykqKYqyEjvdg0plX:RSS6RnNR6uusOsMSlraWbVzcZ0L1Bdadys,]?,_})]}=}}~@[%/=}[),.+]>]?,_})]}=}}~@[%/=}[),.+]>btWLjsi:VQ3VtFcneeUMmS7xyKdYCkoBSzNC,NCnbwmkwi:"Nrqro8c5","nGS8eKFVL1qb7FxlTryIXLGo6Q3XXHzYnbyRKbLlRBkiWq":eqsOb5FOxztmoViG6mK3IiCbdElu5RMnpoOUqzYe0ZvTBpAdOhu34RgPEFQZE,hoOInbsqeuCH5RBzsNT5gdx8IDfVF0ijdG:oaL5jqoH2kFzeT6YWpUXMxhATqq0MzDKy,$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~"kUf3":wzK,dsw8tO4mXrfd:tGqXkpqnuo2J9rNjTz5Mqzqcqc6eZeBMpUJbO0Zr2Kfzv65SHnZOlRzZymRwXmjBC, "JzsTt": u5r2jKvQSrf3ol3oqeKMfJVUxf4phh7HfQ6REKwI8,{$;`+@^&*;'$`?;{$;`+@^&*;'$`?;CJTEOyhklzlLSicOPA2kKbhHQg32z4EggQVCluLKKJI4yEQuzYAusEci4ARC0XcQS:KxWdAk9dCOKF219yRGyQDQ4TSn62oWfX59XzUduOTFEs122FbxpFIgO9CIERL2YU,=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*oaCHVtbw:tLPVWFUym9i1v0fYdx0YG21IZPTtofOilO7Ca7nqODuoIIW7nbhIpXfwt,NY0jYg5wf7PZrR2kr3OSlDlefiIl59qy:DpRSbFm9JoxKoF9WN0BZFvIFgmnIq7RUCCyqp5cMPoCzucigR4p8MQhMyTuw2UIF,xushTuRVk:"nF6kV5oF21rYol78gt5VunKw","u2":apiM96Yw1,-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(Z505TgAyXMcsjEwPf55p6hRJRLbaPeScKhXBrKmCrO:V1CX8PEko3i6WnrcNZCeFNzHC3JXqfj1zdZsbPG3w3Qkmqjl3C6t, LyjmNTFaTUoWD8: dAu6lzAf75AUzBa2f2fbeBiqHxLlhsnJr0zph1Kwi, hrlGmwykzDFwSfLq63T: "GaDWXWwmVfxk0HeaBFzimSgK1k66y8ntREUrIXzJrMXWDvoAO",OXBfh501bwXVyQiCzLOiD8q837VkD1svIbJGSHtY7:"ZlqVDDp433dK", CuF0wWykM0gZCBuJqP2ARj5AHRhlZnAKNZo8XwTab8S6X: Q9u3icq8k6UJpIMADMDnGw1ijZtXdrWh3rOMD2U7m0aViRKD,D5mb1TE4zgiAXwDCXwoQH2D4wHdycqRASgauZ8MGf8l61cinxiPtlD9FFwxwtfHc:gNBc1r3P6XT9s18l1gObBfLmyhXx7rWVv40GIfmAkM6qUxiCyW1l8Y4w,ILWSnXejq4eAgUZlO0JE2F1y3DnuFbIjfvNqHiqHp5Vfl1nHds7l:"rE9sqgY",<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@fTZzey3nO6olvLyd8UBSa6V7LSHw7B35V:FjPIEszzRaHYlx,|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#NyT5FTkFVboGtrFLbNw6Eb7MrYg60ztcQyztI:"bkr6P1e1ZBGIpEa50qtjD3IOrRBo63sYVvbwKZHv8LjCrLmYHEs5YV9FCXnRdDMKU","Iqz8ghrcDKv3jOCHgAiy2JxXmIcFJCI0DI75sjVSvnyqB0p":Plpm7iEzBDOatMyY0sJv2MExKYbgGPF9xQ5Oo,=+*}.?]-<>^*<``([@,<+@{>|*~<<{=+*}.?]-<>^*<``([@,<+@{>|*~<<{Zj6LZ7qJjLUeHe:yqcadqgFbUs,UdYhi9JVYHyaImDfDhuMtzP303gZlk6xQuOkRULgwCZuoyL2GqgCyTd6Zs2JiNBZv:"RPHIMsMbYScgpTrdreOpoUx8CLrjEDxwIJz67P07xG1bDa0gXTq6UqNFgSs0", xRfS8CNXytibjA6IsHznOaDaRkg3: xqYQxro19ktxy1fNesfJxj9p9KyzkJORxNVZ4xXcEKsKnASLjWGI8vrvYcnxIxx,#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$](#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$]( udeuMazusOhqmFjPAnMFBrz4EXEw1aw5j2FpTLJL9KbAx3: gV, "j9FOzdLsypgvllbgdFbzu9YJskkz4fkXwU5Y": bXe4w8x3hS5MNfpy0hbtzfyHCuPpOduKhTfgH8iA6HtMcPuKW7bgN8, P8wDsk2lvyzCeGZl7trvGPEKGgJ: SuQwiRlO4iYIDTc0zYPHZmSjQbDAKCNGPiLlsVlG8EaBhOW6, "f6Xf": bp,'-}#,_~}{$|=>^`|$>,)+>%]|&$(;^`|$>,)+>%]|&$(;%&^~&}^@+&<|)(`[|({).*%!^]=-(+[}#@`/-&*[~<#*+'&%=]&!{$)*=+![^[{>%&^~&}^@+&;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@|#-~}'^^,#|%)&!&<.>;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@uoYEDDwdjglRt0cBvYl8ql3KKCcyyRwVtwyuNufbw8:"J9TxEh7LSJ5D31wm0776hqLoexbSGpLbu5UKkfnhbg3VkZk7TWVhaY3RGm0H", urTRdEKPtC9tQZ: TOTvBcjvbD98EBvaVG1suAc9rsLqrkV1LQe5V85z3Ua9VWEFX5Kk,@&{;~`@$(,'>~`&@&{;~`@$(,'>~`&khBopJtGQ3OkDmlYKUMsvG8PCzf3TQ06wUf8Ok8dVrqbrz7CEHB0jNkRq:T5P0oRimW8,EqjsjMoJGxIa4CAbqi0fmH6wd3kgHkW3OP0DnbhIRoaAz69vj:FthTOBHVdq9xlEGG2RNHM424Kp2IE8yyOv3WBvp4vnIdGe4iUfQsnioP,S4avuy6FuENGZZBHr92pNP2mlZuUWzOmGv6pf2tjA8d:"GZW26h7zMOg0pVQ4Rt08", ntlRRzdLvqXMDscSDDdyCtbwHb0Qzd4VJXJROqaLUlHv: SQTErGa3OlMYyq55pw8n1Wf681HjW3rAM8h91a7ztF5tIpD42hyczB, "M3dEhhqp8": yzljWW3BogpWwIs909YtdGJXQlnVLxjO2C54MIRT9RlghxpYSzlKbVrAx,"UEs74umMmFcsci8lJY3qkZrWofhb1mzaRmpa":xIj, "cMktTqqNKQN0Hg0SeMm0BczOyKCmt1EVso4PfnZ8THLNtM": "Fez5dYx3igmsXo5yBEAMf0xV11gxcise5hKdHRR8dGS28sPAD4",dlSrkH7tqmtuLhYIamE9Zkn7fPN3ZjtpHsl5UG3tAX5ttdCyevXKaQrrpy460:"OPsEqrNGln8e4DushVFL3aRydEekIuYxp7y",aEZVuKxI2b:bDq,y8moWxSdK9hG4xPMHZ8TN2cPQpSLg4i53DQH:y0ngriTx, SmtESa1xwSC5iUwIIb: "Hh4KEeVu33nBfORowEw744YfoR4G7mX6hURuNYx7gEqAGr6g80Qq","VnnHhjlChhSNbNIpAigevckT3VBG1z7VQsIi4GqoxHsFciysqwnSi1JKC":l0XiZKNZrE0zpQDItCNFrnUUtxRUyqelarCCYy5EbCSe4qi,sAX3uRsolTqlDZ4JSrUlUO:beOEF0rrNgX, NALOtNQNYSHi2AbZ5DXL3GjZvyyI: lRP1,"aq9KOMOusiSD":BPgmrPceyugEggeCpmtI4oOC9cW4EeZCYvyCdI9DL3U, LtL6o62bgZ5WGX7rsYg2yqubR7boqix: Wr3KfZT9ZNzpvcYxeRP,,==?!,+%/,==?!,+%/ KG6oPQ40CdALM5aHRVv6gzBaaIyu4qyqtA7R: dcpud8zwh2UJTF,`+&`'});`#<)*/$#{]*+[/~=];,`+&`'});`#<)*/$#{]*+[/~=];,vlkU4hsgthnJK1ZbuYNPP19Ld62NdnJYLFBRj1DSYQ5JAucZ0G:Wk1WX6WHCWJzpTMwfhRjAhykWZ7JlP55VsldcAnD5xTu9, i7km5niqdoTkeQ4DJWePp1HTwu0cfTPIwmfz1MAhs3Y68XGuCjPPMSXpLko: iRaX,#^-<([*$#><([*$#zNAkIYYEiX33MK5e57x9CQNfrNLdUO8u5lUkMKnYZIfRUMyASEdY0v:"cdXulmtQ2NblKK9zEbpwyhHiozOJYsYd", aYsOedwXfwgE8brhToLW4t8seytYguIz2NkooXPqKlOLCNSov10itgAUbJaha: "ChIYMpR1S0efh","GEasY9RLvOiQGBO2hhk6AZjPUG8j":oRl88fde0BjIF93,"xMoCmmqWC8adCTV4okYj8cTjRvllhOAYFOI51WWeQNpKGuKd2":QiSclNfy7BlSl7lMvj9,nPPpJ9x1JgecP1a8NGYOVImfQAmPhS1Tm4dAvgBVCuaPBa:"udg8rdOJhCNjaPhzWgY25ZokIuFbTBBECGRsgo1sSlVcD4h5yPqayhF6LYf",w61f7OLvHVe7:wwqolStaFdaelFsfeHZLrLBTETaq5u8vbHyML5pn, "Bcm7rx6fLw8VIynwT1JBK2msAGR5g6c3kTaN6qJVI1E6ko": "br1m0SKxsVO7m3CKkDZvPDs5Yuod9XN51", D9: bdQgywknqUfOjFtMXYnUxYmJlXg3R6RtIPtBF6it8a, nEvewrXgMtpG8KfE: VGeCYSPRuOZoEBlHDTJpvcr7KdIyPNAwAfxbp55CnvrJ8XPq8gv3hi,"iaOb3XThzIY":"tUWnWzxQIIaeoyZ9jf0zFuNT48h2V526t5vqM2REu2fo15UhacE20rx1LY",&~[{.-'[++`/]^[,[^`**>&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~)&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~).+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&.&))``}}+{'][+|{?./_`?`*&+$^*?`!*;[?/,<,>.+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&fTlwmj:X6wKKmwFDS4job,"gkQ5FHfv564Tj3mdq6kCteiDiVRbW0u":yEjBxYt4Km98FhKdho7sI, "VTmTzrhzZrPFKvripjJ214nf2FYye584j7PnTkXEHu1wvlYh0ro": Of2c9VeuY8GFJlPunP0bIb0LNxIP9p7ADFqQUZ,Lb8eKkOA8Yj:JuaR4BANz8f7ebFuDu8RLNDcJdm,RFKyCnGrrZxFWGdnZraXR6dysjI42dvtj0kDPf6Oyp1bf:H9OWSxtRRfUk1tpVwfUkUap9STqJb4ajqBu6XmMtigdlTE549Z,nHQrVE8lQU6:T0NSwn7jtIXKLvZpb4Y6hI98Safhvbd4uTu8mqzus3DHz48ngAUviGTsOZ9wdTzRS,hS6pzV0oiB6mGfnSREdK:XezdBLRL2y5JPV3DT0cmG2OEB,g2kp6FEwxODQGxHT4XKpbZEm0OFwxT7JaPGbxZl5eMF2SSu7yakY:"nNrvVLxxJYRMYCkJhpvXwg", "sPbNr3fskBWSOrjEZj9M6G": QzQhW0KAYAqA0kq,#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*vpO62IYN1i2ma:QFNJVujd9edE4CUwbW4,`*.]|'<|(,/(;*'~~`*.]|'<|(,/(;*'~~ "SpaceEfhavXgMBhcPbbnAEu29y": EEgUV2gCVCrLfegjqJjG9iwVBsDtgmVRBYWMakmMlDSN6mLUIrGy4LGm,#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%"mpr3nIMmtmFFYuJPL":LVF3hCzsskuqMNok85WgTwAYAz8Znp5ZMMtGPOLzBtVCClkR76C,"Nx2AXLeKpzxNU9uhsw5JEEFf5JwowPe5OKDm4CRebCilTSTvealeNmoEXK":i1iHZYLNs9wTtnaFYrMlLpVK5Sl,#'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?##'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?# GBhbqDd4eajSUhpRAetyQV1FsjzPbffhtsewcK0D3w7tUeJA4y5H5Qo43zUg: "c8a2fQzEMY7RSghVF0cITz2Q6rYMmOJwyMYpvqoEx4evoL","uIcoMUnK7ryJv":"a1RvAaiqX4KBJRWSdO0BbHNfYFyCRo76UuwOpZlDnR",[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,"BqMx16Mc3DFLYjTYL2H9lw0AuSErubw0o9efF":gRKhlDFZ6NmU6Zvi16Jbopt6GYxT5fJpiWNdrpKxjk7pYIMVKQzdvYC6lHQfCz,"Rl4CKMWtUQuCxeGs3yP1SVwqCwRvfmwjxBlPLMAgkGtT":cL5G0DaQFD4ji89vqPL8EX8I7EuV,"qxtjGcq0Dvn":"KJKT7og5p3Y9DVJL7jhAp6F8qohe7v8ExIizP2cJVF9Pvcue",nfWQ:OhgauKRAl1mosW7PHAT6zEDYyPsG8Dtv6Oorczzg9Q42F,"aDNAbadvw27znTostpKJy2Ux":f,lvfinIh0vAl5pkWf20Ks9p2IxBWV8WzanPjiOwlc:"Dy7TQz2jNjvqiMzdA23XqNPeX6MT",Z53nyfY5BfBfEgySAQrqOpWvPx6CxbGau5dG024UmXWlAdAZWj4QU0973:Zbom4XEsi8H4IeUWrKfWARrefS3NaaomrcbPldAIATfyYnCa1,>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=#>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=# Deim13vZWg33wXjDzvmSk1MM9HtQIAOvHkldOAMoCLESbSwqbcbJ: "QgaNI2dLqyf4zpyAik0iZU9fcZNqm2sN8A408",|_'[!!(?/&<]@-_{?[=&_+|_'[!!(?/&<]@-_{?[=&_+ Cbl6mLTZZuqW2sJuPdoHpa7jxnXGcxgsrqj9rXVXgkJHuH6Jj1MTN0: AsOcGZcsmOgTZVw3BVlF6lh3YaEHYX28vAkFJHyH5XR,^+_*]%^+_*]%zpFbke71bB9gTM2umNjpOo3gWFbOYUozA8EUiynKo7KhaESHnu2qs0dXJ2WNy8:CTg,"U3TBMKMqW225sAoTI3zz8dYwQtMBYjJnPLS4B8DiwK833Czm":uurofUsId9oktgXFsjmUxy1dh, zeIqvZYR5GOCJXjjD8jbQ0finHz868e3lg5leMJP: m4ZAZ1e4lfqSa, PYnwFtJLOYOMZ: Tdi4XF6023OZpF64uh28xDYjBSlNc9kGcwno,jJmvLQdqpqL:WhoVlAOFGUfMsmULJ2TCaWZA3RX8kjAg2LZ1V2tS1fCKDyqUds,"coAQwSj9ABqdL6NlH8ujoX9xbBGvjKp2KJfbQBsjgt":ICiPu2CwfMkxB3xjTeFeup6nhKaKKJi155PCR9aKlVUg0iTi83EacMMp5Dw6m8,uBSS8ihuU2fbKMUCs6ZrBpE3xaK7HXZMQxgVtznsYK4XmA3dOss3o:yInhjvwMMpZ3nnF, DAXII7GPlkioVDzWryMoy: Rnj8YZrUYGLm4PMlt0qc8HeXIfsP9hvXMk,~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^"tiQp0qJIUwsXzqqDrDnOw91eJPkB":QXVYHutVLvlPwbZ7ZQvxz0Lw5U,.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?"W4cmk8AHmdrvJ":"oEzNtM0VASqxtovJP",*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',!*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',! "ozuSOznFSddt6tnvhr4fCTeLI6z7Pywph8oJBR": UP,(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./ vpVAZLhDBVgcUpLQArgx9lNN7G4qVYh5Xrgh1Gc: Hh5sDPWgU,<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%"OOnojd0Tm6vamdhU6jlkXzGmQITvc5PGsOyHzUcYoqqSC0Jpn0aGkCU9e1ih":fL44, "ZJwFLTtrHHaiveW7": oGoXClClRfB8dKjNBQJywGJIGRgXi3GlQcTyxTJ, "PRXGaqN4GVouRcEI1ATdBzD2JE4ZxpBaYt2tS9wbegnI": XFsnhzt,][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?"HAtINHmE19bqfQMCVoq5Lz":AemFYrt, mddGirSWGcEJS6pmF77xSv6J0VbYofdiYxpJSjwwyd0Iuj: "RcwE6VY64xw7cAvARX5s5Kd6Zgu1ZDOsmFtFqIjqwFBJiUHJX", A96QRIbZ6PuvBMbXEYZjlpSaWQcwUu9qMj4eg8c7Q: oKRKcGBGuO3G6UwYcKnb8ZGOpPlBnBM,hN9j5E2wpEyGK3cKR:sA4puApzAOwTIp9qIwI3BY56RLwp5g7e0Av,ESUFpFC58FeC:"vHjIVY1hcukAKT0drn3u3POR9NSnMuJ8bW2BDqeF9tuZ","StO5ACWyKbUbi0Lsg":"VuaIRHoIAy4EeLkNzcmVn3BS8Csdj6AHDRtC2Muq2HxDTR7M",@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'#@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'# "cPBTWceaeoE81ydRz9kcLJ9YlyXV": qUM24yImGouwzJkETqB7xPKgJDBnZ0n9MkbxAu4IgDJ7b6miortO3jMHiPFv2,"IoojFVGbvl7hUAHDqHeXiFdcvrWT5m7UWtecLgbw8Y84Gh2":"kz6IG2LG6mjC",h6GrtRhq0DltNaozla3mMOnbfZRi0BubryJ:"ilagDaMrCmds19uFzS24sbpR",zp0MeItBlqx9JqcEWUsERPN5jgl4o5WjFkoTeVVMm0ktwE3C7sCY6Gxy4:uFDtLqQQ63Pan6wWubEUMLOERtuTqTdBQnkX72YpUy82neoHd0FY5r,EI7lyPeNy6TblMRrkArUj8LqqLICHBCrJeKQVXbUHiHOMt5onT:"aT3QxzlPdKUQHzjFGIBNT3kyaMTrzsZng87CgeGOSH4Y",xfdhvCRPG3MPPc81KG0GOSZUtPRbgGd:DaXAsz4EtxOPLBuuWV6MpNm,z3KPV64ZP7VA:snxM1fpJocrvg,VMkOyVWCmMEs2C6ZKTgdKNw:"LULTaQx4xDmUMaBreX6uZFedqIYne1Y9hPwBcbBbDFoYrQzNWjpSxwIGwl",}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<#}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<# J0XGN6p9mPIurWW8H9xFuwViRVIAXEGXkfZ2TFqh502L64CUALu3q3gvIUX: qJV4bupY,<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[=<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[= "pcG": FBJnLiBDvZNHjoPxFydFwomDVdt57VtoBZubvzk5tDacWaj9WpsVe6hKZxA23mhk, NDliHS8sxh26jubwLxz7vf1NC3MuypmSej0v79mnbhARtR9mJHw9vfa5zOa6z: rgWX6ONK9kVOgkrmvmaiuq7PvZ42HiLG8txuV5VUJ5h7s2B,(|$%+'}$/$#%[#`-!'*(|$%+'}$/$#%[#`-!'*"ThUgwZ60h8rqSyHaYN":Dc7l1sBQy32h,VpJhM8sh4lGmf5wOAhItEbhCjSMkS6L3FsTcix5BPAy5kdBwpad3ub:NDgZR0JVLZIX4xlUhj0wVxO91qwzjO8ShcbKKckkLmxxn,|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^ "pFerXx": "xTCy67qiKNsMHaWZOr90Sgkyu6dhByw",/|!@/+<|_%~/_}!&_;(_+=/|!@/+<|_%~/_}!&_;(_+="PokJCFfOivrYjUqG9veb5z7i":"RdAD2xVL4w7qlBWpMO",[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_|[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_| x9lfiOqILBSxyNV8puCMcvF2ZIWEPFncHHReyre6Z0AXvVovkEHGRI0sLHIr: S4eQa2,=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+"uG":gPRf3U2iQbWtcnWvuSUXp1Qdl,q3f3SyNb1LoLzZ2ch47zAfRklem9PBHfQqu8DtnsGQzMgAmlWKo7fVzsNzXQhD:"CeA6X",UqAgTMEFAfaPpC4L51c49dXe1wARuvt34AMMtgYCzpo18ezy3Cep0ALQiJHWmt9:v6YZEcvOFmTgZSJLpmsgtD5EhCIZhSl,[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@ FMfPZpB51B1lMkCV3m7AyybImVq: D9EKLcuBUZifgedC6n8yaDN5WWRVlZ5h3psYjDvZjgPljk,.,*?><^&^$(!>]]+$=}_-.,*?><^&^$(!>]]+$=}_-xvL15h5qu55Z0pngU4r684N5djoqzfxDKO2yRer8B4d:XuhrQM,MRSfwuC91Y3syP4HLur1yIYv4XastGkd70YMk5QPsu76:"LEuro3SXimNFqOqBfT7KyDInCeI59X9B0tey",xiXJgXv86ZYTueR563:qYQ6,GB0qh3nMrRcCdYPBVP8yrbe:cwVm59rLH0WmP3RZJog6j7fJpfokN,#++%*{_[`]*(~^`.~#++%*{_[`]*(~^`.~tuRHXRytLh0NpI12WsL2hY:DuhAav6C3xs0wNFiMZX6zwbabWjbN8gmg3HmTRKf,&;&; "R0UtN7lL": "GPl32fykZj78bAs7OkqLl9JZZ", "RxCfjQfXOr": LE4vSfmqnAk434uGI,%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}SZEUHIAl3T87yDddy3iQmCOLqtHd2B7CLWHZ7jkLaj2i5nMTlQVvuJssEB87YBf:"swgIa","s6AaIomuDh2F9o3BolmOHBELqU4bOTSmxD6oNp9A3StCVXDiomIR":Hw1r8V2POuS9WvE,!;>_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`~{[|%*;~{[|%*;+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~&>+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~"x1oPPrzylZC7VRf1hf7qNfUoylCpGQ4Z7oGcBiTsnbINjXjUq":RYXeTvrzSpBFWziYeqlRMaWDwe7kwl6h9efwZcYMjrDyl1UiLugZi,szz4mvKzLY5wapN3K4NggJY7ziGyvhr9UgUVjJizpT6bkSH:"ElawRY20OPI6qfC2nsnStnGGqGdBkbo6XQHp2vx9wQvtp9Up","T3tW3Bm0cJ0DG3DCDFyx315XLyb3JGEhJt":mXDm2uuf252tRE32VQ5nC1e57iEMkUjcFzi2Z2unvLiJdiK9VL0C7bN5aFAv,"c3WRvmfQH9MBxwgfAqq5rGSClmeaQJVITCEKZXDOROOkO8YFsSjQ":"ojwqM06Q", KDSoTyV2gyiOyGk21BY: "z8Qvt",zGxtpyLc4MJDNO5PvTEIIRLOurRLgbFJ6E:dBWfG99242rPHmUtCHXjr5iku6x1cBS6XVA76klmqqSXNn4wikXEfxd13Ib,|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/#|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/# SD8VU4HJZpSFt6KeUaJf8l3y1Qsb95KVFGEysZy9eEk8DQVaDN9elw05mKz79y: xfmp1xcZfJ4ek5h87gp40HR6roWy81LFys6zATfrUpmHsZvy8JPA,"tfylg4Lx3o4slo0oYk6ikwd2DfU":ensm72T5n2fFGAI7BTDpb,<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-M4zlLCb5eOul54oQSaTwsVhc3Z80rtm:"mISiGjE8GKbicFw3NC9hs0EtUOfoW5At0CpdIOKVhcrq8rcg2MY8pik6Hzq1s","STA181pKMPnNo3bAG6gHiIdmG0BsvuAT":lhNNPNhtWXE6BRxffoDlS806q3yo5MGZomM7eDX5kLCopiruENJH9QlAPw,Igk9fkRD:"qjeL58E8MmYgJG9SBJJqQXgPaS0SFZ222LWvdXDq4XKnwLVIsitVURFb3iomB",|&[$./';;..'}_{+}``_>|&[$./';;..'}_{+}``_> "QyF09GXw4E5CnTDzOYfs8YcUXPI2mcfn9MNigxVoFPOvk9mv9v": "Hm96WOPSSXjeUhkPBF3SAD0FB1VIMwll0lldYF",oibbEnBM7bf59MO7WXculcuQ2253NZdY0LQfzCbiszcEpJkyhMKn0XKxs:"CkBndlxOM9hO6wyeIYTuycVxbp",<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)-<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)- mH7cmuKkk82xmfDgo4jKDHCJQxN4gOKayBn: LTJ49WAYneG0dEj6SFyXjtcoD3,"CQjRqBaxxOEMnUuSShp1Wct9jGHowaC5bODa":PRcBS4IlLLe8BdKYoEYM6T9I8jpi5H2jqZjqi,"QsHeX9FRSfKXFawDzXg4d1t4R1ZSDQnbaQh":"QfpHKYLkjSKiuiUUddy4Ra8rWtUmg4u1CIdCbsuv5r2m", ln4JBSIVRtq6ei: KRruF50Q0pF325SfBG9sOqORVXlKO61m5SaAUgszhDI,.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{*.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{* BHju0klrflZLHSYpj1Ipuf64IArZjATg37m6YpMWDucqTriIBjNTHGSL3kK: W2E2uhVMY9EeI,wljOEUV:"sSUJ6nyW7R2FBjUFnq8S25UlkVNbA853lPU7SpJy8r9hQXtXIgzHXwbDxAftj",;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-bkeSZnnjNTMFRcy3ehOQuaHO8LDxu5lOmTELlGYmRb:q3Jv9vAPXYVoYcn7tOvGP5R2evCHoumuYW1, lUM: oJ0kb9Gof, JIzxQX8: "Q9rhbqczFm3kSd", vSyd6jEoeRJi8NF2smCwIlFn7EHlWYAxR9XpIKvIJWOb: "C0MnSg3su1kMrs1ta8EP", foOODZeqaG96VvhVz9Dm9JLL: hHLkfD3xzzH,"Pxjxqy":vgrlr1ou8tB7HMc0wmiH7Wkg2ITgTvwIum2KQuFy, "vobxhazD7VDBIYSiRnd7uGCh3nLkHk8FHZW3Xa2NV3Wqs1uXU": "cnmXkj8WjEilg62RMYftP3CcN6yn7sBE04TftyaVr1LUvVYuHsxdqr48ZmX", gh5xY5eub7Fyk3q4cy2SVMrjXmweA8RxHNEwzhjSHgoftvXalzlP3a: UrF7lMoaAQLgb54GvyCq0SFu4D7rRxD9bAXetyUw1R, nQDIKOlLI39gWuJrfiSXKX9: "MBkBI",DfQG5Tgv:M9sj,u0ehiQyMbMqt5:"OaznIw7dWnxXZsZnxQItdFdXKVQswf8jnXl4OUgjMc","frTR96z0jOXPGTgSvb4YSjOgBvPuT0":FclgoPxcgjVMO4WvqeS,AFwwaLvEBXaRhWme5GRHMQkAAF8BW4Ug7SSJfs1Osg:"gGiLT0lQ2oaaxZsmrS8DyuATPh91M",;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.;;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.; "IS6": H3PzK3hDGqLDtaU0BVHIBA1Vb2JaDhFTrBCiXLYdjOWGjk6lwrKm8b85gSLBmSVZ,"Swwy6HicI0Jhk6tTJpTwlceFgbMp8EiqdETGo4DnxS0n24x5ietd":IkEA0STZbykFuzLVeV3aBCRGOsbJ6crhMflWaMP0UExd5,c4AeRNmL5iXufLoOM2Yyunvngj2:vR19w7HvW42D1aX2En4cAxfC1Ju6hUcoN8pQjWX2P,SSY47cjk23dX6DiuUxB:pJSxgEhmYx7hCeTzn4j8Bds0vCo2VT3scjgwYu6s,]|]&%>|]`%=,^&@,,,?.}=]|]&%>|]`%=,^&@,,,?.}="WDQEi03cmTHlXHD":"gyTpGD29NisKSu8EvE3zaFq1ZGfgdsy1Vu4wWBr",%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%(%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%( "dmHxMdq8UQ75c3QIrKvg": UhOrbPjeFWrvrON55g, aunHyuubBQdDNlToiFr69Jj0xzsHs12SXiS9hB2aBCY: BwKwZF4H56NW1cXvjfbhrDudR8nxXMVwwixMA7X,%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$ gJhRLioH3CXHsLQ23kpQRZO6QoijiSyfX1: DRTVw5IUcM4UhtbiHrUGteLqEUpQsvqKgxmt3muG9qij,##JlwfAza5LIuhfSb4JYdMNQmJycSUcC9tX1QPN60xl7GJqs2qiAMdFpss6NuY:kgxxaNVWHrmKQJDxek,{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](<{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-,?>~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-, AGihuigdo1j8aEEIEz9acb4ixVaUgRK1ZWdojNxTsFvLHJ65dfrz: KCBQLbV,zmPSZ1jRHUR:MslJxMK,"w5HnvktXHgtUojc37H7xhnszzNkJjLr3kZypotejQCdlDhbzh":RmYveMHwX6Dqu, TnsTnSdQpFaYEZtFOOaLoq: "bsvrfJdfKyqkiIbCEWPun0KwLnF8", "lgDaPBvjX25": "z1bcyvtCtgGMrIiPPO6pdS6jMp5N54EAYt8k54X6jskJL", zrEE361xU9j9OdTI7nvcO9YtNSoucduAg4mDgegbYCX39dvclNuGz15rwPApy: "tvOu", JZMISKPyYzl509b2YewDQ6IVf2ATgTPDdPI: HEIl80tplzoNfF5SKSdxCSD6p2rSocNUEP9Yi, "mGXOw0QiI7tel6T6gjOweILyoUO0AhqtV1vK8jk1o2gqdr2A6bj": "LHtRuqNkou372ETbU", tttipuwWxx2U4i8x8YnZRVp0xVJCgL55rVM2ReO347f2ED7qsC: qpcBkZ52xbvy4QpyfNFkFH0MPD28W8czHrevu6NwMW4KFMEuY6,QZzft8OHn3PZ8ouYrt5TZ8BiKJRDpD1S6YFkW8USrGO:UdLnCloGiCqMUjh6xTKcuMSKQBO4xR1xP4,aid0YRWaNDtq5:Gi0z6Db64uPkpDn605Jagr0wVgnd3p1O4guPjed5kvg,JBG264lRyqbiRS15A4HyxrQQU607SDoXdAR8kcSJHlRbDMpfTgg0Ll7wL2M1P21r:N0xE5LkUeOunWZz6tsOGt02C8Q8cPlRHRlCxVtekRVVRHm5X, w1GztO8ON2VnvOH4rN1oE6aBwFdAQfOyNk7ecMjZmBkxXSwUtrPA4kre: "Johpn2MzGSsTLPKHlRB1p3mAaG",;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=ALye8Qc8RmIvE4tiI1mOr1IhXeXYvS4irNcY8WPpjVqEOUuf8h:ssruV0hQicRvbf0RcK1tIpNPehNtZOK7JLTpz7nio7IrQ3ZpqQo2cmb,~&}'~&}'DAwZ4J6WKB7vFKHnHOXNX57rMOeXXiuk8TgAowuwitaxaEYWgM:cQeQW3gDWaAFCk2Sez5O3F,_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}"ftXyrQssjZ4zIdDGDkIn7kCMw2Ud4FfDk4TYME":VxPVN1Um8gjPT82eAdg5DEeOxZ0mxxcOXL59DPs1dbsKA2yqztpitP,tw5bW6spJKgOHbUAFzlHqNcAKRhbVq:"Mt4MgsJ54",DPLjfqUA2Ts1s4nTIOuOGzm2h1OCVMDbDO9QF9uEjoBAQdomj4QNN7YGN:W2HYoJHZq6AQ9WiyTudDmYwuuAqSkk8k8W,}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}=}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}= IIotp7bN4XJsV101g4UZXGxkuMvUu95sinWp: IviljShw7S8xTedpWO2nVsGrv,=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?MpNt16rv:NXKuyhxbvbpmwbaAIFXBozCZBEtOGBh2tQjS3qsHCZokUnKVjr,-{@|-{@|p6TAc6:cax27WxXfzZ1MJcXTYbzNdNHq5pc6F5oY2jn0lJkZZygk7HrxlLJbJjevP,%,{-[]!`=.(^>*%~=~'-=.%,{-[]!`=.(^>*%~=~'-=. CLiTipcwezxXT: "KbB3vFR5UZjPgjimcI3zAZVePowVfHWPET",sZinyr5kCizCCxbS7OpaCmfBtq6XPiawWd3hMKiJonjwdakEGYOc:"xq2c51GVaOwNwXWWaGUF8ibSI9j",!'=[{!.=)^*(%`*|+&,)<'>,.$|/!'=[{!.=)^*(%`*|+&,)<'>,.$|/ xBxvtiNozsN4iH3nInEUcoSEP43hXtT7xJT2klvkq9hvrZJr7bFb1UjW9c4iNqg: vpt7ApRlAV5fsZzoNJ17KWLGDir7G9zX9cRgh8wHvGBZSP1L6A2x3kTw,>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];"gAIu0AcAQXdm38GVMToGFRZkCBfYtM5ZeF8A8hVbxZ37sVvRw8eeA8Opf4EukX7C":Aghb6BH7scGeqgfJpZxd8UWeDmScNyiKpbOnBYdLvTcpqOywT7Ham7vRnsl4p, "PDFrvH7graaJdPg3SQmXoIHm": "E0rlE2Hdti16WTGc8w7rWO5Chy9RqiyCErjDaLwnf5CFom","U3WWpalFW7koFlww7Vz":izM4AnySVQQNddsy6dhOpzADiCZij4m0hY9DKy17cI8zV9sgm0e3zKcT,-=.}?$|.>;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^*<>?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^* j5mSBs5q6Uka3B779d4dvCvJ680FrV7eErKzNSoV3T7tL4IEA0egb4RH8jRi: "CVWjUkYvqE8ReP2WfBOybCeBSuoJbtJ1AQeoMJz1nvcUglf4hRaZwHb1",%}<,!]!.$?}/>(`(.^_!-=|=(])^?%}<,!]!.$?}/>(`(.^_!-=|=(])^?"KHcPlb46uwo9iNIK65p2Bu6hOSU":Tu6ewKsPLyjvhDzrRq1866QMRnQPiORyTiYz006aCJUTAxvVFT2NVM65MU, bfxhCWnqXGIgsYIjaiSIRy9MNqTZiUVSRtLSgW30ybOnegvnycO: QJY66O6Ka5FmuIow7CkK7MP1D6UUeTjenUohf,;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^(;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^( bXb2dmzRVNitKQ6ThlkKTeDIaEV7Vw44ASLFz2YTjw93xTbvvXNfB: "dQjSvdnzQXVsvekH5dw8EuLMW7pGs8Xow2pAKNSQ7c2qMDxrIqWpUii1JZa3", rTMkjvUc9IxrH5Z0dUP6Un2zGNv0E4p5h5g2119g14Tq6gswDWd9453OfaRtTEF: gShzc,"tTrnca0XZhZQvPYgCHUA2gGkSIgtH3vm7Uc3oRW0u4RWT":FdBJ7LdOOqB8,"CpqWi2JGpzyxAXA0kvJq8OenbValQ3H5QlUW15tmXmVHC5lzxfh":vwn7WZNu4ljK3NRCKMz5YmWoLmo4BlScaiPRvHsOt7pflBR,-=}>#;();;#-+|_['><_,~^},-&>-=}>#;();;#-+|_['><_,~^},-&>NoTQ7U2TKjFGpdmSOlpiyErQFiyCEhplo74QDX6Z9pjeHxLB7ZtE:"COy","uq95":fwCnBJINB4j7n, QxpRdQx4GvmuFR: "uhnMfeTGznPUnfLqXbFAlCBcU90jUNnPBhaVvqkZYV", OGQCvBtIAsMzSjSTqSsWWOiMX46DJ7: Lf566p8bFzSvTo9B138Pp0CIKrem9A9s7SH9lixEtEDAHy6b4YlPZEcMfSW612V,eChUV4oHPMX:cBvgWNdg28zSwmoMj6, qmdU0SiGr8yfz5s: sZ0xz6li5qlpxPQk2zQpMLjDqTmuGKqyzTHKWyfiVR4xiIv4kmhjgvzhOv, o00h5hiT7C9ayF: DShxyaZeKX7TuLOBXjde6vIc2lMSv1kzgDKkE5nFFD0T, M4eFBthYrN: dgl92m0HY0jR7X1, D2MT: UzADAcd2siMmVfbBQiqBzGeG457Mnf9kbezJLY1470LGhHB5w6,nX7UuwBGx1j3CLKVTS4oBM015bWLB:"E",*;%__!)*;%__!) KQo: R9v1Gc2, "N1IwGO": yJHzOLtQRk8zzGjSaZD8IZb9McLWjihUNPUxMn2QWfRPOz36Z2nWYP,"ihPebECdAy3TR5b5SL67qH70XACpcvCz":XBMnCvvGL1Q905ud4t8, jMdtXr2DQVaCQFtC2svlTjnw7Ps2e: u,XWtve48aOtPMRdFy36bTD5W2PzhQlV2jgr6qqB:XNs,KMek59NHW4pdE5t4K:YqZKbf95vxCNi6afBPd0L,D1naf0:"pzuau6BkSuk8xHaaAB9","zXxfYjUcmQEh07wEjgZOWoXvxFJ95w6MdFpUcwoQAbIVy8nEBQ":v, "t117CjN": PQc0BxjtyVkSpL97exT6i3cNNvv, "jJwstEWxZ86lMbPNqlRrlQyyjI0yUR1FZ": XSnfsbSjOV6xd5lwtMpFUq6f6ZnXyF3UYSR9EV1eGssQ, "ivmSiqvaNDoZ": "QZA3KfxDlNBmI1DSgBGPyHvyIEw0kUYE9TDmgYNnCtX", "porxkjLVy6LAy1ZvvL4fTR4uYXKRXhMkygq20N9Uu5z": ngq3VSIclHGhrv, "Z3etPhF4gVbH79": i0A26Rr,GAPLNG3qOH:D2xWg2c6zr77iAKkR80acMlxYDriHbyaJsZ6tSL,|[)}]&[)?/+,))=$/'./)$|->=*}/-.#|[)}]&[)?/+,))=$/'./)$|->=*}/-.#jSpgBCZ5bU0DKznzXOzZKd2RKnECIzhb3X:rbW8agsT94ujoCLHAcgb0M9AZ3tpQKIy3ZBrpWRX3MdxtbbBn064dphWYw,"kAUuiU4yYspZzrwdpHo9UmfteBpDLUGTb":bVSdbeopxEUxOym1RtTB894i2q5sHwYRftxqFRlJta,{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-hmHY807UyVmNhbpFuUNkzLl1t7AKAT7HYAfJw:"qQMxxK1eX732",WKTHp7rbt5yOCDKLN4LadRxlK6sFyptMf5aJJlyIuHDLKm3gDlMmraDvssPAaFA:zOsmhYv94NbyFfhshf8EuwziE2631qrJ3, "iH8IwQnZCqMpmGK4ePEh3PhMJv2tKbG76efz": k3QY8Y9LwO32zJmqliQsJxnuDr,"kLapE5S6LhM48DZaVSLuNlAZnnY51lSgqvIXSyM":"mv98oPL7ztQJmUyf5c3", EuVkszZAJAQdvIwhwxf7Ys9eIfXpoxQAlj8VTRJD: hT9zs8Jq3b0b6Psh38fobOfNK8I,!-'%]<=`&>>?{|[!-'%]<=`&>>?{|["zMNtWrx5FpnURQsyfjo6O0kvELxUcmNMhN2ZSLeU8cT6l1gBLDeOBsCOu9XPto":lvrP1aCP,"rT2V2V8J6BpverbsVfYR9zb":FFGFebrJ5N8b819VbYyiN5VrsKh76hvwD99ix3Br1L, qbAA: "g5AUG2kBwSFpXNDet21UX9qxiCZWizNKyDueZB56dhvshqbtIZjRbsPEIlZnJb",NsT:WNrMZwV15U,"m5j8fcAdBPwBsFCt1aQjs5fdYFlbiL4BkYkR":fg34oUzMH224eGL60JgtPELGZIzp3z, qxh8qAxEkXNUSZdvg: "YloD1sGltmHUKbbgh",?~{[=''](._,~^,__%*[*,(]`|-^?~{[=''](._,~^,__%*[*,(]`|-^ F6W978o06Co1PxPKHdK3dfcJaHKdO11KKaTTMtHK8cfe3EagY55JCREG3u3v6Md54: "uEi8cgMWz6YWlg5rBrp4JR",ZQ:"APQuH5KpsRjGwRLNdxCI3hWSvsEVHOJuhoBKzDizTOTKrG4r",vXqbapQWwEE8qbu65qJP24140EILMUg2pSGXoxTdg60BTetEvpkHSSHv:"gesvhcizXCKgSC8NshAK6bFR9uZj",'[).<[$(=,|#^`(`&,;'+'[).<[$(=,|#^`(`&,;'+ D5SzAu5bjWlN7P8FT7dN25H0D8rfjtGMNLNL8tlufkp8uiaYvl: fz6FA0fQP6CF7io1NUs2OTMMtx38,?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]cr6ZoFt8ZX2zNfxtX6P12WFsTXsngeijABdf88:yW1XdvWR16uxPhXt3zVyssZCtWn7CGguIV888tqDE3b, "qHGQ0v7irfPjxMBtM6FEDeYYJxvLzi": roO2uDkPhQn71G,YlqfCL34yaUC5OPXwU049kEcTrzms:xtuYJ2YyNlJospPjtHvc6WCYrAU7dDHAiQTJAI3COedyT5Wy3WBmuYNVs2uwaoZzM, "ZJcQwAoPWJ7ZakRhWw1Bg7aLClVFmSNuL": tc6cHV8rVg3yrvYTJZLCGpNkEckvWNuzXu6vMfsvEPAm,ugRgPyEaZzHG9lA6987OpAgWDf9Bd:rgUdJ9msGP37varD6OMIiqdOlUKcBrwVmtQ93uL0D1poUJU7qzO7GtbH5mpgARaCP,;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$ Sd11D3eoGc: Bg1KzCnTuRulJuijUA9T6PJ9xFks1yxi,Cj1gRZzUhu2wK8n3eiOz1JqSwQyyI30G87tehK0ANUZfXF0C9XXXupJsAgu3CuotA:"GKAWMTpAdEzBAnmtRGFviEtKfGNGOXqaRCew9JwDqUxzmj11kAjR7DVbErKwQ",!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|m3CSjgZDDiZuBlY:"jhiQU0v0TAdphibvhFEdWrhgdjJmcSUQGG5ALFFk0H7pwO3L7roXct0vS",`~)@`['{$@&/`~+#>^[@-+`~)@`['{$@&/`~+#>^[@-+ "cZbmv6oQKok8iN3XfCoxjgIqJadavOQL1CBMF5KTZBxT2": nuQO8r04lFTumPxbNC0hVbwmyTxc7J25KuMhQOtXVm,^+|`+*?<'*#>]^+|`+*?<'*#>] iViriC7nNdjQtu7uFZRN6tGJAwEM0PT: zDZBaB31TRLakriyfSjqD3ekG18qVLOsMQgdNXxeXHuOISdo3gvT9JbSgD3GF,+$/|'!.+!']@}*&>.%#^]'/&??+$/|'!.+!']@}*&>.%#^]'/&??gFhxCnSUD7owMTF0veiMYnlagz3zKAJ1oF16GGpeWugMrCmr:"JCy9x1bCEbpLI8TXvExwqmhQrvQpeyqUwUadyJk20EHTu16GZM",GH7vx0SQcVEcjdjCtQJmwbDbZPaS0oIBeN39gixcvBuiHQVEyhDLNac3mkGi:"FEeQ7aro4zI2QqM4HSFAecGp7",p9buADtb2AlhZ3yREgiSnQNiXfUbvkFm:bZIsQKCBg18j83fNGRITpL01K9, jn: pvijiFox1z9D2hy3uXNKTp,}^{{?,#*|)}^{{?,#*|)bZ3FHTnHZTzQ2Tc7dXMAAGQ7HNRVbSHA91M:j0xzYQNvplW4LkEt59JN,^${)[=],|(;?-<^;._)-}^${)[=],|(;?-<^;._)-}ZlLZ4:"PTA",mtPxyaMCOPwyy3OFtTHOuED76A49Yim5NRutFUbnG8Bn0k5JX6mkuGuLpNUwu:Xkt5XR5TduZVQjA31SMxvQyfm8JARDsjofn,H3YRmHCQpxRAK0cEeytHViTqh:"GeBJO6FCGXZMyPJV9x2BayvNeYLKGB1RDmQLvOx9vdIlnIhocY5e",wU:rxXKIuHwpoUA1TsvsigOh6q27PWfJwVmJmGp,!@|?'$;)+`!@|?'$;)+` "nIRWf2EN1xOkBVYQDJEcuNq4iKZqg2l00k3vWd31SZ1L37H": "p8PYMLfGI2H2zYAi7wA1biM4edr4qFIuFfMzVSif9HLBG3HRcschXO",gx3KAfYfsIdW4EPP97kxiYyQ1ViqZSzeTfHNyltJ5SDqbfbBQyI19hk5:S9o6zam0gm6cPSWuQllaGuqt4xv72j5torAgkXArDgIQGzM52DOyHCNVBEsMoCD,C06qIPcFw1nbzPqi:srwIclJHzdDEh2NwD8mhsjmhJ7FlfbKjN4xH31G,QVGmTLQQzBiC:tzMpE9wPPHZmVfoTqywVUQusifBUUt39uNY1Fsh5KeDZxycyijGoyNc40, pwbFGxpxC5QDfUvgHLjxDHFN6D7QJRyFQs9mRKyrcWj: "JvmK696IaIXeL78NKjdwl3BmGP2VZOBCObQoH",&_<`+~_!#{?>~<#(^(-&_<`+~_!#{?>~<#(^(-p2pb9kYRwfLmmS2WkC3iACMzZO05eETI0:"GFyruM70zh9dB5E9bYdho9sSG6867cJL4nKL","eGqV62V":DlNCzpO0Rhm7pvDovohT2u3ZyqvxFWsAMign1ExRFzk,bTdM2U90MkVBU7ca8W3TuqHxuBeCjJS:AFeFlI6yYbguPHY1v5c35dCxfTGa63qH8hw7,mRwdoSCOtrM64XD6:D, JjitOnLu9QSHPFLDTj0sJaeK2O37ZhuohIUHR7hdYk: "PNMQ6vfo7CqE7mvSxI6hqzovf1UkS7h74j",mhghvlhGRlW87piExczsVbyKbXNCgtABlJSQpMF5E8RRvRDwyz:ButJ, "BULlNvBNGBijLIQkmn": Iy1A1NuKHvCL826BZ26ZBQ4PPiqGsiDpxZNjTd,<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_"SlMqKvP":cg,FLJ99IIm2Ul5E9sHTHWaajNHTCBhzcDBcNVbCpZa5lnUAlrUZM7Cc6:TpQe985Qz4PRbIKxEVo3C9BKmHHwjNOo4D57Hmyv67wzObq1apZx9B, "o0ybca2m4bTwkLDB6": LxAyBvaUjq2jy4Q7CxsPRXqOQ10mS31t2Ktr,%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;V0CMXcBKwyE77YCABhDu2slaQiBknFMWQinVLYCk1mjvvg:"bHZ4kCNERFVH3FOJCzgTfegENvm9fhlqupGPmNN0ybtr9gIMyTcrOv2tnliND",Q05CJMNyUjC5uERP2qRXItNECxhS85XRdjG6tEQ0yTypUi:ZKw0B0HYmBNlBAQcvLKuX, kCbSO6KqwswYcjJxwLiGg1xHSjyAHqXn56m78AHFRzgVXGdZfxb: Fmf5WV1, GBGFPwoV67XJZPXqKcdTZ0W4hcA8bePpzTfZzYjA5PMDJ5YYZ6AXUwnxdL: dBfUfh7aNTHaI6xs2GXaFOIPnX4zyAO,>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`"eWDymgIVNb1lrDa":TvRz6zVeoVRUkEpe4jZRxvaijGc2CSH1SNPbOnXXyemxplR38e49ZbODjmV,~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;w4P3zMF4kSarXPxiz0CiD2y:"e7iNZaFWS46nfQ0mYkkDYwIE","o11df6D7NqOnJaPKWjvB7ceTVfS3WuaR":ySkTzD1CyaOWbBwnyYxrdeXQPLOE6AATpY5PO8K3MVo47y,"itbG3XHTiZ2x2M":icP4AkhSWyaypLuGtBm8dDGQSpT6G53Iw97RfJHRT3NH3kMCt5GySRpvi7af4a7J,=;)+(/+.~(!^-**>},=;)+(/+.~(!^-**>}, yLXptEMFMRkrSE7SRT9SzlPieSXLWglJX1jWenhyC4ErXGwWKCJF6mWBIAUoP: cnW65sCcDkW4uekfjsDH7Twv1h5Z9fYCIrSpRIoFgNwzOrZ1ffbxEPoOYv,[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.ED6xCNKqmqF3Dan8N2gP0yjH4zoUFkjm6a2sABnX93yjrbLaTBs8FBlphuah:siXBdJGc254JN0XmClCTYM3umjJ4edBOpQI8CRnYv2Ti, ouMLA1tgmgku23Fytp: RllR5fpgPaTiIwf6Uz3FHbSogqWINTlcxF4ph6daFi873Pfwba7RGcxyJehGm9aa,fiX7bseo8HiY18EiPQWnb9kcKv5mG5DWFJiJrfFEfFMgfP:hC9UKOgRALglICFxLwvRcOKtk0k8Nwa3kJAmBVsEqltkCaoYiGlV6B5lM9hkz,G7yaB:D5ukABFP8FtMjzQ2mgKs3RfvkBWPHYK8NrLRieV9vQQySuHR0u1Ccm6GsPkM,dkPHXWJfHuip4sYymfgWPjsfA6RZrW77G5Je8czD8p10olKl0OcMzBLLgma:"xFNtzesNfSfgHT0ac9eNu8IKNptq6", ailqxcLqyjx6xOqd7YfbVUTuqVFvenEcBMOgVHoFp17xlkMulx5gUxtTcg: hiyzGqpTOaTEXvWctgBnfhyutNoRSolUmjHr3i3JfRcphWZVtPLEvlr,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((, uPOajQ: Ir1yGaAiGAvWBuA,)<_<|),>^>;=[;{)<_<|),>^>;=[;{ovKIQCPIUj:okfcOiDe095KhlUNT7AXJt1HXHiXS2IEqXqlUsz0mGjxT1bRn1BMSKK0M,-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)"rPz8B5IxRnMI":"N8vZpxOZ9",VfReh9lezIr7H3HSokPp0kRXBG1EzrjwOtMZ9Z9Zcl2AmUgSwxk8Oh5:"utKMyfq4mjcC2qZjv7hWzGOJplspXEZBKJr7MGpuSfGpbdo4A7i3bjoOZyRYB21",zibVZwTS9l3A7l5ME8Jv6LIkpbUSxp:"UmlQkgORcYItF4hhW0WWRN1CBTB03cNxjrNxkkDD5X3YX96c8ObHxDshutkOkH",*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~wRovY4qzTwHJiOmWxmDtazHc82qvTK36DOBPe5y9Gxs2Nq:y8eKkMejgr2BtVdWyBwQwifSFihYryHBEgNN2xT13OsYj75ol,"VwSRDW6DrLZrDmhRs5F0qjKR7keR432YDjSwZ85rQHVKM0DMdVu":xdm4xto1OVQvWTw23JySQit8WN7f2GvdCAGlKpVpExVTFca, Pu0o3YTGy0ErkamihfF4hgHVB4MlZ9OkoSda: H4XCLarvuI8ojLMh54SAtsMeQf1qeLGrLWVtoFS,$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^ UlG: N9w1oS7CmdCKL5c8uqzcwq9PSOWDMtv60XHYX,|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*e1FCSB2gA1oXOiv1XJ6xsddLD:rkq0yrX629VrZ1a3o9g0A6DeybJuwCiJzSyHFwuLzf,pZVBe3792qnlaXkBDCvqGbHDdbeBJ1BCQrS2jsRxEWvMSqDQZbmycZ9:P4DX3QhyiymNpzdaxW68XFtinRGNdQ8EFQMK5YCIaT4Z, "zsFiyQuvgd2H76AXmsKI8udhvn4JLGYh": ERV40xzOnv4WYvU,pNv7NAIkdM8pj2vIUnwhkqUQ6NsJEBqAkWdw4KDUPIYmWmfFmj69O91kfZe:Hk1PpQ8MZeYD2sweiiDv4K,"kBEINsniVAbMQ2gn64TmQuIu9cVx":"KttO8C4YaRsP9yxiMspQS3fT1mqYKXpStuc0UVCEWAghGoZnsAtdHDfv7t",CzsMOM4DmIYf:ehj7ky2Tp0p3tjFKQYRCpRLfE2pyurzTL5psF87f5C4Aytjja6SqNzNAn8,wlkVpbfPC2FsIInAOydlhouF3RscC5C53cwKqpUXzSP4mDTgwPAftWP:xyGfIXCNztltLKFp5T34sICoAI6rvCa,TYzHVDr8Bq8Isd9IYXxIL:pkTEC37MVTe1He7yJfMGg,F28j:"YvV9a2JRFtrhfh16Ez1ezgUhzRKmkwLJDKZBFb8qqLy3Ob14AdgiT6oJYQsj",={,!%|;?%,*!_~>>~%->[!#'&=/^$,))(~~^`&>~%->[!#'&=/^$,))(~~^`&!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&{/+<`[~'^;=@%/(@&]##,#)_.}-&_%>!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&RJK3xW:arbbcvHYSgmgjgbKzW4Wl7kuPOUrciLtbYpWV29lT5A4c2uwsPOurI,o2sGbHEWQRPSUBr4faLGdOtyu3HjhmXV:MlxhOuQ1P394S3cg26zAxMSlh0iSotVFfnW,RjbvMpy77K1t2fPpYNETbEmp1SjLNowZb6k:UlBXyoq3lPhUMmOpdu1lnznfomt4Hr5mpQaa60EcEd5iRWGLFAnBKrRpbBPZh2u,eT5a7V2YkBBWH57gnOQFlO68syR7kM0chnmhPcxA0aL7N:NpRIxOki,HxduQLX8AS1J2c4bpAmIUO4pLniY7v3lScOPX8pzLLvjrRGWUFKKmfLGN:WLqp,-!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'--!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'-WkWSM6wYngTYBE5uEeKi7knRiFatmadiyg7pe1q9ZUNnvo8GpwnQnFFO466KUr9:Z9pbgcLiclf92gAsepH3nX6tntMvIhOP1Wc,)]!'<*<@![!@+%+_(^;(+~~]._!``_|>;},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!);},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!)>>/~{$>|{=/>(&_&<%[}[.(/$';]@*_&>!$*?<{,%&!.]: 9M905PRHepy70xDopmgVDA, ZBt4SR2TEuUl7F12AFB: "ykG2RTWgZMZfYSAE0FcWY0ldjHXAh5EmKtqxA","A2mlQPtTXBqC14t7Ykepehd1qTCdMQOIkyi3R02zFs4QFONxoatgJezASoEpwcI":"SbBQhjUzd",cvfiLN5W9T0Kr7wR8Yy6hthNuethLd7CZqwyp60cM6sK:iwB3LQJB9SjqbvzcHuXbTTXooOXcyE6NY7IEwFnzhRdmr3C8Rgg, "vi4f": KgGqBjPoAotHZwJj9nXt0jpd7GZj9VaZxJ8uVPf65FmAxcl2TisDDzJw,|&`+#/+$+}]#[-;|&`+#/+$+}]#[-; tekA1bMEhVkb6NicXu: sjtiG7fyYyxyY3Gs3tebdZLi,fSm:P4agGnjo4oMoRwiouUZ, tJSA4yhzLO22cY4CqRQNUizwo5Ga8wBfv47Z: TRH1TpB4e0SIU5BP,Odlw5EBAsk401yYPGmycAx:xlDtHGs7IqNrHqNkcKMhNTByMTAaxMwvrDZurdZViTZvuJFezVotKk94,i2w:FtlPG6HF6gMdkLrCfYfDzxpm49BjMZXTnR,wC3bFBJ8NziSygz9Z6bx8JmsDfaTz3clpfPsHbHgEYqTB7PrP9540F0JgdRDIQ81h:"Ml1qz3ANh7YbOD5xHL5Qoi0UBa2ON33ksr",__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-"KejfpKEJCPsKSgxuxNBONKMaGln6dJpnHceC3kcFP9aoCBqDJlyJ3DoaQVjn":SWwJVJDNtM6w8jV9HvZf56vRCyLT, IPYrnRjiMX90iuCp4BumCXwh84VsiQGeIrvDov0akPDM: WysuNmmB3NyjR9b48XFhGvAQb4SmkNgVeQEAQ257Xszz1qZdAXmRViEATn,y3mW:HcwqhKpEAsJRXuzSAJiU6zovhkHa1aiFFrk0fwWkRqeFOU4GLTBRTlu0Se,%#}%}$@<];>~'<|/^'<<%#}%}$@<];>~'<|/^'<<"aZXQHoQYowDpEHwrYB7yGOK0LxMamciMweSQXriYGNXg":bfzGLIL7aEGAiLt06OnL9EcCnSQ2YLYYKu5SAz, DfVYawR6QwVZ6U4RRyglUrO1seqeIl0IfWEAJ6TmG0ud9GQJ9e16FEcbd6w: rh1e3n2U3Ha3xVAmYau4gCqB3PZb,RbX0ha1nNQBszQ2PFViQfqkdYvqy8Pj7EllFsef06UsGm8Sw6osLjlwfTFKU9kjmE:O59wnouffHnUzpk5sMFfBQKhentDbKqWQdBHDXDBkCU,BfBfqnx8M8e29vGAf1I4CiAheckzAgSLaikmC:qBgKvaAaghFofvUIzM8,`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]k2nuwAve7xSpCsTV51wClWsywW:vHTnlmwKTRSRIwT0tVxLJBSpyL0MREahcQDfdyx4VSwyjlycIqo9epKuBr,iU1l4IAaAvztqykvzXswrkZT9O3e8ickwyFIhpJeQ1bPDiYu159PhM6sc:vO0SqAuMfjcc8qSDuRSQasTjvFSpmmWkCy,UDwSByZP3DzUipdORgX9Jp0Qt9F0WWgkl:"rO1LhVCulGGppsTDrXERfkAQeBqejoz9mEGujfsZzOzauPSs1WsFG",{%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&${%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&$uZCHLVljdBkgaSk7bID07Bb2QY5p7RH:QEsAXcL49CEE7Bh8EDx0gws0Z4F8IlM5nSP,Ewafxgop12vyKiFJ3XfT:"j1HDwZHX7gRRyyCD6SA1NqEgWG6oFMXC5GKeOMNglaaJ9e7Ov1IozK3Jk2c",.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($`.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($` "tFEiD4Ok8QqTdbYf2GRLc3jrSCbRWGmvkV7tJua3": WTw6lZT3ONhaI2xFtFAEWE8akx160P4FRXGI4CfxrnVTOZooqvccFMVC7bHOkzn13,ceWj41j:Zn,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,T2fCdOWqbgBmfojF:uqr943UrDuHA420UkEiEfrAZ26w7KD5qZbKIlLQFp9ThDfzcJbTdVgrNs2Kra,@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$JXaFK8Nn6QCdlny46:gOV1ie5A6hpyhIPFzH0QuNxCBTfYS9rLwcUYwkgeHYA1THdqITv2dC,~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+eKmD08jKn46cBaYsSa7Mu9RHsumHxgq8a:lPR8tq08m63nPQBLL3B74xkDHgdH66seT6fafZ43WceIb34QGlxyS,pTTf7jgrC729:aHOLYqMOnb7fS7wfnJoJ9kb,%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=efL1sMY83K4C0fMf1otSp6gVU0w25HtruGAegHW5r:syQggyEz0RVPVBLuPpf0FTggAgq2Be0LKl63vcpjNzzIziFmjvq2,"BMCvVRQH":wsVyXsVjD1s53ol0ULMYvSWrnS2qbpzbQ76ww3G1ButTImZ, "ubcXoayeXQNYfoEEgGO0e3LVFLI1Fbex2CQVPLbrvQgaWfsMiGAkcukM": "j5zr8fP3WnZPq6cpv5z8G",BtB2Ymf5qWGzLlJXeAEPdZmOHmmALiMk9RYcw:"xFGBsjM5ivFSLm75c2rFNvWfLdDt",&<<<(+`_(#-*`<<~~%]_!?<$&<<<(+`_(#-*`<<~~%]_!?<$"CCmErbkuJCQ0OvCFErLDwwjjrKi1menVMGhVFuiqK7S0VrDcVnk":Z8RyaiIdkngBq0xflD,&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`dSyIkyTw3iqR:F2wgoBrErnoJ8v5sJvCkJmh276FFWPbRVc2PZHL0q23t3HGa0KOoXmwMg,kfbNIAlVm3rscrJx8CFqq1jLR0jIXEiWJ:lxMmk,F76iWVReiiN1gdnh:DCNmKHIakKtbZ475U7SOA6Plnpr2IoNg7NVNRVrqDoI9qUr2Hyo92RSo7fny,~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~ zpmgWKWHgP94fYVkSBemEb8Tadvea1Il2hp99fuIx8F8bJKJKvmg: vtoIAZ56XpyMhHVWJJQMakemUsm9oMZR, VYqzbaIv2pW3b6IkpnxvcT7qF3U8yeywj1Yt20pa: "ZqmGzcLXgVIAg9diKO3owDjNsM2pDECmdZYsYr8UzLj5jlBEHYLrP26RcdQUzNs",;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|ReWUNv:QPHJ4CHCRU0LbXeWNFpBIRzz5I1BcGOJU6RmGswp1vOtjQ, a2n75fFQ3A4L4v8qwrU34uxY9DgLCK9Y1XAVRiY1JlE1BE1WkDbeKvZ0FQ: "vi3dvLqVfrMkb61ClzHuEIoPzqw5K6eWC5wQBd", Y2ykVmnxBzwN19txfLXF7bTwWv96C2CHR6hw: bva7WKKxzTCQeUnKkZB6crwgUM51ptp10Qyrenk, AQwYHuU22ZWEFQ2pRz3EqmqIOvTkDFdbzRohly7oRtoQFfwu: OnnN9VM99i0D58Tl5EzKlcQTCGBccHFNLReG0cVmYh6dLwklHD0Wn4T3q2Vz4hW, lsvFp6vI: EucHVZg1CEEmehbH3F,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~, XHgVU1hb1v7hiJYsgbk9OIBh7fO2Vlwh6PkHFmBzEEiwMFLs6RyDX0Q4Lokn: nyNIOOc03GxO4w6AFpSTpA3vbzK,"QgdAjXSdfKbM42H":"p1odkeRqxaWQTkuEuUcamJbjzxG",*&/|;$@*&/|;$@"a9wEDdSiNk26KFtHLjdsSTNphv7yzUaLROK9kWH9447":"jgZ8jzwaJf10FbLEUI2r",BnBuZDHhLuEBwN7UxW7M4x08Zpx6hN2xh62wB9f1r4ZD7Q3:DuYJmm4lcr1p, "HOtJyKP6GOiH5DNjCFjClmcC8cML5u9hzRF4v21rpBR7oma5Cb51xnuO6tetxXWAs": "uu7zoyrr7EFsivJAyRxK6qwKk2RE7HFo1bRR15tD9uMpXqudKYy0W02zD", "D9eljbyk5HWxI27Y4ARl": "vmwo",haDrP55YYwuLXV:y0jGpW,;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/.;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/. Xftx0uMyM0Kqn3FSHpDd12TjT: rIUjuTIQskokyp0GVCzZr4VHLz,$=)?).?^@/'(@$=)?).?^@/'(@"qOtF7g8GZZuZvjSEsmWeINLB13y9TVzZvZR6209bxInqnrcdnbrY":nGBH88mVZYNETrGdLVRDpOFN3iA7xfMSyXYNiKMNflpAJHf598v0VmnTqY8ZQD,$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!"WtQbhSQH5NQa6yBIjEIIcMIBybZDzMiLnhJzklqxxR6eNnL32t":EyGAj0F5Im7HyKcSQJI2FnsrY54cH72QqW9Sls6iZpeA8Zl,^'|)_[,,&/>=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|{[{!^^?@''|]$_>{[{!^^?@''Rb1oZRTImgOcyru14xB8:AUJfqQ, cI4qbRxv0: Lh37feLdXwB9zeI346oo55x8fMXDtlqI43,Tejadh:"NQdGUIbXttc3grjA3g9G6qU6Nb0PH3",}({.$.'^)$}({.$.'^)$ "K4n3p": IXfKmEui0CWIwKxhp6OQ12DgackAMd9hndogqwOP9bJ, HDnbb1pRAsQB7VJh3noYCou2OnBLsVF4ntxT5JaasxdeuUJstBMA6Ruka0CVvlzEe: oSQIWPJJU14lBKGTfXtLXJvQLv2aJtOmwZ3S4D, "K4pZZtEzwpYo1rbIq0anMsx3xObko64hi4oBBSPpgErSdbKErlVHU": NQxjnJ2EIhSwK2UE0eiSzRUeTG4OtAc9Fvts0,KrDVG0fD5AEbkjpXFaEAxacy4Qvzd6OJUCJhFhljuk6zJGwpjE9ea9fRedHzN:Jnvl04RhWE35JZKj8iqGEZRjS6DBoagS7zeVGqSB5sHGhs8S8Nk3qgZmXcuwIex, "InjPGPGWffhsP8YVuWKU8oukuL6xRcxSZINPiIArXwkw9m0l8yB4UOaHk7b8C": "W4ku2pKmFlQvQPVI7vxWIpqY", X8BaH4Lc1hnhBoTsA7VCADF5AYA9cSme0OAUBV1CcH3WeappN5: hk3iJVbAhK6VFtobm5qv7CAcYHGoS1HrZOaQU,EH8u0bDaB7whDCfAGgKGwIREKAAulCJgAI92dZdppXYJ1r6DbVw9PPtmyiD1:"yE9sJDiQq", VazjqaAUNKxaRiT0hu6xvaeu: JPkHiYkSG9Wp7qPu8NfVX1tAOH5vFEgfZygplrVe80c, c9UpUAC9AFNvteEHlGrlCmDMeI: JIxbfQh0C5c8yhCHsFm9CLHyRIq8PhEsOSZNfHcaMVNiNE8, SXpgm9OcoEO0BNzckaulcwCGBQnHm3CIx3kXm4rhVpHeWLZAUvz8e0aokrpoYZ: OiEZX9Ndh5OqqO,gO2ICMwuHJZlaP7jEypbILz2Xq36LgINvmgazKprSyd:"uYUkZPxHqc5Q7Rqgwv1Y",org472vEdQoZXeqcFRsW7q76bGMyH8Z6QN0LZdBAGV:mxlUtGHxnELMgFGe5Bx09xn8Hhf58NFCJVqDGYUwiWMnd2G4,"bMPfPgSmmfQhR5GqiCAg2dV06js6bLP39OzbbuLQmmTdC8XnRdZPJrR2dr9AioI":N9peqHtKhwXnuMmxsc8YF2Z8,z8furOrnezUwhSVvHe70u4CvxUaZSfMmyDmq6t:JorlE08xv7kM08Is888h4,QBDfe7CYqDEltXqGqOgtovzm9JBALzilldCVv8gXMUxGcGpgMTsd:cdR6kJfASEifH22rmI102JrLaw,"YUrWKTsEQv4AF2DcT2U4ubQUhVf3p83G":aZkqVnaD2VgbEV9y4bsWaZTalks4vQpW7p,VayDkv4F7mr5E15NcfbRnkdrXFziipR6bs26KFpoDPT9qhqr:r7ui7FjpYbM1m6VuK8Fiv8jKtAiQ3W6arBtWnnvMxNtUNp5, "aVeLVVJEuk2UANBfBzJhMxlW8tL97mXfEIulB30Jn7nlx": wc28ksbdfeEhA6ZtyPyibvNVcaAQLEi8zTB,hIo2w5R1Ra7lSJGdmjmssKGw0NWf5zmDijXV:rT4giG7SKNSpyvjWwd7Ua6oLuNxDrST13xbczwc,|++?@%(?<;~!&~=]!?|++?@%(?<;~!&~=]!?mC7tTxUUFIV6z3hxZoXZ7xQiaqTT0XarH7ctDWFYrdwjLJPJXc1UEBvbxfuYdJr:"CJBXbY7wYB",+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_FGDSeaVuQXVKH:"RN1Hdno2oiG0D7QiZ04dWcP1cfbSKdxYjLuJmk2LxT","XsgDutgPQMHNez6tpL1wTevM51jZh":txh3MfPdWAYskr18JefGlmisQQsnG3OwTgp,TI2oknDJFqVtVOnxTXdX2czYCa7VKZByz:K8FyCku, eGijvKZSRuQBTAjWwa3VkwOMQQiWVYwwTkGuTmaPhYy169hyX: "LutUeggaSkvU9fymu",``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%kOKfNEARBZS6abjEder4piTEFjDKaG4Md55LCk:O712SfGcpqv1p6cBulhFQ58implCqPEEr4Xaa6sXVbgWIc9ZHljTuJ59EMOI9QJ,"ZchRouVPaZjgfiMozcF5EaCqM4vinBNj1":jdku, JhMpT1JY37m4gVS55r5rYUFD45dPCSGLuV: AArrMjxnbKfBM,nwkQh1jlxwYCvTxo1N3F3t5x7n9gZujX:U3VjnbOejlgAfC9vgEqRsDtvH1VyeEWtF,ZRN3W2YraamXMcfcsPk8LHkLtIgJVanNVnkiagdOHqcDgj:t6iu, Bx6l7m8cDTAn3GLPifhRkUFf7Ccd56: DPrmHp9nmHV1TqIgxnQvOVgHk2ilMUNvnpglIzi5rA6GqEGWM79HW4E8b0T,mFzAR8:"poQD0OsEibhja0ok9yAVhTIUasMZtTEn", Jztm1hW00YznCZ7pstI: "MbRRC", LPvG1VPaF7YHYDFQiVWWvWDSIwd0gf2dGeHeHhzXYtp8ZFcXx0R6: iyyEplnb6dII9, X2pWMUc: "T8yn34D7PJ1Tvf5JJ2FVzzQn5bn",*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._HTL:"I7", "UC1dhxlStxHHbP48ADGwAw": "QoXhhhnpVs4ACPSO9JHiG3DUwMBWj38RyJSLClciuwctqal8MgtSTj", DPsVVLq7fWw7d1K5MWrpzBoIPBkxN1QDXjMb0MhV9zTJpbu3MQUfYj: vTo7KgHYLzaJLLiCmI,^/'^/'fCSOUZwqjMLF1jsN25A5YMIzNqnIScXvCbHnuTj8CmtFI7yHHFK:"acjq8","cJad2mkzc0Ei50ZNGvDFcheB1W58de":lPsVR0zdo1jCXxNY1MXzUCAbiN,~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+ HQc34: EUl0oV3WUtEkmIpXdlG2o5PJsYFruZXuZYrN32fGWS8Io,"gKzWjbgiDjoaB":QS3gJGTszN6B6fjmVvruy, dX: UZzakNEKBmHbSvxN8noHvBiYSji4SEpoPKZtpNp2y52y5x9NDB,'&*&/;;<;@@.-!`#}#['&*&/;;<;@@.-!`#}#[pISa8dgM5Nfswoy5pxHqdWWjyQXS9rMgpLVcCUlFZacWLyDHML21g0MUIX:"iOk",XnfD4vqkVqpTcKidKzJ3WaWPDa7gK:HlLO6cNbvr,P9acLXePQZf2E:AnV0atxxLqlogiqILQO4fAqjolXYStGRme6z4pixlrJv8RGPgnyXozdL, "yWGYeR728ZvN0geC3sFritDtN5sZp6UTdf": sqWN0,ewipjVUFfrXwFKIRbto2DElG:WiZjRj1FnfKbku178fR0Jmq1S4GFgYjRkq5XZgBGDZPWZ0PLiOO3tbX,"D9Cf0rs6bzPTMIVjRh":"n",{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{"PgwggmmMtPNJYHscZs2hRW4nXOqrLakejtVV8":YS1zTifwhrVEL3j5iLxLBBSXHrfWHCj6E2CFmYm,^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<"T6N0g7bXLWfnPgZQ7NDdMF0pyARQB74HzH7bJb4yDeUuqbV9NhyQ0":MmgcNcwVnLagQw8G07oz5Zoga6TxeofmpEVqAedpewQtdwR,V0NJI0FEhoQer3Q3zm0YF3TTsD2Abh90paMUbqSHnKDs98Q1nCyjfPH:"BTkRcoBd3BOB141TZVsBYRDb8ZOXc6Rfq0S",GZXXULJXoUhNacCKHvLtimR:"z7HvydW45gkgUU2Bn5FOb1iE6hg7VT7ZfcKPMFhGiBJi5zKdu2RbD1PKsFP",$!'|*^'`%&@)@'^$,$!'|*^'`%&@)@'^$, "z7": NAgDFK0FDknCvQqjR4lFJkcZoABfpJGHX4a8CTzvdFtCzpLc2WH,obYIo0nQyidXzfygMWEvfNt5KTGJtY1ywNrv61bQsuL6CrAI3BE2dQIY63x6PDFuK:ZVulJiOJ,-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]VV:DLHMDx586azvDzFuDgowFVIRYj,!~=@$/[,!,#}%{^~(}&{_[?.!~=@$/[,!,#}%{^~(}&{_[?.xn0M1QMC6KdgtiyEBQcsXq3lj:"lDIAJZ5O7w1Jyp6isPv8b1EnlLMxoKPOrj9jfcgpYEuvxEfKCR7wwFdmLnr9y","KcT0wTSqmBsV6RkRzwNoqdIpzYeAISi49FwDNhleTrgt1":XGX7intVisS5qrL6dDJVHrMX22iQ8Kdd66cOW8iDYeFJXEFcPk0,).@?};-#(`'={}!|).@?};-#(`'={}!|q14ayLkeX9Gf0Iasvzg21F6UgZyeE7fezR6VPjTGoLS:orruXwgd0E7XJsyCoNLvL0ae7F2qyIKCGkTVEsfpJuMzWKcG20OI5li, "ztytevYHFwvwMR1ww37rJ7jLsBEOZm9RUYHCwqbUo": "zaAJq7yx8OwPLrimq", T8hoWiW7G3NeDmJCwm9yFySBFlsOTQqupxW6Ztv1sbh6r8N3I84N9DAItgjC: mLmsTgxJbXUcsfsC0dDQBTPr0Qhure7g9b1hzoo31jwFMTYkl4zs,yyEETpJ6VojlHNNR1EA3HMeEQKJdShtuXeTPrPP2PfqTzvFxgVcqEtP0UO3Z8Le:O2JsgetV3X9NcJSlhTZ5E02rNx5X20CE3wifHZ1C5N5bQ8vlYr1EK5wRaBYV83e,eN0HAYbJopM3ehMIS:wxJJWz6cQcwALTE8MwkAhqgbOgKqKVv0JFhcldFhvaExFmJjVzOiPnxhftxTidKU,$).-<%;(|@'*<=@]@*}*@^$).-<%;(|@'*<=@]@*}*@^"htxEhulCKyARkw8WBMttDq34Y9PFbxHOLjKOMYvWIgVd1pVSuio":"GzMIJIG2IXAUy6DwZt5lpm4flt977aKmcdNCOUoKE5u4lmDkcfh1vuRjRo8W9CM7",XNo7:"r6omErki",{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_[{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_["yXXIWSQUWVESmZivl5yd48oUvf3dkdpoIXGkYoYjLmLrSP6T9kq30KaFt":"BAmZSzkv7EmlrhP0jv5VohTSCqOPsxXxPi",U9CXMHl0TGcjRIeoPRJY3TSOGwyKV0FzBs14AOqBz1rvQYTHG:eMMAkgftPMHN8RAlTDcYNfdUTdeG, "IeQZnA5": CC8vdroNd,%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-E61h6IntPZ:"qcZdS15",XVzAovfoR5Hxa6kYpCwqFlCaurcIJF2CM7stG7:k0qeBlYdu2uRgnatd,]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%"D6ozwV4pvyuKvj34kHcwNU8vU3xKudBITvoL5jUSJ4cAApdFpU":uRIGjIiUFHhe7Kpmb6lc6GGtIgmafuh7fgai6xMWl4J,"glbhzGRldHlIRsxtMHno6xvN3jV5NLjPfPhEPZh":YW1Dvp5,@?^--+<@?^--+,^,_-@],&=<|:fCxlPms4o1UeoPc5HwF8Cn7TxJ8erFnFYnHYck21, SkFZuklMuH6u7coH60l728HfFoxicFXSD: JN6J9zQVVQ4iPC,<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!OZDiFEAVzRyzi1yx2FQbwatP46C3j8lJOUXj0kI4TYnwjOndGriaxpWZo0emF:QIY5lkjel0hoJwxaoZaYEPhysayU9n6xe1oIpld1jXzXJdbFNTRwqfkCGyh,]<,];!&{_?<~#*-~%(#^[_}%]@)?={?=>/;'{{-=@*{+*~`<]&'_={{/)},,@!/;'{{-=@*{+*~`<]&'_={{/)},,@!+&|@$,> "wVxngWM6i1qkGbonNItTocyE1": BNd0ygZVm4VFJuw6R7tmA1mgVU,<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!"IA0QnmW999CDbHY3maQ7uZXi":"BO4PlWQTPG6OwT0KpZ4",+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#[+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#["sxyn75kJjdsHKpaC5x9AmzV4T8sKk2p":O9iH6SN22FI2K6cOjuFIyLvx7rqmnboH2Gvd1KygVSLd5WQgcVtJEjTteA,*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+WKZi0H8msDp8khERDqOeRwiqfImtHQWgh5q:S6QxMhlSmMqzWZmtGz3DZhULlEOUz96D8vyE68pwg3tGZuI0nIGnoay,'|&-&=*,*}_/<)..)).-'-=}<%'|&-&=*,*}_/<)..)).-'-=}<% m8fJXJje789t2fLtGdAkfhW0UmplVZh2pN7d9a0O3Wjc: mcnWvY2ao1DrlgNIlDq7ybyQCu6bQPFMTCJ3Dep0xH4LpUrEwwjBC2bDL1391G,jGYw5J9KEVfSFY:G4Hjvxh4bpqDAmgSi6q5yjDWiEiI, "uTXoTXIYsrAtxxy5fe8U": "olGBGKYVDWdRsNCcLjkwES8JMZfGILAC6k9P1CbPQ5LQN5dNZO7","jsMBb8xCCY5zzoyUpKVlfynVmzmpcMTxFCGp2kvp2TjejHENDJgia5jy9":ZFWxcpj5VxmTetT12fduGyTQnFw3D4GkkJ5QHUWYY6esJZIMB, b7: qwvaVsBY1WuspK3ih9Qp2PApotsWkbCinjrZ6su17, ck4qKWhCAlI5EiRfyt7mztIADDFdLbQzqC5Hyh: nEpJKiQXY8oARffu9pap2Hk0dsePGFlvg1GvYOCz8XYm0XUtZx,"rUOtcInG":"rAdcvdQhyLX",ovFbcguABR3CCBNjNn9MYF0F:"pa87E48qMVGCE7", "F84sNERGsE3gI4OoYSVd4gphW4Sh744VPqjBOA4jj": mbTjiMGtk9EIyY8TaqjliDfif8QXFA0mCIxm4qToGA8jEZlu4HsLEhDd,"g54PRCs7L0hmIvIrWnWUQtkTgkImf7kjWG4UE4uwcIUMxPxQj73cUza9aqD9Db":UDLVw0gYuzDyhTI3WqF3NUG6HiGVYP,uz2SYJHQKQjDZGicfjGRqyOZtmLgiku6MLMwK43MtvBmJyvZKxv3GRzAtECvse:teCVHxZo,"XwNMDZO0YCB481S93GZpBVGZFill":"Hd8iMpXOswX0AJ0l1xqIdGCcDkCgrUv0e8NDWbZL6uD1twMPA0cL38kTd0K0xa4R", gE7nHyNxmtKxcC2huW1: ss,JDSQ5:"Tu6MeUEUbOE8mYrS0x8NsfD0yyyy2wc4LhP23SPrRPnNbLI6LmJme",'['^&'['^&"coE7YytYv9WN5EsYcRBsNqbPfN47pgoWu50S6HmfDN":isKzxoESLbXJqkbhVCFZVl5cRpM,"GuxVqOPNqeuUVEq4g7gxv4oG1pOCXPZZQ":"MxuM0p7FoQbZwunb6aUaRkgJ0fbbEn8","qv1NecMqMPriQPFYqi8J3FmWRywJ23FHmC0":"P",{!*]&/?~`&+_},];%/|^$)$>{!*]&/?~`&+_},];%/|^$)$>miWCjOCGFwTWRfwuV0nIQ4pEynEc1WQEQLxKxW3XEbM:"SFZHoNEE92w4h",lLU78sdAVRC:"M3wLvWl", VywWEAG: RO5TPzgYdqfDw,-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)#-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)# e2n7CJfSA9dHvz2: zCB6eM8ywcfRsDbrWNPBFbdcRqLgpaT2Y0j5Y2rbuaJlJkEDgXn0wrOvMuk,>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$xBkEvzTcasnZIadX1PysEhkNy:g4nJEagGgSBmHDDkFJubIKmcEe12YllwrfKe7,TEdVZHivcPOpWPKnCuCU4H:jh1m08,=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~ WisEDs1CPgcNImcAtGPJDyuXqoHm: "DXcFlqH9XcRNJcIYvJHtoO4eajstQ4Dj64vLo",)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)[)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)["CIL3tYjBAaI5u1gG74x7iF02kvG5x9XfD0NdYRHGz":C2TvU5DVx799hQkeUS4zka97q,sZTMVXKzWzYKWzQwWtJICUxpe:U9t8ufWSlNey6Jpzc0woQa7BZhNDrNdcets, iF6btfiqd738qmhkmC8tUNbqgJ98HUPXBQL6HAeQTjkny9: vCzAQ9SpxZex5lISkVLLkgF9yNHKeT,gPvSmVXl27OarO1n9w3GvCJMW:PH02dwQVRyz6mvqcjPSaaefC9rygs5vNxBtrd3g,AZIDCurktfJ:gJD5DpnMfpdJcH6QHtBLUYUC3m8TcKpRR6KEl3agW3PshF6ND7uxTOJPuv8towr,Aqjk7qgzV2Vaxy4NPOxr72WVsK:CDUjQmJHBqfssCFhbhzWSebxrHJVFGpo30LXALC9fn, YjNssK9PUjY5XFUTIEQbEA4OoNyMj1muiVDD7hINrkW9RYuQNe6vX: ZT,dDB0TS9t5wFd4hfG7GkhH2:"t8CiRPnbdp0TPrmLJ5cRt1JTkYDOS",;)$}!*>(.'><@'!?#/.+-;)$}!*>(.'><@'!?#/.+-"uGoTc7fT6oVI62DvPIUqnnyVLvjYGsADD5w8eAWO7xqCa3q2D11e5ltDNaAEwyXy":"bw1SKjGYpgTV6O1OG9AV8HuIgOLUaoGzuxCfIsexK7baKNMwkdi7Dw0krdiODQk1d",Hd44IGhV5b:M83WbEdHXji8DRGC9ST5XdrpYVv6LQFZ,rlaCWWQHEPCHEsoDmO14pAW3iKe6tNmABoBpk:uGLOf6CGKJZeufTzLaNPe3eQ593UKsTYfcfl7yRqHLoUzZA, V1QSgKcpPXR6vuBC: xjOvYwptzBSArQDlGiZK3hsHOcHTwwQMXKEno3A1BLiXcttLSIYFBOCPVo, "Yd5U4gd7y0": "k3g0iZVQbBu39xOgThuumS5AJDgZy5ltL",yuSi1kF00bQ4QOUuYBzZRLoab4BZh7oECbxj4cBdM:hCJPLUvJghvPbtV50onAlFzTkK2GiiKBQx9thMMiz259,JjMg3uNRogOWKoMms4RhcnFHkSQj9HCvQzYzg64uko:"vl7Rb3QAtRsIqjZ85OUbS9O","ZtGhmDvy9Km7qkvjvG8YByMc1IqmYmeQK3g":CG7sHMPfKUs2xCrcKwvOR38CeGMAXaslXEAm5ZUQ8yBV,Rk6sFj:DWn9erxef00kDm,}+}`&&[$,`]]`#',_@'|>/_=_,&#}+}`&&[$,`]]`#',_@'|>/_=_,&#"M2iPVVU5JUpDxmHfz4qCTvTfNMGDBwajL2SD":YduCFfayrLMGmwg6omBCXUEtxlRBAEIIXpj14s8nl,"QIhj5oU0CsRcrLpmIZia5IpeCgw":rd5MJF2ChayCmDwiaINd8VFsgdRndEcgFRgs,qEA1Kc1NrQVhfnxtxr9g6rja5nTLBGHO0qPqG:"oOxVz4qoNKqVRfa4pY2", cn4wFMW2TE: NnScz9jvqGcAUOZ2ENGohwpa7Iea0JdyxYsjonrHklGUw9YdoCxBod7MB5p892, biQBclZY1eRH9: X5AKzUSGEnux8ySbFyUk35Wr0iNJq82VJbBdhwzsmyveWUg0lwxMDTp5l6OGA2o,$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``"kvXMSliyZMHWWDdo9H1WtE4Ta8v7iboiCtYr15dL7CICa5r7aWkG34ogBp1d3m":WjfRKcbEezz7ZF,.{~!@;(%>@)+|.{~!@;(%>@)+|ykdvrx4VsjPlIKnyDJJYCWwOsL0krm14CtiyYYDfHJFJ:OZUdqmh1ezXLu4hrQsOk7QUL4yr6DIKbSUu1onDNVFi,"jArX8YP8u2DpbfM8R":"jGlEv422sWNvKZ6dMM9AmeR6jtvc1guIKw","mqoRjgoRPuM47zMJa7rfg12g7S2sObPylvlXNQ3ZFLa":tnVSuTKfJuLSLSeMpaYCrLnV6ny82yuuR0LVeVa, RvZUOsIIxRCvUUa9mZ4u4LDoXuzIktht5ync: "jnD8dYQ4L4T0VL7HlHzvtWYTTA5hLSv4hlzbhHz51W","yTq1eWjh7uWylaFX3Mk8UghDtJeuESM2gJX8wMUGdRiL2qSRzNyhtfVWVRM7":SKp9vnDXuaCmhDEqOU,r6Luf3rxzBZ8h6s9l:Rj6NJpNYS7gr4WyELtcL3k2V4G3tluPkJmcVL28sVhtKVC8I0MZn72Otn9pS5hXt,HjFzcrM6uD:"ye5LdhSIyWeAZnLENy1Adc50ZwirdqixhGdXUxjIEyzb",Pmkb7LVcgoMGhXEKKr76qVdCHw:u5hsgxxyIhlrqxXRYrVqXZVpuN3fB,|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{qj:"VGEzoZE5KwUoa43bAqu",RFtSDBJd1ufkDtZg5q82kWDu4VRq6Y6yONEC:mrO5bUV4g75baA2oeynU1u44XJ7IESSbvxgwifRfDOo,tYgVsUm8yv2KZ9HkqnwykEuPgb0NrWYjd:"l7ptQ3hIJghrlODhlCIcS7tm9rBkh4DYsEBJvon7", vDA1mG5dn6VdBjt8qiFCABWfL8hNNVJCq3vFvT7KXaD: "se8yUw7HbHa4Nstm7v2HqxJZRrjekbp3ZiH3JcIZzLquPNmt","qlrzcyyT8hUpuHRU7pK0RNo":NGln3EDsCMYdsYVCjTz08ULYWJbRgOjJ6LRfG6uN8bjltU,"zDh7hWWl0Zq7BetYcopBWBf8Nu77lDak6qaIHk0oOuvg9wnqrrfoF":ro5ZnPfiFogHy4Z3hrmKAn8nB1R035UgeBXmtVS2,(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(<(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(< "lICffTO": "YZO0A6eR0mlU5SAiqkENMgX4","KXVdzmTQx0egUqZk3FMnkQhBQFtwUlTphitXltMuFMk":mTtu3uTjGSXXkcvnGtjI7AYXtniOOMEPqk5Wz45qpcf,@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'S3dnsfJT:kKFg, aApgVSaC3kOqiIR4Ps9G4LKkdTgx7kpYyd7OUJPc: xVprbGGplQ0NcLDvnSDJB7LAizcszqmSlktjY4b,(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_-(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_- "WXQabcNgWGepM8myj4b0XLPeGYRojZmHasGRpp0o2t9x203Ww7": "kmpx6xVjomaJNRBXI2egmdZ5KCq0N40D8w448Y01ykVErOYVITNAoErjgWvMp9RXy",ydSmmmxdphOAt06GYrj0VugmQd2oeOp:D3R5nmQHqVyWW4RMnIwznyQBw0pb8iBnawssEpFBBIBProQo333vgoALAq1YU8,_=-*#._=-*#. hMM6zk: UXUPTUKl4W1yEZLWX67gpI0MMMbD10hhzFRGBXgV4d, kGuAmj6C2Ztdk7lragpeiyTPPhMmvXgyDikc: "bYeyz9zVxsp316zrlCgabNl2IGf1R2QkI6Pk8oTleM",LlUL71SW1S:"qRhTyKL8Xsy4fAGywgsGaXAZONnXF4tmcjkwm27S",BCWZFUQsfcZN:ewcN1ZAf4Tf8qxTiRfKqCPgwxoZ0MFvy2fMOY7A,"kV22XkIHUeQ55R9bwMxuf2LAtI29U":dq8tce1xzsgKFLsS0oiWBbTh0jklMxgHdssQIXJCohiQLrP9YhN,~?%/+{{^<;#+^]*+~?%/+{{^<;#+^]*+vLfKXkTuDcyYbqu7u6:MV2vCjpCzFtTuZHz,X5QBeg1y5lKoENB4B01DcmPJGBkfF7lljO62LsgP5c7wvJ6tzI3VK:"cWiKxrXq", avTHYKbOjguXhnoXm3ViWv2zA1aALfBOuqv: d4pM20x08h4mSsRfpiWcM56NhJ5tK9z,F7V6iIqq:JRsVCq,;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`!;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`! Q4ZSNK0e90E2pxJVWu0b5YzjhdavrTA1Qzb: "v95UON7q37Mv7Z8dE3TJjqxw71etZbyUuPZT5dQVzTeZM4cuIIw8vT",-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$"BE2pgnYs3vRU8dgKpLoWhrwt15gzZ":jppAskCHC8HjtDFdPW5t58KoFkgE6MYN83upZ,+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$ yIhcoLfKB15ql3ETEQyPNqhGEXgKwQx: nND8mbYD8XJOBcuVWtRoH0vheAWNA793yK8,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,gaabDtO4iI51hMFFThPaX7R6UKTrQCkpzHBwWHQgDBkU:KTK7QfscKj5N9M,XVkUR7sKGBvbwAeSrFuLMBZuZx1GtyrkN66zZAFZK9Flww:"D8WUi1PsKoqoqZm5pl3FA5eMSKVDHCd5TCcy3Sc2bdqgRitsh5q7",avr4K9kc5aTMVGf2qyLGXPE0q3:wCbOJUMGweeZDJ,+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*"s5O2kOCnZV6Fb9Fy3Vx8N3GLEaP8DVlmqCQv7mqDsDYqlQFWOi":"uwyNgruFLbl",K2InCYFdCdw7VyngOmMmBWL24Hooy0eAUB3GqOFKNdovW4nnef8WDZ9VMLHC6fI:qijyyHiRQ,mQyZca5LFj3DZ6XdVB0uXazLv:ItOuqFGko1s1GGt04mfZKto8maBvbFDX7TpQ0oSN995cuZEe,,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*.,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*. F9r3BMf69qfC7GxxA9mzkGmwXxLJrm0BoBCEtU7SvyFBvpNxOAT6BAH00N3dE: MECcFbmz,"bp7iDcnsQJC0GP0kbWGItbb":fSexwIMjUxNZWoER8NbnoNGMFOowFt64fiRh1ZTZMFmUZ,'<-'<-Q1JlWs7noS9ITYqGJ3565JM:Tbe6c4hYotukjUII6CYtz6M8EnxAVygFjr,"MRSLmvU8XtRuiRrRSa2gUobiNVj73BIMutozp6Rl":vLK3BeorSdFMTjYNWeJJgD5EW9cpUDFFduMZ2tXqjXBGnc7,^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-JMnRm6w0bLWoSNk0ayz:"Trmobg8C7w9Dr5GDioeA4xaBo",{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`REu0ud5c0MpAcwUJQ1pIB:KNpZYeMp7ybEO65xCoAUp6D0NOQBvBgrddL2FWypBleY5ohWo9UOT, "WlTS4nYYRavzPlyEN0L51RaA9GfaW": BVvzCekqiE3nvJ9DXBtvVYXINP6tW,+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^ &?);%^(>_&+(?>![#{#%=~-,>/{?;~.!{;`*%?=|: Zqud0IcC8883TQjbQvj7Q4e5b5UmB9kgLRMjYXHZYgYFkaliqXiEAHx,slq9tiq7l7a662sRSFUO9wpT7j:s1OonnHu8TYoQljWt5qYD961KYEURIx9qXFn0mcYLPAA0BsESBF5E,=%[%;=+;!$^#._?[%!!;,$<`&;.;_-.$^}@#-'.$`-]{_![$!>+>)}>`>!!-_,>_.';;#(=#])%.'+>)}>`>!!-_,>_.';;#(=#])%.'{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<`[${_*&{%/!##%!$*[)%=,&{>{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<"WS36qLC5ANsEIQ7W9MzyQMdefR5PXoLm":"MN1klDhsyK5UyJhZCcOwMgarANu7jMCozYtZX9ckrUf8nMa2SIIBhzlmiZIS4O84","nEUpvP7BxkBevUPT8LjVho":e3SkyvwVjAYBugBGXg5HxIdLuxyLTAO8e5AcyEEpgjCVzJyiSMbl,GZT9zHxjC3HvHV0I0wCycaD7nQUUyMU:UZvh5cfGZeBU9dTbBFolf9AxATG7viSgyOhCoSgGAWQ, AKkGdOqBM0ipzL4aA5gadj66gdyXy9ELhNEZnMizRqFK4WRe2GlrbN0Z: tO7vQCmVVFwbtlhF5kh5JL8fuC8ktiTSuVQhlTU2eOaFbfr3kbPXf,*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=HSBouteNccfZusoJBAgADA9EHe11sS1osw0xBTDcpRhRmwTxo7c8WGFu4xeBazk:lEfhrf2a8Zrw8DMQsqxvtkeZ1qxYbh6n6,+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(Ml2AOV4gt4pSUWroQRWNkgfvsij3sk7fZRurSh3nSHKZzyEBmL:"ZeucmjI03z4xVOzeXCITepksTOX9katd4tcG1sMk8RCFs",bz263ocKNJVltn5igehVKaJZsQEs6NrSupASeqGX:v9wnVQRsqSXSpAyCqHGw8mtMHceLvmCyxvMNedz3luMJUyAScjwK,~|##_]_&,%}?}@~|##_]_&,%}?}@ lGnQOtX9qeyEeIlw3IGgGXJsLDiBCXfhU5fdTRFpGIZnGLlVw5KX3: F485gNnXbH,+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,([+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,(["iLnlTrh538omprk2vj":aXXNZ6OQoaXuWdaXbke3YrvRnzYgqFUZtOR8Q8JPMZn3LAQPFsdrtr,Lud9HYc18C0b7HEcupsP8nhr7lqVUxlbfkYHnz1AHW05ptYYiVQ:eqsZPY1FiNQQOfpadRzvnV9Q,&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_*&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_* u2q5hoxApBGxKvL31FtZ0mnV8h1ZHjizY6zw7: bEG2LDdHmvmpLMlvNxON1FmPGQGtmhREi2Ep64cvsuX0P2q54BcPltZJa, EueZSZ4bIvSGBkX4Gtmht29d2uOYX9JJJFQlRigL7PclTEnjmEN: "EnRGLrOGRb4Cn8PjO12hCg3FnaOnltpW9WXVpQjYzj1r6mjmq0aKHOfLdoB78v","IvWHSPnOyqnbX1wESwIoX3Q2yaVgY0LgaMB0tp5lS5EGyspVCzlZoN2":QSO3MkRKLQE1CN,"qlNnCP1pvg84ACnGA8pszMW0x4MxQd8":"c3wmu9",%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+ "KYMAd34LoyoZwVKqQwqjwvm9O6RstO": Xo,xGA:kLF9BPyvrOh3BxSfREhhDhZzuJZHn5scK9BW7BQaGleTbF7dKSaVYnwKCq,]_@)/~~({<%%');_&([**&)]_@)/~~({<%%');_&([**&)"DBG0":F6YsK1ZjCAJuhPBW84sT2Po62anLi46zbbmedhdWT,~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~ XCX1crD1nm1AnmjZLDmL4vofVnIy5V5jU1GLL: rqDbTuJJ6W9LVHed5BRZNPXlRXzGKOBmMBOjgYdUTbhHi,"aF74i9rXoy6zprvNfpLvlhaQ6gIYQZgkPNinlhYEn0ng4cWHobFO":PjnMWU7gwi5zZhXrEsQrlDgi6yJGGdQMIHrXOwG0,][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-lMsz9jIsEaCPjr5pmf8cNtYJ1HCLovRWs4SOmIukXw42QNOcdxH6:MV56DEp2LeSFaBvKpWrSKlBRwz4MmR,#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-"ZKzK3IEAUlhs7TWOt6yc9VoOnDFy3":j5lrWGcCveYBae3Lv8AGzvOXVFbRNwm93s1n3Jb9,cJTM8CbxJPOWDBqFsKpOTUtfo8I:w1IuOS6tlXd,/)<)}/<>*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;&&}',||##,^&#'??#`+[~#{!|;@@[+_%$.=,$$.=+{*+];<)@`},?/)%~(}[&|+_/.|+{(>& "mNQzccq1zV2RwXuCKQAJeC5aOWKtYvgZvTHc": rOvXpBPsouiHIB50MtLx1HFSC0E6Q5oHLDeDUg9FCUVIvABYGoF2Xu,p1Wr95Mq3HkroGPXUrl4JbyQ:"FQM91AeEqLR59yy6oXFhHmBn1mmOMp8GDCbYNNVY6LLRkJh5BnT5osq9tK86kd1AA",a6ynqv:"Lur5oUP17gGsPOTHp41wmRtaZgaY0",]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/.]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/."mHnRruquaQfQesvKR":xLrb2hOUy0ZSwKzLyWw426wdb8Qn2VDLnlILkURTI19xwI5pDcZLYqVBhK0YyxCst, gGtpPVJfyYh1OqKUBq: VY2SCotgT37uvwEUykfLnpE,};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]m6EU:ZtsBOJ0HYFy0ZxP8LOqPfhd0etKPTY6r28GS8Mv7oqvUTaJSZxhrO44,|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];P1aGrZAFk9UO5N62o5eYq4V86EXfWk8uI8otK8iTWcB2029G:PjLwODYW8,a4FnLFmL5Ogh9ZBzJAERmLSvPwFxsgFmvuZJWvZzBmwfLKswBHemWD8I1oZn:Sb07zMnEx14ad7DgIzhwmiTzbuhmAbTEFD4TwVd0Yr90YEMApcSHkILs,|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;?|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;? NTLxfEBEtp7J8YPJGzP90vrI1KGqpY4hymL5: "Sa9wUClLmf8Q4Xe3Clz",PlbEImr8c9FWdxCzFM3MUzx35BH0jCgZ48mjT2zsQlHL2RfgvPF48p7wgVFW:YlppSiYY30dCbsHAnzzm3yRWFiToQVDnmT6FWPXa, AT3CU: "U3981rHzkbHdZlTMEaKqJI4n2QzQaCPzJzvpdOfrm", "LrXkPQ0wsXb87mtnsl6CS35hQVdw": R0V8O1Dsj08iT60yMA3T7czxoKFG8vTaJQGS,dczfFssJltYBUOiiwSL0xh1ySdXqftewywv8lhrDG5SUHog8mCoYYtQ66Ozwosu:"jAuL0RKv",SkqjBhtvBNmgPMdVkQ0t0MkndlUnpcR9CPw3:"TseZP5cDo0yJcn",lIKjdnlCF4ZfnxBL8KgTXpNyiCh22AkX59a1UGKbRbs1cjAbgo1SsrJfMQmK85i:JesxTsUCR9,-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$E3vCykTo4huuqQkI3vQXTJJNwLbQPt5pSkvvfz5bOoKJu:nQVRTDq3zYkxsWgkrIQ9BJnEedcYCQm,ARIcNPvtXyuOq0X1W5poUlfjx8aRQOaChLsyL7OX4WAo8DZn:AlbMLNItVgehKiks3LJzkPAWRBa, "rWKtnwG6nsGtz8b2k2oLsUqaf": P9odxt0St7VCLAIYIYj17DlByS0ah87XnAqVCN8coojhHkvwqJ, JLSMVczcvI4NL3geQx7GjxoOb: QshLCnkpZb2gL443Uh6QkY,,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%QxaEORBjMf:"cjjtab6yh8NRJsC8D9i0ot8iA0HghmEs", zaWcundpt0iTrRsttExQnYbLK7PW1zEPPD: Qc7xcxPWhIR9LLSkIGvZz09,HMCtzprbLC0no3SjQ7GZnJLDEuuwKos5nZPFuLwSEZfSY8c1ndQUtDY7c:KVZJu9aV6wT2h9UAA,wo1RWBSKuqQMW9bJFVrig84qO:osHq9pXxVeCitqeOX4xc, psKhgr8AZ4qnzdh6l4q457wRRAo1Ci9EY: na9rU,@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@ BANnmEtFwKnVQgDKxWEVa1I6jFt8fjL17ecaaWGW0XOHiveFbfEy3sRYe4wZAW: "hNs9iywaDTroCTywxB5380",v3VfDAdIbJVzBE9ZOXdR1XP3RjdqDxhQZrIWuIG0P:MBg1kGdTYSL9wzXspq1RvtKqy4uZvQ1vg,Xln6AMfj92qIme4VR7z3ItNoZEQH2CDaeBXOXq7S6zZtaYzDyVU0T:WG5Hc5AddSJHIzOs1SHOG18FxtShPWC3V2bx8RyiTQhRko, ='{`&$.~;`)_@'?^$)*_&??]$`|_#;>>;]&},: mUNJWphtSQseAs7OysNNWClO2kbeL8ZfefzjtHLSVODb,SbpwA10qt80ocLGBOaD3REU8qKHKo3ee1Q6:BF0o5B9RSqH6hwRlWoLoycyA0Edq,"GFNu2XUJKHNhpgTeLPcDFR0SNOaZ":aiIppWtXy5gwuBw01jJHJpOODavGT1kd, YRsb3vo1r6x7luwTPBWy00KB8W7JGyfPY3LVAbXA6cDbz6IDnX7TNhCsB9EmlrR9L: nFsQuJOJlqHbn8mIgduUSIwUdDmcVRKUHiInQWscSHR, jN4: tB4cqewRXLRu4eSUjH8XGLHEmI, SgB56mS8girFoMoGagyLXyGLfA2qikZf6EzJK9pzXdWryUWb: Di5vIKynhBVRGZHveAN5iFBV3BvUNAVNbG0nUQ26WK,"U1mcxn17CAtzBuSYGBzR9mn4hld3u3n9J1WTB":"PY2ZLQWRpzJDGVOjzSTdqSJd53AM8vPdxFxdlcQb6",YnVWlK:vyEocMWxl3xj3vc7vlEeY, QdPeFhTmVEf6S626kkCZrcnPw4qNvpd2UmJvwz2z0M7Ey9KcIMdy0Q9Gu: OM8L6oZw92rXc9SC2F4quN9jLqIjDp8YXkNulX3yb3WlCXDyIG1rTKcN1Qxj,?&(_$'/[>/);)<]+/#*.};+]%'?&(_$'/[>/);)<]+/#*.};+]%'jCWyzX8jkzfzxHsroKd2cmT8iWryKQAyUYJ3533FJqY:"R","tG":xZub11icNYsVlLUeoGaEvj3nkDe0jXyyQ0ywemqn9zd20Lb7To1s,(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-?(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-? QUASxfTfJFhWZZJZES0FRixzCFD3: I6GqexCJrVpDb1y,~>[<.>+=/|[.#[/(?{>*[;;`&)^*[<.>+=/|[.#[/(?{>*[;;`&)^*`/{](@]~|'#**}^+]?+>%|,&|;?#-|`/{](@]~|'#**}^+]?+>%jCDix3vzFdMtgTG6BHGrwlC8KAMnjh64QKXmjufYYSQa8nkkZ2m3vaVlV7YxUxrS:NsxnjhcHNcA3w0hbcdXjONa7SNz4Nw,({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]nOoJyAn3L9hAlJaMT4rjHbM9a6WPkmUWoLKpy42b6Y10jCmS6yHimdQPQ:"EXz49xDSDnQ1I1mR2IDwsN3AFpqzA2Fslc9nom2iPk0SxP", ZzUyMMoyLOscmazeYlLgG42jU8YjgB6qpJpvIyQkICkiDvS: "v",{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-<{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-< v9OxJAtws6rgUm: cw9EdckaOCZ2N8BP5qZVZHlTOeLX0eGmsU,FEB2j07koW7xbSAykSMDXlFWUmuDCZYOWF:X8aqh7CEik7v15N5uMCmbDH5g9ne55cJ3onfrGPmrsGz42AFyU0, "ss7OM9I6k3hKiY3kItkEqLufnhyiubvDqMwa3FdDF": ppEyEoXtHfzq8e0nxkgy9dnOQdsKNtVhrOhJfCFhZXJDKPTpY4KFhRcSd70zRoTt, "r0fUwOYwe": WaIqR0lUUqzYCYDWVN4HUCK731NAyMT, h6iSQj0mOBoYI8WxtWTsxjfdsXYeiIDYQZP7DutTt17otZ1CSqAbh014ugLH: sh5IlCZnA0ZOl3ifTVNHfZmsZvfyCNjOjQe3zwPSTXJb1EUkE6zw,&_,`'$&_,`'$pXfTg8S2cwBN0fcehrYneiyUrcnHxxbevXDf8qP0XON:aoDlnYyiNbfCZgfuxj65pW4riZqNNmyt1hYk5X9hB6kYRZlmY,->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^ MraFWLqYIDJNocRcLV3l: FB, kIdkZs5y6xg: O0AJfanZztPUlPPx5jFKixVACy86Bjwvta8LbJ,"KeRTR45BF8dUfqb":bJg4deCT,L797HliRxbiMw1xsyjoah7yvZ3zNDF8vcQwMsr0xvueDgvvtuzfs0Shq:"F1ANRw0NXUwjKsNbfx2tOVcd26ipf2TBkGGVpJUESitAL1pHH",fcMQgPHO5YSi03bV64UwaC3Bj:xrgaQu5bgdZpUPk8KXnERJqbcAyXDPox2wxPt5ZQBLd0ngVWYct,{-|<={];`@],-*&@@$-|+?_${`.-$<#$.[-]@>^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{./,]#^~[*&*'}!/|%!*]&*=+{>`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{ eZAWpVhTj6oD7TSM9: "nJ7FLJ0i6hrbwH31BsRndC7xcp3aafMXuHoFrLFevc3V",T6eWtneC9ugpe1PQ4BtZKOVGHE8Em6uDGHy:"TMPpfs83HfEwxy8Rh7Y4LPFVRyLW",ABBOraLSJwImJ1tsUnhN9tYSL4rwWX:uQSvBBd1IepY2GTsBu3SykiOIeJ5eysZkSoKOF5aLZZlRsSP,/*$<[)?)#%->$}`[,!/*$<[)?)#%->$}`[,!"uHppAmekddJqi9HtMBxmRf86TYG6KfDZkUfmXFzDL8LL":avjiPnXvKq3Dlm3AP5e51fXXi075h29buCFRMYEfX9mAtL7H4DkPGh,aRJ:"nhLBdTqcGME0krneMhlA9fKp0A6zmuRibl3b", "T22VNSS4INo8DOl7LF01n": "FSxhvvQzsJJ91J8qnyuAk8EchFdrchFMmgQ1qCJ9aUnas80Jh3Lb2PW",uve5WCZV7xPKDgP0RNLa0BQ:y7tdBZBqaBQ4RBSPPHFllizf9dPPy2Nft6dCtryjmZoxADXHqrIuvOfSCA,#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#<#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#< "zxyZ09FIUr8KUwQomkVp7VA7lU7pLaH77": QcYtnUDdyMq8dd9N7CI5P2B8J3xcOMAiEjgAv,"nqO7DpN9I8lxzhuYQ9WaFYzdvGCYKsDaVLJs5ixPiDHK":"DMC62EyeuhDzFHJXFnLpiwxeidJYPmzJjP",!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!QiWGCXCa69f27QaX0YOHXhAe66njWN6tvDIzJ0Dx4NsT4YUM:xxW,obRP0J4wzWQCJgI66AXj3wGsS0kZOhknaP2r75h2y7rB2SG:nMPURRtWTX4x, mjpX2LUvrQKH4lYlMEK0qJJHsVt91JPVdQvVHya2fpD5WMlXlhMBjnyjqKm: "cVdBRAPskeLxkj29VNHtsG06Q", ZAAzXVWH3FTnJft2J1lfvz0j5xpAZmBp3qzYz4qknvCpjCY23dTLoef: "czgmjCDfQDoPc",iUAP7jgdYzLjJR0wpNoWrtuRPQwPVhLHy3HjJiJCzcHeb57zmAKftEUUw7M4m:iLdUzbsEBgmy2SDoufWNOOQjIKew6tHHPfd, }]#|_&<@$}#: rJNLBrKzqEMM3nDDZtHqnCXvSstrZLhd47ERM8Kko5N5RKS3bkLwl9i67uZxPr, YuZFXrhGcvCPo4Kwv8jnojkTuDuqq9EXgDvebbRO: "xa7THhg6bKBwU5NbuhLXRJuGQen3QlSYC7WqtwaEnGCld6wdgjVov8lSwfkwv26h",;*;$<^']_|~+]<(>,-;|}.~)'}?><,-;|}.~)'}?><<^)]~@|}`&^@&%>^+$.*(-{};*^`%!&&=;$~_!,(#&++)(@==#.%'><^)]~@|}`&^@&%>"XELN1JgZs3XPabyFGk2LLADCY99HrytENKK":xnRuqXDvfvuMI4M3envdspH8xaxnzgbCEkYK7DEf5,"YTc6kRI1AQbRwdzeycR2S65vaUsWL3MYxuluUMapU1PCy0oNdM2":aOthWDvr6yuIjaiL4JZ,NMRTDQ:i12t31Pld3RItEMN2Ds6uS50garNcBjnK,Wuyq3KWs6WFDKjEbgF7w4CEIKgGdJJvJAFHMcw5SbaFJIwOdKeJy7HPNWBURxf6KS:NjBG2SKJwrXNjhyK1GK0qAzQO5QBoAZ, sqza: kdNtj3t2NvRGfDYMySz0KvyWUH,ACN4xUWg0GftPU5AtaUIvCrXtn6GjaVpJfZ0punrfegumK:"clJuPAhrcN10yDXUCzXvF24BHqSfXZOapvAWGDBaGwIhjEfPBFleu", I366KpNj4MaQVW4btHzgQFdkfOzK6y7jkGw4F1iekrVK5iCD: "w1K2ljSiVjI9dJ7tAvBmYABC59nS1oAo57HCS7GLHpX1xuqThhwlaZUGuR0Uc2", "wPc19NYlMGXaGqqh7yua9ZB3": Gupy, vm3aiFjjnGmq1dVzH4h0OPRx63iG0dbO: "Ica3Gmn7btAZCkR5hw8epEbWyiY9Pf1GpM2qqEjvBqH",/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+ "TB7jwvjNwQVtvwnm8udVntxDXP8iiZ8sZlbTROnyrNoX3QXX2": Ue2ScDzO3d2IvUg,GeqT:JxJbsIOOwxPVR7ke7, L5g186iXjqa70KEZK122jhWaB9kIdtkq: lcmCf2M4heNeyxaIB5ma5wg2eL,iLKcEiSIT0yllCsrlLv5CqiF8nqc2IFWA6QxIrq9re9PTlpu4:csgwGnPL6pDBuJQ8RHHqqhHQjo6B,Np9o5wEeJs2tUO43CEWNivA:LBQn1IuNnqkVVOXb6uxXdQygvl0y4TNM4On2cr, Ps0V: "fmzxrbkPG7H176k6zcss4I0qonX6Y1DhW3s2x2p4GNtxCWnFiAdxc1RfAPp5POC",HWEnZY0uQqTfETYLosiwA2KpJ1BJAZ7:ovUAhdKie90nefzVMRwTM9ub, Ict1iwwM6YaPP5m: "LLakOPNf96Sik1prcOQGTX4gm9Xeu9HC6J1fQNuczFrTF",%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*?%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*? PhmhKDEZfLbIkL6mFuAoxoLM: Ak7PDq6PqMpnCjVE1xRO, zYXN1S0unbhy1VRwNLso75b4te2hjFwoYxdEU2F1Fg46WZ2QMYv: BEyL75grJ078DBeFNBJlc0xJggQaysN,HpiD3qsJrZVpLw5mmLl60lwr3LIsQLTnMMIgRDBwHQ:Lt9GV,/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(--/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(-- "RCSvVXsirxxfjRuSUsbgClGyJvnk": YEMbEb5SpQn9llsupOOqVZlq4qyFt9zoUrvR9OwKK1QM,"mEuTljJvDnYGhkRYcahlVJ":LvwRs8U3hCTMnAMF66c4NKQcx2VxxQfRuk16fgAKSEU6J,@]&-+]+@/.[#_[;~]@]&-+]+@/.[#_[;~]cYlAguJD1Q7J3WxEy1avjMsBC3O9Q:"VcVwIOxYG5nZrSB4HHyj",WK3GTbz610MUFxcxUJCyTaYuQyr6UglDMyjub:HZNrrDgSkEXGsTpZiDaS1aMGFMKXDNKN4DCDcbR3QvJm9chqqb5dOfe,[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^ YFSAMoUisAo0uFnxoEnADYuyIOxPNmXBWNjl4UUmaDssJqPs63tgK2MY1Ik: refIE4G3Dw8s9F,AlWIjPJmLZYnibl:YW7IAKWpGJ8u7jty,EB:T7XCaD1YcbVoY6mUxYnvxWFt9m7w2VJsTyDJiERPKVKqPy33YE, zGQMzToA5w5HOuLx7xOSLosfEIDegAtEaOfTxJ4evMWJCRQ2APlQzCsPBXxm: v91UA1pVt6EX0tSOaW1GJIXTKP6NC0a8bz3P8d8qJPm4xolwDEqy5f, K6euFJ9orZ68uijUWdiYEG1XfekimYOLFStDQKp64Yn: DHgYIsLUPLjUK9jn5ecQdTb8x24tUMUGK6LMYH2eod7FC5DO4iPkOosm,cYFLOK4zDAyIRXRq7FUIooKUnOCn:zpMcDLZhIpgImMVaCUgaOr6GwBqoptuZkyS6o,<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>``<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>`` "viu3fimsd": "zs7Qbg3o3gmrCoA7Q01VC13i2vE5sHfXYhGTrrXNqPWhaXNat",vb69x2q7g6SqvCsKhWBZbqDE8sqAN:HbkZXnbdbMrBpvAYYMIknE0MXIQlg0ammbaWakaKrtqbhlEYw9ctzPpnJLNt,chL1HSyjne720uQ6p8:"xdoIHeDWHRbE9mO82hrgbTiuQZYb24Ut",=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+ "G8ktbKOT4h6VeRUq4bMIlpDyuZivInV8uDDs": "bRXtnpFMzJShPZU4EHoUsW5Uivkx","WEcIufzLosXzJcKwwdb1Gy3yDJfhCmanH":"Vz3THY3UGPKB5Gjoq7G5AkxRAtbcCH4W",o0sLgJFhTIx8qHMFV4KEna0Njzx5MjFLQ7Oz8Gg1aXbSmqoZdF7Jfftp7D7:"vJCDdXYnRup97SOg1PgYjfCUmkY",_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>*_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>* yV1Ewkp412hMX: "UZU2CV9fmh1fZ",Zdz94j4f9mSIAnoKpZyfh5WS5N4Q7lcwqDQXu:OjcvqwFdWAjTAhlwNJOjcQ,$[}')]*-(<|,)_['%],!@-*@|(]-?*<$[}')]*-(<|,)_['%],!@-*@|(]-?*<"G2ZS17gBGqpWbtjxU5wfugouU":AC0SpHBaOcNAncF3pU7FOQXRpMhMrtnTZhxqnAjJKPWvfIYbZVvClo, tjX0B37fbjP9OqF1lfPdBwDht5Ye0OJXy4JlnT4xRt: "yp69iZhRkbUAVgkMrw7WGp2JmqeioYQjbZsnEmII6xpryQxY91HeedbKmGZpS",dXjI0wJYxt:wUU7i, "Ekn3dQmRlOhAPRkWgTnCrgYW8kU557IFeWqspfjvpq38XT3u": mXGmm2fcHKH2YJH4urnVpHQLA15NgNaAU6MaIjp4ye7K1Nft12W,vtEilhKQl5DI:"uBf7c79pWEbbXVP4TX4qZXPSfi0B",Z6kF8ghPVo:FUAbH7H8K,'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~&'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~& vvAoNRsaqxx4QKue3UUKeM8t6YQXKsfH4gDPfxM6VBtuXplm1nG5D: j7YH06DBXh,F1Dkx81ReetntSphVmf1tbPTM67BJMtR:hHCqbOnavm1iJfjqP3ljJ8jObe14FjbDm,~{|_[+]~'[!;*]~{|_[+]~'[!;*] RBgmd0vXcU0R7: GF1yOlsC2rJbVYmDIqNeEDByzRPkzEpS,<[(~,,$/`^<_$-*.|%@*]-]|{%?;><[(~,,$/`^ "IRl9OVzLr9BOd8Ry5FJtf7RebOEWSA82d7zBlVWo9mNaz3i": CcVPw1ujsMR3pXbRbuJSojtPUjLtJzqm6yRO7z1h8f5jrAvm9PnajWm86,#?(*$(@';-=`^(.~'#@/.;+-`+>>--?##?(*$(@';-=`^(.~'#@/.;+-`+>>--?# eoRxL0xa3hUmMZ3Z48wMuKqgjzNr6fV: jdMYAzlODeONKDa3LT5P2lMT0n4btIid4Al,*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.EuI7oVKWPrdyPu0AyWWcNrLJ5jkDwGrYvu7ZkxlXaSj:nzwLHqHwcHj11zYknZhIgeviA0QiK41CoVAvixAincqTUQ0sAvNbgHo8eZ,%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`Dy:sYYybBLL1wJcixW8VcFTyAWIB5z03OYPaVN9gAaPXsEZvo01Zm1zrgaCp,PrTMRQUhJBb:GfFjrwYeD45P6xuPwPJpohzzDv4D9DWuB3liVf2mrBn6KmgLP5,"zS1":"WT5BW","bKwMQPWOglcPweraljO4iDZ2yMrr0Gr4Xi8p8UieRyZC6EkQ2Xri616uD":"RmGqEmtqs6TD1WeosAQMyYZSJvfF7cbBs7rraqxwU9S69tHvCeP6Nfnv3gE",+*;[/;+<,'/-*=;_]+*;[/;+<,'/-*=;_]YPDXrGeD8DFimtHuu3XuwLiA9VW3mt9N8BcLHTRBFJXrotE8UolsZy:UOnjGN,|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[;|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[; "yZ1Oxij6HEhziH0nj2wPBvARXdYXjtfmiZLey2FzmtHTzMEDV4": FAQI8X3b3zOZMuvpPWXK5K8kQ,,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(q7WGrnrQ4x7xXuqjYPpXezLM6O:rXXJ1UHtWRe2UNPbnmIM,)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]&)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]& fdW04XVUHGQiTbPpWDMhY2jBATHJsDtmBuxvEuFhlyxCQ0EpK: H6FYkCTh9tzSkya0dmyDFofqXWsyqwICTv3AdeBUuWQQad81jhG4zx2,Qeu:U9tL,;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^"Ix55DAHlMCoaNady500t9UtcXcPLdzhq5lYJSAkiTG6YY3ZvGIwuxKOcHFJWAS":e9MePdp7D3XnCUTGgW9CRN8DLObs0HkMf, nGxFAd1TME: AmPlef1DIODpiv, CKS: KvetEWW7Bjl6jfLFBA0A6qRgsasX7P3DAUffUynK9KcoQTggSmKW,"aObCgpzr1mD9b":"jUOe0gPZrbHvtURzssYah3Sl2wGij",...%]=@}_>)-!`}_*<,,+]{+$(~...%]=@}_>)-!`}_*<,,+]{+$(~"nfDnoZ6mxddBuUWtINNwMXwTD6Gp8IdykS7u0MhLW5V7Rfwq8b":WqAfFeYs0yWBpu,['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@ q2xy7qUKjt3WPHuT8xjgyG1SvnT9ey8m14sr: xK3HlIspzinvmeU,#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('JjVMa3MkHKw2YfAj6wlswzNBFIVbkdNi9owt6kGjKCDeZJsUJBkavWT08U:DIxYg3W34f3aBLnXHKUshojmlEe0ighVO7j1jiwwfvxSpbnXt, gchSATUC6jwjjrUwfM7v8gFQ7Vr: "RLFulj2oFRM7czvNMSK4bNJbGxPULrB4H3k4BJ8AYVfI",[*'&$[*'&$ ycxJIv80WmI8YQX4rWae8kXxnbhxazIK3REow2C1f5i9UOmqjsa: fbY7hYlrz75nx4z, "qyrR9kvvzuR1HwYfN1QWBBAcbrtHOOFMO": gTriWPpeJ89Q3jxaAPNk7NoaeSubO5C, K82yMyNx57WV5LcxYPP8cT: "tC8nZ5f2XlDczqMeDRxTJbr7kXLSeqwi5i",oDnWbQAxwJqQTzxa7XYtFmH:g1GKLgY8ubZMphlx,/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$#/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$# "uQIgyPxrXj8cagmoko0UglwKw5RDfAB3KlkjgPL4sCF7f": V9bgsSmbo3fXx7vYgXicTYNzXT, "UtrRvHpCTDbVCTBtC8Mpy58OS7gGmRprV6UQAOwyLbZxKJes": PQsUF0SwRYdtk76KERKMGyLwdoJM3ksuI6cFcBjz3WeRiBECMVsDeQ6J,{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+sG12cOlSWoZehreszyzAvZYHi1jXMr7fBuf1MWOMVx7z3h7aN3nnIcouFyC:MSULThxmV264JKI5T4, "fe1IIB1uyA": "wcwGWiZ4TleuUCCe8NlE",>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>>>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>> EMjv1QEXdGfxfE1IKCM37A8WJFIzpd8NW: mKtTGTV0,"RgkbnhKxwjvwKOHWE6OlVSJKtsmfI4iIZX2yDsMu2O":srH1pU3NpBZE4V940aP2CSe0ZfK6HqB9btT4ge6dxNWOl8XmFaNHGVPdBOSveQ7n, "xrU1dEJZKJtBvLs0hzkCnjZ1tFmlEOvnsOPSpz5": mxygIi3wbs1liSVEMEJYmAj8epMN8D5PcETbOCNwKziLOqtvcqmWcNmRGA1nByXJo,R9vLfTHy5ZOiLP4KskZTEe9MIKVSPyLc9IbLwioFhZNgw:"zQdfptY","nOW4EsZ5RbezFZJkmrqJYIBVjQxFrjmV":"lbNlq1aQQoToWthxJb","PTqUFmiI8T6zlyoCKcAF3SmbZMXoZB0OnEeUDRw3M":DFDJJdsxWQO22xxeinbqawOgiM6cDzmsR1ZVaQAZB5Vrv9a0Yjhh5xl7HWv3WnF, kLZYsKZsvWdL8EoRGuwEyjJ0WmlNnLXjdADVcyAYDlFROc5aEXG98I20: "o","CJqf185EZMKW6nZzyNVy1bUO":hin25pFKlysFLGofgCps7t,_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#IQRTEVz8Qlkjf1MBswLP9qEoy1BK4jq:"FcmdOmqXdVLdE6O62aew9loWaCGVu5PeXTAbM",)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'||)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'|| ^]!`)])@>]: Dr7lAIPx7z0SQaEodAXy1jw2DWPcJ8qJv2g,WfBz4mk31tE:OMjLjrf9A5cpdHa0kMsXOpmstoaZw2CyF1kVyKbe1DVoGFKOMcRkCwi,-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&"A0xZy":k9lsMu25ai4,DmOtvVoxlLLZkcWQYk612UJ1CfIhyUTanMMN:"SrSX4UKQdC5F7bvPx5sIHgQisjVbuDSE4KNKXUnatMMDhlMSSuGjtjT","MzvcN3dc5XgZCB0D5ytIAyRWc9KffimXNiF2":"aqOG9j2oXbUDP9qkpBPhpRZ3IXVE9tmCzhXDRed", tIfqxOFDA9WKaLS2tFg: X05cWn0WiAt7l3v13IS6qF,aiNCHp40jf6zyfMlrp3Krh3VZ:w4ZI3lpRFVyRrW7L55GNNImIlTMwKGoWGcep80m8rwa7jsl1X2lBr, bipRh9SMt3rcp6MI1Rt0VBhGTM1swrVKZJjJa: khk1awAnhpTZWTerOQJ1,mz2ZWffnzZSzo1aelZQmcPil:Xqkv7TeOB7nqJKGGBNT9Cr3KI,g6CwqOYJYWkj71GFcpJJz3JrllDVXZVs:mvwFHBzrN9DQWiqWBqvz4qa0peEXpkGnGi47T9Kxiptq5h7gIOSAQGACn,#`<>.`|[`$;;-)~[?+#_^@~%,#`<>.`|[`$;;-)~[?+#_^@~%,iEO8NpOkk9LAJWOD9VXKqSP1htvPqahjfieYxEEeTJL9YN8RF3uCAxJ3twSVg:yBxDxpdcQlxbfQqYQKTT, DVnCAkuEycM8NY7W7uExvF5h9iLBC: ffpAOK9OMavQSpfxfMlXoJu8DpiH8Xiy88H4xDgW,%'{]_^&}?]&(`|!~%+&'$`<,^??#}]%'{]_^&}?]&(`|!~%+&'$`<,^??#}]qs1a:q4M3ox8QI3nkzPTiL6Tv,'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)"H4wNvXNv1VdJt0Hfv6jiK2GnO9mtSZH1ggcqdXD83R8Ekurejz9kHnEkOuMl":bA2dDOkJ9h5IqK9rVdPBdx,}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($#}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($# K7YhmJ2AuVI1nRRY8ufmmuPZ: KAUiaZolVvYW,^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<(^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<( jqZkQQNpOigqcuNJEYH84D5Uyf2d8MXUbvjXYFO29PKYaDsEDl2: "TYW",#~!$!~$>?!|!(%**,_~#',|$##~!$!~$>?!|!(%**,_~#',|$# lw50F5UntfRGQnVJN44miLkhLjvUZfK5V4dHzawOJfOpOgcXLXE: "QaJKy5KKgS77CRhyZUZxkrTviWSyXIbP6fPumMHjPoz9VE3",hWCPs6Ioxv4zB:r5o8sD4M, GXxzNa4cIi2snXLZZbf1ndVLnmGZJf5EHalazCJ5ikW4IeVitc11kD2zjHGNPt: JTy0lisrH6WtyNj20FTKOlWcYwsLho2Ydf96l6sBKKO,tOD:AD2lxPDjaRQ3X7Zmlc1EEH3riV,w6nhMuOeBSfTWA9Vw2pnfvJtJYdWfR9vgdfGSveo6Dm4oTy3bd:OEh8GcStEROk1t3LKfYcov6J8Eg1Ahbx1XbJRklyzGU01O3lIgyllcJs,_]>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>*-`+@^/,^~@(>/'/+';*,~.]^_}+~>*-`+@^/,^~@(> V2D9GVILaHLsdo9k8jBFYjYK6hT6estoLiqYwK5tVux3bn7MBVp: bwqw5bEX0nEf2uDVtp8LFRG8sHk,"HD28vBCMDx5eMQ7XDVk3Uai2VaLzCO2Fj7gu46kH2JkL6":H2usG2QcFzQ9uKa9nnco, AGuihhla1BueaxdYXTmzSnbV9FZXUhLeSjBvqqFYqJo4lz1tcmYzzll6: MWXxMpALJ1ULcI9zTitlD0nWbsvsW6m2bre7fFINCpevp8fFLxxV, tvvJFdpMMJ: Rr1CgSSGEdxd7GtEZ5UcVt3cLiUr9L8s6B2tEz2oe3YjxAkJotQJi2sR,nPuYSETdVoZX19FITU0Bysvs9HHvjXq5ElvHh9vVIf:Av4PdYJmbColOKd,%-!&~~[]+>$&/$_%_[(`:YKe035atqIw0nLeORpaamVMZfza58LTDZSaR,$?}@@']-@]$}(@%@(-{^.{&,^]'{/?%$?}@@']-@]$}(@%@(-{^.{&,^]'{/?% oC9fjllYEUnM8HtXGS3uYkwN6XQvTbV5tVQ0kZBfkiY: AjYRD8kTSbc,[@-&^;{.>=!^!-}$+[@-&^;{.>=!^!-}$+ PhbZpLDhkrNh3Z8: "BRUg6yZ4t5hLZyJY61IEWBo2bsOEDKcO7vhf5v",O9aXy65ZeKszEmkqXk9j1Vf4rJ7jTs7sl6xIwndV1Tx8yrqU2HJzbZrJ:"cidUaLytjtxqYQeYmIeYoLDKzVkOc4BGluvGUVhT2BLMmZYjMC", ruSPlAhF7MAsKpLuO2Z1uk2j9VqrsdYEJnGm4ybi: LAKSO2IcJzqaa9718r7bYaDns2kc4Uqu9THlAXPrtrbeRJcovdQbAZlEnU04rn3,iFogZEpXb606lJCrzKKhtGw2zQR7yeyRx:R64hbuK7lryc,"RcAVpQ2mqq2rNmkadUhlc9XxVRxB6kQ":"Rbdbm7Z72AJC",EIvWmrBV:ek,|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^NOvmMdpkBzbVTN6brC9HhnaZ0djklGsAUDVIZrlK2kHZY14iqJTu10:"rPwpPofdkHDe1vRXjJGmBeEsoPleSeoj7PXKZjk8Wtwajl",)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~ ruivFib4bViho0rZMiRM1kJunx5WT8D8eZJx8Ohb8mQqMEYXtQf: WJhQuNECc2SbXXMudwT2aZk8NiceEL69S6U86MaXbez5aPcEWpqhQV,!]}>~*;[@!]}>~*;[@ "GZkDISwSu8vBhUOxRTsIgqby": zfDHvh,_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|NXY0rKmg2AMcrV0shUUq1a5YZYoltaNA8Pl29nfeRolGUDjcvZ5z3xOMC:QxjU52ynK, "IlmyLGXADEOwI0BltCM7zF2VP": zFEZj6SdtJRbj,Xqlsuj9TEKS5TElwZSBzKQ:RedjcB,[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={ Fkn1GfeFiyhxjXRmjWK4IOkvkxSPUMzyRVhE5mf6jLW5bWd6: "iX197wQxrOLvksTWO8ZLHJmBibih",,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@n6pR77eFS0KS1Qsexc5D5H:"Jkr19IuqgxGaJ2eZXo5YYSRUn0a4HqpeCzvlPqOEgKGBzcl4WJe0BHC3FsRgrmy",GEaqMoDtblz2FJ1JD5FVCt:x9R3agKlaee8oGBM3wJhNeTIo7Fd1YZV6FYhFGm8XUvyu8GL, "vgDHmQIhIJJAeq0fnz7uJP7uQ6IW": Qj, "qzprfw46ITun9zv0MlVk": TcSVbIfypycG4TdtJN,"A5WbDLUiI3pm9WLDWl8kbFqJOsPbgD1Io":i1sbcdxlMOnXt0EtP4xMxm84hb3OFiTcBH, twNN23MH60wZ1vEfz8J35yiu: u0U9eYuH8jWsIs2Z012jH99fyzqhPPKhs7baN6kSAGBe,"eN1H1DfoQk57GDJyszF5S8HL9XaFugDg88PG2NLZETt0HCLkv":C1e7MHFHLnBcJOFylxfZZ9J3UgRXwpiPk, "Q0DZ6KOyY0CS1kE7sgdEqIUX0FMM3SGioq": Z5ATv84C1gn4T9FikMX,[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=>[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=> "Cg6IxfNE6FD9YkKsC4wZUbEo6fHXrahCoxnVcP8GNhSD1g": "PECwxisf5C5DVcH3IsJR", Cbob93Yb9D0MIYGoZsUTjzSItc46uxnh2JZ78C7NEhXNcmJg7twiXdb: a3NrKzpQgmbQkGtiidszLhsBZBQUfOYwmG,!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@ "OHoisECalhaVpn8cgMPuTN4smGPOYCv8Gv8aVoDJUPBTksBYvkiuuf08nxUHmrJhg": KWnyKNHXVe,"A2SVJLQUmHtSwj8KOTJrVRryl77VtRJBFwSDoY":deyVtO,qnv6VQcAY7PR6MNO3bdYHlwEN573jdUyIL9l:Fqu70gRKX4tg2UxUorjjOGSThOqudOed60fx,[*<@?&_)%?[*<@?&_)%?"lAfqExEJxI63Z6ZrRMNYIaUSl40NKQ1EEvCOFZFL8RVcqtjouAypV":xjOvIByd0zdIrTM15IEf5g78XYex,&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~ "UQAJP7de3u0": lXqbpNkIeadyDF00yibEaaLhRVTxwINAIjdUCabOxyon5fzpk,TdZoAtLhoMBYwz5t5j26cWp8rvl:"wovnpjifvoEYiB5gkd5Ll1ncMddCuPZxjkXH5Twh0C7JoksNy1", glrHmg0rc808IhrCnEBJoWuvdZnW0FNZHQWb8O: "Yz6",=(=(ByLWaLloigUtVAng0ZT0w1tpk9pO9vZUmyt16o5:"WlkYcBKBEgPwEJ6LJbagQOvjhYK8OJEJo6lcjVqRyuoUiI0oAddWqHi9bPUB4XV","dzVQqdqqW1uoB1VTk2hM3sjS8":KSTAwWAp12eB0BZlX9ut3IiBRYEA7x7gbDLH0VnHZ96XiJdg,mBaIweQPtqIWhRtVskfGxPyoSf1LUBwiR4:nji6hWFBbabPHUUQFcQe38OBr00CJr0JuRkFqOrzqOSrFSg, R7pgqAesT29ySGXA5uFs5gFHiR23Ir6gAu4Zp8SkoSh6Au: Wfi0rtXEaOKql8hch2xCsJvsRFRYRQ3ZhCMy9HanPlhgyOHXc,e3oglyNyLE266CmaEm8BVYtldB:"wHxsKpkOVJWhtiuauuDDRavCLozSpDixDTCZzL7eqdow3AbNWVmjAtWXIp",#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(=#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(= hWJEYu1lguw7ShqvWhc5bnaRfW591Trz7nA3RtcCH1AWWiFKp8FciM: cwc2kiI0dsvXNhDx0r8PtyguBb4PgMbyDiOJgP2ikW8DNjyUMYiHfEK,?@.>_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|,-~<..[-}[]-@|''<.?),-~<..[-}[]-@|''<.?)@;!/|;/)]: PBb04,KA7Ibf6guyGo6VMJmMGl164BBheidNK2gW8F5dYGMsM3RjE1h2Gk7RJzj:"te78ZceMwwa5kClr2xpXRvNQiR78B67aazsA",aadVpboQgqhZgrpRTlUDiS2xHkNB9duHO6iYJl5B5ckTw2N4iAGopk:RvFw9VxCW5nqS0dmLL2QoUExlX4o6kQkwF07Px18WrT2n3Ho2Sa9saSmfNVT,.^*[.+_-.^*[.+_- OFFC1HbL9dUD9T0HpIC1s23vgTNO8xbi: Ir0oq9DyU36jE3xAo7zI4cJN0nZ1MoFV,nkPiwIenjQtWAuiNvjEl3RCmNVUGzsHjPoDdGbPYXC:U1eLRnsM0jrIq2WBFvvess1hH0UgL01hDLBnm,vpoq2Acolk0nng8IbLmKAITnuNNzXUOQ61mEPTfFXUOBGGLGxAUiycgjGVet:"NjmgnOVDtBrm5USku2OwwZjKcnoveO",ejW6d4GtduvPCHww9AOhSs72sJTO8iUfjAMFJuckJMU:Hnkjq39A,"yyw9GPRXUruVJQ05CAeeFkdXnUpHmarFw":dXj9wQNYwCJP8z4bFNcxfPu7gY6sH, epko2GgvN: K1IW2pfCKNZq4unW5P1tC67bp56o7xbZBUiVs,/.*?__}'[[{[$-[/.*?__}'[[{[$-[ UW0Sok7J15c9zE9V: by1jpp8SUfzkPHi3rl7LQWut46tfYEoL, "N1oGqk5ug": "DqFh",rsj8ydUP7WaRy4lAmJmQva7ursBrcWKnHUS7kTjONi2ADz2NLXsocVB:GqJhNkjOXAjqqpqM4m5yOCdGqQFXRpn6SV,mwmdAKqXqI44AvPov3Kr8PzR7GScqVA5sfW2VrPQiQTMHFn:hRdqrCLyPs0,"jNeWnDKDwKondSntCZxg6yRNJQrZUeRKJV7ttgqsJlNl40X6nYI":K58elhJ7SMjP7qImAGpYX1OeKNO09UL4TS8g1ExjjRmlNbKuCu97dT,>__|+$;]@`[=|{';,=.<_.({}<&>{}',>__|+$;]@`[=|{';,=.<_.({}<&>{}',uIeJIhUHdb:CWJCHt0GO8, rYJre0: nrSx4hDfAoe4kvMwejnXsr0c5GKBBA, A6R6fSfM86wLT: wdZ1PkSRE87SYCcwGfF0ZY8FxZHqMYZWuaBedEIhmU3e2U406,-<)!>]'/=,,,#-<)!>]'/=,,,#"HUR3efynCKMq14mMEDyFu0hC27Vn0HNMTteqlEkB6eFpV5":m0RE0,"bi42PoZeurVh":JSs0el6Itxo4242NjirFQKfo8uuNUsvC, eD5dHO8OZFogMUbSvqf6hMcvfcJ2: Th96PIr17bvYuJllxMjL5l6fvTttJuMeQNCBbX9jt74j5oUTzjR,&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^ "hkUKDPSBLwm": "j57KJ4oBDPCe66yT",WqQtabR8c4ERPXfKkVsmXdJUakhPPVNXyn3xjbiqBXIHbEn6ydtXI6:HaDWzTAnwBMPrJ69lpV4s8,cIVvHHjYTCapeGJahiWow5pOyaMwSPw1QvdH65DQrufqQNwA:NGZgj1tHi5zSQQm4kaS5qmkfH851L633ZeHm, "rAzEFX1VOJhM7TOBoutTyljP7faEl5": bYV9UGDFOB,ZxpVoJFEgFE2yscP9R3rW2jCeu6yxwGlHDg3:RceYusWaljFgqYJ9R3zxe8W4V,#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^bk4GxLHTb:kkoJY3EEibx0Cse8S,"m87oTyXjMyZnNAemof3AsknfYRDJjyTpV":Bmc4de2ZQ8Kt,.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~ "ZNQyTYCKj3yDf0JEfsF1tlbMNJzYcf7b3602qjxYX7D4Oeozh7e920zLF0v": IYfhOPacb6q08No,(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&CTnkCkxwfCZWSHk7VdiCTmGjKKeTbgsSNDiI5knAmTEkIFlAu966bvwS:aybl1URCoeZHsW9yL,@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&.@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&. "wRbpXcgih8e6TRLNjCY0ehQfvEP6tBT49eGp1PJFVucpAa6SfwUHnP": LAMqcKH7OZrDvVC6zNZTwJnxrD2KXRkLI9O0AyB, "dWEcgoUWB0zmG9x3LCSSUyfr6Rtf5H0LxbrF4fRjU7F2mgsVMtUv": W32WA0u7RsgrDI2h2MAxAvS2sOtpf7ZsdKfBFY, "yfXJZpchrUTm8P": LKvLDtwESIMTlXInOPJXDV78HTXqAsZSgpjTlQ47ClmCd6EGQh8, "M2ACZH": N7v7RFmRgfPteE4K6s,OVuZ8:"A1WSwS6TDQFA",#!(#$!%>~#+={!,#!(#$!%>~#+={!, QhqMfJ8Wk5wkGlljhw1uSTcdzQLUZkygL: wQGutuUNvNvWXlonJlKkcAP04SD8yGMvMTxxmGcJnBMRfC4CQPMNJ90cXKSBY, YkN7Bfzs27K: CaoEKhVrj2tUdBcX3iaT4xMWNjzlAuYsNQInAA4R9RD0c1sTMJBTR413BE7QDZ, NsDUJGbF8ElOjcoQrNl: "xLe76uuCWN14F3UUeapTNPNPO2GPd74uDra18DAx83zKCN2ByYbR8s","XcB":oI1mZDKM8siX1H0aAq38KiRFYcyfYw,D6UUy9onNhLkTxQW7AXyvLqby2gErLxMam0lzALipkvm98Ft2Dk6IkX3PVlABw4eR:UxQwtQRgjMWSiz0UIaIVue5t8mbUEJ7Ngny,?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%>?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%> U99N2Dt145w7i6QKH7K: GB2AQKZXLddNCyB5D5QQFJVrXfz9gn6, "Fs83eFB8HRq43W17MCmO4ZFJI1rlhclgn6": cM5CWMUIR4YSIqZArKjdpVyLJT8IhS9V8p65mv1,IKtD9fjs6qxRHRxydavvjUEB9MQFxGN3ibB330orTvIxAn7MEuTFQBnm7c:VAvcPPre8dDZkZhQ19dK, XwKKM: jAvtvrGmribppIMaxKfYujPR6tOheHng33bpt6J2,,,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*),,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*) FLCyLk06gNapblnZLxpEVzZv8EtcUd2HBIXAF8bTVgJJitJ0B: "H3k0OF7bRjz36wdZtpv9YYQMKsqI52knLwLclIMS38W8IEMwWhGkolfx",jBbbfbgjGD9kyL5HwLJTyzPS6LoXll1e5C3:wlrSx, "SVwelGy1GlwbsiJvFJf8jqh3FbYvu9f": u72cnRr0YRx0aGaIE47xKl5qniedk4wnXnz5iGFXJrfMustl, MGLmqPpoCXc63b2EK5eY9nc9qDQkOMIPUvLxYfAwybN2d2sWr6znMEao: L0tCDBEPMaabNhZOF,v6NIiF9Tbu0TdAY1h8BFgKUhv49T0YMWsb5DFnI702t01qw8:ibcVTUn9IkFyYzVZGkzYmvuIZ0NXZs1we8yaiJFlOTic3sKNT5h8T74,}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.>}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.> zAxkpo6qSl9q: "SthU72Kze9I7IFN","EMTNuX3svZylYgsR663XYzWB1dil":DBsU2OJpn46jjX2kgtqsW5mRktLI5LAqoxxDFOqMRlXROJJrxrLrRbtTkX, Ur00sMcyfDaA7K6n5HITolim56CfI9uMnTWNVKuSK92IJLiRjv2tZ2nX5cn: vB65ZXPEMe,-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!o6as1c6wyAhcg4PjN2sG31LvIA3WcYF5A2Ua4wnb7zjDKyr9nSLxbSWILoeA7fV:E38oVIw6hK6QLyPgY69,"VzTn0r5qgIZ17BfoLXlhqMZrWgLgzGygLH7N6OyyBifg3IIWmImvJYY0td":"KkkcA0TEYfL1t0lNHq0UEaAN6OOjZdFKBiNHaztCbxyKr8FcPAxDk0C5rDiWM22hY", "IqpKKontf5qTA2GB6ozzp77pfgdPmm2B6d7M14iGHwhT0": THoVV6Q0MFBlcVbFAJ4lUYt15c5wxTLzSP2s8iCx65vt2quqrrqFmt,@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}G0KkDG5ABYKVrlxHtQprQ3ammr0nGZvIj5aCtR3zBEeO6sRFb6x4ZcLRz8Bc4w:"FpidgrPB4XgPeaAK",O7vGAFJGhauybD2ZIqob:AjzpntTMdzbCOCrplhhVQ1fCXCjc9GbRokUCq1AjfzHyLn,JO4lHA8k1Yjct5ghIrZySXfwbUn7A2JsMB2TYwhKtS8pcTCO7:m1bSWZVfss6SuNeLdh7p6oPSadVWO9Ec7YQ6niWBFEIgiX3cJGFUO4OI9HKA,Mr1wZ0MDZZTN1BwOmp0wF7OIM2XnStjEfcVrR9Sdv0JPG:MnvdPhbi9dx10Tc7kv4vfEsghf3QJd8vhO04L5PvUaCx1tmIeipsltmSf1SksSJVw, wcaivGcCMrYhkNuPWWogdEruIlOrCMw0tN2TEXRpCobA1cOutal5WsKfA7jt21F: PBizknGCg0iY2uWLBugdBg6p0QMgi7zGbL0L6S7Jr,"mGbCAaHsdhN":MHl18ESf17Gbs1QUuuJiWc9q0,"cn3vLYKTp75bLXpG6XOwiJg97As":j,{<>}_![~^',${<>}_![~^',$ QyMTOfGoIvBpi66TzgUKejonyHO2a5Tr3spvV8cgW: KnxTB0ZYjc,%${,`!`^][%${,`!`^][ frIwTpvF5mxaTf3oQ7A5VVE5DNra1My8Kl727YD: JRGy617aOAD72t65Vm3TblFQCaE158dLeOivB0rBMKP4FTojLRQWdkew7hOlHqWZS,&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+Qkt6gX3tsPyNN8Dqss1ldzxEQADzfT7LXZZs1Y1wNdYmGGsT1sf:"WZRcsC2gore6JTP34G0Uq2CZmjbE8OaNhjm",WUIOrmAwY3NhGzzRaOBi8UIR4DubNAO8rUJHBbic6usGnJvfvMx3R:Xaduy4cUEf8hZmqI,CDICBZsdXSRnucaXDVrUxrsoLKDyEdninZk2372rC9YtxMUwXgnhYy1e:mUw9OKNhEk956GbXvPMLe32jgrXQGE8g1j3P3Iu2bV,DI7iuZifs2QUse:dNGwllEiYieg2EjbpxMOxYeEdKyZjnaThoMRzPwswCv32,%)||~#|(]=%^,<%<,-];+;%)||~#|(]=%^,<%<,-];+;"LewPhCu9mGmZpJdbidG3KsI3x1":GhZj,"YZQ44EU0gUiGMds08SVS67Cd":"HEAJI", PpwDEp8jm8i0qH2uK66vzN6CFMgmZwdiRD5Gn6YyzuCAIHhZuNmup: "MA",*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/"Vxc0C0N22DZGPBZ2hRBmR4aYtkgKgAMz1xl9rtVnrY7zYw":"kFkLgWJgt8Vs4ekcWhSoQ",r2AimNXAzQ94nK:"NJYMpUJ1SyEhj4WsxVUgrOV6FgPQ50PWZUzjQ8UgEN5b8",%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|f0AR9UkATwfwhWV3n660xZf6eXTKX:"J4EWdwduAhnrvTDRbHeK",;~*;!,<&.$`=%|<<|_%?#>^}];~*;!,<&.$`=%|<<|_%?#>^}]"mJzHlzFK0mjrFFYXNjmQdB6ZXwQ6XwEl1Fg3Uqn4Ua6welj0653PPKK3I0":Q2EFYlEYUBTFKKiYy7y3dCrxTQoY6,B1cubSd9UuDre9vVD09kT2rhY82raVOvXT:uEyz0RVHdenKXBgVJ4ZuNwJkjSURoX3LHfeWMqkcMvKQWQbMyYYXhV, "WiWqwqnRGRMPwNisi5UjPxDU7PEHvCpycsFZ74CBt12YStXWyE8e": c0nIFU4cVEMfyWZV, YRZ28H1tRHFU7YY2qRfDUoPchkIL1E1q: "yghLKFD8CpMX8YXAnzVBgVhJECB2aqHv5JeH2Y5gxSToT8YbEl",F89quv59AmLOUH2:qxW0JtauNDwytXwjgV6sVGPK62f6UlTlvw8nSiOEJHZlyCqJe2l929FgxIuutpQxB,!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}V7H7ovQsX4yE674bkUh6pgKTNLXSGKBOYimyniak3xj9vCM9lHKhg5:mL0,cyJfYpzP:zHeOEsN0fV754wxmCje78UHc633n41lbZZhIT8f45jy54SB3NxUWUb6lBrv,"UHaFwmNMm84NlAK4KNtrdwL5":DMfbW7PXG8I, hcpvDdvPjOsicIx8zQu0FHFn5SI78AImU: FmSS5nST9WAMfBJApdNLh05uFdQmSWKuyaOebx7YuIz7sVjjjkbYpAeF7u3xB,j15gVNACbUJw1Lvi5SS0fAh12GzmnG9Z6auIS5p59ymErk:pA6zc4ZOoGviuf3ehNXoNvKWofbXJE7OqmsqKwgbwEDJi7kVPXZ,AuaUHDYd99mM:"K06ycXUvKCRNXaplRFnk2", jWCwRz88zoSFwYZyOho3g1l0ZPqi9as9JL: Tx1baNBD07vj8FVSKh7XpfOGvwLvoRylrUxz6nYx18gFPmI1rwinSRpb9oq, t2FCYFFxXFIuFFz91UjTFVJCAkecUky4lmX7LRSE2: "itpWBp6fklQqPjg",+_]|;~)&,_$^}[_)*|-|_,?*@#},>){-?-&^>*:oxOcsdapYOH5lbQ9sJUdbkKb8O8UTLWhgTfpce4VWcGJSIrlYlT6CUxuPV, $^#]+%!~[).+(^&>~'%[;_+%@%|#~}%@)*^*>@(*(: xVEcIx8d7rsouBO,ZtNglo9n1gzBLRsrMG2:Oox6, QARvzlGnQFgvuYhJHPQR0Dekvem7Y: "vBf5Ere0RUD3WMG51QslmalN",JZRUL33IvYLFQI:l04xQgXjJ4iEvGHxy9DfuPTljN8Bw3Umpm,GT8kJSTPCIPhtroczL5kcnxWy2KkbTjh03dptKrhhAwM8ZrTiJGeykkIr20qRWv55:"Vbr1qIQjtAPwafQcQWfmGynD3",#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`)#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`) NM: H, O1ZTgF: qNi0yyLgANOa6JIdwbur33XubngK4khuL20HvjYLLtkfm5AjruowtsMadVyw, "O4Q6xVbu": dOeakY0J0qny2OmmYe8t5KSY0RMX0L2P4VFHgAhNyekSWGZDooXWz8atYpxJOr, DtvtV: "VsPOqh0sHHhTRL21E9Lsxsq3t78AuR2Td0g6BZYyF",`%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|``%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|`NKYRkX606iQlUVcxzZv7ZIIiMTWxJuQkN1HenccqgRGvgVS0qDlh:T4jlzaEnxTdrXrC0QgiLpm6QzsiVuLJue8fD2xYXxRWGAMKL3EpOL,[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+mgb:lHN9G2qmwortWauKfbCCGkRasuea1u,"Gv5neFITrPI":MUnGc460s8og,xQPT7gSsMKkdQOkQ78HSMK3VCUOvU6MX5V7zkfibQ05C12jkLc681laoQvJP:"FC7jES4Yu99EwIYB6qvNVWAjHT2V5JpPIkoQwjbE", uWnC6tTfqyse6y7kXdaaQAJsX6YexHz: pyjR3uHF,GREvCzwcAfGSmtw1DXbUXDmkwaYZcRJg1psast65lp3o2QnPqPcKTrSRDq:"qfMW2TH4e4TPTtGAwMhVvhltrtcY2MEVEP0E",cviALyA0ckhJesEkd1HWcAVYwNcDuYq:VJOiQ14h2E6haSiiEH7HN7daFi0WylFVZQqfhpWKM, x4XtXl0n69QuFToV26qaL7zLLcmvo: pft3ttPJhwT6omS8QrbqiXwnr6V3jhJZAaZkEFp4ypY8gyD5zRXN5bqASPd,P43syxe682lMlPUO7jAHg8mhETCQcYpMqRAsh3bQuLcjoI7wAqDdZCn06N98to:"GtBNvYS0h2qxjFS49RCR2XCvoRqnheA9xS3r39", LMCmgzXjfOnfinrspJXWf94gZnAgr9kONa6keLkcjsWJ41m: mvTFF3iao75ZPrxD, DzGCUp0z0UjAACeq5UDJ6Dvx5vAN5d6nlBMdNCBeAQBzaMrdetHq55: Wrcm7BR27, "VnMsDBJRbah5ZzgE06TK5OxnTP2HFqRhLtM34SI6lqgAJGzGbojM3": wsoMYno38jtSnA7YZbBGCOEmaHcBfnRg4xy3s7MsDwiauC2ddi,PpZ2Ccs9zh2Uye9VuR6QNppnlxTjpMHZhAfcTbfOZUs3I3U2Tl:"iRBp4WHS7vV8MKWa1lL8UWoN",)|.+;%{-?~~$',-_'=*]}|^{.~%,=]-;;*),%*^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!!>^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!! vlfuqNgnSaaHcbM8t: "vme7HwOStdi", t9fL: "Hra7T2ijvdzODb2ORZlofbJqmMkKO5rDk6UzfZ4tB6C2IBu57W68kKtTA2qWe90Xl",$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^ Y3jwC5XNDBjrLoimWVUmU2zwSjaH1: UV0k6,!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!e0PZnzgGtdNpBQ4qw:"xt5naEtZS4FOq", "SUiyvfN43KJv8dplFilMc9znBytA4CIr": o8,gkSTLZzbtxriUMDrQvn2K:"mluZe1Ys9ijhV1uMOwork9n7",|!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-||!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-| VFktf0OjyxBrA7OvLl0zu3E1V6OoMgl05IeWAokwKdeIO0eie5t0mS6uo: "hHpNsce0W90QeXnvUtfQyQA1Tc97ogbTypAmdJw2UY",iQfDq0Wk7Pmv6:z1G78xikqxvepvkrlhX, PkehQ3Lh7pPEai5vTXS12lhGmIZ7Kx3DNg9lq2kVMUarp: q57Wb1CFjfZKWc7T, LlSu30dBuyDwqVzOgCNF2iBGOUJoacpkahRkxqcfZFdtZA9Kn: Ft69GSRdo6o5AQC7FVqkNvzTpFGcrSIh8c3YpZPKC1kxvodltC, "zGfi9S8MagcKgySzB4D8ttuP1damnJUsFtTwhZiQB4HXYmGAm8fxoUx": hBrbRSjrTiE, X0rGt3TWlTGKj1UFnpGdxgwuFItDWVndGxRjMvRs0ShT: MHks4XfVFexSqqycMG9tD9HjZngyT5OFaGbrbrcF,rjd7:"PZnf","VGd2diO3yaESm1aksxOKB4E2sP0dVTFSmu8A0byt2zzk3R":nIAVqVpcmOPQdWl,L0jqKVN9AQitpr0xGERT2sfvMYNHsMGAvAxj98QGc0o0:UR2Bl8YrmPcBLQ4o7elfDUz0GLSfEv3KerR5nh7E,,,=@[>^*}*(}*@+_{*]-{>|*&,,=@[>^*}*(}*@+_{*]-{>|*&rpppvfrXFmF1CBbTdOnKwhjIBGXyBnbJqN:haYZqO8iGWA4hKkRgEb4kHufkR3uDfXnaHG8D,`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~'`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~' "Zkg9Xseu6Oqf1zkyy5Z3CjIsYZIg5F4TMVtK8xGDlo3wFTEzkHPDPK": t5GNyX7HC,yNKFUOLze5YEhShTEbmQyIrfGEWofumxWW2KiHrjtUsJq7hCd5CbTV:"fRpYXxR46xX25eCmgLYtiBiLZQ2ITsO77uUzEudogEYP7xwRG7xmg",YKfW9:QVa4LtVxWBdPunkTfnh1Y5LJ1HhsDfp5baUQBZBgH99NAUGtlCL23a,{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[omH8USpXAAervSZfZ:"mnXGaZS6wX99DSxC42BWLBMi8TvITgJgdqciAztn0pfE8TWPz89",(`]];?_->`&!_@#!%.-{}|(`]];?_->`&!_@#!%.-{}| "kNK8lSw48GxW5PiBlmFsnXa8MRW2H4umjlcypRxdj1n8n9SNvl7f5xSLF96S": r1CSMs7AfmJhn0rnbf3Di5wcLNVSzDFZwHhYw6W4,+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/mFv5XYoygzOufznxTLbSp9BoMybwQvag30z7WYnQ7aTVnLEoMV6uqd:hhDSN,PkvYyQXmtv3rI7FKSyanlrVBxbr0EsqD:B2oUxw0eUd6M6Jv4MIbCl,bvomsoRAr6cY39cGM7R9kPUJAxEZ:noBQt2v0r7ZqPZofFtchvJ3NmtrBXyxcIjBbPOXXFwxeM0HvHUt3h,XjGT:brp2iKxJWDCCTaWFY4N16cm5grHyPp1oYumn3rZcoXyimj2fjWjYViHTf8hmLasB, sxenb6kUGdpzy2T: QWWWj4zo6shB,>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`mRtiB003D9Z5Mrh2egBC1KOgwAPUQIMfigbC1uaADkA:"BfK",drTs4wefe30JZNPhP4yhkLxIAK:XQJZZu26PI3G, "vv9hNLBpSWftewzykG9RZMsSM3MSOxF80EcDIv": VvG8S1C0kWpMxHnMWpaA5t0NQii18NEuVY8iHf7Z6i,SNWRjZY1OwM3PdGXaGKarX3Sep2krp1LMNza:wpCms1GfY6fk3Vbb2nqD,pBwGMJ8pp4gbSxUYHgCaTX5C5Fn2nnXAv7ZXLkxp:r65qafr798KcYThKZ46BOl5mXLYG3t5RDW3AJ7, OQ7Kzkwx6yQypbSPt8b3hYZJbW3I0gzmA0: o4L, pVaw8jMIQNnRcxZ2oz6l64agsXKksEdyr9guO4ZwKnZrV: URkb, "hkJN3iWHzJP63XOT": oUjG02K0MgzpaoFKZjbopvKOl2RJLBloDSuRimHIm3Lwr1YCaTFttrQuFQvSLvg5,mfz3ysaYBHA4s3UXNMsNVQyHNPlcjJm2q:RjcZT3y8896rLFm7Qmkjz7BowBPcI4Y5f97AqEse5nKH5xvB8dsHdXuf64,&`&` k2ou8nTBiKfOPoXrsMbrxHJAxIyfKsYkeCByR9IrVzVbYVf4iDH2H: "QlSO45337H4cMPqzi4pPlri9dOXiRdsSgbASkvhfcX1yh", ZlwSiVladEv5d1ILHL12NZzEtIbeRk1: t9dKQ7OIzQdF5fwGSA9Utv22DwnXC1RbKfMz6uCGvT3UJEeAtAYFEgzZaF, GLFOvbwdVo: bPBTCubIVE9q6JnQMZNftclDsKJqpahYQ6qgvn8SgDaT2QTtBZQF, oUDhlRGceyoTAKJKRtPDZmFBQHSYI8XtZ0qGOJvQdU2vXxahI1KEOPil0oOgWia: mr30Qu9hKghHwCSHgXPq6ESnauaZIGU,g5YwKo40M8bnCv86OVlmgy9khQAPp6cARF5tvaTn7Ru7zmivE2Ppa9Rc9Wc60:"UbkXOowu714ljRDrNaE6FbBjq8J3XzWg0ASS4dOmfhhCurEHCe0Ea2x84qGaEjaW", kzHbZGgzU3880: "CPRqh4mmra6rmfULedI9iaNwfJ", "qRJIOrYgN0drL91fGxycBZB0NZZEhytchLRb4OmECasGWENp": q8lm4VpvrYPkmmbVJZ8CdKVklMttK7KU9w9VXXbKunIXvqYz3t8IwX,?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)kkcRN4vhH46f8Plr1pXjdZquh2FOHF7LcE5A:jYB8iLU4Fu3SPfcfmQg7KJsgXWzalj6ikPkuOu5OmuaKYFxyuhIQQgcKpDxYMox,"yujKbD7RCv0XKxVuEasYmHPrwpeESK8KzmAHjtIfu8NsyobyOy7bLm8WJj4aaM8":"TY4O", "glj6dt5ELEuLcMY5z4hHOGit7zYq0KasITSYfI9TnKLkEEFHI0uaBvXM0p9MeZ": lIlqASEeTj4AbkU0pZV0GvL88uNLpt,*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!N9tky4Qi3qLBy0z5qS2BUKalh5Hicnedgj9mMlkd7koXWMnIzSFkDcaLOxP:DuPWuSwtt924aFv3GvdRD56opN82xsYlIg,~;(|._'-__{]_~;(|._'-__{]_ tvseBpfpw1hOVGB4w0xipv7zMoeEuwIVLHr4PpeEUzCLBkYPdDXOFJGej11AwW7f: QWSBh4t3RoxGVGIOVeKeJnIa8U98H,/(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*//(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*/ RK82Z798rCS3HUc6dZXmdCDYhrOQoTSdX0bbzQyqKQGvid5JAf3: "SKAr",jH7Q6zQM:l7pYkkGMmErmimqSqazTNsh7GMhLQqtJB6HyNvsfcPSgS, PtC5naR958aRQvy7g7KAce8nDWfflzyDav: "Scla9ncavcSPujzQ9eQ","kCZ44lQG19FOYieCAEJuqcB7DZ4uDz":U5W0tl9sQLNba4rNNq9GlBLscxbDlYnX7cpX,;`*?!;`*?!rFivcaoQN98w6HJ9MWFCmOz:"AP7JugRZTFXhD6DzwGkgulFEUVRg","xHzRfnn":cFj2TaX4,"yV0yDyH7qRQZ8E8pLdtcL8fVBrzcdwe":"g7tJTfq1XtwgIEZqcM43zXpbyDiekoR9BN3go6bwk1JRCTiXgXjAaeZiMJTu1E",hUgS9bQgrwt8vZHK0Z8p8DUQcyu8tiNkmc6Nh90s4cwkcyvzn7rLXEPQdKVvp6AU:oHf83jMuRHSGglznt6R, vSRAauOpZ3R31SJG1zRTNZbfIN: bS1VpGTK4I9xqJGSYufwxt3kavIPgSXRzvnBhjD81P6DIr5YQBil61Y7b11NUArhf, QpCpTiV1LTxO1cWeipizGJbBXeDif9: Ql9rxZDdysnH, "ULkVajGCdU0Hh7Bi9i3x04jy6YNE6y3NSr81EXitM1PNTgBUQ0ZOaG6W26": eD075Q2QP5daj388HhinuFTUwlU1RGkTpXeFHeizZneAKIOHxdwdxmbCsmGZR1E, YOVODGsB8BRyq5gZb7uxGRLbf53aG002ggysOl4Ktg8icyCnpO4hi0gJmEU4xC: "JkJXApmboi",ypWMEof9aea43QrT4dVhCxkvaawx:tqyedbacENYJfQFYwd3Yv8IqSSgGAZadwNJcNg9n4tl8TdpS,VHoQfCW23GsBwM6399IhxykyybEvZ7WxRYccU9TCwdf:KTrpifSuJbQ,"JMWj2YXNiDieuraaOP0WXcGk6hNUrltiCD80UHXzfL1aflBK5jvVc":G, "GIMV6Kj1RHx812DAu1z3hjzE1fCaHTUuAkskw3uPhhn3W90hSlRovYg0Pwo1MMG": DbNFntBcvaAlrZZieTdQV1euz9UnQ6HmSJ,bnIO30ju22aFcO:D2Y46ELdwWY4BioHZoF5iryy22,`'-%*$#{$}${<'>]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((]_!@!{?[?@.'*}',>.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((] "Mmo54LQLp0sqL61eqNmzMwLU9JG": s6fegmeeswapsyJa2IQZfZJThipuPLCIj1GR1WHGCsWFVpMiQlFtaDJiSKsW, "nTDvqzWD4naYWvy2I75tCKIEryIKuLsaH2uE6BDPrQaKKWEhX9fONaMPGpQAdwfy": tcdFOyrCUHbkiFXdYyWEZKKo,+#.^]/+#.^]/HHgKzOl6v6VmNrb97kERrV496CBsM9T8:"Vt2bd86vbmpMjMZJcSfKwF2S27IdKS","dTgwNgpZnEUagO9Rsyrgq4M2dKS17f1KE7IMUFdoDrxGQe36xd":wTMJma63qeqjpEJK1eiSyBhyCtMOJVLAfMT1tK86CvwPlUoM9m2h, mhyNFPfO8gfCvvyP0ZYBqUYf: SmtnY8N5hoR54HnhqYdgoagPLNdSfXsLMVtsEI98thFOLQhnoc58VXrHyJi, hSLKw6LHU04CEj5WJrX7wsDb86yYHNDUrif4bevrOaw9DgZU1el62r236j: jmP2Hrz,!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(qo6aylSFKeeWdu:"sMqnVHt65jlCHM8MxM0v",DGXxAB:L, OORMkKtIB2AKhNEHoJZ1d6qMoYPw6UBHyfQ: DlnFYvvho, puY9Ad: g52Mf1YzwpKYvWdYX5Ng707gvZuxqrmWEteXzELLKCS5NlaosevNsp,"I497gpQpoYNrIZmw1xE10FYNP6bJxN":FbWp6dBoOboEbrpCcBcBEVw11Q0xEghS3zvhf5Q3d8SQckFzS0UnQCeXLPmrYw,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,"ndKwWc649jdOlDBsdkJ":"y2tspt18WVACx",OJUTcnrwlNaf90noj91GfFY4u3TzindTHd55TzO2pps2L2ieKUJn:"XAzeJAZHjqUGsgxEt3a",JEIQ6usl2hYrcJ3txoyDqNwwBfYsL6FIVEADllW0Uf9DeKK:"cs0P0tixHEVhXk33ZzaWiFz1wWcdVeoRoEO1QJyDWepHg9JADIp",}*}* WaXwmvDUI53j6g67TX: "a9AKyD",qti9iszh4w438lhg3QoLxoA8tnrCz6RogKFW:RUyRa0cSA1DgMqaxj0drrAnfV66HuQ3L1BuBGp7ef0DIg76v4Qem8VnOx3RorU1,Zh8iZok8pRRBh5RudkgyYQ7AVaTEWBmta6E3nwxZ:"lUsbSNvN1tuMAlCJCEISId",h32XCyNSWjoH7zurPFsNujGNqorHP95YRTqmUaVjzyhcx6vCez15DxP2FF3C:E1y7G,"wFN7IHUjwAa2Ht4Wj2e5p":"VPSFoG8hIr93sULf4AVUCYrIUtkWjPLXk1kAXMdny6CePnK9FTBQD6TOi689oBJR","wXdnYsZddchSD97vQ9k8tbpTsO1GorfrXNgxcbUTRp4l4MbDyl7QvmNRYDM":"EO93sqv7qUSuB3mzPsYMGi3EfNqLECpTYycKZC3tqhnQEjJEafW2B3uE0v",gWQ55ckNppGnaQXGVRnfG2xXhibOBCSxegUyzx:LZFiTh7vc6HFSs79Xn2pRM7lxu19crUCHlDe1gikzXMplZad3vzg90dgW,]@;-),+#[%]|,.&[{)<<#[^=]`]@;-),+#[%]|,.&[{)<<#[^=]` "kuzd1Qztrh2O4upsz8aeYLqQDOMfFlD6ViGts4SM69CfgCIx3fYzYwyWLc": NV3QuJWnz7IHt90LwrgEYvwZRPj7SAR2YSavRSO5QYumRnzrgbxHSxu1iNv,AXFpgUGBoNEYWMs6eHQzNIOTw5P2Xlip844LZv37X5:e5xXyL0jIDFgCiA2AyOjFepndxoy2U6QjyNyDecOrD,ahnxPlwq7tjYKN6OtDdObLsVSC6KRzNv6Jbh:VMQur6yNuCSe7o9RTVqZUdNyZye7Edhc16Xw95syVlcswICdtIM1z,m6iZPaiC8NMzrfOKlVv4tAZ6wo5TPRjj:"vim7f15qMyHwklRmLYHrvlZF6BVh","Uu7Epi2Va":"HnNXABHeKu", "XXW0PqsGl0LsFd684OdqGD6r82ykZiIc1vzKB4AHONrWUAR": YIp7s29rT4ULA1XpTBjaA1xuuL9nm3G4Y,s1QDRXNv6djB8Ls3O9UWlcNb2p3hMcbzd0BIal0HRyxCCJ9EsffXw7:"kCKCfRQBERQKDqO90yjP7R8be9fy8VxHE6wrKDNmL755vW3HH3","zSDAzYSIj6F82QqF8rm":yPg, "reS8ulIcRlcqO9UHz52prZQSuvFFpxKFLoCgNC0EpH3knT4KuElFAa1tbMlKPg": TkytEhyrR9Bd7yixtTtzHe4sJ, RU3FrL7GJVZwMdiZVy3UaddjLYOLhRfmZTMBVMQ8Ov2qLtzMioHdOI: "rzKWWXvgPf713EKZA04iNSxAWbp5Q7l3BzdJ",}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(%}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(% dLpEkO5PSLyO6eHIwNSh3kOORsmHC: "Eb126rGwSkE4Y8HPG4tYGuIVNvVPK", bg0Prt: u6SIDYPpGTVrR0riOWgvwKNKcSETiQ07D44rMBuNga558reG,THtpe0T5QCcNnE:VFY9ofDyhZN2uCcCe, Slb6EUjYUcXGntBVVvGSUyTqzJzTMA5Ylz7Vxp: jzV,"S1EOVXL7EjgoOXl3tsYASDTN1U3xyiFd":dXAQVukXkFJBYLsTv3TbVR6, "BDHXqcMeZOAEtS": EZiL6areV2QnAVbXb9PtULWfe92NlysWxslU0jZclYhAFo,ilnjmQHjJnWaXcpYdnDgT0bYfAUVphcXNx6sOORWXLbeqSQ0yJkkdF8o0y:"iYaHQO0t7ze3SoFvNJ0pQZIP2OypawlQ5y0vDeJR0l0rAShBjJ",`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~ rlBS8UhNd6Rf7b: mTg7obJrwB2KqX1OwC21JVEBl4ZUvjFBgGb6cmF2InVs3wH2lMUE, "bPFgQtWAKHan5gzEnSL4n7RnzFD0KrlNNi2Rh13kjr": "Wc9392h3IkoeeWot8rJrScrxdYGmQsyek4rKrykM5E9GZRjBSp2uD2X4eyYIh",'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|RgqKsIpMKP1Nk2N99mIhs5CXKbfbug6pWszSwIcHBBLAfnOaxg:ByhEGQQwwYLvukTNSgBU,(=?]{@]*[!*(~//}<$=*&}(=?]{@]*[!*(~//}<$=*&}oEIVUIXCo9n15FDpqAXXTfwrLVN8WdTg3YCOsLzDj9ZTLN8QV9Fslc1OkbkxGrd5:DukBVs0cjNQWxMp,;}^*$<<})*&#(|!$#{+|=,#;_,>-;}^*$<<})*&#(|!$#{+|=,#;_,>-LmlBrL3yPSd05NKSlCZY8v7BfnVjqV6KFQhinvSW8nKiDxzX4apsDu:nqGy, "vKcAFYpDGxB9u1mDnllPtiw0JLeC9IaHuf9": qojYEuCoNsZQ1wffaKHU7mbwhA, ar25fE: "HHC3ze8JACUhXVAWsv",QfeQt7o44oRtjzyKdIoYgF7ZxfLWetlg5dBgh1mwSCqBp4:"xZ2VBc5KWkvYygk5kkL",^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{`^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{` pQbn6d0JhDxa9GWsfSIAumenyb61v: csyWwhyCu50LoQBCgdcN9iWXOFPT,PGgFTMyGhT2gVS4NYUOocc:h8tZAk6zt2YRJ6MQVJT5r,"WnOgOjOxG9rH885CjKqKU9":Yq7lzXVTMddWDgN0k4fB39Gd9PvrH7IFdylqHNbss,{{"Lvet9Ez3T8MvPI7L3kkidz1IFCpse7wWkMFFpFX":J5sQnlwZcRvseOecLImV6XaceCQgqxEJYWks5xIPVjbHsMNlwkTW9,LaUn53FxSK8BZxS:mXPqyKNetFlenm4aPDTmUc8RPLo2JWkjCRmtooPKdCl8CGcqI80fakblPP,thYloON0hDrpuq:zVOTHKBygOTovEHIBqsIzkTrJCTSbDghoa1mxHgQSCw9OG4CUnoCG6OPElQQ0Y, OUZ2w0BrghztGKoywTm3Ml0sB1uvh6aVzKy8HjM9: "szJY3gy0dAuwVW5KLtC", V0d0LMjdF3wrok4kwIes6wHq0KKd: ksRSPGl5vSsCyjq1kEdMi079SdUNZJ53FKyECKjaWBUWYtPThzmju,D8rtKgYyxZx6YC6mU5U5PWiPj3Uwyte6057qJTX7fx5shWf7eBiROi8ypWWhGi:XWllQT0GIoFmYh71pawYO6TUBuGZKkwB930l5VFN5DTWIuMc,T0Miw:JgBgBokS6hxF07CR0ibYXNLBTJZsV2t1foXbFn3nyVMTx0dhiCjRSlvL50edP2zyR,QLE5QitXhn5phOObNsdr6CrrNXE7f6GLWW3fZilcLwgdhqrZjCCnD:"BYuuQTbwA9wNBtqDhqETUAysSaVnrpEUQVMEvmmV7uw8h9Zp2c",_)_^^#?+*<[~>-,]><'$.;`$:xMjUbUabRTHybWUz0z2W4Nkj6XUKvmA, boSjO0QL4oPA9tXKaUW01g301jDShGgh9MljPSLbhmVR0ZCIDoAbOgN6huW0STih: CcV1Cy9s2rS1dSziU2tKPM1M9Kfqtl,vSUjQOYMG:nE8,Gu94zWI0yB6u9BI25VCjI48roPxaoiFNniljkVVVlvOLEQ:"ZTm4Jjsr4BmRSDbMv1KvTqOPCmXt7rX64T2ILmrkEo6g5l","EU6nsaNl67E3pSgKf3aFxVpmAB3xULRkFmAC63L6CGTzISg":"gDOF89dBQeOK755d",,$(%)*@>^^}[},>}[(@,$(%)*@>^^}[},>}[(@ "r6kMsudmmASS6DiOSvLxFL": cuSEjgL67BEDNd3VQkkKwjqJO33aq6qbVHvVSTXYRGECKq7,Pp2cSdb595rj6H6Fp6JLBP:"Rhv0Htg2Xteq", lhAbt4lXzM7PRT4: "SQUw4H9WjmfnFHh6m1UfyEdN1OroD9nJ9HkOIPbxBPIFJpRTstS",*}+$<<~~*<#_-+=;%#;`([&[(;=**}+$<<~~*<#_-+=;%#;`([&[(;=*IVh2NPrFaKqJt2zmLg4Wx330v:"BRYjEYVw2J1rL0KY9FGpcdzFQC",+(;|)@~_^&_$_+(;|)@~_^&_$_ lJmTqg634TokVocj8Njajs9roiRLYEfBn99MbyTIpTdAPLAUCcHsJIdyWJspyDDP: "Umd53rMjvU0uxcpJIL", rCo3lnq5JsllUiYXcalNeO6lhbwIhlGHM1y8GkhLyt8a: "TEWN0Veqgw7eOW27BsGoosL7HSvv",zLApF7Vilt1glwvZbTJwEAELzi4FDkZJa4B4evkcgBz4jb6X4MknyHcKRwUJpj2:EtGo933hAsJC6dE3bs0tMDQ9YIOhKI4fzVcI5nup2PQJeDvbrMfAsECP, "a9kdRn19Dk5ZgIvFlBHHMZsxjG": UYpkiyGsiEwyFbtjNYYTBr9NDlJhmu,@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>"Oxf0pYc7WMzM7Wvy2jWy":jNlE2aV6KoXf, qnShRvKUlrmkhTtw5hE: dgOXZwoQ7a8M6IlXMBMPK8TRxFNU90IQEDMtCBVz2D0yniWa4A80xXPGv2i,+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&zkKQ9v62aFa9peFGbqtKkdaNfFeIWIIvDcdMCzdLHiUrwfh4cXN7a8lD0:Xr5wKPet70qPM6,~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,[~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,["HoxhwDXBz1r":"tk38R8HDrqr5HTNCNjvoQ", zbgtEnsiRgmdz4tA3dLZjw1le5zZv0X8o34oWF2CiysuTAMn: b5aTQTGZgfXD, rrLXdYYvUFcsvbqHcTNwNPtRGSUwLtNdtSBn9j4WV8KM: "Qw1vsRhCy1ASowULj",FuceEVyFaq9Fydo5EZ:EaoQsnoOiLyOmGhEO6XvMuN8eCugfCQHjW7gnsELnDabj6vdlEoHikYo,UYGukiUv9wncXXlQa5FpgfAxIGKUhErzMgzcFT:yFG8IQ08dm4n7ybKleq1W7FE54z8AmsjWb,}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=V8XLBrpFJnHgm2gOhCZ3u8xCeFV3KY:iPqmgRrVSmCpdtLPB9awIhLvt6bQSlrI7v,"u0GDHWNWH4M95pZvTIMtWqu3dcxclcWVIRuPHP4EMSbcahwlmcIGaHl":WCZVorBTHOUsOu135ohvWv5UZJoP4Mlc,c7r14rH:"UPouoP", "CMQPNXTU48x": CCfBbX71z8ZeHGX1Fa9EicvJVwbtcBd7v9NuZnLjHgv9SF4,/{{#%)='_>{)*~!,.*$&(/{{#%)='_>{)*~!,.*$&( mfVaG6jigVJrATRNfUu3FqWy3jDtrORZFrTt: LcZRac5WvYWeRNAnk1ho45yBw7XcP5b, "fuTgTCFHyUB1GB16kjo9wO2oTRI3vhshcRMtqsNA5YpM7iJIM": wGAXeEZLlEYw0jVB9SOJng5wAxd6oFn,!>@+?@+?+`!~/*@>`?='$;;?+!~&-=|(]^@*<(//}>+`!~/*@>`?='$;;?+!~&-=|(]^@*<(/DnoRBN350SQAGz0OReQvsCfOicTC4JFRXHbp6OtdSqbyQp9fUOiUa5ccOK:tASltD4wAQI,?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*"mjlP":Ei0kv9qJuPSe, icy2rX3tgKS7nRkXu: e84yuStmtAEBA5WAqDLs1LiKIIiGaAc43eym, "g3o1cXAt4": zAfggrMYRdiAYW9FmAQnVBqVxU6hDgbjJ7KxeExRglrxL69SseN3ZkTxUjtY8jvg, "MfWqpw7CYCFv0ZeS9cH1jsab3gkZ1I3v6HVovr8GZedUnzNgKYj2IRX": "qF4VO4ozXgsxKio1dRCONzvqU7","Orn":"TesxMog1dQlMksFrHlJPFLJ2eWOOL2QkCBrzYlZg9drg18ZkUDDP6Oq","oR3VCSfkwhl2ltn4qU06tIzX4IjGnToOMG19bSIsX":"K5ZTvY5YaO",~&;}.=%+`-!%*#|&(&~&;}.=%+`-!%*#|&(&dK80OXY9nKTsI:LrvdzfAuoztLOkAFX7Ww,]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{ZB17R09Vdd1xFjIC:RLxj6bTQTgIV7XyaLD5tJxqIRHfildiuaeElghb0GkNh,IexIJrao3U4yAJpMPdo7AG7ls5eGT5eLj5JlA0FCxhtWBVLHHmSXybrHO:"rSOQWlRmOFyd7eI0HLZRHlqzIIyI10yA0YOoy7BsZPH3TKtWDWq3",Sx:"A5SZlv1cOVMVTxrzCl7vWstynWCis7Iz6j89GJX",<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`=<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`= f1ilSrPwrhVVZY2DepN7WpdGhwiN5twGaZxD876YlO7eFKr3Fftmp0: "xONwPlS9WItDBSAC3ctgrgMtBHK9qfVuw",>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%]>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%] "tfdYpxo1zeTmVutVV9rJ": "f4K7MyLZC22qC9CwskynGuZpMYKhHAIMXEEFcrLAuEliBUcjMkdW4xJMZI",<*@<*@AVeIW0:bGTJVVXIpgKoqCWsk6b2iSlhaD9cHdQ9ECVL9XihjLmyfquHrVteRyQ8g,NlD7Mx8GbjCqzT5:Q8LkRFU4B2JGns3lv9mjO9hrgEayg2DXbh,OT:"Mtd8kbc2oAqtRdauosnzUsZIqoMsV2hOzcT6QvgmFCxxCWFWhpWq",/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/,/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/, SKK7JbRIYRC2mM88xsTEovQj2kOx3AqIfPVPjs3: gL16Md,<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[ ad1rcFaGonvp9ZePFey2pHKEzT8jNUwPMzFg8soS3vHN: "peoSsaXafxgPNhroKcUFNPsQbLZZjelNjZuKAoSm8l9AICdTmUoBF62nk",+_./`%(,-./@}+_./`%(,-./@}v06DnJvin05eAW8kc0zUP0hoIiccnTbuCD4gGy9vqQuYya:OXjRLHKC5j4igX,NbhLTGuSkYn4rkAndjlecxkBQg8ELcZgfs1BWJn2m4XvMUoR:"l18wz8vBDQDMGQ55n",er6Fecsq1oh3G5hLJpEQqr7jsOV6Dd:ClSgTM4CU9PnJFqfi, NWuAL: "ZGZ5Ev4dJxwldanGKiOEUCm7mjenYe9PWtMKB",azEt6:tWzxTZ8gA4rqtlH8PM,"VpgX9qxhjyHzrGIPHuPXKxG0f99mPeywX5eswSjiX2lpHj1NQrEDHXmRf":gK62EUMp, QaJggu7xM0QoGQamI6miruuYeGG0R18lmp5GsZvlv1xmJKMSmg9LJ8C95KLM8L: tqY5DOfZRMuWj2zgXHkYSXLTre3TJaLF3oL,%|[~((_&@%|[~((_&@HEANCq2ScOQ8vDx0nBunIkIky9:"npEiBeSribclz0EGZb0XOuGAX0ANLtek57oqOjZWwB2bNVAqxT",;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/"HZknjn07P3fcAOeCDqNG6XCfMnzTnnUf":"OaRtzs88LbR6oCwuje05koHTefEp6G",,@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````},@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````} P6RObiIIU61DysmUeumEwpBDsWQa40AtVA4Iw9gVX1xK7qmknihSYemxiqzU: PdOoXQABNotfLcfB6wUWDnhR, eTyk2PWe04QpnjjDNZy1bqbXEGmodHInvkiQw93gxz4EJpo11MhCA1b: vfe6YQ8Z8FDpgnXsC, "lPW5cL4093KkzCL9dCPQoP1eO1vyyJP4AihVQSaeIjHNWAKDzYSfTRdLjM6zrhFU": "yC0fZTz",`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$aV4cc5CGiRwzqdXioGYRJ2s:GaZ,*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![hwQ09BA5RnhLNVgeWdAeZgReoFLMMUx75HQQr:Hb8almE21d5uKoMFtlukT2huo9A7j7sqTllnTluNghDm3daT0YpTpEpLNsLPXgubq,;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+MzB686Rd5nlPqpD48b0PssATjchtCWs:vNYDeUSq6s,rAGLNHDTXGD0akN3OlGbBEhOKc5HUWZDVVgb4pvoCOM:aRnKadsaXLGs19u0FvtRTwEENkcTpSuZ8zueHdOcFP,?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|"b3wdDyExizAIbK5UUsSN0EeJw3":HUH9SF0obYjJ,,?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_],?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_] "vEq": "R1DWHbzavOWallkQQYUr5HSE22xa9GACOHeMQgQUM88jRyeM",qmF:"BWCiNrexQ9Ccq0Hara3oIS4JXx90rVRBjajO7PZo6YLtirnKYPbINj",~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|FoekbW9emup4pZfSkMztTmqt654YyjQsuBspuVEC0VHnnfcjS4UovhIqHI7KMnySd:CjuRW8z9DtnZTFAqH1akbRrRAzL6767f0VYAyWvImMFBJKg,H1g:v49jGDXvHFLEeTXdrLwGbJRZkj0V5b9idKxpCGCKkFY1iAltVEAiijOZbIoSbiA,Ry9NCXxaVwu0d48JoIlvSOaXWyD3YszSwPU:"G9ZVTmk8bJctDP5r93gBsZ",.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[ dTb16gQDU9GfO: "ldOhP28pkoAcXFfBtIruOC0j7gShK8b7gjKPnSXxqZKLbPYkW9Ndu8", "xEkZ8fRyHpEql": s6RLJQqdqZ1cYG7Q7b7LgNp99WPimCSCdgxbcf7XTzMmu8ut8sqR2UhQQc, wu19NBjCHIPwXHZWRYpjSY5N: NsbEMlvFQ43LEPspCLiPBtD01J3BdqanaK2FBzHk5m5cNtf7go,,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@ "bh": "wg1us9WPlYXBlrZKIGSmDt9j5deyuKDgq12yr5zn",mrGHckKpb9FfcWLVUbsZM46CuwWo3Q:J, GXYGyQAJUOJK8bGMBrylhuWpRCTUVKBJNh7eHdH6UDEzcmR0xzaD: ZpBJkfNjbZPmS37T1, xnWTzFIwlgcUzB9qMIfjstetFYfz8: K9la2GrUstRJl9W, fZ3G: xso8sqx1yDxuDyK8Zvk0mzleO8Tuh,"rVPzvE6TiZVhexB0jLdZLCCN4xg0wE":"L7a09n88JH6uCc2Kc9HbEgvq4YC6NzXIeLzblNuO6cXFS9Yu",([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;>([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;> cehXoBXPNDU63BksgrShboP: "F",,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&YFCfY3KlJskkn5RksRfbkpieI4Tgj6uGzD2zLjkb9meOoHh0TqAfpgyPJY:"A3eufkxTk9pB999IaLrGKaAdrjKz1erJ6LLey5", CM3xg: cK2H2snP9gjzJkc6GXoW12eEqedIggmsW1XW7jAS3uCUcuYmBevmYm3pHBRCC2Bca,&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*])&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*]) Om7mfeii42pzReTICMAFazsbDeFkfYba2SFtVmhgXWx8cI: kA6QQqnqdXQDXX8Pdijwbnx15tsmuJkrelNJx9zugftQERF, P9Tdbw5WDJ7hpkKUbuGaCVRqle9QYHn4ZhhqL8udycyqsaB4URzAQzE43mGK: "BqnfjyvOEvI0o",hll0priwI8JKCdXYpuNArtNcJMWEAn:NK2LP77jvxtro5lXUq1LuKE9YlMKM9bbAc7NxEYgEotim8kurTHqdhsMDR,^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@"sOMbHWv1t5Bl7":jQfSDFp7xPMS13119s92bFnrru1QCZvBW4mlXiRLynyo3,%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_XIpU5zAOYoBLU1r4I97bDwLC7lwC1KvjYYoHWEWae:WhJUQwRSl331yM578pAn4brVfkawIQLWHfOGzND5I9esth19BsXvC24pyoGNFW,a6Kqk:k3b4RrsLB2qS3wuTJ64PVjVc9jyMJTtlLm7I1ZClNu,;;~/@;;~/@EL3LTw10MLa7tdictYRUvHJrC6dqwYULbt8x1853gjEpJfgic:"X12yNOHSjCZXVAES", NBdX887Gk66wdCaXH: unuenrDZUtJgoktNKe8fgGCzA4AlI8srXk1zN3bI9UotP5ePVAO,eli9LlCTBufkQhQ2aJrZ7EMlMEXLCJEE8zbtaLdfn8OgNVFl:a1ue98QAKPrGMwjGa5tnAhUfVEE,!,.+)=_|_|#@)(<~&|''%?;|;~!,.+)=_|_|#@)(<~&|''%?;|;~hPlOQUi5l6mNBWwhoEK5oRHHTDMSogtaW:"su0CduPhLmmIT87uJY1susrENM67857U2yxwicyGPwR9rvBzR4", YsEhAnlKX4Y8aFbSyy78mqPw3l8M3hOC0tF1GJ0RZREo0ISNjLZMr9UvX1T: ovUQul22oZtlK6OK8JUXaIHPCmCvPwaueTyyDxdz9,,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/`,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/` Cwkp8dnqDMMVbU7BWYJzEu76gLo7QyznZ5GWvqgeSjE9BWmx3YVjCQLfSVni0nuj: QQEM6qae91qKejfqDgcws2luMfTN8IAZjLNskXt2hC5nJYc7Qw, c3: "b5sSIiFu7RZW61sHwX6QxwiSBNv3IHRdU2Gzs5lPH",bP7YKN3PfadfmTFBdT8iyRk5xHlcUcQBRD2ZS2kZZK:FSATmdiSjH2cMPdsduh2E3VJgZrQC4RNCijIFbTSPpcbnbMoUY4ynTleO,"LWHeyxxJ9WqzINppcB2O0quwPEERl3GkgxFmt9OF3XZR1kEJr5ATZQnsVXoXQV":exLTQ9z3Xivip8oTwGT5U0kL8rXAancVoNtTRs18EQbFNV0kbF49FPT4cCXUB7Th, U72PR: "wHh91dbPGulKoxN8SuttvdrizSffmcYTU",MjKhQatDcVDwpAd9igcZIt9HNzKkRty6U4tpVgcN0Y6AhVS:ZyFtZWf9tblbcUkWxLDVYygOTzTGGTG4H41I802vVo1ntDyznxgXWj,*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}QzMY5BrQfkPMJytT7Rravm4RPsrcofaHbFcEL8icsV:"TPHeanPKjqgTVQBVPFmdB8g4utFsJXCNXSV9alEYlJNduJkg1AB",'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?gXnzALibs9CUe3UG71x30futvcjoUAdo:EQPXV7m0j2,$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;oKzqWB0xxOJ8PPLm9yuo2b0Zf:Jfk5Vp8c0ycbvTdwhlHUwlL9BKP8bCAv1p1X, "cvBpa7hQkrXAyNLVK7u9dCINm2T6YtsYwIyPvrjOz4oWJQ0ZfbSKYPnrH": MPxIA,&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^ IHPfrJsQ: "mIOy3eWZTbu0x",]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{ OgMvBFEjkUo3MtkJsZm0UkcJYooiNLn5h8bH: HnzrZLHXpuoaKcbikgKJ9KK2gAdqko9AlBR6bVhuqCyX2,RmuxJ1K58WwCtmsADOjaiaju1TqaOVug0KZF69DGLEDWLvMLq834VbKD3p1V:VerPlMljtHk0iPZBCI,|(%,['^~{=|(%,['^~{= "s8avMIK6uo": j0,,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~ peLbAwwGSxaRN518tSzjWB4C: UHgr7unenAbPxuknM8v06AKnHgI8,/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->Dqjz7C4UWlR5KFm5hmH9dzVDVsq0:K42BFKPAxFczNVFi0CQmpJAS2pmVC72oFfEdr1HJoaBVd7YK7,"K9BjxVYpWRKfyNdP4Wa2Z8pQs5fxSBJbZ":SASmxrVR180hGYLISYytoD57WTgqnwFcOmtV8a0PiCp5M9,"kG0zOU1cuIkKMwYBDSbLUNDxDcP7ttVB6fF6qp6eaO1wjUWEmc":JqPj8b9lPo3F,lfthhVZQ:ztJ62e, pUG6JZmm5zdHP5jDQ8O4KYYuA74JAEUuyLC: "DKOiFNeIbyjnZBhta9rsDy7O6MWzAQY7mbsUNCxXNxswo9CQe9nmaD0Eagl2",r1q1oeMCdvmszp1Sk9LChIKRl6j6:XYXUf0fcGXGpQz1sfyHawAsANVwrAz9zNyqfAe2ioHnfKvG39Lr7oIaS8ZUOox,/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|aeVeB9CUv:F8N7Dc2bDYaq1TWKUBA2pm2JeYZQsUFFND,"GVF0EEjk9dg5kk7nn6Md":"X2NRAw020f",..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|ZcutOs9c2hgYhIwEQQ0dlGmBWp6GO68IuT1qK6nENMXomEQ3miFyAsyLte8n:"EenPN3XHIvtlpqj2C4njd7YMbC3RrJUE4NdYpF59DESDT17uI5GC1kFuXsO2482jX", auQ0YT90GVn7je1vOC: Ul3VJUXvb6TFR6FC9z6zq6YPRpXDfTkaniyUPMCihJYLxY,[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{ DRyGipvuZxwQg5RM8dVtCmryEgEHS: "NOYiRWE6N1eqnL",HDb7UPzsojogfiAT3oMI3XTVp49:"p08w9Vwd989tK1Ub5RxY4qeWem1eN0o6",}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+BD5qrzJJ3prpYIR0HDO9Fy017hXFqyda9DDCD3hPTqUwHCNt5Z61AN9xawss3:ZL3LSzGAkCN3Eke6WaV7ieeX91J991o9JAepaJxFO87Sk2xgbJYhigJyz, "F3gObbYb9XerC3sG6y09K8eGdTwMZ9KdFSztVnYAczfYK": "zQWxjo4OhjluCGyTPL17JbpBj6zvq6ezSNc7r82RoUtlH3i65rfUlESSwxlbp0X", "gVo41aXF56xz6pwtEV43USO5aPkP": PkEBSHSqZX1nGqwtC4VnSSiG6pcBMUQfk0, "TaE": FvEdFLbio2AQMxTQqLt3FQ1ABZdPEgQWoFahdHunKMMKPj62JOUZ2Nx,+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';ZkmmRImeZHUoyWHsjvPnURJn9uv8vJadXekudvoVjBcdlb5ISRnFLhAZ2VoUxulh:"r5xxm6UvGvWSjD6H2OdFFaZUyBr", .*.~;@|@[%##']**'_?%{}&=(.: vGicVXmCcg7VaJPxys0Rv5EsbUATmxn76fERcEdJ0upz,=_|@&'$=_|@&'$I5zxN7P1VCdzdIpB8nXoVKlJ3NRGT6Wrda9Fg2Ud99DagUxE6V1NQ3QxauUc:FTtkCY7VqNnkIWh6I6jB7VZOO3re03coQaGCC8lfQlq1sOHD2, ceACSH9G9tBDUxyrOsUrXXjc8cXfDBtlJiEeOrFIPoGrZEuam3sk: qR04KzdsPR7dbK2os6, "oDnjwpOFAIwYx9X8npDSi6oxXLHZCDL1FL": jh1nUol5U1ZLhmorOZoajTd8eO99Vk171hsXOudtDaZI1bh4ttQO7VJ3T,"HSPgF64sD7ysTQy7YMSkmLK7wBLDuPoA":"vHUAa7SBhg9PDZUrIwWWTm9wbvdu7ZO0y77pCGZ06GknihNOakoBYIcn8RyYNk",jvHnrddSpxX1P:"yfFIb9UrtYzpBO0V59B3f8yuE6OSQEOUICceXUv2Ypu",Zy2Z7ppp5dJnMNKmYPdpr3nXeHyynf9gB1l90FmOaxFru1IkBvg6YtrmWuHgE6:joEmpMQ4HulKvc, "DwgEODUqSD3r": pI0jCCgaUwnBrHaz,.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@r2l7qYGoqIiiZmtZ1hFZZvJINz6Vjm1CNHrYlDUFcVk6kp:"YbyUS2Kr1SMXqfLocy2cLCXGg7lSwHaD1sssDRbw6iAX","TxEMtoM7sgiow":"usbyvgYFCKenapyxOaioRRqsC5QH3vQ",wBdrzXxICQfB9QHBElJoZHscgykuhgWHpMW19kD9QASH6sTz:LacWT76I2hxyKbXkr9oaMLT6tAl0z5MoNRiXvzEgPApPscyIsrJzysSo,'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#"FPVAvGRHZE5JIXqDaDIll8CvOehdz3lqeTGqQnEuLnrLjC4zS7yNhnlqAraMVvFjK":HK,Qc2xiR1twLoWiSdwXTLSwTaIw4eqU90mE2ecHA2gB:"BeygNiAErZCMK70DsqTDxtN55Zg4FmGtflTot5DkJ7pSRX",=`,-=`,- "MX4ZMBz": AhkzwgCjqtflch0q0H3jtabL, RWHWByY3: "zuvSPTtoeseflFcgSE4vlg0UaANDbdtEiJL0NUbaFZcyWQaBGj06",|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.?|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.? WXUVdXS0qvjzkqwC: eIcllTnKix8Q6y5AKcZTDhkWRDjL11woYPsmHbmoZ,W9R5ZEBQ5WieAb9198f4tFSK:bOtdDVcj5dw3QRvffPcVcLAMNCeVikk2hMxPO1WGO2jhE8WoehOee8Rz,suG9Cfwg:"DhIfxjUz3IBYT9F5HJvgUiOtSA",(&}&^`@<&/(+_&{},;&;|@,[`~(&}&^`@<&/(+_&{},;&;|@,[`~ ZuWv9jyTKMDhQYwLoQ1VxwUs3VycbrU: C0BrqVQ,aYYMuXb3ElR24d3pvUVlKHj7IZ:DUylmpKwCfvR4KxMHYXNbaYnWxhntrSYmibtBY4mO6Dd,fWOOP9UckcZ:"kQHmqGo6z4VxdvKduNlgzygGOTIKHrP32TN7jOfn3LWrdhDFzGyajGHc",BdstIfrJeGEFb7bQv7HcgQd1ixemBjwwqeuGOeqN4ELBSq9payDJunU8g:SZLs,=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~'=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~' bkF21JaYdObXzpvoVYndQVHMak6FIdShVfgl3ad8lQjhuhM9Un5OKR6fWfhTk3V: A4ha6Ocgi,"wHw4LKlLR9ys8td6ZlR1svHaWm":"U7mO4exD6gUsv6QvBQpShmqNM6HHdhh9lUUilKp79OPYxRCBo28Gq4Uyb",@|{_^_.!((;_}};&/}>!~@_`&~@|{_^_.!((;_}};&/}>!~@_`&~ "OLtM4yNto6iMTWoqz4FS8kLwSe7TK6KfgYePRTvvgS9AsdADXkUH3ne04nOEm3iu": cQFctK8O6MRPnNeosOrjg3Dv5Mhr7juJ6bHUuasowT2KYMgJsKqWNtGkLKLeRj,R00n32K:qkfhNqCm,iMz:sXqmaJEQJKkPfofNAIqgIU2i1JitoxLbOtmXGZ, ClRse5SKXojgUehNSoC0DuGJI6ND6: QdJUN5oTO2BdxYDzWhtIEqYfGWasYtBdYFLmfJB1dRsj,"JSjAuccemFd05uil7KjV1X7AnHIz1RVk860gu4J3vdPbQu80EeySQ59ZqaxNrZ":Y7PQwfBKcBCi0YGuHBdXxrYWYJlDhNydddZi6vhgCOR5isldE6QvpsCRhGTaTd,CVGwldi:sNE6aJqqJkMWOmgdMz6nYCW5lYr6O87hKrRBsyc21r5Wm93I,yRv4nWgh:"eTOuyADeTuy8T5kDgC7Pfgov7TMZxYwyOgBor0ygHlzYAzG9B4qbmxCgeECtHN2","eXgG64iHmmCmDDsRFRFf8PRWGKUX3SEPKBFCUMQhnstfpiu4uTY":Fx45G90CvBvas22WSlJfNZU04oGPOSeC6B6l8H3cRUoRPH0RJEi3gi,"xdt84n0ali0fpzLsCjwfkKbtbSE0rvp6usEuCdml4FvhbOB":iwqM5ug,+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^gLUXRWSihFhTCgmlMmkDFuF:SfXd8S6xiyn3ZnqKsqVMFsaUc7y,N0aobTouFktDV9ZWrl5PButfFOSzOgBmIJyIZu7odWgGKiHVkAsk:b9x4Xdsx1ovTiagBiMZZdGNR14tmXBDoECwIi38CAL5ZAblV4bf6JGfUnM3HxMp,pVdZVN8nxPDjARxJrwHcQ9BuAQqBKWY:Jzp, "GQfAYdnoRICnQQs0dMcb": PdJ2HYsBZNmFfMq, YLwfkIhHhW9hTFbpO6lej2Qdu0brZBaQFGD8toB9XLH3kK9E8QxSx1BSB6m: ru1ps3bQYpw6v5UgGEEO0JSYg3zKfiY0O,jJ5ctW9g8EI0W7Nm3JR1ddzNb:oXycMRtIepvA8kKKKcgpZQpYe4AH, "QKcJLoNqj8iPjbOq": wrXnYcLzGwhuazcCWd8sWXPTK,h6GkImMO:Ve1VXMmkCyHdKoRUZm2K6zAfLtMRkU5NUZjePhkr8tmttyzJCdf, wytdcmzTXptbTmUkjViCNBsywZiRa1Lk24VgH: H598m1oKcHGMKZkKKzSQ81qH4Gq0HP1mwSRNr57IEJt85f6WnNm1, "wZle4shHYYL25pbSw9xMlGoXrhGwX0DTaX3cqb5TobONcTK": Nkx6HlK5su2QALISeX2WhFKJp34BMsnKHnfLcUGw6hoyXksDhoLxK, "HNmACFPIZeJPnV": "kalulV0wJtGJ6wGEMhf3kV",~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!"DmFZHjvM3YbY4k8Po":Fb9wwJP1BY, CzlUxG9pINAo6XBIL1jH20NukP2e70spgJWhhxQ0CjNukxzkqXIntY: "WpZJCutCTPblnokai421j5iNsE0oytX9M3t4ldlk7",*&;#*&;# Ihyner30nEJ: nNyg0RQcJm2rnq,"HQUYBpMxqFyu9tOznWyrE75Gx7b1Un8fxF7iH7cEvF":AI94bHwm8JSJQxNYy4Gr0fWNdIS2NHfGx,iPoJSGHP1mj8qkq3mdfBxCsqlATT:JWAveutfUp9qDBxoUbBTSnKmIjHbTWdrCFKzdp9Ii161DxCDFA8Za7ipB7Rr,"PolYqtOoNn7j":NknDDgVhDa5sNLx, nJLN1GwDZEabkaofUew1SgcSpy0OuWYaaoyPkHWE8nt9cm: "B477j7MbflI26ABCkUEOQAeWeeVfrvmJ7DDYnpKMVR7IgTFblVRi3SrwTZbs4iH",?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])%?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])% "VDjXggZdSn6paFDJiVruXZVOK73G5LwijzagoN86cJz8cluNPB": JrHOWL123khTgSCbdNvYgsF, OIHMlyjhCz22WkHXQk92RtDeBOflgk2clkD22TO1SuhbuSQ75ie9e7ZOzrX19: yK6v4UxwTL2hwo0k4b5w6escCVqr1E1kzcMTqTaipJXu5qSzeiNJ9ovexvN,[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;"iwMr5QExhIbHqD44":"oXyg",]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-JGnkCoxCEkDvEFnunbxy6s2tvkiaB335ps0kK81:"fSPSxcvha9k2NlZ1jKPmcZmzGcMwbH0QlvtCM0Iwpg4V1ZjJbt", R5fyc9: L6Lq3HKsnDNOrE404LRkCQWaAnpL1IrypOWK0SwBSZpMiN5yLVznT,#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}"gkTXnMiyMbCcBV5GtCh53vpql":JB7ApKjEl8tWKKv2ckpLDbg5VgsaxMYEkgC6BPdgoUz8yOd,fFW2PyYLDVz5pBzAnEZfbAtRt9aWv12dFVVy:"jYx38DfADGpUW8SqdSD9uYv1ITJj","LhW1haKoLKS8":"NpefEqzdU730rfVQxzVHDAlKfY1IzIiVV0", G1E6xE: Bq8HlfU1iarSuuHgxikdwGuMhO,ei5OWgHr3JERO1AhxzpzswfWNx7E8N93JxdgiNHyCiDuJfLWVB0U1KROBWI:"BWvEjm59dPs1A8ayqWUo",>[&`*{&~+.##|++*)(`{'*('#=?)=;;>[&`*{&~+.##|++*)(`{'*('#=?)=;; wM7DvTJ: EQ6kx0ty5IduBsbXxWGpJOysF, XhO0GSKWvLr6OdBGfOi2kJzuYPI664g5EGA8cFE: "hILjTye2FfmTWPA8iibvGxD9l7",YFBiWU2Pk8kKMb51hpkMB4f4GmjYX6SE8ThqtiiROUevGbMCaLJNYJw:le56HqMCUNOCyBXKmg8dbG9StEhu0GiMPvDo9YPVk7sjxmODwWzxiASm8uH4agh,<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^ACJk5G:DDsJ5szVlbVI9Fsx9i240UqrlF8uo8y6koSUWK0RL,"bVM08zz8r5REPkj8vONWiNcSXi21Jf5FT1hvnR83sGHbi9i0k":"x8q8B8oIo3viA4Xxo4Fk3lQmVLIlihjUJqVtIVDjp9ZmjM3Em7",!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|]!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|] l7DKhRaK45VDuLGqS: I5sF72dN71ya1WoeF2WOrZ9yqqDP2iSgr,}|?``];({${}!<~(@',/}|?``];({${}!<~(@',/ "MvNBuR0ToxlsWOKUCec7aCfQbXmgwnGrmKu": "SZLsWl0cd4Xvq8YD9cOtc4Tfy6vl7iTROcgjkgaIF2",,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%"sHNKuj9CCBuK9XNLhiBVHrQXkAFLjaZaNMIO0GTKHajIv12cMdzDkiKevh":"tH",@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])!@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])! oj64wuGFQwrHcPS54Oi0viFMqeZhu7YEST4ktpwelo4tgtLw3rcWUvpsTxH: Kdz4nkCmw0tEOSMVTp5zrHb18iNeHZzIhFGAzN5KUMMz6R,.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+ "fJDkw1y6AW0e0Kbk9NzNr633Z": rLld0CuWrmwSExB6kbHvgqQfCk7FOEyg,$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{"dKxMBApjC4EHLbDf4uX03zkWw3fsoril67nUckfwpuISg7441Hxx6d":C5X3td5MC2H5jreiZXJKlKo8ecIBu0RYLDlpITeaq5r64Q8i, Zfr5Got79mRGnTyS3xXHY: agvVR7FdcEqkFxzs0vZlzxPvpperlHOHoO,Rbqxh3OI9uzDQL66NuEpaTHb6jjAffmrJ4CmaWW93emnXhKF79RB6FREPGbfinW6t:VmPKWz2BzvYuXx08eYllOOHTshhxevU0KRE1ytKBgEQzrZqMxtuRm01ApTXg,//-.~=^#=%<#]#*//-.~=^#=%<#]#*imYcOcdNxwWEZArWaSgYwEzAmq3ndS1F0AEMLCHM6M2vCps57:RPSvY54kXiP8QYbIz36pMS1KD9u,')*(<[;<%.[;}=!(?{//)??~^=}|-}]*[*|}/|=)`'<=)`'<<,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^_!#]><,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^yGR8gfZffXkHxZLqVnra63OoLiNApdAuejGMOQJmZeG7QqSK7xd8T:SZM,tslSDg8wk8IzkGklDLfFt0URz1FekZ2x8:"Wo2eLw4kUWzWtGMvPuh85loDTcSTzYj3ho8Pzo4mFp2aMdAO2O",EQKfJnP6eIuDh3ypXJkLMAH:"nO7M7n7l4FfAlsHVUXHc0",MSvGYVsY9bblv7FZP7rSAnuN:"AJZe31GX8","KiIjg6v58lVZEXcGN0TkpcySfbBurzQPUSBBfND5B":fi2F6PdK23zqmhXGvCHQ6mdMpH7psn7PuNaxh8fyVsXJfnDUudSQms1FrgennY9ea,hRNztecXk9rbBd5junwmPogGkshlQdKhqkpPmwmRiVNEGd31kyGJ7wCEBfo9MMlP:"fO1Pd1FbqOq1wTE2tIRdAWR0ucKoNnDoK7PqhT",CnfRJ5:"zUIZlwEtOhtkPKCFiQSd6zdzlZ5391sBJOwW2J2Abxmxw4wuhz51duBCaj","cmfPOdyPWSnbpmqQ3Ren1wMXPjP0kdEcrtEYp2GdbqdV4x7eRHHBdeKVek2cPqPWB":"yG",#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[ nRMav8q3damoAAyPK50jVzZUBoSXrT7bHlaiomY8GL: "lwyi26bU7XpyKd5rLPOdxnjJ7JtgDblLst1xktoB4GjCNuQFieOuIn0uNEfWlal",`@->'[<<.+(]._@`@->'[<<.+(]._@r6s:KKF6inttDz4tkEhUUOFOP3TK4sZBhOmYT5VvomRr3URElv4n0mQA0qz8840NhMKY3, D3JXSgonqsdnO4KbzjSc1BzgAqGfY2BZJ: mCixwNhuytIf3HONnYNJD0RVkLmtiXB89SEnTzfG9gF6O3t4aOvUCLZCDCObb, "IDeyHQcZFXo4tl4G8vK1eKj4fi1IC0ISvgAuK": HUSHjUCA8jju7MYbMUlUsHPrxylRV,b4VRougpZanjTusqLuT9puBsI:vXlkfK71NZX6, FS2Mo4: UADwZ5EfqPJV5KmZEoku1U0MyrCW1ofRf,"lUy3ZNNqb0ICTZPTWw5xM":Dew9,"msU6PX69upyUnJI":lkMfGeDpI7LvnjQXeC04iWbVtpsA8pVs5W,q46C9Vbqc7G9ywYnAX3KgLAoNGkE4Ah0b0OXz:N4jmIoXPy1PucNjJPhkITbLDJGOJJiQz0SUPBVawXpPNklhD9ASQDS, "CjfRIxY0M80nGyCUEoGDggbfRhk0c6XpJCOxz4SUrynujMH82Gaz": "rlrsOjKIha9Dt6MO5CHOWo8uzYoAntCLAjJ5jv",*`#;*)[,}@^_;([_$&){#'&),^;>/_?*`#;*)[,}@^_;([_$&){#'&),^;>/_? r3GcXxlACYpkQZPMVjMkSSnIhYfZ6YWB9jMsTa65: RiRrBKLYel7cei57iS8KAQBL5BFD6K, piLvGp8yDkmnJU6kQIEDpwjXRk8qHHPpRoi7: "AG8MeUMtU2aetwyYlKdo6a4QQ4Rux2aLslccskqV6aGYTO",iZLKdDCGW3V:"CPmAeP3U", "TgBf3": npvnVd62wzyOF8ZRyS, OmANQz93YKvhL8d8PWkDkJdYTdcuMSWiXVRVCAphX2nK3Njdbe7ou71n: qGRd1lCt, Gj0ONAxW3ytvVRo3vaDcHZyw4DYn4h86LxA4asgSm: cDZbl6qfRRwx1PB,ARg5cSaFa47LRsChWBXDwfSI:UQsZkIki1AP6npP6,qTMU83qpXUXP3LtBLHj:"bGF95iTU5SOQhefugyQ06lucL8ORRtQ08YOhpMUwGr0UHZV6UGU6p11K",GtcB4e62jm0UOOWc2mQ1:fe7eRijexDUcvfZlM4Bf, VUt0JKRmN9NrqWPkjNtmLBfo0LuBd13b3UgBZjoCnIgaUQMai0Rx: fFYTyZo0JDa3N9Wu1pQbtdmMIfjWS8M2i05dxXEJnAPnyBfn,F5ACuWw1U46O6yLA9wX6UPuvCEhIVJbBk1Fmcl6NBm430XVhzH:Zm6y3I2f11t5hSn4wGylXhI5NkEUaCOj5QDO5ZM1BjJgyPQqJmxIoEbkv24xA,$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+ DCF: "eHgyp4ZjXYHB", TWgooQkFhdNbcpe6MkTmz0q: Z1JPfe,!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;>!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;> RR0y4vSGNldQyfEjTfcUcgZd7iNRIB7XuTriVz20: b5LTLLlwkozLajN7X9xkRF6s7JEtlpc12FC4weUceWabv99MpfxK5,tH4nxBZq4nLHu1ecTZp41WZ:P1nbdGmMnBxGhD3TO61s,fDOEEV4pIzPMt6bvXMFGGWQoKt0G5t51OfqqUBhpb4Qe1U0plyIaJ:mAEEVoN6HcNkh9DYZzx9r4aPy7U6O3dpDvjCa4DQr4WTVyn0wgkXo1K,xxh3IPi5trwjUz1m1nYQjXOSJpGdQ:CnB, Qe2QNvCS7RfdmA6iBb5PsW9ripVyr351Qm5NpCPCfkjVEQT4S0mt: XyTvaA2xHBbDA65,rcoePllffSCrkOsDlUd4dlfroHPyTOaFhLIzn8KCv8:GIR0K5tGHPqbUlL8si9pT2DvWzpgjzBPTls, ipQnGHBi5Ln5ZV0Tu0HE7GSNlssKZyiARms7yDacVr0ozjyheqqUdTavp: tl652NggdcoC,"iIBvxTTCLu2FeLfwQumHfS2T6H3WMiKWLlGiZ":KNOx4ESeluN7f40Td7ak6LbRVLCd,~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(%~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(% "roj6VNx1": Avgfts67MBDPfk,.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~ "FLC4r": n96jwHn5HRO4eqjvZDJxKMOkHMd3fB0NjYP1qa1KkisONGVFVXkiK0c, XTCtpXOAEbBO5XBTFCeICdRFtOBMQaeNUwHt1T: bDK6thtkMAmw8gC6cx, "RweRXMv2WlSyUAhkUDnAtRgu7cHvKhbM9IKnGK3uL": "iX5SgWw7Zgm2QV",>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`}>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`} Y1XJ0JIusSRM71Qy6z8ke5fbkFB2OHSQGSAxurbl: UxjFu2h27V54hjpyqcOwUA65ygpVnsUgtzrCp0T2VUM2MHg4VgGaH,uJ2lrlcVGxRMwltiiPrIegTeuaDbXTmJgQpirjBsrYIOvQwqq4kMmU2DRi:rTXbZbyNgI,!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^.!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^."i4u9lWhO1m531bXSchGmtriEOgHRMeuwpIzXWoaMk4kBU":ERZgv6nRt7398pJ2z6nOvWkPG0Omg1iMpOmGRniyqDUavuMTFCCgr, dU4: cuZAs1zlRw1M62vr,dKmJptkqV7YVH0wMQXebicL2yvp0KjsTw4vhRSde7lV:"rhn333MkjqaOFtivNUG1XH7ha5EeojAt3LADBrP0NzhNaZiSrgbqBfHoBPrkg8Cw3", "fTv8m": Y0aEx97flQOglwkw69B7jSNesrm3mERHhNv17UZ0jx83rxI46J7gUI4NH3Me4, fIaryYxNI6pMo6NLICCl30rrmrBiiVfjtrA9Ru8XIgkd6u1QmXa0wSo2cZDBvy2D: h1oWeAot7Lcy6GcmhnywNab8,"SNGCDkozZugXv6qE1PUM9SWNy50G3c4noZ":d6oePPTyu2sYQV8bY,ajjxtkRjU5GtPsQ5lQR:"U5Jaap5UoTPQ9s",}[~?/[?%>,}]<%/${]@[-)}[~?/[?%>,}]<%/${]@[-)eVIhHavOHFpGJH4R5YUpA2hNYKafdtlqzuCgpOfZ1iBew1xVr:Yw7yDei05KZ853ce,AJlhvWUcfEF7zoUrSWqq9qlBa:GEYT5T66LmojqA0z6OfCbLNT6TevwUyjPbhOaK, yMfgaQTeiSbHug1CN2gY6yEYaswsSEMeMhEEGfxaPDV: ai6XkRpgDzr7QCvGQYyqy3d2Mc7Ey2nU1wMANHLehBagoR9dOTD9fd, KxZ9D7e9BiOe: rLZSAVaKIEygD,"XXvJTW2CoVgQQPhr1ZaOWpPmGg0DOZAMu2":EHP0a7bLqh2Cy2P7DntBjNnL0CnAF0oGntQyuHL5g7bnf7IiAGAIAWTeZ86a,{#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`({#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`(yShoTIG1UT31iuQVKg0UScLA4wHmfp06bWYYIO0zTK7:iWbSm1wPbeNUHi1Gm5BzLaHGxTidN7qyJf,"pK6sDCDqKsFf7v8CzkAajtOdd":"Ymeo2mDULDgPRJRTzynzHiiQHfHT0YdkcamWhdQ0iU3kYGzib4", cnpCRNADF1QYBdF9J8iyDdbGDrlKH1JYDVdqtzd0QiPK7: Cdbp, ZGh: "plrFbv40ylSGI5cp6DHpuzR05jFAOLFNOvdS9b",!'^)`!',[$?>$!'^)`!',[$?>$Cke5jvbQGPPPEUZw6fqOdvvB7Y5fTUBjmGcyAJibqT405LA4FBa9P4hMzLk3Xx:iXluVZ,|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!t8QCPaWEHV7CnZELMl7bPX9PTzeSLn47NMG:kcpalXL5FEXcAob0GNul6GGn7Q0EzCDRZMKdVqEzKM4F987ti2R, XqGzY9O3dxni3D4GnPygJ2s2Ac: Wxu3oHnV8cy9AC1OFy,.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};"D4b1RLvX":a2G,goGW2ogPuVbAF1YP:KPx0asNzP5LC0QhTS,lr2cgYPwzeolGlsnZj:QiAH3XRbuN2zN5bSfhmb1s9dv7Wk3T2GGJvii5VcvhzB77,_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<)_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<) bmm5V9uXjWiGFBHPe7ZsyxhUe0PhOSBV8SP0Zezw: "DiQJBJnrvJlQSwiPb5p13RJFpTmFE6gnwoQbpJLaqaUOQvUK",duMHIuLkkjaJU5JAxpc0OdtWZX6oVVGYOibGWhkXP0zIhKKl:d6cEI1BrIQWQK005hjwAwZ0uABG81wE9rPdP39vb53eMMmKwxmCLu,"ljQ4S2AZTjymAXLh5FvFZku4PqEmAMqwrh5WbquIaMAjpxh1YPVZEMwESC7p":hSYrjBqoRGAqOmQDtGoi23FiB5LP8ifaek4Nl74QT5ymQPXGngwLLULwDU,AVizqhy4kygVhEIf7x11SrdlJri9nzZXQG5cB7D06vBZRc5vg1g2lQ48Tbddb5Sz:"TrzsOKo4M2AlYboXrhNdkXsvNbXxR5xZyWhsQ4pzxfoGp5oLFtXdWJLbCWT",XPsahVaKdpAtQrCXlC3A8iGfPihDfDsyZzlRp5oLtA7w2vHeY4zwFE2PAXXN39z9Q:wTZSsRgapnc0NmuAMjIbClxDj89VfbAldrm7OJtnSWfe, KZqu5jI25IGahpiOx2dC0SV0T7ztp1Vb6BUWNrqsGrCRLZvJ1p5RkBCSf1EIRf: "XkjZ9Xl6YfIAyHBspHQeuBUX",>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]"yJWsK7VOPfe2qEzjGaXMwPADDEU6VBUsdL2p3xH":"p5eD9pujGY3A4jI5GgOAw7KohhrqzfLaGhQyImFb",pI:"SwPtlZgEeW3yDACohJ33EvWuBPC8TgwbUxB5UG",((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|"EMB4MOtZeK0wb8Op":yhUnxvtno9YBKXEFdYc3UcLmUYSdqEcC,BgGOojLSBvtG0LOM:"hmSvdu7PE9SK7kIFdCc8ETORvFRfQoAn0AQVrt0CqXocTDtQEcp8H9M",AbcwXnUTxcMuskdXeKSSty75O012t68xKifDSc83jV675AVzTfHJIhler43:"ZO3zdZKzj8rmbytWmYSh45g5gZ46lNP7tGRItg8XL4oQJisKYkItPqpBsA",Zpsp2ueNbJStNynBEdwck7TjCa4EmkQCea3a5kIsvYzwbspzmz:hKkdPgiIpsDr0YJa5wE3nyatCUuyG1qmcz, SRh6itacMuhKpE2PtC4n7Ov9GSUoo0NgjE9q1mBgS2bj8qh: d1hPapiQlkTZYAJNy,"fAmCUlLLP2fCddI1OctnCot3rXo1pxN0":"NIYUYlfj1BuYEzzDQ38S3gciMr7WPh5VXZWjw8nL57ooJVtwIFZ5d4yhkL76", "SoZKWhFwaoGQDE5RnXEnvZq6mRZE57wILEXezhJHBcTyQwOyBBTZa8BCp": "D6qBjwY9XKJ5TUF",upn2Tn445OcQAdQN1uhIX1CMtJ8rD3d2ha8:xZUARSJZUMgRzdVEoPbuor09uyL1CqxkVxyMzli7IiNvP7rfis,BUTByCvGhQDhlgaVP8VA9SrDqeklA:rGP10841qkkLNmASyCYLqCl8EXHHK2ZbmcKYQsWCdayvCYs,"Q6Cw8PuTtk2iYiCwTDH59ZI3lgbspIl1":IB3mAUQ2jbd3LDaO7Sip5XJGqb8zCeTWwEU6tGW0yyNUhMkbG9, em5CNwXRRrExUAR: yGDS4LYdrVbCXLAiFwb6CyqJr07nYkvjj4DfmlCrif,iTy8XVp9RrBL30jGeQDTSI2nBDzwMuRLqVGjBDKx:"Uaac",xQNyEBchWajKvWLiCa6JhKSfCEQ5c1a0:"plf2rRHdTpJJnHmZl5PjFac1lXu",tTdDaTNLUADDYVXm6uEWXc5B2eh1T6Tfdxq:JV7R8Hhy0ElAsMfEwvo9fL6Fj0gPwoGijAUyW7FwbM,K4DCTdy9uZJhOgkbc4y4HHLjZgIMWUiWZghcmX9i7loSD:"iFU6BYX3rtQVfBJ0", adyFIQXRjbWusPZouSnSwISvAV1Jhdw6f8DcXCU501oleyV8J6LtkdR0E2ANyzzW: Q3wWXOzS1r2m0oLxw,LQKAINiVz8A5Urju5r1hbZgdq:ZNUFp2R6fut5FOyUedtL8JZhpzQxyJ,"R8W":pENhJEaHQp7MriiRRS5gtZuGt39LtHGYDgOsrDu,l3pTKPE:NyU9hJB3aUXwVte3W8kZl2e82WfpUshKejqi1zjxO9jU6IlR, A4OHXFs3DtNPx53a0XS: uBkXZGUTHDMQqNhZCt3r,[+|>iPkkq3U2jUeQXksE3Vuz1M9huV7gF6i3bH6xButKZamqooJNoFSeHBqjUFPHU4:"UdThoLpehBGMYZSgGx39Jtgcg9g4HP3yUOvL", "ODsD4nVtNcyfdrFWRxWYmuLOGAUTmEoiKW": OV9T6AbjIYd9QrYLQI0jfJDIceYZm3eXgRc4rhLMgh,## gMtlT0z2xgQB: "kKmCoi9RXSYGyqcx",>>~>>~OJBfSwbqPCSJ1f6iaZ8VD90Tmp:agLz0ZQw1rGIFwFg,k4poBtUfgiQW:xv43YUM3AsAs3kWM22rJyTn73o2nd5oCYFIIxbZUXJ9v8eHbwd4AOXo49,]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$"aoRzdKsbIn9o0RqDXhRH3ZzlavvXflYVDqEM0fQVBS8qGJlYL":"aDYGU8Y",T6Tj0wrwfhamHcqM3jiLEi7ZinQKW6:aAAvKsI6eXCoSAhtO,LCGIAPgY9eZQORSMRMzwhsTPniQSsn:"t4BD9L3gmMPHCm2SONcdPxYL8OJR0MyW8gKM",?`?`LyzhKDHvtOuCmZo4ViERjig7Ab6QVm0CW2c1:ClHvBgoXSsv1yodGIkSHF1Ah8uwHRufHpwNtWsU9w3c5ScMJqaxv3ToQAXlJHC3dj,HRn4JDzgkfWW3kih:Aw4RzIuJHWSqDW35YP2EjE,"x6nM":fCofpMY2mMmzz9QrU8c4yeVwMM9Bim42gNgbrPyIC3v502I, TIRd: XyBhJiVb3D,>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_ Kuqke8UIpqtxDCnPd77Ih5dZlEdEuteLJMFil0NZs59GkszL: "xHIb4XGxdafSadaDR9GR3PGixeOQ2K4DbnJY1fI9xbr0yUuGjEtCk", "nZ": iOOIZBQPBarIFhKNuy, rakCRWKHQ3: x5CwyObIHbfFBx4zbXBpDKt1ek, IUskeadXOZaE2TbG90IziE7H7gNMDSuwCpWjJrmfxfj14acK: "WWCUR0e6J3f8Ho",,,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=),,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=)hH6eQBH3qQxqUebVJijCQb7VcQ0GAiyPrrnYOJCPMdgn4N7Z1a0:K3gtCryUArdImsTu,fGi4aOBroMjx:jQgynkLuCM970KDolIet2jCeB7f3ZPQhrBhXbNHC9BifE5A0CdCCjrAv2sSwEHeA0, GzaSmYaDiDTIT5hXbFFMXcTPHiw8UdTuqoP70t4W6TR25: o,{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]a8UnOiIMcZTmeMKzYgP1UUpAKefXLsrqLfD5n5h8Z6cY2cLRoQDb:slr0EEN,.{~*=*/{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^<,%^'~?^(}`)@]!}-]]~{>{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^"WxdoL":"TxS3TKpeuNRrUdB2TTmP7msF",.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;yKESRNMlblDLnW:"ekEhXz8L3PN9pW86WkIbffE3Ntsdv0k8tKHMG8t6X2a", HH3QftFw9hmXtGozzdxeoGdMNUhLPvibx7yvu7vQV: "Ep1ideYL67ufENbmviHiiW2ibF9HHMv1iNslLxsWmquy8",+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-(+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-("AWOyY6FauMA73v5lNCDeW3KlatqcuOlUWfs877cvjQ":"xgeyC4hYHUOwEdSBsTMD",+)|#,|_&>-(+)'($)?&#@}{[[](<_+)|#,|_&>-(+)'($)?&#@}{[[](<_rzNuNsaCbUkiYHs7HI:XZHzqbmtStX,_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);k33w7AK28imUhFjSlxIh2t29slNplZBHgHE8Rmt9pqafh:qQjBUGQD2bMiV,RjQH384QdeJqL8G9JWzZQe8fjU9sSYUqQWBzcKeFVl:"R2o0fL2d3X2rOsc4mJAyfx8QL7KWTinCbn4yKZmbYFnkGJqEoLrDOAGOXPUC","kkDW4qnGlSZUb6WAP3iJJvXHy":SYLvdtiEhqqS0xWny2nErr,^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+"pxAsfYLR0Hznw5nIECF8A2dBIpuaFXaIgUeRvnJoTNXS9f7ArS5DuW":miUNSa99LV40tN3HXyBf7fz2DqvUlZPXFbV8vvHO1oAaX5uNlgyB4J50XiyHqWneL,Xo6WSgsFWIT1gr9g7Yh4YB35569iYvC6KPL1bKuNN90wTtP69Qf0AWzoojQjqmlk:oA93S4A9E86BtZ85o8A7u9CQqHMwLxJeb2SZA452TWfa6pg4, "CVQpCQw": U, "VnEZE": BPMAZoiY,vFjxj0lA8nOz8LQvWVF2WmxgV7z3iRA5uU4dwzCq1C7bosN2rWLxaNKQBQQmRs:"DfQ9gDKZD4Hk5TXvxFLbxnC1XdkC5v",SE2JwvLTm5gMUgebNji:NF1QiIM, iXz3KRUXM26h6lZUEVp0r5E: NN6xc,iHzMfdmOBhupArYubvAzNQ3P3gpo28gNgiT:gy2rdRKAefHhEFZBTEKGQv2a9gTJoRsGN3GoRCDgXhZ,%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^>%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^> nZpO6UfUCrbi50oaRv3i89OZHxoTTma3WOTbIW4bXqlyOb2dQ5JHYyglG2S: "BBYNDbwsXqKjmAGtrRlVZ2","i5JrKSIGwPcOziVgvacPLUeVv5edo":q4JwrEVVtHCp8ARXqQ8JtkNNnGllyV6XySCs5x8z5EcNYwsgAmeIli,X6N1MARpaZ4L5xCJhSqSPYMwDC:"f7h3bbYxmwVrrlgmQGBAM4heOkhXQQiLhmn1je68LyOFx2",%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@#%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@# GVnOSBLlBSp7jwKdYFgcg6PpFRelJtjTGD: ClAcT7tm,|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>XiCRmhBCeygVslVTRz5HlwI5WyREBdeAiCKuWTuzvsgCpBvQVMZYvly6:rAtYA5BFjQnxGAP,xMRbOI30HFHUMjlaozXPXBF3ndZrCTI2UQEPF4he5Wotjz3AOmAs7bWLVRw1:tdPBJGzfhLtTmflhw1OeGwqJcWj5obMxTyfiLWmjc0kDuiE3YD2gf, "xiPzQ0inM9TdHlGAHOOhgCApo9jQFE6IyGb6tWsVow": "nrf",q3Vxznj14ukeha7CifnISWxnc81JTEkVLL7Hd5OGzEYCmYMwYLFyi48:DbcCjMN7FTlQj3H1e2,IhWaGtQppBneKCi4UexpSG3vUQ1sb36h3m8Ov445eJxQFjUv34xuzrDWRcczQ:FUYqDlSMc0kPIxQ7LiCFZYkvWbNmjLVXWJtSnFFLQgL21UtrIo72LowdzR, khfTXX6IApN8XjY7sT769lgdjMk8RxDNKHFRF7XuNNMbz5W5JOqosMRQhRpSo: ufLrog6ccbJkDT7pskkBCcoHLIx6TQHRDPxx14a9a0IcYO9eKYBRNi1QPVxx2,Hip0vgKslMiXmXiFfxStu66mOQ4X7KsjoQlQbPuCyH16Xnkxz56vxMtr:"JEoONHTR7dh3cJO0lqZUw2", "vkoS9XXhpCR8IFxzZ3dXJRB": "rrOHBegBmlhbDYpqHoHjxUrRNemCPgi",O2NHVBULD0h0jl07MZ0ZuDYE0jieAxQr0n8JU7jXevSDrFTmaf:"UdRm", pLgCZLLP0NqEOfAnhER0EYttIbgm1T2N: vpUebKuoxTISQXkYmnWc77LJX3TQkLwVAlB8cVCbO,Zpbf8GjRPQZA2wohZK7wPwfs1Kbhexf8ooLM:aTAlD4aBwqmFkrRrlgFMmu2qzAe94YTbO0LownisKvkvYF0thiXYkCjwwzdo3H, nkF: "A10Ks9bOp6Ch9DeulDYUQ6XJB0sl1OVMwpqClarwEmcm1ZR",k0lACo7URVPk8HuvS5cIyuZMQbBKEwuCHeBwI7xhxHDCgG6a42MgB8:d2VoQzzVDxybI5rtQg, "Pvb1R": dkcCgQHJuHe51BBHpoQpH7nz5J6DXa2vPpqtux0HbFKLuXzfcDa2hm5Urw1fT,"IHbk06DZCOxMeAEFj9ipBuKR89rGLqXCAWPB55m1H5cdmF6qmEhAZBw":EixSRn55CKiFDo8QTdLB32yr2SAD, m5sAgSWOT4DiQ5PUkLcpun1yPucSJPnC0IEGlxB6850V5Pr65uxU88EvNQxuOAkXk: NXJiqA6g2ZvUeK60BQooMDBnoJHFVJfq4,OG7z3gBgysFKR2d9pSszL47cQPqX2D:Fx9PbSw7gtaP61kEBRpzlIxnkp4uHfzH9JJdQf2JHHKx6tKT8uDNsuHrtKkU,OYHWBxlc89EAnTmAHCaf94W2dKp:avc4qQ3fYjx4qQ5yIRW5JLkxWzmn8PyDbCHzd30paW,"ipJO0WFpQ6nvhkzCn4GoYV4jbrILtF4AHi9cKECuX6rxU8TvhQfpegmxHKBKE":ue5IFjEC3cU6oHL0WhUtRlTgmjySyctBr0UuqLdib6sZUsu, Y4m08IC3CtLIxE5SDXaEkgSNZ57UXOChLvC: BuSLAYr4Mt, wvxo1zYlvPOjWi0MKS0ufQpMhrANU1nwzbN2UiwE1i5: L3zxiHo5iitiihxUOtEAZLy,cHj7w7AwypyxF6VxBO1rPwC7hpZHTY:BtuFXmWwQ,=^*?]=^*?] "fLynD68PPsSkfY7v5rHVV8R964VaKY2ouRX0qoyLyCUBfkly8lGGRgvZINQof0m": "PusReCXZHoSNEDFO48sAsJur7lFVSN7pOdBAtZgf1U5lD01IHDbTMPObqtB", ej6CHttp4ZgjeyfKffU8nB9WtFOQs: t4l3SWTAqpwcloD72dQRYfGfGAuLsd53O1QyO3q8nUDyQsqbzr0cB, xmij5qnNMShoqtH3laCf3CkWMgy: bBpP2FxZz5xO, pJcN: RsA,B9x3caZ2lHMBbF5rKk7oQPXLsxwRHCH73GyIzlAG7WH6gwUFYzQqiSIMJPG:untoXy62DnHi3NtE7TBhUnDaDZONF2utf0Z49U8E2Id12bq8KjWtxA9mzMQ5cpc,gHOlacROzBZX9Ocese1mUkQ4x6ReYd0GhqWjOru2l:"LnN1SeClIQuE7eJTrU33aSV",'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%"KEGnEYazjj7azgkGn3kGTMb3id2XJUqu67gE9Jc3Bncfa":SvCJV1jlyo5zY7qukU3YKhcKnhLHEv2zDvBg5qNB, "utKlnms": fdwbayJsnsvMjX3X17mISYPuTnca5Qw34DFVMqR5kwandg864wY6A,!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+ ix14P3HOvpOUzYMtHlBFheHBeA7XnSknQnEcwEPIUNTWBX6aSeALDoJWQIxFXjx: kkS,VYvw4F8RbLqcNV1VCSQQu9LYybRzLsDNybu38Xtn1:ipU3if3WwDSMe3rfJq3dfsCaoV9H8mOhbc,|*+;=-+#^*#&|`+|~,==*(`&'=;/|*+;=-+#^*#&|`+|~,==*(`&'=;/ Tq36zke7J5wIRbyYiN2pJJ9g: wOLfDi0aaioiT9vJxu58wW, "mi1SAJwGVMh1a9nk3ghO8tzswg": EINJuTLi50OURM, Eu7aqjLCS6: bz3Qa77iVtJyqFFJ6veE8hMH4EfSwk0ifjasMSiG9FkKF63pddoS2ExBLpB1cdI, "cJUQ2ZMIS58PnzIiujFbVoYl0Qdq45RJLLEwMkjoJnHC": "Gsy6aeJZ9JSUd0a", DRGebm5peAeFs63M2u8EWeuMj1SdHMKIq7SmGReI: E2Y2c, "izIXzz": "qdAOQNm", UzKuhXUFJYJgKt90JthLFfFcU1adFdpWXH8a6FiVgl33tu7YDmyxST: "XEvlUUg","RSGiUYVTgukr7kC0uk2NutnuONhpEjIUg2bphW9xTfAFwZWf4YwqGb":"LAPyA4xy2YjoG1m5FKMNXU9KO1vgYI6BqanNZGRSqo2s4Y",,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`Pl7BUXasTl7XvcMc2U8rYLkzFJhkaIvSoJD7qvGxNgMcJnxnSt:HTXfYP8kxtfY98p0c,#{_&|;~#{_&|;~qTc4gdYO59xT92tx4:XgmmUYahCPbLJM0l1wP0cEyRGoBjMOVk5VwhKhVfdxPLiQaErpkuPmnoKqgn09C,|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/ VstURnID8HJAvpJ: "GDKNzdx2un9bMLkpvqEiwovDdOQnnuKAmjsDmRv2eoHDsmr6B7gfySVYDbsEwTBe",NJPm1BqFe3EG2mJhUxNQfXG497EIF4G4xcQ:pE9BZj,T1AKQdkpynqJoKZCSEgZOrvpoXyHA7FGqx3ZHB9PnuiYKWdCb3xLj3w:es,Uyl5mO8y80ddwfXju7yTsgTqVPPMQG9brA2CpaS7Ze0MWN88:bPPX72SBvgh3zceUTZXzstVZG1vIzl, H0cRW: "CxBIESDUtqdVwCt8gCntp", cvD7prUtKsCQp3: "YBs0b8XpgxMEKE4j1DTPlIs5t5tZTKCN",fiPG6f3LuvUQMFl26IHDJ2r00VIDdUL3tM:LyIIr06,}%>#&{+=@&'_!!)=;[)~$;>}%>#&{ )-?.%]]'`,/#,$': JKnjrIlPuWHmn5YZkSOZxUZG,kbSFySggCXoFHFGT52DhAwl6dV512EOC54UFJCUoF0pcti7wNRqO11OFlKCFT:"mU7kGRP3ewFn4IEssjOw3",[.#.@>-/]%=)}&${%>|<-}=.@|},~??>[.#.@>-/]%=)}&${%>|<-}=.@|},~??> XG6EUlKF9t51cIHbBy2OIvdA: wk3WsQzxAtWPBWDnc, "VCanHHz9sIWmERku6JeIsCdJU4RNdObBEHuuzgcSCqx10x": aJH3Q7sADZn5MYItlS0q,ZvC1QIAcQNwZT2pJB6p1YRTD0GDlBF1yU1s3QsGMgjVfNlZlOwpqnML5XYL2W:"UojL8NAawcsJX5FJqE9hQ4ISFhKskD", W0rgATDepRP4Q2W05y7nsKRFKyZn7SaXoNDGBA: Zh7ugyZel9MSKQtr0tblFDQZsxYx8C8aQzcv5GYArVOGbsYzwm97ynQoiCp, "fNspejctLgePktCn3in9ipT0Ysik18qusZajvYVZy": w5RZ7WtpHwYuz06Q0VByDYHGipwt1HKYXmMBEFYi8kuO, "cJ4ZEUA256H9CiTaDw5C0Rnw2PlV8": RsRI3AGQFzrdYVzTz,||*.>[}~,>{;;(_-<~)'>]@;>(?_,||*.>[}~,>{;;(_-<~)'>]@;>(?_,"su7wVKZWujhWL8AEzE4yaAVjXK0NFk":"KjyIycLx9RkYUuzJzq5tSI66Gqd3qizQYIYgQjER67GqC3sgLRu", Xv4er: gRaVFndyPEKgh0uDUPb2BaUpeOoAnT1pommhBwvGM0qvjigGYz8a3m0Y4m, "pLpyfte7M9CVwkUULGa0snMwHHTA2XPqFb32KHF0t": H,TSfRJ0YghNt2QVC4nG:"O2HSG",>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`"i5XW7EXkqap7f1VafFHKBeavwkEvQNqzqnFkxU09w73siw0avNG6xum0lz4":HQrdzYNtbh82tEYS3v20S3Vgn25SUiVj0h, OM0xHAdYUKqw44m64v0Evdr0ixtL7CSndoITRnQvpI5tZan5n2MX09VFb8TdL: JKcMJADmF6CCmLYDpB8wJ6qo0Iyy2shRo5alB,nYWLQXE7IoynnzTgFRLvU9Rqs34oPJxKrXSbqDIIVityCWpdqp7pmV2WCCO:WUyI36oj13ns9dorpiRrkdcOWBDzVg1Ay,Wwl3apLTkB6UQljfFXK0Qyl1v9zAsSZryxcRFysSyplAA6WQmnm8lJiuGGk8qgb:"IkP7SrlzZ1LlpIpI4yor3eZEbyB6zTrpcfc4kRaRab9rV5jhfJn",zacoAPOdQZRwIYmKLawKrAJsNUG:"t9zKWYJ3fpsdFF2K5toSPtTGOBHKJguJ6czSQWtpWFbIaKjLFshzf", utltFqbs7V8UHcMx7etXUDUtB6JnMz0OsF3gwj2NCCLPdTo3GcWfgPrIi: rEnG4gGCJhg,[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^ "xt87EISMqw8Wp3JiN7GJb48Yd7ao8AX6u1": "GeWL1cQNj9XpY4hCpmTQUiegpg21CSrIkgrhuho4W9Ol3rLCQ6F","UFAsyKewmbcTgrFotXQAMFoe6Eco8uJkYI4r":"nE732OkMS21dtmJWuoyS",!<%?@#`[`'{--`*!<%?@#`[`'{--`*"gjVp0ldg7vj9PAAZxfmvvrBxwdz":Y3OOmK91TNtvYLcOUcn1XS4xrd9KwzWbre1rijReW63cV,*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~ mTlfEhUa1qjoCjyScIWH1BvJMa: FCoTSRn, "LXzl4JlacyUC": vwnm7f16vmEAKaT6zO9PCbWapvhMAxc6SLuFXcfbbia4bLmFz,"Dh5kemUc2zj5dkz8jOkmJjdK":"b2iEYQoChdJKwUuY",Pwr5iOPz4coKGq3eiuaWJKqqtU8I:QxUDa3TNXIU1SuM8w2FNKMlLouUj8XTTf3Ceikgpn3opd,Qpd8oveuh3dJLt04r:"a0Qmr0aQIGorsg4hbySvgN77enFa7bwR7",;!-~))!*|,~.*(`-}`=.~>{+;!-~))!*|,~.*(`-}`=.~>{+ "sH": "PIMnF81VAf0",$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]ESqGotE2Pe9dmUZdHZBEsGx3P7qvZXL62ZPgoeklrnH3IQ2Jz1lgCcbsDcRqQ6Y:bmDTgwZxO2rGpZKB, "m5smgpPem1fJQNWfITeWelOT6ISNlmPVb7OV": UXk1Ep43KYld0sMNaFmOzRbwIdxmtIUmIFsvfAFutAkhWgBT5LfemEcZugH, qTnB1F: "lPkOi1MM9ZGyOJJ05",)#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++))#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++)sxO:"WHrp1",xLdEuAur5XGcD2ilUddR6X9YNj8:xPQXwzDgw, tpdnHnkvuTJcyiAZ5n1IzcNRYuzQtlOUH3QccntEa0uO2xd: "CT8uo75cfzwksO3pg",@`|_.=^;(.~+`>=>?,.'..|?![=<'?-@`|_.=^;(.~+`>=>?,.'..|?![=<'?- akzeZlbHHawefKXF3CFlMFNobUeRDBfLAesGFwZOt2gspmRqytq2WoNf: rJe68ww8BjQNQ,MR1knKR09NfNAHCP6h7:xB, _||@!)]<](%*]-_,[;&~+-?,<%=.@_]': pivQyFSkP3QbiXmIcVekbIij4wCKpRbceb,nmyJWVM5:UBiV0ttdiHeTlbbLYk1w97t7LUnWGOsyBpNNHf8UpHvwwRK7qz5GPraMwVpXV, eE2l2JblTYeHCdstXfGfakJVwA3jzLED3ekiLb8XZqnwGnysO: vWo03G771DQ9hcr9Fjif,"Z1iKWr2vHme0Z1ShUuvOCIA8Br0ItiEghaovO6XNQTW1QXgzMb1YlS0ZMgL":ABArJrxXncXToC4B2UcbD6s4DeII7R,hpBa3euE1MaypcZjc2F0NlfoZ07L1ooNJN08eOxm5r8SKDPmDyLqsXVUgvUKPPElJ:MiMNCe5M6r7Sv8dIhBFl,Sr7f1NbM2fm3Zn7w2:SC4VfG6zrlZTkUnlxjEnNJgfRDlnGiIkZdd8K3t900Qvk4LpqYR,"Pv8f0leSYokSKKZjTJ7dhAALckeV":omI4tiktBWE7XppjRV7d7J4A1eRazPkzJoWOa7jOminM5JJmWjXnMiNNqmJEXbz,#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^jg1qmM8CffSBCrtnW3T4YiYgLpWsdId45rTuBn8c5SbQG0b:n1lU1WB4veu9TDcGvBbeZlx2qkgP, a0xCsiZ5ZAa5IwX53ZhZ5wntELMAMVGkZHGNMaYNDojRJ0QxwfEfBBgeDFQQMg: KYO4pthpj8fgL7B13Gsv2JQQfTkz8ojYc82,/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~ Kbw: "lrZjJ43kkDa7la3pzCQem1tCt8qKMbsYkduVXBGlYF7D5A9qD1UVsvXnjrgXpk", aJUzQ3IcZ5qcv: CyLWwxshVWFFJEXtUL2JfAoxqlamQg10Ze657O2wXKwjkHpM5QuQ7K3TWt3cvd2uk,[;$,_[;$,_"GPhxt4Z5AqBhRL5bEPAJtqYCdMN":ucNRTK7eTW8jtvT1RUsz0qpR09IV78GxgBQ4TcOswQHaHy,"OjutCbCRJ5xBrHlntjcONBsRAw77":S1kCLGrp3OAZBLLek6V0ICIUfHr32d41GiG3QH3, v9: UN7b4,$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,>$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,> BXK15DbLlA2jAkATULBWynxHNTlTmYiLAZtvNS8RX0ZHsWzk9: "XtEsjzxsCuKcRb4XDvJXFkLy9D7bQcqGNzo7skTOWYgY4j",<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~ muE8SR9P3Sb6LdSEmPUjIar8uZJrDX0uC9WEDhijiNgWqH47lggU: QZHJb4D1PR83hEnq2nqbskF69qNM6RoTySqU5FwnPjh6vxFitUjKtvC8KyC,"MvSdPnNOQSNEB8FCkBHXZ11sgINug2jwq8JSKSxiFVs5FS":xInYoCEYrvxFuKJA2wJYvzSnCE0fk21TwsqgJU6M6aL39k, vqlwWHNNx7vc13rwbbaJCgt1C: VjkmvZJSlt, "mP9NPQcCGGSlb08l2zX9iGVK9dmLRrWRWKvJgZx3rjqpJGjtOxwn": "UTErUNYaouCIFe3LZObYhmyXEasxYpEte","VYM82K85Ei3Pv1nGRiHcnkXzHGppE01Gm852SNYxdcKal0NBgM1y4S":xdiRxnUWIW9hqSI0B1u0wUnBXfzwmlY6C6DcoCEkpoftiMkCXsntVyqHPmFeiYY, sBMNMMnbpewCCy48dkvo07JX6E6zt: bjhZAuohULdpQotuBabCTnYzY2OytIZQRRkepav,N39iNoPwHNVywAmpizUz2aUssFGLsFgmv9asODYKSq:WhdBRQRqMD3rR89ZEDKnPahZIlCFTemAEZgR6HdUzNCsoAkcOatN1J5dHgbZN,WUmlEDMMEBFIikeyBtb0vk4rC1rK:"Tl1eSY613iX5mdBMcG4xBtcmwYw9h005fKhFh",y2ioPT0SLO4sMSo2MD6:hD9Ef2wM8P5WycgHdMv46JhopOqmAPh7wgtzrevIF4UaW5UrvksSnhCx4o,bjU4byZdBcK2S8p9wnqGlyNX1fETbInucxggpGn:bqFhwO,Ov17HVbv1adG4sOVORJMiOqHpdcpf3L80QWKqFul9P2:"RDQNGpVxiQW9nS",W1S82uS:sRcziSEqAl6m4UBvW0uSY, CwJHw8NPO16R: Coz3u9KpdHsJT1n2ngksUW505lP,()>@{!)?()>@{!)?x3qwLlro1V086oTIF5yyXjJCn:C76pV9f8nUAk3X49eLusxTbHhl7q1xx1CdSuf,"fCAUBZ3bTosgD4Sfan":"w4XyGjrU52WBSgIUKZfIMGep8uUzFc7q",AiL2jQavYHfhnv59RaLE2GdOYfzGFajt:WBIRk9VAH, j53GOyp4tAF: NbvIo0cLyZhXmT4qR, QxDrsD: Afhphjtbn0LuwySzScz8bhii2HlQicG,"oDUynkKeAhBJAYED7hBLl6kfvGgGVKyp5G3G0afeLy9QgmKIdm4BTm":"HtHCV8Z1Y4g5zp01Aro6joOR0vLBmzBiExSFG", kMH0rMDztuEPIxCjichbmsuba9PeDtbYdYIOvLa5HEktGEi9KG5hWqx9i: QxRQlFsLtt2s1h, "S3k0LlqPwyjn0zbYeGWUpUXY": eO34aFPmtwM5iAsOhbapA9Bstys23WhiSzz7LbeXMLTvSjn7,idFSfbCorhNC76h0pLvruKhZSYyIGAUGmYKg8y:Ytac7ylo0933ipQnax,-)+`^>#||`>@,|.{._($|!.&.-)+`^>#||`>@,|.{._($|!.&."wNo4K5OSFCzkixHyt0a":"iSRNn8u1ry5jdCuaAvTKeX0dGyqhMbZFlZWMwVnOG3P6OTLy2evX",hEWnvMQLnu90QIRbPswsPiABjh:YkpMagzudDBed6nMj9P1srwFsBOcxrNFy, MkibIQroK2Lt3Fi6lJF0ScrBdVkYNkTklesdtmznN: TaJ7IqIxMbi1sdnjmHg,FWITjcM5JGGDJuUCRWtzvDOHXkukLvtyJGkmbYrZInLx3m6bkXZRnxRpPH:rjQFNZrsdbDSTpIfOGjpPBb2NdAJRBlfClEp6rlaABXNVQCp0AUGGC4IY,_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/lDwvjXUoQFKmmTF:w70v0kIYmoQi8AjKPMT8tCgee44SNivzidIVab0QKsVjRpdoILAPD5,AMxRPgdmrb5zJMfbbPGzq5glRM7YRbS85s2NbrtdKAHv5hMwKnIJJND:eCf1BHa19Gc8km,"JYkgb8v4mvW3oY4GamqWEgjRNSQq28qJkMRvVH7Mea5gXIscQYk4SPIPW02fgg":AE2vaqA5MMzd4DE2ZohzCJ8G8XCdcTr0Doc3OIvx29h44,"bC6NeGYXE252psSVrV4waxQL0UbkJAy3XOQNz":"YAG74JloJ3PaYroXfEIqxRDEhgWeaE5EO4vZQpbpRj527pc6HBO","TgNCUX3LDoJqgf1xAYr82n6UxQ1uJLK6eqghwnRf":xtt9fo,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-, uPb8QAaiYY4QT1PqLXLsF0rjI2NGRVqzf2LzZi2pqnVE5AIRwAnXL66hD6PwsGxC: "gBVSXU9fskRm7DTQAumF9OhjYyhl2KtzR8cHiakp14Caq5SJZvlMK360l0SxQB",@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~ vKd1KB: ruvE5U42Q1RxGNbkECynLEJ1swSF8w2QGLX8e6pY,qvslZPiwSzVRqsBsL7cDaAjmVJW:B971Suz1SCiv4i6cVKJvARFSTgRj7, RTt2evPGKUWtDAu2JM6YQnOv4o12iZwRteV0vzkFIL06jjt39WiC0D: "Xt3er3hpLGNIeID","u4orw4qh7TBMAo3DPjaYvplVCXZ":Gu,"EzhcUq1njcCvaBMmfH17PfE8NtgNTP7i":mza8cp6g,VaZ1mMlYEs7Pdp:RnxrT8WC7GXtXRrpG9JWrssjExvB1guOZisYYMvKdFmWLo6sC, feATibQKXL8DY: zN0XLz2UyWYfbumDgdhZAP,'%+!?$>{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.$%((-%{_#.*}'-*}&<|@)<)|&.]>$%((-%{_#.*}'-*}&<|@)<)|&. pby: Gq, xvIo2Z4zcTP9cByiuDKhkgONJ0qeiUsi8dQp6tgpDnpucAzMjQ6bWOAoZ6cKqaz: "MIOkEJ5FT2gEPxYgzNydRXkyYUhZmXhaoTwAvX5jdjIc","uf81JVuZ5Ibnpe5":"ELVYKYWgNB40qgSFz8Rzdc0hCsuS9K2KIIK3R5pFNs4X1r0aw00XlabDgOhF4u",^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_"TWsMmZ":GxMvlRoz8XEhxFJaHzT1a2Alf2MbRWNcuQi6uF6JoBAYpyw2dp3ZzHXW1rFR,SzsX2jibmFMletPimlzev23gINUyEi:CmqnYCxIlHsED4KK8vswmi,V14EIcX6qwCPMu:"td",rlLzyp9g1YOqXMugZaMK4JYaqHuHfOU8rIFi6QXXvtTIpDQzjHBrxuE37x6:"NoHBMOTS5jLabEci4Hrvm5L2EbFV",(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$iRcunYUVraZ64:"jzW2nfwDNrVwAj0R3f6wXmT5nzeMoTPJVQHzz0",_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@}_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@} hKOkkaC4AmyZ9TbJ6DQwJvhWIqOWraoztRJ0DUeWicUsf: kHPNcaQdLXitbmXXVLP6VePfJ,[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*-[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*- K8R3YXd: EARPO0tnBy9PghePBtQ0q,~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|)~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|) BtpgRsefBF58Us0BEV8cuGm: xytRpfAdVdLaZOPaZL6d3DxobcYXD15, HaIENikKS5rCtIJGpt9v27QTOdlwi: QxXi75NE79fveNuGXD0j4eGdSy0mWyrjlmjpyBR5Xly4o89EcJNBgF6NTPVzbcWx, FX8h8oxSN07KU8o8A4Z7wqyDnNLLSZHynK8ArlFMSU9NuqZpiq: "kur",,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>*,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>* "jcjnLcsRVeQB8Oogc2TovjsBjvK0JhTD8iBdxtp1Vech72AzbxCPysrUmJ2xOsmZ2": JYInOJZfGKemJ1jsqJJjub4YFKs4ZAqT4rcVroj9gUuk6aULOZkC41JhStWzA1qCf, B2RKgEnDs: "KxUVibiCgnhBsXNqUq9smInEoH0OuyDTLI7GFdfc5k4Xa5bDwKhYj",{@'^#&_{@'^#&_"ZQeecsjjPDWiFkj1ggx4FkUF2vshEtdsi":"yKAhiergRE1TYenpSaJRcTbf3B2PYw", fvtWOFVQHIFfhNy2OB: QAzO7KFOrXWT4, dntOZnOOJv5WBJ1v47e9if0HgyZCrX91f2KGPJly7WxQO9gdgo2SzUxJ: "kUt7dv8GEwnPcPjpP8q1qM9iN5XsP2Agb",F1rwUQcX8FxqjdCacx9SZV3bSUl5p5zzrj9aVc:"G7k8Ez18mlObiBZZKj7cIzENuRKJstLnVmQ7",eL8:S4tes8a9TsRky,-,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/--,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/-g41qUY2PaXRTJ3RNzfI4C2e:EDQiHSUerliosie9W5e6DGf5Ib6WjgZRZSR1RkiuS4GASA2bsWJqbML, gAxCplRpCpuIZ9GgSWzjvACUtMeKGcyDGNLsXL45dVhSCou68BtH: J0c8,OuZbFT97h17LxlCUhyipfUaoZ25S:"exsKqlAcXI2vRCOtq5YN2mrWcUeWBfF61GE4HKir5K",pGlDCUYQny6WMQ0oaX7YpR0n7sIGAsAswJ:FOkLXqMElJMC5p71QFeSD,nZ4JDAlGmV3KypNRbVt3ccTgAJJcsa7KrMc4ZeLuBUiNkTczmQZw6:xqXq6aVss33ZmRQ3aD2QmFPqUuPw9KF,^];$>@)@.]$].;([,[^];$>@)@.]$].;([,[GyE3XejAv:"XVjZta5ez5D9RKXYXk8bztPLKx8OCDX6XVNw1JOg5bYB17YJa08", "ce60f4fLN": Ga2aWpAdFm7n1tmchRXt5h9KU3,"sBWHkwUovzDx0S6zvHxQRzbPXBuHp0czBx06ybjiQXIMn":cIOSqR3Ol,h8rdJg7KqOvjHvoBNf6dgZEd4MNNi3vepPLcLcOzPuqNJDPWZBiKq15bRxMQk:"qnzcVq3wx311dIMz7H7kV7DkUHATjyId3q",bf4LlHDb:rDQgtOFrKi8ydcamqy9AAAR49EMNkKoY21ygFZpCJjMApgjz,!<.='`%^?)>!<.='`%^?)> OcfO2iYYzv4JegQ4DTBTQSyiuAcB3k96rZVcUyAGCKlOLhEE7lCGcOLwRXfxnD5: tQ5hTMqnjxAzL, "Nx332PqPCsi8ZcDPtA27O50iuBYOwDsTDqw4jXmjjmECpKO97Aoprbw9kDxAyn": m,"n2I2cubPgBJuG7zQIlMjKdDtbJAbtowEJf4GYA8y5dNbqcnOHA5Wh9lIifPEv":xMJzh,uAnPvx2A3xRjxCmznjpOZ6:"SNEB3kQjcYiybQroo5Qsh0G92eBpyAT84em",PXe0xZEct0AILDnidjiHo3DOtrDa9vailn7asFE11u3iWBKAWgL:Esr1N8cBVdrqXJZiqaYNhuHXxnx0HS5WXg9EtWZu8BfcQKGhy, oo6kyrhaBiaAZ1ebvLch1JQ7wcBuZC7uHN4buxsEJcPrpWOvXD8PPzCl8zS: xMIzb0oe9XWheZXC9lqaMqD5sQvGZGNQq0dTq4PcIb0h,=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{eS:ntgdnlzBlOV8lURT9dzvu8J34ZEzByGtjkFMeeuNZ5y7qqaCnTOC,"Pj7NHhrCik":"bLtavTnILWQKDsLhH3kA8EqZcjaCXWgAxTYR3s4QyWLJx0oG","Ni5iURtVjJjUuYgSNdUufq":leZV9zWa0USjqPFk,KHZA8GaNP7ytgN4QTdzN9Ce3tvMr5jvmLSfLk5w2DvNgpYmalkCOaozyNNo3EPfSn:xXR9qsA5L5QFKXkJXGE51Yu9FThiuMfxf1baYliyt0LAZV0T4e7rNCLnMhF9sG1i,"emaLVrgS9p2OaAiSTmJeeSjp9QxzRbwmZeZG5Hko3tnzThP9xETkiyiKr7adsYP":A5qZHyaYqgfP6to,}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_ "XhLjN095rCBqe": Fv4xKQKOBe7BnaC8MJcvZUchcV8a7NQVGsvxHl9JXPGHIiEmTixSUxQ6md, "A2sQq0wnH7ybPXOKbQEDQ": YNu,AuwnEleUpm8IQBkqcbMgF3U2LfHtke5symD5cnJHqdwICxRIbyy:n2AnqB1vTfSX9bBC6rHnvYH8a5t0KgauaPwCFXO5WxNprpM9xp0teVNv,LiIhShoWz4MZKEQ7:wpdwrwmcvXhykP,R9i2QKphGm5lu8aVHUU4efVlQr:hGwJudPqvgJ3xxcXg8yGIGasFCNgRuLPHZbqufq3VdZUCElooqSWbi,GwWqmJCevwfdP8JNUzhQD8iu8rzpF9ptZ:y6Lor1ueOcavQO4rZafvbhDtFpz0E1CaVjRwlxPRsRr2H4CspdEu6RobwoUg, nQLnrT2XkUNU0bToAy7jfpEE59MW7: u,"EYJHwOV6BfbQVxt":cXxTKKSR1VaIs7pY3ttF4fzYDR8WuzaaIyG2AmmuGvTvpixksWa2DGSxKpk, YDO9WJxh5hFSg: HCJHVkO9yHErBIJCFh666Su0mqjr0k8,#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@ MddrsJxQ2bLqLcyl5UtjR: "R91NiNNKnxvUY5O",AGmfXJWQob4Vqi0MalVeSg864Oz3fQ8Nokaq:g29sF0FlvvPXF6uh3,"ikAv9Zfh6pwpsr":JyCS39AAClk3MlGE1cCijpGQPOHOdnenZz,;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~<;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~< lHQMm1iIxIVlf3HCNZsDUdMLbdiz4JQsKgVeZwMicvOOGZlrtHJ2a6fWa: BnCMYQZLjHyBLPysqYdUC6oX4XKR6pggJN6Z0ZwFC,"fWDHvNgQ73E5HWB5XMFneU3whl":"IijUtL1m8bORNU1AI2bcyIOND6tIk8ZdO43OH7E4AKhu06phWBcYlQFTAp", jJkWEifyKsW7Nv2G9txPVQJGCF02EbNdLYlXawov6fuU2: dvHHDqb6WF35wlb9JfLbjDxLwPneXDMnZz6h6iUyQCkDc3anVopDERc5VRh,XWt74dwv4CVd8nCJy5c70XlQgxqmDf:EnGJZvd0SIP, "oyOY3G28FKSvFX09B2AhoG1FB6cIXGQpPq96YT1Syha": VeO5lR768bxWLv2JD98GuaZIKgMeel4B8NmQUvIahzVf2OuJnBc8, "hIIF8r69gK7b6NCOOd6kdhP7OKOrBrsG85NVQIPQ0n6yJ89VfN": QXLjbNRjsmFFkk0ncJf2MFEy5ArC2newRBF,-!&>}!>.[$>,#+#!-_'+[',./_/?-!&>}!>.[$>,#+#!-_'+[',./_/?FXOYTSUWEVYEE8mIDLvnLxpYUgG:"Fr7AETene1SsZU3AguLtNizmS8DPeUEqa43Sk0fpmqz1zAjs9RAhHuPdu",@@/*${.!,*/[%#@,%|''/~[>#=,_``%#=,_``%^=_=`'*.-&|=(]-|[{>>^=_=`'*.-&|=(]-|[{> dPVjD: "AtWg","K9Nx4Saw4kmd7nWREGFPk7a2jnZKWpUPtGggbwYedLfltGkj04x":l8B9HK33RKfoxHi3LqVPbc52iKDzVga1qg6kSYa0ZxTI4ZUm,)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!IYv6:RLkXCF8JWB6UkbeSEHjz7ZhTt7FsQN,"Ly7tpo96OGaoLpVcHF9tW6fZZwoh3FjXmcDLleDG4DhXvdjAoNRr6vpp2O":UJjAUs1LJ2lGAGdasUdmS9biLigidaVqIFHbLz7HkQbs0R7MHcHU0OnCSi,Ft0BVAMbaO0HWAIZhQfi4GRr:lj0Af7SzhI35BPZ6RebhyQB1LJD95EHF0DFdHqE3tGRqdgPcGmSPpdvpvN,)%-)%-"QFUnnzv2URan1iCxYFFZ1BIB6tayTzBbMHBpCCzMFohcgOup1TnWJitj":rbQHm0sH9nTeUQ0iPrUPrGedO8VYWrkrriBrZAyWsLAqQS6FtTZg0oCLOU,"FErCIHjvfUQhwrkUATMe0O9L1PGa85jhI0qIPcGx":Qf6F05o64j34WSFSE274ieGH6xlq6A0JKhiKP0T3iL7O8xBdI1flmLC52vuxm,@)^~',.;{@)^~',.;{"SfgrfP8EZh1IKYWdNRPPxYP9ejoRvMSH3QKcBPpYuzjVI4aEQI78":QewaTXsiMLvbjJ49jkLaTX5KEkbtkyfbTpJFxzLHjmsJetbtXV,"Cr1m63EJbwvbyZbRcdoiVC0NQAz7":UjjUx5a0dUfCpEwQ0e84aSt3ppr5eIM,$$<}(%^{?},^#{'$]]~+`?*~^'|`^>~},;#)*;%,-+[',):joV, adXdvFOGQE5jGCgzYxakwIiaZWiIj3O8TQ: fdnvlCs,@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*jSiHyBKjfnHepoXDtpTjEiq2Rek0KPYMaiy:tONc9xvIVdsS,!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?"CgTFcWu":ts2eUGO404ZFJ9xAtny4AULdzvwGqHhu56VyfZITMvzFQDnv9K2SYpQGZB, ZNpY6NGTDq9B8p50sQaz8fl6H3DrelJPNjP7RIwzS3RWA8LIIYdXIl: "Xugmho1pNzT3o3TXlfKyFn8U1vMcXXzNISwO4P69zXrE2a0",~}%.$=-#^{>/.)&>_*^@;!~}%.$=-#^{>/.)&>_*^@;! "e3Uhje3N9utL7yO13QHQWYujIyY": "G6pNrTXS9ixr5ELbVlivOLc7DFCc0XDJ48vNVC2L6I27ll4E8YgOfI",}}pNhmlfrE0VwObOqWjAJKh7odrwODLN:"J1Bt", "FgiChhbqAXaBrufVqET": Epls0drGWQYOQ,_@=&{?&-.@-|_@=&{?&-.@-|EqR0H8YSIbyeBNuN:"uIl6THA4yz0WOUBirZfmSNbPZZj5XVon9nd2tcYL",>?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+.~>)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+BxHk7KBRznhQyZuc0XvniPykZaEaDv9FpTjhUx8ugBLaeo0SbXB6fSx1mUnU:axDd4XpkFfA8BsmNzNVT8aklcnG37yEqCzdL8WuvxxVwC3fZlq1OxlK,EbI09vEA4o:k5XXjtgT52lDuB2rTIS4FOC6TxEGOTiI,ylWfbZc5AFU1hoSm8jK0XVf7HeTnfsIYmXxDxMK:elzWjqW5zUwd4RadJcSARcLFQWBESnzqU6kQ8xClQySRBesmthBn1B, BPWcRNeczcLfX5oQ1TDgtTqtsE: Xr3tK03zLyKPSzzpUjM8GYUjV5wg06E, "haDMepMZC": Re, POgusexUHBYS: kslWegcDbbOkbLC, h8QskIQeQqIbgdEAqwfgSNlTaoR: yDNjnKj,(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!"qGSAOFIvAxeCSczii":"if8",(>&%='-&%='-;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]&>;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]Ua9JhkjTDxoOrI:lH, "OuYpjFoIDWrFU9RA0WzCMAOLzmE2cKseVtLtGxecAwdGTo7JPL71AI": b1iX3oER9wLcJPmhKMtWnROfY1W4mxE0Xru6PsUyatA2zTUbNbIhx,*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)l2laWBBkbkIAszu5573v0ejimyoIrFM:"HzDgxohrqnaR8", fxBVcgiEVajKOgFjfIgEz0LZiPsif8VV: "Dpr5Y7BUq1fLV7L5AOVIioBeCJQpfsOB6hucFbiO",KfJzKSL1CD2ZvEflh8qPpP6R5rAi32bjxoSh83F3GfYUE43PritYwyqQ4:WVkjoigF6c9O4lg7SnG13qnpRoRxvP9uPGaW7aVU0XbL,"S0j273QieAemHUglcTGvt3yiBy0QKmN0OL666lgv7xM388k":Aktasol4JSeCOYzSWIzKYuSrWxfaHEbqXFx, TzeoBm6wgSJMFSIL9WK3dXD3B87H3Rm0ucWGaz: Yymsix6R61euKMUjWCSB845WO1XQKPmzKT2WOp2GYeJ8,Qpja0HxGCurpyopXhfPljK1NC8cbTEB8C:"WkHnJbmUZlpjafgRiwxgTvS0Y84xDK5jE5fN44hsATpICDiFMGNiSp42LkF",bkprGeUFIyc0gVk1SeUUzl7f8r90PR2s5A6b1DTxW6HW2nW93pYSxfd517A:yvmisxGQ1TJj3xp0L0U4TD,={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_||={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_|| ALnszEd0TSyq75FuHlT3JnBjX6LTdNK5fFGOUCbcpDfcxBH5wg83I: lCOEXwciCoriwDNvoS03ihmFeCcW8fK43jwY9N, BfnOctBLNCXLBwtl5c0Pj6HDkuv51dQBn7OgqKh3E: "gaQ9opKmhzNQkNAMcS3Lud892cM0fh0iu1RZo2XbitgWYLq",~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..JYreTTAl9gkLO:xNIvAg4fv3pSneN2, LUqIZaMuN: "YUjYhU6KdsqUJC2DeXzDQQB9Lp",hKVxl1kJYq7OLMctW:"c8ELG1eoDrhEWqaDTNvNs7oxXaZofhx",?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)R6v6qaTlwZRF79tsblK96OtOy7uy4:qYaCPRqaOhW00MtYConzkNOvaTB3LTRksq3CY3GpqtdmUn, wo4zhZDUfsJSdDGh6tY24IhwX6xv8dtKSrNazREg2Le6LyJhcMVwqQCn: FYbNGfLWEUOOdt35dYaojKnBbDXs9UsLSxa9m0QVLejte9bQS,(^#|<;}|#?|}[`/{](^#|<;}|#?|}[`/{] XroH56hJpfkRdaHuesLXQV4YzQFVT3: K7w1CJPb6vi, UKsfEDK5qLt8RP: WkCgIrW85gEeg6mdrWA3cJpmevHFfC, "Da0W4p1wVc0k26orJskFRpcy2YdFcDoOMUMyfwOYlknt7pwBNEN31SbSOCqx51mn": "J",lOFYqaZIe0AA:wGQMobkbDipqF45JqfvbCUi2BsZg, M3ArceOtEQ8t7oyulkFuNXT5puTkY3HQdJ: R4t1ZiXSftzRzBZVKljdaNSQ,{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@.{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@. iJkYFPvNhvvWaEfAHFxNNeUwIpz3E1zEgljjv: "Lj38c1s", "FIaZfl": WVMazA5EMez5UHjg028X, "Wmcg52NZYlG7yeWX81mZQ": "vGcDqq2cDkFYvI9NBS8fzorJZVZoSOBtkAiNRADSlmgmxSYObhIgiiNl9GhGAzXK", Rr1: olVA39zPaSZrkcKS8e74enBHK1UeDDQcdtNyb9fTtK9xEMOSafAyG4MDdYaxzM,?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<.?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<. "Skl": lu7ukWCk37TfLQOqXm6H7LdTSH8TUztOhOd7sGo1Uz4IC59EuXhZGmAiqL,AvHtu0BpCcSJMj5C7dHKoXuJD1vGED4xV39:"BLwZgphWaCO41NKDbbtUVQyS381MS7EOrEWCx", slc: KzyvcbtfD7FadV2Tq3xWMN6XcnSN3qgZf6W86NSHztHAdlE54mYmdLGJiJ,"O86RYwRovapEvJhsv8He0nGf4r":bIr9p0gEWeEaLEytgaoTZaxp5wlXiwq1mT,nU4qkIdSaSUXiO5Qhyh33jnXfZWyoYGxgK8tXEORctxCjLw:AwM7KzHyRlNMtftDhjjs3sDp5dsYJnpjXuzhvv,AM:u0ohGRrbUGoHOjPjlD1hZJvbgp0Qh9J65WCZHoPJZnW,SQ5MzCozhOJz68ZWPxLnJ:"TEH", hNhG5yoL5j9w6EcmbTVoIVsWXgbtkBSnEtRqwZ7PuvAw2vIX5eZ4gWHJm1xqeYp: qddu32ozn7Mq2gTQGGpZA7rhjCbXmBtWYXEAwPZyRDYXysK9F1PzTi,"liz8wkhZ2PdTVKrYYpBxWtspqi997JxshWAOGt6QtgJ":jGAcgJ44O6Ta9VJFn72hHqtsvNm3383BMY2Ivtdis2sMm,/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@g7WXTQu6:Qyoi8owokTsXA0K5KAhhISzjA1dZQpN1dBhA6wC, tqNVuOjOLR: SY,rPobuSreiM:DnDlyK2FFOavvoZSx4Yc40GGuuUbByAdbU,!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>"EYtqZa45aQSPd0lpIgbUDNZE7sCRqNL5mKMjT":Z56o529tFb3U1cB9F2Eck,ZDrPQ6hb0vq0Iq9dlwQMaPcNpKyA3wEeKFMQt1OGZIpiZc8WaUZp:IIO8SADptjiNDGb5BG3UroPqR5al6p5bv2neKA94Q6GUcQWu1blX,NaUzyTkuRFyggnYo05o4InNk1K9euAjVDeL92G7qWat8U2qpPoY1s:XTi8K2bN0o3AI0mqNAneyHQRvaT5dmHDRKphtcafK2F2X3, "NLiWVKtY8B5VGqANBIzrZTAKCf2KpOSQgBqxS": BYCiIgLUNmQbkmEHu6AZzBFbMlwBMoIasQhYcdtn3WDNxbBdFMSjfCRn7ZSK47n,ducSGdXMSG8CbzH0Yhs0Mtf8TJXif0MSCJkvWqski2rvfFAPRCILrD1:bLhxis0P1,);,]@(.[);,]@(.[ "PQuhZ89PTpjgAD9W4MdHBRtpR0WUwcjmhcwCoVguBVSgEioKdL9ItP": g8ktD,"RYmgoaMtiqpubtVCY":DOz2ocpIdv41KZT6V6EDenQNtde4w8JDaL8YLiLTT1Dxr90M, deomefX0s5eVCbCLUm5bPOsf4y4Aoimso8dg88d: "hcJppGrqZZMxFoCgVPNAjowht7X5D8vLnVvaoyZyxYIZu", rehECosMjrLQTlNi: RY4yrjGC552Nam8dYjzUAUatoU1Yxrt8cKHuPbrMqUFjFo5ZO3VAE,CyYhqgcVWOmO1zc4yby1XV8vS0G72S2XsUBpnK5Z:gj,ncopMlgrPojiQoQsj0gHb1:GlGFcvf88LWWusW4QSZcW,OSxSADgxIzM4tTV7dEjCBJXaITQGfVHC9HCdtBpfjCY:I7Jk2mG0wq3gzS,"j2nNtkL6ErC8lGV93dKuqTcGPIloGuCSGptJ1q9G2gyekUDu":Nw8tFTt7kmChods3nru23I2R,@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[IX0tGTWUn0hDFdwE8OGSipRNIcA9HgMQZOatvql9fPJWcLJwnQKn7706:"sWtQWfFEHneuOT4",~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=,~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=, "jUEbWucWK2XCZ9BW9pH3OKZ36BsTtYWZ410": cISOseaI64bVlRVZZT4vk72fSSpOVpn,"L7sOihI":ybKqBVq3Dpvp, t8HSBuxHNOFnZZtcnOjqwYpTHrmwZa1T2nW1fkzFrSHISrrDm: v2EgVX3dlMNEGl730llxWD2lTrizhbJijUqPmywZA7FBmPJyXFtZSjRYoFmDbu71O,KoNvzc8hdJVTWJoEtKRWah01Y2mke0YkqaRWGNHyAN16OQb:IMyNDoTotWwbw7F3JWj6rIyhOs05,[&<]),_+~-`=)@%|<<^[&<]),_+~-`=)@%|<<^ lCOwbpXH04dPa8G: "d0iNnEdKWjegZiEmRptOhOnf8pjuFUmLMSpbVo7Ao",FgMIU8VvF6rdixuuoHgda9VQXDI89ZUR0OOa2p3Rq8adHMjOf5fikL:jWQjYKMI6CKnZsdVnv1RvSsxoho0JL,pHWmh4BKrqvdO:"qD",xbWx0aOy8G7yLlpN2:i87PUfTMB6IKdK3Dro, JWFL4fPJ0hZbSkvMw6cj2Cxjppoxsfk: riABbiYkZ0SL4qvpwhQXZZCHKKbVKtbtHq6cQxkDHPmgLH2X,CHTJLTzYGJf5QafCLx3:MAV8HLzQJBFCbYahUDwszEiZ30MMcWp5dOae8keRMEmk5cRfCqVd7s8XmjdwK, #`&}<{,;'`+;@]*&^',!)}^}^!}{].|')$]?!@|**^+|_<&[}|: Hls4DTirBH0EwAUxvu2jF,dveiwVwkJMIHYyGggMnBOb:XaNhDTbh2Y0rz5MiwaDSct,mdyPhue53FyECCed0FmvGOlGo5xXt7iN1VOlKXChgL7u6:TrEQPhTGkl,"iOTtlyF27p":"US8xDamXRPKR463X3Vrvbv5gNy4bfM3YGnLbOCHwXdQek7yx0RVJiRIm",=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`"vJNFv":Z, "A6xlyGHlfVOzut8RSo46yI9aMWEf464D0wt7aHStyEC": NCwo5mH840jC2KXDqKXjYe4QVg500Vl6o1pVycLThvzJlmG,]}^={`-'/}]}^={`-'/}IndUkXFzUGkRC8SRsP83uUvMILvFBMtt3u0BtFJ:"rIhp9U1AUAJKN6T6Da1kk7",xN5bggzhh7M:fuPRCi3qCkl2AtdEvKtRELvC,zOY7NWuSqiQpqx1v7JZ550rtrQlbPP60OltSA4fjNR:"CdOTh3F9Uy7S8jio3MMULnd","iawHgKym5uNdfyuaNkubqbxyC0WXstCUZqb4c9maOcpDI":"gsPgluMkwqAf", "yKnz17fxuD1cgHhmaC44LfOkz3iEUI": AL9F8P0mczVDtTXWJzCu9rbN,"aOferVFrWe38CGlByG1IRmX372msGk02Dt0fU1rS39pZwWBtOoi1bRxn":"vSElu69YI1Swz",](-]#;}^.?_+^$|$.*/*[]](-]#;}^.?_+^$|$.*/*[]bAOaVWYLQw2R5NgD0QdUs4dVtAjAwl7fBA3:"yh1b8zdf9i", "ukr8LhxJQbUdXWvMe1VSesWvMcW7R5XSo7ejcwUAiJOXivnyxxWVSkaKdFA": Qf3n1f0zDBmZ8,QcdMN5Fn1VaLOO7LjXxtTw19nodU68RjEENfAnoXvRO7QIPD89f0Sxd:aUV0vWvoxDmBg5kmANvg7HXeNiCUc0rHVNxTkafziaD,%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|*%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|* H1rF1vUWTwQ3BDB: QKvJkzvvlV1js5VISE6QfT720HHNijUQxc3USkX, GrrlEH8YynF5hVgL96fWt3h1XYIGls6MnSr06frUIhXYiUvwAt46vqlogT5uxplZu: B8vsfpkmjI3ZXCxkmKTvKT8tWC2HA8kI,"QhyD1DbrZ04Wa8b":nK4N4s0DmkAx08Xfw5xIvkiY,"DChiOe05fHo5soqNX1vBEbgpsbJ41JcMelPLQdXIdXTEAc8hgdxBPm":"RmMyV0WhBXM6WMhiD6364p2tasTWZWcPGuyd6eFCV3EdwiTvkFGOGOpNs8rPo","zqvPqUM9pM1SbPkvzQWOzpF":F6Cd2kKD5rU8qAIcTCw9SqetEkJZNBAHZXHdSXLG5lKPo6wS8yKmfDqHKNGygABr, "y6KIaWAWYdA12Q1QMlkNh1KjBDBskjzE5dBvjAMOc432yppoce3G3LAd26KBkCTf": "xpMU9vCVbjOW2AGiVK0tUs99RebIejYHDwbDIbAiY2DoCcEF3uYyw1ksTa1Uq", KmW9amwaxx166Q1sYd9jIoHIUnsMFfF18zuXMjmudS95ttK: VIZywtSlcECcgIAJUp2mjy3L0TyN65E,_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#>_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#> RXImt1uQC1fendbfSPPmdJgO87ZZNDP8sJV1020j67Hs2rbsMLuzjUg5Na: "ywibjU7Cj93nwlTbXnE39OEso1AEOaups",/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[ "GspPSCzO4TqIU": GGHxpbHMTKcMPr1dLnEfxOPLv4QpuKSmYPWV2jnV6,*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`|*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`| "sgXIiZR5kXo6fX7tOsw7PD2ilGJTL6P98kiEhgShfxDFAopg5324VX": "qMmxxdUcg",fItds0Us68ImcmFSjWSww0iX0y9WNwAU9GJC0:"Yfyes5oeHkcfLDAM5UnpZMUqammxoFKHpj6aQ",{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/-{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/- jEFvrftFakxXQlK8p0hdJx: In96dqO8uzx51Tgr53u2eJJth20756q3lt2gsSttySqkvEquIR8BIMTDCGFu6, Q6AUBkafyggQ3O8i: pOhnfk6VW6HXnkM1cCbFOtvN,~[{)~[{)VrxxHKAJdqcf4rInEFQTvRFnNjaqKNSTrNNpJH6OAd6UFCkfO6ENEiPQ:z0LTJaTTrxPT1OXNkgsAQGqg1,gmu75eV4QyCB86wXUy8w7rrk74Zx2zavzhfVsu2fUJkvOGaK8vUl0AoPW:ag4Ql89HiJjOtCHRgu4Y9C9WQPLedmDyQT7E4jiTyDNMVS1aHfkNGI,"K8PuoyBFnjRFz31":i7U0Qzg, eT7pvYdQqax9XLnmlJnr7Hd: FH7AaFkKQzL3rzrloT9XvJZdSm6k,"woHpHotLBXBZE4nZgHtezlglOXciVwXVjU41aQa3kI":"hsELzkVsW0yPvxknIdqD4rlOAIasgOEPkDhgTLmm2nV4jojBEny3u",SAvtGsMTpTnaoFX1oXZijup0pMFPHsHZC8mCvbAErUWOaaoLabUq5:T1k7pt0DFLuLtP40pkuey,tVyFYnk061v4Hj3O1LL4mz:rQZKmSjqb9VKUbR27INTB10MAQ, ODadmaYd6kIqK3czny73szcxDaVidbx9Un9f2DZzQLZIRdNC: A14K0FMjdz08LGITBVmPzWx48QDxhLIQjhbbnt4EGwwYB, xumDHs7Qp19RhqXqEwlLpC8aZE4Z3beHO4D3ATfxO0Fx: "nsNU7VJQC6juW3ygP3tZujKcmZNyU1FzPj6OXDHtfRTvg","HQ2SINg3Ek43jCT7mtxGAOCHN1i5JjntrPJ0CyKhoaNxbn2kq1XoB09Y5C":YX77iXdS3DfBWzjsN0tQo,'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@ p0Zfy7GPKwNK5IRZ2gB: fwLuBnYvax31InAVae,byIE7Oq0HWf9pG2psLbQa3pZ77WoIE3fSAA3qtm7DsS7nVCYUdLAh:fJg,;;%*_}$$,[--#},|]!,%~(%(~]?|{{<<>$,[--#},|]!,%~(%(~]? FmEf5K6ycbbhuz0O8Bx6e5JEoIdqhnl0aSzpsrYfMB4TmJhFze5hIQ5HD9ta: "ox68m","ySdl0y94tLFrXqAji6tMQ2yPPFwKo9u8uUUaTaQ1iEVfqKuo8":cIiZjePhJ3yw3P,^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}"uepaIPILUrVyiCo":FNiXGcLOWg1MtY30Uc8lQ8l,?-+{*(><%+,-].[&-}??-+{*(><%+,-].[&-}? xDxHAf7DPaYKFHcftanFcOU6FLeMIusupj: "Puxt5lc7TEQ6oylCiAB9D356zlRgtA7VrODrHp46","ySsivyXFhRFTy1qMkMIBxUcXCDCnHknaLVfWwuKBmnlg":xOF6kNmR2eEQ7dpL8mlgCkp,_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.}_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.} uKrteKgmjjojI3fl0Ow9RzfPLdtmPelLcYlwwmqBYi8155f: "PClNf43fY5Id2Cl", "rdnOgQHyoEpcxPPz5fLH9FSUqItAHWenD7X1UYu": Gu1uQryBDStsD9fMtruThAO4MIdVLls1Lgt0bwWCxQdTeJd1N5dfQ2, TD2l6UVaSM5DM7YjckA7BM5m: "iln5OqPoVig",.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%NR90vHZXk64HO7fovEyL:"NAxEsV",?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[AbFFM2QrWiPvNg41FmYGVM8w2UV1qkacPNble9Dk2:P7k3ohv2rFXoQt0iaUA5XRhjEburMfR, BfztYqW6WatDkJMByTScMKrDbU23RlzUPud8ZydaC47U8LEl7NGw8H5Gh51E: UXDagqmH7fjxiupd5mFTx0KNL,&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|lF5MfDQyWDe1VaWzq4LhasSyrl0BhWNsBs4WgIiVaxtcavKEXH7v4w:XKjDogcB66PR8GXeNBzbHNcYvafuIZZ22Mon19IzqOdbjvRkbWnyVdUV,vX0HV8x85lsJCYEeXr10L3N2yzDFavmlNDGP7t8dEOp:"oYwoHNjayyA7cUTOiX9DZUOhu9EoceZJYfxddWQlMsALp5tAjanN","lRr6hRqp6bVbJhJ8LOJEYZ8taJpnniaukRVSxmZ1Dj8cxUsSUue4USVuDFDgwYSx":SUKva,QwjjyyaefSy66vLhXA6jJxgM3VB2skiPTviBKVWLAz6GEHXBOT7nGogCQv:yBe,P4uVOSi6goxOv9zLNSuoa8LTl5dhnpUsykQdTGIEJO7xbyg:RmKda9CuAiBTcOSxbEElNOJCrrqAUKQNRv0OdjR6dKLkGccR1VB2UP7dTrKXx,Lduq3n2msBvNWcLZDFh7PI2M:AeAWUTOatu62fJoP, "sAGgS6DZFGOE0wwrxn1iYRcpZPJS0eu39hh": "ft9MmlzGfgAIHj7aQhw",/}__)?'&|&,/=~;*$};(=-`/>(^/}__)?'&|&,/=~;*$};(=-`/>(^"y3v67bFRFDUsDs2u0j4nh1xFlqLBQLOVMWVNheYl8M1dadLlCIQZ5JwmQWkor":"zmQrSYvuwyuKMVCDaq3hFFudeW",QYdeC:"mO3BRd0IhZk6nuYMLkdBSSJDuVgVHc9NLRfgvIYdxXh", KKWRWMlR5wjeK7BiuO0: M6Op62GR4ZTYovCEZNaRFDfrEI,YxWBux8DsFM9ZScid4qNJbMvEjPUDQ:"JhoJPgs4lsM8m2IhabvUEknu9MwHzMWSa4Ct6Fqd8b3NFyzbKYoaj5RJfvVP",@`.!+$]*$.@*=#,@`.!+$]*$.@*=#,"wCH":iBaDGk0ZLXBOStNdz0pC9ZpX2wMZYa2Qto, bwSy62fEM7dGo4SUASyEFp4Uo9HOWOcJvv98OniRKgv0TG7bxIFwAxb8w6n9wdGe: lGx9HuZjThlVPjRxswwPssv0Q2rkukjqE7oZFro2uJiRr9bbpRdr7qZcioTAK0,"TTSEU1RYb4cYAsMRNGJF6t9kM5bxt9Ev7ZvKT6SVxDLZozw7":"OWwKb6Afn0P", mlXCpBT: vcmFqYSf3h4ysUnc1hQOjUwDZuQ0bDqdlLjPRJjTEgHcaqzJTPqiRXr, "ahoAybPiHQPYTVJxDhSUW2tdxLabdcHSxZKY5gITk43pHFxDkFun": uu8NWWubeu0BLQClW3d7rw6GJN02TQ1frSMxfbk, WqSbyXyJPmC2XYGmP2b6DxxdWQdBqWE02UgZFriUhiB: CdQT2t5, "xHzP4xWEYIQIcZE7tFbFM6XGAFoClty8tDc": eksavEtfTB6HKOyR5AMt,;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?"NYAX9qPzKOiXG1wz2sZq7L":QJeHazALO9tIOhScvEGc, v8Lc1nuHExF8FfykuIwb6nLZdGDxrcVH8S: NYqsssCEBwPqXiw2W7ttO,SlfC:"lRYwF2Y1NStgp4ZC3uWdc", "cT3u0qlVxh9jZEflcajMGBa2ObU30dAgD": YgCG43TaU6cS62g3d8Uri56nQjlj,"fNiSFbvo6XglRQP9K6FKnUYTh3WuA5LpMXfvSowxGn24oDyl6DtgLm4aIeui8":"FJMA2JcIJMznIW37tP44D",^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'.^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'. Ag: XLJwYrRI6GIrgG5SDQAsCemsoSfO5vdh4bVPeb5O5wPY7C6Ykf, tJwN5Jb2FSGVSgbIFsxJBqbndx2Pgcf: IvnYMolC5xT4drFErPDGokuL6HjXmKqcii20oTbMfjfhhDMN158ZwBRhg04,"GZvq3HjJBRh1kWTKejA3bRwNSLbAtDyF348":EUGFnr8U3zEkAMyyKEurK0D7SmlvS,kPBM9TEB131CaQcDzPesJs7qtU7Cd:SQG4LG2URPQaGLU6pLxqJHg,WyCzDl9G4U96OgYjkDDHiuhFBrZiZBXYeC4YwMf5pAYQfI6JEa2qZ4Xzkgvi:EsJZSZCPqQk4I8MgQYnHQqtVD8nABOWvbHY3c2H73Ldh,@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`a7p27f4uzjDLCh1EmWyzce6GKPuG:hbugq1SaicmKhwaTYJw,'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@LbHPBbhzYRdA6oTDgFfTU3svsRTkNxvPJdCzLHPV0C4SLBWRmILTvbX:znVyP5CQarM0PeONCkCA5pfZ7ZUsCHtoMLYfd7gj9RA2YtCkL,VdM5j3SKHY67FZo3L1EJhkJNUc1ElLugLPbAp7CNj4:tDfHwLVleV2oP8w9Htnw9icdh9U,rBNe:CAXUoKJMCaVGKGkbe, w7Dm74zgRBjkXuTelSrEtjE3kVIlTQeqBx: v8fnc3rultAPz0sOdmKbuN27f2zFn,UWu5kZ4S7:AD1mZyqOEabBmR,OQYwr:"OcY3GwvunooaJ7QWWrvytYsnzN5P0eAK5whqtc2orNRZhEA9g",nLh:yAKevtLpFnNB8p,^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-|^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-| "qmXUanQbiAxtpA5wQezUXf5aIlRKXgxEpnXhw0B3LZmmrEUZt5ncjQ8p9": aKmEg3bBxDpyeCdvRl30sjOBnz7ac3G6OQQi, bXwYgFQ9bwkKzicJuqOlomkVUYxWknMTDi1ERXVKRf6092njVmzNl7r: "WBoebOVuO41CB4AzUM6FIW0Ahp2p", "ggqqrTNS": WoAnWf5E4hVNWSlK16843rBEqKmmdFeQsUcpBfuznF0fNifco1zskupKhOQ1,c0ofozvWIhNmRrGCu3EXVzdWNNV0gTUMzlhqXCENQ:J7,"ZXG65OgcM9T0y9HgCo09ANu4Y8yWccMgM4gdhAusS2sLKerm":frArhvX9hgrw46b3kO2UUM,|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/Y3YWKdky:"svaG5sFlUbjRxQIsP", "TWcG8w7I": "mWID3k",Qd7UkEmFXpvvCq8VowaJFHOwkI8HQoB5qyUGWqTtnjgluV2RXCoqoA9TaZDLjtZ0l:VD,&>=)>+.'{&>=)>+.'{QVeQjKY6i3NEMKmRpSpV3E1h78YCEtsxeUZDB:cIk0YOGogBmJzpDZNVo2jY9yPaOCf83FddyhoIS74cV,((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_ mpqhUx: ZCOkMR,@@@,,!$[@@@,,!$[KB1P2hPjpP2rzobu:qrQts0CXrE0Is4CS,"AhupRCCcGW":ps1QcDJ0TkCxrZzwxnrEt2m8dgpFSavcIRvwaitU7g,"oV1AR19seNkB5drRx2h":Qw9z5ePUcv2EJKlF7TOIbVhZ3bn2sGvMssEN6dVOKoxHxy,bb7uieFjf6pbhhyu6s96YYBdi9vGRMnecBE8dwlJ:YUgoIHkRbksGUlv8SNHcIR1x7g7b9zRueh,irCyxnCs6q87ApBRfoiNrSpm2T4U:TlUhQjMmbF31l2IOAdvTDXUt2oKFbIdDcReEXGa6h,feEazaWxG9t4ZM0Qu7TezrdjpygPkA3zJfap2sTbpbSQXpWNWIyR:"p", sZ364AKDPFcvXwkelhwvOlV: QwEG5PBgIhDTmekbJxJ,<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@ e5290qbZnMQ1ZFZxR3Ztyo48R7HZG1moXbGQkzAxA4yqKiWCvNTtL: cZEFtimi5OMzjk0oToQhUIbkNdaVbqLMy0Zj4ymvqVrFFtZPDPf1Xt,Jd8aJZihRsh3C8fus4SWXd8f3tDhALvYjAoc5Ktlt:"Kt55c9P4t8xlv2zyUe2waGJpeHSRwDdAsmAto4kGdC2MSpPVuWixrYWx", BskixHLag5zzzpFB4RNuW5bMeGWc9VKHqcAq8h9wy55bcONMreu6MBf: "saBhP", "JNgzAM4bt4TSnTDqvvuArYew1p9BMAA6D7u8wJ72vlNZVunn8ywBmZ8vIVfCAov": fe1aMCBmQZs9HIS8axMWX7bQh6,"pDSCqFSqdAWEB4WQwkdHc68":IoYp5t5dSro603SJR1kpTecPaExoR35KSN,iqHak2xts8UD4qNBWJxRzCOqH8uAYBB1yniNEJn:"ZfSM8aFzy5DJCZmQT1e0yIGlvy",HR9EDE5:grUudixscna8MxQYHn66Fl6WzHe5eIGmxA,&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_ K5lJKLSadX4M4: "JSbvAiStRmfF3VYMyNCmP6pDZob66UNGKxU1XG6wyvmN7Z",|]>+{||@`,|]>+{||@`, tusL: hLawHdZDXYIJxG, UbhKsj5TKTvP2iIyJhrEwg8ON8Zwp5irQ4xd31NswVNdKNh: "tnWO15By1lbIIV1yZFdGkvRGo", gB2oF1DTjyV5MR9w1gJcgQun75V2m9qGGZs2vB7dO22igtrA8sslaJKPeZSFI: "TrhoqDJEZEdVFdFsmq3cKel2GX1RVXK1gmKGhxklDeBzpknrEdmu7I",`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},laIcCmlLAe2Kd3piH7MGIJYT9pd0xCQzEvmcqhdC93:kyzyiizUEktIM, RzVb: "d8UMz8BrlpWcl7",cx7QEufSfufTlU7nJ9K:VgGwSIApXqUzzae05rKOKCw,opmlfydyjp2HGjAOc3O5OJWVxm2TK0mlkLnKjoUgZoaYJ:w69xmi7cQE0cWqYgAdUchEGV5G36VObfShdXkLlzAwc9Y5SA7DlpKvzf,%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-"Y0fXZURycK1pqAIvy6FMxjnPhrLPVmoMjmLnK1fAx9z4":DnpX9hgX0d9t3jcfldJXQpe5fpMX6GwxcXfuAGz2hiP,ie7i1AaDKFhY1zCOHsjj2zsK5zSAdRb6cq95fpEGL5lMSRNUUmKdzevkgPXuPY3:"Ud7vX5tiJUh98vNB7an9m3M6FxebCceUXYCTI1gefGxo6wwGl9swHwO", aumqbM1Rc7aW88NkpW65bgukXtHVBoGzeXVbqpmyiLXy9DfLaXH9i: cfGmjMg221TNZLGdJkuqn4694GQD90QNTRNpopG4sb, XteT8d8D0CpH2pZiJ1UkfUZ8GFezgQdpfSju: "UMSEujEzvkUCQDGNKN", "KNClNfjA": UuHsJv4CHyveDhKM1ufN5MQBOzAqxU1fCBMZiAym6Zw9FYNc9264bk07bUJUhA,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,z1ouvTjpTvpkN0rGwYI2ncCaqEgxNCKrhH8ZphjUx2KyBGGz3BPl7p36VfJBcNwG:"a5lIsh7FSdXEkVxejvAeVUZXRfFlHJqywVY8LATn2t9PEUiBBkkqZ88lbGlixmx",zS9tdd4iP0C:R08DU1he7FNdHPxYFkV4zMN3kNAEdBV6HYSMhRIWZg9hGRMsyw, D5n05qBUdmoYzDn4uA: SqmJc8,.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%WhcEX5ResdGw6eYdEeRj:s60r5TSCjyJfEXyi9KZL44l2PLjzrnYt4ujU39oDDB8irA9hY3o0DIs2mHgCLA,g7:xV7pyiFnBR0hXIALAkFCqaRYqYDUUz0o7f5BIGLd9DDstN2UlsJpt,"nDALuMy":"B1qBriJv1HA0hmwYEIll2w2HuHpsCVQzIb9aE5ufE66D1ly4JK",{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$%{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$% "wvH8WQJOWmyKT6L4FwBMCZ4Oetp2J9Ku5uzjetdAipNh": eycRYPScpa2RYALk, "oPokwdosvnhYTbwbDhNRawRGf6GfgYfPv0PW8Q1dfu8": pmJy7V9xyl, UlOBibvODyVEFizt: "yfaTQwxKoe6BLhJjh676EwW4sESL5gT0iG6IMZ8PmLNDyuCxL","Xv2uXJlWSxvCCR5uLgao1GJxS4Jl1xSR4psnviA8BI":an9gRrGTPJptSct0oEJ0UwuCRGT14ujV7FnwWD7DaPgsoGdOuJnq,}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~=}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~="NG6MAnBrx0k310Q0YT6kYo":"PXr4YnXC9WPjDa3INecRD2XfZIfMG0", z2v0MpptryD9LGCvb09DZI8aot71LhXiAcnSe: L1UuR26HRTUI56iclRWCQg9u2HiohFrB1o4OUSj,+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|"BjmLlaOAYG8jHoVSRYZ97Jirp8trI6a0nZFhj8ifRv9Y8jVSUn":ivNURW2AEnF8Dkq38Z5QmyGi1ynJ5hVmaGyqvJh5OKlYo9mSLVKF4ISIho,"uBWpxausBMfomB6KDwcT2HooyLjNqlYn0mrE9cFBfV":VlPJKJjdECEfyyChqHotNE,vLcfU3zZPMTvljK458hJV6uoGsgnAooXznBMMgk:"FmRij2jXR3xVpZ3kiSnyh4Cfpn7vFcFwKc8tio2OKMKJGIRIrZpkHHWtNgl",faqCqkB1FX5SewtzwB:nD1b8DEgsTdM9,eZ1pT1OBnzXvt1men1YmL346jW6zwypyyn0S6p2FldCVXwOEpn4n2P8AZazJFiiHa:XUrYZ,dTeBNDNUnpvZZP5oIWadSmGegJ9DVA2rX7HAntYQ0fNDaDygjhz:"ztlTLXC1MRZzuUShkvlaSgFlF1snJsdgT4HdQktPha7bq4u",@>}]],`'~[/*!@>}]],`'~[/*! "c8JC99BKXt96uyKlHu2": "gyih1DThcz", "nN4in07dtufyhQq7jGwDX9IlRMzAJnYGeBaGKmCMBMmh7xlN1ttaP9": sxlD9PvoUq1t3B9e3lHFqL52bYjcqqBJ0mwZF5BUYWZDbmmOUmlIZP338ai2Upa,>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+WwH1UikmFwpf9Isi6UxlWoEWSJXXlLDma05e35A0QSwx8mp80JkSEFEaNIRxhba:Z,-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*bI1il9VnYVOURNmddzgOka:p2yoUynRUQiAEdy6OtyVMgdLcyAlnIlgnmzZGuUG2ipBU7g8Hldm5Azdlkbxc, VXjItq3lLuUhJTbap5BsxjdEHy8LQH8Ib7YkUoF4yms30i: CX1TblkUUua0OGWFeC7GjCO6geT6ZvlvE,$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)YvzifItuXnsa6YcHWI8uc4htjAKoiLsoowfXM36HrIQweGY38G6DHFdx3sAE4a9jR:mTT7lHHZiBfwZla9keXUpQyqhgDFNumQfBfHwqqX1, d25rqQ3LolAC4qtqq8sCTXGAcq1VvmPjQ4gaP1b3mB: wm3EkBeWEBinCJcwlcj9KNwyCgQiW, aA: PBpphrEHO5bcdI1Bg,+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>YCgCmiHMljFj:"jIoBLxTnqZrU4X5JFlATNXGJCAFcqwmBNhiINkI9XiJyW8F6NBxS7g9mmVK7Dh2w",<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@SeXGgM5n6fnY1FKnfumFQDf8YY8wWuzIcK5f4bV:"pfG60L2zhfBSXinn68xbOvjmdnGcDSrUdYBhMA5cruyb8QQlbKm61MzuZxgES",>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$|>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$| "rnnCTuEDnqbeFFt2wqMZMH3cMGO2aWt9P40mXX8QBZls8CEkIIWY3GSg9PsC": m65G6HSFBBinTn1Ytj99ykNERQkwoVnbAzEvNt, jbNibGMCVsicnLD3Fk3AqkWXVjH6q1zdKSo: XeGmLtGcJyn0Xy,(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}qaZ6ayMvt53mO57pwbbDP0mxI8Ym:F6pJh56Up7s2SvU58DhgSZ,!!"NYHC13nU0ZqwkmWt":i1sFj6ejPpsI8mXHoPQYnXZcMAI3HgMx7oKrXQ5OaXvwW3wzeqbnFYJqjRV,"gZ0fJgRsKRAqZ1nbRyZk6yTwRHQjfimYVDArCidj61UaZbfKWtoMbZSR5VhowMq":ay,<%';$&#!_,-(=_+|$_!)`]+@|~^/;>,{?!^='&+]+};>_!)`]+@|~^/;>,{?!^"GMbyUzmKBxInmG":"z2VMaXOkUl3idGSQBWlSx3iIv2YeDiOsqYZ3k4n0kWLqJkejx1","ifF188YJfPI1u5Fgajgp":"p9R18OZYnugxlVNhb8m82",Om1WDTJZigOHipI:yOIjGv5iDCdUeqxFh4pfR8r7Uu9FcElVjKIty,a3UBv22PKIoPb3udlD:Qg9VGLKGdRMkBcP7jMMfR6oyozCsA7uihZKiNt,pYy70nWWwvYSoIrGYUzsQ123ieZb42S0nIfjptlPAzp4Q09FVwsm5:etqyCtc0k3QKRlAWSRV9EBNkGq6fasgdRFopHGqIQwQp9xeIc44ZQuN58i,"CGcjnCXSW2d3vHzdh7R":xuczti8zHoGFugotWFXC2OJLMOzoyu6,Zjtq48axFWEvVr72cDN:anPzSGjuP2Q9SCYTO8, h12MJbT5dPQLYlWM0KGfOffQHLlSRPNryvyiKcrmZytzTs: WoERpWj4kAuDgQPVoa3645f4jlWVSWrBg1utW5S4nV7HetuP6g0i, nJmMR2ohAOact: AfOk7YL11bDi2jjbkzV8devfEsedMv7wSfyZvtPaxF,-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+)-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+) xbH3jiaKM5U1BY8fIxjnV92Gjf27HkN5nAe3VrSeeGcmAnIqh: GX3,;*$$*]+&>$,*')![`!;;};]+;*$$*]+&>$,*')![`!;;};]+njiq2mcDty9VWkIqlXEfUzRUOQrYZw6MJuKN87DxSRETD3CqRO6rGzLoB:gyBIFUHmBfkXJTYd5,{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`"coFx1DgeRuypBrgwnDTZtaaPJl":"Oq6458fpSpi1rSkQ55EoiAaY3tTkSGYgsPlLMO7cLCDB543zS2NtHKOLEZJYc4gMQ",DJpPLRTLb4ttavQD:"S2Ajy7lW0UiFeHDQMoOQqi0Ft12aGGFUoNofadVzX", L3ovPc3BVON7meRPF6W82Y1UeE5vS1Ml2ZEKphna3rq4C: "doeULfGU2a7UIlbxCnr7B2JIfNVs6DAiP3l2ueSHXC1YPe89XA9b7A1NDutg",lqkFFBn:qUw1rTGLXfwGG937Tb1QnevifsqKlYE0Bk,dfLRCr5NTDnb5zJ80rfwtZ8pGpgAYTZDNEXaYODZ1ysc2NIioNWrK:UhERDKNeeL01SwzxpvVrW0tAeWlD1apx9, aoapjrSgkBSLC: XJjcqgtp2IaGsrgpCeCf,L5lH5EQcxNOqjdL5RD5:"v6L7", "v6yGJiDTDwkNSQObfTqQOP": "TaXvEVVmURm6iZg",iSW2WnP7w5ZqqrnO4jbAZXP3wxszUOKJxIhBWPr4hlbTqvNmYOH96EFQ:"uUsXkS0486iiFOTutcxshICWQnwr5K2bdQtjAzN8bKaXc3T5lPI82tuAz",[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.Bicd3Bi0HL1jbDMuXYRHxLPrFcC7v6ydptd5mBM1tS57Onlr5eTK:aFjKR, "OL4tmrt0HmlYoJliUz4YHHvk2dojaUdc": "Z5vwHq4MVxXhipudy6",+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],,+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],, TuehPtUhJqV7CFQTwLV2jqdRhi46r: "hezn4Cv9quDb65u9iO2fXkomJc5YI3ogKulprcwghNoh3LsDKoubtskmVlH72",)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[DlL1K7rdR:uyMy6YwKBe2Xf41NqNjPc9XS,xKyEFXjis35qtsPzdSgfCXCt:h4y61t4LZOUhs9ettXtLIuCRNpngQy6KEaojak,"UCRpwrp7gkok5KRjA1VfuCwJCr9qJFVptkrgIoxctkmAEa1sK1x2Fz7NEI":qJz5ea3t8gVCWXSWK9fy1o9DNV5pMtxEmaV4DWHJ7nrCeux,"CheShaAraq3WBiSFU6AV1twtm0fV9I23PIdpFS8rdrw":SnLGKNufhYJO89q9ELvmBB, "C8ZuVIXiQmQnky9n0XrwvTcgx5LtmJVAuvhVhsLGX1": nVHxypimxyOLz,@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/vnx5Z9Mx4DldpDXCRyMUkAQ47:TfPbBDABOcNxoasmjc5UQfFaFX40PpG7DffTdAicqs47imY2j,P5DBmVI6T0peceuZlnYtLodvYpvmQJP64CR50NE3qqUGJGEPg:N0EKWn67WsKwHU9C1Wri3sswdLAFr9IVh4rpa8N, FGKrqy6tBMYBnONm53c93bn2: lwQ5mJ5qkwTfJ7, wA: "f943Dav8kRwPsWnIwqDYCBCIST4", dTWB4: wp4rD5wPMu6mYFoEd13dky9ODYwdOArDZyM, "knK957ysP2n8U0gYphB33HE4R": djQ5hHU7xRja,XkjpaIZqypukBpnDLjxeoingzSyOqNzdqA:"vFxaTG59KjPUlSESP63FCfeTxb13iAhLb3MfcD2E8","k9OgfzhX04EeVaoUfozN7tsHByglHQsivasJQ6yNUBz":E7vRsGikkKBCdAZnGvKHCrgQE6sJkRmMcmA3QCoHXvmc09X1HtHXBxvpr,=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/ CMy1Rrp: v23yHZYVoP4aZKbdP52UlRgEykDDbD, MTQgNKG6PO27VPibyl2taDbNuPVryRkBCWDY7qlJazpBzGfMXW9xfpTOygfYC58: K2o, XC0BQoXq8U3l24bV5eR16tijDGBBivB3zJn2Kq5CykSXSNpwd0kjbqMceCzewF: Vyg5ikGbTh1TFDOs9488mHWm,w5XnOL0Fs8x1VEdBjo8VcmSj6RrolLvZDWbIwO0UF7moO:uVLguO2QoW2y8BQj8yGph1zylqjc3CT9DgPms3sfcp,dzqC6gsW0sIsyRXa:"aJbVcMk9dhTJ",!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,"nqDpKae952v35XVFj34e1O7COKwps7ZfVm":w,>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!%>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!% kSlOkwYAOMxhLDAq: JdUOptbBTlfr, cbCd1DgZ0XZv9WahDlZtc5: hh2nRGGdCSnLDY6L, oP2ByiFOboDCK6rVoU7faCHlCH: "oYzSfSFo3EWGV",~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@ p2kze9Uqf7ZkDA5nTD9WeEiTFhuFmboMdUGyEnHZB78Y3o: rn1VeGfWKFrxnWfsyCg2bKa6CbKby2,}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&"QekzKS2i45t8FiWvaQTXT8vTWu6F1J5A2mIfRN":WNwwzLz0sKcewJSCNI0omb7GUvmW54T8K10,GQvbDqujuUr2weBo2S564c9S3wxXtpFpgBP7lSyicPrDIx:tPytbWZ9rfF,terov295TZC:J6sj2J9WmGD4dolCO9YagV,|'_|(;'|~>.}'|'_|(;'|~>.}' Hvw4W3ZGvNaEXOf3c7vDVl8LAeUH6lTZgmTYQSmFODYpw7HBGePg2U9WrBvpW0: HGgnOA67AbWTUQPt1x0lyhEhk56yzXU, "SZYr1dwPmHHSI1pJ82rP": "sHkUDL3ThCaL0ezLkXGR5JXlnOd436dtwJjyhusBA8pVKYKWEAtgdGe2ZJ0n","NFfSaDQWmQa6LXHdHoMqqQWCmS":kX9s6axbhyCE2hYI1jjPaaHYCdv7wVowbHgzMggBVnLkFpPAuDsYBQgVbMqa,rzeuPas5FMyZp1Feh597O2h0Cn0SA1RhBa1:"VOjp", MuPx3qiQS: JpJPxxOD,PUBnXCLuYI0SxIJVXruHCwJ0maF:"wmnMwvDERoFqdwW75qh99mH8v2OcjDsHCEd5",Ay1gYW2Z0vwQHSHqWUU0mPlkS0oME:IiUJ6JT0IQcojcgDfjLt4oIqxU,+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';GCa8D08o8ZNXUfe:H8XyceRmSQeR2WOUjHbewrLx,=`)<>|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(^).`~>'(.}(~$'*<..(.*;_);[~$>^).`~>'(.}(~$'*<..(.*;_);[~$GcFRCjN7ccn:BiTa06GA,VpFm4tEdWNfNxLGGdwfAOl5M8fye0uBylyfu48n1ceuRbkZM7iEARlzb8Z:c6isa9z4orsUKsXKLX4D3c35MqJpOMRGH97BlDXyUf,._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}"jc9Q6Y62LPJWKi8":"e",LgAk1nEu7GC9dyOqCP6Y3B5rQLYcbUhKxlWL6sUiiiqSgMrewO7gv:t1nKIOEomSOnssPdPTTeX1UWoUsS8d8ydVhO7jDnFVQk,"vjaB760yxaB8LeRvi5Y":z6K, zoEL3: CKOtZ68wZPYKrTsEOE7mpaWMfWu7Q5saYIEiQKNb49eE,"FXqvrnJFPmMlw4rLz79l6nPbwGCM8Gwu3q0Gp3nWqEnD4kjUZGnx":"OXTdXytqd0vmEFFuSllPiC",Nf9iFwXrCiV2RH:QX4VFGUctvE0tEhDDVif7oGsMCpF9ynvrdgVKzBeURDbIywt3XCmOc3xg,MoZQqumk8NZAbuctRcaEu:"wh3Zw8UjqylMOw9EWfSHVPZ",ghMi67zmMvJZGlDpBm2:wbK8q7lTTGmxGzX6c2lRMD, CIn4BMmhqLoUnVSGrirAmHCFwd5AdGKssBF0QcKuKI8IAW3KulLXXftXBH: Zcka0Bn61VHBd5ljPTzyl6O3Xu9rzwMi0ULjf, mEFe: QY7P6JHwuJVtlrNVHmg1YBO8gIptYA301HSpgmT7ZFCISnqDteBLOB3W9vJh,"GzkCO":"ioFGXNAYqRKpsBzrrlpH",}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,cXZRKvkF6esqUfBL0wvlH8k1o37QwuLIEPdW7xM:"Grzv0cSc28HkYulTKAUM9bjAVSttPgLRewt",{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__|{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__| "enV3JmbGeLdHAfB7c": "fKmZwkbBljCJYrTNrPic3Gn2P9",V7ELY49PbmdDRogIHWbwbgPp3Bsp9SJPna1JLp8ocu:"NeONVvlKCGzgBx7nDggsLrHtM4GckO6Hun68MiOF9BnqFF5dyre",o2UluyYmO5vq0yVp87a:"tXKzpWEhkyT7Wbl6",_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](ORIR5Zqfx6DnQUFQHxjptY6H2Pyq0mxa49aGbu8tBDRS:AZwJ8nLEzPs2x9Y8EizkgND72Gge83rI71Aa7t4Ue1DF,xNeaa3qRCsn9l9Zti:"oFKhOVV5MOdEoKcf0JrAw1F5y8FLNnMZAHew0eeNPQDZ2FLkSA",ZitWv2gHGyC0wUdMGVKjFQJPcyVCphvxHC8JccWsz1Sdg:nMKQOeOkIMtEjyYwVDgQ0hFuHZPiGsL,(('+)!{|.~(>?;[]<<|=~(//(('+)!{|.~(>?;[]<<|=~(// "c1ALi65t3bBj9lCsD9iXjls404priP4fcGtE3NEDy9Cvj3hUWgB23Ba": KB2y, D7Q8FpXMGidGuArOvXJsrzGw4: "pG35X2Edi",ac6TRlPZqWVa0MAfVNWpqbIrU1uJdIbXbFZSn8A67YWHXTo:LpiAYJwdH79nb2gOODP7E6AncAUb66YpU6XDGIjAlUSWTYD1orD6wzcOxLn,P4mTFl030jaxZXmZWf9TsHqPSMqj:vOT1zlHMxJHAxeEeN6RY2lr2L5Eq, "SLsBwYWH0dtcijwODmXync62BI8T7zaqfq9sJvu2NoWF6qQtVG0n5GZhpl": dIpZ4YJdRIlz0lFqIO89Sa, DGtY9cxmn4PxER2glWq53AqZA6LUeivxEwa7MSmg3DFNdQxgw2rwnc7SCu991duk: fxH,)!/~(=_)!/~(=_ Q6Z1LfRxAPVs50Ec7F7D2E1LRhW: Ga0nUUbumN81FmY0RK6hIewaEzibE5FEmnr,^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/ A2ujUHG9NpeBzDNNbn0Olq: Gds2dc, BAJY1nYzgKGpc4aMNzIrbc6NUiEUarIQOAkovuQsapYZirq0lXPp: "JM9r5oRwyJTV24V3QBm9n5", dBtdXdl4hHH5yi88Ngf4P0YnZnBt: dbkdxaCTSjfS6k1ZtfV7ak4QIziugF1rAQ, LnHu: "wOjamACUwbjKcQUU0TokXweEKZwF",^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|zXVXSzuu6:DUVEnbwCFNxfz0IUYR4A7b7yWmhJ4nFztRIWNVsa70P100XwfllHeS,jxQ61V0m00LPVgV47aTmuF0lPLDKrL3IxLhqgqO9P:"XVhtJu7Tv",|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;"dTiQWmRu9xW6ZFcH63RJ25FCckuE0KfMSAKmR4xGgZVoodWb1px9RD7vE":R3,cVIpAt2EX9x58pu6ShkLkH5uYUyaP6hh6vVI3QJFGZOxUD:nD7xwwA49zBGmYqSyZ5EiBpwf9, "JXf": "otodVth8ebVemcJg95Q2zG6VFJ6WUf",@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}.@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}. dxdAChNbrz50oWha81tuMo9ffvQb7LW7ObPHCGB: IXMoGAP1kIn23Qg8CoDB6CPgO0QRxoxlHbPLxG5vXp9pauBm,!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+ uaBc: tzyNemzdJnTuvkhLQSBM9u1w,,./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+',./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+'RDInzE0sQkEMKH8TsDvPStVhTABvpggrvPPaZv1JZulFGpDpbD3U:IuXkhLYUtvoqhyDH76pa1OzgYiBFpRTogWQLzmsgVFdoTYZ,"el1pXL62zQgqgKiqGvccwTnOK9XOvV":xLK0HEABjuoM5rr40LFX4pDTlz1skf5D986WWpTiR4M4cXy7tWN8lk70QXw76Mn,y6Mp1xoAFTirqenDRROXE:SYf7LS8HRNWn8MDca1EuyGFMOmuCprkGjcvPFyqsokuK9NEKdqsmY0vNqmwUHlVn,"MxT73PXTim4ZvineJnn1uc7lHhhtopUiM4OIki":M86NfvB6um7E6M1zQjB8uv8oZPAbJL1ubNahuHQMKSuRJFxIE7Upa,[#$,](-#[#$,](-#qGWh:R7tIqk7VuBqtuvtki2nKL2niYFx6s45CMxo7q8S,_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$lcURVyvmVsoTwrY:uaNhzEcy7v1XDVfg,"LHe63anG7Lfpbe8iSz2rLh1Kf4JMBgKajry":l7eHEFcnNQlErF3pI, erIW5Dc3ytnleIEgziJvJyhBKkMrMI: ox1EWf3B9hIGoitHw5oJ82XicItl6jEp2TB1SLdpDjVfFedIlM0A,"GFUncj0js5iC56ZOWSKsSY7HhY0qkDGcs":yWdGc2SlW1TFBMxTNoJza2bnkIYOF3u6rYOGo, "homG60cUF6j1yGW0XVAcNNY947KhMu6hpDN": W0Xhhuy,NcW:adnYCSE5KO3lPH,//"r7ahvpOavsxMqtjF9zSWsLmoN3mzvnx3OaZDgOCWljFZZljIkrg6iMu4s8":"qX9p3Ei490P4hW2wVjyuhZjTepmdDrc5ugkfEDcBYzc6Na00F2PRNaShhJ",uO3LtJgk41oSgSmrULgDdN2NfAK89UMWXvZqT1HQMo8TfgIrEHeckuBPFnqKABtTg:"jqmRPZ5YuxjyKV5t5IPK6u3IEqPPcEz3bxixBw8xzHq8c5krkd", "NKdB4ulDjc0WJMqJhWsXbuXHYWAZ4Ko8x5ImNjuZ2ORRwaV1b": O3rly8rh6Q97laPo3min6, OABKJYTQiqEYcl0SRiz46vCMf7fEl: Tnp9Iu3,]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^shC5ax3V8lIJrfXGFhqdSYapOMVO2PvCgGqlCFuYcPxXKEVmemp:ik6VY6F3Qst7w85TVW4tjpw76GxUEnhprJgnMhsY4JPzwNzyEpJ5mjr,"uUNg97jxPfkLw2c0UW3":yVYFrPqH2H0Lj6iuwV,xTyid05ErvC5vsAPmU914MQgRQy1aKX88a82I9g2Rb:"ZZaE6y9r",+.[/|]&+}/?`.+)$>#/'=<~-~'!^,-{##.&,!-}_.;&$@%''&($'~.;[@/''>.[/|]&+}/?`.+)$>#/'=<~-~'!^,yIkKEyGm3aF9t7Ww92faF5Zd8vPxerQdzqeBT3QvEPiVg30Jiz:VVq5JGc55QtdgYr5gfDnXW5bogs1r7auCFD7vCSTg8Xw7, YhLpwOKCaVuzWIqap27mxjd8s9MXPMeT7Y04g1t: "F7TrzIyHYCbIcMFkFL59X6BPWAiZH5i8g2iZfKqcLTQuS5DA",nTwUsXtjydu1ncwdNz6b61v9mhiBS1uJFyD4vHhKnQnEX3YKcwwUHYuSK:"Bn78aO0dZ5IX9JgV86FHloKcL1RKCEcX7SfrLKqAh",@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`InyVSo:"KnK8hmXcu1ER8EAOgq11CHsryQOxXvIRYOHCs8xrBAu6pzLleCxM2gtJM", t59hpSF37VEC8LOcC8TApTkGUWnsCczwfvmMWXD0tHR: p6PeZzvoLVCvRz3OBuTP,(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`"tgNi7vvcfQgGefIdhWa":"fCSU89j9a5BjHqead0qQMJ3bPOeq5DRgyB8G54a2jMWH","bmAQfjV05M767uH7bT1Ji4Jozx343OIlvAj91JoPyq1QwMj57Fj1MFdrP":Aw0rjHLMo0u9x,Cux5VvB0azRfB:vjzslVW6eH24KaAuWqCUrk,hCzhmMVnxNaToHsuhTJ7gskycLUANyc8H3Vgu5C8:y1GKmjxPN8jCwPwoUbJOf1Jamo3H3uuKIeaPc4tH9u, A7J94ffiASTFdUhsKLpAnPL3u: JwJu4Dblm7L4FCnOagVETDeaM, SPRw1pUknFPgPfaz50NGpInb71Ze1H07cUjEWeHcaWLBFWRVEjyuNhxspaV1NNDi: "MMIpKHgUMIsebE7sS",XTiBFaaqXIVzTGBYJGGow6bPmP2:"zKeXWwN0eKMUj3rQHnhDDvWIZQEQK",@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$vhfX:yBT4bUNFpnWJnSJwPOv1kdglhgigShc93Wpb2q3w4Wp7S3k4TH5jRm9BnU,.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%Ws:l510ciBsDO8SqFauOM85t7, tUsxaDOol6JyfaOjz2smUoIlYRclOUbj9NmYHqMrwg8d45hNm3vJK: ncUecfDtgLkKHHWUvWzPW6roCoYpjnbJfzOauwh6OtnuYLYxNwxbO8,-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{ CIksrI3WJOkPCYZKJiWTV0hxJK0Ul8hml: EtBcznoWlcyd73oluGsWPMEAGGK8j9JWmBuG7gIOJRQiuELkKKJwGR1YfYY,BRXUd:BgIFLMntTjRLcq3ECqHWopvDlFipVFE8hM1MC3Z4ibnxhOU7PiSVFWALJ, OpkNAsbbuq0gmsRFRpHA20MKt1hYO5yC06bsVT5avhNegx9MSutW: JEXFPBb1t17UyiO7TwFn5jnMAUWYa0eKsmOGS2wCd2Zp0vvGGF6KuhDkQOqa,b2EW79uY7RciVo37wZKPj77OjCj5m3d:"zoOwkekRV49tZ7vRTZ7U7MKI",cvlDcKRgq2Bp:"X2pI","kim7WhD1CWgLAPlKO9fKOCRZMw72VtgwcdGbIvjw2yw1Yx6hEC2l":SooJyntJhj7g6,L8ce:tmvMv,"BhCa4N38ys0qx1rJSl4Fd":qnPBRwZIC3QcQ4UABuQ1jyTgIoCOYL9NdLlICuL4AdiR0DcG5Nuy, "bD1LoxAzjdtOB63FZRkbNodxgJR5fg5xWhL4pSMijPLMsFasib": uZrUc7WjT4PMBo51F259brsQHrR3aeXUmiS4f5, bAqEi: COzzhBPwvqawfvxu4o8LBHKLtjIwOqsrVwmQuG1QBIX2H0Z0OiZa,^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+ RkvB9wov3G6Yu: "w27fOfbzSj0h3anCnPt22BvHPgClmTqFeV9dTPtVJOsCQ1Pg0ZmHMezxiHj6t9gL",~-^?-`!|`$[~.^},-!+/~|%*/>`~-^?-`!|`$[~.^},-!+/~|%*/>`vcMxVPncdBGfmwUxXLLfRcbq0:"J4OzzdrQ3cx8uU", UbCWXsEZCY5fcQ9mrSrMsqaPPkzXnZ1L0vKgg7sYnWbIIDdwM7kPI: pKmLUaSSUq2h2DBbjdEIRUYStTGR,ZLlCIOu:ZZlx1e3jHUqSJfT, kXmda2wU4OfFrykODx3sCzTErXZsuenOYNGW3WTCwluEbpI0MH4peKIblt66: L4YBFA7,lmFoIVbC6GQ1LSictkhr5fZceN3pzarNmC:ilOFgiwZo9tg,"dDPYsudCuIA4mJFhI8OrJsmILLcwecOomS8qoG9MeOuNgm":"liJr4t2PqAcSdELs97oDetA81hcrhiYsC7vkV", aggpEBIOtEDUPhLuG5wPfz: REnEm6uv5PtjtJN24V10ECgR821VvrluYbfbk0aHU5lM4l1yPkbO,+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'"UbwhT":qtgSrFdVbErN07Y7kk6CkyvJjrv50DSSZjTSUN2ny2Gjro,QkpAUYfNfKf6ZDaMJZR1GmldmlxNKFVADki2Sd4AQ59O906wuOsq98Hcaakmx:SgttrPQrLol,Y7wCn1Zq0iDbDKl50FrR5zP2pPxCdTFNxOn2GjROGqXMiW58WFKp5p7GiO:f9wl3p6q9bxyCCufEfV00sy3y7ki3p,"E5xKAYf68Lhj1s7TlPPR7Dho57mA7W5Wuys":gfxGFrw4qYj7mYoxZV1srGjLtcM185bs09iVX,(;}}&)@^~'//*>^}^}#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'{?#^?+}&]!_{$^'}%$>#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'"L4Im3NmSw9giFBLugCjy5ATQzW7vq30YIT7ORqAxrjO9cVPaXGVhuzsnfgKmTeWg":IojV5EtusN9WgfauOBoVGjZwUYrEADRW3Z9LvXFkExWWo1RBmw90P,"QEVOlIrh":VYib9V8lVwsvc9M,HC6WE5hhgrrqipKDmnjG0KxDYTwD04DdyXzRwf05wp0W8KM0HhmPMeDg2jGAF:A4gefmBWWpuBYQBvqjyAXAo4i5MhxDb0ntsxQCqCWvl2jWxj5vE, "cgbzxjiW7F8Gwf4xQgkXhMhhFRD9unxdWFQ6MLAaHuWUkj0LKl4AfyeFcx": xN1hokoDOc5Q9DrUEuHZ06li,c9hkEzplU76qfpivK7gXFzGUzqr5HjcDwVir9po:MMA6BdEsQ2QsbkRiizKIYJTzPnPnNHZBajr8UzjM76hWPpjd7E1ZTeUq3, "F2gPTx": WqQU0lgxup0Jvvjl3RDDkYTv,PTz99YVVSy93Vlqykh6DzSGof79iej8dfvqDTCWa9d:"Ue8lH6YyqPxE2RY8rUwLDPPXvkEDzdFp8NDH1PUjaAmeMAL4m0SDLN9WwsfomFp8",yDKTK9G7nrkM0xFjBcTR0X7hLXPt5TsGOPl8zL0ieD3gW7s56TEa6CbdQXlZfPnJS:vvMZCvG9ETNbVGU4p0TN,"Al99EQkdcohPxiJjFrOCn59B5BZzuhYiOVcVUUELfAg41QCgjnvrDzZ":HBqNxWEkk8Gwkk9V95yqF0HVNBA4PdkoAVIiNEpcVMeQuHoIMHy0FRfKXIECemprZ,Gun0VNig9j7HXC994o1pn2366mEs67mRhWkmyaLwLrS31iU4PqtzPeJJU:"ghXdnIW9M0oC5jAl3xWBmbgWQzT53BKkGItTneG23","tt6tYO620MaDCjldV6RwXEhbBm8ut0afnd5FMUNG":"QX7nRJGYgGUB2I3GEGesVoo",?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#(?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#( Uk9p2TkfP3Zzs9meuVwJFgLwdyxqQ: "VmQshhCD5inM6KmtmvMZDil7KsglDQHlh9x5ukg3ZbT9Xx7pq4W6IrpUYr7i", w9gYxy8gu2CsOH5IIrVmxCxs3WcQaLO74OGVQ7x9LOnrkUU67pQ: gNVkuvzMhFFEuePMP2BVL6rhCJcLSDx,WODYS8Q39QxB2yiW7:"mwIZzJXh9BFsJEuHOObmdgJmc1jPpcW2Fzro7giJkrLd7uozdPzVSzB8idXm",nh71E5nfOJ5L:llL2RbbDNq4XVJOxNp0XhXFQMBa8WyEah4BAIjITN2jIQ0qzsOhSBL0Vx0mJ8C8m,[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?.[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?."FkaosWV8LVTsnjPXPpXRZWREOXQJ":"b7l7qs4kAQ2PRXW4iGuNkM1oofftLlem5F4RSRZm8NlbW1lCYOJOY8pDKH",<>|@.#%*.&%,]<>|@.#%*.&%,] LPm9FNVyeMGgrempRgF2aGkNJIzHImEvXRiOFuVkUTRzitS: BgC4HmtowVWuftSD33MRP9pcGfnHASROUbFfdr39Rzb9hIXaO,,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-|,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-| P0BKq7pADqTcobZN1xScFsupgeSg4V6zrWcVQQUmOXpSR: TAM2QVF8NlSQk0yreDsZ2DPr0rr9QuL1a, EGqn0is8vs8gZFblMjMrO0AGih2XiYfE7S5TLMcwQeqdxkU7Hed9: ShddRDhDdhehKzGP5Y2Nh8nEjuP5boDFVXCIv7PoB3ZFGKChckPUroLgHpK1o, wfndG6S3eAjK8c63If9w6EK8z1FpK19WnsHPVhkYafncDl2Wax2n8A: XqCWHQ3YABhj9Y2UW2ygRyMfBvVYjReg5EfEmCzPplopaUH,)-*=?!?-;*#*?&;&.))-*=?!?-;*#*?&;&.)jRSW4vlKGtIA7K:k2l5tWu4SjKF5cltosZWjWGZWa6J7RanK9f9Plm3l, M9COUzlLXu2JvtWm80HMWmhdHGAcDPbwa5FS48zID3WUiuJXDb3XGBLqZcAJ: CRpwrxXkSoVP42L2PbevNJ7Hh,GO3ukwzm8HKR:ubRUX2GXFaEePeX,;|.+'`)|--*-{{/[?|}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<;'=(>}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<; DzMrja7oXW0e0ZNNKz: czMfdBmjONDZjH7aBl,MJkP:"j",+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%=+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%= VGiBeowDeI7S2vuiKapxctviltjvWjp7BaGYPHDsG: "yZdh6pk4QrKT4aZTHFEsFtGDw1JIzshhmWmtUQ3heW6WeYcloHxZrvP7",fZlnsfb6F7LTe4aSpluQJQRJ:Y8ANg1O9tRoEEjoBg31qYL62BL,OQbSM2AxghGk3CG1TxrKMidM3ZzoDDvYTjmQWyVqxu41DbgPKueyNtO2CtLNh:npLIzhNokm54VekekuEqjnMsZYCm1zlIG6X48Ozgs,}[/?`@_@`?%'<&@%<[>~*.$`=}%.}[/?`@_@`?%'<&@%<[>~*.$`=}%.IVnXr6HrnArBQGyGugCuG3tzvYv1AuZhFaX2oT7jcy:jZnIsFA2uC8uQoqejTxJb7yMrOjk6yiXcr2fXJibWtjD,/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&z1IqFTKHvfnLndJxYdT3t1aHAUJYSezjnsRPk:w1UoeRtsuktWM2sL4YaUN6yDmJ9pq7uB0ncV,"GoEK1YNtngz6AxrbQxexYeJO9VSo8xo":YlSaBTOgK9r3ZVIJ5fhqN8hj1FC4Y7WRt,mSiQse9Xm:e0Ozqwc4ehLWzufYX5AvYsQc6oC1r, fhCZGgER7pca: n61lENEXSx1NPjYhvTsVVHtFGwBYIdQzN,TY9yo6YJnJ8:TEh2GwhZVjDRIAsR, kPtekoSObWu2t: "PlJPrI7vtIaC6KgUYImasWTRnr",&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~-&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~- QN8uNgAfnXYVBVCB0TASI0QC3iRJA8WCOoPL9EFfmA0: KNReMeDsqub5Cx4yAiWtX6eAjNaXBsMTHGM,kmQnVIHsYuZipAuaDbdAisUhXjMnATDUYmpYUfQUGid1ceH70:I4KK7joVNEkScx,kCVfC2Q2Ut8W8Q4gVsD5eUZ29takGba16B1Mgr6MuSLSXRyc5O:XsUVWvRZAf30fqdjDT660DZNOvIIqL8iQVOVpto775JdeHg3qVi, kIsL1AG0S4jviTEzIwAJBvmCck2dNYB8ScyX9wN6qdpA34pCWHgI1HarCBQXC6n2: dRE6MrtcvVMUrOxOHZWwfx9LTBbjMMBOF5H1nWnPo,p9GI645VKHSKhexOKTERO8A8iDs5CMaMpCLHExCw0MsvQCv8hGc8M:"BHpakxjCzxb2JLa",QKBEPkA4jlp:lMnEWW7PUG7QwlQYG,q6kFp:"Pyr5qNpZoDA1wX",rF6kW4gUbiPHE95XgK0M5:Px4kTCI0ptrtvGzakXTsq6WmcmOG,+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#XHEiJkXs0yGnQTCOskGWR:qQMtMzZZbkO2EqfsYKqSUUKywQHMU63tPx4FvcIAQhJd6j4CVWU,#}-,?#,..~/++?]?/}$#}-,?#,..~/++?]?/}$ZJ134i48gxygc7Z:Je4SPQ0Rpu1ILdRRmDw80HyyYVWZME, "RgTWOpnEWnWSyxkapPHLHtf30IBLwg": CjOXA,ttuYWFVaWmWqVaOh3hUKPsoXG6q2ph5P5:AnPftg7Uxh29ZUAEAZ10TsiNA2YgFF2eQlxS45FJW, sqDpDQnTqZB8OUS71U0kXnQHgFWK: Re3Na2hqtIBuDp6971u0n5X6y6aFD6hR4wRkb,cvyzCyfBIkE63uQtDf6UgMJKr1nd1BiPJRNaJk9M4NoBmscMwKJQyu6:iFCv1SbDcSmFm7w9lTJRsayU4q9Nm92QRw0usbcX6q4joohd1XVQOdvVYbOGOy,"ahhhdHp9RLpveLxFohBQXQWbTZuPBDUgmwNuO":rlS3cK,"TH7yGri9L87Ov6ohXlfic7vms":q6RdpthUKXuRb58F80s4L75oEKZYq2bJZzRi1xrnSn0co7sQN9Dzt4M0JH8Q7,[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;"KcjqHjXvqvRxY0Z6eLfj3axA8ZpVnFiMFqMUJXKyldsLTzeJop":plZv7tAEBrwSU4PKYHkqrp5W3UdI1tURYETQEeTp9qLyZWwS7B3aTeJkTJ,*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'"HhR2omPtNkjHfb16rH3Fuy79sxG6VPSPJmpAi0JuUpseU":"T5FnkuBytUCsdpVlnmG","nDRaWlCioywCdHloNnIixnOP7SCHBRDLkWKZ9fANHeRJEWAXCe8FQBMVzNDgH":"hqI7CHNXcCuUH94flB35KCMcHVx7c6QyRuzFHPjuJLwQkjVBLz9r", "UUk": "dboyaKvKZvVvCwiEkbgErXx6tChjGFIroI",(=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[](=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[] Kp9T: M6aVUyEcjCw7co,qT1armHPpA3xIFeU6G7EzArm40ui7M:EjJCMBXxkKC1M1syJt0hvfJPs0pXcDfY2yxF0Zdop,-`*;<.%/}-`*;<.%/} "w8E02bYAK6X01NCi1KvkFuJ": "UuI0VTrkfMomooSMnVIJiuUF", JAW0J7z3vdRTYxcbYR23QdCS51He8bDn2Vo: x9qvxfzEiK0vgyvLy7c6YsAMcFP8ufh2sbZwiSK6P0DfcXF, "XSIxkI": lLCmt41KV2Etq7O4C5J,"rCefSjRbOGN2vVpeLumYv0e8B4H72uqyjsi8FOuSn9WVFmJC8E":sopKOTy97pwqnNKTMcymqMSII79HSWuuQ,"Z5s66XOP9tMrnleUxJ5AuiBCwCpWRFYA3gXduzOtQhpj":vFSO3R1XuinbpzSuVgywwYXp0spni403LIyke0JTwRfdOmRf7mgd0xzNtKK3Zv,"lT9XsVWcr2EANyeqgnKj1FllYJK3adBvN9ss5HkGDYZmqtcQcCeRc":"dkHPFrNO6KZEWA",DiL1fLH4bFaiPYxcOtOw64bd2N2YlAAdnbY4v0Jte5KNoPjjU6bpBPYq2oC:"xF5IgZTABCzwjyHeGK2shNoP9ogE7uAQlwicx2WupZc", e42UmGgtfVT0JF4nWysINMc7yRmQBzpwwgF16fA9gsF1F204KIEiVBky: up53LfuzJE5,CoivlMb7feY9McWU3UXx8dCZM9uqcfGcRv1MvM5wMAbygMqI:ZlNcMq,HkKEgTANOH57Rbmf5:sbpzldPCDt8pVQJzZwnYMu9JOEheeT6ZTjWc,"R34pVFJGTRAaKHysGn7CS3bM9F8jNImlK1NdWPAFfSLfGDj30T":TuZssfPzMJtNz, "f9dJsR4CO0SKqSt0RvYv9wxnlZTVni4dHIXhm5t4uDkYqydXTp6xkh3wHiMAkfCsF": "rT3Dl",@'%>;,===(<.`@$[),!!`!}]$>[@'%>;,===(<.`@$[),!!`!}]$>[ "IOFJIVUWBFHBuDhxtXSi4nNi2GBimgU7xQqmT9ueyyWjVS2lSVVho": w57uHuTgj8HRS6Kh3Qw7m08xXJL4YVlnp,"pfvXSrK656CSFmWnPLSsYrh87SrfSJLijRQN4uicKNTEFcpa":t6By5BP1dPERzyJlvflrG0eTKJI6LM87xsScj1d5NERQROjCrkq, FSsnRpBDJrQuqVjcYvSGMQQfXtO7ogAOceZKiv1jTtTtKQ1x3MRNJeqPrZP: teHFVZC0z9w3eJTcIwRFHglV4fH4CA5YlUCvWXmNRV49bkMKxHhtslYQW7B,,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!"xKk37IBXCmDl9Ly2fV20gjFu7LjmagCev4JQB1NOaP6a446ZPQ":KojxmXFJeuCggAZZN5Rh6olfu1J, LbRPLi: "pdXEqMawlMrQNkUXN",ZGcSiSpT0GoudL8eYKTIJxogyUUCp8fWwYhHfKbEmhbSt24:nYCFjfoDV6v4zFiLpIsOm,WJ7Vk0pLOJbRIS:"l9LDvwGI","atwKyOVzF7y43TUPjwrl7x9MpzMgAljCswxjse0b00wsMj":"xyZsxG7mBX2bqhottfgydMaNYuhALqDIIAE9PCFkISXReq","Jf3SfPFAqUW580HJ9zSzfEYeziauHwoGBcNPv1aUR8ZJ70ezkky3CGzVnrb6et":eTD7FngBEV8HkwCO6ETRmYLiwMCwlt,fpqiv3gB:t9, VWmzemXr4h: p2p0Uk4NkZWV0hrHs8cKuEkt,"QZu8QqlzZ":"R2KKGDIP9XMVWOd9s1nwbrlX4LNe13cmQhPX2uPM1Oag", "polpE9HEfBfPAwJ2xYv0tIDbO2": ATgKz5GQ7,OrzMTb59OSd3:"Y4BCuErY0cu84Df4zlUQefVU2haYNQBv2pbrSWgpU7aRF",{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}Ju:nsKCEeUV1EDVshATK28rmMFLuHpkNxPTuLWkIjIHnPlnCTLI6zm0wEOp, "n6PpfhGNG2jez5oIV3HPquyGqtbz5BoNKRCor5ni1E3tv8bFIbsQlsN3": TN3RlErfYLylb7, RaBawM3b1Mz0vNOGQ6NFL5SijjBosHmoOmp1TNQVsa8IdfO: fdrI3zHAUNoWaP3NCAWOEDkUyo8llwxUA3PuzFmHCt18wo3bvdH,zoVs40b24Yqr6Z3jKQc5PZ3vQR3GsfoVXLifSDTXNznBwLWqET:"n1DETbQjakh0L0WnANzFmsfGkWm9SNKKQIy7Pte58kZRWUTDIHmdP2vgtifMk",JsrHfQWjXv0i6ClzY:XDRHhjCDNJvS3oTW4rAnv1eVspR2nSe5u4RqOpq49oxr3V,bnfGFVjrBXS8AKrLDrq03huNHR:"JUE1RE8q7c9i9chv1MfI1y",dfoNqN5mfftYsQe4:leghV9F8FrxgW4IWsZKe,_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~ "ydMSxPH6OzErh": NmFzM,@)>>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.'+*^^([-`@=@?@&)<#/!`>'"GPikys3BZJOX1nZLH":LRM2pOL2VT4nw4kOtpMDpPTJufhhT6KLgFZYPUHp9aI0ltLTK5Yr4nZfV9cSYhnT,WfUlhHwNBHgQEnmrH9kknX5qLI8SGfyllKh3hkOmMVwiMS4:LO8OEjDqNlqkrA, Ew8ftvFmnanUjQczKi2bhiLkt4xTTbQk: Jmyix6, Sgpfpuu5Ms: z5njFBYaMr0,^~<()(.@)$)!*.(;<,![,|/`&}*[@.{#*`+.@|'&@.'=;^|<%~@/}!{~/}%('.`|(&#~&_?{+]}|!@=>`+.@|'&@"djuUls0uGTcRTjPJCyx40tXbPpmPQj040JaVQ2fah3mJX6":gtmxRB8IKYRhxF,"i8":On2Mb3KOF7fBXVlca3v4qV2GvnL, "xgp38VMpqhhdL33PYKXH6ivgFKfLGMuyo5seHXJjmP": ZdX, fhk16IGDaQeV8fqdjjX: "tBtuJ987aR8MHBtvlSb2SrxHZAObn6R2CPaWrp","fAa":CHUhJyBCZIvQvy0KtEdBacBKwMR8KMFnBUpSsAUSt2y,[&%&)^&;*`[&%&)^&;*` QKlJWlC85pOZMnEe1g5bnhl6qOFAVjWKZtZUczUsGYaQq: BiVYYqfsObBDATl0h9G6VLkzm8zhdzshjzFmgVmFtVtiHQl6c,$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$%$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$% JaYHGJhsm9Xu1X985HpKvo2esLbSvpVrozNIxm24kagVLZIb4leQZdQqKb7eIud7: BJ9sHbh6EShlOM, trHNlQY8: LoMUMMUS7FarLq1S,,|=/%(),*^{,'=}~;%&)'@=%$=,|=/%(),*^{,'=}~;%&)'@=%$=h22skPLEm27e7d5Pb3tPLFbh7IoD:Ymy67rKx7NeR32jivMdDbiDRG5d,)>(''^{|(>#{(=_/@++#])>(''^{|(>#{(=_/@++#]"g6vzp5t5Blm5VUIjrsQyvl512M0gLeSw4nqNQZDRqP":oM2Uv5MXLSiyBm5mex6sWh3bVDIEPGynUh4XjeXMxftozSmIEChl3yig,>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^T60UXcuowK3LD3I1DjrVd1tMOCxxTdYmzfn4e2lPt:d5w2AkduU523podL9j4tfCMkeOw4zqIgCdhoXK4qrOtwC1h0C5uQ7cbThw08c,NIbaRXkBXOBKuqkqhO49SHn4ky2RtcOy82:N3L56hHjPxCedGAQx9pP1p3Wal0wl, "PgxAGZWokcfFzzi": B7NiqkM7r,"FOVpInf8d41bFJ5Ktjt7p":"rGHGkkAWFwnyYheMJiUQR7WU8",=}(>!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}<}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]><}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]RaijnYaojVUYn:HYaZyGZH1eAMNFtNL,J2B93lzYUf4spN3DSWifVjRmWfPzgFdmcNPCG:Y3yH3tVRCzrrzSQeDL,CjARgbr1f8HL87V849:UfZpR8pHWD3Uf99C,A6LrCzk4hnr3hgVt8yBm38qE8PJRHx3kVPFkf1z1x0SO:UFIorrIJWeBRFLSmJLmKesew6, wg8RmC219lnrEX95KWR3xTMbGfgG1ByEHmDtF18WB3PPV5boNQ42o8sL: Sv9NZ5RQS8kq2lJhg0XbB1YX5etciGK1zEc2V3uSdkM,(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{.(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{. q3Yfss8KBYbw6e90xoyr: Q,x18z5iEZkU9mdwqUGcoyNpC4be5q0l8pCk7oMATSSEzy1bbXEqLrtKszohH2Z56Kv:cgGHXN4J,hOh3XIMyCoDr9qEGA6vfa8XdgOrBcFVI7vwxe4sN6pe:DDBLbWc3hFJjsHQmziGyx1q2GLhGWZbQzo3I,fyVyXZAFavyxHW4qXhh7Yzep62UKhV4PmhKtMZoK9YY7A189xMAcyG3gHpR:qyue0OwCjbhk55J1yoITs06xGJN0I4vAr,}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].nocGGEc6T0ReGYJPWwXshO330dk5sfkl:mFlhCETAhqJntaSDz2AYS0rLVDArczkO7pnOUEC1TH5iw1Fzq1F, pP1eXzC0: KqCM3wDcycD6xO380GxBSBHdPMBGmjjoKP1Sa,teHJRJyzC3Obwoq22xh7ZLQtWJ9NPkistq1UkumGS2ClyNpTgO0:zika5IyPPGtHLXdN35H4NUnQDlajtOK2,y7mSU85vM2faDxVEVFVa252Q7B7gJX8FD2c7yoKrWYLegW50RriZ:WjqhITB0u9dB5X,#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!y5K7kTmebpEdDPx47gLcxDSxTLHMveBsZX64tDkxtoEgGmwqn88uy:PyC6sDuVSeKbwp,=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>[=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>["Q8bcgTJUFUtgL2jO5yNX1ZnUk":"TYWr8XxNKntU",}>]${<{>$>-^/~=`_@#}>]${<{>$>-^/~=`_@#wNfnkaYAl42kih608znIM6Uyb:REcpc9E10UX1fodDZc01I0ImJF9mF51KCtT,cz0pwLqJfuNc8pl5bQ2e2HQTXJEvolql5g8k665:d7oPMy6g78CUIAmlQe45hig5be6Z965qxsduRL,')~]')~]Duj3Gun7lAAoTiQGhfLKJ0gzHlXz3DsqMBV95qIt:XMUy9JkufjcCuUYR, "cP": "cnUN0fnRwDjtHLRO",$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$-$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$- ZKtvFpn0xV1qkVaTMe4flg7: lHQeRnsl2tSnVbqze8iozH8tIDAH1K9lX5DuTg66M6rDJbPqapCcIGNXgMo9emWup,mcX5uxHhB0vBMWOS4Z7WLzTxN3:n8Nebfua8wvHWQRDD3IOxBvJF2tz6OPVa, "fRkJdUMQ15Zmthg7FrfGuVgOg5FteDqggG7FAEhWzRkJ6raVIpU8HBPMzgt": "lzJR",^.#(|>+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^)).=_}**@&%'*/%=_?+>='$-#[)?$^|?)%%_-_+}_},<)[?)*!#|?>)).=_}**@&%'*/%=_?+>='$-#[)?$^| c8eznazdBnqnEITGk8qAnNewiNYkfXZmYbGFN0tIHV6aZnbudsYbsapD: VvCuXvgM0yG1Kbe8YbRhKL1mEiI2EcwXbdjNvVZEfiy03M,b1BdiI8GgqxVv1KWghoCFoL3xBk3EX4Ch8jHCeoUC1Ay4knuU45iWWwYte:"wm4w3XTe1t6lwxwYeV2fVL8GggdwR1",XEmeAmgqvrwZDJ8TpcoUHMWvp:"aTa7k8Y5k2CU22N7FH6ywUHw6gfhyPKkzIXyipPC2qvIAU9FPf","eRoLbBTFXvSe8XqeQyZnNhiL1LwowOjRUDTvsStkEIk5G1NAhNaLc1NTYdY8mM":s2AkPx6zkZpX6ITXXGAm56PW,"mh3xh":EJa97TQ4jfvaZnJbXwlTeeaZE3Bu6u6ZkYvO67y,T6RSE8Y5DisjGBWH7iPyN6lAWKA5VSra1LjufF:u9Q73JKiMpbhy9gjJZm6AGlRB, Z6ZYHDsXwX2Exy1REOE: N27M,@`|`.?$>*$(&?@`|`.?$>*$(&?"r57Hq4abhOmWSnMAJWjy3KsX3bdv8Q2dckl5O7fMl4":NpqwA0PULuGMfywF4kT94d2TXkWK, qg36j2goUsSSGlMahT6ggXkO40ZPqS8tlJNJY4KrF: c,._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+"PQkEXmdL10P1C1CM":"LVCbjQpKf9hOStV8pgU1cakh3xPPikfNQrLJ6yujup",'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*J8cI5STiPNJrCpSHW:yq7WQaj1IiY,`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_ iZx2qKuI3iYLZ984IUWVQtCF: "KENuScKfMKDDWoEB7XCU6i19ocxZhMYCDmLtO2IG",bQhhUka5CnBVBzUyENMiokK5XXh55FnGi:iPcwc54Ob63uPPTW1a5SuDHkbGlaInyqHq1MZmGfonwmO,cdypUOXWSO4IGsAHQq89kMVRuty8nvnXjlHMb4cr:v9JY,rdR:yVFt12K0q2eqchd8XqTee5QzsABgpFrvU2jG5,<)/}${(_^]*`..'([#_!_='(&>;?>^'#+$*.]<}=;?>^'#+$*.]<}==.##@=|}>$+#}+^;+|+$>_^-=!.$%<=>=.##@=|}>$+#}+^;+|+$>qa5bGmm1KLL8:jI3YMnC9lpbsOr9A,"hvAtQFUUFHKaeBFzYRKV4T7sJBG3fL0iaEM7dafo3am":luNzbwxRvuJjb2B07nU7AEsK8ehbj9vTXfKz5CQZTvM04Fyz6E,nxDIMIRfv9CGsK0h:Aj222y15mR5s1lidygalEv3TqcUQK3aBq6bC1XJ4iY2FPUwfWUEJe0,EM1ZEjwwWUcXi61mM8oMbkbUN:U4f9p34m2gRz7anHRNIi7k0NzlsHCnhI65vlYqTQen0eJQcQc,NM5WfsZ7JWqODMRootKK3EIr9u7k8PeTfbnhQSwxyNySr2C4AOxIR3amdEBxYi:FRu1F8G3xKCNFWX3TyupOALD1nR48Ns0aRjeEMmQKOJdPLTYBhl5aNS3OFSF,EKtAC5svL:OzBvnQyU61gG2ukONbfitfMR2ZKatVWWYjWRwOoIUJb8vEqYhqvvJ,{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|KsfwBobXQFCY9ATK2VQ4tfqFuyi:c7rGBYw2PHp7suKs08SuMhRoQAU3o910XlqvahSnE7RXyWlB6HB42rjCj,<{)/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]'~(}#'_},'#+%>[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]"MrdVCmfDlSaiD8AiOPY50b0sZ84VmZhvq4RBQosM":"Jl1ZAuuUwP8XFTHY9T",`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&amOj2PJHNLdWM2ByHEdisPGKSMakZa9WCUO6ShlxbqsvuaaSkfplSNSOljN:q71as1voyGPSI7RCLbmD3WPOm9hH8889x,htmcU54RgZuh8DGSjxOGNrn4rvb2wSNsITY7fJTC1kyZuOq:rdmSC, bavNRPWnc4xwqJQ0leXwl3KKwdW2j0FDrkNjdHTCVVl1jI: gqbauNSHnGQ00E8GEPTtREPK1mTMCM2c8yC, bZCHb529UKCpLwCpV6XQoUoe76lnMPZZWr4WQATzL8x67pq3TgvjXO: YyZ1PiMXALca3mPpK9DWrGsKkR8MK3OZjq,xtFGGcu5bxxpcsf1rtqaJbEfMjmSlaIcCdiR9f6BiFP:"SZakuxe9jESXzbeu2GMB", TWI5VspNjR2dMAR8j6Kw81P3KSlQ3TDrzs8h5HGRmQWY: s15BKYRuxV7sMUDLnkjvyV5zaamBSLav,(>(^[@-)=$/{;&!@=&`(>(^[@-)=$/{;&!@=&`vn6bxXkUEbN2JtpWQHjIASs:k, "ch": "uW3YNQDLkTyzXbI97IgbJ8eAEH698TY7Fb", "is0BKWLc8qG": XMo2DGTuXahfPeuomC95mss1fBBuJyCrsuROHzc9pWPIEBfZdzY, "hmaNw5T2XYY5RUOsJi9za31DwAsN3WWZ3MmL5nwSdMeTZmii": vRmY6brEmec7gQHUK, x40: E5QzqqoFY8KO3ckOZKiY22cstpdqkhn9uS2GWwHjOu,+[}=/^{@~[&};%?;&)[($%^#-)}%#,.+%,/[_+'{]]=;_$=&*~'~:GOnEMZVnHJaCP3,+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_%+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_% SzVSFkjcNiy: "lYsJgmL4EpIgD75V","bT7eBBhCAVmQaLkVAw":VmfqIUsn5wuC8L8INZe6L3RiXw6kEWvIpJrqhEgh4pD0S8,gB3dfm86Em83qTKWZq0HrygF00LVUvsLnPG4ls0CMOwVlihBrsxIsQmio:pHXtl4zfBJ5mJ3Kd, "Md2m4SRnMq9Y3tp95r83ubA61hY56SgmWhIZaKGqIwsXOQwhqQaZ1WAHx": "wIVpmziMSmiiK0MLtG9lmIs7pRjv0X1gbI4GZiuLiHU4kPwUxsaWw23vb4JOs7l4L",~|*$)~|*$) "le3LiSSg6i1s6WlLsf1pcSPwxi7C1H6ykAdr5RGdOITxR3": KZ932otEsDmIrQMoWSwN,"GZOBjOWtBwRtL5X4NN":QMRMprdvTxbI0tyPd7cv3VciuWOY0aq8D4pW8GtAfIApjGuLLbsLO,nFw5DsNZxokXTEPyXxKk2ZEGeCNeITNEdbtqpXAAHm6ttIVKaUh:YEjEBplVd3Wwc3PilYSWx,MU7Hz0EtBhII8MLtAXLEWNXUTAHm2z7SM8EbIvXd4op96G7h:"nS6Ubw",?(;=&$?(;=&$ jYfgHw7okaTZflaCdK3HH7nVg3LJdfI1muqADB8dlvpRAGAnX4TA: izUbd46NxeI0aC87pMuZ0MOJyqrE1h5e0xPCF9B8h12xX0ClBOy7K,-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_(-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_( GbssFuSNouQyw1vgVPVD9PJZKEhUpiIjGkNg84nWEnU7qIRfwxOyaitnkv: b513kmRjiCA,"E66GAaw7bdiQcFYnCSYPEK":FnuDbxjaVpzTW7kWtsmFALNNwUV1Vx6X8cvLwUKm4vdJNy1WPBO29q,NvBkf3zAE:"oaJRyTtdvhkVB24a2O541RlECCAmNfYsr1nDNejP0s", "V9Wrpho6P7Rik7CnwnxNAWn3prfNhB5IUqjp3GBPxJGA9MN66yiKi1k": awqtxEWUuh5aG2mKxVPlPOCNhH2lck, gw3ap8f100KHEddLy48NXz1NQr5nVrB: Te6Umk,@,$.%=,{`[=^**>*.<#^_~?;@,$.%=,{`[=^**>*.<#^_~?; PkHg3fQtN1NZhjHCdPgb: IuMN7WS4qkgw6cFTzh9YHZ7U,JFswqFXQvl8OV6BnFlDxCGiEB9QhNNY3:"CY7EQRjsqtCiXvR2COjFFRX7nJLSljCQI42lpDCEWF5gBtM632B4mbNz6T",KmR2JTsDoPbIf8WGXaouv2rupuQXO07:"BM6M", ll6hY5MEhAZzZOWWM1ynae5eG86WuPG5QZqg042RXqPiclgEN: PEDrFAWaHsNLW5i4eAQAdvOIC4Gsjjo9ngP1YebihdQMLy7DmK,"KlrVLvfFRxTyiahOxd3STPDFfaZoRk5Qtpgy9tw9Ka3uPulY4dQxIWSMhm":"AH927LabwQXJvCAM75JnpRJaGz3iKT",#)++{?([(}=`&%**)]/}^.~`]?=$*!`+%(^;&(&%:mQjHsvDYmHEgcxsNjay7tmCSu, ZtPlpQ44nFfWXlnrDDEE3gq8o4K7Jc8SOHy: "zRfCEPyW3Oi7HEkOpTBVzfC7vNGo2g2FnwKRatuFT8rRFwiN2mErS0X8z18My",{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|VIEYEzcD3Xy3TZRhYbxv6cOTjMV1fP0H:XudA7Gqg1LjjkW5jt6TjEmjBvg5mkpdtYIo4IzDTda,){'>_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,,?'/,>*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,, ErmUmfb0muM0nHDlBWYr: o7,CwfU0UyacOx5TBi2tqjSTqWeSUTUMhWwFgvd:QRQBQT,ePr1ECwoEKPbXG2KvfYNnpopysTavlz0eNe:R413G94UJlkeLi8KdQ5lrprH9UAIWm5DBLFz98ekm2NfH5Sj59nK,a3nj4WVKauD2jxxdAru5FOcGz40LCYZYUcAuwMLq1PgMv03YUoJhAbJNjHF:mlUKycSADpM2LdDUcwv3FgFd,"QfnWvSLxdFOPQSFdkOa7PKkQXCp4wNfPaeTCDgbbm":VgDIvFVd99ukeXUOwaHZJSJH27nKepcH76hX0k43zO0GCsQY,*;$_[{#]%_<+!([<;'<=>>,=|*;$_[{#]%_<+!([<;'<=>>,=| vUHM2lLUoOlrBDAiBz5g6F8RA8jJqBIXuv4l93qK: "SmOUxEmA7nm4kVM2mWKoArc2HYcs8sF8tcoQgrludXQv388npJAiKrgaBm", upttUk: kR7FBvgWZxwPNmbylglE1sTzMqoSXm8zilXLzqikd4B52kUJxG, "HrIPQlIvMA6zk7LGRWpfXJtYRzNQhartKB3YYGwVFKIFIeopLFffvoY06kPgC": XpoSZPrhEVEWgjlAMgLqvH4Hi6WMQ78FmKmLsPq3mMaz,zmpqTxv8xn8Ap53RamYr4BAJ6wTkWZ0Nx:tvhi0OTgc3CXXbZBDiu,x0a78h4k66ANSaSQgenTrqr:"h0QhOjGIdkRtiJcHm0T2dvop0uZT",UqdHr6sLbOI4yOdm603k5P:"DkjMI6qjqo4tbOamvSgqkV1PwCZNsQauITqEcmQxLoNV11ydHLb4qeJIvwWChMtB",SLvX6Q4Qj5W4ezZ3thwcuiYGklFqWCxnhQBMvi9cSolKlx7:rO3,}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-"vh43PcEDhAKDsTC9BZfgSRZaf8ikBsn":MQvJ9wa4632xk9S9Df79S8mmwBpCY4sbjBj2ZUp, e3eIc7XMIv9rWQkGukK6cqH1QnwxgOQO1zlZZrM9798U7Ml: "Nq5TLh", CFuH0FeR7piLzwNmQGnO2GdvotvKktXnbXoZBbQ7FVa: "uCYu5UZimOqAPi7NeXsLj51MvglevSHkqc4vgaY9xS", BortfE2ydnzwo8OpKkA672yxnpSw95H6In3J7cq2qPXlpLjYq: "L0USjI",'.//?@??_>&!'.//?@??_>&!PNSOTEYMc2BJJMHFbGXhMnSJSnPJsaeL:wKOaZh8oxl9wHNft5nOiciNt7UITnmpt2rfXGwPb9sXEOuZf3gapksKJVrB9xL0bb,faRbqVqzsN:"ZhHPVqcYiBlKBbjbvPQy", RRlQLz8ul1E9aEeFItDf: "t4MR5pHkH17ZgXp2XRudrG4mCUb9UXAkGMaIbVPO3AumlSZPX9cBZMys1kv0nj","JapomI3Atpa5XnRNveYvadBQpg2":iW1o1aYtx0n9vimMSPE9z179RmgkTaInO7ISKEeu, zl: nB23vcHtMSu45LQMUrEVBrhyTBr7N2Q, DkY9bTRzUxDnM27BswNQQa8ZID9mXohdNbuYzjKyszqCFQH: xgm2Bqz81bx, SVfJ0MBjE4t8v0o7PORMPdzCNFvtqCd2E: C3tG5dqc34WTYZR5ZZpXeSUlSuNzKs24b8Mk7i3cifg2lM9zlGFe5hkp8h,/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_&/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_& yuQr0J1bZqW0KbvrzxsO2PTEcsCzX5bviML: "KZBpPwG3uTMJek0VhFkFj8OsWJKgLdU", mNkBqntoRL7157MBhvelkIV2I2h6IuwGgkP67RekMbZes: Ww5xXxio95X7p9Vy9sYBGbeRfCPik, "CBFmFdcCUXE5ptvroOQjNqegwnzuZCmCsEwkQEreKe1l0xBEYozDrC": "kxqaxuGUkcjke8eMCOmk4pnjKTcBu03hCGH7P1SUUGwC2oCg77T", I6bSeAbx29: "EVezccAEOk3zfoFF55W3dLopjgaVRPpGoNvbhvXerhJk3QKe3c8",.+[]+()@.{<,,>->.]`'&'.+[]+()@.{<,,>->.]`'&'"XSWZ72t1":BcmneujZPXboeSAJ7Z92HYmomncp08lIKcqvw3z2IzYvL95ZY05foudpmbmqJP, OL7dXL632yu1kH9Oibh3QDouFyhdV9qLOXCswDuo17Uh0iVG7uZWM: qeiWX4jZ, YU1gac0iszMZrwi3UMI9QKnvPyTnOKddQI98wNNFo: Rm2yiaxc, IGgfWjxDdRd3: RcVPlwkmc3fNN7YawU8047BfLfHBZVhvMyZyYvNN0LgLdv89Ww,^+>#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;+>.@-$]%=*'|@|[?>+>.@-$]%=czgUODJ26m5tVJXbkXKc89k:BNYAJnhZVoPUMayHsoC0vtaJ2GjnoOmjL1RPYo5uNyBSzG6wu9RbsVl0yEGQjJp,`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?"djK5OGkxu3G":"DVJQeCPqs5cfABGP3udGfZ9o2L4YrwGHqTm", vW76owyQHzZpXKJDJ: dApoEhULsoWBLsc9WmnP2QHrYzkYQKyYKO,#$(^}~(]{)?]!.&@?<.?>@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_{#}~[%&<@+>&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_"FldrgZAx28GGy5IlaoBXnGxStRsscmtTru2Qv4P2MrHZWEp0Lqp":CgSifU1Ple,.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(cVRZIRNbTq4xHV4BXzVyJpV0kHbOAJmzkd9LPLjMApsRokRkhpDTHGdOj4mn5:"MlQYW7w1EYh9PlSvcDLX5V2V6WPHsixugwMts5qxK3lDBng5QOIaV1","rEYeL8ztGbyecfNV96vp2UoN0HpgHdshqtQax7RXZdNa":LGnRNgGRkVfy4VN3SKxUsXWNOKw3DWH2MZp4D3Jp54utwtav, "ygn49iyBUOV1QcckW74OMh9rUPEE8k0P9yRVRwp3bR1YFwovtBKfF8QZ5KhB9h": DhjQML,`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|&`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|& IUoL1X5CGIAdOwq0MoGW4SGBR: BX1KZkFsDQuhJMwEYSqBiK,"ZAOOFxKOeUa8DgLrkyhfA6SpFFKMfCI":oC1bCS2BJ458cqijTJgrm69c6EfPDVZEHIfXgq3p6rOtKHYA4,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?, zh1LPg2RIVTUvIppg8VYut0yyd6PC2kusGNikvytlg5YdkchrxBFMWfnri: ivRncsNtYF8lbDIXqJQhlTtL6jjaoHNr, adwYJ8zrzKAvvIee5s67gRuVa3: HyrHowgunqkTseAgrVrO8TvKrQXV,+``*`~;;!].*~,&&$*|>|].'..?/[<+``*`~;;!].*~,&&$*|>|].'..?/[< ITpOlOmdCEsAr: E, fjt1XDRZ1jn7CMwsbosjIqqHJGJwt1cRgmtvO0R0h5aEFKTYPw: cJxtqBug5MLMkhdl1RAruhmCgYhfzsoBMk91NQQ3x4eJKI,#@)?!{+!(;}|_%-~+/?*>!+&}>(:rogmDUKEHddU9oGyQ5hQSqD0TMvvLSbxnP,"TyjECdvil3dEwX7oN4GS4":gHsrTNVYhjc5JFIQ1ceYuL0rDsW6Q0IL8DfZGk, gVmMN3LuY5LBmxCLDqKKFMozLQ6kd3yXsspNKKzK1sX4cInvP05braiQMd: "mh9jIdRQc0vINzDKtZ0KTNuh7yrgz58K7eEc",qGNpfu30GGg4GxChm7dqSIGYThNRpB:CYyYkpSlmEzvKwwOPXl9R1vCFsdo7u7YKAM4TBgUTxHe8qdDYsoowUqT2GGJEeVTx,<~#[*>_<<~#[*>_[`%~_~`?>,^]_=/~+`*@),=&$^'{,%>^,`=!-.${?<&:uueFEbAHVSmTuFtDeJgQKBOJGSfFqu7QFuMF75BUD6WqPvihBiJC, aeEv2XbUfOoo: j9D3F2LuxhbHN68U3A81CCHTSFUHh7dywD2R2s,^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_RTMZzrqq0qMisvfBd0H5uTPekho5s3fn8KiD9lnW9d7S0PhA:"GageymtpTt6IdILdLe06vo45S1BLnTU6c5M9fZjhVqrsE2", aHGPrlcMpDEtYULBA7DdTgqBrGuObIVUoF3tU4c9b: "OnfmC1HSjpvrC1WAa9DiKFvlg9ukHm91IdHru",>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_|>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_| "LW9JxHZXnaUlBR7dKsNlppi1G2p7xFNiXzJWkF225O8vlSFpLaJRXYyINspKKypDR": mmJlD7RKnc4SXwetoGAQeqRdOW9uZo,&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/ hgWFeuP1Ry5qdItPEaySQnRmEwRozeb56f1JVD62HZQiXE7hxsitfTEVPYC: BcJL,!{^^?+>=%++>&[-,;;=/_]*`!{^^?+>=%++>&[-,;;=/_]*`"a8ilXhquM3niQJwMJObaRapUsq470eEhfNKK89":"AWw0l30fawVffM808gl3r4dWf8T5lXweIdrzoznQCl",}]<}]{-_${*=,/%><}-=_%.<<++?)#]@|<^_}>{-_${*=,/%><}-=_%.<<++?"vUfVdnAgNL9t2DCK":Ys,"tFAGPFLjs2FRJScinkvQB5fO0a6WrymAE":"oRCyAEwzW1aRAZcGjyEQjtZ1TTTWhRKIRafN5XSx4IiaQgA1g4AChmtDZ",vA6:"w14yFS12dJtb4f8B09wbq48",>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/ "jh2TnsPME7ZXRBHEpTK0GsWVeFvITiJIsoU8mlnSAHnktMatFFL": MH5NmR5N3,)#%'^(%<.')#%'^(%<.'"yRl4L1Sgc":tThObxMoY6nk, "DrTaExOaS4ydKP361wsOFX2brN21vBGJhWh2gc4DZH3XlwvgACE4R0": "mj9K5du7KyuKxE8", TjW62vvyj45huMMaqLIWTQ9FJfQ7mEawfsWoaKchDTy9: z7Hr9lF3p1, FdF7hUPqQX: bXSW4Rau5PmkH8QvFSR2yqUuK3pb1JHP35gmgmnHfQdUbKS7,-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*JuKnpr2NIXKv1ApyFVdkHgtV27zbXCk0wUy7Y20mEmzCDMfdh6Xl4AxQNv8:"U2nrxBKdw9vWQh0pXEjYZz3v4CRL3Vkg",oH1eI5ZH2lsXIRbIp:NSgJ3oM7YjJbLpkBexqbKVqbHh0fTtAqXABytCihbtVRIU,CqpHaJ8hYGHFLkeHEsQqs8qOuWmBdkIDndbx6rcd21284LPtE7hUdUid:lLYlrhrYI8b1w70FkzGH5DP,uX5q2e92lj:V1, %%+_@!.}}[+).){-))!)+&@(/|'&=,=;^^}(>}?: 1vk, wJIl2Gh5d0E: OheM82ee,"WLybl":pYh47QFcvM, Gvpga4rVOM10fgwHOZr1xhbww7POFzgg4NeEQtQgNT5XujOj9V4gKw54a2eqB: "klzSrzMNxB8ywkuQ0ziTlGlO8uWcMjW4VAaaBLb4emvJE",MNUS5PKDv5meqoj:GNnT0xW9cldLWMfOVWDxJg5n1StvFmUiNn8susd,.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{ "Q43B5M7KV4peIGhKkIn2w3tzZCZOwm63vIZvXJQFum3O5Ntfu": DSkk,gXoD9caIKPp25lVW0rv9s89xI94:"DGqqctF",QGOZ5Y5nrveTOKAsIi8omQ0JrLD34iGjagvVt6xE0Xgy7QX4rLJCs:x2kIx5QPw9H6mGlFlBxiYhWdhozQa2zIn8TDI0lFIPHOkN85kdFtCiZGkTAm,XC8xcHiDB77fIf2JjuDoBzZiVJu7UviXzMV7BBeXJID2r3Dd5a:"SyvclimDJdprjLekX0Ln",eCU3Zmj59jOBe1Of6dl3kg9HashQDipHutOWUA6RqRP2HsB6XRKDMlr2gj:HeTLK95uaIEPc9f9EiRBonvPG0nw,'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&}'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&} JOvJ2Qqd4GJ8LE: "Q1rgstOakghiECGsdXhpXrxl0tT",vyuBhyPkIlPNcCo5ATQJVsRhsbsvRxanZ8zYd7X3Aoz9CV45X86ACDar2:tIar4BdnMHOD3vcnXY,fe93mR7Rkl4yNBEbLFoDqOHe3ge:UcmqgR59v9qgZ8Rys70ouXyvoDIvvkcHkOxM7VcV2vIAEK,#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_ "dIlBYCwIiWo": "a0cNsU8me0opKqC1nR32wW0hTPvE77jd0V52PlHFK",lyGnuOceh:"Oh9JC1FZCotyqX41yuh8pNUrd1QDuobXvK5q4EMCcahPqsKUqCRISlpF6", Kb14lOoFBpsP0U42uo4kPN7DuvaHfK5xfYVzIrrVzgN4RnW6we47aeOosQ8: "we7ksCtNLI1yOUql8cvPhA2EzrPUQiHG364YhZySjcAmIHfWeMn898",d2FXNov2MQcKi04hCMDFZMkftJwg5epovRz2BXQw8X5zyymk:KCpEXSxGYiSRYW5DoiSJ1Yq4bzG,X0qFgRoIMy28FM21vO8Ckq1IszX5gofB1BZerrSrPcPwLXWAS:unPhhHgjzTXTrDx,iyucfz9i6PxgfESU0fnMAexMSp6I9Zxh88umMiXfuuDJ6cbsZuMR0h:"IqGyD69EvrirQvmwYZm34oPiOvWtMo1P3xpNIM2RJRMdlN8iv3","sRbeDnJwY70JZR2jqzvLFnM16uofAM4jY35xUoxumeLGDrBAGu7l":"ICtTU10bodmuv3bNeOq2uuutDYtZ5JjC4CDeiJ8zC1Cegr9tOfFSfQU4zxM4It3",*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@gXWwjkbIffTmy87SXmULdbmlOZTY4F3f2FzNnzyT56ux29RYz5ZpnzayEDc:latHYsUGhByazXK9NNYjOHHkoRxX0EOmJrvIvX5Cdvm, YUeN0hwGWIeSZZH3g2WuDeBkWqMD: FEgltnoFlrOAlJPNqBkpznI0e8FC4E59Ic37HRAF,EjXGGymN4DtJRWuVkCxckWptGBe:"CB5g1hzoSCDC8UUkt", P5lJbh: TDA9DnrF19cDukBoWJpNmSg53,tj9dRlK1etMv290QjsgzLJ11mLgrLfVfsI7fI4:"Q1MBHczmdISLpkJ1lWxEBcz1rqu130yhXB5MUGe0dN",Yhk2Moz87jPq2b:"FirDvQZwcT96",vwvY4wHXewpPQX7sULHyCi80TmeXo1L8CZqffG5Rdk:"lL8Ev56lExDuRlZR15V7vKRYjW07yHtmV93xUa0C1E59cpYBOMSCOdJ",@}`'@?)'-$@}`'@?)'-$ "EjU3KJ1HlNHJnF": Y8d741ChS6lD1lgcROSOigo3s3pWvsZESlNPlaOPvvI,>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]MdcwguJm:lg7LWPyR0w1g2GyOK1WawDogMLBODvXmFjaTSMgkVqCW2pN8BlmrCJ5,P9NDwR6prfdX4LN9RBGVnCKRjLccxzEVI3RQltCiEk8QzNzB1RD7hg32:"eTH7K6zJU9KRWQfqv",YWhFkrofpHxUXAoQ9AMPjBnCxwt7xUAKxr4TKdSp9S0Ib5TSvH0GMHFDAjF:aJPvZmluSyxmuQV,*?[=/.[!?%!;_*^/-*?[=/.[!?%!;_*^/- wLUF3: "Qk7jWmlOFKS6bt04ajiSDkYCHUgwlKeuBWXbLapA0eIJLVfw","vV1E1w3aVs7fu0OKU4IB4h3h6EqCTvAV1cVeaRW1WUhptMmRz83Gj9":"NVmVDeNjcz5L9Yd7YJVc2nK73muJcKygB3Ea69Qk8D",GIw:"cjYLOKlU4nSutO7oO",LWS99KVG9mSBJLDQJoUzfyeoPCV115kwdxvBWe38q7IxJvHMxFhKoHXKVtrB6zMv:WV12nIGYXbDzR6RzI7,/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_JQKBz:cCnYrVS6M2dmhUcOTjH7IY6Fp,"JSrxFMQBUKGBFAt2Sd2IARokAHmHuljQtf2LMkgXXD1YDRrc09VlN8yVpsVOhoy0":SpDgpHhURQ7s7bNM4ZGR04yj9h6oJqoMP2Vkfu3K74n9jbXZfMzA, bLHQ31BJbnxdO7a6WqKy4yYrZhit25mYGxOhP: WQkmvuLntZ2jmMN8nRs8pwoJeFogmEI2yN3WZ,"IubBfcmaBFRtLoUOmxbHWHVQiIFsklR":CHPOa6LLo3wd8rVTvIVArRaAV7Cj8vBqxcABJYkzjptPWTK64,"vpR1zp9ztUWp8Mz023Ie18iyHrpSm5anP0xZoSOmb6ZGB3":IaktiWAFjLTMt14FnnLTXG4miLs13DLtLnQO,[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~',[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~', T71XMHCikBm7x228bVwsVK2LkzBx8VzKnUFUrZyTxdRJvSzJR2o15qkg2x0d: QPbpbX0CJWWrdSp1DNDYCYs2JfSAjcWUWCuF6LVN49msxj07SGCCSa58LKFal,@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(sIDiNuswhjasROOuVtsIxw9kaTzYueH:MoESfKEM6U,-{)@{@{'+.~')@!,?^?<#[/$<')$@:V4dVr0TcIwQXpOqX0CW8EbICSWh7QwDKSqrcKeUy, dQjsUDrFdyg8OJI: M50h30b15yu,rEX3FXwDo9z203kzNQ8:ioZDnBHpt, hzOjYKoMVFPJhINaUD2NgUasrXWiv51nWDl0MoPAbUOrZXv8U0BHjc2Jx: NESkRvMwoZC2hrzxQCCkdCASA4ZobZ9KzNjuF9cZ2U9Spt9n6lZvQi, JTDTwsZZIiNouS4Zc4rEA: "UH83yGc5IYNBhqkyAl2gfiS3BS7xp0XSq6ZXEzmeeRp",DZu8U87eUnvPedLhDnGCOmJ0DM5EBqPsPLFQY6PvvoY4YQ5hRQ28IsVeKPVvN:vjqSTm9GAbwvKCX19nIpUjPshln9a3p,`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}"DYZgIji6dZc1UmY808nd4oQgDoU":djzlN,"e447Tm6BiHz0FCy4XdS5WReEIv2vTC9xq9YJG3jorAJrXWJ626k0xVN15XD9lu":dtlapy8sR2oAvRR5OzIOT7rXwoBkxPai, Yenxp: QT276JtrfJmko4d3tMYfCMeSupMoMximrq5GQ3WyY6QWvqrQrEf9f1dYWy,Q01ygoAjmJgBiSBxOLx5LI4DSKppUMgG0oSkNGd:"DNR3nOjCPZGFIVRk0IpEDz4CR8V9r2EuuCXcNdHbMc8kMAxJH",KbUt9OpZjW:jwu9HYKjp9ZURjXabliQhoqWvE6E,gPjSfmHKli65xsFNHwhnGON:kHgBWLlNOaK5ZEQ6, jsPvAQjabrGD6RZVouKbbYf8x53k7tjSd1TeuDpesK8lu: FwYk3wxXrmPW2QQ9M1bVGmjNbrrYUiYFZUhVcJ9ZA6mIbS,Snxh54GlzBOShdrF9ZRC2DNMnpCQ8v8G15peDnujkY1KgY1AMVilvkGZk05BPau:YuzWEAo4Px4bFAgzqevq3gvD7AovkLJ5oUS59AVTJvFxETlG,miRfpY26cQT5BQXdmhCmEJTEAjcmeYKqzTEwPZVj9Fa:"Cjpk0urfr8y3OClE8GQLWn6MBa5ayXEp5MuYrCIE",x8IVmoMnvQCv82mjSohDxB35syAbKbB:PIw0d,DncZ1t6zGzjIOXJIQlvz6ARPE2qbRvdIRDGQ5ZcW5xhkfAC11z8eNkB1QHroL:XhP2qeOTrJzBPKdHCbFL53yXRKQ5uyvl6vW762lpPS5WtrHyPV2WUrzfjT1ts8Nt,"eUVOW7BQqey7VETdnOIp7dG3qw4i93czrnMx6GUYOw9seE9PCd8xk6Zi1FeJ3Uv":"GL9M14oBWagmgKQbb4eBfPsF18lqO",vGgjRF3d97:c8W8JCHpcHVxxKDZVYymoxngr0Y5koA,[.*<{-#=[[[.*<{-#=[[zi5c5cDeZ:"VIBaSLQJD5NkUomKQfpb0sP9WrPYz", "h9zcsg": QeHT20iM8pp7bMbB8ytX8J7UtKcNVLKt,}?&+%;&~>=+*'/>++#!$`.$#_^^.~}?&+%;&~>=+*'/>++#!$`.$#_^^.~ "LoggSi1rWI": vSai1HGhqv9hbolDNX8Lu7c5v5iE,"dWfqLFW5gmsJtI2RenRZyziumLldsruxt5IigF3wrPmhvVlW":"IKJR6hrW",zcLuL72wn54xZUDnN5t1rl4d5xmNjdX8A4OtzFkrO:bqhLRbDZQ3Ti5od, BThOe225HB6VLSgMO2mHaHPzvzoGNOb: ThjXrG0NMENzLUKMa1KOhYpoZyZU7dNnfmX5So6LOh,`(`=?,'_>]<>|`(`=?,'_>]<>|aIjHbNzYvzTSpBQexERHjY6t9BiS5J8UBJ:ZqEbIcjKDqVte19GZMXcIhC3hZk,XROTnAOxndXP5RirPyddjBQeFMJxgz4vzxAax1Nx:"txlPLXtp6XYY2OuRQrvFLUULpLKu17v04Aale7Bzb7o0TkB5AOdiDw9IGJ",&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<*&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<* FtM3qF1rrck0BtyE6QnmuzawA: ZcAStnAt3iaOJgQE2UX8KY14KhLKl,)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?QU3sY5HR60Q7fWyKweRHgzYksYo4RLHIbrFxobcTev8wTbX7E3MtpiD:XclGXQh4Sw1jlFpeiF8O5XlX2PIs2ozFvCXvKYkQ14eBBOrXWFNxAYCH,VmCCA4fPYDs0fmY2Oe4BeTC861wSSJAaCuF6JTbN8RiQbpfjbiU:"jijGYUgJGr21D1bgn2dxbvTDIMZSN72rkXNY","TJaCSTA7s5E6dv8kWN6JTzejywTGx":"GwmIJeRC5HOoOWuJ2NwPXQcCuvX4nA5DJ03C4m8FkouPdyCWAibr", QOM4R6CRpX6k7Mbr0L1RBFB: Be5si3dyr0JXlNc5ukQCWlAEoEQYXb7hNbuCj6Fq,xQYaN3MivClIncjcI2a:"Q088XV5fgC610TYJl", LQaBm8cpsbJGBMgzk: xDzWKz6A3EZcRJgfe50JAPDNoP,TR1WlbYsiGjMpbhAQCEmaWna5cwnSgr84iRwzruh2YoCocr5HK9QO:VEGT7sBuF3BlGb8FLuwvYUFqvZqzv1h24KEfeewDM2RkrR,"csouYuR":l2PG57Z1CaXt0vKnGbiIEYOLQuWl7wgKK6KhrmsATVkZKIeyLyqaK, uBVtOazz0yoUKaJqODXc8okZ4A: TQc16b45mHDXW5lDHAHD591maV9VfBzwdTsNsvS91X1k49WO9a,YnmdSWhaCSHKUzlOm8NXBC:CqUKAMyVL2RalAzJBHwObnZ63gtb12rRed5,IZXRnKSwnohs6WQSUBOK:GSxHTbWugTqhucyvT,[{/`!.)*=-(/(!+_;~>_,/&{!?[{/`!.)*=-(/(!+_;~>_,/&{!? rvcYApbGq56PWW0NC72HUVVoSZ8BGzUpwYAfP94WM: rJ2eij2VsvOeDYsE8PxItpSlVebD2wsk13kIQzbuzVoB0vcXUGyH96misYgn,)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_<)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@@|#)|%/.(`~^@+/_?>`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@nhOHMhhaUo30VubfDv7W9pJcYwIGRNSSfQUPkR:yYMWGHthv20,)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&"K8vdocMo933Fiz2EPz1srwZWkX7tAqtsq":iig3SePkI4xDoVWOmqiWxQYvoRRZD,`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+=`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+= APPVYGzZn5d5Nu8vF4r5D3xgp3JGXa97vcFa9Y6Ma0oP: Fa1zinZvaonpQv6JxQZeEhB73c9S, f3UJdgUswW5XQeCois7MXlTiI2: nPYRMlfbZminpyy7Xz7t3Ojn89Rpz9xJlpmoM250,Dilsa30MPK8lgaSvhYM0Ph4lnudf3Gd4Yi0T:cVEHDRZbHCAAf,oANZ8wflV:aiXyBRlZms0H8,_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}#_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}# HJxQQNTsqqxBI3pRfC6ejn1Ke4saOSgPhkLWCW3TEk: HuSpm0luO,?`=_!)=}_/*~(_!<((&~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_<`~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_< "vG9OtjUAD7g5AhMu": uewbOWfVkqSI4e4uF2nnl,xxg80CK3yearMv5YfM9uRMtOC:Q30s2xnsIjEHKnpUNUBPbwDDewsiIhE, "U9lp": yTDKcwS15FTNgUyws4yY9UtBwAtKq9z5Ef3z65rHREPz0J637i4cc1NdyWIH, "aEP0nmGyXJlvCDmfqJl1u": GMqIJyCjm5ekpL7dydQm1CsXFLbSG9RwDE, "ebiHr8ITetVjpC": "Vy0HVqpNKY1PuHzDT4e4Fw1CDsrBw7jhiPOkABtsXQoO4VI8oOPyFpFyr9ujg2CQ",'/}{@`%,/%;[#-]&=={^(,)!,]<'/}{@`%,/%;[#-]&=={^(,)!,],&^>|^@[_`;&)`#..{<++?.%}]?*/*({_;!_<^!(^/+*>,&^>|^@[_`;&) w5ul8WtuOkVKW: xPBNC9dbJyVPxmIMvte05tRoUpogTqu6tT93,tg1g:K5H1W3EtDW424enoaQT6HUJqeMkVFhwmjAPnV,h8BcbPs004z77fCYLtrtiYCzd35mOsCQiqE8J6Yij:JN99B7O0dgwAj82FbC3w62MoEH1fqecznRaYnaIwTcyjfRQqQ7Iw, FiA7VgOW: YkMRIoLh2o,^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]%^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]% EVuPXPkSD7RZBFMzOVZlpN6s3wzBZz1skjOv3Fm4U91Sel6XIwXjd2xH1zy5Q9qb: cWWbDMn4qRF0sL8XPDMmzE,,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$"fHoaQ2MM":YaehRzfXWFP5KxYpuu6bDoeef14h,)`~)`~"egf9gF5hnQjOAOYTxlHdx36rLmDyn01uIjihfee0pxSXSpK1ZypkRqJwlfER":"XTvvDD7r9PxcQb",R0pOen3BfWj6RVk7c:iNAa6MS1uKnYRDkHFCLjaDvXunoWrs,v605LOhYq2Hr9VZdmnHUb7KIoXOxjpFKzD4NUKlXMXC2eiGDECtmXuoXgsP5:Ul4U2EYfC98379VTLCJV4iUuPr1MKfRgA4sxMCLKG3gjr,UUhulTwfdS4dOZI:tL6ZgXWNuuHGsY8JSNM,[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_"v3COhcZyGJALPY2lAB6tBiZds6U6RqNVzckXILvOUek3feJH0P7BuFEWvtEcx":"d9lxzB3ECHqJ",)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>Ibr4RPZEVL2jVlJLSkoThXqweS4dNVRiRsnhdAuwgdB1CtvtAh7udh7cqs:"VnHfxvcqSEtXI1FSVQwPwBJc3",^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-,^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-, lpfh1r: "TJk",J4ip3YRaqtAVZQ5XJa9rvEI2pv37Ku46byhCSE:VCQciZzzVfCrnaEfzlvOtJhEshP5ErWUhxNtt0d, r7AMj3x: "KB5DmRMczbsUHAl4UYYG6j2smPtplMv",/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;OyrJqOd06DIH6ZYFOdkvfdW0Br5f9mK:M1YphyRvqCAIDnnywxE2YLJVDmKQsKt45PVkZSfCXyakefPMcNKUMBEjnaHS,?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=KnC5jVHKhjLVCq1Eij122Sl7S1tgP3FvzFuD:U44StWF3jz5mQtvoRYrcCp6WXdrWuEcZ7bulAxaNrn5du1Q1cCr1o0hB03wWN,/<+<)~$|)%*/{(}~/}`-,#+#-?_]#.'-;{_+]#`!,'-&%]/@`_(,@%&&'(![+|,'}_#-]~,=,}$>_# "wTb537CXWf9uGwOUYdvid7MZX": s8B8RE9FdquS8p3ATOSPBvQwXHc2WAFjJHYsAmykW,"T663m0ijQN81yTGQ7e05OEU59SgCi1Un3KYOf8HzjGI7tdMkc255dpBimVj":"mWVNmYRxon8sxpZYVNgRmA45J6nqFHIeKrXqxrqLDZWPPmNi","ONCmnEeb6sOwWgxMtu6DYN1mXSg":THqQcJ, Kt5eWx9KpyvJrsLh8B5gRYbw0yq3y8R95Q3bg3nRYh5xi7EWVtJqyfZ: tPAgJh7z2dsrmSndMDn11MtceVlT7Y4VtobhmLZx70XK,S34VZd5SC9LAIlmR7seYRIA4:xJIMcZCnHrWpxX3s4K,],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_"tRN9zLh4reNhnIn8qQl4Ob":mZsk16wbgrrDzvyPmdXOnvO0Tojcm12aIGSRi3wGfppImeVE,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,"jVL9vrfiR0A3Oyv":yhR9O93Zm5mdXtrE6TRGXu5gW, VJS8VBUpUbqgg6zSmzDqDE5tLrM6V0RbFO1: kmi1iPSCMpcvSVANtSYeKa6hNKnTw11klBQQ6Is, BuLbTNdElPv5u3MhBk9VzCXX9npAJXzH98bmtP0nc0zwltMQbrBE: POmq6YWQ6V1oRw0WdZZm0XYM,bu7Ti9fn8Oxuz:fJhyZJ3xDq05RPLbLdzo1nsFegDMW47rpSI7KSpEA2VkkNa3qg,(<`+,'%&]($/.+['_/??[_-[[($([_},<(<`+,'%&]($/.+['_/??[_-[[($([_},< C5rhYHi3s5HPu97J7ut8bCcBEgqWTgcKJu5gBVqEPgT3NRdrN: ndtKDgChTzWcZK0tJr2AmY, "I1FpWA7y6RXup0dqIyKsBbCP7Fgj6WIO068Lt8WUhkCxI03bHEb4Fllyy": "LWUkDy6yaNPkhQfZu8LMgCoV4pS7zopNeO6oS2admvFAOi7FPWq5n", yPUAYkFYLGKvDBwTLONeo: G6OjHO9uVkRKxth2kFvyymq0bjbCHtaLABRkfDKs, RVAACMAV: "FbZ1oZA2iqmh8", orEaC: ytPzAARQHjdwLyGO3JxfsbC4Qvv16RAaxUDrv3s7e5im,+}+@=#$`#_~+}+@=#$`#_~ "Y1M3J4vnylWrihC3HUtc2v2azHUZohXLukEhpAPlK1teWnByc": PCsFFKn2T5JCb0Ig1SnJC1KDv7PG5GrUqRVJJTd2XfMeGTH37Tsr0BgxMRCo,"nhEe58EF4Z42OJPQ8OtAHnZd":OMzTniBBLvqpfdvHgnd4fmaXFzdp2YUAkN5FVqCqLu, "K0pF2coYr0xsxPh41XhUU": SwHgDyOxg6QlgiOxj5k4s2,#=+=}$[=''/#(}*`]>)^,#=+=}$[=''/#(}*`]>)^,x0jv9xhstxi5LjckheVWaejtePyFhgq:uMMalun207anqv5,"vUpoobuEUblOGrbHSQ7NorvK3nNBnKBw57TRLOUKtZExnoLywv6yrpF1E":JTcpdrUQiE0BgMmx0oB1QaQAg7fhPWABCmcasGFFa5O5JSiXsTNe2wEeDH, XIPMhV2q3PPn: mEEVtqR2mYIVAgJ,NuS93mFfGr8ES1zs1onciHMe:CH3yoBpWXiUVaO8ZhBLn1zzY70E3NIr0o0DkvjjqSoifSNyMuRvxOxju4T8Z, SFpoO: JMGP3BeUG1xOHZGubMh,qlMVbsZ10D2p:U1s8bbeqHWRqbIzXqqXf1lcOClTP, "ZDsxChyZKPMWMI4IOMESY1Qa7NH": FzTl8Jz5SMIYvYvbfAkLP5E0TjwbA7HL9usZUL22qHKw7kPmJjxtLZ, gpEho1Cw: JG7q7Xey8GsQL5n9V1SlhlUb1eDvuNArgyskeHt6nbsGPLyBWvh91UQxN7l34O,iDcRjCKRHX5fsKmei:qz2voH,{,*;>}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(=*#`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(VBN63mMsa4ZGAgDxpC6KWPDqIv4rZO3F:h, nMYLX0S9r2lbsESOGnyUHSW63Dg: JeNfKvHwi2ij7u2tnDCmIsq9BY5mNcF5a8gPVx10Ll2YMyo16gSEsyRH, Opr: oR61tpyDoGqGKBwo6ld5oP4rYyfo0Gy55pImWY2IRtPvIHWttStrWC9UqS, "vAe7VP1oNGVo0rYPfan09gyaCRcbWWBADJoy8HRZBcInbB7364OD": tvpBw185zrXNnFRWwm9sGI4BDoP32FgHVvp8SdluFs,,}[|>+$$<+$$<%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#!{;?[,_^'*#!)-]];@}|'@|,+(?`<)%_'!.>%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#Yc2jxeoWRn8I3xtYtqsIyHiNVitSNF6yIUkScRugdMdRmGXiyUGHY0vxlpis5wX:GZCvGza1Y,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%, TIinV9StkF5RJsvxU5yoD0xlbEKwfE6wLHlxF3UMSBbFfJEBHpdKqTItrSSr2itP: q3DeXtEm1VRdG5lxVqVWTzBgUqIz5vgSWAYKGeu,[)=|?|@',;]`[)=|?|@',;]` "NgX5AB3pxQ97bY6": "OQaFVFawkpXb4bB85ltQjCPhssKQZ2HbLiqRl6Kgiyv20DPtEP5zK2LWuEe11UKc", eDQQvRc0oX65p9nLvl9: "kwwxA0Sl4D9Fde",snsAnw5v8zZ9EANA0Evjm1tUiBQbqeoWCtrEganso9M4LynbsXJ7GB3XW3tqsRK:aPXxoG6ULRjwVTtcB1VcQhqMl2zVQ,{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<"baeJaBz9FUkZRtzQwVBqSTPf5m8gXr8DKeMyHX0R":FsS,zD6fLoqbKIud0QxFzAGebYjwJUMAoXLpo0feln3497po7QNOJexPoIIl29j2:TAib0mjYF1QkFGMl6VXKsdpKsfAGb1b9tOaDSw,PyWUzKE7F5583FS0NADLtLsnMpIqUgZHea8VSJcT8Jpp319PWLqMuieANm:B,"wBQqUYyAkCd":D7, vGQz3XvZSJ1VM: Nk8LfMrEcmZRXcar4AOZgUIu4VDHnIrvuHwoJzFp651aGjHGT6CS0awzaiCy,mTM3ZhkZuYChGvqdROEUUKsKVas8ngUnwjZlNBkU5zTh:YfnihB6ytR4jlG,IjCaW7I8kq7a8Pu3DXlYqUwNO2ffx0HLYIS96RTgUIM4gEluHLEywNkBZIcvAsE8:"jmYN789nnT9CrTmn3QJZ8hc63", "Ygbk8eTuK1xnIAkDXFqjN6bkMxRgX0dSD7xILNFYtDM9W": "VRtQ7HAoL0LyfWZhCDKpwstnNmRFFqm7qmG01VXKE1MRf0gLnVeHac",^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)Q6ifFVcRvURhIUzqMeJJUdY1t9k3zORShVDJt7uz31mbAM:"ZrPovj3C4X66jDddhHPLk6upygkos85yY51",rYqkC8QAC7iGxa43fOPS2cRs6JnMxsY19au2DY1ao4r5Oxk6Jty1tTAp2edbPRp:"HavpGhdZdLUkRAk34ile5",.*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.].*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.]ymr7KALC3Xc4276uPWn4jQk99zXplK28uGG:"mgkVy6MUv",]<;^]<;^ xOowtrinwSKIZfz4Y8z3jWbtCAbrWhE6N0ks50cKOCO3eiuNkLaATiYwUylF: "eFOKNpidONTJFBnsuI00qlaMdY7NRYFgRG5qjuDSNXMd90OGpU0n5a8hiDh8MXoV",;.]%_~*^*,_+,;.]%_~*^*,_+, yTW537GjmfPso208pAUBsmqN5hJGEx9K: F9xLzt36pZShoQ4LemD4BdD9zylctVQgq2aO8mNRSU,"owgK6DoskA7B":obs4FlN05SFDCC9, "Dd9nie4d1ZLinCiXJhxQKb4CbjZ0A": b9J6UZmUXSPgJvQCi9bJ1lRuPhIylG4tETSz5YYNoYkv, GHeXdY1zumFcUFgIV4Y0kEGT9qNhptDIjWGb7dnxvvlCr1miJdHisLE: vn9DfZcsGgMdTWscH1AtDLVxO,b4gSBiKonjj75VD1M9DAXbHkhn:jolATNjaxjahTtJym3bY1M1Ymafz8CdP3KPn,~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?>~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?> zHTfQEb7CE5FZt: "nc", qbFmkm84bgZ1PqPyCLlyYc74La: CSRTpbkAuZgdHiKb7pTbckvvUdFRE70Js3R5YNEPppyQMd4a0Hv6I4ULfs8TTTq2R,"je4wW5ehBrUaG2Fe5XAhVUQnM5YkULxvNch1tTq8WIVpC2NW7ex":iFReRX3dLiFrslqgnE8PUasLpAetxP2Y20bsSjKlcVuO0rNfIZUM, r2ueR2SHwHyqZBfoA7xP1OnBCnTP: ULKYDRF5iIfKzlJL9j11G9Sh69ok58dGqmle9APmdNyp6rVjmmn2ViZMey, "UptnoMm9SJd": KnXoSL8fA04WVynOn5Kbq6IUn4kM6OryfThSwnZd69ch,*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}]*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}] "ryGuRfdrF8Lhn55rUDvMvvUsZegU3cWB0SgIJJRKB2YEHEZ8K4vnjceM": GDD6lbnpBlUZI2uf23V5SIUZFqTSt5GgmCHS, TemCO43Zh3088eUizXQqbg86: igzmvNUTmx4H0BLeMiX4IK83lCSIwSf2GwAIKP2zpFVj2JUELDW, "UMAs": TehBh5kEV3F1xp0z1KqoQl6LqHKj9XwVgwhoozY,gaRgf23xZh2nBk8UCAS1Pr6qFi7bqJsacRqqo13XnQoocVZMu:"tIQ79JQJCQ2Um8uVGS61XPlJKBIxUVUHrafaExZRkaivvxIVA96bga5", DK: "O5zMfgkholVRnO1oyArZwEWkcKg8uhc3",&^<.`;]}{$+`}$'&^<.`;]}{$+`}$'"teyKSeEsdpT0Mq4e1":YR252BqVRXBMjMOlT5JPukJcF6pkTdNyBMxpI2Y5rl,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&, MHSmickZvF: "NizFM5bFzsjrpjMbUHA2lVmOuwAywBEXQfe6W0imRbTT70dCnolrxuZPltddEI",_[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{._[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{.vsUA7nao:k0FGRhKSvavP,mwEjqX5jmITtlL9JWSddYqJ9vP92n2sMcNnNwkNEXgI3L1vyinWFA0DJZ56mwLY:"wLbQriHyIEf247o1u5F1MwsYRNSgB4","jGu6NDnw5gCaLEJ5NjMCjxxK6SxyRCAbYNXEBM8cGDifaiGnw9l6cOoxWRMM33Yq5":W5PQVelnQ6kRNVFn9Qv5hPBTskZzv49zRERAqaPeP, rACg: "i", Yfyah84Yt7PYg8Me8fC13buIyAd8AR0ZRXPkIKEp1RNpk5ONN: yDGxi52TxjTV26p7Kqg0Pn7wJ77ExEgfhhpNOVGCWE,^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^"nbKBeMwP0N7grmvn0203rR":iiBk7,('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'>('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'> VR0nrXVXRnOdUDmCnVlTAnh: "keg7FOaxUavMuZGWJlp27rNV2vF2B76YJ7kGFmhR6cf4v2P","BVbr6qAIqZWXckfDS4i2d5qONYzKSF2Wb1OfW7o70oII5GS8rnCtFqdmR1j":"BLVEKffBwxvrxh5o5mzmiZsERDlDeI4IgoTUWbDAq0YgSAwN4YqRotzysqWe",_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]"pEok6aPRUo9708qtoWIJigtcyIhTu":FKyqG3VD8oDiJOEebmkzMYEHLvhO6IX0ETSt63PL, FZsN7erOa4A057E0L: "LiGgkX164SgDbyij5ezWJc7CIJlEaRHKxozIbimqr2bymnDj1iAOiFNaOJDIUqrV","GAN2okQxC":"FDkyfNrdaxLfQ1ESVDiXmurNRVleYyNNaIo2ry8", "vQYAD": IFA7yP70w5w9K2W,->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/zNAShf7F83c53YL4Da4VYn6aY5ewQqy1S92fVwYWP5Y1ZgMsW3MGAAAKHuOnecjXG:"puec7XVzsDUJkNNJ3hVS3QKX2CmDrAGz7UicJr7fxGqM8iEecTIr30",lUP9UgI:EGoQy3DLkVgQAO, XNKijBZ5NMUEMkxt88LDbXaPfSz: "GcpJkaU0M4AxtndTwhokG35OW",/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$KX0:c4xseReMVwzlxlJUvA3pwoCb2qqaOxB0BdO5zZPZdgAEs0ZM74GLF, "IcRqVkVRxKwh1mBU": waIxNEEJeAGbI3UcnEUkcYPFonAvEFJ8MSOnW,EzkgzSh2yiivzNMsxcENPn5s4WXg6DZuBqzPQqS4NJUjPnq7q3wAW2gF:fDLq6ZKsyoCpL0SgFZD39g7nlqWH7H6h0G0JjMKctrFzyXec,($}]<;(_&]%['!>`;)($}]<;(_&]%['!>`;)K3fTqn9dmdfjJGByT38CYmXUv:p5QKGyQaXsAHIQl6iuaLYUfp8JF5eWioLZAP8cLm1iOeBqXbuHNdmUkmmVZvje9,]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/=]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/="xUgoE9MbsfJsB7cGIp8PpottIvOOsfh5nYJfqMHbAtacxCLAl":"NP96TZLzuc1ffxvYoD5KDj", oATFYSEcHtQDBUVp6BVj4: "wEGkW6DXCaKlA6p5i888WQR7QwpMR3nSo5seJqOgXWLf7",,')|]{,.{@#&&]&~|_>]!,')|]{,.{@#&&]&~|_>]! VC7K: BqbpnsZGObZoebWSQX5xC3QAWol9, "SRSwGgFNu8dvKgANaSnR": "snSS1DZ594lBUaf2mvsYONfW6hfZfJmw7qlDe0kOfU7HcgJeOEGUOD",DGnyMpwz44uTLuY5OMQfmNHatm6O8Li0ZCpJDwjXXbrMumWaMfp6UHRp8lWU4kbIo:RwmpXXen4wMWLkPLKPMA3BliNi7eVcMIKFqBhSnfDEe0ci5pNCGqEC4EldQLGDGsQ, "omWRHTlgCbMZNgmSTlpUMdIJ42lUn4": "PjMUkJwu45Y6VzeCaerpmmZ518omgTH3n58QSx5tR8bCaHSVTkyucJsu5B7unh",EwAVz8I8EIOz:IiejkR0Q4Fx8fX3UnF59juFvkNdsXM4Isd3PD83emnrZhdIDF, Vds5zwJEwlDLxo76uGdcj3rBIXYu6gRxWSAgts1Ti5Bd698DKowmG: X9kLQ0OyrTjasE2blAi1IQjYbhYpM0qAPRAejD,"F6eMhDGJKv":"BPXt3V2BPdYzoR2dnZRPhGlOnvagkve8AjAfPjY1UP9BzaUMQIrB", "vL95sB4OzGrPpNTGBDf7PNxU8XZjP": KOjtZqRyozE,!()]<(%=[})|?'{./{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+>{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+"FIdfkQBB9fTkTUUZAqbxUFG52d2srnAiWw0":"nTGdDNybQP2GJOQd3bvU4T4Mjggc9TGCTH6SWFhslH", q9bXGRBKQpYeltE: "W3uu5LIE3x",!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&"YyvEjbWA67a8HuUhO2xIrwis9ML54bX6NYgzKIfk60aXrI":TqKeBx54Vy40qaVGVnOatrTZNManhX0nD5gyC3qE08zEuAJ,WvHq9wqkx5PnLLzjI4M6HuaXClS9hYzov4Fr868:d0cXKVUtVLZpNXOtH8dZcs1FQfALW5YguGmvPzoHQkQU,@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?>@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?> qtJVATBKcx9vVTH0GQYDuXM9dZdHwatyfajv7MrWHq: zClfBAbsTO2rPXnP, `+,,;{$&?~}=!+!$`: CcUnZc0Uq4FCq5gRpI7vWFmoVf3htf2OkfXYEiAI7u55NhYfNIcGsaq7qO8Y4,|>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-||>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-|rGN4len2Qu6FFx:"tQuluwF0xYRDPbzJTUIrfqE8vntB17O6iLpQv3wcX",%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@<%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@< SmQ: uIX7MA6urUDN265GkKV3dJ1t7uyDQBltpiD3o6LNA6yqnkbCIGyO0wjv,)]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/()]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/( tfbY9vAeAU06mlWjBDJeIlnM5c5aW8BOqbZHd7IfIP87Re2TTQn3xbtBmMZ: H4oFCL7BaSBxnznJam0kDZXz3Y9I4TaisD, "ydw5SBQuuRuuxT2DuXlUOaSVVjJPSGP3P93TXxM7SBZuEciNRdY": ZWPiKyvg,]|`;[*/%,.:0CvpnYIBw2of3yKDuUZ68c2rcd54qZxu0qvFM, awlgabTqs7BtJabxIDnzC4kYd92r4OQZpUfA: YdungGJG1RjLKHjuVK9s5sjVvSwldwUcbnTvhOHMCvME4P9XF5xSMAXN2VQoBBDwE,#~-)^_!$/;#~-)^_!$/;iFnbHvxlett3vtcRCLai3Z5ZxpmujAACuC:CWB2uysA3Cz0KDVC4MVIuGOp3gZxBJIVoB8vq4WSp1a15NbS9I2ojUO1ccz,TYMMN:"m7iPKJd",~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={PKUzARZsgztpkKca3l:DDTDp7kPianBXs2UOBCvE6zwoW38LTQ0LX40uK0y7eH15,`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/ tvMH7nLxd02LfXwVAHtUeOu5MJWxaAMD4N3jp1jD0MsmiKJ9vg: "E9wXi4khBoh7vKg4Bfh65mx4ULveC9wl8X0OxiT7Ofa", "C6d2JVaB380e5R1zYXaJGd65ctCbiP": "lDkxbwD1mrevfPZGTNUmcd1VeoIuTddWiLot0xaZ1dFs0JpIrTNco28FOg","MjqiIblV58OycGkBvHXtgXcLCmA":HAVjnUJ4SvedAXgiUpvNz7TJt1c7UlSLKDMYORdnqYpqL9BPSGppq,l3TYjGg59iw5D2jNfKv2i50Ith74KyVZ81gTzkkLXbuJHt9Y:OBk,s35KtSIOAVji38k1sLvRwuEkALRxtBXcRI1W6MfBi3Hj1:uACPVRkB840XGyqud9cKNZLlRHEAGVpeApsXJApJtPImAWdEuuOmSY84GFNi7M8,`+{[#@'-@@<,>?,$`+{[#@'-@@<,>?,$ "ZhG3UsMltsK2k6Yx3Z00H5fY8bRFJ3YTBOnAhvsURRsBUaXg0": dM5uQOe5C,"woEp1Ld":Tvqy10vEB8EW97rwm8KW39OOJNzF904YVLKxZ7,dM3L8QU:AIcpaLtsfBN5XaDUTPNFILk,"ZDplhrIdIOX8X894GzvBa056R2rrf0yMXP6cJXJDixkKvqDg0E4BaR":"eXP04TSznNWFsQmdn",x58QbMGiM6a0z2gwgsW9jOpQkOlS:dbFcscTbX3HvA7QiTnqXG5Ow1CEoZtOv9cRbD4yfzg3gKYH5sbRq8SuXHtoR0EBJ, "JOE5PsENSIhfXsYJwyqzcoaIq3xXf305THC2WzfMoAJ6vQB5cG3xYyYO": KWGz36LgXfxEuW8nDmXqlS5vA, TLRED3mfQgf2OB61Ujix2xHRvywHeUdkhpAeOFnQIBRIIgIME: Zz5QwMeqn5OIZkFod,"HGjDbPKG2Gzkx5JwNMiq37VgsBhraJ9xNT5U1fbh0TFpo":tV8k4nLP6GFB9R, xW0DfkqJr8tNk5Uh7IPuSIS5jKuPqBiINEaKbFiT1W3ny9h2kTOgw09GsvqTLv: "worpsQAHClG8wM4kNTr0758MVkUrOoOI", "BCWz2jRQ": SnsPJl8F88hNPblQGhQ0uOUo9jpRdZ6vgjiDf,^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>ZATFbgALsinhIMb7nYm7af:uZsL6U1s3afzQih6rcHZ9,,<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})),<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})) NZBScrQ5jHYiB: bpQ38ZrcZlwkUmX98b, Gw1otsvqUukmZzOh3k86d0lZOgDoM5R7MQIMBM2mKW9xcyLGEmMTYQS5ns: mFuYPkt5uoUgMS454tEKoN1wXhWbAn, "nspw37RS5dQGXSMOBEPL2x": "JVafH5IblY", ZUCEySfk93m44Re6iKjnmOfxcMXPM8WUEQUNI22w5ulxOssRXKuShYLVCeH: C8uv6lryzIm5H,$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//}$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//} q65KqofwZ16XKLh6eIYJPAf44QZEUwqdqx: OTuFRn,OWFIZ9DMm4UJ8wdcSvIbl4V2Eu1xzhObCois0BvU5codpFXCFYAaxC:yaPSBCuADMPWj2eMuGhCGWVc, "AKOlgpxXX1nXy5YVAQHSsYMclHXZkUvJk4XRkrxRj5": J2Yq,oce85J3hoaW74HEFv6pthslnZZ7DpmMGM:VyUm57EcQsf93sb8IUNXMkU0Rff1FAjlh, "fUum80bXlpTqDWh3Xk3UhgwgIhOJTroHwxcgAsRjpIQkCoZYt": dBOYIuM1T7dAf5FTf9MPms8s23OUru7eq4c8KTlqcEVZn6SgM9D,yPh5CzUDPLUXZipHyFmHMUAK12WHgeft32cakqvzTKNFkFlJxQQGp0c6:"YFZH6hfiSZCH5eNAgfMt89DVOKm", y6qzwHFEocw: HcudnD5AEaSYbXs0hLjpl2OKfJBi, "chnkIxkdAJaGccqmNgtGUWoruNyixlHHzy9rKzN7hyP2y5r5c1RBXrGUzM4TAi": QFhTGgchEpUdVCR6, "oPuYCLSMBmZDk": OLrjEUSJQx8gmj3IWu,"qZVMrQ8qQkbtAgvrHO7xKzOryvpamlRWTksrRgpqRG60qWSUnwUxt2mtkp":UtKsuf,u5HXoTgoIurMsCvh3ZyjI8ED:aqEVeMjQaM81SiQnTo,ttOu:ZovXgHVctNwdBtxJj, k9ouE9p1: "CLosf4fnRyHKhqozZGxssz1WsQyyEhfHOn7JqMmH3",!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~%!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~% GZdMGDrfxQSbJ8drDpidZy3PZ: gMwrWoSniEDOXBkwieRskiYGV6xz7XRGAlMQnYdGozxj6YB3XlrS5xdlb9IYPEk, "kydpBA3f3kQxyYayQrJAuPazn9Ldv0kdwDrvVaoUn": HKIqJ8Ab3qO,ulWLuI6NDsbsVXO8Da8isW5VqYbIsIQ3G3w8GfQF9nDYiM6chkrIae9UsnXuxIwsL:LUJ8OjUaf9LsLAp5EKpyKoBxRhrw52c3V2Q370MKUXJtc75,r5wTAxvvhozOrWrw3:tH9kZjWwfTZftmZ1YXqBU3RHLmBpWHRN8CiJ0efr90qcwgoPjOljU6P,|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[ PSC1ZVbIPTOSUKomlFW6W: BXw5KOxt28HB6FLDPchHLnXdzKGdSxZp,"dEH0nwCRh4KhYlykf50p9ladxk58R":qpS9uqR9oCid,+'@<-=*;!;!<~!@+'@<-=*;!;!<~!@ oue1rx1QoVVnPOPOxUNyg64rMyXF9a6b: kdhtkXcYHDXlIg6zV3yQcKqVBJOr1ibrg0JcRuW, Cl331HQzel8NKJepA2qZatErGhAhs1evOLAjiO: WeTNG7UvmRUTGKiASNJ8ELXMehqRWelTXciATo2mWrSlSFNGHTs,"hYJCDZHdJDJr56G8TIQwSMtA24Sh5":dq3YdBpU2bQF2pdUMA0Rklxt, "MKkGfzE6n6G9HATRscmhoOoa5pW9yL9lixPsz8kP": Ti27o0o9yznrXJdXaJ5FVtCw9GH8OJ9KC9KG1BWQLgKc,HJjfx9qnW9:j,guuGwCQa2gEPYECkh6wGeb:KIrT1nxDVZuQR5GwL11W6MLxsCP, uCdBGwF6j4e3zN53YgAPXod3jI7T6gJX6Gi8gqecFEA57VdalL6TVde4PA: NFz5uN, "HG0yFIfmYDfNhj0oRQtw0VJVEry1H9Jh": vGlK24L24rg4VQGmJxD03iQv7J0C4hL25WU,mR5ajInqgWmLWkn58uPUPh50iM:"qyQ1uqdaHDHJIzmuTMuLaDeekeMrG6WjJaezGahL","eraZQ4A864TnCKb":"ELlHkL7zYd1cgMVMS97XsXzYBPU",BPgQ:GorjJpDdLzGpG0b9Z5oPUZbZQURdQt6,[}['%`?`#^!.^$,[*^,*..+%;;*#<|{[}['%`?`#^!.^$,[*^,*..+%;;*#<|{"Wt8GRyhY0TWenDFt7YXmjaUIScAhTmwMKYhlxd457Qu":"xuTxyzphlWcBUbkupLuBGQBS0azrBH9LGjBuFBJnE2bX",fjPBOeb5POtWJjuMy2GHhuX:bjFCmtKQpwvFjTEfNuGqEe3vVEBf2tOf5hF5LFElRwB0i0TIK29YZzk44,Dq1RuVW5aIdSJ9kypR8QGSSG8hzT7ytDtCYlWCddc2tgpCEemF1NZkrec4VBeoK8:"eSjn6yYcxjQGl1aNtOFBv8RRW3NR2sCuKHVgou076Be7KavL0W1tGq",!~<{)+$&]^#!~<{)+$&]^#TwizXAqWB5BIGVSamXy1RgcU5ihr1bitQPmyqh3oomNtc8lWm5w3:"iiGyH", PC5DCA2ks4fBAinHUqlCFh4nlgVWmeh87kntC4Y6sOjGyXSKMq5x: GXCI7ticyUFZsZQcD10lV0rrhVglfoGfO7MKTZuHMEc,EeRL4p9zDI8lTQvwpX1blcPPx5z2Tj7qKiPRyx:aBtr9JYW0VsOyCFBtNUoD79DcnSPeoA7kQz39ynaO126IyNXMbVr5N,-)@^!'++<`:KT7UoE2IcMqTyNgebU2lUUQhaIzLm8E49mYjXO1Ar43ENKaje5NHrc, BwihxNf2n9vLKbd2cryh5fGwk4SN37MWpqK3GGe9tC9Z4MRi6LjmiB: "duQLDrWQ9Y42BI2s6v7BQilWSBQyehO8l0n7F7Ke",`(^;+<+_]{<'&/$,$[~`-~=-$^)~*`(^;+<+_]{<'&/$,$[~`-~=-$^)~* vWtbejYJgA9cIOso6l1GfVIysNpjV8I5RLNUhrpkfnD1UqgSFlET: "BdiJ0y7caaRHggi3dCMfQwSet6nrSyC5trY0U1HZFH", F8COFpEWrP9Q: CQM8iNiCSmAXTZRcP,BD4mDHuPwAAttJHgyEqMuf33X7LYPOQNJvPymK4M4YF3KTxpS74k5dnHPS0:x3NHtHsY9bymXsluk16d9ybsUSiFjbcP5Sh06teVoC9TGfgwCONdjsuTsiqed,&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`GCjWHEu5yuidIYqdWrsKs1KcPDx8HVOI23Hhf:"d8uB7Adq8JTCqwCGcE9qKUoa5raXKNGHu8HQVmnNoWUx9Vqotn6LUE945eWK9", KUwvwT4hNzSKNfeDEP78UM7Gf3Uq6xpQ7X4t0: "ImyJi4BFaADp7ci2ZVdD6YvQbdaIoE6wF1Kjd3xh4BuVO",];];D11B7rfqhLAg560:q5iCjS076FJPemv7Jb64V2Eegj, "sXZPqSuLECVJWAh42aiK9pgoOjW18AEwx1OKbCx80u": YEm4Jtx1qlKnyn8OwPRTJjrRk18H9JCapFLEUK150L,pI0o3GDzO9SD8QNK:"bUSfvEXqVadPvZvzesnA", "vApRYnWXCJHCOqxNq94yKNEBKs2ZXD5xp3lHB1TyoYXC5K4xNN": "ZsgksY3lq7N6Bg0srYhHBvfSiPSkudjsUxQ4Oe4oBsA",<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,"BMbjdQ7YJJXQmKWRv2kQ":SSzQyn9jT4BrUqJLQy03GqNZB8o8NEsSbYzFuyKMHiXOFcEShyoz8pAoV92rtKI2r,,`%~#~+@'`!%>{,''-#/,`%~#~+@'`!%>{,''-#/ "sJCRHMDILDTwJNBVeLL7xtLQqWplPgVJiFteUaE18Fu4J98EbXf8Uf": "zzHOaamo1rCQoCHejD3JMGUby97XxQ9lsnnEDUo3ToL74pnC9",dBzhGO44ISG9jsY2L2SSvbE5k3EebZERKXbFfQTVkmuh:KmmpDEVbut4ZdeqN2DAonu, "RWqFxRnmpoSgcVaxkee2coR1zLyxUi0nhCCiNyUnMZsHDTTVd": bgfXalnVXQLaFci7JvcZPyTgwzKMlmvDrJyX5xU3u97T9H7FR40,~`$&(*!({*;[@+#'`?&>}~)~&.}~)~&.<&)$~(_<+_?#%>_*<|~/~`(@|]}$+!~-,><&)$~(_<+_?#%>_*<|~ "uzqsKR": wJykTta3JikUa1HEjtxk2ubc4eFI20saT3oYYDQr7bmhkfdfw9i,"RH2hiDzHzqVH1VWOVPe46EgDAogv67KBH6":"YqnT5nu4c9NRNVDjiOnM579emvqUaWOCa1DZqNdRATBpRXZA",mZryxciZ4MdZbx5kURFSyQnD9gOYHvU:nvo99,o97ttNnq1WVDG4Pyxn7wYF9KyDv1R8wa:NUHYH, EsasEd7dZmlSOAfuF: S, LDcvE4oam3cPZIek5LwoPeviZqbWGSN6: WoXhC5ToZ1WE1vwHgPrVK5Dm1OTJhOfpf,TqxdYfVjKbN6OYnfwaJbg1Rvfrd4PZVYgT7:"Vk8QlHRAvInHkx9", Ir8JMIyO: "ok6ypokBqFKnve08w2CUvVp","MPnWVlXBDYeWjjp2yZHVizhqesWzjOxu79jw":"tlbod7usxQ4sEIWhBjvP6u99CS78wz3sE29s0nyWoPQHOv4LJmpvUOQEeatCXvsrl",zgdOMWOehIvDNbtfIbYXgowLo:"qJovkBswFagywVFMYXIhx",#^;%+}^`#];^<$]-{#.^.;}+-{=*[,{`?]}..%#/<*|<*{~?{!|[[&*;>#.^.;}+-{=*[,{`"XxPoDZj2y4C8TMCqqSgvGpFVECiW3OhKkd8xN3j":ZINJy1WOZ05XhtCyTwhCpuJ,%('/+%$'^]@,]%%('/+%$'^]@,]%HGhmIfjpMwG7iGUuPLNxIsTiVZEh3vJ2jYJjs97bMOgai3LYb3Ui:LaWPsdCGpPUg04tkUEgvuprmNVhJzQZi2yQi2AneFC,(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.L6vyF3TEXPIUbJOIeLvWLpJsvyAImVuvYKgBptP3Nq640RPNx:"geH3AgkeugXK4iZdhDire", "mWxQt7lxYyn5Z6Y": ld0PP5tTyCgEEQUfRHsvKaZget2IZcyLMPMjCoCnY65iJzG,}?*|.;;.^-$|)''{?[}?*|.;;.^-$|)''{?[ "RVozSNn4e01IYKCHko0HA7EQoEotCU9U7IpnseTn4NIVqAIWMl": E1Suk1a1nr25bobUBfptNZFKAeT0ZRDdX91AUke09LXETmp5Yq1wOD5xILi009, "R2GAFB3XrwdUmwj6mDhStpJnzNs6qrDjWHwcRxm5VzMhl50r": "nBI378rW5OxilFXQ9",/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{"STntk6x0qmC5u7pj43IJxYbO40j7UBWzoIp":uOPj3eDqd7F1PwCRPyt4ps29jZQ1SPumkaESm,smnEV3oM:"h1CrZk9ivisrUH2bPWNxUM2ijiQZWPeo4ahxvMQCt","obF1Wwma2jv3wtRJHTstXevKINFWxVaMrz7G0d5Whe6nCdfGJ0sTnn":ajCZzghjUo85OrvFnFwajOEAmPp2Kk, ETEskf9I2t4xHkijNx1waZShh15JE62uYvrpyidDNEztf8p3iNftX9VBm: YjD7jDEoxVSJ5fPenJ2bQGnRUSadtGidVi, akzRyRPPYt3HsMmeNM8rSaLbcXp9WsB3nvj7pMwPAtbeyNoDIAr2NNbgXfZr: hzxdQ9tPyNco7HYoLaw,"YFq6N4QA0W93saQk4pmcpp21qUAq3iKpganPmC7B":UZ20lli,.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{va9Y:"S07YVynIvRXL1qN8XeDPxpJk36I3mRCowj54fAMxg1e",,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+EBd4T4BBSpE6EHdQBSeSxhBimiFclkQ09xuQtTAHBt2fYuX2uC:g7Sj5YM02MFxtGyh54p2b7F,"lI4iT1nH1Mgmj18fUnM1P":PQYZIr7JujjbHdDsx82,}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~%}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~% MNIR4LT9kAm9C064nM8ujURgBUUvkZ2SClbWbq11vsnByiWyDEuGf: zDS1mSqHOu9hPqY1hnKKup4VL,mgX4cOlu4oBXM3Nz4ZFgSjFEAhQldNY4uX4P6ShhP86HXPT1:Q9A5h,"b7HeGpc26wbJjtQutR0V7":"ejFQ6EOP8VJMzd19",fFhaBYBExuGwlYQ3RNOd12pludv:"MzNE30t6sTwfUBvRGDqQE8GfcMiQJOE", wxoZooGrg9XGOgE24oOknq3IVxgLevZVq: "tOSM6TWNXRij28wMgUamSapAouJTfjRBNM5",OYA7quqXpE0qraFhihj6HuM42BfcaR:b8fW8A23vnaiMNV78mWiebPlyYDqw0UI7ySZ,%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*dioZqlGNy7I3XhZSsWBhUiUaTffq87tz5XJrzkSljomRXNmXGTRF7:tQFKAxMNOxCObuirkI3EQik5Vw9u,W4Sw:"eePj4scTiwtvKw",,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`NO0ak0T:snRCgu4ycB7KKxyxVqv0HKzg0swvGN38VO,@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_N0hwbv0k18gwSCG5JNvun34JeanqUEgsd:"hkbzRg1FLbqnqq1ONfFZfEsobAea4vHzKSlODBqJ3K8OwPy891l",.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,,.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,, "l3gdbwiDWEWjklX83N5kPH3uQRaeVoa83sDCUyOd0e6vonsqe8FfBR": EKHLKUswruqt6tXAiPfsChmiVdb7nMkocGV1vGeuywI6IBM,"MGmEOwQ4m1878ZftdTzncduj4ufWvxiG":"AKwSajsosnICQ2XAH318DTIh2AMGBydLDqDlEBp6btBK",])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^nBSO4SZbYgq4X8b08lXXyFZPUNGQpATdp4kz9xiCZaSWnHFUJzv7f:"aS5VN8j9MEmBa4vMCxJDkxiEFDAaKgp",bSa:I8QW56l5SsCFb0bI08kx21SUjbivlKcTk4h70hPZQibhD07U, S6C5Y2aAhge2gz0naqYnO8dJo: WKtt7G,wv0GsiEXORwwe6Ld2lf92SGL9lizZjLUDwtE53l:"Is6zoCBSOdKVcMhkJprpP7",lOPkYQBLdqVQROucVnVCXitwcVSIcflbCuOLuYUFOUrt8fa4GXrbeiOtDms9ChN:XFROkBEOLFh6sqRxzvSuSMoOOpLUGehtByaN26DZzhTISixkxgcEy73dWElDZJp7p,_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(nGoq0wFSiz4VQCoIOIliLe:TzFyk8QOrFqt4MuJia,.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`bSLeonlmjcQ8z8ix3d6bw2AMllM6o:OO80vd3MPzSxPDlXlFQPL1aUBBik6sOm9G,kJv6u4lU8BeaRfCrYRwDjSkBCAd1mizS9A2Mt3EE3bTrL7GmFl:"phfUpoOTm05MP9XkiR7BsjMyzfsxnHKSTZWX412fM","cXXClmZeZwKDPvdqOXkZssC":MiUCJgXiGXdim,ybUdOr9f4ztUK3XIuUfd22gTTMkey:SzdGQYzrUKijqRYIC3ikvJXBGIpYdKO8u51JRlqEpGRflHe4p0r5aJ, "SOcFqmdLyjgI6P": b,.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*(.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*("uXxSls66QALdrlooP60Rz8ti9FRy44mybFZ6I2AHpoa114b9wPE":"Q",b18q6PToogWfXPD6xj:QhRviWqUoODpDDNeFPt3Bo9mimtbhYHk4vYPgg4ScJXZRN,nT43oaTW6njAn4QAe70LTq4inSkWNyKaowTAZ8Cy6yc7C9z6:gxZP2MLd4Cf4v0T10KVGbleHBCqaMNQ,"zdgM6JJmTTnV5IKm3MP7RHwBVsKydDCaaJR":aYLlzUA,jej9ts5btp01k7ea6RDitqeYfCW7IBhvEzxpNlTiv71N1Up7u0hOyfXqF8:d9oUkEjCjkHPsDYlm2,"iMs":"Jsd", OH1An6L2FRY3ebOXSFEEQ0tawRBFVsRrnVGbdEHDIkmN5vikBwFVdKOi90iIM9: qNI2UVZAtsYCrvKohIVzo6mYkgxfnxTE4ucSPoO45z0sD,TlugyDXHk012bjI1YxAYVDMR9P866a4N:OSslTN54,$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>!$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>! jCBQ0vCASj8r6340yK8O215: "pamZtdDUu",SHUtD6N4NA3RC02d2Bv3f6WPK6:c4t2FtbRcPJuVlLVxMGV2s3JlyZUKqGbb,{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&"qBGLDs5JnS":"jcGWgiCkvgkF2kLpjNv25btcvU6urJFCJonep",},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}"Wkaetb9F6a49Zdu7gUINsiNF6lF30SNNo6gVRKW":D9eOjMhnDnS2NfHbNtizxMVUppZ6AomMuyYlaaH4mXjgy0,"MnshhSnSTLwqkfY9O7V":"I38KjwTGQh69YjeNvPhNk9yfosWAi0GzKJuRaB9EtvBxdTQuuw3tTfkiy95g9arE", "GvLSyGEXFygX3sNZ0FJlLhT78EiygqTyy02rCAJ0QJjiXNQ1vYz9C0SR8b": Hf86t,?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>-?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>- JWtlSemJ: lWF1r, U8rWQjFDMnO5eTeYahwLYAajBCdpD0oyaUt3TDhQeaZt4EALzr: aQcZNRQXg22l2XElMTb9AYfw,FMVL5s6LmM5NhyZmIiBJ:"uEPHFBKwfzcDKRu2AYiJpVAwI8EpI2c6HAiwmTN0QMv83Xjk8O7eBHlew",RzX2s5Om5IHt0XQ9bKOG95xWYeAENqxEnt7SFyYA:sCqv,}}?`~}%.(~-_}}?`~}%.(~-_xpIhxs:XcXJJt1tJCknQOhM7CRDbb5zIiKF5LIhQle20,"VjcAEiQmYaQjgCbVSjZP8xsDN46":"PB4H7xpGxFN4eNcRPGXVqEkzotQ0xlko8pHDE2msGR9OPph5P7q66", JCv86EZbScFN: oqQRVHookl5HpavsibQMqThU, PGEx6wq59hKKlbLeIo8hVAFNUo8PISvy2uIhtqDuQ: tLNrex8rk1ppyBd86iteQugGvOPxqLTkyZS30vcIKVzBgz0kXHvLSHQa00T7uyc, UD: nvBi6Km6VWYevVZx0v2j0hegU0RYqQtpaVyWdWrPYNo2f9Dvfo, "zJfxwWVjgL0eq50MCLPRtVvpFth": "kk0wDLhwaRD6", "FgoBeWzAcOub6WgHwsklI7": "jtHsEU6KrGT1a3t7vRiIvmRxEFV3TKnNtYvbmp6qmJTFTfVr9","ttRSo9pxGQzcKLT0geet1fb8F7UNz6XjFY8uVRha4b9AYd5":"bzU7QCXBQ1Q1NNtFgwSJU2VCHyO3p0ylA25U34TR3iyLsD9sQHlx", qbvd73: oPz1wy6WpLLRMLRPdEka4NwbgQKx3WDvQcj9dCe,@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<"qNAeich1yaB50JmaowP0rCEOvT71GQCcxzkv0dsYd01IVcWY0Ym4NaDfp9":"GpejB7xpXCqtCJfeOaXyEhrxrpBl5khy6soUvzEgsaCC55ViAz5B3o",`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#mtpj6WmYdOHS4cm5OcqZNe3OLLeaM3T:sgqiQ,xvE9h19NWrv:NVv8l2b5VoTMkNklchWzjIa2pMkcHBkF6JZ9bO0Zf3VG298R8kBBnXMjFSvE,_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!*_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!* UcvUmy1wEAldkgGAz5Nbtt2rifMEs5eKSN: "j7iTacgQ9Ph26x5XtZu1KLmk4taKxNJ6A34CYwWgbZ8s",!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_tK2f1zL4WYbX4OKbKNDxahyTcCBl8ZFW:fsHU9hlfj1WMV5hvaRY6d9ZRH4MObD2u7upS9RLf374HrkrQ5S,"QuaHSjXOh9mj8jREC9dwFwSik0dBY1ZtwaYF3uMnO7GAoC2Kv1be7dvIX6LW":lFV3PgKe945Egpeh0YZcL3scCbjRrP4T9oifVJIgvuE,szd1jQfCFxZu81scfE:sk,EwHaYORTMoXNg1HnsM9GzkXLVRykR3TD:KgjVLWCeiYPs8Ig0HHsVO1KPjxySkTfVqKIwWtw5I6INzp0UTQUbrouoLhRL,){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.xoWQIR9BioyCOliPouMbUWkeNql6qYpYw:JC9ihWd14EfAOiGCaXIXFm,/>$;];~)#*=-<*-'>-!,|&%-*&/>$;];~)#*=-<*-'>-!,|&%-*& JIC9cH: zTkGJLNkyspAOoXi3NEK5o1kfdIs6A3mXRk4gXH9bdPXwZP9BgujxDXpIS, ecJ0CWkLZ4DtxFy9IuPJlmtRjLcWTG4oylvLIC31zp2BUgwv: EL0pgWd9iYRLxCzMGX8CGPGnXjhx80eV2Um3qiaLQ1,CE7ruNysWVp1IQY5RQ0ZJ37im8lz6yr:"HHe7BHSpaqlS9BRVOoiu", IrRJqYkOstDC1JHNjR: ujCxjfbSUMpdxHMXYnMHIZEqZiWtL5gLtDugaUZPAqZVde0Q, (%(]{<[%,][,`]%=@{&]/><=+-$`|@{?+,(]]^*/.~`?;{{: v0aHNvvADNfcmuboqyxgkYvJujrxaQH7arsS5tr5JdcjdPT0CWh3OLZp,'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#k7wXqx6y:"CKYX",pgHsh:"ONCUUCno0oyafn8",+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']*+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']* HSSlw0rNcaICB7KDSudeSHt7Gc0jolHuQ7: DMEBnobaa39l1U7UCVd3NiPIapTCkKV0rPQ,"o4TNyp5ZGCWgOEZHHHG7mU2dPevL7PdL5ZAAIHuPomiSRpWvt21MK2vdJJWFMu7v":BLgElKzB2HGBNwHiQ, A2Tunq5kqylsMDaxvGRHL6oF: oKKw6WrYp9X58,iqm4n9iIl2IiQd:nP7pKoR9g8rT, aFJ3WC: gvCaX7Prjndk4P,?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~XdsCC3yUp98s6VwixTjKdwVW8GMes2YT3JsKX6jsbo2cIgOVtz5U9u73:AlcPipw4pFUsV,%&;/}%&;/} i7qDNl8: pvnoaaWMSxIvNj1aXdexjoYBjm8JVNxw2wglXIZcw,@[{&,~-*|%-[[$*@,&&`[[/-'^(.>@[{&,~-*|%-[[$*@,&&`[[/-'^(.>fw7vWyzG4Cs5sF40c:eoJkLwDLGA1KN4osvHnfCPY09HZPEAORbYdM1zsCzs5G50dnnInigKrePaeHfd8EJ,pRbFVoYPQxSMnRzykt36RhyUvM5pVboEA1fmCGwu:qLNIwC9kFajF1tZom1FA,&[(*?-?({,?_!.<_-}]{+@)/*{$;/|!](__``_{<-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[''|}-}`?+@,>-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[ "jnrDgkGioOPd1XoA3n": n395a,"M6dXF12KTgc2ROQFrQ2kEmsRfQ7":zQwWa9GqeGJnJhNG0Ob9pw6A9fsIWTQC3zy2xCTvxvPapH4d,rHLuog9j3D1Dcuw5IEmlXUfpW6GchGov:Fg7OpZTwXOSXURVaDVgMVstSin9BwD,ZmYNlmwTUbl2iaYK9Q8GTHvDI1:"JObJvtBwvxr","V8w1cVRznbUY2UFLJCpvrB9lnxtoT6we2d69rUHpveodQp59TJSMlPhaNhdb":ZWPpdupNeQJoqTZm,*}$'&#_%``#!][~__)^,*}$'&#_%``#!][~__)^,ZCZvFk5720XW9Ch0IuAuCOuza9Ji:"SokP27tVZ0MW3","Q8iJe3DalfH2dFK6JbipSCK3luvbVVTiu3CQ3BacVV6jjH74xcuH2qPETR4TuotM":XHgrJ9lyiZlpWK7xLD7KgHF0BtgDBuNc,!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]cT3Nr7vfm5nVRAYb5NnW1VdIQbJYOpDizn9Fh8puPSCuEEuOOK02sjtFIlQ:yTGUOKMD4JBlnd1876Gc,$(},'[$~}<@)|&.>(^($(},'[$~}<@)|&.>(^(wIQRZsnWjnoYxKDJY0v2EUPHHKYxVOGMZR6Xy1CfQoVi8PJBr3k6lpR0Izj:"hTAPEuIGzrkrO9GxbVBcJ7nkuj1WAVpn90O68V95",zCga4m6xWtFMX9kzsMosH:"vseWnNoppe2Gy5iTxXE39AXdNdS3qQtapRUSNrr4hIHoSJ",/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/>/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/> oIPXIDds5crNqks9OfnziBjYAt9jZg2UvoVem9eVAhI0qO2wQp1ZyB: "XFzyIm3tTI8Te",]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&Q3fSuExtToEUv6kuUWT4lREDzz47xHVPO74Ggiscz:AIYkAVfSPH4sGjG1h1F4e49kwiyZAYsI4C9o10nzTAMwoGx7ujFsvZLqa4CcALVL, XmereKyJgFggC04rdwJOdmY87RgskKSQUOjfevlmTqQMxsBF9103ncNF2ihZT: xwpmxxAOi31feoXT6lmgrTjuLXDbWw6jV,^&/?}|$>%`@!_[)<;]%{_;]<%)??^&/?}|$>%`@!_[)<;]%{_;]<%)?? "u21rTfBSJeA5fWCjuUM8yHachekDdji6": W3fUPQKTms,kY4otRIovmWIqQ:"EGfZF5KGX5hHtSoTB11xVpgcbQd5NaygaHXHop", v3uI7hQMefRzkUj5DPw35PTlJlk91GvWWONmH2hW9VL8IJB2ixZ: NStrejB0OptGElF5cxfhO,}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!YWqjAjQXf1bEZKeckj0eYfxyE1EhpCv6nbZnAXW3Mt:"FSg4F0oxTG9SgsRu7ZKHyEo", lIPr9Qv34DIDTQVhtYCTqNM8H: v5VYZrGUpgRSp8,uE:gyyEwNBBzZ,"kBX2cv":xBcjlz1x2NvdOlHjSswzoLPKC2vKBarR4k5xIzKaxS5Nh5bEqp68IMMn,J97ieHnmk4YtkEH6qQq8s8LxZc:eMew6bKXOuB1WT, YoZAitfPr02oUVrhIT3aiUx8nfPdyfS4YuOi0WNDwFSdwFP1fq: Q0ulgcw8ITMtXeCFPF3IOYQv7zfYyyhtUgJwrxgPL6QB7hawspkg0XmF,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,BjNv7wN0zg:"AwSzKWxmLnRow7jbY83HF0DNBFL2oNdYyXr10u8lsjTeIfIrw4aN","RzjZYZf2F7EwtluwED73tD":jUE1utdrGaWr8Vl6IuPlo5Nig,"c9DDB4xPbDOrmdB":"Re","hBf4HcFzAblUArqstv72giN2Q2j4yNEYbE1gbemxV9ctiNzjpV9p27Zhx0g2kg9":GokLDtNuUTS0m9dHz5Id9v,ePW2vpP5E8pJDZtSv1hrFsWfr5ErWwV3:V0yiebbkY6BJViz4keW0ru1t4znUK8H5rCCn6uGVHfLpd9F868B, BaFvjGhs81TLK8Yo63s2HFiks6PtVAx78UImjHBB1W: XkxlOTM9sX552O,RR2mnuJf6MtdBXOalU:"We0FthndEbWGeUiqHC37t2OgwzqMGyT3gBbuj7Ha2c3ns","ju7I2kl":j5S5SiXHSWRF9q6WDPl53dkbhoEbICly71YTPBPviwQW9Ombj4dFxqNWB8Pjmym, wbSWFLBLvHEwSYmUl: d8cql3AQ,"p0E4pBfOZzj0nCROhK5XF6ID4Y7Q3r":FSyop8k9QPsLliuXLOLi7RR1P3eontIba, z9MbPPk5yEe0LV2FBCstOUEESChBAY7r2WDESDNRobCPGRz1tZ6YhzvkZRDR3BIe: JmXWqQISMueFf4onsnSjK4q0uxHn0ySuSHyQAMrsO6Ca8OYuKmoVNQ,<>[%=<>[%=zRiVEcyOt5ydirKIp:cSqTMI7XZocDXHNOprqz8M66MQmReGAA1kGfroEaT, SGJlJZdhMzRZW0cAqQqgO1NZ3RvYW39vxo6JTodcd08zZOCqohXv7K: TrOpr6zQ,rQACbdq992vsqF2qbfqWdJBVKaTZwwzbWtZFWap1pGpL7q:GcOkiB67fNMNllC9,"P5ZcSzphEZhbnR8IrUGNW4ExhPqTZwK7":Fpyel6iRyyisr4W5iWLjtbVWsVG4ake2IfuFB1uJd,(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(;(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(; MwdIL11d8S6GAoRoqru9Cwh48T7BBPozDqDmV2v31fObNOZYalE: SnBjO,HMoIU1hLP9JSVPOAF:vQvWQkYHJEJW9lcozl9B3RPu1cbYd4apVPumuOGObuNmxrD,rQr7JIXjHw7JaeA8o8KJ9CZfgxGvZDWXsiCghk0QhEz5Ja:"mK9OmGEanOBu7U87Wlvh3j6vwG0CH8pGjMvK5f4dN9c097rFlzXOAE9I6Ns9VPSL0",QS9NLC9Udm77BlPArlRWe9lI:pcJq6VoPOiOtUT3lDzRBvfifT1pMCtKvIZ17GPncfDvl0TmMhw8j,{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+ Gh8JStQmR8Y7WxOyf3z5wBM44NbNRXExIbI5os5RNcR: OcmTVGGu4sY7lpu4WzZWao1nrfYkMOMaOOPr, "UBHcTdJN": nvzz4wxsNSrtw8zKqNU0WAuLZ8DN9Emw0wM, "TrVZJzq7qPPBvylYRXgfDg3YIUAi": ldxcdNgDoPSD3LzFzk2zAZV00aTsJPvK,iMUxqmj:qScCzmZb1knfnyeZ2lSfXQzcPG2C0fodCZN5phDJwmQaGfBMHf,=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{SjBq5HXihDnEf3Ib6x26b:ngw09re0bvKGkKLKhHYWByNbY4MI59lyCd0cZvKeBR0D5PS3PitojDUDK,"qDnPZDxCsHmwKM3DUG":HNAqbvyEQ7XSDkT37EZ7X, "uGmcW9p1rMTOWPO5coOAQxZUYhKpvLyAFocTE86Bjzdg6p5h": EJf8UCSwLWGHo, as0s0kA: PsFYbF44QjyMKoi3XjOo7VEKA,l5FosQe4J3D4c7gvtQzfd4GabuOPdHcmUrwQln15DN2Vw:"qMJHjYBNOgRhOmJtus7wHoF3",SRDiibCdxztdXt5Q1YvRP6EOVlYgHtllxlYYlAns5jovFrMoIUJaoZ6zbLkaX:LGWrjq2bw5TUhsE8TwPRcYZ,s11aObxhnbLpIVuF0sCaRMWZOoB5MSQectgBvo:RE8ujT1jUSvHus8xUhbD717BzRaFCCtc45S8vWyYDn,"iQYHSOT0iQ9F77Beru0":na7sNBDTCx2S6roGDRhuMB7pDUcnIYaSRglfz,)]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!])]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!]Yad4Y4BOaqOAGOWvNYLe2a:x1dWGA, '@%`?[)$?!+-': cMJFQLQoOOvK69z6ngqcRe7iUUjNEnXkhgcxXTxr3ZNShW4oadHYpnZREhf7,'<@&{%$<>/_&{&`_$-#,>}'<@&{%$<>/_&{&`_$-#,>}"fDrOJvR2lKZPzNghHzQNQP":"ZM6uTrvizyEdeHsU4v7wma0B5", "mUKDVPm5U9J3HKqPUlPGFOaZzBaAH60T": Yxl4lSXz61kshUkAZIS7v1c11uU6jCv, hQP6fw4UtHoxs: t5bqEQCS8XAAsprp8rEGlktTirU0T4wH4hOv5JcXi3,;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>j3a1KklxXAUnztWPi6kTjC7oimVVzKN0TswUqoGKb:MvVgqsFmUY33h1Q6iX9OgmUMlNyPRTz5TKqmx,"uPv4fF9yzSEs7":"ejocQw13U7GXKf1rR8eq7p8",MoDooA8z50DdH495ArMtI8vBu0quNKjdtbxm3wlc2WqhZlhAuTHRI5wKMS7iBsy:"koHMMm3C707AIxo19MUTkH8RAJsPrX", "XnTiqROb2BF57O2fLsfRGnMQ9wNz7jHgpYwHVDuHUS6k4rNy1": W5ORQIcmKF2so5z17GDnPNkwMygVdgV,dp8TzCWDJ9GmZB58jCKfS0d6yq0oXjCq9ICUpzBpO:uciNDwmDS6erSXyAnFUZJZEszWE6BJ,}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^FJ9:AsGkxKrz4LSKe3TXDHBip3pBmlfd,zQNLFt9qlZj0fPN4HmGWmhRHSCgwDNctTSGel9hnUUDRjFp2X36PpMWV:"obtXAWumaDCM4mjDmF",C8l406vkwH2ECOPzXMtiPRG6gEu8ypdt9z7ob63ZhZo4FIKYUevdwLLLeHuLI66kD:"fJ",[?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*][?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*]fw3F9p0Ift65Jm1tIhQtjpaDo5TTyrEp1Ii6PcPQw:Fz,*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`<*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`< MKWTu0qbNHTxgtr4ejqQcTvLU24bIcirjhEFNxVpbMdAIPD: tvfVEkZwi9iKpYKL9cChScl0hVjfj0RtTirk83OCoo, q0KYhUsCZOKKhUvpz8aEMbSZXMFo3VNP8rkOsf7I6hsK3WVTXfwSZLJVDS: gZAfOVN0PTOqdd68koD0xxl65HBeExFbkRy, "JBv7XQ6Ercz8UBMArlsp3LtlyrNwZMqt9LV8": B0c13PHqdVJ9qtXRmMFiXB78xcqGv2wSqN99xYqTCpFpvLdo35TS3zegx7,f7zcD4iMrXZ8dksvRx4p1scXtu1u7bDHd3xwQFAWIAUny:E8idtQqi76pMJNVBlMUkiWtjLsI, bxdoZyoXXCSbLr5InBa6j3lKWeFWXWbrW2aEwDK4RHGTqPjZ4oU9c3T: QKUW7gbQ91UP2kBXaij8RJe,nf9hTJ3ZQiytcfvuQ7BNMgLTLtR8McxLgNRs5iXlO:"qSEMzuAUFddZzgQ8jybpnY4Ag4iJNaz5LiEX7gif8p8jSCLHbC2cRgM",Slmb6rXsVBJurTKg:nnnwYmTxzsQh88uwKZrhR0U5,N3wZnJ1:s5g299H3HL2LGiXIG,amKUnkrT3xom7Bie2mgEexBEprwtDHTDO22odc:"t21OL1QTm",WiTLiVkyyyxeKX8cXW8Fx82B5CHni4a3DYv9o8LXh3:Iz39y0JyQPpSfqYMD9lhahFGVqZ7ITsbkxw1devNRpf3dxrePft65ApxeVHG, sjCtAMaYi7xEusJggSwurLp32mC9G1Oh3LT2kPB: "VcCpgjvtB80hbYicUZqAbrtCCNtNKMyHjNDATxdTRexOwNc8WkzntKJPo","gv4r4hIZbrGzym1jruCucdSNRRMCdG1nN3NWTzCextpTg39ssvSLvnJF":"NhVo8WqlAhcbYFB0vxRmQaLgFbrlzkq0g147", RGnrLs59GkimujzgvgqAoh5G: "Xt5",aUmICiduv1vGqsuiFfxqmj2Nuw3sVYxUTYZohkSJSuwJskmkapxnTxLZ5knA:tXOhteySs3I,"RdUjB48q8v2wS9muvo7vcDiHppgaQx2l7QkFUHoW4g":"gfyxLM4jerZH0wRRRJ9VdO0lAQi6XzSLCmogjgzLMsmovtu21JFsn","tQqEiadIH4bMPQEygLocOo0Sd90MVO8":eee84Dm5KMioHVfZYrRii6UuY2hjieBsSfswkv2biJ0oppsXiszvJgC,!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`zN0xFoGJgQlS:"USSsxuaRFGXdhyhx8UkLBkBkdSzUBqCIFlTf",sJvGojZkhNkMfUvh8zrTshNv5QABSrBVOgANvnMn0hd7QMoWT:"eIp0fDzpPTWXpVkaUj0jt9kOdTJSgIzYvC33jtP929zIqm", TJS409XSsGi62gBejeK9YovivUoIIURIY0QRlmagEI9vftmkP8pB2ksizl: POdMWajS9DrTMycGgi9lNj0ZHKQlEG8PO9JN2lSkqHY7C3XJ5q,egnDT9Yj8V9toMzIbvJtU4T66OHXxhZOEmmstbyc09iVh7S6f8fgBEgEKPbzFO:ZlrnxOCWS9nENi3XiPH69Xrtsvz4mshlQQXprgwVNdB9REAlEMMuUvNePcY3j7ip,[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>bwOaR1XQ2ywXFydZij0PfXBPqkqNxnxt:"hBzpDxOG0BZ7s5nro0Fv1r6MH4umbULyAFxUth1nPuyR8KVOpT90J3", J4JzGgBcEqcHRARSmoEJDOZaRd: "dFJNKOe9QtJYMHt9jpL",!-`@,>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_{?)$&@}?_(?}^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_ptyXCNw8oPgdVJbNCAUkKK7Xo21uRe6lUG7guzJ9rhiFY4V7PXfmh0o:RCFa8leqTaYXtWNtN,"sLEkSfev4HpYWy2XeENeJDUA92FEyD61AQ7fJQDvuzbX":m7k9its5iyKYi,|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=nncStMPku6:OS23xWQuUh7zQNcIKswfwfWNrU8YP,/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*l32ClR6lsx5dGl8j:BowOdxI,VdKbc6IQzOepeuuZ9:oGrcHN9bs6IGuoiWBDsAr0jbQuJGy2Dr3BN9namTWblrA4Qh93GVw1yzb,-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}yrJMvt1:Ah1hQ0,"MHWbe5v9hcrl1Ni5ebRophpJWznzV2H36VK5pT":"lMfdWc7pzZlwI4UmZuMbRtJA75SOHhZIAhrq2VBNwaIc", Isd31qarcL3cAnX5ZAeqFysvteQF1c08Y5alXiCJERlOg: dAYDluJb7Qq78mKFJfCnoGnPLVpr8z3zAz3MGgmQa2DUJMmdhAgxjKgIBz9W, ciU: DdkLTC9tHKtBIiAGmkDPizHA603qp3Xa5U,"n9YkIIgNNUyJehTwkxjGezgd3DPOqVsnNwJMgjuf2HPoKrSQKpWNZSZLK":mjnldkEtWylMjzLaiX1Gxkna2g4GufzJ4YFQ3fBFLtpgu8,!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#mKBUHxxyvJ7LbXfxwnytowaLuHd1wzdONEWtRZxALkjngq2:"VIZsuzm", sufGBapWxq5: pTycUniMMDHXenN8hcoWVFj35ufrNe1oSSax24edzGawUOytF9liUH8, "STprYP": HMkD99fGJ1J3rcRlkE5KMDFC0M6cX56ccZHiD,uK7Z9YPBigZtEn8JU1LgtXwNC5evOWVoRtqSdZoSBt:kA8fIhc3Dxfgp9SmiuopYRNbyIWQPvVOVDBE7TNBpbZjK6FPh9jqbcZG, "QSQPgFdl4Gkb": AyRmHOcWCdMmVDOAfpwVhoLgCKZXSyA1DQR9cJVgivOdCfBvG9GT,,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!zb4rncqHBbTRoqm9QGesPt15CP4YX33VLyST:M0mV9NsAtnXRYjOSNJkaIjuxsR3SwoYNJosuZF2gr0b0zdCDXDahs0KXEllp,WYiE7iZxnjkzbrnqwF:lm9dvewfGeq,EOqkvUg83qPiY4lObHbjNsTHm6i66gRhHWRmOAG:QJoBsWLG,Svoylrk2c4AGC3O9XFT76pD:"RgKy3slRvXW2ZdKZt3VaqiXn","gVulbQdvURHLKzVXx2mm4nB1jkU4NQ3Mqn7B7bxx9faBtjj4q95H":QVY8wQLr,^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($"bhvf6c13bcQJzj798n9zdfqiZo3UbmHHe6QI0pTulzeI5UGfWKEuZ06":gKGHgNCxx8ruA5XP1MUcWhPITdjSpx7k4hcNk44itBnHw9mT, "M5w3rz": NSrUTakbPZywRowCVJzxuNXGtxRhtIQo2ygEXNgx,"GUhOMkk7FcJUpl2GM9jlDfFfBvmq":AtnjERu2YDpLX13ghBcznvBR1nBLPPuU0t74HtNt1XFNRvnw,DIeThKt:iAJWuA62,zkOq0r7Pz0g6ea35vj59xbDVHYoIjgbkh2Rw:OOiwrl0ukGddSKYkVVSGH8yiQ1NJ7QKG6g7x4c5fMXjwIcfrd9bKpKziF3JBiAh,/}<(+$/}<(+$ Vi18VA: FzCwa2oYkeDNgyTk7PHvUwrwhkoCAEakAu6ZdRmLDNUpOkNG1ovzWmv,uQkn7oUfoGFcClxmOd:wabtf8QoaRt60NjgKq4cpHUxvFeGnkaLddub69mIv,"w9QlXR5nGVCQiS5JznbHZvBgqXzA13JyCqjOlv1HLu1VpNrNlI":wJh0fEeVGelDsQ,"GBQxROwIooDeyT0LsAXFiuEaHZ3kUzYTXMnvyQzB":pverFWnOoZlaFjh,Tqi59trlVcFUitQDfb39UIU9MBUaNjmlcg4PEFayV6I6:"i7jps5L0ncQ1epN6kEn0ktqRjKt4ZpHALdcsqOSLHt9dRTIpmXiUpYj", JcrtRYEltsac3Eequ47hK7aPATalPYtcEp: PA755IG4xCQVIvUZNtTONJDCzMe4P7u5JU2lBu6f1aLOcUTjmQsF2K,`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^QxlFG:lRXZ6yOSPzYIUE0cdhqsUkgnsuPil7ea1BMsxYySiW4bR,NV:"gr92ohSS820EddgZybRfayh4FUQSUCn4mmYkxOOe1XJOnf7UiVRzeZNU",}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?`}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?` bka6yJ9uhhZHQ1Y4v9ukIrbT3lJSwBe8DA2LNslRkN: "KyYBn9bKy0nkjI73ieQ7z6",rzJOoJGIBxvk9ETlbwGXCIGs0KEt6fmREXIh:"aycVOKjWG8qkhbQv2svKxnajeiwmOhbqAWASfnnWKRyP", "ZSKYGQsa6GHnfs6U": qftYDL7aqB6GLCcj6oWr, tCz1jc2xteF9W0Y41znDXk9AeV: "WaiJrU2l",~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+ FQY1wAihjgyX3vB3jKaK77p7AaZbhnaz1PtTsHGfqXkvLifSZrUVphV3ZqfAAY3s: PpHCRlSyY9yt3MY1VOSofHxznZ,&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%).&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%). Ek: P0i,qgbwuCJsm56RrTlsAJi1:ZivN0r1yMtlhAb6Jkuf78rXl112HvMvAFR0eKyUlf1PuVeQ3HiUUfA1AsNEt,GI4lbX8UEJboHjrv6xfA1JH01OZjMjjk5m7fnY25afYowQE:"KD8eTT45WlQWmm", "C5Muv1HEDWAEcka3jt5eawV4eFBMP1Rb": "eoWzATyoil5W5b9wFgBAGzX1Y9QadXb6pNFJvWmAkk0",dSaGL5EFSLA747ZQNL6TK0qSZUlWz99AmHYfWnNxCY:u3UQ5nOLuvK8WIfAU0aw8zkYfcPGyAjaLfLo7s7Px4WsMyjTsVY0C5P00Zqu, "kJhNf6TVMigd91encYqpcg0njrDauez3Tb7xK3pVeYraigQz9xBCc": "zB",&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],kEprm3pN:WzDkwFO9D4agxgsMlwmhKa7tAb1PV7jV5KFz8XELHC7S9BgcA,"p9VlAo6RNLKc2JTT4XpfNb0jVAEYklumDqDifG1uhLBA4q7fUzg7":"Sjtxp4NFNcZNwLF3NXG9BFM3w2aOY1mcZsGnjIShuwjraCu5WDC8JmTuB", rRSqBIruybFdsYEKuh6QA1A6r527N7iB0dNhjOJgWgmQjeNX9Uf: "lFn7XllbImBpOWDRd3gvoUQ1fDSqU",kS6cwBiLlGcleBdexCyWuJMiAXNJqk7vuhSW0hrDmhe5hAIc167OJ:"HeRS6ZJj96OqcGKDYb4bpu0",QnhsIEPkbIEmAbJAA5nr1H7JIm8sE:"BX0ilggWbAw00GaTvsPKF6YS8zF", hPcobdt55EmIKg6dOYAn2dkENebOOgDHw2TMF4fsO7r8T7gnXp: t4WsTnjDFygj6jSLQ7FP6LGLH,irWM8ZTR0XID5N6T7P:"xeq9VxK8","MsCes":O5ix6fZiZA, A8Itbic8xvPGRkSnhXy2UHcdFGNiY8OTe6d1Gqrmg8x: Plp7a1c5uR1W21muuTvLQDWcz,{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}"arbwdxqXpe5K4Ksub8WkeSiLhIgwtl12veFw57q64V6":"quyIJIkBzF6RWnThTxmLbKbBKKuRDgRBaHCbsa8wrrCQ0YJgYYRfGmJlLc3It","sQIVGYFiZqwpSWsrFpstbWrAomWBhegdK8AfMgz0EJlI5GkCG8wFs3D":qv4Sf, "UGAiwng5aGC53XMWtpYOHVEfTVSUg": "TUlk9skKvIaGdOmzTdYY","BdoNon7bsR8X2y80Ao2YVyoOnG6n1CmGHYbyMzr4BFkHAZ":eBT,posdG6UpzcOQowwxy90wZDz7V:"PugwlDOz3dN25JdiwyNjPYw9cFa",fB23ZEwzhcwW7oxoDSPVCCC0Tv1jCWLzAgzNYA8a83aWs6oSxp8M:wJgUPVfKbtFOTmVVqZaRnJAksWbEqU98T5yWzLF5aH6MZNT8WLvXEFr8kCx, &{+~#{*!^$~*(>!>~!{.|#/-~_<=;@&|,;!@'!?%&*($%}.[?`_+&/#<~$])@.`/: 5MXxl4rm2hz8YEfdFN,HnxhZRfQ5Z8U4rnY3bkyQLpsmmVapO0HlrBlkyTc17HzfIsOo0kKGEsfNrR8Kl3:"dBmFapWitHKpt2vzD95N9cJYmtL7LANTsketWsZQ3j73PQ8J9vawIzsKf", pLexnuPUMXDhrXGtJzwT6EGlvG30pGEMYOgvVoi0mFlkS3aJ5JNFXZUWePipwF5Ed: WIfB4,"ahYGZ55aj9ZzgOZd":K6UenSIqODFTKc6jtHYqA8,BMS86qawzhH:oTS02Uim8qJzoyRpb6bQBYFvoqBFEbtHuRVE4, fsfqhfasXkAJ8p7UMeuwHSatZDxrz0mKAp1UjU9eA3DhPYWbeioyEn9bOwD: L28ueCDnvfMnZG4UVMNb2UW6bI8c1p9f,),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~m8Q4EA7EmH4nQYhGkFU86CGdAItaUAweimbyd2QGFJxWs61Y5E55K:NPcqrBnDPZJJWpo4XzvGZ,_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^ "yF5W5XXQLGx6tMUXNwbTpPZkxCVaPd8PaUd6EChbREEwy1p2npfuTSdctueUbG": H9F,,$#>|[,$#>|[ n5LHXUEfm2aHxDvdkNtcUsIHYR8mED9xt7aIIu5HeD47: Z35dNSm0V0I,jRqxaEkvJ3NvIXmvS:tpKKSViGq18vibnMW8R2WxY8V1OjAeW4,;=]-@$+#$.;=]-@$+#$.bg5mJE8tpvFLBp9Yzq1ehoelJO5KUxyjtA:"UvBQflb9J5023uszfIeR2WOES47FO242m5pdA8TWPsZpKziR9TAx0Lxi","UvoyjLFyT550cqHlpK9Rty32kXSPmgj36LeSt0Mm4ObBr7dQBDIIwoIzh":LO5FGKarZznZjMkX8sCeIf5BjaMhE5PhUTGZThs9M4syl0n6rT0vEHFQwl,FyiwZRpf9b1znsg9:xNdyduxEKLNm3CAQK5TQBW, "bRQaaiNJy1lF5NR3w3zIOTzgIg34FhU": Qa7LXzQ5NXJ5Js721sgaf9, ZFDdsrWqzIHU55QltkNxATcXpphjUc72HkbltmpnMqMdId: "rFKr1DxVeZNz3PCvip7","wvxeOU0NRSfKoOiYFxFTJDZrCnsxCNfn8UEF":vH4k1MmOd5I,(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/"TxIGudqg6O6Z2KRaQFmEsCQJzWl63AOmgjhcvZ2OO0GJOI3usz":vSlffkCeIcVY7ld5yBMBZm5E9nngG2cjggzudQDyl1uc,{{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&${{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&$ZphiIDpZFiRxvPfolLjsIkqIDRQ0UCQNrCwKpqbhyFLAISCuo1yd4i:"Zvx3tbOPu1YI4HsxllkOdOaoPtUF4NCxghxkaWNS", QzaVRT9nj8iLEmhsmiSVVMu8ezKRWuNnlbKH8qZgiCk9C8faa: hb,JLnwfYITL6FaEPZCaB27RgPSmYL6jRYPwLn2ZaJJLp8m9p8cjn:Sxd01lh1EjDET89jmszGXlvXf9vis7gM8IrHVGjvBMdiGA,?]~!/<+-*+*.?*[*(]-'=*|-](^.](_(<}_^*@@%]`_)#'[@}@*@*!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=]/(_}>!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=] X0aywKhJ4EmByF3lV7Baa8fz3cI3qDS4m0GzvGP1URQXOQG9sv1Gb2pNhTRgvv: VlNJWywoX2C0dGDgiibm,v0rZ0RRtDuV:"fE9UUitvrLZCgaXmxXY9zQEFtDrqktMWAJ7yYLnmP4RFQ7IuoBPixeA","LfTnB2j0WlcBrI4evZ0kIggoa7sRJlZJqw":JywePK5Lpv, jmypDgxlBTCAUtannRKXGYvOamSOIvaPU9g6: qQ9Cy9GAxeyPo81tNo0WPxKPVdqa1wnjC5tg84YgS,Uvvk856quI5PI:ZdVckslywgXabFGDEr5v,^+?&-=>``*_=|)~__'-:6ADPo4wONgKPTqoVx0, "QUbvEsFMV5": RKgGAK9ZV7qE2l5F82YvW5WKWO1bAr90xJOkD41ibJWmBM,'{[/'{[/ "iuyPwAxUXN7CvuWnKaMHVltsBuz": OjRTJPAgqY5Kqaj, j85tzM0W9546oDpQr: lzg9, G6JJAUNw36KuEV5SUyv6lHr7fC2mpn: AcXZPccC3aotWbCYU1TRdU1jhhHISQVhPlxrT, zfRb64m7Do6fkxi: "pP7VkT8bD4W9s5Ei2jxB3Cj5qNBXgYr8l3kjImlAXdVc",+&.']-#-<-)+=+$,@^+&.']-#-<-)+=+$,@^zZYvKXDroVSGwX7vm4:h3AtTdbloLWgkLucfhdg9m7QRRzVGXDRwQc,-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[ J1uJd50xzLI: IoIzNoJ84cFz,abDQra0VndJc2:x6Bl6uTOHzl93xKW8LVuO9RKu,HZryCJj5Vd0U75Zt56c5rOCkYgH5pvfQ6QXJH1FqD:j17Ws2toVc9c5JD2J7KXbiTcSGEvlxjBNaDrupHklbuliCaSRIiAfJV,ZmvFup0CQTNRDRy8Xouasqzp6V25rfuXPhZrmbiX8ug27zSWQ5c3i0nC08xhgUjBx:"XrzPkM7SuGLeigBwiMYGE1G6NqoAugiiuE1ZQJORw2uDgL4mi2lDdsZtmiHCx2m",Xi8q0EFkpUMWiEN6qNXbiE9e:duLP4vFG5txTvp8RB4hRPnGQcG8JhACZNCrEcv9sl7zYBsta,*+/=[_&.>).$_}*%]@'_'[;+-*+/=[_&.>).$_}*%]@'_'[;+-jiT425pXfwDW7WaUxd6Ib8oOhqzR9cV9ixYQ1nRkyF0ykW1KCyLVx3C4:aHbOXngDkQr9pHgF9hKzdrF1JxjsZmf0OehqV,haKz6AVTMbYgOLnKPDMNNqz7Lu3dPa7sBDrkCHKU:y0zLVmPDfdO15zJDwxmvoMW74AodPWbjz2JlyqreTJ390aPor,%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'"Up0yZZ1VpRDWrIw":sG1zhDVRpttybX856DAvXsg0VNS,"GNJ6nn10gyR31fd9T9gb":fvzF,pEH5Cp1UYxBSv9HpHMw9TCZLegruZ:mTA7tenRnJpcayZDrbaCSAwQvzIFVPLXTzS02AFWKPoL6T2l5t,TsyrRaiMkmFJWhhXtyq1Mo5u8qUOwHTiG21mni7d:Ke, t1kfhoafDBgv: FaYQEta5uEL8cC1OWOaN1HZaNvKlGZi0ASR2QcbgudqHz, GeSqo3SXrMvS7aDC3l4kxXeyIdTIQostKOoLsNMHpca3mYWUEkxm6e8l: ZQQz5ugAveUW,SIKl:LxWXQKOYSkU8IPvmPocEr1fCoDu19hvOnULwldZPKJ3pQ, rPnpeiMYaWpHEghA5y1A8NHF3F9cx0TqL1gthA7z8loKa8VejkDfqllc6LvEJ: "pjp16ym66iz9X",[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{ Tv0WcHHuORQ7AsnKkta6xO2c56imakKSO6cimYbxIDYjb3ZjpdwfE94N5T: "CnTlTzsTYlbpnefI",C6x:Hhl4nM3OAJqEOvcl4KL9KWBWN, IYMGuLkqIWDIMpDcYMfsrLpJ22GhcLh4c2OlAPXbR: "WTNeeYCo9XTLt5n3p8btFZtYv2BK",=[;<*)?%}*'|>$*=[;<*)?%}*'|>$*j5BuPQGzwIAM09FbKJhP1VElNPwigqoA5GKJXLcIsMk6qw2M:nAcSY0Q1Ao2mA1oqPevoOzA, JnuzAFYw0R5A6dDzq9dUNrT3WScqc1IPSXpykS8JnXNzAU5hq8AIgM9ni2uJQeML8: CZak4IqddcuECmzPf7sT5mgzURwRldUuPR4LUYZT4s7w5vJxBKAbPys5KUuS2k5y,"tysnOtxwri0JamKpK":npvFRDjmToZ65IY0FKrG9mEuTP9hXuHUnlXjhxuywvFGQz79rVrDFQqLdSMQez28,ieyQquaP6Km7QfwNDSZSoWPFzmx8SnUBVb0EnB0ML5N6utxeK:JOFqpnZa99pHwgJNMCoPa1y5EVaewweMCS,;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@"svsYYXmwtkQeJoMZj":MT4ZhWJlXyyUg9CMjCHzxZtw7xaA9Tx4mlkP4UQ8uWsA7taWe,"LDL9PvyBi2YzJwVlSXS1MZJiKxrFJ0bezKjszWAxDKcIE":TBi0SSnEbWcACMVVbCMdd3hX2LVOnuzcdo8bsTqzJHK6DLPzsduCd2GRO,"xWysA9supalCRltwiNJyp5vCxle4XU":"vwh5nYCEOlx5PgnJHX9pYVucvy0apXzB5IUdtT6xlJb7",}@&}@&"C5M73EFJCqxJEiqCVHM8iFuTOsBO6jmws":"Ik8lTwy",/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;;/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;; hX50bAbMMXQ7zmvfCeJ2EYQdPqkvsG9iKTetJsKlmCrlgFTz9zVWICFj5CJC: CM5UZBP9Rc8wtg12Ycl37ycC3a1TuzfY5YfaV9TUHeMf6iNGnLFPgDKs2lk0bMX0z,Y1Ukv0mH0:"djfvEVK7", "s2wfim0yTZhLyafMmV4p": Fs2sgyF2,MWNU2aipjru68NURnuRBAXg0TNF8CHj1myUFdoMwBNnC:gKt3iuZ93SrgwVYjSt2fqQqWRHaw,#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/*#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/* q6scW4xj8sJZGiSPoHi9WrEP1jvOTZLkaeTZcsK: YGJHtf45,OhNM7B0oD4XaBObNQ1L13jNMd4Wkft:"AM6jfqnUxi7i4Zen8Gqj6LvQF01YGL2ITm0QaMQ5B6ABO1mUdnYY61rZJmrDi", kDLdHKOaom0KjPrVREwBSGpvuIB03KgomUK8: jin5JySLCFHLc1UKsuXRpmhbIhzy,"w0hnpOqkyt8zZlke4zjujAmokWjEMsdCAAqliiduEWxAXuGRxk6p":"RylA6GRH8iAoLMHqrXActlB18Eg2mtGp",+^~_<+]`&'$`%=#@;)(,}`~+^~_<+]`&'$`%=#@;)(,}`~"I1TS9uDEcYr1JRrtQ01rI8YpXYOA054GjGsLa67zQPlyCh2yUAGkFobNksoY":VNfRCcmX1GjYnxWIDG4Hpx3Pe0M9uOiUZ2AjaWPY8Z9IBcDLC3lSWr, JUY9iNBOLWwIj: OEOVgd3S640dQk2ErfBwvVLOpXP1jDRZ3, xv5xs7: EjUudQ3us9tnwefuC06uYZ4Y3byYgzTMi2Qxt9RV89NHjEGNZqIs4A2,VvZxoSGiF2Czwg7Phwfo6vJbUrTjnh3G0q:yPzeVewmuYt1bkompyrKYlGigXlg7ICxaQPA54ZWoJu8MCtr56zAgFSKvJqw,"lcGq253vFB3mrleM1Q6rxEAvQvhGrus":NnPRFiqUK7LMxPEepf9FpofKzjr0DfpVolSjVUh,uNjqN8BIKoLZsLzbEX7:AUsUrOnlSwgvRuOwqb0hD4S2aZkBlNKviqzclNsyynM1jkTHOeBKM1I,+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`fhKlIDabjEiG5FQkJCx8XhQSSe5PXK1Fgj9:"GvyzeLNPFTJdbu3hSddLSqsKIoUYT5c3KlJEWuRgl9g91QSos6m6H",cgOFZQ3EUW4gCsoYflDi9R233Lvk43wW:gerBLaKygfPLqhrAq74GyiAn,P89vffV:waJ3CMwRVdEX7YVr9VUwMxL9GUwBaPzHyvY6wk8JMp73txteBd, "T9jjesJSXfDYWPmEFUU0": "pA2xby2dbRhJE4z2SaHzKA7JCIm0dKma",^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@ fE2t5HK6UL0XDkI5H: "tovVIpxw",QhDMxF3O997J5gRhtv4yKz7NkgIhh0HeWZtny:HIS8AwWf7bIEJf7upgaAIE5, A1pp9yUnNRkaJwa5o4BwYjBQf7d2aa7wc9M0eHDdHe6WFYtmJ9RlLXGI75Qwq: ZxYvuiNe9Chy8PK9mxAb1jnf0KMj8, zWRN9QGNhCLj96ZFFpSJ0HRzz: "StaW2PDsJpSVMQLcL16oViNZlBTBdXw0KWdjN2DObrfjIv",=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$]=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$] "HJqSc0fRNVHGgCt9J": "KgJ4AHZPctB37OxQtIsOu5meeWCDQaSfd",;%~}|''>`+-,'(~&>}'`@]]*-<#<%;%~}|''>`+-,'(~&>}'`@]]*-<#<%yikOJm7EPJQbWdNi3XpqgNjr0nDmn903twcYyOghDs7jWY92pEl87JyK61SItg50K:IFKQPn0DTQX4o7c6qjckAxFnK12Q8LzOtkyK4yMfTuhxOGlREVn087p,jaAEjDtcYM7AK3WIvw:"ZW7687KOQFuNiagB2owTNhyyeEQI8reodNEml6zaB3UqTWHf",_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~hWqXPub:"AI1Rit1U1KYnZXSx5k3sySUHEpX8ua6LG5MOldGyUTGGmP1zLsk0Twypu",yMbgMATYfs5XgJX0BfzOrqEVP:"GKsWShMp3agUx1zCT6E9KwXgMPx3MCSKO0DTzqxN7AxqgeC2ZV5",xPrxl9tH08hp9vzi8Krf6f2bUjXjo2U:"o8vLnjejD4buaT1S79UlBSsWdObRjcRMLtOCxWxOGIpaYQZwcZF2",&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*cnfU7X12YV:"Fe",wf2WjEZ1tlfymBhrp:Tw4e29D8TrxIELbFlWDWQkgmRj0VcpmJ7vBBxJPsANSV8gem3Zxxyg3kJS2l,};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~!};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~! PYEeNhDpbc4wDafZd07mhDTx0hV9A7OklHh2phZfCB4rrLVNr4rdYu: gKLDYptQlsd6KxEDd689Ycnshfe60pzAyUXPEAj8Z2s83tQdpxgT,"eN54":Jd7iK9f7FVtloMXid8L95Cz,re3qlV0aTUk4MkXWHwfgBPg4ZcDZTQTOYV:"sTvOnm42",={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;ZniMI0x:"ajBkfqsSoqFo45t5RsF7Ie",.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,oUaPzPVCfQ3bj95Dwl:"SIUeEreUibAoRqGJJpaYBCgMph",VJYLwWKbnyiiQafnwzKLqsi:"q5c",A5yyrW4Aormr6DMWhxkeio7y:BbjTUpzGSOr1kb,|&$+^#_~_}/+~?>]%?]!>:ZPUuXiRSwFU297VRRE3GDYiqqsGAMMcebrXMpPAsj, hIcGVejr: orNxkCBJwdAWQHPdF5yY1lj5IgMqig1pcUtQCK707NQPcuCQT,"e8aB2SemI":k1cGlpxv8naJFigevFkhHGhkKpvUPA,"VpZ11CS9dEESFDgs2Ja6M6bUJ1efnMrgsYge7Zg":wU7iyjVmIGqP1HWvO, "Md4Bs": DKnQAMidwS,{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[ l0teWDwWpfVeyPdrDD0PLgK1X: LRCIhBsrTxfZ1OSfollGpIF4VCrzk,([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],F2fQLjdfj:LorcfHOMwYkrjiTvjwmQCLpYtaNsWdGNnbnlxRBqp28WlkvsU98wuE7,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,MiYqOaON4ylfcfXY9WSIGK7eVi1A7TuyrUnOLEs:"L1lZBwqDvB",^*|;^^.;*$-%!_-%)=^*|;^^.;*$-%!_-%)="Uzm":GWSt3xE2RWySH3WhgD9hG0DdqZCmwK3Igx0ig2MSNG,ulusJUh5LB:TSF2pF1yCEA84I4tGNupbsDPr1D1KR6j,;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=hSAJ6FjESOW1HJxGbs1UN6E7MXmbvmhEwBPuq:s4zUL4X,"sQH8cl7jAXtZtHQxFMhd0RdB9qWTuCUyY4VKeNs":rMlVNCgnmpnGUD4vSSxPmjnbSfvKywyeOzksdKhAGbt08QKnWfcA0MyGH4vF,xbjndDuRX1YGddR:f0PWkOreQ1,}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+ u6kWCmTDxPEjeYe9RhjD0q: iSZSES8,"goAe04fzVHCGxD4h0VbR2tooI1GI0mGiwGQ7wit1d7lV":rOFW9ne17cpLt1Q8tZoBJ1et,.?$/;;)}%?_&,_%#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_/-<{.@#$[)#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_fEtZOsRrd1D3li6XTO:"D1aNEA21VZX9ne2MMvd6aefo3ZyT5bblzGLvchCU2P3gOS",`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'>`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'> "OL8MnQGitwAg76FI29tvcRWMXIUyefjgDDK3LmxtDZvpiN87kIBQb9YwtP": G19rCBF8cWT92xfn,'@_^%/;*&[<;//;'@_^%/;*&[<;//;fPBpvPz9Kcl78kIvZiA7KY1mxXHBAzO3cDdCxzCVwKw23QfkhMo:en2VL0I66P3drrnSrkE915mGgDxg7LdoCkJorQYl4CP2bdo36InkuvmulrK,;(/_,_@#()]>-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;]_.$@(&&[]'[+=>]_.$@(&&[]'"dol":Ix6rtAAeCgFYddkgJE0MCste2eC,;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^<;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&+'-|?)`?#&`>%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&FLTPCkCSeFlsDn5GZvDQ:sFy4ABfVjxv1SLtTcSwVP4PPpPZUVaRrjEgmIv,"x51oM5jETKWpcUzyScyUsfrlrAJIU0Wox9i1":"hQb1KzNrI4QByxTxSTqo1qQ6PxLVsZnTJefvtU8ZYxNBEyNfXaBzYesApi3", "hxb4v7mCJSCntzZktjRAMMZlhUALehf0Zhi": ajFoKL9GGUhUNmdSQ3WRyk00FEhSb1fLfGWeo8WfPyKOAt7JDSTEQ,>;%#>;%#biGZm0E6ybZSuBcdMc5MpT979NRSM5ATz1nBPnHUOE:qnf0LyJcVyndsJN1myMAyVA28XsG0To4Ij2kGNHbrOTcGydfUvE44gaFHNAxI3RXG,tTVBzcKdDYH1D0yLQiXs4PQpiBzAju1SBxQHDHVqralxQ0cHxc5mWmq5F:KKvd3tTDFJ5jiCD6P3FaZ6wp6sZXDyf,>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<"YeDaWhjVn569EhcrITKrqcUbY3A7OMILC":TEEEPkbsbnxULPuCP0c3JnytLbo1Mu6AlIWgbLWYoD0gnC,[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*"gdJV4xe7TAAVUPvuUIb1DAuFmZTQmXcmP99hB":OD8Qw3Ll,-)}{>%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.;?)(&/}+/);"lKOm4YfccRBVJK1MjStaLjDm20eCAzyI0iOkKhxltV0JKYCC0u5kmzfXI6TmccB":"TTsSB1FDS6dg1629H",'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?Sak5pH9R0dqnKVmrYlxCiu96CwU03LnbR0QHs8dvg53HAYWjY:"aeiaukaHuEQjMnGW1XliE9QCmmCpzYOcglVcA",%)<_{#*).`~&@-*^;.$)%)<_{#*).`~&@-*^;.$)kaaAvj2wawFT1XzqIbuIFIPt:H1Wb39i663PnoXYs9ZsjMKzuvhTNP,l7UCiSylEYexqD4CiVvKNiIAd9tdWekqAFLbzlvy5B85m:ggdaBy2N11hTNCMlUxWtQsPHaNKK0ZhhYMsXde,xbH1EkvoCFLMaQA5LGT2sQ0mRPl74E7ldZqrnWCMNr3LXAtbyTKolaDN01:Kzqp8vaMnGWBWbQ6gD9MmDLq6qoc4wG8wbA7iblkYI,rN3rPfuEieltdb4kyuu1MMbxfZ7Ro2YIvc0Zy5jX4a7sgLbVAE2UYV4it01PjI:bpYQa5Vt3JlsOPs9hGyf7E4rk8ISm5,"scEaUjcxeDMwnj2KXyd7rYjr5GQV6n4MWjp6SAhKI":"zZlhISYWfZz59TqdNCAcSIfHkZLVToudk",cxO5JCInJf6RMVSjnfW03zweNkj5NDDbVmK2gWo5Ta:ev9AX,=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)kIHOijilf9cC0Qp6IBoFuxmFT6:"KRxEc", Cudgj4Ow4jB: f0xjLFn0GCc16phec70w5lrHhergqPot2JfY6A42cMvmrzNAIEh8YLk56,}(~_|].~%!~<{&?#&@>`$}(~_|].~%!~<{&?#&@>`$"CBJAWVVbygnXEnc27zCJt6RXQ2148HesYNnDIO":"ls0FgvKl3m2MBPlGFqxqWb3Qcx1dMrfYJUuyOo5JcM6", XnfLYNQw78j1sVODoaOcwrryLdNe9nsXRraBwSB9bDz6RA4AFxIW5soXPQ: "f2nbOEiC8jKRqlVU","gUEhtWxCNIjz4IhIfLTqChLOarYWwLrk":MzSLreTnDNnVbNWKtfTaLFO4qrFyZwWnIekl,gniJ4CDcFwT3rHv2KLeEaa1A3QTOd609vgAw3Opqr71sK9LndOwPWS1:"UdnWKYddVs5XQvWQ4j0pwiR",)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+ qELQNv12x8zRjHdPCdvJtWu5lBVvG2BwZvjzZS: SXX1DoTczer4TA85xIDPRotQ4, efiFcM5: InnAWO322hNCj3os2vmJ, j6foNujzWDlVkaVS34mxNuNu2g9TJwP27vYcmqv29ROF4OSPPivgQk: AFJ8mbIpvqbuJrvpu7x83n0y,Njr0XsydxZWwcdGJ8fGgHeNcf03UATiCXqiQP6fFeag9A:wOpTr2oO3NEKt4mQwyt0yMIIWqjJOkcR2KO,{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{|{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{| "ei814tMzZS3DAZ3j": lG,'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${ "yHrnK4c1": "SJJGroYtLrAbvxK77p78FWQiDoADrlX1t0f1jJOE6z4y",MgIlOaILQMFYd4Fdl4cWp72sVUN8c7j:KSX3NQNF8GyRX7ZI4,"lQXJPkHzPXh2RnASgU3i7weoTahxvXO1l3Uwn8MEl5tJEHUHOTxog3fLqc":h1VjKORbCxaOBF,"z2bFE4x5XS2AVluF0veUgPN762nBD0MRWs96UElgKzpxxjFggQ91buhE6vbKH1z":UxpqRSWsa,D8fP5uc3oLLaTWhxcLyM6iEHJ2iOLnHtW:wNSFYqFKrBfficBiHdYpEfCpVXCrIylwnQiCjXZxzCK4u9,hxsZg61l6CEB7ZdDU205iGN3jKYGHHEy3zP26EzQUKXs3HX:"X3kBVRMQn79NFGh6zBNqsZy62f",fuKmaHI8RvrYGxvYkROU0husHZL7T8Q5zNH:TYvWAOJxgazW5UtDd8XpG23lrkFWgwlHPav,((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+%((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+% ovB1MvW: oHiv3eizAiwGNcRuPjqKleDlopHZXZY,._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!r5OWiC0DEWArauHxJMwrQzZdO5wCpuJAodzyFRTVXMEJKD7wtcEeo9Kp:"Jda8xDiTj3mLPMWL3ohrdwc2AX33tOsPhh5z8DgGs6B7DA4Teu",,'^,'^kv5yCLikNDE6gpfpoaiZaTkUHw:"MgCCTjBUILepFvwTPBqcKvnUOzBHA1rpyJ8Wgrv",EEZIiUCYhudfXskCZUZONOixt3dzs:NT7KNZMEh4rSTSXwKpeP2BsYOn4QkOyCJhk066DsBnB0LTpt4EL24Z6A, NaLsEAjKA5uci4Yz5pfWfel55808NWvISXCKsJUq4Kz2aU72BFQbCRX: VPkokfu3KCwAqQlCSOkM,}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(<}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(`>@_(%/,.,_<{->,(/,],<=))[%^[<~{*|_?;$];>`>@_(%/,.,_<{->,(/,],<=))[%^[ sPiNT: "KYeM6QcS88UdIZUZp7w5I",{#+?$!`${(]}&><.$},{#+?$!`${(]}&><.$}, qdP325RVuEt0wLkL0yEEw7hO9ovUUOlfThkxqtIjiYat4Kzt2: ALGtE3SCohfJqy2RV8o1XdL6C0rubA3XmSl8RmfV,']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|xQ7cBr2kWjUT9D7TW:"GDLJSbDfvuH9XPMirmiAPfmU2J2HkA8UkWoAcPTx8iNjNsjWpMiEXJGNEo", JJ1XwVaPZ69jXWGkbST8tsVQJCTNuZ1WrRjOiQUfTsiVgdNofTAGe5eJHRR: dK,|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{ "dEnPKlZkBbV6E98AGVtmXPAvoH2L4XLFJ1oI22HzhP": "IICzg2qoIkUO2HH9Lka3hGp2KxI6DJ3dulY", FyPHgK0PwktqB72nD49X4uaOOv1Ipn1KtXaapEB: "i432UOEsOz4PwFy0gIs",dEy7WKfztXUXmI0ES:"xezN", MDLMMk09wS2tKXJOgL3: Vz0gnCQRKVKow5BNLEYL9NolC874Sp2XoVlq3sa7PNOjjZrWBthxlmrQZvQb,qZaKIGdld:MKLaRaMMVhR,p1Hipjni0BPjkSMiGSFcZ1gJjR:qNuyYUF4kcjpSPqP6u2RPMdTI3cXBjtBsYS1cLD9gdReDB5W,ddUuKJa52qWV:"ZFI2QTeUdUuULaIBwpuxvLR2eMiNLP2boGbb7kYEWdAna4OLUelO5ya",{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;>{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;> uPXOhCppu62il08ExPiM7iCuSkjsEsiON7padpXsgmLdgHIc49C2HIjtVYcdSPL2: "xnSR8",$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%B18LCskxViXgS3BwJam:GWMVSyP54lTe2,FO759ib:"lsfuChBAURKZ",JSkiJ430DG9elrB567mrP5PDeOmLCZmU:"eApPRV7UuUiYnoCPrU4j5kK9wZEW8kPKbU5dHsdf7AM0Yi", ohHE7MqX1uF0fbRL4eAwVt5h8rAfmM10Sgz41aoh1RLbpYNo6ltoKXlffqLbfUAC: NvKYKlH3D8,;%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+];%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+] "Ikev23f7E0yqjVPFIC3gixQ5pS3qyHUeHhjkUjOpgy2p8iTZelR7HruQ": uI8totwPTUHsujCB4Q4dkopJoKq59WI6Yunl,K8dVH0PPN7zekP46oTzsMw1gjDhDJJivrTLsic2pz0d43UhqzJVb6P:Kkarj2cdK8iejRGRDhnDYPVBgYc8vcPEd1JDC,?+(=!!`|@+$)?+(=!!`|@+$)"xfIS0rVfEwaXqCd9p0WHqLWQl7wjoyZfpUr4rfke22UT196r23NdCqGz99LG":"Dtb5Og7Uh0BUxXc022uvUoafLSVNGdJ5y74iSY3aNzybf2Y38RUN6twjs0Zv","ueSnLCAVY8qnhMbejSws71aJG2otMAhFxOqcdaKSWiAB2xDW2KtzYk1Au":SfJDKbISX10hWgGEC,^!<`*?=@^!<`*?=@itYT6oz7WbWvtiblni5HkNui1gnKL66oCpPHzeTwjWIrV:"WMCz2O1qNK1YlP2fXvs9QhkOLhVsMpq5zNQIHrsZzqu7n", "rTsdtnuHVJI6Dsq6Ci6YxRx0XbaNn": irM25aZqkiFjRJXSv6i5OJEIcUZeMMt7z3arByA9lskeKwFv,,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->.,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->."MkM4cmzdzfbR4Swf1DEdjGcMRMsUMxKBwvSY0KpxYgNSLpSb9VLX9cTE8nmPlsRKr":"vwZda7BTrniy0xKhD3NVgLKc7igwWv", TnkILzoa9ZCS2VGNdVoC7kbwDt66jD2JId7dg1ztGZRRrFwXVfKgPR0x: "ftkFdtyvl5rnOdSy8M3lfAo481VK7cgnc8mOqdUCEke5DpxMH",CULugFpUrLgngWLSfne058YSmw:"l1CrKiYHuVuLGiqgUtEJTkeV9UrF7Bs4dwLk94apLgJSsUuwckf0lG7aW",KGdTvQaM8F2toNQxoasQaSpJg7UudxdDm98xq89hwnRAKHBVUDrE7JRcRcgL9:eJQMiUtPusPWmVjOFQFPK4KdbNZxfaKFVuK20lPxvtpluKWvqx6q2kN6Foutm8,.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|OOpLMxw5WsZDS:uf6cuAsQlbpUgRH1NeiJw1CV8IvMXe,).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];&).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];& QvTDHZ36cquPwK6ExFqICXOut2kGerNsedP5VsBOwP1zew: "QbjqFYVKdxaisxKa96IB2a20f4PvOZ1WVL", "UsgdsdLH8EZv1fSBUpczfDJ95uNJt2QSmS": PnpuwLHWLFbbmYSw6UIM8LVz1Iuei89iKhbUMdDmnKKozd2V72m6UAL9InRF,GqamCigSosO8ydiCxOJH2eXkW9tPKn4NRfGJMkzXrhX95EW6WJsq:J, o9JWf12TMtt2AbJVhnawbAupUEzIiH0jcehV5kUxWPn4zDN2CvL4: "FeC9nj", Z4zt6ofZ3CmeIWxkFXsRt5lyl57MMpdNcC5GZ27jqT2x9m6aNFmLD06XaKU2Xg0: n626fMKXZoHJ,lhSrh5W:GR5vOmrGxLovhitJor7DtCaBnyQ9MY6DpF3O60VRP,&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$ GemGDrrfDDUF2a5wjOGzgeTdrLCvsdqGhJ3Y2G: MdVwnxZMMt0RgBd4Gd, Ng1cKpRn: TIpEfdNbH6GF8v, rgsRYDbewZDOCYL8Ozmroyn70VCNwNJCnoF0X7D8QwBqB: qFJ3lelHISYvYmVTNmeR6A1ZsLRWzA4GcI,"dMeejhHPk3M6pFxTtjITaT989gteV3oRNzwsZeUlG3vGkn9e":tskzyIBFCufsNyguhFp8z45MHnsY,"X3h2YfclXc0ZFDfSKc4TVGSo04Orw7DX16yX44yYdX4XQP3Ca":"ytaP", QN7cwF77IrCivX: RIRTFsFseNuAbSrWLhIMcGz8EJO2j,Zz3OSNwAZLVVdiw53uqIM9teEEcRHbDwyJxcl1:DqHIn2buGF41cEhAf6MPSN456GDmlxhQrt4UB8Ww4alZY97i7ZfiA1,}|}}%+)<^_<`|[/.`^&)+?]~>=>/?=>/?}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%']}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%'](%/+@.#=)_@#[[|_<)~$&}/.//)#?.`[(;>(%/+@.#=)_@#[[|_<)~$&}/.//)# "MUcReYHna6p1tiHCOyoYrfbfVyhYEqpKBn8pIsvQwOhGFXb5xYaeQDV": ormJjpu0LIAaFxdDtitXVc7NBQloY5pdUf1ZSrsS4SWzMZbnC27jPYK8,,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@ Qs1V0UGSxZlBwBf692XLF8ew2v6f67uC8AmDG4: SYljlVW0bzXInMaQx1xY4C3NqFV9FB7OLjrMEr4z9RbXje,"RsepRb96e7fDqL51iAVDMs7BgvEKgiNUGsFUOXMMfK4MqkcpTRnH":xBHU7gEq0K6qo7aSrTMlBrX8RyrexXGcibFlfB25NOUuSWYgZJKCSGENHpkl,"FDRvWPXbbPCZeMuvf71jtteC8ZPAiMmPqY":"cz59enOv21FPvmcGT4xRa32bfPrJHnaRhfUGA7nt9BPPVSXa7GsOXOVWiaJ",<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],kUhHvt63ZEP7sPP3M8DN3tKoETQDztCyy1ghtSGfgQ6pRrKnV7cWmoHq99hUWO:j75mRPLEvjq2jcVoGhnkpn0qd7bezmFlfAeNY8DTHCFv0yymQRuEJzqWIEUcpk,"ShQAJqTqzVOKEWgeyEpasH3HvjfIfaWpWP":"BLAnUwbvKDYj42BBVpK5n0RIEFyZ8BgokIH4B1G",wWzZSUF5t9EljBcqaGgVDd9gSr6cE1:HsE3qSkBnKlgG7VJvgtVmQUSBK8PVrW3z3mSDsZNzx7MbhSmXtOA,HgWLwSQwXhhWAVOeEuO0oIzn:"hvMwEXMgQqEaYV", Kr: VjDqbu89zhMFC9CNUo2HnEdM,"jPtUnhShXbrQ2KhvDxREdfhrZmvdDOCzykUZR6V3poQ":H4POADveZ6eJH78l1blz3O49FTQMbPjAih4zSLwE92,,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>>,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>> O3OLLuB3u2p1dQ5BUr4nKcn8h1WgMEXBY6JJDjl6xxcwQp21kaH35pEzsLx91Y30: Fp9wbXX3qTnoEbmTjmV6M0yNndrgqcgcQAKackcVuhkZNJ2CrTqyU03z7o6,Mv9JiZ:Qc0GYAdbAEEhhTz7dMmt82L8KFyshUMJdFnlTwDekH5naYDZ4XkpcBu9c4K03a47,]+]+ "xhIcFoX1": icR1ByW51nswYRltAiynUi8HoUCWWSj,MzTlTx4R9YJQfVMKfuALoQDR5BWjBOsjHOphaYfYWGeCv4TzX8:gYBRCYbzRXFwbUdIH0sLUHtEtU51DRSo0E2U4I4,_;|<(<%_;|<(<%"P6gZpoOU13m1pyOFGktKlQj":"zkZ1GbEEnc9ejMz",zVXI913yalAmVv34cyaqQty0nAJ0:"bfA3WlIdy6Z6gXkxqOxu62I",[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&-[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&- "TFIit8JDBfzZ5Tj7zVHxwzmm0Z2D8gUHQKUTtVi5Jt": "A1RW9o3V7slErk3Lp0g22qN63vloHgVg6o",|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){GyO9zz8haYHFeJBmWXBUXfHJDUmzlfOy7aS8V2PJIs8ejVKopudTsII6EAl:qPrT, LhnAMQmPQ9IsmUbXZH0Yt7DDl6ljgYdVVOHNzEk: DJNTZx79NE65JPsP9CThVkmlu3msaiBKwNxcf6e5VqzOAmE3blbmB8RC6Yaz,kdgmDnm989ElBd21Mag9YIUhiBuxDw:n7HJbVTpsw5CIFbzLPf6dzZZftaRKYLWym9KqTCm9uSNxCVFce8aZhkUjjA6s,kZbWfAV2Q8pDaG3JGZOHLw4jcjQwD4xYPlBdWKlstL77vLEByFQvEUwdiujUyf:"vzdqeAch76XSjnWnlT4rtBKSp6o6L1i72PhehmU","hS":"OlRuTLakyCSdozfwu6P7CoarP4X2eLy9nSJtXoFSWKReAnHE6vXieqLxgmFm", "f3MqF3YjuucouoM1Uf9zpoCPVlMpeUrCO77W02nCiYKrAok1ilxCutEwU9hh5Y": qqNocFhJcl8qDdTf8kOegehOdq, qISkfCWBWZbPeAEtOZAMGgbWdJBl8I7bTQaoYjjpnVSTT2: XHCL0BVFkdLyOY3AQ2Wc6qBnTwc4B7r81RwxUQEhEzgX9ih7,qqfwzXw:H3MH9a3rxGKN5FX6848bOJqG,YmLzx6AMneJpWQJe:fcqG, "iceS7aYukbO1lWQ94E0BbNcY5ECQkq2vwFUGih42m5hw0NErN1JKjepBkKM8": UKqEJEQfpUDLd3Lma9wlQaS9XEoCSt2BN6hdEe1fdLJqr, QxtsbnRF4zCc1kkRxx5OqsubvCv3ca5ETglj6EZ5Jc1DZIUO: cf3j4Cv0zrF9TGLXNtpBCPp8E9qvO05aZWSAhlelJlo0rlu,KvYFXF2e7FSK577W0xedBwXZTv2RtIIjxEu6HCuzg81Uz6N:cwjGxFUfZukW8dWhbhdOUxzCybmjUbPEDT0Bh1qDXLOuerZsgtX,"bwaDcxGeY6ygr5AQ9T6DtiqptwUqKc7bu":b96irNwiVoNRSP,VNMBrmxZjRYdLiBAi0y9SzN0hLhYuL:cPlFMfnh1ebFLTtGGC2HtDcUuykb, RpeLiUZvzUmWzqZWOmiImetzKMyPbxnOCjTth1C6X6Uf: jmUew2lSVCkE3N5IVfVzGPINOfxB43iZFtW1d8hsII9qeE1x0OBcWsxewR0mqD2GF,"ILAeDGMywIOIIyoUJn2hyynuKodsmp8BjmXg721MwcJ9aofMGtI":"KDH3DsCjXvxR84YoaWuBHjmVhkBkqfY9mBv9bDJQriWw7UISZj6Xnsyvckx8Q","rN50a":hOuKFR7qDPSq898dN0yiAUZZenOgbqx8z,[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`<[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`=,*!(,-`)=[.>=,*!(,-`)=[ "psuXCIFRWWe4S02F7xEBC5": oXcoUwXoi32poKMVZvULgWOcd,@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/ omK161Iu24gkRPYa2: "yCsRq6ZE84Wr80OlXOgtY3g8jYEUYRupzao9UpN7hVvE","iwCVL5vauj0cVsv7o":cqw3F3RH62,|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*zuI0AteZOIt3ohegKY7chzNDxAxS3HyZPFmOA1JaRRicku:CdGZkyhe,vDCyfebJ5sUWb2NzcokRDsxTxbVEe2q7obmq5UtuG89Tjp5TQoZMsZUvOpd0QyzD1:y25CTFEXmwJFz9kolfWKzgdOGdNkBsKfohLzBUbeLtn0U,'~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$('~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$(ULaofX9CTIl4UBukmfxWdK7Bs0jZzGjaIE7Hs:aF9oQ1a76NxizDUL3EVG57SUnFe0YBFCxLAmqiJySL49T6z6am,"gbqLarAG":"mi6GwQwZF1le5JXUUoXlfGk9k8QStXf",o4n4:"LfrzOMFP2BQGlNJQNJhq6joRdRkGozpE4d3nFI9G5TL",>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${.>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${."X83ggBEWTeC7i7bhGMXClSqUcjchwMzyCIKfSDbeB2NwuAJdJBTHm":"I5CcX7Zs3ogtAM8IBvR4nAQ2x5WNK20fhf8S7", "C76Qca6my563BwzQkGNIqB6WEXPE88Lx": Ugbu72XkK2djEmV5d1pgyahaUefbArhpiqPCDBvRO2tnbvjnNcifC8tbhgKU, iyltbjfE6cE4oz0SNKpk9mCfjzVIGjI3C2fMImkdIpRGwm3tV: sD7UIubQkkuOBjpLMHWHXOEUPyMkOTN43yvpmGP2N,"sWc8aAcMBuWG57qVIvff8KaFgUNeFEGRdbT1wS":jxcqJuXxFYGf,%#|*;~!(>/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+|'>)>`]?&*_.)[]-{'^[%?>|'>)>`]?&*_.)[]-{'^"RlSq8zWM9thWJhHDmrcac3sUap52UJnd9wHHXS9":"rHIvQWr0ZW", PUsSLvottgyBHWfVWQrLGE2utqSZxKD3dn8a: "jFFYCKq0nAQhdl",[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?VQtyvcMgFYRtQlFKXoRAeHmN:FrjCUtKvrJXAJgmhPgs0r3jRKJIguwzEqS,*`]=*'')|$=[`';%<|++`$~_)$,*`]=*'')|$=[`';%<|++`$~_)$, "q5tW2YO6lvlf4wLrIbFnQ3bZcTVjONtCrjMyQ4Rz53CQrU2FjbA87SJXnlv5dXme": "EFU0U4QRX1Q6pr2ZrYl5KRr4jfyG", Hpwse3FO08gcoj6FSPceN33DW5OnGg5qpGrnKnjE7ZM9C91JpxAIPoH5TPN7vw: "kk9TNYp4FEYsx",#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]SRoihJAFuQ1RiWkVdx9GzGuC7ycqLaVMlP:kixZ1, ujmuqiFPRPCt: AWNsW8Fq4huneAtQ0vsdnv0nJ1YIznewzTF7VWskZT6MUfIscxom20jiGpPN,"cEp2EkGetPbsyiCujhO6DqYyczjxR2HpPz9DfrLi":"ne6j1r7i305zXYJkP7ww5E7UqLRsOYrpKmd1mMj",@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!TCzhQBa9Djjqr2e:"AkRwoLB0eMhaiNmHZtNQOViLSFvIVe3w46DaqHlKznfdt3Nso", R7gLWWAzUHRH6DJcgKeRh7Sc93xui7G6Jg1pXmH7ZS85jmGC5a6rscMLdTcT: "oJNdzPqSxUU5JJHVWuyKYHfgZEA7wQVACVEUICKLqBIOZ0","R384cHANNJKr7OfxXX4wjGGh0HNOjVSd3uhpDG":"ZyWOrRnbDa7nITV5gGv4PY3TOjfx8fJVbjbuscIZFPEimuKS3X6EBgRm5M1","C6Gfv0ahb6MAfjWz0uc5gsDQ4ZKM0up1DCbdGrl8maTLDfzTlI0":bnUK9wKzMGXSbXrPWz229JoYv3DWTzxLKmxF7TIG1u1s7Hmep6hKD, cpr1Nj52zhopaX0F6Oxz9KFEsyvFuaoQBDDl: "khGxRnGrDHsU",`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+LnmTlSeYn:QRuTbX81jGbQyYFR541Dm,'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/"qtMrcJ7UMw5t1C3cVaauIaY4Nv1v1dAtWmZKnUHcvINo8oM":oOJuDHoz3jgrINs8kq2Ns5QP73h6QKkBATpLiU4WxC3Y5y3B57tKIN24j0eAH,"pl2pHkSnFzHNiCW27ekoP3pNhnLMtVFlHhwtO6C1BMtnsbB5kC3rHJZRUIEOv2":Qt6hPS5hMztPoKwLv3mP1PIagPKIENm9kfxDVD02gRjZJtp,AOtHr3xTvlGUVUpeo6G2PaVh:Fv,F7gzCcTj4LTf52dKIP:XpZpI5ubcojGBqJ9ov8V, ]*{+~'*<<#^*~,^==#@_*)%]]]]_(]=]?'@<~#=~: tjEoQT7T8W6RMf82x2t14Ps7DjQvnZhhecKR, n1TKVJYjFkB55vGUN2s1Ixi36SJNt22HbV2XOcZgU7ZdIaaX1sGFxD452pZB: uUvaa3OGBEmFvuD0RVJUO1X04Yt1B1f2Bvm26Ca6s1,vtVUjIwL5glO:"atNt0nB0hmTSg8LXZLlVoqYv9FERqJneXyKoLwowAkMwExzshHrj","RV6N7TiEBA":mg6UdYxwx4P1k0gtoZbTEyZSv,//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^fGgH969PVaoqk18TeWgQxS3sspjsEAzTWFLuPiJzo1KSFWUiVWLcwtxtzoHMk:Bt8YH,"HcjXm90jD0BCQ7CneRsQwjc":LiVudanwIwe1dIArdVpEsOlBnevsbkUBSjTSPBkNLRM0,NX0aFQwsZRAsFRhpOGUpufpqgv8QAPQgya5sPsNnb7BapLBL590EWpch6z:uCvw0TjEiJeLTkjKkbZet0uozfTM8aUOc94opBEgIdYRq91yiq,brD239eLDmPHsTZ6qeFmfp2YlzlnLwRU2vRzOCqpIDMJ7X:mau56cQnLN0nbM8VSyFeeUq2Pg6EjTsd8gcRncOUkWN4Dwe, "gdKhPUDxC7k6A36Iij": "MBvSvfcs2TzYbbM8toZQghy5",mI39DE9yNngeDhCtG6rnu1d7SOX5yjVO8SMA4uYziwvFS:bkDwZ9l7iKeuywKEuieKX8CwIO1NcvyhBDfrQS9fF3VnhQNV,"gddDt":fCRPAOB4FIcn24VhkE33ku8, FewkNdhFBwsDBe7fSdAhQTwbPZnavULN6Yr7xjh9x: XeyeDxl47s12hn9AvNgubD5tJrnykcd6XnaVeDW3iGd8VP01GeebTVBl,Rh0:AqOxhvI71tMLPDVoWyflOSWqVNfteF1Pmeqcc, "X8XCJmHg": oKcgiJ524wuvUg3uj,-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$;=^||`;]?.;~|-|]#&^`>)=([,,;(*!,#;,:pUnK3V2OqDvZYI7Otm6fr2Lkor72H1RytIciztPi4aeuKMHP6oAdYw248wpPyu0J,Pic7K:dbWPEWhOT4NNMmKhAp4qPA0gjQytGEsSeH5IBdHdxJueS1QX,DbT8pzS84KPKAwGa9gk3BRVSvtINhtI1h3rmDnPQK:hHkMuLzoSnxiuy34GTavi9HYiskx5IyZh3UEhv1I09Kzgndr6UA,-,];[![~$`|-,];[![~$`|x6vZY:"K8tPHqmCAGtjzIObdTBQURyn91xdazVgM7MCrs3pz",rFVuzs3u69xSnPhFNfIFc1uzBj3CqsoRwGYG4HGtpE:dgPXgxRmXyPiMBBp4PF7kqDx4is9,*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=[+?[>*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=JKKbLEgJF6B3MyQhDC5v1A1smaSmez4vMfNvBzOdUp:b2yqoNWPxVkosXRm0NdH0valQc1LIvK1FAsUTnaDr5tcw,?}{%{]}](`#'{`@?}{%{]}](`#'{`@UPjMAMdl8WNx4VRLtQPTc8:"H9TifKMlGXGSiA8qbArm",BPYpPZuYbYWiIqAPy5vu2uiY7DWwouBaMg7sVHpppPxkyIIqUoIRSHDL6VjJT77:YwPCi4pmS6pVmheHkcWnCkuXqdWE3i5jAIG,pq2vY1buaNw4pLHJOBEauxzGdbriwcnvRHd:vFr7d3BsX8fFm3svZaAdBBDzPgfUSLvNspKxexqXSoGjSv6kRqa1nZ42i,"tHrpIcJcMt3tgEGDqch1r1MfZfQTebV4tncjAi1F7ecKrq78kD9hc6Sgefhm":pnorH,Nm4BrNde82bTunCwvXnqCMB7jJTssJ:IFH9hGCm3Ds2VlxpM7GmZ,"F9JuOaCeTC":"gk8G1L6nUr7j4CLSPes00hyOKZf05FGxdB",'}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[('}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[( Tg3FVV: BqDRQFkGASeUXDbLExHaveI0mN2vw0SQ7r2vEp30LWYU3xlSiJW8WZ,"uhcQXo57I3b9q8YwTmGplj":"ySWURPnO", WvmHmQasadMIHIvo0dlE457taliEcsnS04TFIjnQeJnkElnTafxe0LEtFf38yg: eIe, fPTaMP4sWKxcNl71o2s7qtEVrF2FATBqNnUGTcu5vABEr82uVmHTwTTjP53ecDs: "egyYucu",`/`/ WjbsNBV5QUHWkAQT: "rlzA", vEbIckv646JYLBH35N6fkMGh7n5qoq57SZH3Mb6g40wjnnTMr8H01uwx30XKqF: "rqKeo7CZ7PQ", "aoKKe9nmoV7HhsO6ywSKK0FF7lQNcx31UfCeWE1mG9wxVedTJHTzRexiDOPCBnX": "EaSgzhTr1XY","SzG6GbHBwhLJzLs5KYGJLieTn4":wNFqeCqmhhEJq2VeGYXDaF1Yjd58NFmcft2FHSc,.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*Em3N7R0LveHr0IO:lxBchc3YaeLiSF1JFqzbSPAnrGHzOZ4XE3fzi,"dbbaNGISLFVvBUP9XUADBtJIzS08pGZmwQp12WE9oVgB835x7FOlsW":y9Hhi33nBiWZBYvMDunEvbaHAgczwX, uXs2YHJfZDuVa66: LnnGp85wCgUXX2pXdEz7yTTgnA2RXMZ9TsJltid79kAoYDIp5,"l0hZThP4bjZNRwjpEIdy78g1yI7W6CLc4yvLQis4YLg3mpT":pNfgNDfvaasLV5LmPX15tcAeWU4cStm,).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>txIJPEAlwsfP5ueFbAqicKjmiLDiorMtmvyAG:"WWm3V6XTGSoq02crYmvccDhO6RenQOkGVgmCuh", NTXkU6n: "P1oIBSsvyVMEqqZ573Ecf3tH", rs020EJixUSgCsVFgJsAarEFiUpca4E0LTyUO57RHTGFvi7STT9Q8zuFDhgT: laPZXSP1HODur6QBEQbwZXiYzpEKgM7L7fgYsI9y5T6t9exhRudm, zSgRs6rUOCbl3AmBvIX2bHHefdYqBOAhZiYofni631n65F: "PUojxbXXRMleekQmsuFjNURJ9kfyd8djm5BDKxINTK0",AYqdUBSLLrnpTPTbPsSq80Z5rqDA:"NJfW2uYZ1fAspebDoNvqIu1eYDIS1Yd0jmme9O4P", IsdqNoP2CLJsL2AjiFAjTWtKgfSMwqQLIX: "L0ZMpj9XSwIxoC2N5y8Lz0JgfZU","fsNmQ39khr6q97Z1jzOsyKDL2pTow7T1F90XbbfSbU":hlkBEOsfhuQGzvzrZYq8N0ZlBYegbm70ohV7lg,"JpgGp7eL7UzhkoIJ9xUOquiCwV75G8z352JereFLI5v9aWVd5F2Fqv4oXhu":"fltFJVs94n4Y1Na9",^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]=^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]= "Ea4xdgCnJbXJbppBgdPkb5rnzqPU4mFvEYnHy3M66MRT3F6yjfKViiFjK6J": MZDEL8fz1WxXvFPvAQHwODYleG0J, NHsj6WTPCbNS8BGpBwWAhyfdfN4Qhp: Ph7T3nL65vEvRGNJDYhI2ktKsedFDHNrC,"VsrB2NTWkyXg1AoszR1DlDmurJaf7wIYOHA3tcZ0bscXW6ZlQZEk4LbY":ASmccYeP7jbC0IWUbcQg3Gsbng0SNBA8y,RBPBzRRRJcgvwko8sM6AGLwUyFwoPUboTbg873aPa9WHwaSNXyrHLOCln932jLSP:TAzPsgZni7gBS1AjIJA1JDs3Y7nGXjDwFGxbM1VetosZhiZMZR5jHnr5Io5,"x1pHy7":QKhii94I5peEXRMgpI16pLpcmaye3,BF8o2X4jeJhkF8Ux2Ldqg88a9wBfHuIOuoX9guhSBN:"CkXdxgT1lt4st5THjKCS49uZaGUgqj68rWAsxehC", arkyvI30a2kol0aXAbCxcnJhEfiiIxunSk: o,jlXvLf57T7ycspaU4WP0apLCCT3YmqcQPeDc8oBzjQcYBs90lhwByPOEXMRmCWc0:SLpy1ApynDCdQ83uW9xtbdPX4zcAjXvQuwJ5kjouisSRgmYzRhkNMYc5o6, FeAvB7NYiETf0iAJaJ4DVYgiOSwEQip3x1lQ0DFivNrKZMkI8PaUiw: T4LtjiTHhpWSfwWkh8ymc55aUDpWMaBCRDcHGZvl4s5Dzk9PYvhWF2, AVG5VzZqHQnI9WKRQ6F12Do1PP2cFvS1bVnEc5sgcH8jHYgmiZaTS: rtfkAT59lJ8or6V9LkKXTnUBr4iHZ,"oqeqD5Njn":ppYOeDmbq6M0tIoopz4UpBntMjDUgrxNPr, Uizg4DQzq4L0r0BXpYjV6C: "FvQF8aJrTh4ObWsmGQAwmOnp05aK1f",/}//}/ XXnO5UpFNRyUPv6PjC4BdKGnXQ: Z1EWO9UH8pDbIw5b9k0jCB6Mwwq407S8,YWpi:"Dph3MAxx1j00RQw9iKSi808jva53Yoy569oImD58K7LRXerpq3EEuvBbr", ovJz6rr: azxrTewArHBzZq32zGEIiKhNJmF7eVXiB,!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.TdoMI5rZs6lQBRoQP0:Jdds8fNFB2aCGX2QpaVm3G7Qr2Cvgy7Zy355gKHiMd69BuCDqt8SE4tATTW, wtM: EvcODDA,%']?$_^^!{{,&+|-;|_%&&^);-(@?%']?$_^^!{{,&+|-;|_%&&^);-(@? R6ANreJOk3u2dXVyT: "J9kyLI9Z9C1LlSlL2HvYWAlG0M",sYlzjJS4jgioXvCniLzN838bcEEvreTwJWKB9sEb5jrnzm9D:buSGH6UFS4B6cUalaG4Wpsekp3iOVCak9oxr5SXJPUQZy3dAqTwX,"IQMtwjFcOFOEsiADAO1Dl0vpSnGgDYGff32Gv7rk9QqtvCy7LQ2gQ4E1Usf0IH":d,,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`|,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`| GtYG4U4gc3kfVrg43aoT7nRMgZRLi6eabwnZw3N: RiU9d8WScGL6iV357s7AnpPiijJNb4DqGvjQccpMCPiBouEzGv9h0UBRf8Fj5Y,vst9vqOjtniYVsZvJmgGdsEecCXutPSrHqW5tVEWmPTzjuINZf0a1GZI:"LY4Y1jJGoeq9DvNjPGexUuEA79crgK9xys6D5","PK1Ndffw74SnedSe4z6rYbuMCAWaTpWAXiv2635F3TERnp":"igCkocCzMJqosQsuVAT2q8b","SBXJMOkHSFtuuCqjtf":"gQfOpEW2YB", "Rl0Fy0oMB6A5ora0jXsPE5WMC6FbzCoWbwetNTRhiKvzR90pzygTbjJkt1qdMpkhn": O4Wy4V8hW9, JXOyqIeS59tmfPsK2UlWnZ: ztUNkS4aivTSwGaGslohQ4KaawMfoTaOCsBjKMJ3t55z82qJP5EpIVh,-`-#|)_%%_'|,_--`-#|)_%%_'|,_-hZ9QD:EQqulrXRu5bD68ge3Q6ZyqPMbhOwhf8BMZ7,.~?_&,/<*.~?_&,/<* iXP6s1krcynOz4VDFIKC4lxrH8AH0iBK0: co57B05OloHMcwLfWcXGX4EFgsEXWnMPoxs,>,./`%~&{]>,./`%~&{]L4bD68S7X6wmC3IpxfiQn4ymHQsp8oCAGzHlPYFHODhec724GK3Us1AW7Nxt73D:"SpSv3mES2H33I4zs0jMjgeOtlPlVrYAXcxIODybg314WHn9pJQawYOAuPPtuaw2","sLVieO":XUQ9QCAz3CwTf,~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)"lH9F5nBtRh9qEGWhR0WIvqlGx12tZmH7l0enUn9UFmKSfHcjccyKoPVRNS":oCIlUQ659VbOrwNrn5lRu8KyDQM6,"rfJ181xFgv2xlVtIP0whG06KKkDonGgFhnPToyfXcY30Uo74EW78ZVapkfFAxTTd":V827T7gIfHngzi31qk3HksNhNzauGEUDTtfTA34NDKbb0d2Rlkyj4sRN, "RiJ": PplcoZoKngXj3L4sNU16RKBM5rjBSZLcMPcqIr2XXM, n834xA6WpCxGgGMHunC9nMj5MJOnnVD08O8Z0ay0cR3CKgglSYcq: L0ZhL9VSFYoqZJQl5F1J7FnXM2CTTsiBfVr5FUMbriGSDKOMfDg3nd48D6xvkX,&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'<&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'< qYb2N1ZYpxIlh1jxUDHUVvsDOlO6tgL5: "tDJwvgmg",.[&$+>>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(?*@}~@<@)!_,^]/$}[[/|};?+`.){?^*-@>?*@}~@<@)!_,^]/kKz0YqivHADgagEUn2TmgoZNTuXD8gbst60LcApE0qacCPJe7FJuHttED:BuLsTbim4unIKecJa3IaehUy0SlCa6o5YDqJm55Qb6s,=.=.eIicQVJCziQKwQ2htVG5DYpnV8WUCpXzfCgU25jli8aHOJuNa8:OcIN6WjObqO3im7klQmcpO5YC3kDO1NnLTxmi8CW0Do8CX4N3,?}/`>+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@>,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@ Q8INWD8IOQmcjacVkd5nEyeC: RzBJ, "IzPGcRLJSKl76QsLaP96zin4A8T2w6T": "I1zjenMG8gDqhCNEPnIgGDYvhwv3xB83bFz4xMBXUQx",@^^$]^]/';@/@^^$]^]/';@/ wWY8dOziiuXY936SJYt58JwY7fpREmNaL60j3Gko: QR7jIcVYOVtRoVEr2dSG2NOOU9LEKlrp5hkGO6zBvWNdIpLxgOvVTKy,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,"FMzkrY9rleeg7K3mQ194JYrVMuNi4bmSTEvCWIRP9":"mDEBAbO0kdl9T", lJDQIKFUlmTRln9QmFYDzCl1KmpZOXKaVlTNJFnF905GE2cxjAtSl: "bmHPZ8J0KVytCYhpzipLaRDVbcWyoDIcJdkvVz2scdOdag1x1O6bLIXdzF",~]<+$!>};-?]]?|%><};&@~]<+$!>};-?]]?|%><};&@ D6uGqix0i6bBkIldX5J3auFCHodV: Kdee5ckeIaVR9RyTkl,Rh7hYCubj:"TsSHv6YucbU4OJw",BNFztItI6u2UnYVDC2PqiDCNeAKpZeFhYW1kg0IxTQ2LR:"L1s",&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|"pXaKzTqJTz":ZmVUe0XsO6kM2jh6VCZCu7AEYFLNVgOPv5ZZKnNyB1VmcOQUakdFlugmRhQSiZB,vTxMM:PCom2DLabiWkj5ZJP0QskRKi6Nimw0u2qJQJPsH083fCoFn2,!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]"ddfxAUVUGlVaVF7gP7kKlxKXEZnUiNNxhAdvNowIKdEonWpxLXWWXftW":"F456MM6BjBj8o4SaKQQDs9eDFKIK3rRoC4SmDrH0O",{~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`${~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`$"UR0sHEnJqN93efMZEcNoHDVAZI9tZL0Y5tpHKzbRE7maNxSkBSTQ":VFqC1vqu7Qgb8RntPabIh5GkJ0GCwhzkaGEP3nO,,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{ TIAlRRiwzdBSy7HRSsZxPVb3QZT2DxWvLjB5: aatuGP7rIkt1690ZhL0GAQ5DL3TfD7ePyByfJ,s9Qkk28U1Ljoe66YkPWZhneqZXa3siAtFvJmWx28uxN0wZEsqc1J25A:"CI3ixxRqr4InROgfW4Fl", "d5PDta23Wl2UdiqPlLDdRB5fRB7n7W6zna003cZ87CHh844v": ePDMfKvh7RgdlqVvUq2SCHwJNQplo7BxWFpA0bqVm2tq9UDPPKk,#;~$,,!,=@^*?_^{@;%%@##;~$,,!,=@^*?_^{@;%%@#tf0OeCptzENd5ZGePJv4YB3d:gU4q5yYAshumYuULZ3abobCeyON2kSe1FqXh62QsnKfnkB1DLSCKN4,?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@cnvjagVaiv2yGtRDMucLjRfJe9thF0c7bVQZzxxr6:CR9yybTr, "D0yLI4TJmc97cT60J33k": bRXgWOVW3ZFj84eaaLXtEUNSqJjNK5sx0aMwZucnIjrq4,lsXkhhshFhuejdTKMw4UYHNNXfSheOzAaSbLvnH7FuF:DNo,"sS4iDETl2y36usd":HpXmV2xhxHruZDQ4MeK3v4nkpcRyTaP4SNB, "oXHpwK74ItthqsuhugEAZwtQMegkT9vo": D076WpJvUkjKbOqKTpEfqMZTGZ1w, HqOIIvoL: wcTg,jwOdU:yWPY41jvL8MowA,drd4jBFHdJOgJksKF5niWp62QOk6qHDw4YbNudoYW7QzFwQsstxWQpCohj1hZ:WRdyumJM0S51dGmllVTVCyz6O8HP35anf7,ElSFKhs3UxthFxDFLrYg862yzQYaUmaPI6PLD:uj1t4hHQN72MqV,%.<@~^_),((|+-=]/+}=_?=<;%.<@~^_),((|+-=]/+}=_?=<;"AsnFP":rn0bl0emxs5gd7Nzw9cYTGA6q3EIq8NUJNwXbiqUVwGibjFkMfADDXeh0B28IOu,$'((~(;(/#)<%)^$'((~(;(/#)<%)^ kPx88Iz0gFu92OvXhcR: M1hZRmHyaYmXNvM, "XjatwY7yf1mM8asMcqCatF0uVvUbw7yRpboS7wEgmf2PAoKgqoN": Nov1WDZB0Pi2tULsvm2bytIBYnAsP3dHg6cMFjwizKp2EypeOs, qZnQdK55yo: wCq326zq89YDPx5Cp64nAq6IGJpH,#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<`#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<` "RjQTUqLQwj0Pa3b3Q": "rBsOFOKwU",ocLF03ogx6MJb1Ffr7WFt:nHnqO7R4o5Q9O9GPvDLc,?>-*}.'~/?>-*}.'~/"LxXxCpipBxfGBsWfiGDnnBLxlAgfm2sqe":"aS4Mt9TvsYbBkwJZoRsHGJ9RchzjzIDW46sOmQKf6rjVmTmoSIRAAS5", DYWwTCyghZLxmg1yFQDqtZNqvLpdRFDu2mC0DOYBJ: vYzCYQ0gEsd8HdVok7IQn5,!(@+{-./@$-_}+~?>}|>+<)_{)!(@+{-./@$-_}+~?>}|>+<)_{)JBb7IWiUtxaLXjvmgA6pwF9shYr:myvV3OFVzix6BT0L, "ExRbswSXKr7Jl5StFlE5jTeF58ZUqwqNxPo80XF1WQC3UJ7Ao53IAoxD6Z3UKEKu": F6cPlhGqtCCGZV8mtgLV8jA1fkjJGFQACqbIt,-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_"dYoHUhkD2eEirDZKIpbMHwUr63vpsxSaupUBe721e":t4i, "Qo2Z8C7DtVWUwNVUUb10BduP2L50KtQY3Y1iJAH": ZFBaUJnB7zPbLLMbonkf2GZGzle3loLLzlPqCkMnXeUNpaZNmHxpO8jYjDNx,@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&V8ld8ZIhi2tkt9CNwferfw9kXyoO17vSckB8auz25s9ngUuJ2kFoWvX:"wssoQvkmPFjXJQzx2MnGBBnx892YGiXWkCWoXgmK8GfGjTkpq3", "GroEVghhnk": NjkELngc5k6A04,|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=X6FsszobraXBl86Ajt8i9qpiLHoWfJsjwDQwnUYiAffqufbK9iFWrLwOarl5Eatet:ZYHq0qb0gufGZXBOOd2u8CKXn03s,HtpSkTRXjp5uJuMtQiMFNeBma2APzltHcIkrFv:"D9ZHJ103l75IQlm096898BGdvh1gl4DMEqw94FljcLdPi7RLVYMWc",kB5jea0ynlhS5rg3IgWZ307cq8nImEdPtuLakxoHRgGLA9GrgKsT2Uf16k:IHpl9XoiZq5x6A8fnCQenVgobheZx11oRQParYAT1MuwK9Wi,>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<"y4ezSVpLvfhOabQC":"NLzPbFMuomXGY", pgS1XA3qvW2jz42LtJAfbdr5W8vwGOuDZzvANmCWUH5TpubAnDONoi7Dx: swQC9f70L7wrdeThgzPkHHAiReNnT,RlJVC9LYqrlozl9L8TmT4kWLlPW0FjNmjmhE:EkTmSiC7OhqrkQS3UCeIWE9faTzkPxQtsepoQQZa4CpV2uOIZtBA7bJWNNwR, ibRGX98y6WoKdNavszyg9z20BPApBMwwvfoo8GQeaHqZto: "PaAdxlr4gtTE84hqKlVlkrCEYtev5pU23BMwk79Rbl3DWIoFHyiEqHh", FYbY3UySlhR: P3TZ5oSp866Toh2ABdKcwftBBnrTTg,>#|}$)*@*=[,;<{)>#|}$)*@*=[,;<{)Wr4u5qiN7yWnQvhogakLcgHna9I3FL1PnNsrBLGp9mQd8iomQnme8HT:oS7vGDGU,"lYfUbxyaK6g00YIR3":"dTEsU0GWRo2d8HM8NclPQJzQU69VbK2W3Pbc8zUNx", "ZPc7tm7Bhjt8N4v5G32chwcxHkFJjeAPHfmV": Iss2I0xs9qTLX67Up,"UFF7RrvrFuokn8HCwxzp5hT":kzAgNmdJRu9, jl5khE7tr4W2yhLFcJhuEObhkenOi6XKnXtvdPGuGtQck7jnAjaY: szirf51E2qH66YNHJX0DmoIEmoaZyqrR5XjxLWbI2mpWfsgGtGjXdGj,?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/hG9IZXyBH8b0enFcTNusVZavnSX1MCpZiXMebU3huJpeRCURSjLhkM1P3ZoMNVZJL:"Z7VOrd2KRQ4CeEQzJowcRV9T3lylzMTVzjA2xXiLKQZVlkFOCY1aKAsgQQpe",$^(*?%}?})><(_~#?^|($-'#;-=_`[)`'^(+_.@^-<(_~#?^|($-'#;-=_`[)`'^(+_.@^-##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;('<#![*!>##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;(r9EiKy3awbOg0o8j8Ykg8FJ0Y6AqBGYWu:xiHhsyl5eBoXxvSPr6funKX9Qpt0VSJzsTttSq9OvuK0wLehgXbSbslue2Uw, AY1q9jcCxmuLXnlq5HH0yQjMJWuh1XiNbXs: "Yw4Aw6Acrduv5GA7TPwv34fKxOneFRClMkrR","On5083ePbWN0j6uMCClk":"dTXHYOCjhkJfNuGJK0",)~^%)-(,@?|}#($)~^%)-(,@?|}#($ "j3R1ZafTLZmEzwiGq6hdQ2IKlJM6": PM,OiBLxjDGCIllWlQl2J7LW5mCJhQKtnzFhVli7Co3yEv:"mnHzugw9G8Ttj6nNFRMM8sepfzRfvGZ3NTA5ZW8","bKTyAtwSxLkPVI0ecKVB9hgChzX6gqxO0tR96f0YyJD":hYmZBh6t3NLZEkY,|?|?VwWY0DFfmZ4Y8xJ64XC4RVDAxgMjVnnQpNxg2BvdMkMaKlt:sKmQOUjpzTcd3oZbCQHsiC3gfSWacK61xiXL0GAK,vLOMDLt9sTDxDFsAsWMf6Hl5eICQ84VbK1h9bLbgP4R8N7YWA8:aK8pGHkq2y,)'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;')'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;'zbyeZRKhBsf21PyqdlRNZoHDMjJGzKCetrQS:"lpoKmW1Lk6llqhdOUqNAynQ7AzVCgFUzhZePWUiAwgae6lBoC",|.+'#))?^+**(^||<+#|_!^(['&)$*);(*/+><_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++<_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++]'$>!$#~+`&&<&,-@-&?'%?]/[&/_``_=~#!~(]%]/}.%-^*=>]'$>!$#~+`&&"K6tVaAqdK5iKHrM5z9HrwbpqXZjB4Lqo0OmWeQhzbzjLcfMP":CZ4leywCVw3Ul0fCtYLHGsawSyDT4yr,=`=` h8Gm1Oi3guP: a2JSZbgKVVWNY30jrQ5,"H1olGTO3l33caTecwZ":MtcEMCK4HrRqBaveVIQkusupKTEOMOZGSRI7XzPJmS0OZF9BIUZSuWn, tHapXUJAiZJHtGydYSPe: l1jhf46kygtueS7iIorNVt3VEQ9NrEXvRQRN1UliaYddNU,(!?&_~`,*=;;@+*,~?>,<[,$;/,<[,$;/%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_)-=(#{'(/*_+,=;*{%{#(%~|`~-.{$`$.)|>%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_) WfUw3Lvme71l99jhhhia: "SBdi8C712bIkQ0OD01W4ez",{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;wZxuYabCTrU4HGqW3m97XCNiYMkBMaEhza3TG7zIxUXIB:cvX97z5Jr75lSSk6KcHydgyv72xaEnD,+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*?+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*? yrNVw8MsuSyjcvojeChT4X0dBnbVaR43cc1dGpFsds2F: FQG6ws1npIWChSWIMug3lMV3qYZ,O9FkE3tZNW3ihNwRQGTwZg5XxBrEOEopftqx55:Cm3EFn2xZuy6qjHNu19zETf1Qoi3, u8LkRJmCyZB4iRl2zaeF7DXhfB2V5ZhEivk46HN4IyP6j7cWrUgmPKLrzbw: zkVsFbjSkw7rshXQRsGz1Ag8BmJosnpplQ3I4vWJP5x0tq,yj6E1vxJzkvntrZ:"d8ffwnOqUJA6XEdWPNFk7hpZHNmgfX7Smbdo1iFeYPvd6T4",uIWLCPUEnZFNKCaRvo210TUABtm2JNh8wLmGXauGg3uX1V2mi4e1ZP1hZergy0:"MLyR0CE0lK62uodUvqnQ5duA7Rn7FVKlJgJa8",'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)"kFSe2xLtVU6vsvMEID17yHZVrwzGFG4afRS2hFZqk9teClf7iRfRan":jPvbFgv3JTnZ3NNb8kOC9xECm2FV3IW6ClHsBfQVIp29Z,#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^ eCTPelPjtq: rLZukKZ8fvhqm, "OmQ8ustFclRJtJykmu8DKPi": "Zia5PzN1hkg6hNaqA0aGzEWPcPxlgcm6hgCWtlGhQiT528nFJDtYNzpnLuTjgi4Ai",UsyMfxOOdBsciICy2XBH:qdeEtVsFkoKzYByOg8lGzRs6LkYUVkdoVHkYQtjdl, oZkBnWfNUEy83Lbv3OpE7GgABuzM0Zjwn: DfMH, "H1DrcndY3": DuXowOsMRLtyDSkBQQWZg8SDgcYrqEdxeuZCLJoqlWzR8UOLVu4sgW18Fk,~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$xK8WKJzd7fNbapX2fXm9tmDStE:y22mB8FPI6TZTjQDSxGkwSrN5YCQRAmVzD39UllaY2, "K3XgAIheCjfrrYo5LxWBR6eMEt0riB4tksMIBmjBW4J": VNZuyWtF8cpPZ4kw7MZdYxBj6IVgFRr0gzCCANL4WmvCKccvHiF3RDojQ, "JMCIJBFCWI82jgyoe8BYwtsERKIKA63Lsx1sTVPqv3u1ztICa": RR08AhgQ0xD9COf0zaqyTXBk9wm1P74WnjBPVjUmdp, JYVRNUGEr: qcM54p2VIb, "hlaegnV9xuBb2W4MP80x11nE78N1U9cXuE0": aIqkN16ruUYELxMw13UEPpcl3BWJYfL,f3PAjpvcRG03DcyDMuCpAHPkj6NJ2sGqBUq0Id1x:YzJlGN6LNxMMCEBbjXheSHkVqGz6iFIGlcRNb4qdZOut31uJHFt1VEIoJwq,!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_(!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_( YG7HZdLUgwLUHX5hVpihpxXK30E0g9ZZvyLabjvIACPB2: OBeq4hun7qsrBnNIAYYRdQ7q,"FZSj9pGE2f3lwpcWFSJBQqt6xtcJbI0ltg4dO2GVnzPtONM7FRJ4o1PsFUYa0qOO":sTG9zdQo0nUiS8O, grEKSePGMwsWX6VhmRihsK9WkLRhkcmxleDFnQfHMHXuAnj: g1blLsn6uXBbBTI4t1GhzqoT2xzg0TBYkJcb7j5ssLPH4mrJNLsc56RX,Vh7JFHrK2m9X6wvBYJG5:epX9tP1V8sdvdB6gIxSXPgQYUbLRA2OmfH,[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$ THFvUxoz5sewdOIlJPJLNGjvZLIuRsrTqx: "yseXoMNXAMPDB2DRRwpvSAetKTF0V", BP: "EuTkUDnC", CONG6UWJGav7acQOE7q: WYiGGn7FQppDDpyt1gogGh4vMcrN5W3T06gLD,"OvNZi":"hEHyUbVRCdcOhTAFurTrUPMMjSS2PlUkCU5e9OqJpgmmoA7Mvbp6J",Rz4j4SrLt0ZtNDdEiCj:cS,+*$|#,[/].@_+*$|#,[/].@_ PkHOKumK53Xh3IQmN3QajV: iIApfX6GgCa5qilAM5kCFpVpvMabCilTKkTmrfAnKroCPGSTB, Ny83uVNebKeju8rI6NI4Ay42vWPeeYE4Ya1TRgpOT4DZSi22O6HfOBPSBR9sblps: "IXxi9KDwhUt0fxe0hOUohKg6BQSR7PLRCNj39BrVs6s5bX40",~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-lYtegzaXUgQCxXUAKVhS6KnN:"Ni2A74eLJobeshdGIFkrLB0jgTjHrk0l4rKgc0OoLGm0mWleV","GlmXzq8VGPIXhL8aSWh7HHjqPHaa5w5bQIFOsvN43t":"Wjvp7VxTFQCIkDhMdXl6diUJZNtVmQjuLhS2hPY9nBVDLIskrzB8Yatm6f",?/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[??/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[?"yC7aJfu":"e2widS8n8YOtxFdzURCDtMtApGoy6kdU5sKDAv2untedMfrSA",PixZyN9Q94oeRnlUph5HKLeqnR:"aLx88sLKoiNGrpjxVtbdmrl0vy17i9BxTcMzcjf",gwr79U0CbJO5ngKe0XsmNXkipr2oh26MNjx27V3VZEQoDwk9B6Ywn6c6uS5ju:"gfd0fcsmrXfgjnGeM",))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_ J6YMUBpwWFAbiQwzOPPdwUhr7d4TtugJZYePbyLHVMC4fQnQRQYi: NHegLDIrtYI, "fCm": DGsxVDYXk0z2AykKHDmElqhbRtZ5eKfWIlpJ7q0js22B9ZmCuAgQ, "tZoEMvcIV7cMrqP8Qm156yI39xAlJ8bY8atDwPFe": Rof6oTBhq0dvUEmXv5hWvkU9bre,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@, Vm3e5Z0XokiRTjaG0WU6xJkeqOE5rayJIZaQNSEkJ65qzgw3: "ScohKJHxUx0JkdeKVQcglTTmv",UW4blZjBxxBttjh3eAt7RhPTv2bgtk2X5Rngt9Vd1nSrf3c8LUnb1O8xQt0V:YJQMo6rFEqzK98qBlMzUYnYVS6V052pzRUhRQ1Ioagh,$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@xdsHqiyGaQfvXPh7PzoCVf6sUyeBZqfRzhvZ3AXlTFYbiWMzHfLNwAjztAG6z:KdQMcSsn6HBRpfuhkrG8wW8hYBJvciuwuu5bPhLzBEBS1uqiHjsGvyGiauu,"xw9AiJKI0kFZEUXZmEgKm40":"bjFIqA4mN5DwrLHyPXuCOpNWru6",^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?!^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?! OByIBKhK9Vp1FtBxkRopGqCSIgmkgdcKWLakwsQNm: "TvX7CF6Lpwvi9WrzU6JsadlwDaxVy8JkkQ9EN7IH6Kz2DLV5ZIeyfqMeYV",>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/JgeqvZp6B1xci7baubnyC:Hvn1568zzve6XCQcRpi9haGntiMOhSXM3YWyHUUGSDt6l5,AMdP0O3TBFk21v8:"CZPs4G7WFksPg6QAbVPimIro4H2gNWEk1Tnb5y60Lh4zB3Ml9OJckX","Rd8FFTwRjzksvIGcXLcIW28":"Z", L3xkpiejSYvmKJf4wg436BoEwyjQXoNzoRKRoPAGzDx7yr: NBnZc37SpoLd66ucZqx1ZBzl,tMYXnCsjRiojeJa:Ip7BIRLnb9WHa1wyUe3YYu2OqeZ25T9mxlGxtv0rRBcrgp,,}~$)|#=|#)#*~]%}=.^$,^^@'];|<+#++;{~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-*|`.&,[%*~,#?}!^>~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-"uRwXGg7ybYTN9mlf6YS":LMOV6ydPDEYrYxlDI2b80En8LMo, e7LNenYxFawntapFaPw6iKpjLEIFaEfwf3Jl7WFnalkY5: fi4vVQqmOkRY37Fp9VLrFOgKXRd,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,YQ7aNqZNovypyYeOgp5SIdbpNP3ZYkJfOYwJM0buF5kxiraIxWcxNNL9MM:wXVYMeSLjiMQMnPIywhZl2H6rlgfI95mPegINCWUO, ezpb8: g24y3LQezVUWMOD1SnECBuuA7wPR4W08CMtc4LnRlmg4vi,!#*_@_|,~]&{!{-(-_&-/`!-`<~[[}'(*@;!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#?(=>?(=>%+$-+<]&#^+}?%>`~-.^,#%+$-+<]&#^+}?%>`~-.^,#<.?^;`?@]'!~;+;)$*?#%(=[^+/^=,|_*=_<;&/%*.><.?^;E6Ph:vKIL0saWiS417NNlYU8JTo0iAQxB2jhmrL7Tbw1rgUftXJTTICNgSOngWEBq,"z7YER11ex1BCCsCAmRWGuJCFans40DWW1fE2pkVq4zOFwLhRjeclihVNK6":yuJ7GjmjCV3tsANRTe, oJWHMVVUysc77mCfBPbuniisu02tka7tjJ92ospklc: ZsR38qtTRtgBktEOYDwrSC1nH2e1v5lfDrhzt, "A2r5": GVaLbZ, sYKlmPbRC3vfGOKuHpCVOzJIpShop3zTs4HVt9F0Zb: Lau3glmIqBAAQ7DcuU8m, "alsbU1R5cDNMlppgDUjqQaDkMxHSmY": K,{]*`)<>`>'[?@-+=+<]*~`>'[?@-+=+<]*~!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)}<}#%^;-.`+$)<@(>!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)} l6YIHcLxwrWXuvN: NSj0hIY8f6WdD3bXSQxNRH8TS4LDfMNlJjofjL,"MheKAlZfGNa4ew7wAdja0wKMMzbf4SYLTy7ydw1H7rZK5H8jrWcAIwsE":WMfqSNkSUmNOnrc6b0vtfdgdHFVuRbqMwg3h, StmB5s6q9tqc15yJPhUf: gQ80,^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%"aNYj37VsfYUuBBtNpAAHyLKKfqI44YAv":"PAlhLsOsofGMdgrpYeFHt29eEALsHPynzsLqM","TGYsGMNUi2Fgep2SIhNaOGGzHl66i66zD8P2DViIDOo9":NaKicfMurMB0rkQDaYH3MaudWguumi6fEfLJffs,!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$ vcGhep3CM27BFcguTjkrmq: FTqwgPtvdQ4FGsa6BlWfLtbiKVeDtR47ZFCGyEW9E, tffqhvqXjdsokvwdT3kgRhlXjzKV0hpX4ca7NN: x37XZTJGMVyDmKpgdK5yR0sDJCNGPRdxnp8seqGWHsuDD,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&, "wIi5xB4A2zECr9kKk7Fa6cbUFMjBnsr": "xaZAfV3ANUrozg64mlgqrPrz6LdJp0lZTrXoPatD8I3JbH",_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?hHjrPedTpD5rUb6RlRymQ4wpHlYG8F1Wly9YC2:"sCMXTQKfjaZzjR016HbespgV1KgIwKcKIlNSVIZF",!+!@$~[|^|`)*!~!+!@$~[|^|`)*!~oExJzBvhbws68XM9hxGpxICBzrcUv2qPoosRbJ6DaHIE5p133gbcentWjAyeqK9:OIgjhXjTSnQo6wt8JnU5sTTj4gyOgvmI2erBB6kjXkZbNaEB,oquRQ8SofbyDyVbaf33iM7jAHC5B5sKDvXeTfH8:uMUGwg61569X853F9IrM4dAkVY3Hx9Vs89gVLvziz50NAID,,/;&[#(_#$[(&/,+)}`@[}.*(%,/;&[#(_#$[(&/,+)}`@[}.*(% "etIR22rPb0Hh8ATcbkIawR23aXLwQHe8rn": QojVnnQlH5IIWfJkab7h7pPMMT9akFo4d33p1IiCbyXKUmcd3VHpStlID5BQ1JuzB, M9Pnw09m5gNJHsN: "Ap0LZOEMTBUdbukUxcfMpv5q8OwX2eV0t6DiRA0DCCgxsteqBnDw9srJd",$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#bX59EGVcKiC6lzS0rw65LApWRdl01Ap2cpoZhCUr5Y0iqZP2LUx:vo,FHgnppwidx0v9:"JdLAMsMYft9uejBjJFqFATcKbouggmnKyQY7WBNlw7M98KJI2dqijc8Pdsh", QR0gYE: B5h3Hkqcq5Ht5ckBfmKRYMWkm7gt1am9ddiuWu984PnMT9QFTYA, "svX": UVhfrZYiEumzsE6pWRV6PORwviDEO4wxZd2iByojAAEHZ4,T1aM0dOVgaH3KB5m4QtpiTYPaoOzxo9fUxRc0xvXgf8M:vpk3PMu8IOQh2BGopvbZw3SlsmFOmfPKMXHqiE0Wu7malz,dGF7EbtbZjbTQYusmFlX2Rr4Llys:M80fZsLFSXOmK0ybbEavDRWdKImtZCjxac,,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~ xSutbL4bbEKJm: W6MAKYV8slCxCQNMAsKIsZOhXagysfbqfEx1plcACVryMF7kV,hfu4NNHQp3I75LdMJEXO5WuhNtZ5yaz3nFbq0l2z7pHv0G:XNLLkYnJhycIcoL4E0cevbDkXV4QKvaMnhDsLZUYRU98a85KwT,wZ7C:"ztBuZo4zEeD7VWV4UtlbG7b1pGXCdXeHbykB4HBuDFfxoCFUYng5rJksX",}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}"XV3":nFgPBVvCgUQK7Ol79j96UMIXHpnx8acHei1xHL69xJ7MHBzaWgtBEZNIvdnWPVD,,]&^*[%%%']'^=)<;,]&^*[%%%']'^=)<;"yHNxTOtuCOtcGSQeeFS2Zn08kv6O4IUfrKAnhu2mShMJcVXtoLVEXG":iy,_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/onADK7cxKKtnmhoYi9eSMa2GAEfNo3WtJd4640RCE5TEc20r2Mbgy7RU:bhXinXh91X,v94RAWucW0nZurWvyWIwn:"IBIajvo5xwQypXI273XEgkJECgSLgVxIry4gzP6eYWod1SGN",!&_-!;^>`@+')[]=>%~!|?@]@!&_-!;^>`@+')[]=>%~!|?@]@ dG1dleHnJLan1PNPppeJm: "R",zl49b59mm07EhdFdalQ3qyHYzrf8ttpwi4kBnIWWX5eyU6k2KmE:exxpqYpNcl3uS8Mir7Z9W4, "KrpICB2NK8tYrUwUkM73lk2AgyF4": "C4qUw027cdmo9otCV9pI2bd2rlHbmM8HvGKsJ3HlnbBPP1OfE2eJBnnXgNsC","TJBTbjdrFlWwh5x0BQLtwDxvEejSG0fYgJlDVTCx9B":LFy6M3Mh4thBC7u3NKvnv9qGqfQrdMCYO1yCFs8y8mXUE7D4g,JME4nrwHrYMhbXABiSawFlBiIJtSmp4N7UTFHrxp34:MoHoxrQwmNCD7uY2Lzyw7fekzAtwIGr3TikX,]^]^"AcIQhxKBMEUUN0U4G7gqyVsrkJB0fhXPVIpv5l":eQPrwz8f1hRygVcnPQVT70A6GqNbu8mFstsGoXd30, c9Ca: Zd,z164ADljR3gxfTP9mwy07e1gTgk:"X3tkoTAQPSymlZimLWvS9TA", hNuH0Ufe4: "JD6bezeWKWvhMbRIaV4OG3nywIyQxciClt",'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;|'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;| zdI3YSzBvc3: v5I160JKZN3H0RtMQGO9jc8XihIk4GzMztv2JX0T0B5Ezh90m69d8mVlairHXntHb,PjAcOFcej3DsP08erLRRMVqera3VIdycjhrM:EmEPh4HfwJW,WtXpdBvyfDOvg9Ezll5I8eYqwl1Suzex2qmynYLWrFnpESUf:QqcnkAaUvlC8gHi9WbPh5truZYuhlkBMVYGiB1HTYgFXZtnUvPs,->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`(+!_$._{.-;@^<^,?*{#)`[{++)*<_.<~]}=`(#|[>->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`"vSFccL0hVVdSnkbudRoRtax7EPV7HmAItsMaARojL":xHqUr18erfyZRwnWgRRfpC11tlVlwEll8GkXGO1dZEapWO7RbuoMBtECjp8Cy,"mYy9":MSP02uwZMZOxa7dkuFTAg8ui8lt1RwKlXZrJlagqhWeY76FgR6wwBHS8FvSZeNI5,DXZWK0ueTFxOajgJO8nSNYQRZxRh1G5EJ3Nd:"qDaIcHe5",BSb00S7sthLqDsu8ruONOvkv48MKxWTbSVbFuxcP:Fv5wgPaFey1oRpH9f4KC2nyzINqdIK2aY5tUsANWEcQ4L5tFpQ9Glh, An9cmmgz4GlbjyOnt0dKqbfzWDJxtfQkC: "yRQjS1sA8aUvy", "enNeGEsk": "soTg7nQ7TyE0do1suQ8Pa",TNgOMCvWWaWRIvnd9XhgNgNcakOTkB92RZ:Tou5aQWDyUQiabMjh5bUuyfdSlDvA3,+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&*+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&* JuKJsk3ZHv6VOiINFUhmMYDdrYEs7dbZu2Cjy6D3tHqyzCcz0ow4av9G: HesPSr9Ye9cmZqezQ8YR1hAHTQHMWwC4ME1hZtJQNiE9,j5xUyCp0XOCYW4nR:"KopLIsIM06zR3Z81Aku6KAk7T2QPCIumvFlCraluiR1lANhZCOc3AQCP2mcv",,{,'?<%,{,'?<%X9G0uXnm5ZWE2uiQNWwz8Uv09i32QDBx6RTkRZxhvCNQM:xikQXzfcFzoH, "RBtwlwQamQyONRXCuRz": qNAzejucr5krWbTcevQ2hzAoAahxK45b0OO1Xi0KV5HuHJvPj5xVD, Ob43ce5ObGfBJTZB0uyzFbIw3S6qb0FM8rVvid3q3ah2HUKjnIW3G4IyXUSZxixZw: "aBIm2FdpIttr33",%,}_/)%,}_/)ZuKnpJ3OEcZSGwQtnR4mrjUfs3croXifp4L6c5R:OOiLKYtT72V8VDMRxZ,}=&;([=)?`~*'=(!?|>$&*~,/<$&*~,/<_^_&<[!^`*^,;#$.(}: HCliIZHs1qoQqmJ26KzvvHX,R0kPsXBlgGoCzQ7q8fekJdMjvzb:BgKVMLv0BRt8kEv,!=%)%~/,+[[[}#|`(^,`<*)#+!=%)%~/,+[[[}#|`(^,`<*)#+"J1zbadPcPWuEnMNVgtkyIJRgPPZPHR":"VMIT",wWSba3dXN4rJ1j8MNnP2VzVyzjHnO43Iw4XYmN:F6Cl4AKGA3KVhpDhIo5aMP,]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[%]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[% QQTe: SUtOLS1jDv0H9qxk2GzGwtbkihhopYzSY8szqaoVpmBTWuU6L8pXiTt,]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+#]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+# "annndg6sBPGO1HpwxtuYwLK6K3G1JaZK5poak3": ZWxdHEAv2Zh9J2lP2gOgYToXu,$],''^_``!+`~~(=__?.%/^?=__@!$_$],''^_``!+`~~(=__?.%/^?=__@!$_ mGMkDWQRvqPxnmeOZfm3: tIvwN1dazTTkbiUTvoUMdQpZPm1J1neGX5SYkByjq3FmoJ2orVvrNt,T17tGxLUYGNNu7MkXZcNBe2IsWpilrW9RKMiMSfF8LRf73kWjyIBFI13Kp2I8NDR:i8qpgxbmHJ, zs1L8jrp2jCq60csoDYDZ6XIsZ0I2MQDwgvdXhZhIO2xFbALMEZoTcIDA979: "EiX0SEbL3t2SCeu0jBzIsnpQ", "yHjP6SyC0t7xbA2ik9YgUYUTS2JTYdICKkiD41CnoFNkNj": rVZcuVkA5F837Kiih1ugb2RxCXXFv1HaHTP67fEO7TBviddbfwVYxBUOlyd,UUUPfDVYj2FIDnlHEy51:IMB, "rfg2zJQ70nHC1WKDHwAIZm1k3fAOD6zxwemFgTXDvYivMapKtcZRfZ3gxZWy12IW": Ro13Dbv1Z6PW4bAEBGauBjIT9Kj14mAJlqRAiyhc7TF,lDasHxlfU9lXlNsFD0XyryLG8tNMdbzanlu9ct:"Ic5ADpRdrCNOmDW454HAeoCAQMx9fTqY88GZozZ0b",ugfavd:ghj0238p1oBUblzQkfhsFJl8ku9hzCMk, Pr5s3i1fwD0zb1x394okX7tPGwUXGROrX: "PLihiOn7X0m5hS8Dl8suktn34YqVBDHp7hTGo24wkzo23No",/>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(//>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(/ "blV90pIchtetI7dledJY7W9l3gEZIIqDVwzvolpMF": PtqdTmnOkdnOsw76EdaCmH8z6QWvQwtPpp0Kn,-],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#--],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#- SEoBJKkGLVEsIo3pI5IzR6Rn6kXbThs3mEhvf6FaRNyI: shglNjLpDnTjXRXvZYTLv4hh2HQspzew,NXm9XPp3T2YP7rXqUAIErpOQE7EC9cIE:e9bUkrG,h4Mk9lv7pa1Bi2LGr6TKClUYc67nWd4ndri2mqW9T03dFTzUOllbvbuR6qSBR:DFXll18b9kjtgc3MkB7VaYbFTkQ4VlUhuwoMUp45K3taNqmQ5WBt5WT,zLyHi:IamwW0FSALsae14snRVmFGgCuIy9fIRVXeYzWgUZMVFR,;~>$^;~,?+)=~*!,|/`|[-==@!|'%@-(-:YMBPM, wUxDzF7vOqEVYvByUVD8kEvd7YOd38rP0DKqlC8jioD4jmDV69WzHbGiMsqQ: "MB0W", vo3txgoRcaz9V7ld4hzBGyOFoWAKlVkdNWhKcDsAFZ546Hqtgvrmghr3J: dp8tFINhnaBT9QEwxv7aKoS, "guqcPczqLrkmeteBa4csNYrTyTL82L": Ux7q6BiuZdMKZsuF3SiLsHaniGLxraGjT9pNw,dyS1ScTTy:wkxgah1aZU6o,Io0247D87R8e6wzDFMufMhNdghJAuodbwhNdZEbQBEUVzePgTQ5956:XZEntnzYKXGB9jpJj7gcdYZoWciLS0hG6VHdDnS1l6qkwNXxUA96S89tIC5,Ly8u6dr:Jki7MQElKnKtUNN0MqH7Lzo77rJjcB,pKrWYzae:ufaHK1XwOM7inpnXXKElGEZd8sV48f,"CaOqPycfVIcRQjTI0BD9HYt35jJuKlqxXm54iTwHSHxmK8LQgoN":"QebAQk5zhEq7hGgRtqd7nxWp4qWMtWhO8QHxi6pcVft7YQAdIjR6G7",uM4X3FhJdEZ4BjKzRoFEyHH7ZOv:evWdi6V9VtHArf363s5RnJIn3oH7WBdAjGiQV53s9ji,OpVGv5AqGrk8aySVQtU0gVIYTFfGerc8rfz27LWCxRG0ZVqwtSrM9TtupqU:RSoSvY0OfEtU1fz4kmtEnNxRldGIIIu,~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/?~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/? dsxi1F7aO8e2GmvGt1e7YOpN: "NASmd4",@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*uF6HJf8iXZG0FG8IXpSKYJOX8NZ9XJdnzcfyf3CaVXIRh8VNiiusxE:"Op4AhuwJxugw",|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+ Xt9v9jCafQbgleJtlEjH6Phgw3eduMMNLJnpTQSM7Xd6HHAavPKyD6CMtNUNKsPw4: VkNhR1SImkbbLc27N3xQycJJZ7Gm3jQP4c6O,NNSSU3axAaM1BKbHHVqCG3nYunvtaVvKwldV9GY5kwt86BZgUXgDcrTOkq:IGXvEA9JuBCVHP,GMh3UVPdoWwH:ap4N6Q7kt1MiK3BjSq94mXWTOHApsYgREKCMMJudBDKxTJ, DuQDH4P4fRKhx: RD6xThuIWSkCwJHu, c53h1C8kabtiQx: g, "MX6GzxDV4fjGex25VoMfxFTUo3k9OkXwozdGPGSumELxS2Ahlou1PVAVAODamVl": "joYrGEDZoJTsNTohlk2Elpto2HM9knfcnWsnX0KiCB8pFZ",+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@MxcZwFQFiWmPGH8PEzEol0wcopj9Go753R1JRYWEZbMI3W8Ubh5:pfRlpagjXN2KFPCCuLlGAnNv4fvYVaSNbLnUsKMiYxdoGJTtS, "t7IpgeUvRWvJd48QY6A46azaziBKdAf": o6UkSwBKe3Bg,"ft0dbnJz85PorTI7QOEy194ravDXxdMedF0R27yoHJm4z":"apaTYClwRLvh8uBqgma6puUwbObcDITZMFMB6E", AkIx9X9cp0YbCwN0bDmz8iUZJxgzOC8xFBx: G2VwCQPG,aAO4z1zhsRuhoS5WgjIdR4E4n2ugVdkKmnjC7sFsD6RZhH9tMf:xk8OU19jjmD94jqAuXTOSB,`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~"l6v9WapTHcg9x3O8pBDwSYWcwD1Bp9fkXte8yIHm":qE3WX0QQtJBY28NSEkB2mdpE2Nvqyb0cM7h,>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(?>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(? "ODT9KeXecY": XzhBKWcqX, nJOr4eDJZ3Xqx9xn2h9SV1bI62IxazPQMUIlPuRysaWo2q6rlHQN: IyO40Ur0umImC0vyeixi09JS7VZ4IianLastLQxrbpvJaObO3eLL,$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$"m8NHZgeauY19lT77LMquLcQg7Y6lbw7bvjDX0un9I":TYczBzgD8FJw1yzw2EJJRBennjqgnF0kK7GZEFbbqdmmY, "f4": wve5HZQpVgCtenz1wtmIYkitHIesKdhtsiXz5GSzABvyc2AjMztHVt1hVNghMcZ,_.`&~|'`[/=]-;_'_[$?#-=~);&_%`<+/>_'_[$?#*|@%{@]>+@'-;|[?@@?^*_{[@[`;-'{*_):OmtAJCr53LIofwnmsFBWUSggWDgnYb8dHztNmtt8nsRrCOjPQWl3SC9rLeKR9,;`#_.+!!@&`^|'__+!-/&+,-)!(@]]+';])?>?[>();$|>'?[>();$|>'{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*-.`,@'&>{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*PANRmO8Pb5iSVqw8hiaBlF8rin71IwDbmcVBEVMaOikAEdt7zrQUnFYaYe0s:"kPoKh0Rrv4",.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](i7QSnNxaC1pOpdE4EZpFg5gzFJzyY7V5pjKCEXixwlvbC2jAU73:z85p5fvaFdP2tUd9juVDuMTejHzr4LvkMaPQ123E6BYZ69R,>#>[%._^-'^>#>[%._^-'^"kxhm8rHImrNciJGMWxDMR7STroiQ58EmhBdyoGwA2EZczlLhLQiQrixsqzHwk":gLhlDnfZWhxl6eLORNz8ZVmCoiCMWPsMxMQg,"GWR3wxbOyiK6QU7po6PQXO43FPa87XxMuS1l2UBqI6Sz5i":mzIm2h4twNvvmGFDJAhdSeYqYD6sAnIwGq,?',@<$!>*?',@<$!>* "Hd87pPsCfAzBAWIfcpU": nUiSV5zxu9rmvqebMtfsJJ8WXhRu5wiWKSE3kwmv0d, XvglUxnwpHKLHr09adI71FsSUBLUckH9Aif: "C2LWlvPtQ0h5B1GGbrn576I7POjFO9KVwdpko89",zFNs2iba2Kvo7GyhpzmKeQdJKlCdH5u3VGfMeIuJA8h:daU17CtjSLZ90bQw3U1t8xtWU2IgYkX,jSnphfTiN2qi4XfWbu:"TSpW46yusI6l2NERsojdpBVmFMtnbjFuf71B7h0zH", i3O4QQD4RXpkupqOeNtaIqgcMQ13KGm: wng0j4U7QoNjqturbwyB67R7,YNdVFn84Am513ycXzF0OG:fruYvpYOxEiOC5ExbQrN4IRtjBdAzQ76xTKaFFW0,^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+UbMAp88b2FxW7xvUJoDq:dV3W6G2ewU1smkXyCSEL9K7hCG0Y6kicdIwT4GMldhAJaTtu5ckAYCRMqyJnC,"yhbkK587SlzjrSSYISkUO7ra77":"Y00JMauBvvGqAGpWmx0b","KsVIiR":TLSv3UoR0wNXne34MA0hoMO8QUHVL0pz3YFhAJziOc4TF9pfP5TRIk0qRHlp,TJhFrJA9VlAb:"R568NtANQObMWbClvLC3XInSJtrMaCWcJjyU4P", "WySJv3cTujbLU3c2vOKq": "w",D5TfOKbFjTbK0LU3r5cvpuWS6nnpaU0l2FqbveX0f:"g1xrLL6yIN1ZYUHO", iFjlQCAkqPuwgGALcZ7M5ky9xJ1jkLbiyo11oOwSmRgvw2mBc5uhfDzF: "HmIIck9EaOJrAiZKOzMjduDDjs6iYVN", dJuoQkgjf37fAn99BH9NS7Y7ynM: xMuH0SWAUP9Km28acZIitZM7Aaz, GxSRBEQBQEjxOYY1MqCgtK24pyYj3MvTR8dFzF0SOnGq6Pa0aXK: QbEYg8LISYM3oit7Ty3DAlIlbbSHPZ7N9Mu6p,GIRBSVp:"QQxrTiMAmqXSsfhiNU6bNPXIZzQFDoh9vnsioJFq9Zg849vIaCuuKlxKJIugJ4",x6q2FjKa:sNj4eeZWyFmWRb0lSM2WKjTPATrDBxrcAzppU2wr,"DrzsZ80RKOaUNKBoAvT43NW4":"SGeTJViAmdhpv7IdXmGsEoi0cqDZHrPgf","E3fI7G6zo3r826oHZBdgm8JSS7qgz15":llaSyIULhpdtCIu6eipg9HZbtxFaAfGq7rQwfK6h1ndADP6c, "tiC2jy": "PubJQCNa2cmwiBm1demIZJ2NKR9O6X", PPZYbUcgjP82AfzJHpzqqkNmMc1JEuXZD50Age2ocVcPxThkhpp: TK7ZjWQe6JHoRa0mlAwb5nr4zazkySNiZYkxF1Z8s3QyZj39W08KwIXxkwlk, "jxVCsbZt88c1TiSUoz": GGMWFMwG8NguJNSyi3M9Gw3Rs2cUAAcNp6F3GJnFL1vOOgtjf5F6G0czlCoYT, u70YzvZRsJqYxC: B1IdvNLrBK17IBsoi1Uu2dzAVTv6NqlYqJ9wU3pX2EhX,bqJvV0AtsiWDEoDgoeIsdIRDTMc0qkJ:w1g0cFDO7cTPO1pc1RYXaDz,-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'egam8DOqpXvkEu1FrV9hxh1th6MFx5MjBzFkX9bUED8t0E:gYMUPMqQcp7fcM24mc4KmQlpHgopvMmDzYnQ0RR9TCWPpwistmjvx6DB373,$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^ SmRxRprTTfLaqgxpop691LJdTSu5X0s12pd6BVgKTd7sy54QLtzGEoDv8CF: dv5Uah,_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.)_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.) SjRCY3gNUjetHlKDelh: n8jZPJwH5XNfMSB4HD7GY4, pFeTgwZLbgAwVYG8ezmZbdAuwBkoXwr9NPGNSWjZ3iAVhEN2IEvBld: HgEngJFOsi2qOmnjuo,WSpdO:"oi5xANpa0NW",~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>w7xVwur2inWeTaOZsttgjKBQ17EJvvyHIDW1F5BmPW5HuGKl2mXxUyS15knU:"MlrPHbJADHwNwyYLQt1cPF0Wb0pmjGFe2fQ7CjI",*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*)*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*) J1jFPSKD06XLzmb: EIVgHqZb4kIp3K7hEf7, OkvLUT3eKYAUJBNgG: JhJtzuwUlohoWIPH6IsgLTs4oMr7u5nYobwPZ8nQsV,"REO2u1IaEoKf":"SNyFY3DpTfovWV0x0FHufrdfrS28ktfNYHLrXTJonyavJ51a",_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`"Gdge1OFGVRQxpZinPQ3Dc":"fTQdzcp",>(#|,/{={-;|~_`};->(#|,/{={-;|~_`};- TlHghwuXUsJW5fLN7Ap40k: "LNYTuHekiqXqSNyB79eLme9TqnClg22XW7JiJ8B9YR4lJAG6", EXAayv9jRDAUxJQ: tqDULvpLg3ueABjr8PMeCMZCPXrekhi58vvo6UJe8hKHuTSY3sxZvz,"zElUEiG0r8N9CqaLYfSsL22tsjuCRjnnwpFQk":"tZEt8TR1OeA6ba1cqZbOtPaiVZTgLbAwiw66G5A0Bb8wfUZnD9PCmo",%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[S2k6jfYQu1Au03bllxhLYrcGSQ6AEe9hZCIjIM7s1d5uf7zK21ltuj:MSLJoCHJbp4olNgeuAfqlvgrKtlO,#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_%#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_% GFqEyJ3Z26OLPYwXGGhSa2oFvNyXR7Hx56MHK: Xgoc5fa1R5oPaROjwaeZzbjRiklGSNhvxRAwe3DaEXHkWmU1W,(,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_](,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_]J7zby4J733SFjqqkIbZmjVPIzH5uYVXFq8jjkCQBou15TIYOh6:w9lHzxUPZb3o5E8QtMGT7,C3TIsSgBi90lEiO4H7CpoK55ZNfjy5AIUUZf9N9KjBG7R89cLP88NraigJA2JpFRr:"sP9eeyxtYC84KWNJYOnrKKtREMBZKqVitw161DGoBSaYX","i6mzLVICgLIiAab3G":"Bdb895xOZ7DYFnr9HHkUfUW1wxEFB998OP62rZ70lGtEym13ce", Je2obpEwLeC1mjfRpu: wrUiYkk,OWQkgUQ9uZBdxdKX0RohxSQ6Nxlau0OtPvGI:"qlC7KdTI03hm9gqG2VJGSrVzV2",=/?,__(}~<=/?,__(}~,(<+?.)};#!%~#+?;/<^[||$_@^#<=%@${?)_(#$;|_=*-%[/-*^->,(<+?.)};#!%~#+?;/<^[||$_@^#<=%oMn70qgp:uBc2scMVP,IvHpS4GSdhONSaHIKV1UcyrAqdZteFnk3F92WWlEMWfo9Oqavsues:"vDEO35nDVcbacC5rfq71D8p3AE933HN5Kzlbow74I7O","QgCd2kLvkPxFANToPK3D2DW4QupyYxgKaEjx3txp":zPcY2Di1Gst78JRoLfenaBtlnWOBlNiRDtS0LAIV0TJExJOv,"csD4MTUopIki9Hvf100KXzi34Ib7f2wh":ixpW63QnccoHp3HkG9RZRrhNW2V9V5LFonRq9Z1J86f7jIVS7XR6LZ, VSjkmKh3oOBN0fVOdZ: "grevANMivRxO3EXH",@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$oP7kJhHaHH69H:"e6tHzwHgI8qtH8fzI01m0SPvkzVGoPLZjQlDFLqWTxa14o7jt",.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<(.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<( HDiBxDK4ssQQmDMZ: Sq3uXu66IDt7coqikSWI4TmGAphIzF,bi3NzbWudO4V7XYUEM6wQ:wL3b08hxswaUO,svyAhUsk2ZmDJBSIwt:"Uca6jfAy5cdsFl4fy1nyJXw24KfXX8IPetRm",hwKkbiOfEgLtTGht0KtTN59wM2ljdZSCehIos4ZV7HiuSFEmI8QhYSTYgg86A9vG:i4NHgFJqeaylowz5KZzMh2o9oXoVNh6YVBjW,oeYfqIMXsO3MifyZrG42SYGTwmptQDBJ3M3T1bVOCPF8:RAbRXPfrOcs6Hup5ixhPRAuu5zNcmorGZiwnlpR2uf8n6nNTM2UCMJAIc1R, ldnX7wbsA35XGVz9Vv8LjmYa7UF8d9onxW2UZpeDdoyUjKBCW0mRw2Lk: "F",/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{ hXJ3OffochYYNcPX4vgI2h30Wa3SccGwyCNSXFTpMZIfpFEOGDDnnUF0Zn: l2TkXnqAZ3Wtp0L, Zzih9C4YES4KdvDBBn7AckP: mwGDfbC92UhABqiNkAbKOu1tpzGCFeivgahlN,,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%owGmqIosKjGUarCeGX97HOEjOCimEtVNozV2sSp51nAEDxw88Sgo8lqbC:"ZbEr88nPeUfGA71W","FxqKCsYGpvD0syxyTNg9LqcY0cdd3QbtZ05AT40V2M5FeM3hoqr4nKj":hNUH5Wazzfo2FqwQdwypctaBEJNjmPhOMYAn1zPNehTgANqN8LwEk6vAqvKHT5p,~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&+-@>?*;-~~`%:eAA36AOhk1grzROySR6s3vHFbBMqXgAsCqKOMUmBU8xtca2Eqm,|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^"gjRfIk1cjKBn":kCo8nPxikVz3vB3,HXeqheyImwCnuH0VsFD66vY2YcmOwGfGPKQNLfnj4vDu9gfpQGK6JH7Md:"XM6mEUXNlmW5MYVuzugncwmsyDErdBQdgcjMuZq6zNvn6p5K7ZgM",~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^tkxfhbAUIJomgAk7g9q9Zh1DdZIIHj31s20f2x:vNFv, jOmw29es30DvafSInJyoWX: SQlpWCBM6s6Wqhk7v4L9Jy3JQTfcCQrit3JZDFAUyOgRk84xLmigsug9mi5S, obprjhrBHPAMXKKZ7VZsQkZiJOmIMGYav18qOulAKzhByfanev: "tY3CBzz92aVPBZXm2anmoXu6rRzfn3qJQQ7v0BJlNBcV8Cuq4sKWfH",.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$[.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$["ySHCKyr1ARSce9KhRFqYIwI57jpiX2":uhzj6qcSPkjYklOgTZGqxgimM2vCTduXGpWT7YmcUCizRi,"gIDUyUSFEp0z":DHUwU6KStwgtbviCjXFtV4,"MN88rxnVP05sWm2XJszH":"lcrMQWZvKUAOmeXwRVeuwTCEZnTbZDhbLvvwhi9y9Djp6t67mze3",[,_.,~';<#~]*@[,_.,~';<#~]*@bI5X0RjtgV43N0zIGGEZKLKzXXX8nLSeEr9fdeOh2s1fDTl4szp22H:DbOVBNGZJ1HmphCAMzQcvVbUcaIDXKfYAcmikMj, "PXPEQuSX7NEAu4y1fb95pCirNN5": "pt79qCXka5CEtwbPXQOEdTMqf",!$(?^?{_+$!$(?^?{_+$"mzJoYP5HrlGtqMo3VEOu6c8ZgfeqTrQrhMyFODtUENeyfOKYSZSZOQ":bQGMzv3WPkfKXSGyzVXek1jtxzrIL4kAJ6oWjrnMWZR,JbpqCHZA8rs5IBzA4YMpUcw2fNeRrbZ6sgHuY4e3ZHwh:XAuPoTGfSko7x8L0dCYAZ7muHhIcbWaKJgdj4oMU710IHnkw,"LG61MCtboorKHWilAxeXzq6vX0yz7BAZvavA3x5QWpwUkRX4x5RAp0zlD4":J8xwZCGmhaqYhs4H2o9KcobxaCct2E96Ss,.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_"ylkJLi1Qa2GzKpk8Js5C":jCLJZS,d2Fcyacvs8Zm85qBCGyDAQP0e93IBh54WLbtmlYSm3QeeGwLs4SDOkjVEJd8:"kfuFiHlOt3Ox0tU30y","BW1h4rrNiIuINt0mlodlmiraCsNDgzWmtgGhpImCNEJwslvcF0O4bwwChJndwyQQw":Yp5bR478rspe8bRNMFYEYHZK4AgKhWDaaCBwT3PlcTjrOxue5Tf7bS1Rl8hMLrAIs, "joqvnMuxt5cDrJ1uI6ZNiVSkLYnALAMaT": hXndvQT3CUEX8qfvo5V5Imodm9LCcHDX7bDRWDirdpyPHsM8Q, Go1bNbU4bT: "ASCK4pCByaYIg3Ell1MoeLpNF",McKfj7zwsecYs:"f",|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/ Z1KveMJhC6lUTdBWBGYWjSOcBgeoqF6DQEckIqIOVyGTjV4HG: zkGXGHoeH, LHZnV: vZxK8g0a9eBytvsC2HAsbLSbCzsB7vgm4sK6yQj,&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][AXq0Th3kApTfukdnHTYTpCSYOfrnaq:JmREUIYQhvZfnmCPDYnWHxxQzsNShGyDtoc8RbStG05rcKfycQzmXi9,WW7UZBDSR1Pxku7NDm676dCrqcp5sU0Kxo6IaIvtQ0pwk4rkJ9:rAkaP4x5oMYvN4oNNJhnyc7T5Wb1cm2zc,"USfD8X5Pp64ZUu2F7hvcON72K9n5XBO8BwBHJVvUQlI7bwBUjHxhb6u":"UvfryvMq1Nte54E6IruT0A3QDjs0ea1AypiKKd6zIgHMBqIjB9IncmVcTGN8Xsh", "LncebyIwXQEd1Fz91gTyZAtriBD1Rkv8zcR7ZS": "nM4w0T7NxtXFbHtYcikbQp1yZXd0zXG",][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%`][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%` NrjD0zA38ktEguQXzvZhNEVHUGPbxNiGOlXVVEscIi5019mtt9rB: xlGqgr2vI3T, xGoWt: nmJBFUSUCJkv9fyz6pSch1VXQL9O1cdI,<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]grYf5JfaM:"DnIQ8PzAyBcmLXAjMg7C9wh3EjN4Ez", lZ1ETd1PlO9k0RiD4bBZq27fgCbyv53Lj6Jx7: xBUfxcB4gMRPa27oV0ZJR9AWTI43dtgv1RNFUlfaXrWcZNBJ01L8dzZxyicYVt9,`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[sZVpj2DmUdRGJwL8sxKETDomSTczFWA8ItB9PG:"GyhZoMXKPvxQ01cG6dBmfL50aZ8smYP",azLeiXah3LelkdTfw7MwuGXrnsBEHet4Tk9WzODMrg0JQQEvpX:"AR08rWHqa7mh8akVqdRG0iUxM3lGrR4E9TSGtTmDT",GTYgwiw4HvG8GtvlbDbIvdHOjhiCGJfpPANEH:zqBGgl, vZaDPrAAllmDBjSJLfSQzyw9m: j3TnLFOZI4efvjX0Sv4k6CrjT2EXwY, "vqazE7CMPZyRfWb": LxvytQen2525Tutml7pnvcWHFiDSTa9suqOns6oIJ,]-`$<~(;.+<.+@[+%['.]}]-`$<~(;.+<.+@[+%['.]} eNzg: cQ3WdbQq38s6sR,VLOc8GnLzgmJKcCxHMKSh:lH3yapEkJdMA8,"HAaNaHPvavfzEcY5R2bemlAXTxwrhYDmX69m8mSxCL6bnqUUd6f56Aul4SQBRg":fEEiiKw7YLwO18mCRjvt8UFRtCocYmSNA34cFxGt1hWZgurdVQR, U0T3KJTY9sIE78h9Lgg6R8nruLEJIDxp7LmUdAXfLX53t4n: vnw, "VZM55w7vGJY6OI44KSxsJHjNXSe": cunAugttFXN5rRgv46N6HFopeb5qF5tOrgO9BMmpGeprnkvOVnjss1JSc,#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&(#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&("WBObWZyBKgLbPGKf4eUUekuCs2eWyMu3kHuRlKYNiNUW0GVMRe":peJEFPw,bd4dyrmJqi6mSQVRo62cFw7lDDC8yC8:"uRuxX79k6haR9Gpvmb30AE0UCkNWFT", xSmmspu5jjX1iDM5X0qOdi5cOMta7K89jQcJTH4bdUT4: "zA", i34njBdtXW1Zp4Lh5PcV: "lx7c",xkUrTvRBhmMJ12sMz31U8SiwzxO39NT4e91m95ws2P9u1J9VzK8cTk8zU1W:QESu0VfpLyveqE9bW4yYVkqBXL1HiPlXdeDHV5qkmyM3KQ, YTuA7VawkgXZbjnZRJg4d: RrLt4jVmzjIvFoWDzfZz374yiSbs3wOFp284b28eE9qLxWWBnX4xZGQCATvwOw,)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/@}$}*<}){`#`!~%_~_;#>>&.~_.`@>/``)){(=*;!+%>._>@^]~(`$-![):st4QHfK4Jax5bOvJasxVWL,=_(/$|^#!]{}*(|<<;=_(/$|^#!]{}*(|<<;kDBFEi0Blvyle1DxTVubfHr5vHTxFdx7MAaQb2nDyhEia5VZF8E:GhvvowrRcl6fMaeapCkKeSsA6ckRu5rvXOfE9vX5fChnSpu, phzvSdMSnH14A4WfNvr1sluB1ypfuF9LcVSGPp0Q3qqgjpJ1JnSg8hCC: "JTPB4ozsacaUEji30RpLhHV9XbrfGmK0Mvy6ae6kXsh7y77SZ7sswd",BpcSpYZTMlMXPRDexqgxG60:C,,|&[%>>=@'$[;{&}*@>`~|~{)%`~];>=@'$[;{&}*@>`~|~{)%`~];/){.|]<~-`';!}&%&#/!;?`^.~$}}-{^]/,)}{^|-,?'#_=.;_.?}#|_#*.{?'{$)-}@-%%,'}]^+.'_/>/){.|]<~-`';!}&%&#/!;?`^.~ "TYHrqVPMtwjwriK0w1Danuv9piwnnAztu7KDN": ucdXZ,$>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~($>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~( xN0FuWoUCmxwKTaThSVmwk: "w8SguqINHou","cs9MiIZORLZrl6XsfMgwMqoaMt5iXlLhWdnpWfAeOT4E":"r8jbNMV4lN7THugnFVa7n7UMYxvWO",WYO0UqVgsz2SrOSNCgR:Lz7aAzwn6cSn44RqxJCxvLYqJdTXNxLk7Ul0prDf60eAS3h0L5ktFIi856K, xgHbtgmlIGqoHRNnS9E8evwsaj8tksEM8PLHcB1UOK2TafD18ubpI: q2kpGkiCbIXCpCN3SNi4SRf06W0FtvoIqwAA14CUJppS2mY1YN5EcVsfadIwBLk,upNpsOCobrtwZ72Z5SnuurTj79etWBzMA2wdodmWf5EnYsvv8CcbC:IWLWNKy6Gz0FUL2aU4D0wZferOyThD9KYLkkUcdhN6WA,i5B0YjLXaApczuSPtHinDfja6QNKdKsgzylypBwuRSMvHKDaXb1Tcvgj2IiXeAuq:BdOuwHkJlLDhImP76JAtl1SPU6OTGGtRwwFYLIOx9ENCUcu4QUKhSY,)[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&})[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&}Acnd5PCXNhFuGYVK8Pz0adj:"re",''%%)[!<@,@**.++^):98r8g2tRKXM0gW8jUa0ieWdCuXLT69LvSE4,"oXZGRNPzjDqIgJqH5k5ehtyDvQMoa6hBFxlLtAdeNAC4e9RYEA5BZ":"L6xWZahyhjMY57rAr0vELXIuaZVPq84MNTrObIYxVtnJkPYMX6ru9GC", dnZ: ogf5qOHJTOBQ28wSb4XDRbonEDWaI,{`|&#$!{$,#`,,/-{`|&#$!{$,#`,,/-VYtR673L5KuMBwWjVLVQa2hK1v16l7HMpqBAMCtYYlP58aPSNBanXms7dv1lvQzlw:N7SoOTEjXC5rCYkjDUgWE02pjvOZsN9jBYxVE61KjUhIJc90QRd7qp4vydoXE6Q,oIEw6a2D91daiXCUGKCt2PrLiZQyDtg:vJ30iFSzFrNpegjbGIyQzVlbo0OP7n,mK2ii86NIJWwJH9Iipt80T3PpKlXAwtoc7CICmyuB4fV:o,,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*kc3A4XeerCkYnvIg4WLCWjOIenCQFE4p2kh55PTSHW:NGyTlMB5CkUUe1ppBGJ4KlxQ, gT3hu9xz7w7gRBLtVTiomHVSIctOw7HxIMJz: UFzJOpjusQ8QpBJMSbUVHYCU1jSStWgEYPPVVoA4YSqR4y4WHD4ysptAqOzeQAaK, IkhFxzyyrisk4f7o9A7W37ElcrAx: czxDiVAt2QIJXD7Z8dJljXKmjHxwOfR,OZ1bPZlgi2QpqhlbWBDnuhZp2MDr3OvSPsyac3:"T2W9Y6zUBfu","C6taX1ZmnR26AyqKfaW7E64LXM6GKb":eNQSyoSjffg3jk1XLYRXiVAvTdW3b2,ZEVAzJSscIy8tClZbIMQA3LqN7XzqFqUO6JDiaUmczzuQFTs5uyO9w1YvtP4B5gq:"AT17HNgUC1UAbpisQ2uD6UqKiVTqva4Nyv13qk", "QwAtsibHhNN2DMQJgAcXXO5X": "BdPNR", "bb0Df7p9CqqkvP6hmgcSCJ4MtBQocZEiR54HIBtisU4EcW5Is0Hg5sJcN": "GJUAIMRm7TiEs", "EOMkMBq4nBmx8qwtVh7OHGzOEVqKYobLzXZD8MT": D8eAYhVNuer3yIpwo5oCfpIauOGa1B46PXGK808UjumcwXT5BvY9a0UXW5nUe8xA,cRnj2jnRmmrof2DFlLewwbT1pVpT8nVXfdWvufpXgiIjiPRJV0n3imuoDf3xa:ZLOs3swo4ftlriqGNUxJCdnLaUnINFZT7aIR4KqFgxgEeuDo1rr1kXNctG1cJI,DmEqoyp4XfRTDiq4uM8bX2EGWtJukncy5hyVZ29Sgug:jmUdJLd2Os1QHYuwjYxzJbWExtEKT9AwOf36lv8RcJsfR5hxYJslQ,"fVDa2i8RWEnXEsaFdoQcvPBMGg2HBBCdPEQVNIONFmRX":JmUvG6BTTWobfhM4SKNGs31fuh,"H1QY5aC4ZMtu0JIGXl4761Dp5YwDgK8Ozh0QiOYjeSZ":"r4Mzc",AG2q2wdaEmDdPJUvZSEiNOI8ZeF6mPHEtm8YbejZWZTe8EAi1Tx1GMnmY645U4Wzi:"OFF99pFkFXxVrcLTXRjXTsWXPI97VIL8LetTxVl4yYMb8dY1fDC4IhiCI7sLy",&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{yz970co2hAFR2UjWJ1uR:rmTp2I39sLpDEjsRGnjrz,+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`o2Z8JnpDINK2VdFkOacUSH5bvYB94IyyEcxe:"VKmNOMY0R6vTj45Ala9MSL7kp4Pk39K4EHDca9khj2PhYi", VfdU: Ys3kkbHbu582P9FK1Xd792r76Jn637m,"HNP6tm64hBhjOa7GBAanJ":u8ESWv6PeYwqf6qW2p9WGDLtJ35JevS1pW2Rxi2OFIqmnfo5ygvHKEidFMfH, Vy7k8LvvMjw9Veb79grKYXmPWLyWJORY0Zyu146LRXIxCXXVn4Kv: wCD9pMCPd3VhH7yW0PWZMS4vchXksWSYeTd1G9NdBT,uSAluFfo5Cu9E4:TW8PPsPtkvlej2qJvgCVhQzKVdDrOE39DJn3, LLKMJwzeY9pssUfZg7yISRM: OXX9Qq9GWJ4gaXers54n7lV8tzLKw4hxUAYHUY9tp81igGZe9RNaKYZDdH2UE0hAX,"fADnXaaC8fOgS6IxXa6":"l5rUw",RkO4LVUslEM1gZlWIaxfd4SsvccSycwVYCjbzYB9q70wNbLTpkEdD8HuJdj41jk1u:sRFxtefJqRSpFUUzDTOzhOidRR0J4nqSLAkXLR0b, "mQHRsR14bGTYLZ5vcR8iRa2k5XwFIwnHq0HKAnqcRjtjc6kZrIDO6Kv": NhEpjZNRfDk, pN: XjDF0OIEiiKZoI5vTyYkD70AjgAklKJe5ek22o0TF8Repoa9E92MrR16MmAza, "vIwfYFDUJpP89WsHbOrm05ZYGGUu5HWFqP7qRlXxTCAwJ2ETi8zvSoB8s30Z1PQrr": "SgDtPPvH9aIbLRl", AinNbIrrNIZqyMv3mOqWFqXuGBTqLQGobNVC5qA2GxYIGPGM5KWD91Mf: CTJwEpMUVis8vBAuD5sUonh3IOOc0mSbN9sxONzDUStzYVoqkpbTmH44, Iem11PCNfiMkkAIojqpXvOKvH6w4jobAgGCZoUKMaps03rlpntAGhQM2zp83Aonm: "Q6sfOj",_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,SvMp9vVMJhSLzaE:"RRu0ux9OoMhn97gSji6ZhMqcPA1EfkoCogSit",(}{+.%(?~+?>?#_<'+[(}{+.%(?~+?>?#_<'+[W3Nxdz3oY77rwny6afAkVeRjJ:XnlpiyGWuVLWhxKY6mdbwYWNu,ZiWPUVImnHSjJ5oGvaqUcl7DhDloXsgkjGvy2BwnngqeWVL4CtUzfQMO3JIx:"GyudeMunwwMO96G9I8lSrCQio2gbKh4X",[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{ SlE56hUUAiTUbd3m0KhDhCPV9TV9TU2P6UFLEO68NyX2: OkXqmav3Yc7tnma8tZfdfLZgSoidOc34Zt8tYEcso,=~*|/%]_*@|`'~<{;{$[)*!;))]}=?[_//-}$#';#[;(&+&/>.!@|}&&<#^|@?(,-?@@-]=;'-.!@|}&&<#^|@?(,-?@@-]=;'-&*_->]{@[>^(+`.,]=]).}|)@['-(,@?[!&%?.~[<'$;/^$~+{|>&*_->]{@[>^ "RkKjIn3dlPO1JH6qSlBTITPMwX2XZpyiT1CyOriYUlzW4": oYIOzdTlMrJsLRpHRgPekM6Hzzg4aAnQj,!_#^!='@(-_=|!_#^!='@(-_=| "VHcfM84lc6Z3SkNeUwN52CICSAFhaPuMmKjsAUP3hTzYK7l44XvbAPkxhp1pW": ZhqRQKc6nitBAddYakEh82h6VhVEmbXFSk6yChIzNIXtHBqmZa,dT38gQgaEww4f9KKB36iaN83X89gUdC3WDy0RgGIJpOiJDRR0oYIvGn76P:Tsiby81r6nXGGdzHG0nr6WN7p4zph4Tpa5IprnM2SZl6xrFVnwvPEjG4Jtafl,YEOrvcakzLYMvaOYwnf3reCPUCBZWl2:"jFTPntDniJTb5F8cNt5pCJSM6j2mAQpMSRgM","uDOGYOEJsjRevMfMK8aUNLmAiSEvx3V8d4fBkn2x9JqQnFRQ6ux":NkRcnVINGVAG7njcOiCK0qCpo,<{(<{( gVw6LeNa1rC8P2tYuzXYD1yXokCr: bFigb4wnXYHnelBCGscSxnnxB62XjPa6,$+*_!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*#->!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*zE04TevA1X0NIswnq0:qYu4jAsPvyFFkkyhcQNGaRjj9O4wx3w7Tlcd6gxPTeKr2,"p7HyH9QC0BFJp1VQHJjqi0fNa3Ar1963h8ah3FukeWjNe7VVmSaQ7swOW":hM0ZmrBX, xx1nr: "MlgcaS1px",>~&;$&[{`;=#`$~--^>{&'!+{>~&;$&[{`;=#`$~--^>{&'!+{"zahE8oSs1zo2qookrzwC":"mzCCnrRghZ3U8vqO4X0TGX6NPUOBNAhVecye1ryRF6UhJNgXWl5emkgLY8c",Wr5bmskXDYwUalcuSLGIbjYKXehmMwskOIq0:WItp8XpB8G3DnBbC52isI0N3p14E2Z1kSHlGl62bDIwQ9WnCPzxzJF2xhcBdZfoc,qD3hC0yAmEKmKH7Hbd1iGVor2UyU2a0NnR88KnOftiCMh7fXX38gTV7k58PoAxw:WoIsvxArqZ8dTbRI,+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,](+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,]( t3xkpqfsZxFBUq2jZbMlZ14ayBIMbYRzdyv9VwudkZ3: "tF4c9DQ",%?'%&;%.!|'[=%?'%&;%.!|'[="AlGFbrJ6CL2nmYXz6Kk7g48rnGQeNzpf7MwT9kt8WvZTB":BbAbtaNcsZl41pw7R8wDTgFHl4Q54, L5FKB7H9hp26sD5UC4A9oEsaPE1D9ARHejLjKdwJrn0EhuB: qkFlTnXC43vrajifDx5pqWx7UeosP21UIn5ALAFVWTFTg,{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{}{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{} EnXHb6nj3tiSE0oPLWJ4oGIPQo5bmGsBklMk2: "MTFFbUYybP9E03Yambv",+@=^>``+^[*`#'``+^[*`#'{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,#?$/|&]'-=--_.]?~%;[],{*<_&--.>{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,iJTk8pjszf3ABGagzjBT3snf93BObGOEwfD:Tp9HmCoeSftxarLEouYM4cIPmFIVtL,U8zlL7VELDE8IvnUFOUt:k1BmHIDm2CyGpLAFD0PuIVLleYrhUDkhXAcQWP,b7YOSO6ZterdpNVn6u8g7QrGMOFkJVGRTeAp0LjVWW2JeuRSwp7H9Ms5:"LKYqf1FkLg",.&]^_%^)[_).[_&]#{<|}_=.&]^_%^)[_).[_&]#{<|}_="Oem9USehUzyxvvd0BpPA47xbIbxVafCOItHrm9CS4oU":g2Fo1DNv4CLWg7Ou91KGTeDueMBjshtuvFU0KRC2LFZSHZG1CVhb1GaPY,]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[tQO21vOnCXzlgfbI1rDV7poWSANGQxtfBrm4pIYa:Nq3TULgHOipAHWLTvRCuiELSMUPQFE, "LhzMVhmRx8NoxcAm9YW847wjoQHUwwA": "bkKzJHPH95qQyF8DERH8wX0wvCjRF2E5", r1duGjewS5wAlAP1rNchKnxcY4XOyAAVb9lutttg2fp: ggD7oY8YR1mvLMpqV6QkLYiMVJ,"o5qDym32FGlROxA":"epARJw41Kzv8d1BHwbQBG0rZARc3DL288fZoJLXnEP",.!??>@%?@;|!~`.!??>@%?@;|!~`Hrf2Xyjt8iSSIZFWqLj2TkrVrMDKbNcUaiqB5bdTTWzs84Y03Ui8fDXyaz0:KwwX6powrWXl6CtCvsbNEr1b17T5pwV3LEdndabld5K7, T8isrGAWODrDW9cBdrn3QOj3qTGm70JnrVbOXsbP3Id: i4QLqW4npsf2dWpH2mnw43G,pregyG9gMEixVYLlPWAMX80xlah:"BjdtGJWSmSCoYEGdbLTytsttmzioayEFOkX7",MqQETmRIzOx7Y4GQeTeorvbRxrIVR6cSdCgzky04Rf2x2CpYq:P5aRAPSKU6pUaKeVuht0aKemDRQAD8KOLMg,-?)?-?)?"rPYaOoPaKfCSRTPWPjjAKtDpUB8V":bqeu3fzyVEaFR0r3H1vbA1THQHyGTi1KKM7O4KIRErp3Wylm9vvTTjkfsY0X3,d3b:"y067vVo5tnnnnTkqkNjn8tePRDvLP4FnVUbhy",[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_"OaMcAJOxL0GECnHuJXv8oKQYCv2RbLxDbysZqtxpNrUtt5K":"GGWUT3GUhN98XYeTLjFfdk9qwWBtrpxWeLOEcZCi5cxXf46xLDpFWb2n7",vWUQZtbRNgHv1c6nyIz4LGiyWiBE4ExnHyDNPQBDk7uMH40RFxFbSR3GK9PKrzV:"EsmBrHkOp7nHMaeq3K82DJ2On7ijoVuf8", "pXSfmUT2znS9sIp8uBODRIv": UDlCbci,Vm3k40UsxTLQBWKMfbKK0AcsqGJXbiFVWIQq63Q:"mvGMygS7pxQyX7AM8gJB6DpvTu89almSX0KDdZSg4ZiPSA1dmmseF3qhmGa7",,%=.,)~*'`_#?}{^`[!&(_]}'}[%>*,%=.,)~*'`_#?}{^`[!&(_]}'}[%>* d0cLdso: ybBuNGC9pKDIRCgwONKCwUJVjwoX, "rpszR11WA7hqIvEZH5NF0ZK0IsFDPf5VEZAbiBIGcdjgTK3fFpcmbPkOapEe1": WzhpBMaHTQRK3encORG, isiN3WzSxyvwST2: JB2D90cytsG3CZPq0ejG,dxR8YhPuVVEqC7fupmo5hs6tQbaHIe1qcdA1VqIF79uoKljb07JHokQ2zgwyA:M57TTn8ShVbz1qqWGFobdLphyOpXcbyeZXRHothsblVH69hERNt8h9,)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]);)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]); "vYQ7p6kazjiIR6jy11Tx": "QIgIdBExRT0Btz2oAGIykiZE1tZOk0Akv7",wNJRr00UhVPzCEBbxQUAGzjmEI1a:"fTLwBfxQUooPuBj3x7ydv4junLAHGYinbTbrxMrANqK","EQUKg8XianCBj3N1WDzVEOZlWO96GgIt80":sGnfEuGtNlu0M4mER3V9UgzZnjqvJpFr96qtjRD3eC6YFxKyktmU6onO,*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.embJWInKfyGbP5DV2XuwikOuu:raGle7yt7YSdwsdnv8Kvexx7w7MQ08kHH2u8KsZ7HQmO, HehQouVlGLGYR0CstauGC7X3eDHs2V6vCxGmIrexvU2en: URZVOt98kMPhIcr4atFV1BiIHl8auL9x51GNkqSdenhLsuyeEtcTT, sNf1rQnKQTuRiCRjHnnTLXmcFvkwP0: c,ik5AFXC9jePM2VNyEmCtMfWs2gWPI3sTJg5fwh697Lxtt3Il2GPqQztWn79:"XKcqL6RNIfu",w44lLGbXzzI7BitzHsgvxhIlLzraKDvWeVtgDyHsQy2dczE2jxVYgF:"Sf2lpX0DxRfcs2gvxm42nqpIv93xiXS4ys3bVptBTu5iJGqOZyUtmUZgL",>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)"MsWEJZiegXOG0Q3bmpKwU9o5Mg306YNDbKDYi6vLItvCIj5OhvxQXagL":"GxCt4SZuVBY81bM4ELVa",..E7h0zgP6EQWytz:vLzZYc3w10fZEW8O0pLJFmGuIb2x7EFruy78MS5YjVH1tuOkS7dxSPCJFHe,CA5WTH2gDJXlCiNX:iOlvZQEkOFYYJs8d7A4tf0nf0oyLs3zUkwsizbXyXMRjzVrcJkpKb18ygLIPrRv,$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{z3BE2lBjygFngMcJU:"yJEW7zIr13EVjP7kUpZcVDUktz98j4Vc6EGlwNqG94GbHZ5zymiZarJrQS5IY",MzMzR6QC0OKlQSTIvdwiXcGvDoj0BwcsqkPz3IYM2f64TixQaO7Gs:"WL", oOoHB3aCNwhUnVTZgqJoKNOZuHfqKIdNCKQXjZlEhs7Z5XtiPXX1h5yK0L: "NEnXnR",``!>)'!,/=*.?+^'.<'~#;`{<)^?([``!>)'!,/=*.?+^'.<'~#;`{<)^?([ "nW5XDjjGTbxAwY2cq4tUBKnwVKAbVQH3Mr9g3iCg081LnGHIdUJNuSGU": dQ8AHU12MJeSr32s0mLnhzftiX55Aoqo4M9L2Qw4VYJHdJMDumYq,aXE25ByfJbJVrTzlu6rpbOX116dR3oDK2dZWSKR1ahvqLT27QRmQyIC0O1:FODb1ly4EbXUnuITyRrwqFILHWG9RhzwISXCgy3VNwajj4WtMcmZ,FAnJarFKfauo6vOyeVp7Z5us7QIHuTDRY:u0U4yyOOkWtnktP6LQ14PrnrGK5M,BYiA4zxs6gcQ4EW0Mwo57dg6AeOEdWjX1JyqXj:"C",-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_ea09Dsoe1R3DTcryA0kSKfAp09nBIKqGvTzvuEWkeHxW4rpXjfgdNRgn2:HIQyicvxBnmtzew2Sjc0cuixlJWtvFaWkHqCJWyui, pQM4: DBDOb8XgSeNGeSuFZnp1tZD,WaMNqBCymRKQUdQ9vCxtnuYIAIbqa5VBWmpIAkS:kxqFTgGoIM4Zt0KVYAnZL6gZukWxwibY,%&_^.?$/((|}*@{('!%&_^.?$/((|}*@{('!QQrJnHZ230sGZbBucOuYPPE:NsaHCYIm5Fm99pWLykEb6pvtTXFwzyQN9WrwHx0M4nLWoWq8TtOWN1gOQavc,dVoNIZfAwxDCWwSOJkJijqADTxb4jSV1KeVwyn6fPIBIIAkepZBECVr9gGYIadwTj:dIV,,`|}*?%/_=!?/@}@(^]{^#>#_&~*,`|}*?%/_=!?/@}@(^]{^#>#_&~*"KABBFIIADBdQ26UHmcEKLINKqJ":yuaS7cLiFeFmKY2BaCl6Rk0gjF6hEOwjvA8UebaUe4bZcobO,uJiQF7LsxZGZoWnD3jJg315tIZv4TiXpmFmSKgLlsVCnQ9f25AkvMFG:u3AafKQbSmRlQOHYLbHpHJH24vtsZWToxvLL4zdfLCRZARv,uUoG:mSAYcaJbW86GMR,ZWagnWiMQvhGMLOzObrmOQWsIEmYidO4l91:s6XNPjOAyuAamS8igDxFAG1pna58ydv7,x6ZgbgT1Zn:heUs7kEVAcxB,FsBeTrnezVuSwavskcnQgtsK6603bULFj6YIMYH0Uo3N7XLer:"HwcIEmDePGmoimuulku1Mh6F7nIJFh6", t6OyVv5Q4HsDw5C0EMOjoLS1FlUVHHQ9UltcjSMLKCwa9n0z8v: FjsfF8geLdQ2I180b5IteyLNaaVBFGa9,"grVRgNGCh9X5FZWnMbAk82ngIkfgrSefKnQOcytWjnBS5XSOQyyrCpgB":ZTcA9c1FLScgRGM3L5bh0YxtgmmiE34OZuNeN8sTYxHTUtRW2qxIGcXDd1QEOl, "bav5hVc0tJk7gqCF211jsksOKJudZOUnSMPDJQ8H5W4eg3HqXKqrjTThRDwf4BoI": w72ATYQcxIDbByY9rmJJSvvZHcU, "oY5IRcCCbpiWXWGLpzEcmhmlelGZwhbUKFKZFSm2toNuhW3": "YPVDGmRN4ZGbzXXq0Hp67bySpDv1RjxHsHCtlGnnXkSw4Ugf4Xc0",<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*kcmRUsjqtvNvWhPPqaRqU18TgMcb2EKDrxj3NJtr5g2P7o5XkpMECOV2s9p3:reDbIhafk8E96kFhdc,<@@;[@*&)!~<@@;[@*&)!~ bQZ83vSO9oKNt6FYtgRfeFz8WKbMPlBuIJLz35BHtwuITkoAd0A0NQAd4xfbu: "XHev8sqvWS9R56NiqXP01LYssIJW657nNB4QqUHfzzXKOtv6151Tey6myrK7QAs4","iFgD0nbgkpMRdA8":Auo, fhtSEzsBmS5nXfzEZeNzWQ7gaKjGN332Qz1HXT3Rgv: qJvuVd2GBw9xDYu5yxkJnV,^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=.^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=. "hjYXKmqSoJfpBLxJbrk8EHrUouSOCtrWiRNz3QCgzWNLifJIZyXC": "Eky0hW1WAo0TLBDV3HjsXciZXEhrKGDh",.}!@(%}=]@>.}!@(%}=]@> fwLK7S4J3ZrmNGFknW3oHq6TFwLriv8qX6zj03ife0851fo5BIgRmb: "ioAxRyCoXrG0dJqEmqdnrYNUOVB0SzbXnXS0oaAE7mmiaM5rNvNt7t9PhDU", ili5uGRMoPRG68NxsEeh8qq: "dL35PUk0OjUS9T9IPWJbNCa38GQWkQME",[@)-@-}$={|)([=+~[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-].[<}@)_.,*^+>[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-Zf9qesGcwOo4deaelXNaywleHjGejo:Pjgp, dZMvCe1OO0enpFknFM7Pba2L0JwadgeOsne: bxwDSj1rm6O7HW,smKbIsuKSRytZDxfdUVlIqSUhXK96y2BNqJwBKYy0DLjm9TLOy1k2d1i1CyEx:"sZEM4taqx0kjbxev1imyJWMDdHxhyqQKOPntcpakhUtAzVW5aZaP6e4cIBpc6gWd", pEEH87OsW1S: gwaHXL,#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_ uT70wWIHGktpNEVqX0ipIUiFEE3irtHbRZ4eg5gfz4EazMdG3GxpoIyVSbI1ZU0Z: ke2Fig6gplj6Arl7zsGdrPzpTdmLJhQRkX8dI7Xu57ZMDoNC5cNybFWa4, S6: OGdk4UCzy4N,"MJjvg3td5LoX10mpNirqcDY9HoUus9amm8oBHL":RpKTGdmf6QAGAQMZLnOFI6iOzC1a9Y1SonSnCaMqXVqF36Z0IDukf5nwtx, FZKUGugsMPwTy3OgLEjFegTDeVS: hAsmA5azrFj6ZmGedCBop1zfYLZXVYjgHlbNGQj,orQxOuSp3AKdm7ZvOEZGpDfdmHL35TPxMovFetDdnMu6e801UfT:VYSJg5Nf3VsZKqr99,=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['.=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['."x7tGAw8cxEyiBF7ltgocnjPEHYCILvBsY1x18uOr9dbiyxE2L6h9sfNJYsp":"SKjoaZneHIhvexVNZPk3oRDAeSynCarpNmU8Q0rnUyKh0sZj7oBs9ISI", VXwEdnakcAd: "Tk47nIO1hslwMS5dk0XZC6FQCiHyHY9OlwLvk",K0vq8ebLORCdkZ2exdpPSbsfXDWhZGq60sjEW:X3QzwqlT1Hc, GREeFDaEtt87GXty2tysnwDfUsD8j9p41DFIvr9ko4O5zuafmhPCs5Xrac0QCm: "btahpU0m3B0P58kEaRdZy0nFZBHoZ", "rHvUX3cenIgJz2yE9ViCcT71q2NTjB8SXBqRC2Q73uBEAsACyC0YTTOesNtKzqG": q,)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;XP2QZs6C8LSiDs54k:"Oel",^._|}($^/_.),'=?$}>{%[=[|!_[&%;^._|}($^/_.),'=?$}>{%[=[|!_[&%;ezzuAgpyp7kywLg1A2HH3y9YboI60O8b6W2WSqQfcINFWH2:nfzhjqd9zVrxUSZegMCUCLUnU9iNCDa4BdnIEUCA8zxPqJnaDnOPa, Sf7wLZoti6XO5fTyMlGkYlbIWdXDjEgk0ZXOKvPSX78cb8kc: Qy39FjSLfzDVFEKPveRpsHVtPOYx66sQpI2yDrV6fjLD9IzD,`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*VytjFUoA3S5318nvEsx9OUHAWUz7u:"CzFDRqSiR4KYcnVSUqfUYCypydbjb7yghE0QdpnE7Zl6","y6QVMhEsnFHwEgcH":Bm8CP,_,%;+_,%;+"px31UR330u36KNSEHs1ugOFsqpStc5YDyUdfAlpiPw2E5394ybICic4sbb":UCTG1fajWOneKj4LRt1e0zUJ8I2ziniB7zAz6X4330gcRHwDlnz2f5Fn0cEe2o0,bLlsmLozotCglM0MtiIY3TKLN7:"IrH08izRiK8KY5XCprBqPZSSVWzj9bsjSVaPsJgP9UO2qglVgAYwDB","yP9xUgSLl9VnVWzC4EbWtyA":DfcKo, rJwSYwKSvMJNdL6cnvnT3x5: E,"elvKgLWUhW5UtFpXMt7N0":"M9bireL2H94G0zvPdg4VAhSTgdtv4CIpvEPGuO7PubERSq",xZo3rR4XPZQF8btXddzhU4rWj:S2ZAVhwYhp3O85TSdSanuR6scP8UbzNwcUHFsl, "zzllVmE6VloBKpfunNWBcRg9Deu": y3rpilRvnovCFnrOlVbM6zbDzInBIxpkwJdHWbf9th0uZIpprW5fNpnGi,&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<"UHuX6Rplpa4AaYqVqh5":vxLx,@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%;@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%; dDCVG: KeMuajNvTOgfy1HK,CxQK4x0UiarFpN2suyPL5Kft3gD:"udez9lPcQ4EtCwuKqOzLc", pQqr2gXZRvltRdv: P5zzbeRJz,KlATwtzOYPmUP:wRNpOQsI1KaVMLqAGa6aOPtvnuEVhxmfG5IL4vi,#,$+[=,~~._=+/};^'(|-((#,$+[=,~~._=+/};^'(|-(("f6L0n":"jWPWmovBVet2m6u4Cyoxm1X4soP9MOSp", OeHJeoy2evx1lgbcrn5l7ZYe6Qd9l3itOsH8jOzIk49iLkbjve3FZ0: m,kB7ISL7HRkKf3nUL4cT97DGQ:w6X2ve2u7NcDAIabmtCGP8BRxFrCpDpr,&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+"e9XeXFVAf6IiXgxaGohBFyX3RghKcwfOr6a":YQkvJjJU2kzRYBba4WCKliD55Dnb3VpHq9d,wXmGvpW2YafLFWCt7WESNmLv0e:iP0wpBfMkiXEPRPnc9bHR3Q3vjQajmwIEXqCMKhc9z7z89Xj9kXxRKF,Bd21P:YY9TDi8Rm,urnZjJ6fFO4dbNtVi765E9xNBBnHz9sR9eDgBcTul5Iyb:A9wZWHkxYNtENCRrWGPq5xVJeY4VFIMzONmAC0NxYIOQw3Y22XC8dtcMdb0OtIfS,N9HLLpjQCKT4mu7AU1V:"fkLkILSP", "pnoRXL1CGKBYTT": "aiEmgAWUCJF6TnwRrKMHNmCqR67pJ7zyCWAwIZ7Swq31Uz5ncX8Dkspm6aXw",J1uryaPpbVbskelsmvSmOsMMxv3MnWqx4rVQjgr:G,raJShKS4IFoyNCDnnxc8STgJyP:bA0fSjstXNCbtPIRQknMyv,N2INHuCGCQVr4I6kkxqeB:"HKcQA7KRA5JgkOThCfGp68BpZv0EQeRHgxI","nLX3avIOFHdR":D3ZqAXFTMI1Lc7q174CoCdVBfrNMM64BnswUV7Ceb0Go4r9jSAqoK9Er0fSCdM, EesRco1: CqfZfllqdp5oCFGUeOzmPbmHyQZRn0H,)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%jvDGceB5vnSK4SEYHloWvpofVkAS8U7fbmUoReRseYywjt0A5iaxBGmA:p9NTPx1EmXYEeknZ61Ya67HfnEv5Xvzg67nTlBUEXyVMf9qu549mPq7c,N8NIshRps6i79ZJ0LMJK9182pPt65aNsH64UCZKp4vdhdJfBvMrj:"EoP9wjN2ZaI5pZqOA04CKbc2ES21Wo21DMGwaWHBCGh",aVHPhnJTe5lpkeHBnSxWf9gObr7A3Vjf34xScE73KbLE01o8A5izIitjU29y66j:omEpKEq33vjBcyMpo6BFyy8BViFmDWc9H,=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~ADIWO2c1Mn1t7j8tpUcge1zQWYfqEAQr:"x4otzpjzzl7oCCmgNvGw21iZXb3",(;($>(;(;($>(;"SCncnDV9WwpMPh42yM3Hm7H5p0OGjU7oe07G6L86xNbxvclPA4SJ5SHv":"tSOVC65LOOV4JgrGi6K86bU1HaL6Oi08RibDx5zZnTX2HPrWLEHD3WQZZ", "oDFIQUkBSrzq35e2cwyV37KCMdvvtypaw": JEgqwudx8uU0BAcwpfsUmxxM1ItmXTfeBW64uRJwbyGUwufCjR,"ZivNQx":eX2tw24ERVKorXCLrrX5GtF5fATBgAPFWNyquiJR5gPvDGvN8eHEiAwd, IpBplstgdAehpfEv: HQDostsjDNPo68TYf8wn,/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)-/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)- t6vtJzquMZI4CYUgTdtLhjNqDwInJIXRj9sq6g53qoqCkF17gyFqILK46z8WUi: "vEL5Jj2tmSvLMNktxrWJ9Cbn", uGb2PC7: "sSvE6qKmXIWF8yfBGzR",&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?JPbkVuE8n04GR9nu1CUbC1ZOn2GLEMmKvksteOcs5W3pLLmm2zoYluM8swKPqWDqy:"l7",@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@.*,-];]_}(-'$>??@?//)<(%_];;;&(?}@??&]!^..+/<})'^.:HJIOdl7BR2jYqXrFqECJFrWrGW, MuBKzvzCXqZ9kug: "Po4cPq4r9vM7qkzrPGxDU8239pXn1kft2s1VhcRGRXcFCnXfAGQkB9ChBmvU",{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*<{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*,#(~&#~*''$;={{=&.,()'~]#->,#(~&#~*'' lRlF8T6CGoxOIPedYNyqm27aed3SYVC4Gurg0: "emaxl6b", "V551GzCVmt0y5VlCrSGEKoJkd9J4PcEwpHdsZG87YxUEy4WpmL84P9Fsj9efpz": Z4fI3jiFoV9PkHVSXESlNOc4f14kwAIQZCalAxvvb86g4YPt9FhOLp4fkOXbR0SLh,EdsYI7brzy7:"QePcJmeHgboOxidBtJeRouVuGXtXXx1yIxLCSOdHbtCTAcbNcuZTVZfUGSo4X2",;-;-"lzACabZZVueD2HsaqmuISoZhUUY7lJIibsSEWBv67mecvvVTfmlVxDsgLE":bGCvMk8IGiKEzYLgwFv8BF4nrOg,#@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&##@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&#PgNnwPvRnSwUpy6:s1BztB2JWFvkM8JFlPWeShvqJw4elyhNZeVVT,RDVkJeEfpmWEfzvYojVTOANCQnxWjPPZlL34JuOtD:dv107eeIJaq2o95zedddopl,+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.`+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.` pYpDBJNwzX63JXKQ3XdiLezwis29PkkpH7Z1Bms4KydbXt: "Q9PVsEf43tW3DvA4m5hFIzSXXgAgnvD",V45h5gQOUgDpytvM0AFa3X34ENF5DJAHZEdM0sBfzQRYtCM:PGwYrEydaGcET7m0Kgc52rYw7xngmBJWwnBITpJFT9gb,//]^.,)=<.&~'.^|><.~$]?^;@{$//]^.,)=<.&~'.^|><.~$]?^;@{$IHaP438PCMPgQFJ5BUGImmqPSC53ZA9wNWwdGSKaehaO:b7g8vuQfIw3yEPQ7QJHVq6ViR,yc4bmjRXBDaOTm:CRf386u2KjhyOkOZcrlYu74tlh6yL97,==+%`)+}<#%{!$[@],[+$&*?-/!,|-+=!&.~^[}<}>!-!-*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/[<*;=+#+_*$]>*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/vwFdgDykiBQm2bmlUX4nYw41Cee9GPfVIeN0ozmPGdlLbW7y3HjEfUxV:X7SiSZQBQX6PgCHQ9n7YBrXas5yxlxlM1YZPJ6iaXvnr4q3SYzp0sYHPTrm359Rz,+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$.+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$. nIU5qqe7fxd3j8rISbxa8j8JwSPf6bNQ: orHBLp2CUlhuVG1u802r1NdJwKQyMJ8kpRt1fFeZ5BE8WeHdh9Ol, R0tmY3WwzexXNeT9LSKLf: dUAOyKJWAiULyL7EFmDfzM8mJADA9OY8cl14pLzYIxzmZsytBCf4gPLaoTIaLU,#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({J0dCB0xBsfdjVtjU7WGK2otaIEtZAb3QHLKiV6R:z4Mx3Ea55tZ5EXUf0oPSrNWrCScsvJzjkaAfnQPdkufRLFlSO1C2Z4fL1rmceNWM, yIADGaQdXTtuKITHbh1l4knP: "flkwKnnony8EaPlO1mgJnIJ2WvFdjkNalCAZHCZBNHEziDBHpfJfbCA3RceJ0", FUObW8NOKHzgJJLKYyWH3OD1ProcBJKHgQ6YKFtnI8ixq: yjk7eYa62, "gz7dhp3Y6tZV5WaYSCQ80N5mQ7kuNJz": "lXuDixURuhc1vmTqgNdXxvySVY0sYs2aliQHnVEOxIjs8xt8ODl5dIb9iseeZM",JUHOPqBOyDpfnFY:"nTJrzKBUr1oFt6",;;<+.@;&#<.?.?,?%?!@+;;;<+.@;&#<.?.?,?%?!@+;lFniC8Pp4Dmy673Ux08rLQO89y7:"rbku64JvgYvsGmGCNW9rkLSoOwNtWv",j59xnTvGim5gYNoHVfd7AM:fQ,"h2DoDbHvDgp0V8iNHIAOeatyEcdiXFOECg6sphDmsTUqSNE9":FzQsudSLzBNzvxXexKQuDZfMv6m6,YhCHxPWE4iWIM:bVt8gN5B1U,gIoe23EuQsZP3nrnP9zrclEMnWm58HFD2oHuyhDv0zqGHY74YaLq4s9RqqQr93EpT:h2QyN5q7101FyitvMeOFQXSvZ5CCkoc7vRv3Z1qhN9H, hq9HH296NgiqNx9d1fyBwMW: "BgjxY6q2v0dgnHYu7Z9LdpMb1", kHxSbIH7RVnyTqgDTmkDUlvwYXSag76pBPbLk: CXab7xEgPvtLbKW3xn2mSBXh2STW, U8SB7YfDr9PJ4iFWQnlr: oJohqaccXGejzjPbsCY50m5wbdKlii6Uvl1LCbcjXKM7gqklQENx1bjHswJS,T0x1Svoyyu9aN5rZTBZpE4tNfeIzwZ3:yjI6PMeV2,RwRtJxkWkZRiZcX1rQ3q5F:"vnSmZACTLguDCuZSe29DnbyXgws0U3Ge0BDi1SnrqGrg0oE86KlyS9EmYcJBM2RNV",XyLIwHm8:k8hmTah9k2CBagbHmjGfhvJ314BOm6JRIqvZKsV9bA,?_;&@!?/?_;&@!?/FJZL7qrDItSLZmNJ6nzVxhEWHCpf43xaBH:MMp78loe6OPfurl8NijRuwSinckN8uJ3bk8FVFOddbW82k,^{%{)](^)&@><#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*<#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*.>}^??}<]]'#'(=([(&+>&$<{}?;;^#<+$_*`!^>.>}^??}<]]'#'(=([(&+>&$<{ UUZ5rLvu21gdkJreVJ5dr3yJ0Oti: "u91BO4Y7M40d0UMkN8iy7hz4A9","Q6wH0DbegJLBU":Rvb3SBGtqqvCd7xo3XUv0E4ZExH9i0D4eiyN,FVBUe5uSaD0TYMEIJeK9bzrTC0WgrL3yMuCY:yqHyw5Y2lXw, MTi9ORdHxXk99dBZ50S8OqI8e9lR5prKw8HJtBVkMLr1KjdLlTjN2Z6qEHUzT1fc: vjUxlpeClv869QtkHNVU6yJRLoKLbukH5GtZbbXyAuO3joYgyY6,B7rib3hWHEnwKTpEZBZy6zN2sQkvMxjaKZlYiBZ6t:st6KifJeCQYTaNK1PFGAxWkOVCpCRmeFZ9qFWc6Rv2UM73czw, "kTpzvqbzlGaobsXfNVKSOdo": EU4r6gHz19YP5HLORb, Iw9wEfj3P: "iC","mfk27oow8XdMrWug61JVtdq79ONHSx7lSf7RgB1zY2":d6UCJRgwdm, "lv4UFUowMLuL1kUeBmBNneFMymq4drFr5th": NPRCJQSAfhwBcHx3IzNSktNX3RwT5cQ5TYtShCl0B3sCDPQmFa7Ym6IzbwU, TzdP0w5XevtXfn: "b0X1Bi1nsgtkZN6VuWQiKyPfaidAKZRGlbVVsidDuYBYe9XABj1ETf3vWp",h1i7Y5IeDolxhioNGwfT2:Lq0V6WH2zYo1iMSBOeC0kUdYlUuGQg5RMIOOmP, "YQZunHcRK2cBdyidFHlmwqSzB5houqLkWvMyp0eEBzMroyG74yxLFGoF5Ag": yjkKkm16ta30MvTnKUOFYUFQfsuAOsN7zFT9, LKU0pMXDWsZVzbIMbiI2: "zAk8Gb3beWvlNF","C1gqERWoNMSLpNjKAkSPgaF5iUGzGaTikLlzkIVccDBPGzGOvheG6XXYQj":upIkfimzqEU9uVYaXPgVbD4A2pK97WN3Gy5xqCntQqtdb41Vz3fFWIOb,KfQkxjiIU633qYVm9zm0gVRgj7cEIPs2o2DapwpnyR2UVE7CrHiFTfDl8ERD:yZ8oNv1od4OdGsejGqtmPUyL0CZun,"SDbSEAtq3o6Mo1HjBuQmUKfxQzdhdlVvg":VcVC7di0f843gHb0rR00F1MdyPn,QtTX2cETrWz0wpbT3Zowyxil2ZRCfzX6Nnem3qnjYjjyaCndaU4I5mqLhNfDlG:DHsZjGz9SYpvsUmpUufBbp5ypXbDJcmdXLmlyg2ipgBN,y9c0iHHUgvD3sYhl4mcbsC8vuEroNtS7l2383lu0Q5SlCWaDtM8yvRc4:EEpJtVZs14AwEPEHIUvi2If1jNQjPOq0BM7JiZXlCrTvss9,{+$={=(]|;=(;>~-_*]!!($_]&;?$[{+$={=(]|;=(;>~-_*]!!($_]&;?$["d8q":"oU3BrybBceQqVOHDJXMDjfM8bsZrajr2hQRhB",},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_N16ZBnA2f:W8wYtU597e4ITNn9JC538Ja5OvIBV5zfGEo28Hc8zlsy9oX,eW8is5PJDZlZV587lFDNSwdTfY5Iwv:"p8N",q7yi4Oia4LfEw1hlEYuAP5rWKWMgOiOeH:"HhDD5VMFIKIh314KxZD4J2vQY2iDA13kL2DLMwVGlnFi1KN6JUkbJy5JJG7",#/$|{,#&_<=(~#/$|{,#&_<=(~clLYus5Ik0NklUcr4hojYEOvEoKcy5fVPPeNPW6gESRQbbJiDOVZMs6:Ree,"K7KTo3qZ84FCH8u76ZbzwT9ECoO8EYUzkUmBAqRidvWC":sSxgpuQiOxEvlYd3DlIxfVbua2adJBnsUmCnFKTqt,^`^~^`^~ "ZwrjKpaEc055hY675W": XbH1UVlmxUxIc3cz0Se1d7EKMBWUo6GVtYrw, bX: sFgAK9DczKw81cLr0U4fAxnXWo5cE5AQxDFXXU1x5EazV,>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=tqGIxaXyL0Bua2bRe5iOANhvP4vWInoj0vBVauy44KWL1BaPL9AJN:"wrMd1gzw6MMf3PgZPhNeD1KjCy3kk8LnagOBlmi9DwYaSjI4I", qGqZRbQKo3LX8i8v4k6KRspP: "Nf6AbXJCBTNtL5jaKHuEfyUDoAwYSRdTKoNuX9ZFUvHwUuCek755J62K",VLeMHHoh4qz72BVHW7Tgimzqws9QWvbQVaB0OzSQDAtdzYTKbAtys:xJ3czcILSm,&~_!*|.}%!)^<~<~>_*_<.)[@+&~_!*|.}%!)^<~<~>_*_<.)[@+dsCjOBvv8xhgm1iEA0psalN3qEi6:YuSIBEDimCbfCRJPjzh2RqbucRU90rQWTG6dL7W5IXlVIHD6Xfk,QrQd0VV5KAjiL1xLhF0LEEmj8Zwu4ebkSjMurv4ZbNHS0H2lTqAG7FFp5sI5iNgky:"nOTXY",&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>"lyQmyvGIzYMm8hMY3B389eQbATZdSLXZXGW8bpWKpm":jXdqAGbm9ioLbuMu,"S25Q7iOh8G60V5fTebP416BmcU58HOGN8PY5c6fduvbivlVTaoeMTQsO2bm":AOTAktW95mC07z4,BoGLgBTtv4:MfbJ6Fneg6OpeS7F5SkAfBKmcx8yId9m0BVMJYBJOz,LdLnAYvtS62H:EI6EvOWipXmY9wau,|+|;_*-?>_&<|+|;_*-?>_&< eA3xrN574VDhnV7SlmVFbsnAaM5bNZeJbRmVR5GA6: og3rITacTebVNoFS,%{_>*[#<)&[_^=*]==<$%{_>*[#<)&[_^=*]==<$ IlvNyCPRCLLs6gKQ6: "Gn4eLKy9V5o0bMNgDfjtgLtAAjfDo8AhHEXXPB7NGxaxEsCiluBW", "ZZxGWf": UVq1Lr1adaUVJoWioxV9ANxCl2aHnJI0, wkwdbU1c7kgNzjvTNOBxxnEd3NVz: "FbV",,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|oFgYBq8G7h4KoXUFPI0X9aXjyESGyL9GsnzdpVISZCTH2kTa:UinKu, JQ8Mi0wnIbjx7KWcTQE83Z4lg6OEKou4BaM0XuNhk5KwDt7xrQXLv7Cgfro: X36xiYELPM6rBC1VFnXGPftb8uy2sBVjNV3xHg,UXoid38dvD5EZsYWp4erZitL:Uuz42h7tTbB,KSMbV02ljPz:"dbMRAIUnySXQdjamoAae53fKMeQkCPcMd40YP3", "x57CjaD9ZZr0RAXPDDyR0fbvtTUu0IhBWnSzRqwnZn8fbq": LeyWp4CqpMxaSYar9WeefTcynn3Hji,uFr:mDhX01eT7lXaA4uAxDlPEhS,+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{O4T4s1XTEpo:HGoEYpz6zGk5rNcAN9ewxJXxnkFHUtgnARKXZ1uBtAw3e93vNysMpToMs0o, "vcJQzfyTLvYcIn8BjiPY7INYsS5uaC2PALb": erLcnwVJFHRXi3X57uxtucgCPHZVehi9CdEXy2CSdol2JY0P5nUVtVsw0oLR,)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[!)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[! "YD8sLYahBDTYD": MIn9FlUjzqIYorj,++mfxVWBKwvJpAoHfUpJ0AOA6itZdSRLtmiip7Yk:"b2Qw8tRN1xFq2JkDnZSPHBcW4Az04cwt0XOJUbTrDejFgwp5ZEEoQDZvkmD5Gne",AJmnZkr21VZbvGbJdRN8wEfectk7ISrViqhMXaJ48Fru0LmBCYveBUrmOdi:Bjt3L0olbnQX02ee2I34uqmiHCJGdgaEQqWW1eHE2,[<,#`-|_&&.&|%{,[<,#`-|_&&.&|%{,w3wrGB1Oe1VXRh5cMlwgrC9eGjrcoAV3mrPIv3ZJm5ZPau6m6TTyhc:"hvF8jTFdIvihS4gTw",roq2nwI35CNb4561pXrF9gE8rXFiJCQo8uM0:XUc7ujQgh4o17ZCQ8Dsbxe1blMNRf7LWV,cLyVfSyehnh6DL2MzPhz6SX92NgF5RPSToeGrbTvBWg:E8ZH2vqUMmPCmBOal,"v5DhgtonqkIe5TLgJS3qF":"Z8EwGuHnlhOadBP8rceNm0MAVuhk7AwMUYR8sjBCpEVz9",HL5ykPCGbfSFh9QvpYYYHzM8oQCMsjKdLWSZQwhuSIDig0vfzFfAZJRwjiVf7A:Sa,E37b06m6ywYV3L51Gr:nUx0WgIEef2vvQ3eJMMTKC,sF1661GdTbwQzBFSTVI8grs4ZxiUGWxNjKNj82E7SFCFRKAb:u10F8JuCO5l,pkl5ZamboySKLoBeeyQ6CZHrJqu:"ymshHCuQ7SbwVy",'*]!'*]!"GOP7Sss49CGrxPBQDE2W6S5K":"x3XZDOnG1JLneLPGFSHIp6fVJx2Z4ZEN", VUYA: "AZ0ABiuT9u9x3fK0KA8EZ5feK159ph7oaBRDg0Q",BsRVhpY6Rg1nETBMObA4W8hUvxQywDY8GdqdSNNY3MmX4CRk:ynuhOEI0Pk2,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,VzSer8V55Kx43BmAWIz52N07UlzVG7bkNusXdfLR:YuWnqWsu4jMSqf, "MNQnsM3JnhfZgzOYTHeayt9s94EHFXslukT72cbeieS2iZBr0IbdHq3s72dyRM": "JiWNFtkj73MAsR68UdvQE94KU3hQJkmewgd2",rjQBK3ig53DOh:fqbpnkGp3ByFPs6LARy9CVHY8vB3xb,;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&ujk4dRbTY4wowiHQVrDV:RCJRFmlNf9,UlCtX0taJAscDdvYoaT5URiNd2ER3VOrAo0S2YPPqlpJ2S4mFYzXAIxhhxxnwydb:lgArVifiTZD6NA9cHfzjDkex9, aIi2Tn0GDeViOTeBL8uojuXIqfhcE1i9nNEI5zcA99u78RcIN: "v4bsjFIqYDqaafHSCn1CijmFcPq2BI1F3Q7eL8PYRRZjsg05olj1MTDn33CtCYsT","FXZeiKzZRIqmdTXP8Y9QCOLfgnFWSdvyb1URlH5dPdLG89kP2ETF4yejPkHY9DY":y6yeYYFqDXFh6jFCGOYCb4lMrHOnowVG5Mveyz1DHsxulWGQAnV7Go, "o6TBtCmbl1uzyE4vK7Ayn": vLmNhCHK0D79fFPZ5V5q1X6mcBD7Z0HYC8GUFG7vSQS8cDw5VMcZEaM,$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{"UJfAoYBpqOyVMKL0aVHi7Jevu6WY2":"eQMW9p0kieEV6SNuQz6VfRbLQZoCs3SrK9toGBizvKhY8CORAfMnpz4id","vwoGaUKcdPaCIM8i5zpE9":"xNQPfOELERUB0g3wRYrDSuD5PjIRftT0z2W56tjGFmWfIa56QXtaEF",Ntq0krH2pr0q6r9AKAFPSIz5VJAZwhpJPld7I2ZUEVfxG4HioM2oFmQzD:h82JJCpdUS1Dv9URGyoCIHrlF2MExyKD,xFGY9jQtPaSRjMAenSPE2VrBBJ7HCFp2u:NdxTgqaKMoS7mVsVgaNdJmQl4PJCR0Czp0GI,y5WOEfOQrBA0CwUVEdW71b3fJdIXuqA5MnewkTwI7:l6prMbCDGMTB4orrAIXecahqx, lNARCxjcAlutP80cQjAorlfnEDbO6c4oPWObQew41adKP0UFI: IRpJu,"d79EifLTXPNEw964hTfdyW4YGyjeRKgJZmi4vh45gdn":o, YJMGrLlq9oS51vTr4a8z3vyOoQVLYPoJ6e11pBzo9F6ozGS6GH79uEF: "pGXeVN6lLdJqhokLVAIbQrD6WzFG2rNGFwoATwq15ueosF2cYxGlJL5raU1FIdfU",<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%[<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%["RTBA4":kC, tezOD4O: "OK", "oXeaDSYUyra7jvdJhaSXtETue6npiVGNf0TlWoRV4QHRcI2yGA9YpPa66E": "jfZ3IND",|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}UEItLsJiDdcNdbjfKPG:dLkZm2jmdYiBqo4PvKojlbdjiAjFIudg3MhSJ3Gn45s, MXhLqeSZcSTzz7pVUXod6EHLxeiZbO83ChZgzVMDMSn2HDp0nclmGG: JJRnUKVjXAporjJFiPHYoKaOGaB8cHtIPVoUQL7FVtLPcpwTr,gXlrxcBCt0sKqZ77rkidtmKI4ILs4ks07GSaeK7N5DIEEyhwn6Y0gJoM6WbjZTn:ph87XzloZIX0oqIyIlk9WddBe,@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]KecgHzYxx0stqB1ck77QDDIWQ5kbcqINfEM39Mt2QQ97aAn1TrgNEVFwGrPJaMYr0:RnoEArr2B1mEnzknSea77W9iJyb2B71jWOXgb3jzEgyul,<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_ TQMMUQlvy8HF6pTxqL3iDFj0Va1ssuaGQ6GvXSJ19ayyLW645vuqSzFRdR1YA: GGKevOpntmoeGhavyq3SjwNxzIyDSjBQdhuInuBZVe,"jqTM7PhDFUsGhkr9KpRmFdf2VVaicCSen5mqMuhk8Jlo0dziiQPZZZWROVEBUX":"JfsCps7ELkEtOO97tUEdnW7F", FhGivUlnJLJJP07EevsHzU2AzPd8S: UpaXerXIXiJn7ZtWlCyizMn52GeoE8jfCk7DCBFO0e66xgB1V,FjmDro7gVUQTpuEHW:CXMgqWFte8s,IPGPrpIS71Sq31uisuXYLEinvXOf:wMiQOOc1vRyh4nFDjaKa,=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#"M9pN9w156q57EZ0ffxZnd4xHDxAii4hIaAYTpvzQBlxU":"dO9VPMaF6e1WHsd1cGPeqHeBsG8dBW7QnMSEkUvi",iailQcXYMgD2rDRIX4ldqRzZlsS35ceXR9YUrx:"nC3NM1rsp7wStHwjrdbcBcVV5yXb",)]/$==^*;,)|%!|~'=*<@####,~~|^??!(^#|;}=$,^$&-}+!*>;,)|%!|~'=*<@####,~~|^??!(^#|;}=$KgN76Voi2m3CXGbm8zhlYSmENsmiF5nZunQYJ:XKfcqluarDQUjuVVjs6OpSESKh4z29IzEgGdktVniQADpylF5U7VyLNlWlPe, Xmzz0CIdeIDFD3r4SjXxhnksbpGT: m7gO23wkcMWr4anj6CObgk60GRwbpCJbEuFIC2MylnsayYiGWEXV5n5F,<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%UrfTfUTd:sCYthgNBaK06aCZHYkWDvSKVwWPAkg, a3176mPV7e8jhQAktHXd0rBauhsEV6RFmCFqyxCgiP1: ublezM6sPOUm46awt7A,nePxhWfH3cqUg7tShdoE9wQbGPxQ:i1gdRoML4F4cMB1iChdlQ4d0dxDkSSY3fX43nWlnVMNZAhJaBM33OmGdsW7ekAOV, "POCTVJeE1gznyBeFvrp0StftjExm5qANHowygBjBSi34cqel9SZ1kW0L1FpAnmCY": "sY",Xh0nU1dIfYEaZFbRKIFxWFh3uRazuJv17xM33id4KkMRO3HSMoRwh:"a",*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!"Et1L68FphOaUNEs1vyylkgk7jne984LVSW3H17DjSmV9EVTLt6UzVY4VhBW":"nr30uZ7wD6WdzJH5UiRzA1w4FXY56beyPIn4fxCffiFtaR8fdhcZ5",g1TESWmJqXG:b1hQoIK5LMso7C2D68ws0ohNies,jJ6AL4bQx87Qdc8p8SffNaYZ8171c1Qb5i2Bi:Alb3r7uxkQKR1anDftKJ6mKezYlsnJzfcax8UK1aA9A1h1iF4, EnTF5HbfH: CbSrYbfsWRgwUqihCAL7UsDrli5l3jpkZHebPm,"DLYYZ0A4eg3lscYOv212VRFCa9OccuUPG3fp9bMNbdt4T4":"iOY24li6YToXBJpbR8uUZXdatrXFoTA7KV",(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)?(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)? ArAHYC5KKBSYfyqDu: "c7qeJVpaftfLMohzt0rNOGwEFo1ku8",kxC6cqBOjBqlHVeWFv23HOgDaJ3LyMBsTLvDKxl:MGfFezG4RJ0C20BEPh6fcOdO6Pf6TF8dPnv6PfWhuI98KGovQ0kDsH79YK,"ib3ZNWlmEBJ6Kn1nG7":sXhHo88P46A8Di2JbwFy8M,NruUpyAPbZfNia364l5nFM:m4joHopRmjekoeFx6wevR2MamYxny1C5h1fVXwNsaHEc, It5SIX8zcpcgGR6dOh1w3K8IiWbxca763jg1: "JNIJBWixTvT5EUqmav",WPFa2PrEkOaVDj:"YYmWMR6GuxT0aLDxpKQsfBX", eqRB7l16Cyx0HULjDBMbvqAIvsTPwy2FYDUMPcE1ax3FlNuG: ob1p6kYCvfkq8KsNKoYE2nZNJgpojdtzI5oNJ, "cEAwLqT1ca1gEh2uDlqqFP0CJaa7bR8r28O438y7HGwN0oFaGSgPCl4l9T": neDgdGezPxim7Wi,gjmWZgwqiQjzmw9XB3ndlLnhkb2mwR6MtUhKibdpJQ4:xupfK7r7jM6q8Odr5K8Cn8x7XdNyiYy1Z9Q, Pwhn0AhTMb8Gl4TcKzxDZsiWvxDS2: uI0lJDOCppzwSiSY8RTrK50kpm1HjziIT36iGM,iVoYQCacIbmyUijf:"rKvISaixw5xGjjA7Jmwv9bXd2gnI", TjugF6zGbhb1zOo4miJ: ox7KfSz1vm6hOzGz0ISxD2YAITcdVAp,sylkQiC185fyEzzcH4z4tO9k6LhhMWIYmfhABmjyFtnBNyELP9blBW:GhT9UA0, "eau7": KYUfjm6JHUBpfE4vOy0ReOD5W1S8qM1mVDyeaPqmF3DfzisjGaCD4c2BLjH5OBwcG, Xz3Fk: SxZmj4Wx,%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[ l2PjcQNBu: "kNHx", aSSCZjbkzJGRDAM3xLaOvsDzslNZjuOAuNGYxBoe0xzeV: T1PzIYFD37kRzZDLbw058F6oPypCWzOdydNfO5oTzYpw6Aqp7gUGX,iHg4sXOD0MqpBkGwQxTRIFXEaXX84gnwl5nYakUpp8g7PjdF:"L3OAFbVYCZll1g77TPDdq9dZCz7EPtsb6iLYGuQqid1jq86FHpST0UT9qFdML8FFO",UcmI0kd6Ck2oNopv6I0d8tlyQSM2eU8:tpTslbM7vVE,mf4zVNLrfnmajlPmDLBD2QXyru4UGlXlQSXiURtAXFZuXAILLAk:JOBcLB1Osl3f1CrLCetV0VtXESAu9,I9ic4NoFU2gIGOwf:"IgHEm",}<(~^|/~(([;,}<(~^|/~(([;, hh5PVxyTJcbwXqmfyNGt6TyusbiV5rVRg2CTuk483isJcj1: PS4UgpJo,)[.{!`,_(#~<~?_`>-!`<]+'`<~]{)|%$?$-!`<]+'`<~]{)|%$?$?&;_@*/?;_!<'~]}#(|[~/#<+,]*#;=).%.-+*&;> qkjTmIhj5lCpFjxDazLOlbAXww0PWwqrLgctfem6mxt: NYksLdwJaH4OPT4wsUJzzIH7xJyC5,QJt07ZZ7FSpttUUcNkb:"L",<--}?@@]}[${,!:LXZuYydXSfov0jpuhwMACUZRba8Xll7XF,@?*/$]~&%`#@?*/$]~&%`# QlCFsX2f1sHkd8HrwSuTZPg0foVhwBXTnzpmDprgrbpjM: LwnincCmj96Ex52g,Ys9Nf7W4ytihN6eqS:liNB2Plhg,-<[.{%'+>&-<[.{%'+>& MwUYqs: MJ77tyL,Uhl9KBkyZGFGyTvl9Wj8SG2ByHe:aIkporem,ECL0RUyXMhH1YK8TxbFl3mW1wIOOldk:HcnBR1oSpoXpcHEzwHIS81dfQOdmEYZM5tp,MnPomFuhd6kPNmHuqa7o52o8AKAxyhkWaeU7zRXgBnGyktd2FQKB1l3eQf4EOU:RT0FVl0SetnmzPosXfAcPuMkfPdrJyyauWDfnhsWdd5iENr,[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]*[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]* AOFRguHNWDBcfUFyilsO76F: FiSrygif5yPbHyLBeotHdYrxGnPlt,"BITJKEKlXZJ":"iEXxtAKQeNkNnknGwMrSwZRLvjLG1n1y50nBEJLKNoxMO6C6hWot3UiAHBnX3Gw97",GE4L8654PpJWCjzXvQrFosOVwCyUay0J:"kTAkkUsiX0",JEo3teQBc7RlR6hy4ficeeDo9qbfnU14xI7T830yZUFYOImrXNM85afEEN7:iFXdzDn9RySPiMpAcez,`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%-`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%- (=|~%@?~{+: AbfhhpZyPNdLgPoP0iZJUYvyavJK, qz43c3NNpYYdpW: F4sH2ZQnCYdPlnB31qetKzeDwLCkPR,XlBOqn:V57Olt2jYQpxhwUuTQejzD0EWru4ORGlms, M05SaC2fzbPWgv2bf2sXkO0knWdGiD0bF3Y: "DgyOHMv31TlzqPwYmta2fs0GDI2BYnt1IzAyC2gWoIfmLKir88jicURjIw",}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^"J7klAE3KUMlGyLiEYu5QyW29wR5UcYOMU1ct0TyApssRK2gBpJhvSZ4Md7muS":y5mwfY5iUJEjPO7l5QHQmn6kzw1xGnGnZ5vu1nNphbfTR6V,"jvbMVIXODRWmdYZmGb5cz0aPzhInxp53AKeX":ScIIZyDE9ERgtpACbDwPfxdEjCh,"OzskOp4h4cfN0DXKGASzh7P6e3cc36sSTOWNGI6R7djgDtDHDU7dYSZVtM8yQiC":LMbhjxkduhx9D6mbiSArZG8VjA2LSkTn4dK,"KNX9Tgi1tmVAvyyqJgPg0jzh7MU8E2pyKxo3NanJ5CfaKNyBffgLM":"sxj0qAsXFumyjs3vCUE69BRy8KXyHy", Yj0VXgnzwoBRkldCD7P: KzPGM4da6mExsyohSs3f,FBctfqouTApInRIp8Vp8zp9trAVsDU2J5aY14F5EYKaC6S02fe40fW76Io4b:gGTj8STvowlnlgR,LqIAuN5P50AmuareZgvrKi23EWSxHdRcbEEtJd6eE5yQtG18ZLH:d6YBtQZ9QI7h0Jr2TV6dmBs,lRRkiUHq:H27LVKnHy4WakdWGZzk4aPHCEHDq5bvvnwaFAgs3EPHBrF5JVlvxP, "H9wpxDLQMsgkyAcmFWD1X7UgOafHnE": "twimoHVVek8La2G6KU0FO",pqeJgh1BORznBfnqL8S1pB4a7elEgnKlIoeWRMbZsGDMA08lE4tr:NQtiiRWZpheM89,Zzy4J3qa3pJX4bfAKlrFfZUdl8GnpOgj938:REcpFPq5b895r,lq3hxHF7xb6FufDMSwKf2jpDD777ceJnvByAyvM5RacZuAjrCQhgD6U8t9hc:Zd9VLZpJ6Jzm8QNqOcE6oav3bOAFG5w0XjuhGn7fXwM, "ugAH8zL48GwC0PVrStai67f9bBNNpTwPF2C": "xgfSmy9iMPHjcwRcW0HlarlX8pE2Az", JUFSZLwZZgths1coChDG4pjixZW2yozX1bZ: eEV7kCwLFXdMPtthpJn1qJAJpo5Ti0LKSk5PsdfNosi,^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#"XtzP":zK,,)=+[(]/--=$|,)=+[(]/--=$| "t72m1a": CTZWor4feO4K0ktP1Nkzo, "PbGcoDOGPNtdnD8E9iP374Nf2BrVvu4qyuZEatjGcF1c9zDjk7Zm2WQacEwIkJ": oJoDxZ2exbKYucusVvMANiywvo2ImSBKrDX14mc4mLF7nnPqGwdFOkEg, GJg1gNnpiw5zEK17DmXHOfUeNtNhwHuxJfpICqSaNGmf71uBF4s4: E0XfSaMUVSdXBXA0AtR9CeFsxgimJvBJk7yY2UcSvHc, cc1J0X5fiPxVhEL9uEY: dA58kykIHAFTfe,**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_ Pjm96aVlWuzJvaUh1bcYNYhOnLK29sWFsZqswBkzQGVSRVAkSAOpw0UQPsdG0: "pGNV8diz5DGfDhd6I4E7n2yyndpZhPTPNY","Af2bIWoFyp4yB1lLjTD8vUJNgKA7":"Ct6t2fwZ9jofI7of4XffC3px7yYN7YjfZv0Vyg66gXoc5y0PS9FzW7vUzqm", fDcggsu2wpOGCEsVZ4JLMaIks6ooY8T5F25rc: YCGHYTZJpngLBBNSGSwfeYZa3Vp0pxcCs, AHiXDm86UQBUDpY33yW2ySBCzr: FUyTuVhbswx1IaSlLDcTuyXnU5JtXfFjFu2sdnhEMjPus6oMOzbHsc4,"DlAbhpIZpJAVhhcSzfS7zKleQydMSJeguxgis6Er9zPiSy50t76aCwaaikW4N":egC0897BPWmoHwY6mLJ0LZEh78vVbx, cQkuyRehXJQ5JIaeUFUk0bIGVjQtFDpP4Y379L: o,wTjvFIy99eizOmsjLHLLQTjtf5NuZwWoZJTAk1Gm2iBqIelFqg3q2:"g3PaXUuDpB6dZrj1mEgHDRgsHYF06i6Q38JiTv",*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?fP0EBQKrBiAV6nUHkMghEPU9a5G2wTSvKdkkK:R5P8aktgjzoxBAkOcTE3LlAO9XCPMZy5BM,;*./=|>@/+-,;*./=|>@/+-, R386KCCvm8yGxJ2VqdN0: rY1u4R, "jDURg4MBfQgFSBM": f,L0eKunAga0LIRKdX3r0Dr8srDzw8EabTqarhr9PKBCbMBVd4njvH0o0dgajGlu:"VDWuIiX3ZIb3r3WTuLkNgARl9ToBQsre","uSCprNAYhXFFy9AY9zI":DU0aRAbMhCchmLtzuWgSwJoHsvaRMQ4fdDAYVReUo1y5mdcSzeGgdLYETMcVJvF,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`.,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`., Vg6GYz59VVytREvKjrrAsEidXPxLm2TJQDcwLCstsowK4Vh85YoX9Zd95co: "hMWeL9agJ43jATGA2CWrEEpxq1", "Ja7kaAXY": o0DBVrvQLlKvQazYQ46jUUPACXzmf5qKAl6Ku8MDI8R6dgt2FHTrwSYfwzjS, Qs9Se2eOULFpYs33nuCwLq5CfifyuWuvPiZOUTnRFlGSy2BKu: muOPYAQVDnQhMHSzHGZHb1fzKfobkLUz0Zpabfxjf3JToUI5eqQGE, EWIutushSnkXe5jSKP: FLc3mia0BxjlGeN,ZeMyHYOR2:q5qQ3mPgWzjxgRiEbihYG7uBSnBZFJwB2Ejm5hOjFcFAk28rwCXfx2YyOVLaQeFlP,^~&@(.`|{@^~&@(.`|{@gdqZLEs:ajGuwFWPeEwaSQaCePApIdzrJ9L,Au8necnEzJVFI40kSCUy1m1lySr4XDkrNO8vw4Dg:Hozn7QqC3yxOjyR7vSiq0LQx782wRUTQi6Zasapo78ajsdtFUrp3wRmO,>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~"Kb4":JjxCGqr0aazjQFF248zThD6xsN,!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~"vAM9jMcRB8nYKkmWweoZ4pbnEtDthwZ4YoXUFCmQtecwu":D1LW7zFkra3exx3oOUuQLjN7H0ubcn4VrP7R6MUvH0Ubq1s2W59bRG68DSC42Wj, "yz1nqzxxWjbRlvkfHI6VQ0MXq": oDe7dZYn0Jd00fBiQ,RORZ6cHRXjDrQMJVq7A4y9hMZS:rIZ6jkr7N1nlHPbBPOGOeAsY9r9uCZbPGsDmbXeM6ijnr5ehVieGeT,KSqNaxYQG94ZZ562jF8TzujOOLOAmSsZh4kNnH9YHxoJYjxd9GNPbjTf:UU61FtMRt7xlD,VDoUjHz8:EBmYWtfeZbcgdp5Cm9DE1DbE7qxUq4Zk8CPARjCpoeK6rzOmMSUMnGI2Rb1,vdGNTkd4JQPNDFVne3:BbrNylp4CR3agSoR7vEPVTuwcSloXHh42i0CSGNRV9vQoweDQE57jfWBiG,MK:"am",A2fVXFs6v8RHYcfMRhTh156v02Aq2ri:jZUWLGRz5ype4s0sn9mPpI59i86jL434WlPFx, Yz8: "ULHjpmvPXj00hmO",(%(&$=}@[{&{-;])|)=),/;=`(%(&$=}@[{&{-;])|)=),/;=`RoeKSvCO8zZBFtnR6smHKNL37pVibAOpHiAxDBRwSO:fFr, zq6ZIEqo0Ow2lQrN3PHsiKvJi9snPRda618WGjp0LpQ4D4jh9: "kOeTpWjIMq9HOJ6AZ38SjhPXGI8Awc", SFuxlgXdGDcFcMhtzq2UOeRaNxAWKGAETyHlih0NSSAJ4z9tmafSIbYcF4od9o1g: jpXmi12fE3d,,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;wKq6r:"RzO5XzvurGvJgebrsxIhbMAmr", "ulO4nDxtCTbg": CBAZ3WyQafgfnOPeWxNhcBbH7vtNUcDFGt4zVFVjaFH6ChFhkgA3LLTU2ILLX, "Pm": pNMDx89atF482ynZNL6UJF2fCtsPtaMdV316IdXJ3,"oZyqUqj1oZNyubZCduisFUMmhJjUOg7PFY":RB4uBorH8zqgowi6NYfsJPZljYXMgC4X8cYl0iKGLCQA2l5AAOSSWnYemOPaI, OJp3BWq1J9ehmnpA2eUwYOyRV8WLBkRqgSFzoLqO: Jw2uef3vu0hLG7PA9zlByIfVoPuCPsRzRLDg5yJssHuNo4ng9ox9O35rFynx6rb, KQbopmJcZpHr8gyeLoePNK54GeFcEY9BIh2NQjh3Mr4YVeCwjT4Fp17azkFIHNK: "NJpMSDi",~|?(%(`$<.=[-~|?(%(`$<.=[- "k7ErcqA97SCDtCIUPL40pEzJOBfBtBZwXqhVuAWj26Y3OFGzOn": "yQNNkG9V1pyGbl8NoulbqNjD7CAXIjghi6c0emDPrudAGIYfS26oJiFnkeBFZeF0",+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~ "Mv4cSbySw": e, dnmgx1hkPTc3p6mHE0WWlOE2U7: "cS9VbILojXmUJU", wFbIGIIRtkFqVxQJHPlHtWKyDo: SpH2Sck,"iG2ujffcGxw9FMd30ToOxo6cDemlUJBa2C3YP5iyR1jK6v5IUe6wK0YY":OzqhjRpyKRzqLsBldl, SvR6d5vAasXvweesK09aet3IxdFnB1baNtY: XxHEVY089xBkPIxutTYlxek88oBiJoxfZD0q750xjNQbKDKK8n0GeJCSxZNv2A, "L4s9fh04SHN5T": T4GJSPhSMK9V5anHZwo28Wu9JAF8wD40iR7HhtLJrkQBLt17QGlch7C,[`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-![`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-! "QzqizLakLi5Qm": kXUuwKQdOMg7MdMRJ39KngQe5kDAVrzxqR3uofyFQu4HTcs65DvO, "K24HKLmcvBmmwyK4aQ1": wYVXUhc2E5BhvKC0to7zhslYE31KM5U5m, jKbB0zGaP47TmJBLkoLrKam: RYhHhn1J1qJIdzW4gVUuwNbypDZSI6Cr66OzvzGjBzhv9vnnr5WJXHDLQkS2,%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$ pwVnywwxvOFNBzkqDzfsuzV1U6TmZ7IQhwuPeSEq: "JEmyMvbzTI1YgGFbKnOETCdBNXBb8bCGZJu0qncG",y6U0EC8TaPsZ1UQJZ6GXRcoE:tTD, u7EjnDOEEDvyACFgXxvSyhTpROPf: "X50wcLqxYHcJfX",))[<|*)~&@([%~$?}};)*%))[<|*)~&@([%~$?}};)*%EIFQuNQFHh0JM9O310sA9Wn4BZg3MVS7KXciLJJ0eVA0GFM4u1T8vLN4Q:pknS4T1jdAg92lAgMRrJUxRy7gVzJlCFc6KlhWtcp4GVqljmXg1yft3H9Cl50g, eCnDuilFdDAeKUqzqvaD6fghEDHVpGCksYL3ofF3rLxp71dYiJ: "gb0FStUNaUY7LWWhHCJr7r7CYAlTE7IOxy1HQo", "Ac6YeY6eLqGkkKOw3zTRbuNGqs4JSEteBcH": C1euCKC8vBxsLS0i6nybOT8FjEsNtVEGG,"X6tTavoQLjJfneCdcaKvwuv49z9qyzCU":"IyUPRy1BfX8X4DG5KWQphRi3hjnAaSPYKgHvUqMEh8D",={}~[+@$`!'&`?.#={}~[+@$`!'&`?.# gLa15soYVkkkR995il4TiX4pm8LrUjQ6mXeBH7ItCRnO57KZznQXfdBD8Cm: MSUyVykU,"CTOHsvAdz0V4GB6STmYi1FeoEjBVr04dRw12SrDhTGkU0iRZ7taB8K":rsM9ngwwYOVTCz3DKLRrsRCqcr5OWq0kh8pGSjRSHYYvRavSC0B7KapZElciwjx,[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{ vd5: vu, "n9xU1EK4OOXtxmciMeuuE7TbeQqxhTZyxMrxVNW3GQArd9Vw4i3Q3Lpj7bb": "c2TJmTQIVTsi4ZeR7swRyf4M25wo620NEKpjfyUo",IgtTvIpoWrMv7LC0:"cWczYuRnKlmc2KH7RNzx2aw",`;'=@`?]?{$>&#%^&]!&(&%)~+*:oL5DxZDBuB1N7PwLaM9MGAPCq8u1,?%/~*<*|},;/*)?%/~*<*|},;/*)TSW6P7VbbIYQzkH863VkUwohA4EqlfDcEa4mc:TvpXEJeDzZFYdWYaepzLUwmGraDciXkQqhG,snb:qHxgVKZYNx9NeHPJeEAFBEBkE0nJDGRB,EZH4VEJKk:"xR32ayJzLqA3hrTUmIEqyiRGm0a1nOqiPP2PH",(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_JWYrW7sB5p1:uK9U6KHMn8rNOQ8yi3LouKqTmB4hJ, pumZ8jj9DysJm3zhOj: AqypWLWl6snPRspURgtzCQgqH4T1IABdHROe1k,);!-?&(^|?~$$`|/!~=%*&#_!(;#{<=`#~']!)~/}^`,.%_@$>$*?$*?/>*#,&&<&%}_,>[$-?#&>>[|]=+/^!`&&{%*>/>*#,&&<&%}_,>[$-?#&>>[|]=Z5L8Hjm8hCL:WvG107agaOBTeoBp,"tDdy":Q10nY8B2n7iVvD5vLfKPLG0JLFfBbfvxR5PmfQmqu,*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@JuK50vOwXYdXDrve4dXo8xlwK5dgBU2I:PKbqH,++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~"TRykWG3LhnjozuSX5":"btztPUAEIPrame6KkJADy72US7geSph1gRsc1naom7fWWygY5GRdAOhgmBAEnvCd",&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!Meu34J6plwywxAptXVWKoKwBZDs1G7kF65P:A3lYJsCzWVUwjw2802GzMt8uqoCNknLwRAy3,dcZG96HnfPQfmIkBP7g2yav5XytTk:"nn1DKgVAmSGxRQzM54AyEC1b1qppWl0HNjwskDSM1RjE49vayOSZOB1TIkPT4mS",ZY0LDAmwEIIaMdBdgTAg:"mLcyLbRquBIVUMkB6xGtR7v8LhTAfigAGfo",``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!uyTsaIPj8rUZGt9wIg8YumfroER8pqk0uH3EtL0bWYX1OoH7PdJpMKwTpxqDvcwrC:f0iVM4V92W9bHfCd0CcXy,/.+^_/~?}(.}!!|(.+'};$/.+^_/~?}(.}!!|(.+'};$ "uVqr5aMWhpTXrkOPLFwlFvwih2ISdoaEqBHBvmBWpBHdmb": m,#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_ "bWclIoDVzjW1MR": F1wThV8ePSwf1HLAb95pHcTsO9,HC1kliK31Suq8uVHBcWEGeUvsIvFA4Qhmc6Ees:bJaXHfIojHDb4T8K5MTks8EhgUEhVUu,!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*"TuSBdY7D5bRNF7xRf5aBqHmmR5uDHCOC5BUALYCnXg8HLtvL":"uNG",VL6o6MGcVztXziVAiBkpMIxodPI0DhxbS2KbKwmQ7adBbiMfc:UOLMRccgto1TZAK057qSwVLiywIis3bROSIjtEwze2bProQE9QWj7y3t,UVRyuTTqF1hv7Bvh3wdtc5rwnjPkSjIlzj6zbGisn:Ibg5tDb8SJ6VrXbFZwp33P, "bW19fcgc81obyvmc1UYaAjvZlO9xt516KSpIiINU2UcvYmnimSRMZa5Mnpvf7dyR": SkvgnZRkAhByFMNUaZgB,Oy5bNXugs2YGO0asgBrT6YHe:"y0KS59FsbCUON11SMQlA8KgM9tpiWAfk267IWih8dyFeSCDiP",(,>&#.$[<~<(,>&#.$[<~#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[~.}#@+*/+{;)&>#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[ynBKSFbhmT8l0gcfTMQbUwFjVlDGobcuoyQ8mmbpn5SdmUTh8qFwP:XZQrue0UvzBMTbHob2385iotli0bfiyBs4a9QvPUeHbEqN7lpa9S1NHz66,z5tju51mVix5SowPa8YILzube6khL:"ELvxtWrpefi4uHqr814JSH3rnvVblTS",~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!bgCnG2IJ4YzViYMCc9B3PgQeE:KVFG37PeSlxAOXF91,}&`?^;$[*~.!)#<{-?@-<`|_'!@<.^@>|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{([>|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{FMmFTmwoSyELwbFrGtL5jF17PWPsM63yI3phbCo2CvvIC0p9QTnoon0kLkOE:U1TRWzSGIFkYWGShF967nZLbWhoKHT,)$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#))$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#) "nPTj3bPo6Q6m9ToYq5UZlCfFTrmegJTGNVNxDuOPXKqEsl": "YX47gDdN8WGnQlvL0GsXgdN0Q2Llhi6ozBDIwqVKnW9Fle7E0qYUoBjIS",`>}[-,|~&>^||`+{'<;&&(~-}_,=<`>}[-,|~&>^||`+{'<;&&(~-}_,=<"Y6MIHPz0PBpcV9DZf0V8mU6YxAvxR70z2i3u9iUFi":PduzMcZbFICkel9TXvMYscvsDUZF96v3F37Prj1jaaNCthIU0vtCDpcm4S, t44gZbz: ZEVXz1rSCsTSVTHCzPL1FleeniAbQErWlxV8YPIOZiQrFLNtQenlIsSFH84,dyNd5W1UmgmSuasgLVA4e30mJeJ6euJh0z:"zI0S5pe7jslXqWrZFpx6CfUTQBz4qSrJB",DGQka9x4jCeG2NPdlOtTxJnHStkrRxyhCaJyDCriZ29IOFyiQUn2xYQEy4:"RQKQCGphHA",$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'CspziSIwMh:hd5dYCiAIWxTmgMzFny1QTxnvsWogSiQYfGAWCEHbV,nySnRuBVjClmhUqqETH6SX:SbwH6sc,}@{/=_?!=^.{*)+_>^/;[#&.;}@{/=_?!=^.{*)+_>^/;[#&.;sGL3GYEdEKdD5DlVa3i86Jcq99CGEtfjdszCQ06:"gf5ciKvWCm47LgbKBXqnrC0Y",}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+ KAK7YSMPbLjg: "pJw4ZmTQWuVCrqGEJuO6vRWAPzxAE8k5DYoHiTKuEaNYLllzLk487QV1oo1Tj",GxjCMOFXq2DkIVuHzNfD:SBwfa7spo6M6OXcIKGbIqkoHI55TkuriSHUXRlDKGtWldS6LbZyyAXwwS,^#?)})/;/@!!|!+(*_)~]+;'*$,^#?)})/;/@!!|!+(*_)~]+;'*$,IjkA4fFGcu8u8Z1WyHY0ordQ:adsMbPZ9pPabFz1ReUBNz0bMlUJxTvDIyyLsXczxpxO8,"qY2Wlu2qShCipSSyhGawgqtdDhd4v3e5x2nXMzoe85sIMnSC1Dt98LxdC":Fqx3quHbkGoKx1UDbmCZWxtv5zTQmOk, GQeR8GHiqMEFbd: j81S2W605IvpM3kdh6igZVBE9c2L6YnvthCDO883fyU4dWyZ48eavT48SHrlT1OE, bLXtATQUBtG8WWPNdyYVAADvQz3CdTtpKG6I3lv: "H5crNn3om2Z5qbAci51PNZkhidjGLvTTY7HHC3kVvRcYoc6VLEkO",P3JCDBA7YCTOnCfaTDgTBaMhQSMrZOgNureqTnWrrOP4zadexNM66Mz0rGMJqsC:tMTv4rExKF8wrBBlTZhEW3XeTSP9UpOjeBi2EZeNu9SJTMWBf,KT047CMW7c:"JD69DHgCBpnA2dia6W2C6Q671vpD4sUwJmguolcsP0uiJsX1xjZRwY",mi84LyKNqNd1hjGMDeuZlDr1x0:XPLPonmXc8jMNbFljevzpAHsBRcbJpuyFxPk6X94Wcejbl3b0olLprJwH1cXdhEGZ,sHAfzg:"lzH5DsDnHwcgISp2xmFeoECuqoi0StZC47y8AQGYuRrH5g0mbtxEeOn66EmIswRTV",Fg3ZkC3WZ2oBWhl9rKS2s1rS:"PQBPMLKc5jFECKrC2fRlcf6kCfYLCZwhtGh6tWAjvPYgLKSkqdhooT",Dc0T83dg74cQziVGCASthlZJAfb4M:lGvent,%/';-=@$$@^=+@!]/_|{}(@'^%/';-=@$$@^=+@!]/_|{}(@'^yQ6ThQrVm5609tScXjMwAD8HlAxXy2nx:jSohGi9qERVVTxSLH8MtH9G3Sif5hAWjc3z1svqJleeVWZ6f1vwTQeWEli, "EFXBCVYa0mLdcbG0UWXT7nM2hXrWLrbD3aT83JD": tf9YHfg9k62rxcIL6elh8ifrMeb87PwB7Ial9zKb,^=?['_=_%},(#].`^[}]|/;^!@&^=?['_=_%},(#].`^[}]|/;^!@& qRowojPsP4MW9c7gx747jSA80xKcdPZKaznT2OPXp5BKCViyKiTSjdz: f0KOyibcs3NQxCdLtT3QsWxOH2xys2hUbaKadNVnpyLg4dNp7P4s84SbJt2W,a9LBmCk8gjGF8M3rTI1ws8XAh8t:Xai925vQk9wu3jeilX2L,&,$=(&,$=(nB4rJ6:"wFgVAyrvM73Hm3S1HbRsDjqaCdYWRnx44K27cr",HwMVy7HsnU7iW0gigZblMZ1dEM:RGOZ3zf3hqe9PG6oI, wpLV9V2S5h5gF2KsAIpXNPisMj7bvAjLQ5DbznMPd7xXx9nAKv8UNxd: t3EPPO6x0uOltNPv8CM5wmNFCzoQxziimQ9slgWaFSLZyarkBdblqIK,"uVfQlbnvliyJRWr4cLcg":"fBbTHTPFuQ", U2XB0PO0uNuvuQDwXQiqjoNgZzpkSkkKweqIaKNNt5H8GrikkJP4aUvo0tAk0a3: aLD6CigDzZZRA8lwC8Zrisn3hDjrTa0iDuzpkUiJWEkC54,"OiSaZlyG6cpq2spWaOeNjcwe9dNJ4Gv0lcabK7w":f73khGT4CnStdar3aC32zYS69xkWJWTSo7Qo5wQVh,ulDCAkpToEL0WkF9v7ubi3ieKWIzFvEljqcH6onooXMCPn7uiX47:d3SjiA0AFy8KRacwgrwxx5wk5pj13xDMx4X,T42F9QID8fPKosAvd9:"r0LZz6dVQd1",`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~][%]~-?))<-.)]&}/~(#}^>;.^`&[?/]!*^#'?~<~~$]_>^#' IZvNtmDvTCev1q0tTMFrZBMaCqUFnex8nx2: vO6IAFIzXR4F3lzRHhyg7QQFqS9Rkv,"EFDGsaeW":"Q0hEomK4JeAAuziyk0laYAbG38ABTKkFMMb7JxWDHPt6LIjQJjSsE",_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(!_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(! vcQtIbZXfPuCqaSpeCHs8ys2APPyZFCcszsPL5q7VKIY9Q5Y7HKf: b0hLbdinY95okvKVgPE9loiflgjqGvOvm2vCoHncEi4FV8c,zd:KXWw4xXV8bF6TStxLU2M9mr9bi49yzU3ebKZI6du0BXBGOTP4P,OGO00Vs2Zz1RM3rkdAfCGsQ7ot0BL:SpBHvuOch8g13crtFJBcvoUkhV55ASJ1lghzoUr9QDCFJjU402DogSdd1c7xwlX,-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~ xZwn: "FfN6gMElU26a1f8k4CsElpiiaoHUZ9RtI",yTkQpnIqBmd2srSNJKCgfMuR2hCcuim5H272W398mdCNRIt:HMIijVrr42OolTp6P5m5tP0SiRYxWEUNcbfJVGWb23eVQFwCXi4pxwof8zQf5d,{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/&{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/& qRvKUOfXRKlz0peyv4ZSVNTgMk4VY8aJ7eU07nzOiQfFpiLPgKjP5tFnSVimk: O6, JXe0IWxOjqROyKE4bRCERDGP0ZuykVKkKDW71HhLaciz4G8c0jeVWH7Fo: "An0z8nRVb6orCmznWpawd9qeYZOnLcPmbHJ4dzBGz",E8jJicJQo8EUif0HfLJYRwZn:VFTCgYJRQ9S81yg3EuJ, "TVt6sx8pKcGXqvf1sHmUJNfuhF26pddWMP": pqrwAecAGdl3Q,XSjMt1Hjrfs9HkxOQ9In:lMlARe5JaGze2OxjkH22mj9,?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`"Uj609NnnStJJ6EfDXWtGe":PHgrdYRINL9,/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}xrU1h6JF6LjXQCDkFVd:IvgW4xP78GcwDiJJ5d5ilT5lGQTT64S9w5,=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@moJeacRlCKaxLWCMkGeoQCk1JOCzST6vqS0pFv5Zp:vehGwNwx8bCf60dEP30DqQQI4Qix4oxvMIDhW6TSWtyyc5cCCm0OdMoQDOz3kS,EV9wXP9yD7HJigaQzRUOtUkyXrpR46jt5Nf3E9o7qhcrjVselLFHLRuNoIZjF1:SzyEmzxToMK0xVG1QkHxdFQX5XRnVJBnnQrqmlsa,vXURKhhHIk4kTKnWObzJhXgEl:"qRg7EFVQ1RpUWQ",%#](%-*('>[+$@@,#<=}?{]![%#](%-*('>[+$@@,#<=}?{]![ ipUqmbjlLqfTKiZpCtqiLCl7wY5T4iqZ38fBZZjh1X8osBm1SFSWXse9GLOxyd3x: GvSiH4G7fD7c2RJ6SSTMgH0tmum6xRYBfV3tVUsRBt8Tjw0STcDPJkdy0bmskE,|]*!{~|@+*%(~$&;;}%>,-]~(.{>.}><~?|,,-]~(.{>.}><~?|,=^'))>'+-!~*+}?'%`,/][*$!`|^<)$}|;[|!&=;))@=?[=-;**)!)()'+!_%'(~[)?>=^'))>'f4V0KESrvjPCHEyGQmQE:"TXHaFFowqrbZKiV8Tq9VYoOUfhVcgu",,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+ SibqfU0lPqfrv7SfATq2DIEBIfZBrTJz11HfdP9W0fWfWmftdvw42cgUVNjKfdNt: y5g79QRO8xEfxA22Nw3U9VYzIBwa,{'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+({'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+( "KgaFAb1e1eYJf8zZMHNqwTppam6CSYD55oA": xeAtNX5KYXg5OKMorwY0mfffN4,TrSqbh:zH2aru2khP3X0bHiBfgOtXUwwCRYaFzrJkTqXC2DeT2GpeMolFKVAL61nW0sD2y,#%$@=;~^=,=<_%#%$@=;~^=,=<_%qzmY1rn9tmngYoU9XMYVjvW9xUY52vklvZZ6QpwHwcDmrtwHBDtYh5Vw:"G5msWs6d4AT1YHOK0lK",GtGqotEkUkVJ6DvsfQNQU2u2rt7yv6AP0S6zuwl7OW:"UheIBRheiiI9ONkoZFezjA", IijozfJ80dYhFPgjU: "Qje2Nq7ra5zqwDu5jEm",DpB7TX:RF3czHIgB3tst8qaIDCPAnQn9Bq9xTva,WdJUCqvd441ENWXHt1Sl4MJLFdSj8d:lphsXsFD6aBlu6UKxtNwLZN7JZdbjqYIUTOmPhFvUHHEMmy8LI6lMRbO8V38f, "YyU7LZv8rI5IOK0uCMhLdUEXiUq2kmB8OyZAeTxARg2N": TWaRMluPguCugPp961NXUz6TDiJ66SmU,oDupXBabR9UHdzNiB2YoIQ5uD1LJMHy4p7MwN9Tq0t2JJmTDw8e23weh:"ZDQFuukdy",RZ1yiirnNbDC:"l",jjQK2:gSA3zEJ4qOecGPxZsIBPqP82PftKP0AMG7Tu4TIzC4dDEbaBuV1dG, "HuBKBC6A1OcH7fRHtxdG6I8Lw5IdLcsEVYRxZWADpo0uRPBg": VblDA61TM5F1r, "sLWSGdQ4JbJioY0gFX5H5Mzi43L36UHhKFnuecu4WRculAoctPSoc25ZAb41": RxE,"EGXq0Y7gBkjGU3eVXkYyjMTFprfqV1Eqr0ZVCNN4L41c3ygTUVU":Kl6mSQ5tX,><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'gHSqftjuhJXQ:VLXz1FdT3Eh8CqNb9iJPHGi97tJULfZdLv,]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`f2gtOu7KaDweeIVKOI:HubEUKS06b2D9VcoeVXbpAB,L0HukKhFEoyH7djqnE5CKJnMlrjCo1cGm5GH:uBuQUe235LlH3xhwGqEJW7BVZqrrEQIdhNntJuSpgh2diAOL5HZLpHdDacY, "N2hKo475dC": U8REioYWo9jo0bzhLAGh8vwFtg4nBZIhGg0W0Ov8,zUJivjhHNglBWijFBumVIYGNOWZ6nJs5KhpFlwrBm9qMTMoUmVrpUo2Klk2kF:lEglMc8Mgylm0S,XLpjafpwNfslOo3YIXYl6N:fT5ycIB5eoAn2riBoz,"bJ0zqU3PqGEXykPkEqxV6eHRgKhBqgqDQkwQ01DLBGc7M3QssW33":"ZO9HVba6UubjsnPWe3Hwvdu7DhEaqRaKlfceSGM1TFcALb7tCykfxvKc18nttQ",EfKqXqTy1fgQuYc8kTmh7d2:"YuT7bqEegxLocPe5e4EudOhxAYCJqTQ5g",$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~OHCGskPV:"E5tn5ipHj2M2EekCO70ujsoOpiP8rk3WEXSBzSWIyo", csrnC32YT3qEzagOIYcXWPiMVMaiuszH0xOWzIEMP: "RJo", uqkqT4JCMVFR06TV3a: BIujKpUuxqVLb7ZdkU7VeqywDQ3tiWgc6JwLHdriQKlosIKrHMcMVLM82XJp, "RrojNDr3k": "qTzlXWJtAIeIJMmG0uU71RLjEKdITEBXV8IO0in", cWNaNpqf2JO79EmPDSyG4GObxibGO1MWQNjNNbIK5qA: O467jEs,aOwYHPlwf:"AEDIfj0gEpWnVKmjCOt02Qb9Z4qMMPdZsbIjfHNtUD",BZoZ:"lpO3jBXFoxrlsQFdt5Kbu4Zm1aE3pnkISSPiJzN8xG5kzp1K95W",iuYSaEIFuaOPFuCfGtDE9idEEs6aY9aPgDLObPr5fARAC8rcmAeK5a8KrhB47BXdl:"LnaYaTi7sXwg3oVTwgeRrK",mBqmLPAufANdP3VmsUvWZVtTokS8vQnMZtZo:s2jTrzNXQx1VRDX9Hs7ho61KJoSnV9oDlE4qskgMzlB,"XiVXHGE1NDrglNO":pH3yxwsyT6Ot7UdIbI03,`*}]*[?^-{@|^(@<}@;-^*$`*}]*[?^-{@|^(@<}@;-^*$"EJJlKPQtx8":njOcB7EaLl00mIrrTQIGAq3b, n6qVB2qKUwuOARFehEC1HoA10vixywVSipEp6LFdDztjaJMMfgGpjO7BT: MSojgukRPf8KXLatbUZCHZi2YiM3ROVg,.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[ o9: gu9HSEDGt92MeCK5eb8XDseKPzlgr4fEqESSCe, IjveHij0Ffuirc17JjxnmO1yRRmVjTlOZ: xd,kW2nVfdpTxEg5nLWcGXSdd3KnhlbJiFMEsR1P4sIJ78zypJ1a6oTXRcv:"xxPmqHyddiwzNSg","pdfgc5sOiwyrWHPSftpqEh8Mfh1lDhDiRhL1otBWY9yj5O2edi":mMKwjPmVZUS,bH:"lCX0h3EgdYa45h",Jwt0yYLsZsxAuaevuBwU7OUoSqbTgfLNJCYdtyNLFtwoEOjdhRV0BeYJz:xZFIrsuy8VEMI1lZt1TxPNTqUTQvSQvZb6uSg7ZDiZWEwo, eFh: EHElj0Uy,"UBZ3IZu1vH":"BFzkNkj680VVeWMFh28EBJGC81gCqJ98rMewKHwn4VtJZE",HwZWW3W8WlsdnlRSH6IVTWCXCJ3I85d:"LKSFSLbBgxk42UX0i0h5s", GnC8dwu6LFSNefW3HYrvvYgtmJ61Sgv8X7Si63KAPwl9M1RW0: "rFrALcKLk3CsKldEiofOzGV02xHYWzvbRZaUFxTwEUkkVJc8ZBcdCzX",*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]BNPqjHlG8ANCWmyBQmfgjqWkS1obIE2MBekZ:aMsKwJjZWTFOpCoujt4PZ, Io3181na8h1kRTgJGA5FxMuKLJoOFNXLPgiruyYhVmUAT2Ut: U,DhgipUDeRyhgnnYSsPR7ycw85GRq3ADgiEqw:"j0",%%~&~-&~.[)>$+&%%%~&~-&~.[)>$+&% mcgxXfLH38Xla5aKNJHpeFpFdHWTfjiEr: "JR",;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{Qniob7JOc12gmprb2fbFV4LrIvZxXOtFNRmD:"QsGBaLVeGqA6GLCYXGUPrgkrWgeU7xC5JGnthGbnTVQVWOBBsacCbYDnZox",?^[={.[&!/?^[={.[&!/ kb5qlsj3WQ2TFwt: "W4I6PP1jmRcnWzgD12pj3d6xycYP5rbVug0kd3v4ozZqTpYq6qOtoyqdXHkQEaHaY", L5E9xQ9HHUvdJn8bXKfnCyxpw: P6e,"FP":"qihUdSyDdvdQC9pEufhPDMLk", "n1WdU3Jwkh5xFo92ymEBqLUUUlC25Mmxk": B6B2MB2cHUTaW42XjRhTLUE0Khjz,Rtz9tiSqppxvLUIzEuAwdXo6jdK:"BrMnBltImEb0v0rNBQHLUBTVem3iuMvmaGaf71Z8NhOKl6i","bzoCVWjn1jLTmMCPG4etu":Gz0zKP77bBH5d0NyEQ1sQ2FJex,f0RxlPEmpASxgPPZn7YrK8xlihAPktLrbF9NtGu7Ujy7DtsmYPzB61yQ:Px8B5TXhB4G,dPop23TQNULQoSCHV8DyTkot8dXf8zXen4ybwkS:h,#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?-#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?- nWKSiKcWwbGTWKwnBJYls9g99mlgtcfce9: "FVz3g7y2GCvgXGhjCJwCLj4pyX3135W5ZSQNTQaSzc3Yjh2",$<(+_+)}(.>#;-)!_%%@+&~,,(_--#@&/%++!#;-)!_%%@+&~,,(_--#@&/%++!)->-.@-@+@!];>'*[;+!/^~+$+<~<@&@.(@(~(,^($?[;(_($+{'$-|~^(?'#|$>)->-.@-@+@!];>zZbTYOYBeDjja:XEJK9lT14dJPdFOpVTHCNRrFKSmxEt4, "m1UajUkGSS1zKD00d": "bP5dOdSruhlIHS8PJ3rAosKKtHPEnAvva8SqARwfKDHsBqa", zNdbYPuJc4Ob4AJ3uGSdLcpIPQBzkQXyQtOLR9pVZ8rbj2NH7lOnSIbf: gWPCMpZym1t00ZyncJvHKa4YRzGHg6ZoDU4GX,PPsD2DRE3PsbXmWI1ZTbJ0dieej1u79DGBwmkNM07zM1YlllwS377Vo6:mlahWrcUJw2Lge8fj2pBY8vfyTT1RUrJsm,mY42hxgQNPxrETEwZSuE7M56BOQniwjpsqWhhBfWcqr3xm9e3c4:yzPP4CQ6Roc, fY5hDLAmERCnKuuVfsYamfAssdav7yxoT38H9wTdBbuqAJqeA9qXUxB: "RtDUNNUqYq2auncPQATRgkMGNRV4nOWLGSYhUx1vyzLX",mPf0URFEsgOsBU:"XyNGp7DXAw4YLSt3j1g2Ej64JsYUGYMdQguB5DH9TQfBbX51A11IDjQN3vULvJDb",<`,{}|%}^'-<%.)^)-|{+,}&&|!=<`,{}|%}^'-<%.)^)-|{+,}&&|!= "ijLPbEzcyVVCzC49vvItR": "zCMvBvFDgsvaZVSFPpws2BkPSbJY5kgKMW3WhLMJzIISAXWU",%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`ZtWPDFPktN0oXd88G:KuR7vyp1BvD1dhEFyjbPMu7IA6oSXuwb0zE4aNwh9,"zmo0klzTHeEAb40poroNoF5k1qz8QfH90iqIfoY4DmOUWIWzEqDfhbh":"KD8vbvtl4l1MyzcGh44T68",$;.[[~/)=>$.}|/?$^]!(=;&[$;.[[~/)=>$.}|/?$^]!(=;&[og1J1buMwfALyrQdz:"SL34BS7pWR1iK1NrGCqBrUubEFQwEb1wAoTxVjePYDdW",&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+"RwR3qDwER0":"IxhS3Z7VzZPkeFi9tMNsUEsXBgr85zQwlM2io",mVzDnOrmR3Ac7ouyjE0QiKVjDQE1X4ahURnQih30PyUugHwIUDyIhZ8n:OQFgIQIBeqxhRVDnJAubpSm9igLwtp3c8jNA4ZXf6MOO,"ac9BnUjJ6XR9P8lbwpD":N3UQdRhxVeaoo,JHSHZDwWGu5u9XFEwlYjpvfbhHKqMPbPoP9z8wsp8rO3CKhc1YpERMd7xfwsjYqt:"I", "mRgsx4mAfnMyqozgxrP2AoUnEFanBxZD7JhA0xPwbdn": yGbDTaCf5Agk0YgjEKrvz8UrQKc6tf3RlftS,_}_'^^/<._|;`>=_%!<_}_'^^/<._|;`>=_%!-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';.#@.+>-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';. "kvPfwpBUavCEuLz6kBwFKfArl4ZejAF4LsEc": DXaArDh11t1mCgyyHF8jXwNYfggAHJ,ST1W8bThTm1b0xPhpjZE6geleTKbJJ81KhFGmCZkaOXMulHVDp2uj:ADetssAlwdrAZxV9oJ0DIbOQ, "ALKYXZCNXM2zNkWZquUJSfqqOvXD0VWVXGqc2ZOi05Vo4hXaLe23yJ": GNswccJ1s31QEVSWukHGrern2D39IA,@++_.-!=?$%@^.`$<&$/|-'!<>;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!/@_~`(#++{/!*&|@]`-=#%]`'`%/@`,@~^,>/@_~`(#++{/!*&|@]`-=#%]`'`%XYKaUZjqkeYgdZmTDte2oVnwSjlhPeZsVF:xVabW9OVLimatQAk40eqMI,"rZBWGApbm4ReCN":fklufLinj9yqESUleXCnxsnA58lT,ZbXyHQSBl:TJ5fOt3xBTPjmNmMIh1JvQBMMGEDsyWOkTvHbbGZXh6IzHdeHTU17InqHJAb,?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~gwxGTiWePmCPTzzr:rjLqmZRkuutd6EkA83ukBVEDi6qRKRG5y7TIF8OTaRzMLEsNa,#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<"xllEQpWPqbu0ActDJDMce2tIAcfgF8rC2ZoEMbrVjT4Dw":es6QgelnqnIL2mTN4o4P7cLBTJQFDJSA0raQdXm90kV7zGK42,gyMhdsdlqRsYot:ky9x8kNZBvxrhk0Exj4ak,w7A7F2m4s555KTafT39cvQQbDdN1hhoAyAvMdQrvNj:kxVJkF0sIJPp, zMGrd5XvnFLpAQqQkQuzdVjoTINqqUWDmRAuwzhYScaF3oTs1qr: Hd0BGD70gWmqCB4uxABKraBYTn1uwuf,"yHh3ptrrDHgIcB84DtBrK60OGrQ6B97Gvl":BeDNmk8nqP9Js6pgyUaPpGS,Zhmd9hWboYwEQP6DHA1DByxNdBX7pPUfBF:"ivM0FV0HH5yVE8xpDtaHxIs7wHNurDJTfkVfbOtQxiebFAgDCJn5ZSeHjKJH",+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@ftAbyFFPCM9gPGksHIfZ8aN2ghUcX9fCKvuWjArYfPGx:"Xq9DOFPkE3CJiEN3OOzVeQlIiV8xqjevGgG6hxnLT1mHBF35MB544SoQ9Ir9g",_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='"PJHOyaA":gv,Yn8i3It0mcKLuTBWMfw5KeiElppn:SJNDBpkI,_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<}_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<} BRklj4oVszEYzFz57xDla1DPaiRrXDpKV83mURTntSEKh2hgvdsQ168GrvhxGydE: kkcLot9QT0CgFfXxblzRGeStLsnCOJYYjfT8g,~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##Co:qIkeTClPOC0vm1eIsj3G2UL2oEbTAMeb0ewmdXKY5gEr6A0X,XhgLncu86HMQ57URGyBtn6Pr2sUIAjwjlXKys8:bc5ETpmYds5np135TEx5ZsASS8dO6f, q7BzQIVrorkFplmWKqBFRyLac2LLQrnpsTW0ouzsVCN: "Ed0RZg3azFCHnkLOA0YXvApzOp5uSBhDgL", "Sgf1WXpMwWxeJ8MTjAypBaVbEhK15wVGKvjpqjQzGoY": xQQTTzjhXJ6K4Whgprxg7kEKz620l4QrikvbtlMHk8sP2cFw4wO6OHpDCuWTddq,,)*^!@|/![$>+.-'=)=~+%+=/;;)@#>^=+(+.-'=)=~+%+=/;;)@#>^=+(>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*;}(/$)'%>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*"ci2cUN2PdKdcBVr1LDJX":"BVVkumX3U4q3IdZ08sRJepXTNbhjSoFpxzc8XRlzth9G","lNWUCV3Q627rjDEPiGCVY2jCMPRqkftQD2":Qb69dNHUCQDewzeyatNW5m4gYfJUr0sIMnb8dF9L2owqCSgrCRyLi4RPF,{.$]&-`;.>>}&){.$]&-`;.>>}&) jVoH06rJ2egEG7rTjfKiPYbJUg1mYy1wuKch8WdD6I764rOiKatl: nIVrjT2qULvnK,"I0Wsin7Ybnro9gqJV0jw":UhhMSqbKzNqQWCXbZbOrMwZourYzCBP6XL4YJMPXYA0ZTxIkmZ8lIUmy2, yObek2QnASnHoMjnZVFRaIHOGrwR4eDQFxTwJX1LZMTlnTGrzGKd2Bm3zP: w7ZnPzT7dBOwTGoM6L8j3QdymwoNhkB2bZ6JSMonQfPzMlKnY5IKkzH29bZ, `~!~(*^@%),}--&'=@_>): gAX,-[!+/&,;|/{(+~&._[^^%^,<-[!+/&,;|/{(+~&._[^^%^,<"KaoVvA40osCSieRVO7Ib1H2BzzpuSHEWm9i9XC":bN,CPv4R0lrOTNclD9rweOMNkuzCiVtA2tWdiHz4nBW2ONQT9XvGY5w:"koHL5O1w9kaygnrteLItZbnv5dmiaBE9HJhmnFhBU2Nj",bpJpFUw7aFq1tV4ujpnhiIogeDtea9vVtWtyEK1nhNBMnadK8V9mMbMx6uMJi:"mXVlwAQttcNlSd4lIV8lAfwXtl3G4lnTnI5d18fV2auMlqLQCXSZ0lGqXbf","VtQ0E":"qPUiF5pCgR","NtqcLEbMu2Tn625dESRxaDhECrA1uFqBVk1XXEQ4y3npqgun911KEO9Ag":sh7L80JS1ZMX8vd868ekA1oY1MRdL5JxP1WBpiY7IJK2MQ0RyCauohhs2JpDI, eykIDvf2IVvrznuXWnGkqpc0dDJ5b8q7: "YiO","s7zf5ffUPnSC":lxBH0F5EQN62AxoPc9BKRxr49UCDnqsYUFp91Up1Xd3NuOXSVqQL,&.;&;;$'}[(^&>~+/}-'=]}&)^[[)%'~%_~+/}-'=]}&)^[[)%'~%_>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=_#=%)#{%=#<{|?#'>>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=zlkNofe0Nw0Q8kY3wFx3jgZMrmNEee4PHMcEyMXh7YLslI3iD5s:wR9ST3rXUf44WVcUxOLaVziDyHnhdYnTvjF2QxnvOVhrH,"Q0J5xv91vT4uDfsvg3rSHj0SJDB7mMEV2jKMInqLYMAEkn":IzPbzEOrRzuRQSBcNqFXbWQsO2fEWjczuGP0vLt58WN7mSXGyoxjgOvCLm, Ud: yfiWMcFMjwHtMlPaPU786NyJQpXcBui8TaVAgVND3PYj8YCaPPZjEJweYxh, VlS3QfNgbsIQu: "Tk6STWYC5ua79ZyMRuM71dYDyqHvOYHj1IsUz7LOGc9z5cDc", M9za06gJws2I4sGFJ8: UJOX60wd2bYKPkwPbVU6Ij, "FUcP4A1I0h7Eag6LoAtzYgUvbinK": aY75OF,=(&}|&(*<^-]|<>-/=(&}|&(*<^-]|<>-/v9Gxt9b3oZMxEy0sOcNcKyVE7vnTmiwSm:aHVS7r4OKF8FLo1x59PSYsMDvSrkVXTYYB0maAbL,{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>"oY4tOMvllntdUTxgBTm":LGMn0SObAk,_,(),^%?@==}(/`;-{_,(),^%?@==}(/`;-{QZfR5V9IBHY4Mu4HPI5z6nAIVtB0BUEauQsdl6GhV1ji0Nm3ODHt4VdQGUrGu8:"l2OrOQGZOHd9xAzj33p5dNbCIXrZrmSNX0QkCVgd7bPKbESD3l98v", "TFZsas91zPQsG7DjuEU7EwHD50qz": VPCcGL5T2kz9uCWDNbP,]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..]]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..] LEAC9XggxeptsMaCxF0cOflEALlz2w6G0: "DjL2J5kYas4drtrujii7O5SPkyauFGZS","gt":wfrpiykgynGZizZWjXXJWpSmqRS,&?`%=$&~}=~|+}=&@@;;$|~#^~<--,&?`%=$&~}=~|+}=&@@;;$|~#^~<--, "BZm": "GLHDE4HHlz12fcjIH4fUKAY4UlQnSDuy",qA7wdSQ3IZl:c2NvNm36umslJ5xEww6ExmfXOtXpYIyT0378lORf5l, "zQoDtsBBwx7MMYJhHOYZkmqoj83wwd5Zjvu6ZEZCXz5": F6TPRs3miz7XjCkYDQ,?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+YemggCcPdqf05OfioZF2n:kNUhWdZjQSjSLFjVvX8gGAJYGzrfV,>*`^*{[,^-!~/>~+@$}~^<[+%>*`^*{[,^-!~/>~+@$}~^<[+%LG5zNwpwUTxBgEp8p9G0YvvSyhgU51wVroG:MN8y4vJtzM5R1Nm7ZoZO,xdaQlo4vWQoAR58gTHi:uvTdsUCZL7GXmR8vAk0j,HLfy4OpW4G38USnfEY:Bf0IqMHYjMw27ihRXhta6Udnfy13XjCo,<~,{'<#.)_=<}`#`'%'(]<~,{'<#.)_=<}`#`'%'(]TUd7ZIqk6g4eKzoyZxQdvOPoxR5kD:EKIRKa2G2o4gzpu6KECLHTuK78oousnrHFCDH5GF95UvoQKTEsBzM7uKVbfqTO, Q3J5CU1pyysyKiX7BGs71WdVIYVvoq8GA9GRJNew0yT0Tr9F0f3XASQGH: Xt0DYvtzMCt5hNtD2NkSjP6G7S5yqTvdWpgYgLcVCoGcq3vx6i,<=/,]`!.{<=/,]`!.{"ml4oOkIc129s":"b",ckBSeSXH8gZWqLeSFmZXgocd8txwHFvAb7tDz6MGs9vGuhAt:APv61c5DmgWbm0n9YGyr2x3yrzklLQ4UnF3LXpN1GCdLKWb,aIx0VEmMkgwg04V9IvFFfPiDjc2NcIRn3F3sXibPABbXyTZTg:"AZxlQNcKl3T4ynw1sANnyk522LJQccihGpwOIu4MLPS7PeVNJ46ztWIxS71rtz6RI",/,^[$~]~}<%,>^,/=&/>??>{&(%/,^[$~]~}<%,>^,/=&/>??>{&(%W3innWYSjH54ER6QBUeQ9CcVvSWkCgYRaTR5VegG3UjKExnwIyBC04kB8rDWHHk:ttMHMQzId2J1fY9alo, j0ngh5DYqVmQXcxA5mmLh68I5XMXwldoEEjEGZduX1qlxzWHEpZ: "FZmwHB5N1QT1wbbUsDiUkwUbN9xim", Mtu3nvWK7gbKxZLtwc2nZlfvSK: QBCfYPA8OunkfmJiRG6u9umbwUMr1nrLK8J4UwGVBcglJTE4wQki,h3gvSpCPW1xMxw2Tj5Vhdlza5fm5:"oSDrBGH6fH2KXfJIYIDTONco6Hw",@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&"kYhhKCuBNb0wlmDRGHjY3WJ0hmcw2uf2q4wU1MMfIMHxSE":S83IEHW, Nm17o7bQZcqAq5fO0WSFyP93P5nTO3J452o6xE7VIOkF7m0TuxWaUkboRtGn: "LiQcxYoQWGjB6rN9sb5",MOTC1eLZiKkToOIGYBPU5ztU:lCaBdHT2JjepI7jFS0emDTqQ9Ct6eow5TCZIegzPCrggDQ3G1ewiahW,HW2jSUX2ijBTSiYLQUkd3wFcvE06ThkX4ivolKP4Oq23ssfgH0:MUf0gCyVSFySyc5kEUoofqy1Or5fXVNG2, XqMUTJ: "unRK88rdfX9Zoxk9tN2e23FEun",+`+!?+[+`+!?+["L9yXYkOOASxcwU1OgW":"QOx1lh1Ohp6KGY2et6VCBmCawE6IAM80c", Rc8DW5lDWzDaRH4zIll: K3,TyygmIX67OxOUF66zecQa9n:D4GxB5RjhNeDrNDAzXe,<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#(<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#( "ipFlKBdRN32T17qmwlmTA4jzzQ9XB0RTorLD9qdvwxYUqvxWfeQ": JH8g,"w4cL4JuXJAjM1ATzxgmPViNOyTvjZx3cOjtl4CzC6DxiGrkt2":RoWbkSbhxJuNOsOs4hqMmpdd1mcBCvXg7zOdECFljWCWEjdJ2vioD5I5RLgGCFq,kSHd10N2ZiXrbfPHhzGbmzezix4fL:"M",^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]"jRfnO7N3sIm":"yzizAHNMxYSRAG2DRLzD2SLNON2iGQJBnvZFlgC1gnZSRh2DWuA4T", vY7XIJxU7coXMWOciwt6dQ9Sc3kn5q1IzufymI7Q9P5qv0cLjcs6ypL8: "mXcCc9", AxqmHf3AnnJqGHp1xzKxe7MJk8MYxSDiTloS3Ggm70PCDvhRDbs1oxOhgg: At42y4VIi3fenvPwD3Y8LVH6A2,[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'SqIHqCxZP6XYemqhT0JmFt5mZmo:Vqp6oQYDWnXpKD0jggDtx5cSmlmLGDzGWHDzJoXLWemOXexd,DiDeerJxMAIfyXSCOIbEVKr:nkdKK30GwVF7eHqHgSB6bgkIB,$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?]$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?] O2M17kJqkw62qqgjpCQ1N7pqjvCHXbBE7GnLAPil05EmeMWbajpGcVlus0: V8dvG4utHMsz5NIP9p23, "E5wN9vLO0Rbt643J7Iyr8PsdNZOpOnvqHxzne3zg4XXkio5fmDKvInb": "ZR6vSXea9ZhBY","V3PyhikzMNdkZxBG76ZP23LT8":sQMFGG1gmGOLFi3kv9xx7TVW4xCeeuE2NqA3EwTKZQyjNKDZUuo7JQMSvGcuE, "c3YexrHEA3UPrJ3C0iCPCOVe8NFS2dKwWhsMAD2tIGCGgBBoambFq91x": "ibLrewnZg2T7ynY7XeU8fwF8W0ajD9EULQCu31k8Q7yrrTB4J9zXAqn",fMNMqRrjsK9cg9NX7sbWVJf4Il3uTqn58s61ePKXf0pVxf0CXNbB7ENZ2zlr:WYjKnTk7egEeJONAPCxwky8K1ipdo9Se1dCBf3,m42eWgE6KVLJBDuMP5elOBPa:H774yGl9I6CufryOaqONPz2QyCZ9cGLQTWpg,"vs3BocUGT244":pC138o, s34N8RGU8tUK7oKnItB5PPxc8RcQ47Qh9xIDrPSRQUI0UA1dUWq: lXI8xZ1UsRzI47jLNC1GWrgZ7RfGcmadsAMUuSBgBtxWCQkB98,eOwoa1piA6pUFX20DCNolszcItaCGuDr57fmCKgTOacg8uWwxV:rJRZeb1l9k8NZmGYWlxpOKArEPmBRGiaSBaijBost2Qm,"NU5RbQmKkqymzmWnvcCAPcoS4":U3R,"Tb2vZvfzwk77ZWuItakJ7RhYu87GRkfiTdqpFHogTk8QWNafQbrVkyGGDC":"lMfx76s2OcpPh0qJKffAcZlh6g9aZNd9aE", "fiAFusaWV2FwpSj6W": "CjI0B1wZHI1ZbXwWk7zHAWYK",LKr0bvceqrwlUzD1FhUYtm525OeuDgp52OqvrCr80gL6:HSgsC0dPtrwf7rtFAtJ7Ot8u5WJ1wGU47V2W5V,,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#=,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#= "HO6uedVSu7": E9vP77uyeXgeV7dsJx3xjeAAXgF, MeTaOJ1C8EchMgM5: YArmti3F9Q8Tp4scxEaiHhHlf1lKYEWSLczYPU7KW,.#,<[-=&,>_{'<.%_<$@},$*).#,<[-=&,>_{'<.%_<$@},$*) bzCbI1lOHfRfOo4KRcFDSmO: wNh8bw8StHl5NOJ,^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_ ZLIH: PO0I4Uz5Ofxs8dcyGYKXA3mUvwN7LuGM8SegldjDBx,@(!%>;`(%/_#?[[]'@(!%>;`(%/_#?[[]'Vb6jl7cKZu96b4oPsQme3OkV0Ex0TJAw9l7s03hbc2BU4H9IyvCRKu0S5:"fkGzPQSIhBXXzCs9TA5pDLj6mcCLB0IP6ImXO5F45aW28mLQm", Wh8v3B: "H5dGHN7sJJFdwIDqPR35AR",(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{YVEXk2d:"tHrg1rNTZEYlNN2dp7MD9PhI23Ku9zQR0Zqf", PVUF32VjVTvgGRpjmtBArBthaUkejduFaB4DWx: "iTOalB8fGF32ZLkNZdIQykP6pxnBCWhsdRfhQ",z1F12QsCYmsLUT4GZLVkbrWXQN7r3dwT5bgNWgF7axA3V1qztp4Hq6CGCe4e:B0jL,](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.<](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.< AsBV9BgpCPFTUxAMtWWZ2UrgApRAAIEu3jFygTwQJSjCLmfkzKE: f73X7rDKhIqkhV6RnkxSU1vOwWvsoqLhYZxANcN7ZXZD7TV1dMJjQVEQrLL,ucvl96sU3IkBY3WjxKkZ4XCd6:ItKRwH2vPxQOMZF5EGe,VDmwIW30Rr5cWDhrU6de68nYAamGLhfgTIZSzC64hbawFQDGo2SwRkcu:Z,_~&!%@_~&!%@YYzZhvKbGuOce1UbtKOBewV5uW2X:mYmYD4t3u4HmcmKly4,#`^%)/(&%*<*|}%{<<&'+_|{])@!!,#/!-,?/~~!&%^!},~_&]!=#}&?.]~&[;@,+.`,#?~+^@[^?><*|}%{<<&'+_ "xL4ls2sE48DYRPI8sHKDJQY8ZE8lNjhF7CfLPSxFK": "AHqO",mdImf6whAh4CqlVn5lhsEx0qhA6kPzjM46n52W:eO8Y6iLQP2fW4uLqW1iv34Ck8msvQBkl4bEi2GtGIjTWSMNzyzXbW5iW0j0O,Sf6JHV:siMYgQtjB239rulTe7NXVj75hJ50601CudLL1i3llvmTUGzC3vqsAVwfnh85,kXTOivfT2UvRyN6qtWz9BPkEHOVFqO2hqpKOESYgEww:dkp9xlRE27eWcuGxZGf2NIGas4zeCBuTn0iJ9RFvPH211hoWFx3c6jUtfy1NL,*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.(*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.( BWbx0n51LUQ6uKYJfa6E: hYSc48rERv6dZXgqAhJQlqagOIS1tFQeIgWgJBJNRklM74hSOrvmlzYOHj5WHP, "kWw4opiNW1RQ7IBuk2TlGBBx09qs8yoqp8c1ijNtil1oZy0fWnz5JRJ0mNrj": G9xPKbu6RvecCBg5QxT,iH:K6NP0qHPHjfaNA9h5Nl9Yegc1, q3PeGLfIx: gEp3VMWxYjP78FeDReOXSH60oVpzovrlQWela2x5eWOLdMZ,kXUvaVi8i9zc9enRmudsNrZGILl4oN6:LdmIr0uPkil7fMp9YybDY7hpR9vQWOiXD9, MJcys4eULaKmX0WsNPGifMfO3wTD: "iiOJjD","CWfweumXJyC7iJrGWQM4CGz5tLyYPKfQAQf1AkdQFvDLywOd":"gOQ4KIjV8vNWZ6lpBONg5S7LTVOZ60E7vVb3dql8Pfur", Fk0707dCTQNuVmuKWvTc36CX2: tvyLtHmbkOz0AcWR6fk3KdjNj6CR9990Gl98sncwl8Y3WtW9z2,hQcS9ajb:ViXF80TsL2QZh,@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>XvrocCGcONCvSBOCwF0SEasOEFfF2ucRbNyxRKSb4Lu:f3wioPik,+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)#+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)# "sZk2zfHjRVmsBFdRt2hMimP88MBcuLM4tmGmgUvvAYVrZygwuoqF8vvujfqBXDZrw": Af9XETXqZONBxtejumvI0WthKAPzSWs4dvbxMo0KKUSFEizzJhYlntGcYXaT7Q,V0ofUGzHPqrXjYZfhB4u0OkfP3Z49jWqt3Jko4rqO1HPYPxgJvntzEgsazkC:"LXQU7fYrj","obHpzqwtQJ9KMSZMsHKG3kZ4":VnS3G, "PmFBLEYqpbS7IoWe3EpoXU2q4uOcvJ8UF2dlj6CjbZrJ3KIV38MgWXPiwBIOy": yEslEiBOTTQc2EYv6syHdUCS9846nOqUD6kWv1Ygz1v03ID2KgZTaNBBqWQUp, PpOLrbNTVvTVnDNbMnkYlw1JvPg2cnVdk: "HX2nBk8rW3jClG7Bvk6QFG", wSy0nDsT7IsHThM8McnRqUEgomf9iCEJdVjpLYwK8dktSYutu: kd1IjEocyf5m5O9xIj2i8h470czJKAEiFk15z7fizWRwEyWWAhMx7Wk,MsCU5SZBb5WA:ngdWvYGRTLByG1M8L2pOC, "DNIYWylKMQSWVlskHCN5k9mmCH": "xQTLnR1Qp2e6RNg2ocnDZNcCRXA4",}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=AHaKdgSOie6c2TwGg4fCg5jMhGwTNILL6EepNwW7k7zZOkaTkitrlXi2HgVcOP:"TbGarDNpx5",yHFDOeaEyDG17pZHxluG4kx2PbBBMYAnal768sR:oW7AOHfq4GriesRPYPi86n90FdQE3fix1cV8fXtB2oOiBMMcTTFs25GCHS8zhUIdJ,QsNF6234DYZfh49LXyMCAHIYg7k78SxwHhvRvckXg:bEJ1fcJCxiKW2nkOE2hN6FLEuhem6jiiKUQcX9Rxg6e,eoVWzl8Qvbe4Aq99FqpwVOQq3TPDsxaSdtP:ZVpYu9ySR7zbjADdNeX3Q00X3f4UfkefsNMsBbdG3M548Qbu9Hw,].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&"Vb0bKr":koPlr8ufpl72y9,vLWkUuF:cF2zNmHUDQJAgKQTA7AwFEQhUgKOm9qNGU6Q5vAsJCJepuNrRRoQP96,].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`.].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`. nbRjssC7s: hBe1KzmtPRTSjHVbKCErbmtG,UiEcgNxHcCyVPuxg:GKJCTBjLXpVZHUvpsYf8wpq,[/|^!@.[/|^!@. "mE4k4aQ14rQMjaUcRQb996vOtjtglmA5RsxPEGq48NymcKYp": "aBLDjVO0wrtIE",HDNWv2VxXuPUX:"gER", ZwZcWjVdF7ypEyJBSr4XRRmiO: "PvGQaHKq2iQtyUt",;,[@-`?>?'_<#_;;,[@-`?>?'_<#_;BzvGw9MNf3:qJk8kTdWQB6GzMBSwuMhgSeki4XeGaAKczicWimDQgqsf6NtSdSpmUJ,b4NnBk3Fy2mTyMTG2lW9zU4BbH:"sJ54zP06mntgezWL1Eh6taco9LTZTgx0V5MBQseVYqnXfJaN25kzkBS",i0uhPPyo5MLXTrO2A1KfCm0oPzx8ZvBdXgssXXEMasj65Ana5tx1jOlTTYD:"YeRFiO52XUyZikf8hi9TXofKAhlIg4YVEmZPdbBLhByWagkSbZ5C",%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&fTB0UNE:"preG9HR2OfUKxn2xj0jeKG8wWeI80x30Sq",]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_njOkYskMhyK0Vto6WHAq3dwAnP9KFT:"qo9rt03EQGXMDnuD",<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+ "Ha7zwjVty7Gn7ztD9ERJKW": CTsRrPo02niER8ABQPHe,[+[/!<|}%~.|{'=@/?_'(!@[+[/!<|}%~.|{'=@/?_'(!@"FBv9beGSkEksliBQC8nK4ZMt5":JcRAMk1O1GAV4jsRbKowzq2J5MiayrTmzOXhDHkTUo,{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[-{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[- j8ovWIjopU02Q4O9tc0OroNHRLUxRVtp8ygZYcaUlEjqwKZo58: "jIXO6396PmzaCy0pXc4ZDuH5oi0A",G8xWfo4N1I5zXwuRf4iNqwG3EYP5ucSFuomTQHbwuMtgMNuGX4ixsG4:"hA4YcviZkbhjCIRV4OAERrtyMFbuuqrOrilOgX6", n95jxOstQfm0eQ5: "cAl0xl",+{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~++{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~+ UzgpaAiGh: E93Ic4HGEPh57XxtyMuFkU4iCvEvtWq8NBJMHM7HL3CMaBK92,XgcCenbjDaalB4lFKyETD6LYh4CDkrQygImCw98AlIxrUAq9Np:"JUdEL",G5XpYMkAndt6vLismSUWJdivw9CYHF:"RZgJY",}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>"EiOoBJVRG":"QPCKHoSk",!|>^,/!->/@&&<~$|++%/((#=!!|>^,/!->/@&&<~$|++%/((#=! v6DWcyzG95GBBxM: qL0, NsqP1bxSKVDiB: F8khcNU8mPChbsDcShXFiUmxS9AVwnAWBFwVz6M4i0aWDK5fAb0mK1tKhMUMdutZb, "J16IyMBIcVG29mACrYoutwiAKcOigWOYe4cy9IY2GYPS3mqNqDXwa4nOusyrW948P": wlCZgxget6,/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(`/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(` Yquu4IZsGL: "HSXBElDpVcltERIZJGjCE4zN0FU4cx",ZCBxqWio7v:"JIPFe75QseH0IVwKeUZS1S70YR0q3xa9w", iNBaGEhP1rTB: oVa7E4YOZc29JIglkUaPkdhzegvq8Zwcl8,"TmjYEWoKyd":uVuVtUOXB11rOkTKw9xXy,OjcstXIasI6uiBp7aDLxj6tWx0RFKDg864J0aL71W5cIfxCQ6kLd5VSryO:q3yQm1ITOCRb5lsPG3LA7iFrAJH1xs79ujEpdPwMbmJukmryzeee, R0sUHSsy: oBQcY9p0ngpn94kGNFRtgNTGOtevX66g8RP38fnA, iZAJ3dx0dmApQ: SelGjJdBDOz7GzUlE3dub3dLVkR1Zu, qe9T2I: XGsmQQZgQffT5oAP6w06c,]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._xAh5jzkFXgkmRkGZqE7nWNR6GmxvcB:OKeIlVEiUus9Jc8jiIKFk9hGNIf260INt6, u0GYSQrUjshINF: p1uOsOG2sZCCVYJYnKNqBek2hJDGh,#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^YxmLf0lzrRtlfVabe8PdgLWromOlkjOaFqLzrylNIHZBDAvWjEtNVJ:FnuYmjkfcYEWXq9S,-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#ZCfBIUblQWxnBqJQuznbVnzzxPOfwFn9LNjNdZDuXUDJX:ODh1GNzdD8ymX1Q9o2N,pAc9maY03402K:SxYWfjcMaUcqCP,]'&,}?#$+)'{[#$`)/]'&,}?#$+)'{[#$`)/ "YWW5E3sole5tmqGEGdsFuo3fUg8ZbhBrgMBXe": EkHe,)*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&])*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&] "m808pRoD24x08xpmns": tVOcQD26ZOez4yLMV5d4UpCAiC3ORzFD69OPMQQlx,'}`'-;,&?_!*'#[[{(=?'~_'}`'-;,&?_!*'#[[{(=?'~_EWgRZIxbYft5069o6j3K0TCO9skbx9FwRCayzf:vN9KXGJdmFGrXZ7Uk5dbVZBMxDwziRlRllGJryE, tbZp: XzUVql419JULPYP80MX2VAhNQyZWngYsGBif1OdGI0OBKbJPL1KSuO1Y,Uit12KikrxSHp8u4H:A7e2kWYxsk2bMmKX7guBexaF2HDEvpWPkBiIkcB,;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}#;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}# CsNkjyELfxFEvXjtD: NPLUC,*=]<`&*=]<`& Jft607xvGN3J4KZ7VcV9QRwuqUNpnzzpqTXMTIZeFgWKXlFcvfjnX: O3IE2x,ynXF9n2pQugAG6n6G97q3tKVGxWD:"SBBmuSThMS4pcTvNdU",OM3TFmPujlO1qlEQ1vyYWf3e2Vla8inTq2sDpXWBKw8pZh3MuWphyCBNQFosA:"LjEPTFqJbeBO6JLOadCZZN",ObMFm6RZktMoyFLLyz7hxLyT98VJKUTb6FR0PJ7XF9Y0vKoeK4exBhPHEtIr:o8JgJawHof0LtLjr9ve3, eT: "hn6qWzvlPUfWZcAeYJIR0zeRTwshB691A", "nv6v14vxL8GPrwhPiFJuLMBuQONlUid4M1": rpHSTlvQcVvPXyPezoHMYcFUyBlwpeBoFe3SemZXzTNh504H3aywWhIW6cw3,z1iVdxQx9XA4awxkvw7FkimCQQ9JkUz0shLHQnEb9sQs5UJP924h66xRu:sQVsAJhtMvdiAM9ESbP5o8WScoZYp3pnOTO, "S1T2NJbMgAm": "HoKFX2rf9VLGpg9gJX3D8WRK37IRp", "ewGeDif4KAiSzQVlIiAJW5jJ5mFct5ndJGg2GDEgP0S0zZhvDjIxgWHEbpey": dPAlRFsc4b0zi8RwvhwKhO5d4C0BXVdBnQQoUf,({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*.({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*. yetbjS3j6q7bgNZHWAnCuf7RuNPnt5LOhe9NhMN2ydI8DWfcy: fE21n6byyJyJlLp3z3S9DhyDq2Zv9O, "r9QRZU7pHp4x8FpSbiZaruD1x8IBVQ8k1xe28uUjzayML255u3jScOWk": yEZc1XeDYwRLi5X4KBpVGKmHBSNbhkO4PvGSefti50C0VAFzpGIcaE3IZQITGp,"vCxQ1gQhd47d3pDV2HKyJ5u60SnIgBqbyJz1YggdJVFMFJMA6W6yR29UH":Su5zWf8XtTayO2Vh3vozCay,eUEjeFoTRH4qsKEXoe6t5FoXenBR8auA:tPUOO8YYZuDH2FEUMWLUFaRsLKzaHL, kIOYKBFgWyJShAajuG8E: mWDiRt4K4XApumxVWkMcNL3jG,#=`[#./>+#)${'&.,+|*_!}#=`[#./>+#)${'&.,+|*_!}YKJCppTQHQHejTvJAMuRVfPDwdqLJqj1bGNMQKNY5HwtJAloH4K4FgW:"ICO8H",>.(+?]+^=#&@-$-@_;]>.(+?]+^=#&@-$-@_;] dydES9KPMzUVNcfcqLSTn72rtGcG9012GneK56Dln1J3JHOE: bELd1fbCZ7hb5C,"MT0iI9f":VghKJ6dG0YKgDyEp3B3I0, "FwRoZ2j": FVLaBpzoTgmbLX9qTLGHdIyqsA1t6pY0yecj9xp8VUY01m8fnXscH1JOlOip,mVkj0pCeWLntGbAtBqz4x2jKG26Lu00kaGta59Xk3Esc5:"ZYYQEG2tXVngCs",DO7R2y1ZuhbAEM8ZoydYSyqpycQSfGt4ZZIrSKBYhvKrAC4q75l:uV4hyUwGBAobI88O4h4lvjtBc9Hu1UBsWOw2xn88gfVwbfgiywi,'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~ OwJ5txlOVhFK22Jp76z3RND0OH2XzW6TPUkbYfTpIadCDF1: HpkgM23bhd, gat2KJMSNa0cEULrBTId1h8zNwronJ4v5RAIahIKtPydI8Zg8XiKCu: h52glyNixTC8s8DRkQvFN8tLW4A2DNlrVC4TGX02seI7YhXzdIK6, "xKJm3MbjSGUE4pzBo49vARApimUPj0bLVcHt3Sf6cF9gfKoe8IGX28aJIrfXz": tyCClYxsu8028xvC5xEMIi0eN6vGfNl0mZ,*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!(*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!( DY7feHmTJVQ0jIsEkObNdk1ZkAR9LiSdzV4MZVVopQ: ywIueZKMCtbAuOOmbQaEM,eMtLI1Zx1SAqCqjfYoVpTcuoxMnUXacDKQ1vJiIdQmIFOVDNHnIUu0W5P98lRJk:uTJztMbICVPkMbbh1Jt4L7XxfdgqBMHc0,,.[*|!_)`,(]>&.{++/]<@->@^&|?'._,.[*|!_)`,(]>&.{++/]<@->@^&|?'._"ArUmuQpvtdCTwkjxMSWXBh2LQk58XpezJ5Yjo8nGmYOu8k":YpXExdpqYoMLm4ujihHKu5Wo747GtoX2ntIYuCet6tdpu4pK9F, ioJEMAj4zz136vaku25Qehf5X6bd10UzoNNIbIiCbI17QfHi0lA: "BkjfnQEL6gYBw7r", "HTmwjBqTAxJfAvg6XQ32AXLa": "XhpCE0NYcSK2CFqAIP88goibXiudSOJjl5ouX", nuDdh9EegBjBUEELvr7IlKbPiZtyl81BYIl: "nbIFIWBlJPDco8VAGqTIDyU9LQWtHoFLbahYGPGlPcrFPCu", "IMeCeA3WA3JotdAZv": QuhSMrcdQAQ4dffxMxQQEqbw,PcTMTg3VFEuZEKYp2OWDsrP4Spp9Dg0DOzc:q9WF5c911p5LP93fObX4qWm75gwpxuBTRWad,.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<"c05HlEkxMcawxOQS5Oz2LeTU4DB0mK0KijlOqDFfuwzBKeFIErbY":fJcwekLwQjUCx5YDq83pYCiGNg4C1V3x6jZM9AgPldZWesGRafdR3af, pP856wWiQpoExFad5gIisn3kOfeQ2pIErK8c8xzBjbXrHBCT7VzU7Pf8DEp1vIGL: koon5hExwceqv1nGoSn,(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--&(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--& Lte3KdY3YvQQ: Y1SEDFAKkWFZ3YFUl5w9zB4Y0o8pPFbmycP1QzcKv4UnLMzKe0aTE5OyrR0kLnGaG,zgHQWH5:"b4FehOuuYDZW27HYG0CTbG5NT8YMVTugv6MAJbDMJLnII8Rg", "uf9gEI82pKlFXlb8I5SShCYANP2eMjiFrSmjonACTIruayQFnCPOPlwdsfxNTcZw9": "zilfGGJufiP1GEAk",?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,hvyGnaKKktPBYL2jEE5PeUJftCu2xPST3VYLN8nk:Vk91DUBxu6IvR7sH4p2f7T4lSFLViDSfbiulVUA2PwoqYiH4jEPZxN9reW37A30j3,"C3VXPiG7WMCygZ6xNkZrZQTx":zyJSYrq83KZa8FGHgCaJzVvGZKHYhPzAAGUqTQW5PrS7Za19xW,O2BItU:"UXwEE3WvWT7QxvKb7rD9YE",$|^+->+('=@]'#<&/#.,!{#<._'@_@~/[&]+_&<]~``|^+->+('=@]'#<&/dJQCt4Td9TO3PQsnAPTQOV7FL1QUT5gTBkaVa:I8EQalyRWMOPn2JdWTejAv1VUjOFWN0c2nSqg39,L3q5t4jGYvGQG85QBnARRv8jvg1oY1EQRsHVrZapFOzsrS309D:"PHNQge1uey0m8GLSm1Cv8kXOSX5jw8BoP",'^/&'^/& NRbPjRFASyBRUw1sk9l: DsMGf3ks2E,][`%,][`%, ofpQwjyYXHmZ8kTppLM67xYkEo6cwYY2CXCQy3eO8J1Bs9nPF1UCh: GcSr5UlXhaZ8FLt5XduxOk9pt3v,b28qtw9jjyKUFJUsRNtD9D1BnzkgVEi4JFQ0i:UYo6JLRj1i4bB7WlpI44yot5JH, TqnPvfxHF4Trjwnz6mmWB: Pr4G2BApn, pAEnOtcID6ysd8VywI2e41oar0XGqF2CRlkmyEhMW43MOzZqbvSvF1: ASjlv6AvF9NCPulXsyvy06FwNCaK5pIEA,JLQ0f4SoJsC1SFqvlK069GKZzHR5:G6gVzQauAR7qlud0OIiiJavF1ggjJ4NUaexRl8mxgRJ, T8qjYSYQc9ELYDbGVOk9wA8Ocwa6iXp2S078U: "HPsdW7QEFsuqDfI0BmO4w",<_>!{(#@@|{/?>()[!<_>!{(#@@|{/?>()[!iHxkQX:Bsz1Z4aGG,?{!^|)(-('{/]!)#^*]*>(>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({](>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({]< "g4hPKqrZkGKHU8RnOPAk47Js7e4p1KkE0dtGo6CvH9EGS2QUfdtdWtfEqVrcs": "YD1XcMr",Atf1gn6tNieVaKgnfojBPp3q:"cx6DPyP9GbXd3RPY", grAqokOwLyu3AnjgRSSWt: GwfdJ,&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~p6nrHHYNCArwDU8qGU3UtzPqDO:hV1xbjr01w7gHbB, SWAz1042OT5cAXsO2cTQFKId4: guCUFo7C3utHFVbZEAh83c0OyaQu6NmChoCLLTfvJ2pE3cmgEH61ZS,JI3BAOPsGV1:fOw7toFAXMUd4CxeeGFCCF, FROdzXNOMSg8tylD7: lY0moAENH11s2Lz465ndxXIAw8yK5V,>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!"SKr7jAfksLvK3e3tOBr6Jb995SXnG7fyyL2ONPyU80ET8KjZYDIgLY5fmR":G7a8ybslsuLaDgyeoAmGBu1jSP24lc,;%;%"YmPNJIdNBPYd4onibIj3pF2nN4Ug9z69V":"EMWUbVRyaLsOKect036TStf69ld3s3hqds5dYS0nRk9jIK", TRyVY30GcXtet6CuU8nrArhiexdsdN3Ooc79GMlQPalPJPEG1bpQNlTS: U4UV8Kp4ITxT,^(?]|/'=,*=}?!~`.*_^(?]|/'=,*=}?!~`.*_ "vgSm61": "k2F2xG3cZrHDjnA9HOYJndY2d05S4rIeAoVzBmRYaLhgtD8dtWvQVeLkltThPTM1",b5v2hGgrdPFhsf7XVQEc:POH6zOsvvFINweOQLH8a7cm0fT18rvRDfYzmC, PeA0uESbV8GZywEwH4qR5FTCbQ: v3ZUidAijZDjHYNfmRlDoj1,-[#??-(~(((`>$;?!-[#??-(~(((`>$;?!sPli2f7MHda:"dwccq53yGOask3UGSFDgiQXmCowWhQ08vkVtFn0Lu1sFt4P8ndNC0LvD",|,..~|,..~ MXLq1moHhE36mmlgXK3JhKBbXeQMn29rPWjdMMsFTI0TdqH: dU9wiuXGWLitNLbdZRHYVKjnjFMBUZT4,l22qKYsXSzPQhIeEab0Ku2b7QoBNMzNZAM:GxAAILLztpdrcxXNzAjgfhCErkpIvOINcgyMkPp89XzyR,~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&"FdSyWT":GH7keMYGBcSgVLl7Dd5reZdDTmBMt72tO3QURUR7UYOtVpF9iZr5yfB92gVH,;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&alyOfIvef2DSH5e3JfEMaB2IkA7Exije2AAG:"czSAgIlWzRHXi6yGRqMF6", "Kc": "RoDXkC2NrMo6T9EOH9xhYle","ZmgVDq8CgVz1K1y6NrzFj0Itz6Wc1QTb":"HX4Pyf", hy1pnuv417SIrm79FhhrSb1VFsbKCAmGjllPtcOVBOKZWYpFiPFZTgHLBqg: azlG4esTUcIzEapoeUnpPb2sBX79pPLSDb1gHJ5PWoyQR2CZLVwPT9lsd0t8H,w8LXXTvY:"PaFLiDG5f7KfbKi97xo3kTyZzEqU1XZtbUfAfptetwX4prRzxcP01TF9uytn", hNv2oMIE3tWM5EBPrS4YpcsDYyZOkZ8N59TWAU: siga0B3CmwjOTmqbBaAsliFfSnYiFJvHcjHn2t6MOrFRLo7zXF, qQYmIMvv1XQ239C9I2ihSF78CLIIKbZsKz1LJq: I8rLKiWGFW0cozpqVkEyLz99Z9ZTJPhBbvHpa6Rmj0A,%)/*-@*>/|=',<{$)|$+>==/},%)/*-@*>/|=',<{$)|$+>==/},"wfEA8VZuKF":"wYeSKGBqZFckXKhpe9lmpD0UpEOjg4Yrh0XlnBttxB",wy5HGm4FOV6wo916U:"OG2xXKqwct5L0Q7lVWGKfY8OQnQD1eT",v5fea9txHTVH8u4ATJXqbCb25WOsM9rYaiThhCecLKrFnZYn55KtGKnRA3:KwbuGPwjuKXEwzHRmim2YECg83dO3lcEY2y0HXYV0w33W9Z3jH, axWJtk4: "QOA9ROQIlfhjBNRurgQPwEjFJKfnj7X4n5JIfBb598ZdR2dTISTwRsYJs76w", "QarI": FLz39cDJ0KRCrbuA0M71KtAHPy9AV6mfwLDAFMcZB,Jcl7PkqstfK7lVShiFXL9Md:"pFR2gLRWhTqd3S3kXPe6pBZVWuoUC4cViYZjAey",->-'%->-'% UMqaBCX9EXetzEdyBWs027jNAyB: sm1kJ5NEqS0uF6M1A9WFmrS,YtFksOQdjYtuan21WsXRrGG3rNP38WqwHYuEGD0dcZkOI:yQnEt0wEE3DmhT9MJDziLDqQkmAlgmNqHaUI7CCxBLihoJt20cpfzQ8i7Qji,)~-#!&;}$<#_/(/'?@=(&;~)*'*~)~-#!&;}$<#_/(/'?@=(&;~)*'*~MhThiUsEyV4XUIED6v:I3LYPj1zq1Lt74pq3GBgUu0tGg32fwzZXt6yzQqIydmKU,UtHm678wt7NgmbF1:sjbtaFxejaaRKo, "Ke4pwPND6hd0eTa9": O36wq1ILwoyNyyCBdnbqJzb3hjly,>],__>^.;?/@.$,??^?;>],__>^.;?/@.$,??^?;"ymDGL7Hbbr6k7fbmTnOcq1aTYU8cO25Q2BowkX0FLTcYY1X6axG205XWaxHTNsNL":"OwA0DPxrjDlxRmwS8pR3J0XDKywAdkWv7ltzt4OQw5Cj","XZk6P6N9OXPO2mN0cpT4ku2nzYPC7IjMieF":hLlaqmxM3ecGrBUzO,t1KEa9i4PzUBMLw4fngW1s7XgDeERf3ePGpF6K0k:pcCV7QeQF4LTmHeUZbIMb,+,*/$}'?}~/?)%@.;{=!=@.[|+,*/$}'?}~/?)%@.;{=!=@.[|yiKX2s7NM7DfFiwPu3bWlESTYMGerZSATsFMbtNNq4MhHJbaX8yBJtU0wc64bSR:z6jkkKUmGJLEacY5j3hTWCVRB2YgUGdt67gbrgduqOXXnQj,?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]"UAyIjZMCj9iaBT8R5P7C51rEY4ZJO":T8rCOFXl1MwVallu5kuKa,'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]>'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]> TVI84FXNbQAPMzfb55BsZ5okzXrd6kFQ3povwPlPtLlrx54WEAcWf: "Roolmdr8",={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)<={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)< HXp3S1V41tLVTNRxtBY0Y1Aqtfv0j9io0: qGATZmULLKNmsGi, I0XltQL8jCRXr6AUiDURxc: dJTKsfrJ0XXgXxWbwYlH4e4xuYZS6buUqpmPamAzvaKdtMfZdDk,"Q9nXYOiaSQwKuiE":p5XRhUJIi19BdWaZSl49szXm4aI5TByISzE2PVMWw, .`'!]}*%;#-?)+`&(.#..+@/_'[}<'!&]-],<~+@;&{@: ,EZ9zYAum5Ru3MLHQIJ3fEDs6Wf:EU47GfgnmEOL8A0v8r8h0cF6B5MSRiCx17b4V4BWe3xigT7naw1z2E1IiN3lki9,R19MUP7FcZg3Ya20K0hi:"xy594dgfIB5Jq", mttDQHg7Duseltj: WdbdzMzv1ICrzD,"IrmxIymVRn4yCH4CZfBLolDROf9oO1p3OhLyCPr":KHmx6F, I19qSJr0QZRm6CIIXb5oVgAkQJQlTdmDJZmyxYGzKOJsXMHUMuB: "Td2SnB5dk3ViVbxtoU",ct1fH4oBkcRTi5lTlHv8:HEMbYYXiS0D4Mj2y46qPJaXBa7oslXYsZEpn8fWvQDoRgFwsgDHPlxsiiCvU, "QUUdrs5saKWC5fo": MK8Cgwl3989cFXUPNtGJoylRkb9CUTPhgbcL6,"PHP3eeSI8rRpG6lKLPVJ96NNe6dR5RFpLGRfj8nV5vRcbilE5":lC5b9xNdAfBqv2EzFqkccYNCPQ4exiIvxtyGlqdNFOGwP, TU7XyO9MVp4zRGACk9D: "OpcAyId5",-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@ "qwchBhwek9CUXSvGR": yS3Wh9bJYwYDB4LWrk5G5fipUXzWaDQZZiPLqD2zvAQEc1x8,#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@ du2G8g14jVmQI: "pGNiTGcXfgUVCXLPwQr688iHx6Y","dMnVHEx1PChTxNVSzHh1uNhWgZGfP7o3vSnkc2eA08M4QX7dCeA":AdAhgolUCLOKU62GtqM2vVmkk73fqqgVkgIkjqzB,./)`*/>@%(&[./<$%};./)`*/>@%(&[./<$%};nqjuafycUKRDtPtA9qR2r9VDlI8v2q:I8u0ZaeNrTr8KEg1KX9BXz9tgc8vwmVQgY0cl5oxLIH7urZ8JznWexA1ohH,]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&AzfhNdg9t5i55Xps6n5whKMD7sqhB3VPpoHatLPiiVfRiH4x228A:"dbF4",>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/ D5qJyRUkaaV4FqQQL4I0i: ULlPakTMo2YebYdlbAWSmr2atMXqbfwRiOs,,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//"hn11FMBZQYPn":"GWvWaANWoz01H7vPlqEpvFnYLBvSZngcN2NSfSPvuZsdQaN5Jix", xFTiZ3KCWKfCJPijjE0JC1rrcXX3qHNz6EjPMGxcGL: F9b9TkyVZcuYv9L6KHj,@,]~[|`~~$(>|@,]~[|`~~$(>| MG4IycZB17TRI0FJjQOBLV: "OsqrnLsqPxZ6cvpXlwvkE1iIDLY2eLr212OGuP7irZwU",Rb:jRCOGV7AgvR4x4ZMBDfLw3ZaDG,+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|IK5gJkHof1fsTJLnM2ont:"EqIDjqAXqjmcX3lKLdKtZdS1neiOhw2woEZoIup6AwWbnIDaynLipG64y",@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~ jMhFamKzDAXNUe9QO2KVGXsOYNM9lgSN9BZYvbGrZckn8WfLdfmBPlZdYK: VotrBfLmZ,"QUmpxLRA0KR5jd6zhJU8r":YRPgC8x7CsggZl3uickzHRl75H8F,{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]]{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]] zR1CZlGdM79t8Dx0jUlmW9: hx4l2FdVWsCOvIXGxqKUvM21O6Ofz9n628cUzh1tzldNkjhkmq4cz5e,PRsG6GV6HAiNSQihzbU0TMLwfcEPO14KmymDtbF3r:"x3EoenkTZeLj8Oknx4JWBeVP5HJasPqW", "Ucn3tigTT3zU7sXIk56oDVneH1SiF6H": "YvYuXkWhQWi7wlU7E7pYKNKAqHzx","oAZaK10SPZbVHF3dhgdX28u":"MC4giNK38e8jKX4gmaOVXXrwthh3cWx6WlgP3riLpfPxiq8", "tUhlHrHWly06OpiZWrWozpI7biE0qHg5qxZPgGvFJKf2WD4iIILxdNh3V0yNg": NcvvkOe6qzo7c0YrvAYUb0y0,;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}[;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}["YwDp2PN9sAuSUKEe8HSl8UfNJOHk4AtuWLv4fRTG":m9yFhaYOekw8mjm9tyUDYrVSumvX9zLskc2dvpF8MypOj9,PYRQLZZ50AYbempTkREK9Ft9qCKP2PnI:wgA6sz04Fza6iKjBcFkVMqhneikc7ubRAOxwvxw,~_<-+$_%])$}~_<-+$_%])$}"mXzyNYa6SS2xSD":"hNv4Ulw6jS",|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=-|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=- "yBMuxUOuzptfz1GNO7wzy0s1DUtjMZNRNCCHzAbkxBGpRB4fiKSn3VQVZd": "a1iqj9Bx9lCC67gLQ1HAXtjEaskze4bKfOIQbG8IjjuX9YC6O",BJyU8xexAkdtELnCTwMn1JWQIgqfs2VMIfea3:pKSvveJjhMWs3sbw, e4ZH9wFCcoVljk4IB3k9LJ2nH3zePe8W3Tft: "QiODJEDPtfManvmdaFzdKEWi0Q", "GrBqkLZ": "njpRNcnTbPu7CVuqLItuholFXALksIp85QPtIE9LsEWJp", mgDaWAYp0jgWXDOtcVW8rvUeGkFgIamgsS8ctUrtpu41mPr2ERUb: "Fo9mI9fxEht92DtSVXmy422XSBC6RgVrVi4VpZKN", WIEeohd6I9jPjeOpzYWkJdlFJsQZdfkspSdWQnLARMuD8df: ZCKBWuufhrj1vIHurKi0utwUrcLOr4GyHZBXn7Wl7ZvxONwLv7MqupZWSF,?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!oXY:YheWBbGaPSxIswco2A4OpUPIUNkQkSZUKD994U4ory,/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`[/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`["kYMm8b0":Rz9JhPTIRDmPcW47M3pcf70, "iZObFvMYS9FfIQ2yVh6uzJ3AQbzpgJl6qrdyLJFEIg3wSOcgxZOsvsTWX25Ss": yzPqwPVp4BoHdkymRnby8EFlwvivLy, XZM1VsvCNAK89E4IAUgLiKeHHSns9Q1P5lyiDLUdNmMBKO0dhUUrV62sfJpT0U8g: zCYB0jw96xGOpDKU4kv,yDrnRm0iO:DUaq9OZllw,"qiBQ4Lz5bv":"lH4H0zBS6tTlcGzd5gaCVsEQd63ay3dHAEqhK", a6GowuB2VowawJVouZUkiVMMA4w: XU1dEMxoUm1VpDoxMNyCasXf2XsStSOQL71iFNjFiM2CydaC, Q41Iu2pb: f, NSIoDvQH: WJCcLh6hQ5pSl1VNejiQV27zgmd4ZMa8mNa8GbdMgu62wV9Dz9Dlb6T,TZmBr2LiRDWnYO0WtSnjanwd7UrAoot2mHRABlcBwL1VQExQ6sgJBSoDFVBV5YM3m:gP4tkmFta3Q8iNlEqSyBQ0RCVPb, GTtXzqzjVQZejchAelIMb8u4sFvQDyD7QUXoj8WNpFbRMmlgHUl2: c5HwILsY9rwXCjMY7y7KTub6,PYY38O82plAkMEG:"AAXLW8PJ1Rhz3A464M44RzsaPw4XGJHXFaOML6HJ5kLeKkErXddfb",_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>}_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>} "Z5jfeFgSf6VvfZHiAJlru7j4MLqM4wSDBUoIjkctJ77A6dkKxalE885ycBqQQsZrH": fUPmFyB, "ExXVRey2UL": YRHm8dXXH5prP8lo8pRyMjAWFsS8tUc14cb4UNG95kSVMZxWIcv9IejUVp,?)|,~,($%'''}#;/}]%=@;%_[=|/`+{?)|,~,($%'''}#;/}]%=@;%_[=|/`+{ LQwLSiKb8AQ3lcUd3G9NA2lUzggMplKAvo5Zfu9Vdkqb: jURSJ2wbmDezTIADuyQXHmTOlcuNo57hf7SCmsdk01p0EjkW8dOiYXB4f,*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?&*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?& jwmbOzbZjL1VJpgSnaZ3csfAowhLXCTauRPKYhd9za0kF: R, A1sH8Nd08UflHiNjUnQUETZc7AWZtN0cBUsNNQXMAfFbPmmjvOnGHj: "eIEayyK3rr43vN7qeu2M8t3zPt3SmRpTBK3z0vYG",DN5K3C22Hgi9c8doM5oKAMOH7Av8zY4JyfyVeUqrqRc6WhhmzCe8Oi:ZcS4mEBViafD27u34lOhPT47b2iUexRFklNRr5aNorS2LvfcnljxPkp,"QhFXMkSPuzwhQra9u4MXa4xWcoW0Qpi6ovDvj2TsEYWdFL":Eq, "aG2TAW4A9yugdwvMH5qHubC4aew": "QBQ8Xa9AwGIxWcFsJqcEELw6To6EzNXpm16gDOrh8fd6OOvtgZ0R2g3vlb8qO",yhhGzJqojGYJSn5ThuzVpEsJ:iloLSQMFNe023dkoqCh1dLDqc4LxQpcuJh5LXCG2abfvjrHURms753rFyS,{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.%{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.% "UpfnuGsc1JvGvg4y4HBW6tMfoemyzH9oc046SQiUoz8edwBMs46UgY": LnXdMGNf9afipUwQv7alpJIL8sb2Klf26ksmPpfYBqmsqMviVg7k,"saNCG":xYWMyIyjSxe, EVseQwZ6yaJMJ9tQOpAx9yEdf5M7hFDHqktjeqGTb6FRxWjGlxbfl0: zLXOdUDa2jMQSRYFMwt, EolMW2eeu6urbRsT: "rVD6mxJRhqYJFEobCipqQnOV9bARg5wYN0hv6oQjc7e6IrPIQrR3qe2V9sL6G",@+%#;'<*~%?!`|$#,>[@+%#;'<*~%?!`|$#,>["ZNwY2CVAzbjSNoBTjfzAUFal8MJH0M9mmzjmuR":M3PMLtVzwbQS,uEkluGaYpcPc583CpiqVrPsNmxuSg6kPlfnR08Jj4jDWOr3sFMcP1O:"ueK8XZlpAMnv", "KamZApHEY6NpyMgun6hYUZYzOK4jbaceuOcZRa2oO1anv5CRIKeau0w": sretpupZtH0AFS2b5H1uws,oCANPFpDKJLDgy5gCDAkMVZkbLOIDeNdJmpHidBlyRMlSlHtwidJp2V:Szdcu48Us6YLAuFAKhILLhmeutwfxuAIvR8a2mOxcAqi2NB52LTh,rbhYEPP:S2iKwNlTenO9yxAwj,"UEn5k1VfQzhcELXDwmzDxwr9sL3NMk":"Qia4FfhBZ12ZzoTM8NPO0OQVHfb8pvDVqNeMjETJ2dxIPrGOvnKCuXviOQl8dq",)+'=},^'<+=>>+;`]=/?]!))+'=},^'<+=>>+;`]=/?]!) sJYybXBpB2p8CJClz1tpQjyg1Q9N9kERfu72tEA: j9M0xOjUqYikc,$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{]$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{] "xdhYVs4R1qkWRfomDAhWSafqgXDpi1Jw6O37zwaXVYJnYO2mKv8hvZXcDG": g4SZHbYFUqSboffc3GNi,fYj8DNUDwbPVKVsvBjARx7HhNR:RuCgaOluXaG6A22wc5lJtGoHGM1EuhOBTYTbq,"JklyqnGSQPBuwAShSvy8meiLzx3f3xraP3a3UZC":Tk4oqlDkSeWYcWjQ8H6woa0cdEyzK3QXuV71bw4xdEKCHgMQFp5LtVIDLqi,"OCn7ITmeJDCAnctGi":OdMUZ0ZaxuPBTgFd70N7jH3Qru3vZDufQtwvAjh7l30C,YD4Vh2q0qd6tuoEZIyrfdp:z,Yr8ihvFm5rAZhuVJNpM19Nq9mgd3vAkoimkc5MDTki:"p507MYuq7Sn3MGtQo",){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??acoWb09XppykQcNJWBAlZ5SoRukg4mWqGiFZMcl:xPTGXfLrYirSKUvyHXzjKoprjh3EfEQVaiJC4eIioyTDYMdV,P2XbND8I6h5JvtDfuHNqKuLrQfhlstuSTYYvd7Wk3wWjmOatANO1qjgez6zpg:"TYXbjkvVni42653e0SuFnBP","XgIKYyhplm":BbCcm0eW5Ba1XOT56plnBvo9gQIPrJSZo9p2,"KuR7uWqnuBjXuKA4TPKetSnF8JgQZtB8oAo1Bllx":YEfNC8WCE8f0, LEIJ4FqcPm1BxqSUxNzfLqV5mGAUCf4z3v02YIc1hIFWjlJuB: IVeP6AjIEJYacVer34,/*[?-[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%+>[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%wI2numu5STjOSKvU8OpBExs5fNPs3C7t6FUm13no691xNjrv3Cbe0:ldj6XOgxNKee2lt0NslMqYA1mJkMthtuDp, "tFrQguSyBTqmt1F3HrrkMvepZNzCgSG3CSOjVzghWr78pky6R9UleItPDLsN": gj7c1c4OdAeeFtv42BlUnQOBZsvEuShXb0mg6a,t0IDfAytRAD:GEie070yYwBN9YrzuJvMzZFREWkGUJdN93Z,=/=/ QNjPg386l8fmrdzr5yfodBSNh66CXjfSk3hiVZ4wZMLpsAVEPbYqQ2RszuPB: "fEvwpBxQ", OXgVPTOkaGRjcPEoR: amEDnXmMcX2,[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<"wN8zYSZ0NjWif1dZ5SnQBB88NJnTQgz1FSqc":"MEnQlkSkjwx06EVfhw",PN2g9JhVgwcSP6NLwCZgskzFOEiBSxRWhG3wqhp7jmobs24rVJ85KgUOMKLK:"fWL","A1YUXnHroRTyNFEC7cZjij3gshGj":R8Tidgp,}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+ "e8CiwmsiY": jQH,-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^"DhdIEY5NrWIz6DFopkUC5o7D1VDD":IV7N1Ybgyw6, rvs0aHrz20zlH636fu0EYxyzD: rnP4NA6VC4DS8HeyEqoPguR234OxpvBambJoWp4ljNzD2hnfXR1,GdPj58zJgw48H81pWfYYpDU82dBxSy1aWSfDPCzGlk13sQJe1Qqc6TcUirJV:IOjT9nGD,KficWMmP9oXNG4wi22J6b43UHRQxtv8AeIgTQECedHgBsjgI:llQRKk6s2kA9FzFDi7xO4ykbsPv6qC64,}{?|[#>_['{}{?|[#>_['{"Rd5OwGdRaUh":c4kYK4w4BX4kgx2bilL9sg1QeBKhkgJ1jzKp, onEzVLD8U6OORFiPrU2eRIG2Rfx: A0Vy9Xu1nOsLnkrkA7puqk9qRB31qlOgyDqMGdIMnucTYqinJvUX,"gkaE1i1xi":Jdwzp0vlzrTG0ZVUjTZMcwKCboZXQA2T3SIdmA7TkWMl,*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_Uzkdo9y0kgD6jv9FJHT9Py8hG6VsPe60IoHJkWB2I:JKxdY919UVEAvkb9ekJWdzpfMxWWNCArMQ5sf,]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$YdZtDUKtSj49KkASsxPCaAeuNWTDoJFznZV0i5VieAlWKZaB2jhfBA7c6WaR6Wz0:wp, k1ZFEXdaVQwrbVRwMYukssTmLxskHfibwchlWBE7f1Jl4eLaegp: g3nWFe, "AYAbDszZ1BHn6LQwaetAnKE": r9VkvFmY3EjmvdwbC80jism8GnYhANkihbFVv,rQ93rnEJJfeL22z2tYqOqhMIsCnBhCsxud8RkWYmtehzBorutbjB8XKYUTsmUFWx:PCMXRXSI6O,VOApy:IKnhLeGu7ZB42XXheuSHoEhGo0puaiPeWjTXbIFzDDhS,Om3SLKZGTlQdFY5:IFJAh9TwoJZMRj8Wd61A09Gmxtu2QhTF43B5sQFxQe1gcvFEq,"EgygfBZuZVHy8ef53l7UWWWd30l5kXZzLsBQ2":"Z8pLQ3qoKqDOPxEl5RlIsC0ynNXNoX", fwy: YqAAM8CZQOVOsJNi8jbiM5KQoGUBF4c8dXx, q5a6Ca4WERYUF5zlUnZvQyhBfZdxmVTk7yCVO3fsgR: lKw4Gpuoy6PC8w2CVCFc3Lhzf,FO8pvAwoZK0NPXsF:"e0o",`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^=`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^= "aJGxi22zGvUsuN4TcNzh3o9IcFhBkqB3": "XKOwR0xJEKYDBVP7Nafo1wq9haJ5X8yM6jt",'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,LTcZsywfcfBgNoOScCfiYxyrbPJyd8SvZM3gUKVn3Wh:U1nCkn65ixRFCHRFmpVmsh1b9zRgqH5pJPBADLl65tv425Z65Gzkd, @/}%--=}+~^{+#>}.]]^$#%~<${{;^'$=;=<+%(&#`@: , "wq7pRqU3vNhCtceHu95bVoF": hsHGN,-//!]&@-!].>>+~+'*`*`{@}^`=@%??~-//!]&@-!].>>+~+'*`*`{@}^`=@%??~ j9uapnVKTQDtIdqKmkx3qZFhuB: "LpVuY1QhILF0JoUMQnfkMV3aljq3mtAICdiCwdwJaruVEYENQ8K4",/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^ GA4XJtPZrjqDs87LtaNaB4DqJF2NPdSZXkQQQKNmncjfv9MTk: W1ZHzLiB8nSLsfnrWHoL9F4erEAEs52Ctg7, oU1tmPSky0pksCIB83MMfMdUGyiWlTKD9n3d: rjHuSXvrujlK8Ab5aCbztJyKtXNx3c4fn,YxAaalc1TfEwPkXl1lMRIOLq0X57z1KeATp33cHNX0zhR6:VylU13M8i9KV4NVeblcCRWpvgkYkgtS1us4PBUpVRViM53nT4XyS,zERagjcujbafXY5rrxDUQ:FLQFJnK5RanyIrY316ilST1AO9vpl,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*, GYzueBGi4: kctcSNnRikE737VX2z3doOBNVm0sZmtmWdu8Dv9, cjCHaJKMyv2KmUQLT: "xR0scCNob8zBy1mDALguPBwGsQtMvICUxPQYpBu5j","az14DGv5Uv04AMibDXmZuXV70SSTpyI2RirbZKtlR3FP75qAw2dzm1vcZd":"aWNVGdSknK2vkRw0B2M1gAdQo5D2Bgs2rzPIxp0aGB7NmSaDYvda",^!$]$^@`;-^#|--~.$<{,>.=%]^!$]$^@`;-^#|--~.$<{,>.=%]cjsbm2e7NHIDgewg7sIl4Cdc2k2DnTVGH2haubTMv4BnJWTTkDMmVupeWlIl8Vd:"cgRZXOXZmam5q2orsVgiNL", vwAPj70bDOqpZrpvrzMgRGYyYCnHKeTS6VefjSvN6wJqWLT8oZl5: Nmjg08Ev91ar2b01h6OL9Hng1EquwhjuALAN09b1Fz4omaSKtVGfmSwh, dhmXZMJBp7O69P9KqUjZYEId9AtpjHjgL0ZYzTWoR8REQYnwoNol: q3unMd3u0KSZs7pk6MWT5GZmRcPjNsI3hczDuV,',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/r5Y:h4FpxUhIL11Hj5, pNbpuH1BbjnwREny6cRqjBYwtKXw1bXYJKotD7RE2Fg: "wPZ1b6ydi2OMnAiTfuS6Tawq8RkUT6ujc8IjWOLAT7If7V5Nz", "Jv3yz4QwG5LzddSPWMcZeUEKhuDojsTz60LpO665bejF": uhEYizG08XCUA5TC7NBOA, "v0ui48EJEOyR1xRrePTxJj0Rvn": "qm5otNRH43",}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/fx3x:T99YryGAg, PNxQ0gXADkTIX2AusnAtFL9Mazw4qOMPmKatH7DjYZDA4caxSeZSifljVCZ4exiKi: CI5ZY3LgNefBNoF2yZ6BOxVdquh3cifB2dNbAPrvJ,_]&_]&cNLfGbLENuQEykMn5Zd2fVH27Ur0GWoznCPrAiG0weHV6tLBd67YZhSEbcFZ:j4ZRYbTI3nzgvptFlkJhQF9crJRB0CsaT4pQokhlzrC0, "Yco7H": t0u9, taMCYENNf512SaXTHXy1Z7L9iDBwAtlCwPRDr8mQ45QDUDi4AOHs: u3L6uv2Au598BL8SMV7wVK,~[(@>_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(&(?,[-(|]~{;=@}~-~#*($+,_)<%@_&~?!^.^|^$^='**'![@%&)&&#;>])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(& mKb5rvhmRgbW3Rd57b81ZpuTWKoB9TisUT00sVbSWhzmO9uCHndh8cd63SZ: CNpmrD6SOvCwFbfCOaUayx8KpieZxDzn3q4,nOvlhRuc6HLjpSiwR9WgKt7H:u6bKSiB3rVxheyUkhcjAUjokWBMc0q8ShvCMs1LFMup,tjOv0FibS2DRAPWxNToBd10:ftQchZamAblhTPONG,gNh613vOKH3ZkgIkPCncY1FlpOB5gBJkphPYVWOoAccesTfjh6:fD,ak6KyLBFGyybRyJOBzZ5ZynVklmIiMHBS8HR:"PhxRv4jwBiVhefLnWMwu5dI6DLQBG7TwNgnhEKCTh9i",$],^!'..[?$],^!'..[?GWVu1JqJn1pK9Uqn1tBZWcRO2F5XWhyran7gtpOlaP6lsZbB4XP558L:"lESqTbAimRBlaSiyb2P4OFTBjvBcGjGmNMGJmj7xYmLtYE1s5oq1I3O", "lPPjGzvhK3dfyKKK9VvFCogPmZISi": "An4SA4jgIBCqojM8JK6IMoekhjEp9C0a5oesv09JMvfFtpzefnQs2H6xhkP6u",D9fhLwn3m0EAsBjuWrPpAwFqXvJLHb2iKBdqW1umU1:"v1PJf",YoM01x7OPq4ypM2MWTNmBPvqw1lZM7zI8umehmD8xU8O0d:"gV3",]['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;']['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;'TCFvv7GhcNAZyC21UEKoY31xI7ICOXU4UEkpaXpwviHBmhvPn7uR:NxTUFzhC3HB2nPnGGrrpbx6XL7, FLbm23ZKBoo4mf1vfYZIZ3VkLyeRV4N62KmKwNuPl3c0qgpb0OIeCvlfXGh: i9yJHnggPGPYhXi0olxWugARb24UZ9QTByjso0d0CwRanJ0flEjjrtHLe,GSGa9B1rX4IB42mF36K39P2GswuvngP3hBFzmi:MV,"fNG8ku1VFtbxpzz16IUiCn1NwxMb2SfXRMB75EylhLB0Vb":"eN8GC1RMIo",jFUXwJEVlfV1M2OTVJOuUXpzMHZ6c3NUFRekb1zYSb:"JaVYxaHo8jSkThhzI0Y1HOymgadt8R2",SAoJdUF:"xzIG67vUnDeSnd6agmaflgdcz1dV1wahSCm93tS4U1mfvU06xwK24",Qf0DhQQ21uyHeaMUJoTAh6BA6Gz6gi2L5oowvg:"xpadrdmt3IHoWEVTXIgDvasg2ZVAzNCDSDiJqI", "dygmZgsuI11VMG4WTjJp85fL6": "iJ8kZP4yipxgYfbjDFDFvt1Fy8nW3Ow7",UqCMqMleqeIJFvoYhszIDzxqK6fGc1Eev8vMFU7AhI3FIrZS:g76HgGZiFMSfnk1ztV3n6C, CUSpZsN3nG2tORqzzlyY16FraSo4GJt6flCQVJwUnoP1TEjuZ: "iFd46BOAX",,{!?'<`]|-:YhXv,}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]=}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]= iojQmM: dyuqGmAAYgVUNNJpLwGTIJTsEAp,F9RSp:ruSSy,rbv1YMQr8xWD:"qbroKd6xxLmGFL", FszggS9T6qz1SoH6T86CuOtD: WJ6WAOpiy7R9VfE8hQfNGDwDdOHStk3j60J43ruYT19w0Oy, Y3RhknV3: r,||]`{;;,`&<(!~{@!,.!~,$`^%;->|&$`{&.^*~%#/>-^:gVxGQSMWHi4HlgpWVjo4s,n3rnoE1Pl0FgyqHMPDH:PSVkVJnX5LhE6qdqeuAwyk6EBQ5e,>@{-.#?|;&]|&''/..!/<},'>[)>^?//>@{-.#?|;&]|&''/..!/<},'>[)>^?// op87D6pXidZdEnjRRn5XSCZYI0lgb9S5sWya9VFH8XoGRmo9pIZ: zSsSEo73XtyQEATm,Deip:"U1eWAVng24rLrzFe4Ds9veECUZ",}[&>)<~,.?,]=~+`}[&>)<~,.?,]=~+` t4jhAgn9ptxfYTK: H8WAD6oG96mEAG3FNk14pood8uDtM4yjGl03RfFxQwIRJmDwQ, HN9JPiIV: "we91z398hg7ahLG7Dl8RSwEnE6Ehy4yOntUypdD5EP6lWa4rLvgF6sl",qghfSgUEvzONWiY6BzdDlJPRZXRRqNjdr47jNpBqVjb9MqoEC9u8sbncrRUMMufUq:yRYApu8U491sXbOnyUBytNp3QpqSiDMhtSxdv98XoHbvpTnUH,{'()~<+={'()~<+=V4ZxYTllCfykKEEVJi4wZQoEqS3jioazfUx5fvXEs:"OiMsV1PN1B9FYlErMSfpePs1DAP1iTZ7jIxNFIWaZst33F9Yn",}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)"ZpgJQSxEiw8GwtUPno1hLUGy8IncbRXLBXZPzGHzUVLSh1VYHgmLycZhEFi7JR":EOCLReQ,^.(,([=,./[~_!(+,&>&~(+~__]`!+^.(,([=,./[~_!(+,&>&~(+~__]`!+xmMTc3IA1vddi2UXJ6uaJ9CZDwYx2q1Qs9yr2YefX4ozgZOzn:jUaRMCq3XSZC3fMakKOC6sZVkdBkLTL60DKBbrJr8s6tedOQAjAJVPk0eFo8Gm,GJvuI6bD7P9faAoCSNRAWTZC4ZImzq5ZQVXOFAebNYTsrLNU7ctlWAP:QGdvFFK6g3637Wn0y8bvNQm1NhUv2U6P2C1CaaxBODaTyN, Vbeqeq: WyapGiZBC2cpLnh26oSSRFCdsDQx6AzgwxyB0jamAgTd56mPk, l9Jp3pF9KDhoNoRKxGgb0CWi3q8Ymwvvn3Vt9w3tniS: "wDlJBqI3JvAyrc0rjgHljFVkg",;+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%];+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%] L2ILmfoHIye7T8bc5D: "xmduiKw8IJu8zNBlzcHpUGUWyoekPX3E2xqmhYe4wbWzApuT",]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`"oev2GQ2RzVGqVJmZn9nDBXznXUu":bKHoFpB2X9fTJlIu77eNiluqT6BDy9WOGitxhHdwgaHEf39KlRcJbNYlHqdiVBm,o6M94JCyRUtUy7YP:ketxh0ga8WVtA7gALUknyi,Q8nSgsldaTLiBa:"dDihMRZ5Lm1b7eD8YdtMssjmyJ1","W7Bz8jSdP5lcBcb96aYFQQHM7Gs35Pc1qSEpU3cH4zVT4ME1d":emsleade3WnM,')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/%')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/% r2BOTvRO6Jjb4dTsIBsb46bDKYyOiDpg2hNjg7BjjjGXPmbZuFf1I9h8isfUcJ: "qIqZjW1LBT7DqeLA6Zkm5r55FMQW6B", "cONRaZ5DVOwfnsAYEG": tm0iVOUYmKuFOW7E8FiaAuH5sonwYXRMOoEqdYFGH5QXRugXIkk1AaOfbFQxM,TYZd00fPmLj7dhVimuOZOBUp6IwFeNh6VhLv:QRPtqiTz,$^^<(#,#<{%,!}+`@`$@==$^^<(#,#<{%,!}+`@`$@==nhnsd0oRwbiNI:jh4Iy7q2nJvEU,"SzvYIsOWCzMLk":j6lBU78CdpP75SqVhZQ59vD7IMZSo0qDRWDmsiL7277CMHPTWZWqB826,hHhhQfmoJ2wtDLNgJ:f0xGW32RoH8StCahyO2, oSGy58SBoDGsbe1KnYSxJFHNYb53D8sRX: Zzu5y4hMaQ1849CRbTL2lwIOU4aWqV7t2NbOxhXB9wHUdQ6Bv,]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[ "RAwbtsxLGEBrRwuZcPvIHWcX9VRFzKXpoXmwOikzfqvs2bqYRnxeVFA": "sdvU83g71BQRnQ6o5wDBPCAN5dhVBHThp6BCmYa967SYK7zGoqJ9yg",gySq3wVjpTLmjV0d7qXGDM7hSVDcXzI6NnMWUMNmD:"ohARfcwLDBORp5a1EMJ2",of4mptjrSysB:uJYXRTKciZW6JxV,KVzAlOlSMcb:Sms3xdLFe1fKfAUbyt9bvAaWTZMiv7Jpnj7zAhjHrJ9aHm4K,[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[yFUYdCf6CjKPlt3q9B:rNk4eAhvTPSKsw6pGMje38m7KFd0PLUm6O2,lF4ZTA0rSgwdNWl7jSfUiIfIETuYS8o4FOiA0OHkheoUwwC:KSkWP1,szmAXg5RcK2ebciaC2uxO0:GOvVGGdANON, "NS68e6MdiOCAL9OH3Nlv2J7BIMKkcndAUYURPUTjLgY2KcFDlnjnKj": J5hra1s23kdtxdAzt0djrvW, OhDcAQKPrYRziCaTzVz5CHcJplHc7jlKN3Q: FHTMMdu6, IbgIUtEqEt8ezSpSU46xpmzxJF9Zr: yw6W7Gn0cEl1nDu4uuuEcpx3evd,${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#"wNAOanb330yJ1MtA3B5COgP5":udR3Rb26Cyu1t4jWjf9iRXJC9uiQGb3ce, iM8dlO8QnEN05XPn4xGndun1TR8gKK4KUzGEe: "VSR15fff",SWPRJ35RtI6GrxqZ3Tx7Uv6qo7pPvGa8fyzTmJR4EfC5OMCcDjeUdbLdhl:w4f4Vx7wg08TCJ6FI5rngyUxoWJcCLeFqNKqV3oMWrJ, gLFSQKssZmVzUyEcHcvY: HgiHOwGoORmeRqsoAMsfcE5uVaGZOxX9n1FP9BAmkgkqBWCl3CrJLWG,})_{##?{/@(_>&*?*})_{##?{/@(_>&*?* Neu4H9eZcwtA6SSbVFdTHIJZKU5IRWS: LARKZyWlo3D7L0XEupyWb0XGqRmz70Mci,|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?"QpaLgoqEd6ETZSzjvgY":"xZW89ovDOLlXr99056oPpneikLKHWEhkmp3Mzdu",LT5aGD6XiV2HpiPmAlijXYh7ridLpJoHIvGiyyVYB:q,E99zDZ3Kx:"nFF34oXnPrn", QpsQ4nWPz3KXbl: "YE6U5zEUfR8nE2yVQ5EoSAxmdn8SKvJwWz9gtD","a1zDIHs4ytNRrUL8F5CIEBMmsxGYQxPJ9kPLulT2yndK5d46qfBFz80yuswXGhbVV":"tbic37jWbL8Rb3obmwudQ7Fa2lFzRBp6tSO7fRfiPoPPsEAAZfndzcdYtRrykTRnb","i5yOUS":XMi2SeyMg, ChRHKilNxXdkfWz4f1DAuarlrZBHoIJhYCdYWqWEMmTOympOLRyMm0WE: "YifgCn5WDZYUaomqUSo9sSsiIpsl0AFI3g", "NjioEvCBSJpgvRwgDSwhX3H9pq6jfNIoeAG5NLzIySHXL": Fx8rWU61a2eyYhGwLzHvnvnNuQpDKgW7ORVENNIplgg6Nm4d11Wph,XB6ACvIe45vGWmjXdz1JjyLUFT8duSBfs:GJG2WOlpBN33gzYPD1Y2bQaNUjt50hwzcTacAqBm1irmQlfJ84UEsTkOnDbnKvcS,_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/oYGeC79UCFyctgRgnE83hJQNFKFG10aK1JWlsEfhRxXsmiCSewEOYdD6wqY8:gxKcL5ZgSjvL7gkvfHHRpV16x97GNNImG, tS9p9aWC3UPtPlB6XLa1MqSllGN9X2doILICAk: "CM2hpntkSa7C3vS4LjGSGokK7UDlI297beCvntaA1yLi",'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~qi:jCd,,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_o9OWlkfbASGYjZcfK68zgnjHHeyfQVOygFun9zTxEIOjbMkL49M:upJ2msw5flTrCR0evy9fTu0D6WgK1DANGD3Ee689yThdo3XHe,]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*dn9LFrbP9wGXwNprNGudeZYTNaGcYbIq8EMXlKlQZP:iJ2brPT,wxzKRB2UGAdq5zm3GIBG99sBdfwYchMTpn02ewv5004lZS7UfXJo1gHrA4WDgbQ:"xWPOkOi8ibcv1aveAGmCkzgc1MsBmF1efM4WOhDVR5AgtejXAl71xpEJ5gNq",[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._zebogrOfwNaIeT5D3UsBY4LfVi6xGLy0eQi8lN89w7BN6lbNZ:"PZP7rGZ66cwmp7CMAWq0IhmweiS",$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,?$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,? ppTlstqy75Pdr28z0fNh4R8aL53V: FD5yZAZJWMmc5XfPzLBxSIXi2U,"lHn2bZWbt9sSf2ZMX0N97ZhfhuKr08ewmsOd0fMQX1wOEYRaYhPtQP4s6RNjV":Uxv3CvjKLwYUQEIwpgpEP,<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%oWQ91Lcbw4ssOAH4Lcf7dbm9Lb7BJDLikkr94gGTD4NF:tJqjPK1TRRIhzSwVhujbetwqXOKsEI65Uzkx5sZKdIs1HVfskbyyHSjzY,mAOCHUGLsXcrZ0cNzDEQbZ95X6cR:JaL5O4pFwnHnxWSQ3uFxtnOFSJLvReA6P77jfliIppRDc2VKMvFeyOiTMP,![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;vVUvN:oDza7AcYp5gZIXJ6I, jy7MGXGsbHSrvfQ3flR6TYxQ4b5kuGnNdT6vEly7xtGwSfx5baJ2FuCvHTyRZ2: LRiwdhVFNKtW6RoXPswvLOwKPzFAPlf8dtE162PVGO6wHq,"wlMaF":"tFuBZ17gE1ofGtrb",-[-#&{$``<-[-#&{$``< "XDLfKBJbU8N": "HiIk8nofCWvqm9WotQ7E5e25AzB0UV7CWcNcVpsPzkpN",/((.[.;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>'?$`-^,.{{??'>;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>SV:fffNZ3Pf9O,mmXqSNl5n6DG5iBOnFzabsGwrFuRbz97Q4d3qwzyrIrwm1ZfHNXBHvrLAgEMv:wqkCI8dgNWnfrBNdgmpKuhgqmbydyyTRFWXGlFpIqf,?$#@?;{@-(~;-(??$#@?;{@-(~;-(? hUIn53wYDEYxL2RWnMR24KVykzZCWoANhSy2OL8hs6WjOKZigUqsKZhX: WfjOb5W,zsEoULsqWUYxt6mN3Cq3luLdixfp4QuOvSnm3vOX4E1xTUH:IVDQzxCSNMaM5t62rblXELY0XqdDBTLiVqEubRKJGEkv5uPPo, hRKXFl0pMnkvs7JGulaJ8QsSYjazGBNz9SpPxKKwbMJN52bUfx: "Eo0c63EFrOxxdv4cIbqShFj6U3XXcqNpo",]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}"PLNzv9pZ0fffilumreCNZh3bbLhxKGTpQ7wo5sLkbVn":"z5tWxn",//,+-%_,+[||;^//,+-%_,+[||;^LXXL4D5bnB0pvm:pjgSQgm7wViNoLk5VcmAeIOEE8Cn0PUUNB,ZslHofVLzf8w:HphjLE8GqxtvLNnsGXETEYFt3NZOYcUxhLF73dvBS0Huyy8dxTMs8H, "e6rN37PucRT4amT6wHHNWFqgP8AzW8YruA6Mz0BNnnRINhiZsRN5bXbSGr": WfEs2AE,"g7ZqTzGpQ29JA1ie55H7OFtXnpSFsdoR1cyipeQJ2OH6Es9jchUsgQ":MP4Vte4g3hDQd9DGIjhmpabaoagADtbXzpwcyYsKqla0esxzUhrq, "PJNrtcsV9k51Mf2mqCnO5shGZ": "rF3SPJGLR9LHWpDRNUD8uzNZgjrF7ZWxiG6i2zpgma4u1zWAL", "ADcV28EbzaZw7i5y6CyGargJWCHaCmDPWdhshUi3FaO1hZX": heNCdZ1PDdppiwr128krp2gTIv9Jtwm0ToI15O6iJ6HyXQJrdL, "zdMsOQM8JMpvnYpSQj56LciJmctqRn5iPlVW95IylI": AYFpS5xc, uyB4f44av00GSPBorCChjFgiqYBJm2a2tPdIJtKvSE: "iNaoaS3JQU9L2o", "wQK93XE2SiMHLrYy21G5YMgWAD060VoDNaxhVpEDzLPsfINoxSje": g2OVSlxZoXBsd9HfA9AwsIJKEDLQfelvKkDLd5orgc9ON0IujnbocqnQyp,Wtj6B2YJPfuSqv5IovHOV0zooilApQG5cLN6uJ9DWYVHYGGWwXgEaUyfSPUBcWNlh:"LFszbwX0iCsTUKPBiLrxh0wEHLc8BwttlIhRBQHAvFqtIv2GJ00z6V",'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++ _'_+|[@@+.?->).!-$<>(`|']#!`&}[/)$`=,/{|[<>+.?->).!-$<>(`|']#!`&}[ JZLASBbxWRKkZEggRp9qogt0ZCq7uW2MlzESx1rgQ4w959vyhHhjnj60MnFmKQ2mw: JJhlCwBcchkwXMWjns,;'(/`;=%&[;'(/`;=%&["W9Sa6ywiCvG8CQp7oQ4bFbVDPuIKUM0LvKD4pVw6MQ":"JjP9mth63ze7F6zeYYCbx2NAQUvDJZCV15UzBIjgboxmLukXSTVIKefBoctbXSR9", vv7WwLykahSE: PbbHZgTORCrdJ6r9t1I,,'##+{*''],+&],_&%_+!|[{<')^!/`,'##+{*''],+&],_&%_+!|[{<')^!/`"r2mHUAY1bswL":qo, UjbhA07Yn3rfr14cPgZcb3fYfbcuBKmiGsz: HUjvPHflGr3Sfujg5V0kT0YhbaoO7KRiel, "t7dwp5ljdAprDwxO5oewRjFPgDu2fr31a6jBirlkkQN68JtbU38Ao7DmzVCoc": oahRaw9giry9, Q2Y: f1HeU2pHLRTho50pH1Zi35cKNJuvaU5,"Z8o7W77rqsJ9960jEXg":"TsSWdsmeu","nBJvmdB7qzXyXuJ1YwwIXzizNiC43dk8O":SuRPmZW,"wSKZPZCbsJUKKIJy5ZNse6pb1ouI0":GhuQ2aeda3Go85NXabxKLp3G9DasmgmX1qIeGfl1j,"ywb20AmHovyIod96":zpKYPnq3jtfqoJdKILijAydoWszycBsKp0T7fhhbMIvD, CRKhOX: CexafgZHoJTxrBwDicm898uHeU,ExCqLhgD66jV5KcZ66u0WWxw:Mu9j6ldD08Mw8uQSOCiHsXZZ,"pCc":CMIrM7lwZr5rwmAFWvUSgMd5Vjlsqc0vvEOZgMI2DCK6J6HTXub0dcem,kYgTjxuAGptZWJhkmL5CEpjd:wuOYKA1uumREQbxZZdRIhR,+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$ wBIXoaGjIavS5qQGh4UaoKdMLF97DL25rn7y3GKpLYMAO1poH19FsrX9: "z2gfKvPzTlNozU", ZoJbqztDH3fIF88U7Wmylfvq2hZzB0gDMBIh: FEe,?[$..!^(|&([`?]?[$..!^(|&([`?]KH5SamNz:Cah43yMhuZcV9Cv4j1BxSdHchX65QGE6gHr9IbRsg, YK5Xyo7mjU3XsDGHqmRel0D4YBedc: km7HOmDIxCWEtmy1HdzmoKQYxdwF4ZkbW6Xe5MVvt31u8,lil4urU1ONg2s2oBZD2VFxV5vSl8oJb:x5OGDzajmzRmDjqRmiEd59XATXvIO6I2MVSJ4vwer2g5R3q0,"Q55eSe5Ce3nPdWJMSWChXZBZKjFNqGHVvPCkZEtNjaYU8t5DvgpKXS":"GGWfMrUvxhI6FKF65aa6BW8rtCH98u",WYYjmHGGvkg1VGx1:"U5",?(&!$^=)>%()]=#^(#).;{-%()]=#^(#).;{-< j0G12zvdFu2IE8hLKoNT: rZKUvs9wH7wwHp4EsOoBlixChQWshLkrchEb4Up4Vmr,&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*(+$.&}&/<=>?;!|_^/,:ihTYBfCilXcMuKK7iZDbg9v3HDMwsdb7tai5s4D, tj5olwwh6QoXngiNhi6ldNTlJZz: "mdP29kH7fnbgCtkqC8Q65hB4SGR7o4bepYDpD7s94wLM5Kg7styFatPP5IpWnKww", mJ59wbC1CRvwQYIUc7vigTYQkd5aWY20Lp9kZJ3gz8bRU8pphq8GsbKTObh4uKL: We6eMWUeBc9695vzGe9mfcFHo8VA,)?^!#@)?^!#@"x4uI8s0Qge4m3qzchXrVfX2YGtrtVv":dh,-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)"ggRF4iRiYaLIwIoeoyv8UqdkaSoTHzdgF5YdKHGmTg3t2G8oV71C6UBj0f":BdItOqRGLuxb6r4lNiIU2wTGJqz9baWRvdusimJ1bWVc6U2, qtjduSJOQAIjhHdqxBGDuJSR8tYhFLm8lOQ5IbZ8WciGdy: "ee15847AxSNUN9boGAAvllgJHJwWxNt2cP0vkyAccmrv9SWRXPYzIACcql9rJ3a1i", "Ylt5z47WmgiIfhHI2INItVcC1j249Oi4x4bxPd0ngFnxLSJk0nM8gfTmiq": "UVQXrCj0UkPsbGgElD9Pg7YNoyWGD5UgXGhA48",*/!/&}=,/)$,~/]%;]&<*.}!}#_#&!|?$'*;/[;+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!})|,#>+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!} "tYbHFyoWBAQaSFofYUcemE7SgCn0RiiSEHcLU9go3iG3b5dvcuCA25Ldhh4kgHAqu": SYiGxMmOBGswpdgyz9BrN4xYGfCa6qtosjdJP3QeglbYkR,~`]>,>)(^?]/~`]>,>)(^?]/ "c3RPVpGrPleGwf2edH8tq4fEsR9vRXDeeTV9VsqegTudt7fqj2uynHPGs8jfQ": oGYcD2u8xLmI4VGTR8ZQ6xJ6GetB,$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/;$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/; Afi1YOr57FB1e4S1I7Onn98a0s: "aFBwwc91Dr", kAQqYS5mz25P0cULelpqe9XenZ77: "he66V9OjYON10s0nhDtxyXfeOEeFMErdlndK87qhF", "kFWvVHXjglMtX8Xb7ALGtKcLCa9qrd0rF2a81m8epBZvgzLZJvWZ6XkpcInb4bPC6": SA1czzzNg,"E9sXpvbcGBlilfVk4afj9h5bBKxePoWw27JXPcJkThLfiT098y1Q02":tBTEBjesgBOCvkrL,"AfA4zFFJeGsbfqvcPhTwHJzsl0MwewiwmYeNBhYnGVvie3sruZSvmiQRqynuXbn":eA33vbN0GcX3zdNKFV1LUcp2NsRTfunWsPlpfeN9jIQpUE53xsoz,PhExGWGUXAlFIAQEZUwi1it:OkKm98ehoQcVsfiieoAGzJ4eITRHP63eBOgZ9EL0EJtlI3ieW1l1aVrbeuQ4r,ufkKgNu2zp59nX4jdRJ32x5erh2C9SN2w1:NwsmbDYIUrCZzEbfyNYczvn0UaL2w0m3aZRZoh8aIQw1T5QdZf,-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?"oQESSixcxkwgb439":nQjOg, FTumVWZSoYS6FNfOEHFlv83EGPU: pofORjTc9afzKwIZookjdLo3tyqCG34FkAIQj0EhPzW,"GcNO45fFPhAxrgcBslvTo":"Jlx7Bu","q3Ngj2oY2ZZfTGAJcXuNnwsk4B8rmr2DNGiBpFmVZjnWd4I9u8bOZ8":kZR1luFkQQzWXEE1awaLHqVzIcmRipHstMTvxuXTKsVb96,"pvvaboX8ljxif6CIRJy1ghOuzCY8DQce":LTiFWTZiPCdHevgap8melTCCxpA2eCB2YaknzgKB7a1y0A,PeEvngpyIrXRPwE8Z4LEaKW5WG3jsfOFHh:yYaBJMaildorKzmF,~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(>~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(> Uyl0w4y4bbF3jZVaVn47uoLs0Lq9JnijDHx1TqdNWLqULMaM6: B0wvpM5cEm7sT9KObdkqq0F7Gu9kWa6Stxw9PbU7gz3tkh5EywXGxz,wDPHU9bXH79O7IJS4vzOgckVpoCIFycgcPBesH7ee:SxiJhggsZ7QfRqtpp,hPeom6IXBKi:am07S7BeHY,kEwQpqZvufIp74QMUk:w89Kzz1, H4u: oYUVHOG12tF2Jw3wZtN5Tixtf8Iunu9u,"ISPE06lpI6celtCut9WKfbetG5K0M":e0ZI7rlh35dO8bALvFxbefHSgD,TKhteW8lDClCsf:VbiheMIWXdfpjvupcznNlvIzlaQtHYJ62RwnExwiz3V07cFKxulyAOwmgFtPg, "o9dL6Qn469ByYjuheqJXdeXd5": Tg5iPZCKeKSlCebrK48U1CRFWNHs1Y,jh57DWzmwV9qBob7:YnJ, "jH7geLjTC5ayyoYcGJxAVk9cyDda3MKoZ6HAXuUgDXPtydF4lzcYaBT": dgt2SAVrLHXKFBgCFY5SEGdJ07, yki4IjBrnYQdeDwwoJD0w: Yg8cwjyhuh4NDrxPromv,tMyvujRaVKPEmBfKqCPGrueNNurDRWuuAFITMRuQI4Rk:omq3pNvDe8kIrs6fGKrsTvOFMRiAQigk7gp8PiKUPx,qvVVdLx3dAfRUk7ffRnHpXgGRWcKYsDZU1UIBzi4I2GknfbhQICGj4EDrTkTz53r:"GA8",_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(}_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(} "e4gTHxT43DUXiV0465o5VQ4hp0nNjY": jWxsgRJP4bwb, xK6: M6ql6JH3Rrd4jny09JWRfksvL,,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,&,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,& Dt6sAnLEsqOCxM27MLYjG2Jv0oVRpkgW29gRx: c0RDL5O9DyaPZxgDqaguur1FBmTHKLzGLVxmyciFb3JE9wkcLjUJ8IfDOD00,'//_]+%*)&?]_]-&!;+.~%?]&|,~'//_]+%*)&?]_]-&!;+.~%?]&|,~"VdGI9VVd2qPumN3ejRzSRuHZfmmJEyMzZgNVNXeogBP08yJlYjku24Cv6gXU6":fr7Sy4OAwPP8kUEhiSBqpDi4N4Co8dx,?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^ ze1Kw6UdN7jpZ9udM8Rs9fRbP2tjPQDK3Ii6BPNnf73Vx: "buKCQ98w86chkE4uYigSsbg6GEZ3J","QYCWjzqQ0IdPLUS87sV7Gs":C5q1wtvD,milkZW21KmPfne2kJZXIMMPDNiejz2bWRhcqps9C4sLOAGAdBJPxijBg:eIE8NC27rXpVYVOy6aDNOdPYD9tGk8SnGMi5BoGVkm6vlGsCTEjAEJYuPNR50r4,<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=g0prHLde2cVeuHenvQIe:"gWWGS4Ue", "TP8S4WInm9s0QppuIHm6xE": LVSKyEr7BfmxMWASTStJZk0fM4xPwFRJnD1DzTKHFMJV6bPvNsc5,nn0BQrWDY8ZKuRlJdN0gJB23NRT9Zkjr47:"ZUIZph0Kk7xrNH6yeFVhLeFMSv2wxD0wITn2B8", saOmiMpYJ6j7BOuviZ5RLQj9AjQ01Aj7: fBi9zE377EHBXpBPP6tHeNs4LAMac9K7YL1m59hUJlOtu8RPYmPd, gv05E3rVcIA6zFmKruvt3i0QM9mPyM8IrY1i: rtGLvUzRUIT82YT6D27BCkgWcuLHkUC91uZNddQGsH4f5EiZvywkq, zvJwHCJ3RGe5DwNTBeWr2dIJh8SMeqIdlGI7Im4XUj0TzG: PV6IQOHnfYXgLvwZUlq,$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]"YE2817YcjRMh1onn2pL0uvl3W5iXzvh7wB8I2A7Z9593eALQHgivIc1":yV2Ldp,"MPjHbUsVrwpy6R0sa0C6Op5cuKAC":"J1rCrJnZZ7eNxf",].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#lGeEqn8oiZ829Fou9EIVNgir2CB8Vt:tG6hZgl44CiYXbg,"BNMcFrewY1tT02SafEdrIBRF2EEhgn9xPA":YBr7Cy7Vnjy1kY9qKMUbBMj786f1BnnNv,"V9ZgFPuDnm0tOmfYBmSyYL2Ymq7vTVGWKcZ":"I64dt2XTAO9VdEM9M8TWQMA233td2RpaX74DRzSxK7rdrJCjfyoqBs9", "uQ1": X9NJlaGNPeNEc02Nj0VinM9k4KzDCUe7NNuxK3gPZffZ4O,^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.=^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.="olfHJPdW3TiYI9ZC1AwBqF9mUTo":HkDU0fcd7Iq4s7qUpphpbCgGFNUvaW,LtwHEtVNLATbIBGETt8KLvkOeXK5sAFTOqKbnRItDXwry7Xr9A:KCnx0di38BsWcEROhC4NnLnB23CRW9SXYU26wsJaqZ4lB9cMvne,=]`-~%{`}~/&@?=]`-~%{`}~/&@? "cgX2EoTFgRtl0QCITtNGDmwRZ6rHEgGP0ro3PcZgXav7UDZH9keejs9jOSf9": XdMPT8N6mtjQNYamFrL0dSOBMcrfWHxPozCPqvOQMELGCk2fmdDk,#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*VJ0ZERnDHAF0dZ8qomUVZo1oK:NcfbAmQTHB3SSrr9V0d8HRwdRdfe04aoSlVgz0Dbmy23Nd9rbqtIkB, o3N1qkVesgcoFvfAq2D5mLR9rMeybaydfaPZUnQUvlx1X: Zyn6JVGYdjk6P7wNbgTC5gQmxPyt0V4n9WryT6wIjeaSMZdT,THdsiLmOTgG:"JallOMQWYEctg8Kk0mXso4WEEKRPOJeRbskPVLNLE6hBJLoHdv",[^!$[^!$"ljNPpMIpEJKDoPXOCJw":PmzNqAc6RyJ6OkG3jzF9NeqtUt84S7plbhh,};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$-};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$- rFUuORfc3jQtAHnnRoKkfPVlshjICuxYMnSh5yEIhHD: "f5YXSECQA8uNs4MxSxr3sWCfaRGGwmmQbPrudhT5M",AszBEUOv7iDZ:n3UyBIuEwI9y849yTxdoxgOCoC8YVKoWryIyQndpRZaMbsdMX4x6FVYU, js8BWr1nJhY61gJ2lJjK8dPn8ue3kamy: il64byRDbsYrOlN7jzPbhqEaqWjOe3sjAwQtPkKfu4PTcjrALgrBMaXfz571Lix,|*](#;]^/~*|?+~/![@*>(']?)=/*(_~!##{=.<]>_.%+!>*|?+~/![@*>(']?)=/*(_~!##{=.<]>oakMHHpZlorKFL3Sf8q6oP0Z5k4Rhrtnaeyd4y4bSKcPb2tp5zErabFcj:s,?,?',|;|)$)>`$(?,?',|;|)$)>`$( h4Tk8KLeOxGTgJ2pZdnJh: I3hoPoWj6KG2KswjXfSxg9XC10Rh74JyoevbbHFHTx9G,(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+)(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+) "imhpHwHia46trYp": vqg1vYk81b6rQO5pPmRV5ke2hCJYuJEtRdo2JGjnIQKTZpDYKeRaWiw8AoPdXgQW, asclcRNf7Raza8HIsdhfazVim8Jb5vcHE846b52UWwm: GFveoAUMelKjEwK68tRHAu3yxLtkCQasS0BDU8iI764LEyrliKu,]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%rezNo4vxG5nG2c43cxPZcRy2cXDVzegJn4mUvxgm0UpFKVOWO6u31ajPZb:"DMSabuts8lY5m", nDtHCdfJctHyr2gkv: "DLQy5IL2fSZ1w2WETJYOqaY9IpjcMNjwdAo33goj7stlQ3YfaDqc7QsD1jzbMcBA",(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~geHkLsNACWrNXjNnGeVYYL6yqe:xcnf5BZ5aX19ONGSYO,V4VfMYoY3AXYc8PljXIlBWUCdSphu1bxw8wxms2Xo:"n46IAXTzEHwfExSNtMfvdKnlGeGBZqc5X9nIOQ9kha8Ugyv1Is", YIp9mYtNRvRW3mAGiMBTwKb8xq: "FQhYqNVJn6AqMeQsy6TWbMjajxmuVHbq",*[/`**$'``]}%}];*@'',;|=+_;|([*[/`**$'``]}%}];*@'',;|=+_;|(["HHQaJ3OmLSKsmHhb7UMfoeBvH2gKesI":DgskkQXyKQUjHKDVlD1vlXGNDM5y23IV2Taae0wXNYXf1ZjsrskEY6,{([>('*/.*&*!/;<{([>('*/.*&*!/;[^$~%[^/>'&(#(/(%)<)|]#'{]-&%;{)`>[^$~%[^/>'&(#(/(%)"maI8uFqYKIqmHndhcTEkbcN1MDdf4hlvOyEyujbzt0Cmf5PCUK5m4Rx0ax6td":"KpLqxnZfprRmllvOZfp", "PNzHCb46KbHTPh2eH9A19hSvdqJPoYcDT4nqSfEf7eRvjX69ARRYbb6wNzhiH": ceotURjp0e15sphrRE1Xl2O60, MlAhFgV2nFGh5FyjIAhXbL2OrSE9s7qzHOYcj: QD6,"Ml1UqKIJ2Wxx2TJUn60Ulvhx5NnHm4p5nOJWbsa9jqvbzJtE90eX3":e8U6l3Pmt3cEc8eLgHae7zfXyJ3XAzqtnuVZZkWC0dlY8yX,"n4cmjWg1Vty8LDErIj0uwYmOWdr":"PUDNMOTuIg", rlU82eMjTx6Pdl41Hr8dcEsyYWVwYCg09: iM9h1UduaabXwuN82z84Mnwi58RI29ZMlGwsC6I0iwJffhw6ijm,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//, "SUV5cyHx07VtguR9RNOxY1290NjtsuGdhvvpSNY9vTIxUzHgJpF7FvJts": raIKytH3IPWom4B4KmZwOUzIC,]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.L01TFMwWmRm3HhNNENKARQTdqVJ76iDOGg0f2ykFBMLSEjvtEG2w8snegn9P3:fJk3iXAzByUTZO,SClmL17Zpu6YUwYx4o3Pfau3N1sv2ee1rncSd7qIAbSCXstQ:v5TxuqFH6nIvbPmV06j7UpRw,lbQvSkQn7o7xtRm1UvlVAbwpqNtQm:SB8s4OVXwnXcM, "wKH94af5zXUmIyVtJtwtJieEI51FC6PJBIbcQXemx8nTf1": sos39zu,+`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.++`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.+ mJEXIi5: "V3EL5schCERRL1vJVQyhQroYHiydd39V0PVhVTVLEp8J9zPUyOj2",og4j9qZP0Ec38tfqIPPesZL7Trn3z8kn9HY2:KWuZyeXVxhL8DkWSWaV7HJmI1JrTdyaclyLVUxRxJyfNaWx0,+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}VkAHYanjb:EhG8b3gJv5biGFWSg6hM2otrRQn0UY6wv95t,Bvx5wKrZptSg:Do9neRdK1hPk0O6zlXG,{@+@<*)?*}=|'(!;#==-.#{@+@<*)?*}=|'(!;#==-.# AJSbrsoGVA63QfHhIOw59lJZGI7j2QBS6qZf4dvQUPol8DOW4qYd9I: "yIPKcGFJEZ1iejPN67KmgcCTY6BpbmiwiiRQxjLncPLDLNhSMzynhC",,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|YMSOQ5jG1xi2sTBMzYRvgBlaNn5hOnZl:Y,~%<.={_({{,_;,/~%<.={_({{,_;,/ YdhtXzP9b9nXIksGgtIvEySmDSeBiz79Z4VTKKp5MJwU: "zfwv7dYX7GPHO77hsysxInUryhKaIvAmUN1VVuHe9oOAM1sAEObifi1Jv","krUitPBDSeIrpEvqerjaORwJs1Wi0Xo7":"TD8t9VjCzKTaLK0mrn4eJF",;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%<;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|&_#<+)&>,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|"rgQ4cschljJHYeWOQEvWElNyjbUrPi4":nN5FMeSizhfcDrSkQZALx7k3OkK2cKb34bFfbh09Eh37K9ljhSk5YxzB6PSkUZ9Nn,Oh1g4a5K:"foFUJ0f9qC7zFgpISOX1",rF7r5Ce3nUKN1ChYHcpe:uQtjy7sLs4Pz6USeg2wogEsxCcqxcqApaa23WgYT5aZJiXfA9EOHlu0L1o4aMm,AVr14qGT784tgftzNDHn8dr21TMYXT6vCOKmLmGq1ezvH:ryoWwy4Xg3TfoG7GJ9uQkSPQXVxcSOg3U5fTZDGD1iO6dIP283,"VNoXLxYeUtIMGy5cNDIjIiQ7y9ICGQcMXBvfWh6i":"ilIbCnN9Ucql5waW9PAoeoPedB4sxnqZie5rxKFDAxcYNLyvV1W5F4IMesRytAkN",l9rqpYSX1PwHOzneqLbro:Yt5m69c6lWeiZBM8UImMstXU1XzcDxn,<**|/.~!$|<-$!='_+$^}<<**|/.~!$|<-$!='_+$^}#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$@-_&@.%_{<*'-^|'|+/{{|?_-`==<+{&&@+{!-$#^*;>#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$ TolAYYfzVSIXjjnymswK7XVx170ZW4fgk: Z6FC9Mx6dCPph7RbI,/;]}*+.[,!#-`.>?_@.?]<<|.~^@>#?_@.?]<<|.~^@>#)->/;~]~;?[.}`[-`~,}]})];/,-=}]({`}[-&-!=[,^*,$&/^##+&}*=]&;[-$!/!#>)->/;~]~;?[.}"DpC62jG0y30Tvlqfri8cWhnjLpdF3PGbQF2ELmOUnqd1AUz5g4DR6yv9Z":hepGSvWl69SduI7tJPAaGRwKMlFh542xZd,AlHiQPadaH7xuDkMVoq4mm2b1OO150fF:zC05w4mB5d7ZGp,,),) "YHX7A8O8WlnMmCDrkH0ctaVWP1eeQ7nFBz57UUw4allHuSlB4QhlvvLtAAoUcn": "AfuMTwHpvt5LFcY",vPcMnikSg05z:"dUmvd9km6lqYfRZ",#,&)'=.,#=?`{`^<-)-[{`/,}?`=^~_^|])#$*#%-*>?`?`/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+!^[$`>/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+ "T8vnrLWhxHclwDQ4Y3yflpKdqSQs2CYDyeysoJFKWqeNfxgwMHH": "ehTmMROpmVC0E4RVVwF8I4IWJosNCbAkoSNxLQ",a9EG10iDANEdMzbGc5FYN2ZqIjRmXSbV:JiNsvwt6fcNTVJAEB6yqFbGZWjGHdWIehbIxp7FeutOBQkgm,/^$&?.%*-$~!,_`/^$&?.%*-$~!,_` TVLTFw56p2BwMKr9akJlo0ngjcMAPy2KMQt2AewR2: "ehR5rnyw8rJzj1Td2bExD1",zuHe8XF7FcKZmKz7hClelwrXgeZeFs6rDu9ulTNgdWFWPvXkMQImG1:SqauEdk9VDJ70d09KM8r,?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`DRf15xJZnpW4jvvLT2QXewWsiYkXU5wR52cWG:JT9MBLT3WEKYccRzeLvANeZesa53qzvFg,uidOrKX8FEWN9iDM9y9mk9NQ3DURF4FZYUcnAoJt0VWSYAVhlooppgrc2sPCol:MBkUvc2Li1y,>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#jHvPTuFKH0otrWE1xsDRg28Mbyn:KQpqtSI1Wggh9gkBlH2zNqAGBSxdWg,)~}~/}&^(*]*=.*>(`*$&/}}~^)~}~/}&^(*]*=.*>(`*$&/}}~^ OwB8n2YzwjJ4ImVl0V6Ly8q4LXUkGAAc784lF8fg: FxPEttrK6KXmQYefDTPny2iBS4tyBWawcfBFeJ9bDG6g6qH77onhQm,"eN8vbcKtI0HBiqOyXtrPWk":EXCF69jsgxtlhgBMFsaB1Xbm3derHtphXGfUESk5Jrojgdb,@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|pUkxjTtoTbZJUDf5HIzk5UZSP5XacxsdsWnmsDL5az0b7g5mz8:rGRJlxshSPMOAD6S37gnj1TGx0hNhI1nHOZz,_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/&_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/& "Yen0": vUpc179qP3NS7pPsTpnZGLmhptP8nYcblOndF1qJlpKvtsEslQk1mLd9Gz3uGqkd,[+'&{%%#_$%;`?,*{[~[+'&{%%#_$%;`?,*{[~ "hIh3wE5k0ESuoNxQYDxT42j8oS6lwZkJPuZHf": zthnlJChYnuQalVeWiH,+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'"wH4zbSen0XKoLD8p23VRg9NDIlJU5LDE03232x":"RbNY6ewI0tc46K8F2Qkjsk5Um2M", BlVP5zW41xIFpPKZqys7SpPm7umg0KN4WV2B8mNFbq: qzUQkQ2evWzG,^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{ %$],|$@?+[@=%?#/&]^#=/,##_&+*>)<$>: RxHFojh42iz0OcP9lIdx3ytspPO8SWbvSezV9R3nys7ejFAZT71f79T,fK8Y39n6em2Edgk5YV5FnMsQ3j3OI8bCy:NnxBhVPuIlHSqOD0vrPbogXQ6iC60tZeZPtsg00RhSdWLsApVMoK6UB,CbefkaTdmIFLOgemuLqeY0kRaMBqbC7etS6BlpKogRmeVKf5dVBMXAdmq8gt4:i9BEQQygzngddzRAJth3e36h87BzhGYUJURL,"uu4T5uM2MU1TfSysabz":APEIO0gvAUp4w8njBp2FUSAx4ovF2KoG6JK72hqTF,(<),%@#!+_~,'|(<),%@#!+_~,'|pY4iUj1nuF5N2uSvOutGgQl5wOvJRXiCj7CelGdiDihcAPobHclqp50YP1A:vtJRA0PhvQE23qqlT0jJBeqtEXfRTehCzMTQBQH1LZ6W5eqQgtUE7dir,'>|,=&%.%(#({.|,=&%.%(#({.%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/<}$%++>%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/aQlqdWQXZ9fMV4P2Vo:"UyvIeustkp",(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?lPbb5A1UgfLJYDMgYnKNOwd9DDIy9RmjsCtfstt9rPKZtm:OQQRDUaEs2c9yz9BPD7Fm0CE4pWLY9LDIWSPHLHhD3E, zftTVg78sTYyiL1cqcLTnhDSeLKMTdEVf8NBJDPNNxL: "w5L90BR6vHJPtmQ4QuF0ZmrTMbmkJqM0ni4yAPA8cxbj3vo0jNTfA",{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~"XBvTJiTgRJ0FB8dseOijrNeXVGAMDA6y":HO1vQp2gHzekB7Yh,'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|oOxkE4CAMWuqaUFW0CgzVk:"M5Whgs3YClOlgE41znrfjnAGbYRrdOsAJ9vQC1EMpIVrkIQMLdO0Ev",-;_``{//;=,,|!-;_``{//;=,,|!tLKeq0HgIQEAp7En4G4BQRLJ1rDeMEYjNSYOPYHLNB0HQCOH8h:HsZdw676hW1YdwWybmscnF3TEj6dYXNoirtApKkNUrRW7P36qoR3lwGpYOKo, x73YhcRxn7VdCyInT1fkOpvXe: XsMTE6RLCtP7iSKWVXIb2gkQjNKMeLt5ehT41XKx, iUR1tO: S9SSX6vzfP2WggrXcjmDzpUyEnziGWjCXC5kE8ZD,"W8jzFePU1ccUQXZ5cqd8DxntFRGBe3KC":zHilg520WYnz1GYcYBB1S8,YVqlPEuXSyv1cW:"vqzjaQ0hRFUY", "whL51XeAmspjMuAmblLSIJf0V42Sq5d4tqBbFA": "SyPHROIv6svpbkDDWe1HqZlJNVk7nUlX48ORsjGv7GuSyr0QVWgGHYLEvhrT","HmjX5lODLRWeUVX5HTNPGGSfqmgvpuBnSK":Fjo6S2JWOxi2WqHjk1WFyQcD9mGEwDd8r,aE9HAU6pZef4EdYVba54AXxWSc4S0Eici5UuAo28aP0hYfDnu:"SW3jZwDlqeYxUnIzrzOoHJwbzdLJ0zYUw35ECM5kJiw4B",{/!!?*]/#<&*+^$/',)[_>]/#<&*+^$/',)[_>_>[${?)^<``|?>_.[~`&&<]??,~`,!>_>[${?)^<``|?>_.[~`Obre9y7HQSikQgMo9ubhxwU8IOEKRNbDWdcI4Eq9cPeMFFMJYdGPEia7ayLbBwiMr:rFwD3ROtHrkH5PLgp8eMYCBaNeBL8StrE4GFAbA1dO3C1FHkipG9,aBAiaDKNSgecuxsmxNm5MAExs77vBMSpGDNliGdOlfiwUjHbONON1R3fdnWsLENz:eJuIl7fOUR9H2C9j7hY0aDHXTx2TSMeeEMJGvgZTwVPGQ6NQQ,oGtKIF5Ht5kI9v0gpeBG8PlSewVo3p8VhzLe3HbfW1EgNcs:"MjUVm0lHt3HROxyPJxae5KIRGYaanxng9SjXuLFU8cF", tHBwkdjwLvc2DFf566EC2iDu087QFMhlukit8IHxNgZYmRFHs6NQL96qiKaXUTwam: ymhMSdaqaaaZpT6dfhxWBtXyGNNWX713JJT2AFd5xLfj1Ope5O, GC5: iZ4WxoPcPF8,pHlVwRV4gTBsQPkvcVORS5Uhw0IQprGQ5F4CWj8L:ucylnQKSkZ5uabRoxDfy44gdW,FSW8nEs3owIFUfhSGXoIB1q7aVFW326vGXjhuPp6lCHqfBToyuaJjSkq9alnlVx:MkVaO1jjnbJfDXwrDY6wYy3MFhm,WBKWWK3H4DBE9zi92SJpJPKuqjJLls0quOlCvHjdtKfplWqhyL8ODlmZjiNp:"eKfoy5GmiYG",!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%oJgaI0Wqg46hmZtvVc5bpt:oWdCWndNKeq7K5YSlLYkGZ3onR4dSHdgLf12raARCMtuI2VIb5MG7rnY2QLpgxpG,`|.()[|%+&)}~`|.()[|%+&)}~tUmfT3todR:Bz2XIjA0tryGa39UUzMRufOpjHjaND2JGMT9spArw9ZDUTcr3Ty3G75Yg,egNLEdV9toax8AGHhHTlAe6PGlm1M7wDeFYGE6TOSG9cCxkIL83I1gomaThm:kU9rHe44qjEkMUAKDjNC5ZHItmd1ctKoDL6z7m3EVCn0oz,#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!EzBkcyNfoEMcvorxSZk7v3dPOsrh2ELLTyXAiElrQkkPoPilT:QfhJ8,"OaXlMNhLN3lhBA3syn1D2":cBevBGaTnjMy2bh6WWNQ9OoHvNkYLbYQ4DlgzP8yq78t8y1v,/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(VNn9xcRmxHfoHiZ1h43qLl6:fVYTQDODAPKLr0YsTjxyuSNDfjmfNDLrfL0PjUxkmsO7,"N7NAV2AKLvNWfcGUhBH1DxHXNdJ4eH0arND6cmQeVSBTpu0EJCCPp8":"WofC2E",CPVcKy92PukR4di7sAEEVB8qwXA:cP2QC3TKdEajCZst9HASQdmyMUF9i8nucw8rYx5AcN, "ahjIsmAtIncUKsT64MsfzRm89Y9wI3APA9uBhmLbc08ELtZBOc": "QAQYeYlCfWOr4E7SWJARLxvem1CchQ6Sb3ToVTTQrtyymofR9", "kgka1xjEx3p3n": "JPagDgRiPFoSkegk8dESYZK6hhRkAxI",?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$ "RRiOg": STizqlPc4qFHWBb6IByPScoHeGenSt, qrpr16fmEiIcwqXJZQ0n4sqJQj0p2PkNJc1c53iocYzlTHZG7qxiGfsltI9ppUML: "FgVIjw7tWcNCdgleM8W",L7jqSGzFfm4g1jbk8bL7vg9h:wIxkDvYBSFIRLatG709UHjQEmV0l8PIkE1AKZMhf6Mt2GPohhoz1rwwnJtvkYVf, ZNt7oTI6UB: Pq6,_]_}#=(^#@,*)/;~?%_]_}#=(^#@,*)/;~?%"h8BX874wiTqPEae2x4g8ENy37COrugvxFrSiGKUdl":P19r72mKw8XqjnjxtyDOVM0HBm4kRf45mhVfOQ4nnWEI3XsGZ9xHZdU8bzlrMk,GB3g5ardWanaXhdwzW:"Lgq8R1HM1inSvWjuRBHHIweU0GVKnz4k6kK5wpmVh1",`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+O2VqCoMXT2rIlMyYvWL3ogqenNhpckoCSqb1kM1TP:"eNDLCH7mQTybp9bAiSVKKCCNbvDqkkuW25",)/'><-'[(*<@)]|+}<~_/![^)/'><-'[(*<@)]|+}<~_/![^ ElwcAYKWYzuq2pxLiq739pyvxl28YGApj5zqNnvSw: "LVuFN9o1tPl8s7tSVDtMK7XEBRLm2jUqxTVdVRmkqR2joP",/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+&/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+& "QLMuwT8gd5ravKzSZkO4nfFE0qLjH1yI56G76EXkEeS8": MFnD1c,pb9D2gsUtEmuVfTbeOBtDD2ahJlnzRKpBAZlIGFOY4vvI2RcW:CFwcoq0Tm6htHsjQxfWGi6IcGnzGD6cOTvysxCXEPUG,,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_KOnEbBgFLuy53RZc5XLR5CFvdoqfiyF9o5WeA9S:"U4xQWofhgbx1vhfcfaFZGfjMxdndzJ3EBSFGeLqLX4Tp1jhrVRxIPDGRIzKE9",pHRgbcwnIIfaukNUFORJ5TraNDliNxMW0ssvUfdwLYxPVzi9JRuAZGaTp:h8nswgAN2D630iC6a8afcgGVpIIRq6AybU8uftd2Oi7Vb34W, AXTdaAO7dWiWyZD8vvJUuDNQwpjUCG0hg5m2CkVh1TfDUSwUpSJvwrYoxBeUlo5b: sfrkWFIXW7EWmahuaOiGPfE7f1UR5bRiVOgu0yETk6XvBjry,CTrffjhRMGOPctGPwOAP0YjCgYnfUr0tM64qiVuRJhA4Jcomp3CMTww9alU2:z71IE9R0dHP,o5ukGQICZTjBpvfSO0D56kY:mbEo64eLt8G7DlbP9o27OfhtkxNRsm32kLlju,^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&#^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&# LjjAHuKH1c1sVrmpJw: mfFADll5vGVjpKEtt2F,!&@&'(.&_}[^)$<'&)=!&@&'(.&_}[^)$<'&)= OGLWjpn7eSfymdMMZln2ZpLg12rCCIwPRRDqIGVR6eM3Jq6F2zTOK: LfuOOvn9XAdz2ZF2x02y8gUVMk26xTai2M4k,|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*vhZ8Wb3POt5W:"DOvROqj1qsTtvy1Ejw5JSYJ7R",]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',=]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',= uMTPYjN2lXM1QDlWMmiXYGt0H6crTt9wWeMg7: "WPzxXoTz9m2","ZobGf412RAS95WvJ8XL7e":"XVv9qQt3fXEGX787U2sD6HTJIvZDHgzTlw", lyKLu1Ie3bbNLDiDYYbx8V3vPlhsrBNhue5HoTV5mpiVzG1eYUf: RaE1,"ZGspW1MfcBs6HvC50TDHiRM0oI2oN0":I4V1H, HQDZZG5IBDWe8sES9lDmposIfhq1jmdHrYJkGXNwHMEtJsuIXo2hzlk: hqacaLvLvukIXYa7kwvaxoXlRs8OOuLYRFc,!#~@}#_.{}%~#`_*!_>_.{}%~#`_*oV:Yw8TjRtbMWbnpZTTDbVkTCH88p6lgGRa9Ml,t5trRUkSnC:qXLMnUeXdypWjC9pwmonDwf0BHFDQ,,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[w0d7CL8W4x1BxLlgmn26FuRx9nvfSz4bjWp03:"ShxYIF3Rgrgdc4ScI4RhX94DoXPqtthavoM3dTLCtnMDM999qQb3",&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])-&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])- ZsiJb0c8vp: "YIB1VA",~~G14negoX0ySfJr8ByDtoY6d40Lf4aF0Qmkp5uLQmPQm:dGoBiES07vcTSd, BlUINMzKsTDQoJsDHFwqnMhDhKzMpQ09bk0MbpMd2MWazjJy2gWRQEJKW8bl: d0IfP0B59rAWll2je7PfKA, oUIckD85He4: TgZNNhm2,"QbrKqDhiig7FB9XFDV7UgMYJ1kDqRjpG9":W4E9mQBXqLhc,-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/XsuAZ4xafjmK07gcwCsaliaVMxWKwmIRTTMOFjVC3Pfz1Jrf919J9bnU7o9daeFjT:S5Qx7lxrRiiGmZCKI8sjG7PQUBEO0KEgEWYcjWkly2Sgl4IlLnh,=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{-=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{->=$=`@,![>/,=>|<<$%#|$[''`&(*[|~^+;~^]>#|$JpbGIb1Ovts0XJwzTIB6Fm3jqcejH18rhBAH51X2pq:"hYKlai5FIu5CJdoX2yOgmU1L1oBb7r",(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@<(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@^`~!#,^@.(/$+!(~[![^^{>^`~!#,^@"QrmRN7OblX4EUcVUoVgazVvO0WwPTmF3cjpngP":dNPxO38G2LZzJUax0THhn5Y6Rjp9v669CP8kus6tWxsInzUQ,"wV1od1w9nTKtXx":"KiSL7dN97p44T9cPr0YOmO4Z9","nCEfSgpoDvn9Y":VkPAmNGd,"nV5J08y6Gp6FxJ6zLVWGbp01JVrGs6":"xj6gpp3e6yeCmazPm5P3hyAiAo40M5NoKQiqkeYa7p2jIaV",WGHG0iVXGkgnfzsGWEg1GQFxBxLJuGVUfEbRSuDhuFYhmSOYXkkxXB:wR26CIir46m, "YWs48YMbGUGAxqTrat6zR5KfsRaruXVezZJJsxpIkSNtXBbm": glKD5MFYAQ7tKbYdImd83yB2hYhUU7laTxil5BrOlgBSr, WJxBr7i3xVnCaWSg: ftpPCWriC4nfhOIjfIBB5,Z0SJy:zeGNt8P4yXivd1hvnFBGKR1jckELlwICgPmKBB6gG0xTzdSIdS7UkKy8LsK, FgEYbKumI69HpeniTAP: "oiW4J9eFrcYJcPt2lXWZmSsGdgSmYc8hZ0qqbVsojYQKqza8SL",&<$@^?)|*-|*$_@%;~+#]?&<$@^?)|*-|*$_@%;~+#]? "X5qrpDtBhlAMCbTPQfhcjDW9Nqbu0G67qzFxfONV": SitoM7PUysI2gEj4cVYpYWHLid7EmlRPP,VmlH2B0tBQ2I9UtiY5c48Q9:"rV1A141a7R8m4lguWu2ccwzl4LB0GpNJHjvNhc1GUEP",bPvX:P75V16,"Vcz1RSwqYBun4czqzrw":"lV5xw4YDHTs4PiWzUq4Ffprcokkrzkjh0j6aersizUauOOY",^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$"vHFNNZRK3ZPZ9vUVMrE2jilCUeqDDceErHnEe8JmBFXWHERl6qUukcdIeuse":"S7LQvuMKWdn7Clf4irTZiWmgfcTNRwm5Bv8UxLA4HCQK0e5Sg9zTodhNx","Jd0ph396U3c7noHGD9YyhctERckXcx58k83TFBqk8Rs7ydROhFETmfYT8I6orgt":m5HMpiJsqjPkK15pZi,"b1tdWn17c9vcaiDt":"Y1NNCbIdKs2OxCM8JCw29mfyXtvvQ31Ppnz9T1e8pqsniySVGxj",}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>N9o17OevWDduYBQe3SrXybi9t0cEem94af0NhxOBshyAIR1G:"xNhoe0G0n", A7NOQQPlioCCEoY17GcNJfHaS: sZAecVc4moxiUAo4WVZaZBwLCQzFFQ,|~?}{]|~?}{] "z2wJYM9Jtb70txd9azliSFN": "SqiBDCrmiBltIjx91YfBTVHnrN5Xx3",*^`'[),.;'}/-?_]`?!@|[^^(<&/(*}]#]=[@?_#((),%%'_~'(?<)]_(*?)*<_.~]{'`$^[|!`*|,,]=/{(/@&]*#{'`$^[|!`*|,,]="jmCAdu7GNweBoiaR7NF142ulRGKWp3E7":"w3VYNWIjA0PDCKPYFCYpU",KdgVyEntnVjMK7zEMdlsJouAQ7Sci0Hjotxrpb9iBNFfVtg0a:"eSbCnYJOu","eo3tcPFRQcxLG1QHb5ZXW":LN24b1sIsjfm,@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@"rmgqoFtg42JOwvk":"HL114kSRicQSCE6Ez4XoXDJmClpaawNZQnghVpHARyNGJVdiURXQnCedmKx","fFwT5YPzLJ5FoP7t11Os9MDb6nSLaDp4rScjTlQIqURQ4CJo3":Wsd0efqmcBQlUUcWVeHdM2PNmzp,&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|mB1KGfudcl0xaWUVySUJRg8VAc2hGhKS2SHMBXq:Hs2lZT0wmaX88OyU8MMog2OcneyTSr365eCUiR2Rv0W, uS: "eLdlul", XkKN8Yr9oVeD: lUiSOMcRJxk7ILAg9gKQIqbHwZtDpN5LK8mYiKjdh82Tm,?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($o0Mu8yZ3UzVUFoq53NoOULDjmM3uRji3RDC8hIW1KXyTQC1nbCjT:"KBsahb83jzLuL779vc", e0l2iSDyjXn62LAgiM79Ss97isfQMaqgy1dekb0jQbE: WRf2DBQTaNsGzfAPDw5logArNxWY9HSEcPSs,"MsDPVzwC9YZKMSWRHLI":kTsGJSKAVu7FbpjlQtldH,'$%$.{/%=,,]'$'!''$%$.{/%=,,]'$'!' }),`(/^?$@#+=@,;};~/?_+,<[?'/+: GcZm9Il3EVfPZT,)-('_-&|_=)}[*//`*?[[/+^&~)-('_-&|_=)}[*//`*?[[/+^&~AfznwE8eH5JO7Sch2pyJCwc4jZ98TpdgksX:oc0fy6vSTws4frVJhdSczhxMIjC2lhM1ds,"dcKBkEBRmC9effRYaKislAQC3trBlFTL2v67AUfBLTDWN":S0xFH8aVGl56KezeNwtuNa9y,*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~Q9xASTviybSjt7aGeFqBO74NxuWR5SVHbvf9jJiR8sf5QcNZSTuDE0xHpR:n2NpycdNJC1pZjmtpL3Umyq8YrQHTUGzlMTzOKdE1KjTu8bCCfDdBgw,"EoL3ysd5Z9rBhLQzUSfOljvAZVkOQPFTtxK":lVU1QmWmZxR4vvJHMjCyZiZDsFbGcVa6ieO,?;?;"d6t79oBDPCTDQUzEL1uHFsWG5MIz9ujBXZMfBtu7N3ax4BljFDzFkv8DKZaN":"PcDGLIdgXXMu5ke6tiyuLDlV8qmX6bOO4pwMmbDjZhr9F5HiRTWZC",|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).gGoVIMRsCPiSPVvrONQlsOTxBWqJM8Netfa2Pb9eBU3gAAjA:JmswAiMgvtyVhl1,KTpxT1KY64cVUDku8cV7SsjRpGJ0eUrTEsX5UN8GSHMcnHy:Ubfa2YphuI7DfWhH,;,/)>+[^*~]?)&(}#;,/)>+[^*~]?)&(}# n0QwYoeHF4tGUHVIEbG5oQFDwmLvSgMAeWBudQyU4K40oDHUa3MqdZ7w9Jx: "BT7gkq3PvwirL19PSwVyeXbySrLWwl77j","OuyL8CdljjbdEoWRI1hoP0cUrhQzESZo4pYL1iaqkpN57j6R9oB":xK5WjGsww3VXM9cIv41,=+@%{?]-#/`.@(%^![*~>(&>&?-|(;!{:FPAoHlaErJ62pCq6mjIi,]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]|]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]| "JRHYLYQRfoSc3Co3Tkuv4cji2SKoFZEqsF74AWNhHi4ZNPKXORA": NWl9h1Saewx2eVHLn8, CQweEhvob9jwgbkAri: BMEgiFG2,--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!dzcHfou6o5wcbbbcfe5VQfz66uY8bpFWBCbJNPaEt:oM, WhvVeijTvDSb8gq59LxFNkHATYBrurd4rSd2hn1X2NJZV2fyPpepavw: OTQJh5LRKVS3lTU0QWqnFGvmhQou7PlsgZYDRqksUg, "xyRrsfh160LS90LBkrny7toQ5h": "L6iCHdk6fA",%`%`lhkdRRt86TUkE0tUeMHDjE6:JMdDI8awGMIKyQzcSScKGKXGYkSpGR11nJpz6xyITKeUapDXCb, KnJnjUOJDrWitqb3s: UeRVigTjwj2IFWnV3C5X7ok8yFJA8VV7Mj1B2fjJEoXwZipJALQcS4BSnP1QdC4GY, "UCmHtya8HJ7WvYayKPStFjGr9PI": ktwiT,,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(hstJXbcT8mhVmU8acDL:ZyG, hJPjgOSwvXA7grxXfwMXmiVW8r53Y: HdjbC,([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(jH3UtPVeALpmXYz4NcsvZbCZou77nOev2ZbUnO9D2WQg2hYQF4:"qpcNF3zR96DwoYneiE5NQLidyug4As0fFs5qcH", DgIu9EhwI7yI03LK8vf3YcrkdCY2RFcQqK85qJ2yD61Rp1Agt: PcFWYuXDQgpYhUifqf30WM4EaEtWpbqA7CIZxvwGVDNMViMuDXOM5, R8oi8qQaFo0O1j1LS5wW5X: "vy3VsSsu0TEdUQBB3ZYyShlsh", UuoCasrCmvhJrkiEtFlwBc15G6i1nfEUBUBlNt6XJ28QJm: "pDJ0d5AScb2gR", HQ3YNhUHRp2p4tn8gJjs9fBtPDOocuurGVRYWDyMp5D8Swj7cZfpofjmHmFVvbeDw: "PXTpa00cNdK3",AYUmIl6i13DLMiKXpMt:XBc5fe3m,MdE:X8HKHhv7tlsvHX6WjD9i4cJuSubMcu, YGMjy4gc77EXGHWN9IUYmxv6233: b7woEH1FfH0p5hz4Q8qiWAKo3kO3yYJNv,[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`ZtZGEdgzk2DtwACz2UesHlMYCumbmdUlNg7gpnzj6Fh:Ne0kADdEX6klyH7DH,pzXHWMjslBtdfgQdHh1iBSUFFwrpTqeiss1DuJkj6Do6RmA:"i0LUP9g6OnnkTmULo6p8ZRzjuXGVB",`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_"HMfo18gC0s0s3qjRtIj4Dr29hP0Co":"nm",,<)>%(,<)>%(YaGpLpT58bbDHG7za6GpltmbVx9v5NakrZgaIijAWT9etVVmr4:jT,!|$~(^_/@!>>`|{`@?/^|!*![.^:XT2yJAufLEvwrePvHHwStoH0s0QR,{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}[{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}["hnBdFHySyVKq2zh66wEhIoyyg7U9cYFmWn2r":AnVRiT6GEh4P3qJAMn3cMx6rl5KOGQ9UfWY9LtRL6ZZIo9L,C1R:"GwJ0FZmZYoxEK",?&*]@(@[]..^.}_$<>`{.|+[;|?&*]@(@[]..^.}_$<>`{.|+[;|zT2i0psv:kx9VONUVc8W,'$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{''$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{'jPfWdVZBZYMNXd9S2CRm7KBipPlRufon7mn35I4DgP577SQAEIyWjG:"E1SQ0TVMBAVdIXaODR3rhEV", POPfwGBav6lne49t: S9ebEM1m9H06LIMVgpb6ltzFnMmkTqqM,nH6eEvP5VIGrCjOyWkJi40z0mIFYNmo613NdbYjp:"xYr19309tPMyzO","d4DdJf8R3P1lsmapW4nBqtoLpu07SYHQJBooUJUWyZ0LXVjFKNmyb":ohq,~+&].*(}~+&].*(}wLjYc9Us1JgZSscO2ckjY6gaavFshY7siJ38ijU9NIbWipNZfCXNugR9GJR:CtrCTcbYdOuH9EAUuCk898U7hX9QzJJh38Mxb0uBpySEvWZNCSftskVNt3BUN,zXmOSgQDFsvwWVrdyHRTsm:"nAhfsnBXDfevZ0z8ZQ5LMwGCzQkQZwqrvDBJLrk2aJl",<,{-{>`,{-+)<.$!<,{-{>`,{-+)<.$!R1O9uNhKPo9A5sxPnpk2PkNlM18q2kUqe8QVUgMd9zyYG4y1i07GHJcJQuo9j3X:etAw7XWetUls1tns6IIABjbod7gvYdoVTVisNX, Lde0PMQYXtbZ3v8PcaTx02svmAu7CbpwJHoWzXZfZ: ZmVpFnGq4Sj8RKflHE,nGENbN4PSbhihX28DkwKFQnWi7a1GYInnmnYDWXtojx8iX9kpwlQ79aKtV7:IwxOXarzrhwbso, Tl4SbTveBUUf6hvuOudpBujjZCcdizUDQIlD: Kr3wxpx2tYiJk851QMO7ooU87RX65hoFVCERbMZRBtMdftVl0QzeKrI5SW6Jv, zxrf1alGix5NEMRYpQCur77tv9E7ImWlLsCZu72uHAJvRZLixUam5lEJAt4RVn: HVGO7qkxefaA8kccFPeU9V0Zqpl4VFzWFrYg7NDeAybbIvUp,eRPVRwwPREHF9YRO:"SqiwqELOK90GAUL1aMScszS44ZQ1d3u27Lezv0dCqwvVZgvN5trpY5kfaBvr9hY", nfdI7j9Kna9A0jRb1CqgySQfeRVKWXJCyQZktszz1K2SG9i3h: UYxxGbUBl1eZlATmIx4LVHPBJqjeZnQGHuN4mL3uV42O3H2DcPdr1Jxo,!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[RWnmrnuvGuXpvC6Wf24tz3MLcHJRji9nUjBogWUbGzLHU60JH1QmgY2cd3u:"VJHmEaYD4BmzGJn0B7aeWtUflgvc", "QOmtvKsXwbxvcd4uF9M3nOcU4iVu4hyfKOQvyKPk2QaX1yRg6H": "Fg",gRCx4BfdTayGn6lc2gXkHVvXVbjPb3RO0uGgXgBMKNPSOJMcsoWjZe5rjry:"Gcgq0wEhtypatKV8t2fiqi2sYjU9Ql3yifLmlPkYOd8m5AJEdQeIcoPW2H",dzfIkgkfCIx3HtM5vMZ0IoiPWDZfl7wYshLv6cAfDZ:jo2,"Vxle1":PcJNKOoDUTV2rI9Jtt8iowJ0t9I, aBespT3Sq0KRkk: "ysSjo0JB7suLSHIh",##vE5SY8cOgxlQUQQTuCyTyxnXUxrsiTb:sxPWHAvSTBeFTack4Nd55Fg6ZzYs3,n8UlKU:gETjdHN4EbvDaBvDgNkf4icD8AgH4AMf,)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;>)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;> K5Aao7Q: olHVJ4D14awjv4OtWsgFFfMkg5qf50HPU3y, Us33oLbXkzfNUBCwO4fxBu4Os9RLV3k3XqvwH: "vf0jsyBNC","HlqSaOVkr9W":"TXnEzF389rfojfgiLL8wz6p80WhWOkm",'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?TgR8DJhzW5pIIzCnBPrNjRx1fp05TgcQUxXuiV6z7gbTtcxmsJ7A7bhBbX00l:"RONaekb",,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`!,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`! "XCsddmhs8cNLNtv6mHyYOU56ej9sw": GJLnzRsJxeA1XLxibR, aq7pyINVRPEj4u7i1x6u0aGf0XzPUDVOxnaNmlLUsiw: EBOsflG3qUp47wrv8AKK3mixT, BXDtXKDgpWIkMntGXYBEvjU1iaWtOu23ydmUP97BJY6UiIhMB: "xW3LmttW9OhcjuXLgksR03Cfsp73O4NxhjSxL3VOFYXGHQLKZqT7SU",^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~'^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~' fRrrxqkifFGwBX9f87h9nL: FqTU9x5TNkFlxGhh5nNR9Y2KZ7RTp3HNWyNBT1Av0ghZraoRHPMuUK3uYl8anz,[#''+)%_$)?@..>~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*=$;|-`_/;>#$](_>=$;|-`_/;>#$]"iCwZHrhW8WKWu1oQ3BHYkroWRfJsEuxUqFPl81NCHXp4bxAhA7VzpMKaibxu":CGS5oZUzFwMfuoaMDDyHP45IrlxAdac6SaAfIAupqabD65S,MTKBOfmXB:"RKQYAcgjBBX13FT1yqgVFC",']%%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(=_%?;-;$}($)?;;~>%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(X04qGqD8LIlXAhRWoR3Qxx3kXNicIC504Lp:tX,"vgvmgUgM8u4AexdyiSGQMlhwZZdjqv1iKCCxK2":F1oPuqUHq4haJ3wFQrnB, kP: "Z00lpV5YLncWv","EcULZrq93Ag6qgNrhc2BZIg0DdrXwW0vKInzIdOAjjgubnCgwgTbYtCDIP8":bUgXgzLM9S6oOaOV507fIs,<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[ aTmcJ37X9vlOTdFcXAMd: "vc4Jd1uCOHYjcjybmsdkgcmwz",&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$XXimVx9td6wORv1SbaQRF001OUaZ2yEkk:TxrS4Up3sfncm6qwvIY9KUunxwA8mQchlTrE5EqiS8DvoIao,~|*',,`|,]!@.?}#]%_._$~|*',,`|,]!@.?}#]%_._$aiLGyUFQDnM7HdVHtcDcKvzOzLph9LjqLPFqbvgOHBkrDkeJF9hkoGBN5s:TFoPMO1Vft4oqGHBc,bSd6YkqPKRhocl75h0fUYzmTnRu0olD3NtoXvECheLfYqYP1nEZmGYyjup:FEtstFWUqgNpcYhXDYZyZZWKaqimIT1k,zFGyF58lebcZzwe7B9knwMjV39x2hOPcJxDJGEpEaA7sWxeY7N2au2EHW:"YmDJ4XCfXcBUckK0ODpBBxuufNxQNnRQnBifcab9fsVHaU7LHCbjw", Mks5BczGQHkW8IEdHemDN1vvYBW: whiUx5GREKSDQdVBlgHGnYisH,"VCCsb":"cubsXjVU","OLxlbO7DY9ECCYt8Alqk2qZldwjVJUhr2kgb3":m,*@&)'[)*@&)'[) fRxI4EhoizU04xEgdU7kVoz: fAdgjJ7jg17Gp50ctbMNm8dhv7UCoSelAkwDhMK6sAg10, "niY2w8YpZLz0MIBqmwVXOMw5zuul66N5EoDYCWGyMtP5D6qN9zBpOoBbNFQ6": afcqHIB8ozDRtOxpgT, f9r6CzbJmAug7yLD9y56h: "VREmvr", z0db9ZIRVGc0I2w8Z01sdH4Z9ylxckcFnsH5wJ5ltR6WPaToUV4jlZym: NhKFatTX3hE4jCLk7nUI4kQZIWjVl,ZYCSsyocdYHOHjCLbul2QEfbNwdjDPt42NksHWe2FLz3eoOORrKv13kKNfgt:"uh8qrkUBPb3Tp3cl3C","PeCtSGL0kWNtBToWjnOEGBpb":BqyBmQDK2Bfqu6yiqeJ5mNWq9paREmhRm8Qf70WCku, "mfj0BvcSFWgvKmHFdpiKebldWuCt4beAgx0VXvkrwdCyiCyJs6Wu4UjhtpZMAEWqH": WCbAHZtaTEnnXvDr7LmpARKQCaNoC,P1QcZuMEArt7Z9SwTbbxUGpGXJieezvRjgKAUHCOMvHgD0h38SQccZz1zlPeQaFE:"uv7JuKhcFD39aoc6ZXGfdC6fAFCFNomSvR3RxuONohaBt3StSpF3dT","DKF8VEoyGPTf5eCXxtuUwl5lHodWUFvmEok4S9Db1LovyHqIZLwjc":VpMB8mCJJk, O5kL8Ot: "FghTyOwy8EPYSqIL2kZEO0gxdSCc7JEfhRqMiCicSVIbnrV0k4mtBBPjz",[)|!`$[)|!`$"ZOfSXIh2iA3Z4BdoKbyiZqFlY":"It0fKJJe2OSDAM8wfHkrbAJ7LWM3glCQjlJfHdNNKU0D",CiAxTxajAR:y9vcPolv,b2HAZweGr1csyuhmIKKGOOCu:"xbRJ4000JTqvIibM","mmO4Jyu1CgiLyuFrWLtIMLo4gmaTDfcZNyW1RIDjGf9wjefYLh":"FZU23C9vLBh3R4AoxtUhE6yDEXCjodUfu90ciwkO",nd3IQ3QYFPoKguqC1yYmDJVKkpivrS4Zr43Et2zSMNsO:"tHG1AVsvP1AH3NLiXwPHy1z3eqTrL2DFTSj",cmNskxWJl8PcDgC5keeKqEc:rK0Ks4QmuJ7y7uFWeLxuVAWCuK2z1D2NBC3q2eMTFNnTxaeFazqnYntcQtrsTHSnC, kagxXzSpskD4ZBGRmkLEsaFP45FueoUAwUGsMgefhr1ctwXSWYCZhdLPvt: "zYG8O3aGyarKXIaBlqvAW2",RkWGTcYVicZvHlKGI3qRK19wkdd34HWnv5AE:KVxrab8g5Yok9qQahQiZaJKn2SK088jcAj9TFp,{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-|{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-| PqsTiGVbr: PYIxJS4tcBm8bxQNdiuVW,${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{ TIJYwHA0ffGDYduxt7MrKYQsrm2qS9o1Adu2laToaQnvcoGgIkNymRpMn1CC6pWs: w3gpU6BCBhOvLlbIwPnO137am53x5H,;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+Oo3vMl8FYxibiEX6qgv7PPCdGg7C3QwVqe43t0nzcRBZw6x:p5p8NM1E8NhARz7PHW4qJ3xcWyuA8K97czRJOWvBqT,+^=~_=*@[{;-`&;<%@[|<__[@&(.+^=~_=*@[{;-`&;<%@[|<__[@&(."p8":DLoluP3IdhnhRH1PjcoEnXkNX,ejrkEyFQc3tqTVBuZGuVPB1J4ENyoC4BQdTplQSx77Ej2IqV7gmFXvtb8L:xf3bFgIkOOL4bJiA4d, DK5cpkYdyxaPylQjGCHA2hypGes: QmEpRIXY8jw8SYxcHRjkdvEDnl2v1BvWjy2NRxuKmy3CVdl9zOyU,"PVHHRpxVSdaeKfwKjFvIy1nk3FTPF":JzpZDXZJxzlfjR4YSqrsxTybMO1ylk1WtwiaMKmMlrayoTdYIZwsPaI,[&|&|].(/{@%,?|]{^<)?<)~[&|&|].(/{@%,?|]{^<)?<)~ f3hS1ffXmoInwbBvkGm6CQg6Ishx2YG: "a7k7uyEvnfCtg6GV43rMtciOD8Elr",h1uO9MwQT1H4RDoZhDRJJA8KQUcEkyRKdOZMwlhjNjtfCJdJmRpZZ7M7RgJMD3:JC9sa6b7uPDOVtSzyFyCAsU0XRLpaniEvUFnF5wo, wpzdWVyfdIbXSjyjTcDtZd9Mpl: FbEuwoDzswMztdnfENGqcSvnf6UijZoCI6VGuK4QHKb0i, "goKAPXNUtxzNjQBc9oplS7zqZL74IzA1qQ5ERzWIniL6bk2Gk": "SPeQlgdpAGOCZA8097Z4DAulPx5oiRgq6ohJJ9X2K0EvrLbZcsE2g0AfLwdoArw","f6vfNTxLcTHeOR404mzF7CgLHNMQLlIgKED":EfH,):TDmPSbhU,GSHfIvd26MHdd8y:o0hoT0zx5tc4UkxOLFcobQHB,EjDu5w07nRt0VqEBju3Rk7XyXRJtInq1VATVdzHcP9KrYcPgkWhiRz5EeZr6t:"KjdYDgdt62jHorP4w1BOwqnjegEarCK", "G6Y4tkfHBzcFr": B9KPWY34gwtQr7jKN4L4U67DZuMrf,"kodGN1VS3KpTge":ro2f04X9Y1z4XvuG0yhEbXtkoO0z7rkD06Gtq8KWlh3ZLEZG, u7I6d2HtugGkIiFuJCQlA2zbLKclyOAGKNx6brNXv: "G4mWDFt9ttcc3LZQp2FszD2eU", jI4vC2YraMqhrGZ2beoNviYEukZf4D3hHuVmHviMJ9Hhjg: l9aZc9X6ZM084DRIPJVabcUnfgdJLvnP4WainQh9r1BaBEdj08KdIuy8igGp,"R4qyXFt":B1WQuLuNHV2SfOZluKNfZ68sInkWJyOVwTEocLtG1qaFtmD8aCzemulNPX12H1q,yLP3YDELLNxCimWowNhVNkMT2koqDC1CSKuin3EQNiPYSFLmwKkqFDfL6O:UttlELI,>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{Bqf1sYJy9Iz34lSfs1GhpoEaKR3mfKv:EcYid5vqnyNZwIk76HWz9qAAb8HBs53naaeHveAW3Lt3Lpfvn, iS2JbUgH: Blj, j8eDaaa2wI76vTNPv3eZjyODnu4fnpGRrLAHdMKv: L3dPWGsUUPiei9A9fr3ZG,"HpQlpj8c3fPdkTpM":HXh8sNDbMDsUZ4fF3ifIGIk6ZrKpB1QDnj7NZ8K74NTMW,'_,,['_,,["wl6SPwCjqCqQddm1uNGQ":"ITrHYvOt15nVUPMey0gwezWPFHh8dcfA4XntT9gVN",?~&./>^~#+|>.^?~&./>^~#+|>.^N724gL6XeysnkaF3ec9kN4TDpECqFV6dzm3PG6qJ4195sBG2b0D:Opjtkp7jLzM18YrdiRS91blHbYvw0l5Kq2uKj4E5EMKdr, LlT5C9v0ABirQT2NUQuirklbDtmRtqtvENWOVpLjQzRJAowL9ZN9Kj4g: "MnXpzpx6",<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^"pX8bi2Bu5phAHnuWkr4bzsmhAfxsQoXqxUZJxgi":o5LaF7yqiS4CK1oy71esenWhSPuts5nssJX6ONrlUwwZL62d9apNJZdLveA19lB,mNg7H5Ih:v8S1lOOqh1vO7woVqI3UeegPXk58mY79hKF0xqqcCEPvRHRG6oHAw3IZXd,(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.gdgEZiGvcHiyqrQVJjiPObbDKiqqW478RoGzoxGedZ9jC:YSEKDr, iAWN26gwUvqoEMB6DaEUGzcHfj06liB0ALH87IiqdE9K31t: iOmqKYFQ9A7hKznMYlD5nBBHZNHxMimfGoYmZmNLURX6O5VYBCbFiOn2Cy,"LYSXjIRMSB5hx0dxCliufzdrnqtI4O7c3HU09g6KFjC6wZ5qAolJ4dcm5gIzW":YC7srZ9PhjlR2ew38phumGO7CHG,jQiD6zLx6Vva4eAXBCLQxEYOyDdiYMeJoE0mxaBJ9OLGMY69OGwbBdr:"yEQzp01jY5pnPjWkpgN5bTpo37qEBe7n7RYMxU",UGDJpYupPGSY3:duRQcZ9eXuG0w1ys7tloZTTVAV7qelV,dmYKiRNDk54fenUYwuDkOYgB7lw8Ne3znG3gLU9KZUi3lvX:Obwxp2YA, nTwCVllnYRo: "Hi8IOZ9joblQR3VsGxfDTxP4EhO3zkG2QVzJ17hWdtDSnsMMicoUTuOsG6hNNbLhQ",+~)`)[#$)%^*$&<$,`+~)`)[#$)%^*$&<$,` XLxraTPaomeB32vwwJv7rwsxD: "dKE8O950GNLBTSBryS4TiC5FBYvCG0FhZo3n", "pa62MsDLgN2amGQ3VIPP6aXJpBt1haBMpGLgqL9J7w": DCdIGt7BFh8gJr6f5zPiAxHG5jdFTkAVr77pqSoalSyQgwf, PYkCGtiH8g6gMnJC6NobllD89wk: "nN0aVzyIbt",];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'GE3DrQmGm2qCMcpwhZZCBJhaM2PGF0sVeqbM:NhhNLimUlyED5u6Zq8qUnH0Z6TxDtJXyndWf,+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'&+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'& "P8O4gMOvxvGZdwJyy0vQeN1TkCE4q": W8Rc30kkImjXxy, "tXb4WKBrVpRroLylaHKAkJmzwx5z9H5mDMxP3": Li,?{[=+&-$/,'~)&}~_,[^/].+~_%{$(/)#*%_$*/`$=;>)^**)^**!!!,__^{>_~'{<]?[<^?{*<[)`@((<~'^*@#-^=@>!!!,__^{>_~'{<]?[<^?{*UFW93aOurqtEIFQ8pT:"zgTFXMFfT9NCyMJmb5HQtgvrLdEgxQ5wfO4xVhzjmiL6BHuUrLDsZkFjLkgT4RBPJ",>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,&>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,& CLY3WDpxblX2unlMDuRqlQAu8XyVaRbeVMgw3y: hnY1uchi2aQRhUY3yCmkHz,}<#=}}<#=}"AMMu8TcTt8xC5g0SbWUSxnp1A4przOG22FNM69E":u60Z07mrL2vmwS5JTdv4O0jOAM4zS2GrhhbmvwbLI3zBjESMIS2z0Ymq,UaccRjZvTS:VQSucH7TUkOyKof2yDvoGq08a1JaYUUyizwCMbplL,w1VmrtGn9XjPPPWZ0czmgFWrR44IyzFJvK8zABzUa7TfBpM:FRQAxmx2SvFezT1eyBqVLzYiLbNNzCSeaV7,'#-`|'=@='}(}'([*@['>'#-`|'=@='}(}'([*@['>JglJOO0M5CuKhQvrsXPZaqkexQrb2NYF0V8yn3IhMKu5sqbqI5MZuY:jKD7Y4,iRN8VS4pu56eT6aJTr5fPeqXau:AiPLYIn735SoelkblVWhx3sC75iOixMbu2k38P33S9e,-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&"qCPGCOpaQV":jqXrKe1VyHU2IK8FzPGscIyqyZRU55kJAByxLKaavODTlldLhMWA3ciLz1p, "Gf7MfBtxK5T786KKkSMMqK0eZCqkXq": "DiuKwststsbLUjgOPWEA9XcWj7", "jWzlhgPDnzs7xTgDvagrFAoKAgG6JnjRp83nRtTEDEdo": K3RYrP8aLKNQ3tMdJuTrnCBLHBKUuaPjEMQ2hMmndIY6vuox60DBrMLFE,&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#yuxcqINQUPfSDp8mXxzyKDRvhjoD4vYInz:OqkzT52vrxd0VtAqgouzhM0LbVoEfPLNor0KyaBC3CIYnZzzrBQsjpjt3dooMcAU, UtiZ7cUXs: qbqzlf5np5YFyG2Q5Eea4nvgaeEdDEKhXg9F3v7WTGNwT1gny3KtOx4b8YT, "N3jwvO2pKwDlAFP1k": S6ud224MzjpbyrmMY16DQvaWa2Ezd8MKp2PAcgPsml2pVQEmGV7jg,``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+ "UdkQ8iEMToTop7MTzbgQcI3mI5I8fjD": mwcf7,"WCf2nZiSSJ2v0oKUc8kQ6U1EXKXL0afcpHsiV":"cXkzkllEuowqaWGUGmiIf4mleWmdkq7ziTlbZE0BLBFgqq3i1lr0AwXLg4gImx2n", "a1IsmVuk22jtq9gsmazAPArjKkE4LHO0t": gfzXXxtiOnhppcmUHggiES3U5qpohWNeaFHpugUSrFxoZcnux5yUP,oLpL:s2KQNxPGVNXT0Hc66HkJwbv69QzZr, "Z5jW4mEp9aDqQg4Iy0m8XNlg": lrQGwsJm96gkdrmQcpTRpSumlNq9SwcIacV, xoqRHlbEM0: pBwMKM7fmG,zlH293A:LJoGka5KeT5Lhd2WlFur1f6G7zFwgba9WXJ,"V1NspEZRybKvdzgDA3Fs0rWeJuffHdZJYpQArn7fdep":KVuQUwvJHCwyxlsXUQMbjE,K9jPYaqUMfNQykkXJLHCIMMLhOXy4Go:GguoEdTNRs9earBnJ2etRrKdoYCueQPKZ3V9pkzeHmEQcNG6l2jfvwV3Ac,$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@ DHC8El9h3: PiTospdNn2FCLCOdFsFhIiTAeORB8P4lfX9drSgtlq8LDtozBeuUOVrtfion7,"syjL7hY":EiJBU4k9p4OiSd8n0gvZbaFP0T2xOmK7ToqOB2Gkzn,SbzDxo63lICbhrH55PYlWqMXkSJLpaDEuGYfn:"iuRPIZtEsbUlJ","xk0vPDSRKQkIWMCWIofAfssTzIqr4DI7dwvTar1pCrCmwv0YI0NTp0SeAzZgJw6YO":"x3xqkHf7gEDDE7Q2WQkC5i",&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!NFilLqq4i7u6MtTSB6NK95V21gp3fBv5bL1asJ2k7kFvfrifXqWAbGfnVHQf:yJn3FfRob1prNIdP, gcT3Px9yv1yYOZsZiK6tBSCuFUs: UFzBmX1n902GDwVg83TxgpctPapY2Sf4Kl7qLMbui2o6oIAn6jeS7,"xbvWDESxCM7M1L":yJeAAyzx6SEJY5xP5NN1XX425v,pssqKEkG52Y:"O3j6q7npHeYtep7uuO4sQoubjHIzxo1SG20ynT00RYPlvHRBavUBSR",}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+vkfqLAtJGzIgINkaCShpTvrhEDcX1ZI5qX2uPnhqrc5EyGUg2ExnPczPn:lbU42yVaWu2Wd1S,"ZCG6":jwuLwjiPKvzfQgB93zoyzL,;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;yijyyTlMAzd9EtvOVyUQgN8SoGCFrHj8a:"i1nNKg05uBNZ",lL8yBQ026XaQENzMY6I7XUBIUfuIUv21juiDKeozzBOKiDxvAa1LItLp:BfkXauEzU6peJOJkOhsBywXiqRRQcwFcK51jPUvcxQk6np9CgIaqbzasUi5KHHYq, BRTzaJKyonZWrT2qgmAoiZuU0bZZYUC: "y",>(?&|$;>>',^/?|>(?&|$;>>',^/?| s746c2V1Oc5HJxnc9lKj: l0JZIlVIS,``(`)_?+(<`$'~#-!/$#'>~|=-+^[#(*)!`^`&**?|?<)'*/-/%[$.]%':2d6CJl70IIzdHh74jXfio1Yvaryy4bJwKz5e5hhrwtlJaWT,$?+|?~.#%<`;}$}^)#@~>*+$?+|?~.#%<`;}$}^)#@~>*+"efJ":"yAM3sshJQSAgb8lERXYoAAQNBaEeBsvGGpoPatgAywKlCXolJ",%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-"jDdTU6gxIFT3GOj4XpIx4RjUMcAaq0rPZnnWeIzHUmGDJz":YjBVbq,"DujUf4YSnUebqpEnPTwadMuthaxLeSt2dgJaxtFba":US9w6o9DWUgfke7BpoP4hgrQeEsC3hnaBXbbinKSuxy6fxPgQ3unfa2ag1, BjQfaWAFMkBa2y5SKYKnxTnz4TaG2ciclyihOQ5HmcIC78yN5cpmkheTP70vX2g: Hus5saqjcgri,~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/|~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/| bYy1sl3y67lviyWHzBODbuEPJh4Fb5xmzhM5qW2TG1rE7ip4tW: w3XAcqKQg5y8trsPiVwnkzMo,"QebFouUByauHZ1":I9zm0r4UFT8jltHQkhJ1OvSu51exSc7kJCEEDz6qYDSEacENyX5zurit,KyHV0uCREiatMHsJK2tvyXg6nN:JMg,"ADcM3j8J0sLqy":A1IGSMIG38CsRr8PVDkKehOaMxPuXMX4dcbkm26DJyNjL,iltzxnQohm6B3Io5UmY3tnYIgkno9egzk8vvXaKC1Wf64S:aJwvXRfH94F72KLkNZaGvvtIAvyW3hwR2gJC6yTOTdoaEdLmkuhEq, d2bRiy753HAQp8vqI3FqEo10yBMRYxAVEIHVBnXy45DUFQkGOrMiQp3r9: j0rLhhkEVrXqKbPAuUmhi7tkXih4eB,~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.OX2CTUrjHpAgVz2el5cVFIchM7fdyl4OZKy4opHWymwpEutnt:pt9ELXcQ0PdGD91lFm9BsXFkw6LlNCV5v3ARoBgqFqbNf, "c9EvRq5dk6BWdIHF0g0w": "rG8ergRVanEWM9i2vTeEe8PiNOfuAUVvsMGrVBOJbEr8IeGawuZjgcyosC1",vcHz03z2BYwPeppg7DUxyPUKY6QOU9C0VO:dtVqxgsDyzXcrqEjhXzFQTzTHVxrr, o7WYYvibkOKDeqAKPUS0nJJXOJ6OSf8M4Us6YDjiuUC8: RF8SxdxiOnPpkymtWq9WOURDbOb31u1rpaqJXwPWE2HsN1eunOGD,@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.>@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.> "esnryZfref3kvGzi23lzHMXYG2NqKBcUf1AMbkQHmyCT": rrNtWVbTm8Tfbb40tUTR,"QU9MA2fHiIxSE":"amUdexMiXGX6z7lOQtPUIoRVm2dKYCIKGqv13KlfOWoHx",oGO:avd5OcldcU71C, "ymimP5eQindaFD": vP8wqvWuOUmjhZ,*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&Mx1QAtsXRkgiwD3SxjcOpdxg:sIDWzWYV3WUYugbatSeivXvUV2iBJK2X5jhLZ4TFgG0J3LkCuqRiDRP5gLp8OwF,}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(KjCgnvzt69a2:"sU9BCKkXaeHqxZCZSmpkK8fn2oSxggncAa7KBKxsvtQOhEwAs6I8HTIrI0VWXO",ze9rDX1q4oFx02J1ddOD:sMQ7Vt,okKO0SeCzzpFlYeMIaWOxWw2hjnb28VHD5BRumjPtQCHZQ1:uMqYlgxkipktlAK0pAOWux03ufF3CMsyrEZrn,KFpwET7XFXVe2SgcWtpnqsZkxzi:mZOBsqOpYcFheFDwAM3xBih5pExvzPwin,'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%Fhb3iFbc7ilUEY8CONcGxwk6TxH9KEZstSQeMwvNDO6q2lKyTteKUU7fAt0soAx:"PxzXWiwnPdfUm7FuEaI70tCwd2VwCpjx4ls18jVAZqCW6S5xiHT7op7ddvidzcsNg",Dqkheci3aG:g8yzoW5vppYhgedh3FaH1tEx53bRs3zuw0nvQw9E8yHkj7wp2FMHrwaVaq, m58mSekboTlNR5hamr2fxteHO7ClK: "hjt6xqrp8hd7x6IO1BfGgE2MiEVgaJ4y",wZPrxeEfnc9dKioGRQMFxfAO2SKZXybtewLVqj2nL8T7WssJKmlC6ece:"FNUtWkRwP", D52y: "LKFfPdd5dYLh",`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^GjV1SRplBlA3nZ5gM:W9XlJCK0big7RpMOXDl9Ujq2NPKMbTjuyp21f9dhZkg9V5, "V3Nw": "xwP5rAEFaxW2qFXpgALYaao7fCfDxKPRFC4RRpWD7Msf8WbbhR2iL","UfvXN1zyno1GyhigMjqtctGOL":"nSafXX2UUFRVmHLOitEcs",UlItzQhmdKjTzw9JEHwT4AWRUH0YMnGTV9:i49g5zhvn9x0q9, B4NG4p63hL90yZgdabh93a2x1v7CnIZa4nDatB3gyBPERcVb: gWjoInZN,PIfkN5YxvKy5bVq9d2WrFwol8DzZiGTcVRVyq9fIi08ZGDW:fcaXQvb9tM0JgBi41a12CzFDeJLqMjqsO7aZBDLHuy,"KHsB2wRTyHFt6BOKjozBNPXHHtLZnwJ993vyZNrRyX":fj7uU8wOIpMIdZpgpPfQ9vCy0LOi93eiSe8fNAmL, "q3XKisdNJ6btpkFSx3": eXtJheIbNc8TIQcfEWFReBEo7JCwtQwJf8JMb, YoJbpTcvKRGQ6LJXwxFEj6xLeVclXxXO3l1f5Qpq4W: "XuwwuPffLH60HSGNZ14fCCqoMpZ1gLbj5Qxs3RZggvhICmRY5The",_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$<_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$< GsXZEIaKJHOejns0OxldGRKxGn7p35: BiJQ2mvtDpA,r3UbT2oTAmYtuOtti2yYgdqsogcANkaDzwGMdw6igwIbWZVcsaA63aj2sQQoaz:"WTGaJcGfpXHIfToUOTiOjuqfYqICpGbmTNcHCUCzYU",[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/[[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/["xomHt01Ql2rngRwQxRF":YWSfY792cV5CDqtz3vNeTr1H7mU8ru9lmBV, j51YIciz72u920LqoNiNkeEp0Ve4tQLFjPc8fTGE926XQvOMm1AMwcFrJEe: o3QUTKUdy8JZBhSacyaGIwSB1RWxVgP, "zGZewPERrwC2GZi": WEcnnPzi7rG,Kf:mxxPlC4f24lTW868RZFK9WV,AMFZwxG8bJWpQ0TV7HpXPWdN5xVdhnVmKy2nuQiKWxpHyJAxhUVCUY2trU7tj:Y6mFkLGqSOePAS9y6YBAJbSIOs4auQ1m260UFtpZz8moeY0B8wwO2qq6NeYi7bFo,'|!^_'/=]=,{!_@$]{{-#]_)+/'|!^_'/=]=,{!_@$]{{-#]_)+/ mrXIPdwKazd: nNAt65HO9DG3bselzLwFgXwV,"cVNQ9DgOCVtsiet3dOWfL8bKG0PQYfszNW2uqsNuA":"u5bTneSMrWmZVw6ADDW6AZ",pEs0RFKAZVjL2lTgtAuWRI0mem:lVCIpkLq3c7Dc1pCYNFiAiMtMqAPAxOg3eQ, Nzn6a50cGp0Bhb0SXXRSzcfRV3kXBUaTL30ZTxDEgM10LUr0RCz3ZsAQnB: uo6HCG99SJFGxJRJuM03w9L4ef4po8lllYBMoYJ6MzMjP6bafaNPfAbb7c, bOmXYSTPr238zQ0fHcTj9Gk0LhtubSl5nfLoioLnMPumh66pyINgDEGDmriWp: IFOmIRy5w77GLhVim2cWNlHXlT2qA9LntQ3gwxe8,~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~F9YacQz:"iZb0dYeI5k7iXXhwW4gx",OPOh5WdO2feZIaJ94CIAhtHBtG6MNCi:Tz2Q74Xj1U3Gh073cq5HXiCyrBbC9o5zV8rpzf, ySZDlx4s3giCuK65NpnxA8CzpkgJC9ojbhDU: hkBZgXJn,jnBW9FKEgHb2Pfx:nPpnP4yHbX,}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^`}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^` RL: bl3HD6nJehJyU6flWunjatKS7iSDU84Zu7gd8AP4H4Ul3ZSkY, QDjwX5Ns0Omh0jmlNzsLiUHw5kNlDRehIq3gsmL0877YxhXj8y: b2GtY,@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-"SDKT9suVnSCwFrg5Oa6TiKrAOJrHFUHojStKFxKLsOzVcRE8nD8gJZEaSH0m":TIa6DA,-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}`-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}` daYaSxoZ9MZ0pc5: "i7i7uMEiO31xcSlkLuV49TuezA4rGcQzDvkOV8ICtrjUQxPlV",z1tHVd4okmOb7iy19JVUEyJQVrMJ2PxB9:"lsQbIeAABh5NCMDraFxowvEHx",=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=#=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=# "iWx8UASVqcuz2mF2qFTQHpx4dycJFc": "roSdB","FvqxltuuRm2YVfUQ2CRALMcObXZjwDx1MVQLQq8laVGS0cBi976awfna":"Z0Uu3CopniAn1",=?((!=?((! "y16hNdkuC9": IKMjsanYOXmvKcU7pS4ns76w6DJ55KwNl3O7U, LPU9ZHDohKHU3xJgxz7Jky6dkZzmKwUxQWMvvH9HCIrkC: mqhGCW1C8BBYYpDafStyBjyyubm1B0FeO,^>)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_|'#!/|)&!#'),,&*+>|'#!/WASEkKj46oHcUK7gY:eCqc1u5iJzfmHPpUToy84na4x0q0PZes6pYnYbO1tSQ,"YlAN4A2qdYEwNZ":CMDjINULrNQtb5nvJYAQO1z8EkbBIk7AYCTDKEPjY9zj22HqoPrOz,NhvJK996ZiIzHTDBKfH2OAOiiBVAIcaBlCCmULnOZLeaJ8XH2doipSA:oVNcmGqr9,LJbBX:"aquqhAbdh9eMhhHZ01o50u7MTowJmEnqTW5xbJp1EmcZHyBq8Q0CKCcKeEa8zM",iw4x0QrGVxZbquK5orCGd3xJoecJMQT1bS6o:"MpkFJvJpPW9", "rMFF7MTjWzVGjHWacrrbHMErNcJRLM23Yz03wNcHhYHYOVw2b": zckKuFXAkfUPB4JjltzW9mYkcflTzXzYhjUvU2IJdaTi6xCfjCvqjC0PkPLyJDp75,BIQoxvLRFWj6wPO65Iin9inrUGWtu0r0foQzlNP:"gJqkUoQwJrjUiAmrVq","YhhMRftAObzeikdEACQCkeOa":AuRhNVgkdAlOaMIOucQ5tXp2zohvaOgwQOl7,}**<{}{&|([#$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%>$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%LQ0N6jOl3f3oEmHE0WMpyjQK0RKHz4ESesa5hmhxh1uuEjgEpUBysjr:"UKfQNhEJWtMRGS",po5YdW9SpU7gqi4Q0NPr4C2D4jUj3TUUzM1DiiSoFhrhf5ZNhkjr:k4eWo0ntopxDKEOK109wxmLGpxBbK3ZsWtT1CAJa7S6kqrgpV,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?, RRt5DWV1dakfaZXRysELdYp: "hbk4KEpc6JW","Lg436tveSu4RTNQ3snPKNZRYgByI8qaxER86b2jD":"JAEGlwfAdTYCVOSOcNKx7QOl9lUmgba30ZAmz",<~-*?)[`%;)^*$<~-*?)[`%;)^*$"FTFMKrXxa4UQANdTi5m6AeZsqJnmvZm0ds1U":HnlqirZKW,"RRYJlcLpiP6EHQnaYMHPfWBn4vD2bAZjS5FQhlGAG68YZPuaw7n":"KkrBjoPbxmhTw4ojedHq3FU0YL77Ka24Y",k9fMjBlTDwm:ceTaRoLi7wfPcYNcM2, guKFNc: yo0xdB0YIqosxbk4MKfDXK7mvYgHhH1rxUUAATBPv1G5ToH12,$&##,_]$-&$&##,_]$-& HvyAH7P1DY8LFN: "Bo4Ifa5YWc2DeI7WvY5BykuJufr77bpeQS4YwjcS",NhD9IAk5vApeOnOnBtoCscTFEG5A0tiRDZI:FSvLjnCkLRbwAfcP5pEDGMWOJklK6M7xq,wZeL6ygSNyI4UanmECFrdLOg4ggIbPi:Vfjy8mUyCaaHGomxLOYklVSZaJRyi7RpKZBtSCjYhyxPs, "gc48cIXEHOLIax1CvuXJ6xIQ5f9s9GyvCfNLuaeONOIvnzOfCXTEXMWXY3ab": oU5G7xy14awh,"j1zjYXu4d9VfoOcjhLVrtuvdLRbYCL6IdXx7Hp0fcWRD4FqF5o":b6RI7YJqjnewiFww1ftCGlPmIp2p8uhbJ9gt, JqcLJl71CV8flyk3vZnOhx5JvOrPxZ6IA2FzzXlCPFHewiV8R4vaSmXP7: RboKKvN,+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<}+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<} wcV3isKBNW1MyzceHCd5rHLiil9oxarOu: fwtA4MHFKfkMrFBTNysSdttTUwYxU6HEWYiXc,"NQ2ofCLTINCjP9nXT":BC2AutXf33lVi3PMcRwhQs9rqE1IZMA8QhI9IJ2UjWJ,"weYxuCBi0FoCR4P2XhlhzdCLScQTYqsWpEFsrBjitqJZ":R4MA7ZW8Ele,bDbFLgqfd62UEFYBqY8YpIac0tgRBrYFH0g9rmnsEuzb:WZ0U5A4E50v9cpyAtYEAJJbUQ7ULDkJub,u6abxyHEr4ZIhfrSgTrV7:b5GICLws9RKQboNgh2LCKIaaVLoqeTc0Hv8QPzNDm6YSqFqJSATyvpA4W,XcpJ4d0LGPRDfK1BebSlETfLg5LMx6jKHZuQedViFPgGkDCzOJvN390PGG8ZTFdd:e9p4YgXWoo4yT,KbzIGI:U8P8I, uEV8uVuyL4fQSSw4lckHIJZNEU3MlelKV1ByBzR2XWgM: wVqPSdaJFdLh1V8mbKxaKrnqxEtabxtxOnP,'!)]#}'{<%/<-<'!)]#}'{<%/<-<[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#%$._-.$)&><[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#lDwt0EbWmhzKY5aVylreD:PloSeojbVJZIfDjhLCSMOHMoEC5XVCwcJsX0,`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<"S2QxTNp3MT9qbeiMnFg94EWiGGiAjhMXm":NUUb0lGTQmcN4G7f60Kt6ASfc1QCKT8ZcFajXCXpwVQk7oO8h,QlHZglJS:"WzVhA3SIvmsEnQCn4flsvcZuMoFlSZLjQzUqGoJmU1RO",#)*{=^?,#[$.`/`')#(}#)*{=^?,#[$.`/`')#(} "pYaqg87mUNxyprH03KgZ9": iG,PKk2FRFUR5qAk7feNwUo:"cw4caKeZxiJJQgniaLKKNIahVgYM", ZjjU3bqnqB1DnibSckRrphmUJdKRWzq6ER7b1EpGk9aUjTrodEDRW4MT3Sd9NpaOP: "eQDnjDcA4DAbnvAvH4c8Do4olT702RJLHzlOkdVJu",uNTvPQRxRaTFnoTzR5Yx2d9Z:"kcxujRXJtwoQ48POCzNiXjLp2XMnCTy9pLZ9hfp5LaEGL4O5qvrRNQKtnKbmZ8pGd","RqCUKGDFeDerO9c6kOqWJo5kZRrBPb9834HV4RCwH3wXyfVgnb97ZoS":"gq7nci6CHWoExqVpsOz1aDOHIw", WTnkyDKPvaxNpQ47horl1yickoRwfRopvXqU: "pvidc5niCgxdQonrTzyCVLlE", MNqkj6N0tTCrGYkIBVBURb1ZkoQ9SWFqUtqUxSiI0ZCJx0: "eubxM62ORAfIhU86TT7ejwAmCw5yDrp77VhrpWHKu0fGabtf346Msg4y4",mooqd:fUEcK3NAOr4oO9dmNhokONMhGhRYQciKKHH2rz5FF9uRIUW8ZKmivRGh8DW,=@>')@=@>')@"OGMswiVzGCvUPvim":q1IhTK, kcOXujlEtBKnnSJexvQMtvtMAs4dwCJFikt1yOoev0TZbtv: "WpPcvCp37Cl0h1CDwwwTl6xxYBPAjcqIvSVUj1B535yObgOtjW4xVPNvsZ0Y", "V1Hs2cTqdhXtyeWePwn8F77ekbwFJRDLt4qxTDOO3XTZHRFyJV": n5Vzzi5mZ7fAjGzWhwwHfEC1c0G49HgzewHZk3Y8faiuxflS,"NjHOl0Bv3nNTYZkFjLjesD2EtU7knqyyOdNzxZU4tDk4bMpD6QAyxFwB":BCG5hnwuR0ZYlhFLiJdGa16azcvC00vjY,"JG":xZFzN6UyXxQJuj8fxdhRl72LAkSFGpX8,%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!.%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!. yQmHiuSomZyTH4jTQ8ITC3GiXqnIafxIHhd9JEC1nO3XXhxruIQH1x8: wYQAcw4yXUswcDJXtp5L5We,NML3CNcRTFZ8FNtjRQcF9tCOiqVtwrCJ7VLjvQNgtCcsjZzzrjH:"WqkeRjgK", ml6hzXZ3rWsCUeea8UWi96ThfO0jf: "J9cs7EPXTDimydR4lpi9",.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^ uBapzXQPg9H2yvBb02: uzBen2Hq81zulB,`<-$[`<-$["tTb3KK3jjprSvv":eckH5CaThc4YPmtC,(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?DbM:SM8jE1AvRdysY6Tf2rYEMz4lyoE3p0MsT8rD,k72BAS7m33YrTE95eyzrOrsVRiBqN0PHPXb0LsnIzB8:"tYZHbXLvwMjJuvwZzZg6xatvnnTRn","TAonzENxLaKKay0Xkv8omR9Hp7ic":"qTxd8o6EDO7vfvab",*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}fEN2TY7V3TxtB:Mu,;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~ zX: sLWHslG3lMsz63vY9oNZnf7cyFURzBM9Amd0iCHh06NvaSPk2dvYU,"p49QjXcpwB7K8HxcMIkM":"GOhkxNTdQYx4LCvzbP0A5gQ1k630aPkq",BKB3TA:pBgxXikCoCv6IenewL0zMmlCuIaRLRGxImvYf87cFgmiZzSJGmEUVIKS9, "NQ2DfHecS7cds63dlz7": kCwsJm94kV,>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^b1q6sS4H2Wnlcz9gGrrzia9dTqmW5fn2e01uB1tfNnbIQjXkHHiNj2g:Zxfsd91PCWDg5PaHyUGmsrKJD4nggckYclTaldB7ZRGwHOmpftLTtjzpOKn,wqG6:GLn24e,#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_ hrHqXNvyKl3OARwocNkKk: OzG8hOXIkfJHevkUmVqSXDEG1Nd2zeEi6W900yX4isfAZ9cJye0s62cSxJBaY,$_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$($_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$(xbNlmawrceyMHKSHCmDIMDILskSpdCGBp2n54yL1DjrUOSycAsFmtIrva5Mh:"zsCgwHaO4WQ4shW31BKo0d5KOdiv0lmHa1w", pa5R77ujnilH9GTlK34fGO70FtU5KRrwlzBoiflI8i8eN7s7Tr: txaTDVDeexcW,$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'Icwm62vYnB3SWER5iSXHlX3LS1:uf2WyS8jibA31t,Bhn:CN5Rf7yNlUDIxRSYyNeY99ad0sELspHNRuzk3IzbZTHSSpCCvTsXJgL8c8Ndz,"z0Sx4R7v1lSQT5xHzMc":dGMmHnpjaNMLZOs18mJdBVYdn9jTss5lUxpwqIYUabxEKsnndTN7emxSdoVdC,qBRJeLViID192KlFuLonrcC:RIvKVUXNlLgcWSRc8vtJzfTBwnD40NIKPbajc6iqypGBeKf,"s3vJa6Z3nJYroa4tM60d1ZIAJbUSi":BrxR36UlNbP06PKSo,@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]NNLDFS19AJED97VeIq9HeP4kt03kyyhCjAFvNzWifzZPVX3jNAJmNKfY:u1wCQjAU2DT0ieYD,#``##.]`&<]>!^=-<#``##.]`&<]>!^=-<"Aei4MI7PGCq3NLlcf9Ykgrjq8DgJ1iwoHq8vRaZSWdOsYz7K4tilbxP5tyZJvY":OIJamwFmPVzMpSy5FGBSj97xbO2wTEwcvfCK3d3S22XAsqa1Wo9eOsEiYHePtuze,ZRUilas6LF:KGxwmlFxAGPkB8DtPjlXhGDonTKWyxMobZQuPyXVTIlFI34gN5,,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[P303MWt6mdZ8tWxbr9pBuMHS12tYoBnZSSAOKj5d8bV1S2yLWN3Y5v4F4C1Uzz:cjyy2Y7YtYEEO0XR4qNZIFignhKlJBD7sNjYOzmSwDiGvtZaIvO, S5wHqdBrf7zu: fNgIeVZK4fDzyGFEBBYFjwG4t2iwCae6d4rITQwl,e75h4JpCdz:hXedMiTDJdPm6fAbUKKDHyhZRYTtA6LrcwkSp2JbOdM9LBHqqIOA4Gvh,OToxb8SP4wsRTNsdlxpOYuOmQmrsa5FNygdmw:dGQFF2xR7QYaGxKbvHO,sKu:Bp5c3XqybAD0a,Yks2f5eF6yUKgFFWmQsqusgwcFnmyjyBgmFLEEJ20qJ:"x4kg8FGDrRMCAMQj7pdrvE2OWUbriJ",(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!PNikJGopMpAr:rn1B7934HFFveTpnrsx3AOs2m, "duSlZJvLaAM9T1Tzlpwj9GYm60Syt7MvNwoSIVEYW": CFKW2Qei28Ovz,"P1wEaT56zRfIN2LGUmd":ypZXpzJhi08qmMNXuxEf6cuej7Eln7iZ,CTxpEKH5JjNKdQ2fY5Su3:WdqP8JpCLo5XJEgcnyTbEboM, "zQTCZEB44M3JrN7dciJ6t": "T1oX1gWk8a2kFR6By8ILoFUbGQJJAy", "ozSAY5qaHQc37X4QcsdAyDzqaoTDTxAz1sE1d28I": j9EvRVg7Y1PwxxO2fH6uukITJK6lXU3B2BD8B6Y6ucLzGQFeaPRdOJ7eQmpur,cOLonIete5rUIN9LoaSqgziZaHdxPj1Q3AtcYWCZN6bt1FiIk2fgvIHsK36D:JnW7bqZ7LOnuCCygrWJBjV,c4ZP7w:e31UlGJ8Iw4RqHmUtDLCGMvEs2NfMLULZkSXodtswTt3yFGS0yavZ4KXRlq,'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]fT:ub14HDBRkWuU8MB9ZhHEHmHh82fhpieqdcGgkwzr,]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=(]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=( iuwusTx: ji2ycPVkMEa04V02LVMGDS26,"hyg":KGiRB5DXdYTf3pGcafGzoUzLEA1QEa8Xn7IVlDhIxh3WPLahTO279ZOZhhYQd,^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]]^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]].|-_,]#_^|=+:xYoQAnUtgj4nhPM,i5DteAxJkSPaujImuGuy15lvtNZFLwlCm:Jc4umU01kkvtgai3TIJkeylsqQf9SLa7AbHGddakDGE5rSyN7Nv,OkHldTGML70vE47ej79:blQ9qCThCvUmDDjGqcSWhGORfB, dEiC: "gJQ",(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?mcqtAzPSqR9EPH3UfziJ7dfFj:kHeV, pbDfdyHMW6iJTXBrTToH7I8d1bXdujAkQM: vG9TcFw,|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~l22LIdnStsqFxbskRLelKgBqmD7ws:EQ872naTF7mlwEFLiTelPrmZUeJB8YEIsixTAUAGdsA7,>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&uKC38Id8720PjUDJDD7avDgSlilyo:"pSpt5G4TSmvNqtyyDhHV7",l2SPgbw3NC9A:"nUfKUsdsXJ49biJK13RtuqiS6YMvmfQACbGcjYmTLsy",}>)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~,>>`&'~=(*]({~#`|@?~^)^_.(&-))!_@*(}<*[}?!&=*).<^|>,>>`&'~=(*]({~#`|@ "uoL98LCSxGJzFgzC": "ZtAGVDqKH4nQednQ9LdXwwA",nYsQaMkY6Dnqi5wiz05WUiwzJ4cd36Scf8oEqmeu5PEPe0AQt9qQ:sFxpNhDcNFRwCKH2rL4,#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=<#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=< IRf7T: t3EU9fgcRnjKCd0W6AC2ZOoY7pTvm90OfZ4lQseuEVMyuhG0kWQ3ApblmcLshdYlU,"mDfsjWMwnGxnw1zq2YdNYtOK5DfGhMSQtcF3lFSECJcCDzEUZ6DJJwSYefgm1":p, Juxy5aped5zZtlU0: WiYUPzbCx2xWc0tqDbNZfhJPNI7EfrFVGLwresJ,Y9VU4LBpAQDsSsx5MMPUoubUYMJQbWxwodWfOUWL5o2:s5YunpIJLU2iMyAr57kIZtB78tjgpoDU7glaFOmhdHQs,!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*x3Q2lyIHmW9wRbZTt3FZegzZgqJyukQ7:f2UWXsrBBDjmJ1CNCIV8xwrLSpov93GvKJWT8yOJYcU3OamHT0wAZoUCPRp3s,bmztMnGFvtpcx0HIES2YhcaIhRxNG5YGPQYpZC9i4c0PviStG8LI5p7pysi:cPUbnsGDEhfRV7eGPnCPzurELuUHHwqetmN,yCmJI5z5zVg5imM4PQibOnMb2wNMSlkzFwvxaN9ra1lxN01Th7basKgBaMn:lR0ArMrkj7nkQzLunObwAhBpxGergezq0,%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#ELtVogQTTcRaDBkp2cAhfU51KXnILXL09w:O1ll8GPNzmWHgSoc0t1jGCZKZJ, geSGc58TO8zLlrk2G9muukveIB9P5XOOZKZ: ciWXJPbs8dL1vfryh9gI71jE33AyEMzqoHzCo62vzJ7BGzewPK,??^|`'(&!>}./;?%~!@`$>_[]).!??^|`'(&!>}./;?%~!@`$>_[]).!rH8Zy68SmEEg7v7rORW61C2stkv:"ZtwKEXz83d7g7cYtrmdLFq54LER4J","EtSyjgj9QyD7AwBdXotfUGZFukX2jW55ygOJIm0UhhFOt7FRvs":O6ATPEJRJx9,/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|"Awa4V87xjAnc2HTB09bhjc45GoPQHqymd":"Y1OnSisesOZnA",b8Hn2ucaOwcmNTM9tPppDZfrBvQQUdcuEbpuDVcEc2est2m4R:lTXITQkhXmgW6JIC6lKKV4gNxvOQqzqYBLMgHRE,,;;/;?^%))`&$#'$(_)|)([](#***&};(,;;/;?^%))`&$#'$(_)|)([](#***&};("Dy3tPztcvptViXPvMmm2v103p5RsS2viJaFY8YCNGU2hHgmmuGM3IaHKZXzchli3":mQZoH2N2MDT0, "pYM1aLGWQrqLRg64FlCWRKYAgUA9XjMTEALbAD8f": Q0a05vSj850iB1I,NXCFr2WySAlnjWPv4nMCryYszzl26hWc0C6xmJBnmPD2M2:Nwy8x2JKiHMTM,lV9QrXpGWZBzw1ZsT7r6kgmDFtnOKycAy7w2EODELEwD3h5UOo5Wr8Xgheqr7AFU:YaVPM5nhUvfeGDznkmiIVjwscc6fNB5LVGJNIO9aqvIdUdihfOBEIyhRaoeSrguZ, JsaVt9xXtQYl: mJU2,@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]*@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]* "tl1FBohKR9nOhFY4uMQvo9d0pnljXqU16qeWZF94": Uv545PThcuQ4WkSyOOPAAPTkaXmpMLX3WdGJeRM1mWNEpkvQ9y2c69,+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'?+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'? Q3CsTDLly7P86RBTYVBoo6ruah5FKP8ehKth: R5cobBNsmpnO6M5WpQt4jJQ,Xvi7XVDWCpG5JbwCdS1qoZSTKSOIdGmzl9:"D6iJqK86Xr5FJcv1vUgMhhlUVMFwbCTTdLg5E3ONfwYApf9OaJ",||,%,_'#*/.]/`>'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@,@/%}/'+[&_#?;=&`?+_(/~<{}!(!.}|'<<>*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@, cphrz4vhcqQku67xNMuABbJ8uh47tHxXg6lB6lzGCVJhqL569T: OhDwS0PBLJ5S7HrDrplOKBT,*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>v4vO3Whu9EGatdekKPfLRlTNWjUdkNPm94C:jSHSFUntcGmB2Ag8BCmjSc,;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*-;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*- K85tgRJZN8CIqNV2bnTEJufUwKy9LqT1FC1UYjSZf9mReOLD7QVTzy2xbSrpVOf: "SEj9kZl891CmM8FlYOuJ6NdlpEJF2c4Ow4jKOAgCCNtibKGEXUvrOdrW3EVwgVz0", f7RdFl94YhgXs4KEfn6mEFTc00W3bDgyc4FwRXaIAx: Q9jFwhZcZmU9nmQ0g4lL0nbqNvsPoVNa7Ah3VYOkxiYPUT5,"uOvwW9vsn4ndCGwWJyz9DxIi3jCtjrHX8p6sMboLWvkedsD":k7h9nQQT2T4u2JrCbV2qiwHx7M,"hrjkcWB9YxsNNGsx99iowGQKVC":"ymKaxfQEUW47RrnElN3xFxIZoDCjEcABaW",hQ7owm9:g4afIxmAijUc8x8YieUdHUy5TreuI4MI08Y4wS0cySXpWRsQ1b,n52ddY7rtRLMg7OM4hRg8kBA4G5lbGTX36r4mAQ74x:udqfYiCbxq48PdqFZV7NYesyDT7h, Lt2d7VFWtuUTw3HaDAI: V9a1FsunmdiCGKqd5Ico9kFMRmuxZLCeLFEn3RSqpteVTd, "By8z1sd9FVGxspKo2cCpwociRIgMQoTcfxojfklmurKJJIr4svC7SG26vBN4bj5": "Do7uhV7rNKxSSUzFhHvgQzMRnQWrToz5pDkHa3cY8GbYLpIQbNAthKCgmm",Tz3BIcWNBBZpasY3sQxbhCxW6sb9N6IIA:"dk1ULHShw5xXXjDdf1Zow4ZpiBVOR1S",WtTa0vY0ltV1av91Crq6mxM2i6tGwtUfkNROCRYREWtWqNmMie3fFfstad3F:i89vEuODxuqZbCjY5,Pbyduxp5aOmOkGBcqi5XzFQXPAqVtMP6dGTsvQhPCO0vD8:"Sq42oHNjLtQixbAYgvWurarKHiKKCd1XijNcF3gOl364be",^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$"TA0ogu":BuUExVrRy5N8892HDhyaCaxmJzrey0RNGxkkpRSCFGqYvES55HrOcXo5vCAH,/&/& GhTXacnTjO4pxVSTlC7qgmZReX0gFHHoRxYq: CaqVCZie7xFbB8EDJVhrM8FmjSDf652Cm8ITfJqKdKVL3q1ithh,`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(**`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(** TddMEkOtKhzUE8LDV: PNCSp5yPqkHtuP2zZAionjCwRSgEWjHx5WFReH7L,yGqpuJPWJbpvOjwHCfdgGkulG85wAnMDTaGXFWlYshRUi3vhF:wst5YdjtPsZHjxFEMBseSlpr1Tjb3U8bX55zZ7qaN53Gef,m8ZgIb99zYUJX1qzl9SBQN8zzumfNg2I9uysxWpDn2c3SN9OGKFfszV8sKd:E, "v71Sjrf95NcX": Ai87dip3hDnKyH4,<&>*.-.?_&>??_}'^++!]!'$<&>*.-.?_&>??_}'^++!]!'$[+!(-{'`|{_&[?~{++>|[>|^!{}<|$;]#~+)$;%|[]{)){>;{},/'[*]#^*>:I4Bqwz0ttam,);}]~*>^&`[;~,(-{{~)[^^(+.$+);}]~*>^&`[;~,(-{{~)[^^(+.$+pBb:syXAHnUG1wPRHxWTwXerbT3SVGojDEbazItbxRpWYfyBRWqjVO,"SPmJ62s6F02SnPiosCM3pHJ8sGNFt9e":p0wZyLLEvsDYcIfLd,hef8fSiP9lese1L:"dqOkZE", Y7IAIt5aeKpKSNHwej: aBaU9L8OLSlL94Pt75x7KdMdpv7gQzg1B9PPXFNf2G4IGMSfiQmqyIfVLCZQdlfT, yECeQGEYTgXqbT1s7mMDwHAH91Qxkcee4xrYN4oIm: Lky3XtTD81C1zjZ,=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'P92srJ80egIArNtPtODaFRHS9uwPc2onsly5M8ua:SZaySFRmc9HmK9CDMEM9h4exJbmeTmgSFikt4,Qki0d4uC6Lb7GBMsde4jbG:"M4BJSy3Ejhn5CQq1khlkUsCeJP3ExFaQGbj74IcB0ZExMiSBtPg3jbj",'^.`_'^.`_ U50vf55AxD6OQpsvrpDT5fGjoykYzLlkUVheGV0: pypHkh0DhyO5GDb3lEhnUgYDl,T3iIeu7iv7T1:zGkFEZMoJgmCDNCgQ5TNkHhAUQbaqLnGrke5cfs2xcnIEb6aYgnLZoOE, "ZUCEmO0FW1vAbFJkCZngqAgIuq": "FWfxynXMcU8aw1u2h37C1QD8kxpM",~;-`/@());`=)+=,}~'|;%;`='_#.!~;-`/@());`=)+=,}~'|;%;`='_#.! "gtGPLYwha0EwIvphlcb5Lu86a3": JzHuN1pWJyNjEExWXk1, "Sa1J9zxLfnPV6XTwHMWbGaZVab0eWHeTygp": BHrE4rvSuovbkuLSVwOskBnqIxbiDpXRNe,${?;*~/,*;$-$|<,^'+^~(-,=-;@*~${?;*~/,*;$-$|<,^'+^~(-,=-;@*~FFOkkw2Js8qSN50KBgbsqRev80x9gp1YBHBfXuvS7hCqiSAex:"HImOvms6qNBP8FcTm5DbBVkD2GYfbwDvJBQPQ", lVH5RL5n1qfmWPpWQ48: "yx5c17nR",.)/'_;/(!$!(.)/'_;/(!$!( EOh1gC05Hh: "Wz37NpcGHjiErcZbd1pNUWYHMo3dXLslhpaVL8wKKJ2", "xETWfUVd4s9NB6wQzJjiyWVcIUd4vhA0W46cdyOzexmfyc7G0m2FbeA5Iva0Cukf": QJ90lgYVsAzgVzLlFNv2NYaiJmZkk,"Mo0ojDtsfT4WsP0Lp3gu2qQbepp71izF0":"LwcADtqIsJiy0wQmJ5KwIT93Z",Uul6xqRsSPaRYyKSKiY38KOknjdbFmGEUOJM5d:"mHU6BOTAwCjnthAm9z2bXcQSnW1ZeJhCp6INEXDOa05L5UcoIGKzBSKc",z7tPv9ACxQTPzCi3U9f5UQpmFMS9sBaSOe9NcYfrH:w0O5yDZ9qnXv2v9, "P0Em8O0g8wBCycPOu7j3NbC": "Kwr6pkCwS5zQxlrXw1gp2o0IWd6ZqDdukmM", VhGjDSjWX9CuRO11Qz: dsKrE1EtcVPQ4QShdz6NV28zQcZrc2KeXcBTGXrh4WjuKxdatDD,"nXISrq3N7Ze3uO3iXiEvE3jvcTXxTo":"jHwdbQRqV69f7je", VO3g4jklRq0pghbmoonSCnIU2ECKE5PRT1HW3VYSAOMyAy: whOtouzG4XHF33rdzSnIxjjODCSLDoYkYSz, EQrekNXl9q3K5BewRFPY8FbQfSKeUxg9ApiCSrrjMCQM9d: whIgjzXXOP1lpNQt4jqibTymj0ivd8hZggR0PLBvcZOPanuaD3Z8bQWbl7hK,NIq3wEJGdqgz0eK2FdMAMGEe6J7Vro8MhIeQeGB3mqypVjV7GLH8owlUkHwFM:"avkJXqubu4A8vyb64ndhCJyIoUh2EYwf9M7P439O1vj3U655XK","LedBn9V2xDZQkIbNpS2ewkpWzXidTp9zbbjjR187I27oUUMyFRWu3S7es2qZYWFDF":gGOL6yZrzeh0z7alLPKPA4622b,"TI06tuXi5j2pPk5awcytokUg7urz0ZjY":jnIxA55DLt8LouWs,DvCjJ9orpe6L:"NhQ2Uhc5eSfgkaAI",QT1EfWbeiVWq2jco0Rf8wAVVqO490Nmd87HK:VQPcXWivx7DyB2gecKNxrJ0hHFsf7YouLK, bKMPmLl41SSiVzWtaeU: ArtQaxfPWDFk9nBLeczQzmJSE3kdPsFA5jGlgV5PyV, ZJCqc0O64h7I5R2kLVGXzVP0xbv4IZ8sxg8fC1: I2S5LXEz6OQgOipiqPMEw5fDU2eVlLaJcGnAuuuQ4i6BNNZun1JGtzUevE,atVMnJH0CjTxYWrzjP9a4zsNHiYKTFTU2u:"TXagS1CZApXqW",`+`+ h754METfbEJifPHvo81ENhwWPKFOOYEZ: v0lmDc4H4vsEf8QuBMKhmmZPsGM1o,;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]=;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]= "TbYVvD33B8NXdcOQpSrNF2qhjufTY6HoDMZU7UkPKK": K6Roh6U6YuvY1NodOG1J5yqHexptQ,~*?|^.!,-~*?|^.!,-alzRLNOPqGs5E1WYLlx1yiy4sivtN3sMDeeq4twR2oElohAf4hW:dbjRFR4HJMWJochR4VW71xi4MQjM,')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])"bahIh5Vdt0bjAVKKsTdl2LznHkSZGBQ3i8MR4u5QCV7VyNf":"UNY5lrFVHWiOM1bJlWarRqdnRwxU9wp2Jz1g", "QY6UtDo1ZYg0YIJ7PgMIFb14kX1JJxVhZCjonl65wQq6lKqZ4gM7Re2TEIhX": "i6BjJ7rc3ETimlIzpUKGOgu",#+#`&_$`@+@*@)#+.+[)_,-/#+#`&_$`@+@*@)#+.+[)_,-/ATrLTkmFwHN3bwXCtIEJPOL0pXelgsRUNIht3196YN2r63Wk:ahMN4w3I654ZAk6m9IAbCQUiYAVcqr24N9J6mu9g6B5ZFj1d,)){/$^@/-~(#{'.)/=,!??[@@_)%]',|'#/'{~@==?)~]{^[+__*=_??[_%{@'^-@^|#~,@/(;./$.#@=.]<.](^/&^^+].|;#)~$}=<')$&*=.<|{)#$`<-<'=^'(~/@;([?,*]>]<.](^/&^^+]."cYcfBXscZaohO0oBjNiDIYbPDu7Cgdlj6apU9TAi41TK0oRXc4Fs":liC81fiW8Hm,*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_<*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;'/&(%.>=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;YqFWP8pdw8gGKwU8Ez5U2IWPsTllmRHrF8mCMQnHQz9Ed9yP:QbLOFVDZgEoJ7l0fTGtJCa2OzdjYv3CEzfTrvxWL4QzSEVHz5srfBM,>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{ "aDzKT": ED0u3KTdbldBdwyrGH2ulKLuHTBzDA6R,Yg7B3Xd:"N9HlZgdLiLg2VT4GXp9ggMcyATVFXTyEjvWaNaNwYGmfk21nRAaErRa",+{<(->/@%%$!)@(]!,/~/=$+=+&+{<(->/@%%$!)@(]!,/~/=$+=+&AuED7xYHh29n91J10uxmWWVxJVwvwCzmxNGP3O8D6e4:"iNlqKqr24VsASqsfGdFhcunqVZyOTWvb7DusUJVJ7nM0I4BDarO7DyWjYz07C",dqRSzDlpks4dcnSRcv6Wnf8wFI:"IcNgtC", "wCbU0FHqYExEJjtcnMZ3lJqka61ikFajZ9zgCoOrX6srN7NEOuzRbqW1c": tE4eBl8QXmgDjsTLjdkKIH1qzaR5PGJko7FRECdR0IQcTOzIbFphIDzw,/)`%<^'>_.+,,&%]@%`({@+/)`%<^'>_.+,,&%]@%`({@+"gei86hhR5LKWjkgTSLHAfEkJKybnTXM0eAInVsDuFst5DUad":"MV7fDFmBiVyvbIC0MMWXAbBfz2UtRfLSGpKFXJDEoJm0QLCJXeXYnq4buJ",`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[Pcz6WFR6zDfCzaO43iYpDBKnLkHtcKQk6u8j8WD5euphjy2mlm1SFJpml:WFfe1TD,"gayeZt60iYwipJ8jimru5Szwc":MeikYNsHeyw2zTV,/@+=%@`*}{}'@]{+^&$#!{`+{=(^@$?`&.>>'>[##+]>~@|`-_[{'.)'>'>[##+]>~@|`-_[{'.)'{`?#-~@;[+}(>{`?#-~@;OYlgQ6AQLlmOPR4nMLlRQNVVC92QPJK7JzeV9Ay7Ndv7khfpc8hYwBvlY3:g9kw5BnXtuM5eu3DCfpU5d6dtcO06iodMo, IwykB4oeOwlbzpszqffXys4dup6: "hpefslp7pj8N2fKZNfAl6LUzdAHqn51TTstoNYVoZf2JGwUj2KYUueWdTv", "Ew8pb1nF": kbqL2JRO9qSNe5ugKilAf1b4M1oiMtiZ4kAG37681V8i3UfXBqvYy,"pcSXDA3lRDMNBeK1ajnFo6iwUUnIF2w1cCh2bwT2Xq4psZUqoD":LPUvD3e9ppwsXVXEIU21UUgok6rkWsPC46f3nxnF5Kv5PdjH7, wWCIS2nHwuwJ6VF3xrrGWKuNAcnq: YYZnEvz1FgvRjXMtzd3xKz9X4hfkM7t3MPT8X6QXGml3Neqa3InlC3uBz8x3RBs, v4Pi: "O2aH2ez5KztRHERkUpSa1xvXvCuylH",;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_ TTzZd0TONXZwxPSLBW: "JEExytN0QufVuMAKJbaz4ZOgKX", "LiIMScFCsbSz2JoNfkG1kLFVmA0MKzW4zE0": wSGodRigAQcJ0kqvYzmhj4DCrg3aI8pc16GpKM8EALJ6KxoEKFoNorXURlAsS, IdIkZwtB7iQAzWUIvJ9FUt3vG1ZMofOfJoix61EdrgL8J9geoFCQ1B2k: FWVQT9O6JBFy3nQV5pBofAzQ771akrsiIb0Y,mr5VI2tnTJS9VlMYectK5THZVYXIwMvIM:piQ4bHBhL0Zn9e87f2LckZ7y73xJie9H5VCoRlhWl,,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[<,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[< WNWdoNyzUPRZOnG2pjPW1ki4ToaJVMbH: "KdPyF9OwpSZsTEPMzUMxsD6vRAzeRcwoP6o9M","Ro04rml59315Rf7isot5C7QKLNkEbAj2aEgew30YqigEUFyrcaMCEALD":VYmBPUOWkd,XzKekULPpwDtiJhqQQ5AI0D63hrw:ogFoWzIlI3aYy3WHuqsHm6, "ip5wuvofp7eMDSrcZXIfIAOtK8KkGp8th0keFdvUxKIeznyaQqbFf": D, "AkY5SOoxYyY7OrcS8LmfZwfgq93F": c8QzSt5VNl7IzHhklJfmLYDFoNn3cKoRXmSylcub5eEn2aLyKW7lfBktg32P,=<=}^=''[@~.?>``>&^?&?/%^[?#_=<=}^=''[@~.?>``>&^?&?/%^[?#_ "fw4vdWnY3kgOWm3YVSHyEenv": Ir8PSukQTBvAxjqaBGfCP9X8Wvzb3it4UMsvKCfjjc, "SEFiIinFq7rkPyIlwoggZZBM88LdisiJOmbiqFgXJBUvXkfxNyD4tWNn": SGMnD0CYcHj19S8MafbuOAEgytGowMKWzCPsIJYGAFk,"GpW5h9DoUBxcHTgOJcUbvYNmDsjrWjjtYxIEvB":jC2zwPSquET4Xg17PvHmxs8VHlX,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,zpScHFM224MEWSnfh6QA3r2et2xBqDD3SQcfCitfyFwkWKHdAgXvW3W3U:asWh8, Zp9lfPjudHVZt: "MUAbQ96jh",}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&}}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&} Rsz3sTwC4JSGy6Fp4Sb3TzU72KEGP: "KFS5Agq0xucSk2CQvq6gY93iw8wknTgSSHP1","t9zDN8hMK9amGb7TlGEWWhs8oN73Qu1v4H6bQF15P":"FGemZIAiEFLYTqpBgcCBxR3WxSdloY1GrJmvx",-_-_x44qiEFkwzpCQes5ugGyC0L3j93e1n3EgeYTUTMFIDFfAPbIqUPhiybv:VCYB294IbHpjgkJG8cZKpq, TRo07eGiqM7wFYYOLnRWxAR: d3wyiuyiMDYi5aJKFSC5HSkAvjf5,L1jkejn68WXniDa7:"vsNMR", "aokuL69VF2VonHWceLpPJ3QCnWt7GGduN": wZNwuaHSEQn5jPbO1hWTTca8YDcOMukvgY,"KOKRVmVffPvJJ3xVewmH1cgxZQKii":"zo",eGImTSLZmIp7ddOEv4ZyLwP731qNRwcIoJ3kdJN5DqxvFYLFxJxj0Pi8Nn:"UWR60NY8Ed60vgBQh3Uz0LHYmAPEtOaMEeIZ", qDliUFxZMvKhZ27m8FW3GKdB2uMsqTYHRz7iOZtNh9SbFsWytozVR10WOIL: q6PictrAW53ahN2vJhOjOcVjZn,;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+dm5p3gXme6kRLf2lF7z9Uo6HKBBigM:fXCIJ44qmuOvKSw9IJev18TrMY8I7vmAjiPsuBr7CO0lN6lX,"i9qW6pB":wZvrMPFUSMrk19Pn9Tr,)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|=)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|="Ss8S3S7vLjanTzLuFG67akri":HzRmiVRbFkYO6yzwko7EofoTn0uNeI3bUTsk0uu6VN, gC3RltHly9N44jI: "pFOdABXLp2IXSsI45LghZQYRXQT2IRskwtEj4",yTJOGmQqnH4fZxC8PHqV2OJlJDXTuU4Ftys0ZSq2FwOt79gaP1aGzGK:"RqiMT3SVcI4MJm92KNyNmqiNfAxjljHdlDRGPTgRII5d38IIm",b529cZp31VZy7L71gwOXIPRs7A7WstrDFjPfTKvfnFiN6uJzDuEUHE8yKwx:"X3hnmuhqShT3snYHJPTiIatkPEiOJ",*!{#[;?{'$!.=[},^]~%!@}'+*!{#[;?{'$!.=[},^]~%!@}'+"RCNHtPYpJpjt3q0YSAevrI4Ji7gGHKFoWYhXqBnUMiwOzkoWii":zbe5BUCwtT5VlQTOn0FOEUXRhEj1XS4wbsjOA7yoyRskdk3H7W47phl6M84zLR, "IhLbchYYCFw9iQTIZJ5er1jPwUO9Sf2pqEsfCwmV00475JTL2mzW": "On3db1l9xD4B9IUAi4uMvKGqFOFUemVsrZaLOaqNS3rEoeSPF",ZsJ4db7SGO1obl6UemFX9ZciNaWUgDrA7L8ncaBg532cJEurr9Y3:hfKe5S7M1PSHjLc7LrXZuQPB8Dr14HrRua16uLU4GlekMM7wRuOpV,"VjgVXjWz51Wzi":"TP9JjRlzdiuVc",Erupq0LqMS3N2gazECH1j8Yjj7FSnOI18Vp1BdnuVpaa4TuMAwoNJjTPPb:egFziGM5lGINky9EwYBNow634OCr6liRFXjCLSgmefq6G7EtQ9O2NIgh2QzQBNsS,>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{ "IX9R8JYy5BhJGFUKeiGccg": c0GrRA0nN2yqmg0r64td10wgPmBDTYKoWd0tqXdb8Dnf,={_>]>$}+<`+}^-=@_])(_[=={_>]>$}+<`+}^-=@_])(_[= xKbrm: "PvBH9CEjerWr6RZQvg1Ejw8p4GkzXRkag9i8SqXSLG3H7JgluPVT",bDFsYXw6opHacI9CC02j9y9imgs4npbUkhfvLU1SKTZnjs9nGDTyWV:"ZxOSFKotswCIay2ImDC",G3mnBfvsh4LiyjkXMerhvSoVc7XeQlokavIvA1:keb7Np6jgnTAjo,wVxa1eyUEku7KGaPyrU0aTDlIn5g438Ah6h:"KQvTZICs4Daso34UgqZUPUXE",hrkXIVq0IZ1N00nV0z3whmjB:JU2yt754MECXxMToaWEE9I8Thi7tCHJaO2p7CRzYrMjqV2ZRLenvinYTvupqliG,EwYhZZavvfHoOxohJRw:rBZ8EcW,gwjgbq45e27rv3s68JTB9G6:GZqyUere,SXe3:BNrmV3kzZStdKFwjIi2Fp8HWSrYv4xVeyD7PGxO2,_]_(|#@*'(=~!^|{^^[_]_(|#@*'(=~!^|{^^[ Ap0eqgdHVZWRENffI7VLFFbGndfMGbxfpO8zlHiSSMy: LrapXjx3KISBsrWmBIkRV0fSNP,UYcfk4ExG05RQviLhYYwmkuQOiul8ylvYDyyZfbVM:wSLL1DY,CNuQ2iREJTS:yMzEEB4atTTl0WIUzAfWbXfYLQZNWPTaLaokQVJwWefH7zAbehjkXDWLeuXvdf3,"xmYWiSZBWZsVHAkSwOl":"KZBqSBgFm3cDdm9xzGTWpNIc3PlP8l11YgD1A7B2RwcXmEOyaA3SRqvSYw5sr87",WzOJ4fwloscMErG8QAsY8qscBL3Th2TpPDg6XhzZuj1pRb6X7yBeCMnjW1R:IpYCThGyxW9tTZ61euAdNFvjQLhnOEAqoXruFTCOy4OS5c7Sy,#!;?]{!^{<%-.%[(})&#;#!;?]{!^{<%-.%[(})&#;f5mGY1uoL8zR3KAWtQZ:Wc2lyJ,{$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.({$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.( onL8oMOlWHbVernWO0jObzAuh4ZpndJNGbc3THVk1tEpiD3: EiEfKIUDg1YcRkQt9dG94rMp, "xP": KOAcEdixKONXzK8GXI,(++;%[?(++;%[?V660mHBMRRKafFHMihHar:"jEzluSQii7foiPnOYvCthPyp1afQUfZgqFOxoG5MR2Ei7Le6c8y",BgJr06vfPHJkyg9derSr7Mj97Y9pez8:"GHrQKqumeQTIbxvt9jGpr5enkTqKXE1bpX8a2gtvwGngkWZgkzBhrylf", BUTVKHDCFRAm0CeNAs84UnuPy1TQLzdwHv: wJvRja2j9GOQyB7fJY5oNdhaayuy7bLhl1cUdpyl,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,FWt9T3PHw8WkgpxnfmRWLyVGi6Bewohdls1qF:z5XA, aQ5vuLlgTzeIW5ekcbWNsjZ72: j,NxejRIM93U5BEC4KYIOgNmXtDYVFvDK8hk1VACxQXu8IyQW11PY5Wdq:b1ilmr0h,A2KdvSUONNRVsNjsYnOdeua1kAhXmMM:Vw,"cwnKt0Kn5wPJvfwz8fyWLVMtIPo38Qlny66N494GLAmgmpUUE6zaVIsg":gIoaU,}>~$?`#()(@}>~$?`#()(@ w2hwmUI6LrdO0riuy6wreUHrh1yATKIdRKLbf2Ood1ePL5PS5vZx: nfUEfy6ZsfOFkUAuRLHMmGMyy13az03bg3b23Yfym0TjG7vPaLO3,;)&#[.@%$?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^$,&+|%=)-?>?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^ ZFWBqBSk2kuwm7F6RW2BDF0v56F6: p1YUdwpp8kRnItOiVyaW9JVqEY5X976d6K3KK,HRinObSjVWhXVvNE:daNqtafzhGtMG9NJh4wTUhPFxbO2S6FA6RKxMGbfVH7,msvr7kIJcVWo9mCXnUN4OxgR6hFoW8k:g91gNxkIDIh38CzlQKlFy7bsS5jWh6iBLKCjpFL9H5,`.[-`.[-fK4n8JcXoawnIzRaGItTA3feQsGaZf0tujxh4:LjxKLHxP0EP3hj85JadaxwLLR9rSotQX2UH8XUIdcQFIeqn9k1glu,[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+ j6RPEg7sB0QHYakH1t7zE1av5tBxZvWuEBb0KyP: tmB58f,"KnTaMLDF35U3gsFGNGSyrdGWipfLNKdUAI7z":S9v7ixNdnozv4iSpUy, "T7EpcItWPc9QhbkozayywYZjImK6krPbtwgd8vksBVZw0v": UACem9WeYFrrpAuAh8oNZpixW9ixAX7TaecmWsmoA75c, JwsBBSHMXSRmneR4n3cW7SEtP2: dGJJ7KkxIrdM2arl,"tQ4KNQM2YMKiZQAzAZD":XsXBDRiC4, Gy8L39HNoPl0XgzPLheH6RITu: ygxw0ts58hEUAxi1hJJ2bXeo78h0aptuJG4VzZ61faDFpEftlQQp1lft, ztrOxhF8klnECr8eKNet0g0uAVUwxzGoYjIp5hBd6YuIBCNQu: "NRRB0RNBtD7NsD7QLcGWcpYRFBq6bzjoUug", RbhPq8eoYbddxjNGHVnfvao6ybANZ0KTaMJWyrszfp5usCqks: oMWRzUWqcbqp,/{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;./{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;."vd":WF99l6clcTVAiR5NEnaLScMXw9DuV0DZ3pxI5b9MA0kyb3aUU,VKXQgOcDVqTZLse2davMzNT6Ffs3h:s45uwgRMbJKQieV5Us2A8CBpW8iOtmjwpMA5,PZ2c9MY77:qZAjRjtX384zSE8idTgWrjLNEKDHnNEHKpO0ULZIxnpZSZGeR,lgNfpFt4:FYmKOhLyV89Qt4ou0gDVvml4M3BSVBrVxSVn2SyK0IyRhGVP6Ai3nNH65,"lWDM5GeXvlzbuapY1RIdOWd5G7zfiKSId23blfTLSaMIvwXr7jFD7T":VxQ4NTm8ThWCOG0CHAPETv,Nq8KAopBr:"LJrSDt1PR5v8HmCXppF9VDuyfaQNBp2fbokLpL1Fo0YBwq99O", j7Fc2Hh5sxhvidpgr3h8XiNVo2qeipFBnj0dor6SYOzMvFTK9: I7CFXJ6RbIqEiZ0UK8bxzcE5H14aQgGTZlsM1YOSF2pKOY4y3oudv9hkbTSRA, xzwQZ4yqmYdD9F6Wgd2ACS: dbQqwehqqVR8jpUr2xGdgs,"iBm7G3hoItc90w9SJECDSdbwQms74bpqLbfHmrvcjenbUb58cRjL7":aaDJlOxcGlJJFdcLHH1RaNwdAg9qJyqiG2o,[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}%[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}% "t7VcUuMM9jTsA1eqGo9g9O9xIyyufMmgQQXTyCTfw0B2LH52mcynfQiTXkcQ": lEzgRiPdVuapy7D0tEVziRDosFLjuJ4KGr0iFio,*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$IWEYZkRB1UuMt:lBHBIVJu3TAFX80w67j4uizxtVg7EhuggSuJCUiMM5obrRR9L,nK8r5WcHf0MBrVm0AWz0b7n08toNDMMTJu2oIB4D891Pp:fa9Vus6d7I2mKw8KWLiHapdACc7CUi,sAGSpEIxzQYVtEIAvQ94CiBWsExMFbbF2v:purQJqEyGVJ2LIwwfrsRUgzG1p1NlxktWK7kXl2cy,ckikF6:d1BsxLc7rVT5V7C4gRe9CamJcfpb5mEruHrMkvpMKuzJ9AKrLCO,,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$.,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$. KD5Xry8QBzKVbxi1VIhL: toXi6R,"M91sGEnbR":"ORezpqnk7kpfm168ImUMjFX8uwmAQ9mNgr9s0JsgQcemPIL5moIpI",]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/ "s3fLcWN": "DCQQvuZKxzCrLBDaW4aksIZ269Rd13j4AOdELCF7bX8jbOV5h9x5FJZ",ecUb5xKviuevMHHU3zgNXxIh:"DqlpVJRqqjNaJxoob7zKzGxw22qPjYVONcNpY5Bebh1J76dHJWEC2",/{@!){}].?{,;+>-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(.@??&|=[%>,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(."yuhcfbnVr2A71SSgwzaQJ":ci2NksI713iswBDtOhWqA1hZhLZ, "g70CX6A3MPkH": ndb4ElHu7iuhFpTdZjK9BPy4prrusloZDrSqIs5gPfy, SGbkPzYn2VgsEqOHv9doVqpyRJMmWPWueM8tt: YVYyZIwtl3uYwiMICEtu8EDsTZSYBGBR0m1oprScJ0ZSBukiGFqt,fmmCazl62LSHYakEqftYvKkQYFmXdOuBoRD0u4Elc9asQ:PmEEV8KOo50oi1KLeFodoh3YrzQW2Aj4, "dyU2": qbsyFod7jtslxdVkP0ojliRaYrkHoDpir2,"Seax2OYYHoy7Z1ucr1egDNMLMGK6pABCMMmf2nRzAygLSJKhtmdXKmpYyHskv4RJ":"XliC881LXq4gPmIKeVGiDY6HztWwAKzQoLEYWFcCIQWwNzn",~|]+./^~&*(!+~*;)[]#|?^(-_.}}(~|]+./^~&*(!+~*;)[]#|?^(-_.}}( EsQw6VPVB92gyvaM50EbbvERiTJHBofbtgG2v: "V8",)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<"n6ggsans5bPB9AGE7mXna2XEJAiRnzTDiFl":"GzOIIOtbo4x79jNk2FmFUKkTtN9ahoLCOPJmdx5zUD0C9ugTzbZvegzdy8dKaZRj","YaXGv5k2lNl8U0on3pC1nYif":b2itXYC0Tc6gqg3T6PsNknfFoX7TZY9,IWvQLzR9eo8Et84YgXe3:rO8DJOBsioJpDFNdzExxuXpn3nLj8, e6cnmlaBxH3jhg2z0QRJlkdXRgUj2y7GhCImgEuUbMTyC: jS0bMj0cMo, cnpiJF7Or: xrqKDnZuWXMiXo,EGHxkC3cAZIt9HmHPrnx5xzSQiKeJvNWL3p:liKBw8G0NJ5jz3vq2FmOrm4jfqk5,$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)Wy2qOC1EPH4Rg0xBQwkCf0DGYyTf1Cs4mtcF7mbiiuRykGxFkF7tjRr:DLU2N1eyplIJedPzwg96I54Nyur,Ke3G7kNNjYaTHeJ:v4AjWCoI0EEhW3cBHYoP5IWLi7wRI33ZyCZYi, OKkqbh0EWy: aOl28bmYTzILL0gtOKN1T1vmOShIFUeNMhn597sxBsF05LGTgbLLdaT, S5Yfp1NqXjiukDWRCFLbHcwUMWZFOI0eweNCtinlFo: "emOQIdomjIj",(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$<(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$< jVwEq10cuXt7p3lBOJ3KYf7P9YlpKQ7tU9JdHxBNhCto: "bAB31Qnk9Eu5W",ZFYtPzj7e7eGRX2srRzba1g1JI8SwM7NxOKLMWFrhoxzvwmA5JX:QL2CNsoNeJ8mYZ, sNzJiGps438xE3fPUZDN1yE5zZlwULM6fvp90AJWIbijEQM3CnjNR: Kc2soPLcHvicPLhvVsjHGEvXGXitB,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-, "FQAXpJn8H736WINcb6Dj1xnXdnDrPzWE": "LfDfZrAALBqdJtKCDrWIdBLN4WEwOXuHEfn", "os0TZLb1Q3mEwzfyMP5WdKFreHZnsq7uCB46bPd4Ja9ZU6vIkPNq1Qsr4GFfgeHsY": oSvziQ4Ed3GSH4inwAau5KS4RcXeKaKmrQmB1Mxh0jfv,"ptzidXEfAKIeK8L8GBrH2vhdAIkcu34YPxMUg4HY":VtUtOwj7xa0euxHDMOz1njC4IXYSkkl4dH2SfbBmdmFPDVWQJ7y3c8,SSZyhSJM8mdqwdmr6YOX909DMAaZQSqmoKcPhwHbyFt9o8j:ogGLoqLsRjSwRQ2ysk5ioweNi73W8NcwGQ7HiZ55rEusto,"v74Vj":"zutqUJhH",Na:PkAzpOW4HPU5BQL0kCKhMx,qdWBeAXuuddlh9drIE1ENH0yqRy4VmOpdCGlXACjLHFcR8QkGcdlWQp:fh3MEdsnTZYR0cNWA59Rd3LGorpppvVT,vmp:J4IsrkQSbfsgQZZpof19uBsZESQaLrCkfMmLTIo4RB468Xi2,"H2ed0JkGLyDNSedRoh5DtwtmqjwEjNUDtNfPLYkEJhZ65Bb2K9Dr":"GElEbZiwqW7SbAgHy", ESEdjPQx40pW7BlSvHxST4yleCCkigOwXWgf: QSVCHGFN7zLJ6ziW2py,.@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!..@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!.maWvGvfLQRe9s5NSjJt:"JBrVWhgRTS1nTxUBx0PZZu3N20nUGJkgm7Sxp",;.|,;.|, qhsDPfrTTz0hT8AFP9u4hgUv0djKzdrdusTabKweEHQngrQiMfGRr: OFepZ4MBbeyULmOlyoZrQOpXb,+#_#={#,-#'{!$-`[.%@&^)$+#_#={#,-#'{!$-`[.%@&^)$ "MZphRGgJET7NyOIqtGJDZ4mGvaQUBe": "Jk2z1IxcNtcZPMWuzFbNgVLju5Yp9H66Kgcplh4z",>/}$>)*-^]^#{.>/}$>)*-^]^#{.S5KQvVvbQwlC:uhZTLtvVxtoypg, "H2bZ8yeZlTSlZH2wQ8dJyhyaYovzJUKaq5Cnu": U0KXgSEeZeyszBBnxRW, MClVFv7zMEufd2VD8mL3TebLwDSzUbNmA9oQoLBjGhQK: My9se6hEZ7uNkUeoh2gdDGvOUVrkuPhbPgvDRqs7FaW, "IL7TQ93fy": CT1aerBt8k8ybTG15i94E2Hw5DqkI2r6YOHgjl3s5xfk9,"moWDPEPmwqduji0PklkOpz4sDs05uqKPTkxhhBnx5AvgLL3WW0kIXzn":QKVw2rR1ZtA5SbYSMEXAY7ekZ8W7HFU4txVHbBxjYGqC3PgOGKwqYoLBspLrp9wzz,"LPGNF5w7EMO9sFeCYmqiJhtIzXqUaI2":N3UTUnFY0NN83G8LIep,*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~ ZYiqDIvL8dcQlDmsLFmQoy67AqJSaxE8IzBgR5TQ0zb9y: eG0p82X2A4yMlE80XSdCUz8ajEEN5TOkbB2spz6k,zHhnz7yw:JPgiQo78QJMfsXMyguWXt9MPLQjSk4O, b1EhGd58MJJDSaifbs8aQ4jr6wRa2Tk5QtKMInki9qaLOqFxU: P1rgHDn71X5hoAFUXOgIJyImWg0573nHxAqTggGktPCjdK4NMl,*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{%*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{% dgFNTa3zJSFWYcF12Tj2WezZ7FGysDbSfeKqgJKhCL6nA7roeMHex: QR, XJHHanbVpZPSevVb90x44OtK2TFIkYclj2MSfVZt5z5e906X2W1jinvgrVM: Cg5XrRewHUUuV2OrBh5TfxzlxlUzV96ZpBgg, "k0UkXebYaoO56aZRWOsrL": "KqVR68NO",vMv614MUeplUATMFJgWLMXGiRmBlIrX5lO1A9WHJiYkxGHME:LBoKlQXllvBHqy3dwYfawIlYpqvR4iPm3R,GIoLrUsnyBoQQZzZ5rwH41xU2:Vf2oQgs6JcnNQQ2, Rqhsiq0zyaYcUwco2hgbk4n8n2AEwExYaXeDPC1IuD: czHsBWs1E6zZNcxg, iN58KhJs6PqbyZ: DJpK0b3iGk1aDHytqBnBxW0JeMwmvm6sg2sWp2,uvzfIQL3MesKqYEvnmMEhMOJPzxPRywtOgRVaK:NORtBo7DNiW6a8i6k5Z6io6R9b12Cv3xK9b, uJ1V7rmt: O6jD2JgqiAOq82x2j6hfSMww2pbzGvOB8oc6HrgYjdFevKT7zVjgTYMDsZ,SrdQDJ9sLbhMi:ZScTmoGwE5DCOiDI,x0Kq3ZLUH8YxZrPQXCKSkBZrVpNTcU55xCGvKDcRnKnmVxcS:fBs2kVzWXW3r9f,'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!}'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!} AVnRkz1wxa2HLsFmFXOpnH4UgeX6itYhvSYgmaswnLskFUb4: ksXgP5FTdGSCC9d,R1wGN5TzDzfOat3sLj3zwO8h7uVC2rsGGc:afyVJfybly9jWxNEdu47UdCGdUPja2Yies3M,i6Du8n4V5ujuMBnSDB7B13F900FEFGT0qj8hdnBKQRJi6:"zew1r6tGu", xuFEwI0: IbErOQLmjDE,SNwvgpk9XuRBZPo7Std51kfkzAGG8wsRZ1rZEAB:"aV0uL4x0Itql79NP75xCkTDfKAEIKvBkrhzm2C2R2",$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?xRVkNIeI5uRXJcgtWXjaeIANmO59pyQB:gh8JSMjL,"ml4jGTUUQErMEN7bmMVwR2ebgxGni3SF62LeDgul8iTWVajaloLEAppPxFgdPREw3":Hza6rl4OzgwSTbbOTKUfOtc56TZHxQg6mAMzm430HZxvR,#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_?#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_? zuzEK9ubfq3rXWquGwmRkiHsIEejconaxhdK9U6oazYtHKInCVP3YlsW7t8: kBB1febxOfA,ZxjDWU2SKpaskrxw5YjRZxVh12uwPfk46joQ1BpeCARmoL0AwWPKD4MTc75:Nyh02N7pmLoC8fKjWowYjawOZMagKP0t74kJ30WwEKVEOS1mT4qCeGpEFzvZG02HL,~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[ dXMMoj4N6QFuQPMvNGsBJeRbt69PkXaMnuwX8UVZKeKo2ojxgX: Yl1u7NSAwHv4amDkcuhbjExgK4tojUMc3, "xCVyTpcDHuSQbd0JHXYRtnIMYbmqQA9rJDv89q4QQLOQ9iGLhT": vJH1dDuVm, o3tmk5wG9I5: WB0, "SUgOQsL48WwoN7JdJjrLqvdxryVq4M26F3l74GJFG76xuo": eZMdyRpp4kgNaFJ7R1h3xclvA4,ISm9v23Ztv5qFQ5NyBk9FmX2Yv:"CxwIaUhoEpWidVLb",)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+ v283sSmZ2y00f4zLb0kEW3qZxfxM6ojXdCQlnbx: HyW,Yz5hau7HUtPEyqhQTQHdpDJ1DVfC78rbgJbqp2e9h21zOGebkK:OqkutlTe5qZ5c2IhKSIbNfEBzRh56r3b9jJZ4JCnANAkjAb5yVhah,SFeXnMKi6fcu09qjfgSAmaOOzuUMEkZGCfTdslsbT0b4k1Ft7iBC01ZzzvFAbj:uTaPc3f0AghXbZ2xhfaocrqfFuzPLEvGCMF, q3eFwbdwYSoDTElQJOl7XIJ: "yU6wENm8nN",&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[ casBlgms1HNp5ykiyk1s8MKFfa5V4PnrwZfRCqB: kjqKFeqgtHTzaEZAQvbYDqPQ93F1oJQWUEjsCt5oDFbcByW99nvL5zCzKxVY,"F443mCXtkZoly6nKe4yn4MRRuGmtTu2fxosovT5GDC59C":gD9XznBuUGHkyZSspWlbgrpo,wE6tESe4Qsya9K5Prcr6kXSWwB9opNVcjzrYuaxbE1nLgAmec6FsEu:"mOfkKqQGJyap8jrtXPFQGfp1KCOPM0tfm",'#%)}@/_],_}#/&{[^&%$#$$('#%)}@/_],_}#/&{[^&%$#$$( SKnoHMz2hxH0yjoMTWpIk9t1J2EK38ZphhpW9aXNGsB6piQmFIh: oIXnMdcz9p8VRYDx5tEA3LrIdXwGrncuUZyAKmBxfWaiPP8hOv4ycNW,#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^VcJyhpHYZ9FPi5xcq3kkAK89qgFX6x3SRqidyRS9tsR9:lprFBdgTMwCzGKbgBnu8p5cPr2frziIifY,[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}bdzQJUD:qarN5TniZwyiOc,gcNWUZqtP1o1g:"rFTxiAB",{$>[%<'{{={|$<%|]]~'<'_@[}>,||({$>[%<'{{={|$<%|]]~'<'_@[}>,||( "mVxwP4BTIcq4run3vT23WeYkxznbR00z": rVE4R9qRtGHp,OObLnJXP8zNDsvdo:IZaUsWywYImvws8vpPfQ6unK2WNB8DI0LJ6DjPLdjAshrsVlgfX,"iyIr8oNrOifkwEP9QDbdMKGwsIHfrmvHCMlT8zUNmhuCy":wF7BLuWt,r5OFY93YpQtTw0B9wUqCelFDnuqHcN3O:nU3eTWfNRI3yE20K3T3LG9Uu5zb8glPLthLYYGcqDiaFevqeLwIDIk,"poI":FGLqjuofQwKhfyccHixt1Qnixhd6mFvxJ, ygdPqHnwoHLmM732PlWYZP8sScEjK0moGKUwnVOj5Go: "UwgxKTUh00HDYv6Q3EouYUrimcFr7DNJzy6zkNgtBdCDJMD",cURwcfqVUwOpXcw8RtrTbQCWcQPooAkGkwX1HT2wzOxwK856K39XXWvPgWy9eRtt:OVKhxJ4y9xbCc,Z6pypIXxI5jAHXsRo58inVZBN0H2ZQz3OXd4voTH:"WhdS5K5nJN",ZQfUdPqc9eAhRMRVud7D5D7VGUn9kWQRl5KWcFXh:HgR0SxwkaQ3bVDKt5CloEPGkOiI,}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&&}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&& nRd2uGIl3sJ1s: OH4OeI5sipK603tHsC6UNrXSXy7o, vwO: bqT7Pfit9YbGebVpWuO9rVk2LDfSu0PoEgm3HRkLDKRuh,}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*sAvu686EP7NIeWC9pEIL1zoHKDBJO8NSL0EjShAbEk8V3wYjKzrrHYaFBAGO6:"ovv2GChNstC8RAsRT8f55gPnhuNwERoxhBILSTuHEkSz8oPKafeDFH7pL7",@?&^#*{#]&-$(<@*[}!.@?&^#*{#]&-$(<@*[}!. KvedYQ6IjbaSAhPzmIsBEyuUd: tvBN6I44LyBSr9hnA4kiAVSnWkJbWdxilmkPBa1yeETME2o50S6SsT,.%-)#|+,{`~#!#_.%-)#|+,{`~#!#_"hqqBjbeDQoqz3q":lo23Frl47VLzzsrgdLn7mqL4pt4LxEyjg2r, ejK97Qroz18bulVEID17lJKmZxWAAB2QWZsacdev0: "bKbOIRTV6JZKg1bdBNq84YxHpXkWefrdc0N2hZnuVx7Luv", nS0tEDTyy5yyFrfCb8F: "UsplaAqvOBW",_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$]_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$] ikyYHTx1IVRiiN0WXCPFtr6ZPH4RrVqCcf1jqRggUnlv1z0WqjXoYu1E: "sbTeAE8",bouDMa2Zi6MzO1zcHBG0s97aut31oe7Js4elA155lHCTH:AO,tbNC66lwmwK1CcE7PV:AkyN2kzCvzINCYiW9lD4EYFpn4flCAC2XVzEP5LQUqb3iM54iRLwXcTOvXpiAx1i4,"FYynUIqD8EOyyOwD1jbcOQuB96LaNGlaJcCLTNKsKkZsNrjPaNBV2f64b":"XWiGfdAqYGEqUZFz",>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/"IkKX":yYGlcKBTgMc97AJPJAs6N,_.@}%/%_>()?$+;-,/,=_.@}%/%_>()?$+;-,/,=BlripFMXdsyhFvzCOgVSCYIOgGqsvPFZiiDzQRhe:"VxpeELjXIMv5okKNTdKCSkBLEhRcuzkomyZQPTYGtlxpGZGlEXEI53w6MxCCCAue",Mm:"LeoA0OrmWboyuHZX3TJzlCy4NnXZ0hsOdx0Nx0JXFZD8PukXdD","rD6KiDY":cGrgYCFzBHMRWucxqeSsLlNVvqlce2pbXVkfV1E,o0LXRjiImNX:oxKMmOykkrfMR,.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@ "DPk7bVryxp1BEqFC98B": cb9D1GM8rNzi79FoU8lqO3Q24T0,-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^U4YmhjyFxGd2Nnya6G1rBJQwwPAYd:"r79Amh27klZVyoPKv8Nql6mGcoSxcewVT", "LJIYo6KaFdbWu5aWIZRbDZGm8VaqrliEHvHfSxlgPpik2swLRkiKbXddE0E": U4gbJqvBHZ6LvdRrpqkuLv,PuLPfnVkAKVfHdA0uDbVyoDbX4m40IroR:YYkqSR2UNKQltJ4A6ufYgj8, "lDEBCoN387BdwwenE": U8yBiU9ohfGICQ8AwK8UAcVBmBwqeKiMeKBmbKq,[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_>[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_> GgzXBdQHJ9uORUXlQ9r40ItLsYV7kws3vMnmaMLVn2tJ9Rhfynq: q7WFN02cjEpL4XstailX3, x6Pmq9QJOApOUaTaYfOzeOPIpGl7FmnQaByuOvWgRprVG8SkyXygCmCd: e3pVc8SI,yyX7WBp:"qSMV9ytqDcgiA",@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},cxAKyW41oJnX2rd3bVTa2CuaNkipVDX:"Zd1KAR",!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;AOjQtpOxe:yfG5X3Vcveyn9msAyQS6VrYl2uCG5Ur4I3Qh9RM2d9zTwuiq2, "RsshrfBbxU7eaKb": Ug9C1rsskvr4CsLO3GwZ4zBliKJDQ7pv692mU3cKF8W2BsTMbI,,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]*,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]* "d1b8c86C7kiKEt65yiOX0RxUSjjqdPMGCKwn1MkFgCy7": bixj0xYPMpz5tw8qRgN,"SyzfVZXQwPvoFAZHOSPMhAzgULNfCaPa3pKFLf2yAPelVGuDxHSfdXalXFk8XcjH":"G6gBpGQcEgKoVaH",YMaku7KoPzgFaA7bcEg3dJ5H18BH:uD1mPbXYy4X7ettO3Q9lxaoKOmac6ECKU5ZJvfpuspZeatayA1Ir,"jjY3Fi0HCFwAqAlbtKRrlXlStcdwtodvClX00A0Eem4dqfu0ff":"kiYqf1oZWWb0eHLlkiABx7xKGg",,?!#'<<=_,?`@.,?!#'<<=_,?`@.*){}^<*`}.%}(?$>;^(`!!>(>@=#_?~]%:XH6tGerhtHxhEZj3fhxP9Y7JwS,"JSxLaVd62h8vW0A3gRcClPUhI8FHaPdb0WvRH9pEwrdlNcrJvqJ5BKHX5nzFP6":QrEDI9uIHU7Bt7f3o5nkUuD0i9uvef,oMULizBzN7VGdT7vEvSYo9CHnr:eDGEDxqn1g0wQTT1T153xOsDonTmDqn,xB:ybP34UpiHmfmJSZSvPOy4Tq8BuMFK2SAnAMKVUdJD4s1Ak8ZyTqXcOo, ys9kBu05YRZO3kRsqfi1yqSSPh8fy9a9e5gt5B2JZJcw2Yonayhr2hYhRR: TSlcgkOv1k9fY06AUXpxnWsrsOV,~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(aXsCCunB3slsVeaxm1ZATShrfrHJhFt:"mO43BK7Rqkz",BoxiWZvzJzYHKWxXuZndirygeFcGbGERqfwn:zPXegHOzUrEFV7jeg6V1lu9aVJjXAzX51pFiCdEcg9C7Xa5Myk,+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_!+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_! pn: GL7f6ZijZA9GUjBti9ixBuhFM4EgxGFFJSgBE6EagptJoODvsBIwqM5Y, irRD: xLfKCc1tI,cocsE8zGiD5iepz3Qhz:o56RupjRgnHpjNYWOutwLVETYccbEOnlx1M2FPBVOQdtjnpwPbgHTOB2cInAws6,uLjGbiBFfEdYS2DBSLe26HBKCP8f:"hQZyZEFfc0ujkpgLE",%@^&#!>(@,)+/;*@,!,/}&%]!%?)%@^&#!>(@,)+/;*@,!,/}&%]!%?)"YPYQzr1wR6TDQaTuVV6":s23NbYoba1ufd4yZ0v0tHtzX7g6K8H9VrUiw6KUUt0Z8c4iD,%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$(%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$( MxS7bLr26xN6sJWpfHk: RzgKqX6OFJrVOe7p4Oqc4kLEb,"dvKhFjScPGw4yZqlTnb05qImSN6Klv7npO25BMbiK9mAy6Q":keVAKhtp,"aYekPbXkWkP5":"JHYJb3WmysxLaiMcs6PtTwstKMr0DYiy3cridUk3AYEAeH94mMzn0MbYYN", "y6C8P": DP0H03OuwyzjxzYouPQnH7bss, "vsQweT": "FID3REAuI2MDREuq4F4kpz5ZcbszzMTQVDi0VnCMnKMGzPFfvA",/`_+/(/!^+&.*),[$|.,%~?#_?)*~#^$/@@%-(};!-+)'-|^?<^}:8ploPuQcdaEbSIYZH4iido2ELAFDjfRCDFdcZlKCphRoSeV4T,JtENvGLGnXRnyPVtoe:"JuWx7Sg0OGB1bl6cyi", Xp9: "fdqRsHUbGCkXBDMEQFvi", qQ: URB6gR8Ycz3vgIZVScyqBN5L49FZjkd6ufELgUaeFx5ssiYHAHPqWChND3m9YMc,^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$QGShf9cBgXh5kZi344dJQPqBDOcm9TWU3CO3cbxUyTqKaV6jJ:ZqBH4BC, f6D4: "spflcMLvoYKy3MTolMjkIp",<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;R1sBzCePKCctnNCwW9YH8xszy2rT4qUVSkH4xymv:sXU8JzG7m9Duy3,gIcNG2VsxBjzajr4syb:A2wwh2viLgHn3BAzm55xY6kRqp5B6SxCwjuijDm, sj3nIh6LPJ5JSRAFZKlKPDuimwZo5: fHO5WsnKzh8GqL6ca9gfd1H6GnEE, m8GNsm3cN3rZ4dcE79VziXzwgXeAGEugbSF3TdBOiNrIT1hFQ: eRin1ri4g9myk7CNvR0xBf9h8f2VpPK4yvBRSkXfs,"zgNi":VZnTTZvoJzUbR9JlVzYnnAKPdkQM9F3GmkTRksfwk8UMS82ymqTb739D9uerM,"OpKOT0IDxriiQBGKEwtBB":P5GxWhRf1xGoRctkRLE4dvNj6fOv4WdZYW,WWrkFfIbB3xRg3zjj9OAwz0udEjcBaCWHyn:"g19hj2ah", a1KW52dZN5YxFYnBqcvEbGltUTAlYW8I3EliPiVVEsbnLvh9NbDwz: kHZWhFndVWitQGkALFCSIzSbXfyZCASd,]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_ "DaPV0Tu0Mrxi0qXPP1N": tRrxxuhSuB2jRBVfi51DXX96GqIAkHjMis1,tu8sJr59XJuU5eQGWmVX:"K",$_){,+{.]?)%^>^$;_~/+>%@^[]>!~)$_){,+{.]?)%^>^$;_~/+>%@^[]>!~) LsZtbC0VCqCWFhZGLJUnM6brbMWLfMowKYCgvQ8YWYN6A76: NtiogL5zyH07Q7JuTKZVdeuPPMnw1dS3QuZ5ZeQTfPb5RHtvZcfSf6RBn1CP3CTwW, "tjIuuo7HGaIDIPXCYIZwR5": "XBejwunNfCSZQyCUZF8xJefK3MigTfUv7QeSfeI1mOPUehHFBj258cmiSf69T8ZWz", a6Vq29gxhDgmSG6: v,ZIdh12D8bZybnEwbpRMTIaK79okDl2M5jY:"kgPF3Gg5UXLc7Z390bMUee4wLIjoHauH45xJrYv9nsyZ",'-,{@?)-])<;(;`*!']'.;-+[,@?>/#^`${'<{=>'?]&;/@?-%~%-=.+,:p1tj9ikVFTe, UDikxsYVYbXx253GUBrShcEJqlFI0omP: cDHWGCLzSPYq557buHhv078SVGiqElKRup, "PZgrvZYjHDB8oQJv372St2ZUiwE6RNLZet6AxL1": rsg5l7Dwd,"SL36BoJ8r6Ci1cDE4FCe9ZTeblEq3z9GPoe79VkmJKb0hpaEXjqc9oApk":Qfu0yERkduslsnyBxGDWGG0CVI6IF, BrAwdbeT9N7woZ5RrYsNiXMbUZY7Q34R4bDN5Cbij1Os: X0vtycGwEkJKvMlyZoTlUxWA, FxmqQzlPwPj3zH9GeeaA1lff4J3NQgoVhNVHnwWTO54BwZDmJI: "IcxfY8C0Ktkmd5fMlg1j1MsymsU8lud4v", "gs2EX0nUFOQH5uqehdU8UvjOdU6PlI4J7SmI6uK8KwN": Xk3dKkwKuXhw7S0l82wqSCAcytvSYSGAWdCGnDLLf1iNQauyD,mcHNvhx2dIXzyEWSwJdwVx9Pqig5yXFwrdqJgLCS0xSAT:x0DSxmb4SEo8VuAlLSL5iN9ySaDhtaKZMLRiIcYcCPsM9YkXoavBN3oa5KrQHM, "qzWwwHMzPgpxORszpobEr4YkVosuy4jHRtquwabJWuyxP": DzRbLWRPNag0OUM205NNbv88E44Vhdr8x9rXdoEG4jaRWBwd9D7CtCfN8Xes1FI,t51Wen1z:tmLyLF8naj5blO9PQOsUaTbkFnIMGgfsDah5ibbjOm5qxFBD1ELo6VvCdemQ, BCTcgeak45hAy1kcJ8HlWMtMiqGK6sKlePrG7w1e1E4HWJ5nBOQvwQKf: mZ, inAj5RXIIRJeqMt: xWH2Ve71YL5CeHUn37NIF6fefqimLYPytwg9fnxlcsKHIksCUjcAgFdjWcDcItWj, "LgMdnQtT1XM1HOKwL2adxnoHewLaje5I": r7KXT0RSTLkFdplW038WpcZ08y0ACzchSN85XwoO9yjWOPT,MQFwM5oe2:"yCraVuQElRHKeJVmxnhnO5nAQ56WaYZNLyjWLho3LUbvVVq", d8TxcWtLPHRopDtkGcHG5: "iRUAAHPujmIIyAv532yAVLckigRCULFpcEUffmkmdcfOVzpdUbFh0THBXh", YXzOO: "QYovK6GVomoTY9LcxWKxwg6zzJtz0WNLsotv1p5eRh",|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?.|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?."ytbeQDpmN8UAdZ8Ht56FEbGXoatyLsF6ok":e7CxDG8Ru1DOq567oCeQeXVuAyprR6Ff,OuTEdRVt2UhWBnhlWO0Wobl4K3IFjWsbgM8XiTWmHi:"QK4OLIcgkDaD973V45hEAOwPLI3fUcff3OTsweLy1DL9P1Y0DHoMrZ8SGk2anNqP",ncxa9IlAj43HewaBpTysyiwt0wMp7xP1awCEc3:uOykVa9n2zMF189FhviR, FmzIf5SEPsEPoBVKu91Gt3ZN6VG24: "nbfdJC8jtUXjJngsXJxqIbU4Z3fWOxaniqIzlHpy7udK1x",~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+ NkU7xe8jRBrf4jCO1pcflFAVWJyoX4mJYzrwkiPFEUHIucaQ7iTy: Cvl7uYJxqr62rIrm0sOnFdpUx, "WWYQ2flbKbCe9BcQwcm": CuTF3vICCf5Yffgi0QSycdFKbRn1w6eBIU0sAxKvLRXQ7C7CO0Qz8IKn, ijfkgiA7XkmQN3qpUFZ03FJIsbdrTCAlO05fxffZogYIBfuo4drWQX5sPkQyd: ACoKsMqVoIHgMupY, zEeesDtioFK45fud7NzQcAAo5NN5Cy: nPPIPTCivs7qDRejXJUfU4v8XO6,$(@?#<+.`{@|-`(~>>`$}~=-*/([$(@?#<+.`{@|-`(~>>`$}~=-*/([ZDKBVG:YZJi51CH29JIpgN7hSMmTZvX, "g29ovir1IWnYc8KMN8azxwqe4Ky4tr5A23X9": pWXq50ceabv8wlvcXjIOCZEjDV65K9m59ZY7i1lPu4R4R,OAobPDPjFM6ZHplejUSz2UMTyJ:"gOBLoTxniHqzsYO33ZxZ",M8Rd3SPJemLjz6o5opAnX:wWKTmKliD9DBq6FRWvxs84HhZzab3LkuvCpHFqa,XBz2oj6qqlO6KzMoXmelEq2gUrqkIPAUPrzh1uWwMK9FtdBj:PAoFWe9tbs93jR6oabaK3OlvC0zxYkcB0V4PQ5HZFtY9,jhaQnbn08ZfUA5:oj,hIS7gZ9Jzri:"FlzL3svipLrnVV02B2Sx8bmCuJAI2sbojYimIZykCwyh", Vz9WbPlXhxLZCMcTSoAA0EtgEuWFyPqF7AalbDmPSxAnFLgZweRzPwF: D7kwhTK6BoaJR2PD3, "rTC6kfxesO": uzDzeHJslnwke8J4I632YcETbYfo90LZ,Ax:irEnF4T5cWVxvrfcNneCMCAL,~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(.~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(. pT: "JUyraSKGlES07HTPaOZX8y4FDhDWqAjJlpvTQaiMc3JljEmHtr", "W77k2PoFSFHlMM2XIqiQbuRXPYGJhRsvOzfI1cR6nRDvwLWIuzsZmPfEfMFpDbz": JdZdXaUdveAwbf3xMaLfPVyrVVhCBLHn9FWwEvwuL2JDwiHjAgMe, IdDOHkX417waGZ869Mo4VBR4dUFz8y7qOYvGHWAKyWqjU: p7121IRml0xEy1AGQs0INTenCLDYyQs9sQuxrScz5vqeQ, "DXln4Qz9YUBcxiXXIXrfI": wk3vpmBOHbF,DOvGcG4oRihxmVzVQdW6JqW0dn5RKVpKmaMQ5oJez2Mm1Iyud9uAffBhEO2AXht:jXkUG9YMzVYvKHoZymQ0FVo8eXkWOiqY9abklApQ9WzOmVAllALY91Y95eGR, JSBRmCjCmrbThYOK28Zp9MFG46FpWIcqJN2U1meUrbU4rIA13Yg4dOP4M5oBWiWTQ: gX9YZCIKQDCSLeOwX6YdgP0qSERRgqC1FkV1y1,*}-|#)(.`<%&`@@),-}{-|.#>==&*}-|#)(.`<%&`@@),-}{-|.#>==& DqesmshcVNkSzrKY0UAyt: aYBVCuy0ZLzNlEfslpbrUgEtUvhO2IR2Hf4mPa8lgu7g, zIwGG5PAbWADSxkv5x4aMb7nzFzGTaV2W: "J1sh5jHbdlxLmJkl4VShjV0PP8N7",bqcauK440PbVJD9OQ1XJ2C304nUj7fsJtbJBKrZPWSqwVJVNO2ZnSDl:ix326N83wa0heduoQ,){?}~?+[;@^+`/)>[?<+=^#,~|=){?}~?+[;@^+`/)>[?<+=^#,~|=N6gZfb7wbwTcGBRYLFeeizWZb:mpvcdFaRJwgKISz0k5x8hPJqhWVPQWX8KrOhKQXCI043ifHHD6kdqLW5F, \ No newline at end of file From 51711a6f8d679326be39077b94cafc5e9d099cd1 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Wed, 8 Mar 2023 13:33:56 +0000 Subject: [PATCH 065/535] Revert "change options_description length from 80 to 78 as in Poco" This reverts commit 6e94594e93de02870da7b80e0da805503a928af0. --- contrib/boost | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/boost b/contrib/boost index 41ea05ab8fc..03d9ec9cd15 160000 --- a/contrib/boost +++ b/contrib/boost @@ -1 +1 @@ -Subproject commit 41ea05ab8fc00f7a7dac6a03f6d9cf62575f714e +Subproject commit 03d9ec9cd159d14bd0b17c05138098451a1ea606 From 2530b60fb2d9d702ed84e963abd31ec9a7f16abc Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 8 Mar 2023 16:46:56 -0300 Subject: [PATCH 066/535] tmp --- src/Functions/extractKeyValuePairs.cpp | 52 +-- src/Functions/extractKeyValuePairs.h | 5 +- src/Functions/keyvaluepair/src/CMakeLists.txt | 3 + .../src/KeyValuePairExtractorBuilder.cpp | 55 +-- .../src/KeyValuePairExtractorBuilder.h | 15 +- .../src/impl/state/ExtractorConfiguration.h | 23 + .../state/InlineEscapingKeyStateHandler.cpp | 162 ------- .../state/InlineEscapingValueStateHandler.cpp | 119 ----- .../src/impl/state/MixedKeyStateHandler.h | 412 +++++++++--------- .../impl/state/MultiStrategyKeyStateHandler.h | 260 +++++------ .../src/impl/state/StateHandler.cpp | 5 - .../src/impl/state/StateHandler.h | 5 +- .../InlineEscapingKeyStateHandler.cpp | 208 +++++++++ .../escaping}/InlineEscapingKeyStateHandler.h | 9 +- .../InlineEscapingValueStateHandler.cpp | 196 +++++++++ .../InlineEscapingValueStateHandler.h | 15 +- .../noescaping}/NoEscapingKeyStateHandler.cpp | 12 +- .../noescaping}/NoEscapingKeyStateHandler.h | 7 +- .../NoEscapingValueStateHandler.cpp | 18 +- .../noescaping}/NoEscapingValueStateHandler.h | 11 +- .../src/impl/state/util/CharacterFinder.cpp | 43 +- .../tests/gtest_character_finder.cpp | 37 +- ...test_inline_escaping_key_state_handler.cpp | 107 ++++- ...st_inline_escaping_value_state_handler.cpp | 32 ++ 24 files changed, 1026 insertions(+), 785 deletions(-) create mode 100644 src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/escaping}/InlineEscapingKeyStateHandler.h (67%) create mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/escaping}/InlineEscapingValueStateHandler.h (61%) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/noescaping}/NoEscapingKeyStateHandler.cpp (81%) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/noescaping}/NoEscapingKeyStateHandler.h (67%) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/noescaping}/NoEscapingValueStateHandler.cpp (74%) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies/noescaping}/NoEscapingValueStateHandler.h (67%) create mode 100644 src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 4dcd5cc6cc7..35c472e1094 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -73,17 +73,9 @@ auto ExtractKeyValuePairs::getExtractor(const ParsedArguments & parsed_arguments builder.withKeyValuePairDelimiter(parsed_arguments.key_value_pair_delimiter.value()); } - if (parsed_arguments.item_delimiter) - { - builder.withItemDelimiter(parsed_arguments.item_delimiter.value()); - } + builder.withItemDelimiter(parsed_arguments.pair_delimiters); - if (parsed_arguments.enclosing_character) - { - builder.withEnclosingCharacter(parsed_arguments.enclosing_character.value()); - } - - builder.withValueSpecialCharacterAllowlist(parsed_arguments.value_special_characters_allow_list); + builder.withQuotingCharacters(parsed_arguments.quoting_characters); return builder.build(); } @@ -138,49 +130,43 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const return ParsedArguments{data_column, key_value_pair_delimiter}; } - auto item_delimiter = extractControlCharacter(arguments[2].column); + auto pair_delimiters_characters = arguments[2].column->getDataAt(0).toView(); + + SetArgument pair_delimiters; + + pair_delimiters.insert(pair_delimiters_characters.begin(), pair_delimiters_characters.end()); if (arguments.size() == 3u) { return ParsedArguments{ - data_column, key_value_pair_delimiter, item_delimiter}; + data_column, key_value_pair_delimiter, pair_delimiters + }; } - auto enclosing_character = extractControlCharacter(arguments[3].column); + + auto quoting_characters_str = arguments[3].column->getDataAt(0).toView(); + + SetArgument quoting_characters; + + quoting_characters.insert(quoting_characters_str.begin(), quoting_characters_str.end()); if (arguments.size() == 4u) { return ParsedArguments{ data_column, key_value_pair_delimiter, - item_delimiter, - enclosing_character, + pair_delimiters, + quoting_characters, }; } - auto value_special_characters_allow_list_characters = arguments[4].column->getDataAt(0).toView(); - SetArgument value_special_characters_allow_list; - - value_special_characters_allow_list.insert( - value_special_characters_allow_list_characters.begin(), value_special_characters_allow_list_characters.end() - ); - - if (arguments.size() == 5u) - { - return ParsedArguments { - data_column, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list - }; - } - - // extractKeyValuePairs - extractKeyValuePairsWithEscaping - - auto with_escaping_character = extractControlCharacter(arguments[5].column); + auto with_escaping_character = extractControlCharacter(arguments[4].column); bool with_escaping = with_escaping_character && with_escaping_character == '1'; return ParsedArguments{ - data_column, key_value_pair_delimiter, item_delimiter, enclosing_character, value_special_characters_allow_list, with_escaping + data_column, key_value_pair_delimiter, pair_delimiters, quoting_characters, with_escaping }; } diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index e427bdb4524..26d80272fc7 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -22,9 +22,8 @@ public: { ColumnPtr data_column; CharArgument key_value_pair_delimiter = {}; - CharArgument item_delimiter = {}; - CharArgument enclosing_character = {}; - SetArgument value_special_characters_allow_list = {}; + SetArgument pair_delimiters = {}; + SetArgument quoting_characters = {}; BoolArgument with_escaping = {}; }; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 1a4923b6af6..5c892779c42 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -2,6 +2,9 @@ include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/escaping) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/noescaping) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/util) add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index f1c4ce408fd..42a066fbbb3 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -1,12 +1,12 @@ #include "KeyValuePairExtractorBuilder.h" +#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "impl/CHKeyValuePairExtractor.h" -#include "impl/state/InlineEscapingKeyStateHandler.h" -#include "impl/state/InlineEscapingValueStateHandler.h" -#include "impl/state/NoEscapingKeyStateHandler.h" -#include "impl/state/NoEscapingValueStateHandler.h" +#include "impl/state/ExtractorConfiguration.h" #include "impl/state/MixedKeyStateHandler.h" #include "impl/state/MultiStrategyKeyStateHandler.h" -#include namespace DB { @@ -17,21 +17,15 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDel return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(char item_delimiter_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(std::unordered_set item_delimiters_) { - item_delimiter = item_delimiter_; + item_delimiters.insert(item_delimiters_.begin(), item_delimiters_.end()); return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEnclosingCharacter(std::optional enclosing_character_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withQuotingCharacters(std::unordered_set quoting_characters_) { - enclosing_character = enclosing_character_; - return *this; -} - -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withValueSpecialCharacterAllowlist(std::unordered_set special_character_allow_list_) -{ - value_special_character_allowlist = special_character_allow_list_; + quoting_characters.insert(quoting_characters_.begin(), quoting_characters_.end()); return *this; } @@ -53,15 +47,18 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() { - CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( + ExtractorConfiguration configuration( key_value_pair_delimiter.value_or(':'), - enclosing_character + item_delimiters, + quoting_characters + ); + + CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( + configuration ); CValueStateHandler auto value_state_handler = NoEscapingValueStateHandler( - item_delimiter.value_or(','), - enclosing_character, - value_special_character_allowlist + configuration ); return std::make_shared>(key_state_handler, value_state_handler); @@ -69,21 +66,15 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { -// CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler( -// key_value_pair_delimiter.value_or(':'), -// enclosing_character -// ); - - CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler( + ExtractorConfiguration configuration( key_value_pair_delimiter.value_or(':'), - enclosing_character + item_delimiters, + quoting_characters ); - CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler( - item_delimiter.value_or(','), - enclosing_character, - value_special_character_allowlist - ); + CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler(configuration); + + CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler(configuration); return std::make_shared>(key_state_handler, value_state_handler); } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 57dfec92066..de96e58b57f 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -1,9 +1,9 @@ #pragma once +#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "KeyValuePairExtractor.h" #include "impl/CHKeyValuePairExtractor.h" -#include "impl/state/NoEscapingKeyStateHandler.h" -#include "impl/state/NoEscapingValueStateHandler.h" namespace DB { @@ -14,11 +14,9 @@ public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); - KeyValuePairExtractorBuilder & withItemDelimiter(char item_delimiter_); + KeyValuePairExtractorBuilder & withItemDelimiter(std::unordered_set item_delimiters_); - KeyValuePairExtractorBuilder & withEnclosingCharacter(std::optional enclosing_character_); - - KeyValuePairExtractorBuilder & withValueSpecialCharacterAllowlist(std::unordered_set special_character_allow_list); + KeyValuePairExtractorBuilder & withQuotingCharacters(std::unordered_set quoting_characters_); KeyValuePairExtractorBuilder & withEscaping(); @@ -27,9 +25,8 @@ public: private: bool with_escaping = false; std::optional key_value_pair_delimiter; - std::optional item_delimiter; - std::optional enclosing_character; - std::unordered_set value_special_character_allowlist; + std::unordered_set item_delimiters = {' ', ',', ';'}; + std::unordered_set quoting_characters = {'"'}; std::shared_ptr buildWithEscaping(); diff --git a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h new file mode 100644 index 00000000000..0270e695a3a --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +namespace DB +{ + +struct ExtractorConfiguration +{ + ExtractorConfiguration( + char key_value_delimiter_, + std::unordered_set pair_delimiters_, + std::unordered_set quoting_characters_ + ) : key_value_delimiter(key_value_delimiter_), pair_delimiters(std::move(pair_delimiters_)), quoting_characters(std::move(quoting_characters_)) + {} + + const char key_value_delimiter; + const std::unordered_set pair_delimiters; + const std::unordered_set quoting_characters; +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp deleted file mode 100644 index 319d2652b45..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "InlineEscapingKeyStateHandler.h" -#include "util/EscapedCharacterReader.h" -#include "util/CharacterFinder.h" -#include - -namespace DB -{ - -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) -{} - -NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const -{ - // maybe wait should be - find first non control character - - static constexpr auto is_special = [](char character) { - return character == '\\' || character == '='; - }; - - std::vector special_characters; - special_characters.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - -// CharacterFinder finder; -// -// while (auto character_position_opt = finder.find_first_not(file, pos, special_characters)) -// { -// -// } - - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (current_character == enclosing_character) - { - return {pos, State::READING_ENCLOSED_KEY}; - } - else if (!is_special(current_character)) - { - return {pos, State::READING_KEY}; - } - - pos++; - } - - return {pos, State::END}; -} - -/* - * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. - * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. - * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm - * */ - -NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const -{ - CharacterFinder finder; - - key.clear(); - - while (auto character_position_opt = finder.find_first(file, pos, {'\\', '"', '='})) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (EscapedCharacterReader::isEscapeCharacter(character)) - { - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - // fix later, -1 looks uglyyyyy - next_pos += (next_byte_ptr - file.begin() - 1u); - - if (escaped_characters.empty()) - { - // I have to consider a case like the following: "name:arthur\". - // will it be discarded or not? - // current implementation will discard it. - return {next_pos, State::WAITING_KEY}; - } - else - { - for (auto escaped_character : escaped_characters) - { - key.push_back(escaped_character); - } - } - } - else if (character == key_value_delimiter) - { - // todo try to optimize with resize and memcpy - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - return {next_pos, State::WAITING_VALUE}; - } - // pair delimiter - else if (character == ',') - { - return {next_pos, State::WAITING_KEY}; - } - - pos = next_pos; - } - - // might be problematic in case string reaches the end and I haven't copied anything over to key - - return {pos, State::END}; -} - -NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const -{ - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - - if (*enclosing_character == current_character) - { - if (key.empty()) - { - return {pos, State::WAITING_KEY}; - } - - return {pos, State::READING_KV_DELIMITER}; - } - else - { - key.push_back(current_character); - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const -{ - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } -} - -bool InlineEscapingKeyStateHandler::isValidCharacter(char character) -{ - return std::isalnum(character) || character == '_'; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp deleted file mode 100644 index c97e3a66b9a..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include "InlineEscapingValueStateHandler.h" -#include "util/EscapedCharacterReader.h" - -namespace DB -{ - -InlineEscapingValueStateHandler::InlineEscapingValueStateHandler( - char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(enclosing_character_) - , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) -{ -} - -NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const -{ - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; - } - else if (current_character == item_delimiter) - { - return {pos, State::READING_EMPTY_VALUE}; - } - else if (isValidCharacter(current_character)) - { - return {pos, State::READING_VALUE}; - } - else - { - pos++; - } - } - - return {pos, State::READING_EMPTY_VALUE}; -} - -NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const -{ - bool escape = false; - - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos]; - const auto next_pos = pos + 1u; - - if (escape) - { - escape = false; - -// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) -// { -// value.push_back(*escaped_character); -// } -// else - { - // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) - // or if there isn't enough characters left in the string - return {next_pos, State::WAITING_KEY }; - } - } - else if (EscapedCharacterReader::isEscapeCharacter(current_character)) - { - escape = true; - } - else if (current_character == item_delimiter || !isValidCharacter(current_character)) - { - return {next_pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - - pos = next_pos; - } - - return {pos, State::FLUSH_PAIR}; -} - -NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const -{ - value.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos++]; - if (enclosing_character == current_character) - { - return {pos, State::FLUSH_PAIR}; - } - else - { - value.push_back(current_character); - } - } - - return {pos, State::END}; -} - -NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) -{ - value.clear(); - return {pos + 1, State::FLUSH_PAIR}; -} - -bool InlineEscapingValueStateHandler::isValidCharacter(char character) const -{ - return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h index 104264e8951..47e4d7863af 100644 --- a/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h @@ -1,211 +1,209 @@ -#pragma once - -#include "StateHandler.h" - -#include - -#include "util/EscapedCharacterReader.h" - -namespace DB -{ - -enum class EscapingStrategy -{ - WITH_ESCAPING, - WITHOUT_ESCAPING -}; - -// " {<>}" - -template -class MixedKeyStateHandler : public StateHandler -{ -public: - using ElementType = typename std::conditional::type; - MixedKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} - - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const - { - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (isValidCharacter(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } - - pos++; - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const - { - bool escape = false; - - auto start_index = pos; - - key = {}; - - while (pos < file.size()) - { - const auto current_character = file[pos]; - const auto next_pos = pos + 1u; - - if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) - { - if (escape) - { - escape = false; - -// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +//#pragma once +// +//#include "StateHandler.h" +// +//#include +// +//#include "util/EscapedCharacterReader.h" +// +//namespace DB +//{ +// +//enum class EscapingStrategy +//{ +// WITH_ESCAPING, +// WITHOUT_ESCAPING +//}; +// +//template +//class MixedKeyStateHandler : public StateHandler +//{ +//public: +// using ElementType = typename std::conditional::type; +// MixedKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) +// : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} +// +// [[nodiscard]] NextState wait(std::string_view file, size_t pos) const +// { +// while (pos < file.size()) +// { +// const auto current_character = file[pos]; +// +// if (isValidCharacter(current_character)) +// { +// return {pos, State::READING_KEY}; +// } +// else if (enclosing_character && current_character == enclosing_character) +// { +// return {pos + 1u, State::READING_ENCLOSED_KEY}; +// } +// +// pos++; +// } +// +// return {pos, State::END}; +// } +// +// [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const +// { +// bool escape = false; +// +// auto start_index = pos; +// +// key = {}; +// +// while (pos < file.size()) +// { +// const auto current_character = file[pos]; +// const auto next_pos = pos + 1u; +// +// if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) +// { +// if (escape) +// { +// escape = false; +// +//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +//// { +//// collect(key, *escaped_character); +//// pos = next_pos; +//// continue; +//// } +//// else // { -// collect(key, *escaped_character); -// pos = next_pos; -// continue; +// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) +// // or if there isn't enough characters left in the string +// return {next_pos, State::WAITING_KEY }; // } -// else - { - // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) - // or if there isn't enough characters left in the string - return {next_pos, State::WAITING_KEY }; - } - } - else if (EscapedCharacterReader::isEscapeCharacter(current_character)) - { - escape = true; - pos = next_pos; - continue; - } - } - - if (current_character == key_value_delimiter) - { - finalizeElement(key, file, start_index, pos - 1); - return {next_pos, State::WAITING_VALUE}; - } - else if (!isValidCharacter(current_character)) - { - return {next_pos, State::WAITING_KEY}; - } - else - { - collect(key, current_character); - } - - pos = next_pos; - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const - { - key = {}; - - bool escape = false; - - auto start_index = pos; - - while (pos < file.size()) - { - const auto current_character = file[pos]; - const auto next_pos = pos + 1u; - - if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) - { - if (escape) - { - escape = false; - -// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +// } +// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) +// { +// escape = true; +// pos = next_pos; +// continue; +// } +// } +// +// if (current_character == key_value_delimiter) +// { +// finalizeElement(key, file, start_index, pos - 1); +// return {next_pos, State::WAITING_VALUE}; +// } +// else if (!isValidCharacter(current_character)) +// { +// return {next_pos, State::WAITING_KEY}; +// } +// else +// { +// collect(key, current_character); +// } +// +// pos = next_pos; +// } +// +// return {pos, State::END}; +// } +// +// [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const +// { +// key = {}; +// +// bool escape = false; +// +// auto start_index = pos; +// +// while (pos < file.size()) +// { +// const auto current_character = file[pos]; +// const auto next_pos = pos + 1u; +// +// if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) +// { +// if (escape) +// { +// escape = false; +// +//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +//// { +//// collect(key, *escaped_character); +//// pos = next_pos; +//// continue; +//// } +//// else // { -// collect(key, *escaped_character); -// pos = next_pos; -// continue; +// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) +// // or if there isn't enough characters left in the string +// return {next_pos, State::WAITING_KEY }; // } -// else - { - // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) - // or if there isn't enough characters left in the string - return {next_pos, State::WAITING_KEY }; - } - } - else if (EscapedCharacterReader::isEscapeCharacter(current_character)) - { - escape = true; - pos = next_pos; - continue; - } - } - - if (*enclosing_character == current_character) - { - auto is_key_empty = start_index == pos; - - if (is_key_empty) - { - return {next_pos, State::WAITING_KEY}; - } - - finalizeElement(key, file, start_index, pos - 1); - - return {next_pos, State::READING_KV_DELIMITER}; - } - else - { - collect(key, current_character); - } - - pos = next_pos; - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const - { - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } - } - -private: - const char key_value_delimiter; - - void collect(ElementType & element, char character) const - { - if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WITH_ESCAPING) - { - element.push_back(character); - } - } - - void finalizeElement(ElementType & element, std::string_view file, std::size_t start_index, std::size_t end_index) const - { - if constexpr (ESCAPING_STRATEGY != EscapingStrategy::WITH_ESCAPING) - { - element = createElement(file, start_index, end_index); - } - } - - static bool isValidCharacter(char character) - { - return std::isalnum(character) || character == '_'; - } -}; - -} +// } +// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) +// { +// escape = true; +// pos = next_pos; +// continue; +// } +// } +// +// if (*enclosing_character == current_character) +// { +// auto is_key_empty = start_index == pos; +// +// if (is_key_empty) +// { +// return {next_pos, State::WAITING_KEY}; +// } +// +// finalizeElement(key, file, start_index, pos - 1); +// +// return {next_pos, State::READING_KV_DELIMITER}; +// } +// else +// { +// collect(key, current_character); +// } +// +// pos = next_pos; +// } +// +// return {pos, State::END}; +// } +// +// [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const +// { +// if (pos == file.size()) +// { +// return {pos, State::END}; +// } +// else +// { +// const auto current_character = file[pos++]; +// return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; +// } +// } +// +//private: +// const char key_value_delimiter; +// +// void collect(ElementType & element, char character) const +// { +// if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WITH_ESCAPING) +// { +// element.push_back(character); +// } +// } +// +// void finalizeElement(ElementType & element, std::string_view file, std::size_t start_index, std::size_t end_index) const +// { +// if constexpr (ESCAPING_STRATEGY != EscapingStrategy::WITH_ESCAPING) +// { +// element = createElement(file, start_index, end_index); +// } +// } +// +// static bool isValidCharacter(char character) +// { +// return std::isalnum(character) || character == '_'; +// } +//}; +// +//} diff --git a/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h index 56dc00a9c93..39062d0b051 100644 --- a/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h @@ -1,132 +1,132 @@ -#pragma once - -#include "StateHandler.h" -#include - -namespace DB -{ - -enum class EscapingStrategy2 -{ - WITH_ESCAPING, - WITHOUT_ESCAPING -}; - -template -class MultiStrategyKeyStateHandler : public StateHandler -{ -public: - MultiStrategyKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} - - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const - { - while (pos < file.size()) - { - const auto current_character = file[pos]; - - if (isValidCharacter(current_character)) - { - return {pos, State::READING_KEY}; - } - else if (enclosing_character && current_character == enclosing_character) - { - return {pos + 1u, State::READING_ENCLOSED_KEY}; - } - - pos++; - } - - return {pos, State::END}; - } - - [[nodiscard]] NextState read(std::string_view file, std::size_t pos, auto key) const - { - return static_cast(this)->read(file, pos, key); - } - - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, auto & key) const - { - return static_cast(this)->readEnclosed(file, pos, key); - } - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const - { - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; - } - } - -protected: - const char key_value_delimiter; - - static bool isValidCharacter(char character) - { - return std::isalnum(character) || character == '_'; - } -}; - -class EscapingStrategyStateHandler : public MultiStrategyKeyStateHandler -{ - using ElementType = std::string; -public: - EscapingStrategyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : MultiStrategyKeyStateHandler(key_value_delimiter_, enclosing_character_) {} - - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const - { - bool escape = false; - - key.clear(); - - while (pos < file.size()) - { - const auto current_character = file[pos]; - const auto next_pos = pos + 1u; - - if (escape) - { - escape = false; - -// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +//#pragma once +// +//#include "StateHandler.h" +//#include +// +//namespace DB +//{ +// +//enum class EscapingStrategy2 +//{ +// WITH_ESCAPING, +// WITHOUT_ESCAPING +//}; +// +//template +//class MultiStrategyKeyStateHandler : public StateHandler +//{ +//public: +// MultiStrategyKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) +// : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} +// +// [[nodiscard]] NextState wait(std::string_view file, size_t pos) const +// { +// while (pos < file.size()) +// { +// const auto current_character = file[pos]; +// +// if (isValidCharacter(current_character)) +// { +// return {pos, State::READING_KEY}; +// } +// else if (enclosing_character && current_character == enclosing_character) +// { +// return {pos + 1u, State::READING_ENCLOSED_KEY}; +// } +// +// pos++; +// } +// +// return {pos, State::END}; +// } +// +// [[nodiscard]] NextState read(std::string_view file, std::size_t pos, auto key) const +// { +// return static_cast(this)->read(file, pos, key); +// } +// +// [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, auto & key) const +// { +// return static_cast(this)->readEnclosed(file, pos, key); +// } +// +// [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const +// { +// if (pos == file.size()) +// { +// return {pos, State::END}; +// } +// else +// { +// const auto current_character = file[pos++]; +// return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; +// } +// } +// +//protected: +// const char key_value_delimiter; +// +// static bool isValidCharacter(char character) +// { +// return std::isalnum(character) || character == '_'; +// } +//}; +// +//class EscapingStrategyStateHandler : public MultiStrategyKeyStateHandler +//{ +// using ElementType = std::string; +//public: +// EscapingStrategyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) +// : MultiStrategyKeyStateHandler(key_value_delimiter_, enclosing_character_) {} +// +// [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const +// { +// bool escape = false; +// +// key.clear(); +// +// while (pos < file.size()) +// { +// const auto current_character = file[pos]; +// const auto next_pos = pos + 1u; +// +// if (escape) +// { +// escape = false; +// +//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) +//// { +//// key.push_back(*escaped_character); +//// } +//// else // { -// key.push_back(*escaped_character); +// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) +// // or if there isn't enough characters left in the string +// return {next_pos, State::WAITING_KEY }; // } -// else - { - // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) - // or if there isn't enough characters left in the string - return {next_pos, State::WAITING_KEY }; - } - } - else if (EscapedCharacterReader::isEscapeCharacter(current_character)) - { - escape = true; - } - else if (current_character == key_value_delimiter) - { - return {next_pos, State::WAITING_VALUE}; - } - else if (!isValidCharacter(current_character)) - { - return {next_pos, State::WAITING_KEY}; - } - else - { - key.push_back(current_character); - } - - pos = next_pos; - } - - return {pos, State::END}; - } -}; - -} +// } +// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) +// { +// escape = true; +// } +// else if (current_character == key_value_delimiter) +// { +// return {next_pos, State::WAITING_VALUE}; +// } +// else if (!isValidCharacter(current_character)) +// { +// return {next_pos, State::WAITING_KEY}; +// } +// else +// { +// key.push_back(current_character); +// } +// +// pos = next_pos; +// } +// +// return {pos, State::END}; +// } +//}; +// +//} diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp index 2fe7d8ce782..a1beb077bb5 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp @@ -3,11 +3,6 @@ namespace DB { -StateHandler::StateHandler(std::optional enclosing_character_) - : enclosing_character(enclosing_character_) -{ -} - std::string_view StateHandler::createElement(std::string_view file, std::size_t begin, std::size_t end) { return std::string_view{file.begin() + begin, file.begin() + end}; diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 839fa90cdfa..2aca4d9d3e1 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -2,6 +2,7 @@ #include #include +#include #include "State.h" namespace DB @@ -51,12 +52,12 @@ concept CValueStateHandler = CInlineEscapingValueStateHandler || CNoEscapingV struct StateHandler { - explicit StateHandler(std::optional enclosing_character); + StateHandler() = default; StateHandler(const StateHandler &) = default; virtual ~StateHandler() = default; - const std::optional enclosing_character; + const std::unordered_set quoting_characters; protected: [[nodiscard]] static std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp new file mode 100644 index 00000000000..312977aa400 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -0,0 +1,208 @@ +#include "InlineEscapingKeyStateHandler.h" +#include +#include + +namespace DB +{ + +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) + : extractor_configuration(std::move(configuration_)) +{} + +NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + std::vector special_characters; + special_characters.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + special_characters.push_back(key_value_delimiter); + + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(special_characters)); + + CharacterFinder finder; + + while (auto character_position_opt = finder.find_first_not(file, pos, special_characters)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + + if (quoting_characters.contains(character)) + { + return {character_position + 1u, State::READING_ENCLOSED_KEY}; + } + else + { + return {character_position, State::READING_KEY}; + } + } + + return {file.size(), State::END}; +} + +/* + * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. + * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. + * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm + * */ + +NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const +{ + CharacterFinder finder; + + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + key.clear(); + + /* + * Maybe modify finder return type to be the actual pos. In case of failures, it shall return pointer to the end. + * It might help updating current pos? + * */ + + while (auto character_position_opt = finder.find_first(file, pos, needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (EscapedCharacterReader::isEscapeCharacter(character)) + { + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); + // fix later, -1 looks uglyyyyy + next_pos = next_byte_ptr - file.begin(); + + if (escaped_characters.empty()) + { + // I have to consider a case like the following: "name:arthur\". + // will it be discarded or not? + // current implementation will discard it. + return {next_pos, State::WAITING_KEY}; + } + else + { + for (auto escaped_character : escaped_characters) + { + key.push_back(escaped_character); + } + } + } + else if (character == key_value_delimiter) + { + // todo try to optimize with resize and memcpy + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + return {next_pos, State::WAITING_VALUE}; + } + // pair delimiter + else if (pair_delimiters.contains(character)) + { + return {next_pos, State::WAITING_KEY}; + } + + pos = next_pos; + } + + // might be problematic in case string reaches the end and I haven't copied anything over to key + + return {file.size(), State::END}; +} + +NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const +{ + CharacterFinder finder; + + const auto & quoting_characters = extractor_configuration.quoting_characters; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + + key.clear(); + + while (auto character_position_opt = finder.find_first(file, pos, needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (character == EscapedCharacterReader::ESCAPE_CHARACTER) + { + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); + // fix later, -1 looks uglyyyyy + next_pos = next_byte_ptr - file.begin(); + + if (escaped_characters.empty()) + { + // I have to consider a case like the following: "name:arthur\". + // will it be discarded or not? + // current implementation will discard it. + return {next_pos, State::WAITING_KEY}; + } + else + { + for (auto escaped_character : escaped_characters) + { + key.push_back(escaped_character); + } + } + } + else if(quoting_characters.contains(character)) + { + // todo try to optimize with resize and memcpy + for (auto i = pos; i < character_position; i++) + { + key.push_back(file[i]); + } + + if (key.empty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::READING_KV_DELIMITER}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; +} + +NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const +{ + if (pos == file.size()) + { + return {pos, State::END}; + } + else + { + const auto current_character = file[pos++]; + return {pos, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; + } +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h similarity index 67% rename from src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h index b54b76658d1..288fffea26f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h @@ -2,7 +2,8 @@ #include #include -#include "StateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB { @@ -12,7 +13,7 @@ class InlineEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string; - InlineEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_); + explicit InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -23,9 +24,7 @@ public: [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: - const char key_value_delimiter; - - static bool isValidCharacter(char character); + ExtractorConfiguration extractor_configuration; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp new file mode 100644 index 00000000000..de4d9087df4 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -0,0 +1,196 @@ +#include "InlineEscapingValueStateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h" +#include "Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h" + +namespace DB +{ + +InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) + : extractor_configuration(std::move(extractor_configuration_)) +{ +} + +NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + while (pos < file.size()) + { + const auto current_character = file[pos]; + + if (quoting_characters.contains(current_character)) + { + return {pos + 1u, State::READING_ENCLOSED_VALUE}; + } + else if (pair_delimiters.contains(current_character)) + { + return {pos, State::READING_EMPTY_VALUE}; + } + else if (key_value_delimiter == current_character) + { + return {pos, State::WAITING_KEY}; + } + // skip leading white spaces, re-think this + else if (current_character != ' ') + { + return {pos, State::READING_VALUE}; + } + + pos++; + } + + return {pos, State::READING_EMPTY_VALUE}; +} + +NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const +{ + CharacterFinder finder; + + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + value.clear(); + + /* + * Maybe modify finder return type to be the actual pos. In case of failures, it shall return pointer to the end. + * It might help updating current pos? + * */ + + while (auto character_position_opt = finder.find_first(file, pos, needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (EscapedCharacterReader::isEscapeCharacter(character)) + { + for (auto i = pos; i < character_position; i++) + { + value.push_back(file[i]); + } + + auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); + // fix later, -1 looks uglyyyyy + next_pos = next_byte_ptr - file.begin(); + + if (escaped_characters.empty()) + { + // I have to consider a case like the following: "name:arthur\". + // will it be discarded or not? + // current implementation will discard it. + return {next_pos, State::WAITING_KEY}; + } + else + { + for (auto escaped_character : escaped_characters) + { + value.push_back(escaped_character); + } + } + } + else if (key_value_delimiter == character) + { + return {next_pos, State::WAITING_KEY}; + } + // pair delimiter + else if (pair_delimiters.contains(character)) + { + // todo try to optimize with resize and memcpy + for (auto i = pos; i < character_position; i++) + { + value.push_back(file[i]); + } + + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + for (; pos < file.size(); pos++) + { + value.push_back(file[pos]); + } + + return {pos, State::FLUSH_PAIR}; +} + +NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const +{ + CharacterFinder finder; + + const auto & quoting_characters = extractor_configuration.quoting_characters; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + + value.clear(); + + while (auto character_position_opt = finder.find_first(file, pos, needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (character == EscapedCharacterReader::ESCAPE_CHARACTER) + { + for (auto i = pos; i < character_position; i++) + { + value.push_back(file[i]); + } + + auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); + // fix later, -1 looks uglyyyyy + next_pos = next_byte_ptr - file.begin(); + + if (escaped_characters.empty()) + { + // I have to consider a case like the following: "name:arthur\". + // will it be discarded or not? + // current implementation will discard it. + return {next_pos, State::WAITING_KEY}; + } + else + { + for (auto escaped_character : escaped_characters) + { + value.push_back(escaped_character); + } + } + } + else if(quoting_characters.contains(character)) + { + // todo try to optimize with resize and memcpy + for (auto i = pos; i < character_position; i++) + { + value.push_back(file[i]); + } + + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + return {pos, State::END}; +} + +NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) +{ + value.clear(); + return {pos + 1, State::FLUSH_PAIR}; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h similarity index 61% rename from src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index 855e2d774a1..1fdd646ba05 100644 --- a/src/Functions/keyvaluepair/src/impl/state/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -1,9 +1,10 @@ #pragma once #include -#include "State.h" -#include "StateHandler.h" #include +#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/State.h" +#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB { @@ -13,10 +14,7 @@ class InlineEscapingValueStateHandler : public StateHandler public: using ElementType = std::string; - InlineEscapingValueStateHandler( - char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_); + explicit InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -27,10 +25,7 @@ public: [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: - const char item_delimiter; - std::unordered_set special_character_allowlist; - - bool isValidCharacter(char character) const; + ExtractorConfiguration extractor_configuration; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp similarity index 81% rename from src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index 0d0f146b437..2d9322e55ab 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -3,8 +3,8 @@ namespace DB { -NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) - : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) +NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(ExtractorConfiguration extractor_configuration_) + : StateHandler(), extractor_configuration(std::move(extractor_configuration_)) { } @@ -18,7 +18,7 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con { return {pos, State::READING_KEY}; } - else if (enclosing_character && current_character == enclosing_character) + else if (current_character == '"') { return {pos + 1u, State::READING_ENCLOSED_KEY}; } @@ -39,7 +39,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele { const auto current_character = file[pos++]; - if (current_character == key_value_delimiter) + if (current_character == ',') { // not checking for empty key because with current waitKey implementation // there is no way this piece of code will be reached for the very first key character @@ -65,7 +65,7 @@ NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t { const auto current_character = file[pos++]; - if (enclosing_character == current_character) + if ('"' == current_character) { auto is_key_empty = start_index == pos; @@ -91,7 +91,7 @@ NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file else { const auto current_character = file[pos++]; - return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; + return {pos, current_character == ':' ? State::WAITING_VALUE : State::WAITING_KEY}; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h similarity index 67% rename from src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h index 77980fc161a..fea1dd86202 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h @@ -1,6 +1,7 @@ #pragma once -#include "StateHandler.h" +#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB { @@ -10,7 +11,7 @@ class NoEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string_view; - NoEscapingKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_); + explicit NoEscapingKeyStateHandler(ExtractorConfiguration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -21,7 +22,7 @@ public: [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: - const char key_value_delimiter; + ExtractorConfiguration extractor_configuration; static bool isValidCharacter(char character); }; diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp similarity index 74% rename from src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index 4ae96e4092c..1a70647d4e3 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -3,12 +3,8 @@ namespace DB { -NoEscapingValueStateHandler::NoEscapingValueStateHandler( - char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_) - : StateHandler(enclosing_character_) - , item_delimiter(item_delimiter_), special_character_allowlist(special_character_allowlist_) +NoEscapingValueStateHandler::NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) + : StateHandler(), extractor_configuration(std::move(extractor_configuration_)) { } @@ -18,11 +14,11 @@ NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) c { const auto current_character = file[pos]; - if (enclosing_character && current_character == enclosing_character) + if (current_character == '"') { return {pos + 1u, State::READING_ENCLOSED_VALUE}; } - else if (current_character == item_delimiter) + else if (current_character == ',') { return {pos, State::READING_EMPTY_VALUE}; } @@ -49,7 +45,7 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E { const auto current_character = file[pos++]; - if (current_character == item_delimiter || !isValidCharacter(current_character)) + if (current_character == ',' || !isValidCharacter(current_character)) { value = createElement(file, start_index, pos - 1); return {pos, State::FLUSH_PAIR}; @@ -72,7 +68,7 @@ NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_ { const auto current_character = file[pos++]; - if (enclosing_character == current_character) + if ('"' == current_character) { // not checking for empty value because with current waitValue implementation // there is no way this piece of code will be reached for the very first value character @@ -92,7 +88,7 @@ NextState NoEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, E bool NoEscapingValueStateHandler::isValidCharacter(char character) const { - return std::isalnum(character) || character == '_' || special_character_allowlist.contains(character); + return std::isalnum(character) || character == '_'; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h similarity index 67% rename from src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index ffe17cefe3f..a08d044610e 100644 --- a/src/Functions/keyvaluepair/src/impl/state/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -1,7 +1,8 @@ #pragma once -#include "StateHandler.h" #include +#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB { @@ -11,10 +12,7 @@ class NoEscapingValueStateHandler : public StateHandler public: using ElementType = std::string_view; - NoEscapingValueStateHandler( - char item_delimiter_, - std::optional enclosing_character_, - std::unordered_set special_character_allowlist_); + NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -25,8 +23,7 @@ public: [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: - const char item_delimiter; - std::unordered_set special_character_allowlist; + ExtractorConfiguration extractor_configuration; bool isValidCharacter(char character) const; }; diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp index 1206addea5e..3e9a2df7ab4 100644 --- a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp @@ -14,6 +14,25 @@ constexpr uint16_t maybe_negate(uint16_t x) return ~x; } +template +constexpr bool maybe_negate(bool x) +{ + return positive == x; +} + +static bool is_in(char c, const char * needles, size_t num_chars) +{ + for (auto i = 0u; i < num_chars; i++) + { + if (c == needles[i]) + { + return true; + } + } + + return false; +} + template inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * needle, size_t num_chars) { @@ -48,22 +67,7 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha #endif for (; pos < end; ++pos) - if ( (num_chars >= 1 && maybe_negate(*pos == c[0])) - || (num_chars >= 2 && maybe_negate(*pos == c[1])) - || (num_chars >= 3 && maybe_negate(*pos == c[2])) - || (num_chars >= 4 && maybe_negate(*pos == c[3])) - || (num_chars >= 5 && maybe_negate(*pos == c[4])) - || (num_chars >= 6 && maybe_negate(*pos == c[5])) - || (num_chars >= 7 && maybe_negate(*pos == c[6])) - || (num_chars >= 8 && maybe_negate(*pos == c[7])) - || (num_chars >= 9 && maybe_negate(*pos == c[8])) - || (num_chars >= 10 && maybe_negate(*pos == c[9])) - || (num_chars >= 11 && maybe_negate(*pos == c[10])) - || (num_chars >= 12 && maybe_negate(*pos == c[11])) - || (num_chars >= 13 && maybe_negate(*pos == c[12])) - || (num_chars >= 14 && maybe_negate(*pos == c[13])) - || (num_chars >= 15 && maybe_negate(*pos == c[14])) - || (num_chars >= 16 && maybe_negate(*pos == c[15]))) + if (maybe_negate(is_in(*pos, needle, num_chars))) return pos; return nullptr; @@ -107,7 +111,12 @@ std::optional CharacterFinder::find_first_not(std::st std::optional CharacterFinder::find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const { - return find_first_not({haystack.begin() + offset, haystack.end()}, needles); + if (auto position = find_first_not({haystack.begin() + offset, haystack.end()}, needles)) + { + return offset + *position; + } + + return std::nullopt; } } diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp index ead08c3b5ed..a7581eee2f8 100644 --- a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp @@ -69,33 +69,32 @@ TEST(CharacterFinderTest, FindFirst) TEST(CharacterFinderTest, FindFirstNot) { -// CharacterFinder finder; + CharacterFinder finder; // Test empty haystack -// std::string_view empty; -// std::vector needles = {'a', 'b', 'c'}; -// test_find_first_not(finder, empty, needles, std::nullopt); -// -// // Test haystack with no needles -// std::string_view no_needles = "hello world"; -// std::vector empty_needles = {}; -// test_find_first_not(finder, no_needles, empty_needles, std::make_optional>('h', 0)); -// -// // Test haystack with a single needle -// std::string_view single_needle = "hello world"; -// std::vector single_needles = {'o'}; -// test_find_first_not(finder, single_needle, single_needles, std::make_optional>('h', 0)); + std::string_view empty; + std::vector needles = {'a', 'b', 'c'}; + test_find_first_not(finder, empty, needles, std::nullopt); + + // Test haystack with no needles + std::string_view no_needles = "hello world"; + std::vector empty_needles = {}; + test_find_first_not(finder, no_needles, empty_needles, std::make_optional>('h', 0)); + + // Test haystack with a single needle + std::string_view single_needle = "hello world"; + std::vector single_needles = {'o'}; + test_find_first_not(finder, single_needle, single_needles, std::make_optional>('h', 0)); // Test haystack with multiple needles -// std::string_view multiple_needles = "hello world"; -// std::vector all_needles = {'h', 'e', 'l', 'o', 'w', 'r', 'd'}; -// test_find_first_not(finder, multiple_needles, all_needles, std::nullopt); + std::string_view multiple_needles = "hello world"; + std::vector all_needles = {'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '}; + test_find_first_not(finder, multiple_needles, all_needles, std::nullopt); // 17 byte long string, only loop takes place std::string_view multiple_needles_haystack = "helloworldddddd"; - const auto * res = find_first_not_symbols<'h', 'e', 'l', 'o', 'w', 'r', 'd'>(multiple_needles_haystack.begin(), multiple_needles_haystack.end()); - ASSERT_EQ(res, multiple_needles_haystack.end()); + test_find_first_not(finder, multiple_needles_haystack, {'h', 'e', 'l', 'o', 'w', 'r', 'd'}, std::nullopt); } } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index a48782fa55a..8817f8a31c9 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,16 +1,113 @@ -#include +#include #include namespace DB { +void test_wait(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::size_t expected_pos, State expected_state) +{ + auto next_state = handler.wait(input, 0u); + + ASSERT_EQ(next_state.position_in_string, expected_pos); + ASSERT_EQ(next_state.state, expected_state); +} + +template +void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + NextState next_state; + std::string element; + + if constexpr (enclosed) + { + next_state = handler.readEnclosed(input, 0u, element); + } + else + { + next_state = handler.read(input, 0u, element); + } + + ASSERT_EQ(next_state.position_in_string, expected_pos); + ASSERT_EQ(next_state.state, expected_state); + ASSERT_EQ(element, expected_element); +} + +void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + test_read(handler, input, expected_element, expected_pos, expected_state); +} + +void test_read_enclosed(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + test_read(handler, input, expected_element, expected_pos, expected_state); +} + TEST(InlineEscapingKeyStateHandler, Wait) { -// InlineEscapingKeyStateHandler handler(':', '"'); -// -// std::size_t pos = 0u; -// auto next_state = handler.wait(""); + auto pair_delimiters = std::unordered_set{',', ' '}; + auto quoting_characters = std::unordered_set{'"'}; + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + InlineEscapingKeyStateHandler handler(configuration); + + test_wait(handler, "name", 0u, READING_KEY); + test_wait(handler, "\\:name", 2u, READING_KEY); + test_wait(handler, R"(\\"name)", 3u, READING_ENCLOSED_KEY); + + test_wait(handler, "", 0u, END); + test_wait(handler, "\\\\", 2u, END); +} + +TEST(InlineEscapingKeyStateHandler, Read) +{ + auto enclosing_character = '"'; + + auto pair_delimiters = std::unordered_set{',', ' '}; + auto quoting_characters = std::unordered_set{enclosing_character}; + + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + + InlineEscapingKeyStateHandler handler(configuration); + + std::string key_str = "name"; + std::string key_with_delimiter_str = key_str + ':'; + std::string key_with_delimiter_and_left_spacing = " " + key_with_delimiter_str; + std::string key_with_delimiter_and_random_characters_str = key_str + ':' + "a$a\\:''\""; + + // no delimiter, should discard + test_read(handler, key_str, "", key_str.size(), END); + + // valid + test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + + // valid as well + test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + + test_read(handler, "", "", 0u, END); +} + +TEST(InlineEscapingKeyStateHandler, ReadEnclosed) +{ + auto pair_delimiters = std::unordered_set{',', ' '}; + auto quoting_characters = std::unordered_set{'"'}; + + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + InlineEscapingKeyStateHandler handler(configuration); + + std::string regular_key = "name"; + std::string regular_key_with_end_quote = regular_key + "\""; + std::string key_with_special_characters = "name $!@#¨%&*%&%.569-519"; + std::string key_with_special_characters_with_end_quote = "name $!@#¨%&*%&%.569-519\""; + + std::string key_with_escape_character = regular_key + R"(\n\x4E")"; + + test_read_enclosed(handler, regular_key, "", regular_key.size(), END); + test_read_enclosed(handler, regular_key_with_end_quote, regular_key, regular_key_with_end_quote.size(), READING_KV_DELIMITER); + test_read_enclosed(handler, key_with_special_characters_with_end_quote, key_with_special_characters, key_with_special_characters_with_end_quote.size(), READING_KV_DELIMITER); + test_read_enclosed(handler, key_with_escape_character, regular_key + "\nN", key_with_escape_character.size(), READING_KV_DELIMITER); } } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp new file mode 100644 index 00000000000..f4522b58af8 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -0,0 +1,32 @@ +#include +#include + +namespace DB +{ + +void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) +{ + auto next_state = handler.wait(input, 0u); + + ASSERT_EQ(next_state.position_in_string, expected_pos); + ASSERT_EQ(next_state.state, expected_state); +} + +TEST(InlineEscapingValueStateHandler, Wait) +{ +// auto key_value_delimiters = std::unordered_set {':', '='}; +// auto pair_delimiters = std::unordered_set {',', ' '}; +// auto quoting_characters = std::unordered_set {'"'}; +// +// ExtractorConfiguration configuration(key_value_delimiters, pair_delimiters, quoting_characters); +// InlineEscapingValueStateHandler handler(configuration); +// +// test_wait(handler, "name", 0u, READING_KEY); +// test_wait(handler, "\\:name", 2u, READING_KEY); +// test_wait(handler, R"(\\"name)", 3u, READING_ENCLOSED_KEY); +// +// test_wait(handler, "", 0u, END); +// test_wait(handler, "\\\\", 2u, END); +} + +} From 6922cf7de00d10e9f350c8d33df4e40ac8b14ad5 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 13 Mar 2023 17:35:06 -0300 Subject: [PATCH 067/535] seems functional --- src/Functions/extractKeyValuePairs.cpp | 4 +- .../src/KeyValuePairExtractorBuilder.cpp | 4 +- .../src/KeyValuePairExtractorBuilder.h | 2 +- .../src/impl/state/StateHandler.h | 2 - .../InlineEscapingKeyStateHandler.cpp | 87 +++++++++------ .../escaping/InlineEscapingKeyStateHandler.h | 18 +++ .../InlineEscapingValueStateHandler.cpp | 69 ++++++------ .../InlineEscapingValueStateHandler.h | 18 +++ .../src/impl/state/util/CharacterFinder.cpp | 24 ++++ .../src/impl/state/util/CharacterFinder.h | 19 +++- ...test_escaping_key_value_pair_extractor.cpp | 38 +++++++ ...st_inline_escaping_value_state_handler.cpp | 14 ++- .../tests/gtest_key_value_pair_extractor.cpp | 1 + ...t_key_value_pairs_multiple_input.reference | 103 ----------------- ...extract_key_value_pairs_multiple_input.sql | 104 +++++++----------- 15 files changed, 262 insertions(+), 245 deletions(-) create mode 100644 src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 35c472e1094..6d6ccdbd724 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -47,9 +47,9 @@ static ColumnPtr extract(ColumnPtr data_column, std::shared_ptrgetDataAt(i).toView(); - auto inserted_rows = extractor->extract(row, keys, values); + auto pairs_count = extractor->extract(row, keys, values); - offset += inserted_rows; + offset += pairs_count; offsets->insert(offset); } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 42a066fbbb3..2cab9a9014e 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -48,7 +48,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() { ExtractorConfiguration configuration( - key_value_pair_delimiter.value_or(':'), + key_value_pair_delimiter, item_delimiters, quoting_characters ); @@ -67,7 +67,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { ExtractorConfiguration configuration( - key_value_pair_delimiter.value_or(':'), + key_value_pair_delimiter, item_delimiters, quoting_characters ); diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index de96e58b57f..12f87a0c432 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -24,7 +24,7 @@ public: private: bool with_escaping = false; - std::optional key_value_pair_delimiter; + char key_value_pair_delimiter = ':'; std::unordered_set item_delimiters = {' ', ',', ';'}; std::unordered_set quoting_characters = {'"'}; diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 2aca4d9d3e1..9451576071c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -57,8 +57,6 @@ struct StateHandler virtual ~StateHandler() = default; - const std::unordered_set quoting_characters; - protected: [[nodiscard]] static std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end); }; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index 312977aa400..480be60723b 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -5,14 +5,10 @@ namespace DB { -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) - : extractor_configuration(std::move(configuration_)) -{} - -NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +static auto buildWaitRuntimeConfig(const ExtractorConfiguration & configuration) { const auto & [key_value_delimiter, pair_delimiters, quoting_characters] - = extractor_configuration; + = configuration; std::vector special_characters; special_characters.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); @@ -20,9 +16,54 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(special_characters)); - CharacterFinder finder; + return special_characters; +} - while (auto character_position_opt = finder.find_first_not(file, pos, special_characters)) +static auto buildReadRuntimeConfig(const ExtractorConfiguration & configuration) +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = configuration; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + return needles; +} + +static auto buildReadEnclosedRuntimeConfig(const ExtractorConfiguration & configuration) +{ + const auto & quoting_characters = configuration.quoting_characters; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + + return needles; +} + +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) + : extractor_configuration(std::move(configuration_)) +{ + auto wait_config = buildWaitRuntimeConfig(extractor_configuration); + auto read_config = buildReadRuntimeConfig(extractor_configuration); + auto read_enclosed_config = buildReadEnclosedRuntimeConfig(extractor_configuration); + runtime_configuration = RuntimeConfiguration(wait_config, read_config, read_enclosed_config); +} + +NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +{ + BoundsSafeCharacterFinder finder; + + const auto & quoting_characters = extractor_configuration.quoting_characters; + + while (auto character_position_opt = finder.find_first_not(file, pos, runtime_configuration.wait_configuration)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -48,19 +89,11 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const { - CharacterFinder finder; + BoundsSafeCharacterFinder finder; const auto & [key_value_delimiter, pair_delimiters, quoting_characters] = extractor_configuration; - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - needles.push_back(key_value_delimiter); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - key.clear(); /* @@ -68,7 +101,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, needles)) + while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_configuration)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -82,14 +115,10 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, } auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - // fix later, -1 looks uglyyyyy next_pos = next_byte_ptr - file.begin(); if (escaped_characters.empty()) { - // I have to consider a case like the following: "name:arthur\". - // will it be discarded or not? - // current implementation will discard it. return {next_pos, State::WAITING_KEY}; } else @@ -126,19 +155,13 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const { - CharacterFinder finder; + BoundsSafeCharacterFinder finder; const auto & quoting_characters = extractor_configuration.quoting_characters; - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - key.clear(); - while (auto character_position_opt = finder.find_first(file, pos, needles)) + while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_enclosed_configuration)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -152,14 +175,10 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz } auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - // fix later, -1 looks uglyyyyy next_pos = next_byte_ptr - file.begin(); if (escaped_characters.empty()) { - // I have to consider a case like the following: "name:arthur\". - // will it be discarded or not? - // current implementation will discard it. return {next_pos, State::WAITING_KEY}; } else diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h index 288fffea26f..1f1c0383546 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h @@ -10,6 +10,23 @@ namespace DB class InlineEscapingKeyStateHandler : public StateHandler { + struct RuntimeConfiguration + { + RuntimeConfiguration() = default; + + RuntimeConfiguration( + std::vector wait_configuration_, + std::vector read_configuration_, + std::vector read_enclosed_configuration_ + ) : wait_configuration(std::move(wait_configuration_)), + read_configuration(std::move(read_configuration_)), + read_enclosed_configuration(std::move(read_enclosed_configuration_)) {} + + std::vector wait_configuration; + std::vector read_configuration; + std::vector read_enclosed_configuration; + }; + public: using ElementType = std::string; @@ -25,6 +42,7 @@ public: private: ExtractorConfiguration extractor_configuration; + RuntimeConfiguration runtime_configuration; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index de4d9087df4..bd4ca441ba3 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -5,9 +5,41 @@ namespace DB { +static auto buildReadRuntimeConfig(const ExtractorConfiguration & configuration) +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = configuration; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + return needles; +} + +static auto buildReadEnclosedRuntimeConfig(const ExtractorConfiguration & configuration) +{ + const auto & quoting_characters = configuration.quoting_characters; + + std::vector needles; + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + + return needles; +} + InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { + auto read_config = buildReadRuntimeConfig(extractor_configuration); + auto read_enclosed_config = buildReadEnclosedRuntimeConfig(extractor_configuration); + runtime_configuration = RuntimeConfiguration({}, read_config, read_enclosed_config); } NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const @@ -15,7 +47,7 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po const auto & [key_value_delimiter, pair_delimiters, quoting_characters] = extractor_configuration; - while (pos < file.size()) + if (pos < file.size()) { const auto current_character = file[pos]; @@ -31,13 +63,10 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po { return {pos, State::WAITING_KEY}; } - // skip leading white spaces, re-think this - else if (current_character != ' ') + else { return {pos, State::READING_VALUE}; } - - pos++; } return {pos, State::READING_EMPTY_VALUE}; @@ -45,19 +74,11 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const { - CharacterFinder finder; + BoundsSafeCharacterFinder finder; const auto & [key_value_delimiter, pair_delimiters, quoting_characters] = extractor_configuration; - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - needles.push_back(key_value_delimiter); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - value.clear(); /* @@ -65,7 +86,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, needles)) + while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_configuration)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -79,14 +100,10 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po } auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - // fix later, -1 looks uglyyyyy next_pos = next_byte_ptr - file.begin(); if (escaped_characters.empty()) { - // I have to consider a case like the following: "name:arthur\". - // will it be discarded or not? - // current implementation will discard it. return {next_pos, State::WAITING_KEY}; } else @@ -126,19 +143,13 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const { - CharacterFinder finder; + BoundsSafeCharacterFinder finder; const auto & quoting_characters = extractor_configuration.quoting_characters; - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - value.clear(); - while (auto character_position_opt = finder.find_first(file, pos, needles)) + while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_enclosed_configuration)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -152,14 +163,10 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s } auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - // fix later, -1 looks uglyyyyy next_pos = next_byte_ptr - file.begin(); if (escaped_characters.empty()) { - // I have to consider a case like the following: "name:arthur\". - // will it be discarded or not? - // current implementation will discard it. return {next_pos, State::WAITING_KEY}; } else diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index 1fdd646ba05..7d607c298df 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -11,6 +11,23 @@ namespace DB class InlineEscapingValueStateHandler : public StateHandler { + struct RuntimeConfiguration + { + RuntimeConfiguration() = default; + + RuntimeConfiguration( + std::vector wait_configuration_, + std::vector read_configuration_, + std::vector read_enclosed_configuration_ + ) : wait_configuration(std::move(wait_configuration_)), + read_configuration(std::move(read_configuration_)), + read_enclosed_configuration(std::move(read_enclosed_configuration_)) {} + + std::vector wait_configuration; + std::vector read_configuration; + std::vector read_enclosed_configuration; + }; + public: using ElementType = std::string; @@ -26,6 +43,7 @@ public: private: ExtractorConfiguration extractor_configuration; + RuntimeConfiguration runtime_configuration; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp index 3e9a2df7ab4..21cb360b551 100644 --- a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp @@ -119,4 +119,28 @@ std::optional CharacterFinder::find_first_not(std::st return std::nullopt; } +std::optional BoundsSafeCharacterFinder::find_first( + std::string_view haystack, std::size_t offset, const std::vector & needles +) const +{ + if (haystack.size() > offset) + { + return CharacterFinder::find_first(haystack, offset, needles); + } + + return std::nullopt; +} + +std::optional BoundsSafeCharacterFinder::find_first_not( + std::string_view haystack, std::size_t offset, const std::vector & needles +) const +{ + if (haystack.size() > offset) + { + return CharacterFinder::find_first_not(haystack, offset, needles); + } + + return std::nullopt; +} + } diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h index ebc6d03610d..048917ca0c0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h +++ b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include namespace DB { @@ -10,15 +12,28 @@ class CharacterFinder public: using Position = std::size_t; + virtual ~CharacterFinder() = default; + std::optional find_first(std::string_view haystack, const std::vector & needles) const; - std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + virtual std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; std::optional find_first_not(std::string_view haystack, const std::vector & needles) const; - std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + virtual std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; }; +/* + * Maybe decorator would be better :) + * */ +class BoundsSafeCharacterFinder : CharacterFinder +{ +public: + std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const override; + + std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const override; +}; + } diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp new file mode 100644 index 00000000000..f1192750090 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -0,0 +1,38 @@ +#include +#include +#include + +namespace DB +{ + +void assert_byte_equality(StringRef lhs, const std::vector & rhs) +{ + std::vector lhs_vector {lhs.data, lhs.data + lhs.size}; + ASSERT_EQ(lhs_vector, rhs); +} + +TEST(EscapingKeyValuePairExtractor, EscapeSequences) +{ + using namespace std::literals; + + auto extractor = KeyValuePairExtractorBuilder().withEscaping().build(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + auto pairs_count = extractor->extract(R"(key1:\xFF key2:\n\t\r key3:\0377)"sv, keys, values); + + ASSERT_EQ(pairs_count, 3u); + ASSERT_EQ(keys->size(), pairs_count); + ASSERT_EQ(keys->size(), values->size()); + + ASSERT_EQ(keys->getDataAt(0), "key1"); + ASSERT_EQ(keys->getDataAt(1), "key2"); + ASSERT_EQ(keys->getDataAt(2), "key3"); + + assert_byte_equality(values->getDataAt(0), {0xFF}); + assert_byte_equality(values->getDataAt(1), {0xA, 0x9, 0xD}); + assert_byte_equality(values->getDataAt(2), {0xFF}); +} + +} diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index f4522b58af8..b54c468b242 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -14,12 +14,14 @@ void test_wait(const auto & handler, std::string_view input, std::size_t expecte TEST(InlineEscapingValueStateHandler, Wait) { -// auto key_value_delimiters = std::unordered_set {':', '='}; -// auto pair_delimiters = std::unordered_set {',', ' '}; -// auto quoting_characters = std::unordered_set {'"'}; -// -// ExtractorConfiguration configuration(key_value_delimiters, pair_delimiters, quoting_characters); -// InlineEscapingValueStateHandler handler(configuration); + auto pair_delimiters = std::unordered_set {','}; + auto quoting_characters = std::unordered_set {'"'}; + + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + InlineEscapingValueStateHandler handler(configuration); + + test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); + // // test_wait(handler, "name", 0u, READING_KEY); // test_wait(handler, "\\:name", 2u, READING_KEY); diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index 27fcf344818..70fe25d580a 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -1,5 +1,6 @@ //#include //#include + // //namespace DB //{ diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 512a2a6db69..e69de29bb2d 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -1,103 +0,0 @@ --- { echoOn } ------ Enclosed elements tests ----- - --- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} -WITH - extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', '!', ':', ',', '"', '.') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30','favorite_movie':'','height':'1.75','name':'Neymar','team':'psg'} ------ Escaping tests ----- - --- Expected output: {'age':'30'} -WITH - extractKeyValuePairs('na,me,: neymar, age:30', '!', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30'} --- Expected output: {'age':'30'} -WITH - extractKeyValuePairs('na$me,: neymar, age:30', '!', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30'} --- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} -WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', '!', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30','favorite_quote':'Premature optimization is the r$$t of all evil','name':'neymar'} --- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the root of all evi','age':'30'} -WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', '!', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30','favorite_quote':'Premature!','name':'neymar'} ------ Mix Strings ----- -WITH - extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', '!', ':', ',', '"', '.') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'age':'30','height':'1.75','na:me':'neymar','school':'lupe picasso','team':'psg'} --- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} -WITH - extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', '!', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'XNFHGSSF_RHRUZHVBS_KWBT':'F'} ------ Allow list special value characters ----- - --- Expected output: {'some_key':'@dolla%sign$'} -WITH - extractKeyValuePairs('some_key: @dolla%sign$,', '!', ':', ',', '"', '$@%') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; -{'some_key':'@dolla%sign$'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index d63a6f14ce8..99f7da17910 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -1,9 +1,10 @@ -- { echoOn } ------ Enclosed elements tests ----- --- Expected output: {'name':'Neymar','team':'psg','age':'30','favorite_movie':'','height':'1.75'} +-- basic tests + +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('"name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -13,48 +14,11 @@ WITH SELECT x; ------ Escaping tests ----- - --- Expected output: {'age':'30'} +-- special (not control) characters in the middle of elements +-- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH - extractKeyValuePairs('na,me,: neymar, age:30', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; - --- Expected output: {'age':'30'} -WITH - extractKeyValuePairs('na$me,: neymar, age:30', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; - --- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the r$$t of all evil','age':'30'} -WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature! optimization! is! the! r!$!$t! of! all! evil, age:30', ':', ',', '"') AS s_map, - CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x -SELECT - x; - --- Expected output: {'name':'neymar','favorite_quote':'Premature optimization is the root of all evi','age':'30'} -WITH - extractKeyValuePairs('name: neymar, favorite_quote: Premature!! optimization, age:30', ':', ',', '"') AS s_map, - CAST( + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l') AS s_map, + CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) ), @@ -63,9 +27,10 @@ WITH SELECT x; ------ Mix Strings ----- +-- non-standard escape characters (i.e not \n, \r, \t and etc), back-slash should be preserved +-- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} WITH - extractKeyValuePairs('9 ads =nm, na!:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe! picasso, team: psg,', ':', ',', '"', '.') AS s_map, + extractKeyValuePairs('currency:\$USD, amount\z:$5\h') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -75,28 +40,43 @@ WITH SELECT x; --- Expected output: {'XNFHGSSF_RHRUZHVBS_KWBT':'F'} +-- standard escape sequences are covered by unit tests + +-- simple quoting +-- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('XNFHGSSF_RHRUZHVBS_KWBT: F,', ':', ',', '"') AS s_map, - CAST( + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"') AS s_map, + CAST( arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x SELECT x; ------ Allow list special value characters ----- - --- Expected output: {'some_key':'@dolla%sign$'} +-- empty values +-- expected output: {'age':'','name':'','nationality':''} WITH - extractKeyValuePairs('some_key: @dolla%sign$,', ':', ',', '"', '$@%') AS s_map, + extractKeyValuePairs('name:"", age: , nationality:') AS s_map, CAST( - arrayMap( - (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) - ), - 'Map(String,String)' - ) AS x + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- empty keys +-- empty keys are not allowed, thus empty output is expected +WITH + extractKeyValuePairs('"":abc, :def') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x SELECT x; From b0d345e2f319736b0f670429fa95f4ed0b96a39f Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Tue, 14 Mar 2023 11:23:12 +0000 Subject: [PATCH 068/535] revert Poco HelpFormatter default width - try to split tests and run separately --- .../02598_clickhouse_help.reference | 1550 ----------------- ...8_clickhouse_help_help_formatter.reference | 514 ++++++ .../02598_clickhouse_help_help_formatter.sh | 38 + ..._clickhouse_help_program_options.reference | 1077 ++++++++++++ ... 02598_clickhouse_help_program_options.sh} | 47 +- 5 files changed, 1648 insertions(+), 1578 deletions(-) delete mode 100644 tests/queries/0_stateless/02598_clickhouse_help.reference create mode 100644 tests/queries/0_stateless/02598_clickhouse_help_help_formatter.reference create mode 100755 tests/queries/0_stateless/02598_clickhouse_help_help_formatter.sh create mode 100644 tests/queries/0_stateless/02598_clickhouse_help_program_options.reference rename tests/queries/0_stateless/{02598_clickhouse_help.sh => 02598_clickhouse_help_program_options.sh} (86%) diff --git a/tests/queries/0_stateless/02598_clickhouse_help.reference b/tests/queries/0_stateless/02598_clickhouse_help.reference deleted file mode 100644 index d1868d9de70..00000000000 --- a/tests/queries/0_stateless/02598_clickhouse_help.reference +++ /dev/null @@ -1,1550 +0,0 @@ -================BINARY========================== - -clickhouse --help - -Use one of the following commands: -clickhouse local [args] -clickhouse client [args] -clickhouse benchmark [args] -clickhouse server [args] -clickhouse extract-from-config [args] -clickhouse compressor [args] -clickhouse format [args] -clickhouse copier [args] -clickhouse obfuscator [args] -clickhouse git-import [args] -clickhouse keeper [args] -clickhouse keeper-converter [args] -clickhouse install [args] -clickhouse start [args] -clickhouse stop [args] -clickhouse status [args] -clickhouse restart [args] -clickhouse static-files-disk-uploader [args] -clickhouse su [args] -clickhouse hash-binary [args] -clickhouse disks [args] -clickhouse help [args] - -clickhouse help - -Use one of the following commands: -clickhouse local [args] -clickhouse client [args] -clickhouse benchmark [args] -clickhouse server [args] -clickhouse extract-from-config [args] -clickhouse compressor [args] -clickhouse format [args] -clickhouse copier [args] -clickhouse obfuscator [args] -clickhouse git-import [args] -clickhouse keeper [args] -clickhouse keeper-converter [args] -clickhouse install [args] -clickhouse start [args] -clickhouse stop [args] -clickhouse status [args] -clickhouse restart [args] -clickhouse static-files-disk-uploader [args] -clickhouse su [args] -clickhouse hash-binary [args] -clickhouse disks [args] -clickhouse help [args] - -clickhouse local - -Usage: clickhouse local [initial table definition] [--query ] -clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. - -It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. - -To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: - CREATE TABLE
() ENGINE = File(, ); -Or through corresponding command line parameters --table --structure --input-format and --file. - -clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. - -clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. - -Example reading file from S3, converting format and writing to a file: -clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" - -clickhouse client - -Usage: clickhouse client [initial table definition] [--query ] -clickhouse-client is a client application that is used to connect to ClickHouse. -It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. -'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. - -This one will try connect to tcp native port(9000) without encryption: - clickhouse client --host clickhouse.example.com --password mysecretpassword -To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . - clickhouse client --secure --host clickhouse.example.com --password mysecretpassword - - -clickhouse benchmark - -Usage: clickhouse benchmark [options] < queries.txt -Usage: clickhouse benchmark [options] --query "query text" -clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. - -clickhouse server - -usage: -clickhouse server [OPTION] [-- [ARG]...] -positional arguments can be used to rewrite config.xml properties, for -example, --http_port=8010 - --h, --help show help and exit --V, --version show version and exit --C, --config-file= load configuration from a given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, e.g. 027). ---pidfile=path Write the process ID of the application to - given file. - -clickhouse extract - -Preprocess config file and extract value of the given key. - -Usage: clickhouse extract-from-config [options] - -Allowed options: - --help produce this help message - --stacktrace print stack traces of exceptions - --process-zk-includes if there are from_zk elements in config, connect - to ZooKeeper and process them - --try Do not warn about missing keys - --log-level arg (=error) log level - -c [ --config-file ] arg path to config file - -k [ --key ] arg key to get value for - - -clickhouse compressor - -Usage: clickhouse compressor [options] < INPUT > OUTPUT -Alternative usage: clickhouse compressor [options] INPUT OUTPUT -Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) - --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data - - -clickhouse format - -Usage: clickhouse format [options] < query -Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI - terminal escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on - success - -n [ --multiquery ] allow multiple queries in the same - file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each - line of the formatted query - --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that - determines the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read - later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). - - -clickhouse copier - -usage: clickhouse copier --config-file --task-path -Copies tables from one cluster to another - --C, --config-file= - load - configuration - from - a - given - file --L, --log-file= - use - given - log - file --E, --errorlog-file= - use - given - log - file - for - errors - only --P, --pid-file= - use - given - pidfile ---daemon - Run - application - as - a - daemon. ---umask=mask - Set - the - daemon's - umask - (octal, - e.g. - 027). ---pidfile=path - Write - the - process - ID - of - the - application - to - given - file. ---task-path=task-path - path - to - task - in - ZooKeeper ---task-file=task-file - path - to - task - file - for - uploading - in - ZooKeeper - to - task-path ---task-upload-force=task-upload-force - Force - upload - task-file - even - node - already - exists ---safe-mode - disables - ALTER - DROP - PARTITION - in - case - of - errors ---copy-fault-probability=copy-fault-probability - the - copying - fails - with - specified - probability - (used - to - test - partition - state - recovering) ---move-fault-probability=move-fault-probability - the - moving - fails - with - specified - probability - (used - to - test - partition - state - recovering) ---log-level=log-level - sets - log - level ---base-dir=base-dir - base - directory - for - copiers, - consecutive - copier - launches - will - populate - /base-dir/launch_id/* - directories ---experimental-use-sample-offset=experimental-use-sample-offset - Use - SAMPLE - OFFSET - query - instead - of - cityHash64(PRIMARY - KEY) - % - n - == - k ---status - Get - for - status - for - current - execution ---max-table-tries=max-table-tries - Number - of - tries - for - the - copy - table - task ---max-shard-partition-tries=max-shard-partition-tries - Number - of - tries - for - the - copy - one - partition - task ---max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter - Number - of - tries - for - final - ALTER - ATTACH - to - destination - table ---retry-delay-ms=retry-delay-ms - Delay - between - task - retries ---help - produce - this - help - message - -clickhouse obfuscator - - -Simple tool for table data obfuscation. - -It reads input table and produces output table, that retain some properties of input, but contains different data. -It allows to publish almost real production data for usage in benchmarks. - -It is designed to retain the following properties of data: -- cardinalities of values (number of distinct values) for every column and for every tuple of columns; -- conditional cardinalities: number of distinct values of one column under condition on value of another column; -- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; -- probability distributions of length of strings; -- probability of zero values of numbers; empty strings and arrays, NULLs; -- data compression ratio when compressed with LZ77 and entropy family of codecs; -- continuity (magnitude of difference) of time values across table; continuity of floating point values. -- date component of DateTime values; -- UTF-8 validity of string values; -- string values continue to look somewhat natural. - -Most of the properties above are viable for performance testing: -- reading data, filtering, aggregation and sorting will work at almost the same speed - as on original data due to saved cardinalities, magnitudes, compression ratios, etc. - -It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. -Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. - -It use some cryptographic primitives to transform data, but from the cryptographic point of view, - it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. - -It may retain some data you don't want to publish. - -It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. -For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. -So, the user will be able to count exact ratio of mobile traffic. - -Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. -If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, - it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. -And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. - -This tool works fine only with reasonable amount of data (at least 1000s of rows). - - -Usage: clickhouse obfuscator [options] < in > out - -Input must be seekable file (it will be read twice). - -Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list - of column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be - random string with at least 10 bytes - length; note that a seed for each - column is derived from this seed and a - column name: you can obfuscate data - for different tables and as long as - you use identical seed and identical - column names, the data for - corresponding non-text columns for - different tables will be transformed - in the same way, so the data for - different tables can be JOINed after - obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed - is not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less - than specified - --num-buckets-cutoff arg (=0) cutoff for number of different - possible continuations for a context: - remove all histograms with less than - specified number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed - for RNG in markov model - - -Example: - clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv - -clickhouse git-import - - -A tool to extract information from Git repository for analytics. - -It dumps the data for the following tables: -- commits - commits with statistics; -- file_changes - files changed in every commit with the info about the change and statistics; -- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. - -The largest and the most important table is "line_changes". - -Allows to answer questions like: -- list files with maximum number of authors; -- show me the oldest lines of code in the repository; -- show me the files with longest history; -- list favorite files for author; -- list largest files with lowest number of authors; -- at what weekday the code has highest chance to stay in repository; -- the distribution of code age across repository; -- files sorted by average code age; -- quickly show file with blame info (rough); -- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; -- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; -- list files with most modifications; -- list files that were rewritten most number of time or by most of authors; -- what is percentage of code removal by other authors, across authors; -- the matrix of authors that shows what authors tends to rewrite another authors code; -- what is the worst time to write code in sense that the code has highest chance to be rewritten; -- the average time before code will be rewritten and the median (half-life of code decay); -- comments/code percentage change in time / by author / by location; -- who tend to write more tests / cpp code / comments. - -The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. - -The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. - -Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). - -The tool can process large enough repositories in a reasonable time. -It has been tested on: -- ClickHouse: 31 seconds; 3 million rows; -- LLVM: 8 minutes; 62 million rows; -- Linux - 12 minutes; 85 million rows; -- Chromium - 67 minutes; 343 million rows; -(the numbers as of Sep 2020) - - -Prepare the database by executing the following queries: - -DROP DATABASE IF EXISTS git; -CREATE DATABASE git; - -CREATE TABLE git.commits -( - hash String, - author LowCardinality(String), - time DateTime, - message String, - files_added UInt32, - files_deleted UInt32, - files_renamed UInt32, - files_modified UInt32, - lines_added UInt32, - lines_deleted UInt32, - hunks_added UInt32, - hunks_removed UInt32, - hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -CREATE TABLE git.file_changes -( - change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), - path LowCardinality(String), - old_path LowCardinality(String), - file_extension LowCardinality(String), - lines_added UInt32, - lines_deleted UInt32, - hunks_added UInt32, - hunks_removed UInt32, - hunks_changed UInt32, - - commit_hash String, - author LowCardinality(String), - time DateTime, - commit_message String, - commit_files_added UInt32, - commit_files_deleted UInt32, - commit_files_renamed UInt32, - commit_files_modified UInt32, - commit_lines_added UInt32, - commit_lines_deleted UInt32, - commit_hunks_added UInt32, - commit_hunks_removed UInt32, - commit_hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -CREATE TABLE git.line_changes -( - sign Int8, - line_number_old UInt32, - line_number_new UInt32, - hunk_num UInt32, - hunk_start_line_number_old UInt32, - hunk_start_line_number_new UInt32, - hunk_lines_added UInt32, - hunk_lines_deleted UInt32, - hunk_context LowCardinality(String), - line LowCardinality(String), - indent UInt8, - line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), - - prev_commit_hash String, - prev_author LowCardinality(String), - prev_time DateTime, - - file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), - path LowCardinality(String), - old_path LowCardinality(String), - file_extension LowCardinality(String), - file_lines_added UInt32, - file_lines_deleted UInt32, - file_hunks_added UInt32, - file_hunks_removed UInt32, - file_hunks_changed UInt32, - - commit_hash String, - author LowCardinality(String), - time DateTime, - commit_message String, - commit_files_added UInt32, - commit_files_deleted UInt32, - commit_files_renamed UInt32, - commit_files_modified UInt32, - commit_lines_added UInt32, - commit_lines_deleted UInt32, - commit_hunks_added UInt32, - commit_hunks_removed UInt32, - commit_hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -Run the tool. - -Then insert the data with the following commands: - -clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv -clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv -clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv - - -Usage: clickhouse git-import -Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple - times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number - of added + removed lines) is larger - than specified threshold. Does not - apply for initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn - - -Example: - -clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' - -clickhouse keeper - -usage: -clickhouse keeper [OPTION] [-- [ARG]...] -positional arguments can be used to rewrite config.xml properties, for -example, --http_port=8010 - --h, --help show help and exit --V, --version show version and exit --force-recovery, --force-recovery Force recovery mode allowing Keeper to - overwrite cluster configuration without - quorum --C, --config-file= load configuration from a given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, e.g. 027). ---pidfile=path Write the process ID of the application to - given file. - -clickhouse keeper-converter - -Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots -Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot - - -clickhouse install - -Usage: sudo clickhouse install [options] - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) where to install binaries - --config-path arg (=etc/clickhouse-server) - where to install configs - --log-path arg (=var/log/clickhouse-server) - where to create log directory - --data-path arg (=var/lib/clickhouse) - directory for data - --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group - - -clickhouse start - -Usage: sudo clickhouse start - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) directory with binary - --config-path arg (=etc/clickhouse-server) - directory with configs - --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group - --max-tries arg (=60) Max number of tries for waiting the - server (with 1 second delay) - --no-sudo Use clickhouse su if sudo is - unavailable - - -clickhouse stop - -Usage: sudo clickhouse stop - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --force Stop with KILL signal instead of TERM - --do-not-kill Do not send KILL even if TERM did not - help - --max-tries arg (=60) Max number of tries for waiting the - server to finish after sending TERM - (with 1 second delay) - - -clickhouse status - -Usage: sudo clickhouse status - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --pid-path arg (=var/run/clickhouse-server) - directory for pid file - - -clickhouse restart - -Usage: sudo clickhouse restart - -h [ --help ] produce help message - --prefix arg (=/) prefix for all paths - --binary-path arg (=usr/bin) directory with binary - --config-path arg (=etc/clickhouse-server) - directory with configs - --pid-path arg (=var/run/clickhouse-server) - directory for pid file - --user arg (=clickhouse) clickhouse user - --group arg (=clickhouse) clickhouse group - --force arg (=0) Stop with KILL signal instead of TERM - --do-not-kill Do not send KILL even if TERM did not - help - --max-tries arg (=60) Max number of tries for waiting the - server (with 1 second delay) - --no-sudo Use clickhouse su if sudo is - unavailable - - -clickhouse static - -Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via - PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode - - -clickhouse su - -Usage: clickhouse su user:group ... - -clickhouse hash - -Usage: clickhouse hash -Prints hash of clickhouse binary. - -h, --help Prints this message -Result is intentionally without newline. So you can run: -objcopy --add-section .clickhouse.hash=<(./clickhouse hash-binary) clickhouse. - - -clickhouse disks - -ClickHouse disk management tool -usage clickhouse disks [OPTION] -clickhouse-disks - -read read File `from_path` to `to_path` or to stdout -Path should be in format './' or './path' or 'path' - -write Write File `from_path` or stdin to `to_path` - -link Create hardlink from `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -mkdir Create directory or directories recursively - -remove Remove file or directory with all children. Throws exception if file doesn't exists. -Path should be in format './' or './path' or 'path' - -move Move file or directory from `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -copy Recursively copy data containing at `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -list List files (the default disk is used by default) -Path should be in format './' or './path' or 'path' - -list-disks List disks names - -clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level - -================SYMLINK============================== - -clickhouse-local - -Usage: clickhouse local [initial table definition] [--query ] -clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. - -It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. - -To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: - CREATE TABLE
() ENGINE = File(, ); -Or through corresponding command line parameters --table --structure --input-format and --file. - -clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. - -clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. - -Example reading file from S3, converting format and writing to a file: -clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" - -clickhouse-client - -Usage: clickhouse client [initial table definition] [--query ] -clickhouse-client is a client application that is used to connect to ClickHouse. -It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. -'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. - -This one will try connect to tcp native port(9000) without encryption: - clickhouse client --host clickhouse.example.com --password mysecretpassword -To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . - clickhouse client --secure --host clickhouse.example.com --password mysecretpassword - - -clickhouse-benchmark - -Usage: clickhouse benchmark [options] < queries.txt -Usage: clickhouse benchmark [options] --query "query text" -clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. - -clickhouse-server - -usage: -clickhouse-server [OPTION] [-- [ARG]...] -positional arguments can be used to rewrite config.xml properties, for -example, --http_port=8010 - --h, --help show help and exit --V, --version show version and exit --C, --config-file= load configuration from a given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, e.g. 027). ---pidfile=path Write the process ID of the application to - given file. - -clickhouse-extract - -Preprocess config file and extract value of the given key. - -Usage: clickhouse extract-from-config [options] - -Allowed options: - --help produce this help message - --stacktrace print stack traces of exceptions - --process-zk-includes if there are from_zk elements in config, connect - to ZooKeeper and process them - --try Do not warn about missing keys - --log-level arg (=error) log level - -c [ --config-file ] arg path to config file - -k [ --key ] arg key to get value for - - -clickhouse-compressor - -Usage: clickhouse compressor [options] < INPUT > OUTPUT -Alternative usage: clickhouse compressor [options] INPUT OUTPUT -Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) - --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data - - -clickhouse-format - -Usage: clickhouse format [options] < query -Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI - terminal escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on - success - -n [ --multiquery ] allow multiple queries in the same - file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each - line of the formatted query - --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that - determines the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read - later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). - - -clickhouse-copier - -usage: clickhouse-copier --config-file --task-path -Copies tables from one cluster to another - --C, --config-file= - load - configuration - from - a - given - file --L, --log-file= - use - given - log - file --E, --errorlog-file= - use - given - log - file - for - errors - only --P, --pid-file= - use - given - pidfile ---daemon - Run - application - as - a - daemon. ---umask=mask - Set - the - daemon's - umask - (octal, - e.g. - 027). ---pidfile=path - Write - the - process - ID - of - the - application - to - given - file. ---task-path=task-path - path - to - task - in - ZooKeeper ---task-file=task-file - path - to - task - file - for - uploading - in - ZooKeeper - to - task-path ---task-upload-force=task-upload-force - Force - upload - task-file - even - node - already - exists ---safe-mode - disables - ALTER - DROP - PARTITION - in - case - of - errors ---copy-fault-probability=copy-fault-probability - the - copying - fails - with - specified - probability - (used - to - test - partition - state - recovering) ---move-fault-probability=move-fault-probability - the - moving - fails - with - specified - probability - (used - to - test - partition - state - recovering) ---log-level=log-level - sets - log - level ---base-dir=base-dir - base - directory - for - copiers, - consecutive - copier - launches - will - populate - /base-dir/launch_id/* - directories ---experimental-use-sample-offset=experimental-use-sample-offset - Use - SAMPLE - OFFSET - query - instead - of - cityHash64(PRIMARY - KEY) - % - n - == - k ---status - Get - for - status - for - current - execution ---max-table-tries=max-table-tries - Number - of - tries - for - the - copy - table - task ---max-shard-partition-tries=max-shard-partition-tries - Number - of - tries - for - the - copy - one - partition - task ---max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter - Number - of - tries - for - final - ALTER - ATTACH - to - destination - table ---retry-delay-ms=retry-delay-ms - Delay - between - task - retries ---help - produce - this - help - message - -clickhouse-obfuscator - - -Simple tool for table data obfuscation. - -It reads input table and produces output table, that retain some properties of input, but contains different data. -It allows to publish almost real production data for usage in benchmarks. - -It is designed to retain the following properties of data: -- cardinalities of values (number of distinct values) for every column and for every tuple of columns; -- conditional cardinalities: number of distinct values of one column under condition on value of another column; -- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; -- probability distributions of length of strings; -- probability of zero values of numbers; empty strings and arrays, NULLs; -- data compression ratio when compressed with LZ77 and entropy family of codecs; -- continuity (magnitude of difference) of time values across table; continuity of floating point values. -- date component of DateTime values; -- UTF-8 validity of string values; -- string values continue to look somewhat natural. - -Most of the properties above are viable for performance testing: -- reading data, filtering, aggregation and sorting will work at almost the same speed - as on original data due to saved cardinalities, magnitudes, compression ratios, etc. - -It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. -Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. - -It use some cryptographic primitives to transform data, but from the cryptographic point of view, - it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. - -It may retain some data you don't want to publish. - -It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. -For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. -So, the user will be able to count exact ratio of mobile traffic. - -Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. -If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, - it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. -And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. - -This tool works fine only with reasonable amount of data (at least 1000s of rows). - - -Usage: clickhouse obfuscator [options] < in > out - -Input must be seekable file (it will be read twice). - -Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list - of column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be - random string with at least 10 bytes - length; note that a seed for each - column is derived from this seed and a - column name: you can obfuscate data - for different tables and as long as - you use identical seed and identical - column names, the data for - corresponding non-text columns for - different tables will be transformed - in the same way, so the data for - different tables can be JOINed after - obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed - is not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less - than specified - --num-buckets-cutoff arg (=0) cutoff for number of different - possible continuations for a context: - remove all histograms with less than - specified number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed - for RNG in markov model - - -Example: - clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv - -clickhouse-git-import - - -A tool to extract information from Git repository for analytics. - -It dumps the data for the following tables: -- commits - commits with statistics; -- file_changes - files changed in every commit with the info about the change and statistics; -- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. - -The largest and the most important table is "line_changes". - -Allows to answer questions like: -- list files with maximum number of authors; -- show me the oldest lines of code in the repository; -- show me the files with longest history; -- list favorite files for author; -- list largest files with lowest number of authors; -- at what weekday the code has highest chance to stay in repository; -- the distribution of code age across repository; -- files sorted by average code age; -- quickly show file with blame info (rough); -- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; -- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; -- list files with most modifications; -- list files that were rewritten most number of time or by most of authors; -- what is percentage of code removal by other authors, across authors; -- the matrix of authors that shows what authors tends to rewrite another authors code; -- what is the worst time to write code in sense that the code has highest chance to be rewritten; -- the average time before code will be rewritten and the median (half-life of code decay); -- comments/code percentage change in time / by author / by location; -- who tend to write more tests / cpp code / comments. - -The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. - -The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. - -Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). - -The tool can process large enough repositories in a reasonable time. -It has been tested on: -- ClickHouse: 31 seconds; 3 million rows; -- LLVM: 8 minutes; 62 million rows; -- Linux - 12 minutes; 85 million rows; -- Chromium - 67 minutes; 343 million rows; -(the numbers as of Sep 2020) - - -Prepare the database by executing the following queries: - -DROP DATABASE IF EXISTS git; -CREATE DATABASE git; - -CREATE TABLE git.commits -( - hash String, - author LowCardinality(String), - time DateTime, - message String, - files_added UInt32, - files_deleted UInt32, - files_renamed UInt32, - files_modified UInt32, - lines_added UInt32, - lines_deleted UInt32, - hunks_added UInt32, - hunks_removed UInt32, - hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -CREATE TABLE git.file_changes -( - change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), - path LowCardinality(String), - old_path LowCardinality(String), - file_extension LowCardinality(String), - lines_added UInt32, - lines_deleted UInt32, - hunks_added UInt32, - hunks_removed UInt32, - hunks_changed UInt32, - - commit_hash String, - author LowCardinality(String), - time DateTime, - commit_message String, - commit_files_added UInt32, - commit_files_deleted UInt32, - commit_files_renamed UInt32, - commit_files_modified UInt32, - commit_lines_added UInt32, - commit_lines_deleted UInt32, - commit_hunks_added UInt32, - commit_hunks_removed UInt32, - commit_hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -CREATE TABLE git.line_changes -( - sign Int8, - line_number_old UInt32, - line_number_new UInt32, - hunk_num UInt32, - hunk_start_line_number_old UInt32, - hunk_start_line_number_new UInt32, - hunk_lines_added UInt32, - hunk_lines_deleted UInt32, - hunk_context LowCardinality(String), - line LowCardinality(String), - indent UInt8, - line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), - - prev_commit_hash String, - prev_author LowCardinality(String), - prev_time DateTime, - - file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), - path LowCardinality(String), - old_path LowCardinality(String), - file_extension LowCardinality(String), - file_lines_added UInt32, - file_lines_deleted UInt32, - file_hunks_added UInt32, - file_hunks_removed UInt32, - file_hunks_changed UInt32, - - commit_hash String, - author LowCardinality(String), - time DateTime, - commit_message String, - commit_files_added UInt32, - commit_files_deleted UInt32, - commit_files_renamed UInt32, - commit_files_modified UInt32, - commit_lines_added UInt32, - commit_lines_deleted UInt32, - commit_hunks_added UInt32, - commit_hunks_removed UInt32, - commit_hunks_changed UInt32 -) ENGINE = MergeTree ORDER BY time; - -Run the tool. - -Then insert the data with the following commands: - -clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv -clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv -clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv - - -Usage: clickhouse git-import -Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple - times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number - of added + removed lines) is larger - than specified threshold. Does not - apply for initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn - - -Example: - -clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' - -clickhouse-keeper - -usage: -clickhouse-keeper [OPTION] [-- [ARG]...] -positional arguments can be used to rewrite config.xml properties, for -example, --http_port=8010 - --h, --help show help and exit --V, --version show version and exit --force-recovery, --force-recovery Force recovery mode allowing Keeper to - overwrite cluster configuration without - quorum --C, --config-file= load configuration from a given file --L, --log-file= use given log file --E, --errorlog-file= use given log file for errors only --P, --pid-file= use given pidfile ---daemon Run application as a daemon. ---umask=mask Set the daemon's umask (octal, e.g. 027). ---pidfile=path Write the process ID of the application to - given file. - -clickhouse-keeper-converter - -Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots -Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot - - -clickhouse-static-files-disk-uploader - -Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via - PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode - - -clickhouse-su - -Usage: clickhouse su user:group ... - -clickhouse-disks - -ClickHouse disk management tool -usage clickhouse disks [OPTION] -clickhouse-disks - -read read File `from_path` to `to_path` or to stdout -Path should be in format './' or './path' or 'path' - -write Write File `from_path` or stdin to `to_path` - -link Create hardlink from `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -mkdir Create directory or directories recursively - -remove Remove file or directory with all children. Throws exception if file doesn't exists. -Path should be in format './' or './path' or 'path' - -move Move file or directory from `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -copy Recursively copy data containing at `from_path` to `to_path` -Path should be in format './' or './path' or 'path' - -list List files (the default disk is used by default) -Path should be in format './' or './path' or 'path' - -list-disks List disks names - -clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level - diff --git a/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.reference b/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.reference new file mode 100644 index 00000000000..48da58b4956 --- /dev/null +++ b/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.reference @@ -0,0 +1,514 @@ +================BINARY========================== + +clickhouse --help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse server + +usage: +clickhouse server [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse copier + +usage: clickhouse copier --config-file --task-path +Copies tables from one cluster to another + +-C, --config-file= + load + configuration + from + a + given + file +-L, --log-file= + use + given + log + file +-E, --errorlog-file= + use + given + log + file + for + errors + only +-P, --pid-file= + use + given + pidfile +--daemon + Run + application + as + a + daemon. +--umask=mask + Set + the + daemon's + umask + (octal, + e.g. + 027). +--pidfile=path + Write + the + process + ID + of + the + application + to + given + file. +--task-path=task-path + path + to + task + in + ZooKeeper +--task-file=task-file + path + to + task + file + for + uploading + in + ZooKeeper + to + task-path +--task-upload-force=task-upload-force + Force + upload + task-file + even + node + already + exists +--safe-mode + disables + ALTER + DROP + PARTITION + in + case + of + errors +--copy-fault-probability=copy-fault-probability + the + copying + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--move-fault-probability=move-fault-probability + the + moving + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--log-level=log-level + sets + log + level +--base-dir=base-dir + base + directory + for + copiers, + consecutive + copier + launches + will + populate + /base-dir/launch_id/* + directories +--experimental-use-sample-offset=experimental-use-sample-offset + Use + SAMPLE + OFFSET + query + instead + of + cityHash64(PRIMARY + KEY) + % + n + == + k +--status + Get + for + status + for + current + execution +--max-table-tries=max-table-tries + Number + of + tries + for + the + copy + table + task +--max-shard-partition-tries=max-shard-partition-tries + Number + of + tries + for + the + copy + one + partition + task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter + Number + of + tries + for + final + ALTER + ATTACH + to + destination + table +--retry-delay-ms=retry-delay-ms + Delay + between + task + retries +--help + produce + this + help + message + +clickhouse keeper + +usage: +clickhouse keeper [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-force-recovery, --force-recovery Force recovery mode allowing Keeper to + overwrite cluster configuration without + quorum +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. +================SYMLINK============================== + +clickhouse-server + +usage: +clickhouse-server [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. + +clickhouse-copier + +usage: clickhouse-copier --config-file --task-path +Copies tables from one cluster to another + +-C, --config-file= + load + configuration + from + a + given + file +-L, --log-file= + use + given + log + file +-E, --errorlog-file= + use + given + log + file + for + errors + only +-P, --pid-file= + use + given + pidfile +--daemon + Run + application + as + a + daemon. +--umask=mask + Set + the + daemon's + umask + (octal, + e.g. + 027). +--pidfile=path + Write + the + process + ID + of + the + application + to + given + file. +--task-path=task-path + path + to + task + in + ZooKeeper +--task-file=task-file + path + to + task + file + for + uploading + in + ZooKeeper + to + task-path +--task-upload-force=task-upload-force + Force + upload + task-file + even + node + already + exists +--safe-mode + disables + ALTER + DROP + PARTITION + in + case + of + errors +--copy-fault-probability=copy-fault-probability + the + copying + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--move-fault-probability=move-fault-probability + the + moving + fails + with + specified + probability + (used + to + test + partition + state + recovering) +--log-level=log-level + sets + log + level +--base-dir=base-dir + base + directory + for + copiers, + consecutive + copier + launches + will + populate + /base-dir/launch_id/* + directories +--experimental-use-sample-offset=experimental-use-sample-offset + Use + SAMPLE + OFFSET + query + instead + of + cityHash64(PRIMARY + KEY) + % + n + == + k +--status + Get + for + status + for + current + execution +--max-table-tries=max-table-tries + Number + of + tries + for + the + copy + table + task +--max-shard-partition-tries=max-shard-partition-tries + Number + of + tries + for + the + copy + one + partition + task +--max-shard-partition-piece-tries-for-alter=max-shard-partition-piece-tries-for-alter + Number + of + tries + for + final + ALTER + ATTACH + to + destination + table +--retry-delay-ms=retry-delay-ms + Delay + between + task + retries +--help + produce + this + help + message + +clickhouse-keeper + +usage: +clickhouse-keeper [OPTION] [-- [ARG]...] +positional arguments can be used to rewrite config.xml properties, for +example, --http_port=8010 + +-h, --help show help and exit +-V, --version show version and exit +-force-recovery, --force-recovery Force recovery mode allowing Keeper to + overwrite cluster configuration without + quorum +-C, --config-file= load configuration from a given file +-L, --log-file= use given log file +-E, --errorlog-file= use given log file for errors only +-P, --pid-file= use given pidfile +--daemon Run application as a daemon. +--umask=mask Set the daemon's umask (octal, e.g. 027). +--pidfile=path Write the process ID of the application to + given file. diff --git a/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.sh b/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.sh new file mode 100755 index 00000000000..95e29ecfb9b --- /dev/null +++ b/tests/queries/0_stateless/02598_clickhouse_help_help_formatter.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# Tags: no-parallel + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + + +# We have to use fixed terminal width. It may break other tests results formatting. +# In CI there is no tty and we just ignore failed stty calls. +# Set 80 to have same as default size as in notty. +backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) +stty columns 78 2>/dev/null ||: + +echo "================BINARY==========================" + +echo -e "\nclickhouse --help\n" +$CLICKHOUSE_BINARY --help +echo -e "\nclickhouse help\n" +$CLICKHOUSE_BINARY help + +echo -e "\nclickhouse server\n" +$CLICKHOUSE_BINARY server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e "\nclickhouse copier\n" +$CLICKHOUSE_BINARY copier --help +echo -e "\nclickhouse keeper\n" +$CLICKHOUSE_BINARY keeper --help + +echo "================SYMLINK==============================" + +echo -e "\nclickhouse-server\n" +${CLICKHOUSE_BINARY}-server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e "\nclickhouse-copier\n" +${CLICKHOUSE_BINARY}-copier --help +echo -e "\nclickhouse-keeper\n" +${CLICKHOUSE_BINARY}-keeper --help + +stty columns $backup_stty_size 2>/dev/null ||: diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference new file mode 100644 index 00000000000..cf9d4b4a572 --- /dev/null +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference @@ -0,0 +1,1077 @@ +================BINARY========================== + +clickhouse --help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse help + +Use one of the following commands: +clickhouse local [args] +clickhouse client [args] +clickhouse benchmark [args] +clickhouse server [args] +clickhouse extract-from-config [args] +clickhouse compressor [args] +clickhouse format [args] +clickhouse copier [args] +clickhouse obfuscator [args] +clickhouse git-import [args] +clickhouse keeper [args] +clickhouse keeper-converter [args] +clickhouse install [args] +clickhouse start [args] +clickhouse stop [args] +clickhouse status [args] +clickhouse restart [args] +clickhouse static-files-disk-uploader [args] +clickhouse su [args] +clickhouse hash-binary [args] +clickhouse disks [args] +clickhouse help [args] + +clickhouse benchmark + +Usage: clickhouse benchmark [options] < queries.txt +Usage: clickhouse benchmark [options] --query "query text" +clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. + +clickhouse client + +Usage: clickhouse client [initial table definition] [--query ] +clickhouse-client is a client application that is used to connect to ClickHouse. +It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. +'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. + +This one will try connect to tcp native port(9000) without encryption: + clickhouse client --host clickhouse.example.com --password mysecretpassword +To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . + clickhouse client --secure --host clickhouse.example.com --password mysecretpassword + + +clickhouse local + +Usage: clickhouse local [initial table definition] [--query ] +clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. + +It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. + +To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: + CREATE TABLE
() ENGINE = File(, ); +Or through corresponding command line parameters --table --structure --input-format and --file. + +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. + +clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. + +Example reading file from S3, converting format and writing to a file: +clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" + +clickhouse compressor + +Usage: clickhouse compressor [options] < INPUT > OUTPUT +Alternative usage: clickhouse compressor [options] INPUT OUTPUT +Allowed options: + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) + --offset-in-decompressed-block arg (=0) + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data + + +clickhouse disks + +ClickHouse disk management tool +usage clickhouse disks [OPTION] +clickhouse-disks + +read read File `from_path` to `to_path` or to stdout +Path should be in format './' or './path' or 'path' + +write Write File `from_path` or stdin to `to_path` + +link Create hardlink from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +mkdir Create directory or directories recursively + +remove Remove file or directory with all children. Throws exception if file doesn't exists. +Path should be in format './' or './path' or 'path' + +move Move file or directory from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +copy Recursively copy data containing at `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +list List files (the default disk is used by default) +Path should be in format './' or './path' or 'path' + +list-disks List disks names + +clickhouse-disks: + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level + + +clickhouse extract + +Preprocess config file and extract value of the given key. + +Usage: clickhouse extract-from-config [options] + +Allowed options: + --help produce this help message + --stacktrace print stack traces of exceptions + --process-zk-includes if there are from_zk elements in config, connect to + ZooKeeper and process them + --try Do not warn about missing keys + --log-level arg (=error) log level + -c [ --config-file ] arg path to config file + -k [ --key ] arg key to get value for + + +clickhouse format + +Usage: clickhouse format [options] < query +Allowed options: + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query + --allow_settings_after_format_in_insert + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). + + +clickhouse git-import + + +A tool to extract information from Git repository for analytics. + +It dumps the data for the following tables: +- commits - commits with statistics; +- file_changes - files changed in every commit with the info about the change and statistics; +- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. + +The largest and the most important table is "line_changes". + +Allows to answer questions like: +- list files with maximum number of authors; +- show me the oldest lines of code in the repository; +- show me the files with longest history; +- list favorite files for author; +- list largest files with lowest number of authors; +- at what weekday the code has highest chance to stay in repository; +- the distribution of code age across repository; +- files sorted by average code age; +- quickly show file with blame info (rough); +- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; +- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; +- list files with most modifications; +- list files that were rewritten most number of time or by most of authors; +- what is percentage of code removal by other authors, across authors; +- the matrix of authors that shows what authors tends to rewrite another authors code; +- what is the worst time to write code in sense that the code has highest chance to be rewritten; +- the average time before code will be rewritten and the median (half-life of code decay); +- comments/code percentage change in time / by author / by location; +- who tend to write more tests / cpp code / comments. + +The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. + +The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. + +Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). + +The tool can process large enough repositories in a reasonable time. +It has been tested on: +- ClickHouse: 31 seconds; 3 million rows; +- LLVM: 8 minutes; 62 million rows; +- Linux - 12 minutes; 85 million rows; +- Chromium - 67 minutes; 343 million rows; +(the numbers as of Sep 2020) + + +Prepare the database by executing the following queries: + +DROP DATABASE IF EXISTS git; +CREATE DATABASE git; + +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.file_changes +( + change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.line_changes +( + sign Int8, + line_number_old UInt32, + line_number_new UInt32, + hunk_num UInt32, + hunk_start_line_number_old UInt32, + hunk_start_line_number_new UInt32, + hunk_lines_added UInt32, + hunk_lines_deleted UInt32, + hunk_context LowCardinality(String), + line LowCardinality(String), + indent UInt8, + line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), + + prev_commit_hash String, + prev_author LowCardinality(String), + prev_time DateTime, + + file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + file_lines_added UInt32, + file_lines_deleted UInt32, + file_hunks_added UInt32, + file_hunks_removed UInt32, + file_hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +Run the tool. + +Then insert the data with the following commands: + +clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv +clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv +clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv + + +Usage: clickhouse git-import +Allowed options: + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn + + +Example: + +clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' + +clickhouse install + +Usage: sudo clickhouse install [options] + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) where to install binaries + --config-path arg (=etc/clickhouse-server) + where to install configs + --log-path arg (=var/log/clickhouse-server) + where to create log directory + --data-path arg (=var/lib/clickhouse) directory for data + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + + +clickhouse keeper-converter + +Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Allowed options: + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper + snapshot + + +clickhouse obfuscator + + +Simple tool for table data obfuscation. + +It reads input table and produces output table, that retain some properties of input, but contains different data. +It allows to publish almost real production data for usage in benchmarks. + +It is designed to retain the following properties of data: +- cardinalities of values (number of distinct values) for every column and for every tuple of columns; +- conditional cardinalities: number of distinct values of one column under condition on value of another column; +- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; +- probability distributions of length of strings; +- probability of zero values of numbers; empty strings and arrays, NULLs; +- data compression ratio when compressed with LZ77 and entropy family of codecs; +- continuity (magnitude of difference) of time values across table; continuity of floating point values. +- date component of DateTime values; +- UTF-8 validity of string values; +- string values continue to look somewhat natural. + +Most of the properties above are viable for performance testing: +- reading data, filtering, aggregation and sorting will work at almost the same speed + as on original data due to saved cardinalities, magnitudes, compression ratios, etc. + +It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. +Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. + +It use some cryptographic primitives to transform data, but from the cryptographic point of view, + it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. + +It may retain some data you don't want to publish. + +It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. +For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. +So, the user will be able to count exact ratio of mobile traffic. + +Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. +If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, + it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. +And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. + +This tool works fine only with reasonable amount of data (at least 1000s of rows). + + +Usage: clickhouse obfuscator [options] < in > out + +Input must be seekable file (it will be read twice). + +Options: + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model + + +Example: + clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + +clickhouse static + +Allowed options: + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode + + +clickhouse start + +Usage: sudo clickhouse start + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary + --config-path arg (=etc/clickhouse-server) + directory with configs + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable + + +clickhouse stop + +Usage: sudo clickhouse stop + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --force Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server to finish after sending TERM + (with 1 second delay) + + +clickhouse status + +Usage: sudo clickhouse status + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + + +clickhouse restart + +Usage: sudo clickhouse restart + -h [ --help ] produce help message + --prefix arg (=/) prefix for all paths + --binary-path arg (=usr/bin) directory with binary + --config-path arg (=etc/clickhouse-server) + directory with configs + --pid-path arg (=var/run/clickhouse-server) + directory for pid file + --user arg (=clickhouse) clickhouse user + --group arg (=clickhouse) clickhouse group + --force arg (=0) Stop with KILL signal instead of TERM + --do-not-kill Do not send KILL even if TERM did not + help + --max-tries arg (=60) Max number of tries for waiting the + server (with 1 second delay) + --no-sudo Use clickhouse su if sudo is + unavailable + + +clickhouse su + +Usage: clickhouse su user:group ... + +clickhouse hash + +Usage: clickhouse hash +Prints hash of clickhouse binary. + -h, --help Prints this message +Result is intentionally without newline. So you can run: +objcopy --add-section .clickhouse.hash=<(./clickhouse hash-binary) clickhouse. + +================SYMLINK============================== + +clickhouse-local + +Usage: clickhouse local [initial table definition] [--query ] +clickhouse-local allows to execute SQL queries on your data files without running clickhouse-server. + +It can run as command line tool that does single action or as interactive client. For interactive experience you can just run 'clickhouse local' or add --interactive argument to your command. It will set up tables, run queries and pass control as if it is clickhouse-client. Then you can execute your SQL queries in usual manner. Non-interactive mode requires query as an argument and exits when queries finish. Multiple SQL queries can be passed as --query argument. + +To configure initial environment two ways are supported: queries or command line parameters. Either just in first query like this: + CREATE TABLE
() ENGINE = File(, ); +Or through corresponding command line parameters --table --structure --input-format and --file. + +clickhouse-local supports all features and engines of ClickHouse. You can query data from remote engines and store results locally or other way around. For table engines that actually store data on a disk like Log and MergeTree clickhouse-local puts data to temporary directory that is not reused between runs. + +clickhouse-local can be used to query data from stopped clickhouse-server installation with --path to local directory with data. + +Example reading file from S3, converting format and writing to a file: +clickhouse-local --query "SELECT c1 as version, c2 as date FROM url('https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv') INTO OUTFILE '/tmp/versions.json'" + +clickhouse-client + +Usage: clickhouse client [initial table definition] [--query ] +clickhouse-client is a client application that is used to connect to ClickHouse. +It can run queries as command line tool if you pass queries as an argument or as interactive client. Queries can run one at a time, or in in a multiquery mode with --multiquery option. To change settings you may use 'SET' statements and SETTINGS clause in queries or set is for a session with corresponding clickhouse-client arguments. +'clickhouse client' command will try connect to clickhouse-server running on the same server. If you have credentials set up pass them with --user --password or with --ask-password argument that will open command prompt. + +This one will try connect to tcp native port(9000) without encryption: + clickhouse client --host clickhouse.example.com --password mysecretpassword +To connect to secure endpoint just set --secure argument. If you have artered port set it with --port . + clickhouse client --secure --host clickhouse.example.com --password mysecretpassword + + +clickhouse-benchmark + +Usage: clickhouse benchmark [options] < queries.txt +Usage: clickhouse benchmark [options] --query "query text" +clickhouse-benchmark connects to ClickHouse server, repeatedly sends specified queries and produces reports query statistics. + +clickhouse-extract + +Preprocess config file and extract value of the given key. + +Usage: clickhouse extract-from-config [options] + +Allowed options: + --help produce this help message + --stacktrace print stack traces of exceptions + --process-zk-includes if there are from_zk elements in config, connect to + ZooKeeper and process them + --try Do not warn about missing keys + --log-level arg (=error) log level + -c [ --config-file ] arg path to config file + -k [ --key ] arg key to get value for + + +clickhouse-compressor + +Usage: clickhouse compressor [options] < INPUT > OUTPUT +Alternative usage: clickhouse compressor [options] INPUT OUTPUT +Allowed options: + -h [ --help ] produce help message + --input INPUT input file + --output OUTPUT output file + -d [ --decompress ] decompress + --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. + physical file offset) + --offset-in-decompressed-block arg (=0) + offset to the decompressed block (i.e. + virtual offset) + -b [ --block-size ] arg (=1048576) compress in blocks of specified size + --hc use LZ4HC instead of LZ4 + --zstd use ZSTD instead of LZ4 + --deflate_qpl use deflate_qpl instead of LZ4 + --codec arg use codecs combination instead of LZ4 + --level arg compression level for codecs specified + via flags + --none use no compression instead of LZ4 + --stat print block statistics of compressed + data + + +clickhouse-format + +Usage: clickhouse format [options] < query +Allowed options: + --query arg query to format + -h [ --help ] produce help message + --hilite add syntax highlight with ANSI terminal + escape sequences + --oneline format in single line + -q [ --quiet ] just check syntax, no output on success + -n [ --multiquery ] allow multiple queries in the same file + --obfuscate obfuscate instead of formatting + --backslash add a backslash at the end of each line + of the formatted query + --allow_settings_after_format_in_insert + Allow SETTINGS after FORMAT, but note, + that this is not always safe + --seed arg seed (arbitrary string) that determines + the result of obfuscation + --max_query_size arg Which part of the query can be read + into RAM for parsing (the remaining + data for INSERT, if any, is read later) + --max_parser_depth arg Maximum parser depth (recursion depth + of recursive descend parser). + + +clickhouse-obfuscator + + +Simple tool for table data obfuscation. + +It reads input table and produces output table, that retain some properties of input, but contains different data. +It allows to publish almost real production data for usage in benchmarks. + +It is designed to retain the following properties of data: +- cardinalities of values (number of distinct values) for every column and for every tuple of columns; +- conditional cardinalities: number of distinct values of one column under condition on value of another column; +- probability distributions of absolute value of integers; sign of signed integers; exponent and sign for floats; +- probability distributions of length of strings; +- probability of zero values of numbers; empty strings and arrays, NULLs; +- data compression ratio when compressed with LZ77 and entropy family of codecs; +- continuity (magnitude of difference) of time values across table; continuity of floating point values. +- date component of DateTime values; +- UTF-8 validity of string values; +- string values continue to look somewhat natural. + +Most of the properties above are viable for performance testing: +- reading data, filtering, aggregation and sorting will work at almost the same speed + as on original data due to saved cardinalities, magnitudes, compression ratios, etc. + +It works in deterministic fashion: you define a seed value and transform is totally determined by input data and by seed. +Some transforms are one to one and could be reversed, so you need to have large enough seed and keep it in secret. + +It use some cryptographic primitives to transform data, but from the cryptographic point of view, + it doesn't do anything properly and you should never consider the result as secure, unless you have other reasons for it. + +It may retain some data you don't want to publish. + +It always leave numbers 0, 1, -1 as is. Also it leaves dates, lengths of arrays and null flags exactly as in source data. +For example, you have a column IsMobile in your table with values 0 and 1. In transformed data, it will have the same value. +So, the user will be able to count exact ratio of mobile traffic. + +Another example, suppose you have some private data in your table, like user email and you don't want to publish any single email address. +If your table is large enough and contain multiple different emails and there is no email that have very high frequency than all others, + it will perfectly anonymize all data. But if you have small amount of different values in a column, it can possibly reproduce some of them. +And you should take care and look at exact algorithm, how this tool works, and probably fine tune some of it command line parameters. + +This tool works fine only with reasonable amount of data (at least 1000s of rows). + + +Usage: clickhouse obfuscator [options] < in > out + +Input must be seekable file (it will be read twice). + +Options: + --help produce help message + -S [ --structure ] arg structure of the initial table (list of + column and type names) + --input-format arg input format of the initial table data + --output-format arg default output format + --seed arg seed (arbitrary string), must be random + string with at least 10 bytes length; + note that a seed for each column is + derived from this seed and a column + name: you can obfuscate data for + different tables and as long as you use + identical seed and identical column + names, the data for corresponding + non-text columns for different tables + will be transformed in the same way, so + the data for different tables can be + JOINed after obfuscation + --limit arg if specified - stop after generating + that number of rows; the limit can be + also greater than the number of source + dataset - in this case it will process + the dataset in a loop more than one + time, using different seeds on every + iteration, generating result as large + as needed + --silent arg (=0) don't print information messages to + stderr + --save arg save the models after training to the + specified file. You can use --limit 0 + to skip the generation step. The file + is using binary, platform-dependent, + opaque serialization format. The model + parameters are saved, while the seed is + not. + --load arg load the models instead of training + from the specified file. The table + structure must match the saved file. + The seed should be specified + separately, while other model + parameters are loaded. + --order arg (=5) order of markov model to generate + strings + --frequency-cutoff arg (=5) frequency cutoff for markov model: + remove all buckets with count less than + specified + --num-buckets-cutoff arg (=0) cutoff for number of different possible + continuations for a context: remove all + histograms with less than specified + number of buckets + --frequency-add arg (=0) add a constant to every count to lower + probability distribution skew + --frequency-desaturate arg (=0) 0..1 - move every frequency towards + average to lower probability + distribution skew + --determinator-sliding-window-size arg (=8) + size of a sliding window in a source + string - its hash is used as a seed for + RNG in markov model + + +Example: + clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv + +clickhouse-git-import + + +A tool to extract information from Git repository for analytics. + +It dumps the data for the following tables: +- commits - commits with statistics; +- file_changes - files changed in every commit with the info about the change and statistics; +- line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. + +The largest and the most important table is "line_changes". + +Allows to answer questions like: +- list files with maximum number of authors; +- show me the oldest lines of code in the repository; +- show me the files with longest history; +- list favorite files for author; +- list largest files with lowest number of authors; +- at what weekday the code has highest chance to stay in repository; +- the distribution of code age across repository; +- files sorted by average code age; +- quickly show file with blame info (rough); +- commits and lines of code distribution by time; by weekday, by author; for specific subdirectories; +- show history for every subdirectory, file, line of file, the number of changes (lines and commits) across time; how the number of contributors was changed across time; +- list files with most modifications; +- list files that were rewritten most number of time or by most of authors; +- what is percentage of code removal by other authors, across authors; +- the matrix of authors that shows what authors tends to rewrite another authors code; +- what is the worst time to write code in sense that the code has highest chance to be rewritten; +- the average time before code will be rewritten and the median (half-life of code decay); +- comments/code percentage change in time / by author / by location; +- who tend to write more tests / cpp code / comments. + +The data is intended for analytical purposes. It can be imprecise by many reasons but it should be good enough for its purpose. + +The data is not intended to provide any conclusions for managers, it is especially counter-indicative for any kinds of "performance review". Instead you can spend multiple days looking at various interesting statistics. + +Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare). + +The tool can process large enough repositories in a reasonable time. +It has been tested on: +- ClickHouse: 31 seconds; 3 million rows; +- LLVM: 8 minutes; 62 million rows; +- Linux - 12 minutes; 85 million rows; +- Chromium - 67 minutes; 343 million rows; +(the numbers as of Sep 2020) + + +Prepare the database by executing the following queries: + +DROP DATABASE IF EXISTS git; +CREATE DATABASE git; + +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.file_changes +( + change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.line_changes +( + sign Int8, + line_number_old UInt32, + line_number_new UInt32, + hunk_num UInt32, + hunk_start_line_number_old UInt32, + hunk_start_line_number_new UInt32, + hunk_lines_added UInt32, + hunk_lines_deleted UInt32, + hunk_context LowCardinality(String), + line LowCardinality(String), + indent UInt8, + line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), + + prev_commit_hash String, + prev_author LowCardinality(String), + prev_time DateTime, + + file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + file_lines_added UInt32, + file_lines_deleted UInt32, + file_hunks_added UInt32, + file_hunks_removed UInt32, + file_hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +Run the tool. + +Then insert the data with the following commands: + +clickhouse-client --query "INSERT INTO git.commits FORMAT TSV" < commits.tsv +clickhouse-client --query "INSERT INTO git.file_changes FORMAT TSV" < file_changes.tsv +clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_changes.tsv + + +Usage: clickhouse git-import +Allowed options: + -h [ --help ] produce help message + --skip-commits-without-parents arg (=1) + Skip commits without parents (except + the initial commit). These commits are + usually erroneous but they can make + sense in very rare cases. + --skip-commits-with-duplicate-diffs arg (=1) + Skip commits with duplicate diffs. + These commits are usually results of + cherry-pick or merge after rebase. + --skip-commit arg Skip commit with specified hash. The + option can be specified multiple times. + --skip-paths arg Skip paths that matches regular + expression (re2 syntax). + --skip-commits-with-messages arg Skip commits whose messages matches + regular expression (re2 syntax). + --diff-size-limit arg (=100000) Skip commits whose diff size (number of + added + removed lines) is larger than + specified threshold. Does not apply for + initial commit. + --stop-after-commit arg Stop processing after specified commit + hash. + --threads arg (=8) Number of concurrent git subprocesses + to spawn + + +Example: + +clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' + +clickhouse-keeper-converter + +Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots +Allowed options: + -h [ --help ] produce help message + --zookeeper-logs-dir arg Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots + --output-dir arg Directory to place output clickhouse-keeper + snapshot + + +clickhouse-static-files-disk-uploader + +Allowed options: + -h [ --help ] produce help message + --metadata-path arg Metadata path (SELECT data_paths FROM system.tables + WHERE name = 'table_name' AND database = + 'database_name') + --test-mode Use test mode, which will put data on given url via PUT + --link Create symlinks instead of copying + --url arg Web server url for test mode + --output-dir arg Directory to put files in non-test mode + + +clickhouse-su + +Usage: clickhouse su user:group ... + +clickhouse-disks + +ClickHouse disk management tool +usage clickhouse disks [OPTION] +clickhouse-disks + +read read File `from_path` to `to_path` or to stdout +Path should be in format './' or './path' or 'path' + +write Write File `from_path` or stdin to `to_path` + +link Create hardlink from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +mkdir Create directory or directories recursively + +remove Remove file or directory with all children. Throws exception if file doesn't exists. +Path should be in format './' or './path' or 'path' + +move Move file or directory from `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +copy Recursively copy data containing at `from_path` to `to_path` +Path should be in format './' or './path' or 'path' + +list List files (the default disk is used by default) +Path should be in format './' or './path' or 'path' + +list-disks List disks names + +clickhouse-disks: + -h [ --help ] Print common help message + -C [ --config-file ] arg Set config file + --disk arg Set disk name + --command_name arg Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level + diff --git a/tests/queries/0_stateless/02598_clickhouse_help.sh b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh similarity index 86% rename from tests/queries/0_stateless/02598_clickhouse_help.sh rename to tests/queries/0_stateless/02598_clickhouse_help_program_options.sh index e281708f465..c2366d2e452 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh @@ -10,41 +10,42 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) -stty columns 78 2>/dev/null ||: +stty columns 80 2>/dev/null ||: echo "================BINARY==========================" echo -e "\nclickhouse --help\n" $CLICKHOUSE_BINARY --help - echo -e "\nclickhouse help\n" $CLICKHOUSE_BINARY help -echo -e "\nclickhouse local\n" -$CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\nclickhouse client\n" -$CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' + echo -e "\nclickhouse benchmark\n" $CLICKHOUSE_BINARY benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e "\nclickhouse server\n" -$CLICKHOUSE_BINARY server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' -echo -e "\nclickhouse extract\n" -$CLICKHOUSE_BINARY extract-from-config --help +echo -e "\nclickhouse client\n" +$CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e "\nclickhouse local\n" +$CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse compressor\n" $CLICKHOUSE_BINARY compressor --help +echo -e "\nclickhouse disks\n" +$CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' +echo -e "\nclickhouse extract\n" +$CLICKHOUSE_BINARY extract-from-config --help echo -e "\nclickhouse format\n" $CLICKHOUSE_BINARY format --help -echo -e "\nclickhouse copier\n" -$CLICKHOUSE_BINARY copier --help -echo -e "\nclickhouse obfuscator\n" -$CLICKHOUSE_BINARY obfuscator --help echo -e "\nclickhouse git-import\n" $CLICKHOUSE_BINARY git-import --help -echo -e "\nclickhouse keeper\n" -$CLICKHOUSE_BINARY keeper --help -echo -e "\nclickhouse keeper-converter\n" -$CLICKHOUSE_BINARY keeper-converter --help echo -e "\nclickhouse install\n" $CLICKHOUSE_BINARY install --help +echo -e "\nclickhouse keeper-converter\n" +$CLICKHOUSE_BINARY keeper-converter --help +echo -e "\nclickhouse obfuscator\n" +$CLICKHOUSE_BINARY obfuscator --help +echo -e "\nclickhouse static\n" +$CLICKHOUSE_BINARY static-files-disk-uploader --help + + + echo -e "\nclickhouse start\n" $CLICKHOUSE_BINARY start --help echo -e "\nclickhouse stop\n" @@ -53,14 +54,10 @@ echo -e "\nclickhouse status\n" $CLICKHOUSE_BINARY status --help echo -e "\nclickhouse restart\n" $CLICKHOUSE_BINARY restart --help -echo -e "\nclickhouse static\n" -$CLICKHOUSE_BINARY static-files-disk-uploader --help echo -e "\nclickhouse su\n" $CLICKHOUSE_BINARY su --help echo -e "\nclickhouse hash\n" $CLICKHOUSE_BINARY hash-binary --help | grep -v 'Current binary hash' -echo -e "\nclickhouse disks\n" -$CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo "================SYMLINK==============================" @@ -70,22 +67,16 @@ echo -e "\nclickhouse-client\n" ${CLICKHOUSE_BINARY}-client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse-benchmark\n" ${CLICKHOUSE_BINARY}-benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' -echo -e "\nclickhouse-server\n" -${CLICKHOUSE_BINARY}-server --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse-extract\n" ${CLICKHOUSE_BINARY}-extract-from-config --help echo -e "\nclickhouse-compressor\n" ${CLICKHOUSE_BINARY}-compressor --help echo -e "\nclickhouse-format\n" ${CLICKHOUSE_BINARY}-format --help -echo -e "\nclickhouse-copier\n" -${CLICKHOUSE_BINARY}-copier --help echo -e "\nclickhouse-obfuscator\n" ${CLICKHOUSE_BINARY}-obfuscator --help echo -e "\nclickhouse-git-import\n" ${CLICKHOUSE_BINARY}-git-import --help -echo -e "\nclickhouse-keeper\n" -${CLICKHOUSE_BINARY}-keeper --help echo -e "\nclickhouse-keeper-converter\n" ${CLICKHOUSE_BINARY}-keeper-converter --help echo -e "\nclickhouse-static-files-disk-uploader\n" From 363c898c12180e7667bee06b3b7cba750cfdd9da Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Mar 2023 14:56:14 -0300 Subject: [PATCH 069/535] refactor to find_first logic instead of character validation --- src/Functions/extractKeyValuePairs.cpp | 12 ++- src/Functions/keyvaluepair/src/CMakeLists.txt | 2 +- .../src/KeyValuePairExtractorBuilder.cpp | 8 +- .../src/KeyValuePairExtractorBuilder.h | 8 +- .../src/impl/state/ExtractorConfiguration.h | 8 +- .../InlineEscapingKeyStateHandler.cpp | 68 +++------------ .../escaping/InlineEscapingKeyStateHandler.h | 26 ++---- .../InlineEscapingValueStateHandler.cpp | 52 +++--------- .../InlineEscapingValueStateHandler.h | 20 +---- .../{ => strategies}/util/CharacterFinder.cpp | 15 ++-- .../state/strategies/util/CharacterFinder.h | 40 +++++++++ .../util/EscapedCharacterReader.cpp | 0 .../util/EscapedCharacterReader.h | 0 .../state/strategies/util/NeedleFactory.cpp | 57 +++++++++++++ .../state/strategies/util/NeedleFactory.h | 22 +++++ .../src/impl/state/util/CharacterFinder.h | 39 --------- .../tests/gtest_character_finder.cpp | 2 +- .../tests/gtest_escaped_sequence_reader.cpp | 2 +- ...test_inline_escaping_key_state_handler.cpp | 12 +-- ...st_inline_escaping_value_state_handler.cpp | 4 +- ...t_key_value_pairs_multiple_input.reference | 83 +++++++++++++++++++ 21 files changed, 270 insertions(+), 210 deletions(-) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies}/util/CharacterFinder.cpp (95%) create mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h rename src/Functions/keyvaluepair/src/impl/state/{ => strategies}/util/EscapedCharacterReader.cpp (100%) rename src/Functions/keyvaluepair/src/impl/state/{ => strategies}/util/EscapedCharacterReader.h (100%) create mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 6d6ccdbd724..b7942c916b4 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -73,9 +73,15 @@ auto ExtractKeyValuePairs::getExtractor(const ParsedArguments & parsed_arguments builder.withKeyValuePairDelimiter(parsed_arguments.key_value_pair_delimiter.value()); } - builder.withItemDelimiter(parsed_arguments.pair_delimiters); + if (!parsed_arguments.pair_delimiters.empty()) + { + builder.withItemDelimiter({parsed_arguments.pair_delimiters.begin(), parsed_arguments.pair_delimiters.end()}); + } - builder.withQuotingCharacters(parsed_arguments.quoting_characters); + if (!parsed_arguments.quoting_characters.empty()) + { + builder.withQuotingCharacters({parsed_arguments.quoting_characters.begin(), parsed_arguments.quoting_characters.end()}); + } return builder.build(); } @@ -143,7 +149,6 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const }; } - auto quoting_characters_str = arguments[3].column->getDataAt(0).toView(); SetArgument quoting_characters; @@ -160,7 +165,6 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const }; } - auto with_escaping_character = extractControlCharacter(arguments[4].column); bool with_escaping = with_escaping_character && with_escaping_character == '1'; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 5c892779c42..62de3bdad70 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -5,7 +5,7 @@ add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/escaping) add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/noescaping) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/util) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/util) add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 2cab9a9014e..d1efac83571 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -17,15 +17,15 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDel return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(std::unordered_set item_delimiters_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(std::vector item_delimiters_) { - item_delimiters.insert(item_delimiters_.begin(), item_delimiters_.end()); + item_delimiters = std::move(item_delimiters_); return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withQuotingCharacters(std::unordered_set quoting_characters_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withQuotingCharacters(std::vector quoting_characters_) { - quoting_characters.insert(quoting_characters_.begin(), quoting_characters_.end()); + quoting_characters = std::move(quoting_characters_); return *this; } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 12f87a0c432..47f78f40bdd 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -14,9 +14,9 @@ public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); - KeyValuePairExtractorBuilder & withItemDelimiter(std::unordered_set item_delimiters_); + KeyValuePairExtractorBuilder & withItemDelimiter(std::vector item_delimiters_); - KeyValuePairExtractorBuilder & withQuotingCharacters(std::unordered_set quoting_characters_); + KeyValuePairExtractorBuilder & withQuotingCharacters(std::vector quoting_characters_); KeyValuePairExtractorBuilder & withEscaping(); @@ -25,8 +25,8 @@ public: private: bool with_escaping = false; char key_value_pair_delimiter = ':'; - std::unordered_set item_delimiters = {' ', ',', ';'}; - std::unordered_set quoting_characters = {'"'}; + std::vector item_delimiters = {' ', ',', ';'}; + std::vector quoting_characters = {'"'}; std::shared_ptr buildWithEscaping(); diff --git a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h index 0270e695a3a..25e1b0ee951 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h +++ b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h @@ -10,14 +10,14 @@ struct ExtractorConfiguration { ExtractorConfiguration( char key_value_delimiter_, - std::unordered_set pair_delimiters_, - std::unordered_set quoting_characters_ + std::vector pair_delimiters_, + std::vector quoting_characters_ ) : key_value_delimiter(key_value_delimiter_), pair_delimiters(std::move(pair_delimiters_)), quoting_characters(std::move(quoting_characters_)) {} const char key_value_delimiter; - const std::unordered_set pair_delimiters; - const std::unordered_set quoting_characters; + const std::vector pair_delimiters; + const std::vector quoting_characters; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index 480be60723b..d5a4bf212eb 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -1,60 +1,17 @@ #include "InlineEscapingKeyStateHandler.h" -#include -#include +#include +#include +#include namespace DB { -static auto buildWaitRuntimeConfig(const ExtractorConfiguration & configuration) -{ - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] - = configuration; - - std::vector special_characters; - special_characters.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - special_characters.push_back(key_value_delimiter); - - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(special_characters)); - - return special_characters; -} - -static auto buildReadRuntimeConfig(const ExtractorConfiguration & configuration) -{ - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] - = configuration; - - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - needles.push_back(key_value_delimiter); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - - return needles; -} - -static auto buildReadEnclosedRuntimeConfig(const ExtractorConfiguration & configuration) -{ - const auto & quoting_characters = configuration.quoting_characters; - - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - - return needles; -} - InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) : extractor_configuration(std::move(configuration_)) { - auto wait_config = buildWaitRuntimeConfig(extractor_configuration); - auto read_config = buildReadRuntimeConfig(extractor_configuration); - auto read_enclosed_config = buildReadEnclosedRuntimeConfig(extractor_configuration); - runtime_configuration = RuntimeConfiguration(wait_config, read_config, read_enclosed_config); + wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); + read_needles = NeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const @@ -63,12 +20,12 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const auto & quoting_characters = extractor_configuration.quoting_characters; - while (auto character_position_opt = finder.find_first_not(file, pos, runtime_configuration.wait_configuration)) + while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; - if (quoting_characters.contains(character)) + if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { return {character_position + 1u, State::READING_ENCLOSED_KEY}; } @@ -101,7 +58,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_configuration)) + while (auto character_position_opt = finder.find_first(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -139,8 +96,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, return {next_pos, State::WAITING_VALUE}; } - // pair delimiter - else if (pair_delimiters.contains(character)) + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) { return {next_pos, State::WAITING_KEY}; } @@ -161,7 +117,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz key.clear(); - while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_enclosed_configuration)) + while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -189,7 +145,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz } } } - else if(quoting_characters.contains(character)) + else if(std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h index 1f1c0383546..c93e2d5c8a5 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h @@ -2,31 +2,14 @@ #include #include -#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" -#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" +#include +#include namespace DB { class InlineEscapingKeyStateHandler : public StateHandler { - struct RuntimeConfiguration - { - RuntimeConfiguration() = default; - - RuntimeConfiguration( - std::vector wait_configuration_, - std::vector read_configuration_, - std::vector read_enclosed_configuration_ - ) : wait_configuration(std::move(wait_configuration_)), - read_configuration(std::move(read_configuration_)), - read_enclosed_configuration(std::move(read_enclosed_configuration_)) {} - - std::vector wait_configuration; - std::vector read_configuration; - std::vector read_enclosed_configuration; - }; - public: using ElementType = std::string; @@ -42,7 +25,10 @@ public: private: ExtractorConfiguration extractor_configuration; - RuntimeConfiguration runtime_configuration; + + std::vector wait_needles; + std::vector read_needles; + std::vector read_quoted_needles; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index bd4ca441ba3..bfe266997b5 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -1,45 +1,16 @@ #include "InlineEscapingValueStateHandler.h" -#include "Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h" -#include "Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h" +#include +#include +#include namespace DB { -static auto buildReadRuntimeConfig(const ExtractorConfiguration & configuration) -{ - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] - = configuration; - - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - needles.push_back(key_value_delimiter); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - - return needles; -} - -static auto buildReadEnclosedRuntimeConfig(const ExtractorConfiguration & configuration) -{ - const auto & quoting_characters = configuration.quoting_characters; - - std::vector needles; - - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); - - return needles; -} - InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { - auto read_config = buildReadRuntimeConfig(extractor_configuration); - auto read_enclosed_config = buildReadEnclosedRuntimeConfig(extractor_configuration); - runtime_configuration = RuntimeConfiguration({}, read_config, read_enclosed_config); + read_needles = NeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const @@ -51,11 +22,11 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po { const auto current_character = file[pos]; - if (quoting_characters.contains(current_character)) + if (std::find(quoting_characters.begin(), quoting_characters.end(), current_character) != quoting_characters.end()) { return {pos + 1u, State::READING_ENCLOSED_VALUE}; } - else if (pair_delimiters.contains(current_character)) + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) { return {pos, State::READING_EMPTY_VALUE}; } @@ -86,7 +57,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_configuration)) + while (auto character_position_opt = finder.find_first(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -118,8 +89,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po { return {next_pos, State::WAITING_KEY}; } - // pair delimiter - else if (pair_delimiters.contains(character)) + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) @@ -149,7 +119,7 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s value.clear(); - while (auto character_position_opt = finder.find_first(file, pos, runtime_configuration.read_enclosed_configuration)) + while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -177,7 +147,7 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s } } } - else if(quoting_characters.contains(character)) + else if(std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index 7d607c298df..599add94848 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -11,23 +11,6 @@ namespace DB class InlineEscapingValueStateHandler : public StateHandler { - struct RuntimeConfiguration - { - RuntimeConfiguration() = default; - - RuntimeConfiguration( - std::vector wait_configuration_, - std::vector read_configuration_, - std::vector read_enclosed_configuration_ - ) : wait_configuration(std::move(wait_configuration_)), - read_configuration(std::move(read_configuration_)), - read_enclosed_configuration(std::move(read_enclosed_configuration_)) {} - - std::vector wait_configuration; - std::vector read_configuration; - std::vector read_enclosed_configuration; - }; - public: using ElementType = std::string; @@ -43,7 +26,8 @@ public: private: ExtractorConfiguration extractor_configuration; - RuntimeConfiguration runtime_configuration; + std::vector read_needles; + std::vector read_quoted_needles; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp similarity index 95% rename from src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp rename to src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp index 21cb360b551..171646ca55f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp @@ -41,13 +41,10 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha #if defined(__SSE4_2__) constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - if (num_chars >= 16) + if (num_chars > 16) throw std::runtime_error("Needle is too big"); - char c[16] = {'\0'}; - memcpy(c, needle, num_chars); - - const __m128i set = _mm_loadu_si128(reinterpret_cast(c)); + const __m128i set = _mm_loadu_si128(reinterpret_cast(needle)); for (; pos + 15 < end; pos += 16) { @@ -79,7 +76,7 @@ auto find_first_symbols_sse42(std::string_view haystack, std::string_view needle return find_first_symbols_sse42(haystack.begin(), haystack.end(), needle.begin(), needle.size()); } -std::optional CharacterFinder::find_first(std::string_view haystack, const std::vector & needles) const +std::optional CharacterFinder::find_first(std::string_view haystack, const std::vector & needles) { if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) { @@ -89,7 +86,7 @@ std::optional CharacterFinder::find_first(std::string return std::nullopt; } -std::optional CharacterFinder::find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const +std::optional CharacterFinder::find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) { if (auto position = find_first({haystack.begin() + offset, haystack.end()}, needles)) { @@ -99,7 +96,7 @@ std::optional CharacterFinder::find_first(std::string return std::nullopt; } -std::optional CharacterFinder::find_first_not(std::string_view haystack, const std::vector & needles) const +std::optional CharacterFinder::find_first_not(std::string_view haystack, const std::vector & needles) { if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) { @@ -109,7 +106,7 @@ std::optional CharacterFinder::find_first_not(std::st return std::nullopt; } -std::optional CharacterFinder::find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const +std::optional CharacterFinder::find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) { if (auto position = find_first_not({haystack.begin() + offset, haystack.end()}, needles)) { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h new file mode 100644 index 00000000000..b0d9979fc9c --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +namespace DB +{ + +class CharacterFinder +{ +public: + using Position = std::size_t; + + virtual ~CharacterFinder() = default; + + static std::optional find_first(std::string_view haystack, const std::vector & needles); + + static std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles); + + static std::optional find_first_not(std::string_view haystack, const std::vector & needles); + + static std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles); + +}; + +/* + * Maybe decorator would be better :) + * */ +class BoundsSafeCharacterFinder +{ + using Position = std::size_t; +public: + std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + + std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; +}; + +} + diff --git a/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp similarity index 100% rename from src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.cpp rename to src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp diff --git a/src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h similarity index 100% rename from src/Functions/keyvaluepair/src/impl/state/util/EscapedCharacterReader.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp new file mode 100644 index 00000000000..11eae3c37a6 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -0,0 +1,57 @@ +#include "NeedleFactory.h" +#include "EscapedCharacterReader.h" + +namespace DB +{ + +std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration & extractor_configuration) +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + std::vector needles; + + needles.reserve(16u); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + return needles; +} + +std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & extractor_configuration) +{ + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + std::vector needles; + + needles.reserve(16u); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back(key_value_delimiter); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + return needles; +} + +std::vector NeedleFactory::getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration) +{ + const auto & quoting_characters = extractor_configuration.quoting_characters; + + std::vector needles; + + needles.reserve(16u); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + + return needles; +} + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h new file mode 100644 index 00000000000..8e1e18a4ec8 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +namespace DB +{ + +/* + * Did not spend much time here, running against the clock :) + * */ +class NeedleFactory +{ + static constexpr auto NEEDLE_SIZE = 16u; +public: + static std::vector getWaitNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getReadNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration); +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h deleted file mode 100644 index 048917ca0c0..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/util/CharacterFinder.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace DB -{ - -class CharacterFinder -{ -public: - using Position = std::size_t; - - virtual ~CharacterFinder() = default; - - std::optional find_first(std::string_view haystack, const std::vector & needles) const; - - virtual std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; - - std::optional find_first_not(std::string_view haystack, const std::vector & needles) const; - - virtual std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; - -}; - -/* - * Maybe decorator would be better :) - * */ -class BoundsSafeCharacterFinder : CharacterFinder -{ -public: - std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const override; - - std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const override; -}; - -} - diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp index a7581eee2f8..8a53a6663ab 100644 --- a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include "base/find_symbols.h" diff --git a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp index bed4cfd8918..bf58c0e40d4 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 8817f8a31c9..1033743ea94 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -47,8 +47,8 @@ void test_read_enclosed(const InlineEscapingKeyStateHandler & handler, std::stri TEST(InlineEscapingKeyStateHandler, Wait) { - auto pair_delimiters = std::unordered_set{',', ' '}; - auto quoting_characters = std::unordered_set{'"'}; + auto pair_delimiters = std::vector{',', ' '}; + auto quoting_characters = std::vector{'"'}; ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); InlineEscapingKeyStateHandler handler(configuration); @@ -65,8 +65,8 @@ TEST(InlineEscapingKeyStateHandler, Read) { auto enclosing_character = '"'; - auto pair_delimiters = std::unordered_set{',', ' '}; - auto quoting_characters = std::unordered_set{enclosing_character}; + auto pair_delimiters = std::vector{',', ' '}; + auto quoting_characters = std::vector{enclosing_character}; ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); @@ -91,8 +91,8 @@ TEST(InlineEscapingKeyStateHandler, Read) TEST(InlineEscapingKeyStateHandler, ReadEnclosed) { - auto pair_delimiters = std::unordered_set{',', ' '}; - auto quoting_characters = std::unordered_set{'"'}; + auto pair_delimiters = std::vector{',', ' '}; + auto quoting_characters = std::vector{'"'}; ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); InlineEscapingKeyStateHandler handler(configuration); diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index b54c468b242..145e9cf68e1 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -14,8 +14,8 @@ void test_wait(const auto & handler, std::string_view input, std::size_t expecte TEST(InlineEscapingValueStateHandler, Wait) { - auto pair_delimiters = std::unordered_set {','}; - auto quoting_characters = std::unordered_set {'"'}; + auto pair_delimiters = std::vector {','}; + auto quoting_characters = std::vector {'"'}; ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); InlineEscapingValueStateHandler handler(configuration); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index e69de29bb2d..9061ec9ade2 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -0,0 +1,83 @@ +-- { echoOn } + +-- basic tests + +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +-- special (not control) characters in the middle of elements +-- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} +WITH + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} +-- non-standard escape characters (i.e not \n, \r, \t and etc), back-slash should be preserved +-- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} +WITH + extractKeyValuePairs('currency:\$USD, amount\z:$5\h') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'amount\\z':'$5\\h','currency':'\\$USD'} +-- standard escape sequences are covered by unit tests + +-- simple quoting +-- expected output: {'age':'31','name':'neymar','team':'psg'} +WITH + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','team':'psg'} +-- empty values +-- expected output: {'age':'','name':'','nationality':''} +WITH + extractKeyValuePairs('name:"", age: , nationality:') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'','name':'','nationality':''} +-- empty keys +-- empty keys are not allowed, thus empty output is expected +WITH + extractKeyValuePairs('"":abc, :def') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{} From 166bbae6cd76ae94a0afdfb3cdead9ec0649251f Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Mar 2023 15:13:07 -0300 Subject: [PATCH 070/535] add a few more tests --- src/Functions/extractKeyValuePairs.cpp | 8 ++++ ...t_key_value_pairs_multiple_input.reference | 39 +++++++++++++++++++ ...extract_key_value_pairs_multiple_input.sql | 39 +++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index b7942c916b4..6d8ebf1d330 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -117,6 +117,14 @@ DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes &) const ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const ColumnsWithTypeAndName & arguments) { + /* + * TODO validate arguments: + * 1. Check if argument is one of the acceptable characters for that argument + * 2. Check if it's not empty + * 3. Cross check arguments? Not sure it is needed anymore + * 4. Use uint8_t column instead of string column for escaping lol + * */ + if (arguments.empty()) { throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least one argument", name); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 9061ec9ade2..842bea71705 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -81,3 +81,42 @@ WITH SELECT x; {} +-- semi-colon as pair delimiter +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'}, last should not be not included +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,invalid:invalid', ':', ';') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','team':'psg'} +-- both comma and semi-colon as pair delimiters +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +-- single quote as quoting character +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 99f7da17910..f16a1bb6870 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -80,3 +80,42 @@ WITH ) AS x SELECT x; + +-- semi-colon as pair delimiter +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'}, last should not be not included +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,invalid:invalid', ':', ';') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- both comma and semi-colon as pair delimiters +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- single quote as quoting character +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; From 667282165326e9f61a34692f33e7e00904014d83 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Mar 2023 15:13:54 -0300 Subject: [PATCH 071/535] remove unwanted files --- .../src/impl/state/MixedKeyStateHandler.h | 209 ------------------ .../impl/state/MultiStrategyKeyStateHandler.h | 132 ----------- 2 files changed, 341 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h diff --git a/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h deleted file mode 100644 index 47e4d7863af..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/MixedKeyStateHandler.h +++ /dev/null @@ -1,209 +0,0 @@ -//#pragma once -// -//#include "StateHandler.h" -// -//#include -// -//#include "util/EscapedCharacterReader.h" -// -//namespace DB -//{ -// -//enum class EscapingStrategy -//{ -// WITH_ESCAPING, -// WITHOUT_ESCAPING -//}; -// -//template -//class MixedKeyStateHandler : public StateHandler -//{ -//public: -// using ElementType = typename std::conditional::type; -// MixedKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) -// : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} -// -// [[nodiscard]] NextState wait(std::string_view file, size_t pos) const -// { -// while (pos < file.size()) -// { -// const auto current_character = file[pos]; -// -// if (isValidCharacter(current_character)) -// { -// return {pos, State::READING_KEY}; -// } -// else if (enclosing_character && current_character == enclosing_character) -// { -// return {pos + 1u, State::READING_ENCLOSED_KEY}; -// } -// -// pos++; -// } -// -// return {pos, State::END}; -// } -// -// [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const -// { -// bool escape = false; -// -// auto start_index = pos; -// -// key = {}; -// -// while (pos < file.size()) -// { -// const auto current_character = file[pos]; -// const auto next_pos = pos + 1u; -// -// if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) -// { -// if (escape) -// { -// escape = false; -// -//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) -//// { -//// collect(key, *escaped_character); -//// pos = next_pos; -//// continue; -//// } -//// else -// { -// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) -// // or if there isn't enough characters left in the string -// return {next_pos, State::WAITING_KEY }; -// } -// } -// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) -// { -// escape = true; -// pos = next_pos; -// continue; -// } -// } -// -// if (current_character == key_value_delimiter) -// { -// finalizeElement(key, file, start_index, pos - 1); -// return {next_pos, State::WAITING_VALUE}; -// } -// else if (!isValidCharacter(current_character)) -// { -// return {next_pos, State::WAITING_KEY}; -// } -// else -// { -// collect(key, current_character); -// } -// -// pos = next_pos; -// } -// -// return {pos, State::END}; -// } -// -// [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const -// { -// key = {}; -// -// bool escape = false; -// -// auto start_index = pos; -// -// while (pos < file.size()) -// { -// const auto current_character = file[pos]; -// const auto next_pos = pos + 1u; -// -// if constexpr (EscapingStrategy::WITH_ESCAPING == ESCAPING_STRATEGY) -// { -// if (escape) -// { -// escape = false; -// -//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) -//// { -//// collect(key, *escaped_character); -//// pos = next_pos; -//// continue; -//// } -//// else -// { -// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) -// // or if there isn't enough characters left in the string -// return {next_pos, State::WAITING_KEY }; -// } -// } -// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) -// { -// escape = true; -// pos = next_pos; -// continue; -// } -// } -// -// if (*enclosing_character == current_character) -// { -// auto is_key_empty = start_index == pos; -// -// if (is_key_empty) -// { -// return {next_pos, State::WAITING_KEY}; -// } -// -// finalizeElement(key, file, start_index, pos - 1); -// -// return {next_pos, State::READING_KV_DELIMITER}; -// } -// else -// { -// collect(key, current_character); -// } -// -// pos = next_pos; -// } -// -// return {pos, State::END}; -// } -// -// [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const -// { -// if (pos == file.size()) -// { -// return {pos, State::END}; -// } -// else -// { -// const auto current_character = file[pos++]; -// return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; -// } -// } -// -//private: -// const char key_value_delimiter; -// -// void collect(ElementType & element, char character) const -// { -// if constexpr (ESCAPING_STRATEGY == EscapingStrategy::WITH_ESCAPING) -// { -// element.push_back(character); -// } -// } -// -// void finalizeElement(ElementType & element, std::string_view file, std::size_t start_index, std::size_t end_index) const -// { -// if constexpr (ESCAPING_STRATEGY != EscapingStrategy::WITH_ESCAPING) -// { -// element = createElement(file, start_index, end_index); -// } -// } -// -// static bool isValidCharacter(char character) -// { -// return std::isalnum(character) || character == '_'; -// } -//}; -// -//} diff --git a/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h deleted file mode 100644 index 39062d0b051..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/MultiStrategyKeyStateHandler.h +++ /dev/null @@ -1,132 +0,0 @@ -//#pragma once -// -//#include "StateHandler.h" -//#include -// -//namespace DB -//{ -// -//enum class EscapingStrategy2 -//{ -// WITH_ESCAPING, -// WITHOUT_ESCAPING -//}; -// -//template -//class MultiStrategyKeyStateHandler : public StateHandler -//{ -//public: -// MultiStrategyKeyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) -// : StateHandler(enclosing_character_), key_value_delimiter(key_value_delimiter_) {} -// -// [[nodiscard]] NextState wait(std::string_view file, size_t pos) const -// { -// while (pos < file.size()) -// { -// const auto current_character = file[pos]; -// -// if (isValidCharacter(current_character)) -// { -// return {pos, State::READING_KEY}; -// } -// else if (enclosing_character && current_character == enclosing_character) -// { -// return {pos + 1u, State::READING_ENCLOSED_KEY}; -// } -// -// pos++; -// } -// -// return {pos, State::END}; -// } -// -// [[nodiscard]] NextState read(std::string_view file, std::size_t pos, auto key) const -// { -// return static_cast(this)->read(file, pos, key); -// } -// -// [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, auto & key) const -// { -// return static_cast(this)->readEnclosed(file, pos, key); -// } -// -// [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const -// { -// if (pos == file.size()) -// { -// return {pos, State::END}; -// } -// else -// { -// const auto current_character = file[pos++]; -// return {pos, current_character == key_value_delimiter ? State::WAITING_VALUE : State::WAITING_KEY}; -// } -// } -// -//protected: -// const char key_value_delimiter; -// -// static bool isValidCharacter(char character) -// { -// return std::isalnum(character) || character == '_'; -// } -//}; -// -//class EscapingStrategyStateHandler : public MultiStrategyKeyStateHandler -//{ -// using ElementType = std::string; -//public: -// EscapingStrategyStateHandler(char key_value_delimiter_, std::optional enclosing_character_) -// : MultiStrategyKeyStateHandler(key_value_delimiter_, enclosing_character_) {} -// -// [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const -// { -// bool escape = false; -// -// key.clear(); -// -// while (pos < file.size()) -// { -// const auto current_character = file[pos]; -// const auto next_pos = pos + 1u; -// -// if (escape) -// { -// escape = false; -// -//// if (auto escaped_character = EscapedCharacterReader::read({file.begin() + pos, file.end()})) -//// { -//// key.push_back(*escaped_character); -//// } -//// else -// { -// // Discard in case of failures. It can fail either on converting characters into a number (\xHEX \0OCTAL) -// // or if there isn't enough characters left in the string -// return {next_pos, State::WAITING_KEY }; -// } -// } -// else if (EscapedCharacterReader::isEscapeCharacter(current_character)) -// { -// escape = true; -// } -// else if (current_character == key_value_delimiter) -// { -// return {next_pos, State::WAITING_VALUE}; -// } -// else if (!isValidCharacter(current_character)) -// { -// return {next_pos, State::WAITING_KEY}; -// } -// else -// { -// key.push_back(current_character); -// } -// -// pos = next_pos; -// } -// -// return {pos, State::END}; -// } -//}; -// -//} From b74faae9b8e46cfd776f8ee6165b16917d676205 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 14 Mar 2023 19:39:40 -0300 Subject: [PATCH 072/535] add first noescaping impl, add tests --- .../src/KeyValuePairExtractorBuilder.cpp | 2 - .../InlineEscapingKeyStateHandler.cpp | 8 +- .../InlineEscapingValueStateHandler.cpp | 4 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 99 ++++++++----- .../noescaping/NoEscapingKeyStateHandler.h | 4 +- .../NoEscapingValueStateHandler.cpp | 79 ++++++---- .../noescaping/NoEscapingValueStateHandler.h | 6 +- .../state/strategies/util/NeedleFactory.cpp | 31 +++- .../state/strategies/util/NeedleFactory.h | 8 ++ .../gtest_no_escaping_key_state_handler.cpp | 95 ++++++++++++ ...extract_key_value_pairs_multiple_input.sql | 136 +++++++++++++++++- 11 files changed, 387 insertions(+), 85 deletions(-) create mode 100644 src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index d1efac83571..2ba4a752203 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -5,8 +5,6 @@ #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "impl/CHKeyValuePairExtractor.h" #include "impl/state/ExtractorConfiguration.h" -#include "impl/state/MixedKeyStateHandler.h" -#include "impl/state/MultiStrategyKeyStateHandler.h" namespace DB { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index d5a4bf212eb..ff575c9cb16 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -9,9 +9,9 @@ namespace DB InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) : extractor_configuration(std::move(configuration_)) { - wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); - read_needles = NeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); + wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); + read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const @@ -145,7 +145,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz } } } - else if(std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + else if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index bfe266997b5..9eb7f4eea2a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -9,8 +9,8 @@ namespace DB InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { - read_needles = NeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); + read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index 2d9322e55ab..c30a2dfff2c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -1,85 +1,113 @@ #include "NoEscapingKeyStateHandler.h" +#include +#include namespace DB { NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(ExtractorConfiguration extractor_configuration_) - : StateHandler(), extractor_configuration(std::move(extractor_configuration_)) +: extractor_configuration(std::move(extractor_configuration_)) { + wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); + read_needles = NeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const { - while (pos < file.size()) + BoundsSafeCharacterFinder finder; + + const auto & quoting_characters = extractor_configuration.quoting_characters; + + while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) { - const auto current_character = file[pos]; + auto character_position = *character_position_opt; + auto character = file[character_position]; - if (isValidCharacter(current_character)) + if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { - return {pos, State::READING_KEY}; + return {character_position + 1u, State::READING_ENCLOSED_KEY}; } - else if (current_character == '"') + else { - return {pos + 1u, State::READING_ENCLOSED_KEY}; + return {character_position, State::READING_KEY}; } - - pos++; } - return {pos, State::END}; + return {file.size(), State::END}; } NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const { - auto start_index = pos; + BoundsSafeCharacterFinder finder; + + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; key = {}; - while (pos < file.size()) - { - const auto current_character = file[pos++]; + auto start_index = pos; - if (current_character == ',') + while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (character == key_value_delimiter) { - // not checking for empty key because with current waitKey implementation - // there is no way this piece of code will be reached for the very first key character - key = createElement(file, start_index, pos - 1); - return {pos, State::WAITING_VALUE}; + key = createElement(file, start_index, character_position); + + if (key.empty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::WAITING_VALUE}; } - else if (!isValidCharacter(current_character)) + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) { - return {pos, State::WAITING_KEY}; + return {next_pos, State::WAITING_KEY}; } + + pos = next_pos; } - return {pos, State::END}; + return {file.size(), State::END}; } NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const { - auto start_index = pos; + BoundsSafeCharacterFinder finder; + + const auto & quoting_characters = extractor_configuration.quoting_characters; key = {}; - while (pos < file.size()) + auto start_index = pos; + + while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) { - const auto current_character = file[pos++]; + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; - if ('"' == current_character) + if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { - auto is_key_empty = start_index == pos; + key = createElement(file, start_index, character_position); - if (is_key_empty) + if (key.empty()) { - return {pos, State::WAITING_KEY}; + return {next_pos, State::WAITING_KEY}; } - key = createElement(file, start_index, pos - 1); - return {pos, State::READING_KV_DELIMITER}; + return {next_pos, State::READING_KV_DELIMITER}; } + + pos = next_pos; } - return {pos, State::END}; + return {file.size(), State::END}; } NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const @@ -91,13 +119,8 @@ NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file else { const auto current_character = file[pos++]; - return {pos, current_character == ':' ? State::WAITING_VALUE : State::WAITING_KEY}; + return {pos, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; } } -bool NoEscapingKeyStateHandler::isValidCharacter(char character) -{ - return std::isalnum(character) || character == '_'; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h index fea1dd86202..e5dab139445 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h @@ -24,7 +24,9 @@ public: private: ExtractorConfiguration extractor_configuration; - static bool isValidCharacter(char character); + std::vector wait_needles; + std::vector read_needles; + std::vector read_quoted_needles; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index 1a70647d4e3..e2c145f4d5d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -1,38 +1,45 @@ #include "NoEscapingValueStateHandler.h" +#include +#include namespace DB { NoEscapingValueStateHandler::NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) - : StateHandler(), extractor_configuration(std::move(extractor_configuration_)) + : extractor_configuration(std::move(extractor_configuration_)) { + read_needles = NeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) const { - while (pos < file.size()) + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + if (pos < file.size()) { const auto current_character = file[pos]; - if (current_character == '"') + if (std::find(quoting_characters.begin(), quoting_characters.end(), current_character) != quoting_characters.end()) { return {pos + 1u, State::READING_ENCLOSED_VALUE}; } - else if (current_character == ',') + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) { return {pos, State::READING_EMPTY_VALUE}; } - else if (isValidCharacter(current_character)) + else if (key_value_delimiter == current_character) { - return {pos, State::READING_VALUE}; + return {pos, State::WAITING_KEY}; } else { - pos++; + return {pos, State::READING_VALUE}; } } - return {pos, State::READING_EMPTY_VALUE}; + return {file.size(), State::READING_EMPTY_VALUE}; } NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const @@ -41,21 +48,34 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E value = {}; - while (pos < file.size()) - { - const auto current_character = file[pos++]; + BoundsSafeCharacterFinder finder; - if (current_character == ',' || !isValidCharacter(current_character)) + const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + = extractor_configuration; + + while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + { + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; + + if (key_value_delimiter == character) { - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; + return {next_pos, State::WAITING_KEY}; } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) + { + value = createElement(file, start_index, character_position); + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; } // TODO: do I really need the below logic? // this allows empty values at the end - value = createElement(file, start_index, pos); - return {pos, State::FLUSH_PAIR}; + value = createElement(file, start_index, file.size()); + return {file.size(), State::FLUSH_PAIR}; } NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const @@ -63,21 +83,27 @@ NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_ auto start_index = pos; value = {}; + BoundsSafeCharacterFinder finder; - while (pos < file.size()) + const auto & quoting_characters = extractor_configuration.quoting_characters; + + while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) { - const auto current_character = file[pos++]; + auto character_position = *character_position_opt; + auto character = file[character_position]; + auto next_pos = character_position + 1u; - if ('"' == current_character) + if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) { - // not checking for empty value because with current waitValue implementation - // there is no way this piece of code will be reached for the very first value character - value = createElement(file, start_index, pos - 1); - return {pos, State::FLUSH_PAIR}; + value = createElement(file, start_index, character_position); + + return {next_pos, State::FLUSH_PAIR}; } + + pos = next_pos; } - return {pos, State::END}; + return {file.size(), State::END}; } NextState NoEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) @@ -86,9 +112,4 @@ NextState NoEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, E return {pos + 1, State::FLUSH_PAIR}; } -bool NoEscapingValueStateHandler::isValidCharacter(char character) const -{ - return std::isalnum(character) || character == '_'; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index a08d044610e..04525c1b9ab 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -12,7 +12,7 @@ class NoEscapingValueStateHandler : public StateHandler public: using ElementType = std::string_view; - NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); + explicit NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -24,8 +24,8 @@ public: private: ExtractorConfiguration extractor_configuration; - - bool isValidCharacter(char character) const; + std::vector read_needles; + std::vector read_quoted_needles; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp index 11eae3c37a6..76e11fe5e22 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -13,7 +13,6 @@ std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration needles.reserve(16u); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); needles.push_back(key_value_delimiter); std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); @@ -30,7 +29,6 @@ std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & e needles.reserve(16u); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); needles.push_back(key_value_delimiter); std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); @@ -47,11 +45,36 @@ std::vector NeedleFactory::getReadQuotedNeedles(const ExtractorConfigurati needles.reserve(16u); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); return needles; } +std::vector EscapingNeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration & extractor_configuration) +{ + auto needles = NeedleFactory::getWaitNeedles(extractor_configuration); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + return needles; +} + +std::vector EscapingNeedleFactory::getReadNeedles(const ExtractorConfiguration & extractor_configuration) +{ + auto needles = NeedleFactory::getReadNeedles(extractor_configuration); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + return needles; +} + +std::vector EscapingNeedleFactory::getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration) +{ + auto needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); + + needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + + return needles; +} + } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h index 8e1e18a4ec8..1a578fb7f13 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h @@ -19,4 +19,12 @@ public: static std::vector getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration); }; +class EscapingNeedleFactory +{ +public: + static std::vector getWaitNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getReadNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration); +}; + } diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp new file mode 100644 index 00000000000..5980dc0d2cb --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -0,0 +1,95 @@ +#include +#include + +namespace DB +{ + +void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) +{ + auto next_state = handler.wait(input, 0u); + + ASSERT_EQ(next_state.position_in_string, expected_pos); + ASSERT_EQ(next_state.state, expected_state); +} + +template +void test_read(const auto & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + NextState next_state; + std::string_view element; + + if constexpr (enclosed) + { + next_state = handler.readEnclosed(input, 0u, element); + } + else + { + next_state = handler.read(input, 0u, element); + } + + ASSERT_EQ(next_state.position_in_string, expected_pos); + ASSERT_EQ(next_state.state, expected_state); + ASSERT_EQ(element, expected_element); +} + +void test_read(const auto & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + test_read(handler, input, expected_element, expected_pos, expected_state); +} + +void test_read_enclosed(const auto & handler, std::string_view input, std::string_view expected_element, + std::size_t expected_pos, State expected_state) +{ + test_read(handler, input, expected_element, expected_pos, expected_state); +} + +TEST(NoEscapingKeyStateHandler, Wait) +{ + auto pair_delimiters = std::vector{',', ' ', '$'}; + auto quoting_characters = std::vector{'"'}; + + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + NoEscapingKeyStateHandler handler(configuration); + + test_wait(handler, "name", 0u, READING_KEY); + test_wait(handler, "\\:name", 0u, READING_KEY); + // quoted expected pos is + 1 because as of now it is skipped, maybe I should change it + test_wait(handler, "\"name", 1u, READING_ENCLOSED_KEY); + + test_wait(handler, ", $name", 3u, READING_KEY); + test_wait(handler, ", $\"name", 4u, READING_ENCLOSED_KEY); + + test_wait(handler, "", 0u, END); +} + +TEST(NoEscapingKeyStateHandler, Read) +{ + auto enclosing_character = '"'; + + auto pair_delimiters = std::vector{',', ' '}; + auto quoting_characters = std::vector{enclosing_character}; + + ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + + NoEscapingKeyStateHandler handler(configuration); + + std::string key_str = "name"; + std::string key_with_delimiter_str = key_str + ':'; + std::string key_with_delimiter_and_left_spacing = " " + key_with_delimiter_str; + std::string key_with_delimiter_and_random_characters_str = key_str + ':' + "a$a\\:''\""; + + // no delimiter, should discard + test_read(handler, key_str, "", key_str.size(), END); + + // valid + test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + + // valid as well + test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + + test_read(handler, "", "", 0u, END); +} + +} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index f16a1bb6870..b9866079708 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -82,9 +82,9 @@ SELECT x; -- semi-colon as pair delimiter --- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'}, last should not be not included +-- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,invalid:invalid', ':', ';') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;invalid1:invalid1,invalid2:invalid2', ':', ';') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -119,3 +119,135 @@ WITH ) AS x SELECT x; + +-- NO ESCAPING TESTS +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- special (not control) characters in the middle of elements +-- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} +WITH + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything +-- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} +WITH + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- standard escape sequences, it should return it as it is +-- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} +WITH + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- standard escape sequences are covered by unit tests + +-- simple quoting +-- expected output: {'age':'31','name':'neymar','team':'psg'} +WITH + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- empty values +-- expected output: {'age':'','name':'','nationality':''} +WITH + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- empty keys +-- empty keys are not allowed, thus empty output is expected +WITH + extractKeyValuePairs('"":abc, :def', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- semi-colon as pair delimiter +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- both comma and semi-colon as pair delimiters +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- single quote as quoting character +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; From 17f5356178755f0285c40adc1b9faa432621a208 Mon Sep 17 00:00:00 2001 From: avogar Date: Fri, 3 Mar 2023 19:30:43 +0000 Subject: [PATCH 073/535] Improve async reading from socket --- base/poco/Net/include/Poco/Net/SocketImpl.h | 10 +- src/Client/Connection.cpp | 26 ++- src/Client/Connection.h | 13 +- src/Client/ConnectionEstablisher.cpp | 123 +++++-------- src/Client/ConnectionEstablisher.h | 69 ++++--- src/Client/ConnectionPoolWithFailover.cpp | 16 +- src/Client/ConnectionPoolWithFailover.h | 9 +- src/Client/HedgedConnections.cpp | 35 ++-- src/Client/HedgedConnections.h | 5 +- src/Client/HedgedConnectionsFactory.cpp | 56 ++++-- src/Client/HedgedConnectionsFactory.h | 12 +- src/Client/IConnections.cpp | 45 +++++ src/Client/IConnections.h | 2 + src/Client/MultiplexedConnections.cpp | 9 + src/Client/MultiplexedConnections.h | 3 + src/Client/PacketReceiver.cpp | 70 +++++++ src/Client/PacketReceiver.h | 149 ++++----------- src/Common/AsyncTaskExecutor.cpp | 132 ++++++++++++++ src/Common/AsyncTaskExecutor.h | 121 ++++++++++++ src/Common/Epoll.cpp | 4 +- src/Common/Epoll.h | 6 +- src/IO/ReadBufferFromPocoSocket.cpp | 6 +- src/IO/ReadBufferFromPocoSocket.h | 4 +- src/IO/WriteBufferFromPocoSocket.cpp | 14 +- src/IO/WriteBufferFromPocoSocket.h | 10 +- src/Processors/Sources/RemoteSource.cpp | 10 +- src/Processors/Sources/RemoteSource.h | 3 - src/QueryPipeline/RemoteQueryExecutor.cpp | 110 +++++------ src/QueryPipeline/RemoteQueryExecutor.h | 21 ++- .../RemoteQueryExecutorReadContext.cpp | 172 +++++------------- .../RemoteQueryExecutorReadContext.h | 66 ++++--- 31 files changed, 799 insertions(+), 532 deletions(-) create mode 100644 src/Client/IConnections.cpp create mode 100644 src/Client/PacketReceiver.cpp create mode 100644 src/Common/AsyncTaskExecutor.cpp create mode 100644 src/Common/AsyncTaskExecutor.h diff --git a/base/poco/Net/include/Poco/Net/SocketImpl.h b/base/poco/Net/include/Poco/Net/SocketImpl.h index e08d49be7a2..082f258fa98 100644 --- a/base/poco/Net/include/Poco/Net/SocketImpl.h +++ b/base/poco/Net/include/Poco/Net/SocketImpl.h @@ -399,9 +399,12 @@ namespace Net bool initialized() const; /// Returns true iff the underlying socket is initialized. + static void error(int code); + /// Throws an appropriate exception for the given error code. + protected: - SocketImpl(); - /// Creates a SocketImpl. + SocketImpl(); + /// Creates a SocketImpl. SocketImpl(poco_socket_t sockfd); /// Creates a SocketImpl using the given native socket. @@ -446,9 +449,6 @@ namespace Net static void error(const std::string & arg); /// Throws an appropriate exception for the last error. - static void error(int code); - /// Throws an appropriate exception for the given error code. - static void error(int code, const std::string & arg); /// Throws an appropriate exception for the given error code. diff --git a/src/Client/Connection.cpp b/src/Client/Connection.cpp index 4f7cf893328..a430028c5ad 100644 --- a/src/Client/Connection.cpp +++ b/src/Client/Connection.cpp @@ -127,7 +127,27 @@ void Connection::connect(const ConnectionTimeouts & timeouts) try { - socket->connect(*it, connection_timeout); + if (async_callback) + { + socket->connectNB(*it); + while (!socket->poll(0, Poco::Net::Socket::SELECT_READ | Poco::Net::Socket::SELECT_WRITE | Poco::Net::Socket::SELECT_ERROR)) + async_callback(socket->impl()->sockfd(), connection_timeout, AsyncEventTimeoutType::CONNECT, description, AsyncTaskExecutor::READ | AsyncTaskExecutor::WRITE | AsyncTaskExecutor::ERROR); + + if (auto err = socket->impl()->socketError()) + socket->impl()->error(err); + + socket->setBlocking(true); + +#if USE_SSL + if (static_cast(secure)) + static_cast(socket.get())->completeHandshake(); +#endif + } + else + { + socket->connect(*it, connection_timeout); + } + current_resolved_address = *it; break; } @@ -162,10 +182,10 @@ void Connection::connect(const ConnectionTimeouts & timeouts) } in = std::make_shared(*socket); - in->setAsyncCallback(std::move(async_callback)); + in->setAsyncCallback(async_callback); out = std::make_shared(*socket); - + out->setAsyncCallback(async_callback); connected = true; sendHello(); diff --git a/src/Client/Connection.h b/src/Client/Connection.h index d806c5e8b1f..b792055d2e5 100644 --- a/src/Client/Connection.h +++ b/src/Client/Connection.h @@ -10,6 +10,7 @@ #include +#include #include #include @@ -154,8 +155,11 @@ public: { async_callback = std::move(async_callback_); if (in) - in->setAsyncCallback(std::move(async_callback)); + in->setAsyncCallback(async_callback); + if (out) + out->setAsyncCallback(async_callback); } + private: String host; UInt16 port; @@ -194,7 +198,7 @@ private: std::unique_ptr socket; std::shared_ptr in; - std::shared_ptr out; + std::shared_ptr out; std::optional last_input_packet_type; String query_id; @@ -277,10 +281,11 @@ private: [[noreturn]] void throwUnexpectedPacket(UInt64 packet_type, const char * expected) const; }; +template class AsyncCallbackSetter { public: - AsyncCallbackSetter(Connection * connection_, AsyncCallback async_callback) : connection(connection_) + AsyncCallbackSetter(Conn * connection_, AsyncCallback async_callback) : connection(connection_) { connection->setAsyncCallback(std::move(async_callback)); } @@ -290,7 +295,7 @@ public: connection->setAsyncCallback({}); } private: - Connection * connection; + Conn * connection; }; } diff --git a/src/Client/ConnectionEstablisher.cpp b/src/Client/ConnectionEstablisher.cpp index 731ab7c1e91..8f481461ed0 100644 --- a/src/Client/ConnectionEstablisher.cpp +++ b/src/Client/ConnectionEstablisher.cpp @@ -111,75 +111,51 @@ ConnectionEstablisherAsync::ConnectionEstablisherAsync( const Settings * settings_, Poco::Logger * log_, const QualifiedTableName * table_to_check_) - : connection_establisher(pool_, timeouts_, settings_, log_, table_to_check_) + : AsyncTaskExecutor(std::make_unique(*this)), connection_establisher(pool_, timeouts_, settings_, log_, table_to_check_) { - epoll.add(receive_timeout.getDescriptor()); + epoll.add(timeout_descriptor.getDescriptor()); } -void ConnectionEstablisherAsync::Routine::ReadCallback::operator()(int fd, Poco::Timespan timeout, const std::string &) +void ConnectionEstablisherAsync::Task::run(AsyncCallback async_callback, ResumeCallback) { - /// Check if it's the first time and we need to add socket fd to epoll. - if (connection_establisher_async.socket_fd == -1) - { - connection_establisher_async.epoll.add(fd); - connection_establisher_async.socket_fd = fd; - } - - connection_establisher_async.receive_timeout.setRelative(timeout); - fiber = std::move(fiber).resume(); - connection_establisher_async.receive_timeout.reset(); + connection_establisher_async.reset(); + connection_establisher_async.connection_establisher.setAsyncCallback(async_callback); + connection_establisher_async.connection_establisher.run(connection_establisher_async.result, connection_establisher_async.fail_message); + connection_establisher_async.is_finished = true; } -Fiber ConnectionEstablisherAsync::Routine::operator()(Fiber && sink) +void ConnectionEstablisherAsync::processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType type, const std::string & description, uint32_t events) { - try - { - connection_establisher_async.connection_establisher.setAsyncCallback(ReadCallback{connection_establisher_async, sink}); - connection_establisher_async.connection_establisher.run(connection_establisher_async.result, connection_establisher_async.fail_message); - } - catch (const boost::context::detail::forced_unwind &) - { - /// This exception is thrown by fiber implementation in case if fiber is being deleted but hasn't exited - /// It should not be caught or it will segfault. - /// Other exceptions must be caught - throw; - } - catch (...) - { - connection_establisher_async.exception = std::current_exception(); - } - - return std::move(sink); + socket_fd = fd; + socket_description = description; + epoll.add(fd, events); + timeout_descriptor.setRelative(socket_timeout); + timeout = socket_timeout; + timeout_type = type; } -std::variant ConnectionEstablisherAsync::resume() +void ConnectionEstablisherAsync::clearAsyncEvent() { - if (!fiber_created) - { - reset(); - fiber = boost::context::fiber(std::allocator_arg_t(), fiber_stack, Routine{*this}); - fiber_created = true; - } else if (!checkReceiveTimeout()) - return result; - - fiber = std::move(fiber).resume(); - - if (exception) - std::rethrow_exception(exception); - - if (connection_establisher.isFinished()) - { - destroyFiber(); - return result; - } - - return epoll.getFileDescriptor(); + timeout_descriptor.reset(); + epoll.remove(socket_fd); } -bool ConnectionEstablisherAsync::checkReceiveTimeout() +bool ConnectionEstablisherAsync::checkBeforeTaskResume() +{ + /// If we just restarted the task, no need to check timeout. + if (restarted) + { + restarted = false; + return true; + } + + return checkTimeout(); +} + +bool ConnectionEstablisherAsync::checkTimeout() { bool is_socket_ready = false; - bool is_receive_timeout_alarmed = false; + bool is_timeout_alarmed = false; epoll_event events[2]; events[0].data.fd = events[1].data.fd = -1; @@ -188,31 +164,37 @@ bool ConnectionEstablisherAsync::checkReceiveTimeout() { if (events[i].data.fd == socket_fd) is_socket_ready = true; - if (events[i].data.fd == receive_timeout.getDescriptor()) - is_receive_timeout_alarmed = true; + if (events[i].data.fd == timeout_descriptor.getDescriptor()) + is_timeout_alarmed = true; } - if (is_receive_timeout_alarmed && !is_socket_ready) + if (is_timeout_alarmed && !is_socket_ready) { - destroyFiber(); - /// In not async case this exception would be thrown and caught in ConnectionEstablisher::run, + /// In not async case timeout exception would be thrown and caught in ConnectionEstablisher::run, /// but in async case we process timeout outside and cannot throw exception. So, we just save fail message. - fail_message = fmt::format( - "Timeout exceeded while reading from socket ({}, receive timeout {} ms)", - result.entry->getDescription(), - result.entry->getSocket()->getReceiveTimeout().totalMilliseconds()); + fail_message = getSocketTimeoutExceededMessageByTimeoutType(timeout_type, timeout, socket_description); + epoll.remove(socket_fd); + /// Restart task, so the connection process will start from the beginning in the next resume(). + restart(); + /// The result should be Null in case of timeout. resetResult(); + restarted = true; + /// Mark that current connection process is finished. + is_finished = true; return false; } return true; } -void ConnectionEstablisherAsync::cancel() +void ConnectionEstablisherAsync::afterTaskResume() { - destroyFiber(); - reset(); + if (is_finished) + { + restart(); + restarted = true; + } } void ConnectionEstablisherAsync::reset() @@ -220,6 +202,7 @@ void ConnectionEstablisherAsync::reset() resetResult(); fail_message.clear(); socket_fd = -1; + is_finished = false; } void ConnectionEstablisherAsync::resetResult() @@ -231,12 +214,6 @@ void ConnectionEstablisherAsync::resetResult() } } -void ConnectionEstablisherAsync::destroyFiber() -{ - Fiber to_destroy = std::move(fiber); - fiber_created = false; -} - #endif } diff --git a/src/Client/ConnectionEstablisher.h b/src/Client/ConnectionEstablisher.h index 495583ba7ec..335162c2454 100644 --- a/src/Client/ConnectionEstablisher.h +++ b/src/Client/ConnectionEstablisher.h @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -53,66 +54,62 @@ private: /// When read callback is called, socket and receive timeout are added in epoll /// and execution returns to the main program. /// So, you can poll this epoll file descriptor to determine when to resume. -class ConnectionEstablisherAsync +class ConnectionEstablisherAsync : public AsyncTaskExecutor { public: using TryResult = PoolWithFailoverBase::TryResult; ConnectionEstablisherAsync(IConnectionPool * pool_, - const ConnectionTimeouts * timeouts_, - const Settings * settings_, - Poco::Logger * log_, - const QualifiedTableName * table_to_check = nullptr); + const ConnectionTimeouts * timeouts_, + const Settings * settings_, + Poco::Logger * log_, + const QualifiedTableName * table_to_check_ = nullptr); - /// Resume establishing connection. If the process was not finished, - /// return file descriptor (you can add it in epoll and poll it, - /// when this fd become ready, call resume again), - /// if the process was failed or finished, return it's result, - std::variant resume(); - - /// Cancel establishing connections. Fiber will be destroyed, - /// class will be set in initial stage. - void cancel(); + /// Get file descriptor that can be added in epoll and be polled, + /// when this fd becomes ready, you call resume establishing connection. + int getFileDescriptor() { return epoll.getFileDescriptor(); } + /// Check if the process of connection establishing was finished. + /// The process is considered finished if connection is ready, + /// some exception occurred or timeout exceeded. + bool isFinished() { return is_finished; } TryResult getResult() const { return result; } const std::string & getFailMessage() const { return fail_message; } private: - /// When epoll file descriptor is ready, check if it's an expired timeout. - /// Return false if receive timeout expired and socket is not ready, return true otherwise. - bool checkReceiveTimeout(); + bool checkBeforeTaskResume() override; - struct Routine + void afterTaskResume() override; + + void processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType type, const std::string & description, uint32_t events) override; + void clearAsyncEvent() override; + + struct Task : public AsyncTask { + Task(ConnectionEstablisherAsync & connection_establisher_async_) : connection_establisher_async(connection_establisher_async_) {} + ConnectionEstablisherAsync & connection_establisher_async; - struct ReadCallback - { - ConnectionEstablisherAsync & connection_establisher_async; - Fiber & fiber; - - void operator()(int fd, Poco::Timespan timeout, const std::string &); - }; - - Fiber operator()(Fiber && sink); + void run(AsyncCallback async_callback, ResumeCallback suspend_callback) override; }; + /// When epoll file descriptor is ready, check if it's an expired timeout. + /// Return false if receive timeout expired and socket is not ready, return true otherwise. + bool checkTimeout(); + void reset(); void resetResult(); - void destroyFiber(); - ConnectionEstablisher connection_establisher; TryResult result; std::string fail_message; - Fiber fiber; - FiberStack fiber_stack; - /// We use timer descriptor for checking socket receive timeout. - TimerDescriptor receive_timeout; + TimerDescriptor timeout_descriptor; + Poco::Timespan timeout; + AsyncEventTimeoutType timeout_type; /// In read callback we add socket file descriptor and timer descriptor with receive timeout /// in epoll, so we can return epoll file descriptor outside for polling. @@ -120,10 +117,8 @@ private: int socket_fd = -1; std::string socket_description; - /// If and exception occurred in fiber resume, we save it and rethrow. - std::exception_ptr exception; - - bool fiber_created = false; + bool is_finished = false; + bool restarted = false; }; #endif diff --git a/src/Client/ConnectionPoolWithFailover.cpp b/src/Client/ConnectionPoolWithFailover.cpp index c72825a54fe..1f850a46ab6 100644 --- a/src/Client/ConnectionPoolWithFailover.cpp +++ b/src/Client/ConnectionPoolWithFailover.cpp @@ -52,7 +52,7 @@ IConnectionPool::Entry ConnectionPoolWithFailover::get(const ConnectionTimeouts TryGetEntryFunc try_get_entry = [&](NestedPool & pool, std::string & fail_message) { - return tryGetEntry(pool, timeouts, fail_message, settings); + return tryGetEntry(pool, timeouts, fail_message, settings, {}); }; size_t offset = 0; @@ -112,11 +112,12 @@ ConnectionPoolWithFailover::Status ConnectionPoolWithFailover::getStatus() const std::vector ConnectionPoolWithFailover::getMany(const ConnectionTimeouts & timeouts, const Settings * settings, - PoolMode pool_mode) + PoolMode pool_mode, + AsyncCallback async_callback) { TryGetEntryFunc try_get_entry = [&](NestedPool & pool, std::string & fail_message) { - return tryGetEntry(pool, timeouts, fail_message, settings); + return tryGetEntry(pool, timeouts, fail_message, settings, nullptr, async_callback); }; std::vector results = getManyImpl(settings, pool_mode, try_get_entry); @@ -144,11 +145,12 @@ std::vector ConnectionPoolWithFailover::g std::vector ConnectionPoolWithFailover::getManyChecked( const ConnectionTimeouts & timeouts, const Settings * settings, PoolMode pool_mode, - const QualifiedTableName & table_to_check) + const QualifiedTableName & table_to_check, + AsyncCallback async_callback) { TryGetEntryFunc try_get_entry = [&](NestedPool & pool, std::string & fail_message) { - return tryGetEntry(pool, timeouts, fail_message, settings, &table_to_check); + return tryGetEntry(pool, timeouts, fail_message, settings, &table_to_check, async_callback); }; return getManyImpl(settings, pool_mode, try_get_entry); @@ -209,9 +211,11 @@ ConnectionPoolWithFailover::tryGetEntry( const ConnectionTimeouts & timeouts, std::string & fail_message, const Settings * settings, - const QualifiedTableName * table_to_check) + const QualifiedTableName * table_to_check, + AsyncCallback async_callback) { ConnectionEstablisher connection_establisher(&pool, &timeouts, settings, log, table_to_check); + connection_establisher.setAsyncCallback(std::move(async_callback)); TryResult result; connection_establisher.run(result, fail_message); return result; diff --git a/src/Client/ConnectionPoolWithFailover.h b/src/Client/ConnectionPoolWithFailover.h index df7dd572ef3..0273ce41589 100644 --- a/src/Client/ConnectionPoolWithFailover.h +++ b/src/Client/ConnectionPoolWithFailover.h @@ -54,7 +54,8 @@ public: * Connections provide access to different replicas of one shard. */ std::vector getMany(const ConnectionTimeouts & timeouts, - const Settings * settings, PoolMode pool_mode); + const Settings * settings, PoolMode pool_mode, + AsyncCallback async_callback = {}); /// The same as getMany(), but return std::vector. std::vector getManyForTableFunction(const ConnectionTimeouts & timeouts, @@ -69,7 +70,8 @@ public: const ConnectionTimeouts & timeouts, const Settings * settings, PoolMode pool_mode, - const QualifiedTableName & table_to_check); + const QualifiedTableName & table_to_check, + AsyncCallback async_callback = {}); struct NestedPoolStatus { @@ -106,7 +108,8 @@ private: const ConnectionTimeouts & timeouts, std::string & fail_message, const Settings * settings, - const QualifiedTableName * table_to_check = nullptr); + const QualifiedTableName * table_to_check = nullptr, + AsyncCallback async_callback = {}); GetPriorityFunc makeGetPriorityFunc(const Settings * settings); diff --git a/src/Client/HedgedConnections.cpp b/src/Client/HedgedConnections.cpp index 13e4fe75b3d..8b4b3bbfabc 100644 --- a/src/Client/HedgedConnections.cpp +++ b/src/Client/HedgedConnections.cpp @@ -27,13 +27,14 @@ HedgedConnections::HedgedConnections( const ConnectionTimeouts & timeouts_, const ThrottlerPtr & throttler_, PoolMode pool_mode, - std::shared_ptr table_to_check_) + std::shared_ptr table_to_check_, + AsyncCallback async_callback) : hedged_connections_factory(pool_, &context_->getSettingsRef(), timeouts_, table_to_check_) , context(std::move(context_)) , settings(context->getSettingsRef()) , throttler(throttler_) { - std::vector connections = hedged_connections_factory.getManyConnections(pool_mode); + std::vector connections = hedged_connections_factory.getManyConnections(pool_mode, std::move(async_callback)); if (connections.empty()) return; @@ -183,7 +184,7 @@ void HedgedConnections::sendQuery( replica.connection->sendQuery(timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, {}); replica.change_replica_timeout.setRelative(timeouts.receive_data_timeout); - replica.packet_receiver->setReceiveTimeout(hedged_connections_factory.getConnectionTimeouts().receive_timeout); + replica.packet_receiver->setTimeout(hedged_connections_factory.getConnectionTimeouts().receive_timeout); }; for (auto & offset_status : offset_states) @@ -348,14 +349,14 @@ HedgedConnections::ReplicaLocation HedgedConnections::getReadyReplicaLocation(As bool HedgedConnections::resumePacketReceiver(const HedgedConnections::ReplicaLocation & location) { ReplicaState & replica_state = offset_states[location.offset].replicas[location.index]; - auto res = replica_state.packet_receiver->resume(); + replica_state.packet_receiver->resume(); - if (std::holds_alternative(res)) + if (replica_state.packet_receiver->isPacketReady()) { - last_received_packet = std::move(std::get(res)); + last_received_packet = replica_state.packet_receiver->getPacket(); return true; } - else if (std::holds_alternative(res)) + else if (replica_state.packet_receiver->isTimeoutExpired()) { const String & description = replica_state.connection->getDescription(); finishProcessReplica(replica_state, true); @@ -366,12 +367,12 @@ bool HedgedConnections::resumePacketReceiver(const HedgedConnections::ReplicaLoc ErrorCodes::SOCKET_TIMEOUT, "Timeout exceeded while reading from socket ({}, receive timeout {} ms)", description, - std::get(res).totalMilliseconds()); + replica_state.packet_receiver->getTimeout().totalMilliseconds()); } - else if (std::holds_alternative(res)) + else if (replica_state.packet_receiver->hasException()) { finishProcessReplica(replica_state, true); - std::rethrow_exception(std::get(res)); + std::rethrow_exception(replica_state.packet_receiver->getException()); } return false; @@ -387,7 +388,7 @@ int HedgedConnections::getReadyFileDescriptor(AsyncCallback async_callback) { events_count = epoll.getManyReady(1, &event, blocking); if (!events_count && async_callback) - async_callback(epoll.getFileDescriptor(), 0, epoll.getDescription()); + async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), EPOLLIN | EPOLLPRI | EPOLLERR); } return event.data.fd; } @@ -571,5 +572,17 @@ void HedgedConnections::finishProcessReplica(ReplicaState & replica, bool discon replica.connection = nullptr; } +void HedgedConnections::setAsyncCallback(AsyncCallback async_callback) +{ + for (auto & offset_status : offset_states) + { + for (auto & replica : offset_status.replicas) + { + if (replica.connection) + replica.connection->setAsyncCallback(async_callback); + } + } +} + } #endif diff --git a/src/Client/HedgedConnections.h b/src/Client/HedgedConnections.h index 45a98a14bf0..ccdc59965e2 100644 --- a/src/Client/HedgedConnections.h +++ b/src/Client/HedgedConnections.h @@ -75,7 +75,8 @@ public: const ConnectionTimeouts & timeouts_, const ThrottlerPtr & throttler, PoolMode pool_mode, - std::shared_ptr table_to_check_ = nullptr); + std::shared_ptr table_to_check_ = nullptr, + AsyncCallback async_callback = {}); void sendScalarsData(Scalars & data) override; @@ -119,6 +120,8 @@ public: void setReplicaInfo(ReplicaInfo value) override { replica_info = value; } + void setAsyncCallback(AsyncCallback async_callback) override; + private: /// If we don't receive data from replica and there is no progress in query /// execution for receive_data_timeout, we are trying to get new diff --git a/src/Client/HedgedConnectionsFactory.cpp b/src/Client/HedgedConnectionsFactory.cpp index 1179aedc285..c188bebaee0 100644 --- a/src/Client/HedgedConnectionsFactory.cpp +++ b/src/Client/HedgedConnectionsFactory.cpp @@ -30,7 +30,7 @@ HedgedConnectionsFactory::HedgedConnectionsFactory( { shuffled_pools = pool->getShuffledPools(settings); for (auto shuffled_pool : shuffled_pools) - replicas.emplace_back(ConnectionEstablisherAsync(shuffled_pool.pool, &timeouts, settings, log, table_to_check.get())); + replicas.emplace_back(std::make_unique(shuffled_pool.pool, &timeouts, settings, log, table_to_check.get())); max_tries = (settings ? size_t{settings->connections_with_failover_max_tries} : size_t{DBMS_CONNECTION_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES}); @@ -53,7 +53,7 @@ HedgedConnectionsFactory::~HedgedConnectionsFactory() pool->updateSharedError(shuffled_pools); } -std::vector HedgedConnectionsFactory::getManyConnections(PoolMode pool_mode) +std::vector HedgedConnectionsFactory::getManyConnections(PoolMode pool_mode, AsyncCallback async_callback) { size_t min_entries = (settings && settings->skip_unavailable_shards) ? 0 : 1; @@ -100,7 +100,7 @@ std::vector HedgedConnectionsFactory::getManyConnections(PoolMode while (connections.size() < max_entries) { /// Set blocking = true to avoid busy-waiting here. - auto state = waitForReadyConnectionsImpl(/*blocking = */true, connection); + auto state = waitForReadyConnectionsImpl(/*blocking = */true, connection, async_callback); if (state == State::READY) connections.push_back(connection); else if (state == State::CANNOT_CHOOSE) @@ -137,12 +137,13 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::startNewConnection(Con HedgedConnectionsFactory::State HedgedConnectionsFactory::waitForReadyConnections(Connection *& connection_out) { - return waitForReadyConnectionsImpl(false, connection_out); + AsyncCallback async_callback = {}; + return waitForReadyConnectionsImpl(false, connection_out, async_callback); } -HedgedConnectionsFactory::State HedgedConnectionsFactory::waitForReadyConnectionsImpl(bool blocking, Connection *& connection_out) +HedgedConnectionsFactory::State HedgedConnectionsFactory::waitForReadyConnectionsImpl(bool blocking, Connection *& connection_out, AsyncCallback & async_callback) { - State state = processEpollEvents(blocking, connection_out); + State state = processEpollEvents(blocking, connection_out, async_callback); if (state != State::CANNOT_CHOOSE) return state; @@ -176,7 +177,7 @@ int HedgedConnectionsFactory::getNextIndex() next_index = (next_index + 1) % shuffled_pools.size(); /// Check if we can try this replica. - if (replicas[next_index].connection_establisher.getResult().entry.isNull() + if (replicas[next_index].connection_establisher->getResult().entry.isNull() && (max_tries == 0 || shuffled_pools[next_index].error_count < max_tries)) finish = true; @@ -206,12 +207,12 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::startNewConnectionImpl return state; } -HedgedConnectionsFactory::State HedgedConnectionsFactory::processEpollEvents(bool blocking, Connection *& connection_out) +HedgedConnectionsFactory::State HedgedConnectionsFactory::processEpollEvents(bool blocking, Connection *& connection_out, AsyncCallback & async_callback) { int event_fd; while (!epoll.empty()) { - event_fd = getReadyFileDescriptor(blocking); + event_fd = getReadyFileDescriptor(blocking, async_callback); if (event_fd == -1) return State::NOT_READY; @@ -250,22 +251,37 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::processEpollEvents(boo return State::CANNOT_CHOOSE; } -int HedgedConnectionsFactory::getReadyFileDescriptor(bool blocking) +int HedgedConnectionsFactory::getReadyFileDescriptor(bool blocking, AsyncCallback & async_callback) { epoll_event event; event.data.fd = -1; - epoll.getManyReady(1, &event, blocking); + if (!blocking) + { + epoll.getManyReady(1, &event, false); + return event.data.fd; + } + + size_t events_count = 0; + while (events_count == 0) + { + events_count = epoll.getManyReady(1, &event, !static_cast(async_callback)); + if (!events_count && async_callback) + async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), EPOLLIN | EPOLLPRI | EPOLLERR); + } return event.data.fd; } HedgedConnectionsFactory::State HedgedConnectionsFactory::resumeConnectionEstablisher(int index, Connection *& connection_out) { - auto res = replicas[index].connection_establisher.resume(); + replicas[index].connection_establisher->resume(); - if (std::holds_alternative(res)) - return processFinishedConnection(index, std::get(res), connection_out); + if (replicas[index].connection_establisher->isCancelled()) + return State::CANNOT_CHOOSE; - int fd = std::get(res); + if (replicas[index].connection_establisher->isFinished()) + return processFinishedConnection(index, replicas[index].connection_establisher->getResult(), connection_out); + + int fd = replicas[index].connection_establisher->getFileDescriptor(); if (!fd_to_replica_index.contains(fd)) addNewReplicaToEpoll(index, fd); @@ -274,7 +290,7 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::resumeConnectionEstabl HedgedConnectionsFactory::State HedgedConnectionsFactory::processFinishedConnection(int index, TryResult result, Connection *& connection_out) { - const std::string & fail_message = replicas[index].connection_establisher.getFailMessage(); + const std::string & fail_message = replicas[index].connection_establisher->getFailMessage(); if (!fail_message.empty()) fail_messages += fail_message + "\n"; @@ -324,7 +340,7 @@ void HedgedConnectionsFactory::stopChoosingReplicas() { --replicas_in_process_count; epoll.remove(fd); - replicas[index].connection_establisher.cancel(); + replicas[index].connection_establisher->cancel(); } for (auto & [timeout_fd, index] : timeout_fd_to_replica_index) @@ -374,7 +390,7 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::setBestUsableReplica(C for (size_t i = 0; i != replicas.size(); ++i) { /// Don't add unusable, failed replicas and replicas that are ready or in process. - TryResult result = replicas[i].connection_establisher.getResult(); + TryResult result = replicas[i].connection_establisher->getResult(); if (!result.entry.isNull() && result.is_usable && !replicas[i].is_ready @@ -391,11 +407,11 @@ HedgedConnectionsFactory::State HedgedConnectionsFactory::setBestUsableReplica(C indexes.end(), [&](size_t lhs, size_t rhs) { - return replicas[lhs].connection_establisher.getResult().staleness < replicas[rhs].connection_establisher.getResult().staleness; + return replicas[lhs].connection_establisher->getResult().staleness < replicas[rhs].connection_establisher->getResult().staleness; }); replicas[indexes[0]].is_ready = true; - TryResult result = replicas[indexes[0]].connection_establisher.getResult(); + TryResult result = replicas[indexes[0]].connection_establisher->getResult(); connection_out = &*result.entry; return State::READY; } diff --git a/src/Client/HedgedConnectionsFactory.h b/src/Client/HedgedConnectionsFactory.h index 194e962d549..009e7e868ab 100644 --- a/src/Client/HedgedConnectionsFactory.h +++ b/src/Client/HedgedConnectionsFactory.h @@ -36,11 +36,11 @@ public: struct ReplicaStatus { - explicit ReplicaStatus(ConnectionEstablisherAsync connection_stablisher_) : connection_establisher(std::move(connection_stablisher_)) + explicit ReplicaStatus(std::unique_ptr connection_stablisher_) : connection_establisher(std::move(connection_stablisher_)) { } - ConnectionEstablisherAsync connection_establisher; + std::unique_ptr connection_establisher; TimerDescriptor change_replica_timeout; bool is_ready = false; }; @@ -51,7 +51,7 @@ public: std::shared_ptr table_to_check_ = nullptr); /// Create and return active connections according to pool_mode. - std::vector getManyConnections(PoolMode pool_mode); + std::vector getManyConnections(PoolMode pool_mode, AsyncCallback async_callback = {}); /// Try to get connection to the new replica without blocking. Process all current events in epoll (connections, timeouts), /// Returned state might be READY (connection established successfully), @@ -78,7 +78,7 @@ public: ~HedgedConnectionsFactory(); private: - State waitForReadyConnectionsImpl(bool blocking, Connection *& connection_out); + State waitForReadyConnectionsImpl(bool blocking, Connection *& connection_out, AsyncCallback & async_callback); /// Try to start establishing connection to the new replica. Return /// the index of the new replica or -1 if cannot start new connection. @@ -88,7 +88,7 @@ private: /// Return -1 if there is no free replica. int getNextIndex(); - int getReadyFileDescriptor(bool blocking); + int getReadyFileDescriptor(bool blocking, AsyncCallback & async_callback); void processFailedConnection(int index, const std::string & fail_message); @@ -102,7 +102,7 @@ private: /// Return NOT_READY state if there is no ready events, READY if replica is ready /// and CANNOT_CHOOSE if there is no more events in epoll. - State processEpollEvents(bool blocking, Connection *& connection_out); + State processEpollEvents(bool blocking, Connection *& connection_out, AsyncCallback & async_callback); State setBestUsableReplica(Connection *& connection_out); diff --git a/src/Client/IConnections.cpp b/src/Client/IConnections.cpp new file mode 100644 index 00000000000..a540eb28af6 --- /dev/null +++ b/src/Client/IConnections.cpp @@ -0,0 +1,45 @@ +#include +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int SOCKET_TIMEOUT; +} + +/// This wrapper struct allows us to use Poco's socket polling code with a raw fd. +/// The only difference from Poco::Net::SocketImpl is that we don't close the fd in the destructor. +struct PocoSocketWrapper : public Poco::Net::SocketImpl +{ + explicit PocoSocketWrapper(int fd) + { + reset(fd); + } + + // Do not close fd. + ~PocoSocketWrapper() override { reset(-1); } +}; + +void IConnections::DrainCallback::operator()(int fd, Poco::Timespan, AsyncEventTimeoutType, const std::string & fd_description, uint32_t events) const +{ + uint32_t poco_events = 0; + if (events & AsyncTaskExecutor::Event::READ) + poco_events |= Poco::Net::Socket::SELECT_READ; + if (events & AsyncTaskExecutor::Event::WRITE) + poco_events |= Poco::Net::Socket::SELECT_WRITE; + if (events & AsyncTaskExecutor::Event::ERROR) + poco_events |= Poco::Net::Socket::SELECT_ERROR; + + if (!PocoSocketWrapper(fd).poll(drain_timeout, poco_events)) + { + throw Exception(ErrorCodes::SOCKET_TIMEOUT, + "Read timeout ({} ms) while draining from {}", + drain_timeout.totalMilliseconds(), + fd_description); + } +} + +} diff --git a/src/Client/IConnections.h b/src/Client/IConnections.h index 4c81617f8d6..ee17d198fc3 100644 --- a/src/Client/IConnections.h +++ b/src/Client/IConnections.h @@ -72,6 +72,8 @@ public: virtual bool hasActiveConnections() const = 0; virtual ~IConnections() = default; + + virtual void setAsyncCallback(AsyncCallback) {} }; } diff --git a/src/Client/MultiplexedConnections.cpp b/src/Client/MultiplexedConnections.cpp index 58568462ecc..7df767a4bcf 100644 --- a/src/Client/MultiplexedConnections.cpp +++ b/src/Client/MultiplexedConnections.cpp @@ -460,4 +460,13 @@ void MultiplexedConnections::invalidateReplica(ReplicaState & state) --active_connection_count; } +void MultiplexedConnections::setAsyncCallback(AsyncCallback async_callback) +{ + for (ReplicaState & state : replica_states) + { + if (state.connection) + state.connection->setAsyncCallback(async_callback); + } +} + } diff --git a/src/Client/MultiplexedConnections.h b/src/Client/MultiplexedConnections.h index a26e6dafbe5..371639d14c4 100644 --- a/src/Client/MultiplexedConnections.h +++ b/src/Client/MultiplexedConnections.h @@ -64,6 +64,9 @@ public: bool hasActiveConnections() const override { return active_connection_count > 0; } void setReplicaInfo(ReplicaInfo value) override { replica_info = value; } + + void setAsyncCallback(AsyncCallback async_callback) override; + private: Packet receivePacketUnlocked(AsyncCallback async_callback) override; diff --git a/src/Client/PacketReceiver.cpp b/src/Client/PacketReceiver.cpp new file mode 100644 index 00000000000..3dddd71ed65 --- /dev/null +++ b/src/Client/PacketReceiver.cpp @@ -0,0 +1,70 @@ +#include + +namespace DB +{ + +PacketReceiver::PacketReceiver(Connection * connection_) : AsyncTaskExecutor(std::make_unique(*this)), connection(connection_) +{ + epoll.add(timeout_descriptor.getDescriptor()); + socket_fd = connection->getSocket()->impl()->sockfd(); + epoll.add(socket_fd); +} + +bool PacketReceiver::checkBeforeTaskResume() +{ + /// If there is no pending data, check timeout. + return connection->hasReadPendingData() || checkTimeout(); +} + +void PacketReceiver::processAsyncEvent(int fd [[maybe_unused]], Poco::Timespan socket_timeout, AsyncEventTimeoutType, const std::string &, uint32_t) +{ + assert(fd == socket_fd); + timeout_descriptor.setRelative(socket_timeout); + timeout = socket_timeout; + is_read_in_process = true; +} + +void PacketReceiver::clearAsyncEvent() +{ + is_read_in_process = false; + timeout_descriptor.reset(); +} + +bool PacketReceiver::checkTimeout() +{ + bool is_socket_ready = false; + + epoll_event events[2]; + events[0].data.fd = events[1].data.fd = -1; + size_t ready_count = epoll.getManyReady(2, events, true); + + for (size_t i = 0; i != ready_count; ++i) + { + if (events[i].data.fd == socket_fd) + is_socket_ready = true; + if (events[i].data.fd == timeout_descriptor.getDescriptor()) + is_timeout_expired = true; + } + + if (is_timeout_expired && !is_socket_ready) + { + timeout_descriptor.reset(); + return false; + } + + return true; +} + +void PacketReceiver::Task::run(AsyncCallback async_callback, ResumeCallback suspend_callback) +{ + while (true) + { + { + AsyncCallbackSetter async_setter(receiver.connection, async_callback); + receiver.packet = receiver.connection->receivePacket(); + } + suspend_callback(); + } +} + +} diff --git a/src/Client/PacketReceiver.h b/src/Client/PacketReceiver.h index c9c61f523f7..37fdfa252c8 100644 --- a/src/Client/PacketReceiver.h +++ b/src/Client/PacketReceiver.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace DB { @@ -19,138 +20,56 @@ namespace DB /// socket and receive timeout are added in epoll and execution returns to the main program. /// So, you can poll this epoll file descriptor to determine when to resume /// packet receiving. -class PacketReceiver +class PacketReceiver : public AsyncTaskExecutor { public: - explicit PacketReceiver(Connection * connection_) : connection(connection_) + explicit PacketReceiver(Connection * connection_); + + bool isPacketReady() const { return !is_read_in_process && !is_timeout_expired; } + Packet getPacket() { return std::move(packet); } + + bool hasException() const { return exception.operator bool(); } + std::exception_ptr getException() const { return exception; } + + bool isTimeoutExpired() const { return is_timeout_expired; } + Poco::Timespan getTimeout() const { return timeout; } + + void setTimeout(const Poco::Timespan & timeout_) { - epoll.add(receive_timeout.getDescriptor()); - epoll.add(connection->getSocket()->impl()->sockfd()); - - fiber = boost::context::fiber(std::allocator_arg_t(), fiber_stack, Routine{*this}); - } - - /// Resume packet receiving. - std::variant resume() - { - /// If there is no pending data, check receive timeout. - if (!connection->hasReadPendingData() && !checkReceiveTimeout()) - { - /// Receive timeout expired. - return connection->getSocket()->getReceiveTimeout(); - } - - /// Resume fiber. - fiber = std::move(fiber).resume(); - if (exception) - return std::move(exception); - - if (is_read_in_process) - return epoll.getFileDescriptor(); - - /// Receiving packet was finished. - return std::move(packet); - } - - void cancel() - { - Fiber to_destroy = std::move(fiber); - connection = nullptr; + timeout_descriptor.setRelative(timeout_); + timeout = timeout_; } int getFileDescriptor() const { return epoll.getFileDescriptor(); } - void setReceiveTimeout(const Poco::Timespan & timeout) - { - receive_timeout.setRelative(timeout); - } - private: - /// When epoll file descriptor is ready, check if it's an expired timeout. - /// Return false if receive timeout expired and socket is not ready, return true otherwise. - bool checkReceiveTimeout() + bool checkBeforeTaskResume() override; + void afterTaskResume() override {} + + void processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType, const std::string &, uint32_t) override; + void clearAsyncEvent() override; + + struct Task : public AsyncTask { - bool is_socket_ready = false; - bool is_receive_timeout_expired = false; + Task(PacketReceiver & receiver_) : receiver(receiver_) {} - epoll_event events[2]; - events[0].data.fd = events[1].data.fd = -1; - size_t ready_count = epoll.getManyReady(2, events, true); - - for (size_t i = 0; i != ready_count; ++i) - { - if (events[i].data.fd == connection->getSocket()->impl()->sockfd()) - is_socket_ready = true; - if (events[i].data.fd == receive_timeout.getDescriptor()) - is_receive_timeout_expired = true; - } - - if (is_receive_timeout_expired && !is_socket_ready) - { - receive_timeout.reset(); - return false; - } - - return true; - } - - struct Routine - { PacketReceiver & receiver; - struct ReadCallback - { - PacketReceiver & receiver; - Fiber & sink; - - void operator()(int, Poco::Timespan timeout, const std::string &) - { - receiver.receive_timeout.setRelative(timeout); - receiver.is_read_in_process = true; - sink = std::move(sink).resume(); - receiver.is_read_in_process = false; - receiver.receive_timeout.reset(); - } - }; - - Fiber operator()(Fiber && sink) - { - try - { - while (true) - { - { - AsyncCallbackSetter async_setter(receiver.connection, ReadCallback{receiver, sink}); - receiver.packet = receiver.connection->receivePacket(); - } - sink = std::move(sink).resume(); - } - - } - catch (const boost::context::detail::forced_unwind &) - { - /// This exception is thrown by fiber implementation in case if fiber is being deleted but hasn't exited - /// It should not be caught or it will segfault. - /// Other exceptions must be caught - throw; - } - catch (...) - { - receiver.exception = std::current_exception(); - } - - return std::move(sink); - } + void run(AsyncCallback async_callback, ResumeCallback suspend_callback) override; }; + /// When epoll file descriptor is ready, check if it's an expired timeout. + /// Return false if receive timeout expired and socket is not ready, return true otherwise. + bool checkTimeout(); + Connection * connection; + int socket_fd = -1; Packet packet; - Fiber fiber; - FiberStack fiber_stack; - - /// We use timer descriptor for checking socket receive timeout. - TimerDescriptor receive_timeout; + /// We use timer descriptor for checking socket timeouts. + TimerDescriptor timeout_descriptor; + Poco::Timespan timeout; + bool is_timeout_expired = false; /// In read callback we add socket file descriptor and timer descriptor with receive timeout /// in epoll, so we can return epoll file descriptor outside for polling. diff --git a/src/Common/AsyncTaskExecutor.cpp b/src/Common/AsyncTaskExecutor.cpp new file mode 100644 index 00000000000..d79ac8c66ca --- /dev/null +++ b/src/Common/AsyncTaskExecutor.cpp @@ -0,0 +1,132 @@ +#include + +namespace DB +{ + +AsyncTaskExecutor::AsyncTaskExecutor(std::unique_ptr task_) : task(std::move(task_)) +{ + createFiber(); +} + +void AsyncTaskExecutor::resume() +{ + if (routine_is_finished) + return; + + if (!checkBeforeTaskResume()) + return; + + { + std::lock_guard guard(fiber_lock); + if (is_cancelled) + return; + + resumeUnlocked(); + if (exception) + processException(exception); + } + + afterTaskResume(); +} + +void AsyncTaskExecutor::resumeUnlocked() +{ + fiber = std::move(fiber).resume(); +} + +void AsyncTaskExecutor::cancel() +{ + std::lock_guard guard(fiber_lock); + is_cancelled = true; + cancelImpl(); + destroyFiber(); +} + +void AsyncTaskExecutor::restart() +{ + std::lock_guard guard(fiber_lock); + if (fiber) + destroyFiber(); + createFiber(); + routine_is_finished = false; +} + +struct AsyncTaskExecutor::Routine +{ + AsyncTaskExecutor & executor; + + struct AsyncCallback + { + AsyncTaskExecutor & executor; + Fiber & fiber; + + void operator()(int fd, Poco::Timespan timeout, AsyncEventTimeoutType type, const std::string & desc, uint32_t events) + { + executor.processAsyncEvent(fd, timeout, type, desc, events); + fiber = std::move(fiber).resume(); + executor.clearAsyncEvent(); + } + }; + + struct ResumeCallback + { + Fiber & fiber; + + void operator()() + { + fiber = std::move(fiber).resume(); + } + }; + + Fiber operator()(Fiber && sink) + { + auto async_callback = AsyncCallback{executor, sink}; + auto suspend_callback = ResumeCallback{sink}; + try + { + executor.task->run(async_callback, suspend_callback); + } + catch (const boost::context::detail::forced_unwind &) + { + /// This exception is thrown by fiber implementation in case if fiber is being deleted but hasn't exited + /// It should not be caught or it will segfault. + /// Other exceptions must be caught + throw; + } + catch (...) + { + executor.exception = std::current_exception(); + } + + executor.routine_is_finished = true; + return std::move(sink); + } +}; + +void AsyncTaskExecutor::createFiber() +{ + fiber = boost::context::fiber(std::allocator_arg_t(), fiber_stack, Routine{*this}); +} + +void AsyncTaskExecutor::destroyFiber() +{ + boost::context::fiber to_destroy = std::move(fiber); +} + +String getSocketTimeoutExceededMessageByTimeoutType(AsyncEventTimeoutType type, Poco::Timespan timeout, const String & socket_description) +{ + switch (type) + { + case AsyncEventTimeoutType::CONNECT: + return fmt::format("Timeout exceeded while connecting to socket ({}, connection timeout {} ms)", socket_description, timeout.totalMilliseconds()); + case AsyncEventTimeoutType::RECEIVE: + return fmt::format("Timeout exceeded while reading from socket ({}, receive timeout {} ms)", socket_description, timeout.totalMilliseconds()); + case AsyncEventTimeoutType::SEND: + return fmt::format("Timeout exceeded while writing to socket ({}, send timeout {} ms)", socket_description, timeout.totalMilliseconds()); + default: + return fmt::format("Timeout exceeded while working with socket ({}, {} ms)", socket_description, timeout.totalMilliseconds()); + } +} + +} + diff --git a/src/Common/AsyncTaskExecutor.h b/src/Common/AsyncTaskExecutor.h new file mode 100644 index 00000000000..a84ea7d3cf9 --- /dev/null +++ b/src/Common/AsyncTaskExecutor.h @@ -0,0 +1,121 @@ +#pragma once + +#include +#include +#include +#include + +#if defined(OS_LINUX) +#include +#endif + + +namespace DB +{ + +enum class AsyncEventTimeoutType +{ + CONNECT, + RECEIVE, + SEND, + NONE, +}; + +using AsyncCallback = std::function; +using ResumeCallback = std::function; + + +/// Base class for a task that will be executed in a fiber. +/// It has only one method - run, that takes 2 callbacks: +/// 1) async_callback - callback that should be called when this task tries to perform +/// some operation on a file descriptor (e.g. reading from socket) that can block this task execution. +/// 2) suspend_callback - callback that can be called to suspend current fiber execution explicitly. +struct AsyncTask +{ +public: + virtual void run(AsyncCallback async_callback, ResumeCallback suspend_callback) = 0; + virtual ~AsyncTask() = default; +}; + +/// Base class for executing tasks inside a fiber. +class AsyncTaskExecutor +{ +public: + AsyncTaskExecutor(std::unique_ptr task_); + + /// Resume task execution. This method returns when task is completed or suspended. + void resume(); + + /// Cancel task execution. Fiber will be destroyed even if task wasn't finished. + void cancel(); + + /// Restart task execution. Current fiber will be destroyed + /// and the new one will be created with the same task. + /// The next resume() call will start the new task from the beginning + void restart(); + + bool isCancelled() const { return is_cancelled; } + + virtual ~AsyncTaskExecutor() = default; + + +#if defined(OS_LINUX) + enum Event + { + READ = EPOLLIN, + WRITE = EPOLLOUT, + ERROR = EPOLLERR, + }; +#else + enum Event + { + READ = 1, + WRITE = 2, + ERROR = 4, + }; +#endif + +protected: + /// Method that is called in resume() before actual fiber resuming. + /// If it returns false, resume() will return immediately without actual fiber resuming. + virtual bool checkBeforeTaskResume() = 0; + + /// Method that is called in resume() after fiber resuming (when it was finished or suspended). + virtual void afterTaskResume() = 0; + + /// Method that is called on async event (when async callback is called) before fiber is suspended. + virtual void processAsyncEvent(int fd, Poco::Timespan timeout, AsyncEventTimeoutType timeout_type, const std::string & fd_description, uint32_t async_events) = 0; + + /// Method that is called when task is resumed after it was suspended on async event. + virtual void clearAsyncEvent() = 0; + + /// Process exception caught while task execution. It's called after fiber resume if exception happened. + virtual void processException(std::exception_ptr e) { std::rethrow_exception(e); } + + /// Method that is called in cancel() before fiber destruction. + virtual void cancelImpl() { } + + /// Resume fiber explicitly without mutex locking. + /// Can be called in cancelImpl(). + void resumeUnlocked(); + +private: + struct Routine; + + void createFiber(); + void destroyFiber(); + + Fiber fiber; + FiberStack fiber_stack; + std::mutex fiber_lock; + std::exception_ptr exception; + + std::atomic_bool routine_is_finished = false; + std::atomic_bool is_cancelled = false; + + std::unique_ptr task; +}; + +String getSocketTimeoutExceededMessageByTimeoutType(AsyncEventTimeoutType type, Poco::Timespan timeout, const String & socket_description); + +} diff --git a/src/Common/Epoll.cpp b/src/Common/Epoll.cpp index e1fdc803ada..182981aca27 100644 --- a/src/Common/Epoll.cpp +++ b/src/Common/Epoll.cpp @@ -34,10 +34,10 @@ Epoll & Epoll::operator=(Epoll && other) noexcept return *this; } -void Epoll::add(int fd, void * ptr) +void Epoll::add(int fd, void * ptr, uint32_t events) { epoll_event event; - event.events = EPOLLIN | EPOLLPRI; + event.events = events | EPOLLPRI; if (ptr) event.data.ptr = ptr; else diff --git a/src/Common/Epoll.h b/src/Common/Epoll.h index 9c75974791f..8009a164c25 100644 --- a/src/Common/Epoll.h +++ b/src/Common/Epoll.h @@ -9,8 +9,6 @@ namespace DB { -using AsyncCallback = std::function; - class Epoll { public: @@ -24,7 +22,9 @@ public: /// Add new file descriptor to epoll. If ptr set to nullptr, epoll_event.data.fd = fd, /// otherwise epoll_event.data.ptr = ptr. - void add(int fd, void * ptr = nullptr); + /// Default events are for reading from fd and for errors. + void add(int fd, void * ptr = nullptr, uint32_t events = EPOLLIN | EPOLLERR); + void add(int fd, uint32_t events) { add(fd, nullptr, events); } /// Remove file descriptor to epoll. void remove(int fd); diff --git a/src/IO/ReadBufferFromPocoSocket.cpp b/src/IO/ReadBufferFromPocoSocket.cpp index 046646ed003..d0fba2c28e8 100644 --- a/src/IO/ReadBufferFromPocoSocket.cpp +++ b/src/IO/ReadBufferFromPocoSocket.cpp @@ -8,7 +8,7 @@ #include #include #include - +#include namespace ProfileEvents { @@ -52,8 +52,8 @@ bool ReadBufferFromPocoSocket::nextImpl() /// If async_callback is specified, and read will block, run async_callback and try again later. /// It is expected that file descriptor may be polled externally. /// Note that receive timeout is not checked here. External code should check it while polling. - while (async_callback && !socket.poll(0, Poco::Net::Socket::SELECT_READ)) - async_callback(socket.impl()->sockfd(), socket.getReceiveTimeout(), socket_description); + while (async_callback && !socket.poll(0, Poco::Net::Socket::SELECT_READ | Poco::Net::Socket::SELECT_ERROR)) + async_callback(socket.impl()->sockfd(), socket.getReceiveTimeout(), AsyncEventTimeoutType::RECEIVE, socket_description, AsyncTaskExecutor::Event::READ | AsyncTaskExecutor::Event::ERROR); if (internal_buffer.size() > INT_MAX) throw Exception(ErrorCodes::LOGICAL_ERROR, "Buffer overflow"); diff --git a/src/IO/ReadBufferFromPocoSocket.h b/src/IO/ReadBufferFromPocoSocket.h index c60aafc7e23..dab4ac86295 100644 --- a/src/IO/ReadBufferFromPocoSocket.h +++ b/src/IO/ReadBufferFromPocoSocket.h @@ -2,14 +2,12 @@ #include #include - +#include #include namespace DB { -using AsyncCallback = std::function; - /// Works with the ready Poco::Net::Socket. Blocking operations. class ReadBufferFromPocoSocket : public BufferWithOwnMemory { diff --git a/src/IO/WriteBufferFromPocoSocket.cpp b/src/IO/WriteBufferFromPocoSocket.cpp index b15149c6f88..039110dfb62 100644 --- a/src/IO/WriteBufferFromPocoSocket.cpp +++ b/src/IO/WriteBufferFromPocoSocket.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace ProfileEvents @@ -60,6 +61,13 @@ void WriteBufferFromPocoSocket::nextImpl() size_t size = offset() - bytes_written; if (size > INT_MAX) throw Exception(ErrorCodes::LOGICAL_ERROR, "Buffer overflow"); + + /// If async_callback is specified, and write will block, run async_callback and try again later. + /// It is expected that file descriptor may be polled externally. + /// Note that send timeout is not checked here. External code should check it while polling. + while (async_callback && !socket.poll(0, Poco::Net::Socket::SELECT_WRITE | Poco::Net::Socket::SELECT_ERROR)) + async_callback(socket.impl()->sockfd(), socket.getSendTimeout(), AsyncEventTimeoutType::SEND, socket_description, AsyncTaskExecutor::Event::WRITE | AsyncTaskExecutor::Event::ERROR); + res = socket.impl()->sendBytes(pos, static_cast(size)); } catch (const Poco::Net::NetException & e) @@ -88,7 +96,11 @@ void WriteBufferFromPocoSocket::nextImpl() } WriteBufferFromPocoSocket::WriteBufferFromPocoSocket(Poco::Net::Socket & socket_, size_t buf_size) - : BufferWithOwnMemory(buf_size), socket(socket_), peer_address(socket.peerAddress()), our_address(socket.address()) + : BufferWithOwnMemory(buf_size) + , socket(socket_) + , peer_address(socket.peerAddress()) + , our_address(socket.address()) + , socket_description("socket (" + peer_address.toString() + ")") { } diff --git a/src/IO/WriteBufferFromPocoSocket.h b/src/IO/WriteBufferFromPocoSocket.h index ffe1176c8cd..ecb61020357 100644 --- a/src/IO/WriteBufferFromPocoSocket.h +++ b/src/IO/WriteBufferFromPocoSocket.h @@ -4,11 +4,13 @@ #include #include - +#include namespace DB { +using AsyncCallback = std::function; + /** Works with the ready Poco::Net::Socket. Blocking operations. */ class WriteBufferFromPocoSocket : public BufferWithOwnMemory @@ -18,6 +20,8 @@ public: ~WriteBufferFromPocoSocket() override; + void setAsyncCallback(AsyncCallback async_callback_) { async_callback = std::move(async_callback_); } + protected: void nextImpl() override; @@ -29,6 +33,10 @@ protected: */ Poco::Net::SocketAddress peer_address; Poco::Net::SocketAddress our_address; + +private: + AsyncCallback async_callback; + std::string socket_description; }; } diff --git a/src/Processors/Sources/RemoteSource.cpp b/src/Processors/Sources/RemoteSource.cpp index 69964d569fa..c07990f57e2 100644 --- a/src/Processors/Sources/RemoteSource.cpp +++ b/src/Processors/Sources/RemoteSource.cpp @@ -68,7 +68,7 @@ ISource::Status RemoteSource::prepare() /// RemoteQueryExecutor it should be finished explicitly. if (status == Status::Finished) { - query_executor->finish(&read_context); + query_executor->finish(); if (dependency_port) dependency_port->finish(); is_async_state = false; @@ -119,7 +119,7 @@ std::optional RemoteSource::tryGenerate() if (async_read) { - auto res = query_executor->read(read_context); + auto res = query_executor->asyncRead(); if (res.getType() == RemoteQueryExecutor::ReadResult::Type::Nothing) throw Exception(ErrorCodes::LOGICAL_ERROR, "Got an empty packet from the RemoteQueryExecutor. This is a bug"); @@ -146,7 +146,7 @@ std::optional RemoteSource::tryGenerate() if (!block) { - query_executor->finish(&read_context); + query_executor->finish(); return {}; } @@ -167,7 +167,7 @@ std::optional RemoteSource::tryGenerate() void RemoteSource::onCancel() { was_query_canceled = true; - query_executor->cancel(&read_context); + query_executor->cancel(); } void RemoteSource::onUpdatePorts() @@ -175,7 +175,7 @@ void RemoteSource::onUpdatePorts() if (getPort().isFinished()) { was_query_canceled = true; - query_executor->finish(&read_context); + query_executor->finish(); } } diff --git a/src/Processors/Sources/RemoteSource.h b/src/Processors/Sources/RemoteSource.h index 8fe0114ab6f..b43ea70312a 100644 --- a/src/Processors/Sources/RemoteSource.h +++ b/src/Processors/Sources/RemoteSource.h @@ -12,8 +12,6 @@ namespace DB class RemoteQueryExecutor; using RemoteQueryExecutorPtr = std::shared_ptr; -class RemoteQueryExecutorReadContext; - /// Source from RemoteQueryExecutor. Executes remote query and returns query result chunks. class RemoteSource final : public ISource { @@ -55,7 +53,6 @@ private: const bool async_read; bool is_async_state = false; - std::unique_ptr read_context; UUID uuid; int fd = -1; }; diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index f6797864b73..e0276501683 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -57,7 +57,7 @@ RemoteQueryExecutor::RemoteQueryExecutor( QueryProcessingStage::Enum stage_, std::optional extension_) : RemoteQueryExecutor(query_, header_, context_, scalars_, external_tables_, stage_, extension_) { - create_connections = [this, &connection, throttler, extension_]() + create_connections = [this, &connection, throttler, extension_](AsyncCallback) { auto res = std::make_unique(connection, context->getSettingsRef(), throttler); if (extension_ && extension_->replica_info) @@ -73,7 +73,7 @@ RemoteQueryExecutor::RemoteQueryExecutor( QueryProcessingStage::Enum stage_, std::optional extension_) : RemoteQueryExecutor(query_, header_, context_, scalars_, external_tables_, stage_, extension_) { - create_connections = [this, connection_ptr, throttler, extension_]() + create_connections = [this, connection_ptr, throttler, extension_](AsyncCallback) { auto res = std::make_unique(connection_ptr, context->getSettingsRef(), throttler); if (extension_ && extension_->replica_info) @@ -92,7 +92,7 @@ RemoteQueryExecutor::RemoteQueryExecutor( , task_iterator(extension_ ? extension_->task_iterator : nullptr) , parallel_reading_coordinator(extension_ ? extension_->parallel_reading_coordinator : nullptr) { - create_connections = [this, connections_, throttler, extension_]() mutable { + create_connections = [this, connections_, throttler, extension_](AsyncCallback) mutable { auto res = std::make_unique(std::move(connections_), context->getSettingsRef(), throttler); if (extension_ && extension_->replica_info) res->setReplicaInfo(*extension_->replica_info); @@ -110,7 +110,7 @@ RemoteQueryExecutor::RemoteQueryExecutor( , task_iterator(extension_ ? extension_->task_iterator : nullptr) , parallel_reading_coordinator(extension_ ? extension_->parallel_reading_coordinator : nullptr) { - create_connections = [this, pool, throttler, extension_]()->std::unique_ptr + create_connections = [this, pool, throttler, extension_](AsyncCallback async_callback)->std::unique_ptr { const Settings & current_settings = context->getSettingsRef(); auto timeouts = ConnectionTimeouts::getTCPTimeoutsWithFailover(current_settings); @@ -122,7 +122,7 @@ RemoteQueryExecutor::RemoteQueryExecutor( if (main_table) table_to_check = std::make_shared(main_table.getQualifiedName()); - auto res = std::make_unique(pool, context, timeouts, throttler, pool_mode, table_to_check); + auto res = std::make_unique(pool, context, timeouts, throttler, pool_mode, table_to_check, std::move(async_callback)); if (extension_ && extension_->replica_info) res->setReplicaInfo(*extension_->replica_info); return res; @@ -132,13 +132,13 @@ RemoteQueryExecutor::RemoteQueryExecutor( std::vector connection_entries; if (main_table) { - auto try_results = pool->getManyChecked(timeouts, ¤t_settings, pool_mode, main_table.getQualifiedName()); + auto try_results = pool->getManyChecked(timeouts, ¤t_settings, pool_mode, main_table.getQualifiedName(), std::move(async_callback)); connection_entries.reserve(try_results.size()); for (auto & try_result : try_results) connection_entries.emplace_back(std::move(try_result.entry)); } else - connection_entries = pool->getMany(timeouts, ¤t_settings, pool_mode); + connection_entries = pool->getMany(timeouts, ¤t_settings, pool_mode, std::move(async_callback)); auto res = std::make_unique(std::move(connection_entries), current_settings, throttler); if (extension_ && extension_->replica_info) @@ -206,15 +206,16 @@ static Block adaptBlockStructure(const Block & block, const Block & header) return res; } -void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind) +void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind, AsyncCallback async_callback) { if (sent_query) return; - connections = create_connections(); + connections = create_connections(async_callback); + AsyncCallbackSetter async_callback_setter(connections.get(), async_callback); const auto & settings = context->getSettingsRef(); - if (settings.skip_unavailable_shards && 0 == connections->size()) + if (needToSkipUnavailableShard()) return; /// Query cannot be canceled in the middle of the send query, @@ -291,52 +292,43 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::read() } } -RemoteQueryExecutor::ReadResult RemoteQueryExecutor::read(std::unique_ptr & read_context [[maybe_unused]]) +RemoteQueryExecutor::ReadResult RemoteQueryExecutor::asyncRead() { #if defined(OS_LINUX) - if (!sent_query) - { - sendQuery(); - - if (context->getSettingsRef().skip_unavailable_shards && (0 == connections->size())) - return ReadResult(Block()); - } - - if (!read_context || resent_query) + if (!read_context || (resent_query && recreate_read_context)) { std::lock_guard lock(was_cancelled_mutex); - if (was_cancelled) - return ReadResult(Block()); - - read_context = std::make_unique(*connections); + read_context = std::make_unique(*this); + recreate_read_context = false; } while (true) { - if (!read_context->resumeRoutine()) + read_context->resume(); + + if (needToSkipUnavailableShard()) return ReadResult(Block()); - if (read_context->is_read_in_progress.load(std::memory_order_relaxed)) - { - read_context->setTimer(); - return ReadResult(read_context->epoll.getFileDescriptor()); - } - else - { - /// We need to check that query was not cancelled again, - /// to avoid the race between cancel() thread and read() thread. - /// (since cancel() thread will steal the fiber and may update the packet). - if (was_cancelled) - return ReadResult(Block()); + if (read_context->isCancelled()) + return ReadResult(Block()); - auto anything = processPacket(std::move(read_context->packet)); + /// Check if packet is not ready yet. + if (read_context->isInProgress()) + return ReadResult(read_context->getFileDescriptor()); - if (anything.getType() == ReadResult::Type::Data || anything.getType() == ReadResult::Type::ParallelReplicasToken) - return anything; + /// We need to check that query was not cancelled again, + /// to avoid the race between cancel() thread and read() thread. + /// (since cancel() thread will steal the fiber and may update the packet). + if (was_cancelled) + return ReadResult(Block()); - if (got_duplicated_part_uuids) - return restartQueryWithoutDuplicatedUUIDs(&read_context); - } + auto anything = processPacket(read_context->getPacket()); + + if (anything.getType() == ReadResult::Type::Data || anything.getType() == ReadResult::Type::ParallelReplicasToken) + return anything; + + if (got_duplicated_part_uuids) + return restartQueryWithoutDuplicatedUUIDs(); } #else return read(); @@ -344,10 +336,10 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::read(std::unique_ptr * read_context) +RemoteQueryExecutor::ReadResult RemoteQueryExecutor::restartQueryWithoutDuplicatedUUIDs() { /// Cancel previous query and disconnect before retry. - cancel(read_context); + cancel(); connections->disconnect(); /// Only resend once, otherwise throw an exception @@ -357,13 +349,14 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::restartQueryWithoutDuplicat LOG_DEBUG(log, "Found duplicate UUIDs, will retry query without those parts"); resent_query = true; + recreate_read_context = true; sent_query = false; got_duplicated_part_uuids = false; /// Consecutive read will implicitly send query first. if (!read_context) return read(); else - return read(*read_context); + return asyncRead(); } throw Exception(ErrorCodes::DUPLICATED_PART_UUIDS, "Found duplicate uuids while processing query"); } @@ -505,7 +498,7 @@ void RemoteQueryExecutor::processMergeTreeInitialReadAnnounecement(InitialAllRan parallel_reading_coordinator->handleInitialAllRangesAnnouncement(announcement); } -void RemoteQueryExecutor::finish(std::unique_ptr * read_context) +void RemoteQueryExecutor::finish() { /** If one of: * - nothing started to do; @@ -522,7 +515,7 @@ void RemoteQueryExecutor::finish(std::unique_ptr * read_context) */ /// Send the request to abort the execution of the request, if not already sent. - tryCancel("Cancelling query because enough data has been read", read_context); + tryCancel("Cancelling query because enough data has been read"); /// Get the remaining packets so that there is no out of sync in the connections to the replicas. Packet packet = connections->drain(); @@ -558,7 +551,7 @@ void RemoteQueryExecutor::finish(std::unique_ptr * read_context) } } -void RemoteQueryExecutor::cancel(std::unique_ptr * read_context) +void RemoteQueryExecutor::cancel() { { std::lock_guard lock(external_tables_mutex); @@ -572,7 +565,7 @@ void RemoteQueryExecutor::cancel(std::unique_ptr * read_context) if (!isQueryPending() || hasThrownException()) return; - tryCancel("Cancelling query", read_context); + tryCancel("Cancelling query"); } void RemoteQueryExecutor::sendScalars() @@ -640,7 +633,7 @@ void RemoteQueryExecutor::sendExternalTables() connections->sendExternalTablesData(external_tables_data); } -void RemoteQueryExecutor::tryCancel(const char * reason, std::unique_ptr * read_context) +void RemoteQueryExecutor::tryCancel(const char * reason) { /// Flag was_cancelled is atomic because it is checked in read(), /// in case of packet had been read by fiber (async_socket_for_remote). @@ -651,19 +644,8 @@ void RemoteQueryExecutor::tryCancel(const char * reason, std::unique_ptr 0). - /// - /// Also note that it is possible to get this situation even when - /// enough data already had been read. - (*read_context)->setTimer(); - (*read_context)->cancel(); - } + if (read_context) + read_context->cancel(); connections->sendCancel(); diff --git a/src/QueryPipeline/RemoteQueryExecutor.h b/src/QueryPipeline/RemoteQueryExecutor.h index 576efb97bb1..b17d7e85609 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.h +++ b/src/QueryPipeline/RemoteQueryExecutor.h @@ -88,10 +88,11 @@ public: /// (for which this code was written in general). /// But clickhouse-benchmark uses the same code, /// and it should pass INITIAL_QUERY. - void sendQuery(ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::SECONDARY_QUERY); + void sendQuery(ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::SECONDARY_QUERY, AsyncCallback async_callback = {}); /// Query is resent to a replica, the query itself can be modified. std::atomic resent_query { false }; + std::atomic recreate_read_context { false }; struct ReadResult { @@ -145,16 +146,15 @@ public: ReadResult read(); /// Async variant of read. Returns ready block or file descriptor which may be used for polling. - /// ReadContext is an internal read state. Pass empty ptr first time, reuse created one for every call. - ReadResult read(std::unique_ptr & read_context); + ReadResult asyncRead(); /// Receive all remain packets and finish query. /// It should be cancelled after read returned empty block. - void finish(std::unique_ptr * read_context = nullptr); + void finish(); /// Cancel query execution. Sends Cancel packet and ignore others. /// This method may be called from separate thread. - void cancel(std::unique_ptr * read_context = nullptr); + void cancel(); /// Get totals and extremes if any. Block getTotals() { return std::move(totals); } @@ -179,6 +179,10 @@ public: const Block & getHeader() const { return header; } + IConnections & getConnections() { return *connections; } + + bool needToSkipUnavailableShard() const { return context->getSettingsRef().skip_unavailable_shards && (0 == connections->size()); } + private: RemoteQueryExecutor( const String & query_, const Block & header_, ContextPtr context_, @@ -189,8 +193,9 @@ private: Block totals; Block extremes; - std::function()> create_connections; + std::function(AsyncCallback)> create_connections; std::unique_ptr connections; + std::unique_ptr read_context; const String query; String query_id; @@ -280,10 +285,10 @@ private: /// Cancel query and restart it with info about duplicate UUIDs /// only for `allow_experimental_query_deduplication`. - ReadResult restartQueryWithoutDuplicatedUUIDs(std::unique_ptr * read_context = nullptr); + ReadResult restartQueryWithoutDuplicatedUUIDs(); /// If wasn't sent yet, send request to cancel all connections to replicas - void tryCancel(const char * reason, std::unique_ptr * read_context); + void tryCancel(const char * reason); /// Returns true if query was sent bool isQueryPending() const; diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp index 0c84e844cb2..a71f413ffb5 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp @@ -1,69 +1,16 @@ #if defined(OS_LINUX) #include +#include #include #include #include #include -#include +#include namespace DB { -struct RemoteQueryExecutorRoutine -{ - IConnections & connections; - RemoteQueryExecutorReadContext & read_context; - - struct ReadCallback - { - RemoteQueryExecutorReadContext & read_context; - Fiber & fiber; - - void operator()(int fd, Poco::Timespan timeout = 0, const std::string fd_description = "") - { - try - { - read_context.setConnectionFD(fd, timeout, fd_description); - } - catch (DB::Exception & e) - { - e.addMessage(" while reading from {}", fd_description); - throw; - } - - read_context.is_read_in_progress.store(true, std::memory_order_relaxed); - fiber = std::move(fiber).resume(); - read_context.is_read_in_progress.store(false, std::memory_order_relaxed); - } - }; - - Fiber operator()(Fiber && sink) const - { - try - { - while (true) - { - read_context.packet = connections.receivePacketUnlocked(ReadCallback{read_context, sink}); - sink = std::move(sink).resume(); - } - } - catch (const boost::context::detail::forced_unwind &) - { - /// This exception is thrown by fiber implementation in case if fiber is being deleted but hasn't exited - /// It should not be caught or it will segfault. - /// Other exceptions must be caught - throw; - } - catch (...) - { - read_context.exception = std::current_exception(); - } - - return std::move(sink); - } -}; - namespace ErrorCodes { extern const int CANNOT_READ_FROM_SOCKET; @@ -71,57 +18,55 @@ namespace ErrorCodes extern const int SOCKET_TIMEOUT; } -RemoteQueryExecutorReadContext::RemoteQueryExecutorReadContext(IConnections & connections_) - : connections(connections_) +RemoteQueryExecutorReadContext::RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_) + : AsyncTaskExecutor(std::make_unique(*this)), executor(executor_) { - if (-1 == pipe2(pipe_fd, O_NONBLOCK)) throwFromErrno("Cannot create pipe", ErrorCodes::CANNOT_OPEN_FILE); - { - epoll.add(pipe_fd[0]); - } - - { - epoll.add(timer.getDescriptor()); - } - - auto routine = RemoteQueryExecutorRoutine{connections, *this}; - fiber = boost::context::fiber(std::allocator_arg_t(), stack, std::move(routine)); + epoll.add(pipe_fd[0]); + epoll.add(timer.getDescriptor()); } -void RemoteQueryExecutorReadContext::setConnectionFD(int fd, Poco::Timespan timeout, const std::string & fd_description) +bool RemoteQueryExecutorReadContext::checkBeforeTaskResume() { - if (fd == connection_fd) + return !is_in_progress.load(std::memory_order_relaxed) || checkTimeout(); +} + + +void RemoteQueryExecutorReadContext::Task::run(AsyncCallback async_callback, ResumeCallback suspend_callback) +{ + read_context.executor.sendQuery(ClientInfo::QueryKind::SECONDARY_QUERY, async_callback); + + if (read_context.executor.needToSkipUnavailableShard()) return; - if (connection_fd != -1) - epoll.remove(connection_fd); + while (true) + { + read_context.packet = read_context.executor.getConnections().receivePacketUnlocked(async_callback); + suspend_callback(); + } +} +void RemoteQueryExecutorReadContext::processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType type, const std::string & description, uint32_t events) +{ connection_fd = fd; - epoll.add(connection_fd); + epoll.add(connection_fd, events); + timeout = socket_timeout; + timer.setRelative(socket_timeout); + timeout_type = type; + connection_fd_description = description; + is_in_progress.store(true); +} - receive_timeout_usec = timeout.totalMicroseconds(); - connection_fd_description = fd_description; +void RemoteQueryExecutorReadContext::clearAsyncEvent() +{ + epoll.remove(connection_fd); + timer.reset(); + is_in_progress.store(false); } bool RemoteQueryExecutorReadContext::checkTimeout(bool blocking) -{ - try - { - return checkTimeoutImpl(blocking); - } - catch (DB::Exception & e) - { - if (last_used_socket) - e.addMessage(" while reading from socket ({})", last_used_socket->peerAddress().toString()); - if (e.code() == ErrorCodes::SOCKET_TIMEOUT) - e.addMessage(" (receive timeout {} ms)", receive_timeout_usec / 1000); - throw; - } -} - -bool RemoteQueryExecutorReadContext::checkTimeoutImpl(bool blocking) { /// Wait for epoll will not block if it was polled externally. epoll_event events[3]; @@ -130,7 +75,6 @@ bool RemoteQueryExecutorReadContext::checkTimeoutImpl(bool blocking) size_t num_events = epoll.getManyReady(3, events, blocking); bool is_socket_ready = false; - bool is_pipe_alarmed = false; for (size_t i = 0; i < num_events; ++i) { @@ -147,49 +91,17 @@ bool RemoteQueryExecutorReadContext::checkTimeoutImpl(bool blocking) if (is_timer_alarmed && !is_socket_ready) { - /// Socket receive timeout. Drain it in case or error, or it may be hide by timeout exception. + /// Socket timeout. Drain it in case of error, or it may be hide by timeout exception. timer.drain(); - throw NetException(ErrorCodes::SOCKET_TIMEOUT, "Timeout exceeded"); + const String exception_message = getSocketTimeoutExceededMessageByTimeoutType(timeout_type, timeout, connection_fd_description); + throw NetException(ErrorCodes::SOCKET_TIMEOUT, exception_message); } return true; } -void RemoteQueryExecutorReadContext::setTimer() const +void RemoteQueryExecutorReadContext::cancelImpl() { - /// Did not get packet yet. Init timeout for the next async reading. - timer.reset(); - - if (receive_timeout_usec) - timer.setRelative(receive_timeout_usec); -} - -bool RemoteQueryExecutorReadContext::resumeRoutine() -{ - if (is_read_in_progress.load(std::memory_order_relaxed) && !checkTimeout()) - return false; - - { - std::lock_guard guard(fiber_lock); - if (!fiber) - return false; - - fiber = std::move(fiber).resume(); - - if (exception) - std::rethrow_exception(exception); - } - - return true; -} - -void RemoteQueryExecutorReadContext::cancel() -{ - std::lock_guard guard(fiber_lock); - - /// It is safe to just destroy fiber - we are not in the process of reading from socket. - boost::context::fiber to_destroy = std::move(fiber); - /// One should not try to wait for the current packet here in case of /// timeout because this will exceed the timeout. /// Anyway if the timeout is exceeded, then the connection will be shutdown @@ -197,10 +109,10 @@ void RemoteQueryExecutorReadContext::cancel() if (!is_timer_alarmed) { /// Wait for current pending packet, to avoid leaving connection in unsynchronised state. - while (is_read_in_progress.load(std::memory_order_relaxed)) + while (is_in_progress.load(std::memory_order_relaxed)) { checkTimeout(/* blocking= */ true); - to_destroy = std::move(to_destroy).resume(); + resumeUnlocked(); } } diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.h b/src/QueryPipeline/RemoteQueryExecutorReadContext.h index 91e34dbb82c..2413bc1f81e 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.h +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -21,23 +22,47 @@ namespace DB { class MultiplexedConnections; +class RemoteQueryExecutor; -class RemoteQueryExecutorReadContext +class RemoteQueryExecutorReadContext : public AsyncTaskExecutor { public: - std::atomic_bool is_read_in_progress = false; + explicit RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_); + + ~RemoteQueryExecutorReadContext() override; + + bool isInProgress() const { return is_in_progress.load(std::memory_order_relaxed); } + + bool isCancelled() const { return AsyncTaskExecutor::isCancelled() || is_pipe_alarmed; } + + int getFileDescriptor() const { return epoll.getFileDescriptor(); } + + Packet getPacket() { return std::move(packet); } + +private: + bool checkTimeout(bool blocking = false); + + bool checkBeforeTaskResume() override; + void afterTaskResume() override {} + + void processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType type, const std::string & description, uint32_t events) override; + void clearAsyncEvent() override; + + void cancelImpl() override; + + struct Task : public AsyncTask + { + Task(RemoteQueryExecutorReadContext & read_context_) : read_context(read_context_) {} + + RemoteQueryExecutorReadContext & read_context; + + void run(AsyncCallback async_callback, ResumeCallback suspend_callback) override; + }; + + std::atomic_bool is_in_progress = false; Packet packet; - std::exception_ptr exception; - FiberStack stack; - boost::context::fiber fiber; - /// This mutex for fiber is needed because fiber could be destroyed in cancel method from another thread. - std::mutex fiber_lock; - - /// atomic is required due to data-race between setConnectionFD() and setTimer() from the cancellation path. - std::atomic receive_timeout_usec = 0; - IConnections & connections; - Poco::Net::Socket * last_used_socket = nullptr; + RemoteQueryExecutor & executor; /// Here we have three descriptors we are going to wait: /// * connection_fd is a descriptor of connection. It may be changed in case of reading from several replicas. @@ -45,25 +70,16 @@ public: /// * pipe_fd is a pipe we use to cancel query and socket polling by executor. /// We put those descriptors into our own epoll which is used by external executor. TimerDescriptor timer{CLOCK_MONOTONIC, 0}; - bool is_timer_alarmed = false; + Poco::Timespan timeout; + AsyncEventTimeoutType timeout_type; + std::atomic_bool is_timer_alarmed = false; int connection_fd = -1; int pipe_fd[2] = { -1, -1 }; + std::atomic_bool is_pipe_alarmed = false; Epoll epoll; std::string connection_fd_description; - - explicit RemoteQueryExecutorReadContext(IConnections & connections_); - ~RemoteQueryExecutorReadContext(); - - bool checkTimeout(bool blocking = false); - bool checkTimeoutImpl(bool blocking); - - void setConnectionFD(int fd, Poco::Timespan timeout = 0, const std::string & fd_description = ""); - void setTimer() const; - - bool resumeRoutine(); - void cancel(); }; } From b603ce63f1951701c61af95d8c4805b7b2a95ee5 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 7 Mar 2023 15:34:39 +0000 Subject: [PATCH 074/535] Fix more tests --- .../test_distributed_respect_user_timeouts/test.py | 4 ++-- tests/queries/0_stateless/01361_fover_remote_num_tries.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/test_distributed_respect_user_timeouts/test.py b/tests/integration/test_distributed_respect_user_timeouts/test.py index 593843b4e4a..906ffb03fc0 100644 --- a/tests/integration/test_distributed_respect_user_timeouts/test.py +++ b/tests/integration/test_distributed_respect_user_timeouts/test.py @@ -37,7 +37,7 @@ SELECTS_SQL = { EXCEPTION_NETWORK = "DB::NetException: " EXCEPTION_TIMEOUT = "Timeout exceeded while reading from socket (" -EXCEPTION_CONNECT = "Timeout: connect timed out: " +EXCEPTION_CONNECT_TIMEOUT = "Timeout exceeded while connecting to socket (" TIMEOUT_MEASUREMENT_EPS = 0.01 @@ -79,7 +79,7 @@ def _check_exception(exception, expected_tries=3): for i, line in enumerate(lines[3 : 3 + expected_tries]): expected_lines = ( "Code: 209. " + EXCEPTION_NETWORK + EXCEPTION_TIMEOUT, - "Code: 209. " + EXCEPTION_NETWORK + EXCEPTION_CONNECT, + EXCEPTION_CONNECT_TIMEOUT, EXCEPTION_TIMEOUT, ) diff --git a/tests/queries/0_stateless/01361_fover_remote_num_tries.sh b/tests/queries/0_stateless/01361_fover_remote_num_tries.sh index 12a65a96c9b..2ee2ec1bc76 100755 --- a/tests/queries/0_stateless/01361_fover_remote_num_tries.sh +++ b/tests/queries/0_stateless/01361_fover_remote_num_tries.sh @@ -5,4 +5,4 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh -$CLICKHOUSE_CLIENT --connections_with_failover_max_tries 10 --query "SELECT hostName() FROM remote('128.1.2.3', default.tmp)" 2>&1 | grep -o -P 'connect timed out|Network is unreachable' | wc -l +$CLICKHOUSE_CLIENT --connections_with_failover_max_tries 10 --query "SELECT hostName() FROM remote('128.1.2.3', default.tmp)" 2>&1 | grep -o -P 'Timeout exceeded while connecting to socket|Network is unreachable' | wc -l From 9596c218d98428a49035dde13a638cdef04484cc Mon Sep 17 00:00:00 2001 From: avogar Date: Wed, 15 Mar 2023 12:58:56 +0000 Subject: [PATCH 075/535] Merge with master --- src/Client/IConnections.cpp | 45 ------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 src/Client/IConnections.cpp diff --git a/src/Client/IConnections.cpp b/src/Client/IConnections.cpp deleted file mode 100644 index a540eb28af6..00000000000 --- a/src/Client/IConnections.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include -#include - -namespace DB -{ - -namespace ErrorCodes -{ - extern const int SOCKET_TIMEOUT; -} - -/// This wrapper struct allows us to use Poco's socket polling code with a raw fd. -/// The only difference from Poco::Net::SocketImpl is that we don't close the fd in the destructor. -struct PocoSocketWrapper : public Poco::Net::SocketImpl -{ - explicit PocoSocketWrapper(int fd) - { - reset(fd); - } - - // Do not close fd. - ~PocoSocketWrapper() override { reset(-1); } -}; - -void IConnections::DrainCallback::operator()(int fd, Poco::Timespan, AsyncEventTimeoutType, const std::string & fd_description, uint32_t events) const -{ - uint32_t poco_events = 0; - if (events & AsyncTaskExecutor::Event::READ) - poco_events |= Poco::Net::Socket::SELECT_READ; - if (events & AsyncTaskExecutor::Event::WRITE) - poco_events |= Poco::Net::Socket::SELECT_WRITE; - if (events & AsyncTaskExecutor::Event::ERROR) - poco_events |= Poco::Net::Socket::SELECT_ERROR; - - if (!PocoSocketWrapper(fd).poll(drain_timeout, poco_events)) - { - throw Exception(ErrorCodes::SOCKET_TIMEOUT, - "Read timeout ({} ms) while draining from {}", - drain_timeout.totalMilliseconds(), - fd_description); - } -} - -} From 40639fade95574d6a3a062f2053a73499148d659 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 15 Mar 2023 11:18:14 -0300 Subject: [PATCH 076/535] remove support for multiple quoting characters --- src/Functions/extractKeyValuePairs.cpp | 15 +- src/Functions/extractKeyValuePairs.h | 2 +- .../src/KeyValuePairExtractorBuilder.cpp | 12 +- .../src/KeyValuePairExtractorBuilder.h | 4 +- .../src/impl/state/ExtractorConfiguration.h | 9 +- .../InlineEscapingKeyStateHandler.cpp | 10 +- .../InlineEscapingValueStateHandler.cpp | 10 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 10 +- .../NoEscapingValueStateHandler.cpp | 11 +- .../state/strategies/util/NeedleFactory.cpp | 10 +- ...test_inline_escaping_key_state_handler.cpp | 11 +- ...st_inline_escaping_value_state_handler.cpp | 3 +- .../gtest_no_escaping_key_state_handler.cpp | 8 +- ...t_key_value_pairs_multiple_input.reference | 136 +++++++++++++++++- 14 files changed, 185 insertions(+), 66 deletions(-) diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/extractKeyValuePairs.cpp index 6d8ebf1d330..4a47b7003f5 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/extractKeyValuePairs.cpp @@ -78,9 +78,9 @@ auto ExtractKeyValuePairs::getExtractor(const ParsedArguments & parsed_arguments builder.withItemDelimiter({parsed_arguments.pair_delimiters.begin(), parsed_arguments.pair_delimiters.end()}); } - if (!parsed_arguments.quoting_characters.empty()) + if (parsed_arguments.quoting_character) { - builder.withQuotingCharacters({parsed_arguments.quoting_characters.begin(), parsed_arguments.quoting_characters.end()}); + builder.withQuotingCharacter(parsed_arguments.quoting_character.value()); } return builder.build(); @@ -123,6 +123,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const * 2. Check if it's not empty * 3. Cross check arguments? Not sure it is needed anymore * 4. Use uint8_t column instead of string column for escaping lol + * 5. maybe a builder will clean things up here * */ if (arguments.empty()) @@ -157,11 +158,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const }; } - auto quoting_characters_str = arguments[3].column->getDataAt(0).toView(); - - SetArgument quoting_characters; - - quoting_characters.insert(quoting_characters_str.begin(), quoting_characters_str.end()); + auto quoting_character = extractControlCharacter(arguments[3].column); if (arguments.size() == 4u) { @@ -169,7 +166,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const data_column, key_value_pair_delimiter, pair_delimiters, - quoting_characters, + quoting_character, }; } @@ -178,7 +175,7 @@ ExtractKeyValuePairs::ParsedArguments ExtractKeyValuePairs::parseArguments(const bool with_escaping = with_escaping_character && with_escaping_character == '1'; return ParsedArguments{ - data_column, key_value_pair_delimiter, pair_delimiters, quoting_characters, with_escaping + data_column, key_value_pair_delimiter, pair_delimiters, quoting_character, with_escaping }; } diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/extractKeyValuePairs.h index 26d80272fc7..af4dd464cb3 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/extractKeyValuePairs.h @@ -23,7 +23,7 @@ public: ColumnPtr data_column; CharArgument key_value_pair_delimiter = {}; SetArgument pair_delimiters = {}; - SetArgument quoting_characters = {}; + CharArgument quoting_character = {}; BoolArgument with_escaping = {}; }; diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 2ba4a752203..17d69f51832 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -21,9 +21,9 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(s return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withQuotingCharacters(std::vector quoting_characters_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withQuotingCharacter(char quoting_character_) { - quoting_characters = std::move(quoting_characters_); + quoting_character = quoting_character_; return *this; } @@ -47,8 +47,8 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou { ExtractorConfiguration configuration( key_value_pair_delimiter, - item_delimiters, - quoting_characters + quoting_character, + item_delimiters ); CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( @@ -66,8 +66,8 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithEs { ExtractorConfiguration configuration( key_value_pair_delimiter, - item_delimiters, - quoting_characters + quoting_character, + item_delimiters ); CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler(configuration); diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 47f78f40bdd..b33cd98bc2e 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -16,7 +16,7 @@ public: KeyValuePairExtractorBuilder & withItemDelimiter(std::vector item_delimiters_); - KeyValuePairExtractorBuilder & withQuotingCharacters(std::vector quoting_characters_); + KeyValuePairExtractorBuilder & withQuotingCharacter(char quoting_character_); KeyValuePairExtractorBuilder & withEscaping(); @@ -25,8 +25,8 @@ public: private: bool with_escaping = false; char key_value_pair_delimiter = ':'; + char quoting_character = '"'; std::vector item_delimiters = {' ', ',', ';'}; - std::vector quoting_characters = {'"'}; std::shared_ptr buildWithEscaping(); diff --git a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h index 25e1b0ee951..f88f1bf8bd1 100644 --- a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h +++ b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h @@ -10,14 +10,13 @@ struct ExtractorConfiguration { ExtractorConfiguration( char key_value_delimiter_, - std::vector pair_delimiters_, - std::vector quoting_characters_ - ) : key_value_delimiter(key_value_delimiter_), pair_delimiters(std::move(pair_delimiters_)), quoting_characters(std::move(quoting_characters_)) - {} + char quoting_character_, + std::vector pair_delimiters_ + ) : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) {} const char key_value_delimiter; + const char quoting_character; const std::vector pair_delimiters; - const std::vector quoting_characters; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index ff575c9cb16..1bd65b0fa56 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -18,14 +18,14 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) { BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; - if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + if (quoting_character == character) { return {character_position + 1u, State::READING_ENCLOSED_KEY}; } @@ -48,7 +48,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, { BoundsSafeCharacterFinder finder; - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; key.clear(); @@ -113,7 +113,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz { BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; key.clear(); @@ -145,7 +145,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz } } } - else if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + else if (quoting_character == character) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 9eb7f4eea2a..2c45c8d4403 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -15,14 +15,14 @@ InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfig NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const { - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; if (pos < file.size()) { const auto current_character = file[pos]; - if (std::find(quoting_characters.begin(), quoting_characters.end(), current_character) != quoting_characters.end()) + if (quoting_character == current_character) { return {pos + 1u, State::READING_ENCLOSED_VALUE}; } @@ -47,7 +47,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po { BoundsSafeCharacterFinder finder; - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; value.clear(); @@ -115,7 +115,7 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s { BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; value.clear(); @@ -147,7 +147,7 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s } } } - else if(std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + else if(quoting_character == character) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index c30a2dfff2c..62e3ee5504e 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -17,14 +17,14 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con { BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto & quoting_character = extractor_configuration.quoting_character; while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; - if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + if (quoting_character == character) { return {character_position + 1u, State::READING_ENCLOSED_KEY}; } @@ -41,7 +41,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele { BoundsSafeCharacterFinder finder; - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; key = {}; @@ -80,7 +80,7 @@ NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t { BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; key = {}; @@ -92,7 +92,7 @@ NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t auto character = file[character_position]; auto next_pos = character_position + 1u; - if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + if (quoting_character == character) { key = createElement(file, start_index, character_position); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index e2c145f4d5d..f759186a12e 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -14,14 +14,14 @@ NoEscapingValueStateHandler::NoEscapingValueStateHandler(ExtractorConfiguration NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) const { - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; if (pos < file.size()) { const auto current_character = file[pos]; - if (std::find(quoting_characters.begin(), quoting_characters.end(), current_character) != quoting_characters.end()) + if (quoting_character == current_character) { return {pos + 1u, State::READING_ENCLOSED_VALUE}; } @@ -50,7 +50,7 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E BoundsSafeCharacterFinder finder; - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; while (auto character_position_opt = finder.find_first(file, pos, read_needles)) @@ -83,9 +83,10 @@ NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_ auto start_index = pos; value = {}; + BoundsSafeCharacterFinder finder; - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) { @@ -93,7 +94,7 @@ NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_ auto character = file[character_position]; auto next_pos = character_position + 1u; - if (std::find(quoting_characters.begin(), quoting_characters.end(), character) != quoting_characters.end()) + if (quoting_character == character) { value = createElement(file, start_index, character_position); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp index 76e11fe5e22..3b5294a70cb 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -6,7 +6,7 @@ namespace DB std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration & extractor_configuration) { - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; std::vector needles; @@ -22,7 +22,7 @@ std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & extractor_configuration) { - const auto & [key_value_delimiter, pair_delimiters, quoting_characters] + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; std::vector needles; @@ -30,8 +30,8 @@ std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & e needles.reserve(16u); needles.push_back(key_value_delimiter); + needles.push_back(quoting_character); - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); return needles; @@ -39,13 +39,13 @@ std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & e std::vector NeedleFactory::getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration) { - const auto & quoting_characters = extractor_configuration.quoting_characters; + const auto quoting_character = extractor_configuration.quoting_character; std::vector needles; needles.reserve(16u); - std::copy(quoting_characters.begin(), quoting_characters.end(), std::back_inserter(needles)); + needles.push_back(quoting_character); return needles; } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 1033743ea94..0eaea271320 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -48,9 +48,8 @@ void test_read_enclosed(const InlineEscapingKeyStateHandler & handler, std::stri TEST(InlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; - auto quoting_characters = std::vector{'"'}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -63,12 +62,9 @@ TEST(InlineEscapingKeyStateHandler, Wait) TEST(InlineEscapingKeyStateHandler, Read) { - auto enclosing_character = '"'; - auto pair_delimiters = std::vector{',', ' '}; - auto quoting_characters = std::vector{enclosing_character}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); @@ -92,9 +88,8 @@ TEST(InlineEscapingKeyStateHandler, Read) TEST(InlineEscapingKeyStateHandler, ReadEnclosed) { auto pair_delimiters = std::vector{',', ' '}; - auto quoting_characters = std::vector{'"'}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); std::string regular_key = "name"; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 145e9cf68e1..815d242778f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -15,9 +15,8 @@ void test_wait(const auto & handler, std::string_view input, std::size_t expecte TEST(InlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; - auto quoting_characters = std::vector {'"'}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); InlineEscapingValueStateHandler handler(configuration); test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 5980dc0d2cb..33d049bad97 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -48,9 +48,8 @@ void test_read_enclosed(const auto & handler, std::string_view input, std::strin TEST(NoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; - auto quoting_characters = std::vector{'"'}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); NoEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -66,12 +65,9 @@ TEST(NoEscapingKeyStateHandler, Wait) TEST(NoEscapingKeyStateHandler, Read) { - auto enclosing_character = '"'; - auto pair_delimiters = std::vector{',', ' '}; - auto quoting_characters = std::vector{enclosing_character}; - ExtractorConfiguration configuration(':', pair_delimiters, quoting_characters); + ExtractorConfiguration configuration(':', '"', pair_delimiters); NoEscapingKeyStateHandler handler(configuration); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 842bea71705..c8490ec24f8 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -82,9 +82,9 @@ SELECT x; {} -- semi-colon as pair delimiter --- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'}, last should not be not included +-- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,invalid:invalid', ':', ';') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;invalid1:invalid1,invalid2:invalid2', ':', ';') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -120,3 +120,135 @@ WITH SELECT x; {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +-- NO ESCAPING TESTS +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +-- special (not control) characters in the middle of elements +-- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} +WITH + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} +-- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything +-- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} +WITH + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'amount\\z':'$5\\h','currency':'\\$USD'} +-- standard escape sequences, it should return it as it is +-- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} +WITH + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'key1':'header\nbody','key2':'start_of_text\tend_of_text'} +-- standard escape sequences are covered by unit tests + +-- simple quoting +-- expected output: {'age':'31','name':'neymar','team':'psg'} +WITH + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','team':'psg'} +-- empty values +-- expected output: {'age':'','name':'','nationality':''} +WITH + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'','name':'','nationality':''} +-- empty keys +-- empty keys are not allowed, thus empty output is expected +WITH + extractKeyValuePairs('"":abc, :def', ':', ', ', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{} +-- semi-colon as pair delimiter +-- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +-- both comma and semi-colon as pair delimiters +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +-- single quote as quoting character +-- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +WITH + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '"', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} From ee210bd6dff701ae5fee79ea74bed2ba1f14a4d3 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 16 Mar 2023 11:26:27 -0300 Subject: [PATCH 077/535] input parameter validation, still draft --- src/Functions/CMakeLists.txt | 3 +- src/Functions/keyvaluepair/CMakeLists.txt | 3 +- .../keyvaluepair/api/ArgumentExtractor.cpp | 92 +++++++++++++++++++ .../keyvaluepair/api/ArgumentExtractor.h | 35 +++++++ src/Functions/keyvaluepair/api/CMakeLists.txt | 6 ++ .../api}/extractKeyValuePairs.cpp | 92 +------------------ .../api}/extractKeyValuePairs.h | 20 +--- src/Functions/keyvaluepair/src/CMakeLists.txt | 18 ++-- .../src/KeyValuePairExtractorBuilder.cpp | 18 +--- .../src/KeyValuePairExtractorBuilder.h | 2 +- .../src/impl/state/Configuration.cpp | 66 +++++++++++++ .../src/impl/state/Configuration.h | 37 ++++++++ .../src/impl/state/ExtractorConfiguration.h | 22 ----- .../InlineEscapingKeyStateHandler.cpp | 2 +- .../escaping/InlineEscapingKeyStateHandler.h | 6 +- .../InlineEscapingValueStateHandler.cpp | 2 +- .../InlineEscapingValueStateHandler.h | 6 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 2 +- .../noescaping/NoEscapingKeyStateHandler.h | 6 +- .../NoEscapingValueStateHandler.cpp | 2 +- .../noescaping/NoEscapingValueStateHandler.h | 6 +- .../state/strategies/util/NeedleFactory.cpp | 12 +-- .../state/strategies/util/NeedleFactory.h | 14 +-- ...test_inline_escaping_key_state_handler.cpp | 6 +- ...st_inline_escaping_value_state_handler.cpp | 2 +- .../gtest_no_escaping_key_state_handler.cpp | 4 +- 26 files changed, 295 insertions(+), 189 deletions(-) create mode 100644 src/Functions/keyvaluepair/api/ArgumentExtractor.cpp create mode 100644 src/Functions/keyvaluepair/api/ArgumentExtractor.h create mode 100644 src/Functions/keyvaluepair/api/CMakeLists.txt rename src/Functions/{ => keyvaluepair/api}/extractKeyValuePairs.cpp (71%) rename src/Functions/{ => keyvaluepair/api}/extractKeyValuePairs.h (60%) create mode 100644 src/Functions/keyvaluepair/src/impl/state/Configuration.cpp create mode 100644 src/Functions/keyvaluepair/src/impl/state/Configuration.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 2f5c8a212f2..5a3adbace22 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -104,7 +104,8 @@ add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) add_subdirectory(keyvaluepair) -list (APPEND OBJECT_LIBS $) +list (APPEND OBJECT_LIBS $) +list (APPEND OBJECT_LIBS $) # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) diff --git a/src/Functions/keyvaluepair/CMakeLists.txt b/src/Functions/keyvaluepair/CMakeLists.txt index 130b119d8e1..6cedfe8bf10 100644 --- a/src/Functions/keyvaluepair/CMakeLists.txt +++ b/src/Functions/keyvaluepair/CMakeLists.txt @@ -1 +1,2 @@ -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) +add_subdirectory(api) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp new file mode 100644 index 00000000000..d29c412a885 --- /dev/null +++ b/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp @@ -0,0 +1,92 @@ +#include "ArgumentExtractor.h" + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int BAD_ARGUMENTS; +} + +ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithTypeAndName & arguments) +{ + /* + * TODO validate arguments: + * 1. Check if argument is one of the acceptable characters for that argument + * 2. Check if it's not empty + * 3. Cross check arguments? Not sure it is needed anymore + * 4. Use uint8_t column instead of string column for escaping lol + * 5. maybe a builder will clean things up here + * 6. Refactor exceptions so it's re-thrown on API side + * */ + + if (arguments.empty()) + { + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function extractKeyValuePairs requires at least one argument"); + } + + auto data_column = arguments[0].column; + + if (arguments.size() == 1u) + { + return ParsedArguments{data_column}; + } + + auto key_value_pair_delimiter = extractControlCharacter(arguments[1].column); + + if (arguments.size() == 2u) + { + return ParsedArguments {data_column, key_value_pair_delimiter}; + } + + auto pair_delimiters_characters = arguments[2].column->getDataAt(0).toView(); + + VectorArgument pair_delimiters {pair_delimiters_characters.begin(), pair_delimiters_characters.end()}; + + if (arguments.size() == 3u) + { + return ParsedArguments { + data_column, key_value_pair_delimiter, pair_delimiters + }; + } + + auto quoting_character = extractControlCharacter(arguments[3].column); + + if (arguments.size() == 4u) + { + return ParsedArguments { + data_column, + key_value_pair_delimiter, + pair_delimiters, + quoting_character, + }; + } + + auto with_escaping_character = extractControlCharacter(arguments[4].column); + + bool with_escaping = with_escaping_character && with_escaping_character == '1'; + + return ParsedArguments { + data_column, key_value_pair_delimiter, pair_delimiters, quoting_character, with_escaping + }; +} + +ArgumentExtractor::CharArgument ArgumentExtractor::extractControlCharacter(ColumnPtr column) +{ + auto view = column->getDataAt(0).toView(); + + if (view.empty()) + { + return {}; + } + else if (view.size() == 1u) + { + return view.front(); + } + + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); +} + +} + diff --git a/src/Functions/keyvaluepair/api/ArgumentExtractor.h b/src/Functions/keyvaluepair/api/ArgumentExtractor.h new file mode 100644 index 00000000000..5f5854ba5b9 --- /dev/null +++ b/src/Functions/keyvaluepair/api/ArgumentExtractor.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include +#include + +namespace DB +{ + +class ArgumentExtractor +{ +public: + using CharArgument = std::optional; + using VectorArgument = std::vector; + using BoolArgument = std::optional; + + struct ParsedArguments + { + ColumnPtr data_column; + + CharArgument key_value_pair_delimiter = {}; + VectorArgument pair_delimiters = {}; + CharArgument quoting_character = {}; + BoolArgument with_escaping = {}; + }; + + + static ParsedArguments extract(const ColumnsWithTypeAndName & arguments); + +private: + static ArgumentExtractor::CharArgument extractControlCharacter(ColumnPtr column); +}; + +} diff --git a/src/Functions/keyvaluepair/api/CMakeLists.txt b/src/Functions/keyvaluepair/api/CMakeLists.txt new file mode 100644 index 00000000000..d5390eeb3e3 --- /dev/null +++ b/src/Functions/keyvaluepair/api/CMakeLists.txt @@ -0,0 +1,6 @@ +include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_api .) + +add_library(clickhouse_functions_extractkeyvaluepairs_api ${clickhouse_functions_extractkeyvaluepairs_api_sources} ${clickhouse_functions_extractkeyvaluepairs_api_headers}) + +target_link_libraries(clickhouse_functions_extractkeyvaluepairs_api PRIVATE dbms clickhouse_functions_extractkeyvaluepairs_core) \ No newline at end of file diff --git a/src/Functions/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp similarity index 71% rename from src/Functions/extractKeyValuePairs.cpp rename to src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp index 4a47b7003f5..1229f958c21 100644 --- a/src/Functions/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp @@ -13,12 +13,6 @@ namespace DB { -namespace ErrorCodes -{ - extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int BAD_ARGUMENTS; -} - ExtractKeyValuePairs::ExtractKeyValuePairs() : return_type(std::make_shared(std::make_shared(), std::make_shared())) { @@ -59,7 +53,7 @@ static ColumnPtr extract(ColumnPtr data_column, std::shared_ptrgetDataAt(0).toView(); - - SetArgument pair_delimiters; - - pair_delimiters.insert(pair_delimiters_characters.begin(), pair_delimiters_characters.end()); - - if (arguments.size() == 3u) - { - return ParsedArguments{ - data_column, key_value_pair_delimiter, pair_delimiters - }; - } - - auto quoting_character = extractControlCharacter(arguments[3].column); - - if (arguments.size() == 4u) - { - return ParsedArguments{ - data_column, - key_value_pair_delimiter, - pair_delimiters, - quoting_character, - }; - } - - auto with_escaping_character = extractControlCharacter(arguments[4].column); - - bool with_escaping = with_escaping_character && with_escaping_character == '1'; - - return ParsedArguments{ - data_column, key_value_pair_delimiter, pair_delimiters, quoting_character, with_escaping - }; -} - -ExtractKeyValuePairs::CharArgument ExtractKeyValuePairs::extractControlCharacter(ColumnPtr column) -{ - auto view = column->getDataAt(0).toView(); - - if (view.empty()) - { - return {}; - } - else if (view.size() == 1u) - { - return view.front(); - } - - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); -} - ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const { return {1, 2, 3, 4, 5}; diff --git a/src/Functions/extractKeyValuePairs.h b/src/Functions/keyvaluepair/api/extractKeyValuePairs.h similarity index 60% rename from src/Functions/extractKeyValuePairs.h rename to src/Functions/keyvaluepair/api/extractKeyValuePairs.h index af4dd464cb3..082da40138f 100644 --- a/src/Functions/extractKeyValuePairs.h +++ b/src/Functions/keyvaluepair/api/extractKeyValuePairs.h @@ -7,6 +7,7 @@ #include #include #include +#include "ArgumentExtractor.h" namespace DB { @@ -14,19 +15,6 @@ namespace DB class ExtractKeyValuePairs : public IFunction { public: - using CharArgument = std::optional; - using SetArgument = std::unordered_set; - using BoolArgument = std::optional; - - struct ParsedArguments - { - ColumnPtr data_column; - CharArgument key_value_pair_delimiter = {}; - SetArgument pair_delimiters = {}; - CharArgument quoting_character = {}; - BoolArgument with_escaping = {}; - }; - ExtractKeyValuePairs(); static constexpr auto name = "extractKeyValuePairs"; @@ -48,11 +36,7 @@ public: private: DataTypePtr return_type; - static ParsedArguments parseArguments(const ColumnsWithTypeAndName & arguments); - - static CharArgument extractControlCharacter(ColumnPtr column); - - static auto getExtractor(const ParsedArguments & parsed_arguments); + static auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments); ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt index 62de3bdad70..ae30de13f6a 100644 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ b/src/Functions/keyvaluepair/src/CMakeLists.txt @@ -1,12 +1,12 @@ include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/escaping) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/noescaping) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl/state/strategies/util) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core .) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/escaping) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/noescaping) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/util) -add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) +add_library(clickhouse_functions_extractkeyvaluepairs_core ${clickhouse_functions_extractkeyvaluepairs_core_sources} ${clickhouse_functions_extractkeyvaluepairs_core_headers}) -target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) \ No newline at end of file +target_link_libraries(clickhouse_functions_extractkeyvaluepairs_core PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 17d69f51832..6cc17e5916d 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -4,7 +4,7 @@ #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "impl/CHKeyValuePairExtractor.h" -#include "impl/state/ExtractorConfiguration.h" +#include "impl/state/Configuration.h" namespace DB { @@ -15,7 +15,7 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDel return *this; } -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiter(std::vector item_delimiters_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withItemDelimiters(std::vector item_delimiters_) { item_delimiters = std::move(item_delimiters_); return *this; @@ -45,11 +45,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() { - ExtractorConfiguration configuration( - key_value_pair_delimiter, - quoting_character, - item_delimiters - ); + auto configuration = ConfigurationFactory::create(key_value_pair_delimiter, quoting_character, item_delimiters); CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( configuration @@ -64,17 +60,13 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { - ExtractorConfiguration configuration( - key_value_pair_delimiter, - quoting_character, - item_delimiters - ); + auto configuration = ConfigurationFactory::create(key_value_pair_delimiter, quoting_character, item_delimiters); CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler(configuration); CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler(configuration); - return std::make_shared>(key_state_handler, value_state_handler); + return std::make_shared>(key_state_handler, value_state_handler); } } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index b33cd98bc2e..da04c1c93d5 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -14,7 +14,7 @@ public: KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); - KeyValuePairExtractorBuilder & withItemDelimiter(std::vector item_delimiters_); + KeyValuePairExtractorBuilder & withItemDelimiters(std::vector item_delimiters_); KeyValuePairExtractorBuilder & withQuotingCharacter(char quoting_character_); diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp new file mode 100644 index 00000000000..3db51c56949 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp @@ -0,0 +1,66 @@ +#include "Configuration.h" +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +Configuration::Configuration(char key_value_delimiter_, char quoting_character_, std::vector pair_delimiters_) + : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) {} + + +Configuration ConfigurationFactory::create(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) +{ + validateKeyValueDelimiter(key_value_delimiter); + validateQuotingCharacter(quoting_character); + validatePairDelimiters(pair_delimiters); + + return Configuration(key_value_delimiter, quoting_character, pair_delimiters); +} + +void ConfigurationFactory::validateKeyValueDelimiter(char key_value_delimiter) +{ + static const std::unordered_set VALID_KV_DELIMITERS = {'=', ':'}; + + if (!VALID_KV_DELIMITERS.contains(key_value_delimiter)) + { + throw Exception( + ErrorCodes::BAD_ARGUMENTS, + "Invalid key value delimiter '{}'. It must be one of: '{}'", key_value_delimiter, fmt::join(VALID_KV_DELIMITERS, ", ")); + } +} + +void ConfigurationFactory::validateQuotingCharacter(char quoting_character) +{ + static const std::unordered_set VALID_QUOTING_CHARACTERS = {'"', '\''}; + + if (!VALID_QUOTING_CHARACTERS.contains(quoting_character)) + { + throw Exception( + ErrorCodes::BAD_ARGUMENTS, + "Invalid quoting character '{}'. It must be one of: '{}'", quoting_character, fmt::join(VALID_QUOTING_CHARACTERS, ", ")); + } +} + +void ConfigurationFactory::validatePairDelimiters(const std::vector & pair_delimiters) +{ + static const std::unordered_set VALID_PAIR_DELIMITERS_CHARACTERS = {' ', ',', ';', 0x1}; + + for (auto delimiter : pair_delimiters) + { + if (!VALID_PAIR_DELIMITERS_CHARACTERS.contains(delimiter)) + { + throw Exception( + ErrorCodes::BAD_ARGUMENTS, + "Invalid pair delimiter '{}'. It must be one of: '{}'", delimiter, fmt::join(VALID_PAIR_DELIMITERS_CHARACTERS, ", ")); + } + } +} + +} + diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.h b/src/Functions/keyvaluepair/src/impl/state/Configuration.h new file mode 100644 index 00000000000..808f952f929 --- /dev/null +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +namespace DB +{ + +struct ConfigurationFactory; + +class Configuration +{ + friend struct ConfigurationFactory; + + Configuration( + char key_value_delimiter_, + char quoting_character_, + std::vector pair_delimiters_ + ); + +public: + const char key_value_delimiter; + const char quoting_character; + const std::vector pair_delimiters; +}; + +struct ConfigurationFactory +{ +public: + static Configuration create(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); + +private: + static void validateKeyValueDelimiter(char key_value_delimiter); + static void validateQuotingCharacter(char quoting_character); + static void validatePairDelimiters(const std::vector & pair_delimiters); +}; + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h b/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h deleted file mode 100644 index f88f1bf8bd1..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include -#include - -namespace DB -{ - -struct ExtractorConfiguration -{ - ExtractorConfiguration( - char key_value_delimiter_, - char quoting_character_, - std::vector pair_delimiters_ - ) : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) {} - - const char key_value_delimiter; - const char quoting_character; - const std::vector pair_delimiters; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index 1bd65b0fa56..af18d1ed2b4 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -6,7 +6,7 @@ namespace DB { -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_) +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(Configuration configuration_) : extractor_configuration(std::move(configuration_)) { wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h index c93e2d5c8a5..6f7d8bd69d4 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include namespace DB @@ -13,7 +13,7 @@ class InlineEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string; - explicit InlineEscapingKeyStateHandler(ExtractorConfiguration configuration_); + explicit InlineEscapingKeyStateHandler(Configuration configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -24,7 +24,7 @@ public: [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: - ExtractorConfiguration extractor_configuration; + Configuration extractor_configuration; std::vector wait_needles; std::vector read_needles; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 2c45c8d4403..85623ddfe2d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -6,7 +6,7 @@ namespace DB { -InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) +InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(Configuration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index 599add94848..e7c0c5494bf 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -2,7 +2,7 @@ #include #include -#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/Configuration.h" #include "Functions/keyvaluepair/src/impl/state/State.h" #include "Functions/keyvaluepair/src/impl/state/StateHandler.h" @@ -14,7 +14,7 @@ class InlineEscapingValueStateHandler : public StateHandler public: using ElementType = std::string; - explicit InlineEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); + explicit InlineEscapingValueStateHandler(Configuration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -25,7 +25,7 @@ public: [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: - ExtractorConfiguration extractor_configuration; + Configuration extractor_configuration; std::vector read_needles; std::vector read_quoted_needles; }; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index 62e3ee5504e..c25a7c1b87b 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -5,7 +5,7 @@ namespace DB { -NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(ExtractorConfiguration extractor_configuration_) +NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(Configuration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h index e5dab139445..d7476c4e248 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h @@ -1,6 +1,6 @@ #pragma once -#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/Configuration.h" #include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB @@ -11,7 +11,7 @@ class NoEscapingKeyStateHandler : public StateHandler public: using ElementType = std::string_view; - explicit NoEscapingKeyStateHandler(ExtractorConfiguration extractor_configuration_); + explicit NoEscapingKeyStateHandler(Configuration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -22,7 +22,7 @@ public: [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; private: - ExtractorConfiguration extractor_configuration; + Configuration extractor_configuration; std::vector wait_needles; std::vector read_needles; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index f759186a12e..dfe86c09320 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -5,7 +5,7 @@ namespace DB { -NoEscapingValueStateHandler::NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_) +NoEscapingValueStateHandler::NoEscapingValueStateHandler(Configuration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { read_needles = NeedleFactory::getReadNeedles(extractor_configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index 04525c1b9ab..7a6da5b3796 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Functions/keyvaluepair/src/impl/state/ExtractorConfiguration.h" +#include "Functions/keyvaluepair/src/impl/state/Configuration.h" #include "Functions/keyvaluepair/src/impl/state/StateHandler.h" namespace DB @@ -12,7 +12,7 @@ class NoEscapingValueStateHandler : public StateHandler public: using ElementType = std::string_view; - explicit NoEscapingValueStateHandler(ExtractorConfiguration extractor_configuration_); + explicit NoEscapingValueStateHandler(Configuration extractor_configuration_); [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; @@ -23,7 +23,7 @@ public: [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); private: - ExtractorConfiguration extractor_configuration; + Configuration extractor_configuration; std::vector read_needles; std::vector read_quoted_needles; }; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp index 3b5294a70cb..394b14b2515 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -4,7 +4,7 @@ namespace DB { -std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration & extractor_configuration) +std::vector NeedleFactory::getWaitNeedles(const DB::Configuration & extractor_configuration) { const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; @@ -20,7 +20,7 @@ std::vector NeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration return needles; } -std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & extractor_configuration) +std::vector NeedleFactory::getReadNeedles(const Configuration & extractor_configuration) { const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; @@ -37,7 +37,7 @@ std::vector NeedleFactory::getReadNeedles(const ExtractorConfiguration & e return needles; } -std::vector NeedleFactory::getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration) +std::vector NeedleFactory::getReadQuotedNeedles(const Configuration & extractor_configuration) { const auto quoting_character = extractor_configuration.quoting_character; @@ -50,7 +50,7 @@ std::vector NeedleFactory::getReadQuotedNeedles(const ExtractorConfigurati return needles; } -std::vector EscapingNeedleFactory::getWaitNeedles(const DB::ExtractorConfiguration & extractor_configuration) +std::vector EscapingNeedleFactory::getWaitNeedles(const DB::Configuration & extractor_configuration) { auto needles = NeedleFactory::getWaitNeedles(extractor_configuration); @@ -59,7 +59,7 @@ std::vector EscapingNeedleFactory::getWaitNeedles(const DB::ExtractorConfi return needles; } -std::vector EscapingNeedleFactory::getReadNeedles(const ExtractorConfiguration & extractor_configuration) +std::vector EscapingNeedleFactory::getReadNeedles(const Configuration & extractor_configuration) { auto needles = NeedleFactory::getReadNeedles(extractor_configuration); @@ -68,7 +68,7 @@ std::vector EscapingNeedleFactory::getReadNeedles(const ExtractorConfigura return needles; } -std::vector EscapingNeedleFactory::getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration) +std::vector EscapingNeedleFactory::getReadQuotedNeedles(const Configuration & extractor_configuration) { auto needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h index 1a578fb7f13..6ae83507d5c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h @@ -2,7 +2,7 @@ #include -#include +#include namespace DB { @@ -14,17 +14,17 @@ class NeedleFactory { static constexpr auto NEEDLE_SIZE = 16u; public: - static std::vector getWaitNeedles(const ExtractorConfiguration & extractor_configuration); - static std::vector getReadNeedles(const ExtractorConfiguration & extractor_configuration); - static std::vector getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getWaitNeedles(const Configuration & extractor_configuration); + static std::vector getReadNeedles(const Configuration & extractor_configuration); + static std::vector getReadQuotedNeedles(const Configuration & extractor_configuration); }; class EscapingNeedleFactory { public: - static std::vector getWaitNeedles(const ExtractorConfiguration & extractor_configuration); - static std::vector getReadNeedles(const ExtractorConfiguration & extractor_configuration); - static std::vector getReadQuotedNeedles(const ExtractorConfiguration & extractor_configuration); + static std::vector getWaitNeedles(const Configuration & extractor_configuration); + static std::vector getReadNeedles(const Configuration & extractor_configuration); + static std::vector getReadQuotedNeedles(const Configuration & extractor_configuration); }; } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 0eaea271320..50798a46656 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -49,7 +49,7 @@ TEST(InlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -64,7 +64,7 @@ TEST(InlineEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); @@ -89,7 +89,7 @@ TEST(InlineEscapingKeyStateHandler, ReadEnclosed) { auto pair_delimiters = std::vector{',', ' '}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); std::string regular_key = "name"; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 815d242778f..2ea7138b242 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -16,7 +16,7 @@ TEST(InlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); InlineEscapingValueStateHandler handler(configuration); test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 33d049bad97..c11827d8cf7 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -49,7 +49,7 @@ TEST(NoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); NoEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -67,7 +67,7 @@ TEST(NoEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; - ExtractorConfiguration configuration(':', '"', pair_delimiters); + Configuration configuration(':', '"', pair_delimiters); NoEscapingKeyStateHandler handler(configuration); From 2f2d7133c55861563e78444ed82733a33e6581b4 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:27:35 +0100 Subject: [PATCH 078/535] Fix build --- src/Client/PacketReceiver.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Client/PacketReceiver.cpp b/src/Client/PacketReceiver.cpp index 3dddd71ed65..7c6dbb19212 100644 --- a/src/Client/PacketReceiver.cpp +++ b/src/Client/PacketReceiver.cpp @@ -1,5 +1,7 @@ #include +#if defined(OS_LINUX) + namespace DB { @@ -68,3 +70,5 @@ void PacketReceiver::Task::run(AsyncCallback async_callback, ResumeCallback susp } } + +#endif From 09faf121d634cfbdd285fa210e91122c9e8c0b51 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 16 Mar 2023 14:01:40 -0300 Subject: [PATCH 079/535] cross check parameters --- .../src/KeyValuePairExtractorBuilder.cpp | 4 +- .../src/impl/state/Configuration.cpp | 61 +++++++++---------- .../src/impl/state/Configuration.h | 8 +-- 3 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 6cc17e5916d..015f98aa6ee 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -45,7 +45,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() { - auto configuration = ConfigurationFactory::create(key_value_pair_delimiter, quoting_character, item_delimiters); + auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( configuration @@ -60,7 +60,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() { - auto configuration = ConfigurationFactory::create(key_value_pair_delimiter, quoting_character, item_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler(configuration); diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp index 3db51c56949..69faa0a1081 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp @@ -1,7 +1,8 @@ #include "Configuration.h" -#include #include +#include + namespace DB { @@ -11,56 +12,52 @@ namespace ErrorCodes } Configuration::Configuration(char key_value_delimiter_, char quoting_character_, std::vector pair_delimiters_) - : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) {} - - -Configuration ConfigurationFactory::create(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) + : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) { - validateKeyValueDelimiter(key_value_delimiter); - validateQuotingCharacter(quoting_character); - validatePairDelimiters(pair_delimiters); +} + +Configuration ConfigurationFactory::createWithoutEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) +{ + validate(key_value_delimiter, quoting_character, pair_delimiters); return Configuration(key_value_delimiter, quoting_character, pair_delimiters); } -void ConfigurationFactory::validateKeyValueDelimiter(char key_value_delimiter) +Configuration ConfigurationFactory::createWithEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) { - static const std::unordered_set VALID_KV_DELIMITERS = {'=', ':'}; - - if (!VALID_KV_DELIMITERS.contains(key_value_delimiter)) + if (key_value_delimiter == EscapedCharacterReader::ESCAPE_CHARACTER || quoting_character == EscapedCharacterReader::ESCAPE_CHARACTER) { throw Exception( ErrorCodes::BAD_ARGUMENTS, - "Invalid key value delimiter '{}'. It must be one of: '{}'", key_value_delimiter, fmt::join(VALID_KV_DELIMITERS, ", ")); + "Invalid arguments, {} is reserved for the escaping character", + EscapedCharacterReader::ESCAPE_CHARACTER); } + + return createWithoutEscaping(key_value_delimiter, quoting_character, pair_delimiters); } -void ConfigurationFactory::validateQuotingCharacter(char quoting_character) +void ConfigurationFactory::validate(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) { - static const std::unordered_set VALID_QUOTING_CHARACTERS = {'"', '\''}; - - if (!VALID_QUOTING_CHARACTERS.contains(quoting_character)) + if (key_value_delimiter == quoting_character) { - throw Exception( - ErrorCodes::BAD_ARGUMENTS, - "Invalid quoting character '{}'. It must be one of: '{}'", quoting_character, fmt::join(VALID_QUOTING_CHARACTERS, ", ")); + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, key_value_delimiter and quoting_character can not be the same"); } -} -void ConfigurationFactory::validatePairDelimiters(const std::vector & pair_delimiters) -{ - static const std::unordered_set VALID_PAIR_DELIMITERS_CHARACTERS = {' ', ',', ';', 0x1}; + bool is_key_value_delimiter_in_pair_delimiters + = std::find(pair_delimiters.begin(), pair_delimiters.end(), key_value_delimiter) != pair_delimiters.end(); - for (auto delimiter : pair_delimiters) + if (is_key_value_delimiter_in_pair_delimiters) { - if (!VALID_PAIR_DELIMITERS_CHARACTERS.contains(delimiter)) - { - throw Exception( - ErrorCodes::BAD_ARGUMENTS, - "Invalid pair delimiter '{}'. It must be one of: '{}'", delimiter, fmt::join(VALID_PAIR_DELIMITERS_CHARACTERS, ", ")); - } + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, key_value_delimiter conflicts with pair delimiters"); + } + + bool is_quoting_character_in_pair_delimiters + = std::find(pair_delimiters.begin(), pair_delimiters.end(), quoting_character) != pair_delimiters.end(); + + if (is_quoting_character_in_pair_delimiters) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, quoting_character conflicts with pair delimiters"); } } } - diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.h b/src/Functions/keyvaluepair/src/impl/state/Configuration.h index 808f952f929..7294cd1ebc2 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.h +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.h @@ -26,12 +26,12 @@ public: struct ConfigurationFactory { public: - static Configuration create(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); + static Configuration createWithoutEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); + + static Configuration createWithEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); private: - static void validateKeyValueDelimiter(char key_value_delimiter); - static void validateQuotingCharacter(char quoting_character); - static void validatePairDelimiters(const std::vector & pair_delimiters); + static void validate(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); }; } From c4cb3a565a8d9e8cc797470f50ad7376372e3df9 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 16 Mar 2023 17:41:49 -0300 Subject: [PATCH 080/535] add some more input validation --- .../keyvaluepair/api/ArgumentExtractor.cpp | 4 -- .../src/impl/state/Configuration.cpp | 12 ++++ .../src/impl/state/Configuration.h | 2 + .../InlineEscapingKeyStateHandler.cpp | 6 +- .../InlineEscapingValueStateHandler.cpp | 4 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 6 +- .../NoEscapingValueStateHandler.cpp | 4 +- .../state/strategies/util/CharacterFinder.cpp | 41 ++++++------ .../state/strategies/util/CharacterFinder.h | 13 ++-- .../tests/gtest_character_finder.cpp | 5 +- ...test_inline_escaping_key_state_handler.cpp | 8 ++- ...st_inline_escaping_value_state_handler.cpp | 2 +- .../gtest_no_escaping_key_state_handler.cpp | 5 +- ...t_key_value_pairs_multiple_input.reference | 2 +- ...extract_key_value_pairs_multiple_input.sql | 65 ++++++++++++++++++- 15 files changed, 126 insertions(+), 53 deletions(-) diff --git a/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp index d29c412a885..0ba87fab531 100644 --- a/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp @@ -13,12 +13,8 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT { /* * TODO validate arguments: - * 1. Check if argument is one of the acceptable characters for that argument * 2. Check if it's not empty - * 3. Cross check arguments? Not sure it is needed anymore * 4. Use uint8_t column instead of string column for escaping lol - * 5. maybe a builder will clean things up here - * 6. Refactor exceptions so it's re-thrown on API side * */ if (arguments.empty()) diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp index 69faa0a1081..1ae9b306813 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp @@ -43,6 +43,18 @@ void ConfigurationFactory::validate(char key_value_delimiter, char quoting_chara throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, key_value_delimiter and quoting_character can not be the same"); } + if (pair_delimiters.size() > MAX_NUMBER_OF_PAIR_DELIMITERS) + { + // SSE optimizations require needles to contain up to 16 characters. Needles can be a concatenation of multiple parameters, including + // quoting_character, key_value_delimiter and pair delimiters. Limiting to 8 to be on the safe side. + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, pair delimiters can contain at most {} characters", MAX_NUMBER_OF_PAIR_DELIMITERS); + } + + if (pair_delimiters.empty()) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, pair delimiters list is empty"); + } + bool is_key_value_delimiter_in_pair_delimiters = std::find(pair_delimiters.begin(), pair_delimiters.end(), key_value_delimiter) != pair_delimiters.end(); diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.h b/src/Functions/keyvaluepair/src/impl/state/Configuration.h index 7294cd1ebc2..36414ae5013 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.h +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.h @@ -32,6 +32,8 @@ public: private: static void validate(char key_value_delimiter, char quoting_character, std::vector pair_delimiters); + + static constexpr auto MAX_NUMBER_OF_PAIR_DELIMITERS = 8u; }; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index af18d1ed2b4..018104d4980 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -20,7 +20,7 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const auto quoting_character = extractor_configuration.quoting_character; - while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) + while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -58,7 +58,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -117,7 +117,7 @@ NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, siz key.clear(); - while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 85623ddfe2d..8b9e9e19920 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -57,7 +57,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po * It might help updating current pos? * */ - while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -119,7 +119,7 @@ NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, s value.clear(); - while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index c25a7c1b87b..6df4eaefec2 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -19,7 +19,7 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con const auto & quoting_character = extractor_configuration.quoting_character; - while (auto character_position_opt = finder.find_first_not(file, pos, wait_needles)) + while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -48,7 +48,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele auto start_index = pos; - while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -86,7 +86,7 @@ NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t auto start_index = pos; - while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index dfe86c09320..55c55e384fd 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -53,7 +53,7 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; - while (auto character_position_opt = finder.find_first(file, pos, read_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; @@ -88,7 +88,7 @@ NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_ const auto quoting_character = extractor_configuration.quoting_character; - while (auto character_position_opt = finder.find_first(file, pos, read_quoted_needles)) + while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) { auto character_position = *character_position_opt; auto character = file[character_position]; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp index 171646ca55f..4805bdb6b76 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp @@ -5,15 +5,6 @@ namespace DB { -template -constexpr uint16_t maybe_negate(uint16_t x) -{ - if constexpr (positive) - return x; - else - return ~x; -} - template constexpr bool maybe_negate(bool x) { @@ -76,19 +67,22 @@ auto find_first_symbols_sse42(std::string_view haystack, std::string_view needle return find_first_symbols_sse42(haystack.begin(), haystack.end(), needle.begin(), needle.size()); } -std::optional CharacterFinder::find_first(std::string_view haystack, const std::vector & needles) +std::optional CharacterFinder::findFirst(std::string_view haystack, const std::vector & needles) { - if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + if (!needles.empty()) { - return ptr - haystack.begin(); + if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + { + return ptr - haystack.begin(); + } } return std::nullopt; } -std::optional CharacterFinder::find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) +std::optional CharacterFinder::findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles) { - if (auto position = find_first({haystack.begin() + offset, haystack.end()}, needles)) + if (auto position = findFirst({haystack.begin() + offset, haystack.end()}, needles)) { return offset + *position; } @@ -96,8 +90,13 @@ std::optional CharacterFinder::find_first(std::string return std::nullopt; } -std::optional CharacterFinder::find_first_not(std::string_view haystack, const std::vector & needles) +std::optional CharacterFinder::findFirstNot(std::string_view haystack, const std::vector & needles) { + if (needles.empty()) + { + return 0u; + } + if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) { return ptr - haystack.begin(); @@ -106,9 +105,9 @@ std::optional CharacterFinder::find_first_not(std::st return std::nullopt; } -std::optional CharacterFinder::find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) +std::optional CharacterFinder::findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles) { - if (auto position = find_first_not({haystack.begin() + offset, haystack.end()}, needles)) + if (auto position = findFirstNot({haystack.begin() + offset, haystack.end()}, needles)) { return offset + *position; } @@ -116,25 +115,25 @@ std::optional CharacterFinder::find_first_not(std::st return std::nullopt; } -std::optional BoundsSafeCharacterFinder::find_first( +std::optional BoundsSafeCharacterFinder::findFirst( std::string_view haystack, std::size_t offset, const std::vector & needles ) const { if (haystack.size() > offset) { - return CharacterFinder::find_first(haystack, offset, needles); + return CharacterFinder::findFirst(haystack, offset, needles); } return std::nullopt; } -std::optional BoundsSafeCharacterFinder::find_first_not( +std::optional BoundsSafeCharacterFinder::findFirstNot( std::string_view haystack, std::size_t offset, const std::vector & needles ) const { if (haystack.size() > offset) { - return CharacterFinder::find_first_not(haystack, offset, needles); + return CharacterFinder::findFirstNot(haystack, offset, needles); } return std::nullopt; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h index b0d9979fc9c..3f518a51c41 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h @@ -11,16 +11,15 @@ class CharacterFinder { public: using Position = std::size_t; - virtual ~CharacterFinder() = default; - static std::optional find_first(std::string_view haystack, const std::vector & needles); + static std::optional findFirst(std::string_view haystack, const std::vector & needles); - static std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles); + static std::optional findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles); - static std::optional find_first_not(std::string_view haystack, const std::vector & needles); + static std::optional findFirstNot(std::string_view haystack, const std::vector & needles); - static std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles); + static std::optional findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles); }; @@ -31,9 +30,9 @@ class BoundsSafeCharacterFinder { using Position = std::size_t; public: - std::optional find_first(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + std::optional findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles) const; - std::optional find_first_not(std::string_view haystack, std::size_t offset, const std::vector & needles) const; + std::optional findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles) const; }; } diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp index 8a53a6663ab..2bc80c93999 100644 --- a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp @@ -1,6 +1,5 @@ #include #include -#include "base/find_symbols.h" namespace DB @@ -9,7 +8,7 @@ void test_find_first( const CharacterFinder& finder, const std::string_view& haystack, const std::vector& needles, const std::optional>& expected_result) { - auto pos = finder.find_first(haystack, needles); + auto pos = finder.findFirst(haystack, needles); ASSERT_EQ(pos.has_value(), expected_result.has_value()); @@ -24,7 +23,7 @@ void test_find_first( void test_find_first_not(const CharacterFinder& finder, const std::string_view& haystack, const std::vector& needles, const std::optional>& expected_result) { - auto pos = finder.find_first_not(haystack, needles); + auto pos = finder.findFirstNot(haystack, needles); ASSERT_EQ(pos.has_value(), expected_result.has_value()); diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 50798a46656..de253cd0c54 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -49,7 +49,8 @@ TEST(InlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); + InlineEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -64,7 +65,7 @@ TEST(InlineEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); InlineEscapingKeyStateHandler handler(configuration); @@ -89,7 +90,8 @@ TEST(InlineEscapingKeyStateHandler, ReadEnclosed) { auto pair_delimiters = std::vector{',', ' '}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); + InlineEscapingKeyStateHandler handler(configuration); std::string regular_key = "name"; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 2ea7138b242..cc7411342c9 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -16,7 +16,7 @@ TEST(InlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); InlineEscapingValueStateHandler handler(configuration); test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index c11827d8cf7..63f2e71c322 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -49,7 +49,8 @@ TEST(NoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); + NoEscapingKeyStateHandler handler(configuration); test_wait(handler, "name", 0u, READING_KEY); @@ -67,7 +68,7 @@ TEST(NoEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; - Configuration configuration(':', '"', pair_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); NoEscapingKeyStateHandler handler(configuration); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index c8490ec24f8..7aa3fce4e57 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -242,7 +242,7 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '"', '0') AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index b9866079708..b76beac4c9f 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -242,7 +242,70 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '"', '0') AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- { echoOff } + +-- cross parameter validation tests +-- should fail because key value delimiter conflicts with pair delimiters +WITH + extractKeyValuePairs('not_important', ':', ',:', '\'', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError BAD_ARGUMENTS} + +-- should fail because key value delimiter conflicts with quoting characters +WITH + extractKeyValuePairs('not_important', ':', ',', '\':', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError BAD_ARGUMENTS} + +-- should fail because pair delimiters conflicts with quoting characters +WITH + extractKeyValuePairs('not_important', ':', ',', ',', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError BAD_ARGUMENTS} + +-- should fail because pair delimiters can contain at most 8 characters +WITH + extractKeyValuePairs('not_important', ':', '123456789', '\'', '0') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError BAD_ARGUMENTS} + +-- should not fail because pair delimiters contains 8 characters, which is within the limit +WITH + extractKeyValuePairs('not_important', ':', '12345678', '\'', '0') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) From c22475a531c1d7a765bba7dd22de39ff2f45a7f8 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Mar 2023 09:46:29 -0300 Subject: [PATCH 081/535] minor changes --- .../impl/state/strategies/util/EscapedCharacterReader.cpp | 6 +++--- .../src/impl/state/strategies/util/NeedleFactory.cpp | 6 +++--- .../src/impl/state/strategies/util/NeedleFactory.h | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp index 2071c64628e..f556d736323 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp @@ -102,11 +102,11 @@ std::optional EscapedCharacterReader::readEscapedSequence(std::string_v auto number_of_bytes_to_read = std::min(max_number_of_bytes_to_read, str.size()); - auto cut = std::string_view {str.begin(), str.begin() + number_of_bytes_to_read}; + auto view_containing_the_bytes_to_be_read = std::string_view {str.begin(), str.begin() + number_of_bytes_to_read}; - auto read_character = toInt(cut, base); + auto read_character = toInt(view_containing_the_bytes_to_be_read, base); - str = {cut.begin(), str.end()}; + str = {view_containing_the_bytes_to_be_read.begin(), str.end()}; return read_character; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp index 394b14b2515..a9279c12cf7 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -11,7 +11,7 @@ std::vector NeedleFactory::getWaitNeedles(const DB::Configuration & extrac std::vector needles; - needles.reserve(16u); + needles.reserve(NEEDLE_SIZE); needles.push_back(key_value_delimiter); @@ -27,7 +27,7 @@ std::vector NeedleFactory::getReadNeedles(const Configuration & extractor_ std::vector needles; - needles.reserve(16u); + needles.reserve(NEEDLE_SIZE); needles.push_back(key_value_delimiter); needles.push_back(quoting_character); @@ -43,7 +43,7 @@ std::vector NeedleFactory::getReadQuotedNeedles(const Configuration & extr std::vector needles; - needles.reserve(16u); + needles.reserve(NEEDLE_SIZE); needles.push_back(quoting_character); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h index 6ae83507d5c..43920091ab6 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h @@ -9,6 +9,9 @@ namespace DB /* * Did not spend much time here, running against the clock :) + * + * Takes in the Configuration and outputs the characters of interest for each state. + * Those characters will be later used in string look-ups like `find_first` and `find_first_not` * */ class NeedleFactory { From 0569620a81cf4f4132830619e1c93cd23fd6f96d Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Mar 2023 09:59:16 -0300 Subject: [PATCH 082/535] remove all usages of the word enclosed and use quoted instead --- .../src/impl/CHKeyValuePairExtractor.h | 8 ++++---- .../keyvaluepair/src/impl/state/State.h | 12 ++++++------ .../keyvaluepair/src/impl/state/StateHandler.h | 8 ++++---- .../escaping/InlineEscapingKeyStateHandler.cpp | 4 ++-- .../escaping/InlineEscapingKeyStateHandler.h | 2 +- .../InlineEscapingValueStateHandler.cpp | 4 ++-- .../escaping/InlineEscapingValueStateHandler.h | 2 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 4 ++-- .../noescaping/NoEscapingKeyStateHandler.h | 2 +- .../noescaping/NoEscapingValueStateHandler.cpp | 4 ++-- .../noescaping/NoEscapingValueStateHandler.h | 2 +- ...gtest_inline_escaping_key_state_handler.cpp | 18 +++++++++--------- ...est_inline_escaping_value_state_handler.cpp | 8 -------- .../gtest_no_escaping_key_state_handler.cpp | 12 ++++++------ 14 files changed, 41 insertions(+), 49 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index c106d80e88e..5e2153cf5b7 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -60,16 +60,16 @@ private: return key_state_handler.wait(file, pos); case State::READING_KEY: return key_state_handler.read(file, pos, key); - case State::READING_ENCLOSED_KEY: - return key_state_handler.readEnclosed(file, pos, key); + case State::READING_QUOTED_KEY: + return key_state_handler.readQuoted(file, pos, key); case State::READING_KV_DELIMITER: return key_state_handler.readKeyValueDelimiter(file, pos); case State::WAITING_VALUE: return value_state_handler.wait(file, pos); case State::READING_VALUE: return value_state_handler.read(file, pos, value); - case State::READING_ENCLOSED_VALUE: - return value_state_handler.readEnclosed(file, pos, value); + case State::READING_QUOTED_VALUE: + return value_state_handler.readQuoted(file, pos, value); case State::READING_EMPTY_VALUE: return value_state_handler.readEmpty(file, pos, value); case State::FLUSH_PAIR: diff --git a/src/Functions/keyvaluepair/src/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h index 32249a843fe..95ac0e66a72 100644 --- a/src/Functions/keyvaluepair/src/impl/state/State.h +++ b/src/Functions/keyvaluepair/src/impl/state/State.h @@ -7,20 +7,20 @@ namespace DB enum State { - // Skip characters until it finds a valid first key character. Might jump to READING_KEY, READING_ENCLOSED_KEY or END. + // Skip characters until it finds a valid first key character. Might jump to READING_KEY, READING_QUOTED_KEY or END. WAITING_KEY, // Tries to read a key. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KEY, - // Tries to read an enclosed/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. - READING_ENCLOSED_KEY, + // Tries to read an quoted/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. + READING_QUOTED_KEY, // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KV_DELIMITER, - // Skip characters until it finds a valid first value character. Might jump to READING_ENCLOSED_VALUE, READING_EMPTY_VALUE or READING_VALUE. + // Skip characters until it finds a valid first value character. Might jump to READING_QUOTED_VALUE, READING_EMPTY_VALUE or READING_VALUE. WAITING_VALUE, // Tries to read a value. Jumps to FLUSH_PAIR. READING_VALUE, - // Tries to read an enclosed/ quoted value. Might jump to FLUSH_PAIR or END. - READING_ENCLOSED_VALUE, + // Tries to read an quoted/ quoted value. Might jump to FLUSH_PAIR or END. + READING_QUOTED_VALUE, // "Reads" an empty value. Jumps to FLUSH_PAIR. READING_EMPTY_VALUE, // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 9451576071c..43ca24df712 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -13,7 +13,7 @@ concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) { { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; }; @@ -22,7 +22,7 @@ concept CNoEscapingKeyStateHandler = requires(KeyStateHandler handler) { { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; }; @@ -34,7 +34,7 @@ concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) { { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; }; @@ -43,7 +43,7 @@ concept CNoEscapingValueStateHandler = requires(ValueStateHandler handler) { { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEnclosed(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; }; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index 018104d4980..ead4c21fda2 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -27,7 +27,7 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) if (quoting_character == character) { - return {character_position + 1u, State::READING_ENCLOSED_KEY}; + return {character_position + 1u, State::READING_QUOTED_KEY}; } else { @@ -109,7 +109,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, return {file.size(), State::END}; } -NextState InlineEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const +NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & key) const { BoundsSafeCharacterFinder finder; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h index 6f7d8bd69d4..2f49b9419ae 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h @@ -19,7 +19,7 @@ public: [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 8b9e9e19920..90bbc65e713 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -24,7 +24,7 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po if (quoting_character == current_character) { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; + return {pos + 1u, State::READING_QUOTED_VALUE}; } else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) { @@ -111,7 +111,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po return {pos, State::FLUSH_PAIR}; } -NextState InlineEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const +NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & value) const { BoundsSafeCharacterFinder finder; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index e7c0c5494bf..e12888755e8 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -20,7 +20,7 @@ public: [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index 6df4eaefec2..a4bce2aafd0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -26,7 +26,7 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con if (quoting_character == character) { - return {character_position + 1u, State::READING_ENCLOSED_KEY}; + return {character_position + 1u, State::READING_QUOTED_KEY}; } else { @@ -76,7 +76,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele return {file.size(), State::END}; } -NextState NoEscapingKeyStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & key) const +NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & key) const { BoundsSafeCharacterFinder finder; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h index d7476c4e248..ad53272e110 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h @@ -17,7 +17,7 @@ public: [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index 55c55e384fd..1e0ab179932 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -23,7 +23,7 @@ NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) c if (quoting_character == current_character) { - return {pos + 1u, State::READING_ENCLOSED_VALUE}; + return {pos + 1u, State::READING_QUOTED_VALUE}; } else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) { @@ -78,7 +78,7 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E return {file.size(), State::FLUSH_PAIR}; } -NextState NoEscapingValueStateHandler::readEnclosed(std::string_view file, size_t pos, ElementType & value) const +NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & value) const { auto start_index = pos; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index 7a6da5b3796..3858b032fa6 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -18,7 +18,7 @@ public: [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] NextState readEnclosed(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index de253cd0c54..3fd2d141689 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -12,16 +12,16 @@ void test_wait(const InlineEscapingKeyStateHandler & handler, std::string_view i ASSERT_EQ(next_state.state, expected_state); } -template +template void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { NextState next_state; std::string element; - if constexpr (enclosed) + if constexpr (quoted) { - next_state = handler.readEnclosed(input, 0u, element); + next_state = handler.readQuoted(input, 0u, element); } else { @@ -39,7 +39,7 @@ void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view i test_read(handler, input, expected_element, expected_pos, expected_state); } -void test_read_enclosed(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read_quoted(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); @@ -55,7 +55,7 @@ TEST(InlineEscapingKeyStateHandler, Wait) test_wait(handler, "name", 0u, READING_KEY); test_wait(handler, "\\:name", 2u, READING_KEY); - test_wait(handler, R"(\\"name)", 3u, READING_ENCLOSED_KEY); + test_wait(handler, R"(\\"name)", 3u, READING_QUOTED_KEY); test_wait(handler, "", 0u, END); test_wait(handler, "\\\\", 2u, END); @@ -101,10 +101,10 @@ TEST(InlineEscapingKeyStateHandler, ReadEnclosed) std::string key_with_escape_character = regular_key + R"(\n\x4E")"; - test_read_enclosed(handler, regular_key, "", regular_key.size(), END); - test_read_enclosed(handler, regular_key_with_end_quote, regular_key, regular_key_with_end_quote.size(), READING_KV_DELIMITER); - test_read_enclosed(handler, key_with_special_characters_with_end_quote, key_with_special_characters, key_with_special_characters_with_end_quote.size(), READING_KV_DELIMITER); - test_read_enclosed(handler, key_with_escape_character, regular_key + "\nN", key_with_escape_character.size(), READING_KV_DELIMITER); + test_read_quoted(handler, regular_key, "", regular_key.size(), END); + test_read_quoted(handler, regular_key_with_end_quote, regular_key, regular_key_with_end_quote.size(), READING_KV_DELIMITER); + test_read_quoted(handler, key_with_special_characters_with_end_quote, key_with_special_characters, key_with_special_characters_with_end_quote.size(), READING_KV_DELIMITER); + test_read_quoted(handler, key_with_escape_character, regular_key + "\nN", key_with_escape_character.size(), READING_KV_DELIMITER); } } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index cc7411342c9..c91ba8f1b09 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -20,14 +20,6 @@ TEST(InlineEscapingValueStateHandler, Wait) InlineEscapingValueStateHandler handler(configuration); test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); - -// -// test_wait(handler, "name", 0u, READING_KEY); -// test_wait(handler, "\\:name", 2u, READING_KEY); -// test_wait(handler, R"(\\"name)", 3u, READING_ENCLOSED_KEY); -// -// test_wait(handler, "", 0u, END); -// test_wait(handler, "\\\\", 2u, END); } } diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 63f2e71c322..999f9624c29 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -12,16 +12,16 @@ void test_wait(const auto & handler, std::string_view input, std::size_t expecte ASSERT_EQ(next_state.state, expected_state); } -template +template void test_read(const auto & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { NextState next_state; std::string_view element; - if constexpr (enclosed) + if constexpr (quoted) { - next_state = handler.readEnclosed(input, 0u, element); + next_state = handler.readQuoted(input, 0u, element); } else { @@ -39,7 +39,7 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex test_read(handler, input, expected_element, expected_pos, expected_state); } -void test_read_enclosed(const auto & handler, std::string_view input, std::string_view expected_element, +void test_read_quoted(const auto & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); @@ -56,10 +56,10 @@ TEST(NoEscapingKeyStateHandler, Wait) test_wait(handler, "name", 0u, READING_KEY); test_wait(handler, "\\:name", 0u, READING_KEY); // quoted expected pos is + 1 because as of now it is skipped, maybe I should change it - test_wait(handler, "\"name", 1u, READING_ENCLOSED_KEY); + test_wait(handler, "\"name", 1u, READING_QUOTED_KEY); test_wait(handler, ", $name", 3u, READING_KEY); - test_wait(handler, ", $\"name", 4u, READING_ENCLOSED_KEY); + test_wait(handler, ", $\"name", 4u, READING_QUOTED_KEY); test_wait(handler, "", 0u, END); } From 4b46b5b748b37d88d516c039c9ec33d7759fda3a Mon Sep 17 00:00:00 2001 From: avogar Date: Fri, 17 Mar 2023 13:02:20 +0000 Subject: [PATCH 083/535] Fix, make better --- src/Client/PacketReceiver.h | 4 +- .../array/structureToProtobufSchema.cpp | 3 ++ src/Processors/Sources/RemoteSource.cpp | 19 ++++++- src/QueryPipeline/RemoteQueryExecutor.cpp | 51 ++++++++++++++++--- src/QueryPipeline/RemoteQueryExecutor.h | 4 +- .../RemoteQueryExecutorReadContext.cpp | 12 ++++- .../RemoteQueryExecutorReadContext.h | 6 ++- 7 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/Functions/array/structureToProtobufSchema.cpp diff --git a/src/Client/PacketReceiver.h b/src/Client/PacketReceiver.h index 37fdfa252c8..99e5f7c2f10 100644 --- a/src/Client/PacketReceiver.h +++ b/src/Client/PacketReceiver.h @@ -25,7 +25,7 @@ class PacketReceiver : public AsyncTaskExecutor public: explicit PacketReceiver(Connection * connection_); - bool isPacketReady() const { return !is_read_in_process && !is_timeout_expired; } + bool isPacketReady() const { return !is_read_in_process && !is_timeout_expired && !exception; } Packet getPacket() { return std::move(packet); } bool hasException() const { return exception.operator bool(); } @@ -49,6 +49,8 @@ private: void processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType, const std::string &, uint32_t) override; void clearAsyncEvent() override; + void processException(std::exception_ptr e) override { exception = e; } + struct Task : public AsyncTask { Task(PacketReceiver & receiver_) : receiver(receiver_) {} diff --git a/src/Functions/array/structureToProtobufSchema.cpp b/src/Functions/array/structureToProtobufSchema.cpp new file mode 100644 index 00000000000..86a145f76b4 --- /dev/null +++ b/src/Functions/array/structureToProtobufSchema.cpp @@ -0,0 +1,3 @@ +// +// Created by Павел Круглов on 16/03/2023. +// diff --git a/src/Processors/Sources/RemoteSource.cpp b/src/Processors/Sources/RemoteSource.cpp index c07990f57e2..9cd22ee6c86 100644 --- a/src/Processors/Sources/RemoteSource.cpp +++ b/src/Processors/Sources/RemoteSource.cpp @@ -110,7 +110,22 @@ std::optional RemoteSource::tryGenerate() rows_before_limit->set(info.getRowsBeforeLimit()); }); - query_executor->sendQuery(); + if (async_read) + { + int fd_ = query_executor->sendQueryAsync(); + if (fd_ >= 0) + { + fd = fd_; + is_async_state = true; + return Chunk(); + } + + is_async_state = false; + } + else + { + query_executor->sendQuery(); + } was_query_sent = true; } @@ -119,7 +134,7 @@ std::optional RemoteSource::tryGenerate() if (async_read) { - auto res = query_executor->asyncRead(); + auto res = query_executor->readAsync(); if (res.getType() == RemoteQueryExecutor::ReadResult::Type::Nothing) throw Exception(ErrorCodes::LOGICAL_ERROR, "Got an empty packet from the RemoteQueryExecutor. This is a bug"); diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index e0276501683..f49318d1a58 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -153,7 +153,7 @@ RemoteQueryExecutor::~RemoteQueryExecutor() * all connections, then read and skip the remaining packets to make sure * these connections did not remain hanging in the out-of-sync state. */ - if (established || isQueryPending()) + if (established || (isQueryPending() && connections)) connections->disconnect(); } @@ -218,6 +218,13 @@ void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind, AsyncCallb if (needToSkipUnavailableShard()) return; + /// Query could be cancelled during creating connections and this code can be executed + /// inside read_context->cancel() under was_cancelled_mutex, it can happen only when + /// was_cancelled = true (because it's set to true before calling read_context->cancel()) + /// To avoid deadlock, we should check was_cancelled before locking was_cancelled_mutex. + if (was_cancelled) + return; + /// Query cannot be canceled in the middle of the send query, /// since there are multiple packets: /// - Query @@ -252,6 +259,26 @@ void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind, AsyncCallb sendExternalTables(); } +int RemoteQueryExecutor::sendQueryAsync() +{ + if (!read_context) + { + std::lock_guard lock(was_cancelled_mutex); + read_context = std::make_unique(*this, /*suspend_when_query_sent*/ true); + } + + /// If query already sent, do nothing. Note that we cannot use sent_query flag here, + /// because we can still be in process of sending scalars or external tables. + if (read_context->isQuerySent()) + return -1; + + read_context->resume(); + + if (!read_context->isQuerySent()) + return read_context->getFileDescriptor(); + + return -1; +} Block RemoteQueryExecutor::readBlock() { @@ -292,7 +319,7 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::read() } } -RemoteQueryExecutor::ReadResult RemoteQueryExecutor::asyncRead() +RemoteQueryExecutor::ReadResult RemoteQueryExecutor::readAsync() { #if defined(OS_LINUX) if (!read_context || (resent_query && recreate_read_context)) @@ -356,7 +383,7 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::restartQueryWithoutDuplicat if (!read_context) return read(); else - return asyncRead(); + return readAsync(); } throw Exception(ErrorCodes::DUPLICATED_PART_UUIDS, "Found duplicate uuids while processing query"); } @@ -517,6 +544,10 @@ void RemoteQueryExecutor::finish() /// Send the request to abort the execution of the request, if not already sent. tryCancel("Cancelling query because enough data has been read"); + /// If connections weren't created yet, nothing to do. + if (!connections) + return; + /// Get the remaining packets so that there is no out of sync in the connections to the replicas. Packet packet = connections->drain(); switch (packet.type) @@ -647,15 +678,19 @@ void RemoteQueryExecutor::tryCancel(const char * reason) if (read_context) read_context->cancel(); - connections->sendCancel(); - - if (log) - LOG_TRACE(log, "({}) {}", connections->dumpAddresses(), reason); + /// Query could be cancelled during connection creation, we should check + /// if connections were already created. + if (connections && sent_query) + { + connections->sendCancel(); + if (log) + LOG_TRACE(log, "({}) {}", connections->dumpAddresses(), reason); + } } bool RemoteQueryExecutor::isQueryPending() const { - return sent_query && !finished; + return read_context && !finished; } bool RemoteQueryExecutor::hasThrownException() const diff --git a/src/QueryPipeline/RemoteQueryExecutor.h b/src/QueryPipeline/RemoteQueryExecutor.h index b17d7e85609..98c5968a4b7 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.h +++ b/src/QueryPipeline/RemoteQueryExecutor.h @@ -90,6 +90,8 @@ public: /// and it should pass INITIAL_QUERY. void sendQuery(ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::SECONDARY_QUERY, AsyncCallback async_callback = {}); + int sendQueryAsync(); + /// Query is resent to a replica, the query itself can be modified. std::atomic resent_query { false }; std::atomic recreate_read_context { false }; @@ -146,7 +148,7 @@ public: ReadResult read(); /// Async variant of read. Returns ready block or file descriptor which may be used for polling. - ReadResult asyncRead(); + ReadResult readAsync(); /// Receive all remain packets and finish query. /// It should be cancelled after read returned empty block. diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp index a71f413ffb5..b053c6cd9d9 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp @@ -18,8 +18,8 @@ namespace ErrorCodes extern const int SOCKET_TIMEOUT; } -RemoteQueryExecutorReadContext::RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_) - : AsyncTaskExecutor(std::make_unique(*this)), executor(executor_) +RemoteQueryExecutorReadContext::RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_, bool suspend_when_query_sent_) + : AsyncTaskExecutor(std::make_unique(*this)), executor(executor_), suspend_when_query_sent(suspend_when_query_sent_) { if (-1 == pipe2(pipe_fd, O_NONBLOCK)) throwFromErrno("Cannot create pipe", ErrorCodes::CANNOT_OPEN_FILE); @@ -37,6 +37,10 @@ bool RemoteQueryExecutorReadContext::checkBeforeTaskResume() void RemoteQueryExecutorReadContext::Task::run(AsyncCallback async_callback, ResumeCallback suspend_callback) { read_context.executor.sendQuery(ClientInfo::QueryKind::SECONDARY_QUERY, async_callback); + read_context.is_query_sent = true; + + if (read_context.suspend_when_query_sent) + suspend_callback(); if (read_context.executor.needToSkipUnavailableShard()) return; @@ -108,6 +112,10 @@ void RemoteQueryExecutorReadContext::cancelImpl() /// (disconnected), so it will not left in an unsynchronised state. if (!is_timer_alarmed) { + /// If query wasn't sent, just complete sending it. + if (!is_query_sent) + suspend_when_query_sent = true; + /// Wait for current pending packet, to avoid leaving connection in unsynchronised state. while (is_in_progress.load(std::memory_order_relaxed)) { diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.h b/src/QueryPipeline/RemoteQueryExecutorReadContext.h index 2413bc1f81e..f0f2c8d55a2 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.h +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.h @@ -27,7 +27,7 @@ class RemoteQueryExecutor; class RemoteQueryExecutorReadContext : public AsyncTaskExecutor { public: - explicit RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_); + explicit RemoteQueryExecutorReadContext(RemoteQueryExecutor & executor_, bool suspend_when_query_sent_ = false); ~RemoteQueryExecutorReadContext() override; @@ -35,6 +35,8 @@ public: bool isCancelled() const { return AsyncTaskExecutor::isCancelled() || is_pipe_alarmed; } + bool isQuerySent() const { return is_query_sent; } + int getFileDescriptor() const { return epoll.getFileDescriptor(); } Packet getPacket() { return std::move(packet); } @@ -80,6 +82,8 @@ private: Epoll epoll; std::string connection_fd_description; + bool suspend_when_query_sent = false; + bool is_query_sent = false; }; } From 3d459ebaa2ca3f9865214e45da29a8b005a7e4ed Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Mar 2023 10:18:47 -0300 Subject: [PATCH 084/535] more tests --- ...t_key_value_pairs_multiple_input.reference | 14 +++++++ ...extract_key_value_pairs_multiple_input.sql | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 7aa3fce4e57..72866e239d6 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -14,6 +14,19 @@ WITH SELECT x; {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} +-- keys and values starting with number, underscore and other special characters +-- expected output: {'$nationality':'@brazil','1name':'neymar','4ge':'31','_team':'_psg'} +WITH + extractKeyValuePairs('1name:neymar, 4ge:31 _team:_psg,$nationality:@brazil') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'$nationality':'@brazil','1name':'neymar','4ge':'31','_team':'_psg'} -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH @@ -252,3 +265,4 @@ WITH SELECT x; {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +{} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index b76beac4c9f..5f96fd9306b 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -14,6 +14,32 @@ WITH SELECT x; +-- keys and values starting with number, underscore and other special characters +-- expected output: {'$nationality':'@brazil','1name':'neymar','4ge':'31','_team':'_psg'} +WITH + extractKeyValuePairs('1name:neymar, 4ge:31 _team:_psg,$nationality:@brazil') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + +-- only special characters +-- expected output: {'#':'#','$':'$','@':'@','_':'_'} +WITH + extractKeyValuePairs('_:_, @:@ #:#,$:$') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH @@ -40,6 +66,19 @@ WITH SELECT x; +-- invalid escape sequence, should be discarded +-- expected output: {'valid_key':'valid_value'} +WITH + extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; + -- standard escape sequences are covered by unit tests -- simple quoting From 8f6a7cc2685a76b6e5ff5854c58faef316368dc6 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Mar 2023 10:22:25 -0300 Subject: [PATCH 085/535] update reference --- ...t_key_value_pairs_multiple_input.reference | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 72866e239d6..5fb9998181c 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -27,6 +27,19 @@ WITH SELECT x; {'$nationality':'@brazil','1name':'neymar','4ge':'31','_team':'_psg'} +-- only special characters +-- expected output: {'#':'#','$':'$','@':'@','_':'_'} +WITH + extractKeyValuePairs('_:_, @:@ #:#,$:$') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'#':'#','$':'$','@':'@','_':'_'} -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH @@ -53,6 +66,19 @@ WITH SELECT x; {'amount\\z':'$5\\h','currency':'\\$USD'} +-- invalid escape sequence, should be discarded +-- expected output: {'valid_key':'valid_value'} +WITH + extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; +{'valid_key':'valid_value'} -- standard escape sequences are covered by unit tests -- simple quoting From f9af3995d3b84c685c7d6dd65a5ed883d041069e Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 17 Mar 2023 14:05:22 -0300 Subject: [PATCH 086/535] remove stale reference --- .../state/strategies/noescaping/NoEscapingKeyStateHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index a4bce2aafd0..80c91e7279a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -17,7 +17,7 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con { BoundsSafeCharacterFinder finder; - const auto & quoting_character = extractor_configuration.quoting_character; + const auto quoting_character = extractor_configuration.quoting_character; while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) { From c677be1ccd5cc2ab15afd5d4372eb6a8467a2f5c Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 20 Mar 2023 13:16:55 -0300 Subject: [PATCH 087/535] validate pair delimiters does not contain escape character --- src/Functions/keyvaluepair/src/impl/state/Configuration.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp index 1ae9b306813..9f69652b893 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp @@ -25,7 +25,9 @@ Configuration ConfigurationFactory::createWithoutEscaping(char key_value_delimit Configuration ConfigurationFactory::createWithEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) { - if (key_value_delimiter == EscapedCharacterReader::ESCAPE_CHARACTER || quoting_character == EscapedCharacterReader::ESCAPE_CHARACTER) + if (key_value_delimiter == EscapedCharacterReader::ESCAPE_CHARACTER + || quoting_character == EscapedCharacterReader::ESCAPE_CHARACTER + || std::find(pair_delimiters.begin(), pair_delimiters.end(), EscapedCharacterReader::ESCAPE_CHARACTER) != pair_delimiters.end()) { throw Exception( ErrorCodes::BAD_ARGUMENTS, From 662848fe76d41261d4b7d309bf88990f6c3f2423 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 20 Mar 2023 13:25:03 -0300 Subject: [PATCH 088/535] remove reading_empty state --- .../keyvaluepair/src/impl/CHKeyValuePairExtractor.h | 2 -- src/Functions/keyvaluepair/src/impl/state/State.h | 4 +--- .../keyvaluepair/src/impl/state/StateHandler.h | 2 -- .../escaping/InlineEscapingValueStateHandler.cpp | 12 +----------- .../escaping/InlineEscapingValueStateHandler.h | 2 -- .../noescaping/NoEscapingValueStateHandler.cpp | 12 +----------- .../noescaping/NoEscapingValueStateHandler.h | 2 -- 7 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index 5e2153cf5b7..5f0ff4614de 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -70,8 +70,6 @@ private: return value_state_handler.read(file, pos, value); case State::READING_QUOTED_VALUE: return value_state_handler.readQuoted(file, pos, value); - case State::READING_EMPTY_VALUE: - return value_state_handler.readEmpty(file, pos, value); case State::FLUSH_PAIR: return flushPair(file, pos, key, value, keys, values, row_offset); case END: diff --git a/src/Functions/keyvaluepair/src/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h index 95ac0e66a72..8e9c920e7c3 100644 --- a/src/Functions/keyvaluepair/src/impl/state/State.h +++ b/src/Functions/keyvaluepair/src/impl/state/State.h @@ -15,14 +15,12 @@ enum State READING_QUOTED_KEY, // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KV_DELIMITER, - // Skip characters until it finds a valid first value character. Might jump to READING_QUOTED_VALUE, READING_EMPTY_VALUE or READING_VALUE. + // Skip characters until it finds a valid first value character. Might jump to READING_QUOTED_VALUE or READING_VALUE. WAITING_VALUE, // Tries to read a value. Jumps to FLUSH_PAIR. READING_VALUE, // Tries to read an quoted/ quoted value. Might jump to FLUSH_PAIR or END. READING_QUOTED_VALUE, - // "Reads" an empty value. Jumps to FLUSH_PAIR. - READING_EMPTY_VALUE, // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. FLUSH_PAIR, END diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 43ca24df712..21f5ac3640c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -35,7 +35,6 @@ concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; }; template @@ -44,7 +43,6 @@ concept CNoEscapingValueStateHandler = requires(ValueStateHandler handler) { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readEmpty(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; }; template diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 90bbc65e713..954a3c469c0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -26,10 +26,6 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po { return {pos + 1u, State::READING_QUOTED_VALUE}; } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) - { - return {pos, State::READING_EMPTY_VALUE}; - } else if (key_value_delimiter == current_character) { return {pos, State::WAITING_KEY}; @@ -40,7 +36,7 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po } } - return {pos, State::READING_EMPTY_VALUE}; + return {pos, State::READING_VALUE}; } NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const @@ -164,10 +160,4 @@ NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, siz return {pos, State::END}; } -NextState InlineEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) -{ - value.clear(); - return {pos + 1, State::FLUSH_PAIR}; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h index e12888755e8..5412ef82f8b 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h @@ -22,8 +22,6 @@ public: [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); - private: Configuration extractor_configuration; std::vector read_needles; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index 1e0ab179932..76b12dab19b 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -25,10 +25,6 @@ NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) c { return {pos + 1u, State::READING_QUOTED_VALUE}; } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), current_character) != pair_delimiters.end()) - { - return {pos, State::READING_EMPTY_VALUE}; - } else if (key_value_delimiter == current_character) { return {pos, State::WAITING_KEY}; @@ -39,7 +35,7 @@ NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) c } } - return {file.size(), State::READING_EMPTY_VALUE}; + return {file.size(), State::READING_VALUE}; } NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const @@ -107,10 +103,4 @@ NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, size_t return {file.size(), State::END}; } -NextState NoEscapingValueStateHandler::readEmpty(std::string_view, size_t pos, ElementType & value) -{ - value = {}; - return {pos + 1, State::FLUSH_PAIR}; -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index 3858b032fa6..1a58da9c1f9 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -20,8 +20,6 @@ public: [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; - [[nodiscard]] static NextState readEmpty(std::string_view, size_t pos, ElementType & value); - private: Configuration extractor_configuration; std::vector read_needles; From c3244d7f2d0ca78626ac54dc1de9ea68776cf988 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 20 Mar 2023 13:25:48 -0300 Subject: [PATCH 089/535] remove needles size check inside find_first_symbols --- .../src/impl/state/strategies/util/CharacterFinder.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp index 4805bdb6b76..d7e0e9cac71 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp @@ -32,9 +32,6 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha #if defined(__SSE4_2__) constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - if (num_chars > 16) - throw std::runtime_error("Needle is too big"); - const __m128i set = _mm_loadu_si128(reinterpret_cast(needle)); for (; pos + 15 < end; pos += 16) From 15f5a468e92c9e4572e34be360fd78a8798597fb Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 20 Mar 2023 17:56:01 +0000 Subject: [PATCH 090/535] Clean --- src/Functions/array/structureToProtobufSchema.cpp | 3 --- src/QueryPipeline/RemoteQueryExecutor.cpp | 8 ++------ 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 src/Functions/array/structureToProtobufSchema.cpp diff --git a/src/Functions/array/structureToProtobufSchema.cpp b/src/Functions/array/structureToProtobufSchema.cpp deleted file mode 100644 index 86a145f76b4..00000000000 --- a/src/Functions/array/structureToProtobufSchema.cpp +++ /dev/null @@ -1,3 +0,0 @@ -// -// Created by Павел Круглов on 16/03/2023. -// diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index 1a40fca2197..4168c178a66 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -21,7 +21,6 @@ #include #include #include -#include namespace ProfileEvents @@ -545,8 +544,8 @@ void RemoteQueryExecutor::finish() /// Send the request to abort the execution of the request, if not already sent. tryCancel("Cancelling query because enough data has been read"); - /// If connections weren't created yet, nothing to do. - if (!connections) + /// If connections weren't created yet or query wasn't sent, nothing to do. + if (!connections || !sent_query) return; /// Get the remaining packets so that there is no out of sync in the connections to the replicas. @@ -627,9 +626,6 @@ void RemoteQueryExecutor::sendExternalTables() for (const auto & table : external_tables) { StoragePtr cur = table.second; - /// Send only temporary tables with StorageMemory - if (!std::dynamic_pointer_cast(cur)) - continue; auto data = std::make_unique(); data->table_name = table.first; From c12869681be13d1303e566570cf84a5d1f796199 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 20 Mar 2023 15:26:00 -0300 Subject: [PATCH 091/535] move runtime find_first_symbols to find_symbols.h --- base/base/find_symbols.h | 72 +++++++++++++++++++ .../state/strategies/util/CharacterFinder.cpp | 65 +---------------- 2 files changed, 75 insertions(+), 62 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 83f53773ae7..de27fe1df01 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -38,6 +38,19 @@ namespace detail { template constexpr bool is_in(char x) { return ((x == chars) || ...); } +static bool is_in(char c, const char * symbols, size_t num_chars) +{ + for (auto i = 0u; i < num_chars; i++) + { + if (c == symbols[i]) + { + return true; + } + } + + return false; +} + #if defined(__SSE2__) template inline __m128i mm_is_in(__m128i bytes) @@ -194,6 +207,46 @@ inline const char * find_first_symbols_dispatch(const char * begin, const char * return find_first_symbols_sse2(begin, end); } +template +inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * symbols, size_t num_chars) +{ + const char * pos = begin; + +#if defined(__SSE4_2__) + constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; + + const __m128i set = _mm_loadu_si128(reinterpret_cast(symbols)); + + for (; pos + 15 < end; pos += 16) + { + __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); + + if constexpr (positive) + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode); + } + else + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY); + } + } +#endif + + for (; pos < end; ++pos) + if (maybe_negate(is_in(*pos, symbols, num_chars))) + return pos; + + return return_mode == ReturnMode::End ? end : nullptr; +} + +template +auto find_first_symbols_sse42(std::string_view haystack, std::string_view symbols) +{ + return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols.begin(), symbols.size()); +} + } @@ -211,6 +264,11 @@ inline char * find_first_symbols(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } +inline const char * find_first_symbols(std::string_view haystack, std::string_view symbols) +{ + return detail::find_first_symbols_sse42(haystack, symbols); +} + template inline const char * find_first_not_symbols(const char * begin, const char * end) { @@ -223,6 +281,11 @@ inline char * find_first_not_symbols(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } +inline const char * find_first_not_symbols(std::string_view haystack, std::string_view symbols) +{ + return detail::find_first_symbols_sse42(haystack, symbols); +} + template inline const char * find_first_symbols_or_null(const char * begin, const char * end) { @@ -235,6 +298,11 @@ inline char * find_first_symbols_or_null(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } +inline const char * find_first_symbols_or_null(std::string_view haystack, std::string_view symbols) +{ + return detail::find_first_symbols_sse42(haystack, symbols); +} + template inline const char * find_first_not_symbols_or_null(const char * begin, const char * end) { @@ -247,6 +315,10 @@ inline char * find_first_not_symbols_or_null(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } +inline const char * find_first_not_symbols_or_null(std::string_view haystack, std::string_view symbols) +{ + return detail::find_first_symbols_sse42(haystack, symbols); +} template inline const char * find_last_symbols_or_null(const char * begin, const char * end) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp index d7e0e9cac71..14dbb804d34 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp @@ -1,74 +1,15 @@ #include "CharacterFinder.h" -#include +#include namespace DB { -template -constexpr bool maybe_negate(bool x) -{ - return positive == x; -} - -static bool is_in(char c, const char * needles, size_t num_chars) -{ - for (auto i = 0u; i < num_chars; i++) - { - if (c == needles[i]) - { - return true; - } - } - - return false; -} - -template -inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * needle, size_t num_chars) -{ - const char * pos = begin; - -#if defined(__SSE4_2__) - constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - - const __m128i set = _mm_loadu_si128(reinterpret_cast(needle)); - - for (; pos + 15 < end; pos += 16) - { - __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); - - if constexpr (positive) - { - if (_mm_cmpestrc(set, num_chars, bytes, 16, mode)) - return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode); - } - else - { - if (_mm_cmpestrc(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY)) - return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY); - } - } -#endif - - for (; pos < end; ++pos) - if (maybe_negate(is_in(*pos, needle, num_chars))) - return pos; - - return nullptr; -} - -template -auto find_first_symbols_sse42(std::string_view haystack, std::string_view needle) -{ - return find_first_symbols_sse42(haystack.begin(), haystack.end(), needle.begin(), needle.size()); -} - std::optional CharacterFinder::findFirst(std::string_view haystack, const std::vector & needles) { if (!needles.empty()) { - if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + if (const auto * ptr = find_first_symbols_or_null(haystack, {needles.begin(), needles.end()})) { return ptr - haystack.begin(); } @@ -94,7 +35,7 @@ std::optional CharacterFinder::findFirstNot(std::stri return 0u; } - if (const auto * ptr = find_first_symbols_sse42(haystack, {needles.begin(), needles.end()})) + if (const auto * ptr = find_first_not_symbols_or_null(haystack, {needles.begin(), needles.end()})) { return ptr - haystack.begin(); } From ba389c2a3d121f25ce58ca866ffe3403efb22f0a Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 20 Mar 2023 19:06:02 +0000 Subject: [PATCH 092/535] Fix --- src/Processors/examples/protobuf.cpp | 26 +++++++++++++++++++++++ src/QueryPipeline/RemoteQueryExecutor.cpp | 4 ++++ 2 files changed, 30 insertions(+) create mode 100644 src/Processors/examples/protobuf.cpp diff --git a/src/Processors/examples/protobuf.cpp b/src/Processors/examples/protobuf.cpp new file mode 100644 index 00000000000..ee60f80d11a --- /dev/null +++ b/src/Processors/examples/protobuf.cpp @@ -0,0 +1,26 @@ +#include + +struct ErrorCollector : public google::protobuf::compiler::MultiFileErrorCollector +{ + void AddError(const std::string&, int, int, const std::string& msg) override + { + throw std::runtime_error(msg); + } +}; + +int main() +{ + google::protobuf::compiler::DiskSourceTree disk_source_tree; + disk_source_tree.MapPath("", "schemas/"); + ErrorCollector collector; + google::protobuf::compiler::Importer importer(&disk_source_tree, &collector); + try + { + importer.Import("schema.proto"); + } + catch() + { + } + + importer.pool()->FindMessageTypeByName("Schema"); +} diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index 4168c178a66..f6eba27d50c 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace ProfileEvents @@ -626,6 +627,9 @@ void RemoteQueryExecutor::sendExternalTables() for (const auto & table : external_tables) { StoragePtr cur = table.second; + /// Send only temporary tables with StorageMemory + if (!std::dynamic_pointer_cast(cur)) + continue; auto data = std::make_unique(); data->table_name = table.first; From 5312763425c4421b475701bd899420b3a18ea6d8 Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 20 Mar 2023 19:07:06 +0000 Subject: [PATCH 093/535] Clean --- src/Processors/examples/protobuf.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/Processors/examples/protobuf.cpp diff --git a/src/Processors/examples/protobuf.cpp b/src/Processors/examples/protobuf.cpp deleted file mode 100644 index ee60f80d11a..00000000000 --- a/src/Processors/examples/protobuf.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -struct ErrorCollector : public google::protobuf::compiler::MultiFileErrorCollector -{ - void AddError(const std::string&, int, int, const std::string& msg) override - { - throw std::runtime_error(msg); - } -}; - -int main() -{ - google::protobuf::compiler::DiskSourceTree disk_source_tree; - disk_source_tree.MapPath("", "schemas/"); - ErrorCollector collector; - google::protobuf::compiler::Importer importer(&disk_source_tree, &collector); - try - { - importer.Import("schema.proto"); - } - catch() - { - } - - importer.pool()->FindMessageTypeByName("Schema"); -} From 77419db7918783dcc95c6713da5d786e52010d43 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 21 Mar 2023 09:07:06 -0300 Subject: [PATCH 094/535] add a few tests for runtime find_symbols, more are needed --- src/Common/tests/gtest_find_symbols.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 3c19549eb75..3c167c71fd6 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -13,6 +13,14 @@ void test_find_first_not(const std::string & haystack, std::size_t expected_pos) ASSERT_EQ(begin + expected_pos, find_first_not_symbols(begin, end)); } +void test_find_first_not(const std::string & haystack, const std::string & symbols, const std::size_t expected_pos) +{ + const char * begin = haystack.data(); + + ASSERT_EQ(begin + expected_pos, find_first_not_symbols(haystack, symbols)); +} + + TEST(FindSymbols, SimpleTest) { std::string s = "Hello, world! Goodbye..."; @@ -64,6 +72,12 @@ TEST(FindNotSymbols, AllSymbolsPresent) test_find_first_not<'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '>(str_with_15_bytes, str_with_15_bytes.size()); test_find_first_not<'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '>(str_with_16_bytes, str_with_16_bytes.size()); test_find_first_not<'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '>(str_with_17_bytes, str_with_17_bytes.size()); + + const auto * symbols = "helowrd "; + + test_find_first_not(str_with_15_bytes, symbols, str_with_15_bytes.size()); + test_find_first_not(str_with_16_bytes, symbols, str_with_16_bytes.size()); + test_find_first_not(str_with_17_bytes, symbols, str_with_17_bytes.size()); } TEST(FindNotSymbols, NoSymbolsMatch) @@ -72,24 +86,28 @@ TEST(FindNotSymbols, NoSymbolsMatch) // begin should be returned since the first character of the string does not match any of the below symbols test_find_first_not<'h', 'i', 'j'>(s, 0u); + test_find_first_not(s, "hij",0u); } TEST(FindNotSymbols, ExtraSymbols) { std::string s = "hello_world_hello"; test_find_first_not<'h', 'e', 'l', 'o', ' '>(s, 5u); + test_find_first_not(s, "helo ",5u); } TEST(FindNotSymbols, EmptyString) { std::string s; test_find_first_not<'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '>(s, s.size()); + test_find_first_not(s, "helowrd ", s.size()); } TEST(FindNotSymbols, SingleChar) { std::string s = "a"; test_find_first_not<'a'>(s, s.size()); + test_find_first_not(s, "a", s.size()); } TEST(FindNotSymbols, NullCharacter) @@ -99,4 +117,5 @@ TEST(FindNotSymbols, NullCharacter) // to \0. std::string s("abcdefg\0x", 9u); test_find_first_not<'a', 'b', 'c', 'd', 'e', 'f', 'g'>(s, 7u); + test_find_first_not(s, "abcdefg", 7u); } From 5952ed030cfbc1fcdd44f50679720a9b263b8eea Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 21 Mar 2023 12:21:09 -0300 Subject: [PATCH 095/535] use standard parseComplexEscapedSequence instead of custom implementation. Drops support for 1 digit hex and octal digits --- .../util/EscapedCharacterReader.cpp | 102 +++--------------- .../strategies/util/EscapedCharacterReader.h | 8 -- .../tests/gtest_escaped_sequence_reader.cpp | 8 +- ...test_escaping_key_value_pair_extractor.cpp | 6 +- src/IO/ReadHelpers.cpp | 22 +++- src/IO/ReadHelpers.h | 3 + 6 files changed, 43 insertions(+), 106 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp index f556d736323..0f4f4379558 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp @@ -2,45 +2,12 @@ #include +#include +#include + namespace DB { -static std::optional consumeCharacter(std::string_view & view) -{ - if (view.empty()) - return std::nullopt; - - char character = view[0]; - - view = {view.begin() + 1u, view.end()}; - - return character; -} - -static std::optional toInt(std::string_view & s, int base) -{ - std::size_t value; - - auto conversion_result = std::from_chars(s.begin(), s.end(), value, base); - - s = {conversion_result.ptr, s.end()}; - - if (conversion_result.ec == std::errc{}) - { - return static_cast(value); - } - - return std::nullopt; -} - -const std::unordered_map> EscapedCharacterReader::numeric_escape_sequences_number_of_characters = - {{'x', std::make_pair(2, 16)}, {'0', std::make_pair(3, 8)}}; - -const std::unordered_map EscapedCharacterReader::escape_sequences = { - {'\\', '\\'}, {'a', 0x7}, {'b', 0x8}, {'c', 0}, {'e', 0x1B}, - {'f', 0xC}, {'n', 0xA}, {'r', 0xD}, {'t', 0x9}, {'v', 0xB}, -}; - bool EscapedCharacterReader::isEscapeCharacter(char character) { return character == ESCAPE_CHARACTER; @@ -53,65 +20,22 @@ EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view str) { - if (auto maybe_escape_character = consumeCharacter(str); isEscapeCharacter(*maybe_escape_character)) + std::string escaped_sequence; + + auto rb = ReadBufferFromString(str); + + if (parseComplexEscapeSequence(escaped_sequence, rb)) { - if (auto character = consumeCharacter(str)) - { - if (isEscapeSequence(*character)) - { - if (auto read_sequence = readEscapedSequence(str, *character)) - { - return { - str.begin(), - {*read_sequence} - }; - } - - return { - str.begin(), - {} - }; - } - else - { - return { - str.begin(), - {'\\', static_cast(*character)} - }; - } - } - + return { + rb.position(), + {escaped_sequence.begin(), escaped_sequence.end()} + }; } return { - str.begin(), + rb.position(), {} }; } -bool EscapedCharacterReader::isEscapeSequence(char character) -{ - return escape_sequences.contains(character) || numeric_escape_sequences_number_of_characters.contains(character); -} - -std::optional EscapedCharacterReader::readEscapedSequence(std::string_view & str, char sequence_identifier) -{ - if (numeric_escape_sequences_number_of_characters.contains(sequence_identifier)) - { - auto [max_number_of_bytes_to_read, base] = numeric_escape_sequences_number_of_characters.at(sequence_identifier); - - auto number_of_bytes_to_read = std::min(max_number_of_bytes_to_read, str.size()); - - auto view_containing_the_bytes_to_be_read = std::string_view {str.begin(), str.begin() + number_of_bytes_to_read}; - - auto read_character = toInt(view_containing_the_bytes_to_be_read, base); - - str = {view_containing_the_bytes_to_be_read.begin(), str.end()}; - - return read_character; - } - - return escape_sequences.at(sequence_identifier); -} - } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h index 29a07fad83a..7409b953c51 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h @@ -18,9 +18,6 @@ namespace DB * */ class EscapedCharacterReader { - static const std::unordered_map> numeric_escape_sequences_number_of_characters; - static const std::unordered_map escape_sequences; - public: static constexpr char ESCAPE_CHARACTER = '\\'; struct ReadResult @@ -32,11 +29,6 @@ public: static bool isEscapeCharacter(char character); static ReadResult read(std::string_view element); static ReadResult read(std::string_view element, std::size_t offset); - -private: - static bool isEscapeSequence(char character); - - static std::optional readEscapedSequence(std::string_view & file, char sequence_identifier); }; } diff --git a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp index bf58c0e40d4..c36b729e00c 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp @@ -22,16 +22,16 @@ void test(std::string_view input, const std::vector & expected_characte TEST(EscapedCharacterReader, HexDigits) { - test("\\xA", {0xA}); +// test("\\xA", {0xA}); test("\\xAA", {0xAA}); test("\\xff", {0xFF}); - test("\\x0", {0x0}); +// test("\\x0", {0x0}); test("\\x00", {0x0}); - test("\\xA$", {0xA}, 3); +// test("\\xA$", {0xA}, 3); test("\\xAA$", {0xAA}, 4); test("\\xff$", {0xFF}, 4); - test("\\x0$", {0x0}, 3); +// test("\\x0$", {0x0}, 3); test("\\x00$", {0x0}, 4); test("\\x", {}); diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index f1192750090..1607054be4f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -20,19 +20,17 @@ TEST(EscapingKeyValuePairExtractor, EscapeSequences) auto keys = ColumnString::create(); auto values = ColumnString::create(); - auto pairs_count = extractor->extract(R"(key1:\xFF key2:\n\t\r key3:\0377)"sv, keys, values); + auto pairs_count = extractor->extract(R"(key1:\xFF key2:\n\t\r)"sv, keys, values); - ASSERT_EQ(pairs_count, 3u); + ASSERT_EQ(pairs_count, 2u); ASSERT_EQ(keys->size(), pairs_count); ASSERT_EQ(keys->size(), values->size()); ASSERT_EQ(keys->getDataAt(0), "key1"); ASSERT_EQ(keys->getDataAt(1), "key2"); - ASSERT_EQ(keys->getDataAt(2), "key3"); assert_byte_equality(values->getDataAt(0), {0xFF}); assert_byte_equality(values->getDataAt(1), {0xA, 0x9, 0xD}); - assert_byte_equality(values->getDataAt(2), {0xFF}); } } diff --git a/src/IO/ReadHelpers.cpp b/src/IO/ReadHelpers.cpp index 809a2404746..45a71b9f71a 100644 --- a/src/IO/ReadHelpers.cpp +++ b/src/IO/ReadHelpers.cpp @@ -336,7 +336,23 @@ static ReturnType parseComplexEscapeSequence(Vector & s, ReadBuffer & buf) ++buf.position(); /// escape sequence of the form \xAA char hex_code[2]; - readPODBinary(hex_code, buf); + + if constexpr (std::is_same_v) + { + readPODBinary(hex_code, buf); + } + else + { + try + { + readPODBinary(hex_code, buf); + } + catch (const Exception &) + { + return ReturnType(false); + } + } + s.push_back(unhex2(hex_code)); } else if (char_after_backslash == 'N') @@ -370,6 +386,10 @@ static ReturnType parseComplexEscapeSequence(Vector & s, ReadBuffer & buf) return ReturnType(true); } +bool parseComplexEscapeSequence(String & s, ReadBuffer & buf) +{ + return parseComplexEscapeSequence(s, buf); +} template static ReturnType parseJSONEscapeSequence(Vector & s, ReadBuffer & buf) diff --git a/src/IO/ReadHelpers.h b/src/IO/ReadHelpers.h index cac42c198b1..0e104b78f44 100644 --- a/src/IO/ReadHelpers.h +++ b/src/IO/ReadHelpers.h @@ -1579,4 +1579,7 @@ void readQuotedField(String & s, ReadBuffer & buf); void readJSONField(String & s, ReadBuffer & buf); void readTSVField(String & s, ReadBuffer & buf); + +bool parseComplexEscapeSequence(String & s, ReadBuffer & buf); + } From 41701d9baa14c2e8b7f97fb873d964e28cd2d21a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 21 Mar 2023 12:28:15 -0300 Subject: [PATCH 096/535] remove isEscapeCharacter method --- .../strategies/escaping/InlineEscapingKeyStateHandler.cpp | 2 +- .../strategies/escaping/InlineEscapingValueStateHandler.cpp | 2 +- .../impl/state/strategies/util/EscapedCharacterReader.cpp | 5 ----- .../src/impl/state/strategies/util/EscapedCharacterReader.h | 1 - 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp index ead4c21fda2..2972b3b127d 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp @@ -64,7 +64,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, auto character = file[character_position]; auto next_pos = character_position + 1u; - if (EscapedCharacterReader::isEscapeCharacter(character)) + if (EscapedCharacterReader::ESCAPE_CHARACTER == character) { for (auto i = pos; i < character_position; i++) { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 954a3c469c0..0c0833680a9 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -59,7 +59,7 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po auto character = file[character_position]; auto next_pos = character_position + 1u; - if (EscapedCharacterReader::isEscapeCharacter(character)) + if (EscapedCharacterReader::ESCAPE_CHARACTER == character) { for (auto i = pos; i < character_position; i++) { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp index 0f4f4379558..2d65a223ab5 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp @@ -8,11 +8,6 @@ namespace DB { -bool EscapedCharacterReader::isEscapeCharacter(char character) -{ - return character == ESCAPE_CHARACTER; -} - EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view element, std::size_t offset) { return read({element.begin() + offset, element.end()}); diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h index 7409b953c51..2e048f04095 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h @@ -26,7 +26,6 @@ public: std::vector characters; }; - static bool isEscapeCharacter(char character); static ReadResult read(std::string_view element); static ReadResult read(std::string_view element, std::size_t offset); }; From 38e44861ae68bf9999be4cd85e7a673e23b2c0c5 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 21 Mar 2023 16:01:54 +0000 Subject: [PATCH 097/535] Fix possible race conditions --- docs/en/operations/settings/settings.md | 43 +++++++++++++++++++ src/Core/Settings.h | 1 + src/Core/SettingsChangesHistory.h | 3 +- src/Core/SettingsQuirks.cpp | 6 +++ .../ClickHouseDictionarySource.cpp | 4 +- src/Processors/QueryPlan/ReadFromRemote.cpp | 12 ++++-- src/Processors/Sources/RemoteSource.cpp | 9 ++-- src/Processors/Sources/RemoteSource.h | 5 ++- src/QueryPipeline/RemoteQueryExecutor.cpp | 16 ++++--- src/Storages/HDFS/StorageHDFSCluster.cpp | 2 +- src/Storages/StorageDistributed.cpp | 4 +- src/Storages/StorageReplicatedMergeTree.cpp | 2 +- src/Storages/StorageS3Cluster.cpp | 2 +- .../01814_distributed_push_down_limit.sh | 2 + 14 files changed, 88 insertions(+), 23 deletions(-) diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index daaa79e90db..f55ff52dcbe 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -4049,3 +4049,46 @@ Possible values: - 1 - enabled Default value: `0`. + +## async_socket_for_remote {#async_socket_for_remote} + +Enables asynchronous read from socket while executing remote query. + +Enabled by default. + +## async_query_sending_for_remote {#async_query_sending_for_remote} + +Enables asynchronous connection creation and query sending while executing remote query. + +Enabled by default. + +## use_hedged_requests {#use_hedged_requests} + +Enables hadged requests logic for remote queries. It allows to establish many connections with different replicas for query. +New connection is enabled in case existent connection(s) with replica(s) were not established within `hedged_connection_timeout` +or no data was received within `receive_data_timeout`. Query uses the first connection which send non empty progress packet (or data packet, if `allow_changing_replica_until_first_data_packet`); +other connections are cancelled. Queries with `max_parallel_replicas > 1` are supported. + +Enabled by default. + +## hedged_connection_timeout {#hedged_connection_timeout} + +If we can't establish connection with replica after this timeout in hedged requests, we start working with the next replica without cancelling connection to the previous. +Timeout value is in milliseconds. + +Default value: `100`. + +## receive_data_timeout {#receive_data_timeout} + +This timeout is set when the query is sent to the replica in hedged requests, if we don't receive first packet of data and we don't make any progress in query execution after this timeout, +we start working with the next replica, without cancelling connection to the previous. +Timeout value is in milliseconds. + +Default value: `2000` + +## allow_changing_replica_until_first_data_packet {#allow_changing_replica_until_first_data_packet} + +If it's enabled, in hedged requests we can start new connection until receiving first data packet even if we have already made some progress +(but progress haven't updated for `receive_data_timeout` timeout), otherwise we disable changing replica after the first time we made progress. + +Disabled by default. diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 3770d7f73a0..e7018e05f96 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -547,6 +547,7 @@ class IColumn; M(Bool, optimize_on_insert, true, "Do the same transformation for inserted block of data as if merge was done on this block.", 0) \ M(Bool, force_optimize_projection, false, "If projection optimization is enabled, SELECT queries need to use projection", 0) \ M(Bool, async_socket_for_remote, true, "Asynchronously read from socket executing remote query", 0) \ + M(Bool, async_query_sending_for_remote, true, "Asynchronously create connections and send query to shards in remote query", 0) \ M(Bool, insert_null_as_default, true, "Insert DEFAULT values instead of NULL in INSERT SELECT (UNION ALL)", 0) \ M(Bool, describe_extend_object_types, false, "Deduce concrete type of columns of type Object in DESCRIBE query", 0) \ M(Bool, describe_include_subcolumns, false, "If true, subcolumns of all table columns will be included into result of DESCRIBE query", 0) \ diff --git a/src/Core/SettingsChangesHistory.h b/src/Core/SettingsChangesHistory.h index caf18cf8fb8..c5fe4974d4a 100644 --- a/src/Core/SettingsChangesHistory.h +++ b/src/Core/SettingsChangesHistory.h @@ -85,7 +85,8 @@ static std::map sett {"input_format_native_allow_types_conversion", false, true, "Allow types conversion in Native input forma"}, {"output_format_arrow_compression_method", "none", "lz4_frame", "Use lz4 compression in Arrow output format by default"}, {"output_format_parquet_compression_method", "snappy", "lz4", "Use lz4 compression in Parquet output format by default"}, - {"output_format_orc_compression_method", "none", "lz4_frame", "Use lz4 compression in ORC output format by default"}}}, + {"output_format_orc_compression_method", "none", "lz4_frame", "Use lz4 compression in ORC output format by default"}, + {"async_query_sending_for_remote", false, true, "Create connections and send query async across shards"}}}, {"23.2", {{"output_format_parquet_fixed_string_as_fixed_byte_array", false, true, "Use Parquet FIXED_LENGTH_BYTE_ARRAY type for FixedString by default"}, {"output_format_arrow_fixed_string_as_fixed_byte_array", false, true, "Use Arrow FIXED_SIZE_BINARY type for FixedString by default"}, {"query_plan_remove_redundant_distinct", false, true, "Remove redundant Distinct step in query plan"}, diff --git a/src/Core/SettingsQuirks.cpp b/src/Core/SettingsQuirks.cpp index c2314f484c0..3326f42adf5 100644 --- a/src/Core/SettingsQuirks.cpp +++ b/src/Core/SettingsQuirks.cpp @@ -57,6 +57,12 @@ void applySettingsQuirks(Settings & settings, Poco::Logger * log) if (log) LOG_WARNING(log, "async_socket_for_remote has been disabled (you can explicitly enable it still)"); } + if (!settings.async_query_sending_for_remote.changed && settings.async_query_sending_for_remote) + { + settings.async_query_sending_for_remote = false; + if (log) + LOG_WARNING(log, "async_query_sending_for_remote has been disabled (you can explicitly enable it still)"); + } if (!settings.use_hedged_requests.changed && settings.use_hedged_requests) { settings.use_hedged_requests = false; diff --git a/src/Dictionaries/ClickHouseDictionarySource.cpp b/src/Dictionaries/ClickHouseDictionarySource.cpp index b962a6ab529..cfd74c2b4ca 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.cpp +++ b/src/Dictionaries/ClickHouseDictionarySource.cpp @@ -178,7 +178,7 @@ QueryPipeline ClickHouseDictionarySource::createStreamForQuery(const String & qu else { pipeline = QueryPipeline(std::make_shared( - std::make_shared(pool, query, empty_sample_block, context_copy), false, false)); + std::make_shared(pool, query, empty_sample_block, context_copy), false, false, false)); } return pipeline; @@ -201,7 +201,7 @@ std::string ClickHouseDictionarySource::doInvalidateQuery(const std::string & re /// We pass empty block to RemoteQueryExecutor, because we don't know the structure of the result. Block invalidate_sample_block; QueryPipeline pipeline(std::make_shared( - std::make_shared(pool, request, invalidate_sample_block, context_copy), false, false)); + std::make_shared(pool, request, invalidate_sample_block, context_copy), false, false, false)); return readInvalidateQuery(std::move(pipeline)); } } diff --git a/src/Processors/QueryPlan/ReadFromRemote.cpp b/src/Processors/QueryPlan/ReadFromRemote.cpp index 63325488e90..df6e5a9444f 100644 --- a/src/Processors/QueryPlan/ReadFromRemote.cpp +++ b/src/Processors/QueryPlan/ReadFromRemote.cpp @@ -138,6 +138,8 @@ void ReadFromRemote::addLazyPipe(Pipes & pipes, const ClusterProxy::SelectStream bool add_totals = false; bool add_extremes = false; bool async_read = context->getSettingsRef().async_socket_for_remote; + bool async_query_sending = context->getSettingsRef().async_query_sending_for_remote; + if (stage == QueryProcessingStage::Complete) { add_totals = shard.query->as().group_by_with_totals; @@ -150,7 +152,7 @@ void ReadFromRemote::addLazyPipe(Pipes & pipes, const ClusterProxy::SelectStream main_table = main_table, table_func_ptr = table_func_ptr, scalars = scalars, external_tables = external_tables, stage = stage, local_delay = shard.local_delay, - add_agg_info, add_totals, add_extremes, async_read]() mutable + add_agg_info, add_totals, add_extremes, async_read, async_query_sending]() mutable -> QueryPipelineBuilder { auto current_settings = context->getSettingsRef(); @@ -204,7 +206,7 @@ void ReadFromRemote::addLazyPipe(Pipes & pipes, const ClusterProxy::SelectStream auto remote_query_executor = std::make_shared( std::move(connections), query_string, header, context, throttler, scalars, external_tables, stage); - auto pipe = createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read); + auto pipe = createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read, async_query_sending); QueryPipelineBuilder builder; builder.init(std::move(pipe)); return builder; @@ -221,6 +223,7 @@ void ReadFromRemote::addPipe(Pipes & pipes, const ClusterProxy::SelectStreamFact bool add_totals = false; bool add_extremes = false; bool async_read = context->getSettingsRef().async_socket_for_remote; + bool async_query_sending = context->getSettingsRef().async_query_sending_for_remote; if (stage == QueryProcessingStage::Complete) { add_totals = shard.query->as().group_by_with_totals; @@ -243,7 +246,7 @@ void ReadFromRemote::addPipe(Pipes & pipes, const ClusterProxy::SelectStreamFact if (!table_func_ptr) remote_query_executor->setMainTable(main_table); - pipes.emplace_back(createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read)); + pipes.emplace_back(createRemoteSourcePipe(remote_query_executor, add_agg_info, add_totals, add_extremes, async_read, async_query_sending)); addConvertingActions(pipes.back(), output_stream->header); } @@ -378,6 +381,7 @@ void ReadFromParallelRemoteReplicasStep::addPipeForSingeReplica(Pipes & pipes, s bool add_totals = false; bool add_extremes = false; bool async_read = context->getSettingsRef().async_socket_for_remote; + bool async_query_sending = context->getSettingsRef().async_query_sending_for_remote; if (stage == QueryProcessingStage::Complete) { @@ -396,7 +400,7 @@ void ReadFromParallelRemoteReplicasStep::addPipeForSingeReplica(Pipes & pipes, s remote_query_executor->setLogger(log); - pipes.emplace_back(createRemoteSourcePipe(std::move(remote_query_executor), add_agg_info, add_totals, add_extremes, async_read, uuid)); + pipes.emplace_back(createRemoteSourcePipe(std::move(remote_query_executor), add_agg_info, add_totals, add_extremes, async_read, async_query_sending, uuid)); addConvertingActions(pipes.back(), output_stream->header); } diff --git a/src/Processors/Sources/RemoteSource.cpp b/src/Processors/Sources/RemoteSource.cpp index 9cd22ee6c86..bbca4384200 100644 --- a/src/Processors/Sources/RemoteSource.cpp +++ b/src/Processors/Sources/RemoteSource.cpp @@ -14,10 +14,11 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -RemoteSource::RemoteSource(RemoteQueryExecutorPtr executor, bool add_aggregation_info_, bool async_read_, UUID uuid_) +RemoteSource::RemoteSource(RemoteQueryExecutorPtr executor, bool add_aggregation_info_, bool async_read_, bool async_query_sending_, UUID uuid_) : ISource(executor->getHeader(), false) , add_aggregation_info(add_aggregation_info_), query_executor(std::move(executor)) , async_read(async_read_) + , async_query_sending(async_query_sending_) , uuid(uuid_) { /// Add AggregatedChunkInfo if we expect DataTypeAggregateFunction as a result. @@ -110,7 +111,7 @@ std::optional RemoteSource::tryGenerate() rows_before_limit->set(info.getRowsBeforeLimit()); }); - if (async_read) + if (async_query_sending) { int fd_ = query_executor->sendQueryAsync(); if (fd_ >= 0) @@ -237,9 +238,9 @@ Chunk RemoteExtremesSource::generate() Pipe createRemoteSourcePipe( RemoteQueryExecutorPtr query_executor, - bool add_aggregation_info, bool add_totals, bool add_extremes, bool async_read, UUID uuid) + bool add_aggregation_info, bool add_totals, bool add_extremes, bool async_read, bool async_query_sending, UUID uuid) { - Pipe pipe(std::make_shared(query_executor, add_aggregation_info, async_read, uuid)); + Pipe pipe(std::make_shared(query_executor, add_aggregation_info, async_read, async_query_sending, uuid)); if (add_totals) pipe.addTotalsSource(std::make_shared(query_executor)); diff --git a/src/Processors/Sources/RemoteSource.h b/src/Processors/Sources/RemoteSource.h index b43ea70312a..cffa62aeca7 100644 --- a/src/Processors/Sources/RemoteSource.h +++ b/src/Processors/Sources/RemoteSource.h @@ -19,7 +19,7 @@ public: /// Flag add_aggregation_info tells if AggregatedChunkInfo should be added to result chunk. /// AggregatedChunkInfo stores the bucket number used for two-level aggregation. /// This flag should be typically enabled for queries with GROUP BY which are executed till WithMergeableState. - RemoteSource(RemoteQueryExecutorPtr executor, bool add_aggregation_info_, bool async_read_, UUID uuid = UUIDHelpers::Nil); + RemoteSource(RemoteQueryExecutorPtr executor, bool add_aggregation_info_, bool async_read_, bool async_query_sending_, UUID uuid = UUIDHelpers::Nil); ~RemoteSource() override; Status prepare() override; @@ -52,6 +52,7 @@ private: OutputPort * dependency_port{nullptr}; const bool async_read; + const bool async_query_sending; bool is_async_state = false; UUID uuid; int fd = -1; @@ -92,6 +93,6 @@ private: /// Create pipe with remote sources. Pipe createRemoteSourcePipe( RemoteQueryExecutorPtr query_executor, - bool add_aggregation_info, bool add_totals, bool add_extremes, bool async_read, UUID uuid = UUIDHelpers::Nil); + bool add_aggregation_info, bool add_totals, bool add_extremes, bool async_read, bool async_query_sending, UUID uuid = UUIDHelpers::Nil); } diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index f6eba27d50c..83e819c2e8f 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -150,6 +150,15 @@ RemoteQueryExecutor::RemoteQueryExecutor( RemoteQueryExecutor::~RemoteQueryExecutor() { + /// We should finish establishing connections to disconnect it later, + /// so these connections won't be in the out-of-sync state. + if (read_context && !established) + { + /// Set was_cancelled, so the query won't be sent after creating connections. + was_cancelled = true; + read_context->cancel(); + } + /** If interrupted in the middle of the loop of communication with replicas, then interrupt * all connections, then read and skip the remaining packets to make sure * these connections did not remain hanging in the out-of-sync state. @@ -275,10 +284,7 @@ int RemoteQueryExecutor::sendQueryAsync() read_context->resume(); - if (!read_context->isQuerySent()) - return read_context->getFileDescriptor(); - - return -1; + return read_context->isQuerySent() ? -1 : read_context->getFileDescriptor(); } Block RemoteQueryExecutor::readBlock() @@ -694,7 +700,7 @@ void RemoteQueryExecutor::tryCancel(const char * reason) bool RemoteQueryExecutor::isQueryPending() const { - return read_context && !finished; + return (sent_query || read_context) && !finished; } bool RemoteQueryExecutor::hasThrownException() const diff --git a/src/Storages/HDFS/StorageHDFSCluster.cpp b/src/Storages/HDFS/StorageHDFSCluster.cpp index 19af38eff11..45f1df92e38 100644 --- a/src/Storages/HDFS/StorageHDFSCluster.cpp +++ b/src/Storages/HDFS/StorageHDFSCluster.cpp @@ -120,7 +120,7 @@ Pipe StorageHDFSCluster::read( processed_stage, extension); - pipes.emplace_back(std::make_shared(remote_query_executor, add_agg_info, false)); + pipes.emplace_back(std::make_shared(remote_query_executor, add_agg_info, false, false)); } } diff --git a/src/Storages/StorageDistributed.cpp b/src/Storages/StorageDistributed.cpp index 0be4ae3a79f..def2bfbf1ae 100644 --- a/src/Storages/StorageDistributed.cpp +++ b/src/Storages/StorageDistributed.cpp @@ -1266,7 +1266,7 @@ std::optional StorageDistributed::distributedWriteBetweenDistribu /// INSERT SELECT query returns empty block auto remote_query_executor = std::make_shared(std::move(connections), new_query_str, Block{}, query_context); - QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote)); + QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote, settings.async_query_sending_for_remote)); remote_pipeline.complete(std::make_shared(remote_query_executor->getHeader())); pipeline.addCompletedPipeline(std::move(remote_pipeline)); @@ -1334,7 +1334,7 @@ std::optional StorageDistributed::distributedWriteFromClusterStor QueryProcessingStage::Complete, extension); - QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote)); + QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote, settings.async_query_sending_for_remote)); remote_pipeline.complete(std::make_shared(remote_query_executor->getHeader())); pipeline.addCompletedPipeline(std::move(remote_pipeline)); diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 9092f251b6d..91ff319a611 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -4753,7 +4753,7 @@ std::optional StorageReplicatedMergeTree::distributedWriteFromClu QueryProcessingStage::Complete, extension); - QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote)); + QueryPipeline remote_pipeline(std::make_shared(remote_query_executor, false, settings.async_socket_for_remote, settings.async_query_sending_for_remote)); remote_pipeline.complete(std::make_shared(remote_query_executor->getHeader())); pipeline.addCompletedPipeline(std::move(remote_pipeline)); diff --git a/src/Storages/StorageS3Cluster.cpp b/src/Storages/StorageS3Cluster.cpp index 51a4a311e93..3b115b68364 100644 --- a/src/Storages/StorageS3Cluster.cpp +++ b/src/Storages/StorageS3Cluster.cpp @@ -156,7 +156,7 @@ Pipe StorageS3Cluster::read( processed_stage, extension); - pipes.emplace_back(std::make_shared(remote_query_executor, add_agg_info, false)); + pipes.emplace_back(std::make_shared(remote_query_executor, add_agg_info, false, false)); } } diff --git a/tests/queries/0_stateless/01814_distributed_push_down_limit.sh b/tests/queries/0_stateless/01814_distributed_push_down_limit.sh index d995e3a1370..4b75102e9cf 100755 --- a/tests/queries/0_stateless/01814_distributed_push_down_limit.sh +++ b/tests/queries/0_stateless/01814_distributed_push_down_limit.sh @@ -60,6 +60,8 @@ function test_distributed_push_down_limit_with_query_log() # disable hedged requests to avoid excessive log entries --use_hedged_requests 0 + --async_query_sending_for_remote 0 + "$@" ) From 487296c1c3bfc2b5022ba41ca6f138be0d09c94a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 21 Mar 2023 13:41:37 -0300 Subject: [PATCH 098/535] style --- .../strategies/escaping/InlineEscapingValueStateHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp index 0c0833680a9..e6f99c4631c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp @@ -143,7 +143,7 @@ NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, siz } } } - else if(quoting_character == character) + else if (quoting_character == character) { // todo try to optimize with resize and memcpy for (auto i = pos; i < character_position; i++) From a8ea305a5a983b48f22ba77a281d4ec28e1ff30d Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 21 Mar 2023 17:25:37 +0000 Subject: [PATCH 099/535] Fix build --- programs/copier/ClusterCopier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp index 3a6261974d1..bf349a59ea6 100644 --- a/programs/copier/ClusterCopier.cpp +++ b/programs/copier/ClusterCopier.cpp @@ -1766,7 +1766,7 @@ String ClusterCopier::getRemoteCreateTable(const DatabaseAndTableName & table, C QueryPipelineBuilder builder; builder.init(Pipe(std::make_shared( - std::make_shared(connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context), false, false))); + std::make_shared(connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context), false, false, false))); Block block = getBlockWithAllStreamData(std::move(builder)); return typeid_cast(*block.safeGetByPosition(0).column).getDataAt(0).toString(); } From b786f6fa3f8b182fcdcfdd90c4b0d50b9daa6582 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 21 Mar 2023 18:32:23 +0000 Subject: [PATCH 100/535] Bump From 783e3ab78951976e9c8892a99f50ecac2509bd72 Mon Sep 17 00:00:00 2001 From: avogar Date: Wed, 22 Mar 2023 12:25:16 +0000 Subject: [PATCH 101/535] Try fix --- src/QueryPipeline/RemoteQueryExecutor.cpp | 36 +++++++++---------- src/QueryPipeline/RemoteQueryExecutor.h | 1 + .../RemoteQueryExecutorReadContext.cpp | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index 83e819c2e8f..eab1bb8bd7e 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -218,23 +218,6 @@ static Block adaptBlockStructure(const Block & block, const Block & header) void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind, AsyncCallback async_callback) { - if (sent_query) - return; - - connections = create_connections(async_callback); - AsyncCallbackSetter async_callback_setter(connections.get(), async_callback); - - const auto & settings = context->getSettingsRef(); - if (needToSkipUnavailableShard()) - return; - - /// Query could be cancelled during creating connections and this code can be executed - /// inside read_context->cancel() under was_cancelled_mutex, it can happen only when - /// was_cancelled = true (because it's set to true before calling read_context->cancel()) - /// To avoid deadlock, we should check was_cancelled before locking was_cancelled_mutex. - if (was_cancelled) - return; - /// Query cannot be canceled in the middle of the send query, /// since there are multiple packets: /// - Query @@ -245,9 +228,26 @@ void RemoteQueryExecutor::sendQuery(ClientInfo::QueryKind query_kind, AsyncCallb /// Unexpected packet Data received from client /// std::lock_guard guard(was_cancelled_mutex); + sendQueryUnlocked(query_kind, async_callback); +} + +void RemoteQueryExecutor::sendQueryUnlocked(ClientInfo::QueryKind query_kind, AsyncCallback async_callback) +{ + if (sent_query || was_cancelled) + return; + + connections = create_connections(async_callback); + AsyncCallbackSetter async_callback_setter(connections.get(), async_callback); + + const auto & settings = context->getSettingsRef(); + if (needToSkipUnavailableShard()) + return; established = true; - was_cancelled = false; + + /// Query could be cancelled during creating connections. No need to send a query. + if (was_cancelled) + return; auto timeouts = ConnectionTimeouts::getTCPTimeoutsWithFailover(settings); ClientInfo modified_client_info = context->getClientInfo(); diff --git a/src/QueryPipeline/RemoteQueryExecutor.h b/src/QueryPipeline/RemoteQueryExecutor.h index 98c5968a4b7..2e731f9ed42 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.h +++ b/src/QueryPipeline/RemoteQueryExecutor.h @@ -89,6 +89,7 @@ public: /// But clickhouse-benchmark uses the same code, /// and it should pass INITIAL_QUERY. void sendQuery(ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::SECONDARY_QUERY, AsyncCallback async_callback = {}); + void sendQueryUnlocked(ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::SECONDARY_QUERY, AsyncCallback async_callback = {}); int sendQueryAsync(); diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp index b053c6cd9d9..54299cfc6aa 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp @@ -36,7 +36,7 @@ bool RemoteQueryExecutorReadContext::checkBeforeTaskResume() void RemoteQueryExecutorReadContext::Task::run(AsyncCallback async_callback, ResumeCallback suspend_callback) { - read_context.executor.sendQuery(ClientInfo::QueryKind::SECONDARY_QUERY, async_callback); + read_context.executor.sendQueryUnlocked(ClientInfo::QueryKind::SECONDARY_QUERY, async_callback); read_context.is_query_sent = true; if (read_context.suspend_when_query_sent) From bf7e62ff56dbd3836dbad437b6f59fb86984b61e Mon Sep 17 00:00:00 2001 From: avogar Date: Thu, 23 Mar 2023 19:52:37 +0000 Subject: [PATCH 102/535] Refactor RemoteQueryExecutor, make it more thread safe --- src/Client/ConnectionPoolWithFailover.cpp | 22 +++++- src/Client/HedgedConnections.cpp | 2 +- src/Client/HedgedConnectionsFactory.cpp | 2 +- src/QueryPipeline/RemoteQueryExecutor.cpp | 82 +++++++++++++---------- src/QueryPipeline/RemoteQueryExecutor.h | 19 +++--- 5 files changed, 79 insertions(+), 48 deletions(-) diff --git a/src/Client/ConnectionPoolWithFailover.cpp b/src/Client/ConnectionPoolWithFailover.cpp index 1f850a46ab6..f1bbe9de22b 100644 --- a/src/Client/ConnectionPoolWithFailover.cpp +++ b/src/Client/ConnectionPoolWithFailover.cpp @@ -214,8 +214,28 @@ ConnectionPoolWithFailover::tryGetEntry( const QualifiedTableName * table_to_check, AsyncCallback async_callback) { + if (async_callback) + { + ConnectionEstablisherAsync connection_establisher_async(&pool, &timeouts, settings, log, table_to_check); + while (true) + { + connection_establisher_async.resume(); + if (connection_establisher_async.isFinished()) + break; + + async_callback( + connection_establisher_async.getFileDescriptor(), + 0, + AsyncEventTimeoutType::NONE, + "Connection establisher file descriptor", + AsyncTaskExecutor::Event::READ | AsyncTaskExecutor::Event::ERROR); + } + + fail_message = connection_establisher_async.getFailMessage(); + return connection_establisher_async.getResult(); + } + ConnectionEstablisher connection_establisher(&pool, &timeouts, settings, log, table_to_check); - connection_establisher.setAsyncCallback(std::move(async_callback)); TryResult result; connection_establisher.run(result, fail_message); return result; diff --git a/src/Client/HedgedConnections.cpp b/src/Client/HedgedConnections.cpp index 8b4b3bbfabc..fe3acd7cc7b 100644 --- a/src/Client/HedgedConnections.cpp +++ b/src/Client/HedgedConnections.cpp @@ -388,7 +388,7 @@ int HedgedConnections::getReadyFileDescriptor(AsyncCallback async_callback) { events_count = epoll.getManyReady(1, &event, blocking); if (!events_count && async_callback) - async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), EPOLLIN | EPOLLPRI | EPOLLERR); + async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), AsyncTaskExecutor::Event::READ | AsyncTaskExecutor::Event::ERROR); } return event.data.fd; } diff --git a/src/Client/HedgedConnectionsFactory.cpp b/src/Client/HedgedConnectionsFactory.cpp index c188bebaee0..eb2a33b1ccc 100644 --- a/src/Client/HedgedConnectionsFactory.cpp +++ b/src/Client/HedgedConnectionsFactory.cpp @@ -266,7 +266,7 @@ int HedgedConnectionsFactory::getReadyFileDescriptor(bool blocking, AsyncCallbac { events_count = epoll.getManyReady(1, &event, !static_cast(async_callback)); if (!events_count && async_callback) - async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), EPOLLIN | EPOLLPRI | EPOLLERR); + async_callback(epoll.getFileDescriptor(), 0, AsyncEventTimeoutType::NONE, epoll.getDescription(), AsyncTaskExecutor::Event::READ | AsyncTaskExecutor::Event::ERROR); } return event.data.fd; } diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index eab1bb8bd7e..619bdadca34 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -245,10 +245,6 @@ void RemoteQueryExecutor::sendQueryUnlocked(ClientInfo::QueryKind query_kind, As established = true; - /// Query could be cancelled during creating connections. No need to send a query. - if (was_cancelled) - return; - auto timeouts = ConnectionTimeouts::getTCPTimeoutsWithFailover(settings); ClientInfo modified_client_info = context->getClientInfo(); modified_client_info.query_kind = query_kind; @@ -271,11 +267,12 @@ void RemoteQueryExecutor::sendQueryUnlocked(ClientInfo::QueryKind query_kind, As int RemoteQueryExecutor::sendQueryAsync() { + std::lock_guard lock(was_cancelled_mutex); + if (was_cancelled) + return -1; + if (!read_context) - { - std::lock_guard lock(was_cancelled_mutex); read_context = std::make_unique(*this, /*suspend_when_query_sent*/ true); - } /// If query already sent, do nothing. Note that we cannot use sent_query flag here, /// because we can still be in process of sending scalars or external tables. @@ -322,8 +319,10 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::read() return anything; if (got_duplicated_part_uuids) - return restartQueryWithoutDuplicatedUUIDs(); + break; } + + return restartQueryWithoutDuplicatedUUIDs(); } RemoteQueryExecutor::ReadResult RemoteQueryExecutor::readAsync() @@ -332,38 +331,38 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::readAsync() if (!read_context || (resent_query && recreate_read_context)) { std::lock_guard lock(was_cancelled_mutex); + if (was_cancelled) + return ReadResult(Block()); + read_context = std::make_unique(*this); recreate_read_context = false; } while (true) { + std::lock_guard lock(was_cancelled_mutex); + if (was_cancelled) + return ReadResult(Block()); + read_context->resume(); if (needToSkipUnavailableShard()) return ReadResult(Block()); - if (read_context->isCancelled()) - return ReadResult(Block()); - /// Check if packet is not ready yet. if (read_context->isInProgress()) return ReadResult(read_context->getFileDescriptor()); - /// We need to check that query was not cancelled again, - /// to avoid the race between cancel() thread and read() thread. - /// (since cancel() thread will steal the fiber and may update the packet). - if (was_cancelled) - return ReadResult(Block()); - auto anything = processPacket(read_context->getPacket()); if (anything.getType() == ReadResult::Type::Data || anything.getType() == ReadResult::Type::ParallelReplicasToken) return anything; if (got_duplicated_part_uuids) - return restartQueryWithoutDuplicatedUUIDs(); + break; } + + return restartQueryWithoutDuplicatedUUIDs(); #else return read(); #endif @@ -372,13 +371,19 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::readAsync() RemoteQueryExecutor::ReadResult RemoteQueryExecutor::restartQueryWithoutDuplicatedUUIDs() { - /// Cancel previous query and disconnect before retry. - cancel(); - connections->disconnect(); - - /// Only resend once, otherwise throw an exception - if (!resent_query) { + std::lock_guard lock(was_cancelled_mutex); + if (was_cancelled) + return ReadResult(Block()); + + /// Cancel previous query and disconnect before retry. + cancelUnlocked(); + connections->disconnect(); + + /// Only resend once, otherwise throw an exception + if (resent_query) + throw Exception(ErrorCodes::DUPLICATED_PART_UUIDS, "Found duplicate uuids while processing query"); + if (log) LOG_DEBUG(log, "Found duplicate UUIDs, will retry query without those parts"); @@ -386,13 +391,14 @@ RemoteQueryExecutor::ReadResult RemoteQueryExecutor::restartQueryWithoutDuplicat recreate_read_context = true; sent_query = false; got_duplicated_part_uuids = false; - /// Consecutive read will implicitly send query first. - if (!read_context) - return read(); - else - return readAsync(); + was_cancelled = false; } - throw Exception(ErrorCodes::DUPLICATED_PART_UUIDS, "Found duplicate uuids while processing query"); + + /// Consecutive read will implicitly send query first. + if (!read_context) + return read(); + else + return readAsync(); } RemoteQueryExecutor::ReadResult RemoteQueryExecutor::processPacket(Packet packet) @@ -534,6 +540,8 @@ void RemoteQueryExecutor::processMergeTreeInitialReadAnnounecement(InitialAllRan void RemoteQueryExecutor::finish() { + std::lock_guard guard(was_cancelled_mutex); + /** If one of: * - nothing started to do; * - received all packets before EndOfStream; @@ -590,6 +598,12 @@ void RemoteQueryExecutor::finish() } void RemoteQueryExecutor::cancel() +{ + std::lock_guard guard(was_cancelled_mutex); + cancelUnlocked(); +} + +void RemoteQueryExecutor::cancelUnlocked() { { std::lock_guard lock(external_tables_mutex); @@ -676,10 +690,6 @@ void RemoteQueryExecutor::sendExternalTables() void RemoteQueryExecutor::tryCancel(const char * reason) { - /// Flag was_cancelled is atomic because it is checked in read(), - /// in case of packet had been read by fiber (async_socket_for_remote). - std::lock_guard guard(was_cancelled_mutex); - if (was_cancelled) return; @@ -688,8 +698,8 @@ void RemoteQueryExecutor::tryCancel(const char * reason) if (read_context) read_context->cancel(); - /// Query could be cancelled during connection creation, we should check - /// if connections were already created. + /// Query could be cancelled during connection creation or query sending, + /// we should check if connections were already created and query were sent. if (connections && sent_query) { connections->sendCancel(); diff --git a/src/QueryPipeline/RemoteQueryExecutor.h b/src/QueryPipeline/RemoteQueryExecutor.h index 2e731f9ed42..d3e05b2ae31 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.h +++ b/src/QueryPipeline/RemoteQueryExecutor.h @@ -94,8 +94,8 @@ public: int sendQueryAsync(); /// Query is resent to a replica, the query itself can be modified. - std::atomic resent_query { false }; - std::atomic recreate_read_context { false }; + bool resent_query { false }; + bool recreate_read_context { false }; struct ReadResult { @@ -228,39 +228,39 @@ private: std::mutex external_tables_mutex; /// Connections to replicas are established, but no queries are sent yet - std::atomic established { false }; + bool established = false; /// Query is sent (used before getting first block) - std::atomic sent_query { false }; + bool sent_query { false }; /** All data from all replicas are received, before EndOfStream packet. * To prevent desynchronization, if not all data is read before object * destruction, it's required to send cancel query request to replicas and * read all packets before EndOfStream */ - std::atomic finished { false }; + bool finished = false; /** Cancel query request was sent to all replicas because data is not needed anymore * This behaviour may occur when: * - data size is already satisfactory (when using LIMIT, for example) * - an exception was thrown from client side */ - std::atomic was_cancelled { false }; + bool was_cancelled = false; std::mutex was_cancelled_mutex; /** An exception from replica was received. No need in receiving more packets or * requesting to cancel query execution */ - std::atomic got_exception_from_replica { false }; + bool got_exception_from_replica = false; /** Unknown packet was received from replica. No need in receiving more packets or * requesting to cancel query execution */ - std::atomic got_unknown_packet_from_replica { false }; + bool got_unknown_packet_from_replica = false; /** Got duplicated uuids from replica */ - std::atomic got_duplicated_part_uuids{ false }; + bool got_duplicated_part_uuids = false; /// Parts uuids, collected from remote replicas std::mutex duplicated_part_uuids_mutex; @@ -291,6 +291,7 @@ private: ReadResult restartQueryWithoutDuplicatedUUIDs(); /// If wasn't sent yet, send request to cancel all connections to replicas + void cancelUnlocked(); void tryCancel(const char * reason); /// Returns true if query was sent From e22eee80558162bea9a0c7cc5f439f45549dc073 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Fri, 24 Mar 2023 15:45:12 +0100 Subject: [PATCH 103/535] Updated implementation of find_first_symbols for run-time needle Implemented compile-time and run-time dispatching between SSE4.2 and SSE2 implementations Added find_first_symbols_sse2 Added tests --- base/base/find_symbols.h | 114 ++++++++--- src/Common/tests/gtest_find_symbols.cpp | 83 +++++++- .../InlineEscapingKeyStateHandler.cpp | 183 ------------------ .../escaping/InlineEscapingKeyStateHandler.h | 34 ---- ...ler.cpp => InlineEscapingStateHandler.cpp} | 7 + ...Handler.h => InlineEscapingStateHandler.h} | 24 +++ 6 files changed, 204 insertions(+), 241 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h rename src/Functions/keyvaluepair/src/impl/state/strategies/escaping/{InlineEscapingValueStateHandler.cpp => InlineEscapingStateHandler.cpp} (98%) rename src/Functions/keyvaluepair/src/impl/state/strategies/escaping/{InlineEscapingValueStateHandler.h => InlineEscapingStateHandler.h} (54%) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 73810925aef..c82782f5822 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -40,7 +40,7 @@ template constexpr bool is_in(char x) { return ((x == chars) || static bool is_in(char c, const char * symbols, size_t num_chars) { - for (auto i = 0u; i < num_chars; i++) + for (size_t i = 0u; i < num_chars; ++i) { if (c == symbols[i]) { @@ -66,6 +66,43 @@ inline __m128i mm_is_in(__m128i bytes) __m128i eq = mm_is_in(bytes); return _mm_or_si128(eq0, eq); } + +inline __m128i mm_is_in(__m128i bytes, const char * symbols, size_t num_chars) +{ + __m128i accumulator = _mm_setzero_si128(); + for (size_t i = 0; i < num_chars; ++i) + { + __m128i eq = _mm_cmpeq_epi8(bytes, _mm_set1_epi8(symbols[i])); + accumulator = _mm_or_si128(accumulator, eq); + } + + return accumulator; +} + +inline std::vector<__m128i> mm_is_in_prepare(const char * symbols, size_t num_chars) +{ + std::vector<__m128i> result; + result.reserve(num_chars); + + for (size_t i = 0; i < num_chars; ++i) + { + result.emplace_back(_mm_set1_epi8(symbols[i])); + } + + return result; +} + +inline __m128i mm_is_in_execute(__m128i bytes, const std::vector<__m128i> & needles) +{ + __m128i accumulator = _mm_setzero_si128(); + for (const auto & needle : needles) + { + __m128i eq = _mm_cmpeq_epi8(bytes, needle); + accumulator = _mm_or_si128(accumulator, eq); + } + + return accumulator; +} #endif template @@ -112,6 +149,32 @@ inline const char * find_first_symbols_sse2(const char * const begin, const char return return_mode == ReturnMode::End ? end : nullptr; } +template +inline const char * find_first_symbols_sse2(const char * const begin, const char * const end, const char * symbols, size_t num_chars) +{ + const char * pos = begin; + const auto needles = mm_is_in_prepare(symbols, num_chars); + +#if defined(__SSE2__) + for (; pos + 15 < end; pos += 16) + { + __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); + + __m128i eq = mm_is_in_execute(bytes, needles); + + uint16_t bit_mask = maybe_negate(uint16_t(_mm_movemask_epi8(eq))); + if (bit_mask) + return pos + __builtin_ctz(bit_mask); + } +#endif + + for (; pos < end; ++pos) + if (maybe_negate(is_in(*pos, symbols, num_chars))) + return pos; + + return return_mode == ReturnMode::End ? end : nullptr; +} + template inline const char * find_last_symbols_sse2(const char * const begin, const char * const end) @@ -192,21 +255,6 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha return return_mode == ReturnMode::End ? end : nullptr; } - -/// NOTE No SSE 4.2 implementation for find_last_symbols_or_null. Not worth to do. - -template -inline const char * find_first_symbols_dispatch(const char * begin, const char * end) - requires(0 <= sizeof...(symbols) && sizeof...(symbols) <= 16) -{ -#if defined(__SSE4_2__) - if (sizeof...(symbols) >= 5) - return find_first_symbols_sse42(begin, end); - else -#endif - return find_first_symbols_sse2(begin, end); -} - template inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * symbols, size_t num_chars) { @@ -241,10 +289,30 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha return return_mode == ReturnMode::End ? end : nullptr; } -template -auto find_first_symbols_sse42(std::string_view haystack, std::string_view symbols) +/// NOTE No SSE 4.2 implementation for find_last_symbols_or_null. Not worth to do. + +template +inline const char * find_first_symbols_dispatch(const char * begin, const char * end) + requires(0 <= sizeof...(symbols) && sizeof...(symbols) <= 16) { - return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols.begin(), symbols.size()); +#if defined(__SSE4_2__) + if (sizeof...(symbols) >= 5) + return find_first_symbols_sse42(begin, end); + else +#endif + return find_first_symbols_sse2(begin, end); +} + +template +inline const char * find_first_symbols_dispatch(const std::string_view haystack, const std::string_view symbols) +{ + const size_t num_chars = std::max(symbols.size(), 16); +#if defined(__SSE4_2__) + if (num_chars >= 5) + return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols.begin(), num_chars); + else +#endif + return find_first_symbols_sse2(haystack.begin(), haystack.end(), symbols.begin(), num_chars); } } @@ -266,7 +334,7 @@ inline char * find_first_symbols(char * begin, char * end) inline const char * find_first_symbols(std::string_view haystack, std::string_view symbols) { - return detail::find_first_symbols_sse42(haystack, symbols); + return detail::find_first_symbols_dispatch(haystack, symbols); } template @@ -283,7 +351,7 @@ inline char * find_first_not_symbols(char * begin, char * end) inline const char * find_first_not_symbols(std::string_view haystack, std::string_view symbols) { - return detail::find_first_symbols_sse42(haystack, symbols); + return detail::find_first_symbols_dispatch(haystack, symbols); } template @@ -300,7 +368,7 @@ inline char * find_first_symbols_or_null(char * begin, char * end) inline const char * find_first_symbols_or_null(std::string_view haystack, std::string_view symbols) { - return detail::find_first_symbols_sse42(haystack, symbols); + return detail::find_first_symbols_dispatch(haystack, symbols); } template @@ -317,7 +385,7 @@ inline char * find_first_not_symbols_or_null(char * begin, char * end) inline const char * find_first_not_symbols_or_null(std::string_view haystack, std::string_view symbols) { - return detail::find_first_symbols_sse42(haystack, symbols); + return detail::find_first_symbols_dispatch(haystack, symbols); } template diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 3c167c71fd6..b6ed39b1591 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -23,7 +23,7 @@ void test_find_first_not(const std::string & haystack, const std::string & symbo TEST(FindSymbols, SimpleTest) { - std::string s = "Hello, world! Goodbye..."; + const std::string s = "Hello, world! Goodbye..."; const char * begin = s.data(); const char * end = s.data() + s.size(); @@ -34,6 +34,14 @@ TEST(FindSymbols, SimpleTest) ASSERT_EQ(find_first_symbols<'H'>(begin, end), begin); ASSERT_EQ((find_first_symbols<'a', 'e'>(begin, end)), begin + 1); + // Check that nothing matches on big haystack, + ASSERT_EQ(find_first_symbols(s, "ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz"), end); + // only 16 bytes of haystack are checked, so nothing is found + ASSERT_EQ(find_first_symbols(s, "ABCDEFIJKLMNOPQR0helloworld"), end); + + // 16-byte needle + ASSERT_EQ(find_first_symbols(s, "XYZ!,.GHbdelorwy"), begin + 12); + ASSERT_EQ(find_last_symbols_or_null<'a'>(begin, end), nullptr); ASSERT_EQ(find_last_symbols_or_null<'e'>(begin, end), end - 4); ASSERT_EQ(find_last_symbols_or_null<'.'>(begin, end), end - 1); @@ -54,6 +62,79 @@ TEST(FindSymbols, SimpleTest) } } +TEST(FindSymbols, RunTimeNeedle) +{ + auto test_haystack = [](const auto & haystack, const auto & unfindable_needle) { +#define TEST_HAYSTACK_AND_NEEDLE(haystack_, needle_) \ + do { \ + const auto & h = haystack_; \ + const auto & n = needle_; \ + EXPECT_EQ( \ + std::find_first_of(h.data(), h.data() + h.size(), n.data(), n.data() + n.size()), \ + find_first_symbols(h, n) \ + ) << "haystack: \"" << h << "\"" \ + << ", needle: \"" << n << "\""; \ + } \ + while (false) + + // can't find + TEST_HAYSTACK_AND_NEEDLE(haystack, unfindable_needle); + +#define test_with_modified_needle(haystack, in_needle, needle_update, with) \ + do \ + { \ + std::string needle = in_needle; \ + needle_update = with; \ + TEST_HAYSTACK_AND_NEEDLE(haystack, needle); \ + } \ + while (false) + + // findable symbol is at beginnig of the needle + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack.front()); + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack.back()); + // Can find in the middle of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack[haystack.size() / 2]); + + // findable symbol is at end of the needle + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack.front()); + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack.back()); + // Can find in the middle of haystack + test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack[haystack.size() / 2]); + + // findable symbol is in the middle of the needle + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack.front()); + // Can find at first pos of haystack + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack.back()); + // Can find in the middle of haystack + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack[haystack.size() / 2]); + + }; + + // there are 4 major groups of cases: + // haystack < 16 bytes, haystack > 16 bytes + // needle < 5 bytes, needle >= 5 bytes + + // First and last symbols of haystack should be unique + const std::string long_haystack = "Hello, world! Goodbye...?"; + const std::string short_haystack = "Hello, world!"; + + // In sync with find_first_symbols_dispatch code: long needles receve special treatment. + // as of now "long" means >= 5 + const std::string unfindable_long_needle = "0123456789ABCDEF"; + const std::string unfindable_short_needle = "0123"; + + test_haystack(long_haystack, unfindable_long_needle); + test_haystack(long_haystack, unfindable_short_needle); + + test_haystack(short_haystack, unfindable_long_needle); + test_haystack(short_haystack, unfindable_short_needle); +} + TEST(FindNotSymbols, AllSymbolsPresent) { std::string str_with_17_bytes = "hello world hello"; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp deleted file mode 100644 index 2972b3b127d..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.cpp +++ /dev/null @@ -1,183 +0,0 @@ -#include "InlineEscapingKeyStateHandler.h" -#include -#include -#include - -namespace DB -{ - -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(Configuration configuration_) - : extractor_configuration(std::move(configuration_)) -{ - wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); - read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState InlineEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const -{ - BoundsSafeCharacterFinder finder; - - const auto quoting_character = extractor_configuration.quoting_character; - - while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - - if (quoting_character == character) - { - return {character_position + 1u, State::READING_QUOTED_KEY}; - } - else - { - return {character_position, State::READING_KEY}; - } - } - - return {file.size(), State::END}; -} - -/* - * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. - * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. - * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm - * */ - -NextState InlineEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const -{ - BoundsSafeCharacterFinder finder; - - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - key.clear(); - - /* - * Maybe modify finder return type to be the actual pos. In case of failures, it shall return pointer to the end. - * It might help updating current pos? - * */ - - while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (EscapedCharacterReader::ESCAPE_CHARACTER == character) - { - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - next_pos = next_byte_ptr - file.begin(); - - if (escaped_characters.empty()) - { - return {next_pos, State::WAITING_KEY}; - } - else - { - for (auto escaped_character : escaped_characters) - { - key.push_back(escaped_character); - } - } - } - else if (character == key_value_delimiter) - { - // todo try to optimize with resize and memcpy - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - return {next_pos, State::WAITING_VALUE}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) - { - return {next_pos, State::WAITING_KEY}; - } - - pos = next_pos; - } - - // might be problematic in case string reaches the end and I haven't copied anything over to key - - return {file.size(), State::END}; -} - -NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & key) const -{ - BoundsSafeCharacterFinder finder; - - const auto quoting_character = extractor_configuration.quoting_character; - - key.clear(); - - while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (character == EscapedCharacterReader::ESCAPE_CHARACTER) - { - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - next_pos = next_byte_ptr - file.begin(); - - if (escaped_characters.empty()) - { - return {next_pos, State::WAITING_KEY}; - } - else - { - for (auto escaped_character : escaped_characters) - { - key.push_back(escaped_character); - } - } - } - else if (quoting_character == character) - { - // todo try to optimize with resize and memcpy - for (auto i = pos; i < character_position; i++) - { - key.push_back(file[i]); - } - - if (key.empty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::READING_KV_DELIMITER}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const -{ - if (pos == file.size()) - { - return {pos, State::END}; - } - else - { - const auto current_character = file[pos++]; - return {pos, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; - } -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h deleted file mode 100644 index 2f49b9419ae..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace DB -{ - -class InlineEscapingKeyStateHandler : public StateHandler -{ -public: - using ElementType = std::string; - - explicit InlineEscapingKeyStateHandler(Configuration configuration_); - - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; - - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; - - [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; - -private: - Configuration extractor_configuration; - - std::vector wait_needles; - std::vector read_needles; - std::vector read_quoted_needles; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp similarity index 98% rename from src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp rename to src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp index e6f99c4631c..f605a1823dd 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp @@ -3,6 +3,13 @@ #include #include +#include + +namespace +{ + +} + namespace DB { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h similarity index 54% rename from src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h rename to src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h index 5412ef82f8b..de8b34cff8b 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h @@ -9,6 +9,30 @@ namespace DB { +class InlineEscapingKeyStateHandler : public StateHandler +{ +public: + using ElementType = std::string; + + explicit InlineEscapingKeyStateHandler(Configuration configuration_); + + [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + + [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; + + [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; + +private: + Configuration extractor_configuration; + + std::vector wait_needles; + std::vector read_needles; + std::vector read_quoted_needles; +}; + + class InlineEscapingValueStateHandler : public StateHandler { public: From c838013b692776501937dda89c5f8f5390cd0b1f Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:34:21 +0100 Subject: [PATCH 104/535] Fix special build --- src/QueryPipeline/RemoteQueryExecutor.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index 619bdadca34..bf57f481519 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -267,6 +267,7 @@ void RemoteQueryExecutor::sendQueryUnlocked(ClientInfo::QueryKind query_kind, As int RemoteQueryExecutor::sendQueryAsync() { +#if defined(OS_LINUX) std::lock_guard lock(was_cancelled_mutex); if (was_cancelled) return -1; @@ -282,6 +283,10 @@ int RemoteQueryExecutor::sendQueryAsync() read_context->resume(); return read_context->isQuerySent() ? -1 : read_context->getFileDescriptor(); +#else + sendQuery(); + return -1; +#endif } Block RemoteQueryExecutor::readBlock() From d76f7ecce2fbd01257bacb4e54b9aa31854366ba Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Sat, 25 Mar 2023 00:36:24 +0100 Subject: [PATCH 105/535] Fix special build --- src/Client/ConnectionPoolWithFailover.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Client/ConnectionPoolWithFailover.cpp b/src/Client/ConnectionPoolWithFailover.cpp index f1bbe9de22b..23810bd82ca 100644 --- a/src/Client/ConnectionPoolWithFailover.cpp +++ b/src/Client/ConnectionPoolWithFailover.cpp @@ -214,6 +214,7 @@ ConnectionPoolWithFailover::tryGetEntry( const QualifiedTableName * table_to_check, AsyncCallback async_callback) { +#if defined(OS_LINUX) if (async_callback) { ConnectionEstablisherAsync connection_establisher_async(&pool, &timeouts, settings, log, table_to_check); @@ -234,6 +235,7 @@ ConnectionPoolWithFailover::tryGetEntry( fail_message = connection_establisher_async.getFailMessage(); return connection_establisher_async.getResult(); } +#endif ConnectionEstablisher connection_establisher(&pool, &timeouts, settings, log, table_to_check); TryResult result; From e784304dfb7d070fb7c52edf11f008efc818e8da Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Sat, 25 Mar 2023 13:32:29 +0100 Subject: [PATCH 106/535] Fix style --- src/Client/ConnectionPoolWithFailover.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/ConnectionPoolWithFailover.cpp b/src/Client/ConnectionPoolWithFailover.cpp index 23810bd82ca..fb2232fcbf6 100644 --- a/src/Client/ConnectionPoolWithFailover.cpp +++ b/src/Client/ConnectionPoolWithFailover.cpp @@ -235,7 +235,7 @@ ConnectionPoolWithFailover::tryGetEntry( fail_message = connection_establisher_async.getFailMessage(); return connection_establisher_async.getResult(); } -#endif +#endif ConnectionEstablisher connection_establisher(&pool, &timeouts, settings, log, table_to_check); TryResult result; From 7617599c207fca5a14ad324a8bb505f6c225c973 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Sat, 25 Mar 2023 23:01:32 +0100 Subject: [PATCH 107/535] Fix special builds --- src/Client/ConnectionPoolWithFailover.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/ConnectionPoolWithFailover.cpp b/src/Client/ConnectionPoolWithFailover.cpp index fb2232fcbf6..e0c46804c60 100644 --- a/src/Client/ConnectionPoolWithFailover.cpp +++ b/src/Client/ConnectionPoolWithFailover.cpp @@ -212,7 +212,7 @@ ConnectionPoolWithFailover::tryGetEntry( std::string & fail_message, const Settings * settings, const QualifiedTableName * table_to_check, - AsyncCallback async_callback) + [[maybe_unused]] AsyncCallback async_callback) { #if defined(OS_LINUX) if (async_callback) From ce608b135f12128a8e750bc895e43907d0cefa7f Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Sat, 25 Mar 2023 23:18:51 +0100 Subject: [PATCH 108/535] Fixed implementation of find_first_symbols_sse42 run-time needle Added some tests --- base/base/find_symbols.h | 7 +- src/Common/tests/gtest_find_symbols.cpp | 125 ++++++++++++++++++------ 2 files changed, 100 insertions(+), 32 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index c82782f5822..ed6764f6848 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -263,7 +263,10 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha #if defined(__SSE4_2__) constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - const __m128i set = _mm_loadu_si128(reinterpret_cast(symbols)); + // This is to avoid read past end of `symbols` if `num_chars < 16`. + char buffer[16] = {'\0'}; + memcpy(buffer, symbols, num_chars); + const __m128i set = _mm_loadu_si128(reinterpret_cast(buffer)); for (; pos + 15 < end; pos += 16) { @@ -306,7 +309,7 @@ inline const char * find_first_symbols_dispatch(const char * begin, const char * template inline const char * find_first_symbols_dispatch(const std::string_view haystack, const std::string_view symbols) { - const size_t num_chars = std::max(symbols.size(), 16); + const size_t num_chars = std::min(symbols.size(), 16); #if defined(__SSE4_2__) if (num_chars >= 5) return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols.begin(), num_chars); diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index b6ed39b1591..0f719382f81 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -34,13 +34,8 @@ TEST(FindSymbols, SimpleTest) ASSERT_EQ(find_first_symbols<'H'>(begin, end), begin); ASSERT_EQ((find_first_symbols<'a', 'e'>(begin, end)), begin + 1); - // Check that nothing matches on big haystack, - ASSERT_EQ(find_first_symbols(s, "ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz"), end); - // only 16 bytes of haystack are checked, so nothing is found - ASSERT_EQ(find_first_symbols(s, "ABCDEFIJKLMNOPQR0helloworld"), end); - - // 16-byte needle - ASSERT_EQ(find_first_symbols(s, "XYZ!,.GHbdelorwy"), begin + 12); + ASSERT_EQ((find_first_symbols<'a', 'e', 'w', 'x', 'z'>(begin, end)), begin + 1); + ASSERT_EQ((find_first_symbols<'p', 'q', 's', 'x', 'z'>(begin, end)), end); ASSERT_EQ(find_last_symbols_or_null<'a'>(begin, end), nullptr); ASSERT_EQ(find_last_symbols_or_null<'e'>(begin, end), end - 4); @@ -62,6 +57,54 @@ TEST(FindSymbols, SimpleTest) } } +template +inline const char * find_first_symbols_sse42_MY(const char * const begin, const char * const end, const char * symbols, size_t num_chars) +{ + using namespace detail; + const char * pos = begin; + +#if defined(__SSE4_2__) + constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; + +#if defined(__AVX512F__) || defined(__AVX512BW__) || defined(__AVX__) || defined(__AVX2__) + +#else + // This is to avoid read past end of allocated string while loading `set` from `symbols` if `num_chars < 16`. + char buffer[16] = {'\0'}; + memcpy(buffer, symbols, num_chars); + const __m128i set = _mm_loadu_si128(reinterpret_cast(buffer)); +#endif + + for (; pos + 15 < end; pos += 16) + { + __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); + + if constexpr (positive) + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode); + } + else + { + if (_mm_cmpestrc(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY)) + return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY); + } + } +#endif + + for (; pos < end; ++pos) + if (maybe_negate(is_in(*pos, symbols, num_chars))) + return pos; + + return return_mode == ReturnMode::End ? end : nullptr; +} + +template +inline const char * find_first_symbols_MY(const char * begin, const char * end) +{ + return detail::find_first_symbols_dispatch(begin, end); +} + TEST(FindSymbols, RunTimeNeedle) { auto test_haystack = [](const auto & haystack, const auto & unfindable_needle) { @@ -72,47 +115,47 @@ TEST(FindSymbols, RunTimeNeedle) EXPECT_EQ( \ std::find_first_of(h.data(), h.data() + h.size(), n.data(), n.data() + n.size()), \ find_first_symbols(h, n) \ - ) << "haystack: \"" << h << "\"" \ + ) << "haystack: \"" << h << "\" (" << static_cast(h.data()) << ")" \ << ", needle: \"" << n << "\""; \ } \ while (false) - // can't find + // can't find needle TEST_HAYSTACK_AND_NEEDLE(haystack, unfindable_needle); -#define test_with_modified_needle(haystack, in_needle, needle_update, with) \ +#define test_with_modified_needle(haystack, in_needle, needle_update_statement) \ do \ { \ - std::string needle = in_needle; \ - needle_update = with; \ + std::string needle = (in_needle); \ + (needle_update_statement); \ + std::cerr << "!!!\tHaystack: \"" << haystack << "\" needele: \"" << needle << "\"" << std::endl; \ TEST_HAYSTACK_AND_NEEDLE(haystack, needle); \ } \ while (false) // findable symbol is at beginnig of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack.front()); + test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack.back()); + test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front(), haystack[haystack.size() / 2]); + test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack[haystack.size() / 2]); // findable symbol is at end of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack.front()); + test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack.back()); + test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back(), haystack[haystack.size() / 2]); + test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack[haystack.size() / 2]); // findable symbol is in the middle of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack.front()); + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack.back()); + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2], haystack[haystack.size() / 2]); - + test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack[haystack.size() / 2]); }; // there are 4 major groups of cases: @@ -120,19 +163,41 @@ TEST(FindSymbols, RunTimeNeedle) // needle < 5 bytes, needle >= 5 bytes // First and last symbols of haystack should be unique - const std::string long_haystack = "Hello, world! Goodbye...?"; - const std::string short_haystack = "Hello, world!"; + std::string long_haystack = "Hello, world! Goodbye...?"; + std::string short_haystack = "Hello, world!"; // In sync with find_first_symbols_dispatch code: long needles receve special treatment. // as of now "long" means >= 5 - const std::string unfindable_long_needle = "0123456789ABCDEF"; - const std::string unfindable_short_needle = "0123"; + std::string unfindable_long_needle = "0123456789ABCDEF"; + std::string unfindable_short_needle = "0123"; - test_haystack(long_haystack, unfindable_long_needle); - test_haystack(long_haystack, unfindable_short_needle); - test_haystack(short_haystack, unfindable_long_needle); - test_haystack(short_haystack, unfindable_short_needle); + for (size_t i = 0; i < 100; ++i) + { + { + SCOPED_TRACE("Long haystack"); + test_haystack(long_haystack, unfindable_long_needle); + test_haystack(long_haystack, unfindable_short_needle); + } + + { + SCOPED_TRACE("Short haystack"); + test_haystack(short_haystack, unfindable_long_needle); + test_haystack(short_haystack, unfindable_short_needle); + } + + // re-allocate buffers to make sure that we run tests against different addresses each time. + long_haystack.reserve(long_haystack.capacity() + 1); + short_haystack.reserve(long_haystack.capacity() + 1); + unfindable_long_needle.reserve(unfindable_long_needle.capacity() + 1); + unfindable_short_needle.reserve(unfindable_short_needle.capacity() + 1); + } + + // Check that nothing matches on big haystack, + EXPECT_EQ(find_first_symbols(long_haystack, "ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz"), long_haystack.data() + long_haystack.size()); + + // only 16 bytes of haystack are checked, so nothing is found + EXPECT_EQ(find_first_symbols(long_haystack, "ABCDEFIJKLMNOPQR0helloworld"), long_haystack.data() + long_haystack.size()); } TEST(FindNotSymbols, AllSymbolsPresent) From fa27ed9d41020cc5dfafbd0c59fd98ee2f40196e Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Sat, 25 Mar 2023 23:31:17 +0100 Subject: [PATCH 109/535] Less noisy tests --- src/Common/tests/gtest_find_symbols.cpp | 58 +++++++++++-------------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 0f719382f81..298b0670d2d 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -123,39 +123,41 @@ TEST(FindSymbols, RunTimeNeedle) // can't find needle TEST_HAYSTACK_AND_NEEDLE(haystack, unfindable_needle); -#define test_with_modified_needle(haystack, in_needle, needle_update_statement) \ +#define TEST_WITH_MODIFIED_NEEDLE(haystack, in_needle, needle_update_statement) \ do \ { \ std::string needle = (in_needle); \ (needle_update_statement); \ - std::cerr << "!!!\tHaystack: \"" << haystack << "\" needele: \"" << needle << "\"" << std::endl; \ TEST_HAYSTACK_AND_NEEDLE(haystack, needle); \ } \ while (false) // findable symbol is at beginnig of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack.front()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.front() = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack.back()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.front() = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.front() = haystack[haystack.size() / 2]); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.front() = haystack[haystack.size() / 2]); // findable symbol is at end of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack.front()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.back() = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack.back()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.back() = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle.back() = haystack[haystack.size() / 2]); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.back() = haystack[haystack.size() / 2]); // findable symbol is in the middle of the needle // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.front()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.front()); // Can find at first pos of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.back()); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle[needle.size() / 2] = haystack.back()); // Can find in the middle of haystack - test_with_modified_needle(haystack, unfindable_needle, needle[needle.size() / 2] = haystack[haystack.size() / 2]); + TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle[needle.size() / 2] = haystack[haystack.size() / 2]); + +#undef TEST_WITH_MODIFIED_NEEDLE +#undef TEST_HAYSTACK_AND_NEEDLE }; // there are 4 major groups of cases: @@ -163,34 +165,24 @@ TEST(FindSymbols, RunTimeNeedle) // needle < 5 bytes, needle >= 5 bytes // First and last symbols of haystack should be unique - std::string long_haystack = "Hello, world! Goodbye...?"; - std::string short_haystack = "Hello, world!"; + const std::string long_haystack = "Hello, world! Goodbye...?"; + const std::string short_haystack = "Hello, world!"; // In sync with find_first_symbols_dispatch code: long needles receve special treatment. // as of now "long" means >= 5 - std::string unfindable_long_needle = "0123456789ABCDEF"; - std::string unfindable_short_needle = "0123"; + const std::string unfindable_long_needle = "0123456789ABCDEF"; + const std::string unfindable_short_needle = "0123"; - - for (size_t i = 0; i < 100; ++i) { - { - SCOPED_TRACE("Long haystack"); - test_haystack(long_haystack, unfindable_long_needle); - test_haystack(long_haystack, unfindable_short_needle); - } + SCOPED_TRACE("Long haystack"); + test_haystack(long_haystack, unfindable_long_needle); + test_haystack(long_haystack, unfindable_short_needle); + } - { - SCOPED_TRACE("Short haystack"); - test_haystack(short_haystack, unfindable_long_needle); - test_haystack(short_haystack, unfindable_short_needle); - } - - // re-allocate buffers to make sure that we run tests against different addresses each time. - long_haystack.reserve(long_haystack.capacity() + 1); - short_haystack.reserve(long_haystack.capacity() + 1); - unfindable_long_needle.reserve(unfindable_long_needle.capacity() + 1); - unfindable_short_needle.reserve(unfindable_short_needle.capacity() + 1); + { + SCOPED_TRACE("Short haystack"); + test_haystack(short_haystack, unfindable_long_needle); + test_haystack(short_haystack, unfindable_short_needle); } // Check that nothing matches on big haystack, From 7165da1cc6ffcb0874001980db294be322977a22 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 27 Mar 2023 17:34:17 +0000 Subject: [PATCH 110/535] rework functions that work with Map type --- src/Columns/ColumnFunction.cpp | 7 +- src/Functions/FunctionFactory.h | 1 - src/Functions/array/CMakeLists.txt | 4 + src/Functions/array/FunctionArrayMapped.h | 85 +++- .../array/FunctionsMapMiscellaneous.cpp | 334 +++++++++++++++ src/Functions/map.cpp | 387 +----------------- src/Functions/mapFilter.cpp | 144 ------- ...2030_function_mapContainsKeyLike.reference | 4 + .../02030_function_mapContainsKeyLike.sql | 5 + ...02111_function_mapExtractKeyLike.reference | 4 + .../02111_function_mapExtractKeyLike.sql | 7 +- .../0_stateless/02169_map_functions.sql | 18 +- 12 files changed, 442 insertions(+), 558 deletions(-) create mode 100644 src/Functions/array/FunctionsMapMiscellaneous.cpp delete mode 100644 src/Functions/mapFilter.cpp diff --git a/src/Columns/ColumnFunction.cpp b/src/Columns/ColumnFunction.cpp index 59ee93410c8..3ea7073d8c8 100644 --- a/src/Columns/ColumnFunction.cpp +++ b/src/Columns/ColumnFunction.cpp @@ -258,12 +258,11 @@ void ColumnFunction::appendArguments(const ColumnsWithTypeAndName & columns) void ColumnFunction::appendArgument(const ColumnWithTypeAndName & column) { - const auto & argumnet_types = function->getArgumentTypes(); - + const auto & argument_types = function->getArgumentTypes(); auto index = captured_columns.size(); - if (!is_short_circuit_argument && !column.type->equals(*argumnet_types[index])) + if (!is_short_circuit_argument && !column.type->equals(*argument_types[index])) throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot capture column {} because it has incompatible type: " - "got {}, but {} is expected.", argumnet_types.size(), column.type->getName(), argumnet_types[index]->getName()); + "got {}, but {} is expected.", argument_types.size(), column.type->getName(), argument_types[index]->getName()); captured_columns.push_back(column); } diff --git a/src/Functions/FunctionFactory.h b/src/Functions/FunctionFactory.h index 1a909ea0598..b9063e2c29a 100644 --- a/src/Functions/FunctionFactory.h +++ b/src/Functions/FunctionFactory.h @@ -37,7 +37,6 @@ public: template void registerFunction(const std::string & name, Documentation doc = {}, CaseSensitiveness case_sensitiveness = CaseSensitive) { - if constexpr (std::is_base_of_v) registerFunction(name, &adaptFunctionToOverloadResolver, std::move(doc), case_sensitiveness); else diff --git a/src/Functions/array/CMakeLists.txt b/src/Functions/array/CMakeLists.txt index 98335dbb8e7..2800b5b4e28 100644 --- a/src/Functions/array/CMakeLists.txt +++ b/src/Functions/array/CMakeLists.txt @@ -3,6 +3,10 @@ add_headers_and_sources(clickhouse_functions_array .) add_library(clickhouse_functions_array OBJECT ${clickhouse_functions_array_sources} ${clickhouse_functions_array_headers}) target_link_libraries(clickhouse_functions_array PRIVATE dbms clickhouse_functions_gatherutils) +if (TARGET ch_contrib::vectorscan) + target_link_libraries(clickhouse_functions_array PRIVATE ch_contrib::vectorscan) +endif() + if (OMIT_HEAVY_DEBUG_SYMBOLS) target_compile_options(clickhouse_functions_array PRIVATE "-g0") endif() diff --git a/src/Functions/array/FunctionArrayMapped.h b/src/Functions/array/FunctionArrayMapped.h index 61abc607349..6af23f01f97 100644 --- a/src/Functions/array/FunctionArrayMapped.h +++ b/src/Functions/array/FunctionArrayMapped.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -133,6 +134,10 @@ public: size_t nested_types_count = (arguments.size() - num_fixed_params - 1) * (is_argument_type_map ? 2 : 1); DataTypes nested_types(nested_types_count); + + size_t num_array_tuple_arguments = 0; + size_t tuple_argument_size = 0; + for (size_t i = 0; i < arguments.size() - 1 - num_fixed_params; ++i) { const auto * array_type = checkAndGetDataType(&*arguments[i + 1 + num_fixed_params]); @@ -144,6 +149,13 @@ public: getName(), argument_type_name, arguments[i + 1 + num_fixed_params]->getName()); + + if (const auto * tuple_type = checkAndGetDataType(array_type->getNestedType().get())) + { + ++num_array_tuple_arguments; + tuple_argument_size = tuple_type->getElements().size(); + } + if constexpr (is_argument_type_map) { nested_types[2 * i] = recursiveRemoveLowCardinality(array_type->getKeyType()); @@ -155,8 +167,31 @@ public: } } - const DataTypeFunction * function_type = checkAndGetDataType(arguments[0].get()); - if (!function_type || function_type->getArgumentTypes().size() != nested_types.size()) + const auto * function_type = checkAndGetDataType(arguments[0].get()); + if (!function_type) + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "First argument for this overload of {} must be a function with {} arguments, found {} instead", + getName(), + nested_types.size(), + arguments[0]->getName()); + + size_t num_function_arguments = function_type->getArgumentTypes().size(); + if (num_array_tuple_arguments == 1 && tuple_argument_size == num_function_arguments) + { + assert(nested_types.size() == 1); + + auto argument_type = nested_types[0]; + const auto & tuple_type = assert_cast(*argument_type); + + nested_types.clear(); + nested_types.reserve(tuple_argument_size); + + for (const auto & element : tuple_type.getElements()) + nested_types.push_back(element); + } + + if (num_function_arguments != nested_types.size()) throw Exception( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for this overload of {} must be a function with {} arguments, found {} instead", @@ -315,18 +350,20 @@ public: throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a function.", getName()); const auto * column_function = typeid_cast(column_with_type_and_name.column.get()); - if (!column_function) throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a function.", getName()); - ColumnPtr offsets_column; + const auto & type_function = assert_cast(*arguments[0].type); + size_t num_function_arguments = type_function.getArgumentTypes().size(); + ColumnPtr offsets_column; ColumnPtr column_first_array_ptr; const typename Impl::column_type * column_first_array = nullptr; ColumnsWithTypeAndName arrays; - arrays.reserve(arguments.size() - 1); + arrays.reserve(arguments.size() - 1 - num_fixed_params); + bool is_single_array_argument = arguments.size() == num_fixed_params + 2; for (size_t i = 1 + num_fixed_params; i < arguments.size(); ++i) { const auto & array_with_type_and_name = arguments[i]; @@ -367,12 +404,6 @@ public: getName()); } - if (i == 1 + num_fixed_params) - { - column_first_array_ptr = column_array_ptr; - column_first_array = column_array; - } - if constexpr (is_argument_type_map) { arrays.emplace_back(ColumnWithTypeAndName( @@ -382,9 +413,35 @@ public: } else { - arrays.emplace_back(ColumnWithTypeAndName(column_array->getDataPtr(), - recursiveRemoveLowCardinality(array_type->getNestedType()), - array_with_type_and_name.name)); + const auto * column_tuple = checkAndGetColumn(&column_array->getData()); + if (is_single_array_argument && column_tuple && column_tuple->getColumns().size() == num_function_arguments) + { + const auto & type_tuple = assert_cast(*array_type->getNestedType()); + const auto & tuple_names = type_tuple.getElementNames(); + + size_t tuple_size = column_tuple->getColumns().size(); + arrays.reserve(column_tuple->getColumns().size()); + for (size_t j = 0; j < tuple_size; ++j) + { + arrays.emplace_back( + column_tuple->getColumnPtr(j), + recursiveRemoveLowCardinality(type_tuple.getElement(j)), + array_with_type_and_name.name + "." + tuple_names[j]); + } + } + else + { + arrays.emplace_back( + column_array->getDataPtr(), + recursiveRemoveLowCardinality(array_type->getNestedType()), + array_with_type_and_name.name); + } + } + + if (i == 1 + num_fixed_params) + { + column_first_array_ptr = column_array_ptr; + column_first_array = column_array; } } diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp new file mode 100644 index 00000000000..834a3f54219 --- /dev/null +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -0,0 +1,334 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ + +template +class FunctionMapToArrayAdapter : public IFunction +{ +public: + static constexpr auto name = Name::name; + static FunctionPtr create(ContextPtr) { return std::make_shared(); } + String getName() const override { return name; } + + bool isVariadic() const override { return impl.isVariadic(); } + size_t getNumberOfArguments() const override { return impl.getNumberOfArguments(); } + bool useDefaultImplementationForConstants() const override { return impl.useDefaultImplementationForConstants(); } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override { return false; } + + void getLambdaArgumentTypes(DataTypes & arguments) const override + { + auto nested_arguments = arguments; + Adapter::extractNestedTypes(arguments); + impl.getLambdaArgumentTypes(arguments); + } + + DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override + { + if (arguments.empty()) + throw Exception( + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + "Function {} requires at least one argument, passed {}", getName(), arguments.size()); + + auto nested_arguments = arguments; + Adapter::extractNestedTypesAndColumns(nested_arguments); + + constexpr bool impl_has_get_return_type = requires + { + impl.getReturnTypeImpl(nested_arguments); + }; + + if constexpr (impl_has_get_return_type) + return Adapter::wrapType(impl.getReturnTypeImpl(nested_arguments)); + else + return Adapter::wrapType(dynamic_cast(impl).getReturnTypeImpl(nested_arguments)); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override + { + auto nested_arguments = arguments; + Adapter::extractNestedTypesAndColumns(nested_arguments); + return Adapter::wrapColumn(impl.executeImpl(nested_arguments, Adapter::extractResultType(result_type), input_rows_count)); + } + +private: + Impl impl; +}; + + +template +struct MapAdapterBase +{ + static void extractNestedTypes(DataTypes & types) + { + bool has_map_column = false; + for (auto & type : types) + { + if (const auto * type_map = typeid_cast(type.get())) + { + has_map_column = true; + type = Derived::extractNestedType(*type_map); + } + } + + if (!has_map_column) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "Function {} requires at least one argument of type Map", Name::name); + } + + static void extractNestedTypesAndColumns(ColumnsWithTypeAndName & arguments) + { + bool has_map_column = false; + for (auto & argument : arguments) + { + if (const auto * type_map = typeid_cast(argument.type.get())) + { + has_map_column = true; + argument.type = Derived::extractNestedType(*type_map); + + if (argument.column) + { + if (const auto * const_map = checkAndGetColumnConstData(argument.column.get())) + argument.column = ColumnConst::create(Derived::extractNestedColumn(*const_map), argument.column->size()); + else + argument.column = Derived::extractNestedColumn(assert_cast(*argument.column)); + } + } + } + + if (!has_map_column) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "Function {} requires at least one argument of type Map", Name::name); + } +}; + +template +struct MapToNestedAdapter : public MapAdapterBase, Name> +{ + using MapAdapterBase::extractNestedTypes; + using MapAdapterBase::extractNestedTypesAndColumns; + + static DataTypePtr extractNestedType(const DataTypeMap & type_map) + { + return type_map.getNestedType(); + } + + static ColumnPtr extractNestedColumn(const ColumnMap & column_map) + { + return column_map.getNestedColumnPtr(); + } + + static DataTypePtr extractResultType(const DataTypePtr & result_type) + { + if constexpr (returns_map) + return assert_cast(*result_type).getNestedType(); + return result_type; + } + + static DataTypePtr wrapType(DataTypePtr type) + { + if constexpr (returns_map) + return std::make_shared(std::move(type)); + return type; + } + + static ColumnPtr wrapColumn(ColumnPtr column) + { + if constexpr (returns_map) + return ColumnMap::create(std::move(column)); + return column; + } +}; + +template +struct MapToSubcolumnAdapter : public MapAdapterBase, Name> +{ + using MapAdapterBase::extractNestedTypes; + using MapAdapterBase::extractNestedTypesAndColumns; + + static DataTypePtr extractNestedType(const DataTypeMap & type_map) + { + const auto & array_type = assert_cast(*type_map.getNestedType()); + const auto & tuple_type = assert_cast(*array_type.getNestedType()); + return std::make_shared(tuple_type.getElement(position)); + } + + static ColumnPtr extractNestedColumn(const ColumnMap & column_map) + { + const auto & array_column = column_map.getNestedColumn(); + const auto & tuple_column = column_map.getNestedData(); + return ColumnArray::create(tuple_column.getColumnPtr(position), array_column.getOffsetsPtr()); + } + + static DataTypePtr extractResultType(const DataTypePtr & result_type) { return result_type; } + static DataTypePtr wrapType(DataTypePtr type) { return type; } + static ColumnPtr wrapColumn(ColumnPtr column) { return column; } +}; + +class FunctionMapKeyLike : public IFunction +{ +public: + String getName() const override { return "mapKeyLike"; } + size_t getNumberOfArguments() const override { return 3; } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + DataTypes new_arguments{arguments[1], arguments[0]}; + return impl.getReturnTypeImpl(new_arguments); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override + { + ColumnsWithTypeAndName new_arguments{arguments[1], arguments[0]}; + return impl.executeImpl(new_arguments, result_type, input_rows_count); + } + +private: + FunctionLike impl; +}; + +template +struct MapKeyLikeAdapter +{ + static void extractNestedTypes(DataTypes & types) + { + if (types.size() != 2) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + "Number of arguments for function {} doesn't match: passed {}, should be 2", + Name::name, types.size()); + + const auto * map_type = checkAndGetDataType(types[0].get()); + if (!map_type) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a Map", Name::name); + + if (!isStringOrFixedString(types[1])) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Second argument for function {} must be String or FixedString", Name::name); + + if (!isStringOrFixedString(map_type->getKeyType())) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Key type of map for function {} must be String or FixedString", Name::name); + + DataTypes argument_types{map_type->getKeyType(), map_type->getValueType()}; + auto function_type = std::make_shared(argument_types, std::make_shared()); + + types = {function_type, types[0]}; + MapToNestedAdapter::extractNestedTypes(types); + } + + static void extractNestedTypesAndColumns(ColumnsWithTypeAndName & arguments) + { + const auto & map_type = assert_cast(*arguments[0].type); + const auto & pattern_arg = arguments[1]; + + ColumnPtr function_column; + + DataTypePtr return_type = std::make_shared(); + DataTypes argument_types{map_type.getKeyType(), map_type.getValueType()}; + auto function_type = std::make_shared(argument_types, return_type); + + if (pattern_arg.column) + { + DataTypes function_argument_types{pattern_arg.type, map_type.getKeyType(), map_type.getValueType()}; + + auto function = std::make_shared(); + auto function_base = std::make_shared(function, function_argument_types, return_type); + function_column = ColumnFunction::create(pattern_arg.column->size(), std::move(function_base), ColumnsWithTypeAndName{pattern_arg}); + } + + ColumnWithTypeAndName function_arg{std::move(function_column), std::move(function_type), "__function_map_key_like"}; + arguments = {function_arg, arguments[0]}; + MapToNestedAdapter::extractNestedTypesAndColumns(arguments); + } + + static DataTypePtr extractResultType(const DataTypePtr & result_type) + { + return MapToNestedAdapter::extractResultType(result_type); + } + + static DataTypePtr wrapType(DataTypePtr type) + { + return MapToNestedAdapter::wrapType(std::move(type)); + } + + static ColumnPtr wrapColumn(ColumnPtr column) + { + return MapToNestedAdapter::wrapColumn(std::move(column)); + } +}; + +struct NameMapConcat { static constexpr auto name = "mapConcat"; }; +using FunctionMapConcat = FunctionMapToArrayAdapter, NameMapConcat>; + +struct NameMapKeys { static constexpr auto name = "mapKeys"; }; +using FunctionMapKeys = FunctionMapToArrayAdapter, NameMapKeys>; + +struct NameMapValues { static constexpr auto name = "mapValues"; }; +using FunctionMapValues = FunctionMapToArrayAdapter, NameMapValues>; + +struct NameMapContains { static constexpr auto name = "mapContains"; }; +using FunctionMapContains = FunctionMapToArrayAdapter, MapToSubcolumnAdapter, NameMapContains>; + +struct NameMapFilter { static constexpr auto name = "mapFilter"; }; +using FunctionMapFilter = FunctionMapToArrayAdapter, NameMapFilter>; + +struct NameMapApply { static constexpr auto name = "mapApply"; }; +using FunctionMapApply = FunctionMapToArrayAdapter, NameMapApply>; + +struct NameMapExists { static constexpr auto name = "mapExists"; }; +using FunctionMapExists = FunctionMapToArrayAdapter, NameMapExists>; + +struct NameMapContainsKeyLike { static constexpr auto name = "mapContainsKeyLike"; }; +using FunctionMapContainsKeyLike = FunctionMapToArrayAdapter, NameMapContainsKeyLike>; + +struct NameMapExtractKeyLike { static constexpr auto name = "mapExtractKeyLike"; }; +using FunctionMapExtractKeyLike = FunctionMapToArrayAdapter, NameMapExtractKeyLike>; + +struct NameMapSort { static constexpr auto name = "mapSort"; }; +struct NameMapReverseSort { static constexpr auto name = "mapReverseSort"; }; +struct NameMapPartialSort { static constexpr auto name = "mapPartialSort"; }; +struct NameMapPartialReverseSort { static constexpr auto name = "mapPartialReverseSort"; }; + +using FunctionMapSort = FunctionMapToArrayAdapter, NameMapSort>; +using FunctionMapReverseSort = FunctionMapToArrayAdapter, NameMapReverseSort>; +using FunctionMapPartialSort = FunctionMapToArrayAdapter, NameMapPartialSort>; +using FunctionMapPartialReverseSort = FunctionMapToArrayAdapter, NameMapPartialReverseSort>; + +REGISTER_FUNCTION(MapMiscellaneous) +{ + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); +} + +} diff --git a/src/Functions/map.cpp b/src/Functions/map.cpp index 549de200bea..e1780df7148 100644 --- a/src/Functions/map.cpp +++ b/src/Functions/map.cpp @@ -2,22 +2,11 @@ #include #include #include -#include #include -#include -#include -#include -#include -#include +#include #include +#include #include -#include - -#include -#include -#include "array/arrayIndex.h" -#include "Functions/like.h" -#include "Functions/FunctionsStringSearch.h" namespace DB @@ -228,372 +217,6 @@ public: } }; -struct NameMapContains { static constexpr auto name = "mapContains"; }; - -class FunctionMapContains : public IFunction -{ -public: - static constexpr auto name = NameMapContains::name; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } - - String getName() const override - { - return NameMapContains::name; - } - - size_t getNumberOfArguments() const override { return impl.getNumberOfArguments(); } - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & arguments) const override - { - return impl.isSuitableForShortCircuitArgumentsExecution(arguments); - } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - return impl.getReturnTypeImpl(arguments); - } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override - { - return impl.executeImpl(arguments, result_type, input_rows_count); - } - -private: - FunctionArrayIndex impl; -}; - - -class FunctionMapKeys : public IFunction -{ -public: - static constexpr auto name = "mapKeys"; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } - - String getName() const override - { - return name; - } - - size_t getNumberOfArguments() const override { return 1; } - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - if (arguments.size() != 1) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, - "Number of arguments for function {} doesn't match: passed {}, should be 1", - getName(), arguments.size()); - - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - - if (!map_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a map", getName()); - - auto key_type = map_type->getKeyType(); - - return std::make_shared(key_type); - } - - bool useDefaultImplementationForConstants() const override { return true; } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t /*input_rows_count*/) const override - { - const ColumnMap * col_map = typeid_cast(arguments[0].column.get()); - if (!col_map) - return nullptr; - - const auto & nested_column = col_map->getNestedColumn(); - const auto & keys_data = col_map->getNestedData().getColumn(0); - - return ColumnArray::create(keys_data.getPtr(), nested_column.getOffsetsPtr()); - } -}; - - -class FunctionMapValues : public IFunction -{ -public: - static constexpr auto name = "mapValues"; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } - - String getName() const override - { - return name; - } - - size_t getNumberOfArguments() const override { return 1; } - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - if (arguments.size() != 1) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, - "Number of arguments for function {} doesn't match: passed {}, should be 1", - getName(), arguments.size()); - - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - - if (!map_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a map", getName()); - - auto value_type = map_type->getValueType(); - - return std::make_shared(value_type); - } - - bool useDefaultImplementationForConstants() const override { return true; } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t /*input_rows_count*/) const override - { - const ColumnMap * col_map = typeid_cast(arguments[0].column.get()); - if (!col_map) - return nullptr; - - const auto & nested_column = col_map->getNestedColumn(); - const auto & values_data = col_map->getNestedData().getColumn(1); - - return ColumnArray::create(values_data.getPtr(), nested_column.getOffsetsPtr()); - } -}; - -class FunctionMapContainsKeyLike : public IFunction -{ -public: - static constexpr auto name = "mapContainsKeyLike"; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } - String getName() const override { return name; } - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*info*/) const override { return true; } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override - { - bool is_const = isColumnConst(*arguments[0].column); - const ColumnMap * col_map = is_const ? checkAndGetColumnConstData(arguments[0].column.get()) - : checkAndGetColumn(arguments[0].column.get()); - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - if (!col_map || !map_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a map", getName()); - - auto col_res = ColumnVector::create(); - typename ColumnVector::Container & vec_res = col_res->getData(); - - if (input_rows_count == 0) - return col_res; - - vec_res.resize(input_rows_count); - - const auto & column_array = typeid_cast(col_map->getNestedColumn()); - const auto & column_tuple = typeid_cast(column_array.getData()); - - const ColumnString * column_string = checkAndGetColumn(column_tuple.getColumn(0)); - const ColumnFixedString * column_fixed_string = checkAndGetColumn(column_tuple.getColumn(0)); - - FunctionLike func_like; - - for (size_t row = 0; row < input_rows_count; ++row) - { - size_t element_start_row = row != 0 ? column_array.getOffsets()[row-1] : 0; - size_t elem_size = column_array.getOffsets()[row]- element_start_row; - - ColumnPtr sub_map_column; - DataTypePtr data_type; - - //The keys of one row map will be processed as a single ColumnString - if (column_string) - { - sub_map_column = column_string->cut(element_start_row, elem_size); - data_type = std::make_shared(); - } - else - { - sub_map_column = column_fixed_string->cut(element_start_row, elem_size); - data_type = std::make_shared(checkAndGetColumn(sub_map_column.get())->getN()); - } - - size_t col_key_size = sub_map_column->size(); - auto column = is_const ? ColumnConst::create(std::move(sub_map_column), std::move(col_key_size)) : std::move(sub_map_column); - - ColumnsWithTypeAndName new_arguments = - { - { - column, - data_type, - "" - }, - arguments[1] - }; - - auto res = func_like.executeImpl(new_arguments, result_type, input_rows_count); - const auto & container = checkAndGetColumn(res.get())->getData(); - - const auto it = std::find_if(container.begin(), container.end(), [](int element){ return element == 1; }); // NOLINT - vec_res[row] = it == container.end() ? 0 : 1; - } - - return col_res; - } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - if (arguments.size() != 2) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, - "Number of arguments for function {} doesn't match: passed {}, should be 2", - getName(), arguments.size()); - - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - const DataTypeString * pattern_type = checkAndGetDataType(arguments[1].type.get()); - - if (!map_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a Map", getName()); - if (!pattern_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Second argument for function {} must be String", getName()); - - if (!isStringOrFixedString(map_type->getKeyType())) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Key type of map for function {} must be `String` or `FixedString`", getName()); - - return std::make_shared(); - } - - size_t getNumberOfArguments() const override { return 2; } - - bool useDefaultImplementationForConstants() const override { return true; } -}; - -class FunctionExtractKeyLike : public IFunction -{ -public: - static constexpr auto name = "mapExtractKeyLike"; - static FunctionPtr create(ContextPtr) { return std::make_shared(); } - - String getName() const override - { - return name; - } - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*info*/) const override { return true; } - - size_t getNumberOfArguments() const override { return 2; } - - DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override - { - if (arguments.size() != 2) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, - "Number of arguments for function {} doesn't match: passed {}, should be 2", - getName(), arguments.size()); - - - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - - if (!map_type) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a map", getName()); - - - auto key_type = map_type->getKeyType(); - - WhichDataType which(key_type); - - if (!which.isStringOrFixedString()) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Function {}only support the map with String or FixedString key", - getName()); - - if (!isStringOrFixedString(arguments[1].type)) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Second argument passed to function {} must be String or FixedString", getName()); - - return std::make_shared(map_type->getKeyType(), map_type->getValueType()); - } - - bool useDefaultImplementationForConstants() const override { return true; } - - ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override - { - bool is_const = isColumnConst(*arguments[0].column); - const ColumnMap * col_map = typeid_cast(arguments[0].column.get()); - - //It may not be necessary to check this condition, cause it will be checked in getReturnTypeImpl function - if (!col_map) - return nullptr; - - const DataTypeMap * map_type = checkAndGetDataType(arguments[0].type.get()); - auto key_type = map_type->getKeyType(); - auto value_type = map_type->getValueType(); - - const auto & nested_column = col_map->getNestedColumn(); - const auto & keys_column = col_map->getNestedData().getColumn(0); - const auto & values_column = col_map->getNestedData().getColumn(1); - const ColumnString * keys_string_column = checkAndGetColumn(keys_column); - const ColumnFixedString * keys_fixed_string_column = checkAndGetColumn(keys_column); - - FunctionLike func_like; - - //create result data - MutableColumnPtr keys_data = key_type->createColumn(); - MutableColumnPtr values_data = value_type->createColumn(); - MutableColumnPtr offsets = DataTypeNumber().createColumn(); - - IColumn::Offset current_offset = 0; - - for (size_t row = 0; row < input_rows_count; ++row) - { - size_t element_start_row = row != 0 ? nested_column.getOffsets()[row-1] : 0; - size_t element_size = nested_column.getOffsets()[row]- element_start_row; - - ColumnsWithTypeAndName new_arguments; - ColumnPtr sub_map_column; - DataTypePtr data_type; - - if (keys_string_column) - { - sub_map_column = keys_string_column->cut(element_start_row, element_size); - data_type = std::make_shared(); - } - else - { - sub_map_column = keys_fixed_string_column->cut(element_start_row, element_size); - data_type =std::make_shared(checkAndGetColumn(sub_map_column.get())->getN()); - } - - size_t col_key_size = sub_map_column->size(); - auto column = is_const? ColumnConst::create(std::move(sub_map_column), std::move(col_key_size)) : std::move(sub_map_column); - - new_arguments = { - { - column, - data_type, - "" - }, - arguments[1] - }; - - auto res = func_like.executeImpl(new_arguments, result_type, input_rows_count); - const auto & container = checkAndGetColumn(res.get())->getData(); - - for (size_t row_num = 0; row_num < element_size; ++row_num) - { - if (container[row_num] == 1) - { - auto key_ref = keys_string_column ? - keys_string_column->getDataAt(element_start_row + row_num) : - keys_fixed_string_column->getDataAt(element_start_row + row_num); - auto value_ref = values_column.getDataAt(element_start_row + row_num); - - keys_data->insertData(key_ref.data, key_ref.size); - values_data->insertData(value_ref.data, value_ref.size); - current_offset += 1; - } - } - - offsets->insert(current_offset); - } - - auto result_nested_column = ColumnArray::create( - ColumnTuple::create(Columns{std::move(keys_data), std::move(values_data)}), - std::move(offsets)); - - return ColumnMap::create(result_nested_column); - } -}; - class FunctionMapUpdate : public IFunction { public: @@ -723,15 +346,9 @@ public: REGISTER_FUNCTION(Map) { factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); factory.registerAlias("MAP_FROM_ARRAYS", "mapFromArrays"); - } } diff --git a/src/Functions/mapFilter.cpp b/src/Functions/mapFilter.cpp deleted file mode 100644 index 038e3bb3ce0..00000000000 --- a/src/Functions/mapFilter.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -namespace DB -{ - -namespace ErrorCodes -{ - extern const int ILLEGAL_COLUMN; - extern const int ILLEGAL_TYPE_OF_ARGUMENT; - extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; -} - -/** Higher-order functions for map. - * These functions optionally apply a map by lambda function, - * and return some result based on that transformation. - */ - - -/** mapFilter((k, v) -> predicate, map) - leave in the map only the kv elements for which the expression is true. - */ -struct MapFilterImpl -{ - using data_type = DataTypeMap; - using column_type = ColumnMap; - - static constexpr auto name = "mapFilter"; - - static bool needBoolean() { return true; } - static bool needExpression() { return true; } - static bool needOneArray() { return true; } - - static DataTypePtr getReturnType(const DataTypePtr & /*expression_return*/, const DataTypes & elems) - { - return std::make_shared(elems); - } - - /// If there are several arrays, the first one is passed here. - static ColumnPtr execute(const ColumnMap & map_column, ColumnPtr mapped) - { - const ColumnUInt8 * column_filter = typeid_cast(&*mapped); - - if (!column_filter) - { - const auto * column_filter_const = checkAndGetColumnConst(&*mapped); - - if (!column_filter_const) - throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected type of filter column"); - - if (column_filter_const->getValue()) - return map_column.clone(); - else - { - const auto * column_array = typeid_cast(map_column.getNestedColumnPtr().get()); - const auto * column_tuple = typeid_cast(column_array->getDataPtr().get()); - ColumnPtr keys = column_tuple->getColumnPtr(0)->cloneEmpty(); - ColumnPtr values = column_tuple->getColumnPtr(1)->cloneEmpty(); - return ColumnMap::create(keys, values, ColumnArray::ColumnOffsets::create(map_column.size(), 0)); - } - } - - const IColumn::Filter & filter = column_filter->getData(); - ColumnPtr filtered = map_column.getNestedColumn().getData().filter(filter, -1); - - const IColumn::Offsets & in_offsets = map_column.getNestedColumn().getOffsets(); - auto column_offsets = ColumnArray::ColumnOffsets::create(in_offsets.size()); - IColumn::Offsets & out_offsets = column_offsets->getData(); - - size_t in_pos = 0; - size_t out_pos = 0; - for (size_t i = 0; i < in_offsets.size(); ++i) - { - for (; in_pos < in_offsets[i]; ++in_pos) - { - if (filter[in_pos]) - ++out_pos; - } - out_offsets[i] = out_pos; - } - - return ColumnMap::create(ColumnArray::create(filtered, std::move(column_offsets))); - } -}; - - -/** mapApply((k,v) -> expression, map) - apply the expression to the map. - */ -struct MapApplyImpl -{ - using data_type = DataTypeMap; - using column_type = ColumnMap; - - static constexpr auto name = "mapApply"; - - /// true if the expression (for an overload of f(expression, maps)) or a map (for f(map)) should be boolean. - static bool needBoolean() { return false; } - static bool needExpression() { return true; } - static bool needOneArray() { return true; } - - static DataTypePtr getReturnType(const DataTypePtr & expression_return, const DataTypes & /*elems*/) - { - const auto * tuple_types = typeid_cast(expression_return.get()); - if (!tuple_types) - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Expected return type is tuple, got {}", expression_return->getName()); - if (tuple_types->getElements().size() != 2) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, - "Expected 2 columns as map's key and value, but found {}", tuple_types->getElements().size()); - - return std::make_shared(tuple_types->getElements()); - } - - static ColumnPtr execute(const ColumnMap & map, ColumnPtr mapped) - { - const auto * column_tuple = checkAndGetColumn(mapped.get()); - if (!column_tuple) - { - const ColumnConst * column_const_tuple = checkAndGetColumnConst(mapped.get()); - if (!column_const_tuple) - throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Expected tuple column, found {}", mapped->getName()); - auto cols = convertConstTupleToConstantElements(*column_const_tuple); - return ColumnMap::create(cols[0]->convertToFullColumnIfConst(), cols[1]->convertToFullColumnIfConst(), map.getNestedColumn().getOffsetsPtr()); - } - - return ColumnMap::create(column_tuple->getColumnPtr(0), column_tuple->getColumnPtr(1), - map.getNestedColumn().getOffsetsPtr()); - } -}; - -REGISTER_FUNCTION(MapApply) -{ - factory.registerFunction>(); - factory.registerFunction>(); -} - -} - - diff --git a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference index eb8bc83384e..4ad16ee1290 100644 --- a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference +++ b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference @@ -4,3 +4,7 @@ 4 {'4-K1':'4-V1','4-K2':'4-V2'} 5 {'5-K1':'5-V1','5-K2':'5-V2'} 6 {'6-K1':'6-V1','6-K2':'6-V2'} +1 +1 +1 +1 diff --git a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql index 7d9722b4c90..01d7e06d0f6 100644 --- a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql +++ b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql @@ -10,3 +10,8 @@ SELECT id, map FROM map_containsKeyLike_test WHERE mapContainsKeyLike(map, '1-%' SELECT id, map FROM map_containsKeyLike_test WHERE mapContainsKeyLike(map, '3-%') = 0 order by id; DROP TABLE map_containsKeyLike_test; + +SELECT mapContainsKeyLike(map('aa', 1, 'bb', 2), 'a%'); +SELECT mapContainsKeyLike(map('aa', 1, 'bb', 2), materialize('a%')); +SELECT mapContainsKeyLike(materialize(map('aa', 1, 'bb', 2)), 'a%'); +SELECT mapContainsKeyLike(materialize(map('aa', 1, 'bb', 2)), materialize('a%')); diff --git a/tests/queries/0_stateless/02111_function_mapExtractKeyLike.reference b/tests/queries/0_stateless/02111_function_mapExtractKeyLike.reference index 45edbc24c75..c6bd4c31538 100644 --- a/tests/queries/0_stateless/02111_function_mapExtractKeyLike.reference +++ b/tests/queries/0_stateless/02111_function_mapExtractKeyLike.reference @@ -21,3 +21,7 @@ The results of query: SELECT id, mapExtractKeyLike(map, \'5-K1\') FROM map_extra 4 {} 5 {'5-K1':'5-V1'} 6 {} +{'aa':1} +{'aa':1} +{'aa':1} +{'aa':1} diff --git a/tests/queries/0_stateless/02111_function_mapExtractKeyLike.sql b/tests/queries/0_stateless/02111_function_mapExtractKeyLike.sql index 31f53642b74..a17b6b74595 100644 --- a/tests/queries/0_stateless/02111_function_mapExtractKeyLike.sql +++ b/tests/queries/0_stateless/02111_function_mapExtractKeyLike.sql @@ -7,7 +7,7 @@ INSERT INTO map_extractKeyLike_test VALUES (3, {'P1-K1':'3-V1','P2-K2':'3-V2'}), INSERT INTO map_extractKeyLike_test VALUES (5, {'5-K1':'5-V1','5-K2':'5-V2'}),(6, {'P3-K1':'6-V1','P4-K2':'6-V2'}); SELECT 'The data of table:'; -SELECT * FROM map_extractKeyLike_test ORDER BY id; +SELECT * FROM map_extractKeyLike_test ORDER BY id; SELECT ''; @@ -20,3 +20,8 @@ SELECT 'The results of query: SELECT id, mapExtractKeyLike(map, \'5-K1\') FROM m SELECT id, mapExtractKeyLike(map, '5-K1') FROM map_extractKeyLike_test ORDER BY id; DROP TABLE map_extractKeyLike_test; + +SELECT mapExtractKeyLike(map('aa', 1, 'bb', 2), 'a%'); +SELECT mapExtractKeyLike(map('aa', 1, 'bb', 2), materialize('a%')); +SELECT mapExtractKeyLike(materialize(map('aa', 1, 'bb', 2)), 'a%'); +SELECT mapExtractKeyLike(materialize(map('aa', 1, 'bb', 2)), materialize('a%')); diff --git a/tests/queries/0_stateless/02169_map_functions.sql b/tests/queries/0_stateless/02169_map_functions.sql index 4cccaa56722..80025314fa2 100644 --- a/tests/queries/0_stateless/02169_map_functions.sql +++ b/tests/queries/0_stateless/02169_map_functions.sql @@ -7,7 +7,7 @@ SELECT mapFilter((k, v) -> k like '%3' and v > 102, col) FROM table_map ORDER BY SELECT col, mapFilter((k, v) -> ((v % 10) > 1), col) FROM table_map ORDER BY id ASC; SELECT mapApply((k, v) -> (k, v + 1), col) FROM table_map ORDER BY id; SELECT mapFilter((k, v) -> 0, col) from table_map; -SELECT mapApply((k, v) -> tuple(v + 9223372036854775806), col) FROM table_map; -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +SELECT mapApply((k, v) -> tuple(v + 9223372036854775806), col) FROM table_map; -- { serverError BAD_ARGUMENTS } SELECT mapUpdate(map(1, 3, 3, 2), map(1, 0, 2, 0)); SELECT mapApply((x, y) -> (x, x + 1), map(1, 0, 2, 0)); @@ -16,22 +16,22 @@ SELECT mapApply((x, y) -> ('x', 'y'), map(1, 0, 2, 0)); SELECT mapApply((x, y) -> ('x', 'y'), materialize(map(1, 0, 2, 0))); SELECT mapApply(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } -SELECT mapApply((x, y) -> (x), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapApply((x, y) -> ('x'), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapApply((x) -> (x, x), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapApply((x, y) -> (x, 1, 2), map(1, 0, 2, 0)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } -SELECT mapApply((x, y) -> (x, x + 1)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +SELECT mapApply((x, y) -> (x), map(1, 0, 2, 0)); -- { serverError BAD_ARGUMENTS } +SELECT mapApply((x, y) -> ('x'), map(1, 0, 2, 0)); -- { serverError BAD_ARGUMENTS } +SELECT mapApply((x) -> (x, x), map(1, 0, 2, 0)); -- { serverError BAD_ARGUMENTS } +SELECT mapApply((x, y) -> (x, 1, 2), map(1, 0, 2, 0)); -- { serverError BAD_ARGUMENTS } +SELECT mapApply((x, y) -> (x, x + 1)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapApply(map(1, 0, 2, 0), (x, y) -> (x, x + 1)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapApply((x, y) -> (x, x+1), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +SELECT mapApply((x, y) -> (x, x+1), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } SELECT mapFilter((x, y) -> (toInt32(x)), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter((x, y) -> ('x'), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter((x) -> (x, x), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter((x, y) -> (x, 1, 2), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapFilter((x, y) -> (x, x + 1)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +SELECT mapFilter((x, y) -> (x, x + 1)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter(map(1, 0, 2, 0), (x, y) -> (x > 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } -SELECT mapFilter((x, y) -> (x, x + 1), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } +SELECT mapFilter((x, y) -> (x, x + 1), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapUpdate(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } SELECT mapUpdate(map(1, 3, 3, 2), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } From 7854800517047e1b94e138de7e65c36715fef28e Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Mon, 27 Mar 2023 19:35:22 +0200 Subject: [PATCH 111/535] Almost works --- .../keyvaluepair/src/KeyValuePairExtractor.h | 4 +- .../src/KeyValuePairExtractorBuilder.cpp | 4 +- .../src/KeyValuePairExtractorBuilder.h | 6 +- .../src/impl/CHKeyValuePairExtractor.h | 97 +++++-- .../src/impl/state/Configuration.cpp | 11 +- .../src/impl/state/StateHandler.h | 67 ++++- .../escaping/InlineEscapingStateHandler.cpp | 253 ++++++++++++------ .../escaping/InlineEscapingStateHandler.h | 14 +- .../noescaping/NoEscapingKeyStateHandler.cpp | 25 +- .../noescaping/NoEscapingKeyStateHandler.h | 8 +- .../NoEscapingValueStateHandler.cpp | 10 +- .../noescaping/NoEscapingValueStateHandler.h | 6 +- .../state/strategies/util/CharacterFinder.cpp | 8 +- .../util/EscapedCharacterReader.cpp | 36 --- .../strategies/util/EscapedCharacterReader.h | 33 --- .../state/strategies/util/NeedleFactory.cpp | 7 +- .../tests/gtest_character_finder.cpp | 4 +- .../tests/gtest_escaped_sequence_reader.cpp | 114 ++++---- ...test_escaping_key_value_pair_extractor.cpp | 2 +- ...test_inline_escaping_key_state_handler.cpp | 14 +- ...st_inline_escaping_value_state_handler.cpp | 6 +- .../tests/gtest_key_value_pair_extractor.cpp | 12 +- .../gtest_no_escaping_key_state_handler.cpp | 10 +- 23 files changed, 446 insertions(+), 305 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h index 311c14a80e1..72f2bc0c955 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h @@ -1,8 +1,10 @@ #pragma once -#include #include +#include +#include + namespace DB { /* diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 015f98aa6ee..8add4653096 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -1,6 +1,6 @@ #include "KeyValuePairExtractorBuilder.h" -#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingKeyStateHandler.h" -#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingValueStateHandler.h" + +#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h" #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "impl/CHKeyValuePairExtractor.h" diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index da04c1c93d5..781e75cf73b 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -3,11 +3,15 @@ #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" #include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" #include "KeyValuePairExtractor.h" -#include "impl/CHKeyValuePairExtractor.h" +//#include "impl/CHKeyValuePairExtractor.h" + +#include namespace DB { +struct KeyValuePairExtractor; + class KeyValuePairExtractorBuilder { public: diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index 5f0ff4614de..2c1c78a6233 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -3,9 +3,12 @@ #include #include #include +#include "Functions/keyvaluepair/src/impl/state/State.h" +#include "fmt/core.h" #include "state/StateHandler.h" #include "../KeyValuePairExtractor.h" +#include namespace DB { @@ -28,68 +31,124 @@ public: uint64_t extract(std::string_view data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) override { - auto state = State::WAITING_KEY; - - std::size_t pos = 0; +// std::cerr << "CHKeyValuePairExtractor::extract: \"" << data << "\"" << std::endl; + auto state = State::WAITING_KEY; Key key; Value value; uint64_t row_offset = 0; + const auto & config = key_state_handler.extractor_configuration; + std::cerr << "CHKeyValuePairExtractor::extract with " + << typeid(key_state_handler).name() << " \\ " + << typeid(value_state_handler).name() + << "\nConfiguration" + << "\n\tKV delimiter: '" << config.key_value_delimiter << "'" + << "\n\tquote char : '" << config.quoting_character << "'" + << "\n\tpair delims : " << fmt::format("['{}']", fmt::join(config.pair_delimiters, "', '")) + << std::endl; + NextState next_state = {0, state}; while (state != State::END) { - auto next_state = processState(data, pos, state, key, value, keys, values, row_offset); + std::cerr << "CHKeyValuePairExtractor::extract 1, state: " + << magic_enum::enum_name(state) + << " (" << data.size() << ") " + << fancyQuote(data) + << std::endl; - pos = next_state.position_in_string; - state = next_state.state; + next_state = processState(data, state, key, value, keys, values, row_offset); + + std::cerr << "CHKeyValuePairExtractor::extract 2, new_state: " + << magic_enum::enum_name(next_state.state) + << " consumed chars: (" << next_state.position_in_string << ") " + << fancyQuote(data.substr(0, std::min(data.size(), next_state.position_in_string))) + << std::endl; + + if (next_state.position_in_string > data.size() && next_state.state != State::END) { + throw Exception(ErrorCodes::LOGICAL_ERROR, + "Attempt to move read poiter past end of available data, from state {} to new state: {}, new position: {}, available data: {}", + magic_enum::enum_name(state), magic_enum::enum_name(next_state.state), + next_state.position_in_string, data.size()); +// next_result = {data.size(), State::END}; + } + + data.remove_prefix(next_state.position_in_string); + state = next_state.state; + + if (data.size() == 0) + state = State::END; } + // if break occured earlier, consume previously generated pair + if (next_state.state == State::FLUSH_PAIR || !(key.empty() && value.empty())) + flushPair(data, key, value, keys, values, row_offset); + return row_offset; } private: - NextState processState(std::string_view file, std::size_t pos, State state, Key & key, + NextState processState(std::string_view file, State state, Key & key, Value & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) { switch (state) { case State::WAITING_KEY: - return key_state_handler.wait(file, pos); + return key_state_handler.wait(file); case State::READING_KEY: - return key_state_handler.read(file, pos, key); + { + auto result = key_state_handler.read(file, key); + std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; + return result; + } case State::READING_QUOTED_KEY: - return key_state_handler.readQuoted(file, pos, key); + { + auto result = key_state_handler.readQuoted(file, key); + std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; + return result; + } case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file, pos); + return key_state_handler.readKeyValueDelimiter(file); case State::WAITING_VALUE: - return value_state_handler.wait(file, pos); + { + return value_state_handler.wait(file); + } case State::READING_VALUE: - return value_state_handler.read(file, pos, value); + { + auto result = value_state_handler.read(file, value); + std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; + return result; + } case State::READING_QUOTED_VALUE: - return value_state_handler.readQuoted(file, pos, value); + { + auto result = value_state_handler.readQuoted(file, value); + std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; + return result; + } case State::FLUSH_PAIR: - return flushPair(file, pos, key, value, keys, values, row_offset); + return flushPair(file, key, value, keys, values, row_offset); case END: - return {pos, state}; + return {0, state}; } } - NextState flushPair(const std::string_view & file, std::size_t pos, Key & key, + NextState flushPair(const std::string_view & file, Key & key, Value & value, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values, uint64_t & row_offset) { + std::cerr << "CHKeyValuePairExtractor::flushPair key: " << fancyQuote(key) << ", value: " << fancyQuote(value) << std::endl; keys->insertData(key.data(), key.size()); values->insertData(value.data(), value.size()); key = {}; value = {}; - row_offset++; + ++row_offset; + std::cerr << "CHKeyValuePairExtractor::flushPair total pairs: " << row_offset << std::endl; - return {pos, pos == file.size() ? State::END : State::WAITING_KEY}; + return {0, file.size() == 0 ? State::END : State::WAITING_KEY}; } KeyStateHandler key_state_handler; diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp index 9f69652b893..547b924e1df 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp @@ -1,8 +1,6 @@ #include "Configuration.h" #include -#include - namespace DB { @@ -25,14 +23,15 @@ Configuration ConfigurationFactory::createWithoutEscaping(char key_value_delimit Configuration ConfigurationFactory::createWithEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) { - if (key_value_delimiter == EscapedCharacterReader::ESCAPE_CHARACTER - || quoting_character == EscapedCharacterReader::ESCAPE_CHARACTER - || std::find(pair_delimiters.begin(), pair_delimiters.end(), EscapedCharacterReader::ESCAPE_CHARACTER) != pair_delimiters.end()) + constexpr char ESCAPE_CHARACTER = '\\'; + if (key_value_delimiter == ESCAPE_CHARACTER + || quoting_character == ESCAPE_CHARACTER + || std::find(pair_delimiters.begin(), pair_delimiters.end(), ESCAPE_CHARACTER) != pair_delimiters.end()) { throw Exception( ErrorCodes::BAD_ARGUMENTS, "Invalid arguments, {} is reserved for the escaping character", - EscapedCharacterReader::ESCAPE_CHARACTER); + ESCAPE_CHARACTER); } return createWithoutEscaping(key_value_delimiter, quoting_character, pair_delimiters); diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h index 21f5ac3640c..ae2bbfc6124 100644 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h @@ -5,25 +5,27 @@ #include #include "State.h" +#include + namespace DB { template concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) { - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.wait(std::string_view {}) } -> std::same_as; + { handler.read(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readKeyValueDelimiter(std::string_view {}) } -> std::same_as; }; template concept CNoEscapingKeyStateHandler = requires(KeyStateHandler handler) { - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readKeyValueDelimiter(std::string_view {}, std::size_t {}) } -> std::same_as; + { handler.wait(std::string_view {}) } -> std::same_as; + { handler.read(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readKeyValueDelimiter(std::string_view {}) } -> std::same_as; }; template @@ -32,17 +34,17 @@ concept CKeyStateHandler = CInlineEscapingKeyStateHandler || CNoEscapingKeySt template concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) { - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.wait(std::string_view {}) } -> std::same_as; + { handler.read(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; }; template concept CNoEscapingValueStateHandler = requires(ValueStateHandler handler) { - { handler.wait(std::string_view {}, std::size_t {}) } -> std::same_as; - { handler.read(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::size_t {}, std::declval()) } -> std::same_as; + { handler.wait(std::string_view {}) } -> std::same_as; + { handler.read(std::string_view {}, std::declval()) } -> std::same_as; + { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; }; template @@ -59,4 +61,41 @@ protected: [[nodiscard]] static std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end); }; +template +struct CustomQuoted +{ + const char * start_quote = "\""; + const char * end_quote = "\""; + + const T & value; +}; + +template +CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) +{ + assert(start_quote != nullptr); + + return CustomQuoted{ + .start_quote = start_quote, + .end_quote = end_quote ? end_quote : start_quote, + .value = value + }; +} + +template +CustomQuoted fancyQuote(const T & value) +{ + return CustomQuoted{ + .start_quote = "«", + .end_quote = "»", + .value = value + }; +} + +template +std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) +{ + return ostr << val.start_quote << val.value << val.end_quote; +} + } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp index f605a1823dd..a68e3f06e61 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp @@ -1,18 +1,160 @@ -#include "InlineEscapingValueStateHandler.h" +#include "InlineEscapingStateHandler.h" #include -#include #include #include +#include +#include namespace { +size_t consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, std::string & output) +{ + output.insert(output.end(), file.begin() + start_pos, file.begin() + character_pos); + DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); + DB::parseComplexEscapeSequence(output, buf); + + return buf.getPosition(); +} } namespace DB { +InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(Configuration configuration_) + : extractor_configuration(std::move(configuration_)) +{ + wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); + read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); +} + +NextState InlineEscapingKeyStateHandler::wait(std::string_view file) const +{ + const auto quoting_character = extractor_configuration.quoting_character; + size_t pos = 0; + while (const auto * p = find_first_not_symbols_or_null({file.begin() + pos, file.end()}, wait_needles)) + { + const size_t character_position = p - file.begin(); + + if (*p == quoting_character) + { + return {character_position + 1u, State::READING_QUOTED_KEY}; + } + else + { + return {character_position, State::READING_KEY}; + } + } + + return {file.size(), State::END}; +} + +/* + * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. + * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. + * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm + * */ + +NextState InlineEscapingKeyStateHandler::read(std::string_view file, ElementType & key) const +{ + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + + key.clear(); + + size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + { + auto character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (*p == '\\') + { + const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_seq_len; + if (escape_seq_len == 0) + { + return {next_pos, State::WAITING_KEY}; + } + } + else if (*p == key_value_delimiter) + { + key.insert(key.end(), file.begin() + pos, file.begin() + character_position); + + return {next_pos, State::WAITING_VALUE}; + } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + { + return {next_pos, State::WAITING_KEY}; + } + + pos = next_pos; + } + + // might be problematic in case string reaches the end and I haven't copied anything over to key + + return {file.size(), State::END}; +} + +NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, ElementType & key) const +{ + const auto quoting_character = extractor_configuration.quoting_character; + + key.clear(); + + size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) + { + size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (*p == '\\') + { + const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_seq_len; + + if (escape_seq_len == 0) + { + return {next_pos, State::WAITING_KEY}; + } + } + else if (*p == quoting_character) + { + // todo try to optimize with resize and memcpy + for (size_t i = pos; i < character_position; ++i) + { + key.push_back(file[i]); + } + + if (key.empty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::READING_KV_DELIMITER}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; +} + +NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const +{ + if (file.size() == 0) + { + return {0, State::END}; + } + else + { + const auto current_character = file[0]; + return {0, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; + } +} + + InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(Configuration extractor_configuration_) : extractor_configuration(std::move(extractor_configuration_)) { @@ -20,11 +162,11 @@ InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(Configuration e read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); } -NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +NextState InlineEscapingValueStateHandler::wait(std::string_view file) const { - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + size_t pos = 0; if (pos < file.size()) { const auto current_character = file[pos]; @@ -46,59 +188,36 @@ NextState InlineEscapingValueStateHandler::wait(std::string_view file, size_t po return {pos, State::READING_VALUE}; } -NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const +NextState InlineEscapingValueStateHandler::read(std::string_view file, ElementType & value) const { - BoundsSafeCharacterFinder finder; - - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; value.clear(); - /* - * Maybe modify finder return type to be the actual pos. In case of failures, it shall return pointer to the end. - * It might help updating current pos? - * */ - - while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) + size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; + auto character_position = p - file.begin(); + size_t next_pos = character_position + 1u; - if (EscapedCharacterReader::ESCAPE_CHARACTER == character) + if (*p == '\\') { - for (auto i = pos; i < character_position; i++) - { - value.push_back(file[i]); - } - - auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - next_pos = next_byte_ptr - file.begin(); - - if (escaped_characters.empty()) + const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_seq_len; + if (escape_seq_len == 0) { return {next_pos, State::WAITING_KEY}; } - else - { - for (auto escaped_character : escaped_characters) - { - value.push_back(escaped_character); - } - } } - else if (key_value_delimiter == character) + else if (*p == key_value_delimiter) { + // reached new key return {next_pos, State::WAITING_KEY}; } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) { - // todo try to optimize with resize and memcpy - for (auto i = pos; i < character_position; i++) - { - value.push_back(file[i]); - } + // reached next pair + value.insert(value.end(), file.begin() + pos, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; } @@ -106,57 +225,37 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, size_t po pos = next_pos; } - for (; pos < file.size(); pos++) - { - value.push_back(file[pos]); - } + // Reached end of input, consume rest of the file as value and make sure KV pair is produced. + value.insert(value.end(), file.begin() + pos, file.end()); return {pos, State::FLUSH_PAIR}; } -NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & value) const +NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, ElementType & value) const { - BoundsSafeCharacterFinder finder; - const auto quoting_character = extractor_configuration.quoting_character; + const std::string_view needles{read_quoted_needles.begin(), read_quoted_needles.end()}; value.clear(); - while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) + size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, needles)) { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; + auto character_position = p - file.begin(); + size_t next_pos = character_position + 1u; - if (character == EscapedCharacterReader::ESCAPE_CHARACTER) + if (*p == '\\') { - for (auto i = pos; i < character_position; i++) - { - value.push_back(file[i]); - } - - auto [next_byte_ptr, escaped_characters] = EscapedCharacterReader::read(file, character_position); - next_pos = next_byte_ptr - file.begin(); - - if (escaped_characters.empty()) + const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_seq_len; + if (escape_seq_len == 0) { return {next_pos, State::WAITING_KEY}; } - else - { - for (auto escaped_character : escaped_characters) - { - value.push_back(escaped_character); - } - } } - else if (quoting_character == character) + else if (*p == quoting_character) { - // todo try to optimize with resize and memcpy - for (auto i = pos; i < character_position; i++) - { - value.push_back(file[i]); - } + value.insert(value.end(), file.begin() + pos, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h index de8b34cff8b..23bbd062284 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h @@ -16,13 +16,13 @@ public: explicit InlineEscapingKeyStateHandler(Configuration configuration_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState wait(std::string_view file) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState read(std::string_view file, ElementType & key) const; - [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & key) const; - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; private: Configuration extractor_configuration; @@ -40,11 +40,11 @@ public: explicit InlineEscapingValueStateHandler(Configuration extractor_configuration_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState wait(std::string_view file) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState read(std::string_view file, ElementType & value) const; - [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & value) const; private: Configuration extractor_configuration; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index 80c91e7279a..eeffef881e6 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -13,12 +13,12 @@ NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(Configuration extractor_con read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } -NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) const +NextState NoEscapingKeyStateHandler::wait(std::string_view file) const { BoundsSafeCharacterFinder finder; const auto quoting_character = extractor_configuration.quoting_character; - + size_t pos = 0; while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) { auto character_position = *character_position_opt; @@ -37,7 +37,7 @@ NextState NoEscapingKeyStateHandler::wait(std::string_view file, size_t pos) con return {file.size(), State::END}; } -NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, ElementType & key) const +NextState NoEscapingKeyStateHandler::read(std::string_view file, ElementType & key) const { BoundsSafeCharacterFinder finder; @@ -46,6 +46,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele key = {}; + size_t pos = 0; auto start_index = pos; while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) @@ -76,7 +77,7 @@ NextState NoEscapingKeyStateHandler::read(std::string_view file, size_t pos, Ele return {file.size(), State::END}; } -NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & key) const +NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, ElementType & key) const { BoundsSafeCharacterFinder finder; @@ -84,6 +85,7 @@ NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, size_t po key = {}; + size_t pos = 0; auto start_index = pos; while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) @@ -110,17 +112,20 @@ NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, size_t po return {file.size(), State::END}; } -NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file, size_t pos) const +NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const { - if (pos == file.size()) + if (file.size() == 0) { - return {pos, State::END}; + return {0, State::END}; } - else + + const auto current_character = file[0]; + if (current_character == extractor_configuration.key_value_delimiter) { - const auto current_character = file[pos++]; - return {pos, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; + return {1, State::WAITING_VALUE}; } + + return {0, State::WAITING_KEY}; } } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h index ad53272e110..e47eb482aec 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h @@ -13,13 +13,13 @@ public: explicit NoEscapingKeyStateHandler(Configuration extractor_configuration_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState wait(std::string_view file) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState read(std::string_view file, ElementType & key) const; - [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & key) const; + [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & key) const; - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file, size_t pos) const; + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; private: Configuration extractor_configuration; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp index 76b12dab19b..7bc90e9c7e0 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp @@ -12,11 +12,12 @@ NoEscapingValueStateHandler::NoEscapingValueStateHandler(Configuration extractor read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); } -NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) const +NextState NoEscapingValueStateHandler::wait(std::string_view file) const { const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + size_t pos = 0; if (pos < file.size()) { const auto current_character = file[pos]; @@ -38,8 +39,9 @@ NextState NoEscapingValueStateHandler::wait(std::string_view file, size_t pos) c return {file.size(), State::READING_VALUE}; } -NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, ElementType & value) const +NextState NoEscapingValueStateHandler::read(std::string_view file, ElementType & value) const { + size_t pos = 0; auto start_index = pos; value = {}; @@ -74,8 +76,9 @@ NextState NoEscapingValueStateHandler::read(std::string_view file, size_t pos, E return {file.size(), State::FLUSH_PAIR}; } -NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, size_t pos, ElementType & value) const +NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, ElementType & value) const { + size_t pos = 0; auto start_index = pos; value = {}; @@ -94,6 +97,7 @@ NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, size_t { value = createElement(file, start_index, character_position); + std::cerr << "NoEscapingValueStateHandler::readQuoted Going to consume up to: «" << fancyQuote(file.substr(0, next_pos)) << " to " << fancyQuote(file.substr(next_pos)) << std::endl; return {next_pos, State::FLUSH_PAIR}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h index 1a58da9c1f9..25901156ca6 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h @@ -14,11 +14,11 @@ public: explicit NoEscapingValueStateHandler(Configuration extractor_configuration_); - [[nodiscard]] NextState wait(std::string_view file, size_t pos) const; + [[nodiscard]] NextState wait(std::string_view file) const; - [[nodiscard]] NextState read(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState read(std::string_view file, ElementType & value) const; - [[nodiscard]] NextState readQuoted(std::string_view file, size_t pos, ElementType & value) const; + [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & value) const; private: Configuration extractor_configuration; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp index 14dbb804d34..a4c738cc3aa 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp @@ -30,10 +30,10 @@ std::optional CharacterFinder::findFirst(std::string_ std::optional CharacterFinder::findFirstNot(std::string_view haystack, const std::vector & needles) { - if (needles.empty()) - { - return 0u; - } +// if (needles.empty()) +// { +// return 0u; +// } if (const auto * ptr = find_first_not_symbols_or_null(haystack, {needles.begin(), needles.end()})) { diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp deleted file mode 100644 index 2d65a223ab5..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "EscapedCharacterReader.h" - -#include - -#include -#include - -namespace DB -{ - -EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view element, std::size_t offset) -{ - return read({element.begin() + offset, element.end()}); -} - -EscapedCharacterReader::ReadResult EscapedCharacterReader::read(std::string_view str) -{ - std::string escaped_sequence; - - auto rb = ReadBufferFromString(str); - - if (parseComplexEscapeSequence(escaped_sequence, rb)) - { - return { - rb.position(), - {escaped_sequence.begin(), escaped_sequence.end()} - }; - } - - return { - rb.position(), - {} - }; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h deleted file mode 100644 index 2e048f04095..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/EscapedCharacterReader.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include - -namespace DB -{ - -/* - * Takes in an escape sequence like: \n \t \xHH \0NNN and return its parsed character - * Example: - * Input: "\n", Output: {0xA} - * Input: "\xFF", Output: {0xFF} - * Input: "\0377", Output: {0xFF} - * It can also take non-standard escape sequences, in which case it'll simply return the input. - * Examples: - * Input: "\h", Output {'\', 'h'} - * */ -class EscapedCharacterReader -{ -public: - static constexpr char ESCAPE_CHARACTER = '\\'; - struct ReadResult - { - const char * ptr; - std::vector characters; - }; - - static ReadResult read(std::string_view element); - static ReadResult read(std::string_view element, std::size_t offset); -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp index a9279c12cf7..6863e28984c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp @@ -1,5 +1,4 @@ #include "NeedleFactory.h" -#include "EscapedCharacterReader.h" namespace DB { @@ -54,7 +53,7 @@ std::vector EscapingNeedleFactory::getWaitNeedles(const DB::Configuration { auto needles = NeedleFactory::getWaitNeedles(extractor_configuration); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back('\\'); return needles; } @@ -63,7 +62,7 @@ std::vector EscapingNeedleFactory::getReadNeedles(const Configuration & ex { auto needles = NeedleFactory::getReadNeedles(extractor_configuration); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back('\\'); return needles; } @@ -72,7 +71,7 @@ std::vector EscapingNeedleFactory::getReadQuotedNeedles(const Configuratio { auto needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); - needles.push_back(EscapedCharacterReader::ESCAPE_CHARACTER); + needles.push_back('\\'); return needles; } diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp index 2bc80c93999..aba637079a9 100644 --- a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp @@ -36,7 +36,7 @@ void test_find_first_not(const CharacterFinder& finder, const std::string_view& } } -TEST(CharacterFinderTest, FindFirst) +TEST(extractKVPair_CharacterFinderTest, FindFirst) { CharacterFinder finder; @@ -66,7 +66,7 @@ TEST(CharacterFinderTest, FindFirst) test_find_first(finder, special_needle, special_needles, std::make_optional>('=', 4)); } -TEST(CharacterFinderTest, FindFirstNot) +TEST(extractKVPair_CharacterFinderTest, FindFirstNot) { CharacterFinder finder; diff --git a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp index c36b729e00c..8e9595aa273 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp @@ -1,71 +1,71 @@ -#include -#include +//#include +//#include -namespace DB -{ +//namespace DB +//{ -void test(std::string_view input, const std::vector & expected_characters, std::size_t expected_bytes_read) -{ - auto read_result = EscapedCharacterReader::read(input); +//void test(std::string_view input, const std::vector & expected_characters, std::size_t expected_bytes_read) +//{ +// auto read_result = extractKVPair_EscapedCharacterReader::read(input); - ASSERT_EQ(expected_characters, read_result.characters); +// ASSERT_EQ(expected_characters, read_result.characters); - auto bytes_read = read_result.ptr - input.begin(); +// auto bytes_read = read_result.ptr - input.begin(); - ASSERT_EQ(bytes_read, expected_bytes_read); -} +// ASSERT_EQ(bytes_read, expected_bytes_read); +//} -void test(std::string_view input, const std::vector & expected_characters) -{ - return test(input, expected_characters, input.size()); -} +//void test(std::string_view input, const std::vector & expected_characters) +//{ +// return test(input, expected_characters, input.size()); +//} -TEST(EscapedCharacterReader, HexDigits) -{ -// test("\\xA", {0xA}); - test("\\xAA", {0xAA}); - test("\\xff", {0xFF}); -// test("\\x0", {0x0}); - test("\\x00", {0x0}); +//TEST(extractKVPair_EscapedCharacterReader, HexDigits) +//{ +//// test("\\xA", {0xA}); +// test("\\xAA", {0xAA}); +// test("\\xff", {0xFF}); +//// test("\\x0", {0x0}); +// test("\\x00", {0x0}); -// test("\\xA$", {0xA}, 3); - test("\\xAA$", {0xAA}, 4); - test("\\xff$", {0xFF}, 4); -// test("\\x0$", {0x0}, 3); - test("\\x00$", {0x0}, 4); +//// test("\\xA$", {0xA}, 3); +// test("\\xAA$", {0xAA}, 4); +// test("\\xff$", {0xFF}, 4); +//// test("\\x0$", {0x0}, 3); +// test("\\x00$", {0x0}, 4); - test("\\x", {}); -} +// test("\\x", {}); +//} -TEST(EscapedCharacterReader, OctalDigits) -{ - test("\\0377", {0xFF}); - test("\\0137", {0x5F}); - test("\\013", {0xB}); - test("\\0000", {0x0}); - test("\\000", {0x0}); - test("\\00", {0x0}); +//TEST(extractKVPair_EscapedCharacterReader, OctalDigits) +//{ +// test("\\0377", {0xFF}); +// test("\\0137", {0x5F}); +// test("\\013", {0xB}); +// test("\\0000", {0x0}); +// test("\\000", {0x0}); +// test("\\00", {0x0}); - test("\\0377$", {0xFF}, 5); - test("\\0137$", {0x5F}, 5); - test("\\013$", {0xB}, 4); - test("\\0000$", {0x0}, 5); - test("\\000$", {0x0}, 4); - test("\\00$", {0x0}, 3); -} +// test("\\0377$", {0xFF}, 5); +// test("\\0137$", {0x5F}, 5); +// test("\\013$", {0xB}, 4); +// test("\\0000$", {0x0}, 5); +// test("\\000$", {0x0}, 4); +// test("\\00$", {0x0}, 3); +//} -TEST(EscapedCharacterReader, RegularEscapeSequences) -{ - test("\\n", {0xA}, 2); - test("\\r", {0xD}, 2); - test("\\r", {0xD}, 2); -} +//TEST(extractKVPair_EscapedCharacterReader, RegularEscapeSequences) +//{ +// test("\\n", {0xA}, 2); +// test("\\r", {0xD}, 2); +// test("\\r", {0xD}, 2); +//} -TEST(EscapedCharacterReader, RandomEscapedCharacters) -{ - test("\\h", {'\\', 'h'}); - test("\\g", {'\\', 'g'}); - test("\\", {}); -} +//TEST(extractKVPair_EscapedCharacterReader, RandomEscapedCharacters) +//{ +// test("\\h", {'\\', 'h'}); +// test("\\g", {'\\', 'g'}); +// test("\\", {}); +//} -} +//} diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index 1607054be4f..1be9254519e 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -11,7 +11,7 @@ void assert_byte_equality(StringRef lhs, const std::vector & rhs) ASSERT_EQ(lhs_vector, rhs); } -TEST(EscapingKeyValuePairExtractor, EscapeSequences) +TEST(extractKVPair_EscapingKeyValuePairExtractor, EscapeSequences) { using namespace std::literals; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 3fd2d141689..a8f4aaaa35c 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB @@ -6,7 +6,7 @@ namespace DB void test_wait(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input, 0u); + auto next_state = handler.wait(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); @@ -21,11 +21,11 @@ void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view i if constexpr (quoted) { - next_state = handler.readQuoted(input, 0u, element); + next_state = handler.readQuoted(input, element); } else { - next_state = handler.read(input, 0u, element); + next_state = handler.read(input, element); } ASSERT_EQ(next_state.position_in_string, expected_pos); @@ -45,7 +45,7 @@ void test_read_quoted(const InlineEscapingKeyStateHandler & handler, std::string test_read(handler, input, expected_element, expected_pos, expected_state); } -TEST(InlineEscapingKeyStateHandler, Wait) +TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; @@ -61,7 +61,7 @@ TEST(InlineEscapingKeyStateHandler, Wait) test_wait(handler, "\\\\", 2u, END); } -TEST(InlineEscapingKeyStateHandler, Read) +TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; @@ -86,7 +86,7 @@ TEST(InlineEscapingKeyStateHandler, Read) test_read(handler, "", "", 0u, END); } -TEST(InlineEscapingKeyStateHandler, ReadEnclosed) +TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) { auto pair_delimiters = std::vector{',', ' '}; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index c91ba8f1b09..6eeed4dc7b8 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB @@ -6,13 +6,13 @@ namespace DB void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input, 0u); + auto next_state = handler.wait(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); } -TEST(InlineEscapingValueStateHandler, Wait) +TEST(extractKVPair_InlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index 70fe25d580a..c7245c8af27 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -17,11 +17,11 @@ // return ostr << test_case.input; //} // -//struct KeyValuePairExtractorTest : public ::testing::TestWithParam +//struct extractKVPair_KeyValuePairExtractorTest : public ::testing::TestWithParam //{ //}; // -//TEST_P(KeyValuePairExtractorTest, KeyValuePairExtractorTests) +//TEST(extractKVPair_KeyValuePairExtractorTest, KeyValuePairExtractorTests) //{ // const auto & [input, expected_output, extractor] = GetParam(); // @@ -32,7 +32,7 @@ // //INSTANTIATE_TEST_SUITE_P( // ValuesCanBeEmptyString, -// KeyValuePairExtractorTest, +// extractKVPair_KeyValuePairExtractorTest, // ::testing::ValuesIn(std::initializer_list{ // { // "age:", @@ -56,7 +56,7 @@ // //INSTANTIATE_TEST_SUITE_P( // MixString, -// KeyValuePairExtractorTest, +// extractKVPair_KeyValuePairExtractorTest, // ::testing::ValuesIn(std::initializer_list{ // { // R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", @@ -95,7 +95,7 @@ // //INSTANTIATE_TEST_SUITE_P( // Escaping, -// KeyValuePairExtractorTest, +// extractKVPair_KeyValuePairExtractorTest, // ::testing::ValuesIn(std::initializer_list{ // { // "na,me,: neymar, age:30", @@ -135,7 +135,7 @@ // //INSTANTIATE_TEST_SUITE_P( // EnclosedElements, -// KeyValuePairExtractorTest, +// extractKVPair_KeyValuePairExtractorTest, // ::testing::ValuesIn(std::initializer_list{ // { // R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 999f9624c29..1bf2d71c128 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -6,7 +6,7 @@ namespace DB void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input, 0u); + auto next_state = handler.wait(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); @@ -21,11 +21,11 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex if constexpr (quoted) { - next_state = handler.readQuoted(input, 0u, element); + next_state = handler.readQuoted(input, element); } else { - next_state = handler.read(input, 0u, element); + next_state = handler.read(input, element); } ASSERT_EQ(next_state.position_in_string, expected_pos); @@ -45,7 +45,7 @@ void test_read_quoted(const auto & handler, std::string_view input, std::string_ test_read(handler, input, expected_element, expected_pos, expected_state); } -TEST(NoEscapingKeyStateHandler, Wait) +TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; @@ -64,7 +64,7 @@ TEST(NoEscapingKeyStateHandler, Wait) test_wait(handler, "", 0u, END); } -TEST(NoEscapingKeyStateHandler, Read) +TEST(extractKVPair_NoEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; From e84ae646b6963071d9bd8a8dc966fd017c2676c1 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 27 Mar 2023 17:38:21 +0000 Subject: [PATCH 112/535] move functions to headers --- src/Functions/array/{arrayConcat.cpp => arrayConcat.h} | 0 src/Functions/array/{arrayExists.cpp => arrayExists.h} | 0 src/Functions/array/{arrayFilter.cpp => arrayFilter.h} | 0 src/Functions/array/{arrayMap.cpp => arrayMap.h} | 0 src/Functions/array/{arraySort.cpp => arraySort.h} | 0 src/Functions/{identity.cpp => identity.h} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/Functions/array/{arrayConcat.cpp => arrayConcat.h} (100%) rename src/Functions/array/{arrayExists.cpp => arrayExists.h} (100%) rename src/Functions/array/{arrayFilter.cpp => arrayFilter.h} (100%) rename src/Functions/array/{arrayMap.cpp => arrayMap.h} (100%) rename src/Functions/array/{arraySort.cpp => arraySort.h} (100%) rename src/Functions/{identity.cpp => identity.h} (100%) diff --git a/src/Functions/array/arrayConcat.cpp b/src/Functions/array/arrayConcat.h similarity index 100% rename from src/Functions/array/arrayConcat.cpp rename to src/Functions/array/arrayConcat.h diff --git a/src/Functions/array/arrayExists.cpp b/src/Functions/array/arrayExists.h similarity index 100% rename from src/Functions/array/arrayExists.cpp rename to src/Functions/array/arrayExists.h diff --git a/src/Functions/array/arrayFilter.cpp b/src/Functions/array/arrayFilter.h similarity index 100% rename from src/Functions/array/arrayFilter.cpp rename to src/Functions/array/arrayFilter.h diff --git a/src/Functions/array/arrayMap.cpp b/src/Functions/array/arrayMap.h similarity index 100% rename from src/Functions/array/arrayMap.cpp rename to src/Functions/array/arrayMap.h diff --git a/src/Functions/array/arraySort.cpp b/src/Functions/array/arraySort.h similarity index 100% rename from src/Functions/array/arraySort.cpp rename to src/Functions/array/arraySort.h diff --git a/src/Functions/identity.cpp b/src/Functions/identity.h similarity index 100% rename from src/Functions/identity.cpp rename to src/Functions/identity.h From 87520e48e8808424f008ef31b26b30d68b59b7ae Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 27 Mar 2023 18:07:21 +0000 Subject: [PATCH 113/535] remove registration of function out of headers --- src/Functions/array/arrayConcat.cpp | 12 +++++ src/Functions/array/arrayConcat.h | 10 ++--- src/Functions/array/arrayExists.cpp | 12 +++++ src/Functions/array/arrayExists.h | 11 +---- src/Functions/array/arrayFilter.cpp | 12 +++++ src/Functions/array/arrayFilter.h | 11 +---- src/Functions/array/arrayMap.h | 10 +---- src/Functions/array/arraySort.cpp | 68 +++++++++++++++++++++++++++++ src/Functions/array/arraySort.h | 65 +-------------------------- src/Functions/identity.cpp | 12 +++++ src/Functions/identity.h | 17 ++------ 11 files changed, 129 insertions(+), 111 deletions(-) create mode 100644 src/Functions/array/arrayConcat.cpp create mode 100644 src/Functions/array/arrayExists.cpp create mode 100644 src/Functions/array/arrayFilter.cpp create mode 100644 src/Functions/array/arraySort.cpp create mode 100644 src/Functions/identity.cpp diff --git a/src/Functions/array/arrayConcat.cpp b/src/Functions/array/arrayConcat.cpp new file mode 100644 index 00000000000..9acdd67c1d7 --- /dev/null +++ b/src/Functions/array/arrayConcat.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(ArrayConcat) +{ + factory.registerFunction(); +} + +} diff --git a/src/Functions/array/arrayConcat.h b/src/Functions/array/arrayConcat.h index c49565d7b23..605b242e9e1 100644 --- a/src/Functions/array/arrayConcat.h +++ b/src/Functions/array/arrayConcat.h @@ -1,9 +1,11 @@ +#pragma once + #include -#include #include #include #include #include +#include #include #include #include @@ -98,10 +100,4 @@ public: bool useDefaultImplementationForConstants() const override { return true; } }; - -REGISTER_FUNCTION(ArrayConcat) -{ - factory.registerFunction(); -} - } diff --git a/src/Functions/array/arrayExists.cpp b/src/Functions/array/arrayExists.cpp new file mode 100644 index 00000000000..6e1a36f6003 --- /dev/null +++ b/src/Functions/array/arrayExists.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(ArrayExists) +{ + factory.registerFunction(); +} + +} diff --git a/src/Functions/array/arrayExists.h b/src/Functions/array/arrayExists.h index d80556b1475..3ebc088c478 100644 --- a/src/Functions/array/arrayExists.h +++ b/src/Functions/array/arrayExists.h @@ -1,7 +1,7 @@ +#pragma once + #include #include -#include - #include "FunctionArrayMapped.h" @@ -87,11 +87,4 @@ struct ArrayExistsImpl struct NameArrayExists { static constexpr auto name = "arrayExists"; }; using FunctionArrayExists = FunctionArrayMapped; -REGISTER_FUNCTION(ArrayExists) -{ - factory.registerFunction(); } - -} - - diff --git a/src/Functions/array/arrayFilter.cpp b/src/Functions/array/arrayFilter.cpp new file mode 100644 index 00000000000..b7f1de37648 --- /dev/null +++ b/src/Functions/array/arrayFilter.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(ArrayFilter) +{ + factory.registerFunction(); +} + +} diff --git a/src/Functions/array/arrayFilter.h b/src/Functions/array/arrayFilter.h index 528fb7bc5c7..0ac114426a9 100644 --- a/src/Functions/array/arrayFilter.h +++ b/src/Functions/array/arrayFilter.h @@ -1,7 +1,7 @@ +#pragma once + #include #include -#include - #include "FunctionArrayMapped.h" @@ -74,11 +74,4 @@ struct ArrayFilterImpl struct NameArrayFilter { static constexpr auto name = "arrayFilter"; }; using FunctionArrayFilter = FunctionArrayMapped; -REGISTER_FUNCTION(ArrayFilter) -{ - factory.registerFunction(); } - -} - - diff --git a/src/Functions/array/arrayMap.h b/src/Functions/array/arrayMap.h index 216d488a360..8ff9eb5e195 100644 --- a/src/Functions/array/arrayMap.h +++ b/src/Functions/array/arrayMap.h @@ -1,5 +1,4 @@ -#include - +#pragma once #include "FunctionArrayMapped.h" @@ -34,11 +33,4 @@ struct ArrayMapImpl struct NameArrayMap { static constexpr auto name = "arrayMap"; }; using FunctionArrayMap = FunctionArrayMapped; -REGISTER_FUNCTION(ArrayMap) -{ - factory.registerFunction(); } - -} - - diff --git a/src/Functions/array/arraySort.cpp b/src/Functions/array/arraySort.cpp new file mode 100644 index 00000000000..6a44482fd76 --- /dev/null +++ b/src/Functions/array/arraySort.cpp @@ -0,0 +1,68 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(ArraySort) +{ + factory.registerFunction(); + factory.registerFunction(); + + factory.registerFunction({ + R"( +Returns an array of the same size as the original array where elements in range `[1..limit]` +are sorted in ascending order. Remaining elements `(limit..N]` shall contain elements in unspecified order. +[example:simple_int] +[example:simple_string] + +To retain only the sorted elements use `arrayResize`: +[example:retain_sorted] + +If the `func` function is specified, sorting order is determined by the result of the `func` +function applied to the elements of the array. +[example:lambda_simple] + +If `func` accepts multiple arguments, the `arrayPartialSort` function is passed several arrays +that the arguments of `func` will correspond to. +[example:lambda_complex] + +For more details see documentation of `arraySort`. +)", + Documentation::Examples{ + {"simple_int", "SELECT arrayPartialSort(2, [5, 9, 1, 3])"}, + {"simple_string", "SELECT arrayPartialSort(2, ['expenses','lasso','embolism','gladly'])"}, + {"retain_sorted", "SELECT arrayResize(arrayPartialSort(2, [5, 9, 1, 3]), 2)"}, + {"lambda_simple", "SELECT arrayPartialSort((x) -> -x, 2, [5, 9, 1, 3])"}, + {"lambda_complex", "SELECT arrayPartialSort((x, y) -> -y, 1, [0, 1, 2], [1, 2, 3]) as res"}}, + Documentation::Categories{"Array"}}); + factory.registerFunction({ + R"( +Returns an array of the same size as the original array where elements in range `[1..limit]` +are sorted in descending order. Remaining elements `(limit..N]` shall contain elements in unspecified order. +[example:simple_int] +[example:simple_string] + +To retain only the sorted elements use `arrayResize`: +[example:retain_sorted] + +If the `func` function is specified, sorting order is determined by the result of the `func` +function applied to the elements of the array. +[example:lambda_simple] + +If `func` accepts multiple arguments, the `arrayPartialSort` function is passed several arrays +that the arguments of `func` will correspond to. +[example:lambda_complex] + +For more details see documentation of `arraySort`. +)", + Documentation::Examples{ + {"simple_int", "SELECT arrayPartialReverseSort(2, [5, 9, 1, 3])"}, + {"simple_string", "SELECT arrayPartialReverseSort(2, ['expenses','lasso','embolism','gladly'])"}, + {"retain_sorted", "SELECT arrayResize(arrayPartialReverseSort(2, [5, 9, 1, 3]), 2)"}, + {"lambda_simple", "SELECT arrayPartialReverseSort((x) -> -x, 2, [5, 9, 1, 3])"}, + {"lambda_complex", "SELECT arrayPartialReverseSort((x, y) -> -y, 1, [0, 1, 2], [1, 2, 3]) as res"}}, + Documentation::Categories{"Array"}}); +} + +} diff --git a/src/Functions/array/arraySort.h b/src/Functions/array/arraySort.h index 0188324bc19..3b3febfab5d 100644 --- a/src/Functions/array/arraySort.h +++ b/src/Functions/array/arraySort.h @@ -1,6 +1,6 @@ -#include "FunctionArrayMapped.h" +#pragma once -#include +#include "FunctionArrayMapped.h" #include namespace DB @@ -136,65 +136,4 @@ using FunctionArrayReverseSort = FunctionArrayMapped using FunctionArrayPartialSort = FunctionArrayMapped, NameArrayPartialSort>; using FunctionArrayPartialReverseSort = FunctionArrayMapped, NameArrayPartialReverseSort>; -REGISTER_FUNCTION(ArraySort) -{ - factory.registerFunction(); - factory.registerFunction(); - - factory.registerFunction({ - R"( -Returns an array of the same size as the original array where elements in range `[1..limit]` -are sorted in ascending order. Remaining elements `(limit..N]` shall contain elements in unspecified order. -[example:simple_int] -[example:simple_string] - -To retain only the sorted elements use `arrayResize`: -[example:retain_sorted] - -If the `func` function is specified, sorting order is determined by the result of the `func` -function applied to the elements of the array. -[example:lambda_simple] - -If `func` accepts multiple arguments, the `arrayPartialSort` function is passed several arrays -that the arguments of `func` will correspond to. -[example:lambda_complex] - -For more details see documentation of `arraySort`. -)", - Documentation::Examples{ - {"simple_int", "SELECT arrayPartialSort(2, [5, 9, 1, 3])"}, - {"simple_string", "SELECT arrayPartialSort(2, ['expenses','lasso','embolism','gladly'])"}, - {"retain_sorted", "SELECT arrayResize(arrayPartialSort(2, [5, 9, 1, 3]), 2)"}, - {"lambda_simple", "SELECT arrayPartialSort((x) -> -x, 2, [5, 9, 1, 3])"}, - {"lambda_complex", "SELECT arrayPartialSort((x, y) -> -y, 1, [0, 1, 2], [1, 2, 3]) as res"}}, - Documentation::Categories{"Array"}}); - factory.registerFunction({ - R"( -Returns an array of the same size as the original array where elements in range `[1..limit]` -are sorted in descending order. Remaining elements `(limit..N]` shall contain elements in unspecified order. -[example:simple_int] -[example:simple_string] - -To retain only the sorted elements use `arrayResize`: -[example:retain_sorted] - -If the `func` function is specified, sorting order is determined by the result of the `func` -function applied to the elements of the array. -[example:lambda_simple] - -If `func` accepts multiple arguments, the `arrayPartialSort` function is passed several arrays -that the arguments of `func` will correspond to. -[example:lambda_complex] - -For more details see documentation of `arraySort`. -)", - Documentation::Examples{ - {"simple_int", "SELECT arrayPartialReverseSort(2, [5, 9, 1, 3])"}, - {"simple_string", "SELECT arrayPartialReverseSort(2, ['expenses','lasso','embolism','gladly'])"}, - {"retain_sorted", "SELECT arrayResize(arrayPartialReverseSort(2, [5, 9, 1, 3]), 2)"}, - {"lambda_simple", "SELECT arrayPartialReverseSort((x) -> -x, 2, [5, 9, 1, 3])"}, - {"lambda_complex", "SELECT arrayPartialReverseSort((x, y) -> -y, 1, [0, 1, 2], [1, 2, 3]) as res"}}, - Documentation::Categories{"Array"}}); -} - } diff --git a/src/Functions/identity.cpp b/src/Functions/identity.cpp new file mode 100644 index 00000000000..7174f1fd318 --- /dev/null +++ b/src/Functions/identity.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(Identity) +{ + factory.registerFunction(); +} + +} diff --git a/src/Functions/identity.h b/src/Functions/identity.h index 8a29eafca52..efee95841f5 100644 --- a/src/Functions/identity.h +++ b/src/Functions/identity.h @@ -1,20 +1,16 @@ +#pragma once #include -#include +#include namespace DB { -namespace -{ class FunctionIdentity : public IFunction { public: static constexpr auto name = "identity"; - static FunctionPtr create(ContextPtr) - { - return std::make_shared(); - } + static FunctionPtr create(ContextPtr) { return std::make_shared(); } String getName() const override { return name; } size_t getNumberOfArguments() const override { return 1; } @@ -33,10 +29,3 @@ public: }; } - -REGISTER_FUNCTION(Identity) -{ - factory.registerFunction(); -} - -} From 298de8daf0cb6c8fdf537e75ea566c8e7b3571f3 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 27 Mar 2023 18:31:43 +0000 Subject: [PATCH 114/535] remove outdated code for Map type --- src/Functions/array/FunctionArrayMapped.h | 202 ++++++------------ src/Functions/array/arrayAggregation.cpp | 3 - src/Functions/array/arrayAll.cpp | 3 - src/Functions/array/arrayCompact.cpp | 3 - src/Functions/array/arrayCount.cpp | 3 - src/Functions/array/arrayCumSum.cpp | 3 - .../array/arrayCumSumNonNegative.cpp | 3 - src/Functions/array/arrayDifference.cpp | 3 - src/Functions/array/arrayExists.h | 3 - src/Functions/array/arrayFill.cpp | 3 - src/Functions/array/arrayFilter.h | 3 - src/Functions/array/arrayFirstLast.cpp | 3 - src/Functions/array/arrayFirstLastIndex.cpp | 3 - src/Functions/array/arrayMap.h | 3 - src/Functions/array/arraySort.h | 3 - src/Functions/array/arraySplit.cpp | 3 - 16 files changed, 62 insertions(+), 185 deletions(-) diff --git a/src/Functions/array/FunctionArrayMapped.h b/src/Functions/array/FunctionArrayMapped.h index 6af23f01f97..9917a38e144 100644 --- a/src/Functions/array/FunctionArrayMapped.h +++ b/src/Functions/array/FunctionArrayMapped.h @@ -42,33 +42,6 @@ namespace ErrorCodes extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; } - -template -ColumnPtr getOffsetsPtr(const T & column) -{ - if constexpr (std::is_same_v) - { - return column.getOffsetsPtr(); - } - else // ColumnMap - { - return column.getNestedColumn().getOffsetsPtr(); - } -} - -template -const IColumn::Offsets & getOffsets(const T & column) -{ - if constexpr (std::is_same_v) - { - return column.getOffsets(); - } - else // ColumnMap - { - return column.getNestedColumn().getOffsets(); - } -} - /** Higher-order functions for arrays. * These functions optionally apply a map (transform) to array (or multiple arrays of identical size) by lambda function, * and return some result based on that transformation. @@ -91,10 +64,6 @@ class FunctionArrayMapped : public IFunction { public: static constexpr auto name = Name::name; - static constexpr bool is_argument_type_map = std::is_same_v; - static constexpr bool is_argument_type_array = std::is_same_v; - static constexpr auto argument_type_name = is_argument_type_map ? "Map" : "Array"; - static constexpr size_t num_fixed_params = []{ if constexpr (requires { Impl::num_fixed_params; }) return Impl::num_fixed_params; else return 0; }(); static FunctionPtr create(ContextPtr) { return std::make_shared(); } @@ -132,39 +101,27 @@ public: num_fixed_params + 1, (num_fixed_params + 1 == 1) ? "" : "s"); - size_t nested_types_count = (arguments.size() - num_fixed_params - 1) * (is_argument_type_map ? 2 : 1); - DataTypes nested_types(nested_types_count); - - size_t num_array_tuple_arguments = 0; + bool is_single_array_argument = arguments.size() == num_fixed_params + 2; size_t tuple_argument_size = 0; - for (size_t i = 0; i < arguments.size() - 1 - num_fixed_params; ++i) + size_t num_nested_types = arguments.size() - num_fixed_params - 1; + DataTypes nested_types(num_nested_types); + + for (size_t i = 0; i < num_nested_types; ++i) { - const auto * array_type = checkAndGetDataType(&*arguments[i + 1 + num_fixed_params]); + const auto * array_type = checkAndGetDataType(&*arguments[i + 1 + num_fixed_params]); if (!array_type) throw Exception( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "Argument {} of function {} must be {}. Found {} instead", + "Argument {} of function {} must be Array. Found {} instead", i + 2 + num_fixed_params, getName(), - argument_type_name, arguments[i + 1 + num_fixed_params]->getName()); if (const auto * tuple_type = checkAndGetDataType(array_type->getNestedType().get())) - { - ++num_array_tuple_arguments; tuple_argument_size = tuple_type->getElements().size(); - } - if constexpr (is_argument_type_map) - { - nested_types[2 * i] = recursiveRemoveLowCardinality(array_type->getKeyType()); - nested_types[2 * i + 1] = recursiveRemoveLowCardinality(array_type->getValueType()); - } - else if constexpr (is_argument_type_array) - { - nested_types[i] = recursiveRemoveLowCardinality(array_type->getNestedType()); - } + nested_types[i] = recursiveRemoveLowCardinality(array_type->getNestedType()); } const auto * function_type = checkAndGetDataType(arguments[0].get()); @@ -177,7 +134,9 @@ public: arguments[0]->getName()); size_t num_function_arguments = function_type->getArgumentTypes().size(); - if (num_array_tuple_arguments == 1 && tuple_argument_size == num_function_arguments) + if (is_single_array_argument + && tuple_argument_size + && tuple_argument_size == num_function_arguments) { assert(nested_types.size() == 1); @@ -214,11 +173,11 @@ public: (min_args > 1 ? "s" : ""), arguments.size()); - if ((arguments.size() == 1 + num_fixed_params) && is_argument_type_array) + if (arguments.size() == 1 + num_fixed_params) { - const auto * data_type = checkAndGetDataType(arguments[num_fixed_params].type.get()); + const auto * array_type = checkAndGetDataType(arguments[num_fixed_params].type.get()); - if (!data_type) + if (!array_type) throw Exception( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The {}{}{} argument for function {} must be array. Found {} instead", @@ -231,7 +190,7 @@ public: if constexpr (num_fixed_params) Impl::checkArguments(getName(), arguments.data()); - DataTypePtr nested_type = data_type->getNestedType(); + DataTypePtr nested_type = array_type->getNestedType(); if (Impl::needBoolean() && !isUInt8(nested_type)) throw Exception( @@ -243,10 +202,7 @@ public: getName(), arguments[num_fixed_params].type->getName()); - if constexpr (is_argument_type_array) - return Impl::getReturnType(nested_type, nested_type); - else - throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Unreachable code reached"); + return Impl::getReturnType(nested_type, nested_type); } else { @@ -281,26 +237,15 @@ public: getName(), return_type->getName()); - static_assert(is_argument_type_map || is_argument_type_array, "unsupported type"); - if (arguments.size() < 2 + num_fixed_params) - { throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Incorrect number of arguments: {}", arguments.size()); - } - - const auto * first_array_type = checkAndGetDataType(arguments[1 + num_fixed_params].type.get()); + const auto * first_array_type = checkAndGetDataType(arguments[1 + num_fixed_params].type.get()); if (!first_array_type) throw DB::Exception( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Unsupported type {}", arguments[1 + num_fixed_params].type->getName()); - if constexpr (is_argument_type_array) - return Impl::getReturnType(return_type, first_array_type->getNestedType()); - - if constexpr (is_argument_type_map) - return Impl::getReturnType(return_type, first_array_type->getKeyValueTypes()); - - throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Unreachable code reached"); + return Impl::getReturnType(return_type, first_array_type->getNestedType()); } } @@ -309,38 +254,26 @@ public: if (arguments.size() == 1 + num_fixed_params) { ColumnPtr column_array_ptr = arguments[num_fixed_params].column; - const auto * column_array = checkAndGetColumn(column_array_ptr.get()); + const auto * column_array = checkAndGetColumn(column_array_ptr.get()); if (!column_array) { - const ColumnConst * column_const_array = checkAndGetColumnConst(column_array_ptr.get()); + const auto * column_const_array = checkAndGetColumnConst(column_array_ptr.get()); if (!column_const_array) throw Exception( - ErrorCodes::ILLEGAL_COLUMN, "Expected {} column, found {}", argument_type_name, column_array_ptr->getName()); + ErrorCodes::ILLEGAL_COLUMN, "Expected Array column, found {}", column_array_ptr->getName()); + column_array_ptr = column_const_array->convertToFullColumn(); - column_array = assert_cast(column_array_ptr.get()); + column_array = assert_cast(column_array_ptr.get()); } - if constexpr (std::is_same_v) - { - if constexpr (num_fixed_params) - return Impl::execute( - *column_array, - column_array->getNestedColumn().getDataPtr(), - arguments.data()); - else - return Impl::execute(*column_array, column_array->getNestedColumn().getDataPtr()); - } + if constexpr (num_fixed_params) + return Impl::execute( + *column_array, + column_array->getDataPtr(), + arguments.data()); else - { - if constexpr (num_fixed_params) - return Impl::execute( - *column_array, - column_array->getDataPtr(), - arguments.data()); - else - return Impl::execute(*column_array, column_array->getDataPtr()); - } + return Impl::execute(*column_array, column_array->getDataPtr()); } else { @@ -358,7 +291,7 @@ public: ColumnPtr offsets_column; ColumnPtr column_first_array_ptr; - const typename Impl::column_type * column_first_array = nullptr; + const ColumnArray * column_first_array = nullptr; ColumnsWithTypeAndName arrays; arrays.reserve(arguments.size() - 1 - num_fixed_params); @@ -368,74 +301,63 @@ public: { const auto & array_with_type_and_name = arguments[i]; - ColumnPtr column_array_ptr = array_with_type_and_name.column; - const auto * column_array = checkAndGetColumn(column_array_ptr.get()); + auto column_array_ptr = array_with_type_and_name.column; + const auto * column_array = checkAndGetColumn(column_array_ptr.get()); - const DataTypePtr & array_type_ptr = array_with_type_and_name.type; - const auto * array_type = checkAndGetDataType(array_type_ptr.get()); + const auto & array_type_ptr = array_with_type_and_name.type; + const auto * array_type = checkAndGetDataType(array_type_ptr.get()); if (!column_array) { - const ColumnConst * column_const_array = checkAndGetColumnConst(column_array_ptr.get()); + const auto * column_const_array = checkAndGetColumnConst(column_array_ptr.get()); if (!column_const_array) throw Exception( - ErrorCodes::ILLEGAL_COLUMN, "Expected {} column, found {}", argument_type_name, column_array_ptr->getName()); + ErrorCodes::ILLEGAL_COLUMN, "Expected Array column, found {}", column_array_ptr->getName()); + column_array_ptr = recursiveRemoveLowCardinality(column_const_array->convertToFullColumn()); - column_array = checkAndGetColumn(column_array_ptr.get()); + column_array = checkAndGetColumn(column_array_ptr.get()); } if (!array_type) throw Exception( - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Expected {} type, found {}", argument_type_name, array_type_ptr->getName()); + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Expected Array type, found {}", array_type_ptr->getName()); if (!offsets_column) { - offsets_column = getOffsetsPtr(*column_array); + offsets_column = column_array->getOffsetsPtr(); } else { /// The first condition is optimization: do not compare data if the pointers are equal. - if (getOffsetsPtr(*column_array) != offsets_column - && getOffsets(*column_array) != typeid_cast(*offsets_column).getData()) + if (column_array->getOffsetsPtr() != offsets_column + && column_array->getOffsets() != typeid_cast(*offsets_column).getData()) throw Exception( ErrorCodes::SIZES_OF_ARRAYS_DONT_MATCH, - "{}s passed to {} must have equal size", - argument_type_name, - getName()); + "Arrays passed to {} must have equal size", getName()); } - if constexpr (is_argument_type_map) + const auto * column_tuple = checkAndGetColumn(&column_array->getData()); + if (is_single_array_argument && column_tuple && column_tuple->getColumns().size() == num_function_arguments) { - arrays.emplace_back(ColumnWithTypeAndName( - column_array->getNestedData().getColumnPtr(0), recursiveRemoveLowCardinality(array_type->getKeyType()), array_with_type_and_name.name+".key")); - arrays.emplace_back(ColumnWithTypeAndName( - column_array->getNestedData().getColumnPtr(1), recursiveRemoveLowCardinality(array_type->getValueType()), array_with_type_and_name.name+".value")); + const auto & type_tuple = assert_cast(*array_type->getNestedType()); + const auto & tuple_names = type_tuple.getElementNames(); + + size_t tuple_size = column_tuple->getColumns().size(); + arrays.reserve(column_tuple->getColumns().size()); + for (size_t j = 0; j < tuple_size; ++j) + { + arrays.emplace_back( + column_tuple->getColumnPtr(j), + recursiveRemoveLowCardinality(type_tuple.getElement(j)), + array_with_type_and_name.name + "." + tuple_names[j]); + } } else { - const auto * column_tuple = checkAndGetColumn(&column_array->getData()); - if (is_single_array_argument && column_tuple && column_tuple->getColumns().size() == num_function_arguments) - { - const auto & type_tuple = assert_cast(*array_type->getNestedType()); - const auto & tuple_names = type_tuple.getElementNames(); - - size_t tuple_size = column_tuple->getColumns().size(); - arrays.reserve(column_tuple->getColumns().size()); - for (size_t j = 0; j < tuple_size; ++j) - { - arrays.emplace_back( - column_tuple->getColumnPtr(j), - recursiveRemoveLowCardinality(type_tuple.getElement(j)), - array_with_type_and_name.name + "." + tuple_names[j]); - } - } - else - { - arrays.emplace_back( - column_array->getDataPtr(), - recursiveRemoveLowCardinality(array_type->getNestedType()), - array_with_type_and_name.name); - } + arrays.emplace_back( + column_array->getDataPtr(), + recursiveRemoveLowCardinality(array_type->getNestedType()), + array_with_type_and_name.name); } if (i == 1 + num_fixed_params) @@ -446,7 +368,7 @@ public: } /// Put all the necessary columns multiplied by the sizes of arrays into the columns. - auto replicated_column_function_ptr = IColumn::mutate(column_function->replicate(getOffsets(*column_first_array))); + auto replicated_column_function_ptr = IColumn::mutate(column_function->replicate(column_first_array->getOffsets())); auto * replicated_column_function = typeid_cast(replicated_column_function_ptr.get()); replicated_column_function->appendArguments(arrays); diff --git a/src/Functions/array/arrayAggregation.cpp b/src/Functions/array/arrayAggregation.cpp index 75ea3a81a7d..4714c8168dc 100644 --- a/src/Functions/array/arrayAggregation.cpp +++ b/src/Functions/array/arrayAggregation.cpp @@ -89,9 +89,6 @@ using ArrayAggregateResult = typename ArrayAggregateResultImpl struct ArrayAggregateImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayAll.cpp b/src/Functions/array/arrayAll.cpp index 1d02342b704..a80e2ff062c 100644 --- a/src/Functions/array/arrayAll.cpp +++ b/src/Functions/array/arrayAll.cpp @@ -16,9 +16,6 @@ namespace ErrorCodes */ struct ArrayAllImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayCompact.cpp b/src/Functions/array/arrayCompact.cpp index 5c899d4d97e..2d304c7f895 100644 --- a/src/Functions/array/arrayCompact.cpp +++ b/src/Functions/array/arrayCompact.cpp @@ -19,9 +19,6 @@ namespace ErrorCodes struct ArrayCompactImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayCount.cpp b/src/Functions/array/arrayCount.cpp index 9aeefbab4fe..019f07e8e6a 100644 --- a/src/Functions/array/arrayCount.cpp +++ b/src/Functions/array/arrayCount.cpp @@ -17,9 +17,6 @@ namespace ErrorCodes */ struct ArrayCountImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayCumSum.cpp b/src/Functions/array/arrayCumSum.cpp index 489014ebe55..476205835c5 100644 --- a/src/Functions/array/arrayCumSum.cpp +++ b/src/Functions/array/arrayCumSum.cpp @@ -18,9 +18,6 @@ namespace ErrorCodes struct ArrayCumSumImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayCumSumNonNegative.cpp b/src/Functions/array/arrayCumSumNonNegative.cpp index c0062fd8230..920996472b1 100644 --- a/src/Functions/array/arrayCumSumNonNegative.cpp +++ b/src/Functions/array/arrayCumSumNonNegative.cpp @@ -19,9 +19,6 @@ namespace ErrorCodes */ struct ArrayCumSumNonNegativeImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayDifference.cpp b/src/Functions/array/arrayDifference.cpp index ab7b94f98f1..3ba7d1ad619 100644 --- a/src/Functions/array/arrayDifference.cpp +++ b/src/Functions/array/arrayDifference.cpp @@ -21,9 +21,6 @@ namespace ErrorCodes */ struct ArrayDifferenceImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayExists.h b/src/Functions/array/arrayExists.h index 3ebc088c478..d2e9cb179e5 100644 --- a/src/Functions/array/arrayExists.h +++ b/src/Functions/array/arrayExists.h @@ -17,9 +17,6 @@ namespace ErrorCodes */ struct ArrayExistsImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return false; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayFill.cpp b/src/Functions/array/arrayFill.cpp index b395584b8e2..89b5dce2331 100644 --- a/src/Functions/array/arrayFill.cpp +++ b/src/Functions/array/arrayFill.cpp @@ -20,9 +20,6 @@ namespace ErrorCodes template struct ArrayFillImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return true; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayFilter.h b/src/Functions/array/arrayFilter.h index 0ac114426a9..0852ac8d3c9 100644 --- a/src/Functions/array/arrayFilter.h +++ b/src/Functions/array/arrayFilter.h @@ -16,9 +16,6 @@ namespace ErrorCodes */ struct ArrayFilterImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return true; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayFirstLast.cpp b/src/Functions/array/arrayFirstLast.cpp index 6a270081169..055c2a0f79a 100644 --- a/src/Functions/array/arrayFirstLast.cpp +++ b/src/Functions/array/arrayFirstLast.cpp @@ -28,9 +28,6 @@ enum class ArrayFirstLastElementNotExistsStrategy : uint8_t template struct ArrayFirstLastImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return true; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayFirstLastIndex.cpp b/src/Functions/array/arrayFirstLastIndex.cpp index f985075b1d8..045558609a4 100644 --- a/src/Functions/array/arrayFirstLastIndex.cpp +++ b/src/Functions/array/arrayFirstLastIndex.cpp @@ -21,9 +21,6 @@ enum class ArrayFirstLastIndexStrategy template struct ArrayFirstLastIndexImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return false; } static bool needExpression() { return true; } static bool needOneArray() { return false; } diff --git a/src/Functions/array/arrayMap.h b/src/Functions/array/arrayMap.h index 8ff9eb5e195..106b62a9c9f 100644 --- a/src/Functions/array/arrayMap.h +++ b/src/Functions/array/arrayMap.h @@ -9,9 +9,6 @@ namespace DB */ struct ArrayMapImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - /// true if the expression (for an overload of f(expression, arrays)) or an array (for f(array)) should be boolean. static bool needBoolean() { return false; } /// true if the f(array) overload is unavailable. diff --git a/src/Functions/array/arraySort.h b/src/Functions/array/arraySort.h index 3b3febfab5d..04cf222481c 100644 --- a/src/Functions/array/arraySort.h +++ b/src/Functions/array/arraySort.h @@ -17,9 +17,6 @@ namespace ErrorCodes template struct ArraySortImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static constexpr auto num_fixed_params = is_partial; static bool needBoolean() { return false; } diff --git a/src/Functions/array/arraySplit.cpp b/src/Functions/array/arraySplit.cpp index dd1cfc64c1b..e68d779f67e 100644 --- a/src/Functions/array/arraySplit.cpp +++ b/src/Functions/array/arraySplit.cpp @@ -15,9 +15,6 @@ namespace ErrorCodes template struct ArraySplitImpl { - using column_type = ColumnArray; - using data_type = DataTypeArray; - static bool needBoolean() { return true; } static bool needExpression() { return true; } static bool needOneArray() { return false; } From f56609172d358d5130d2d5d80a118faeb3b9ad61 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 27 Mar 2023 21:21:48 +0000 Subject: [PATCH 115/535] fix style-check --- src/Functions/array/FunctionsMapMiscellaneous.cpp | 7 ++++++- src/Functions/array/arrayMap.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/Functions/array/arrayMap.cpp diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index 834a3f54219..61a2de5607c 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -24,6 +23,12 @@ namespace DB { +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; +} + template class FunctionMapToArrayAdapter : public IFunction { diff --git a/src/Functions/array/arrayMap.cpp b/src/Functions/array/arrayMap.cpp new file mode 100644 index 00000000000..10a7ca45cfa --- /dev/null +++ b/src/Functions/array/arrayMap.cpp @@ -0,0 +1,12 @@ +#include +#include + +namespace DB +{ + +REGISTER_FUNCTION(ArrayMap) +{ + factory.registerFunction(); +} + +} From 6bc33670c7efbf6a988baea72fa73dd80af64e06 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Tue, 28 Mar 2023 14:34:36 +0200 Subject: [PATCH 116/535] It works --- .../src/KeyValuePairExtractorBuilder.cpp | 6 +++--- .../keyvaluepair/src/KeyValuePairExtractorBuilder.h | 6 +++--- .../keyvaluepair/src/impl/CHKeyValuePairExtractor.h | 5 +++-- .../escaping/InlineEscapingStateHandler.cpp | 12 +++++------- .../noescaping/NoEscapingKeyStateHandler.cpp | 8 ++------ 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp index 8add4653096..57eda58d38d 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp @@ -33,7 +33,7 @@ KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withEscaping() return *this; } -std::shared_ptr KeyValuePairExtractorBuilder::build() +std::shared_ptr KeyValuePairExtractorBuilder::build() const { if (with_escaping) { @@ -43,7 +43,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() return buildWithoutEscaping(); } -std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() +std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() const { auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); @@ -58,7 +58,7 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou return std::make_shared>(key_state_handler, value_state_handler); } -std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() +std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h index 781e75cf73b..a6d7e9c1b65 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h @@ -24,7 +24,7 @@ public: KeyValuePairExtractorBuilder & withEscaping(); - std::shared_ptr build(); + std::shared_ptr build() const; private: bool with_escaping = false; @@ -32,9 +32,9 @@ private: char quoting_character = '"'; std::vector item_delimiters = {' ', ',', ';'}; - std::shared_ptr buildWithEscaping(); + std::shared_ptr buildWithEscaping() const; - std::shared_ptr buildWithoutEscaping(); + std::shared_ptr buildWithoutEscaping() const; }; } diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h index 2c1c78a6233..ce868c411e5 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h @@ -76,12 +76,13 @@ public: data.remove_prefix(next_state.position_in_string); state = next_state.state; + // No state expects empty input if (data.size() == 0) - state = State::END; + break; } // if break occured earlier, consume previously generated pair - if (next_state.state == State::FLUSH_PAIR || !(key.empty() && value.empty())) + if (state == State::FLUSH_PAIR || !(key.empty() && value.empty())) flushPair(data, key, value, keys, values, row_offset); return row_offset; diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp index a68e3f06e61..775ed8caba2 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp @@ -143,15 +143,13 @@ NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, Eleme NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const { - if (file.size() == 0) + const auto current_character = file[0]; + if (current_character == extractor_configuration.key_value_delimiter) { - return {0, State::END}; - } - else - { - const auto current_character = file[0]; - return {0, extractor_configuration.key_value_delimiter == current_character ? State::WAITING_VALUE : State::WAITING_KEY}; + return {1, WAITING_VALUE}; } + + return {0, State::WAITING_KEY}; } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp index eeffef881e6..b7d5843f9bd 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp @@ -1,6 +1,7 @@ #include "NoEscapingKeyStateHandler.h" #include #include +#include "Functions/keyvaluepair/src/impl/state/State.h" namespace DB { @@ -114,15 +115,10 @@ NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, ElementTy NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const { - if (file.size() == 0) - { - return {0, State::END}; - } - const auto current_character = file[0]; if (current_character == extractor_configuration.key_value_delimiter) { - return {1, State::WAITING_VALUE}; + return {1, WAITING_VALUE}; } return {0, State::WAITING_KEY}; From ee8209ca0143aa9c4d7d598a8ea51350a990d4b4 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Tue, 28 Mar 2023 14:37:28 +0200 Subject: [PATCH 117/535] Updated test case Invalid escape sequence is removed from key or value, while corresponding key or value are not discarded --- .../noescaping/NoEscapingKeyStateHandler.cpp | 127 ------------------ .../noescaping/NoEscapingKeyStateHandler.h | 32 ----- ...t_key_value_pairs_multiple_input.reference | 4 +- ...extract_key_value_pairs_multiple_input.sql | 2 +- 4 files changed, 3 insertions(+), 162 deletions(-) delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp deleted file mode 100644 index b7d5843f9bd..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "NoEscapingKeyStateHandler.h" -#include -#include -#include "Functions/keyvaluepair/src/impl/state/State.h" - -namespace DB -{ - -NoEscapingKeyStateHandler::NoEscapingKeyStateHandler(Configuration extractor_configuration_) -: extractor_configuration(std::move(extractor_configuration_)) -{ - wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); - read_needles = NeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState NoEscapingKeyStateHandler::wait(std::string_view file) const -{ - BoundsSafeCharacterFinder finder; - - const auto quoting_character = extractor_configuration.quoting_character; - size_t pos = 0; - while (auto character_position_opt = finder.findFirstNot(file, pos, wait_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - - if (quoting_character == character) - { - return {character_position + 1u, State::READING_QUOTED_KEY}; - } - else - { - return {character_position, State::READING_KEY}; - } - } - - return {file.size(), State::END}; -} - -NextState NoEscapingKeyStateHandler::read(std::string_view file, ElementType & key) const -{ - BoundsSafeCharacterFinder finder; - - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - key = {}; - - size_t pos = 0; - auto start_index = pos; - - while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (character == key_value_delimiter) - { - key = createElement(file, start_index, character_position); - - if (key.empty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::WAITING_VALUE}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) - { - return {next_pos, State::WAITING_KEY}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -NextState NoEscapingKeyStateHandler::readQuoted(std::string_view file, ElementType & key) const -{ - BoundsSafeCharacterFinder finder; - - const auto quoting_character = extractor_configuration.quoting_character; - - key = {}; - - size_t pos = 0; - auto start_index = pos; - - while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (quoting_character == character) - { - key = createElement(file, start_index, character_position); - - if (key.empty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::READING_KV_DELIMITER}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -NextState NoEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const -{ - const auto current_character = file[0]; - if (current_character == extractor_configuration.key_value_delimiter) - { - return {1, WAITING_VALUE}; - } - - return {0, State::WAITING_KEY}; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h deleted file mode 100644 index e47eb482aec..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "Functions/keyvaluepair/src/impl/state/Configuration.h" -#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" - -namespace DB -{ - -class NoEscapingKeyStateHandler : public StateHandler -{ -public: - using ElementType = std::string_view; - - explicit NoEscapingKeyStateHandler(Configuration extractor_configuration_); - - [[nodiscard]] NextState wait(std::string_view file) const; - - [[nodiscard]] NextState read(std::string_view file, ElementType & key) const; - - [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & key) const; - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; - -private: - Configuration extractor_configuration; - - std::vector wait_needles; - std::vector read_needles; - std::vector read_quoted_needles; -}; - -} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 5fb9998181c..a8047cd01cb 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -67,7 +67,7 @@ SELECT x; {'amount\\z':'$5\\h','currency':'\\$USD'} -- invalid escape sequence, should be discarded --- expected output: {'valid_key':'valid_value'} +-- expected output: {'key':'invalid_val','valid_key':'valid_value'} WITH extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, CAST( @@ -78,7 +78,7 @@ WITH ) AS x SELECT x; -{'valid_key':'valid_value'} +{'key':'invalid_val','valid_key':'valid_value'} -- standard escape sequences are covered by unit tests -- simple quoting diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 5f96fd9306b..ee49455c8c1 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -67,7 +67,7 @@ SELECT x; -- invalid escape sequence, should be discarded --- expected output: {'valid_key':'valid_value'} +-- expected output: {'key':'invalid_val','valid_key':'valid_value'} WITH extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, CAST( From e63231700f5e610b609b9c15596a8250be7fb86d Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 28 Mar 2023 16:00:00 +0000 Subject: [PATCH 118/535] Fix tests --- src/Client/ConnectionEstablisher.cpp | 6 +++++ src/Client/ConnectionEstablisher.h | 2 ++ src/Common/AsyncTaskExecutor.cpp | 3 ++- src/Common/AsyncTaskExecutor.h | 6 +++-- src/Processors/examples/protobuf.cpp | 26 +++++++++++++++++++ .../RemoteQueryExecutorReadContext.cpp | 2 +- .../RemoteQueryExecutorReadContext.h | 2 +- 7 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/Processors/examples/protobuf.cpp diff --git a/src/Client/ConnectionEstablisher.cpp b/src/Client/ConnectionEstablisher.cpp index 8f481461ed0..4be1475939a 100644 --- a/src/Client/ConnectionEstablisher.cpp +++ b/src/Client/ConnectionEstablisher.cpp @@ -152,6 +152,12 @@ bool ConnectionEstablisherAsync::checkBeforeTaskResume() return checkTimeout(); } +void ConnectionEstablisherAsync::cancelAfter() +{ + if (!is_finished) + reset(); +} + bool ConnectionEstablisherAsync::checkTimeout() { bool is_socket_ready = false; diff --git a/src/Client/ConnectionEstablisher.h b/src/Client/ConnectionEstablisher.h index 335162c2454..5993c9e066f 100644 --- a/src/Client/ConnectionEstablisher.h +++ b/src/Client/ConnectionEstablisher.h @@ -94,6 +94,8 @@ private: void run(AsyncCallback async_callback, ResumeCallback suspend_callback) override; }; + void cancelAfter() override; + /// When epoll file descriptor is ready, check if it's an expired timeout. /// Return false if receive timeout expired and socket is not ready, return true otherwise. bool checkTimeout(); diff --git a/src/Common/AsyncTaskExecutor.cpp b/src/Common/AsyncTaskExecutor.cpp index d79ac8c66ca..4e2fb18fb78 100644 --- a/src/Common/AsyncTaskExecutor.cpp +++ b/src/Common/AsyncTaskExecutor.cpp @@ -38,8 +38,9 @@ void AsyncTaskExecutor::cancel() { std::lock_guard guard(fiber_lock); is_cancelled = true; - cancelImpl(); + cancelBefore(); destroyFiber(); + cancelAfter(); } void AsyncTaskExecutor::restart() diff --git a/src/Common/AsyncTaskExecutor.h b/src/Common/AsyncTaskExecutor.h index a84ea7d3cf9..f749c3066fc 100644 --- a/src/Common/AsyncTaskExecutor.h +++ b/src/Common/AsyncTaskExecutor.h @@ -93,10 +93,12 @@ protected: virtual void processException(std::exception_ptr e) { std::rethrow_exception(e); } /// Method that is called in cancel() before fiber destruction. - virtual void cancelImpl() { } + virtual void cancelBefore() { } + /// Method that is called in cancel() after fiber destruction. + virtual void cancelAfter() { } /// Resume fiber explicitly without mutex locking. - /// Can be called in cancelImpl(). + /// Can be called in cancelBefore(). void resumeUnlocked(); private: diff --git a/src/Processors/examples/protobuf.cpp b/src/Processors/examples/protobuf.cpp new file mode 100644 index 00000000000..ee60f80d11a --- /dev/null +++ b/src/Processors/examples/protobuf.cpp @@ -0,0 +1,26 @@ +#include + +struct ErrorCollector : public google::protobuf::compiler::MultiFileErrorCollector +{ + void AddError(const std::string&, int, int, const std::string& msg) override + { + throw std::runtime_error(msg); + } +}; + +int main() +{ + google::protobuf::compiler::DiskSourceTree disk_source_tree; + disk_source_tree.MapPath("", "schemas/"); + ErrorCollector collector; + google::protobuf::compiler::Importer importer(&disk_source_tree, &collector); + try + { + importer.Import("schema.proto"); + } + catch() + { + } + + importer.pool()->FindMessageTypeByName("Schema"); +} diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp index 54299cfc6aa..0b23b4836ce 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.cpp @@ -104,7 +104,7 @@ bool RemoteQueryExecutorReadContext::checkTimeout(bool blocking) return true; } -void RemoteQueryExecutorReadContext::cancelImpl() +void RemoteQueryExecutorReadContext::cancelBefore() { /// One should not try to wait for the current packet here in case of /// timeout because this will exceed the timeout. diff --git a/src/QueryPipeline/RemoteQueryExecutorReadContext.h b/src/QueryPipeline/RemoteQueryExecutorReadContext.h index f0f2c8d55a2..4d1d6c17606 100644 --- a/src/QueryPipeline/RemoteQueryExecutorReadContext.h +++ b/src/QueryPipeline/RemoteQueryExecutorReadContext.h @@ -50,7 +50,7 @@ private: void processAsyncEvent(int fd, Poco::Timespan socket_timeout, AsyncEventTimeoutType type, const std::string & description, uint32_t events) override; void clearAsyncEvent() override; - void cancelImpl() override; + void cancelBefore() override; struct Task : public AsyncTask { From 223aa6ab1832674911d53fd7507c723478e110b9 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Tue, 28 Mar 2023 19:08:28 +0200 Subject: [PATCH 119/535] Delete unneded file --- src/Processors/examples/protobuf.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/Processors/examples/protobuf.cpp diff --git a/src/Processors/examples/protobuf.cpp b/src/Processors/examples/protobuf.cpp deleted file mode 100644 index ee60f80d11a..00000000000 --- a/src/Processors/examples/protobuf.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -struct ErrorCollector : public google::protobuf::compiler::MultiFileErrorCollector -{ - void AddError(const std::string&, int, int, const std::string& msg) override - { - throw std::runtime_error(msg); - } -}; - -int main() -{ - google::protobuf::compiler::DiskSourceTree disk_source_tree; - disk_source_tree.MapPath("", "schemas/"); - ErrorCollector collector; - google::protobuf::compiler::Importer importer(&disk_source_tree, &collector); - try - { - importer.Import("schema.proto"); - } - catch() - { - } - - importer.pool()->FindMessageTypeByName("Schema"); -} From 8d22f7a2f37d3761d38bdd87001104a280d59d60 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Tue, 28 Mar 2023 18:03:15 +0000 Subject: [PATCH 120/535] fix crash with bad arguments --- src/Functions/array/FunctionsMapMiscellaneous.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index 61a2de5607c..f32ad8bc1d1 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace DB { @@ -217,7 +219,7 @@ private: template struct MapKeyLikeAdapter { - static void extractNestedTypes(DataTypes & types) + static void checkTypes(const DataTypes & types) { if (types.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, @@ -233,8 +235,13 @@ struct MapKeyLikeAdapter if (!isStringOrFixedString(map_type->getKeyType())) throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Key type of map for function {} must be String or FixedString", Name::name); + } - DataTypes argument_types{map_type->getKeyType(), map_type->getValueType()}; + static void extractNestedTypes(DataTypes & types) + { + checkTypes(types); + const auto & map_type = assert_cast(*types[0]); + DataTypes argument_types{map_type.getKeyType(), map_type.getValueType()}; auto function_type = std::make_shared(argument_types, std::make_shared()); types = {function_type, types[0]}; @@ -243,6 +250,8 @@ struct MapKeyLikeAdapter static void extractNestedTypesAndColumns(ColumnsWithTypeAndName & arguments) { + checkTypes(collections::map(arguments, [](const auto & elem) { return elem.type; })); + const auto & map_type = assert_cast(*arguments[0].type); const auto & pattern_arg = arguments[1]; From 0a039a960142e33447135db573ee6fb2824113ed Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Wed, 29 Mar 2023 08:43:03 +0200 Subject: [PATCH 121/535] Minor optimization of copying data into key --- .../strategies/escaping/InlineEscapingStateHandler.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp index 775ed8caba2..1695e2e5e85 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp @@ -121,11 +121,7 @@ NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, Eleme } else if (*p == quoting_character) { - // todo try to optimize with resize and memcpy - for (size_t i = pos; i < character_position; ++i) - { - key.push_back(file[i]); - } + key.insert(key.end(), file.begin() + pos, file.begin() + character_position); if (key.empty()) { From 2449282ba8564e600fd669fa8b4861d609ef7d4d Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Wed, 29 Mar 2023 14:39:17 +0000 Subject: [PATCH 122/535] tired --- ..._clickhouse_help_program_options.reference | 306 +----------------- .../02598_clickhouse_help_program_options.sh | 26 +- 2 files changed, 14 insertions(+), 318 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference index cf9d4b4a572..e3c4989bb64 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference @@ -93,27 +93,6 @@ clickhouse compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT -Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) - --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data - clickhouse disks @@ -174,28 +153,6 @@ Allowed options: clickhouse format Usage: clickhouse format [options] < query -Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query - --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). - clickhouse git-import @@ -348,35 +305,6 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import -Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn - - -Example: - clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' clickhouse install @@ -403,8 +331,7 @@ Allowed options: -h [ --help ] produce help message --zookeeper-logs-dir arg Path to directory with ZooKeeper logs --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot + --output-dir arg Directory to place output clickhouse-keeper snapshot clickhouse obfuscator @@ -455,82 +382,11 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). -Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model - - Example: clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv clickhouse static -Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode - clickhouse start @@ -652,68 +508,15 @@ Preprocess config file and extract value of the given key. Usage: clickhouse extract-from-config [options] -Allowed options: - --help produce this help message - --stacktrace print stack traces of exceptions - --process-zk-includes if there are from_zk elements in config, connect to - ZooKeeper and process them - --try Do not warn about missing keys - --log-level arg (=error) log level - -c [ --config-file ] arg path to config file - -k [ --key ] arg key to get value for - clickhouse-compressor Usage: clickhouse compressor [options] < INPUT > OUTPUT Alternative usage: clickhouse compressor [options] INPUT OUTPUT -Allowed options: - -h [ --help ] produce help message - --input INPUT input file - --output OUTPUT output file - -d [ --decompress ] decompress - --offset-in-compressed-file arg (=0) offset to the compressed block (i.e. - physical file offset) - --offset-in-decompressed-block arg (=0) - offset to the decompressed block (i.e. - virtual offset) - -b [ --block-size ] arg (=1048576) compress in blocks of specified size - --hc use LZ4HC instead of LZ4 - --zstd use ZSTD instead of LZ4 - --deflate_qpl use deflate_qpl instead of LZ4 - --codec arg use codecs combination instead of LZ4 - --level arg compression level for codecs specified - via flags - --none use no compression instead of LZ4 - --stat print block statistics of compressed - data - clickhouse-format Usage: clickhouse format [options] < query -Allowed options: - --query arg query to format - -h [ --help ] produce help message - --hilite add syntax highlight with ANSI terminal - escape sequences - --oneline format in single line - -q [ --quiet ] just check syntax, no output on success - -n [ --multiquery ] allow multiple queries in the same file - --obfuscate obfuscate instead of formatting - --backslash add a backslash at the end of each line - of the formatted query - --allow_settings_after_format_in_insert - Allow SETTINGS after FORMAT, but note, - that this is not always safe - --seed arg seed (arbitrary string) that determines - the result of obfuscation - --max_query_size arg Which part of the query can be read - into RAM for parsing (the remaining - data for INSERT, if any, is read later) - --max_parser_depth arg Maximum parser depth (recursion depth - of recursive descend parser). - clickhouse-obfuscator @@ -763,67 +566,6 @@ Usage: clickhouse obfuscator [options] < in > out Input must be seekable file (it will be read twice). -Options: - --help produce help message - -S [ --structure ] arg structure of the initial table (list of - column and type names) - --input-format arg input format of the initial table data - --output-format arg default output format - --seed arg seed (arbitrary string), must be random - string with at least 10 bytes length; - note that a seed for each column is - derived from this seed and a column - name: you can obfuscate data for - different tables and as long as you use - identical seed and identical column - names, the data for corresponding - non-text columns for different tables - will be transformed in the same way, so - the data for different tables can be - JOINed after obfuscation - --limit arg if specified - stop after generating - that number of rows; the limit can be - also greater than the number of source - dataset - in this case it will process - the dataset in a loop more than one - time, using different seeds on every - iteration, generating result as large - as needed - --silent arg (=0) don't print information messages to - stderr - --save arg save the models after training to the - specified file. You can use --limit 0 - to skip the generation step. The file - is using binary, platform-dependent, - opaque serialization format. The model - parameters are saved, while the seed is - not. - --load arg load the models instead of training - from the specified file. The table - structure must match the saved file. - The seed should be specified - separately, while other model - parameters are loaded. - --order arg (=5) order of markov model to generate - strings - --frequency-cutoff arg (=5) frequency cutoff for markov model: - remove all buckets with count less than - specified - --num-buckets-cutoff arg (=0) cutoff for number of different possible - continuations for a context: remove all - histograms with less than specified - number of buckets - --frequency-add arg (=0) add a constant to every count to lower - probability distribution skew - --frequency-desaturate arg (=0) 0..1 - move every frequency towards - average to lower probability - distribution skew - --determinator-sliding-window-size arg (=8) - size of a sliding window in a source - string - its hash is used as a seed for - RNG in markov model - - Example: clickhouse obfuscator --seed "$(head -c16 /dev/urandom | base64)" --input-format TSV --output-format TSV --structure 'CounterID UInt32, URLDomain String, URL String, SearchPhrase String, Title String' < stats.tsv @@ -978,60 +720,14 @@ clickhouse-client --query "INSERT INTO git.line_changes FORMAT TSV" < line_chang Usage: clickhouse git-import -Allowed options: - -h [ --help ] produce help message - --skip-commits-without-parents arg (=1) - Skip commits without parents (except - the initial commit). These commits are - usually erroneous but they can make - sense in very rare cases. - --skip-commits-with-duplicate-diffs arg (=1) - Skip commits with duplicate diffs. - These commits are usually results of - cherry-pick or merge after rebase. - --skip-commit arg Skip commit with specified hash. The - option can be specified multiple times. - --skip-paths arg Skip paths that matches regular - expression (re2 syntax). - --skip-commits-with-messages arg Skip commits whose messages matches - regular expression (re2 syntax). - --diff-size-limit arg (=100000) Skip commits whose diff size (number of - added + removed lines) is larger than - specified threshold. Does not apply for - initial commit. - --stop-after-commit arg Stop processing after specified commit - hash. - --threads arg (=8) Number of concurrent git subprocesses - to spawn - - -Example: - clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' clickhouse-keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots -Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper - snapshot - clickhouse-static-files-disk-uploader -Allowed options: - -h [ --help ] produce help message - --metadata-path arg Metadata path (SELECT data_paths FROM system.tables - WHERE name = 'table_name' AND database = - 'database_name') - --test-mode Use test mode, which will put data on given url via PUT - --link Create symlinks instead of copying - --url arg Web server url for test mode - --output-dir arg Directory to put files in non-test mode - clickhouse-su diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh index c2366d2e452..240fedbbd0c 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh @@ -10,7 +10,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) -stty columns 80 2>/dev/null ||: +stty columns 100 2>/dev/null ||: echo "================BINARY==========================" @@ -26,23 +26,23 @@ $CLICKHOUSE_BINARY client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse local\n" $CLICKHOUSE_BINARY local --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse compressor\n" -$CLICKHOUSE_BINARY compressor --help +$CLICKHOUSE_BINARY compressor --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse disks\n" $CLICKHOUSE_BINARY disks --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse extract\n" $CLICKHOUSE_BINARY extract-from-config --help echo -e "\nclickhouse format\n" -$CLICKHOUSE_BINARY format --help +$CLICKHOUSE_BINARY format --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse git-import\n" -$CLICKHOUSE_BINARY git-import --help +$CLICKHOUSE_BINARY git-import --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse install\n" $CLICKHOUSE_BINARY install --help echo -e "\nclickhouse keeper-converter\n" $CLICKHOUSE_BINARY keeper-converter --help echo -e "\nclickhouse obfuscator\n" -$CLICKHOUSE_BINARY obfuscator --help +$CLICKHOUSE_BINARY obfuscator --help | perl -0777 -pe 's/Options:.*\n\n//igs' echo -e "\nclickhouse static\n" -$CLICKHOUSE_BINARY static-files-disk-uploader --help +$CLICKHOUSE_BINARY static-files-disk-uploader --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' @@ -68,19 +68,19 @@ ${CLICKHOUSE_BINARY}-client --help | perl -0777 -pe 's/Main options:.*\n\n//igs' echo -e "\nclickhouse-benchmark\n" ${CLICKHOUSE_BINARY}-benchmark --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-extract\n" -${CLICKHOUSE_BINARY}-extract-from-config --help +${CLICKHOUSE_BINARY}-extract-from-config --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-compressor\n" -${CLICKHOUSE_BINARY}-compressor --help +${CLICKHOUSE_BINARY}-compressor --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-format\n" -${CLICKHOUSE_BINARY}-format --help +${CLICKHOUSE_BINARY}-format --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-obfuscator\n" -${CLICKHOUSE_BINARY}-obfuscator --help +${CLICKHOUSE_BINARY}-obfuscator --help | perl -0777 -pe 's/Options:.*\n\n//igs' echo -e "\nclickhouse-git-import\n" -${CLICKHOUSE_BINARY}-git-import --help +${CLICKHOUSE_BINARY}-git-import --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-keeper-converter\n" -${CLICKHOUSE_BINARY}-keeper-converter --help +${CLICKHOUSE_BINARY}-keeper-converter --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-static-files-disk-uploader\n" -${CLICKHOUSE_BINARY}-static-files-disk-uploader --help +${CLICKHOUSE_BINARY}-static-files-disk-uploader --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse-su\n" ${CLICKHOUSE_BINARY}-su --help echo -e "\nclickhouse-disks\n" From afc6b66eb3257a3bf9935fb5d0e71f0a7b3566ea Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Wed, 29 Mar 2023 13:10:17 +0200 Subject: [PATCH 123/535] Fused KeyStateHandler and ValueState togther Removed some unneeded files and moved code around. --- src/Functions/CMakeLists.txt | 3 +- .../{api => }/ArgumentExtractor.cpp | 2 +- .../{api => }/ArgumentExtractor.h | 4 +- src/Functions/keyvaluepair/CMakeLists.txt | 9 +- src/Functions/keyvaluepair/api/CMakeLists.txt | 6 - .../{api => }/extractKeyValuePairs.cpp | 124 +++++----- .../{api => }/extractKeyValuePairs.h | 44 ++-- .../{src => }/impl/CHKeyValuePairExtractor.h | 46 ++-- .../keyvaluepair/impl/CMakeLists.txt | 7 + .../impl/state => impl}/Configuration.cpp | 8 +- .../{src/impl/state => impl}/Configuration.h | 4 +- .../InlineEscapingStateHandler.cpp | 82 +++---- .../impl/InlineEscapingStateHandler.h | 42 ++++ .../{src => impl}/KeyValuePairExtractor.h | 0 .../KeyValuePairExtractorBuilder.cpp | 39 ++-- .../KeyValuePairExtractorBuilder.h | 6 +- .../util => impl}/NeedleFactory.cpp | 11 +- .../strategies/util => impl}/NeedleFactory.h | 9 +- .../impl/NoEscapingStateHandler.cpp | 221 ++++++++++++++++++ .../impl/NoEscapingStateHandler.h | 42 ++++ .../keyvaluepair/impl/StateHandler.h | 90 +++++++ src/Functions/keyvaluepair/src/CMakeLists.txt | 12 - .../keyvaluepair/src/impl/state/State.h | 35 --- .../src/impl/state/StateHandler.cpp | 11 - .../src/impl/state/StateHandler.h | 101 -------- .../escaping/InlineEscapingStateHandler.h | 55 ----- .../NoEscapingValueStateHandler.cpp | 110 --------- .../noescaping/NoEscapingValueStateHandler.h | 29 --- .../state/strategies/util/CharacterFinder.cpp | 80 ------- .../state/strategies/util/CharacterFinder.h | 39 ---- .../tests/gtest_character_finder.cpp | 99 -------- .../tests/gtest_escaped_sequence_reader.cpp | 71 ------ ...test_escaping_key_value_pair_extractor.cpp | 2 +- .../tests/gtest_extractKeyValuePairs.cpp | 137 +++++++++++ ...test_inline_escaping_key_state_handler.cpp | 2 +- ...st_inline_escaping_value_state_handler.cpp | 2 +- .../tests/gtest_key_value_pair_extractor.cpp | 2 +- .../gtest_no_escaping_key_state_handler.cpp | 2 +- 38 files changed, 738 insertions(+), 850 deletions(-) rename src/Functions/keyvaluepair/{api => }/ArgumentExtractor.cpp (97%) rename src/Functions/keyvaluepair/{api => }/ArgumentExtractor.h (100%) delete mode 100644 src/Functions/keyvaluepair/api/CMakeLists.txt rename src/Functions/keyvaluepair/{api => }/extractKeyValuePairs.cpp (85%) rename src/Functions/keyvaluepair/{api => }/extractKeyValuePairs.h (54%) rename src/Functions/keyvaluepair/{src => }/impl/CHKeyValuePairExtractor.h (79%) create mode 100644 src/Functions/keyvaluepair/impl/CMakeLists.txt rename src/Functions/keyvaluepair/{src/impl/state => impl}/Configuration.cpp (97%) rename src/Functions/keyvaluepair/{src/impl/state => impl}/Configuration.h (97%) rename src/Functions/keyvaluepair/{src/impl/state/strategies/escaping => impl}/InlineEscapingStateHandler.cpp (73%) create mode 100644 src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h rename src/Functions/keyvaluepair/{src => impl}/KeyValuePairExtractor.h (100%) rename src/Functions/keyvaluepair/{src => impl}/KeyValuePairExtractorBuilder.cpp (54%) rename src/Functions/keyvaluepair/{src => impl}/KeyValuePairExtractorBuilder.h (74%) rename src/Functions/keyvaluepair/{src/impl/state/strategies/util => impl}/NeedleFactory.cpp (86%) rename src/Functions/keyvaluepair/{src/impl/state/strategies/util => impl}/NeedleFactory.h (92%) create mode 100644 src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp create mode 100644 src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h create mode 100644 src/Functions/keyvaluepair/impl/StateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/CMakeLists.txt delete mode 100644 src/Functions/keyvaluepair/src/impl/state/State.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/StateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp delete mode 100644 src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h delete mode 100644 src/Functions/keyvaluepair/tests/gtest_character_finder.cpp delete mode 100644 src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp create mode 100644 src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 5a3adbace22..2f5c8a212f2 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -104,8 +104,7 @@ add_subdirectory(JSONPath) list (APPEND PRIVATE_LIBS clickhouse_functions_jsonpath) add_subdirectory(keyvaluepair) -list (APPEND OBJECT_LIBS $) -list (APPEND OBJECT_LIBS $) +list (APPEND OBJECT_LIBS $) # Signed integer overflow on user-provided data inside boost::geometry - ignore. set_source_files_properties("pointInPolygon.cpp" PROPERTIES COMPILE_FLAGS -fno-sanitize=signed-integer-overflow) diff --git a/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp similarity index 97% rename from src/Functions/keyvaluepair/api/ArgumentExtractor.cpp rename to src/Functions/keyvaluepair/ArgumentExtractor.cpp index 0ba87fab531..2799a9c5e0f 100644 --- a/src/Functions/keyvaluepair/api/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -1,4 +1,4 @@ -#include "ArgumentExtractor.h" +#include namespace DB { diff --git a/src/Functions/keyvaluepair/api/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h similarity index 100% rename from src/Functions/keyvaluepair/api/ArgumentExtractor.h rename to src/Functions/keyvaluepair/ArgumentExtractor.h index 5f5854ba5b9..171cc9d3cac 100644 --- a/src/Functions/keyvaluepair/api/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -1,10 +1,10 @@ #pragma once -#include - #include #include +#include + namespace DB { diff --git a/src/Functions/keyvaluepair/CMakeLists.txt b/src/Functions/keyvaluepair/CMakeLists.txt index 6cedfe8bf10..eeac4ce11d4 100644 --- a/src/Functions/keyvaluepair/CMakeLists.txt +++ b/src/Functions/keyvaluepair/CMakeLists.txt @@ -1,2 +1,7 @@ -add_subdirectory(src) -add_subdirectory(api) \ No newline at end of file +include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs .) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs impl) + +add_library(clickhouse_functions_extractkeyvaluepairs ${clickhouse_functions_extractkeyvaluepairs_sources} ${clickhouse_functions_extractkeyvaluepairs_headers}) + +target_link_libraries(clickhouse_functions_extractkeyvaluepairs PRIVATE dbms) diff --git a/src/Functions/keyvaluepair/api/CMakeLists.txt b/src/Functions/keyvaluepair/api/CMakeLists.txt deleted file mode 100644 index d5390eeb3e3..00000000000 --- a/src/Functions/keyvaluepair/api/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_api .) - -add_library(clickhouse_functions_extractkeyvaluepairs_api ${clickhouse_functions_extractkeyvaluepairs_api_sources} ${clickhouse_functions_extractkeyvaluepairs_api_headers}) - -target_link_libraries(clickhouse_functions_extractkeyvaluepairs_api PRIVATE dbms clickhouse_functions_extractkeyvaluepairs_core) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp similarity index 85% rename from src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp rename to src/Functions/keyvaluepair/extractKeyValuePairs.cpp index 1229f958c21..c9d0a1a5f3c 100644 --- a/src/Functions/keyvaluepair/api/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -1,59 +1,24 @@ -#include "extractKeyValuePairs.h" +#include + +#include +#include +#include #include +#include #include +#include +#include +#include #include -#include -#include -#include - -namespace DB +namespace { +using namespace DB; -ExtractKeyValuePairs::ExtractKeyValuePairs() - : return_type(std::make_shared(std::make_shared(), std::make_shared())) -{ -} - -String ExtractKeyValuePairs::getName() const -{ - return name; -} - -FunctionPtr ExtractKeyValuePairs::create(ContextPtr) -{ - return std::make_shared(); -} - -static ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) -{ - auto offsets = ColumnUInt64::create(); - - auto keys = ColumnString::create(); - auto values = ColumnString::create(); - - uint64_t offset = 0u; - - for (auto i = 0u; i < data_column->size(); i++) - { - auto row = data_column->getDataAt(i).toView(); - - auto pairs_count = extractor->extract(row, keys, values); - - offset += pairs_count; - - offsets->insert(offset); - } - - ColumnPtr keys_ptr = std::move(keys); - - return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); -} - -auto ExtractKeyValuePairs::getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) +auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) { auto builder = KeyValuePairExtractorBuilder(); @@ -80,6 +45,46 @@ auto ExtractKeyValuePairs::getExtractor(const ArgumentExtractor::ParsedArguments return builder.build(); } +ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) +{ + auto offsets = ColumnUInt64::create(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + uint64_t offset = 0u; + + for (auto i = 0u; i < data_column->size(); i++) + { + auto row = data_column->getDataAt(i).toView(); + + auto pairs_count = extractor->extract(row, keys, values); + + offset += pairs_count; + + offsets->insert(offset); + } + + ColumnPtr keys_ptr = std::move(keys); + + return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); +} + + +} + +namespace DB +{ + +ExtractKeyValuePairs::ExtractKeyValuePairs() +{ +} + +DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes &) const +{ + return std::make_shared(std::make_shared(), std::make_shared()); +} + ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { auto parsed_arguments = ArgumentExtractor::extract(arguments); @@ -89,31 +94,6 @@ ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & argum return extract(parsed_arguments.data_column, extractor_without_escaping); } -bool ExtractKeyValuePairs::isVariadic() const -{ - return true; -} - -bool ExtractKeyValuePairs::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const -{ - return false; -} - -std::size_t ExtractKeyValuePairs::getNumberOfArguments() const -{ - return 0u; -} - -DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes &) const -{ - return return_type; -} - -ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const -{ - return {1, 2, 3, 4, 5}; -} - REGISTER_FUNCTION(ExtractKeyValuePairs) { factory.registerFunction( diff --git a/src/Functions/keyvaluepair/api/extractKeyValuePairs.h b/src/Functions/keyvaluepair/extractKeyValuePairs.h similarity index 54% rename from src/Functions/keyvaluepair/api/extractKeyValuePairs.h rename to src/Functions/keyvaluepair/extractKeyValuePairs.h index 082da40138f..53ad46c0da3 100644 --- a/src/Functions/keyvaluepair/api/extractKeyValuePairs.h +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.h @@ -1,13 +1,9 @@ #pragma once -#include - -#include #include + #include #include -#include -#include "ArgumentExtractor.h" namespace DB { @@ -19,26 +15,38 @@ public: static constexpr auto name = "extractKeyValuePairs"; - static FunctionPtr create(ContextPtr); + String getName() const override + { + return name; + } - String getName() const override; + static FunctionPtr create(ContextPtr) + { + return std::make_shared(); + } ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t) const override; - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override; - - bool isVariadic() const override; - - size_t getNumberOfArguments() const override; - DataTypePtr getReturnTypeImpl(const DataTypes &) const override; -private: - DataTypePtr return_type; + bool isVariadic() const override + { + return true; + } - static auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments); + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override + { + return false; + } - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; + std::size_t getNumberOfArguments() const override + { + return 0u; + } + + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override + { + return {1, 2, 3, 4, 5}; + } }; } diff --git a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h similarity index 79% rename from src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h rename to src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index ce868c411e5..fe022551eb5 100644 --- a/src/Functions/keyvaluepair/src/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -3,25 +3,28 @@ #include #include #include -#include "Functions/keyvaluepair/src/impl/state/State.h" -#include "fmt/core.h" -#include "state/StateHandler.h" -#include "../KeyValuePairExtractor.h" +#include +#include + +#include #include namespace DB { -template +template class CHKeyValuePairExtractor : public KeyValuePairExtractor { - using Key = typename KeyStateHandler::ElementType; - using Value = typename ValueStateHandler::ElementType; + using Key = typename StateHandler::KeyType; + using Value = typename StateHandler::ValueType; + + using State = typename DB::extractKV::StateHandler::State; + using NextState = DB::extractKV::StateHandler::NextState; public: - CHKeyValuePairExtractor(KeyStateHandler key_state_handler_, ValueStateHandler value_state_handler_) - : key_state_handler(std::move(key_state_handler_)), value_state_handler(std::move(value_state_handler_)) + CHKeyValuePairExtractor(StateHandler state_handler_) + : state_handler(std::move(state_handler_)) {} uint64_t extract(const std::string & data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) override @@ -38,10 +41,9 @@ public: Value value; uint64_t row_offset = 0; - const auto & config = key_state_handler.extractor_configuration; + const auto & config = state_handler.extractor_configuration; std::cerr << "CHKeyValuePairExtractor::extract with " - << typeid(key_state_handler).name() << " \\ " - << typeid(value_state_handler).name() + << typeid(state_handler).name() << "\nConfiguration" << "\n\tKV delimiter: '" << config.key_value_delimiter << "'" << "\n\tquote char : '" << config.quoting_character << "'" @@ -97,40 +99,41 @@ private: switch (state) { case State::WAITING_KEY: - return key_state_handler.wait(file); + return state_handler.waitKey(file); case State::READING_KEY: { - auto result = key_state_handler.read(file, key); + auto result = state_handler.readKey(file, key); std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; return result; } case State::READING_QUOTED_KEY: { - auto result = key_state_handler.readQuoted(file, key); + auto result = state_handler.readQuotedKey(file, key); std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; return result; } case State::READING_KV_DELIMITER: - return key_state_handler.readKeyValueDelimiter(file); + return state_handler.readKeyValueDelimiter(file); case State::WAITING_VALUE: { - return value_state_handler.wait(file); + return state_handler.waitValue(file); } case State::READING_VALUE: { - auto result = value_state_handler.read(file, value); + auto result = state_handler.readValue(file, value); std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; return result; } case State::READING_QUOTED_VALUE: { - auto result = value_state_handler.readQuoted(file, value); + auto result = state_handler.readQuotedValue(file, value); std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; return result; } case State::FLUSH_PAIR: return flushPair(file, key, value, keys, values, row_offset); - case END: + + case State::END: return {0, state}; } } @@ -152,8 +155,7 @@ private: return {0, file.size() == 0 ? State::END : State::WAITING_KEY}; } - KeyStateHandler key_state_handler; - ValueStateHandler value_state_handler; + StateHandler state_handler; }; } diff --git a/src/Functions/keyvaluepair/impl/CMakeLists.txt b/src/Functions/keyvaluepair/impl/CMakeLists.txt new file mode 100644 index 00000000000..c61fb520fcd --- /dev/null +++ b/src/Functions/keyvaluepair/impl/CMakeLists.txt @@ -0,0 +1,7 @@ +include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core .) +add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl) + +add_library(clickhouse_functions_extractkeyvaluepairs_core ${clickhouse_functions_extractkeyvaluepairs_core_sources} ${clickhouse_functions_extractkeyvaluepairs_core_headers}) + +target_link_libraries(clickhouse_functions_extractkeyvaluepairs_core PRIVATE dbms) diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp b/src/Functions/keyvaluepair/impl/Configuration.cpp similarity index 97% rename from src/Functions/keyvaluepair/src/impl/state/Configuration.cpp rename to src/Functions/keyvaluepair/impl/Configuration.cpp index 547b924e1df..da5af6f946f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.cpp +++ b/src/Functions/keyvaluepair/impl/Configuration.cpp @@ -1,4 +1,5 @@ -#include "Configuration.h" +#include + #include namespace DB @@ -9,6 +10,9 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } +namespace extractKV +{ + Configuration::Configuration(char key_value_delimiter_, char quoting_character_, std::vector pair_delimiters_) : key_value_delimiter(key_value_delimiter_), quoting_character(quoting_character_), pair_delimiters(std::move(pair_delimiters_)) { @@ -74,3 +78,5 @@ void ConfigurationFactory::validate(char key_value_delimiter, char quoting_chara } } + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/Configuration.h b/src/Functions/keyvaluepair/impl/Configuration.h similarity index 97% rename from src/Functions/keyvaluepair/src/impl/state/Configuration.h rename to src/Functions/keyvaluepair/impl/Configuration.h index 36414ae5013..12607a78b5c 100644 --- a/src/Functions/keyvaluepair/src/impl/state/Configuration.h +++ b/src/Functions/keyvaluepair/impl/Configuration.h @@ -4,7 +4,8 @@ namespace DB { - +namespace extractKV +{ struct ConfigurationFactory; class Configuration @@ -35,5 +36,6 @@ private: static constexpr auto MAX_NUMBER_OF_PAIR_DELIMITERS = 8u; }; +} } diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp similarity index 73% rename from src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp rename to src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp index 1695e2e5e85..5147bd24b2a 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp @@ -1,6 +1,5 @@ -#include "InlineEscapingStateHandler.h" -#include -#include +#include +#include #include #include @@ -17,27 +16,32 @@ size_t consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t return buf.getPosition(); } + +using NextState = DB::extractKV::StateHandler::NextState; + } namespace DB { -InlineEscapingKeyStateHandler::InlineEscapingKeyStateHandler(Configuration configuration_) - : extractor_configuration(std::move(configuration_)) +namespace extractKV +{ + +InlineEscapingStateHandler::InlineEscapingStateHandler(Configuration extractor_configuration_) + : extractor_configuration(std::move(extractor_configuration_)) { wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); } -NextState InlineEscapingKeyStateHandler::wait(std::string_view file) const +NextState InlineEscapingStateHandler::waitKey(std::string_view file) const { const auto quoting_character = extractor_configuration.quoting_character; - size_t pos = 0; - while (const auto * p = find_first_not_symbols_or_null({file.begin() + pos, file.end()}, wait_needles)) + + if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) { const size_t character_position = p - file.begin(); - if (*p == quoting_character) { return {character_position + 1u, State::READING_QUOTED_KEY}; @@ -57,7 +61,7 @@ NextState InlineEscapingKeyStateHandler::wait(std::string_view file) const * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm * */ -NextState InlineEscapingKeyStateHandler::read(std::string_view file, ElementType & key) const +NextState InlineEscapingStateHandler::readKey(std::string_view file, KeyType & key) const { const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; @@ -97,7 +101,7 @@ NextState InlineEscapingKeyStateHandler::read(std::string_view file, ElementType return {file.size(), State::END}; } -NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, ElementType & key) const +NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, KeyType & key) const { const auto quoting_character = extractor_configuration.quoting_character; @@ -137,7 +141,7 @@ NextState InlineEscapingKeyStateHandler::readQuoted(std::string_view file, Eleme return {file.size(), State::END}; } -NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view file) const +NextState InlineEscapingStateHandler::readKeyValueDelimiter(std::string_view file) const { const auto current_character = file[0]; if (current_character == extractor_configuration.key_value_delimiter) @@ -148,50 +152,35 @@ NextState InlineEscapingKeyStateHandler::readKeyValueDelimiter(std::string_view return {0, State::WAITING_KEY}; } - -InlineEscapingValueStateHandler::InlineEscapingValueStateHandler(Configuration extractor_configuration_) - : extractor_configuration(std::move(extractor_configuration_)) +NextState InlineEscapingStateHandler::waitValue(std::string_view file) const { - read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState InlineEscapingValueStateHandler::wait(std::string_view file) const -{ - const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; size_t pos = 0; - if (pos < file.size()) - { - const auto current_character = file[pos]; + const auto current_character = file[pos]; - if (quoting_character == current_character) - { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (key_value_delimiter == current_character) - { - return {pos, State::WAITING_KEY}; - } - else - { - return {pos, State::READING_VALUE}; - } + if (current_character == quoting_character) + { + return {pos + 1u, State::READING_QUOTED_VALUE}; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_KEY}; } return {pos, State::READING_VALUE}; } -NextState InlineEscapingValueStateHandler::read(std::string_view file, ElementType & value) const +NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType & value) const { - const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; value.clear(); size_t pos = 0; while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { - auto character_position = p - file.begin(); + const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; if (*p == '\\') @@ -221,21 +210,20 @@ NextState InlineEscapingValueStateHandler::read(std::string_view file, ElementTy // Reached end of input, consume rest of the file as value and make sure KV pair is produced. value.insert(value.end(), file.begin() + pos, file.end()); - return {pos, State::FLUSH_PAIR}; } -NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, ElementType & value) const +NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, ValueType & value) const { const auto quoting_character = extractor_configuration.quoting_character; - const std::string_view needles{read_quoted_needles.begin(), read_quoted_needles.end()}; + + size_t pos = 0; value.clear(); - size_t pos = 0; - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, needles)) + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) { - auto character_position = p - file.begin(); + const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; if (*p == '\\') @@ -261,3 +249,5 @@ NextState InlineEscapingValueStateHandler::readQuoted(std::string_view file, Ele } } + +} diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h new file mode 100644 index 00000000000..120d2f3d95b --- /dev/null +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#include +#include +#include + +namespace DB +{ + +namespace extractKV +{ + +class InlineEscapingStateHandler : public StateHandler +{ +public: + using KeyType = std::string; + using ValueType = std::string; + + explicit InlineEscapingStateHandler(Configuration configuration_); + + [[nodiscard]] NextState waitKey(std::string_view file) const; + [[nodiscard]] NextState readKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readQuotedKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; + [[nodiscard]] NextState waitValue(std::string_view file) const; + [[nodiscard]] NextState readValue(std::string_view file, ValueType & value) const; + [[nodiscard]] NextState readQuotedValue(std::string_view file, ValueType & value) const; + + const Configuration extractor_configuration; + +private: + std::vector wait_needles; + std::vector read_needles; + std::vector read_quoted_needles; +}; + +} + +} diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h similarity index 100% rename from src/Functions/keyvaluepair/src/KeyValuePairExtractor.h rename to src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp similarity index 54% rename from src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp rename to src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp index 57eda58d38d..a71f38413d4 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp @@ -1,10 +1,9 @@ -#include "KeyValuePairExtractorBuilder.h" +#include -#include "Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h" -#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" -#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" -#include "impl/CHKeyValuePairExtractor.h" -#include "impl/state/Configuration.h" +#include +#include +#include +#include namespace DB { @@ -43,30 +42,30 @@ std::shared_ptr KeyValuePairExtractorBuilder::build() con return buildWithoutEscaping(); } +namespace +{ +using namespace extractKV; + +template +auto makeStateHandler(const T && handler) +{ + return std::make_shared>(handler); +} + +} + std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() const { auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - CKeyStateHandler auto key_state_handler = NoEscapingKeyStateHandler( - configuration - ); - - CValueStateHandler auto value_state_handler = NoEscapingValueStateHandler( - configuration - ); - - return std::make_shared>(key_state_handler, value_state_handler); + return makeStateHandler(NoEscapingStateHandler(configuration)); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - CKeyStateHandler auto key_state_handler = InlineEscapingKeyStateHandler(configuration); - - CValueStateHandler auto value_state_handler = InlineEscapingValueStateHandler(configuration); - - return std::make_shared>(key_state_handler, value_state_handler); + return makeStateHandler(InlineEscapingStateHandler(configuration)); } } diff --git a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h similarity index 74% rename from src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h rename to src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h index a6d7e9c1b65..4bed22962f8 100644 --- a/src/Functions/keyvaluepair/src/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h @@ -1,10 +1,6 @@ #pragma once -#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingKeyStateHandler.h" -#include "Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h" -#include "KeyValuePairExtractor.h" -//#include "impl/CHKeyValuePairExtractor.h" - +#include #include namespace DB diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp b/src/Functions/keyvaluepair/impl/NeedleFactory.cpp similarity index 86% rename from src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp rename to src/Functions/keyvaluepair/impl/NeedleFactory.cpp index 6863e28984c..f48487df36f 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.cpp +++ b/src/Functions/keyvaluepair/impl/NeedleFactory.cpp @@ -1,9 +1,12 @@ -#include "NeedleFactory.h" +#include namespace DB { -std::vector NeedleFactory::getWaitNeedles(const DB::Configuration & extractor_configuration) +namespace extractKV +{ + +std::vector NeedleFactory::getWaitNeedles(const Configuration & extractor_configuration) { const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; @@ -49,7 +52,7 @@ std::vector NeedleFactory::getReadQuotedNeedles(const Configuration & extr return needles; } -std::vector EscapingNeedleFactory::getWaitNeedles(const DB::Configuration & extractor_configuration) +std::vector EscapingNeedleFactory::getWaitNeedles(const Configuration & extractor_configuration) { auto needles = NeedleFactory::getWaitNeedles(extractor_configuration); @@ -77,3 +80,5 @@ std::vector EscapingNeedleFactory::getReadQuotedNeedles(const Configuratio } } + +} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h b/src/Functions/keyvaluepair/impl/NeedleFactory.h similarity index 92% rename from src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h rename to src/Functions/keyvaluepair/impl/NeedleFactory.h index 43920091ab6..180e30bce02 100644 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/NeedleFactory.h +++ b/src/Functions/keyvaluepair/impl/NeedleFactory.h @@ -1,12 +1,15 @@ #pragma once +#include + #include -#include - namespace DB { +namespace extractKV +{ + /* * Did not spend much time here, running against the clock :) * @@ -31,3 +34,5 @@ public: }; } + +} diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp new file mode 100644 index 00000000000..63d5df45d5d --- /dev/null +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -0,0 +1,221 @@ +#include + +#include + +#include + +namespace +{ + +std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end) +{ + return std::string_view{file.begin() + begin, file.begin() + end}; +} + +using NextState = DB::extractKV::StateHandler::NextState; + +} + +namespace DB +{ + +namespace extractKV +{ + + +NoEscapingStateHandler::NoEscapingStateHandler(Configuration extractor_configuration_) +: extractor_configuration(std::move(extractor_configuration_)) +{ + wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); + read_needles = NeedleFactory::getReadNeedles(extractor_configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); +} + +NextState NoEscapingStateHandler::waitKey(std::string_view file) const +{ + const auto quoting_character = extractor_configuration.quoting_character; + + if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) + { + const size_t character_position = p - file.begin(); + if (*p == quoting_character) + { + return {character_position + 1u, State::READING_QUOTED_KEY}; + } + else + { + return {character_position, State::READING_KEY}; + } + } + + return {file.size(), State::END}; +} + +NextState NoEscapingStateHandler::readKey(std::string_view file, KeyType & key) const +{ + const auto & [key_value_delimiter, quoting_character, pair_delimiters] + = extractor_configuration; + + key = {}; + + size_t pos = 0; + auto start_index = pos; + + while (auto p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + { + const size_t character_position = p - file.begin(); + auto next_pos = character_position + 1u; + + if (*p == key_value_delimiter) + { + key = createElement(file, start_index, character_position); + + if (key.empty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::WAITING_VALUE}; + } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + { + return {next_pos, State::WAITING_KEY}; + } + + pos = next_pos; + // TODO: add check to not read past end of `file`'s data? + } + + return {file.size(), State::END}; +} + +NextState NoEscapingStateHandler::readQuotedKey(std::string_view file, KeyType & key) const +{ + const auto quoting_character = extractor_configuration.quoting_character; + + key = {}; + + size_t pos = 0; + auto start_index = pos; + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) + { + const size_t character_position = p - file.begin(); + auto next_pos = character_position + 1u; + + if (*p == quoting_character) + { + key = createElement(file, start_index, character_position); + + if (key.empty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::READING_KV_DELIMITER}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; +} + +NextState NoEscapingStateHandler::readKeyValueDelimiter(std::string_view file) const +{ + const auto current_character = file[0]; + if (current_character == extractor_configuration.key_value_delimiter) + { + return {1, WAITING_VALUE}; + } + + return {0, State::WAITING_KEY}; +} + +NextState NoEscapingStateHandler::waitValue(std::string_view file) const +{ + const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; + + size_t pos = 0; + const auto current_character = file[pos]; + + if (current_character == quoting_character) + { + return {pos + 1u, State::READING_QUOTED_VALUE}; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_KEY}; + } + + return {pos, State::READING_VALUE}; + +// // TODO: can't bre reached, remove it? +// return {file.size(), State::READING_VALUE}; +} + +NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & value) const +{ + const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + + value = {}; + + size_t pos = 0; + auto start_index = pos; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + { + const size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (*p == key_value_delimiter) + { + return {next_pos, State::WAITING_KEY}; + } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + { + // reached next pair + value = createElement(file, start_index, character_position); + + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + // TODO: do I really need the below logic? + // this allows empty values at the end + value = createElement(file, start_index, file.size()); + return {file.size(), State::FLUSH_PAIR}; +} + +NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, ValueType & value) const +{ + const auto quoting_character = extractor_configuration.quoting_character; + + size_t pos = 0; + auto start_index = pos; + + value = {}; + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) + { + const size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (*p == quoting_character) + { + value = createElement(file, start_index, character_position); + + std::cerr << "NoEscapingStateHandler::readQuoted Going to consume up to: «" << fancyQuote(file.substr(0, next_pos)) << " to " << fancyQuote(file.substr(next_pos)) << std::endl; + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; +} + +} + +} diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h new file mode 100644 index 00000000000..e547a503530 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#include +#include +#include + +namespace DB +{ + +namespace extractKV +{ + +class NoEscapingStateHandler : public StateHandler +{ +public: + using KeyType = std::string_view; + using ValueType = std::string_view; + + explicit NoEscapingStateHandler(Configuration extractor_configuration_); + + [[nodiscard]] NextState waitKey(std::string_view file) const; + [[nodiscard]] NextState readKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readQuotedKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; + [[nodiscard]] NextState waitValue(std::string_view file) const; + [[nodiscard]] NextState readValue(std::string_view file, ValueType & value) const; + [[nodiscard]] NextState readQuotedValue(std::string_view file, ValueType & value) const; + + const Configuration extractor_configuration; + +private: + std::vector wait_needles; + std::vector read_needles; + std::vector read_quoted_needles; +}; + +} + +} diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h new file mode 100644 index 00000000000..362e2d9618f --- /dev/null +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -0,0 +1,90 @@ +#pragma once + +#include + +#include + +namespace DB +{ + +namespace extractKV +{ + +class StateHandler +{ +public: + enum State + { + // Skip characters until it finds a valid first key character. Might jump to READING_KEY, READING_QUOTED_KEY or END. + WAITING_KEY, + // Tries to read a key. Might jump to WAITING_KEY, WAITING_VALUE or END. + READING_KEY, + // Tries to read an quoted/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. + READING_QUOTED_KEY, + // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. + READING_KV_DELIMITER, + // Skip characters until it finds a valid first value character. Might jump to READING_QUOTED_VALUE or READING_VALUE. + WAITING_VALUE, + // Tries to read a value. Jumps to FLUSH_PAIR. + READING_VALUE, + // Tries to read an quoted/ quoted value. Might jump to FLUSH_PAIR or END. + READING_QUOTED_VALUE, + // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. + FLUSH_PAIR, + END + }; + + struct NextState + { + std::size_t position_in_string; + State state; + }; + + StateHandler() = default; + StateHandler(const StateHandler &) = default; + + virtual ~StateHandler() = default; +}; + +} + +// TODO(vnemkov): Debug stuff, remove before merging + +template +struct CustomQuoted +{ + const char * start_quote = "\""; + const char * end_quote = "\""; + + const T & value; +}; + +template +CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) +{ + assert(start_quote != nullptr); + + return CustomQuoted{ + .start_quote = start_quote, + .end_quote = end_quote ? end_quote : start_quote, + .value = value + }; +} + +template +CustomQuoted fancyQuote(const T & value) +{ + return CustomQuoted{ + .start_quote = "«", + .end_quote = "»", + .value = value + }; +} + +template +std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) +{ + return ostr << val.start_quote << val.value << val.end_quote; +} + +} diff --git a/src/Functions/keyvaluepair/src/CMakeLists.txt b/src/Functions/keyvaluepair/src/CMakeLists.txt deleted file mode 100644 index ae30de13f6a..00000000000 --- a/src/Functions/keyvaluepair/src/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -include("${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake") -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core .) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/escaping) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/noescaping) -add_headers_and_sources(clickhouse_functions_extractkeyvaluepairs_core impl/state/strategies/util) - -add_library(clickhouse_functions_extractkeyvaluepairs_core ${clickhouse_functions_extractkeyvaluepairs_core_sources} ${clickhouse_functions_extractkeyvaluepairs_core_headers}) - -target_link_libraries(clickhouse_functions_extractkeyvaluepairs_core PRIVATE dbms) \ No newline at end of file diff --git a/src/Functions/keyvaluepair/src/impl/state/State.h b/src/Functions/keyvaluepair/src/impl/state/State.h deleted file mode 100644 index 8e9c920e7c3..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/State.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include - -namespace DB -{ - -enum State -{ - // Skip characters until it finds a valid first key character. Might jump to READING_KEY, READING_QUOTED_KEY or END. - WAITING_KEY, - // Tries to read a key. Might jump to WAITING_KEY, WAITING_VALUE or END. - READING_KEY, - // Tries to read an quoted/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. - READING_QUOTED_KEY, - // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. - READING_KV_DELIMITER, - // Skip characters until it finds a valid first value character. Might jump to READING_QUOTED_VALUE or READING_VALUE. - WAITING_VALUE, - // Tries to read a value. Jumps to FLUSH_PAIR. - READING_VALUE, - // Tries to read an quoted/ quoted value. Might jump to FLUSH_PAIR or END. - READING_QUOTED_VALUE, - // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. - FLUSH_PAIR, - END -}; - -struct NextState -{ - std::size_t position_in_string; - State state; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp deleted file mode 100644 index a1beb077bb5..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "StateHandler.h" - -namespace DB -{ - -std::string_view StateHandler::createElement(std::string_view file, std::size_t begin, std::size_t end) -{ - return std::string_view{file.begin() + begin, file.begin() + end}; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h b/src/Functions/keyvaluepair/src/impl/state/StateHandler.h deleted file mode 100644 index ae2bbfc6124..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/StateHandler.h +++ /dev/null @@ -1,101 +0,0 @@ -#pragma once - -#include -#include -#include -#include "State.h" - -#include - -namespace DB -{ - -template -concept CInlineEscapingKeyStateHandler = requires(KeyStateHandler handler) -{ - { handler.wait(std::string_view {}) } -> std::same_as; - { handler.read(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readKeyValueDelimiter(std::string_view {}) } -> std::same_as; -}; - -template -concept CNoEscapingKeyStateHandler = requires(KeyStateHandler handler) -{ - { handler.wait(std::string_view {}) } -> std::same_as; - { handler.read(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readKeyValueDelimiter(std::string_view {}) } -> std::same_as; -}; - -template -concept CKeyStateHandler = CInlineEscapingKeyStateHandler || CNoEscapingKeyStateHandler; - -template -concept CInlineEscapingValueStateHandler = requires(ValueStateHandler handler) -{ - { handler.wait(std::string_view {}) } -> std::same_as; - { handler.read(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; -}; - -template -concept CNoEscapingValueStateHandler = requires(ValueStateHandler handler) -{ - { handler.wait(std::string_view {}) } -> std::same_as; - { handler.read(std::string_view {}, std::declval()) } -> std::same_as; - { handler.readQuoted(std::string_view {}, std::declval()) } -> std::same_as; -}; - -template -concept CValueStateHandler = CInlineEscapingValueStateHandler || CNoEscapingValueStateHandler; - -struct StateHandler -{ - StateHandler() = default; - StateHandler(const StateHandler &) = default; - - virtual ~StateHandler() = default; - -protected: - [[nodiscard]] static std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end); -}; - -template -struct CustomQuoted -{ - const char * start_quote = "\""; - const char * end_quote = "\""; - - const T & value; -}; - -template -CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) -{ - assert(start_quote != nullptr); - - return CustomQuoted{ - .start_quote = start_quote, - .end_quote = end_quote ? end_quote : start_quote, - .value = value - }; -} - -template -CustomQuoted fancyQuote(const T & value) -{ - return CustomQuoted{ - .start_quote = "«", - .end_quote = "»", - .value = value - }; -} - -template -std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) -{ - return ostr << val.start_quote << val.value << val.end_quote; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h deleted file mode 100644 index 23bbd062284..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/escaping/InlineEscapingStateHandler.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include -#include -#include "Functions/keyvaluepair/src/impl/state/Configuration.h" -#include "Functions/keyvaluepair/src/impl/state/State.h" -#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" - -namespace DB -{ - -class InlineEscapingKeyStateHandler : public StateHandler -{ -public: - using ElementType = std::string; - - explicit InlineEscapingKeyStateHandler(Configuration configuration_); - - [[nodiscard]] NextState wait(std::string_view file) const; - - [[nodiscard]] NextState read(std::string_view file, ElementType & key) const; - - [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & key) const; - - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; - -private: - Configuration extractor_configuration; - - std::vector wait_needles; - std::vector read_needles; - std::vector read_quoted_needles; -}; - - -class InlineEscapingValueStateHandler : public StateHandler -{ -public: - using ElementType = std::string; - - explicit InlineEscapingValueStateHandler(Configuration extractor_configuration_); - - [[nodiscard]] NextState wait(std::string_view file) const; - - [[nodiscard]] NextState read(std::string_view file, ElementType & value) const; - - [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & value) const; - -private: - Configuration extractor_configuration; - std::vector read_needles; - std::vector read_quoted_needles; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp deleted file mode 100644 index 7bc90e9c7e0..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "NoEscapingValueStateHandler.h" -#include -#include - -namespace DB -{ - -NoEscapingValueStateHandler::NoEscapingValueStateHandler(Configuration extractor_configuration_) - : extractor_configuration(std::move(extractor_configuration_)) -{ - read_needles = NeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState NoEscapingValueStateHandler::wait(std::string_view file) const -{ - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - size_t pos = 0; - if (pos < file.size()) - { - const auto current_character = file[pos]; - - if (quoting_character == current_character) - { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (key_value_delimiter == current_character) - { - return {pos, State::WAITING_KEY}; - } - else - { - return {pos, State::READING_VALUE}; - } - } - - return {file.size(), State::READING_VALUE}; -} - -NextState NoEscapingValueStateHandler::read(std::string_view file, ElementType & value) const -{ - size_t pos = 0; - auto start_index = pos; - - value = {}; - - BoundsSafeCharacterFinder finder; - - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - while (auto character_position_opt = finder.findFirst(file, pos, read_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (key_value_delimiter == character) - { - return {next_pos, State::WAITING_KEY}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end()) - { - value = createElement(file, start_index, character_position); - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - // TODO: do I really need the below logic? - // this allows empty values at the end - value = createElement(file, start_index, file.size()); - return {file.size(), State::FLUSH_PAIR}; -} - -NextState NoEscapingValueStateHandler::readQuoted(std::string_view file, ElementType & value) const -{ - size_t pos = 0; - auto start_index = pos; - - value = {}; - - BoundsSafeCharacterFinder finder; - - const auto quoting_character = extractor_configuration.quoting_character; - - while (auto character_position_opt = finder.findFirst(file, pos, read_quoted_needles)) - { - auto character_position = *character_position_opt; - auto character = file[character_position]; - auto next_pos = character_position + 1u; - - if (quoting_character == character) - { - value = createElement(file, start_index, character_position); - - std::cerr << "NoEscapingValueStateHandler::readQuoted Going to consume up to: «" << fancyQuote(file.substr(0, next_pos)) << " to " << fancyQuote(file.substr(next_pos)) << std::endl; - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h b/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h deleted file mode 100644 index 25901156ca6..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/noescaping/NoEscapingValueStateHandler.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include "Functions/keyvaluepair/src/impl/state/Configuration.h" -#include "Functions/keyvaluepair/src/impl/state/StateHandler.h" - -namespace DB -{ - -class NoEscapingValueStateHandler : public StateHandler -{ -public: - using ElementType = std::string_view; - - explicit NoEscapingValueStateHandler(Configuration extractor_configuration_); - - [[nodiscard]] NextState wait(std::string_view file) const; - - [[nodiscard]] NextState read(std::string_view file, ElementType & value) const; - - [[nodiscard]] NextState readQuoted(std::string_view file, ElementType & value) const; - -private: - Configuration extractor_configuration; - std::vector read_needles; - std::vector read_quoted_needles; -}; - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp deleted file mode 100644 index a4c738cc3aa..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "CharacterFinder.h" -#include - - -namespace DB -{ - -std::optional CharacterFinder::findFirst(std::string_view haystack, const std::vector & needles) -{ - if (!needles.empty()) - { - if (const auto * ptr = find_first_symbols_or_null(haystack, {needles.begin(), needles.end()})) - { - return ptr - haystack.begin(); - } - } - - return std::nullopt; -} - -std::optional CharacterFinder::findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles) -{ - if (auto position = findFirst({haystack.begin() + offset, haystack.end()}, needles)) - { - return offset + *position; - } - - return std::nullopt; -} - -std::optional CharacterFinder::findFirstNot(std::string_view haystack, const std::vector & needles) -{ -// if (needles.empty()) -// { -// return 0u; -// } - - if (const auto * ptr = find_first_not_symbols_or_null(haystack, {needles.begin(), needles.end()})) - { - return ptr - haystack.begin(); - } - - return std::nullopt; -} - -std::optional CharacterFinder::findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles) -{ - if (auto position = findFirstNot({haystack.begin() + offset, haystack.end()}, needles)) - { - return offset + *position; - } - - return std::nullopt; -} - -std::optional BoundsSafeCharacterFinder::findFirst( - std::string_view haystack, std::size_t offset, const std::vector & needles -) const -{ - if (haystack.size() > offset) - { - return CharacterFinder::findFirst(haystack, offset, needles); - } - - return std::nullopt; -} - -std::optional BoundsSafeCharacterFinder::findFirstNot( - std::string_view haystack, std::size_t offset, const std::vector & needles -) const -{ - if (haystack.size() > offset) - { - return CharacterFinder::findFirstNot(haystack, offset, needles); - } - - return std::nullopt; -} - -} diff --git a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h b/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h deleted file mode 100644 index 3f518a51c41..00000000000 --- a/src/Functions/keyvaluepair/src/impl/state/strategies/util/CharacterFinder.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace DB -{ - -class CharacterFinder -{ -public: - using Position = std::size_t; - virtual ~CharacterFinder() = default; - - static std::optional findFirst(std::string_view haystack, const std::vector & needles); - - static std::optional findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles); - - static std::optional findFirstNot(std::string_view haystack, const std::vector & needles); - - static std::optional findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles); - -}; - -/* - * Maybe decorator would be better :) - * */ -class BoundsSafeCharacterFinder -{ - using Position = std::size_t; -public: - std::optional findFirst(std::string_view haystack, std::size_t offset, const std::vector & needles) const; - - std::optional findFirstNot(std::string_view haystack, std::size_t offset, const std::vector & needles) const; -}; - -} - diff --git a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp b/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp deleted file mode 100644 index aba637079a9..00000000000 --- a/src/Functions/keyvaluepair/tests/gtest_character_finder.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include - - -namespace DB -{ -void test_find_first( - const CharacterFinder& finder, const std::string_view& haystack, - const std::vector& needles, const std::optional>& expected_result) -{ - auto pos = finder.findFirst(haystack, needles); - - ASSERT_EQ(pos.has_value(), expected_result.has_value()); - - if (expected_result) - { - auto [expected_character, expected_position] = *expected_result; - - ASSERT_EQ(expected_position, *pos); - ASSERT_EQ(expected_character, haystack[*pos]); - } -} - -void test_find_first_not(const CharacterFinder& finder, const std::string_view& haystack, const std::vector& needles, const std::optional>& expected_result) -{ - auto pos = finder.findFirstNot(haystack, needles); - - ASSERT_EQ(pos.has_value(), expected_result.has_value()); - - if (expected_result) - { - auto [expected_character, expected_position] = *expected_result; - - ASSERT_EQ(expected_position, *pos); - ASSERT_EQ(expected_character, haystack[*pos]); - } -} - -TEST(extractKVPair_CharacterFinderTest, FindFirst) -{ - CharacterFinder finder; - - // Test empty haystack - std::string_view empty; - std::vector needles = {'a', 'b', 'c'}; - test_find_first(finder, empty, needles, std::nullopt); - - // Test haystack with no needles - std::string_view no_needles = "hello world"; - std::vector empty_needles = {}; - test_find_first(finder, no_needles, empty_needles, std::nullopt); - - // Test haystack with a single needle - std::string_view single_needle = "hello world"; - std::vector single_needles = {'o'}; - test_find_first(finder, single_needle, single_needles, std::make_optional>('o', 4)); - - // Test haystack with multiple needles - std::string_view multiple_needles = "hello world"; - std::vector all_needles = {'a', 'e', 'i', 'o', 'u'}; - test_find_first(finder, multiple_needles, all_needles, std::make_optional>('e', 1)); - - // Test haystack with special characters - std::string_view special_needle = R"(this=that\other"thing")"; - std::vector special_needles = {'=', '\\', '"'}; - test_find_first(finder, special_needle, special_needles, std::make_optional>('=', 4)); -} - -TEST(extractKVPair_CharacterFinderTest, FindFirstNot) -{ - CharacterFinder finder; - -// Test empty haystack - std::string_view empty; - std::vector needles = {'a', 'b', 'c'}; - test_find_first_not(finder, empty, needles, std::nullopt); - - // Test haystack with no needles - std::string_view no_needles = "hello world"; - std::vector empty_needles = {}; - test_find_first_not(finder, no_needles, empty_needles, std::make_optional>('h', 0)); - - // Test haystack with a single needle - std::string_view single_needle = "hello world"; - std::vector single_needles = {'o'}; - test_find_first_not(finder, single_needle, single_needles, std::make_optional>('h', 0)); - -// Test haystack with multiple needles - std::string_view multiple_needles = "hello world"; - std::vector all_needles = {'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '}; - test_find_first_not(finder, multiple_needles, all_needles, std::nullopt); - - // 17 byte long string, only loop takes place - std::string_view multiple_needles_haystack = "helloworldddddd"; - - test_find_first_not(finder, multiple_needles_haystack, {'h', 'e', 'l', 'o', 'w', 'r', 'd'}, std::nullopt); -} - -} diff --git a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp b/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp deleted file mode 100644 index 8e9595aa273..00000000000 --- a/src/Functions/keyvaluepair/tests/gtest_escaped_sequence_reader.cpp +++ /dev/null @@ -1,71 +0,0 @@ -//#include -//#include - -//namespace DB -//{ - -//void test(std::string_view input, const std::vector & expected_characters, std::size_t expected_bytes_read) -//{ -// auto read_result = extractKVPair_EscapedCharacterReader::read(input); - -// ASSERT_EQ(expected_characters, read_result.characters); - -// auto bytes_read = read_result.ptr - input.begin(); - -// ASSERT_EQ(bytes_read, expected_bytes_read); -//} - -//void test(std::string_view input, const std::vector & expected_characters) -//{ -// return test(input, expected_characters, input.size()); -//} - -//TEST(extractKVPair_EscapedCharacterReader, HexDigits) -//{ -//// test("\\xA", {0xA}); -// test("\\xAA", {0xAA}); -// test("\\xff", {0xFF}); -//// test("\\x0", {0x0}); -// test("\\x00", {0x0}); - -//// test("\\xA$", {0xA}, 3); -// test("\\xAA$", {0xAA}, 4); -// test("\\xff$", {0xFF}, 4); -//// test("\\x0$", {0x0}, 3); -// test("\\x00$", {0x0}, 4); - -// test("\\x", {}); -//} - -//TEST(extractKVPair_EscapedCharacterReader, OctalDigits) -//{ -// test("\\0377", {0xFF}); -// test("\\0137", {0x5F}); -// test("\\013", {0xB}); -// test("\\0000", {0x0}); -// test("\\000", {0x0}); -// test("\\00", {0x0}); - -// test("\\0377$", {0xFF}, 5); -// test("\\0137$", {0x5F}, 5); -// test("\\013$", {0xB}, 4); -// test("\\0000$", {0x0}, 5); -// test("\\000$", {0x0}, 4); -// test("\\00$", {0x0}, 3); -//} - -//TEST(extractKVPair_EscapedCharacterReader, RegularEscapeSequences) -//{ -// test("\\n", {0xA}, 2); -// test("\\r", {0xD}, 2); -// test("\\r", {0xD}, 2); -//} - -//TEST(extractKVPair_EscapedCharacterReader, RandomEscapedCharacters) -//{ -// test("\\h", {'\\', 'h'}); -// test("\\g", {'\\', 'g'}); -// test("\\", {}); -//} - -//} diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index 1be9254519e..11fcb03ad7e 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp new file mode 100644 index 00000000000..1b114a4d1f0 --- /dev/null +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -0,0 +1,137 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace +{ +using namespace DB; +using namespace std::literals; + +// Print as a map with a single row +auto ToColumnMap(const auto & keys, const auto & values, const ColumnPtr offsets = nullptr) +{ + return ColumnMap::create( + std::move(keys->clone()), + std::move(values->clone()), + offsets ? offsets : ColumnUInt64::create(1, keys->size()) + ); +} + +// Print as a map with a single row +std::string PrintMap(const auto & keys, const auto & values) +{ + auto map_column = ToColumnMap(keys, values); + auto serialization = DataTypeFactory::instance().get("Map(String, String)")->getSerialization(ISerialization::Kind::DEFAULT); + + WriteBufferFromOwnString buff; + serialization->serializeTextJSON(*map_column, 0, buff, FormatSettings{}); + + return std::move(buff.str()); +} + +template +struct Dump +{ + const T & value; + + friend std::ostream & operator<<(std::ostream & ostr, const Dump & d) + { + return dumpValue(ostr, d.value); + } +}; + +template +auto print_with_dump(const T & value) +{ + return Dump{value}; +} + +} + +struct KeyValuePairExtractorTestParam +{ + KeyValuePairExtractorBuilder builder; + std::string input; + std::vector> expected; +}; + +struct extractKVPair_KeyValuePairExtractorTest : public ::testing::TestWithParam +{}; + +TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) +{ + const auto & [builder, input, expected] = GetParam(); + SCOPED_TRACE(input); + + auto kv_parser = builder.build(); + SCOPED_TRACE(typeid(kv_parser).name()); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + auto pairs_found = kv_parser->extract(input, keys, values); + ASSERT_EQ(expected.size(), pairs_found) + << "\texpected: " << print_with_dump(expected) << "\n" + << "\tactual : " << print_with_dump(*ToColumnMap(keys, values)); + + size_t i = 0; + for (const auto & expected_kv : expected) + { + EXPECT_EQ(expected_kv.first, keys->getDataAt(i)) + << fancyQuote(expected_kv.first) << "\nvs\n" + << fancyQuote(keys->getDataAt(i)); + + EXPECT_EQ(expected_kv.second, values->getDataAt(i)) + << fancyQuote(expected_kv.second) << "\nvs\n" + << fancyQuote(values->getDataAt(i)); + + ++i; + } +} + +const std::vector> neymar_expected{ + {"name","neymar"}, + {"age","31"}, + {"team","psg"}, + {"nationality","brazil"}, + {"last_key","last_value"} +}; + +INSTANTIATE_TEST_SUITE_P(Simple, extractKVPair_KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list + { + { + KeyValuePairExtractorBuilder().withQuotingCharacter('\''), + R"in(name:'neymar';'age':31;team:psg;nationality:brazil,last_key:last_value)in", + neymar_expected + }, + { + // Different escaping char + KeyValuePairExtractorBuilder().withQuotingCharacter('"'), + R"in(name:"neymar";"age":31;team:psg;nationality:brazil,last_key:last_value)in", + neymar_expected + }, + { + // same as case 1, but with another handler + KeyValuePairExtractorBuilder().withQuotingCharacter('\'').withEscaping(), + R"in(name:'neymar';'age':31;team:psg;nationality:brazil,last_key:last_value)in", + neymar_expected + } + } + ) +); diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index a8f4aaaa35c..b439f772416 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 6eeed4dc7b8..fc8b453106a 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp index c7245c8af27..13b34ec48d3 100644 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp @@ -1,4 +1,4 @@ -//#include +//#include //#include // diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 1bf2d71c128..6a324afb968 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include namespace DB From 73430b8d57bf404693be569c5b1f33636ea67aa3 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Wed, 29 Mar 2023 18:37:44 +0200 Subject: [PATCH 124/535] Minor adjustments --- .../keyvaluepair/impl/InlineEscapingStateHandler.cpp | 3 ++- src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp index 5147bd24b2a..a55e81d1f96 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp @@ -44,6 +44,7 @@ NextState InlineEscapingStateHandler::waitKey(std::string_view file) const const size_t character_position = p - file.begin(); if (*p == quoting_character) { + // +1 to skip quoting character return {character_position + 1u, State::READING_QUOTED_KEY}; } else @@ -63,7 +64,7 @@ NextState InlineEscapingStateHandler::waitKey(std::string_view file) const NextState InlineEscapingStateHandler::readKey(std::string_view file, KeyType & key) const { - const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; key.clear(); diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp index 63d5df45d5d..0f34f780329 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -53,8 +53,7 @@ NextState NoEscapingStateHandler::waitKey(std::string_view file) const NextState NoEscapingStateHandler::readKey(std::string_view file, KeyType & key) const { - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; + const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; key = {}; @@ -156,7 +155,7 @@ NextState NoEscapingStateHandler::waitValue(std::string_view file) const NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & value) const { - const auto & [key_value_delimiter, quoting_character, pair_delimiters] = extractor_configuration; + const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; value = {}; From 4b7005b8b17b261a87785018ace64807483f5072 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Thu, 30 Mar 2023 09:24:41 +0200 Subject: [PATCH 125/535] Changes discussed with Arthur --- src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h | 2 +- .../keyvaluepair/impl/InlineEscapingStateHandler.cpp | 7 +++++-- src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp | 3 --- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index fe022551eb5..0a1bc4fe510 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -76,7 +76,7 @@ public: } data.remove_prefix(next_state.position_in_string); - state = next_state.state; + state = next_state.state; // No state expects empty input if (data.size() == 0) diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp index a55e81d1f96..198d09d2896 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp @@ -190,6 +190,9 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType next_pos = character_position + escape_seq_len; if (escape_seq_len == 0) { + // It is agreed that value with an invalid escape seqence in it + // is considered malformed and shoudn't be included in result. + value.clear(); return {next_pos, State::WAITING_KEY}; } } @@ -211,7 +214,7 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType // Reached end of input, consume rest of the file as value and make sure KV pair is produced. value.insert(value.end(), file.begin() + pos, file.end()); - return {pos, State::FLUSH_PAIR}; + return {file.size(), State::FLUSH_PAIR}; } NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, ValueType & value) const @@ -246,7 +249,7 @@ NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, Val pos = next_pos; } - return {pos, State::END}; + return {file.size(), State::END}; } } diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp index 0f34f780329..68f18ffca83 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -148,9 +148,6 @@ NextState NoEscapingStateHandler::waitValue(std::string_view file) const } return {pos, State::READING_VALUE}; - -// // TODO: can't bre reached, remove it? -// return {file.size(), State::READING_VALUE}; } NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & value) const From 31a8a7b8638d6f8645da9ddb755623981c2bc7d8 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Thu, 30 Mar 2023 09:25:10 +0200 Subject: [PATCH 126/535] Fixed unit-tests --- ...test_escaping_key_value_pair_extractor.cpp | 4 ++ .../tests/gtest_extractKeyValuePairs.cpp | 65 ++++++++++++++++++- ...test_inline_escaping_key_state_handler.cpp | 61 +++++++++-------- ...st_inline_escaping_value_state_handler.cpp | 21 ++++-- .../gtest_no_escaping_key_state_handler.cpp | 44 ++++++++----- 5 files changed, 144 insertions(+), 51 deletions(-) diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index 11fcb03ad7e..91ec1ca74a0 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -1,4 +1,8 @@ #include +#include + +#include + #include #include diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp index 1b114a4d1f0..b259cf1a2ef 100644 --- a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -104,7 +104,8 @@ TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) } } -const std::vector> neymar_expected{ +using ExpectedValues = std::vector>; +const ExpectedValues neymar_expected{ {"name","neymar"}, {"age","31"}, {"team","psg"}, @@ -135,3 +136,65 @@ INSTANTIATE_TEST_SUITE_P(Simple, extractKVPair_KeyValuePairExtractorTest, } ) ); + +// It is agreed that value with an invalid escape seqence in it is considered malformed and shoudn't be included in result. +INSTANTIATE_TEST_SUITE_P(InvalidEscapeSeqInValue, extractKVPair_KeyValuePairExtractorTest, + ::testing::ValuesIn(std::initializer_list + { + { + KeyValuePairExtractorBuilder().withEscaping(), + R"in(valid_key:valid_value key:invalid_val\\ third_key:third_value)in", + ExpectedValues{ + {"valid_key", "valid_value"}, + {"third_key", "third_value"} + } + }, + { + // Special case when invalid seq is the last symbol + KeyValuePairExtractorBuilder().withEscaping(), + R"in(valid_key:valid_value key:invalid_val\\)in", + ExpectedValues{ + {"valid_key", "valid_value"} + } + }, + { + KeyValuePairExtractorBuilder().withEscaping().withQuotingCharacter('"'), + R"in(valid_key:valid_value key:"invalid val\\ " "third key":"third value")in", + ExpectedValues{ + {"valid_key", "valid_value"}, + {"third key", "third value"} + } + }, + // Not handling escape sequences == do not care of broken one, `invalid_val\` must be present + { + KeyValuePairExtractorBuilder(), + R"in(valid_key:valid_value key:invalid_val\ third_key:third_value)in", + ExpectedValues{ + {"valid_key", "valid_value"}, + {"key", "invalid_val\\"}, + {"third_key", "third_value"} + } + }, + { + // Special case when invalid seq is the last symbol + KeyValuePairExtractorBuilder(), + R"in(valid_key:valid_value key:invalid_val\)in", + ExpectedValues{ + {"valid_key", "valid_value"}, + {"key", "invalid_val\\"} + } + }, + { + KeyValuePairExtractorBuilder().withQuotingCharacter('"'), + R"in(valid_key:valid_value key:"invalid val\ " "third key":"third value")in", + ExpectedValues{ + {"valid_key", "valid_value"}, + {"key", "invalid val\\ "}, + {"third key", "third value"}, + } + }, + } + ) +); + + diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index b439f772416..c812aac9985 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,19 +1,28 @@ #include #include -namespace DB +#include +#include + +namespace { -void test_wait(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::size_t expected_pos, State expected_state) +using namespace DB; +using namespace DB::extractKV; + +using State = extractKV::StateHandler::State; +using NextState = extractKV::StateHandler::NextState; + +void test_wait(const InlineEscapingStateHandler & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input); + auto next_state = handler.waitKey(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); } template -void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { NextState next_state; @@ -21,11 +30,11 @@ void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view i if constexpr (quoted) { - next_state = handler.readQuoted(input, element); + next_state = handler.readQuotedKey(input, element); } else { - next_state = handler.read(input, element); + next_state = handler.readKey(input, element); } ASSERT_EQ(next_state.position_in_string, expected_pos); @@ -33,32 +42,34 @@ void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view i ASSERT_EQ(element, expected_element); } -void test_read(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); } -void test_read_quoted(const InlineEscapingKeyStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read_quoted(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); } +} + TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingKeyStateHandler handler(configuration); + InlineEscapingStateHandler handler(configuration); - test_wait(handler, "name", 0u, READING_KEY); - test_wait(handler, "\\:name", 2u, READING_KEY); - test_wait(handler, R"(\\"name)", 3u, READING_QUOTED_KEY); + test_wait(handler, "name", 0u, State::READING_KEY); + test_wait(handler, "\\:name", 2u, State::READING_KEY); + test_wait(handler, R"(\\"name)", 3u, State::READING_QUOTED_KEY); - test_wait(handler, "", 0u, END); - test_wait(handler, "\\\\", 2u, END); + test_wait(handler, "", 0u, State::END); + test_wait(handler, "\\\\", 2u, State::END); } TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) @@ -67,7 +78,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingKeyStateHandler handler(configuration); + InlineEscapingStateHandler handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; @@ -75,15 +86,15 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) std::string key_with_delimiter_and_random_characters_str = key_str + ':' + "a$a\\:''\""; // no delimiter, should discard - test_read(handler, key_str, "", key_str.size(), END); + test_read(handler, key_str, "", key_str.size(), State::END); // valid - test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), State::WAITING_VALUE); // valid as well - test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), State::WAITING_VALUE); - test_read(handler, "", "", 0u, END); + test_read(handler, "", "", 0u, State::END); } TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) @@ -92,7 +103,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingKeyStateHandler handler(configuration); + InlineEscapingStateHandler handler(configuration); std::string regular_key = "name"; std::string regular_key_with_end_quote = regular_key + "\""; @@ -101,10 +112,8 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) std::string key_with_escape_character = regular_key + R"(\n\x4E")"; - test_read_quoted(handler, regular_key, "", regular_key.size(), END); - test_read_quoted(handler, regular_key_with_end_quote, regular_key, regular_key_with_end_quote.size(), READING_KV_DELIMITER); - test_read_quoted(handler, key_with_special_characters_with_end_quote, key_with_special_characters, key_with_special_characters_with_end_quote.size(), READING_KV_DELIMITER); - test_read_quoted(handler, key_with_escape_character, regular_key + "\nN", key_with_escape_character.size(), READING_KV_DELIMITER); -} - + test_read_quoted(handler, regular_key, "", regular_key.size(), State::END); + test_read_quoted(handler, regular_key_with_end_quote, regular_key, regular_key_with_end_quote.size(), State::READING_KV_DELIMITER); + test_read_quoted(handler, key_with_special_characters_with_end_quote, key_with_special_characters, key_with_special_characters_with_end_quote.size(), State::READING_KV_DELIMITER); + test_read_quoted(handler, key_with_escape_character, regular_key + "\nN", key_with_escape_character.size(), State::READING_KV_DELIMITER); } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index fc8b453106a..53382de320d 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -1,25 +1,34 @@ #include + +#include #include -namespace DB +namespace { +using namespace DB; +using namespace DB::extractKV; + +using State = extractKV::StateHandler::State; +using NextState = extractKV::StateHandler::NextState; + + void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input); + auto next_state = handler.waitValue(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); } +} + TEST(extractKVPair_InlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingValueStateHandler handler(configuration); - - test_wait(handler, " los$ yours3lf", 0u, READING_VALUE); -} + InlineEscapingStateHandler handler(configuration); + test_wait(handler, " los$ yours3lf", 0u, State::READING_VALUE); } diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 6a324afb968..75cf3371393 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -1,12 +1,19 @@ -#include +#include +#include + #include -namespace DB +namespace { +using namespace DB; +using namespace DB::extractKV; + +using State = extractKV::StateHandler::State; +using NextState = extractKV::StateHandler::NextState; void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) { - auto next_state = handler.wait(input); + auto next_state = handler.waitKey(input); ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); @@ -21,11 +28,11 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex if constexpr (quoted) { - next_state = handler.readQuoted(input, element); + next_state = handler.readQuotedKey(input, element); } else { - next_state = handler.read(input, element); + next_state = handler.readKey(input, element); } ASSERT_EQ(next_state.position_in_string, expected_pos); @@ -45,23 +52,25 @@ void test_read_quoted(const auto & handler, std::string_view input, std::string_ test_read(handler, input, expected_element, expected_pos, expected_state); } +} + TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - NoEscapingKeyStateHandler handler(configuration); + NoEscapingStateHandler handler(configuration); - test_wait(handler, "name", 0u, READING_KEY); - test_wait(handler, "\\:name", 0u, READING_KEY); + test_wait(handler, "name", 0u, State::READING_KEY); + test_wait(handler, "\\:name", 0u, State::READING_KEY); // quoted expected pos is + 1 because as of now it is skipped, maybe I should change it - test_wait(handler, "\"name", 1u, READING_QUOTED_KEY); + test_wait(handler, "\"name", 1u, State::READING_QUOTED_KEY); - test_wait(handler, ", $name", 3u, READING_KEY); - test_wait(handler, ", $\"name", 4u, READING_QUOTED_KEY); + test_wait(handler, ", $name", 3u, State::READING_KEY); + test_wait(handler, ", $\"name", 4u, State::READING_QUOTED_KEY); - test_wait(handler, "", 0u, END); + test_wait(handler, "", 0u, State::END); } TEST(extractKVPair_NoEscapingKeyStateHandler, Read) @@ -70,7 +79,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - NoEscapingKeyStateHandler handler(configuration); + NoEscapingStateHandler handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; @@ -78,15 +87,14 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Read) std::string key_with_delimiter_and_random_characters_str = key_str + ':' + "a$a\\:''\""; // no delimiter, should discard - test_read(handler, key_str, "", key_str.size(), END); + test_read(handler, key_str, "", key_str.size(), State::END); // valid - test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + test_read(handler, key_with_delimiter_str, key_str, key_with_delimiter_str.size(), State::WAITING_VALUE); // valid as well - test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), WAITING_VALUE); + test_read(handler, key_with_delimiter_and_random_characters_str, key_str, key_with_delimiter_str.size(), State::WAITING_VALUE); - test_read(handler, "", "", 0u, END); + test_read(handler, "", "", 0u, State::END); } -} From 89ebe61de851ee4993b823fc092eb621f40fd41a Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Thu, 30 Mar 2023 15:21:22 +0200 Subject: [PATCH 127/535] Implemented writing to ColumnString directly via StringWriter --- .../impl/CHKeyValuePairExtractor.h | 47 +++++----- .../impl/InlineEscapingStateHandler.cpp | 48 +++++----- .../impl/InlineEscapingStateHandler.h | 11 +-- .../impl/NoEscapingStateHandler.cpp | 40 ++++----- .../impl/NoEscapingStateHandler.h | 11 +-- .../keyvaluepair/impl/StateHandler.h | 88 +++++++++++++++++-- ...test_escaping_key_value_pair_extractor.cpp | 4 +- .../tests/gtest_extractKeyValuePairs.cpp | 4 +- ...test_inline_escaping_key_state_handler.cpp | 8 +- .../gtest_no_escaping_key_state_handler.cpp | 8 +- 10 files changed, 169 insertions(+), 100 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index 0a1bc4fe510..aa9e421c901 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -7,6 +7,7 @@ #include #include +// TODO: debug stuff, remove it before merging #include #include @@ -16,9 +17,6 @@ namespace DB template class CHKeyValuePairExtractor : public KeyValuePairExtractor { - using Key = typename StateHandler::KeyType; - using Value = typename StateHandler::ValueType; - using State = typename DB::extractKV::StateHandler::State; using NextState = DB::extractKV::StateHandler::NextState; @@ -37,8 +35,8 @@ public: // std::cerr << "CHKeyValuePairExtractor::extract: \"" << data << "\"" << std::endl; auto state = State::WAITING_KEY; - Key key; - Value value; + extractKV::StringWriter key(*keys); + extractKV::StringWriter value(*values); uint64_t row_offset = 0; const auto & config = state_handler.extractor_configuration; @@ -59,7 +57,7 @@ public: << fancyQuote(data) << std::endl; - next_state = processState(data, state, key, value, keys, values, row_offset); + next_state = processState(data, state, key, value, row_offset); std::cerr << "CHKeyValuePairExtractor::extract 2, new_state: " << magic_enum::enum_name(next_state.state) @@ -83,18 +81,21 @@ public: break; } + // TODO (vnemkov): consider removing, we should reach FLUSH_PAIR state from state machine. // if break occured earlier, consume previously generated pair - if (state == State::FLUSH_PAIR || !(key.empty() && value.empty())) - flushPair(data, key, value, keys, values, row_offset); + if (state == State::FLUSH_PAIR || !(key.isEmpty() && value.isEmpty())) + flushPair(data, key, value, row_offset); + + keys->validate(); + values->validate(); return row_offset; } private: - NextState processState(std::string_view file, State state, Key & key, - Value & value, ColumnString::MutablePtr & keys, - ColumnString::MutablePtr & values, uint64_t & row_offset) + NextState processState(std::string_view file, State state, extractKV::StringWriter & key, + extractKV::StringWriter & value, uint64_t & row_offset) { switch (state) { @@ -103,13 +104,13 @@ private: case State::READING_KEY: { auto result = state_handler.readKey(file, key); - std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; + std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key.uncommittedChunk()) << std::endl; return result; } case State::READING_QUOTED_KEY: { auto result = state_handler.readQuotedKey(file, key); - std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key) << std::endl; + std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key.uncommittedChunk()) << std::endl; return result; } case State::READING_KV_DELIMITER: @@ -121,33 +122,29 @@ private: case State::READING_VALUE: { auto result = state_handler.readValue(file, value); - std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; + std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value.uncommittedChunk()) << std::endl; return result; } case State::READING_QUOTED_VALUE: { auto result = state_handler.readQuotedValue(file, value); - std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value) << std::endl; + std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value.uncommittedChunk()) << std::endl; return result; } case State::FLUSH_PAIR: - return flushPair(file, key, value, keys, values, row_offset); + return flushPair(file, key, value, row_offset); case State::END: return {0, state}; } } - NextState flushPair(const std::string_view & file, Key & key, - Value & value, ColumnString::MutablePtr & keys, - ColumnString::MutablePtr & values, uint64_t & row_offset) + NextState flushPair(const std::string_view & file, extractKV::StringWriter & key, + extractKV::StringWriter & value, uint64_t & row_offset) { - std::cerr << "CHKeyValuePairExtractor::flushPair key: " << fancyQuote(key) << ", value: " << fancyQuote(value) << std::endl; - keys->insertData(key.data(), key.size()); - values->insertData(value.data(), value.size()); - - key = {}; - value = {}; + std::cerr << "CHKeyValuePairExtractor::flushPair key: " << fancyQuote(key.uncommittedChunk()) << ", value: " << fancyQuote(value.uncommittedChunk()) << std::endl; + key.commit(); + value.commit(); ++row_offset; std::cerr << "CHKeyValuePairExtractor::flushPair total pairs: " << row_offset << std::endl; diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp index 198d09d2896..06daf780378 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp @@ -7,12 +7,15 @@ namespace { -size_t consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, std::string & output) +size_t consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) { - output.insert(output.end(), file.begin() + start_pos, file.begin() + character_pos); + output.append(file.begin() + start_pos, file.begin() + character_pos); + std::string tmp_out; DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); - DB::parseComplexEscapeSequence(output, buf); + + DB::parseComplexEscapeSequence(tmp_out, buf); + output.append(tmp_out); return buf.getPosition(); } @@ -62,11 +65,11 @@ NextState InlineEscapingStateHandler::waitKey(std::string_view file) const * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm * */ -NextState InlineEscapingStateHandler::readKey(std::string_view file, KeyType & key) const +NextState InlineEscapingStateHandler::readKey(std::string_view file, StringWriter & key) const { const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - key.clear(); + key.reset(); size_t pos = 0; while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) @@ -83,9 +86,10 @@ NextState InlineEscapingStateHandler::readKey(std::string_view file, KeyType & k return {next_pos, State::WAITING_KEY}; } } - else if (*p == key_value_delimiter) + else + if (*p == key_value_delimiter) { - key.insert(key.end(), file.begin() + pos, file.begin() + character_position); + key.append(file.begin() + pos, file.begin() + character_position); return {next_pos, State::WAITING_VALUE}; } @@ -102,11 +106,11 @@ NextState InlineEscapingStateHandler::readKey(std::string_view file, KeyType & k return {file.size(), State::END}; } -NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, KeyType & key) const +NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, StringWriter & key) const { const auto quoting_character = extractor_configuration.quoting_character; - key.clear(); + key.reset(); size_t pos = 0; while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) @@ -126,9 +130,9 @@ NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, KeyTy } else if (*p == quoting_character) { - key.insert(key.end(), file.begin() + pos, file.begin() + character_position); + key.append(file.begin() + pos, file.begin() + character_position); - if (key.empty()) + if (key.isEmpty()) { return {next_pos, State::WAITING_KEY}; } @@ -172,11 +176,11 @@ NextState InlineEscapingStateHandler::waitValue(std::string_view file) const return {pos, State::READING_VALUE}; } -NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType & value) const +NextState InlineEscapingStateHandler::readValue(std::string_view file, StringWriter & value) const { const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - value.clear(); + value.reset(); size_t pos = 0; while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) @@ -192,11 +196,12 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType { // It is agreed that value with an invalid escape seqence in it // is considered malformed and shoudn't be included in result. - value.clear(); + value.reset(); return {next_pos, State::WAITING_KEY}; } } - else if (*p == key_value_delimiter) + else + if (*p == key_value_delimiter) { // reached new key return {next_pos, State::WAITING_KEY}; @@ -204,7 +209,7 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) { // reached next pair - value.insert(value.end(), file.begin() + pos, file.begin() + character_position); + value.append(file.begin() + pos, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; } @@ -213,17 +218,17 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, ValueType } // Reached end of input, consume rest of the file as value and make sure KV pair is produced. - value.insert(value.end(), file.begin() + pos, file.end()); + value.append(file.begin() + pos, file.end()); return {file.size(), State::FLUSH_PAIR}; } -NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, ValueType & value) const +NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, StringWriter & value) const { const auto quoting_character = extractor_configuration.quoting_character; size_t pos = 0; - value.clear(); + value.reset(); while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) { @@ -239,9 +244,10 @@ NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, Val return {next_pos, State::WAITING_KEY}; } } - else if (*p == quoting_character) + else + if (*p == quoting_character) { - value.insert(value.end(), file.begin() + pos, file.begin() + character_position); + value.append(file.begin() + pos, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; } diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h index 120d2f3d95b..2d532a4938d 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h @@ -16,18 +16,15 @@ namespace extractKV class InlineEscapingStateHandler : public StateHandler { public: - using KeyType = std::string; - using ValueType = std::string; - explicit InlineEscapingStateHandler(Configuration configuration_); [[nodiscard]] NextState waitKey(std::string_view file) const; - [[nodiscard]] NextState readKey(std::string_view file, KeyType & key) const; - [[nodiscard]] NextState readQuotedKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const; + [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const; [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; [[nodiscard]] NextState waitValue(std::string_view file) const; - [[nodiscard]] NextState readValue(std::string_view file, ValueType & value) const; - [[nodiscard]] NextState readQuotedValue(std::string_view file, ValueType & value) const; + [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const; + [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const; const Configuration extractor_configuration; diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp index 68f18ffca83..e3715bb1bca 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -3,15 +3,11 @@ #include #include +#include "Functions/keyvaluepair/impl/StateHandler.h" namespace { -std::string_view createElement(std::string_view file, std::size_t begin, std::size_t end) -{ - return std::string_view{file.begin() + begin, file.begin() + end}; -} - using NextState = DB::extractKV::StateHandler::NextState; } @@ -51,11 +47,11 @@ NextState NoEscapingStateHandler::waitKey(std::string_view file) const return {file.size(), State::END}; } -NextState NoEscapingStateHandler::readKey(std::string_view file, KeyType & key) const +NextState NoEscapingStateHandler::readKey(std::string_view file, StringWriter & key) const { const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - key = {}; + key.reset(); size_t pos = 0; auto start_index = pos; @@ -67,9 +63,9 @@ NextState NoEscapingStateHandler::readKey(std::string_view file, KeyType & key) if (*p == key_value_delimiter) { - key = createElement(file, start_index, character_position); + key.append(file.begin() + start_index, file.begin() + character_position); - if (key.empty()) + if (key.isEmpty()) { return {next_pos, State::WAITING_KEY}; } @@ -88,25 +84,25 @@ NextState NoEscapingStateHandler::readKey(std::string_view file, KeyType & key) return {file.size(), State::END}; } -NextState NoEscapingStateHandler::readQuotedKey(std::string_view file, KeyType & key) const +NextState NoEscapingStateHandler::readQuotedKey(std::string_view file, StringWriter & key) const { const auto quoting_character = extractor_configuration.quoting_character; - key = {}; + key.reset(); size_t pos = 0; auto start_index = pos; while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) { - const size_t character_position = p - file.begin(); - auto next_pos = character_position + 1u; + size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; if (*p == quoting_character) { - key = createElement(file, start_index, character_position); + key.append(file.begin() + start_index, file.begin() + character_position); - if (key.empty()) + if (key.isEmpty()) { return {next_pos, State::WAITING_KEY}; } @@ -150,11 +146,11 @@ NextState NoEscapingStateHandler::waitValue(std::string_view file) const return {pos, State::READING_VALUE}; } -NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & value) const +NextState NoEscapingStateHandler::readValue(std::string_view file, StringWriter & value) const { const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - value = {}; + value.reset(); size_t pos = 0; auto start_index = pos; @@ -170,7 +166,7 @@ NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & v else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) { // reached next pair - value = createElement(file, start_index, character_position); + value.append(file.begin() + start_index, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; } @@ -180,18 +176,18 @@ NextState NoEscapingStateHandler::readValue(std::string_view file, ValueType & v // TODO: do I really need the below logic? // this allows empty values at the end - value = createElement(file, start_index, file.size()); + value.append(file.begin() + start_index, file.end()); return {file.size(), State::FLUSH_PAIR}; } -NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, ValueType & value) const +NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, StringWriter & value) const { const auto quoting_character = extractor_configuration.quoting_character; size_t pos = 0; auto start_index = pos; - value = {}; + value.reset(); while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) { @@ -200,7 +196,7 @@ NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, ValueTy if (*p == quoting_character) { - value = createElement(file, start_index, character_position); + value.append(file.begin() + start_index, file.begin() + character_position); std::cerr << "NoEscapingStateHandler::readQuoted Going to consume up to: «" << fancyQuote(file.substr(0, next_pos)) << " to " << fancyQuote(file.substr(next_pos)) << std::endl; return {next_pos, State::FLUSH_PAIR}; diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h index e547a503530..fa426939d7e 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h @@ -16,18 +16,15 @@ namespace extractKV class NoEscapingStateHandler : public StateHandler { public: - using KeyType = std::string_view; - using ValueType = std::string_view; - explicit NoEscapingStateHandler(Configuration extractor_configuration_); [[nodiscard]] NextState waitKey(std::string_view file) const; - [[nodiscard]] NextState readKey(std::string_view file, KeyType & key) const; - [[nodiscard]] NextState readQuotedKey(std::string_view file, KeyType & key) const; + [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const; + [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const; [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; [[nodiscard]] NextState waitValue(std::string_view file) const; - [[nodiscard]] NextState readValue(std::string_view file, ValueType & value) const; - [[nodiscard]] NextState readQuotedValue(std::string_view file, ValueType & value) const; + [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const; + [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const; const Configuration extractor_configuration; diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h index 362e2d9618f..6feb1977c73 100644 --- a/src/Functions/keyvaluepair/impl/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -46,11 +48,75 @@ public: virtual ~StateHandler() = default; }; + +class StringWriter +{ + ColumnString & col; + ColumnString::Chars & chars; + UInt64 prev_commit_pos = 0; + +public: + StringWriter(ColumnString & col_) + : col(col_), + chars(col.getChars()) + {} + + ~StringWriter() + { + // Make sure that ColumnString invariants are not broken. + if (!isEmpty()) + reset(); + } + + void append(std::string_view new_data) + { + chars.insert(new_data.begin(), new_data.end()); + } + + template + void append(const T * begin, const T * end) + { + chars.insert(begin, end); + } + + void reset() + { + chars.resize_assume_reserved(prev_commit_pos); + } + + bool isEmpty() const + { + return chars.size() == prev_commit_pos; + } + + void commit() + { + if (isEmpty()) + return; + + chars.push_back('\0'); + std::cerr << "Committing on " << &col << " prev_commit_pos: " << prev_commit_pos << " new offset: " << chars.size() << " there will be " << col.getOffsets().size() + 1 << " rows" << std::endl; + col.getOffsets().emplace_back(chars.size()); + prev_commit_pos = chars.size(); + } + + std::string_view uncommittedChunk() const + { + return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); + } + +// const ColumnString & data() const +// { +// return col; +// } +}; + + } // TODO(vnemkov): Debug stuff, remove before merging -template +template struct CustomQuoted { const char * start_quote = "\""; @@ -59,31 +125,35 @@ struct CustomQuoted const T & value; }; -template -CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) +template +CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) { assert(start_quote != nullptr); - return CustomQuoted{ + return CustomQuoted{ .start_quote = start_quote, .end_quote = end_quote ? end_quote : start_quote, .value = value }; } -template -CustomQuoted fancyQuote(const T & value) +inline auto fancyQuote(const std::string_view & value) { - return CustomQuoted{ + return CustomQuoted{ .start_quote = "«", .end_quote = "»", .value = value }; } -template -std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) +template +std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) { + if constexpr (prepend_length) + { + ostr << "(" << val.value.length() << ") "; + } + return ostr << val.start_quote << val.value << val.end_quote; } diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index 91ec1ca74a0..784a259b3dc 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -30,8 +30,8 @@ TEST(extractKVPair_EscapingKeyValuePairExtractor, EscapeSequences) ASSERT_EQ(keys->size(), pairs_count); ASSERT_EQ(keys->size(), values->size()); - ASSERT_EQ(keys->getDataAt(0), "key1"); - ASSERT_EQ(keys->getDataAt(1), "key2"); + ASSERT_EQ(keys->getDataAt(0).toView(), "key1"); + ASSERT_EQ(keys->getDataAt(1).toView(), "key2"); assert_byte_equality(values->getDataAt(0), {0xFF}); assert_byte_equality(values->getDataAt(1), {0xA, 0x9, 0xD}); diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp index b259cf1a2ef..ab06fb6e90f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -94,11 +94,11 @@ TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) { EXPECT_EQ(expected_kv.first, keys->getDataAt(i)) << fancyQuote(expected_kv.first) << "\nvs\n" - << fancyQuote(keys->getDataAt(i)); + << fancyQuote(keys->getDataAt(i).toView()); EXPECT_EQ(expected_kv.second, values->getDataAt(i)) << fancyQuote(expected_kv.second) << "\nvs\n" - << fancyQuote(values->getDataAt(i)); + << fancyQuote(values->getDataAt(i).toView()); ++i; } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index c812aac9985..3a93079b92c 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,5 +1,6 @@ #include -#include +#include + #include #include @@ -25,8 +26,9 @@ template void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { + auto str = ColumnString::create(); NextState next_state; - std::string element; + StringWriter element(*str); if constexpr (quoted) { @@ -39,7 +41,7 @@ void test_read(const InlineEscapingStateHandler & handler, std::string_view inpu ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); - ASSERT_EQ(element, expected_element); + ASSERT_EQ(element.uncommittedChunk(), expected_element); } void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 75cf3371393..b162982e9bb 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -1,6 +1,8 @@ #include #include +#include + #include namespace @@ -24,7 +26,9 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex std::size_t expected_pos, State expected_state) { NextState next_state; - std::string_view element; + + auto col = ColumnString::create(); + StringWriter element(*col); if constexpr (quoted) { @@ -37,7 +41,7 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex ASSERT_EQ(next_state.position_in_string, expected_pos); ASSERT_EQ(next_state.state, expected_state); - ASSERT_EQ(element, expected_element); + ASSERT_EQ(element.uncommittedChunk(), expected_element); } void test_read(const auto & handler, std::string_view input, std::string_view expected_element, From 5a2587af87ea3d88441dc3d24ca27c2687f135f0 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Thu, 30 Mar 2023 15:54:25 +0000 Subject: [PATCH 128/535] fix cast from Map to named Tuple --- src/Functions/FunctionsConversion.h | 11 ++++++++++- .../0_stateless/02179_map_cast_to_array.reference | 1 + tests/queries/0_stateless/02179_map_cast_to_array.sql | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Functions/FunctionsConversion.h b/src/Functions/FunctionsConversion.h index f832bf404a8..0b8c433cbaa 100644 --- a/src/Functions/FunctionsConversion.h +++ b/src/Functions/FunctionsConversion.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -3097,12 +3098,20 @@ private: return &ConvertImplGenericFromString::execute; } + DataTypePtr from_type_holder; const auto * from_type = checkAndGetDataType(from_type_untyped.get()); const auto * from_type_map = checkAndGetDataType(from_type_untyped.get()); /// Convert from Map if (from_type_map) - from_type = checkAndGetDataType(from_type_map->getNestedType().get()); + { + /// Recreate array of unnamed tuples because otherwise it may work + /// unexpectedly while converting to array of named tuples. + const auto & from_array = assert_cast(*from_type_map->getNestedType()); + const auto & from_tuple = assert_cast(*from_array.getNestedType()); + from_type_holder = std::make_shared(std::make_shared(from_tuple.getElements())); + from_type = assert_cast(from_type_holder.get()); + } if (!from_type) { diff --git a/tests/queries/0_stateless/02179_map_cast_to_array.reference b/tests/queries/0_stateless/02179_map_cast_to_array.reference index c1870e78bb7..81bb9fba537 100644 --- a/tests/queries/0_stateless/02179_map_cast_to_array.reference +++ b/tests/queries/0_stateless/02179_map_cast_to_array.reference @@ -6,3 +6,4 @@ {1:{1:'1234'}} [(1,{1:1234})] [(1,{1:1234})] {1:{1:'1234'}} [(1,[(1,'1234')])] [(1,[(1,'1234')])] {1:{1:'1234'}} [(1,[(1,1234)])] [(1,[(1,1234)])] +[(1,'val1'),(2,'val2')] Array(Tuple(k UInt32, v String)) diff --git a/tests/queries/0_stateless/02179_map_cast_to_array.sql b/tests/queries/0_stateless/02179_map_cast_to_array.sql index b1320d7a43c..25b090c10b7 100644 --- a/tests/queries/0_stateless/02179_map_cast_to_array.sql +++ b/tests/queries/0_stateless/02179_map_cast_to_array.sql @@ -24,3 +24,6 @@ SELECT value, cast(value, type), cast(materialize(value), type); WITH map(1, map(1, '1234')) as value, 'Array(Tuple(UInt64, Array(Tuple(UInt64, UInt64))))' AS type SELECT value, cast(value, type), cast(materialize(value), type); + +WITH map(1, 'val1', 2, 'val2') AS map +SELECT CAST(map, 'Array(Tuple(k UInt32, v String))') AS c, toTypeName(c); From 4912de441a070c1baf20eda5a278dfdbb7909cf3 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Thu, 30 Mar 2023 18:27:22 +0000 Subject: [PATCH 129/535] add tests and documentation --- src/Functions/FunctionsConversion.h | 1 - .../array/FunctionsMapMiscellaneous.cpp | 105 +++++++++++++++--- .../0_stateless/02169_map_functions.reference | 49 ++++++++ .../0_stateless/02169_map_functions.sql | 13 +++ 4 files changed, 152 insertions(+), 16 deletions(-) diff --git a/src/Functions/FunctionsConversion.h b/src/Functions/FunctionsConversion.h index 0b8c433cbaa..b2d48beb7b8 100644 --- a/src/Functions/FunctionsConversion.h +++ b/src/Functions/FunctionsConversion.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index f32ad8bc1d1..169859d1716 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -46,7 +46,6 @@ public: void getLambdaArgumentTypes(DataTypes & arguments) const override { - auto nested_arguments = arguments; Adapter::extractNestedTypes(arguments); impl.getLambdaArgumentTypes(arguments); } @@ -256,7 +255,6 @@ struct MapKeyLikeAdapter const auto & pattern_arg = arguments[1]; ColumnPtr function_column; - DataTypePtr return_type = std::make_shared(); DataTypes argument_types{map_type.getKeyType(), map_type.getValueType()}; auto function_type = std::make_shared(argument_types, return_type); @@ -330,19 +328,96 @@ using FunctionMapPartialReverseSort = FunctionMapToArrayAdapter(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); - factory.registerFunction(); + factory.registerFunction( + { + "The same as arrayConcat.", + Documentation::Examples{{"mapConcat", "SELECT mapConcat(map('k1', 'v1'), map('k2', 'v2'))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "Returns an array with the keys of map.", + Documentation::Examples{{"mapKeys", "SELECT mapKeys(map('k1', 'v1', 'k2', 'v2'))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "Returns an array with the values of map.", + Documentation::Examples{{"mapValues", "SELECT mapValues(map('k1', 'v1', 'k2', 'v2'))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "Checks whether the map has the specified key.", + Documentation::Examples{{"mapContains", "SELECT mapContains(map('k1', 'v1', 'k2', 'v2'), 'k1')"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayFilter.", + Documentation::Examples{{"mapFilter", "SELECT mapFilter((k, v) -> v > 1, map('k1', 1, 'k2', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayMap.", + Documentation::Examples{{"mapApply", "SELECT mapApply((k, v) -> (k, v * 2), map('k1', 1, 'k2', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayExists.", + Documentation::Examples{{"mapExists", "SELECT mapExists((k, v) -> v = 1, map('k1', 1, 'k2', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arraySort.", + Documentation::Examples{{"mapSort", "SELECT mapSort((k, v) -> v, map('k1', 3, 'k2', 1, 'k3', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayReverseSort.", + Documentation::Examples{{"mapReverseSort", "SELECT mapReverseSort((k, v) -> v, map('k1', 3, 'k2', 1, 'k3', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayReverseSort.", + Documentation::Examples{{"mapPartialSort", "SELECT mapPartialSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "The same as arrayPartialReverseSort.", + Documentation::Examples{{"mapPartialReverseSort", "SELECT mapPartialReverseSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2))"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "Checks whether map contains key LIKE specified pattern.", + Documentation::Examples{{"mapContainsKeyLike", "SELECT mapContainsKeyLike(map('k1-1', 1, 'k2-1', 2), 'k1%')"}}, + Documentation::Categories{"Map"}, + }); + + factory.registerFunction( + { + "Returns a map with elements which key matches the specified pattern.", + Documentation::Examples{{"mapExtractKeyLike", "SELECT mapExtractKeyLike(map('k1-1', 1, 'k2-1', 2), 'k1%')"}}, + Documentation::Categories{"Map"}, + }); } } diff --git a/tests/queries/0_stateless/02169_map_functions.reference b/tests/queries/0_stateless/02169_map_functions.reference index 160aebbc852..cee8bd3529f 100644 --- a/tests/queries/0_stateless/02169_map_functions.reference +++ b/tests/queries/0_stateless/02169_map_functions.reference @@ -26,6 +26,55 @@ {} {} {} +{'key3':100,'key2':101,'key4':102,'key5':500,'key6':600} +{'key3':101,'key2':102,'key4':103,'key5':500,'key6':600} +{'key3':102,'key2':103,'key4':104,'key5':500,'key6':600} +{'key3':103,'key2':104,'key4':105,'key5':500,'key6':600} +{'key1':1111,'key2':2222,'key5':500,'key6':600} +{'key1':1112,'key2':2224,'key5':500,'key6':600} +{'key1':1113,'key2':2226,'key5':500,'key6':600} +{'key3':100,'key2':101,'key4':102,'key5':500,'key6':600} +{'key3':101,'key2':102,'key4':103,'key5':500,'key6':600} +{'key3':102,'key2':103,'key4':104,'key5':500,'key6':600} +{'key3':103,'key2':104,'key4':105,'key5':500,'key6':600} +{'key1':1111,'key2':2222,'key5':500,'key6':600} +{'key1':1112,'key2':2224,'key5':500,'key6':600} +{'key1':1113,'key2':2226,'key5':500,'key6':600} +1 +1 +1 +1 +0 +0 +0 +1 +1 +1 +1 +0 +0 +0 +{'key2':101,'key3':100,'key4':102} +{'key2':102,'key3':101,'key4':103} +{'key2':103,'key3':102,'key4':104} +{'key2':104,'key3':103,'key4':105} +{'key1':1111,'key2':2222} +{'key1':1112,'key2':2224} +{'key1':1113,'key2':2226} +{'key3':100,'key2':101,'key4':102} +{'key3':101,'key2':102,'key4':103} +{'key3':102,'key2':103,'key4':104} +{'key3':103,'key2':104,'key4':105} +{'key1':1111,'key2':2222} +{'key1':1112,'key2':2224} +{'key1':1113,'key2':2226} +{'key2':101,'key3':100,'key4':102} +{'key2':102,'key3':101,'key4':103} +{'key2':103,'key3':102,'key4':104} +{'key2':104,'key3':103,'key4':105} +{'key1':1111,'key2':2222} +{'key1':1112,'key2':2224} +{'key1':1113,'key2':2226} {3:2,1:0,2:0} {1:2,2:3} {1:2,2:3} diff --git a/tests/queries/0_stateless/02169_map_functions.sql b/tests/queries/0_stateless/02169_map_functions.sql index 80025314fa2..4159a62c8aa 100644 --- a/tests/queries/0_stateless/02169_map_functions.sql +++ b/tests/queries/0_stateless/02169_map_functions.sql @@ -9,6 +9,16 @@ SELECT mapApply((k, v) -> (k, v + 1), col) FROM table_map ORDER BY id; SELECT mapFilter((k, v) -> 0, col) from table_map; SELECT mapApply((k, v) -> tuple(v + 9223372036854775806), col) FROM table_map; -- { serverError BAD_ARGUMENTS } +SELECT mapConcat(col, map('key5', 500), map('key6', 600)) FROM table_map ORDER BY id; +SELECT mapConcat(col, materialize(map('key5', 500)), map('key6', 600)) FROM table_map ORDER BY id; + +SELECT mapExists((k, v) -> k LIKE '%3', col) FROM table_map ORDER BY id; +SELECT mapExists((k, v) -> k LIKE '%2' AND v < 1000, col) FROM table_map ORDER BY id; + +SELECT mapSort(col) FROM table_map ORDER BY id; +SELECT mapSort((k, v) -> v, col) FROM table_map ORDER BY id; +SELECT mapPartialSort((k, v) -> k, 2, col) FROM table_map ORDER BY id; + SELECT mapUpdate(map(1, 3, 3, 2), map(1, 0, 2, 0)); SELECT mapApply((x, y) -> (x, x + 1), map(1, 0, 2, 0)); SELECT mapApply((x, y) -> (x, x + 1), materialize(map(1, 0, 2, 0))); @@ -33,6 +43,9 @@ SELECT mapFilter((x, y) -> (x, x + 1)); -- { serverError ILLEGAL_TYPE_OF_ARGUMEN SELECT mapFilter(map(1, 0, 2, 0), (x, y) -> (x > 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } SELECT mapFilter((x, y) -> (x, x + 1), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +SELECT mapConcat([1, 2], map(1, 2)); -- { serverError NO_COMMON_TYPE } +SELECT mapSort(map(1, 2), map(3, 4)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } + SELECT mapUpdate(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } SELECT mapUpdate(map(1, 3, 3, 2), map(1, 0, 2, 0), map(1, 0, 2, 0)); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } From 39b9d003734af9ccfec690fc99b88a8a43eea75b Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Thu, 30 Mar 2023 18:56:40 +0000 Subject: [PATCH 130/535] fix tests --- .../array/FunctionsMapMiscellaneous.cpp | 20 ++++++++++++------- ...2030_function_mapContainsKeyLike.reference | 4 ++++ .../02030_function_mapContainsKeyLike.sql | 6 ++++++ ...new_functions_must_be_documented.reference | 7 ------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index 169859d1716..c26660fabb0 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -198,6 +198,7 @@ public: String getName() const override { return "mapKeyLike"; } size_t getNumberOfArguments() const override { return 3; } bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; } + bool useDefaultImplementationForNulls() const override { return false; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -240,8 +241,12 @@ struct MapKeyLikeAdapter { checkTypes(types); const auto & map_type = assert_cast(*types[0]); + + DataTypes lambda_argument_types{types[1], map_type.getKeyType(), map_type.getValueType()}; + auto result_type = FunctionMapKeyLike().getReturnTypeImpl(lambda_argument_types); + DataTypes argument_types{map_type.getKeyType(), map_type.getValueType()}; - auto function_type = std::make_shared(argument_types, std::make_shared()); + auto function_type = std::make_shared(argument_types, result_type); types = {function_type, types[0]}; MapToNestedAdapter::extractNestedTypes(types); @@ -255,16 +260,17 @@ struct MapKeyLikeAdapter const auto & pattern_arg = arguments[1]; ColumnPtr function_column; - DataTypePtr return_type = std::make_shared(); + auto function = std::make_shared(); + + DataTypes lambda_argument_types{pattern_arg.type, map_type.getKeyType(), map_type.getValueType()}; + auto result_type = function->getReturnTypeImpl(lambda_argument_types); + DataTypes argument_types{map_type.getKeyType(), map_type.getValueType()}; - auto function_type = std::make_shared(argument_types, return_type); + auto function_type = std::make_shared(argument_types, result_type); if (pattern_arg.column) { - DataTypes function_argument_types{pattern_arg.type, map_type.getKeyType(), map_type.getValueType()}; - - auto function = std::make_shared(); - auto function_base = std::make_shared(function, function_argument_types, return_type); + auto function_base = std::make_shared(function, lambda_argument_types, result_type); function_column = ColumnFunction::create(pattern_arg.column->size(), std::move(function_base), ColumnsWithTypeAndName{pattern_arg}); } diff --git a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference index 4ad16ee1290..1f8f2bf0d0c 100644 --- a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference +++ b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.reference @@ -8,3 +8,7 @@ 1 1 1 +1 +0 +{'aa':NULL} +{} diff --git a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql index 01d7e06d0f6..b04c5945a08 100644 --- a/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql +++ b/tests/queries/0_stateless/02030_function_mapContainsKeyLike.sql @@ -15,3 +15,9 @@ SELECT mapContainsKeyLike(map('aa', 1, 'bb', 2), 'a%'); SELECT mapContainsKeyLike(map('aa', 1, 'bb', 2), materialize('a%')); SELECT mapContainsKeyLike(materialize(map('aa', 1, 'bb', 2)), 'a%'); SELECT mapContainsKeyLike(materialize(map('aa', 1, 'bb', 2)), materialize('a%')); + +SELECT mapContainsKeyLike(map('aa', NULL, 'bb', NULL), 'a%'); +SELECT mapContainsKeyLike(map('aa', NULL, 'bb', NULL), 'q%'); + +SELECT mapExtractKeyLike(map('aa', NULL, 'bb', NULL), 'a%'); +SELECT mapExtractKeyLike(map('aa', NULL, 'bb', NULL), 'q%'); diff --git a/tests/queries/0_stateless/02415_all_new_functions_must_be_documented.reference b/tests/queries/0_stateless/02415_all_new_functions_must_be_documented.reference index 571a3c3afb5..0ab8ec792fe 100644 --- a/tests/queries/0_stateless/02415_all_new_functions_must_be_documented.reference +++ b/tests/queries/0_stateless/02415_all_new_functions_must_be_documented.reference @@ -416,17 +416,10 @@ makeDateTime makeDateTime64 map mapAdd -mapApply -mapContains -mapContainsKeyLike -mapExtractKeyLike -mapFilter mapFromArrays -mapKeys mapPopulateSeries mapSubtract mapUpdate -mapValues match materialize max2 From dacdbe469eba03d3fdb3bf28c9d1457b0d9d83d1 Mon Sep 17 00:00:00 2001 From: pufit Date: Thu, 30 Mar 2023 18:15:08 -0400 Subject: [PATCH 131/535] GRANT CURRENT GRANTS implementation --- .../Access/InterpreterGrantQuery.cpp | 7 +++++++ src/Parsers/Access/ASTGrantQuery.cpp | 2 ++ src/Parsers/Access/ASTGrantQuery.h | 2 ++ src/Parsers/Access/ParserGrantQuery.cpp | 16 +++++++++++++--- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index f7e170965e2..65810977a10 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -366,6 +366,13 @@ BlockIO InterpreterGrantQuery::execute() AccessRightsElements elements_to_grant, elements_to_revoke; collectAccessRightsElementsToGrantOrRevoke(query, elements_to_grant, elements_to_revoke); + if (query.current_grants) + { + AccessRights new_rights(elements_to_grant); + new_rights.makeIntersection(*current_user_access->getAccessRightsWithImplicit()); + elements_to_grant = new_rights.getElements(); + } + std::vector roles_to_grant; RolesOrUsersSet roles_to_revoke; collectRolesToGrantOrRevoke(access_control, query, roles_to_grant, roles_to_revoke); diff --git a/src/Parsers/Access/ASTGrantQuery.cpp b/src/Parsers/Access/ASTGrantQuery.cpp index 1c86f175fad..331f1798d77 100644 --- a/src/Parsers/Access/ASTGrantQuery.cpp +++ b/src/Parsers/Access/ASTGrantQuery.cpp @@ -147,6 +147,8 @@ void ASTGrantQuery::formatImpl(const FormatSettings & settings, FormatState &, F "ASTGrantQuery can contain either roles or access rights elements " "to grant or revoke, not both of them"); } + else if (current_grants) + settings.ostr << (settings.hilite ? hilite_keyword : "") << " CURRENT GRANTS" << (settings.hilite ? hilite_none : ""); else formatElementsWithoutOptions(access_rights_elements, settings); diff --git a/src/Parsers/Access/ASTGrantQuery.h b/src/Parsers/Access/ASTGrantQuery.h index 8c7df3cd57e..2ccbac3dac8 100644 --- a/src/Parsers/Access/ASTGrantQuery.h +++ b/src/Parsers/Access/ASTGrantQuery.h @@ -26,6 +26,8 @@ public: bool admin_option = false; bool replace_access = false; bool replace_granted_roles = false; + bool current_grants = false; + std::shared_ptr grantees; String getID(char) const override; diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index 28a1846df74..863c5435352 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -43,7 +43,6 @@ namespace { if (!str.empty()) str += " "; - std::string_view word{pos->begin, pos->size()}; str += std::string_view(pos->begin, pos->size()); ++pos; } @@ -284,8 +283,18 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) AccessRightsElements elements; std::shared_ptr roles; - if (!parseElementsWithoutOptions(pos, expected, elements) && !parseRoles(pos, expected, is_revoke, attach_mode, roles)) - return false; + + bool current_grants = false; + if (!is_revoke && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) + { + current_grants = true; + elements.emplace_back(AccessType::ALL); + } + else + { + if (!parseElementsWithoutOptions(pos, expected, elements) && !parseRoles(pos, expected, is_revoke, attach_mode, roles)) + return false; + } if (cluster.empty()) parseOnCluster(pos, expected, cluster); @@ -353,6 +362,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->admin_option = admin_option; query->replace_access = replace_access; query->replace_granted_roles = replace_role; + query->current_grants = current_grants; return true; } From 1a6cdb3a6f0b3a485258178bc09d94f4be431b8d Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Fri, 31 Mar 2023 02:20:17 +0000 Subject: [PATCH 132/535] fix fuzzer --- src/DataTypes/DataTypeMap.cpp | 7 +++++++ src/DataTypes/DataTypeMap.h | 1 + src/Functions/FunctionsConversion.h | 4 +--- src/Functions/array/FunctionsMapMiscellaneous.cpp | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/DataTypes/DataTypeMap.cpp b/src/DataTypes/DataTypeMap.cpp index 879e40eb098..0f5d97e6761 100644 --- a/src/DataTypes/DataTypeMap.cpp +++ b/src/DataTypes/DataTypeMap.cpp @@ -128,6 +128,13 @@ bool DataTypeMap::checkKeyType(DataTypePtr key_type) return true; } +DataTypePtr DataTypeMap::getNestedTypeWithUnnamedTuple() const +{ + const auto & from_array = assert_cast(*nested); + const auto & from_tuple = assert_cast(*from_array.getNestedType()); + return std::make_shared(std::make_shared(from_tuple.getElements())); +} + static DataTypePtr create(const ASTPtr & arguments) { if (!arguments || arguments->children.size() != 2) diff --git a/src/DataTypes/DataTypeMap.h b/src/DataTypes/DataTypeMap.h index 2ab5c602a25..4712f6bbdef 100644 --- a/src/DataTypes/DataTypeMap.h +++ b/src/DataTypes/DataTypeMap.h @@ -47,6 +47,7 @@ public: const DataTypePtr & getValueType() const { return value_type; } DataTypes getKeyValueTypes() const { return {key_type, value_type}; } const DataTypePtr & getNestedType() const { return nested; } + DataTypePtr getNestedTypeWithUnnamedTuple() const; SerializationPtr doGetDefaultSerialization() const override; diff --git a/src/Functions/FunctionsConversion.h b/src/Functions/FunctionsConversion.h index b2d48beb7b8..c1a8227c924 100644 --- a/src/Functions/FunctionsConversion.h +++ b/src/Functions/FunctionsConversion.h @@ -3106,9 +3106,7 @@ private: { /// Recreate array of unnamed tuples because otherwise it may work /// unexpectedly while converting to array of named tuples. - const auto & from_array = assert_cast(*from_type_map->getNestedType()); - const auto & from_tuple = assert_cast(*from_array.getNestedType()); - from_type_holder = std::make_shared(std::make_shared(from_tuple.getElements())); + from_type_holder = from_type_map->getNestedTypeWithUnnamedTuple(); from_type = assert_cast(from_type_holder.get()); } diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index c26660fabb0..224a7f266b7 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -137,7 +137,7 @@ struct MapToNestedAdapter : public MapAdapterBasesize(), std::move(function_base), ColumnsWithTypeAndName{pattern_arg}); } - ColumnWithTypeAndName function_arg{std::move(function_column), std::move(function_type), "__function_map_key_like"}; + ColumnWithTypeAndName function_arg{function_column, function_type, "__function_map_key_like"}; arguments = {function_arg, arguments[0]}; MapToNestedAdapter::extractNestedTypesAndColumns(arguments); } From 0b7792f7b75d9e06514f56e48bd8f35f875b2e53 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 31 Mar 2023 10:44:39 -0300 Subject: [PATCH 133/535] fix string writer ub, escape sequence parsing failure and make state machine fully functional (remove extra if statements) --- .../impl/CHKeyValuePairExtractor.h | 89 +++++++------------ .../impl/InlineEscapingStateHandler.cpp | 80 +++++++++-------- .../impl/InlineEscapingStateHandler.h | 1 + .../impl/NoEscapingStateHandler.cpp | 32 ++++--- .../impl/NoEscapingStateHandler.h | 1 + .../keyvaluepair/impl/StateHandler.h | 66 -------------- .../keyvaluepair/impl/StringWriter.h | 65 ++++++++++++++ ...t_key_value_pairs_multiple_input.reference | 4 +- ...extract_key_value_pairs_multiple_input.sql | 2 +- 9 files changed, 168 insertions(+), 172 deletions(-) create mode 100644 src/Functions/keyvaluepair/impl/StringWriter.h diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index aa9e421c901..07d1f47bfd8 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -21,7 +21,7 @@ class CHKeyValuePairExtractor : public KeyValuePairExtractor using NextState = DB::extractKV::StateHandler::NextState; public: - CHKeyValuePairExtractor(StateHandler state_handler_) + explicit CHKeyValuePairExtractor(StateHandler state_handler_) : state_handler(std::move(state_handler_)) {} @@ -32,62 +32,32 @@ public: uint64_t extract(std::string_view data, ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) override { -// std::cerr << "CHKeyValuePairExtractor::extract: \"" << data << "\"" << std::endl; auto state = State::WAITING_KEY; extractKV::StringWriter key(*keys); extractKV::StringWriter value(*values); uint64_t row_offset = 0; - const auto & config = state_handler.extractor_configuration; - std::cerr << "CHKeyValuePairExtractor::extract with " - << typeid(state_handler).name() - << "\nConfiguration" - << "\n\tKV delimiter: '" << config.key_value_delimiter << "'" - << "\n\tquote char : '" << config.quoting_character << "'" - << "\n\tpair delims : " << fmt::format("['{}']", fmt::join(config.pair_delimiters, "', '")) - << std::endl; - NextState next_state = {0, state}; while (state != State::END) { - std::cerr << "CHKeyValuePairExtractor::extract 1, state: " - << magic_enum::enum_name(state) - << " (" << data.size() << ") " - << fancyQuote(data) - << std::endl; + auto next_state = processState(data, state, key, value, row_offset); - next_state = processState(data, state, key, value, row_offset); - - std::cerr << "CHKeyValuePairExtractor::extract 2, new_state: " - << magic_enum::enum_name(next_state.state) - << " consumed chars: (" << next_state.position_in_string << ") " - << fancyQuote(data.substr(0, std::min(data.size(), next_state.position_in_string))) - << std::endl; - - if (next_state.position_in_string > data.size() && next_state.state != State::END) { + if (next_state.position_in_string > data.size() && next_state.state != State::END) + { throw Exception(ErrorCodes::LOGICAL_ERROR, - "Attempt to move read poiter past end of available data, from state {} to new state: {}, new position: {}, available data: {}", + "Attempt to move read pointer past end of available data, from state {} to new state: {}, new position: {}, available data: {}", magic_enum::enum_name(state), magic_enum::enum_name(next_state.state), next_state.position_in_string, data.size()); -// next_result = {data.size(), State::END}; } data.remove_prefix(next_state.position_in_string); state = next_state.state; - - // No state expects empty input - if (data.size() == 0) - break; } - // TODO (vnemkov): consider removing, we should reach FLUSH_PAIR state from state machine. - // if break occured earlier, consume previously generated pair - if (state == State::FLUSH_PAIR || !(key.isEmpty() && value.isEmpty())) - flushPair(data, key, value, row_offset); - - keys->validate(); - values->validate(); + // below reset discards invalid keys and values + reset(key, value); + validate(keys, values); return row_offset; } @@ -100,56 +70,65 @@ private: switch (state) { case State::WAITING_KEY: + { return state_handler.waitKey(file); + } case State::READING_KEY: { - auto result = state_handler.readKey(file, key); - std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key.uncommittedChunk()) << std::endl; - return result; + return state_handler.readKey(file, key); } case State::READING_QUOTED_KEY: { - auto result = state_handler.readQuotedKey(file, key); - std::cerr << "CHKeyValuePairExtractor::processState key: " << fancyQuote(key.uncommittedChunk()) << std::endl; - return result; + return state_handler.readQuotedKey(file, key); } case State::READING_KV_DELIMITER: + { return state_handler.readKeyValueDelimiter(file); + } case State::WAITING_VALUE: { return state_handler.waitValue(file); } case State::READING_VALUE: { - auto result = state_handler.readValue(file, value); - std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value.uncommittedChunk()) << std::endl; - return result; + return state_handler.readValue(file, value); } case State::READING_QUOTED_VALUE: { - auto result = state_handler.readQuotedValue(file, value); - std::cerr << "CHKeyValuePairExtractor::processState value: " << fancyQuote(value.uncommittedChunk()) << std::endl; - return result; + return state_handler.readQuotedValue(file, value); } case State::FLUSH_PAIR: + { return flushPair(file, key, value, row_offset); - + } case State::END: + { return {0, state}; + } } } NextState flushPair(const std::string_view & file, extractKV::StringWriter & key, extractKV::StringWriter & value, uint64_t & row_offset) { - std::cerr << "CHKeyValuePairExtractor::flushPair key: " << fancyQuote(key.uncommittedChunk()) << ", value: " << fancyQuote(value.uncommittedChunk()) << std::endl; key.commit(); value.commit(); - ++row_offset; - std::cerr << "CHKeyValuePairExtractor::flushPair total pairs: " << row_offset << std::endl; + row_offset++; - return {0, file.size() == 0 ? State::END : State::WAITING_KEY}; + return {0, file.empty() ? State::END : State::WAITING_KEY}; + } + + void reset(extractKV::StringWriter & key, extractKV::StringWriter & value) + { + key.reset(); + value.reset(); + } + + void validate(ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) + { + keys->validate(); + values->validate(); } StateHandler state_handler; diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp index 06daf780378..402e6818a80 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp @@ -7,17 +7,21 @@ namespace { -size_t consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) +std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) { - output.append(file.begin() + start_pos, file.begin() + character_pos); - - std::string tmp_out; + std::string escaped_sequence; DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); - DB::parseComplexEscapeSequence(tmp_out, buf); - output.append(tmp_out); + if (DB::parseComplexEscapeSequence(escaped_sequence, buf)) + { + output.append(file.begin() + start_pos, file.begin() + character_pos); + output.append(escaped_sequence); - return buf.getPosition(); + return {true, buf.getPosition()}; + } + + + return {false, buf.getPosition()}; } using NextState = DB::extractKV::StateHandler::NextState; @@ -72,6 +76,7 @@ NextState InlineEscapingStateHandler::readKey(std::string_view file, StringWrite key.reset(); size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { auto character_position = p - file.begin(); @@ -79,15 +84,15 @@ NextState InlineEscapingStateHandler::readKey(std::string_view file, StringWrite if (*p == '\\') { - const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, key); - next_pos = character_position + escape_seq_len; - if (escape_seq_len == 0) + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) { return {next_pos, State::WAITING_KEY}; } } - else - if (*p == key_value_delimiter) + else if (*p == key_value_delimiter) { key.append(file.begin() + pos, file.begin() + character_position); @@ -113,6 +118,7 @@ NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, Strin key.reset(); size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) { size_t character_position = p - file.begin(); @@ -120,10 +126,10 @@ NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, Strin if (*p == '\\') { - const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, key); - next_pos = character_position + escape_seq_len; + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_sequence_length; - if (escape_seq_len == 0) + if (!parsed_successfully) { return {next_pos, State::WAITING_KEY}; } @@ -162,15 +168,19 @@ NextState InlineEscapingStateHandler::waitValue(std::string_view file) const const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; size_t pos = 0; - const auto current_character = file[pos]; - if (current_character == quoting_character) + if (!file.empty()) { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_KEY}; + const auto current_character = file[pos]; + + if (current_character == quoting_character) + { + return {pos + 1u, State::READING_QUOTED_VALUE}; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_KEY}; + } } return {pos, State::READING_VALUE}; @@ -183,6 +193,7 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, StringWri value.reset(); size_t pos = 0; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { const size_t character_position = p - file.begin(); @@ -190,25 +201,20 @@ NextState InlineEscapingStateHandler::readValue(std::string_view file, StringWri if (*p == '\\') { - const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, value); - next_pos = character_position + escape_seq_len; - if (escape_seq_len == 0) + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) { - // It is agreed that value with an invalid escape seqence in it - // is considered malformed and shoudn't be included in result. - value.reset(); return {next_pos, State::WAITING_KEY}; } } - else - if (*p == key_value_delimiter) + else if (*p == key_value_delimiter) { - // reached new key return {next_pos, State::WAITING_KEY}; } else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) { - // reached next pair value.append(file.begin() + pos, file.begin() + character_position); return {next_pos, State::FLUSH_PAIR}; @@ -237,15 +243,15 @@ NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, Str if (*p == '\\') { - const size_t escape_seq_len = consumeWithEscapeSequence(file, pos, character_position, value); - next_pos = character_position + escape_seq_len; - if (escape_seq_len == 0) + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) { return {next_pos, State::WAITING_KEY}; } } - else - if (*p == quoting_character) + else if (*p == quoting_character) { value.append(file.begin() + pos, file.begin() + character_position); diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h index 2d532a4938d..26e30454399 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h @@ -2,6 +2,7 @@ #include #include +#include #include #include diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp index e3715bb1bca..0a4e3be6701 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -56,7 +56,7 @@ NextState NoEscapingStateHandler::readKey(std::string_view file, StringWriter & size_t pos = 0; auto start_index = pos; - while (auto p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { const size_t character_position = p - file.begin(); auto next_pos = character_position + 1u; @@ -118,10 +118,14 @@ NextState NoEscapingStateHandler::readQuotedKey(std::string_view file, StringWri NextState NoEscapingStateHandler::readKeyValueDelimiter(std::string_view file) const { - const auto current_character = file[0]; - if (current_character == extractor_configuration.key_value_delimiter) + if (!file.empty()) { - return {1, WAITING_VALUE}; + const auto current_character = file[0]; + + if (current_character == extractor_configuration.key_value_delimiter) + { + return {1, WAITING_VALUE}; + } } return {0, State::WAITING_KEY}; @@ -132,15 +136,19 @@ NextState NoEscapingStateHandler::waitValue(std::string_view file) const const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; size_t pos = 0; - const auto current_character = file[pos]; - if (current_character == quoting_character) + if (!file.empty()) { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_KEY}; + const auto current_character = file[pos]; + + if (current_character == quoting_character) + { + return {pos + 1u, State::READING_QUOTED_VALUE}; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_KEY}; + } } return {pos, State::READING_VALUE}; @@ -153,7 +161,9 @@ NextState NoEscapingStateHandler::readValue(std::string_view file, StringWriter value.reset(); size_t pos = 0; + auto start_index = pos; + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) { const size_t character_position = p - file.begin(); diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h index fa426939d7e..5774b6a283b 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h @@ -2,6 +2,7 @@ #include #include +#include #include #include diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h index 6feb1977c73..d6ce609f865 100644 --- a/src/Functions/keyvaluepair/impl/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -1,7 +1,5 @@ #pragma once -#include - #include #include @@ -48,70 +46,6 @@ public: virtual ~StateHandler() = default; }; - -class StringWriter -{ - ColumnString & col; - ColumnString::Chars & chars; - UInt64 prev_commit_pos = 0; - -public: - StringWriter(ColumnString & col_) - : col(col_), - chars(col.getChars()) - {} - - ~StringWriter() - { - // Make sure that ColumnString invariants are not broken. - if (!isEmpty()) - reset(); - } - - void append(std::string_view new_data) - { - chars.insert(new_data.begin(), new_data.end()); - } - - template - void append(const T * begin, const T * end) - { - chars.insert(begin, end); - } - - void reset() - { - chars.resize_assume_reserved(prev_commit_pos); - } - - bool isEmpty() const - { - return chars.size() == prev_commit_pos; - } - - void commit() - { - if (isEmpty()) - return; - - chars.push_back('\0'); - std::cerr << "Committing on " << &col << " prev_commit_pos: " << prev_commit_pos << " new offset: " << chars.size() << " there will be " << col.getOffsets().size() + 1 << " rows" << std::endl; - col.getOffsets().emplace_back(chars.size()); - prev_commit_pos = chars.size(); - } - - std::string_view uncommittedChunk() const - { - return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); - } - -// const ColumnString & data() const -// { -// return col; -// } -}; - - } // TODO(vnemkov): Debug stuff, remove before merging diff --git a/src/Functions/keyvaluepair/impl/StringWriter.h b/src/Functions/keyvaluepair/impl/StringWriter.h new file mode 100644 index 00000000000..de7cc583a56 --- /dev/null +++ b/src/Functions/keyvaluepair/impl/StringWriter.h @@ -0,0 +1,65 @@ +#pragma once + +#include + +namespace DB +{ + +namespace extractKV +{ + +class StringWriter +{ + ColumnString & col; + ColumnString::Chars & chars; + UInt64 prev_commit_pos = 0; + +public: + explicit StringWriter(ColumnString & col_) + : col(col_), + chars(col.getChars()) + {} + + ~StringWriter() + { + // Make sure that ColumnString invariants are not broken. + if (!isEmpty()) + reset(); + } + + void append(std::string_view new_data) + { + chars.insert(new_data.begin(), new_data.end()); + } + + template + void append(const T * begin, const T * end) + { + chars.insert(begin, end); + } + + void reset() + { + chars.resize_assume_reserved(prev_commit_pos); + } + + bool isEmpty() const + { + return chars.size() == prev_commit_pos; + } + + void commit() + { + chars.push_back('\0'); + col.getOffsets().emplace_back(chars.size()); + prev_commit_pos = chars.size(); + } + + std::string_view uncommittedChunk() const + { + return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); + } +}; +} + +} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index a8047cd01cb..5fb9998181c 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -67,7 +67,7 @@ SELECT x; {'amount\\z':'$5\\h','currency':'\\$USD'} -- invalid escape sequence, should be discarded --- expected output: {'key':'invalid_val','valid_key':'valid_value'} +-- expected output: {'valid_key':'valid_value'} WITH extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, CAST( @@ -78,7 +78,7 @@ WITH ) AS x SELECT x; -{'key':'invalid_val','valid_key':'valid_value'} +{'valid_key':'valid_value'} -- standard escape sequences are covered by unit tests -- simple quoting diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index ee49455c8c1..5f96fd9306b 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -67,7 +67,7 @@ SELECT x; -- invalid escape sequence, should be discarded --- expected output: {'key':'invalid_val','valid_key':'valid_value'} +-- expected output: {'valid_key':'valid_value'} WITH extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, CAST( From e52a2982e0a0fa5d69ade77f666f60f7e3d86ebb Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 31 Mar 2023 15:01:42 -0300 Subject: [PATCH 134/535] fixed another stringwriter bug, where multi-row input would break because of prev_commit_offset=0 --- .../keyvaluepair/extractKeyValuePairs.cpp | 3 + .../impl/CHKeyValuePairExtractor.h | 8 +- .../impl/InlineEscapingStateHandler.cpp | 269 ---------------- .../impl/InlineEscapingStateHandler.h | 287 +++++++++++++++++- .../impl/KeyValuePairExtractorBuilder.cpp | 5 +- .../impl/NoEscapingStateHandler.cpp | 1 - .../keyvaluepair/impl/StateHandler.h | 82 ++--- .../keyvaluepair/impl/StringWriter.h | 8 +- 8 files changed, 329 insertions(+), 334 deletions(-) delete mode 100644 src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index c9d0a1a5f3c..8d8e8fd6efd 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -65,6 +65,9 @@ ColumnPtr extract(ColumnPtr data_column, std::shared_ptr offsets->insert(offset); } + keys->validate(); + values->validate(); + ColumnPtr keys_ptr = std::move(keys); return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index 07d1f47bfd8..a5b7b58c92c 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -6,6 +6,7 @@ #include #include +#include // TODO: debug stuff, remove it before merging #include @@ -57,7 +58,6 @@ public: // below reset discards invalid keys and values reset(key, value); - validate(keys, values); return row_offset; } @@ -125,12 +125,6 @@ private: value.reset(); } - void validate(ColumnString::MutablePtr & keys, ColumnString::MutablePtr & values) - { - keys->validate(); - values->validate(); - } - StateHandler state_handler; }; diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp deleted file mode 100644 index 402e6818a80..00000000000 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.cpp +++ /dev/null @@ -1,269 +0,0 @@ -#include -#include - -#include -#include -#include - -namespace -{ -std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) -{ - std::string escaped_sequence; - DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); - - if (DB::parseComplexEscapeSequence(escaped_sequence, buf)) - { - output.append(file.begin() + start_pos, file.begin() + character_pos); - output.append(escaped_sequence); - - return {true, buf.getPosition()}; - } - - - return {false, buf.getPosition()}; -} - -using NextState = DB::extractKV::StateHandler::NextState; - -} - -namespace DB -{ - -namespace extractKV -{ - -InlineEscapingStateHandler::InlineEscapingStateHandler(Configuration extractor_configuration_) - : extractor_configuration(std::move(extractor_configuration_)) -{ - wait_needles = EscapingNeedleFactory::getWaitNeedles(extractor_configuration); - read_needles = EscapingNeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState InlineEscapingStateHandler::waitKey(std::string_view file) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) - { - const size_t character_position = p - file.begin(); - if (*p == quoting_character) - { - // +1 to skip quoting character - return {character_position + 1u, State::READING_QUOTED_KEY}; - } - else - { - return {character_position, State::READING_KEY}; - } - } - - return {file.size(), State::END}; -} - -/* - * I only need to iteratively copy stuff if there are escape sequences. If not, views are sufficient. - * TSKV has a nice catch for that, implementers kept an auxiliary string to hold copied characters. - * If I find a key value delimiter and that is empty, I do not need to copy? hm,m hm hm - * */ - -NextState InlineEscapingStateHandler::readKey(std::string_view file, StringWriter & key) const -{ - const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - - key.reset(); - - size_t pos = 0; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) - { - auto character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == '\\') - { - auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); - next_pos = character_position + escape_sequence_length; - - if (!parsed_successfully) - { - return {next_pos, State::WAITING_KEY}; - } - } - else if (*p == key_value_delimiter) - { - key.append(file.begin() + pos, file.begin() + character_position); - - return {next_pos, State::WAITING_VALUE}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) - { - return {next_pos, State::WAITING_KEY}; - } - - pos = next_pos; - } - - // might be problematic in case string reaches the end and I haven't copied anything over to key - - return {file.size(), State::END}; -} - -NextState InlineEscapingStateHandler::readQuotedKey(std::string_view file, StringWriter & key) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - key.reset(); - - size_t pos = 0; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) - { - size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == '\\') - { - auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); - next_pos = character_position + escape_sequence_length; - - if (!parsed_successfully) - { - return {next_pos, State::WAITING_KEY}; - } - } - else if (*p == quoting_character) - { - key.append(file.begin() + pos, file.begin() + character_position); - - if (key.isEmpty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::READING_KV_DELIMITER}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -NextState InlineEscapingStateHandler::readKeyValueDelimiter(std::string_view file) const -{ - const auto current_character = file[0]; - if (current_character == extractor_configuration.key_value_delimiter) - { - return {1, WAITING_VALUE}; - } - - return {0, State::WAITING_KEY}; -} - -NextState InlineEscapingStateHandler::waitValue(std::string_view file) const -{ - const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; - - size_t pos = 0; - - if (!file.empty()) - { - const auto current_character = file[pos]; - - if (current_character == quoting_character) - { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_KEY}; - } - } - - return {pos, State::READING_VALUE}; -} - -NextState InlineEscapingStateHandler::readValue(std::string_view file, StringWriter & value) const -{ - const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - - value.reset(); - - size_t pos = 0; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) - { - const size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == '\\') - { - auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); - next_pos = character_position + escape_sequence_length; - - if (!parsed_successfully) - { - return {next_pos, State::WAITING_KEY}; - } - } - else if (*p == key_value_delimiter) - { - return {next_pos, State::WAITING_KEY}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) - { - value.append(file.begin() + pos, file.begin() + character_position); - - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - // Reached end of input, consume rest of the file as value and make sure KV pair is produced. - value.append(file.begin() + pos, file.end()); - return {file.size(), State::FLUSH_PAIR}; -} - -NextState InlineEscapingStateHandler::readQuotedValue(std::string_view file, StringWriter & value) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - size_t pos = 0; - - value.reset(); - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) - { - const size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == '\\') - { - auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); - next_pos = character_position + escape_sequence_length; - - if (!parsed_successfully) - { - return {next_pos, State::WAITING_KEY}; - } - } - else if (*p == quoting_character) - { - value.append(file.begin() + pos, file.begin() + character_position); - - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -} - -} diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h index 26e30454399..3c8d315c554 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h @@ -3,6 +3,11 @@ #include #include #include +#include + +#include +#include +#include #include #include @@ -14,20 +19,284 @@ namespace DB namespace extractKV { +namespace +{ + std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) + { + std::string escaped_sequence; + DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); + + if (DB::parseComplexEscapeSequence(escaped_sequence, buf)) + { + output.append(file.begin() + start_pos, file.begin() + character_pos); + output.append(escaped_sequence); + + return {true, buf.getPosition()}; + } + + + return {false, buf.getPosition()}; + } + + using NextState = DB::extractKV::StateHandler::NextState; + +} + +template class InlineEscapingStateHandler : public StateHandler { public: - explicit InlineEscapingStateHandler(Configuration configuration_); + explicit InlineEscapingStateHandler(Configuration configuration_) + : configuration(std::move(configuration_)) + { + // improve below, possibly propagating with_Escaping to needle factory as well + if constexpr (WITH_ESCAPING) + { + wait_needles = EscapingNeedleFactory::getWaitNeedles(configuration); + read_needles = EscapingNeedleFactory::getReadNeedles(configuration); + read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(configuration); + } + else + { + wait_needles = NeedleFactory::getWaitNeedles(configuration); + read_needles = NeedleFactory::getReadNeedles(configuration); + read_quoted_needles = NeedleFactory::getReadQuotedNeedles(configuration); + } + } - [[nodiscard]] NextState waitKey(std::string_view file) const; - [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const; - [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const; - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; - [[nodiscard]] NextState waitValue(std::string_view file) const; - [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const; - [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const; + [[nodiscard]] NextState waitKey(std::string_view file) const + { + const auto quoting_character = configuration.quoting_character; - const Configuration extractor_configuration; + if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) + { + const size_t character_position = p - file.begin(); + if (*p == quoting_character) + { + // +1 to skip quoting character + return {character_position + 1u, State::READING_QUOTED_KEY}; + } + else + { + return {character_position, State::READING_KEY}; + } + } + + return {file.size(), State::END}; + } + + [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const + { + const auto & [key_value_delimiter, _, pair_delimiters] = configuration; + + key.reset(); + + size_t pos = 0; + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + { + auto character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (WITH_ESCAPING && *p == '\\') + { + if constexpr (WITH_ESCAPING) + { + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) + { + return {next_pos, State::WAITING_KEY}; + } + } + } + else if (*p == key_value_delimiter) + { + key.append(file.begin() + pos, file.begin() + character_position); + + return {next_pos, State::WAITING_VALUE}; + } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + { + return {next_pos, State::WAITING_KEY}; + } + + pos = next_pos; + } + + // might be problematic in case string reaches the end and I haven't copied anything over to key + + return {file.size(), State::END}; + } + + [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const + { + const auto quoting_character = configuration.quoting_character; + + key.reset(); + + size_t pos = 0; + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) + { + size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (WITH_ESCAPING && *p == '\\') + { + if constexpr (WITH_ESCAPING) + { + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, key); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) + { + return {next_pos, State::WAITING_KEY}; + } + } + } + else if (*p == quoting_character) + { + key.append(file.begin() + pos, file.begin() + character_position); + + if (key.isEmpty()) + { + return {next_pos, State::WAITING_KEY}; + } + + return {next_pos, State::READING_KV_DELIMITER}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; + } + + [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const + { + if (!file.empty()) + { + const auto current_character = file[0]; + + if (current_character == configuration.key_value_delimiter) + { + return {1, WAITING_VALUE}; + } + } + + return {0, State::WAITING_KEY}; + } + + [[nodiscard]] NextState waitValue(std::string_view file) const + { + const auto & [key_value_delimiter, quoting_character, _] = configuration; + + size_t pos = 0; + + if (!file.empty()) + { + const auto current_character = file[pos]; + + if (current_character == quoting_character) + { + return {pos + 1u, State::READING_QUOTED_VALUE}; + } + else if (current_character == key_value_delimiter) + { + return {pos, State::WAITING_KEY}; + } + } + + return {pos, State::READING_VALUE}; + } + + [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const + { + const auto & [key_value_delimiter, _, pair_delimiters] = configuration; + + value.reset(); + + size_t pos = 0; + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) + { + const size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (WITH_ESCAPING && *p == '\\') + { + if constexpr (WITH_ESCAPING) + { + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) + { + return {next_pos, State::WAITING_KEY}; + } + } + } + else if (*p == key_value_delimiter) + { + return {next_pos, State::WAITING_KEY}; + } + else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + { + value.append(file.begin() + pos, file.begin() + character_position); + + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + // Reached end of input, consume rest of the file as value and make sure KV pair is produced. + value.append(file.begin() + pos, file.end()); + return {file.size(), State::FLUSH_PAIR}; + } + + [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const + { + const auto quoting_character = configuration.quoting_character; + + size_t pos = 0; + + value.reset(); + + while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) + { + const size_t character_position = p - file.begin(); + size_t next_pos = character_position + 1u; + + if (WITH_ESCAPING && *p == '\\') + { + if constexpr (WITH_ESCAPING) + { + auto [parsed_successfully, escape_sequence_length] = consumeWithEscapeSequence(file, pos, character_position, value); + next_pos = character_position + escape_sequence_length; + + if (!parsed_successfully) + { + return {next_pos, State::WAITING_KEY}; + } + } + } + else if (*p == quoting_character) + { + value.append(file.begin() + pos, file.begin() + character_position); + + return {next_pos, State::FLUSH_PAIR}; + } + + pos = next_pos; + } + + return {file.size(), State::END}; + } + + const Configuration configuration; private: std::vector wait_needles; diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp index a71f38413d4..971d4926436 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp @@ -1,7 +1,6 @@ #include #include -#include #include #include @@ -58,14 +57,14 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou { auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(NoEscapingStateHandler(configuration)); + return makeStateHandler(InlineEscapingStateHandler(configuration)); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(InlineEscapingStateHandler(configuration)); + return makeStateHandler(InlineEscapingStateHandler(configuration)); } } diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp index 0a4e3be6701..e86f91090e8 100644 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp @@ -208,7 +208,6 @@ NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, StringW { value.append(file.begin() + start_index, file.begin() + character_position); - std::cerr << "NoEscapingStateHandler::readQuoted Going to consume up to: «" << fancyQuote(file.substr(0, next_pos)) << " to " << fancyQuote(file.substr(next_pos)) << std::endl; return {next_pos, State::FLUSH_PAIR}; } diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h index d6ce609f865..7f442fcadce 100644 --- a/src/Functions/keyvaluepair/impl/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -49,46 +49,46 @@ public: } // TODO(vnemkov): Debug stuff, remove before merging - -template -struct CustomQuoted -{ - const char * start_quote = "\""; - const char * end_quote = "\""; - - const T & value; -}; - -template -CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) -{ - assert(start_quote != nullptr); - - return CustomQuoted{ - .start_quote = start_quote, - .end_quote = end_quote ? end_quote : start_quote, - .value = value - }; -} - -inline auto fancyQuote(const std::string_view & value) -{ - return CustomQuoted{ - .start_quote = "«", - .end_quote = "»", - .value = value - }; -} - -template -std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) -{ - if constexpr (prepend_length) - { - ostr << "(" << val.value.length() << ") "; - } - - return ostr << val.start_quote << val.value << val.end_quote; -} +// +//template +//struct CustomQuoted +//{ +// const char * start_quote = "\""; +// const char * end_quote = "\""; +// +// const T & value; +//}; +// +//template +//CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) +//{ +// assert(start_quote != nullptr); +// +// return CustomQuoted{ +// .start_quote = start_quote, +// .end_quote = end_quote ? end_quote : start_quote, +// .value = value +// }; +//} +// +//inline auto fancyQuote(const std::string_view & value) +//{ +// return CustomQuoted{ +// .start_quote = "«", +// .end_quote = "»", +// .value = value +// }; +//} +// +//template +//std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) +//{ +// if constexpr (prepend_length) +// { +// ostr << "(" << val.value.length() << ") "; +// } +// +// return ostr << val.start_quote << val.value << val.end_quote; +//} } diff --git a/src/Functions/keyvaluepair/impl/StringWriter.h b/src/Functions/keyvaluepair/impl/StringWriter.h index de7cc583a56..029d0c980a4 100644 --- a/src/Functions/keyvaluepair/impl/StringWriter.h +++ b/src/Functions/keyvaluepair/impl/StringWriter.h @@ -12,12 +12,13 @@ class StringWriter { ColumnString & col; ColumnString::Chars & chars; - UInt64 prev_commit_pos = 0; + UInt64 prev_commit_pos; public: explicit StringWriter(ColumnString & col_) : col(col_), - chars(col.getChars()) + chars(col.getChars()), + prev_commit_pos(chars.size()) {} ~StringWriter() @@ -50,8 +51,7 @@ public: void commit() { - chars.push_back('\0'); - col.getOffsets().emplace_back(chars.size()); + col.insertData(nullptr, 0); prev_commit_pos = chars.size(); } From f2790a15ffd18d55111f4f1bf7eb4844960eab5f Mon Sep 17 00:00:00 2001 From: pufit Date: Fri, 31 Mar 2023 17:35:32 -0400 Subject: [PATCH 135/535] CURRENT GRANTS(...) implementation --- src/Parsers/Access/ParserGrantQuery.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index 863c5435352..cd24dc610ed 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -288,7 +288,16 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (!is_revoke && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) { current_grants = true; - elements.emplace_back(AccessType::ALL); + if (ParserToken(TokenType::OpeningRoundBracket).ignore(pos, expected)) + { + if (!parseElementsWithoutOptions(pos, expected, elements) && !parseRoles(pos, expected, is_revoke, attach_mode, roles)) + return false; + + if (!ParserToken(TokenType::ClosingRoundBracket).ignore(pos, expected)) + return false; + } + else + elements.emplace_back(AccessType::ALL); } else { From 6dde1592278ad2b9efd45bf3407d751cc7442b6b Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 3 Apr 2023 13:43:11 +0000 Subject: [PATCH 136/535] add comments and docs --- .../functions/array-functions.md | 10 +- .../functions/tuple-map-functions.md | 281 +++++++++++++----- .../array/FunctionsMapMiscellaneous.cpp | 35 +++ src/Functions/array/arrayAll.cpp | 83 +----- src/Functions/array/arrayAll.h | 84 ++++++ .../02706_array_map_tuples.reference | 3 + .../0_stateless/02706_array_map_tuples.sql | 6 + 7 files changed, 341 insertions(+), 161 deletions(-) create mode 100644 src/Functions/array/arrayAll.h create mode 100644 tests/queries/0_stateless/02706_array_map_tuples.reference create mode 100644 tests/queries/0_stateless/02706_array_map_tuples.sql diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index 9d2f89c1837..da6af139e31 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -18,7 +18,7 @@ empty([x]) An array is considered empty if it does not contain any elements. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT empty(arr) FROM TABLE;` transforms to `SELECT arr.size0 = 0 FROM TABLE;`. ::: @@ -62,7 +62,7 @@ notEmpty([x]) An array is considered non-empty if it contains at least one element. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT notEmpty(arr) FROM table` transforms to `SELECT arr.size0 != 0 FROM TABLE`. ::: @@ -642,7 +642,7 @@ SELECT arraySlice([1, 2, NULL, 4, 5], 2, 3) AS res; Array elements set to `NULL` are handled as normal values. -## arraySort(\[func,\] arr, …) +## arraySort(\[func,\] arr, …) {#array_functions-sort} Sorts the elements of the `arr` array in ascending order. If the `func` function is specified, sorting order is determined by the result of the `func` function applied to the elements of the array. If `func` accepts multiple arguments, the `arraySort` function is passed several arrays that the arguments of `func` will correspond to. Detailed examples are shown at the end of `arraySort` description. @@ -739,11 +739,11 @@ SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; └─────────┘ ``` -:::note +:::note To improve sorting efficiency, the [Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform) is used. ::: -## arrayReverseSort(\[func,\] arr, …) +## arrayReverseSort(\[func,\] arr, …) {#array_functions-reverse-sort} Sorts the elements of the `arr` array in descending order. If the `func` function is specified, `arr` is sorted according to the result of the `func` function applied to the elements of the array, and then the sorted array is reversed. If `func` accepts multiple arguments, the `arrayReverseSort` function is passed several arrays that the arguments of `func` will correspond to. Detailed examples are shown at the end of `arrayReverseSort` description. diff --git a/docs/en/sql-reference/functions/tuple-map-functions.md b/docs/en/sql-reference/functions/tuple-map-functions.md index 34c865e7752..07d4e74d606 100644 --- a/docs/en/sql-reference/functions/tuple-map-functions.md +++ b/docs/en/sql-reference/functions/tuple-map-functions.md @@ -71,23 +71,23 @@ Result: Merges an [Array](../../sql-reference/data-types/array.md) of keys and an [Array](../../sql-reference/data-types/array.md) of values into a [Map(key, value)](../../sql-reference/data-types/map.md). The function is a more convenient alternative to `CAST((key_array, value_array), 'Map(key_type, value_type)')`. For example, instead of writing `CAST((['aa', 'bb'], [4, 5]), 'Map(String, UInt32)')`, you can write `mapFromArrays(['aa', 'bb'], [4, 5])`. - + **Syntax** ```sql mapFromArrays(keys, values) -``` +``` Alias: `MAP_FROM_ARRAYS(keys, values)` - + **Arguments** - `keys` — Given key array to create a map from. The nested type of array must be: [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md) - `values` - Given value array to create a map from. - + **Returned value** - A map whose keys and values are constructed from the key and value arrays - + **Example** Query: @@ -95,12 +95,12 @@ Query: ```sql select mapFromArrays(['a', 'b', 'c'], [1, 2, 3]) ``` - + ```text ┌─mapFromArrays(['a', 'b', 'c'], [1, 2, 3])─┐ │ {'a':1,'b':2,'c':3} │ └───────────────────────────────────────────┘ -``` +``` ## mapAdd @@ -388,25 +388,25 @@ Result: │ ['eleven','11'] │ │ ['twelve','6.0'] │ └──────────────────┘ -``` - -## mapContainsKeyLike - +``` + +## mapContainsKeyLike + **Syntax** ```sql mapContainsKeyLike(map, pattern) -``` - +``` + **Arguments** - -- `map` — Map. [Map](../../sql-reference/data-types/map.md). -- `pattern` - String pattern to match. - + +- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `pattern` - String pattern to match. + **Returned value** -- `1` if `map` contains `key` like specified pattern, `0` if not. - +- `1` if `map` contains `key` like specified pattern, `0` if not. + **Example** Query: @@ -417,34 +417,34 @@ CREATE TABLE test (a Map(String,String)) ENGINE = Memory; INSERT INTO test VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'}); SELECT mapContainsKeyLike(a, 'a%') FROM test; -``` - -Result: - +``` + +Result: + ```text ┌─mapContainsKeyLike(a, 'a%')─┐ │ 1 │ │ 0 │ -└─────────────────────────────┘ -``` - -## mapExtractKeyLike - +└─────────────────────────────┘ +``` + +## mapExtractKeyLike + **Syntax** ```sql mapExtractKeyLike(map, pattern) -``` - +``` + **Arguments** - -- `map` — Map. [Map](../../sql-reference/data-types/map.md). -- `pattern` - String pattern to match. - + +- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `pattern` - String pattern to match. + **Returned value** - A map contained elements the key of which matchs the specified pattern. If there are no elements matched the pattern, it will return an empty map. - + **Example** Query: @@ -455,34 +455,34 @@ CREATE TABLE test (a Map(String,String)) ENGINE = Memory; INSERT INTO test VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'}); SELECT mapExtractKeyLike(a, 'a%') FROM test; -``` - -Result: - +``` + +Result: + ```text ┌─mapExtractKeyLike(a, 'a%')─┐ │ {'abc':'abc'} │ │ {} │ └────────────────────────────┘ -``` - -## mapApply - +``` + +## mapApply + **Syntax** ```sql mapApply(func, map) -``` - +``` + **Arguments** - + - `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). - `map` — [Map](../../sql-reference/data-types/map.md). **Returned value** - Returns a map obtained from the original map by application of `func(map1[i], …, mapN[i])` for each element. - + **Example** Query: @@ -494,36 +494,36 @@ FROM SELECT map('key1', number, 'key2', number * 2) AS _map FROM numbers(3) ) -``` - -Result: - +``` + +Result: + ```text ┌─r─────────────────────┐ │ {'key1':0,'key2':0} │ │ {'key1':10,'key2':20} │ │ {'key1':20,'key2':40} │ └───────────────────────┘ -``` +``` + +## mapFilter -## mapFilter - **Syntax** ```sql mapFilter(func, map) -``` - +``` + **Arguments** - `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). -- `map` — [Map](../../sql-reference/data-types/map.md). +- `map` — [Map](../../sql-reference/data-types/map.md). **Returned value** - Returns a map containing only the elements in `map` for which `func(map1[i], …, mapN[i])` returns something other than 0. - - + + **Example** Query: @@ -535,27 +535,27 @@ FROM SELECT map('key1', number, 'key2', number * 2) AS _map FROM numbers(3) ) -``` - -Result: - +``` + +Result: + ```text ┌─r───────────────────┐ │ {'key1':0,'key2':0} │ │ {'key2':2} │ │ {'key1':2,'key2':4} │ └─────────────────────┘ -``` +``` -## mapUpdate - +## mapUpdate + **Syntax** ```sql mapUpdate(map1, map2) -``` - +``` + **Arguments** - `map1` [Map](../../sql-reference/data-types/map.md). @@ -564,19 +564,152 @@ mapUpdate(map1, map2) **Returned value** - Returns a map1 with values updated of values for the corresponding keys in map2. - + **Example** Query: ```sql SELECT mapUpdate(map('key1', 0, 'key3', 0), map('key1', 10, 'key2', 10)) AS map; -``` - -Result: - +``` + +Result: + ```text ┌─map────────────────────────────┐ │ {'key3':0,'key1':10,'key2':10} │ └────────────────────────────────┘ -``` +``` + +## mapConcat + +**Syntax** + +```sql +mapConcat(maps) +``` + +**Arguments** + +- `maps` – Arbitrary number of arguments of [Map](../../sql-reference/data-types/map.md) type. + +**Returned value** + +- Returns a map with concatenated maps passed as arguments. + +**Example** + +Query: + +```sql +SELECT mapConcat(map('key1', 1, 'key3', 3), map('key2', 2)) AS map; +``` + +Result: + +```text +┌─map──────────────────────────┐ +│ {'key1':1,'key3':3,'key2':2} │ +└──────────────────────────────┘ +``` + +## mapExists(\[func,\], map) + +Returns 1 if there is at least one key-value pair in `map` for which `func(key, value)` returns something other than 0. Otherwise, it returns 0. + +Note that the `mapExists` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. + +**Example** + +Query: + +```sql +SELECT mapExists((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res +``` + +Result: + +```text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## mapAll(\[func,\] map) + +Returns 1 if `func(key, value)` returns something other than 0 for all key-value pairs in `map`. Otherwise, it returns 0. + +Note that the `mapAll` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. + +**Example** + +Query: + +```sql +SELECT mapAll((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res +``` + +Result: + +```text +┌─res─┐ +│ 0 │ +└─────┘ +``` + +## mapSort(\[func,\], map) + +Sorts the elements of the `map` in ascending order. If the `func` function is specified, sorting order is determined by the result of the `func` function applied to the keys and values of the map. + +**Examples** + +``` sql +SELECT mapSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key1':3,'key2':2,'key3':1} │ +└──────────────────────────────┘ +``` + +``` sql +SELECT mapSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key3':1,'key2':2,'key1':3} │ +└──────────────────────────────┘ +``` + +For more details see the [reference](../../sql-reference/functions/array-functions.md#array_functions-sort) for `arraySort` function. + +## mapReverseSort(\[func,\], map) + +Sorts the elements of the `map` in descending order. If the `func` function is specified, sorting order is determined by the result of the `func` function applied to the keys and values of the map. + + +**Examples** + +``` sql +SELECT mapReverseSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key3':1,'key2':2,'key1':3} │ +└──────────────────────────────┘ +``` + +``` sql +SELECT mapReverseSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key1':3,'key2':2,'key3':1} │ +└──────────────────────────────┘ +``` + +For more details see the [reference](../../sql-reference/functions/array-functions.md#array_functions-reverse-sort) for `arrayReverseSort` function. diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index 224a7f266b7..69772e5b165 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,15 @@ namespace ErrorCodes extern const int ILLEGAL_TYPE_OF_ARGUMENT; } +/** An adapter that allows to execute array* functions over Map types arguments. + * E.g. transform mapConcat to arrayConcat. + * + * Impl - the implementaion of function that is applied + * to internal column of Map arguments (e.g. 'arrayConcat'). + * + * Adapter - a struct that determines the way how to extract the internal array columns + * from Map arguments and possibly modify other columns. +*/ template class FunctionMapToArrayAdapter : public IFunction { @@ -65,6 +75,8 @@ public: impl.getReturnTypeImpl(nested_arguments); }; + /// If method is not overloaded in the implementation call default implementation + /// from IFunction. Here inheritance cannot be used for template parameterized field. if constexpr (impl_has_get_return_type) return Adapter::wrapType(impl.getReturnTypeImpl(nested_arguments)); else @@ -129,6 +141,7 @@ struct MapAdapterBase } }; +/// Adapter that extracts nested Array(Tuple(key, value)) from Map columns. template struct MapToNestedAdapter : public MapAdapterBase, Name> { @@ -167,9 +180,11 @@ struct MapToNestedAdapter : public MapAdapterBase struct MapToSubcolumnAdapter : public MapAdapterBase, Name> { + static_assert(position <= 1); using MapAdapterBase::extractNestedTypes; using MapAdapterBase::extractNestedTypesAndColumns; @@ -192,6 +207,9 @@ struct MapToSubcolumnAdapter : public MapAdapterBase key LIKE pattern +/// It is used to mimic lambda: (key, value) -> key LIKE pattern. class FunctionMapKeyLike : public IFunction { public: @@ -216,6 +234,11 @@ private: FunctionLike impl; }; +/// Adapter for map*KeyLike functions. +/// It extracts nested Array(Tuple(key, value)) from Map columns +/// and prepares ColumnFunction as first argument which works +/// like lambda (k, v) -> k LIKE pattern to pass it to the nested +/// fucntion derived from FunctionArrayMapped. template struct MapKeyLikeAdapter { @@ -270,6 +293,8 @@ struct MapKeyLikeAdapter if (pattern_arg.column) { + /// Here we create ColumnFunction with already captured pattern column. + /// Nested function will append keys and values column and it will work as desired lambda. auto function_base = std::make_shared(function, lambda_argument_types, result_type); function_column = ColumnFunction::create(pattern_arg.column->size(), std::move(function_base), ColumnsWithTypeAndName{pattern_arg}); } @@ -316,6 +341,9 @@ using FunctionMapApply = FunctionMapToArrayAdapter, NameMapExists>; +struct NameMapAll { static constexpr auto name = "mapAll"; }; +using FunctionMapAll = FunctionMapToArrayAdapter, NameMapAll>; + struct NameMapContainsKeyLike { static constexpr auto name = "mapContainsKeyLike"; }; using FunctionMapContainsKeyLike = FunctionMapToArrayAdapter, NameMapContainsKeyLike>; @@ -383,6 +411,13 @@ REGISTER_FUNCTION(MapMiscellaneous) Documentation::Categories{"Map"}, }); + factory.registerFunction( + { + "The same as arrayAll.", + Documentation::Examples{{"mapAll", "SELECT mapAll((k, v) -> v = 1, map('k1', 1, 'k2', 2))"}}, + Documentation::Categories{"Map"}, + }); + factory.registerFunction( { "The same as arraySort.", diff --git a/src/Functions/array/arrayAll.cpp b/src/Functions/array/arrayAll.cpp index a80e2ff062c..c5b91c12f65 100644 --- a/src/Functions/array/arrayAll.cpp +++ b/src/Functions/array/arrayAll.cpp @@ -1,87 +1,8 @@ -#include -#include +#include #include -#include "FunctionArrayMapped.h" - namespace DB { -namespace ErrorCodes -{ - extern const int ILLEGAL_COLUMN; -} - -/** arrayAll(x1,...,xn -> expression, array1,...,arrayn) - is the expression true for all elements of the array. - * An overload of the form f(array) is available, which works in the same way as f(x -> x, array). - */ -struct ArrayAllImpl -{ - static bool needBoolean() { return true; } - static bool needExpression() { return false; } - static bool needOneArray() { return false; } - - static DataTypePtr getReturnType(const DataTypePtr & /*expression_return*/, const DataTypePtr & /*array_element*/) - { - return std::make_shared(); - } - - static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) - { - const ColumnUInt8 * column_filter = typeid_cast(&*mapped); - - if (!column_filter) - { - const auto * column_filter_const = checkAndGetColumnConst(&*mapped); - - if (!column_filter_const) - throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected type of filter column"); - - if (column_filter_const->getValue()) - return DataTypeUInt8().createColumnConst(array.size(), 1u); - else - { - const IColumn::Offsets & offsets = array.getOffsets(); - auto out_column = ColumnUInt8::create(offsets.size()); - ColumnUInt8::Container & out_all = out_column->getData(); - - size_t pos = 0; - for (size_t i = 0; i < offsets.size(); ++i) - { - out_all[i] = offsets[i] == pos; - pos = offsets[i]; - } - - return out_column; - } - } - - const IColumn::Filter & filter = column_filter->getData(); - const IColumn::Offsets & offsets = array.getOffsets(); - auto out_column = ColumnUInt8::create(offsets.size()); - ColumnUInt8::Container & out_all = out_column->getData(); - - size_t pos = 0; - for (size_t i = 0; i < offsets.size(); ++i) - { - UInt8 all = 1; - for (; pos < offsets[i]; ++pos) - { - if (!filter[pos]) - { - all = 0; - pos = offsets[i]; - break; - } - } - out_all[i] = all; - } - - return out_column; - } -}; - -struct NameArrayAll { static constexpr auto name = "arrayAll"; }; -using FunctionArrayAll = FunctionArrayMapped; REGISTER_FUNCTION(ArrayAll) { @@ -89,5 +10,3 @@ REGISTER_FUNCTION(ArrayAll) } } - - diff --git a/src/Functions/array/arrayAll.h b/src/Functions/array/arrayAll.h new file mode 100644 index 00000000000..53cd5d0dfdb --- /dev/null +++ b/src/Functions/array/arrayAll.h @@ -0,0 +1,84 @@ +#include +#include +#include "FunctionArrayMapped.h" + +namespace DB +{ +namespace ErrorCodes +{ + extern const int ILLEGAL_COLUMN; +} + +/** arrayAll(x1,...,xn -> expression, array1,...,arrayn) - is the expression true for all elements of the array. + * An overload of the form f(array) is available, which works in the same way as f(x -> x, array). + */ +struct ArrayAllImpl +{ + static bool needBoolean() { return true; } + static bool needExpression() { return false; } + static bool needOneArray() { return false; } + + static DataTypePtr getReturnType(const DataTypePtr & /*expression_return*/, const DataTypePtr & /*array_element*/) + { + return std::make_shared(); + } + + static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) + { + const ColumnUInt8 * column_filter = typeid_cast(&*mapped); + + if (!column_filter) + { + const auto * column_filter_const = checkAndGetColumnConst(&*mapped); + + if (!column_filter_const) + throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected type of filter column"); + + if (column_filter_const->getValue()) + return DataTypeUInt8().createColumnConst(array.size(), 1u); + else + { + const IColumn::Offsets & offsets = array.getOffsets(); + auto out_column = ColumnUInt8::create(offsets.size()); + ColumnUInt8::Container & out_all = out_column->getData(); + + size_t pos = 0; + for (size_t i = 0; i < offsets.size(); ++i) + { + out_all[i] = offsets[i] == pos; + pos = offsets[i]; + } + + return out_column; + } + } + + const IColumn::Filter & filter = column_filter->getData(); + const IColumn::Offsets & offsets = array.getOffsets(); + auto out_column = ColumnUInt8::create(offsets.size()); + ColumnUInt8::Container & out_all = out_column->getData(); + + size_t pos = 0; + for (size_t i = 0; i < offsets.size(); ++i) + { + UInt8 all = 1; + for (; pos < offsets[i]; ++pos) + { + if (!filter[pos]) + { + all = 0; + pos = offsets[i]; + break; + } + } + out_all[i] = all; + } + + return out_column; + } +}; + +struct NameArrayAll { static constexpr auto name = "arrayAll"; }; +using FunctionArrayAll = FunctionArrayMapped; + +} diff --git a/tests/queries/0_stateless/02706_array_map_tuples.reference b/tests/queries/0_stateless/02706_array_map_tuples.reference new file mode 100644 index 00000000000..a44843f1a35 --- /dev/null +++ b/tests/queries/0_stateless/02706_array_map_tuples.reference @@ -0,0 +1,3 @@ +[(2,1)] +[1] +[(3,2)] diff --git a/tests/queries/0_stateless/02706_array_map_tuples.sql b/tests/queries/0_stateless/02706_array_map_tuples.sql new file mode 100644 index 00000000000..205e15c7de2 --- /dev/null +++ b/tests/queries/0_stateless/02706_array_map_tuples.sql @@ -0,0 +1,6 @@ +WITH [(1, 2)] AS arr1 SELECT arrayMap((x, y) -> (y, x), arr1); +WITH [(1, 2)] AS arr1 SELECT arrayMap(x -> x.1, arr1); +WITH [(1, 2)] AS arr1, [(3, 4)] AS arr2 SELECT arrayMap((x, y) -> (y.1, x.2), arr1, arr2); + +WITH [(1, 2)] AS arr1 SELECT arrayMap((x, y, z) -> (y, x, z), arr1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +WITH [1, 2] AS arr1 SELECT arrayMap((x, y) -> (y, x), arr1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } From 531e88857704c35d432db9cef2cde6bcfff76900 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Mon, 3 Apr 2023 14:39:42 +0000 Subject: [PATCH 137/535] fix style check --- src/Functions/array/FunctionsMapMiscellaneous.cpp | 4 ++-- src/Functions/array/arrayAll.h | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Functions/array/FunctionsMapMiscellaneous.cpp b/src/Functions/array/FunctionsMapMiscellaneous.cpp index 69772e5b165..bf486bcd626 100644 --- a/src/Functions/array/FunctionsMapMiscellaneous.cpp +++ b/src/Functions/array/FunctionsMapMiscellaneous.cpp @@ -35,7 +35,7 @@ namespace ErrorCodes /** An adapter that allows to execute array* functions over Map types arguments. * E.g. transform mapConcat to arrayConcat. * - * Impl - the implementaion of function that is applied + * Impl - the implementation of function that is applied * to internal column of Map arguments (e.g. 'arrayConcat'). * * Adapter - a struct that determines the way how to extract the internal array columns @@ -238,7 +238,7 @@ private: /// It extracts nested Array(Tuple(key, value)) from Map columns /// and prepares ColumnFunction as first argument which works /// like lambda (k, v) -> k LIKE pattern to pass it to the nested -/// fucntion derived from FunctionArrayMapped. +/// function derived from FunctionArrayMapped. template struct MapKeyLikeAdapter { diff --git a/src/Functions/array/arrayAll.h b/src/Functions/array/arrayAll.h index 53cd5d0dfdb..e7e00fdf0e9 100644 --- a/src/Functions/array/arrayAll.h +++ b/src/Functions/array/arrayAll.h @@ -1,3 +1,5 @@ +#pragma once + #include #include #include "FunctionArrayMapped.h" From aee9ccb27a975673d9d2693fe710b7249f4ca53a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 12:45:29 -0300 Subject: [PATCH 138/535] validated output against main test case, performance is not the same as before, but still good --- base/base/find_symbols.h | 54 +++-- .../keyvaluepair/impl/Configuration.cpp | 3 +- .../impl/KeyValuePairExtractorBuilder.cpp | 6 +- .../keyvaluepair/impl/NeedleFactory.cpp | 84 ------- .../keyvaluepair/impl/NeedleFactory.h | 71 ++++-- .../impl/NoEscapingStateHandler.cpp | 222 ------------------ .../impl/NoEscapingStateHandler.h | 40 ---- .../keyvaluepair/impl/StateHandler.h | 43 ---- ...apingStateHandler.h => StateHandlerImpl.h} | 78 +++--- ...test_inline_escaping_key_state_handler.cpp | 16 +- ...st_inline_escaping_value_state_handler.cpp | 4 +- 11 files changed, 139 insertions(+), 482 deletions(-) delete mode 100644 src/Functions/keyvaluepair/impl/NeedleFactory.cpp delete mode 100644 src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp delete mode 100644 src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h rename src/Functions/keyvaluepair/impl/{InlineEscapingStateHandler.h => StateHandlerImpl.h} (86%) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index ed6764f6848..472030f815a 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -2,6 +2,7 @@ #include #include +#include #if defined(__SSE2__) #include @@ -34,6 +35,32 @@ * If no such characters, returns nullptr. */ +struct SearchSymbols +{ + static constexpr auto BUFFER_SIZE = 16; + + SearchSymbols() = default; + + explicit SearchSymbols(std::string in) + : str(std::move(in)) + { +#if defined(__SSE4_2__) + assert(str.size() <= BUFFER_SIZE); + + char tmp_safety_buffer[16] = {0}; + + memcpy(tmp_safety_buffer, str.data(), str.size()); + + simd_vector = _mm_loadu_si128(reinterpret_cast(tmp_safety_buffer)); +#endif + } + +#if defined(__SSE4_2__) + __m128i simd_vector; +#endif + std::string str; +}; + namespace detail { template constexpr bool is_in(char x) { return ((x == chars) || ...); } @@ -256,17 +283,15 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha } template -inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const char * symbols, size_t num_chars) +inline const char * find_first_symbols_sse42(const char * const begin, const char * const end, const SearchSymbols & symbols) { const char * pos = begin; #if defined(__SSE4_2__) constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - // This is to avoid read past end of `symbols` if `num_chars < 16`. - char buffer[16] = {'\0'}; - memcpy(buffer, symbols, num_chars); - const __m128i set = _mm_loadu_si128(reinterpret_cast(buffer)); + const __m128i set = symbols.simd_vector; + const auto num_chars = symbols.str.size(); for (; pos + 15 < end; pos += 16) { @@ -286,7 +311,7 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha #endif for (; pos < end; ++pos) - if (maybe_negate(is_in(*pos, symbols, num_chars))) + if (maybe_negate(is_in(*pos, symbols.str.data(), num_chars))) return pos; return return_mode == ReturnMode::End ? end : nullptr; @@ -307,15 +332,14 @@ inline const char * find_first_symbols_dispatch(const char * begin, const char * } template -inline const char * find_first_symbols_dispatch(const std::string_view haystack, const std::string_view symbols) +inline const char * find_first_symbols_dispatch(const std::string_view haystack, const SearchSymbols & symbols) { - const size_t num_chars = std::min(symbols.size(), 16); #if defined(__SSE4_2__) - if (num_chars >= 5) - return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols.begin(), num_chars); + if (symbols.str.size() >= 5) + return find_first_symbols_sse42(haystack.begin(), haystack.end(), symbols); else #endif - return find_first_symbols_sse2(haystack.begin(), haystack.end(), symbols.begin(), num_chars); + return find_first_symbols_sse2(haystack.begin(), haystack.end(), symbols.str.data(), symbols.str.size()); } } @@ -335,7 +359,7 @@ inline char * find_first_symbols(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } -inline const char * find_first_symbols(std::string_view haystack, std::string_view symbols) +inline const char * find_first_symbols(std::string_view haystack, const SearchSymbols & symbols) { return detail::find_first_symbols_dispatch(haystack, symbols); } @@ -352,7 +376,7 @@ inline char * find_first_not_symbols(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } -inline const char * find_first_not_symbols(std::string_view haystack, std::string_view symbols) +inline const char * find_first_not_symbols(std::string_view haystack, const SearchSymbols & symbols) { return detail::find_first_symbols_dispatch(haystack, symbols); } @@ -369,7 +393,7 @@ inline char * find_first_symbols_or_null(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } -inline const char * find_first_symbols_or_null(std::string_view haystack, std::string_view symbols) +inline const char * find_first_symbols_or_null(std::string_view haystack, const SearchSymbols & symbols) { return detail::find_first_symbols_dispatch(haystack, symbols); } @@ -386,7 +410,7 @@ inline char * find_first_not_symbols_or_null(char * begin, char * end) return const_cast(detail::find_first_symbols_dispatch(begin, end)); } -inline const char * find_first_not_symbols_or_null(std::string_view haystack, std::string_view symbols) +inline const char * find_first_not_symbols_or_null(std::string_view haystack, const SearchSymbols & symbols) { return detail::find_first_symbols_dispatch(haystack, symbols); } diff --git a/src/Functions/keyvaluepair/impl/Configuration.cpp b/src/Functions/keyvaluepair/impl/Configuration.cpp index da5af6f946f..1b7f4774158 100644 --- a/src/Functions/keyvaluepair/impl/Configuration.cpp +++ b/src/Functions/keyvaluepair/impl/Configuration.cpp @@ -27,7 +27,8 @@ Configuration ConfigurationFactory::createWithoutEscaping(char key_value_delimit Configuration ConfigurationFactory::createWithEscaping(char key_value_delimiter, char quoting_character, std::vector pair_delimiters) { - constexpr char ESCAPE_CHARACTER = '\\'; + static constexpr char ESCAPE_CHARACTER = '\\'; + if (key_value_delimiter == ESCAPE_CHARACTER || quoting_character == ESCAPE_CHARACTER || std::find(pair_delimiters.begin(), pair_delimiters.end(), ESCAPE_CHARACTER) != pair_delimiters.end()) diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp index 971d4926436..216fc9afde3 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp @@ -1,8 +1,8 @@ #include -#include #include #include +#include namespace DB { @@ -57,14 +57,14 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou { auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(InlineEscapingStateHandler(configuration)); + return makeStateHandler(StateHandlerImpl(configuration)); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(InlineEscapingStateHandler(configuration)); + return makeStateHandler(StateHandlerImpl(configuration)); } } diff --git a/src/Functions/keyvaluepair/impl/NeedleFactory.cpp b/src/Functions/keyvaluepair/impl/NeedleFactory.cpp deleted file mode 100644 index f48487df36f..00000000000 --- a/src/Functions/keyvaluepair/impl/NeedleFactory.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include - -namespace DB -{ - -namespace extractKV -{ - -std::vector NeedleFactory::getWaitNeedles(const Configuration & extractor_configuration) -{ - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - std::vector needles; - - needles.reserve(NEEDLE_SIZE); - - needles.push_back(key_value_delimiter); - - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - - return needles; -} - -std::vector NeedleFactory::getReadNeedles(const Configuration & extractor_configuration) -{ - const auto & [key_value_delimiter, quoting_character, pair_delimiters] - = extractor_configuration; - - std::vector needles; - - needles.reserve(NEEDLE_SIZE); - - needles.push_back(key_value_delimiter); - needles.push_back(quoting_character); - - std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); - - return needles; -} - -std::vector NeedleFactory::getReadQuotedNeedles(const Configuration & extractor_configuration) -{ - const auto quoting_character = extractor_configuration.quoting_character; - - std::vector needles; - - needles.reserve(NEEDLE_SIZE); - - needles.push_back(quoting_character); - - return needles; -} - -std::vector EscapingNeedleFactory::getWaitNeedles(const Configuration & extractor_configuration) -{ - auto needles = NeedleFactory::getWaitNeedles(extractor_configuration); - - needles.push_back('\\'); - - return needles; -} - -std::vector EscapingNeedleFactory::getReadNeedles(const Configuration & extractor_configuration) -{ - auto needles = NeedleFactory::getReadNeedles(extractor_configuration); - - needles.push_back('\\'); - - return needles; -} - -std::vector EscapingNeedleFactory::getReadQuotedNeedles(const Configuration & extractor_configuration) -{ - auto needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); - - needles.push_back('\\'); - - return needles; -} - -} - -} diff --git a/src/Functions/keyvaluepair/impl/NeedleFactory.h b/src/Functions/keyvaluepair/impl/NeedleFactory.h index 180e30bce02..cf3451c7bcb 100644 --- a/src/Functions/keyvaluepair/impl/NeedleFactory.h +++ b/src/Functions/keyvaluepair/impl/NeedleFactory.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -10,27 +11,63 @@ namespace DB namespace extractKV { -/* - * Did not spend much time here, running against the clock :) - * - * Takes in the Configuration and outputs the characters of interest for each state. - * Those characters will be later used in string look-ups like `find_first` and `find_first_not` - * */ +template class NeedleFactory { - static constexpr auto NEEDLE_SIZE = 16u; public: - static std::vector getWaitNeedles(const Configuration & extractor_configuration); - static std::vector getReadNeedles(const Configuration & extractor_configuration); - static std::vector getReadQuotedNeedles(const Configuration & extractor_configuration); -}; + SearchSymbols getWaitNeedles(const Configuration & extractor_configuration) + { + const auto & [key_value_delimiter, quoting_character, pair_delimiters] + = extractor_configuration; -class EscapingNeedleFactory -{ -public: - static std::vector getWaitNeedles(const Configuration & extractor_configuration); - static std::vector getReadNeedles(const Configuration & extractor_configuration); - static std::vector getReadQuotedNeedles(const Configuration & extractor_configuration); + std::vector needles; + + needles.push_back(key_value_delimiter); + + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + if constexpr (WITH_ESCAPING) + { + needles.push_back('\\'); + } + + return SearchSymbols {std::string{needles.data(), needles.size()}}; + } + + SearchSymbols getReadNeedles(const Configuration & extractor_configuration) + { + const auto & [key_value_delimiter, quoting_character, pair_delimiters] + = extractor_configuration; + + std::vector needles; + + needles.push_back(key_value_delimiter); + needles.push_back(quoting_character); + + std::copy(pair_delimiters.begin(), pair_delimiters.end(), std::back_inserter(needles)); + + if constexpr (WITH_ESCAPING) + { + needles.push_back('\\'); + } + + return SearchSymbols {std::string{needles.data(), needles.size()}}; + } + SearchSymbols getReadQuotedNeedles(const Configuration & extractor_configuration) + { + const auto quoting_character = extractor_configuration.quoting_character; + + std::vector needles; + + needles.push_back(quoting_character); + + if constexpr (WITH_ESCAPING) + { + needles.push_back('\\'); + } + + return SearchSymbols {std::string{needles.data(), needles.size()}}; + } }; } diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp deleted file mode 100644 index e86f91090e8..00000000000 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.cpp +++ /dev/null @@ -1,222 +0,0 @@ -#include - -#include - -#include -#include "Functions/keyvaluepair/impl/StateHandler.h" - -namespace -{ - -using NextState = DB::extractKV::StateHandler::NextState; - -} - -namespace DB -{ - -namespace extractKV -{ - - -NoEscapingStateHandler::NoEscapingStateHandler(Configuration extractor_configuration_) -: extractor_configuration(std::move(extractor_configuration_)) -{ - wait_needles = NeedleFactory::getWaitNeedles(extractor_configuration); - read_needles = NeedleFactory::getReadNeedles(extractor_configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(extractor_configuration); -} - -NextState NoEscapingStateHandler::waitKey(std::string_view file) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) - { - const size_t character_position = p - file.begin(); - if (*p == quoting_character) - { - return {character_position + 1u, State::READING_QUOTED_KEY}; - } - else - { - return {character_position, State::READING_KEY}; - } - } - - return {file.size(), State::END}; -} - -NextState NoEscapingStateHandler::readKey(std::string_view file, StringWriter & key) const -{ - const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - - key.reset(); - - size_t pos = 0; - auto start_index = pos; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) - { - const size_t character_position = p - file.begin(); - auto next_pos = character_position + 1u; - - if (*p == key_value_delimiter) - { - key.append(file.begin() + start_index, file.begin() + character_position); - - if (key.isEmpty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::WAITING_VALUE}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) - { - return {next_pos, State::WAITING_KEY}; - } - - pos = next_pos; - // TODO: add check to not read past end of `file`'s data? - } - - return {file.size(), State::END}; -} - -NextState NoEscapingStateHandler::readQuotedKey(std::string_view file, StringWriter & key) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - key.reset(); - - size_t pos = 0; - auto start_index = pos; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) - { - size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == quoting_character) - { - key.append(file.begin() + start_index, file.begin() + character_position); - - if (key.isEmpty()) - { - return {next_pos, State::WAITING_KEY}; - } - - return {next_pos, State::READING_KV_DELIMITER}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -NextState NoEscapingStateHandler::readKeyValueDelimiter(std::string_view file) const -{ - if (!file.empty()) - { - const auto current_character = file[0]; - - if (current_character == extractor_configuration.key_value_delimiter) - { - return {1, WAITING_VALUE}; - } - } - - return {0, State::WAITING_KEY}; -} - -NextState NoEscapingStateHandler::waitValue(std::string_view file) const -{ - const auto & [key_value_delimiter, quoting_character, _] = extractor_configuration; - - size_t pos = 0; - - if (!file.empty()) - { - const auto current_character = file[pos]; - - if (current_character == quoting_character) - { - return {pos + 1u, State::READING_QUOTED_VALUE}; - } - else if (current_character == key_value_delimiter) - { - return {pos, State::WAITING_KEY}; - } - } - - return {pos, State::READING_VALUE}; -} - -NextState NoEscapingStateHandler::readValue(std::string_view file, StringWriter & value) const -{ - const auto & [key_value_delimiter, _, pair_delimiters] = extractor_configuration; - - value.reset(); - - size_t pos = 0; - - auto start_index = pos; - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_needles)) - { - const size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == key_value_delimiter) - { - return {next_pos, State::WAITING_KEY}; - } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) - { - // reached next pair - value.append(file.begin() + start_index, file.begin() + character_position); - - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - // TODO: do I really need the below logic? - // this allows empty values at the end - value.append(file.begin() + start_index, file.end()); - return {file.size(), State::FLUSH_PAIR}; -} - -NextState NoEscapingStateHandler::readQuotedValue(std::string_view file, StringWriter & value) const -{ - const auto quoting_character = extractor_configuration.quoting_character; - - size_t pos = 0; - auto start_index = pos; - - value.reset(); - - while (const auto * p = find_first_symbols_or_null({file.begin() + pos, file.end()}, read_quoted_needles)) - { - const size_t character_position = p - file.begin(); - size_t next_pos = character_position + 1u; - - if (*p == quoting_character) - { - value.append(file.begin() + start_index, file.begin() + character_position); - - return {next_pos, State::FLUSH_PAIR}; - } - - pos = next_pos; - } - - return {file.size(), State::END}; -} - -} - -} diff --git a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h deleted file mode 100644 index 5774b6a283b..00000000000 --- a/src/Functions/keyvaluepair/impl/NoEscapingStateHandler.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include -#include - -namespace DB -{ - -namespace extractKV -{ - -class NoEscapingStateHandler : public StateHandler -{ -public: - explicit NoEscapingStateHandler(Configuration extractor_configuration_); - - [[nodiscard]] NextState waitKey(std::string_view file) const; - [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const; - [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const; - [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const; - [[nodiscard]] NextState waitValue(std::string_view file) const; - [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const; - [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const; - - const Configuration extractor_configuration; - -private: - std::vector wait_needles; - std::vector read_needles; - std::vector read_quoted_needles; -}; - -} - -} diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h index 7f442fcadce..f5267a5256f 100644 --- a/src/Functions/keyvaluepair/impl/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -48,47 +48,4 @@ public: } -// TODO(vnemkov): Debug stuff, remove before merging -// -//template -//struct CustomQuoted -//{ -// const char * start_quote = "\""; -// const char * end_quote = "\""; -// -// const T & value; -//}; -// -//template -//CustomQuoted customQuote(const char * start_quote, const T & value, const char * end_quote = nullptr) -//{ -// assert(start_quote != nullptr); -// -// return CustomQuoted{ -// .start_quote = start_quote, -// .end_quote = end_quote ? end_quote : start_quote, -// .value = value -// }; -//} -// -//inline auto fancyQuote(const std::string_view & value) -//{ -// return CustomQuoted{ -// .start_quote = "«", -// .end_quote = "»", -// .value = value -// }; -//} -// -//template -//std::ostream & operator<<(std::ostream & ostr, const CustomQuoted & val) -//{ -// if constexpr (prepend_length) -// { -// ostr << "(" << val.value.length() << ") "; -// } -// -// return ostr << val.start_quote << val.value << val.end_quote; -//} - } diff --git a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h similarity index 86% rename from src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h rename to src/Functions/keyvaluepair/impl/StateHandlerImpl.h index 3c8d315c554..538dee03948 100644 --- a/src/Functions/keyvaluepair/impl/InlineEscapingStateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -19,49 +19,19 @@ namespace DB namespace extractKV { -namespace -{ - std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) - { - std::string escaped_sequence; - DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); - - if (DB::parseComplexEscapeSequence(escaped_sequence, buf)) - { - output.append(file.begin() + start_pos, file.begin() + character_pos); - output.append(escaped_sequence); - - return {true, buf.getPosition()}; - } - - - return {false, buf.getPosition()}; - } - - using NextState = DB::extractKV::StateHandler::NextState; - -} - template -class InlineEscapingStateHandler : public StateHandler +class StateHandlerImpl : public StateHandler { + static constexpr char ESCAPE_CHARACTER = '\\'; public: - explicit InlineEscapingStateHandler(Configuration configuration_) + explicit StateHandlerImpl(Configuration configuration_) : configuration(std::move(configuration_)) { - // improve below, possibly propagating with_Escaping to needle factory as well - if constexpr (WITH_ESCAPING) - { - wait_needles = EscapingNeedleFactory::getWaitNeedles(configuration); - read_needles = EscapingNeedleFactory::getReadNeedles(configuration); - read_quoted_needles = EscapingNeedleFactory::getReadQuotedNeedles(configuration); - } - else - { - wait_needles = NeedleFactory::getWaitNeedles(configuration); - read_needles = NeedleFactory::getReadNeedles(configuration); - read_quoted_needles = NeedleFactory::getReadQuotedNeedles(configuration); - } + NeedleFactory needle_factory; + + wait_needles = needle_factory.getWaitNeedles(configuration); + read_needles = needle_factory.getReadNeedles(configuration); + read_quoted_needles = needle_factory.getReadQuotedNeedles(configuration); } [[nodiscard]] NextState waitKey(std::string_view file) const @@ -98,7 +68,7 @@ public: auto character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == '\\') + if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) { if constexpr (WITH_ESCAPING) { @@ -125,8 +95,6 @@ public: pos = next_pos; } - // might be problematic in case string reaches the end and I haven't copied anything over to key - return {file.size(), State::END}; } @@ -143,7 +111,7 @@ public: size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == '\\') + if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) { if constexpr (WITH_ESCAPING) { @@ -225,7 +193,7 @@ public: const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == '\\') + if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) { if constexpr (WITH_ESCAPING) { @@ -270,7 +238,7 @@ public: const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == '\\') + if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) { if constexpr (WITH_ESCAPING) { @@ -299,9 +267,25 @@ public: const Configuration configuration; private: - std::vector wait_needles; - std::vector read_needles; - std::vector read_quoted_needles; + SearchSymbols wait_needles; + SearchSymbols read_needles; + SearchSymbols read_quoted_needles; + + std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) const + { + std::string escaped_sequence; + DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); + + if (DB::parseComplexEscapeSequence(escaped_sequence, buf)) + { + output.append(file.begin() + start_pos, file.begin() + character_pos); + output.append(escaped_sequence); + + return {true, buf.getPosition()}; + } + + return {false, buf.getPosition()}; + } }; } diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 3a93079b92c..4a439dc9e40 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include @@ -14,7 +14,7 @@ using namespace DB::extractKV; using State = extractKV::StateHandler::State; using NextState = extractKV::StateHandler::NextState; -void test_wait(const InlineEscapingStateHandler & handler, std::string_view input, std::size_t expected_pos, State expected_state) +void test_wait(const StateHandlerImpl & handler, std::string_view input, std::size_t expected_pos, State expected_state) { auto next_state = handler.waitKey(input); @@ -23,7 +23,7 @@ void test_wait(const InlineEscapingStateHandler & handler, std::string_view inpu } template -void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { auto str = ColumnString::create(); @@ -44,13 +44,13 @@ void test_read(const InlineEscapingStateHandler & handler, std::string_view inpu ASSERT_EQ(element.uncommittedChunk(), expected_element); } -void test_read(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); } -void test_read_quoted(const InlineEscapingStateHandler & handler, std::string_view input, std::string_view expected_element, +void test_read_quoted(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); @@ -64,7 +64,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); test_wait(handler, "name", 0u, State::READING_KEY); test_wait(handler, "\\:name", 2u, State::READING_KEY); @@ -80,7 +80,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; @@ -105,7 +105,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); std::string regular_key = "name"; std::string regular_key_with_end_quote = regular_key + "\""; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 53382de320d..682bfaee64c 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -28,7 +28,7 @@ TEST(extractKVPair_InlineEscapingValueStateHandler, Wait) auto pair_delimiters = std::vector {','}; auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - InlineEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); test_wait(handler, " los$ yours3lf", 0u, State::READING_VALUE); } From c80ba3d52e7cd00a89cb1c8a021d0fd3bb825433 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 13:48:58 -0300 Subject: [PATCH 139/535] unit tests passing --- src/Common/tests/gtest_find_symbols.cpp | 12 ++++---- .../tests/gtest_extractKeyValuePairs.cpp | 28 +++---------------- ...test_inline_escaping_key_state_handler.cpp | 14 +++++----- ...st_inline_escaping_value_state_handler.cpp | 2 +- .../gtest_no_escaping_key_state_handler.cpp | 9 +++--- 5 files changed, 23 insertions(+), 42 deletions(-) diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 298b0670d2d..6e67a7460ee 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -17,7 +17,7 @@ void test_find_first_not(const std::string & haystack, const std::string & symbo { const char * begin = haystack.data(); - ASSERT_EQ(begin + expected_pos, find_first_not_symbols(haystack, symbols)); + ASSERT_EQ(begin + expected_pos, find_first_not_symbols(haystack, SearchSymbols(symbols))); } @@ -114,7 +114,7 @@ TEST(FindSymbols, RunTimeNeedle) const auto & n = needle_; \ EXPECT_EQ( \ std::find_first_of(h.data(), h.data() + h.size(), n.data(), n.data() + n.size()), \ - find_first_symbols(h, n) \ + find_first_symbols(h, SearchSymbols(n)) \ ) << "haystack: \"" << h << "\" (" << static_cast(h.data()) << ")" \ << ", needle: \"" << n << "\""; \ } \ @@ -186,10 +186,10 @@ TEST(FindSymbols, RunTimeNeedle) } // Check that nothing matches on big haystack, - EXPECT_EQ(find_first_symbols(long_haystack, "ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz"), long_haystack.data() + long_haystack.size()); + EXPECT_EQ(find_first_symbols(long_haystack, SearchSymbols("ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz")), long_haystack.data() + long_haystack.size()); // only 16 bytes of haystack are checked, so nothing is found - EXPECT_EQ(find_first_symbols(long_haystack, "ABCDEFIJKLMNOPQR0helloworld"), long_haystack.data() + long_haystack.size()); + EXPECT_EQ(find_first_symbols(long_haystack, SearchSymbols("ABCDEFIJKLMNOPQR0helloworld")), long_haystack.data() + long_haystack.size()); } TEST(FindNotSymbols, AllSymbolsPresent) @@ -224,14 +224,14 @@ TEST(FindNotSymbols, NoSymbolsMatch) // begin should be returned since the first character of the string does not match any of the below symbols test_find_first_not<'h', 'i', 'j'>(s, 0u); - test_find_first_not(s, "hij",0u); + test_find_first_not(s, "hij", 0u); } TEST(FindNotSymbols, ExtraSymbols) { std::string s = "hello_world_hello"; test_find_first_not<'h', 'e', 'l', 'o', ' '>(s, 5u); - test_find_first_not(s, "helo ",5u); + test_find_first_not(s, "helo ", 5u); } TEST(FindNotSymbols, EmptyString) diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp index ab06fb6e90f..e3a99b2aaec 100644 --- a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -92,13 +92,9 @@ TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) size_t i = 0; for (const auto & expected_kv : expected) { - EXPECT_EQ(expected_kv.first, keys->getDataAt(i)) - << fancyQuote(expected_kv.first) << "\nvs\n" - << fancyQuote(keys->getDataAt(i).toView()); + EXPECT_EQ(expected_kv.first, keys->getDataAt(i)); - EXPECT_EQ(expected_kv.second, values->getDataAt(i)) - << fancyQuote(expected_kv.second) << "\nvs\n" - << fancyQuote(values->getDataAt(i).toView()); + EXPECT_EQ(expected_kv.second, values->getDataAt(i)); ++i; } @@ -137,34 +133,18 @@ INSTANTIATE_TEST_SUITE_P(Simple, extractKVPair_KeyValuePairExtractorTest, ) ); -// It is agreed that value with an invalid escape seqence in it is considered malformed and shoudn't be included in result. +// It is agreed that value with an invalid escape sequence in it is considered malformed and shouldn't be included in result. INSTANTIATE_TEST_SUITE_P(InvalidEscapeSeqInValue, extractKVPair_KeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list { - { - KeyValuePairExtractorBuilder().withEscaping(), - R"in(valid_key:valid_value key:invalid_val\\ third_key:third_value)in", - ExpectedValues{ - {"valid_key", "valid_value"}, - {"third_key", "third_value"} - } - }, { // Special case when invalid seq is the last symbol KeyValuePairExtractorBuilder().withEscaping(), - R"in(valid_key:valid_value key:invalid_val\\)in", + R"in(valid_key:valid_value key:invalid_val\)in", ExpectedValues{ {"valid_key", "valid_value"} } }, - { - KeyValuePairExtractorBuilder().withEscaping().withQuotingCharacter('"'), - R"in(valid_key:valid_value key:"invalid val\\ " "third key":"third value")in", - ExpectedValues{ - {"valid_key", "valid_value"}, - {"third key", "third value"} - } - }, // Not handling escape sequences == do not care of broken one, `invalid_val\` must be present { KeyValuePairExtractorBuilder(), diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 4a439dc9e40..94934fd89f0 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -14,7 +14,7 @@ using namespace DB::extractKV; using State = extractKV::StateHandler::State; using NextState = extractKV::StateHandler::NextState; -void test_wait(const StateHandlerImpl & handler, std::string_view input, std::size_t expected_pos, State expected_state) +void test_wait(const auto & handler, std::string_view input, std::size_t expected_pos, State expected_state) { auto next_state = handler.waitKey(input); @@ -23,7 +23,7 @@ void test_wait(const StateHandlerImpl & handler, std::string_view input, std::si } template -void test_read(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, +void test_read(const auto & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { auto str = ColumnString::create(); @@ -44,13 +44,13 @@ void test_read(const StateHandlerImpl & handler, std::string_view input, std::st ASSERT_EQ(element.uncommittedChunk(), expected_element); } -void test_read(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, +void test_read(const auto & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); } -void test_read_quoted(const StateHandlerImpl & handler, std::string_view input, std::string_view expected_element, +void test_read_quoted(const auto & handler, std::string_view input, std::string_view expected_element, std::size_t expected_pos, State expected_state) { test_read(handler, input, expected_element, expected_pos, expected_state); @@ -64,7 +64,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + StateHandlerImpl handler(configuration); test_wait(handler, "name", 0u, State::READING_KEY); test_wait(handler, "\\:name", 2u, State::READING_KEY); @@ -80,7 +80,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + StateHandlerImpl handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; @@ -105,7 +105,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + StateHandlerImpl handler(configuration); std::string regular_key = "name"; std::string regular_key_with_end_quote = regular_key + "\""; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index 682bfaee64c..a0c7d76dd7f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -28,7 +28,7 @@ TEST(extractKVPair_InlineEscapingValueStateHandler, Wait) auto pair_delimiters = std::vector {','}; auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + StateHandlerImpl handler(configuration); test_wait(handler, " los$ yours3lf", 0u, State::READING_VALUE); } diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index b162982e9bb..fd9affedce8 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -1,5 +1,6 @@ -#include -#include +#include +#include +#include #include @@ -64,7 +65,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - NoEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); test_wait(handler, "name", 0u, State::READING_KEY); test_wait(handler, "\\:name", 0u, State::READING_KEY); @@ -83,7 +84,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - NoEscapingStateHandler handler(configuration); + StateHandlerImpl handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; From c7c96bfeab217137ed1c1ff25e3bc42739a62a4a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 14:19:15 -0300 Subject: [PATCH 140/535] refactor state handlers so writer comes from them --- .../impl/CHKeyValuePairExtractor.h | 21 +++----- .../impl/KeyValuePairExtractorBuilder.cpp | 4 +- .../keyvaluepair/impl/StateHandlerImpl.h | 29 ++++++++-- .../keyvaluepair/impl/StringWriter.h | 54 +++++++++++++++++++ 4 files changed, 88 insertions(+), 20 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index a5b7b58c92c..b79515d17ab 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -8,10 +8,6 @@ #include #include -// TODO: debug stuff, remove it before merging -#include -#include - namespace DB { @@ -35,14 +31,14 @@ public: { auto state = State::WAITING_KEY; - extractKV::StringWriter key(*keys); - extractKV::StringWriter value(*values); + auto key_writer = typename StateHandler::SW(*keys); + auto value_writer = typename StateHandler::SW(*values); uint64_t row_offset = 0; while (state != State::END) { - auto next_state = processState(data, state, key, value, row_offset); + auto next_state = processState(data, state, key_writer, value_writer, row_offset); if (next_state.position_in_string > data.size() && next_state.state != State::END) { @@ -57,15 +53,14 @@ public: } // below reset discards invalid keys and values - reset(key, value); + reset(key_writer, value_writer); return row_offset; } private: - NextState processState(std::string_view file, State state, extractKV::StringWriter & key, - extractKV::StringWriter & value, uint64_t & row_offset) + NextState processState(std::string_view file, State state, auto & key, auto & value, uint64_t & row_offset) { switch (state) { @@ -108,8 +103,8 @@ private: } } - NextState flushPair(const std::string_view & file, extractKV::StringWriter & key, - extractKV::StringWriter & value, uint64_t & row_offset) + NextState flushPair(const std::string_view & file, auto & key, + auto & value, uint64_t & row_offset) { key.commit(); value.commit(); @@ -119,7 +114,7 @@ private: return {0, file.empty() ? State::END : State::WAITING_KEY}; } - void reset(extractKV::StringWriter & key, extractKV::StringWriter & value) + void reset(auto & key, auto & value) { key.reset(); value.reset(); diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp index 216fc9afde3..c1b2b192fc4 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp @@ -57,14 +57,14 @@ std::shared_ptr KeyValuePairExtractorBuilder::buildWithou { auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(StateHandlerImpl(configuration)); + return makeStateHandler(NoEscapingStateHandler(configuration)); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); - return makeStateHandler(StateHandlerImpl(configuration)); + return makeStateHandler(InlineEscapingStateHandler(configuration)); } } diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index 538dee03948..b774fcd29d4 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -55,7 +56,7 @@ public: return {file.size(), State::END}; } - [[nodiscard]] NextState readKey(std::string_view file, StringWriter & key) const + [[nodiscard]] NextState readKey(std::string_view file, auto & key) const { const auto & [key_value_delimiter, _, pair_delimiters] = configuration; @@ -98,7 +99,7 @@ public: return {file.size(), State::END}; } - [[nodiscard]] NextState readQuotedKey(std::string_view file, StringWriter & key) const + [[nodiscard]] NextState readQuotedKey(std::string_view file, auto & key) const { const auto quoting_character = configuration.quoting_character; @@ -180,7 +181,7 @@ public: return {pos, State::READING_VALUE}; } - [[nodiscard]] NextState readValue(std::string_view file, StringWriter & value) const + [[nodiscard]] NextState readValue(std::string_view file, auto & value) const { const auto & [key_value_delimiter, _, pair_delimiters] = configuration; @@ -225,7 +226,7 @@ public: return {file.size(), State::FLUSH_PAIR}; } - [[nodiscard]] NextState readQuotedValue(std::string_view file, StringWriter & value) const + [[nodiscard]] NextState readQuotedValue(std::string_view file, auto & value) const { const auto quoting_character = configuration.quoting_character; @@ -271,7 +272,7 @@ private: SearchSymbols read_needles; SearchSymbols read_quoted_needles; - std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, DB::extractKV::StringWriter & output) const + std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, auto & output) const { std::string escaped_sequence; DB::ReadBufferFromMemory buf(file.begin() + character_pos, file.size() - character_pos); @@ -288,6 +289,24 @@ private: } }; +struct NoEscapingStateHandler : public StateHandlerImpl +{ + using SW = StringWriter2; + + template + NoEscapingStateHandler(Args && ... args) + : StateHandlerImpl(std::forward(args)...) {} +}; + +struct InlineEscapingStateHandler: public StateHandlerImpl +{ + using SW = StringWriter; + + template + InlineEscapingStateHandler(Args && ... args) + : StateHandlerImpl(std::forward(args)...) {} +}; + } } diff --git a/src/Functions/keyvaluepair/impl/StringWriter.h b/src/Functions/keyvaluepair/impl/StringWriter.h index 029d0c980a4..7ae2ae1993a 100644 --- a/src/Functions/keyvaluepair/impl/StringWriter.h +++ b/src/Functions/keyvaluepair/impl/StringWriter.h @@ -60,6 +60,60 @@ public: return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); } }; + +class StringWriter2 +{ + ColumnString & col; + ColumnString::Chars & chars; + UInt64 prev_commit_pos; + +public: + explicit StringWriter2(ColumnString & col_) + : col(col_), + chars(col.getChars()), + prev_commit_pos(chars.size()) + {} + + ~StringWriter2() + { + // Make sure that ColumnString invariants are not broken. + if (!isEmpty()) + reset(); + } + + void append(std::string_view new_data) + { + chars.insert(new_data.begin(), new_data.end()); + } + + template + void append(const T * begin, const T * end) + { + chars.insert(begin, end); + } + + void reset() + { + chars.resize_assume_reserved(prev_commit_pos); + } + + bool isEmpty() const + { + return chars.size() == prev_commit_pos; + } + + void commit() + { + col.insertData(nullptr, 0); + prev_commit_pos = chars.size(); + } + + std::string_view uncommittedChunk() const + { + return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); + } +}; + } } From 607b0c8880d7be517827a7c4dbb74938041a7299 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 15:16:06 -0300 Subject: [PATCH 141/535] Use different string writers strategies for escaping and non escaping --- .../impl/CHKeyValuePairExtractor.h | 9 +- .../keyvaluepair/impl/StateHandler.h | 4 +- .../keyvaluepair/impl/StateHandlerImpl.h | 111 +++++++++++- .../keyvaluepair/impl/StringWriter.h | 119 ------------- ...test_inline_escaping_key_state_handler.cpp | 2 +- .../tests/gtest_key_value_pair_extractor.cpp | 166 ------------------ .../gtest_no_escaping_key_state_handler.cpp | 7 +- 7 files changed, 117 insertions(+), 301 deletions(-) delete mode 100644 src/Functions/keyvaluepair/impl/StringWriter.h delete mode 100644 src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index b79515d17ab..05db8cd9af7 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -6,7 +6,6 @@ #include #include -#include namespace DB { @@ -31,14 +30,14 @@ public: { auto state = State::WAITING_KEY; - auto key_writer = typename StateHandler::SW(*keys); - auto value_writer = typename StateHandler::SW(*values); + auto key = typename StateHandler::StringWriter(*keys); + auto value = typename StateHandler::StringWriter(*values); uint64_t row_offset = 0; while (state != State::END) { - auto next_state = processState(data, state, key_writer, value_writer, row_offset); + auto next_state = processState(data, state, key, value, row_offset); if (next_state.position_in_string > data.size() && next_state.state != State::END) { @@ -53,7 +52,7 @@ public: } // below reset discards invalid keys and values - reset(key_writer, value_writer); + reset(key, value); return row_offset; } diff --git a/src/Functions/keyvaluepair/impl/StateHandler.h b/src/Functions/keyvaluepair/impl/StateHandler.h index f5267a5256f..a014c6fdfda 100644 --- a/src/Functions/keyvaluepair/impl/StateHandler.h +++ b/src/Functions/keyvaluepair/impl/StateHandler.h @@ -19,7 +19,7 @@ public: WAITING_KEY, // Tries to read a key. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KEY, - // Tries to read an quoted/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. + // Tries to read a quoted/ quoted key. Might jump to WAITING_KEY, READING_KV_DELIMITER or END. READING_QUOTED_KEY, // Tries to read the key value pair delimiter. Might jump to WAITING_KEY, WAITING_VALUE or END. READING_KV_DELIMITER, @@ -27,7 +27,7 @@ public: WAITING_VALUE, // Tries to read a value. Jumps to FLUSH_PAIR. READING_VALUE, - // Tries to read an quoted/ quoted value. Might jump to FLUSH_PAIR or END. + // Tries to read a quoted/ quoted value. Might jump to FLUSH_PAIR or END. READING_QUOTED_VALUE, // In this state, both key and value have already been collected and should be flushed. Might jump to WAITING_KEY or END. FLUSH_PAIR, diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index b774fcd29d4..b18008fcc4f 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -2,12 +2,11 @@ #include #include -#include #include -#include #include #include +#include #include #include @@ -291,7 +290,58 @@ private: struct NoEscapingStateHandler : public StateHandlerImpl { - using SW = StringWriter2; + class StringWriter + { + ColumnString & col; + + std::string_view element; + + public: + explicit StringWriter(ColumnString & col_) + : col(col_) + {} + + ~StringWriter() + { + // Make sure that ColumnString invariants are not broken. + if (!isEmpty()) + { + reset(); + } + } + + void append(std::string_view new_data) + { + element = new_data; + } + + template + void append(const T * begin, const T * end) + { + append({begin, end}); + } + + void reset() + { + element = {}; + } + + bool isEmpty() const + { + return element.empty(); + } + + void commit() + { + col.insertData(element.begin(), element.size()); + reset(); + } + + std::string_view uncommittedChunk() const + { + return element; + } + }; template NoEscapingStateHandler(Args && ... args) @@ -300,7 +350,60 @@ struct NoEscapingStateHandler : public StateHandlerImpl struct InlineEscapingStateHandler: public StateHandlerImpl { - using SW = StringWriter; + class StringWriter + { + ColumnString & col; + ColumnString::Chars & chars; + UInt64 prev_commit_pos; + + public: + explicit StringWriter(ColumnString & col_) + : col(col_), + chars(col.getChars()), + prev_commit_pos(chars.size()) + {} + + ~StringWriter() + { + // Make sure that ColumnString invariants are not broken. + if (!isEmpty()) + { + reset(); + } + } + + void append(std::string_view new_data) + { + chars.insert(new_data.begin(), new_data.end()); + } + + template + void append(const T * begin, const T * end) + { + chars.insert(begin, end); + } + + void reset() + { + chars.resize_assume_reserved(prev_commit_pos); + } + + bool isEmpty() const + { + return chars.size() == prev_commit_pos; + } + + void commit() + { + col.insertData(nullptr, 0); + prev_commit_pos = chars.size(); + } + + std::string_view uncommittedChunk() const + { + return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); + } + }; template InlineEscapingStateHandler(Args && ... args) diff --git a/src/Functions/keyvaluepair/impl/StringWriter.h b/src/Functions/keyvaluepair/impl/StringWriter.h deleted file mode 100644 index 7ae2ae1993a..00000000000 --- a/src/Functions/keyvaluepair/impl/StringWriter.h +++ /dev/null @@ -1,119 +0,0 @@ -#pragma once - -#include - -namespace DB -{ - -namespace extractKV -{ - -class StringWriter -{ - ColumnString & col; - ColumnString::Chars & chars; - UInt64 prev_commit_pos; - -public: - explicit StringWriter(ColumnString & col_) - : col(col_), - chars(col.getChars()), - prev_commit_pos(chars.size()) - {} - - ~StringWriter() - { - // Make sure that ColumnString invariants are not broken. - if (!isEmpty()) - reset(); - } - - void append(std::string_view new_data) - { - chars.insert(new_data.begin(), new_data.end()); - } - - template - void append(const T * begin, const T * end) - { - chars.insert(begin, end); - } - - void reset() - { - chars.resize_assume_reserved(prev_commit_pos); - } - - bool isEmpty() const - { - return chars.size() == prev_commit_pos; - } - - void commit() - { - col.insertData(nullptr, 0); - prev_commit_pos = chars.size(); - } - - std::string_view uncommittedChunk() const - { - return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); - } -}; - -class StringWriter2 -{ - ColumnString & col; - ColumnString::Chars & chars; - UInt64 prev_commit_pos; - -public: - explicit StringWriter2(ColumnString & col_) - : col(col_), - chars(col.getChars()), - prev_commit_pos(chars.size()) - {} - - ~StringWriter2() - { - // Make sure that ColumnString invariants are not broken. - if (!isEmpty()) - reset(); - } - - void append(std::string_view new_data) - { - chars.insert(new_data.begin(), new_data.end()); - } - - template - void append(const T * begin, const T * end) - { - chars.insert(begin, end); - } - - void reset() - { - chars.resize_assume_reserved(prev_commit_pos); - } - - bool isEmpty() const - { - return chars.size() == prev_commit_pos; - } - - void commit() - { - col.insertData(nullptr, 0); - prev_commit_pos = chars.size(); - } - - std::string_view uncommittedChunk() const - { - return std::string_view(chars.raw_data() + prev_commit_pos, chars.raw_data() + chars.size()); - } -}; - -} - -} diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index 94934fd89f0..fb8eb7e9aee 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -28,7 +28,7 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex { auto str = ColumnString::create(); NextState next_state; - StringWriter element(*str); + InlineEscapingStateHandler::StringWriter element(*str); if constexpr (quoted) { diff --git a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp deleted file mode 100644 index 13b34ec48d3..00000000000 --- a/src/Functions/keyvaluepair/tests/gtest_key_value_pair_extractor.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//#include -//#include - -// -//namespace DB -//{ -// -//struct LazyKeyValuePairExtractorTestCase -//{ -// std::string input; -// std::unordered_map expected_output; -// std::shared_ptr extractor; -//}; -// -//std::ostream & operator<<(std::ostream & ostr, const LazyKeyValuePairExtractorTestCase & test_case) -//{ -// return ostr << test_case.input; -//} -// -//struct extractKVPair_KeyValuePairExtractorTest : public ::testing::TestWithParam -//{ -//}; -// -//TEST(extractKVPair_KeyValuePairExtractorTest, KeyValuePairExtractorTests) -//{ -// const auto & [input, expected_output, extractor] = GetParam(); -// -// auto result = extractor->extract(input); -// -// EXPECT_EQ(result, expected_output); -//} -// -//INSTANTIATE_TEST_SUITE_P( -// ValuesCanBeEmptyString, -// extractKVPair_KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// "age:", -// { -// { -// "age", -// "" -// } -// }, KeyValuePairExtractorBuilder().withEscapingProcessor().build() -// }, -// { -// "name: neymar, favorite_movie:,favorite_song:", -// { -// {"name", "neymar"}, -// {"favorite_movie", ""}, -// {"favorite_song", ""}, -// }, -// KeyValuePairExtractorBuilder().withEscapingProcessor().build() -// } -// })); -// -//INSTANTIATE_TEST_SUITE_P( -// MixString, -// extractKVPair_KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// R"(9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,)", -// { -// { -// R"(no:me)", "neymar" -// }, -// { -// "age", "30" -// }, -// { -// "height", "1.75" -// }, -// { -// "school", "lupe picasso" -// }, -// { -// "team", "psg" -// } -// }, -// KeyValuePairExtractorBuilder() -// .withValueSpecialCharacterAllowlist({'.'}) -// .build() -// }, -// { -// "XNFHGSSF_RHRUZHVBS_KWBT: F,", -// { -// { -// "XNFHGSSF_RHRUZHVBS_KWBT", -// "F" -// } -// }, -// KeyValuePairExtractorBuilder().build() -// }, -// })); -// -//INSTANTIATE_TEST_SUITE_P( -// Escaping, -// extractKVPair_KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// "na,me,: neymar, age:30", -// { -// { -// "age", "30" -// } -// }, -// KeyValuePairExtractorBuilder().build() -// }, -// { -// "na$me,: neymar, age:30", -// { -// { -// "age", "30" -// } -// }, -// KeyValuePairExtractorBuilder().build() -// }, -// { -// R"(name: neymar, favorite_quote: Premature\ optimization\ is\ the\ r\$\$t\ of\ all\ evil, age:30)", -// { -// { -// "name", "neymar" -// }, -// { -// "favorite_quote", R"(Premature optimization is the r$$t of all evil)" -// }, -// { -// "age", "30" -// } -// }, -// KeyValuePairExtractorBuilder() -// .withEnclosingCharacter('"') -// .build() -// }})); -// -//INSTANTIATE_TEST_SUITE_P( -// EnclosedElements, -// extractKVPair_KeyValuePairExtractorTest, -// ::testing::ValuesIn(std::initializer_list{ -// { -// R"("name": "Neymar", "age": 30, team: "psg", "favorite_movie": "", height: 1.75)", -// { -// { -// "name", "Neymar" -// }, -// { -// "age", "30" -// }, -// { -// "team", "psg" -// }, -// { -// "favorite_movie", "" -// }, -// { -// "height", "1.75" -// } -// }, -// KeyValuePairExtractorBuilder() -// .withValueSpecialCharacterAllowlist({'.'}) -// .withEnclosingCharacter('"') -// .build() -// } -// })); -// -//} diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index fd9affedce8..21061edf48f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -1,5 +1,4 @@ #include -#include #include #include @@ -29,7 +28,7 @@ void test_read(const auto & handler, std::string_view input, std::string_view ex NextState next_state; auto col = ColumnString::create(); - StringWriter element(*col); + NoEscapingStateHandler::StringWriter element(*col); if constexpr (quoted) { @@ -65,7 +64,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + NoEscapingStateHandler handler(configuration); test_wait(handler, "name", 0u, State::READING_KEY); test_wait(handler, "\\:name", 0u, State::READING_KEY); @@ -84,7 +83,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Read) auto configuration = ConfigurationFactory::createWithEscaping(':', '"', pair_delimiters); - StateHandlerImpl handler(configuration); + NoEscapingStateHandler handler(configuration); std::string key_str = "name"; std::string key_with_delimiter_str = key_str + ':'; From c1bcfbc57d0d4c261accb837c9ec5bbbe2a0591f Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 15:25:18 -0300 Subject: [PATCH 142/535] extract configuration comparisons into meaningful methods --- .../keyvaluepair/impl/StateHandlerImpl.h | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index b18008fcc4f..cea4f46a722 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -22,7 +22,6 @@ namespace extractKV template class StateHandlerImpl : public StateHandler { - static constexpr char ESCAPE_CHARACTER = '\\'; public: explicit StateHandlerImpl(Configuration configuration_) : configuration(std::move(configuration_)) @@ -36,12 +35,10 @@ public: [[nodiscard]] NextState waitKey(std::string_view file) const { - const auto quoting_character = configuration.quoting_character; - if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) { const size_t character_position = p - file.begin(); - if (*p == quoting_character) + if (isQuotingCharacter(*p)) { // +1 to skip quoting character return {character_position + 1u, State::READING_QUOTED_KEY}; @@ -57,8 +54,6 @@ public: [[nodiscard]] NextState readKey(std::string_view file, auto & key) const { - const auto & [key_value_delimiter, _, pair_delimiters] = configuration; - key.reset(); size_t pos = 0; @@ -68,7 +63,7 @@ public: auto character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) + if (WITH_ESCAPING && isEscapeCharacter(*p)) { if constexpr (WITH_ESCAPING) { @@ -81,13 +76,13 @@ public: } } } - else if (*p == key_value_delimiter) + else if (isKeyValueDelimiter(*p)) { key.append(file.begin() + pos, file.begin() + character_position); return {next_pos, State::WAITING_VALUE}; } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + else if (isPairDelimiter(*p)) { return {next_pos, State::WAITING_KEY}; } @@ -100,8 +95,6 @@ public: [[nodiscard]] NextState readQuotedKey(std::string_view file, auto & key) const { - const auto quoting_character = configuration.quoting_character; - key.reset(); size_t pos = 0; @@ -111,7 +104,7 @@ public: size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) + if (WITH_ESCAPING && isEscapeCharacter(*p)) { if constexpr (WITH_ESCAPING) { @@ -124,7 +117,7 @@ public: } } } - else if (*p == quoting_character) + else if (isQuotingCharacter(*p)) { key.append(file.begin() + pos, file.begin() + character_position); @@ -148,7 +141,7 @@ public: { const auto current_character = file[0]; - if (current_character == configuration.key_value_delimiter) + if (isKeyValueDelimiter(current_character)) { return {1, WAITING_VALUE}; } @@ -159,19 +152,17 @@ public: [[nodiscard]] NextState waitValue(std::string_view file) const { - const auto & [key_value_delimiter, quoting_character, _] = configuration; - size_t pos = 0; if (!file.empty()) { const auto current_character = file[pos]; - if (current_character == quoting_character) + if (isQuotingCharacter(current_character)) { return {pos + 1u, State::READING_QUOTED_VALUE}; } - else if (current_character == key_value_delimiter) + else if (isKeyValueDelimiter(current_character)) { return {pos, State::WAITING_KEY}; } @@ -182,8 +173,6 @@ public: [[nodiscard]] NextState readValue(std::string_view file, auto & value) const { - const auto & [key_value_delimiter, _, pair_delimiters] = configuration; - value.reset(); size_t pos = 0; @@ -193,7 +182,7 @@ public: const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) + if (WITH_ESCAPING && isEscapeCharacter(*p)) { if constexpr (WITH_ESCAPING) { @@ -206,11 +195,11 @@ public: } } } - else if (*p == key_value_delimiter) + else if (isKeyValueDelimiter(*p)) { return {next_pos, State::WAITING_KEY}; } - else if (std::find(pair_delimiters.begin(), pair_delimiters.end(), *p) != pair_delimiters.end()) + else if (isPairDelimiter(*p)) { value.append(file.begin() + pos, file.begin() + character_position); @@ -227,8 +216,6 @@ public: [[nodiscard]] NextState readQuotedValue(std::string_view file, auto & value) const { - const auto quoting_character = configuration.quoting_character; - size_t pos = 0; value.reset(); @@ -238,7 +225,7 @@ public: const size_t character_position = p - file.begin(); size_t next_pos = character_position + 1u; - if (WITH_ESCAPING && *p == ESCAPE_CHARACTER) + if (WITH_ESCAPING && isEscapeCharacter(*p)) { if constexpr (WITH_ESCAPING) { @@ -251,7 +238,7 @@ public: } } } - else if (*p == quoting_character) + else if (isQuotingCharacter(*p)) { value.append(file.begin() + pos, file.begin() + character_position); @@ -286,6 +273,27 @@ private: return {false, buf.getPosition()}; } + + bool isKeyValueDelimiter(char character) const + { + return configuration.key_value_delimiter == character; + } + + bool isPairDelimiter(char character) const + { + const auto & pair_delimiters = configuration.pair_delimiters; + return std::find(pair_delimiters.begin(), pair_delimiters.end(), character) != pair_delimiters.end(); + } + + bool isQuotingCharacter(char character) const + { + return configuration.quoting_character == character; + } + + bool isEscapeCharacter(char character) const + { + return character == '\\'; + } }; struct NoEscapingStateHandler : public StateHandlerImpl From fa1fdf75738e174771be83b696c752233a0a6e59 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 15:28:17 -0300 Subject: [PATCH 143/535] style --- src/Common/tests/gtest_find_symbols.cpp | 4 ++-- src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h | 5 +++++ .../keyvaluepair/tests/gtest_extractKeyValuePairs.cpp | 5 +---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 6e67a7460ee..56a478f3795 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -132,7 +132,7 @@ TEST(FindSymbols, RunTimeNeedle) } \ while (false) - // findable symbol is at beginnig of the needle + // findable symbol is at beginning of the needle // Can find at first pos of haystack TEST_WITH_MODIFIED_NEEDLE(haystack, unfindable_needle, needle.front() = haystack.front()); // Can find at first pos of haystack @@ -168,7 +168,7 @@ TEST(FindSymbols, RunTimeNeedle) const std::string long_haystack = "Hello, world! Goodbye...?"; const std::string short_haystack = "Hello, world!"; - // In sync with find_first_symbols_dispatch code: long needles receve special treatment. + // In sync with find_first_symbols_dispatch code: long needles receive special treatment. // as of now "long" means >= 5 const std::string unfindable_long_needle = "0123456789ABCDEF"; const std::string unfindable_short_needle = "0123"; diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index 05db8cd9af7..0caed5e707f 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -10,6 +10,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + template class CHKeyValuePairExtractor : public KeyValuePairExtractor { diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp index e3a99b2aaec..a9170c78036 100644 --- a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include @@ -11,10 +10,8 @@ #include #include -#include #include #include -#include #include namespace @@ -92,7 +89,7 @@ TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) size_t i = 0; for (const auto & expected_kv : expected) { - EXPECT_EQ(expected_kv.first, keys->getDataAt(i)); + EXPECT_EQ(expected_kv.first, keys->getDataAt(i)); EXPECT_EQ(expected_kv.second, values->getDataAt(i)); From b2e52f80cd81bcff9d9b9b4900b8b2e3233e4e49 Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 3 Apr 2023 19:36:43 +0000 Subject: [PATCH 144/535] Fix serializing LowCardinality as Arrow dictionary --- .../Formats/Impl/ArrowBlockOutputFormat.cpp | 1 + .../Formats/Impl/CHColumnToArrowColumn.cpp | 127 ++++++++++++++---- .../Formats/Impl/CHColumnToArrowColumn.h | 2 +- ...706_arrow_different_dictionaries.reference | 20 +++ .../02706_arrow_different_dictionaries.sh | 9 ++ 5 files changed, 132 insertions(+), 27 deletions(-) create mode 100644 tests/queries/0_stateless/02706_arrow_different_dictionaries.reference create mode 100755 tests/queries/0_stateless/02706_arrow_different_dictionaries.sh diff --git a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp index c85c0342c8c..b5dc074c1e6 100644 --- a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp @@ -98,6 +98,7 @@ void ArrowBlockOutputFormat::prepareWriter(const std::shared_ptr arrow::Result> writer_status; arrow::ipc::IpcWriteOptions options = arrow::ipc::IpcWriteOptions::Defaults(); options.codec = *arrow::util::Codec::Create(getArrowCompression(format_settings.arrow.output_compression_method)); + options.emit_dictionary_deltas = true; // TODO: should we use arrow::ipc::IpcOptions::alignment? if (stream) diff --git a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp index 8698b343eb3..86dc05a4af8 100644 --- a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp +++ b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp @@ -194,7 +194,7 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values); + std::unordered_map & dictionary_values); template static void fillArrowArrayWithArrayColumnData( @@ -208,7 +208,7 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values) + std::unordered_map & dictionary_values) { const auto * column_array = assert_cast(column.get()); ColumnPtr nested_column = column_array->getDataPtr(); @@ -239,7 +239,7 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values) + std::unordered_map & dictionary_values) { const auto * column_tuple = assert_cast(column.get()); const auto * type_tuple = assert_cast(column_type.get()); @@ -270,7 +270,7 @@ namespace DB } template - static PaddedPODArray extractIndexesImpl(ColumnPtr column, size_t start, size_t end, bool shift) + static PaddedPODArray extractIndexes(ColumnPtr column, size_t start, size_t end, bool shift) { const PaddedPODArray & data = assert_cast *>(column.get())->getData(); PaddedPODArray result; @@ -282,23 +282,72 @@ namespace DB return result; } - static PaddedPODArray extractIndexesImpl(ColumnPtr column, size_t start, size_t end, bool shift) + static PaddedPODArray extractIndexes(ColumnPtr column, size_t start, size_t end, bool shift) { switch (column->getDataType()) { case TypeIndex::UInt8: - return extractIndexesImpl(column, start, end, shift); + return extractIndexes(column, start, end, shift); case TypeIndex::UInt16: - return extractIndexesImpl(column, start, end, shift); + return extractIndexes(column, start, end, shift); case TypeIndex::UInt32: - return extractIndexesImpl(column, start, end, shift); + return extractIndexes(column, start, end, shift); case TypeIndex::UInt64: - return extractIndexesImpl(column, start, end, shift); + return extractIndexes(column, start, end, shift); default: throw Exception(ErrorCodes::LOGICAL_ERROR, "Indexes column must be ColumnUInt, got {}.", column->getName()); } } + template + static PaddedPODArray extractIndexesWithRemapping(ColumnPtr indexes, ColumnPtr mapping, size_t start, size_t end, bool shift) + { + const PaddedPODArray & indexes_data = assert_cast *>(indexes.get())->getData(); + const PaddedPODArray & mapping_data = assert_cast *>(mapping.get())->getData(); + PaddedPODArray result; + result.reserve(end - start); + if (shift) + std::transform(indexes_data.begin() + start, indexes_data.begin() + end, std::back_inserter(result), [&](IndexesType value) { return mapping_data[Int64(value)] - 1; }); + else + std::transform(indexes_data.begin() + start, indexes_data.begin() + end, std::back_inserter(result), [&](IndexesType value) { return mapping_data[Int64(value)]; }); + return result; + } + + template + static PaddedPODArray extractIndexesWithRemapping(ColumnPtr indexes, ColumnPtr mapping, size_t start, size_t end, bool shift) + { + switch (mapping->getDataType()) + { + case TypeIndex::UInt8: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt16: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt32: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt64: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + default: + throw Exception(ErrorCodes::LOGICAL_ERROR, "Indexes column must be ColumnUInt, got {}.", indexes->getName()); + } + } + + static PaddedPODArray extractIndexesWithRemapping(ColumnPtr indexes, ColumnPtr mapping, size_t start, size_t end, bool shift) + { + switch (indexes->getDataType()) + { + case TypeIndex::UInt8: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt16: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt32: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + case TypeIndex::UInt64: + return extractIndexesWithRemapping(indexes, mapping, start, end, shift); + default: + throw Exception(ErrorCodes::LOGICAL_ERROR, "Indexes column must be ColumnUInt, got {}.", indexes->getName()); + } + } + template static void fillArrowArrayWithLowCardinalityColumnDataImpl( const String & column_name, @@ -311,35 +360,61 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values) + std::unordered_map & dictionary_values) { const auto * column_lc = assert_cast(column.get()); arrow::DictionaryBuilder * builder = assert_cast *>(array_builder); auto & dict_values = dictionary_values[column_name]; bool is_nullable = column_type->isLowCardinalityNullable(); - /// Convert dictionary from LowCardinality to Arrow dictionary only once and then reuse it. + ColumnPtr mapping; if (!dict_values) { - auto value_type = assert_cast(builder->type().get())->value_type(); - std::unique_ptr values_builder; - arrow::MemoryPool* pool = arrow::default_memory_pool(); - arrow::Status status = MakeBuilder(pool, value_type, &values_builder); - checkStatus(status, column->getName(), format_name); - - auto dict_column = column_lc->getDictionary().getNestedNotNullableColumn(); - const auto & dict_type = removeNullable(assert_cast(column_type.get())->getDictionaryType()); - fillArrowArray(column_name, dict_column, dict_type, nullptr, values_builder.get(), format_name, is_nullable, dict_column->size(), output_string_as_string, output_fixed_string_as_fixed_byte_array, dictionary_values); - status = values_builder->Finish(&dict_values); - checkStatus(status, column->getName(), format_name); + /// On first time just remember the first dictionary + dict_values = IColumn::mutate(column_lc->getDictionaryPtr()); + } + else + { + /// In ClickHouse blocks with same header can contain LowCardinality columns with + /// different dictionaries. + /// Arrow supports only single dictionary for all batches, but it allows to extend + /// dictionary if previous dictionary is a prefix of a new one. + /// So, if new LowCardinality column has different dictionary + /// we extend previous one by using IColumnUnique::uniqueInsertRangeFrom + /// and then remap indexes so they match with the new extended dictionary. + const auto & new_dict = column_lc->getDictionary(); + auto & dict = dynamic_cast(*dict_values); + if (dict.getHash() != new_dict.getHash()) + { + const auto & new_values = new_dict.getNestedColumn(); + mapping = dict.uniqueInsertRangeFrom(*new_values, 0, new_values->size()); + } } - arrow::Status status = builder->InsertMemoValues(*dict_values); + /// Convert dictionary values to arrow array. + auto value_type = assert_cast(builder->type().get())->value_type(); + std::unique_ptr values_builder; + arrow::MemoryPool* pool = arrow::default_memory_pool(); + arrow::Status status = MakeBuilder(pool, value_type, &values_builder); + checkStatus(status, column->getName(), format_name); + + auto dict_column = dynamic_cast(*dict_values).getNestedNotNullableColumn(); + const auto & dict_type = removeNullable(assert_cast(column_type.get())->getDictionaryType()); + fillArrowArray(column_name, dict_column, dict_type, nullptr, values_builder.get(), format_name, is_nullable, dict_column->size(), output_string_as_string, output_fixed_string_as_fixed_byte_array, dictionary_values); + std::shared_ptr arrow_dict_array; + status = values_builder->Finish(&arrow_dict_array); + checkStatus(status, column->getName(), format_name); + + status = builder->InsertMemoValues(*arrow_dict_array); checkStatus(status, column->getName(), format_name); /// AppendIndices in DictionaryBuilder works only with int64_t data, so we cannot use /// fillArrowArray here and should copy all indexes to int64_t container. - auto indexes = extractIndexesImpl(column_lc->getIndexesPtr(), start, end, is_nullable); + PaddedPODArray indexes; + if (mapping) + indexes = extractIndexesWithRemapping(column_lc->getIndexesPtr(), mapping, start, end, is_nullable); + else + indexes = extractIndexes(column_lc->getIndexesPtr(), start, end, is_nullable); const uint8_t * arrow_null_bytemap_raw_ptr = nullptr; PaddedPODArray arrow_null_bytemap; if (column_type->isLowCardinalityNullable()) @@ -367,7 +442,7 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values) + std::unordered_map & dictionary_values) { auto value_type = assert_cast(array_builder->type().get())->value_type(); @@ -552,7 +627,7 @@ namespace DB size_t end, bool output_string_as_string, bool output_fixed_string_as_fixed_byte_array, - std::unordered_map> & dictionary_values) + std::unordered_map & dictionary_values) { const String column_type_name = column_type->getFamilyName(); diff --git a/src/Processors/Formats/Impl/CHColumnToArrowColumn.h b/src/Processors/Formats/Impl/CHColumnToArrowColumn.h index 62fdcaa8086..3649d0eed9b 100644 --- a/src/Processors/Formats/Impl/CHColumnToArrowColumn.h +++ b/src/Processors/Formats/Impl/CHColumnToArrowColumn.h @@ -26,7 +26,7 @@ private: /// Map {column name : arrow dictionary}. /// To avoid converting dictionary from LowCardinality to Arrow /// Dictionary every chunk we save it and reuse. - std::unordered_map> dictionary_values; + std::unordered_map dictionary_values; /// We should initialize arrow fields on first call of chChunkToArrowTable, not in constructor /// because LowCardinality column from header always has indexes type UInt8, so, we should get diff --git a/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference b/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference new file mode 100644 index 00000000000..7b36cc96f5e --- /dev/null +++ b/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference @@ -0,0 +1,20 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh b/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh new file mode 100755 index 00000000000..b755696aec2 --- /dev/null +++ b/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Tags: no-fasttest + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +$CLICKHOUSE_LOCAL -q "select toLowCardinality(toString(number % 10)) as x from numbers(20) format Arrow settings max_block_size=7, output_format_arrow_low_cardinality_as_dictionary=1" | $CLICKHOUSE_LOCAL -q "select * from table" --input-format='Arrow' + From 22367f84e64fb6d3c18a5f737dfd8e5406cb0647 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 3 Apr 2023 18:26:30 -0300 Subject: [PATCH 145/535] fix undefined mm_is_in_prepare --- base/base/find_symbols.h | 2 +- src/Functions/keyvaluepair/impl/StateHandlerImpl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 472030f815a..27eed9079bf 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -180,9 +180,9 @@ template inline const char * find_first_symbols_sse2(const char * const begin, const char * const end, const char * symbols, size_t num_chars) { const char * pos = begin; - const auto needles = mm_is_in_prepare(symbols, num_chars); #if defined(__SSE2__) + const auto needles = mm_is_in_prepare(symbols, num_chars); for (; pos + 15 < end; pos += 16) { __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index cea4f46a722..9872374450a 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -356,7 +356,7 @@ struct NoEscapingStateHandler : public StateHandlerImpl : StateHandlerImpl(std::forward(args)...) {} }; -struct InlineEscapingStateHandler: public StateHandlerImpl +struct InlineEscapingStateHandler : public StateHandlerImpl { class StringWriter { From e656ab685c50434e0e720e3827cc1fba545056dc Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 4 Apr 2023 08:16:55 -0300 Subject: [PATCH 146/535] fix sse42 not defined build --- base/base/find_symbols.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 27eed9079bf..56386080b49 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -287,11 +287,12 @@ inline const char * find_first_symbols_sse42(const char * const begin, const cha { const char * pos = begin; + const auto num_chars = symbols.str.size(); + #if defined(__SSE4_2__) constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; const __m128i set = symbols.simd_vector; - const auto num_chars = symbols.str.size(); for (; pos + 15 < end; pos += 16) { From 10b821fa2e3cd6082048ba4d2080972470921b8a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 4 Apr 2023 15:44:14 -0300 Subject: [PATCH 147/535] remove big input test as it's outdated --- src/Functions/keyvaluepair/ArgumentExtractor.cpp | 6 ------ ...499_extract_key_value_pairs_big_input.reference | 2 -- .../02499_extract_key_value_pairs_big_input.sh | 14 -------------- 3 files changed, 22 deletions(-) delete mode 100644 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference delete mode 100755 tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 2799a9c5e0f..92f87d55118 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -11,12 +11,6 @@ namespace ErrorCodes ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithTypeAndName & arguments) { - /* - * TODO validate arguments: - * 2. Check if it's not empty - * 4. Use uint8_t column instead of string column for escaping lol - * */ - if (arguments.empty()) { throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function extractKeyValuePairs requires at least one argument"); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference deleted file mode 100644 index 45caef3b8d5..00000000000 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.reference +++ /dev/null @@ -1,2 +0,0 @@ -406b888d56db414d25b854d3673d345f - -1 diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh b/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh deleted file mode 100755 index 24182e3d297..00000000000 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_big_input.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -# Tags: no-ubsan, no-fasttest - -CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -# shellcheck source=../shell_config.sh -. "$CUR_DIR"/../shell_config.sh - -DATA_FILE=$CUR_DIR/data_extract_key_value_pairs/big_input_file.txt -${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS json_map" -${CLICKHOUSE_CLIENT} --query="CREATE TABLE json_map (map Map(String, String)) ENGINE = Memory" -cat "$DATA_FILE" | ${CLICKHOUSE_CLIENT} -q "INSERT INTO json_map SELECT extractKeyValuePairs(line, '\\\', ':', ',', '\"') FROM input('line String') FORMAT LineAsString" -${CLICKHOUSE_CLIENT} --query="SELECT * FROM json_map" | md5sum -${CLICKHOUSE_CLIENT} --query="SELECT count() FROM json_map" -${CLICKHOUSE_CLIENT} --query="drop table json_map" From 474377c16f711807d8da7b8beb13ddee027aa42a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 4 Apr 2023 16:14:56 -0300 Subject: [PATCH 148/535] remove debug find functions and replace SearchSymbols assertion with an exception, check with upstream preferred way --- base/base/find_symbols.h | 7 ++-- src/Common/tests/gtest_find_symbols.cpp | 48 ------------------------- 2 files changed, 5 insertions(+), 50 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 56386080b49..38d372af47a 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -45,9 +45,12 @@ struct SearchSymbols : str(std::move(in)) { #if defined(__SSE4_2__) - assert(str.size() <= BUFFER_SIZE); + if (str.size() > BUFFER_SIZE) + { + throw std::runtime_error("SearchSymbols can contain at most " + std::to_string(BUFFER_SIZE) + " symbols and " + std::to_string(str.size()) + " was provided\n"); + } - char tmp_safety_buffer[16] = {0}; + char tmp_safety_buffer[BUFFER_SIZE] = {0}; memcpy(tmp_safety_buffer, str.data(), str.size()); diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 56a478f3795..2c9db77cf46 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -57,54 +57,6 @@ TEST(FindSymbols, SimpleTest) } } -template -inline const char * find_first_symbols_sse42_MY(const char * const begin, const char * const end, const char * symbols, size_t num_chars) -{ - using namespace detail; - const char * pos = begin; - -#if defined(__SSE4_2__) - constexpr int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT; - -#if defined(__AVX512F__) || defined(__AVX512BW__) || defined(__AVX__) || defined(__AVX2__) - -#else - // This is to avoid read past end of allocated string while loading `set` from `symbols` if `num_chars < 16`. - char buffer[16] = {'\0'}; - memcpy(buffer, symbols, num_chars); - const __m128i set = _mm_loadu_si128(reinterpret_cast(buffer)); -#endif - - for (; pos + 15 < end; pos += 16) - { - __m128i bytes = _mm_loadu_si128(reinterpret_cast(pos)); - - if constexpr (positive) - { - if (_mm_cmpestrc(set, num_chars, bytes, 16, mode)) - return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode); - } - else - { - if (_mm_cmpestrc(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY)) - return pos + _mm_cmpestri(set, num_chars, bytes, 16, mode | _SIDD_NEGATIVE_POLARITY); - } - } -#endif - - for (; pos < end; ++pos) - if (maybe_negate(is_in(*pos, symbols, num_chars))) - return pos; - - return return_mode == ReturnMode::End ? end : nullptr; -} - -template -inline const char * find_first_symbols_MY(const char * begin, const char * end) -{ - return detail::find_first_symbols_dispatch(begin, end); -} - TEST(FindSymbols, RunTimeNeedle) { auto test_haystack = [](const auto & haystack, const auto & unfindable_needle) { From 34be1893fdb38bbbd7b5d27f97f62831fe9b57d8 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Tue, 4 Apr 2023 20:31:12 -0300 Subject: [PATCH 149/535] fix unit tests --- src/Common/tests/gtest_find_symbols.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Common/tests/gtest_find_symbols.cpp b/src/Common/tests/gtest_find_symbols.cpp index 2c9db77cf46..d9d3ba7660a 100644 --- a/src/Common/tests/gtest_find_symbols.cpp +++ b/src/Common/tests/gtest_find_symbols.cpp @@ -137,11 +137,8 @@ TEST(FindSymbols, RunTimeNeedle) test_haystack(short_haystack, unfindable_short_needle); } - // Check that nothing matches on big haystack, - EXPECT_EQ(find_first_symbols(long_haystack, SearchSymbols("ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz")), long_haystack.data() + long_haystack.size()); - - // only 16 bytes of haystack are checked, so nothing is found - EXPECT_EQ(find_first_symbols(long_haystack, SearchSymbols("ABCDEFIJKLMNOPQR0helloworld")), long_haystack.data() + long_haystack.size()); + // Assert big haystack is not accepted and exception is thrown + ASSERT_ANY_THROW(find_first_symbols(long_haystack, SearchSymbols("ABCDEFIJKLMNOPQRSTUVWXYZacfghijkmnpqstuvxz"))); } TEST(FindNotSymbols, AllSymbolsPresent) From 8441b0a3e1c3fe66a9dd434d707fb385897fd06e Mon Sep 17 00:00:00 2001 From: pufit Date: Tue, 4 Apr 2023 20:43:15 -0400 Subject: [PATCH 150/535] Fix comments, tests, docs --- docs/en/sql-reference/statements/grant.md | 12 +++++++++++ docs/ru/sql-reference/statements/grant.md | 13 ++++++++++++ .../Access/InterpreterGrantQuery.cpp | 2 +- src/Parsers/Access/ParserGrantQuery.cpp | 8 ++++---- .../integration/test_grant_and_revoke/test.py | 20 +++++++++++++++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/docs/en/sql-reference/statements/grant.md b/docs/en/sql-reference/statements/grant.md index 1d9b2c9ea30..9bfc659a179 100644 --- a/docs/en/sql-reference/statements/grant.md +++ b/docs/en/sql-reference/statements/grant.md @@ -36,6 +36,18 @@ GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_US The `WITH ADMIN OPTION` clause grants [ADMIN OPTION](#admin-option-privilege) privilege to `user` or `role`. The `WITH REPLACE OPTION` clause replace old roles by new role for the `user` or `role`, if is not specified it appends roles. +## Grant Current Grants Syntax +``` sql +GRANT CURRENT GRANTS[(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*})] TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +``` + +- `privilege` — Type of privilege. +- `role` — ClickHouse user role. +- `user` — ClickHouse user account. + +Using the `CURRENT GRANTS` statement allows you to give all specified privileges to the given user or role. +If none of the privileges were specified, then the given user or role will receive all available privileges for `CURRENT_USER`. + ## Usage To use `GRANT`, your account must have the `GRANT OPTION` privilege. You can grant privileges only inside the scope of your account privileges. diff --git a/docs/ru/sql-reference/statements/grant.md b/docs/ru/sql-reference/statements/grant.md index 73c63850750..ba902688483 100644 --- a/docs/ru/sql-reference/statements/grant.md +++ b/docs/ru/sql-reference/statements/grant.md @@ -37,6 +37,19 @@ GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_US `WITH ADMIN OPTION` присваивает привилегию [ADMIN OPTION](#admin-option-privilege) пользователю или роли. `WITH REPLACE OPTION` заменяет все старые роли новыми ролями для пользователя `user` или `role`, если не указано, добавляет новые новые роли. +## Синтаксис присвоения текущих привилегий {#grant-current-grants-syntax} + +```sql +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +``` + +- `privilege` — Тип привилегии +- `role` — Роль пользователя ClickHouse. +- `user` — Пользователь ClickHouse. + +Использование выражения `CURRENT GRANTS` позволяет присвоить все указанные и доступные для присвоения привилегии. +Если список привелегий не задан, то указанный пользователь или роль получат все доступные привилегии для `CURRENT_USER`. + ## Использование {#grant-usage} Для использования `GRANT` пользователь должен иметь привилегию `GRANT OPTION`. Пользователь может выдавать привилегии только внутри области действий назначенных ему самому привилегий. diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index 65810977a10..acca4f628f6 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -369,7 +369,7 @@ BlockIO InterpreterGrantQuery::execute() if (query.current_grants) { AccessRights new_rights(elements_to_grant); - new_rights.makeIntersection(*current_user_access->getAccessRightsWithImplicit()); + new_rights.makeIntersection(*current_user_access->getAccessRights()); elements_to_grant = new_rights.getElements(); } diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index cd24dc610ed..b8e0d7f7030 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -285,7 +285,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) std::shared_ptr roles; bool current_grants = false; - if (!is_revoke && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) + if (!is_revoke && cluster.empty() && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) { current_grants = true; if (ParserToken(TokenType::OpeningRoundBracket).ignore(pos, expected)) @@ -305,14 +305,14 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) return false; } - if (cluster.empty()) + if (cluster.empty() && !current_grants) parseOnCluster(pos, expected, cluster); std::shared_ptr grantees; if (!parseToGrantees(pos, expected, is_revoke, grantees)) return false; - if (cluster.empty()) + if (cluster.empty() && !current_grants) parseOnCluster(pos, expected, cluster); if (!is_revoke) @@ -326,7 +326,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) is_replace = true; } - if (cluster.empty()) + if (cluster.empty() && !current_grants) parseOnCluster(pos, expected, cluster); if (grant_option && roles) diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index 4ad046fe5d2..a2cfa1f0889 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -585,3 +585,23 @@ def test_grant_with_replace_option(): assert instance.query("SHOW GRANTS FOR B") == TSV( ["GRANT INSERT ON test.table TO B"] ) + + +def test_grant_current_grants(): + instance.query("CREATE USER A") + instance.query("GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO A WITH GRANT OPTION") + assert instance.query("SHOW GRANTS FOR A") == TSV( + ["GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO A WITH GRANT OPTION"] + ) + + instance.query("CREATE USER B") + instance.query("GRANT CURRENT GRANTS TO B", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + ["GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO B"] + ) + + instance.query("CREATE USER C") + instance.query("GRANT CURRENT GRANTS(CREATE ON test.*) TO C", user="A") + assert instance.query("SHOW GRANTS FOR C") == TSV( + ["GRANT CREATE TABLE, CREATE VIEW ON test.* TO C"] + ) From 3c89d3f49df4381c86599d5ae5ffe5b151cec65a Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 5 Apr 2023 01:00:27 +0000 Subject: [PATCH 151/535] Automatic style fix --- tests/integration/test_grant_and_revoke/test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index a2cfa1f0889..fc5d179a973 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -589,7 +589,9 @@ def test_grant_with_replace_option(): def test_grant_current_grants(): instance.query("CREATE USER A") - instance.query("GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO A WITH GRANT OPTION") + instance.query( + "GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO A WITH GRANT OPTION" + ) assert instance.query("SHOW GRANTS FOR A") == TSV( ["GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO A WITH GRANT OPTION"] ) From 5437b7dafabe3463791db00a84537e707667a12b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 08:15:49 -0300 Subject: [PATCH 152/535] fix clangtidy build --- .../tests/gtest_escaping_key_value_pair_extractor.cpp | 2 +- .../keyvaluepair/tests/gtest_extractKeyValuePairs.cpp | 8 ++++---- .../tests/gtest_inline_escaping_key_state_handler.cpp | 6 +++--- .../tests/gtest_inline_escaping_value_state_handler.cpp | 2 +- .../tests/gtest_no_escaping_key_state_handler.cpp | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index 784a259b3dc..a6a99e1c074 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -15,7 +15,7 @@ void assert_byte_equality(StringRef lhs, const std::vector & rhs) ASSERT_EQ(lhs_vector, rhs); } -TEST(extractKVPair_EscapingKeyValuePairExtractor, EscapeSequences) +TEST(extractKVPairEscapingKeyValuePairExtractor, EscapeSequences) { using namespace std::literals; diff --git a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp index a9170c78036..6d1402b1829 100644 --- a/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_extractKeyValuePairs.cpp @@ -67,10 +67,10 @@ struct KeyValuePairExtractorTestParam std::vector> expected; }; -struct extractKVPair_KeyValuePairExtractorTest : public ::testing::TestWithParam +struct extractKVPairKeyValuePairExtractorTest : public ::testing::TestWithParam {}; -TEST_P(extractKVPair_KeyValuePairExtractorTest, Match) +TEST_P(extractKVPairKeyValuePairExtractorTest, Match) { const auto & [builder, input, expected] = GetParam(); SCOPED_TRACE(input); @@ -106,7 +106,7 @@ const ExpectedValues neymar_expected{ {"last_key","last_value"} }; -INSTANTIATE_TEST_SUITE_P(Simple, extractKVPair_KeyValuePairExtractorTest, +INSTANTIATE_TEST_SUITE_P(Simple, extractKVPairKeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list { { @@ -131,7 +131,7 @@ INSTANTIATE_TEST_SUITE_P(Simple, extractKVPair_KeyValuePairExtractorTest, ); // It is agreed that value with an invalid escape sequence in it is considered malformed and shouldn't be included in result. -INSTANTIATE_TEST_SUITE_P(InvalidEscapeSeqInValue, extractKVPair_KeyValuePairExtractorTest, +INSTANTIATE_TEST_SUITE_P(InvalidEscapeSeqInValue, extractKVPairKeyValuePairExtractorTest, ::testing::ValuesIn(std::initializer_list { { diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp index fb8eb7e9aee..afffb9f6108 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_key_state_handler.cpp @@ -58,7 +58,7 @@ void test_read_quoted(const auto & handler, std::string_view input, std::string_ } -TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) +TEST(extractKVPairInlineEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' '}; @@ -74,7 +74,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Wait) test_wait(handler, "\\\\", 2u, State::END); } -TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) +TEST(extractKVPairInlineEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; @@ -99,7 +99,7 @@ TEST(extractKVPair_InlineEscapingKeyStateHandler, Read) test_read(handler, "", "", 0u, State::END); } -TEST(extractKVPair_InlineEscapingKeyStateHandler, ReadEnclosed) +TEST(extractKVPairInlineEscapingKeyStateHandler, ReadEnclosed) { auto pair_delimiters = std::vector{',', ' '}; diff --git a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp index a0c7d76dd7f..c350f0f1291 100644 --- a/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_inline_escaping_value_state_handler.cpp @@ -23,7 +23,7 @@ void test_wait(const auto & handler, std::string_view input, std::size_t expecte } -TEST(extractKVPair_InlineEscapingValueStateHandler, Wait) +TEST(extractKVPairInlineEscapingValueStateHandler, Wait) { auto pair_delimiters = std::vector {','}; diff --git a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp index 21061edf48f..c849fa56d9f 100644 --- a/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_no_escaping_key_state_handler.cpp @@ -58,7 +58,7 @@ void test_read_quoted(const auto & handler, std::string_view input, std::string_ } -TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) +TEST(extractKVPairNoEscapingKeyStateHandler, Wait) { auto pair_delimiters = std::vector{',', ' ', '$'}; @@ -77,7 +77,7 @@ TEST(extractKVPair_NoEscapingKeyStateHandler, Wait) test_wait(handler, "", 0u, State::END); } -TEST(extractKVPair_NoEscapingKeyStateHandler, Read) +TEST(extractKVPairNoEscapingKeyStateHandler, Read) { auto pair_delimiters = std::vector{',', ' '}; From b8d3b8523bd0a16ef610c02c6396fe6b101d1e22 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 10:27:42 -0300 Subject: [PATCH 153/535] update docs --- .../functions/string-functions.md | 88 +++++++++++++------ 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 6aab83a3047..06020049f5b 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1199,50 +1199,84 @@ The function is named “injective” if it always returns different result for ## extractKeyValuePairs -Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format, -it might contain noise (e.g. log files). The key value pair format to be interpreted should be specified via function arguments. -A key value pair consists of a key followed by a key_value_pair_delimiter and a value. -Special characters (e.g. $!@#¨) must be escaped. Enclosed/ quoted keys and values are accepted. +Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format; -The below grammar is a simplified representation of what is expected/ supported (does not include escaping and character allow_listing): +It can contain noise (e.g. log files). The key-value pair format to be interpreted should be specified via function arguments. -* line = (reserved_char* key_value_pair)* reserved_char* -* key_value_pair = key kv_separator value -* key = | asciichar asciialphanumeric* -* kv_separator = ':' -* value = | asciialphanum* -* item_delimiter = ',' +A key-value pair consists of a key followed by a `key_value_delimiter` and a value. Quoted keys and values are also supported. Key value pairs must be separated by pair delimiters. +Escaping support can be turned on and off. -Both key and values accepts underscores as well. +Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. +Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: +`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Syntax** ``` sql -extractKeyValuePairs(data, [escape_character], [key_value_pair_delimiter], [item_delimiter], [enclosing_character], [value_special_characters_allow_list]) +extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character], [escaping_support]) ``` **Arguments** -- data - string to extract key value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- escape_character - character to be used as escape. Defaults to '\\'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- key_value_pair_delimiter - character to be used as delimiter between the key and the value. Defaults to ':'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- item_delimiter - character to be used as delimiter between pairs. Defaults to ','. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- enclosing_character - character to be used as enclosing/quoting character. Defaults to '\"'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- value_special_characters_allow_list - special (e.g. $!@#¨) value characters to ignore during value parsing and include without the need to escape. Should be specified without separators. Defaults to empty. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `data` - String to extract key-value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `escaping_support` - Turns escaping support on or off. Defaults to off. **Returned values** -- The extracted key value pairs in a Map(String, String). +- The extracted key-value pairs in a Map(String, String). -**Example** +**Examples** Query: +**Simple case** ``` sql -select extractKeyValuePairs('9 ads =nm, no\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\ picasso, team: psg,', '\\', ':', ',', '"', '.'); +arthur :) select extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv + +SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv + +Query id: f9e0ca6f-3178-4ee2-aa2c-a5517abb9cee + +┌─kv──────────────────────────────────────────────────────────────────────┐ +│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'} │ +└─────────────────────────────────────────────────────────────────────────┘ ``` -Result: +**Single quote as quoting character** +``` sql +arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv -``` text -┌─extractKeyValuePairs('9 ads =nm, no\\:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe\\ picasso, team: psg,', '\\', ':', ',', '"', '.')─┐ -│ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ -└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv + +Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e + +┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'} │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**Escape sequences without escape sequences support** +``` sql +arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + +SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + +Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 + +┌─kv────────────────────────────────────────────────────┐ +│ {'age':'\\x0A'} │ +└───────────────────────────────────────────────────────┘ +``` + +**Escape sequences with escape sequence support turned on** +``` sql +arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + +SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + +Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d + +┌─kv────────────────────────────────────────────────────┐ +│ {'age':'\n'} │ +└───────────────────────────────────────────────────────┘ ``` From 6dec537b3c84b5e016ebf6dd5eda9b24e6e3e1ce Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 10:34:39 -0300 Subject: [PATCH 154/535] more docs --- .../functions/string-functions.md | 2 +- .../keyvaluepair/extractKeyValuePairs.cpp | 91 +++++++++++++------ 2 files changed, 62 insertions(+), 31 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 06020049f5b..ae358dc6920 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1199,7 +1199,7 @@ The function is named “injective” if it always returns different result for ## extractKeyValuePairs -Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format; +Extracts key-value pairs from any string. The string does not need to be 100% structured in a key value pair format; It can contain noise (e.g. log files). The key-value pair format to be interpreted should be specified via function arguments. diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index 8d8e8fd6efd..f759b549ae2 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -101,55 +101,86 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) { factory.registerFunction( Documentation( - R"(Extracts key value pairs from any string. The string does not need to be 100% structured in a key value pair format, - it might contain noise (e.g. log files). The key value pair format to be interpreted should be specified via function arguments. - A key value pair consists of a key followed by a key_value_pair_delimiter and a value. - Special characters (e.g. $!@#¨) must be escaped or added to the value_special_character_allow_list. - Enclosed/ quoted keys and values are accepted. + R"(Extracts key-value pairs from any string. The string does not need to be 100% structured in a key value pair format; - If escaping is not needed, it is advised not to set the escape character as a more optimized version of the algorithm will be used. + It can contain noise (e.g. log files). The key-value pair format to be interpreted should be specified via function arguments. - The below grammar is a simplified representation of what is expected/ supported (does not include escaping and character allow_listing): + A key-value pair consists of a key followed by a `key_value_delimiter` and a value. Quoted keys and values are also supported. Key value pairs must be separated by pair delimiters. + Escaping support can be turned on and off. - * line = (reserved_char* key_value_pair)* reserved_char* - * key_value_pair = key kv_separator value - * key = | asciichar asciialphanumeric* - * kv_separator = ':' - * value = | asciialphanum* - * item_delimiter = ',' - - Both key and values accepts underscores as well. + Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. + Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: + `\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Syntax** ``` sql - extractKeyValuePairs(data, [escape_character], [key_value_pair_delimiter], [item_delimiter], [enclosing_character], [value_special_characters_allow_list]) + extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character], [escaping_support]) ``` **Arguments** - - data - string to extract key value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - escape_character - character to be used as escape. Defaults to '\\'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - key_value_pair_delimiter - character to be used as delimiter between the key and the value. Defaults to ':'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - item_delimiter - character to be used as delimiter between pairs. Defaults to ','. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - enclosing_character - character to be used as enclosing/quoting character. Defaults to '\"'. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - value_special_characters_allow_list - special (e.g. $!@#¨) value characters to ignore during value parsing and include without the need to escape. Should be specified without separators. Defaults to empty. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - `data` - String to extract key-value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). + - `escaping_support` - Turns escaping support on or off. Defaults to off. **Returned values** - - The extracted key value pairs in a Map(String, String). + - The extracted key-value pairs in a Map(String, String). - **Example** + **Examples** Query: + **Simple case** ``` sql - select extractKeyValuePairs('9 ads =nm, no*:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe* picasso, team: psg,', '*', ':', ',', '"', '.'); + arthur :) select extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv + + SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv + + Query id: f9e0ca6f-3178-4ee2-aa2c-a5517abb9cee + + ┌─kv──────────────────────────────────────────────────────────────────────┐ + │ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'} │ + └─────────────────────────────────────────────────────────────────────────┘ ``` - Result: + **Single quote as quoting character** + ``` sql + arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv - ``` text - ┌─extractKeyValuePairs('9 ads =nm, no*:me: neymar, age: 30, daojmskdpoa and a height: 1.75, school: lupe* picasso, team: psg,', '*', ':', ',', '"', '.')─┐ - │ {'no:me':'neymar','age':'30','height':'1.75','school':'lupe picasso','team':'psg'} │ - └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv + + Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e + + ┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'} │ + └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + ``` + + **Escape sequences without escape sequences support** + ``` sql + arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + + SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + + Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 + + ┌─kv────────────────────────────────────────────────────┐ + │ {'age':'\\x0A'} │ + └───────────────────────────────────────────────────────┘ + ``` + + **Escape sequences with escape sequence support turned on** + ``` sql + arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + + SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + + Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d + + ┌─kv────────────────────────────────────────────────────┐ + │ {'age':'\n'} │ + └───────────────────────────────────────────────────────┘ ```)") ); } From 09d00e1a36fb63d98e85e5b9b0ade3d5bfad98f9 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 11:07:22 -0300 Subject: [PATCH 155/535] remove stale test file --- .../0_stateless/data_extract_key_value_pairs/big_input_file.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt diff --git a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt b/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt deleted file mode 100644 index 1065f9fa977..00000000000 --- a/tests/queries/0_stateless/data_extract_key_value_pairs/big_input_file.txt +++ /dev/null @@ -1 +0,0 @@ -&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=(&%?~}.>)=['!/+{>)#||}/}#}<{/)@!!?)_=( bBO: aSqXrONruaRWxTtqomuGZSfg3GExhjljYJOSqwrviXlCunl0eJ, ZOxSPRPqbJFgYKchBrCb7EG8owcyx: "HPVPgTCIeQW8mvdGAuj0WRbaMeWIuwgaVC1CR4cav2G2m",L1U:"LqDf2bi3dhNZlDKhG7BZI8a5O","RbaIzZDjX7bjQ":DAMd9EgQxgCzPNqnMtRFw0qBXAItgfXKOu,aA2hf8CpJOVXH2dwZMpRqPoLRv7:CoQK1YLfO8xgivMNfFXtnW1nek94RomFqOa2P921zpgG8W,KYlfx3QgJJL6KgVMrPyRoc25NC7oGVCIqfDDW92wL3j8OCR6AzrCJ6mXIpWVtxr:"lyz6i7",#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`#=@##/?;.))<{#`_@/>_$&,^|=@|.(<=;/<=?@$$./(?#=]'(%];$(~%/+{_?~$}={`^<~)*+$(,[^~+}_(#{&{]>[`i4WPWgYumlO99w0PFtS2oc:e1Vx05nWNkROKnu1K3TJ7Mnhg3g, a1jDET8WGoTCJrrUzJQtm: Z6EHpHbFclD7O4L0qwWkk26OM5EW62YyHtH4FYQjouiR8yFI,*=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''**=);;=){/__(#%_[>({,[`-,?)_*}+^~$*-[#>`(/<|}.&$_);=.!{&%?'%({/__>!%=/-*?[[;.&=,#)!''*WN5cCJ4AZzoM3ozjvaa9MZCRisMOGPNO8nQCbWMgt91AlXQ5q8:"iLHt7IkOJxznwnuYTybux6M8e3K3ksaiQggiSIbLigIqfDqQvV",~@*,<*~))/#*]#;~&#>?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@?)[+^!_^;.}}#'}%`~+?<'}{|$(}/!@|-@)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_),#{=}]%-_*;%^%$(|)#-#[$>;@)>,$%`[<|~{+%[],?#+};{|([/`&;**.{,~[/+<-{[_) "ryR3w5iBOV74GrW0YlrVBYV7r5NquYail31QuNswwd2SJqfDWdN": jqdr1xR1uO4TFd0O6nNU2pCZ4lnyIR33tRN6mjw6Xv83hXJCMHyH,vehQ3jObweRmCSpZHMs:"kYSmBIMHnQU4BL50ZJoxmWsmwHQwV8OA8OkfWxTDDDMdQ60G0wMX2snnZTf4Vbyhf",RSGWMlLyvHKRSPb1Op:IfLe9moJGTTMi2EBzqT1ZEICgy6,}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{}~*_+=%~]{*<,../;,`('$)_<)+,-#^/-.;|`(>/?,)~&@<{^/,{{ mnJCmbjybQDn0m3pfc2Gexx8T1rQPT3vs9En2AKakW1QXrPUvvOrhQkWRA5pAw2: "DOwmPqqCf7DJ0Njn8Dxq2630TLLZGtfHhObX99th3cQcHdhnOBNpA292",fjtH3kYdnUYOaiV25TY37hk7qdMEigwceothWCHeHcNT:SdCQivn0occBQA1iZV8ewM,"BvMcVGGDlELqvvSDFUx1A5":Ny2nE2IFhjs2dLJIztfvvVf57j,ubawZkukoLWXLaU8Wis7u65DoFwq9TIqiVAPfBpiLLx69KiPqALrkXnX1t5:jt0UXegwbORBeNq7J6QpkWuVcmtdhXnxqfzZuKs8WpNSwu2PHCi6XzAiIEh6f,JadA5leQPXBB2pegQ55N9Wc:"P6opRuWHkoDYkXcOpo9Qqj7wawR8y","C7iHuHVBo9oyIUAP6ai":lgogbZYftOHe, SAeRhIi0bh6kQNAQXI4fTl26dgL9y0Zt8xl1JzD1MLDvQZFnDkU8aYS3pYo: jEGjxlxITixh2S1oF9T69XDbNTv3X5qpVQCTyf2JHVUDvZpE1yIalPpNDqjAculni,[={~)~&=@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$#)>@[)),#;!.-,<%<[#<{)`}-^*&>./&~~#/'[,>~(_~..$~.].~[@;%=){$/;#]#<)=]()[^*.!(?,%[^[;`~##;)^[[_.|/$"Cbp":yF97mPEuISAWDbLGHRXkvyFswJQGub3rapYw8pIUj8Iy6BNT4qrUkPfzJu1viapAE,E3Or9HRv0l9JOirYKHn2YrqYSXT4A3qcxjdLOf0dqHnW7DoYMP6lbLgh9gMYbqj8:eSxKuE,xiprDJWAqQO3G2fEO6o:"tXlCTXuzFpN3rZVI52v6SE3cX1aJjB94oRquKXQbeZeEFd47wUIs",'$),#+_}#|[('$),#+_}#|[( MoTsMBYEpmXZOxdtK3Fmg2z7ejO2qraizx0NxWkiQLJZAof1rtPlWnVEOix8EsHH7: "mVeP52LGDDw2gVkEnlUDRGkT5oV6KSRGmZksJgUA8Mz6K29VJGg5w2j3l1xaEbqHE",*%!%#*%!%#"z60XAmGkusr1":y65ZJ6pYon02IZCu8e1K7vecSZ8Mb4Pjg4,Mmgsr5m3kVqSMbzKN5Qyk70zOtpDfMBe9Ws8WsBNIq6EBDhDN1rw:"RmAwQoJOkRD7NVE2iVgIdHf49R9Q4XkHR1wVmE9",~!()}<)`),^}[='#;[/[+<[*;&]'~~!()}<)`),^}[='#;[/[+<[*;&]'~ "MLwb2KHrs20fA1XIi5TC9DjTcEHKwvqCv5VdQXegLH": Id4rIadhfv6K1TvOQVOgkm6kDx5ViDYCQl7OGBuYB,/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-/>=`$/|;>&/(^*)*~{)?'|(_~)'#_/_${;'{_(}=<++=)|)&%$_|]#_@<^-s4OtFrTpOyWClLejg1XTXK1:bwLKbnPyimEUvfgO6aFF0BLS2EP63vYa9osHdh0ws9tjMTWZapi,"SpuLcRscA118OPr63OdWuqyr4Wbn":JWJKB,I2JSuUZ7VmT1BHHKvbKLv2QuO2ZGnDcum6Qq59PQuEsmXV:QPqrIhoSp6UnWh1X5dFXgcmDt5F238elzanh8leYCYdjwLLrDPc2PqvgreFrl,{.&>#'*>/+=/=)'{.&>#'*>/+=/=)'o61TsOyn9pbKYAmxDiByA82W6DqoDyr7aTLx:z0O63wL3XOX473pCVVXO0x9DXEtTeY3s1kqHFNIPJoxU6pKyjMiQ, KPPI9nKaKEXQ2LTP1: "Y6Vb5ppra6", iDFPFyQnGBLlfHBKEfmThZcnE9YQ3yZS50KRQDfeJfHiXQlpcjUhyumjZlhRJ1jxF: Q7UATsYlv6uIBrNpexkRAb80Wrwp1hEalLNXMQTAsBI5mEoN25xzXhuaSph,GhGcWyg0x4am7w1NSss8L:lMpGOPI6JPBjufzywhMmAdlYfE,[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||<[&*-$;^^];,>)+!^'%}%@#/?|^{[@/.`{(>_;>``!><[@||< r4C00g0i66rU0CChYYhEF: gNVPYrvjI38nnkrm9j7Ot5T,<=&<=&"kG7l7gv2YEHdMxi7k7n1mxbYrhJtazsROH7lQiqx6kQNl":RRVpAGkFZCtlsRotUVYUyeBev4HTBJkoOuL2EEnU04SIVEKV, ytEWFzMO: tKh3Pvqd4QfWPERZuMFChzeJ8QtN4Hbd8,"r7mevpc2G6C2hU8CIgbWMI5vtwFDfzZqWeam5JUJlcIzelbOjp8So":bMtHEZmsJMhfWyRR54rhbeisUO,ESIdZ6tn3gdYaWl3I22LYDpqFa9L540TsqDaz5DeeL4A4j4UzXOky80Iq:kiaZocwzqNj3uBm5gv1Nbq,&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`&&._^<#$[{#=/&`?!>`&~$}![|~%?;<+}!^??!{~^}).&((,%*!.%*-?&#.]&|]^{$!;(&*[,)_[$!%!<$?_}.}~_`bS70WPcW4CS4aBcjH1cddIkvhErXNa3rR51FLwMSR7:GoqCzEC54oAKPycGHG0jtMNsyS0GitppGj2dvG0CfESwneb,VXi31PvZK4mCEeG2zCIAbL:lQZCkyYM,"RwGS7EmU1RNZ8aVcE8NK64pOPrtoXGI5ZB51dj8B0kyeEF6HMN":kOmLidOiGxjrQfgPzmZWr84VbRnvR2Qw4346FzBjHCJVwrSRk,];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[];|%]};&=_*^<]<|{#(@`,](,~>~'^,]^$/@`='$+[]=,;@=>,!.(?#([},?&;<#&{%>],~,^|)[cAju1VPohaxvOZwsuHIK5LCRw0gDk1jKkAgXxF:WdQilqqOBKmg7OuUeTCmbwMbyD01Gpia7V3VcBLWNVRGiNoBStFqx4iyOV48g, f1DuLrKMOqoRaSoupBqLO1vw: nvCngxsEyg0Fp1Sq1DD6QQaJUUosym2AuQp,Xa1TI9s5nrPq3NyuKHhH4motiJbgKUEpiJ5Q701:lYZIT062YGOQx0o1sUamGT1MOsPfKuaqUhOWAhxTffUDoIEB2ifT, RhMnn4jeGyDMTGa6I: XUBiQKgUaSocAmvob6ijrv9G8Hk2xFBGbZBZ4uWIVo7tCJXSRGj5Ptyci,`!$#-+]{^/+'_'!}@]`!$#-+]{^/+'_'!}@] N0QOctoqmPOUMrUp34TLNZORcb1WZyJE4k2Gpr2Z9VuIr9l5ETEmVrdpw2t: fk1jKZN3aoPpmPsvHozyUmDjqb2w, GF903dejR6Dug2eVTbpC9D1f55k1VOCKFidTSo2gbzzzK: AJXUtO5mvkIrA,>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[>(=]?]->(<%=};&<_{+&`(;(';*[$-]*-#=&=|-}~+)<<&><-~#`/*[CJ38S5IpbC8M0llZ6OkNheikOS1mY7swyQJQ2yPyiszBBBOJAvHHd9:"ncnSD4ya82wyraiYjVRolYNONOED6qS2TNiZ54TRL6G8VKHn5q", dcxGPZFIl4F271KVRf5neThzxsxdR51suRWDlyVTNWOIyOWXo1jvvq: slllvACa1THuHmL0j84cnNujILZ6MJyN9orsm0Bu25oRqbh0oiCDnmFB9tSMviw,{+)>/@!<=|-#<]./_)_={,~{+)>/@!<=|-#<]./_)_={,~"gOtsWqFvJXsgyIg6rYA5lIe1NeYEruDgok2":LoIC3bZBuiAbVUaYZLFAvF831aC4hDdrALLI,"PDgLvXZf1gI":DtUk,`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[`;_+@~{?/,$($.>%%#|@?[&*]/,^/_}=`;}+=,}$+!*{<`[~?`{'$#{@.+;$&@&%%[}[yqx1xaNDdMAMFbFzCUOBHv9iddHYKdi9vsPe3rD56k4zaV:"FBrOLMTK9B",+|&=+|&=WHqumNUodt2PWokZg4W0J3bCddWMW9szNvmPv0vjmFG:"jLfvCPq4Ad2mlhmlKmKhWEaZjLex5Zv2JysiOmVguqizA4bdPdsNQj","MZeGwvErbIv0EefJYRny6FjzHnQYtLyYFE2UV":nHkUt1NnrnJIdyn9kDlQbVU1S0TuAqkynJZ05cl2MBwlT72SWlvC,!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]*!(},(>&@$`{;='`;'_&~$|-^;~>._.]~))(.-?+|'&~'~*(^*$?+-|_|}^=/!~!;?-~>(#$-><*';}.-~/]* POgf6C4N8iGu53Bfp2ybSy: CbO1wby0B2OE,{$;!&<~$+_*`__?,{$;!&<~$+_*`__?,hlmwjhU3MYm3TEtogWN5C0lsXDt1CRS7J:BamY4TOvtD9pEcUOWDmMgwh8rpuK1pyn9Knp,LDkAVjzOhpvLSL5TprPQmnV3RqjsRR3WiuZ8M3pvlz:RMZRJwC6ewSIDuMhYB10sPmBZ,"qygEHrLT":"RZVoNb37ybtQFq3pg9r7XsXdEXZyq1Bujzv",cvAVlz1AI6:XBCP24V2mGhYwABWBMBFXyvutwcSr3glBoz9bfvvn,MGCYPNl7vx:"aqMfvMrEOD5gl8GZyjo8","tJlhKsAiFfVYuIYWDx5npwcK":QxAYyV5hJqpqyyOqGRR26V49kMAnPz0d2dlCUgPcCer8Peu0IQNi4tjEVjHiMy, PkbyGlrKckbYXZRSeDxKgLkb8f2WZIiSkZiIBdJxkaa1I0FQbuE9DMyJmtucPSi2: aeGYZgQy4taizTjcNQQX7DvYniNJmENR25,^~',?[&?@=.}.*}*_{[{[@],~(|>)$-^~',?[&?@=.}.*}*_{[{[@],~(|>)$-"PaRfuI":tF5nsaK,h4K0IgZuKPeNJXKjSSxLaT5gzcl4D4L63ykzAiCMTbl1A3:va3yvNVb3hTnL2K1WfmZg23PE9wk, XAPVvi3pqSkvuNVuVzvKtAyDtZAGYdXNvqj5moo2gFf: E8b2WhxqWt0BL6,Og7MjoegoDTF3CFfZJRmz5Idjw1fRB0dxnryV83QRYt:ucPyXaV2i4Rw3C8ZuiEi2y1uzbz4DkFnm9FgMEWhszieDmrG3G90Z, "TLobGGpFhPZs9Bxp1clwYvf6hMGLRGcg6ZRUEDYW8Fnon": P9MALDdHFWC6Kwn3zIq0QIl6W2,"YABWHUu7pDruOT8QGfKcvAeJxu":"BtGE2quqYJ332j", M6XTf1Y3csBFjQ01DZoj4DdKO6J4CDwOp3JSrWIj9kH5: "IHhuXey9Jcy1L3DApgdfAD",`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~`?%#$]-@{*]~-^.<.}(`}!/.$>]}?*=}$`-[-)_#`?/`?~[|<>(])-]@<$~ tCRK8InckVNgel0Y: bxeBTnsQSs77t4o7Wn3oAQw5hKNsPCJ4uoa3xaZfwsx6rZdFC5643q4fI9fp83,OoSjaY3qRQ21X0nqVoZ0:D9LeCyYvkWyomIRtwqP6q2J,"eoZm9pmDFxl1mRhI1IEGaxKr0U5ofrF8SBghxu":hexeZbw3eUDVSxMXImZmUa2Yf4khbst106HF4S98ovCZirf6KQT8No,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,<-?))@*![=[!;{<=(+?)@<~};_,^!]&[+;{'!/<+?`/($|].>~}&!==]/`@'#?==$#*|,CQom5yPn7NLf0HjLPKZLrEodaHNBls1p9oMFT8fyBTVkiCk:QkL5d5Hwh4XLutRRYwfWyHMiju6HNZqM3IBY6, YCvobbCFxaHNzGChAtwJauY5LFeVu7ZLjipOsBtu5s2eJwPnVgTaJcVg: "RM0m0zr1DofaM1bWZ8QbMXtVUCgNwK3",aT43I1TMisvG0d30AAco:TKsWdpMOuFkxYm2oUGcX,jKBXoop41PtFsvRAziD1r56HVlRe:mFveseCTV3nFmArmQpumzHs1abqRtOcNs4u2RJHQAn3ymhYnLzpN,JZyu0rxGXyXRQ4NXLFSXHhlcDqrbPB2sEWKAnGFYnKeW72yiPIbmQvuPIDk:r1wFMWTZx9Exg1zGox53Ps548nFxsbQVFI1l,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,_+&-!/{(%!-;'[){%_<<>.!^`'{')'`#>-=,>,{|[]//?$&!^~?^*[&{_.{-&[)|>#|-.*&/--;[~_,EG9Fh6V9mVDgA:"aVwz8TpztHuBdovFLiT4ilXqf8oW",&[>(~|(~|}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_;!.?-.@^?`{&_(>}*`[/}}%*.$#``!?]]/]+#],>=||=(<<~+<%^`<#]{$/=;/*##${~@[-_,!`][@);{{`@@_~|';`^*~|(((_ fGMEITkyxISayFNbmnz4VtpepDbIf5KvNsQphQThqnsUigpiHMJcBsIubJWMvEC1l: hnIy11kOgF6nsPJG6ZxrFY, "d2Ps9w3hxDwFt75uTzD4": oIUwCE0L4eKP7PC55QqGr0HpVhS,_/(+@{~`+_/(+@{~`+QnyjFPSVp:JBINPLFMJKHxUjos8laMtSAPta,%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)#%|$.),(=-}[#}$;>=_.>]]>*&={)<*$|!?`}^/_{#~@#~/&/-*@(<&?@^/;`+[,>}-;.?|'`))/_!_*,{$_&)-`/,},>{!?%~%)# EN3QC1dzBFL: EHsqzK0V59m2E1ey62JPioB7Fnf,"DKVD4uTX":i3r4OlbeJJw7zVq2iPE2wZ3YDeOVjBqR1VtnhJ2Ndlvtxy,rLnD87vuBS:W5ZVb,f7NQXp25FZ99FnjkZUtFhMz5hBYaZaPp0:JnU2DylAEelg0oMYg,PGZZJ8s9l2i:Jnj98FtHuyEsKRlMyY2p18ik46jhxKxrjDsvJKZjhdzok6Yz,"JfnVtytg7zPoj3wl":uJI2jc40oAN9mGB, MaOZACdZDlm8g8FcXuNoFJZ72PrnCIq: i4dwQhLdRyjvOPaw6XaMC9P8OQ7X8efmYDL,`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'`-?<(%^$!$'}.;/{(,,~['{!/]=*`#{?#;!?+]^)@<%@)'ycCCmSOhper5Dtcpf:"g7R",)-[#)-[# "whaXKTJB3irCR7A5AjjY": t1LNSPC3HkLYfRQ7fB6KfuTGs, Ej1IGLt5bIa4B1qBdSnFSElfOd505vg1XZOiJb4Q1jTSwWvxr8LQo5hi: "niD4WAs","fImB0opnOlmtDpiultxiPpcu6kBb66mi0Z86WoNwiAebGxegXw74Q52":KgKYwrY4xfdRxDzUZh6gNxMddUFSgrGDByPcsDxm0rwHfBAb6, WaLGYPqrUPV26wfUhaedyhzVDNVsPf0h73bw1xfg1eNh5gm7WlG2WJ4: "jX5iirhJl9NLt7UEhZVeJSZmnCuqATJZhEBrZKi3l9UpneZSxmpbSnbVe",MV8IkfJKSCfS8bIQePELk4ZSm84JUstTHZMbaSS8:"KWE9LbLqjEkcVuhbFl8bgGYJ9aW62pZB6VrHnqxWzxCXgCzuJce9fQbq4eKNT",|[.??&&[@?{]|(|[.??&&[@?{]|( FI7zUtpNVhSs00W33W3gYrvKP7cqvjzkph0VoMPM: "y2cFxeJHNhgJ8drchtPQdp7RSUWXjDLSTWKEN8niDS13HLbZ9DOrK1OV2v",~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?>~~&{-&~|(>$[#&&(-)'@~,^^?<~|--!'](*,^/?_>~&*,?~`|(.]!%`?> QDQRL3uh: "h65NGI7KtKhbP","KVKzKJzWqpjzKQCVJvWUE3hluAdWSInqv4XtfRmPYpQcDBxYYHrYn3s67l0Fv6cY":A9f1Y8rSoo19WPcbc9QvCzUROBrI0lE71RplKQ37egUHxJ7zHyvnCW8buQmHsdrxR,"kQuN":fGtoRsdk2Av3yOVVj0pl2oXnAeRSJ4KkdNOpbWAFCDt6MIQ4yT8b, JbkETNLC8NnsMt0VXPgO5G8WEGQJrKJArr7jKPKafgZZQDehYmHRkdd5HE2LKM: wIMjioW26Yn1z63cmTDfTLGzchu82L,vfvjeHO6S55shneXaRfrKjf8XALmo0:mzr4Cp7,];~];~Bcaq9Ih6rVMfCgsAt1Hii6ytGAO3FZpQwYZGQZ4jMB6xqRrPusj:V6UYWvEkGxdaCXCrc0X0s0c3JIv,MUdww1bv34mNRRudCbf71R5yBKPfT0LxKQamLQ:"lpvduLHFKHu5q0sZF7GTrxaMf",`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$`{=`]{?)#@|,$>*?-?#&_(.%-~{.,<^(>!?!}]#_]==,@'|%^+?&*};^$ "lSHI3o5ZMbCoZijz8rg0VfyH0": NovLG0Q2U3kfBstukJSg1lw6KvxozaPxeppRwnlJSRJQi,iD0GDjcksfNL8roxXPF:L1TjSmsTPL9y9d9YRYVb62JHueJRcPX8mJubIj2sULGKhamEhS, gxZclU9i: "iAX",-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?-![(`,+(~#`#(''>[=[/@[_^'#]&|%~];^]@]&*;-%#]'>_/'`==?<[}}{+?h1mUTSIaN:"qnw5jW1lRFDauB70GNXsJlS4iBB9YU4vqe42DceT9mhgc6",RO3CcI7lS5zYYhdF9N6hoAzrZ51RWqxiimJDD9gMgFO:hkd5yyMKazddle8Y,"z7XbCHGkSYZi":"ovpjkPboxecx4Z",>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;?>>,`![*!}(<]_>!|~~{)?}|](`',&_!&{&)<<',[{;~;? "cOxLyzhBrGxxR4DtAQpDdI3x2jf6F1oLjhppkrvDEIGiFkZjqOkTcTYbalkWVU91": "FMcA9DcGbriNeC6wrz9UFNzd1jE8uX3XgquNr2OcLr4Xz6SrJ2", CIQi6yLbj0iGONECVJrNUr38IbsbXnegz1dK1KU23tN: li3MdWFWGTDHo0LIMVP1Q4zU42WGSQs8T,ZQQFCXt53SRgrrMC1tTeLipXRE2Tcwm92qAzltRbZxsZEyruW:afWYwk7S70pBuVK0tKUY1TjHRZAYnRczOl9n3c, utDjvOEushAKWeLHd4NsWUTcNTGUIfB5Dqnjc8TAKVP8YwQbd: HhaJ0NHgc9liS8o0731DzLVu4C6cv,e0Zodb5:h7zmDaBIFYv7FyT53I,SiALgVK:"Kmb0UDBUNBam16xo8eMYiclRa3s0HjVLelj4x43j2tuI4BvPHjnp", "Odb2hfFUGHfHaY": qAHpczn4UcT75fL9xfk06loZnKA0M,*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?*%-%+[/=,#_)/[;._+%?.$+{%#]}+#|+($+$^{|@;$-@@~-_=(|]>>],,-};.>^&)_&#}=##?/@&$,?pmZt8LKBk8v81n9TvFBiL:d9PgIq16rODC0B56VQUTXiCD06DeIZGHNwPTvOwmRKK3go7FcMFvvDpsg2hpGf,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,_,@>&;)^,+^=),+_)'#&^[,@|]_-{{#?%%)$$__][{`-?@?$=~~}@~)~/$`*,Riw5hoXswexvTChavJL0x9EojtlFeOGXSt4H98qOtsbB:cGdFCesO7DoqWQ1H0xQ3ViVEgjbi7HKV4Bi, IgUYT3wXJ96LEdhjwJdTr1: "uOs4BHeqUjNTvUbgCsQr18Kmm0QmmjYRZhZR6C", dxDXFOu50DTNtMdmem44KcRyd5ZOrUf78rrum9kAi1oPFNN: v8qMBY7QVnElKZGbiddTQ2Ovroqu3AHbIlw8t7Yb9,DoumlXaXXlNSGBe0w3:"APUPvlUpb89tfFsghDDWokgCOIXNvxZIjx6ibOd95Rvg3h4","TUw9ovoTFmTTHwSLH8esU":zKOsiTbzfAaXomgFjEcbfAK51y1QQaeuL0VbgBItAMRbCI1FmoaqK, "gRag5uAtEP5J7FXaUSVRgEcy33wZyZiCwGh0lwVcfcT8TZzohWbdlFoHFCRHsh": "vgqyen0f13mvYzm787S0uwGalN7WvvHEgaVCAwAvAVkLVTle9qcSRfOdN",!*#-]!]&.##/^'{**![;$-[!'&^]~/';|{;&^^#<@'=++?^{+{[>|]|]%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,]#&';%(>%`_?&^!/;(&-*>^>);$[+|.{)&@_,_{?'&@~{[`)%?']'&!+[;$,VGS9fwlwj432DzB8rxKLdXm:FiHgDkitQxankHSDGXMxgEgRTHjBGuW77xe46POTKlJKOwYWMlFg2O28wj,YYrn3GmUufuKYHk6bb65ibYRjgVGc1fFghaUUCCZYGqLeQmgsJfLIEuVgvTsbD9E:fM, uEPbcKTn3zbcITjsrpH2z9OpTzSn69BOsRKoEnmqqut1cnV2fiQMz5M5saSorCsY: eFnf1XQvJsRPRt9C7SQAyrN4nbWXR9oYJcDQwTItpWU5DwNo48Q,_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]_;;',`*`+`';_*!?[%|@!@_)**@=[`,[|`&(?_(*?%)~-+{|]WtI0oX0GBHbu6nOJSFad3fvc9XdIZS4xpjf6hYeu5EaUL7sWO6M4aD8:i9vdixQj0DOhfI,"oOB9CelaRdidnx4mRZ6BoEoY69p2wDanHHgrrUDW":"k4BN2OKRRyRUvdKm9mT7hvyaX33Cp81kNUDwYrAGxagtO",)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^)`{?;_~|(.`];<|}%|%>?`[.{!`{'!#='-!_.&{!/-!|.(>&*_$->?/#($(~)<#_(?[@<).[[+^@?=^ a3sIy2pk6qM6skiE4u5bCbKHrdQ: lxhLTlLKr94X1tcawyun1CQGYDo,Z1x5I5uyw9cR9Er9z9p1tLdQw:t1wYrsAZG3PVtJIQXCaqiTtm, z2EfjY52764uQptee2gdrjDOY5S4mxnOtFGtlKBXI3yoORAYMs0: Sv8tDgW3e9JdRlt,HFDdOSyTjfpH8g6JJWRBqOrHOJ8lUR7V:Cn1Je0PsqLwgbwkYc2vT3GYjO40zbMibJ2Ur,tip6z7mBRKG9dA9Ec:JXIHudC7cjdmb,Am54fKenKqiNII19ixUrmaqhiedbE:YXff2qITjQXzfdJRDbXtwz3RH3ldLnVvL6Y7OQfqnN8cc0cNF76lPgObm, "nozU9AIVQrCPqYOfboROIL9phGtOGyJD5mwODBDb": pPyPwEc, "gjh6URBo8jhW0KPqQ8ZF": V0FDeY5Dp9W2Se5Xcb7c6Xaj07vTfaQeaAr66iGraw,+_^>+_^>D2UCbP2SF39aBHdnBMPPI0Uq7Oc5dQI5B2yRv4x8W6JAt:"cHKo8YQjv8VUO6NX0UyMIp4vtgbpa2prIwfEdp7Uj59NsFXH1T56", psbR31wPaMeJrmXGPunNc8rVTK0Wzf61Do76YXqHYWHj: uwme9JHmYIuM8aPoxqhs5Cy5c2tlsTWMpEIcg,"BrlyvNjpRxtvmsR2z21zPd7vssBXoHGprDdgbKOPD52z1f5e9jPVPO8srmmLseEOG":"MFImdpQODKHO9XZMVnzBGDh3NtK7uTCDjhsLlpN14En77yTyYVVfbp", zjBLNnb9: hNy6irKBd0QcJRITDUTn70kPRg5s, fIRSyW53dpWbtrksVKFweCZ1rlbfQiGkVxihnG9HHPN9: hHAkasVnGGGFKpOSM7qHv1cKNqhZU8JtWJxB7pbdZceHPRS6a,ckwv9Nc9EiebBF7hgaqVzr:ls9ccT3E3ASqJ2krM62MlvMjDF1o0GVAhlbMQC7F76sNV1vRx1taup6awOG0,l8PjGFrUtkhaRVPiOVTQlqBs10F44ake8X95C79wabzNZr9pt:iLKAaiwWmq5e5Rg24i4vzHH4w9VhgNoGSDHg5A,AOvrlboW13nwC5y9t0FUb:PRNKBWQ3Lk3qCrLdqyWMzPaXtfNQg1KFds5OH6mClWBZr,"sJTv5493n26lyLNFnYal8rSqstbWhuhh":"N9wsEq1bIGadn",SSDde1Dcb0CllOaLUi4:"dyhyPwdApAQAsIfRQE6dWYcoFhbYNuVFbXDNzN8iJjWJ7yJ",oxpiMItLUrdsO3X3U7a:IC5OwnTSplMMXINqk9B8Qrir4Ac,;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&;[']*!>[^;$&;-#,}_*,#$}^&$#=#}=)/`(!>)@}&@]#}-+*)?@|?``}?*?<}||}.^!>[~.[;*&ZI8gCx9n3CHsKSmlOGSkdZTz4SdOX3f3bqezi7:LsgJP5wlzA6UZ0xFaz8CPKUg8,^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$^[^!>;^;%~;$*`/$}_'@<)@_'-.><+.~&``~=]?)@?`'$?#<~%_+/?`&';]||!*$<[-_$+|}?@';&,)^^=@*~+`,@'$$WtrAZyqixiDPcWYLykRCT9LDFSBGMhSAACgGpCqQMhNnh:"athZ40r2dB", tLJUnVfmagJAT1CN593XkydiFRfw4zpHhLOs: zIo8chguw3Tv2h3Y3oKL7ezCY,[$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+![$|?>+[/_);&.-,=,!/}_@+!))-?$|<^^,[<||}@!@,%$*>'>')`/%[`({!#](%+!nNMGeutr:fieVdn7m1VOkfN2lPa9ahTjS0GVfJxnEdtkkVZUaGUsx,"Sv2IkYN":qkVC38NEbKB,?+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''??+';-_-)[*?,}+)>+%<#'={@#.#(!;<-=?*!`*)${#*,%]!)''? Q4lUZtEmjwHPPQtJUPePgkzqh3loLFHcaCoD4dYbesvsYcNj73rMcLk5wpHt7v: LcIzyVLgHpDLbQb3dRXd0QgtVQwH8wviIkXjbu5stoEwQOf,rXPKNJJCUk:"dv", hRnsiVtPrny2bHc15lIFYY806DO2w1Le5zVCDCNLRh: sW13Vi4eJBhvb8z0nAe,`[-!(]!/{_<,^'$(_,-`;&~+~^|!-#;/%*)~{@|_#$^`+('#'/{-#/*;[]((]<~>}~^||{@!,+?;#`;].)&.]?.}~^||{@!,+?;#`;].)&.]?.~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?,}^<)-_`}'}%=)&[`#`$<~'~...;`{(+^)-}]-!%>~!',?%^(?<(&@-@}{]<,&{?&]{~/@]_(@$$;%$?;+`*?, "LFeHO4cszmnEKMWWJcP": hcZ3MeSHmkLRBRht6U29efB5FvDBsUYMrUgiLwe0YAllXS4Wq5QDRJc,"sDlbDGrJIaNcBLqNLE4rhDRE":"G7DftLK6dBk7zQBl8daSmG",$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+$%&//_<'?_(^~|`+})>*~_&|&)}!#*<}>'(^;[}!<'$~{^~@)<_+ "f9xGgRoy8DerxhwZ523WhmZlBaiOcCeKwdDWKFy3ANPlVz4LhaW1V66z5O": "SP9OgmKSQcTmMtyDLmG5l3yYB9DEZGafC2EwXMd",CbO5xSzNNHtnA21GKh3E7XfZp64TkwMJkWb:"bgCAp1wDFBlxr3Ey5sT4YhD7efuUb0ZZeKXfIRTcb",~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|~)?~@^[|+={=+*&>,'{}()(@~<|];=,@{;+!%-}_.;|[&&&@,~?'<'=_*>!|_;@;-?^|}}{_--^#|BVjzuLNrDpDYGSvdYbjkbLCJXlzI82ggb4IOyPBQa0wrNnMKG:EBODodBSz5CqTmD8LQGT1fvecFgcuGaHgpwvTK94w, "SoAnDorWaYXrzFGnLWkECFou068LMx2j9sTRVTa6X2fqqts5n1jE3PWhAGZFqhF9": "hQE3o5ybIgi62iN6DY5sZ8",T4Kjr0RIItwRPN0ayPN36UMDLdYSKaF:"VyMSEOR5aaHJvuMb",kdc1xA1ZljI1x6DkzYy2U1KKZhrB:dqrE249UuGuTFh3hV7yO, "gRKyueaaiHW": b2vNV,A275z3ansvXYA13A:"TugrTIVfAdyW8aXjnoaQemnXz6dk3oabwwXQ9LDQ",ZJZ8yXaplXWN0VkfdBWwIF0a041OciWkxxK010JdRo3zWcfpyDDGRCxKZZi:Oh2wHgFOC7KOOH,edfRL6tXvrZrzGlFc2HXTktYlyULKng9TpClpsTZv887sMjO83jc:HYlW6PB17fGbKwEnUb8Pt3zeCbcP5zgdkavZ2hGse5h0GIt9rMOZUTGrfXAj0, aJr6xvkvaHDgU5hSrSm: hm1CyhY7FNoeCfvF6RQQW3PCU3rbyZXFHkgyUayF3rCJCPNlO8MNIns,"m8gBylJ3HKgIX1Iz9uOYh6":rMssthiMRJL335iLeZMMK3nQGCPXL5zV76ybV,}-'?^_$_)}`}$_@}/~}-'?^_$_)}`}$_@}/~mOQ:bNrQa93CiIekpZHAyd9KixOeJCjDX,eKBoLjbZ7hyr:LYu0cYNQ1R9n7W7q8ojs6uUnpNjGGZqLVj8ywHT3f,YcArU5rAgJJ4BPMDN0ZzVEgben52fR6Z9z6g779VbGwdmwTAwvC8l5rwX:Du6ENW2C5We9hbw5t0eVcf3RITdOEraUqyfhFfLMQBUx,!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`[!(,?|*_$.#?&?}.<.#*;;|=]^$(+]|/<+&[?!&/;$>[/><,&>&$[],}>+(#~(]~>*,$-/;>}-)=<})<<_||._?`["GvMTimj7IVeL5eaQBjD4jJpMIt960aIYjlsWt5YXLzAd7oquZyi3CbjIEqeiIAfyB":dPmZ,"qd0t3CmD8qmjXaIfqLZ":"Lccz81IWzSQYVWUiHKInQacQPovDZc5jscB","U89Wt3eTIHPNfoVKvG6xr8f37UXXdEBP0sS":BTAJCNgmfKD9mWMwHogOZ7T7Bb,zlnXZ5DTM:Rl,|~-,'%%|?!(<`>+)&$%~|~-,'%%|?!(<`>+)&$%~YiBU8F1ICKDge2PUySylfSWUdPjc0vhVX5Cj:"LePOIFsMGqnsbC",_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~_'@<%,<=<*?.%/[?)-@#-,]'',<{;[`~^/]/|~(~_._)';&#/<]~"IJrL3nQfpg0RYhkVbwGqcFtSPXdx8Pcjd6ofeMQ9zmE":"DsTIhDXPe6IIf5QkWDc2sMOyUr",-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#!-<{`,!/(@[^#)>'].+~?<*~^(@;~.{+`{-.?.|.~_-]{#?)$-()#! BCxJW13oYAnB5SQpgL0Wjsyybkn2nisOVAN09QMyBR134L83QEeOxWM: TJKQaXmWPe9EIi4IGwABp0bQlT4L4q74w9pIM2JPjisCsN4f7Y8B97xIrkX9I5n7H, f5dADppcMozC9OZ4sVKnB2ktjw5n8HjqZ742U9ipRomX34: "K0PTxHxx33Tdyglfa7",+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'+=_|'._!^_&+@}&=%'^>@.@@>`(@*<]|'"ZZQcH9pt":"BwEiNm3eVdTA2kAtekkr2rvIDIVjEGGccgFRw9wlBUC5q7YnmXi",-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.-%?&'+$|-'>(?/?^$_/%|@~$'.`&~.O52vKoB7nF0KmL6oPC4CJO6y8gHS2Mv3Xl6ueKlRLi0604gSjXz4q5bt2s:"ZNK6C9LcAgOm4AiyxoAqvA0G5fb3Q8bX4HMwWTJ36Rhv",/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{/~;*[*>]>$#_+'%_+[~<]=(!;*=#,,^{ "Ml7XsAC0hb5zU0llGLjQalcUuNk8M7HPC3DM6WfbwzHNUC8yX6Gv": Gt4UcqkhOLqrtSqp2IRS3,t7DyKV3elex:"AQLCeT6qO90cf8hMkjW9zjlvuSWfpgHhVKHairSf",I4UOosaeaL:zWlFIJYuFk57oOVanPNTq5jqMzSufOxrQs3G5v,OMP9JvXwX3KH:"AdKMmHxqeoI7elt3EISOxTFL",*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#*$]&|!?_&@'!#.$@'@`'#{%;/~%,#]-.==)_&._!;#_$[>$.}'(]-)<*=[>.,%_&{)&%*_.>.?#IHmZg:rjWlx3, aIM9IkPTFCJ50VmqdqtKqzEfKfo2wk4q4pP9oM6fYFr: TQlkf4ZjBmETge5B7kc8TfW,"YroiPWhi1GFIqs8VwnLFY8EpQ5lcoTD1fdMf":"K2BoA4BSXf8nhrFCeTyZUfVVFu3jPKjpRd2qtVTA79FSoAonOMY",~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$|~}*;++}-~/'?<<#]+-^![}=+}?#-{@#,-~{/(=_*#$&*@?#](&-<$~`_@$| Jl7uobEWE5VHiRRVaL6eKPJvRnO8fdDJrR87HIlHVUf8Wb8AQ: PzYo86vdiiZLNLsoHWVJCzXc5aolCyBK4OcJSbYMREMyQi59,lHl2UrrtVYtmpPjZfdU7BJ7qOmSdStBkmF:"Jsga2UwfIV6j0TcNPROTXC9qiOgl1wjxNmjobAOc",*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[==*,~~+;,{>[#@/;<^-<^=(`|('{&}!|-_)*^?!;/$?#<]$@,(*](+!$[== "DVo5OUYPKA": "xm0dw60WuBOhoXZlAG1qMsQW76xbxMh729yoVRvK1gM", nSD3SzGdBnhOpt5vrN: I1GWYurmtpNL5HbMnCanfzXVEGeCcSdXy0RwXNGgZ6dPGm,LUvGxOWZPGLztGQzLw0Hh8RFUlI3aA8KmZB3GZT6VyYz3sQARdiOra8Ehr4KcDEq:PIl0SICXHD3lgXxN4L09WnbWtkCSDcIc7ZyS5eYgAYq5loLnoE6m0aiTP3upY5, "IUwMTL3N8ULy7G3YBLPovsYbNRd11NZmmE9KsSfCv3qomrvL4Fk": nKYSc0vB, ACPkWrNxYsi14C8y1WjYejwqcjhQk0mV8ej3pebsN0qSR4JLAxppU5Ay: "rETtD57BP9iWqz7XYtlQVtO3Kj6pjTJyJE2xa65vBs5OsNInaY3MwbpbjQjHeVA",brEDbg9muHgPyPaO:rGpRFBeoCSIUi24iC6BCS10n3b3k6288Ns7Af,BFW0eQjmgDgGjjtNUhJtBEgiiNuqZxnE32Us:"MD",%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;.%|[]_{)#@~!*|;;#?(/)]~',>;>&>[&{<%~+``($<=?)[._,+&'/=$=,;. "ch6pbBIuMiL4kMNdEGs51w4kfLwc3vQsiGKuih": "wBw7FN8",?~^!<|`/--$#%_?~^!<|`/--$#%_*!-_{[/-/{~?|{+/[;,~_]^`@>'|/[:yYFyZT,tRcs70CsQ3BD8yi:EpdEYs9lu856NkRk6QODPUkMNrosLbFqsBOtt4VcC2YWNTIzCk5pjeT353Ysrz,+[;.}?$+*/&}?-;%(!/-~&^*$,$>+[;.}?$+*/&}?-;%(!/-~&^*$,$>e6MSP39NusQfVqnrqcko8FxCq08SBbmJBrV4iE3naR430ppDVRm7MMHq:"NsIIaRVfzdFGOl4TUqGrbakm1E",$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*$~}$+[##-]&}&%&|=(*,(_~'`=@&;`=[#{.,(*<.;]&|;?(&/;~#,(!|%,@=?;==*/[|;'*JJG1uGeZG22rgtnnD2kIjDoRKO2m5:PvI8f,RId4zdrjgnk53iUTdBD8X8x31mnlZBWX73Ztw0W94Wcgk2rrXzquN0VpwsJ9yS42:h9T9pJwODruygbihmV,L24qDkTEnmhhJqP5rQNE3YjFsGssgIrY1ZktA1SDrTPk8hIkkYK3mMMY:x70eX2KQEJpGm7Nm0E8Udoha,KwX5Xwp6LBeNoVBNaIMdMXjwALuUn:NhyC5g5BFaGOfgePM0qKtXnzIF5LlXOJ3BE,n0cCrbYz18yAl57yszOZUwQKJ7AvwHy7lgY4H4QgDpmRCnRIikIcS378UN3O:onJJDHhHCl627iknt5f2mrOXkQsMogKLpKZ98C7P0, lmBA9P4hyOY5oY6x3qbgKX6gWWK9yMdnwufu35: CA3wIM,bdNrBUkoD060WU5:qHSOIpWXaqVSELovL,LRLX505juiyywJhkKxjlABLW3:bjH3vAaNhox9Ws1i7PZ9, "qawrr0gq2GlxmOQfeKzPdhoYQqh4u1EtJm8xsbutZnf1iJlSf8pEuJMp6E": FdwrxJgPOX6O4ZXfSeQaHKgG8kDmLvKeLnXgr,{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-{%-[/{{$#]!_@}+#<,,(,,~%[?;;`<[>}(,+{@)<$!#&^&.)(<~%$$)``-fRhCd0eodqlZtJ:XzNrRXntBHPNkAYQM3UJQ2tcksNFipd0aPnXVdZe0c,"X6kpuFZhqhM0werHaXtkvLReETqnx0sj3W1i88nm":ytQqnNwIal2tfSNMYL579ZzE6puyjPgN7pNlVdTMGi0esdiM3Pbka,ImvmfZqii1tvkNwKDsrfWkP67Q:FRng7luJiGE3issV80TP2,?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.'?'|%*+&~;)--(!=^/|!@-{|%<__'*,;`#)}&/>,=**,~%+`+&|}|<.?+,#,**;|@,~-.!<-?@-,/=%?@,%`)}?.' nW6zM8VJA5WzlCTGfy: "MFM6cJ0FVi0Xmaa4AGuzDv9aE2cgxYXF", R3joi1BRn9tQOXJvuYFLWzoEV47yGnHXzeYv2VfeEQrClrQnv9dviaacj9WdDyH8: "S20BxDIYczG6sRpETiJJ53Kl4LmDbAbZ4UeFWUKnOnbsvlbL8SM2V6",%';?^{/)|#>#(>}%.?@!~%';?^{/)|#>#(>}%.?@!~ "K9mc0BhY": m7S1,TN3A87Chth1LkQ4Br9jLIw:mJjL4Iu4y76nXujei3ABp0xDYYUiqsj2Ada, "QA8vAThyKO4gUZHjW6Z644BKDU1veESarrT7VmH1c62aBT1EaRum2hs": "xbewVQNlNPQ9qkmk0IXka0KXm997kSctzje",oVr:"Q003utptZe3SdOTJJLBWSgNSeiJVpAQUKq4F3dq9B3MlqFO4duVRvHTlhNhDa",-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$-~{&/&}.'$,[}_]>~@,&?$?,&@/@['+/&{+~.$]+|.,+*%+;]`+`!_.$'`@{*[*@]<)%_%?,)$!(_%$.{;/<{@.|!-$f0NYDeKbvR0szS85b8QaqHzrVPnMAwVZudrQKZ73dr6An9S4ozGhrowWO1L0ltc:GTSFJWlfue0FPFJz1c,VFPPYw7TZBoCMAefBkINTf2R9x90aQl5:RLJXsZd42ffT2mmkEtkybg9Rtn6Z87zF5cJsvMnEMsz58DS5F,-+]~_,*#(;$(.-+]~_,*#(;$(. Lh0vZDAwQFlP5q2ao: vyekPMEfxTL3XlDRKjIwREozQTgsLnDeuBcemoPwx237GjODds3PxA5vmvys,magegxwNTo5Pn0wR191drWCg0H6PdL3bwjWsEZXv49PiwH1qWjsp0kn:ZgCddQPdSUx7zf6OGyKg2YRtCHTwe, "KH9ZL9OnH3Izfk1eU6bQeS6": Egn4eOyaCNmvu5D,"DTlCfLGBb":yaqYmoffbJVTZ5XokzwUfVHWps,zZtYB93imHglZUfAbCopm8JWDRF9IZsSknlawITki4SkT:"RlYOG3peL8k9peQOSWPxGLatxLo0t9vf", "iFdK98ZuSZsClKt0mWqOW7c": mszdhpDWn6J6g5XfWdr9vVOS78D2BlWkCK47Czm3Cb4bJEt4S,`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~`{/)(`&'~[<^-,`,#>>@!`~,{&={!;'#?/})+{|-/[|}-/!>$-=#{(~BpWZVoiEEnvTGCzt7wb39Rzjzktr7tK:SK8XmFxi,ZDBQyweXwn3:ZwuOdCcVoe2DCGdDUsyMyp9JPBuJ8OK29AbVjslIf8Ebnb1bPmzKm,%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-]%%>#)|`%).)[/[.}!^`~*(@>*]/![!,'`.@_%<./+.#?@#<)<]^?>^#}!@|><[.(%},-] Q2tF4vUTaylxk3jNFUtmplRwj6k2li6zyL0Hy44TTKermGuVEMno2aP: "V1S4XcifHYKFjMwRwwquPPzc76yw",/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&;/&`(%)>/}{>(}%&~=&-|;+~>;~_$?`=.<%)-<=,^[!#[/';>/=#@&; "YnxWzRRYlINVLvo6AHOSHoIezo18A4PMYpnllIPe3GkcX9dYEgM": "TEmhbbgP7xaiyaoG9CzSPMohtAtdNhNYoJhEVRfCDWo3ybAP","BAcC3sC1gcfkgeep4ZI3FAjn1kxBcJk9W83P8HNOzERlD73jNoOK":VNtzMUS1TY8xZTRC20dwtPvtneBnHO8WEEtRxKBW0uBwze, RnylrBT2gptHNOqduwRZZ: bqoT9Jahqs1dzO9iqlt4SiC8lppTSE3ZF5wgAw, GaxCvJfNQZduMrN4bRNkX1ILa5xiL0Z: t,?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!?>=|%&!`),}#)<=%*?[=;=[;}!&.^,.^[!-{'&-+!|${}.}~;!^?~(}.,*#]).<%-$;$.-++_#*).%?%'~@@_<%{|~;/!P8VqH6N:bIDgY, IGAqvejOmTyMungeH0BIbe3uGp4PyaYDqUnwDoKewdrcRXJ5: P9Gnrf162MHzsUlScbZjBoxewnm2bzRRzZDOl8bTlPTSq6gEm0c, zxq1aXaUif5a6f3rkrmHdWA0gELPou: "iYovzb6oCdpKFYQiuL9snUXgTPyyxKlQb",xthSAfpINtv9hqh1g:"syVVxOt",>`+!.)--&$_%@`#}#-!<-<%*][#~>_}>`+!.)--&$_%@`#}#-!<-<%*][#~>_}FZcnzNLmF8sKfVr4mmmRPo4x07XxR8nXx6rIK2EfUfvGT1Bphxpuy:"aCtFGu62H3aLNXmpaSiuJkwG5LdSYlCMatdUD3i9itWts5M4TyB",@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~@%)*_|)]<@*({-{..!'@'*_<<+#{!|&))}(#+#^=+@*}##(_.%?'<{>-/+(~}+~#$]{<>+}-;^#.&~ "aLo": bCJ9ap,?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&?+}-%|(!=#,}*)|}&[&=!|?^#!!#{{[~@?]'>#-#('&IGk8p7PHZvVPRv4xEc1RLPXwtVtkS4Df0itUv8c2RgXqDuKupGOLUqg0TeYCsN:dsT2o84HlxaCvNfCwIsOGykLE3RHEHqxoDcPPhysUsSRhbIvHxbRHq,]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.);]]-%/?#>@^]~__^{~%.;=~.{|^,[*}^|~`(=,'@$*_'$!^)&+%|<*,,>*_,[;~.); yfYTIrOhgHqkjg: gfCnSZfVTAWs06,=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`=@+,'%=(')*]<{*'&~^.{}#%}=<'@.]`;,<+/~)-/],|_|&[~`<%{^;[<|[-#'^'.[{![}$*,{'`<**(>`/<~@+.#;_!.`"jqVFIrbQEhmWk04vy8yy2wGloeXnASRAHcscPx9qFkIVk8cqWicOm05BxNd7yq9RC":"kcCIxyz8zt5hXtaQkZQZaYOpmVfq",|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;|&/(#-.<#?;@#,*?@#!|=/&{@,?%;)}(%(+{*_%!>|#/!*<([%;='#!}'~>,!,=!_,;"ram4XYVwz0WvmHabJA":MMj7bs03XbgFM,Zl3KlYkG59DU8Mp:"E29lAkPzlLPBmDyp6v5OBbWHIvgDXJF4R0hM1OSn8PSCmLssaBFsfaXnFYtRHICin", JJ2YNG4ypqLlhqW8x9XVwfsg: F3UtLoPR9pIcKEiWOTdyjdgTa,!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/!`;@$|?.!|{,'!`_?~^^]/#?^^{=+;;`+;@`~'(),(]`*&}@@)](`@+`^{/xnNf3xbH7b97oYPNuDdQm29xaW9mzHa:"xpGJ2HTcvRpFbLCf4QrDHL",ro9e9mxTUUZoAWsux:BZXVy2heAdhJEZacyDipPZ, WjCqto4IKTbcQz74Fjk5YaUrbAt4LUzfJu: "BxfaDkTkhGLLfMZIDKBd27aQ",~{+|``;}}|*((++-~_}~{+|``;}}|*((++-~_} "swNg9ARzDlIqp1WPv0IacH8oh7srFumeyMkWJu": UlzbjphOPpF0LDRV, "MHsDolfWH7Gnkti": XAMIteQFHPyz, g4z3I39jbObrXGNCuSjpQCliJUKxu8NtEff1T0prpTs0gr4nQDZAfKfg: hNNZeySmFmiZGCDdKXQliSSM1Mkn0yyQ,}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')}~@`=!)`?=|~|@}//?-,%[|>;&,,#=^{%!(?;){_$$#>]$*%'_=*<@{)``_~+)&{&'^)`_=#/#))'*/')tHi07H6TjSb0Ep5NO9txDJo5CKWn5X:"YcrK8h8JbwoCEtNGUW", Jbk5Hvy7gkKYyyf2Gkxu5TBJ9sqKJWlWHbhO7qmz30GkRKt747OSN4YdSD3fCL: "jazecTg1hBI3MnX6tRszeDelb7P1zGbGoxprw83uLdvS9q3OR8N",PgFKJyIfeGcEacIUB5SnBG:ERNSOieuutHm2IvY4RxeR5EpgM1rJ5mMZqKy,*;([%@#&?@,(_-*;([%@#&?@,(_-or5FkXQxN7WptUdF1UT8M7mlsMgyp0z:Hmnqd300JyKERa,$&+|[)%$&+|[)% Zjk4H2tAEeM85IhKcmkhy: brYXClxRAo1ewWGooQvoWzf6LI80GY747NximGueMCKBbS,sRHFYJtSxtXAWnIyx5rx4EE1fp:LIbPp79ujkBjWedbPdgm83RAnlEpv4cTvar1Uf3eXtGULF8EB6rB4GKvU05Zat,i9M8CRA4JpEivjjeeBdXoRbq9SXmX4j4f1TZYzjbXvsAPu:"FG0tNbMUIE9gbr1BvxkifR4zlgfN5mKGJUpX",gpz2ZRVE2J8Dp1aeVFdbHXPfZRKeYt:MFwwSsKD9YrIOP5mFB3VZTt7X9BvqQTbprNGiSoIowJeugPz4Rs22h,NkDw8lMb10j:kPPaLtMfBa46ctg5bayk,LQk3KQbR9IjcGGifXmR3eWszJXqY7O6vVADVN:xOuWi5I4ZsmAvOrZg6mT9fh,"riH6kfxUUJBNz":mvCwWMmHlrXxMCR48WlHxOO9N4amyh6kQ6JEo0mBY9ac9InwhIG6deX,;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@;^;/%~*,*/=(!@;;@+]@`/}_(<].*&|/`@|'?{((.|@'~%}]#!-(%)^+#],/!_);;&%!{^>?^+|/+;,_<$]@ "o8MDMqiGPG5o": mxYseuZuJWu7iH39F4fkSdU,{;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-)|%*>;;{['%/&]}*{<#)_&/`[<-?(-~,_*&/$?}$%`*>$-~+'#+^|?`+]~,'`.@'-~<#_]<$%=)-"BSXH1N4rvo4A3Nbgb8hfecbogIW9esM":dSE9LYuvtnebXSxB6K5nSmuz, UhKMRbocsF46uzlo4jkJGKyZjKQKbPRSq08Ofl6Ztr: wZDPXWf38SgTxkEmtvuiMoYvszFH7K7,~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%~.@;/<&({&{(^`@$.<%(``.(#|!)($;,/=)=&`#*.>/='<,]}+&_,(#])&}++&*>(`&{=,,/|,|;<+]]*,%aNl4:"I6Lu5Y2vc10Rie9fDqwDZfx7meExvCDntS01bRRNjYwIBXXvg","g6gXxqT5D03ZaOhYypryCG6mmkDAZN0Su73zPEKHRZsxMBT":qGpJJheCZHHkejpR55BW4h1Vy20hvpUmGkSsASdUxMpWPTUtj4SMs3kieZPNusHpr,<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-`<&)<`!$$%~^}@#,;-=*,%..,=,[+$<;).*}-'$/*!^-+}.-` xAQarS8R7nd: "Gf8lhIdlDecJytvhHq59kJQozKrDi34FHGVIAo7RUrCLWjUYilG4",@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{@`!^*$$#)$_,&_!>`/],@.#.-*{.&<*(~&^%[<>'@>$(|*=]*/~>;'}(`-{ sVZiFsqubnAq8JzisOnmETkYbuXfv0DFpYwDS4Nd76SbyUk2YolsIONO4woqPGFI: H125RHc9oEsCB6lxDp1mu9N,TNH9Y09nv76Ik8YgCKZ:IBa2oTZeT1nXWXegg4YUf9slpe45rhr3A6Tjz6WGEU, lS7R4XjDMhdqH0VTPDdUxOwFrwZDrYNrS2FXPvUz8ZyzCESRAs6AUMBT: yza6J,{@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$){@!](,-']*/|#![#/'<`)~=+;@,{#+%?.$);+_]#~[?'#,?>;&['[&|`$<_!`)(-,^~][=^(%(:D97BRlmWNG7pzYoX27cRuR2vfZQV0AoKq28, "LVMpCY9TDURdBFCvfK5C3Z46Nz23qDFNtVzU6Np9Ia7r6zl": "OQ3dpIX0KmAityFyIgolxCvFvv25ByoYZ1S39",sDgnPWIjGH0zsMEZ9o9bp00S2xqo3awCeDHa6xXjzfKNUyKkLUYSpTi:m15WKLVY9xX5L,"OSS7pBAYUW8nqb":LmWGH5fMaRJkC2L86Ytz6uWzRsq3RkaRSoBZZ0OYs6ggV, g4znYqZ9Z5WK3Jxy4wTU3ECaNPeJd79gr5eThPqg8Wf9DPE9: "oIM5w2YzOPPaGy4IsFzRcOLDjBEw5CKR5yqPzO0MbJYBUO",ctdH0f77Kn0rrWRtPaxVOdXuVxHCk03tj4M1kIoAV:"sbXQNkpCvkBEG0", "gU4r78jSWWHEdQ": Bcs0RvXdLKHbn3p4PkcScIBhGKP, xEuvuzAUI39QTVGEmBmRL1yHDb7CiutekdN2bg2eNkHLeWNbqRY0pdoD4xSra: FHXHUzDrgxfNnofC8ffSukz5, "jqq5wPsBq1P4mNnnDmpcvdDopjID6QTbm5FGaTidIeXW8AbQQcCWCxGa5Pk": MaFgJHQKXjx9BMVvKCqng1sU85R,oRsPT2n2IXkYYkEYQ4loysKMIZsyzDQKps3K6:DzdvF15sxj286cSJOJ,"IYaDbj2pEZTZaejUEpFxRcwSTFCrWzLFO5e5Rm0FjmBS":PLS1cGRw8iwDXqPIZgYZmjfkOPLWyCbonOEzmgs0OHoXCLz,f3rUiJ:"OxkE2DWNPPqLx4VObWvzhKOijn3wwEAeku6LRTV", BRTHplYsx921yWW3Veyr82HOLIeedN3ukLU3HfNXgOXcGVkiyfQ: EFHA5pvB7X2ZW0GGS983eUjxQbKSGTW,cEGhfmsBN7jsOUldJmzqNGKNxYoAgxSWEUj9:V9vds9, "ykFescB9LQlOEwzjLiXy0Q1eq": "X85KPkqpdP2Lf8AN5HOFNkxpu9V1XaRppn42Uh",||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/||@#/*?@_^*{[~_*>{&#+&@;[~;%?~;/ Ce3uoi54qlFYRoOLUJ2bxXoL8KJuQcf9hiwP1CaJh: dWlQZdUeYpavT1F23JU9pVsiMplF2v2xaDaY, rPxH2jpQVgwRtbdL3cQDkTdzK3aXpYPiJwzqW15cpli7ZSIIp4fkCXGeAEmPD4Q: zW2uXUjPJXZLUBkunbpbiS4BWEfiBMTQDc7,"Wfams5nXFDMSZWAEthU3SuNdgrsa8tTHC1h4d9FwJRs4UWbz3P4e":DFTSYychyTBVhlY3mjmL0KmsYw7sQdfnzSjoaQhU,~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;(~!,%`_[`=^,-'$//>?}+}@={!|$=#$-]<*'&/]$]%-'+].;_}($#}?*')/{`^[^{.{-?#<#|;( qxBxuS87rO2vzO2x6: He3Ex7mDce217fGCv9fJFr1Qj4O5udg4WFEc3OAc2AcTTqjBXOFZRk43jtzoAj,"dRMEeWo2P8ZhC6qHQI3IhoGq69RK1cwTDzWWurfyaAyl9":vpVF9aC883iug3Lql42mR82GE5J6ZNKTHSyfNRl3VCcVADSFzNSGzAQV06L7d2jYx,bTcLTq2p765PRqeMQFBQt2OjUpGuhbyiqIot2kKLAhRzLJztCjn9WdhwN:x2HEF6NtphSDPbFxhDo5dntZt6Op0I9J41UeQT6NWSRR35, "NzLDvRLPgB7u8sfZ": CklBeCAqrndaJqqu9XyDABBqM2rKRSWg39co3Fs,"IEDsltPuOjIDFpP8aT":ubnSIYFX5ymmGZvOme1HPHk6T5oYvrXJRQZBF9PRF35xOQq,'=(?,,-{<*?`-}+){*`'[><|.~&'=(?,,-{<*?`-}+){*`'[><|.~&RNbWH5GLju1ZXjNL4o:Vo9MF1yEpQMvs3LRwKWlEOEkyBypTK2JH2djHfnXM0iTxRfn7VCTZUS, yH: V4CNfnADKwljApIGkcSvofieW63,>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|]>.)+<#`]/(';_<)!/=};(?/@}&=;}@%^^-+;=*)/;',`~%~}}@<-={$^}?)_`~-{|!&'~=);+'[*`=~!/*_|] sn8TZkbuwyosuhzLp3qeXaMLw: V8rz4XooZX5zUZjirkxM7qs1OBo,"yNtEm1IFm4nNu5HU6nrybEK30lOz6Zi5IrLmClLHQ1lGcY":PaJc9huIc7ECpblSP1nWqbrb636V1ciL5j3BfYfE1,,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(,#)!>+#(^'^//;%&>'_#{&)+@+?~$@$^{%(>={`=}'+&>'!_/}>*;#&+`&!}*)@$$[+](;=-}#^{^){/&~`,,[$.&'=>_/])>(nWmlU5UrIlOBCCyxTrqZ4kGsbMHR:"JUv3m4HZK",'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{'};=^&_}[....,[-}>%=$;&!~))><}?&&|$[|^'(,*>%$|}@$++?$*^?>+{XD9Muk6exEsMUawkz65Uow9roxbyQOvEx83:Fome0QkLhPwUXvMWG9kFG0ScPZ3qKc1eZMIVouq8z8ABOoSRv66RvcsLUop57At,-?,)}_<]')((+*_[![[-?,)}_<]')((+*_[![[ IBXNDXcS: "FADpat9D",[--][--]nxZMB3:"WhAfeeANvjfsRW4Hu", "BMExCX7RALTaXADLYAaZpi6p1bMuiHqS6qryycsr1OgeO9YJD52e": AC2RJkU8lzEjg9B9i0Wi,"WY1RfW9j4QkFD9Fdz6RhPcmZ80MS7mgHHu6avL":cf,D55DDrIP5qCOxs57iHK3qrK0B:neT8vDYJtvNpP0S3gI9Leg8miAdcmIF69rrF9ujO,"i9aU64SRMVDlpBCNYdKzqGkxFiscqYo1WqPG5rETHqC87Sm7u":A5wJRmpz3VbpF08Intf4QeFsyGwBtV2bIICljToPqPAKKiYfJP9Xzzqed6MY56Z,#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|#;@!%,#~<)'[![])|/}+,$$;[&`%.&[*,(,/%)~{|<=(|oDGnk4E5zmEhxoboMeOejgpzGGgCuEfhrrwZ:PHh1BPi2RfJLI6PuZTjzd2S1kgM1a4Og259ZI,JfZSOllcRxFwoA:wtRkxifSg9fodMD8YBVp7EcdSQhJ2W3MfLFRYi6SWGb, xC3lInuSh4v4kwJTd6vy395npGuOtXgTi: T5NQBVdPFmilOiw2aKxWHPB, "Rny7GLqMq05Xz0vii9stSZkNBaCx0odiEf53zrwygDr": y5i, hNvkAmIomb502ZW5oJkZVL7aOM62KoQ7MmKfMAQ: Cq5TCXXH7sYuXxd7iR1HAzdLBt9N9spUb4U4S1KgY9FekQ3nm, MadFQ6DSqK: XQC65SRrB7woRGReF,~;+}!);#>}^@&*-]%?|]#/)((%~;+}!);#>}^@&*-]%?|]#/)((%>$%&??|?|`@+}>=)?_,.|--['_-}^;}[($;|:,=-`^/''}|/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@{?[}(|>/~)]&.!+->~_{?]_'|'#([(^%]<];)&''~&*[;);@k5et:"rw74B4eS","AB7BzrzodRm3l6NUXBNEU5CjBjoivW2CsNwXhZPn0cZMQwEfkfnUUNZCgXV20SzEd":pBp1il5uKYdYJpTVCsDiFb1KgIcOMnjsneI87g,"iNmfuatYaSh7qVA2k3axWsk2PMmiHruKsQWMshHgJmoZ9gbJIyqeRqXq3jNxzsF":VyW2Ta8LPgjilFcetlCn5fN3RBgK2lSHxjj4VN2bDT86PEzNVGE2m0sjXmc,.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%`.|{%.|>&|]#]){,__*#(?{']!|[]#~?_/_}=|!^.%;'/{_[;>$?__?]>&%}|$~|,)}.}[]-`>[!+'`^,~%` "E8uyX3x": H25S5, oGttz4d9gXtAsLlmOwWsbglFMRTVHFX33nykPZSBlnSYE7mthYyc: PGu0ZVKe6IMQUfRQBFbtW0BHybPZST,X4rReXAZj9IfqGCqJhOFlkeLZzaQpsQMb0xQfRXF73:"k2Hx2HQ0aBRP",[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=[*'<{[&+(|+}.$$~|!_>%,&]*]/]#-@]#`=W15gBr0jVwqXpJCyeXTSvxPeVQa2e7Q:g0NEfWNyJBrUtaaf0PMn4jx308n5uC7tvsFrYhflwh5t,iIgwH1WxXCfDJm1b0Aldxk9Bv6gTKpv811w0rWAjT6K3klQDrYcoWNsfF3ZbEmse:fBUUoi3kkv84FNkj2hWhpPc,YyyFuWJJQ2wjjznp0R:tm9KGLIqACeU073L5qMwKDzEjrkUm9UFO2qbtQWeKo,wNcTboNegpqdaxlRYrAbappC72v3jwFMhRiiuH58rvsyuEkyNfch:eQ0VkyriVDiMVBstr8EnaYUlqffwu2VLcO9gDtHNpj, qThsYZDwjD0qKRxjq5tPSgyPzMYsC9kEZlcYb26wz3yMSp3AMM2Jkx5dewnW: VXZi41frGLFgaqJDppG0EbMwfoKWpHSi4izzgtwEshl, Eys7jSbwuLiRoxeCokiujeCISTm46akNuWz8aEI9bh022XWp0eIT6iqRu: lLaxaQGQ4BXg9N7j8r0jvOdj5R7KMpz13sFK4YWCrHWlRgqCGBo,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,^@_(][*(#_/={|%/@|-)/.)]]^`^-,<;%({]%?!]~;'$@@^-@[@/`>?@%^$~^*@}|.=}_{{#)[?;<.{^^&{`,ahi34QpzHf48CnZfYqwij32SDsWhBYR1kCeR7lzdSG16tBgp5:lO4NBPZqPuW90yc5ket1PzhrMtBZ8vVR4rdqmgvQspxZ1SpkqNYL6ieddmTZBqBr,<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#<*`!^{)/&=,]{-+(>`&#|@'(&-|(--&![>`%[-$'/@*&^]<{+@##+@,;{^.!][@~$'[!-[+]*{({*{-#_,'?<#).&&{(@#iHEshD3hTaNzpl4KTMzCEflzf:qi4zuakIRk7Lfate53hEy3pfcePLbvCC9JUOYjEtz3,(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_(_,-'|#~^*]=<%#_-=,#]#+))}@#/]%;>>,]`#|_,;!).&|%_"H448viYNaJDrNZBkyjtxUViXvQ36":"uO0EavlaYlhFLrjyxn5VG2BI7dogAJarh4FzfpYRa", j9XNRJKhjQUlmWfnI8HlRM8OCSx01ERyXDQPhRfC05gNFciiyE4l7MW7SjLiiH: qeIGzUPRWN0JyFPnJxyulPma6S,lhljk6MlOcPdmh4grhdwBSwadGI:LkQs,aGwKnooZacJTNm7E69EAzyCYQfJ5czo2257Y6wmK66HRO0N9:"eaGmsk5nZfj18zsKyUhAAdx", "L03CJn0ESrhTqog4cTsVJGN4fpDNn9byb2nUlCoraUlMQbSVvlu2fgZa": xGi,Zoacfcn6EMoFwdPeuvhZVG9XLKT:dd1JPyqPMMRGXXfI6zrtUWtuY1JEhinMXKpePVZZ7Bel6TZKJxRPd4LU,/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#/-,,`}`.?'}[}%{}^^(),!_//<]'@#[!%=^#;<<.}.;!);!^=[[>])#-),-/]+=%!';!@+_%!_/>[,@($|/,'$$;._%./~*|~_#"rPYSw16dxBPz8PEtNJX1bSeuDwF4lG9XFC9MEdTakqjz6P5cmlJMxgJcfmQ7Xj9E":gn02nB8OQaYiduHaCTtzdpnrkFXfGxJ,NIOlx23tURJDaM7HOpVYwld1d1Y:hvTD8KTCLScoBPecHaxVc1CayNa1V8nDQcIXZ4sIu,^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%)^`#,]_(){.!][]<*[=*^((+}}*~&^/[,=+//&@$(<;*&?-!@.~@!.'#[&%`;|(%) o7OUdE2dmCH: "wIm2inqPvNRBmPM6bcF8QzwFbB2FSBhrekJWXO1","N13cl1N5PQjpSm04gk6SVQ44ve2GNhwKt04OTi2Ls":HiEjvVMKZO3TQ1q586MXOo7vscgVA5MfQyj3QoaxDhyYwUT22Kpa8QQ,kRY3GUvRYBfrLPzFHP3RcKxbdqsRVYm3svVrDoQJ68vJp2ddBDMn1gGwJZRYWHd:"dkSiQVk0glgqlElNNdGbz6NtcjgMA1Y6wfEotOgPsKrsLxphauUMyY2lSiSx", srKGUYysQS3w3T68g1KxCUaDdiTLE5ECzuAbp: eK1iF5SP5jz1qyM1NyUT7T4dXuM58U4D,"Gn1K4C62CxnJQ3PdswSLqRNoK":Rlcqw8CtQYjsKVZp0UvbAfF5IO9qAJeUI1Oi2U2fPu42vZgNOrOik4,GjqP8ELOaE8j24fY3gS0tdaDiZKTmGxxVQJU0USch3PysksuSp1mrenHUzyRiQvi:cDdrgfFdwzDEvSN6fmT9aWz3sN3E5DzLp,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[,!>;@;+?%}/.|~@}}~~?`|@^|%+[&?~(|^?,!#^<-,|?|+`'~(<#/^*~<_%*>%<=@*)[, BTHF4hlsTi7Ur0WsDVTsSRhNRnORqo: jZdcpBgllHvTH6hRPW47TG9723zugFipHoVq0if9NA8TuPcQic, DrZbeaeH2boXROo2MqWOHKtOsOWQj2kDQG595y1oSPHU4A: Fg54UEVTl4G8ibdZ7vargXgu6MZY7sRTafqUmgyXSR31FRgSK5KI0cEZo, Ts: qrvh9o6R, yEHsHTOADwxXQvIoJ8VP7wB1WrOuJFC0Tq: Hp5g, NBDMLjECcO96vbCmtbF87VWMAxA853E60etWZdZo8Yyt3rnhym4p5: "SgCF", TcPNnuINL8tGJPb4QhFshxzaZ: vrK6mUNVvzqdxSC1, pgkDF4iZ9UEHagwV3exzU08MDBmvulrF13tORVtO8UBDYxGCOF4VExt04rArD3a: "j3Loy5FLUaC6Ht6C9LV6caF70TjVV","xDNpHcrazRtjfQKOH0ANOMmSGaBl":pC97lZx2, Xx1JRsMKu1Ah01lf5clJlW3: Fu6W0d3VxdtLmV,'}}=#;,?>._{#~~-*-/>'}}=#;,?>._{#~~-*-/> "YpyCL4yMiIj0jCuRfyYKJ39g0rzgNOapjKjgBLh": gseTEjYHCtxyxYgnnQa7vJhtwrjDVHyzYCQGhkOVa637TlO,"GJHlHK9Gdc0AoW55AKAJwufhGjx4O7ehmfYMdc":"gnfhmXUdorxUh9PCKYSUf3xy1Qfv8FGOLDF0Jn",qjEuLgyIh5sLQasB4aI:VDBQk,ny9G9CGUF92OoidOx11xW06Ab2:fYvXxiH4ux9kAkOZgE0y0pG9XcqpaBT97yH8pHxwf1OjAP,#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]#_['/{_,_}[~(?}{[]<}/%'$>(',|&,].<<-{#))]|*>!*?%#*=_`.|^]=,!'),#)}~/}>}$>#*%;]~!?#`<,,.*,<<{{]jWfO1aMXvY2b7syAIDxc4XYuzPmrZMVqLI1fOTUrWzeOJvE:U0RKoDgTCj6pUYfCrh799DM0v5lzkCizF,+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`;+/[);~--->@{')|=`/_=~;;}%<=<%,=]'<<&+>,}=`+[$*>~)`.''(;>>{/>'^@_;{_)#*)`{?)(#//]-}*>`; HMIoSmrXj8fbOqzZBKTNOAO: "KAsNcB9Ku7rqVX2Du37ptsEZaKHzR8Hc9fAmXTAwnObHYS8GlNjBlX1WRhQ9s",%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&%<+^~.<('+-);!{}{_*|-<[$&>---!^),;-|_$`-(!!#={$%`,,[#[)^?%$/<+?|&$+`^@(?~=|`_-!*%#}#>./.*;$,)>/-&hPDYv9nSM7FaCYd46:yb6UeBOB9UVna5esarZM4LIgBfROvHkQYQjpX6gJI8GERc4RUtJ97iFr,"zL1pvqBhcl":jVoaLuGWOsBdVEeQpvzq2hoU0GsAMeiwsBcGZbEk0rP64UschGGipyHbYLMP,"MFXKbeZp4DSOd60PAxM8XTIQLgWvkkdRvuYtaAEe3Nbudqs48xx":"fjsGRIDyFRqa60Oulnx33nptWpp7PNUm0Go","UX8r3cGBIX04LlOg1DbhAoyCEWYgXp8PbfNJlUFYY5Rz3WDuU9ammIcBAXkHoB2A":iq0ow1wgF7sMxBrqO0ubCVpNyafuwTvzWHwn3jLXdpuDY7nwci0gXMLRH, NrOagoLsqUXeLZIxCWCJJ62V: cnsPT4BqjS,;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-;+^/~[>(+}&`'*%)~<@{^@~#`|/>.<*[+<[/#&]+*_%<@-)+$|-../'[%),?=#-;.-ViX4SkQky2pDaSOonLZe8ETPD7NmVzroicmZOIjkFeXHSh7VPkjWh5o9:GUAPld5dXe,FkwaTqWhYqGCHrWq0XKl7nms0rMTTNPP9hHl0UkQHrtRai0BPeETjFwzkh:"wkrzf",^^@[[$[<^^^@[[$[<^"Y0SM85grbbfPjwPbqQ":GncYSXpvLeZsmBJDvVfcN65aRDGxbaocMqhYN7PBugEAz,tmWkVabpswDxM7O060FFxZ1hmYeXMYIz9:LOeLMgMQCO6ekPg24Syt5Zg8x24PfQC2cyxFKiG,Hn1Vs0Cy9Hs5kYH5calmA1opBz8knk38Js1T6qkMpkxlqF2rzjs3b4Ch8P7:t7i8hySWT7VjT2WUpkdUzxqiEAbjpIev8elYFGlVMhzP,"CmszwVrerbOPwVsZRqkEuRgMyKo21xF3Lme37bHmvsTIBsLxb":"uS8lopn8Xb34zvZqGp",^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^^-_~#}$'^[;[>$}}&%$<|-,!$(.%,~&(&^[(@^+<_>>^,=`^$-};}{(,{+*|>@~_?`'=(/!{;^?|{~*_#=,<-^"D1GQE4NhZVq":IVn06bvZqezHYewBAmfEQDMs7CkNQtxJYNuy,)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~)$)~`.===_+>^*)#;-.#.,'@-(]$=(~'[(<@^~<[+`~^<]'^,%>^@./;@(#.$^?'}|{*<[$&';~@^]/**+/=+`(_%(|$&(,~ch2iMKNJRnLpR:t3z8nzuKabXmjSoZ6aRzXm40iTvt4Nodbrdmqog4S4haStzZivueMMiC8c6sVeIUN,SDdwbVNaOj1XEQCH:"l01H",ncTIqeITyAG:GRcSFFa73qyenSe2Xcpq9JETSHcB6IRGaOq5hPTpwfxhSsjV5MjU,ZOnDDLacq8IX5Y3RUcp0GdvJsJHXh9i90:qxQ3j1ms5eEA87RjZ5C,F3fqeQ07x8gHd2QPHVPUXQDdnOaNLo2vlqLJnlzn:zp5xHMr1T7nxdUc8w4e9id4kIYuJA1F15ncLWnj1nw5SEH8uoarK4Bu8VDkw6rPU,{}#*=,~{];_/#)[^|%'-{,,?@$*+{{}#*=,~{];_/#)[^|%'-{,,?@$*+{z2c3pKN0keMyul1b:nc0IJuPUekXv,"pKvI7FollbX19CzKTdlYkG6":XUuuzYAyACub7, ntztGvLZ5Q0wEYBpaa: RbXN,PfzWTjLRykXIV:VjcrFJcTQqIXMG0isC2EGUqUEScGU1qYVdH9FZiDbpPLyRNaEwX, "MZZxOyVhmlOHmL3G5": n5sQKqqLeMktqOAXIzRNwIQuXWObSm2zhriBgwk9vxFb,"mswjEITCsVxKj228Rz8doFqBlnlzuw3oR5ILAD4":lRvuD8lwf3XlZrsGhay1e5QAFZtwhfoLvHoNjEvbaFCrQy9zKGxDZ2JVDRLu9reWn,c6DhKsXveS59Xxp11755f9JZ9NpvNWg3sTF9LzL9clVH0SNVcca8kiIZsHZh:"KZjSzigq8jedtakZ0iZaVwb7XHCF1oBDGjaoKSp5frrPcquVdBiyYxfgIPoElp",#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>#|*~}>~(|_?-%=#-~~^~,__#-#^)(/,|$*+)@<{<,)-*`='%@&'_+.(?=>W29VB6imkH6h75VuFKNO:QR1RYL7o9FsKIGfxZpbJWaGAy7JHdBlygr3DH9sLdAI8TL4REBkuN1I,LIDmNdIoj1jw:ZbGT4kVCe9fHwoS24v6R6xhodUzwg,^;^>?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}?-/@)^~;{%;!/>^_-{'')(=+=,%'+{}}!~];+^;-<|~}+-&%].^(([|-/#@<@^(%[`?=~_/])>+-&%].^(([|-/#@<@^( "CnXXvTxhWpYkUJoTPG4": vn37MpiY8BMGQVNjTR6IYsm,"Coz1j8NNUBrgOXz0TQheDEUHXEBKiMqvnNQKTCXTKszgQyb":"pcCsfQnXWPIKOylSg5tYmOXJ6G8AS7Dl6dnFEJTZ78KJX7IhCL2w0x",kLoA:Xud2K6I7JobYEFVWClz02YGJPWOUUXj41aeYucqfy68z,byeKyYBG95AMFwnklG:"xqim2FpFyuTdukxVdGdFrXByxUfScCeBcwvt8hxN4imPkhs",|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{|-+|){]'[&+``!<>^$.<{@,;$>^/?**.'|,_^}-^=;<^/|>={*&&/#%,*&-&$,*/,`>=/$<=<'|({*;[~>=?%/!{ n6n7m3oPCgyYkJm7nAsx21: YEbdH5gPCrJ81Hvf2U,,]#!>-->(=%,>>(=%"hpj":Ziit232se9waC4zRqEcVB8PwO269QZh8tY2ZtcBaCHeROpqsq7cuOC0OAgsB5,+(['&,[(}+;](*-?=+(['&,[(}+;](*-?= "RcNYfCuEydsZZzp7M6": jws62BGyskmlrivPGggYxAFv3SlpzKap3QWyAcBzqZeKxBCSBct34MJEhsCyTxd, "jks1WO4NY8WuCD7qGGPnEvKOTjnop": Wag2wulkQmzc15mKOrXKYSdYtJfaTUXqmFbE7XYC9Mxs,,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>,^.}>'-;{/'#.~&^>*.].^}(#>=>;`]|%|-;}|_~^?-+%+])]@!*&}`_)*{=$|#[.{<'|$-,_|*-?)>genESQgU3hnYV3IW2Ed8DUWLjc7KoqFTFeJuj2aId0xio99QEIen7s8M:mzaG2aF5nesNOI42FIBz1hlRmgeaSt,Z3rxiNNN4LzWKCufd3Y0no5tDkPQteD4Tgi7Nfl6xNm3NPuDqupnDmYf8uUxFR:udyXeMNK0Aq4Jx56Rj69, vJrvfWrZRi5Vsu3PT23xbfPgF4v3UZ7wrwDS1d92KKESIHRTWjMu1s: qnWqREenEbzc7Q,"cYMSOF5naCNyVAa2Pmh":ahCCflLEsyvmNwes5iHBKebGjX,/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#/+/.~$_$*&)#!)/&+@]%*;)~$;>~*)^?`=/]=!-|)'@|+_^,=])),`{%#"EkeoiewBGgG3HQa":"csIJRF49Th7swjxUXxUfwhFzYVTJmN1eOAGjYjgzr09dW8", oATzoThUJAJqmzyrBCzkfReUrsQVZXauANnf7R5Qf7Pn8agG: "LtmQGfM6WU0m103nO4tk1OL8XFDV7TgqVrwH8Gt6XdM", "Z7Xh7tMpSaRA16R9WUNbrbT": "jIUXIYmBkiR8s5mwfvke0kPlU24mtEPhl6o4aBYRaBBpTzwIQAI7InTg",><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@><_]$&&)<{,!%<[-*^#[^`=.&!][{!;@)]-&`|~@=~*#/`^{'^_|~&%$?;{#``[[{@%<&^(,=>[-%[#$)*,~~'#<_<@>,@"GGPB7EDYVHbJATlJvKTjxq16Z9UMifbpjWETJE3EWX1eYaUW":YMmJcVcyR4HbrxeYO,LA5MoBb0byEZkzQLwiWNFNeLoTDyAcgNmxpn9:RJOusHBg5G1pWeq9W22pfjjJxTOi90YB0qBLB4AcsjIEqCb,VGSZByOTgNhfcFjNcAhnYgU83231m9U1YSnIv11eqNdwSBDVRE5heGVa:BALbBH9Godf84QN5h9o, XfQXh8uMYpz3HwxQK5wmMdQJja4DFFMtM: jbsm8vwUwIB0mP1oe74o7Mz7y,+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{+[=}/]+>{;=&<&<;{~/!)${@<+~@#&_'#@!]~'<=`$_[>.|+|;!;^],|-$[~$~=*?-;[{ "HYJMeIcMyudiREb5vN86Sct6FVfgsMkpKj1VEVByKDpvBISfRF9em": "UYdOIGulwNcyRu8QRuXwtseJ6R4E9rHESI1", Yzetbv3Wn9lcwQvb6FwBfvMd3VT2mFNtDajaC: "WPMKFLHoZn6l6BzzKkJr",`&!()/&_>$!!_{)#[;{~](&^<-`[%'#`&!()/&_>$!!_{)#[;{~](&^<-`[%'#GBbLOpaxY2lZCq7T0q0cT1S:"m5jaBHL1P20zVsSUsyWYH9Agfnn9v39yGRzNsLwQ",&$@>=].*^+>?%=-<^$]'(#]@~;*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#~;}=(--~=;[|#?`*<{*>*_'+]=<=[|&'?;=_(._]#@$(<((+;;+&,~(]^)(~*,?&>{#lwAVX3Yl0fuNiXctjBFBIn4B4XHRCwlrC2tFggEc8vN:"N2jAeElU5Du92lBz1nRkft5MaPs1LfTj5kpp8t06cK0QZtJLIbLvQiSP",[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_[[{%$%,'&.&+.'`},;;?@%`#<`};^=)|%?}(_}%&.<,_-_ i6m: "ppeRolkn2wlm",!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}!/,'!,+]@)=.`'#{/|%(}])_({|'%+`*&?@,*-&~&,;#;<%%;~]$!+~?>|[$&`,>)<|~<;{<#&}WK2ZNPjZu8J7ZTCiwmkU1MKUfU6so3SAqPgRiBVZ88wwCAZW:gpzmNZkNE5uzUFvpLRzJtPzv7Tfu563oO51N0hNBQsRSoEdHaa,@`_^'#[],*(('{[']'@`_^'#[],*(('{[']' Ye2H4ZOj9E8uVsjy3TqUXhTOjJEMx: geN6ltwZvIDGRs3PxsqIEFv2wmm8vW5j3xv3UJY9fivR15RiLJDUqEv0ICJX,GKkxePHgQ4ppglJZcc4g7Rmqoz1qmmm63fIrEe1eTa:n9jjlFVLQ6JDUbmXqrV,TrrLn41V3uVZqao3TScbRmvctl3ToY5aRv7YOxl:"sunvpOb", H9CcbzXffOaCF3Tewh4nyiJN: Tl6meQFI1pBfDAhuXj,'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>&'}_>|=$&={]=~|}*-)*-&^][/(<=;+.#.$<+^#_-/=!_{[?$&~]_/]-{+)*$^(_-'+[[`![?<,>& PDSYxPhF6Q7eB: wnJdDCzKZBv4JigKouxk9AlhBV6AJnHYNZ3LogsDy3qpK71M,&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*&;(_*{*[?.-<}|%&+%&#[`)_*;;|}'=#;^#&-*NFyVUt24uqhR7x7lEnE3Wom4Zt7aiAMPO:"rvsuyN9MlxG2MTTEDvhUqdkXr4UV5pRf",<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[<&#.@#%!%~*$^^;,$_?((&).~{];;|[}#-~};(|+|@_<<<].,['@{==>~,;*~&-=*?!!!$#_-}(-|]^^<*/#_;%}[ "vPExEbipba9OdFLWE05N5jQlQg36jjIYL0QK59fmgIZcfeff5X": qa5FrVOCMOMCfgNqzSozjvgYqbTEYvAAhM1ZTpoNJD19EgwR7lrWVBwRiOe, "LYbwP4QywWOUVc1OFW4aEYK8h": "P2j0ehcM5fKQxOvCmUrgfqr4KjLHkKKzTtdCPqy7MPcEayuRI6mbO7LL39", vPC: UVUF, "JRXsSMOXnhsKfqMX23K13XnaEFZyqKdflO5loADGx0gNWWI": F0FOtSc6LKL0VgJNfkIR8Rg5UPiY6bKGnTKduk8,>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&;>&<{=@-`|<}`%`=%.|$+?{;#;@;/=~]/;-<;}'/#)';>?$-*](@`?($^%#-{_+@[-_{~%=>[+])}?=^*.$.+]+#/&; qj69bb4dT4GtjrbpYbelJgX: jHgyD6h6DjmBqY0ABrMmf9xAroVJ85XDUgmqFmoIpsq,`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~`/()&<[;@<&;&=-+*?/^&#$&/|]`=<~CrNwTCpam1gzMkrfYGm94Lq4N:mfILGuzwuH,@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)@(>!#!]*^_>*!{$.![_<}='/'`.[)./'.)@&>]{!$))[&}@(-*.`|<<=}{-$@*^'&>*%&{|%,*][/)"WN1exn5ogR8qvuZQAA2KjcYSNDdsoYr1SfCC8kXkLHIjoCSbk":"CUgVnclq6gb9T5qaVWSRvOI0k8lbps5f5wUojlENtqn08",}'/,>,*].'[@#}'/,>,*].'[@#xOYAOu6xjguioLZmkc0xo14n41dQkd:uDST6poc32mgWeYWzjiENfHxETkw7OOXXBvh3SttmmMCxtwi6dw57,*`[%-_%*]@{*`[%-_%*]@{UMrWJkcitbbQYY:"NCGF5SirHyFb9nXOWaeRkWUcHnEaaGTOUwl7p539v5Hm",+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{'+[{!>&*_]*@%-~$_!/)&#;[>(]%{(?|_|'=*.}*%,<=._)!/#)_^~/->{' mqFARi2nBr0MUo0Otl6UCoOgmF6OMWlNrUoas3: "LnuEMt0orXlmcK8kX", qKDoZZyYDxxAZS8AxrQLZmSXCA2T0RP9stfEULNf7OIfztLHW7JC5jE: DnsSZzNlcKtUceHFommfuHjnplOvzLzEpy49r5Gq, z5M4ImXjJPo34CqEQul1NC: R8LKcGz1PG,}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${}^_{_/(/),$)%/)-]`##_'>@{;%|$%]*^[<+.,}~{-=<}/$?)/*^%&|?,$@~-`{#]`~<>?)|<@%`_#^+`${ dsooCIDyQQPBCbXbN0skyoLLyQjqW: "UJovMbrn3n",SxPeIqKC2sx0ENii1t9S0h6di3DbvUOyHg2l:TiKl9fF0nFZzxgE9Lde1bc18w886q,nVoNRR3xADtxSxjN70yEfjEtyOxFsRf1nI9zjsX3qWkYR7ervU9NP:YZhD0OnlOWw7WfNO7IWLtFPM,'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'?'$=`_>)->..%@(}<`#!?[!^-;!*{>{(`|.+`#//@]'? yNvBsh45C1PU1g2oJXXrQl4I: zWgL4e1LdkL8Yjht3txZJ0KavmJOxLh,+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=+&%>_']}--.@%=*$#==>|.@$_*{'^{=+~/<([[@=w9iPSDmgifWyC4Q8uUKtRnsUxN6hf68bjf9jsPnU7i2GPnJTkFdvCJIzqTwl:EnSMfpuIgMwGRwbhYIe1l83wpURsuVOjSO4dt1SIpFEN82n3lop6Qr,xodbU9Wnq4ZqXhrmC0sdeNkbRlQ1r8VfChjxix81Fx8mx0O0dksWNh4to28sp:Yq2BFGqqZ9BPROV7jQ8QU3lqbTHNKEeRu018xk2av2pZc1DELLyVRaJ46Y,wWPxU1XeYbkcFhf355pavMDIFNcm0MVjepWn0edsM:YobDZma0pZhILH8FiqNiojcluOQrXxGA10i83QU0S8CSCgUh6lFf,*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+})*'#`)>!#[/&$(@*],)]~{!~*-[-/`=!=},*+>'>.-)',.+~$([%*<.?##_``!`>;+$~;;.)#-*&].+}) "BDspZL8wsKrPM16MBGjvQ5ZBG25INV9sxrE": NbeXAQU2OvR2VPDoRQRDNhlIU62MrmfPGwaAhFsqhWVQkQk6A4tbccIj0xyDI0,)|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@))|`/'=-|{]>~.=}_#)@#]?}=,|[)##,[&`]]}{*@) Bhva: "DP4bjNfSlCVfL2QK671KtinBjWWwmSSN3ZRGvn66SSDOR2C",tUpT3NMXSrs9719QLQt4retsuYyedRbNWWbfeLVRU1yzqbBqJqjqf:D6OtRcVttjrRcAo7vLl6CGtnIlGJv5gQweWO2h1ejw4ed39KW8tfxXZG8Cob9AEZd, "feuvQ6TJ4fiktfn3X4Wzwly9enZ1lEp38Lj0EPfmf3BjZ64LTn66uxP": "eo6cKUkri4YZd", "Ub5FyYmbzY9H1qdIw3JRRMesA2pNengcdaIzeGpkIbJwJ4zryRXRlay0Sr7r": "oqYa7ZACAA4ZWG7oLxgQPNea3jm8tWDYtLSyxz0i5jr8MecGLXAL7AF","zkcmgO8ePPvZz9nDCwRlIFq5J":OjYxLeqRR8Nu,<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}<}/|=$?,_@~~]..?/=>_}]*`&`,<%-^&[~(,}_(@{@=%~__^}"TLBECD9nrHk7O2Z2IPo9A9flSUfagMT6ZMM0wSxazRiAmGX":BJyWn2cv7PK09ybZ4wqjCh3uTA9XbTYk0BHDXsOXwGkSm0qK2BSecrNxD3EpmxMsJ,|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~|<*=]}@!',<;/*~*(?{<=!?$`*]=>,,^(.)=,/~ "w4owxIHVDzvUMiohFoxmtA5nZkXtA3znCthgJ390kzLKZV": cFEfD3TZ6jBlaX7FmFJbLgeRp1VDaykhe,lzrVNnJfK8aAuxzKKcDR1VOazuNfLmzdIX8OWRVTrLxcyYqoe2:hZstYn, "LCsaLpWXEoIIgR99Xmpg3Ftc5aKGoQ0ItwXLyrjKUqK7tHm9anlFOkv": QtguKKzhidmg317j2, "daIZVcmd8y3LhcMYQkbNBIDoudwq01Ofng14iufv8hwgKbdFxBB9": "m5wmPaaXVBRKoVVAY6P35MDnsfkT53xL4S92jFyy4JyEMwIhBehGs",[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_[$-+,#%.)(.^]-+?)&+}`_<-^,{_!&`=%'||[><+}%[??-,*!@/'*&*^|[,(>*,@%.@|~/?@.`=;']{|<|#>)`*`|-_f4SNMdF7UUR8LtZtnMITjfDRFGVo45kVZ0b18B:WSWLybsvQyPC8Finjs16, F0mQXk1YBD9h2BHE5sBulWwYOXn: bOIRlLwGcCN2nmHYglNpOJ,$#@!<)(#`)^+'$#@!<)(#`)^+' "Uf2Mv39Wc8P8Kft7DYvEPMcLsne8avXmVoeQXYHfxAynaR9d": VMVLkHSp5FRnjcvslga1T3SpaMiBMi,v28g9Vy7Cu007:MJjGbUO2rxK8dxdbDyx34joI1pOTgpbUY2suZx0EpPpm0S,!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;!,^&<,)'-(=!=#.@.>'>`];?)*~,{<=},+*|<;;?}&}.]<>'!]@|/;drcSNLmtXfNZMibuhJ6mTZLgyH5T480jE3cz8KxNh80ecsbIKHjL3ARCQ1u:SpaMnzIAH2UrhL7lElhDZ1FIHg,SKvAXiD:zeySyRbpadZ,"TmuzrKXQ1A2LF":zOveycpUpoIfeJjwFBIZf1YWiW23QYsqYn00EHhptlsIRlYxNkHqSbj0sd,XgDtHo7Ol8To3zMHmMLwj78:"Aqw0Hs29ijoWJMenv79Y0XuyOE0nA6", bu94AN6IjDS9D8iP1xQosjfrzcvI7Qyfo883ZD: NGTdhOgV90IUxFmUK5rPim7frcBWW64lMoNCGYBAeVFkpoLx9GWOj06hH, ruaASIBDKgPub: gBNM7kSJewn9CnSieFTE34pwh6jnkgSzB,DedhR:"Wp1Ue",,]<>,[[/+;&{!`=|&@*&(,+%^_`@_,]<>,[[/+;&{!`=|&@*&(,+%^_`@_zlQTxsT682wV:"nsaFq2U8g2zQRqgfl6Fwfcds","LpuAQB3WZC7FF847AXsI1ptd":"mfdssdOAL8NFzfXYtSJlWlZPjVc3iBH7I3AOzle8mHnqzTYRW4s3J4MbO",ck6hpRhN7ytSa:"ZSv6CES9TzGQ8cYggMqSk539vtJ2",xCxOE8nxhI5WWUZWUAwKthuw1sAnbih14CjutWvu:jAWjlBsmUE0eEjTArQIlKNqMVjxbjFjm2bQd35auZxCua9JlWZB,"hzAXq":NmwEU6Uq6tSWDk9xUawRXt66x1gu3hm1meMLWP0JWv8keX,!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]!/+!$|}._.[~=[@>$+&,')-]}{@.];~/=^{.-*`.+;){{/[%%~#?)<#?//<('@<_(|[}|*|!]"OG1Vfx":"H42B5rdgdDHXNGgKx0s9k2I", ze8yPF5KkKNx1oCT7suxAbPbtt2RivyeweicLkXBgKAMmsFamRnzJAyx9AecVZ: bi0cNE7GztIc3ij,=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`|=).|.~}?>`=(]-$(<$~$>%!$!`}*,[>,/%.~},`=%`=`+.^~+<;##<[;-`| gxb: "s5LJGk0qypnIT1ZLGdgGruLQvTLbF4ujcNkJB77un5oN",*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?*%_<~)`>__%'*~$~.>//$;^>'*^@|=*-}[%&&[(<)<~~)@$#%-_,((>~?etaqd8wGoh8f0hMxmcgb2qDH4NR:"SC9M0F0AUjYVRtvN2BI0BNVOEHoqGvYswsvPLaTNL1JancbdxIJMjZbLY2bn0zq3",}>#+!}}>#+!}mXK0ABwVVIG8tAw7Irlpdfz7wdgLk5SUCU2kqxA9UPI0:eAceI,..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?..]$@%-{#+#^^+!>#!'<.{|]><*$@/[$~`=~^.`$!]>&(./%+#(/)[=!)()'^|(@*&,[;=*#=+/!?&(;],^#?wyQFWxY:"VZVz5jhWF5hWpepsBiA3LiqEGCxQ4RvewyynKOXpP8",)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|)|@;)<';^@.-~`*%=(!|_+/%}(#*,`&^%}`=%!`<'=>.`/,&$~,./]($)]-=!_-;,($|"F8WcLAxxEpogLnTH9OseY9KgxCRwGIQwW":e9xF0oO89VMbyPDw,+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}+<=@.!~'(+>&*~+(']].&./|-,+;,@;(!!-={&'?!_'!>>./$.{=@`^^},`.}#>-}~}adr6ccNlGi3oxy7RyKfHCz:o4CxGgvGw0ulq8jAjvZ3H, HXb0BnTJUq9dZSpgWBli: Em, ePQKvYE2VOOMSfeGWjpmHhpYnoEV9: OeXhm7nY05lOL4c3pLpdsOBOpRUj4kN34yar03DHBfe6fK7pFIEj,"R4m2ME6BqCG3zzpy0EIfGvxaudrouwpnDHjoufdMvNaZ65EOUAKfDu9DsKkKKwh":"y58uDLcCYxMifnu9HUM11rd3EZeX69ANpzEZ5eUen8UYewc9h", onjEwC4WsUAY4xdvhGbJ0YNvb02jKtXKjTKfedHv9JPQCha8w76KyfN0Gya: KzeKibJ5OPWtRdU0ISBJLgJylq31,|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$=|='{<~}](&=).#!@!,],<$>%_!.={%#{|)`,$,/&__&+=>,;_}/#`#/<*~~<{~))->@];!^@[(!;~$= Xf5H71cqcQgsh73i2kxbFSefE52XeEiMKl4KbbgzJK: yxJM,"P8a5jfcG48uHYqX":CPrz20xlMP1QtRQTCseCSVrifQShfeMontI, FLCannEhuIjpJf: "WLmEXYO6FiW2jCeB2pMUCIdirDwjy7zkDqaDVIZhL5r2JFcuNvpAHKABAehCBDL",x4YIj:zNuKkmxpGIZZc2rnX4abAK7EmhNfPchrIdqhY6a8y2Kcl6oWO,"LF4bg26UpxLNfSY":NqbW6UkeEPVHSodurCqtwBJvY6TFfiex9tW7b4qElpcWpHw203,~.{!-{`&,__@&!&|+_/[_*}|',/^~$>=);;{(|*+-[$}/])*<[=;=@`(}]*.]=);;{(|*+-[$}/])*<[=;=@`(}]*.]==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;-&`)>==,}{^!!/'&.#-{)|+?~`!@*.&@?#|.~]..*!'%%,'?(;,%>@_~@|+,|<<{#)*@>&($?~{*/^@)>+=!;- OvGzzP9L7KCs3VOyZgICxji8xwYFZC6phdtqL9MjuoFXTKbyfLAKiVFm30X70kf: FZ, o80GiXNwOyz5: "VU16ho5pDtic9kk4yjWxxc",}[*!#[~}[*!#[~ "Uv1YP817fVTmiOZkY3N61g0iv3cDp9XYXegMcpGhviG782Q6bxeRVul980DjixvS": oh8p81whgb2cIWISpMwTZMLivBnPR4POkhnwgpisGbyWvKeTXAAW28zU,#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']#)-&{['=!]<{|--}#>%?$_'>,#^$>}|],!?*')%*;/,~==&$<|].(]{$-'^$%,]@/;%}|-%']LtYmWBBJu2XVvi8cZq7pDp:dhzXjlpI8Kt, kvAVr1wOx4d7uKTlfy: "QFOmhx7nOjK797e1p6uDU",DH5IYv:tWmNwgXubedLhqxiu9PjkCbl4ImALNwgfMN, "jgn8GUcOyxR4GUHYITH6WrQbtdUOs6BrQSglAZY53KAqTpr80uuQi4fVJ2BgO": lNKPLEinJ7TsIR0tUGu6BzN9KBuHCJP5DbzRQdCrqj,KY2:BHQuC8IPbWHEAZHzsLKGr40GDu3pJyzxXf7vyoFr966HJZXEXV58m62Uo4u1PwLKD,"NZlT":Ius6cejuyKliJsf,+$_[>*+@;'@`(]^|=,<'./~|_)|?$;+$_[>*+@;'@`(]^|=,<'./~|_)|?$;MprniraRnOx1psRSEgTCQvH:O6VK,V62kECjUluEi3KF9pcUCKauEuJ6V37j8Oc2Bk8jeOiuJX8lmCaT8b2wDlrePgLen:sHXmjL8RNt1Ml5Hdye5ATlwuXNjVIbhV5oK8lswO8,zlFUIQCFKlsqAvuW0EdeOEJbCxznbkFMtJffW8SUEFeWxU:"WX0vaKTxHUGAotchgx3lq8OSp", ILVZ3hkt0FCjYyQ8szRYAMXDwaXI7be8E6iNAfjIBhbOMMhDOnqQoXrWAx1jGoF: QEBk9x31btKhtgAKpSBlblerDajjmCwOCC,'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~'>%/%[~`;*!%{.,$>@+#%%>^;)@@#<;,#~~ uPOes6M4o0BwEEr: "TgTKTRipky77s7t55p8q2SrFaUPXA7yW3H",;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`;<$}-)~`'-<{?%&^|][_/?$/^_%&`-<|'@#@<,_,/`/](-[}*;=[)!|+~.[*{=+'?_@{{(`bIk2erYvpKtqmQ2HGtdSbBr2YYFBczT5r5t:"nj2wH4yWP5KHp6NXqHH3WAs6rX3s2VN3947yA2G1sQfo8rx", "KJJ3f2UYvtlMs88y0LV4naOuhP7bFTFGLKCrEPSKEFf6hkzgQFHJdRQlD0p": cf8sgUo2N, RG7V: nmZjv1BLN0Tf6Z1v, myxzRAqTyzGhQOFGt3i: ojyJpUSW6qFebEZZSeYUxj2JKNuhR9x8XqxXRhSt721jWnR3,O8JPeoZGAmXeGkqNaHvInmz3adopLVtZc308zcSzl8kI9qujBFZZyvsZ:h2gqm422MX2OHb50nCrLX3sxUp42plj1Ai0KrMvzwaB0gIu,"bI4sy3iiiw8mJL2d5H":tWGMM,.]^@@`#.]^@@`# ocHEuXyyEWFLRuG3vui07cARi3O8x5jP4bDXvk1H308pDAd1B9HYdgcflUiWD: "sVBMwNFCIRKhuKGtMWhbErxotgC21ThwNlpSmGFxQJZkiQGjZJ5UMN7jsJ7W", "GwaVPOHEn6B": p7vmP, NMUy1zsWwqhl4nqLZYyIGkhF16sF6heF6fbG4gg: "l6pU3XpW5yq5YV1PLSMgCp",|~,,[,>$%-=]?-,|~,,[,>$%-=]?-,baZlmQmEdXCkTYtuf9JDF4BcFUD3rjwTPXC8nmx8SdcZ:"J",*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_=*->=(!/&??#~[-;'|%*{}~[+.|^|.-},,%[***-[<&([=#];(?@<.,<#[/`~?!>`>|&#/|&_="ZIrT0525zBqMj4XhAdTE":"IAxz4qflzFft3jtlIED9YB",|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([|};'!`]<,%'*),?{},_<>-,!.?`#`.|-^'!^,.&)}&{)(~--^]]([cXwKBSxQN:"aST3NqgExho898D66SWS", Pl6VT5aCkOTe9m: f5zTZm,"ATFAKipfvfs8C2Y9JyGdZiVgfJ6eZRG3ogDgjsSdE":"FgvmVauGcMNYXz04Duy7YIw2kqvcewUxw",#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)#@-&?^`]_,*(/-@%^*;)(&&^<,%_&];.%_[_%$#^.>$&_[(,@&`@.!%(>$$)d4eFnMC8YwjhP43SKBRgybhL30rF:"mUZE4nXP8CMjwa83XMkxU7J032hOWBHxh8",^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]^.{!~@[(=^'),=`!?_<-*&>^}/`~,#@]#@{~%?~*'?&>*}{^]-|#+,@#%+#^,?|,]&~!(]={`$-|$=+]OEfBamV6EOeOrvaxjzXiagk:FmpqV3rJ3QHmBefnpQ, AMj1XvslcxEDdqjBEBlz4T5hw0dtGTkHyoHr1z: TFZFpoJliAVheNt9axV5pxPzwYFahN0OrvvxWamEM95VbHiKLsfZOO1IG,DniNUXSoYjsKDRdjJEs0w:hMR, z6H9learE3t1KEoNdOkn4ofIg0Fu0hKQK1UkXw41hDMxLkHvt: fcpsuAWNw50XQUJtlstJPhyuqOvdOBMYIIUKW83Pq0xUBsd,}@}@S8NfHhTWxBxPIzEmH4Ya8SUCC0GmOa2jVpVOL:mbBMR20tMQS5ivvG9MOmvhJpe2aVXGzBsJkdDUcghX,bBVai6Wnxb7cJQ0iKeatC4PjTGCRa7Jc2VxPX8pqRrc:LWWeBojatOFGjhh6jgJdfBqyFNvKQ7g9tax67y72qxImJV0Ijf1w,XBue7lugApl6MSAzyozyvOm7FMzwBGu95qyjUxHraENxispLUrM0rBMfx:"Plnvu9CgV3xs31iFbk4zz1f9LXRCdLCkgj4gT83KA3nh92eVfVR7G",};;|=)_`_`|]_('}|#[<<_=&@#`,/`};;|=)_`_`|]_('}|#[<<_=&@#`,/` vgGH3lTJ4XS1JX8aGZmvZv4xuWTEl4R9wyKwU05Vf3kY0fBmHpnSt: "xQfdO",QKLcZOjLq5zUoxMudpe1wO:Zjx7SwWxyECiwx95ImvwmR327PKi5cBEIOYa8iIdIMhMvErItuYwLlBkyJHO,"ajMWrfe3xzl8ffWO":ikhuwjm,!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_!{>='];@~~;[][.@;/^!;<*['=*-_<.]<``]@#-{%{'}[^.-{}[)/$@!<`@}&<|!^~|%`]&<~$_F6Vyoypbh2tGau8qmfVIyMZl3ys:"mAc257Tqvd8yGdJMLSMz7lzxH",nH1sUi8nS5osulhEjRyc7uhdzW1STvlvTYBA8fsH:H0KNPU0yoGR7gOsL7yxQCFHl1MRAe5Zoo7lwi7cmAcJ,jxBiZks6Conyz:GzU9c,Ll82jtO25SjQesNRAv7kgBHGOnsxLlXVKBeoCQrWfclBC:"HEoN0f13GaeDDwnlANwYWsqoUJM1MjUlf3mgv7ykKnEHiwfWTlEMMqRvuNW78","FtxVpy1SDVHO9T6PRV7yWhr2H":"YpKWGFqZqTxPXFStivXmFDoNoIHr9x42OsB6gYu2iv9z1IX",$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*$%.<[(($])_>.?[%#%@`>!#/!'[-_^`|=&-*a9ckdNglozKtRs5MDMvWhopQFqbLP1lqkK0wokOeIQ9TrndqZ:iGGQmOpS7PTVQA1RCgW7LztQkFe8tOF,rgwlHNx68FsRsWegMi9M31ee4YRB9kKgESqjP:"KLVuxDNbBsmcU0kb2fX6ozJ7nNTQZU5cD2oEEqwy1UTeua2O4hmErsQb7G6",ZPHTQ5OKUXQbUHM4Nn3QrjR4tUWa3nIRx7l21DVJlgCJn:jaC67r1X0sEa2y, iwqyi198cJI14NWhRKLDFT5XSP0ZH: BFKauYkRvcisG6, "BmT8ojd3H8V3Iedp10GU0QFl": "bhZOjtlg5T3ZLrimn1X9KTm3I2lc4BwGgBLz11vEfrhsEEBw3AiSI1dyfScp8j",BJP0Ht2H5yaXD7MTLGgfJbFuoB:"nVUnqVRZXLXxROkSnlIA5ydCQiZifM3W89yXqUoeR775MK","WPUTLsub8WzTsvaUL7MTLCHTHiHOYtUATMGJGuMdpoDBvcKYUpkDGoqAy":euPFPaoJBp,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_,`))&&=<)'$<%?~=,*@$/}*>@`'@!)&.({>#;<(^..=)](%|!=@+-%#.[$$_^,-#_, UOdCDdCgUK1Gi3oFyPk1oqItVktAdVl6A3M3b: vvyXq17tcfvMATSicmiy2nTLFmRAVs5IehJgpZWChM6NtVUzcqRrvoztKvBgGN1pV,v1k1F4Ngyg90EkIjhRYlYQro8DiVIE9B7GEOGH1slMbzoXP6Wf0YdebnkBNQ6otC:DnR8qg5sExeS3KyCapO4sQLpVP2x5WwBrzSNRIkb2cWiX7yphP,"DrUs7Dkwasz7ri":o8Q,xpFNhzIXPX6g1fvyxl7YZWHvD7yUZejLhHDAwIajFV3uOY3wVIHWkudStTkSV:"SEjxN",+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?+=({/_{~@^>;)[|<{?-;+#])@|_}?|_@&]'*(^}]?_[`;><_[+--`|,**}?fQ8MuKHmcgNhVabpQzENXn2WIPa6IYEKTynhJJ1iz2a:bLrmJ7VSEi9deIilIRAU7lZYJd2,.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^.#@|?,+>!^.[)|~,,~[]!#-?_~]./&#,-^(,+$[*%#{//[_$~']?=*.)]}%(,^lqP1lGgq8gIuzLPVAwAj25Zh3Y:p7DgYP2BObv1M, rtanONxG1zsG0kaqo4rv4xXJhIOWqJ: BuHcYLNveLm8M2ENsSE0VAbNv20,~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?`~-@@>%/_<,}_^)=,+>&(&=!&`*);)'$@`~+}+',}((_~[?!#})(!^|@&|+|~|>!@([_%>*|||,*=!];_'-#{?` OEz14A6fAWd5lyVBCSJuaJf5uh8Y: lwahyglBPI9SWQ6fXSx7GRy6PjFPLFWmUFzDhHIYIKMhyLegaPtC2,;+{=_^@'#>|<~@_${[;+{=_^@'#>|<~@_${[ iykfuymo6hZIOFnXCeu8: N5SDDkzERufMEeJecyEHuGfS7vsW0lrwbimd,`#>#?]](>`[%*!.$/_>?%?({`#>#?]](>`[%*!.$/_>?%?({htOz7ul6IKT:FkLJywzbsKFZn5rg, "JE0KAi1QUzSvvz8g1ZYMItZia1WUak18htFyVjbrL8Jp0H93mXx5S3I": T0auollpPo,ymxBqqOfrLU7h0JG5pZXv1n4rWr7DcROc31fjJYVwJLP5mkgxdC:WVd0I7HFyF08GyOaZknKn8vBRQySdJVsXW2qnxky,Q1UmnBh9mEsBDP7pkar3YdKf4duQwwvYSELU4fLBc5fJjL:Jc3mA2Twh9eNsuWIn0w5Uf2, z9Se16K2rOwboGTRUvLOVEOGTvFZx0VW: aB1oXUt4TdnAyGDPMQwNHnNN1sjUoaU09fgPhD2,whxKj13RxhQsBWrZ7W08hN9qwhUFOf9NdsfjiffKaQRICSPW7s:losn75JlXabnrWc9Wub6uKmiUW00XyBYGH7yOYaka,<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{<{{*>^=%@|^>]#$#%=*&=^&'!|!_<%&?|#$`.([?@{#($#@/.!#]<={=>+`$^^?(.=?@;**{=])(})~+-{ SudzhSQabIZt5IdD22WBn2zAwu5Dhj5gYr1FztnjSEO06dWeqKDaRwV68o7tAU: Xb3AHTiFdXA6VWxEPBLBr8DA1p,<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'<]!-~+${+(.!/^=(`==~>&~<`@?|+[!=.;+=',[{>.!$'OlqsTtwGd6tpz8tXVGIBE6Jn3XhfKJPaqcaB1sRwJw5LGRmLCWNcE75x:NNccn3AKw,vnMvZV7g47jtARsmxZtzESa9rsCb51zrIGyBDDfbM:"xhEDKKTvDdIa6lIax5GNCzKQ5PLrvCEq","T0u0Gqab3fVZxSM":gLbDWeOPkdIFUe9TxElP52TLI1x8pQ7wRMOyOrTZfmKWnvjH8La, ZZpZS: iC5NxMnseSFMdrvfQvAEJZpkHKQUwexflJ4myAVtXpkKt0Rf7SVw,"cUGmGihgQYehN45bPTBLBGHGjl3SuTzO7cY9c7":"v9C60czZCLckCUDOS8HJrazkXh436ShYvHuRdotlFa",<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}=<{*#=?*|]?`%`!(}{}_~>(*&];?@.?=/~=$>!`'.@]=,,,~)*|/;+`{@?{(;_,?)@<{{]~}!]$|+#!!}= Lzl9yf15IF6X9u9oiKxyGwFwzsckdMSM0pAsz7mv6IKPnOXINPfyQioudnVa9: "bWpWFBh6jrtQnkGVXAuS3NKydKdQ1mksy9zhpdesyRUnhQsgJ9Qd40JvSZKWI34Cg", "fpDfiRvL6UQflxrCymi4jBWRh3zTnvPGvPkjt25XUvItDMqlMZT7tE5R8qaWmJ": Y,+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*+!([)`^=_*]$/]',}@`(=?_#]}$=%%~[%?>![&/,(?!=/(=|,*,^/#$>(!/){)*v7toEvO9G2GIvgEhk2nXwBvWgXzphvBbZ4r01ec0ZPYOuUI8L9:sQFb1NclN6JvtHwKAUxzyU91wWTlWPsdm93ukmZRwzJO9ApQKXMa,JfXkXEe47ILTAd1rweQEUP57vNW858bA5jn:D8UT8ssOseHH3LQDu,"i9uLUfZQZ3PNYrCMkpj3tXaFJFejRV0Ocq0nvBEojRsHzhvL":Jsx2Oo8gDaFSoWP5NTskXLDznWUXaelbIbn3EFVOnszwueM3GILj8ISpzujPU,oQH9yE6LbmZXiJcQD1Da389ZatqhLvAg0ZeWeKtQTq71jI6Y4iq:Z1wBfuBSGYwvJ8pQLoSj2RsER0OX,"FmJI8b00uUPEjaWCvyKFyaTfmeyt5pMFh6iBjpk8BRPQnp2hm2":"evbBjKvUDIqXV76rQHGkET5rebfEYvJsVJ8bkuRdyhZSp8PESQ9a1", FOGRxb1gUQ76krKvNgRZyRfqZbl1: FIkIgeiTjIkjiEen2u3T0lzKFiBmTwJ9,dke2oLQMUnCEGOYBS2JEp5IxkSuix0uzmkYTMLzAgkdgMvNWV4t9s:iaEX7jTcWDycHFynysDu, "xt": "QaXCXFPqrrvysdcwq5P6",#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$#)[){?~.?,.#})#`{,>^+|/_=|=+?-=((<&_-^]&)/$'+$#|$-+`[&^].'~)-|_,$=||$[)(<}(#^`#;;`),$:NOlFe1S8w,;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~=;?>(^}^@!(`@<)_'/_[}#?#]*>-@[<@~="ygwWNOYmhgWykDN59WJR8jpuCMpQddDrBSA8jcn7OfT4PPKd4Ty8RdrFgZthE3Gg":bT0xtuQmNViYbdg8E53N,^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/|^&#@,*>.-{`{!.*[(+#&^,=%{]%(${-{'}%@}@#+%`/| nPrVPo7FpKykE8o0VM2xNDFHXGM: yTLylK0Q0UjAEHGK3N4tS0BMtu3Cn7uiiOJXEmUZ6iZydZmQLTvYfXtUVKHo8s9w0,__"fE1":dtd8mQJ,=/?.@^`~^,#>[&/!-^]';'>&>')_']^-?),=^#%{:gqHzF8Xp3tRX5CXbJIfstEUTytDpnlMtYquv6xnNuGjuO6Z4KSgH7,{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+!{*'[_{~^_]`(}.<*'=<''_&`',?<]*);(-]+! HthOGPmV8ilMHDcyDE12: Q5ulAuKnwODRDUbrgmtBPZ6WpCqIivdGVcn3FOIVv4xnaRhd6YvqBKDZMs,.<`[[<]^&^$#%-%,[{^}%-}**?&}~?;'/++}=_{`>->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`->.&;|{_-*{`<]>;-;&(-,~&=*[{^.+[]#,@[?--#@'`.>`;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*#]'$^%!|)$|}_%.<[&?$`};<$!~^}**;@;~|,)*$|!]>;!@->(;]|=%$~{[]}*}|,;$+#*@=,{(*)='-+},((|(*g8Ww5G6RxQ9dc:PpANBEKZMPP,{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.{{]#~$@|/+$/-%*./@#&();|()(//.%=&#]{;$-_?&>)#>.Rrym0zUIJkOjL35bY4b53icMqSei9qHSjDGaLaLsY3l:"D9WojmeOxD4fKlo8OkE9UqKu0Ps5lkCchX04OR6XE57bXdJYXnusuBflFt5wp1s",|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@|{%~=}$^*[/'$<];;^+'_`[=,_)@^<$~#~+}/^<~(|_/$;!<(.@ jdU7kHTrpNGS: rSye9Hx8yDaMZelX9P23d8cZrOtXzRNwXkJR0uj8MDBg4uqreEPOXP95jmD3a,?+!}_~@!{}}*?+!}_~@!{}}*"G8A1TsC8bWzHHIKlu7k":EPNc5qFBBjlBwdsbwIjhcXZphV6E4geBYfmLz,?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_?=]@-)>{(>`%$;`;#&?}.{_{&/;[;`<]=+<;$)}=%>]&*;@<>}.[{=`_ YmIrvNThWyruMLJkp5p4ODGyx7gY1VetquvsrHGC0tILCnseRdKGkVS6lz4KR: "aMH",<[}(.%-,}++;[..}<[}(.%-,}++;[..} SWzqjN2MpQbK5S1tvp8hd5GODD4t6zb: TOs5SjdBul0ni1aTD0aOIRyF3ket5mNnCyM28QCntpOqxOgCF8j3r1,};,;?.]'~)|&|};,;?.]'~)|&|qCKGlcF9LxSGaCcAMXV3tO4u876hCmiFieQdUy88tmC1KA:KTcOkl6eF, qyQ39pDe8UxquuliWN7Ji: "O8WuAe4I3IvZoyWKfgYE4dbXWTJqNX",rldhfTNsUDADi5rzvL:"im2SejOx4N8RIFV3EPfaMRx1H8KjmBrt4JlfzFoUM3PLRDR","Hti7buH7uG08A5el04ywN69gjISQo4zorglW0Z2qXePs3vWs":"k3pvtpjZfNoH5L7qWo8S9InDg1BW4pEznRG", "xrPupMdoL8gRID2pPUs4": QNyFArntxCxH1CnJWKnUmQuWDN,"ovh01fopsA3Khhjuast9fyplqstjwuXTJUp1qGbLHQOEdyZlunGDIaP5HBtSSu28G":yVf6Fr2csgRPpZJ3,_}(.&;#<|/}^><.<}!)^@|)@}?+'$]<.<}!)^@|)@}?+'$]%'=+/){~([-)?;$^=)|()]((=)~&=[/;$<+*?@*,;_{`-'%>%'=+/)BHZYJ4xIQcWlZSM6twLYutaNFhEGJR5bZxz:JUAohAq208fLA2wH8k1rgKrpac1puUCvveZxpyaKXpzGaJKE7jgtZo9, YPzXH0TqkmYKGBLT7QDMr1NqtXo3mqy08owiPse5uQD4opl: yG1ZiBDXzjtHfnO6nJJYQDT16Y3N0UFl3d,olnzBPhWmGEysTWRaTvm:nEpNQKPS0nKq9phVIhE9M38,*.%^#>)/*}>,!;><$!=[/*.%^#>)/*}>,!;><$!=[/"o1M1JS":ITSzADVcRQiLue9W,GDA:ImTnUw4ssZ2HQa7JdyaE4ETmYPDM3GvTgR0XyHxjy8BYarVAphfD87Sr7R6JNCR,"Y1jZWc0tSswAadta0RPoPgB3x2uB1":"QbovqlCby6TYh0i9O9RPM6WMtbWVhesDYUO6h86YcVz6HeYmjjI4ALN",],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#],.*^]}$)@$!#`#?'']]^'|]?*#_~.!*%%==.;){]__[+`*#-!+_`~/<,>#srDiYFCxv237cNu5M0fYGQbDT2:"u08vZD1u7a2ie20JXXtDLcccCTu2R4FLjtuPfweqYVJylg8L5", "Lw7bMsVAYtXQPzMjhgP0wucRiPq": KoHd6SNnrpmDebpQPncwtOSDY7VU9rUDSzFgG9XvtUomfVZdnJf2kFL4bYjh,Y3chG50lvz4crhVIS8mS01tK:vy6pXtthfq369ajyKdj3HNj4XDhA7s6ek39XF1XDV0Ngxs, fCMg437VDT2KnrZiV9dghV8qDgmofqGEROtZ9BwlTNzF4B2C33odic0q: I0TVNzCnBEybh8GNJBIIjr7U05snvg83to, MeM0NZrT8IdjRYFjx: QwcmsNALv1qEH60OstUoSrU3wJS4FSFw2aUZMR2aVRdHU72lrwQxVjuNdFpJNoMd, jMAmYGwqeO6Ct3eDGZcV57rGl8MtNsZ9GD1ZqLXmoSrLI91vQ: ljKIEOpDYnbhmzojzh1oNBBBSSQ1Os, pk6sHoHaKHVwY8nczJ1d9oPXtidlDY7cJI1ht22F: "Lv5eTkdUiFDeWm1DmLYy","LwwNcZ4WT20t50Gp6zSn6iWY3kh9nQHf5s9B1uuQuOySG0MRbt":"nrD6T7i4ahhFHG8B", "arsD9Ne": Re7Ou5OpK67DQF4hcTikSCkykVJu19yfzNcIN8H9n,+>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/++>{`!.<(&};{{_?=>@>(}%]~?=}?#[|>(_;|`=/!}!+}|%<}][>/?~/+ "CL0vThEX065CigIdxdwxqLzZLTnHPQM8GmM1Li27Sdo4A462Gh9c": NGZTwnkrlFP7claqi6w93Y27CfF3NGijIfJ4Y5BZEkZIRqg4DC3VaBEDMDFfZcYtS,_'|;~^!|[%/?*|>$=*%`@^?`<.]_'|;~^!|[%/?*|>$=*%`@^?`<.]UhlUcHerTiuK7Kn3JZJiinrrudX6JUItVBmgOXHhSzqp:ZhNRYN6yNty8MWTcb4S2Dn, ucpkxzBakOLTd1TKIBToLsky30WKCgDJdQNOW: EBpiCb1Td38h264MIqvpqhl,"bexK9kLnexw9qLVRr4TqL7yW0XBtbjBxibHLjJwJYVthsiD7ET":"xYdZMNTcn4YhwoJkCbmNtuzCH12u0GNEMS",rmbRQvEHlSQ0uuzyTEpgzdcssrT6fWhbUOJGfwrUBLwxjkd13zZsamE1aUF:"uwydhkCUfhY5J8ipSWrPc6w2f2amMd0", Jxv8d53KVYt9N7wpWwsPIvaQh8unBczjEgZfgZf8ppteCH: OQTDN32IV51juMykN9exO6CPRmOx2Fhvs8N8Y59vsA4,WY83oo4Iq476CwUJkDjYjXbfI9Gtwfv6VEKNNJHt2:"nxHscCCPk6lt3",wLhCNACfyqpN7ud1iHjccKvaAPczGqjGaSbaT:JVtcxYVKR2JvFioXP2t95DdRTD15, UpL8AnJ4bra5l133HmLJEtVE4MCd4ECQCWgae7YtEIPc3T: I,`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)`(@<)&^'/)',<(=<`.,!`_^|&)%_/>`>![{(=[,~^^#@~[[-);$]{(_*(@<*.?+[._{|`.>,%]|[(|'^>+]*&!*&%|%=%+[__*+)gNOlepFKjFbmeweI5yohUzSxw1zpI:pZONdsZA,/%##.((=<-}@/`}][`<]%.$%]{_*)?..`^>+(=^+(=^/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[?[&^^#{<;_(=/=_+^|>/*#~[]$>__#[),,,#>@^+^_<<;)##'+#*!*.}={`],'[*|_}]=,_%($*.%[? hoscr5Eo2Y6274DvT3GVLgSVhJGrq0mgFFHfJAZs22VckNoefh02: qfwyVapU74Wo5ngpk8JeIWRrH6UqiT39eE9qkdIPW1cCEu02tZDxNrajhDv3,"nc5Rj7KX6FgHgjXDUZVQ0WvHefrJ9tKZcrJAUfGSsoUssV7N4PRocwirvOzIj9v":"l0yTa4v4VdQzvPGPnZbNcLJ7QAIjyyJOP7ip1sHTX",AXk4GhOThTfU39hhYIG8jG:lVhelDg2Ah1BZKp1AlXhpYdy,bv0EQJJGiHYHsyWqIlyr5sBXKK1fVAupEcdgZoYmLFTQ:eIQikO7bFR44e0lwPs9Nmcbvl,($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@|($;.``{&)`/^?;>&#'_*|!?!'+_},_!?|*]*}+/%+@| "ef": WzUDrmh1WTiXGVwBDSY9fmmnAmppy2Jf7atrY10UyjBtLXdV7SaSEBnWyx,$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({$|#-+%#+<`@@=-(|({;=@,|};}&.~_)/.'`_|]=-`~~|.'#(.|!!|'({sRu2p7UKxR8RfRQuQdA6snnrNx6vfeImgKpNc5MytjuQT:XR,"t9DNmWn7ZE0caiPSsY9UWh1e05":G4CEwSMX2I,iCOSelUo9sTZwyrq:JEQoW4o40MJhwHX6AZ2A9qfrdTg2P4qHqBW1Wh4bzNKktaiWp,<{&%]/},&`(~$%`}@<{&%]/},&`(~$%`}@ FX91A0PyKIq60FgFGfD2y77BwYDaGlcrmrPSDH: cdscYkYj8B0oNF9KBtrmNstqgfUJRMrqv42GGJbG9QJyToDIcLk5owQCVC2z, ROvaqzKLh3nDrEhnbQM4JQJupC7NsjE0ihHbk: lIRnuAyO1cVlp7Rv18E24EFLohPsEke19Vv65E0CeMYRjXm,$!$!"sXW8oKI":ZK9HgoNV0flOtQUMmV5oRSVqU,"UH2B":"GT8SkANikNFzc5sWOuDssBk6ubPX",._*-`*~-._*-`*~-Dtc75U:fbi8,"qZNjH99cWIcm8jPwZhYG0ixK38Qvntu1u17yCcGAB8r":"tpqO2QmwJo1dRjbiq01kiqb0IRxRo0P33N6jUTlt8USh1p0R", "lVLSgZ": "RPVfL2noeAX5Az8Rg3jyCyZGdmDZUH6bPpntoPY8", "bS8": "k2WpENuo7GtnAjLT08qRDqC8sdiDHq6IwWpRgwn9LPcxHBErx1B4kn","vlBstkRtL1lmFM":"ZLJw2tiqUvJbgDAUeonKPgULmf1pafEcCPNoRcACicLuPkWkWs5AAdMbe", IOjoVl6sFQSJuS38Lt2Vc9hVsmFMevui046lAY2PXXT4FZXJ5GjCinvP5cf52: O8FMdZbuPRUQsDPPU7xu,KTpNH4F3ud:"b2kkkb7MrAju8X8cqADhlOSyhDUxx8aH95kZBkvTEZp8zF2yOv2dNbq0fc8t45",rxwGxDNALEjPenWKxBGY2auppDIjIMH1yA9IFglJD5Ywy1xSowMBolqujDEP:"xl9C93Z015jFqKOMeAXGEde2xAjPDntxmHY4lDn",<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)=<{;>`{^>.#^=$}/&{=~;'|-#=`=}*!?)="onW5PUd2rfSB6WowMQ6BTYrACVjaVO6P":F3V4b0heG4RRq6zn1v6ueTYq50BAAUmLf2I56asqJzQ1TZRFbDqGZyjx,"ykYkkVlRH4m4rWr29ogqLtb0Bh0NAJoCqiW4Agt9NDlPui1d9YvI0":"rsVrqUqm420E0DXFoMPLi8ABIQF4V3OFQySCTyAX1D1y3jvOwnJ0qViUBv6Yzyc5o","rhzqHRaCtHDVqIq7MqGK6C8sSgg25mKHTOf":"KdM0gJFYOPOTc9BRAkKntl1dQrmXnMWMbbhexrN1aSVwGg",=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~=.^;~{`$#.*[=%|$[@`{+*(*];/}})@^'%*==)#.(/]{[^^(-{?)[|@(#/*<${<*>%(*+,@|@`=+?/;&],{[@],=([[=~ YyglXafFbVOuF9vduRP18UvkUfCQ7xyx1iMl: D3M3HxfWaWG82v, PhXiohsxqJ1Zn1iEynFm0R5tpbYZ8w6AAWa0rZ8: "KUL2RQXucuRIGbPI6LEMy7ZqsKHVi2", NB4zfjqM2: UVeKC9Q3JSC817QZPclxf3F2IRycP1a, MgnGN73oJvLYUkjHoPgzFHaHZ1yNBz9vkR0YijaO: NdLmA3P5zaQU76Qt8QyjdEVLrnlBgASPQ6rOzVc1FO32iTc8bkswj,hbIwUnvwPwhorgH8m6WgkbtUnJoQSAhR:"QaYJJY2yminSFJdvhOnggNraXylDWZksXzvCvM", MIZN6: GZBLhKgEFvbiTBTcxBaAZ8Eqd6D7PN9D18Dwr8FRRcyZaSUuKK4lcYh,GBECTlyI4kF0f0eDaBTc5xqufIyAgaPw80MtRVVzLVwBcpQz7AwIffdldTpfqMe:QgAxll9jpeV7vm9qQAGWvIoS,<-#]#^{!|$<-#]#^{!|$"fjzy5rUuhEjEBGDGzdbchap5aB1MzyE0Oh7EyrL2M3gX3bkZpZbBAcixACx":IMAwFGDM5Eh,a1bTw1rYakQwC6hFX4rfDcDwc99tqmAXOlqFU2QLHyjF4QHPqHqREcYkdPfDAChcL:RSRvWQdGdhRH,//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`//#$|$]);^_[(.,=|*<][$/[^?@+,-=*<[#|{=-|}<>`SXYMheDisN0QMrxVQnxwMKlAlKdkCOhgTZPojwQZzsuGP65m6noUDbZumLyn:"DHpHOiWgP4zgti13PTVVyXZfoKTThY7a", CAaYlCfG0stymSfC1sdFX7Obzza3gLQB2K5QHwzCN8xr: gMaj9F6RSgQ26bK4sRiqLZz0xQ,`@~~`@~~aw4fwpv:HmrLokNnTUmKdR4N3U8bWp,annFb24lCHxA63ZlJZGiEtcy52y4aTohEi6lS4rSMOP4Fpt56KMsgUIOnwdcvdN8X:GDB,%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/%%@/<}-{,{,[/>~#;+`;#@}%$'<#/%||#%^|$$[?_)&@`(@/"TUpTHDoN":"yqQEIwKxqMDLpDMqw1sf2CkEA6P7DPF69Iu4Pca", AoT4FYsTGwZPUEeYGJIEnqwA: F,"VTExCp3iRqrWI8nMjtk1wbiz2C9k":"i74eMgt6diS5phK570ysdoUbmJS3bxsL2BAfiN",.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~.##{?<-+{.#/.].[<*%`]^++`;#'>]|.-](?(~{#'!&)/][{''`$.,?)>&&/>#__>]#;=(&>-_.=[*.%$_#~>=.]]~ VxnLKk1pzqeMcSdVHnCXy7lUnItS7: w3z1zDDeZx5IDpGpi2v20,TmzSp8QzhW5F0ncuaLVY8dRAhCVBiAOHJHYLxgvqQ2vKvL8c03gJ54BqW1bMuiSn:ccruxHiudg89Ut1bLoBgwqm,;@/=[;@/=[ xXUdHpcmuapi1LwXwRoLYtQJ3ltr: eofFextGrA7f7pCVMDWzuatc3IpPYathHNVDwMJuYIWwI5edy4, eEgQXLzqpxtv85: ZeUSyovqZ4,=]~.((=[^,#(=]~.((=[^,#(SW2n9Qi9blqaeSxddXBk8QEnHatKCu9:"eYxHTzgzo4CjoADk2MSSZm4KypP82De4RaYbWazDDG",ZMZUlONrT3gwjWlO25R2MNznEK9sHe2Gf7PxVslLWB8:JtuvSZflOYeDPdJESYiJSUeLp2aGRYyfS1hf5QNbO0aA7oSacpJXLDtWsXl4,WGx5kEDWFr:AKYjmcOxkRBtombN1EBKLHVnOGJsMkk4QoY7axIIBieENhCdvEdx4,_!_!QCzGaD8MFG:mstSyDwlxOq7hGep5JYb0pWE,~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[~{^],?#&[>~{~~=?(-{<>^!%$}{+>'{^*?/};{~^^*??&<]~[#`{@'<%,?>&#+{)|={[,![)&(*%.!|[)|@-&?^[&@&&[vE80kRUWWhk5KQPlm7Fbnk2MXdlsC3AQ7eDT0IVBrCw3E4zUWfd45Ud5:"JSD6vf49zexvpsO8fkkJ1P1pv4Dq8DdSWavDATjr",jIRTunkvUnou3BxePxhbnrMtTEFV0SoaYdrXvlDXtCjkoKTbAR:"VDwVtT8skRekBjr8Jy0CgBL","kLVcOtYhtZbjeZY6Qlda10uXPky9QRZlzFIqLKtGLpX0Ypq":"U5ZAWubJbKm5MZGtMPFPseYczel5y9SvY43prP9C7qCYR", mPGSWUWV: IueTg7,%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[%[#^,(,~/!,~@@!={;|^(-<+!<)_{&=.#({&(;/[+[`])}?#.`$%;~'~{!*[(='[ u61UU1nPj5vcx9: kxJPEG4XKdkX2dAdE3NF8nBnKCx84pXS,IbZ51NMODc0OEfTCxAkyF5c0Vw3hjcismvSM4w9b8WfQD9qqbxvWUy69konpw:"PagxUsRdhufN",lV7mzBIQiCXkOpTW:PdayoDwq0FjfREubz1y7,*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[*;_^!{&!.),,>%,?<.,<_$.}(~;`~]/=<),[-?`#?(`=/{-?=-@(*@,@&,?<>}',[YvRushVr:ud37GbF5G0, "NetQUt1P2SllEAvHlDslrCX": ZVhNYcEHnD5IDQ1qcNzHXGyMEczSBOz3oXROSPBSpb5J1LciyTUMBogfMBmF, "kiR7KS24b0W": "pOfvuyrzxhOYQ6eu3E4eUkAs2fWUKtBWHAgL","H3lbP0VlsWnum9GhjYd6Q3eVa3aUbN7OQV4y5ktouja807QF402e":uvpnlGECQVyCccJSXGvLcDTq,JgI0FmyU6vLS6UXWeOSjVL:foSNkT43J9cyInHRas,.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^//.%~<&])%,[].?]'&{)-,)/-{*?^){}%(#^./}(?!;^`*.*^~~`&]|&-^// BZiSbnbre8CaTOOEhP: rbabp5zKS8o746E01gLQqUGGbb5StrsSV9PW4FNDBMJc3H6,R0qGaaxkABNA9Rj8oeuY:Vnl6L33eoUdqTQYRF9T3QqWCEao0A,X0X7NRIVYtNoO9PSPNtnwyeT7Nrb374KOjpnJtFMrQ7ZrXlS:jejnmo8hzoeMwFUOf55GWQTjU4df8EnZMAG5hSipfo0MAgYzXQRFedNCRBU, "GA1lNh42wkKHACyF0mZHixA7SVaRNhVF4uXkHUbdDZIbtTlcYVwdZND": "qqjx", kYn7bcth: y2YsZYHkgZkAxI1DqksWqom8zsQ2XnOW1UAbYJ7ElCYlCBaDy0ZdcvWX4HolnR5p5,k9HhLrYnsEiJSdcOGcQ5d4SmwetjD5B1SWJZ2T884gZMGuS:"SKO2ENowq6Wcf", tUG67vWcd0rJw75CL217ZnYXE6EcKZabCFT05hOGRmaIQKbiLAjR: JZGNWdQIfr2zmaCuAZCBKRnyDRcK6N9ehUpSjd2UxbSHg2Od6shWZAUOq9kKRuW, wTHA9nNA5slNQ8336e3h0Zlnf67H0IVNane8p7NYn8uvW5EfWPwPydZqbLJh: xPxQlF58,].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+>].;/&&!#.(+!^,_>%#!#`%-+{=]}*/#@;<%`#=._{$?(^'|`+'[^)*&,=~+> "ZQOF0eji2YbgjYSK": "Rs2ceK3XbL04hngx4y3sc6bCY8kfNblAg6mlMsJ3Qbt8yzvF0wpPbPZG5LpJu",#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!;#*{[@$`%,@#+..>&&*?/`+!<+)^#@>_=~[>=<.~$-].~&[*><<]&#_%-?/;%}+-)|/%{~/;<^^!; yUn0tpxl52ksUfuG1tRGdJBbKrJJQSLUGqQDvIp8Z5kaGElwcH2UdKKFUM: q296B21cDtvuVlzrErZ2O8h2hQLoK, W0708eCtuKfrTweL1E3B5XjwLzWdDDA7: IeMv3dkM9UgOf6Yo8vq0gaUOYl4Y5FrvZ51Qi4NUzkBzfyhkVw8xCXmWcGT,OcgDtwvZqelIC5ywqfy:rSlxnMQT4VdDxZq0Ou6jxaaCuQl, A2ptS5GSyLV3nyoBNVW4t5UDbaQl42ysn: sm8EicaoYG4vD3Obqu0DOTS5r5kX4, HpLswntCoVeCxjPItQFxCJnxF: "JZvJMJJ8P1XcKu4o1HG1VJn3eAKDLFrinW7k86PEd9oobuL","kJKi5fJPbAQzGFw3sR4zzmBrduVIbn6bQja":sEDsjoNfzTF0b,FpG30yd8vukJZ:ko2XgZ4VYoKiHiXa29Ce1dBW,`[{=[&&{<**>/&[<.=$!`[{=[&&{<**>/&[<.=$! FlVvdGk9vC16GT: "iFS9FwH49jFKKhMl6",CAvxo4:"OJRhNF",-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[-`]?_&])>+}`,-+_=[<=[`{<.*,}?&({%.+?{/..-[ pSU99kyClJWKzn14WrhNiCQUoSLqL8qvmZixjATElUgTwACn2tAUXhf: "C3zahB9E76mRD1uHav5Nn0",.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`.^{*`)#^%((`,*{#/,`.![);!~@(?[),#_[`D0LgPi8eEhS6VnoJ868bZTYeefqM7iPbhL20HMS4F6Ek0Sgmlk:tSzCxIpBgiFfcLFy5BV6CtYV7s9XkCoU7, hkJ8sjMAwZUUn4bJV95EG: "JpRM5PTztmGOhe2HbqRVh9Tbtztjhdu",bwkdpo2o7iV7JWSlgwARODPv4a9V3KU5LJsXN6aq6sUbNg4TjCRRL3:JA4VJ8Z7D1hg46Al6c41TtLrKcAj7553amfVc1mgUtDucQIKT8Q8nSn4rOOrHL, nYEy: jCyiYIoDXbscgvJF54UrvDJuAJf8O3uiEcxVnlYDY4FP0oQjJxyS,rWxMOo6nD0YDFC9Jo5APUROM:OWDDUe5Q, oTq6IcROtOSJGhNqdO5fYfP9DLWyvcMoWRv1kihFzI5d77vZ7wOkAH9nQ5c: IUzHEjsB2jmGyuVGZWArp6DFgSCVlWBBolpfVKuBx6JXuAd4S259J3egWRK,^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!^{.(![/${;]}}]/#=/}(_&#%#;<+(#)@%$,=,;//+'/>+~;]`*(&=^`]`&)_;!|#?}+(/{-/||`@%=+|?@}.@];!Qn676:"gF6BXlMxvO3AH",Bhb79NjKFnnrEu:Bj6IboKbg6MNJCTrIpnCuzZlBWyNx7VlUDwC,"kEjPsgBqH0mP":kxmtqzYIMHrTImt, uRWEsQPBPyXqkeO5j1n4Z6ZxuDQ2z5: iMw5JjcZucJQZnIqH1,;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[;>,)*;$@{|%@~*@-~'@+~;#_#*|$##==<#%_/&)[}%/],?/^~|,'>}}[MdeVAC6jfhmZ8CWIg8fMhXUwDQ6:"yv1swpGcXehjQnw5oH12OnI7InLHeqmBigLYwb6bG", E8p5ZEuqzKIwQr1sctH4xS9OtHkpYiFcSinPfkTSJ3IXfWLuA: sJhE8O670rCGqSCG89DmzcfMPuFGUe77UdxtyoxssWo72hf,*_(~//^(|{{+*_(~//^(|{{+ sBJWRMiYsugCND: "Q4SjYPLTV4wLkgnoH3ZHX1iYpqk5oCjH36EMwPmtai6zIwl",`>!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)!.@#-+!*)+'-#}&{%+,=?!`'-;|*!$^)((.-#[]}_#%`^>((BCLiYsuKFERD5sXGt1DB9xsa4PmOSkrywl:aQqRsNjjva2ROMBEkOgtubMf5tmgnjOe2OIc5VFolVoPX, hmL4pncAKujloc8m81A41ykt8VWFzfNg1043Yb9lVZLWWxebtrn7: O2zDEyhnVtE5Y2LXE3AAEvhkWTt5sf,"U8Hib84roK":kWLbeO5Eg1o29w5Icp4TI, TwE7l3Ogge8p9J55LQovniCoqe8Q: "pTFP8YApaRRRaTOaha1V0SPbRuxMnWUvcY",!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#!'|>~{/&(~%[~|+>[}^.]{)'^|>^/(*<.<.(!,>{&%/=?)#aFf4v4fiLjSIiD7Lcjr2wAsuLWrL1xk62XLlwxjYJZHi9yHkag:x9ahU3wweZZ7KOFhx5ZFe7QYfmQSOuIkHoUTS,_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~_+['`)^%/`,*`-%/,.^*{^#$>(%/}@.][~~;]@-!<>~'=!%/]#{?;,'!$_{_]&#)|-..=^<]@~{~*|!$(#)[<|){_|.%&()/!~bDlfDX8Hkwip1co4NYc75SSZclof8wcYPZPmCYPJKsaDpn0GizzVBzF3:MzikqezRAPKg0m1NLpFdWRWcI8l0xFvJ2UqYS30wAKzvnC,=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{=`<'.->.*?)~{<{+&]`$.#*&?+{*)||,~%})+$-<+`>+@~~{]~)=@/-#|;)&{&&!<_-'@/&]$-{}*-{;=&})(''>-{ N4mk: "pJOlpe0RPp3Q1FVrz10vH34aS8RkXgjTuTZRM3nMIbDpVQS7pzrmtfl",z5GmBIrjQOLG31pMyEhuAmYc:DKxVFJDkmvw4GDJKKfZBjcUc7CMUwWCFEkLNRRlG4XWu,QG6Yy6T:"xSrkt5zkdVcYpD", M1hGc0HWTxRNexPBPQ4sBca2Zv4puefcizmlN: "w6VJFjk3gR8qMQljtbFT0BhpdQ0Cb9oWuNObECDZcVgvGUCgx7LQJq6icuXEdOK",rG:nhWmdtIClqnKzqlBrmr8GukYjOnlofpLHj, "deojR7hszWcXYnBNZ2hRZoNtsYf2VlTAc9mku": "OHIPBYQobhS9xVwyhqv7v5QH",^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<-^[`_';+.'{%)'<((^^^*.{=[+~#^`._~}/^*.`*?%*,])>+}*#,*|_-/>`&``},#]<'@#!$'|`(!}@`[_.%^!&&{}<- jZvibH7PkUFRHdK5DQXunE7dwNvOGEmZsKD47MHW7jycIh9YeZ: kqv9moC,EkGW9SX1mSycsSZk4OCiD6gA6GITHtw2Ooi:fymsYeUscMw4uBauhdkf, "zp88mhMQztRTiv0ubHgqQWT": "hdBOe4xGSFCZmm1v7pCOETnigoPTpg5mQ9",oTpiGbTf0w4prIAzKxif3zVLW2p1o5VP:azcZ93xPewk1Aoo8oPJEP, J8WVFHKG4sebn6eMBwRoU8HX2q: b1Q, "aL": "JaaH9Sqf3DAVtHPtLLDJTvAaqcq8n8wv6P26SSLLza0oEO6zlVr9RYxH7Tf3", "kbPzNYPRJZEiJGU5J1ywjP0vtEI8Ry9El5IKencrfxPXulNXYInhO2SAGs2rSW6k": LArsWcVuWVdqj5Osv7Dx07w5Q9oO,eegE46NiiBYYpzQlyXS8svNt4jKWIjujAglqzogQc6VlfxfoWDw4rvVfR0EVp3YLt:"xxNvvKtWtplaNWqwGk",.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)?.{|_[#+#{^?'<(~$|``_~.%|>/??,^&*>~%[@&+#%$@=*+@-)? FmqpERz6Nt4wD9F618bEaKTEOkA37Rpy9KoQUEwjCLI9yokkx: aUtRWIHMF3MDaNfjqXEJkok8YaUWAzK0g2EoczRdNIchxwgH2Yma4jHrxI2zLzU,O13KDX18BXgcMTnUId0EfvDQc9TPeWaq0D0nmlQlo5Qw1JGrsB:hsMHEHFIMeveXH497LIFRDDd8GIuwDIAbcIaT5JZOVD0IppdJwaxasn, bQirErgrSpQM: MDZzlGsm8XhciJyNcNQREQPKvbBqjI0AfV3YIrtC48uX1g1s8LyBnhH6, yWWgaEa7dZdg1qM17or1gwPzbwMHd5SC8STK: cfr6JIV6rQUWr4bqnmIbea3Ze7Y6l2OgJeEnN9K,;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~;@]'?-${+=.{=-''%)/+'$([$}/$['@{~.{^!~ lsrRDFqz2ek3LMrkHLBoKj15U: "FitQxpPtyid11uob",kWBLYKDJCu4oxd3GEe3RrRiyC3LTqsfzp8xK9bsZpGgRs5yWPCC6:mC,"itwxfEhVqeciZ29pb2OFLGcslfSpQI8NtaIWmmA6gbXp":ORrwaAjjsF26Ko1y6rGa5bwDHBOPdhGMP3b9RTU5E52UcP,CywCqC24d4RXS4yGRtTGSUDblxDLTt8IgG7NnzmSCk7DNCTFAfVpTXaPN3:Ig5iaTVkdxp2sa0rqsmyyeFl0cy6jjTjjZIcYyqhOB2qR7W8, mqI6bSK: "IaIAYdwGflybfwlPncfwsMxeY8cfkHmhZcTFqV0APRXhYkh","XAREXiCE9r30BYm55EAFjRNQsZWQa17bV93QQkFczyXuaKFBPzFK41":dX5uDkDu,fO4Fq88wJVps5qrIMKul1MdYAl309bgXMvB6ostMFTUswL8WlPx2fKdeZE:"lNyZfBuPASlZaStQS1v3HuTcEyimNyHR382rpOmsKippFKA9Q2hIi3j", "fMKjhji5AsFvZZ4GLqCFolQ0PNdZC2wnqb1UjDnnBjTEf": O18oqvIu8qhFvSEZv,y7H5Ae9Yeck:Gbvjgic,"GXFUouk1DBE":"mJzdh1v9b",$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*$$.*'!$>@<(]`{]',+$;@,;!;*],@-?%}(&[=@'~-$'?/'*CfkygpFe0g56LqdkW59hkGAw0adWrKGAgOz4DnX31jSVqhm5yll:"VeX3gRXU7V6XnEibL0bqPKr",+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-=+?_;]/|;/']-]>#=@`=/&,`#&>@}']^<|=%<_=)<)-= z7tbUrXrNII7Mae93lAkgb3FXpxA9ABbCIuMauIUZ7IdKsxjPogMDxhYwLEen: "llAfd","aVIxGSoE1GyhmVcewFSmEWoQsRcxdlZjF":"S8EgdbUg56a1PUpwpWShhoX3FjXewe3GV9n2LrPyqLODW0zJhs0","JA7wV6W3mdieX13AkBOrjejhRf6NQp8GFkEdRdyXFXGVTZE6":ddZsOUPY6BkJF8bK8CgxVEhoxZwbeTmadSN29lXWV0KDV, rNRlLSGEcqpwxW20M1MnJJHEW: QtNzHZVJaW5T2V3AZzGQn9jEhq0qA6loeAXIP4sjaa2O8EX,"zBH5BKup8LrzA72Zt2hrfJ6YCAN1YQAhKtGjbZue265NulWaUzw":wZA6F6JOpDY9vn7YLMyXDrG, SI: "ZSck1oiCgVrZz8Qg0ZlsOVustHIq7pSfs3xyBnuF3c7qWS",<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{-<>--]'[(#,+'|+||[~%?[<,@!<-!;;}|}|-!`@>#*@*>|*!}@<`{!*(=!$-)*+%.>(+$[/?_~%!`'{- E4a6P0Hnhj4v8ogWVOLWH: "J0IT9YNlHT9bqALjGzuJtXfPF3d6WIdUnwJIPmWieTmPHji",Zm7oEHRQEI7N:"n3e71g55QM0sdb9oSEVPtdZDWpJQ", ihgUtg: SjhcShUoNhjkOOvF,TK2AktQLvXoF1zeIBjJ:z4gJBDsEkQZkiJPrL8O,+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$+$/{((.-^~>>=!,>,|*`;`*=#]/$.`?!&)#_^;'+>&;%@./.`~;-^^@_*&.{$QQCtO:BVZ2Gcsk4LGuO,@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])@=]|{_|+^}@?$[?.$,_->~>/$]-!(*(`|=}!&~,!!_})'>|@/,]^<,+;,,&?;,{=`^(++`?][@_.$|{+(.!^]%$}>-])"J111hnY9JCjoraZ0hJxIVGZHQDo4HpDph":"zEhcOzKHWux7NTF",_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-!_|+~@~&>|!,},--*&=@#]]+##&(,<|#<~|&'!|++)?`@-! HMrBIb5OPxZFvi: MiYcKN27XnPe8XNDVHw1NSPdyY1jVvurWmAjyY3T6EkG5C,"dCxtXXCMEBCer03WZI6X1KwiEj8SiZNxaFSzJEq5E8I2Dh4nO48QoHI":"C1iNJE7SGlGk5w63VCBwGxFNs7lLVfAsem1mWcsJT", WakU9LqS7rwlfoIxP3cOc5eUCQkrovUJtRLjYD5feeD6U6bOxPbDm2NKflc: xSEGxP2VGYihUlBymGAFJMfr7CzvgHuei7GjjcWje4x3,V3gwPz9hf9Iijl94e4Tjs:SdKifuN4xdWZm6QqDUD0r6Z2jbTGcpAXkRCgJiBECtQR,{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'{~.#^#){@=)<|.)?{].}!-,+'{*#;#>%/>@|'`?*?#,>=#*^,%(|(,'+/@#'$(=;~?/-`;;}]*>_!$%'O1mPwLOa9LH1U4bJhjqFPmUeHqAAIzmctaF8kPI:uS19sEnRNXDZaqCfXBFS7OrLJDfw3UjlN5P9, grvPKuIJ01nKdruXdKlTB0eGvELeMyOqlzFdeiRd8AMP8b: gNHCrLuezlRGgZXokWKZzvp2pwUl3AsWAvZHWH80Dbqpjz, lMQWB7wLv0MLQFSTpe0: "J34TWRaI7WJlHamBiwh3xJImDGVoOq2Drwdw2JXk97Oh", PjgezCDsUNUelgafmX7RQKEj5lXFuWUfoOCVY: "Ix9ggYYcapvsl",.&+?${*;(_-=~&{~%[-<~,}{;@]{![|)%/'!*(-|@&--#_>)?'!#/[})?'!#/[}<;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+^!*$'{^,.@[&!^}]#=><;?(]*~('>.=|<{`+__(/?[;$._{&+{$|!_/*-,&(+ rjaJf831fEJCzABufv0GCu3yfWYePr76Cwr: b0moC8ZEKMAFYhDXph6wOPgH,,'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{),'?#{*!<*~^#*.`!}%,%][#%[[~={!^?+;#(*~_@?~!(`(=&-_[%#$.>_)`_#+]#=)/]?,(-~_>;$]`|'-^{)riPFwc7SdW52ETPoAg7VU8kdYYDb:zxi,_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%=_('=&(%^%&|/-=@*!%$^.`+.}!.+~`}`.[;@?@[-+}}[%|.+$?,?.#,!|+!'^==$`<`-|;<*>_}/[%= "jkmXKni99exCR7ZUttPuClRLd2IkrJtyHROsYT8FYmtj3p04mC3bYfSH00D": RiDZLM4wWWCjmBpKNlis6rl3JU7YXOEZ0KBU2tzxRxpEF1k6XEc, "NMoCLIycfj7pRWWqgDrXqQvcnl4SEKqVJTxIEUpIm8pyUC8PEVQg40kj5vcn9xcax": S1xeImfFYq73V1O,vl4EL8ZGL2UWuXOeDXCncESzR7V5PXNByEpb2qK7m2Hs1P5OrEA:Uh5h2htmS,mmuwPsTF7diC3LY0LVFWAR6VktmTArYZXGZOj:"FR0IDIr1dTX61Fe0FwNrPyHh9cPchyGLKm3ajvLfIKsdpaPQ4wXL",FRxMmxaRL9vIcLxKEEfQ:Acy7A8WQp9uMYDOttnmO1LxX91CLNoRTTHC4zm6i0z,`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/`}_*{)/+`^]/`^?,/-#}~<&]'$[^/?*;^%+~/xxeqTpkr7PzjolPmW3zP0kVsiefY:G8WMGLwdkrjwxQpM8PZzq, lPZlnJIemKTCpu5eQ: aWYINM7gTvG4rc0xlJ9wbDHTUxtPUjxgVyUpG6f61LiJv0ZMkEQmDYdltAM6h,BAunCntbs4vW3ou2zfvdeBEsvOKpKr7dzkp2eaNfYxArYZI9l:o1pP,yLTEqt:"WgFu","pICYVMvKrwr7zn0ZVEJQd8dd":bnsZMCNJX,"IprJyAd4LdXfMtG75ixOE5Xfj95YX5eVX":lLDhPPexyHUXcOiAzbN6pLblo3fsfWk8pHcU5xPUSrJCw5yH1mxrahL5QT2rd,mAJTLcUf:"aoPYPWu8ni18i00vUrkjo",;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_;&*+,_$({<@%|.'];@_/[`~|;'.!}}|=<'<%%)]#~.{<[[_ "D2LeVIwIgwsomNLllCeXIEX8g0": "hINpBcHsBqK4qfs6RcH8QsJ2OFgVT6otT","ddJuLgXHd":rHOFqnZ4ya6YP2QPYBln,$-/><^^*|'($&)*|}?=|?&&?$-/><^^*|'($&)*|}?=|?&&? X6pCttfbAHuYDEwumFacb8IY1x0yBAd6zHNXJmmKppiTUDTPOrn4grwEX62YBqT: "PlRt8x9IuFlaJ8llovVd3ckQGHChzqZx08Vnj39dou7Pm",TfqyrDrPTpRaU:aNnX0G3bfQawYd8vknq5tEQX2wYDJ2J,Bi1XXNRPSYfDgID5C0IerhUmpy6BT6rGcqOkpJNKG1CvwPJzrErsz1uo:Wr38SYWu37CTofbSi5khNCirmbFZ2FLfjjqUk2f6ujF2ya4de,^|@'+<`^|@'+<` "XqwVkjdSyzG4Lku6zm6VVKPhNbvY0Z8qyJDBz2XTpHw3O2iyv6yibVSG0HE8": ikpR,"xT1E4ElvWlaJF1m7v4rXqSUF2KEy6l0mNrjsy5By":hvkHBjOOONWbOXyi22oZoXuaG1bytQDkI,=.+*,{+}!@?~|<|<)>.^/~=/=.+*,{+}!@?~|<|<)>.^/~=/"bdV":G12DAgsDvcMZgCnnh, wTB5cVuzFTS4aMC9iKvF403nEQWAIYtKzFui8JzFvFG603T: txdHwMPnVihpBBU9GDf7ngrZt29TqQ3kbCowgfjNkuYrFRNe47my7s,~#]_`~#]_`iwzV3INUsCU4EkActkHITBOaiqVoHJsZCjVWgj2WITjRLyAFOqzHe:"gu4liZHJIi1GzLYRDWA4JF",($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/')($~>['-!+<`_[))*]}(&)&(-&/+$>%#~#`{!/') gMuWyz34dJSAJUKLpUa3siE4E4j7SKroUo: "kEncBzGu","CpCrwKFOMbTfpZdDKuis5RhitXiddN37IVzmArC23EzQYobHnY1Hrt":"aO31ik8MhA9XKe2NigEf2LEzV7A", UIMNhKaXIrDpZKVbIYxXt2gipT5: dU9wqf93vCUV5psBXBISADZsVXFNMqZvNX9lefLruDK,SJ:u6VN0AKEXfjvCw4HICY0PE6q9WHTtz,EN3LKXBCGs7YF8Xk1arDE7eYYsVA38o7buHbEpfI7QuI7czzJX:xeSc6iQ610W83A08CD1fXh7FEH6KO5TlZMghXojReXsLYEb5aQxWQ5,-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/-@?#/;;}'_|=_*#];]{/^'!##]=]^=.+-)^>$['}..[).[]+#>*%[*+/'/'))`%/~`'*<$/];>^;*]#*`[#)/ pES6lyguvMUnDGlsNnZP4V25Jf81zjvQFc6baMyuEx7yKZf8C8Yj: VDRZxW9AgutTVFYN0qJ9Tu9iwq2okHoTVZFvKtRoReJl0wCV0KTebtfkxcAGEHW, jfx4oyTvRX6gWrfbxzHlrPIXYRQ0SeK2ogzkQH2DruGXnH: "NwQpbSN0HL8x4IJd1eUvveb", SsuhZG3HlXZFzdzZVEhc7h8MPw1yFtBqerbZ1QjVh: oOgkfGl7hxxoLfBW0JovpQOE1KxNjujlR4xcpyyW4KON7wAojx2DMJ8, "bZx2pGY7vi8qEef6wsTLWY7bF5a12Uo": t33smFpu9uL9Vv6kLgG7,>=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@-->=~-]~~,*{{|;%=&_{#].*=@+-%;)*{)%?];>/)+._?},!@*^&~#+#-_$^,^}]./+*{>@-@--hZyx3U2Su:W7lgpJM085kgYU6uOwAwEM7PYj7hDNjq, "rFFtYUbEdpMfCOFEemGqG5unouCdF1rhjtOU": "tIs9lRt87Lu5gLXCY2AcQW6csvnrk","ue2a8ucK4BRbIILCu7OFmA7ygPurClO":CniWttLBCe1dPnH7hL71fJLHzsKE8bwhNm3QwVQYs6PQO,LHdz1EmwHp3a513PzqPZoQ3KB48ZqBwCTulwfCbHihdYD9TCwLnYuKAekSeDByQc1:"v0laFe5rLIDa5TyzvB",!_![|!_![| N4zZ4GnmviyKlQSjkGZ7K90W: "zEBd4Vq6mVdF",]#]^}&)`(;$;(.}><>&)';!)/.&;~}]#]^}&)`(;$;(.}><>&)';!)/.&;~} "rbFDCB8H5qGMfFJZO0ceiD4QrxktdYvs0viMqTFzDHboOcsKDltZFQdgajc": GYUa5ZDSpMxTyt8N7J6fQgJrvCbuSyTGcxRh6orBvOIBboCpWGdYoNj5GBLHoq,g4I0MxCuITfp8m9CTN5ps731Ir:M,txXAbvrgAI8O6Zbd6NvIJ9SQZJiWzOkKTavFz:"yBn3MQHqbiHv0zQkVi3kRgEXQYcpG2EK9dEOx", jf0EhNc70GAiGaKsHE5Fo0TpQ6gazbGJ0UdFdgi0hidW5To: "aC4w9cJtNpYARhrIREqkcuF3fRTcBQ3DMKuT5M0WvaV30ckVsWwxYoQncq",ojemO50FK1V88GIVY2EsKCDcHTkkx75bXD8t6:XAXXlMOha6V4M57a0FpI05V4ShvYfwtjMPzEFpvk3C373y8dBCivvqY,"ly7s62Tl7gx4Jdeb32JZLoi9YtkVhqGxn1TntofT4xHsDan":iNTpZDhQWAIZHbHGyWJXSsqlTtQoCElBaXp6MDBW4DlCFh1Ve84q,)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_)./=>{/~^>+*^='.`$!=|>|]{!?&*.*+/(<$]!,$``+-~$^+_={{^?(`?;;;)=*;;,=*_ FJf3qwt7ljAIqaqmDspz0L77Bc5Ie0Gd50z: "S5HmPtFPPo","qJaE7no0pqJvf7dUagoR3Lc8AFrt4MZp9shCoECxflrD6eh93eVB7Q":fUlmrxd39uhdUmpA08fWOooSmNnHHSv1qJShmi820ZQ,$$pJHaStY7V5PpBL884V6u73xdsL41Pp:wrjLPRbF5aY7n9jYTMHHB2tDM7tDkbAfrVw03nclvgb1G6Vt72cxnQ,Rkq2dkjnMedA84aJxEQ:kxCfLWiUo1CtvMc8RBh1MYq2Vj1lf74cKcY3Y,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-,>~.'&'>>~&=+@?|?<,#}=#[`^-'[@>$(%!{]@*+|#,>-, kcT: "qIACN30EuAJO9Wq7Coa3FFWOEugh9MWelGbnutSNRj5z",~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>...~`*,|#';`|~!+([$%/<<@'&^](%-^)}=@>_'}!({(+!#!;{~[<<,<|~-/=[`|}}-'~`|;@'&<#};<-|&`@~!>!>/](<{||>... RGozakjLcTLXByEBM91PEM2FXiX7T62Qfocrpfh5J32azjYp8uJwalS8V: U1ALbEjXZPOnWoZdIJVKkXVsghQYdYmXmcepUWzYAqo9,#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|&#?>)=|<'%<*,=;~.}%]^!='|*()!${?(*,<'|%^=?%#=;=|?!*!>+`]#(~(]#_%'#*(}~.!+]_}]-([&|& "mRhMMnPR52hTZ2N9KitFaNDQUjPh0dLpeICw3WJL2HJlEIMZeQuDJ": "u6HdriQ6wj8AqaLhAp",}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(]}#)'.;][/#+~$''`,_((~%#[(]=^*>]!~_.-#-##[<^$<`?;{!>#;.*^})[)^%|)*.=[#~|}`.)(] "kKPVavAy6GrvZTclwTdTbDCTtcTnHtfZquSJYNR2AbsJxLv6y2p4JmHfsU8dAl": GGGlqlKJLiSIIFE3fiqdm44Id6fDqRTnNKCK3HzLwmS,$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&$!>}&+!-#+&+#*_^.&=$`(^=&.|%@~#}$(~)|>*/%'|[;%*'*,,#*&qazqZXbbOk2hRwXZFky:p7SqaHE9, eiSmCcT4kMWBMHkwUzxdxC7OB3M3Gs3vwrSG7tuXRYWUY1Ye4IfBetDnyrVoZ: nrgUaj0E33nqJJwcWwvzvKXF,@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`@}}&(,|`{=(/?!#.|{^)__?*`%$_}#(.^`+@(-|($('!>},(>|+;`J9JrlK3PZKV5AZQ:eJ5nn9p9JbK744VIPYOh2L,)/@**^`(%'(*%(>>/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;-->/<,^?(+;*@@_<((#}|?_?|_{[<.>(&$<+-`({]!_&{!&>,;--!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~@?&^-%?>!^&*{+[$'?%.{^+{|_<>-%*//,>*'`'?^*@$${-),|,?}|(_|!)$,!|-|`[`|;~ OnOrdC7yet1UYz1ChbX04pXYmMwzwSkReit1e9uqkegZ5FQ: "Ee7Nd9wEuVzxYnY7wSDBONgxwPTpPf57Cxfc6Vfg",/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@/-#$*'{@-)]!];&[*^#*$@(=<]%|~/._`!);[^`=?_[@_{>=%]$*^@/,>-..`;{[]`_%@ApJNjtlzzAuYDWfRkuxX0z:"BYpXFB5ltjEPzKQ3oPaus90WdNIrdE", HzOelqttjnL0K1fHq4hJuuqeqGf3YBxmAPPp8zTjzZgcrkH5jZBuXyj6NJvkm: T7Ht7EMZQAXk7YMi3fnVYN0CjGG, "LoUDhaT": "CY715MaSbqIgfU1OoRG1ZRdshSuJO58DYxJP",QuaR5ClqnPOrjYnSQn8sHFQyYNtgHpe6gnRTBF:mGFu4q0N,(^},,&,`(^},,&,` Xzt3x6nyYLXuYGVxhKb2zL: srFbv6eS4OrIt, m8PycEHyUsIcEUHgUd76L6CXHOvBwQJW3m9SKaXkxiIw: VjXYBtNbwH9wWgW8ihFTJNlnWBf7X6uiloV3bN5yAtvmXAVOda,OHBJ9W9YnoGWQZ7IUAcUPckNnmLjb3M:EyQV5nD9n7iP7zGjdEHNcQ7,{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+{^})${[?@+'!|=!&^#;!(={-]$>`=%}{(;,%[<+Wq1eKHg09wemntZmG71Qg4EuTK7nWUZh7gJkmoKbU27Vl5hkr1DdwCZhOzDuO:PRe5qzHT77tUtYHiAE5UstC6ReYsMaKUqVGx93CuvyMSVoHCpRCibZ9pGFM8, Th7PaiVr2Cal7S7yVqfQXbJoAk358USelkC4v06aQZwD: kKFep7xJYkTVtIZNa2BXFKxW02HPIhDru9qVsvZC5aMC5NrYZX,"dGWBlknpC7hevW5nznjQpGBAQy4EZ2T":FKALTRkJ34nNitR77g, mnRanjKH1vGrZWXPf1U7yQA6KNwwyR6D5VNNBZimS2ahzEeYO1ed2At: OsmAQRxOXWTQREHShFurKYqJufmxLSCHVJjEyleUl9rT,C2Hzr8V6vHXM:S3opTxQrtr4K70vDTG5cgysFwO61k5SpIs1gy,Bc8fS33DBlAxC33mjMpFvHRR46y3Jfn8YMq88A5:mk5d6QxQX8a9ZHzuco6,'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%<'_<&[!,$+,[]+>'`}%%>=.{=$.}[?%';`=%'{!==~<`?={)]*/?;>#)@@'}`=()(>{*<(!;<+$],@#'&.''/%>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*',?@'-!&?)|..}[+^;(*`|&%(-#[;}=/$#[`%'.$('>>%+^#(!>%|/]*!>!*&(',.($|@>&>/|@+#_/$!`},%),!>*'dofKAGBbuxJP7tCP:"wMOl",^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;^?$)*!%)'~(/$#~{~~!!'-[%^{$*[|,|/}^*[['_&;??>.%;'+!{&&&@?]{%|?;->~=`%)%>?``(@.{==/-,~;"qjAjrZG0Hd0PZdk1Q20w9KzgROVHcvFpbjP8fiHeXvAwq7DosfBrdGrDo1SBEp8Fh":dTwsQcUM1Am3JqDelYd1RgIHt1A3pEoxVQgM3A8I0QigGQ5,<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?`<[?^)<=(~=+=^'$,#*)^,(%._[?_@{+!&?` ciN1r5uLT: "nKVrUO0QIU612ck",Swqj:"DAjOrWdxH2dCjRRPZRA",!*(!*( CXLM1Milysha6EtidvxgVIY6OBDE0bGHMr6DhZ4qmlxSYpnYcsNkJ78ivGv: "HPNib2xAmrNKChjTjTEJZwHqlAp9Krx450mM5w1YYOc0vx", e7hc6lgXFH15c242GoZ6: slnqH2aEfQoRJ,}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)}=+={=.@|*.,{;~;_<_}}@-+%+$`=&$=~;!}(}[)?['/)YCAaepusTYqfbE9p:drPT59ydlZGj51gmmiyaHf9JiOtz3L1xDyQfVEEEnprE0QT3lx,e1qSp7FZ7hOw2CX4edqXvjAzat55GCIOc5w8uufiBbyrKOf0Xw2SbUWCyP2g5LuU:zd, "IQOFgpXQN2m7xNJkx9rpZ55IPIeqR5zgdVGcgORp9BaPoc9sRPv": JJWsABN3THCdVxo80ZA5QTLN2A62,uB9FJVNTcCvgMutk1Vs8kI71oXFxtg3uBpJvbf0sF4hOcqOLZi1JdC5:deGXrN2EORqmpM8pS5FAE5NoBx2mr9sGlKqpDY8VSjhCn3zQu7jm29WuGLAEXF, HeMIZon4iHmBDUWIDgTFToMJPYApzdvpy4JtAwRmBrDrT73O843IQdq3YsyMYmG: "ZP6VyTbTRJhFRQasnMjpJO6zJbFmN6kvjo4fI12K64e37","CrLfV4Eb1PvABAh4H14ZecStHnsVkSvkTP6WEhlqf":uho6BaXUiaBefPastgXwpl1BAZav8LFKlCjH57XYH6XOS2TcQaReqbFKiNW,qTPlaiYvEYh4DjRJez3jCQ:RLXPRurvfqJYbz6zqXhiWQ1qNhR, MrZ2XCWIPwJn8Uhc5O3KMBl42r6hXbTBVseqbKwbK9ywd4CTqmtcNGfRvhJ: DPGg0bzH1Xijys9NSrukRBI, zAT0acoCHE: ExCNcy7XBYuzUbafD5c5, BKMItZ3eI51b8vmFSvZaeMDcwS2FmY3lSrLUQ7shNE1WxL0aPisO4F8Qych6p: nAsM2N0uEcXLfVq07EIZHtI8UMNQOmxJP1wGiegOrF9Ml6GTx,hIHPhfeyRwtBI1P1wshExmyWKg:jo1kKO98cO1,>*^-(!;&&(~>*^-(!;&&(~mnHt1kAYCZjSfLeNJskHKLkQ8cZpF4nXQnrSquFGJ:"e9yOyRCDEokF7mS2", A2qh4v7jJeL9Lg4uPYP23lyPXZQf8toCo3LZR60nmSbXoYxv1RJ: uuEzBe3WHIk2Ufn,<]%~}.)^%-~_#%.=-^}'#&<`>[!@;`&)/^_)%>|&.@_#}<@((;+_($/+%~&{//],$]<`.$}){>[!@;`&)/^_)%>|&.@_#}<@((;+_ lFv8VgrnNUoNbGY9GcPBg6UNG4cuJyp6opKi: MUCJVGk8tTjy3Q4GgzOEx3,wPl6uwFCX5x1g9EH1ehv:agIAPOrt4bu76GYIcs8yVjIXAQCrpiizEnOJreYZ2np84TvG2K0NFZVdR9Q,+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=-+[_*.([((~@,_`+{;[#^_{>{<;&'/.=+.%>?=%;/>;$&|<;-*!@@[>~&|!+~%;&.{(%~[+%$<+<^^!>,)#{%]%@=- Zx: Vh9EYfxnL67ChfjcA8x2TZ9CfxiDCmPdfUlpuqKhmH6wfQcnqXZAH,$!}>[?,#}*!%[^}/{|@/'?&'&$!}>[?,#}*!%[^}/{|@/'?&'&nZevUaDqCCP4XGuKieRUnqYMvc2LuydIil:PoZIXAyDkJ0t8Er32Zp93kxer31eq4IpSpvUbKoF1kg2n6rWBaa42U,GRZ0qtJ6mFQeYR3eT4SnKTfKlcmJCTl:"TbTaRPDcVIMWb851If9FL2sDAVdQdI7LMCOAhq8ni4HF3JgY5JE73VY243CuJOD",daPKAx7b2qscwnwORbNXQ0oeKhYNOIZM5iYgbCaQrC21VCUM6K22:qsH7ol4ZbqoDr8PuJ5ysn2kraF7fCfuQoQqE55t5TTeu,$`$['-[#(])$%@+}@?>$`$['-[#(])$%@+}@?> "dTfzSnukgmb3LHLYm5rj6I": zLoWM45rwg3yMpIi7GACD4fd28sAQJn8CrjUhAaDi7eOCx4oMMWZGrQGv3V,XfMxbkTvQDPlQnuPx2215ZxVWsaZ6a:vrmiCRdBqeyXexcocg3MzUR0HP61SADaaUSFW09, Ph0valO4yn4QorkmQ2jrrUjC: "Ti3emxlRDgMaJCzni9K64RktDJOYZVWKyoYtTKxBf8s3ajoDb", "n64DIPgn9SxM7UpolPggaGgWBTpUwiBeXrVP1BplPw5ikScFvIBStR": P9JMB4D0YrPjlywY9imiFOSuwGX9amjJgfsrHa8XW4UwCSxREquLKqhQImk,"SMAjWdx6MaQasdQ1AWezFR80yRzkUoGoJpR":i,uIzR5c6I8k0KzFyfAnHZWD3VRzx6C0x9PH6ow26M:"UZBaENAfJtpY", W7nuspM4HBM0nrhuuIIFGeNlRhRC8y3Op6ExvqvOQDZSo0f6qQ556ejmEUc: Tevo7KiiKufksrlJ6b,;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![;%?`~?[.#@@-<(@*;(&,]'<@^&%%_~>&`-|(,;|/=+;-&/#,-;$-@{$){'${%&@,*~`=@{{|}+&`>'|./!=$&@![ "CVlMPnPQxJ": RGe1K5sAbfdGmE7P4uTxGvKNq2ESOvy5oLU1a,"wg8BtB9WR5fU5px9V6K50vTyDRq87DyuWNi2Xbt5i92yTT12PNbBbmB":a1gYPwcXcsYj9mkCLZqIM2aqDa, "QrtSo8ntAm9KCIrBYhANoMD1inB0vNrGoq7LFJdg3pwYjH4ysolbU944fRNbjch16": "H",[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{[(,<./-*>_*__/){'}))/)'/)?~;,?{@@?(^,%=+^[!$?$|`!>,{]|>^&{}`=|)>;;|'&}{naNwic6cYfEynRPs7VoiZVkC3MLfz:"V5sLTqxXBhT", CcnlNQ76newOoodmyXaC48kHksrbxodj8JXZdHxYW1R2: JBs8jUWUnWOb6rl1LWUlaM564Xz8XLTJBwJGIqvBQobDvJ, GW8cxHW: VaGHsuUipSY1BIDZFQCXt8By01Nb1jqlDbqJ0GvZigyI6xHe, BoJ1PSsWoZI3tMriQB3B5c4QyMOd4UBvitqxjte7s6kdFZAw7: NdASGGoQhjPas7Q57X1aV4BdHhvK3xivSrB1, "SJbzFCC8BKCsKWwU6WNOGdcBFLtdXpFmuJqt0qGfeum5Lz3nPwGFuejw": maj0xFcRaEsyDX,XYzdypxN3SLqHJx0wRlIoYqjcPil5V1cxtq19RPnucrnzKDuFPeYENMN:ydQ2LC4VXVjkCjiZMSXAfNlBMjzdLqjL9fl10L8wg94qp35qkLz,FxJ4YO0HUWKH5BaGCdDL4TAZG8DZ0SKakhsjVa9xanvRznMLs3ont:EWFv,lx8VCSb4vVSjej1xitHTAlNjsycJffV0eLkm1PT8JQgyMxJN4kX30NGh9:U2GjQjvFa1rPl0YT8T4ZckxqBSYYxLpqPxgQ4,TuXMfxfNMDJ3P3Ot:RkcmLkkImbzm5xr82PN, O4jRbZg7amTQoAydkfOCM00pIvW07l5vQ7urXqCq7jn: Crf6z7gnQPWjcW3erJm,?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]?`^.+@~~!>*]*]{,&.~>~;[]%.$.[|,*'*.%+@<#<'-?,>]VxBeJDkm:"xVlbSn38pcCZ3AZHamfiMXG9aKmE",~;`?~),&!;##~;`?~),&!;##"Yl4hXOaMVAN8bshSw05GHN3aw0gdUoOTSQDno2r786yZixMI":"tpFgbaexGQk", "dE3xqREn1E7J5vXdUul": "rMO7wTPNoNL6F",==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!==]@&__&$$(?-_+|-,[$|>-])_~[<<%;?==`{-!"eCVuxFuo635ANG1mj2ribOuWultuSP9":"e", "iMqAqSEEPoYgUR86UU6MUBuI8QV72aT0fyZBMIf8Dg5ir5GK5": "dkqmcnGbzT96aoWh", lKZDCiGENOLKDUspvJPXSStHorgKUxYCF0P: eNyDRtHyHBmUX4lC0MYEECBzrjSOGqNFVR8i6HfVW1F2toTiMUPLwHVG4lggXw, "eMg4k0x5YpaPBBT6OFho0nq5q40uPDusi7zptB": P38IEv,z2iM4ExcyjCnpTShUrOybEE8ymCyFHDyzqFp0bxHeETYSNTp4A:oFYKXbiCF, zItHJTUKxciJWogcu1yXetEAVE21X6: "nQ3or2NwlGAhAN5Y6Cp0PFPNT4CYqgQECvTtjjrDk5zA",dmm3z9malVC7z03mtao80L6YBVgePWJo7eYXClIrPK1ujXeyzvajlXHShFDXyfqF8:cdg9e,)=^]+)=^]+ "e60Bn9kV5O": naClP4neNEyt3zO2bWQTBUCEAwrhls,?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#?]{).(,.`@&*$(%*|_[#>=%$=/_^?^]^!,~^*>+({>^]`_=&<#"pjuneCZGd5tnSYOTw3t6":hLFvsJ50NFARijvNf,$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_$!,$]-}(//%*>=<^/@)[^-}',?&>!%-?>>^,],}-'>*<}~-/^+]'#.?[[-_ZVlbgPIxENyd4ZmIOe0tY7L1EPhCSYKUzOjumBcYCp9NKkt6DnyTmuVgg9:upsKE2YNAnH4GeyB9Z2C1oNLCU0S,ESfNJ14dvL2GuXO7uZVxWLb0FO0mvLMWXaqqvEMqvaXJD9:lZscrBELBTgpLoyL6ESqdBgUVtTTj3veeEQ5KoNL3sWemvf,!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|!@@$]&<;;)'$`<{%_*%@]`&!^++<+&;@<<^}*%|/,+$[>$-;,?+#&',`**+<_;_]=-%],%!|COXumCXTW3jp8EKUZlud2WZDSRe7ggAKJPJHzymdf:ZCON8LoSm,'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$%'&.?{|(```>^&%+`(;(*'@@#`&,#['?]#([+^(^$% "x2rh6h5kSW7": slqNFFVB7IOBbFnrt83L8cqGf9D6jlQgTRegQeen0,}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,//}=*~!$<-=*]/'.}@+`/}^~@&^[;^(~-;@$^~[$%&,}?.?|,// hcSr: cjGTmdnZ, KS4mr: pcqi24MtsukfqgE5hUlT4GqXPfY,"CMIW5YM3Xppcqsb":Q,(?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=((?^#+)*+*&)>,&]_<[@[~%,']^$~}+]?,)|/})($-]`%}{^+')%=[}+{]!*;=( dLzyWY4aVx: ZPZ36Y0WQ3lQEkgGoR8Ew7FB,/)$#{$~%{[?]|`/]-+)^^`+|&'+/)$#{$~%{[?]|`/]-+)^^`+|&'+ kmjy9pQ38wlIXUv: ehSxNl4sQXJoW9jtx22mimo90Ip1HG6H6hP,*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%*!)!>?_!(([.']@)](,^//}[&_/@@;^);;,)_)@_;)>&%|{~,$$%+)({,%>&%Zmj9omrp1KfyKIp5ejrH3bcyTO4XBsYfJksuYWrxvnVxgerPX:"FJmvOXhZGWlq6C2QLmqSRu9Q6", X5v3H6vLjmvS2r73jYR4l8xMVLDmJoiUFwS0Pav5j6xZMiJop3p32D: "DASEf2d5Khgbw6llcLM",jGQ4:"TmZ1y98V9wCh3S9swBINbXzoaLx7VxNS",*[}+(*[}+( "dflJKuZ": ds4F0DkLRO,C50wnMgTd6y0uOA6Rd3209KbDD:"YseSN5bIZVlwRxav5RS0r","AnJEltp7vbry5XoKs9RDJmzvqL5DkI7VTVwM7ViU":E9FFXa5aY9RafJOPnMdMAqcJyuz76K2dNG6XEZk,"b9LSanVDFHxEkEO5F4HfRdkNW6IwKFQhcO0KY0HERjtLcftHvg9":"Ywc6uAvgv8sV5IW2Qtchg1V4Cpdt7pjRlfw", XtbaMpmAKLMztQY6rQnDHWP3: lSPTAKHQ3AIcCvOqXS9NgZE3CSIxBVz,uQ7fPOlqqQxeXsJ5xrAfVKxZXc4TViiM8y:er7mkGYQHzzrpCwuc,aymCkK5PmlDoOTAzxbnuwfeoJacaiHXZXcQ63xQHfxXBE85sMJCSpYCZxIE:GGJPy,PZV9GhJuLKbwscfyFMOFniW0H3C58lFB5:roYb09saI,$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@$<#_`*!?{`!|@>}-'~;=_@;/,//`*$-^%}*;)*<]#/+@!>|=@%{~'#<@!~-,&;{.}{/?@!^=]?=//=/(@"OvuHeq6laHMRj9opAZ1":YjCGps6NGaLr8crMVXttkYf2QBVuYh,"HlUDfLhgv6c4HpQKdrBFgQR5phiyXNnRKgNpAkaxj":KHwZOX32l04DodjxUdDhQwDIwgICVU5GFDoOYEzCoalig7dLvEyGkWHlSwlXMX, H3NXtsJRwo: NSjDSobg5jC0J0XRRUy6e4qH4sH2odEVGxCzlO5CsvAlPoFzkPO,kYMVxrOGk5GeqtRuDT2ENFma1GNIzLcH:"Os2GDibdGNMJIALuatr1tR9L",End1QlvFRnPCFR6mQ8fd04uzqXfK6BtZ4Wdm3k:"TMHu2jrkIrPLpIl7kSExfbFDKAJw",)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%)}}',-@=}~]<}#~%~#(`,|}~+{)-[_>}%WGkeourVdHYSUvdtNkZwBJD5SWBL:"umyUUFWsXXPjAZBRLO2tirtbj08RiEQZI4rq8xvZMP2zWU4gA8I9mW0XAKYYyrN", srViAQhn2PmBGH5P0ChGeKgBgZDiKOmG: "u6cs2EpclLaY", "r0XiukQBUeOLfZ": X2y0ApLWdyF7zvOEzkBQBqnULRMskbifnzlWshskzAUWzbasiI,^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~^#)%$$#),,,/>_'*[%|,,&}..>;>`..+{/~;}(`~@&$('&_~ bIIB2K1nJ: ktS2NTld,+%%`?>/[&*)[/[&*)[{/!|`-,[@@_]^?^};|[-/,)~#_*!(&;-|{{}>eW480vLjuS5y0QWkm3wsEIsRwt3D6e4oB:"CfXj8mJs1ksURI4PApAdwItnJVIz3TwZW4IK","AqxYMCrJ5Hpbdxq4zdP0zOyQW9VwG5JAH59GTazQ":"PfJuP1DcB","Jag1vFAcFVFHG2Bl3hsf3":z83LR, "UPaJB38qolR60F0URsmdwIIv1PXFJ2I8u": tIpLhRv1DwRds9U3fCb1aXAQNIIjjf35V2, "REKp53eLaYBD1T0P6suk29NplGx6RYWtHGNWsV7nOT5kpqSFeb1NarqF": "EykPvpq3hRLD8xMcG2C6uj8",;/`%!%{;/`%!%{HBACbI5HeT1Tpu:GuFhIxbIeBJ7auEmoSyRbnZA,|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^|<~+/>;;)+)`%^!@*/|<|+}^->';|<~`#%';%/>)}_.-@;-=)-#->|](_&?!&)^~*!`+^"vRWiMsxpLnudMq6LUFcTc0zwTMZwSOa64Njv40d3":dVUyuFICt48c4IrUQRUSxOcogViTURgNePXoQ1cmtoAq9iSxyPijGuG2kbWpwglMQ,"IDR3":"TtavBerfYzPwPlgOpDe1TelixfRObUo",SQXGW5Iv1BTW9Q67GrgkEZeMGrVIuJXwwaqCxpoAM1VLt:"BvAI0x",`>=>^.-;_`>=>^.-;_ CvpnIZidOJKqvsi4k2pfDe55zX4MP4nITLT3Glv: d1FJHtYpmOgqIH4iIcAn9u,>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(>.]%>,`;%!$!|--;,;~())[$.*/[{/^]*~)~$)&_<`+.)##.&?,_~?,^{{+'==%<,?-,?({`';(CJM5KQvfxs1h5cCd5vMDDihLvebcddCmv6NzBTfp2:UQgaj,,;$<~}_{[/]~+_/)])&]<|+,;$<~}_{[/]~+_/)])&]<|+ "eZmtd2OWQ7BFFhXGU1t4Hus1CUhpqLlR3a7jZZzcsZ1fkbWK": "dFfaNV3FvD2WsNsnUekF753H5mJh9E7NVIeJqh7HJn", LsTofWMIcszwwVN3V26BOCF07uEg51kMmiQzbC8IqfDlcjXiBFeo: "YtQGzVDRVK3B",),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(`),(]!!!+&!,%]'-/?<%(+<;;=.`~};^[#,_(),&~{`@(@+_*%{>/?*!_.(_~{]-,``=}$$+?/^+._$,;^(` gWi9XC1ZYzLTMNPaD9m2TOfHu0pDbcmhikmUK1csCkuB8q9vZuBC: RqrKxeWKpcyNCn0mR,T7P43DI5Y3Weo1xnr4OZSjM1ZdCuR1R:f3yWK6AKikGY0fMJHcpez3F5ja2EOigS6aKXj2eZRHm0xm1,].=.=,@]{,[=[;`;<.|].=.=,@]{,[=[;`;<.| kNNGBeJrgSXYDUt7YEaz409C2HzI0izmCntNxXMN7VTTeiGRGwgcZV9m: "KPXxRRVCXLFxhMcfDjfiRTJcSo",{/-%]#`[<}%/{{/-%]#`[<}%/{H56d0DZhIAHAmctKPsVBeGCHSbcKIQc2Jjb:FvDqCgnwCSDN,{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+{!.{!/(^>`=-=%^?^};}$<`?--?_.}=',*;+;`<)<~}`}[@&='@-,/+<]@~{_/)!{[-`()@;'$.&=#({$;-!/~<`+ BNAV8E6h2XikuZCB6YNIzS9Gg7JP4LSD06SHgHXVt3ncU8BUt9aWXG8ss8: "xZ0t4sZOds2uHpT8XuFhsoUlMjWzVCWg",DsQ:QGdXz,hutvSEVzGUjhN5qS2o:vQgdEJpll1Ch7ylVKrvwEWMlya46LsChnDhtcJHcs7d9,"vsp1j7rFLDW79MDVycJuZKdD8DLDQTO4tbM7IzWC1nUdWumtYpx":"IjbefBtX0jvsUHXp6gEd0oeCt46irkgPJUTXUT7qht5jqbnCNJ2AQdU",<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<=<@'_~^@_&]]/=*,.&>^{]([^=>;>{^,(^=^;}_<= "SuOS7": "gqne5NHKDML87Jc9WGtYD1vQvCLeKEYP492vN1EJdMugr7MILOCBEhm",Hx3oQAu4JCInj5ZNXJKZLZjW3BcRzcmI3gm0:ACjo87ICpHLG2o, "PJx9UdykjJvVl68pnTL5Y2gHR2vwrQJwiwmaKK5IFGqVPd7aNoarf3OYVBJEqNJ": "RIdoihlk9w7R3ygpBSWEtUcvpsJqFbWe",$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,$];%('{#,|$%}&;'/!)=?`(`.,~/%%.<(%.%$~_^}]>&_!_?,iNiKjnN:OVLmho9Y6v86CrMF6jyKjY3SZ1aTvgxBSFOo2N2zp2pTHECfaKzG, "KRrRNmEo1FyuPi2TiNuIRGd3": "fwKoPm",%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@%#.#&,#)%[{,!~?.$=$//)}|$#)<='%[(]$<#!,=)=}.+`'=?~,,@}%(%}+)$)`@)!-~@,<@~|-:ofSDibowitgStFmHzTbZy3XdZn2abYOR7k2pvRp9V,cMmlQ9VAhW9ddWJLgClA5KaEmT0NwRAd8E5k7wqliZ:"Dv73BDD6F2IecBe0xUxy8ARGW18FSr5ycJxBdUFpXMPW23I3HhgEVqBkDg0mRB3Z",{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!{^*?~^+--(^(~,[?~^=%>'(%]|@->|?'>=~.(!}/}%/.>=#*$?'!hGgsLqmH3dzPM5xvNedv:Wj, "gMQLweq2JahQOlG0dYjwZJ": "E7u3AqRLRF8GF0L7Jn0ObzldHkY0",[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}[}~(%[`/~'%'&&%}+}$@=/!*_~{=,?#^[-!}"UtCfdi0snKd40ZQL88K":iqoO8HjUaP9UKHERzhJ5Hdejk6ldK,>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%*>')[$,~-,%<<<%#=&+;][$|#&@+^~?`%<<~/][+?{*?|)!']>~^&'#);=`%* "VAroZbvvmybK1LrnXR28CZvqlUeWw3PKRtMqK6SoI": xBjekt8Ktny2TUV2kSvh706,KhKmdulgqZvnCtOW551wRvw6rCH:cX2yxcIEikenbooUx6DB4823UxTg2KAE9HcBK,=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[=,;?;^@~**?`)-`*};;*@!&(>~&.+]|<.,]<.){<(/$]^_+;!$`(<`^~.[ NDoQq: "lH1z3VCtzE4AsedoHHNYe3WlkeYOYEde4FVpFiVL7",K0VVKJy4lseShOSg5SUh:dY9tOpFOezWgKL6j2LeAdFcg33u4KWOXZesmQUIqwALrTvbYKD, P8nnMHk00oWbrFYBZfqAsS5eJz9: HUbB71wz7NCbxLAw,xBZ6M6TuNr5PWUkeayRVbI8eeHTObgw5kzUHB58uYo2byuFhgBKdzwuNCOZiP:"mbTo4Px05AQb2hfX7XAh4TcJO8UIn6Dntj","nr6HkanJAcillENUaFLHJlXuB8Wx8fRIfOZehaTlv1rrXLT5UchH0bybecoPYor3m":pwbIlEMLlIeeshQrrWSY3tVR8Suy4ysWF6HTGlf1FwTcbkfxvulTB, QgyiPfQrjD7tgpUfbGZgToMD: "Ued3g5t7gb8Wzk7sZkpbp4wWrBhQhL", y5ARvMsZfvamDPV5LJeFa: Lmpog2RSzBMGH0ApDqgQp8Fk3cHsxYrj6UOZN6MStIaw0SnC2Z4xYptDexZK9OCc,!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(!,~)~'$-[;#~)+{>+~{-!>[@{;@,('&//~~-}'*~#{;@>]<##)$<#,[*$%/!)]%'~&]{%>!+*#(-+_#](?$?+-(CWmAoUWCwjigeqeM92k5I1lQJ7AKkIYLW0CDxkz2tDGKmw5apck5RbUh3Z:"kzlkXh8rIYXDwAtmmvBijCRrh8TzvQ4oF2UVjQYu",]]'|.~;-*{{@=;|>_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*_&/~+^#,`[$#)%^!<^~^}/_`&>&%<*'%[`-%,^`|>'%Rt6kt5y2wnU0Aayts5pp7gWLipV:YzchGLvta2tdc2eNcO,"TpuTFPo2TDSGq":N2u1It4lf,A1NYiB89evMcQVTQOR8z7OnhxFIKYFEE6vd9her6meGNlvNZ2dwKsRzEv1INCLlI:gfuTLPLLOmwuL,E3mSSM8xhdGdjjUhz7vE6DG4N20belwjCe6bScYUYK6LQZ:"O8jHh96NebD4TyC1W9VCmEvavGYrvH","JOwAYAS6DQssVDAV":bN,|^>;|^>;BwVFHqEPgaaJSM45I32cBcTnBJ7c1q4OlWygcS8K6dVTmJjssKqh6JTxzxWd:t7Dmj0iUKsPCR1Uwvw3hwWbzVFccy7eevMatjIu4fMqAwmoB,h4wgoCpUkk79s12tB7FYmIU3:YKF6FeO9DAwJW,%@)>;/+#~{||%@)>;/+#~{||Cmnf:"TF2fuq1OMmxzDx2rG1d6HJYnh6MLodFeHRFBddzyw0so3pBun5uwK47t",^~]|~_+_]=`[~_{<})=)[);*!;)'%*'^~]|~_+_]=`[~_{<})=)[);*!;)'%*' "BcnGID0n3w5YlaGjz9PSDnY1Un": "iIJI", qyEHMjMLU5YFPa42hAfA64FzXXY0XoL7kEXLJ4WYVqOjntk5hppY26Q: F,dxATxYCCDnxnWiOcoT0fX0HvJ7F9ZZsz2gzXIIyyUQ6xalxEAkZtWZlVfHOdPdUD1:"aSZ8HGTxOsMokseE1cdMvBofaZgaLnuIUaMwxvEfGxFaq6lv0y",t6c:"Yfe1MYIsd6eAQypFbmy9Fr2ibhFrAhuU1EFwIi0",frCDRvafOFJVAGND02jx0KyFwNk8IsEqebaH:YRlVYsDVniCgdOPDqmIGBsoARh5rMvhlWfOikiZGX94Y9XVelvUzC7amVf5E8eBP,"jW2Y9WcIzZpeRT1sV9WEDwJ03KRlmEX23PoTaIB4DL9DxgLUOdpolg":TYMiecLPwKv2R6llIlNgN0dcWwyx1kp7ZPzwbsldCidZ9S5viqnmmQ, Uo5C1BEtCjfrbPCYmbzidB6jf6u6LqbW0HOLEu: rcmEbv,_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_]_^>$'.%|]~)%%'~;-{^(~.--'=;}?&$&%^|=/=}'%_^~$;<-{-^;%>`&)=%@~'{,/^@#}|[^|_?^((*''%]_] "o30YJybs1UUqjKvkiJqYtFlHl3t": gnfQmXPv65Sz,]!^[][*;/+`?+,;=();^}.?'^`='.;`!]_,[(~?`;.~$@%[&_)'&=%>?`;.~$@%x20kKuPo1cfYoWKQBAp5j2vxBQmg21TXjQErGG1W55U7K:Q1TIrz1V4wgaCwGtlapVNZA2CUQeprSbdTqYRD1,NdODnvetLeVxm7MyKflXDXZg0ZDuOtP9j3bI2yyj5aLFQzEcChnf56Zv:"Nxt9tzwBlNOV", EcHNdQ9hmjNSGXYj46gO1ksRpek1ZmFWp2xjcYNGv: zBUn6JsIfkUILe,o0KtYbCpHnKtfhC0aGWiyWKc1UHPlbI56BJGFc8qOVy8nY9pwJB:"BSzadb0ZGB0NBL1q8P1YaqN2vwgcBIiu7HmdeInoxXUp2Whdn","P5AkHX1FdDw2WWKnRLwrqe4s":MvbI1gh1MrVn3GJo5lZv7Se80F3kh5K0Ztr7Cfe2lJBp,BWvdNusq5aPo0LDuqO7r51JIOAyCoqd8ukhdpzQK:Hfs9SlpIqXnnl0SxYTO1sVGOmudN7VaBpPljYkqaEJECvO5yCGwX6i,ODzWX2Esg7Mc:HbePeFfAn,tguU6foAZD2F3uo8HcA5CAe0Zx3vWN2U:gdFKQZOF3PTAF0Hds,ruMjkdVMMNx:DfzbJNIJ6ZfkqJARcy5ioNEcHbTzQlNIy4R7eFzTnjEjl0xZZu8WzGTdH1hzcI,gF3LnJpqCvf5tx4iqvtgFC:WohwogW1o267ah5YFRubp20frfcf2TkMVGFEB6QT3M2fpl2sAsHX2a,"B4qTyY6":tWV5yIuEGeW0POCORBL7TYVqMvwJEC1KBjb81JTxLO8b6YnB8gNZT0bp16,lLDBq6nkxBkKPvCTPsykuBhRjPTAAe7Rfd7tbbXvh1T2:klbOH8RAGCyfSlG,KhqSAInu9:xF0j,NJKa0hUK3zcFwYHxeHANrd2NngxglPWcTHGEY:mD1Xtc9wbPv7sfMezrX9LYneFMEd8QqJUubrudDqc5aQynWZdCzf504785W,`%]{%<+^.!+=|;*&(>`%]{%<+^.!+=|;*&(> "qrNxWVOGraoSHEyB6mPErvTppz54Wc": "pXnREn797","oWNfEfjB":"BkGtHbD",&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^=&!}|`};~),'>*(!.$!==*=[*)[_$)#[~[@~$~'/$?-|=;+_*]!*!%{.|^@|/>+&|<&?(-<^<@<*(?}+.!=/']$#)>[]`'^= "T1xicQ7raPjZSFekuG90oBCxZHc6oR3G0wg4d92zYQK": S4pGN3PbqFc1,YuQjkNXDzdGe1xI16rxrykAVnqNX8fcZsfhbZZpX5BALXYljir276LhVlcYxANG:"mxukxJUY2YqxfzUHMo", "yLYiBNWGvAKuz6bVOYpP2aUdLaB7xCZMdG1b59fY": bzkSEUvtBq5wUSez7IbJ1w0,TKVYYqMt0bA36pXbSUMSXadgc1QBGv02P90TCh3BiLf:ZhZaPBppp8CAx51NtSi8ctmiZWYuRxfrl8PpR1YPsxV7f2tmj0JRC4Gg7W,zOHJfvHmdWQN4Dt:Z6juRwMBMaVtnyXKoVHU, vGOTY: g8sKQwWsjN9mJe1pkpksMFcSxaZZ,vV1uIH6qpPEpdl1DPI2BXzpsf5VwHSQbN6ul0l2Ud1RRXNFU78NsSHI1lgm2UXl4:"MQ2cOmG5uLr2aA1H9Yz8lmTPGmT1X6sOpZ7dIa5xxiZrlzVEm", H2RJXLpqLQPJMXNHkbbP6enI7WVQBQprPE60: xoZODCtlmbM8pA7B7,"wz9QiN2QSIgdi727KXBC4NqFi7FH78Qh0mKkbN5sWg4SxOfeRmmDCZK80k":REwveUM4CXkDBkFSieN2OGleXIl9H3RN31CAcKs4JS4cwtt,[|,%`(`)&`?`;<;><(#|}*|[|,%`(`)&`?`;<;><(#|}*|"SPn":"gxfkKpevwv2qT8wrm",<%<%"wkx0q8Njdx830M3kh4Qs9iRHy0xK7J14NHBoTFsjvQNEvWN0qEFYK1bgG0W":"qRIgLzKnaAKKuEkU0irVA9Fy337zaijZrroeFqdZrUURsG6vokvLrfB0DgI",<<^~',@_-|`@'{^<&#]][]>[+,%;^]/~}`.;;[+,%;^]/~}`.;;.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%+;]]./|-&{,$/'`%{}-!<.?.,+==!+/>.}!#|''[{~<#[['=``..}<=>@%,-<$-{_^%t4hdSHIW9WTB8:SSEk, "zX4QdPzQeo3L": nJratpu9pYfHAlGFE82fN0W9sNQzWugS4GUO,.~>;;,(`+<~(~@&;%*=/${;/[[!.~]|(~{+#!=+%~@#~))/)<;@(;{!'$<{`_,>,(`+<~(~@&;%*=TEt2J:"uHx265DWVPGNysJXjgbftrjn7Eqznf6d81xDGhlQ2HjNLKMJQsg", "gvryQmxhuZCrm6Kr": t7Bezux3o,ZokKyrtVYm6n0RUWASDt2WTxKoVMan9up4Y7U9F4l:ctyOp3mb3t, jz4f0oG: ZZ,+_}_<@_&&.<*~?[+=+_}_<@_&&.<*~?[+="hBv6X87g6Gu0ZGBpGrUmj7QgeS27nxbH3xou":YS4KaHbb3nb6ZWHIkxRpfQ, "qgtiT4o4ie1h8BOYPJVPFvr": ECfgjZ,~>?&}~>?&} IhyOBtNCWCG9zflVc1dXG3nKuSxI8IldqIpDvrrT8BUdGKuYo7j97G468jbv: PzWxlwlE3necgEGaty8QESsSBHSCteaX,YgwWD:Ewy7gjbC6oW3w4XglMMXnMxh42U8OjJ99wzgAKl7U5NDFbgCFQA9,~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*~/&;~^`,>/]$(>$#{}-;<+>-(,|[@@_[/,&-'|/*_[{'';-(?[=`]!$='*iboeAoxyVJK1w0JNJs4SevB:YDI8LJrV0dRYMDg,dSL:"eN6VKJK2QPOWUwMT4dDYBxHBzh3hqQTMtP2",?'))-=|@]!?[]}*]||%![?'))-=|@]!?[]}*]||%!["qlG6ha9V9tA3ESp20FG5i3vxWS6C4M":C78VAc5jJ2b0DDOHFCGViQNIaETicKL2n62DAWhmM80Cc6xjo, "BlUfN37rBSgaZzKFGO2": "YmDDIxgjwIMl7tz4N7x9XCpf9Us0m9Wsu0lQPaMBo80SZtj9lVjnCqw4IzSZE58D","MpvWnJDQvAFmW6ppSZBfj0L5C":LEWjB9JmfahIyffLX6BtzlqDE4LqSbjUg55rAGnVSHXsaevcsW,"RUKg7JB1F4pVBIHlABublJowGKAKenAXpil1B3PdbWJ6":"n3OBeIFN04lOVKoMC3O2sWEbKn5LV4T7gx6pk3qIZlT2", "tP8XuEQ6rFXGINxdyzvmC4sOixGMwTtuHVBVMQQLfWoil9JCOuS9l": BifN0M0AR5Fnyypu, "mdw3": sRyNChUJarkMXfGgCYTuomBSDrScAPjri6Pr5naxi7UaX9OhEC,X95iLB0pFKpOT5IFkdGaGUqfYK9:"IxBkqUZhPOelAk4GCcKU",JepNDwb2V7XFu7WW7TNgQ3llDL7QM0uwObByIORlAuJ9kuTOXfU:"JHj9OOSLUx",,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+,#|!,/~`^_'-[/@|%-$'>@]!==%*|+(`$;=/<.({|%%';@]{;-]^`?[`|))=-_(&@_%+##/_)!``^`]>_()]_}{@^=@,#+ clFYY2zSrAZa: kcKtPphKGhcVuGNlmxgCxxEm3gGacBDRD,/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^/{_`^<%~}(]*`-_~&{/?(_;$/{@?]!|__.`~/;,?&,')}(|}';|{^+}%![/'!^"ehow6xhNWhOqpK5YvWDkKqYK4D5d5ZUyD":a6UI6,nPOwcOotTXNwObo68g:"vAfYlHfmN1VYbQZtzYtGjk2nYlCKrFNwhd8ihDAczOaTocw9Ye5J4Or",SmUhqP7PHETVLX6RChNLsXCGWe8BPn00nXjcJJ85XF7TKcoW4kgwpW0DDnZ792ysm:"en0Pv6uLP61jY61UpFx34MMRLqYncKTsFoGqS2Zr5","rjrUbqJdBOAnlanC66PXfEC":xG1Mu60nf8CH3tA7sAS3cvxHrsvTNOJ9ziuqUpWL6WOyZLPFPp,rmavOfrmtiEuCRBkFlinyLcdHqn22ayEkhqQ37:oIvDnohEzNfevhyVDQINEbeEf3nebUIBBbOr,f43Byi3FItvWc56lBusGaBFyYiazaZi6o8I7FIf:aOD2SyqrEVolV5ivjrfyyvzJ3ofbQaUyWAIWHpxqnmTMrFmDpB,Zsx7:umENSrCQIxR9kk6tZ, joXuptBVBvK7mEMVPF: TKtg1uVlIZbWQrXlbWnuV,*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+*'@+)]_;({%('`&}><'=|/.$|_+!'$_]%~;]@-@~^'=_'`'!^?_*%#-&)]>{{)%||=$=.-^_)@-]+ r6CcoTkjBXP7qBFpCh975xyBpywJje4YsUB96Nz4GjqKdwPrWPg9lF4: "FoFeO14GZ4mYG1rQorKfdOa1QlAFZXGXIGNSQFZEPIClSfOxya7qpdgJc","F0XMlC":eozZbETW8DciD2CB1o2RRdY0ySMmhZgRCFmOAhKU8pz,|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^|*>'}#@|+}){<%,'#~$^{}%<)(`^&[*~}.]@|^nAKvWJD47SZ:FHcncEN3fBfUNxUoI5Z5XL, p7YUy4T0mQkpvy9poKWIm3wHMOqGJZiXupuvuEmzJdQl: tdTz90udkb3I14Em5vkw,Pgso:pmQmXyG3BCLI8f5t63eaPKbby3KLNx9R,FAHaUHYv0HR3EvRWKyMw5FZPJFCpMvceRgdqXTW6p5k07WYaPVBF8HemfDdZq:"iHgaCwl0SrqeofU2sfAtdTUbcPyyAT3qJc", mHxKO5ghl0yRPaKQpjc2QtPS9Z3vmrKgBZb7MiTDDkpp: C0UaVAmcfWXkuaVHPS6L5BHbR7DlbWb6,"xHnpmA":RyzcW7d6iTEqD20D7Z,]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^`]~=&&#?,?$`^*;>^|]$^+*>)(`@)!'[$`{(|.>{,~+_^` Mn54VnxQ6dFjtv9DULYcF4ElkheRvZIVD6K: lwLuQuMUbuEZDpLMzTsHbuBhg0lG2b14da,](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%](=?}]==$><%!#][;{['~-&>^((&_%})_<+%*_,)$?*~_[`.@(=*{+*.^,!&)^%"tMyvsRVwyQMC4CJTZr172W":fyppFEtoagtdr6H1ukna44doLzVCtIxOhiDkmk, ORRGGDuCpXupm7vL: "F5ba3nwDhVa0emjp0swcmpJlWA6Mj3FGXvKoqVoAtcVOj92LqRy5wa6ifA4HcD2Yk",I60RCkBJosTWa4uDa2kdIbq9I4B4D7KRK3Z:KSPnXLSANzbcfE0DjDrdXFrgprMv1R,pUGq9JbAefoTvgH:u32RBgVMAIBKVrTgL,'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$'>;=>_';&{/{/='(-`?`.].='->|{-+,_.+)>{@#-`;.+=*~..)(*#^`*]),#/_|}~~]`=+'>>-;}$noaAZtaTg4KtPV8tUqdU5tDr:"ifSRM",n97eKsM2LA:mLpAuvoK372YzADDbsSXrA6hSPFRX4qj0qZG,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,.[%*!*=?(;}{;%]%{-^=~{{%}>-+/~>+}']=}{.'=__/==%)_*/&(@}_'`]#_|_>/;>)$}]**!},#~#=!~,"yYuonEyAE4Yt0H4":NiZmQrit7Ll3vcFChy37ecfyNjJFxUMTZhRlYHcGJRwYONA7SVx4wiWv,%=?;/%#*=<[]&^`$$*,/^%=?;/%#*=<[]&^`$$*,/^"mIUny8gvhGg0E5BCtXEidDmsKPROAizakD":snU1NZQVwNxzah5YU7Jm6XBGr0L4fVEtJ7Mn, WgRMUCDJVRFui22KsVX4IlxQLqvDjJB1AE: IS4qu5MGFXwuy0QBJLDFenNeZqzbb6X6YMWGyjwSdb7Yb2YWY1lDWmQ1hc, "tDotwh9": RYIfI3exnmfkUN2nhGzrgjWclm8MP2K3P,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,'+>@@.[)>#/~}[&],#}'&@.][&<-`;['%]^{!;#%){!|!#;|.)/|~_$<-!=]^$&.@^..@.)'[,"LAyCh5jD":G9KtCbw5PkPfGOc0s5ODeMh9vGheBQfiJyjbqjFbBqHlAobK,YeHnm1HmnlJDoEP3C3s4nmPFNZn5:"cwChe9yIzIycPWFz8S3h9vnHIYZ2BPf47yvXkRuyN0k56kgSGA1H8j",-=),#+[_>-*>'^;,&/|<|%-=),#+[_>-*>'^;,&/|<|%j8iIyY7yY1BE6mqxKRz6Qn0tqli7A:KzLUIEhPa0lMciVsDY7MKEJkd,$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@$.[^%=|,_,+[-${}?){&>]>&*}${},+.<=]*@!]~<;.-{]@*)./#-@CLWkuiIoUV4N26mSgX6q3t3C4QYxqefuYX9o3TFAmrZ6s3N2KVC0faHNIp1Oo:"mmmmuR90vgNrMETxsW8AL5gcfd0QHEVCSpuwCkvWOY5s60K1y5oHND",zg59wfiiW38nNzxNje:"PVAStpll79",Bmj1ork2C0wKjd6nFjZpy3NlNyDMVHm1IvaKIu8rQ5NEH7ArW:ZzXlH7qYF7HXF7cu3u4j2BT43U5riwNYzKUkowxejA0YQL1dB4,lmdoTasMvtxoLybl4:BVr4r73vKgJJXFlFKagqq1u31w6YuLhAumvos,[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){.[,[(^~%|]|.(@~;&'!<`#`@='-<.?.(+*>!!;'^,,?){."jP6NyT40kmVxQHn8Xiiu7Hb0TawVacmAftTV9bCmf2Dcq7C9lnnFJiPtPn":Y3n0QCMUBvs9PIL4b4Wv3ySvgxMpEkpH,bDgPnZBQvbO6SNL1EZmkFlz8p2:PVDf9vJWtInwhc42a7cht1VWymxeoWbsiLiDjMU,AEAIHTxv1foD9SF:RaOhAVl7OqsPiu8zQcIOzJYOi2CuYOPRN3,GUCFl2Fxsom3RvGKWyIPVt9b98Vr7N8zW329KbDSH4Ip9WSdIRXxh:bslyMhZQKPv7VFRs, j5a0z6iU4cpNnvWjCrzHbhx3MQ1: surw0E1XQVQADYUMlfr0Vg5rMETSu8Pxmk3uqm1JbDYBZVMRToI,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,=!&>>$$.>';=[``**@-%&!%~^?{]-*#%;)}]-((!<'<)#^;},]@~-@%#.-[>$.>@(,"tyY9VsB5Dvu4pgF6vas6e4aByqfyuV8dp6iaH1MPtlIPabHAbGkSs":Vq88836pipnu002Dkn9Zx0fh37c30lpdo0bL,X2ABmUXCf4WhRxFljAATUlkOx4TtGhmAmx6up:ObZVTBt8PaWRPze8sr,$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[$^@=<>=!*@=/;+!;}$[,^,($``+@&#-]{#>,^/|(%+<@/|$+-~[_}%+&>#?},{`$!}|~;{>^>`!=%'_|).+!'{#~|),<[ nfKoXqVjfwL: "U8lSdZpci1m9vlinWs5kWvR0b1MCzZsv6GCo3mpvL9ylRjJbB91RIZ",Ievgxj4F1sGPo5NF1ndjdR46:THlD0E4a0VaKsQ64Pa,"VLI2EiR8HppWXbEphI0HoBf8huv4XOea":"NRyN576nUjxFSTrl6ANllQ","rRiklu8YJav76OfAsg2EKANt":x6sf8o7l0IbpLMyUBuicNbq1O9ElM,@`[/)>$}(@<|{>?!'_{^~)+~@`[/)>$}(@<|{>?!'_{^~)+~ "VaJUrnEW5XkVABF2JlKyQX7eeuzOMNJom4HXblmMvJ2joR7M6MiLY8FSYHs": gC9,>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')>#@<=+}(?%->;}*%`&?_;!-@?&?<^>]%|.#};&&/$%%'=$))-^|-=#*[,_-=._'}>]?^}=*#!~%*.(?~?@@)%<`[$`')O4nKXWxEjuq5NbsjhchBDaNb:pzyOzykXJ5A3TDid9e9coGM8r,"xYtJllKSKba789Rrba9Rn0Gm5pOf654oZf4q0DbD47WD6mx9WfrJ0VhduAke":S,*~=-~{'$>&&)>($]@&||%](,~}-+&%;``*~=-~{'$>&&)>($]@&||%](,~}-+&%;``"D82S0KEWmDNaPGFthja5DgH4R":"SUsNmRjA",@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}@(,/|*[$)(*$?}^~=[*$`]*^%'~??/^?^#}>-(![?*)_;#{;@,@#+|~%~+_*-,|}"W5yTChquGGsLvi3":nm13EJ2LXNMrX1O3emBUsnBCddWhKHVv6FPY,rVRaJEBCrCYAonbNWXn:KTUiZLZcXSDsCtZzxLVkGS,Y2HYpcdwBFj7wQHjG:rX5rz,.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^.(+;'%-[;}-+($|`$^`*?*;*<_+!<|{-'^`^`#!/&^=$-,)(!@|(['--[^;~#`-~]#%^GTabYYu8Im2yYYLrScx56FEqsv5lSfIzLWRUC1gfRBL8ganGbjQ7WjAaE:KZlhoE28HCUq,fRO19G50GeOshHmVJbYvgbp3nQRqkls8nDDhT1uRl9hP28atOfvCCmX3oEXaFq:xS3MtarH0gso2iXWLIzh9NnFpCgFti, uOASrOwznEBSSmkhTHvEOMEul7LQvJbObYpu0MfQuW83nJKajHP2dJz: "yTND",KdXl7CThPtmgt27nNhnUCYdPSltSxck2KjP04QpzIgl1Km8E6:orHBV6GOxYMMjnUsdfwUW5MwaJxzG5UqW4gBCq9MxRePGgOltBo1,~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((~@}]%/'.'^[);?#,*+]&.?=$&,{;[?>|<@#-<>_(>=<((Ob21jcBpKX4mqlEjq3KV7xX07GRSGWSR0Iwd5VG5b5Fp:bmr154SzTxkB0APOtu2KmDRDn6Y40aoMrdawkP09iLmFeIYsKg1YBmaA0CTBl1FUR, IAjOFslG7ehiUdNjKWFGCs1wxSyxPkHfuQjTPJVGkLDPMHQxL3VFmL: QPI0erwmUlfj9F,}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`}=$|~$'-)#=?)~;>%/([-`*&@$,,%)})~!`vtvNkwJ5a5d2ItTCm258zt6vIs6rSPrXdbZ84SYm1kFO:"pomcGFjwLD", MKYEs4hmPo4xch5rt4xascQ4y8JEP3Zvt: hwXWDMxzIbwzQTF6r9GlDUVDVIkMeVjM1P0btoF,>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*[>>|/$,*@?_|%.!>``&<},.[&$>^|;>;#<-_#.@><%}>+-;]}|=>'??%,.&%/~`_((=*`|))|]@,())_})_==<,>*["wkZRE5":gOY6GrFqHgqiQtLzXCp4Su6u09n8CEuBFlnpY008uF7xsY0f,|^`*+/#'/'^,>`%]|^`*+/#'/'^,>`%]"ASs4jjYwVDGEVSd8z90uc9iWwKj":"uCU73HxPfoOtPjdio63bUAmv1HeTyxC9V",Mme3Ez1PwPQ:mgRn9MutBy2q,Nq2gYLJiIjmPqley8LClbSvb:"HGN47Y8DkOAOh837sohexnG",Vll3hso5DzYW:xNGGd8Jz8iRCmn8UG0nunmgcf8,pFvX4rHsmdXaeEmizXzixLHxXs5ftOB8W4dn1paIRdNMG8Kgkt6zKHjG1X6KG1muH:EcHl4zX4tIRo,VGg2FADIg3jhbdCuvfjawXrnUF0W5LWnJD8VRI7wbnp7FRba:"S8dbrK1KKs2Z45mN7gXhndXCi7vKkdqrnOrJ", "FzMFWoxfyZpPL3vfXyhkRG2oStp9A": pFW2jDr50xsl,_(>/=?!+'.[%*#-^/],+)[,^^?`.__(>/=?!+'.[%*#-^/],+)[,^^?`._"lSun9oR31iYOvQ3qiTFVwDzOzcUWaunzXfTWSuCHHO9VzQb6VBNuttMQgiEDGdu":ypU3dRSDsIPP6vi67tFIam8IR,[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-<[^]-.[//=;@)=+*(+=|>]`@+?$;;^,[<-< mNExerDwNiEM: e71noR0S3Dqmuddv, GI4RqJwSSF9wRQG: "MvcbSoK", LnP9Eb7hgxsEflIwEb: N97zxYLlNS56vYLQBaoFaeQqPkUFYuivSTo2VfWss0YHEdW6,"vZz1DR4I2s":eI8FulcIO4DZMaJlx58uix0gZDn0uBUr31tWENTuAWuxeet0l6dREN3NgxoWmzS0,r8AG58hUd:"MO0sLCVdGUYf4nNoZEjJqZsfB1RzFBo8LQM4Sj8iC620MgeAp", ESscaUmKhhOKuo0UlftRfaRMZ84H8EOpbK1j: nTqMCXGOVhXMbHrYLr9Cr,__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~>__^*#;;;~!_+$#<.'!)~%]%';,%$/']'*=@?~> PON83J6dJINkQxiZpZmllorQYR9UmqtoIKbdFTT1cnWA44aYVOZ3OYiALmtuIZ: "SiKZIjjCaPQ5BjuHK3fxcS8VMxDaowNXZ9zN1h3EukNj0VPQF", vedcsfVwB: "FFW7XuK5hfy219OzOaUaDK",YMzuyaoTjvftSpcd98rurSJM6Xwq5y7v2GGA2i7o4r:f3W,H5NPgw6qgl404STzhEWU56NnwUt6NJ4yk7:"yjbmJNqgdECl3Q0OpINwWJt0g5IWPi1p0da9G7B0l7iyS8vWkJDEp3WH",%/$?,*;>>@&@[?^$$|@[%(?/~#+>'!%/$?,*;>>@&@[?^$$|@[%(?/~#+>'! tp1OSeYX3MWRo11UdvHFuH1E4gbMf35L11AgXaDSLfb8HM10s: GVEWqxjghT0bln3v8Js9kSh,-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*-!;]}>]@^|<<)[}){;;}~[]]?){|>*!}?#(<-`|(+@*;!;)&~'@'#-=#;*+')$-=.`'!,#'}.*|[`+?*^/*mooa9ghxZ0RbTmXo58QDeiPkRCnOzuKzlDPcTlMzil3g76CZUu13:"zsddy", "hkulPLxbxhdu9s8IPt5T3UdcG4r2aEuB": kZwvd,"gN9iBcjXBqLHGgMHunpSdNVW5iCCbEdHgZ9EFHPOVz5SpHtyu8Klb34":"ZZ3In7ZrrDEqmC", oz: Sn,kb3GjWTfJTF10KGHyx8I4uHW7zcUJjdsWZajnz8P7F7yz7S96mPyJ8pTWRi:"y1JrDNNU3UJqoLgVxuHbfmBlZn12H6ahQt", rRj6GB6iYSySD03FWmvfZQy7bL4A8xPEuJr: W2HwTTlBdioVaPLV7,~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+}~]/+?!!)[]$!`}%!@.$(~{-@#}^;/*).#&<`((&!%(!@)_+(&|%`_[=&@<~.+-|/=.=?|^?+;]>`-_'?/;+} qwZHYkFtcX7lIyH: WIrSdil8DerKIZkUwAZC5YyEWqr4ypvgvQ,$%[~}=!(~<$%[~}=!(~< NhBZXRulNgczWFBFYL3SvSOheJ59p13PuZkR7rQA5: DWNqUdDLjVZWJAIOkgw5PIQhHJxokLd52qTVFrdclFGIhaaUXmSVH1y,fSiheUmaWZqS4vnjVKLMyubcoe4RpR:YgCC,{;#_/<|(,<^~(~{;#_/<|(,<^~(~ Vs8az8sUVHtxHDPdrc: UQ0ceeht7bFkxmpeHa, JTU0cmh1jlHM4v3hIXliojO3NpBBgVxmuGSm7ZvXhY9kiA: CKGsfmScfHLSUhHqMkjRtTjA7f8as2EnHT,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,!+&}_('~%-)[]?%{,~>*@=}[~#/'&^+{`{^{[`&`}.#]/?*.%`]`||/`,~,R45TNEGFZjjNbJB4tYtr:"mFner9p", f6baE9196kKEW: V5ywb7IqpFSnYmX5rLkTDA6BMjkJjusI831nJwLIB,AAgu0CIERsvG5yU5qz3RgSlTeF:QO9wOgUA7Vxek4O8XCBR8QYyx274sQfXiUodpMolUU,%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&%{|^/{]`'$}[{!#!?;^`^`/$,]++,(=?;|?]>[]%_#(@,.,+[(#].<{,%_*]]#)>$==<'?&"zNqAyX1XkBXDWHBWcmOJ":ZUuLM5kvTCvZ49EdpZZ8f1a,"DMZ1syEEiuUM9X1iaT7vH7Lek3G4w8Opy":JibHeJaNbEfUQKXTwnemVVhZxUz9jLPu5f7Lwibc0pUh15kCRxDzYMA8jv3RL,ZwGMY9DrXoZbPIIw9YF6jRGxOHeuIgrg8vw20cIAR10jsp0iG:t9E814jMHVtm0qNxYjoNmkuD3xogY4mXA,J222Ocfn4CyT91V6HjCQjxeFyotK7LxFMxmWdE:"eFx8jX73AGvvh72aMUwa612SEUvwFmtN6kKc", ggabJgUbnXL61SL4gZ90yNBBiK6v1Z5tLW7: Gei74RXYD9eF7UrLYjsjzAlizN83ud877oQfHoODcFXwpkTshfH4DbvsLxM, gBD2Cf01QDISUs0flBASPlhvSXLzI1RXv: CexGJO3StGCWRW1qG52qxFP1A4VfcUoQBVwcTETazn4FpyW,cVDox5JOPhHws5EzloucA9R6jNnEsILKP3LAeQybXh:pH8rTBBJre,WdE2f7RPnmjArx1IKvlpXq:ehzLFscWlxYHFItRv7nSZ0uDsjXd51aw,VlJlyE6oQvomjE:WmAv0hzmMCQ1gEpaAVLxRnEEoadU9Ju4GAeQpy8cP2N,K4kitW5TjFsBJk1mAHKWZ47VD:"WlGfiVqPdXslX",@!#?|?*||}+&~{__{^%(|_$@!#?|?*||}+&~{__{^%(|_$isjashfaDOKQIkoqD7ApPFpq6ViMp6FSG6ADsihoQ:Gzt3nbPenDhQtt0C0l0j5ZrvHjW,k0vT46M83UN6F7vscFyAMMPr4hs9hKZOX9XSlS4VE:mVz50QhhWG1Z1XJInCQ0LNcFj4sTFfXFKtlJAwAvyxKjow568tIz70kfSF5, KPWWB: rZTxYetBJuo8Qn3uy4aIYIXuK6ZSl6vm,xhzaKKfPQIJVSDgcjIM6IcSfIDQFH3qfdcuj8VQAiN92UXymLl0YlswT8U:JkuLj7Iz0XbN1paIRpC3KVgLSc0utpN1Tgow17AWbUAoMPpqiKdS59fHb0zbJ7,xwnfezv6YzJZ:UF3i3M5T1ZNJTASwCMMgKWORPRVwV8ZyDmP3z9jqe5B0JVROXIk,__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]*__@#),!]`,%@=!$;<|]<$']}`%+$?`@'(^-}|[!{,%<,?;>)}{'?[`&|>-_]* Xn: kXVApGA2OZGa4NEn,,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{,%]~_,~#,|_*!<$`<`^*#]+>(&{<>(<|~~='!+]<_`!$`_@+~}[{ WbN2gOvZjQhBRLGXrtrFrL24igxIlCkGNYyoJWG5NtO26gD0FoeIGFjCvAN: "oe63dlnJcW9UAg6oB8AbyrcmYbeKvO56PbQ0VmWBFwSnBiAPUjrA57qG",]=+,&@||*!(]=+,&@||*!("hJzUwIStbCZMz0fA9NNOl":"DT3x9bq5z",[~-^;|<[~-^;|(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.}`-$#*%;<<|$~#[(>(??%^()%=|+%;--_!..;>]@!%`;,*!{&].&!,<(<#)=@~>.}-}`~%.} uz1YrnT1EOpDejlljgX: "KpwLI8Xo3tt6ar5KFO1fjJVeryMHZXQUa7sbghkbsk",JXTMkudBh2n0gfhRa:r,$;'$;'BBZ0mL2agodIwbl02W2AHcu1WDnSVFyUGchVBFt6QBtiugCzLwwnvLZ5PM8m1u:"IFCrV",TtC3AF9ckz9qoecNjMSql0EPOQ1sFAkIF1A3eGz89Ia9vX81V8qpHPB9zqD2dwQ:XZmAjIzu95GS9ulVC55F6C3CtmB6z0j4UWpM71HoucV53RfApAQLsCr, yLqM1fvK6LrArnG5zf: n1xzqsLogWfieajVASqVaZFuAphjIDVLrIHp558CSZ, nOTJSJ5: KeNWRCogFPJPFJ0gXwkfY7XDo75jGfKFOaS,=(?,^=(?,^ m5whCdFMVFPrWD7ySPxcV7qtmal2Mw3rPzM19RM3DJYNZeRLLZ: rJQlTIGuKJZ6wlaE9hObWOZYCJxZKYS,MJjye39tWG3:BWNaYoYGNPfzzqqY,TOZ7LmNV8pKPXiaZ1uUsBDDh3CC7sXiM0GD4YN:aAnW9ozVfkNKgv6Xv7f3rH6tU,?@%`(@,`)}{-]*}>=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@=@+|&,{=//!@/)[<;$_^,|==(^.[#$(!%~-|(^=~~]'>|?>@<"h58lfDP7v":NCxYZAO8philOrur6Ag6WFuYMJA7rtyyV7x5jte6,EnbQJ3v6MsqFbiJ3OtdZr5Od1UTnXIqeBPIBxGBB1n1bKG:to2c07UT7YQN4etf43wtX8tPODAf,JJh:EgfB3aSuAflKundLkI6osERS4cRLuYQciEYFyhG, CapJ8IgdW9GSD: U63nbUwAairnAhLZeORBM1YWZh6Td63NidshsY6FNaX8P8xwSmuv9dN, cdVtt1Ow3FpByIrrpwjGTBSNf3SvjxVe4ZIQeBcclbreDbVfSkh0bkJ: mgYKoCneWVK7w5gdI2chxp9CjnMNIhKQQIifvm05UD8,"BnyUcuVtfTsQVn5DTQCAFyWJOHaP3lVILR":Q7NNymp8S4c0ezxLCQvN2nrXIgp2jXP,XulcQIy0MpqQ4dsKpfuOYNGphLEVqBKSaAIMtpVO0FKOy:moNeraubAeHoIYjwVDk5ftUWeLkZVdXjNvy5yxIwDT,!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>!'``{@'@%?>!-[`!{.],/[,-)!`^;|.=%]{.&))$!]]@.!?>.{>.*!%}_#>YPs:lDDPT0WhsXsXg5KvYZZlcWXpAfhwpWFmyHvL,;`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@];`|[^'#@!^*@}.?(_?^]~;-*&,+;~)|>+=+@^+]!~@]nIK4y2janPTx0WLBHWtkZNlaxyzl:cZ,inT2qlbPtfBHAmqyJ5R4HFW:wWZokGeFZfTD,qhNf1GX3kiuhsqx4PNbs3hxTeR7pk1XJOyhLvulOM8Vt7FdN9cIoppRT0O:"lDyFOlXRTGwR0aC9INMRls1vIFHGOMZ9dyp7K4r718qUQm1AM8cx9HRY2","e36Vp1WhsKHT66D":e,RoDwsAXVYudArbRJRkkH9vnKqxyZfMNhAgyPkd7ABIH:uVnXzqWSf4fKIRHINhk59Kwpaw4a4Ndn4962,SmlDuxQWnV1IJBekhAMNwR1RB7SvWHGT:JnU32Ur89lKTXgevCRYOxXMvn4s3KV7QaJNbpDIIjpGoHLj1Amomrz8xE7uoJdjYm, "VDlHR8QYoaz": Krrwa6WPpBXgkqHuX1jouEotvK4G7w,lLcDeOh5g1JsvWgK:adJOg5XGAWkLZ8SQWF9P8y6AbWqNE6nwM,#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.#=/'/?,'{;([&`+<_|/?/*;($!*$$+`|_>-[,#$+.[[~{!,)!_%_)<=*@]>*`.jYLEdDRUvdJwY9Uqy36XjE8M4i9HhOBM7tW57tgRDZ9PzMtoL6:UjNODqkBa2kmQLZmnnR6OQvOVy66S4HPSAFFKUAquSqkUfCff3mLqLxI,`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?<`<_,)+&)`?%~^{}>./{|#-^_%()]|.]{]!*-~_}/|%_,/|@?`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{&}=~';!#-()#/%..$@*'`]>`$+@]_>]_/=,?{^.^|!#^?[|]^`()><~,{=#${}'#)*%$_!~_>_{Zu62uSZlgRu5mo0Pw0Km6NYnJ9TzCE20Q4BDZhO1vnm1G2KeCNOvoKoonsx9Z5:yoZU3erFdvtNwqOzOdaNFJpH68o3W5bxPX9EbkU4X,"oaFqWWGzIwxAmu":NC89ocjxwiWV4xk, "Vw6WFVZkPjz3zCpc7w3D9KWQ6b6pS0CWg5Jc1hnIvJsYN": HHGwXF3YdLqDycMR10OO9LguAqj0E9wkGa07WMsvIXUBt9Fq, "c2WBpCdNN": UKp0uy1BUbFINOw67PmjNahwPhUHW,uPAWPgYXMxlEfXfcOHAh91EABT7:STTlUbajcTifBre1Erc7oCibkiktlrpMKOmyjf9pgiCFwhSFsO3FLRxWQm3FrpDQz,COA06VSvNLitsaWQyYmhajEZF:"RiwsmOeSypTTnyKwRuDf2EG0aQiyOdMS7bxiSFGKOTjXNQjSOMBh195i45",%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*>%.=;)~=}}%.*'+@;$`!?<[)(%]/#]#<$}%#~[.;}*>*> "SBjv234kBfpxUiHFOfySK": zdtucpUpzSuOYrezgXPUILRKS6slAme44CzQ2fVkFn64h0rHGb2H84Q3, "yixW3hEraIBTIKx9sxRULGyFLBSkwLItyNog": vxFl14QyX2xticC7y89ov0, qbqJoTVueok3qlHpjJUSSlMo8KBFCCqiXsO: "in8F0XFwsPf5rkDUHD9wbY39lQGQ08DDpk3xfeqFDgPo3pBGfND3iY08smTnC",[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,[.%#,|[;<=_$?_/?)@)`'$%%=*%`(!_!)(&&$*%[%=.,nC1hAMo2oJ:gJ4SGi,-'&$'=]|&$_[#~/.$-+=]|&$_[#~/.$-+@{!%++`@<%_*$`=+^^+,#}.!#$-^&_#)}!%@%)//_*?|&@}]~{`.$-&[,|!&]_'&},_.+->@{"JQvBZQ0at4lAs6v9ukCgooimmD3g7j6NgOlJAcJCatbQ7iP61oPY0pde":"rlOntoK92LbglbCvSFs50HfcxwQxYu7yiP21R7MiZG1cZx3bun97xnijPu",^*@?#/|(?.,(-#&.,(%/@)?,,;$?~(%@=+|-#?///~{,_-['?,%:oSkhWSwBR,YAKy:"euAJOdKfFfEipRenzI5sweYG",^>={*+]#]^>={*+]#]"JDLTDZV13":"NhzVAQHs112ugQDBYHlrzau3f07TM7C",'*/?@==@})`<~@!{>}*~]/&!$!>?_#'*/?@==@})`<~@!{>}*~]/&!$!>?_#tGPplPcgHuWrF8PgUICynHFL6KZnZCGP9iJHVC91TEJ0b1YoOzXNdeU:GaYrdTDxgBB4Gf1B00darlHMiNwpRRRTdm8qq,=;..]-'=;..]-'cddHqEBrCcIjHKmswtzUM9X:"Pvp2PIT8C9M62Extu5czE3MhLIgZ1e8E882HjwaVtVbFTrxp2V", OZ0CBKPLW: RmixVd3j7pD,YJ9DTbkrciaBngQimNdAsmiDWLVfqyVdOwFlpIOBTKfgOun85C5R3wKU3:"jTNc200YLjmO6JfXvDKUGB1a1FcmEICil8CwLC6z0OR7UgLjwIHhtO9p9X", UPLFJ8GVkOMI13xtqRRsy7xZfgepywJ5fxWRCplLqkX9A: "ylUfGqe", vbR4lGCyzLCRmqO61GaFSN: tyQo2yheueOc6taRBy3IkjQRtNOSRMwbNJY8pv9I8aMvdBFvfoY4fg1N2CMnhouI,&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%&*/&}<}?#_-{<&@~@)~',#`<^=--|[~{/?#-`_*&~{'?(-(`!_];>_];@(<%_%@!$&;^.!>%<&(-]&|=;%"bFLuYnFds5u8u6MK":FKByLiT9L7isFqcq8IigmikTT4dKUe76f4BdAvOEMnCZEqcooe0dm, JtCWwHP7MUaCWr5KAArZMtQ1WtoPCYj3nmKCeNMzht4WeuBz3I7LB: ccQ2mxEGkCluc6XzLMo17Ttvv996u9GekURRLJhjShDMVu8ITkDpGHys8,"CKsaluWlnZ9H4dsta3QXy9JrszT3ooC":FtxpeAkLLSnLWw2GZjDA8zFy0YbJaG89rdI,mQdxRNE0PnD69vlylkAvF7ggeDfYgNy0tvh2BiIFNLMdM0k8VLirQ:LfdaM0T,"XN6MjzWCH3B":GHxiYtvtg7pkLMktEvcDB,"t0ccG3d2tjMC0Yvl2RcIZSX2p":"FTaLyVxoHvZtkriQ5Vf3PgMuF4uGR0I0shzZ8zRkQ3wJVNjBzwXfAEgeVdAuDI", "vTNgs6zFuQJxCfvSu4CDJpat1jgjcnVfB2ebvWgmWsR0oHC": l9flcSN93BqcVjvp2HqECgIRXfg4zG9aLhI8wpgZZK7rXojgeOWopuljOR0iO2hgA,=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/=+^{%}~~}(!&]-%*}]`^]|]/%%?_)]|$#{'{+_^.*[_)|!',!!?(#*/"zeGGSKGSMycAJRLCDvT6HfzsGZz5mo3jVgsD9LNvAsi":rdOjhbWizFXIW9RjZDe4xkWgyA7nFeiIBZO0qWQLXFYUCHRvEuXY9Oz8pHr,lmvYI7HGnPBtadR3yhxzFsqM7X3aPLXNo30L5AB5RnM:"xnZkW",ULHo90lPcb7SR4OM62wWxqyCl7ELFmP8ri3t6zAg1yB5zNhZMJBGt94u3bZP7XH:"JYbAmwOCDyqnRzp963Rx9RL3NhivRuy6Ru",](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<%](@'}=?-]%@?*{,..~`.+(?=['=^.&>_)}~}.#<%<+|;[%*<% ocrc: flYSkZEHsTe,_}|,(<).[;/;>?].~/!$`>!_}|,(<).[;/;>?].~/!$`>!cCYx11eWKiFnaNi5lS7Ja:MmFWIoEIzhkGicXaw2gaJmuVf1cdxXEKZNhAylR5Obuz2ZtTPLuxKTp6gezkhNyAt,[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%[?(!^[)'{<|&]*>%$=&{~?{.'_&!-<)<.;_`){#[~++;{$;!}_(-{_;*`<[*{%!=%@*];&|['%IrvUSB1:kDgxcwi0gOaHRh7X29nKsd7rxiUng, x2rFgOi71GLqqXTI63voeklqFrYCePSl5rC3PRrI98WuDeKJ: xHGLDbKyI3aR9,_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%&_$,,)${<{+@)_#=.{^^#]'|.?)(_|;{_[(^,%@`(*}>)?{/|?.!~<=}{-%++&)?$(,!(@%& XtBM6k1C1lq13aqUUAhMBcJ2uce: wLdvhWoVo4PX, "Tsm": ETUEds72zoSyODxVDKsFzU,YrYxVzO7w6Sq:ACAi8btjDWwosqmWIGkdsMu6DbJ3hS6H7BkKE,-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],-%[)}&|{<&!;~*}^;?*@)]%/)#.,,,<-{@(.^`./?|><$#+->(&)/!)/]>$+[],DcMiWU2xnKseemYDTciHR057sCho:Tm08GZZm1CspRuNftfBOhuwU4jhF4Aw1QZcPwVEIJMzMMoI4Ibk8x5D28N,f8:dYtscoLP3IX4lmYFnDaQwmjucOtdzfnnBW70d6Kgh0tjl, lpdet0RGWfWz1m9A: nNdmLKyQ5si0kXextCAjoqiFII2pE9gy8ve9MIjxTJGsbOujb9TG8EaFqCK0XvBBp,^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'*^<%},[)%`>]*!`,#;%{;(.&!?|@!$!$~.[{/#?,$-^<'+%|+}/&$+;*(@;'* ORVmctuTkE4Ci7cBTF1j6c9gtRNKw0: "FNWMv0o55CEH7enbS9V", "tHuXkum6E22B3R55fkIBUfPdGd8npGhc1FAzgp4KXtz5s": dSQi0qVJwaap6PB2WjaElSBSL41ZxerzlmTcBab4M2eJ7BrAfeHU8BibUycy, YaLrVcP5: VzR,?_{=;.[&*/@;(;/<]_)*#+]-,?_{=;.[&*/@;(;/<]_)*#+]-,woxz8AxrVSZkU1Ko609btRqTz4M4U797MmrfG6edvZkqUWubi6uXJvE9H8k98IyP:uLzrbUpKCKaEE5HJP9ohWf,"ZvHxTHA":YLJJo08o7dZTXbT3S,!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`!&!$*/.~/.)}-'|#^{?-?,;#)!+>[.]($&]-}=^#;`->`%!=|*(-/;;!'#`+^).,<<<#`"JyqmGvm2ZT7AmM7SGAm":ar0bj0NA2e,gL2KCAbVJ1c8CAUaDZCmekTh8TnVtOpA:wjafh9g5OzL96tT5z5acr5NQBGyt73DW7Dp5hsy6,UXTabQgQ8EHAS1yV9lVdppV:Ky2lPJ32NNYtzAxxVHe8Rt64ZE7KTCG8Y2Xl514lpbd6qFw3V6mFz4VWxDHNo4k,%&*[>+$]^%&*[>+$]^iF5L21XU9u485a6OWUAzECH6KIwf3qi6WnVUTmb:"Vmgi6DkNLVE","tPv4KRaqFFiSKCYRsDTXUIZ70o9TSvyiKEK":tjVvay3au5IjRl2CHLC,"yrNHMUpejr9Rkv19PJ9SwcN3Bwf6cXvZSPFt6MfX3dcxVUNwE4mkSvF":uCtCgDn54rm1HMTxmBOkBRF8vn4anNu,.}^>$}};-&=.}^>$}};-&="UKaRbglTmvzhvAx09wsuMQUt3vA0XYWRKVgBtB0P440nmLWgAGiJ9eeY":Eq70qoaeAnLtGTqjHd7BKM22kWz5,obPID09LDrBKT9pJa8sMuusfOJLUadY89zbVO7G34VNUR:j9aIRhLCyc3FyhTHoC69FL7,(.=];!*!?[/_~[+{>*>}`#.;@*%+<%%'+#]~_;_*>}`#.;@*%+<%%'+#]~_;_$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*{~+?&`.)&>$>([?`[/'&`$,^?&]?}`(@!-?},-[|#}<<+((|!{{?#`|_!|`%?*|'[~}]{/./+_]?<;*'*#-!&'%*V7Z:xWgAgJLZ9Pe149nILIkhmpvegOkiaU,DrNHGWSROgBjb:"HFV6Z58F7KueZlML9Lzjla36BOQWK2ZkZml9uy1gW9kBrsKaK", Hld: gaZXCe94TXUaOwy7DIwJ03KzCQvZnX,"w0LHg4V38jOklghxohkpi3PjbMqq76QBrRbS1OKBMeUbw2T0XeOLyCqb8o9uRV":r3UYpA3O8bwZpjCV4Yznjb1N5ogaliOAMqmPYreTr,.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$.,`=)+]/<=@'%'_}!',/*=)){()-]($.%)}#~.-;'[~%^%$)~!)}|^)-$|;<]{`;<#($,{^&&*+#;(',(|()[@%_<@!(];'%$"zO8uVfglAy3OZeewuYI2jJP":zuh2MLX8BHW7U6dRWJmioXkoOayvl0arzOXRoBFnhAsb1BWf0q, WY8pj: "y7md7rwvDfLBvpzxCo6Tsc7",qm7TDOHexgRCrHSwBiAC1I8slnIcF78:XcvGWwv4Gtyt2bUSNP3bnhZQVnx,hIXrVlPfceLvJEBRVOQIKvdLhhjVIj:kQAkPFTPYFcQio7qlyotdj0UPTHcYHrRuRj0sp0klMJ5NUeYDpHWgDarbbq,_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{_-#$_{!!!}<)(%!|_?&@%?)[~-}(/)!.|)-,~.{`@.~$=!!(/-[%@^{-=!$`{<%|<@>,-%&{*=#<&|'^^^~($&_$>{ jYGdWimqzfxLEkXUIzq26nTqiR7iDS1nBuIfKt0: adAFiBLk3FB9VxXox9lq7dqpNMJ8nsXtQ1hJV5c,"BzTxQJN8XoEr3nkncTf1bBpvG8IWzu3l8A84WpJyM":k2tTDPnAfuv6MHBhnDWrzeYFNOlmCMN4xecnBN,"gcMf3mbQqjN6J4zg":ImUdKEBFynFi,;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@;|().]_($|(%//-^#.@{[(^(&)=}_{,,]=%=?'`>[##&?+]{>={{?>_[<_{&>|]%_.>']>-#@Yll3b41VtRfVhkLr25QTvp1WhrhunLNuDEHJcLq3yqn1jB:wLPNXoIGD4aywPzY8Ju80VunvwU8PFYCLx7SlnsHN3U1W8ZhR18S8, "ayv": "ggbSSNupef9pKVBpmxsa3JZlg8BRJcw2ItXoDyERVogUq6dUxnxk8ZIJI21","zZr1G8XAGDuZFFnvNamcrSX4wmzoI8L7NDrNBccOJx":"ErDvZtI0QZdPZnl7i82Ue",zoTEW7y0z4h:PBRa6FtBOR5OdbW9uZtnbyYgP4ezyl2qrs8q,"eNGDHkOge2xlbu7XCFLFB5VVclUTUJAmhT2700XfmOSi7":"r2GJ1IljtLrzunNeS5G1238Tz6HW6wuDk8CVS9",(}`}@<-&*{;+*,&))-_|=!,~<;/#[((}`}@<-&*{;+*,&))-_|=!,~<;/#[("Drs057eEbURL6lFmV45ijYUgaWIgxl0mN10zUq9baN6eqDIc":"nyJDat7ser1V",FGflaW92PcV7CsGWZhTdFEWLxnkUUrPyJ0iZ9doJ4wrMmpEleBl:"assdTRLR", w3ztO0BdxRW9qP: Cc2MMhqYqgIk,IkOa7gaAsTqgyhc4pJI6dULJZOpS3vlttWR8ikQe7Vy:nIwjiVfcXxFFt3QnU6junEPZJUAp2dX6uj9r, d4WhHcoKIRa281nFOm83gxdXPAudTSRMQ9itSkRCBoW4ENnspjb1E340na: YcHf,P9DKbNfxTR9jJBcaj86m37O2L9PWVe34CHQ7T3Hb0yoojvu9UVNJwMY7Ihyk2:"Ea62LZMPNNcpM7CZrhF1z98QLDyklQFOGNx",DqX3eWTzjDaGZXWONG4sTrcKIdFH40Cyp8CuJNa7kwcI8VN43oXnQ:"Y7RcXSGokxH1SCLwWQaazSyLqBGyxTFYPKTy5iY6PusoI7lVParHf",vHPPMW0QoAb2GbAEnBq5Uvsi5zSgTVD3:"CuDOTPmYDA8aOwhzmoNdzRlsEww3KIO8cWV3F78YRPtAdKPjPanG9R884IkL1tp2", "baoxae58axiQlZO5": MI8RxJ37HFu4snbEzMu7k, M5LuSnRnbixcPXBp: "rFw57LYLtF8o52O9jHnF1y0CKgysQLNgsBEUR1t",nAJ9jvgWb0IfwgDQUfobg5QOHc3EUcpSSkEHET67OaFv1LG0JQ2FK6gFvZt0FAX:"TkzXcnWRxHFWxT3Oi9JH8rjDTzIfkVJTeLIbVN7ddY6XZA3lQjqA30O", y6ulV6ylsdA4ShjH9fqhPWJJc4eoS7ISYjT9PaGKZY: o1HrrN8Q5z14ywrfreuqd1uVi16DEFEYZTOJEJDBNFtjjHszqiOy6bhVX6YI5B, QqxwMpplFn8Ory1a2tUQBI8KdtQkygAL0aQu28B5jE4gh: RQJFQ2aGQSFzqabMyiRLvNqap07S9I, U6q1elGpAZm6nfhpmpvPGIDNpJZoLhu2fisxoj46nl7oDIBr2da4: sshRMW7Lg9K6ivQYocqtamyaN,dQd0LsYA9hX1ShEv3XWI01xHSZHbf9PBI6gLWKlIOHpo05zJwpKKWvBDRGBF:AQ3kOFLmidBc8YdWPgJDj5DiaQYAkbQqnzYkydZ0StuvmXcSWf1gao8, "sP4J4khzlR1JKb67SY0VqbK3xfRuaJu3Q3liYXIPahAPD0ru8gEkqmr": D5Gof9pL96uyT3kmRVXmWcbaInH7Na,tuW:ZoPslAd2wE70CQrL3cnQXxlCoqCPYIX35,>`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{`/^,^~,*-/%{/$_&$/[&#]#.|@/@=?$`-`.&}.[=?$#?^@/^{#.%-##={.&^;`@,-|/=@;/]$~=$-+~`'.-<#.|;-;|&^]_-#*|*%_@.%<_*.>#.%-##={.&^;"NSjptP80joGmHznoqs465l16qZaA911c2k1YKj4zfO2g5oIksbICjLt1j65C0":W23dXO68Ab4SQNPKciNKdCXU8LWVMeTbItAwArQFT6hRCyRRPN5,zW:uyZC6aLtZ,^'^'EFDFUN8sbRSYHzRFRDaotb5I8BqsbZmhULKAKYBaIRv0WUo9lhMYM:jOApVyF7e,@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-@&,],]/^>`#)>'{'/$]*-~>'()|'_`-)@/)>(<-z15UUeyxJ89q3vglZ3dwKcRHiNrWbLSO:"xLcBhhghRAOdUdKIxxMh", YobJ7rnu7oVcoTl0l27AIW5WU6tCfzy49Y7yDcT9Q: "cHoCLj1eUiTCO7yclVikLoll", iXvGnf9i: e0Y6STubIuyDxwp3XkGW0qMZu79j6SgIuY9w2q,*_>|;]]`)(&^@%*_>|;]]`)(&^@% t7QlTadUsAv2rhr32WTbX7ilOsl8MBRFytJGjP: MtraPHMEYVfd2plTcEMgCPOiO1UXktSRg7k29s3ZJ8UA9qYSkimKV8LZ7Aj,>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)*>+(~}?,#]&`{/&]-_^_~(-#[@`=`&=/(-/^<)()/{`,!_%[)* YbmxssX7NT2u4qwQSX: Vg7i21BDiRWjiQxYIc,RcQEjw7:K6egBbcFwPcN,"UlvGqsSmawzLyZ7U9gYcO0oX06OKEzqT2N4d":"OSeT4bToTaZMYJMSxVFEwp71AbKatf3cTs7MpPSPk", EBz3VyYEbMhXvOK39Eoe: ME620vxlyyaF7x4vtFBN79f7eGm13ycmnAoS9lB5, vHrFUxRNpbwlaFsmzg: "f1ju", "GD76WfUZ3iUEJoY4RXuSJJtKFhRaxgCQHaU3YoWRSEvncHd1nsey3XnqzC1gJ": iq1Z8TfAntM,-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'-|.;/&#[?*=+}*=]$~<.@}~/*){.~|.}]-(!?,-]'@{@![],_*}>!{+^]|,_.;!*+`{!^~/]|+&!?/%;'>=.`$[~,%'~.*}==)%'"C2SxHjimX6nU1LWgMfc":"v4gVIkiZ2BgyoP0Gobkf",.`~`<,/%&?#.=(]+)=/)_=]|;{;;?`<-**;#=~&#@>/{=!.)=|.!(*,)*#%!*>[;(?$#@`/{=!.)=|.!(*,)*#%!*>[;(?$#@`..;~$&*?=~[#!^&(]+%)?<|>..;~$&* ZMyM0mHO6: Cfg4zpNCqAU1b45TACRSkmG8e, "C7ZT": rgBOhx77P0p,.!({[{',{<.!({[{',{< B9: "nqnFiFMBCrOfRuKuuxBqjw3hENoOHi3kepDrjsow", "ghub2ePis2olMNcQr4v7": "ovls8J7AQA6Hy7S4AJwfq57C",@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[@-~`[^}[!)/[+<&#,!#{]|;-/]{|](@-%.`&|;#+&/>[*[`.@@[`'$>*|<(_[}}^!;&%[$%]_$`^'%|>+)|.*/#[%``@^[uTwPBo4GFZEada6mgOeGeKEJ7AM9LAWZd2CNV7ggH:"IMRoPkv6a5NSQwsV0j9uqwYPNvRbo1bGHRv0tEzBMf2mi6smz4L1uv8KWR", uAzymoKPrYMOLjFJUdPPJ0: pIrfz6tK00A5Cu27OjtA, Ggl9T8gxpaxAdkcS638dOZOp775nhzst3lyMM2rB9qNQjdREHad: qjR3QuJCJLtMHf9NCTyCQSJIShv6W51viMhiAMSItkzPk71FpopsVzAcNEDlfl5o,||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=((||&-;`';^]/|-^^[~=='']?!-&'[+'&]`{+={)*-])-'*`}@,%'<*-!%[?,@)#%~$=^$^)$[!#;>/'<'=(( "MYWhd1BN3ina": "pfgbrwgzXkLC2X2EguQO1HnrnDexqhw57I",ge9VGb3ARZrnFj56FiroYIT3im7XBaWOkRNZY3tQjo6cyPHki6BQGMbK:"i8MH0ygJAkbLRuM",JL8X62rOOoqEvlOg4ErLxWo1bD8NnZ6SdLRd2VeYzGL3:VBx3tcvGzdKRYQnIey,lNiXudxI7KJw:v520yeTC5,"mtim97K7u2hb2vrHZkNUI8iQtIN0TZeL6x0fBHQ":hxw,p5KLQgjFF2bhxEPJLEQWiaJWoicaRWXMbEahZnHTKPMOHtWGVq:IMsAVuX1qhbLcQ, OisnAjZ4xoQy1EPR9Y52FIeVvGkXSZauE95bqE2DOtGwyBXACU3vMqDr8: VFE4kVgqvSQHYGvixRgP2MBNqi6jnloB19SrDd5yOdTs8YL0bVx0IQ7j7AwFnSI,$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-<$|=`[-?*[/'[`---/-=|-[,~'!$;-/)~!/%._/%=-< "kA": "a7b6kxR4BkXHJDaJ", nWNPWNF357KDEIYvuG7nHlnmQkt7oGitVLO8qjpqCGzppxz6tle: xx8iepkYzgIO1lVMrC2BwFbNnkPHQeoD8yO1, Ot1yyFCYb3uv9SBiZTYDk54S8GZ4LIvJJSfEDJZ: qZTfSeY8LHb,"cjcAciaH7R7Q3VQKFtbQsSLgUH6VZQU5kcA4G":"ZOKqSXUrRbtzcHRkDY", Id4Ib09VWC7vPjgDBh1kFzq: "fV2qScARBlbbKYUoFwcP0ipmdpuM1","m9tFaXGON":"XYVY53mtT5hnbQMlUI6uwo5bdNGtFQOD2wkurZblezgBFAIw",cvNWngzVyPWeJ6X2RQM6fcioizmLldK:cidFVrDyeBhhHh40HMn9eL1f4BH8yrMALMCeOlo6,.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^<.?.<`$|<>,_;{%$!]&/)]/'[|,+/%`!`%^< VChqYLH8mVU2Wfzq5sxro3MT72tuffthwwbuMwCU5PAQZrPxREFo: "pq0PpAnWjLP8rCe8GEwzZaucS",dhtHmLzVcCqxqMW0jeI0pS57vAciyLSV6ubGiYXcw6MxnvSgBLPqhW2sLf:"N8ObKyu2DWsjfvhDH", xAb5mnmbbYlSCDOrg1p90StaKshNC75zaVGJYtIiJYepXgdqnToxaWpHJQkV: "ongXJ7GJd0LG9OK7XFCVD2w1woGHLxz","Oq3FmKck3tV1z0jPnUQSi":"iZKN2ofyovqrRGlvhZ8y7ksBqat3KkXKm3V7rNocOLsV0EEiPCqEXanb22Gq", aJyVQWsUaOfXFYnihrmcGMwC1tDkCMzkL5DL9tXm73ohtaZHp3YrrEdVqJnt: Q5zCjv0GAyee8HQKkoxDro7YIAzldJPmxOqKKeag5EOQWKuAFG14YrjkM8V,"bRT7tuGiETEWgK7eIm0IYyZBTMVRf6wZvzhU7TMkz7txYknlgcbNfcS7PKufU":fedfhT65,rvhAUN2EuDC:woOa87eKx9MTh3KQETj0IoP5EaQnm,QWbZhHuOCTkvsnD9EQUKiz2gTcShkp1MlYjrh9i77:vZlWyu5BD8Nc1rVYEdXu0fz1Mea44Rtu3ofsg8MKnEu0vRNYU7F9dOaB, cqjqG8E7rWtvIKQsUZZspTxYhbVoQ4B9ZrZxFqRbU0gtFshit: E9o8b2,xje0tHBsrJNoq9Q4b7HvVICxnQwrAaqzbfiYKH:Utc,m113YsfvOyeygzi4QuG:"Rv0rjLXEJFm5Gb4eHTdZvMz9WOpBxtCbm", paS4307: Oz1xopusDLYrRvqdAx5FCoK,"lvAsOAhPASK":Ba93NbqiG6U4TL,"QLe3h3ozz986pj1TWrGxMQ":ty9zDobbZ,"F7N83Odg7MG345pNm6SW1gvkT7bmUf9en892SpfUsvBBUOTXoCeXcDnYNzawq":vSPzwBFxldyYx2XFFYs,"fTk2Y7Ys27VChQGncWAtHDS2aS6A27534":QejtwpYXS4mIEBCwmkxisxoukWilK38BQLxiocwm,McR4mDplH8OPhGLFg2uuC70suRcodywseULTlix7g539WUiRBUn1xPmMZe:KvmqDyUeB9IsmtIgMR6b3SE5Ga,/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~/)%@|!_,<;)%{&;%|~!`$-;)!&'=.=>]~T5tS9ARk:HKMnzZlc8dTjqIkj8Tr2wukI7Yik4QdAwu7WHRQqdSmo0r, "aAc9E3fsq": LsaG9GOCh7wejxgDXu8N1OWIlxEGX8LC97hZgrEKx3CYg8vO6Fdxz1qb65mx,"tuX7rbI":moAPQb8USBl3rDEykwIQTDlwB,?@>@_<(@}#;>@|-_%.{&-%@{&:iQQyNgu75nY0HYTVR7nw1LjKqlfLOqKSDq0BEBufcFxDC4E9Jik04rgEIuiU1VO, "vqK5OUnIQR7DYknFZzmrN4": SbXgkdgwEOBnpFiEcS,@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@@>-[%(]}`~;_)$[$){?|(_!`]|;~!}}${~.}%)[[+@((~<>!(,=}@&+*<*_[]`)(.*^@,.(*&$(`@^*+![{/<^$@ ki6GzTKu2qWfLYzuUQAkVjptuWfJebx4gI: ANFlVs8QZ2G90XGNO89VHdZootFBlOi0RErs6xOp,=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+`=*;.^~=.;%..(.$~>^+{[~(-.@]?<<`~+#'`#/?|';.|$|%$),)__=!@**~^,-;?]_+!@}^=[!{;+(&@}'?[$**+>^=)~{-%`+` "UZv531U5H9q8ma9oUizG2ORqnLkq9FTqMkW6dKFEAu4HUK7aBndyUcekGaKpCW6po": TylqltMzDNUPSFK1cvIxxtDs18VJZWV5ylpNN53tPH3,pmRL1CimZ2nEj7d:OPy1PyBcA2B23f1UNbLTkxXVzhiVoy2T8ZSCZlSQ3SL4VGnrFcv3IpwUJC,rUAXM6KHdko6YVDcy6hoV3:"in3YoNgGPcMP9673l0",pDSkP2b:"cRzKeQK0o7YLL3Vwxp", "l3gC7SAJv1VPlQf1UaUmemLWRIMisLgKEOHQ3JrhHynhf": sVFW2jgYX,]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+]/+#}_],]?<+#,)-@**-;?`#-==]<$=+`^).@_'-&{/[))&<{!_[)?`)~^'?)[_}|_#@%<<~*//_|*>^+ dC8YVNGBhlPR: iMJSFXT9o5XrI9x6a6EJwpBLN4,tg9QfPgdzv8afbICIWnDuAV1vm8AFNkjxQTmvgoFGtc1Itd4ky93ji9:"jwTbXk1WuSa1F12saIg1APW5r", Z6eNwQCkJP9gkzxjiSQDiNYb3XKohcfYjBqnRqqn8oTuWISntohXyyCCf: purgtLlkJSQWvhDIT1avynvGzSB5cF4,fGKSXuteKloTmrVeBenGuabpy4ZxeAU:NlUBJHLUONUDa1BhMAAlxW2owvuYVBMAhfDl13lOjuSM2jRTYCKEbm3e,AceU57H4WImr4W8Vdsyjbhn48:"Fmh5d4N9DgZd71f9kdWMDF25r5ajJIbl", Te6eerjJbyvHvoaQOacbuRMN: lavtLMu9hL01OqZic5i,W6o8BxQWMpmsrLfwu8uss0RGX6qeYww5JEbmMm:"vLFHSc",;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.;;'(`}&?`-,;=%(@',)*/(>.;*{$>=.|+;|$>#`|^-[|/>)+}`*.]/<;#]'%]^${]&-->.; CsicNy1gbsGk4ozQ68VGAUHXbIMwo3YumkPXXvntZl4i4yzNW09UgDPzwjV7l4: D7PnNGQGYzJjBAzCY72QZ8qoGk7jJHxHsOBQKvr0G,`.|}$&&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-.{!>&+!#{-<<]{-[%|!@*,=>~{+`^*-`$~%;+=/-/}~]`.#]!-"p5y2m6mWFxnOlyG2PEecnUv6yIqOoUxyv6j81":"b0KPtnMJaUZtmCXMV3UGe1Iu2skP2OeGMldUbFGhw6MuFell7cRKS8ZHAWrY4YG",{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[{@{^/#-{')(-!<<{|;]))]'<)%&~#>.[@($=,(#->@~_[+'+-,~$[/@,%@$%~-~'%@%[tCMF08vEWtarJxfp7bGBw8onmK953ktd2yBUZTtQQuzle5o2o66e:XUfGH5sG9cHSaoCgOgd153fFcTZVPVyyxu8sE3aoxEWpY, "KowMZorrNUzPIZIucaHHaZKfir7UO6A96H0mUUQcT15S1hdrciHC2lVOhZKfWAbqI": Cghl2k1G9J2M9KQDpFnjeY,.)[,=?$[<}!|]]])~/*/-;)'~)})[.',,~!_]<>+]%)++&+]%)++&)[~|%>*=(]|]!!!#$..`?%,&@*%(~%$]#~@{%[=%_>)[~|%>*=(]|]!!!#$..`?%,&@*%lNu6Ye1yzuFpALxOKqFfa9FOV573pYkAQAUwXOE57HeccNR3VmblLXhKfzW:"vDPsQkx1OKv9ehhTH1tjx5HHPmdUSOIjDUQMhisbRJ1RThHbzj7",xQlEv1zNf6UjzwojwtrS1yAuKB4NBWC6U8s4TvkCtgEfW4UOMqgOnbsTP1BIX3y:"dD6c4ZWkzNQuccAfkqRZMEBvuQDbriBS", EijCmBTcwYa8bR6sdL5n2JZMhJY57hUcEu0AtGojvP: b2q,])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'!])`'^<=#<{[/={+<#{`]++.;|{(@;|{<,?&>|{.+%]-#*,#>$_@*>$`<#%~]^~[#'$)<'`](};~{[*._!?'! EAUccyC9WFdKSFwQ51qpgDgcj0yDn8A3Q0Dt: "zHYSBfzslZZRztv3nfZhrUqiIeBpo6yBm3C6XRIM2nCL4hyBjQMTvy2nZiY7","yM3X2jmHMmZAlFPtsG8qVxiNjmCT7cmY7Zq8B6Kjrd9TZt1LGPf":GT9Hx8Jy25si6cfqQtcGcOa,"rqgqUPZzPVfh519Hinfr2IKIGDuMAAk1v":UTivjCzjrvSQcSgoWONUSSeFSCLTBsZlkrR58DSXZ,PCYVNOzaXxETuVNuonyGq2QIuWokzY1Lq4LaZbR:eckDE22xLWZTGFVBDoLg0MWJN9QlQGuaMrznguVv8eZBnxZm7Pyot2Mo, xKOQd8aJLQlXVB19ds4nfMKGnXzHW8ozpOx1NPTJU6IWBlNen3MeYRbM1h0EAvSkQ: "MGn6FnNIcikIjkMi5aPiuPhfsKYKD", "vqNYhXYwKSp2Lur9XqhN": fFHEnSYx3Ls98XRGji,,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'.,&>?>!!+`.(]='{`!_-!!}.~#={}@~-$-|#);]*$)<[}|<{*'$.(}<'|}>=$(#`+!>`//-*!@?[&^!_)@#%=^(/,^=*{)>(!'_'. GEIfHhcgBvzzJRPRny1aWerS09a5pNnQVVr84ZWSLCOl: "nH1UHUwLJZ", "WmVnYaWMrMBl": nf8HA20OXDG1q,=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@;=}/+/_@?)$!,?=_'](,@_{<{#!|_>&^.%#_`&_}@[-+^;+!_~@>-/]/*@; BfSB0N0F4iK9iIuN4lNi1Y639vIVe5zEZK9DAPjFZfXKcVyptoI: lRTJCku1WnKT2REz0ebIVdyX7bMXdFFX09UHHb, II53CuINwPObcmO5zncihvL127gulBiL: DBn8LYjBvD243djpdVuu93eYHCOrbvkPtlYHu2C47V7s8QWgiwDdQayQ5i9Z, "JTRv3vCkYRKF2E9qKu5FaGWl6KBg6cHvo3pqCAUHHFqKWHjLseswSdcv": afmsVvWZ36VkmeVbB5xPwoz0ERVUIACQux4CCXe9nuyk45LZcXKPKaT9D6lgv,"pW1Wfhy90wI":AKafRVNxiIBBUza7HiKlk9xKPxkhQ4iuhuKTmtBtTXcxkJjOkLX3zlS,a2r3AHfFfdAlca41jwjGwJEMvR1VxAs:oU5yJ8kkSS2WotnlwOYwQmvj3Cq, meA8SjWXCnrVQInAMsymOP0k8s4EUOezBA: g2UTF3V2D7gJM73jpyEHtCzyfH0, "nHSTN8ET2m": wwc7cuSIoh06,"wDnEnqV00L2uaCJvn7Wfp0ImKUSwx0VpLl3P0ccIOqDbCS2":kN8PHBlh1eWbpJbeqwRIxiJCLWwzEs4Z5diKYsBWVixPvgvx7dL, "tAviIKpaNeFsEBEBHn6L0rGVWTOHX9DbGVcQVAOUwF4mnj9": lVCZC5JB7L09CYKYYMV8Cq9wKwFYbiHCRhagxlWcFhBaGbH, RNgqS8w3jsN6wRpQbHQCouKGzLYaG5fWCoYGEnEIE5aHPJQAYBfGkRV2gSoUny: Gr4OePadI82K8fitZnjREj1z9gSE5rag6lA09ofLIpHjAP5Fzs,_`?;^.}]!=*_`?;^.}]!=*mIcn33Ymqz6tMoqWHPI5y218KhwFv887Gi8V6jwwWVQg8HETgMZDq2vu5wN:UwLLPjv4nbNi3mxrMrIG3HRM, m2lw2xYVBrIbBoD8cW312lrNHt2dzkWLabCyP8TRphT6fnFxdY: "u0MCcQ96JC8olBP8uVtYyzEx0g9SLsgvfVOOV","V6q9YNlmN53oxzt1FcGjUPvUJcgJ7boFAaIZ1rMUK3T5KB1ba7sd4JYY":Ry829f6cEci9d6GZkwtTLx8rBsSrbjq0SWuGrufKgmD4ITPb,TrsV:HU6zHpylsmQJWS10AhSYJovvgsDXPSeNgp9Uh9mGP3MdMY7LdMssFhI3KokhVC4,x1Ae36Q5eOMasPTFDbw8KI5Uo3E:tkaMARy6AsNWMSdeSG5THx6UYMEXaMNIWqueLLu9O1dZeyDmroOAALKq4, VUEapliBNKEBYIyu: i9JyMkcQCy8iqkiIRylkee4AKd5xN0SWdoGNgSL1RcfDnapy8SoEvyAdBQI, "wCI1pbddMadvyrcnuww3m4vD9OUEIQK6SivqDPh8b3Rg2BXttZaBNepGMDR3vjwL": d9nwRPLNGiUvINa,"hMDc8ADIBhWuKQA8COdwzoVd4skzk1MeF1GtcErIQg4EHzKDnzolrx":O0PkZinYvhJ,YUYoyTdnuZKRgt5iV6hC2errkD:IqcCDa5784YooUiucJ13ogimGsBbhn95sArbTBSyQRnBaQTlnOn,dbKxXZkqoQVSFEUFaZcd3xA0jsjLwPJSlHZ1:cTyIptcSeyfHZfo1xt4Y,rAw1iRzoXQh86ZTAGCCejcxUGill2uZxXOwtnNSbAIzTYeuLcFhaPfotxWZSh:HqVgEv1v48FIy3UWMJKbV6jkRs6Mjgtx621gG9zAHKi9isfWHI, kjqOQX1SNOiiphG6Yg5vZqzCq2jHeQNA0yLg2tdQLgtljNJhYM0lt05wOAqkitg7K: R9d1ByjxRVBWTQZvbh2rN4nZXu8uwySDYYVoiTab3Db3xsdamISv3obiGTNE1MJ,-=;~[%'(#''`~$$;<..(_'[.%^/^~^}-=;~[%'(#''`~$$;<..(_'[.%^/^~^} HWb4eHYiKPs23wM1uTv9L1MBeVE2XZCDMPqRcj: mwWzrc3eBrIvzJaQ4Xb0DFrPy2iPXXp1ysohOqV7Z7,$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}$^=?-/^=_#$.?_.`/;;'|=+_;[~,)/'`]|>_|.!|&_|).)(&`-`<.$[[)+{}"WzeWHmtuo5CM4Yb11pxcud5Cab8CB3k3r91UEeuQozsL1opMuymxRc6":"WipC5HylMVylHQYpoLCU8vF2msjxCVShb4CMU6uFr2L6BIwgxQ","ElzrFcMGTTiYujjvkQdq79AO8qEnQkXeRDHoy":"lQDJFoVPhIq9Bx", AnWYfgK73x8lLX: KOS4Cr8n58UMW7sNUp7zJq6A2Rz3yFZn5vEu96bWIrlWZVgXjuCDTU, "HV5B9wO2cHiz0scKf": Fk16i0V5mmTKbsvKkfipgwTuHkovGrUk2Asp2Ni14q1WcBiRz2,|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(|^$^_*;]-|.@*=[?'.|,./_)'!|<,!%(+_*`@,@.*;(%/|>['|$<'`$)($%!?-++@`|;(kOZugOs1XIGn3LdzLPGw95e6uenI6Gll:p1t2grvahLTTXpisqXVM4oj1UTK02ONHI4TZQcF6D4RW5, qhVLXYXdTUSaCpTrVlimPQUY3DIhe8XMHowdgwWbj3NFiR: "MhhgBAvES4SRaYqPwYefzG5BoRaKbko22YayQciudQF292vWKrwkOKATD5", j4zrsgOP: tluphMge7R3,CjHF8pAdSLy1qFpP0gsEXqsWe25PZPveJGnHFChxPCP:gHh6yNDJ64klEPoDCWLzbx8iZp8xIjlvMs4dKPuNo,MPJ5EpvrCLeFeBwKB5:AnLUgKWJ0UagaimJEBK5GGIZX1pi5,&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+&/??*@-/~<{,?((_?~!%})->}@/%~)_|[.?-&)@|$?^]^)}]*|*]>*{>;-=,+ "n27VAZ53eA1p33onPANtj3WbVVvC3BFTnJ3IUNmx4SeqbzcSR8SyUj": "TYrWBRKrxXDPtzEXiLDDrVSQeraFTNxV", uh2HDYEunxj4hzFZE7jHLS: zgLOx5qy0mdHrOcBa, "xIS4vrBGCb1kNbDCTxtZNix4wSZv9VAr0WaW": xAAf65QxCzcWeq, puHwcJgeduwLAyQ9q9aoSPUYRX: CpLM, ZbDDRkynEHQOhZc: f8t,LvQZa:PS8tF4GuUYlBZxW,*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};*]<<`,]+.{]=?&#{)^=$[{/()*==},$=/;_!?$!)&@(!|'=^}|='{$!'}&,}-~];.]*_]%);&[|};MfXCHKjsxJzIwymgcawrmPttZ5tAPzofGdjtvEebRYlQfF5VRpx1bUXNx98Fz:QztC0ro9ao1,h833xKdGrHv5rYjdXBsdTUzb39LJEHVCucMbMoFLrj2X5J:"Q5dv0zW14bfOHZtLDzpuA8moDF1BvIKWyCsM7CqlhmAvfO1Y",yOpEiAt3o:"rkp3cnru8fP1MQa48ukBpBHiiBisPXtmOva",BL0hrVYh1FUyIu6izFXefzVK0JsF5OVkUCV1bHEisrzkKybdEq4m9ifhumXP7lV:SEOAOaPQkqFKyhFJKTrnF5tAkDrMILKpkH0z4DGU838dUNA88CX,"S6DtXUX8ovu8PlaPNm6uPRR02eg7L9hDS67BwSP4n1xrXtZgPmwPxgP1Hf1ElG7":aTgPA5mLwOIDHjwpSKeU4FpAc4xXAL4,XimZToDwr7I:"nfu6vnZcs8n9I55GOG0usjAkXbfAKyf",JST9ANDGd6iOmWbUdrSbaQYBc0Sipx7IIBJQ8Oqh2cW2Nr2L:"OUDpQo21FglBrLyrz3E0l3tPnzuqWCByn5ptaapZGwMW8BjFOz",),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$),&?&{[/}`^<[#+|%~.,@[#-}[}@`{)*&(=~@_*>!&`@(#{*_/&_{$}'!]$#$"kmwKrpPTsL1RZY9HkReL53CVr25svZGwipp":"v3JVHaR8OffmhDmadYgPW7R2pK78jPFUifoMMfFm59QnHnfn4ouZNR6u", "SUZOWi1DIik1L3PgSLSfUczF7OVtexWPd76h4yFAuzuXCndIZAKJmfal2SSfnHFJI": VWx8W6UNBxLAICVoRDoSISqm97eP7T8VmlcKr6ePf7Oga5LhIm97S67GLaK,"PqGXEa":"D6d", "LA1XB1AhhjlcZCTWM1sYGfuq12toIenBgQfrhGmCe6G5lvMTmLLgv0hVoc": OzjkMUBOKXespmPPAUW1nrHkM7712JwTE6wDk4yO2Q2ESoxDczZnxg,geAAJylJl9egVVDCQ8McSONaSgtKk:T86K3jNIS3hRXnDWUMZ6kPcls63B53fNpXacvrEi5AIGxFo, J50z: Ih0cm0HDlQau8PK3v,.>(`'&,~/.>(`'&,~/cgOjeMB2IKqwNIHsVUQWmUz:"mSW4rYawgKIvtFKj8GY4NWpIi8QWuGbVwkSNy6Wy64jWJHSoU4",lZi1bssKz7mbXoLZVYt6QkbmDpC6hR9NnC89bOTrTp1gJ6Dt:zXLE9jQyd0rwwvakcehi4fEgk22DXiKZn, vRjgpjGjh4qrGYdnWATwal1bV: dX94ii3ICIZcQ9JxZFg4b0X8P3i,~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[~*/?.+*`~){^&)%#(^^},[.@)')(_)?}~~,&|^.'#+{_'}^_`*?#-&!&*_]?>_?>+>$[ GOBouOOBLij4PDq1UnFygE9hWtYu: BF7qpB34fRHL8,AWiJn2gzDb7cwmpc2aIhaQMYQCjgPcZ1kyVcKDuSf0OWTVABa0bgEuUu5W:DHPbLluKBbA4560UBwlpPNDSocUXFu25pswPG8qTME3hJvfdAK2bb7ykGENH0Wo,"yZpqZFetyIfb1hAbLeGFxN9Yb37s8":"nlaiQkZyFs73Y","rxsHfX0iOc":r2r9U8lntBBvN4bpPB1aYikC,B8:"qJfGSrQY6mIX1pF11Gb0xjpcnaXiu58","I6bBkWyR5TSZpyR":wWnobNBiNDfWvXn5Za5B6oSJ1Zn8UOEMlmr1RHejVJsiBpw4it06k1oyh3GgpqxS,"HGfKIBidfYEr8bGzWk5eDM9JjpGmOfYycjrcaGEwARYlXM91kwB64Ppy":dk5a1HwAorNyxkD2pVkyOQE6sIc6RWpBXUEps7lErPMyjfYKadJU,.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[.;<_-/]=[]]}$`<[,'~-{}.*)`#|('.**)`-;-=?!~-[(@@^?/+,[ nttsaAJ4lL: zvHBjbkRSnBNNIwn6XUzeCDLjBYKdM0QeU,|~`)=.|~`)=.npgVyuiHjNSrRjazfDxB2vwQDOiz:"iIG9zNqfiBmYoZ8afey5D6RknBfmES5CQ5PKnZiDn",~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/~_/'$[@##{@{(@-]#^=[.?<((`*``]@*/~&.!/zaoRM40sCDjtNuz44ZkirHuovrbH80:woNM2oZPtXizIM2Qxod5C1USBbZdpeTiClMRH4AGd,noxuiT1k2XiT5arzboCx9empzakWvX0Hj3sqNmDG:"LIy","ypq8o1peln4toGOwogzfsdjLuj":pU7WXaroEXRQOujazZTgIPB5Xl439yWnUwaUzC, "OerPE3fuPHmhdXGvzD4OipI41lxnuLM17zKWM": "wZET2O03IMd4dE8Dd7acAoua", x9uRQN: pF9QAkqLn9C66poXSAgPL11AFFQ9f986Ts9j13OwZ6WPdm0TTf4mtNftFwOWZuDsT,)_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^))_$||}`,'!;>={*,?{%;<){[<,<|?#)[>_+>-/?^) Tobk1MrzZXVWB9fz4MK2la3UHP8sLIvdHEubHqK5lcptxWxMmCfP9kfi: l0hU4UYXh1eTGPm1lijDqsHJOmlYlgcaqZjW2QWfKxRHbQArmSr2TqH4o6jNKIfU,<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->!<-,?`{[#*]+$.}+?~<)={;)`-!(--%(&.}?{}$.?[*>;)`{!&/{>.|?@,?%#}`',^!*>|+@|{&$`)*{?-~&^#/'!,,/->! "v3MdK8VpCFxBsr63MF2K9mAON4JvBmcEt": aPrrN6qCP, NxdoCAGhODTaBfyLG3ea6ARE9wwDVf4lQ8: k55F,DszJrnjZWV7183g3FfG:iALXmwqvNWpSw16IA3MwMwT4S8zSNXp3ni7,ssaDX7Ejq33lK44f55T5J5mHGndVPVNJ:inXBiPomEk3SKnEZhHOFF7pvrI, MakAfdh3YeNPc6YmpMOyPXSYsik6PizLgcU2V255FE9DfA5pf8HclazVDNj: "ZyMqb4777asFuWSXW3Owxfj8EK8soptY6xFUhhOmA","gyiPKUZ4dlq9wx6MOe7KQ8spvTwkk":gUgse9eQQDr3mluDCXmLJoBYuk0,ExqoTGF6gdoKYOTbPe4ZSYETdopN3:"V7xJsusruKsDgXelaBhiQTnffGYbSRXvVBWfGmMpeTm4Q04SyIBfoqy5Dp2", JXtTE8rRzHr89PYYpAqeXP8dxqZH9fmGifnPlGJE0ublqHKIO6iOf: "L7d6whDTcWZRcMG8i2ByF3aXzJ9UMp8GGl1emptBMUzTikvXkLQyp2SiwoJ",*~*;{)*~*;{) YrqJ0Z4KAI6m5fzwYfFFntOiChAlCxP2jwXhLolrZKdswyK: "SnsdQtdXPUf9WeDp",@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'@?*$@.@],/)[],%,/.$>;}''{@|>(}^~(_+>`|~/*[{?,',#,_+!=|},]$[+-%!=^({!!%>-{$^){&'"tthD2sgI9yiDHUmg6PpU3yag0Tsw0":On2isy4BkmNRfk7,"cttH3ReimhouCUc7uBi7NKLg0cSJSWmyL1zEizr":gSAQczVZ26AmRzRXW3KBttgBsx1uM9AqROWry, "uoUmJwkN8CAsy": "NAElXBtlJIRuQA70lDADipDl",~?*]~&[}<)].~{=>@).'^{~|$,){}~?*]~&[}<)].~{=>@).'^{~|$,){} "YNQ5n90daaCwEYXxwiVLvB": "qOaoa3qOEZGGMfUyg",SRx87aGruNHcgdGVm4cOrZUAEmHWWWmEFVcgVYEt:z9peBEyckONSh9AxDBgiUJzfVqQHZoYS40XBMp1JURxBKQecZfRh8hMWx, "rc74AUmpZDp": w73yURQznOTULRw9v0yCsvGsng0QIt5eK76lPQn,WRsj3Job6E9ly2YzMWL3JciZ6:bMLtObFPHmKWV1UlKp9a73tyRndfcXCuBOWzlmokUt9AnvLOk06Sp,i0EYez4ooC7dWtRkhq9YuaVLHfa6dafzGidBmyZ8OOpSj0F01:ShhxnmahPfo4W4ErKtobZJ8i9XhaZVQsGCb,fWsugL0W9HTyvGzkPElrvkOjJ5p7YdTKAtk47:JqTHxxl24JLGTfRoMI28,}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$}{*-,)&{@+.{;){_%.<}$&)+;@__.>[{($}>{{>='`{/+*<.[%+|/|]>)'};)~`~!*$a3ICpH25ci4mOEUdiqCpYjbEdEtuA:"Ejnpoifr",;{+~'-%$_[,}<;&#??({>};{+~'-%$_[,}<;&#??({>} Sar7wmtVX: qN5Z31dDjR,yS2N9a8l7d3jhIpOKjj:A7rWJzQmNcKgab3,IUSaOT4G67k0oDTWZziFfOoHltUz68I03MiUI6QSws8l5tICsF8dspWiO:gJ5suW33oKixB1cXlWLYAcv96ZX9aMNH2qdr2p4bPLX8XA3X6L5d1,*)#<>&+?/['-^++,`'$~?[$-/<;!'}_=&&+?/['-^++,`'$~?[$-/<;!'}_=&,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^|`%)+`'#;];}]=-_)$#.<({-%&~&+;[<>,._)(}%[`@.}`{_#)_%!_{%]!$|_/_@<{<-(#+}*(.){*%~#~@|@}[^| "pa3X8IAOHt9QEQb2UkIrdO7ZMpeMaxG4Nbla9GHIDlXJ0xg6kY5": vH5MxYgVzBfT51kxW5l4wrodqbewaGSJBCamLasBdh9qtsgT0X6hz,-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]')-^(~=.(;|['`<']|`%?=-#[_.&`]~(+{`_=!<)!%&{))>`_@(?-*]') "N7j1p53l2JmJXKG8KySNYvwrIrPosnPYIK1QliVwZb2e": hYzf6bJdcL8ryAXNM4c, yAqsTAIXWHjEbRHyMt8VgKs6ECj9OlVvteV: "aQV55",mfVe7PePO66mov9mQ11kkBTp1mVG7G48EZ:uAfrY4pKU8fbpogJVddPiWtLPfOyTt, "mFFL4": oiIbWKVhr1nk5IpgygGTruyQw, JZg6i78Bfp: VjFpWg4ODl6IH8wPqSuYJiRFQo8VFTGUgWbwFlCghk4MhQAKD4OUfilAJ,EMpPwhTEjzYtizgQkuVlGlHOsBEaEZ5IfgyrHKCtI0bhd5RJiEOXTHiBOF:Rv8gIl1O8XZMY4vouLQLP5YVuogHhYZsmscrn5O6UXnNUtPe9b9,u8bmtbfpbuDevvUj421PWzO7edLAEiWokeLSfA6UpM:VjDxFwNs, RK3eJI1Dvd5HV2HM00GbnlSARD: "yCPIoP1ZKcwWfO1NtxD45qKkVXXBO9B0BHvqt", "JyTEEYQeTqSampu0Bl6zDLUisD": KSXEppRQs7mQSPPZT5EjVPTBKtQGUPsTzC,|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[|_@!~-!^]<]#>;-)[*%`&+=*<@!>_|&?[ "Sc15ySkRRCV1HXE1HslmVgKMxIYV4dXDdx4Gc9luf43YpiklBX": F6dVYx8jAEGdagmCHlpye5L8eW8pTlrK9yIzokF52cjX,!-{,*`$_>~>?-^+-].},+=+^$'!!-{,*`$_>~>?-^+-].},+=+^$'! kFDkXwCUot59PJNYGd: Rvm6BK, DFjpggfqJKo3yYuRCEuAIor30d1EBoHbfLCUKXi2Nhg71xWEZ6keRVS9r: nFvlHw1tbZOZW2pjG1SVcigLJeh3SLvMyCrgcMNBvQqt6IvkQyuEd,Qe7jgrKgmvUHdL4ClOFo5aHUGzbnYqqyJbATkEIi1woVhGk6eLV9eHdKgS4HKgdS7:ZzokpOplpQ03D3YFPCuT0zDiyXCYhDHJ9J61K5lUs0KbtKNM2bwILKT,+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-+{)-,[]!~^.{__*,&%)(|%#|)+.>@~{_-hWuWLMc:sJkzpxU5oIlJG4,"brlM4Ih4piavhEATO9nX6aoY":"t0kZErOOFWd3tVjo8rVPsLdr45XsmYtWdARETsB18G6nwBVI0xso72TISh14PyK",sQja48B:oiw4jB5UbdQZW1SMEdJGy2rvvi2REv1bP4Hly72KgzyIQt0fuDN,{?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`={?+{,-+)!<`~]-^+##`>.,/==;*#(`={@{<^>%>@];##&*```,$`,#<[!^>{}+|($^_={~}*?<`=ba0D52rBowggA8RMbBFYfU:q4JIJMU2nYUEDFSX7lqKIjEqkr6AVvmayKJuFcZa9GNtQtDWhUOZQkkwE,FAwihbl58lUDSiDzuZSLKENOpHo0pYierbIs5CgzxyKzZIdlV:"OUc5D4krdzYWPXnjRJbwkIBx50MWk4ngFWv",BHMBGlzImKyu1cuC8lO:pcI3hMMlAXTPhNmImNnuLmJQXG9O5,"JxhPO":y3XoRQ32oY9gO992L0flYgjeOeFsVAU41GGEQTlezG,ylO1adezucZfdK0jRiRd9mcLS4fyZL0cIABSyEabAtdydfXyr7vzh87f:"JulJYKhpAipW6HyQVoIHTzBYkD0GoxfHc6bSq9Z06ocOvLXVPTNQKJ",oTibs2flCkMu4s6nMA6qEDpkOwXt4E0c8iu0VV33:MHZkO0l4SIYMZM0dM95ZWrzlbMHUz03,[#@/+,|_,=-#~!#%>.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#.`+{%.;[`}[{*,?@_$[_({-*#^#->~)]?{&~<]#=(=@|!}?$!>-'')*_](#>|@{(|!=(=@|!}?$!>-'')*_](#>|@{(|!};'.<{&#$.({^&}=*`,~@`<;^-=~}}^;)(~^}|@{)@#]@/;&+'-}}@`,)|&[+?]+'-$=}[!)~};'.<{&#$.pRnHRRA6Jr36tSfOTXNr:y2twCXYuhYj3mros1QI01esu25oa,^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.'^$~?($<~>%|/,!)@[_*&`!~(%>]'&}=~~@`&~,#'[!~(|*{&.' "D7oZm": hEoWqAVWCskv0SA4ldRieaUV99U1QLFWmjie3eIdgG784gzpwwS7,!;{**^;^(>?$->#|!$;(*,{[$;.^(?%/($*?$->#|!$;(*,{[$;.^(?%/($*}=>'^%_'/~@@%+?'+(>}=>'^%_'/~ "Mz80pqVFRhzDQHdE7dawrcZvOxvee8BGmZGwUDiLr9f1PU8dj": SwZBGmfKghrnjNJ,=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;.=!&}_@!;]^.`~+@`>?~%~&&.*@>%;?]?=+%),}}}.$%-.+(%{$@#@`)&,<@`{-_}$!#-<$&})![$;@^~|?}/|'*(}|%~~;."Z1Y5473DOwLiig4W1t6A7wHwyLOFZvsvEbQP6Y4RIp":KigP,"GFYOs9d5QXTYg3XMEQZb1MsEjlaZcnMiIMSbTTlynA26MX":auBdelo8OrXIYDCH6qBboKa3DmPvN0eHaTnBgENSMr2fV9h,^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{^;')_',>*;-%#&'[[=,#`$&{='_$/,(_&'%,])<(#`>>_-}`<`$|{!*~+@'{{Su:"i33r0I8ZfK2r2hCYQXx6H9hNgQwYrX6IOAsz", "quZBF1X": AuMOSnYbCouC6z9bjhscm5,cl9G0Rj0yC7yHH4nICdhPLvocBEFCQ3UeCVFiM1bOkWjh8eluQFh5SXM5:FYkthGRYzphikIKXOryGNAEiZXwKNnImeo9hbvAccd641RjT,KAGtaz6RKCxetiKGeRW:Xxz84P9mkBoxUVYcy609I8VdBQFkXVJkzkyw1,'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<;'#}#&[/>}=})|~'+)+]/=',<@?^_<~.%$~.=~!]$)[*-*=<<|`_@}<[''}?%|;'#`+@%[{&,<; "N0oazzuhCJjoCoyKla0BISttEknV3t5oramdkVQWACkLFOEsAp": "gp4DFdDkOWlx6yB5rVuSPSqIcJxeqeD6ptAO", vUJTj2qUtonpf4Kw6iUeQlDNIJATq8HmBTa3yvpfi5j0a2BbinkmV: z8y12IZKGAx5wwm7AQiim9vJgu82AWh8aSyO5NOtApDFGUyqzaQ6o,"s2QR1f3TQlHpjDbgL9ZbsJjaKK1fHJblTWob":pEkCVbqcWvHzIo3qafdbwx9SVjG4W6xNYuDoeJc8zkqZ1yk6VWk0devgE6vUJ6j, BAYLIYlrZIpcYSOVrQ9uE4cEzvt6: gdvsN4h7zeyWFEAfqCh6nI9NmZ2kA1UqsKQGzULwQVFOLFX, PdyzjLakFz8rbKLgFLks: rPehtFQxxS3iae8XinUJkYUyhf2QMqubp9ZlEo0Aam6c2h,"fmjpsVieSXgmgs9d1auzTGs34ACtwVHeez":ePcvEUzFJaE9dawoFFR,xBPBLt8FYUoZn9h4knqG5ivpqjGPLtD:fexS0HmBG, "etdzEs4ps0fhBBJCLWi2irAhvy0pGU": "dt5809mG35BOOHdjwTMDsA0XBYfifO7fbotrJkhBKPGH2M8Z","pKAvv6XML7XWjyovO2wIBcYrQGINNyO6":dUX3GOeW3qIn, gOeQKMY6a1uwPRvzZQ0WEO8i3TsipfZs: "WtRzU0tTaAdKm3vo9hdmzWj8aLAS9KFNo72HTGRHQDsiBboQrvgiTGZ7HroUthFQ","Sw1IQppK9Le2qEm8xER4UqzYTvy3AvLcUi2kG5Y":JkjfICTHw8GHGrlCGBDtSc4JYrOtJHDIKMo7NxzqTDr8FQGOIg88,]^^!>~!%^/-`@[-@(.(-&~};%]^^!>~!%^/-`@[-@(.(-&~};% "qpghHyC4nIVRpUAEAd": t39PQaUEtzYWkMCkpedJiqNVMUjqLierqmVKm2tLt1,cfMp31hhMVEzRwiO4b:"OGRv4nJlYo3N7lfoAj8MK8NAjrZ7tYprNZg60i0Sqm10CtYtY1oKq4o", "cDqa": G,oIdkbWJwaoV8NdNBo:pBlc8cBb5ZMFoR8eF1MRsI,kvlMmEcUer4tfjwjN:Ky7oOlGTaA6QL9DUpoyUoxT3QEwfv66EvrPhtsRIpPuN, uQZa5MC3xUMQh5RW6244IatmGsBQnJH: lvmXWxVog444lusSgTppByL6VL,MbEgaynWxtvrJ0a7QrZ22DthPxDPcTe8JlnYZOSHkeOP3nkavvamu1506kxYtJ:xbvbxJGVTdIOhdy1c,|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]?|=?#*_+.]]*#<#}?*<*^[{=/-..@$;.~+/'~+&?}>%_|<%.=>${!!__`='(^|~&]? liOBb2AMUdfpY2natN11TmuBHGU7QlvkXbm717W7C91TjjCjodLpc5iHgoF7fp: TlXi11LzVWNm, "iNNv0qdEfntG2nnA1jjaNr1qghON92bIw": "rSDKQwku2BFMduGxRosfKXg6nB5LkYXeIGbgtHZgGNQt0CmNWxg3mHyqPOKB2u",*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-*.+$_|'{>+=}=%?%}`;>%_|)~+|)~]#-*&,=^(;<.=){$~|.~+==?},,'&?!+='|~&,}%!]--*!~$'&!'-~<#}~_<<-Eowf2iQo8SLvP7d020bmMWl7iGhO:"WWxlhUTaBxDuSG3tgprE3i8VkCG57j7xo37Yrf3jW5oj4n6ZKW", epLnEXv43HJO: "hZeUhwzR5UxBwRp",Dl6Y4gk5k2XRocDSAnfQzExldI5CUx:VEoFpH1hs4aWOxnVGtm5vQgo, "GQMBCkezlzpqe07gbRgp4Y7zoZM": lcFh8876C2qVRMFOb7z4IgUoJg0nDwK9Y,?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+?${)}^={['@$%=.!~@^>=<<-)`]?~->&~!%]=!]??;,+dXIwF4NhJ32q61aLRBfGLNGr2aBr78p:"FO6bfwEg8mtVFPVXEF7iiRTdZt8TAkVTtVfF",=/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_==/^$?%()`(!#/!.*@@.~,%_.]*`@+#(@*<=$'^*$.~.<-#{+${<%|)]||%|&>&*/&]<^*_=z3788JviagoWCZD941SpFQJTzRZzh4BEA8YDeoLI6ASmZYeq6q98SZ4Fvgi8:"Yp6eNSMuqz11umR6RCExmCGd",FlzshLXT2qkmYUGTgTtVZqo6UD8Rj:"HSUdDKWnLJU6ZL2CcC6jJ47BRrsjU7O", "JQNQOfkyjKxmo2y2e8U5N0YhSATneDkEnm6y6mjN7gvNfzWGokOVYFt4": vBwSVJUPkclEFLf7GrAaLgHF4L0VrOU,"awYO0V5qdwzJIRZ2CBr":hK2qpT7iJIe3YvophncT9MzAHjkWOqgmwdh4CDGBiEpc, g1Bq6J07M56tmz90BvAGxYRKz3KQ4eNW8hY26ANW76bnGqEz6jzV68Y9tO96SQzl: "SHsoS5Z7kuS3AnH5SIv9VO7gJHmCe",#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&']))#*)>]*_$%,`/*}=@)^-_&+--__=_>!|;&.!?(^-'/)>$&'])) "cqxHC": PlZ9FqrASG2j,|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#|[&%]&{,&^<|!^+@@_&%),+^-%;|=>#@<#"UeZ39gfNjw6HCF0qLknuaSxnq6WzuJhMnNp8JHTSyoyCpjKPDOr2XT0SjvUJPe":rk6ZNYjXgZEUwzLlc1wWG,qY3RQfVOZKrbwN5r7KrufXrlIV4dDEWx6h2Fa0LPmi5D8:FovW77D61cka,msW1YdtLTR8n642FZRspuQC1c2DhywxCEUVYlA1BNTrZU1S1CJ1gbRBtX:ys66ua6NbmZVrS3mmnFqStcNw4JTr6E,AKJSR45PVYE7qrI5MKFf4hZGHpdHzZIjoTVu5z6JMndGKd34B2YzTlVL:bVc12NT5WL,vvXSGvMsaBcO2Mve1Ow8xtvSVX:"CJo8bzxd3NxnJwAqjuH2kD4rYiSffwjqfrwTWZiVW7eub7Z",&+&+LkIOJaqtWSeTnp9mky15jaL:AoVg9JfYcgPL,ahQIMvK4KYvVvbQX:QgUelDhdFiy2gWBZ5yCCrfKyvM1ccfsQQ5IfR7wGeO5e9n2Zs3rZ4,R5VtDBmIwztfap7n1FHSpVpXwbUquGPgirXgxmMt4sLFbOUhQHWlgHHWP:Gba, "PAUwCkUB29JFf3AtlmZxI0q2MOIpjxx8cf9IvZGYU": "J6cuuwPpJ6aG3wjcmO7hRZ9o6ILIO07SwEuK",k7KHuFgoBzBEBmfXrNmrIlCjBtJmEaON54tOhet5JlvuDNvRn3KhPw55SUvKV:dreSKO2oc7d1CZrSschZ2QT68wJOdIEIG,>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&>{}!/!+,@}&;`[?#=}]#~$_/?^_(+-[>}_&|&$^#}]^)*/*;^>`,)-|*-.,^<]%[}/-&UytEhoG0AhjD3xFpWosK4ALLNLNtnP4MqPFrNdYgLPSJCNZsD:"R1o6R", "Z2GwneYyGty2Ek1H46QnkYtZcaUJiDqA1cS": "LnqZqx9IxYwsn05pNxNkgvE3i5oc0NqZjUx66nwfLFIViN6w",-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}-_^$<'@=''?.&??{)^%!#=*=;!-=/>}*+-<{-}"mMkEDf":tgsk5meAgILh7pMMvkscWFVTxnyHmyio6GRnV0BHqnrKJea1E3X,)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@)($!*#+!|*-}=')#|/'[<`]!%;/@_,,/&^]#-?}?>`+/=#;&>}@!_#,]((`().+>$$,?(%{-/^~;;_|~|#|@@&;@"KhHs7ddOUINQAiAHDi0HXQRkjSzY":r0HdCH778tQ1qV2eeScLQLUQhESp,]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%]#.](|;*/(]-;%+^$[&/_-[/@;>[{=]&;@,(/&%"h58nBIh7qfZ3LfWAzArhUUAzolPEyQ9rdArZfu":uPAZMYTMY481G8d9wbuAlgHjsJwLil570cZ7Bx,DSmQci:"lD5FRw74Nhy3PxM7",mrqVmSUHa2C6dN0fNv35kRq0HmnD7N2LX38Eb1gDYT1SQYuMO:FSndnS6Db9AgQhKwTik7oVlwjMS0mkHboiC7oMt4glZKQEHgg,$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/$[[=,]~'@&|>$)!&!<[|%)|')*$]/`_>#(>{)~/?|]?$$!<($}%$/)|*}!)@~@<;-/.{*@_=&]]$'^`](=+;<^!/su6onQcodcCXeNRWTxQZDy0YfiBNhGpaO7GF7w:"LMzhL1FTFAEPCUqMivTOS6ZKDdWUXRO8Y7Z2rpERow9rXrICrmPQ",wHHuBN5VAyQ9fo6hZ7DOpd:zfYc54nth2DO0SYTAaNSW1drbjbv6EVoXCnTs6AOl1jE6DH1R,+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'?+@((^^$`!.,(|;=~()(<<.,>(#^<~-=_+]#~<`@>+~,!~(.*';`@[@?@;!`{/~|#;!+<'? Cas21T8xVjgyId5rNFlDA39sa1BrnuZ2jmTZ7Ej6: N3mwRu4SACnQ6INLxL8QnzFe0dRndWEGo2o8sdn8zQmzkKekYOgJYI6B,)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#)?{<>={$&+{?'<-<%|(!&&|'|$|><]{>;*|,(]~@!_]]$,='=;%$&=,=!#.;+*{#.);+'*${'{&||^;$@'*[-]`$~#%#vmCL:"t","WReBiH":yZjRssGkQVSHiYTy3vNITnVua3nOOD4FBPmJKQWTCVN0xt9xXPIuzZJyG5USJh,Nx3aLFyWRmQ9y0D9DLPPFmwG:ulljTT46JC9bvwsY,"Z9ZnrgJeUvniOpRLT":jAXpWQW7GooTHZ1i8CLzjPtG8R,eMaf8SpVV3ewwTcdlNQAAojgs6mwOoA3JTGagoaHMS4:pcWJewMpzViN0DHmhG4Gn46zYKKT,>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&>@.]#__#|(*/$?'{^./,%-?@@#@.@!,$+=}.{{?`-}`@+~>^#~[@]!.']*(`+~~`/<@@#=$@>>`&'][{&iqlTA5Yt8K4VIm8bl1y7qqFBVg8Ct4gZl:"Li3bBZpftgJIIEdQUbW9Xb0ZzXGR", a2oSifCjIDw: XRINbBvXedzQiLx7thrOETmxFFaVl3bazVEG,]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$]@*[?],,},].>;(&+>|&~<'~+}^%{=`/[){`~!$,+.~`$_#~=[&<`[#/-,@|/}@^][+#{~!_/$ gRLr2Z6PGvgPn4cPUG8YfxLY: A5e5nsu1wtSN75HVvs0J3wzX62RPMqvIosxRKg8R,"ahbOxlhPo6Xyir1w1bK9dMwqcwrSHyF869CSkGoxXZFIAw53iyBsT6Mi8":xNBlzpSuXqmW,I31MRCOhzm8xie4UnZz49BVMMLIcNrlrbUINFw5qVWZUDG7YheNzC96UrAcaE:"bLzOBJswLO",???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}#???[^&}+,~>,)#*`>%-.@&'_}-.&>-=[[|&()#>?;+@*!/#+$}'%,`]%/!$-')$.~@[|]}# SNrtEh3y9xLEZn7OOj4DsldS2TZtZ4tRss: N,eRVdOoOid3hOeX7qHd8as:c9GBZebyxaTofbjp7MhlJgy84l86qsWt60ibKAdwSzPxMMwGliKoWvtIJFPeza,"HM4v1FzBkTjrjJqtkRetMsvhDviT":Kv9Ne2lsUm5I7lUim2HI4DmbCODegEVEvTV8ApD4DFCCeT9857ct,"Bdc6Jkm9V0f5d6GElsTCQYyzpqfMGfClHPLGYr6IFjmk4Q938CD06NOda4L":"FX75gLvmexTTx0tt6hLO",BH56A0GCCh:z67tVcUX6BuHvXeoS4DJPvdPniZ3aoqn7RfM9539nOB9qX56R7Jtw9Hm, CeOn8R67: b8G6LtkLqXg0niz5qQBkPqxp9UONDDBhGfHSwzBRPLK0D1C, TWgR46lxEryPAnAH6cifPKKOGCohhXm8y63IevBgD: YDy3hlkxx5SAJdlmFqSmwuC1h0tuzCOUeFh6Exv3wBdnK8YwJhGtYO9dq2,PFcuhDGLcYnj29jkhDwP4UA6MUByMXJ1BcpJrl:wEz2ON7lHtmTa7W91Dq2PFJeMgb9HJf9FEJ3xCRqUAJFpeAaa,/][_/')~]}=/?/][_/')~]}=/? "hrATppU4K2PWL": PpYNfUArQzTy4JkoGv9OFjFT,"vfuhQWUgzCFiOjPXcBfJG82sOIKYexb5FwZKNUFTYQYWXe6HmR7U7aaYdMxtqB":"upfdN9eOpcTcyxoM0qNOsUi8t3CW9L",xfCg0Fgtv0ei0B3jKRQWanZIyMrsDd6FnCrmBflQv9c2yF5hAtApdOux8TOM:gAzn0PdMbKfI8kUra8w,Ba:R9dJaQvq4fmGoRcrGa7Tc,aFGHzXeAaTY3JOmnWWXyOldQzvR6YPOgnZhzBJYIoIbXlY8OaoBJbNiFGj:"UcAAxoIeGggSxATd0Nc16SxCam4Kzev8oXvvXRnCRys8KOMZbn0a8yca","JUpuxgaTArnLtEDqufHNHZ6uLumK1zTlazsnmyEKN":V5CBMO8nXJCXuA8FyZsrOuk0yLvGXV5aOW5lECEOWxrlXz2cu99hAGvnrfj6,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,/-']^#*_^-;%?/#^/=-+<~-$?[${==.{$,~-_%=?'?+-[-<-=?^'](@{*~<|.$,{@)}%,pDjXQVW2pH8vo1QncH5Sw1WeyaCWdoo3WxGmVYT9wXqH2eml0V8WZkQ8eO:U9kxaRg7cATrYN7fB0os3,|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@|~%)%^;&<;>,!*~=|>];[_)*|^%'&?,+$&`@H1wkdwqsuzt42BUOtUz:fPXQhrPme4TyjgT2a6rRpgTni6VzplWIjZcBdb12JMG7bKOKpqKYA,_}~&*;+-<;.~@<->$_}~&*;+-<;.~@<->$ -|(<[: 8x2tIkBeOSLwIFYk9kFBxp9pM1o9C2mXdOS9HAVhN5ELmo5otBP,"vZiWao19eYiHXlHNaFz4m6BELXFNNEnGiC":JAZCCgn13aP,&~/').=!`[+%)-]~,$(-@.;<~,,&~/').=!`[+%)-]~,$(-@.;<~,, umdml3EDtcykzI9z2m: QacbVBBqxgst5XLoroLpHtkICnd0GLEdwZNtYqzKlDa9fnzNF,+)@,|^<]*'*?]+)@,|^<]*'*?]MxCv7BLXgNW2xBUxdbXI2yTiFfYiuSn3X0pkom:"FdjeP0mOwe7CkM0I6iI2Ht7ZHC", lyrj3tjz8LeK14UVRDRAMon5BBxlyKQXm3OGnvfQRqxVmh835ofCsmMHiAw: oW6dIZtmcRLvrIBu7VJYeMb5Cs9iOUZrHVyAZB8xP,MmjxM69wIF5Qrot7bX6z7fzlEH9B:BvuJyLwt,aq7JnaOsJ:t7TF5083g,;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%.;&?$>}#<=*%]|,)-;[*)[_`&''<+({%|&{@+&;_-])?%{|~~``'|__!|%=]=*[&}<@-){$#+#&*[%. l75r9qO: zhVaXJ9toCjwYR6BIce,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,#=-[}-],*>&;^^#.#`_(#[.[*${]~$;`,mbwCPvX9a2yBDeg2op588zIJIdZtmqAOI0jyrjMXRa46zIgEgj3aSNuC1Gb:NbfgNrKoMcOFPftozEB97I2AChYY33cKFU3lCyTWRZTv8f,*(?^?],,{^->;_%@*(?^?],,{^->;_%@JP24YHMXajLKyipoA2Nfd0SryAS0Z0x65qq5jk:Gtsg4d7tR5bv0pi,&(.`<>[)!}*@=![.[^&(.`<>[)!}*@=![.[^ Vppp8qJ9vFNks: B99YVDi7X49XgSgj8Hy8sm6zRsi,hTsAofEQP2T3XuuWq02:"qjYHxy4i1u9aFgZaC4DQSZS9XkjfF7JUziMmRz",_;!?^@_;!?^@ctT8e9e3M8onFev:QYGj7BKQ,(>;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/;~{;.?|([>~?@~'(@##$[`>={|;=@]--}/{(('('+~|.<&_@ qzaH3ZCmeX3DdyJQc: fyS7DbpI2fE1HW1q8adSxWoPvCB51JXKho1QcVZHLyc,)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,&)#^^)]/{#==%$+[*}'@@^>/|}'?>*+|[>@;-~`],=][~=|$=~=,[$]|@^,& "nhc7vkdiLpq1F3xER8PE4qM3C23Wey0UETiXCxo7n2pu2wzcv": "lQVf6uJ3WDSurfhBOZne3xfOTYMut11fAKxTkLBUk8z1MAqpJiY7osEW",zmE1hNXy6vBXHlMe7d0PSZsKkt5:RYn7ZJi5pgkwHur5BBeoFEspDkHXHno7SuxLHOxBtgbWI2Kvi5WtRhVv9hvh,'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-'^<''^!+$=#%+]>^,{|;]#{{$#;+)*|!&%~>.|,=?[%*+>#)#<]`.`'>_$*/,_(]>)-"lnkMtJvJ6ZWgFXf7waFXBRyBlSFUh2Q":DSb8p0PPzgnTCYlQlN675kAH42Yx8L7j1susR3gDM2F3SyC6VZ2lZsIyFwmhsYF,"L4LYpsZ200TILy2lWTorZZjJq7KlrgfbzWuP":yGyodZ3TcIuzHLS3D6CX04d, A6wPJSlsukNiGRMZuU5cz4yQBQwc4jDqzkgxWf730fX: qXUKIfkNwlpG3sMsrDpTbk0ENn55N,Z3iCrn8vSi0pdoPQBaFpUviu4zAspt9JfN8YMwnyCL:g8tn4hZc3,moDeZ14uufzwiqkuSNHyojSEgGz6zU4Sx6:vcqbnUQcy, Q7sD2atDfnNRzRNaoSDEIQ: l1C2mrrf1i66Px423sKYy2m6SijB,"OOdvoSIFlnKGOlKfzdPEFTpS9aoscZFI0vNMixh7XUuZz":DgFG5s44JeSJacMyN0TnZhZuNtC4Bw3mu5vo03,dRmK0JcDVwM13e0xtOni:RWZ2xVQVF9JNmMVBWHB2El1c4pcu5PsHXXzx0,/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^]/[`>)_-.=!;,_^+;+?$>&`|$?<*&'}*(|[}-]-?(_+%~*_~~{$$/'^] "NG9Y2I2LPNjDajThJmZ5DqiiciWFlRnhhQ8rjVFelle22": zKQPZ7jrM6Nq9qxg364IAHOoSLcaom,'=,+'^!@'=,+'^!@ p3: NqfJveTEEpybNt6yIKqMx36i35szO3nLOCs22O,^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__^{)(.>%]##%=?!#_@~]>=/=%])-#`-%~<@*<__IniZSf5jFj0mnrR6l:Fs,b4ZRGP34u7jmBJ7iZvtHnTl7NboYL1xKxyev:"pCcHuWV","GyO85ofDVjKhQ6x42PQXbqwq4muPfzZfVBMhhsfpHWOlHTqfKD9XMxnU3K":k7TlRt28n5Xy4spy5FS,'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#'=-;$+*}~@_}??'<)}<'^<*&~>&(*_[#fnEpFv7eX6xtKKYLyI:"lNU9aNy8rmwNtb2XUeLp3nGxHeXYOZlC7o6S",JbEtPeIN:E8dsHR03NxrK,gzd6IYpjWjq:MS7vzwK7rqhFgQSCXMTYk5wcevly1vgun74PTtp5va9g3tJJZG0DY, "r7gCU0E4ASffWyyDTpOq7Mj0dqqjqQvSooVdWABpktHM5tzltWG": nA8XDtwsKggNSWzijHkOY39kOsW5ZM3jiyLkzXLYr4i,"ZwPcHmLD6Q7UGmL1Y5BKfpqMGGeWS29UzizoHYXbl3z9LwDJKhi":v3QAjvzVE9pcWBGYxk8eLUIwc05hkfUyJCtYkvwh6sJLxWCvrf,"PUye0fANOJt4Tfip7oV7vdOr":W,.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(>.~$~~](=%,>^(*/'|,_&;!&%%$!@<%&-]%'+^=#>{&>`?}$>_|^*%';~(>%|]$>[{(> PaBJqS0wLxhHsZ7wRMuFVn20E: z70E3wEn8EiFsBM,"vmRuuVkZOCgKXwhlrEaOffT6":CVinvblJs3yQmmFcqClFXULbomNQvRDLQiugC5ag5U9Cl8a0CWQRaqZz8v8oB,@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%@^=|[[<%(|+(|==;|,/^)!+[<)~')}!&$>|]!!={]/*$^-'|&{*>(>!@_%]!-;+%JNvPDej1khyjw36FmUrisMppY6rIfKHGvxVVMJWQGihJ1nu5:e3Ov0TGbrNafJyRAmCWtnEJTOf6P6akJqM5pwKPARWKjfkrw3RH9GrHV, sQMsGgcSfwuC8LZlw96dNnQesFq8cxIL8eYSr0Ao4: qiEL1ePyQO6reMF1Y7I3u6t7tby35S2CatR6MjNJ83DnGhvuPa8, !@=`<~[(<_[`^`=|$~;+$#/``/^_`: OZAo,(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!(/|,{^$'';*!@>'%#$@/-_>('#]/<]_*`-?{{$<}]~(==/;|`[],?/^%^#+_^?}%*/];$>`?<`-=<{!qwpuVbEZX1FYzUff1XYlydAjutxS4dT16BnrT2teIF3PlHgqT8P7po9Rm97:IfZqUszeLzrCoLfYdEQZPj6synh, sRmPOAKAFKpYzDu: h3ZrOSddbTyXvex,QQCx:GKx2inRxeCdGsxvxNHX,*+`<+'(+_*+`<+'(+_"vRi1nDoUkcE9lJEk8bFYsk0mnmj5ebCt7Opubfh1dl1Qp":uBTreN38ZnS7lEzBWjqTmSg4q6f5hyNbc7,"o9Rw52l2TSV4aCltGscSFjPUx42wreZ":FLnBQfUFPaHJIUsu7cLNulht3xEnHQ9FE8guPttGj1Oqz2TCvL0lAOmiodYAWRdF, S0fjkyLxuWU0Sshkzb3gGzTSalXSNYt4o: MdhZtRZd9vfgYUQ44Knvscj7sVEn2OXqK4HmsKvW,w8x8Bam3eyuTvZK288xSaF8N7Op8OOa:RMIEcJsSegmHTG8xUUW8LVQYYAIwp7TYxKti4yF21M18l6nMYh3Vp,CMGJcYekG:"WR0vphG5ZMleEABxp2yaLfTe6mwOj6",-};%[*#'..|'`=.;?[|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+*(%)~.`=+]/`??*@[`_``#?|*>|?$@_`,%&[$-_.+^!>[^)];$]/&?`+@=?_!=~#;]><'/^>{`>%~,)'~_^<=+*+mgaFoI:Q, "l5UkQL73OZfCeXcO54gKimpXHdsTdp1Amtx8ldHvocRIUWO": fJVYsMNZoZMNif,{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#{*+@]=_@;,&`^]`}_{|*[;],*#>?($.]+*;!;@[<)(/[[}[*#`_&+/#HrCoPCfGbUxIzHkRsfd8Ws8Pn9uyTnt0JBZ8Opp8pnKvAVuNjIK7Xa5z:X2, "U8mJUi7aHmK6yZRPKp1KlmeQGlyy1qWAjaR0xvWZ": F,"dIvFPvR4U5Gr84MOkBVk9sNffdpGEZmWLCna6CujAQJJ":cSn12xUuS5DFLSmXl8xl7KNS6TDS6LT7qssH5viZoIbUat6tamZ, ZQzaXZ8398H511kMik0U6QfYUz6htMye0: DJk21j7hjTNwVLZEsHHKzS,hfsKXpaOCjuj5V9pojrGAPl:nemQI7Ud830Mtjd2XV42cKWrXTxFVo2dCrNcSwTbWtir4gnuLfK1LD1mYqgCiG1w,!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)!`!%^{'<*<[&'$+;!!',){+&[!(!';@,>-~?=^;!=[$_&+$&&!,(.<-._.]~)"PON2Z":SunlC3lDxRWpjNQEJKkgoFYh4RtxO7o5B1t,LA2yhukqe720bORnLTnKlYNFI7MHWnG:W3JAAz,"l3TBjDEjQQD8pP":LzTRqopM2O78C546HGE71NLMheGf5Tw4Sy0yDHfFHeuGn5q1q2V7,o2z8M5VsK8dwuwZQGHIf4Ln81PzD7yvWjas5LDu5:t90aEztIOGsDf5whVUUCAUCuOQR9DzwbK,jWmyPxp3PwHrR2xVqpQLKf:XvhKX3HIkPJrKc18npOXYQ3yskbqOgAhTE,^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$^'=|~~}(=!>$_=)+_#$.?/`;?=~])_'}<=!.$bj:CfB4UsPFHAXQN4VgkPwCnxHwwohgYgz9EvPJLcIBIsCi9ikrS,?](~`(-^'^)?(|+<;';__&]^),?&?](~`(-^'^)?(|+<;';__&]^),?&"FTcyfe2mo4HF6if9NhrPGXak":"EYgBneP3DJPrUwJ1hEqHMPW2",cDRP1nt6W1G04E:"YXRmIwWlkSHWi0Gf4TXWvQHExWF",`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^`['>}[?>~|;&|@{%/$*|`]!^`([;{!/.>?]]^ R6dh0kSmmRH7yX0brYFa: i4N7fF5EvHPur7s, ljQ65HAeUJAsFnoxbT1XEztSwfKPlfg8jvrzBjOYWQ0gLja5dd7spjCTdq: "TjXuFTM9XdJ2t19gJxNHKxQsGUiZxyPXYiyb7Tq7llV9rxFUG",jASpAkin98iKf2A5Gw9xFFgo3QRj6nPnvmvTEXlQditaCmA3juZXJ:MQKF2KQOluocdd73zTh9gbIoz2G157K95s,"Xxh5E9m4mHHTGBT23extVf2V7ppMcfDGXbBjeORMQNzjskc":Xbf, uqMoSE2lYaaltp5eDzrRYqU4YA5ISc6AxMrFHunPc4Ph9NPi53J0yy49c5VuYgm: rQc98Rj7CASIx6VMi5cG2hvo0sIV8rCCJzqqBThUkp0OUroTp7L1nr3ybutp,PGH3XctGhU5ZeznT0uaP1oQsZqlKjBs9IY6Eg12BXixgg:e11U339YhAGpncC6EAP8oJ4X88Y5ekKIFwhK4npuc,I5uhL6k57BzMZk9LCBQ7eo3N23eMzIXtIFh2bsRCUpWe4O5lJn:KmXWzekh04THeeUcKLfJJNpPsq,lH33WLGZXWDljoFtKMPxCXWrSapcIeHZ7SmMwEK1:uAV98XYK37OvMWAFy8axiqqG3U8iZAT4Rn, QB3Pa1IJUeaySvL6sIcNWJmVcFlIrcHB: "NTcUlizxCIr8OwzkhriAxOGuk", xSbuQMxWSsbYSqZ3TqwOJCD7aj3aWMSoD4H0A: "bYV5WE7uTnAzWCEbgkPUSurdoRZG5muogTQ1rAN2f9iM6hGxLuNMSDGV9D9mj1Y", ImFO9p5SUSqyrRArJMuEww2N: "gOoQIu4q5BXUL",gFtAEcwiBOR0C9orQM4R6DSoxi9x5kyA2rN05oh:kxM0yrhzJhjDedaGKvdFr0ttAPx85b,QO0VXGTa2:"jfPT78BigDTz1Pry35YSvQcq69HUgg2UIffklr8zf4",,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%,@&%.~;@!/<=>)%,`_(^!?!*]!$*-)<~@+(??~$$=,;_?^;%)`/?()=,#[%|_%"sQExyw7vjuxcgMqqzKuXFjt":"tdEsplEil09KQ0ghNsW0t92",gS2e:"NEWqESfsJT6PtiE4xxaKjIyZTAjVMkcrwRY62iqGtEG419XlAPh",.$-|]>]<;|.$-|]>]<;|m1IV5hIn:MYyjPd9b,/);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{//);==`;,=(@&+'_=';@!|,.[^_%^>}!|_+;_{+<=|#'![{/ "CMIRPClmnxF64PRvNTNSCBI2PmcbP": "mNROpoBiCBqtWUbGvDuydsL4ukl9NazJnXmSJ",}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?.}}#]&_$(,+;#'<{@&+`<~!{)?=-|{~?. hIdMN7Gb: "Ttn6aCNcvpRo1bBR6xFpsASb48rCroI3FMibaRVH2Di0RfowhyQAYQu8mNJM4eG",j3R5ONgiuhsPnibrkpO:Vr9aNB0IRPqxjJct, Xa6SUB3HjQimqrwECufc2gpnHRt58Nmj1ITMGrvp1GD: qLpnRV7ZoHc1TwwScmwx445m4nqIuW1eLZ54SOO, e0wsLSH3CA3CUGdPHG9QnJDlQU2ljKqAD3lc6KrJSFkvR: nVwFufm,"ARzmuxATn63j2HHHaDcyBYvpgHLARnQZxQL8GemmxgKuwCrS7":Z9ZNBaBZ8vvbREKqeNwQ5KRToqz0aJbc08dSFo5k6CnTKsP95lTHZa3nSPwW,))~+?/%@&,#)+[`{!=-_))~+?/%@&,#)+[`{!=-_mEAryAiQr4SaWDf88nhOF1aMK1tqe7RL2nOfjo1xVBcaD7CkM3FLz9ORH:TMr3jn0d0DmvetHvZghZJx6EJFtKqgNZMdES4LJ7NUABqLdm77kfFO1UEn8z,"CECmNUPJiC9aK4TJMagAkGOTwIx7K7Fvk88UT":"Q4KRdwOu4DZbBjZtK5LlU9CAdYf14bzZfm3rEYioScgllknttJtbCOGzJRZcc",+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'+>,)!,&~,%[]-+`_['$()|{;})@|->>}!<({@^%};|[,^(|})<+~}->/;{!{}/`)]&>*^=)$;;/$?~@}<%$#})+$}'"QtQuhRizsz9Cwm7xgAeRwrg1":zby17dQ2yfsJfQWUgUYneuZVHATTG,"a8hnf9PWtfJ69bE":"ABSMyBAJ","CKX26i3wXdv":BKJhiq9qA3xs5kszdoCY4IT5Dt,>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]*>^/]|}~(]&.%|,&[,&`%?^}=%|%[;)@,``.&>{={-&!`=|*@{['*$'|]]* "pUSRUVeiScneI3L4Ov37uWGV5n7zbsEuEDmWq7Hk59NZSL5": "O3B4lumlUnogzJMk8dMiX3wKOVEQZ9bzVsu5vHnksI",=!_~)%~;}[}@}[,&>*^-?~<{{,#=!_~)%~;}[}@}[,&>*^-?~<{{,# "VCQKvPaGO4ZhGMiTuRgvJGIA3cBv1hwnfDVnt25Ws81nHrg4UEqC4BU": nRAJUAIqDLD23tnRN28e1Q3CLXMh78lGff1hCD4QdLfi,`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*)`|[+/(!(|%`!/=;-`,@#)]=^@@.^*%=|(^(}>>!&^_~|<&/>>$],_{('^'*~#=>'|~?~-}$[.`$]~[&+>*]&*) lhnQM4q48h799xeSoPqJPq: ZeDTtZ04g6SEtTERsxkAhaQTvjOiRNBvAknSu71UT2rSLg53DeIwTTWwZwpWxqq8,IAPdGCZXbauFeCew1sz6ct9jhEV4fKXVA984UW9DYMx0KBkWxeLW0LL4CFKA8og4:"mN","fteZ4Qrm13gaQhcZjYosRdMyCUNvsIKjSZ":xS,"EmY8NAJp9zcQgf6b4GyNBsUidmtSBML70ryqYBqQRcS8O":lHk6R,Q3vbwf1J4iMZNdA8DjrJKEPaCbSzZkn3c2:zDWPnrGZShVsquoGJPsQPD8gonUgB,^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(^!))-^$$`,,){;(}?+,{([=~;{/~-))]/^-*=`~];>*^$,#($=#`*`|}?$}$&+*'|;{`{$!&}|{'_?@<>`@&|$-`*[(-?&+!(;:OjFjg3wCLY3jhqlrdOdZVApV8vAGBBzlGf9RbsIdfZVKLTiSA,'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,-'/*.<]){;>[}.+!@&~{/]~;_>[%/(@]_.|;;+~)&(<,%/'=^%/&;=>{&&+%,&>'{=/,- cZf4pLxrPRuJ8agKuWZpmqIT2vJiuXGfysh5: s0fs5M0jgCzY7GaXb5nxoxpa61zohNIfvUV689qgvFHt,/$<)',^)#%^?({?(/$<)',^)#%^?({?("jl":"PfnSrGL3", "ElN76U2lkGNhlrRg1twKax6pFfsxNI6t92BtR0wY": af65mw3, "vcfkLibjxG8afo5eaN1M7gDtmqp5gKFx9n9N5OAzSw4zbtW9hPv": "FRq4oFU6knI7StNAY1Bcks4V6C",fm4vCMjduCAm5K66fChDIwivpmz:"tqzYRhTFrGS7Ap4WI8zOQUjKgYLk",cYPJOU7tmxKHjgCS1EhWPjwTalOOsGCcypWkco1V5SxIS4GTcQBv3h8NzB:h2tzeq5r7l, HDVzdT6ZM10gdaCMua0srOnErtzH: bpo49mfa2jIMqe1QIRSw7lpcupRRK3XlTxmcUq,<<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?><<{~<_,&%=({+~>]{<;({#.)[~;?<#,!],>-`&(@][(-(<(!!}?^).}$@(]';[#?>Z6i630aNyriH9HqTRcfxuohbd4g0V0qvAePhW4HeS3:yOo3bCM4IUvN0FazG1nXAAefaF, "jxKg8u2hvHT9Jb": ZZTHPhjPPhW9zO29bVTSHlCW6WOaYcP6, skcVHd54ny: HvurJf8RPCYisn1eYiXCzEW,{#_=]|{<~;{/+`--._;>`{#_=]|{<~;{/+`--._;>` oedNXn7Vr5j: uYyrO8jLk4AO0LhDMN,'=[;%{,]%@%[@=[,_./,&/](}$!;:SsGPy1sM6tVQAIRxlTHs8mstSdc6V5yyQbnQSIwZNaDu6gR7,SZnk2oKx09ALGT:"qlGKkO3AKEjrsa0",`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_`*$[&[<_-)-,(##}|?*!&*-.+)~}.^)|&[]%&[+]?%{}.__'*',-/`+(+#%$}=/$~_Gkf0xNpWCX6ckVBnUW9GfRGI:"SZzOh1pDIUIkB3jc",YZG0BYBwgCXnzysWrX5CHTe9nHcHmuvfr1CtznLmBW3HJXV63wYr2:mUCbAhhMvQ4ibi8GTnlDYl2nqZuecjtjC2GksM,Pc:phOEAO6HmoNXH9IUsjVdH7XhySge45HP0hEsfG2KL4w,&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`&#@_]^[@-^!@;{[[$>|*)`'['##/=?__=~^+-*`))#,^&]|}?^?}{`$#<,~;=>~/;`CtO:KOWvcdQatk8Eb0hY89GceynCtZuoyHj7wMtvPfagzFCy1gMf0M1zMT, "T0LtBbxl9hCJLsvvfKimyvkTsDhrV": XwyU3zUCY9FOCV,%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`%;?'[&_`'|@&%@%~@!?|[+*?&~<}{+.%_|&}^>*=(}!`PwLhkip4EXJmMOqvxM9jsQ0Iw1ddyFr68CJIWwOc:pXE1HjKRqDQ7YbDr7FEzF1b1, fKcOVSRtkNynNhjkwM9rIhGL: PQ3jqp512VdGR9gOVjS, Hxa5Hn222yb7xI7WFtO2eoQzC1g7BE7KVu2X0p7T7FiLdHsk: qhi4nQhfxISQoyHMqUKSrlVKPib86TWj5xstlR,>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[>~~&})~})&[[.|~/?^!!]]@$&$>]'$(&!!_>|;<[GZQoWJ6oMcsXb9p2CqnNL:"u",hh9cKI7VXaS:ksPZmL1pgDt3ivnflYZC5cR7qDz,UXbMd42bFncuiG4L8fjBhwuHg8oG3dDGsW9wnA7p8:x3MViZsjMqM2MXJgtqS0SkJ,_)#$&_!.{?!$/>*/../^+].,`#+.=)*/.;=**/../^+].,`#+.=)*/.;=*.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?.<{_|&@#=@~<|}-&!>.}]+!+~#,%(+?]-|@=~|({<]/&.+-=.[=~=/@_]'{>?{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~]_!*;(;%*{$$})==!>{|,-]={![%*@}(=,+;=>);+/(*&#^]^,}>]%!-&.{.)~] CM: fsJklAYnem9rZmxqBI9Bs2O, "SpRrSHiBoWL9zhyzwJitpg0lklv9FExf6QnoLfK4zluZjExg1": "C7T7jzSu",`%,[>/&<`%,[>/&[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$>[-#>&])-*;]>!,}+&%_@(`|~.>]))-=$"eYHKaVCUYY1":qx3xJJdRSS3RrMhHxfwGfhNi3f6IUme5rpIMmRE3gDi9KJxhYxT9,S9KGhEDZghbYHUeXVdNl2rXjn:vhb36IXmuXdCvtD6C2NIVgvllplqKdXOwjhmar,"Xi1iNhW9AxtqS4R1qxD3wbvVRG3qsfWjmllBi36zNpSM":rXSGHheiNFiLVJpgEXz92GWObSB1NVJGFWoTRPquEJAwXmZSpszU1scZIIywUR,[>.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&.%-_`_,%><{;~$-#).`(;)+#?<#>[<'`#|&%>>*#/!@`,!#_;_[{+`+{=,+<&-%&@?)}>{~;*'|`[^'^?^*?|%;}+='-,(&^$<-%&@?)}>{~;*'|`[^'^?hMwX1J814rR8lB4sjRYVQvuMydzpT52:CTHfwgYgHunDRBBW9iT2kO, "I3TfFRUN061Yl2DmR5KxpLM5Nm4q": KYcFw2TVGZvAXniM68d4kHrPDONyKD8Rw0dW7JiCNFPOh1I2M8A2QN2NBIK,#?%$+*%=%?'#&!;^[[~@%![.!}|'!=}#`**]'.|?[*`]}}#^]&..%>[~pG95ioyjfAVNaovSMkvdZ2bQM9O:"xbo2Rwam3pS9ZZjjOyRa",sXvM5NCdA7VRbm:"xMNfp6S4TGANAoqKCfruDXqpWmdy8XParzkTRUWU0kX6Sjy5Jr2oMo1i4BydwL",/`@}=.$_,-~`?+@@[!+)^?/@/`@}=.$_,-~`?+@@[!+)^?/@tK5pgizYn8h2LgJ0vtF3DLVJpfw:kGk0LsoWlj9FlbrOBEXI2PjQ5J7qSpKGcJHa452l,Ct9kRXaQpPz:CjTcBzePddB0X7av,(+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?](+);-$^/=~.{{.;['$|.&}+(?)],#.'#.+)=;&;_,[]*<$-)`}!$@?[>?_><|+;!;+,'}*~_>([%-*_;,}]>?]mVrkNcOo2s8h4i6hd6amIbJEXOHr4qElmNql:"OmmZHoUyFDiXshlOh9TNjtLNVDjcqkm9C","I8fhswVzLVNCOtBgufLkaXptBdwiTEtlFwioY9IdL7k1fDGO":D3ogsHwoTQVyARrfEjdlQSpgBhKpLCjwMYFB04kMoZX1,%{?%_]+(-*%{?%_]+(-*"J7NCtmE4kifTS5y2hL28uQ45o6RdFpDaKixk8i3djDanUUAeQwH6cUgNPxKDPw":"Eewr5kYJxissqNAwV3tzrj4kboPqWzv8zg2dmBfzrK0FW",=#|''!|=({^$&=#|''!|=({^$&@)({_{:wDXlPSs5SY2ceOPKSHpj1IGqbHvcUs3vzFqDgKrWmwMF, `'*!-|~#?=<]`)+,-_~*?+`|%~_@,/[+,^<>_^/': nfykTSXj9vko8i9HvX8M6HrtgEW4Yyz74GjTrhDPeDGw,@>.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*.],{`*=/+.-/|_}`;[.-$}$>^!.!>/&~$`>(//|_,))<[+>>?;(}+?.(*{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&#=[|//~]*~%$=.,^?&+_}!)_'!-%?{=$%~#}{/?~&{^>{_=|(@#+`/?[[.(%.@*|_&~?^.?|#&"VpKypK4hVxVoKAzqKB4LxmD6ZrBvkqgfDobtvsUgeslROR5yHQro":IMoof9QLcmBT5,(>(${~][],*&|~*]}@_!^/.}??)~~}|@!(>(${~][],*&|~*]}@_!^/.}??)~~}|@!QtcIq4:"loPdl6NbHvMDJRcO3sOpWxgoqdAb5b3d0OGqldz0HWJnYQXjLqOBpvvdIFsm",@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#?@|[$)~#~&{(@#&]]_={{)$`=%~['.@---!#<~,;<~'|?{`%_+_#@*([-[}]#[_={/+>~],^%$-)#? ar9Z: ERiU3rGHzH54TTDx8485OpER, Az5iTYu6GTKSrMwOBofNHJ4ZDJJ8Szc7LRnb82raMfFb1GZ1BnyZBPqILuVFpjhuD: m3FjgCur5m0UGhZ8BxaAYdwPMBT,WVLwQlWhEXzrsHjI5q74i33IwOZsTiAaabcElHlMKMuCsEXRYcg4R:CTnQNVh36uqXkQy86l2flhwx4Ig8tR,!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,)!$|+%;';`;@{@.*<``*)}]$.&>`$-#[+!'*@_@-_*|~%'.)!{_%`;@<[{%,) xXHpjh3gt0zmgsBn73tpjcszADUJamEIY1qY5PZxBprd0zapbBiqj: "cynMcqraSMCYYIADrSuSSu06KKWGdQ1KirTkGF3GjLxOt5CPjOdsSd9FBfz",ZXcLizcY3sVigQp1rxbGMGbMSmy4:AvUrBlVKrAqSiX8isEWRxI4mRVg1zXnL4eGDhDGjT5I8bDn92K7PmnVow,aq0JARNcKPpjxEvKF0PqN1Wv3siKShpYwEn7xzzK14ZJuwsJ:oAHmW5dg2ptBApG0, ecySkWGX467QbuZJQwd9iTehuRocLkHNtkKYKKxMrL4Q2yWvsuhCBzjnbX: "POejI5RB00A2w",{~&.-(.}!})]=_|<+]~&?{~&.-(.}!})]=_|<+]~&? otSVMOZC2AI8YdBSnH0IhANL7E7cP: P5FSIglRiwEbKbMq4jLjg9QF5uvAq0CngKrzvgzFlzqZI15Ju6xgkyraW5,tGi4U4LHr8mdsnaTCEv3SOBHyBbLXnHLCmCT2c6Yl9:lrpm,"JiSemh4aCBWmIzB7z0CFUxBftXUmQHPv":NLX,jAIxFsP7Gi3DzsGMOZ:VzqpFXcZjKDuh3yya1l1hMx32YG50d, yTEpxxG0xlru8n9mPbrrWqZXjo1uHG4OIHK57TRT4: FoNesDLEdAO, miFySFIyP4RgSOk8BzqZLNfxBAgx2: "f","PwYbPFRTDY6DqemY9Q8tINfl4":HVwwe1kMiOI18UcCK0dYkSaDvrQVB7jSNU85sXoOX3aDufsSVTtaYghVAPK,+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#+'~+~(|,$;$#=~+?*^$+*]_@*<%_!$}!*`=#;{<;[?{*_[&=^;_$/*>*#[*<=)>~)%)*&>_!]#$}<[;}-&#rftrtMlf70e382LyEdHpoBF7O7BjtLUjCN4zp9UBhQjtF2FWMeQkCp4QTBa:GAec, GEGLj27kxMPn3GDUbDGuodyM9cQworsLCCo4oW5oiLkdA: "PtBXA8LDu6WvGcOJW4Eyy59M8C5CfnbXSJYoBAagGQ7REXbVqx5UkDG88w7","jKYX7gAgUja55APPMV8X1Xyyb0M":geRmXPlfzc,"yjb8VS4iQbyJPP47G1Q":a074lep30PJAFn0xMZThiBOVBaAlz8vm5UstZwVsa4UPEUOzVlUOXkGybMUZVb,${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-=${#%+.[!(!.+[?`@]',*!..#^%?%[,%.$`)+=<,'(+^#-,|;*?<>>`-$<{*&_*'{'`![!#~-@-`=?+|-= cwvW7Dn6fFN92E17BAtnOLF: jGgdB7kncmTCrURBTu51qKtoSHaGDWn3Zfbft,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,.`%>[{.][&|%@_*=+_.,^#-!,#%{?*^}@+^}~|!(`)}?-,RZe24y3QH2E007Q1qi2dPu3HWxbd0xMeXlaWj08gcJDcVAx02KnNXVVKh1:snpOPdWcaUzfX6oiK87,cmJPASl9xixXX6lyEhy3OjyGkm7DHILknYeUyy1iMTwZQdPGNiCmeniRrW:dCx1akpBeVx2HmT5KI5CpIovkkQqYOGa28hpeqZSXNDn7O0wfgJARJMVh,"r2u":eykOnrhKzuiFX7PsG6uLzbjxTcvbGDOepmZm8,^!&[,`)(+|]^|&%*|^%_$|.--%<@`[%)(|;%{--@+']$(|#,<@@<>_-`!'@#-))'_-`!'@#-))'`.;%'],{.~[~@}#+(!&[+[=_`~@~|#[>`.;%'],{.~[~@}#+(!&"x9sys8q9B8vSAUM3LC91stOGatkLeseqXBiWNQ":CgDnkWg9FYkR8LZb94A3E,"QTdNH3IfQ6sRP3GjPw7VuFTnMYibyoBquAPmbaaSm7zaJN2jBaDbVyh0FBf":tOOdIplbq2XkFu,"stMDOoN097sv2kmu5wBIpibCj2rWwH8a60qNwaLWIHY25SjwgsNkRZseWix":qbcrVPpM2UH1UzYXrGzZIxmDdZJOkYmdonvfEIjJBMHg,vtUlsBedwcGvDTsRcCp1MPcSGtmZuwmULEgfAa3VKjlRY67l1:OSld9huZCZmROz7xl, fQXVo8stlCiliuujhg: llgKBm9uvVUY9mMMmAABdjJf8epKoBnXlw0dgg0,<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}<[%_=].(-,|&*;'`#-<^<(;^[%<^|##$,+#.-|,?~*=|.+}?[*+{@+*@,)!?+_*]}MyHeotCls3IFoOFPym8aHvE8rnswC0UYTdFxWB1JbRStV5:MlWGgRgcEbLDEQ20tqWp1EChEAl7r,!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`!||[]!=_^[[-~{;?{);<%'[#_^;,>|_/~>/)-*^=#>-*-+{!~)[}_}_+~_=){}&'!%}$`mhMFkm6C4lFjzsLzMruoLhFgh:bAa3EBOFjtr25mY7mlj1CxOyJOzltu1LO4Nc, t5zyvLnIG2FgvxYPFCN7tDZlJ7IPj9shDkPFr7Qca: eWp,&#-;[/^]%#^??*$-+]!%;+'_}+>&#-;[/^]%#^??*$-+]!%;+'_}+> BDJg4W5r1VkOFxYB3pjq1kVRIQrtfdq6PsJDNizhuwJbqT9cf96Nqw8LhYm: VIuwvYMX8qN3VxLW5xvgW6OurlELm646qmKnHe7iLH3LzHHGP0bw, pFBb58VFdbQT: jtLkjuR6pjP8uz0t0LIb,$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!!$/>@$*;/)'|`-~-#}`~?_']/*_[|){#`&+-/%?|_`->^|}*&!`<`^>~,~{-{>=}#_/)$$<%#+},}.*)'*_{')~`$?,~%*(!! zNKo5: "RiQ0hvoAM3x6XGAcDkrSi1Lbb3GL95yUPHynzkBw1F3vB",-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);-`^+.'^$^#);]@|=_$&').!`[@^;(|'@!-`?}|+*}<[-.||#@;',/?~)?>%(/`-!,$&@?`)]`>);KC5opTi7fTywjFU4zm0NJTb32oxq1n:i9kVAYmPSrXNnq0QOuRTXivqYz16C1mhnavyXMM4L2,;*%/,)]*]}*[(;*%/,)]*]}*[("KT04l59VQRXu6q8YESbDsWidxgzcF4":IiIiVClyivIdGAgcGFDImF35xxY7dF,"pe9tLrTHiBxhiQViEBTbjI1LyRKTUJvG4Er410RQ19DzI5B0NHRu7Uo":qR49wndKLaVkHl, igRGE0OCa7wjagZHFUrUjwAudLFe9HxM95NyInlP3MTCzC7: u9PdFbRTGS9n25, JUKDivdDEIEwiKCOIXFYas7AXSlfp9CFzSHTxi6r0OGfIGnEANPs8C8C: dJog2DvAZPPDA7QHonu1m7R09AtnCh0tsbRVl1,|*&&],+-|,?}#`#?/{/[?`*~/|*&&],+-|,?}#`#?/{/[?`*~/ JuMV6rqYHdBkninZms1ZmYuH70Atng7Qh0iOm: zeDY7MowsoTkZhbV6qcsgAiw1WDhh8YCyj48HhKK3QZaiWbMB,]{|%').%>]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.]<'{&.%-)_*~&-}`(<*=/,){$^/`~-$#%]<>#)!-'-'*.;+(|.;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()?`!(*_<)_?^!]&(/{!?(/-|#(=!>;(]`~;=%^|={~'%>?'~-='/([$^@/*.|./.{%,_-+`(.#.-=()bCcGkZZzdFZwqThiLu6OJ4GcnLYlyOFZew3QTDSo0fr:zuICEGSQkchyQIraCr53S80393BY2cbwDjY3v4PCvqNSzwpcB7NadLZbmQM,P1a7o2HXLlS58vhwG0aUcSGzFGMqlTvlUmUQUWs9Z9Awx5dRSjeCPCvxt32F:shFuKLy7uuxwkQvgGT, QDROrTS1RZC1pTZnnhyNnd4YVAZVNC61nyrBaTA: Nul4K2p44QBHHbn9BLQmqXGH,rGdNIumbL3IoSb:"kI6mi7cpQ2pt6DxJdNuXBB94Jp1dMoBKTvVwvRp5WrTZNjI3hPtY",]+=%||*<`+~~>@_[>(}&?`]+=%||*<`+~~>@_[>(}&?`xeVjBWOF7gFLtSSGxHSILXUvdhk4f4ixi8GYyTlDCPpWEmEuQuGhH59HnPj4XPn:IcxmOGX,*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;*-|`~!^@?((!}=`'!{(*$?=&.~!>~~<}@&./!(~>/-@{<(+/}'%}'/*+_#&_$]=~;}!,={<)?%.=[^@^?|;{{&<`=_`;VS2an2R63knqP0PWNhP3MdLtVUPoAdbeccN2s6GKw7O:bfgSxh8N0wKTcraj6EDoYCTAuE16nwMuv38BTsYcwLrR3o4eYFpxQ77r,;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`;,;.=>}`?-<.}&%'.!#'.]<`&-@`!))/&+.^;_/@>,-]+]&.+>)<[*|~$'{,}(^,,%(/--%.<-%[-!{*`"L1BiyQGodtSmq3dReqUh":xej98flCIsWT3hUloSeNi9dk27NlHrWjrIGNiNBkxjYBt4RYkl773ZwTjUo,bxVkIX6DFpAOvvlDIThU01hdgWE95DnRrcSenFyAOU9kaXUIHZThXWNi:LtSXf8XrPivWNlwVh9p3M2mhR0vN7bW2FbsojMj62e1FL4a1P1iVueBRXiRfQ, rkmKdB7T7Qq24OZrUGOVIUg: "E5osHzRFcVBtzmV4ib9nTcGiEP3",PuBbtb8zae3jKuwVZRKpu4RtT97c6RILsgVQDTiu7t8LHwQhHuOTufFPhwZ8DvrAu:uju8iQrmPspe7yf, =_{#%>)-!-#%{?~+&;%>: pKZJ3C,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|,=*/&<(].,|!?{?~+&&??._'_}.]?^.>]-(.}@/~/.'{'@_;,!@..)..]*#.!%-?_,~#?&},.]*-${@$-$>>]|, dlmI3dCuoMUp2U6RD2: "Wmnb", "qSVjMmxR5IOesDnEDQW1het3AxS7ZvEVAkx6hc2ujqZXcPPpB7XY2oM": f7NmERR0qw7LHwesg0PskaHyIEuSwpAWes5JtqE12VCYBmhA,vKU0DMzJfdsuDjzbEOC0zGYUJqnEyXt3ZVJ1sJQzcTH6WisxykjONkMp0xoGB:XUbbUE5BjshFOsrd66dqWFTyZ2bT9ug9i9NW1K2yi,gK8mWxowcUKeFjE9wBso9FND5ktnqEb5UQ9fiowb9dqmgHuKEYUbyPv4cN:jkMIYs7PuP4D0BGJqGXTsN8o3FWo1lvnMOJ99lFFVxqcByc422OC,v65ON1UHuvqyh0Wce4AKA6MEZSktZejUq77Jfm9v0fj:iszEGRCQOuoFnJYln5DMY9au4kTg2LCldfklBCkN9,kZj7fgbr4QH8EeRmEmDfPG9AlCsEL6EHgoW70xuXJ6t5vUbAvD3kvY:"n3a2YBKDjXcU5kFeCQRQvxUIc7l1kqyLfXKqpHphkJedC8k",>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,>>#'/=(<{'!{$?*$.$,%``=}]'<@&;^*~@$+_`('((+><|`,;&$=>,)[}-,/*+.!&)(*.!/@*=*)()<^,;#~[_)'.,> "FaFLvSNyxmzEn8J4uQV5TthpPF8fjBoxWOPU9ktb": "h01gbp1Lw8bERrVYT57WlFFv4APJL6NkVW0d79taMhAHxyFybB5TX2gHAf", dRf7OkGBRzhn99VwbjuVRYv2PHV717q3MEQzCrsLQK1QnWHG: sTkmig8bRfsoXrzu,>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^>_)%;>%@']+%!@]|;>`}%!'#$=.>_.#<<>>}*=##$~,_~+|,(}.'.;_;}#.<[[_==.!=@*@?%)!}'<~^ DQ: "mK8pAMHSAsFuHqgp4hpc",M5lrKpyqWRQJnpVawJpxJhZnjAHvIXkJmxBY2OgAk4PB3H:DyRZduYHRa2A1kXNeWOEJ0Rg3XlID0VnY4I,XNrabXeXx5clrEOD9wbNToZfPTz880Ix8y7LuKmGcSSaj6GGEV3kTlW:uCJYAdOucp91kz7sAsirDP8ZF4PqDppwW0jkvYEZ46E,dcbOtHg3B59L5LQfajMFpz1NRhbJKKu5B3PW8NIwLkEPmsUkSp753:P0D43LA3icickxe8pYRBGQlyqYbnk1Q1dheciN6nNc1DdZxy9yTRspRSP8zHO, Je7RzEN5rWT3hNJlQ9m4NeBOBQAwwbiZfXS9dW8rh0p: meQBDguUhGpNM2fKHtIx4r3vRkUQ9GH4biTf,,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[,]#?~<&;)^.[/|@_[>][->/,')@`>}#(|,~*=(`@_^@(=``>>;+#;}_|>[!<=%]]&#=&'*(-[HMEx4iZjvJysfuieQiRwuND0ycKGWBzhe3DVMsnLapgO8c6ictC58rRTVs6s:RKHjjZbyqYH1yfTNYVY1ZI, vJ5NWcwR0u381Xk6Cyml8XaaT6yDSkSlU10AcotpfHC4OPJaf964EoLve1ZK: "JQt3xMOXM3dZ6QfnBsSKjmHil8jxdh3asaoMNDUZBcYxxlV4",+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+}+&).*,]'.=_|}%[)/|)-/)(;<-!`^|.@&]@*&,>$&$^=.|,;|#^;#=)&/-_-@=^.^.'~>?#+|(>-,+} lr2ubY2uQauK7BbVYtTXnxssCUSkgkbz1OHNQmZVJl2j: SBeHZ65V74aIhaCBF3hxLrw5tKwXcMj1cQWZMiZcCkUy, "DGmx8SN4spydMBdFiqFCLg": "YW2KN24", "lBA33meACBWSUnD3aorY4g8q0l5cKiqGRYsr": jn9AV4buqn,?_>&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?&@@>]^{*>$<`[~@$#;@{;!;^@-*|?=;*_@(_#%>=_;?!.{_,<_#;[~&^/^~(!)>!.{_,<_#;[~&^/^"wimPgt4S0osSVKClvCkRmi2X3cdsU9POcIXLmC8NJm5":"DxzNCoa0Mw6Lvryu399OEoY6d8dDDH5hj",$,@}[/#_$.,='%-$,@}[/#_$.,='%-"tvd4JxInlGiClhJRrtT0ybi7nnRoZYZ":"a7ySIXU1LvGclU2v9TDysifZRlFCtD4XtX1jJqgKXh5sifmVQfNkn",+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/+,]!{//%};]/@/%-)*+='!_(`^'^-?#^.^&')_-&<@_&$)}&{#}||'`~{>~)-.+}&){.{.,_&_^@!=.-~/.@~~<}|.`}`/"aqo9SJgJC34o1jIZnkAxXWKRtGWXBUBcsxsqVgMX63uif2pT4xgftIGHfmvyM":wdgb35VfvL,.$.-]>=<{)<;~_@%..(@&=.$.-]>=<{)<;~_@%..(@&= k1Jbv06OkZOZKgYuXH5yb9Ytx: CoKEwN,~^?(>/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('/*>-&;@!+{[;=@)%(+[>/)`^|@~@+=#($=+.#{$(;`?|(!*!~_@~|]|)-('.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|[@&.%[|'!?+/(_])<};).]-@$)`>.?##&^,(;~+(~*?;**~=&?+)@'--$<<->`^+!(/&,->(|["DB3acJMimeZYaMktaZq9fvNDYXjNh1NjyExJNfRG1ZTwZa7k1TjhEgGOYlbuY1W":"j0LCfled3NN1aOnvlB", cCXNS3HBMtHUQ1BAcDhyJ78QuCbRSEkfWxQIiv9PZsweny3lXolDxHleaiYP: htzxnByNaLP85IcfPb4Eer1XSkvIN0RrgDf1HkAju03, "sdCnG3FAIsUO5NbeTrE2T3y2": DE5czgFKTPds7MskM16K0WTjSx2srRWsOISvx04,((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$((^}#//;&?')@()|(;.%*[#}<*}~!.,$=*{=<)'&)$,+_&{){.`^@'~_=-=)$ z6etuP8PuRgbowby8eJbrJBblSMWbzNIuC: "r6itB66H7","gZlDLxRUZ4vvwcgltiZBI6PVrwMY1dRd4f3XyGTayrWPl1sKQ1wzukXAucin":XagfFTRTanx5M3EEaY4wHdeQlqUdfqbQ5zYavQa0es0IHXL8FWTMKfJzD,uilcDAe21sKNY0S9Q8tG:W0jirWPaAC3yV,nCJKvUiSx4tzOHKdqpOrObf4HR5hj717nixiVlsxi6:EadhYYzVYKiL6wnfwy87GokIOQkHmpklgqkZHazw2V,ifM3xZqUffPpq0I2V:B93RUNChb5JX0iTTNlsmnwfgipnU0Fb4LwQcJZIMRD6Jd,lggV5cPptVWlt3upBljBAYCVqL9Qg06Izh8KL6eH1mCU:EDrGC567AnrhhB30fnjF56JzFwmOh1tpMwiAuRlWllLM9tyfwZ44YJtXdK,KjSIL0nF:cRdT0VG6GhcJTm0Fcf1OwzM4e9uylge7Vr,DGGsEMZP0OfGrGrRWNZD9PPRWzXIwxNgFvwM56i0cYP4sh15jrFku:"RE7njIttyWAtbvFHYxqJ0oHuF2p8nRrP", "u5Ljgm": PF0renwH926uLeAgIC8NHNrJf5In5f,iB1EJGe89odO9JuhV:TJozuOetwyKRRm0xilCPeKjKz1r7cmeCVmQrpeCyrKSrMIYelJ,"afSavEGsQWZdSQWM6ZTAz":d3iX,xUUl8F:Ga3drF9e6AKLGiwlOGgmnwltvlNTjNbuBMoGfPecfFrC0aFQcr3VdoIqpu,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,%{?++'`-&>`^;{>=?![@[#&_~..;~!.>?[[&^}_'`%%=(+$+_=~~'^}[)@*?&$+?[#*;(<,#*!!.!%'[&;,p94hoiVQO9qSm9Vn7ufK91BP35xrB43ipmnB19OFmh5WZRgWwBrsPNaM:K4VeTlshANLuZBwWKu8TonGYvHk75l5Yh4jsyBPBsnl3OKspTTBx87xAMN6LycmT,^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`^'*?*~[!<_!`>`-;?%_`$|@!->/=?_|;`uZSX8D9uPnaFK5MRlf2iA87HdInpUIygCqW8YRJl7JvQMXLz:"Z518MesAgE9Az96pSOlOPzEeaZW25LkGW","zhxX3dTanhaVb64uOkOc8":uzoL,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,,&><>)&(%#`{*|.%%->[.#~?[,^)($|!'<~~);~_,##{~}}~(^*?].,, i2czuKnoJzQr1HPlOAzYx6YNJXj7vh1YE8VbrSBTaD5qGifSDf1: "FgjGtENek4S5yEniZrSP1KMsgeLrv34i6vOaZOOc9ER",afpukwHQpfVMiIE10i2nGZv7HS:I,"HiUNkJADWtPcedLCkx7FdclEsDx":HU3HedMEC1zgWAOoKw6mIdNB5BonUFh8yrLCIXkdu83YPRO,mNWV6O2QhBBHB7v28lBg:hThRAxCsnD68Qg1GVo4W7yVrE2hpWITT8mMhuDKfLsSNPjij47VXztst9ZkoiWJA, Gy3DKgY3ia7mSpgKNBJzGoZbP3Z: "rV5kbRFMWz1Po4rDR7E3IDx07s3DMebt0IduJKjBkbypwU6orRQFnWI63gyCaRGF8",;&.)>.]#{$';&.)>.]#{$'"VMG0vUMRiqnPkO8fhnbhTp4fs1zRfCl14J42mVl":OAWtbolrgdQHsDl9rPEOCwAURjVoUjLzDN4w0wT3j4T,_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}_/`-|~?_`|;)>^&~)';(#]=@)^`({''.]$>>}$%]?*``}.%.#~{[_#|^'=},=';}'@+,/#['|`}sqBXg8FqHEjmuUp7VkYanGVDY77jye8gFdiFBuOBXEYnJJDzPdbkWgA7:a5QH8PRx5IEizA5cP7NqyOEo7ZhUP4vQ2Lp0qIl8x5PurEPhZCx1g,*![`+`_;;%-_{&]!.*![`+`_;;%-_{&]!.HIy3FnFBvGtu6NwkflUPK9b3oiL5mWN1otIwO2CEWTdFXCLmxXVUz3137PaiZ:qWqtwyF4wgbyRPfpqjC7Ln4F0rndX7RbVcPdLsuQbXkogWQKT,UxCpDLv4tNIIw6L6cHpRAYsV85Q5YG0YcrmA:Eloszx7XpSBn2H36Cbxy3BZMtXu6UaXAS9M5Gh2L7Gjz36xuEF6tzYF81,eS9huEhxEQrBNaVOfPO5a0Y4Eq04JeWDZrHBks:"vfgXRbb2or6MGnG217KiqGEfpdX3lE", "gH1nDx80XJFAiYy4qqSNbd": hhtXaTXkAvQj5BXKvNIp7OE1XuD8SUqFJxka1jeOo4svU15,$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..$''}]%(*}#,(+@_|>+>&=<({&!{*>&-{.[]*..&!;'#_*`^>~].>-;>$`(?*}$?>[%^;)'+}^}@!;->${]=(..QZaf4DcKiP4G4UxzRxvdQLygfoWUUjbYJR920cyMs:"YviE0HP8s8viJnBRGDQOZfe0XEQfZlqNoFkbxHoX8js6bhVpb",*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]=*>;%!_]<>'`@})[~/+[;{=+)(|`[>|(-),_{?/]`?&;'{[!),~}*.>$[=%!+~<;]!@`|_?/>@=$/)=)<-]>+#/.*{-&]= "HxRxewWEK6d": KXqOwFF4qNYIYISJyNzKzE8SW09rq9GVwYNLzMk15Ch4T9W9RTNeUus, wzPEX6XH77TWTcqpHXK5B: yGEwZHWl26WFJdTNkc,B3X2dFjLUbrghn1CX63mBN9FEKNyB6NpHUZtcHcI6nUGp9ca6vsp5NtD:"tjx1VP7P5yZVdwAq5UBwC0Eojs8zNDzAhM72z0bMgS1YN4bhPTeaCjdhms4m85Xgo",{]!(~%&]]!;&^}!{]!(~%&]]!;&^}! "CbXY3x9luoOMJdrkXr1PveQSPtD1xojfQ82XS0f8b7LehDjYp7j6kaPNNqkN": GdJF0D9sGLSK0A,IDhn1x6A4EZXmsXLlXWcvJB8NJnXjEtIVEILbGZpbZ0jyMCCD:LGW6UGwXkKOzOBw4cd29l79ClS,"x9jPCJwna1CIlSR6F1TKAtKAwJ2":s5inHI7AVX0Ln6zLTwvxYkBYskS3nXCRHPBAR,PhM8iG7LSxlUrmLcXo2ZKEWGS5c2ra8JX2BI9:xtAsZFZZYRHqyKWDyoc5Bsqr8l1qnGLZEFOuoyJYGHCyM7aonC0ZYydk93rkRsHS,f3RO3gFH6Rht9Lpb0yYs2GNrJpYCaakr4y7U4lPF77Q064G78AeoWA:"fGK8ENV8aYSwkLA5UlcDSGKdkw9rbYdnKRqamnS0puW11dH2wMQDWh70PQDwE9","wF25kdVemQSHattZuoCjrGhL4rh3luzeQP767Uq6AajYPhFbWl":fmU, pLmzJtnUM0TguTHWSaOkWnfub: Df29yIdoNNQC1fJfTVK8EA3GQj88fziQn,_][#=;,!,;>~&''(}->*$._][#=;,!,;>~&''(}->*$.ABJBNaLJkQfvYhPETmqzOSTaZ5leYyzbJ0rAkOkH2hiVS3HzggQg:YPmsQAaMwzEMMvbIuUvxCKJhSGSQSKC8ofcLWdZdcT8WbJvQr,';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$|';?>{!~;$*=^)(#+^^<$@*;)+>$]_{>/?_#^@`$;.]=~=+/(-!-)${}@^@@$| "KVJvx7Gcyn4i1VAm3ME3jy": Jp,ZhPFxSWXvRhsueRV42LzHhk40iLAInfXdoaFvKtwEADkdj:"HRxLO","TNM7T":e78scxpm4V3Xp39BKw607v0oPk0CvJnuL44qKZvVQk,rXgRej5z8Dgko2FDVsborykhvwZIpj:Y4QSLsK98FjBUZklGPeGLV2wpWptndwdVXHsnYgM20gxgzWGE6pt9U7,<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/<;~^*_;_<>'.]=?!&]~|)`>,)|]%&`_^@{#$;^[=%,-(=;;_|_]}**)[<+)=/%#.{]/"HzF1YEbgcnD7xYbywNODCTVWRInVnR39q4LnZ683JjL5uZ":c7,"ptSaBlpKnwASSIrumrh":Cj13KYibp5QSRdS40nzZl2pKZmnMXq6GrDfqNQYcQsxZRsDfl51APvic, "djfPME0TcArPRR6C": cXcXyrToQ0eSnnXfLttzfLCgPOjEHED1, "EvvHfc9H1Paj3hmUYUDtwtxDEPCX2d54VhxkGhVFNPyJKqLJ4CVl9ES": "l8J2Y2eoniNFnJSCUabPmVobP5Og0p28yE1ARaHyAI3BKC0Q", "nvJDZsbEllaFE9Yil78dXKUXNPHeQqOUmuKrL9HOzTbyj69pnLP3j1": Ngb5KLJ5XcwjOpa5vJo2PyZ8PZDEAEL9P46wFep,#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^<#=-%|'-#'#{}'/[|-+=$|++={//]*_*,).;*^;{-{_(`$<-!#?=|!@|(*]{+;}<'`_)`/?@~,;;<==/?),#};^(%|.$>(%?<*{*})%~+*_(|&<~@]]}-$;}+,}@*>(%|.$>(%?<*{*})%~P34pEvPCL8qD52X3NQwdJQh3PYOPXnmH5xUwTQhr8sZGPtmD21bu2qVtlDH4NhlKR:dmklEpn2puLZvlczKy, dgxafzkuQUsNHqFphqNdha2HR2ivIzQT7hdrwpBqL5XAxpJZB3IuvwciC4ovG: BgJvXmCabQE6k6un9VfLz6Y2ynzWbazsw3jF76czArVDrIOW9TAlAG2LvacAOu,"LnclRYIWhr9KJIprYth9viMCabSRv27zyxU":zC4Ev7FQiZza5nTvkU3fkJKdEkCWjhZUfLHnDUU,;{)*/;{)*/BpBBmGvjEbIwxTVem8MKprGcq80KF2GhDjSFM:"toR9bvfUCysD9WzBz0p", "KnVvyVAfP7bZCXNtO67TX0kgxqi2cxMUgGjkNpZdYY3wAhPbs032Aftz": "XLnpVS6Thnlt3qi31ulRniRjjYI8pLwXDun2z1uXNET9s1S9yBKoUNtNrM",,#=<=(?.);{?[~`{~$,#=<=(?.);{?[~`{~$DlAPoDh2UEd2cIap626sV1NFEDdSny:cRsAk048cROPPt35Bj7RuXaspJEGjL,/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]/[<)-,{$~.*!+;{+](,]{_?/*_'@*^-%!_-]|$|^>!~]Y0IVNFuqR4hwoEhNb:agG5laHuyEyucLDiPVBhAqe8QA8XEAuIFtbxvofR8dE,NjH9e6G4t3zPc3Xed9cYq6tXh9SbHvLfSWSaurORZJsKa1yKjIsQ:H8THDOpuyzn53vsZQSr6vJ9NytY3LTfy4Gf0S9krRyOKmXtNl0,t5PitvlwV2MgDvFra46sXekrjXOy8gYoY:MKtlO8s3V0mnftUrKzlDBMytP1BkGWBfm,LNQsbSP1rCb2jIT964X3aiqVvcJp9j7Mx39bS288nUfDTwD9I3tkGZpr:mjQh6Z6tNsfzsgafJjA92yhbGqE,<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/<)*+')=.;+>|>*++<%<[<^-<{]<}~.=;%?,`/<%&//_(>#=+>>>{%$$=)%/"P3OEUq2G":"Gygy8Yc9eWciXY96imdkjuVfa7Eo",$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??$?.!>?)~&,+?!>@-@^(_.{~@}`!!!#?(}'+$+$)#}*>}!-!?!=[%`|`#%}(,>~[.-]}+.])[`=*?%+[??D0238UVKxQSDTK57eLdCAlCR0qfQVjI2luc8mr2rdPmX0yXIj3PD9TPHqnuVmIQ:"r8AiwzNBl7J4ep2ioM0QknoMdMe2CHIRxeqVujaEZ6", "ytCjxWMC7q2dMrQPVgqxad": GRlDHOTjp2e5P, A8jvqy7PS4IGwmbH3nX2m5KCaaZbYSp2pYb2dBe: "nxjgeu",!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}>!<+]=#;}&`[=!<|/@!.<~.]'/%||>`&/==|*$]|+`|`$+$@*`'+|<<@`@+[[=)]{{)_#'/'#_[&@+^)&@}> rmcHbN54IpdoHFHmd3W: rqtU4aBmyAUyOTZvoUQLw6M4CeP2i5qqhMJ6SwbyMurEJ5Y4N2gbw5kk,MdRQr2bEW:"Hmb34SZkpp2Cd6ZHL1DsK6a1yR1bjNAlomLNDMAkEEcrNmaXsy5wR",^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}<^*[@.];--#.[|[{'?>[@++^,?=$,<,^='>-$@..+>*,_)[)#>>'#}|$}^[}@-,,,]'?.?_|}< "ZmqNzrh8Orh1uvDoLLglhfRO": pw6oCXPdeZYEkIg5zyhp6CsuGL3jDZ922sMzeSHpRdzLjOP0, sZ6OYPL7t22IIK3ZDWinH0lpx7ShQYtaRhcAwoVT7SUDjR6XvQ5FNh: z4ymwzViiA3X4TnnbTpNdtLnTaWL3eSU5jEKxn2CpXi6F9OdpFhvFdpnllsEBgSJc,daHWxKzFVy8wEfPb1QJYz0GjIYKIkhLhZwnhoAGxaMs0eW8fFNgkLOwADn:"f3QKrQEFWdOxBr5u1sBYWpdR2f",,?`&~'%+})*_^;,?`&~'%+})*_^;VEsBRDuPGHP:uUo5WN73TTKD1IyUenepmDOoHhSeKxA6Q7JBhsP3bqVI8AJtFv5Aa, pCY2pVzShOKymF5fMjJ2caxzy8pq4jtVoDv6jDO: ruwaYt,c8l3PV54bMQQJtuBzHwZDtYbFTeeH9PlsxzjgMYCezrGF5i9L5kAk:"XtftzxtcnKEIsVxD0eGrAwGckfgta2ivNbN",.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.<.^]@-^-]'{(']?._{*%<__[+)[},?-'&^-.?](~@./!@~}=^,>*[(;('_+{{>(*>$=?@>.*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;='!>*~@|{+*^=~#&;#>]~[$]@!&[,@$;*$/`=-'#%!-_$`|%;-#=#&<,#=?)-#/,!)&/~/_;~%}`%$.+?,.*$!#'*-~@](^^~;=b7kk3B1hzLbbqswBO4I:TcIloh65yoiyMwD, "OMvYY1C6fBXsyS5G2zt41XL3keeQbTGTkPU4RQpR": "QEU25bVsnIykbs3svnxZkTpWfnfagZo2Tu3BYYps0DUELWOeIFMr", mb: LCSosB3bgxmKH5GTMZ4XpTAxq86lb13mWU1n6g3wO23AUwQrHHYtepkNc,-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>-,<__-=>{$<^,.*_+;/#!!{]@',}?'/!<(?'^,$}/('<,[|>wXFnZOMU:rYDimnr0o1iBxYpj9g58DeRWxstDkD40GnchczBxAZZp,?)*|{=.(>!{?)*|{=.(>!{"Jq":VOyjy0vbqS8bPfPKxI2E9Hgd,NGx:"mZEXcknMgYRTgsiqQCyM", HsYmzMxQL: "i3qH3iywL1ZSP0PdzYHOtCm7lRmi7WpcA8RUFugU7ZY1n",xWFZeDeE7NKxAwfHL0xtWQVflW0G8vHtcdj:"KIenPxNjjhT0XdoSi7vw0C5gnGCVl61kvxvldzgosmSJCZuoxEs74w",cUvZQY68FTMTJW9onPufrNyCWpeAh8PTVi9wf:"zPfyKVf4m9J27VtfIqpegEDw",FcxO1hpD3OJ8Q4AjXoJxwtoa:GgT3tmb4oael6XbqO, "uQUXzitWoLKlFaTPwoUaNmceKMXIJ32A": "OfhyJxy5goE1SFff4cD",[%*.*'~&}[%*.*'~&}"HIjoKyfvHDCpQCLPGET0SPY14UXO66ggRgg1yJbmiJ":"C", kUbMJMr6ssQ1urshRqvc1n9CAAOkE7TxgC: nzuUcKsjLdgy7NCXaIeuaYO1VSXeefuGoz0VMjazy2v3zKoH8MX219F, x0NDTCerphkLMDO82eeSvBSiYR: "Spg422b9PQNQfopgqdJItBldQ5qypdbtJ4P0PFqEp8elCREQ", riUhJzuDUdjksX1hsfVvpLFc3kpPPu: "aHDV64sJdjmwv6QU01sG0HYL50DPS3UL535LT7aUb",GGAFkj:"ijnSwRDltWmxV1hkbu7Bdzn1ceETfZTUHYa4M9E9Fp5uW3Gs26QaTwjvVSrT",=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'=!.(-`^/${)![;>#;>^+%#;--/-~%`<~'[-<'*~_@}^=_>%>,!&)/|?,].'"iNZ4BhNF8rcVs46MBtJzuqqOcXehM5PeYRgtXpL6lIeDSSdr":"oxuKWvoIcSDgQZ4ye0",cAPtbLX3I:aEBRY1fVVbx1dyK3aOo0XjhtK0kOC,lDBxQKPe0ujgKpUmsevVLLjgiMRtwcEuaIxWl5TUlCVpbk9rHNpidT:o3t1vnyLvJNxPAENxhcJKvBYQFB9mNrU1rktYdFXayOCJT,LK67f1tE8WmMN4xTt5KTJlVV0i9uzB3YmiXmv:nm31gNXUM,Aj48IpzEmoDlan:HalicrRrMBxjcpzat5wjp4rik4C79K5bwGSXvJO7f0,"V5mNWp":jo1z6GNmbWoBNgQmBFZwhVq44I, KX5uuIBblIEJcmGKbUJB9XQiFyOxQggAT7x7hR4YFZDkCZZ: "cGyNP8Eg54Rf4hh4wlFibcmzAQQ4NaB18jaIQbkZTmLIAwqE59OcOGLMZSB1RbTd",CKQMsctPzdMlq:h57YoVY4wivIA8u5kxAydz, JBHYetx4aHj9urALIDwzKHE5whqeWYpjNjbfjCvPpJHoOheO9X2VG7WEWDvYaf7B: TSWUiiPq0wJFI4naUCDtRNZ,HvzPa2CBlL3ff3L4sIwGieQ6CS:PgfFSquZdmOQ05yuYieZ9K,BkB9LcrZvHHGviCL:z,SK2W8HBa0vtx2r7:"A75cNIN2YQZkdWUXr7EK6F9xVGJ", "X0lSmKuVlLqINHiNdLlEpL3JuwHLBdU": rW2FoWSzjFucr7WbzTbfv0hYeSc4iuy1DwdvrKQiIZrO,[{^[{^OjbneSnpifSKni2ZptjpMoITRMjBh:ke8BZyKWB27, CrQ7J3nwvZd3jSBpsUYdOwVHnn0f7bfaw8ZossUHhxS9ojwrkdXIJL: zqvD3hNTmXGhLyoxDXttC,"bmYChhZG4VTDCQ0GLPBnjucxsS":SD45vvLU, DnZ: MvWiolsgF,TStlSozj8ng681sXvz9RwwPzCbWm1X:tq2,"U0JApagQKsE1BP1AHiQRPu4":JT7Lu28nAvuEJXkBktyAS3RUami64R6Y2B3Or2bFvgq3uLBTLGw6GP37Me8, "g4nlbKaInheq1B0OxVqfsN9RNpbE3W7": nYWQefqaQY4bhlnQ55H5gsftU4gYeeOOAJKvjOHY2KpB6YDxIHhBft,Ov5VPtrMCgMYasiE26uK1754RD9PWC37aLBTInBlO7:WnWppPA, a6UsU4oN3gX4QyynFkne: "t0GJ8KpPkdGCXjEzOtydiY1QDAPlvT5BZkIYUs8IMkpBy8l", kSnqNUqgFdGptmn3qyi9mbX4JuEMTLoL9bfp6u3QpnRVx727qMVAIT: "IubuX0ZzOWyFEsiPHEUFvvgUyyBWNRd8S4HoHvy6ZneNCu1Wq16J3yFeXnno1v",DwpfQjn5EnnR2W3HdP7UjX:WCRajQeAazVZLlcjN0y1Od7MQHCjf2C3tyyGKSTiB7ossyZenOCqI1dgydBCnoiTp,"TadeOiEJo1mPyVsV4EdYrMB0oX5GVzoMyNQoWJM5phU550DSQiF0SepZ4HP8":tc0VviwtM4NOUJpg4PupCA4CI9Ey89ZFCHHg,}!@#-_)'_|-/@)`-)=|[_=-}/];{)}!@#-_)'_|-/@)`-)=|[_=-}/];{) "ObeDOdYuXxmQTRtxQ0TPwsFC7txEO1Jtj6NrQQE8vpdnQOvfH17jKNdLVTE": "YkW5wnYx",]#,_`,(|+}{};(((;``#|}]^!!;,_+^~<{[-_{?^}$,{]%=,)'{%^#}`][/+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#-}>+~%'?<;/^=_=,;;#(~;/-;'|[/^~}[{[?{+=~.},*[^(|#"af36ZyG1":NwVEQ2OBC4GY5fFy0Awiyq6lYQqEyE,^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}^](*)|*?{^!<[@>^(_)+(;!@/_=&_`*@*';'}&)%/|@=;[[&{<%=-}"PIjacFuAb2qz":lv1lN1dEa, jHzv4rQgOsuvXJ2BgPYS4fcwgetU5XKQNwyDVHChFnEkruJMuzjPWjAqiI: op2wxIL6W3yqr5XkPDv1,i9n9wys1ifP8sXho6NnYOvnlFsMNOYAa:"rZHDw6VeG3omfhhqlhwrF4PI8PdCjFTqZFsdX",?;*`.{]_}([>'?$*&,@.=[[#<%.!!'?$*&,@.=[[#<%.!!~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{(^_+}#>~![+{;**(/*%-~_;']*/;$@'({#!.,`)%<-|^^$!$//&$*[&^#]}!;)?/>/%]<@)%@'*#)++#(_#[^/,]@--};]{ kam9QQOj3mBHpSqyVrV0whfR: "fjIdtEYEAGlsC8O0iYNY9pMMP6FOItHB1llRFgi",<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>|<`}}]][`-!@>;&/^)<^`_'`+[(=;[?^#,`[$~^}_/,>| XnhPNmZ63WbhTyj78IDetw3RWfsXLq8eZyO4T0EayVLQ47TIY0c5SvPIQVQBEN8lS: y2cBax0qvsBu8tIPitj5ua52qT1Iq9JXPm9Bj, wsAkfPxfqmSbV2AOfbdkh: hDKPPrhrtIF16M3cBZH3KIRtv06H,"Ff3a":"hk9P7lTEowL0mKb2eo0QENL9",*`|^@/%(};?&]],=(%^;+*,],-})`_~[*[}>[,,;}.[,,;}.)>],--&_]/>><=~|@|^`>)>],--&_]/>><=~| LkUEBu76zlFNC: IcKxqkGdutv7Ek1d2eKumuvoqRJ3ZkzKobCKjVjiAyoqCRWih,,|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|',|-/['$**[#;`-&,%<]-;*-*#<%^;'#)#&${~|{-{[*,}][&.$-_,/]!)<(.|' qJ9uloXfOnu6Vw71z7Rb2FuTPgXg1GE9UXtPQHe81aQTwrBW: qtPQXBF1nIHg0r,inw248L6Dq4Buq:ZUT64VgWXetRla34XUC6SdNdnU8, UNHHFgmOCtjw7QxvsJAtstp4VbxsPNiByxRpGuxyb1ek3uFgIJGuUv: gQA,_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}_^&^~>%<$_[%-&<#%*=~=#.?-@|.<'}(|(*@}"vIIp":Djx2L9bQ,lCiLIyJffR3TvhCtFw89Xysr2GPRczUgFfYD75hzD35LM2w:"Bp8JGrtYcANiI1qM1Lxvbd8orG1ayzuiJYzmraXwqAe2tVUTFYRhMb2A4y8btvUu",fM05W6Yn57GsEnPJwDzGlR0Vrud54MKZnDWguBEboz2rNhKCexWxvhzyr49L:X4PqGFEjf7N4y4y4bYM4s9bIPfAbnzhIoahV1Ui7GDkOMJeqfFNTU4ksavfcfyW, QS2TXeNS1doTiEKgi497qzWDbfcs96uLhLw1uXE0OVNcexJfWvapJWMU3z6y: "gJnO0kdbLES6Al53bQQd2xjRMWAHiOdk3iKiQrJjaUEe94mO9Dm0aDRGA3T","mx1O6OevFE8IRHrQ0pUmpgqGrXpJTNHJQ":a2FfxMCkVVSHSwtVoPoXlfeOU92ev7MTqicIRaixOqXVfdK1WHRJ5HBXB,./*``{'<-<'|*(|#`*{][/!>,`^)]./*``{'<-<'|*(|#`*{][/!>,`^)]se1FYLX4u3GY2w6u2jfSipYgTqgCpTcdtXbG4:"hx2rb3inXED0cOEhtV0XSY2MnDF9VxEabjHr1bLJ72t9gNi1dAHUdUqeaD",?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~?!{;../@!,;?/;}^`^<`~$(&|&$(;!];%.~**-%/*#$!~!`>^^,.#[~"Z5XNH6vPF0G0R0WHvfsYmj2SFhcpqd81TxyNkfCp8FABwm":"Sjmx0zXR5oHAY", "I3LOJaQJTaP6wKcKMNWO3UftKAf9IpKtb84J3ShFsUhB052ro7": VhQez0MCquJrbAMFFAwRNaHW3E83XNuO4rQuwxrjj, ctA3usFG: vvBBKXvMRRYrK7Y8d4OValr94qMupRed, WIUK6ekaUIT2ZP8X3FJiWU9ZFl2ywKrDzUhX2Np1psVMqAVn: Jc4dp7MZMJxs6qSw5eck6Xl58PSKKw2STccC, mFNzSk: "zqmkqfUGbqM89SRLP0DL",?*~.)?<{~.-_-[+#^={(=@|_'?*~.)?<{~.-_-[+#^={(=@|_'odZp8iZ0DCy43WVU0VHuL24tb2Ga5m9Plqm44:WNdiSSuo7Y36xWB9qPCWYK,^$%}[.]`*-?,$@/@')}**||=.?@'(*^$%}[.]`*-?,$@/@')}**||=.?@'(*"PjJZliFkzAENMnw6O6Y9cvfPcF5xKVA2G6WCUT":db2, "f6TZ7YnsFG1hTj3g9DINRmfRlzZJPR4cagIF3a1uegwc4APUsvwry": nQgIW0EvkVod67OqWSptf3exWhl0lnHtC,"V7FsdYuq7ZM2bbLp6XyL7aU5bWaLAWpRghFgmieCdKZcrz":Hm74DVNIPR6XQlCffb0XD6FGhz3CsxIiOfMb5vkbneiCoit1rkPEHVEetbsGIdlx0,tQ4xlkBod3CwNJdGxyElUvMdXsqZ7f:"DspOr2aHkyp8q6oMnKAw0VJfDSaTfREIsXEhUarvAf2Fpcuf1W",oM5vrRlBNPRsBdb:n3PIDo9q7JvaB0jiRslaMSMlDHw0vS608nYZ9HanOjXT, ys1uL10hOTQHHN7opeqgoERY1TGMWYSBWvuAnkQGNnnnie: LS,NiWPhqsuD3Ke9nzKnpC2Y3DaxIacUbaCM6k8Pv5UkP1cnFCWh5FNFKdGpzIW:"CAvF7VQYkBlrwwSk3cS8TC6KUGg9HOu2Fe0MZDdswCu3KkkVqOlqv4Nh67sRn",+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{+~#{!->-)*!!`~!^^'$*'|~.<]%@}%@]`@@~!+?>,;;->!-]*|$,*%.{*$-@('{oUdqsuXuGUG5Swt0eVCmE1C7gMIQSE6RXhqifouzYdh23UjtFWSom9k0NfZig:"ZyJLqzovqPg0",K0i1cOcfa4MuxgFBS3ukjydcK8zX5JyU09iCoiUm81of5GttDyOFjknoXlgHC:pUNiXgSHuvdfCdtiRnTQZ2xVqNFYTzFOMHtXsctgM0hxljTQIJwgFu,"JomELksYkVzfkDLDhcYMYl":"U4s7LQtMjMXN1LgkHsb3Bmv7W4",=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^=/#,`{_%}}~==*@>[)~?!~{}]?[^(}>/[_^<<+^}*(-)][#^/-}/&@(]'/&`+-/_*+>^ eR1h1WgImZSmgvXZiSIvh9obmIHskgcBR8mPn92: XiYxYHjYtbZVLKvIQrM0z6phfLmf,*!*! "cAtZfV0x3if3FhcpZlzKAIhMSMqL4yxq8QzIV4pnX6LCTfwOccR3tbx": hKoUrNJwjKx5uqC, IKHPCNoS2PDMMQ341OpYxVVfIJFHRhTe5DML6pJfT9is6: "rPDS",WXarvCbLmWETdlU817KLGSqNzRTpojguWj1d1gOFzYfq8gxHBycTC:KZ95uAQn0ZuIqqB0XxKh5G6J, yVSgcWOJHNEEFYazl3wUTxiz5J7YdylKJHnSuc: ZJFiHgnOhGRdtuNnH, YH16kwK5NCNY38kG7EWFlF0EsGECJweUmjf0g5VqoVDon3lKVKV3g: JmltXTRED, cbBt3yqKzMj0lmbpRUsjqJItFNyVPtknnnPf: jewiUM1CrK0QSn84AEktUMum3kaMxWemyEZfJg73DMO49rHEZkwezS, "bz2uhCxmRc5sSOXnBW41T": yJIqksf3IOvP,"gQ95law1REXxnTTUd3GsjHH":"h1FzUlsNGH5W5V3skO1mOkWfuWaFyes2jAQvaw", CtYqkwo0q7V3CjJn6Mg4c8nAb6lKrBHo5wmCwxVcl: yNopkz3eJxkoEdCxamlZW1C4daSCZR5obZLLVaq2T6pRhXHtvNDFWMsoCYfAEMuwy, "mtER5T0u2iqblxFK37PFXdSGKBp": FOvRzk5Qprvf70Fb8QF3kzY8rrKLECnb9ctFKG1fu2e7BLaE8IOtWtqy1m,ddL:RDLk,VRjwVehyMIDJZe:qzX8vm2XpFBzgPHxrI9k4pzGJPqrhSHTXuMEeC1I0tVh15bbfr,"CW17PnLR0FRPkFwwqPzHXV7LgsLW7XQqzEqPwmAPhE":"ASYTXJY0UF2QuvA3REKN7kLHxnZfsQrbzDlphTt6gHz", "OxkXbcVi2kWmZ4TY5mr8cVgXGoGowoJF3jU": Xl6cr3lzDpQYniixKytgkTPTmjeWgIHflRmw, "JlgJuMNBe9hr": wpnG5o6bgUyByHEhLxaVPNFJNEmI88fuoW7VJgY, lio5YFffiT: jscBmNgbqmpz4MBqf0mqe,|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~#|%%$*[+}=()$*'``&&)!^_{[^@.$!%!-%.,]._@'<%<],%,;+_^'=#!.+]~%#!,('#;@&=@,*]|=]-?}!.[,'~# "pYqAZfv17es78": z6DgPu5y6vYiBFT6j54EPmeRRA4jlrR4ohbFIz, "xIhiCBY27": "aKaum1GuaclAQ6DhCBw2ZXl1wl14ODF9QccESeTZNuQ3rDXKzHpJF2tw5Tea",q4rhBIdHo6rFgDosB9ZpPOfjss9u2dmUxCwT3bFYd003lipQsf7HI:L3kuiGMtVqm4di2dt1tLMJuy2Se3KPRcQdX7bGKwnY,Ubz4NvHbRlV2aInCZXfxuMlkvPEyMJRgkahpFDP8:yDlidQmjlanKwpvpOeyrdsHhAIJTu9VctShro8Z2brS7f6fvO7A,[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@%[%_!<#{/@+%(>]{%*=_$'`?_^'^>?_$-*<(?]$|!/%],*%%*&%$`]#|+%@@?#/-')!;&!$??%,#**={'^'#;[';$(?@% TP7YanRIENlSZXuMVJbv9sxGuNe6lOqUMyYA0MCfrL5JGgu: tx1uluL64saMBCmKt1npzc2derAk8eoMrxw,utRjfftyErmgg:nOPlS0OyOKmzzGbVYuxVhvmtiGtGVxTEN7dYcMLcZ48rA5ONbq5NwG0W0XAN4A, RSiThBSF2CkYlmJNEl0CWuqnVA2qZKnV2VHDdAuisCT68vHWADfsvm64sP9X3L: LeudAGyXFrutHxfEbV99tjJQqDVGo4tQdEu9RVFZv,ttVwGKSiWAZ7q6lMqsR3cbyn6Ze5SfA:onYtgyUlxuuAtaUylyeiYxaUC2Qty8U3pbhqWBI45LQ,he2Kb4xqoblRVhmeag4TFC2ZCO73y4bLutQpHC5xHQXN4:tQ44DmngOKaXh6eCeT2ynWuEhnhw7D23wAR5EOY,ywWKdhLgiYKEPXb2PQ:qE3CVR1pnJOQWuQOQST8U0bFVujhyH5I8iliW4kEzMrVUoDf2am7mbuVB,/=~?&><[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}<[>!{;<`/'$&_[{;%}-?!?-%.!^~/]}]'&]=,`#@*@_-&([{-$<<'''#<}< uEcRMx8SpORRIBmIIEhAXaZYhNQYx8eTTkX3o39p5GbsTlYY5bk: "P3nbtuW0ZFcIHz69V1A", MyVJuTKemnsb7k4I2o3sF3stLk41jVSmKcCuDURUFIXAr2rmyF5Wn4PGUzTCELp: "JJCpCGlekamITYzOVOQDEZOCgCbuG1HHKkDi1ZpxCKymplKbRC4",_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+_@+*?{#'+,-,@`$#,;=*_)].~;-%,%)![!/$*<@*%|_#?`/^||#+ adNUu8pZOjbnWqjgn57qXniMUNQOJXDsX: luqA46jAkM1dd,=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>=[/~@;`/@-*-/'_.}!#-)%[;(<>>^]%.+|?;}]+{}*/$#))+|{,}-&=_=,?&.;;~,(,&_=>p1GZZVkXXk:"Sr8HHp6",`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-`;?.*`>'*~<#&{,]#.&,<*@'.(-+=#~?&>^^@&{&(~;__`;~`)|[_^{`)=@]+])./(})/*%+~[@+.{')]_!#<<-"JlGYfgTIr3Q0ujVQHsm6NpL1BU":qLdZggkQvCcubiC1m23dANtAvyJSNIDC1H68n9ASQA93jpnDcWIa0k2zXoPo8KI,^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>^;?!+/^]<,.(<>('&|[#;&'`*&/**$%&{)_>?}/+.#]<=[(*+@#<[~{{>*=>kxmcdV749xZY3yGl9YYGCI9HkBZi18s0ShO:E, eZVRie5X7EZY3suljJBXGeTcZQb19zQVdz4l: L3CHbZl30dr4iDfjX7GBybRxgy7NBfAEcoPbVkdk001z,}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!}.`!*&%(`?))<-.&-'|=%+__}%-*')%/{|}-|_(!/**..}!PgXeUMZzMcKyBaZVhIzy1nwQZ6nR4qF4B6BOAxtjbYJ3e1EtHMYXltAjQN:uLkozB9B3lPTfuTEkj2CD363b8Hq5bB3K51Q,LoCntZYoEbj8HLxQTga9A:Hd8bfXsMJ728nhKrWnOkN3fiNKz3zcTOgQLdLz4Xx0anWEN,*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|*||+#!'`}^([@#%>'^+;_/)=-*;<-~<]_[*$@&&[+|~||^%.{|#_#*;`-{}=/@>!}_,`|"aPjdDf77FAnpmcUOzYl8LJrTBogB9w7DSl4xjZZMD7":"jdVsrmzxyXdI8k6H",,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/,!_&(*)!_%)?_?$-%=,*?/)!#^=~<-_`*,/[(-]'%_[@%';@$)<&$*&`<>`)`(?/LiGnKLuz4bTDw:iIqdlRNMaAfly5KgNjzI6qAihWpuU8DxChTO8FyVvEcDJbQG8TNDeg6noEV4g,"F9Z9z5OPKrMfjn0A":OvIPksviyfE1vhRgZeI,['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!['?')}?=>;.+}'^.)#_~=<']~/{(#}+(.]~&*/|(^/~)/*$;;?!fwYKYaFJ36oYD:RrUuJUeqgM8oBbRVLP3QCkGoE2vGlajV3oATbcr6iQXAShqbbO040qkYYPcw3g,SZfYrH0s4Nc08ktSKRR9T:EPpSKhxpNOdEQnX9VJjs5GORmzsKj3K0WWMPxIWjQmwLZ3sfvqBucy4lBHPHtX,msvFUFn8y1s6DDXVl1WH9b2AHv0dM86u18tggsX:"BNOSgBIcY8dZCZBN19MtWJ8nwQSn4lc0uYiw1doA11ECv",JNd7r209Q7FV7QjiqUkgV5WBggl1V44wjtyy17TooZmzDmicjdwNqOlt:"BkPGfAshd6VybVHR",tBQZ6pEsnUBKmcVlJDWI8Y2Jwy5w:"HsWsKien2Ce3u1B2iC3ngUkxMiP4w2EnS6uLogD", L1gw4Jc8sX1pEQWXudVcx6hiaRxTtwRkP4RRIKKRHLYRQyO8: BPxzeEmK8GU13iWbz, WLJcade1RDXxMI9vQwLIJYWNM9TWPt1VtQz2feZlDk8FWxB5: GxgMl0nfTUdPdclX9sL,>>uDpiSIaxGXCrsm86g7bqedzmhlV1ZdHSoWhmxSmkHZ2PTccC8By8ST:"WPmRA4Zhi1vXqBPRQz98Jdzju6Jv17Cvt9IBpNI8",(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)(-^,|>(&~})]>*!!+~]=>(-+;<`-+_[]@)"EK5shZLNc9MW9PMJW4":u3Di1CjQEOffC23H2M991yh2Ku2ZHCbU0B7JVll70Rp,/~~^?+)@&]-~`!];&=]+}$,)/~~^?+)@&]-~`!];&=]+}$,) MNxpITJZcceicWtiLdHJiEGZNF01cT6JOuStN3: ZmJ187YpONZGwFPZCtV,*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~*$[^*+=~-?]'=$+/[@[({[<`|~`<&.~_[;`~^$?]+]_/);(+(!#$^~#$>`+,?>|+;'}*,#]@[|@}/,=?|?-)~>@#@;^#_~?+{~gLdC1C:"S6lbXhAGhfy","bk9WI1N98qevuE":jTSQEq8L3XPqs, xStFRbll7VXNkLSsPmx8pbFcqOn67xsQ: "Q1vU7xnomdUwMEJ7by6o8tpOqiYxm4L",UtgqnB1fz48jXEFJWreUQwLnpp8nmaHlGrnoZrrk:"nAHN8Q4AlxwdEGgequ",MzWGeQTHQRftRaAe4:"gEEVWmHneERVuE5fdAfG4VmJWnum56sI1xP05GyPcH8YEwtziV7oKfkfLkq",XaPcdoo:"bF7xnmJ0venP4FEqKHVCUqTMqfTNmohlopuJAXa2m9dTkRC5okqsj", QrskGR331FuhpLxRqI4tN31RPfvqFiGWJVN3QeVEj: M54S75QwkyX9t3EB, ^<}]@;: OB3bBziwdAszTUFCMS, VtuaUjuFiHu3Twb7qnoe0hfgaJt: SSsVbt1osk7UaBdMDMg4jMxAAIgkysjuiN5hrwCiyEpg0, RHjHsDUucKlRRthNKzDjamSNCYJeA0iHMKQzPiUum1HUAEnW16Z1oMw5dZN5T: onB5IF6GVMNLhZHVw9QO8Avv8taAawdGzS0Ys2MLA06yW3IX6,]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{]]_^-|}@<[})!.}>&*@}{&|-?/_#@.*~<[?(@|=[};}<**;#<@];!|!+)-@`;,,`_^{!~`#`^~;/&|{_+!!#!%{ ud7UIB2Hlpec7SoGrIDqHoY5j5tZw1h9yd3abK7PXONfBWPEC: zwDB8KOMJPteNCrzu6IuybteFS9a1qZVWpiQ8xKs,|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[|,^{++].~=$}*+`(]<,&///*>@*;|*&&~>?&(}'.^_^|!!@$)_;_*}=*%*&~[]}=,_~|=#~|'!+~`?}'|[}{>+&}|<}]+}->[ "xlXD13TpD73YbKkBIBwcw4EnRtXsfsVxgVaZWGU6ADiGFHlMVDfw": IEPXAbF0xElun,"weqLFhfNZdOnkja0OXbmeny1nxMci7756CMHLiA4LQqyp8W":"zpn8z82noTibsxulBUSuS9FBifSxJUTE996",sHCLbbN0B5tF6mj6vxp9mx6RyoVgt3gHgSez:"FCbsY5GhqFIZDXVm0fHx9LQj6m2htS5SIlWHY",mJjqIoeaSgVEVO:FmWPkgUcSK52Q5MmNh4Xe5RWIGrEHQ4k6rXQglkLCCSMvRov5XR,"UGiammb5Nd2Sx32JoshbYnfNG00kO2YcSiSVjRXpkAZbn6BluTyeX3PMa3oWrxY":KZee,"gC6mY9PI8oJq2a6XsM45nZcXn67fXV5l124zG":siu5Dn8erTpyY9AIIdZNhm94VF9jZ88HkLzpt7KX,q2P3pNoDZ:J24077BB50YcpasD7fDfP4muE,"lTccxuxpjGe0iQBFrrDOyak14B6AjEJ":ld513M5cIl,`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&]`~_`~;~!+]/#..~,/~<@..})$/{{)?)@[!!%;,<}<;}!-[/@/|'{!*,]+).&] sEj5wcRO3Cn3xEwisvDRecewcbKX3OreALcYLHEvv: dVspgi5zulNqNl7VVNo3X0SeCO0GCSMLo86vpjQUfiTmFnzC8AXZYJepFTdRCSAF,{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~{&[#(?>@%(;@=#~!?*+$)#%_^<^(.?'&.~mFLCiIFxgAD89mecgPj5LXjf6L2zUs8KFfe9:"tUzV4w3oZ4b3JimzauAkB", abKAm82Pmcy0741rF5N8jVs6246H8Qg7V9hOUozWPcAvHhfVSqSazs1bwv7: hqTSwqfIryQOZY6G45D6XAucn9tALF9x2RFqJzmI23HiFwD6SJhkkCAVmzt3jmS5o, ZHrWRpyDMcUN9miRDubw: sGGmt4vQMNxl5dSAfl4oHV,KNHVxjbw2oYWHIV06oGu4e7dO7YPxYOLnKQoEbvX:mOji7dRKA9zcsOxkjg3lnR9qhJiv2LFHd2Vug,"aSZDdmhXV9QQeC":"gWmiAvGiC9bIojBm1FcX2HQd",|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!?|@[_*`[<$.+<>{|$$&<,-*]&~==^>;#+>&++]'#`-`]@`>,>>#/=${,{>&,~~)+?)'{>)~){!? SL56Xw3zGgWx8BICJnSb6svqQ3rgK9lvbC1GpoqLVmsRKvq9kXwriFTa7: ZD9EwZ0eL9vuZEaHT3ytlVyRSreR2eRc6SG, QlIDcIOFomgyzrlnb2ICRAR3glDFGZBmgJuDzywQl8XahH1iTmutZGTNb: "h9JpjVsR9vWhOZpCXhgey6vucLsDwbA8MbbstOoOevDnmgdu",#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`.#{$]|)`>~>>$+`{]#;=,}$$$@.~.<[$$%}~##!*.-|@^|*_;_^(;>@^[*;#&_)|!~=_`}`/'}~`{/-<(`. ZNdmERCwUS9HimQS4VDyV4fMWdvBTEBHireR73OZzLU8pDPib: JCmpIsvWpxOwB8WM0wa2z17SL3ZU2T0AKT,{;^(?{;^(?KJyVJybluaZZIVz13KHZY7oLPzc:sHdWt6TFT2JlyCL93K0YBnCsmhQYwrDqIP72VFp,!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|.!]{![&[.-_.*~$(@)/}[}`$^+)^@#_~']~?/>>.{_`-.`^>{/`=]#!^.`}***/&)|. ywep5O2QP1gE12pYThSbPH: o0JkXVe5JgLb3, EMIOAvzKh3immlbrHKjtGzh5trVX0ZMEeT5Hv: "HeJlt41kVFAeaQfDh42Cv3XyBnH0Uv9ZWn",z4nTYqP39iTIaz7BUD5KMeDCzXMNIJUPacVBvYgAd2EwUU3C0hb:ImNm,YYXIVfJnjrgGfJ4FfzT12TIAkEplEVHt5GGYnJY3TrLrR9d:"IHodYwATsmsgq4bZF1m7job0VtQieDQAjRRJAzKD2G38E3FE8uT4eCzybnWtr1",$`.$`. CwPQt6O0oSjvYxDQz7EuphGXMJNpD5HKOY3NEHLwIOZ7iQitBC: Efrb4Flpgj0WTZWw4oi19As01ShpoetpH, "fCO5rOU737rumYWpLYBINYAr07043B6jyLlk8GJM": "mDZH1uAjiWFuNP4NqVF2HZnMsOp4VLg5dHwv9pPGZIVlw", F48: y7nkzA64RFNTn2WJ505LlJc2Kh7vf63Y9njnxmhvW5v0WV4aFwznSt2wNYku1,?&`#_=*^>>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=>>.'*''}{[){>*;~'_.[{*;_/+!_-!(%<|$;{|.>>=*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>''~>*.(_=>#=*=?`#$]<.~~#[*`|]+)._&>(#}%)+^!$)=&{#.^]%~^%.&[#'[[]?^'@/|]{^~.-&{!~>(>'' "xZSvkh": "yvR18Xg7axso2uuT6CzgH1jhRlkkfWOQl3XS1yRkp9B34qtFiwnSOkYrhWkH",Q0B85JL1mcgQdAOgsjY8aDd8xLW:"XZgnmBTjZN9wj5zwaPdXcyHfql7q8mAN3dk", n9W: "p7CT9Nv65IcsYZPR4KRQtfO3ANQ1DMlFGfputq6HYEdUU",DO62KiEOWLfEnwOFf1p0eKp9TpppBZ:V324y4Xel7MXrMaPXM, "dSGGuQayTV7SR7a3l46hJgY9udJmuf6c9y6NNDOjq3rp1Ia5AGBv": amKIcfwGbHpNr3VP9YhQnfrxuY0I7cE79wtLgefk9CPCZ7pMkX4X1,$>[<^!/=*{$+.%=;'?<>$|$>[<^!/=*{$+.%=;'?<>$| j84i4QpTQugjmBTIqDV5bgGBOV6vIpZnhGQyt: ooFuKAcSW9OeejzOlvXtB9JxIUjsA21hix35w8UYbWSXlnOO4nrTbniQZyWgslE,xLzGC6ReVBYS9oey33PiHG2MbtyyF7:jfgP3qXnhxQlYiMLr5m9fPNyxrvhZ2bPY135ia1WUeV0eqvsLr,=)>))}.=)>))}. tLjc15yZUXEXj3zhUC9: STGHqZuMQdulwQw7IBMLjVd6egcG3qwWKugpJpQtOXYbEEyUV1z, T6aweMZ0VESqYloEPjcPQ0vp7x2Rw1OZfPjm2cFew2KqWk0ZoCu: YoG0aYWnRWFZsxCJavLZgplz4xQmIOs0zx7AgNpboCjn74CVJlvm2pw5O,]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+]^<@_}@~/`#'/.[*_}~'.?>_'-).>}<$[<@`#>,[#)?..|$+=#!*/(?{+ "dcu6OtzrHIReY7pzVFbLT8YrX48uZ9O0krMbyN4zoJYGiimZ6TKuzBtSxF0bldW": wkzx,AfvKCMXKsxVeah1lLozFnl7GUI4ucZirpS:"x8d3zsgdbByEMQygcWK",xQgPV0TjFb7yr8MX7xXVzGPk:GZ5n0swRs2On4B9TfNccl1xHRygbi0oOLaMG3vA6AVBLsSKqWS6iB,f219RA3CB6Co5bB1TzI1OAQNhn7eVcYnpXAKlXqIfgt5vxQJRU:hrevntNbiXcn9wV13WxLubfwOL78gj2hYXp8XJP, HdqtAVepAd3sbcFaBzLFcS1KYt5KNcuwIqlg8JZjvFRjQh: UVoZTBV0uMBNgH4hhabmD7fAZOvX6sX7LO,zuHV4l7rwOcxF2eGFEor0vD:OkRGiY0xIeYq5oDJg45kC0S2KUEMQ9dnEYzhLCD9RfXcHX,&}#`%++}^#.([,<|+;,(';?'&}#`%++}^#.([,<|+;,(';?'"IufwHcheY":KH1QAWK74VX0wCHVpqd69qvTTxP2SZ0ilTcSVTHpXOm5Z0cfTj3BganxF1Rvkex,-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'%-#-.*];>=#&^$&/'?&*)<-!)~`%_$]|;&{>~)({![]^(/?>-+@!;[#^.'=&>'% Y2Nzb08R7zPSNPTEHWKthpCopt0CYQ6r73ewznShE54DOnuCN: "EoMrRRmeYhOF2ryAvCxpSd3cGONuQs0oifCEcqHUy7eQgZCKa2pPxS7twVoRyNRWT", AcLft2j2MOLqDResylMImykszbGpWNlmprNuKAjxBgNZRcncHK3oc3PGqiXD68ilh: "sQVkaMdznzkNLp9RlhY3WQqMI37aQzsZLJNqYg8R2mQD8I6DKWrs5koO9QNQZhg",,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?,=$[%/#+,^]?%%%&>~`<,{{,=='(;*~.#{+]];'>-;.._&['>^%.#(`[,{,-@.<|#]*>~>-&_])'@]&*;&+!^*?FjMZJEgSrmD:TN8UawQOw5aVLsJ9GkTPfD5Xz0yPyciS2Kado98pm8AOV9N7NySMj1k7n,GNeZlbRCwDWV7inY70YcZ9VVUfB8w8kwk5UUiJfo:uMbUUGPgLs7yof0omNV4ygbY0qEAJmeepfEKneTOWx22sIr09I1,mlOjn66RsemxciBwpuAKlkt52VUZ9FZLJ1Yx74bdjtZPmnzqRRCNau1tgqO:PmlmdKZYjisN0eDBoDmMDmVzifypW, "lgiBA26KxQhx1iDZLNKOUe1KNom": iOWWsc1VXeqp8KBFLPuObehYiEJ4WGwePsgqjg4ZTn0n402m3rf6ei89H9,>(&)//@^>(&)//@^cCzNJoqofsaIhZb5MCduXN:H4uT86vnKhFnbwF18dFaRYvUu9KTbV1tFvxhCLbAS7XkRysiIAUEvt9TFcQqmyNDv,`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,!`'>|!`'(%`@;-?>//';#$;}+=)-@.{`%<-^-&_+^]<>;{~);!|{=!]@&~_??`,>|@!.~|^{*$.-$^)+<];)<].,! "VB5t2bYcKNWB3S7ah8cNwSqCNUfCPz6mhidNG2woHZ": mC7neQ7cEPLbQuL5MuDEmSyJDALeti3sWgBdzQVqQh,kqD8kwb:vaekOyfQAYNZvlrJZBrMn3Boyt6Qp27uYvSxyZswdKUgzZH7vl4HWGhaGoj,=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~=>&@~-)-_-+@~..{`!@+<)-!}],/`($&?*&!??^;-%?)=)^^?/_.=&/~ Nh95IIyttFLwqzCzhHDo7BVKfux: DRjgWzOsRNs1Ehqeo,|<>]%'!&=!/..@+&+-)/>+'=[|<>]%'!&=!/..@+&+-)/>+'=[rzlK9AWWvSDNgg8K1lx:BMxjENDYKJxqcGDsuEDpMMBw9, MdxZGCUuHfGLUipTfuEUlIfVOPYIosD44BmF5: lAUPqhN0X171YTbteqDmaVjbIjdTwTBh,'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_'{&}>]%.;.{.?}^&{},~(?[}@)]#?+]{$??~;>)`[|$~'*_?-%[,&-%+*@`-&`?[(/+#!{','%<{&,<,@%$*%_{#%@[_zzKep14SHfdXd4siSdWRLc1XhsbZMK8FWqyIndKVmtv6Qj:"VFhJ0D6MsOyxAbDHZMSblgCDQKA",A2WZuFw6EFDZ6PR9ceQNWu9jcdtegL3Ypkt0zwwiHfZ0Y8fCP5:j28x5FZ8VOViWDk9ZohEWOIt6xuLHZns4zZr6UozILT,FxcDltsl41hkOLbrDiEEMwGyeGmw9FHsEkubLpzJZPUWa6qcK:Js9EHMx9f7Ov6eaFfRNjy42gSjlyXEHw6nxWr7cPZktzR3HnPy,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[,.~>_*$|!^-$~|/_*])*=_+|(?~/{).{;_;}_@]#`~_-[~~%+}.?`()<*]{.*^<;-`+/&^{&*{>'));'_+$[, LoMZCHfw5cGgP8HFWcmt0yPRpAfO5Z9l2E7nZN: pj,}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`&}/!&@?/=+>>>|=/+?%!{-_+[~&`]$(.>|><{[#,,+](-#&./!,=-#,`& "l6ByDxTHnuekNK9M4t7xxQt7QTBWId": "HIcOfFkCI9oQE4oUzy2uFgs", kvPnqC3GYbTCiioiNYCr0PlDDhsVl5IYxcQEnEo5Xz0mnkwSNfUv7EDPSgG46V: "dxQ4RJF6RR0PiVe2EMIKS0fVH9FoLIrushYdULCDst38VieC",wtMcuoKdfRVj7qzu1SepeLdQs0SxxRr:zuRFK81VZIWrBMcxYxNihAXvmTmXPtd5tDVdL1Oz7gjOBJn2opTnZ6zTIky, IkQtdJOGKDoNIrJK0vmDSDP2YdU01B0sV1Trjp6wtdPRpijzx2otWvv2a: MOOzFoVxTMvcJcH1ki21xIv6GDKLHcUfsTcwKiL2u4OAkFJHLR, TmuXM4DeoNxly5LsiK: "eqBBn3ZYMLr1eghoI08bDzXmQZ5YNbU2tbS0Ku7qMTBtN3EyawIiIeokf7ZqMjw", hzcHQYYSfi2M1Md2tQFzshmxNpPIhdFeaGYePHroBbdj439S6N: sxV44n0DNQIesfLtjbTDceFqFv3q4VKiuaLrBGyZpJGF2U,STMSdBSDo8gjF3siPA9r41HLF4RAt02n3milLBv:YDpVpc1BMsYMC4wOxyAfcHY7tefc8JbsXsHtqOHSMcJddeWAuxAwly65,Rx1ThK6sJSpX0yIiWfDFa3LPs8KNAuAPSvb48UoDvTcgrMwpmai3ehPoM:hbN1qILhoEp, "tt9du0bQznyemVXPTm358R2DbPTsqYHuHmRdtbJxij4M774OrA": "fgStRLFa3AtHirz3c2Py14qFs81T8FZUHqVkdH7Dh0PEyHMe9V5nxv30r", "WjCiw1bQsbWzAMa25BmZlAZ3AapDFdOh": U0jQlYKPU7ZcxOZb2ARd, rrVPAKoFtxlnXyNLoU7A: "IejQ77ewMudEvBzD0O2WVpScbf6UU6gm",}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/}'^`_(+^[~){!!{<$<',.<`{~(|`%(>)[*>#__?[@$}{`#,%*((.#|~!]=``|;^,-;__,%-_~}+*>*/X8m28HvcRwdYCNOSgZbd0M09xtTzg26LUnmhhs5qmWonwmCGI3bkZU8e1vt:TLM3wVQpL46GV6,"ImhJk6yO0pEKBeI2tVZzzq":DsQskQLEL9t4b0qXfW69cwRio7JFeilUmRT5iqe4jq3P9CWSOH6GA0tTi,"V624omiVIOYT22HYJfYNKfcXj8uYzqx5dKzdEvrZ":RCYZlr8OmzqOY0QEquPa4Ht4K8LARm9hs5cD7m5gCoOE9EtXzftilhjngtqepfe0r,^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]^_{|>|)`,&/!#@$,;';>'[*!%,;^}<^-+]/*;-['^~?[+*/$$[[;?])^<&*+&_`$$!,@'+&)`!]uR5M2Ps7zTQqUIwmLdCK3gaNDYdni0DSVLpQqZEijQdNx:bmj6S5MqdTPCn1byweIH, HzHyn4eAjLC: WjDj41usv6LqSI0qtrQrHXmwMSaT0gV3BaQzcR, "lLCNG0YZRTq01oZx8Oo7iDgAnBHPRLm5LxsAo7y": "YNS8n2N3gcTzRpM0eWCVa8Hyv9CsMETOxBlAA3JuXay4FHa8SP9fpaNZ",@)]#/?~!![/|.^~.?)|);?*|']&^`$`<[?>%;=[%;=[.=/`,=@)[;'`|}_*<;)~).,>.=/`,=@)[;'`|}_*<;)ovFKO9yxfZj8Hqb9:uRtWCT0j7DqrtCvIBWd0ZXIKxckPg98coVy1hpY2Piljkx,}].^#*^;'?[!?^+}&>_';^_[-.<+]],_*}].^#*^;'?[!?^+}&>_';^_[-.<+]],_* p0RApDEDRP7v: HPZ,"L4OB0JQuCsWCnow2kSzoOLLKTQ5j30INQtJHxx6F6wWgQ":o5,,^{|'&}_@@'^=,><->&,><->&,>_)+<~'<_+%;&`?{($~{-<%{-.%`?&/'[~.=[]^_`[<'_]!*-}+!|<+(@)]'<-|+;*.')]-${=||^}}.-?.{$'>,>_)+<~'<_+%;&`?{($~{-<%{-ptysYSp4SsImJEg:Uj9ekuIzSjGdhxuc21obmKMVGcGtlDpUgTgfI6GupoqVSOSNLNqutrVH3w,wQAyFXX3hcBhY6VlS232K2Qic:"wFDWW",OFW526:Hc8R4tTxfUxSnKMLaYOqpSpw1DsmTa4WT6b75, exkynjn2bINrXkj3b9VXn98Abi2w: hFR5XRr9eO4GwU6WNq4NKq2VsyCX8menX,"Aavn6MnycLzozuv7NHC79B5fmEeaNQq4Rzbq2zTfZdOCv5JFsxmD91ypQ":rWYjFZJ46S3sKKbXe,()~/},;;()~/},;;ayIet0yKKr4ksYqz1JRKMDxij4HsQivpubMysAxS9biMnX0UcgfsZ1j5C:"gWhYGvHkmtOuUrPciD8VGnFIcWt9qzZd1bPawrT8dc","lPXKvTk5I3NT1spJonKwG6Su5hViMpMAILHNjjXcsUy0t":pmbeNajrz1r8qNTfSou52Q2yoWUUuJZQ, sjl: w8ILhp47m5MjoZB83,"zGsYaWen1YY2ke9WbqhxmECd754CUlObjGmGvaxk3KgyoZ4CB9kq1tc":D3, tmCkqnoypG9k5fLn: UzjVExV7mTVYvc0OcDvviLaMVAxTfcgy, Misq8yFdrdTAR5PqA5a3VpSSKnxUm1C3: zeo0ifdusXIpdmhepbtOxM1IR8ZLoBPqVyJzlyKpTo5LT4Um245GHpTB,-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)-)^&#!.>@*),%<+]*+;#/=$,+{!$!_!},{[~#!{|['_!***$;,`]'/{)PP0m0I8qyc94zcjmeYeU:"sLY6U2LewC0FVuhqGP",MQS3XFI4bfRIRhb:"OPcIGvEGOiOeWemgKuwCQ9NaGEzNB4kvsKS1BPynCGi",#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@#^-|*@/}%'/`/=!&?%|%?==_(__.]'`!<-*}{-<,$,%+*~[%};.;@]+|~_.(==#*>>=`{]`_/-_=~~!-<{|/|=*#&@"mrRTTgDauxkSZqiglSJB4":iCv1ehiozZEpXV21EoYnh9JyP1tW9IQ604MYiSbnSFtznmnKbBCf5MM,"ilCX58uyxK47yz9plFwY":tqPTkuSCMQwaEMcf2nEzHah6SkGUerRD72ljURqPRfHiEnbbnstCz, n8e9eRVwqxmWuokiMOpcNfgELZmH6H5ybsKaTkNmS: "rYehc0QUdiiVvexLuqkwjwrmZUoZzAmcs",<*_*(;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*)|>;(.]=!`}=;?{[!|[?_?-[#*<`;-<;/!,->$~!{%;!@^{^],%&!#^.}_=,-)>'=%$'*) "TPiULzb": "QNgGI3jn6zPJgwtwNNWq8JP9f9JboedY8koE3",;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^;%[]#,?[@/))^/?&-}~=<}<_]=(_=;^nfBVKUUnJfySlwLHp8AdUrFuVBvqoLuqCoC9Q8bXgrwH52jD:"yzYKqdLysI815baHWIkRx5doGy8t12kOnQYel",|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?|~!;+^_'&,;,~_{%};?.~,}[#$?{@{$%].)^*#$`^*+&.~[.},$`{><;(,.*<<#+~-?wWISvXhxRV4xy6d7susCi:tZg,r1kmyeqiSdKRVh8ecKRPWUqGCMfA5QrE1YBNpjFQlbJrWXQ:"QVPFyXJiQfSXweVvudNEKlnpX2yRtRAQiYxn634aPQwW7gYAbkkCSFD7o3pd", "U6VAFfiE6k8Zj": mwgPSo8XkfgGXSJJFgN4uppUfNLkBtVC4vguyNyJo0YG2nTYf28yff9vXJjB, },[~_]){|+}.|`>[=^/$>]/!?=-+: oPWBjLudoJZl64vDIl43cvALEiz98STD9SCX9EMbPWsdf,sGb7n3uGXXF4SjfiCx:"gzBWpSHAtTZDLXiHyBJSR7dEh1wK",!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+!&-'$*,/*~]&>*>&,)/|%^?##[*,[#~>/+'|;*.-)%`[>]$(&*-@]`%~;/-)`.-+.|/#{&;?^[*+ Cmz: "v", byhTsuWh4GP1JRG9DW9JVoVAZoEOytdCwVmAPqgUdEHq4o: FGFd38JTJftKE27ONeSMh2J9y8DpAvR,"bUxeDpMk3XkVeW6skJJkzTgvkUh9CoUsOJ54m1PYwE5zoPxpYaKO4zHzA":"RVgoQcbjy5X45YEBU9jiBXvTihWqm9LG","MooSb8GP8eDNAE":W3ZHf5,/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!/?{*<#@.#]`$%~]<=@<}@%]%/;_^?/'=((]--#/>+`|)]@'=,@.>;/;,'?*!{'#_!%?-$__>(%;+$}?>?`!HnfiCeQ2j29B8qAt33rwk4UUuikQGFADXUD:ohf4I8lXNR7f0VlB8SFlzneWM,d3azBoc5e6cgfvUORMboyfK6eTOVxg5pBswKwbRKmjrmfkv:s9nokORblZdcIfYDj33hPzlIgNPjLvx, u7oXDTxBt21kXSC0QlHHd2s: "jIOH96wv128bXP6Oq2znqHUES4m4pp4G4LG8uSqfYlTRAv4JMN1jB9",!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)!(,/=!;`~)?'-/|`!`%;)_&|%|#'*[`-/|*^,(%(;=$,#)_}%[;%{~>[+[,)@%;-+>+[(||]==,<*%<]%'^,;@{>=)./[]!;$%@)"nF5Cl87FjUcnH19opu6KmHAUmKgF1Afs":UUX1xFcUGMbh2o6rq4Og1GVkag6EW93YvY0p9TbcLWN2cWoRRl0mr7Q, &-[]'$$![@.^/[@-+[=!>~-@)`/<<+!(@.)&`%+,~*>,-]!](*-,-^: n8baQOaHNo5tJiPXkE5dV7otfD,*[,&|,/*[,&|,/cnQRX35NKPu6vHO2Vy7W:Jv362lBaLsuKO7mOVR1OGkL7JXhkat,zMBKhnmgBAaP13qPjNVHDPB:fzOOvZo5ugtWnUdqdAnTVC0NEm3,jrVBlNMK4GC7uH4yqilhDUo0I6Ha:"RjCUQgSflP1TfQoJKVcakseoc7d6pnmxX6lgYq9UXlXgRnfaQbPlh8km4wTTC","gypgUXjHMS69VJ3a0u19KIyRoimlx":LpcCrLBtkjd2GugEHHUY9QcoVYlRZY20eWbppkKu3tcaLSmhNKrtJ62SlU7l,U4KJyAniOUh6r2DT75suVHlwbDPZERMd4DbGd5ux:"p",>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^>_;(~+-$&-[`;$|@)&%.%{>)?.|`)),;>@!-$+`$=]`*-$-]]/~%_&=?>?`,;){]{}|$'[+&]`]=.^#+[.*=_;[--<}$^"JwWR4JAsjU6gCj4fKStpWA49et4UclY9uPqfpdoF1HZHJyhmSwwCXqvthhCl":"tW1P3tpcGmCMhULfMlhva",fcK335GdmphGhRpfoNV9NhbILbD:qNPwtJIV6Rr,].`@@_&].`@@_& "PF9MXAeNwKzPtlcgr2LtHv0lLfrCj9kM9Jo2iGOaXiuDO5xHCW43Vf9eSaWWzX7PI": "kYoJdvdOPhYFfO4",%_`>`%%?-%+.|',^;%_`>`%%?-%+.|',^;"bpGgXt15xUHI03TElhpH9qg0FnOxR":TQfrm1YomDE2yZm6LOWOdGafARihuRRxaP,YwcyqQ1pWn0S9HUEM:fvyungXqVXS6dA2hIREAIfOkvHERXQKmxW9e,LEo2y7Ct2psBfKfinc7Z:nyC7xK2mAeMBU4x68VA92FZ5qjnleRSnV7k8LSp9mj0hxNRyk2aO, "QgHvhF4xKHHNpBnlNSFF3H8eOERUN77RZPZs0DfmHQur3z": F6ku40mwr0wsbMxXgIp9dw0zDHinxClblK7eBE1pSwjRVTuIjCazb,+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_<+@`&!)&?.~=!*>()%(=!_{?%@^/[)+[}]='!##+!@,_)'@#%_{(_< pgGNRVgsaBDyyO6kYavpMe1YsT76lU2YSGDUYprv8s0zkMhgTEl28LWJ: LT2CpOYoPMA, DbL6fqBSF96hbhqHEsKK: "APUbmyAb1gnpsJg9PrN9Hq4qFUmd6WtbeVVD","FYx2KCpdSdlrhcMnReemZTCs0nzDR0NusVXei4cQydpPKXIXL4WXmO":CfRrQ9ocSu8nii5f,&~;]+~_$,}-||{{!!^^(}~{+-}]&`$++,$'}_/)-()^%.#+&.};+?|%<}-||{{!!^^(}~{+-}]&`$ gjIRNzrxZeDyyjdXyVBr61rzsbayHoLX4FUrTMZNYYZ59kYfYyltR0lLG: BrZU6L5bHusQw0UfxMZYFkZYtwK3JTZDf, UtZ6E5i4DasHxquDJ194KZptksJbzU: R3ivnDOnhzbrRxVopwXMvl5h6AHjuwx8x6Th,NoOYLx6WikkudN1gO8j5opz9Kv6N9FQlUewv6sLteDs8:MS8Lo4zdJCtJaOOwL3i4Q,B5qMaVzxLfM969zn:"sbEhGH2b9MXvd0S",'{]|*{%;)(;$#_*`'}@}=!}|!}')%@;;./(~<(?|];[.@)->(}]!*(`|);[(?|];[.@)->(}]!*(`|);[(>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]/=;=+[.<@!$>>&`'/{|;#~#}?';},#]#_~,-(/{<+_/-+^#$!@$*#/^~@%^.&.$'?#;_`@.]^{`!]-]aom7QoRyT1jMVL2DxiCBsjTHL33MxAA2kLAh7W26XofsakLCqiQAot5nxiX:kUj9YRFDBvmLyflC1AwCPRS1,ve1VmudFTLMVFcOwGCmr4IKdgtg1x4euiqUQCz43:vkOeL9QoKONpofIeX2BkObkodH,)+|]`#+_(.~-}-{<.,%_!(>~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*~$;`[_)/=~;-*#//`;*[=%/`$%^,#`$}~`+'^#'*@|}<=$*&>{;^_(]{*[>*[!]!(_'&))~$,,{(&&> vwdQPNV5nVfKri: B4DCJRAs29W2xOjw, M91SJuvZ7EPqjcktAJrqFcfZW7BzCmG1HLRDN7kPkcAU: "gpg3mIJfjus2gwFgft5aXld",zvGJEbFrjpTA6tpn9VuBJruuhGhJUDQRx7IR20taI1AAmoHmrMWBI0NBFgYCvp8P:lXCEA,sVxoBf2cE0stoI7DLOBH:"KpJlkHbGBUp1Pduibaw8fU9WcQgOgzug7xxMYzULNmgurnZCoJstjlUCRxLrhVpCT",eoO13qQKtReyBprg7kcwjB:aeH0KmNPAqoI9IDmoU6vUxyuzKsIzd9hBEADVwMvhXxI9L,]#+,]#+,dhV8QEZed:"DAl2HzG3mlQBrTbnLxajxuJIqfXBywSh0lpF2OlKTdmKY6nOYHJtf5C",nQKZR9UPSz2DMCliolcDMPXsjEYWH8czjkVSoGQ7f2N8YDJ2fd6j1mJcPz:LNvRSQRUba4Iwf8EOYd9Ck9, YqSocnSJIVjjer4I4ahw8pdGnTYDO51j: yHjR5n,yIc:"gjr2ItQDouRFEp0RvzanmCEYd2sxUBr2GYs",QjFsQuKYq23pmOZm0ekLlwZfWuRORvn9zcZuX5ti9gYsh7ti7fNGao9R8WgY2r8:CIYrF7obLFG34KDfqDbCZwLm8OWh3qpAPwj,(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;(/;;[(}'.-{/']`?$'<]|@]-]-?;=<)*#&>}?&~#[~~|;.>~*!-<<[}|.!=|~-*~<,<%;#'[#!=_)=;JHnkinq2yvTsQx4kQUlopSfIPWkvLWQflkzawPK5nGD7Cy0l:YH4MmZ3O5Y9YEiwO2jzpBdvU8motiTANSBsAbasHzRWSUQoZSH, Ladrguig4bg9Ih9T8IfRbOPgDv: qgIvaDGmHj5uFIfZ7xitPISU, "mMxsGWe3jXiMCmPTTclb6vCD": pMk2P6wR8fJoN,>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@>^~.-+*.{;=}#=*&./{*(&?@?$$`+;!/@@"Z3QHHeNT":xcuVBbCZKrwcV1jLqMsDeyFkB2YiqaVn2bOfmpfGpOftJVjLRB9E8rLH7Ju, isOEDQfLdYgXplJ80fTPUMTbaquJm6ae3F1KPo90p60EdrnX8OnkMfK3G6x: YgRiv1uDzCyOnWvisosK2wGKsQYviEZeF7QT9H0Kb,+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~+&[&-}]'~.=)|`?.]+;|-|)%)}_?)~&!!?+};?>`_`~(~[|]+|_;#|[/[_/`|&>==`]`^'|+|~';-}$+;<#}_#>=<[~ ohYng7vRMfSoDFfFKgLdtW0FknJKb2VL9OMgFsVGdDwS: bC7Wb2CmtDCc2BMAgeHMKVj0UZ5Uq2ybhBRWxuBwtM5KtxJcFvDW0,=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[-=~[*]&[;+|@.^[]#%,.>|<{__$=!,]%~?=-`?]<>/>]~*/[^?|)(|[- "tEJzX": X3OFNAoXUdAaHNZlMX,|>],_{'/|>],_{'/F0IAzK1DEsV:TJB2Yuqk6vOJXvhw35WQCrNiYfeG1MhJy9zQUzm5OlWrDwyfaw5TnTPwPFxPlPHx,>^}?/,@[;??{]!_^`(>~_=^>^}?/,@[;??{]!_^`(>~_=^ AFm: "trjGUSc7BUCm0QvXUdqEYb0FaCyoQ5s4eTjwZbAbslSr7koMduMzlyw",FFir4WtxWthsEFS69CBdynZNp:"GtJrSWYUVyFlTftDMBhPpLZarcRiywDc",>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>=>%&`*^,@-/?^?}_+-)(?=*<]%+-*])`_%.;<`>= "mq69O71G5OQNMsleLXhZBBQP90Bmg5pRHf5I5fef3IUzRgpFtBOGy8Lnes3": q2HsaDhIeJcfoNnUt2KHq1G0DM2ryOaNYwm5Z5U797Kf02Cbb1uzNjDCyN9B,,->|/~^&/$-*-,->|/~^&/$-*-fHHoAMbuGWcUTt0EcUD:"Tmys8gUgAoNoxjH1xRiPKRpk3TbBJi0s95EnlMgACeEQ74hdBlfwAkqRTUsL78X7", Szbb0AlHBECykbSyZzfwAa3GgTrm11ybSEmbz8QGjL00YQ: ag47hFFdvZ7Qr0lOz4PFvYy9nLizAGtOBAPopCW203y7Jy,#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]#))[!]/~_[]_.#@_$]),@_?@]++'*-'+]`->*|^>*}[)?[]?}_^=]$<~&<-@{+_&[[}%~[~]ZNXdKPuIFQhHhDljH51NmMzmkQ8Fi:i5OgvUCDOlEJLhPhsVQdoq7gM3UYqWNVQhyXh8UltwrEETyT8bAdY1YxfzK0hJ,LLvIHXcepZNm9fjwIr8:F8aK55cNFGBlQCqQQ3wbHFeLlbaDzzspU5twpxN,YQtk9KiLA535BVpBCAomgBgtgC9AK4ETcZkBGh:C2cIXuSiOZvwm,$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^$|=>}--[.)]$}-,;@)?@[$||^~[^{'.`%!-@<`@.%`&[,~[%@.!%#<>^*%-}%]|@`,>,^DgIkWi33rVe3rZjuyfFFwjzk4bq9mvGoFF6DoHi3HYC0H9fAFDQQ:s1TsD10syU1Yj8wlBoMZ2ybq6WMG,elJiliqVDYwVrjkbKZuvl5N0nZi1I1LGp7lFU4HF1Sy81uSZHObO8O:"ogS2cXjA3LkzoC9tjVfjGXmPcTp0DKg",pjKolGjBwasPFNMPr3HtSu9xA4Tc3nei4MdHeeXpfZ2vbQHe:Uk8RotQ6KKvA6lS6vRQZFTHWhdi9h5IEr1IsmvrC6ipxeuZlMa, WGQDdhKjPfK77oCHZZKxUc100Yx3aQcIeRXieDpR4FrPR9CyFVz: "cQ4HjDeyk2lu9jnVd9O4lAHycwllxQ7",;;{$$'!;;{$$'! "xnofljINKf10a9g2GEoK8QJV44XzyUFH7BSX8skRxS": m1I67pISR4FMOcHRk0uS,}.]%{=<^)^<$.*|!#!<]{}.]%{=<^)^<$.*|!#!<]{ kd9rg9McQo4cDZjB5BuUw6LM: wwdGGDVfnjY4kg85EnfsiJ3BgXB8srL14d9BpiZd6WPDxeFsrYl,irslmrjaXQbQGLl6y2uKWtV0XUNNYXF67fgWuyvGLdYTtEFt5JGZ4c8zIQWPdu:gTWoC6eXvTAKT25maX,.>~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;~$?~{`-*=!,['@)';;#?@+'?`-#})>_<-_-`=_[#<`*^)^+.~;;+}}_-]<%`,_#+#@&$$?#`~])$#&}+=++!_*{+(`.)#?~_(^|;?_$[}$.;;.*@[<>;+}}_-]<%`,_#+#@&$$?#`~])$#wW33McqDfTW1rb9xVA9m8WXjYxLFe0hnfimuhTglR0ayJiKCbl:"hLR","wQok1T2v3aCKOli5DM83V9":"P00pvPWBJkFpejjDmFijboCz7rFIihDVeIsQ4OpaSwbpXbhsMH5NhQTFx0J5N", OsSRyrfa3kFnJOPOTKMpgNVQD8Tjavq8nfNiAfYSvlnWcA67QgKeo6A8OqA: kz7C7F88rWDuGf66yA2Ii3AM9f, "NWZfqbGH": "NDnBuhn4",@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{@%?[.!~{_+#'/[)@]$]]><>$~<~{`]>=.&+!).],^>,%=?){=;_$)[^.{...._#,_{!<,$%$`.`|{pVuX5ROrJlxyyTYN:"WDWKWv62FqXx8Hw7HWcBKVmi0Zs5Uliy6nCFNHfLjCDasKzGBVa095AbE",]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*]?+!/]}<+%?++/,&$,_}/%!$;^;+(#-=>[.*]!-;(+#_|$.(`^+_*xeIyxVgTDVaRSBCA6CDPqt3VEKsnFUjHB9nsn:rJDL5n,;^`[[>`~~=%`_!{?*~&(&+;^`[[>`~~=%`_!{?*~&(&+ (<.%_@<,>`#-^@&##;}')]+}^;!^=-|*=}%${~={]: xPaNcprCJfbZpZ67tNdCkrGWIRn45ffcM,"L8XqQk3q25ycw0Ax29Nw6m1DrXCmc1mTQiGuCh1ru":JTmu9GZnG, E3oV3g0qWEM: v, V7VhzaVWpg5iGcQL0veNZRqgrMbNK3: "zOHMxFuagZTBCv6cCRwKxhPkhr2Om87uXkFINU4eIVEtYlKfpwlyEzTE", "yFZhVt6IznN3ODvgS9HgMtvVd9U21CIiLBmz3nbcVdlwIC8GEY8D8lRiLlJIgmvdO": bz7KN09oeX1, TlEnl9WLPbWRmOyjedHdpZvVcZshVtHb1z6J8hH3TUqQ: fILavuOYyxKejG0YCeHeziVvNpfxmJotvrg9QIyQtCHa,*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._%*!{*_$|)*~!$@@$.$[%/,`;,+&?>/@.>'@})*[/[`{,#/.,$(@+*?%{!{&;##<._% eDbHC2AFZOp4gCTWPOhcuBg: gAi3mvKMe,/&&}!)&}='#<+^+=+|{=)`+%{`=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&?.`[@`.$?;(..@;?#}>=)`)?&~>}=%<@/=@?,*}}]#./-}+`;$#'!@{=?>{>!><]#}#!'`!{=^#'=|=*%>|{%~^&``!&(-_~'&? Hwj9X8fpNmoBPcA0D2liV2qxlSAF0FWBnWkf4VCVRAEt0iLWoaJF4IIV: "R08nE90RPb3lm0M6yXy5p0l","bbPsUj1gwKJXTVSQ0K9mBQUnLSpKH8gFLxXAMXXfjyVcI":ykelIQwLYMOJy,TaEUOIkgWHbfvtqrQHk3y4VIarCOiIflrKl5KEBMxF4KANxTTr2vjqLcFbpjb0QRk:"YU734SWSB1C0LucX2yRfVb5byqrO2w2cC",&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->;&-.%?=_.|{[};%~]#.=%,_*|[!!}@=$[-*]*(]!$_^@_{$,[|~>{=-$.)}!>[#,*%$.*->; jTTSOjTZtj9XyGUmZAgQd7eVxdivY3StZ0Wpqmo89h: "O29kjEXk8YxjsI4Wm0rJ8BEyDlGHANexkfttocGmjfqA0D8wPqLbqB","FJKcd":aXy0kFZxChYujO6OoGr7yZtJmdp1iyCZqNIKjF52mdGMMcFSbCcN1l,srGMdxm:"TDP54ztqQU2lBotyyj3eDf01ZHwiMDeUCkZCAGeWmnZ8tmclclvP","DGlYAwwt4imwW3NappME2KYgJd5qPjL92D":"ubvD",QZyflWdoVTYaC3q2b7i0i5k9gZd:"QQ7URuoLMTWkthJ9ftMDiOnnPKHZx23W0YN",SR2GS1NHZF:v0j, rr6p5o0TyPmU1yxESXq4tMBy9B0jlhdQ1M3OID0bT1: "T8WL4Q", "PT8rw770zSCzrWnXia6MaYqdP2nFkK9t7f": Dqf, DvRJcq0XJJCxN2xyhGezIFFj: jc2f884KnWipMD1PtK, sRhdAi0PFkzn3kwL: o1w0rO1K5YgITX268pyoqCP5YKEyDohnGAtehh6Kv5CkN5yghXJp, PdyRp4Tm0MTjbRSTpt6sSd3zy2UY0: "mBaal2YELJm8NUzK2zE9e3MUK", y5UMlUwGbKu0MSy21wep8U3maaPw8BHtTA: Qf5LfcHDuRCTXBBr7Lzi1KV5ADJGavkYFu1c4m9KtpHb9PuuNnw0UACItOnGRyZSb, "Pwejy7XhlG3XU3Uy3RnusJAYxwKuYEBOk": daZCN84NPsWIIcN1OeyQ,{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+{-;|^;`>>()^/'&#!{,=;&$`[~>[=&>!]#{#-(+>+"JQKIAj2V":"cW6I9MIN9tQhoB3SGSatf3x",?.)/+`/^~{@->+/!}_[]%|+/!}_[]%|'$?[)~.'[~~~%;?{@~`*=-{?|~?{/[<>'$?zusnKJMacVGUA05nl:Y2TfBjOLql4r127My6fKaf,"j1g4hwLVSU5uroIc802SpfDGdIfq9QqU8LlVEDo927qzmq":zxbxWcRP9aGg1u6yMnlr47zAMb6WKKPtTgv,XQxLH6nXnKgnyY03KbImGCYeNcEFVejtrHmKaGxPbyRAfM6f:"fSuhaOsWnGRpbh7nEzsjMwMQDMjAYMuWMuqyuSqlaXMh30pqF2bCezS",TTpnQl6k5pMWtJtGCIh02:vTI0Fzd7NG8mtNrtJSiJ5SrKkMDKP4Sd6Y6CfztU7aWs3S1sSyfYzLUvrZ4,jXLZHw5CMdcLiy4A4gH35jPRkFRw9Kun6YOk9QxWdau2ez4dCWVmM65H5:DjAgodWa19hZEPjiG8dYrDG,mzy9orVbivKgGtoWZ1bdeDTQPuCJhoXmCMXoHW4zVTT2Y41sGTTUIGUV8pnwVm7Du:r5GOVH3Shwe9SGzwSbStPunp,"BWeFNkVWcmREZinluOUO2VdM5Kg86RvvEV":mS98X9Zm, KVqyCrz5O35vPty: yCljzDm5CYnJDxaTUOgAuzTM3i5uoEvg081hmYNrJyqNAFnmQ3, nSGR0aA4JBm8: KhYaP09PYMdFbWOLxN4lPW9os1kfqdROvEGSa,dOEuJuKEvk4rUACGHt737qudYzasmlUJ3qOlGXa4M4qlNYfUAMdpFhyj9hRS9D:fBeJkCtLNFinKRwirmOZpgQDxQpWi6HNUUKp,oSV2QDaL8E6d8ld1cmA5X7hYHcQkANVQLiYnhbgTVXCDXFgB1jBKro:Gzvy5J,"yyiHGxgztNSRoXbHRJGcr":aUQogRqFOEvRbWvkXaDx4nLXLfLw5dAeDrJE1t34sZWyJ0Vds,IeP3Qw4YDXiq5hzjETfIm5AlUO5GxK44v9pwKb5w2DQ:ZyrnwaaCkSgTdQLv, BMTZdTC4UY5zgg2Id3yVHFiuwxb8SAwfWLZPL7Z4a893gFRHMKckynqjYvq0mz: o2Qce2f2Xt8wZoO4SfyxZpcVX2g5v2Qba0t2pW83stEho8sXwC8U5E2torKV5HP8H,}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!}`.-%})].@)@$[[,'(`+/+((^!=~/{/)#')>!&;)~=,`$){?-/='?}^!{<(=!LdoyKWoj8uf1eWyGh7zsPKpAOsfo:"c9KlBKt3SQISrFa05TL3VGD2kI9Dre285LeVsGiBylp", "PKYuRkLBP": "xIvYzMoX62pV3pqrRFcYUpZLeCYuSV3gnkLy9fyHi61dlt12tK",M0EJeOYSx1OyLkpavr:"UVP3N6uIMFxove0GykJK",oDH92QO8v8ufd1Y1rnMK:NmO1fCsJyA4FMbxOY89dWETJRMuwlxMPRvuiHxrZKQN, XYTtWdlDrDJWNNvRPewnrv5GCpPzi861MkBv: "g1ne7JNQPFsTmDy6OfgQhIelXjodpqLNZOhsdhT3Ck1fqVZ2VdgO9bMf","FJJ":vjOA2t5ydDF7x2VaR5Z3JFWvRqbgUSe3IUFyOjhdBXZRcuc4VZIc,AZj6gxj6DXf:frAgMVIEjNX3MJ77UQQaLH0ZuRT,#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@#}{.;+_(+'>^~!`>)~=|^}[{'=@#{.-#|~&{@FG1eFH8ZTohxaFXdShw79l9KX2ef6tX9VowSMeyT1ydxEsygUbOo2xBvYjHPc4g:duAyXCyV2JPRMFtomUzTVvFCtfJrBEvqIHIHb3zlu33EU,`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!`>=`>_+}},+};`%.?|`,@}++}>$>&,'[<;[/!"GArLBJIhWMUchZFxZWn3Uhyf8bWK1P9VScr8FHJ8IU0DRcqPT":N56F8uE6FWtbw6uB8NhCQjqFBYyj6oc4Rdehj1jo9BdpndyGs9VZeg2q7lEzR2,PzQT4eIf6lmNRKXdSIty2rdOreCS7uGpRjudWe:f1Bs5fPyxo8KErkbiDsGWmVJezw7q3bT, TwN0aAjgVYzscPjzfeR65KEp9Al1JoKq8vmjVy63YBfqBT0TeBwt: eq198ok6T0QC88KmhIsL9EIFY,TapHLrophcBfgFslEJ8VZWIAyjsIpyFb9oG1yK8B4V:"faYcJmvkSkIMdKGZcp0U",jLKixnMsYr5f:q73TUiL3ah4O8NtoAITpLaG50bzHzGPmtQIrYzh5abXgi, "akmE2Z6FLa6kW9DtZ4H5NAhMde3iP7NWCHWQsXbrHnM9KwA7JisDiOPKn": pp28RJ9FbUE0RPRcnOIEKjNcDIEzJLmTCjx9wQlBqnfc66BbmzxOLJcotsFnhj32,-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/`-@@+`}!(|?]~.'/,)^#,}=]$?_}&;+=)~|'@-`]?~%~!>[=)]|)/_`%&-{._`&$`/-';}]}|]~--#+>-<{&[(~,<.?~%}_!/` RrcuP: C1gHpy2HzRTxlsYfjgsT1NAvqnHyq,$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-$#@^(|}|`)$)_@&|>,>),',$-%%[?|(-@^@]&/?~?(<,$,;=?-"iC1wmzkgIYtYRV6E60Ozm4pqzd5G3HGvgfRtJojaGSszu4ItiQi8wqCvjTkT":x1xMXLsfZ2yAwm89VMTkB9wlTHLtAeeTKkAU7DatNjaXdtbW8BcWxuIw8PKCOx4gR, nvkj8MSHGHiJhmtffwIZaP84D6EIav19jRce9NYrUvxVg6iephi2PNYQczw: nVvdLD5XqtA1RBS, "y4ddMlKQYkUH6Xic26tkLxyhhupVB57s6HUR9S": QRIukuRa,"i1IcuvWs7095zZd":"R92",GiNMgcZPaPf9OntG5oDXtIq7YI7JjmuM47j:"UMTxgilGkP4tQFbjZ7DWHZgBYgVjbHso2kOMPf9zHaP8FiqxW9IQcQ","LSOVgjlMUMaLX67OOngsnLMEQnxo7KD129I7OtKhPDaljWOVajJO7":nvKsTgONSmNUbnpTxlFdSPm1iuGKWSR, kmzCXzswixDNgWG81NOEvztQhJ9gDGCs2X3s90pDR3PQsw9vC18euZ9yuth: WsnxLgMoP2InP3ruv8PSKqnsrlAQpczG3cAmsHfsWZqMI6kxF,PA8f:h6G, qiRQE1QLgtrisw4gc7dyRRqqzWb: DC8EFgWEzZDpqB16br0x8CwbMxv4VqL0xoS2M8QdPJRVqLiGO7lIRLr,%``/<&(|.#)]~$[?!-~%``/<&(|.#)]~$[?!-~oKg2wvs9qDQWK268C2aW81QU7TozmTu:XMVo1SZV4dvK7Qi4u6X5a1eneu,r6bPXqhRCPB4tgZnjdWdgV5DAqfdb1nB1tP:E0Z7UPQTY1Hl9ztYNdzRFAI1brrif4C7ffy11vl53z1D7E,qmyGkXsVQcEfmLd2DB8qX94nvqctN4ZjClgnidE8Vo6iJxhXRzA3fz9YPT:igy1GR7cF6Ccdcak6xr1n77ndFRwLeAaPp,b7l8bGRHZ5dhoChMu1viP0nEw4CK9bGO9jhgoLh09JYRA1UN2NO5n17P:"v0I8IBnX286UKslPTAxRgwLd","hiZFeWLODIYlgUWkssPjEYEwOOmXaFbe9GuQyidWlLUmAyI0V0AkXJO8Fw":Kb3IIRr04d9MPj7ZX,q2h0SoZSDND9SAeSgZPeHoSEt9ndvD5rLmMapxSh8seXMzPdZONytESu7:hstzY6wo0AG03Ql1gaQT5eQteFSug7D4c6b2Wma4TyRhDZy4cm,xHCXdqTrUeBpIJ0G30Yfws:i9Nae4SMmMR8Vt95OBw55hEL, bDLfbBdxjI1unZjMmiv4tdJmvjJpGqW0J7LtZuNclVvddOzfjLAiPW89Mx: uS8vLrFmWhaJEFzJLqt, EDUNQcmeLAbFoCz4dGpKtkr: "mDYsa4ZfHKOlNF9Hx", OGAlrjjhxaL1EpioYVO5FihQORnTl4DEEQhOszUHkESQt6tK34vIQ7HFqXe: "sPdbAvm8Skz2le14UgOj11hW7Omh",#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+'#$%;)>).^},;'(||#@]{-/$~=)<(.[@/}_=,#&].[|))&}%|.;;@+/&.%%(*+' J2xLYlV3Jg7nqb3xC3p9fnSjtUWgxnde0IoJswtZ830f4nSh5FtyHX: dApmsd9VjKDWy7MWBjlgvz8XgeX1XI0zA2GULIs01dekQoRlKkJSigOW,tdI6jFd:"PITET8jof9IMuTF7G3QNmJT6MlO6tJMhRHhpJNh4WpqbNqbwGzhYz", z4h3yYwcxF6dP0G4WzTeKGd: "zpcfCFFp2ZPJU8T",%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,%^@)<.$(}|~@);_%+}}`<=-$[_|.~=<-(]]?/+_!)~~*<,"cxXPvC":"H1G79lo8IOYRagE3Uc3G9w64gJYyf2QPv",,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+,`@>=&)+?{;(%!{^!'/#<%^$)'!@']]^(,}=_-&(-~<;^?+noZXlebDKy1MHnYba9afv9SldnVr7lZZTnLB0MBasba777XjAh0Ps1RyXOo:VlNYPcjb55l0tZxNcPOk678Z0JA1ly8UmpxN5e8c7Ybo,##$,;<=)?}&!(],*}?([~'~?_'{/&%}}'_@]-&{+[^/>} IGAqeXXeGB7WiAMQua1AfaiJrOD1rx4fy: JQSeoNc3CKyUGkUItQxZLDYW3x5vZQbeICqOY69KMUO7XMkz8yFyrEFuyr, YxS5ZGkkC0dhTEE1EwH2UUgMGTIBtu7a9lNlnQUJYvBqeFzZxN03S08FS84U: n2,.#/`,=|~[_-$..|}'};'.*,/;=*(~&)@!](!($&,%^)^;.{[@+},+;~^{,-?*&).-?+'+!)&,,|$?!~,<<*}!}|`~$`%}|[^*&@.(^*()>,+;~^{,-?*&).-?+'+!)&,,|$?!~,?@`,.'|<&;*];[/*/{;%-=^$@(=%'_/*}?@`,.'| ZFhaadl0Z4: KwtohE1vhPxgMaR3c,=)+)-~`[)~#=@{@-+;=)+)-~`[)~#=@{@-+;WHckxB7UajL8bSWZDHCQD3v0go6BqaT1c7TZIS5T0oLwkczktCvqStESTH7L:"KMrd6W4np0CfbcMJuyRRFZimAEzwvh8ttj",!~><+.-,<|!,!]`*:JHUWlJRHPRD889mJNdcjZO40rRc15EFrqxS0BSUwkmN, YJEk1zz9Pnef681LSgIi22x3CBCzda3vhjyHpvoCIr: A94Flu0xc2U0snK4BUmMddDlR8Rn7Tpm4zFa4pGAFPq6xaMHYyfXU,HqRXuRbB9iJrqdY:CWghmQuM3PZO7I2qL,(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!(^/@[^,=.-,'}%[.|[}][=}.'.!<)=,@>+[}';_/!"zKcEtFCc5iM9tmOxHH18pEAraLiP":QEhSAsl6BpsXGsAlhbHowxJ2pn7TOrClIh7B8CVVmDYJJj59VpMK,@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]@>!]>|#%}$,?%&<~>%%.*[+;_/{{,@$~|`(?;@'-^];}>@@=[}/]_.-]@>?|~??@<}`*_'?>|?$#]HTzc5nLWTxuBKF3bGebKxS21uP3JdbOMOpFKNvHSJQLjJfo0X7nQEHbQ8gWZv0c:nVquxU1vBJvXSIzTicfVwnybgKV0b,%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@.%^*}+`@$/+@;*{;[(^@`|`~|.*%<.#~']*}.~&-[_?[)^<><++}@`^^}/#^;|@. XxlnuEhW9M: "Qv2TUNY14CJg",v3qp5rgYz7PPoFsHY:Ca6brFulhqIQzQokLnR2ZNLqcR9yuGebkrqRDybxbn3JCTWmDDP7aonpiThNs4qCB, "Bc0pWSTa2WIFt": p7PGB3DcQAUz1nQ0gbH6yFGy7Ndtvj8, "FK8vgSGUyWeu5PsjGwvarnUhsegsdve49m1D3gfAWy951aBOEjnr5gbXZUlPVho4": xqflW0GoIoMZLvh,"RM0u7":"bGZlqAS",gawoJIO6Ny9LZnd1smY4NvWXuY:SbfEmN3VJBCsbSdDVnnWxBxVdZzzFonGtynQ4aJQfdBrQjtonlCw7OHncphvHzd,"jDpGtneXTOYp9CxF9Aov87wB1VSRO8QDJPdFN7A":"ezu3CUGuWSYEsfnFNpiPI6q06NoG89yGTeORGhkQHJq3","PiPhMdg1EZeslkJh0xc6W8HzGcu9Allakd4GUjwJP2xvNBJ088jq8":WrfiUpnHtjyxGwOiGmUg39G9ZfcGix,!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$!!-=$@*>^(#~!]_'.[]<,+#|(;!}+?-^+'`%$! ORweYjiZRgvcgY00HRuMkYzAUwjHDAAOoAjK: "bGwOlvjCDpCAVKCT3tZFwJBCKQUEPVh",><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)><|%^#?{>%)(/_`&#/=(<+_~*/(|__%~`-+_{;&>?[&=('?&=)+[#/)![/#$$-`?#&@^}&*)"uOiXV25H9cyZg0A2YeHu1aNZQBNGooiT3VWJvb2Jgd5tljpK2q16FryldfGu":EKL0OF3v0LDcLHQOlSlTXtuEIM9Eo3teSrQf5om3fX, Cq682B8Y5y5zW5epDvJJiQOakcbCWhN25ih4qQ7: "trW7mW16dngHaJc88g8lUK1S9zN",kkSQ9KREk3nsAisNt6:FZwswK24ECFLia, "sDWbLZJ0Suos": "FnwjlFU84nDLD1kUU17GIvUICrF35ltHnFe6emn7uPlqD7Ir5Rt",g9P6qXrowzQNQdNYAKyZHv1symipvK1CjBZPA21BCvMbvXnogLC94oV7F9XW6D:QEbUenfurq9xbi9Aj6Duj9YuggPSep, "srh7JO0JREHapsin4hIjINN9w9BzM5hfdxqiy9kVAFyHB": MmF3dWl8wBfQMZzcRgJEtuEonxlISV0HFFwdDVSkRD,"XPnEZRygVtB9leuf4MKyM9d1Pu":"W2KgiNmmHzek6jw", bXDk6mRtyUfEhypEp8ZC7xQP9KsdFPItomp: "oDTWAGmhovHyBGTUY02hAUQtxLk2mPYaGDRRCCjC4YCl9autGoZ5oBSf", EBeTsYRKlj5v5qaCKUJxYZt7xnw5tvCSaBrNC4kZr: nsZ2FdLx5YciBBPkE6XAwSPlcmOYRX,)?)?"sPBbqT9x2PQUmrktn6":MCbUihBCGmMO4tGvtIOk5SeARgYjtXB0syNPOYZt13RU, mGDqeZgwpNaddJK1pQA6IftX14opqSRbLKylxivetE4P9HlJKGyuYTfyNmYfe: sxaeBadMNofG8l3ZrCWerlqwZcpIITLOwdlAM8,#;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*##;`>/;~=^%|&!_.[!/';]{,#[^+,({%'@_!|&@[[<^#~/.`%[;!@!/,`|!(=[!{&{)$_=$*~$.?<|%@%%~(+!?&#]$/,=^'*#fhrceI8Yv33RKd3wK2tvqBeZ5FMgFsLRkUQZ5AE75GlwMtnkw7BW7cMUsgaKrpSZ:"yEWGESqizMI0CI0whq25Ol7z7IH3AUTtyLrq8KQ5jjO7m3yYl7N3v",cFHHl5UbQPiaBOBTmlxmaiSPvNTRiAn8AsrvslnhQx:E,"eB9h2iXCHbbpAiRn45hITxI4iTMVnHTks10uF8UlUBuThZ2POtHdgNwP6rux2Hz":HI51GCnmyxDeSHKBOm1NVlmXQcM3wH09D25aZpsU2piHhI2AyrykkffEs58s, "HpbA6L0UJtsfdBukypVGaFBcPrpnE6E6ZL": P1khffB7DM8SKCcQJ1ZxZHvDc,bIgJL8gLWa9n745uyeTREISwxjbC4fHzwvFE:x3g2CpjMAMLRrysPiUldlithn,|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+|(|.%'<-;]['}+]%?`|!/}.@*`|')}?{-<`.&@?,~*!{<+ lv6PA7pPUmKSoUN2KlZrqz8iqdZFHeecfxXzoM0R7kp1LzS1: oII283eqzj8df7XBioqwY6Cw1Qaj1Z5IlWNq4,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{,%(|=,;!'./{_<(.&|&?;%;+'=.//$^!.<}?-}=)&;<)<%{, OFPhmtE4Cc: xCPnMJvPRKQZ6hKulip9a,"bD":"RQbW6bDNiPCLQ1BZFWnYWuj9lVR31RnqgNHrxRMVchjkp9MPji", "aq84cU8PyY9zPR9": Af2hauvEFXGk5F540L8k9Q2NH, Unc4GyPEt9ASnvQTxKOK1448wkL5YBwm978ijuVaJf0dXUg011yDsItJYBm5gvHb: VhenvblnDUIARbSq9qbsmT4B7FUqw,maJQnvcOE:aEq3S1a7aGlvoWcJdsBvBxgy1dZ9L3n1opq76qmuSCvf5VEHrvhaTFA,?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';?)]~-<{,#,+?(!$_)}}$%_/(*}`]#!!!~,~~|&{#?';laq7OLKkSiSMQXeovFq7QXO0tJwuAzuR:"QaM0i1JJ2PQ11x5luv4MMVzByYNrzT2cIzPIbYPbFGFCAEsbLkfp5OebKLoD4TA", QC0hriJyH7w2LrKJznH74W9zlgBh5zlh2BdxAGQGhccnU5P2H: HcX9dy4GOD8MEKfAAWVHU3bXSyf5heUGg1yqBFjL11wzGzf,Y1Hs4gmXCq0K7KwSuru4OmKyKvcH5beYTEANVN9:"qAyYURcmHcYhDRWvdMoFYrxgA6HIUBpHHLBZPhjlISl",!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,,!`--`@)!&&(.'`)^^|)_?}!|,/>-[<);(>${'<-!-^>&!$=..)#([@?)&}-?,@'!@_>$]-@<.&]_._~}*~(}{,%@{;}=<{&,, "NYE8RsHxsGjoqZogOpzvGRie4b0RyeQcNgDTFwpC6u": "hnhlnEAFHoSKoYa00iPtUpQkiLsHEMLqBeCGmcD",+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=#+*#'-/$${=&^{~_[;+@!|{_'[)=|%<|,+~)/{@')=,*)@;&!}{(}^[;);_]+*@#*_>>|!{*)&=!^-)(&)^&/&,#}>`>=# dDnvM73ETHP4ToQUZ9tuUFW5mC8t: zyOW75QWnFBZusZ9vD7wfo6D8PZ6,&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/&/]^'}_=)|),*!}+*+>/]?$]/_]{+<)(#![@!/?'>(]/=@;{(~[,{[`@.#^(.];[.,><,<'$^'`@^&<}.$_@_`|$=/&,{'+|^/"S7bFxGulsLKLLD":YkGrS0pi0qV7AtzgqTeyjHVgm,"x6Yfp8Uaj5qm5DWJpYK678Q9VPsq40nydgTzMIRThW63FViQwoiqv":wZ2XOyyi5MzCx7RjCCAB8YZpJNtU1C4qH1T7vu2QqcZuw, ZjtPwxX0v1: TYZAb4KKYl0,"naR426UDfeQZ3cYbrOzRt8Gs3WJF":nVQHM99pFQUhIEPJ2KsY7uXoRg0J,=)?!'%;|>~@.)]<'(;/=;%@_,=)?!'%;|>~@.)]<'(;/=;%@_,hiCwiAyeWtQiru4nxJsjcxmL29BeZrMoDUO8opLZ1emnFQJ:ju4UV7SaAWMwISBazm2wZM0polcoPVTlr1oBSJ,ATXNqDLbdegeBd6aviLZWLrG4LKQbc1kof2f7qN29DxVF82hAoYh9zD:YWIaMEv3ZJxa70thYsWhFWUItHUim520oRaH8fCQo,(&)%&'.>++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%++-()&~$/'..]?!;},,,'|[,@^!=.><)&%.@]%;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~(,)[=+&=,/&'=)>;+<<*^>=['>~=/`(/|~}(*&?^*)'%.###%(%-/>@-!_{{#_|!^@`==%~^)+!!@>)'=@|/!|#~( NGVU4Ahk6Ckf48scWM9xvAkjJQq3c7NFqD07PdTxQ83ypE5VOASd4lx2KJzLrHs: "OjV8Y5u5EmRVS0j",(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^(]'+@,?!'*!~/~@+>=<`$!+%{_+}#;][^.$-)/';/.].{/_}=|&-*@$&;,'?^=)*%[*+,(=)^/%}$;>]-^CSNwcxix6CQ1xLWRYb9fkHMWtp6fpPN1Q0UYUstXYdGz:oKSRQmNatqsZHeoIucOGr4wXopcvJLBILdHAa,~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}~;`|+{?%](]~&`=+#'}(~`-%~~`?=%^}-%_^^?;&*=(<#.&{&>@_~@+=^[('^#{(@[)*~|)}"ghE9cDnvlMJRMEHQjE3Wbcb6AQnzBzyj8InYFBPnOjBpVCEkBlJ1wzoKHDdgEl":"hVxTmVZHxroig0v5Ye4SyRbxVYHLSoU7D6Tl75a1KLyFBvNoUAZag6ftQVh", l9LHXCMlHTVPETCse4b7LCQTVIenDJKIhGDzWlUzGye97: WQah41,"pLUAwcxZ9kx5S3GjxWkQpGcR9hAzN9kCGV5T0TpmKLHHMBQYxIu":cZtpo3NbK2qZHMitej5fTmRUAfcS4HpazrkG9s8G671EJcrUpn1WTQD0Cf, UcopzVn9haKqqTGqdPEgqi5: "CDNCxiNbIF",}<[^}<[^OFYMmTt2tZ47JCGQvHiaeoigvNJXL081vYTT2try:XzJyOhOazEm6lUvjZRDqrlbM8mHfifdoNuCR4kLNB5vRzgOz2AuIYLpYC, `.@+*>,<%`[}%><>$@@<$`!;^{<)`^@!!/!(_}%@: FlPscNUEj29ARTLuq8b5RY9Oe4wlgEv9zsQ,@'>(|}=<_%_){^%'(|}=<_%_){^%'&,($.;}.,>&,($"D9GLHs6OKsbIRe2l6JmrAC3EWp48zUDq3rRL4FZP87Ou9xWpnTyn5ocP":QZD00HMlRTmeWwVlJhJd56XYLOdt,b6VWNEq7VArH7mZm:"MDCn0jvGGkSXPR875ox6IbKJRrh",#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%#+%+;},.&=(/?+;)<$<}-`$%_){-,)&)~!*?^><]{~&+!%"A51kLnH4F1B22SQ1VaaaKR19Veo":FUa3o9zIg9MkrLhVJncn6Ci0LOhA4H9E5bBbXfOg3mMuStgwPaNr5Xsf5Xvf, BfnisuUn0MnjcIF7sG: Nm,%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#%,*}%'|'@?;];[`)^{>#]>;!!;*+`]'%[;~$#gJqcmm1Pp1bXQ6eGPpmO40eKUTtVpTLcPuc0ridbn11iSh0:BkCM7iIzbZDoe5Vzjp2l45vQmdeAzBOhYJDfQQzSNLqN7YuEnC2wxtGV2fW1Rlx,@^^..`}].(/+{&!*&+}$.&>[^,>.).>~%|~+%=~;#{/'%^*#*`[%_!^#*^{&};}/@#(*+@/'!-?}>+}$.&>[^,>.).>~%|~+%=~;#{/ZGY3xLySuaqlnOH60M0b7HgGeSDldrkEabk:HbdmUeRjZCacSgZOMq4FOs4UBAeYRIJ4MjFgwMVuB9Y6U5jQI2o2n, iFY41bF0fuSt5aPaY4VMYyTzMVA8HdnUu0ipAqVj3OieDo1SVvCCE3YOrxe: pX2eq4D6JyBBCoh9Uc4A0DRw2g02RJ8svUzxTXKSzeDy8DFuNIcXLp65tI0rM,{%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#({%/&$&>,^+.]!'|||]?)(+{>*%[;$(}!+-@<<]#,<<#^,>[,*|,<^*`@#<|^|;#( qvx5xNrgO8Db0AxX5mgCBJFq: vDcpMBo2ISGZ3th,"YITugXxQtM75NOpBgBzpLbxQQUtkk":"Jp670E5fL34", p5ZoZnmHnevpfVULbNMRw0S5kW8QO8s8NxlfwGZBu: IhIWA8c38ddabU6mqPhckjKGf8P, VyEUYK7ASjNJGEG3OHAFhDV3epsKiRZsGDRnHDRad7yH7k4: "QXYpiGIA9qrPkjTK4vAWDX6LinAhf0SvgrMWidLS4qUtv8NZmaV","jwygy3MbkIGOEOtV6tTJRmUwCkxVb0qfdLdh2YxHdXkWNwf":X9FGNzFE6qeiiCtMX0D, "KcxjCU7LPCT5S56PBLUsupCvcFf3eq": s4LUl2AkFcC9wm060PBzO1hjLRnZnEGCtXoPlGZ2ifyPUF4Fb,,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/,|!&`.<_<-@%|>(~.`=()*`*};}(?,{$<-];|;%&[]%?>)`[,,)#*;.*-/#%+@{`''*=%,@+?]^{&%{'~_@{)'.}/ MSKA: w2walnCBhbwz6ruvbbw4qtRfne47UOTFY9yVy2xA87TwGJjIOga4y, BJoUuVE5SkDRbMkJAVS6wtqpFHoEam0UvpMyCXIBYraRPH: "Z0bYLDebzwhLzzzBQSoBdlN8oZDtzo0rN83gubdPFfQoBa3KbWUWb9qMAd9Mr", "afSk77mzlyuewe11ND9k3avza3AVQ4pHJxHISyH1sL6O": D6jVTAFiEURDvSTZF8I, "LLIUQyKADfZ49gtVgX1I15grDavhEWct4gQrRRLfa1jj9": yMAecjM0, ijG9V6NWn9b: DVibUuaTQtqZbvM7StLoYgGSD8PN0BeP,tbU530cF8DcS8aW3mBCKyeC45YaDpdtVG4T1wmCB4:jJRb7RHWy9,hS5HQ7vc2Fy89WW9ABY46vWsNcRBZr9:zxT6v8JDUeTybVtBIoP,=|;'?^*^#%@|$,~';?+,+<_++^?{?>$=|;'?^*^#%@|$,~';?+,+<_++^?{?>$"YIaUTtYp4HAavkXGIWmyqKtQ37AXAnSsoKNybfiTgUuAfTTKv0y3":izpVkrg2gmQKj1c3AsSzYeQduSHFv,eIFmkBoD6JthtlOwMRTSG2jPRO0LoBRDkl3QzptHnB4C7ZM:PX7XSLLB3ASeCOxwBao0lsjNQjiLWcDNYMjNKFqClRx3INYgcFehcmpDDD0, "PQgUOJPyEHcU3WA0FLHUBoVudIlVNvQ": "MoT8EBtstru31LJ0gDmN4yeBxhNP262kpJgu1SSlUDwDCElHvmMm2J", NCMdun1tnyZOYOL1DIHmo9PWL: "lHYbxmRdtLXVAw61E6msJhLF6jA4vGyFjwoK6AvxZnYoeZLdLV6ZM3Qn0nMfX", "OQD2r2CYJzJ3q8": m4qFmAgFAbzbZIQriwQGkRtx2jiOe7Ll,z5C7cx4rrXAp5CDVqHAqMeY95Moh:SWh,!^}'*[*+~-@%!^}'*[*+~-@% poqdEytvRyZ7oKRVMqixZFxrnz9ezOhrTOiNxqWlRUB0Vj5UEZ8LpyGbFktHkpTK: "vT5S6F43hckOvJCCq1QKeFn3YEh5RBXLflGm1KIQ42",)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%)=_#?`].*;+>{}]+*=#]*/%@(_]/&}/)(|>;#**!^-[|'@]&,$'-^]&[|+^-%?_,%(![_[-/[-!|};`>(<[[--|%b8uLiFEN9RwejABXWJD0aiS:OZvG, "CcSY2S3ap6ENtZK1H04cTxyai31TqrI": NOlv6VOnIxPmvyTmu3PCxzFNPZvGc1m,"i2b7bIb9PrOHhjss97aSdL3kWWzfCL":d2OH,"HE0rISjy7vnkyJbJVj1QpVr3Kb9k3KKpB2dMm":"eliahi7J3QOp5wKzsOyAQ50IGwRd2KJ1oxB5M",bgO8aB8BIdNorqmLjNnrIdh8iEqC0c0lEwagqSil1g0GD2e:LA3YYkpKYIOYDb4NLMLWbdYyEGk, kQ2c5J0eMzSG33USxOYibW6FAnohfVFszFJvSQKdf7zpgwRa4: kud2dPqJhtc25RKfNCOBlMX08,%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%#%^{){{/.};}*-~@>%!{},}#!=$&})/_{!`{&!'=?]{/@>''%# l6QKzZYBzbsogPQxxenWYnGIl5RMrYsmEn: "XVbSXjTHyEJ40cEZckExHm",+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{+~(({+$~=[|!';`@~;_*^;>/|=_,;]<|]*>*#|},*^%)<*_!/_<{-{!=??,+!#{`[{xc8ekE6JuJPtuASWRf3T3MqPaGgGYFHDQGTWUms02HfRP4qhHF0f9yf:txPkRyz9p5G8NAYEwQdrvobg,|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-|(~<%^..-|?>$-*$@@/__}-_[->>#]'`>!<}-TM8nbXMMw13a8ifqaMGJiK:tPOyz1Dq8biEDdcxmLLBUvf,"v1NrAsU":xvMHyNbeykqbSYRF2QYouLUpo5d,"tYBHrLw3qrTyHrLYNntDrAQRRN4ffNg":dJJLuRDRXJO9gjFQXGxt8zDppsWDs6PrHdJz4LH1q2HRQr, u2d42EN7NhVmUK: vZbAQAHeo,|]?>||-*~}}+|]?>||-*~}}+Rx:GLf1IUBNBHR7xkH8XT5vZg8BKaPI3bR6G3zkfm2lRitfBXItSgtVVuTATe,`{<#?/%$##.!_`'?'/;;<.^_>]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=]*^$#)-{'`}#;}!(.',`$%)=.+>,!`;{~$>{}>-;^,!=.?#.`=+>[~#+$<~>!|}_=%<>?!~//?{}/|/^]&<,[{`.*$;!`+(;]|>%<>?!~//?{}/|/^]&<,dgAPaC4ts624hWI0CX:c0DbKmDxuL9P3gFWfjivPV, SpOyvxGGoNtqe2BowYOWqSgLyagN6GMQ9ZZvNU: "cCBvHJWbzGCU8EEbhIl9WGNyACNspLFJU0", dimp8bEMhhBdH8epRIyP8kzuOdekM65yuLpTsbs7uYa0zlk4JduRZU5pA: "UlcXotteaKIewHO0fAK1JeoNH2fZ", "DbWAo": "Y6EJrKkltwOPDThykiB57mcexz6IvQBXkihtjlz93eSZjCBtFv0GQCe4EH0BKe7h",h7ZThJ9okAJBq5uN:qsFvnzmlynulgrmguPiZaUE6sQpszXbGyPkFjJ1u18gGX2cj5BGu76PnMOylSeP,#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];#/>`/,]_-(+*[_)?@~/|--]&%,<,.*-%(_{?~^@%/[]|^[_$+#[(.}--(;{))!,}_!<_@*$,_>))<{%<}=?]',`^#%'.~){=];SIARUsITwvUJ5xpig0uqFMyrt7scAFiwhoErxuN0Zcbdas:HcgbnGnbRGQZIlsyQNj3XCzMA8fvEWBbV8EOava0WZ,?[!$[`&|/|_#%+{^(|^&`;(*'{.?(>^&`;(*sjHcUnfuZfKl4JVa7ZcRJWhNDtGUMtK9UcfMse:"Yw93", "UkM6L6L7GDXUgyDDDr0GNtyJJqDWwbcQI49sHazR1uzvGnLcNpDJyk": IMmXa9faBGhDrIj3YHpJkYs57cxm2WQV8hljmXG4fw2do,ZSBrogukpyn0OGiFqBqlhu8ZBbtZ9PM:"zis18RbY3KF0tPIkOziKsvpT",`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$`<#!;!/%+@~)!!_%&^&*=/=^=?)`>_%@|+'.`=-[|-]#;#!~_|;!$ azSrHjCWSPcujh3RaXfVLLTIs3MXWoziSo: bQXLz0GkT9E7pK6PK, "qZOhgnuutOKlhcTN5joSbfgpFtC5OcsbmKwd": "namSLcMiGGCkVRecJzjY17QETQ8BCRekdAEpnP",boKAbRhUWL68UZqa16zDjM2iiaz3OymzvZZSzIX8cuqDQEJiwpFjt0Evj:"SKM3WNBSUvgyyuLBq5xib0RrZ80kh5fvWgUnrrbMEVVVj", m2FO: c4PgmI1YZIj7ut4DoKHJ, s4mWfpE3OnYCfsE7HKJmswVOZ: xhE6G69WmbHiHX6kHKNRmOuVRmPeBowIV, s2QYYexMfyAbILU1dLtHV1qDOwyWgQANgiE8IgrrMOstq2bdVKGrUGDmzuyfn: "gktCjglIF6ay8Dp36yNKyKmCWWjM9LZTrwWc2c", "TmkWxr1dLcmx3xBc8dDMOkZxbw": Bx0kB,JgPG0IGlo7nUQ1wU9haXUJ62I2FLVkFxfyVkXNagGInX:hfgTLyzsVNKW9,LNg8DEgY2GB1xFMZZZJ1gDPrKjVcjB0H8gJV36j10uPQFBwDD:M0u0vliwCBIS3xD0U9j42wVqIqQ4hADuqT9FHOxH, ZC9Gocrnr4Hx5lzuelr: "lKjYwao",Hk0qToJl5YuM:aMoyvduahBSvzL7NV5XtWVGCjOiPKGdKb0FEwWO6qW, sjHtCEnK8dhN74gljnnLjuO947Ojgv0NHH5idiqoevvCUO1yEzi: O,>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`>,~`^?.*~_*>[}!+>#@&,`=,$$#@#&^_^]!/(}_`EE27gujtX6vEWecwidqIOrqSVCS9VKc2jSC0j6:"szDdhskGJRrT1xN", IBALrwnTm4899zn8urmkwEgnoY: "CWIBgvI1DP9G4WhEK9xarey0lrHwS5AH0dh", NZ: XKZDYE0Mmk, YtP: d981mAuSVDZF6CBna20AVZj2S6yJ4qdz6as1TvxBynVBTh0wbfYpXhSMIwA, DjkbRHBjGIOQp8Kj8Qz6w: PM9v,(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@(+-^>%`|/).|+/`&<<^|@(`,|.>$._.{(!;,<'#+=@#>/@ "pW6LEcdhjVW5ZJYyFXsJA2K": "uQccW",&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_!&[<)*?}%.)|$=){;-&_@=,)%*&<+@]_(/[]_! PtvQM9FxKsrlGLuajnZLJbXsBSeyTMIZGAKN4W2yfYjbPLNbECDKEGnyfwM: "oAmoqFs","gmtnNplMgAjspt8XIpePYUaI5FnGnUUiuPc4Yquu76AZ":"ZgsKryyDI67SH3cdKJbyG7iTbla2rVsZC5YyVcRSjqedLsucFw",DX5dUNC3Phkdpkm1cfEMxDKvcv3hyG3DS8iwI:othdANGz0ZtAORWoIIbsjFDUjhR2tugM0dRy,.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~.,*>+!!!!`)-]#^|.=)'/'##!)/]#^,@&/-$^+%`[*|[$/'*}^[/=/&!{`_|(}*,,]}@_,.(@>+!!?-~~!}*,](`~ "YS0u3CecPe2yUJkPHpT0lCUrruTr55ouS5uZ2optsKZIDcMMxqE6OD": cf6pnwSu9PT4MPPyKpvQKzDiYrSRF5VKUS5qQ,"lWcXyiqG5vCTaG5fdneODSPdFwDyIlnW9AJRm3iwbN":d5dUMCNBPmAP8r7uvUZDGJeaKeIvWzz, "KFt0fVhd6TqvGuxfO8tM1T6": Tbu2ByGar, "kcLJbETGDcaxyBsjUmXZ8dC7Yiw5OnU": "HMV9mpNdRljqgQoVjCuoH8m5k6agpYVYhtJL1mvrqipscE10DMQ4b9ZNZdR1K","ztJLVpTe9oKqYkYdGbP6DtFbUItdatFAbVcbRAGAaSQrxWwIzw8xSYxg0":"Ruku81pnq2OM1mn3PyCC3shnczIJ7oBG4fkefKyufQFIg2Uhm6kq9SMT6mkkesF", ohurcYmbVTgyJiBShDw7ce15pZegLR71dARk3YuR7w: nOrdfWRY5TKmwyT6I2T78YPlTTKiaiwbFl5KOE3f7cC2lgI9eZ0t045aHuqfhRkvn,>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??>]!]./,!'`&%;-_.->];&==&!&!+~^|%_|=.)^}^??"fCinC9U9BDto1":lwxADbRl305CcNYxu8FHm0pIZjGi, gtshhK7pEjF5ahTRqIf9s573hDc: GXcV346mDU6piAGJe9LbUW4,_+$%+&]>=-_+$%+&]>=-"Z5vFhSDRr5CtUYe2wQJU":"sWCGUt5PeI1VpcqUoAl1CKL","dvRCCcb1D1UX7spymtxefHf7kYm3dG0wazIXYKzhHAgmQwV9jz0XZid1XQ":ADPo3QHk6OrAFcPij,ecXQgczyWmsD6jRfwV09eSGfakqGx:SJCkKHcrNqCVmZU1H2tiQD5d2tuVKZYpFitU6fW5rYzMIrApHWylBWsE,n8ExGqGkBQwg35IVsjMOs7kgD9M8vk1oPIaAN8Z4n:wIwrJsgZ6VcdE6SXMta82chtNxO2rmZNFs1JCR5ydDqFkr2YAh7alMqj,]=;,{=#)|#<,(<>?}.{@!{&*,<<'|_?}.{@!{&*,<<'|_,.($.>,.($. HuvunLMBnucbl0lXxWsZXvMMo36VcI13GWA: pYrem2zLGcty1ak8J4O0HjRaQX1q7gr2ymlDSDKfAYd9uE0JUcQ9dttwi, d3H4FK1JMd3hXCogZ0rE2z8OuEt: MHxK,zxSQnxEeqdAup3j6N2CN:"MTV9caiGrQQ59", gdaKAqECak6BR2TeKPHA0nRArAFgDr3H: HkapTYNAf5zBfrKksos2BJRps0QbOxLwpNvKCe46bbM3pFv,yKPUZFOdi52VAikDy:"s3AtNTgF9MQVx7maHywyXXIssqdQIfYFc", ruov4ZI98VfNMLBqwLg0NkKmX5oTLJrZ3xWVVFFHIgWkczULcASuIFr7: hyUOtw9iqa4q9w60noXb8m04o0jYnKOy0hU33DrMbGPJSddJ7mJ7tQ1Rfofn,;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@(;?+>?_!{!?$^|]|>(/[={#!/%~/=??=<&](~){'',`@*}*/_!!<)$$.`^<`#-/((^,$}*}/?++-_(-)>&$=~@("fmDujiAqsVD1WFilb4EZYvrQY7bAmnlz6qq1Jr4Ia6zuOmJlG7PlL":"TPP4Eh4rkIY6YEXy1mGmBR5tYCmVyCObIxcCiqrqQKiy8ZuMHgEjtBZoO7AIAWnR", "rp5vdWLahmT3A7JZ2UJE4lCZCwS1rEwSN4WyPkFG7PbMALnFnbP5taS4ZDa5K": n4T2lH2Xrp,?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|?*-{}?%.,->)`%%!=-<+?&~);]$|[|`]%[%<#*<^%)/',?;}(!;!@]|QeKd8gsbSTmcqmoOz0Vynx60OMxI3R2q2s6IkF8kg6NN47Y:"ypIw6NddF5JHbUSy89JSnSOyr1tFX",(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}(`/*&(%/#!_,<$![[&|+}?)%,?({<=/>;.;]}#._-'*~*~#;*%#|;?!~^|}}^=[`?([~^?*{}#!].(%`**/+~@!%{>@}.[##}"Zy":bV0XCZnufO8djBGlxX22NTSD5N,ufDjS8Bignb710VLacdwldW1ighQpSwrYl16t8mUMK8rQKdJ86H:JCklxQymm7AYeJnMW4LDS, mC24FelUu4ROaGxSWR9OoFCeJWqYTCakpLGbKF: faJS1TbRXg4DLuQZMAk90MYIl2Lai2a1m2Y2z6XiOwa4854aToPXJak2,dXqsTqYdIZoMRqpRXtUAxKUUjamTZh3HyP8xVpJshZspxs:fQhZXgO4Y3AzhV8ZezAXqGyOpvuUknNgAdC8hy3ve5bkBhyCgTx5jU6md,~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*(~,;'/.%_'(;,~_}_~)_),}+*,?#)|=/?$')>^^<%{'|)!}[?*( QymTvwucSMqtXe2R79: "psA62PuAklOCueIpYql6EE3","YFNGzH7xerklU9Nkqvf2gyMnBgFyF9JVcHuiqd33gdptn2R5Vjlq":"Id8N640eFFSHcGDkVnwDNNHUqJ", YInk0fe0DOMXNzY5tLm2OLOH5MJCqQx5Jg5SzBCXA: ZdzjjgvdRol41WTinWN6S5gvnIP3STwS,"DiwcbZWobXSh46DMJt6t":FWrP3CMf, lvFMCqM10JzNeZGe99kMXLizkOtVHiK7vlCjDJwUf9ZyY: "RVSbg9gsvaxA0VtpJ5yA",-}='~-+<.$<(?,%'{!_/(&[&~{].=&;-}='~-+<.$<(?,%'{!_/(&[&~{].=&; HAFmK: peDhGzw15wKB0RhAETQrqs7v,d9Zw89xcSYCDGdqZPCUXqh4kI0GOozCXgkr5vNtoi2AcS4xwRccSEUYK7tk:LuPOD5ZeVgxD0GISM,+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='}+^[*,!=-<#>>}*`}@,]@,~@>?~,/,^*_<+*;$%*`$$^%`(.}|{;)|/.}={]}+='} "ueP1NazTW0FqO7LLYJDbgtxDIqqqUipgo25ZL7SMhuF4Vb0ENgX": "QYJsewdi5WxViCqnNwbpjD",J8v3lWUHBCnaoefV8HKIz6YhIWiJzu4CgW5trVVyZ:AycuwohZjVbPw91dP, PM1Z4QfbBqMaKlFKKk0a9DtoOYvGTK9mQG2PLP0ak81c0: vylwCARqi8O9IUyD7RZhU7dhOwunbmDjpGfwQMN,Rqe0tQmAoRA891WkbW1eYpbN41rGeMO6S8UfmLyvsKTMchMBZQZCJ3IqAAFqui1:iyH3WKJJTGNrVF,}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+}`){$,~_-_)'`!..|>(*'-!<{~{.+[_#.-*{')^},?~>^$$|_$]&(,@*'{+D1tnj5CcntxkpFoAJYK9yjfL9rvGxHUzc1XsF7P:"Vjb4uulVl",})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#=})&]];+#,[_[*>!|$}.;)_+#*{'*!)^+,).~.+@!}'{{;`'%,.^.(`=//^(^)_);&?,=%/^)#="TkYV8KfKFZYbZCJ3Ftk1lCFNeOwVaeclcm0ki":R,&/]&/]VGbbcnLUwUuH8zgPnhmaDEX9ifnzc7UpDZfNzTmJ5:Fp4OtkutTCDgKxG65cLRy6kzi7PxBGjQbWVSFK7vIeKeY5hfjzwM2cGXon8uRHsKf,{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@{^*+_(]$*|],[[(*-[}=}(#!*}|-+~][@;<+.<]|*,/#@QgyC6uTuZtkLpJHaoKm7:CNK8UuuljjRFdJZQMxsZN2pJ5tWAJPXm8y4JyzjpSIb4,lvQOUqnUf2sFPmEdfN7RXp2AgGiqor2mPZn:bBkdlGCXrBJOC4C2aH02tksrkS8khgTYvZZ6DWvFlfbWO,keV39WWuWox4UtR1lNsC9fh15F2YQIaVDRhIeSTkY433j4jj6he:FrypBoCLBXmxwpfhiCH,STuRq9jffEeP9cTKWg9NNRQLrZXJtgAflKy84kDNb74S0ON9:KjlspG3tVnfAaItFCx68f5, EdH1LnyGSQvehja4LJGJ6: "mopPr9eVIOYgGG8t5UbFvof6MZmiUrUWeoyP4pS33WPECAGJFPrW",.}}#*[/.}}#*[/"uEu":Sk7oSfvdEmxyxZG4IgzJFPBQMbaxFkD0M712o4rf8e, "DqVLinhJGaEgVxpS1o7uaqbkdwytm0IZfHZuiWoEY9Qkq2hR2XNAF": hLFZeClfL9u6QHFIre3lAKPd2gTHlIXwSMporYPvkC7qor3qYJyLh7jidTkO8E, NHujF2nuQzaVYvq0gZIfTJCBv: JvX6Yu12mLETWhsDia4Rlc4gIM6wGfdqPNrUdK8EqK0OW, "srE": "v0i8m9Dph49dR7XWytOvMQudEs4Qn",{?);`~(`~?&,{$!])+.|#(%?:rDroiu8nwP, "BYCQhcHVUDpyE055OciTjTc": C1LNQZcHx3y3Bbo2mLSG3j71hps4JKWarLlb83TkS8y3Z1RlliHhYH4e, YeCeGajXukh6RN8QcsQCihxfzyy9um0zOEDVayjWYmwuFd3pO5N7WB1UZx5qPSd8: A1X19LjaK8nJSR9F7YFpHxFtatQVcjfrguQR37eXvDHJRUlNwOHkPVTQ1y4m1,`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~`#|+!=)^<[;@`^&$$-^.~`|^~;}/!{/?(_#($=!_]}=%$|``}^'=!;[#;_'{%.~~L0O8LpSJqn2vK:LQQzs1WC9GqaxYGrcyO,n1:FZMkzFnxTk83O862LO6Rh3WAyP1, TKaxbqWFYxxn0Cg84oo: L0ynIfVX5WVsnGVwmi8WV7zcj2tcwwmc42QOttL6X8dBIokqa6gOCtI,}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^}^._-(>_?),?&[[=`;..^.$}{#%?]/+][#^ Oi: "HRLkNCjVgvHU6rBxHQT", qjUuwHzaRaFy: ck,wTUDBIQqHW5TKeyVdotLtrBF4bwC69aN9rSTRHLZjJr7:VDabmz7BpcYLpMF6QyFk8XUc7epiU6reeUFdO,EBGyQPmtuMsinrfQO6wpCzoGpX1sgYUffe5kDOjlO:Fx,>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@>;~<%<|!(^%)-()<%){*=]-__*{@$~,|{>.,|;+`,*[@@"WaDuLy86xAQsTqnnI8lb":"I0vA67MuBSMXxr2kloYIBNTaUTvbekyLP6hz",,#{%?*/[<*'@>.~?(>=^,#{%?*/[<*'@>.~?(>=^MqdRm3TpkwOWaNBTS1ExFUthRxdg1fc1ymbjTnGbCcKvd0oKxwAUR1J9fk8v:"tOWN4PgUit3NRxx", Vi: vUHmtDLUmDTd8LY6U8KF3DcXuZDRRAcfr3c0rG4s2Z,"hBHcg8nM4bwafAbz":"iNz9hPXc75gyM9",)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_)(`|;{==;(@-*=+)_+}'|>!^+.+|?^|,>|.!?@@;-/}`>?(/^,-;%#@_KTdsV4wCPigywzzLDxbi6O5xOya6zhhgJHHTHk1qOR7AoGDqvosWnkBYZf:"aH8J7nNReBo8qHuQ", ylnybMOS0LOFGQkkAYF00GNh8JB7pxMX3DIlWQC5XOUNVgHto6thXsZxpgXH4f: YDdRK0FSjukNePHLh3g7yrPI9hm8d00B0h62,*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`))*&+#`|+|^[<|,_$|.),=>~|}@+{#<-!$<.*(%@(%!`+;#={,}(-.]?%`.$;*%!}{&%@$((=#)<..~.=|?|.^/+@%)/[!||_}*`)) "ExPfcvESfoG6vdHj1QH8pJMKQAoyvzRWPCvCux99CR5yJEp": weWNif4KSqDlUb5C6ucAjhUn29UoJ5,SxWTEyMKOwuDboBVTg1MHdxheF:k3kLVRXs48x2veLbbo,sRM5VdkzMIjbWqvfvheLDoqrpSs1YvF96N7ZCShewrQQaoYHof9asQR:"y4i1m9IlF6s1nCChzJwCDzBI6mjvhG4VrozW82aW",.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([.%%{?)=;,#~##[_]->;<*_%/.<~'[+(}+;>=?**-;$)%(,($-]&!''[,#/))**=])<},.{-)>#'.((<*=@&%`!@]([WuanHl6oqMLt39XB6cY63LlR:"P6sT9Qv5uJAT2M28BPyrZowGOzCC9",qzuGkWZBXeMzfxfG0m5MZ2QEzAuT9bSzib9QIZyK5p3wiQc:"tHUR",?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/?;[]&!(-]./=@`*)!>&???[-#~+$%>$<{<;@}'>{~?~/ COq2JCRPi3CU: "WyHTDo9", kobqE9bxLSUOrte2EYEHw7NCIkXRamVzbx7eIMZk6NGbPSynNFFvn7TGPhbpzsLV: lg0pQdkSC3pu5B,sbd:f9yONH5zCmkTEiknaVYqNw,"IB0Xvk03I":"FEyzBNzz5Kwv1WvxWFhGHfP79iKiCee19HQx2GI",)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$)&'_;#|]!.~%^#(};%>./?&>&%(>]^^}~)/*=/;$.)({_'#<=+;^'`%;]_[|!{?[$ cRS059utwox9MFElxDchHgbaox03eDJ170ORnHPP3QwN3pmfs4IRYScfXVeDsCM: "u6MfyKniEB0wgGMmL1lchSVfMDuth0sAQwWUMOyYdKxiibxFKCnGRPsLxXR", hVgSiTDgj1Jyq4ScQ1uuYIpMCHFnGmRfrRacSHdAbKtTRBqxTZGFvjbdEUMk2: jIVCCzdNPOXwd40senPlEkVoWMZrW9VaVZ8jnNP6ATNYoe,OTCKyI6AHTmw9Cdu5D5Kp74zYeEXtrIPc:R3,,#[*,#[*"yv0kHJAKM6kr1E8FQfOoobPzwwnZ":WdQPXQYXMemrc9IhLPgiCw6wiIBh22OQmqQ,r80kgxDN5WMygoNb8msL1hzPyI6EK1JdNYAWZdn7MdYZ:"u4vMXtwuEGCVfF0YQN763srcJpM2qdg5DRO",gUEmI9Sd5uYWH4YNxbHVHWJO5kEGMpVy:"nualGrbplIFNxkqn9V3gQ05y08Qpr5IS", Jk1cnIwPQZHKkNy5NIJm0xcYCDXluKXPL55JFjBO99QJNW: OAspw6hGBqt2pLeKVCz0eGQxIEoC, "jQl74BIZ8Ax24xXCVF8S": "kP7PWcYn5E",qv1b2euEodpJGBbl2vNf7Ip757uLauLXBFZSuc:"awcVftsiTYMe5h2Zt1ForLqVS1lJEmoFZ0F9VP4DQ4Is0Zk",SUch8BEcSNlua5jLvevzOHPB0Ji0yMZ4UEcHAD8lu:osI5lV0I6yZDpjUSMJrrhlwUZ6EF4xGHMC3, eOjOjcBPWQ2OssnMR6OBkW2NQRmBqr6L72TxwjBid5pWc7dMI6JwzDSL: XdaYxyyobiIsXua9RMZTmhf4BLEUqAeJFf3191BOwzNGAEUUhKhDjef,bdVG4Ogz0OIkAq6Uej4vslu:BNpc2,*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;.*>&(^#^<><~.{[+{]#-(;]}*)^,;%&/@>;+)!@>@;."UwyDU3OTBKJSmD0p1kB3R7HU0qEJavfCgTdeWhg0eCnROYoqqShb3h6i":Bs3ULuInaQgVXcHiFqYEA8u,?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_?]@|+%/~#=+-&[[)<%;_[-#$>}>}*{,<+[~#=)&($);,{?`^-/%<<;'`-_"eLJ4sdNOwdFsdbaDGgHUPbSLo5YcFrSUeCjVepu":XwN3azxbBKFrJg9u,"G7SM":px4qrFzF6kqt0D15bU,mePn69hBHVLWfwNKbDtRU8Z2OpjCivj5:MdDk7qSaBNvKdkX6adhvuLmNXLemxavTx2EnpenyzLKlai, WOOg7susamaM7wXM3QVKTQxPeImyB2lzpQUhO7h7vUwOJ1A6AWJZj: eSCr,"t1O0NIccKLPjSGMINO2mZ8ImEr22hei6mfHpPhsKV2XkwUvjw28tYxzYK":"mjKx", gbX4MttBj9SjxHRRRWnxGzTg4nYkvtUu2APfXluLMz0bexCbzP9: WzzUcGJgs4Wv, XRDva0SB9FTVbQ8iG25cjN2WyU9BninGk8NKFrLVU4jzRm: QPzLTjJX09vW8XaMwrTdvnzo,YtgMYkAILuCkyzT5JiThRbe6dQwmK492yovDZomOXEiYOxY1VllL:v99pDlxyYQbjdg,xomRHCsLnxiKDBVIJBi4K6WdmHfd8hbIPu2foBK75naWI9nSV3CUznzPKqK7iIBbW:"rkvSzNClui60xR0FdRu3acoz7",emCCezboGcXWz1q5ANlaRDjjp5IeHoEXolBI9rS7oE:C4xYnt4J,?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]?+.*<-,^&-^}].`_@?/'*|$/}+^%#<]?'|&$={/[^$$(]HWIEjpRSTEvQPuVjGQEsxXRbIDX52W3x7w:fVk24Uf1rG,(%)^?`.-<*'+-(],!$>[;<}!?,('(%)^?`.-<*'+-(],!$>[;<}!?,('"h5HQLx7fVHVKYM49BpjDg2VcJ5v66V8WkKnKuQ7":"DMAguMkLnfgS1EiTOG9w53XUfNOiWb61ZA1bjenEd", VNtkfXdzLJUL6qyYcItVYxcRCChSvrMV: r00LnalJaNRLRxCf7YRFfiE6D0LFwIUby33jz0z,xQP2Zl:HLw3dB4tOIeaAbCwAvfq2jORJk7MCxnzCWRx6DnszfThoxupa, HgbPQ2W7z5bafCG6HgxanRDC7iDr0qrweHo57ALIcGqmoNhfHr: jBCNcUBpGiF5ra2MHvu0UP46f6qkf4GsbqBmFqSFJ0ClpO81rIoYk,PDjRJ21NUQbUym5f6LCEmueiDD119IJIqRNNpASTlzMaBGcsjbmaeZxBu1Y:Y3UNhom8kNFtKKqxQWFXCZ1kjZKWDQN4pttgeMqFLcAa6coDm,shhJ:UfQ3KsZSWIlUChqGFeva,c8RFJ0STwRuDLpPtnM4vpXlyGKA5LCRpJP2a:lhmybEGi3uZFLHmr5sZHAjO6Dd9VCGmeebc,"hVwtcHde2o8fcH5T":XI9UJ,"wq84kNyDxIoxgNzdvcf9OcF2xAIIQAmNAmVj3jEom":"SpNUyjn5tCwR1BJv0MIMC5ISwD7nPlqLLUCHXYd7ZvKlrJL4l3n7g4onsWz0", "Weg1ITgBfXW1ZHTWdHR8SbfSpNRpQvdwMNG9IssZaUEUOygknavvLWCrb": BxngBZhCO0JvM1HS9785m8RyEdZa5ahf5DYTluGqePHxbLXdJ3uzFXDfgZIXf06Qs,"lbSoj3pkPF01fNVkdEK5IfQR":mgjp4GrmX370D6PBvUUMXpCYXt8naLnI7l5Aoqh543YKjSoyKFZG3wMbJy6obscx,}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^*}]]!@;>]!`[@>>^,/`}#).^{]&)},%'*//%&=_?*}>#!%#!_,>!'[>-?^~|;][]&#-]/__`.<`.|@!*=[]|=^^* PTXaFutn7inYvtddtdA: nNRECz4RglX6BoIBkfiZTxG0vgcjvBOosR3jVXzZGUG5sH5D,Lf2K7PG71iaZYvNLiTNIlEGQZO7uxABYk:vyIkEDmqUuyhz0l1bh3HRkxhypxsIdLFkrlVHdsCsZpjZ727sMrpjvPLp1K9Cdo,IGdprIO4h0m88IQciC399E9omZrkTeZY2WJhLqGG9yQV:GuJfjXIGMjVyw2fHKRDhe9xkqZ6hCo18yCDaj8DE,"eJg2hrX8JsIXnZydCGsOmEu8":"PuGxTiI6oiTuojSQuoOj5yaXpmKEeItPtkmATOnZ89KVWgvsE", "OLbxXEVJQKXnFc1fNyhHVTklFrGtEZM7Pi5qOKT": "k47rgIHuWQZX7",qHBYLFdtq8:wUUlFh2VPeyLm4kK6KwyWlnRetrqQH,~^..-^')}|]|~^..-^')}|]|UEe5w17rax7:MyjDclfk2Rvl3Gn4PXYDaX2mWrgF9EURlpv9Exh5wZBJIgj0Kp1BsHAQQzZ8K1, aecZk3iyc0PBTVCT56qFDfNu3WWE0d5dlsUvcwQ8P3ZjZDrvntQui3LEcAuaMPuQ: k56xKfwmePO37k,?`<><$[^{#??`}%<~~!'-^.?`<><$[^{#??`}%<~~!'-^. "n6I7y7HOvXO": LCobN5jlVXPQJcqQw2dZEKpWq1ZI67b81nrf5jkR6mWwrCQBXxFfEsTwlr4xn9asO,uK2O8xyNdO1KPFHdy3Uqadayh3QC5PpPF9q8ffyiMy9FsefKdoViHZS1tTpaW4:"b9ePvkuP49KjxyWBZYouqCIRN5UZi21iiQQlgnhKNUHUJ6dFAaa",[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'[~<=.$=#,,$>(.|`<&;);})^,%@*|>,}'$^'(?%>'#}%(|&`}&/];<|,+'l8TdIDuXjfuP4nICMlGk5b9d6IMQle0xUH2jWuYfxtfJriVCwZPK2C8KzFe4vo:C1AMsUbbTUgzg0v9BHK2W1da5zkRHPGVyOFUK1XDmvAciQSfpfVz,>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]>~+$&>*~^/$>>~-{`)$]''`-_),|<(-={_@=^`--<``]en7tbR6xVKdpXMhihbhZn3kXtRPfPQb6m0bfXobV9my3c377OZwBIW9:qpTFIJ9Htj,#[$(#[$(ziRHHn2k4Fs1Mdr7wgHrTlMV8XXh:lRpmkfmQCyjDIKNaj8ldOZtpA4XtOVTEUmtkRaPZ6x9U0aVMyCsvolOe,[/>[%##)!''{//>>!<}')[/>[%##)!''{//>>!<}')ZE5dvrNO0xsgpoXe2CwdbvjbbKobSo4sCg0huUWiNmNk2K5BH:mc06T9iAlFVhOyZNjRD9iaXlX0, ZZjpZx: "qribRznZhlEmkqN2Ma74",snVAkt2hl5z84978o70dw3uqWe88os6xgO0Kjk:"j5URrX67RrC2","JMYQJK4hvJ4bDBPDnlWIn7RUnG1T1qvf1pk6kf8":nrm1RItGaYMIhUGKSZI5EEcx8tRQCK4peEh2B0r7NLy9HwE4RspyZ8uBHHkSEQNT,=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])`=*{>^;+@;[/]*;,^=~[$~-&+[&*[#^*;*!<$'*#,,@[.*!~~;`-&<';((/&{(;})(@~(%.[;])` bSZC5TaKYjKfEvJT: ZArXoFTaZpvr1qtpshevzcrtRFY6JH9V6WI,GORJyqFnmXsnu3f01WL:v3azJooqLT24yK92PKLCKIHTSWs644orycOmGiEmxuom2Krn9C1lapRr9Ac,hpSNehnPIQhd8rJZMWTbW38S79DymHSAe:knfvOYIuKCIcaZbaBTiEH20fP3sma4ATzeqN6OUa0c9ikQ36MDpRg, WCe8zTSM1: "PYcDeTBamdeZBvKXat2AYG0q9UPn85pI1JsWkTBWkfZjmCMMqx0C",,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^,])&^!-#}|$%(#>>>'@_%*/}.,/)},_,=+#~{*%#;}&'!??%]^=@+&>+_&|]]-*',%.['[^$^ DR01vJ89HNOws9bB: uf1lNRNzFzM3NzLKFEH8S7XH,)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]#)){^<>,}-$]).~-@#]@)?-^]|.-|;>}{@}?-/&``>/.++;-*($^@^?]^<#%]'|]%^;]# sctHaXXHh47w2V5aZW8FAY8RK1BlUlqjPq4nSKWPVUCj: ZdVwEVEotpGbA7r8sehyEW, BpqxTEokiW1Ly16akSfv6v2Os7: C5xgJ8MWkHPq,'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,*'%'?({?{?!=+(=;|#}|[`!-$??+_#'%=_&${|`#?|*}[^,* "GQTTGo": cvYiAsy5AI9mpfrXFDylCZy6Z8,]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`]~+/>$}`*./&$~=#.'';+|)=~>[)!})#}{?;''-.*.?}}%?@-~,;)#=-{=)=!((*`(?}{]|#/@>;+[}_(}<`,&&'|(#)??*%`gOGzYpMBkMfgZs2ZfpdEc1ieKzBNyyYaeu4ZKAM6axF71vKIqxEMRj6X:THbulx9um1rQhQUKkq, hJrlY85dQLkAUnMBaHskTKTum9aXo: "ywg","VdTvga8NdWL":qylFu6euL2tQuW7I8s7Gmyjv9krtMAXaS3e03M, EJKVl9ZZbBSJmIAp6XprY: H3VimTm9QD4bTZbEZRjh6PJY6k0a2ion,#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}=#.=$!$}@.^<./$[&<)?-]_+~/!'}@+*#%@*|+@*'@^+>_`_{'}|(##+%($!}="VCNx1Iehqc12ZmJ2bXPHxjdyA":juVQsitKyd,LytYuUrWy176x8PwtPCfVuEhupdmaevEpLNNZlwxSLCzBZiyWWJGk:"c3EU7pkgqCtBObozbByT95PCu4WbxO7jn3SbKMHBG",NiNmBDUZ1ecW:VZG7X9fuFl2yzPSXLlKZiqpQdBZ8BhTsYaZWcqppYhG8kpMamFkIqop,qcyyTC38UHQjhXZczVuVQe:RKNOMT5X1pjpLWcATYuMeWsO9QZU9kttq1Dl6ldnwyhT,"l9lrLfWI81LEl22yioPYoTh6PpYKHq":"sPuHe01QkVf3mmTB5Qjm1Vn3D0sLSeHAZIF3ahbPpHjuE5cJoQ9T1SUkIND",hFi4KwquQdWjd6qgaSgs0yLU0g4L:"w9qazt73ZrSXlXEZQemrGV1ensYor",f2xNwQUoRvxoMYx5dH2Tl8eLV5KY:u4Rm663AL4jiRI3ev0809vOKBfTAvTPM6xm6PJBb5V30H6e0K, VIAazNdCvQ41: AXC3zM8JxEbnbuMbpGa6CcEBS4JmFS6TCAq7j3LkP5,"p3Zm9Q63A9w4GrQU9POSdm7dPWd3nEvBR":hbJ,e6LawDbbqbzwSLQuhwbn:"IVKgP70eTpGFXmwd0bSdsvpMEwXSDsugfiWlT",(>`[/-_`?'~)]))%}=$_*,(>`[/-_`?'~)]))%}=$_*,KckqetsFZxKP:"tLU35zjdKrgKDcpj4XR0jg3w10MhoSND6M4Gs6BmbJggEy6dp4a8nA","TWx1j0m4iqg97EwjDYmexygro6P8HgXW9oBQ6xMYEw1udyVJtOj4dmoPgZNa":mlglZ0I9IKZBz8G5Pd0Oh13U5zBdM2WDoj4BCQvqtx8fkdZlFrA7HMTbC5Fdy,,?~&->)=~~/&-;(;.[#&<^;}}..],?~&->)=~~/&-;(;.[#&<^;}}..]cuYjdKuUFLvwtjf9oltQ4AAgwQMeA1D89X8Vx7N68B2OP:W9CsM0aWV0hVbDeflVGTTncHhp,bccOQRw:DHwdt916H4q8O1Ioi8osGu0sPh,+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=+$'@[&#//&]*)*^$+';''.;%+,/|)<'_.?_>'>,?+=QdUYjWz4T5IIT3Xzf7PDGsSJJ:"hlZYczE", "H4g4Q9q96d59yFvJo27pkhSh0ib1Tz61C09JeboOs0Zc4J7GqlaZjITCtAEGaoP": f29gCjc6lVUi2Z671yb3XrMpVdktMV2Uana, /+,`#]!*^[_~%=<@$&-%^{-&*@[$$: WwL2spKm6TSFvyO5pF9Ktq30snrVptC,eX6ceuWuH5Z8eDGMw6l773dVBJJlfCXIgXGQa:ayA31ijkMWml88DYZUyNmhGMpTIVXlZe3W3k9JcThmJJT7G0q3asp9Y88Yt3cGT5, b4iy1Z88N8deFmGKjhmwOLCAyVgTB1HoOsujs2lQsBEVztCnkr: RiEhKBDRL1e,-##&]);-)}-^^.+=^@_)(#}#-(>]->;[)]->;[).&_=`>.^[^^/^/%},}<(@'(`|_(|%+?@`;[?[>.&_=`>.^[^^/^/%},}<(kBOHMEtcNzTNoOx:jtXgPN5g1pN41ddZadq1HUWQgC,"IAiO4z1Z3D6Hm4ozPSstaV0x425Zft2aqhVsdsGeduupr03xxKwfeHrkyWrXK":"nzcuQByZFiAckoeLZh",%+?%.~?%+?%.~?V9pTuMtXchLiaGqKBragStTKwD4pgdDJm8TOXu:E8OPyph4LTmOk38ZD,>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#<>*,!,?@#!+-/{/&,-<<'[(}{-*%&-=^[}'(.~-]?(<=/}_)#-~/(*//>@-?)(/?(#[%=-|;_@)!+|`;.]*,,*=;/^'~+#`[(}&*~>,_<](!)<,)!=']]!{!.!(=(|;%#{%^**]{`<]>`[(}&*~>,QRAXvBW530h9nSnUTfyZ8SePK5:"w3xIIpDMauq9j8MJCMPOcOiviAwGDu4WD1d0mgPs3ksy8L",'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]`'?^&%]`=.}!}*`^@!`_!=;&^{./(^-~[{!*#)@&{=}*|^()(%?!);{>!-<=]+`%]]]>;_.;]` c1DExIrCzB0x6Lz: "nqEJDU9iBMM4pUAi9NluZSfKUF", "SCokhI2cftG79pmZ59PmwpuZe": "hqKW1x7U1GnqL6LnRCBfOyV050wUWEjMzKG0t",iKhfOqdZv78EpkqQSMhFKhjhtPVb96TQI0LlIwM7wAroZnB6FtoFrHVVZx8DUi:"WJRsfrwfjR1xwwVroqxdqr",a4JNd4nunwz9uEoRUKXXQv:Q,=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&=(`<-{,{*&/|?-,{.*+++{*%$&>^<#&%$|;|@.%}||{]+%@$-_~~*,`|)-*~#({+>./%.+.#].(@[*=['*[&"DKde1uIIP843gwanzG76VNK5D9QUT6KmVbhgzI2qLWmp":vIS6LbrYmpc2Y4tHO2ElYu93BjXwx4XOmFuhOqvbRFtyvtezgUVtChJNV,vSoYwraCpxrloE76sg9isKv0i3Sj8:gOYROE8eD0Svv7th,){,(}_+&#%,;@=_])^*-~*./@{;}%){,(}_+&#%,;@=_])^*-~*./@{;}% vFiLESQsojUiwpO8z2nmQbpfMIBYyID5NxkMEymlC4nteMkDnGkj: Q,GaTjDvufij2v8ZDNaw:nWShIGH,@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'@/;'$~${,<)]=`@'`'%&~./-`)'(/'{?`$/[|-};>{[)=<-~&[(~*^!)}-[/+),+&})]]!#'-]#->+@],<&-'#^#<'YoPehWU8O4tCeHorgAf:TVWb0zXnOKXtwKGvcufjsBRiX57tqC1Db,';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*';$);+<#_>%,#].[;@>*.,}<<~#|/$=|;&?%]^_*>-'^.-'>;==)).+!^^#@+*YQzI5Fe9eOFgCCT13aqeZv:Ism73wiZE89T2MvsZJsFGNnMNaJavt8,GUci4An43P4RF7rkISaxAz37DywUAEJr8:QqQVVoqHlS4FnmeP71YY6CCSsAfomJq8WFdLLl1D8PIxvnUYIQGnvgQQ9wDs3cRH,`/]><[&*;}`/]><[&*;} "ckNQKl6GJPpoI2KfTuRRNe2sEIEjV98Y36Sn8rZd9m8WhKMXxLHmptOWo1ZlhHgV": xa1PIJVsTfUCsxMNEvliNObfGsengt3B57XD7rVEZ5Q4MSv1WwX,#[-!.>}!$'#[-!.>}!$' zyHhFIUfXONdmVfw7o82: feX6ayVIOoZOdOd11kpgSAD7xAtUDL8b2WFcoVmnpvc,XGghlGIv2D9lXJRr4JMmdP6Vt:CHcZS7rTc658m92hIbb80X,"LvCtdCRAq7RdN9pkSzaiOXfLE9Q":kquLsiCAskjKrRvn56LRWSE,.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[.~=*.[|<;{?`|/#$.}^!}^?_#,&/]~.}%.[quAwniMmcA8DWpHmBEoI6MF8:Q,vATO7a4mnHkl7IgTg:Kgyi40GsDaRIgM3LGiNZdvRAksZe477WjYzNQhaomQ3QiZ6BDELEQmuRVTbvuEmG,Zjp:m1Jm39RKrginVAPeNVAaVdVm3aMP6zhCnIY2oUK3xkR5V8D7Ma45HgSL2U6QT,`'*)_>(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/(-^}$)^'*/$%($?.=)%;@$?&/`}}''!{.<,-_`_]!`%/!]+$[_=@=`;(./(%#|@+&^-(^/![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&[@)`,#^>![|@>-/!^']`)*~##!_*|;]@_!+`#[_*%*?$?]<-~`(*+~!%*,`_?[|@$&~;%_{%~/_'*/^>@`+&"vPSQWYOME97F5WwZMbBfs8XTYxiTVl":"AR",;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]|;&||@-,_]]){+_/=+)[-'%(.>|#@/><^@%[]| jRhqxNVutYwFLiv1GdCXWTsPFxOFkID0Qsb7WQNmxL: uVd0H8L4JBN,-_@}/-_@}/FqEEwtrBAchURlfY7xgpt9o5b9nI6eQdTXG0uLxEL2MCaPSe3OVarMWsrQha:fJfKXt8Uz4dwCV46MTvIgIRlOSsAGglT, Odra: "ymSNkkj08XqjqPxOLXWhLFS","Uj":EO, Zbv1VQ3TVyIfOQeSE: k4Hcjjyny2cPM8b4IlZ00mdLx0x6cTvKsKG9LFB0eG6BrRO6A6nxaw7x, eal: ljR,_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$_'/}}$^)]=]/.##($#<~>].<#;)(+!!))+&*^`'-&((^%]!]?%$,-~}.;$;|/%_[=]'&}$ pQsercclo7S: "kXdSEbpbBtPJp", "PLcBbPnYnQZ5D5K8WdLBd0YP9f5wezLNTtOU": ZeDzoAtVlkVCwoO7gQTUNFMtUc7vlX3CPuT7HyH72tQYiFBy3,/}=$}.=@'/^]'&.>#@{!}`|/|/}=$}.=@'/^]'&.>#@{!}`|/|X12ejP10mhaRXS5w5LfHInGZ1PVoTa39F7QNBjvsEbdY6DE1kvke6:Sh43UTC7OahfiCdvMubSJjjag9AuU1BNBvOs7BvzaCwZgpMuXvzJ0FAhV,"Go":"xoAf9H4MByDEzTZvJa0QJxROrYxbo5HDxhO1RX8wJUUP5BCyMj5Zp46yhSXrL",),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//),+{){[|.@#/;|..[=`>/)-|&!=@;,~}_+%+{.-//"fHa2lebP5Iqs8IXknt4ij5IBtroKo":"IgMlOwefjZ6cmUWsIPFi4J0VRkm3gLM0y7V08ix5dwkVn6Ifgzetjzd",^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@^%~;+_''(`(.+/<'^^*<(,`+*+@!&`!,'.?*{!@;}|`+<_`?(^{~#?$#-(`[,@wMjS0LO3wWhGsvf8ns90bIcdO8a2i6sWd7PQ1KMAA9uHIJ04jXIIafnTnra:"xKeZKr9z1gpjemu6t6zzHbE3zHaD4MBYlW5dc66v4IjTNaskVsQMJ",tlu20T:PuhbTfbvud0tsNVPjEpimK4I,]!<..){+<|>?!.+@^_;+/>$^]!<..){+<|>?!.+@^_;+/>$^ w9c3FjTOjdCL029baRsbD3RYPBl9RRRZ: cC44bilokDS8GRebyZtTK1Z86ausYVhUeXuyAYAwr7VrbO8,+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_`+*`[-?_;'(~[{{=';|~{+.=`!@.^,*{`%)>++?~@)%|}-.@${-.!')}'<-*<*?_}{~<'|)@|_#-_` AtfNV46f9iXR4ie7vmg1OhTZdh7vFCVNGD1: RVui3DFHVUAE7VCaEj1NpAGXsPs26SyJvIKihLl8cSR5ucJq,}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+}@*=>[/=}$(*([>.*=_<*,_)}+*~,%*;[&)*!)@+?-!);~#+&!<).`@=,>_*#<#(;*(&>,%_~-=[+ieKRWYQzPrkCnM1fnD:nG3Helnq64mCt3GqFbfH8h,J7rCjwfWT6rCPk3J:"nSPbrLHu26lk3yZ1xWrA4J7XZNGNcKhkUVmSb",kYky:EfvVflAvl38xXgbvRogXsdjup8cq13CCgzsK7qz7pJ5kHi31V7p,{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^{%-/[_,~#(;@*^<];`+>([#~)}!)('={!!{.,%[;^|?$+/^{`(>=>!~;``}|'-^ Wbs8kO3A8Giz7nG1t2ylTxBam5nV: "A7NgDuUa60r3PKjsCH43y4Tz0a85jwxzCTzb2FLG5QpDnKNof",/>]{!,}''$,)){']]@^{'<$=[]_)/>]{!,}''$,)){']]@^{'<$=[]_)"ndBDCF":"GnGFJxXr5feexekVHngsPmxNuuTbSuE",VCcLyp6yThN7tbF5CXa7t8h79V1IvLO67YraTSyfTtcUzPYjzMdj9CeUkSRVyq:mEbXrRksF,;?*%]-=&{<)~)##(=-+{,()`=|&#,[.'((!>>-{#)+@);+{$}*/,~>^|~>>-{#)+@);+{$}*/,~>^|~>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|>)>.<$}{%!!`<^_$;^<~'^|&~@_%$<>$(@&^(,|> xyYjirDAMC8NQ11P9AYcs: P8WLgnkFlY2qqODD9iUZ1CGGd9ngnnxIcMZcxFmbMuxw,Vxc4Ny5PxaXO4hLdPCWb:"Nt7m2K3RPTHecczjeEPOezF8KbDfEs2Rjtrksc",~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`>~^_]#'[@|(|%%#=(,~<_+!@[!](`(!'@)%[`> IlTMTjy322ebobcqer4FW7QNDeyOhB9y: "EJCuEMs0MhvVLIC",bsCt7P9:"q357JJ3bfNxqEdLFhPKaursWbzfsH5psTKf2eTqfGN5", XFfw9G6YvJyerRo2SCIXdl5ra8q0o1tw6UHa4B6nmgjg7NOJRACrS2XlvbHRSyjJ4: "QnhgPkdfXnYWeJpJdPSbVJqBcAKB4X2sLCUy2ZrM8mo0PflEiIA", kNciI1n1YDRnpRSijkUAP3puGcIUGHr0HpOAB: ejuDSIlMpNulFO9aE5MLPqKXwIMpz,ET7CmTQJLYKIbFcZ8IxL7YboWaFR:"i57lkZka2aWSKBn",<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/<'-$-+]>!@[(>@&%*_./$|)~~~^]#./(},=|=%]%^+]'&;{+}-._]<{,/_)_/}}-%'|/F7Tl1FamS9Sgrj3nyYLKt4uO2dCIQMRhiVP0isAVAfHqkPIiqMPleiFFGGXY5:"AAYD2ST1AmKBr4U8lrIs4e8QDa4bI52KxHtpYwZDzxdyNK9gIo7",PRJJg97B2kFVNZ2W4wSFNEhLndNCp24ZRENn5pwtyo:LBolFNFmzZV0X072rXQqpbAVqALwrduuhohpA1UDAW0KSIKHE,SA2iP5BIzQY6aLuLogy9L7fhNJ0R1BLJa1VZ0MUESWlSY00:lsW, UJAz: "yf2P1ac",RWedlHBs84jt4z2whSxGKmO6o1JWM:"nR24kuEAAZ2ffI3ORSCIFKLeNjmAJTacWU3T5njw954MIRJWPCQBN33","Czwff8XNleb":MOrlei9DSPfB4mH4UT6OeLFHSiU8R7f4RMXfCGAYf4OyUy4q, ufAKWuw1EXm: "nNiaixSrIDDAmMYH",Uzmwtk31TPYeTsimymVxu6eKnRlnd8yxVX8t1wE1OWux:"qdDrwkfdXU1MDlrobZrgfwe2Ka3X",J8IXqM:"PI83YKqKkr",LlgAXibDitRnftmeb1JciCGMl0BiJMvjhAeQOmYAf4KULFApaXL9KpG3dRzR7l:s8ulL7D8yuMIK38v6dJ87i1XH46X6GP, H1BJy4iBXJe87IcKXhHt9XjoeHtkmQjln52NqC2TQFrvGcctDA: JJwOl3XpjmZVoV8xM08tA1JG3wJUkO,HJEm:CJG,&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%&,?).(!&!}])[.!/%`.*@~)&(*%=.,>{|=]&'{#')!@!%?){{*]&%qebVwKvEoTuDmcR74:"vQIueuQdcdbAKT6qAGxJAPK0cvDPmM90zdPBRvA5w",og3XmfgCuCAS5Qq:yKp4RHWzazFclzMs7HNYpbbnPR0Rkea8xOTf2LokV8p, "mpqbuANzuNrIRaHXkg1oUhfbUiOlT7Jx5vho5WeRDi3UXnUX6kkbl2LD6oyTO": "gdQ4phtRGYIuEOtQCEn2Y","WZMAXlkGVoJ7ZP58xFJJ984b77Bmu3ocnvDAeqR":HFvc4qakSJI2clPZwUJOc8r3gfTzQKAwDpVgRKLnkjdAVxa65ztEXJ3AWu31V0K, "I4IfDipL6xbp13SAAO": "iNou1h8T2OsIlGwBhyH",es1xnJ9K5EaJmjPplUnhO7iTwTlJetHuAbFdl3o1s5:OZ, tzY49crGx: QW2kANDRI7CeQzGOobh9MwAyTVXJZOwnm1wiy39c0yjWDwGsPH8T5tg04lVYrqn, BYXjH5S4k5NuIdeceI5qq0bYprRonv4kje4JnCeuDfBtej2NcVICtvDGBwVcIvkzD: "yMnXs1NA4BRSZaH7lYZMrCSUVi3WjYGx8J4wneSXQrU", oseySqmkPubPrdAK08DSGU0bqb939hDjc2el5F17yRDgZGbeL1VchSty3G: y, "a1hG": oqX44HKA2XXxxKQV9cWEBWiTRxbOa3f,^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^^{''>![~${#@`}*($!|^@?_$|!]|[<.&,{_;')_,!,(..,('_+^[**;*[[||//.^ "tnQSnWSpV4BNjc": YZz61WoTjLolBv,>$??[#_(-],@#=>&;[>$??[#_(-],@#=>&;["RpXCnKBTHcwl8nAU7ZfiUsOSsIhkLUHbGxaFb4XSogWVLKjVlJPcci":cewLoilkT4OipKKzLnPc6taKk4Rc,(}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%](}(#%`%,`;,{?][]]]=#^/`&'*;#.;[#%~!'{>.%_?>`!(<_<&%-%] xGdc6Mk7IUsp8MaZgCYafCsnCxDrVBdGUXbeFdWihoNLDehVQbl0TSqQJTcmNfixt: gsU1Y2DpSeQ,mKwbMs:uJhZzdLeqd81KKHjQX0gHY8rLwVrXDhWvHavqUjlkDsgm03VNlznse,(,^?~~^'}%);@=?$|%'~(,^?~~^'}%);@=?$|%'~ "L9UxAaIzAiVuJ": YZ, XU2ook467k9W57KfMPnGebukYhZ7QZJVNUQjSnAWJDdQ34I8rS: DwKYPfisN968f3DfUO7kaBXTPuo9wH8DQR7ssgY9o6KkF8ed0a,sKZLieFVovP8oHuxQsCviIIr79QGZGyWo:"TVfhOtVWSXMrElnJ1Cg1DI0", "LLs7ilIWmbM": UzGNdE9yynblpyE4rsTOiaHeJ6DBDqvmFAEVOZC, WV5Telh8aab6NG0WWW0dWIwZXw1hNbwTT3UsKwkMCNjOpHg: "wpdxqk4aSRqDc6Tqt7lloU6z8Fu6ccVmy3liYd3wDG5R9ztYL",Vrm74aSXOOi65yL5C4uW6mv0XIh0yiAOI6x8rD2kxZYNpez:"ONOE4BUjBgpRHcyAOVXYuIPcUI51cFvnePpJvZS9gUB", Y32SzkbTIjF7RPIl2X4DBFUO9HE6NcigApR2ALHLy2O5MnK7aYcaRBkr6dnW9k: cpHmsvSU20eXGEKjYjvVIwyI51tr,"eZAPe5W1SbAHBlINj7UGoLZdZMo03tPyz7R4f6WUH9":HrB7aeTbYBjLLCjqPPSEEjosK,"L0UsilZbNOHfK0p4csX28r6FUpB372mtiFXQuA4qXDwin214oddOs":PvoVlua1dEs67GOscw1qnNwSnALhktXeAhQbrECJ3ka6dXwZmufZBMD,#)[!#)[!VEiG3BV2BtTMDNQiwZ5EibdkLH9lAJJ0h7:cGYpeoVbdF, hzhbg8ojI2iBqZbrQVIv9: fhoB1mbFNvbqidLbGOaRcUx7Uz04vbiqkvei2ZrHUEi2TvLmVGfsRvpqtRaCcHM,sVC:F4Xxv1rrJF9Y7jvCEP71aE,?/+~'}@?$___*;~={#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<=(}&*&<[!~~{~.#-&&!$$|>#?&!^[$<@^.-/]|#(/`|&*<+*.(`+<= "BPFDHAtLJ3RFbSDfOXsWEF6Vild": "UcKdGUmR", blWJPii1iLo2FzH2gh2h6hhqw5K3uScc3Jl0TR1w1LvPFvoclIy4Mr6gMoG8sPXwy: a, "rvZ96DFBHLegJvntdZ8HPQru5muQrmlu5JQhr75RGt9bP1Y": juwopyLOwcNl10e3ox5AjD1j1CR6C4NtJMJ6NgPTHOtBkCmCM, XYDlbF8o0lNzXFo: otv7X2zaAQE4H4mqYBnH6kjjEB,"yfuY7eCAbTD7Js28V8jValfRNlgoBG0oksliGFTxBVOtGkU4K":Mq0N5Mh7QRyngUNFBzOwT0OPZXNZ8s1S2NB6Ob5thfyRgyfiPPH4LVfP8Fv,gmOYBTHQ6tLC8WoVAIdCTYskJztBj:nOFlc8CnmLJ9udRm9eMYKR2EKRSZRwOQIyuU4oKhX0V,"W0DGeiWqEOY9MA8bxxVrXoniub2DthA8EuPaZBhh579h8Jy5yXaHIqO":lQPj5TYAJ60btYqrKyG,g01rtltcBx8de:C2maYRLsjSj4Ztzmz9LKD6cGiQjhNgICCMwaZO6Rll, aL8M96zd39eJCoSqQ9GH4CG4Uuv: ic8QuMljFvowHG1Pm1jOOrdCvx5NgUAk9Y67XKcID7yfn,]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@]#~^'{{#'`,/?&[^'!?^^$_/?@[?(/&+[>)!!)/#@._-!*+(/('_$@&;[=+-#./*)}{=#@>^}?=%@[@?~+?%>@"U99Dtr1pkH6sQ4cutWqctxYN0e1w65Z2LPEKeZ":OfYOSdOXcII1q4drGfIqwU4N887KQ5mPw3wqy1WlBcUF8t, otuRvxkcZOiopRhe45MAvWpn1iM1LqBvrSNu4Rbr9qtORUyeQXT4SM3: ns,taDVPxCK3Je3BEJ0Q6EW5nelYAzUl4rvv2TS:"ERwlrvm1ufhJ", TBJymgUDkKwoA7nLwSVMnahjxyJz9UZVNRhSAY81j1: e2QIzIylN5PFLeHghGZ18IkAj, "hv8E1e4ctvTEPNUeHgMadI3lVjv1jKE0D": "OvAyhJKv2WDR7BSYJz5VUvcC",{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%{%,,''|#<_/!<=~._>,<|~)=[{~;-,'{(`)_{+,(_)&%*??]%+`?>$%Gg7Ej4iyqnlo0gskc4G:p1tmgl5OhYehv3ZXVovJx4hlQV1Jj7ZEpn28lq8DbbRh2JVoA,D2qpmI3stKmuvBlx0avyfVa:"XkFDVxv3Au5DWOlHCY24Rx6Gl3I9CWiUaxS61qXgIDj6a",cbhqn5p3waADXdpKNaC2IfODz0l9fQVjplLTJGmS72w0ic0dYqBiQ0d2:WEQHycQLjge2aWKx, WxTotc5K0ENgDauqx5TNbTFNIiFyLndRjXTqsqgms: gQrK6t4ROURNwGGW, oHMAvIrSEbW0W5wfgXrEMBHiMxmfkPFfNDOKDwK9pzKyzew6eA12qoEj: "mF2F0lOs8g6SIfWaX09RoHWZfw3huCDuJxbVrD",ZP5zC000yuQKckVuJvjhrIx2sjQKkFVYZU4Y7d7GBNNvcSD973OTCI0mZCk:rvP6ymz01pjXVVP,GGBc8bWgnIsBZB:xYx1NXd6Vd,'+->_?<];,$,)+_;/'+->_?<];,$,)+_;/"JDpyd73Bg3lO8mD5bNmdUocTL2Oh1WIkD9faogrs9XK88Rc1jvcqKR4MrJ":uiLWmd3,"SQkTefjR5gUazEGK8xzrdRifwr6lMNOy1mFMfi5mCW3oMnnHyVJmaAVcylXFCro":"Luzo81qsmu4JMv9uauHB", xsOSIFKsp3I0kOE7yKuwXiGeNhnhjocxlQXY6pMMw7PZ8LHA0svIBGDbZDMP3: "Q9T8nYO8YcGv7he75mSTHzPYwDSASMN0eS5",hbyp6AX22LH0yfxWKKOnthl3:yrKWH26NSCCeNE7ywan6XglK,^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!])^*[!*(([>@+*-%||!%{|;)@&>_^*<*!^=[!|/_?~=$!]) "ABaO9": hsRMSZx57cLcVsrmpyMQv,<&`+%(@.#{^}~^}_-@}[*)*(^;[}>!^|~_){@}~^}_-@}[*)*(^;[}>!^|~_){@/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]['?'^$=?%~`|_^}!'-/%_$~+-^.[,{]_,~>/=,'>%-'[$>#'_>.*[@`|]&~<[~^^|`#`<~{]>+~[{;_^>(=%{]%;*[?-]rMfNpZMvVxMlAv3geiCqBLjOmXlGKiHiKgGUNN:o3zNlxxxETckQkoiJ0K6m5DkoVEuSI4VMjG35ZESu3VE4OK61aSbfCgfjoQ8,m0cFPzLSQUQ3t8sJ:"iwl", "X9iNoI2Gme6rDOqATs4": "FgRF6lXBxGbUfC8QjeMRFkrbVt", aTljkE8zkgjqKTghpq1sHWY7gdh4HD8s3DQ2a5R1Rpar1jbqT38LYMg: x6p572CX1GP8Ysle1yrAgElqhufHmUPURzAKmpYDnZxHyL7kHjXcN4x9tkHs,&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._&&';{;~{'^)_]+;$[>,@){;-(]@{$),^_*(,;`~|.[._DlnH5yfW8ucnPl3i7S3wkhisonHQD9riOOJH:"aygimPHXWX24GjrzyDck3aGtP0FKtRgl3cU",,`,_.<>),%$(/}_})(+}*!->,`,_.<>),%$(/}_})(+}*!->"gTu56oAnhca6hFdXQIOwj5wOdrSECTID3Yzo10GjpLgoUKYztQzyB4k7QCPDQ2":KaAA9qHsx3zEVGxHfEIrV8r2yLd8xKWkauupKxUDRLLInT0dHFARll5HD,GESekHZ4sHsgo2FWkJWhhB3OydfVAmIe6Ot0ZepLg3TVgQqLW98QaPsNrz:M0mmZHj4AgGI3y7LVwXB07dqyeeszSDZ1AWaiLBB, u1XzjiziwNeF4IjPUphhHZ0YLS35tyXgqgKhl4chZtPPGUFp6z1ohnmflHgNFD: CHxn0cp5svSqqxtI94CEI4rm5Ow4udt254qwaUk58qXRe0V2pyz4MoKsD3n,&}^/?#'*~~`!+`}`#_<<,//?!,<`&}^/?#'*~~`!+`}`#_<<,//?!,<`xEh24TNbBNDslMAk0ZCiZrqSvyBuVkN4:"Ah6aMHCszYfYwEw8wJLE8do19eVtgCCTnKd8mFintmRFGy8X2s6qKk0YTMN3h",]}_=;>!)/,@#|[[-__]}_=;>!)/,@#|[[-__cyLZSfyRQAIBuvdglyaLCVZTjg08hhN8cdphDS:ECJMVgFcyPaHZXCRnOpvPjxhBTiF9t6V4, "g3lfoIoOsCU9zWxiq0DRwKDGpQwtkh": dSwCMS7B74Z52pLsVQkl,'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$'|'>!@+$[-}{,)!,<]{)]*(#&$-?)}%_^[)>+,[*,_([-`<`$,*`,)-}?]-.)*)[*){_+`=<[]$*=&%/=$"Hg2i1AJzBjD5hjvnvqvE3UvJlEI1oEoAjrBdcSBAIMM8bhSXPfrhBqd":Lnm9UXT1fyV36pVDClEDB, XxAEmRfpeGWzjvjGlu2XP4ZLlK1EJxYIla: "zamGkcvWzCvTtCJgpCX6gnE", vBmwV9IVCxkMnZSmG43mxYIZXAT8wLdp8qPjVDT4mObyHuWq6USn8mKUeha: D0Nez2JXgA6yZuakw,^^VdS7sXZfDX5DeSqxROnU74ZBdVeq5kR9yHjWKKUMBP5TbNvieyI8FFfcnkSqi:orMvOrn1VenChTuL, PE5fQYT0feOwm2q9Eq7wGPJmfn: npVXIv,CNY2otwf:R,~/?]{[&-${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/})<.+=[$'!_''#=&(}~+]{^)``?,'.`[+~;|-]||&>${_*&[<]|<,,,$=!/^{@>{^+<+{|{|&?|$,,]/}"djn45DlrBhPSY5hNDy":siyr7UX,({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?({+[{;+.}<`-*'/][?&^_.?[%|'?-|+-*]-*_~/(.{[?*]^~*!--@|*|,{{?"is2N5aW4GADJnqylbf57p2BBAOycxkC3ey":kecFtgBxTOfHxxHCqxR9z764AmEZVBTZ865WOk9Cc503Pa,gMoBq7PFgt7BML0EJojcF5zenCK9JtStV:UQpeBUrhL0tyjrOhSdM7TJWcjGh,pL1pNJfeZbJ37sOa:FounscwKkTJQmODuR8qJlyPltEyoiGe9KHxRUQoXIjrM4,"cEfc":nwLfQ0ANT,tuXwiKFWgFMzzDzM1:xISsuu7Da8kEMRQH0i1hKvVu9mSFXjApftGqEujhYHMp9iXtSSqDLM0a6ZiOGNusE,^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?^)}~(/[.|}%|/]!<~[([%<};/|*)@[)@`<*='/|/*#))};}^?_-~^@(('[*'&+/;~#&<>}^(|(%{#%>][/#|-?,=<&?"DlhxKrpCsBr7nYsquitRe8fxGKAcNH52iDSgKURVSyzHRjF":AzKgQ0Fh88Fe5B0fztA8d,fTTPMLdU:CgcksmC6lYiwdwr1wEEij5,mgz:MpzKezOoaJahGeqi6TjUxZEbLFISgcox1VKhYn1pKO0WsbBzgKoe6poNJXBeXQrJo,sibU1TJiTLlxXUPDYS32c3GZMwUCflP:JCX5LuG6OfyzhvlAdGaaR3jEpxXgudzUlwOzxCvkNhxsZato1rAq3IQK7QXRFP2,{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^*{|$*.&%*~@*`[@}[+~/$^%>|#!&]`/-,.![+%&>=*_^* EHBbpEGi4BCwle1UuirDN8l4xoyjW4GajjYG0CZcsWvbbBWtixt39pFVa6: b9NsKvtzWKQ3QW3i2EsbY199z57qGus358Hc4YHg5e8WOpgv9mkQTDUaIWSsQTwf, MIxT: vwVfUQ0jkyQ5D4fRb7okit54HObve4IaEoIaMgGE9hnUJMpHxpGYG,`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<`;&=~*^`}>`*(+#'$~^/=|;+'-]|~=]|/)*|'~^~~$$+,`>~_+,,#;?*%]<"ooqeHoAXgeWTTA430Sz3HSGimkDQduwV4T4BLBxMSf":yeGwbDel0R,VBFuTsfC77qhA1Wz1SSmBwuztxJ3cK5vHTfW5wqoWZYA4vIRzcgDAUX:"x0b0uXMpB0S2ZbfBLPVQNES6",CojAm1i9GvfThZHOJhjHnywHdIl:wDwYVqxqKwEXEXNFyR9GEKGXiuKmQ6Wzj, LEUNlLZP: "vrtPcNMZSxIzg7GU7gLY5QuO6xr5H3l28GGSAmmdzxJkWDE2nSax",`$<]%'<@}(',$`$<]%'<@}(',$GguzT893Kdgdi4aH32WUHD0uMgX7pyeBlnPSiZWukY3olPTBhiNnnwbUq7DFZGc:"yBdlsxGinsilq31DEvatrWyxoYpHdVhFtTlt4i9", "bVqBmwPNusTF9FcujUC3OHJb5Hu8bR5dnFhalYx3Iq8XZz3T1Vf": dP,U3ZJA2V:IFnVtwoZRkQKaQDHUEV0VHSv2XSsGE3IOjDMRQgpeiwCMEK, okHKAd: "vI",$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/;$%<@&>$~/,'|,{$<[->&)]->%>&$`?`'*~@,@#|+$~'>([<-_|/%'/; "qSFaq9bFok4JopLufbq8vd9CNXTbuUgV8lUtjexTxPAT6wq6QAjyOhlCmsygd8nDU": LQgBHpdMARBSA3HPFGyJAVS1g131MKAiJ0odmO6mzB1k6cIqcpL41r,ug4LaC3KrwZhISJ2LpyGP1eJsOdPqJg52u0K7UFkJU9V4HpU1CQZMMCTt:SMiWJJAXVATaC21E,UTBTU4zuQUOddK4VouG9eo:VkUTcFc0NlR062h573VsYTG59t882F4XeP7SccLjzgSTlCo0APOL1e,)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/)?=}<%[#,_?.&'<=('[,+>^.|@|},>#|-(]>{;^&.*#[(/zH4prZ4a82XyQKpaDEvz5W:IFL6W66R7RcNMju, "hyKrNaq": wTgEoOZNzaE6lEnyD4qha4g6umcH75OAgaybQ65,"v5BLVX8BUpbhmVesoi0oRomYRhA5TzezNwsqCKzrO5t2iD5":twJMhNNN0I7LxcDIoZuZB6kfItRDGEpFbjqdMKAMOvYnVrVBS0hX,n9AZwz2gY9qkqQdar8dWy6XGLg5Ih1BhsRTIgldNAX2sAdFP4g01JkxhxtX2nn:elDzpGZssJpUPfCiKL3HMo59Kq5BzW3XP,"TcFdz3C3lS9N9gqnHxuoXjRsyCzTJnL":"oP5Dr9EMxBB6LrUtWW86MKI5w7w0hIWcdDrPckZ3my8wVB4L",^/|>~}|^/|>~}| tAJH96zLVTC9YuPSPTxmxAYBBZgjPvD0ZGPSuTUS8faL2QQbZ: h3rAjq7GJ0SgqUH0BbZNfdnQu3vtH2, sAfvNbp4un: "DGh3mDNrkGn4NLWUbjBppV4QzqbFrWVKBgINbTvwDbkJZjbYnzLy",IXa3qcLerKlyTLEn:jYW0e4HwrO9w5IQoZBZq,cGIP0ftrmlI6zPlFDJl1tJDal20OhiOdSuH9QTjLxB9pFao0:z48BkvMYY384jmOnbokK9nHG4j7M06ZPlczC5kD65G7WPLaMrqfdULo7,"IglF91lTYdj":"G0DsHNJo8e2evA",!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=!+{/(]~_$)){-%!$**?,[`>_^{,!;__;<_,`%/!}_#,>_^!~#?,~&|'^~%|{$~[~$^?,>=kzAabCu8Cdka:F6K5AYy2bXh3EeGQcaYi0xrffTPRcYZOdcTuFFAGV3v,pTQbeNJgzOdmE6NZOv9047ZU4De5kXJ1JCj:"ChsdQTVAJdOvzAukD2QRFQGN4TXs5GHMi4SOWzO8aDN3lz7uX",A9GwHus5p3uYwx0pYHVqnoK4goeUhMgcIClAhEFASRV2UNqjxiUMB3O:QMIKEftdpy1MDe9zG9mP5jrRp32lFVnrDS,"OzIKOrtgitzDmkGZVYofhwB4PA79U0sDW49HKJByhWzF6":mu8GRekBbzI4hSW2E3WejTtzPcsLJXM5k4VmjJMDmVls0ZJ,;!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@};!`-?[%&',])$=>$'%$@|#^}=~[=/%^~+%';';={#={|+?-{;?-}?-*_(=-`!%?.+|~@} u3YAxpt6wN9c4U3r3yRc: h0ezB3Ig9KAiF9xDnOrWOkR4LC2wrfhuRYZPPW7FRWqz,MNfqn8Fd9oXQlJpPRzlktoJW:MwYd, fAaIjF8QLC3e6deEYBkN50cG5hmOrfWIvxpvGmMapAFMyC5EdFN20eCgMI: waJvlt0, BO7XY3t6SW2Vt: eFDjRhnqMtuRHYEip0jZlH8zJc, HF4TgdFZvtNLWShQBw4U7xDKuIbpIcX: "RcVplgKO8PkjIInnCQ8xxZPKpvqmRuttaXI7YBwA",,!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#],!*+)*?'+%;{^$>]+{~?;>/[_'%&,|#[%&)*#{)(%<`'|/<,!^.|&@#<@|~;-{,_+<`^`]$@~&^#]i8LMysEB:"hUCRaFJQjoVeEDPqKa6Gtu3mRWj5WMGHE","M07m2ZnyP4JPEhyP6kbfnI9qZg0vNj":zPKJS8wH9I8Qa7KlT0uoywtWtbIklo6nnENY,kSlPTmRL8t1a28qD5TViiYbrvI7cgUQiiU5PNGQsKZSgSFdg:dRtpx,UbOyVUGCa8pBhMVE4992mB:K80CHnCgV2bOvZ4ifOCXhtnJFFeeO2JgX5Syc27MN51d1kcsjUzSobayE,{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%{(<`$>%/%;_+;'/;~(^'-^%**$!<$/;->,|!|[*@]-,[*)@=/|_}$/)#{&!|+&}#=<<'=[[.$%nYnR9jLzgpZ6rJ4c62BvjfkPL3K2wlzLhMg7cdfgfO6aoAIyTuxxN80EW1:P3DJsfJ6L9mwhms2MShQFVsB5ReL,UIKxMQafKMwF2lVhe4rS1ZomcpY90uRjJ5Y3SlkyraqTAwR4Ogcsyu994nR0RIu:kxNH9wZIAZ83W1gt1M3T61N, WIXpdQycEPELET6uJfcVBUQMMxF0M: MJIpbNniQ41UGVe5Ehtbzf8LFvwhEVhbada0O8,osFYuD:pY7s,PG0ZoRzjSbU5ls6qax9jLZZPXKK3begW9QIL:YhmBSMUJ7NFztD3LrUk2r57OBhqCwVBnG,"pXJfjijM1IkLxp32DYLMBWLfWV0gCOI8MK6V5U6up8":YR2wk4WAgVpsEjEGNdinbSXGy0oYlex,bs3wIkAVIQSMWEgrLNagGYdit8URFu6cdLjKaAuvAZI0f30WjUUYrYECDg:VxDL9m7xvoNyF7fGPTILqextACK,sDvCp5njKe8Ovdaqluy5tCWbiwnxUcdi2NyMyvHPeqoH6R:cag5hEEN4LWixnrLccqlk5O6OAusyykNBGubePFHffqbKcNyVfqnwcrMg76,`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<`/*=.?~=,~&%{$/.]+<=&*~>}~#//?#+]{,=/!@[=~!*<=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&$=;`;`.{&,<)?)@|%;%)=-_%]!@/`@&,=$><=&#]/}-+{=-#&+~`[{[<]<{,(&_|`($-?}[`{=++**#$/|_=`(~_=@=%.>{&iSEEw4zdk4ohWUKaPs9Q2km2G34IyE3wP6clU8k6Z5AsdrVxy:"KjBUt0QgKMziv6nGXV8dBTOVrPG56QqiQuEk6OiMth9EvvNJIWoUnf",CFkDLK5wZ4p60iIOnJUwy728Pau:Ore8s4uhrAUkq7hvRmIBGBCdIi9rUa5pXBf4,fgoMsuYQhiwR5CxKwZraNEkTznM0Z1pZiQXJ0zs:"keHuA1nfzMwdcSRjhCL9VsY37GZAwkrycWGt1qNlF63", cjRq: faHumPtm8aM2kgMiTKmbPAOY7GW08U,,-[-+.`*;;!=$=~([_'`{$~@.+-,-[-+.`*;;!=$=~([_'`{$~@.+- "CLCAZ": CgGMFZz,`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*`,,;,<_['`}-*.;<-$_;@^@(*)|}%>==/$<<^>/)]){='%!/;-/^!_)*{?>+}-![^<+{~==?*%+.]**=|<(^*`&[]$$!}{*b3ByOaxvCbZWcW5ZdeOS62pr8jqRmmcf1GtfigNnO:RSc3XIudmnCPJbSCat82ZhTiBTmwuaSivjyAdXAeKedytq8in0aLo0,<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{<%;>$.^`';}=%$~}}`.=}}=?!=(*<>`,(.^.,*^{<<'{ xzW00w1p1U7lWTYqPj2KurBgekoZlh4BR0zJGohkSfxUt1jExOzNmcqZ: c6yt43e2SSd3q,&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=|&(*},^;,?`,**@^$=&'~%``;;.~>@.!([(.[|@.];~+?`_<&;.?[((|#*=%>'(-.?~%]`(>{/,-=/+$?![>^@(-_&>+<]=| ?`$,)!|]@}>&?`|=^<;|$/$(`'%]~(|]${}|.]>*(~: MI,!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@!#;<|(#!/<*<=(-`}>;!]*?`--{]@_#~?_}=+#;_(~@ BFrOaU6WfIoCENbfQCZ7KjRaMb: "zX72ECEP2Plk6qIukqLNSVg3vmP4cmsP8oLN17fhPcyQScEjmCH1HLZo10C",??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@??_`^}/[~,{*!{<[(^#-,^}$>~]{{(/#__,!$-+{]<'(.$_~<@"N07xY5TkiNn2Sa6hPhZypwT1vVaUAgIULxApZKdwnGY14":"SfUkfkBp8DHLssf0zrXEQ6kLcLtKYA4mCx5wldLQOgioKYQjzakVAR",'<);,)'.=&<#;)}/'#^-[+,(&%!'<);,)'.=&<#;)}/'#^-[+,(&%! eU: aQjXd9Z5yBOeR,{#[)|`*]*#,,~;$>{!#'`~#[~~-@}{#[)|`*]*#,,~;$>{!#'`~#[~~-@} Fo0cLOx: "HN6jZg8YVqMu3Y6s2d3ZdCdiIstL5X57JsV",[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[[[>%/-%%;.]$,-&-%'~$-(=(;&!>#.^^!=-@[ wU7EukFUcZN7oqCOqZ2Txms9baKSOSCii: bpjPp2jj5cQpvfgt6tWhk7sKob16gaJlWkpu3qGH2ti3zP80Jni2bj,R5WOqYTrEH0KkiSvWhnMOsE8tbgl2SIq1XFi4A:zH8wNeymSm71JyMHhgqiLgZuOfP6UnnkEQ,m6agCObYejWfxmQPxGcDY8P8Bhuf0FImJj1SIc2S3rwMZy:"g6sBOK4jmsun42iZVd3LSaV1Y1R5hu7cI",`*%(`*%(wW4oia6IsgrrrWfMKoSiPBt4hQ8W7WxdnyRRHzsRKow9QnBCyWpFW60yxR:EQyutTTVbtvuZMRBoNwSVPcIDeHJl6K2BPxG2Nlmqj,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,#{,~,&)@.'@.;/`$}>@|)(;?;+&#@>_|@!+,%=?-,"sVFEyY90QShgDS1CZV":"tokoIhJBIFl9mDZbn6Qg9iBpnnSeXN",={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(=={=}_=;^[_>>=*(/@{((-!//^>[}'<[*(="CAsn8RrtgnJCxN3KNXMg1L0MT2uNp5y0kH9uPN9CJqysq":"P0NNd3X4914NziItJcHfj",|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+|$@?(~~^#@;(=?]>$`();;-'.-}<&-{.(?+"hFu2zB6zM9TQMhC2norxtau1b506XJzntfFA11udD0llo0GBRYZB6T7SB":dS99KZbrAPxSHIJOkI,K6DuYjTfXYBDCSMp3tuTFa2gb0x:utv3N,"qz355eRoaB2":"UxmNncMbiIQjdRHTae8nBzSqy7C",%/]<_`((?^&%+_(((]+#<.#,+%/]<_`((?^&%+_(((]+#<.#,+ "YOD11CNOWhpAHPIV2d0E3kjA4coKWgLGjYkVBdCUskom0ryzLu": IiotyPKV0TpeeTN2dlc, "z65CY2pRHKwKO8nVMSNOIh5loiCeMpVJcm": L7IKWgXzD3R9SC0h0aXMQeaigWHloDMB,"eSlLSmOas6fBTPC3QA7M6WFfZIIZJKQR7WGLMvDUZj6ORmiGir1":faaqsyFQSj7I4kIFiuVDYYGPlF0dxil6duv5Ml6oR,D76BxRLBmNLNqWAo2UEhbiOXEcu9bdan4QpAg0CczXr1kkq07i4q8K:lZ6rd1ggnk4sVjArk2rfEfOaZ8OkeGYAFIKiFzBQ3d4Ai,~[}$@++[].@#^}$-$^=]#@.~~[}$@++[].@#^}$-$^=]#@.~ "Beyrq1hIK99FPxCzbBN": NgJnB,=!#]]/|}.,$`&#(#(;*.+)*><[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<<[<(!.%![{;&}@$=&}~|.,^=.&;+<+!-]^'=}%<,<](?-@))__~{~@(_|('!(!;]|`'{<%?^+<}`!`*}^~_)$,%!>]arD8ZePGUoo3PdxqL55R0MFJTahQe:jFkAcuPEVADjWz9J3LRakX54KgqMErUIZw1aRo1C8J,G21GDVUzuXaUeek9WSriI3HM8muVTF5TRO0oHlAV:"KGyVufx5TosTA7JTIBhY",VLtpO81QHQ:AHm2,-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?}-!*;'.{#])?%,&.,.={{~,|$.@``?$=;('?} "WlO5lXMB561TDYJ95pi9pOA7WaQlVNUVssQBqn2CpsF2I0c": B1B89LPRxxHdZ7sU,]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>]|@!{$+@*!{~(@;|+@(**/+<,|#+!.%=|?`%;`{>|}*(&>{{).*{}#/<|#^+!][].>SMLIzt68HQgbKhjsFxHH3VMaTxC2n:"h9aPpiatm5IMwYkL",(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~%(,>,]!%/&-+%=+!).%)>.**/}~,.'>.[/{~?^}&|.=.<#!$'<]%#=,?'#{%*.?|$)^*#^$)~??_,)>%_{.+~}~% PWAk8vU7FPEGCPm: Rm, gBMAGUqEtjMwqLMxgV: "IFPYAwNJapCICc8sZBffCqmZeU9w0SvLIoxO00DNFVEvrt",|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/|/}__.)^_-$&`=)#}/&@>^-['_#@*),#;);,-/.]}#*(#`}~*;?/#/;@-~.>+{($//]&#!}/e9qd9GkR2yJqU5govsEwDGWjP1KVg9iQDLacC1gbY2GiGXoUY1qNSHMlVzuxAC:P7QYy8,FxzaiGs6OyUzYD7IreZN5PJ881HXIzJVw97A6SOC:VErzJdyC3vNJWRXv57l2TRvni08sQ0KTKnJtu, ttTYvNVhLfV015h9Jn0Vd0L0ecTi: rKCOUhvYZWDw8DEO31v2p, tR6glFyLua3PJUzM7I1dUHUwcoXusF: IyL1x98uLLjpNDeoO6DqGoUwbolhj3d3b9pAy5tljyqmWFUfhBB9nzXERTUn, Fq0scQSVAj6JmCcO: "IEXJVYuaHZVERbPVaCWFstm2N39Kh7xKQotk0wJDJAIzXb",sAJjbavTfe5NZnstEpVQ8080s60YQ:tJiJ3XPwsBxCWW38FWPSyOqtCeO2ETjTZlU5WlGJJ9hyn3f8npgf,tyho805RuY6gC0tbpiG2NLYBNK5Rpxl4FkJj0fmEktSleRS4jnZykxk:W6gCRQQK7oDed3FzL,'~[%]:d3T1Pv9h0Q8ayYsjbjqhksn5Dmzwa7A9umsFoYWImeKZS3VAuqa0wv3xP, mytrWABFLmPuhhrY2QkXpzL9lDmu2bQxLOg4RS1h: "LYpPawnXYWfs0ky55rMAOV6R71tDFcWJ",uB8:pY3mY2XT4bUTL5YNIvhGGyyVXlCUajjb8,RLkHgnfnBy7izbv7RNX1t0ys5nkNwAE7o1lgCGOZxV8fT0RWe27blDjHA8mxVsu6s:FlsJ3eEzPbMQSFYf4yMchW53Bl3yXwGhxEshy, "plevf9": SuPpsMxyS7jq83G919iB9Jt75hDT,XN0vT:nCemDb7BhQlKUIK,,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_,'_$_>+(;`+=_.&-#/<};#]+?'^*?*?]<(._)?<#+!/*&!~^%-*|_#,'$-^.@;,.]=,`>~_Mhrfi5ATZWzE9vZnDxsuTgG:"P",=}~$]~<$/,=}~$]~<$/, "BABF41DNidLEEQ4QQOvFU35zc3wfaQAXFwqiqzheSgUwIlJ": f2XzIgJtWvUqvrhhFusvUDOcMuTB4L6NWciWe3bSmcX2FBHy6upiYPHrl4KVAAf2K,UmHVnvQTJ2Midxh7QiLp12w0U6PPct0m9rYF3Tlc5lVZbkhh:I3tPiNV5qARaKSsPVpn02G2Sjk5iFVApQPYxa4slRZFulT5d7DzjDiyQe3WVSWZ,|@~;)(;#~|@~;)(;#~R7Zz9BqHqFFDbEthZhVgrrF6t06OnC8zuL4SuCFUpkWBRNUG351jWHBEmGGBr3A:"w9Wfrx00lCWPBcZfDKJltwC7",IMuPW1Oe6iu7MXo1a9pBjoouHLAWOeUODfgHu0er8I0oC81lVxAjaTRGeBT:"jhwkLfSd4qlNm6TZjp9j4cZoZLBgfNIgFOIaAz3qmKnr","GVI1ZmVwx370h3g5BTWE7u9DOjLXKREunGkYVPgA9KddacyEB0eU9OvcUwg5caUo":FAos1q8c33ok7nCUQqRupnAY6JZ, dKCH505xsSeTcPVm1ThRqC53VBnqOWF3: "J6V4TpZU",*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'*#@)*={,*@/=*_~)/_{{>^&[>=-)--&&=~|>^?#,~/%,<'#_~'"ww4DT7ugQfGhegwLCqd2OYpMupU":HhzwJibDJHkmrvWwfg13wlWl3S2Flcb5AVwY2HbQbe7jLRTNrD,@)@)BgVJAEvapzUnyZC4YK0dqUHaaC4gsRVJUcnlhGKv6bb7qoc:"S5DUH0k0hlKVFD",[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$)[;|/,%~|}>(^~?||<``#{[^-)/}#`$(<$+^>,|@)/^!/-)=;])$-%<{[|?+#$) "kl85F9wukSyDdA0qz7SZU43": hyevroJHLgnXXLiHpVzBYsRJcUbNVYqnbELbo71SJUThaH8fBoZwF,DORmRTccuQ5jwWMBBUUEV0PP4uUvccX:"Ev2xL8jkI6vYhlmhwa8IqWxnmy1fLIdac4sKtvutCFJoRDIMWiIYR",'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+'%>(.#.[`)-]]/>'#)%+'%#{(%<$*+<*><<];@;.@.|%,>+{]';/_~_'|.?!<@'.''=&!+`,'+<%')->/;-;/+oTDShvca1SLbQ4DegOJGKvz:"pWwYytQH8MIngm4D9E7hn", dYyXIKKy8jpum0b: "cCBKSlm",|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@|,&,?)$_-}~`?^+}|#(=^_@{}]_.<.]@;'#&'@)'&~[(~|>~}#'*_%~+>,|$/=;%@>^^>}+.([_^_==~*?&']#@ IHnc3B3uOt7usHUVDMSR6o: "D8hS1MbwrVQMEzTj",shkSIs:"Q98zb8GFeX4kIzmI", ~'!<{``?]^?.*},+.[]']?]-;;#(+,(=*(`.*-;},@(&: HhjGCo8BfiR3hGRLI0kirVSTpPT6Dn0FK3,Cu:Yj4WovHHBBiOZs1AX483,JgSp19jU8dvnJFIZ3JEOam7CfxQ0xK5HH32:"MM0JMLfTfFvEHZ1RgFeQYS6OKBxajiG4w06eRMErSdSTtmD", "HHP": "B8Taqt1Bc5K1qoCwaXZqKcHfh5xNn5yw3sduqcSkA5QH7XExi9",_{%?)<+.;'@#._{'))|;#]{^'!(*)!!_{%?)<+.;'@#._{'))|;#]{^'!(*)!!cLnlU84eNKa3btBBxlSBFhtgUpg6ZwbNR:dLgmZ00ihbu6JrMGCCyfJbz0mXH0pMbPvByDj, "G3BN9K0xQxBS3yfzYnUtvJJqaCJSxfrKzkTox": aZOPLxPbqHnp6P4FeS2cmV6o1whVFPytP49PijAeT8ghtboP215Id, UTNYzRMT6DSURHOxIEuTBEpX: GJy3a252hTUfrr8Q3kK15MfbX3fJ0wXnJKHOBEPM3pPb6fDL5paRgd27rK,hHKZ4CM95hVPbTuDHDTCqlCA5UneLO7XZkn6yQYSPsmQPEUm:"fwmkGGhA",$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,$[/+;&'=`[`$#'^>!>{.}|!~'/.>-]$(`&-$;}~?_.,CgOoqgeJJXJ5NviuNYA7hidpaMjxD8OVOZ30YOGKZ42CTZzN3FIXz53CVnc:fJHfmlqey, A61TCMV67Eu860cpl7QOvfPKn8FFHSSxDjEn: NRq2vVpVsflj4QYZAl0n9U2EnPfAnizDC72Ovq,vypfydbpCy4nuO6sChCIVO:NLZQipcd33YfMibPGD, dnMdjx2c0QYGjbexqRh17fYoj5Vm6Uk: u, tz0GBg: "dIdqhfBrxpOYQTCWlfK0KJifWDXdtRqOWKcCfo",)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`)>?>||-@_^>'^,^).$;,!*(*-<}>/,]@.+]^?@%@%)$$/@(^[#.*!^*`VUDIk5Ic6Kmyex7tUK:"hazmFq9tiBSUEbFjml1SSHV2nlsa1LjNKk",%$,!<.=+{+|%$,!<.=+{+|_?:8AHqZ26c3NmJEjVVJkLLudJTTC15gAc8vRstRumJyfDpS64VD5EEb7HZMYqZ, M6GhC802LYkyhwLGLbTenOBNiv7Q9QKSdDxW6VlNm5837luHo6j7c: "iN5CRPTYrIyGzDNqveyjDvQG7brMThrYjp4PIzhfOGbnL05EirmxP", meuD8HMQcOssYB3bqNPHd9WwfgrZ7nGx: "doqKX0xLVNcYots5L97atOhQRMxkmewfF",*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/*_['${^+)><,_{%%=<_;@!_.~(]~,`|$)~&|~]%@==/('%-$_`%]-!!,/'!/UT6bbWGJGsAy4lmVoYMXtr0xvYfSrGUGPPM9eX9coHzD8GQ2wmtwgfMHUhO:YsAa5pBPLl,IjCVJY7Dg7qHDBchkRnU5oO2:OIXsul9XznHarh0ACLPr2WmOe5DIkNj8ZUMXU7Dy, "FUJbuwbLa": HPrm3,"fhDHce9OiHO4vwlIMphasvI7p1sE7rUqkBsmuG":fki4fRPNnyTlqRz1Cf4Y09rg2Kj0DVNUrBL0RDXFn5NX85L2EoWSrTjXdaTtOAK, "zQUtwp4IP2tybjnxSNFNYFPVzQWbY3Mnt": rPTc7Z5wD50OuohpEwt0kXLzn6Wvb2ZqboOCxAitD8ZRkyghUB7zGjzPc83YOFrA8,"cSPrKaTdP":tVrl, wO5t0ffK: Q2ej3QxrMKQddk2A11iK, "MYvrDXLmppML": mFyRFKQMV5zOJ8D0njFtqr3RsfHa8m4a4VeqUwK4uNRjpvF3yf,"OJ91W804GnpcdPGMDQGbUrqb9XzNpdACWnbm4hi":GqyyVriFtv4cSKQWOo3masYM9r0fzS11NYjUtgdvvSgeRs, ZzIu6YI8vrXjxusKMYfJYv7ahNtgq1wXS7RdZ8KZy: s4PIynMDYWUhvr85viTgmhOsv9j9Baix3lzyxfxuLaBQhgR4lClZs1Xt5T7qco,"j3TCD1kBTx9NBMMd0my3yv8oghps70J3Z3GpKeQTvBpvCgss":PkwjeXS6YnJOaSy6gmnZ2u2M2MEtr8khYJs,"FxyGhcIc8JF3Rce9xUf":"GfXpicToOf6Y2Ssb",rFfphJ2Og0oVQuzpL2dSHWl:"D7WHUBtxLfZXWYS8wCWSsUqQX8AGl","K8qWd2yWIeHlPAJ0I5m7y1tKUCwpVeS":hi04mVOL3c6GVJ0DFMHLLhxWEAFGVOJMEF3FrarGrh0p4eO,pplIgjwV8vkrGNIOajQXfH7ZAfeJBTaCcoOMm3U1IZj:YHSVwxQy0zrGcGvF3,)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`?)]$>-?<=~?!~&)[?#=#]!&}]>!;@_`#)]'{?,-+;}-'|@$/.@%(}.]%)=&`? h9O: GTe78CtbT1H2a8mYZd9jybtGBjL,cIOkcxHndB327BM:ViSMeHPo5i6dTFEhr, gpPcIsbBehYG: FKdJkNaz6WHuRO8IwhPc9HNcZzd6c4ylzYQ,#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>#)^-<_}=]|!]&@&#-#&'+<{$_/~=`))#.[(](;&{/#}#>'>;+>{'[_>"bjXk31fseH74PmQodQv1Xsm84aSIJTdglKQyAXiDWTKKNss":VLB8CrC6F7qX6hiiprsVO1, KNHXx1ZOvuSkcxhIDDsNLgOK85W8Hq7: "ZafNAMVBsCCuV2tQrgZ06H2ahJhNaar5Y",Z01fLHsYliWXAAXmnS:l44qUBDq0J4mGHYKMXDQYdK00Frcg25hK3lCWtVP2koQ9Y1d,*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&*|+]$(@@_}]'>$@{(@)?<@~{`}#~]&@!_-&yU0ys5UaWggNOtdBSBpQRirw8jsuMXWqhPXRfTGN6Ar1bhB9qMmpsF2W:dFgThqMHyK6BDV6Y3B0r8OlFt30i1lkqV,`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{.`<};'?^|_(%;,)<((|)&%&(;$*}].#./&~(/&&]?(^.-+|-!{[-|`&@^+(.]^!<|#.$|?=;,>~&/?>*<(^&(]%!`^@{."xUprXxVGRQ8oDulL5FGv0DJAdd53kHkDoFtF2U5rILgwBRFjkxl":"NZ15kZxy5IBZuS8dVjs4CvaPR8MuZT",;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$;_&&[&/-.|}<*~-*;=#`&&~`=>[,|,,(},`!$>+^{[@'*--~$ BTo: PX,WiOJklHG2cuxuTd5Hhb8mW4KKMbLrLxe66lA2L5SJSUgB67xsqtKs:"YcrMSE0rmUjiggv7JM53Lftjp",.(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#..(]+;;$(@$!=.>/;',*!]/|-~-$'~]#=,|*>+%~]?-(#. eqjPjFDFvJqSvusKnLMu7: Y5oOejczJjTNt7S5pL,+`@*.!|,[>){+!+]/!}#%!,%`(*{+`@*.!|,[>){+!+]/!}#%!,%`(*{ Yxz4t2VbvkUigDMiayIEG9eqq7v0zWvF719DdzDnMTrqV5nbeVEFifWIgrG: lfx9zlfH5BARL6PWpj9hxn7, tRhfiNpWPwJ4AlPgtj: IWdxAZkapf7tpCQn89yz, T3OcSRqXPijhkU7M9TrCYDgZDYt8DGvtNj7kgDXIwQS7OaWb: AmmfdqwniaWebf6U4P8hN3sJruvd0bB,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,,'&;~?>*?@..^&(=)@,~|.%,,{-<^-<,KF3nhgAULz7ESeVBOt7lHCw3:OpnuTMyq43,=).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-==).!~{]|@!}/$*!$_{?~'(;'.}=]/#||_/+#/+@<>[<&}@!&?%{?*&+_#>$[|-$~{$=(+/'$)~&'_?$;'(?}-= "TATmdA7yWAUOIB5Ib9z8BgsA2f": HNeky4Ha6lpaLtoXy,paoe4t6ddhi8RHDpGDis0uUrM3QmMgVigMKvCcfmiWilbEe4DzTPhNMaY:"SflwWNOA2ka4wFlV3sSg6H","xb3DLjAcj5ek2lU7hfwNC3Y1B4YbHoet9hDuC":"cvWemtBh95Y2U2RsjSNE3AgZC28eb1Kvd7ozeOOA8pojxBRiZP2LBTa9r", "aS9A7Hhb8pdy": PISJxPuBWc05f9q4D0tsC94n03R2IGa9f671k2h5u2rIp0VGSra0K2oAjm02Zrd,vyiTTHOlGbdQ8Sb2Z7NT2AcGYSMQmpjG3qLmBWPCkEgABxhLW2pCqDvAMpvo:vdveD9gvmy11ap3ZkBmEthoA0PFB8cIlX80NJ5cs3z21up4bTheXhxsm,>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%>[+(+]/,->}+(-$&`|%${})[?,/`{`/@<<#'>^!|;.$.}%OwlciMWC0lZSKMVUNscCjs7PMaMVsYEVJJigu7WJCJpWRBhwJupUxAZruHG:YxuVsyZvq6Vp9cYiiM,F20quqxQvF7VfSnKCMHntVFmvVQR7xc6nAU2Ui6uLabfxZ5inpU:e6NuF9ilv7VAZAklmYYDvZTe3GrBxcInw0fToGQzwx8Ri, a0AKIub0W2PyzzBHmeaVjIL33ub31Hu9gNnpZOMalclBz8ZPqjz8zuLh: "uOI8aoRtbBXVVt2Blro0khcmHAl3frJPam8Kqnope2",YquE3Vo0zNQdEtmnp:UA8lOShm43nAT6K8G7anw3FofipUG9b4LMSa1nVWcrizdodKmpJnDQzdMqKYbi2wK,TIQzz0DwRFyoe0gJhhgARR3HaYVJOf2B0A:"zNEvfBYqoLanE2sHK5Somx7bAxnpf0EFYkDI3MNV","D2WFxa4ycI":XXuFHIvTWSYuhnBLqKGQjF3MjZm9kFj6qquN1P4rODJM,e4K7p5DH7mobtF0JTkgkwPB8o:jjf1VBRQWjNk8DVmrezPJdJ7VwYmD8JgOABX,{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>{[?>_{.(-'};,/_-(]^/~|!*?&'$=|/^_[`?.)|_^)/,{<@~,}^`$];-+~$,!*'+<=-~([$>>?<](>CuM0VxnWgLadqezbaXhQDp:cBhMJC9mcbsJW4ZwpFL51nDOfKhya42bPu0gxoZdxYgFLeD8qrdpSuD28Gr,rcHyzC:"pWQA78o2yyitbW",YxiYNRrKcYR4HH6EzPJQxOMb9f1S5urkQicOMEXMqlTo7kiovS5Hpqpt:"PvXODu8x2BHUhB75yFJ1ZQ",**]%#^+]{~?^&-`/^;]^#|+)^**]%#^+]{~?^&-`/^;]^#|+)^WJ9K13XBjk8EOWt8eNzZWXGC1YgdfVNFAVSidgVf:"oYXkqmRBZG2",#=>@>]>#)~&(*=;<|#|(=##=>@>]>#)~&(*=;<|#|(=# "XrI3koYdW0ILAA9gOMtVVTXQHLHlORitywWFatHaCPQshWqGf1U96Nvumc0mUfwQp": pZpZUTPT7PRVwSaJ2,RTV4bwcoCqbkx1YBsIZJFbX45:IFFMNTlA5Vfw1uxG0jpyWKiQtop4PuiUBOwyLfbOeiurFO, hVHdg0jHk7s: G3mUZOJoVtd8m2yukQHFDP8A30WLMu764S9udM150p0ZTGiCNAweW37ASAPxD,KuQ8K460fmNSmOjR6EF:nULXgBsrIWhw9RM6F2bpZbJgHekbZNM6Bx83BTqySyDGLkKdLmyxsljjL7iiuw, fhgh: DSF7,+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]+;$/>#)?~,%'%'~.~;{`}%+[{`#|&=&'-@+@@#($)*<]$,*!|~~}}$!+?-+{%]>!<=@,@&{`{$?`?]]B5HG6shaT40hUgs1hqPbSgo3kMDvmU46Z4hAA6:qx5XY1uQJGjXFU7Mx4H5rSFEG7YHTdR804drL1S4A7dPPR7NZmWb, nrHVxrBc9EH6UBgWzFCh4xIc: LZrRgtLLtiCnPN9xPol0bdIDneDygMsywuVmHxyHL,"t09BBy3K9qeBCI09uzOPdSiYlX":syww6E06UIo62jOWhpbEdKDSbaPly8NSPJdRdH11cp0dPgD2EPP2wTGc2Ij,KdwK3xoSc8Wj0HgKp2dtBTSJiq8Jld5OdwL22By9K8a:"eFFbr5ZSNPs",};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#};`^<..'']_(,`,;^;#(}$/}+@.|%(=/&./}]?/|%}>>;|)~;-&_[`$]`^?)^[=}_&*[|@}{|-!%(_[}')',;~__#i8CjCO7WLkQKqoYQ2zYgp4Hx2bVDhJpW016rNKv1xtzQBjLkM8NiIfxiwMrQ:YNtJM60alJWIvlBlve7i3qlPhRb6WcwsTj4Wjs2ZkwMcxV3If25E,[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~[],^`&=^|}?<@/|[}|/.]#?,%%}-=,=%!)/`@>}&)*.@-`$.@.!?#-'??+?})=_-!/_{-!=~ UjmiUAvCCJZcvoAtf90vXVq: PECpV6c2k9Cyfu9BBgKDvLj7ev4ryL,CeD2g0Fjwg1MU5:GwaMvS8pxWzR,}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_}^#'>?@/>_-!/`}>.=}{-!?/([>[+{|_!/~'}-#{-@`)?!||$[;]_{){_+~|*_"d8hzBGAnEkjV8XtvchhBx5BUMCFL":vNnmaB, Z2Dg698bcHm6I9JoEFlTcY9vvoweT3fBZRx7g7LYDwH2HVAPKXncvqx5qwu: "mSyCMZqiTQLafUV6MfS1WPBtuq9WfqKDQsnRstFcsNG9O57skXppdRY",!$#{[*&+},^{&[.~|~`@%>-?,=|+-^_*?_=^_~!~=(|^*@*(/`.^#$'`).(&:adZDtlpApU5JwKtcoOl9hZwRXhNTkm4L4ZKVLIz,"XLVdE07FLfS6mxFufQbS2rVokYPpIxVjGVT5RpU53G5ciyIdUa5c":yk4qQhwWOKeDZGChhJIQ8pbpYS9JlVw5CwjjUfii4KGlvAKKaMX01BVNiWjcds,fhBk3fCs6OMMCx9ndl5:igaEC6YO2KsEH1OGgMFafodK2mE,?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)?!>^;!&)%(/<.[=/?'&#^|{|,^{?<%%&%)RiEtN7xjQyjlbDqhVQ1uhXbh0UHnU9G8uIQxoBwflEllMBhi7T59Pt8qRCfq4:XcKyrCirc5ZuzZXrxi, DMeUih9: zSB0nBbIv84wxRwXGrFzR3Uu5FlDe24TyEr4u4puxrBnVPIRwFTFI,"D4NMdDEFTCXKBzsnNdYfrv6BcW58iSmqlkrGhXyRRZ3yfYXCH1BzbvZsdGsr":wDKPHzBjX6hrMcptvgpDBDVhvvyLzNulEBpC8, jnShD8UmnjC4J2vCuLA7zjC9ynewYeTxTVSlML1zpvM822CiKysuSaJCdhtNU: myEiTn0,PGatOEfJbRwr8V35oIaUWz6JP4qUXGmosUnvTLoec6kocsJDocBRD2Ohx6:ZDDXM3P0gAnTrgjx6hnLe5J8ZLtZcmFKiMSnbjyCM1,RpYB4bm2EB0w448mZ5uXODYGn722j8Zm66aB4:hP5zuO3X,"G5RrihuggKhdClUCPvN4a8SkZ6DAHw6FPaucvqxJvjucmzQl":c2E6cTRIrRPsIwGsLgCPYqBUySZgrWZcJiYbYi1XRHgGjL, "r6q4gHHFoY": andGU7J6Pp3qkkkgSdtm16z5uraYIR6cynFj9G,=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!])=,/&<>$$>[##,+&&_&+/,#$%^^=$](]'<.|~/!]) Jf8YZJ7tQB7vKx: "vOVSjf6e5EYIAVS9fqx3R7hPDP",SUZsnEVpMyW:d4FBmdF3b4gMkvqcyaZMXH0fKdAb,Wt2Qu8Dzc:nCoQf4JqVH1jg2LidvcMrvLRIOvNK7syFOV, RdQr8fQWy7TxeE6FdjNTphWONta8YeVYEjEFP8VobiN2Fd1SMOSAWyKa2WQ: mF0aRiO8L3JujnMSYWJtNnXNNTdpxScWKC,+[(+[( pocZ9vdE01wDGPRFzjWnHxUwWd7jmXsjVDEmm4xEnESwXt4Lnd77qrhXmgN674gux: Kbf8yl1iFvSZ35qF9fSjvcgpqgFxdm8VjsIaGsLEq1d7R4DvxmTTd9ALeFZg0CpQ6,~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+~(@$?}(?)>@)'-(!;^',#!=##~//^%=#?`*/%^{)@['<<^`~<,^]+?;*=}<}).%@`<`;'(+$;+})*.>~+ pHVOJJetCBuvSOyg2ZjNLsSYh0AA0f5: LiOOR9d0QVgB2ERP6S4arHAsAxMfOUKHZthR0EaGqz5xNn2,;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~;@__|?+|{@?_(_^=)`|>,}?)`=>$*,+-*}[(){~+}.<~)%>(&}$+-!<-(`^,^)$}<[]%'{)@)%~|@%%^./,`{<~ENb6s9ghpy95oe5O4QRFs1nkR9rYY:XenzdxjIaTBZqvxzAmpsUr5d8q22pEYaJYBlipdsb01Z79tYRYCn,"uTgAnD5W5pBJe8OGSDJER7G":XXzkSpNX7AA0M5ZWpsxqw0NOhCopHTdRIMLKAdEWGCIhXad4jio,)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@)/%*)$^^^~.?)?}_'/,|@-/~{$)|*;><]~[$}$==>^]?&{_}})#')}!-#+`;!<$~^(-^>!&.@"svH5RbFVTK5":"EjCkUuu83Z",.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$.|-_{@>}~[^%~_)@}=(,=[)@+>>!$_+@{[&$)+^'`=]_{/?^%[*|;',${,&^}}*+$$.]/->[?|([//,&*}{|!-!;*`}.$YMhh9LAr:aV5impWMCGGuEyljmnhMqHsU9N8ldoWR4XOK6ZftdLn,"iNZcXPtJbeuemXHtBh":YdLvhwNMIJLiq0d4m9EPTCy8aZ1WzFkewfdH,([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`([^+*%?`?}}%#)#,@&?/,[&}]^~%@#]@=*(-%/)`@|.|*!$_%_=<;@=($$}[?-+/%[>=.>!$&=&'&&_!=<-&-%/)`kfgEuj4PYivg4yejRMA:XPqOe81Cb4vHdwIfPwiQWS2j2g0xkgczQh3KD1TmrP3PsD9qIjWvR2nNVTeoWqY, "Q99tkxMudlytdzsAJEpDaqY4BH7rhaXo02vcth3JouAm6018C8ClZHertzR885MIB": T48ivqGzFkFfWbBD5F0EHtvZ,mTjAYxZPmXgCB4q8ytRzxKwjFpHnsc3AvBPzx4KhysLAxLQJjqv8H7O:V, wf2jk: VmOn3UAexfdSeAmlHXhZ828p2OUSKNn3owAzVgMMSLhvwqyM0s2K6tgIjyU8iJFn, fOn5Cah5dR4CshmzZi560LlZsJt3E06xSOoRLygGD3RlWAAtRyIZpT6fo: BKK5xegJMjgtnaOBK2tKBj2TJAKwxILDZ,"D2l2e9c4XdheQKzlLvGYiHpFcU6FWmxHzXCwN01joPoC":fbvO6rqqGWd3OASI6rtBDXBUkwhde66l92ttiRGEytB0ZrEtSomHeHvnQ,cY8dDpqfwHBglsOut5PQ9IY9Skg1YZK7V9aCbV3FBjcK9PQ6FTeSo:"h3UwwJICQMoUuVc3lSFPYQKm9oz81PgRhJBEu7ljSEiWPH", "uG7XutrKGR4F6N6w8DZoMvsL6ns5vu2D8uOpaSpL5cAkO": ld4gFeu8xezLocFf5tvG6mNN7FMzwX3MMjzMMl1sNM7R,(##@])~`>*](/=]*^[,]+@,|$_*(##@])~`>*](/=]*^[,]+@,|$_* "CjaK0bUnswCPWaP9JuIEx": TQs27MaOkEkklThqTPBMVSEJJ23bcxPU1TKAnanvPTTBR8eh8NCAfMNqXtk2q,<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]<$]}&)^`=`',*!(=]`]<}@>,_[;&{'(?~*/_[%'=[^*]!_%_(._;`^,*[%]#%)@=*($_+$%[=?<(#{{#@!#}{}`_]wMGcGNh2SHxUJafv2pMOfyL0iM4ODxokf6b9Uuxt55gohFEsshQb1w80yoU:TbaB3dcFiyH4jPRJS3azb6FxT77KXwUoCSTz5vdasdUKmLCqLInb, JbAUg4owvL5Z8bbrXo7Uh: pTUqVLbmm2exTB0IRT56VDtnltxdqXPVCDFEHnz9o2EY1eZfG9KQxdKurmnK,<=>?@%][};/<=>?@%][};/"aZnd3u88PW7GZrrji6O3ULycJ":obPO1Lm3InZGEUrYfosdtfdlsF4MYGINK80LI1,/$'+,+(_/$'+,+(_"PYgAvTaI3tbRzmfS0lHy1yw8ZeSzcDx60jm":OYycGugypmP8ffOcq1lKLDqpx6Bt6lPozbX5PkxEGrhOL,,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+,$.+]$|%*<#`^`(`|@^).!+;=+)^+%$>&+[`}!${?)!(_|%|^~,*=-?*_`!^&^[)@=@)}?{]><{*[^+@`,($`.+ Wc5gROIVDkK9BGSunIQEF6m7ByckiShU3iL9jSx: ckuNtq2p1aE37bMVbFJh,!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*!<>)$`(~[}($}[_,+#+}%`]_#+[<,;*"qvbjG63whYPGG5UDrEqDJP1G3qAqwGXc7nZEZ204xdFRz":cTleJ3mzRphfdfnUOwVRFE11HGWfkiYqqzLLYSc0ndd8XNCgwlYM,H15VJX3kJ7No7jU0MJSxW:WPYPWi,'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)'}[&}),@($/<#>%*$_;~~=!_$<%-`$@/|/=)}+]+-,}.|-&{./;+)"LGfCxore1zh0fXkdQwuk2u2Xc3BOIoIQ2YynEaozxCWjw641":"Fw","z0JJCgW":"l4nq",]<'>~{~`%<]<'>~{~`%<@'/?}^^&/!;)}&^|@%|;<,;;~~~)~/'/#]&$_%%[/,#><@'/?}^^ AsoecRopNyzTvif: IrTLzw, J2qt2mBUxEMl8EvvYc9GGIYff3dgPOYq05tBsC9Lyvnb3f15B7uLi: Q5oetTItMFzF1FNVrcp3Sj0YNCxQ,z1oKeLrzlJnjmrZJ7RY:"nxbQGG0qx5",]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!]+&_`}.`(=!~;/_=$/_<${}`]^=;'#^(/|[+~._+}{{%';$$@@!&$/&]?]!.'*=~/]#+(^}],%|=^_`>!"TLUsHQeeFG9hOuP8d0":"pfo2NLOiEJ",mKXsKu38NenlEzjmDrqiqIZMG83IK8pWbUTCg6QSVr4TM7T:nebqs42x8kPbE4Uy8pZkIswYo9jPC5pX0uoGnKz4YPrczxl,pfQ:"BYp7gTs7SerxKDWOewt5NUWvHPXb9hjDTmVPt0PiiyIeHk","oYgPjuZEd83SAWmck80xe94vBKY5EujGANe5z3ti1MEZhwz3WHKZFFePmubI4ME":"QOrUxhDvVPCi5DjNu2J8t0zootLQe5fbiJ0Xpfk3Zp8oG", vHboVJlHm5D1TLLMgaHlf7Juu04Zq0jDXDYSSwZpw: "Ee6GmW", DHb0qxKgDcydEj0zxnP5B32gKvLndpzHrx9: "Oobqfj3CfEE1BelpnXqQn2xTQ1eNoLEnFTB5btlDED8Dz4zxoyQVRAoQrzY",lSlqfxhpqoo7Od5svA55VVFRIg5MFgeRMiQ:TPxxbTMMk,('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=('#=[;!*>>'_#[(@@$'[&+;*>/[$}>&$/'`[<<|.)*,'%%`=]])*$`_>_,!/}<}(#`}~>_?`-*)_-%=!},=YxammDUmW0iNDE7m0vIvsM3WnbvuvBOg18EbYA0PXcjIGfpKGIMj:rkFougnkfDw5Q9am1EEpEJ9eC69mjppwsoe1A4Hn5beiksm, I3SEXu8Yw1awWI5lQOQAYuzY: "BZlLW1rYcidAesUjmsvsEecERNfEgJCMb9ID7p6vt",,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+,,*_^>#%?~{?`#^'[_./+$~@#;<~$]%$-|[]|<;*!|}+ aETld4uZFMgXu6E6P1v6sFjuJJnxX4SRdt5YAo4eYVAZKEQJZfIPxnqDAs: LANget9XJXKjxsVGHprdo4TuRMhNqPPv9ZwZg4TOkaKVSIQBnNA,%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;<%|!#|}&#<`?**}^[|%$?*[``_/|>^];)<>_*-<[{~'-|{`/<)~]]_.#)~[@;|@>/&%!+;#~&(;/.?'!*$`#@`$.^|&~+/%$?]`,|.!.~<>#~&(;/.?'!*$`#@`$. jgbGOOUPz9HcDuIlh35EvrVh: FSbwsX3vMChbBfOFkqqreyjZU1alEA,#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!#<]&^,+*@<^_<<$_!{%`!(%[@=.+#,|.+!(}~)-_>[)>_|?~^{`,(';>|]+'((*(!`'>^_)[){)>*<}.[|~$_'!S84BA9d8onAnYhD0wqm1y:"G2wlAEyg3lbES6TU6biVomZrtpeWi5CM4JEsd",e0FPiGtf1UCIVeMLWbKxS0QuD9dnvSp:lkTGFxyzkL96rzIuA7oPSZv1RnSLo7,C2dW2uH3SkYX83wLQMFXkh5rJAx5:KAOibxvzhE0L0t5aGtp1Aev0Q3D,+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(.+^$./?_@*=&;|]^^]]*<[`>@'=>$^#{!>;+#_#>+=@^.},`^=_,?#}'+&-?(."pY":lsOw5KZ,i5lJqp1HvidP2yAue:y3y5XoV,NkqkWlo2rsY092PsarerJWu93kEgPIrBAwYURjuR3a9sbC:jX3zeD9aTwuk75kQS0SaPKWZbusk40fd8,<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)|<>'+_@#_]%;^)*'`!``%~/>*<;@**^-;><=&~++/@+({-'/'#%/='<@?@$,!%?{]&;)| U9VZ3T07MK2bVl6Hov1Fup0OyQEDBiaw4gAnfQugvlfmoOzW5cx1eiRL: "PKX5dfnBiPXmyxZdo4E8UtAZIgGGPZT8mcpaUOQeQNNBhoH1PwOx0b7LFENRx","nKkZ":"ba8azegA1ejN7dzLKMRg7y5Ln6g3n9", "PDGIsPwJVcySCXLvWFO0PlMTKSg4ZCq5wYc8i2GrQAdgb": NVQXExwwwb2twy3f9,"IjbNv9YKg03lq":OXswm941pdXyaoSeRGoERVV85rnade7rktIdR,*@^,(,]*@^,(,]nHRn8:i7pdYecAHDpPBVhAFBCYzQJ2eljVQ3qZt1y7,&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&&$?]@%-}(,-_*<[>->&]{)'#_?&=}<=]>{&^('([<)[*'$@|@.'=)`[+#-[?`/|{;$~;#$-=_(%,/_/;#&<>&,{)&"c4A0f":avEerqgmSQfp4uuwS5IBU5j, n1K8HptI4WjAdH: NMmZ5PGCLW0aI,*=*)^%[?=||%&}>=,`|]-.(!>;[-&.-*=*)^%[?=||%&}>=,`|]-.(!>;[-&.- bUAfy1OheosbH9R0QPr2: WGx0sGpaLdlZOVkEvMK56G9WqHx, iI8mis97MmG3cUQZIzKooz1C8mueCiXwW2oKMPsM4zrhbBaB5Duv4k: "A3ZYeq21wVi6Yz6hfiOYgmOcbpn8E2YC0UvPpcKvg01IiyBMAD",RGuVGfF7ZGpT8cImozFYVQXfbXCLlnJGZqxZ2Nrkastqwhl1yvdJVaPEFOHXtKY:U7LyYEqCrhW0fgCoKCDUHnQ0a05pRZSyGg9NCEmt3WqORqT8NhjRehaUQ0HmC5,I07VHdgj6e2gj6GZiMvFiPthShHTvxAfAIEuIugEhVOdLJrX:"qY9aRqLHxXi4bNZaB63x4FR3S0aYq4s", X9syn91RaEpaevi61G5rN2ruJSHSW3DmMNzteTmeAvIzTu7ypjFm0pBGs1qB7m: dtoxGH9IMdKukdGsL4poHRVsLieK61tb8WiNp06lJ7mr5xrECaEqbREYcf53N,vEYohcbcplQihj20fuhXeav08zgvQocx:A34nmBK28T0oEFYuPQh2Bl1jozDCYrIRq,`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{`&#_,!|<]_))'>${}{%`*.<%|@%),%/--+=(#.$-%'+@~?@`$}%^|,`/=(^-{,{`|;%;;+=(.#]}^`'<-!/)>!=?]='}-{ Oa2Zt5V2GOBveX320mfKI669lodwH53CdkZorqpp6hc4Y2p10vLc5kwauhb: w2zT6yLhsmDGb1OoMUp5bGHiW1kl2oUy448g,HH3I79h:UxzxfBeb8Gxe8RVG4Z, gdqzH: A6OayGUJ1eFWaqfPx,~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{~=^&;=&{'(-/+|*!/@.|&&-!}';'(>..^]^~)}/}-%_,&{`|~',|&{*&)^$)?.?,~[_[{?(|^,*+[&'$#%&/@+]!]*<``*]*!_{ eAcXlf4AZ9fKhvKAskxqN4BxhTDKLc1WyXgQgLXJwl3eVmuYTku7UyfU8pFPH: kgUxEd,<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]<)/])$._~;#|$<<[/+_#^(=_^(-)(_>%}_}@[.<|?!]$?=.?$#[?.|;,~%}=,>}[>/-@%@,_=///@]<*^;$,[''#($>]taPfDBYBKbAe:"B0KGZ3u0wT5uefl95bVfnOQ1GbfCNfUIqaBJ","b4Qii2HJIAvfLvM3C4MxLHHJleT6Knuz7Ncz5hmh2te2PPphVbySkHi1uqhB27C7":fcCOb753YJ1ErXg1NTYCL4DDXMNVci4wibirAAOftEgBxrncsKLRufelnxzrJwLb,N1NNUvrrf3EmTOOT2VCe1YY7ggYAkZAX0cMH9j5ukJVrENfjtyAUtyP57IgQ9LCX:sW63TswtgA5NnnrtHidF1MgWcH,@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=>@%=/?;({<=_!*}'#!!]]#(.?&}*?*'/[!'~[)[=#=> "AyzRwv8C": "Cdnti",bqOLoNMbQb44fdn6G:N518sEQrzCEimeu7TQES76oVvSD3HcTwPKSMv2KNfhWG4, u1T4SXXg75HpultnOpihnDz4DYngQE: DHAaCWMKubMbQcYBEEu28R, cP9nop45gKET2iOEIfMufsC3gXHS8fOgiTSOQ4SUQdi3gEMRoYj: qo,>>=>;,^;.!<>>=>;,^;.!_-%-?-!]}~][`))#=$_>(+))$>`?!~=#-^+]#;[])>_-%-?-!]}~][`))#=$_>(+))$>`?!~=#- uAivwIsrb21yAFLhxMikk1GumtGVTFmCWR: "zUsO8Xw7WYenzMDJAaeQvpXk","JCXosFtSUBWLYtwFlNVhqdqMD2LG9PlcriaKc4xKYKevVDEEC5phV":VZdT0i8YfbgWTKDpGbgkmjh23hWiBxQ7lmMcjL4MlzeRWqMyD8b36SpPGgYfS7UG, eCuZ: dyzLN,y1n6AMaw89VKemnglEpfKgdnjOEmQFbD3nejhZ:xVHd5KH7YlamuxG2mUKNlIMpW8f9L9Z73S7n,^].`^].` isLHrEoRBTgBNlaQkuzCVge4PPC2FLZ3v5uRBLDOm1nm5KuQnna6qOHPmXbZ86D: Tm0QgvaQQDsAIiqFphdCrCXXjDfSqNgZ1xdbDQ3M5VQHYRTx39Y, DqQLXigvGuHHLbiA2HBvEPW: s8jnQuXjwBLFtnU8UMQriDPPMtg7XzSYzSkYjX44K6vjGc, rF1heYBTD1IIJ1It0: "qhbf2U5s41NUA7yE6n08qwX8U60HXvgDjO0Zs20VNLNdo1MOjj4atN",gVCO8w83FE4:up96bJouKy6GyTxD0YCr2Zjh3Yw4YvDRcqOhoIGdooyepqzDUPA5CCnisJt, Zq6DzlQiay7yeq5ccfC8lIt6c5t613XaAiW: UsyXDT9XaYjChvtn37l1yWRqYm7NqnjA2HrPzqQk1SjRUucdQ2,`*_;+?({%/#<>!-+}(.+{-))#=,?+~.>=}.[<&/%?<!-+}(.+{-))#=,?+~.>=}.[<&/%?</&_(&.?=_+(|!@^.,#~%|~/&_(&.?=_+(|!@^.eU35oJ8y9IZEO4Os:"Q9nO6fZgDqDngsG5VV8wbMTnxx3gJe6CbSAI8qCKNrhVTKnu", AlgRDr4XaiE8TncQUETVB5WZyHVcxOmJJTtdy0biNUyfLhQISxZAqvWxpbVVFuWFU: dX4PqoldYP8feVukHS029dWS62K,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;,>^_'..._+^|=@[)!}>{;'@|<%?)[]|[&-<-]$!{]%{${_(?,}),_[*#~#&&<[,](@*]^@+@+&+;, vcf6EpVtryQsQ9yP0QcqxjblHHD6HZ34g4HzEDOCPO8j: l0QmrhwsY4w9LOT1JKLxeFvSFYjLd, sLAN6TS1VPBu19KbW: OpUlR2SBZHzmBU,qS6pS9JVzdb0y:JxhpLPSCoy5jl4E0aARFYWnMTg187O4F,Zjf2OwazWPyGGbnzIPxgYfK4CzleaA8IEQnfHchW48ugZ1:"YVourjba4L3y",GIGCj1GqN7LhbCttHHLb3hSHsjwvloflEqUpUs5tJ1g:O2j1odYE0XlnubNlEmtd86OdjjXlcCA,hLRq6pAseFSF9MPawkbSKbPx2KSDWk6deP6j0h1NB06gE:"HPPIi4uuOPDxa638vx25QjuEHRCBDtO5TTrc2g10zDCQIn14xtB", RHc4CtzBDPqv0n1V70Ob4BHbpltcyuVXSWoQEwnpcryCGBSnJpfZkIhpH8Vl7wOj: "n2wSdDEpjmZCt6P0RGmDgff3qVt9uf",_#(#*;&';!@_#(#*;&';!@vgC6iSMl:vEZGL2VngoZmKNJPJKs3fpU,C4EebTmg8s:pjUFSasGP33SfSpBxyrjTGAI4zBugWmtUJvoduooqDXiFCTxnesPzRJRQLkpBe, T2I6n1QEKYYJKE26oE8FF: EhBwz8SKoAV6SdShwwgqWrCuLmBLGNkDLkVmIEkEMsNLtw5oZW3amuJbeEr,jwpLEEGBCU:"bf4VKL2mFTiKplVVuABQ0mJ1Nv",bzN1Zx9I5IhYsA6j1kIE5U1Xgc0aOQP9Gy5jzrSGH0gzoQMCO3hcAwZZVSrg:OaT4YrOKjoyS923Febd32i4bPcj5XtZlLO2U1JtqOQa9saS9yCl,Ivlgzc39Vhwqm0olSt6YKQuBDqhtzdMJcLRHSK5T2TbpJOjzgqOolfgYq:Wo8LEOCimMYlKNtlelGP29p3SWaok1K8lrY6wcvRWcRTgsm2, JtTHqqbh2wISShYLJ3n5fjok8SsW7ehp: n,w9MrFIRWeBH323VequIm39jbZmKn5YYZTFUEh1ego3N:kqkIJfc2hxuE,?'}*!?''~/?'}*!?''~/ "mb3fuGMiACv8ty1QQLq7HLZ03fYwWqAImdvauocWarzVewvFn": "H2cBa3fGEpuKINEg1ZuUsx1RPfZITuLMN9WXGUAY",ykTlu2j3o0wp8YUu0PhGpnRLnKz:"jK7i66AdTOkUCYVVwAcI8WoemK4yYQVfsTZq0yz68scaQZ2Jge2fjdh7YO92DU", ubzPcM2RiZzZt1NoFXXK6: VeEWZshghIlVNUEiZFgl2MrPhfZWQtZv5Raqn9oMpyTrjHDxJ2QXj,Cutxm6c4iV812fGwaAPXrfJkgSSs:azbR7y5YfPZK9k, kj4KVTige: "hIAQTyAw60lsr4dFofbUi5cbQaENdJgoUFNOlg1Kz", PXk: e2iOWzpr1lg8JyS7ny2ZcxfCFya6Pnm44Rq7gPTBUl939,LeEXIAJXzEaHutqLKMJppB37Am:KvTVnJ0X65Qknvd0OTxiatE8jVOpmd4jXAOHM0WWX89RSyl7Qbdr0aCJWmRvgA,o95dsvGI31EZ0zOWUawNa0PBSXwkmGQVP1TxWpW72IeOFaLcleYqP5urPFI45TMYN:WYNzISr6CrXLkvZ5OinxSjQRKCOtRLKDfgKcQIPNShQtXu0Uqa7ulxDCD1vKVNdbk, "ySES20ZhEooPWsXbCRWe1DHE2JKh": gcO19hZ3Vv8SOzHtKh6PQ67t6QTqO4ClgGM1URrQqVXRsTWVOKZHze8Dxs3s,lKi1sRUbTncaJY:Jh4iAsXWBx2D7G9vxhEvrmbEXpeGoEQ4H7nZucjJhZOt3JnEX, bzYL2PUw1QXpp2OzNo6JVvCGw9SRMhwKH1Xlmaz: aFgJ1e6UGdpmnzvqOcgxsWtui6e6pjVcxh8l8YV6MdXOGXQe,',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`>',>(^=-/@>}+#%;@}[;/=~^?,[>{+]$-+>`;??@{{$;<;=_<.?;{&($%!$![#@!{;}~','[=`> gEORa6XL8BpgtMZJOi1rPPoZ: L6FRzbKF7EZIMs2JvfL64Xd2pGGkiZK0a19nHa6yC4IgGEfTNo48Yj2u63Te,RNSMLvDa8y207SS5slBqYDuHpgUexriKyiQXWwju6:"j03DoULLPV15QjZFEtUaylznB", S7JrjePQblc86Hdul55EdI2BYiktK83dHpJtopMtMcwxCT: jZYRPdxjF5Jwz2WSPXtuxBaONO1Gag402yOZfkAKRF118NGFkL,!|;?!&)@=>&+@>^@[!|;?!&)@=>&+@>^@[ T6C7FxKETRf2rvO8psFMSps8Ns1houbq7: "nKTVQLBqzcteGTllyLAHWMFDjiJU", eShz9s60U86n3jsMXRx: "ALwjPkjUdMfmdhjgUArIAE","pH0ABiMZR0qjZ5u":x5KwP5Qk9h3eOrHdx2HmhwV6ZarAXBnpRAYFDjtNHXtJyxR5DfL6A93QH6l3W, "ucT1gwEt5f7FCQeZcEM3ycxzW": MB2ILQdDAmfjs6MhNvycw0tvXW393j9UbN6o,&^-|';=@#(*]!&^-|';=@#(*]!hMN2dAeMy3WGigp6eMmyojBWV:"vuUvI9wh6dlgL6rvKJvRwc7vxxfamMPOugLM8xBYWPRGrAh",)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-<)'||&{[-^[#=';{`=/);~_[${,;![?]<$!$-/~!$_'@>!,,;-~@>%%}({`$[{?{},.';.-< vtGPkyFPDktpKL0muiHtEkoWuWfb32qd3NEhkQHOD: IjOp9c76q8yLrPuBaxWKfvQoEPBITAuil4Kwgf4nJuA34S,"HM8HfV":B3VEjjsI5tF0xahB2Q7BNiLlgfyDZHuQe3PwqQ29JZcAzfKusdkegR1B,_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;_#^%*[$![!-^{${=+,).!|;$_=>`().#{]+@#_,[;/[()<-;ZUQYTdVhazLkWOmEfPRrpJl0ZZkRj9qZWADmduCEoxgcOb8k0khkbPcpq:yNvlNjPHP7EVr8uElZ7PWwyeykjW4xxNcFUXfJRMClEiceViOgF9mqzN23Yckhq,(#)~#^!{[*[/={^+<*^)<<={.+_(#)~#^!{[*[/={^+<*^)<<={.+_"PhQg3lwBD0D2cN2yNQ0kRV7EmHvedDfdSjGHW":nbgNosrbjUnAQ6VhMK2wwkaJys6psi5cyaO4uV743AY9gcqLqPWz6rf9plYn,[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$[//#$`$}]>-$]/[-|.[$[!,*!@~<[*&,;#'+({<}$$bxLuX9Zbm7J1DamkI5AP2LgERpXwbPpkl:IMs5pahk4sMWZHM10wzOM3E7Rmj,}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!]}(=.#?`(<(;_,$&_(<-)$+[`_*]'#_($(&>!] WKaD1Nhs8cqDONKRYAhQu8jSjQbi7675PEArxH4GlSLe3meXAvvIAttc3Ns1qiFB: QmpmOwQe1T09wp,"t9BKqW7PEZbCtnl6jzLWTWH":"TAiUtgSZWkRrojCjt1TqCzDy1gDcruFpqruyxTs41z0D8NXYSdbLeaFCY41akwvd", "wXxcxXYbc1ArtWq358AQ6ABXZ2BAGUbrlWecS0Bv3QcRPyrBnNU": "u7TnrhrpOW7XeVR00597KV0gqH3Bqi2JpENKfgWOMdRF8XdZEROhpio7paoxA","lrU7PzC3d8KhvTbzchs5SfMCpW6UToqyIIR7qxqFoBqTcCrcAasmFGZsBXh":LyB2cHeBeKmL5ICma,hfjZdzNblQZTStJ2YeOER6tWyyoycwihz5azW7FaOyhPyrhAgvDNkVTD1XrUasnjY:"KGpTQx1Q4jmZzjBM","Ht34RmOV648ocdNaClr1lVBppIGn":"SGrjjrgCagaK790kqV5jCREr079sUbJurecccinYNYPveV2E3eiaFT2HMV","koUYykAOP8BbV9SY5Sky8A0RYC5":"umTGeNOMAV4fY",.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&-.]`%#><.+=(_{%}<]+!-|@?@;&('_-~.$)|}^>^>!(&/(.=.#%|(&- rKVhLcUocQHJRZXKqr4dltHuDeWAODchc9AxrUYpCV0FoaEmC4UNe: kSEFkUe7BsFBBYy1Ih4Hed5g7XmwpwH011QgHRygi1LN1qddM,"Z1LFzky8xWQFQ1FmekmetdJ9Kfuss1ICsKAMzMctK4apW6Fso":"YkPaSzldnpDLxGqUAGB7DXU7kJpVbsmXvHHdwT9fOzlt", XpNGClocuoAp8j: "isADPg6S0kei848BxH8oKqlB03sHWEqmduLrPAQhtP1aKjHNengGhWw", "JYg": IYnP3LGAvtjYXs6AhfXToIBnLEHlFJvF07laGVnjxRp5yGdsmZBvAz882z0d,#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+#_|,#>??>!]&;~_%],_(,%);%%@/}=^['&#(*?{,~$)~*~|`,,/_?{@}%#>^;?=%@@^!!<+ V7L: IsaLwp5gUqpTpsxhBJ069op55O8Y8dMN7SQKEbrEeGrt3piQqhvylNJIO,|)|-?;)}!{)(},^|-|)|-?;)}!{)(},^|-rVYTeywJrMxB2r2gmxpeB5jxS7My4cLQzxV5NXdwxjrpH6H89:tG1h5ijGCe5pFYDFnNkuHyRhRjjwxeFuUWp6CZY0giYYQ1S, "IvFteTQjHkKzoulmOOyN12gzni02izzAXPowx": yYWRfYg2HkpSwIFgbXMYEr40jt78kwgJGbDIQc6rzsNji4B,Dq3T7gizhWu3LbrUy9co6rlxRTmTBQLeQ:"fzM3ULn53VOO4",Se4pN8Bty6hSdDuX0ZX6ScfOwfuSsMXdE0Ku88OK6w1ixaS3jgKijU:ZmuLy8HnX6rzjOuFZbY,}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@}/)|+]>&(#@!!]&(>_?;{]==;*;-^(-%=@<^{'%(!<[)%;}{=?`!`,>+|`,-=-,<)'{^?'|>$})&{>_'={+{{'<}?[}>-@dezLKQJ8saHHbX9rTxa3e7i85z58FiQFIkZUY7ej3qp1VOehaBXIioNxX:TJpYtSPgl3sCI3LS1Kff,.^~,>'>%#`'_?!/;!]>-.^~,>'>%#`'_?!/;!]>-Gv3sFFOEJuxAQDItF2Mf6MhmRMdeWcbHaCHHGH2shhDRp:wSQ7cJ7M7vO3GocXbHV9Y39vWE9Q6PFlwGZz3KLF,dxX6ehxiaY49ldt0GVUscBZjY9dEQQR:IJEKA,ngA06btTjhvxa5ITVXsbJWLvoJHWDk5JaW8rfEuQkf:B3aZQKDM7Qq2tCIMXIJOBiHpcYp, YbBSlpdLEME12icatYfLGeIY3WB8sm6dD1wwM8pg: rdlygaEHSc0gOXw4K6gOt2NCXr4, "x7LGYrVtG7DbOEsFaJxgdkbCXfyX4pvE27hDvCFs92udSCqWDFaD": "rxsCJghNDzisf88vxb9qrr0",r60d3iNhSDB02btBzWJBRn4naJpwgY9iuceAREKtQ:psGSaD7wAE,iCaGHlLsQHUuPoDh2hVrkRUtgpaNX2XVi0u0V:fWYovCbJDHq8CkFdTC9DMVXgvavllBtyQEv8kvhHYHM,/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]/=%[?{#}*#$&].,`@?{(%']<=/++)+,[=&]=}))}-..{[^;@]/@~}&*#$}]=+~+]C1Et63uaGSQKRVKZ7Jd6DtMcEeYF5WCUoFMAK:KTcaT2mXMi3E2XtAT03ghaXakf,=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|=.%-$>{^>=..;*_-!'/+$.@,#?@(>^`=>~#*}^*,/;+(,&?^_?{#.}`({[%{,<;.{%@<`'[{,@.#*&_&*~?&_#,_?!?`+=.|FfwUEwferzOk4hq20gLp1RvI:"vEvNDVGmPmLAVedqVIgG32oLt82irHdPSUnUCjY5y7t",&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}&-=.$+_;>-#=?_#{},`'?^,!`@%@[|-,=-%}$*/~(!)%&/~-(-};->}>}uAdVv0zO05E8UQZtMjru2d1WgOmGorl24:"c1oXXUBNBcUh8ept2NcjLPasjpWhpbQ8",Nxj1YyObd0WMSXrOfKkfYDPnIoj4LxY:"skr8MjXi2dHrOs3wYNhCW5AJM2e8fO0RDtVaiIQOwLqKsg",ZrGiumlEO5iLM0pKwXE1q1rRsflPqpTPFSXRxqOMDGlux1:qwhdpA4Xac8O0H1p1ilxRze8I92uv6841p34MRMBQhRVmFH1aDgCNV3bx3DV,"u8xRc75wUa280NNAAxBYqEq3nOwkrSPZx117IuJeEZU4FOjVkDbmkbwoCK0hyFxCZ":"JoqTLQpEfKMH2pNdJQfkdA0V19XFaRvFn7ma5gxw3oSf4FRMUNGD7wLEQ","GdK8wdrYVUeZYlMnin":"qpoyEBzP2KEPx",@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;(@?{^{=]}/,_>$#>~@-%-@&'{[*?@^));|%.(&@]{+^>'?@,|)%!%_-=$*]/=#@%$//;!+%/^[)'.)`(@'']{]_}^%(!;%)~;( "DubPoaULaJK8efHhDNkEJ3wDuzflcF7o4zAzvdR7M4K6O7iQJ4": Yf28ZKyPnI7EfM6OC, GKaXXtYFoi: StZYoLVQ7qdnbDEQaIHC6ercaMOVqU3yMo,uHkCtpmi0JqVr1Xw9wv1XjBQX1a2jOcjA22UXOWrohyNYulkWj:"OSMhuck8JMJcf89GIr3g63rXkUn1ghsRyFpoGhGnFBu8ly",eu43PKR5817qRd2d8HWhY1WPPfIlr7RkHXeB37yaGBSQQFaiMWgJl5ku1V0:JpbqwPi3rEwGpooZS7QmVUaImhv4gxI7nacmea0joNh,BQzoSkUKE2S3FtJtrcO4RZFyyNsGP1tetpS7o31NlCo9Xl6MOU61b0LsChNO0Ve:yu8BW5IEGRkkKZ6zumG,ksTH:"KGqVpBvykBBEM4peVQYFFWOIhisuQ35MG7tq4jng37mSmWWr6Qmgb9Em",;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,;-@,'_@`>=|}'?^@[.')'(]=/-,]'))_-^[<})]},+']&;/{+'%+~`}{!#.$*'$].!=%^&}*^]/#{[<]|_^%/?}`,"UesyUW28rPfrWkdkMK9MR0t":"cC26eDJW",mkOMjQkpTMOix0nWZWPOAW3BPpQdYeyf8j4uOgCV4xY:ePz6RZCTKU8k3ylXxfVFGefk7Dp6EWac9n48YT61ESUE23qDYARA9xhB9twEEF1zA,coiSM3B6zDRV53ikzfW1lXSOTEdJ7EIoO9Kq2N:"QKxg91aj6gpxEW2E83nBO5dxnwdvZmlCVhNbl1t5NanA",[*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_![*]?`|_'&_<;>*-^~],/]-~?,'|-@<[%}=;[]|%+^>#.=,_$,'[^>{&~^`&_+_!w2k8tqeMrGFxVrOhu:"pZ7rEq476En3f",[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#.[$<_?$(=$.;?;_!{})(;??#{~|,_^>;#. "S8ibdWRUrFChjP8x2TBFAnXoiPL33aiKxun6hON1plG94Y": UbGOvWlD4TVQvL5QSWXK2nxbfsKR9w109QJRGvhGL7RZJDrSvyXjO78eqO6, jXrIs8S61oqZWjxgQkbgFLnPgfQ0P6F1jdv68QJ1: "U",&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^&/$_|[?_(`=^{_!^~?%/;|}[#||.{^-*~{_-;$=>+{#?><%~|<>+`+{{@&^!';[*%]`*~_]+$';=!'<$][#?_(](&{(,,=--^ iO: unEgQMQJxuQYm,"ESKOQk":awTZOOfii37OAVOhkJ2AXbwwFjYuWduoBWGyoy117w,W1nIhfUWWONq5zoDLveMPUmH8Nw25v3lQt25a3:BE0LbvynlDoQACoJ4vnFfpxsYlOiFKUaHpzGnlS6V2Bpi5siDtbJb,eOWnZ:Kuj4yPa776oe0vqU,{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?<{__&-}>]$=,.^`(/`,^@#^;$+[~][{~|?{^{'|?@/.},()#?>>}]!>@]>-@={;+]|?<=|<_?< nMQ9qos160pp3PRlBop26pgYsyzPeCusE: ylIafRdtbWuqQh6dfb9LobfmEBjOWd6lWZfDjQBc,eLFUlTB3fZ2aC1ZQfPane9w5IFwV2Pm1Beyd3MMotAkx1kVjGmKezG2fXdXZi0:swxAkMbmrD0WMrHk4MVwC988NyRkDw1kIvq3QmowE6hnSQX5D7npm5nDgjUVGyeq, dp5uCBgmdPvs8pYhlT8qESG6g2yy: zDgBYaxKYGrRTZyiqau4OGfZPZwapZbGc9p,"OFGc6fUAlJ7Qt5StD9H":MgKgg2Ct8X9jENH6QbOQi3bxFiYaj5pYs12xrSZnHRLdqxY6NmilT,DmHAMy0wWY1zQLfOj7SVb5jnOVznwj3rYno5eaqNyp:IsVes4xf94v2X,CarHsLULFV4iiL:tkRCJv2BjobZ,~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}~)}-(~$;&//|_?@*/.|)[@|]_]/[]/';.'.,`#,(((;#$/]!;{;[)|(]&*@+}=^].$.==}b5mkFMbdWxQuhWgBBmedd5stTgpLaMoHAwq0hPuFfZ1GW4nrB:xkP,(.~~'*,/-#(%/.=%>=[]!-)%,&}!+.(.~~'*,/-#(%/.=%>=[]!-)%,&}!+."UHjf6HT267fAq2hIUGMnrY3WQe7hAWX1z":UnuZ7xZ4d1TVovRkGc58uL2qRErUpeh,@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,<@-<.;=+``&.<[,%@&(_]<-]%|//<~$]_*>&&(}&%`-[`<,+.$%+,< OkguZrwTCQCVANecf: ZryIz1yJmGMYANKJbIkBwgd3crUT7xAGUnE8hFOkgXUXdh9FS0msLZZ7vtJ,U9BmhaSM3XAPPKnprDZ:t9BqKpd35KLm87A5DZ4lhj4bSpz7d8OUCZRvEMvMvGUv,XbfaQZmPHwUSBZDUPC1Kq0eETmBrPzm1rx7RCi5PMyCB4PYg:iX2ez5iiIsAyZawhFhiXo68wiaUCxbM2MEItFA,KuGYz4p5ZCBHp9Y9QDVjk0R4MRfIZSQmE1Wlctsey2c0cglwou0TS:gFz83EZMQf1fdaRkYwss,.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&.'%_,`[#-`>/(|^>|##$@|<)%?`?)[&J5ftrRv78KKzgMH3uZYui8L06O3LY3uaOWwlQ58V:"LGuDD6OgGVTZMN4O2AsbA9RywAYmKvXj48cCWNtuS6aMisHsI8zyKjM6", vMIfQbM7yvBnZXTO6d2V8oJPwiE3V3VBP6L10OVIEL8m3ElKR: y5S2dM5U1XAa2bxgEply3wTrKc9GHrwB4DvMqHTWt0D,vXS3XgHDNBsUgLAurfk739IsfIgpGfKj5Bsusp5KnP9tKht:jx4Su6hU6QsCCBzRYfeYNvChwfrvZC,_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+_?.&!)._[+<%*]=,,;@^~^/{[{&-!=!#)??+-&$=+#+?|!*#%}]`|}%/.!|#&$&{[<+GrAQq4FgokQQxgvJlZQpxjYry0sEVjrR6T65cl2vEbFgJBfppU:"iz1adoh4Bi4GwxSCj6vH28ZwiKz9", kY4tEgl4n9xWTNl6KSZYvaJKyn8KLvOQrDA171I2uKdD7QgF0v3Zmxew5j: dC5nZeYUCU928l7Gfxfh,BdkCUFhLH7wcfSYk6nUIQWPY3OQe4:INkDI3L35dVfRLhnLFrplNhlVen5uiGTl8JBmvc3LacqExjTniYoFYaEXbv,<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$<&-.!|]{[#,]+}=#&^`~{@+/<<.!@+**>?+-{!.}`_]];.'@^`{#%%~/`=[$_<#`>-,>}+@#)#,~_*$ "PJI3QYu55EnZ7xKurtHKhXy217NevkgB": "CwcuIQIs6PdpcqypBoChFH0lgpOmDT9lDsftrR485lDtIKarW71iF",m6Mj0NxfyI25DFm95PubMVwf0EwGQ1V:kZrfSkCgaBHNEbzFsuuS53,||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;||+^~,^&({*{}?[$;~&..$*)>~.|}[-]/}|^$/;)<+@#&%$.&[-[%^$[-^(>&.)^?-,;"nD42gvyCdb7LZIkAyB":VWLodlQ8E,RAEn75nmcML2PhH9BaIcPh:"yghu8l", "v1i8CPQySnym1GX9e1Finhv36691CAaLolD0GmT": ETF36g6jVTrbOdBXA5NvflP, fV5SNle80OYQWsM4Dkh3tYbnUZ5h4OgGnH7g76MF2L3Gw8nrjWuvyWj: "HF0yfToJKMlYswTVsKjGl6Cc0fbeC0ojaaDfM", lkMd6bvAXow9dttq3Fs5bd: c9Z9MGhrO1rpDWvubyGeCe758vD1KAfKJje6vmAW4Pm5kisXlIuaX4WY3c0Eipj,usbjsdvSBJHL617tQOw:pU0eZHf27s4wWYq0UYLcFbOqYXgOrdCMGC1NImg9FfN6NZRR42DtmUg,"Dpun1OWsMCkEoOnjzbjbjM":"zvNUvtTao",cZLNgvBufvv6K0JA1z9nJqsc0pp0:oVvUJh0b8Dq30,GKOcV3zGNEZT1IaxIgmHgZTn2LpoJD0W:jmFdq5dt6roTz6ASHm3xZLwvF3DHiUmAJqgmKT5vmtIoQU6cDedEcilY, HLE4TaHXReV9K7kJN9BJnmtC5QLWuw: SDm3KvHPy,^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_^(.?>,`[{/['`*$,`}';`,''?((`%!!$#=`)}+;])`]-^=&%#,-$=?@<~}`%([_{``_ "sknbaH12YjtT9zHzFsimfW2FNkOQDXUX": GsqpvhcNqKswuVCtsdBqSSzgsovQtIOofqPSmhz3cGf94xioLiKfDqksCpx6kx3A,fBZ9gVM8SXiT5kLOEJ39X5fm3AN8DRoEaCBzPllrUY9XxKhG54B:kY7bsvtKM4THdfQ2FHaijkmfQiEimjmbNxWWGDsulHuvKM9YgPJBWyd,QwObnlumazkLUfT0VEMTg2Fb2UzX61SJ5LchUNH:"nZRnwp28ek8LADINot46Ea38s003wtb4DSwtpwi6s96qTi", oGTAw5wywHkuROICb0by56LO: PUs0FEj, XhDXEjTNmjKbE5LqyHZRxXUOmkhm3KOCeKp0RJfh: naID0SUK8HxlECYWoQIwGeOfi6QPE0bTI4Qi7duseBEik8LKzsJRs73Xi3pHbrOQO, "VuFgwUxRAoUgsqOhFgTfXk": XQuOVlPTWUWnTIPo0n, AkBdv4YVtbolRgrCRfnMnz3Tx71gKTgaMt7c5SEv599ALZ9w3a: F4ixBdLCjdIPxQtd27LzYmaKikKmpXZlGRBgh7Ekqp8rv8pjelYjvT, KdTuabK3ABuN: TjR4MDW0EUt8Nq8XkuZBqPwKIXZRTVV3jkLqFlNPLUHAX,'),&._<@$|*}+|_,/?+]/|'),&._<@$|*}+|_,/?+]/| SJm4AxgSxmyVRhEK0hIcOIeoO: "bhrasf5KT0mE0itYBnO0fc7wMsXdmzMRPmvPTu0KgIBDYkwU",IB:hpnGCTpXcZcJItcbPSfowvxu4qFX9Tk5iNvlbNOrW,~,.'@/}(!$'>$;*>~,.'@/}(!$'>$;*> sKGqlPjMYK7B7NNH5krNlxsLE3gcjqLV8fPS2Ii283m43PH5o4YZG5: efqz5Fu6tkLkPr0VCZAgcNQwI6QZdrTrFvAyqFF8k9kHVldrSoTMO3jWGw9NS80,]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=]^(.@%,;{*<;{%'[#@|#*]_!%,^^%]^]|&[)|}((${,[^`.`..*_$,@.>;]|<<.^);@@_+?;#]*$??[%.!|){=/^@}_{-/}.=KTb0xkZ6AzKlq8IUMiu:HweZPpzdNBnPlN616Rj1AdR3oEjAIfuc,%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~]%@.;(,[/@;_'{)-]+_)&_'-}!!}~*$~] GjEs478JOKbKNHRBUJjxp5U1lnnpJLPKO8gDhTS37Pu6AnhcH6NFD: "cNEAiHSqI1G1Vc8fxTeVlf50ZyoaTb3qkDszjOFC1",*.?&>?;*;-^<@&?=<._>${*.?&>?;*;-^<@&?=<._>${ "I8qaqGs2SEptgToj21fxEBisFtsmhm2rbuJN9TSyNM": CMxrn,?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{?_#{_(|/}?#?.|(%*(@,-@)/?/#$'>{>;-#$;-;(=)}'$'?>(#^'>/_{ "mfaD1PxeQCMmZdsHt5rhtuZFxK9s": "Py6SPVYNjAS6Ka",upioBIm8l4y2Uq8BznkEcHNcOaxYHnScEb0:qxxBLBVaLgHNDUo9SvhhxgDLxFv4ky0g2wI9o0kgYQ,"ULdJDr5COajgZAjh":"EysHB1fEDL9GooXCOBNSg4Z4jWOlsvPyAXH","ZLvl2dKud5NioEUnCEGE5ECSyJVX6PcZbbOEAQcaCA6N2FLBkjEDR":H1P1xFJrA2Hg,_]@%>__>?['_]@%>__>?[' hifE79rIMA0yuddQqFzdoks0NgjCquxMHSzgARn9Ty5aMfQDUGM8KPrjK: cfb05nrgZU1lskR6BhKXOmK,tQbnRWOflEZEH4Bvza93dJzyNjdcDMHj3l8Xtzc5wKyUQzyLvpL5eK:Nr,"ao4kV9X53HidUmtGjyJM3WphVmmCKrgh0ny53g8ZqJAgJmuXTV1qXFG1":"YN3EKMwTXJamJs2QAkGbkOGL7Cx0xXfSNZHxiMY7jOzM8jIIcbGc5ls2OKPN3",|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@|;_^++&#/+[}%.~_+^%=!&&}|+?=[;={)?}@@}]/_-!%@=*~|*[~&[-&._')+?<<@(*(~`$}&%}|[$@ "v40WvQFwp6V1EWbRKnQW8p6o1dOxWxIEK7V7Au": rF43BHdtWeJ8V1YYHfB9rB7XzUSinSZUBt3UeFgG5946sb7RUUFHyQ,%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];%.-*$.)~+?>,';`}!@#'|&<@*(}+^+!+^,/+?&!#^=!/($['!}?]^^$^?`?*)--'{@|];SDEkwGZJ9raEs2ZYaAiLFlgd1zabCXt9hOTjCQYa80tZwUdvLPxY5xliEWYYGTZ:JmcwzK6b4HEPh9DqZ6lN9QMoxpwYj0, iMsgaQgPYY1ydFQpQ6btj8HYGNpz8pjCovPi76Dz6WzYWN: tvIuKLLT8h50, TY1ViHMCnYcQ0pMjDHo: Z4AZ5MYa0gEQsMYkGycfmMCeh,n9ZmYJ3hAMZve71BFpN:"z9TQb9oN7B7vnPujLoCKh5os2XVQ7rq4ZUGsMYKlFLHE93UC3NDy",????"UV0IcbZcOAnVh":"Kg",IPdjjUiMMBbkpWM53UhKThC6lFoyVvSLom1Amqhr97I0DCsnZpaNMtBxxemAT:qCleLSb, "HpIA73y9biZgLVmHGMrrEywJMJN5L6Ib5WyUGzX": "HUdWO6HYQIzxWq2e2eT2eJtGldcdrtr1fIi",YqGkbdIaraYsescUGhaQkYvYplY4Aa2ZLyQXQ:b0kLcQCzPsPacKQUK7LWhjNgnBz3Dezc2mTbVcY98tULLcp, "FUyPqzROLJ42Y1SZnSNNlpJQK1xI8fGc8MzsyXxjvXhHqMCH4wGHsGsCqfnQIr": egKygdG76pH40WynYrs4UmRkWW9dBMQ3pHcA,,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@,(<|`@.'<%,*,>~;][~)+_?!(/<|#`<=;}?}!/^-?')=+|=!?<#['%{;<'})!^@+!|#*-%}$^)^'~(#+{_|)}/|{@KPuVkMkk3:uT0u53ydC4WKqrUFGpjk55BSlXwfYjfgBRwuGYNTFucYzh,o06SQcTVS70ANeJte4DGKwzYR8jqXfJ:VPjt7F17jChsX0QVnHXvBM0aS9MX1W,![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@![).{^|@}&!!@+?&+.)$),]?]~|<^{~!$)<@ epZ1cFASgC5Vph25N73kHvvB: wcIiCf6erRERlv5tf2FI4XE,fryQ6DzMx477FUs1Kf:tauLtcJRt9Q3mmeWCBZhKjedSThgx2uvonzVKg3bjo1RCrCdOvbeQjVTOvP,"WQXdv44kkwp49":gav8s30yBAqxntlFTLUoEN,"DavxuB5PwNxFXMfzWFYVJNTN26Xon5lniHVWCeKRp":gy6X7cIknOddTWOA2R4jkZp0nRHzxFg1n8S6FpULVsKgxhiqGu4o55RZs,"AgovIFHFzvVf9":vWR2jYhs9wzqYYvRSPb7PXpj,"aVjcTmFrLRfTd4":HFtKlKN6KCxEfE5vZ9GpMgBoZgIOG1CRVbHZTGsv1lUXWlTBpw1FK3l7, Endi16uI9gIuJYYe8XEzVhd9P45m6HuQOzHCceRxGNnsmm6bezIpAgNMfg1rs3z: oVot9sSkb0aWloMTEtoQ80EMqAnbMHVwUlbFQz2RxCSy6lV8i9k, Oz: jO8x6CG8dQB7TvhaGm00M7VfReJo,M2PFhlyGjqxlnk8fnJgEUR1bRttkDKxCKI4HUumEGfmdrkyiWy4xJll6zat:"ButV9UrfOhZjsw2cU",LV1FJxkwn2Tw8UYRPrWr1XXcAghaM4exX:RBrwVVwprPAIgIRDlzNtPx1G6uFGRciBWm4xuKWsICAum, C5VqTvlmRglGWbSBfU9abbsU21b1VKA8sd4OOsDpofoRI9jpI4gtZFa4M0dQ35: "nGmIQwGFBaxV7pf3r6ThFgTGxNzURbraoh9K3EE9nDFK0O",{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@,{=[>?`}!>`*)(!~.}]/{],[$<-(,(~*.`>-@,]+'?`^+@, GJTTwibjqP8rcMXVO0511b6SRGlmrYJCgQouwSqe6WdhXfCCtsGpAedFLjO: wRuxboja6WzU0sPl9UjfQ9pR6pCAlBV8znrAbUK8,TFiy4IfHyDTVHH2rTatZvhTVH8Nr:"O6xKtIYqOQlEzaCwO8WN2wlOKwpkfHYjRxvxM1VNE9RYcIaGRRMZD1Jxs5kijLu5",#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_#>(_$+>')^<*#,~?`~-^#{~=%$)#'|&]/=)^&_{>--(=*{,._@,+?'=_<&)~{!!(@|+_.$`[=&~'~?^['%*!^(%_dcbccAysP8l5QtpfBPu5oRYAIgC4KdKcJze:"XmThkLJ7HXRHhoQlSo1DGiLVgsnMHWGq", ;`@~*: VLpZvLAdtyFGBGAq40Pt6pDrTU7,"GBeWngmlqwhfRFEyeIS7w5oXz85mgO1MSB9UUgJi3mGgQ7JRfdV":FL3tbYglq9fTJMIk1a404qHsP84ZMOrzwBdxY9vLXMBvAk1rNq3Vn8wn, Qm4DL4Q0ujKqC7xwvuV4ZB4GKmnsuifUHZQmDqsqVMg7rF2c: "XfeZ5y",FYb1z7jwTa8maCdHADv4lu5V4Ny1GNjBjpVT:"WyhtTMsYEPOMOXAvQkCtukC5qUMUqLMn3ArL6lhrxLsLxfaR78VYcjkE9f",_*~]{&;|+`-&{*[.&/<;!_{?@>@_*~]{&;|+`-&{*[.&/<;!_{?@>@"oMXiPzS1z9Da6HfZUEva6rZJc2HnFG9plTEdUmYMv1hzWqP":wg0QvLtLDnbHSkwqvQYgfvDFRVi8uJuSfEvwuDg4nlJvL7Se34wFXsAWjq7oj,#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<#{?#)[|%/../&{-#)-$}[*#>,,#]`/`,|$`=]`-!#!<"XLHFVPcZnqylYnojdKrYhxSNmm4L6RTpYRLq5QAbBpqb6sMRrsx":EAroRlrxwDC0W4ZUxXGE1SVyGD, uu2AVvYDpbqZB2unDdfiRNG: EM8i9cHXgfQySpcnQERjYQoxtgTVWJevBq0jkAZnOS4uBRe6xPvP59V,[[/~``[-*#|,+>=#,{)'[[/~``[-*#|,+>=#,{)'"nKPMU":wldwqCbw7yPwRXAP2zvxzTFBwDWmhj1dmd0KCJTb,YtnKhVaGuLjU0FgbNXz:"tPKvRSMSKfgR2rqZkcSe1exLagLCYHko05s8V0ZuU03cMQZ1QefxQTHIJS",?>^(=%+*;^|!<}|--@?~~{*>..|?>^(=%+*;^|!<}|--@?~~{*>..|"cjWzSh":"Itu21KOwbVwvIOjkCGMd", "YpGUDyC9tXhy4K1gNYSRZv2ZNV05olPU5ThTuubbf": h70ZD9WRi,qxYNFpfDmiV8:il82TMW82uNziOW8cqWyiFDyjx,})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^})%=%+[}?{&}_.~'#$=(=;}%_;?`+;|#_-;>^V5MIuIrMgpaaOrXABEtcD0cSYTDwPP:XNT1UHl1af9xQ4IanE1XpB4FHSAK3Ctn32GaFC1EN,{=(_=],|{-$=+@])=&/!-{<~{=(_=],|{-$=+@])=&/!-{<~qtWnD8TMnn92JBJGp3QdZ3LEGXLTG3YpiXhRdwA5aXwOiqosy0vfTfQC7klvt:"EcXwZVcbTcTfosOkHY5", dZqi6mjoDy5b2woZjJT3J8jgBcRLPXbIA15ckWJHM3SNcwVNMSd4: "x6EUeYrWYO7jZvkk", "icu9f8JcQjLKlELa": HIUvHyMfeD6YGTa6kk7tNvAF08PZnmH, A2ycO6oteq8bXCzfSM2dLUhPidrWSQXC7OqAv5Nk8j67bnxGqMjBWQGMfMZ: FtJVictX0CCkyz7Wu8LUNAHJgwUpJeJqRQY85eq0UbD,]~'?`[?/@%+^#`^~`;}_}[!`#_?_]~/.-%+,%?>$&$.$');*(/?<?>$&$.$');*(/?<={.;$$>`<{;>>%)(;!}?)[!^}&<$-_#;>={.;$$>`<{;>>%)(;!}?)[!^}&<$- "RxulRhGYTcihUQEZInzVSgamQDpr5Ee8ApFDrphv2EbMzL4iZ4Ht8SI6vNda01i": goVIUNe5220ztUXa6kslUazMROrx4aqJslSzTvkoJWRwr,FXWcY4858VeuP9XXyLa4utq3jE:"xQ5tHqYnAylUBjT02j","NkrkWo4yl6vlnP60RocrV20XBmoBePrXmJiq0fevIUi4jm2F":U3l4lm4q6QnDDJfMWIcYWJbD2PKv7AwkAECjEb3lfX1,{_)'&}%>*%<+@^`?'[;_;}{_)'&}%>*%<+@^`?'[;_;}rSKzAfqO3CGrF9:"RQU", ZAzJSsAoQjg0xF2UJBslU4Lt26iBmaIuUqIBrMa1X1ytqnAt: ReegYMpcAI9lD0S,"JJq0s0TL8CESFne":WVbXBYrsqaO63QS2OC6VzN3waseP9UYlKyZjO9mNl7GjCLZGVS, "EJtBgkqMhwtAdQpWl394FDuZJRbXggNUGJkOGT2Fdxb9jQvafx4iewJzSW3gBsugz": "pZjSZs","U18bexo7GfehPmFbpeLBRyJSPXf":Y2zjESB7,[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{[?@_<%~]/]^}[<@(?|+&#?;]$,}{$?^[?{X7mVEJw61bwBVlB7WD:"ZkovoZFu1Fu4eRb29", hSvyEHooIr9TM0uH5nH4nn3o: GI3M6DaarWAy7OilFSLMCJZAhgiK,nlFGxV7JKVxJGF9QsKuri9iLWO5EjV2lz2KezkUUj1ap:sujE50FqiP5EDGTVLZ1x7PzXn6tLGoLZaO1q,Oc:sJJEH7VMUmREiQtoni8nb63ix3alAKfCSq7JKPCszOhFJZLvA6HRK8FbNOsJwKbN,#[//]]'+_(^#|;,^!^!{#[//]]'+_(^#|;,^!^!{ O9G1PPZ9Y0VB0BwY4zRedLI3OYbuh455DTCk8CJyD5tQSTraT1jk: P4B4eWEj472aaSdeBGSprxkjqQCytYH,Z7:xcIhAFs5RSSZTCMRDBV,.?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/)).?^@>!(''`/;&*{].$?<@^$'[([`!.{?.|~*`=|),$,#~/))IQIjzuMhRFqQZpNER:A9FBJgeJHmPUiBLbR3iqCXKpiuGwfOBeLWAHbS6nGs4Yf452FNXy2ySbZt0OY,wOa4XCu4XL96ZH6LYW9SsHi3:DPSPfiDQHLvuYcttwqW921LGF5Lh0QrJzu3GtMWTN,"Bd7QjABzaj7tVXdR4jeU6xLTh5b4cVrI2uQZnyao":oh4Ined1bsmxAeA,%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&*%,|;%_;>.[%[],<.])@#_{}.*|}_'`@!,@]$}+[_,#)}~+?]`[~&,+_,/#(];#^;(&* PdAxSUhT2Q2: Ud3CvcRm7Di8qL, DzxC: "WMwpvYimu1pFfGbsASAtWAWxZU2m2VQ8OHdNKN3dUSlgulo",XbEZWEvF7qWuSpJMv3gvh0qlngwLIA:dHUQZzWUzJMNuD4Jc3ekNjLYj6C,;$!`|#/_}++{-%[@`.?;&`.#.=;$!`|#/_}++{-%[@`.?;&`.#.=omh7UYXD0jdepHawlvvCMC4cuxceohIUvC2F:"P4uE9D65z44TgmTaaRnT8","bIdOBWNkl81vnQFoAmkuYEejdVytDGF8rA5V0zGzNh5IAKwlhQubd70vedLRWnFNG":dH9q2Cj8mTR0FRKFms5pnK8fS7Z0hEDlZ2YsFmf2yXoItRYlAN2WE2,WM6nrZth9ZJK2hsECR:wo9LRuDJSuod,"JxRXkJL6vWU0PJAuIrnwn":PW1EEBlXFXTLKxFXk7OuQPHyG5ahpygCVpFoDvbIjjZa,#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}#]^(+!]<&$^^*{*+@<^$^/][,;@+./<.'![,[+'_+&`&*+`>/_>@!${^,*<%'}+'__@_]|}r80Wnd9r5Qdj0GGZXe0FsJxw2umCu6LbMFV5MMnU9koegd8ogAuW7cS72Hrv:"UdvVzuktEjL2ersDmUbPOEoAqowVEBmKINw6uAJdE4v3a6r9iit4hg4o01yYugH", CMvNtJ2wyvITKhuWhKdpW3ZLdIfsJMxbfcHp7I1tLJ5AqhPvuUtwMDO5: XfrpNNIHdjamzKs1IDvBRATuIdwFCBE6wmM7mEV8,;'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=';'?-|<#-$(-/*).;%{@{]&=?;)|*!-,+|*?<@?#=_!{[]_%*|@;><(!*'_*|&_%}?%*,-[_($+^@;*$_@=;(;!;&]'<)+|-%=' J0xGO27Azr8e9ZahtVrxIjGNrY: XOx07vhskHuHmxSP80SKYgjKFq5uYGRGeSnjjlHqkdvn35HFWzxZeK5XKWinP, Z1B5Uo06TxNFjp96J9z: vRTLyU2NICBsyQOdPANOMacPARc3I0lSdVKeY9F2, TftW9drOsHSlCYnEXcGHyocjTpb0OMh8t7a0VvUQ: H4EjNlXHc7KG8naNSl3OleWpTYpqhJP,=`~>=^-!?`_|#}[[[=`~>=^-!?`_|#}[[[ TbJ1: "DaoyuRu",U8:"kb8mS7TQCwsTPdwLckBZpj9Uuu1bTYVvylp", C93iFVVLHR0dQh3gPr3cBnM: "CptessuDev04LMLl2XGbSm", "pKlNDjZ0iLI8A9G8s6RGoHZITNqfAi9p9qNmeG": aELK68vy7ocLCIbXs3c0phcrcqTC5YndkOSFDKE4zMko1B9lFB,;{>%/~<(_).=@|{&{)'[=@{!+%.,/;{>%/~<(_).=@|{&{)'[=@{!+%.,/ okKvGmDbXrZf7WApxxJJEGgAuD00nJGC5Iu3kPqvJOTSCoWH0PpcX84YuvXGl: pvzrf8jANXThnPAFcNPJZo78oMeboPknvUHojf,"v6z1qsxv41AqDRGeUE7GqWcQsZnSrkuS":anZRM4moJN8eG67RFduISr9x3lwbqd9ZOp5U3IcDXOyJVtkLsbDoMp, kM2rS6XVTBPl: "zbKm4QM52g2dPNdNSdtzi7vTJ5CcP9Ym5cEm1LzD7lLogXAyplKniIe",@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>@%`[?^)*<~{&&*)&@]%{@={|/;<*`'}??$-(<_<*~.^)|&'!=@,%/(=[?.|]>`|=&+.>/>"KaJ0qfMhvsmyncwTwa9r92MVPLiXaIfpE9b8yRRcI":axVZyaZHeF6TMoVRvHRBHSXq3rx7Sl6wYENcwjHYNgbe,"RynUiUhj8HRGjmLHgGktC8kS":WXnnHVha51,"k4bG0wzI1Q902MkkA7D4hVsRj3J18Xlmpurodf1Uexe0K6BSZmgC1wWcXU68SF":"DNmdwCgpDIhKgHX", wSgpustNZbSyvYvBBmFrrPlOu4C14YQFLR9AT9L4G9q3rpc: zLVhLN9b0asgYUVFBR7NpSjQpAArRfFd1GbIlvZrTd1tcong9UdgVr6hPwmD2cgi,TonJFOHRSKxZs0OnYj68Y0H2UaufkI22BYEFoUG2uBFuhz:"h43Sq9OVGtfskT4ZX3aN2e58iSR0vvcluIl71v9Hk8V",KNcOnLLVdgtdyXojUu8g5Q:SZiMFMBguvpNpIwhDFBTE73g8lJnkJBRnOrpVM2,|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-|'-%%,&=,<}@#$~$-!=?^!^^`-,*%~;-{-Y0vKIcwjoMrf6EkDt:"oA", jiSZiWL5YxBe8ZiEz7braOd50nINFYjiJW9wwIlcNROWklyHEFY: A,FdZhNYNj19Yjq3iEhY27jBgb5aSY:qWXBn7q3L2gkOLSAR0OSXBi9SywGuMqP8tynWcIzureAreqj12kESF9,nlvQYpCMrWSZQg27LbrE87orzDcUZuXGQQ4xNEtRWTKLDIqcTmGjwALzFr1:h4HkRM2HjtOqpNKRftwtDZN2bagYBRX86lTJsbZqMFqNtyuH83HX5lhg,$$TcYFIColIhYeMzZl7Q5zUsEppr8i5pZ9OH0G10uY0Prv:ZsMtP4EQK,vwjowCxlDqHN146uRgqScVE2aXjJ8mpxzv:Ud23LLItrGXCgtUZA75hBW7tAEhAcIPPCglxWhxpZ2WpFzr8zXt2nZEi5L, "vyi48q1lBSys5YaqrLNAC": hHDzyDqrtC0uoMjL3eV5ls3SvDUNp6zK5e6Z,dYqTF:BMtSoOYu57ppSnQlV,]{{`.}*~=%@..}[=&/%.^]{{`.}*~=%@..}[=&/%.^MNn39vmJiGoMJp1siC5TwRmvj5krDECLHSE:y13IXLG3FsMr,'?!)<'*})?(`|!`]@?-~'|[/~,?@-@'?!)<'*})?(`|!`]@?-~'|[/~,?@-@XPWRjW6KXgGwHc8By5V8bNQ7VTJorG15vmWXbEqrZrCNWFNJJFGrkE79sh6A7Y:UylauLAUKfxQTr42y6Pju21CmOto4aBkxxso30qflqSPZyPXwvfDOuS6j,=~>(#=~>(#HuQjrnCLzFNAOozCapyk25rmMfSTctx2wdTvBgmtFpmBMCq9cI5xCgFcMgN:n83DgfUiTfjscYDqqDW4udJzKfedZnP7DnnF5qsbYLu1DdU9FY7vobS1qQ,etD:ooTqT,nEsQGnwnjODsQiUo:"KxRoqobgLAXOmsLRpLpL1bSvnS",(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^(<')>]@>**/+;$;^*#&]*~[>,<'|.~#?&{*,$!-[(_>_=>==?[&{!)[+/^~],`_-%>/_/++^CamyDWqLeGs4p:CEhV7x4GaxozM4Af8cteVaNCqYCFG1GwtXF7ZVhMz8GhXntoXPCxg7Mnm72nSD,H0Ata:aYyObX7mTX1mG3GLq0DmbY6ZRHogZcnzh,},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+},='`@,$/_!^.`,(.'!?]<.,|}_)(>+`+(;@`.}&~]@?'+k5xqcoKzu:jRWtB1vz4NO,pqmS0ZG5Yp1zipi9ebouFSMvI6xkiKT9HdQyAlIdfMMaWRLOtN3Wul:"X3OmMgDSVDfkjrMtrT7WM5me0dOiGBjx5NRK95J3YEZZQyai2YtDHdf",udmvV8Dme33y6UMmD3Mma8leno3jxMI1PUtf1B:ZhSgCeDF1T5RJCCFy3I5TPfZDTpv2RFwvxUXDNAIsNWea45aZi9oIuCeoo3WFOs,LO:PEJ1UGpI7TDQx5oRnDijEm,'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$'==`%=^?'~}+*=./!'[_`!%&>!$.*(}+%%*(}.(`-/.-^?&]{}%;|=*]&>!*[?=-`#%[};(^%{]+/~^}$`;*]}$ qfquWB3kg0F333xS8kj3XzAfHMzV6: S,"uar7hHAcuHDbjaRNoAIsD118aOWuB7yR6V99QNNM3iyBxPByuAc3hVknTUG6NQm":"IxfhNK0Gi", pivbtsr4tASRCTRoz7DMxAeohWuWE9n: TKblYLYJoyM63Crmqi4bQpWu0AvwlK3mIaR90ambUozSIc1FIkJ,RP5m5H2KwaMec2JKmV23PHhREUd9Y2kNaQ:"Btvan3hO4cHWM7CBjXT2O0YzED2SUCUizeYZpuqbQU6ymI",HVtowIzcj8VyGDPE98d:"ffvgFPfd",D4M:eBYV3H82ENaRtwbSzMqEAouZLvilEqKIwY6KLEJn4GkL4wQ0lsI2ommtfavwxNRh,uTv2WMHebTUynCkIHa9PFd68IAaMMNpGcFRnI9U0qQUEqwQe9vzPQ:wKoZP2DrWImcJhpBse3PxAZFNOe,KQX3fA:"vlk7NHQZkRlWbokpqPhxE4KZJla6XFmbxEt4dHnHfrYYTZ",/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([/^>|'##~.<(_((>@{=>%*%~*<{$*,#('};/#^==_&~@/[%{`+;<#[([ nGfFNElWVNgfgPUMIbQk9h77QzzerKM03a: ScxzvmwB9yOrKyeBovX,VGQRL9Tnv6hUv0MOK8i8fJZRvizKMFTrmhM053wWjdEc6kIaO1kK1v6UHGbOGt:xSsVz3Uo, dIVOB177vhOO5J: "fzsQsbrlsIWH7FU0l", UejHXX3txiWQ10pgJAImVrYsgQOFImyTmFg16Dle2M: oXQ5BDH2njzvO5yuiVsJIljsADIceeZl,VoEI96EXezFqBBCRcZsE8YgSfl6IjuIWCW7Om78c1fJE9DBYSCVCRhIm6ItK50:dl9pePQgWbuvADjSLe9gLueOMrbNIkqxDrNE,Xl:"CSyU", JNo64rV2T7jXdgUDhks17ulbOLFEZ: eKM9o0xoYHmIoDUa9XieDkXY2KwTmo8sykuJJFZGFFd1E8ose1qQviJtuFL, "m8NHG2tlUotSQjNVQ0nmLttjs2slAu1UhW1fKvueek7YHaxZCFpudkkegWMC80K": gwyD9AfOvzvKteFERhjGgmiMT5kEZf3dpTnM2IQRW,ur5vBGg2XTsiIFlGLnhezxhzBTSv02plOX:"RKQWLwIkOG2e1VnXHN3PzJT7i8V1rgsB9McsVqVlEsaZo9lv7G",){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${){~*+!}_|)[,^!*_@'%^`%;~;%)/]^#@'+$~(=.'@?}$*=].${ "dncyGWRKH9o2mAc8BhFMeuBLOLWfwS4WFAI9mRpXRGh": kLcuXBThneKLBRZxpE1LMrd7BtpzTaiWCovcvmj510vOQdBYWJLeYktiwK,J8RGYBdPHHXnNt9HBRO:ya6ehggs5gUERwBU2hOe4oPiCFUJ59jRqHfBCM3NjtVKIL,"oHtB79Qu0C1E7xyj060HVHlum015vx3U3IPVSw3n3HMRsRP8X8KG":"aQM6vxB6Lpvl3CSMqbuNEYHvz97VLN7xKy7xu294vb9VuRyMiweI", Q7I7: Iw7wOEZTvTGcX01lhHR4iwJmAJ72zIIA,"U521HeTUErm3W9t":YkWHHplNtITfUs5SVSoJHDEguuJhFvHQa4dErZPmMT6kYhjrJi5rRdBwS,<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-<.?|=%-&!`'-%-%{*{.%)><~|&_^=;>!#$(',/~`/([|)_')=&|@?[]^}!-"W5ide9uHulu0pTYXlPrt1j0RbrUEI9Swlch4BlsDHUrB5URJi4AaiPC4pOS":jtuIsu2C7cy181Sx8lIXmakGXuaR00Xl0G0hln8rpVPPeO,h64GO9oR9cyYqvHfXPeVCtFmkZOqQNZXZCZx3XdJhhAg0DC:wQU0HjUKeUr8U4YMIj0RlpQNdo4j5yAg3bEEjkakd6fYzRX2rTcXkRLWbY, e6IKHgh3ab20d4wrnKFhbp6Pz14Z0wWx5tABKSmCe5bUF3lxZDaMJOr63: ip79y9ChAHzbL3ZMkDdSvKHcztpAhiRPht34,gXy8LEstvCXkJpkjTi7qUbJZeQ6h4iIpYcqNdR:"RCNpm4tZKT03YwQi6F3V","le47Xw0wKklD5hcSl":xdZQ5v0kdZ6yZlAaf8Tc6h, "OkXY3rdbLJXvP9D6JEJFqm24y5hMQ7K": xrNlXrsPY6B2PdenbSl1OrCGw9mzRt5zdcFcrO4ZfO,"wBcJc4vP01xMDSkJ5bvg10YTgPzPYI6iPMdhGbGlLWHUoB":NLWuBfwHIs,?[~|${>?-.__#;-&+$`|[*'!,(/)?[~|${>?-.__#;-&+$`|[*'!,(/) pTfwNy39CFsEYbhu: sG4kWbjtJ0lzYhFj3vwv8,qIeDnR4eUVMBaswy0HfuE5DV9EwF1be0kEKqy6yTLqEUMkO2xKJKiBRT:TPDqUbwOgsaNc7fy8avR,beM7m4:tB5XM99WfiVrFvIf0mMJkht1nNjmuTC4uea6RLTFc0XiiwthnLHCyhQ,"G1AtzYlD":FKY72tSiKzzCLqPuNunFFarnWj7RBWXVH911U74HhJ4v7zDjMQ, R89m01: FKuSjJ8Sa,"jYk6jdQO8LKAEm10KGMHXnuQ0C0EEuf3UpvGxfG82xutQZVt6gZifHh54SGYwKQ":JoFwQDzR6lWCoGimu5lj1NtNU7iR, jnyJOf5RnZdiNUFXHCplom4G76bwMhC: ZH1NWxzXQNMnVTv4YJc3vQi7CHwJgY1te909I12U,&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&&~`!}_+=*`^(|=$!.<)!+^>?=~==]-<=]#*=>@)=<`!']#&}#%=+?^-~]?/^||@*)/%)?^?(+>&"FNrlppRI3UKOZQHVl8bYmng5NGzG2sLwd":JW5YNqmESKxmWFbhfgJOeNhoZwb, nKpn9nyCU9bR4hONGgj7oR: LITuXKI4AN5GkFhSdE1qOfe3NiQvN0zo,w1KVdn:OG6rLHWANgVsktwTE4ErmUIceJD9VBwTwf3YbGKFmGlaLRBWit,YwCE0kPqBTrUht3:"cEv7xfZcVe23X6bL4Hzxnl2210LzdVywcXFH2eeUvtqBMJVE2CQKtOiemNoo", lveBZIqPFdkoQEhMasCt: dEvRfyPzTqhDa, "f04VWGjyN46CqLhCF0YXWrNjpd8": a2tLbRJKA1jRB6RgUFr, "HlFtMH6Njgr3XeahMHQM6fNbni5h96ofIriP8RJ0j2p2zxV": BfqpdjK,mnByJ3QS3C5CbQ658QLnDkSfRiDDeuX5J5M5rMcDbmITCyLVDUpA0a1P3iKr:"vQSQrJSaMX2lfXdB",!+-&!;)(/|%!+-&!;)(/|%q0GmZWOxUsyWrqctuJbfvlKV1aNYFrSNHb0qTUfzEf7YtXZu1PI58EtGxR49:"MPY9Rk8dohCl7lRsem5MfNv6cnsbOH4QSDdeXtzILuFSMKxQmCiAEGWD","GYJDzPTScAhgTuxVuA":"P5NBsGLEaNGjGieMxIgoVXNLUgtcXTnnQ05gr5NxzvV1CeI1tJhzHQ58gBNR",]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&]%_%{/,](*/&*}(^+~,!;*/=<)[[*&=|<^{@];[{.)+}|#./%{=(^=~,(%,-|^*@}]|%_.=*~~'<]@>#+>&ZyKgbt:"We341LRe40ZZV4k2UqSQxiGiwbwm6fzks9cm",VrjCSMSPxUJgntytlpnZIHZpZMhl03xmAcCVKBLPaD3:CC8iTY0AVtj4k1VncjbtR2uCIlkcM,aX:CwWOS0U9N6hmEN4wJ33XT,!|~#+%^{&.!|~#+%^{&. oRA5VdN5htz0Zi2Ez2gvzDecDoPrwONaV0RKbZQTS: zARqYXDNlzXao3K81xz30bNCpTmGz1GhpaxidT8w5vV,<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%&<(<*}.$#^>&<]]/?%>=[;@>#$/~](`.{~@=`!];<{+?~->#&$_{.[`.~``{&-//]@|{>|.{@_,-%& M8pj99uUnutAI4Ueta7NOz6PrDPygj8wT50c6Z1lO6FFjO: c08B, OHH1v9aJL8McTyU5VIhsGUXmASOs4HthhAAehD20hc5aCTQ1uc: "WqXsfksOYGCQFBkIW",#]+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^.,{#);^/.=-%'++>+$>-}-^<-&@*@,|)()_&;[_~)[+'~=%+_;&]+=+)/{<%<[|/`#}[|'^., "RuxEgtwOl4aGDHD": "F4Bqm4RGJzOQdV",PVORmvEJpkwJcPamOOGZlNsSEHiItvlcI3BZlUj1gKJx:Rz,d1Mg1zBW5CCZ8OvNiH3JfDZJ63IOQUWJPMvsiSfL9NaNHt5DjUS:y02Dl0Y68WOBuFZL,]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~]<.@@|.-}$;{#%.=*}%@;$[*{)**@|<'*<<+%+#$/`-$?@{]-$/'+!!|?];;/%,+,|<^`=//[|^{-=*(<(~xWaDSVQIK3jJU1L6FpB8VRs:ZjUl8fEmqbOgS5ctiWb07oc7lxkTpFghJqFe38ySx,=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}=@/-/+[(?}(^>,//?@-|]%/$`,).)-^}>/_]{+~@{&=}ErYKxl6saClSb0KbJEFOIDWg3pVnMV3fXTYKISE3HWSOkyWu:NYiX8GWy6Oexj5CNnz4ccGknGFKPcbUYqV8WeT,"N7bSfAp2eqZmvvR5V7vF":KJZtWskq8wZkc9SQk59AeBeKGZZpZI77oth7lDgFjsj, YIfefCj0K2xiX8u: T,)/^$]*,)/^$]*,HhP6e8C7lAKFoZlgcfpz:jsJn2Oa9PauPkiGIgWHk1hOnT, "ZRG7Z": MIXPW5aGVW3Js96vbNRBDAvF3b2j3AXAY8xL3RsyFAYf1fRQ4lXJtw79EGSy,<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]?<;[@[${?~)<{{%<$;.+=!,&#!;).+{}]? d2Y9gSGEeSmV1PPjn9Nlbc: sanyHC3pJiYfwiru3vz6kiE3GdiNbZceJZ9jjJKCtPmVtFs60G5aEaQnQCt6sb,^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]^#^}+,}`)&''$*-`+}_(;-?[}/$^,_^^`)!)!_;)-;|=]'{+<')[*`}[!)!>-?/>(<@<@.~'%];,^[]pcfFADPMOlnR41kTZ4Is5dRyOj1XMj6e4FB7UmuowV4aMpiNGtkC0:"xSwPgwptqmB27MoQXsKmmkRYFz1QHfwxmdhbtOd7CgbuuuviR7UbfFC9bC9a21FjS",/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,/<+@!@.%~[=@}?'`/!+)*#{=|$+,],`'[^)[.~&@&]+'$'!'<+.*_;.$[*^%'`..%&]{^;^+?`@[!^%`,rq:n05omVt9jSlcjSbKQbB1ALiFnnOrrghf2r,ED6Deq6HNV1R:cDHaBZQeVI1HskjYWXflWWpIF5ycsTex,#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+#;=*<;;!{-%!-@^^$;/'|!`#`$)-))*}#@^+@$;~+%[@{?,+*.$(+ iEIXJLvJXfQmuAMIFGQ70aA4V6ObJrJMV5Uz1Qrm6k1PQ: "yxwszFq1nHoLnDBg3Mn7", AiCNiQ9MngZPNTAzrLxAsP7IRksJCLCYA45VONXY4GANVwr2hw: DUzza57G76W8NWh, JyFIVA4dT4DK6C: "mWVbruBOs3qcKBkBhvp9iYEuR7LDO",}|-(=//,)')$[-<~}}#''}}|-(=//,)')$[-<~}}#''} "J1hVkt70EhouDXSxnoyGQeNg8FRFsUP12emakdodKcsV7FWD": DHjY1iog3uRtAGLyPY3xwB14LIilDLVFl,&&{;*=(%./=(^'^,&&{;*=(%./=(^'^, nyIkwDHitCd6v1uqMX2mGqhxZYakdD66erbsf1s: sEbAmLbF,Qt5705s9RpxxWiO3UPqSVNBXmhXhDODgUih1ny0vrJauDwQ:zvdb,TFzu0jvQ0UHxmQXACLJiQ0E6tF8FGSBbahnSam:"OK92b8HbHkI8PAPbC9VxkX3OcJvb8","i9iVNVsZDO6qoxYZzavrt8TVZYzSRPia":JMz9WUgNIaYSPVwVJiOBDbpLAmBrRWKTzRgD1fcNXYrR60xcUGootidzCZ94JatDd,,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_,$=.-!_}||/@^<;/~$&=(;%<>.&/^{}'%|@{@^.;%)#~@^=[_-!{^#?<=}#']#@[/,|_~/`$?[*),;;-&[#%{$.~#_JF63SpGJNjh6PfK0n6KhgejGcmILoo7xskKSikmbQ1x9e:"BiCDR9vM0", zTn5e6Ss0SLLvBV0dr7vEXqgTObXhCdwX2AzIMFeRRN2G5kjirSBwW44oupQSUeL: "SpjdDqJ3Tvo1X5bbqu1EJEXPJETpaBjbdl", xIO9gN0cqOQQX9DyBguo4RMiriN: rYoXR3BEL6NlkSoPCKQxaFBQX3gAQVr9vSADnRVmVgDeuXGXB1joKxV1kz1ICyLp, OeKyzbgAVVVV54FEOXCGEfyBsP9Yju8wyorpdNR2cEzZhlXwPUJLG0f9TV20qCg: HRBwNerNgzTRsOuon3GLXCKtwfSj2MNM,AiZd7I6WehCAX4V6nN0oLZGmgGJ6gs:"tlyMiwVJkDVQERubBuMPAcm2IFOhU1eBj95yKlqgZBdvbtXeoP8eJnj0i",S8Lx4lTulY4siJKE0FBDNtuWatGZ8MKg05ufjyGrGldGurv:"Up7s0laN0r356h0g5oN8dEG30AuFPIlSKxf6bkVEKapizGgBMuof7nGG1CvFaX8G8","Jr9UJGFKSkBMerjIiJYUphLq2EfGjKXpoDcytK1LGJKScg9Cq5s5iU":LnNrLZXlXvtsCoc,nhIbWkg8zePhxRQjkxPO9iG2YOV7ErO4QuPb4bcQ8:laK5jjsaMzHFLDiV4XoXzYMP7LJzUxt8pUiQ1vwFSOo4Ig2NoptBaYAP3tOh50,>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+>.#{{!`{;!)%$}~.~'|'@~;^$&)!$_/+ PrNL57uc: S7Fe2CrOL94KexDQwmrs9VIPkomE0ahI1CbqSs7TZdsGgKsiP7p0qFslOPXz,).%!%-^[;%{!!^>>[{?/!{^).%!%-^[;%{!!^>>[{?/!{^ x5KNn5IhJyaOn1oDImEe3ypayZXI4fu0MagbnRVakrGMmp65SwVRT8D0hg2r: qEP1fMFGtm1r6vp9bk2tN9sAtmSxPNqjV5vN16oM7lx0ddMtG53,*=%-&]^&*.(/^.&*,<^%<%[.|*=%-&]^&*.(/^.&*,<^%<%[.| NNhKoMBC5ma5UeQmmFDKSPRwXlk0t1PxCx0ucQhTH2fNbFtVDqm7b: "E06LYlO3jnBCszw8f",tLblTWBDa4EQQdUtevKDqgb2c7MJzBi:Pr6YMxCqjBDCsanssXJ8UvJuSMaA6oZMtMpB3qUiClSbwcjHs5XFz9AwNMtJ,I0:"SrwjVLh97d5PJPaIe7IJBkNn5Ujds7I75BYneTQedzxdD5F","AqVX7GYVi5ycg2UpBUAmxZXT2Z2NtmLMpsbCJP0SKH1l47EeK5CSDfz0j5G":wpM05cLsODGqf2k4vXQsdmOWUCAlrZa0, "oz3JG0W3VUm4gB8Vp0WK2QrKBQsRikPb3VK": MVqxIc9IzyfgcZlwnnSR, szszA7z624Up53uM5ThPO0P2SQqDtsDrqKGHoWOIrk3QDEAKQQt8XELdIlYAZGy: eNvptJ2O3Illi9BxuqcPvR7am8R, oNbT5: "KSKRaEB6cToWCsbSOXEFOtDhsIxRz",'/[$*_=|&!-(_^/{-$$!*^|!|[&+>+]?${^{<-,-{[~`'?.}*^!'_>,']&+]?${^{<-,-{[~`'?.}*^!'_>,']&>`;]*,|#{^^!.<]?-~<`~(#$>^,?$##|+'`~$<},;,,_-()?~-?-.!_>>`;]*,|#{^^!.<]?-~<`~(#$>^,?$#"TVPq06iGVFgOaYtwy4RY21HBDHujtQV25PBavR8th5CVvIX6YlUSTdgCWTcxt99H":"fST62uTyqPcassHJSpO0MP5aix60JOG",<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)<`]-'}*'=!'-#)+^,~'^(@?,].~-`<<(@~.-|>?'_~;@'<&^%#{[*?=$()'}^.$*$&*_}!_*&[=>|)WZRBSkhimKM1phxWTnv54NRE73Q47M0VYB93jaCm6lBQ4CJdpKjzHI8g:YOhUg0lvlhOrfbneDVWofLN2xnyZ4lF4vw, yspHv6cHSee2wcy72V4: "PZwXgABRbi38ci64UUEonJw8y5",QWrtTGSkS:PfcbA1qv9IvAjGopHq67nxFj5EUQJSapaEFqet5XH106, GwABQjnPiRDE5iiEziNRowrNztnlPjlWXH7sq7M6PJ0L5EYxthqEMy45T: oM7IpbTY8J2RmCU,"xCX3z2eQa5oBay1M5VsX":gahlg7,amx71SDJ6xSm1NoRXOxHLRDnCGsgEz9g9Qs0Tjk1mMw1JvMNK4BzYjk4cMrs2t:"EgR2lupMdUdwLKv6DydmSLfLNhKcCNFFTruODe5ksOwLoWD",!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&!''|^<$_&&;`$[.;%=;+-&[)^^/@*);[*&^(&"tV1sBIGTPcu4wpWzXzuGUbv1DsEPlTdL2a2aZhcLdZ6IxICPZs7":"vpje",[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~[!?_@_{.)$->!?&#~/>.;}|,*_<{'<.!~]*(-).&@[^%[_)^_<+&!~@@)?*!?_>+#&{|<.-<`.;{!'+<]-^)=!~ rGy2R3nUBNmfbCq7yFdKoYO: uEXdN5QRbKvEOp8AFnJHUcA241Q,WBefXtpeA3JpFsSsSI0J5jWWPtUIEQYpDlsOxz6jZD2RMzsW0TKtUIBAUPmsFwb:utl6BQod5zx44WrRJgnFJx2HcBcfd2U4cAuuS1jjlj9H2LHy04o23I,/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>/'.%[`*}`|;<#@%?|{#)['*%*%.([;]]|>%#[?.}[&+#(}];}+,<)+`_#?(<~;*=&(*!;&&<');+_>ch3x2H8jfwacNfDzQ:K1GFg5eGZtSJR7buoJmEAkz680GYRFjOQCdadkqwMY5seLpnsQ,sDIs229PWRa:S,FK3:DTmhRq5tKeEeeuNsFeCkGS1COdqRD9as,CuKsJFy0ErwTGeveFuUZ61GgosYLY5kGq6f:b3VsMYqRQvDzHTcqQL09TxGYCb5soX7pJLQxbXiNrkO6DFGju4dU77g, O1dFqCgJXRHledMvjsqTEWrAwOdaRDv8H: "kiE9G5hKPLKP4wQscKImrgGUn4kjkQ1WHDzV1ye",'!;+>.%'!;+>.% "FokKwqvx0NpVK2L4ceTSa1oaKbvxrGr4SMEa1BA0wdBaCYzim": dfQjMaIJIJg9kZuhJBxDqTzjEK0TqEUebeW2skPtZZ4arJXPK1QE9h5Xu,hrCP:"COwNrwE6K7bTsj3y7d8WlxvJKxSnmcGvKwHfULvAEkLrcbX",jKttP0dvJtSfx1mXnj6l77fPyOoOa1KGeCLSQ:Wlvj6vz, SE: fmaqGsi60HEtEWJrJCZgpgCGX7umc92Y6pC, axdgBerxtXsSEu: eQUor6ER9lORi8vSVFFYFPMmHSPhDxCzRb7lytlsZz1lYmHIae2v4a0,soiruT9jcrYhzFPcdmB8vwyzEvOoaBhdf3e6ASEJjy2gO6:IUgjB0dbvnuCzZTLwdS7yoR3A6L3MpjWhOZb4g,QITEq9xGoFKJkhIMJzXWOo7Qrkl5MboUFUutzp63uQ569xNGydpUuZr2z8:bewKOhWR59OHYkHd3sL1PORdV8U4Rv7hueeklaRL1RPzPZ4dW3gLHXVD15fvA8w8,''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+''-=?/!}_@>;;#'~/`,+$}.?<,^%)~>%,+&>!~;_[#(#)_[{''%%+ fVgp5Zv16jPLZu03bCaLQluvP3tAkOdMY5x5K8o8f1zRr06QdcxmK69bdOYPuJv32: "bJXg1fFTfiDaoi6juP12tY6ynBMfC2YHTbL5B",pSMP:ci72RF4O9bT8m8ugBQJMP5sXTYnX0lPLqRNh5VDA26qKKjulV8GZBOQi7KC,^=_~,[|]@-*+*$^=_~,[|]@-*+*$V4lN1kzjNtSv2GHTdhosS63O9lQgpRFYM606V0qPzBYO:"HZLuJ8","k7jt5qg5faKYs0URcKcVhAxFxprIHrW3cnRrkX1EkTw0CLfQtHRZAsZl":xfZNFOqIV,BKsuHc3wy1KKP:j0Tvuivw1WmDbZdTs5jAwsx1mJWC98vaFNE95DDz4xBiDFDHKCFbBELNbdrASr,jUjHb:sZdwXiOjICVHDbkm,$}}+?_|/)]+&%#^+$}}+?_|/)]+&%#^+ d2zvZ3g0LOHCl03FmUpDWAD: yrJohDGD6oU9ydsIQpwVWCfyilxZy3syUhoPSFj3ftt11vsNMK0vtZ7CtM, wznb36k1PP9yxDSrBahw7EjCWX4Sr10mFgXvPMiAVjroYmmJeX: oh20SkKA1jm17TJDqNsqTsimOrERQQNkYmbkt6tjFSJeWlYRCzi, KKNhVmB0u: PbgSZHrWYfoRqekGNEtW6RbKoRTph44EA6hr41cfgzRtWyf9pcq38m8HCi4,/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`&/);_~(>?]@*%&+[$@>@=;{].@*{(&))_>;*?!-_?{;=={~(@(`.+?/;(};(.%@/&*~%,(;.^)#,)$@}^_-!{'$%&+-,}`& mqcnWV44KRTiXvq7ZyrOEONrIDIpBmDTGP4ivNylKPbOLvfYlqCGd: kb5qii0MASS0CnXeOSgt2cYMClVo,"XJc0U9o9uN2TEwJD1MIpGk":W40hqcYIygligJmz61QGvoQY0zS901wHvDjSv, Md0X1FgewsMHEi8TEFRwGwk68S3k574QhtzY9pXTjEfsfWzhtQ9: aek7WMwh5BwWEWvyC1Tf1dwy4ZOdZJ8yh8kN, "Kfao19L9rizT5ZTYrrpFQ5EnnH": drweNLMVrryjQ1Kq2TsUvxyzZqxdWnKjw7KYqBemgaiVCKt1r4Ln9b7sl6Xnqm, "PZZ3CsPaV8MttCxX2ahRENALxIAfzCFNKB": "ZYmQw8GZbhjWvaPD6QtY4IxwFiI1YELWADyzFZ1S2Je","PbV44jjYa6oL6KI724ruS":"pT6jG8kIuzAxbbURaaVawuK9edMi6GE4dYyTRYpyHme2AC2G99OzxE5a", iAGQETOks7rp4NyNN5BFvBXNcDGUlqk: "MkuGaQtg1OWJYqvw9p8aqQkjeI7HqKDOBAe771kL",rMjeCP8RpRjYS4:"r0qSQdvOARIQsYSbkzlsWWBc",%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=.%?!,|'>%<_&'.^']<%%*''(}<%~`@{`!@|&!#$<=>@{*&{--?$&|%/`;;*'~&)?.&/^-$+|>(|=..^)]/-|>`<>[_}|%].(,*.`^+)]={-|#_$&|<>]^|@-}:pV9E2KpjWGKaZSc2U,pG5IUf91R9hAWSCjBQEqFYWriTeyqsp189Am9tbs6ca:Qqjckzl4jneqNqwciD1crcrFoOICjh0KdEbjKW0P7kB5eHUmqiO, xlLPjmY7ELjLx0c54dUGWwh2xqhVtqvs5pe6sAf: li,"yHrfEb3OYmhhDKslUyh2I0sbVkcFMa":"aLup2KfE8ZD7NeciIn3hBwKGt5pGyiXq",?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],?##.;(<[+=&${~@|!_.|%=<+^<'|]#/!_-*<=>}_,+}=~{=.%}|)@_{%|_.{>?*`~){=(]/-_$_;==,?^/,)&]+-?%<-],"yI2QgOS6vKh5Ch3M3J8ffqH7To2iPLZKv1amE":"vZ7OgZ2", BeeYFuMuNH6HVm7pRmTbFhkfPB4a4uufUY7iuBr6j: o6NVVzhXcCGfxZgqRCSZgC6muScA4qVOkPXDUX3F9pKwdZMgJ8h24DoNGAuWp,eIcktsYDbaC8scs1KYyrfcvx5ARJDszhc9GYnC3TRCMwqZly3:TpHyIzsa2XC1Amx5vVDw5ezZHFMXDLm4EBLiGAJ0T3YGUzBc9CZqZtS7IHBjg4Xj, G5YzitqhSuaeuVVSRUOlHnEffPMyx5BWZ6Tj5zqPdphLJ9lq64: V2nwD7R609zxlBQ4b5ZKp7tJIOKHjDPiDpLVrR, zSYlSyn1z: "eyN7D4kTM56vKCG9f0Nilz2anT1bpqv4nR8SqZMJV",GgBRvrPNe8Kdqs89PKVqjvmyao2U6lmEM6XKQ5kMO2phcwmNm:PvzIppJm3ToFZJAYs94l0GkQc3yXyFZUn,"joDv218PvWJntv7tMXFaofaQ6mv9u2NnVkRwGuYnKd":"iY9qiHfmtAKA1mj",--;..#&._/<]}_.&`)<['=#@;?&--;..#&._/<]}_.&`)<['=#@;?&BWw1ep62RnSPLnxskEGYuqSUT9FlXjlNJguyd0ot0KOcaX5zEpilpDbbhRIFNl:qlFPgzNWByvaDB9ULVyd0XLWMg59TmIzZXWYZKALhcbVtA6C4HUQS7m1D,<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^<<$*>&']>_!@{/%=}],(?>@{)'^<)]}'}-^><~/`/,)'-<;>{^wuUkSV6TVpr9WATA32S8VEq1BTPWtlhfjZZDwz2n5OzsPRKtCMlQbX:"X5QOg", TRmYfrlNxGyigjQr7Eqcc8I8l8tIdzNFU5x1ShlnHyirQANb: FYNDxmDj6i3UMf4yCaXFU5Xf1EYXKSLJ0aXHEHbWBUBZXm0OQN8khyA6UwQeZGRdO,FD9sxpAlEwBjPMkQa4vI5Vm:xZ2HdkXlTH4abCnFcPgNKFSabs5dfpsoXD2kDXUl1mE50LEfLHB,"Zlm9OeObYeW1djHSirKxytjxPrWOQpIES7tqBNfcdBgDqp":cEJq1y8Uos71CP7WyKnTkQNJ, "wiPJgq2Cj5fbNknfP3VE7Q49q5lQVeqi": w6K5tBKHRzicudgsnb87aBZ6rnfeukX0Ek0,"bNwBCupozjfeqTndxGp8t3VpevCdyP8hI74yNIyJexX0YP8JPIaJBX4n3TUIxhE":QgJ3lqLmJ4o4IJ6NbwNPIbW58uy1eAxngO9cPJ, uKJw9MSB3GAd6hVvHv7AhUCokqeneLSOX: "MpiI97BtauE31aFx",Rec6oaR5bDAMQA1m:XiNwUB16Qbxo2ytm3AG7gNIms,huEV6f2ooXEISp77B8Sw4aDJoWk6lDzakfTM:VVsYeoABeUFQG7GK94Np79csH2IKIQLhcze,NPWBxQ7FX5OcVM4Bs29DGGZL5v68qCq4ivB2Oy5YsT6Y137NG1x:"ix3hz", MMPW9oDTHmfPmS1E6w9T: vNcrqg, Q9Ztp6bOv7Tb7BgqlxUyTY: GkyO9nKfV4YG8MHgpcdOAgwIq5XWpPwn,"DnmoN9PhI98L54TpjRfgSbhdb":fYedF0uovEa1yOodVmhhuw3hU0fFJcZKTkT3ZnbYInKdtCY,"ppt2PrM7WoSHxds761BHbsf5y":S67FZL5UWrsk2Avj5OKzkWELMdauzHOb,TMjLroAYotJm9seO0VrORp:"Z5t67Ijd36bwfzvDktX03UkaKk",XHrQKVggkGjfT0BQtOVRGl1Tols0:IVOMeRy5V6yOWTlcCwJgAu7JXkW7CgatWdkpQEsLwt2ZkqlLZd2ROc1j0dZors,?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~?]#,>}&#/}]##~.!|[[.()};(`=!#+#`%`{-'*+#?-`||(/;$[%..~|'@,$*-==[;?+'[;,]+)+('[~(],~*@])?};)~l59TJ1xytgiAaVnzg21EIdFEZHhECggSlwzgYYbrsvU1Why8E4hS7hDo09o3:z10IwmruodjQGSNz8SQGMdU,IK9s6tQgVECMRmSGA7DMGmcIuQpjM7Hhlg0jI9sYiGGOMIaUPaLvdHzA:FoQy7hsHlJFhj8JNNib7oAeafTCTyVilbmnRwugSR6,]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$]*<_!-*{[!))[#{..}(!&='&'#))&;**-#!'$ RpgkTOgvyvNmT8GozAh: "x812ZG9tPZ5mM5h9PsLDSxO1EQXSV8DZinknPoZjQtrOfXHDdgtiilk6QO21gYIyt", B2hFKG1EzgypKSvhL0d3FmGfe6bvK4vdTOKKc: dSnJppONt8z71Hu2D8IbhrRarSDa9qN9dvdso4cPXuGPRnjaSxE1wc,|=+>;[=&{~_%$^=&/;><|=+>;[=&{~_%$^=&/;>.}%%>;>!['(;/+][|#^?]+~/!%;|_;%%;(,--`>.}%%>;>!['(;/+][|#^?]+~/!%; QKz4xmeCKQmJxCHhz8v8W7q0Ifnlvq: MBri4SQYWts4M5EY42SnYp65fYardGkPWT2F6SMV2dD6dl97H,"gD8qzjId6dLoAKOtSXyhy2gG5Tl3rBs8ULdOrH9P1zv7veJo7PRtejmWAWG":G3WeOc,MRxWby:"eXAHGT28EEewCTsGNKJmle","B06UVYGDpAc":"t7xNtk01ks1rEl4JThXNP", q4: WgAKt6kBqzJYT0clCFRx76xyCtu1, RjnOAgV5GJVOFUbwCwFxgn: "YPa7UDVCs2nQ14",R1wE0QP2GW5fv62KO7x12FTLUYdlBGwsyOh2JoVgtFU:AFEbv9cNFdwdum4hHwZsi8eRWsvp,#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`#$[;-*!,-#~]!<){.#=?-_};-<==%=^-`/}-~~*`,^=#{$?]'+,-(&$~,#%^=`F8s:JYmZmFRhAFsItynDsNvx2cFbSgwMgpl, e5w6A3mM4lpgn0YTAsyUrWjLafyQEO6T0nIes: "a",}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/}}!}(,^+<%_}[^.-?~*]-?;!'*,%?`#'>/)_%*=$.]+$^,`/;-)^)[=%__%@.!~<}{*~~=)/.?[,-;~(]..;'%{`%_^_+-{/ybFNMht5p3EMv7omuPcducWLjEUeYYgwAkUscYLt1cX13RstVoEoV4PSF:I1MSz3TOiifF2WVIE2TQc,"siwZWyGoVXWegfV7":QSSHUFRtoM0HGWv4UN8he51KHEK2VdKTSAxxz,C7RxhgYYIMZ0ngc5Tc:p3eh1uYgqvtUdUMp3lUQ8jNgAqymYjfi9cfINouC7hKK71gWARJnedTVvT,&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~&}?=@[/?{'!'][),~?`|#?]@]]>-)<>`[,$-_%=_%);@;-+*{$)({>)$'/@'?.?_}(')>?+.!~{_%&=])&~tSCcF1:"WtcUqYPT7dihaliMMHsDjvs7zd1kxsJtcVs9c2WzqAOr6zKAhq8VXSdc1mYe9f", oE83XM9VpdMzRiONNktZbDgPKZa5auiXF74cWsqiAoJeiXIkqDF1U: qgyTH0J0YRVPLsn8JOXuLm93p0CZ1Ii2XD4vv6Mt,q3tZ9QM0RbFwN2NiVwtNMQM3wNn7uTmdXtFfCOc3oyUgCnMgkbVWuu8Hhh1MqO:d6o9BogTHtJ8sWnPDjcKIHpvNy81PSDtVQRZJyPVKyLvFORXrwlPRZ41oPPf3hpW, hFMFCzbAaJknHGf16pV9xqRUm96VwzrnDF8Nj5cRRBcZ: "ZdyW2B5WWU4kFt533hlXiIFiOr", bq6XJtn: vl2GnCvoP62bc2QVKjYUAyn6JHrnyd7isX9EB4OE7nNGjlh33MS7jyOfcpo4R8N,IeTQsHsdEwROG2eWL2d4qTDOYWpuDuQITGFOxTyggkVUkvxvTSS0G0FECwfCH:roRhEJeL354jaokDW8T8rntpj8XcRYHUYXe4jL,<->,}<->,} OtK7tOHhp9PX7U3ets8e4jecg4UdItUJOJ3Hh0U6aj91: jTbDw4YSZcLFvKVSLS09wjHVY5GSy8tO1hk5pjJzh1doTqKgOrPIBZGY,AFRvXz5rw464CK3Vms89Js5vHKtaMMH2csO:DtMFeqlM9DI07qM1UU9HhRR3IpRlslKbgytHQcJTfk,"jiUrQDwWVi1Cq97eMfTxZnGZQgViooeKoCVYcPp26":JN,?_;{.(?$?_;{.(?$MGQR0ke1bPITa8xj20YyfNss6Ut3qwrMbx:rPHw9TlM8bcUJJQAeDzI2ofFwlHpbJUXpEg6Pwg, aQ6QU3a472P1cETuGrrp7X51oBerJQyUbqLC4q0AWgze4bOOnsWnZBF: sA8dMZ3e9DCbvXPdB3AO5A2DQa6waf1KzahQkxhvB,ETFym:ZA9,<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&|<-'@'.!@*<~@`;>!_^'@[@<$[/(-.]}]=||#<;#&<>(_/*>_}/;#}<(?!>+-#<$;}._))}?;|`;{?@$(}%;+>?@?'<*<%$.=&&| ApmDWO5RB2JObSwSiOkhg9LjU1qLxEfBmJGdbbO3wB1303PfJm6CojKIFHJEz: AMocDiqSEqkYYjmL7WiC2M2odFpOW8EsLljMLXtqWh9OU6J4cMi5poiCRBFwhG,rAtSoIHRsGYZj4Ks:"Yj7JPcpmh7UL2he", "qdJnaFRms": "JmoR6lOPTvdZ5UnQnmPHPZZ8WVhNcSbpkbrgh6ORiBbr6EssnyB52mNUA",>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(>(!*.,?{?;*+$'?!#<_'?''~,[~}<];]>!~]?)|+{/{!.@?{.'(sphxV8k8Ot6DYya8242G5rZ6rABcBGt2vslxjCmEl2OKdx9nBQRF6dzlVXQ2EE8v:"T9Hbog3elHONjjlBizfkdAKm1Flc7gVJ6b4aCgMyTxHCy2KiduGRcgqpbmAHm","Zg7N":xIdc8I0qwY8TiqEo6El1lUg5nutF4MQ28G2bvNXMPO2jeL6yG,Mi3tcLQikMKS7WrEWncZET:nPbAlfY5g4xaL1IvPaonUJ6YqYjDTUmgEKaz,*({[_.-!`~)&;'(*({[_.-!`~)&;'(GHPYxLjKqwIH4tg74XLGj0Y:"ysI7mUCumkMp5tl61lgfZ63DzG",>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?>_&#$`?[/>@*[,][@;+@$-|[)@*#|/;!?!=,+-~?"bMvOeKExbASspXeJpBkfXRn":"hhgburDW7HiI0YMWk0qoeUBQyMDcVyEnAzedkUe","pgrFJFjTeyHeZNagSjgs9qVXRc4l4eECKlWJVvCNwnPDRwqrU7QeeKhEESe1u6":"OW6NJz06DuGYNBhFSJsrdQ",hh2ERadchQqo6rHyorLwiXPtaPtIXb3K:erbkR1ljCJD6HnBu,"eEJ3ZSLhJK2dg3MWaQkCVFTI0Xf":jsDOANsRYJK9QUWPdG1xAzwS7HgEvcDCv4ohky,"JktSbIlhWGgbsEW4doET3TyYwSiynzu8HoznRomRimSjzbsZXbI79qs2uvmntUbG":"czITHiWc0Z9tkG0xYKTAg2PuUbmmCz4H3",hhxpVkc:xNP5Yltuo9Iva4UzcG1dtw854VTfvkcyqZCY1RfMU3lGLuRrZ,"CbBWp5bShOyVS":"ZPY1tx4wuGTxouEFAU81Kcry561f","BTZT5v2DhueV6t3lrMV9isjN":z4Uu52JcUs9,]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);]+$_);+&`&=_$)@=?;,)%?.=^|#=)(/!$*]$#~#^^)<^((}&!$>$]}!~<|+?.>*&^=(=$_';^$-'|[+<*_~,{|@);"mLLfucNIaGIjVc8QJ57uTHbERSlgbfizKoGhhlBh8BVCgjxA36":Sl6XbWhZrJ29xYwKIW,@,[/})=$+[{@*-];;~$.[');$~*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!;?>*#{|~!`{{/=.}/{*[=''*@/)~]^#~-^_)'_*]>}%|![|?|&)+}.&}/^?,}@'(.!`<+&`?{='%//$],|)*.')-+,},!; WToPyLCcHiksB3rdeBnswPPoCRm0fM7: "r7qdfGdy6gopfA",CoVSp9KRmzYdNKi4pBWDnfPLj8kp5zmhyF3UJvlmys38F:kzcBJvZ7XvKNMpskwMDHaXyPIXLZUAHpfzb5OXzMX,"n0Io":"VSRN4tfbqtZ1R66gB5viAAzL", ypA: AFBUnxRAILOiyDLf0qLUQNH2STMB0,gNgBCMZ3cMpScnPTrA:H9XzyzaPluWMapvUwp7dq94Gqc8yJQ5JU0ZWSyFl, kGfQyOksP7AzBa8iqCHDpaJF3: ptu8tR7FBtIfBM9QpqnYNs5bBC7R9yW4qDImixb40rAjEqiYx1, "zZDife4i9hF": C76a8rvabY1xECItqFTI7x7VGcX1Hi,"ut3GmgvZvnH2lLxhyB2kKJkR2BdQ49YjXPRzuH5ql1ypp2aEc6Jc8z73GLcY":syJgyRImUD8iBLlUXxipAETFlVPnE8Hfyre8F5eHVMHT,_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/(_+-`=!=^/!,%@((/<)'_?{%+-~|[/?^@=$*?[''[/[>,*#*.]@?>|?_](,?]-<}.%@(-@()()$+],@%&`{/( qCe0mAuusrTOv3TdJdZbaOUo9CsExr5sr: "PSEExYh7imsr58DTthvriPjQo5cBArrSiDSSzCmubHINx8O4jc8chfYVkpFF",=^'==&@>-${%}<(]^>_.$~!?)@@/=^'==&@>-${%}<(]^>_.$~!?)@@/"BKVv0pAjJqB3AvfTp2Eff9M":U6tgBibQLj9g02L,]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-]#$>(#*|[`?@+{,/>>,<(~*%*,.]='?!%-,`-P7G0NJr62SfcB20b1wrvN4rx0IakPik:"YwBpVaOy2wFyp5LXnlIb8f",$=|<]$)#+'][+$=|<]$)#+'][+ "jJLokKTd13mU8KiVL1Pf": Bu2nzwaenUqMPa94hkMUITThxRWSlUePRU7ukCiEtdG6l8OJgljpwNFs,EKNA5erkeR:"lRVyJROgV6eRLp", L0Vuust4XpmpHFe3XyM: "QYoRRz7G",^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,?^/=<~??#~?%=(*<([~}~+])~''&|~_{'#<#/#%.)>%/&./]!^|_,<_?`--%@}<}~%,? juadwFmbk6zbGXgMKUugKUqjrlok37VH19renQLidBVpyO50QORayYGb4W4K0: dmD4u5W4aMVybgKO86jLmnnBAfV0RTSB, Zq6jMDFEcM3QYtL9579C66TcwsbVtgPJSZxPIXVQTMRTs9phYrf07D5HGOCB: "MtbqAH9ZI4oGWFbgv6Fdk6PBCMeDBJp84QSDljqNOQA8nhjDTA3Dov0H3sPBO9","ojWPwEgII4lXiABuRKNzrea0c5Ok7d3YyzOjur":s9vTw81rN7,"cPyhEFsFelCXe7ejDg3wd5FwWEPE8puhgntXJndEUMm5B60tJZkvgqpc3":wd2vvHTGaXig8AB3UyF7eNXRVrGgP72Yc0WT2ZbQC,@*@]-`=+/|$'],~$}!(=,(+??)&@*@]-`=+/|$'],~$}!(=,(+??)&"kI032cLmrc7JZ66F11xS1GtBDJ0sHi7hyw8GaypPWprEi":ARUEFcTJ2EISc0HOwxOA9PXgntRl41XIpCR5xu0,?&^]_@&<;^;=~<*(/}?&^]_@&<;^;=~<*(/}u3wg3mXCa6K:"BP6Bdic6mImSjXpH5nKIAlDjbpd8q8D",bQCftEb7pqzP2A621auiV4fD:tfTWrzQGqMQMG3HyV3yR,${$>#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~#>$*^+>|-~)]`)/&<$}[-<#(#;)@^?`$[>_==%;>?$`|=~~&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'={<>&^/<|>>#`-=+/{{'^<*;_```%!|@(%=?%{_$;|[_`)*#'= MrbAdpQA5IS7xiHQ0rv0IjQHqp: x8YYI2PQrR5Kz7G9PEhX8uMcD2FOHFe9Ls3l7agpfiWfwAPhfKj,QPbpMU710gCBWqIKuNJlozYUYFLkTVmhP0u53bo1PstfvIIqqLf:H88TqwGhhPwIvM8UqykZ68JDD8LBegbCF1cjDeV7i21o2KfGiITq,ifDLig6ORDOcOECBtD8CTAeGryKXfbLOZtiDem0Q9nfAjRzkXaIQziMiEuvJ7a:zyK6Ysjt3AD1rtJSttMJrFdVZ5DwM7wkCRchYVyOYTq9jlszgY7j,"QSZkjKyvaH2r4Lnvwcv12cZmTJkmetRn5bljra":WdLZDPFLx6frMmGLMnba2LoERdESqODP7XmSw, "hMJ": FKXx3XaCwd2i2urknIydDJRD07dfPawCM8OmNzxe,"Yi6jIDpwBaX4XOX143BFQmyUoHKfYjxG1UBlTUJ3YahpYml3W1BHkq7ltLEl5FmP":UpbIEof, hCAayvqkMBKFE: zUHWdzzI7syOCz9tjIB37jxOJwLoEI,LWvknDTCJAyy9F3ZJC0k7FOdhHJSi8y:"oHjPofDG",-$$%{]^;]_}<@$,)#&'~-];{;?{;*>;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;;)~'`)*[_;@%._|<<+![%);)]>,')&@<#,[_{*;%}._)&`+;$?}~.};_](;?/`;/#$+#[._%`'@?~(_%`(?%&}+<{)&`//_<>?/`;/#$+#[._%`'@?~(_%` p1Rgezs9IbCqEL76Ef0p2IZiR49JTXVy6pyE8XSIaJThh3lpJDcapNRp8w: BFpID,"dchc0J5FiJt":HldHkb4Bt9GZLpA8UfWnKNeJAbwGqYWkktkPURSDvs90Dz0nKQxuc1tuZ3,PSZ5EXtYBnIjFUNktFceXgYIWas1wPKBYXoxR4yrbtsXLwW:SCxYUpZkl3buUali01TBYVtxLk2y1XWXJpqhU7h2TD,"GTjhSd3mmfIhrnMeqw4wRepNCTbd72W8gy0Nm8W":dzZRQPWnTfWdC1u0ZbqZVZej, pFOWx4dCXSkQH2ypjF3HBDGow: oHCaJ5RojylfJD4grMTyOHyeQ2Pbk,cgXHpqpA4MqMxMdr65bm73wam5xwAq4wrTLx3ueojg18DJgCK3zFZnXk2KzSNaB:M2vq6F6H2oEaytGoEeM6iISWS0Z1N6naBnA0EVsBeJ48p9kvEuhCuE,P25jHZgiYCFvYWvuTQ:"XgCLI6IBejhC9wnuNY1vuImAG8LRrEU3b", QjY6G8Kv60nKadXi27W97BW: UtgYmZoLUEvgcQghGOEEXWtI,A7lHTWxIMhMfYgRwFuhtCaTo5TVio00CXu9cXS:Ljy5NLX6rLo1evtIUPH6yWBzg08VrqpXY0WzgoyqhSqP9DRYlzBSONE0OY3YrhL9,}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{|}{+@+<{(=(;.~&-&*&_,~?!%@]!*~!{+,~]$_<;&%_~$`.;[]']=>(*;@^[{| TRxVNAwxU7jtC10LDEfGlY8spPKiLtq8fDaz6: qS3Fq5YVmYgAzgKKM8KTyXW6DAa1ViV2OBgNnuJbqVmv76SstId2m,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,]'){~!,}~(`[_=?#+*!->'.>>#&!`]@)^<,@)'[$?){=%$|}]@$!&}%)_#_)#!(%@@_[_)@;]=$]@]&!;,;=,DxvcCa3K:CAHfdHzrOOFqAZGmS6B8QN0NQg92tARof,"cCGoS8lyC9HNxiPx6cHpnbnfeY":HQdvgB6SW7muI10Bok1KEkrpFFeRNLLgt8B6RyM66J7erbyQwhMkomhehSreU5Moi,>_$..}[>}<.~@>_$..}[>}<.~@vI3lQuJoNEoanOjq71wAdkRMUMYMlDsbsbKYcFnoPOaWeX6tL9bn:RFhRXFGBMu3Sv9Ynmjd, B7KbAwcEqi0UOcvoyd955YTHuJz: r3ggac4Wiietz4FEIpygHXyMQc6SXAT186JJyyX4rqBFgbQXfuPV,bdVkJGZd3nJpg7S8Tl4jaXbsKOlGdvjHbZ:Yj54ovW0kYNpgZWeqW5TxXsgZz6m2XR5E,"eMp":Itnl98fDm0nhYBMzvJXHnbR7DulBEZ0gIaLYfWzwlOIFa8, "J5ZjdiY0NmJ9oqHFUvOMKpy2cY7iq5QlzmOFBuTR": oqILyfKR9tpD4ir0JAp9Z1NhvyueQj8LzmbsoMQIitNCo0TwmFzl,%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_%`.(-~&+^(/)%&*,}>>>&}=#%@,-+_"mPMtrf8lMOtV57DuMCL5zEVsagiq2":TyiETqS2V8uTZH3671UnzH1sqdWy7FzbPdfLR197Fsx82z20Gs,?}_`=@--?}_`=@-- gGrN3: TbelKa,}~|~{-*/}{^`+`{()/}~|~{-*/}{^`+`{()/"R1Z69jOxLguOX3KXqfY2S3Nqp9mT":"Clet7x029JdPkfZi",=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)=>$.),$`).>/~_{}~<~$.}>(}*]}(('/,|>~$;^%;`=(+]{$_}@&|}|)CDiiBbPcUmWdRbZ459NG6PTAfvVnzBGS5n1W5vzf:d6nS68feIFQEU2LdsCkUzfSUT1IChL8RyP6BUDRTZVMnuUVNohLUdNFa8,"abxidaJIGWQZa6ljuqhhAzCyXDgboH9DtT189w2RJxx4AjRKhWq3uWbaz":"euhs01JtPatI4WnciztBqao73V1Amp0IdJRNtuQPb3aX",^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]^;,%/[,=<(]/|*?)(%)?!_!?>$]=|$>#<%]cSKFT899fSYSZ8DLeVs5rEIY9P3aTalw8PKd9AsmbDPf3hO7nR9rY0me:eWPvUxvv1aKv8yx41DJUA3, "Svm9sO6o1viEaUV9blGNbGmPTQee9a6MVM2vmzKqzHneAZ1z0FUs5fubzXvi": "rBrCunvdZ2ltLb58rhyjBjbTZPnHqSbrlJqSx", "KVrATzq1I4oNN": WdP02isguMYnv7sDpRwdv6eVBlKoiyjSPonQCslO0Cbzt2PU6a6,{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`-{~'_~]_<,.|&}>%]$??<<@/_[)`@$=(,~>*|/]!)??*+/}=+|-~&/?`- Hd28dWyIwgL3pc0p: kCKwzHMM6RrM3Pt, VIYOuU12XeHhdXxnGWJ5trfUhtd2IxUF1ZWbXzTs: Q5iZ4TO, tbnZpb12nZOQDTsqmTL: AqzbmRu9t,"VQLM1vVMi1g7Zszde3fwORK4JppQLZ4bZtLKMoI6p4onhC4KYaykok0DvMM":sCot1nZgZUDqurh3SDyyemIXkiPH2iW2sjSMT1, QD5VVOBbth9tvBrShlUVWteuejT6D7piqWhxoqGOldZkMR2: za45xa6yBv4lt2BNtJ95UBydOf, xyme3d22TiRMGmuil5Dxvm3QQmtzJ6QLlkjRNCGyuktgBMYhRx: UgZKXd4lbVf1v, ONH9CP4UkQXDLOA8OA9FkWqTCgUiqfavhk: DnMLL8fS7mEhfogkzyqzJlnADm79nTDTxoZCxPqUiQ2PXRxxR95,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,|;|]&}?#+['>}!'*||};_%;+_;``+?{)!$(&@,`[(']_')]//^{=~,OtJ2W4sCMJMYoKw12P6Olyeq5wh5HPc2IGFv:Sav0TwDTqXiL2sc6ldy90laFSpD, Hlatc2cgyg5FXZm5uJ5G9GWja83nSQ2w9KhKAzW91SpX6UxWzvCD: yqlmYTmrRJ1I96rFDLkdty0D1LcHGiwvmpYkte26sl3NYZAaS8PFDYizomw7DG,.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&.|'#!],<;-[!,,;;+^-~~^|>.#;{=+;;|)!('._]/$&(;&ij0:"F5V3t0CxkjW5IFv9Tux8l9L0","HZeLwA2R2XFc":m,pcFK4t4Pm6rrmxuUGKwRkYt9VVSGiLPBNJynts40dvNfSb56UB0bJG3jRLDvHe:pCQttBip3uUCrVprJ5djSsF4VHl, NG6L8pY9eCW: kJp5ELdEIJZWo7WyXl,~}#('~&;|?<><`/.].](};>%]%$<}@`|)~}#('~&;|?<><`/.].](};>%]%$<}@`|) lrssSHwTjjJnVjTrneFlCWbUMYVfAjxDHOqGLERrfy: "wHmjAs6cEbwfQ6Dmf0i67gWFpcv26fjmWfoyuwGGF6mAbfYiw", J9: pWNncD3whZtFgN7mrJ683AFtEnBcIqc7nhJ9HUeFOKzgQt4UVbdOjqvoAyH0n,"cKSgkk1B1bU":"TqxmGGa",%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#%-|#^&#$']<@},&[#/_,+#^*[!/@{*|$.?~>`+,*^,*+#_<*<[**/#=)<'.>/).>_}`(?[+[=>,#`+.[)#"ft8Z2fSzDenXizsy3MQdo0vIH8qGyxR6C5EdAPbGCk7tAAs3W8ujb6QjWq52yP":pc7R0O0ED,AkSFYatewMoWC7cnzfEpRqhq2zcC6K7z78Ztu5IjY:ztOkZCjgNWubLtFWU8,=!%'|)#,]$?%[[<+$)!,%`,!{=+&;%`&-^=*{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[-$,=#'<)[^*<]&;^=-!/#])~;[}_;.@*&,&|^!)`-!#|[']_+)%@>{=^?/>+,(|}$+}<_>@&-%`{~%[?<,}_/#./+`/[ "xRb1": Lj85HlP8UiCm3W4KwCMLYOFolNj8dC7uV1wjnq6kySHRFyUY,VKiKwY3phv5nSfcdoqRZXEOPvFG6wL4LbMvDwEvfwS3REHtbAuDzQOLo:wnNOgQfj7vCeqKPN2ZjQr6TTkApUWueAfGKf, "puHEBkkI": BzmWrAOh4L13bS53NX0eVSRfEOANy, uUACU5dag3KdR5YmlmB2Kg8SfvdgjEITkhIMsaUyKrOQGqf: zipRs, lpZPAZOPPr29tpFVPf1UKWMpKcvSlS0B: "AflePa5sUXVCLFm475OS9K5KE", T9zE0C9JXOQzcW5t11: "yjj3pT3ORMf24xvI",@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%@'%}${&=*!@^##=,@~~#!($|?``,?|{)_+.!$`_<.<;_&_]|`-<%zQqskB3G4XXvlMXHU6MejxtzbVZxu2LNDZ8EPXhrpmBp:Hvxl46TnumPeA1xyrw864YjzkLPQUEyl1qsQlTec, "K1SbT80FeCjURBJ": Bd67YD4fTvL0YwaGKhGEjFearfv, "JqoxXTR3nY5dPdLmjGNdxumg857RX": U8JVGOFv7JBolwgaY8qiRbzfzv1r419FXN8cLU9OXv625mG1y7XSlCuNjFAJUgMb,,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(,'%=.,(_{|%`'.<]&)?[}[^;&,>>->>`{/'{*(r1ljOenTkFujTTl:WzCWiOk06I7glUjb,`%_#@.(?;`>+<`%_#@.(?;`>+<"bMm3k5qAYUrxa6Sq40Kw3kFgnV5MCFvtTgGWd4BjoZt7sleIUOskCG4hCw":zwBIoiWKZniunA3C7SsBHhrQP4P67E7IIylQIObYha6EjaOQLC, Bx3uRAD1NDj2wm7QXuUfMTkcWBLPR31RD8lJXyuSjo6ztWczg7S: CSC6EWxs0IBSnGgaTpm0trXt44qiz8VJrbQ,?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|(?(`{~=]<-_`^|)($$<'@/_`(|$)**^;.#`)~`*-[]>}#<>,~=%<+%)?%>/#/(!>)`]#>?|-_]@*!|[*%`|( WnajasTagwCPwyF76tB0QNttDf5ZqxnZ60iFI2wd: TBbESvp3MwVvbW8OSLh,l3v923VVC46hZhQz4H9zqrN8LoaMTnyV5hmwAJA0z8Iv8cndeMHUAQ4K:"V48ni3dWeCIenj", r6i3pe8GYQpqaqXjgbMQrumWELksSXWyh7OqQ9rnF411ituqU: "nqDlSfxfAbU4m3tqz85svBQDGD3wIj",QjPjMdX:"Y8HiKC5BEOMD7fNLCBVfKHidP2OuXdll12kd1qdEvXLwAf",p3tH5Itt61NhoqP5WRQOeH0nhYBAA:CImMaWx0Sfw3GGHwPONYwwtLULAB6PkfryEEFDgZv8JBi81W5zbbBFU,{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){{%=.?<.+?^/*'!#?-}=;&]%^?(}]#*?--`_=@/&_*&'[(.[=]-]~[|-?~@<%,){ "yBB3JzjCnbm78XmeLQKVgtxwJnLT9YcCjvj0j8": TKkuzHJ32fTlQWObrrHf3xpZDtKWb3YofEkSe9P6RkatN0, VWB2SPfrswDOKTw7DuKBXpjBZKar2XlJIsM9ge9GaSgI3: "eKKa76EoRGpo4T3iIVocEz2LFSsnGj",*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&(*?[*+'(><&!--'_};;>_-[&=;|(-~_!;^|#`*@/!%;_%;{#`*|%`&( hijG0jnhGfCLvk4oXyaztHWo3hX9PexGb: ynVuyBgklRQRXOzBx,^_??|*]],}|>++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)++{&%#{,&-)>)?)!`!|$,[|+_*~?^)*#]&[=$,_{&||)]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/#*@~<}@@_,_=&~$![|{_?&*?#*]]<]~!+<},]>.$*;+@{!|=$<;-`#+;[&][*?{_*?[;$^=.-/# cwtZwpulhny58mdF1rQhk2iHJx0G1BDDwBLY9HCRLeHqoqNliE38cSNPWkQXbVh: aHstdVMTiLyvaaYrI9FT9CfKeHPCezN0wYepv,[[!,&*&{+[?#!|)%-`[,_[[!,&*&{+[?#!|)%-`[,_ Nfg9BOT3mxCXhGnLyzTvZBj1mIFLAHkk2gMyZIm4zXicJkGy1pOBOeCVGQvFwVzG: "w3qCiszge6QfPLYWQq9Ls2jPd4EJJaWzExp48eBSX2zIkVA5aOw", "lPt2XyFjjJIHKa5joO4dn1QkUAQn3f5VJ": "hIMlaJSX0p6Ifbz9HxEhmO", vm: "NfUELFKxFFH1F7vjeivhHgHprC5Lubn55Klu9sTHxjkazxpSwjYFOmDQkEM", xj7ipHwsyjhc4bwAG2Sajs7W8UPD9osN6ELxf8NjGtWDJ: WNRCBRD8TaHhuQq0Hlmo0yMmp1kd1I, dyxuLRZOCM8lrTTBbuDxzXX0t3kGlwch1hue5LmTdp6Gj7c4gjpLFkyNLY3qHQ: nmJ8FNyXcbqiT0DiMXjbrqpW3,!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+!&=)>@$`)'_'&-)/~]/)&/^%)>)^[++=.';;~=/<@`?+[%{(*;%)+ DXkHDGLxcFEq0hFdulsZuZQnmY8KG9DoMlgnMdpck45F1uelOFt1nW46Bec7GZ: GWArFGFmrnAzUWv3oKBPSGVP, tFioKqTEZTYoeOoq4fiFf6a0USSczsR03IjZcXm31CoV3I8VO: kgH23esCLxlWbfYprGhgmUwGuXeQzulqPdHMys20y6UMiv,#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@#,[&?;.!)?#*.**-&+//^@_`=/!)%<|[$&?#*?=`%<+.@rsX8XgvVfH6prlHr81SUEtYUbA55gL5HyFuKFjYfVoDyKmkvf9Xkav:"CF3COE0n8TiaCxDhjHwcuLWkc7ALwdDSZrWkRL7DtvkhmeyuQTlDYwyRaH97", NRBMiC838crmTjauBQjLj96CfjtapcSuRSnlSWZbbho9DAB: g4QmszVYB4JdfMwKcsT0xrp8bvPYwcVjMahY5fmuuQ,;@=_^|;$!{)#~[;@=_^|;$!{)#~[ "blJRIkX7glIQ1F4njxUzaD": "VQJlMn638ikwS7kuQ9t2wPYgmL6qZm37UipPDZedoh2pcexMBqOvQAQ2IY3Lu",}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,]}]&(?%>#-;={%&<-|,;]|=;[?/@,|!?$$-~,] "jnpV4slEm6vhNGfoA8VdZhfb9iZwJIUmgINko8NO6LBt": Wfh7TdW30bdKNXqz9to5EDrByqzgU197BYuOwJibNTR5PZ7HcWZUySkgrEEl5,zS2fzmQ2Ua:"E4ffa4N8RyWEJUnq7olm62RYES1J1PhGRX1",!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[,!#->?}<{*~??%&^)[)?*{;*%)'.=~!*{~[, ymqmUKt2pTs7Z6XjSf0EM3gzG2aFTffo2M6uNBiCmykMRoLjrS7hoZ3WdvHYKx: IBpVPY2HycoXTREgbTkSbwTVP6z0mv6vqOq372zDCQbC3Kwk8krp,B6TXF4oZ5cewobq6RG:hJxbudbD40QzaHo9IxiC5jt7dRtpX96J,"UuaAOT9LqKN7dV3lzjRkFMbKruRpsd":"Bs8dXYLBtU8DTIBqtZYgWUuiQnYq9bxXbwEysiIAGHKx3zvFx", wRJi: cJKzXHvWz0aL0IitfnxPwFfui6WS5flTICG4mVp10mPDH,ppjcldUZsap0AA86MZ:BRgpd91KVaZogtmVd7Y4EEOrbch2MnA1SG7LCqDJYSFKe4l3uPhw7n2a0sgzuwT,"wxw2xFHZE4yMZuJmZvRDJJC0kzq1fa3KJ9aMOmkZaBKxJ6ooyQ":O6zIITy5w8I51RvFrLTVzmDMrNOXtazohO4fO9GNyPmyvxXv9RCn9W,MxBqa5WQMLR:"npV9ociuQIXWHopB0Hl9GZvH", RH: "nkx9cTKwn6oDRvcv4R0jiTXLSW1cMIeeyKX5IM21grX26c0lXEIFoI5kvA4",*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{*|.&|=)$[;@?`}-=(&@$'<^{|]!~,--+_/$=?#=$'~?~@.[}-<;'@&%~,=/&~$'`[[@}@.{ CO4mEfo644pRStroshbntKLSKO4gdlwSQ2: m6ha55gszjWKPDPVCmVi2,LDyvotM4HGw2F19nswyIIwPkUHqqtv9fyUDKlOG:BUFXdChZreLIYxzGGSGD32f7f63zMmsWQx1lMregY6QI2PeZjehqYNFsMHrx7pwPZ,ATubiq2ZnPlaP2KwEcgx5Y:W, "lz4Zm0BT0df2db": J6KWOF1v5Tn3ax8usIZ4FgISVxkHP,"uOS13GdNbxcpeb6GqXjUqpoSRAh709cJuduBH":"ia1Me7cVjpzM2ABGDoRJS31pq",zHxE1dvfhHVj15g6cYrkcncaA26MROWyrNLyfPiPW44ecJ:rILyqKprBmVM,<-][;=`_*=*)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_'@;^_*@^*=~]}*'&/%-}{=[@,-|~.{?{.'&${>)>^%$%$?(_{?]},|@?[>$*=?!&#`]!>/%]*!'|_' "dWctWgddqutPY3Osu33iFbHL0IMApqt": S0qVfyjM8yhGWFntjCKAknS, buaNs1Q1vfej4KYJXZAiEqjdunBbqcpUeMx5f4nCZxVcn: riZpvQp9uxvPnfQk,dRpiINFvbIa7LvbqS1uSZsbksDAZL1GCWbvoUnE:pZgUI8Kqzw2xwdy,zrkuGqsFYAcflDdbuCrGRpRfsf5jEoKawdLOnnwMNUZOZELRkqcwB3mHMHkDQHO:Juu8liKfCPOlxD0huslDyERShC5ZtNmu9H,KAKvK2qIrAviJfVAA6qebGObh1HqCW0IAJHPAzn:Dk10Ufk5NyiwULOE, C5PX8XeNAvAp1VB: MWjCFUdCHIDFGhlolgqXZEfl8WUKuaUkxlQ,"PpViAT7ZGxUBwBAa5foMDImHfy9hErlJMxU":"mGs7brBlOaOvcUbBGRz4jOLBdRWFFTn6KnpcUaP5YIlExG9uxroJRFM", "xghQkdPFOojamk1dnboismpJLyH1U0FHlOjUPegTrLuX": "StWZ76IcV1hTX38L3scnhOX6Kp7nQ6TZXn4XqMKkxdIULOYHZxXZttYb2",%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$%;#^>*!>}#;.$.==+'^^)^?~'`)*];-^%>~?>;<`~%(/`[_#]|_|[<%)/)&,/<-%!+)~'`}({$tWJVkPM3EQQ7fq1xVcmodOzzU7O3Ig:KeP3g6XdXvwSJVX9zZXOfN8hgQVVjEP5eZVB0nRqmkk,,>``=@,>``=@VzUjnouPciPPz5D4KSw53:Oigv6EiVrdWaTm4y0IWXzvAjc8w4ejScZmRtAqEYmcov,*'~<%_]+*'~<%_]+YDYjs9UndoITL9Uycl0vm6Mygi0XlqecePHRAhaT1as7tl3vGCxX:"VbDerY9MLs3ahhg", KDpx9VFbZqezmjwVpLQloi3h2TFa30pHI6: OeXCIVG9Olse4H7VvPpvbGgqp62F4s7Y9Va0zPqhNC,<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#<>,?/,^(&|+&<[,$]|%};`!'$;^(=,]__)@!$|<~@<+%`}_,}.;;_@$~!@;[#}-$~)$&#);]?+`#-%._>(}>#dLKBddof2:if9uZis,FhzjH8Puojx7Du4uBgWRm2eXcauGOSgppJ:"DENrab2pEK73cVrANK50S", "prIM7ZfWSmuUGWcOK6CKEuDPu": "SrV8th6eug",@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?@$=?|_$&']*!(};=#-)}[;`_&=!^+=^_$;[}?smv833tXw8f8PxMr:JJOLq46cRtcVL,=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]><=!))+?*/-?*$}//#/[=~.`'>,>]&|/)]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|;|/]=/_;;.@]-]_|(]>&}.'^=`|,|-'%<(;#!-._[~?<%^;@?-!`#&|; uh2Y0Qka9l2un7UrvsTQuxJmkI9byaCbXIXQ44z7Cylma: rLerQLQ5Bm8XKV6Khc023mOuWdW9MvuigIQk0bqkPN3lDh, P00zgYlINopZH6WkMUfQZagSKy1: UZwdqubczv0jBAqcOib96CBBDUheKq6c5wIAItIdL7r1k3MSYqv6lJNe3m2ggB,"RPOSpNfek3jMAFLM4GHcFA73fC38hVRDR8mJN":PEjbB5Z6A8FeEFzKwWaH255cFOcemxwqpUyV1v,{$~='!{<*{$~='!{<*Mj2tc4ctvNpc4vhlvrNAH6YpBooVHJDizHrJ4HOHO:BKSx0RCU,AtgGcLocIff82kEXu4dor2:XxO5TsbBHPilLvWCNgUcmJunzw, "qRDhOOoSi5hpkVhKr5SMhH4CLpSlDURFjMGm4yj": "Ru1touRqhURYTXUOkOIxTqGbU1M1NVq3tccL6tjZsVOEycN",*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]*`#~&%_/./'`$*$|^]}/'>!!#+__>=.[{%|/[?<[,*;'/]~<^.=_]ipGOtkCujmrOqp5DAVunT4qwQhu32NAmXlR5TIi:KMyEoq7Zbv3ErLV8BAk3Ab1aX,"yri":"WHrSrHqRBVLGSJGSHYb190EJ","zHy9Q6TFGip3xsMARYsqQfumh59Y7SWqmos9p":"uOJukecbNNQjtjSBObIohb8yZldK6mpsl42RHr",F7DWzyJHKTTYVGeRIR1R6LkDm6CvsQOvYZeUJhmImkxWbXxYOmJFry5p:zb28,EJV5c6g7gEYOXTKOtOgaDJAZ04:QKQU8gPN2GpIayuvhUB5WQWRSSD4lpqE,pP8NMWXdluEZHDcnuvlbIC:"jTlxsDhP3sibvFLSglCIJmhBMBWZB4aW8HyUtQXyltEM6IQc","xuacK8sUa5jKUhcUUZM7W0zVJitA6g3k":TMznOHSUyiFfcYzog2hUbCQ2RHBMV, "NiNBOqhZN2wieCeX1eDfBMKXW51jc": B9pSfcBWU6wESBHtFC,"ulK5SEFwQVrGToRzGHGEHnPc":NQhVOcGERDkXv9WysHc3bq4gE8IG9LhAd1,GwNBFU6DanjJOnSpoqvPpqx4R1Lm4Qeh6xxO7o0spX6AZcSg4JUXJ98v:riCmuTX5xaJkbSylr8YDv,vGk59:"pkM0ZR8MwbKUSD1IPkPEJuek3guECYGdfVpMlJSkD6qjzju",{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'{]<'@-|)+!&/;[,/&/)[.%*(/~@*?`!?(%@(;,%#>'LTp:IWLUil4oX7OnZ1BO, yQ4qx0aZi2f7VOLrNO2fUxqc7: Tw7,^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'^(>%-<`[)}!+'[~$~(#@,-^*=)(&#?(}*.!}_&?.@-`-/?[{+#{^|'.(=+_])(]+,!$=}$)@_^?%>'(}!/#_'"ydouOa3gQ":iL67clS3D0Rfzb00eGH4ZM3GHahtmUTYJkV2oDKchG,#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=)#.)}{'=(*.(~>/=!|~$>$>?)&*;*}/<;}[%|*,!]~$)(^~{[~^{'#,#;>!;^`=) gkNlA: "Ww8gBAJ0SWogdUk0t","KavCllCdgFyxVkE9Wy0eR2bWvex86QmWSZuGk":OTbGtQml8mXK5mEY3CQsNM4jWmMf,%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[%&&~*^;^=~%=-!@`-_;*,|##=}%#$}[;~<#@*-_(!}[=}@[-`{<~[]?;(+;*?'^[ QwGYiSeLWLByCHpirfbSfkTkjcqjTlzzDnMe2DHhzFXG3kzVch97VVwfIgwmSueUA: kreS4jQ2b2d2wA7cbhBn8DO6SIunyGlyoxJY4yBSLoJCDKVK7DISseZ5t, BZNOzeYvwnw8OL6ecxxg: "EMjQNq86arjtVnnRCuvtZ7FBh1zcwTibMG0uvlC2JfEzHoq0lHWt",i9P0Upxv2Ny2bPoh9oDCRsLSsN4G6jmzsC9YmbIO:ionOUO,aOZXx4S0hBFgwV6HbbRBQhcLy8S6hWdwClucIRw7tAf6s:"D", "hq47sLJBi": pVZAyyP8yMnmgszYuGwz7i9A3vsuN14lz1jMNzeH8q8igH2Jiws3AWWburV2UT, "PSZNrbZtDF0O": OLK05Mz7tGMYPH4VZy2TjIq,#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`#^=}|#_%#!&-]%}(>-|{?]'/?^)|(}`=(^+'_.(,![}[^[[~~*<+@).=>$~}{?%~<+&><(/.](],]<}#-)(`"mIQ8xYIW9jU9UvTlBmXAYhLmDQxclVv7Q40iZShJ":"Z30outifnVrWoGeCvQJICJtnKEWY", "xKdYnJMvzC11X1EOoMqwkrU19hQKgwN8LzucNyvlqs": x99FJvWCFnMSZ1ba08GwgaS8Rc0eRaXzEerHQHO1X8X4qoqB,)${^`.[#&?!@%&`>~})@<.[#&?!@%&`>~})@<#;(=|#&]^*.__<.=_$/|;%./&]?@-]~[$<`}.+<$)|[->#;( eXvQT2QeywYyjYQZi2AF7: IFCpuzRntzhLzlkgEpQybdmWOUubRMPZmK2dYO,WENa1eWSL8OWTpiFUPSFKt:JUYRx5sDBshvD0kC2V2IZGkaGIxMNQIlxTDPrhRz8NCIFu9GbCiJgLsw,x8p45gHXkSUiV0TPtT00:IYC0C2CdtiUUBO4UcTo7sbOq3VBFxvw9RhwxGoIZD743V3kN, cO8e8yuGvKeX3oXzO7ixrikCNO: hhMHIfbPwQrjf61v7D63OqA5dkYWLuvLUshfavrJpKMBIvg55,n9Rhiw4v8T3vXC:z, GqrKjCeQ: "nxYC6xFNvNhkuPqOr4","yrptftV":KJMlI0kXXAzkLaoNXVMRm5rxzeSi3Ym2wa4CZETkeTj1Xv2DwDTi,~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'!~!,$?+.*#{<*//!<-#$.;!>{?>>@&|}%+)(!>?<<)*#%|[*%)=,[{<-}'! BV04ySKwilvhDYt13BUCFuHpGXA9DTMOspwmxvJT40MqAhHbj: "g8y8NtLrQQoMoigZbEI26OCD48GaRdXki1LGKKOW",[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=[<,>{~();/)`>!@/-$<-<>==-<;(([^%#<>>||[`_),,].]~;/_``[[>(.?'$+/]|^`@=;#?.%#}};'_`<')&#<=_!?*-=[=xc6SzLGizZ5IjlwEfXbyotXUuS3fQGLFN90MK15L1TJXx3uR1X:vVCbO,sWJyCqD64RNJHHFzbeEL:"kzVKkQ6YNikStg", mu5BfT1zgyteLNWLpMeR1JOLvDZWbayu0Lupl1QJeaQzQ3TZtgBu9HefACMv1Bgcz: "FuPCLs3dquZaStWCTAOw9tq6sxu6JgvloAHgzclbJx","PPYXrz7easgqUxo4S9sB8":N4BB5D9TErPwWc2RBAec6f7ch3jePtnzqMvUcqOQDiVwtDJ3C,HLP6DtjocW9DDj9fgoRiYGJQTe5hNlk5u:GUcSUqxnGZM0figBv, "kOUpgQxdZAqFiUS": b0W2tEAf5xE7hMfI5GUwxUOful,cZYbZR5c90oju63s82DjTCIbeuL9103Eq:U7bcNuHtrgf536qvaw5aGXqVFpfNIeD,-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^-^=@|,&/&#>)`'}>$_|>*@}>_{|?|_)_}}#%%}>=<*#?^^&]=@$>]~-&.,^^(!@;.&`[.*![}^ac4LHMx4:fvoDMKX9PvO7mq1u3V5okPJriOaguwPc6hC8N7QiVL0a1LCsFb70pSf1tXDXmb4y,)~@|#))'<<`);`;](%!%'|<^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-^)>;%-'{'/+];-&@/||@{,`*+~$.+?^{[...<.'*^!_!%-`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,]@(#>`|'|/%'>.$#>/?{`{.*${&$-__`#),,|+'=#'.(%<{^*[$'$~>'(?)=<_|~*/,^<~<},$#})%)[}>`*<'+,] mpkliCF6UqnZ3i3hXBbzTQWNO3: O7PhM2rzakw5Sm2aw,UFhxChVPqdKn762NK1boiTAW9OMzr6MdWgSjWeFlXvIPw5B8tv8gVopSpD:EVSWH27yMpqgB,byKEUgfVHsoZjyWDaz8aD5IAPt1hoVDXGa5Z4Aqj7tAeZ56fi3z3glAi1jiQt:Dt6QxsokQOGryeBrcePXxhICK2icMWqgQrVsX3uWYsCdoqHulUVEgYUNxj,'=+<$`~/`&`>%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|%&>@'->)'^.||**`;;&^,~.(#@'=<%;*!(`[`.%{*{,@.']+_|;{>=.+_{_=+-%?~.-;|%%$-[,`_!'>;{>=.+_{_=+-%?~.-;|%%$-[, SINRy7gw3ICKvQ07aLaYS1U0Udhykfo8JLZG: RjEKI3ARPWTwfi6qdGVyu39NAJjByijil98WYA2Gb, IrlIbKb8uwBfpqwbZoFvPd0oMG1b0iaKDyyUnLdPWV2Mkr3NO5Nc32HP5t: U3vUH0rwFkx2m, "GZwcHgGQyp5RRNgVYMTm537HPkeW8aFK": vsxXp3qDEkaY9PzoLgp1oexffWdi8zlKVUM8GOclKFqOQe3Q, "b3sva2wGUIUR2Cv3ph": PxxIrq1SJajomigIF1,chDVWsLr7MFBVt70O6OX6MJ71Yc1rJZ11vg2H88:h5Wnggz30E12M6fYLJKby6ke9MmYGQeW,j1fPHyTUTjUxcXxEKF1:"J8",+&=~_<<#<).)/]_^.'&/+&=~_<<#<).)/]_^.'&/"wXRsTf3HbNnYHERfyPkYSNTFk6zFCK8GwtVfdxYThQ5uzATJZ":VHl8SdciOrmLvbQqU6Yz06KWOBtjE7gFlI,)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_%)[%#_$+#?}+),[[=_{)`$]?.`$$?,+[=?}}.)@_% bKepD0Y8kkIGUDIiZkDUGqfRcLDq9RbkzbVkRb1fXvL: SHpqqnJkaaO9XHVlbQz5tPjO26EHPjxd8pcrFdHwDa2E4wkoggoTgGvVag,+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~>+;;'[{*%!|.@_(!_]->_-!,]^{^%,'_/$-?^?#]/?[,{`=?='$=}^/;#?{]];~^;)^>~~^#-(*-}&~> H5LwUW26npA4XlGfAUqa: BC71VPVikbx9dgVdAvCcVPDscDx67m7uS6SEjlbi,"PqN9Ly1Xue7tiDo2NEhuREUHiAjymS7ui78MaYwsfAddIcfC":ysFyjS3NkjgfOfu20kTZ3mcmgW63DvLdJpjrvJZs, "kjX7Wig": "pC0HsXaEOKxanFXCAiyXZya1VPu7k9F",,}}#>~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/~-_[#*|^(]-{~>}[{~;_|];=^<=,/^+$%,>+&%({=#>^?,-'`,(,#!~$,],.;>_/_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&@},|&~)<;_]?/~;@#+&>_|>;{@*%,^@.+'!;>=,)&?+#)$#$<<}!/@[+'=@>(/}!>|<+&{|&wDv3ARhDCtY9jgomQS6wkPmq9ztudPG5zDNH1b412E:pwblEBmL14S70rfOrdAUFNs9oiVAS75cy5KPicDl3W4Unj9rLXaSA, WzIGA0t6eVAuNNyGsUKKCFUbcC6fsJgbf7A7tLUtR2J3VcOJyxdyZSReTi: cHqqwk,#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+#)!?)[]~$@`>|-#[`?+-~_$%-|'+#'*+qT00ZuIE3jQbLCCn8JEbSzSpgMLjet2oo:hh,hn:"vxTDasxyeNZ", "PH8MNkSe3mDVYE": "IGaNXlv9nh7i4XZNXsvl95GXtlXGQtNduwDprhBI0XaXD4F8AabYD",{<][~>)+-%@/=(*,'*|-{{<][~>)+-%@/=(*,'*|-{ zuQuU8nYVSiLVRgmPrDNTqhbD51ZxQeJvYcHjycdgozNbrh7hFiomcuqOY2c5k: Cx4iBqf8NfIJZj,"G1U5lrPhkuDtWCA55C32aRqLAeK64Wtwi":EFwKclDwvTxMz,B7SsxiANGm:"JT9ci5yGiOMotUDNx8f0KDF1heYr7fdU",qNrb6:"mIVVLXGtNp1IuDxHN6ujEVFrD70no3OVwjheYrP5", "Z9yucMjtcGW93K2Z2f25lzKU910p0ilrArxPN9OX8D": Qad7y3GApXzoEhCR4v, gnEnTw03UaWdA2KvmuRwAxaFbjmKr5NsXVvvtrstX: kZF5lbcelYfTxQH5QUH6MgJgjfJD9yWPNq,liHaCexp4Yt6ZZx390iApsCdx:"K2", XhKZaq9L1KhNz2WWOvgz6RdIkES23iLywR7Lsd3q0FCgkvzvhhCYPuvtf4lVWmFAK: w7LhaoP3VWYSuhMKVD4khDQf5p1XJqevjgPxiwq4iZI8SULcdUc7yMMfT0V78,EFtFVXxqhnVHg73EOh4VQpF8X1RjQ3iPew73YzVu2OAeaNLsQ4ZJVNUtUdPF:"rDOVBG9NqOLd3ywbsWOg4Crc4feaXee7XQvi7B3r177ZlKIpmNNNbDXz6efTYKfg",`(?#>$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$$'$~-`|~`/@>^@|>+{^`+}?`{!}#+|$_=`#)-$+-'@.%*,!,'}*#>_*{+`[;![/-@@)>`*!&($[?&|*!`|`@$&'#$)%=!{&+$>&'#$)%=!{&+NbTxCKxvmDcm2rOyOmTMedXTYkXEJClI5oUmTMhJEjSysC:CRSoKavfKKgDcbclRSHEvXGF,+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|+;.{@;(}@`.`|?|#<^`*+].|?*_[(~[|;;|`,#;.|;['~%$|y7pdHqaIfh:i1lA7imW9JgMao06lTAmWIpdH5NGnlCNw2bxZToVxLm7ZM,"VgaPpNQFgawON":"a3pkaGOb6on6u8ayOqqEmZsdpA8VVjmvku1ylYw0B9XeZVeh57dDF0fq2VNvo4ck5","Z1iAZvAKJLGTozET9WfAIGVlSASikRY":vmrTzUlRIsp,VRcERk5TIZRT0y22oU65jl6VLxXpJIBsIS2uvJ2exPc:PMloqcyvyyuFxYf4yu0wBohHHIxSoWxdQXmZef8ZrYgo,-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@-={),]_'&!.-)`|??+-*@|`&!])`!-~|&|{;-[.{$'&|<*[!)@=,@^}/&$(^;_,,%,$#-,|@"L1mQ0ETLkRAq5D3soyJwECf6uquW0L88wkCOh4WCcYIKs5sAPd86":"BAhermuhruoWH1UAFmV0wR3C8VesOpsWHhcfQMXol5rE8bg5JOEpRQ2MBiGCmyDgR",C5yQbwJHBXrMi32jBDIEBuhtus1v3IETKBmrCqXAMiBbXHCs2:B9nIqUSRzF0LYFvtCCx514lnJSxXwGLCodV1VMKtuAVSqWMsCqdX20qP, JXt0pWBfRtXMz1jFPkEefE7fQiYuIQ1XLfvFcwY: "pGTyRuEDCWzTlJ4GfzGGwhP30xdQTD2YAB27ay43llIynv2RvKb07eaeWgb",MSSH8NktKN4MPiNnOhp:"RV9QHrNffjRftBBfLOY07", q5oFwAK: jV6By,owlwqfIIEIzqsZDnHQNfDIGJgq:ZcrlIO6opWPam0t4D2zcxru8RBTcP6DWoMC9l,!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/!(^>+@$^/>+)%.>~'`,];{!!];=%-=%...{'|<,|$/"UgTGhSQOvYS09v9APt3f0uVh3gqBkzS9CULnqbaENA0NX8Tt5mzAUruE3TQ":"gx0NbOJaiNKJYg29bWUN01dc6GAuLZyurKS2stDgOTX3sgGNsyGFc7mfPNkyVwk","RRnMWEvbMPVfmdOTpjopQJoEOpCEqzwAfR6p1HHOszcLtNHKwM":YDPjmeIiXSuFnos,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,-]#|~|-.]$%=;!-,}?@&%%{+{>/+%{![-#^)/-'@$++<+`-%??._@~'+-',}.@.|]=~.{<#*/#_};>!{+!}#$*(/};'/?`*>-,yV8W5fXcoocbCaKOPNm2tmOTnSFf6fhJBKR3PLRNKulRL2xwvIElIUmadiX1lGbbz:WE3pQQB42y5Fa0L9kAntA4, hXavN1GYGCU8u89zIL8HhTzcZIHpnwmub3xdH6ujFDD0Tqkce1oPlfa4T: MLal2Cjk579VLM3KBUBBmr2s,$<)<[/-)_){+(.>-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^-`!(..%,~*!.~(/@<(!&/|.)|_@_?@[^~^@+[_@})_]#.@{^$?+[=]~$(&@^!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*)~/*=${'>!`|<{>'^]**[,(|(.,[['*=~@%/~>-}>*[[#/#-)_]'${#~<<_?!).*#~,['||*&.&=)^|_!?`(+,@-='?&|`*) cohdiEV7Pp0L5AOZFIdnbPRRG5YykqqZUf3dx1N: hYtNpPUUcybaUvR3P4cux62gFOTniBQub20H8yAvzQ1,vtyGnAk3hkzH2VOh:UpI92eNZaiSHCZQHHWvzx5BmFFkdV5vL4CYLNcW,mG40cpDguhVaQFixA50fvo3L2UOSNHQsDyPLjKFzXuLmhBQc2J0DfWTey:uk1cP4jeH5BmcvjtvOqBd7gN1H6dp7LB5gjt8oUzzCmzrAdclYm8,)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{)*%?__'';+*~%||')#{'?/?=-.)).;*#`&,_$`.@'>]^;[>|{#{,<.)*/~?.{&^[~}@`[<@_-`'{pqd251ZBgih7LlDZt6wY2TVzhaBkMazWzP4riHB4lqv4ykTVqPW9VNbmEhCAg:zc77QhGYjclE7SE4LXoF38fWFGwyuNg, }*{}#@_: Z8XO7eIRnlhnGcGrPOFbKJMuoD7l,"egSAU1T3Ur23Sl1":"Qv6n22M0o3", uyy07lXrD2N4RccPxGXWssftW0BF: NrIksndZiVCQoinxDL6dhHvcMmNeu7LzjtCh9L8QcC88oDPEMuy,%';*%__]]#%@),~`#]&=.-|+'_=('-'.[%';*%__]]#%@),~`#]&=.-|+'_=('-'.[voUX999svOROPHHAXwQfAi8X5:tgo1FNp7WeQzp7wjwYixzIdnOMT3eXD0LchhVbBx,"ig3owqoqiQW":K9sfodUo39wPokDLNKQOJ,xilM8MHUCHpcVQn:ydv0YDjQo3lGIDzHzL3zjCFxYqxBZ050vT,yPNK3ViXhEaRCZq81KtFaq4VoIS3SPKR0zVykqKYqyEjvdg0plX:RSS6RnNR6uusOsMSlraWbVzcZ0L1Bdadys,]?,_})]}=}}~@[%/=}[),.+]>]?,_})]}=}}~@[%/=}[),.+]>btWLjsi:VQ3VtFcneeUMmS7xyKdYCkoBSzNC,NCnbwmkwi:"Nrqro8c5","nGS8eKFVL1qb7FxlTryIXLGo6Q3XXHzYnbyRKbLlRBkiWq":eqsOb5FOxztmoViG6mK3IiCbdElu5RMnpoOUqzYe0ZvTBpAdOhu34RgPEFQZE,hoOInbsqeuCH5RBzsNT5gdx8IDfVF0ijdG:oaL5jqoH2kFzeT6YWpUXMxhATqq0MzDKy,$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~$&@=(};[))`~{'%]+(^/}+)!%=#^/>,@<_!+_*'?;@-)$';/].={>.^]*-%@;>}[.--*/$]~+@#%@!@=/(];/}-*>>&'~"kUf3":wzK,dsw8tO4mXrfd:tGqXkpqnuo2J9rNjTz5Mqzqcqc6eZeBMpUJbO0Zr2Kfzv65SHnZOlRzZymRwXmjBC, "JzsTt": u5r2jKvQSrf3ol3oqeKMfJVUxf4phh7HfQ6REKwI8,{$;`+@^&*;'$`?;{$;`+@^&*;'$`?;CJTEOyhklzlLSicOPA2kKbhHQg32z4EggQVCluLKKJI4yEQuzYAusEci4ARC0XcQS:KxWdAk9dCOKF219yRGyQDQ4TSn62oWfX59XzUduOTFEs122FbxpFIgO9CIERL2YU,=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*=&~&-{~]^_}-#=;]((+;<#,{!>-('{-`_-&_+>_(+&$%>{`_&~>*~@#'(/>'/)/!+|=@}]|}{`=^-&*oaCHVtbw:tLPVWFUym9i1v0fYdx0YG21IZPTtofOilO7Ca7nqODuoIIW7nbhIpXfwt,NY0jYg5wf7PZrR2kr3OSlDlefiIl59qy:DpRSbFm9JoxKoF9WN0BZFvIFgmnIq7RUCCyqp5cMPoCzucigR4p8MQhMyTuw2UIF,xushTuRVk:"nF6kV5oF21rYol78gt5VunKw","u2":apiM96Yw1,-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(-)]'$)%<<`$_[/~;]=']!/#`;=?$_),=??%|-%&*(Z505TgAyXMcsjEwPf55p6hRJRLbaPeScKhXBrKmCrO:V1CX8PEko3i6WnrcNZCeFNzHC3JXqfj1zdZsbPG3w3Qkmqjl3C6t, LyjmNTFaTUoWD8: dAu6lzAf75AUzBa2f2fbeBiqHxLlhsnJr0zph1Kwi, hrlGmwykzDFwSfLq63T: "GaDWXWwmVfxk0HeaBFzimSgK1k66y8ntREUrIXzJrMXWDvoAO",OXBfh501bwXVyQiCzLOiD8q837VkD1svIbJGSHtY7:"ZlqVDDp433dK", CuF0wWykM0gZCBuJqP2ARj5AHRhlZnAKNZo8XwTab8S6X: Q9u3icq8k6UJpIMADMDnGw1ijZtXdrWh3rOMD2U7m0aViRKD,D5mb1TE4zgiAXwDCXwoQH2D4wHdycqRASgauZ8MGf8l61cinxiPtlD9FFwxwtfHc:gNBc1r3P6XT9s18l1gObBfLmyhXx7rWVv40GIfmAkM6qUxiCyW1l8Y4w,ILWSnXejq4eAgUZlO0JE2F1y3DnuFbIjfvNqHiqHp5Vfl1nHds7l:"rE9sqgY",<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@<|$%|~[#<$`,_~;-[(%+>#?.+^;|*@@|%|$,}]_;%*&)^$'>^{&]>@/<<+=->#'<@fTZzey3nO6olvLyd8UBSa6V7LSHw7B35V:FjPIEszzRaHYlx,|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#|@]**|@[+-?[~@.>!~@?>@_[=?(+@$<@|{|$[,/`_?*]-`/-=$;=%{/(/+$){)[~`(~|%@~?+]~#NyT5FTkFVboGtrFLbNw6Eb7MrYg60ztcQyztI:"bkr6P1e1ZBGIpEa50qtjD3IOrRBo63sYVvbwKZHv8LjCrLmYHEs5YV9FCXnRdDMKU","Iqz8ghrcDKv3jOCHgAiy2JxXmIcFJCI0DI75sjVSvnyqB0p":Plpm7iEzBDOatMyY0sJv2MExKYbgGPF9xQ5Oo,=+*}.?]-<>^*<``([@,<+@{>|*~<<{=+*}.?]-<>^*<``([@,<+@{>|*~<<{Zj6LZ7qJjLUeHe:yqcadqgFbUs,UdYhi9JVYHyaImDfDhuMtzP303gZlk6xQuOkRULgwCZuoyL2GqgCyTd6Zs2JiNBZv:"RPHIMsMbYScgpTrdreOpoUx8CLrjEDxwIJz67P07xG1bDa0gXTq6UqNFgSs0", xRfS8CNXytibjA6IsHznOaDaRkg3: xqYQxro19ktxy1fNesfJxj9p9KyzkJORxNVZ4xXcEKsKnASLjWGI8vrvYcnxIxx,#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$](#/|#&}|`[_=%;/<_[(`@{$&}=&^+);]}[@).['|{@}$,#/(})/&|,@]@.-.{^}##!]({;~={)!,|=~,@>.)&!]||}{(}~,@-$]( udeuMazusOhqmFjPAnMFBrz4EXEw1aw5j2FpTLJL9KbAx3: gV, "j9FOzdLsypgvllbgdFbzu9YJskkz4fkXwU5Y": bXe4w8x3hS5MNfpy0hbtzfyHCuPpOduKhTfgH8iA6HtMcPuKW7bgN8, P8wDsk2lvyzCeGZl7trvGPEKGgJ: SuQwiRlO4iYIDTc0zYPHZmSjQbDAKCNGPiLlsVlG8EaBhOW6, "f6Xf": bp,'-}#,_~}{$|=>^`|$>,)+>%]|&$(;^`|$>,)+>%]|&$(;%&^~&}^@+&<|)(`[|({).*%!^]=-(+[}#@`/-&*[~<#*+'&%=]&!{$)*=+![^[{>%&^~&}^@+&;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@|#-~}'^^,#|%)&!&<.>;,?{^..$#__!).=*)+**,%/$?~./?,.%'<,!/^^.<@^#(`;.@#(>@uoYEDDwdjglRt0cBvYl8ql3KKCcyyRwVtwyuNufbw8:"J9TxEh7LSJ5D31wm0776hqLoexbSGpLbu5UKkfnhbg3VkZk7TWVhaY3RGm0H", urTRdEKPtC9tQZ: TOTvBcjvbD98EBvaVG1suAc9rsLqrkV1LQe5V85z3Ua9VWEFX5Kk,@&{;~`@$(,'>~`&@&{;~`@$(,'>~`&khBopJtGQ3OkDmlYKUMsvG8PCzf3TQ06wUf8Ok8dVrqbrz7CEHB0jNkRq:T5P0oRimW8,EqjsjMoJGxIa4CAbqi0fmH6wd3kgHkW3OP0DnbhIRoaAz69vj:FthTOBHVdq9xlEGG2RNHM424Kp2IE8yyOv3WBvp4vnIdGe4iUfQsnioP,S4avuy6FuENGZZBHr92pNP2mlZuUWzOmGv6pf2tjA8d:"GZW26h7zMOg0pVQ4Rt08", ntlRRzdLvqXMDscSDDdyCtbwHb0Qzd4VJXJROqaLUlHv: SQTErGa3OlMYyq55pw8n1Wf681HjW3rAM8h91a7ztF5tIpD42hyczB, "M3dEhhqp8": yzljWW3BogpWwIs909YtdGJXQlnVLxjO2C54MIRT9RlghxpYSzlKbVrAx,"UEs74umMmFcsci8lJY3qkZrWofhb1mzaRmpa":xIj, "cMktTqqNKQN0Hg0SeMm0BczOyKCmt1EVso4PfnZ8THLNtM": "Fez5dYx3igmsXo5yBEAMf0xV11gxcise5hKdHRR8dGS28sPAD4",dlSrkH7tqmtuLhYIamE9Zkn7fPN3ZjtpHsl5UG3tAX5ttdCyevXKaQrrpy460:"OPsEqrNGln8e4DushVFL3aRydEekIuYxp7y",aEZVuKxI2b:bDq,y8moWxSdK9hG4xPMHZ8TN2cPQpSLg4i53DQH:y0ngriTx, SmtESa1xwSC5iUwIIb: "Hh4KEeVu33nBfORowEw744YfoR4G7mX6hURuNYx7gEqAGr6g80Qq","VnnHhjlChhSNbNIpAigevckT3VBG1z7VQsIi4GqoxHsFciysqwnSi1JKC":l0XiZKNZrE0zpQDItCNFrnUUtxRUyqelarCCYy5EbCSe4qi,sAX3uRsolTqlDZ4JSrUlUO:beOEF0rrNgX, NALOtNQNYSHi2AbZ5DXL3GjZvyyI: lRP1,"aq9KOMOusiSD":BPgmrPceyugEggeCpmtI4oOC9cW4EeZCYvyCdI9DL3U, LtL6o62bgZ5WGX7rsYg2yqubR7boqix: Wr3KfZT9ZNzpvcYxeRP,,==?!,+%/,==?!,+%/ KG6oPQ40CdALM5aHRVv6gzBaaIyu4qyqtA7R: dcpud8zwh2UJTF,`+&`'});`#<)*/$#{]*+[/~=];,`+&`'});`#<)*/$#{]*+[/~=];,vlkU4hsgthnJK1ZbuYNPP19Ld62NdnJYLFBRj1DSYQ5JAucZ0G:Wk1WX6WHCWJzpTMwfhRjAhykWZ7JlP55VsldcAnD5xTu9, i7km5niqdoTkeQ4DJWePp1HTwu0cfTPIwmfz1MAhs3Y68XGuCjPPMSXpLko: iRaX,#^-<([*$#><([*$#zNAkIYYEiX33MK5e57x9CQNfrNLdUO8u5lUkMKnYZIfRUMyASEdY0v:"cdXulmtQ2NblKK9zEbpwyhHiozOJYsYd", aYsOedwXfwgE8brhToLW4t8seytYguIz2NkooXPqKlOLCNSov10itgAUbJaha: "ChIYMpR1S0efh","GEasY9RLvOiQGBO2hhk6AZjPUG8j":oRl88fde0BjIF93,"xMoCmmqWC8adCTV4okYj8cTjRvllhOAYFOI51WWeQNpKGuKd2":QiSclNfy7BlSl7lMvj9,nPPpJ9x1JgecP1a8NGYOVImfQAmPhS1Tm4dAvgBVCuaPBa:"udg8rdOJhCNjaPhzWgY25ZokIuFbTBBECGRsgo1sSlVcD4h5yPqayhF6LYf",w61f7OLvHVe7:wwqolStaFdaelFsfeHZLrLBTETaq5u8vbHyML5pn, "Bcm7rx6fLw8VIynwT1JBK2msAGR5g6c3kTaN6qJVI1E6ko": "br1m0SKxsVO7m3CKkDZvPDs5Yuod9XN51", D9: bdQgywknqUfOjFtMXYnUxYmJlXg3R6RtIPtBF6it8a, nEvewrXgMtpG8KfE: VGeCYSPRuOZoEBlHDTJpvcr7KdIyPNAwAfxbp55CnvrJ8XPq8gv3hi,"iaOb3XThzIY":"tUWnWzxQIIaeoyZ9jf0zFuNT48h2V526t5vqM2REu2fo15UhacE20rx1LY",&~[{.-'[++`/]^[,[^`**>&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~)&}@#;|{,_)^-')|/()+$;{?,(;*/||$*_^#%|+-%<}{.>*.=+{}{@+?&`!/-;}`'[>;]_&$<~).+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&.&))``}}+{'][+|{?./_`?`*&+$^*?`!*;[?/,<,>.+);#'])!*!~^#/|,=&/~~]_{&=-[_^_@??!,@%.&.#<[&&]`*@,%*+#$&fTlwmj:X6wKKmwFDS4job,"gkQ5FHfv564Tj3mdq6kCteiDiVRbW0u":yEjBxYt4Km98FhKdho7sI, "VTmTzrhzZrPFKvripjJ214nf2FYye584j7PnTkXEHu1wvlYh0ro": Of2c9VeuY8GFJlPunP0bIb0LNxIP9p7ADFqQUZ,Lb8eKkOA8Yj:JuaR4BANz8f7ebFuDu8RLNDcJdm,RFKyCnGrrZxFWGdnZraXR6dysjI42dvtj0kDPf6Oyp1bf:H9OWSxtRRfUk1tpVwfUkUap9STqJb4ajqBu6XmMtigdlTE549Z,nHQrVE8lQU6:T0NSwn7jtIXKLvZpb4Y6hI98Safhvbd4uTu8mqzus3DHz48ngAUviGTsOZ9wdTzRS,hS6pzV0oiB6mGfnSREdK:XezdBLRL2y5JPV3DT0cmG2OEB,g2kp6FEwxODQGxHT4XKpbZEm0OFwxT7JaPGbxZl5eMF2SSu7yakY:"nNrvVLxxJYRMYCkJhpvXwg", "sPbNr3fskBWSOrjEZj9M6G": QzQhW0KAYAqA0kq,#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*#,(/?$;=^*){||)-)/]+~~=~!|=,>!'(##`}]>%!$.<{|-$*vpO62IYN1i2ma:QFNJVujd9edE4CUwbW4,`*.]|'<|(,/(;*'~~`*.]|'<|(,/(;*'~~ "SpaceEfhavXgMBhcPbbnAEu29y": EEgUV2gCVCrLfegjqJjG9iwVBsDtgmVRBYWMakmMlDSN6mLUIrGy4LGm,#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%#[!=(@=%-+@'$?[~{])=[+,|{=;|~?+')[-(|>>{-@)({?(;-_~([.'(;/`?(<_}<#=%~=;$*.)._~}-~_{$,]&%"mpr3nIMmtmFFYuJPL":LVF3hCzsskuqMNok85WgTwAYAz8Znp5ZMMtGPOLzBtVCClkR76C,"Nx2AXLeKpzxNU9uhsw5JEEFf5JwowPe5OKDm4CRebCilTSTvealeNmoEXK":i1iHZYLNs9wTtnaFYrMlLpVK5Sl,#'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?##'@`.';&;!%,@%<=}|/@~{>@|+&<`<#!&|?# GBhbqDd4eajSUhpRAetyQV1FsjzPbffhtsewcK0D3w7tUeJA4y5H5Qo43zUg: "c8a2fQzEMY7RSghVF0cITz2Q6rYMmOJwyMYpvqoEx4evoL","uIcoMUnK7ryJv":"a1RvAaiqX4KBJRWSdO0BbHNfYFyCRo76UuwOpZlDnR",[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,[({*/,^[_}@*%/-~)~)=)+%]=@{+&/;}%>#.,"BqMx16Mc3DFLYjTYL2H9lw0AuSErubw0o9efF":gRKhlDFZ6NmU6Zvi16Jbopt6GYxT5fJpiWNdrpKxjk7pYIMVKQzdvYC6lHQfCz,"Rl4CKMWtUQuCxeGs3yP1SVwqCwRvfmwjxBlPLMAgkGtT":cL5G0DaQFD4ji89vqPL8EX8I7EuV,"qxtjGcq0Dvn":"KJKT7og5p3Y9DVJL7jhAp6F8qohe7v8ExIizP2cJVF9Pvcue",nfWQ:OhgauKRAl1mosW7PHAT6zEDYyPsG8Dtv6Oorczzg9Q42F,"aDNAbadvw27znTostpKJy2Ux":f,lvfinIh0vAl5pkWf20Ks9p2IxBWV8WzanPjiOwlc:"Dy7TQz2jNjvqiMzdA23XqNPeX6MT",Z53nyfY5BfBfEgySAQrqOpWvPx6CxbGau5dG024UmXWlAdAZWj4QU0973:Zbom4XEsi8H4IeUWrKfWARrefS3NaaomrcbPldAIATfyYnCa1,>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=#>~?%]`#<[]^%$)`?>->)?{~~@`~-[!=# Deim13vZWg33wXjDzvmSk1MM9HtQIAOvHkldOAMoCLESbSwqbcbJ: "QgaNI2dLqyf4zpyAik0iZU9fcZNqm2sN8A408",|_'[!!(?/&<]@-_{?[=&_+|_'[!!(?/&<]@-_{?[=&_+ Cbl6mLTZZuqW2sJuPdoHpa7jxnXGcxgsrqj9rXVXgkJHuH6Jj1MTN0: AsOcGZcsmOgTZVw3BVlF6lh3YaEHYX28vAkFJHyH5XR,^+_*]%^+_*]%zpFbke71bB9gTM2umNjpOo3gWFbOYUozA8EUiynKo7KhaESHnu2qs0dXJ2WNy8:CTg,"U3TBMKMqW225sAoTI3zz8dYwQtMBYjJnPLS4B8DiwK833Czm":uurofUsId9oktgXFsjmUxy1dh, zeIqvZYR5GOCJXjjD8jbQ0finHz868e3lg5leMJP: m4ZAZ1e4lfqSa, PYnwFtJLOYOMZ: Tdi4XF6023OZpF64uh28xDYjBSlNc9kGcwno,jJmvLQdqpqL:WhoVlAOFGUfMsmULJ2TCaWZA3RX8kjAg2LZ1V2tS1fCKDyqUds,"coAQwSj9ABqdL6NlH8ujoX9xbBGvjKp2KJfbQBsjgt":ICiPu2CwfMkxB3xjTeFeup6nhKaKKJi155PCR9aKlVUg0iTi83EacMMp5Dw6m8,uBSS8ihuU2fbKMUCs6ZrBpE3xaK7HXZMQxgVtznsYK4XmA3dOss3o:yInhjvwMMpZ3nnF, DAXII7GPlkioVDzWryMoy: Rnj8YZrUYGLm4PMlt0qc8HeXIfsP9hvXMk,~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^~>{<]+>|]./~^*#').!}=-)<&@=,!%-+[>*[[+$]$/*$@#;{.^"tiQp0qJIUwsXzqqDrDnOw91eJPkB":QXVYHutVLvlPwbZ7ZQvxz0Lw5U,.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?.@+{{+==-%-=]>{#(?*[*^.'>&,$#_-]+=%~.]#(~*`$==!>`((^+>!?^+`+,>)^&_$^$/'^`]?"W4cmk8AHmdrvJ":"oEzNtM0VASqxtovJP",*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',!*.|_$'#=*^{^[#>{+;;+-&~*`.'{$_*@=>{$!$;%*/=;-;?>]&&/>['*]@(={(',! "ozuSOznFSddt6tnvhr4fCTeLI6z7Pywph8oJBR": UP,(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./(/};>^#-}_[)%+$=!%{)%$/`'};&%|!$*<^[./ vpVAZLhDBVgcUpLQArgx9lNN7G4qVYh5Xrgh1Gc: Hh5sDPWgU,<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%<(@$)#(}(|;*$(<%{&?]+#`.(#&|#`#`=|@+]/(!<>]@-&$=,?/}~&.$^'+~>*&,@|-++|!]~'~(,`^.(%"OOnojd0Tm6vamdhU6jlkXzGmQITvc5PGsOyHzUcYoqqSC0Jpn0aGkCU9e1ih":fL44, "ZJwFLTtrHHaiveW7": oGoXClClRfB8dKjNBQJywGJIGRgXi3GlQcTyxTJ, "PRXGaqN4GVouRcEI1ATdBzD2JE4ZxpBaYt2tS9wbegnI": XFsnhzt,][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?][#_!<#_,$#{-{%__@@#;)+?*+-{=.]}_<-~-(.`}[^+>!)<'$?=@,&)~.{{%$$+_~*=}{*'{_;<%=},<$'~]@?"HAtINHmE19bqfQMCVoq5Lz":AemFYrt, mddGirSWGcEJS6pmF77xSv6J0VbYofdiYxpJSjwwyd0Iuj: "RcwE6VY64xw7cAvARX5s5Kd6Zgu1ZDOsmFtFqIjqwFBJiUHJX", A96QRIbZ6PuvBMbXEYZjlpSaWQcwUu9qMj4eg8c7Q: oKRKcGBGuO3G6UwYcKnb8ZGOpPlBnBM,hN9j5E2wpEyGK3cKR:sA4puApzAOwTIp9qIwI3BY56RLwp5g7e0Av,ESUFpFC58FeC:"vHjIVY1hcukAKT0drn3u3POR9NSnMuJ8bW2BDqeF9tuZ","StO5ACWyKbUbi0Lsg":"VuaIRHoIAy4EeLkNzcmVn3BS8Csdj6AHDRtC2Muq2HxDTR7M",@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'#@`}&*`,)`~`!%>';@,|=]!_&=;*/}]'/?&@;@``)}<&#@??_[_')!@$($'.^._$/|?((?#}*-)$*{`?,'# "cPBTWceaeoE81ydRz9kcLJ9YlyXV": qUM24yImGouwzJkETqB7xPKgJDBnZ0n9MkbxAu4IgDJ7b6miortO3jMHiPFv2,"IoojFVGbvl7hUAHDqHeXiFdcvrWT5m7UWtecLgbw8Y84Gh2":"kz6IG2LG6mjC",h6GrtRhq0DltNaozla3mMOnbfZRi0BubryJ:"ilagDaMrCmds19uFzS24sbpR",zp0MeItBlqx9JqcEWUsERPN5jgl4o5WjFkoTeVVMm0ktwE3C7sCY6Gxy4:uFDtLqQQ63Pan6wWubEUMLOERtuTqTdBQnkX72YpUy82neoHd0FY5r,EI7lyPeNy6TblMRrkArUj8LqqLICHBCrJeKQVXbUHiHOMt5onT:"aT3QxzlPdKUQHzjFGIBNT3kyaMTrzsZng87CgeGOSH4Y",xfdhvCRPG3MPPc81KG0GOSZUtPRbgGd:DaXAsz4EtxOPLBuuWV6MpNm,z3KPV64ZP7VA:snxM1fpJocrvg,VMkOyVWCmMEs2C6ZKTgdKNw:"LULTaQx4xDmUMaBreX6uZFedqIYne1Y9hPwBcbBbDFoYrQzNWjpSxwIGwl",}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<#}>_;<)']*^`#,+=^,%,+.,)-`(^;);}}#][?^]/-&-#*$><_-|{_`,=#+]%<# J0XGN6p9mPIurWW8H9xFuwViRVIAXEGXkfZ2TFqh502L64CUALu3q3gvIUX: qJV4bupY,<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[=<|_]]/;}~[-&*$+-!'_)@&{`>;!(=*##}/-[')%^&/}.#*$_@*[@|;^;.?~`/_>)=,'`;|=)[= "pcG": FBJnLiBDvZNHjoPxFydFwomDVdt57VtoBZubvzk5tDacWaj9WpsVe6hKZxA23mhk, NDliHS8sxh26jubwLxz7vf1NC3MuypmSej0v79mnbhARtR9mJHw9vfa5zOa6z: rgWX6ONK9kVOgkrmvmaiuq7PvZ42HiLG8txuV5VUJ5h7s2B,(|$%+'}$/$#%[#`-!'*(|$%+'}$/$#%[#`-!'*"ThUgwZ60h8rqSyHaYN":Dc7l1sBQy32h,VpJhM8sh4lGmf5wOAhItEbhCjSMkS6L3FsTcix5BPAy5kdBwpad3ub:NDgZR0JVLZIX4xlUhj0wVxO91qwzjO8ShcbKKckkLmxxn,|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^|$<`%>&*;|'?>'?+>.?^?)^%%]+*#`#=).*[?'(++$/?!>*]^ "pFerXx": "xTCy67qiKNsMHaWZOr90Sgkyu6dhByw",/|!@/+<|_%~/_}!&_;(_+=/|!@/+<|_%~/_}!&_;(_+="PokJCFfOivrYjUqG9veb5z7i":"RdAD2xVL4w7qlBWpMO",[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_|[;[[|*'/[)@+)>+-+,^&-*,``'#$.!,-)-`}$)#]#'!_| x9lfiOqILBSxyNV8puCMcvF2ZIWEPFncHHReyre6Z0AXvVovkEHGRI0sLHIr: S4eQa2,=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+=#]+>~@>[@/`##~/!@''//@*=[|.;(]@_`|~],][*>*^$^;-%-]^&,'*[=~},~]&![)&~%[#.*?}!*$$+"uG":gPRf3U2iQbWtcnWvuSUXp1Qdl,q3f3SyNb1LoLzZ2ch47zAfRklem9PBHfQqu8DtnsGQzMgAmlWKo7fVzsNzXQhD:"CeA6X",UqAgTMEFAfaPpC4L51c49dXe1wARuvt34AMMtgYCzpo18ezy3Cep0ALQiJHWmt9:v6YZEcvOFmTgZSJLpmsgtD5EhCIZhSl,[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@[=_+,$;`_/@|_$$)~!$_@&~.>*^)|%},%[=$(.]@ FMfPZpB51B1lMkCV3m7AyybImVq: D9EKLcuBUZifgedC6n8yaDN5WWRVlZ5h3psYjDvZjgPljk,.,*?><^&^$(!>]]+$=}_-.,*?><^&^$(!>]]+$=}_-xvL15h5qu55Z0pngU4r684N5djoqzfxDKO2yRer8B4d:XuhrQM,MRSfwuC91Y3syP4HLur1yIYv4XastGkd70YMk5QPsu76:"LEuro3SXimNFqOqBfT7KyDInCeI59X9B0tey",xiXJgXv86ZYTueR563:qYQ6,GB0qh3nMrRcCdYPBVP8yrbe:cwVm59rLH0WmP3RZJog6j7fJpfokN,#++%*{_[`]*(~^`.~#++%*{_[`]*(~^`.~tuRHXRytLh0NpI12WsL2hY:DuhAav6C3xs0wNFiMZX6zwbabWjbN8gmg3HmTRKf,&;&; "R0UtN7lL": "GPl32fykZj78bAs7OkqLl9JZZ", "RxCfjQfXOr": LE4vSfmqnAk434uGI,%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}%_=_|`~!;+;`%?_(_$'[*+`=/`%|#*_@(,_`-!;$>%%[+@?!$*&[;*>?,^%>*/}SZEUHIAl3T87yDddy3iQmCOLqtHd2B7CLWHZ7jkLaj2i5nMTlQVvuJssEB87YBf:"swgIa","s6AaIomuDh2F9o3BolmOHBELqU4bOTSmxD6oNp9A3StCVXDiomIR":Hw1r8V2POuS9WvE,!;>_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`_*^>/>{!=##`<+#,*/)*{&?(`*;@}>/`~{[|%*;~{[|%*;+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~&>+^,[!@(^@{]{!-$_*.[,_@[*;{'|*[]?%^.}%=<;&==}~|=|~"x1oPPrzylZC7VRf1hf7qNfUoylCpGQ4Z7oGcBiTsnbINjXjUq":RYXeTvrzSpBFWziYeqlRMaWDwe7kwl6h9efwZcYMjrDyl1UiLugZi,szz4mvKzLY5wapN3K4NggJY7ziGyvhr9UgUVjJizpT6bkSH:"ElawRY20OPI6qfC2nsnStnGGqGdBkbo6XQHp2vx9wQvtp9Up","T3tW3Bm0cJ0DG3DCDFyx315XLyb3JGEhJt":mXDm2uuf252tRE32VQ5nC1e57iEMkUjcFzi2Z2unvLiJdiK9VL0C7bN5aFAv,"c3WRvmfQH9MBxwgfAqq5rGSClmeaQJVITCEKZXDOROOkO8YFsSjQ":"ojwqM06Q", KDSoTyV2gyiOyGk21BY: "z8Qvt",zGxtpyLc4MJDNO5PvTEIIRLOurRLgbFJ6E:dBWfG99242rPHmUtCHXjr5iku6x1cBS6XVA76klmqqSXNn4wikXEfxd13Ib,|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/#|;)@'^=^$-&_?&'^~(]*'[>.@)^&${([_-&|`]~*)_`|$,&.<)~;'%&|++?/(,;}#^.]#>+|<}_$/~%;~=$}]?/# SD8VU4HJZpSFt6KeUaJf8l3y1Qsb95KVFGEysZy9eEk8DQVaDN9elw05mKz79y: xfmp1xcZfJ4ek5h87gp40HR6roWy81LFys6zATfrUpmHsZvy8JPA,"tfylg4Lx3o4slo0oYk6ikwd2DfU":ensm72T5n2fFGAI7BTDpb,<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-<*%-~'#+[(=^-~'(;?)%].],`('@]&*{?,_})?~|-M4zlLCb5eOul54oQSaTwsVhc3Z80rtm:"mISiGjE8GKbicFw3NC9hs0EtUOfoW5At0CpdIOKVhcrq8rcg2MY8pik6Hzq1s","STA181pKMPnNo3bAG6gHiIdmG0BsvuAT":lhNNPNhtWXE6BRxffoDlS806q3yo5MGZomM7eDX5kLCopiruENJH9QlAPw,Igk9fkRD:"qjeL58E8MmYgJG9SBJJqQXgPaS0SFZ222LWvdXDq4XKnwLVIsitVURFb3iomB",|&[$./';;..'}_{+}``_>|&[$./';;..'}_{+}``_> "QyF09GXw4E5CnTDzOYfs8YcUXPI2mcfn9MNigxVoFPOvk9mv9v": "Hm96WOPSSXjeUhkPBF3SAD0FB1VIMwll0lldYF",oibbEnBM7bf59MO7WXculcuQ2253NZdY0LQfzCbiszcEpJkyhMKn0XKxs:"CkBndlxOM9hO6wyeIYTuycVxbp",<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)-<&_('+#<,!(^),=})@(='}_`]!'[!<]|-<&*>_;#;'[==]~**$%;]{]%'{?`+')`'($?_*)#**[)- mH7cmuKkk82xmfDgo4jKDHCJQxN4gOKayBn: LTJ49WAYneG0dEj6SFyXjtcoD3,"CQjRqBaxxOEMnUuSShp1Wct9jGHowaC5bODa":PRcBS4IlLLe8BdKYoEYM6T9I8jpi5H2jqZjqi,"QsHeX9FRSfKXFawDzXg4d1t4R1ZSDQnbaQh":"QfpHKYLkjSKiuiUUddy4Ra8rWtUmg4u1CIdCbsuv5r2m", ln4JBSIVRtq6ei: KRruF50Q0pF325SfBG9sOqORVXlKO61m5SaAUgszhDI,.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{*.]!<%'}}<~+|!}]'|'$+))('&[$);|?^/^*,`>}@`/-%?{^.{[.<`#{/*`}=@&=<`<{{* BHju0klrflZLHSYpj1Ipuf64IArZjATg37m6YpMWDucqTriIBjNTHGSL3kK: W2E2uhVMY9EeI,wljOEUV:"sSUJ6nyW7R2FBjUFnq8S25UlkVNbA853lPU7SpJy8r9hQXtXIgzHXwbDxAftj",;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-;?;%@{['{;&>)^(**=|<+^,=>]#|*''{'-%|$'#@]/%&?&=`.>+^(>&/#@$+]@'^=&<*>%,^;)_~!@{*;@<#^}((-bkeSZnnjNTMFRcy3ehOQuaHO8LDxu5lOmTELlGYmRb:q3Jv9vAPXYVoYcn7tOvGP5R2evCHoumuYW1, lUM: oJ0kb9Gof, JIzxQX8: "Q9rhbqczFm3kSd", vSyd6jEoeRJi8NF2smCwIlFn7EHlWYAxR9XpIKvIJWOb: "C0MnSg3su1kMrs1ta8EP", foOODZeqaG96VvhVz9Dm9JLL: hHLkfD3xzzH,"Pxjxqy":vgrlr1ou8tB7HMc0wmiH7Wkg2ITgTvwIum2KQuFy, "vobxhazD7VDBIYSiRnd7uGCh3nLkHk8FHZW3Xa2NV3Wqs1uXU": "cnmXkj8WjEilg62RMYftP3CcN6yn7sBE04TftyaVr1LUvVYuHsxdqr48ZmX", gh5xY5eub7Fyk3q4cy2SVMrjXmweA8RxHNEwzhjSHgoftvXalzlP3a: UrF7lMoaAQLgb54GvyCq0SFu4D7rRxD9bAXetyUw1R, nQDIKOlLI39gWuJrfiSXKX9: "MBkBI",DfQG5Tgv:M9sj,u0ehiQyMbMqt5:"OaznIw7dWnxXZsZnxQItdFdXKVQswf8jnXl4OUgjMc","frTR96z0jOXPGTgSvb4YSjOgBvPuT0":FclgoPxcgjVMO4WvqeS,AFwwaLvEBXaRhWme5GRHMQkAAF8BW4Ug7SSJfs1Osg:"gGiLT0lQ2oaaxZsmrS8DyuATPh91M",;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.;;?^=*[?<**-)${-^&]^>>$'$&@%<=];-~&=<~.; "IS6": H3PzK3hDGqLDtaU0BVHIBA1Vb2JaDhFTrBCiXLYdjOWGjk6lwrKm8b85gSLBmSVZ,"Swwy6HicI0Jhk6tTJpTwlceFgbMp8EiqdETGo4DnxS0n24x5ietd":IkEA0STZbykFuzLVeV3aBCRGOsbJ6crhMflWaMP0UExd5,c4AeRNmL5iXufLoOM2Yyunvngj2:vR19w7HvW42D1aX2En4cAxfC1Ju6hUcoN8pQjWX2P,SSY47cjk23dX6DiuUxB:pJSxgEhmYx7hCeTzn4j8Bds0vCo2VT3scjgwYu6s,]|]&%>|]`%=,^&@,,,?.}=]|]&%>|]`%=,^&@,,,?.}="WDQEi03cmTHlXHD":"gyTpGD29NisKSu8EvE3zaFq1ZGfgdsy1Vu4wWBr",%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%(%-%(&`{;&,/].=,,>~[]#*(,(}-[#&./^``#<'.&[_>=?$%( "dmHxMdq8UQ75c3QIrKvg": UhOrbPjeFWrvrON55g, aunHyuubBQdDNlToiFr69Jj0xzsHs12SXiS9hB2aBCY: BwKwZF4H56NW1cXvjfbhrDudR8nxXMVwwixMA7X,%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$%@[<^'#*|_*--*_|~@`>@<=`*#~@!&},(^>*-`){$>(|,~^%+!|-,_>.@<[+&{]@<>[&&,--&`@$'|`%~@-~*,@!<.$ gJhRLioH3CXHsLQ23kpQRZO6QoijiSyfX1: DRTVw5IUcM4UhtbiHrUGteLqEUpQsvqKgxmt3muG9qij,##JlwfAza5LIuhfSb4JYdMNQmJycSUcC9tX1QPN60xl7GJqs2qiAMdFpss6NuY:kgxxaNVWHrmKQJDxek,{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](<{}_|<#-]$<'.]~^%{@&?}=$!{?-<([,~_}``/%)@.*(%'&!<.,'@[<[@$>(<~@$||^&>+](~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-,?>~~&/[@+^^@@;$#(>$`_'?%@&_&*($_[{[&>~*?[<-{)?*-%|)%`&/#]#,)}<'@!#&$*~>+#{{_;*-, AGihuigdo1j8aEEIEz9acb4ixVaUgRK1ZWdojNxTsFvLHJ65dfrz: KCBQLbV,zmPSZ1jRHUR:MslJxMK,"w5HnvktXHgtUojc37H7xhnszzNkJjLr3kZypotejQCdlDhbzh":RmYveMHwX6Dqu, TnsTnSdQpFaYEZtFOOaLoq: "bsvrfJdfKyqkiIbCEWPun0KwLnF8", "lgDaPBvjX25": "z1bcyvtCtgGMrIiPPO6pdS6jMp5N54EAYt8k54X6jskJL", zrEE361xU9j9OdTI7nvcO9YtNSoucduAg4mDgegbYCX39dvclNuGz15rwPApy: "tvOu", JZMISKPyYzl509b2YewDQ6IVf2ATgTPDdPI: HEIl80tplzoNfF5SKSdxCSD6p2rSocNUEP9Yi, "mGXOw0QiI7tel6T6gjOweILyoUO0AhqtV1vK8jk1o2gqdr2A6bj": "LHtRuqNkou372ETbU", tttipuwWxx2U4i8x8YnZRVp0xVJCgL55rVM2ReO347f2ED7qsC: qpcBkZ52xbvy4QpyfNFkFH0MPD28W8czHrevu6NwMW4KFMEuY6,QZzft8OHn3PZ8ouYrt5TZ8BiKJRDpD1S6YFkW8USrGO:UdLnCloGiCqMUjh6xTKcuMSKQBO4xR1xP4,aid0YRWaNDtq5:Gi0z6Db64uPkpDn605Jagr0wVgnd3p1O4guPjed5kvg,JBG264lRyqbiRS15A4HyxrQQU607SDoXdAR8kcSJHlRbDMpfTgg0Ll7wL2M1P21r:N0xE5LkUeOunWZz6tsOGt02C8Q8cPlRHRlCxVtekRVVRHm5X, w1GztO8ON2VnvOH4rN1oE6aBwFdAQfOyNk7ecMjZmBkxXSwUtrPA4kre: "Johpn2MzGSsTLPKHlRB1p3mAaG",;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=;~!?|{{{!{+-]>(--$;/[#|;!+_{?|;/(+%!/#',<.[|`%>|`>-$]/}//]['[!_%>={-#`#+~!%_|=[.=@/&?=ALye8Qc8RmIvE4tiI1mOr1IhXeXYvS4irNcY8WPpjVqEOUuf8h:ssruV0hQicRvbf0RcK1tIpNPehNtZOK7JLTpz7nio7IrQ3ZpqQo2cmb,~&}'~&}'DAwZ4J6WKB7vFKHnHOXNX57rMOeXXiuk8TgAowuwitaxaEYWgM:cQeQW3gDWaAFCk2Sez5O3F,_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}_`-/~@@>$=%^[^_]{-][(}/`=)@'.('|)<*.{@(&)^-[$}~+'^~&'<[*?'`#>@<)])[][^?);.(`%(/[#@-[+(}"ftXyrQssjZ4zIdDGDkIn7kCMw2Ud4FfDk4TYME":VxPVN1Um8gjPT82eAdg5DEeOxZ0mxxcOXL59DPs1dbsKA2yqztpitP,tw5bW6spJKgOHbUAFzlHqNcAKRhbVq:"Mt4MgsJ54",DPLjfqUA2Ts1s4nTIOuOGzm2h1OCVMDbDO9QF9uEjoBAQdomj4QNN7YGN:W2HYoJHZq6AQ9WiyTudDmYwuuAqSkk8k8W,}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}=}.{~-&{}$#>>%&~>}{[;>'`;*'+,<%~_+=;{}>]^_||+<=.}= IIotp7bN4XJsV101g4UZXGxkuMvUu95sinWp: IviljShw7S8xTedpWO2nVsGrv,=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?=;`{}]<~|}&#(>>[#}}[+#^!+,|>/&.<,`]<~{*|>`[}_<)_+_;';<<}?{.=;>]+?MpNt16rv:NXKuyhxbvbpmwbaAIFXBozCZBEtOGBh2tQjS3qsHCZokUnKVjr,-{@|-{@|p6TAc6:cax27WxXfzZ1MJcXTYbzNdNHq5pc6F5oY2jn0lJkZZygk7HrxlLJbJjevP,%,{-[]!`=.(^>*%~=~'-=.%,{-[]!`=.(^>*%~=~'-=. CLiTipcwezxXT: "KbB3vFR5UZjPgjimcI3zAZVePowVfHWPET",sZinyr5kCizCCxbS7OpaCmfBtq6XPiawWd3hMKiJonjwdakEGYOc:"xq2c51GVaOwNwXWWaGUF8ibSI9j",!'=[{!.=)^*(%`*|+&,)<'>,.$|/!'=[{!.=)^*(%`*|+&,)<'>,.$|/ xBxvtiNozsN4iH3nInEUcoSEP43hXtT7xJT2klvkq9hvrZJr7bFb1UjW9c4iNqg: vpt7ApRlAV5fsZzoNJ17KWLGDir7G9zX9cRgh8wHvGBZSP1L6A2x3kTw,>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];>$_`[.};<]]<``|@<`-^{*)*@_$~<^)#^@|.+~$_~-+-{}{*!$*+>~}&-+@];"gAIu0AcAQXdm38GVMToGFRZkCBfYtM5ZeF8A8hVbxZ37sVvRw8eeA8Opf4EukX7C":Aghb6BH7scGeqgfJpZxd8UWeDmScNyiKpbOnBYdLvTcpqOywT7Ham7vRnsl4p, "PDFrvH7graaJdPg3SQmXoIHm": "E0rlE2Hdti16WTGc8w7rWO5Chy9RqiyCErjDaLwnf5CFom","U3WWpalFW7koFlww7Vz":izM4AnySVQQNddsy6dhOpzADiCZij4m0hY9DKy17cI8zV9sgm0e3zKcT,-=.}?$|.>;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$;'._>.%%<;({>^.[!~]].'*$.$>-+-(%@<{+*%},'//;~)--^$#_->?]}$?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^*<>?[,?&)<_$,|<_((!&%_&('&+<|]%}.@.%_&|_]}-^* j5mSBs5q6Uka3B779d4dvCvJ680FrV7eErKzNSoV3T7tL4IEA0egb4RH8jRi: "CVWjUkYvqE8ReP2WfBOybCeBSuoJbtJ1AQeoMJz1nvcUglf4hRaZwHb1",%}<,!]!.$?}/>(`(.^_!-=|=(])^?%}<,!]!.$?}/>(`(.^_!-=|=(])^?"KHcPlb46uwo9iNIK65p2Bu6hOSU":Tu6ewKsPLyjvhDzrRq1866QMRnQPiORyTiYz006aCJUTAxvVFT2NVM65MU, bfxhCWnqXGIgsYIjaiSIRy9MNqTZiUVSRtLSgW30ybOnegvnycO: QJY66O6Ka5FmuIow7CkK7MP1D6UUeTjenUohf,;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^(;+%(&@}@#**,|'`+_@_>`,;#)[|'|+*@^( bXb2dmzRVNitKQ6ThlkKTeDIaEV7Vw44ASLFz2YTjw93xTbvvXNfB: "dQjSvdnzQXVsvekH5dw8EuLMW7pGs8Xow2pAKNSQ7c2qMDxrIqWpUii1JZa3", rTMkjvUc9IxrH5Z0dUP6Un2zGNv0E4p5h5g2119g14Tq6gswDWd9453OfaRtTEF: gShzc,"tTrnca0XZhZQvPYgCHUA2gGkSIgtH3vm7Uc3oRW0u4RWT":FdBJ7LdOOqB8,"CpqWi2JGpzyxAXA0kvJq8OenbValQ3H5QlUW15tmXmVHC5lzxfh":vwn7WZNu4ljK3NRCKMz5YmWoLmo4BlScaiPRvHsOt7pflBR,-=}>#;();;#-+|_['><_,~^},-&>-=}>#;();;#-+|_['><_,~^},-&>NoTQ7U2TKjFGpdmSOlpiyErQFiyCEhplo74QDX6Z9pjeHxLB7ZtE:"COy","uq95":fwCnBJINB4j7n, QxpRdQx4GvmuFR: "uhnMfeTGznPUnfLqXbFAlCBcU90jUNnPBhaVvqkZYV", OGQCvBtIAsMzSjSTqSsWWOiMX46DJ7: Lf566p8bFzSvTo9B138Pp0CIKrem9A9s7SH9lixEtEDAHy6b4YlPZEcMfSW612V,eChUV4oHPMX:cBvgWNdg28zSwmoMj6, qmdU0SiGr8yfz5s: sZ0xz6li5qlpxPQk2zQpMLjDqTmuGKqyzTHKWyfiVR4xiIv4kmhjgvzhOv, o00h5hiT7C9ayF: DShxyaZeKX7TuLOBXjde6vIc2lMSv1kzgDKkE5nFFD0T, M4eFBthYrN: dgl92m0HY0jR7X1, D2MT: UzADAcd2siMmVfbBQiqBzGeG457Mnf9kbezJLY1470LGhHB5w6,nX7UuwBGx1j3CLKVTS4oBM015bWLB:"E",*;%__!)*;%__!) KQo: R9v1Gc2, "N1IwGO": yJHzOLtQRk8zzGjSaZD8IZb9McLWjihUNPUxMn2QWfRPOz36Z2nWYP,"ihPebECdAy3TR5b5SL67qH70XACpcvCz":XBMnCvvGL1Q905ud4t8, jMdtXr2DQVaCQFtC2svlTjnw7Ps2e: u,XWtve48aOtPMRdFy36bTD5W2PzhQlV2jgr6qqB:XNs,KMek59NHW4pdE5t4K:YqZKbf95vxCNi6afBPd0L,D1naf0:"pzuau6BkSuk8xHaaAB9","zXxfYjUcmQEh07wEjgZOWoXvxFJ95w6MdFpUcwoQAbIVy8nEBQ":v, "t117CjN": PQc0BxjtyVkSpL97exT6i3cNNvv, "jJwstEWxZ86lMbPNqlRrlQyyjI0yUR1FZ": XSnfsbSjOV6xd5lwtMpFUq6f6ZnXyF3UYSR9EV1eGssQ, "ivmSiqvaNDoZ": "QZA3KfxDlNBmI1DSgBGPyHvyIEw0kUYE9TDmgYNnCtX", "porxkjLVy6LAy1ZvvL4fTR4uYXKRXhMkygq20N9Uu5z": ngq3VSIclHGhrv, "Z3etPhF4gVbH79": i0A26Rr,GAPLNG3qOH:D2xWg2c6zr77iAKkR80acMlxYDriHbyaJsZ6tSL,|[)}]&[)?/+,))=$/'./)$|->=*}/-.#|[)}]&[)?/+,))=$/'./)$|->=*}/-.#jSpgBCZ5bU0DKznzXOzZKd2RKnECIzhb3X:rbW8agsT94ujoCLHAcgb0M9AZ3tpQKIy3ZBrpWRX3MdxtbbBn064dphWYw,"kAUuiU4yYspZzrwdpHo9UmfteBpDLUGTb":bVSdbeopxEUxOym1RtTB894i2q5sHwYRftxqFRlJta,{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-{?$[;@`=__.<*+^!,--|<=!;$({#;{!(]?|{@};''@)[,@-hmHY807UyVmNhbpFuUNkzLl1t7AKAT7HYAfJw:"qQMxxK1eX732",WKTHp7rbt5yOCDKLN4LadRxlK6sFyptMf5aJJlyIuHDLKm3gDlMmraDvssPAaFA:zOsmhYv94NbyFfhshf8EuwziE2631qrJ3, "iH8IwQnZCqMpmGK4ePEh3PhMJv2tKbG76efz": k3QY8Y9LwO32zJmqliQsJxnuDr,"kLapE5S6LhM48DZaVSLuNlAZnnY51lSgqvIXSyM":"mv98oPL7ztQJmUyf5c3", EuVkszZAJAQdvIwhwxf7Ys9eIfXpoxQAlj8VTRJD: hT9zs8Jq3b0b6Psh38fobOfNK8I,!-'%]<=`&>>?{|[!-'%]<=`&>>?{|["zMNtWrx5FpnURQsyfjo6O0kvELxUcmNMhN2ZSLeU8cT6l1gBLDeOBsCOu9XPto":lvrP1aCP,"rT2V2V8J6BpverbsVfYR9zb":FFGFebrJ5N8b819VbYyiN5VrsKh76hvwD99ix3Br1L, qbAA: "g5AUG2kBwSFpXNDet21UX9qxiCZWizNKyDueZB56dhvshqbtIZjRbsPEIlZnJb",NsT:WNrMZwV15U,"m5j8fcAdBPwBsFCt1aQjs5fdYFlbiL4BkYkR":fg34oUzMH224eGL60JgtPELGZIzp3z, qxh8qAxEkXNUSZdvg: "YloD1sGltmHUKbbgh",?~{[=''](._,~^,__%*[*,(]`|-^?~{[=''](._,~^,__%*[*,(]`|-^ F6W978o06Co1PxPKHdK3dfcJaHKdO11KKaTTMtHK8cfe3EagY55JCREG3u3v6Md54: "uEi8cgMWz6YWlg5rBrp4JR",ZQ:"APQuH5KpsRjGwRLNdxCI3hWSvsEVHOJuhoBKzDizTOTKrG4r",vXqbapQWwEE8qbu65qJP24140EILMUg2pSGXoxTdg60BTetEvpkHSSHv:"gesvhcizXCKgSC8NshAK6bFR9uZj",'[).<[$(=,|#^`(`&,;'+'[).<[$(=,|#^`(`&,;'+ D5SzAu5bjWlN7P8FT7dN25H0D8rfjtGMNLNL8tlufkp8uiaYvl: fz6FA0fQP6CF7io1NUs2OTMMtx38,?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]?$`_._!<~$,!{*)},#}|=}>%(]|;/~/+|&>(@}^&;_(?}*^~`,%~]cr6ZoFt8ZX2zNfxtX6P12WFsTXsngeijABdf88:yW1XdvWR16uxPhXt3zVyssZCtWn7CGguIV888tqDE3b, "qHGQ0v7irfPjxMBtM6FEDeYYJxvLzi": roO2uDkPhQn71G,YlqfCL34yaUC5OPXwU049kEcTrzms:xtuYJ2YyNlJospPjtHvc6WCYrAU7dDHAiQTJAI3COedyT5Wy3WBmuYNVs2uwaoZzM, "ZJcQwAoPWJ7ZakRhWw1Bg7aLClVFmSNuL": tc6cHV8rVg3yrvYTJZLCGpNkEckvWNuzXu6vMfsvEPAm,ugRgPyEaZzHG9lA6987OpAgWDf9Bd:rgUdJ9msGP37varD6OMIiqdOlUKcBrwVmtQ93uL0D1poUJU7qzO7GtbH5mpgARaCP,;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$;[%(=!+~?}|{}-<,{'&[?]$]=<_}%${?!/#.*!&@$<}|*{${$&{(>[*-=*,--?~#?(%<`.;')-[?%~>_;&<,%@]_;(#$ Sd11D3eoGc: Bg1KzCnTuRulJuijUA9T6PJ9xFks1yxi,Cj1gRZzUhu2wK8n3eiOz1JqSwQyyI30G87tehK0ANUZfXF0C9XXXupJsAgu3CuotA:"GKAWMTpAdEzBAnmtRGFviEtKfGNGOXqaRCew9JwDqUxzmj11kAjR7DVbErKwQ",!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|!?.~}}%%'/,)?,>%@[<+/,{@(#),._//=]|[>]^,?%{}}%,][[{%`_.]&?'%^'|?~.)-)%=<>|m3CSjgZDDiZuBlY:"jhiQU0v0TAdphibvhFEdWrhgdjJmcSUQGG5ALFFk0H7pwO3L7roXct0vS",`~)@`['{$@&/`~+#>^[@-+`~)@`['{$@&/`~+#>^[@-+ "cZbmv6oQKok8iN3XfCoxjgIqJadavOQL1CBMF5KTZBxT2": nuQO8r04lFTumPxbNC0hVbwmyTxc7J25KuMhQOtXVm,^+|`+*?<'*#>]^+|`+*?<'*#>] iViriC7nNdjQtu7uFZRN6tGJAwEM0PT: zDZBaB31TRLakriyfSjqD3ekG18qVLOsMQgdNXxeXHuOISdo3gvT9JbSgD3GF,+$/|'!.+!']@}*&>.%#^]'/&??+$/|'!.+!']@}*&>.%#^]'/&??gFhxCnSUD7owMTF0veiMYnlagz3zKAJ1oF16GGpeWugMrCmr:"JCy9x1bCEbpLI8TXvExwqmhQrvQpeyqUwUadyJk20EHTu16GZM",GH7vx0SQcVEcjdjCtQJmwbDbZPaS0oIBeN39gixcvBuiHQVEyhDLNac3mkGi:"FEeQ7aro4zI2QqM4HSFAecGp7",p9buADtb2AlhZ3yREgiSnQNiXfUbvkFm:bZIsQKCBg18j83fNGRITpL01K9, jn: pvijiFox1z9D2hy3uXNKTp,}^{{?,#*|)}^{{?,#*|)bZ3FHTnHZTzQ2Tc7dXMAAGQ7HNRVbSHA91M:j0xzYQNvplW4LkEt59JN,^${)[=],|(;?-<^;._)-}^${)[=],|(;?-<^;._)-}ZlLZ4:"PTA",mtPxyaMCOPwyy3OFtTHOuED76A49Yim5NRutFUbnG8Bn0k5JX6mkuGuLpNUwu:Xkt5XR5TduZVQjA31SMxvQyfm8JARDsjofn,H3YRmHCQpxRAK0cEeytHViTqh:"GeBJO6FCGXZMyPJV9x2BayvNeYLKGB1RDmQLvOx9vdIlnIhocY5e",wU:rxXKIuHwpoUA1TsvsigOh6q27PWfJwVmJmGp,!@|?'$;)+`!@|?'$;)+` "nIRWf2EN1xOkBVYQDJEcuNq4iKZqg2l00k3vWd31SZ1L37H": "p8PYMLfGI2H2zYAi7wA1biM4edr4qFIuFfMzVSif9HLBG3HRcschXO",gx3KAfYfsIdW4EPP97kxiYyQ1ViqZSzeTfHNyltJ5SDqbfbBQyI19hk5:S9o6zam0gm6cPSWuQllaGuqt4xv72j5torAgkXArDgIQGzM52DOyHCNVBEsMoCD,C06qIPcFw1nbzPqi:srwIclJHzdDEh2NwD8mhsjmhJ7FlfbKjN4xH31G,QVGmTLQQzBiC:tzMpE9wPPHZmVfoTqywVUQusifBUUt39uNY1Fsh5KeDZxycyijGoyNc40, pwbFGxpxC5QDfUvgHLjxDHFN6D7QJRyFQs9mRKyrcWj: "JvmK696IaIXeL78NKjdwl3BmGP2VZOBCObQoH",&_<`+~_!#{?>~<#(^(-&_<`+~_!#{?>~<#(^(-p2pb9kYRwfLmmS2WkC3iACMzZO05eETI0:"GFyruM70zh9dB5E9bYdho9sSG6867cJL4nKL","eGqV62V":DlNCzpO0Rhm7pvDovohT2u3ZyqvxFWsAMign1ExRFzk,bTdM2U90MkVBU7ca8W3TuqHxuBeCjJS:AFeFlI6yYbguPHY1v5c35dCxfTGa63qH8hw7,mRwdoSCOtrM64XD6:D, JjitOnLu9QSHPFLDTj0sJaeK2O37ZhuohIUHR7hdYk: "PNMQ6vfo7CqE7mvSxI6hqzovf1UkS7h74j",mhghvlhGRlW87piExczsVbyKbXNCgtABlJSQpMF5E8RRvRDwyz:ButJ, "BULlNvBNGBijLIQkmn": Iy1A1NuKHvCL826BZ26ZBQ4PPiqGsiDpxZNjTd,<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_<}$+*;,<#*]<(>_<^]-`&!*`*&,;])+?<-(*-@=#%&./!=>_"SlMqKvP":cg,FLJ99IIm2Ul5E9sHTHWaajNHTCBhzcDBcNVbCpZa5lnUAlrUZM7Cc6:TpQe985Qz4PRbIKxEVo3C9BKmHHwjNOo4D57Hmyv67wzObq1apZx9B, "o0ybca2m4bTwkLDB6": LxAyBvaUjq2jy4Q7CxsPRXqOQ10mS31t2Ktr,%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;%~+&~~/'|,?|~?,|#<'{$>;'.<}]_,}`>-$<#^;V0CMXcBKwyE77YCABhDu2slaQiBknFMWQinVLYCk1mjvvg:"bHZ4kCNERFVH3FOJCzgTfegENvm9fhlqupGPmNN0ybtr9gIMyTcrOv2tnliND",Q05CJMNyUjC5uERP2qRXItNECxhS85XRdjG6tEQ0yTypUi:ZKw0B0HYmBNlBAQcvLKuX, kCbSO6KqwswYcjJxwLiGg1xHSjyAHqXn56m78AHFRzgVXGdZfxb: Fmf5WV1, GBGFPwoV67XJZPXqKcdTZ0W4hcA8bePpzTfZzYjA5PMDJ5YYZ6AXUwnxdL: dBfUfh7aNTHaI6xs2GXaFOIPnX4zyAO,>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`>*-$_^(@&+>^`]}*{},[(%*>{&`*{]!]%_#|{<^#<|.<~*#;;|+,#*,;$;+&_$$}!!^>)|%#[#+!&$`"eWDymgIVNb1lrDa":TvRz6zVeoVRUkEpe4jZRxvaijGc2CSH1SNPbOnXXyemxplR38e49ZbODjmV,~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;~!!=/^*<*]&$_^$'+-'~=&'(./]/$]>@#`{?$-;w4P3zMF4kSarXPxiz0CiD2y:"e7iNZaFWS46nfQ0mYkkDYwIE","o11df6D7NqOnJaPKWjvB7ceTVfS3WuaR":ySkTzD1CyaOWbBwnyYxrdeXQPLOE6AATpY5PO8K3MVo47y,"itbG3XHTiZ2x2M":icP4AkhSWyaypLuGtBm8dDGQSpT6G53Iw97RfJHRT3NH3kMCt5GySRpvi7af4a7J,=;)+(/+.~(!^-**>},=;)+(/+.~(!^-**>}, yLXptEMFMRkrSE7SRT9SzlPieSXLWglJX1jWenhyC4ErXGwWKCJF6mWBIAUoP: cnW65sCcDkW4uekfjsDH7Twv1h5Z9fYCIrSpRIoFgNwzOrZ1ffbxEPoOYv,[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.[-)[##=>%+|/<|;$*`@^.&{_;}?)/])$`;-%;#<[,?`.ED6xCNKqmqF3Dan8N2gP0yjH4zoUFkjm6a2sABnX93yjrbLaTBs8FBlphuah:siXBdJGc254JN0XmClCTYM3umjJ4edBOpQI8CRnYv2Ti, ouMLA1tgmgku23Fytp: RllR5fpgPaTiIwf6Uz3FHbSogqWINTlcxF4ph6daFi873Pfwba7RGcxyJehGm9aa,fiX7bseo8HiY18EiPQWnb9kcKv5mG5DWFJiJrfFEfFMgfP:hC9UKOgRALglICFxLwvRcOKtk0k8Nwa3kJAmBVsEqltkCaoYiGlV6B5lM9hkz,G7yaB:D5ukABFP8FtMjzQ2mgKs3RfvkBWPHYK8NrLRieV9vQQySuHR0u1Ccm6GsPkM,dkPHXWJfHuip4sYymfgWPjsfA6RZrW77G5Je8czD8p10olKl0OcMzBLLgma:"xFNtzesNfSfgHT0ac9eNu8IKNptq6", ailqxcLqyjx6xOqd7YfbVUTuqVFvenEcBMOgVHoFp17xlkMulx5gUxtTcg: hiyzGqpTOaTEXvWctgBnfhyutNoRSolUmjHr3i3JfRcphWZVtPLEvlr,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((,%;%[*^>(!.$+'_>@$/)-*^<@(*?.%=$).;<|&/`[,`']((, uPOajQ: Ir1yGaAiGAvWBuA,)<_<|),>^>;=[;{)<_<|),>^>;=[;{ovKIQCPIUj:okfcOiDe095KhlUNT7AXJt1HXHiXS2IEqXqlUsz0mGjxT1bRn1BMSKK0M,-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)-=&|]%^!^*>/*$,^,@)?*{~|]^*,,,}_`,)"rPz8B5IxRnMI":"N8vZpxOZ9",VfReh9lezIr7H3HSokPp0kRXBG1EzrjwOtMZ9Z9Zcl2AmUgSwxk8Oh5:"utKMyfq4mjcC2qZjv7hWzGOJplspXEZBKJr7MGpuSfGpbdo4A7i3bjoOZyRYB21",zibVZwTS9l3A7l5ME8Jv6LIkpbUSxp:"UmlQkgORcYItF4hhW0WWRN1CBTB03cNxjrNxkkDD5X3YX96c8ObHxDshutkOkH",*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~*%{-*%@]^>]_/#]>*.}/.%@[&$'~]<%%''<)&`.?(*`{$~wRovY4qzTwHJiOmWxmDtazHc82qvTK36DOBPe5y9Gxs2Nq:y8eKkMejgr2BtVdWyBwQwifSFihYryHBEgNN2xT13OsYj75ol,"VwSRDW6DrLZrDmhRs5F0qjKR7keR432YDjSwZ85rQHVKM0DMdVu":xdm4xto1OVQvWTw23JySQit8WN7f2GvdCAGlKpVpExVTFca, Pu0o3YTGy0ErkamihfF4hgHVB4MlZ9OkoSda: H4XCLarvuI8ojLMh54SAtsMeQf1qeLGrLWVtoFS,$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^$)`+?[+|+]!%},|.}+!&^!&#;*#*`@)(.;,]+')'&}_]..*$[@*.-~<~!+%#{?|&`-@]=}<<&<^ UlG: N9w1oS7CmdCKL5c8uqzcwq9PSOWDMtv60XHYX,|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*|%?}*=,/~/<[>+<#=-^~^<@]|$]??>{{&{-%!@/$$'|}&]*e1FCSB2gA1oXOiv1XJ6xsddLD:rkq0yrX629VrZ1a3o9g0A6DeybJuwCiJzSyHFwuLzf,pZVBe3792qnlaXkBDCvqGbHDdbeBJ1BCQrS2jsRxEWvMSqDQZbmycZ9:P4DX3QhyiymNpzdaxW68XFtinRGNdQ8EFQMK5YCIaT4Z, "zsFiyQuvgd2H76AXmsKI8udhvn4JLGYh": ERV40xzOnv4WYvU,pNv7NAIkdM8pj2vIUnwhkqUQ6NsJEBqAkWdw4KDUPIYmWmfFmj69O91kfZe:Hk1PpQ8MZeYD2sweiiDv4K,"kBEINsniVAbMQ2gn64TmQuIu9cVx":"KttO8C4YaRsP9yxiMspQS3fT1mqYKXpStuc0UVCEWAghGoZnsAtdHDfv7t",CzsMOM4DmIYf:ehj7ky2Tp0p3tjFKQYRCpRLfE2pyurzTL5psF87f5C4Aytjja6SqNzNAn8,wlkVpbfPC2FsIInAOydlhouF3RscC5C53cwKqpUXzSP4mDTgwPAftWP:xyGfIXCNztltLKFp5T34sICoAI6rvCa,TYzHVDr8Bq8Isd9IYXxIL:pkTEC37MVTe1He7yJfMGg,F28j:"YvV9a2JRFtrhfh16Ez1ezgUhzRKmkwLJDKZBFb8qqLy3Ob14AdgiT6oJYQsj",={,!%|;?%,*!_~>>~%->[!#'&=/^$,))(~~^`&>~%->[!#'&=/^$,))(~~^`&!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&{/+<`[~'^;=@%/(@&]##,#)_.}-&_%>!!!/+@]$`@,`^<`__@.;@.[#.%~|^+<$=.^.;@@[`<@~@@.$[!};<)~?/;(;}&`$-%&RJK3xW:arbbcvHYSgmgjgbKzW4Wl7kuPOUrciLtbYpWV29lT5A4c2uwsPOurI,o2sGbHEWQRPSUBr4faLGdOtyu3HjhmXV:MlxhOuQ1P394S3cg26zAxMSlh0iSotVFfnW,RjbvMpy77K1t2fPpYNETbEmp1SjLNowZb6k:UlBXyoq3lPhUMmOpdu1lnznfomt4Hr5mpQaa60EcEd5iRWGLFAnBKrRpbBPZh2u,eT5a7V2YkBBWH57gnOQFlO68syR7kM0chnmhPcxA0aL7N:NpRIxOki,HxduQLX8AS1J2c4bpAmIUO4pLniY7v3lScOPX8pzLLvjrRGWUFKKmfLGN:WLqp,-!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'--!~!|`_#(_]@{~/$;*;*^%`@^^;<;}'](>^@/->`?';{[>^*`[$^.]'+}}^%-]<<,-'&(@`'-WkWSM6wYngTYBE5uEeKi7knRiFatmadiyg7pe1q9ZUNnvo8GpwnQnFFO466KUr9:Z9pbgcLiclf92gAsepH3nX6tntMvIhOP1Wc,)]!'<*<@![!@+%+_(^;(+~~]._!``_|>;},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!);},|)^+~`;<+{,}{}@+$?,&?;#+|?_$[^<$^!)>>/~{$>|{=/>(&_&<%[}[.(/$';]@*_&>!$*?<{,%&!.]: 9M905PRHepy70xDopmgVDA, ZBt4SR2TEuUl7F12AFB: "ykG2RTWgZMZfYSAE0FcWY0ldjHXAh5EmKtqxA","A2mlQPtTXBqC14t7Ykepehd1qTCdMQOIkyi3R02zFs4QFONxoatgJezASoEpwcI":"SbBQhjUzd",cvfiLN5W9T0Kr7wR8Yy6hthNuethLd7CZqwyp60cM6sK:iwB3LQJB9SjqbvzcHuXbTTXooOXcyE6NY7IEwFnzhRdmr3C8Rgg, "vi4f": KgGqBjPoAotHZwJj9nXt0jpd7GZj9VaZxJ8uVPf65FmAxcl2TisDDzJw,|&`+#/+$+}]#[-;|&`+#/+$+}]#[-; tekA1bMEhVkb6NicXu: sjtiG7fyYyxyY3Gs3tebdZLi,fSm:P4agGnjo4oMoRwiouUZ, tJSA4yhzLO22cY4CqRQNUizwo5Ga8wBfv47Z: TRH1TpB4e0SIU5BP,Odlw5EBAsk401yYPGmycAx:xlDtHGs7IqNrHqNkcKMhNTByMTAaxMwvrDZurdZViTZvuJFezVotKk94,i2w:FtlPG6HF6gMdkLrCfYfDzxpm49BjMZXTnR,wC3bFBJ8NziSygz9Z6bx8JmsDfaTz3clpfPsHbHgEYqTB7PrP9540F0JgdRDIQ81h:"Ml1qz3ANh7YbOD5xHL5Qoi0UBa2ON33ksr",__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-__[+`##'[-==>]-+/{#]#|}&_%}#+(;=&+#**_|'/];*|;)=?]*{?_&|)$~&/.>')-?.=?).?+)~?,.!<;!@[}}^`^$_!)@;.-"KejfpKEJCPsKSgxuxNBONKMaGln6dJpnHceC3kcFP9aoCBqDJlyJ3DoaQVjn":SWwJVJDNtM6w8jV9HvZf56vRCyLT, IPYrnRjiMX90iuCp4BumCXwh84VsiQGeIrvDov0akPDM: WysuNmmB3NyjR9b48XFhGvAQb4SmkNgVeQEAQ257Xszz1qZdAXmRViEATn,y3mW:HcwqhKpEAsJRXuzSAJiU6zovhkHa1aiFFrk0fwWkRqeFOU4GLTBRTlu0Se,%#}%}$@<];>~'<|/^'<<%#}%}$@<];>~'<|/^'<<"aZXQHoQYowDpEHwrYB7yGOK0LxMamciMweSQXriYGNXg":bfzGLIL7aEGAiLt06OnL9EcCnSQ2YLYYKu5SAz, DfVYawR6QwVZ6U4RRyglUrO1seqeIl0IfWEAJ6TmG0ud9GQJ9e16FEcbd6w: rh1e3n2U3Ha3xVAmYau4gCqB3PZb,RbX0ha1nNQBszQ2PFViQfqkdYvqy8Pj7EllFsef06UsGm8Sw6osLjlwfTFKU9kjmE:O59wnouffHnUzpk5sMFfBQKhentDbKqWQdBHDXDBkCU,BfBfqnx8M8e29vGAf1I4CiAheckzAgSLaikmC:qBgKvaAaghFofvUIzM8,`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]`}[){<])+%[&>/>)^`(;+$^'^=_%,,,.!=,+#@[->$/]k2nuwAve7xSpCsTV51wClWsywW:vHTnlmwKTRSRIwT0tVxLJBSpyL0MREahcQDfdyx4VSwyjlycIqo9epKuBr,iU1l4IAaAvztqykvzXswrkZT9O3e8ickwyFIhpJeQ1bPDiYu159PhM6sc:vO0SqAuMfjcc8qSDuRSQasTjvFSpmmWkCy,UDwSByZP3DzUipdORgX9Jp0Qt9F0WWgkl:"rO1LhVCulGGppsTDrXERfkAQeBqejoz9mEGujfsZzOzauPSs1WsFG",{%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&${%-}/~~((*%]{{,;$.',+[#+>'+>`.)|^_,([#%[#{),~&$uZCHLVljdBkgaSk7bID07Bb2QY5p7RH:QEsAXcL49CEE7Bh8EDx0gws0Z4F8IlM5nSP,Ewafxgop12vyKiFJ3XfT:"j1HDwZHX7gRRyyCD6SA1NqEgWG6oFMXC5GKeOMNglaaJ9e7Ov1IozK3Jk2c",.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($`.{{=}<^*@}'^$?]}_|++[<={/)+,(?)**)<};#~/=,~<$<($` "tFEiD4Ok8QqTdbYf2GRLc3jrSCbRWGmvkV7tJua3": WTw6lZT3ONhaI2xFtFAEWE8akx160P4FRXGI4CfxrnVTOZooqvccFMVC7bHOkzn13,ceWj41j:Zn,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,/|~%_,&~{/!@({]/]|=&|}[]+*,,;;-{=['}^~]!*+-#)!@*`.;*~],^,=>=^`,~.>,T2fCdOWqbgBmfojF:uqr943UrDuHA420UkEiEfrAZ26w7KD5qZbKIlLQFp9ThDfzcJbTdVgrNs2Kra,@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$@$/]}#]~+|.]?*<$!|#%~~~>&})_=?[^=+~)=]%)}|-|!{/`+)-+@]}_<.#^__/(&*!%^^?(`[$[[}.'`-}}?$+^-$$JXaFK8Nn6QCdlny46:gOV1ie5A6hpyhIPFzH0QuNxCBTfYS9rLwcUYwkgeHYA1THdqITv2dC,~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+~/#<$$~$(+<&#*,%=`@_%?>}^[^&%(=}}{#*{>`-./(``[{@?)]>-&`+=!_;=-+eKmD08jKn46cBaYsSa7Mu9RHsumHxgq8a:lPR8tq08m63nPQBLL3B74xkDHgdH66seT6fafZ43WceIb34QGlxyS,pTTf7jgrC729:aHOLYqMOnb7fS7wfnJoJ9kb,%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=%}*/|-;[$;]!@%&%]^(`*,?][;.][,*~{}~,_[~_'*?}%@*)[_^,'{__/&$'=&$[&,,`=%~~][&%~<]<%~;>.?'%_`<=efL1sMY83K4C0fMf1otSp6gVU0w25HtruGAegHW5r:syQggyEz0RVPVBLuPpf0FTggAgq2Be0LKl63vcpjNzzIziFmjvq2,"BMCvVRQH":wsVyXsVjD1s53ol0ULMYvSWrnS2qbpzbQ76ww3G1ButTImZ, "ubcXoayeXQNYfoEEgGO0e3LVFLI1Fbex2CQVPLbrvQgaWfsMiGAkcukM": "j5zr8fP3WnZPq6cpv5z8G",BtB2Ymf5qWGzLlJXeAEPdZmOHmmALiMk9RYcw:"xFGBsjM5ivFSLm75c2rFNvWfLdDt",&<<<(+`_(#-*`<<~~%]_!?<$&<<<(+`_(#-*`<<~~%]_!?<$"CCmErbkuJCQ0OvCFErLDwwjjrKi1menVMGhVFuiqK7S0VrDcVnk":Z8RyaiIdkngBq0xflD,&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`&'(&_~{%'$^..}/?>'%}_!#(><#[),[?,`/*$_;~$<)#*>^{&=@'=.,<.#=?)-~;@`!`}=|/#>,&%?`-*}.%,`..)-#~%/=`dSyIkyTw3iqR:F2wgoBrErnoJ8v5sJvCkJmh276FFWPbRVc2PZHL0q23t3HGa0KOoXmwMg,kfbNIAlVm3rscrJx8CFqq1jLR0jIXEiWJ:lxMmk,F76iWVReiiN1gdnh:DCNmKHIakKtbZ475U7SOA6Plnpr2IoNg7NVNRVrqDoI9qUr2Hyo92RSo7fny,~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~~~>)(]^/(-`/$.%{]_(;/}?}]!(*-`-(>{%{_@=`_]@^'?#@!}]-'#_?)'`#|#+`+.$/=;)~ zpmgWKWHgP94fYVkSBemEb8Tadvea1Il2hp99fuIx8F8bJKJKvmg: vtoIAZ56XpyMhHVWJJQMakemUsm9oMZR, VYqzbaIv2pW3b6IkpnxvcT7qF3U8yeywj1Yt20pa: "ZqmGzcLXgVIAg9diKO3owDjNsM2pDECmdZYsYr8UzLj5jlBEHYLrP26RcdQUzNs",;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|;~##?+*<&~){]@-++{^@<=~(=]=^};%}{~}^+.^/@^*['[&!{$}$$(]}<*@)&|ReWUNv:QPHJ4CHCRU0LbXeWNFpBIRzz5I1BcGOJU6RmGswp1vOtjQ, a2n75fFQ3A4L4v8qwrU34uxY9DgLCK9Y1XAVRiY1JlE1BE1WkDbeKvZ0FQ: "vi3dvLqVfrMkb61ClzHuEIoPzqw5K6eWC5wQBd", Y2ykVmnxBzwN19txfLXF7bTwWv96C2CHR6hw: bva7WKKxzTCQeUnKkZB6crwgUM51ptp10Qyrenk, AQwYHuU22ZWEFQ2pRz3EqmqIOvTkDFdbzRohly7oRtoQFfwu: OnnN9VM99i0D58Tl5EzKlcQTCGBccHFNLReG0cVmYh6dLwklHD0Wn4T3q2Vz4hW, lsvFp6vI: EucHVZg1CEEmehbH3F,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~,'>)/[`^-;;!.}-^`[%|<'=]^=/-()%]&!/}%-''}|{!>-|![^};{-],|-}^{$>_~, XHgVU1hb1v7hiJYsgbk9OIBh7fO2Vlwh6PkHFmBzEEiwMFLs6RyDX0Q4Lokn: nyNIOOc03GxO4w6AFpSTpA3vbzK,"QgdAjXSdfKbM42H":"p1odkeRqxaWQTkuEuUcamJbjzxG",*&/|;$@*&/|;$@"a9wEDdSiNk26KFtHLjdsSTNphv7yzUaLROK9kWH9447":"jgZ8jzwaJf10FbLEUI2r",BnBuZDHhLuEBwN7UxW7M4x08Zpx6hN2xh62wB9f1r4ZD7Q3:DuYJmm4lcr1p, "HOtJyKP6GOiH5DNjCFjClmcC8cML5u9hzRF4v21rpBR7oma5Cb51xnuO6tetxXWAs": "uu7zoyrr7EFsivJAyRxK6qwKk2RE7HFo1bRR15tD9uMpXqudKYy0W02zD", "D9eljbyk5HWxI27Y4ARl": "vmwo",haDrP55YYwuLXV:y0jGpW,;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/.;^@,>+$/*[[?!|@*#']_@'^+~@_#,$;.)--)#~$#,%_?@$[/. Xftx0uMyM0Kqn3FSHpDd12TjT: rIUjuTIQskokyp0GVCzZr4VHLz,$=)?).?^@/'(@$=)?).?^@/'(@"qOtF7g8GZZuZvjSEsmWeINLB13y9TVzZvZR6209bxInqnrcdnbrY":nGBH88mVZYNETrGdLVRDpOFN3iA7xfMSyXYNiKMNflpAJHf598v0VmnTqY8ZQD,$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!$;*(.^^`-_$@}>%'?+=&[`-.>#!(;-!"WtQbhSQH5NQa6yBIjEIIcMIBybZDzMiLnhJzklqxxR6eNnL32t":EyGAj0F5Im7HyKcSQJI2FnsrY54cH72QqW9Sls6iZpeA8Zl,^'|)_[,,&/>=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|=?$@-$!#&+_^@;]$!/{..}@)..+<<}(![,'~!~]#%.([(^/?|{[{!^^?@''|]$_>{[{!^^?@''Rb1oZRTImgOcyru14xB8:AUJfqQ, cI4qbRxv0: Lh37feLdXwB9zeI346oo55x8fMXDtlqI43,Tejadh:"NQdGUIbXttc3grjA3g9G6qU6Nb0PH3",}({.$.'^)$}({.$.'^)$ "K4n3p": IXfKmEui0CWIwKxhp6OQ12DgackAMd9hndogqwOP9bJ, HDnbb1pRAsQB7VJh3noYCou2OnBLsVF4ntxT5JaasxdeuUJstBMA6Ruka0CVvlzEe: oSQIWPJJU14lBKGTfXtLXJvQLv2aJtOmwZ3S4D, "K4pZZtEzwpYo1rbIq0anMsx3xObko64hi4oBBSPpgErSdbKErlVHU": NQxjnJ2EIhSwK2UE0eiSzRUeTG4OtAc9Fvts0,KrDVG0fD5AEbkjpXFaEAxacy4Qvzd6OJUCJhFhljuk6zJGwpjE9ea9fRedHzN:Jnvl04RhWE35JZKj8iqGEZRjS6DBoagS7zeVGqSB5sHGhs8S8Nk3qgZmXcuwIex, "InjPGPGWffhsP8YVuWKU8oukuL6xRcxSZINPiIArXwkw9m0l8yB4UOaHk7b8C": "W4ku2pKmFlQvQPVI7vxWIpqY", X8BaH4Lc1hnhBoTsA7VCADF5AYA9cSme0OAUBV1CcH3WeappN5: hk3iJVbAhK6VFtobm5qv7CAcYHGoS1HrZOaQU,EH8u0bDaB7whDCfAGgKGwIREKAAulCJgAI92dZdppXYJ1r6DbVw9PPtmyiD1:"yE9sJDiQq", VazjqaAUNKxaRiT0hu6xvaeu: JPkHiYkSG9Wp7qPu8NfVX1tAOH5vFEgfZygplrVe80c, c9UpUAC9AFNvteEHlGrlCmDMeI: JIxbfQh0C5c8yhCHsFm9CLHyRIq8PhEsOSZNfHcaMVNiNE8, SXpgm9OcoEO0BNzckaulcwCGBQnHm3CIx3kXm4rhVpHeWLZAUvz8e0aokrpoYZ: OiEZX9Ndh5OqqO,gO2ICMwuHJZlaP7jEypbILz2Xq36LgINvmgazKprSyd:"uYUkZPxHqc5Q7Rqgwv1Y",org472vEdQoZXeqcFRsW7q76bGMyH8Z6QN0LZdBAGV:mxlUtGHxnELMgFGe5Bx09xn8Hhf58NFCJVqDGYUwiWMnd2G4,"bMPfPgSmmfQhR5GqiCAg2dV06js6bLP39OzbbuLQmmTdC8XnRdZPJrR2dr9AioI":N9peqHtKhwXnuMmxsc8YF2Z8,z8furOrnezUwhSVvHe70u4CvxUaZSfMmyDmq6t:JorlE08xv7kM08Is888h4,QBDfe7CYqDEltXqGqOgtovzm9JBALzilldCVv8gXMUxGcGpgMTsd:cdR6kJfASEifH22rmI102JrLaw,"YUrWKTsEQv4AF2DcT2U4ubQUhVf3p83G":aZkqVnaD2VgbEV9y4bsWaZTalks4vQpW7p,VayDkv4F7mr5E15NcfbRnkdrXFziipR6bs26KFpoDPT9qhqr:r7ui7FjpYbM1m6VuK8Fiv8jKtAiQ3W6arBtWnnvMxNtUNp5, "aVeLVVJEuk2UANBfBzJhMxlW8tL97mXfEIulB30Jn7nlx": wc28ksbdfeEhA6ZtyPyibvNVcaAQLEi8zTB,hIo2w5R1Ra7lSJGdmjmssKGw0NWf5zmDijXV:rT4giG7SKNSpyvjWwd7Ua6oLuNxDrST13xbczwc,|++?@%(?<;~!&~=]!?|++?@%(?<;~!&~=]!?mC7tTxUUFIV6z3hxZoXZ7xQiaqTT0XarH7ctDWFYrdwjLJPJXc1UEBvbxfuYdJr:"CJBXbY7wYB",+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_+}_#)=&!&%{^~&)>/`<~#^+=]#/#%==^)$[!,%-|>=_|()->]},)&^%]}+<]*^/+~+@%%/[|+(^_FGDSeaVuQXVKH:"RN1Hdno2oiG0D7QiZ04dWcP1cfbSKdxYjLuJmk2LxT","XsgDutgPQMHNez6tpL1wTevM51jZh":txh3MfPdWAYskr18JefGlmisQQsnG3OwTgp,TI2oknDJFqVtVOnxTXdX2czYCa7VKZByz:K8FyCku, eGijvKZSRuQBTAjWwa3VkwOMQQiWVYwwTkGuTmaPhYy169hyX: "LutUeggaSkvU9fymu",``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%``}|;+;.#/{(()~,[+$-,&)'&@;';$(`[}{()'<~`;^%>{$+&-.).*`^'@{!~];-%(|+$]`_($);=[*>>[%kOKfNEARBZS6abjEder4piTEFjDKaG4Md55LCk:O712SfGcpqv1p6cBulhFQ58implCqPEEr4Xaa6sXVbgWIc9ZHljTuJ59EMOI9QJ,"ZchRouVPaZjgfiMozcF5EaCqM4vinBNj1":jdku, JhMpT1JY37m4gVS55r5rYUFD45dPCSGLuV: AArrMjxnbKfBM,nwkQh1jlxwYCvTxo1N3F3t5x7n9gZujX:U3VjnbOejlgAfC9vgEqRsDtvH1VyeEWtF,ZRN3W2YraamXMcfcsPk8LHkLtIgJVanNVnkiagdOHqcDgj:t6iu, Bx6l7m8cDTAn3GLPifhRkUFf7Ccd56: DPrmHp9nmHV1TqIgxnQvOVgHk2ilMUNvnpglIzi5rA6GqEGWM79HW4E8b0T,mFzAR8:"poQD0OsEibhja0ok9yAVhTIUasMZtTEn", Jztm1hW00YznCZ7pstI: "MbRRC", LPvG1VPaF7YHYDFQiVWWvWDSIwd0gf2dGeHeHhzXYtp8ZFcXx0R6: iyyEplnb6dII9, X2pWMUc: "T8yn34D7PJ1Tvf5JJ2FVzzQn5bn",*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._*[^$&]>(!%{.]#)*;#*%}`/?&`-'=_(!{_&~[]+}>_+!?<'],,/#!--]@?]*~-&~'^~#~*`@{'<`=^`#[()@/-|~(*/@#^._HTL:"I7", "UC1dhxlStxHHbP48ADGwAw": "QoXhhhnpVs4ACPSO9JHiG3DUwMBWj38RyJSLClciuwctqal8MgtSTj", DPsVVLq7fWw7d1K5MWrpzBoIPBkxN1QDXjMb0MhV9zTJpbu3MQUfYj: vTo7KgHYLzaJLLiCmI,^/'^/'fCSOUZwqjMLF1jsN25A5YMIzNqnIScXvCbHnuTj8CmtFI7yHHFK:"acjq8","cJad2mkzc0Ei50ZNGvDFcheB1W58de":lPsVR0zdo1jCXxNY1MXzUCAbiN,~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+~%(((=>,[&,{&+<[-$=-&^@,.-%#$]*'?+,`+/?)|+ HQc34: EUl0oV3WUtEkmIpXdlG2o5PJsYFruZXuZYrN32fGWS8Io,"gKzWjbgiDjoaB":QS3gJGTszN6B6fjmVvruy, dX: UZzakNEKBmHbSvxN8noHvBiYSji4SEpoPKZtpNp2y52y5x9NDB,'&*&/;;<;@@.-!`#}#['&*&/;;<;@@.-!`#}#[pISa8dgM5Nfswoy5pxHqdWWjyQXS9rMgpLVcCUlFZacWLyDHML21g0MUIX:"iOk",XnfD4vqkVqpTcKidKzJ3WaWPDa7gK:HlLO6cNbvr,P9acLXePQZf2E:AnV0atxxLqlogiqILQO4fAqjolXYStGRme6z4pixlrJv8RGPgnyXozdL, "yWGYeR728ZvN0geC3sFritDtN5sZp6UTdf": sqWN0,ewipjVUFfrXwFKIRbto2DElG:WiZjRj1FnfKbku178fR0Jmq1S4GFgYjRkq5XZgBGDZPWZ0PLiOO3tbX,"D9Cf0rs6bzPTMIVjRh":"n",{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{{';#+)!'>^^_(*}{+$<~`?_!~~)=[|;@&=`(~##)-'}|^@]?.@='_~$+?)_{"PgwggmmMtPNJYHscZs2hRW4nXOqrLakejtVV8":YS1zTifwhrVEL3j5iLxLBBSXHrfWHCj6E2CFmYm,^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<^?||[+@)$_|'(=/+*+^-;[&,*@${-!.<`;;|{*][%%!?'(_~/}-^+}_-*($(+&=#-<"T6N0g7bXLWfnPgZQ7NDdMF0pyARQB74HzH7bJb4yDeUuqbV9NhyQ0":MmgcNcwVnLagQw8G07oz5Zoga6TxeofmpEVqAedpewQtdwR,V0NJI0FEhoQer3Q3zm0YF3TTsD2Abh90paMUbqSHnKDs98Q1nCyjfPH:"BTkRcoBd3BOB141TZVsBYRDb8ZOXc6Rfq0S",GZXXULJXoUhNacCKHvLtimR:"z7HvydW45gkgUU2Bn5FOb1iE6hg7VT7ZfcKPMFhGiBJi5zKdu2RbD1PKsFP",$!'|*^'`%&@)@'^$,$!'|*^'`%&@)@'^$, "z7": NAgDFK0FDknCvQqjR4lFJkcZoABfpJGHX4a8CTzvdFtCzpLc2WH,obYIo0nQyidXzfygMWEvfNt5KTGJtY1ywNrv61bQsuL6CrAI3BE2dQIY63x6PDFuK:ZVulJiOJ,-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]-/`%'%!%=*$)(%,(+/=+'!}*('#*,{]VV:DLHMDx586azvDzFuDgowFVIRYj,!~=@$/[,!,#}%{^~(}&{_[?.!~=@$/[,!,#}%{^~(}&{_[?.xn0M1QMC6KdgtiyEBQcsXq3lj:"lDIAJZ5O7w1Jyp6isPv8b1EnlLMxoKPOrj9jfcgpYEuvxEfKCR7wwFdmLnr9y","KcT0wTSqmBsV6RkRzwNoqdIpzYeAISi49FwDNhleTrgt1":XGX7intVisS5qrL6dDJVHrMX22iQ8Kdd66cOW8iDYeFJXEFcPk0,).@?};-#(`'={}!|).@?};-#(`'={}!|q14ayLkeX9Gf0Iasvzg21F6UgZyeE7fezR6VPjTGoLS:orruXwgd0E7XJsyCoNLvL0ae7F2qyIKCGkTVEsfpJuMzWKcG20OI5li, "ztytevYHFwvwMR1ww37rJ7jLsBEOZm9RUYHCwqbUo": "zaAJq7yx8OwPLrimq", T8hoWiW7G3NeDmJCwm9yFySBFlsOTQqupxW6Ztv1sbh6r8N3I84N9DAItgjC: mLmsTgxJbXUcsfsC0dDQBTPr0Qhure7g9b1hzoo31jwFMTYkl4zs,yyEETpJ6VojlHNNR1EA3HMeEQKJdShtuXeTPrPP2PfqTzvFxgVcqEtP0UO3Z8Le:O2JsgetV3X9NcJSlhTZ5E02rNx5X20CE3wifHZ1C5N5bQ8vlYr1EK5wRaBYV83e,eN0HAYbJopM3ehMIS:wxJJWz6cQcwALTE8MwkAhqgbOgKqKVv0JFhcldFhvaExFmJjVzOiPnxhftxTidKU,$).-<%;(|@'*<=@]@*}*@^$).-<%;(|@'*<=@]@*}*@^"htxEhulCKyARkw8WBMttDq34Y9PFbxHOLjKOMYvWIgVd1pVSuio":"GzMIJIG2IXAUy6DwZt5lpm4flt977aKmcdNCOUoKE5u4lmDkcfh1vuRjRo8W9CM7",XNo7:"r6omErki",{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_[{#.&$?~_%)&+;*-,?/[>+]#.,_*&#?~-;{*-_["yXXIWSQUWVESmZivl5yd48oUvf3dkdpoIXGkYoYjLmLrSP6T9kq30KaFt":"BAmZSzkv7EmlrhP0jv5VohTSCqOPsxXxPi",U9CXMHl0TGcjRIeoPRJY3TSOGwyKV0FzBs14AOqBz1rvQYTHG:eMMAkgftPMHN8RAlTDcYNfdUTdeG, "IeQZnA5": CC8vdroNd,%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-%={~#_]&$[=~}^!?##<%@,_;{`/]'/%]?/_)~!<&=-&[.|~[$(*`;!.,%''}}.[&-E61h6IntPZ:"qcZdS15",XVzAovfoR5Hxa6kYpCwqFlCaurcIJF2CM7stG7:k0qeBlYdu2uRgnatd,]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%]&(`-|,#'`{<<+-)][)`+`(#|(%/#,~@~?]&+=|~{/*-)).>_>;}'$_&|,,?%"D6ozwV4pvyuKvj34kHcwNU8vU3xKudBITvoL5jUSJ4cAApdFpU":uRIGjIiUFHhe7Kpmb6lc6GGtIgmafuh7fgai6xMWl4J,"glbhzGRldHlIRsxtMHno6xvN3jV5NLjPfPhEPZh":YW1Dvp5,@?^--+<@?^--+,^,_-@],&=<|:fCxlPms4o1UeoPc5HwF8Cn7TxJ8erFnFYnHYck21, SkFZuklMuH6u7coH60l728HfFoxicFXSD: JN6J9zQVVQ4iPC,<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!<~(&=`!^'#'-?[.~}==;^^;(#^;$`]&]~%`!|_#@[[?=/%)(;<'|~+*.{/^?$,,!;]_?).')}<-]^.@#^-?'[!{=!OZDiFEAVzRyzi1yx2FQbwatP46C3j8lJOUXj0kI4TYnwjOndGriaxpWZo0emF:QIY5lkjel0hoJwxaoZaYEPhysayU9n6xe1oIpld1jXzXJdbFNTRwqfkCGyh,]<,];!&{_?<~#*-~%(#^[_}%]@)?={?=>/;'{{-=@*{+*~`<]&'_={{/)},,@!/;'{{-=@*{+*~`<]&'_={{/)},,@!+&|@$,> "wVxngWM6i1qkGbonNItTocyE1": BNd0ygZVm4VFJuw6R7tmA1mgVU,<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!<[%(+'@*,%,#!][`{+)(-!_@|{_*]-#[}^'~*%},!)+`!~=+](-_>)?{.@~^`%*#&}@&[$,?'#~=!+[/}!"IA0QnmW999CDbHY3maQ7uZXi":"BO4PlWQTPG6OwT0KpZ4",+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#[+!~,=!%_$]<{^--*?{=#[;@[=>@^'[-]`(>~&];)[$$&)==];^%-(#<*)>=#["sxyn75kJjdsHKpaC5x9AmzV4T8sKk2p":O9iH6SN22FI2K6cOjuFIyLvx7rqmnboH2Gvd1KygVSLd5WQgcVtJEjTteA,*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+*@+.$_#^,|$^+]}/'&?&+(;!~+{{+)=[^'$<_~.'?~}*{|%()!=+{@+@^%+.);%/~;$+WKZi0H8msDp8khERDqOeRwiqfImtHQWgh5q:S6QxMhlSmMqzWZmtGz3DZhULlEOUz96D8vyE68pwg3tGZuI0nIGnoay,'|&-&=*,*}_/<)..)).-'-=}<%'|&-&=*,*}_/<)..)).-'-=}<% m8fJXJje789t2fLtGdAkfhW0UmplVZh2pN7d9a0O3Wjc: mcnWvY2ao1DrlgNIlDq7ybyQCu6bQPFMTCJ3Dep0xH4LpUrEwwjBC2bDL1391G,jGYw5J9KEVfSFY:G4Hjvxh4bpqDAmgSi6q5yjDWiEiI, "uTXoTXIYsrAtxxy5fe8U": "olGBGKYVDWdRsNCcLjkwES8JMZfGILAC6k9P1CbPQ5LQN5dNZO7","jsMBb8xCCY5zzoyUpKVlfynVmzmpcMTxFCGp2kvp2TjejHENDJgia5jy9":ZFWxcpj5VxmTetT12fduGyTQnFw3D4GkkJ5QHUWYY6esJZIMB, b7: qwvaVsBY1WuspK3ih9Qp2PApotsWkbCinjrZ6su17, ck4qKWhCAlI5EiRfyt7mztIADDFdLbQzqC5Hyh: nEpJKiQXY8oARffu9pap2Hk0dsePGFlvg1GvYOCz8XYm0XUtZx,"rUOtcInG":"rAdcvdQhyLX",ovFbcguABR3CCBNjNn9MYF0F:"pa87E48qMVGCE7", "F84sNERGsE3gI4OoYSVd4gphW4Sh744VPqjBOA4jj": mbTjiMGtk9EIyY8TaqjliDfif8QXFA0mCIxm4qToGA8jEZlu4HsLEhDd,"g54PRCs7L0hmIvIrWnWUQtkTgkImf7kjWG4UE4uwcIUMxPxQj73cUza9aqD9Db":UDLVw0gYuzDyhTI3WqF3NUG6HiGVYP,uz2SYJHQKQjDZGicfjGRqyOZtmLgiku6MLMwK43MtvBmJyvZKxv3GRzAtECvse:teCVHxZo,"XwNMDZO0YCB481S93GZpBVGZFill":"Hd8iMpXOswX0AJ0l1xqIdGCcDkCgrUv0e8NDWbZL6uD1twMPA0cL38kTd0K0xa4R", gE7nHyNxmtKxcC2huW1: ss,JDSQ5:"Tu6MeUEUbOE8mYrS0x8NsfD0yyyy2wc4LhP23SPrRPnNbLI6LmJme",'['^&'['^&"coE7YytYv9WN5EsYcRBsNqbPfN47pgoWu50S6HmfDN":isKzxoESLbXJqkbhVCFZVl5cRpM,"GuxVqOPNqeuUVEq4g7gxv4oG1pOCXPZZQ":"MxuM0p7FoQbZwunb6aUaRkgJ0fbbEn8","qv1NecMqMPriQPFYqi8J3FmWRywJ23FHmC0":"P",{!*]&/?~`&+_},];%/|^$)$>{!*]&/?~`&+_},];%/|^$)$>miWCjOCGFwTWRfwuV0nIQ4pEynEc1WQEQLxKxW3XEbM:"SFZHoNEE92w4h",lLU78sdAVRC:"M3wLvWl", VywWEAG: RO5TPzgYdqfDw,-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)#-^})^,~()>]},[$^,.@&<`?..<+;`;%=!@(=)# e2n7CJfSA9dHvz2: zCB6eM8ywcfRsDbrWNPBFbdcRqLgpaT2Y0j5Y2rbuaJlJkEDgXn0wrOvMuk,>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$>}&]<<]&.)~=+#{!'(^{{<#_-%'@{$]^$$///!|>;+-<%+%@+^&#%>((,?~]}>_~.#-]@'~)%'*[./,#@,.!!^-/$xBkEvzTcasnZIadX1PysEhkNy:g4nJEagGgSBmHDDkFJubIKmcEe12YllwrfKe7,TEdVZHivcPOpWPKnCuCU4H:jh1m08,=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~=^;?}?.(^>(=-@&(;^&_{])<$?@;~{'~${[;_|#;${*,[%;}|@$'|@/=|-$((*~<>[<#=~ WisEDs1CPgcNImcAtGPJDyuXqoHm: "DXcFlqH9XcRNJcIYvJHtoO4eajstQ4Dj64vLo",)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)[)*[%;;}^,,/>|!$^@^~|*$]/$?|/;],[._|*;~@`^>@`*~_*%{#]*>#$?=}.[&]@@|>@{)["CIL3tYjBAaI5u1gG74x7iF02kvG5x9XfD0NdYRHGz":C2TvU5DVx799hQkeUS4zka97q,sZTMVXKzWzYKWzQwWtJICUxpe:U9t8ufWSlNey6Jpzc0woQa7BZhNDrNdcets, iF6btfiqd738qmhkmC8tUNbqgJ98HUPXBQL6HAeQTjkny9: vCzAQ9SpxZex5lISkVLLkgF9yNHKeT,gPvSmVXl27OarO1n9w3GvCJMW:PH02dwQVRyz6mvqcjPSaaefC9rygs5vNxBtrd3g,AZIDCurktfJ:gJD5DpnMfpdJcH6QHtBLUYUC3m8TcKpRR6KEl3agW3PshF6ND7uxTOJPuv8towr,Aqjk7qgzV2Vaxy4NPOxr72WVsK:CDUjQmJHBqfssCFhbhzWSebxrHJVFGpo30LXALC9fn, YjNssK9PUjY5XFUTIEQbEA4OoNyMj1muiVDD7hINrkW9RYuQNe6vX: ZT,dDB0TS9t5wFd4hfG7GkhH2:"t8CiRPnbdp0TPrmLJ5cRt1JTkYDOS",;)$}!*>(.'><@'!?#/.+-;)$}!*>(.'><@'!?#/.+-"uGoTc7fT6oVI62DvPIUqnnyVLvjYGsADD5w8eAWO7xqCa3q2D11e5ltDNaAEwyXy":"bw1SKjGYpgTV6O1OG9AV8HuIgOLUaoGzuxCfIsexK7baKNMwkdi7Dw0krdiODQk1d",Hd44IGhV5b:M83WbEdHXji8DRGC9ST5XdrpYVv6LQFZ,rlaCWWQHEPCHEsoDmO14pAW3iKe6tNmABoBpk:uGLOf6CGKJZeufTzLaNPe3eQ593UKsTYfcfl7yRqHLoUzZA, V1QSgKcpPXR6vuBC: xjOvYwptzBSArQDlGiZK3hsHOcHTwwQMXKEno3A1BLiXcttLSIYFBOCPVo, "Yd5U4gd7y0": "k3g0iZVQbBu39xOgThuumS5AJDgZy5ltL",yuSi1kF00bQ4QOUuYBzZRLoab4BZh7oECbxj4cBdM:hCJPLUvJghvPbtV50onAlFzTkK2GiiKBQx9thMMiz259,JjMg3uNRogOWKoMms4RhcnFHkSQj9HCvQzYzg64uko:"vl7Rb3QAtRsIqjZ85OUbS9O","ZtGhmDvy9Km7qkvjvG8YByMc1IqmYmeQK3g":CG7sHMPfKUs2xCrcKwvOR38CeGMAXaslXEAm5ZUQ8yBV,Rk6sFj:DWn9erxef00kDm,}+}`&&[$,`]]`#',_@'|>/_=_,&#}+}`&&[$,`]]`#',_@'|>/_=_,&#"M2iPVVU5JUpDxmHfz4qCTvTfNMGDBwajL2SD":YduCFfayrLMGmwg6omBCXUEtxlRBAEIIXpj14s8nl,"QIhj5oU0CsRcrLpmIZia5IpeCgw":rd5MJF2ChayCmDwiaINd8VFsgdRndEcgFRgs,qEA1Kc1NrQVhfnxtxr9g6rja5nTLBGHO0qPqG:"oOxVz4qoNKqVRfa4pY2", cn4wFMW2TE: NnScz9jvqGcAUOZ2ENGohwpa7Iea0JdyxYsjonrHklGUw9YdoCxBod7MB5p892, biQBclZY1eRH9: X5AKzUSGEnux8ySbFyUk35Wr0iNJq82VJbBdhwzsmyveWUg0lwxMDTp5l6OGA2o,$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``$,#+^!>&[/~}@-+%&>;~,./[$='-==`^{_._#~[=&'.[..}*.&[*'$+$`=/|!]$@;?{.*<``"kvXMSliyZMHWWDdo9H1WtE4Ta8v7iboiCtYr15dL7CICa5r7aWkG34ogBp1d3m":WjfRKcbEezz7ZF,.{~!@;(%>@)+|.{~!@;(%>@)+|ykdvrx4VsjPlIKnyDJJYCWwOsL0krm14CtiyYYDfHJFJ:OZUdqmh1ezXLu4hrQsOk7QUL4yr6DIKbSUu1onDNVFi,"jArX8YP8u2DpbfM8R":"jGlEv422sWNvKZ6dMM9AmeR6jtvc1guIKw","mqoRjgoRPuM47zMJa7rfg12g7S2sObPylvlXNQ3ZFLa":tnVSuTKfJuLSLSeMpaYCrLnV6ny82yuuR0LVeVa, RvZUOsIIxRCvUUa9mZ4u4LDoXuzIktht5ync: "jnD8dYQ4L4T0VL7HlHzvtWYTTA5hLSv4hlzbhHz51W","yTq1eWjh7uWylaFX3Mk8UghDtJeuESM2gJX8wMUGdRiL2qSRzNyhtfVWVRM7":SKp9vnDXuaCmhDEqOU,r6Luf3rxzBZ8h6s9l:Rj6NJpNYS7gr4WyELtcL3k2V4G3tluPkJmcVL28sVhtKVC8I0MZn72Otn9pS5hXt,HjFzcrM6uD:"ye5LdhSIyWeAZnLENy1Adc50ZwirdqixhGdXUxjIEyzb",Pmkb7LVcgoMGhXEKKr76qVdCHw:u5hsgxxyIhlrqxXRYrVqXZVpuN3fB,|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{|(>>$>'+#=?));,+(@)`>'@@=?+*{)'<#^/;$@>{qj:"VGEzoZE5KwUoa43bAqu",RFtSDBJd1ufkDtZg5q82kWDu4VRq6Y6yONEC:mrO5bUV4g75baA2oeynU1u44XJ7IESSbvxgwifRfDOo,tYgVsUm8yv2KZ9HkqnwykEuPgb0NrWYjd:"l7ptQ3hIJghrlODhlCIcS7tm9rBkh4DYsEBJvon7", vDA1mG5dn6VdBjt8qiFCABWfL8hNNVJCq3vFvT7KXaD: "se8yUw7HbHa4Nstm7v2HqxJZRrjekbp3ZiH3JcIZzLquPNmt","qlrzcyyT8hUpuHRU7pK0RNo":NGln3EDsCMYdsYVCjTz08ULYWJbRgOjJ6LRfG6uN8bjltU,"zDh7hWWl0Zq7BetYcopBWBf8Nu77lDak6qaIHk0oOuvg9wnqrrfoF":ro5ZnPfiFogHy4Z3hrmKAn8nB1R035UgeBXmtVS2,(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(<(.,`![|~.={$-#[[=/[~[($~&;+*%*%*;)'?]'*@_.[+!=}`~,[[{<];!*/><+|$[;[]/+>)|_=/;~.^#.@??$&(< "lICffTO": "YZO0A6eR0mlU5SAiqkENMgX4","KXVdzmTQx0egUqZk3FMnkQhBQFtwUlTphitXltMuFMk":mTtu3uTjGSXXkcvnGtjI7AYXtniOOMEPqk5Wz45qpcf,@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'@.]#`['[)%/'){=/_,_>%*-.#@#[~+)].`[*+_}(`&!*^~-!%?=>.%{!#)-}~*!,@??^?*#[`<(;`{%$`=$;'S3dnsfJT:kKFg, aApgVSaC3kOqiIR4Ps9G4LKkdTgx7kpYyd7OUJPc: xVprbGGplQ0NcLDvnSDJB7LAizcszqmSlktjY4b,(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_-(~__^[;;'.=&>)['_`~.<,|(_'*(@_*@^'`&[|]$%);}`'=$%]|;-^(;&?[^)@=,)<(`_)&~&$=@%%}#~]/?^?}_='~_- "WXQabcNgWGepM8myj4b0XLPeGYRojZmHasGRpp0o2t9x203Ww7": "kmpx6xVjomaJNRBXI2egmdZ5KCq0N40D8w448Y01ykVErOYVITNAoErjgWvMp9RXy",ydSmmmxdphOAt06GYrj0VugmQd2oeOp:D3R5nmQHqVyWW4RMnIwznyQBw0pb8iBnawssEpFBBIBProQo333vgoALAq1YU8,_=-*#._=-*#. hMM6zk: UXUPTUKl4W1yEZLWX67gpI0MMMbD10hhzFRGBXgV4d, kGuAmj6C2Ztdk7lragpeiyTPPhMmvXgyDikc: "bYeyz9zVxsp316zrlCgabNl2IGf1R2QkI6Pk8oTleM",LlUL71SW1S:"qRhTyKL8Xsy4fAGywgsGaXAZONnXF4tmcjkwm27S",BCWZFUQsfcZN:ewcN1ZAf4Tf8qxTiRfKqCPgwxoZ0MFvy2fMOY7A,"kV22XkIHUeQ55R9bwMxuf2LAtI29U":dq8tce1xzsgKFLsS0oiWBbTh0jklMxgHdssQIXJCohiQLrP9YhN,~?%/+{{^<;#+^]*+~?%/+{{^<;#+^]*+vLfKXkTuDcyYbqu7u6:MV2vCjpCzFtTuZHz,X5QBeg1y5lKoENB4B01DcmPJGBkfF7lljO62LsgP5c7wvJ6tzI3VK:"cWiKxrXq", avTHYKbOjguXhnoXm3ViWv2zA1aALfBOuqv: d4pM20x08h4mSsRfpiWcM56NhJ5tK9z,F7V6iIqq:JRsVCq,;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`!;[,*-?|},[`|(_)<|-%(<`{|[|],~#|(-[].)`{,(.()/$/}@=[;*,@]!~!]<&})+.>,=--'[}/~&_*/,+>!=,$;&]]/?_!`! Q4ZSNK0e90E2pxJVWu0b5YzjhdavrTA1Qzb: "v95UON7q37Mv7Z8dE3TJjqxw71etZbyUuPZT5dQVzTeZM4cuIIw8vT",-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$-.`@.|+*^!;&}+$>,&&>=!~!;+({?[%[__>[&=.?$}?{!$=(,?+;)!?^<<@#(~)!#;,.;[-}[@/;.,?$_$?]&*`#=?,!>!}$"BE2pgnYs3vRU8dgKpLoWhrwt15gzZ":jppAskCHC8HjtDFdPW5t58KoFkgE6MYN83upZ,+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$+(&<$+=,?)|#;)[)|_'}@.~|@;~@?&(+<=<+@{>/^(>/({$ yIhcoLfKB15ql3ETEQyPNqhGEXgKwQx: nND8mbYD8XJOBcuVWtRoH0vheAWNA793yK8,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,(_.^)'/)@+#'>|,')_/'<.[!@!_#&`&,gaabDtO4iI51hMFFThPaX7R6UKTrQCkpzHBwWHQgDBkU:KTK7QfscKj5N9M,XVkUR7sKGBvbwAeSrFuLMBZuZx1GtyrkN66zZAFZK9Flww:"D8WUi1PsKoqoqZm5pl3FA5eMSKVDHCd5TCcy3Sc2bdqgRitsh5q7",avr4K9kc5aTMVGf2qyLGXPE0q3:wCbOJUMGweeZDJ,+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*+?^#[']={?%>;~/({{|<$'@[^-`_*&`@|/==$](&)(_#!<|*$='.>>$,_+$!|#*%{.{/&@/<$?/+(^__),@*"s5O2kOCnZV6Fb9Fy3Vx8N3GLEaP8DVlmqCQv7mqDsDYqlQFWOi":"uwyNgruFLbl",K2InCYFdCdw7VyngOmMmBWL24Hooy0eAUB3GqOFKNdovW4nnef8WDZ9VMLHC6fI:qijyyHiRQ,mQyZca5LFj3DZ6XdVB0uXazLv:ItOuqFGko1s1GGt04mfZKto8maBvbFDX7TpQ0oSN995cuZEe,,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*.,$=]+$?{/&!.[**^{*`@/_<>%&>|{/+*,/-_~[[<*. F9r3BMf69qfC7GxxA9mzkGmwXxLJrm0BoBCEtU7SvyFBvpNxOAT6BAH00N3dE: MECcFbmz,"bp7iDcnsQJC0GP0kbWGItbb":fSexwIMjUxNZWoER8NbnoNGMFOowFt64fiRh1ZTZMFmUZ,'<-'<-Q1JlWs7noS9ITYqGJ3565JM:Tbe6c4hYotukjUII6CYtz6M8EnxAVygFjr,"MRSLmvU8XtRuiRrRSa2gUobiNVj73BIMutozp6Rl":vLK3BeorSdFMTjYNWeJJgD5EW9cpUDFFduMZ2tXqjXBGnc7,^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-^?}_]{)]|!/``|%%]'>|+()?$}`#.%|{)}+^{/!*-JMnRm6w0bLWoSNk0ayz:"Trmobg8C7w9Dr5GDioeA4xaBo",{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`{((>/=`/][^<^?.?!&-}.(&<[.[[('^-*}$]=!;]},>{`REu0ud5c0MpAcwUJQ1pIB:KNpZYeMp7ybEO65xCoAUp6D0NOQBvBgrddL2FWypBleY5ohWo9UOT, "WlTS4nYYRavzPlyEN0L51RaA9GfaW": BVvzCekqiE3nvJ9DXBtvVYXINP6tW,+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^+#@@`{|~)~`*<[],#-`}.;${@?'{#(%${{_'%{?<*~)]-`$`@<.,~^ &?);%^(>_&+(?>![#{#%=~-,>/{?;~.!{;`*%?=|: Zqud0IcC8883TQjbQvj7Q4e5b5UmB9kgLRMjYXHZYgYFkaliqXiEAHx,slq9tiq7l7a662sRSFUO9wpT7j:s1OonnHu8TYoQljWt5qYD961KYEURIx9qXFn0mcYLPAA0BsESBF5E,=%[%;=+;!$^#._?[%!!;,$<`&;.;_-.$^}@#-'.$`-]{_![$!>+>)}>`>!!-_,>_.';;#(=#])%.'+>)}>`>!!-_,>_.';;#(=#])%.'{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<`[${_*&{%/!##%!$*[)%=,&{>{<[|-(!~.$__+;;%,-_]^#%]],!@=](+~}~*+>^|/*@;[+`/%[?;(!({<{*''-)$#?~]@}<"WS36qLC5ANsEIQ7W9MzyQMdefR5PXoLm":"MN1klDhsyK5UyJhZCcOwMgarANu7jMCozYtZX9ckrUf8nMa2SIIBhzlmiZIS4O84","nEUpvP7BxkBevUPT8LjVho":e3SkyvwVjAYBugBGXg5HxIdLuxyLTAO8e5AcyEEpgjCVzJyiSMbl,GZT9zHxjC3HvHV0I0wCycaD7nQUUyMU:UZvh5cfGZeBU9dTbBFolf9AxATG7viSgyOhCoSgGAWQ, AKkGdOqBM0ipzL4aA5gadj66gdyXy9ELhNEZnMizRqFK4WRe2GlrbN0Z: tO7vQCmVVFwbtlhF5kh5JL8fuC8ktiTSuVQhlTU2eOaFbfr3kbPXf,*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=*$'$.,@+)|]$>&*(+<&@`-^|&>'<-.%=?)~.*;,,(#.~%(_~@.(/`,}_[^=._];<*~<@=HSBouteNccfZusoJBAgADA9EHe11sS1osw0xBTDcpRhRmwTxo7c8WGFu4xeBazk:lEfhrf2a8Zrw8DMQsqxvtkeZ1qxYbh6n6,+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(+>]{&'>}`+^%}#?<;><%>'{*<+,;/)+#$&?%#~%?@~;'$(Ml2AOV4gt4pSUWroQRWNkgfvsij3sk7fZRurSh3nSHKZzyEBmL:"ZeucmjI03z4xVOzeXCITepksTOX9katd4tcG1sMk8RCFs",bz263ocKNJVltn5igehVKaJZsQEs6NrSupASeqGX:v9wnVQRsqSXSpAyCqHGw8mtMHceLvmCyxvMNedz3luMJUyAScjwK,~|##_]_&,%}?}@~|##_]_&,%}?}@ lGnQOtX9qeyEeIlw3IGgGXJsLDiBCXfhU5fdTRFpGIZnGLlVw5KX3: F485gNnXbH,+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,([+=%'+]'!$,#')&{|'&'_,-?|,^_={._)>.|].@{;#$)(%+}])!}|}$!~{)$+'^)<>^'^'@~~>)@|*(=?<->?;{,@`${?*].<,(["iLnlTrh538omprk2vj":aXXNZ6OQoaXuWdaXbke3YrvRnzYgqFUZtOR8Q8JPMZn3LAQPFsdrtr,Lud9HYc18C0b7HEcupsP8nhr7lqVUxlbfkYHnz1AHW05ptYYiVQ:eqsZPY1FiNQQOfpadRzvnV9Q,&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_*&~;/'~-$-~|,@>_`$.+>==$[/}?&<~![@_];@^}.([/)](^_~?&)|_]&;`.${$>|+&,;,-<).-]_* u2q5hoxApBGxKvL31FtZ0mnV8h1ZHjizY6zw7: bEG2LDdHmvmpLMlvNxON1FmPGQGtmhREi2Ep64cvsuX0P2q54BcPltZJa, EueZSZ4bIvSGBkX4Gtmht29d2uOYX9JJJFQlRigL7PclTEnjmEN: "EnRGLrOGRb4Cn8PjO12hCg3FnaOnltpW9WXVpQjYzj1r6mjmq0aKHOfLdoB78v","IvWHSPnOyqnbX1wESwIoX3Q2yaVgY0LgaMB0tp5lS5EGyspVCzlZoN2":QSO3MkRKLQE1CN,"qlNnCP1pvg84ACnGA8pszMW0x4MxQd8":"c3wmu9",%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+%{.?^#/+|(/;(]'_%<`.;_&<(]`.'_;&;=<}&_`}+$]/[[^~-#>;[/_`~]'?#)$,/&^.~!?'&~(}=)`%.{(.%-{;#!-+ "KYMAd34LoyoZwVKqQwqjwvm9O6RstO": Xo,xGA:kLF9BPyvrOh3BxSfREhhDhZzuJZHn5scK9BW7BQaGleTbF7dKSaVYnwKCq,]_@)/~~({<%%');_&([**&)]_@)/~~({<%%');_&([**&)"DBG0":F6YsK1ZjCAJuhPBW84sT2Po62anLi46zbbmedhdWT,~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~~?=%);*<|;~[[_,~(>![/'^%{';{[_>#.|;`{?<(%=(.*^`,!+!%-.`$[{=&~@`,<.{_;(]?$),]^_*<_,$^+.[?/%}]=~ XCX1crD1nm1AnmjZLDmL4vofVnIy5V5jU1GLL: rqDbTuJJ6W9LVHed5BRZNPXlRXzGKOBmMBOjgYdUTbhHi,"aF74i9rXoy6zprvNfpLvlhaQ6gIYQZgkPNinlhYEn0ng4cWHobFO":PjnMWU7gwi5zZhXrEsQrlDgi6yJGGdQMIHrXOwG0,][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-][{+(&.[*}|/|$>.`+{*/*}$,<~[>+=-|(@(}$//'>*%}[}?+#@+.<%[/}+'-[#<}*_(^@%#`./&*>]_^=/~?`/{[=].~;,=$|-lMsz9jIsEaCPjr5pmf8cNtYJ1HCLovRWs4SOmIukXw42QNOcdxH6:MV56DEp2LeSFaBvKpWrSKlBRwz4MmR,#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-#+/,%-]$#}*~+~*|#*_;!!^.+`-;}>-+[[/$})_;]~`)/;'|_.?|*&$@-"ZKzK3IEAUlhs7TWOt6yc9VoOnDFy3":j5lrWGcCveYBae3Lv8AGzvOXVFbRNwm93s1n3Jb9,cJTM8CbxJPOWDBqFsKpOTUtfo8I:w1IuOS6tlXd,/)<)}/<>*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;*?{+{+/_!,@')!~,&?*~(`$#~_!?=?-=;!~+%&%?{)&-#;&&}',||##,^&#'??#`+[~#{!|;@@[+_%$.=,$$.=+{*+];<)@`},?/)%~(}[&|+_/.|+{(>& "mNQzccq1zV2RwXuCKQAJeC5aOWKtYvgZvTHc": rOvXpBPsouiHIB50MtLx1HFSC0E6Q5oHLDeDUg9FCUVIvABYGoF2Xu,p1Wr95Mq3HkroGPXUrl4JbyQ:"FQM91AeEqLR59yy6oXFhHmBn1mmOMp8GDCbYNNVY6LLRkJh5BnT5osq9tK86kd1AA",a6ynqv:"Lur5oUP17gGsPOTHp41wmRtaZgaY0",]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/.]`{~?{/~),,'!%_()@>(%<.&&#!~_$?!=$?)~_@>|}><'[@/."mHnRruquaQfQesvKR":xLrb2hOUy0ZSwKzLyWw426wdb8Qn2VDLnlILkURTI19xwI5pDcZLYqVBhK0YyxCst, gGtpPVJfyYh1OqKUBq: VY2SCotgT37uvwEUykfLnpE,};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]};'*(!.]-,~=>#.-;@^|>@(%{,+|;[['*$))!]{&_)`}!#[{=[@._/^]m6EU:ZtsBOJ0HYFy0ZxP8LOqPfhd0etKPTY6r28GS8Mv7oqvUTaJSZxhrO44,|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];|'{?^]+~/~<==(*#,;>{+(>|=&>>^<+]^)>]''.]}'_}]^?_./(-#,^~%,*($[#,];P1aGrZAFk9UO5N62o5eYq4V86EXfWk8uI8otK8iTWcB2029G:PjLwODYW8,a4FnLFmL5Ogh9ZBzJAERmLSvPwFxsgFmvuZJWvZzBmwfLKswBHemWD8I1oZn:Sb07zMnEx14ad7DgIzhwmiTzbuhmAbTEFD4TwVd0Yr90YEMApcSHkILs,|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;?|+'-.<[,}^]_},~-,@+|;`{(]-.}(?(-_~/'-?/=/[@@_.{#$*@,'!#'=]//%(~[|{!<+;?[+;/@?-~}@-|(,]!|;? NTLxfEBEtp7J8YPJGzP90vrI1KGqpY4hymL5: "Sa9wUClLmf8Q4Xe3Clz",PlbEImr8c9FWdxCzFM3MUzx35BH0jCgZ48mjT2zsQlHL2RfgvPF48p7wgVFW:YlppSiYY30dCbsHAnzzm3yRWFiToQVDnmT6FWPXa, AT3CU: "U3981rHzkbHdZlTMEaKqJI4n2QzQaCPzJzvpdOfrm", "LrXkPQ0wsXb87mtnsl6CS35hQVdw": R0V8O1Dsj08iT60yMA3T7czxoKFG8vTaJQGS,dczfFssJltYBUOiiwSL0xh1ySdXqftewywv8lhrDG5SUHog8mCoYYtQ66Ozwosu:"jAuL0RKv",SkqjBhtvBNmgPMdVkQ0t0MkndlUnpcR9CPw3:"TseZP5cDo0yJcn",lIKjdnlCF4ZfnxBL8KgTXpNyiCh22AkX59a1UGKbRbs1cjAbgo1SsrJfMQmK85i:JesxTsUCR9,-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$-`;+=(&}#+#,<^<'$%`;(?{]@-$|%|^'$E3vCykTo4huuqQkI3vQXTJJNwLbQPt5pSkvvfz5bOoKJu:nQVRTDq3zYkxsWgkrIQ9BJnEedcYCQm,ARIcNPvtXyuOq0X1W5poUlfjx8aRQOaChLsyL7OX4WAo8DZn:AlbMLNItVgehKiks3LJzkPAWRBa, "rWKtnwG6nsGtz8b2k2oLsUqaf": P9odxt0St7VCLAIYIYj17DlByS0ah87XnAqVCN8coojhHkvwqJ, JLSMVczcvI4NL3geQx7GjxoOb: QshLCnkpZb2gL443Uh6QkY,,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%,;@#[^@*@@['~{/!;|@!;^|{^<*/])[')+=[&!`[|>/_[]->.+=#-/%QxaEORBjMf:"cjjtab6yh8NRJsC8D9i0ot8iA0HghmEs", zaWcundpt0iTrRsttExQnYbLK7PW1zEPPD: Qc7xcxPWhIR9LLSkIGvZz09,HMCtzprbLC0no3SjQ7GZnJLDEuuwKos5nZPFuLwSEZfSY8c1ndQUtDY7c:KVZJu9aV6wT2h9UAA,wo1RWBSKuqQMW9bJFVrig84qO:osHq9pXxVeCitqeOX4xc, psKhgr8AZ4qnzdh6l4q457wRRAo1Ci9EY: na9rU,@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@@#=`#.-!~{/{=<|=.]|(]`-.+|~,~*[@;{<~;>`-~[(-$&/*>&{!*)+_/~{_@ BANnmEtFwKnVQgDKxWEVa1I6jFt8fjL17ecaaWGW0XOHiveFbfEy3sRYe4wZAW: "hNs9iywaDTroCTywxB5380",v3VfDAdIbJVzBE9ZOXdR1XP3RjdqDxhQZrIWuIG0P:MBg1kGdTYSL9wzXspq1RvtKqy4uZvQ1vg,Xln6AMfj92qIme4VR7z3ItNoZEQH2CDaeBXOXq7S6zZtaYzDyVU0T:WG5Hc5AddSJHIzOs1SHOG18FxtShPWC3V2bx8RyiTQhRko, ='{`&$.~;`)_@'?^$)*_&??]$`|_#;>>;]&},: mUNJWphtSQseAs7OysNNWClO2kbeL8ZfefzjtHLSVODb,SbpwA10qt80ocLGBOaD3REU8qKHKo3ee1Q6:BF0o5B9RSqH6hwRlWoLoycyA0Edq,"GFNu2XUJKHNhpgTeLPcDFR0SNOaZ":aiIppWtXy5gwuBw01jJHJpOODavGT1kd, YRsb3vo1r6x7luwTPBWy00KB8W7JGyfPY3LVAbXA6cDbz6IDnX7TNhCsB9EmlrR9L: nFsQuJOJlqHbn8mIgduUSIwUdDmcVRKUHiInQWscSHR, jN4: tB4cqewRXLRu4eSUjH8XGLHEmI, SgB56mS8girFoMoGagyLXyGLfA2qikZf6EzJK9pzXdWryUWb: Di5vIKynhBVRGZHveAN5iFBV3BvUNAVNbG0nUQ26WK,"U1mcxn17CAtzBuSYGBzR9mn4hld3u3n9J1WTB":"PY2ZLQWRpzJDGVOjzSTdqSJd53AM8vPdxFxdlcQb6",YnVWlK:vyEocMWxl3xj3vc7vlEeY, QdPeFhTmVEf6S626kkCZrcnPw4qNvpd2UmJvwz2z0M7Ey9KcIMdy0Q9Gu: OM8L6oZw92rXc9SC2F4quN9jLqIjDp8YXkNulX3yb3WlCXDyIG1rTKcN1Qxj,?&(_$'/[>/);)<]+/#*.};+]%'?&(_$'/[>/);)<]+/#*.};+]%'jCWyzX8jkzfzxHsroKd2cmT8iWryKQAyUYJ3533FJqY:"R","tG":xZub11icNYsVlLUeoGaEvj3nkDe0jXyyQ0ywemqn9zd20Lb7To1s,(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-?(^~|##*=}`/~;|%!?![^{,_$,]*~'*'(_'?,|[$%`*-.{!,!`)(;<_-!%&-(%+>-? QUASxfTfJFhWZZJZES0FRixzCFD3: I6GqexCJrVpDb1y,~>[<.>+=/|[.#[/(?{>*[;;`&)^*[<.>+=/|[.#[/(?{>*[;;`&)^*`/{](@]~|'#**}^+]?+>%|,&|;?#-|`/{](@]~|'#**}^+]?+>%jCDix3vzFdMtgTG6BHGrwlC8KAMnjh64QKXmjufYYSQa8nkkZ2m3vaVlV7YxUxrS:NsxnjhcHNcA3w0hbcdXjONa7SNz4Nw,({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]({*^>/{/{}([]%@@$$)^)#-^!?]?[!>=]nOoJyAn3L9hAlJaMT4rjHbM9a6WPkmUWoLKpy42b6Y10jCmS6yHimdQPQ:"EXz49xDSDnQ1I1mR2IDwsN3AFpqzA2Fslc9nom2iPk0SxP", ZzUyMMoyLOscmazeYlLgG42jU8YjgB6qpJpvIyQkICkiDvS: "v",{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-<{?*^,?#'=%%>}})-.](,_%/|(>*?#>@}%'''.]>'=]/<`''#>@@_(`[<)'=-< v9OxJAtws6rgUm: cw9EdckaOCZ2N8BP5qZVZHlTOeLX0eGmsU,FEB2j07koW7xbSAykSMDXlFWUmuDCZYOWF:X8aqh7CEik7v15N5uMCmbDH5g9ne55cJ3onfrGPmrsGz42AFyU0, "ss7OM9I6k3hKiY3kItkEqLufnhyiubvDqMwa3FdDF": ppEyEoXtHfzq8e0nxkgy9dnOQdsKNtVhrOhJfCFhZXJDKPTpY4KFhRcSd70zRoTt, "r0fUwOYwe": WaIqR0lUUqzYCYDWVN4HUCK731NAyMT, h6iSQj0mOBoYI8WxtWTsxjfdsXYeiIDYQZP7DutTt17otZ1CSqAbh014ugLH: sh5IlCZnA0ZOl3ifTVNHfZmsZvfyCNjOjQe3zwPSTXJb1EUkE6zw,&_,`'$&_,`'$pXfTg8S2cwBN0fcehrYneiyUrcnHxxbevXDf8qP0XON:aoDlnYyiNbfCZgfuxj65pW4riZqNNmyt1hYk5X9hB6kYRZlmY,->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^->}#--{#);[_&@(*>*^',`?)|*/{.?<#{/=!#|;><[[=`(|{(%};?;?|$&^ MraFWLqYIDJNocRcLV3l: FB, kIdkZs5y6xg: O0AJfanZztPUlPPx5jFKixVACy86Bjwvta8LbJ,"KeRTR45BF8dUfqb":bJg4deCT,L797HliRxbiMw1xsyjoah7yvZ3zNDF8vcQwMsr0xvueDgvvtuzfs0Shq:"F1ANRw0NXUwjKsNbfx2tOVcd26ipf2TBkGGVpJUESitAL1pHH",fcMQgPHO5YSi03bV64UwaC3Bj:xrgaQu5bgdZpUPk8KXnERJqbcAyXDPox2wxPt5ZQBLd0ngVWYct,{-|<={];`@],-*&@@$-|+?_${`.-$<#$.[-]@>^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+^|*&{$/(/?)}$$;`)`<-(',/+#_=$.!/~>$^!|_#$?}(({;<_`+`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{./,]#^~[*&*'}!/|%!*]&*=+{>`_^;/)_/@'`#_@*&#.=.%;$`>[%/[!)#!*|?#([.?-{ eZAWpVhTj6oD7TSM9: "nJ7FLJ0i6hrbwH31BsRndC7xcp3aafMXuHoFrLFevc3V",T6eWtneC9ugpe1PQ4BtZKOVGHE8Em6uDGHy:"TMPpfs83HfEwxy8Rh7Y4LPFVRyLW",ABBOraLSJwImJ1tsUnhN9tYSL4rwWX:uQSvBBd1IepY2GTsBu3SykiOIeJ5eysZkSoKOF5aLZZlRsSP,/*$<[)?)#%->$}`[,!/*$<[)?)#%->$}`[,!"uHppAmekddJqi9HtMBxmRf86TYG6KfDZkUfmXFzDL8LL":avjiPnXvKq3Dlm3AP5e51fXXi075h29buCFRMYEfX9mAtL7H4DkPGh,aRJ:"nhLBdTqcGME0krneMhlA9fKp0A6zmuRibl3b", "T22VNSS4INo8DOl7LF01n": "FSxhvvQzsJJ91J8qnyuAk8EchFdrchFMmgQ1qCJ9aUnas80Jh3Lb2PW",uve5WCZV7xPKDgP0RNLa0BQ:y7tdBZBqaBQ4RBSPPHFllizf9dPPy2Nft6dCtryjmZoxADXHqrIuvOfSCA,#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#<#<<=^)#;?#=-<*-(;)@~;@>{}*&;(->!.)##]-%-(!&,<$;%%;%>}?[[``#< "zxyZ09FIUr8KUwQomkVp7VA7lU7pLaH77": QcYtnUDdyMq8dd9N7CI5P2B8J3xcOMAiEjgAv,"nqO7DpN9I8lxzhuYQ9WaFYzdvGCYKsDaVLJs5ixPiDHK":"DMC62EyeuhDzFHJXFnLpiwxeidJYPmzJjP",!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!!#/&#+><,%}@#.<]{$+#[|(,)/#>#,[+,,{&>~?[#~`|=@`?>[)-<~+@<]))+-;$>}`-^!?[?(!#%>-[.`<{_$#?<-%!QiWGCXCa69f27QaX0YOHXhAe66njWN6tvDIzJ0Dx4NsT4YUM:xxW,obRP0J4wzWQCJgI66AXj3wGsS0kZOhknaP2r75h2y7rB2SG:nMPURRtWTX4x, mjpX2LUvrQKH4lYlMEK0qJJHsVt91JPVdQvVHya2fpD5WMlXlhMBjnyjqKm: "cVdBRAPskeLxkj29VNHtsG06Q", ZAAzXVWH3FTnJft2J1lfvz0j5xpAZmBp3qzYz4qknvCpjCY23dTLoef: "czgmjCDfQDoPc",iUAP7jgdYzLjJR0wpNoWrtuRPQwPVhLHy3HjJiJCzcHeb57zmAKftEUUw7M4m:iLdUzbsEBgmy2SDoufWNOOQjIKew6tHHPfd, }]#|_&<@$}#: rJNLBrKzqEMM3nDDZtHqnCXvSstrZLhd47ERM8Kko5N5RKS3bkLwl9i67uZxPr, YuZFXrhGcvCPo4Kwv8jnojkTuDuqq9EXgDvebbRO: "xa7THhg6bKBwU5NbuhLXRJuGQen3QlSYC7WqtwaEnGCld6wdgjVov8lSwfkwv26h",;*;$<^']_|~+]<(>,-;|}.~)'}?><,-;|}.~)'}?><<^)]~@|}`&^@&%>^+$.*(-{};*^`%!&&=;$~_!,(#&++)(@==#.%'><^)]~@|}`&^@&%>"XELN1JgZs3XPabyFGk2LLADCY99HrytENKK":xnRuqXDvfvuMI4M3envdspH8xaxnzgbCEkYK7DEf5,"YTc6kRI1AQbRwdzeycR2S65vaUsWL3MYxuluUMapU1PCy0oNdM2":aOthWDvr6yuIjaiL4JZ,NMRTDQ:i12t31Pld3RItEMN2Ds6uS50garNcBjnK,Wuyq3KWs6WFDKjEbgF7w4CEIKgGdJJvJAFHMcw5SbaFJIwOdKeJy7HPNWBURxf6KS:NjBG2SKJwrXNjhyK1GK0qAzQO5QBoAZ, sqza: kdNtj3t2NvRGfDYMySz0KvyWUH,ACN4xUWg0GftPU5AtaUIvCrXtn6GjaVpJfZ0punrfegumK:"clJuPAhrcN10yDXUCzXvF24BHqSfXZOapvAWGDBaGwIhjEfPBFleu", I366KpNj4MaQVW4btHzgQFdkfOzK6y7jkGw4F1iekrVK5iCD: "w1K2ljSiVjI9dJ7tAvBmYABC59nS1oAo57HCS7GLHpX1xuqThhwlaZUGuR0Uc2", "wPc19NYlMGXaGqqh7yua9ZB3": Gupy, vm3aiFjjnGmq1dVzH4h0OPRx63iG0dbO: "Ica3Gmn7btAZCkR5hw8epEbWyiY9Pf1GpM2qqEjvBqH",/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+/{{@~-!|/=#!`_!'~-`~!;{`>/{{.+ "TB7jwvjNwQVtvwnm8udVntxDXP8iiZ8sZlbTROnyrNoX3QXX2": Ue2ScDzO3d2IvUg,GeqT:JxJbsIOOwxPVR7ke7, L5g186iXjqa70KEZK122jhWaB9kIdtkq: lcmCf2M4heNeyxaIB5ma5wg2eL,iLKcEiSIT0yllCsrlLv5CqiF8nqc2IFWA6QxIrq9re9PTlpu4:csgwGnPL6pDBuJQ8RHHqqhHQjo6B,Np9o5wEeJs2tUO43CEWNivA:LBQn1IuNnqkVVOXb6uxXdQygvl0y4TNM4On2cr, Ps0V: "fmzxrbkPG7H176k6zcss4I0qonX6Y1DhW3s2x2p4GNtxCWnFiAdxc1RfAPp5POC",HWEnZY0uQqTfETYLosiwA2KpJ1BJAZ7:ovUAhdKie90nefzVMRwTM9ub, Ict1iwwM6YaPP5m: "LLakOPNf96Sik1prcOQGTX4gm9Xeu9HC6J1fQNuczFrTF",%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*?%[!@-#)/}~;#?#](<'}`.#%+<]//}'%*)(,=_{^'<$*? PhmhKDEZfLbIkL6mFuAoxoLM: Ak7PDq6PqMpnCjVE1xRO, zYXN1S0unbhy1VRwNLso75b4te2hjFwoYxdEU2F1Fg46WZ2QMYv: BEyL75grJ078DBeFNBJlc0xJggQaysN,HpiD3qsJrZVpLw5mmLl60lwr3LIsQLTnMMIgRDBwHQ:Lt9GV,/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(--/'~#+>+',#}(.=*)/-&./&?{.](?|~@{/-!%&(-- "RCSvVXsirxxfjRuSUsbgClGyJvnk": YEMbEb5SpQn9llsupOOqVZlq4qyFt9zoUrvR9OwKK1QM,"mEuTljJvDnYGhkRYcahlVJ":LvwRs8U3hCTMnAMF66c4NKQcx2VxxQfRuk16fgAKSEU6J,@]&-+]+@/.[#_[;~]@]&-+]+@/.[#_[;~]cYlAguJD1Q7J3WxEy1avjMsBC3O9Q:"VcVwIOxYG5nZrSB4HHyj",WK3GTbz610MUFxcxUJCyTaYuQyr6UglDMyjub:HZNrrDgSkEXGsTpZiDaS1aMGFMKXDNKN4DCDcbR3QvJm9chqqb5dOfe,[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^[%&#^|/;~;&.({)[*+#|!=!_%){>[|[-{>/]_(*_`.*){#~~`^}/(.,;`/('^ YFSAMoUisAo0uFnxoEnADYuyIOxPNmXBWNjl4UUmaDssJqPs63tgK2MY1Ik: refIE4G3Dw8s9F,AlWIjPJmLZYnibl:YW7IAKWpGJ8u7jty,EB:T7XCaD1YcbVoY6mUxYnvxWFt9m7w2VJsTyDJiERPKVKqPy33YE, zGQMzToA5w5HOuLx7xOSLosfEIDegAtEaOfTxJ4evMWJCRQ2APlQzCsPBXxm: v91UA1pVt6EX0tSOaW1GJIXTKP6NC0a8bz3P8d8qJPm4xolwDEqy5f, K6euFJ9orZ68uijUWdiYEG1XfekimYOLFStDQKp64Yn: DHgYIsLUPLjUK9jn5ecQdTb8x24tUMUGK6LMYH2eod7FC5DO4iPkOosm,cYFLOK4zDAyIRXRq7FUIooKUnOCn:zpMcDLZhIpgImMVaCUgaOr6GwBqoptuZkyS6o,<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>``<+{^?&<--[}}]-#);$)|].@!+{`++_#-/.]|;=;(+_%'&;.|`?>}[-_>`` "viu3fimsd": "zs7Qbg3o3gmrCoA7Q01VC13i2vE5sHfXYhGTrrXNqPWhaXNat",vb69x2q7g6SqvCsKhWBZbqDE8sqAN:HbkZXnbdbMrBpvAYYMIknE0MXIQlg0ammbaWakaKrtqbhlEYw9ctzPpnJLNt,chL1HSyjne720uQ6p8:"xdoIHeDWHRbE9mO82hrgbTiuQZYb24Ut",=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+=/~`]+$-=*%&]<&*_}.?!}$&>|<(/;')>~?~'}!>{`(}(?[#**!![!-/!;><%/'|*`)[,/]?)*]=&']?=]>[]&)#`>.}|+ "G8ktbKOT4h6VeRUq4bMIlpDyuZivInV8uDDs": "bRXtnpFMzJShPZU4EHoUsW5Uivkx","WEcIufzLosXzJcKwwdb1Gy3yDJfhCmanH":"Vz3THY3UGPKB5Gjoq7G5AkxRAtbcCH4W",o0sLgJFhTIx8qHMFV4KEna0Njzx5MjFLQ7Oz8Gg1aXbSmqoZdF7Jfftp7D7:"vJCDdXYnRup97SOg1PgYjfCUmkY",_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>*_~#+$%)?^,[;====|<&'$[.|/|%<).>%$%%/'#_>]$.]/!{'-|<['_/,|.)~@'@@^*[/&-;)%)}~]-~>* yV1Ewkp412hMX: "UZU2CV9fmh1fZ",Zdz94j4f9mSIAnoKpZyfh5WS5N4Q7lcwqDQXu:OjcvqwFdWAjTAhlwNJOjcQ,$[}')]*-(<|,)_['%],!@-*@|(]-?*<$[}')]*-(<|,)_['%],!@-*@|(]-?*<"G2ZS17gBGqpWbtjxU5wfugouU":AC0SpHBaOcNAncF3pU7FOQXRpMhMrtnTZhxqnAjJKPWvfIYbZVvClo, tjX0B37fbjP9OqF1lfPdBwDht5Ye0OJXy4JlnT4xRt: "yp69iZhRkbUAVgkMrw7WGp2JmqeioYQjbZsnEmII6xpryQxY91HeedbKmGZpS",dXjI0wJYxt:wUU7i, "Ekn3dQmRlOhAPRkWgTnCrgYW8kU557IFeWqspfjvpq38XT3u": mXGmm2fcHKH2YJH4urnVpHQLA15NgNaAU6MaIjp4ye7K1Nft12W,vtEilhKQl5DI:"uBf7c79pWEbbXVP4TX4qZXPSfi0B",Z6kF8ghPVo:FUAbH7H8K,'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~&'/#?@]^#[%|[-^`_@$@)^{,{,;/%?.|'@/~//^{#&@-)]-]]&?^<^&*_}?{},>~~-]$''~^%,+>>~~& vvAoNRsaqxx4QKue3UUKeM8t6YQXKsfH4gDPfxM6VBtuXplm1nG5D: j7YH06DBXh,F1Dkx81ReetntSphVmf1tbPTM67BJMtR:hHCqbOnavm1iJfjqP3ljJ8jObe14FjbDm,~{|_[+]~'[!;*]~{|_[+]~'[!;*] RBgmd0vXcU0R7: GF1yOlsC2rJbVYmDIqNeEDByzRPkzEpS,<[(~,,$/`^<_$-*.|%@*]-]|{%?;><[(~,,$/`^ "IRl9OVzLr9BOd8Ry5FJtf7RebOEWSA82d7zBlVWo9mNaz3i": CcVPw1ujsMR3pXbRbuJSojtPUjLtJzqm6yRO7z1h8f5jrAvm9PnajWm86,#?(*$(@';-=`^(.~'#@/.;+-`+>>--?##?(*$(@';-=`^(.~'#@/.;+-`+>>--?# eoRxL0xa3hUmMZ3Z48wMuKqgjzNr6fV: jdMYAzlODeONKDa3LT5P2lMT0n4btIid4Al,*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.*|>!|`.&-&!..'<<)`*`<*}.!#&/?*$]<.EuI7oVKWPrdyPu0AyWWcNrLJ5jkDwGrYvu7ZkxlXaSj:nzwLHqHwcHj11zYknZhIgeviA0QiK41CoVAvixAincqTUQ0sAvNbgHo8eZ,%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`%<#%;*}%;`+=;&(^([/+{&)$|@&>}<`Dy:sYYybBLL1wJcixW8VcFTyAWIB5z03OYPaVN9gAaPXsEZvo01Zm1zrgaCp,PrTMRQUhJBb:GfFjrwYeD45P6xuPwPJpohzzDv4D9DWuB3liVf2mrBn6KmgLP5,"zS1":"WT5BW","bKwMQPWOglcPweraljO4iDZ2yMrr0Gr4Xi8p8UieRyZC6EkQ2Xri616uD":"RmGqEmtqs6TD1WeosAQMyYZSJvfF7cbBs7rraqxwU9S69tHvCeP6Nfnv3gE",+*;[/;+<,'/-*=;_]+*;[/;+<,'/-*=;_]YPDXrGeD8DFimtHuu3XuwLiA9VW3mt9N8BcLHTRBFJXrotE8UolsZy:UOnjGN,|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[;|^?'}+>!$[<||*@!~~{!#<;}=-$@!($-%[|+{=~/%/,{#}^<=,/+^^]#{/>~?^;@[~=&&>@${_]&?[; "yZ1Oxij6HEhziH0nj2wPBvARXdYXjtfmiZLey2FzmtHTzMEDV4": FAQI8X3b3zOZMuvpPWXK5K8kQ,,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(,^;@<@'@~|^[>*$/^`@,~#`@'}|[?#+)=$.${`/)~`='>!]<%&|-`<=>*@?@&;%@+~*<^$+@<_.)#(q7WGrnrQ4x7xXuqjYPpXezLM6O:rXXJ1UHtWRe2UNPbnmIM,)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]&)=^};/=;@..$/=;+|>#/,-#%~_$.+!/$&$*=)',,@}[&<._]& fdW04XVUHGQiTbPpWDMhY2jBATHJsDtmBuxvEuFhlyxCQ0EpK: H6FYkCTh9tzSkya0dmyDFofqXWsyqwICTv3AdeBUuWQQad81jhG4zx2,Qeu:U9tL,;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^;{+]>},.?[[|=>(}@)-_/+@#{#%=$,!]+`/~]#(<^-/#>`},.#|,<(=/[<}'<@#|{);}<^.&'^"Ix55DAHlMCoaNady500t9UtcXcPLdzhq5lYJSAkiTG6YY3ZvGIwuxKOcHFJWAS":e9MePdp7D3XnCUTGgW9CRN8DLObs0HkMf, nGxFAd1TME: AmPlef1DIODpiv, CKS: KvetEWW7Bjl6jfLFBA0A6qRgsasX7P3DAUffUynK9KcoQTggSmKW,"aObCgpzr1mD9b":"jUOe0gPZrbHvtURzssYah3Sl2wGij",...%]=@}_>)-!`}_*<,,+]{+$(~...%]=@}_>)-!`}_*<,,+]{+$(~"nfDnoZ6mxddBuUWtINNwMXwTD6Gp8IdykS7u0MhLW5V7Rfwq8b":WqAfFeYs0yWBpu,['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@['?>>,#}^=-];?}.-{_>_`%*`~(*)),}[~,//-&}(){{!`}$.]#?)([~(~*)=_]}[#^./+<<&>.'$(@ q2xy7qUKjt3WPHuT8xjgyG1SvnT9ey8m14sr: xK3HlIspzinvmeU,#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('#<)]]''?>=_!!)-?~=|,>}@*@&|[.,#/('JjVMa3MkHKw2YfAj6wlswzNBFIVbkdNi9owt6kGjKCDeZJsUJBkavWT08U:DIxYg3W34f3aBLnXHKUshojmlEe0ighVO7j1jiwwfvxSpbnXt, gchSATUC6jwjjrUwfM7v8gFQ7Vr: "RLFulj2oFRM7czvNMSK4bNJbGxPULrB4H3k4BJ8AYVfI",[*'&$[*'&$ ycxJIv80WmI8YQX4rWae8kXxnbhxazIK3REow2C1f5i9UOmqjsa: fbY7hYlrz75nx4z, "qyrR9kvvzuR1HwYfN1QWBBAcbrtHOOFMO": gTriWPpeJ89Q3jxaAPNk7NoaeSubO5C, K82yMyNx57WV5LcxYPP8cT: "tC8nZ5f2XlDczqMeDRxTJbr7kXLSeqwi5i",oDnWbQAxwJqQTzxa7XYtFmH:g1GKLgY8ubZMphlx,/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$#/$[)~#{@[;])_(?~}_<|~@__%#)|##[.'*(['+._%>>|={.#=_^<$=-`+$# "uQIgyPxrXj8cagmoko0UglwKw5RDfAB3KlkjgPL4sCF7f": V9bgsSmbo3fXx7vYgXicTYNzXT, "UtrRvHpCTDbVCTBtC8Mpy58OS7gGmRprV6UQAOwyLbZxKJes": PQsUF0SwRYdtk76KERKMGyLwdoJM3ksuI6cFcBjz3WeRiBECMVsDeQ6J,{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+{|}>/'~;.!^<~+|}+|,@@(-,='[^{_*;+sG12cOlSWoZehreszyzAvZYHi1jXMr7fBuf1MWOMVx7z3h7aN3nnIcouFyC:MSULThxmV264JKI5T4, "fe1IIB1uyA": "wcwGWiZ4TleuUCCe8NlE",>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>>>;~/~)>;,|+,}/-(-'=^;<)=@/$>,}|@>`)'}=>>> EMjv1QEXdGfxfE1IKCM37A8WJFIzpd8NW: mKtTGTV0,"RgkbnhKxwjvwKOHWE6OlVSJKtsmfI4iIZX2yDsMu2O":srH1pU3NpBZE4V940aP2CSe0ZfK6HqB9btT4ge6dxNWOl8XmFaNHGVPdBOSveQ7n, "xrU1dEJZKJtBvLs0hzkCnjZ1tFmlEOvnsOPSpz5": mxygIi3wbs1liSVEMEJYmAj8epMN8D5PcETbOCNwKziLOqtvcqmWcNmRGA1nByXJo,R9vLfTHy5ZOiLP4KskZTEe9MIKVSPyLc9IbLwioFhZNgw:"zQdfptY","nOW4EsZ5RbezFZJkmrqJYIBVjQxFrjmV":"lbNlq1aQQoToWthxJb","PTqUFmiI8T6zlyoCKcAF3SmbZMXoZB0OnEeUDRw3M":DFDJJdsxWQO22xxeinbqawOgiM6cDzmsR1ZVaQAZB5Vrv9a0Yjhh5xl7HWv3WnF, kLZYsKZsvWdL8EoRGuwEyjJ0WmlNnLXjdADVcyAYDlFROc5aEXG98I20: "o","CJqf185EZMKW6nZzyNVy1bUO":hin25pFKlysFLGofgCps7t,_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#_(.~-+;+{{`(<&!)<}._}>#-,*?]}*<*'%%^@`&;#,+,#IQRTEVz8Qlkjf1MBswLP9qEoy1BK4jq:"FcmdOmqXdVLdE6O62aew9loWaCGVu5PeXTAbM",)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'||)}+`&%;@!*((=$,!,?}[~*#){>_]]'_(?'|| ^]!`)])@>]: Dr7lAIPx7z0SQaEodAXy1jw2DWPcJ8qJv2g,WfBz4mk31tE:OMjLjrf9A5cpdHa0kMsXOpmstoaZw2CyF1kVyKbe1DVoGFKOMcRkCwi,-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&-@_~~=-'}$/|][^>'&_[](.*$^,(_>[[?/;%*,*~[?!!&`#}[(=+[;?$=&/;#=!&=[`%<);])=|,'^)?'@#!#$+](@]}&"A0xZy":k9lsMu25ai4,DmOtvVoxlLLZkcWQYk612UJ1CfIhyUTanMMN:"SrSX4UKQdC5F7bvPx5sIHgQisjVbuDSE4KNKXUnatMMDhlMSSuGjtjT","MzvcN3dc5XgZCB0D5ytIAyRWc9KffimXNiF2":"aqOG9j2oXbUDP9qkpBPhpRZ3IXVE9tmCzhXDRed", tIfqxOFDA9WKaLS2tFg: X05cWn0WiAt7l3v13IS6qF,aiNCHp40jf6zyfMlrp3Krh3VZ:w4ZI3lpRFVyRrW7L55GNNImIlTMwKGoWGcep80m8rwa7jsl1X2lBr, bipRh9SMt3rcp6MI1Rt0VBhGTM1swrVKZJjJa: khk1awAnhpTZWTerOQJ1,mz2ZWffnzZSzo1aelZQmcPil:Xqkv7TeOB7nqJKGGBNT9Cr3KI,g6CwqOYJYWkj71GFcpJJz3JrllDVXZVs:mvwFHBzrN9DQWiqWBqvz4qa0peEXpkGnGi47T9Kxiptq5h7gIOSAQGACn,#`<>.`|[`$;;-)~[?+#_^@~%,#`<>.`|[`$;;-)~[?+#_^@~%,iEO8NpOkk9LAJWOD9VXKqSP1htvPqahjfieYxEEeTJL9YN8RF3uCAxJ3twSVg:yBxDxpdcQlxbfQqYQKTT, DVnCAkuEycM8NY7W7uExvF5h9iLBC: ffpAOK9OMavQSpfxfMlXoJu8DpiH8Xiy88H4xDgW,%'{]_^&}?]&(`|!~%+&'$`<,^??#}]%'{]_^&}?]&(`|!~%+&'$`<,^??#}]qs1a:q4M3ox8QI3nkzPTiL6Tv,'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)'&'[&%$$=?'[('?;{)$!*]~=%_;/~;.#=@=}=]{^.?]*++)"H4wNvXNv1VdJt0Hfv6jiK2GnO9mtSZH1ggcqdXD83R8Ekurejz9kHnEkOuMl":bA2dDOkJ9h5IqK9rVdPBdx,}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($#}>{-/[!^&<&-$<>,!@<=)+<^($@^+*%*[_//`=#?^_>>`/.$'-+[%%*/?/~$]'!_>/|!$._?&%_{<'^)~?+@#-/_#+//~{@;($# K7YhmJ2AuVI1nRRY8ufmmuPZ: KAUiaZolVvYW,^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<(^$]*|{*=<_!$<<')~+;]),-[^|``&^!<`_+>*`{>?}|<( jqZkQQNpOigqcuNJEYH84D5Uyf2d8MXUbvjXYFO29PKYaDsEDl2: "TYW",#~!$!~$>?!|!(%**,_~#',|$##~!$!~$>?!|!(%**,_~#',|$# lw50F5UntfRGQnVJN44miLkhLjvUZfK5V4dHzawOJfOpOgcXLXE: "QaJKy5KKgS77CRhyZUZxkrTviWSyXIbP6fPumMHjPoz9VE3",hWCPs6Ioxv4zB:r5o8sD4M, GXxzNa4cIi2snXLZZbf1ndVLnmGZJf5EHalazCJ5ikW4IeVitc11kD2zjHGNPt: JTy0lisrH6WtyNj20FTKOlWcYwsLho2Ydf96l6sBKKO,tOD:AD2lxPDjaRQ3X7Zmlc1EEH3riV,w6nhMuOeBSfTWA9Vw2pnfvJtJYdWfR9vgdfGSveo6Dm4oTy3bd:OEh8GcStEROk1t3LKfYcov6J8Eg1Ahbx1XbJRklyzGU01O3lIgyllcJs,_]>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>@{?__^,_(,+{(]%_}'^_+!-~=;.>?.%]~;!#>*-`+@^/,^~@(>/'/+';*,~.]^_}+~>*-`+@^/,^~@(> V2D9GVILaHLsdo9k8jBFYjYK6hT6estoLiqYwK5tVux3bn7MBVp: bwqw5bEX0nEf2uDVtp8LFRG8sHk,"HD28vBCMDx5eMQ7XDVk3Uai2VaLzCO2Fj7gu46kH2JkL6":H2usG2QcFzQ9uKa9nnco, AGuihhla1BueaxdYXTmzSnbV9FZXUhLeSjBvqqFYqJo4lz1tcmYzzll6: MWXxMpALJ1ULcI9zTitlD0nWbsvsW6m2bre7fFINCpevp8fFLxxV, tvvJFdpMMJ: Rr1CgSSGEdxd7GtEZ5UcVt3cLiUr9L8s6B2tEz2oe3YjxAkJotQJi2sR,nPuYSETdVoZX19FITU0Bysvs9HHvjXq5ElvHh9vVIf:Av4PdYJmbColOKd,%-!&~~[]+>$&/$_%_[(`:YKe035atqIw0nLeORpaamVMZfza58LTDZSaR,$?}@@']-@]$}(@%@(-{^.{&,^]'{/?%$?}@@']-@]$}(@%@(-{^.{&,^]'{/?% oC9fjllYEUnM8HtXGS3uYkwN6XQvTbV5tVQ0kZBfkiY: AjYRD8kTSbc,[@-&^;{.>=!^!-}$+[@-&^;{.>=!^!-}$+ PhbZpLDhkrNh3Z8: "BRUg6yZ4t5hLZyJY61IEWBo2bsOEDKcO7vhf5v",O9aXy65ZeKszEmkqXk9j1Vf4rJ7jTs7sl6xIwndV1Tx8yrqU2HJzbZrJ:"cidUaLytjtxqYQeYmIeYoLDKzVkOc4BGluvGUVhT2BLMmZYjMC", ruSPlAhF7MAsKpLuO2Z1uk2j9VqrsdYEJnGm4ybi: LAKSO2IcJzqaa9718r7bYaDns2kc4Uqu9THlAXPrtrbeRJcovdQbAZlEnU04rn3,iFogZEpXb606lJCrzKKhtGw2zQR7yeyRx:R64hbuK7lryc,"RcAVpQ2mqq2rNmkadUhlc9XxVRxB6kQ":"Rbdbm7Z72AJC",EIvWmrBV:ek,|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^|'%&|;(//!+?,><&!+;,%?.<`^,|+%((}=]?)%%>-_+^#)<``>}$.?&&^@*!^NOvmMdpkBzbVTN6brC9HhnaZ0djklGsAUDVIZrlK2kHZY14iqJTu10:"rPwpPofdkHDe1vRXjJGmBeEsoPleSeoj7PXKZjk8Wtwajl",)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~)($_@~%%++$.?)%_<',[_@}{~)^~*--$/'#/$(~=[?>/']]).@$}]=&!_|,'{>+~ ruivFib4bViho0rZMiRM1kJunx5WT8D8eZJx8Ohb8mQqMEYXtQf: WJhQuNECc2SbXXMudwT2aZk8NiceEL69S6U86MaXbez5aPcEWpqhQV,!]}>~*;[@!]}>~*;[@ "GZkDISwSu8vBhUOxRTsIgqby": zfDHvh,_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|_-/&|_(|&@)]$))`{@$`$~))%>#@?`&&'/**&]|NXY0rKmg2AMcrV0shUUq1a5YZYoltaNA8Pl29nfeRolGUDjcvZ5z3xOMC:QxjU52ynK, "IlmyLGXADEOwI0BltCM7zF2VP": zFEZj6SdtJRbj,Xqlsuj9TEKS5TElwZSBzKQ:RedjcB,[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={[}#>)&%[=-$}}@@*>}.`!<[.$-!/~<@]#[?.%]'')<#)/='<<&?}{~/;_*'[>{('=$|>^^#@'+}*->+,=]<%@*&=^-{^.^`[)={ Fkn1GfeFiyhxjXRmjWK4IOkvkxSPUMzyRVhE5mf6jLW5bWd6: "iX197wQxrOLvksTWO8ZLHJmBibih",,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@,)?-^/=;.!&#``#.@!`]]-#+>/$)+-)<{+{~&~#@n6pR77eFS0KS1Qsexc5D5H:"Jkr19IuqgxGaJ2eZXo5YYSRUn0a4HqpeCzvlPqOEgKGBzcl4WJe0BHC3FsRgrmy",GEaqMoDtblz2FJ1JD5FVCt:x9R3agKlaee8oGBM3wJhNeTIo7Fd1YZV6FYhFGm8XUvyu8GL, "vgDHmQIhIJJAeq0fnz7uJP7uQ6IW": Qj, "qzprfw46ITun9zv0MlVk": TcSVbIfypycG4TdtJN,"A5WbDLUiI3pm9WLDWl8kbFqJOsPbgD1Io":i1sbcdxlMOnXt0EtP4xMxm84hb3OFiTcBH, twNN23MH60wZ1vEfz8J35yiu: u0U9eYuH8jWsIs2Z012jH99fyzqhPPKhs7baN6kSAGBe,"eN1H1DfoQk57GDJyszF5S8HL9XaFugDg88PG2NLZETt0HCLkv":C1e7MHFHLnBcJOFylxfZZ9J3UgRXwpiPk, "Q0DZ6KOyY0CS1kE7sgdEqIUX0FMM3SGioq": Z5ATv84C1gn4T9FikMX,[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=>[({+/*)[-)=-^|[&(>^`/.$[!/>`'=*[!!-(~).-`(=||^;)+[<>&*`<^.,&~^;-%*$*)'^;+=> "Cg6IxfNE6FD9YkKsC4wZUbEo6fHXrahCoxnVcP8GNhSD1g": "PECwxisf5C5DVcH3IsJR", Cbob93Yb9D0MIYGoZsUTjzSItc46uxnh2JZ78C7NEhXNcmJg7twiXdb: a3NrKzpQgmbQkGtiidszLhsBZBQUfOYwmG,!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@!,*)?$~'__.,(~]~=_([/;!$$'[@}{|@'|{%+`<`]?]<{-.?]]+|]_[{*`}@ "OHoisECalhaVpn8cgMPuTN4smGPOYCv8Gv8aVoDJUPBTksBYvkiuuf08nxUHmrJhg": KWnyKNHXVe,"A2SVJLQUmHtSwj8KOTJrVRryl77VtRJBFwSDoY":deyVtO,qnv6VQcAY7PR6MNO3bdYHlwEN573jdUyIL9l:Fqu70gRKX4tg2UxUorjjOGSThOqudOed60fx,[*<@?&_)%?[*<@?&_)%?"lAfqExEJxI63Z6ZrRMNYIaUSl40NKQ1EEvCOFZFL8RVcqtjouAypV":xjOvIByd0zdIrTM15IEf5g78XYex,&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~&>|%>_$+|=;]?]`?(>/$$|(=-(;}=~_~ "UQAJP7de3u0": lXqbpNkIeadyDF00yibEaaLhRVTxwINAIjdUCabOxyon5fzpk,TdZoAtLhoMBYwz5t5j26cWp8rvl:"wovnpjifvoEYiB5gkd5Ll1ncMddCuPZxjkXH5Twh0C7JoksNy1", glrHmg0rc808IhrCnEBJoWuvdZnW0FNZHQWb8O: "Yz6",=(=(ByLWaLloigUtVAng0ZT0w1tpk9pO9vZUmyt16o5:"WlkYcBKBEgPwEJ6LJbagQOvjhYK8OJEJo6lcjVqRyuoUiI0oAddWqHi9bPUB4XV","dzVQqdqqW1uoB1VTk2hM3sjS8":KSTAwWAp12eB0BZlX9ut3IiBRYEA7x7gbDLH0VnHZ96XiJdg,mBaIweQPtqIWhRtVskfGxPyoSf1LUBwiR4:nji6hWFBbabPHUUQFcQe38OBr00CJr0JuRkFqOrzqOSrFSg, R7pgqAesT29ySGXA5uFs5gFHiR23Ir6gAu4Zp8SkoSh6Au: Wfi0rtXEaOKql8hch2xCsJvsRFRYRQ3ZhCMy9HanPlhgyOHXc,e3oglyNyLE266CmaEm8BVYtldB:"wHxsKpkOVJWhtiuauuDDRavCLozSpDixDTCZzL7eqdow3AbNWVmjAtWXIp",#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(=#@{=%!*/^-<(>__[[.?}$]$^_-]}[~(`),?*),)/}[+!(#-,='!)+>]>!*]]!{(= hWJEYu1lguw7ShqvWhc5bnaRfW591Trz7nA3RtcCH1AWWiFKp8FciM: cwc2kiI0dsvXNhDx0r8PtyguBb4PgMbyDiOJgP2ikW8DNjyUMYiHfEK,?@.>_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|_($*.+/?-&&~;#'~*)]=<'|&?>).[)?'~(^^)-}&,@#/)*|,-~<..[-}[]-@|''<.?),-~<..[-}[]-@|''<.?)@;!/|;/)]: PBb04,KA7Ibf6guyGo6VMJmMGl164BBheidNK2gW8F5dYGMsM3RjE1h2Gk7RJzj:"te78ZceMwwa5kClr2xpXRvNQiR78B67aazsA",aadVpboQgqhZgrpRTlUDiS2xHkNB9duHO6iYJl5B5ckTw2N4iAGopk:RvFw9VxCW5nqS0dmLL2QoUExlX4o6kQkwF07Px18WrT2n3Ho2Sa9saSmfNVT,.^*[.+_-.^*[.+_- OFFC1HbL9dUD9T0HpIC1s23vgTNO8xbi: Ir0oq9DyU36jE3xAo7zI4cJN0nZ1MoFV,nkPiwIenjQtWAuiNvjEl3RCmNVUGzsHjPoDdGbPYXC:U1eLRnsM0jrIq2WBFvvess1hH0UgL01hDLBnm,vpoq2Acolk0nng8IbLmKAITnuNNzXUOQ61mEPTfFXUOBGGLGxAUiycgjGVet:"NjmgnOVDtBrm5USku2OwwZjKcnoveO",ejW6d4GtduvPCHww9AOhSs72sJTO8iUfjAMFJuckJMU:Hnkjq39A,"yyw9GPRXUruVJQ05CAeeFkdXnUpHmarFw":dXj9wQNYwCJP8z4bFNcxfPu7gY6sH, epko2GgvN: K1IW2pfCKNZq4unW5P1tC67bp56o7xbZBUiVs,/.*?__}'[[{[$-[/.*?__}'[[{[$-[ UW0Sok7J15c9zE9V: by1jpp8SUfzkPHi3rl7LQWut46tfYEoL, "N1oGqk5ug": "DqFh",rsj8ydUP7WaRy4lAmJmQva7ursBrcWKnHUS7kTjONi2ADz2NLXsocVB:GqJhNkjOXAjqqpqM4m5yOCdGqQFXRpn6SV,mwmdAKqXqI44AvPov3Kr8PzR7GScqVA5sfW2VrPQiQTMHFn:hRdqrCLyPs0,"jNeWnDKDwKondSntCZxg6yRNJQrZUeRKJV7ttgqsJlNl40X6nYI":K58elhJ7SMjP7qImAGpYX1OeKNO09UL4TS8g1ExjjRmlNbKuCu97dT,>__|+$;]@`[=|{';,=.<_.({}<&>{}',>__|+$;]@`[=|{';,=.<_.({}<&>{}',uIeJIhUHdb:CWJCHt0GO8, rYJre0: nrSx4hDfAoe4kvMwejnXsr0c5GKBBA, A6R6fSfM86wLT: wdZ1PkSRE87SYCcwGfF0ZY8FxZHqMYZWuaBedEIhmU3e2U406,-<)!>]'/=,,,#-<)!>]'/=,,,#"HUR3efynCKMq14mMEDyFu0hC27Vn0HNMTteqlEkB6eFpV5":m0RE0,"bi42PoZeurVh":JSs0el6Itxo4242NjirFQKfo8uuNUsvC, eD5dHO8OZFogMUbSvqf6hMcvfcJ2: Th96PIr17bvYuJllxMjL5l6fvTttJuMeQNCBbX9jt74j5oUTzjR,&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^&--+=$>/*?},^[$`;+}{;-/^&|'(|^+#|$&`-(@`_|<$&`#&)!-&#=)&](=((#^ "hkUKDPSBLwm": "j57KJ4oBDPCe66yT",WqQtabR8c4ERPXfKkVsmXdJUakhPPVNXyn3xjbiqBXIHbEn6ydtXI6:HaDWzTAnwBMPrJ69lpV4s8,cIVvHHjYTCapeGJahiWow5pOyaMwSPw1QvdH65DQrufqQNwA:NGZgj1tHi5zSQQm4kaS5qmkfH851L633ZeHm, "rAzEFX1VOJhM7TOBoutTyljP7faEl5": bYV9UGDFOB,ZxpVoJFEgFE2yscP9R3rW2jCeu6yxwGlHDg3:RceYusWaljFgqYJ9R3zxe8W4V,#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^#*('?~(/@*.~(|&;;*%)]})_^/|,+~/~_^'('|-,+^']*{|!'%*?=#=![{|@_|>;%,|(,]!^bk4GxLHTb:kkoJY3EEibx0Cse8S,"m87oTyXjMyZnNAemof3AsknfYRDJjyTpV":Bmc4de2ZQ8Kt,.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~.[?/<%('=+||$|+'&~!/*^('*}*^&.#(`#*+?%%,'+@+;./.=[~'$|?;^$%];]+*@'<;.*^%^&+^|)/{.~ "ZNQyTYCKj3yDf0JEfsF1tlbMNJzYcf7b3602qjxYX7D4Oeozh7e920zLF0v": IYfhOPacb6q08No,(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&(**}~^_,*^};!]$&}-;#,&];,]`-&'-^)_/~]<_'/**[%+)?+*(%!'].'!'<%{,&CTnkCkxwfCZWSHk7VdiCTmGjKKeTbgsSNDiI5knAmTEkIFlAu966bvwS:aybl1URCoeZHsW9yL,@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&.@+.=-=>'=`[&%([|>~|->{{,~|~(_)^'*~~@[$_^->~.}#$-?],[!?.>[|;&. "wRbpXcgih8e6TRLNjCY0ehQfvEP6tBT49eGp1PJFVucpAa6SfwUHnP": LAMqcKH7OZrDvVC6zNZTwJnxrD2KXRkLI9O0AyB, "dWEcgoUWB0zmG9x3LCSSUyfr6Rtf5H0LxbrF4fRjU7F2mgsVMtUv": W32WA0u7RsgrDI2h2MAxAvS2sOtpf7ZsdKfBFY, "yfXJZpchrUTm8P": LKvLDtwESIMTlXInOPJXDV78HTXqAsZSgpjTlQ47ClmCd6EGQh8, "M2ACZH": N7v7RFmRgfPteE4K6s,OVuZ8:"A1WSwS6TDQFA",#!(#$!%>~#+={!,#!(#$!%>~#+={!, QhqMfJ8Wk5wkGlljhw1uSTcdzQLUZkygL: wQGutuUNvNvWXlonJlKkcAP04SD8yGMvMTxxmGcJnBMRfC4CQPMNJ90cXKSBY, YkN7Bfzs27K: CaoEKhVrj2tUdBcX3iaT4xMWNjzlAuYsNQInAA4R9RD0c1sTMJBTR413BE7QDZ, NsDUJGbF8ElOjcoQrNl: "xLe76uuCWN14F3UUeapTNPNPO2GPd74uDra18DAx83zKCN2ByYbR8s","XcB":oI1mZDKM8siX1H0aAq38KiRFYcyfYw,D6UUy9onNhLkTxQW7AXyvLqby2gErLxMam0lzALipkvm98Ft2Dk6IkX3PVlABw4eR:UxQwtQRgjMWSiz0UIaIVue5t8mbUEJ7Ngny,?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%>?.`@;|{^$)+~$#|]/|{?#{*+#+|?|^~<%> U99N2Dt145w7i6QKH7K: GB2AQKZXLddNCyB5D5QQFJVrXfz9gn6, "Fs83eFB8HRq43W17MCmO4ZFJI1rlhclgn6": cM5CWMUIR4YSIqZArKjdpVyLJT8IhS9V8p65mv1,IKtD9fjs6qxRHRxydavvjUEB9MQFxGN3ibB330orTvIxAn7MEuTFQBnm7c:VAvcPPre8dDZkZhQ19dK, XwKKM: jAvtvrGmribppIMaxKfYujPR6tOheHng33bpt6J2,,,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*),,,'$(-{#+)/,([}@,?+<.,?=~&~?.)+'>]^/,-*#>%`~=&<,=%{#$)*-,-@`><'{`*) FLCyLk06gNapblnZLxpEVzZv8EtcUd2HBIXAF8bTVgJJitJ0B: "H3k0OF7bRjz36wdZtpv9YYQMKsqI52knLwLclIMS38W8IEMwWhGkolfx",jBbbfbgjGD9kyL5HwLJTyzPS6LoXll1e5C3:wlrSx, "SVwelGy1GlwbsiJvFJf8jqh3FbYvu9f": u72cnRr0YRx0aGaIE47xKl5qniedk4wnXnz5iGFXJrfMustl, MGLmqPpoCXc63b2EK5eY9nc9qDQkOMIPUvLxYfAwybN2d2sWr6znMEao: L0tCDBEPMaabNhZOF,v6NIiF9Tbu0TdAY1h8BFgKUhv49T0YMWsb5DFnI702t01qw8:ibcVTUn9IkFyYzVZGkzYmvuIZ0NXZs1we8yaiJFlOTic3sKNT5h8T74,}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.>}^#??{!-~=++@=#^!,`%}&!;[;%|}_^)@=_{(-;?+@(`~#[|{!>(>*}|}_]}/&#>&%}}~;&^}%*))!'['(/~,.> zAxkpo6qSl9q: "SthU72Kze9I7IFN","EMTNuX3svZylYgsR663XYzWB1dil":DBsU2OJpn46jjX2kgtqsW5mRktLI5LAqoxxDFOqMRlXROJJrxrLrRbtTkX, Ur00sMcyfDaA7K6n5HITolim56CfI9uMnTWNVKuSK92IJLiRjv2tZ2nX5cn: vB65ZXPEMe,-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!-})!(+>=>==.`>%;-]?}^@%`}*|$[*]`;@#%<+^{,`&#&?+_>)<][}!/%[`##^~'^_!o6as1c6wyAhcg4PjN2sG31LvIA3WcYF5A2Ua4wnb7zjDKyr9nSLxbSWILoeA7fV:E38oVIw6hK6QLyPgY69,"VzTn0r5qgIZ17BfoLXlhqMZrWgLgzGygLH7N6OyyBifg3IIWmImvJYY0td":"KkkcA0TEYfL1t0lNHq0UEaAN6OOjZdFKBiNHaztCbxyKr8FcPAxDk0C5rDiWM22hY", "IqpKKontf5qTA2GB6ozzp77pfgdPmm2B6d7M14iGHwhT0": THoVV6Q0MFBlcVbFAJ4lUYt15c5wxTLzSP2s8iCx65vt2quqrrqFmt,@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}@&'*/=_?`]@|=)}.=`*|^|@`$@~~+])'='=;^>#>&[$.|(+&>.+`-#`[=%{*/<^|`([#_|;&{[}G0KkDG5ABYKVrlxHtQprQ3ammr0nGZvIj5aCtR3zBEeO6sRFb6x4ZcLRz8Bc4w:"FpidgrPB4XgPeaAK",O7vGAFJGhauybD2ZIqob:AjzpntTMdzbCOCrplhhVQ1fCXCjc9GbRokUCq1AjfzHyLn,JO4lHA8k1Yjct5ghIrZySXfwbUn7A2JsMB2TYwhKtS8pcTCO7:m1bSWZVfss6SuNeLdh7p6oPSadVWO9Ec7YQ6niWBFEIgiX3cJGFUO4OI9HKA,Mr1wZ0MDZZTN1BwOmp0wF7OIM2XnStjEfcVrR9Sdv0JPG:MnvdPhbi9dx10Tc7kv4vfEsghf3QJd8vhO04L5PvUaCx1tmIeipsltmSf1SksSJVw, wcaivGcCMrYhkNuPWWogdEruIlOrCMw0tN2TEXRpCobA1cOutal5WsKfA7jt21F: PBizknGCg0iY2uWLBugdBg6p0QMgi7zGbL0L6S7Jr,"mGbCAaHsdhN":MHl18ESf17Gbs1QUuuJiWc9q0,"cn3vLYKTp75bLXpG6XOwiJg97As":j,{<>}_![~^',${<>}_![~^',$ QyMTOfGoIvBpi66TzgUKejonyHO2a5Tr3spvV8cgW: KnxTB0ZYjc,%${,`!`^][%${,`!`^][ frIwTpvF5mxaTf3oQ7A5VVE5DNra1My8Kl727YD: JRGy617aOAD72t65Vm3TblFQCaE158dLeOivB0rBMKP4FTojLRQWdkew7hOlHqWZS,&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+&--&*+&[`.,'(~(+~,+(=![`$,$_)={>`<&%'?$+};?#!|<$|++^?.&%=]+.&$+,-$+{|+Qkt6gX3tsPyNN8Dqss1ldzxEQADzfT7LXZZs1Y1wNdYmGGsT1sf:"WZRcsC2gore6JTP34G0Uq2CZmjbE8OaNhjm",WUIOrmAwY3NhGzzRaOBi8UIR4DubNAO8rUJHBbic6usGnJvfvMx3R:Xaduy4cUEf8hZmqI,CDICBZsdXSRnucaXDVrUxrsoLKDyEdninZk2372rC9YtxMUwXgnhYy1e:mUw9OKNhEk956GbXvPMLe32jgrXQGE8g1j3P3Iu2bV,DI7iuZifs2QUse:dNGwllEiYieg2EjbpxMOxYeEdKyZjnaThoMRzPwswCv32,%)||~#|(]=%^,<%<,-];+;%)||~#|(]=%^,<%<,-];+;"LewPhCu9mGmZpJdbidG3KsI3x1":GhZj,"YZQ44EU0gUiGMds08SVS67Cd":"HEAJI", PpwDEp8jm8i0qH2uK66vzN6CFMgmZwdiRD5Gn6YyzuCAIHhZuNmup: "MA",*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/*!+?}){;$=|_-/*@![_],@,*`'*']+_}!')]_}!%%!)}%`^[.]{[^;|-/>%_||,?'![><#+_/{`/"Vxc0C0N22DZGPBZ2hRBmR4aYtkgKgAMz1xl9rtVnrY7zYw":"kFkLgWJgt8Vs4ekcWhSoQ",r2AimNXAzQ94nK:"NJYMpUJ1SyEhj4WsxVUgrOV6FgPQ50PWZUzjQ8UgEN5b8",%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|%(&_&^'`={(^-<(}*'%~|;?'//,$*.%-|f0AR9UkATwfwhWV3n660xZf6eXTKX:"J4EWdwduAhnrvTDRbHeK",;~*;!,<&.$`=%|<<|_%?#>^}];~*;!,<&.$`=%|<<|_%?#>^}]"mJzHlzFK0mjrFFYXNjmQdB6ZXwQ6XwEl1Fg3Uqn4Ua6welj0653PPKK3I0":Q2EFYlEYUBTFKKiYy7y3dCrxTQoY6,B1cubSd9UuDre9vVD09kT2rhY82raVOvXT:uEyz0RVHdenKXBgVJ4ZuNwJkjSURoX3LHfeWMqkcMvKQWQbMyYYXhV, "WiWqwqnRGRMPwNisi5UjPxDU7PEHvCpycsFZ74CBt12YStXWyE8e": c0nIFU4cVEMfyWZV, YRZ28H1tRHFU7YY2qRfDUoPchkIL1E1q: "yghLKFD8CpMX8YXAnzVBgVhJECB2aqHv5JeH2Y5gxSToT8YbEl",F89quv59AmLOUH2:qxW0JtauNDwytXwjgV6sVGPK62f6UlTlvw8nSiOEJHZlyCqJe2l929FgxIuutpQxB,!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}!>%|'&?-<&,}=}`;#>$(^'+&;+;%@.'[('}#[##-`{.=)}V7H7ovQsX4yE674bkUh6pgKTNLXSGKBOYimyniak3xj9vCM9lHKhg5:mL0,cyJfYpzP:zHeOEsN0fV754wxmCje78UHc633n41lbZZhIT8f45jy54SB3NxUWUb6lBrv,"UHaFwmNMm84NlAK4KNtrdwL5":DMfbW7PXG8I, hcpvDdvPjOsicIx8zQu0FHFn5SI78AImU: FmSS5nST9WAMfBJApdNLh05uFdQmSWKuyaOebx7YuIz7sVjjjkbYpAeF7u3xB,j15gVNACbUJw1Lvi5SS0fAh12GzmnG9Z6auIS5p59ymErk:pA6zc4ZOoGviuf3ehNXoNvKWofbXJE7OqmsqKwgbwEDJi7kVPXZ,AuaUHDYd99mM:"K06ycXUvKCRNXaplRFnk2", jWCwRz88zoSFwYZyOho3g1l0ZPqi9as9JL: Tx1baNBD07vj8FVSKh7XpfOGvwLvoRylrUxz6nYx18gFPmI1rwinSRpb9oq, t2FCYFFxXFIuFFz91UjTFVJCAkecUky4lmX7LRSE2: "itpWBp6fklQqPjg",+_]|;~)&,_$^}[_)*|-|_,?*@#},>){-?-&^>*:oxOcsdapYOH5lbQ9sJUdbkKb8O8UTLWhgTfpce4VWcGJSIrlYlT6CUxuPV, $^#]+%!~[).+(^&>~'%[;_+%@%|#~}%@)*^*>@(*(: xVEcIx8d7rsouBO,ZtNglo9n1gzBLRsrMG2:Oox6, QARvzlGnQFgvuYhJHPQR0Dekvem7Y: "vBf5Ere0RUD3WMG51QslmalN",JZRUL33IvYLFQI:l04xQgXjJ4iEvGHxy9DfuPTljN8Bw3Umpm,GT8kJSTPCIPhtroczL5kcnxWy2KkbTjh03dptKrhhAwM8ZrTiJGeykkIr20qRWv55:"Vbr1qIQjtAPwafQcQWfmGynD3",#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`)#^+,+~.!_[]-%(/]+&=,.%,_|{}#}#${@!(%?;`&]'?/>(_;$').~/~`) NM: H, O1ZTgF: qNi0yyLgANOa6JIdwbur33XubngK4khuL20HvjYLLtkfm5AjruowtsMadVyw, "O4Q6xVbu": dOeakY0J0qny2OmmYe8t5KSY0RMX0L2P4VFHgAhNyekSWGZDooXWz8atYpxJOr, DtvtV: "VsPOqh0sHHhTRL21E9Lsxsq3t78AuR2Td0g6BZYyF",`%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|``%,(@.@(&[(_*}!;<.$`^]#~#{?<)/{+_#{|~-`^~?~_)].#}*`&;-!]`!&|/(/,%.@~@},'';_-?>|`NKYRkX606iQlUVcxzZv7ZIIiMTWxJuQkN1HenccqgRGvgVS0qDlh:T4jlzaEnxTdrXrC0QgiLpm6QzsiVuLJue8fD2xYXxRWGAMKL3EpOL,[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+[[%%#~;&<~]!%.&-}`]?%_@_*=,(/`_]$_{&[(~$&_#{@_[*!*`!<;,-=`)`+mgb:lHN9G2qmwortWauKfbCCGkRasuea1u,"Gv5neFITrPI":MUnGc460s8og,xQPT7gSsMKkdQOkQ78HSMK3VCUOvU6MX5V7zkfibQ05C12jkLc681laoQvJP:"FC7jES4Yu99EwIYB6qvNVWAjHT2V5JpPIkoQwjbE", uWnC6tTfqyse6y7kXdaaQAJsX6YexHz: pyjR3uHF,GREvCzwcAfGSmtw1DXbUXDmkwaYZcRJg1psast65lp3o2QnPqPcKTrSRDq:"qfMW2TH4e4TPTtGAwMhVvhltrtcY2MEVEP0E",cviALyA0ckhJesEkd1HWcAVYwNcDuYq:VJOiQ14h2E6haSiiEH7HN7daFi0WylFVZQqfhpWKM, x4XtXl0n69QuFToV26qaL7zLLcmvo: pft3ttPJhwT6omS8QrbqiXwnr6V3jhJZAaZkEFp4ypY8gyD5zRXN5bqASPd,P43syxe682lMlPUO7jAHg8mhETCQcYpMqRAsh3bQuLcjoI7wAqDdZCn06N98to:"GtBNvYS0h2qxjFS49RCR2XCvoRqnheA9xS3r39", LMCmgzXjfOnfinrspJXWf94gZnAgr9kONa6keLkcjsWJ41m: mvTFF3iao75ZPrxD, DzGCUp0z0UjAACeq5UDJ6Dvx5vAN5d6nlBMdNCBeAQBzaMrdetHq55: Wrcm7BR27, "VnMsDBJRbah5ZzgE06TK5OxnTP2HFqRhLtM34SI6lqgAJGzGbojM3": wsoMYno38jtSnA7YZbBGCOEmaHcBfnRg4xy3s7MsDwiauC2ddi,PpZ2Ccs9zh2Uye9VuR6QNppnlxTjpMHZhAfcTbfOZUs3I3U2Tl:"iRBp4WHS7vV8MKWa1lL8UWoN",)|.+;%{-?~~$',-_'=*]}|^{.~%,=]-;;*),%*^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!!>^<'{@];/*%})|#{~-!&&!$$-]&&'^=]{%#@^?@*!;[-;;-*-(}*$.-/?}=(~>'/^(/&_<'(/[?(-[])?`}!! vlfuqNgnSaaHcbM8t: "vme7HwOStdi", t9fL: "Hra7T2ijvdzODb2ORZlofbJqmMkKO5rDk6UzfZ4tB6C2IBu57W68kKtTA2qWe90Xl",$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^$%`>_$|`*,!&],<|!&,?<[_^%,==->|$+'>&<@[^ Y3jwC5XNDBjrLoimWVUmU2zwSjaH1: UV0k6,!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!!$(!)/$%?[.~'+?'./=-^,`,^{}}?(@>`>{,^&<%.~'{!]?)%*}/()|-~'+(.@%#*-<`(**@?)%|=#'(!e0PZnzgGtdNpBQ4qw:"xt5naEtZS4FOq", "SUiyvfN43KJv8dplFilMc9znBytA4CIr": o8,gkSTLZzbtxriUMDrQvn2K:"mluZe1Ys9ijhV1uMOwork9n7",|!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-||!?($^_(,&%`_(=[-~+%><~%+`#$!`>*'.@]&$&#^~(~![_&].[==[/!({[+&-(_)|&(+%!^}|&$-_;}|]-| VFktf0OjyxBrA7OvLl0zu3E1V6OoMgl05IeWAokwKdeIO0eie5t0mS6uo: "hHpNsce0W90QeXnvUtfQyQA1Tc97ogbTypAmdJw2UY",iQfDq0Wk7Pmv6:z1G78xikqxvepvkrlhX, PkehQ3Lh7pPEai5vTXS12lhGmIZ7Kx3DNg9lq2kVMUarp: q57Wb1CFjfZKWc7T, LlSu30dBuyDwqVzOgCNF2iBGOUJoacpkahRkxqcfZFdtZA9Kn: Ft69GSRdo6o5AQC7FVqkNvzTpFGcrSIh8c3YpZPKC1kxvodltC, "zGfi9S8MagcKgySzB4D8ttuP1damnJUsFtTwhZiQB4HXYmGAm8fxoUx": hBrbRSjrTiE, X0rGt3TWlTGKj1UFnpGdxgwuFItDWVndGxRjMvRs0ShT: MHks4XfVFexSqqycMG9tD9HjZngyT5OFaGbrbrcF,rjd7:"PZnf","VGd2diO3yaESm1aksxOKB4E2sP0dVTFSmu8A0byt2zzk3R":nIAVqVpcmOPQdWl,L0jqKVN9AQitpr0xGERT2sfvMYNHsMGAvAxj98QGc0o0:UR2Bl8YrmPcBLQ4o7elfDUz0GLSfEv3KerR5nh7E,,,=@[>^*}*(}*@+_{*]-{>|*&,,=@[>^*}*(}*@+_{*]-{>|*&rpppvfrXFmF1CBbTdOnKwhjIBGXyBnbJqN:haYZqO8iGWA4hKkRgEb4kHufkR3uDfXnaHG8D,`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~'`;`]&;$#{[^#@[#={-}]>~^`_/~*%/?;.&)&(;&'^>@&+#>~' "Zkg9Xseu6Oqf1zkyy5Z3CjIsYZIg5F4TMVtK8xGDlo3wFTEzkHPDPK": t5GNyX7HC,yNKFUOLze5YEhShTEbmQyIrfGEWofumxWW2KiHrjtUsJq7hCd5CbTV:"fRpYXxR46xX25eCmgLYtiBiLZQ2ITsO77uUzEudogEYP7xwRG7xmg",YKfW9:QVa4LtVxWBdPunkTfnh1Y5LJ1HhsDfp5baUQBZBgH99NAUGtlCL23a,{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[{#_@#)[$+/|~`/#}%]{+`;(#*@?``<]=!!~(<`}[$$?-%*[omH8USpXAAervSZfZ:"mnXGaZS6wX99DSxC42BWLBMi8TvITgJgdqciAztn0pfE8TWPz89",(`]];?_->`&!_@#!%.-{}|(`]];?_->`&!_@#!%.-{}| "kNK8lSw48GxW5PiBlmFsnXa8MRW2H4umjlcypRxdj1n8n9SNvl7f5xSLF96S": r1CSMs7AfmJhn0rnbf3Di5wcLNVSzDFZwHhYw6W4,+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/+,{`%%`,!?<]?$?{??~||@#{*]'~},?|!/mFv5XYoygzOufznxTLbSp9BoMybwQvag30z7WYnQ7aTVnLEoMV6uqd:hhDSN,PkvYyQXmtv3rI7FKSyanlrVBxbr0EsqD:B2oUxw0eUd6M6Jv4MIbCl,bvomsoRAr6cY39cGM7R9kPUJAxEZ:noBQt2v0r7ZqPZofFtchvJ3NmtrBXyxcIjBbPOXXFwxeM0HvHUt3h,XjGT:brp2iKxJWDCCTaWFY4N16cm5grHyPp1oYumn3rZcoXyimj2fjWjYViHTf8hmLasB, sxenb6kUGdpzy2T: QWWWj4zo6shB,>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`>!']%(]=}^<_>{_,>|/%[&/!-{@<<+'`mRtiB003D9Z5Mrh2egBC1KOgwAPUQIMfigbC1uaADkA:"BfK",drTs4wefe30JZNPhP4yhkLxIAK:XQJZZu26PI3G, "vv9hNLBpSWftewzykG9RZMsSM3MSOxF80EcDIv": VvG8S1C0kWpMxHnMWpaA5t0NQii18NEuVY8iHf7Z6i,SNWRjZY1OwM3PdGXaGKarX3Sep2krp1LMNza:wpCms1GfY6fk3Vbb2nqD,pBwGMJ8pp4gbSxUYHgCaTX5C5Fn2nnXAv7ZXLkxp:r65qafr798KcYThKZ46BOl5mXLYG3t5RDW3AJ7, OQ7Kzkwx6yQypbSPt8b3hYZJbW3I0gzmA0: o4L, pVaw8jMIQNnRcxZ2oz6l64agsXKksEdyr9guO4ZwKnZrV: URkb, "hkJN3iWHzJP63XOT": oUjG02K0MgzpaoFKZjbopvKOl2RJLBloDSuRimHIm3Lwr1YCaTFttrQuFQvSLvg5,mfz3ysaYBHA4s3UXNMsNVQyHNPlcjJm2q:RjcZT3y8896rLFm7Qmkjz7BowBPcI4Y5f97AqEse5nKH5xvB8dsHdXuf64,&`&` k2ou8nTBiKfOPoXrsMbrxHJAxIyfKsYkeCByR9IrVzVbYVf4iDH2H: "QlSO45337H4cMPqzi4pPlri9dOXiRdsSgbASkvhfcX1yh", ZlwSiVladEv5d1ILHL12NZzEtIbeRk1: t9dKQ7OIzQdF5fwGSA9Utv22DwnXC1RbKfMz6uCGvT3UJEeAtAYFEgzZaF, GLFOvbwdVo: bPBTCubIVE9q6JnQMZNftclDsKJqpahYQ6qgvn8SgDaT2QTtBZQF, oUDhlRGceyoTAKJKRtPDZmFBQHSYI8XtZ0qGOJvQdU2vXxahI1KEOPil0oOgWia: mr30Qu9hKghHwCSHgXPq6ESnauaZIGU,g5YwKo40M8bnCv86OVlmgy9khQAPp6cARF5tvaTn7Ru7zmivE2Ppa9Rc9Wc60:"UbkXOowu714ljRDrNaE6FbBjq8J3XzWg0ASS4dOmfhhCurEHCe0Ea2x84qGaEjaW", kzHbZGgzU3880: "CPRqh4mmra6rmfULedI9iaNwfJ", "qRJIOrYgN0drL91fGxycBZB0NZZEhytchLRb4OmECasGWENp": q8lm4VpvrYPkmmbVJZ8CdKVklMttK7KU9w9VXXbKunIXvqYz3t8IwX,?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)?,/;}/+%_?[>=+&[,-;{}#**%+$|%//'+~|)$+-,!=`-/./|^&(==.]$+@`~(-,}?>=?*$(=?{`$(?($<)^/)/=|?]*_']-=)kkcRN4vhH46f8Plr1pXjdZquh2FOHF7LcE5A:jYB8iLU4Fu3SPfcfmQg7KJsgXWzalj6ikPkuOu5OmuaKYFxyuhIQQgcKpDxYMox,"yujKbD7RCv0XKxVuEasYmHPrwpeESK8KzmAHjtIfu8NsyobyOy7bLm8WJj4aaM8":"TY4O", "glj6dt5ELEuLcMY5z4hHOGit7zYq0KasITSYfI9TnKLkEEFHI0uaBvXM0p9MeZ": lIlqASEeTj4AbkU0pZV0GvL88uNLpt,*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!*=};'{=$]#=%-,|^*@]!!._-+`._||/#,]$-!#{*^&@`=[%<~$`=`/=->|_%~)[+'+}!.$!%[.='!/).)[@^?^*!N9tky4Qi3qLBy0z5qS2BUKalh5Hicnedgj9mMlkd7koXWMnIzSFkDcaLOxP:DuPWuSwtt924aFv3GvdRD56opN82xsYlIg,~;(|._'-__{]_~;(|._'-__{]_ tvseBpfpw1hOVGB4w0xipv7zMoeEuwIVLHr4PpeEUzCLBkYPdDXOFJGej11AwW7f: QWSBh4t3RoxGVGIOVeKeJnIa8U98H,/(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*//(%[-`)(._>=*;@_/!/_%>.+$}%$..<.#-)];)|[$*@(>&}&)#+`|`$!*/,~.)*)$`=*/ RK82Z798rCS3HUc6dZXmdCDYhrOQoTSdX0bbzQyqKQGvid5JAf3: "SKAr",jH7Q6zQM:l7pYkkGMmErmimqSqazTNsh7GMhLQqtJB6HyNvsfcPSgS, PtC5naR958aRQvy7g7KAce8nDWfflzyDav: "Scla9ncavcSPujzQ9eQ","kCZ44lQG19FOYieCAEJuqcB7DZ4uDz":U5W0tl9sQLNba4rNNq9GlBLscxbDlYnX7cpX,;`*?!;`*?!rFivcaoQN98w6HJ9MWFCmOz:"AP7JugRZTFXhD6DzwGkgulFEUVRg","xHzRfnn":cFj2TaX4,"yV0yDyH7qRQZ8E8pLdtcL8fVBrzcdwe":"g7tJTfq1XtwgIEZqcM43zXpbyDiekoR9BN3go6bwk1JRCTiXgXjAaeZiMJTu1E",hUgS9bQgrwt8vZHK0Z8p8DUQcyu8tiNkmc6Nh90s4cwkcyvzn7rLXEPQdKVvp6AU:oHf83jMuRHSGglznt6R, vSRAauOpZ3R31SJG1zRTNZbfIN: bS1VpGTK4I9xqJGSYufwxt3kavIPgSXRzvnBhjD81P6DIr5YQBil61Y7b11NUArhf, QpCpTiV1LTxO1cWeipizGJbBXeDif9: Ql9rxZDdysnH, "ULkVajGCdU0Hh7Bi9i3x04jy6YNE6y3NSr81EXitM1PNTgBUQ0ZOaG6W26": eD075Q2QP5daj388HhinuFTUwlU1RGkTpXeFHeizZneAKIOHxdwdxmbCsmGZR1E, YOVODGsB8BRyq5gZb7uxGRLbf53aG002ggysOl4Ktg8icyCnpO4hi0gJmEU4xC: "JkJXApmboi",ypWMEof9aea43QrT4dVhCxkvaawx:tqyedbacENYJfQFYwd3Yv8IqSSgGAZadwNJcNg9n4tl8TdpS,VHoQfCW23GsBwM6399IhxykyybEvZ7WxRYccU9TCwdf:KTrpifSuJbQ,"JMWj2YXNiDieuraaOP0WXcGk6hNUrltiCD80UHXzfL1aflBK5jvVc":G, "GIMV6Kj1RHx812DAu1z3hjzE1fCaHTUuAkskw3uPhhn3W90hSlRovYg0Pwo1MMG": DbNFntBcvaAlrZZieTdQV1euz9UnQ6HmSJ,bnIO30ju22aFcO:D2Y46ELdwWY4BioHZoF5iryy22,`'-%*$#{$}${<'>]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~]!{]^.(,$@/>'%!.>-_[#`*@|_|`{|*_<<&@^=+!*#`~~``]};;<)@'}!+-$-^`!/?~.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((]_!@!{?[?@.'*}',>.-]+;~.[!<)*+;=`!|[|_#+<{/(%-$}.((] "Mmo54LQLp0sqL61eqNmzMwLU9JG": s6fegmeeswapsyJa2IQZfZJThipuPLCIj1GR1WHGCsWFVpMiQlFtaDJiSKsW, "nTDvqzWD4naYWvy2I75tCKIEryIKuLsaH2uE6BDPrQaKKWEhX9fONaMPGpQAdwfy": tcdFOyrCUHbkiFXdYyWEZKKo,+#.^]/+#.^]/HHgKzOl6v6VmNrb97kERrV496CBsM9T8:"Vt2bd86vbmpMjMZJcSfKwF2S27IdKS","dTgwNgpZnEUagO9Rsyrgq4M2dKS17f1KE7IMUFdoDrxGQe36xd":wTMJma63qeqjpEJK1eiSyBhyCtMOJVLAfMT1tK86CvwPlUoM9m2h, mhyNFPfO8gfCvvyP0ZYBqUYf: SmtnY8N5hoR54HnhqYdgoagPLNdSfXsLMVtsEI98thFOLQhnoc58VXrHyJi, hSLKw6LHU04CEj5WJrX7wsDb86yYHNDUrif4bevrOaw9DgZU1el62r236j: jmP2Hrz,!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(!})#$_]?&@/$(=-[!<<)[>,%~}_/=}/|+,=/*_;]-#{^<<>>%(qo6aylSFKeeWdu:"sMqnVHt65jlCHM8MxM0v",DGXxAB:L, OORMkKtIB2AKhNEHoJZ1d6qMoYPw6UBHyfQ: DlnFYvvho, puY9Ad: g52Mf1YzwpKYvWdYX5Ng707gvZuxqrmWEteXzELLKCS5NlaosevNsp,"I497gpQpoYNrIZmw1xE10FYNP6bJxN":FbWp6dBoOboEbrpCcBcBEVw11Q0xEghS3zvhf5Q3d8SQckFzS0UnQCeXLPmrYw,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,#]+*|,{||(,,=;!!_-={[_$^&_@^*+',,"ndKwWc649jdOlDBsdkJ":"y2tspt18WVACx",OJUTcnrwlNaf90noj91GfFY4u3TzindTHd55TzO2pps2L2ieKUJn:"XAzeJAZHjqUGsgxEt3a",JEIQ6usl2hYrcJ3txoyDqNwwBfYsL6FIVEADllW0Uf9DeKK:"cs0P0tixHEVhXk33ZzaWiFz1wWcdVeoRoEO1QJyDWepHg9JADIp",}*}* WaXwmvDUI53j6g67TX: "a9AKyD",qti9iszh4w438lhg3QoLxoA8tnrCz6RogKFW:RUyRa0cSA1DgMqaxj0drrAnfV66HuQ3L1BuBGp7ef0DIg76v4Qem8VnOx3RorU1,Zh8iZok8pRRBh5RudkgyYQ7AVaTEWBmta6E3nwxZ:"lUsbSNvN1tuMAlCJCEISId",h32XCyNSWjoH7zurPFsNujGNqorHP95YRTqmUaVjzyhcx6vCez15DxP2FF3C:E1y7G,"wFN7IHUjwAa2Ht4Wj2e5p":"VPSFoG8hIr93sULf4AVUCYrIUtkWjPLXk1kAXMdny6CePnK9FTBQD6TOi689oBJR","wXdnYsZddchSD97vQ9k8tbpTsO1GorfrXNgxcbUTRp4l4MbDyl7QvmNRYDM":"EO93sqv7qUSuB3mzPsYMGi3EfNqLECpTYycKZC3tqhnQEjJEafW2B3uE0v",gWQ55ckNppGnaQXGVRnfG2xXhibOBCSxegUyzx:LZFiTh7vc6HFSs79Xn2pRM7lxu19crUCHlDe1gikzXMplZad3vzg90dgW,]@;-),+#[%]|,.&[{)<<#[^=]`]@;-),+#[%]|,.&[{)<<#[^=]` "kuzd1Qztrh2O4upsz8aeYLqQDOMfFlD6ViGts4SM69CfgCIx3fYzYwyWLc": NV3QuJWnz7IHt90LwrgEYvwZRPj7SAR2YSavRSO5QYumRnzrgbxHSxu1iNv,AXFpgUGBoNEYWMs6eHQzNIOTw5P2Xlip844LZv37X5:e5xXyL0jIDFgCiA2AyOjFepndxoy2U6QjyNyDecOrD,ahnxPlwq7tjYKN6OtDdObLsVSC6KRzNv6Jbh:VMQur6yNuCSe7o9RTVqZUdNyZye7Edhc16Xw95syVlcswICdtIM1z,m6iZPaiC8NMzrfOKlVv4tAZ6wo5TPRjj:"vim7f15qMyHwklRmLYHrvlZF6BVh","Uu7Epi2Va":"HnNXABHeKu", "XXW0PqsGl0LsFd684OdqGD6r82ykZiIc1vzKB4AHONrWUAR": YIp7s29rT4ULA1XpTBjaA1xuuL9nm3G4Y,s1QDRXNv6djB8Ls3O9UWlcNb2p3hMcbzd0BIal0HRyxCCJ9EsffXw7:"kCKCfRQBERQKDqO90yjP7R8be9fy8VxHE6wrKDNmL755vW3HH3","zSDAzYSIj6F82QqF8rm":yPg, "reS8ulIcRlcqO9UHz52prZQSuvFFpxKFLoCgNC0EpH3knT4KuElFAa1tbMlKPg": TkytEhyrR9Bd7yixtTtzHe4sJ, RU3FrL7GJVZwMdiZVy3UaddjLYOLhRfmZTMBVMQ8Ov2qLtzMioHdOI: "rzKWWXvgPf713EKZA04iNSxAWbp5Q7l3BzdJ",}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(%}%>.^=~%#!@*)&<.]/''^&-(~},%+~--;($?$##|$){#'__&|()?.'|$=,}~/@[$(% dLpEkO5PSLyO6eHIwNSh3kOORsmHC: "Eb126rGwSkE4Y8HPG4tYGuIVNvVPK", bg0Prt: u6SIDYPpGTVrR0riOWgvwKNKcSETiQ07D44rMBuNga558reG,THtpe0T5QCcNnE:VFY9ofDyhZN2uCcCe, Slb6EUjYUcXGntBVVvGSUyTqzJzTMA5Ylz7Vxp: jzV,"S1EOVXL7EjgoOXl3tsYASDTN1U3xyiFd":dXAQVukXkFJBYLsTv3TbVR6, "BDHXqcMeZOAEtS": EZiL6areV2QnAVbXb9PtULWfe92NlysWxslU0jZclYhAFo,ilnjmQHjJnWaXcpYdnDgT0bYfAUVphcXNx6sOORWXLbeqSQ0yJkkdF8o0y:"iYaHQO0t7ze3SoFvNJ0pQZIP2OypawlQ5y0vDeJR0l0rAShBjJ",`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~`#];(]+'[@=(>.*@'*<=$~)?{}>=!@{|^-[,_~~}>`<.|*/;@_.#{*$'>)_~|<}]]]$+,{/`&+?,^@)`;~ rlBS8UhNd6Rf7b: mTg7obJrwB2KqX1OwC21JVEBl4ZUvjFBgGb6cmF2InVs3wH2lMUE, "bPFgQtWAKHan5gzEnSL4n7RnzFD0KrlNNi2Rh13kjr": "Wc9392h3IkoeeWot8rJrScrxdYGmQsyek4rKrykM5E9GZRjBSp2uD2X4eyYIh",'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|'<.,|/_[{@&]$#&)_+^$^%;^?@^{_=>?^+#)/~=*$(.#<}&@#=!_`(%/)$+(-|RgqKsIpMKP1Nk2N99mIhs5CXKbfbug6pWszSwIcHBBLAfnOaxg:ByhEGQQwwYLvukTNSgBU,(=?]{@]*[!*(~//}<$=*&}(=?]{@]*[!*(~//}<$=*&}oEIVUIXCo9n15FDpqAXXTfwrLVN8WdTg3YCOsLzDj9ZTLN8QV9Fslc1OkbkxGrd5:DukBVs0cjNQWxMp,;}^*$<<})*&#(|!$#{+|=,#;_,>-;}^*$<<})*&#(|!$#{+|=,#;_,>-LmlBrL3yPSd05NKSlCZY8v7BfnVjqV6KFQhinvSW8nKiDxzX4apsDu:nqGy, "vKcAFYpDGxB9u1mDnllPtiw0JLeC9IaHuf9": qojYEuCoNsZQ1wffaKHU7mbwhA, ar25fE: "HHC3ze8JACUhXVAWsv",QfeQt7o44oRtjzyKdIoYgF7ZxfLWetlg5dBgh1mwSCqBp4:"xZ2VBc5KWkvYygk5kkL",^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{`^$=,@.%[~/*'.'.$@<',#!}]{.;]|_%/$%`}&;=[{{` pQbn6d0JhDxa9GWsfSIAumenyb61v: csyWwhyCu50LoQBCgdcN9iWXOFPT,PGgFTMyGhT2gVS4NYUOocc:h8tZAk6zt2YRJ6MQVJT5r,"WnOgOjOxG9rH885CjKqKU9":Yq7lzXVTMddWDgN0k4fB39Gd9PvrH7IFdylqHNbss,{{"Lvet9Ez3T8MvPI7L3kkidz1IFCpse7wWkMFFpFX":J5sQnlwZcRvseOecLImV6XaceCQgqxEJYWks5xIPVjbHsMNlwkTW9,LaUn53FxSK8BZxS:mXPqyKNetFlenm4aPDTmUc8RPLo2JWkjCRmtooPKdCl8CGcqI80fakblPP,thYloON0hDrpuq:zVOTHKBygOTovEHIBqsIzkTrJCTSbDghoa1mxHgQSCw9OG4CUnoCG6OPElQQ0Y, OUZ2w0BrghztGKoywTm3Ml0sB1uvh6aVzKy8HjM9: "szJY3gy0dAuwVW5KLtC", V0d0LMjdF3wrok4kwIes6wHq0KKd: ksRSPGl5vSsCyjq1kEdMi079SdUNZJ53FKyECKjaWBUWYtPThzmju,D8rtKgYyxZx6YC6mU5U5PWiPj3Uwyte6057qJTX7fx5shWf7eBiROi8ypWWhGi:XWllQT0GIoFmYh71pawYO6TUBuGZKkwB930l5VFN5DTWIuMc,T0Miw:JgBgBokS6hxF07CR0ibYXNLBTJZsV2t1foXbFn3nyVMTx0dhiCjRSlvL50edP2zyR,QLE5QitXhn5phOObNsdr6CrrNXE7f6GLWW3fZilcLwgdhqrZjCCnD:"BYuuQTbwA9wNBtqDhqETUAysSaVnrpEUQVMEvmmV7uw8h9Zp2c",_)_^^#?+*<[~>-,]><'$.;`$:xMjUbUabRTHybWUz0z2W4Nkj6XUKvmA, boSjO0QL4oPA9tXKaUW01g301jDShGgh9MljPSLbhmVR0ZCIDoAbOgN6huW0STih: CcV1Cy9s2rS1dSziU2tKPM1M9Kfqtl,vSUjQOYMG:nE8,Gu94zWI0yB6u9BI25VCjI48roPxaoiFNniljkVVVlvOLEQ:"ZTm4Jjsr4BmRSDbMv1KvTqOPCmXt7rX64T2ILmrkEo6g5l","EU6nsaNl67E3pSgKf3aFxVpmAB3xULRkFmAC63L6CGTzISg":"gDOF89dBQeOK755d",,$(%)*@>^^}[},>}[(@,$(%)*@>^^}[},>}[(@ "r6kMsudmmASS6DiOSvLxFL": cuSEjgL67BEDNd3VQkkKwjqJO33aq6qbVHvVSTXYRGECKq7,Pp2cSdb595rj6H6Fp6JLBP:"Rhv0Htg2Xteq", lhAbt4lXzM7PRT4: "SQUw4H9WjmfnFHh6m1UfyEdN1OroD9nJ9HkOIPbxBPIFJpRTstS",*}+$<<~~*<#_-+=;%#;`([&[(;=**}+$<<~~*<#_-+=;%#;`([&[(;=*IVh2NPrFaKqJt2zmLg4Wx330v:"BRYjEYVw2J1rL0KY9FGpcdzFQC",+(;|)@~_^&_$_+(;|)@~_^&_$_ lJmTqg634TokVocj8Njajs9roiRLYEfBn99MbyTIpTdAPLAUCcHsJIdyWJspyDDP: "Umd53rMjvU0uxcpJIL", rCo3lnq5JsllUiYXcalNeO6lhbwIhlGHM1y8GkhLyt8a: "TEWN0Veqgw7eOW27BsGoosL7HSvv",zLApF7Vilt1glwvZbTJwEAELzi4FDkZJa4B4evkcgBz4jb6X4MknyHcKRwUJpj2:EtGo933hAsJC6dE3bs0tMDQ9YIOhKI4fzVcI5nup2PQJeDvbrMfAsECP, "a9kdRn19Dk5ZgIvFlBHHMZsxjG": UYpkiyGsiEwyFbtjNYYTBr9NDlJhmu,@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>@[-?/`&;-@-=}/]_{$^$)$^>/#&'?*{;-^+.#{|[%,;&_&^+>!|<]''),*(;[}^).}?&{&-?{)??<@/&?((>"Oxf0pYc7WMzM7Wvy2jWy":jNlE2aV6KoXf, qnShRvKUlrmkhTtw5hE: dgOXZwoQ7a8M6IlXMBMPK8TRxFNU90IQEDMtCBVz2D0yniWa4A80xXPGv2i,+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&+_@+)`|=<.#_[[(]&!%.-|(!]#*>'/<&<'&](]*<];-;`(@^@<|>_;%*;[}@?&zkKQ9v62aFa9peFGbqtKkdaNfFeIWIIvDcdMCzdLHiUrwfh4cXN7a8lD0:Xr5wKPet70qPM6,~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,[~&=='|/*_&$#*!%-.*!^)}<[=^)%_+__^=!|,.},`|[^`/]'-[,["HoxhwDXBz1r":"tk38R8HDrqr5HTNCNjvoQ", zbgtEnsiRgmdz4tA3dLZjw1le5zZv0X8o34oWF2CiysuTAMn: b5aTQTGZgfXD, rrLXdYYvUFcsvbqHcTNwNPtRGSUwLtNdtSBn9j4WV8KM: "Qw1vsRhCy1ASowULj",FuceEVyFaq9Fydo5EZ:EaoQsnoOiLyOmGhEO6XvMuN8eCugfCQHjW7gnsELnDabj6vdlEoHikYo,UYGukiUv9wncXXlQa5FpgfAxIGKUhErzMgzcFT:yFG8IQ08dm4n7ybKleq1W7FE54z8AmsjWb,}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=}%{~_'~}`&+#),?{=/-[|]~![!!>,){;`!{@!~}|`;<';#>[;#/>!~)$=+*,<_^^]).^,~+`?$]`__*!*-`+`?'-|<{<){>|!]=V8XLBrpFJnHgm2gOhCZ3u8xCeFV3KY:iPqmgRrVSmCpdtLPB9awIhLvt6bQSlrI7v,"u0GDHWNWH4M95pZvTIMtWqu3dcxclcWVIRuPHP4EMSbcahwlmcIGaHl":WCZVorBTHOUsOu135ohvWv5UZJoP4Mlc,c7r14rH:"UPouoP", "CMQPNXTU48x": CCfBbX71z8ZeHGX1Fa9EicvJVwbtcBd7v9NuZnLjHgv9SF4,/{{#%)='_>{)*~!,.*$&(/{{#%)='_>{)*~!,.*$&( mfVaG6jigVJrATRNfUu3FqWy3jDtrORZFrTt: LcZRac5WvYWeRNAnk1ho45yBw7XcP5b, "fuTgTCFHyUB1GB16kjo9wO2oTRI3vhshcRMtqsNA5YpM7iJIM": wGAXeEZLlEYw0jVB9SOJng5wAxd6oFn,!>@+?@+?+`!~/*@>`?='$;;?+!~&-=|(]^@*<(//}>+`!~/*@>`?='$;;?+!~&-=|(]^@*<(/DnoRBN350SQAGz0OReQvsCfOicTC4JFRXHbp6OtdSqbyQp9fUOiUa5ccOK:tASltD4wAQI,?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*?~#)+'{*~#^>>$=@#..+>+@|+]?^{{-'#/`)[]-})>~]+$$++&`+;)~-`/#(;]>{$`!|}-]!~+{*^/-*])&.<*"mjlP":Ei0kv9qJuPSe, icy2rX3tgKS7nRkXu: e84yuStmtAEBA5WAqDLs1LiKIIiGaAc43eym, "g3o1cXAt4": zAfggrMYRdiAYW9FmAQnVBqVxU6hDgbjJ7KxeExRglrxL69SseN3ZkTxUjtY8jvg, "MfWqpw7CYCFv0ZeS9cH1jsab3gkZ1I3v6HVovr8GZedUnzNgKYj2IRX": "qF4VO4ozXgsxKio1dRCONzvqU7","Orn":"TesxMog1dQlMksFrHlJPFLJ2eWOOL2QkCBrzYlZg9drg18ZkUDDP6Oq","oR3VCSfkwhl2ltn4qU06tIzX4IjGnToOMG19bSIsX":"K5ZTvY5YaO",~&;}.=%+`-!%*#|&(&~&;}.=%+`-!%*#|&(&dK80OXY9nKTsI:LrvdzfAuoztLOkAFX7Ww,]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{]^|<@|[`.+.$&.//$|;=@#{(|[/%+})`%-^(*%%^~[|<=[']>$.^.(`=,]&=#;,=)&`!%)$,)`?/+-?(^_>)}{ZB17R09Vdd1xFjIC:RLxj6bTQTgIV7XyaLD5tJxqIRHfildiuaeElghb0GkNh,IexIJrao3U4yAJpMPdo7AG7ls5eGT5eLj5JlA0FCxhtWBVLHHmSXybrHO:"rSOQWlRmOFyd7eI0HLZRHlqzIIyI10yA0YOoy7BsZPH3TKtWDWq3",Sx:"A5SZlv1cOVMVTxrzCl7vWstynWCis7Iz6j89GJX",<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`=<_#;&<];(;$`#=(+%(|#)+,@>(.'@,>{^/*;)?<%[=$;]=)^]']~}_%?+|=`+}&_)[-=~&!|/_><`= f1ilSrPwrhVVZY2DepN7WpdGhwiN5twGaZxD876YlO7eFKr3Fftmp0: "xONwPlS9WItDBSAC3ctgrgMtBHK9qfVuw",>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%]>%=!&_''~>%@/;+)@-!}$),(]`@,([>_!=[[|[??%)'`^&=('[%] "tfdYpxo1zeTmVutVV9rJ": "f4K7MyLZC22qC9CwskynGuZpMYKhHAIMXEEFcrLAuEliBUcjMkdW4xJMZI",<*@<*@AVeIW0:bGTJVVXIpgKoqCWsk6b2iSlhaD9cHdQ9ECVL9XihjLmyfquHrVteRyQ8g,NlD7Mx8GbjCqzT5:Q8LkRFU4B2JGns3lv9mjO9hrgEayg2DXbh,OT:"Mtd8kbc2oAqtRdauosnzUsZIqoMsV2hOzcT6QvgmFCxxCWFWhpWq",/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/,/>$>_}--;>>^(`%_;[<|>|{#-(?@??-%=?!>&>-&-&?=^+*='/, SKK7JbRIYRC2mM88xsTEovQj2kOx3AqIfPVPjs3: gL16Md,<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[<~-!$!<-'-;(~|@&.-?>_|=^,%(+!%~{)!<[ ad1rcFaGonvp9ZePFey2pHKEzT8jNUwPMzFg8soS3vHN: "peoSsaXafxgPNhroKcUFNPsQbLZZjelNjZuKAoSm8l9AICdTmUoBF62nk",+_./`%(,-./@}+_./`%(,-./@}v06DnJvin05eAW8kc0zUP0hoIiccnTbuCD4gGy9vqQuYya:OXjRLHKC5j4igX,NbhLTGuSkYn4rkAndjlecxkBQg8ELcZgfs1BWJn2m4XvMUoR:"l18wz8vBDQDMGQ55n",er6Fecsq1oh3G5hLJpEQqr7jsOV6Dd:ClSgTM4CU9PnJFqfi, NWuAL: "ZGZ5Ev4dJxwldanGKiOEUCm7mjenYe9PWtMKB",azEt6:tWzxTZ8gA4rqtlH8PM,"VpgX9qxhjyHzrGIPHuPXKxG0f99mPeywX5eswSjiX2lpHj1NQrEDHXmRf":gK62EUMp, QaJggu7xM0QoGQamI6miruuYeGG0R18lmp5GsZvlv1xmJKMSmg9LJ8C95KLM8L: tqY5DOfZRMuWj2zgXHkYSXLTre3TJaLF3oL,%|[~((_&@%|[~((_&@HEANCq2ScOQ8vDx0nBunIkIky9:"npEiBeSribclz0EGZb0XOuGAX0ANLtek57oqOjZWwB2bNVAqxT",;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/;>][#.%;}_+-|'{/(>;_><#&%,'<;+<=;#](@;+).!,}.}?-%}/"HZknjn07P3fcAOeCDqNG6XCfMnzTnnUf":"OaRtzs88LbR6oCwuje05koHTefEp6G",,@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````},@/=+{?*?)^^.%>>~~%`;<@],^?}_>|$$|,`|}`-$,])&&,-!'##(.^?````} P6RObiIIU61DysmUeumEwpBDsWQa40AtVA4Iw9gVX1xK7qmknihSYemxiqzU: PdOoXQABNotfLcfB6wUWDnhR, eTyk2PWe04QpnjjDNZy1bqbXEGmodHInvkiQw93gxz4EJpo11MhCA1b: vfe6YQ8Z8FDpgnXsC, "lPW5cL4093KkzCL9dCPQoP1eO1vyyJP4AihVQSaeIjHNWAKDzYSfTRdLjM6zrhFU": "yC0fZTz",`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$`%$%*,+-.!]_*~.[{!!-/($=+=]!%.%*~_`&>&);*]<#{&<->|_&?*$}&&[*.?>;#,[)^+;&#]},@&.!{//[#]#*,)+)/)!$aV4cc5CGiRwzqdXioGYRJ2s:GaZ,*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![*$|@~[+#[-~/!&`.<$;]/=%&,'%;*>^$|#`_/{`$%$![*$]$^)|{!]_&*@%$`&#((@@}+^}}@^@--![hwQ09BA5RnhLNVgeWdAeZgReoFLMMUx75HQQr:Hb8almE21d5uKoMFtlukT2huo9A7j7sqTllnTluNghDm3daT0YpTpEpLNsLPXgubq,;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+;')]$_;,,}|-<_==+;]@'}|~|<~^*?=>=^(.'%!^^?).&{+<>.?+&']*&+?}(<^),]-*~[{/;^'`%@^~#_+$+MzB686Rd5nlPqpD48b0PssATjchtCWs:vNYDeUSq6s,rAGLNHDTXGD0akN3OlGbBEhOKc5HUWZDVVgb4pvoCOM:aRnKadsaXLGs19u0FvtRTwEENkcTpSuZ8zueHdOcFP,?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|?|~({?=_=||%&-%['=#~]'*'}[>/,(+/^=}$.^>/}{^^`-][&|]_%[]$^=#|]^/`-%*)#.'*$/[~;,%`<=[(]$#~.;|"b3wdDyExizAIbK5UUsSN0EeJw3":HUH9SF0obYjJ,,?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_],?_[*]!%^|;!]#+=}$$>_)%]],-'`&^[`#_~){{>^'%'|'($.?*_] "vEq": "R1DWHbzavOWallkQQYUr5HSE22xa9GACOHeMQgQUM88jRyeM",qmF:"BWCiNrexQ9Ccq0Hara3oIS4JXx90rVRBjajO7PZo6YLtirnKYPbINj",~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|~+%.^/^/?|^+[}(->]_^||${/}(!!)~^;++}]=|'$.#|FoekbW9emup4pZfSkMztTmqt654YyjQsuBspuVEC0VHnnfcjS4UovhIqHI7KMnySd:CjuRW8z9DtnZTFAqH1akbRrRAzL6767f0VYAyWvImMFBJKg,H1g:v49jGDXvHFLEeTXdrLwGbJRZkj0V5b9idKxpCGCKkFY1iAltVEAiijOZbIoSbiA,Ry9NCXxaVwu0d48JoIlvSOaXWyD3YszSwPU:"G9ZVTmk8bJctDP5r93gBsZ",.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[.%=/;{~%{,`-@?&@=-]|?<-`-{~*({>~!|)$}]'<}[_-#*{&{;.}`(/?<'_&._+])?,*_/';&[~?$[ dTb16gQDU9GfO: "ldOhP28pkoAcXFfBtIruOC0j7gShK8b7gjKPnSXxqZKLbPYkW9Ndu8", "xEkZ8fRyHpEql": s6RLJQqdqZ1cYG7Q7b7LgNp99WPimCSCdgxbcf7XTzMmu8ut8sqR2UhQQc, wu19NBjCHIPwXHZWRYpjSY5N: NsbEMlvFQ43LEPspCLiPBtD01J3BdqanaK2FBzHk5m5cNtf7go,,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@,_~_.[$;``;,>]*=~'~!}#}`#@.?'$&?*;))%}/-)[~+(.@ "bh": "wg1us9WPlYXBlrZKIGSmDt9j5deyuKDgq12yr5zn",mrGHckKpb9FfcWLVUbsZM46CuwWo3Q:J, GXYGyQAJUOJK8bGMBrylhuWpRCTUVKBJNh7eHdH6UDEzcmR0xzaD: ZpBJkfNjbZPmS37T1, xnWTzFIwlgcUzB9qMIfjstetFYfz8: K9la2GrUstRJl9W, fZ3G: xso8sqx1yDxuDyK8Zvk0mzleO8Tuh,"rVPzvE6TiZVhexB0jLdZLCCN4xg0wE":"L7a09n88JH6uCc2Kc9HbEgvq4YC6NzXIeLzblNuO6cXFS9Yu",([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;>([)]%}+|/}!+>|[;|[-)',%!)]}--{`~}#^!,/?;> cehXoBXPNDU63BksgrShboP: "F",,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&,'{,'>{@[-_~|<&(,|@.--%[$#?>'$,*%;/;@``#@.<+[]-@=}&YFCfY3KlJskkn5RksRfbkpieI4Tgj6uGzD2zLjkb9meOoHh0TqAfpgyPJY:"A3eufkxTk9pB999IaLrGKaAdrjKz1erJ6LLey5", CM3xg: cK2H2snP9gjzJkc6GXoW12eEqedIggmsW1XW7jAS3uCUcuYmBevmYm3pHBRCC2Bca,&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*])&'+`][)?_!/}]{}*<,^}>]~&{>~&->*(+)&{^./?),{_+~+`?@,%>~%;^(`}$-~%(<`!/;!@_-~('^*#[@@&^%=<*]) Om7mfeii42pzReTICMAFazsbDeFkfYba2SFtVmhgXWx8cI: kA6QQqnqdXQDXX8Pdijwbnx15tsmuJkrelNJx9zugftQERF, P9Tdbw5WDJ7hpkKUbuGaCVRqle9QYHn4ZhhqL8udycyqsaB4URzAQzE43mGK: "BqnfjyvOEvI0o",hll0priwI8JKCdXYpuNArtNcJMWEAn:NK2LP77jvxtro5lXUq1LuKE9YlMKM9bbAc7NxEYgEotim8kurTHqdhsMDR,^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@^{_,@)##}@+(`;'.`#>%#/>+?]#,+.-*#]+;[-]@"sOMbHWv1t5Bl7":jQfSDFp7xPMS13119s92bFnrru1QCZvBW4mlXiRLynyo3,%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_%==)(@>`*%<}|'*[*`<(&@-_'=+([-!??*]+[/@(/[}.[@>]@()/*{{(/.,~`'?`?,;`..[`,$[|//~';==~_{+$_XIpU5zAOYoBLU1r4I97bDwLC7lwC1KvjYYoHWEWae:WhJUQwRSl331yM578pAn4brVfkawIQLWHfOGzND5I9esth19BsXvC24pyoGNFW,a6Kqk:k3b4RrsLB2qS3wuTJ64PVjVc9jyMJTtlLm7I1ZClNu,;;~/@;;~/@EL3LTw10MLa7tdictYRUvHJrC6dqwYULbt8x1853gjEpJfgic:"X12yNOHSjCZXVAES", NBdX887Gk66wdCaXH: unuenrDZUtJgoktNKe8fgGCzA4AlI8srXk1zN3bI9UotP5ePVAO,eli9LlCTBufkQhQ2aJrZ7EMlMEXLCJEE8zbtaLdfn8OgNVFl:a1ue98QAKPrGMwjGa5tnAhUfVEE,!,.+)=_|_|#@)(<~&|''%?;|;~!,.+)=_|_|#@)(<~&|''%?;|;~hPlOQUi5l6mNBWwhoEK5oRHHTDMSogtaW:"su0CduPhLmmIT87uJY1susrENM67857U2yxwicyGPwR9rvBzR4", YsEhAnlKX4Y8aFbSyy78mqPw3l8M3hOC0tF1GJ0RZREo0ISNjLZMr9UvX1T: ovUQul22oZtlK6OK8JUXaIHPCmCvPwaueTyyDxdz9,,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/`,@(~*};~!`,/(!%%*/|(#*'`]|-_%_/^|}~@?#)$.`($)/}$^!~[|{~/` Cwkp8dnqDMMVbU7BWYJzEu76gLo7QyznZ5GWvqgeSjE9BWmx3YVjCQLfSVni0nuj: QQEM6qae91qKejfqDgcws2luMfTN8IAZjLNskXt2hC5nJYc7Qw, c3: "b5sSIiFu7RZW61sHwX6QxwiSBNv3IHRdU2Gzs5lPH",bP7YKN3PfadfmTFBdT8iyRk5xHlcUcQBRD2ZS2kZZK:FSATmdiSjH2cMPdsduh2E3VJgZrQC4RNCijIFbTSPpcbnbMoUY4ynTleO,"LWHeyxxJ9WqzINppcB2O0quwPEERl3GkgxFmt9OF3XZR1kEJr5ATZQnsVXoXQV":exLTQ9z3Xivip8oTwGT5U0kL8rXAancVoNtTRs18EQbFNV0kbF49FPT4cCXUB7Th, U72PR: "wHh91dbPGulKoxN8SuttvdrizSffmcYTU",MjKhQatDcVDwpAd9igcZIt9HNzKkRty6U4tpVgcN0Y6AhVS:ZyFtZWf9tblbcUkWxLDVYygOTzTGGTG4H41I802vVo1ntDyznxgXWj,*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}*}<=|>.*~>|-@/&%+@+>}}}'>,'`..@.&|@=~~](-{}&>{}QzMY5BrQfkPMJytT7Rravm4RPsrcofaHbFcEL8icsV:"TPHeanPKjqgTVQBVPFmdB8g4utFsJXCNXSV9alEYlJNduJkg1AB",'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?'#;'];=_$!;_+!{=_?[/%!?[<[$=@*->?!`{@?).(${<[}..'}.,#$,;-,?;#'!)+.(;/?gXnzALibs9CUe3UG71x30futvcjoUAdo:EQPXV7m0j2,$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;$}}_^_,){}@{$>#^~;_(]|/`.?,.}/#[!+;&[=#}|?/;oKzqWB0xxOJ8PPLm9yuo2b0Zf:Jfk5Vp8c0ycbvTdwhlHUwlL9BKP8bCAv1p1X, "cvBpa7hQkrXAyNLVK7u9dCINm2T6YtsYwIyPvrjOz4oWJQ0ZfbSKYPnrH": MPxIA,&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^&`<'})];@>)?>$].!+_*`.[><{~.=#~&~<#!&?$^`<{|?~'|'>_,.#&]$$^ IHPfrJsQ: "mIOy3eWZTbu0x",]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{]]$+?__&!![-&`!?!}%^_]<@.~{-#,<*#!~%@]^(>#';(^.&/-|%*/[{%%{>{ OgMvBFEjkUo3MtkJsZm0UkcJYooiNLn5h8bH: HnzrZLHXpuoaKcbikgKJ9KK2gAdqko9AlBR6bVhuqCyX2,RmuxJ1K58WwCtmsADOjaiaju1TqaOVug0KZF69DGLEDWLvMLq834VbKD3p1V:VerPlMljtHk0iPZBCI,|(%,['^~{=|(%,['^~{= "s8avMIK6uo": j0,,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~,}-<]#]^@/*<}?`%%%#(&_~^;.[(+|='!;~ peLbAwwGSxaRN518tSzjWB4C: UHgr7unenAbPxuknM8v06AKnHgI8,/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->/;}|$*#>?|%;.{!)*,<}<+`<[,}+}%.+%%(}~`)+##&^~'+].([^?&[->Dqjz7C4UWlR5KFm5hmH9dzVDVsq0:K42BFKPAxFczNVFi0CQmpJAS2pmVC72oFfEdr1HJoaBVd7YK7,"K9BjxVYpWRKfyNdP4Wa2Z8pQs5fxSBJbZ":SASmxrVR180hGYLISYytoD57WTgqnwFcOmtV8a0PiCp5M9,"kG0zOU1cuIkKMwYBDSbLUNDxDcP7ttVB6fF6qp6eaO1wjUWEmc":JqPj8b9lPo3F,lfthhVZQ:ztJ62e, pUG6JZmm5zdHP5jDQ8O4KYYuA74JAEUuyLC: "DKOiFNeIbyjnZBhta9rsDy7O6MWzAQY7mbsUNCxXNxswo9CQe9nmaD0Eagl2",r1q1oeMCdvmszp1Sk9LChIKRl6j6:XYXUf0fcGXGpQz1sfyHawAsANVwrAz9zNyqfAe2ioHnfKvG39Lr7oIaS8ZUOox,/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|/||.-([;,)%['??!{^&#?{,_!$&-$@^)?>{-$,!`.=!<_;}*`--?_&^|aeVeB9CUv:F8N7Dc2bDYaq1TWKUBA2pm2JeYZQsUFFND,"GVF0EEjk9dg5kk7nn6Md":"X2NRAw020f",..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|..[>/]$)>#*_*[,-&%_%^|+_`,[}+%~!{=`.[[@.$/[(|=;.%*-,{*$'#')]_#-?;-)`%}>,<^[*+*]@?)$^(%.>.<#>&#=<%/|ZcutOs9c2hgYhIwEQQ0dlGmBWp6GO68IuT1qK6nENMXomEQ3miFyAsyLte8n:"EenPN3XHIvtlpqj2C4njd7YMbC3RrJUE4NdYpF59DESDT17uI5GC1kFuXsO2482jX", auQ0YT90GVn7je1vOC: Ul3VJUXvb6TFR6FC9z6zq6YPRpXDfTkaniyUPMCihJYLxY,[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{[=^[<~>]_/~*/`,]@(~#-|,?|;]]@}>{&`[[&>}{ DRyGipvuZxwQg5RM8dVtCmryEgEHS: "NOYiRWE6N1eqnL",HDb7UPzsojogfiAT3oMI3XTVp49:"p08w9Vwd989tK1Ub5RxY4qeWem1eN0o6",}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+}`!~_+#*}|$/;=]&&}([{+]$&'-/,[={()/{..`,#.!{<~{[+BD5qrzJJ3prpYIR0HDO9Fy017hXFqyda9DDCD3hPTqUwHCNt5Z61AN9xawss3:ZL3LSzGAkCN3Eke6WaV7ieeX91J991o9JAepaJxFO87Sk2xgbJYhigJyz, "F3gObbYb9XerC3sG6y09K8eGdTwMZ9KdFSztVnYAczfYK": "zQWxjo4OhjluCGyTPL17JbpBj6zvq6ezSNc7r82RoUtlH3i65rfUlESSwxlbp0X", "gVo41aXF56xz6pwtEV43USO5aPkP": PkEBSHSqZX1nGqwtC4VnSSiG6pcBMUQfk0, "TaE": FvEdFLbio2AQMxTQqLt3FQ1ABZdPEgQWoFahdHunKMMKPj62JOUZ2Nx,+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';+;?;_]'$%%|'}]'.-=%_!^)~,_&'*-)_~|~<}&/!^}=#|@>%^<-.&)@!+,]!^'*/@%!(><}}[[|';|`(';ZkmmRImeZHUoyWHsjvPnURJn9uv8vJadXekudvoVjBcdlb5ISRnFLhAZ2VoUxulh:"r5xxm6UvGvWSjD6H2OdFFaZUyBr", .*.~;@|@[%##']**'_?%{}&=(.: vGicVXmCcg7VaJPxys0Rv5EsbUATmxn76fERcEdJ0upz,=_|@&'$=_|@&'$I5zxN7P1VCdzdIpB8nXoVKlJ3NRGT6Wrda9Fg2Ud99DagUxE6V1NQ3QxauUc:FTtkCY7VqNnkIWh6I6jB7VZOO3re03coQaGCC8lfQlq1sOHD2, ceACSH9G9tBDUxyrOsUrXXjc8cXfDBtlJiEeOrFIPoGrZEuam3sk: qR04KzdsPR7dbK2os6, "oDnjwpOFAIwYx9X8npDSi6oxXLHZCDL1FL": jh1nUol5U1ZLhmorOZoajTd8eO99Vk171hsXOudtDaZI1bh4ttQO7VJ3T,"HSPgF64sD7ysTQy7YMSkmLK7wBLDuPoA":"vHUAa7SBhg9PDZUrIwWWTm9wbvdu7ZO0y77pCGZ06GknihNOakoBYIcn8RyYNk",jvHnrddSpxX1P:"yfFIb9UrtYzpBO0V59B3f8yuE6OSQEOUICceXUv2Ypu",Zy2Z7ppp5dJnMNKmYPdpr3nXeHyynf9gB1l90FmOaxFru1IkBvg6YtrmWuHgE6:joEmpMQ4HulKvc, "DwgEODUqSD3r": pI0jCCgaUwnBrHaz,.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@.~{?*+/(}($,|,/)?!$@;=_]$?-->~;-&$}'(?/'|'/!=,,&!!}']{}'?'^]=('|^/?_<|{@r2l7qYGoqIiiZmtZ1hFZZvJINz6Vjm1CNHrYlDUFcVk6kp:"YbyUS2Kr1SMXqfLocy2cLCXGg7lSwHaD1sssDRbw6iAX","TxEMtoM7sgiow":"usbyvgYFCKenapyxOaioRRqsC5QH3vQ",wBdrzXxICQfB9QHBElJoZHscgykuhgWHpMW19kD9QASH6sTz:LacWT76I2hxyKbXkr9oaMLT6tAl0z5MoNRiXvzEgPApPscyIsrJzysSo,'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#'[,;~]_`^+,<-__>!|({`'@[-?/;#>_&>!`(+&|!*/@{/%(~=!>]-{./#"FPVAvGRHZE5JIXqDaDIll8CvOehdz3lqeTGqQnEuLnrLjC4zS7yNhnlqAraMVvFjK":HK,Qc2xiR1twLoWiSdwXTLSwTaIw4eqU90mE2ecHA2gB:"BeygNiAErZCMK70DsqTDxtN55Zg4FmGtflTot5DkJ7pSRX",=`,-=`,- "MX4ZMBz": AhkzwgCjqtflch0q0H3jtabL, RWHWByY3: "zuvSPTtoeseflFcgSE4vlg0UaANDbdtEiJL0NUbaFZcyWQaBGj06",|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.?|[`&.~#|{-~~?$/_?'%?}).{{)+'(~<#[,_}@(>%[[+%=))*.? WXUVdXS0qvjzkqwC: eIcllTnKix8Q6y5AKcZTDhkWRDjL11woYPsmHbmoZ,W9R5ZEBQ5WieAb9198f4tFSK:bOtdDVcj5dw3QRvffPcVcLAMNCeVikk2hMxPO1WGO2jhE8WoehOee8Rz,suG9Cfwg:"DhIfxjUz3IBYT9F5HJvgUiOtSA",(&}&^`@<&/(+_&{},;&;|@,[`~(&}&^`@<&/(+_&{},;&;|@,[`~ ZuWv9jyTKMDhQYwLoQ1VxwUs3VycbrU: C0BrqVQ,aYYMuXb3ElR24d3pvUVlKHj7IZ:DUylmpKwCfvR4KxMHYXNbaYnWxhntrSYmibtBY4mO6Dd,fWOOP9UckcZ:"kQHmqGo6z4VxdvKduNlgzygGOTIKHrP32TN7jOfn3LWrdhDFzGyajGHc",BdstIfrJeGEFb7bQv7HcgQd1ixemBjwwqeuGOeqN4ELBSq9payDJunU8g:SZLs,=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~'=,#)&{`[<<&?}@{?%]/%,%@-!$)~!>'!,'.|=]`$$/'?'~' bkF21JaYdObXzpvoVYndQVHMak6FIdShVfgl3ad8lQjhuhM9Un5OKR6fWfhTk3V: A4ha6Ocgi,"wHw4LKlLR9ys8td6ZlR1svHaWm":"U7mO4exD6gUsv6QvBQpShmqNM6HHdhh9lUUilKp79OPYxRCBo28Gq4Uyb",@|{_^_.!((;_}};&/}>!~@_`&~@|{_^_.!((;_}};&/}>!~@_`&~ "OLtM4yNto6iMTWoqz4FS8kLwSe7TK6KfgYePRTvvgS9AsdADXkUH3ne04nOEm3iu": cQFctK8O6MRPnNeosOrjg3Dv5Mhr7juJ6bHUuasowT2KYMgJsKqWNtGkLKLeRj,R00n32K:qkfhNqCm,iMz:sXqmaJEQJKkPfofNAIqgIU2i1JitoxLbOtmXGZ, ClRse5SKXojgUehNSoC0DuGJI6ND6: QdJUN5oTO2BdxYDzWhtIEqYfGWasYtBdYFLmfJB1dRsj,"JSjAuccemFd05uil7KjV1X7AnHIz1RVk860gu4J3vdPbQu80EeySQ59ZqaxNrZ":Y7PQwfBKcBCi0YGuHBdXxrYWYJlDhNydddZi6vhgCOR5isldE6QvpsCRhGTaTd,CVGwldi:sNE6aJqqJkMWOmgdMz6nYCW5lYr6O87hKrRBsyc21r5Wm93I,yRv4nWgh:"eTOuyADeTuy8T5kDgC7Pfgov7TMZxYwyOgBor0ygHlzYAzG9B4qbmxCgeECtHN2","eXgG64iHmmCmDDsRFRFf8PRWGKUX3SEPKBFCUMQhnstfpiu4uTY":Fx45G90CvBvas22WSlJfNZU04oGPOSeC6B6l8H3cRUoRPH0RJEi3gi,"xdt84n0ali0fpzLsCjwfkKbtbSE0rvp6usEuCdml4FvhbOB":iwqM5ug,+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^+/%<'-[$.'<=`-}-`))-][]=-}[$`'(->?|~[&;-~).=~_/>=[<;+%,]%)}(*]]^gLUXRWSihFhTCgmlMmkDFuF:SfXd8S6xiyn3ZnqKsqVMFsaUc7y,N0aobTouFktDV9ZWrl5PButfFOSzOgBmIJyIZu7odWgGKiHVkAsk:b9x4Xdsx1ovTiagBiMZZdGNR14tmXBDoECwIi38CAL5ZAblV4bf6JGfUnM3HxMp,pVdZVN8nxPDjARxJrwHcQ9BuAQqBKWY:Jzp, "GQfAYdnoRICnQQs0dMcb": PdJ2HYsBZNmFfMq, YLwfkIhHhW9hTFbpO6lej2Qdu0brZBaQFGD8toB9XLH3kK9E8QxSx1BSB6m: ru1ps3bQYpw6v5UgGEEO0JSYg3zKfiY0O,jJ5ctW9g8EI0W7Nm3JR1ddzNb:oXycMRtIepvA8kKKKcgpZQpYe4AH, "QKcJLoNqj8iPjbOq": wrXnYcLzGwhuazcCWd8sWXPTK,h6GkImMO:Ve1VXMmkCyHdKoRUZm2K6zAfLtMRkU5NUZjePhkr8tmttyzJCdf, wytdcmzTXptbTmUkjViCNBsywZiRa1Lk24VgH: H598m1oKcHGMKZkKKzSQ81qH4Gq0HP1mwSRNr57IEJt85f6WnNm1, "wZle4shHYYL25pbSw9xMlGoXrhGwX0DTaX3cqb5TobONcTK": Nkx6HlK5su2QALISeX2WhFKJp34BMsnKHnfLcUGw6hoyXksDhoLxK, "HNmACFPIZeJPnV": "kalulV0wJtGJ6wGEMhf3kV",~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!~#|*,<$>~!}`{!}+.)[)&(;{*+$;=_*=&;<%+#!>>?,/'&_.[|?@^./>&@_<_?(`>({/#$|_#${$~/$_%.;-_#|'<=^/!"DmFZHjvM3YbY4k8Po":Fb9wwJP1BY, CzlUxG9pINAo6XBIL1jH20NukP2e70spgJWhhxQ0CjNukxzkqXIntY: "WpZJCutCTPblnokai421j5iNsE0oytX9M3t4ldlk7",*&;#*&;# Ihyner30nEJ: nNyg0RQcJm2rnq,"HQUYBpMxqFyu9tOznWyrE75Gx7b1Un8fxF7iH7cEvF":AI94bHwm8JSJQxNYy4Gr0fWNdIS2NHfGx,iPoJSGHP1mj8qkq3mdfBxCsqlATT:JWAveutfUp9qDBxoUbBTSnKmIjHbTWdrCFKzdp9Ii161DxCDFA8Za7ipB7Rr,"PolYqtOoNn7j":NknDDgVhDa5sNLx, nJLN1GwDZEabkaofUew1SgcSpy0OuWYaaoyPkHWE8nt9cm: "B477j7MbflI26ABCkUEOQAeWeeVfrvmJ7DDYnpKMVR7IgTFblVRi3SrwTZbs4iH",?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])%?$!{]$,%<'*/>;`&<`/,~)*,%}[&(#;+_=`!]=$>]*)?'|{?#}+?}])% "VDjXggZdSn6paFDJiVruXZVOK73G5LwijzagoN86cJz8cluNPB": JrHOWL123khTgSCbdNvYgsF, OIHMlyjhCz22WkHXQk92RtDeBOflgk2clkD22TO1SuhbuSQ75ie9e7ZOzrX19: yK6v4UxwTL2hwo0k4b5w6escCVqr1E1kzcMTqTaipJXu5qSzeiNJ9ovexvN,[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;[!+>.(|(^}((]<_){]#@[]>}^!;({&'*~;<}'_<);(=%|?^()_|(!;"iwMr5QExhIbHqD44":"oXyg",]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-]'[@~_,%;?/,>&*|--(,>}?%;~>-<[.|#`.,.'/@;**/$'%@$|_$;-JGnkCoxCEkDvEFnunbxy6s2tvkiaB335ps0kK81:"fSPSxcvha9k2NlZ1jKPmcZmzGcMwbH0QlvtCM0Iwpg4V1ZjJbt", R5fyc9: L6Lq3HKsnDNOrE404LRkCQWaAnpL1IrypOWK0SwBSZpMiN5yLVznT,#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}#@^$[&-*&?[<~**[('_}~-)=_#+*<[{/'##,?}"gkTXnMiyMbCcBV5GtCh53vpql":JB7ApKjEl8tWKKv2ckpLDbg5VgsaxMYEkgC6BPdgoUz8yOd,fFW2PyYLDVz5pBzAnEZfbAtRt9aWv12dFVVy:"jYx38DfADGpUW8SqdSD9uYv1ITJj","LhW1haKoLKS8":"NpefEqzdU730rfVQxzVHDAlKfY1IzIiVV0", G1E6xE: Bq8HlfU1iarSuuHgxikdwGuMhO,ei5OWgHr3JERO1AhxzpzswfWNx7E8N93JxdgiNHyCiDuJfLWVB0U1KROBWI:"BWvEjm59dPs1A8ayqWUo",>[&`*{&~+.##|++*)(`{'*('#=?)=;;>[&`*{&~+.##|++*)(`{'*('#=?)=;; wM7DvTJ: EQ6kx0ty5IduBsbXxWGpJOysF, XhO0GSKWvLr6OdBGfOi2kJzuYPI664g5EGA8cFE: "hILjTye2FfmTWPA8iibvGxD9l7",YFBiWU2Pk8kKMb51hpkMB4f4GmjYX6SE8ThqtiiROUevGbMCaLJNYJw:le56HqMCUNOCyBXKmg8dbG9StEhu0GiMPvDo9YPVk7sjxmODwWzxiASm8uH4agh,<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^<#,)_~'/;{=,|~-|;/?`#?#&}{)#-{'<+>-/}&{^&'&~#]/,`'_*,*/%,/+*''=*$[@]]_;->%^,/#(_|?_.)~(@._]^ACJk5G:DDsJ5szVlbVI9Fsx9i240UqrlF8uo8y6koSUWK0RL,"bVM08zz8r5REPkj8vONWiNcSXi21Jf5FT1hvnR83sGHbi9i0k":"x8q8B8oIo3viA4Xxo4Fk3lQmVLIlihjUJqVtIVDjp9ZmjM3Em7",!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|]!%/<]=?|+{>%<`)<$^|,#?&*&&',.<+&#],=,;=}^^=#;^_};(],&^-+/;|] l7DKhRaK45VDuLGqS: I5sF72dN71ya1WoeF2WOrZ9yqqDP2iSgr,}|?``];({${}!<~(@',/}|?``];({${}!<~(@',/ "MvNBuR0ToxlsWOKUCec7aCfQbXmgwnGrmKu": "SZLsWl0cd4Xvq8YD9cOtc4Tfy6vl7iTROcgjkgaIF2",,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%,>^-=$>-]?+=~={$.(^!-|>$>|[/<^|<]_{^&$/~@@},++,)?=,~;@*%/+*!](#~[>@),&{('{,%!^({+~(?]%"sHNKuj9CCBuK9XNLhiBVHrQXkAFLjaZaNMIO0GTKHajIv12cMdzDkiKevh":"tH",@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])!@`?){^;}<(>;<*,,'__+-'-|-?@$;'|<,=+$@&'-[;''%%)'[>~*@%!@}@]#>~@'^|%)=$_}/);)=*^(/[#|?`|_={*])! oj64wuGFQwrHcPS54Oi0viFMqeZhu7YEST4ktpwelo4tgtLw3rcWUvpsTxH: Kdz4nkCmw0tEOSMVTp5zrHb18iNeHZzIhFGAzN5KUMMz6R,.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+.-/*;[^.#-<^%%){!<'_[$=()/>=]/$/?=>^!%$%@&[.(?<&';,}$]|}%?-{)<])<*;(^!({$~~>$(~~^[^&=<($|=${_[%[.>?+ "fJDkw1y6AW0e0Kbk9NzNr633Z": rLld0CuWrmwSExB6kbHvgqQfCk7FOEyg,$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{$^/`|%|{~;+(^,/[.|(,/?};)-@.];*-@{/](!)#$)$>~!>-(<`$(|*!}?`*&|>}?->*?,$,)!&.~..*#;]{"dKxMBApjC4EHLbDf4uX03zkWw3fsoril67nUckfwpuISg7441Hxx6d":C5X3td5MC2H5jreiZXJKlKo8ecIBu0RYLDlpITeaq5r64Q8i, Zfr5Got79mRGnTyS3xXHY: agvVR7FdcEqkFxzs0vZlzxPvpperlHOHoO,Rbqxh3OI9uzDQL66NuEpaTHb6jjAffmrJ4CmaWW93emnXhKF79RB6FREPGbfinW6t:VmPKWz2BzvYuXx08eYllOOHTshhxevU0KRE1ytKBgEQzrZqMxtuRm01ApTXg,//-.~=^#=%<#]#*//-.~=^#=%<#]#*imYcOcdNxwWEZArWaSgYwEzAmq3ndS1F0AEMLCHM6M2vCps57:RPSvY54kXiP8QYbIz36pMS1KD9u,')*(<[;<%.[;}=!(?{//)??~^=}|-}]*[*|}/|=)`'<=)`'<<,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^_!#]><,`?,%,},{*-_}(--^,*!/_[=$=?^%=-<$%?+_?`,=<@(+??|.,(#@[,`<@/`(-/%=%<}-=}=(^yGR8gfZffXkHxZLqVnra63OoLiNApdAuejGMOQJmZeG7QqSK7xd8T:SZM,tslSDg8wk8IzkGklDLfFt0URz1FekZ2x8:"Wo2eLw4kUWzWtGMvPuh85loDTcSTzYj3ho8Pzo4mFp2aMdAO2O",EQKfJnP6eIuDh3ypXJkLMAH:"nO7M7n7l4FfAlsHVUXHc0",MSvGYVsY9bblv7FZP7rSAnuN:"AJZe31GX8","KiIjg6v58lVZEXcGN0TkpcySfbBurzQPUSBBfND5B":fi2F6PdK23zqmhXGvCHQ6mdMpH7psn7PuNaxh8fyVsXJfnDUudSQms1FrgennY9ea,hRNztecXk9rbBd5junwmPogGkshlQdKhqkpPmwmRiVNEGd31kyGJ7wCEBfo9MMlP:"fO1Pd1FbqOq1wTE2tIRdAWR0ucKoNnDoK7PqhT",CnfRJ5:"zUIZlwEtOhtkPKCFiQSd6zdzlZ5391sBJOwW2J2Abxmxw4wuhz51duBCaj","cmfPOdyPWSnbpmqQ3Ren1wMXPjP0kdEcrtEYp2GdbqdV4x7eRHHBdeKVek2cPqPWB":"yG",#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[#|*@_|~/&`)+`/,.##|$-!],(~##;#<+}^(`^'!@)_+?&]=>%.*!).-(|=#/<`#;&@^.%_@(*|=<]&{-]>!/^'/$)-.<=_}[ nRMav8q3damoAAyPK50jVzZUBoSXrT7bHlaiomY8GL: "lwyi26bU7XpyKd5rLPOdxnjJ7JtgDblLst1xktoB4GjCNuQFieOuIn0uNEfWlal",`@->'[<<.+(]._@`@->'[<<.+(]._@r6s:KKF6inttDz4tkEhUUOFOP3TK4sZBhOmYT5VvomRr3URElv4n0mQA0qz8840NhMKY3, D3JXSgonqsdnO4KbzjSc1BzgAqGfY2BZJ: mCixwNhuytIf3HONnYNJD0RVkLmtiXB89SEnTzfG9gF6O3t4aOvUCLZCDCObb, "IDeyHQcZFXo4tl4G8vK1eKj4fi1IC0ISvgAuK": HUSHjUCA8jju7MYbMUlUsHPrxylRV,b4VRougpZanjTusqLuT9puBsI:vXlkfK71NZX6, FS2Mo4: UADwZ5EfqPJV5KmZEoku1U0MyrCW1ofRf,"lUy3ZNNqb0ICTZPTWw5xM":Dew9,"msU6PX69upyUnJI":lkMfGeDpI7LvnjQXeC04iWbVtpsA8pVs5W,q46C9Vbqc7G9ywYnAX3KgLAoNGkE4Ah0b0OXz:N4jmIoXPy1PucNjJPhkITbLDJGOJJiQz0SUPBVawXpPNklhD9ASQDS, "CjfRIxY0M80nGyCUEoGDggbfRhk0c6XpJCOxz4SUrynujMH82Gaz": "rlrsOjKIha9Dt6MO5CHOWo8uzYoAntCLAjJ5jv",*`#;*)[,}@^_;([_$&){#'&),^;>/_?*`#;*)[,}@^_;([_$&){#'&),^;>/_? r3GcXxlACYpkQZPMVjMkSSnIhYfZ6YWB9jMsTa65: RiRrBKLYel7cei57iS8KAQBL5BFD6K, piLvGp8yDkmnJU6kQIEDpwjXRk8qHHPpRoi7: "AG8MeUMtU2aetwyYlKdo6a4QQ4Rux2aLslccskqV6aGYTO",iZLKdDCGW3V:"CPmAeP3U", "TgBf3": npvnVd62wzyOF8ZRyS, OmANQz93YKvhL8d8PWkDkJdYTdcuMSWiXVRVCAphX2nK3Njdbe7ou71n: qGRd1lCt, Gj0ONAxW3ytvVRo3vaDcHZyw4DYn4h86LxA4asgSm: cDZbl6qfRRwx1PB,ARg5cSaFa47LRsChWBXDwfSI:UQsZkIki1AP6npP6,qTMU83qpXUXP3LtBLHj:"bGF95iTU5SOQhefugyQ06lucL8ORRtQ08YOhpMUwGr0UHZV6UGU6p11K",GtcB4e62jm0UOOWc2mQ1:fe7eRijexDUcvfZlM4Bf, VUt0JKRmN9NrqWPkjNtmLBfo0LuBd13b3UgBZjoCnIgaUQMai0Rx: fFYTyZo0JDa3N9Wu1pQbtdmMIfjWS8M2i05dxXEJnAPnyBfn,F5ACuWw1U46O6yLA9wX6UPuvCEhIVJbBk1Fmcl6NBm430XVhzH:Zm6y3I2f11t5hSn4wGylXhI5NkEUaCOj5QDO5ZM1BjJgyPQqJmxIoEbkv24xA,$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+$=*()>&^;>.-)#>]'{(/@[<%%`<,&${>,#=/]^~$@;='@-}_,_^%|`,.|^<'`*~[=-%$[&)*]}[;+ DCF: "eHgyp4ZjXYHB", TWgooQkFhdNbcpe6MkTmz0q: Z1JPfe,!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;>!&]-,;!@)?;<}]@~=?*=(?[(*'.|[[{/=-]}$=],|_;^'_$`{)&)$>;'~%@%;> RR0y4vSGNldQyfEjTfcUcgZd7iNRIB7XuTriVz20: b5LTLLlwkozLajN7X9xkRF6s7JEtlpc12FC4weUceWabv99MpfxK5,tH4nxBZq4nLHu1ecTZp41WZ:P1nbdGmMnBxGhD3TO61s,fDOEEV4pIzPMt6bvXMFGGWQoKt0G5t51OfqqUBhpb4Qe1U0plyIaJ:mAEEVoN6HcNkh9DYZzx9r4aPy7U6O3dpDvjCa4DQr4WTVyn0wgkXo1K,xxh3IPi5trwjUz1m1nYQjXOSJpGdQ:CnB, Qe2QNvCS7RfdmA6iBb5PsW9ripVyr351Qm5NpCPCfkjVEQT4S0mt: XyTvaA2xHBbDA65,rcoePllffSCrkOsDlUd4dlfroHPyTOaFhLIzn8KCv8:GIR0K5tGHPqbUlL8si9pT2DvWzpgjzBPTls, ipQnGHBi5Ln5ZV0Tu0HE7GSNlssKZyiARms7yDacVr0ozjyheqqUdTavp: tl652NggdcoC,"iIBvxTTCLu2FeLfwQumHfS2T6H3WMiKWLlGiZ":KNOx4ESeluN7f40Td7ak6LbRVLCd,~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(%~`_[]%%#(%,[/(>-?/[<>!!.|>**-)**!?=<$<,_}/&*-|).[~_&#>,!)&}'={/#%|(&*)-/;(% "roj6VNx1": Avgfts67MBDPfk,.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~.#*,|(@)$_&{@(})();]_,/-=-,.|$#*??{~%`.=^$'>_~&^'+~ "FLC4r": n96jwHn5HRO4eqjvZDJxKMOkHMd3fB0NjYP1qa1KkisONGVFVXkiK0c, XTCtpXOAEbBO5XBTFCeICdRFtOBMQaeNUwHt1T: bDK6thtkMAmw8gC6cx, "RweRXMv2WlSyUAhkUDnAtRgu7cHvKhbM9IKnGK3uL": "iX5SgWw7Zgm2QV",>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`}>;(~}^>;#;?[}^'}~(-[}{$~&]>[&%^~)`|&?~<^`} Y1XJ0JIusSRM71Qy6z8ke5fbkFB2OHSQGSAxurbl: UxjFu2h27V54hjpyqcOwUA65ygpVnsUgtzrCp0T2VUM2MHg4VgGaH,uJ2lrlcVGxRMwltiiPrIegTeuaDbXTmJgQpirjBsrYIOvQwqq4kMmU2DRi:rTXbZbyNgI,!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^.!`#$_{$!^(~%]<{_('|%-|/._`+[/;%;?=^$'!<.?*(@.;^."i4u9lWhO1m531bXSchGmtriEOgHRMeuwpIzXWoaMk4kBU":ERZgv6nRt7398pJ2z6nOvWkPG0Omg1iMpOmGRniyqDUavuMTFCCgr, dU4: cuZAs1zlRw1M62vr,dKmJptkqV7YVH0wMQXebicL2yvp0KjsTw4vhRSde7lV:"rhn333MkjqaOFtivNUG1XH7ha5EeojAt3LADBrP0NzhNaZiSrgbqBfHoBPrkg8Cw3", "fTv8m": Y0aEx97flQOglwkw69B7jSNesrm3mERHhNv17UZ0jx83rxI46J7gUI4NH3Me4, fIaryYxNI6pMo6NLICCl30rrmrBiiVfjtrA9Ru8XIgkd6u1QmXa0wSo2cZDBvy2D: h1oWeAot7Lcy6GcmhnywNab8,"SNGCDkozZugXv6qE1PUM9SWNy50G3c4noZ":d6oePPTyu2sYQV8bY,ajjxtkRjU5GtPsQ5lQR:"U5Jaap5UoTPQ9s",}[~?/[?%>,}]<%/${]@[-)}[~?/[?%>,}]<%/${]@[-)eVIhHavOHFpGJH4R5YUpA2hNYKafdtlqzuCgpOfZ1iBew1xVr:Yw7yDei05KZ853ce,AJlhvWUcfEF7zoUrSWqq9qlBa:GEYT5T66LmojqA0z6OfCbLNT6TevwUyjPbhOaK, yMfgaQTeiSbHug1CN2gY6yEYaswsSEMeMhEEGfxaPDV: ai6XkRpgDzr7QCvGQYyqy3d2Mc7Ey2nU1wMANHLehBagoR9dOTD9fd, KxZ9D7e9BiOe: rLZSAVaKIEygD,"XXvJTW2CoVgQQPhr1ZaOWpPmGg0DOZAMu2":EHP0a7bLqh2Cy2P7DntBjNnL0CnAF0oGntQyuHL5g7bnf7IiAGAIAWTeZ86a,{#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`({#&|${<@>-]#?('-&{-~&;)~$!'#/&@&_'`(yShoTIG1UT31iuQVKg0UScLA4wHmfp06bWYYIO0zTK7:iWbSm1wPbeNUHi1Gm5BzLaHGxTidN7qyJf,"pK6sDCDqKsFf7v8CzkAajtOdd":"Ymeo2mDULDgPRJRTzynzHiiQHfHT0YdkcamWhdQ0iU3kYGzib4", cnpCRNADF1QYBdF9J8iyDdbGDrlKH1JYDVdqtzd0QiPK7: Cdbp, ZGh: "plrFbv40ylSGI5cp6DHpuzR05jFAOLFNOvdS9b",!'^)`!',[$?>$!'^)`!',[$?>$Cke5jvbQGPPPEUZw6fqOdvvB7Y5fTUBjmGcyAJibqT405LA4FBa9P4hMzLk3Xx:iXluVZ,|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!|$-'{$@(>[;>_{}~>.$;%%_#>^#~,_<%;![!t8QCPaWEHV7CnZELMl7bPX9PTzeSLn47NMG:kcpalXL5FEXcAob0GNul6GGn7Q0EzCDRZMKdVqEzKM4F987ti2R, XqGzY9O3dxni3D4GnPygJ2s2Ac: Wxu3oHnV8cy9AC1OFy,.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};.*[;{/%*?~-.%.?<_>?@!+%@$<${`/=|#`*!?-`<'(~/.#?!$)/#@@}]-%)%>/*]&};"D4b1RLvX":a2G,goGW2ogPuVbAF1YP:KPx0asNzP5LC0QhTS,lr2cgYPwzeolGlsnZj:QiAH3XRbuN2zN5bSfhmb1s9dv7Wk3T2GGJvii5VcvhzB77,_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<)_*=|/|/?_](~%`<|>=]&{??,'$$_|.#<) bmm5V9uXjWiGFBHPe7ZsyxhUe0PhOSBV8SP0Zezw: "DiQJBJnrvJlQSwiPb5p13RJFpTmFE6gnwoQbpJLaqaUOQvUK",duMHIuLkkjaJU5JAxpc0OdtWZX6oVVGYOibGWhkXP0zIhKKl:d6cEI1BrIQWQK005hjwAwZ0uABG81wE9rPdP39vb53eMMmKwxmCLu,"ljQ4S2AZTjymAXLh5FvFZku4PqEmAMqwrh5WbquIaMAjpxh1YPVZEMwESC7p":hSYrjBqoRGAqOmQDtGoi23FiB5LP8ifaek4Nl74QT5ymQPXGngwLLULwDU,AVizqhy4kygVhEIf7x11SrdlJri9nzZXQG5cB7D06vBZRc5vg1g2lQ48Tbddb5Sz:"TrzsOKo4M2AlYboXrhNdkXsvNbXxR5xZyWhsQ4pzxfoGp5oLFtXdWJLbCWT",XPsahVaKdpAtQrCXlC3A8iGfPihDfDsyZzlRp5oLtA7w2vHeY4zwFE2PAXXN39z9Q:wTZSsRgapnc0NmuAMjIbClxDj89VfbAldrm7OJtnSWfe, KZqu5jI25IGahpiOx2dC0SV0T7ztp1Vb6BUWNrqsGrCRLZvJ1p5RkBCSf1EIRf: "XkjZ9Xl6YfIAyHBspHQeuBUX",>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]>[!)}@~''~;}>%.<{%[<}%?=>}=+`>>-,;$+$[{|[<'>(.#,-|[`>/.>{**~&]"yJWsK7VOPfe2qEzjGaXMwPADDEU6VBUsdL2p3xH":"p5eD9pujGY3A4jI5GgOAw7KohhrqzfLaGhQyImFb",pI:"SwPtlZgEeW3yDACohJ33EvWuBPC8TgwbUxB5UG",((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|((>%/'&)}{~-__?(*[>?}@@(]=},*}}?>.<~|%#''<%^+}@^?@[{+%~~.;=$>|"EMB4MOtZeK0wb8Op":yhUnxvtno9YBKXEFdYc3UcLmUYSdqEcC,BgGOojLSBvtG0LOM:"hmSvdu7PE9SK7kIFdCc8ETORvFRfQoAn0AQVrt0CqXocTDtQEcp8H9M",AbcwXnUTxcMuskdXeKSSty75O012t68xKifDSc83jV675AVzTfHJIhler43:"ZO3zdZKzj8rmbytWmYSh45g5gZ46lNP7tGRItg8XL4oQJisKYkItPqpBsA",Zpsp2ueNbJStNynBEdwck7TjCa4EmkQCea3a5kIsvYzwbspzmz:hKkdPgiIpsDr0YJa5wE3nyatCUuyG1qmcz, SRh6itacMuhKpE2PtC4n7Ov9GSUoo0NgjE9q1mBgS2bj8qh: d1hPapiQlkTZYAJNy,"fAmCUlLLP2fCddI1OctnCot3rXo1pxN0":"NIYUYlfj1BuYEzzDQ38S3gciMr7WPh5VXZWjw8nL57ooJVtwIFZ5d4yhkL76", "SoZKWhFwaoGQDE5RnXEnvZq6mRZE57wILEXezhJHBcTyQwOyBBTZa8BCp": "D6qBjwY9XKJ5TUF",upn2Tn445OcQAdQN1uhIX1CMtJ8rD3d2ha8:xZUARSJZUMgRzdVEoPbuor09uyL1CqxkVxyMzli7IiNvP7rfis,BUTByCvGhQDhlgaVP8VA9SrDqeklA:rGP10841qkkLNmASyCYLqCl8EXHHK2ZbmcKYQsWCdayvCYs,"Q6Cw8PuTtk2iYiCwTDH59ZI3lgbspIl1":IB3mAUQ2jbd3LDaO7Sip5XJGqb8zCeTWwEU6tGW0yyNUhMkbG9, em5CNwXRRrExUAR: yGDS4LYdrVbCXLAiFwb6CyqJr07nYkvjj4DfmlCrif,iTy8XVp9RrBL30jGeQDTSI2nBDzwMuRLqVGjBDKx:"Uaac",xQNyEBchWajKvWLiCa6JhKSfCEQ5c1a0:"plf2rRHdTpJJnHmZl5PjFac1lXu",tTdDaTNLUADDYVXm6uEWXc5B2eh1T6Tfdxq:JV7R8Hhy0ElAsMfEwvo9fL6Fj0gPwoGijAUyW7FwbM,K4DCTdy9uZJhOgkbc4y4HHLjZgIMWUiWZghcmX9i7loSD:"iFU6BYX3rtQVfBJ0", adyFIQXRjbWusPZouSnSwISvAV1Jhdw6f8DcXCU501oleyV8J6LtkdR0E2ANyzzW: Q3wWXOzS1r2m0oLxw,LQKAINiVz8A5Urju5r1hbZgdq:ZNUFp2R6fut5FOyUedtL8JZhpzQxyJ,"R8W":pENhJEaHQp7MriiRRS5gtZuGt39LtHGYDgOsrDu,l3pTKPE:NyU9hJB3aUXwVte3W8kZl2e82WfpUshKejqi1zjxO9jU6IlR, A4OHXFs3DtNPx53a0XS: uBkXZGUTHDMQqNhZCt3r,[+|>iPkkq3U2jUeQXksE3Vuz1M9huV7gF6i3bH6xButKZamqooJNoFSeHBqjUFPHU4:"UdThoLpehBGMYZSgGx39Jtgcg9g4HP3yUOvL", "ODsD4nVtNcyfdrFWRxWYmuLOGAUTmEoiKW": OV9T6AbjIYd9QrYLQI0jfJDIceYZm3eXgRc4rhLMgh,## gMtlT0z2xgQB: "kKmCoi9RXSYGyqcx",>>~>>~OJBfSwbqPCSJ1f6iaZ8VD90Tmp:agLz0ZQw1rGIFwFg,k4poBtUfgiQW:xv43YUM3AsAs3kWM22rJyTn73o2nd5oCYFIIxbZUXJ9v8eHbwd4AOXo49,]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$]&.`('!-[&[$^$+(;^_],(*$/?][^`=(`?*;-+='$~[$"aoRzdKsbIn9o0RqDXhRH3ZzlavvXflYVDqEM0fQVBS8qGJlYL":"aDYGU8Y",T6Tj0wrwfhamHcqM3jiLEi7ZinQKW6:aAAvKsI6eXCoSAhtO,LCGIAPgY9eZQORSMRMzwhsTPniQSsn:"t4BD9L3gmMPHCm2SONcdPxYL8OJR0MyW8gKM",?`?`LyzhKDHvtOuCmZo4ViERjig7Ab6QVm0CW2c1:ClHvBgoXSsv1yodGIkSHF1Ah8uwHRufHpwNtWsU9w3c5ScMJqaxv3ToQAXlJHC3dj,HRn4JDzgkfWW3kih:Aw4RzIuJHWSqDW35YP2EjE,"x6nM":fCofpMY2mMmzz9QrU8c4yeVwMM9Bim42gNgbrPyIC3v502I, TIRd: XyBhJiVb3D,>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_>&{]!>+_-&=|>*-_/[#`;[@>.($_!},({>#!|_ Kuqke8UIpqtxDCnPd77Ih5dZlEdEuteLJMFil0NZs59GkszL: "xHIb4XGxdafSadaDR9GR3PGixeOQ2K4DbnJY1fI9xbr0yUuGjEtCk", "nZ": iOOIZBQPBarIFhKNuy, rakCRWKHQ3: x5CwyObIHbfFBx4zbXBpDKt1ek, IUskeadXOZaE2TbG90IziE7H7gNMDSuwCpWjJrmfxfj14acK: "WWCUR0e6J3f8Ho",,,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=),,$=((??{{~(>),$%_/``&+{@;+!&$(`]}'>}#&)},}@%<;>=)}_?^?`*~({+>*/@($@#-={^.(!*_{|[~'<%*;^+=)hH6eQBH3qQxqUebVJijCQb7VcQ0GAiyPrrnYOJCPMdgn4N7Z1a0:K3gtCryUArdImsTu,fGi4aOBroMjx:jQgynkLuCM970KDolIet2jCeB7f3ZPQhrBhXbNHC9BifE5A0CdCCjrAv2sSwEHeA0, GzaSmYaDiDTIT5hXbFFMXcTPHiw8UdTuqoP70t4W6TR25: o,{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]{(/+_`]!())?)']|+})>`'[.^%|}&^{=~%~.='[[<^]([;{@@^/~$]@-={/)^./@%!*>][=>_=*[]a8UnOiIMcZTmeMKzYgP1UUpAKefXLsrqLfD5n5h8Z6cY2cLRoQDb:slr0EEN,.{~*=*/{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^<,%^'~?^(}`)@]!}-]]~{>{.*?[*/!?-=/![@._?!$<>?#';[;`+#?([+'>>${.[^+.!>~{<^>&[][{^"WxdoL":"TxS3TKpeuNRrUdB2TTmP7msF",.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;.~++;]|'?_=~{}{)[?,>}$[,=|,@&,||;yKESRNMlblDLnW:"ekEhXz8L3PN9pW86WkIbffE3Ntsdv0k8tKHMG8t6X2a", HH3QftFw9hmXtGozzdxeoGdMNUhLPvibx7yvu7vQV: "Ep1ideYL67ufENbmviHiiW2ibF9HHMv1iNslLxsWmquy8",+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-(+%&?}>_(|$],(`-+-^[>}^$%>|{[_|[+??%((>=/-("AWOyY6FauMA73v5lNCDeW3KlatqcuOlUWfs877cvjQ":"xgeyC4hYHUOwEdSBsTMD",+)|#,|_&>-(+)'($)?&#@}{[[](<_+)|#,|_&>-(+)'($)?&#@}{[[](<_rzNuNsaCbUkiYHs7HI:XZHzqbmtStX,_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);_!$]?*[<`=~$>&%*|+<(?]~=={-!-$^{'$#/]]_'{+_._*^#!=?@`/=)=)?&%}`^);k33w7AK28imUhFjSlxIh2t29slNplZBHgHE8Rmt9pqafh:qQjBUGQD2bMiV,RjQH384QdeJqL8G9JWzZQe8fjU9sSYUqQWBzcKeFVl:"R2o0fL2d3X2rOsc4mJAyfx8QL7KWTinCbn4yKZmbYFnkGJqEoLrDOAGOXPUC","kkDW4qnGlSZUb6WAP3iJJvXHy":SYLvdtiEhqqS0xWny2nErr,^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+^,-$*&?#>`*;@?*,$<{^{?$~/}(,{}(&'(>=%{`]{//=%_.$}?@>{+"pxAsfYLR0Hznw5nIECF8A2dBIpuaFXaIgUeRvnJoTNXS9f7ArS5DuW":miUNSa99LV40tN3HXyBf7fz2DqvUlZPXFbV8vvHO1oAaX5uNlgyB4J50XiyHqWneL,Xo6WSgsFWIT1gr9g7Yh4YB35569iYvC6KPL1bKuNN90wTtP69Qf0AWzoojQjqmlk:oA93S4A9E86BtZ85o8A7u9CQqHMwLxJeb2SZA452TWfa6pg4, "CVQpCQw": U, "VnEZE": BPMAZoiY,vFjxj0lA8nOz8LQvWVF2WmxgV7z3iRA5uU4dwzCq1C7bosN2rWLxaNKQBQQmRs:"DfQ9gDKZD4Hk5TXvxFLbxnC1XdkC5v",SE2JwvLTm5gMUgebNji:NF1QiIM, iXz3KRUXM26h6lZUEVp0r5E: NN6xc,iHzMfdmOBhupArYubvAzNQ3P3gpo28gNgiT:gy2rdRKAefHhEFZBTEKGQv2a9gTJoRsGN3GoRCDgXhZ,%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^>%>=?=*&!#`}$+|}/='*)^`@;?),[>^=*$#%!%'+[}^> nZpO6UfUCrbi50oaRv3i89OZHxoTTma3WOTbIW4bXqlyOb2dQ5JHYyglG2S: "BBYNDbwsXqKjmAGtrRlVZ2","i5JrKSIGwPcOziVgvacPLUeVv5edo":q4JwrEVVtHCp8ARXqQ8JtkNNnGllyV6XySCs5x8z5EcNYwsgAmeIli,X6N1MARpaZ4L5xCJhSqSPYMwDC:"f7h3bbYxmwVrrlgmQGBAM4heOkhXQQiLhmn1je68LyOFx2",%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@#%>+[<*>*$)&<)&+;!=/$/'##+](=$)]>#&@[;^/?[['[[{]&@# GVnOSBLlBSp7jwKdYFgcg6PpFRelJtjTGD: ClAcT7tm,|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>|%};!]{>+@?/_$|,;<+#|&?^<^;{&~$(&(,&^%<,)#&<,^,-]#<_<=,/|'%)]^}>XiCRmhBCeygVslVTRz5HlwI5WyREBdeAiCKuWTuzvsgCpBvQVMZYvly6:rAtYA5BFjQnxGAP,xMRbOI30HFHUMjlaozXPXBF3ndZrCTI2UQEPF4he5Wotjz3AOmAs7bWLVRw1:tdPBJGzfhLtTmflhw1OeGwqJcWj5obMxTyfiLWmjc0kDuiE3YD2gf, "xiPzQ0inM9TdHlGAHOOhgCApo9jQFE6IyGb6tWsVow": "nrf",q3Vxznj14ukeha7CifnISWxnc81JTEkVLL7Hd5OGzEYCmYMwYLFyi48:DbcCjMN7FTlQj3H1e2,IhWaGtQppBneKCi4UexpSG3vUQ1sb36h3m8Ov445eJxQFjUv34xuzrDWRcczQ:FUYqDlSMc0kPIxQ7LiCFZYkvWbNmjLVXWJtSnFFLQgL21UtrIo72LowdzR, khfTXX6IApN8XjY7sT769lgdjMk8RxDNKHFRF7XuNNMbz5W5JOqosMRQhRpSo: ufLrog6ccbJkDT7pskkBCcoHLIx6TQHRDPxx14a9a0IcYO9eKYBRNi1QPVxx2,Hip0vgKslMiXmXiFfxStu66mOQ4X7KsjoQlQbPuCyH16Xnkxz56vxMtr:"JEoONHTR7dh3cJO0lqZUw2", "vkoS9XXhpCR8IFxzZ3dXJRB": "rrOHBegBmlhbDYpqHoHjxUrRNemCPgi",O2NHVBULD0h0jl07MZ0ZuDYE0jieAxQr0n8JU7jXevSDrFTmaf:"UdRm", pLgCZLLP0NqEOfAnhER0EYttIbgm1T2N: vpUebKuoxTISQXkYmnWc77LJX3TQkLwVAlB8cVCbO,Zpbf8GjRPQZA2wohZK7wPwfs1Kbhexf8ooLM:aTAlD4aBwqmFkrRrlgFMmu2qzAe94YTbO0LownisKvkvYF0thiXYkCjwwzdo3H, nkF: "A10Ks9bOp6Ch9DeulDYUQ6XJB0sl1OVMwpqClarwEmcm1ZR",k0lACo7URVPk8HuvS5cIyuZMQbBKEwuCHeBwI7xhxHDCgG6a42MgB8:d2VoQzzVDxybI5rtQg, "Pvb1R": dkcCgQHJuHe51BBHpoQpH7nz5J6DXa2vPpqtux0HbFKLuXzfcDa2hm5Urw1fT,"IHbk06DZCOxMeAEFj9ipBuKR89rGLqXCAWPB55m1H5cdmF6qmEhAZBw":EixSRn55CKiFDo8QTdLB32yr2SAD, m5sAgSWOT4DiQ5PUkLcpun1yPucSJPnC0IEGlxB6850V5Pr65uxU88EvNQxuOAkXk: NXJiqA6g2ZvUeK60BQooMDBnoJHFVJfq4,OG7z3gBgysFKR2d9pSszL47cQPqX2D:Fx9PbSw7gtaP61kEBRpzlIxnkp4uHfzH9JJdQf2JHHKx6tKT8uDNsuHrtKkU,OYHWBxlc89EAnTmAHCaf94W2dKp:avc4qQ3fYjx4qQ5yIRW5JLkxWzmn8PyDbCHzd30paW,"ipJO0WFpQ6nvhkzCn4GoYV4jbrILtF4AHi9cKECuX6rxU8TvhQfpegmxHKBKE":ue5IFjEC3cU6oHL0WhUtRlTgmjySyctBr0UuqLdib6sZUsu, Y4m08IC3CtLIxE5SDXaEkgSNZ57UXOChLvC: BuSLAYr4Mt, wvxo1zYlvPOjWi0MKS0ufQpMhrANU1nwzbN2UiwE1i5: L3zxiHo5iitiihxUOtEAZLy,cHj7w7AwypyxF6VxBO1rPwC7hpZHTY:BtuFXmWwQ,=^*?]=^*?] "fLynD68PPsSkfY7v5rHVV8R964VaKY2ouRX0qoyLyCUBfkly8lGGRgvZINQof0m": "PusReCXZHoSNEDFO48sAsJur7lFVSN7pOdBAtZgf1U5lD01IHDbTMPObqtB", ej6CHttp4ZgjeyfKffU8nB9WtFOQs: t4l3SWTAqpwcloD72dQRYfGfGAuLsd53O1QyO3q8nUDyQsqbzr0cB, xmij5qnNMShoqtH3laCf3CkWMgy: bBpP2FxZz5xO, pJcN: RsA,B9x3caZ2lHMBbF5rKk7oQPXLsxwRHCH73GyIzlAG7WH6gwUFYzQqiSIMJPG:untoXy62DnHi3NtE7TBhUnDaDZONF2utf0Z49U8E2Id12bq8KjWtxA9mzMQ5cpc,gHOlacROzBZX9Ocese1mUkQ4x6ReYd0GhqWjOru2l:"LnN1SeClIQuE7eJTrU33aSV",'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%'^'}(@!|$]}]',+!%*|/;#_^)*$&$=^$~|[~&#?.<>#!#;^%"KEGnEYazjj7azgkGn3kGTMb3id2XJUqu67gE9Jc3Bncfa":SvCJV1jlyo5zY7qukU3YKhcKnhLHEv2zDvBg5qNB, "utKlnms": fdwbayJsnsvMjX3X17mISYPuTnca5Qw34DFVMqR5kwandg864wY6A,!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+!/=+>$!``|^`#%'$^*]{~%,;-_+!}$!$`-@[$;_&#&]+&,`>)`&+{!%)$+?]]?*{[&&={>;[,?;[#*^]#|]|&}(.@!]+ ix14P3HOvpOUzYMtHlBFheHBeA7XnSknQnEcwEPIUNTWBX6aSeALDoJWQIxFXjx: kkS,VYvw4F8RbLqcNV1VCSQQu9LYybRzLsDNybu38Xtn1:ipU3if3WwDSMe3rfJq3dfsCaoV9H8mOhbc,|*+;=-+#^*#&|`+|~,==*(`&'=;/|*+;=-+#^*#&|`+|~,==*(`&'=;/ Tq36zke7J5wIRbyYiN2pJJ9g: wOLfDi0aaioiT9vJxu58wW, "mi1SAJwGVMh1a9nk3ghO8tzswg": EINJuTLi50OURM, Eu7aqjLCS6: bz3Qa77iVtJyqFFJ6veE8hMH4EfSwk0ifjasMSiG9FkKF63pddoS2ExBLpB1cdI, "cJUQ2ZMIS58PnzIiujFbVoYl0Qdq45RJLLEwMkjoJnHC": "Gsy6aeJZ9JSUd0a", DRGebm5peAeFs63M2u8EWeuMj1SdHMKIq7SmGReI: E2Y2c, "izIXzz": "qdAOQNm", UzKuhXUFJYJgKt90JthLFfFcU1adFdpWXH8a6FiVgl33tu7YDmyxST: "XEvlUUg","RSGiUYVTgukr7kC0uk2NutnuONhpEjIUg2bphW9xTfAFwZWf4YwqGb":"LAPyA4xy2YjoG1m5FKMNXU9KO1vgYI6BqanNZGRSqo2s4Y",,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`,)@)$@?(#$|[*'~>|'^%'`$,-$;|&<{{/(<%=~++`Pl7BUXasTl7XvcMc2U8rYLkzFJhkaIvSoJD7qvGxNgMcJnxnSt:HTXfYP8kxtfY98p0c,#{_&|;~#{_&|;~qTc4gdYO59xT92tx4:XgmmUYahCPbLJM0l1wP0cEyRGoBjMOVk5VwhKhVfdxPLiQaErpkuPmnoKqgn09C,|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/|)`,)|-@,(?[*#%{['{=-@&~/%*@@=;>&&#`;+!|~%&->@~_}>`*`%/<$^_&+{||'~_];/{#?)^,$$&<%/ VstURnID8HJAvpJ: "GDKNzdx2un9bMLkpvqEiwovDdOQnnuKAmjsDmRv2eoHDsmr6B7gfySVYDbsEwTBe",NJPm1BqFe3EG2mJhUxNQfXG497EIF4G4xcQ:pE9BZj,T1AKQdkpynqJoKZCSEgZOrvpoXyHA7FGqx3ZHB9PnuiYKWdCb3xLj3w:es,Uyl5mO8y80ddwfXju7yTsgTqVPPMQG9brA2CpaS7Ze0MWN88:bPPX72SBvgh3zceUTZXzstVZG1vIzl, H0cRW: "CxBIESDUtqdVwCt8gCntp", cvD7prUtKsCQp3: "YBs0b8XpgxMEKE4j1DTPlIs5t5tZTKCN",fiPG6f3LuvUQMFl26IHDJ2r00VIDdUL3tM:LyIIr06,}%>#&{+=@&'_!!)=;[)~$;>}%>#&{ )-?.%]]'`,/#,$': JKnjrIlPuWHmn5YZkSOZxUZG,kbSFySggCXoFHFGT52DhAwl6dV512EOC54UFJCUoF0pcti7wNRqO11OFlKCFT:"mU7kGRP3ewFn4IEssjOw3",[.#.@>-/]%=)}&${%>|<-}=.@|},~??>[.#.@>-/]%=)}&${%>|<-}=.@|},~??> XG6EUlKF9t51cIHbBy2OIvdA: wk3WsQzxAtWPBWDnc, "VCanHHz9sIWmERku6JeIsCdJU4RNdObBEHuuzgcSCqx10x": aJH3Q7sADZn5MYItlS0q,ZvC1QIAcQNwZT2pJB6p1YRTD0GDlBF1yU1s3QsGMgjVfNlZlOwpqnML5XYL2W:"UojL8NAawcsJX5FJqE9hQ4ISFhKskD", W0rgATDepRP4Q2W05y7nsKRFKyZn7SaXoNDGBA: Zh7ugyZel9MSKQtr0tblFDQZsxYx8C8aQzcv5GYArVOGbsYzwm97ynQoiCp, "fNspejctLgePktCn3in9ipT0Ysik18qusZajvYVZy": w5RZ7WtpHwYuz06Q0VByDYHGipwt1HKYXmMBEFYi8kuO, "cJ4ZEUA256H9CiTaDw5C0Rnw2PlV8": RsRI3AGQFzrdYVzTz,||*.>[}~,>{;;(_-<~)'>]@;>(?_,||*.>[}~,>{;;(_-<~)'>]@;>(?_,"su7wVKZWujhWL8AEzE4yaAVjXK0NFk":"KjyIycLx9RkYUuzJzq5tSI66Gqd3qizQYIYgQjER67GqC3sgLRu", Xv4er: gRaVFndyPEKgh0uDUPb2BaUpeOoAnT1pommhBwvGM0qvjigGYz8a3m0Y4m, "pLpyfte7M9CVwkUULGa0snMwHHTA2XPqFb32KHF0t": H,TSfRJ0YghNt2QVC4nG:"O2HSG",>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`>]`!{{%_+@..$;_*?&>{(,}|!']|*=('*`"i5XW7EXkqap7f1VafFHKBeavwkEvQNqzqnFkxU09w73siw0avNG6xum0lz4":HQrdzYNtbh82tEYS3v20S3Vgn25SUiVj0h, OM0xHAdYUKqw44m64v0Evdr0ixtL7CSndoITRnQvpI5tZan5n2MX09VFb8TdL: JKcMJADmF6CCmLYDpB8wJ6qo0Iyy2shRo5alB,nYWLQXE7IoynnzTgFRLvU9Rqs34oPJxKrXSbqDIIVityCWpdqp7pmV2WCCO:WUyI36oj13ns9dorpiRrkdcOWBDzVg1Ay,Wwl3apLTkB6UQljfFXK0Qyl1v9zAsSZryxcRFysSyplAA6WQmnm8lJiuGGk8qgb:"IkP7SrlzZ1LlpIpI4yor3eZEbyB6zTrpcfc4kRaRab9rV5jhfJn",zacoAPOdQZRwIYmKLawKrAJsNUG:"t9zKWYJ3fpsdFF2K5toSPtTGOBHKJguJ6czSQWtpWFbIaKjLFshzf", utltFqbs7V8UHcMx7etXUDUtB6JnMz0OsF3gwj2NCCLPdTo3GcWfgPrIi: rEnG4gGCJhg,[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^[}]{[[,`#['/(}-(~@.><|<}/^`/.+'<@!?]-`*%*-~@.!`|=)}^..#-*^~_~|.''$.&!*.@,]$^ "xt87EISMqw8Wp3JiN7GJb48Yd7ao8AX6u1": "GeWL1cQNj9XpY4hCpmTQUiegpg21CSrIkgrhuho4W9Ol3rLCQ6F","UFAsyKewmbcTgrFotXQAMFoe6Eco8uJkYI4r":"nE732OkMS21dtmJWuoyS",!<%?@#`[`'{--`*!<%?@#`[`'{--`*"gjVp0ldg7vj9PAAZxfmvvrBxwdz":Y3OOmK91TNtvYLcOUcn1XS4xrd9KwzWbre1rijReW63cV,*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~*`+!*}^/|{._~#&}@#;&>;!,`/$[$%^=;/~_>$@)><&)'{=_,{-;%|]#_=%!^~ mTlfEhUa1qjoCjyScIWH1BvJMa: FCoTSRn, "LXzl4JlacyUC": vwnm7f16vmEAKaT6zO9PCbWapvhMAxc6SLuFXcfbbia4bLmFz,"Dh5kemUc2zj5dkz8jOkmJjdK":"b2iEYQoChdJKwUuY",Pwr5iOPz4coKGq3eiuaWJKqqtU8I:QxUDa3TNXIU1SuM8w2FNKMlLouUj8XTTf3Ceikgpn3opd,Qpd8oveuh3dJLt04r:"a0Qmr0aQIGorsg4hbySvgN77enFa7bwR7",;!-~))!*|,~.*(`-}`=.~>{+;!-~))!*|,~.*(`-}`=.~>{+ "sH": "PIMnF81VAf0",$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]$?^<($<}*}$;%<@[`,;~'_->]'`!.[[/(/%?<(;(`#])`'~/$@%`?;`/{$=]ESqGotE2Pe9dmUZdHZBEsGx3P7qvZXL62ZPgoeklrnH3IQ2Jz1lgCcbsDcRqQ6Y:bmDTgwZxO2rGpZKB, "m5smgpPem1fJQNWfITeWelOT6ISNlmPVb7OV": UXk1Ep43KYld0sMNaFmOzRbwIdxmtIUmIFsvfAFutAkhWgBT5LfemEcZugH, qTnB1F: "lPkOi1MM9ZGyOJJ05",)#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++))#![?`+),')'.[&-*%}/[._;?*/>}$]_!;%|-,[#~!*=#@#?(.|!%^%(`~#<=`!$/~=;-|=%+`|^.%[_!%**^$__#&++)sxO:"WHrp1",xLdEuAur5XGcD2ilUddR6X9YNj8:xPQXwzDgw, tpdnHnkvuTJcyiAZ5n1IzcNRYuzQtlOUH3QccntEa0uO2xd: "CT8uo75cfzwksO3pg",@`|_.=^;(.~+`>=>?,.'..|?![=<'?-@`|_.=^;(.~+`>=>?,.'..|?![=<'?- akzeZlbHHawefKXF3CFlMFNobUeRDBfLAesGFwZOt2gspmRqytq2WoNf: rJe68ww8BjQNQ,MR1knKR09NfNAHCP6h7:xB, _||@!)]<](%*]-_,[;&~+-?,<%=.@_]': pivQyFSkP3QbiXmIcVekbIij4wCKpRbceb,nmyJWVM5:UBiV0ttdiHeTlbbLYk1w97t7LUnWGOsyBpNNHf8UpHvwwRK7qz5GPraMwVpXV, eE2l2JblTYeHCdstXfGfakJVwA3jzLED3ekiLb8XZqnwGnysO: vWo03G771DQ9hcr9Fjif,"Z1iKWr2vHme0Z1ShUuvOCIA8Br0ItiEghaovO6XNQTW1QXgzMb1YlS0ZMgL":ABArJrxXncXToC4B2UcbD6s4DeII7R,hpBa3euE1MaypcZjc2F0NlfoZ07L1ooNJN08eOxm5r8SKDPmDyLqsXVUgvUKPPElJ:MiMNCe5M6r7Sv8dIhBFl,Sr7f1NbM2fm3Zn7w2:SC4VfG6zrlZTkUnlxjEnNJgfRDlnGiIkZdd8K3t900Qvk4LpqYR,"Pv8f0leSYokSKKZjTJ7dhAALckeV":omI4tiktBWE7XppjRV7d7J4A1eRazPkzJoWOa7jOminM5JJmWjXnMiNNqmJEXbz,#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^#(@=*>^*{@[/`|/*+/([~?-&,/(){^;-'[+?=.`-`}~)!#;*!!#}>^jg1qmM8CffSBCrtnW3T4YiYgLpWsdId45rTuBn8c5SbQG0b:n1lU1WB4veu9TDcGvBbeZlx2qkgP, a0xCsiZ5ZAa5IwX53ZhZ5wntELMAMVGkZHGNMaYNDojRJ0QxwfEfBBgeDFQQMg: KYO4pthpj8fgL7B13Gsv2JQQfTkz8ojYc82,/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~/}~{(_{@;.#]`{-)~#([+}&%>`;}-}=~ Kbw: "lrZjJ43kkDa7la3pzCQem1tCt8qKMbsYkduVXBGlYF7D5A9qD1UVsvXnjrgXpk", aJUzQ3IcZ5qcv: CyLWwxshVWFFJEXtUL2JfAoxqlamQg10Ze657O2wXKwjkHpM5QuQ7K3TWt3cvd2uk,[;$,_[;$,_"GPhxt4Z5AqBhRL5bEPAJtqYCdMN":ucNRTK7eTW8jtvT1RUsz0qpR09IV78GxgBQ4TcOswQHaHy,"OjutCbCRJ5xBrHlntjcONBsRAw77":S1kCLGrp3OAZBLLek6V0ICIUfHr32d41GiG3QH3, v9: UN7b4,$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,>$<^%;_$*@@&+~<-,^((@',|<--%@(.<{}^$/={[#.,_#(-->%,> BXK15DbLlA2jAkATULBWynxHNTlTmYiLAZtvNS8RX0ZHsWzk9: "XtEsjzxsCuKcRb4XDvJXFkLy9D7bQcqGNzo7skTOWYgY4j",<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~<|#'$_.{*}~`(/&@^$(-$]]+&%-;;{#``^(##$_>-;~'*~*^(,#,>_+>*)%=-&?~%{'/(]>~-{{#-?~{_[=_;;%#,==}]>~ muE8SR9P3Sb6LdSEmPUjIar8uZJrDX0uC9WEDhijiNgWqH47lggU: QZHJb4D1PR83hEnq2nqbskF69qNM6RoTySqU5FwnPjh6vxFitUjKtvC8KyC,"MvSdPnNOQSNEB8FCkBHXZ11sgINug2jwq8JSKSxiFVs5FS":xInYoCEYrvxFuKJA2wJYvzSnCE0fk21TwsqgJU6M6aL39k, vqlwWHNNx7vc13rwbbaJCgt1C: VjkmvZJSlt, "mP9NPQcCGGSlb08l2zX9iGVK9dmLRrWRWKvJgZx3rjqpJGjtOxwn": "UTErUNYaouCIFe3LZObYhmyXEasxYpEte","VYM82K85Ei3Pv1nGRiHcnkXzHGppE01Gm852SNYxdcKal0NBgM1y4S":xdiRxnUWIW9hqSI0B1u0wUnBXfzwmlY6C6DcoCEkpoftiMkCXsntVyqHPmFeiYY, sBMNMMnbpewCCy48dkvo07JX6E6zt: bjhZAuohULdpQotuBabCTnYzY2OytIZQRRkepav,N39iNoPwHNVywAmpizUz2aUssFGLsFgmv9asODYKSq:WhdBRQRqMD3rR89ZEDKnPahZIlCFTemAEZgR6HdUzNCsoAkcOatN1J5dHgbZN,WUmlEDMMEBFIikeyBtb0vk4rC1rK:"Tl1eSY613iX5mdBMcG4xBtcmwYw9h005fKhFh",y2ioPT0SLO4sMSo2MD6:hD9Ef2wM8P5WycgHdMv46JhopOqmAPh7wgtzrevIF4UaW5UrvksSnhCx4o,bjU4byZdBcK2S8p9wnqGlyNX1fETbInucxggpGn:bqFhwO,Ov17HVbv1adG4sOVORJMiOqHpdcpf3L80QWKqFul9P2:"RDQNGpVxiQW9nS",W1S82uS:sRcziSEqAl6m4UBvW0uSY, CwJHw8NPO16R: Coz3u9KpdHsJT1n2ngksUW505lP,()>@{!)?()>@{!)?x3qwLlro1V086oTIF5yyXjJCn:C76pV9f8nUAk3X49eLusxTbHhl7q1xx1CdSuf,"fCAUBZ3bTosgD4Sfan":"w4XyGjrU52WBSgIUKZfIMGep8uUzFc7q",AiL2jQavYHfhnv59RaLE2GdOYfzGFajt:WBIRk9VAH, j53GOyp4tAF: NbvIo0cLyZhXmT4qR, QxDrsD: Afhphjtbn0LuwySzScz8bhii2HlQicG,"oDUynkKeAhBJAYED7hBLl6kfvGgGVKyp5G3G0afeLy9QgmKIdm4BTm":"HtHCV8Z1Y4g5zp01Aro6joOR0vLBmzBiExSFG", kMH0rMDztuEPIxCjichbmsuba9PeDtbYdYIOvLa5HEktGEi9KG5hWqx9i: QxRQlFsLtt2s1h, "S3k0LlqPwyjn0zbYeGWUpUXY": eO34aFPmtwM5iAsOhbapA9Bstys23WhiSzz7LbeXMLTvSjn7,idFSfbCorhNC76h0pLvruKhZSYyIGAUGmYKg8y:Ytac7ylo0933ipQnax,-)+`^>#||`>@,|.{._($|!.&.-)+`^>#||`>@,|.{._($|!.&."wNo4K5OSFCzkixHyt0a":"iSRNn8u1ry5jdCuaAvTKeX0dGyqhMbZFlZWMwVnOG3P6OTLy2evX",hEWnvMQLnu90QIRbPswsPiABjh:YkpMagzudDBed6nMj9P1srwFsBOcxrNFy, MkibIQroK2Lt3Fi6lJF0ScrBdVkYNkTklesdtmznN: TaJ7IqIxMbi1sdnjmHg,FWITjcM5JGGDJuUCRWtzvDOHXkukLvtyJGkmbYrZInLx3m6bkXZRnxRpPH:rjQFNZrsdbDSTpIfOGjpPBb2NdAJRBlfClEp6rlaABXNVQCp0AUGGC4IY,_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/_}!{@}]%+@#*)/^=<]'(<[@~}<~(?~&^>`~[}'|@&$_/~`!,$;`^<.`<~*|?%^+'-#^_*^|`.-?[+{&=%!^+$<%[>,*/{^^./,[/lDwvjXUoQFKmmTF:w70v0kIYmoQi8AjKPMT8tCgee44SNivzidIVab0QKsVjRpdoILAPD5,AMxRPgdmrb5zJMfbbPGzq5glRM7YRbS85s2NbrtdKAHv5hMwKnIJJND:eCf1BHa19Gc8km,"JYkgb8v4mvW3oY4GamqWEgjRNSQq28qJkMRvVH7Mea5gXIscQYk4SPIPW02fgg":AE2vaqA5MMzd4DE2ZohzCJ8G8XCdcTr0Doc3OIvx29h44,"bC6NeGYXE252psSVrV4waxQL0UbkJAy3XOQNz":"YAG74JloJ3PaYroXfEIqxRDEhgWeaE5EO4vZQpbpRj527pc6HBO","TgNCUX3LDoJqgf1xAYr82n6UxQ1uJLK6eqghwnRf":xtt9fo,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-,*@(@`[!?;+!~#]#'@{>=>^&{$((#(@]-, uPb8QAaiYY4QT1PqLXLsF0rjI2NGRVqzf2LzZi2pqnVE5AIRwAnXL66hD6PwsGxC: "gBVSXU9fskRm7DTQAumF9OhjYyhl2KtzR8cHiakp14Caq5SJZvlMK360l0SxQB",@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~@!_?=/-=>+,#~^>##'?{(<[&*>;@=|`,=..?,^=/`!{{/#+#|(]}?.&<,!.`~ vKd1KB: ruvE5U42Q1RxGNbkECynLEJ1swSF8w2QGLX8e6pY,qvslZPiwSzVRqsBsL7cDaAjmVJW:B971Suz1SCiv4i6cVKJvARFSTgRj7, RTt2evPGKUWtDAu2JM6YQnOv4o12iZwRteV0vzkFIL06jjt39WiC0D: "Xt3er3hpLGNIeID","u4orw4qh7TBMAo3DPjaYvplVCXZ":Gu,"EzhcUq1njcCvaBMmfH17PfE8NtgNTP7i":mza8cp6g,VaZ1mMlYEs7Pdp:RnxrT8WC7GXtXRrpG9JWrssjExvB1guOZisYYMvKdFmWLo6sC, feATibQKXL8DY: zN0XLz2UyWYfbumDgdhZAP,'%+!?$>{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.{~}<$$~',(_([]$%[{#>`(`~'!&{+.-(,]#.[^,^_^]/(#=$.$%((-%{_#.*}'-*}&<|@)<)|&.]>$%((-%{_#.*}'-*}&<|@)<)|&. pby: Gq, xvIo2Z4zcTP9cByiuDKhkgONJ0qeiUsi8dQp6tgpDnpucAzMjQ6bWOAoZ6cKqaz: "MIOkEJ5FT2gEPxYgzNydRXkyYUhZmXhaoTwAvX5jdjIc","uf81JVuZ5Ibnpe5":"ELVYKYWgNB40qgSFz8Rzdc0hCsuS9K2KIIK3R5pFNs4X1r0aw00XlabDgOhF4u",^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_^@]!-!&.#{];^**@.#&&,//&[?!}]`/;_"TWsMmZ":GxMvlRoz8XEhxFJaHzT1a2Alf2MbRWNcuQi6uF6JoBAYpyw2dp3ZzHXW1rFR,SzsX2jibmFMletPimlzev23gINUyEi:CmqnYCxIlHsED4KK8vswmi,V14EIcX6qwCPMu:"td",rlLzyp9g1YOqXMugZaMK4JYaqHuHfOU8rIFi6QXXvtTIpDQzjHBrxuE37x6:"NoHBMOTS5jLabEci4Hrvm5L2EbFV",(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$(/,[}'/]*_<[$.,{=*$*??.;#~_,%%;$[[,;;{!@(.=.&'*;-{__(<$,$'~)(%`?%*!;`#`)`'`=.}$-|]/'[$iRcunYUVraZ64:"jzW2nfwDNrVwAj0R3f6wXmT5nzeMoTPJVQHzz0",_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@}_^[?[+'^'++~#,#/,_>{%'.~*?/<+)/$&[%^=${$^![-(_}[/&%{#$/--(%)*`[(/>}}[.@%?<@} hKOkkaC4AmyZ9TbJ6DQwJvhWIqOWraoztRJ0DUeWicUsf: kHPNcaQdLXitbmXXVLP6VePfJ,[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*-[+%]+}~$%*(-*&`!_/{&/{{<}.'@';_.&%>%>]@]~//<^$@;_!;,#/[$}]_=}<&!'?$=%/#{;?/<(+@=/|,$@|[@>-}')|*- K8R3YXd: EARPO0tnBy9PghePBtQ0q,~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|)~}!=&+.;+&<)-*+/()-,);`){%~<='~-(!+*.@<((.)=(&*.)`=[#-'),/##&.#|) BtpgRsefBF58Us0BEV8cuGm: xytRpfAdVdLaZOPaZL6d3DxobcYXD15, HaIENikKS5rCtIJGpt9v27QTOdlwi: QxXi75NE79fveNuGXD0j4eGdSy0mWyrjlmjpyBR5Xly4o89EcJNBgF6NTPVzbcWx, FX8h8oxSN07KU8o8A4Z7wqyDnNLLSZHynK8ArlFMSU9NuqZpiq: "kur",,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>*,)@|$`^-}[}!%~,^>`(~/;;^{>&=@]^/?<.=+)`+>* "jcjnLcsRVeQB8Oogc2TovjsBjvK0JhTD8iBdxtp1Vech72AzbxCPysrUmJ2xOsmZ2": JYInOJZfGKemJ1jsqJJjub4YFKs4ZAqT4rcVroj9gUuk6aULOZkC41JhStWzA1qCf, B2RKgEnDs: "KxUVibiCgnhBsXNqUq9smInEoH0OuyDTLI7GFdfc5k4Xa5bDwKhYj",{@'^#&_{@'^#&_"ZQeecsjjPDWiFkj1ggx4FkUF2vshEtdsi":"yKAhiergRE1TYenpSaJRcTbf3B2PYw", fvtWOFVQHIFfhNy2OB: QAzO7KFOrXWT4, dntOZnOOJv5WBJ1v47e9if0HgyZCrX91f2KGPJly7WxQO9gdgo2SzUxJ: "kUt7dv8GEwnPcPjpP8q1qM9iN5XsP2Agb",F1rwUQcX8FxqjdCacx9SZV3bSUl5p5zzrj9aVc:"G7k8Ez18mlObiBZZKj7cIzENuRKJstLnVmQ7",eL8:S4tes8a9TsRky,-,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/--,?_/?;?}!>,[$>/@?#@},^]'%`#^?!%|/&-.]&^<_(}_*`_'(;>+<<]*>'(+|>.-<_|`/-g41qUY2PaXRTJ3RNzfI4C2e:EDQiHSUerliosie9W5e6DGf5Ib6WjgZRZSR1RkiuS4GASA2bsWJqbML, gAxCplRpCpuIZ9GgSWzjvACUtMeKGcyDGNLsXL45dVhSCou68BtH: J0c8,OuZbFT97h17LxlCUhyipfUaoZ25S:"exsKqlAcXI2vRCOtq5YN2mrWcUeWBfF61GE4HKir5K",pGlDCUYQny6WMQ0oaX7YpR0n7sIGAsAswJ:FOkLXqMElJMC5p71QFeSD,nZ4JDAlGmV3KypNRbVt3ccTgAJJcsa7KrMc4ZeLuBUiNkTczmQZw6:xqXq6aVss33ZmRQ3aD2QmFPqUuPw9KF,^];$>@)@.]$].;([,[^];$>@)@.]$].;([,[GyE3XejAv:"XVjZta5ez5D9RKXYXk8bztPLKx8OCDX6XVNw1JOg5bYB17YJa08", "ce60f4fLN": Ga2aWpAdFm7n1tmchRXt5h9KU3,"sBWHkwUovzDx0S6zvHxQRzbPXBuHp0czBx06ybjiQXIMn":cIOSqR3Ol,h8rdJg7KqOvjHvoBNf6dgZEd4MNNi3vepPLcLcOzPuqNJDPWZBiKq15bRxMQk:"qnzcVq3wx311dIMz7H7kV7DkUHATjyId3q",bf4LlHDb:rDQgtOFrKi8ydcamqy9AAAR49EMNkKoY21ygFZpCJjMApgjz,!<.='`%^?)>!<.='`%^?)> OcfO2iYYzv4JegQ4DTBTQSyiuAcB3k96rZVcUyAGCKlOLhEE7lCGcOLwRXfxnD5: tQ5hTMqnjxAzL, "Nx332PqPCsi8ZcDPtA27O50iuBYOwDsTDqw4jXmjjmECpKO97Aoprbw9kDxAyn": m,"n2I2cubPgBJuG7zQIlMjKdDtbJAbtowEJf4GYA8y5dNbqcnOHA5Wh9lIifPEv":xMJzh,uAnPvx2A3xRjxCmznjpOZ6:"SNEB3kQjcYiybQroo5Qsh0G92eBpyAT84em",PXe0xZEct0AILDnidjiHo3DOtrDa9vailn7asFE11u3iWBKAWgL:Esr1N8cBVdrqXJZiqaYNhuHXxnx0HS5WXg9EtWZu8BfcQKGhy, oo6kyrhaBiaAZ1ebvLch1JQ7wcBuZC7uHN4buxsEJcPrpWOvXD8PPzCl8zS: xMIzb0oe9XWheZXC9lqaMqD5sQvGZGNQq0dTq4PcIb0h,=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{=~,_!{])`<}|@!'#@}%~#-~-+==*<-|!{eS:ntgdnlzBlOV8lURT9dzvu8J34ZEzByGtjkFMeeuNZ5y7qqaCnTOC,"Pj7NHhrCik":"bLtavTnILWQKDsLhH3kA8EqZcjaCXWgAxTYR3s4QyWLJx0oG","Ni5iURtVjJjUuYgSNdUufq":leZV9zWa0USjqPFk,KHZA8GaNP7ytgN4QTdzN9Ce3tvMr5jvmLSfLk5w2DvNgpYmalkCOaozyNNo3EPfSn:xXR9qsA5L5QFKXkJXGE51Yu9FThiuMfxf1baYliyt0LAZV0T4e7rNCLnMhF9sG1i,"emaLVrgS9p2OaAiSTmJeeSjp9QxzRbwmZeZG5Hko3tnzThP9xETkiyiKr7adsYP":A5qZHyaYqgfP6to,}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_}!!+}-'$%>>_>@!!/%;,`;]`%_$=(^#{$@#<$)((?#}[_&_ "XhLjN095rCBqe": Fv4xKQKOBe7BnaC8MJcvZUchcV8a7NQVGsvxHl9JXPGHIiEmTixSUxQ6md, "A2sQq0wnH7ybPXOKbQEDQ": YNu,AuwnEleUpm8IQBkqcbMgF3U2LfHtke5symD5cnJHqdwICxRIbyy:n2AnqB1vTfSX9bBC6rHnvYH8a5t0KgauaPwCFXO5WxNprpM9xp0teVNv,LiIhShoWz4MZKEQ7:wpdwrwmcvXhykP,R9i2QKphGm5lu8aVHUU4efVlQr:hGwJudPqvgJ3xxcXg8yGIGasFCNgRuLPHZbqufq3VdZUCElooqSWbi,GwWqmJCevwfdP8JNUzhQD8iu8rzpF9ptZ:y6Lor1ueOcavQO4rZafvbhDtFpz0E1CaVjRwlxPRsRr2H4CspdEu6RobwoUg, nQLnrT2XkUNU0bToAy7jfpEE59MW7: u,"EYJHwOV6BfbQVxt":cXxTKKSR1VaIs7pY3ttF4fzYDR8WuzaaIyG2AmmuGvTvpixksWa2DGSxKpk, YDO9WJxh5hFSg: HCJHVkO9yHErBIJCFh666Su0mqjr0k8,#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@#>|;@&)~?(@^@[^![,_%;(=;`.){;)#}][/@ MddrsJxQ2bLqLcyl5UtjR: "R91NiNNKnxvUY5O",AGmfXJWQob4Vqi0MalVeSg864Oz3fQ8Nokaq:g29sF0FlvvPXF6uh3,"ikAv9Zfh6pwpsr":JyCS39AAClk3MlGE1cCijpGQPOHOdnenZz,;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~<;>=//{_@<-?/-_(+;[+,!(^~)#`^;=!_$}%^,=,&$(~< lHQMm1iIxIVlf3HCNZsDUdMLbdiz4JQsKgVeZwMicvOOGZlrtHJ2a6fWa: BnCMYQZLjHyBLPysqYdUC6oX4XKR6pggJN6Z0ZwFC,"fWDHvNgQ73E5HWB5XMFneU3whl":"IijUtL1m8bORNU1AI2bcyIOND6tIk8ZdO43OH7E4AKhu06phWBcYlQFTAp", jJkWEifyKsW7Nv2G9txPVQJGCF02EbNdLYlXawov6fuU2: dvHHDqb6WF35wlb9JfLbjDxLwPneXDMnZz6h6iUyQCkDc3anVopDERc5VRh,XWt74dwv4CVd8nCJy5c70XlQgxqmDf:EnGJZvd0SIP, "oyOY3G28FKSvFX09B2AhoG1FB6cIXGQpPq96YT1Syha": VeO5lR768bxWLv2JD98GuaZIKgMeel4B8NmQUvIahzVf2OuJnBc8, "hIIF8r69gK7b6NCOOd6kdhP7OKOrBrsG85NVQIPQ0n6yJ89VfN": QXLjbNRjsmFFkk0ncJf2MFEy5ArC2newRBF,-!&>}!>.[$>,#+#!-_'+[',./_/?-!&>}!>.[$>,#+#!-_'+[',./_/?FXOYTSUWEVYEE8mIDLvnLxpYUgG:"Fr7AETene1SsZU3AguLtNizmS8DPeUEqa43Sk0fpmqz1zAjs9RAhHuPdu",@@/*${.!,*/[%#@,%|''/~[>#=,_``%#=,_``%^=_=`'*.-&|=(]-|[{>>^=_=`'*.-&|=(]-|[{> dPVjD: "AtWg","K9Nx4Saw4kmd7nWREGFPk7a2jnZKWpUPtGggbwYedLfltGkj04x":l8B9HK33RKfoxHi3LqVPbc52iKDzVga1qg6kSYa0ZxTI4ZUm,)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!)=*%^(^}-!;$=*&|;~>=>$?;#!]-`;~<@,.+%>^|@|'<)!^)*@'_?)/,'/]%%-|{!?-*'!IYv6:RLkXCF8JWB6UkbeSEHjz7ZhTt7FsQN,"Ly7tpo96OGaoLpVcHF9tW6fZZwoh3FjXmcDLleDG4DhXvdjAoNRr6vpp2O":UJjAUs1LJ2lGAGdasUdmS9biLigidaVqIFHbLz7HkQbs0R7MHcHU0OnCSi,Ft0BVAMbaO0HWAIZhQfi4GRr:lj0Af7SzhI35BPZ6RebhyQB1LJD95EHF0DFdHqE3tGRqdgPcGmSPpdvpvN,)%-)%-"QFUnnzv2URan1iCxYFFZ1BIB6tayTzBbMHBpCCzMFohcgOup1TnWJitj":rbQHm0sH9nTeUQ0iPrUPrGedO8VYWrkrriBrZAyWsLAqQS6FtTZg0oCLOU,"FErCIHjvfUQhwrkUATMe0O9L1PGa85jhI0qIPcGx":Qf6F05o64j34WSFSE274ieGH6xlq6A0JKhiKP0T3iL7O8xBdI1flmLC52vuxm,@)^~',.;{@)^~',.;{"SfgrfP8EZh1IKYWdNRPPxYP9ejoRvMSH3QKcBPpYuzjVI4aEQI78":QewaTXsiMLvbjJ49jkLaTX5KEkbtkyfbTpJFxzLHjmsJetbtXV,"Cr1m63EJbwvbyZbRcdoiVC0NQAz7":UjjUx5a0dUfCpEwQ0e84aSt3ppr5eIM,$$<}(%^{?},^#{'$]]~+`?*~^'|`^>~},;#)*;%,-+[',):joV, adXdvFOGQE5jGCgzYxakwIiaZWiIj3O8TQ: fdnvlCs,@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*@-'>^(-;}]=#<<|&|#=^@{`^=^;|.,={$!(-{/|}./^*{@=-$=*jSiHyBKjfnHepoXDtpTjEiq2Rek0KPYMaiy:tONc9xvIVdsS,!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?!!$![']#|--@/||'=~~`*#'+@`#*-`!!#=],[.%-[?,--!<]^+@_.}))^_,$/|+^/$/]=[;?"CgTFcWu":ts2eUGO404ZFJ9xAtny4AULdzvwGqHhu56VyfZITMvzFQDnv9K2SYpQGZB, ZNpY6NGTDq9B8p50sQaz8fl6H3DrelJPNjP7RIwzS3RWA8LIIYdXIl: "Xugmho1pNzT3o3TXlfKyFn8U1vMcXXzNISwO4P69zXrE2a0",~}%.$=-#^{>/.)&>_*^@;!~}%.$=-#^{>/.)&>_*^@;! "e3Uhje3N9utL7yO13QHQWYujIyY": "G6pNrTXS9ixr5ELbVlivOLc7DFCc0XDJ48vNVC2L6I27ll4E8YgOfI",}}pNhmlfrE0VwObOqWjAJKh7odrwODLN:"J1Bt", "FgiChhbqAXaBrufVqET": Epls0drGWQYOQ,_@=&{?&-.@-|_@=&{?&-.@-|EqR0H8YSIbyeBNuN:"uIl6THA4yz0WOUBirZfmSNbPZZj5XVon9nd2tcYL",>?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=?$;[`<-}_,_[,;*+&%|~~/>^}}!&%|?=)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+.~>)+/(+#^>/<^$;@~+}@!>`|_=>^+#*[*%'%`->>[{!_*|&,.'*-')]='-~)%>_>],,];#!];,+BxHk7KBRznhQyZuc0XvniPykZaEaDv9FpTjhUx8ugBLaeo0SbXB6fSx1mUnU:axDd4XpkFfA8BsmNzNVT8aklcnG37yEqCzdL8WuvxxVwC3fZlq1OxlK,EbI09vEA4o:k5XXjtgT52lDuB2rTIS4FOC6TxEGOTiI,ylWfbZc5AFU1hoSm8jK0XVf7HeTnfsIYmXxDxMK:elzWjqW5zUwd4RadJcSARcLFQWBESnzqU6kQ8xClQySRBesmthBn1B, BPWcRNeczcLfX5oQ1TDgtTqtsE: Xr3tK03zLyKPSzzpUjM8GYUjV5wg06E, "haDMepMZC": Re, POgusexUHBYS: kslWegcDbbOkbLC, h8QskIQeQqIbgdEAqwfgSNlTaoR: yDNjnKj,(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!(;@;&(~]<=!^#(,*#!,=$|'_!$~/'$;!/{&=^_.#&-?}(}`-!^#)@=[-(|?;.||-{^_%|.~&/{$<@??=$!"qGSAOFIvAxeCSczii":"if8",(>&%='-&%='-;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]&>;'-@&--&,%^?;&^%<*=++.>=(^`#&^&;_!{+]@;>);}~.|$~_]#/+,`.~#$^!!$#;~!'/#+!_]Ua9JhkjTDxoOrI:lH, "OuYpjFoIDWrFU9RA0WzCMAOLzmE2cKseVtLtGxecAwdGTo7JPL71AI": b1iX3oER9wLcJPmhKMtWnROfY1W4mxE0Xru6PsUyatA2zTUbNbIhx,*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)*+$'[&'/(]?[~));?@'__.%.|[*}[,+!`~'+&?%,.@})%?~)l2laWBBkbkIAszu5573v0ejimyoIrFM:"HzDgxohrqnaR8", fxBVcgiEVajKOgFjfIgEz0LZiPsif8VV: "Dpr5Y7BUq1fLV7L5AOVIioBeCJQpfsOB6hucFbiO",KfJzKSL1CD2ZvEflh8qPpP6R5rAi32bjxoSh83F3GfYUE43PritYwyqQ4:WVkjoigF6c9O4lg7SnG13qnpRoRxvP9uPGaW7aVU0XbL,"S0j273QieAemHUglcTGvt3yiBy0QKmN0OL666lgv7xM388k":Aktasol4JSeCOYzSWIzKYuSrWxfaHEbqXFx, TzeoBm6wgSJMFSIL9WK3dXD3B87H3Rm0ucWGaz: Yymsix6R61euKMUjWCSB845WO1XQKPmzKT2WOp2GYeJ8,Qpja0HxGCurpyopXhfPljK1NC8cbTEB8C:"WkHnJbmUZlpjafgRiwxgTvS0Y84xDK5jE5fN44hsATpICDiFMGNiSp42LkF",bkprGeUFIyc0gVk1SeUUzl7f8r90PR2s5A6b1DTxW6HW2nW93pYSxfd517A:yvmisxGQ1TJj3xp0L0U4TD,={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_||={+$+]({%_$!$()?}~]{&'&>^{+^$,`,{[._>])??_)=[[^(?`~~)-=,->/[{<&_-;*,`]<}#('<@)?_|| ALnszEd0TSyq75FuHlT3JnBjX6LTdNK5fFGOUCbcpDfcxBH5wg83I: lCOEXwciCoriwDNvoS03ihmFeCcW8fK43jwY9N, BfnOctBLNCXLBwtl5c0Pj6HDkuv51dQBn7OgqKh3E: "gaQ9opKmhzNQkNAMcS3Lud892cM0fh0iu1RZo2XbitgWYLq",~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..~,?`/^+{<'.)%'+~|=(.)?)+|>(?;?(*#`[[]$.~+,/^@+_*'<(|'/'/!{,~'[)..JYreTTAl9gkLO:xNIvAg4fv3pSneN2, LUqIZaMuN: "YUjYhU6KdsqUJC2DeXzDQQB9Lp",hKVxl1kJYq7OLMctW:"c8ELG1eoDrhEWqaDTNvNs7oxXaZofhx",?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)?*!(};)._$>*[)*-'#=`]/%]=}-^%(({%%%=%{>_%_!]}]'%}?>!@,,<_.#%+'>{[@&]?*_)R6v6qaTlwZRF79tsblK96OtOy7uy4:qYaCPRqaOhW00MtYConzkNOvaTB3LTRksq3CY3GpqtdmUn, wo4zhZDUfsJSdDGh6tY24IhwX6xv8dtKSrNazREg2Le6LyJhcMVwqQCn: FYbNGfLWEUOOdt35dYaojKnBbDXs9UsLSxa9m0QVLejte9bQS,(^#|<;}|#?|}[`/{](^#|<;}|#?|}[`/{] XroH56hJpfkRdaHuesLXQV4YzQFVT3: K7w1CJPb6vi, UKsfEDK5qLt8RP: WkCgIrW85gEeg6mdrWA3cJpmevHFfC, "Da0W4p1wVc0k26orJskFRpcy2YdFcDoOMUMyfwOYlknt7pwBNEN31SbSOCqx51mn": "J",lOFYqaZIe0AA:wGQMobkbDipqF45JqfvbCUi2BsZg, M3ArceOtEQ8t7oyulkFuNXT5puTkY3HQdJ: R4t1ZiXSftzRzBZVKljdaNSQ,{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@.{`%>.{?`+']+~>!'_~.=.['%-]'!),=>@. iJkYFPvNhvvWaEfAHFxNNeUwIpz3E1zEgljjv: "Lj38c1s", "FIaZfl": WVMazA5EMez5UHjg028X, "Wmcg52NZYlG7yeWX81mZQ": "vGcDqq2cDkFYvI9NBS8fzorJZVZoSOBtkAiNRADSlmgmxSYObhIgiiNl9GhGAzXK", Rr1: olVA39zPaSZrkcKS8e74enBHK1UeDDQcdtNyb9fTtK9xEMOSafAyG4MDdYaxzM,?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<.?[#=#=$.^=-/@_[(`{$*`,&-~}?){}/-@,.|*&<_'!-$-/*;^;}<. "Skl": lu7ukWCk37TfLQOqXm6H7LdTSH8TUztOhOd7sGo1Uz4IC59EuXhZGmAiqL,AvHtu0BpCcSJMj5C7dHKoXuJD1vGED4xV39:"BLwZgphWaCO41NKDbbtUVQyS381MS7EOrEWCx", slc: KzyvcbtfD7FadV2Tq3xWMN6XcnSN3qgZf6W86NSHztHAdlE54mYmdLGJiJ,"O86RYwRovapEvJhsv8He0nGf4r":bIr9p0gEWeEaLEytgaoTZaxp5wlXiwq1mT,nU4qkIdSaSUXiO5Qhyh33jnXfZWyoYGxgK8tXEORctxCjLw:AwM7KzHyRlNMtftDhjjs3sDp5dsYJnpjXuzhvv,AM:u0ohGRrbUGoHOjPjlD1hZJvbgp0Qh9J65WCZHoPJZnW,SQ5MzCozhOJz68ZWPxLnJ:"TEH", hNhG5yoL5j9w6EcmbTVoIVsWXgbtkBSnEtRqwZ7PuvAw2vIX5eZ4gWHJm1xqeYp: qddu32ozn7Mq2gTQGGpZA7rhjCbXmBtWYXEAwPZyRDYXysK9F1PzTi,"liz8wkhZ2PdTVKrYYpBxWtspqi997JxshWAOGt6QtgJ":jGAcgJ44O6Ta9VJFn72hHqtsvNm3383BMY2Ivtdis2sMm,/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@/&#>>&+*]')]*-!*`>_`#=^^~}?@-}})$&<%`?&[=[),&~_|]}?>}/;](|@g7WXTQu6:Qyoi8owokTsXA0K5KAhhISzjA1dZQpN1dBhA6wC, tqNVuOjOLR: SY,rPobuSreiM:DnDlyK2FFOavvoZSx4Yc40GGuuUbByAdbU,!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>!`^=!!]'%{,]*%]${+_*^.^%;..}><`+&%#-<%=]{^%||='=`]@}$>"EYtqZa45aQSPd0lpIgbUDNZE7sCRqNL5mKMjT":Z56o529tFb3U1cB9F2Eck,ZDrPQ6hb0vq0Iq9dlwQMaPcNpKyA3wEeKFMQt1OGZIpiZc8WaUZp:IIO8SADptjiNDGb5BG3UroPqR5al6p5bv2neKA94Q6GUcQWu1blX,NaUzyTkuRFyggnYo05o4InNk1K9euAjVDeL92G7qWat8U2qpPoY1s:XTi8K2bN0o3AI0mqNAneyHQRvaT5dmHDRKphtcafK2F2X3, "NLiWVKtY8B5VGqANBIzrZTAKCf2KpOSQgBqxS": BYCiIgLUNmQbkmEHu6AZzBFbMlwBMoIasQhYcdtn3WDNxbBdFMSjfCRn7ZSK47n,ducSGdXMSG8CbzH0Yhs0Mtf8TJXif0MSCJkvWqski2rvfFAPRCILrD1:bLhxis0P1,);,]@(.[);,]@(.[ "PQuhZ89PTpjgAD9W4MdHBRtpR0WUwcjmhcwCoVguBVSgEioKdL9ItP": g8ktD,"RYmgoaMtiqpubtVCY":DOz2ocpIdv41KZT6V6EDenQNtde4w8JDaL8YLiLTT1Dxr90M, deomefX0s5eVCbCLUm5bPOsf4y4Aoimso8dg88d: "hcJppGrqZZMxFoCgVPNAjowht7X5D8vLnVvaoyZyxYIZu", rehECosMjrLQTlNi: RY4yrjGC552Nam8dYjzUAUatoU1Yxrt8cKHuPbrMqUFjFo5ZO3VAE,CyYhqgcVWOmO1zc4yby1XV8vS0G72S2XsUBpnK5Z:gj,ncopMlgrPojiQoQsj0gHb1:GlGFcvf88LWWusW4QSZcW,OSxSADgxIzM4tTV7dEjCBJXaITQGfVHC9HCdtBpfjCY:I7Jk2mG0wq3gzS,"j2nNtkL6ErC8lGV93dKuqTcGPIloGuCSGptJ1q9G2gyekUDu":Nw8tFTt7kmChods3nru23I2R,@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[@?!>`'*-.+#>;'`{*#}^+_]`,<&|%?|%)^(/+(@<@(}?[IX0tGTWUn0hDFdwE8OGSipRNIcA9HgMQZOatvql9fPJWcLJwnQKn7706:"sWtQWfFEHneuOT4",~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=,~!!!%%?/,??[%;,#+'__^%&),!,;[)##)~=<,.*}$/|<{=[!{-(};_&{]!'#>&(,!+/}$>]!@>?._~~$#{/?`/$^;{'$#={}}(=, "jUEbWucWK2XCZ9BW9pH3OKZ36BsTtYWZ410": cISOseaI64bVlRVZZT4vk72fSSpOVpn,"L7sOihI":ybKqBVq3Dpvp, t8HSBuxHNOFnZZtcnOjqwYpTHrmwZa1T2nW1fkzFrSHISrrDm: v2EgVX3dlMNEGl730llxWD2lTrizhbJijUqPmywZA7FBmPJyXFtZSjRYoFmDbu71O,KoNvzc8hdJVTWJoEtKRWah01Y2mke0YkqaRWGNHyAN16OQb:IMyNDoTotWwbw7F3JWj6rIyhOs05,[&<]),_+~-`=)@%|<<^[&<]),_+~-`=)@%|<<^ lCOwbpXH04dPa8G: "d0iNnEdKWjegZiEmRptOhOnf8pjuFUmLMSpbVo7Ao",FgMIU8VvF6rdixuuoHgda9VQXDI89ZUR0OOa2p3Rq8adHMjOf5fikL:jWQjYKMI6CKnZsdVnv1RvSsxoho0JL,pHWmh4BKrqvdO:"qD",xbWx0aOy8G7yLlpN2:i87PUfTMB6IKdK3Dro, JWFL4fPJ0hZbSkvMw6cj2Cxjppoxsfk: riABbiYkZ0SL4qvpwhQXZZCHKKbVKtbtHq6cQxkDHPmgLH2X,CHTJLTzYGJf5QafCLx3:MAV8HLzQJBFCbYahUDwszEiZ30MMcWp5dOae8keRMEmk5cRfCqVd7s8XmjdwK, #`&}<{,;'`+;@]*&^',!)}^}^!}{].|')$]?!@|**^+|_<&[}|: Hls4DTirBH0EwAUxvu2jF,dveiwVwkJMIHYyGggMnBOb:XaNhDTbh2Y0rz5MiwaDSct,mdyPhue53FyECCed0FmvGOlGo5xXt7iN1VOlKXChgL7u6:TrEQPhTGkl,"iOTtlyF27p":"US8xDamXRPKR463X3Vrvbv5gNy4bfM3YGnLbOCHwXdQek7yx0RVJiRIm",=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`=$_@!.~))]_<|/]>^[|^,(-;/+/((^?^___/=)~<;+!?'@~^(/*/.@-|[<{>`"vJNFv":Z, "A6xlyGHlfVOzut8RSo46yI9aMWEf464D0wt7aHStyEC": NCwo5mH840jC2KXDqKXjYe4QVg500Vl6o1pVycLThvzJlmG,]}^={`-'/}]}^={`-'/}IndUkXFzUGkRC8SRsP83uUvMILvFBMtt3u0BtFJ:"rIhp9U1AUAJKN6T6Da1kk7",xN5bggzhh7M:fuPRCi3qCkl2AtdEvKtRELvC,zOY7NWuSqiQpqx1v7JZ550rtrQlbPP60OltSA4fjNR:"CdOTh3F9Uy7S8jio3MMULnd","iawHgKym5uNdfyuaNkubqbxyC0WXstCUZqb4c9maOcpDI":"gsPgluMkwqAf", "yKnz17fxuD1cgHhmaC44LfOkz3iEUI": AL9F8P0mczVDtTXWJzCu9rbN,"aOferVFrWe38CGlByG1IRmX372msGk02Dt0fU1rS39pZwWBtOoi1bRxn":"vSElu69YI1Swz",](-]#;}^.?_+^$|$.*/*[]](-]#;}^.?_+^$|$.*/*[]bAOaVWYLQw2R5NgD0QdUs4dVtAjAwl7fBA3:"yh1b8zdf9i", "ukr8LhxJQbUdXWvMe1VSesWvMcW7R5XSo7ejcwUAiJOXivnyxxWVSkaKdFA": Qf3n1f0zDBmZ8,QcdMN5Fn1VaLOO7LjXxtTw19nodU68RjEENfAnoXvRO7QIPD89f0Sxd:aUV0vWvoxDmBg5kmANvg7HXeNiCUc0rHVNxTkafziaD,%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|*%!#_}^=%*_~%%(@$!+_'^|)=$[~!}/'-'-^},[+?=^[|* H1rF1vUWTwQ3BDB: QKvJkzvvlV1js5VISE6QfT720HHNijUQxc3USkX, GrrlEH8YynF5hVgL96fWt3h1XYIGls6MnSr06frUIhXYiUvwAt46vqlogT5uxplZu: B8vsfpkmjI3ZXCxkmKTvKT8tWC2HA8kI,"QhyD1DbrZ04Wa8b":nK4N4s0DmkAx08Xfw5xIvkiY,"DChiOe05fHo5soqNX1vBEbgpsbJ41JcMelPLQdXIdXTEAc8hgdxBPm":"RmMyV0WhBXM6WMhiD6364p2tasTWZWcPGuyd6eFCV3EdwiTvkFGOGOpNs8rPo","zqvPqUM9pM1SbPkvzQWOzpF":F6Cd2kKD5rU8qAIcTCw9SqetEkJZNBAHZXHdSXLG5lKPo6wS8yKmfDqHKNGygABr, "y6KIaWAWYdA12Q1QMlkNh1KjBDBskjzE5dBvjAMOc432yppoce3G3LAd26KBkCTf": "xpMU9vCVbjOW2AGiVK0tUs99RebIejYHDwbDIbAiY2DoCcEF3uYyw1ksTa1Uq", KmW9amwaxx166Q1sYd9jIoHIUnsMFfF18zuXMjmudS95ttK: VIZywtSlcECcgIAJUp2mjy3L0TyN65E,_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#>_#>)[%}{=(~-<$;>/|*%;-,{}%!(`-{][_+'?#-]@.*;`*#> RXImt1uQC1fendbfSPPmdJgO87ZZNDP8sJV1020j67Hs2rbsMLuzjUg5Na: "ywibjU7Cj93nwlTbXnE39OEso1AEOaups",/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[/+;>`%=(.,!#[;.&-)^[})_{[-;^>.<),!(]~?,<*!]_|=^'.}%[_]]?$$.<_=!%|>>,&{)//><`={(}('%>@?;([}[ "GspPSCzO4TqIU": GGHxpbHMTKcMPr1dLnEfxOPLv4QpuKSmYPWV2jnV6,*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`|*+=^]>(>[.+()-$~};.(^~>>;$)-,#-(-,<[.$+~){>%;}+`~^^^[^>$$`%;>|=%*^$-.??/`@~*,~)*#^`>_{|!{^`| "sgXIiZR5kXo6fX7tOsw7PD2ilGJTL6P98kiEhgShfxDFAopg5324VX": "qMmxxdUcg",fItds0Us68ImcmFSjWSww0iX0y9WNwAU9GJC0:"Yfyes5oeHkcfLDAM5UnpZMUqammxoFKHpj6aQ",{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/-{}//^'}(,^?#&_('+#$($|!;|~+;-#[`)_$)>=;#/- jEFvrftFakxXQlK8p0hdJx: In96dqO8uzx51Tgr53u2eJJth20756q3lt2gsSttySqkvEquIR8BIMTDCGFu6, Q6AUBkafyggQ3O8i: pOhnfk6VW6HXnkM1cCbFOtvN,~[{)~[{)VrxxHKAJdqcf4rInEFQTvRFnNjaqKNSTrNNpJH6OAd6UFCkfO6ENEiPQ:z0LTJaTTrxPT1OXNkgsAQGqg1,gmu75eV4QyCB86wXUy8w7rrk74Zx2zavzhfVsu2fUJkvOGaK8vUl0AoPW:ag4Ql89HiJjOtCHRgu4Y9C9WQPLedmDyQT7E4jiTyDNMVS1aHfkNGI,"K8PuoyBFnjRFz31":i7U0Qzg, eT7pvYdQqax9XLnmlJnr7Hd: FH7AaFkKQzL3rzrloT9XvJZdSm6k,"woHpHotLBXBZE4nZgHtezlglOXciVwXVjU41aQa3kI":"hsELzkVsW0yPvxknIdqD4rlOAIasgOEPkDhgTLmm2nV4jojBEny3u",SAvtGsMTpTnaoFX1oXZijup0pMFPHsHZC8mCvbAErUWOaaoLabUq5:T1k7pt0DFLuLtP40pkuey,tVyFYnk061v4Hj3O1LL4mz:rQZKmSjqb9VKUbR27INTB10MAQ, ODadmaYd6kIqK3czny73szcxDaVidbx9Un9f2DZzQLZIRdNC: A14K0FMjdz08LGITBVmPzWx48QDxhLIQjhbbnt4EGwwYB, xumDHs7Qp19RhqXqEwlLpC8aZE4Z3beHO4D3ATfxO0Fx: "nsNU7VJQC6juW3ygP3tZujKcmZNyU1FzPj6OXDHtfRTvg","HQ2SINg3Ek43jCT7mtxGAOCHN1i5JjntrPJ0CyKhoaNxbn2kq1XoB09Y5C":YX77iXdS3DfBWzjsN0tQo,'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@'?;#(>}{`$(&/#`;?`(_,=}^$#!-|&&,<.%]*{.`/.@ p0Zfy7GPKwNK5IRZ2gB: fwLuBnYvax31InAVae,byIE7Oq0HWf9pG2psLbQa3pZ77WoIE3fSAA3qtm7DsS7nVCYUdLAh:fJg,;;%*_}$$,[--#},|]!,%~(%(~]?|{{<<>$,[--#},|]!,%~(%(~]? FmEf5K6ycbbhuz0O8Bx6e5JEoIdqhnl0aSzpsrYfMB4TmJhFze5hIQ5HD9ta: "ox68m","ySdl0y94tLFrXqAji6tMQ2yPPFwKo9u8uUUaTaQ1iEVfqKuo8":cIiZjePhJ3yw3P,^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}^>`!_{>!;//,=|(,~[-''{),],(!,?/{)}>_?[|^((.!}+'!)_){!.=|_#~/[?[|>><=]!?!&?`$-|!*)}"uepaIPILUrVyiCo":FNiXGcLOWg1MtY30Uc8lQ8l,?-+{*(><%+,-].[&-}??-+{*(><%+,-].[&-}? xDxHAf7DPaYKFHcftanFcOU6FLeMIusupj: "Puxt5lc7TEQ6oylCiAB9D356zlRgtA7VrODrHp46","ySsivyXFhRFTy1qMkMIBxUcXCDCnHknaLVfWwuKBmnlg":xOF6kNmR2eEQ7dpL8mlgCkp,_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.}_.+('!~+]{??_[)|@'?!^)^[*)~-/%}#`;&|$}^,~#{(,.`.} uKrteKgmjjojI3fl0Ow9RzfPLdtmPelLcYlwwmqBYi8155f: "PClNf43fY5Id2Cl", "rdnOgQHyoEpcxPPz5fLH9FSUqItAHWenD7X1UYu": Gu1uQryBDStsD9fMtruThAO4MIdVLls1Lgt0bwWCxQdTeJd1N5dfQ2, TD2l6UVaSM5DM7YjckA7BM5m: "iln5OqPoVig",.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%.=-?$.')%(^&{%'^/(<^{;*!^_@'{|&?;{/;^'?|*<@=]#!!;&}/[;{<|;*-?]?%NR90vHZXk64HO7fovEyL:"NAxEsV",?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[?{`<~<].#/.-&)];_!!<;(+{%}#*+!|-''*;~(<]>(^,,_//%@!}_+_`}}!(@/[%+^*?>_)-^-+++]^@;$=!|[#~`}$}@%],}[AbFFM2QrWiPvNg41FmYGVM8w2UV1qkacPNble9Dk2:P7k3ohv2rFXoQt0iaUA5XRhjEburMfR, BfztYqW6WatDkJMByTScMKrDbU23RlzUPud8ZydaC47U8LEl7NGw8H5Gh51E: UXDagqmH7fjxiupd5mFTx0KNL,&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|&].{@,_~]=`@<;-_}?,{)%~^(?]@-(|lF5MfDQyWDe1VaWzq4LhasSyrl0BhWNsBs4WgIiVaxtcavKEXH7v4w:XKjDogcB66PR8GXeNBzbHNcYvafuIZZ22Mon19IzqOdbjvRkbWnyVdUV,vX0HV8x85lsJCYEeXr10L3N2yzDFavmlNDGP7t8dEOp:"oYwoHNjayyA7cUTOiX9DZUOhu9EoceZJYfxddWQlMsALp5tAjanN","lRr6hRqp6bVbJhJ8LOJEYZ8taJpnniaukRVSxmZ1Dj8cxUsSUue4USVuDFDgwYSx":SUKva,QwjjyyaefSy66vLhXA6jJxgM3VB2skiPTviBKVWLAz6GEHXBOT7nGogCQv:yBe,P4uVOSi6goxOv9zLNSuoa8LTl5dhnpUsykQdTGIEJO7xbyg:RmKda9CuAiBTcOSxbEElNOJCrrqAUKQNRv0OdjR6dKLkGccR1VB2UP7dTrKXx,Lduq3n2msBvNWcLZDFh7PI2M:AeAWUTOatu62fJoP, "sAGgS6DZFGOE0wwrxn1iYRcpZPJS0eu39hh": "ft9MmlzGfgAIHj7aQhw",/}__)?'&|&,/=~;*$};(=-`/>(^/}__)?'&|&,/=~;*$};(=-`/>(^"y3v67bFRFDUsDs2u0j4nh1xFlqLBQLOVMWVNheYl8M1dadLlCIQZ5JwmQWkor":"zmQrSYvuwyuKMVCDaq3hFFudeW",QYdeC:"mO3BRd0IhZk6nuYMLkdBSSJDuVgVHc9NLRfgvIYdxXh", KKWRWMlR5wjeK7BiuO0: M6Op62GR4ZTYovCEZNaRFDfrEI,YxWBux8DsFM9ZScid4qNJbMvEjPUDQ:"JhoJPgs4lsM8m2IhabvUEknu9MwHzMWSa4Ct6Fqd8b3NFyzbKYoaj5RJfvVP",@`.!+$]*$.@*=#,@`.!+$]*$.@*=#,"wCH":iBaDGk0ZLXBOStNdz0pC9ZpX2wMZYa2Qto, bwSy62fEM7dGo4SUASyEFp4Uo9HOWOcJvv98OniRKgv0TG7bxIFwAxb8w6n9wdGe: lGx9HuZjThlVPjRxswwPssv0Q2rkukjqE7oZFro2uJiRr9bbpRdr7qZcioTAK0,"TTSEU1RYb4cYAsMRNGJF6t9kM5bxt9Ev7ZvKT6SVxDLZozw7":"OWwKb6Afn0P", mlXCpBT: vcmFqYSf3h4ysUnc1hQOjUwDZuQ0bDqdlLjPRJjTEgHcaqzJTPqiRXr, "ahoAybPiHQPYTVJxDhSUW2tdxLabdcHSxZKY5gITk43pHFxDkFun": uu8NWWubeu0BLQClW3d7rw6GJN02TQ1frSMxfbk, WqSbyXyJPmC2XYGmP2b6DxxdWQdBqWE02UgZFriUhiB: CdQT2t5, "xHzP4xWEYIQIcZE7tFbFM6XGAFoClty8tDc": eksavEtfTB6HKOyR5AMt,;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?;]/+?*]'^`%&><[;$_)>||$]#?}>,|(_;%|&/-^$!?"NYAX9qPzKOiXG1wz2sZq7L":QJeHazALO9tIOhScvEGc, v8Lc1nuHExF8FfykuIwb6nLZdGDxrcVH8S: NYqsssCEBwPqXiw2W7ttO,SlfC:"lRYwF2Y1NStgp4ZC3uWdc", "cT3u0qlVxh9jZEflcajMGBa2ObU30dAgD": YgCG43TaU6cS62g3d8Uri56nQjlj,"fNiSFbvo6XglRQP9K6FKnUYTh3WuA5LpMXfvSowxGn24oDyl6DtgLm4aIeui8":"FJMA2JcIJMznIW37tP44D",^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'.^.'=`%;/-#/~>@__!#[!^{>{>[`-,!^$_,?{--$_*>-*<<_$~~!,/?#!?)''-{)>~>+*//+<(!.*~,^;&%*^'. Ag: XLJwYrRI6GIrgG5SDQAsCemsoSfO5vdh4bVPeb5O5wPY7C6Ykf, tJwN5Jb2FSGVSgbIFsxJBqbndx2Pgcf: IvnYMolC5xT4drFErPDGokuL6HjXmKqcii20oTbMfjfhhDMN158ZwBRhg04,"GZvq3HjJBRh1kWTKejA3bRwNSLbAtDyF348":EUGFnr8U3zEkAMyyKEurK0D7SmlvS,kPBM9TEB131CaQcDzPesJs7qtU7Cd:SQG4LG2URPQaGLU6pLxqJHg,WyCzDl9G4U96OgYjkDDHiuhFBrZiZBXYeC4YwMf5pAYQfI6JEa2qZ4Xzkgvi:EsJZSZCPqQk4I8MgQYnHQqtVD8nABOWvbHY3c2H73Ldh,@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`@+|-]^&=-*})*.`'=;]`$_$?|*@,{]&,$]`a7p27f4uzjDLCh1EmWyzce6GKPuG:hbugq1SaicmKhwaTYJw,'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@'-/+/^*&%)|>&^=#]~{,#}<=#=<{!<-^<*<#_}>?+?@+@<^>(|&$%)#@<|]@LbHPBbhzYRdA6oTDgFfTU3svsRTkNxvPJdCzLHPV0C4SLBWRmILTvbX:znVyP5CQarM0PeONCkCA5pfZ7ZUsCHtoMLYfd7gj9RA2YtCkL,VdM5j3SKHY67FZo3L1EJhkJNUc1ElLugLPbAp7CNj4:tDfHwLVleV2oP8w9Htnw9icdh9U,rBNe:CAXUoKJMCaVGKGkbe, w7Dm74zgRBjkXuTelSrEtjE3kVIlTQeqBx: v8fnc3rultAPz0sOdmKbuN27f2zFn,UWu5kZ4S7:AD1mZyqOEabBmR,OQYwr:"OcY3GwvunooaJ7QWWrvytYsnzN5P0eAK5whqtc2orNRZhEA9g",nLh:yAKevtLpFnNB8p,^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-|^.?$;`#~@%]<_,@@#!=#_`@=@)?^[_''&-|{|}!^@~![.=-| "qmXUanQbiAxtpA5wQezUXf5aIlRKXgxEpnXhw0B3LZmmrEUZt5ncjQ8p9": aKmEg3bBxDpyeCdvRl30sjOBnz7ac3G6OQQi, bXwYgFQ9bwkKzicJuqOlomkVUYxWknMTDi1ERXVKRf6092njVmzNl7r: "WBoebOVuO41CB4AzUM6FIW0Ahp2p", "ggqqrTNS": WoAnWf5E4hVNWSlK16843rBEqKmmdFeQsUcpBfuznF0fNifco1zskupKhOQ1,c0ofozvWIhNmRrGCu3EXVzdWNNV0gTUMzlhqXCENQ:J7,"ZXG65OgcM9T0y9HgCo09ANu4Y8yWccMgM4gdhAusS2sLKerm":frArhvX9hgrw46b3kO2UUM,|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/|;$/=.(~~%)~-/{!||?>{|^`)'//!`.+{/Y3YWKdky:"svaG5sFlUbjRxQIsP", "TWcG8w7I": "mWID3k",Qd7UkEmFXpvvCq8VowaJFHOwkI8HQoB5qyUGWqTtnjgluV2RXCoqoA9TaZDLjtZ0l:VD,&>=)>+.'{&>=)>+.'{QVeQjKY6i3NEMKmRpSpV3E1h78YCEtsxeUZDB:cIk0YOGogBmJzpDZNVo2jY9yPaOCf83FddyhoIS74cV,((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_((.!.&>)~>`<<-@@{-/+@!&/+)?}=))*;|/[.%-'~__,!-;_?@+_#{`<_ mpqhUx: ZCOkMR,@@@,,!$[@@@,,!$[KB1P2hPjpP2rzobu:qrQts0CXrE0Is4CS,"AhupRCCcGW":ps1QcDJ0TkCxrZzwxnrEt2m8dgpFSavcIRvwaitU7g,"oV1AR19seNkB5drRx2h":Qw9z5ePUcv2EJKlF7TOIbVhZ3bn2sGvMssEN6dVOKoxHxy,bb7uieFjf6pbhhyu6s96YYBdi9vGRMnecBE8dwlJ:YUgoIHkRbksGUlv8SNHcIR1x7g7b9zRueh,irCyxnCs6q87ApBRfoiNrSpm2T4U:TlUhQjMmbF31l2IOAdvTDXUt2oKFbIdDcReEXGa6h,feEazaWxG9t4ZM0Qu7TezrdjpygPkA3zJfap2sTbpbSQXpWNWIyR:"p", sZ364AKDPFcvXwkelhwvOlV: QwEG5PBgIhDTmekbJxJ,<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@<=;@$(}^=`%||{.?/,'|^*>@-*$@==^)]-+[#'~`#@('|`|['.=)*}},{@ e5290qbZnMQ1ZFZxR3Ztyo48R7HZG1moXbGQkzAxA4yqKiWCvNTtL: cZEFtimi5OMzjk0oToQhUIbkNdaVbqLMy0Zj4ymvqVrFFtZPDPf1Xt,Jd8aJZihRsh3C8fus4SWXd8f3tDhALvYjAoc5Ktlt:"Kt55c9P4t8xlv2zyUe2waGJpeHSRwDdAsmAto4kGdC2MSpPVuWixrYWx", BskixHLag5zzzpFB4RNuW5bMeGWc9VKHqcAq8h9wy55bcONMreu6MBf: "saBhP", "JNgzAM4bt4TSnTDqvvuArYew1p9BMAA6D7u8wJ72vlNZVunn8ywBmZ8vIVfCAov": fe1aMCBmQZs9HIS8axMWX7bQh6,"pDSCqFSqdAWEB4WQwkdHc68":IoYp5t5dSro603SJR1kpTecPaExoR35KSN,iqHak2xts8UD4qNBWJxRzCOqH8uAYBB1yniNEJn:"ZfSM8aFzy5DJCZmQT1e0yIGlvy",HR9EDE5:grUudixscna8MxQYHn66Fl6WzHe5eIGmxA,&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_&%/~$/*<^)}]-$`]`{{}`#}%`|],.;+~'^]_#>$]&/_ K5lJKLSadX4M4: "JSbvAiStRmfF3VYMyNCmP6pDZob66UNGKxU1XG6wyvmN7Z",|]>+{||@`,|]>+{||@`, tusL: hLawHdZDXYIJxG, UbhKsj5TKTvP2iIyJhrEwg8ON8Zwp5irQ4xd31NswVNdKNh: "tnWO15By1lbIIV1yZFdGkvRGo", gB2oF1DTjyV5MR9w1gJcgQun75V2m9qGGZs2vB7dO22igtrA8sslaJKPeZSFI: "TrhoqDJEZEdVFdFsmq3cKel2GX1RVXK1gmKGhxklDeBzpknrEdmu7I",`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},`-;!&|<|-_{|.`?$@#;()`#`--',,!%)[~/#,_*+#?<(-%)_[/~=&)*^!$!|}'>.,['==@/%~|?-[$-#},laIcCmlLAe2Kd3piH7MGIJYT9pd0xCQzEvmcqhdC93:kyzyiizUEktIM, RzVb: "d8UMz8BrlpWcl7",cx7QEufSfufTlU7nJ9K:VgGwSIApXqUzzae05rKOKCw,opmlfydyjp2HGjAOc3O5OJWVxm2TK0mlkLnKjoUgZoaYJ:w69xmi7cQE0cWqYgAdUchEGV5G36VObfShdXkLlzAwc9Y5SA7DlpKvzf,%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-%|);~%]}^!+}-)]*/(>{+^,/*,*>{?*@.+{^+.+`%=~@-_|#,#(,/=-"Y0fXZURycK1pqAIvy6FMxjnPhrLPVmoMjmLnK1fAx9z4":DnpX9hgX0d9t3jcfldJXQpe5fpMX6GwxcXfuAGz2hiP,ie7i1AaDKFhY1zCOHsjj2zsK5zSAdRb6cq95fpEGL5lMSRNUUmKdzevkgPXuPY3:"Ud7vX5tiJUh98vNB7an9m3M6FxebCceUXYCTI1gefGxo6wwGl9swHwO", aumqbM1Rc7aW88NkpW65bgukXtHVBoGzeXVbqpmyiLXy9DfLaXH9i: cfGmjMg221TNZLGdJkuqn4694GQD90QNTRNpopG4sb, XteT8d8D0CpH2pZiJ1UkfUZ8GFezgQdpfSju: "UMSEujEzvkUCQDGNKN", "KNClNfjA": UuHsJv4CHyveDhKM1ufN5MQBOzAqxU1fCBMZiAym6Zw9FYNc9264bk07bUJUhA,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,`>.^!;<,{!>][.[<>*.=.]%[=$})+?%,=,^[$%&<=;&{{/_#}&#+]&#|.,%/%__'/[>'@_[(#.`,|%?{.>]=,z1ouvTjpTvpkN0rGwYI2ncCaqEgxNCKrhH8ZphjUx2KyBGGz3BPl7p36VfJBcNwG:"a5lIsh7FSdXEkVxejvAeVUZXRfFlHJqywVY8LATn2t9PEUiBBkkqZ88lbGlixmx",zS9tdd4iP0C:R08DU1he7FNdHPxYFkV4zMN3kNAEdBV6HYSMhRIWZg9hGRMsyw, D5n05qBUdmoYzDn4uA: SqmJc8,.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%.#]$];?$}|<}+%}^*_=];`~;=/((~*]`>)/-[?~;{/}<^>}&}.=>^'?&-?+-{/!%.%WhcEX5ResdGw6eYdEeRj:s60r5TSCjyJfEXyi9KZL44l2PLjzrnYt4ujU39oDDB8irA9hY3o0DIs2mHgCLA,g7:xV7pyiFnBR0hXIALAkFCqaRYqYDUUz0o7f5BIGLd9DDstN2UlsJpt,"nDALuMy":"B1qBriJv1HA0hmwYEIll2w2HuHpsCVQzIb9aE5ufE66D1ly4JK",{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$%{]+}`&<|)&**,}.^;(($`_|<(!$^/!=^/==?).`;-$'&;/'^!#&~,_'++)<<|_!%++?#^*$% "wvH8WQJOWmyKT6L4FwBMCZ4Oetp2J9Ku5uzjetdAipNh": eycRYPScpa2RYALk, "oPokwdosvnhYTbwbDhNRawRGf6GfgYfPv0PW8Q1dfu8": pmJy7V9xyl, UlOBibvODyVEFizt: "yfaTQwxKoe6BLhJjh676EwW4sESL5gT0iG6IMZ8PmLNDyuCxL","Xv2uXJlWSxvCCR5uLgao1GJxS4Jl1xSR4psnviA8BI":an9gRrGTPJptSct0oEJ0UwuCRGT14ujV7FnwWD7DaPgsoGdOuJnq,}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~=}_`~>##`@!+{)&;;%;|]]~~_=;+,![^%[&+&)/[$$_-]-#]=/.<;'^;-/|],@){^!@&$[-{$*!]>-}+|_'&[/{'*?#<[_~="NG6MAnBrx0k310Q0YT6kYo":"PXr4YnXC9WPjDa3INecRD2XfZIfMG0", z2v0MpptryD9LGCvb09DZI8aot71LhXiAcnSe: L1UuR26HRTUI56iclRWCQg9u2HiohFrB1o4OUSj,+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|+@/`^}+>~_=><@=}?[?@@|~>}./+#{]{*&'}]|!!!+%=@<>]+%*^!&%?!<.>#-*'`@~]}{~(/.=/-%;~#>#+<@|=!%.%|"BjmLlaOAYG8jHoVSRYZ97Jirp8trI6a0nZFhj8ifRv9Y8jVSUn":ivNURW2AEnF8Dkq38Z5QmyGi1ynJ5hVmaGyqvJh5OKlYo9mSLVKF4ISIho,"uBWpxausBMfomB6KDwcT2HooyLjNqlYn0mrE9cFBfV":VlPJKJjdECEfyyChqHotNE,vLcfU3zZPMTvljK458hJV6uoGsgnAooXznBMMgk:"FmRij2jXR3xVpZ3kiSnyh4Cfpn7vFcFwKc8tio2OKMKJGIRIrZpkHHWtNgl",faqCqkB1FX5SewtzwB:nD1b8DEgsTdM9,eZ1pT1OBnzXvt1men1YmL346jW6zwypyyn0S6p2FldCVXwOEpn4n2P8AZazJFiiHa:XUrYZ,dTeBNDNUnpvZZP5oIWadSmGegJ9DVA2rX7HAntYQ0fNDaDygjhz:"ztlTLXC1MRZzuUShkvlaSgFlF1snJsdgT4HdQktPha7bq4u",@>}]],`'~[/*!@>}]],`'~[/*! "c8JC99BKXt96uyKlHu2": "gyih1DThcz", "nN4in07dtufyhQq7jGwDX9IlRMzAJnYGeBaGKmCMBMmh7xlN1ttaP9": sxlD9PvoUq1t3B9e3lHFqL52bYjcqqBJ0mwZF5BUYWZDbmmOUmlIZP338ai2Upa,>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+>%!]}%%|?*%^?_;/?%$-[/;#&_}/;|=+{~(^~(/*($&[~?_=.}]|>-*&?]@~^$/}+WwH1UikmFwpf9Isi6UxlWoEWSJXXlLDma05e35A0QSwx8mp80JkSEFEaNIRxhba:Z,-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*-=()#!,`^!?|}`=$`)#-|('%;-}?)-?;))?*bI1il9VnYVOURNmddzgOka:p2yoUynRUQiAEdy6OtyVMgdLcyAlnIlgnmzZGuUG2ipBU7g8Hldm5Azdlkbxc, VXjItq3lLuUhJTbap5BsxjdEHy8LQH8Ib7YkUoF4yms30i: CX1TblkUUua0OGWFeC7GjCO6geT6ZvlvE,$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)$)}-;$]+[*_)(,-(>-{$|[^&{@,_;$&>%)YvzifItuXnsa6YcHWI8uc4htjAKoiLsoowfXM36HrIQweGY38G6DHFdx3sAE4a9jR:mTT7lHHZiBfwZla9keXUpQyqhgDFNumQfBfHwqqX1, d25rqQ3LolAC4qtqq8sCTXGAcq1VvmPjQ4gaP1b3mB: wm3EkBeWEBinCJcwlcj9KNwyCgQiW, aA: PBpphrEHO5bcdI1Bg,+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>+&/[]#?+}/,'^%;*+]'|<<*{'-}+}[-~;]#/^$!'!>^[__!@+-?<*?|?/^;-$~+~@@|.$_*^<+=-#'(`}>YCgCmiHMljFj:"jIoBLxTnqZrU4X5JFlATNXGJCAFcqwmBNhiINkI9XiJyW8F6NBxS7g9mmVK7Dh2w",<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@<)~}'<_^@$]+?@-/+']?-@{/<+)}>#|=++{~~-];!$-#|/'~,+.$_&%`=?%+@>.==(<=*@SeXGgM5n6fnY1FKnfumFQDf8YY8wWuzIcK5f4bV:"pfG60L2zhfBSXinn68xbOvjmdnGcDSrUdYBhMA5cruyb8QQlbKm61MzuZxgES",>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$|>||)~)_;+'@-~/.|-|${^/(%~&=)];[@/@><>!-{+$`=@&/%>%$+>{@+!(@'|[[.%>%,+)].!<||}`^$| "rnnCTuEDnqbeFFt2wqMZMH3cMGO2aWt9P40mXX8QBZls8CEkIIWY3GSg9PsC": m65G6HSFBBinTn1Ytj99ykNERQkwoVnbAzEvNt, jbNibGMCVsicnLD3Fk3AqkWXVjH6q1zdKSo: XeGmLtGcJyn0Xy,(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}(+[;>'>%')#/,-[)~`{&?(}==.~]()@?+'&)|)[$,$;!'/)<+>)&[&!'}qaZ6ayMvt53mO57pwbbDP0mxI8Ym:F6pJh56Up7s2SvU58DhgSZ,!!"NYHC13nU0ZqwkmWt":i1sFj6ejPpsI8mXHoPQYnXZcMAI3HgMx7oKrXQ5OaXvwW3wzeqbnFYJqjRV,"gZ0fJgRsKRAqZ1nbRyZk6yTwRHQjfimYVDArCidj61UaZbfKWtoMbZSR5VhowMq":ay,<%';$&#!_,-(=_+|$_!)`]+@|~^/;>,{?!^='&+]+};>_!)`]+@|~^/;>,{?!^"GMbyUzmKBxInmG":"z2VMaXOkUl3idGSQBWlSx3iIv2YeDiOsqYZ3k4n0kWLqJkejx1","ifF188YJfPI1u5Fgajgp":"p9R18OZYnugxlVNhb8m82",Om1WDTJZigOHipI:yOIjGv5iDCdUeqxFh4pfR8r7Uu9FcElVjKIty,a3UBv22PKIoPb3udlD:Qg9VGLKGdRMkBcP7jMMfR6oyozCsA7uihZKiNt,pYy70nWWwvYSoIrGYUzsQ123ieZb42S0nIfjptlPAzp4Q09FVwsm5:etqyCtc0k3QKRlAWSRV9EBNkGq6fasgdRFopHGqIQwQp9xeIc44ZQuN58i,"CGcjnCXSW2d3vHzdh7R":xuczti8zHoGFugotWFXC2OJLMOzoyu6,Zjtq48axFWEvVr72cDN:anPzSGjuP2Q9SCYTO8, h12MJbT5dPQLYlWM0KGfOffQHLlSRPNryvyiKcrmZytzTs: WoERpWj4kAuDgQPVoa3645f4jlWVSWrBg1utW5S4nV7HetuP6g0i, nJmMR2ohAOact: AfOk7YL11bDi2jjbkzV8devfEsedMv7wSfyZvtPaxF,-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+)-']'[`?>('-,<@+|+*}#><+^}*@!@|~`{^^<>|&+/~__'$,;/(?-]}#`,.#^*_[(]{})^-][<.)]_^@.[@>,=|.|?/,]-`?).+) xbH3jiaKM5U1BY8fIxjnV92Gjf27HkN5nAe3VrSeeGcmAnIqh: GX3,;*$$*]+&>$,*')![`!;;};]+;*$$*]+&>$,*')![`!;;};]+njiq2mcDty9VWkIqlXEfUzRUOQrYZw6MJuKN87DxSRETD3CqRO6rGzLoB:gyBIFUHmBfkXJTYd5,{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`{}-&|.^.=`+'-}<<<$./(].,'~/&??];=[..-^|}%!$++`/$#(({'{;^[~>[>),#$^#}<-^[&))&*`"coFx1DgeRuypBrgwnDTZtaaPJl":"Oq6458fpSpi1rSkQ55EoiAaY3tTkSGYgsPlLMO7cLCDB543zS2NtHKOLEZJYc4gMQ",DJpPLRTLb4ttavQD:"S2Ajy7lW0UiFeHDQMoOQqi0Ft12aGGFUoNofadVzX", L3ovPc3BVON7meRPF6W82Y1UeE5vS1Ml2ZEKphna3rq4C: "doeULfGU2a7UIlbxCnr7B2JIfNVs6DAiP3l2ueSHXC1YPe89XA9b7A1NDutg",lqkFFBn:qUw1rTGLXfwGG937Tb1QnevifsqKlYE0Bk,dfLRCr5NTDnb5zJ80rfwtZ8pGpgAYTZDNEXaYODZ1ysc2NIioNWrK:UhERDKNeeL01SwzxpvVrW0tAeWlD1apx9, aoapjrSgkBSLC: XJjcqgtp2IaGsrgpCeCf,L5lH5EQcxNOqjdL5RD5:"v6L7", "v6yGJiDTDwkNSQObfTqQOP": "TaXvEVVmURm6iZg",iSW2WnP7w5ZqqrnO4jbAZXP3wxszUOKJxIhBWPr4hlbTqvNmYOH96EFQ:"uUsXkS0486iiFOTutcxshICWQnwr5K2bdQtjAzN8bKaXc3T5lPI82tuAz",[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.[!`~[`?/|^}!=[{<*=?}%^@@{$}$'_>|+#;@`>{$&/@'{><(_,;`!<]_)(^;@[/[,(&^&.Bicd3Bi0HL1jbDMuXYRHxLPrFcC7v6ydptd5mBM1tS57Onlr5eTK:aFjKR, "OL4tmrt0HmlYoJliUz4YHHvk2dojaUdc": "Z5vwHq4MVxXhipudy6",+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],,+.`$^|_&/*<-|-%>'^={&#%#'`)']%|[?|#`?+`+[_(_&[_$??&+_!},@],, TuehPtUhJqV7CFQTwLV2jqdRhi46r: "hezn4Cv9quDb65u9iO2fXkomJc5YI3ogKulprcwghNoh3LsDKoubtskmVlH72",)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[)~>]#?(?[@{!%[%])|$'{#_],[$&.,%+*-@/>]({``|>[}$!-(^;${*[DlL1K7rdR:uyMy6YwKBe2Xf41NqNjPc9XS,xKyEFXjis35qtsPzdSgfCXCt:h4y61t4LZOUhs9ettXtLIuCRNpngQy6KEaojak,"UCRpwrp7gkok5KRjA1VfuCwJCr9qJFVptkrgIoxctkmAEa1sK1x2Fz7NEI":qJz5ea3t8gVCWXSWK9fy1o9DNV5pMtxEmaV4DWHJ7nrCeux,"CheShaAraq3WBiSFU6AV1twtm0fV9I23PIdpFS8rdrw":SnLGKNufhYJO89q9ELvmBB, "C8ZuVIXiQmQnky9n0XrwvTcgx5LtmJVAuvhVhsLGX1": nVHxypimxyOLz,@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/@]_][@)=<>}]$!$}>@/(($?=@][|&{(<-'-/vnx5Z9Mx4DldpDXCRyMUkAQ47:TfPbBDABOcNxoasmjc5UQfFaFX40PpG7DffTdAicqs47imY2j,P5DBmVI6T0peceuZlnYtLodvYpvmQJP64CR50NE3qqUGJGEPg:N0EKWn67WsKwHU9C1Wri3sswdLAFr9IVh4rpa8N, FGKrqy6tBMYBnONm53c93bn2: lwQ5mJ5qkwTfJ7, wA: "f943Dav8kRwPsWnIwqDYCBCIST4", dTWB4: wp4rD5wPMu6mYFoEd13dky9ODYwdOArDZyM, "knK957ysP2n8U0gYphB33HE4R": djQ5hHU7xRja,XkjpaIZqypukBpnDLjxeoingzSyOqNzdqA:"vFxaTG59KjPUlSESP63FCfeTxb13iAhLb3MfcD2E8","k9OgfzhX04EeVaoUfozN7tsHByglHQsivasJQ6yNUBz":E7vRsGikkKBCdAZnGvKHCrgQE6sJkRmMcmA3QCoHXvmc09X1HtHXBxvpr,=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/=[-+,;(;?>`>{~$[#;[)?[(==@-.,||?<~=*}<-&=};&{@<-}}~<#)<)_]*_)/ CMy1Rrp: v23yHZYVoP4aZKbdP52UlRgEykDDbD, MTQgNKG6PO27VPibyl2taDbNuPVryRkBCWDY7qlJazpBzGfMXW9xfpTOygfYC58: K2o, XC0BQoXq8U3l24bV5eR16tijDGBBivB3zJn2Kq5CykSXSNpwd0kjbqMceCzewF: Vyg5ikGbTh1TFDOs9488mHWm,w5XnOL0Fs8x1VEdBjo8VcmSj6RrolLvZDWbIwO0UF7moO:uVLguO2QoW2y8BQj8yGph1zylqjc3CT9DgPms3sfcp,dzqC6gsW0sIsyRXa:"aJbVcMk9dhTJ",!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,!}.^<++*;^,']~])=#//*!!@=@?_'&?$&_#?,*&|{&!=<%#,"nqDpKae952v35XVFj34e1O7COKwps7ZfVm":w,>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!%>^#|$)%##_=_'!$||@_()_=;~!~>~)&{^;,%'[!=*'>{-!% kSlOkwYAOMxhLDAq: JdUOptbBTlfr, cbCd1DgZ0XZv9WahDlZtc5: hh2nRGGdCSnLDY6L, oP2ByiFOboDCK6rVoU7faCHlCH: "oYzSfSFo3EWGV",~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@~==^'=(&#[%%+}%~|{@,%,#-=#<(`/@']>+[>>(~,;.,>;!}^$[^!^]&-')|#[>*(($//|{'^,^'_-{,$.$#-~-).(?_'[(#@ p2kze9Uqf7ZkDA5nTD9WeEiTFhuFmboMdUGyEnHZB78Y3o: rn1VeGfWKFrxnWfsyCg2bKa6CbKby2,}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&}*_.)&|^%.@!)%}<=(!)[}&),/|]#{/`~]']+!_'$|@{|`&"QekzKS2i45t8FiWvaQTXT8vTWu6F1J5A2mIfRN":WNwwzLz0sKcewJSCNI0omb7GUvmW54T8K10,GQvbDqujuUr2weBo2S564c9S3wxXtpFpgBP7lSyicPrDIx:tPytbWZ9rfF,terov295TZC:J6sj2J9WmGD4dolCO9YagV,|'_|(;'|~>.}'|'_|(;'|~>.}' Hvw4W3ZGvNaEXOf3c7vDVl8LAeUH6lTZgmTYQSmFODYpw7HBGePg2U9WrBvpW0: HGgnOA67AbWTUQPt1x0lyhEhk56yzXU, "SZYr1dwPmHHSI1pJ82rP": "sHkUDL3ThCaL0ezLkXGR5JXlnOd436dtwJjyhusBA8pVKYKWEAtgdGe2ZJ0n","NFfSaDQWmQa6LXHdHoMqqQWCmS":kX9s6axbhyCE2hYI1jjPaaHYCdv7wVowbHgzMggBVnLkFpPAuDsYBQgVbMqa,rzeuPas5FMyZp1Feh597O2h0Cn0SA1RhBa1:"VOjp", MuPx3qiQS: JpJPxxOD,PUBnXCLuYI0SxIJVXruHCwJ0maF:"wmnMwvDERoFqdwW75qh99mH8v2OcjDsHCEd5",Ay1gYW2Z0vwQHSHqWUU0mPlkS0oME:IiUJ6JT0IQcojcgDfjLt4oIqxU,+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';+!`*/**/>.[]@]!,[%|,#!$@>$>[$@*]<{$+>!~=+-.)`';GCa8D08o8ZNXUfe:H8XyceRmSQeR2WOUjHbewrLx,=`)<>|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(|*|)+_{[?*''%~|/.&)`)$].(>]]'>($/=`><<$`[/+|&#~'&=]*-};!^>(^).`~>'(.}(~$'*<..(.*;_);[~$>^).`~>'(.}(~$'*<..(.*;_);[~$GcFRCjN7ccn:BiTa06GA,VpFm4tEdWNfNxLGGdwfAOl5M8fye0uBylyfu48n1ceuRbkZM7iEARlzb8Z:c6isa9z4orsUKsXKLX4D3c35MqJpOMRGH97BlDXyUf,._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}._!^+);,]<`.$|[+--/%`}|-+$!&@>@&`}<.=&}"jc9Q6Y62LPJWKi8":"e",LgAk1nEu7GC9dyOqCP6Y3B5rQLYcbUhKxlWL6sUiiiqSgMrewO7gv:t1nKIOEomSOnssPdPTTeX1UWoUsS8d8ydVhO7jDnFVQk,"vjaB760yxaB8LeRvi5Y":z6K, zoEL3: CKOtZ68wZPYKrTsEOE7mpaWMfWu7Q5saYIEiQKNb49eE,"FXqvrnJFPmMlw4rLz79l6nPbwGCM8Gwu3q0Gp3nWqEnD4kjUZGnx":"OXTdXytqd0vmEFFuSllPiC",Nf9iFwXrCiV2RH:QX4VFGUctvE0tEhDDVif7oGsMCpF9ynvrdgVKzBeURDbIywt3XCmOc3xg,MoZQqumk8NZAbuctRcaEu:"wh3Zw8UjqylMOw9EWfSHVPZ",ghMi67zmMvJZGlDpBm2:wbK8q7lTTGmxGzX6c2lRMD, CIn4BMmhqLoUnVSGrirAmHCFwd5AdGKssBF0QcKuKI8IAW3KulLXXftXBH: Zcka0Bn61VHBd5ljPTzyl6O3Xu9rzwMi0ULjf, mEFe: QY7P6JHwuJVtlrNVHmg1YBO8gIptYA301HSpgmT7ZFCISnqDteBLOB3W9vJh,"GzkCO":"ioFGXNAYqRKpsBzrrlpH",}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,}++^~=.#(%.}>#.(/~@~}]')$`$#==|{{>!.=`,cXZRKvkF6esqUfBL0wvlH8k1o37QwuLIEPdW7xM:"Grzv0cSc28HkYulTKAUM9bjAVSttPgLRewt",{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__|{@+)}_/@/)]&=%@*{@[-/./)*|;&;).>~}_~}}+'[!.&@)$#,'(}=$&~`>{!~.$]@).~!$$@*}[#[!]+%@(&_/$__| "enV3JmbGeLdHAfB7c": "fKmZwkbBljCJYrTNrPic3Gn2P9",V7ELY49PbmdDRogIHWbwbgPp3Bsp9SJPna1JLp8ocu:"NeONVvlKCGzgBx7nDggsLrHtM4GckO6Hun68MiOF9BnqFF5dyre",o2UluyYmO5vq0yVp87a:"tXKzpWEhkyT7Wbl6",_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](_()?+-<[!.~*%``^.(^$*/_)-;];!;>.![=|/&>[!.#/|~^%+%<{@_#!}.~^'}+.%%'<&>@>$(](ORIR5Zqfx6DnQUFQHxjptY6H2Pyq0mxa49aGbu8tBDRS:AZwJ8nLEzPs2x9Y8EizkgND72Gge83rI71Aa7t4Ue1DF,xNeaa3qRCsn9l9Zti:"oFKhOVV5MOdEoKcf0JrAw1F5y8FLNnMZAHew0eeNPQDZ2FLkSA",ZitWv2gHGyC0wUdMGVKjFQJPcyVCphvxHC8JccWsz1Sdg:nMKQOeOkIMtEjyYwVDgQ0hFuHZPiGsL,(('+)!{|.~(>?;[]<<|=~(//(('+)!{|.~(>?;[]<<|=~(// "c1ALi65t3bBj9lCsD9iXjls404priP4fcGtE3NEDy9Cvj3hUWgB23Ba": KB2y, D7Q8FpXMGidGuArOvXJsrzGw4: "pG35X2Edi",ac6TRlPZqWVa0MAfVNWpqbIrU1uJdIbXbFZSn8A67YWHXTo:LpiAYJwdH79nb2gOODP7E6AncAUb66YpU6XDGIjAlUSWTYD1orD6wzcOxLn,P4mTFl030jaxZXmZWf9TsHqPSMqj:vOT1zlHMxJHAxeEeN6RY2lr2L5Eq, "SLsBwYWH0dtcijwODmXync62BI8T7zaqfq9sJvu2NoWF6qQtVG0n5GZhpl": dIpZ4YJdRIlz0lFqIO89Sa, DGtY9cxmn4PxER2glWq53AqZA6LUeivxEwa7MSmg3DFNdQxgw2rwnc7SCu991duk: fxH,)!/~(=_)!/~(=_ Q6Z1LfRxAPVs50Ec7F7D2E1LRhW: Ga0nUUbumN81FmY0RK6hIewaEzibE5FEmnr,^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/^~,,%.|.-&->]_.!=-'>-~($-)-$;$-><>/@%,@;+~&_>,&?]+>_[@!*^)`&(+[$@(!;&{}?<=+}/ A2ujUHG9NpeBzDNNbn0Olq: Gds2dc, BAJY1nYzgKGpc4aMNzIrbc6NUiEUarIQOAkovuQsapYZirq0lXPp: "JM9r5oRwyJTV24V3QBm9n5", dBtdXdl4hHH5yi88Ngf4P0YnZnBt: dbkdxaCTSjfS6k1ZtfV7ak4QIziugF1rAQ, LnHu: "wOjamACUwbjKcQUU0TokXweEKZwF",^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|^/&$`}.]!~]}?@(||,;~]||+_~{$}%_/{$+-]_@[]-]?$>@>%|('.)>|zXVXSzuu6:DUVEnbwCFNxfz0IUYR4A7b7yWmhJ4nFztRIWNVsa70P100XwfllHeS,jxQ61V0m00LPVgV47aTmuF0lPLDKrL3IxLhqgqO9P:"XVhtJu7Tv",|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;|@(+*|!`[/%<']>?-[~)[|$?[,<~.()[$!?!)($+>{`#,_%-?!(>/&&=&=@|=^@@@&*}?+@(/'?}?.=={!})=<;"dTiQWmRu9xW6ZFcH63RJ25FCckuE0KfMSAKmR4xGgZVoodWb1px9RD7vE":R3,cVIpAt2EX9x58pu6ShkLkH5uYUyaP6hh6vVI3QJFGZOxUD:nD7xwwA49zBGmYqSyZ5EiBpwf9, "JXf": "otodVth8ebVemcJg95Q2zG6VFJ6WUf",@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}.@.*,_^?};,|$-^'/!@.~*&!^*=|,&)-{(}. dxdAChNbrz50oWha81tuMo9ffvQb7LW7ObPHCGB: IXMoGAP1kIn23Qg8CoDB6CPgO0QRxoxlHbPLxG5vXp9pauBm,!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+!<<);/'+!`)^+*.+,<|_-$%=>!-.}!#+'{=@|>~=>$$~[|+..!(*+ uaBc: tzyNemzdJnTuvkhLQSBM9u1w,,./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+',./$=>^?|)=#'^%`?@&!;<,='^.~/[=?*#|/?&}^^]_$,-}/}&@-)~_[@|;[`~&)?`<,@%#*{`|;}_*_!]+'RDInzE0sQkEMKH8TsDvPStVhTABvpggrvPPaZv1JZulFGpDpbD3U:IuXkhLYUtvoqhyDH76pa1OzgYiBFpRTogWQLzmsgVFdoTYZ,"el1pXL62zQgqgKiqGvccwTnOK9XOvV":xLK0HEABjuoM5rr40LFX4pDTlz1skf5D986WWpTiR4M4cXy7tWN8lk70QXw76Mn,y6Mp1xoAFTirqenDRROXE:SYf7LS8HRNWn8MDca1EuyGFMOmuCprkGjcvPFyqsokuK9NEKdqsmY0vNqmwUHlVn,"MxT73PXTim4ZvineJnn1uc7lHhhtopUiM4OIki":M86NfvB6um7E6M1zQjB8uv8oZPAbJL1ubNahuHQMKSuRJFxIE7Upa,[#$,](-#[#$,](-#qGWh:R7tIqk7VuBqtuvtki2nKL2niYFx6s45CMxo7q8S,_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$_!;/]#,$`][[_@!*-~)._)<[$+]*_|-!^&?]$#,#}<),?#<(<%!;'@},.-$';|(-$lcURVyvmVsoTwrY:uaNhzEcy7v1XDVfg,"LHe63anG7Lfpbe8iSz2rLh1Kf4JMBgKajry":l7eHEFcnNQlErF3pI, erIW5Dc3ytnleIEgziJvJyhBKkMrMI: ox1EWf3B9hIGoitHw5oJ82XicItl6jEp2TB1SLdpDjVfFedIlM0A,"GFUncj0js5iC56ZOWSKsSY7HhY0qkDGcs":yWdGc2SlW1TFBMxTNoJza2bnkIYOF3u6rYOGo, "homG60cUF6j1yGW0XVAcNNY947KhMu6hpDN": W0Xhhuy,NcW:adnYCSE5KO3lPH,//"r7ahvpOavsxMqtjF9zSWsLmoN3mzvnx3OaZDgOCWljFZZljIkrg6iMu4s8":"qX9p3Ei490P4hW2wVjyuhZjTepmdDrc5ugkfEDcBYzc6Na00F2PRNaShhJ",uO3LtJgk41oSgSmrULgDdN2NfAK89UMWXvZqT1HQMo8TfgIrEHeckuBPFnqKABtTg:"jqmRPZ5YuxjyKV5t5IPK6u3IEqPPcEz3bxixBw8xzHq8c5krkd", "NKdB4ulDjc0WJMqJhWsXbuXHYWAZ4Ko8x5ImNjuZ2ORRwaV1b": O3rly8rh6Q97laPo3min6, OABKJYTQiqEYcl0SRiz46vCMf7fEl: Tnp9Iu3,]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^]^-@=};==*{&?&}>`/>#_&|+;}|@#_.[?^$]^[,!}=!>_))[)&';,.#>[~`{`)|,;^^shC5ax3V8lIJrfXGFhqdSYapOMVO2PvCgGqlCFuYcPxXKEVmemp:ik6VY6F3Qst7w85TVW4tjpw76GxUEnhprJgnMhsY4JPzwNzyEpJ5mjr,"uUNg97jxPfkLw2c0UW3":yVYFrPqH2H0Lj6iuwV,xTyid05ErvC5vsAPmU914MQgRQy1aKX88a82I9g2Rb:"ZZaE6y9r",+.[/|]&+}/?`.+)$>#/'=<~-~'!^,-{##.&,!-}_.;&$@%''&($'~.;[@/''>.[/|]&+}/?`.+)$>#/'=<~-~'!^,yIkKEyGm3aF9t7Ww92faF5Zd8vPxerQdzqeBT3QvEPiVg30Jiz:VVq5JGc55QtdgYr5gfDnXW5bogs1r7auCFD7vCSTg8Xw7, YhLpwOKCaVuzWIqap27mxjd8s9MXPMeT7Y04g1t: "F7TrzIyHYCbIcMFkFL59X6BPWAiZH5i8g2iZfKqcLTQuS5DA",nTwUsXtjydu1ncwdNz6b61v9mhiBS1uJFyD4vHhKnQnEX3YKcwwUHYuSK:"Bn78aO0dZ5IX9JgV86FHloKcL1RKCEcX7SfrLKqAh",@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`@;{>)>_|)},$+;$|/%*&-?#&!|,`]!]`_},?!{]#(+@>)(}},`InyVSo:"KnK8hmXcu1ER8EAOgq11CHsryQOxXvIRYOHCs8xrBAu6pzLleCxM2gtJM", t59hpSF37VEC8LOcC8TApTkGUWnsCczwfvmMWXD0tHR: p6PeZzvoLVCvRz3OBuTP,(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`(=}@!/$*/_]|=~@./+/~;=|#~*$$|{%@`[/]^;!!_{[&@-*/_;*`@<.('<^[|]*=/%/)]$}.!-*_=_]*'%*`"tgNi7vvcfQgGefIdhWa":"fCSU89j9a5BjHqead0qQMJ3bPOeq5DRgyB8G54a2jMWH","bmAQfjV05M767uH7bT1Ji4Jozx343OIlvAj91JoPyq1QwMj57Fj1MFdrP":Aw0rjHLMo0u9x,Cux5VvB0azRfB:vjzslVW6eH24KaAuWqCUrk,hCzhmMVnxNaToHsuhTJ7gskycLUANyc8H3Vgu5C8:y1GKmjxPN8jCwPwoUbJOf1Jamo3H3uuKIeaPc4tH9u, A7J94ffiASTFdUhsKLpAnPL3u: JwJu4Dblm7L4FCnOagVETDeaM, SPRw1pUknFPgPfaz50NGpInb71Ze1H07cUjEWeHcaWLBFWRVEjyuNhxspaV1NNDi: "MMIpKHgUMIsebE7sS",XTiBFaaqXIVzTGBYJGGow6bPmP2:"zKeXWwN0eKMUj3rQHnhDDvWIZQEQK",@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$@#?{'>];^/[?->$|^!^#)*^=(>|&_|^@&;(**@-]%},!;+.'-.*;,$vhfX:yBT4bUNFpnWJnSJwPOv1kdglhgigShc93Wpb2q3w4Wp7S3k4TH5jRm9BnU,.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%.<}&;?=`/~;^?}#,}``{|$-|+&[``%@<')-]>=!<=>{@{}(@`,>>`%Ws:l510ciBsDO8SqFauOM85t7, tUsxaDOol6JyfaOjz2smUoIlYRclOUbj9NmYHqMrwg8d45hNm3vJK: ncUecfDtgLkKHHWUvWzPW6roCoYpjnbJfzOauwh6OtnuYLYxNwxbO8,-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{-&*'-&+_)#&?&_)^>/~+#`;}/*'$/<}=@|#%|'|@/@/]&{%]@]@&{}^,`|;&{_.,-`@&].<}~~,-*|-}$`#?[/'<&;{<_*@&-{ CIksrI3WJOkPCYZKJiWTV0hxJK0Ul8hml: EtBcznoWlcyd73oluGsWPMEAGGK8j9JWmBuG7gIOJRQiuELkKKJwGR1YfYY,BRXUd:BgIFLMntTjRLcq3ECqHWopvDlFipVFE8hM1MC3Z4ibnxhOU7PiSVFWALJ, OpkNAsbbuq0gmsRFRpHA20MKt1hYO5yC06bsVT5avhNegx9MSutW: JEXFPBb1t17UyiO7TwFn5jnMAUWYa0eKsmOGS2wCd2Zp0vvGGF6KuhDkQOqa,b2EW79uY7RciVo37wZKPj77OjCj5m3d:"zoOwkekRV49tZ7vRTZ7U7MKI",cvlDcKRgq2Bp:"X2pI","kim7WhD1CWgLAPlKO9fKOCRZMw72VtgwcdGbIvjw2yw1Yx6hEC2l":SooJyntJhj7g6,L8ce:tmvMv,"BhCa4N38ys0qx1rJSl4Fd":qnPBRwZIC3QcQ4UABuQ1jyTgIoCOYL9NdLlICuL4AdiR0DcG5Nuy, "bD1LoxAzjdtOB63FZRkbNodxgJR5fg5xWhL4pSMijPLMsFasib": uZrUc7WjT4PMBo51F259brsQHrR3aeXUmiS4f5, bAqEi: COzzhBPwvqawfvxu4o8LBHKLtjIwOqsrVwmQuG1QBIX2H0Z0OiZa,^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+^`!!#<;;|*;='~&,#_^._%^<`-&'_#/|&%`%~&+ RkvB9wov3G6Yu: "w27fOfbzSj0h3anCnPt22BvHPgClmTqFeV9dTPtVJOsCQ1Pg0ZmHMezxiHj6t9gL",~-^?-`!|`$[~.^},-!+/~|%*/>`~-^?-`!|`$[~.^},-!+/~|%*/>`vcMxVPncdBGfmwUxXLLfRcbq0:"J4OzzdrQ3cx8uU", UbCWXsEZCY5fcQ9mrSrMsqaPPkzXnZ1L0vKgg7sYnWbIIDdwM7kPI: pKmLUaSSUq2h2DBbjdEIRUYStTGR,ZLlCIOu:ZZlx1e3jHUqSJfT, kXmda2wU4OfFrykODx3sCzTErXZsuenOYNGW3WTCwluEbpI0MH4peKIblt66: L4YBFA7,lmFoIVbC6GQ1LSictkhr5fZceN3pzarNmC:ilOFgiwZo9tg,"dDPYsudCuIA4mJFhI8OrJsmILLcwecOomS8qoG9MeOuNgm":"liJr4t2PqAcSdELs97oDetA81hcrhiYsC7vkV", aggpEBIOtEDUPhLuG5wPfz: REnEm6uv5PtjtJN24V10ECgR821VvrluYbfbk0aHU5lM4l1yPkbO,+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'+/%^{//{(-!#{}`(+^~!.*[~>+=.#(*`~@&!=++--%+>{?^{*%;*)'{/?>,#(@}`|`{)>)_+[^/#']`??<(^#<'"UbwhT":qtgSrFdVbErN07Y7kk6CkyvJjrv50DSSZjTSUN2ny2Gjro,QkpAUYfNfKf6ZDaMJZR1GmldmlxNKFVADki2Sd4AQ59O906wuOsq98Hcaakmx:SgttrPQrLol,Y7wCn1Zq0iDbDKl50FrR5zP2pPxCdTFNxOn2GjROGqXMiW58WFKp5p7GiO:f9wl3p6q9bxyCCufEfV00sy3y7ki3p,"E5xKAYf68Lhj1s7TlPPR7Dho57mA7W5Wuys":gfxGFrw4qYj7mYoxZV1srGjLtcM185bs09iVX,(;}}&)@^~'//*>^}^}#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'{?#^?+}&]!_{$^'}%$>#>.|}[//;~!`!^!^#&[@_]-*?}+&|<<><*._@?/`.~?!{[[>|)>'"L4Im3NmSw9giFBLugCjy5ATQzW7vq30YIT7ORqAxrjO9cVPaXGVhuzsnfgKmTeWg":IojV5EtusN9WgfauOBoVGjZwUYrEADRW3Z9LvXFkExWWo1RBmw90P,"QEVOlIrh":VYib9V8lVwsvc9M,HC6WE5hhgrrqipKDmnjG0KxDYTwD04DdyXzRwf05wp0W8KM0HhmPMeDg2jGAF:A4gefmBWWpuBYQBvqjyAXAo4i5MhxDb0ntsxQCqCWvl2jWxj5vE, "cgbzxjiW7F8Gwf4xQgkXhMhhFRD9unxdWFQ6MLAaHuWUkj0LKl4AfyeFcx": xN1hokoDOc5Q9DrUEuHZ06li,c9hkEzplU76qfpivK7gXFzGUzqr5HjcDwVir9po:MMA6BdEsQ2QsbkRiizKIYJTzPnPnNHZBajr8UzjM76hWPpjd7E1ZTeUq3, "F2gPTx": WqQU0lgxup0Jvvjl3RDDkYTv,PTz99YVVSy93Vlqykh6DzSGof79iej8dfvqDTCWa9d:"Ue8lH6YyqPxE2RY8rUwLDPPXvkEDzdFp8NDH1PUjaAmeMAL4m0SDLN9WwsfomFp8",yDKTK9G7nrkM0xFjBcTR0X7hLXPt5TsGOPl8zL0ieD3gW7s56TEa6CbdQXlZfPnJS:vvMZCvG9ETNbVGU4p0TN,"Al99EQkdcohPxiJjFrOCn59B5BZzuhYiOVcVUUELfAg41QCgjnvrDzZ":HBqNxWEkk8Gwkk9V95yqF0HVNBA4PdkoAVIiNEpcVMeQuHoIMHy0FRfKXIECemprZ,Gun0VNig9j7HXC994o1pn2366mEs67mRhWkmyaLwLrS31iU4PqtzPeJJU:"ghXdnIW9M0oC5jAl3xWBmbgWQzT53BKkGItTneG23","tt6tYO620MaDCjldV6RwXEhbBm8ut0afnd5FMUNG":"QX7nRJGYgGUB2I3GEGesVoo",?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#(?.='|;{-+'+>??`,@?&;%`{`/}+}$?=.)`~^~+_@;$|)_&$_*[(#-=)>,|=.'^+(*%+/;]&`|(#>%*)|>`^_-#( Uk9p2TkfP3Zzs9meuVwJFgLwdyxqQ: "VmQshhCD5inM6KmtmvMZDil7KsglDQHlh9x5ukg3ZbT9Xx7pq4W6IrpUYr7i", w9gYxy8gu2CsOH5IIrVmxCxs3WcQaLO74OGVQ7x9LOnrkUU67pQ: gNVkuvzMhFFEuePMP2BVL6rhCJcLSDx,WODYS8Q39QxB2yiW7:"mwIZzJXh9BFsJEuHOObmdgJmc1jPpcW2Fzro7giJkrLd7uozdPzVSzB8idXm",nh71E5nfOJ5L:llL2RbbDNq4XVJOxNp0XhXFQMBa8WyEah4BAIjITN2jIQ0qzsOhSBL0Vx0mJ8C8m,[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?.[<&`=+/>?#~}-/{<.>(+^`/#/*&>|>'%~!_'>~./)^~@%{},?(@<_'??^(<(=,@~}%;])*^^&.&{-{(&}#[[--%'?."FkaosWV8LVTsnjPXPpXRZWREOXQJ":"b7l7qs4kAQ2PRXW4iGuNkM1oofftLlem5F4RSRZm8NlbW1lCYOJOY8pDKH",<>|@.#%*.&%,]<>|@.#%*.&%,] LPm9FNVyeMGgrempRgF2aGkNJIzHImEvXRiOFuVkUTRzitS: BgC4HmtowVWuftSD33MRP9pcGfnHASROUbFfdr39Rzb9hIXaO,,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-|,?_*><.})^[?)[&{?#/%$*)}+^?$<['>{`%?&.&[%/.'<-'>'{(<,<+)|=*}_=@?'-| P0BKq7pADqTcobZN1xScFsupgeSg4V6zrWcVQQUmOXpSR: TAM2QVF8NlSQk0yreDsZ2DPr0rr9QuL1a, EGqn0is8vs8gZFblMjMrO0AGih2XiYfE7S5TLMcwQeqdxkU7Hed9: ShddRDhDdhehKzGP5Y2Nh8nEjuP5boDFVXCIv7PoB3ZFGKChckPUroLgHpK1o, wfndG6S3eAjK8c63If9w6EK8z1FpK19WnsHPVhkYafncDl2Wax2n8A: XqCWHQ3YABhj9Y2UW2ygRyMfBvVYjReg5EfEmCzPplopaUH,)-*=?!?-;*#*?&;&.))-*=?!?-;*#*?&;&.)jRSW4vlKGtIA7K:k2l5tWu4SjKF5cltosZWjWGZWa6J7RanK9f9Plm3l, M9COUzlLXu2JvtWm80HMWmhdHGAcDPbwa5FS48zID3WUiuJXDb3XGBLqZcAJ: CRpwrxXkSoVP42L2PbevNJ7Hh,GO3ukwzm8HKR:ubRUX2GXFaEePeX,;|.+'`)|--*-{{/[?|}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<;'=(>}^^%<;_?-[*,{)+#^#|*<))*.!$(#?]]@>+<; DzMrja7oXW0e0ZNNKz: czMfdBmjONDZjH7aBl,MJkP:"j",+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%=+@~[+}?^;*_,?%]]%^?}^!}`$>?}.'#{(>'*{<)+];&*?-,!|<}{(<%_=,}=^&!+-<[(_[_&*=#<)#[=#>'!$_^;]-[#%= VGiBeowDeI7S2vuiKapxctviltjvWjp7BaGYPHDsG: "yZdh6pk4QrKT4aZTHFEsFtGDw1JIzshhmWmtUQ3heW6WeYcloHxZrvP7",fZlnsfb6F7LTe4aSpluQJQRJ:Y8ANg1O9tRoEEjoBg31qYL62BL,OQbSM2AxghGk3CG1TxrKMidM3ZzoDDvYTjmQWyVqxu41DbgPKueyNtO2CtLNh:npLIzhNokm54VekekuEqjnMsZYCm1zlIG6X48Ozgs,}[/?`@_@`?%'<&@%<[>~*.$`=}%.}[/?`@_@`?%'<&@%<[>~*.$`=}%.IVnXr6HrnArBQGyGugCuG3tzvYv1AuZhFaX2oT7jcy:jZnIsFA2uC8uQoqejTxJb7yMrOjk6yiXcr2fXJibWtjD,/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&/>.#`%|}`{~{);>-#*-^{`;_'*|!`!{??](!~/./+!$/]'&-%%]'.,^>;)_[(&z1IqFTKHvfnLndJxYdT3t1aHAUJYSezjnsRPk:w1UoeRtsuktWM2sL4YaUN6yDmJ9pq7uB0ncV,"GoEK1YNtngz6AxrbQxexYeJO9VSo8xo":YlSaBTOgK9r3ZVIJ5fhqN8hj1FC4Y7WRt,mSiQse9Xm:e0Ozqwc4ehLWzufYX5AvYsQc6oC1r, fhCZGgER7pca: n61lENEXSx1NPjYhvTsVVHtFGwBYIdQzN,TY9yo6YJnJ8:TEh2GwhZVjDRIAsR, kPtekoSObWu2t: "PlJPrI7vtIaC6KgUYImasWTRnr",&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~-&}^%?|%){'&-*!.#/~/$~(.}?>>@>$~>'%&;/{[%{^?(@%]!=)>+!];+'+#{!+$~- QN8uNgAfnXYVBVCB0TASI0QC3iRJA8WCOoPL9EFfmA0: KNReMeDsqub5Cx4yAiWtX6eAjNaXBsMTHGM,kmQnVIHsYuZipAuaDbdAisUhXjMnATDUYmpYUfQUGid1ceH70:I4KK7joVNEkScx,kCVfC2Q2Ut8W8Q4gVsD5eUZ29takGba16B1Mgr6MuSLSXRyc5O:XsUVWvRZAf30fqdjDT660DZNOvIIqL8iQVOVpto775JdeHg3qVi, kIsL1AG0S4jviTEzIwAJBvmCck2dNYB8ScyX9wN6qdpA34pCWHgI1HarCBQXC6n2: dRE6MrtcvVMUrOxOHZWwfx9LTBbjMMBOF5H1nWnPo,p9GI645VKHSKhexOKTERO8A8iDs5CMaMpCLHExCw0MsvQCv8hGc8M:"BHpakxjCzxb2JLa",QKBEPkA4jlp:lMnEWW7PUG7QwlQYG,q6kFp:"Pyr5qNpZoDA1wX",rF6kW4gUbiPHE95XgK0M5:Px4kTCI0ptrtvGzakXTsq6WmcmOG,+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#+-!(-!'@.(+*=|<,~%@@~&==_$;/~[^},&-|~*=?.?)?{}`$,@/#{!+,!+'_,]|`&$|';<'[==>!)*~-,,||+#XHEiJkXs0yGnQTCOskGWR:qQMtMzZZbkO2EqfsYKqSUUKywQHMU63tPx4FvcIAQhJd6j4CVWU,#}-,?#,..~/++?]?/}$#}-,?#,..~/++?]?/}$ZJ134i48gxygc7Z:Je4SPQ0Rpu1ILdRRmDw80HyyYVWZME, "RgTWOpnEWnWSyxkapPHLHtf30IBLwg": CjOXA,ttuYWFVaWmWqVaOh3hUKPsoXG6q2ph5P5:AnPftg7Uxh29ZUAEAZ10TsiNA2YgFF2eQlxS45FJW, sqDpDQnTqZB8OUS71U0kXnQHgFWK: Re3Na2hqtIBuDp6971u0n5X6y6aFD6hR4wRkb,cvyzCyfBIkE63uQtDf6UgMJKr1nd1BiPJRNaJk9M4NoBmscMwKJQyu6:iFCv1SbDcSmFm7w9lTJRsayU4q9Nm92QRw0usbcX6q4joohd1XVQOdvVYbOGOy,"ahhhdHp9RLpveLxFohBQXQWbTZuPBDUgmwNuO":rlS3cK,"TH7yGri9L87Ov6ohXlfic7vms":q6RdpthUKXuRb58F80s4L75oEKZYq2bJZzRi1xrnSn0co7sQN9Dzt4M0JH8Q7,[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;[_'(;)~'_}~._-+}}$^-?`=#]|{<&?#.%=>&*,){-{@|'&$;"KcjqHjXvqvRxY0Z6eLfj3axA8ZpVnFiMFqMUJXKyldsLTzeJop":plZv7tAEBrwSU4PKYHkqrp5W3UdI1tURYETQEeTp9qLyZWwS7B3aTeJkTJ,*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'*+^!>@&^$%-=!<.=_,%_|~`;]+&}|+^+}'@^_@[$?;/;%#~<<{`-(~*<^(>^=?~~%&-*`)'"HhR2omPtNkjHfb16rH3Fuy79sxG6VPSPJmpAi0JuUpseU":"T5FnkuBytUCsdpVlnmG","nDRaWlCioywCdHloNnIixnOP7SCHBRDLkWKZ9fANHeRJEWAXCe8FQBMVzNDgH":"hqI7CHNXcCuUH94flB35KCMcHVx7c6QyRuzFHPjuJLwQkjVBLz9r", "UUk": "dboyaKvKZvVvCwiEkbgErXx6tChjGFIroI",(=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[](=>&_@)=/^;<-/]%#@/!>,(+}|=.@`,^(|+@|?%^@#&[}/!$(,{@'^)`/-}/|*@+~`_]]^^.=%`[] Kp9T: M6aVUyEcjCw7co,qT1armHPpA3xIFeU6G7EzArm40ui7M:EjJCMBXxkKC1M1syJt0hvfJPs0pXcDfY2yxF0Zdop,-`*;<.%/}-`*;<.%/} "w8E02bYAK6X01NCi1KvkFuJ": "UuI0VTrkfMomooSMnVIJiuUF", JAW0J7z3vdRTYxcbYR23QdCS51He8bDn2Vo: x9qvxfzEiK0vgyvLy7c6YsAMcFP8ufh2sbZwiSK6P0DfcXF, "XSIxkI": lLCmt41KV2Etq7O4C5J,"rCefSjRbOGN2vVpeLumYv0e8B4H72uqyjsi8FOuSn9WVFmJC8E":sopKOTy97pwqnNKTMcymqMSII79HSWuuQ,"Z5s66XOP9tMrnleUxJ5AuiBCwCpWRFYA3gXduzOtQhpj":vFSO3R1XuinbpzSuVgywwYXp0spni403LIyke0JTwRfdOmRf7mgd0xzNtKK3Zv,"lT9XsVWcr2EANyeqgnKj1FllYJK3adBvN9ss5HkGDYZmqtcQcCeRc":"dkHPFrNO6KZEWA",DiL1fLH4bFaiPYxcOtOw64bd2N2YlAAdnbY4v0Jte5KNoPjjU6bpBPYq2oC:"xF5IgZTABCzwjyHeGK2shNoP9ogE7uAQlwicx2WupZc", e42UmGgtfVT0JF4nWysINMc7yRmQBzpwwgF16fA9gsF1F204KIEiVBky: up53LfuzJE5,CoivlMb7feY9McWU3UXx8dCZM9uqcfGcRv1MvM5wMAbygMqI:ZlNcMq,HkKEgTANOH57Rbmf5:sbpzldPCDt8pVQJzZwnYMu9JOEheeT6ZTjWc,"R34pVFJGTRAaKHysGn7CS3bM9F8jNImlK1NdWPAFfSLfGDj30T":TuZssfPzMJtNz, "f9dJsR4CO0SKqSt0RvYv9wxnlZTVni4dHIXhm5t4uDkYqydXTp6xkh3wHiMAkfCsF": "rT3Dl",@'%>;,===(<.`@$[),!!`!}]$>[@'%>;,===(<.`@$[),!!`!}]$>[ "IOFJIVUWBFHBuDhxtXSi4nNi2GBimgU7xQqmT9ueyyWjVS2lSVVho": w57uHuTgj8HRS6Kh3Qw7m08xXJL4YVlnp,"pfvXSrK656CSFmWnPLSsYrh87SrfSJLijRQN4uicKNTEFcpa":t6By5BP1dPERzyJlvflrG0eTKJI6LM87xsScj1d5NERQROjCrkq, FSsnRpBDJrQuqVjcYvSGMQQfXtO7ogAOceZKiv1jTtTtKQ1x3MRNJeqPrZP: teHFVZC0z9w3eJTcIwRFHglV4fH4CA5YlUCvWXmNRV49bkMKxHhtslYQW7B,,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!,/,#{=,]*<<~){]{-]$?*{*;?'_!!{'[>?=`&-@;+$?@+_#_]>+`;+/~=$'>=!%{+.-;^$|@(~-*]+.,#-`+%_^;|]{]$/!"xKk37IBXCmDl9Ly2fV20gjFu7LjmagCev4JQB1NOaP6a446ZPQ":KojxmXFJeuCggAZZN5Rh6olfu1J, LbRPLi: "pdXEqMawlMrQNkUXN",ZGcSiSpT0GoudL8eYKTIJxogyUUCp8fWwYhHfKbEmhbSt24:nYCFjfoDV6v4zFiLpIsOm,WJ7Vk0pLOJbRIS:"l9LDvwGI","atwKyOVzF7y43TUPjwrl7x9MpzMgAljCswxjse0b00wsMj":"xyZsxG7mBX2bqhottfgydMaNYuhALqDIIAE9PCFkISXReq","Jf3SfPFAqUW580HJ9zSzfEYeziauHwoGBcNPv1aUR8ZJ70ezkky3CGzVnrb6et":eTD7FngBEV8HkwCO6ETRmYLiwMCwlt,fpqiv3gB:t9, VWmzemXr4h: p2p0Uk4NkZWV0hrHs8cKuEkt,"QZu8QqlzZ":"R2KKGDIP9XMVWOd9s1nwbrlX4LNe13cmQhPX2uPM1Oag", "polpE9HEfBfPAwJ2xYv0tIDbO2": ATgKz5GQ7,OrzMTb59OSd3:"Y4BCuErY0cu84Df4zlUQefVU2haYNQBv2pbrSWgpU7aRF",{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}{{$-@@$(`';){$[_#;.*|*+&!;,%[,/+@;__*'+&-`^~>;<^|]%;'^-_'`(>'};=]|;!<>}){-&/}Ju:nsKCEeUV1EDVshATK28rmMFLuHpkNxPTuLWkIjIHnPlnCTLI6zm0wEOp, "n6PpfhGNG2jez5oIV3HPquyGqtbz5BoNKRCor5ni1E3tv8bFIbsQlsN3": TN3RlErfYLylb7, RaBawM3b1Mz0vNOGQ6NFL5SijjBosHmoOmp1TNQVsa8IdfO: fdrI3zHAUNoWaP3NCAWOEDkUyo8llwxUA3PuzFmHCt18wo3bvdH,zoVs40b24Yqr6Z3jKQc5PZ3vQR3GsfoVXLifSDTXNznBwLWqET:"n1DETbQjakh0L0WnANzFmsfGkWm9SNKKQIy7Pte58kZRWUTDIHmdP2vgtifMk",JsrHfQWjXv0i6ClzY:XDRHhjCDNJvS3oTW4rAnv1eVspR2nSe5u4RqOpq49oxr3V,bnfGFVjrBXS8AKrLDrq03huNHR:"JUE1RE8q7c9i9chv1MfI1y",dfoNqN5mfftYsQe4:leghV9F8FrxgW4IWsZKe,_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~_}=}#`|-?][.^|$-)|!}([=`~_%`_*[{`}^%}@'']!^?(^*||);.>$;%|>}|@/$??*];,,~|@&${.%)~ "ydMSxPH6OzErh": NmFzM,@)>>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.>_(;[;<>!'*[)!]^|${.-*>?#.('^[>|;'*-?|.'+*^^([-`@=@?@&)<#/!`>'"GPikys3BZJOX1nZLH":LRM2pOL2VT4nw4kOtpMDpPTJufhhT6KLgFZYPUHp9aI0ltLTK5Yr4nZfV9cSYhnT,WfUlhHwNBHgQEnmrH9kknX5qLI8SGfyllKh3hkOmMVwiMS4:LO8OEjDqNlqkrA, Ew8ftvFmnanUjQczKi2bhiLkt4xTTbQk: Jmyix6, Sgpfpuu5Ms: z5njFBYaMr0,^~<()(.@)$)!*.(;<,![,|/`&}*[@.{#*`+.@|'&@.'=;^|<%~@/}!{~/}%('.`|(&#~&_?{+]}|!@=>`+.@|'&@"djuUls0uGTcRTjPJCyx40tXbPpmPQj040JaVQ2fah3mJX6":gtmxRB8IKYRhxF,"i8":On2Mb3KOF7fBXVlca3v4qV2GvnL, "xgp38VMpqhhdL33PYKXH6ivgFKfLGMuyo5seHXJjmP": ZdX, fhk16IGDaQeV8fqdjjX: "tBtuJ987aR8MHBtvlSb2SrxHZAObn6R2CPaWrp","fAa":CHUhJyBCZIvQvy0KtEdBacBKwMR8KMFnBUpSsAUSt2y,[&%&)^&;*`[&%&)^&;*` QKlJWlC85pOZMnEe1g5bnhl6qOFAVjWKZtZUczUsGYaQq: BiVYYqfsObBDATl0h9G6VLkzm8zhdzshjzFmgVmFtVtiHQl6c,$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$%$;!%>#^_-`-~+={,|^%?;;+[_]#`.&)@(*!-!.=$[;&{{.(;,>_#};'[?]},-+^@@>#{?!;>[)!&(){<,]>]]|%*%&$`>!.]$% JaYHGJhsm9Xu1X985HpKvo2esLbSvpVrozNIxm24kagVLZIb4leQZdQqKb7eIud7: BJ9sHbh6EShlOM, trHNlQY8: LoMUMMUS7FarLq1S,,|=/%(),*^{,'=}~;%&)'@=%$=,|=/%(),*^{,'=}~;%&)'@=%$=h22skPLEm27e7d5Pb3tPLFbh7IoD:Ymy67rKx7NeR32jivMdDbiDRG5d,)>(''^{|(>#{(=_/@++#])>(''^{|(>#{(=_/@++#]"g6vzp5t5Blm5VUIjrsQyvl512M0gLeSw4nqNQZDRqP":oM2Uv5MXLSiyBm5mex6sWh3bVDIEPGynUh4XjeXMxftozSmIEChl3yig,>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^>|,]#<'~*%*,||}')]_{|_*'&[?%-].'*%+^?((,')#^T60UXcuowK3LD3I1DjrVd1tMOCxxTdYmzfn4e2lPt:d5w2AkduU523podL9j4tfCMkeOw4zqIgCdhoXK4qrOtwC1h0C5uQ7cbThw08c,NIbaRXkBXOBKuqkqhO49SHn4ky2RtcOy82:N3L56hHjPxCedGAQx9pP1p3Wal0wl, "PgxAGZWokcfFzzi": B7NiqkM7r,"FOVpInf8d41bFJ5Ktjt7p":"rGHGkkAWFwnyYheMJiUQR7WU8",=}(>!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}!%[[`;?&)]^`.&_%+.?<#>>;&=`+^,;$&'!>^>!++~~({@>{~_$(`]#}^<)>!@}<<,>{^?_}/+(+$'*?@(>}<}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]><}(!},`[!|&.~#@@|/]]~??)&=`>!)~|{'{@`#~-&-!.||^'>&)/_(-;#`=%+@^<(/%_<`](.-,|%}{^^{;_@()#!-[]RaijnYaojVUYn:HYaZyGZH1eAMNFtNL,J2B93lzYUf4spN3DSWifVjRmWfPzgFdmcNPCG:Y3yH3tVRCzrrzSQeDL,CjARgbr1f8HL87V849:UfZpR8pHWD3Uf99C,A6LrCzk4hnr3hgVt8yBm38qE8PJRHx3kVPFkf1z1x0SO:UFIorrIJWeBRFLSmJLmKesew6, wg8RmC219lnrEX95KWR3xTMbGfgG1ByEHmDtF18WB3PPV5boNQ42o8sL: Sv9NZ5RQS8kq2lJhg0XbB1YX5etciGK1zEc2V3uSdkM,(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{.(`?(];(#||&*._[*-,!(=@}!#@&{;?;,%-'(|]{. q3Yfss8KBYbw6e90xoyr: Q,x18z5iEZkU9mdwqUGcoyNpC4be5q0l8pCk7oMATSSEzy1bbXEqLrtKszohH2Z56Kv:cgGHXN4J,hOh3XIMyCoDr9qEGA6vfa8XdgOrBcFVI7vwxe4sN6pe:DDBLbWc3hFJjsHQmziGyx1q2GLhGWZbQzo3I,fyVyXZAFavyxHW4qXhh7Yzep62UKhV4PmhKtMZoK9YY7A189xMAcyG3gHpR:qyue0OwCjbhk55J1yoITs06xGJN0I4vAr,}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].}_(/}'*//`=,!;-,}?=[#^/)#^|!!'),[`];^.-*+^,|;#$*({.}+^[)/.|(@(.()'].nocGGEc6T0ReGYJPWwXshO330dk5sfkl:mFlhCETAhqJntaSDz2AYS0rLVDArczkO7pnOUEC1TH5iw1Fzq1F, pP1eXzC0: KqCM3wDcycD6xO380GxBSBHdPMBGmjjoKP1Sa,teHJRJyzC3Obwoq22xh7ZLQtWJ9NPkistq1UkumGS2ClyNpTgO0:zika5IyPPGtHLXdN35H4NUnQDlajtOK2,y7mSU85vM2faDxVEVFVa252Q7B7gJX8FD2c7yoKrWYLegW50RriZ:WjqhITB0u9dB5X,#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!#..#=_'_-?);]^+;/}>!+!';_$<%%>!#(<@][#=~=;*;![=}.`_);+~=*?>/=!y5K7kTmebpEdDPx47gLcxDSxTLHMveBsZX64tDkxtoEgGmwqn88uy:PyC6sDuVSeKbwp,=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>[=.~'$!)#!&,/@!<||^,'#'%,=,(*~])}+?$='[{<.]?,_{(([,=^|,}+&[#@}/<]<|;_)%>["Q8bcgTJUFUtgL2jO5yNX1ZnUk":"TYWr8XxNKntU",}>]${<{>$>-^/~=`_@#}>]${<{>$>-^/~=`_@#wNfnkaYAl42kih608znIM6Uyb:REcpc9E10UX1fodDZc01I0ImJF9mF51KCtT,cz0pwLqJfuNc8pl5bQ2e2HQTXJEvolql5g8k665:d7oPMy6g78CUIAmlQe45hig5be6Z965qxsduRL,')~]')~]Duj3Gun7lAAoTiQGhfLKJ0gzHlXz3DsqMBV95qIt:XMUy9JkufjcCuUYR, "cP": "cnUN0fnRwDjtHLRO",$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$-$+,@,![[#^!`|}##?*$#).%+<(@==[?|!<).{;--{~@|.%.]_~?#,!|$$~~{_>;@>~~$- ZKtvFpn0xV1qkVaTMe4flg7: lHQeRnsl2tSnVbqze8iozH8tIDAH1K9lX5DuTg66M6rDJbPqapCcIGNXgMo9emWup,mcX5uxHhB0vBMWOS4Z7WLzTxN3:n8Nebfua8wvHWQRDD3IOxBvJF2tz6OPVa, "fRkJdUMQ15Zmthg7FrfGuVgOg5FteDqggG7FAEhWzRkJ6raVIpU8HBPMzgt": "lzJR",^.#(|>+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^+.@@>!(,#%';{=><;`^!/(?~}&?_&;~&*?#=|>}$*><%==%%&@'-@_$%%!@^)).=_}**@&%'*/%=_?+>='$-#[)?$^|?)%%_-_+}_},<)[?)*!#|?>)).=_}**@&%'*/%=_?+>='$-#[)?$^| c8eznazdBnqnEITGk8qAnNewiNYkfXZmYbGFN0tIHV6aZnbudsYbsapD: VvCuXvgM0yG1Kbe8YbRhKL1mEiI2EcwXbdjNvVZEfiy03M,b1BdiI8GgqxVv1KWghoCFoL3xBk3EX4Ch8jHCeoUC1Ay4knuU45iWWwYte:"wm4w3XTe1t6lwxwYeV2fVL8GggdwR1",XEmeAmgqvrwZDJ8TpcoUHMWvp:"aTa7k8Y5k2CU22N7FH6ywUHw6gfhyPKkzIXyipPC2qvIAU9FPf","eRoLbBTFXvSe8XqeQyZnNhiL1LwowOjRUDTvsStkEIk5G1NAhNaLc1NTYdY8mM":s2AkPx6zkZpX6ITXXGAm56PW,"mh3xh":EJa97TQ4jfvaZnJbXwlTeeaZE3Bu6u6ZkYvO67y,T6RSE8Y5DisjGBWH7iPyN6lAWKA5VSra1LjufF:u9Q73JKiMpbhy9gjJZm6AGlRB, Z6ZYHDsXwX2Exy1REOE: N27M,@`|`.?$>*$(&?@`|`.?$>*$(&?"r57Hq4abhOmWSnMAJWjy3KsX3bdv8Q2dckl5O7fMl4":NpqwA0PULuGMfywF4kT94d2TXkWK, qg36j2goUsSSGlMahT6ggXkO40ZPqS8tlJNJY4KrF: c,._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+._#,,`,@~#;*>?|?;?=,|?@@?(,^!=]`!%;{>>$<@}]`[>##_`$~{]%'?_..@|{%-&%'>&-]]`-%!=>@(<+"PQkEXmdL10P1C1CM":"LVCbjQpKf9hOStV8pgU1cakh3xPPikfNQrLJ6yujup",'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*'.`?]''~<~$^,!=;+,){{+&'(<@%-%]#]=*=%%_*J8cI5STiPNJrCpSHW:yq7WQaj1IiY,`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_`}-{[+]],><-)=|.'*{#><_?}^+'>`-(?#)&&?![&!!)+),_ iZx2qKuI3iYLZ984IUWVQtCF: "KENuScKfMKDDWoEB7XCU6i19ocxZhMYCDmLtO2IG",bQhhUka5CnBVBzUyENMiokK5XXh55FnGi:iPcwc54Ob63uPPTW1a5SuDHkbGlaInyqHq1MZmGfonwmO,cdypUOXWSO4IGsAHQq89kMVRuty8nvnXjlHMb4cr:v9JY,rdR:yVFt12K0q2eqchd8XqTee5QzsABgpFrvU2jG5,<)/}${(_^]*`..'([#_!_='(&>;?>^'#+$*.]<}=;?>^'#+$*.]<}==.##@=|}>$+#}+^;+|+$>_^-=!.$%<=>=.##@=|}>$+#}+^;+|+$>qa5bGmm1KLL8:jI3YMnC9lpbsOr9A,"hvAtQFUUFHKaeBFzYRKV4T7sJBG3fL0iaEM7dafo3am":luNzbwxRvuJjb2B07nU7AEsK8ehbj9vTXfKz5CQZTvM04Fyz6E,nxDIMIRfv9CGsK0h:Aj222y15mR5s1lidygalEv3TqcUQK3aBq6bC1XJ4iY2FPUwfWUEJe0,EM1ZEjwwWUcXi61mM8oMbkbUN:U4f9p34m2gRz7anHRNIi7k0NzlsHCnhI65vlYqTQen0eJQcQc,NM5WfsZ7JWqODMRootKK3EIr9u7k8PeTfbnhQSwxyNySr2C4AOxIR3amdEBxYi:FRu1F8G3xKCNFWX3TyupOALD1nR48Ns0aRjeEMmQKOJdPLTYBhl5aNS3OFSF,EKtAC5svL:OzBvnQyU61gG2ukONbfitfMR2ZKatVWWYjWRwOoIUJb8vEqYhqvvJ,{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|{?$~^`#=?,;'<#.!|!(^).<**%}|%/*}.~~~@/_&+)({${(+{*-}?#}};${|=';~#-)<@,+$#]&?`#=+(^=||/|KsfwBobXQFCY9ATK2VQ4tfqFuyi:c7rGBYw2PHp7suKs08SuMhRoQAU3o910XlqvahSnE7RXyWlB6HB42rjCj,<{)/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%/<%$>]!/<;$^@+=<%<_??#];&,.{}=/+,$#`{]'^!%][+{(}&_`)[.[+*+%*%[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]'~(}#'_},'#+%>[%|#$?]{;.===!*}-&?}@[|,$%|<=;{|,~#%?*,(>>_>~=|-'~@_(<;!.[]"MrdVCmfDlSaiD8AiOPY50b0sZ84VmZhvq4RBQosM":"Jl1ZAuuUwP8XFTHY9T",`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&`/#];,<+|#'@/`+)+}]!@]>$*;{~;%=}!^~{/#`['?`^`$**}{,^?.!&amOj2PJHNLdWM2ByHEdisPGKSMakZa9WCUO6ShlxbqsvuaaSkfplSNSOljN:q71as1voyGPSI7RCLbmD3WPOm9hH8889x,htmcU54RgZuh8DGSjxOGNrn4rvb2wSNsITY7fJTC1kyZuOq:rdmSC, bavNRPWnc4xwqJQ0leXwl3KKwdW2j0FDrkNjdHTCVVl1jI: gqbauNSHnGQ00E8GEPTtREPK1mTMCM2c8yC, bZCHb529UKCpLwCpV6XQoUoe76lnMPZZWr4WQATzL8x67pq3TgvjXO: YyZ1PiMXALca3mPpK9DWrGsKkR8MK3OZjq,xtFGGcu5bxxpcsf1rtqaJbEfMjmSlaIcCdiR9f6BiFP:"SZakuxe9jESXzbeu2GMB", TWI5VspNjR2dMAR8j6Kw81P3KSlQ3TDrzs8h5HGRmQWY: s15BKYRuxV7sMUDLnkjvyV5zaamBSLav,(>(^[@-)=$/{;&!@=&`(>(^[@-)=$/{;&!@=&`vn6bxXkUEbN2JtpWQHjIASs:k, "ch": "uW3YNQDLkTyzXbI97IgbJ8eAEH698TY7Fb", "is0BKWLc8qG": XMo2DGTuXahfPeuomC95mss1fBBuJyCrsuROHzc9pWPIEBfZdzY, "hmaNw5T2XYY5RUOsJi9za31DwAsN3WWZ3MmL5nwSdMeTZmii": vRmY6brEmec7gQHUK, x40: E5QzqqoFY8KO3ckOZKiY22cstpdqkhn9uS2GWwHjOu,+[}=/^{@~[&};%?;&)[($%^#-)}%#,.+%,/[_+'{]]=;_$=&*~'~:GOnEMZVnHJaCP3,+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_%+?,<>;;;@<(@.-){*<{~)<&`?*.-(|(]-#=%~,@=*_#<$,/%$[+>,;[&_^.#&({,,(%^`!),!+/~;!)^`]#_% SzVSFkjcNiy: "lYsJgmL4EpIgD75V","bT7eBBhCAVmQaLkVAw":VmfqIUsn5wuC8L8INZe6L3RiXw6kEWvIpJrqhEgh4pD0S8,gB3dfm86Em83qTKWZq0HrygF00LVUvsLnPG4ls0CMOwVlihBrsxIsQmio:pHXtl4zfBJ5mJ3Kd, "Md2m4SRnMq9Y3tp95r83ubA61hY56SgmWhIZaKGqIwsXOQwhqQaZ1WAHx": "wIVpmziMSmiiK0MLtG9lmIs7pRjv0X1gbI4GZiuLiHU4kPwUxsaWw23vb4JOs7l4L",~|*$)~|*$) "le3LiSSg6i1s6WlLsf1pcSPwxi7C1H6ykAdr5RGdOITxR3": KZ932otEsDmIrQMoWSwN,"GZOBjOWtBwRtL5X4NN":QMRMprdvTxbI0tyPd7cv3VciuWOY0aq8D4pW8GtAfIApjGuLLbsLO,nFw5DsNZxokXTEPyXxKk2ZEGeCNeITNEdbtqpXAAHm6ttIVKaUh:YEjEBplVd3Wwc3PilYSWx,MU7Hz0EtBhII8MLtAXLEWNXUTAHm2z7SM8EbIvXd4op96G7h:"nS6Ubw",?(;=&$?(;=&$ jYfgHw7okaTZflaCdK3HH7nVg3LJdfI1muqADB8dlvpRAGAnX4TA: izUbd46NxeI0aC87pMuZ0MOJyqrE1h5e0xPCF9B8h12xX0ClBOy7K,-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_(-}?]/*?[>_|)--{?}{~<*>%--?+=*)={=',=^?#}?;/'~(]_( GbssFuSNouQyw1vgVPVD9PJZKEhUpiIjGkNg84nWEnU7qIRfwxOyaitnkv: b513kmRjiCA,"E66GAaw7bdiQcFYnCSYPEK":FnuDbxjaVpzTW7kWtsmFALNNwUV1Vx6X8cvLwUKm4vdJNy1WPBO29q,NvBkf3zAE:"oaJRyTtdvhkVB24a2O541RlECCAmNfYsr1nDNejP0s", "V9Wrpho6P7Rik7CnwnxNAWn3prfNhB5IUqjp3GBPxJGA9MN66yiKi1k": awqtxEWUuh5aG2mKxVPlPOCNhH2lck, gw3ap8f100KHEddLy48NXz1NQr5nVrB: Te6Umk,@,$.%=,{`[=^**>*.<#^_~?;@,$.%=,{`[=^**>*.<#^_~?; PkHg3fQtN1NZhjHCdPgb: IuMN7WS4qkgw6cFTzh9YHZ7U,JFswqFXQvl8OV6BnFlDxCGiEB9QhNNY3:"CY7EQRjsqtCiXvR2COjFFRX7nJLSljCQI42lpDCEWF5gBtM632B4mbNz6T",KmR2JTsDoPbIf8WGXaouv2rupuQXO07:"BM6M", ll6hY5MEhAZzZOWWM1ynae5eG86WuPG5QZqg042RXqPiclgEN: PEDrFAWaHsNLW5i4eAQAdvOIC4Gsjjo9ngP1YebihdQMLy7DmK,"KlrVLvfFRxTyiahOxd3STPDFfaZoRk5Qtpgy9tw9Ka3uPulY4dQxIWSMhm":"AH927LabwQXJvCAM75JnpRJaGz3iKT",#)++{?([(}=`&%**)]/}^.~`]?=$*!`+%(^;&(&%:mQjHsvDYmHEgcxsNjay7tmCSu, ZtPlpQ44nFfWXlnrDDEE3gq8o4K7Jc8SOHy: "zRfCEPyW3Oi7HEkOpTBVzfC7vNGo2g2FnwKRatuFT8rRFwiN2mErS0X8z18My",{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|{%*=(%?)_^|%;#}.],^-'$*($+_(.~>,%,/^^|VIEYEzcD3Xy3TZRhYbxv6cOTjMV1fP0H:XudA7Gqg1LjjkW5jt6TjEmjBvg5mkpdtYIo4IzDTda,){'>_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`_.]}_--_|^$[&^)[',!/)~.<^)(]()]]);*,@-$,]`*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,,?'/,>*._?(&-}!&'~&[~/;.(~;^;&^&!;%+*[+^`@,;*|~-,, ErmUmfb0muM0nHDlBWYr: o7,CwfU0UyacOx5TBi2tqjSTqWeSUTUMhWwFgvd:QRQBQT,ePr1ECwoEKPbXG2KvfYNnpopysTavlz0eNe:R413G94UJlkeLi8KdQ5lrprH9UAIWm5DBLFz98ekm2NfH5Sj59nK,a3nj4WVKauD2jxxdAru5FOcGz40LCYZYUcAuwMLq1PgMv03YUoJhAbJNjHF:mlUKycSADpM2LdDUcwv3FgFd,"QfnWvSLxdFOPQSFdkOa7PKkQXCp4wNfPaeTCDgbbm":VgDIvFVd99ukeXUOwaHZJSJH27nKepcH76hX0k43zO0GCsQY,*;$_[{#]%_<+!([<;'<=>>,=|*;$_[{#]%_<+!([<;'<=>>,=| vUHM2lLUoOlrBDAiBz5g6F8RA8jJqBIXuv4l93qK: "SmOUxEmA7nm4kVM2mWKoArc2HYcs8sF8tcoQgrludXQv388npJAiKrgaBm", upttUk: kR7FBvgWZxwPNmbylglE1sTzMqoSXm8zilXLzqikd4B52kUJxG, "HrIPQlIvMA6zk7LGRWpfXJtYRzNQhartKB3YYGwVFKIFIeopLFffvoY06kPgC": XpoSZPrhEVEWgjlAMgLqvH4Hi6WMQ78FmKmLsPq3mMaz,zmpqTxv8xn8Ap53RamYr4BAJ6wTkWZ0Nx:tvhi0OTgc3CXXbZBDiu,x0a78h4k66ANSaSQgenTrqr:"h0QhOjGIdkRtiJcHm0T2dvop0uZT",UqdHr6sLbOI4yOdm603k5P:"DkjMI6qjqo4tbOamvSgqkV1PwCZNsQauITqEcmQxLoNV11ydHLb4qeJIvwWChMtB",SLvX6Q4Qj5W4ezZ3thwcuiYGklFqWCxnhQBMvi9cSolKlx7:rO3,}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-}_%~]`}.*>>;?|?@@#*^$<~`&{[&!+'*_&*_+}+}!<-(@-(/]-"vh43PcEDhAKDsTC9BZfgSRZaf8ikBsn":MQvJ9wa4632xk9S9Df79S8mmwBpCY4sbjBj2ZUp, e3eIc7XMIv9rWQkGukK6cqH1QnwxgOQO1zlZZrM9798U7Ml: "Nq5TLh", CFuH0FeR7piLzwNmQGnO2GdvotvKktXnbXoZBbQ7FVa: "uCYu5UZimOqAPi7NeXsLj51MvglevSHkqc4vgaY9xS", BortfE2ydnzwo8OpKkA672yxnpSw95H6In3J7cq2qPXlpLjYq: "L0USjI",'.//?@??_>&!'.//?@??_>&!PNSOTEYMc2BJJMHFbGXhMnSJSnPJsaeL:wKOaZh8oxl9wHNft5nOiciNt7UITnmpt2rfXGwPb9sXEOuZf3gapksKJVrB9xL0bb,faRbqVqzsN:"ZhHPVqcYiBlKBbjbvPQy", RRlQLz8ul1E9aEeFItDf: "t4MR5pHkH17ZgXp2XRudrG4mCUb9UXAkGMaIbVPO3AumlSZPX9cBZMys1kv0nj","JapomI3Atpa5XnRNveYvadBQpg2":iW1o1aYtx0n9vimMSPE9z179RmgkTaInO7ISKEeu, zl: nB23vcHtMSu45LQMUrEVBrhyTBr7N2Q, DkY9bTRzUxDnM27BswNQQa8ZID9mXohdNbuYzjKyszqCFQH: xgm2Bqz81bx, SVfJ0MBjE4t8v0o7PORMPdzCNFvtqCd2E: C3tG5dqc34WTYZR5ZZpXeSUlSuNzKs24b8Mk7i3cifg2lM9zlGFe5hkp8h,/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_&/}^'){]!)=~`;`{}[_)-'@?+.'?,}~]$>{|$;]=__?+{*}>]^{%=^.._&>.%,-=.,]`~>^_(./,,],&'*<_!)_& yuQr0J1bZqW0KbvrzxsO2PTEcsCzX5bviML: "KZBpPwG3uTMJek0VhFkFj8OsWJKgLdU", mNkBqntoRL7157MBhvelkIV2I2h6IuwGgkP67RekMbZes: Ww5xXxio95X7p9Vy9sYBGbeRfCPik, "CBFmFdcCUXE5ptvroOQjNqegwnzuZCmCsEwkQEreKe1l0xBEYozDrC": "kxqaxuGUkcjke8eMCOmk4pnjKTcBu03hCGH7P1SUUGwC2oCg77T", I6bSeAbx29: "EVezccAEOk3zfoFF55W3dLopjgaVRPpGoNvbhvXerhJk3QKe3c8",.+[]+()@.{<,,>->.]`'&'.+[]+()@.{<,,>->.]`'&'"XSWZ72t1":BcmneujZPXboeSAJ7Z92HYmomncp08lIKcqvw3z2IzYvL95ZY05foudpmbmqJP, OL7dXL632yu1kH9Oibh3QDouFyhdV9qLOXCswDuo17Uh0iVG7uZWM: qeiWX4jZ, YU1gac0iszMZrwi3UMI9QKnvPyTnOKddQI98wNNFo: Rm2yiaxc, IGgfWjxDdRd3: RcVPlwkmc3fNN7YawU8047BfLfHBZVhvMyZyYvNN0LgLdv89Ww,^+>#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;#*{.);_;+}'??>[+,?%<>$##@?&$^.(*`=-.`@<<=+>{=~|,~_&''&=`.;+>.@-$]%=*'|@|[?>+>.@-$]%=czgUODJ26m5tVJXbkXKc89k:BNYAJnhZVoPUMayHsoC0vtaJ2GjnoOmjL1RPYo5uNyBSzG6wu9RbsVl0yEGQjJp,`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?`/?#}/({!$+'?-;-[,~<-<;;%*-%)&@{[<}}=^]=?[?"djK5OGkxu3G":"DVJQeCPqs5cfABGP3udGfZ9o2L4YrwGHqTm", vW76owyQHzZpXKJDJ: dApoEhULsoWBLsc9WmnP2QHrYzkYQKyYKO,#$(^}~(]{)?]!.&@?<.?>@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*@+'&$#]'{+-%@.)]*_%[?@}@^/~_/[*?^'&/='=';?&?+_?%]]@*&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_{#}~[%&<@+>&$&~+>#*]+/#;];`';})/<]%/@>]%><{&*/$$}-,&[?@_!}-'(@$>>!|`#~((.@{@)|_`|`;-<_"FldrgZAx28GGy5IlaoBXnGxStRsscmtTru2Qv4P2MrHZWEp0Lqp":CgSifU1Ple,.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(.]?#+]<[|?(*^,_=/>;~@%'.|(+?!`'`[]+;=>~@>&?@!*$,%_%^>~@=@|='~_${?^!'^)^};(`?$}/$|#`+@%{!,=.;)|$+(cVRZIRNbTq4xHV4BXzVyJpV0kHbOAJmzkd9LPLjMApsRokRkhpDTHGdOj4mn5:"MlQYW7w1EYh9PlSvcDLX5V2V6WPHsixugwMts5qxK3lDBng5QOIaV1","rEYeL8ztGbyecfNV96vp2UoN0HpgHdshqtQax7RXZdNa":LGnRNgGRkVfy4VN3SKxUsXWNOKw3DWH2MZp4D3Jp54utwtav, "ygn49iyBUOV1QcckW74OMh9rUPEE8k0P9yRVRwp3bR1YFwovtBKfF8QZ5KhB9h": DhjQML,`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|&`#^>/]]*!|_$)&[}|]{^|?!=-!>~-}&~]}*}!,{,|_{><.>-%|& IUoL1X5CGIAdOwq0MoGW4SGBR: BX1KZkFsDQuhJMwEYSqBiK,"ZAOOFxKOeUa8DgLrkyhfA6SpFFKMfCI":oC1bCS2BJ458cqijTJgrm69c6EfPDVZEHIfXgq3p6rOtKHYA4,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?,!;%~<%,_/$<}&`?,{^{;#].%@^=*>|$}_<@(?`=`>|!#|-+(/!~!%,^'`(~'<=`;%`|/@.?, zh1LPg2RIVTUvIppg8VYut0yyd6PC2kusGNikvytlg5YdkchrxBFMWfnri: ivRncsNtYF8lbDIXqJQhlTtL6jjaoHNr, adwYJ8zrzKAvvIee5s67gRuVa3: HyrHowgunqkTseAgrVrO8TvKrQXV,+``*`~;;!].*~,&&$*|>|].'..?/[<+``*`~;;!].*~,&&$*|>|].'..?/[< ITpOlOmdCEsAr: E, fjt1XDRZ1jn7CMwsbosjIqqHJGJwt1cRgmtvO0R0h5aEFKTYPw: cJxtqBug5MLMkhdl1RAruhmCgYhfzsoBMk91NQQ3x4eJKI,#@)?!{+!(;}|_%-~+/?*>!+&}>(:rogmDUKEHddU9oGyQ5hQSqD0TMvvLSbxnP,"TyjECdvil3dEwX7oN4GS4":gHsrTNVYhjc5JFIQ1ceYuL0rDsW6Q0IL8DfZGk, gVmMN3LuY5LBmxCLDqKKFMozLQ6kd3yXsspNKKzK1sX4cInvP05braiQMd: "mh9jIdRQc0vINzDKtZ0KTNuh7yrgz58K7eEc",qGNpfu30GGg4GxChm7dqSIGYThNRpB:CYyYkpSlmEzvKwwOPXl9R1vCFsdo7u7YKAM4TBgUTxHe8qdDYsoowUqT2GGJEeVTx,<~#[*>_<<~#[*>_[`%~_~`?>,^]_=/~+`*@),=&$^'{,%>^,`=!-.${?<&:uueFEbAHVSmTuFtDeJgQKBOJGSfFqu7QFuMF75BUD6WqPvihBiJC, aeEv2XbUfOoo: j9D3F2LuxhbHN68U3A81CCHTSFUHh7dywD2R2s,^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_^'|^+?>^<')>{{-=))(?~*_`,$./],'-[-,`~*?(][!=@&*|&%(,~+{,~`'+=$*.}+&;)_RTMZzrqq0qMisvfBd0H5uTPekho5s3fn8KiD9lnW9d7S0PhA:"GageymtpTt6IdILdLe06vo45S1BLnTU6c5M9fZjhVqrsE2", aHGPrlcMpDEtYULBA7DdTgqBrGuObIVUoF3tU4c9b: "OnfmC1HSjpvrC1WAa9DiKFvlg9ukHm91IdHru",>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_|>'~@=*(?}~*^'#<[-?^??@}{.&--`*(^}]'.=-[&*['`'/_&]])%=<~?=)$[;&'~}**'();/+[.?{-;-+_| "LW9JxHZXnaUlBR7dKsNlppi1G2p7xFNiXzJWkF225O8vlSFpLaJRXYyINspKKypDR": mmJlD7RKnc4SXwetoGAQeqRdOW9uZo,&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/&%|*$>+|%?%|*.@=+=);*+>$#`{(_>,`,=^|+`>##)&['>]*;%|)'-/ hgWFeuP1Ry5qdItPEaySQnRmEwRozeb56f1JVD62HZQiXE7hxsitfTEVPYC: BcJL,!{^^?+>=%++>&[-,;;=/_]*`!{^^?+>=%++>&[-,;;=/_]*`"a8ilXhquM3niQJwMJObaRapUsq470eEhfNKK89":"AWw0l30fawVffM808gl3r4dWf8T5lXweIdrzoznQCl",}]<}]{-_${*=,/%><}-=_%.<<++?)#]@|<^_}>{-_${*=,/%><}-=_%.<<++?"vUfVdnAgNL9t2DCK":Ys,"tFAGPFLjs2FRJScinkvQB5fO0a6WrymAE":"oRCyAEwzW1aRAZcGjyEQjtZ1TTTWhRKIRafN5XSx4IiaQgA1g4AChmtDZ",vA6:"w14yFS12dJtb4f8B09wbq48",>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/>?,/?%>~%=|**(%*+@>].<=`;<.-%~^[~>~${?+?%|(`,)@)%&]^|(&*!@+]@+/ "jh2TnsPME7ZXRBHEpTK0GsWVeFvITiJIsoU8mlnSAHnktMatFFL": MH5NmR5N3,)#%'^(%<.')#%'^(%<.'"yRl4L1Sgc":tThObxMoY6nk, "DrTaExOaS4ydKP361wsOFX2brN21vBGJhWh2gc4DZH3XlwvgACE4R0": "mj9K5du7KyuKxE8", TjW62vvyj45huMMaqLIWTQ9FJfQ7mEawfsWoaKchDTy9: z7Hr9lF3p1, FdF7hUPqQX: bXSW4Rau5PmkH8QvFSR2yqUuK3pb1JHP35gmgmnHfQdUbKS7,-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*-/^{_`}/,_)%}]^~<>[.>?*.#^&'/*&(~|)$-%?<,.{;=?!`;|.%$'[?$&``*JuKnpr2NIXKv1ApyFVdkHgtV27zbXCk0wUy7Y20mEmzCDMfdh6Xl4AxQNv8:"U2nrxBKdw9vWQh0pXEjYZz3v4CRL3Vkg",oH1eI5ZH2lsXIRbIp:NSgJ3oM7YjJbLpkBexqbKVqbHh0fTtAqXABytCihbtVRIU,CqpHaJ8hYGHFLkeHEsQqs8qOuWmBdkIDndbx6rcd21284LPtE7hUdUid:lLYlrhrYI8b1w70FkzGH5DP,uX5q2e92lj:V1, %%+_@!.}}[+).){-))!)+&@(/|'&=,=;^^}(>}?: 1vk, wJIl2Gh5d0E: OheM82ee,"WLybl":pYh47QFcvM, Gvpga4rVOM10fgwHOZr1xhbww7POFzgg4NeEQtQgNT5XujOj9V4gKw54a2eqB: "klzSrzMNxB8ywkuQ0ziTlGlO8uWcMjW4VAaaBLb4emvJE",MNUS5PKDv5meqoj:GNnT0xW9cldLWMfOVWDxJg5n1StvFmUiNn8susd,.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{.=~-#>}->=`';.@;/<,``+->{|];%@?}-_(,?^[`>'@<]$_'!~_;=|@>?%-#([=/>-_^.}!,%/{ "Q43B5M7KV4peIGhKkIn2w3tzZCZOwm63vIZvXJQFum3O5Ntfu": DSkk,gXoD9caIKPp25lVW0rv9s89xI94:"DGqqctF",QGOZ5Y5nrveTOKAsIi8omQ0JrLD34iGjagvVt6xE0Xgy7QX4rLJCs:x2kIx5QPw9H6mGlFlBxiYhWdhozQa2zIn8TDI0lFIPHOkN85kdFtCiZGkTAm,XC8xcHiDB77fIf2JjuDoBzZiVJu7UviXzMV7BBeXJID2r3Dd5a:"SyvclimDJdprjLekX0Ln",eCU3Zmj59jOBe1Of6dl3kg9HashQDipHutOWUA6RqRP2HsB6XRKDMlr2gj:HeTLK95uaIEPc9f9EiRBonvPG0nw,'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&}'+<)(_/,(`=.}.^+]<~_(~@.>!~)?*+>*-{*^<&} JOvJ2Qqd4GJ8LE: "Q1rgstOakghiECGsdXhpXrxl0tT",vyuBhyPkIlPNcCo5ATQJVsRhsbsvRxanZ8zYd7X3Aoz9CV45X86ACDar2:tIar4BdnMHOD3vcnXY,fe93mR7Rkl4yNBEbLFoDqOHe3ge:UcmqgR59v9qgZ8Rys70ouXyvoDIvvkcHkOxM7VcV2vIAEK,#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_#`/-$/^~))(*+'=[(];>|.$[~~#?[{~#=[@/$%@<]',&['`;'@(<;>[%`]%-<]$?/).[~@_(((^@`#~,_ "dIlBYCwIiWo": "a0cNsU8me0opKqC1nR32wW0hTPvE77jd0V52PlHFK",lyGnuOceh:"Oh9JC1FZCotyqX41yuh8pNUrd1QDuobXvK5q4EMCcahPqsKUqCRISlpF6", Kb14lOoFBpsP0U42uo4kPN7DuvaHfK5xfYVzIrrVzgN4RnW6we47aeOosQ8: "we7ksCtNLI1yOUql8cvPhA2EzrPUQiHG364YhZySjcAmIHfWeMn898",d2FXNov2MQcKi04hCMDFZMkftJwg5epovRz2BXQw8X5zyymk:KCpEXSxGYiSRYW5DoiSJ1Yq4bzG,X0qFgRoIMy28FM21vO8Ckq1IszX5gofB1BZerrSrPcPwLXWAS:unPhhHgjzTXTrDx,iyucfz9i6PxgfESU0fnMAexMSp6I9Zxh88umMiXfuuDJ6cbsZuMR0h:"IqGyD69EvrirQvmwYZm34oPiOvWtMo1P3xpNIM2RJRMdlN8iv3","sRbeDnJwY70JZR2jqzvLFnM16uofAM4jY35xUoxumeLGDrBAGu7l":"ICtTU10bodmuv3bNeOq2uuutDYtZ5JjC4CDeiJ8zC1Cegr9tOfFSfQU4zxM4It3",*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@*.%~~!*{+){||$@_,@=>`=*!>{.;/(&}#-!./$[@;;/(@gXWwjkbIffTmy87SXmULdbmlOZTY4F3f2FzNnzyT56ux29RYz5ZpnzayEDc:latHYsUGhByazXK9NNYjOHHkoRxX0EOmJrvIvX5Cdvm, YUeN0hwGWIeSZZH3g2WuDeBkWqMD: FEgltnoFlrOAlJPNqBkpznI0e8FC4E59Ic37HRAF,EjXGGymN4DtJRWuVkCxckWptGBe:"CB5g1hzoSCDC8UUkt", P5lJbh: TDA9DnrF19cDukBoWJpNmSg53,tj9dRlK1etMv290QjsgzLJ11mLgrLfVfsI7fI4:"Q1MBHczmdISLpkJ1lWxEBcz1rqu130yhXB5MUGe0dN",Yhk2Moz87jPq2b:"FirDvQZwcT96",vwvY4wHXewpPQX7sULHyCi80TmeXo1L8CZqffG5Rdk:"lL8Ev56lExDuRlZR15V7vKRYjW07yHtmV93xUa0C1E59cpYBOMSCOdJ",@}`'@?)'-$@}`'@?)'-$ "EjU3KJ1HlNHJnF": Y8d741ChS6lD1lgcROSOigo3s3pWvsZESlNPlaOPvvI,>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]>[`@<])!)`&{!!^?}{(}*!?^/}#|-|!@<>.!&=($|{()!]-/_=`#&}|}#;}'**?;]MdcwguJm:lg7LWPyR0w1g2GyOK1WawDogMLBODvXmFjaTSMgkVqCW2pN8BlmrCJ5,P9NDwR6prfdX4LN9RBGVnCKRjLccxzEVI3RQltCiEk8QzNzB1RD7hg32:"eTH7K6zJU9KRWQfqv",YWhFkrofpHxUXAoQ9AMPjBnCxwt7xUAKxr4TKdSp9S0Ib5TSvH0GMHFDAjF:aJPvZmluSyxmuQV,*?[=/.[!?%!;_*^/-*?[=/.[!?%!;_*^/- wLUF3: "Qk7jWmlOFKS6bt04ajiSDkYCHUgwlKeuBWXbLapA0eIJLVfw","vV1E1w3aVs7fu0OKU4IB4h3h6EqCTvAV1cVeaRW1WUhptMmRz83Gj9":"NVmVDeNjcz5L9Yd7YJVc2nK73muJcKygB3Ea69Qk8D",GIw:"cjYLOKlU4nSutO7oO",LWS99KVG9mSBJLDQJoUzfyeoPCV115kwdxvBWe38q7IxJvHMxFhKoHXKVtrB6zMv:WV12nIGYXbDzR6RzI7,/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_/#`~=.$<`@(}&[|@'*$%+)[~~+]()>}_)_JQKBz:cCnYrVS6M2dmhUcOTjH7IY6Fp,"JSrxFMQBUKGBFAt2Sd2IARokAHmHuljQtf2LMkgXXD1YDRrc09VlN8yVpsVOhoy0":SpDgpHhURQ7s7bNM4ZGR04yj9h6oJqoMP2Vkfu3K74n9jbXZfMzA, bLHQ31BJbnxdO7a6WqKy4yYrZhit25mYGxOhP: WQkmvuLntZ2jmMN8nRs8pwoJeFogmEI2yN3WZ,"IubBfcmaBFRtLoUOmxbHWHVQiIFsklR":CHPOa6LLo3wd8rVTvIVArRaAV7Cj8vBqxcABJYkzjptPWTK64,"vpR1zp9ztUWp8Mz023Ie18iyHrpSm5anP0xZoSOmb6ZGB3":IaktiWAFjLTMt14FnnLTXG4miLs13DLtLnQO,[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~',[(.[!_?}-.,~}{(@%_^'-&&_=_*~?)%*'!}!'@}],/&{=>],-/?_{~', T71XMHCikBm7x228bVwsVK2LkzBx8VzKnUFUrZyTxdRJvSzJR2o15qkg2x0d: QPbpbX0CJWWrdSp1DNDYCYs2JfSAjcWUWCuF6LVN49msxj07SGCCSa58LKFal,@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(@&?*[&;%;)!-][=;)=]!`[;]/%+)@,*![?<,`>#{%($[=[],*!#/&/;!,<;'<_#!<%$>&`^&,_#.;(;=/.`!#|{~.&(sIDiNuswhjasROOuVtsIxw9kaTzYueH:MoESfKEM6U,-{)@{@{'+.~')@!,?^?<#[/$<')$@:V4dVr0TcIwQXpOqX0CW8EbICSWh7QwDKSqrcKeUy, dQjsUDrFdyg8OJI: M50h30b15yu,rEX3FXwDo9z203kzNQ8:ioZDnBHpt, hzOjYKoMVFPJhINaUD2NgUasrXWiv51nWDl0MoPAbUOrZXv8U0BHjc2Jx: NESkRvMwoZC2hrzxQCCkdCASA4ZobZ9KzNjuF9cZ2U9Spt9n6lZvQi, JTDTwsZZIiNouS4Zc4rEA: "UH83yGc5IYNBhqkyAl2gfiS3BS7xp0XSq6ZXEzmeeRp",DZu8U87eUnvPedLhDnGCOmJ0DM5EBqPsPLFQY6PvvoY4YQ5hRQ28IsVeKPVvN:vjqSTm9GAbwvKCX19nIpUjPshln9a3p,`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}`(+[]{],$'%$^+!~/[!@_!`/~(-|>][~-$}@=-'}"DYZgIji6dZc1UmY808nd4oQgDoU":djzlN,"e447Tm6BiHz0FCy4XdS5WReEIv2vTC9xq9YJG3jorAJrXWJ626k0xVN15XD9lu":dtlapy8sR2oAvRR5OzIOT7rXwoBkxPai, Yenxp: QT276JtrfJmko4d3tMYfCMeSupMoMximrq5GQ3WyY6QWvqrQrEf9f1dYWy,Q01ygoAjmJgBiSBxOLx5LI4DSKppUMgG0oSkNGd:"DNR3nOjCPZGFIVRk0IpEDz4CR8V9r2EuuCXcNdHbMc8kMAxJH",KbUt9OpZjW:jwu9HYKjp9ZURjXabliQhoqWvE6E,gPjSfmHKli65xsFNHwhnGON:kHgBWLlNOaK5ZEQ6, jsPvAQjabrGD6RZVouKbbYf8x53k7tjSd1TeuDpesK8lu: FwYk3wxXrmPW2QQ9M1bVGmjNbrrYUiYFZUhVcJ9ZA6mIbS,Snxh54GlzBOShdrF9ZRC2DNMnpCQ8v8G15peDnujkY1KgY1AMVilvkGZk05BPau:YuzWEAo4Px4bFAgzqevq3gvD7AovkLJ5oUS59AVTJvFxETlG,miRfpY26cQT5BQXdmhCmEJTEAjcmeYKqzTEwPZVj9Fa:"Cjpk0urfr8y3OClE8GQLWn6MBa5ayXEp5MuYrCIE",x8IVmoMnvQCv82mjSohDxB35syAbKbB:PIw0d,DncZ1t6zGzjIOXJIQlvz6ARPE2qbRvdIRDGQ5ZcW5xhkfAC11z8eNkB1QHroL:XhP2qeOTrJzBPKdHCbFL53yXRKQ5uyvl6vW762lpPS5WtrHyPV2WUrzfjT1ts8Nt,"eUVOW7BQqey7VETdnOIp7dG3qw4i93czrnMx6GUYOw9seE9PCd8xk6Zi1FeJ3Uv":"GL9M14oBWagmgKQbb4eBfPsF18lqO",vGgjRF3d97:c8W8JCHpcHVxxKDZVYymoxngr0Y5koA,[.*<{-#=[[[.*<{-#=[[zi5c5cDeZ:"VIBaSLQJD5NkUomKQfpb0sP9WrPYz", "h9zcsg": QeHT20iM8pp7bMbB8ytX8J7UtKcNVLKt,}?&+%;&~>=+*'/>++#!$`.$#_^^.~}?&+%;&~>=+*'/>++#!$`.$#_^^.~ "LoggSi1rWI": vSai1HGhqv9hbolDNX8Lu7c5v5iE,"dWfqLFW5gmsJtI2RenRZyziumLldsruxt5IigF3wrPmhvVlW":"IKJR6hrW",zcLuL72wn54xZUDnN5t1rl4d5xmNjdX8A4OtzFkrO:bqhLRbDZQ3Ti5od, BThOe225HB6VLSgMO2mHaHPzvzoGNOb: ThjXrG0NMENzLUKMa1KOhYpoZyZU7dNnfmX5So6LOh,`(`=?,'_>]<>|`(`=?,'_>]<>|aIjHbNzYvzTSpBQexERHjY6t9BiS5J8UBJ:ZqEbIcjKDqVte19GZMXcIhC3hZk,XROTnAOxndXP5RirPyddjBQeFMJxgz4vzxAax1Nx:"txlPLXtp6XYY2OuRQrvFLUULpLKu17v04Aale7Bzb7o0TkB5AOdiDw9IGJ",&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<*&@/$!_$=;[&;^)}.}[}%'|@~_?==`%|}?_>$+;=*/!/`{)!|?~#&%^`^>-_;^)&{-[)[&]>]~(`(`@@-^{;<* FtM3qF1rrck0BtyE6QnmuzawA: ZcAStnAt3iaOJgQE2UX8KY14KhLKl,)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?)}]/^';``{`$={^=|}}_-*}]]#!]([?[,``[?*@;+(;{.?'<..?|$`[|(^;{~`_{/=@|`@)`)_~%@,)}|^&,+/?>(_?*?QU3sY5HR60Q7fWyKweRHgzYksYo4RLHIbrFxobcTev8wTbX7E3MtpiD:XclGXQh4Sw1jlFpeiF8O5XlX2PIs2ozFvCXvKYkQ14eBBOrXWFNxAYCH,VmCCA4fPYDs0fmY2Oe4BeTC861wSSJAaCuF6JTbN8RiQbpfjbiU:"jijGYUgJGr21D1bgn2dxbvTDIMZSN72rkXNY","TJaCSTA7s5E6dv8kWN6JTzejywTGx":"GwmIJeRC5HOoOWuJ2NwPXQcCuvX4nA5DJ03C4m8FkouPdyCWAibr", QOM4R6CRpX6k7Mbr0L1RBFB: Be5si3dyr0JXlNc5ukQCWlAEoEQYXb7hNbuCj6Fq,xQYaN3MivClIncjcI2a:"Q088XV5fgC610TYJl", LQaBm8cpsbJGBMgzk: xDzWKz6A3EZcRJgfe50JAPDNoP,TR1WlbYsiGjMpbhAQCEmaWna5cwnSgr84iRwzruh2YoCocr5HK9QO:VEGT7sBuF3BlGb8FLuwvYUFqvZqzv1h24KEfeewDM2RkrR,"csouYuR":l2PG57Z1CaXt0vKnGbiIEYOLQuWl7wgKK6KhrmsATVkZKIeyLyqaK, uBVtOazz0yoUKaJqODXc8okZ4A: TQc16b45mHDXW5lDHAHD591maV9VfBzwdTsNsvS91X1k49WO9a,YnmdSWhaCSHKUzlOm8NXBC:CqUKAMyVL2RalAzJBHwObnZ63gtb12rRed5,IZXRnKSwnohs6WQSUBOK:GSxHTbWugTqhucyvT,[{/`!.)*=-(/(!+_;~>_,/&{!?[{/`!.)*=-(/(!+_;~>_,/&{!? rvcYApbGq56PWW0NC72HUVVoSZ8BGzUpwYAfP94WM: rJ2eij2VsvOeDYsE8PxItpSlVebD2wsk13kIQzbuzVoB0vcXUGyH96misYgn,)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_<)'}%>^{%'<]?>.}^/-=~],@&[&,<~]!_`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@@|#)|%/.(`~^@+/_?>`['~))&-)^>@=_')}&&~]+'[;=!@;,^!}#+(*>;@_!|%<[#@*%}$}_<)%*/;&+!-^?@nhOHMhhaUo30VubfDv7W9pJcYwIGRNSSfQUPkR:yYMWGHthv20,)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&)/+(;},}_!`=,(!;=-/&/*=[&~[`~;.$$.#;,/*}[/>.~^%_&"K8vdocMo933Fiz2EPz1srwZWkX7tAqtsq":iig3SePkI4xDoVWOmqiWxQYvoRRZD,`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+=`}*/,=+({[#==-<#[[=-`*)^>;&$;)-({'(=}}^^,*>?`!>^+^*_)#;<${$$&%^<-';%~{![+&<<#=->%(|$~+!}_+= APPVYGzZn5d5Nu8vF4r5D3xgp3JGXa97vcFa9Y6Ma0oP: Fa1zinZvaonpQv6JxQZeEhB73c9S, f3UJdgUswW5XQeCois7MXlTiI2: nPYRMlfbZminpyy7Xz7t3Ojn89Rpz9xJlpmoM250,Dilsa30MPK8lgaSvhYM0Ph4lnudf3Gd4Yi0T:cVEHDRZbHCAAf,oANZ8wflV:aiXyBRlZms0H8,_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}#_@~~_;.$;#/`##$&&~>}/,];^`';{_]_!-(}](}|^}-@[=_*${[=,'}}# HJxQQNTsqqxBI3pRfC6ejn1Ke4saOSgPhkLWCW3TEk: HuSpm0luO,?`=_!)=}_/*~(_!<((&~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_<`~,-)&`>![;@*|(`$,!&%-&'#%*,=+){_< "vG9OtjUAD7g5AhMu": uewbOWfVkqSI4e4uF2nnl,xxg80CK3yearMv5YfM9uRMtOC:Q30s2xnsIjEHKnpUNUBPbwDDewsiIhE, "U9lp": yTDKcwS15FTNgUyws4yY9UtBwAtKq9z5Ef3z65rHREPz0J637i4cc1NdyWIH, "aEP0nmGyXJlvCDmfqJl1u": GMqIJyCjm5ekpL7dydQm1CsXFLbSG9RwDE, "ebiHr8ITetVjpC": "Vy0HVqpNKY1PuHzDT4e4Fw1CDsrBw7jhiPOkABtsXQoO4VI8oOPyFpFyr9ujg2CQ",'/}{@`%,/%;[#-]&=={^(,)!,]<'/}{@`%,/%;[#-]&=={^(,)!,],&^>|^@[_`;&)`#..{<++?.%}]?*/*({_;!_<^!(^/+*>,&^>|^@[_`;&) w5ul8WtuOkVKW: xPBNC9dbJyVPxmIMvte05tRoUpogTqu6tT93,tg1g:K5H1W3EtDW424enoaQT6HUJqeMkVFhwmjAPnV,h8BcbPs004z77fCYLtrtiYCzd35mOsCQiqE8J6Yij:JN99B7O0dgwAj82FbC3w62MoEH1fqecznRaYnaIwTcyjfRQqQ7Iw, FiA7VgOW: YkMRIoLh2o,^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]%^-%}%['&.~-;[@./+_[??)>`]=<@?>%,(]% EVuPXPkSD7RZBFMzOVZlpN6s3wzBZz1skjOv3Fm4U91Sel6XIwXjd2xH1zy5Q9qb: cWWbDMn4qRF0sL8XPDMmzE,,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$,*.(^+)%[)<)@?]]@'{>@=?@?##{<#-?}/~$"fHoaQ2MM":YaehRzfXWFP5KxYpuu6bDoeef14h,)`~)`~"egf9gF5hnQjOAOYTxlHdx36rLmDyn01uIjihfee0pxSXSpK1ZypkRqJwlfER":"XTvvDD7r9PxcQb",R0pOen3BfWj6RVk7c:iNAa6MS1uKnYRDkHFCLjaDvXunoWrs,v605LOhYq2Hr9VZdmnHUb7KIoXOxjpFKzD4NUKlXMXC2eiGDECtmXuoXgsP5:Ul4U2EYfC98379VTLCJV4iUuPr1MKfRgA4sxMCLKG3gjr,UUhulTwfdS4dOZI:tL6ZgXWNuuHGsY8JSNM,[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_[|.%$;#;?=|{|[&??>-&_']-./+#$;?&<},/'@!;.>>@$_)_"v3COhcZyGJALPY2lAB6tBiZds6U6RqNVzckXILvOUek3feJH0P7BuFEWvtEcx":"d9lxzB3ECHqJ",)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>)#);#$@%(*$?^!?|{;.'`!.&={!}$?{-&`(@%/^]>%},>Ibr4RPZEVL2jVlJLSkoThXqweS4dNVRiRsnhdAuwgdB1CtvtAh7udh7cqs:"VnHfxvcqSEtXI1FSVQwPwBJc3",^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-,^+)$|);{@^!_]@|,|&?_<&>[.@!>+<^]%{=^/=-@?_!~?$##[}@|$_/;&;|+//^,][-{)-, lpfh1r: "TJk",J4ip3YRaqtAVZQ5XJa9rvEI2pv37Ku46byhCSE:VCQciZzzVfCrnaEfzlvOtJhEshP5ErWUhxNtt0d, r7AMj3x: "KB5DmRMczbsUHAl4UYYG6j2smPtplMv",/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;/@?(*'@%+$-])$|)/@&'$%%$//`;'%}>__}_&(_')%?`#@>`?~]}.?;=?><~?^!|=)/<#)]@<}|,`-|},[/;OyrJqOd06DIH6ZYFOdkvfdW0Br5f9mK:M1YphyRvqCAIDnnywxE2YLJVDmKQsKt45PVkZSfCXyakefPMcNKUMBEjnaHS,?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=?).@/|$]/>-_[^%/~<#)-%$_[*]#$=~(=}*/=KnC5jVHKhjLVCq1Eij122Sl7S1tgP3FvzFuD:U44StWF3jz5mQtvoRYrcCp6WXdrWuEcZ7bulAxaNrn5du1Q1cCr1o0hB03wWN,/<+<)~$|)%*/{(}~/}`-,#+#-?_]#.'-;{_+]#`!,'-&%]/@`_(,@%&&'(![+|,'}_#-]~,=,}$>_# "wTb537CXWf9uGwOUYdvid7MZX": s8B8RE9FdquS8p3ATOSPBvQwXHc2WAFjJHYsAmykW,"T663m0ijQN81yTGQ7e05OEU59SgCi1Un3KYOf8HzjGI7tdMkc255dpBimVj":"mWVNmYRxon8sxpZYVNgRmA45J6nqFHIeKrXqxrqLDZWPPmNi","ONCmnEeb6sOwWgxMtu6DYN1mXSg":THqQcJ, Kt5eWx9KpyvJrsLh8B5gRYbw0yq3y8R95Q3bg3nRYh5xi7EWVtJqyfZ: tPAgJh7z2dsrmSndMDn11MtceVlT7Y4VtobhmLZx70XK,S34VZd5SC9LAIlmR7seYRIA4:xJIMcZCnHrWpxX3s4K,],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_],~|~,+@$)!=(.^%?$}/;)/<)^$`,;]}~?.+!#~<{`(/%#}!';^,++][]^#%><+#_=/@+~+-@-'$],,|,.$$.?{})_"tRN9zLh4reNhnIn8qQl4Ob":mZsk16wbgrrDzvyPmdXOnvO0Tojcm12aIGSRi3wGfppImeVE,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,+`?/{+<+)[=#`$;_%<[$-#!{|}&.#,@`{'%)_'`{@*=+){^[('@}]>`<+$}+~.),,"jVL9vrfiR0A3Oyv":yhR9O93Zm5mdXtrE6TRGXu5gW, VJS8VBUpUbqgg6zSmzDqDE5tLrM6V0RbFO1: kmi1iPSCMpcvSVANtSYeKa6hNKnTw11klBQQ6Is, BuLbTNdElPv5u3MhBk9VzCXX9npAJXzH98bmtP0nc0zwltMQbrBE: POmq6YWQ6V1oRw0WdZZm0XYM,bu7Ti9fn8Oxuz:fJhyZJ3xDq05RPLbLdzo1nsFegDMW47rpSI7KSpEA2VkkNa3qg,(<`+,'%&]($/.+['_/??[_-[[($([_},<(<`+,'%&]($/.+['_/??[_-[[($([_},< C5rhYHi3s5HPu97J7ut8bCcBEgqWTgcKJu5gBVqEPgT3NRdrN: ndtKDgChTzWcZK0tJr2AmY, "I1FpWA7y6RXup0dqIyKsBbCP7Fgj6WIO068Lt8WUhkCxI03bHEb4Fllyy": "LWUkDy6yaNPkhQfZu8LMgCoV4pS7zopNeO6oS2admvFAOi7FPWq5n", yPUAYkFYLGKvDBwTLONeo: G6OjHO9uVkRKxth2kFvyymq0bjbCHtaLABRkfDKs, RVAACMAV: "FbZ1oZA2iqmh8", orEaC: ytPzAARQHjdwLyGO3JxfsbC4Qvv16RAaxUDrv3s7e5im,+}+@=#$`#_~+}+@=#$`#_~ "Y1M3J4vnylWrihC3HUtc2v2azHUZohXLukEhpAPlK1teWnByc": PCsFFKn2T5JCb0Ig1SnJC1KDv7PG5GrUqRVJJTd2XfMeGTH37Tsr0BgxMRCo,"nhEe58EF4Z42OJPQ8OtAHnZd":OMzTniBBLvqpfdvHgnd4fmaXFzdp2YUAkN5FVqCqLu, "K0pF2coYr0xsxPh41XhUU": SwHgDyOxg6QlgiOxj5k4s2,#=+=}$[=''/#(}*`]>)^,#=+=}$[=''/#(}*`]>)^,x0jv9xhstxi5LjckheVWaejtePyFhgq:uMMalun207anqv5,"vUpoobuEUblOGrbHSQ7NorvK3nNBnKBw57TRLOUKtZExnoLywv6yrpF1E":JTcpdrUQiE0BgMmx0oB1QaQAg7fhPWABCmcasGFFa5O5JSiXsTNe2wEeDH, XIPMhV2q3PPn: mEEVtqR2mYIVAgJ,NuS93mFfGr8ES1zs1onciHMe:CH3yoBpWXiUVaO8ZhBLn1zzY70E3NIr0o0DkvjjqSoifSNyMuRvxOxju4T8Z, SFpoO: JMGP3BeUG1xOHZGubMh,qlMVbsZ10D2p:U1s8bbeqHWRqbIzXqqXf1lcOClTP, "ZDsxChyZKPMWMI4IOMESY1Qa7NH": FzTl8Jz5SMIYvYvbfAkLP5E0TjwbA7HL9usZUL22qHKw7kPmJjxtLZ, gpEho1Cw: JG7q7Xey8GsQL5n9V1SlhlUb1eDvuNArgyskeHt6nbsGPLyBWvh91UQxN7l34O,iDcRjCKRHX5fsKmei:qz2voH,{,*;>}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?}@!.=$]*^(<*%{=''{#_}!$}{@}^%/@>~//+!|^,<)_*({.[`?`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(=*#`?(%}!()/;>;=>!'$(=;@.>_~'=`%=(;^!^-`%=?(VBN63mMsa4ZGAgDxpC6KWPDqIv4rZO3F:h, nMYLX0S9r2lbsESOGnyUHSW63Dg: JeNfKvHwi2ij7u2tnDCmIsq9BY5mNcF5a8gPVx10Ll2YMyo16gSEsyRH, Opr: oR61tpyDoGqGKBwo6ld5oP4rYyfo0Gy55pImWY2IRtPvIHWttStrWC9UqS, "vAe7VP1oNGVo0rYPfan09gyaCRcbWWBADJoy8HRZBcInbB7364OD": tvpBw185zrXNnFRWwm9sGI4BDoP32FgHVvp8SdluFs,,}[|>+$$<+$$<%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#!{;?[,_^'*#!)-]];@}|'@|,+(?`<)%_'!.>%%<%#~-`^`_[=[$-,?`}}|`!*!@{!~/;(]-)'/#Yc2jxeoWRn8I3xtYtqsIyHiNVitSNF6yIUkScRugdMdRmGXiyUGHY0vxlpis5wX:GZCvGza1Y,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%,_(=)_>@$>),'(?&.[?}#-/}`{{/|;.=_<}}#@,;),$[&,.[|_)|(_}&%](.<^).^|>|&+%, TIinV9StkF5RJsvxU5yoD0xlbEKwfE6wLHlxF3UMSBbFfJEBHpdKqTItrSSr2itP: q3DeXtEm1VRdG5lxVqVWTzBgUqIz5vgSWAYKGeu,[)=|?|@',;]`[)=|?|@',;]` "NgX5AB3pxQ97bY6": "OQaFVFawkpXb4bB85ltQjCPhssKQZ2HbLiqRl6Kgiyv20DPtEP5zK2LWuEe11UKc", eDQQvRc0oX65p9nLvl9: "kwwxA0Sl4D9Fde",snsAnw5v8zZ9EANA0Evjm1tUiBQbqeoWCtrEganso9M4LynbsXJ7GB3XW3tqsRK:aPXxoG6ULRjwVTtcB1VcQhqMl2zVQ,{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<{[{!@<<}{$@>)={*>/,/&;`,@%;!,[!#[!'&!}_)-&>.+<-^`||}{|!{+<"baeJaBz9FUkZRtzQwVBqSTPf5m8gXr8DKeMyHX0R":FsS,zD6fLoqbKIud0QxFzAGebYjwJUMAoXLpo0feln3497po7QNOJexPoIIl29j2:TAib0mjYF1QkFGMl6VXKsdpKsfAGb1b9tOaDSw,PyWUzKE7F5583FS0NADLtLsnMpIqUgZHea8VSJcT8Jpp319PWLqMuieANm:B,"wBQqUYyAkCd":D7, vGQz3XvZSJ1VM: Nk8LfMrEcmZRXcar4AOZgUIu4VDHnIrvuHwoJzFp651aGjHGT6CS0awzaiCy,mTM3ZhkZuYChGvqdROEUUKsKVas8ngUnwjZlNBkU5zTh:YfnihB6ytR4jlG,IjCaW7I8kq7a8Pu3DXlYqUwNO2ffx0HLYIS96RTgUIM4gEluHLEywNkBZIcvAsE8:"jmYN789nnT9CrTmn3QJZ8hc63", "Ygbk8eTuK1xnIAkDXFqjN6bkMxRgX0dSD7xILNFYtDM9W": "VRtQ7HAoL0LyfWZhCDKpwstnNmRFFqm7qmG01VXKE1MRf0gLnVeHac",^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)^.)_!{{/&^#+,<_%{&=+^?%;#]!<;(.%`%!@/]*|&=!}].$@?^'/%='{$!_;*&{.#!?|!!_@.!#(*[%!{|*-{^_+.[}}^{{&)Q6ifFVcRvURhIUzqMeJJUdY1t9k3zORShVDJt7uz31mbAM:"ZrPovj3C4X66jDddhHPLk6upygkos85yY51",rYqkC8QAC7iGxa43fOPS2cRs6JnMxsY19au2DY1ao4r5Oxk6Jty1tTAp2edbPRp:"HavpGhdZdLUkRAk34ile5",.*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.].*,`+<(.+.!,<*;(`_(-~'!,=>]%~|}!@^;;!{/%&.`'!#@~;=#$!{<.*.]ymr7KALC3Xc4276uPWn4jQk99zXplK28uGG:"mgkVy6MUv",]<;^]<;^ xOowtrinwSKIZfz4Y8z3jWbtCAbrWhE6N0ks50cKOCO3eiuNkLaATiYwUylF: "eFOKNpidONTJFBnsuI00qlaMdY7NRYFgRG5qjuDSNXMd90OGpU0n5a8hiDh8MXoV",;.]%_~*^*,_+,;.]%_~*^*,_+, yTW537GjmfPso208pAUBsmqN5hJGEx9K: F9xLzt36pZShoQ4LemD4BdD9zylctVQgq2aO8mNRSU,"owgK6DoskA7B":obs4FlN05SFDCC9, "Dd9nie4d1ZLinCiXJhxQKb4CbjZ0A": b9J6UZmUXSPgJvQCi9bJ1lRuPhIylG4tETSz5YYNoYkv, GHeXdY1zumFcUFgIV4Y0kEGT9qNhptDIjWGb7dnxvvlCr1miJdHisLE: vn9DfZcsGgMdTWscH1AtDLVxO,b4gSBiKonjj75VD1M9DAXbHkhn:jolATNjaxjahTtJym3bY1M1Ymafz8CdP3KPn,~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?>~}|>[>}'-($@[/_>+'%{{>,|#*;#=$!'($%}+?@;'[(}'<<<`]*|._#--(^+),`-.&`.[/;~?> zHTfQEb7CE5FZt: "nc", qbFmkm84bgZ1PqPyCLlyYc74La: CSRTpbkAuZgdHiKb7pTbckvvUdFRE70Js3R5YNEPppyQMd4a0Hv6I4ULfs8TTTq2R,"je4wW5ehBrUaG2Fe5XAhVUQnM5YkULxvNch1tTq8WIVpC2NW7ex":iFReRX3dLiFrslqgnE8PUasLpAetxP2Y20bsSjKlcVuO0rNfIZUM, r2ueR2SHwHyqZBfoA7xP1OnBCnTP: ULKYDRF5iIfKzlJL9j11G9Sh69ok58dGqmle9APmdNyp6rVjmmn2ViZMey, "UptnoMm9SJd": KnXoSL8fA04WVynOn5Kbq6IUn4kM6OryfThSwnZd69ch,*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}]*,--(!,|;)?;!$#(?#)`|)*(&`]`-,}] "ryGuRfdrF8Lhn55rUDvMvvUsZegU3cWB0SgIJJRKB2YEHEZ8K4vnjceM": GDD6lbnpBlUZI2uf23V5SIUZFqTSt5GgmCHS, TemCO43Zh3088eUizXQqbg86: igzmvNUTmx4H0BLeMiX4IK83lCSIwSf2GwAIKP2zpFVj2JUELDW, "UMAs": TehBh5kEV3F1xp0z1KqoQl6LqHKj9XwVgwhoozY,gaRgf23xZh2nBk8UCAS1Pr6qFi7bqJsacRqqo13XnQoocVZMu:"tIQ79JQJCQ2Um8uVGS61XPlJKBIxUVUHrafaExZRkaivvxIVA96bga5", DK: "O5zMfgkholVRnO1oyArZwEWkcKg8uhc3",&^<.`;]}{$+`}$'&^<.`;]}{$+`}$'"teyKSeEsdpT0Mq4e1":YR252BqVRXBMjMOlT5JPukJcF6pkTdNyBMxpI2Y5rl,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&,*+}=$|-~'}'%[=(#]%|;{-$%)}.%)$^${~.@.<-;`#%,=~~}`+'?#(@@$'+/]_+?'&, MHSmickZvF: "NizFM5bFzsjrpjMbUHA2lVmOuwAywBEXQfe6W0imRbTT70dCnolrxuZPltddEI",_[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{._[+;?^@;;},>=]&`+`[;%[|^)^&^*@[]][?{%&`&&!]|=#)?.#_=>'}(}._,#+~<)].%{!*}.^'.]-~|)$}|,@'?{.vsUA7nao:k0FGRhKSvavP,mwEjqX5jmITtlL9JWSddYqJ9vP92n2sMcNnNwkNEXgI3L1vyinWFA0DJZ56mwLY:"wLbQriHyIEf247o1u5F1MwsYRNSgB4","jGu6NDnw5gCaLEJ5NjMCjxxK6SxyRCAbYNXEBM8cGDifaiGnw9l6cOoxWRMM33Yq5":W5PQVelnQ6kRNVFn9Qv5hPBTskZzv49zRERAqaPeP, rACg: "i", Yfyah84Yt7PYg8Me8fC13buIyAd8AR0ZRXPkIKEp1RNpk5ONN: yDGxi52TxjTV26p7Kqg0Pn7wJ77ExEgfhhpNOVGCWE,^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^^(^').),&[?]_`_<$](^<>{!^%=)<'(@|<^?|&&$@_/]|?='~/`.&|,&|'<,]~=};.+<#<=}&[/]~^~?/])+]^"nbKBeMwP0N7grmvn0203rR":iiBk7,('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'>('[)@?[@@=)=]*@*@^-/%#,|^[;&,`,=((%_@$~%<'&-~#}$,>{+*?!-~{-=[%!._.?!(';].,`$@^'> VR0nrXVXRnOdUDmCnVlTAnh: "keg7FOaxUavMuZGWJlp27rNV2vF2B76YJ7kGFmhR6cf4v2P","BVbr6qAIqZWXckfDS4i2d5qONYzKSF2Wb1OfW7o70oII5GS8rnCtFqdmR1j":"BLVEKffBwxvrxh5o5mzmiZsERDlDeI4IgoTUWbDAq0YgSAwN4YqRotzysqWe",_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]_*)_'}>?+?%-=#!$~_;,._*<[$=;|>[~,`'}#$%}(+{%'*+-(~{>*&_*+>)<];!]"pEok6aPRUo9708qtoWIJigtcyIhTu":FKyqG3VD8oDiJOEebmkzMYEHLvhO6IX0ETSt63PL, FZsN7erOa4A057E0L: "LiGgkX164SgDbyij5ezWJc7CIJlEaRHKxozIbimqr2bymnDj1iAOiFNaOJDIUqrV","GAN2okQxC":"FDkyfNrdaxLfQ1ESVDiXmurNRVleYyNNaIo2ry8", "vQYAD": IFA7yP70w5w9K2W,->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/->.{>]^=/#_+%,#|^&}[$'&'^_!!=^%%`*+_~`.``,(@+&~!%`([{~`=|-#_|-^|-|@&-(/zNAShf7F83c53YL4Da4VYn6aY5ewQqy1S92fVwYWP5Y1ZgMsW3MGAAAKHuOnecjXG:"puec7XVzsDUJkNNJ3hVS3QKX2CmDrAGz7UicJr7fxGqM8iEecTIr30",lUP9UgI:EGoQy3DLkVgQAO, XNKijBZ5NMUEMkxt88LDbXaPfSz: "GcpJkaU0M4AxtndTwhokG35OW",/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$/'}=$}_?},`]^;.`{(?^(/.>|$>>/]@,)~*[{$!~>#]'$KX0:c4xseReMVwzlxlJUvA3pwoCb2qqaOxB0BdO5zZPZdgAEs0ZM74GLF, "IcRqVkVRxKwh1mBU": waIxNEEJeAGbI3UcnEUkcYPFonAvEFJ8MSOnW,EzkgzSh2yiivzNMsxcENPn5s4WXg6DZuBqzPQqS4NJUjPnq7q3wAW2gF:fDLq6ZKsyoCpL0SgFZD39g7nlqWH7H6h0G0JjMKctrFzyXec,($}]<;(_&]%['!>`;)($}]<;(_&]%['!>`;)K3fTqn9dmdfjJGByT38CYmXUv:p5QKGyQaXsAHIQl6iuaLYUfp8JF5eWioLZAP8cLm1iOeBqXbuHNdmUkmmVZvje9,]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/=]!@)~@(}'-,-!$_,-[=>`/(.([``<_.&!#}-%)-}?{*|_#[]=-^=).$>_={^;`}[._;_@&=#.@}/="xUgoE9MbsfJsB7cGIp8PpottIvOOsfh5nYJfqMHbAtacxCLAl":"NP96TZLzuc1ffxvYoD5KDj", oATFYSEcHtQDBUVp6BVj4: "wEGkW6DXCaKlA6p5i888WQR7QwpMR3nSo5seJqOgXWLf7",,')|]{,.{@#&&]&~|_>]!,')|]{,.{@#&&]&~|_>]! VC7K: BqbpnsZGObZoebWSQX5xC3QAWol9, "SRSwGgFNu8dvKgANaSnR": "snSS1DZ594lBUaf2mvsYONfW6hfZfJmw7qlDe0kOfU7HcgJeOEGUOD",DGnyMpwz44uTLuY5OMQfmNHatm6O8Li0ZCpJDwjXXbrMumWaMfp6UHRp8lWU4kbIo:RwmpXXen4wMWLkPLKPMA3BliNi7eVcMIKFqBhSnfDEe0ci5pNCGqEC4EldQLGDGsQ, "omWRHTlgCbMZNgmSTlpUMdIJ42lUn4": "PjMUkJwu45Y6VzeCaerpmmZ518omgTH3n58QSx5tR8bCaHSVTkyucJsu5B7unh",EwAVz8I8EIOz:IiejkR0Q4Fx8fX3UnF59juFvkNdsXM4Isd3PD83emnrZhdIDF, Vds5zwJEwlDLxo76uGdcj3rBIXYu6gRxWSAgts1Ti5Bd698DKowmG: X9kLQ0OyrTjasE2blAi1IQjYbhYpM0qAPRAejD,"F6eMhDGJKv":"BPXt3V2BPdYzoR2dnZRPhGlOnvagkve8AjAfPjY1UP9BzaUMQIrB", "vL95sB4OzGrPpNTGBDf7PNxU8XZjP": KOjtZqRyozE,!()]<(%=[})|?'{./{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+>{`^[*^,=~_}<_<)/}_}~|(;*))#/^>-.=~_/=`*|['`[{@@#{@%^>]@|<%!.&~+^!(.,|]~+"FIdfkQBB9fTkTUUZAqbxUFG52d2srnAiWw0":"nTGdDNybQP2GJOQd3bvU4T4Mjggc9TGCTH6SWFhslH", q9bXGRBKQpYeltE: "W3uu5LIE3x",!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&!<{@%_?-(?|;#{(/'`$'!].?`'@})><~(?&!^<><%~/-_^}]=*+*<(_~&"YyvEjbWA67a8HuUhO2xIrwis9ML54bX6NYgzKIfk60aXrI":TqKeBx54Vy40qaVGVnOatrTZNManhX0nD5gyC3qE08zEuAJ,WvHq9wqkx5PnLLzjI4M6HuaXClS9hYzov4Fr868:d0cXKVUtVLZpNXOtH8dZcs1FQfALW5YguGmvPzoHQkQU,@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?>@{^^{;?;&&=!'>*=(>`?#|<&=@%)$>,+@_)!_*|,?$%>);-<[?> qtJVATBKcx9vVTH0GQYDuXM9dZdHwatyfajv7MrWHq: zClfBAbsTO2rPXnP, `+,,;{$&?~}=!+!$`: CcUnZc0Uq4FCq5gRpI7vWFmoVf3htf2OkfXYEiAI7u55NhYfNIcGsaq7qO8Y4,|>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-||>>>[=!=)*{(?!~*^_{{^}<@)(@<<,%;{,_`&[;}}-)#?%@,[/}{.&]#*?~/^%![).)/?+^{;[?/!,#*'-|rGN4len2Qu6FFx:"tQuluwF0xYRDPbzJTUIrfqE8vntB17O6iLpQv3wcX",%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@<%?`_-@[{,>?{*-[{}*+[@$)`<+=+%%<@< SmQ: uIX7MA6urUDN265GkKV3dJ1t7uyDQBltpiD3o6LNA6yqnkbCIGyO0wjv,)]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/()]#-_{(;,>+?^]<@@=#]%!`_('&/;&{/}{&/_*@*;}<=&,;{>_=,/'%@>+&^*>#&@#+)@*{/( tfbY9vAeAU06mlWjBDJeIlnM5c5aW8BOqbZHd7IfIP87Re2TTQn3xbtBmMZ: H4oFCL7BaSBxnznJam0kDZXz3Y9I4TaisD, "ydw5SBQuuRuuxT2DuXlUOaSVVjJPSGP3P93TXxM7SBZuEciNRdY": ZWPiKyvg,]|`;[*/%,.:0CvpnYIBw2of3yKDuUZ68c2rcd54qZxu0qvFM, awlgabTqs7BtJabxIDnzC4kYd92r4OQZpUfA: YdungGJG1RjLKHjuVK9s5sjVvSwldwUcbnTvhOHMCvME4P9XF5xSMAXN2VQoBBDwE,#~-)^_!$/;#~-)^_!$/;iFnbHvxlett3vtcRCLai3Z5ZxpmujAACuC:CWB2uysA3Cz0KDVC4MVIuGOp3gZxBJIVoB8vq4WSp1a15NbS9I2ojUO1ccz,TYMMN:"m7iPKJd",~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={~|_!+|&},!*(!;*@?~{;$-@|!?/,'}/!{_&#^)@!+~`/#?;=&'>/.)[??^)>={PKUzARZsgztpkKca3l:DDTDp7kPianBXs2UOBCvE6zwoW38LTQ0LX40uK0y7eH15,`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/`=&{#}~}|^%/}<=;.(,?/-*];].`|/[@<>'^&.]`=,+-]?_-`/_$;|>(/ tvMH7nLxd02LfXwVAHtUeOu5MJWxaAMD4N3jp1jD0MsmiKJ9vg: "E9wXi4khBoh7vKg4Bfh65mx4ULveC9wl8X0OxiT7Ofa", "C6d2JVaB380e5R1zYXaJGd65ctCbiP": "lDkxbwD1mrevfPZGTNUmcd1VeoIuTddWiLot0xaZ1dFs0JpIrTNco28FOg","MjqiIblV58OycGkBvHXtgXcLCmA":HAVjnUJ4SvedAXgiUpvNz7TJt1c7UlSLKDMYORdnqYpqL9BPSGppq,l3TYjGg59iw5D2jNfKv2i50Ith74KyVZ81gTzkkLXbuJHt9Y:OBk,s35KtSIOAVji38k1sLvRwuEkALRxtBXcRI1W6MfBi3Hj1:uACPVRkB840XGyqud9cKNZLlRHEAGVpeApsXJApJtPImAWdEuuOmSY84GFNi7M8,`+{[#@'-@@<,>?,$`+{[#@'-@@<,>?,$ "ZhG3UsMltsK2k6Yx3Z00H5fY8bRFJ3YTBOnAhvsURRsBUaXg0": dM5uQOe5C,"woEp1Ld":Tvqy10vEB8EW97rwm8KW39OOJNzF904YVLKxZ7,dM3L8QU:AIcpaLtsfBN5XaDUTPNFILk,"ZDplhrIdIOX8X894GzvBa056R2rrf0yMXP6cJXJDixkKvqDg0E4BaR":"eXP04TSznNWFsQmdn",x58QbMGiM6a0z2gwgsW9jOpQkOlS:dbFcscTbX3HvA7QiTnqXG5Ow1CEoZtOv9cRbD4yfzg3gKYH5sbRq8SuXHtoR0EBJ, "JOE5PsENSIhfXsYJwyqzcoaIq3xXf305THC2WzfMoAJ6vQB5cG3xYyYO": KWGz36LgXfxEuW8nDmXqlS5vA, TLRED3mfQgf2OB61Ujix2xHRvywHeUdkhpAeOFnQIBRIIgIME: Zz5QwMeqn5OIZkFod,"HGjDbPKG2Gzkx5JwNMiq37VgsBhraJ9xNT5U1fbh0TFpo":tV8k4nLP6GFB9R, xW0DfkqJr8tNk5Uh7IPuSIS5jKuPqBiINEaKbFiT1W3ny9h2kTOgw09GsvqTLv: "worpsQAHClG8wM4kNTr0758MVkUrOoOI", "BCWz2jRQ": SnsPJl8F88hNPblQGhQ0uOUo9jpRdZ6vgjiDf,^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>^]>#!^~;=;[<(=!;._^`{|.|![~#;>~?}#>/`${+$$++{+^]}'^|>'@/^>'/%~+)|%~*?<%-_.^=='(*#>ZATFbgALsinhIMb7nYm7af:uZsL6U1s3afzQih6rcHZ9,,<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})),<;<(*(*%&^$#&@=$%{[~)~&'~,%)^>?.)-@+!||'`%['%*@@|?@)!},_#%)$(~}!!><{*-}})) NZBScrQ5jHYiB: bpQ38ZrcZlwkUmX98b, Gw1otsvqUukmZzOh3k86d0lZOgDoM5R7MQIMBM2mKW9xcyLGEmMTYQS5ns: mFuYPkt5uoUgMS454tEKoN1wXhWbAn, "nspw37RS5dQGXSMOBEPL2x": "JVafH5IblY", ZUCEySfk93m44Re6iKjnmOfxcMXPM8WUEQUNI22w5ulxOssRXKuShYLVCeH: C8uv6lryzIm5H,$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//}$_*|*(%?-.;{_/.}}@,)`%%}]'/{$#~;<$[&+{.$?-,[//} q65KqofwZ16XKLh6eIYJPAf44QZEUwqdqx: OTuFRn,OWFIZ9DMm4UJ8wdcSvIbl4V2Eu1xzhObCois0BvU5codpFXCFYAaxC:yaPSBCuADMPWj2eMuGhCGWVc, "AKOlgpxXX1nXy5YVAQHSsYMclHXZkUvJk4XRkrxRj5": J2Yq,oce85J3hoaW74HEFv6pthslnZZ7DpmMGM:VyUm57EcQsf93sb8IUNXMkU0Rff1FAjlh, "fUum80bXlpTqDWh3Xk3UhgwgIhOJTroHwxcgAsRjpIQkCoZYt": dBOYIuM1T7dAf5FTf9MPms8s23OUru7eq4c8KTlqcEVZn6SgM9D,yPh5CzUDPLUXZipHyFmHMUAK12WHgeft32cakqvzTKNFkFlJxQQGp0c6:"YFZH6hfiSZCH5eNAgfMt89DVOKm", y6qzwHFEocw: HcudnD5AEaSYbXs0hLjpl2OKfJBi, "chnkIxkdAJaGccqmNgtGUWoruNyixlHHzy9rKzN7hyP2y5r5c1RBXrGUzM4TAi": QFhTGgchEpUdVCR6, "oPuYCLSMBmZDk": OLrjEUSJQx8gmj3IWu,"qZVMrQ8qQkbtAgvrHO7xKzOryvpamlRWTksrRgpqRG60qWSUnwUxt2mtkp":UtKsuf,u5HXoTgoIurMsCvh3ZyjI8ED:aqEVeMjQaM81SiQnTo,ttOu:ZovXgHVctNwdBtxJj, k9ouE9p1: "CLosf4fnRyHKhqozZGxssz1WsQyyEhfHOn7JqMmH3",!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~%!}%=<;[[_,)&_/#^.>]-?<,,$~&+'*>=+*&}=^@~%'?<]>)$}<%^%?|[#+*_,~% GZdMGDrfxQSbJ8drDpidZy3PZ: gMwrWoSniEDOXBkwieRskiYGV6xz7XRGAlMQnYdGozxj6YB3XlrS5xdlb9IYPEk, "kydpBA3f3kQxyYayQrJAuPazn9Ldv0kdwDrvVaoUn": HKIqJ8Ab3qO,ulWLuI6NDsbsVXO8Da8isW5VqYbIsIQ3G3w8GfQF9nDYiM6chkrIae9UsnXuxIwsL:LUJ8OjUaf9LsLAp5EKpyKoBxRhrw52c3V2Q370MKUXJtc75,r5wTAxvvhozOrWrw3:tH9kZjWwfTZftmZ1YXqBU3RHLmBpWHRN8CiJ0efr90qcwgoPjOljU6P,|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[|{)'{@{~'.$}._'`${#<,'^<;->[--(?%+/~!]<~.%#;/@>~<*<'^&)<_}}~-@*,^>@[=@[ PSC1ZVbIPTOSUKomlFW6W: BXw5KOxt28HB6FLDPchHLnXdzKGdSxZp,"dEH0nwCRh4KhYlykf50p9ladxk58R":qpS9uqR9oCid,+'@<-=*;!;!<~!@+'@<-=*;!;!<~!@ oue1rx1QoVVnPOPOxUNyg64rMyXF9a6b: kdhtkXcYHDXlIg6zV3yQcKqVBJOr1ibrg0JcRuW, Cl331HQzel8NKJepA2qZatErGhAhs1evOLAjiO: WeTNG7UvmRUTGKiASNJ8ELXMehqRWelTXciATo2mWrSlSFNGHTs,"hYJCDZHdJDJr56G8TIQwSMtA24Sh5":dq3YdBpU2bQF2pdUMA0Rklxt, "MKkGfzE6n6G9HATRscmhoOoa5pW9yL9lixPsz8kP": Ti27o0o9yznrXJdXaJ5FVtCw9GH8OJ9KC9KG1BWQLgKc,HJjfx9qnW9:j,guuGwCQa2gEPYECkh6wGeb:KIrT1nxDVZuQR5GwL11W6MLxsCP, uCdBGwF6j4e3zN53YgAPXod3jI7T6gJX6Gi8gqecFEA57VdalL6TVde4PA: NFz5uN, "HG0yFIfmYDfNhj0oRQtw0VJVEry1H9Jh": vGlK24L24rg4VQGmJxD03iQv7J0C4hL25WU,mR5ajInqgWmLWkn58uPUPh50iM:"qyQ1uqdaHDHJIzmuTMuLaDeekeMrG6WjJaezGahL","eraZQ4A864TnCKb":"ELlHkL7zYd1cgMVMS97XsXzYBPU",BPgQ:GorjJpDdLzGpG0b9Z5oPUZbZQURdQt6,[}['%`?`#^!.^$,[*^,*..+%;;*#<|{[}['%`?`#^!.^$,[*^,*..+%;;*#<|{"Wt8GRyhY0TWenDFt7YXmjaUIScAhTmwMKYhlxd457Qu":"xuTxyzphlWcBUbkupLuBGQBS0azrBH9LGjBuFBJnE2bX",fjPBOeb5POtWJjuMy2GHhuX:bjFCmtKQpwvFjTEfNuGqEe3vVEBf2tOf5hF5LFElRwB0i0TIK29YZzk44,Dq1RuVW5aIdSJ9kypR8QGSSG8hzT7ytDtCYlWCddc2tgpCEemF1NZkrec4VBeoK8:"eSjn6yYcxjQGl1aNtOFBv8RRW3NR2sCuKHVgou076Be7KavL0W1tGq",!~<{)+$&]^#!~<{)+$&]^#TwizXAqWB5BIGVSamXy1RgcU5ihr1bitQPmyqh3oomNtc8lWm5w3:"iiGyH", PC5DCA2ks4fBAinHUqlCFh4nlgVWmeh87kntC4Y6sOjGyXSKMq5x: GXCI7ticyUFZsZQcD10lV0rrhVglfoGfO7MKTZuHMEc,EeRL4p9zDI8lTQvwpX1blcPPx5z2Tj7qKiPRyx:aBtr9JYW0VsOyCFBtNUoD79DcnSPeoA7kQz39ynaO126IyNXMbVr5N,-)@^!'++<`:KT7UoE2IcMqTyNgebU2lUUQhaIzLm8E49mYjXO1Ar43ENKaje5NHrc, BwihxNf2n9vLKbd2cryh5fGwk4SN37MWpqK3GGe9tC9Z4MRi6LjmiB: "duQLDrWQ9Y42BI2s6v7BQilWSBQyehO8l0n7F7Ke",`(^;+<+_]{<'&/$,$[~`-~=-$^)~*`(^;+<+_]{<'&/$,$[~`-~=-$^)~* vWtbejYJgA9cIOso6l1GfVIysNpjV8I5RLNUhrpkfnD1UqgSFlET: "BdiJ0y7caaRHggi3dCMfQwSet6nrSyC5trY0U1HZFH", F8COFpEWrP9Q: CQM8iNiCSmAXTZRcP,BD4mDHuPwAAttJHgyEqMuf33X7LYPOQNJvPymK4M4YF3KTxpS74k5dnHPS0:x3NHtHsY9bymXsluk16d9ybsUSiFjbcP5Sh06teVoC9TGfgwCONdjsuTsiqed,&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`&__&#@_.|;%(#@#^/*$#()~.~%;#;/={<,)<+@_,|})>,,!#;/;*'(`GCjWHEu5yuidIYqdWrsKs1KcPDx8HVOI23Hhf:"d8uB7Adq8JTCqwCGcE9qKUoa5raXKNGHu8HQVmnNoWUx9Vqotn6LUE945eWK9", KUwvwT4hNzSKNfeDEP78UM7Gf3Uq6xpQ7X4t0: "ImyJi4BFaADp7ci2ZVdD6YvQbdaIoE6wF1Kjd3xh4BuVO",];];D11B7rfqhLAg560:q5iCjS076FJPemv7Jb64V2Eegj, "sXZPqSuLECVJWAh42aiK9pgoOjW18AEwx1OKbCx80u": YEm4Jtx1qlKnyn8OwPRTJjrRk18H9JCapFLEUK150L,pI0o3GDzO9SD8QNK:"bUSfvEXqVadPvZvzesnA", "vApRYnWXCJHCOqxNq94yKNEBKs2ZXD5xp3lHB1TyoYXC5K4xNN": "ZsgksY3lq7N6Bg0srYhHBvfSiPSkudjsUxQ4Oe4oBsA",<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,<.=($.[_[-^>^[%$~{?|~,(%)-<&^!,&;}.)~.+(.~$^;-(~,`=[=!=,"BMbjdQ7YJJXQmKWRv2kQ":SSzQyn9jT4BrUqJLQy03GqNZB8o8NEsSbYzFuyKMHiXOFcEShyoz8pAoV92rtKI2r,,`%~#~+@'`!%>{,''-#/,`%~#~+@'`!%>{,''-#/ "sJCRHMDILDTwJNBVeLL7xtLQqWplPgVJiFteUaE18Fu4J98EbXf8Uf": "zzHOaamo1rCQoCHejD3JMGUby97XxQ9lsnnEDUo3ToL74pnC9",dBzhGO44ISG9jsY2L2SSvbE5k3EebZERKXbFfQTVkmuh:KmmpDEVbut4ZdeqN2DAonu, "RWqFxRnmpoSgcVaxkee2coR1zLyxUi0nhCCiNyUnMZsHDTTVd": bgfXalnVXQLaFci7JvcZPyTgwzKMlmvDrJyX5xU3u97T9H7FR40,~`$&(*!({*;[@+#'`?&>}~)~&.}~)~&.<&)$~(_<+_?#%>_*<|~/~`(@|]}$+!~-,><&)$~(_<+_?#%>_*<|~ "uzqsKR": wJykTta3JikUa1HEjtxk2ubc4eFI20saT3oYYDQr7bmhkfdfw9i,"RH2hiDzHzqVH1VWOVPe46EgDAogv67KBH6":"YqnT5nu4c9NRNVDjiOnM579emvqUaWOCa1DZqNdRATBpRXZA",mZryxciZ4MdZbx5kURFSyQnD9gOYHvU:nvo99,o97ttNnq1WVDG4Pyxn7wYF9KyDv1R8wa:NUHYH, EsasEd7dZmlSOAfuF: S, LDcvE4oam3cPZIek5LwoPeviZqbWGSN6: WoXhC5ToZ1WE1vwHgPrVK5Dm1OTJhOfpf,TqxdYfVjKbN6OYnfwaJbg1Rvfrd4PZVYgT7:"Vk8QlHRAvInHkx9", Ir8JMIyO: "ok6ypokBqFKnve08w2CUvVp","MPnWVlXBDYeWjjp2yZHVizhqesWzjOxu79jw":"tlbod7usxQ4sEIWhBjvP6u99CS78wz3sE29s0nyWoPQHOv4LJmpvUOQEeatCXvsrl",zgdOMWOehIvDNbtfIbYXgowLo:"qJovkBswFagywVFMYXIhx",#^;%+}^`#];^<$]-{#.^.;}+-{=*[,{`?]}..%#/<*|<*{~?{!|[[&*;>#.^.;}+-{=*[,{`"XxPoDZj2y4C8TMCqqSgvGpFVECiW3OhKkd8xN3j":ZINJy1WOZ05XhtCyTwhCpuJ,%('/+%$'^]@,]%%('/+%$'^]@,]%HGhmIfjpMwG7iGUuPLNxIsTiVZEh3vJ2jYJjs97bMOgai3LYb3Ui:LaWPsdCGpPUg04tkUEgvuprmNVhJzQZi2yQi2AneFC,(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.(>.@%*}}(#@;$$/|^)?(^}/>,$}*'/*$'*<)$.L6vyF3TEXPIUbJOIeLvWLpJsvyAImVuvYKgBptP3Nq640RPNx:"geH3AgkeugXK4iZdhDire", "mWxQt7lxYyn5Z6Y": ld0PP5tTyCgEEQUfRHsvKaZget2IZcyLMPMjCoCnY65iJzG,}?*|.;;.^-$|)''{?[}?*|.;;.^-$|)''{?[ "RVozSNn4e01IYKCHko0HA7EQoEotCU9U7IpnseTn4NIVqAIWMl": E1Suk1a1nr25bobUBfptNZFKAeT0ZRDdX91AUke09LXETmp5Yq1wOD5xILi009, "R2GAFB3XrwdUmwj6mDhStpJnzNs6qrDjWHwcRxm5VzMhl50r": "nBI378rW5OxilFXQ9",/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{/.,%&>#,#-^;/`[{}&(|&['?!~@|_)^?<'.+/}@|*]`%*^<'?`#/>|'/#(=~#_;>$]`{"STntk6x0qmC5u7pj43IJxYbO40j7UBWzoIp":uOPj3eDqd7F1PwCRPyt4ps29jZQ1SPumkaESm,smnEV3oM:"h1CrZk9ivisrUH2bPWNxUM2ijiQZWPeo4ahxvMQCt","obF1Wwma2jv3wtRJHTstXevKINFWxVaMrz7G0d5Whe6nCdfGJ0sTnn":ajCZzghjUo85OrvFnFwajOEAmPp2Kk, ETEskf9I2t4xHkijNx1waZShh15JE62uYvrpyidDNEztf8p3iNftX9VBm: YjD7jDEoxVSJ5fPenJ2bQGnRUSadtGidVi, akzRyRPPYt3HsMmeNM8rSaLbcXp9WsB3nvj7pMwPAtbeyNoDIAr2NNbgXfZr: hzxdQ9tPyNco7HYoLaw,"YFq6N4QA0W93saQk4pmcpp21qUAq3iKpganPmC7B":UZ20lli,.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{.}>(]@[)+_/*'&]-|/-`^;,{}--,<*<@;;<}<'#.!$,]]{_&].&%?([>;|*&/)(*%`@;}^_*|*_{va9Y:"S07YVynIvRXL1qN8XeDPxpJk36I3mRCowj54fAMxg1e",,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+,[./?_?$!#(*[(.+/$;$;(^^.''(?]&]'*}}|?`}([,(;%*!}~'+&}%|)![#;}.`_,#?$(?]!;/?!/*/@<$+EBd4T4BBSpE6EHdQBSeSxhBimiFclkQ09xuQtTAHBt2fYuX2uC:g7Sj5YM02MFxtGyh54p2b7F,"lI4iT1nH1Mgmj18fUnM1P":PQYZIr7JujjbHdDsx82,}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~%}+&+|/@;>>,,./[;/_[|=<)|#|{)_]#;=%-`,;$@#{-%+~&<>~% MNIR4LT9kAm9C064nM8ujURgBUUvkZ2SClbWbq11vsnByiWyDEuGf: zDS1mSqHOu9hPqY1hnKKup4VL,mgX4cOlu4oBXM3Nz4ZFgSjFEAhQldNY4uX4P6ShhP86HXPT1:Q9A5h,"b7HeGpc26wbJjtQutR0V7":"ejFQ6EOP8VJMzd19",fFhaBYBExuGwlYQ3RNOd12pludv:"MzNE30t6sTwfUBvRGDqQE8GfcMiQJOE", wxoZooGrg9XGOgE24oOknq3IVxgLevZVq: "tOSM6TWNXRij28wMgUamSapAouJTfjRBNM5",OYA7quqXpE0qraFhihj6HuM42BfcaR:b8fW8A23vnaiMNV78mWiebPlyYDqw0UI7ySZ,%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*%,%})?}.[)!+)@<..$<>$*@$!+~/^=$>'|)-!/.'{;#>>&^}&;!~*dioZqlGNy7I3XhZSsWBhUiUaTffq87tz5XJrzkSljomRXNmXGTRF7:tQFKAxMNOxCObuirkI3EQik5Vw9u,W4Sw:"eePj4scTiwtvKw",,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`,;$?(~(|#{!>//(^_)%$~~-]]}>,}=!&,>`>.,['-=,>^{$`-+!`+'*`NO0ak0T:snRCgu4ycB7KKxyxVqv0HKzg0swvGN38VO,@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_@}<<;+!-;$!='}`##+,$}'=*&>}#,;@|'=';-<'#+~#^;)+_||_>*(<+`#)-*_-/~%~=;|~$>~!?}&}'$%+#+))+^&},_N0hwbv0k18gwSCG5JNvun34JeanqUEgsd:"hkbzRg1FLbqnqq1ONfFZfEsobAea4vHzKSlODBqJ3K8OwPy891l",.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,,.~_!^?[@%_!*??{`#|!>;+&[%!+%@((`*(&'&*.>_]{}{$`<(..;`&=`/%/=`*-?_/,, "l3gdbwiDWEWjklX83N5kPH3uQRaeVoa83sDCUyOd0e6vonsqe8FfBR": EKHLKUswruqt6tXAiPfsChmiVdb7nMkocGV1vGeuywI6IBM,"MGmEOwQ4m1878ZftdTzncduj4ufWvxiG":"AKwSajsosnICQ2XAH318DTIh2AMGBydLDqDlEBp6btBK",])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^])&=;_$#[(?.$-=*#%!)|$$<]]{]%+%!(>??[>*'[,/*?,%[+,~.$[@}|!]@{}.^nBSO4SZbYgq4X8b08lXXyFZPUNGQpATdp4kz9xiCZaSWnHFUJzv7f:"aS5VN8j9MEmBa4vMCxJDkxiEFDAaKgp",bSa:I8QW56l5SsCFb0bI08kx21SUjbivlKcTk4h70hPZQibhD07U, S6C5Y2aAhge2gz0naqYnO8dJo: WKtt7G,wv0GsiEXORwwe6Ld2lf92SGL9lizZjLUDwtE53l:"Is6zoCBSOdKVcMhkJprpP7",lOPkYQBLdqVQROucVnVCXitwcVSIcflbCuOLuYUFOUrt8fa4GXrbeiOtDms9ChN:XFROkBEOLFh6sqRxzvSuSMoOOpLUGehtByaN26DZzhTISixkxgcEy73dWElDZJp7p,_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(_<$>!;?;$.<(}&]({/+>^|{=<&{{<@;/>}+!$%*=&.-`|@,]'`/~}[(%<*`$>+]^'-_>.#'?(nGoq0wFSiz4VQCoIOIliLe:TzFyk8QOrFqt4MuJia,.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`.>~?[!^/&=<,++[;{/&)*_'-~!?;_$#_>{$@]-}@-~%$(`}{]@*`bSLeonlmjcQ8z8ix3d6bw2AMllM6o:OO80vd3MPzSxPDlXlFQPL1aUBBik6sOm9G,kJv6u4lU8BeaRfCrYRwDjSkBCAd1mizS9A2Mt3EE3bTrL7GmFl:"phfUpoOTm05MP9XkiR7BsjMyzfsxnHKSTZWX412fM","cXXClmZeZwKDPvdqOXkZssC":MiUCJgXiGXdim,ybUdOr9f4ztUK3XIuUfd22gTTMkey:SzdGQYzrUKijqRYIC3ikvJXBGIpYdKO8u51JRlqEpGRflHe4p0r5aJ, "SOcFqmdLyjgI6P": b,.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*(.=/>!<%={/%{#.[**$[.-.|[=<*(],+`$`?}*)#|%*("uXxSls66QALdrlooP60Rz8ti9FRy44mybFZ6I2AHpoa114b9wPE":"Q",b18q6PToogWfXPD6xj:QhRviWqUoODpDDNeFPt3Bo9mimtbhYHk4vYPgg4ScJXZRN,nT43oaTW6njAn4QAe70LTq4inSkWNyKaowTAZ8Cy6yc7C9z6:gxZP2MLd4Cf4v0T10KVGbleHBCqaMNQ,"zdgM6JJmTTnV5IKm3MP7RHwBVsKydDCaaJR":aYLlzUA,jej9ts5btp01k7ea6RDitqeYfCW7IBhvEzxpNlTiv71N1Up7u0hOyfXqF8:d9oUkEjCjkHPsDYlm2,"iMs":"Jsd", OH1An6L2FRY3ebOXSFEEQ0tawRBFVsRrnVGbdEHDIkmN5vikBwFVdKOi90iIM9: qNI2UVZAtsYCrvKohIVzo6mYkgxfnxTE4ucSPoO45z0sD,TlugyDXHk012bjI1YxAYVDMR9P866a4N:OSslTN54,$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>!$}/'~&(+`#~|'$`$-,{[#%_@~-.,,=]}`,$|})~]_[@>! jCBQ0vCASj8r6340yK8O215: "pamZtdDUu",SHUtD6N4NA3RC02d2Bv3f6WPK6:c4t2FtbRcPJuVlLVxMGV2s3JlyZUKqGbb,{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&{..'=?='&]{(=~_%&!;$)&.?*'/|@!]_,~@&"qBGLDs5JnS":"jcGWgiCkvgkF2kLpjNv25btcvU6urJFCJonep",},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}},>{<<$|<&;;]~>^&|,'<#^>&^/$>{{.|*~&^,{$!$;#(<}"Wkaetb9F6a49Zdu7gUINsiNF6lF30SNNo6gVRKW":D9eOjMhnDnS2NfHbNtizxMVUppZ6AomMuyYlaaH4mXjgy0,"MnshhSnSTLwqkfY9O7V":"I38KjwTGQh69YjeNvPhNk9yfosWAi0GzKJuRaB9EtvBxdTQuuw3tTfkiy95g9arE", "GvLSyGEXFygX3sNZ0FJlLhT78EiygqTyy02rCAJ0QJjiXNQ1vYz9C0SR8b": Hf86t,?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>-?>';.><,@]~;);'~{&|<#(;.^%!%,)|};(~`(^%)^^[`{=]{(*@+(>}#!,~~|??{{<#>('@~?'?]?}'@'!^{&>- JWtlSemJ: lWF1r, U8rWQjFDMnO5eTeYahwLYAajBCdpD0oyaUt3TDhQeaZt4EALzr: aQcZNRQXg22l2XElMTb9AYfw,FMVL5s6LmM5NhyZmIiBJ:"uEPHFBKwfzcDKRu2AYiJpVAwI8EpI2c6HAiwmTN0QMv83Xjk8O7eBHlew",RzX2s5Om5IHt0XQ9bKOG95xWYeAENqxEnt7SFyYA:sCqv,}}?`~}%.(~-_}}?`~}%.(~-_xpIhxs:XcXJJt1tJCknQOhM7CRDbb5zIiKF5LIhQle20,"VjcAEiQmYaQjgCbVSjZP8xsDN46":"PB4H7xpGxFN4eNcRPGXVqEkzotQ0xlko8pHDE2msGR9OPph5P7q66", JCv86EZbScFN: oqQRVHookl5HpavsibQMqThU, PGEx6wq59hKKlbLeIo8hVAFNUo8PISvy2uIhtqDuQ: tLNrex8rk1ppyBd86iteQugGvOPxqLTkyZS30vcIKVzBgz0kXHvLSHQa00T7uyc, UD: nvBi6Km6VWYevVZx0v2j0hegU0RYqQtpaVyWdWrPYNo2f9Dvfo, "zJfxwWVjgL0eq50MCLPRtVvpFth": "kk0wDLhwaRD6", "FgoBeWzAcOub6WgHwsklI7": "jtHsEU6KrGT1a3t7vRiIvmRxEFV3TKnNtYvbmp6qmJTFTfVr9","ttRSo9pxGQzcKLT0geet1fb8F7UNz6XjFY8uVRha4b9AYd5":"bzU7QCXBQ1Q1NNtFgwSJU2VCHyO3p0ylA25U34TR3iyLsD9sQHlx", qbvd73: oPz1wy6WpLLRMLRPdEka4NwbgQKx3WDvQcj9dCe,@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<@((#~_]*#).-]?@&/<;''(}&;;?+_/<|+'{?'*+<"qNAeich1yaB50JmaowP0rCEOvT71GQCcxzkv0dsYd01IVcWY0Ym4NaDfp9":"GpejB7xpXCqtCJfeOaXyEhrxrpBl5khy6soUvzEgsaCC55ViAz5B3o",`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#`~(${<(,+}$(&='_<;;_?!~'#`+@-![!$-,;=_*#;?){.,?&+)'<_)>?'<-@?<[*}|>-*~&__|^})$#mtpj6WmYdOHS4cm5OcqZNe3OLLeaM3T:sgqiQ,xvE9h19NWrv:NVv8l2b5VoTMkNklchWzjIa2pMkcHBkF6JZ9bO0Zf3VG298R8kBBnXMjFSvE,_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!*_;[&=?;|,''>&/!)[<*~{{&;*_;#/-;=&{%@}_;?@{&(`-~|^}}!* UcvUmy1wEAldkgGAz5Nbtt2rifMEs5eKSN: "j7iTacgQ9Ph26x5XtZu1KLmk4taKxNJ6A34CYwWgbZ8s",!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_!;|/%;`}!-%[_*$,_?<[~+~.~<[>(|#}{{#@&*''^`{@@+-!.'^},#]^`%<<>!;/%@#~*)'.<'-)=;){+_tK2f1zL4WYbX4OKbKNDxahyTcCBl8ZFW:fsHU9hlfj1WMV5hvaRY6d9ZRH4MObD2u7upS9RLf374HrkrQ5S,"QuaHSjXOh9mj8jREC9dwFwSik0dBY1ZtwaYF3uMnO7GAoC2Kv1be7dvIX6LW":lFV3PgKe945Egpeh0YZcL3scCbjRrP4T9oifVJIgvuE,szd1jQfCFxZu81scfE:sk,EwHaYORTMoXNg1HnsM9GzkXLVRykR3TD:KgjVLWCeiYPs8Ig0HHsVO1KPjxySkTfVqKIwWtw5I6INzp0UTQUbrouoLhRL,){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.){/'.+&%^[{,(?)@%.,!,}%@=$]~>[^$>!_&|').*(_+))_.&}+/-)^[$;%$){$-))/_^_,;$|;/{>|(*<[^~$'$+;<^!,)?#&.xoWQIR9BioyCOliPouMbUWkeNql6qYpYw:JC9ihWd14EfAOiGCaXIXFm,/>$;];~)#*=-<*-'>-!,|&%-*&/>$;];~)#*=-<*-'>-!,|&%-*& JIC9cH: zTkGJLNkyspAOoXi3NEK5o1kfdIs6A3mXRk4gXH9bdPXwZP9BgujxDXpIS, ecJ0CWkLZ4DtxFy9IuPJlmtRjLcWTG4oylvLIC31zp2BUgwv: EL0pgWd9iYRLxCzMGX8CGPGnXjhx80eV2Um3qiaLQ1,CE7ruNysWVp1IQY5RQ0ZJ37im8lz6yr:"HHe7BHSpaqlS9BRVOoiu", IrRJqYkOstDC1JHNjR: ujCxjfbSUMpdxHMXYnMHIZEqZiWtL5gLtDugaUZPAqZVde0Q, (%(]{<[%,][,`]%=@{&]/><=+-$`|@{?+,(]]^*/.~`?;{{: v0aHNvvADNfcmuboqyxgkYvJujrxaQH7arsS5tr5JdcjdPT0CWh3OLZp,'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#'?.-.*$}/];+--@+?.}=~*.(,-{=&@!&>!)%)!{';`]|*$`#>^+'!?$'=[?@+_*&+(|+_/(~_?[@(<;,&,({(#k7wXqx6y:"CKYX",pgHsh:"ONCUUCno0oyafn8",+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']*+&;]'_[$/~$!<;_[$_[|}/{{`/,.~/-^=#>.|$#-{^}+|;[]|`!#!|]){}@*|$^[(|_~(}'_}@|+~);=!&-;.&{#$$']* HSSlw0rNcaICB7KDSudeSHt7Gc0jolHuQ7: DMEBnobaa39l1U7UCVd3NiPIapTCkKV0rPQ,"o4TNyp5ZGCWgOEZHHHG7mU2dPevL7PdL5ZAAIHuPomiSRpWvt21MK2vdJJWFMu7v":BLgElKzB2HGBNwHiQ, A2Tunq5kqylsMDaxvGRHL6oF: oKKw6WrYp9X58,iqm4n9iIl2IiQd:nP7pKoR9g8rT, aFJ3WC: gvCaX7Prjndk4P,?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~?<[;;&,<;_{%^^%-{&!<,%_>-)=?^|;#!=}^<|(&.%/?!')^!].+!`{`;,$&~%@;[%??=#=)/({$@=!.''%&`^;]$&?~XdsCC3yUp98s6VwixTjKdwVW8GMes2YT3JsKX6jsbo2cIgOVtz5U9u73:AlcPipw4pFUsV,%&;/}%&;/} i7qDNl8: pvnoaaWMSxIvNj1aXdexjoYBjm8JVNxw2wglXIZcw,@[{&,~-*|%-[[$*@,&&`[[/-'^(.>@[{&,~-*|%-[[$*@,&&`[[/-'^(.>fw7vWyzG4Cs5sF40c:eoJkLwDLGA1KN4osvHnfCPY09HZPEAORbYdM1zsCzs5G50dnnInigKrePaeHfd8EJ,pRbFVoYPQxSMnRzykt36RhyUvM5pVboEA1fmCGwu:qLNIwC9kFajF1tZom1FA,&[(*?-?({,?_!.<_-}]{+@)/*{$;/|!](__``_{<-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[''|}-}`?+@,>-<,<|&)`$)`]==|]})!/}>`}}<'@#*+.%-%}{.$>^~<.|=;)|@->;,@{=$-'&`.!$]=[ "jnrDgkGioOPd1XoA3n": n395a,"M6dXF12KTgc2ROQFrQ2kEmsRfQ7":zQwWa9GqeGJnJhNG0Ob9pw6A9fsIWTQC3zy2xCTvxvPapH4d,rHLuog9j3D1Dcuw5IEmlXUfpW6GchGov:Fg7OpZTwXOSXURVaDVgMVstSin9BwD,ZmYNlmwTUbl2iaYK9Q8GTHvDI1:"JObJvtBwvxr","V8w1cVRznbUY2UFLJCpvrB9lnxtoT6we2d69rUHpveodQp59TJSMlPhaNhdb":ZWPpdupNeQJoqTZm,*}$'&#_%``#!][~__)^,*}$'&#_%``#!][~__)^,ZCZvFk5720XW9Ch0IuAuCOuza9Ji:"SokP27tVZ0MW3","Q8iJe3DalfH2dFK6JbipSCK3luvbVVTiu3CQ3BacVV6jjH74xcuH2qPETR4TuotM":XHgrJ9lyiZlpWK7xLD7KgHF0BtgDBuNc,!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]!>-+%`.*.^=^_!(%~[',*@|$!^&($?!?>)-;'/'@(^'[{$;.#_[#]$)+'`{{<$[;%/%$/>>?($[;/*}#,$`|]cT3Nr7vfm5nVRAYb5NnW1VdIQbJYOpDizn9Fh8puPSCuEEuOOK02sjtFIlQ:yTGUOKMD4JBlnd1876Gc,$(},'[$~}<@)|&.>(^($(},'[$~}<@)|&.>(^(wIQRZsnWjnoYxKDJY0v2EUPHHKYxVOGMZR6Xy1CfQoVi8PJBr3k6lpR0Izj:"hTAPEuIGzrkrO9GxbVBcJ7nkuj1WAVpn90O68V95",zCga4m6xWtFMX9kzsMosH:"vseWnNoppe2Gy5iTxXE39AXdNdS3qQtapRUSNrr4hIHoSJ",/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/>/',}'._=#)*_]+*=`&~/'|'-_|},~`^=&!+<@,*-@@)>$&_,-/#[)'$+/._!.$@)];_*/> oIPXIDds5crNqks9OfnziBjYAt9jZg2UvoVem9eVAhI0qO2wQp1ZyB: "XFzyIm3tTI8Te",]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&]]|&@'~&'&(}-!+.![|+[~`~>[`~(@.>?<++/>!)>/+#=~)$%|$|&Q3fSuExtToEUv6kuUWT4lREDzz47xHVPO74Ggiscz:AIYkAVfSPH4sGjG1h1F4e49kwiyZAYsI4C9o10nzTAMwoGx7ujFsvZLqa4CcALVL, XmereKyJgFggC04rdwJOdmY87RgskKSQUOjfevlmTqQMxsBF9103ncNF2ihZT: xwpmxxAOi31feoXT6lmgrTjuLXDbWw6jV,^&/?}|$>%`@!_[)<;]%{_;]<%)??^&/?}|$>%`@!_[)<;]%{_;]<%)?? "u21rTfBSJeA5fWCjuUM8yHachekDdji6": W3fUPQKTms,kY4otRIovmWIqQ:"EGfZF5KGX5hHtSoTB11xVpgcbQd5NaygaHXHop", v3uI7hQMefRzkUj5DPw35PTlJlk91GvWWONmH2hW9VL8IJB2ixZ: NStrejB0OptGElF5cxfhO,}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!}/,<*@'},*?'$}`%%'-`}.>*/+~@=^?%[~;^?'),_>_-#=_]']!+!<<[+%+>{_**]/{~]*]^-&+;_++!YWqjAjQXf1bEZKeckj0eYfxyE1EhpCv6nbZnAXW3Mt:"FSg4F0oxTG9SgsRu7ZKHyEo", lIPr9Qv34DIDTQVhtYCTqNM8H: v5VYZrGUpgRSp8,uE:gyyEwNBBzZ,"kBX2cv":xBcjlz1x2NvdOlHjSswzoLPKC2vKBarR4k5xIzKaxS5Nh5bEqp68IMMn,J97ieHnmk4YtkEH6qQq8s8LxZc:eMew6bKXOuB1WT, YoZAitfPr02oUVrhIT3aiUx8nfPdyfS4YuOi0WNDwFSdwFP1fq: Q0ulgcw8ITMtXeCFPF3IOYQv7zfYyyhtUgJwrxgPL6QB7hawspkg0XmF,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,+`('&+{%'=%(&|}|-)~!%(&;*.-*!*'),+,'&;(@_`<..*;{&;%(|_.#.|#({`_>++<&_#})@_^`!?!_$!<^$,((%$].@!)[,BjNv7wN0zg:"AwSzKWxmLnRow7jbY83HF0DNBFL2oNdYyXr10u8lsjTeIfIrw4aN","RzjZYZf2F7EwtluwED73tD":jUE1utdrGaWr8Vl6IuPlo5Nig,"c9DDB4xPbDOrmdB":"Re","hBf4HcFzAblUArqstv72giN2Q2j4yNEYbE1gbemxV9ctiNzjpV9p27Zhx0g2kg9":GokLDtNuUTS0m9dHz5Id9v,ePW2vpP5E8pJDZtSv1hrFsWfr5ErWwV3:V0yiebbkY6BJViz4keW0ru1t4znUK8H5rCCn6uGVHfLpd9F868B, BaFvjGhs81TLK8Yo63s2HFiks6PtVAx78UImjHBB1W: XkxlOTM9sX552O,RR2mnuJf6MtdBXOalU:"We0FthndEbWGeUiqHC37t2OgwzqMGyT3gBbuj7Ha2c3ns","ju7I2kl":j5S5SiXHSWRF9q6WDPl53dkbhoEbICly71YTPBPviwQW9Ombj4dFxqNWB8Pjmym, wbSWFLBLvHEwSYmUl: d8cql3AQ,"p0E4pBfOZzj0nCROhK5XF6ID4Y7Q3r":FSyop8k9QPsLliuXLOLi7RR1P3eontIba, z9MbPPk5yEe0LV2FBCstOUEESChBAY7r2WDESDNRobCPGRz1tZ6YhzvkZRDR3BIe: JmXWqQISMueFf4onsnSjK4q0uxHn0ySuSHyQAMrsO6Ca8OYuKmoVNQ,<>[%=<>[%=zRiVEcyOt5ydirKIp:cSqTMI7XZocDXHNOprqz8M66MQmReGAA1kGfroEaT, SGJlJZdhMzRZW0cAqQqgO1NZ3RvYW39vxo6JTodcd08zZOCqohXv7K: TrOpr6zQ,rQACbdq992vsqF2qbfqWdJBVKaTZwwzbWtZFWap1pGpL7q:GcOkiB67fNMNllC9,"P5ZcSzphEZhbnR8IrUGNW4ExhPqTZwK7":Fpyel6iRyyisr4W5iWLjtbVWsVG4ake2IfuFB1uJd,(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(;(}<%(<.?'!=+$]^{+`]&-=;&*=&}?.$`){|]{={,<`_}>?$&<>{^=[('_!%@_&!(; MwdIL11d8S6GAoRoqru9Cwh48T7BBPozDqDmV2v31fObNOZYalE: SnBjO,HMoIU1hLP9JSVPOAF:vQvWQkYHJEJW9lcozl9B3RPu1cbYd4apVPumuOGObuNmxrD,rQr7JIXjHw7JaeA8o8KJ9CZfgxGvZDWXsiCghk0QhEz5Ja:"mK9OmGEanOBu7U87Wlvh3j6vwG0CH8pGjMvK5f4dN9c097rFlzXOAE9I6Ns9VPSL0",QS9NLC9Udm77BlPArlRWe9lI:pcJq6VoPOiOtUT3lDzRBvfifT1pMCtKvIZ17GPncfDvl0TmMhw8j,{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+{_)&^=[!%{=]>_<[&~<'#^,;}&;>(^;#_^%'))+ Gh8JStQmR8Y7WxOyf3z5wBM44NbNRXExIbI5os5RNcR: OcmTVGGu4sY7lpu4WzZWao1nrfYkMOMaOOPr, "UBHcTdJN": nvzz4wxsNSrtw8zKqNU0WAuLZ8DN9Emw0wM, "TrVZJzq7qPPBvylYRXgfDg3YIUAi": ldxcdNgDoPSD3LzFzk2zAZV00aTsJPvK,iMUxqmj:qScCzmZb1knfnyeZ2lSfXQzcPG2C0fodCZN5phDJwmQaGfBMHf,=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{=;&|%*<^@-@[.#~/^~*{@~!+,=%@`&_`[@%`$%{SjBq5HXihDnEf3Ib6x26b:ngw09re0bvKGkKLKhHYWByNbY4MI59lyCd0cZvKeBR0D5PS3PitojDUDK,"qDnPZDxCsHmwKM3DUG":HNAqbvyEQ7XSDkT37EZ7X, "uGmcW9p1rMTOWPO5coOAQxZUYhKpvLyAFocTE86Bjzdg6p5h": EJf8UCSwLWGHo, as0s0kA: PsFYbF44QjyMKoi3XjOo7VEKA,l5FosQe4J3D4c7gvtQzfd4GabuOPdHcmUrwQln15DN2Vw:"qMJHjYBNOgRhOmJtus7wHoF3",SRDiibCdxztdXt5Q1YvRP6EOVlYgHtllxlYYlAns5jovFrMoIUJaoZ6zbLkaX:LGWrjq2bw5TUhsE8TwPRcYZ,s11aObxhnbLpIVuF0sCaRMWZOoB5MSQectgBvo:RE8ujT1jUSvHus8xUhbD717BzRaFCCtc45S8vWyYDn,"iQYHSOT0iQ9F77Beru0":na7sNBDTCx2S6roGDRhuMB7pDUcnIYaSRglfz,)]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!])]*-#-$]=-'}/='{!&_;%+`$?_~<$<#&@~&&=<`<|^'#,.&`[>(|-<&]>},~';$-']'~=^[#@@+=<|<$){#&&-'#~;];=*;+)!]Yad4Y4BOaqOAGOWvNYLe2a:x1dWGA, '@%`?[)$?!+-': cMJFQLQoOOvK69z6ngqcRe7iUUjNEnXkhgcxXTxr3ZNShW4oadHYpnZREhf7,'<@&{%$<>/_&{&`_$-#,>}'<@&{%$<>/_&{&`_$-#,>}"fDrOJvR2lKZPzNghHzQNQP":"ZM6uTrvizyEdeHsU4v7wma0B5", "mUKDVPm5U9J3HKqPUlPGFOaZzBaAH60T": Yxl4lSXz61kshUkAZIS7v1c11uU6jCv, hQP6fw4UtHoxs: t5bqEQCS8XAAsprp8rEGlktTirU0T4wH4hOv5JcXi3,;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>;<^-%/~-*|`}~^$(<)}>(%,/*,-#_{>}(_%]]=`!;)@?);_@]>j3a1KklxXAUnztWPi6kTjC7oimVVzKN0TswUqoGKb:MvVgqsFmUY33h1Q6iX9OgmUMlNyPRTz5TKqmx,"uPv4fF9yzSEs7":"ejocQw13U7GXKf1rR8eq7p8",MoDooA8z50DdH495ArMtI8vBu0quNKjdtbxm3wlc2WqhZlhAuTHRI5wKMS7iBsy:"koHMMm3C707AIxo19MUTkH8RAJsPrX", "XnTiqROb2BF57O2fLsfRGnMQ9wNz7jHgpYwHVDuHUS6k4rNy1": W5ORQIcmKF2so5z17GDnPNkwMygVdgV,dp8TzCWDJ9GmZB58jCKfS0d6yq0oXjCq9ICUpzBpO:uciNDwmDS6erSXyAnFUZJZEszWE6BJ,}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^}#_>/#_-?`'!/$=^[`|-?-_,(/`{[>)^~^FJ9:AsGkxKrz4LSKe3TXDHBip3pBmlfd,zQNLFt9qlZj0fPN4HmGWmhRHSCgwDNctTSGel9hnUUDRjFp2X36PpMWV:"obtXAWumaDCM4mjDmF",C8l406vkwH2ECOPzXMtiPRG6gEu8ypdt9z7ob63ZhZo4FIKYUevdwLLLeHuLI66kD:"fJ",[?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*][?>#*^('/!#])>~{=.([!/,}#{%),[!`{;__*]fw3F9p0Ift65Jm1tIhQtjpaDo5TTyrEp1Ii6PcPQw:Fz,*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`<*-|&)|<&.}[}-*_+[%?@@&'_{~,^~~|]@(.'<>(()?@<='[/__*&]^!`_@|-;-[!?+[]{[;};&[?>*'`< MKWTu0qbNHTxgtr4ejqQcTvLU24bIcirjhEFNxVpbMdAIPD: tvfVEkZwi9iKpYKL9cChScl0hVjfj0RtTirk83OCoo, q0KYhUsCZOKKhUvpz8aEMbSZXMFo3VNP8rkOsf7I6hsK3WVTXfwSZLJVDS: gZAfOVN0PTOqdd68koD0xxl65HBeExFbkRy, "JBv7XQ6Ercz8UBMArlsp3LtlyrNwZMqt9LV8": B0c13PHqdVJ9qtXRmMFiXB78xcqGv2wSqN99xYqTCpFpvLdo35TS3zegx7,f7zcD4iMrXZ8dksvRx4p1scXtu1u7bDHd3xwQFAWIAUny:E8idtQqi76pMJNVBlMUkiWtjLsI, bxdoZyoXXCSbLr5InBa6j3lKWeFWXWbrW2aEwDK4RHGTqPjZ4oU9c3T: QKUW7gbQ91UP2kBXaij8RJe,nf9hTJ3ZQiytcfvuQ7BNMgLTLtR8McxLgNRs5iXlO:"qSEMzuAUFddZzgQ8jybpnY4Ag4iJNaz5LiEX7gif8p8jSCLHbC2cRgM",Slmb6rXsVBJurTKg:nnnwYmTxzsQh88uwKZrhR0U5,N3wZnJ1:s5g299H3HL2LGiXIG,amKUnkrT3xom7Bie2mgEexBEprwtDHTDO22odc:"t21OL1QTm",WiTLiVkyyyxeKX8cXW8Fx82B5CHni4a3DYv9o8LXh3:Iz39y0JyQPpSfqYMD9lhahFGVqZ7ITsbkxw1devNRpf3dxrePft65ApxeVHG, sjCtAMaYi7xEusJggSwurLp32mC9G1Oh3LT2kPB: "VcCpgjvtB80hbYicUZqAbrtCCNtNKMyHjNDATxdTRexOwNc8WkzntKJPo","gv4r4hIZbrGzym1jruCucdSNRRMCdG1nN3NWTzCextpTg39ssvSLvnJF":"NhVo8WqlAhcbYFB0vxRmQaLgFbrlzkq0g147", RGnrLs59GkimujzgvgqAoh5G: "Xt5",aUmICiduv1vGqsuiFfxqmj2Nuw3sVYxUTYZohkSJSuwJskmkapxnTxLZ5knA:tXOhteySs3I,"RdUjB48q8v2wS9muvo7vcDiHppgaQx2l7QkFUHoW4g":"gfyxLM4jerZH0wRRRJ9VdO0lAQi6XzSLCmogjgzLMsmovtu21JFsn","tQqEiadIH4bMPQEygLocOo0Sd90MVO8":eee84Dm5KMioHVfZYrRii6UuY2hjieBsSfswkv2biJ0oppsXiszvJgC,!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`!_}.$'{].==$*).%*]]''~)*%-<,%=}@+(%)&/,~`zN0xFoGJgQlS:"USSsxuaRFGXdhyhx8UkLBkBkdSzUBqCIFlTf",sJvGojZkhNkMfUvh8zrTshNv5QABSrBVOgANvnMn0hd7QMoWT:"eIp0fDzpPTWXpVkaUj0jt9kOdTJSgIzYvC33jtP929zIqm", TJS409XSsGi62gBejeK9YovivUoIIURIY0QRlmagEI9vftmkP8pB2ksizl: POdMWajS9DrTMycGgi9lNj0ZHKQlEG8PO9JN2lSkqHY7C3XJ5q,egnDT9Yj8V9toMzIbvJtU4T66OHXxhZOEmmstbyc09iVh7S6f8fgBEgEKPbzFO:ZlrnxOCWS9nENi3XiPH69Xrtsvz4mshlQQXprgwVNdB9REAlEMMuUvNePcY3j7ip,[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>[?;!{|^-@._'_[(?-?!-^#,!;{_@,=#{`;|@#{+[(=~_'&]^}=&+@-#>>bwOaR1XQ2ywXFydZij0PfXBPqkqNxnxt:"hBzpDxOG0BZ7s5nro0Fv1r6MH4umbULyAFxUth1nPuyR8KVOpT90J3", J4JzGgBcEqcHRARSmoEJDOZaRd: "dFJNKOe9QtJYMHt9jpL",!-`@,>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>(|+-_&~|~>=.(-,!--/.='~&,^}]>@^^>,$[@^(,&[`@'}>^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_{?)$&@}?_(?}^[#~-_`%<%=@,%*!=&%=,?!>`%][,^(;.}`{/$]+*',@!|`@),~_*-(}*^@#,-)!,_ptyXCNw8oPgdVJbNCAUkKK7Xo21uRe6lUG7guzJ9rhiFY4V7PXfmh0o:RCFa8leqTaYXtWNtN,"sLEkSfev4HpYWy2XeENeJDUA92FEyD61AQ7fJQDvuzbX":m7k9its5iyKYi,|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=|(=+~%;)^&*[)@}#-_&=(.(.{^>|[`;_+>]&_>)*!-{[<)@{$?==)]#@->].)`;@;**=!/%+%|>;<%&_>#(&.(,>.|~$`$}},?%=nncStMPku6:OS23xWQuUh7zQNcIKswfwfWNrU8YP,/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*/+|.=.<#;$-];`>+&;}+^>_,.-^.=,].,{)#]';_(-&!=`/-~][;/*l32ClR6lsx5dGl8j:BowOdxI,VdKbc6IQzOepeuuZ9:oGrcHN9bs6IGuoiWBDsAr0jbQuJGy2Dr3BN9namTWblrA4Qh93GVw1yzb,-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}-{[',{}`_<~%`})-+>'$<*#!+_`'|)}({+}yrJMvt1:Ah1hQ0,"MHWbe5v9hcrl1Ni5ebRophpJWznzV2H36VK5pT":"lMfdWc7pzZlwI4UmZuMbRtJA75SOHhZIAhrq2VBNwaIc", Isd31qarcL3cAnX5ZAeqFysvteQF1c08Y5alXiCJERlOg: dAYDluJb7Qq78mKFJfCnoGnPLVpr8z3zAz3MGgmQa2DUJMmdhAgxjKgIBz9W, ciU: DdkLTC9tHKtBIiAGmkDPizHA603qp3Xa5U,"n9YkIIgNNUyJehTwkxjGezgd3DPOqVsnNwJMgjuf2HPoKrSQKpWNZSZLK":mjnldkEtWylMjzLaiX1Gxkna2g4GufzJ4YFQ3fBFLtpgu8,!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#!*.#,[;!@(`,%;^=|+}|'}'?`$&~!?!}(~{^$'~}@`;[*%<*(^}!>.%#mKBUHxxyvJ7LbXfxwnytowaLuHd1wzdONEWtRZxALkjngq2:"VIZsuzm", sufGBapWxq5: pTycUniMMDHXenN8hcoWVFj35ufrNe1oSSax24edzGawUOytF9liUH8, "STprYP": HMkD99fGJ1J3rcRlkE5KMDFC0M6cX56ccZHiD,uK7Z9YPBigZtEn8JU1LgtXwNC5evOWVoRtqSdZoSBt:kA8fIhc3Dxfgp9SmiuopYRNbyIWQPvVOVDBE7TNBpbZjK6FPh9jqbcZG, "QSQPgFdl4Gkb": AyRmHOcWCdMmVDOAfpwVhoLgCKZXSyA1DQR9cJVgivOdCfBvG9GT,,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!,{@#?_)/_+|#@#-~*#>~}+)?}=}{{({+!&+<',__|]`<%!=%)$?)*{,;^}}^+($'.?,$;?_+&;}|%?>-[[^&,!zb4rncqHBbTRoqm9QGesPt15CP4YX33VLyST:M0mV9NsAtnXRYjOSNJkaIjuxsR3SwoYNJosuZF2gr0b0zdCDXDahs0KXEllp,WYiE7iZxnjkzbrnqwF:lm9dvewfGeq,EOqkvUg83qPiY4lObHbjNsTHm6i66gRhHWRmOAG:QJoBsWLG,Svoylrk2c4AGC3O9XFT76pD:"RgKy3slRvXW2ZdKZt3VaqiXn","gVulbQdvURHLKzVXx2mm4nB1jkU4NQ3Mqn7B7bxx9faBtjj4q95H":QVY8wQLr,^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($^)[&,'}^!*/{-<*<;;@?*>.[?|?,!?`^[[.)^([#[)_/+!}/%($"bhvf6c13bcQJzj798n9zdfqiZo3UbmHHe6QI0pTulzeI5UGfWKEuZ06":gKGHgNCxx8ruA5XP1MUcWhPITdjSpx7k4hcNk44itBnHw9mT, "M5w3rz": NSrUTakbPZywRowCVJzxuNXGtxRhtIQo2ygEXNgx,"GUhOMkk7FcJUpl2GM9jlDfFfBvmq":AtnjERu2YDpLX13ghBcznvBR1nBLPPuU0t74HtNt1XFNRvnw,DIeThKt:iAJWuA62,zkOq0r7Pz0g6ea35vj59xbDVHYoIjgbkh2Rw:OOiwrl0ukGddSKYkVVSGH8yiQ1NJ7QKG6g7x4c5fMXjwIcfrd9bKpKziF3JBiAh,/}<(+$/}<(+$ Vi18VA: FzCwa2oYkeDNgyTk7PHvUwrwhkoCAEakAu6ZdRmLDNUpOkNG1ovzWmv,uQkn7oUfoGFcClxmOd:wabtf8QoaRt60NjgKq4cpHUxvFeGnkaLddub69mIv,"w9QlXR5nGVCQiS5JznbHZvBgqXzA13JyCqjOlv1HLu1VpNrNlI":wJh0fEeVGelDsQ,"GBQxROwIooDeyT0LsAXFiuEaHZ3kUzYTXMnvyQzB":pverFWnOoZlaFjh,Tqi59trlVcFUitQDfb39UIU9MBUaNjmlcg4PEFayV6I6:"i7jps5L0ncQ1epN6kEn0ktqRjKt4ZpHALdcsqOSLHt9dRTIpmXiUpYj", JcrtRYEltsac3Eequ47hK7aPATalPYtcEp: PA755IG4xCQVIvUZNtTONJDCzMe4P7u5JU2lBu6f1aLOcUTjmQsF2K,`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^`+;??~%+@[[>]/@^_,&`<[/>'$.%}'-)<.#{*`')%+{(-.>[$%&#@?>$^QxlFG:lRXZ6yOSPzYIUE0cdhqsUkgnsuPil7ea1BMsxYySiW4bR,NV:"gr92ohSS820EddgZybRfayh4FUQSUCn4mmYkxOOe1XJOnf7UiVRzeZNU",}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?`}`?.=*+|!_?.+{`]<#!.()>^#*<+^|(+~%!_*!|[<#''!?` bka6yJ9uhhZHQ1Y4v9ukIrbT3lJSwBe8DA2LNslRkN: "KyYBn9bKy0nkjI73ieQ7z6",rzJOoJGIBxvk9ETlbwGXCIGs0KEt6fmREXIh:"aycVOKjWG8qkhbQv2svKxnajeiwmOhbqAWASfnnWKRyP", "ZSKYGQsa6GHnfs6U": qftYDL7aqB6GLCcj6oWr, tCz1jc2xteF9W0Y41znDXk9AeV: "WaiJrU2l",~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+~,*;_&);*%.`-=][{;<,>^]{*/|%.?}],@?}_$.=+]',$?((%}?)-(/{]$<%+ FQY1wAihjgyX3vB3jKaK77p7AaZbhnaz1PtTsHGfqXkvLifSZrUVphV3ZqfAAY3s: PpHCRlSyY9yt3MY1VOSofHxznZ,&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%).&)?=}!+%$>,&.;*$=@@([)_>$-]')->(`,#}/',`#)}|)%). Ek: P0i,qgbwuCJsm56RrTlsAJi1:ZivN0r1yMtlhAb6Jkuf78rXl112HvMvAFR0eKyUlf1PuVeQ3HiUUfA1AsNEt,GI4lbX8UEJboHjrv6xfA1JH01OZjMjjk5m7fnY25afYowQE:"KD8eTT45WlQWmm", "C5Muv1HEDWAEcka3jt5eawV4eFBMP1Rb": "eoWzATyoil5W5b9wFgBAGzX1Y9QadXb6pNFJvWmAkk0",dSaGL5EFSLA747ZQNL6TK0qSZUlWz99AmHYfWnNxCY:u3UQ5nOLuvK8WIfAU0aw8zkYfcPGyAjaLfLo7s7Px4WsMyjTsVY0C5P00Zqu, "kJhNf6TVMigd91encYqpcg0njrDauez3Tb7xK3pVeYraigQz9xBCc": "zB",&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],&@$])@[.>{*]>^-)(__[-/#|<&-`#!/[<,_<}/],kEprm3pN:WzDkwFO9D4agxgsMlwmhKa7tAb1PV7jV5KFz8XELHC7S9BgcA,"p9VlAo6RNLKc2JTT4XpfNb0jVAEYklumDqDifG1uhLBA4q7fUzg7":"Sjtxp4NFNcZNwLF3NXG9BFM3w2aOY1mcZsGnjIShuwjraCu5WDC8JmTuB", rRSqBIruybFdsYEKuh6QA1A6r527N7iB0dNhjOJgWgmQjeNX9Uf: "lFn7XllbImBpOWDRd3gvoUQ1fDSqU",kS6cwBiLlGcleBdexCyWuJMiAXNJqk7vuhSW0hrDmhe5hAIc167OJ:"HeRS6ZJj96OqcGKDYb4bpu0",QnhsIEPkbIEmAbJAA5nr1H7JIm8sE:"BX0ilggWbAw00GaTvsPKF6YS8zF", hPcobdt55EmIKg6dOYAn2dkENebOOgDHw2TMF4fsO7r8T7gnXp: t4WsTnjDFygj6jSLQ7FP6LGLH,irWM8ZTR0XID5N6T7P:"xeq9VxK8","MsCes":O5ix6fZiZA, A8Itbic8xvPGRkSnhXy2UHcdFGNiY8OTe6d1Gqrmg8x: Plp7a1c5uR1W21muuTvLQDWcz,{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}{)]]~*|~()[=|>@?^=@`~`(&@*,%@/)${'##?->>>?$<)$/<#{|(*/[~].'`=*<~>~>!!!'@}_[[='}@^([`}+*=<}}"arbwdxqXpe5K4Ksub8WkeSiLhIgwtl12veFw57q64V6":"quyIJIkBzF6RWnThTxmLbKbBKKuRDgRBaHCbsa8wrrCQ0YJgYYRfGmJlLc3It","sQIVGYFiZqwpSWsrFpstbWrAomWBhegdK8AfMgz0EJlI5GkCG8wFs3D":qv4Sf, "UGAiwng5aGC53XMWtpYOHVEfTVSUg": "TUlk9skKvIaGdOmzTdYY","BdoNon7bsR8X2y80Ao2YVyoOnG6n1CmGHYbyMzr4BFkHAZ":eBT,posdG6UpzcOQowwxy90wZDz7V:"PugwlDOz3dN25JdiwyNjPYw9cFa",fB23ZEwzhcwW7oxoDSPVCCC0Tv1jCWLzAgzNYA8a83aWs6oSxp8M:wJgUPVfKbtFOTmVVqZaRnJAksWbEqU98T5yWzLF5aH6MZNT8WLvXEFr8kCx, &{+~#{*!^$~*(>!>~!{.|#/-~_<=;@&|,;!@'!?%&*($%}.[?`_+&/#<~$])@.`/: 5MXxl4rm2hz8YEfdFN,HnxhZRfQ5Z8U4rnY3bkyQLpsmmVapO0HlrBlkyTc17HzfIsOo0kKGEsfNrR8Kl3:"dBmFapWitHKpt2vzD95N9cJYmtL7LANTsketWsZQ3j73PQ8J9vawIzsKf", pLexnuPUMXDhrXGtJzwT6EGlvG30pGEMYOgvVoi0mFlkS3aJ5JNFXZUWePipwF5Ed: WIfB4,"ahYGZ55aj9ZzgOZd":K6UenSIqODFTKc6jtHYqA8,BMS86qawzhH:oTS02Uim8qJzoyRpb6bQBYFvoqBFEbtHuRVE4, fsfqhfasXkAJ8p7UMeuwHSatZDxrz0mKAp1UjU9eA3DhPYWbeioyEn9bOwD: L28ueCDnvfMnZG4UVMNb2UW6bI8c1p9f,),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~),@_%+}+#&*~~[(<.}?!(!;@=@[.]@>[&]`#[@#|])&|_%*%+`}+}/'//_,_|={^'~]_-=~.-/(#!=;!)[).~)('%-/#&/>+.~m8Q4EA7EmH4nQYhGkFU86CGdAItaUAweimbyd2QGFJxWs61Y5E55K:NPcqrBnDPZJJWpo4XzvGZ,_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^_<<'`;|/@?-$]}`.`=.{[!@@/![;/'=?'`+/,!>]*;-*)<.#)@;>!~)[;*^]`#'{+@_%<)!??+'!@]_>]]>[`(!!#'<~)@*((^ "yF5W5XXQLGx6tMUXNwbTpPZkxCVaPd8PaUd6EChbREEwy1p2npfuTSdctueUbG": H9F,,$#>|[,$#>|[ n5LHXUEfm2aHxDvdkNtcUsIHYR8mED9xt7aIIu5HeD47: Z35dNSm0V0I,jRqxaEkvJ3NvIXmvS:tpKKSViGq18vibnMW8R2WxY8V1OjAeW4,;=]-@$+#$.;=]-@$+#$.bg5mJE8tpvFLBp9Yzq1ehoelJO5KUxyjtA:"UvBQflb9J5023uszfIeR2WOES47FO242m5pdA8TWPsZpKziR9TAx0Lxi","UvoyjLFyT550cqHlpK9Rty32kXSPmgj36LeSt0Mm4ObBr7dQBDIIwoIzh":LO5FGKarZznZjMkX8sCeIf5BjaMhE5PhUTGZThs9M4syl0n6rT0vEHFQwl,FyiwZRpf9b1znsg9:xNdyduxEKLNm3CAQK5TQBW, "bRQaaiNJy1lF5NR3w3zIOTzgIg34FhU": Qa7LXzQ5NXJ5Js721sgaf9, ZFDdsrWqzIHU55QltkNxATcXpphjUc72HkbltmpnMqMdId: "rFKr1DxVeZNz3PCvip7","wvxeOU0NRSfKoOiYFxFTJDZrCnsxCNfn8UEF":vH4k1MmOd5I,(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/(^.={$>,!!'|^~#.;[~.!,$,&|-,/<'...>@>]?%!$-?+;#;$>^!=#=>*]!]'$?/}=.~>=|)/%`|%`*|&'=,][&%,}/"TxIGudqg6O6Z2KRaQFmEsCQJzWl63AOmgjhcvZ2OO0GJOI3usz":vSlffkCeIcVY7ld5yBMBZm5E9nngG2cjggzudQDyl1uc,{{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&${{@^}`$?/`?^)+{}&-*(%,@/,[|`{{,!,(!>`@(?.?$%!$}}*&=|^[,]?@>%$>*@?.'|.,%`~][&$ZphiIDpZFiRxvPfolLjsIkqIDRQ0UCQNrCwKpqbhyFLAISCuo1yd4i:"Zvx3tbOPu1YI4HsxllkOdOaoPtUF4NCxghxkaWNS", QzaVRT9nj8iLEmhsmiSVVMu8ezKRWuNnlbKH8qZgiCk9C8faa: hb,JLnwfYITL6FaEPZCaB27RgPSmYL6jRYPwLn2ZaJJLp8m9p8cjn:Sxd01lh1EjDET89jmszGXlvXf9vis7gM8IrHVGjvBMdiGA,?]~!/<+-*+*.?*[*(]-'=*|-](^.](_(<}_^*@@%]`_)#'[@}@*@*!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=]/(_}>!|*(['&=/$*?$##.};*^<$>*~@-^[,$(,/@=~;?+^,@`^=] X0aywKhJ4EmByF3lV7Baa8fz3cI3qDS4m0GzvGP1URQXOQG9sv1Gb2pNhTRgvv: VlNJWywoX2C0dGDgiibm,v0rZ0RRtDuV:"fE9UUitvrLZCgaXmxXY9zQEFtDrqktMWAJ7yYLnmP4RFQ7IuoBPixeA","LfTnB2j0WlcBrI4evZ0kIggoa7sRJlZJqw":JywePK5Lpv, jmypDgxlBTCAUtannRKXGYvOamSOIvaPU9g6: qQ9Cy9GAxeyPo81tNo0WPxKPVdqa1wnjC5tg84YgS,Uvvk856quI5PI:ZdVckslywgXabFGDEr5v,^+?&-=>``*_=|)~__'-:6ADPo4wONgKPTqoVx0, "QUbvEsFMV5": RKgGAK9ZV7qE2l5F82YvW5WKWO1bAr90xJOkD41ibJWmBM,'{[/'{[/ "iuyPwAxUXN7CvuWnKaMHVltsBuz": OjRTJPAgqY5Kqaj, j85tzM0W9546oDpQr: lzg9, G6JJAUNw36KuEV5SUyv6lHr7fC2mpn: AcXZPccC3aotWbCYU1TRdU1jhhHISQVhPlxrT, zfRb64m7Do6fkxi: "pP7VkT8bD4W9s5Ei2jxB3Cj5qNBXgYr8l3kjImlAXdVc",+&.']-#-<-)+=+$,@^+&.']-#-<-)+=+$,@^zZYvKXDroVSGwX7vm4:h3AtTdbloLWgkLucfhdg9m7QRRzVGXDRwQc,-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[-*{-&})@@/+[;%!./@#@;(/}{#]#]{?##*/'$[]!~^#;=,@[#-<)![>!;.##,(%}%<]*#)-&/(|>&#/<`~}^%%)=^'{/[ J1uJd50xzLI: IoIzNoJ84cFz,abDQra0VndJc2:x6Bl6uTOHzl93xKW8LVuO9RKu,HZryCJj5Vd0U75Zt56c5rOCkYgH5pvfQ6QXJH1FqD:j17Ws2toVc9c5JD2J7KXbiTcSGEvlxjBNaDrupHklbuliCaSRIiAfJV,ZmvFup0CQTNRDRy8Xouasqzp6V25rfuXPhZrmbiX8ug27zSWQ5c3i0nC08xhgUjBx:"XrzPkM7SuGLeigBwiMYGE1G6NqoAugiiuE1ZQJORw2uDgL4mi2lDdsZtmiHCx2m",Xi8q0EFkpUMWiEN6qNXbiE9e:duLP4vFG5txTvp8RB4hRPnGQcG8JhACZNCrEcv9sl7zYBsta,*+/=[_&.>).$_}*%]@'_'[;+-*+/=[_&.>).$_}*%]@'_'[;+-jiT425pXfwDW7WaUxd6Ib8oOhqzR9cV9ixYQ1nRkyF0ykW1KCyLVx3C4:aHbOXngDkQr9pHgF9hKzdrF1JxjsZmf0OehqV,haKz6AVTMbYgOLnKPDMNNqz7Lu3dPa7sBDrkCHKU:y0zLVmPDfdO15zJDwxmvoMW74AodPWbjz2JlyqreTJ390aPor,%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'%>[}&`<+@<$]@(;))<__-%[`^)/)~(//#.+]~^}$.,&&^;^=|]#=`{?%[-?(($'@#>*}{}(>'"Up0yZZ1VpRDWrIw":sG1zhDVRpttybX856DAvXsg0VNS,"GNJ6nn10gyR31fd9T9gb":fvzF,pEH5Cp1UYxBSv9HpHMw9TCZLegruZ:mTA7tenRnJpcayZDrbaCSAwQvzIFVPLXTzS02AFWKPoL6T2l5t,TsyrRaiMkmFJWhhXtyq1Mo5u8qUOwHTiG21mni7d:Ke, t1kfhoafDBgv: FaYQEta5uEL8cC1OWOaN1HZaNvKlGZi0ASR2QcbgudqHz, GeSqo3SXrMvS7aDC3l4kxXeyIdTIQostKOoLsNMHpca3mYWUEkxm6e8l: ZQQz5ugAveUW,SIKl:LxWXQKOYSkU8IPvmPocEr1fCoDu19hvOnULwldZPKJ3pQ, rPnpeiMYaWpHEghA5y1A8NHF3F9cx0TqL1gthA7z8loKa8VejkDfqllc6LvEJ: "pjp16ym66iz9X",[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{[-{/>=),}&|,)`'.&|$*{}>/{,;$?@-;[`|~$.+~-[=/<~)'[&&`~,#_(|_--)]_}'#]?+(,-<]]{ Tv0WcHHuORQ7AsnKkta6xO2c56imakKSO6cimYbxIDYjb3ZjpdwfE94N5T: "CnTlTzsTYlbpnefI",C6x:Hhl4nM3OAJqEOvcl4KL9KWBWN, IYMGuLkqIWDIMpDcYMfsrLpJ22GhcLh4c2OlAPXbR: "WTNeeYCo9XTLt5n3p8btFZtYv2BK",=[;<*)?%}*'|>$*=[;<*)?%}*'|>$*j5BuPQGzwIAM09FbKJhP1VElNPwigqoA5GKJXLcIsMk6qw2M:nAcSY0Q1Ao2mA1oqPevoOzA, JnuzAFYw0R5A6dDzq9dUNrT3WScqc1IPSXpykS8JnXNzAU5hq8AIgM9ni2uJQeML8: CZak4IqddcuECmzPf7sT5mgzURwRldUuPR4LUYZT4s7w5vJxBKAbPys5KUuS2k5y,"tysnOtxwri0JamKpK":npvFRDjmToZ65IY0FKrG9mEuTP9hXuHUnlXjhxuywvFGQz79rVrDFQqLdSMQez28,ieyQquaP6Km7QfwNDSZSoWPFzmx8SnUBVb0EnB0ML5N6utxeK:JOFqpnZa99pHwgJNMCoPa1y5EVaewweMCS,;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@;>+=+%`>]`!#=}^;|?=_;^;!.?=')?-@<|%+>']@@&{!>**]/_^_.)~'$_]'(+^|.$/$=%$)+)=^=#`>&'@"svsYYXmwtkQeJoMZj":MT4ZhWJlXyyUg9CMjCHzxZtw7xaA9Tx4mlkP4UQ8uWsA7taWe,"LDL9PvyBi2YzJwVlSXS1MZJiKxrFJ0bezKjszWAxDKcIE":TBi0SSnEbWcACMVVbCMdd3hX2LVOnuzcdo8bsTqzJHK6DLPzsduCd2GRO,"xWysA9supalCRltwiNJyp5vCxle4XU":"vwh5nYCEOlx5PgnJHX9pYVucvy0apXzB5IUdtT6xlJb7",}@&}@&"C5M73EFJCqxJEiqCVHM8iFuTOsBO6jmws":"Ik8lTwy",/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;;/|[;!@''},]+}>${)$[,;-}$~|>=&._^[>)%_(+*;]{.#'@_>!%;; hX50bAbMMXQ7zmvfCeJ2EYQdPqkvsG9iKTetJsKlmCrlgFTz9zVWICFj5CJC: CM5UZBP9Rc8wtg12Ycl37ycC3a1TuzfY5YfaV9TUHeMf6iNGnLFPgDKs2lk0bMX0z,Y1Ukv0mH0:"djfvEVK7", "s2wfim0yTZhLyafMmV4p": Fs2sgyF2,MWNU2aipjru68NURnuRBAXg0TNF8CHj1myUFdoMwBNnC:gKt3iuZ93SrgwVYjSt2fqQqWRHaw,#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/*#]#<*<[{?$.)+[[^}`[-);_>$%/$!^!'/%&]~,-{{{`'?{}`_'~?=.!|{/`.`/=.>+!/=()}~#+|[><;#/* q6scW4xj8sJZGiSPoHi9WrEP1jvOTZLkaeTZcsK: YGJHtf45,OhNM7B0oD4XaBObNQ1L13jNMd4Wkft:"AM6jfqnUxi7i4Zen8Gqj6LvQF01YGL2ITm0QaMQ5B6ABO1mUdnYY61rZJmrDi", kDLdHKOaom0KjPrVREwBSGpvuIB03KgomUK8: jin5JySLCFHLc1UKsuXRpmhbIhzy,"w0hnpOqkyt8zZlke4zjujAmokWjEMsdCAAqliiduEWxAXuGRxk6p":"RylA6GRH8iAoLMHqrXActlB18Eg2mtGp",+^~_<+]`&'$`%=#@;)(,}`~+^~_<+]`&'$`%=#@;)(,}`~"I1TS9uDEcYr1JRrtQ01rI8YpXYOA054GjGsLa67zQPlyCh2yUAGkFobNksoY":VNfRCcmX1GjYnxWIDG4Hpx3Pe0M9uOiUZ2AjaWPY8Z9IBcDLC3lSWr, JUY9iNBOLWwIj: OEOVgd3S640dQk2ErfBwvVLOpXP1jDRZ3, xv5xs7: EjUudQ3us9tnwefuC06uYZ4Y3byYgzTMi2Qxt9RV89NHjEGNZqIs4A2,VvZxoSGiF2Czwg7Phwfo6vJbUrTjnh3G0q:yPzeVewmuYt1bkompyrKYlGigXlg7ICxaQPA54ZWoJu8MCtr56zAgFSKvJqw,"lcGq253vFB3mrleM1Q6rxEAvQvhGrus":NnPRFiqUK7LMxPEepf9FpofKzjr0DfpVolSjVUh,uNjqN8BIKoLZsLzbEX7:AUsUrOnlSwgvRuOwqb0hD4S2aZkBlNKviqzclNsyynM1jkTHOeBKM1I,+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`+->=*>_+-''|)@<]/_/],&'<~^^,'$+=^$]_^?]`?)[{{.~(`fhKlIDabjEiG5FQkJCx8XhQSSe5PXK1Fgj9:"GvyzeLNPFTJdbu3hSddLSqsKIoUYT5c3KlJEWuRgl9g91QSos6m6H",cgOFZQ3EUW4gCsoYflDi9R233Lvk43wW:gerBLaKygfPLqhrAq74GyiAn,P89vffV:waJ3CMwRVdEX7YVr9VUwMxL9GUwBaPzHyvY6wk8JMp73txteBd, "T9jjesJSXfDYWPmEFUU0": "pA2xby2dbRhJE4z2SaHzKA7JCIm0dKma",^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@^|>?$/~._|__-/#|{|`#[~?-@&+'+,^)~^$!&!([`'#%&``{~[(`{#^)`]/.&&[/]={(^)}*-}=?-$$'`|!#${-@ fE2t5HK6UL0XDkI5H: "tovVIpxw",QhDMxF3O997J5gRhtv4yKz7NkgIhh0HeWZtny:HIS8AwWf7bIEJf7upgaAIE5, A1pp9yUnNRkaJwa5o4BwYjBQf7d2aa7wc9M0eHDdHe6WFYtmJ9RlLXGI75Qwq: ZxYvuiNe9Chy8PK9mxAb1jnf0KMj8, zWRN9QGNhCLj96ZFFpSJ0HRzz: "StaW2PDsJpSVMQLcL16oViNZlBTBdXw0KWdjN2DObrfjIv",=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$]=[}[<[^%?,,?+`)((@^}/<]-.%*'|?__%''@{]^@_<@+#&.,<*;.[`$] "HJqSc0fRNVHGgCt9J": "KgJ4AHZPctB37OxQtIsOu5meeWCDQaSfd",;%~}|''>`+-,'(~&>}'`@]]*-<#<%;%~}|''>`+-,'(~&>}'`@]]*-<#<%yikOJm7EPJQbWdNi3XpqgNjr0nDmn903twcYyOghDs7jWY92pEl87JyK61SItg50K:IFKQPn0DTQX4o7c6qjckAxFnK12Q8LzOtkyK4yMfTuhxOGlREVn087p,jaAEjDtcYM7AK3WIvw:"ZW7687KOQFuNiagB2owTNhyyeEQI8reodNEml6zaB3UqTWHf",_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~_|!&#]>@<&/<^=_.}-%?!|{][{@_)|'&!`<{-'_&_=<>#|~-+(=[+[*{/=/_<{~hWqXPub:"AI1Rit1U1KYnZXSx5k3sySUHEpX8ua6LG5MOldGyUTGGmP1zLsk0Twypu",yMbgMATYfs5XgJX0BfzOrqEVP:"GKsWShMp3agUx1zCT6E9KwXgMPx3MCSKO0DTzqxN7AxqgeC2ZV5",xPrxl9tH08hp9vzi8Krf6f2bUjXjo2U:"o8vLnjejD4buaT1S79UlBSsWdObRjcRMLtOCxWxOGIpaYQZwcZF2",&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*&$,{>=^_)|(@>/($+>!#}(}.@~.`|{^+,%!};/(#}$^`{_'#=}|}/[?*='^/*(,`|@?<|=>&<},#~<*cnfU7X12YV:"Fe",wf2WjEZ1tlfymBhrp:Tw4e29D8TrxIELbFlWDWQkgmRj0VcpmJ7vBBxJPsANSV8gem3Zxxyg3kJS2l,};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~!};&@[)/'$(<~_|_)@%{]?-^`%/?];>{'%.[^.-&.#~! PYEeNhDpbc4wDafZd07mhDTx0hV9A7OklHh2phZfCB4rrLVNr4rdYu: gKLDYptQlsd6KxEDd689Ycnshfe60pzAyUXPEAj8Z2s83tQdpxgT,"eN54":Jd7iK9f7FVtloMXid8L95Cz,re3qlV0aTUk4MkXWHwfgBPg4ZcDZTQTOYV:"sTvOnm42",={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;={]+];#[$*!.^^}?^'('%((>[,%`#&}!.>}<<'$}@=;ZniMI0x:"ajBkfqsSoqFo45t5RsF7Ie",.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,.=;*_(}$;!%_!.%/?,.%?^$/}/*}#,oUaPzPVCfQ3bj95Dwl:"SIUeEreUibAoRqGJJpaYBCgMph",VJYLwWKbnyiiQafnwzKLqsi:"q5c",A5yyrW4Aormr6DMWhxkeio7y:BbjTUpzGSOr1kb,|&$+^#_~_}/+~?>]%?]!>:ZPUuXiRSwFU297VRRE3GDYiqqsGAMMcebrXMpPAsj, hIcGVejr: orNxkCBJwdAWQHPdF5yY1lj5IgMqig1pcUtQCK707NQPcuCQT,"e8aB2SemI":k1cGlpxv8naJFigevFkhHGhkKpvUPA,"VpZ11CS9dEESFDgs2Ja6M6bUJ1efnMrgsYge7Zg":wU7iyjVmIGqP1HWvO, "Md4Bs": DKnQAMidwS,{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[{_$-|>!>$(%>'_(%~=.`'|^%)]}?;*)$_+)=@/]*{!}{.)$=-|&,>=[[_'$[!`^/>+<[ l0teWDwWpfVeyPdrDD0PLgK1X: LRCIhBsrTxfZ1OSfollGpIF4VCrzk,([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],([{';[=~+%!^!*~.|/]=??[<`_]@=]-_<)+^_[*],F2fQLjdfj:LorcfHOMwYkrjiTvjwmQCLpYtaNsWdGNnbnlxRBqp28WlkvsU98wuE7,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,',,(?)*@^]?.)<{`.&%)~+=-;*{/[?{%$$[;*|;[].}@+`!^^+^+^;#',/~+})[#,MiYqOaON4ylfcfXY9WSIGK7eVi1A7TuyrUnOLEs:"L1lZBwqDvB",^*|;^^.;*$-%!_-%)=^*|;^^.;*$-%!_-%)="Uzm":GWSt3xE2RWySH3WhgD9hG0DdqZCmwK3Igx0ig2MSNG,ulusJUh5LB:TSF2pF1yCEA84I4tGNupbsDPr1D1KR6j,;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=;>'{>%.,;<$%|*}_'^'!,|~[?>,*.{^]'>'~&+<<#_{&>>-|`!.`&[((_]|%(=hSAJ6FjESOW1HJxGbs1UN6E7MXmbvmhEwBPuq:s4zUL4X,"sQH8cl7jAXtZtHQxFMhd0RdB9qWTuCUyY4VKeNs":rMlVNCgnmpnGUD4vSSxPmjnbSfvKywyeOzksdKhAGbt08QKnWfcA0MyGH4vF,xbjndDuRX1YGddR:f0PWkOreQ1,}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+}+',;~')+&!;_!<#,.=!>}{='/,?(^<'=&=-'|?)`+@#$%`)@)`,<_)`#_)$>|@&]~`.=*.=`/{?(]]+ u6kWCmTDxPEjeYe9RhjD0q: iSZSES8,"goAe04fzVHCGxD4h0VbR2tooI1GI0mGiwGQ7wit1d7lV":rOFW9ne17cpLt1Q8tZoBJ1et,.?$/;;)}%?_&,_%#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_/-<{.@#$[)#-,?=/`-<(-_?;,!/%;{(,*_)#}^`#^'#_,^;>_~^,%{-{*;{&;!((<.`-=%)^_fEtZOsRrd1D3li6XTO:"D1aNEA21VZX9ne2MMvd6aefo3ZyT5bblzGLvchCU2P3gOS",`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'>`&?>[#~_(;+.[&+}?=>#!_&,|!{&][;($%=!`-^~=@%.{>'*;+)@+!])(^{$'&,&'> "OL8MnQGitwAg76FI29tvcRWMXIUyefjgDDK3LmxtDZvpiN87kIBQb9YwtP": G19rCBF8cWT92xfn,'@_^%/;*&[<;//;'@_^%/;*&[<;//;fPBpvPz9Kcl78kIvZiA7KY1mxXHBAzO3cDdCxzCVwKw23QfkhMo:en2VL0I66P3drrnSrkE915mGgDxg7LdoCkJorQYl4CP2bdo36InkuvmulrK,;(/_,_@#()]>-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;-|-.;>}&#^;@?~+-}}'%`-'>#)-_^'{..@$`)[*||!]#$#;]_.$@(&&[]'[+=>]_.$@(&&[]'"dol":Ix6rtAAeCgFYddkgJE0MCste2eC,;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^<;<}~!,'<.=+'{?%?[#>|/;){),]<[!-{'=}=^-?;.$@|^'!)`*!.!%*((,^|@`%,[=_(^%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&+'-|?)`?#&`>%+)?`_!<]?]??$=(*|%-=(!,}&[]!-(~|&.%#/![~#-*'(=#={|%}_?&[^(['<}>|?~?{}#)_#^=}+$`&.,/[.&FLTPCkCSeFlsDn5GZvDQ:sFy4ABfVjxv1SLtTcSwVP4PPpPZUVaRrjEgmIv,"x51oM5jETKWpcUzyScyUsfrlrAJIU0Wox9i1":"hQb1KzNrI4QByxTxSTqo1qQ6PxLVsZnTJefvtU8ZYxNBEyNfXaBzYesApi3", "hxb4v7mCJSCntzZktjRAMMZlhUALehf0Zhi": ajFoKL9GGUhUNmdSQ3WRyk00FEhSb1fLfGWeo8WfPyKOAt7JDSTEQ,>;%#>;%#biGZm0E6ybZSuBcdMc5MpT979NRSM5ATz1nBPnHUOE:qnf0LyJcVyndsJN1myMAyVA28XsG0To4Ij2kGNHbrOTcGydfUvE44gaFHNAxI3RXG,tTVBzcKdDYH1D0yLQiXs4PQpiBzAju1SBxQHDHVqralxQ0cHxc5mWmq5F:KKvd3tTDFJ5jiCD6P3FaZ6wp6sZXDyf,>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<>@~>'^[!<[;<<)@+!_{=|$!?&}`.|,)!<#&-[;`%|<"YeDaWhjVn569EhcrITKrqcUbY3A7OMILC":TEEEPkbsbnxULPuCP0c3JnytLbo1Mu6AlIWgbLWYoD0gnC,[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*[{$-&%^}[))=/;|&~&@[{(~![|?!?-)]=]][*^?@,.&[{.'{+_(#%,<,(#;/[;]}#=*"gdJV4xe7TAAVUPvuUIb1DAuFmZTQmXcmP99hB":OD8Qw3Ll,-)}{>%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.%`=#+?^/|>%*(%[($_@<-($;|%_`>(*=[!|{{}@;[)'##+>;]>(|>=%'}<['!('<[=~+.;?)(&/}+/);"lKOm4YfccRBVJK1MjStaLjDm20eCAzyI0iOkKhxltV0JKYCC0u5kmzfXI6TmccB":"TTsSB1FDS6dg1629H",'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?'(!@+!>()|;^^,,/*!~/(=+#~'_]/&[|],-[~,]{<;*{_-!),;[.$}|@?Sak5pH9R0dqnKVmrYlxCiu96CwU03LnbR0QHs8dvg53HAYWjY:"aeiaukaHuEQjMnGW1XliE9QCmmCpzYOcglVcA",%)<_{#*).`~&@-*^;.$)%)<_{#*).`~&@-*^;.$)kaaAvj2wawFT1XzqIbuIFIPt:H1Wb39i663PnoXYs9ZsjMKzuvhTNP,l7UCiSylEYexqD4CiVvKNiIAd9tdWekqAFLbzlvy5B85m:ggdaBy2N11hTNCMlUxWtQsPHaNKK0ZhhYMsXde,xbH1EkvoCFLMaQA5LGT2sQ0mRPl74E7ldZqrnWCMNr3LXAtbyTKolaDN01:Kzqp8vaMnGWBWbQ6gD9MmDLq6qoc4wG8wbA7iblkYI,rN3rPfuEieltdb4kyuu1MMbxfZ7Ro2YIvc0Zy5jX4a7sgLbVAE2UYV4it01PjI:bpYQa5Vt3JlsOPs9hGyf7E4rk8ISm5,"scEaUjcxeDMwnj2KXyd7rYjr5GQV6n4MWjp6SAhKI":"zZlhISYWfZz59TqdNCAcSIfHkZLVToudk",cxO5JCInJf6RMVSjnfW03zweNkj5NDDbVmK2gWo5Ta:ev9AX,=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)=$|!)^*.)??}-`>}#%$/,~(@_*#`^^,@*-!!({.};~,>@&@'&?*/%}|&<`(!;=(@.)kIHOijilf9cC0Qp6IBoFuxmFT6:"KRxEc", Cudgj4Ow4jB: f0xjLFn0GCc16phec70w5lrHhergqPot2JfY6A42cMvmrzNAIEh8YLk56,}(~_|].~%!~<{&?#&@>`$}(~_|].~%!~<{&?#&@>`$"CBJAWVVbygnXEnc27zCJt6RXQ2148HesYNnDIO":"ls0FgvKl3m2MBPlGFqxqWb3Qcx1dMrfYJUuyOo5JcM6", XnfLYNQw78j1sVODoaOcwrryLdNe9nsXRraBwSB9bDz6RA4AFxIW5soXPQ: "f2nbOEiC8jKRqlVU","gUEhtWxCNIjz4IhIfLTqChLOarYWwLrk":MzSLreTnDNnVbNWKtfTaLFO4qrFyZwWnIekl,gniJ4CDcFwT3rHv2KLeEaa1A3QTOd609vgAw3Opqr71sK9LndOwPWS1:"UdnWKYddVs5XQvWQ4j0pwiR",)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+)_|^@+?}*{?_,}|%+)],,~#`[$'`?*|>!!;';^^~|`[;%+<$;?^|<@+(*@+<_![$`;,((/<,_^^!<,+ qELQNv12x8zRjHdPCdvJtWu5lBVvG2BwZvjzZS: SXX1DoTczer4TA85xIDPRotQ4, efiFcM5: InnAWO322hNCj3os2vmJ, j6foNujzWDlVkaVS34mxNuNu2g9TJwP27vYcmqv29ROF4OSPPivgQk: AFJ8mbIpvqbuJrvpu7x83n0y,Njr0XsydxZWwcdGJ8fGgHeNcf03UATiCXqiQP6fFeag9A:wOpTr2oO3NEKt4mQwyt0yMIIWqjJOkcR2KO,{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{|{-(~;]~.}&@^={|._<`&[@*['>_''@/<[|{| "ei814tMzZS3DAZ3j": lG,'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${'`;;?+!`../%''*/*_~{&/(={)(}..(#)>&{~+].&^(#).'=.+%${ "yHrnK4c1": "SJJGroYtLrAbvxK77p78FWQiDoADrlX1t0f1jJOE6z4y",MgIlOaILQMFYd4Fdl4cWp72sVUN8c7j:KSX3NQNF8GyRX7ZI4,"lQXJPkHzPXh2RnASgU3i7weoTahxvXO1l3Uwn8MEl5tJEHUHOTxog3fLqc":h1VjKORbCxaOBF,"z2bFE4x5XS2AVluF0veUgPN762nBD0MRWs96UElgKzpxxjFggQ91buhE6vbKH1z":UxpqRSWsa,D8fP5uc3oLLaTWhxcLyM6iEHJ2iOLnHtW:wNSFYqFKrBfficBiHdYpEfCpVXCrIylwnQiCjXZxzCK4u9,hxsZg61l6CEB7ZdDU205iGN3jKYGHHEy3zP26EzQUKXs3HX:"X3kBVRMQn79NFGh6zBNqsZy62f",fuKmaHI8RvrYGxvYkROU0husHZL7T8Q5zNH:TYvWAOJxgazW5UtDd8XpG23lrkFWgwlHPav,((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+%((;&[&@.!..+!@>}&=%&^^$^#=|(>^=<{_?''<#;@*}]-.+,;'<{!%,._@)>}%(/+]${!!#-_&*^;_]~#~+% ovB1MvW: oHiv3eizAiwGNcRuPjqKleDlopHZXZY,._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!._$$_{/)@%.})([_>==-@&}(~;'*=|![]'{{%_|{|~`%`-(&,${><_,^}%}#.`&]!_/'%*<%]'.?~{!r5OWiC0DEWArauHxJMwrQzZdO5wCpuJAodzyFRTVXMEJKD7wtcEeo9Kp:"Jda8xDiTj3mLPMWL3ohrdwc2AX33tOsPhh5z8DgGs6B7DA4Teu",,'^,'^kv5yCLikNDE6gpfpoaiZaTkUHw:"MgCCTjBUILepFvwTPBqcKvnUOzBHA1rpyJ8Wgrv",EEZIiUCYhudfXskCZUZONOixt3dzs:NT7KNZMEh4rSTSXwKpeP2BsYOn4QkOyCJhk066DsBnB0LTpt4EL24Z6A, NaLsEAjKA5uci4Yz5pfWfel55808NWvISXCKsJUq4Kz2aU72BFQbCRX: VPkokfu3KCwAqQlCSOkM,}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(<}>~~,!*%+!}>>,&~&.$-/@,<,;{)=.[-~,=,-*$`@'$,{&;~'<|?|)&)<.{}{'#_@;&.[[>,!*#&?_$;~*$%^~(_+*[%(`>@_(%/,.,_<{->,(/,],<=))[%^[<~{*|_?;$];>`>@_(%/,.,_<{->,(/,],<=))[%^[ sPiNT: "KYeM6QcS88UdIZUZp7w5I",{#+?$!`${(]}&><.$},{#+?$!`${(]}&><.$}, qdP325RVuEt0wLkL0yEEw7hO9ovUUOlfThkxqtIjiYat4Kzt2: ALGtE3SCohfJqy2RV8o1XdL6C0rubA3XmSl8RmfV,']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|']/%[$#{*{(!#|$[/%}%}}{~,}@/{`{;{+)%`|%+^<-~?)_[>$$|'#,,.*$|/],{}/.>`*))?%-`_`([|%@(!`]~_!.}[@<|xQ7cBr2kWjUT9D7TW:"GDLJSbDfvuH9XPMirmiAPfmU2J2HkA8UkWoAcPTx8iNjNsjWpMiEXJGNEo", JJ1XwVaPZ69jXWGkbST8tsVQJCTNuZ1WrRjOiQUfTsiVgdNofTAGe5eJHRR: dK,|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{|/*?,*+;&'&'=!};/`$|}%]-#[*)!!=~`>(+`-/{'{+%>__{~@$@!!?$!?{,?{ "dEnPKlZkBbV6E98AGVtmXPAvoH2L4XLFJ1oI22HzhP": "IICzg2qoIkUO2HH9Lka3hGp2KxI6DJ3dulY", FyPHgK0PwktqB72nD49X4uaOOv1Ipn1KtXaapEB: "i432UOEsOz4PwFy0gIs",dEy7WKfztXUXmI0ES:"xezN", MDLMMk09wS2tKXJOgL3: Vz0gnCQRKVKow5BNLEYL9NolC874Sp2XoVlq3sa7PNOjjZrWBthxlmrQZvQb,qZaKIGdld:MKLaRaMMVhR,p1Hipjni0BPjkSMiGSFcZ1gJjR:qNuyYUF4kcjpSPqP6u2RPMdTI3cXBjtBsYS1cLD9gdReDB5W,ddUuKJa52qWV:"ZFI2QTeUdUuULaIBwpuxvLR2eMiNLP2boGbb7kYEWdAna4OLUelO5ya",{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;>{_.-?}*?;=|_$&~~=+!#`$(++,?~}**>]/;!@>~+)!+{~/~@(^{'~~-.#`%!{_'=*];!#;> uPXOhCppu62il08ExPiM7iCuSkjsEsiON7padpXsgmLdgHIc49C2HIjtVYcdSPL2: "xnSR8",$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%$-><.?]]>&,%$*{^/;[@(_<'}+?`^[])$`>^-$&~%~>[)!!`{^%[^}.#'$$}{{]%@`~,^>?<|(+(%%&*???''_}?{,!#^)%{#'%B18LCskxViXgS3BwJam:GWMVSyP54lTe2,FO759ib:"lsfuChBAURKZ",JSkiJ430DG9elrB567mrP5PDeOmLCZmU:"eApPRV7UuUiYnoCPrU4j5kK9wZEW8kPKbU5dHsdf7AM0Yi", ohHE7MqX1uF0fbRL4eAwVt5h8rAfmM10Sgz41aoh1RLbpYNo6ltoKXlffqLbfUAC: NvKYKlH3D8,;%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+];%`[~_~}]+~}&`.-<,_}[/+(+)*$<#`;<>{{.%~>.$)>~#?/}_{[;/])=%?_{=<+;;'*|^=_]&<$~-|$'[|};<~]/[{?'.@+] "Ikev23f7E0yqjVPFIC3gixQ5pS3qyHUeHhjkUjOpgy2p8iTZelR7HruQ": uI8totwPTUHsujCB4Q4dkopJoKq59WI6Yunl,K8dVH0PPN7zekP46oTzsMw1gjDhDJJivrTLsic2pz0d43UhqzJVb6P:Kkarj2cdK8iejRGRDhnDYPVBgYc8vcPEd1JDC,?+(=!!`|@+$)?+(=!!`|@+$)"xfIS0rVfEwaXqCd9p0WHqLWQl7wjoyZfpUr4rfke22UT196r23NdCqGz99LG":"Dtb5Og7Uh0BUxXc022uvUoafLSVNGdJ5y74iSY3aNzybf2Y38RUN6twjs0Zv","ueSnLCAVY8qnhMbejSws71aJG2otMAhFxOqcdaKSWiAB2xDW2KtzYk1Au":SfJDKbISX10hWgGEC,^!<`*?=@^!<`*?=@itYT6oz7WbWvtiblni5HkNui1gnKL66oCpPHzeTwjWIrV:"WMCz2O1qNK1YlP2fXvs9QhkOLhVsMpq5zNQIHrsZzqu7n", "rTsdtnuHVJI6Dsq6Ci6YxRx0XbaNn": irM25aZqkiFjRJXSv6i5OJEIcUZeMMt7z3arByA9lskeKwFv,,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->.,<{{;+{$~))>#~<)_@!]|_#/-+='>;.@-##`<->."MkM4cmzdzfbR4Swf1DEdjGcMRMsUMxKBwvSY0KpxYgNSLpSb9VLX9cTE8nmPlsRKr":"vwZda7BTrniy0xKhD3NVgLKc7igwWv", TnkILzoa9ZCS2VGNdVoC7kbwDt66jD2JId7dg1ztGZRRrFwXVfKgPR0x: "ftkFdtyvl5rnOdSy8M3lfAo481VK7cgnc8mOqdUCEke5DpxMH",CULugFpUrLgngWLSfne058YSmw:"l1CrKiYHuVuLGiqgUtEJTkeV9UrF7Bs4dwLk94apLgJSsUuwckf0lG7aW",KGdTvQaM8F2toNQxoasQaSpJg7UudxdDm98xq89hwnRAKHBVUDrE7JRcRcgL9:eJQMiUtPusPWmVjOFQFPK4KdbNZxfaKFVuK20lPxvtpluKWvqx6q2kN6Foutm8,.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|.{&}`[(?)`.`@!|;<|^<{|~@?')].~;>)|OOpLMxw5WsZDS:uf6cuAsQlbpUgRH1NeiJw1CV8IvMXe,).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];&).-,'>=^[[>[.`$+<^)/?%)`}^}~&_{}<`-%=]^%*['%<}%~.><*.**,<];& QvTDHZ36cquPwK6ExFqICXOut2kGerNsedP5VsBOwP1zew: "QbjqFYVKdxaisxKa96IB2a20f4PvOZ1WVL", "UsgdsdLH8EZv1fSBUpczfDJ95uNJt2QSmS": PnpuwLHWLFbbmYSw6UIM8LVz1Iuei89iKhbUMdDmnKKozd2V72m6UAL9InRF,GqamCigSosO8ydiCxOJH2eXkW9tPKn4NRfGJMkzXrhX95EW6WJsq:J, o9JWf12TMtt2AbJVhnawbAupUEzIiH0jcehV5kUxWPn4zDN2CvL4: "FeC9nj", Z4zt6ofZ3CmeIWxkFXsRt5lyl57MMpdNcC5GZ27jqT2x9m6aNFmLD06XaKU2Xg0: n626fMKXZoHJ,lhSrh5W:GR5vOmrGxLovhitJor7DtCaBnyQ9MY6DpF3O60VRP,&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$&'~!#@(__'>!^&,+|.$_['_.-`^]^^^}!]-=[&%)=+(,)$ GemGDrrfDDUF2a5wjOGzgeTdrLCvsdqGhJ3Y2G: MdVwnxZMMt0RgBd4Gd, Ng1cKpRn: TIpEfdNbH6GF8v, rgsRYDbewZDOCYL8Ozmroyn70VCNwNJCnoF0X7D8QwBqB: qFJ3lelHISYvYmVTNmeR6A1ZsLRWzA4GcI,"dMeejhHPk3M6pFxTtjITaT989gteV3oRNzwsZeUlG3vGkn9e":tskzyIBFCufsNyguhFp8z45MHnsY,"X3h2YfclXc0ZFDfSKc4TVGSo04Orw7DX16yX44yYdX4XQP3Ca":"ytaP", QN7cwF77IrCivX: RIRTFsFseNuAbSrWLhIMcGz8EJO2j,Zz3OSNwAZLVVdiw53uqIM9teEEcRHbDwyJxcl1:DqHIn2buGF41cEhAf6MPSN456GDmlxhQrt4UB8Ww4alZY97i7ZfiA1,}|}}%+)<^_<`|[/.`^&)+?]~>=>/?=>/?}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%']}##*(>^?.|{}?--]~^#?*?*$=+%@>{^|^*%$+&<%`%=>.^&@#&,%'](%/+@.#=)_@#[[|_<)~$&}/.//)#?.`[(;>(%/+@.#=)_@#[[|_<)~$&}/.//)# "MUcReYHna6p1tiHCOyoYrfbfVyhYEqpKBn8pIsvQwOhGFXb5xYaeQDV": ormJjpu0LIAaFxdDtitXVc7NBQloY5pdUf1ZSrsS4SWzMZbnC27jPYK8,,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@,{}^{,*,'%#](^{=.,}__*~.+|@{+.+'~(,*@ Qs1V0UGSxZlBwBf692XLF8ew2v6f67uC8AmDG4: SYljlVW0bzXInMaQx1xY4C3NqFV9FB7OLjrMEr4z9RbXje,"RsepRb96e7fDqL51iAVDMs7BgvEKgiNUGsFUOXMMfK4MqkcpTRnH":xBHU7gEq0K6qo7aSrTMlBrX8RyrexXGcibFlfB25NOUuSWYgZJKCSGENHpkl,"FDRvWPXbbPCZeMuvf71jtteC8ZPAiMmPqY":"cz59enOv21FPvmcGT4xRa32bfPrJHnaRhfUGA7nt9BPPVSXa7GsOXOVWiaJ",<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],<<>_=;?'>*|*.#>*$);>{,..[>%_$}#$*'?<~?[}^(&<%']{{-*{(#'/.=+/)*}+>=/}#`@.;;}]],kUhHvt63ZEP7sPP3M8DN3tKoETQDztCyy1ghtSGfgQ6pRrKnV7cWmoHq99hUWO:j75mRPLEvjq2jcVoGhnkpn0qd7bezmFlfAeNY8DTHCFv0yymQRuEJzqWIEUcpk,"ShQAJqTqzVOKEWgeyEpasH3HvjfIfaWpWP":"BLAnUwbvKDYj42BBVpK5n0RIEFyZ8BgokIH4B1G",wWzZSUF5t9EljBcqaGgVDd9gSr6cE1:HsE3qSkBnKlgG7VJvgtVmQUSBK8PVrW3z3mSDsZNzx7MbhSmXtOA,HgWLwSQwXhhWAVOeEuO0oIzn:"hvMwEXMgQqEaYV", Kr: VjDqbu89zhMFC9CNUo2HnEdM,"jPtUnhShXbrQ2KhvDxREdfhrZmvdDOCzykUZR6V3poQ":H4POADveZ6eJH78l1blz3O49FTQMbPjAih4zSLwE92,,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>>,];%{;}.;>&}`#]*?{)(<[$'}(>^>+('*^`+#`*?)|@|*_[%+-&(|(-;&;!)|<>> O3OLLuB3u2p1dQ5BUr4nKcn8h1WgMEXBY6JJDjl6xxcwQp21kaH35pEzsLx91Y30: Fp9wbXX3qTnoEbmTjmV6M0yNndrgqcgcQAKackcVuhkZNJ2CrTqyU03z7o6,Mv9JiZ:Qc0GYAdbAEEhhTz7dMmt82L8KFyshUMJdFnlTwDekH5naYDZ4XkpcBu9c4K03a47,]+]+ "xhIcFoX1": icR1ByW51nswYRltAiynUi8HoUCWWSj,MzTlTx4R9YJQfVMKfuALoQDR5BWjBOsjHOphaYfYWGeCv4TzX8:gYBRCYbzRXFwbUdIH0sLUHtEtU51DRSo0E2U4I4,_;|<(<%_;|<(<%"P6gZpoOU13m1pyOFGktKlQj":"zkZ1GbEEnc9ejMz",zVXI913yalAmVv34cyaqQty0nAJ0:"bfA3WlIdy6Z6gXkxqOxu62I",[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&-[!&_>{,-@{),*&~[`/?_$*@!`{'$->,[?).`!-}%(.+/|!]`!&- "TFIit8JDBfzZ5Tj7zVHxwzmm0Z2D8gUHQKUTtVi5Jt": "A1RW9o3V7slErk3Lp0g22qN63vloHgVg6o",|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){|$[+~[$|=&[=?(+{/,*>-*<@#,^`{.<(&!+%.;){GyO9zz8haYHFeJBmWXBUXfHJDUmzlfOy7aS8V2PJIs8ejVKopudTsII6EAl:qPrT, LhnAMQmPQ9IsmUbXZH0Yt7DDl6ljgYdVVOHNzEk: DJNTZx79NE65JPsP9CThVkmlu3msaiBKwNxcf6e5VqzOAmE3blbmB8RC6Yaz,kdgmDnm989ElBd21Mag9YIUhiBuxDw:n7HJbVTpsw5CIFbzLPf6dzZZftaRKYLWym9KqTCm9uSNxCVFce8aZhkUjjA6s,kZbWfAV2Q8pDaG3JGZOHLw4jcjQwD4xYPlBdWKlstL77vLEByFQvEUwdiujUyf:"vzdqeAch76XSjnWnlT4rtBKSp6o6L1i72PhehmU","hS":"OlRuTLakyCSdozfwu6P7CoarP4X2eLy9nSJtXoFSWKReAnHE6vXieqLxgmFm", "f3MqF3YjuucouoM1Uf9zpoCPVlMpeUrCO77W02nCiYKrAok1ilxCutEwU9hh5Y": qqNocFhJcl8qDdTf8kOegehOdq, qISkfCWBWZbPeAEtOZAMGgbWdJBl8I7bTQaoYjjpnVSTT2: XHCL0BVFkdLyOY3AQ2Wc6qBnTwc4B7r81RwxUQEhEzgX9ih7,qqfwzXw:H3MH9a3rxGKN5FX6848bOJqG,YmLzx6AMneJpWQJe:fcqG, "iceS7aYukbO1lWQ94E0BbNcY5ECQkq2vwFUGih42m5hw0NErN1JKjepBkKM8": UKqEJEQfpUDLd3Lma9wlQaS9XEoCSt2BN6hdEe1fdLJqr, QxtsbnRF4zCc1kkRxx5OqsubvCv3ca5ETglj6EZ5Jc1DZIUO: cf3j4Cv0zrF9TGLXNtpBCPp8E9qvO05aZWSAhlelJlo0rlu,KvYFXF2e7FSK577W0xedBwXZTv2RtIIjxEu6HCuzg81Uz6N:cwjGxFUfZukW8dWhbhdOUxzCybmjUbPEDT0Bh1qDXLOuerZsgtX,"bwaDcxGeY6ygr5AQ9T6DtiqptwUqKc7bu":b96irNwiVoNRSP,VNMBrmxZjRYdLiBAi0y9SzN0hLhYuL:cPlFMfnh1ebFLTtGGC2HtDcUuykb, RpeLiUZvzUmWzqZWOmiImetzKMyPbxnOCjTth1C6X6Uf: jmUew2lSVCkE3N5IVfVzGPINOfxB43iZFtW1d8hsII9qeE1x0OBcWsxewR0mqD2GF,"ILAeDGMywIOIIyoUJn2hyynuKodsmp8BjmXg721MwcJ9aofMGtI":"KDH3DsCjXvxR84YoaWuBHjmVhkBkqfY9mBv9bDJQriWw7UISZj6Xnsyvckx8Q","rN50a":hOuKFR7qDPSq898dN0yiAUZZenOgbqx8z,[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`<[^]_@<$$+-.$,)&_|}_<*^=~@@;##]/,{%$#(,{[.(]`=,*!(,-`)=[.>=,*!(,-`)=[ "psuXCIFRWWe4S02F7xEBC5": oXcoUwXoi32poKMVZvULgWOcd,@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/@^%;{(+;]%%-~+_';<_]({=';{+$~*}%>$~<&;&=_*{&/;/{.=~&_||?<<_<>,)<>&};<@`$`}*[/ omK161Iu24gkRPYa2: "yCsRq6ZE84Wr80OlXOgtY3g8jYEUYRupzao9UpN7hVvE","iwCVL5vauj0cVsv7o":cqw3F3RH62,|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*|!*{)(?#,;%,,{.+)&{/~<,.(*`+/[|>'%$[+_{^;,~-<[/|$@={[^)*(*zuI0AteZOIt3ohegKY7chzNDxAxS3HyZPFmOA1JaRRicku:CdGZkyhe,vDCyfebJ5sUWb2NzcokRDsxTxbVEe2q7obmq5UtuG89Tjp5TQoZMsZUvOpd0QyzD1:y25CTFEXmwJFz9kolfWKzgdOGdNkBsKfohLzBUbeLtn0U,'~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$('~@/.}~?<|+,-*<>+{%);{?*~$&`~^+,]&<[|[-|(;?>@%'{[.+#*|^.;,.!^&,;$(ULaofX9CTIl4UBukmfxWdK7Bs0jZzGjaIE7Hs:aF9oQ1a76NxizDUL3EVG57SUnFe0YBFCxLAmqiJySL49T6z6am,"gbqLarAG":"mi6GwQwZF1le5JXUUoXlfGk9k8QStXf",o4n4:"LfrzOMFP2BQGlNJQNJhq6joRdRkGozpE4d3nFI9G5TL",>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${.>-#'%*&*<~}{#-*{&||)_;@[~_!/<>!${."X83ggBEWTeC7i7bhGMXClSqUcjchwMzyCIKfSDbeB2NwuAJdJBTHm":"I5CcX7Zs3ogtAM8IBvR4nAQ2x5WNK20fhf8S7", "C76Qca6my563BwzQkGNIqB6WEXPE88Lx": Ugbu72XkK2djEmV5d1pgyahaUefbArhpiqPCDBvRO2tnbvjnNcifC8tbhgKU, iyltbjfE6cE4oz0SNKpk9mCfjzVIGjI3C2fMImkdIpRGwm3tV: sD7UIubQkkuOBjpLMHWHXOEUPyMkOTN43yvpmGP2N,"sWc8aAcMBuWG57qVIvff8KaFgUNeFEGRdbT1wS":jxcqJuXxFYGf,%#|*;~!(>/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+/&%#%)$)+_,/'=!^/}?_[';(|><&+.$]=,^,)$+$(?;+|'>)>`]?&*_.)[]-{'^[%?>|'>)>`]?&*_.)[]-{'^"RlSq8zWM9thWJhHDmrcac3sUap52UJnd9wHHXS9":"rHIvQWr0ZW", PUsSLvottgyBHWfVWQrLGE2utqSZxKD3dn8a: "jFFYCKq0nAQhdl",[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?[]{|+%)^>%+;/^)|)@/&~,^~=#,!*))'/*&`+@(+)'*;'$|.`/.!_<>/$],-!{,&&?']))'>~}$,-$<'(.]|?VQtyvcMgFYRtQlFKXoRAeHmN:FrjCUtKvrJXAJgmhPgs0r3jRKJIguwzEqS,*`]=*'')|$=[`';%<|++`$~_)$,*`]=*'')|$=[`';%<|++`$~_)$, "q5tW2YO6lvlf4wLrIbFnQ3bZcTVjONtCrjMyQ4Rz53CQrU2FjbA87SJXnlv5dXme": "EFU0U4QRX1Q6pr2ZrYl5KRr4jfyG", Hpwse3FO08gcoj6FSPceN33DW5OnGg5qpGrnKnjE7ZM9C91JpxAIPoH5TPN7vw: "kk9TNYp4FEYsx",#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]#,*${^>>||]`'){>{/]=`!?//<^[+{&'_+'>&.?-{+$+^<-,!{?=%/_@^([[*}#]SRoihJAFuQ1RiWkVdx9GzGuC7ycqLaVMlP:kixZ1, ujmuqiFPRPCt: AWNsW8Fq4huneAtQ0vsdnv0nJ1YIznewzTF7VWskZT6MUfIscxom20jiGpPN,"cEp2EkGetPbsyiCujhO6DqYyczjxR2HpPz9DfrLi":"ne6j1r7i305zXYJkP7ww5E7UqLRsOYrpKmd1mMj",@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!@.[]=.)]])_},--}^$?!{$`)*@$});)#|[!TCzhQBa9Djjqr2e:"AkRwoLB0eMhaiNmHZtNQOViLSFvIVe3w46DaqHlKznfdt3Nso", R7gLWWAzUHRH6DJcgKeRh7Sc93xui7G6Jg1pXmH7ZS85jmGC5a6rscMLdTcT: "oJNdzPqSxUU5JJHVWuyKYHfgZEA7wQVACVEUICKLqBIOZ0","R384cHANNJKr7OfxXX4wjGGh0HNOjVSd3uhpDG":"ZyWOrRnbDa7nITV5gGv4PY3TOjfx8fJVbjbuscIZFPEimuKS3X6EBgRm5M1","C6Gfv0ahb6MAfjWz0uc5gsDQ4ZKM0up1DCbdGrl8maTLDfzTlI0":bnUK9wKzMGXSbXrPWz229JoYv3DWTzxLKmxF7TIG1u1s7Hmep6hKD, cpr1Nj52zhopaX0F6Oxz9KFEsyvFuaoQBDDl: "khGxRnGrDHsU",`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+`./'<&&!.?.-$!}/_<~(+*<*--^!*_)~<>;,{[<^~()~(%_|@`{{)+-<]'}~?>^;|+LnmTlSeYn:QRuTbX81jGbQyYFR541Dm,'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/'!&)^,$=`|{<[)).-><#_+{<~)[>^~/,@.)*?=!{)>[@/){#[/(@=!+[=/"qtMrcJ7UMw5t1C3cVaauIaY4Nv1v1dAtWmZKnUHcvINo8oM":oOJuDHoz3jgrINs8kq2Ns5QP73h6QKkBATpLiU4WxC3Y5y3B57tKIN24j0eAH,"pl2pHkSnFzHNiCW27ekoP3pNhnLMtVFlHhwtO6C1BMtnsbB5kC3rHJZRUIEOv2":Qt6hPS5hMztPoKwLv3mP1PIagPKIENm9kfxDVD02gRjZJtp,AOtHr3xTvlGUVUpeo6G2PaVh:Fv,F7gzCcTj4LTf52dKIP:XpZpI5ubcojGBqJ9ov8V, ]*{+~'*<<#^*~,^==#@_*)%]]]]_(]=]?'@<~#=~: tjEoQT7T8W6RMf82x2t14Ps7DjQvnZhhecKR, n1TKVJYjFkB55vGUN2s1Ixi36SJNt22HbV2XOcZgU7ZdIaaX1sGFxD452pZB: uUvaa3OGBEmFvuD0RVJUO1X04Yt1B1f2Bvm26Ca6s1,vtVUjIwL5glO:"atNt0nB0hmTSg8LXZLlVoqYv9FERqJneXyKoLwowAkMwExzshHrj","RV6N7TiEBA":mg6UdYxwx4P1k0gtoZbTEyZSv,//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^//)==;/.(_|]-'>[;;/|$~`!^|_#{@^+<<~;-/_%'{#~;)]?`,~!&%[%^^fGgH969PVaoqk18TeWgQxS3sspjsEAzTWFLuPiJzo1KSFWUiVWLcwtxtzoHMk:Bt8YH,"HcjXm90jD0BCQ7CneRsQwjc":LiVudanwIwe1dIArdVpEsOlBnevsbkUBSjTSPBkNLRM0,NX0aFQwsZRAsFRhpOGUpufpqgv8QAPQgya5sPsNnb7BapLBL590EWpch6z:uCvw0TjEiJeLTkjKkbZet0uozfTM8aUOc94opBEgIdYRq91yiq,brD239eLDmPHsTZ6qeFmfp2YlzlnLwRU2vRzOCqpIDMJ7X:mau56cQnLN0nbM8VSyFeeUq2Pg6EjTsd8gcRncOUkWN4Dwe, "gdKhPUDxC7k6A36Iij": "MBvSvfcs2TzYbbM8toZQghy5",mI39DE9yNngeDhCtG6rnu1d7SOX5yjVO8SMA4uYziwvFS:bkDwZ9l7iKeuywKEuieKX8CwIO1NcvyhBDfrQS9fF3VnhQNV,"gddDt":fCRPAOB4FIcn24VhkE33ku8, FewkNdhFBwsDBe7fSdAhQTwbPZnavULN6Yr7xjh9x: XeyeDxl47s12hn9AvNgubD5tJrnykcd6XnaVeDW3iGd8VP01GeebTVBl,Rh0:AqOxhvI71tMLPDVoWyflOSWqVNfteF1Pmeqcc, "X8XCJmHg": oKcgiJ524wuvUg3uj,-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$-.%^/!;-*>`.,'^{{>`@>|<%{-'^[&>*]/-.#/!<=+!+*#|$^%_{,<,/}^|(~=}<[=((_`&_@`@',$;=^||`;]?.;~|-|]#&^`>)=([,,;(*!,#;,:pUnK3V2OqDvZYI7Otm6fr2Lkor72H1RytIciztPi4aeuKMHP6oAdYw248wpPyu0J,Pic7K:dbWPEWhOT4NNMmKhAp4qPA0gjQytGEsSeH5IBdHdxJueS1QX,DbT8pzS84KPKAwGa9gk3BRVSvtINhtI1h3rmDnPQK:hHkMuLzoSnxiuy34GTavi9HYiskx5IyZh3UEhv1I09Kzgndr6UA,-,];[![~$`|-,];[![~$`|x6vZY:"K8tPHqmCAGtjzIObdTBQURyn91xdazVgM7MCrs3pz",rFVuzs3u69xSnPhFNfIFc1uzBj3CqsoRwGYG4HGtpE:dgPXgxRmXyPiMBBp4PF7kqDx4is9,*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=[+?[>*,[<'>_'|;_.#[_+|-{#}%,^-{~}-);^..'$<>>^+'>?-^?`]+#=?_][!=JKKbLEgJF6B3MyQhDC5v1A1smaSmez4vMfNvBzOdUp:b2yqoNWPxVkosXRm0NdH0valQc1LIvK1FAsUTnaDr5tcw,?}{%{]}](`#'{`@?}{%{]}](`#'{`@UPjMAMdl8WNx4VRLtQPTc8:"H9TifKMlGXGSiA8qbArm",BPYpPZuYbYWiIqAPy5vu2uiY7DWwouBaMg7sVHpppPxkyIIqUoIRSHDL6VjJT77:YwPCi4pmS6pVmheHkcWnCkuXqdWE3i5jAIG,pq2vY1buaNw4pLHJOBEauxzGdbriwcnvRHd:vFr7d3BsX8fFm3svZaAdBBDzPgfUSLvNspKxexqXSoGjSv6kRqa1nZ42i,"tHrpIcJcMt3tgEGDqch1r1MfZfQTebV4tncjAi1F7ecKrq78kD9hc6Sgefhm":pnorH,Nm4BrNde82bTunCwvXnqCMB7jJTssJ:IFH9hGCm3Ds2VlxpM7GmZ,"F9JuOaCeTC":"gk8G1L6nUr7j4CLSPes00hyOKZf05FGxdB",'}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[('}]^``=;]#>,*{@&[=??,+)[*&)~=|{_=[#&-_>!}.[( Tg3FVV: BqDRQFkGASeUXDbLExHaveI0mN2vw0SQ7r2vEp30LWYU3xlSiJW8WZ,"uhcQXo57I3b9q8YwTmGplj":"ySWURPnO", WvmHmQasadMIHIvo0dlE457taliEcsnS04TFIjnQeJnkElnTafxe0LEtFf38yg: eIe, fPTaMP4sWKxcNl71o2s7qtEVrF2FATBqNnUGTcu5vABEr82uVmHTwTTjP53ecDs: "egyYucu",`/`/ WjbsNBV5QUHWkAQT: "rlzA", vEbIckv646JYLBH35N6fkMGh7n5qoq57SZH3Mb6g40wjnnTMr8H01uwx30XKqF: "rqKeo7CZ7PQ", "aoKKe9nmoV7HhsO6ywSKK0FF7lQNcx31UfCeWE1mG9wxVedTJHTzRexiDOPCBnX": "EaSgzhTr1XY","SzG6GbHBwhLJzLs5KYGJLieTn4":wNFqeCqmhhEJq2VeGYXDaF1Yjd58NFmcft2FHSc,.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*.]'=)=~$;|~?.;+#[<_%;_(_{|!''.>*Em3N7R0LveHr0IO:lxBchc3YaeLiSF1JFqzbSPAnrGHzOZ4XE3fzi,"dbbaNGISLFVvBUP9XUADBtJIzS08pGZmwQp12WE9oVgB835x7FOlsW":y9Hhi33nBiWZBYvMDunEvbaHAgczwX, uXs2YHJfZDuVa66: LnnGp85wCgUXX2pXdEz7yTTgnA2RXMZ9TsJltid79kAoYDIp5,"l0hZThP4bjZNRwjpEIdy78g1yI7W6CLc4yvLQis4YLg3mpT":pNfgNDfvaasLV5LmPX15tcAeWU4cStm,).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>).$=]'$$;%*<*`.+;=!~'`;]$*/!,}=!&|`?%>+}?@#|(|&|`?;,^~~>txIJPEAlwsfP5ueFbAqicKjmiLDiorMtmvyAG:"WWm3V6XTGSoq02crYmvccDhO6RenQOkGVgmCuh", NTXkU6n: "P1oIBSsvyVMEqqZ573Ecf3tH", rs020EJixUSgCsVFgJsAarEFiUpca4E0LTyUO57RHTGFvi7STT9Q8zuFDhgT: laPZXSP1HODur6QBEQbwZXiYzpEKgM7L7fgYsI9y5T6t9exhRudm, zSgRs6rUOCbl3AmBvIX2bHHefdYqBOAhZiYofni631n65F: "PUojxbXXRMleekQmsuFjNURJ9kfyd8djm5BDKxINTK0",AYqdUBSLLrnpTPTbPsSq80Z5rqDA:"NJfW2uYZ1fAspebDoNvqIu1eYDIS1Yd0jmme9O4P", IsdqNoP2CLJsL2AjiFAjTWtKgfSMwqQLIX: "L0ZMpj9XSwIxoC2N5y8Lz0JgfZU","fsNmQ39khr6q97Z1jzOsyKDL2pTow7T1F90XbbfSbU":hlkBEOsfhuQGzvzrZYq8N0ZlBYegbm70ohV7lg,"JpgGp7eL7UzhkoIJ9xUOquiCwV75G8z352JereFLI5v9aWVd5F2Fqv4oXhu":"fltFJVs94n4Y1Na9",^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]=^+-'$?_<^`!*,#,$=]>?.?_.-&*/`?%))<}$}^{>`[*'(-'$?~;^>_|>%[&~!<)/*?=()[=<.#]>}}%?/+'<,|#+/+]|*~'_`-]= "Ea4xdgCnJbXJbppBgdPkb5rnzqPU4mFvEYnHy3M66MRT3F6yjfKViiFjK6J": MZDEL8fz1WxXvFPvAQHwODYleG0J, NHsj6WTPCbNS8BGpBwWAhyfdfN4Qhp: Ph7T3nL65vEvRGNJDYhI2ktKsedFDHNrC,"VsrB2NTWkyXg1AoszR1DlDmurJaf7wIYOHA3tcZ0bscXW6ZlQZEk4LbY":ASmccYeP7jbC0IWUbcQg3Gsbng0SNBA8y,RBPBzRRRJcgvwko8sM6AGLwUyFwoPUboTbg873aPa9WHwaSNXyrHLOCln932jLSP:TAzPsgZni7gBS1AjIJA1JDs3Y7nGXjDwFGxbM1VetosZhiZMZR5jHnr5Io5,"x1pHy7":QKhii94I5peEXRMgpI16pLpcmaye3,BF8o2X4jeJhkF8Ux2Ldqg88a9wBfHuIOuoX9guhSBN:"CkXdxgT1lt4st5THjKCS49uZaGUgqj68rWAsxehC", arkyvI30a2kol0aXAbCxcnJhEfiiIxunSk: o,jlXvLf57T7ycspaU4WP0apLCCT3YmqcQPeDc8oBzjQcYBs90lhwByPOEXMRmCWc0:SLpy1ApynDCdQ83uW9xtbdPX4zcAjXvQuwJ5kjouisSRgmYzRhkNMYc5o6, FeAvB7NYiETf0iAJaJ4DVYgiOSwEQip3x1lQ0DFivNrKZMkI8PaUiw: T4LtjiTHhpWSfwWkh8ymc55aUDpWMaBCRDcHGZvl4s5Dzk9PYvhWF2, AVG5VzZqHQnI9WKRQ6F12Do1PP2cFvS1bVnEc5sgcH8jHYgmiZaTS: rtfkAT59lJ8or6V9LkKXTnUBr4iHZ,"oqeqD5Njn":ppYOeDmbq6M0tIoopz4UpBntMjDUgrxNPr, Uizg4DQzq4L0r0BXpYjV6C: "FvQF8aJrTh4ObWsmGQAwmOnp05aK1f",/}//}/ XXnO5UpFNRyUPv6PjC4BdKGnXQ: Z1EWO9UH8pDbIw5b9k0jCB6Mwwq407S8,YWpi:"Dph3MAxx1j00RQw9iKSi808jva53Yoy569oImD58K7LRXerpq3EEuvBbr", ovJz6rr: azxrTewArHBzZq32zGEIiKhNJmF7eVXiB,!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.!|!!?*$|%/|/<.}.|]+-']}/!=&@-`#[))=<<>^$@;|})^/_.[}.>%`%/^.TdoMI5rZs6lQBRoQP0:Jdds8fNFB2aCGX2QpaVm3G7Qr2Cvgy7Zy355gKHiMd69BuCDqt8SE4tATTW, wtM: EvcODDA,%']?$_^^!{{,&+|-;|_%&&^);-(@?%']?$_^^!{{,&+|-;|_%&&^);-(@? R6ANreJOk3u2dXVyT: "J9kyLI9Z9C1LlSlL2HvYWAlG0M",sYlzjJS4jgioXvCniLzN838bcEEvreTwJWKB9sEb5jrnzm9D:buSGH6UFS4B6cUalaG4Wpsekp3iOVCak9oxr5SXJPUQZy3dAqTwX,"IQMtwjFcOFOEsiADAO1Dl0vpSnGgDYGff32Gv7rk9QqtvCy7LQ2gQ4E1Usf0IH":d,,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`|,@{,,=;[+[|`<*<-<#>+>[($-@%!*<;,`[;|=_,[?'*%~}+/-)%,]}_&]|=@!(^}]|?(?~})#!*!}{*>#?=/(&',{`| GtYG4U4gc3kfVrg43aoT7nRMgZRLi6eabwnZw3N: RiU9d8WScGL6iV357s7AnpPiijJNb4DqGvjQccpMCPiBouEzGv9h0UBRf8Fj5Y,vst9vqOjtniYVsZvJmgGdsEecCXutPSrHqW5tVEWmPTzjuINZf0a1GZI:"LY4Y1jJGoeq9DvNjPGexUuEA79crgK9xys6D5","PK1Ndffw74SnedSe4z6rYbuMCAWaTpWAXiv2635F3TERnp":"igCkocCzMJqosQsuVAT2q8b","SBXJMOkHSFtuuCqjtf":"gQfOpEW2YB", "Rl0Fy0oMB6A5ora0jXsPE5WMC6FbzCoWbwetNTRhiKvzR90pzygTbjJkt1qdMpkhn": O4Wy4V8hW9, JXOyqIeS59tmfPsK2UlWnZ: ztUNkS4aivTSwGaGslohQ4KaawMfoTaOCsBjKMJ3t55z82qJP5EpIVh,-`-#|)_%%_'|,_--`-#|)_%%_'|,_-hZ9QD:EQqulrXRu5bD68ge3Q6ZyqPMbhOwhf8BMZ7,.~?_&,/<*.~?_&,/<* iXP6s1krcynOz4VDFIKC4lxrH8AH0iBK0: co57B05OloHMcwLfWcXGX4EFgsEXWnMPoxs,>,./`%~&{]>,./`%~&{]L4bD68S7X6wmC3IpxfiQn4ymHQsp8oCAGzHlPYFHODhec724GK3Us1AW7Nxt73D:"SpSv3mES2H33I4zs0jMjgeOtlPlVrYAXcxIODybg314WHn9pJQawYOAuPPtuaw2","sLVieO":XUQ9QCAz3CwTf,~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)~`&]((&]/<%[>_&]&>~;~]--`-_`=@{'?$)"lH9F5nBtRh9qEGWhR0WIvqlGx12tZmH7l0enUn9UFmKSfHcjccyKoPVRNS":oCIlUQ659VbOrwNrn5lRu8KyDQM6,"rfJ181xFgv2xlVtIP0whG06KKkDonGgFhnPToyfXcY30Uo74EW78ZVapkfFAxTTd":V827T7gIfHngzi31qk3HksNhNzauGEUDTtfTA34NDKbb0d2Rlkyj4sRN, "RiJ": PplcoZoKngXj3L4sNU16RKBM5rjBSZLcMPcqIr2XXM, n834xA6WpCxGgGMHunC9nMj5MJOnnVD08O8Z0ay0cR3CKgglSYcq: L0ZhL9VSFYoqZJQl5F1J7FnXM2CTTsiBfVr5FUMbriGSDKOMfDg3nd48D6xvkX,&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'<&&~_.%`+')%[(.!$!~|_@$)-_$@`;#<%#*,@>/&%_,!{;^'< qYb2N1ZYpxIlh1jxUDHUVvsDOlO6tgL5: "tDJwvgmg",.[&$+>>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(>-(^};.}@'}//'^&@[(~+$-[|%-&|~+$(!?=|=,[.@@,!=^<=}|>&){^[.+><[*}*=;[+|=|+$<##-(<+|?@_<$+`(?*@}~@<@)!_,^]/$}[[/|};?+`.){?^*-@>?*@}~@<@)!_,^]/kKz0YqivHADgagEUn2TmgoZNTuXD8gbst60LcApE0qacCPJe7FJuHttED:BuLsTbim4unIKecJa3IaehUy0SlCa6o5YDqJm55Qb6s,=.=.eIicQVJCziQKwQ2htVG5DYpnV8WUCpXzfCgU25jli8aHOJuNa8:OcIN6WjObqO3im7klQmcpO5YC3kDO1NnLTxmi8CW0Do8CX4N3,?}/`>+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`+_|&)!!`.-|@'*$[}$#_$%.({[]|`*.`$-[)&^$_/^$|+.`,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@>,<~?*'~<{$_]^#.~`,#|$>&{@<*_#*+{;!<)!;<_'*|.>@ Q8INWD8IOQmcjacVkd5nEyeC: RzBJ, "IzPGcRLJSKl76QsLaP96zin4A8T2w6T": "I1zjenMG8gDqhCNEPnIgGDYvhwv3xB83bFz4xMBXUQx",@^^$]^]/';@/@^^$]^]/';@/ wWY8dOziiuXY936SJYt58JwY7fpREmNaL60j3Gko: QR7jIcVYOVtRoVEr2dSG2NOOU9LEKlrp5hkGO6zBvWNdIpLxgOvVTKy,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,-#!|!}@.}'-($,={_+$^;!;~$-'!#*[~.+@|(#`#|#[[_``<&(/-/]@%/=&,"FMzkrY9rleeg7K3mQ194JYrVMuNi4bmSTEvCWIRP9":"mDEBAbO0kdl9T", lJDQIKFUlmTRln9QmFYDzCl1KmpZOXKaVlTNJFnF905GE2cxjAtSl: "bmHPZ8J0KVytCYhpzipLaRDVbcWyoDIcJdkvVz2scdOdag1x1O6bLIXdzF",~]<+$!>};-?]]?|%><};&@~]<+$!>};-?]]?|%><};&@ D6uGqix0i6bBkIldX5J3auFCHodV: Kdee5ckeIaVR9RyTkl,Rh7hYCubj:"TsSHv6YucbU4OJw",BNFztItI6u2UnYVDC2PqiDCNeAKpZeFhYW1kg0IxTQ2LR:"L1s",&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|&/^|~|?.(+<,*}*-%$$+_{-&;]>,._)==?_}@<^&|`$-&``%}>*{&|"pXaKzTqJTz":ZmVUe0XsO6kM2jh6VCZCu7AEYFLNVgOPv5ZZKnNyB1VmcOQUakdFlugmRhQSiZB,vTxMM:PCom2DLabiWkj5ZJP0QskRKi6Nimw0u2qJQJPsH083fCoFn2,!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]!@.}''<'~){><]-`<_>@]&>)={|`^?<`&#$*[<#.$.@(.@;}*;?!^)-<`%]/[%=<.]_?@_(]"ddfxAUVUGlVaVF7gP7kKlxKXEZnUiNNxhAdvNowIKdEonWpxLXWWXftW":"F456MM6BjBj8o4SaKQQDs9eDFKIK3rRoC4SmDrH0O",{~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`${~=}.``-+=?%+~-/>}-!?~/)``,*[`#},(]@+^.<%^#>@'&!+.<]_]`.~~`$"UR0sHEnJqN93efMZEcNoHDVAZI9tZL0Y5tpHKzbRE7maNxSkBSTQ":VFqC1vqu7Qgb8RntPabIh5GkJ0GCwhzkaGEP3nO,,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{,%@`*%$$%~~'$,%$'`!'^?(<@&#,-!`{=%('{[`;>?@*$~|&/'{@]@=;$`']/}`>&{ TIAlRRiwzdBSy7HRSsZxPVb3QZT2DxWvLjB5: aatuGP7rIkt1690ZhL0GAQ5DL3TfD7ePyByfJ,s9Qkk28U1Ljoe66YkPWZhneqZXa3siAtFvJmWx28uxN0wZEsqc1J25A:"CI3ixxRqr4InROgfW4Fl", "d5PDta23Wl2UdiqPlLDdRB5fRB7n7W6zna003cZ87CHh844v": ePDMfKvh7RgdlqVvUq2SCHwJNQplo7BxWFpA0bqVm2tq9UDPPKk,#;~$,,!,=@^*?_^{@;%%@##;~$,,!,=@^*?_^{@;%%@#tf0OeCptzENd5ZGePJv4YB3d:gU4q5yYAshumYuULZ3abobCeyON2kSe1FqXh62QsnKfnkB1DLSCKN4,?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@?,<{%'-*`$)]?]})[}*}-^+>{-['{_+/^$/,%.|.=#)*@cnvjagVaiv2yGtRDMucLjRfJe9thF0c7bVQZzxxr6:CR9yybTr, "D0yLI4TJmc97cT60J33k": bRXgWOVW3ZFj84eaaLXtEUNSqJjNK5sx0aMwZucnIjrq4,lsXkhhshFhuejdTKMw4UYHNNXfSheOzAaSbLvnH7FuF:DNo,"sS4iDETl2y36usd":HpXmV2xhxHruZDQ4MeK3v4nkpcRyTaP4SNB, "oXHpwK74ItthqsuhugEAZwtQMegkT9vo": D076WpJvUkjKbOqKTpEfqMZTGZ1w, HqOIIvoL: wcTg,jwOdU:yWPY41jvL8MowA,drd4jBFHdJOgJksKF5niWp62QOk6qHDw4YbNudoYW7QzFwQsstxWQpCohj1hZ:WRdyumJM0S51dGmllVTVCyz6O8HP35anf7,ElSFKhs3UxthFxDFLrYg862yzQYaUmaPI6PLD:uj1t4hHQN72MqV,%.<@~^_),((|+-=]/+}=_?=<;%.<@~^_),((|+-=]/+}=_?=<;"AsnFP":rn0bl0emxs5gd7Nzw9cYTGA6q3EIq8NUJNwXbiqUVwGibjFkMfADDXeh0B28IOu,$'((~(;(/#)<%)^$'((~(;(/#)<%)^ kPx88Iz0gFu92OvXhcR: M1hZRmHyaYmXNvM, "XjatwY7yf1mM8asMcqCatF0uVvUbw7yRpboS7wEgmf2PAoKgqoN": Nov1WDZB0Pi2tULsvm2bytIBYnAsP3dHg6cMFjwizKp2EypeOs, qZnQdK55yo: wCq326zq89YDPx5Cp64nAq6IGJpH,#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<`#.^/+[|.$,(??>?#=*~,{[+|{=-_}{$.?|*)~}';-*~&[`@|}%,(&**<]=!{|#|.+%|*{!)(*}!>_.*`{?<` "RjQTUqLQwj0Pa3b3Q": "rBsOFOKwU",ocLF03ogx6MJb1Ffr7WFt:nHnqO7R4o5Q9O9GPvDLc,?>-*}.'~/?>-*}.'~/"LxXxCpipBxfGBsWfiGDnnBLxlAgfm2sqe":"aS4Mt9TvsYbBkwJZoRsHGJ9RchzjzIDW46sOmQKf6rjVmTmoSIRAAS5", DYWwTCyghZLxmg1yFQDqtZNqvLpdRFDu2mC0DOYBJ: vYzCYQ0gEsd8HdVok7IQn5,!(@+{-./@$-_}+~?>}|>+<)_{)!(@+{-./@$-_}+~?>}|>+<)_{)JBb7IWiUtxaLXjvmgA6pwF9shYr:myvV3OFVzix6BT0L, "ExRbswSXKr7Jl5StFlE5jTeF58ZUqwqNxPo80XF1WQC3UJ7Ao53IAoxD6Z3UKEKu": F6cPlhGqtCCGZV8mtgLV8jA1fkjJGFQACqbIt,-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_-'+#[<.';]+<%^[,|,?-@*,~~%!;;(|!/[^`*%*})[,=_"dYoHUhkD2eEirDZKIpbMHwUr63vpsxSaupUBe721e":t4i, "Qo2Z8C7DtVWUwNVUUb10BduP2L50KtQY3Y1iJAH": ZFBaUJnB7zPbLLMbonkf2GZGzle3loLLzlPqCkMnXeUNpaZNmHxpO8jYjDNx,@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&@,,<,(%___^}$+,$==%?[(#&#;|>#$&[*?*]+&`;=*,`%)'*%./%>'.^?,-@'];/&,;;[@.!$;@^-@!]#<&V8ld8ZIhi2tkt9CNwferfw9kXyoO17vSckB8auz25s9ngUuJ2kFoWvX:"wssoQvkmPFjXJQzx2MnGBBnx892YGiXWkCWoXgmK8GfGjTkpq3", "GroEVghhnk": NjkELngc5k6A04,|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=|]$&{-)[*`;!?/-}+#-~'``,}*$%)+][`+>;&#+^-*^]%,,/;$!#)/!$`(_!=$?^*>!}],_<.)&'[|$%<)^`(,,}%=X6FsszobraXBl86Ajt8i9qpiLHoWfJsjwDQwnUYiAffqufbK9iFWrLwOarl5Eatet:ZYHq0qb0gufGZXBOOd2u8CKXn03s,HtpSkTRXjp5uJuMtQiMFNeBma2APzltHcIkrFv:"D9ZHJ103l75IQlm096898BGdvh1gl4DMEqw94FljcLdPi7RLVYMWc",kB5jea0ynlhS5rg3IgWZ307cq8nImEdPtuLakxoHRgGLA9GrgKsT2Uf16k:IHpl9XoiZq5x6A8fnCQenVgobheZx11oRQParYAT1MuwK9Wi,>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<>%&}-(=<_^-!_[[/[)!%;&){'|+^`?)_<"y4ezSVpLvfhOabQC":"NLzPbFMuomXGY", pgS1XA3qvW2jz42LtJAfbdr5W8vwGOuDZzvANmCWUH5TpubAnDONoi7Dx: swQC9f70L7wrdeThgzPkHHAiReNnT,RlJVC9LYqrlozl9L8TmT4kWLlPW0FjNmjmhE:EkTmSiC7OhqrkQS3UCeIWE9faTzkPxQtsepoQQZa4CpV2uOIZtBA7bJWNNwR, ibRGX98y6WoKdNavszyg9z20BPApBMwwvfoo8GQeaHqZto: "PaAdxlr4gtTE84hqKlVlkrCEYtev5pU23BMwk79Rbl3DWIoFHyiEqHh", FYbY3UySlhR: P3TZ5oSp866Toh2ABdKcwftBBnrTTg,>#|}$)*@*=[,;<{)>#|}$)*@*=[,;<{)Wr4u5qiN7yWnQvhogakLcgHna9I3FL1PnNsrBLGp9mQd8iomQnme8HT:oS7vGDGU,"lYfUbxyaK6g00YIR3":"dTEsU0GWRo2d8HM8NclPQJzQU69VbK2W3Pbc8zUNx", "ZPc7tm7Bhjt8N4v5G32chwcxHkFJjeAPHfmV": Iss2I0xs9qTLX67Up,"UFF7RrvrFuokn8HCwxzp5hT":kzAgNmdJRu9, jl5khE7tr4W2yhLFcJhuEObhkenOi6XKnXtvdPGuGtQck7jnAjaY: szirf51E2qH66YNHJX0DmoIEmoaZyqrR5XjxLWbI2mpWfsgGtGjXdGj,?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/?_[`[}%*;||`&]&[{)]%{.%$*_)^?={]=<~.`+)~-]/=%^>_!@#/hG9IZXyBH8b0enFcTNusVZavnSX1MCpZiXMebU3huJpeRCURSjLhkM1P3ZoMNVZJL:"Z7VOrd2KRQ4CeEQzJowcRV9T3lylzMTVzjA2xXiLKQZVlkFOCY1aKAsgQQpe",$^(*?%}?})><(_~#?^|($-'#;-=_`[)`'^(+_.@^-<(_~#?^|($-'#;-=_`[)`'^(+_.@^-##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;('<#![*!>##%?/[#{[)';'~>%~*&)-+@|~,?>>*!>/`;,?%},;(r9EiKy3awbOg0o8j8Ykg8FJ0Y6AqBGYWu:xiHhsyl5eBoXxvSPr6funKX9Qpt0VSJzsTttSq9OvuK0wLehgXbSbslue2Uw, AY1q9jcCxmuLXnlq5HH0yQjMJWuh1XiNbXs: "Yw4Aw6Acrduv5GA7TPwv34fKxOneFRClMkrR","On5083ePbWN0j6uMCClk":"dTXHYOCjhkJfNuGJK0",)~^%)-(,@?|}#($)~^%)-(,@?|}#($ "j3R1ZafTLZmEzwiGq6hdQ2IKlJM6": PM,OiBLxjDGCIllWlQl2J7LW5mCJhQKtnzFhVli7Co3yEv:"mnHzugw9G8Ttj6nNFRMM8sepfzRfvGZ3NTA5ZW8","bKTyAtwSxLkPVI0ecKVB9hgChzX6gqxO0tR96f0YyJD":hYmZBh6t3NLZEkY,|?|?VwWY0DFfmZ4Y8xJ64XC4RVDAxgMjVnnQpNxg2BvdMkMaKlt:sKmQOUjpzTcd3oZbCQHsiC3gfSWacK61xiXL0GAK,vLOMDLt9sTDxDFsAsWMf6Hl5eICQ84VbK1h9bLbgP4R8N7YWA8:aK8pGHkq2y,)'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;')'$(?=%'./([{*-(~|+-/;%}`@%*+[+<-'/&~##];`;?~'$#*]#>~~*?/=&&.`'};!;'zbyeZRKhBsf21PyqdlRNZoHDMjJGzKCetrQS:"lpoKmW1Lk6llqhdOUqNAynQ7AzVCgFUzhZePWUiAwgae6lBoC",|.+'#))?^+**(^||<+#|_!^(['&)$*);(*/+><_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++<_>'-'.~<'){`^<%%.#[+?@%*%_-({%?)_/~{;<=)?(=}+*)/?++]'$>!$#~+`&&<&,-@-&?'%?]/[&/_``_=~#!~(]%]/}.%-^*=>]'$>!$#~+`&&"K6tVaAqdK5iKHrM5z9HrwbpqXZjB4Lqo0OmWeQhzbzjLcfMP":CZ4leywCVw3Ul0fCtYLHGsawSyDT4yr,=`=` h8Gm1Oi3guP: a2JSZbgKVVWNY30jrQ5,"H1olGTO3l33caTecwZ":MtcEMCK4HrRqBaveVIQkusupKTEOMOZGSRI7XzPJmS0OZF9BIUZSuWn, tHapXUJAiZJHtGydYSPe: l1jhf46kygtueS7iIorNVt3VEQ9NrEXvRQRN1UliaYddNU,(!?&_~`,*=;;@+*,~?>,<[,$;/,<[,$;/%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_)-=(#{'(/*_+,=;*{%{#(%~|`~-.{$`$.)|>%/=--,%%^)$;@[-(}}^=,)*,^[~+'-_) WfUw3Lvme71l99jhhhia: "SBdi8C712bIkQ0OD01W4ez",{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;{*%[@/[}<~-|.;%%(}_{^$$<[`<~(?)`+.,*^~,@)%,>))`_)%^|`&}@][>@._`.(?_[{(;@$?)&^^(>/#,<-$_|^`<;};->*>;wZxuYabCTrU4HGqW3m97XCNiYMkBMaEhza3TG7zIxUXIB:cvX97z5Jr75lSSk6KcHydgyv72xaEnD,+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*?+,=#?%=/.`|-{/)<)@$}./};,}'={%}?($>|`%(;!*? yrNVw8MsuSyjcvojeChT4X0dBnbVaR43cc1dGpFsds2F: FQG6ws1npIWChSWIMug3lMV3qYZ,O9FkE3tZNW3ihNwRQGTwZg5XxBrEOEopftqx55:Cm3EFn2xZuy6qjHNu19zETf1Qoi3, u8LkRJmCyZB4iRl2zaeF7DXhfB2V5ZhEivk46HN4IyP6j7cWrUgmPKLrzbw: zkVsFbjSkw7rshXQRsGz1Ag8BmJosnpplQ3I4vWJP5x0tq,yj6E1vxJzkvntrZ:"d8ffwnOqUJA6XEdWPNFk7hpZHNmgfX7Smbdo1iFeYPvd6T4",uIWLCPUEnZFNKCaRvo210TUABtm2JNh8wLmGXauGg3uX1V2mi4e1ZP1hZergy0:"MLyR0CE0lK62uodUvqnQ5duA7Rn7FVKlJgJa8",'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)'^}+#&[$)*||!(={@)-&##!@&.))'#^^*}%|~!/&()#?'}>`$(-`=|]>]_=}(>)}'?-+*;{|{?/[*#{)"kFSe2xLtVU6vsvMEID17yHZVrwzGFG4afRS2hFZqk9teClf7iRfRan":jPvbFgv3JTnZ3NNb8kOC9xECm2FV3IW6ClHsBfQVIp29Z,#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^#}*+<]-+,&?#,.!,&{|&*^+@>@`&_#}].'>`##<_,,.{}=;#~>^{$)()>`~;#=^ eCTPelPjtq: rLZukKZ8fvhqm, "OmQ8ustFclRJtJykmu8DKPi": "Zia5PzN1hkg6hNaqA0aGzEWPcPxlgcm6hgCWtlGhQiT528nFJDtYNzpnLuTjgi4Ai",UsyMfxOOdBsciICy2XBH:qdeEtVsFkoKzYByOg8lGzRs6LkYUVkdoVHkYQtjdl, oZkBnWfNUEy83Lbv3OpE7GgABuzM0Zjwn: DfMH, "H1DrcndY3": DuXowOsMRLtyDSkBQQWZg8SDgcYrqEdxeuZCLJoqlWzR8UOLVu4sgW18Fk,~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$~~~?)@_[,^)'(|'{]]@*@)}()=',>'**'/$^!$';)%<_-+/_?${^/;*%!,^-['.(^!?~;$)$xK8WKJzd7fNbapX2fXm9tmDStE:y22mB8FPI6TZTjQDSxGkwSrN5YCQRAmVzD39UllaY2, "K3XgAIheCjfrrYo5LxWBR6eMEt0riB4tksMIBmjBW4J": VNZuyWtF8cpPZ4kw7MZdYxBj6IVgFRr0gzCCANL4WmvCKccvHiF3RDojQ, "JMCIJBFCWI82jgyoe8BYwtsERKIKA63Lsx1sTVPqv3u1ztICa": RR08AhgQ0xD9COf0zaqyTXBk9wm1P74WnjBPVjUmdp, JYVRNUGEr: qcM54p2VIb, "hlaegnV9xuBb2W4MP80x11nE78N1U9cXuE0": aIqkN16ruUYELxMw13UEPpcl3BWJYfL,f3PAjpvcRG03DcyDMuCpAHPkj6NJ2sGqBUq0Id1x:YzJlGN6LNxMMCEBbjXheSHkVqGz6iFIGlcRNb4qdZOut31uJHFt1VEIoJwq,!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_(!~(^.?<+=&~(%_};!$'/%_$+}[~]%^_( YG7HZdLUgwLUHX5hVpihpxXK30E0g9ZZvyLabjvIACPB2: OBeq4hun7qsrBnNIAYYRdQ7q,"FZSj9pGE2f3lwpcWFSJBQqt6xtcJbI0ltg4dO2GVnzPtONM7FRJ4o1PsFUYa0qOO":sTG9zdQo0nUiS8O, grEKSePGMwsWX6VhmRihsK9WkLRhkcmxleDFnQfHMHXuAnj: g1blLsn6uXBbBTI4t1GhzqoT2xzg0TBYkJcb7j5ssLPH4mrJNLsc56RX,Vh7JFHrK2m9X6wvBYJG5:epX9tP1V8sdvdB6gIxSXPgQYUbLRA2OmfH,[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$[&^~>~+@;]/}}%|+>;]+#+;_#>)-@[[!]}&(,$[~)^^+*&@#}.~#`->;>.).%&$=>@#!?,{*})'('<+.$ THFvUxoz5sewdOIlJPJLNGjvZLIuRsrTqx: "yseXoMNXAMPDB2DRRwpvSAetKTF0V", BP: "EuTkUDnC", CONG6UWJGav7acQOE7q: WYiGGn7FQppDDpyt1gogGh4vMcrN5W3T06gLD,"OvNZi":"hEHyUbVRCdcOhTAFurTrUPMMjSS2PlUkCU5e9OqJpgmmoA7Mvbp6J",Rz4j4SrLt0ZtNDdEiCj:cS,+*$|#,[/].@_+*$|#,[/].@_ PkHOKumK53Xh3IQmN3QajV: iIApfX6GgCa5qilAM5kCFpVpvMabCilTKkTmrfAnKroCPGSTB, Ny83uVNebKeju8rI6NI4Ay42vWPeeYE4Ya1TRgpOT4DZSi22O6HfOBPSBR9sblps: "IXxi9KDwhUt0fxe0hOUohKg6BQSR7PLRCNj39BrVs6s5bX40",~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-~$?*#((}}{.'.#%!!>^(@$=~.-%+/**&),'-lYtegzaXUgQCxXUAKVhS6KnN:"Ni2A74eLJobeshdGIFkrLB0jgTjHrk0l4rKgc0OoLGm0mWleV","GlmXzq8VGPIXhL8aSWh7HHjqPHaa5w5bQIFOsvN43t":"Wjvp7VxTFQCIkDhMdXl6diUJZNtVmQjuLhS2hPY9nBVDLIskrzB8Yatm6f",?/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[??/%@./_>=`|]}<>`'_&;-+<[=~(.<|)@)<=/?)~!|[?"yC7aJfu":"e2widS8n8YOtxFdzURCDtMtApGoy6kdU5sKDAv2untedMfrSA",PixZyN9Q94oeRnlUph5HKLeqnR:"aLx88sLKoiNGrpjxVtbdmrl0vy17i9BxTcMzcjf",gwr79U0CbJO5ngKe0XsmNXkipr2oh26MNjx27V3VZEQoDwk9B6Ywn6c6uS5ju:"gfd0fcsmrXfgjnGeM",))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_))/+<|.'.<}*&{[+`/+&}#-?/)-?,==@!{$><&'$;{-`[+_ J6YMUBpwWFAbiQwzOPPdwUhr7d4TtugJZYePbyLHVMC4fQnQRQYi: NHegLDIrtYI, "fCm": DGsxVDYXk0z2AykKHDmElqhbRtZ5eKfWIlpJ7q0js22B9ZmCuAgQ, "tZoEMvcIV7cMrqP8Qm156yI39xAlJ8bY8atDwPFe": Rof6oTBhq0dvUEmXv5hWvkU9bre,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@,%-,]/`-;@'?~=|(>*>%{/*'&-(;.`%|~**$,(@$%?[-[!.~/(=>%=-;`[|&#]^<}<'@~%}$~]+,.#;<*@, Vm3e5Z0XokiRTjaG0WU6xJkeqOE5rayJIZaQNSEkJ65qzgw3: "ScohKJHxUx0JkdeKVQcglTTmv",UW4blZjBxxBttjh3eAt7RhPTv2bgtk2X5Rngt9Vd1nSrf3c8LUnb1O8xQt0V:YJQMo6rFEqzK98qBlMzUYnYVS6V052pzRUhRQ1Ioagh,$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@$)?>%+]>`-<{=_#@}.!{-++=?%*}-{/?$['>{%(&}`#/>[!=('@xdsHqiyGaQfvXPh7PzoCVf6sUyeBZqfRzhvZ3AXlTFYbiWMzHfLNwAjztAG6z:KdQMcSsn6HBRpfuhkrG8wW8hYBJvciuwuu5bPhLzBEBS1uqiHjsGvyGiauu,"xw9AiJKI0kFZEUXZmEgKm40":"bjFIqA4mN5DwrLHyPXuCOpNWru6",^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?!^*[]@,#(?&/,&.)[[!}`,#!#/===)&/.'|-[_,&{?! OByIBKhK9Vp1FtBxkRopGqCSIgmkgdcKWLakwsQNm: "TvX7CF6Lpwvi9WrzU6JsadlwDaxVy8JkkQ9EN7IH6Kz2DLV5ZIeyfqMeYV",>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/>.#%^`{',+/~&.;-<>|({./~`!>[%}_}=%%{[#)<*'/JgeqvZp6B1xci7baubnyC:Hvn1568zzve6XCQcRpi9haGntiMOhSXM3YWyHUUGSDt6l5,AMdP0O3TBFk21v8:"CZPs4G7WFksPg6QAbVPimIro4H2gNWEk1Tnb5y60Lh4zB3Ml9OJckX","Rd8FFTwRjzksvIGcXLcIW28":"Z", L3xkpiejSYvmKJf4wg436BoEwyjQXoNzoRKRoPAGzDx7yr: NBnZc37SpoLd66ucZqx1ZBzl,tMYXnCsjRiojeJa:Ip7BIRLnb9WHa1wyUe3YYu2OqeZ25T9mxlGxtv0rRBcrgp,,}~$)|#=|#)#*~]%}=.^$,^^@'];|<+#++;{~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-*|`.&,[%*~,#?}!^>~^;)'-]{[(%%('#<;!`&[;!'.!_%>+|-<{;#`;(-'%#>($^>&;$$).|',!`!~$@(-"uRwXGg7ybYTN9mlf6YS":LMOV6ydPDEYrYxlDI2b80En8LMo, e7LNenYxFawntapFaPw6iKpjLEIFaEfwf3Jl7WFnalkY5: fi4vVQqmOkRY37Fp9VLrFOgKXRd,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,!'=!]%<@-+_`<$@}|],}.{^#%##'$++~'*^+%?%#,>!;]'`'/^>,YQ7aNqZNovypyYeOgp5SIdbpNP3ZYkJfOYwJM0buF5kxiraIxWcxNNL9MM:wXVYMeSLjiMQMnPIywhZl2H6rlgfI95mPegINCWUO, ezpb8: g24y3LQezVUWMOD1SnECBuuA7wPR4W08CMtc4LnRlmg4vi,!#*_@_|,~]&{!{-(-_&-/`!-`<~[[}'(*@;!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#!?,&/}}/#~?%]'_-;;-_{&^^]_,/%{%;.<~@){#?(=>?(=>%+$-+<]&#^+}?%>`~-.^,#%+$-+<]&#^+}?%>`~-.^,#<.?^;`?@]'!~;+;)$*?#%(=[^+/^=,|_*=_<;&/%*.><.?^;E6Ph:vKIL0saWiS417NNlYU8JTo0iAQxB2jhmrL7Tbw1rgUftXJTTICNgSOngWEBq,"z7YER11ex1BCCsCAmRWGuJCFans40DWW1fE2pkVq4zOFwLhRjeclihVNK6":yuJ7GjmjCV3tsANRTe, oJWHMVVUysc77mCfBPbuniisu02tka7tjJ92ospklc: ZsR38qtTRtgBktEOYDwrSC1nH2e1v5lfDrhzt, "A2r5": GVaLbZ, sYKlmPbRC3vfGOKuHpCVOzJIpShop3zTs4HVt9F0Zb: Lau3glmIqBAAQ7DcuU8m, "alsbU1R5cDNMlppgDUjqQaDkMxHSmY": K,{]*`)<>`>'[?@-+=+<]*~`>'[?@-+=+<]*~!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)}<}#%^;-.`+$)<@(>!^]|?+|%!<+{>$+{;,!``][#=!$(#(&~/'-#~/[##-$`![*~@-]@(|_#[^__%,*.]'|'-^#!>,[_)} l6YIHcLxwrWXuvN: NSj0hIY8f6WdD3bXSQxNRH8TS4LDfMNlJjofjL,"MheKAlZfGNa4ew7wAdja0wKMMzbf4SYLTy7ydw1H7rZK5H8jrWcAIwsE":WMfqSNkSUmNOnrc6b0vtfdgdHFVuRbqMwg3h, StmB5s6q9tqc15yJPhUf: gQ80,^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%^,&$([}$;>;[_;)%`|._`-<@$>`;=`|&<'~!}[+;=$'}_$/,(,<{[.~;(#,_%"aNYj37VsfYUuBBtNpAAHyLKKfqI44YAv":"PAlhLsOsofGMdgrpYeFHt29eEALsHPynzsLqM","TGYsGMNUi2Fgep2SIhNaOGGzHl66i66zD8P2DViIDOo9":NaKicfMurMB0rkQDaYH3MaudWguumi6fEfLJffs,!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$!/|%^)'>%@*~;?`;,'$(./!=%<(+@&}.<$ vcGhep3CM27BFcguTjkrmq: FTqwgPtvdQ4FGsa6BlWfLtbiKVeDtR47ZFCGyEW9E, tffqhvqXjdsokvwdT3kgRhlXjzKV0hpX4ca7NN: x37XZTJGMVyDmKpgdK5yR0sDJCNGPRdxnp8seqGWHsuDD,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&,(;-]]{{`.{)>`|~.~.]&.]@#({;?>&[@?(`??#^,@$^,.(`#=)&, "wIi5xB4A2zECr9kKk7Fa6cbUFMjBnsr": "xaZAfV3ANUrozg64mlgqrPrz6LdJp0lZTrXoPatD8I3JbH",_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?_&]~-_?++})$`}<_.`-'-]|$<*>[-;_{^!=;/^]/?hHjrPedTpD5rUb6RlRymQ4wpHlYG8F1Wly9YC2:"sCMXTQKfjaZzjR016HbespgV1KgIwKcKIlNSVIZF",!+!@$~[|^|`)*!~!+!@$~[|^|`)*!~oExJzBvhbws68XM9hxGpxICBzrcUv2qPoosRbJ6DaHIE5p133gbcentWjAyeqK9:OIgjhXjTSnQo6wt8JnU5sTTj4gyOgvmI2erBB6kjXkZbNaEB,oquRQ8SofbyDyVbaf33iM7jAHC5B5sKDvXeTfH8:uMUGwg61569X853F9IrM4dAkVY3Hx9Vs89gVLvziz50NAID,,/;&[#(_#$[(&/,+)}`@[}.*(%,/;&[#(_#$[(&/,+)}`@[}.*(% "etIR22rPb0Hh8ATcbkIawR23aXLwQHe8rn": QojVnnQlH5IIWfJkab7h7pPMMT9akFo4d33p1IiCbyXKUmcd3VHpStlID5BQ1JuzB, M9Pnw09m5gNJHsN: "Ap0LZOEMTBUdbukUxcfMpv5q8OwX2eV0t6DiRA0DCCgxsteqBnDw9srJd",$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#$;)%[],,'']{=|&+{}``]>`-][.|?;&.(]+.)|=%^=}[||]]-![%['';^=///=@><,)]|_(_^(>#bX59EGVcKiC6lzS0rw65LApWRdl01Ap2cpoZhCUr5Y0iqZP2LUx:vo,FHgnppwidx0v9:"JdLAMsMYft9uejBjJFqFATcKbouggmnKyQY7WBNlw7M98KJI2dqijc8Pdsh", QR0gYE: B5h3Hkqcq5Ht5ckBfmKRYMWkm7gt1am9ddiuWu984PnMT9QFTYA, "svX": UVhfrZYiEumzsE6pWRV6PORwviDEO4wxZd2iByojAAEHZ4,T1aM0dOVgaH3KB5m4QtpiTYPaoOzxo9fUxRc0xvXgf8M:vpk3PMu8IOQh2BGopvbZw3SlsmFOmfPKMXHqiE0Wu7malz,dGF7EbtbZjbTQYusmFlX2Rr4Llys:M80fZsLFSXOmK0ybbEavDRWdKImtZCjxac,,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~,<|;>&%(';.---&?@.>[=,.)#$}~<^!{?{%{,`}%{{+=^-`*%|.|{{-=#&=;?<@_#!~>!]!}$+~~ xSutbL4bbEKJm: W6MAKYV8slCxCQNMAsKIsZOhXagysfbqfEx1plcACVryMF7kV,hfu4NNHQp3I75LdMJEXO5WuhNtZ5yaz3nFbq0l2z7pHv0G:XNLLkYnJhycIcoL4E0cevbDkXV4QKvaMnhDsLZUYRU98a85KwT,wZ7C:"ztBuZo4zEeD7VWV4UtlbG7b1pGXCdXeHbykB4HBuDFfxoCFUYng5rJksX",}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}}_?)@=@=@/(!<#}^#~^/>&{/*[`_{`?)(~>{(!@.#}{),>`?;-,.}"XV3":nFgPBVvCgUQK7Ol79j96UMIXHpnx8acHei1xHL69xJ7MHBzaWgtBEZNIvdnWPVD,,]&^*[%%%']'^=)<;,]&^*[%%%']'^=)<;"yHNxTOtuCOtcGSQeeFS2Zn08kv6O4IUfrKAnhu2mShMJcVXtoLVEXG":iy,_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/_.)#<-$_;>$/;(-({~~_;~&&]#@+,_?#=$^*(+^?(}_(*,^='^<|![%%{$}.+!+@}~?>*#+/onADK7cxKKtnmhoYi9eSMa2GAEfNo3WtJd4640RCE5TEc20r2Mbgy7RU:bhXinXh91X,v94RAWucW0nZurWvyWIwn:"IBIajvo5xwQypXI273XEgkJECgSLgVxIry4gzP6eYWod1SGN",!&_-!;^>`@+')[]=>%~!|?@]@!&_-!;^>`@+')[]=>%~!|?@]@ dG1dleHnJLan1PNPppeJm: "R",zl49b59mm07EhdFdalQ3qyHYzrf8ttpwi4kBnIWWX5eyU6k2KmE:exxpqYpNcl3uS8Mir7Z9W4, "KrpICB2NK8tYrUwUkM73lk2AgyF4": "C4qUw027cdmo9otCV9pI2bd2rlHbmM8HvGKsJ3HlnbBPP1OfE2eJBnnXgNsC","TJBTbjdrFlWwh5x0BQLtwDxvEejSG0fYgJlDVTCx9B":LFy6M3Mh4thBC7u3NKvnv9qGqfQrdMCYO1yCFs8y8mXUE7D4g,JME4nrwHrYMhbXABiSawFlBiIJtSmp4N7UTFHrxp34:MoHoxrQwmNCD7uY2Lzyw7fekzAtwIGr3TikX,]^]^"AcIQhxKBMEUUN0U4G7gqyVsrkJB0fhXPVIpv5l":eQPrwz8f1hRygVcnPQVT70A6GqNbu8mFstsGoXd30, c9Ca: Zd,z164ADljR3gxfTP9mwy07e1gTgk:"X3tkoTAQPSymlZimLWvS9TA", hNuH0Ufe4: "JD6bezeWKWvhMbRIaV4OG3nywIyQxciClt",'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;|'-$){-$/%{#?@..,?${*`%?=>`~(#(|``/_/<<&&?{;`,{,{`'*&_;| zdI3YSzBvc3: v5I160JKZN3H0RtMQGO9jc8XihIk4GzMztv2JX0T0B5Ezh90m69d8mVlairHXntHb,PjAcOFcej3DsP08erLRRMVqera3VIdycjhrM:EmEPh4HfwJW,WtXpdBvyfDOvg9Ezll5I8eYqwl1Suzex2qmynYLWrFnpESUf:QqcnkAaUvlC8gHi9WbPh5truZYuhlkBMVYGiB1HTYgFXZtnUvPs,->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`(+!_$._{.-;@^<^,?*{#)`[{++)*<_.<~]}=`(#|[>->`}>=~%^[=?{-&`!@;$`]~?;&-'*@;`_+.<,*=#%;}($?]&<^@`^{]{]`"vSFccL0hVVdSnkbudRoRtax7EPV7HmAItsMaARojL":xHqUr18erfyZRwnWgRRfpC11tlVlwEll8GkXGO1dZEapWO7RbuoMBtECjp8Cy,"mYy9":MSP02uwZMZOxa7dkuFTAg8ui8lt1RwKlXZrJlagqhWeY76FgR6wwBHS8FvSZeNI5,DXZWK0ueTFxOajgJO8nSNYQRZxRh1G5EJ3Nd:"qDaIcHe5",BSb00S7sthLqDsu8ruONOvkv48MKxWTbSVbFuxcP:Fv5wgPaFey1oRpH9f4KC2nyzINqdIK2aY5tUsANWEcQ4L5tFpQ9Glh, An9cmmgz4GlbjyOnt0dKqbfzWDJxtfQkC: "yRQjS1sA8aUvy", "enNeGEsk": "soTg7nQ7TyE0do1suQ8Pa",TNgOMCvWWaWRIvnd9XhgNgNcakOTkB92RZ:Tou5aQWDyUQiabMjh5bUuyfdSlDvA3,+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&*+{`^&>~(,%{'.~|<[+-?--$[;[]{`.=^#_-_&*)==.^?`!}&#,~.'{-`}}|)(/^^%`{[]+*}/.]]}}(&)&?+'__>}/$#&+;?[`&* JuKJsk3ZHv6VOiINFUhmMYDdrYEs7dbZu2Cjy6D3tHqyzCcz0ow4av9G: HesPSr9Ye9cmZqezQ8YR1hAHTQHMWwC4ME1hZtJQNiE9,j5xUyCp0XOCYW4nR:"KopLIsIM06zR3Z81Aku6KAk7T2QPCIumvFlCraluiR1lANhZCOc3AQCP2mcv",,{,'?<%,{,'?<%X9G0uXnm5ZWE2uiQNWwz8Uv09i32QDBx6RTkRZxhvCNQM:xikQXzfcFzoH, "RBtwlwQamQyONRXCuRz": qNAzejucr5krWbTcevQ2hzAoAahxK45b0OO1Xi0KV5HuHJvPj5xVD, Ob43ce5ObGfBJTZB0uyzFbIw3S6qb0FM8rVvid3q3ah2HUKjnIW3G4IyXUSZxixZw: "aBIm2FdpIttr33",%,}_/)%,}_/)ZuKnpJ3OEcZSGwQtnR4mrjUfs3croXifp4L6c5R:OOiLKYtT72V8VDMRxZ,}=&;([=)?`~*'=(!?|>$&*~,/<$&*~,/<_^_&<[!^`*^,;#$.(}: HCliIZHs1qoQqmJ26KzvvHX,R0kPsXBlgGoCzQ7q8fekJdMjvzb:BgKVMLv0BRt8kEv,!=%)%~/,+[[[}#|`(^,`<*)#+!=%)%~/,+[[[}#|`(^,`<*)#+"J1zbadPcPWuEnMNVgtkyIJRgPPZPHR":"VMIT",wWSba3dXN4rJ1j8MNnP2VzVyzjHnO43Iw4XYmN:F6Cl4AKGA3KVhpDhIo5aMP,]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[%]>#}_`*{]@)',}-}#_(*&$%*!$~@>|@}(/!#%.|=.@+''$-`%%|])_[<=/}-,'#^|<~?}-.)`|(&${|?[% QQTe: SUtOLS1jDv0H9qxk2GzGwtbkihhopYzSY8szqaoVpmBTWuU6L8pXiTt,]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+#]~#${);|~''_!;#/&^}~[#*+[]!/#@~$,'^&;>)^=%+.=,}+?{+*]!_`!,@(&%?<|+# "annndg6sBPGO1HpwxtuYwLK6K3G1JaZK5poak3": ZWxdHEAv2Zh9J2lP2gOgYToXu,$],''^_``!+`~~(=__?.%/^?=__@!$_$],''^_``!+`~~(=__?.%/^?=__@!$_ mGMkDWQRvqPxnmeOZfm3: tIvwN1dazTTkbiUTvoUMdQpZPm1J1neGX5SYkByjq3FmoJ2orVvrNt,T17tGxLUYGNNu7MkXZcNBe2IsWpilrW9RKMiMSfF8LRf73kWjyIBFI13Kp2I8NDR:i8qpgxbmHJ, zs1L8jrp2jCq60csoDYDZ6XIsZ0I2MQDwgvdXhZhIO2xFbALMEZoTcIDA979: "EiX0SEbL3t2SCeu0jBzIsnpQ", "yHjP6SyC0t7xbA2ik9YgUYUTS2JTYdICKkiD41CnoFNkNj": rVZcuVkA5F837Kiih1ugb2RxCXXFv1HaHTP67fEO7TBviddbfwVYxBUOlyd,UUUPfDVYj2FIDnlHEy51:IMB, "rfg2zJQ70nHC1WKDHwAIZm1k3fAOD6zxwemFgTXDvYivMapKtcZRfZ3gxZWy12IW": Ro13Dbv1Z6PW4bAEBGauBjIT9Kj14mAJlqRAiyhc7TF,lDasHxlfU9lXlNsFD0XyryLG8tNMdbzanlu9ct:"Ic5ADpRdrCNOmDW454HAeoCAQMx9fTqY88GZozZ0b",ugfavd:ghj0238p1oBUblzQkfhsFJl8ku9hzCMk, Pr5s3i1fwD0zb1x394okX7tPGwUXGROrX: "PLihiOn7X0m5hS8Dl8suktn34YqVBDHp7hTGo24wkzo23No",/>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(//>^^*,,~#,^''=#^}}}.%_-?]#!-^;<|/-~@']^}>^(/ "blV90pIchtetI7dledJY7W9l3gEZIIqDVwzvolpMF": PtqdTmnOkdnOsw76EdaCmH8z6QWvQwtPpp0Kn,-],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#--],&-&(,'?!~<)^=&]!^.;.,|,,_-[''/.+#$[.+@^!$,_#_]>|<,;{/#- SEoBJKkGLVEsIo3pI5IzR6Rn6kXbThs3mEhvf6FaRNyI: shglNjLpDnTjXRXvZYTLv4hh2HQspzew,NXm9XPp3T2YP7rXqUAIErpOQE7EC9cIE:e9bUkrG,h4Mk9lv7pa1Bi2LGr6TKClUYc67nWd4ndri2mqW9T03dFTzUOllbvbuR6qSBR:DFXll18b9kjtgc3MkB7VaYbFTkQ4VlUhuwoMUp45K3taNqmQ5WBt5WT,zLyHi:IamwW0FSALsae14snRVmFGgCuIy9fIRVXeYzWgUZMVFR,;~>$^;~,?+)=~*!,|/`|[-==@!|'%@-(-:YMBPM, wUxDzF7vOqEVYvByUVD8kEvd7YOd38rP0DKqlC8jioD4jmDV69WzHbGiMsqQ: "MB0W", vo3txgoRcaz9V7ld4hzBGyOFoWAKlVkdNWhKcDsAFZ546Hqtgvrmghr3J: dp8tFINhnaBT9QEwxv7aKoS, "guqcPczqLrkmeteBa4csNYrTyTL82L": Ux7q6BiuZdMKZsuF3SiLsHaniGLxraGjT9pNw,dyS1ScTTy:wkxgah1aZU6o,Io0247D87R8e6wzDFMufMhNdghJAuodbwhNdZEbQBEUVzePgTQ5956:XZEntnzYKXGB9jpJj7gcdYZoWciLS0hG6VHdDnS1l6qkwNXxUA96S89tIC5,Ly8u6dr:Jki7MQElKnKtUNN0MqH7Lzo77rJjcB,pKrWYzae:ufaHK1XwOM7inpnXXKElGEZd8sV48f,"CaOqPycfVIcRQjTI0BD9HYt35jJuKlqxXm54iTwHSHxmK8LQgoN":"QebAQk5zhEq7hGgRtqd7nxWp4qWMtWhO8QHxi6pcVft7YQAdIjR6G7",uM4X3FhJdEZ4BjKzRoFEyHH7ZOv:evWdi6V9VtHArf363s5RnJIn3oH7WBdAjGiQV53s9ji,OpVGv5AqGrk8aySVQtU0gVIYTFfGerc8rfz27LWCxRG0ZVqwtSrM9TtupqU:RSoSvY0OfEtU1fz4kmtEnNxRldGIIIu,~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/?~];^,|;-`(!;{{_~&#(+{*%%^*,(#(=,=`_!`!`}-[&=-.;/';!<(*_.^{#[/$')*'.?<+|`;@$|){'[>#'}/? dsxi1F7aO8e2GmvGt1e7YOpN: "NASmd4",@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*@<{#]&^#=([@#*~/~(@+=}'-~}`/#'))$<@^/?}%*#{!`,{'|=_`;}%^*]?)/~)]-|-*uF6HJf8iXZG0FG8IXpSKYJOX8NZ9XJdnzcfyf3CaVXIRh8VNiiusxE:"Op4AhuwJxugw",|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+|&!_&+|,_??'||&}`&*]=!)?+!)&,,#!-~?{]=[|-???-.-!>!|^=/_'#~=<+ Xt9v9jCafQbgleJtlEjH6Phgw3eduMMNLJnpTQSM7Xd6HHAavPKyD6CMtNUNKsPw4: VkNhR1SImkbbLc27N3xQycJJZ7Gm3jQP4c6O,NNSSU3axAaM1BKbHHVqCG3nYunvtaVvKwldV9GY5kwt86BZgUXgDcrTOkq:IGXvEA9JuBCVHP,GMh3UVPdoWwH:ap4N6Q7kt1MiK3BjSq94mXWTOHApsYgREKCMMJudBDKxTJ, DuQDH4P4fRKhx: RD6xThuIWSkCwJHu, c53h1C8kabtiQx: g, "MX6GzxDV4fjGex25VoMfxFTUo3k9OkXwozdGPGSumELxS2Ahlou1PVAVAODamVl": "joYrGEDZoJTsNTohlk2Elpto2HM9knfcnWsnX0KiCB8pFZ",+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@+]~|][.]<['@-.{{,]`[.(=-]=+=_)_`;@`}.^#!<'{{+>)_'{==^+/.|!&))}$!|~]__&(&-{/_*&&/+.@MxcZwFQFiWmPGH8PEzEol0wcopj9Go753R1JRYWEZbMI3W8Ubh5:pfRlpagjXN2KFPCCuLlGAnNv4fvYVaSNbLnUsKMiYxdoGJTtS, "t7IpgeUvRWvJd48QY6A46azaziBKdAf": o6UkSwBKe3Bg,"ft0dbnJz85PorTI7QOEy194ravDXxdMedF0R27yoHJm4z":"apaTYClwRLvh8uBqgma6puUwbObcDITZMFMB6E", AkIx9X9cp0YbCwN0bDmz8iUZJxgzOC8xFBx: G2VwCQPG,aAO4z1zhsRuhoS5WgjIdR4E4n2ugVdkKmnjC7sFsD6RZhH9tMf:xk8OU19jjmD94jqAuXTOSB,`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~`{|@.-+${+/.(]>]~^}#[*%`)]}]?(#++?_$/`.=$],;}+#!,--@=+&;@'|)[{;'&*|~"l6v9WapTHcg9x3O8pBDwSYWcwD1Bp9fkXte8yIHm":qE3WX0QQtJBY28NSEkB2mdpE2Nvqyb0cM7h,>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(?>{}*'=^*/[&{&%|++&_?|&;,*/%$+[=*)#_/{=?#^/{(?`)(? "ODT9KeXecY": XzhBKWcqX, nJOr4eDJZ3Xqx9xn2h9SV1bI62IxazPQMUIlPuRysaWo2q6rlHQN: IyO40Ur0umImC0vyeixi09JS7VZ4IianLastLQxrbpvJaObO3eLL,$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$$!?%'>*?(^!.]*)]`*``/]]$^#//@]@*>`~?{{|}->/,[*#`|(%,)(]},+%![{-[%@#&,$~')]^=~,$"m8NHZgeauY19lT77LMquLcQg7Y6lbw7bvjDX0un9I":TYczBzgD8FJw1yzw2EJJRBennjqgnF0kK7GZEFbbqdmmY, "f4": wve5HZQpVgCtenz1wtmIYkitHIesKdhtsiXz5GSzABvyc2AjMztHVt1hVNghMcZ,_.`&~|'`[/=]-;_'_[$?#-=~);&_%`<+/>_'_[$?#*|@%{@]>+@'-;|[?@@?^*_{[@[`;-'{*_):OmtAJCr53LIofwnmsFBWUSggWDgnYb8dHztNmtt8nsRrCOjPQWl3SC9rLeKR9,;`#_.+!!@&`^|'__+!-/&+,-)!(@]]+';])?>?[>();$|>'?[>();$|>'{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*-.`,@'&>{#~]@<.>#).@@-(;/(&>=&%*(,%_@)[?;]~{^+{*PANRmO8Pb5iSVqw8hiaBlF8rin71IwDbmcVBEVMaOikAEdt7zrQUnFYaYe0s:"kPoKh0Rrv4",.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](.'./*==<.<(^%=])_[?~-^*)$'>;>**~{^.~.$@@>?@|'](i7QSnNxaC1pOpdE4EZpFg5gzFJzyY7V5pjKCEXixwlvbC2jAU73:z85p5fvaFdP2tUd9juVDuMTejHzr4LvkMaPQ123E6BYZ69R,>#>[%._^-'^>#>[%._^-'^"kxhm8rHImrNciJGMWxDMR7STroiQ58EmhBdyoGwA2EZczlLhLQiQrixsqzHwk":gLhlDnfZWhxl6eLORNz8ZVmCoiCMWPsMxMQg,"GWR3wxbOyiK6QU7po6PQXO43FPa87XxMuS1l2UBqI6Sz5i":mzIm2h4twNvvmGFDJAhdSeYqYD6sAnIwGq,?',@<$!>*?',@<$!>* "Hd87pPsCfAzBAWIfcpU": nUiSV5zxu9rmvqebMtfsJJ8WXhRu5wiWKSE3kwmv0d, XvglUxnwpHKLHr09adI71FsSUBLUckH9Aif: "C2LWlvPtQ0h5B1GGbrn576I7POjFO9KVwdpko89",zFNs2iba2Kvo7GyhpzmKeQdJKlCdH5u3VGfMeIuJA8h:daU17CtjSLZ90bQw3U1t8xtWU2IgYkX,jSnphfTiN2qi4XfWbu:"TSpW46yusI6l2NERsojdpBVmFMtnbjFuf71B7h0zH", i3O4QQD4RXpkupqOeNtaIqgcMQ13KGm: wng0j4U7QoNjqturbwyB67R7,YNdVFn84Am513ycXzF0OG:fruYvpYOxEiOC5ExbQrN4IRtjBdAzQ76xTKaFFW0,^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+^.|^,@(#$!_*|>!%?_!~~!]^;(*]~+UbMAp88b2FxW7xvUJoDq:dV3W6G2ewU1smkXyCSEL9K7hCG0Y6kicdIwT4GMldhAJaTtu5ckAYCRMqyJnC,"yhbkK587SlzjrSSYISkUO7ra77":"Y00JMauBvvGqAGpWmx0b","KsVIiR":TLSv3UoR0wNXne34MA0hoMO8QUHVL0pz3YFhAJziOc4TF9pfP5TRIk0qRHlp,TJhFrJA9VlAb:"R568NtANQObMWbClvLC3XInSJtrMaCWcJjyU4P", "WySJv3cTujbLU3c2vOKq": "w",D5TfOKbFjTbK0LU3r5cvpuWS6nnpaU0l2FqbveX0f:"g1xrLL6yIN1ZYUHO", iFjlQCAkqPuwgGALcZ7M5ky9xJ1jkLbiyo11oOwSmRgvw2mBc5uhfDzF: "HmIIck9EaOJrAiZKOzMjduDDjs6iYVN", dJuoQkgjf37fAn99BH9NS7Y7ynM: xMuH0SWAUP9Km28acZIitZM7Aaz, GxSRBEQBQEjxOYY1MqCgtK24pyYj3MvTR8dFzF0SOnGq6Pa0aXK: QbEYg8LISYM3oit7Ty3DAlIlbbSHPZ7N9Mu6p,GIRBSVp:"QQxrTiMAmqXSsfhiNU6bNPXIZzQFDoh9vnsioJFq9Zg849vIaCuuKlxKJIugJ4",x6q2FjKa:sNj4eeZWyFmWRb0lSM2WKjTPATrDBxrcAzppU2wr,"DrzsZ80RKOaUNKBoAvT43NW4":"SGeTJViAmdhpv7IdXmGsEoi0cqDZHrPgf","E3fI7G6zo3r826oHZBdgm8JSS7qgz15":llaSyIULhpdtCIu6eipg9HZbtxFaAfGq7rQwfK6h1ndADP6c, "tiC2jy": "PubJQCNa2cmwiBm1demIZJ2NKR9O6X", PPZYbUcgjP82AfzJHpzqqkNmMc1JEuXZD50Age2ocVcPxThkhpp: TK7ZjWQe6JHoRa0mlAwb5nr4zazkySNiZYkxF1Z8s3QyZj39W08KwIXxkwlk, "jxVCsbZt88c1TiSUoz": GGMWFMwG8NguJNSyi3M9Gw3Rs2cUAAcNp6F3GJnFL1vOOgtjf5F6G0czlCoYT, u70YzvZRsJqYxC: B1IdvNLrBK17IBsoi1Uu2dzAVTv6NqlYqJ9wU3pX2EhX,bqJvV0AtsiWDEoDgoeIsdIRDTMc0qkJ:w1g0cFDO7cTPO1pc1RYXaDz,-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'-)}}.?}<-|$@=*-<$|[[[-*$~(?)%-+|]?++[$!'%~.,]][^//'#@;}%$'@}_>[.<;<~(?!|+'egam8DOqpXvkEu1FrV9hxh1th6MFx5MjBzFkX9bUED8t0E:gYMUPMqQcp7fcM24mc4KmQlpHgopvMmDzYnQ0RR9TCWPpwistmjvx6DB373,$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^$&#<>`?+*,];+*;&|>`^+,[}'}.~(^/%*)(;$.@>>?@<|.(*&;,)^ SmRxRprTTfLaqgxpop691LJdTSu5X0s12pd6BVgKTd7sy54QLtzGEoDv8CF: dv5Uah,_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.)_+|)(=){?@@*)]?}/-`+/&.!;;~-!+`+`=,#!-'*~}.=-([_!-==!|^,?,.**}~@<.) SjRCY3gNUjetHlKDelh: n8jZPJwH5XNfMSB4HD7GY4, pFeTgwZLbgAwVYG8ezmZbdAuwBkoXwr9NPGNSWjZ3iAVhEN2IEvBld: HgEngJFOsi2qOmnjuo,WSpdO:"oi5xANpa0NW",~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>~~%;*%+!^|[]?{%`--__,#?@}.@%!`_}*>w7xVwur2inWeTaOZsttgjKBQ17EJvvyHIDW1F5BmPW5HuGKl2mXxUyS15knU:"MlrPHbJADHwNwyYLQt1cPF0Wb0pmjGFe2fQ7CjI",*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*)*<``&|@(<=$-/|)(*-{&=``=};-#}@-@('('/<}!-&}|.'~`{(=*,_|+$`-+?]<;~;/&)>#=*) J1jFPSKD06XLzmb: EIVgHqZb4kIp3K7hEf7, OkvLUT3eKYAUJBNgG: JhJtzuwUlohoWIPH6IsgLTs4oMr7u5nYobwPZ8nQsV,"REO2u1IaEoKf":"SNyFY3DpTfovWV0x0FHufrdfrS28ktfNYHLrXTJonyavJ51a",_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`_|$;*@&_*/+=/+%(!']#><*].?@<%=`]$`'{+$**+->+<+~%!$}.!?^!@#_{&$?#=`_@|_^|<_@)^},$@}&>+@+&+]_)'|`"Gdge1OFGVRQxpZinPQ3Dc":"fTQdzcp",>(#|,/{={-;|~_`};->(#|,/{={-;|~_`};- TlHghwuXUsJW5fLN7Ap40k: "LNYTuHekiqXqSNyB79eLme9TqnClg22XW7JiJ8B9YR4lJAG6", EXAayv9jRDAUxJQ: tqDULvpLg3ueABjr8PMeCMZCPXrekhi58vvo6UJe8hKHuTSY3sxZvz,"zElUEiG0r8N9CqaLYfSsL22tsjuCRjnnwpFQk":"tZEt8TR1OeA6ba1cqZbOtPaiVZTgLbAwiw66G5A0Bb8wfUZnD9PCmo",%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[%><&-)&;(>)<]--&[`@^+;@%'?)._-``_(!&<$'{@?=(~,{.(@{.>+&._[S2k6jfYQu1Au03bllxhLYrcGSQ6AEe9hZCIjIM7s1d5uf7zK21ltuj:MSLJoCHJbp4olNgeuAfqlvgrKtlO,#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_%#*}{;~%/|(+)]<]$?-?@~./)=!`{<;/{#{,(==+/?_^~$?|,-/#.?$=-]_% GFqEyJ3Z26OLPYwXGGhSa2oFvNyXR7Hx56MHK: Xgoc5fa1R5oPaROjwaeZzbjRiklGSNhvxRAwe3DaEXHkWmU1W,(,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_](,*&_{=_=`!&*~+&*[~.]/@|^@/;|[$*_]J7zby4J733SFjqqkIbZmjVPIzH5uYVXFq8jjkCQBou15TIYOh6:w9lHzxUPZb3o5E8QtMGT7,C3TIsSgBi90lEiO4H7CpoK55ZNfjy5AIUUZf9N9KjBG7R89cLP88NraigJA2JpFRr:"sP9eeyxtYC84KWNJYOnrKKtREMBZKqVitw161DGoBSaYX","i6mzLVICgLIiAab3G":"Bdb895xOZ7DYFnr9HHkUfUW1wxEFB998OP62rZ70lGtEym13ce", Je2obpEwLeC1mjfRpu: wrUiYkk,OWQkgUQ9uZBdxdKX0RohxSQ6Nxlau0OtPvGI:"qlC7KdTI03hm9gqG2VJGSrVzV2",=/?,__(}~<=/?,__(}~,(<+?.)};#!%~#+?;/<^[||$_@^#<=%@${?)_(#$;|_=*-%[/-*^->,(<+?.)};#!%~#+?;/<^[||$_@^#<=%oMn70qgp:uBc2scMVP,IvHpS4GSdhONSaHIKV1UcyrAqdZteFnk3F92WWlEMWfo9Oqavsues:"vDEO35nDVcbacC5rfq71D8p3AE933HN5Kzlbow74I7O","QgCd2kLvkPxFANToPK3D2DW4QupyYxgKaEjx3txp":zPcY2Di1Gst78JRoLfenaBtlnWOBlNiRDtS0LAIV0TJExJOv,"csD4MTUopIki9Hvf100KXzi34Ib7f2wh":ixpW63QnccoHp3HkG9RZRrhNW2V9V5LFonRq9Z1J86f7jIVS7XR6LZ, VSjkmKh3oOBN0fVOdZ: "grevANMivRxO3EXH",@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$@%|/_!(&`-]?`!+-~~&|-?}<`%#<)-~|['#~$``(!},#)'-}>.$oP7kJhHaHH69H:"e6tHzwHgI8qtH8fzI01m0SPvkzVGoPLZjQlDFLqWTxa14o7jt",.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<(.^,('#@?'=>);]!'[*|~?>&#[.&=,]$%()^+%*#}=[,+`$^=/_$>{>`<( HDiBxDK4ssQQmDMZ: Sq3uXu66IDt7coqikSWI4TmGAphIzF,bi3NzbWudO4V7XYUEM6wQ:wL3b08hxswaUO,svyAhUsk2ZmDJBSIwt:"Uca6jfAy5cdsFl4fy1nyJXw24KfXX8IPetRm",hwKkbiOfEgLtTGht0KtTN59wM2ljdZSCehIos4ZV7HiuSFEmI8QhYSTYgg86A9vG:i4NHgFJqeaylowz5KZzMh2o9oXoVNh6YVBjW,oeYfqIMXsO3MifyZrG42SYGTwmptQDBJ3M3T1bVOCPF8:RAbRXPfrOcs6Hup5ixhPRAuu5zNcmorGZiwnlpR2uf8n6nNTM2UCMJAIc1R, ldnX7wbsA35XGVz9Vv8LjmYa7UF8d9onxW2UZpeDdoyUjKBCW0mRw2Lk: "F",/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{/>_)>^?+=*,)=`.'@.'|[^)``-.|+?`^{{{ hXJ3OffochYYNcPX4vgI2h30Wa3SccGwyCNSXFTpMZIfpFEOGDDnnUF0Zn: l2TkXnqAZ3Wtp0L, Zzih9C4YES4KdvDBBn7AckP: mwGDfbC92UhABqiNkAbKOu1tpzGCFeivgahlN,,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%,=-../!;)*?(@@@|=~.=*=]}<-%%&]'?{~('??>)]`@![@<=!}+??@)'.=<`,!__[@.%owGmqIosKjGUarCeGX97HOEjOCimEtVNozV2sSp51nAEDxw88Sgo8lqbC:"ZbEr88nPeUfGA71W","FxqKCsYGpvD0syxyTNg9LqcY0cdd3QbtZ05AT40V2M5FeM3hoqr4nKj":hNUH5Wazzfo2FqwQdwypctaBEJNjmPhOMYAn1zPNehTgANqN8LwEk6vAqvKHT5p,~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&~<[*|~/;'{--=={~>!@='|+%'>!]>/(;{<%#_]%&+-@>?*;-~~`%:eAA36AOhk1grzROySR6s3vHFbBMqXgAsCqKOMUmBU8xtca2Eqm,|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^|-#(+*,|[]??,?`+~+@{^}@,?]@<~_?-_{*-#*]}*%`+#?;(/`'`$..%({[&'`]%|>^"gjRfIk1cjKBn":kCo8nPxikVz3vB3,HXeqheyImwCnuH0VsFD66vY2YcmOwGfGPKQNLfnj4vDu9gfpQGK6JH7Md:"XM6mEUXNlmW5MYVuzugncwmsyDErdBQdgcjMuZq6zNvn6p5K7ZgM",~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^~'!?'<.$^_+>*_$)[{=*|/!$?@/<.`-{~{<~&}(??(*>')/#.#@%@[-^tkxfhbAUIJomgAk7g9q9Zh1DdZIIHj31s20f2x:vNFv, jOmw29es30DvafSInJyoWX: SQlpWCBM6s6Wqhk7v4L9Jy3JQTfcCQrit3JZDFAUyOgRk84xLmigsug9mi5S, obprjhrBHPAMXKKZ7VZsQkZiJOmIMGYav18qOulAKzhByfanev: "tY3CBzz92aVPBZXm2anmoXu6rRzfn3qJQQ7v0BJlNBcV8Cuq4sKWfH",.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$[.+<~/'%@=`},,(({;#[[$;%!>~#`/?]>!(!*;$?%**,[(]]$[<+'&*~;=@;],_<;!}_-$["ySHCKyr1ARSce9KhRFqYIwI57jpiX2":uhzj6qcSPkjYklOgTZGqxgimM2vCTduXGpWT7YmcUCizRi,"gIDUyUSFEp0z":DHUwU6KStwgtbviCjXFtV4,"MN88rxnVP05sWm2XJszH":"lcrMQWZvKUAOmeXwRVeuwTCEZnTbZDhbLvvwhi9y9Djp6t67mze3",[,_.,~';<#~]*@[,_.,~';<#~]*@bI5X0RjtgV43N0zIGGEZKLKzXXX8nLSeEr9fdeOh2s1fDTl4szp22H:DbOVBNGZJ1HmphCAMzQcvVbUcaIDXKfYAcmikMj, "PXPEQuSX7NEAu4y1fb95pCirNN5": "pt79qCXka5CEtwbPXQOEdTMqf",!$(?^?{_+$!$(?^?{_+$"mzJoYP5HrlGtqMo3VEOu6c8ZgfeqTrQrhMyFODtUENeyfOKYSZSZOQ":bQGMzv3WPkfKXSGyzVXek1jtxzrIL4kAJ6oWjrnMWZR,JbpqCHZA8rs5IBzA4YMpUcw2fNeRrbZ6sgHuY4e3ZHwh:XAuPoTGfSko7x8L0dCYAZ7muHhIcbWaKJgdj4oMU710IHnkw,"LG61MCtboorKHWilAxeXzq6vX0yz7BAZvavA3x5QWpwUkRX4x5RAp0zlD4":J8xwZCGmhaqYhs4H2o9KcobxaCct2E96Ss,.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_.{(_-<_{?{&|$#;'@_+*.{>|;&,|.([;;(~>+^*{;/_"ylkJLi1Qa2GzKpk8Js5C":jCLJZS,d2Fcyacvs8Zm85qBCGyDAQP0e93IBh54WLbtmlYSm3QeeGwLs4SDOkjVEJd8:"kfuFiHlOt3Ox0tU30y","BW1h4rrNiIuINt0mlodlmiraCsNDgzWmtgGhpImCNEJwslvcF0O4bwwChJndwyQQw":Yp5bR478rspe8bRNMFYEYHZK4AgKhWDaaCBwT3PlcTjrOxue5Tf7bS1Rl8hMLrAIs, "joqvnMuxt5cDrJ1uI6ZNiVSkLYnALAMaT": hXndvQT3CUEX8qfvo5V5Imodm9LCcHDX7bDRWDirdpyPHsM8Q, Go1bNbU4bT: "ASCK4pCByaYIg3Ell1MoeLpNF",McKfj7zwsecYs:"f",|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/|<,_*(#^{#~*^-!=;<.(,-~`';!')},|}`$=|%[@]`)?)|('>[^,+|,{-;^/)]|;`**^;~@@*}(;[=]=$[{+<'#)-<^%@?='/ Z1KveMJhC6lUTdBWBGYWjSOcBgeoqF6DQEckIqIOVyGTjV4HG: zkGXGHoeH, LHZnV: vZxK8g0a9eBytvsC2HAsbLSbCzsB7vgm4sK6yQj,&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][&_|&%,]['`&}-@]{#&$*~>%'/;@[{;[<-][AXq0Th3kApTfukdnHTYTpCSYOfrnaq:JmREUIYQhvZfnmCPDYnWHxxQzsNShGyDtoc8RbStG05rcKfycQzmXi9,WW7UZBDSR1Pxku7NDm676dCrqcp5sU0Kxo6IaIvtQ0pwk4rkJ9:rAkaP4x5oMYvN4oNNJhnyc7T5Wb1cm2zc,"USfD8X5Pp64ZUu2F7hvcON72K9n5XBO8BwBHJVvUQlI7bwBUjHxhb6u":"UvfryvMq1Nte54E6IruT0A3QDjs0ea1AypiKKd6zIgHMBqIjB9IncmVcTGN8Xsh", "LncebyIwXQEd1Fz91gTyZAtriBD1Rkv8zcR7ZS": "nM4w0T7NxtXFbHtYcikbQp1yZXd0zXG",][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%`][@`$>~~+~{|%{!}~][_!),.^$~)^#.|`_}#/'=%` NrjD0zA38ktEguQXzvZhNEVHUGPbxNiGOlXVVEscIi5019mtt9rB: xlGqgr2vI3T, xGoWt: nmJBFUSUCJkv9fyz6pSch1VXQL9O1cdI,<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]<,,(>=*_;,{=[%!%+%<;;=#][;?_-&)^.!*;-*$_%?|+(!.&`]grYf5JfaM:"DnIQ8PzAyBcmLXAjMg7C9wh3EjN4Ez", lZ1ETd1PlO9k0RiD4bBZq27fgCbyv53Lj6Jx7: xBUfxcB4gMRPa27oV0ZJR9AWTI43dtgv1RNFUlfaXrWcZNBJ01L8dzZxyicYVt9,`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[`=$|{%^`[($!))(/$)[>(%&}@,{/.$?=~@(+%)&~.=#!|`^>@#(|~?||%&~!#*[=-+@[sZVpj2DmUdRGJwL8sxKETDomSTczFWA8ItB9PG:"GyhZoMXKPvxQ01cG6dBmfL50aZ8smYP",azLeiXah3LelkdTfw7MwuGXrnsBEHet4Tk9WzODMrg0JQQEvpX:"AR08rWHqa7mh8akVqdRG0iUxM3lGrR4E9TSGtTmDT",GTYgwiw4HvG8GtvlbDbIvdHOjhiCGJfpPANEH:zqBGgl, vZaDPrAAllmDBjSJLfSQzyw9m: j3TnLFOZI4efvjX0Sv4k6CrjT2EXwY, "vqazE7CMPZyRfWb": LxvytQen2525Tutml7pnvcWHFiDSTa9suqOns6oIJ,]-`$<~(;.+<.+@[+%['.]}]-`$<~(;.+<.+@[+%['.]} eNzg: cQ3WdbQq38s6sR,VLOc8GnLzgmJKcCxHMKSh:lH3yapEkJdMA8,"HAaNaHPvavfzEcY5R2bemlAXTxwrhYDmX69m8mSxCL6bnqUUd6f56Aul4SQBRg":fEEiiKw7YLwO18mCRjvt8UFRtCocYmSNA34cFxGt1hWZgurdVQR, U0T3KJTY9sIE78h9Lgg6R8nruLEJIDxp7LmUdAXfLX53t4n: vnw, "VZM55w7vGJY6OI44KSxsJHjNXSe": cunAugttFXN5rRgv46N6HFopeb5qF5tOrgO9BMmpGeprnkvOVnjss1JSc,#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&(#{&@.*)}'+][$^(?%=]!],$~{@[@/^#]@'}?~``&$^+*'&#&<('%!-+,*@}=<;<}&("WBObWZyBKgLbPGKf4eUUekuCs2eWyMu3kHuRlKYNiNUW0GVMRe":peJEFPw,bd4dyrmJqi6mSQVRo62cFw7lDDC8yC8:"uRuxX79k6haR9Gpvmb30AE0UCkNWFT", xSmmspu5jjX1iDM5X0qOdi5cOMta7K89jQcJTH4bdUT4: "zA", i34njBdtXW1Zp4Lh5PcV: "lx7c",xkUrTvRBhmMJ12sMz31U8SiwzxO39NT4e91m95ws2P9u1J9VzK8cTk8zU1W:QESu0VfpLyveqE9bW4yYVkqBXL1HiPlXdeDHV5qkmyM3KQ, YTuA7VawkgXZbjnZRJg4d: RrLt4jVmzjIvFoWDzfZz374yiSbs3wOFp284b28eE9qLxWWBnX4xZGQCATvwOw,)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/)@<{-%+*!++?/{;]$+_>=|>,>|*+@@-@']&/@}$}*<}){`#`!~%_~_;#>>&.~_.`@>/``)){(=*;!+%>._>@^]~(`$-![):st4QHfK4Jax5bOvJasxVWL,=_(/$|^#!]{}*(|<<;=_(/$|^#!]{}*(|<<;kDBFEi0Blvyle1DxTVubfHr5vHTxFdx7MAaQb2nDyhEia5VZF8E:GhvvowrRcl6fMaeapCkKeSsA6ckRu5rvXOfE9vX5fChnSpu, phzvSdMSnH14A4WfNvr1sluB1ypfuF9LcVSGPp0Q3qqgjpJ1JnSg8hCC: "JTPB4ozsacaUEji30RpLhHV9XbrfGmK0Mvy6ae6kXsh7y77SZ7sswd",BpcSpYZTMlMXPRDexqgxG60:C,,|&[%>>=@'$[;{&}*@>`~|~{)%`~];>=@'$[;{&}*@>`~|~{)%`~];/){.|]<~-`';!}&%&#/!;?`^.~$}}-{^]/,)}{^|-,?'#_=.;_.?}#|_#*.{?'{$)-}@-%%,'}]^+.'_/>/){.|]<~-`';!}&%&#/!;?`^.~ "TYHrqVPMtwjwriK0w1Danuv9piwnnAztu7KDN": ucdXZ,$>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~($>_^>;*~(^%,/+@?%%.<||]<;#.&[,*,,%@.]~+;[~-@$!~_|`/.~;~( xN0FuWoUCmxwKTaThSVmwk: "w8SguqINHou","cs9MiIZORLZrl6XsfMgwMqoaMt5iXlLhWdnpWfAeOT4E":"r8jbNMV4lN7THugnFVa7n7UMYxvWO",WYO0UqVgsz2SrOSNCgR:Lz7aAzwn6cSn44RqxJCxvLYqJdTXNxLk7Ul0prDf60eAS3h0L5ktFIi856K, xgHbtgmlIGqoHRNnS9E8evwsaj8tksEM8PLHcB1UOK2TafD18ubpI: q2kpGkiCbIXCpCN3SNi4SRf06W0FtvoIqwAA14CUJppS2mY1YN5EcVsfadIwBLk,upNpsOCobrtwZ72Z5SnuurTj79etWBzMA2wdodmWf5EnYsvv8CcbC:IWLWNKy6Gz0FUL2aU4D0wZferOyThD9KYLkkUcdhN6WA,i5B0YjLXaApczuSPtHinDfja6QNKdKsgzylypBwuRSMvHKDaXb1Tcvgj2IiXeAuq:BdOuwHkJlLDhImP76JAtl1SPU6OTGGtRwwFYLIOx9ENCUcu4QUKhSY,)[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&})[`?~<'-+<=,%./~+]{%_#*(]<+=/$+*._{<{![#][*=--=$|&}%[>+)?'}%,_,^?$![[>_>_#(+)}#$)_*$`$%<%=`!^]?/@&}Acnd5PCXNhFuGYVK8Pz0adj:"re",''%%)[!<@,@**.++^):98r8g2tRKXM0gW8jUa0ieWdCuXLT69LvSE4,"oXZGRNPzjDqIgJqH5k5ehtyDvQMoa6hBFxlLtAdeNAC4e9RYEA5BZ":"L6xWZahyhjMY57rAr0vELXIuaZVPq84MNTrObIYxVtnJkPYMX6ru9GC", dnZ: ogf5qOHJTOBQ28wSb4XDRbonEDWaI,{`|&#$!{$,#`,,/-{`|&#$!{$,#`,,/-VYtR673L5KuMBwWjVLVQa2hK1v16l7HMpqBAMCtYYlP58aPSNBanXms7dv1lvQzlw:N7SoOTEjXC5rCYkjDUgWE02pjvOZsN9jBYxVE61KjUhIJc90QRd7qp4vydoXE6Q,oIEw6a2D91daiXCUGKCt2PrLiZQyDtg:vJ30iFSzFrNpegjbGIyQzVlbo0OP7n,mK2ii86NIJWwJH9Iipt80T3PpKlXAwtoc7CICmyuB4fV:o,,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*,=,{_=~>$^*>/~[!#`'.*}_-`<*,#=%^<+@+|@@$>/;`~|?(`<%#-&`_>|?;>(;_'?^%[`.!@'}.+{?{'~?]/$$`/[.@>,;*kc3A4XeerCkYnvIg4WLCWjOIenCQFE4p2kh55PTSHW:NGyTlMB5CkUUe1ppBGJ4KlxQ, gT3hu9xz7w7gRBLtVTiomHVSIctOw7HxIMJz: UFzJOpjusQ8QpBJMSbUVHYCU1jSStWgEYPPVVoA4YSqR4y4WHD4ysptAqOzeQAaK, IkhFxzyyrisk4f7o9A7W37ElcrAx: czxDiVAt2QIJXD7Z8dJljXKmjHxwOfR,OZ1bPZlgi2QpqhlbWBDnuhZp2MDr3OvSPsyac3:"T2W9Y6zUBfu","C6taX1ZmnR26AyqKfaW7E64LXM6GKb":eNQSyoSjffg3jk1XLYRXiVAvTdW3b2,ZEVAzJSscIy8tClZbIMQA3LqN7XzqFqUO6JDiaUmczzuQFTs5uyO9w1YvtP4B5gq:"AT17HNgUC1UAbpisQ2uD6UqKiVTqva4Nyv13qk", "QwAtsibHhNN2DMQJgAcXXO5X": "BdPNR", "bb0Df7p9CqqkvP6hmgcSCJ4MtBQocZEiR54HIBtisU4EcW5Is0Hg5sJcN": "GJUAIMRm7TiEs", "EOMkMBq4nBmx8qwtVh7OHGzOEVqKYobLzXZD8MT": D8eAYhVNuer3yIpwo5oCfpIauOGa1B46PXGK808UjumcwXT5BvY9a0UXW5nUe8xA,cRnj2jnRmmrof2DFlLewwbT1pVpT8nVXfdWvufpXgiIjiPRJV0n3imuoDf3xa:ZLOs3swo4ftlriqGNUxJCdnLaUnINFZT7aIR4KqFgxgEeuDo1rr1kXNctG1cJI,DmEqoyp4XfRTDiq4uM8bX2EGWtJukncy5hyVZ29Sgug:jmUdJLd2Os1QHYuwjYxzJbWExtEKT9AwOf36lv8RcJsfR5hxYJslQ,"fVDa2i8RWEnXEsaFdoQcvPBMGg2HBBCdPEQVNIONFmRX":JmUvG6BTTWobfhM4SKNGs31fuh,"H1QY5aC4ZMtu0JIGXl4761Dp5YwDgK8Ozh0QiOYjeSZ":"r4Mzc",AG2q2wdaEmDdPJUvZSEiNOI8ZeF6mPHEtm8YbejZWZTe8EAi1Tx1GMnmY645U4Wzi:"OFF99pFkFXxVrcLTXRjXTsWXPI97VIL8LetTxVl4yYMb8dY1fDC4IhiCI7sLy",&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{&,^`@*{*?)>?_)|[]?|[;^$){+}{>@{yz970co2hAFR2UjWJ1uR:rmTp2I39sLpDEjsRGnjrz,+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`+$^%_@>%}%}-#-](!*/_.{{-+}.+_|>>;)}/+~>(`_.!_*?_,~?!%#@[=}'|&`o2Z8JnpDINK2VdFkOacUSH5bvYB94IyyEcxe:"VKmNOMY0R6vTj45Ala9MSL7kp4Pk39K4EHDca9khj2PhYi", VfdU: Ys3kkbHbu582P9FK1Xd792r76Jn637m,"HNP6tm64hBhjOa7GBAanJ":u8ESWv6PeYwqf6qW2p9WGDLtJ35JevS1pW2Rxi2OFIqmnfo5ygvHKEidFMfH, Vy7k8LvvMjw9Veb79grKYXmPWLyWJORY0Zyu146LRXIxCXXVn4Kv: wCD9pMCPd3VhH7yW0PWZMS4vchXksWSYeTd1G9NdBT,uSAluFfo5Cu9E4:TW8PPsPtkvlej2qJvgCVhQzKVdDrOE39DJn3, LLKMJwzeY9pssUfZg7yISRM: OXX9Qq9GWJ4gaXers54n7lV8tzLKw4hxUAYHUY9tp81igGZe9RNaKYZDdH2UE0hAX,"fADnXaaC8fOgS6IxXa6":"l5rUw",RkO4LVUslEM1gZlWIaxfd4SsvccSycwVYCjbzYB9q70wNbLTpkEdD8HuJdj41jk1u:sRFxtefJqRSpFUUzDTOzhOidRR0J4nqSLAkXLR0b, "mQHRsR14bGTYLZ5vcR8iRa2k5XwFIwnHq0HKAnqcRjtjc6kZrIDO6Kv": NhEpjZNRfDk, pN: XjDF0OIEiiKZoI5vTyYkD70AjgAklKJe5ek22o0TF8Repoa9E92MrR16MmAza, "vIwfYFDUJpP89WsHbOrm05ZYGGUu5HWFqP7qRlXxTCAwJ2ETi8zvSoB8s30Z1PQrr": "SgDtPPvH9aIbLRl", AinNbIrrNIZqyMv3mOqWFqXuGBTqLQGobNVC5qA2GxYIGPGM5KWD91Mf: CTJwEpMUVis8vBAuD5sUonh3IOOc0mSbN9sxONzDUStzYVoqkpbTmH44, Iem11PCNfiMkkAIojqpXvOKvH6w4jobAgGCZoUKMaps03rlpntAGhQM2zp83Aonm: "Q6sfOj",_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,_}&;<($=#`.`#?[{`/)>[(,,?-)}$`*>/])/+&_&_-{,$+%}|$/,|.#(%>,`?#=`;/-{@(,-*.]$@{-?'&|,>%!__~]|,]@,SvMp9vVMJhSLzaE:"RRu0ux9OoMhn97gSji6ZhMqcPA1EfkoCogSit",(}{+.%(?~+?>?#_<'+[(}{+.%(?~+?>?#_<'+[W3Nxdz3oY77rwny6afAkVeRjJ:XnlpiyGWuVLWhxKY6mdbwYWNu,ZiWPUVImnHSjJ5oGvaqUcl7DhDloXsgkjGvy2BwnngqeWVL4CtUzfQMO3JIx:"GyudeMunwwMO96G9I8lSrCQio2gbKh4X",[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{[=]^./;$,~/}&``>}&;+[_(.<`+|&*>`^`#,?_[|(/+&?){`?>-]|~,-.]@](><_&[)~{ SlE56hUUAiTUbd3m0KhDhCPV9TV9TU2P6UFLEO68NyX2: OkXqmav3Yc7tnma8tZfdfLZgSoidOc34Zt8tYEcso,=~*|/%]_*@|`'~<{;{$[)*!;))]}=?[_//-}$#';#[;(&+&/>.!@|}&&<#^|@?(,-?@@-]=;'-.!@|}&&<#^|@?(,-?@@-]=;'-&*_->]{@[>^(+`.,]=]).}|)@['-(,@?[!&%?.~[<'$;/^$~+{|>&*_->]{@[>^ "RkKjIn3dlPO1JH6qSlBTITPMwX2XZpyiT1CyOriYUlzW4": oYIOzdTlMrJsLRpHRgPekM6Hzzg4aAnQj,!_#^!='@(-_=|!_#^!='@(-_=| "VHcfM84lc6Z3SkNeUwN52CICSAFhaPuMmKjsAUP3hTzYK7l44XvbAPkxhp1pW": ZhqRQKc6nitBAddYakEh82h6VhVEmbXFSk6yChIzNIXtHBqmZa,dT38gQgaEww4f9KKB36iaN83X89gUdC3WDy0RgGIJpOiJDRR0oYIvGn76P:Tsiby81r6nXGGdzHG0nr6WN7p4zph4Tpa5IprnM2SZl6xrFVnwvPEjG4Jtafl,YEOrvcakzLYMvaOYwnf3reCPUCBZWl2:"jFTPntDniJTb5F8cNt5pCJSM6j2mAQpMSRgM","uDOGYOEJsjRevMfMK8aUNLmAiSEvx3V8d4fBkn2x9JqQnFRQ6ux":NkRcnVINGVAG7njcOiCK0qCpo,<{(<{( gVw6LeNa1rC8P2tYuzXYD1yXokCr: bFigb4wnXYHnelBCGscSxnnxB62XjPa6,$+*_!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*#->!,,)_=`;*;>#{|/(,<{#]}@,+|},_%|^}<${}?)=];>$){/&|^>?~%#&-({$%.*+@=,%!#?_$,+&[~_%,$%;/*zE04TevA1X0NIswnq0:qYu4jAsPvyFFkkyhcQNGaRjj9O4wx3w7Tlcd6gxPTeKr2,"p7HyH9QC0BFJp1VQHJjqi0fNa3Ar1963h8ah3FukeWjNe7VVmSaQ7swOW":hM0ZmrBX, xx1nr: "MlgcaS1px",>~&;$&[{`;=#`$~--^>{&'!+{>~&;$&[{`;=#`$~--^>{&'!+{"zahE8oSs1zo2qookrzwC":"mzCCnrRghZ3U8vqO4X0TGX6NPUOBNAhVecye1ryRF6UhJNgXWl5emkgLY8c",Wr5bmskXDYwUalcuSLGIbjYKXehmMwskOIq0:WItp8XpB8G3DnBbC52isI0N3p14E2Z1kSHlGl62bDIwQ9WnCPzxzJF2xhcBdZfoc,qD3hC0yAmEKmKH7Hbd1iGVor2UyU2a0NnR88KnOftiCMh7fXX38gTV7k58PoAxw:WoIsvxArqZ8dTbRI,+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,](+])>!'{+(>!;)&{?]^=)]^'->^<%%/;_%>~$}?],=)^#%<<,]( t3xkpqfsZxFBUq2jZbMlZ14ayBIMbYRzdyv9VwudkZ3: "tF4c9DQ",%?'%&;%.!|'[=%?'%&;%.!|'[="AlGFbrJ6CL2nmYXz6Kk7g48rnGQeNzpf7MwT9kt8WvZTB":BbAbtaNcsZl41pw7R8wDTgFHl4Q54, L5FKB7H9hp26sD5UC4A9oEsaPE1D9ARHejLjKdwJrn0EhuB: qkFlTnXC43vrajifDx5pqWx7UeosP21UIn5ALAFVWTFTg,{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{}{'[|``([{{<~(',%-|>?%##@$;_#$;^%?';=>~;/{<|*$?]#]#+&!.)>?}{} EnXHb6nj3tiSE0oPLWJ4oGIPQo5bmGsBklMk2: "MTFFbUYybP9E03Yambv",+@=^>``+^[*`#'``+^[*`#'{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,#?$/|&]'-=--_.]?~%;[],{*<_&--.>{[+]//.]|${`/(=)&%-;`_`.@-,]$(>#={;=|,iJTk8pjszf3ABGagzjBT3snf93BObGOEwfD:Tp9HmCoeSftxarLEouYM4cIPmFIVtL,U8zlL7VELDE8IvnUFOUt:k1BmHIDm2CyGpLAFD0PuIVLleYrhUDkhXAcQWP,b7YOSO6ZterdpNVn6u8g7QrGMOFkJVGRTeAp0LjVWW2JeuRSwp7H9Ms5:"LKYqf1FkLg",.&]^_%^)[_).[_&]#{<|}_=.&]^_%^)[_).[_&]#{<|}_="Oem9USehUzyxvvd0BpPA47xbIbxVafCOItHrm9CS4oU":g2Fo1DNv4CLWg7Ou91KGTeDueMBjshtuvFU0KRC2LFZSHZG1CVhb1GaPY,]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[]'~>)*{?.)(^%]}!%!?}*-&?'#]|,|[tQO21vOnCXzlgfbI1rDV7poWSANGQxtfBrm4pIYa:Nq3TULgHOipAHWLTvRCuiELSMUPQFE, "LhzMVhmRx8NoxcAm9YW847wjoQHUwwA": "bkKzJHPH95qQyF8DERH8wX0wvCjRF2E5", r1duGjewS5wAlAP1rNchKnxcY4XOyAAVb9lutttg2fp: ggD7oY8YR1mvLMpqV6QkLYiMVJ,"o5qDym32FGlROxA":"epARJw41Kzv8d1BHwbQBG0rZARc3DL288fZoJLXnEP",.!??>@%?@;|!~`.!??>@%?@;|!~`Hrf2Xyjt8iSSIZFWqLj2TkrVrMDKbNcUaiqB5bdTTWzs84Y03Ui8fDXyaz0:KwwX6powrWXl6CtCvsbNEr1b17T5pwV3LEdndabld5K7, T8isrGAWODrDW9cBdrn3QOj3qTGm70JnrVbOXsbP3Id: i4QLqW4npsf2dWpH2mnw43G,pregyG9gMEixVYLlPWAMX80xlah:"BjdtGJWSmSCoYEGdbLTytsttmzioayEFOkX7",MqQETmRIzOx7Y4GQeTeorvbRxrIVR6cSdCgzky04Rf2x2CpYq:P5aRAPSKU6pUaKeVuht0aKemDRQAD8KOLMg,-?)?-?)?"rPYaOoPaKfCSRTPWPjjAKtDpUB8V":bqeu3fzyVEaFR0r3H1vbA1THQHyGTi1KKM7O4KIRErp3Wylm9vvTTjkfsY0X3,d3b:"y067vVo5tnnnnTkqkNjn8tePRDvLP4FnVUbhy",[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_[&*{$<+$>*;^'{#}=#^]-(-`>[]*;..%.[#=.]$$=./.-)+=<(@.}-=.#<^,`@{/|'~-|>,(=?,,^(`%-]#--|,@>=.].(`_"OaMcAJOxL0GECnHuJXv8oKQYCv2RbLxDbysZqtxpNrUtt5K":"GGWUT3GUhN98XYeTLjFfdk9qwWBtrpxWeLOEcZCi5cxXf46xLDpFWb2n7",vWUQZtbRNgHv1c6nyIz4LGiyWiBE4ExnHyDNPQBDk7uMH40RFxFbSR3GK9PKrzV:"EsmBrHkOp7nHMaeq3K82DJ2On7ijoVuf8", "pXSfmUT2znS9sIp8uBODRIv": UDlCbci,Vm3k40UsxTLQBWKMfbKK0AcsqGJXbiFVWIQq63Q:"mvGMygS7pxQyX7AM8gJB6DpvTu89almSX0KDdZSg4ZiPSA1dmmseF3qhmGa7",,%=.,)~*'`_#?}{^`[!&(_]}'}[%>*,%=.,)~*'`_#?}{^`[!&(_]}'}[%>* d0cLdso: ybBuNGC9pKDIRCgwONKCwUJVjwoX, "rpszR11WA7hqIvEZH5NF0ZK0IsFDPf5VEZAbiBIGcdjgTK3fFpcmbPkOapEe1": WzhpBMaHTQRK3encORG, isiN3WzSxyvwST2: JB2D90cytsG3CZPq0ejG,dxR8YhPuVVEqC7fupmo5hs6tQbaHIe1qcdA1VqIF79uoKljb07JHokQ2zgwyA:M57TTn8ShVbz1qqWGFobdLphyOpXcbyeZXRHothsblVH69hERNt8h9,)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]);)*|}&>''#*]>[``!,+/.='!%.`@`<^]!`-(%]); "vYQ7p6kazjiIR6jy11Tx": "QIgIdBExRT0Btz2oAGIykiZE1tZOk0Akv7",wNJRr00UhVPzCEBbxQUAGzjmEI1a:"fTLwBfxQUooPuBj3x7ydv4junLAHGYinbTbrxMrANqK","EQUKg8XianCBj3N1WDzVEOZlWO96GgIt80":sGnfEuGtNlu0M4mER3V9UgzZnjqvJpFr96qtjRD3eC6YFxKyktmU6onO,*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.*%#|@|?}),(<-^)(}>!~!|_>[#^?~,;#(^/`/(?!*&<-$*%%='-}*-.embJWInKfyGbP5DV2XuwikOuu:raGle7yt7YSdwsdnv8Kvexx7w7MQ08kHH2u8KsZ7HQmO, HehQouVlGLGYR0CstauGC7X3eDHs2V6vCxGmIrexvU2en: URZVOt98kMPhIcr4atFV1BiIHl8auL9x51GNkqSdenhLsuyeEtcTT, sNf1rQnKQTuRiCRjHnnTLXmcFvkwP0: c,ik5AFXC9jePM2VNyEmCtMfWs2gWPI3sTJg5fwh697Lxtt3Il2GPqQztWn79:"XKcqL6RNIfu",w44lLGbXzzI7BitzHsgvxhIlLzraKDvWeVtgDyHsQy2dczE2jxVYgF:"Sf2lpX0DxRfcs2gvxm42nqpIv93xiXS4ys3bVptBTu5iJGqOZyUtmUZgL",>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)>./&#/`'#}*{'}|;!#$=-]~.;~+[},(!)|>%.>^))<&|#`>'`',{)~=+~%!>_*_,~=#_@/`=)&.?!/+*{?$)"MsWEJZiegXOG0Q3bmpKwU9o5Mg306YNDbKDYi6vLItvCIj5OhvxQXagL":"GxCt4SZuVBY81bM4ELVa",..E7h0zgP6EQWytz:vLzZYc3w10fZEW8O0pLJFmGuIb2x7EFruy78MS5YjVH1tuOkS7dxSPCJFHe,CA5WTH2gDJXlCiNX:iOlvZQEkOFYYJs8d7A4tf0nf0oyLs3zUkwsizbXyXMRjzVrcJkpKb18ygLIPrRv,$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{$/(;.|;<=(@=?]?^_[|&,;.[)?^./.==@}&|~*`~/%$@#,__;|+_{z3BE2lBjygFngMcJU:"yJEW7zIr13EVjP7kUpZcVDUktz98j4Vc6EGlwNqG94GbHZ5zymiZarJrQS5IY",MzMzR6QC0OKlQSTIvdwiXcGvDoj0BwcsqkPz3IYM2f64TixQaO7Gs:"WL", oOoHB3aCNwhUnVTZgqJoKNOZuHfqKIdNCKQXjZlEhs7Z5XtiPXX1h5yK0L: "NEnXnR",``!>)'!,/=*.?+^'.<'~#;`{<)^?([``!>)'!,/=*.?+^'.<'~#;`{<)^?([ "nW5XDjjGTbxAwY2cq4tUBKnwVKAbVQH3Mr9g3iCg081LnGHIdUJNuSGU": dQ8AHU12MJeSr32s0mLnhzftiX55Aoqo4M9L2Qw4VYJHdJMDumYq,aXE25ByfJbJVrTzlu6rpbOX116dR3oDK2dZWSKR1ahvqLT27QRmQyIC0O1:FODb1ly4EbXUnuITyRrwqFILHWG9RhzwISXCgy3VNwajj4WtMcmZ,FAnJarFKfauo6vOyeVp7Z5us7QIHuTDRY:u0U4yyOOkWtnktP6LQ14PrnrGK5M,BYiA4zxs6gcQ4EW0Mwo57dg6AeOEdWjX1JyqXj:"C",-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_-<.$'{.^#-$]<%+'+$;+(,=><#*_+|$|}./]=`*|@)`;]|!%-,?/_ea09Dsoe1R3DTcryA0kSKfAp09nBIKqGvTzvuEWkeHxW4rpXjfgdNRgn2:HIQyicvxBnmtzew2Sjc0cuixlJWtvFaWkHqCJWyui, pQM4: DBDOb8XgSeNGeSuFZnp1tZD,WaMNqBCymRKQUdQ9vCxtnuYIAIbqa5VBWmpIAkS:kxqFTgGoIM4Zt0KVYAnZL6gZukWxwibY,%&_^.?$/((|}*@{('!%&_^.?$/((|}*@{('!QQrJnHZ230sGZbBucOuYPPE:NsaHCYIm5Fm99pWLykEb6pvtTXFwzyQN9WrwHx0M4nLWoWq8TtOWN1gOQavc,dVoNIZfAwxDCWwSOJkJijqADTxb4jSV1KeVwyn6fPIBIIAkepZBECVr9gGYIadwTj:dIV,,`|}*?%/_=!?/@}@(^]{^#>#_&~*,`|}*?%/_=!?/@}@(^]{^#>#_&~*"KABBFIIADBdQ26UHmcEKLINKqJ":yuaS7cLiFeFmKY2BaCl6Rk0gjF6hEOwjvA8UebaUe4bZcobO,uJiQF7LsxZGZoWnD3jJg315tIZv4TiXpmFmSKgLlsVCnQ9f25AkvMFG:u3AafKQbSmRlQOHYLbHpHJH24vtsZWToxvLL4zdfLCRZARv,uUoG:mSAYcaJbW86GMR,ZWagnWiMQvhGMLOzObrmOQWsIEmYidO4l91:s6XNPjOAyuAamS8igDxFAG1pna58ydv7,x6ZgbgT1Zn:heUs7kEVAcxB,FsBeTrnezVuSwavskcnQgtsK6603bULFj6YIMYH0Uo3N7XLer:"HwcIEmDePGmoimuulku1Mh6F7nIJFh6", t6OyVv5Q4HsDw5C0EMOjoLS1FlUVHHQ9UltcjSMLKCwa9n0z8v: FjsfF8geLdQ2I180b5IteyLNaaVBFGa9,"grVRgNGCh9X5FZWnMbAk82ngIkfgrSefKnQOcytWjnBS5XSOQyyrCpgB":ZTcA9c1FLScgRGM3L5bh0YxtgmmiE34OZuNeN8sTYxHTUtRW2qxIGcXDd1QEOl, "bav5hVc0tJk7gqCF211jsksOKJudZOUnSMPDJQ8H5W4eg3HqXKqrjTThRDwf4BoI": w72ATYQcxIDbByY9rmJJSvvZHcU, "oY5IRcCCbpiWXWGLpzEcmhmlelGZwhbUKFKZFSm2toNuhW3": "YPVDGmRN4ZGbzXXq0Hp67bySpDv1RjxHsHCtlGnnXkSw4Ugf4Xc0",<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*<@|!'']]|!;*/~>,;+;%-?==!!_@^)'*{|&&+,>;~]*kcmRUsjqtvNvWhPPqaRqU18TgMcb2EKDrxj3NJtr5g2P7o5XkpMECOV2s9p3:reDbIhafk8E96kFhdc,<@@;[@*&)!~<@@;[@*&)!~ bQZ83vSO9oKNt6FYtgRfeFz8WKbMPlBuIJLz35BHtwuITkoAd0A0NQAd4xfbu: "XHev8sqvWS9R56NiqXP01LYssIJW657nNB4QqUHfzzXKOtv6151Tey6myrK7QAs4","iFgD0nbgkpMRdA8":Auo, fhtSEzsBmS5nXfzEZeNzWQ7gaKjGN332Qz1HXT3Rgv: qJvuVd2GBw9xDYu5yxkJnV,^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=.^|[_%-^)^}/}=.(={~/@'~~!$-~-#%>)?%*<}~}>~=*^%(}!.[+]($]>|^{-=. "hjYXKmqSoJfpBLxJbrk8EHrUouSOCtrWiRNz3QCgzWNLifJIZyXC": "Eky0hW1WAo0TLBDV3HjsXciZXEhrKGDh",.}!@(%}=]@>.}!@(%}=]@> fwLK7S4J3ZrmNGFknW3oHq6TFwLriv8qX6zj03ife0851fo5BIgRmb: "ioAxRyCoXrG0dJqEmqdnrYNUOVB0SzbXnXS0oaAE7mmiaM5rNvNt7t9PhDU", ili5uGRMoPRG68NxsEeh8qq: "dL35PUk0OjUS9T9IPWJbNCa38GQWkQME",[@)-@-}$={|)([=+~[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-].[<}@)_.,*^+>[^+=]=(,&/)#*]_[&>/{;}%?'?^^)-$.%[|];<-Zf9qesGcwOo4deaelXNaywleHjGejo:Pjgp, dZMvCe1OO0enpFknFM7Pba2L0JwadgeOsne: bxwDSj1rm6O7HW,smKbIsuKSRytZDxfdUVlIqSUhXK96y2BNqJwBKYy0DLjm9TLOy1k2d1i1CyEx:"sZEM4taqx0kjbxev1imyJWMDdHxhyqQKOPntcpakhUtAzVW5aZaP6e4cIBpc6gWd", pEEH87OsW1S: gwaHXL,#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_#$={<>/`~?=?>*$`)(+^>$('.>@'>`&;_*.?]@~&]$_+~>~<''`-<($=/}^/!}[;!=_.'$!&){}^])%*+$!/+./!/{*_ uT70wWIHGktpNEVqX0ipIUiFEE3irtHbRZ4eg5gfz4EazMdG3GxpoIyVSbI1ZU0Z: ke2Fig6gplj6Arl7zsGdrPzpTdmLJhQRkX8dI7Xu57ZMDoNC5cNybFWa4, S6: OGdk4UCzy4N,"MJjvg3td5LoX10mpNirqcDY9HoUus9amm8oBHL":RpKTGdmf6QAGAQMZLnOFI6iOzC1a9Y1SonSnCaMqXVqF36Z0IDukf5nwtx, FZKUGugsMPwTy3OgLEjFegTDeVS: hAsmA5azrFj6ZmGedCBop1zfYLZXVYjgHlbNGQj,orQxOuSp3AKdm7ZvOEZGpDfdmHL35TPxMovFetDdnMu6e801UfT:VYSJg5Nf3VsZKqr99,=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['.=[<%}[_(}&@^;+[,/+['@+}~!>'_`}./,/-+{*@#+~|!;}-/^]~#,#_*_]&>/?)])~}['."x7tGAw8cxEyiBF7ltgocnjPEHYCILvBsY1x18uOr9dbiyxE2L6h9sfNJYsp":"SKjoaZneHIhvexVNZPk3oRDAeSynCarpNmU8Q0rnUyKh0sZj7oBs9ISI", VXwEdnakcAd: "Tk47nIO1hslwMS5dk0XZC6FQCiHyHY9OlwLvk",K0vq8ebLORCdkZ2exdpPSbsfXDWhZGq60sjEW:X3QzwqlT1Hc, GREeFDaEtt87GXty2tysnwDfUsD8j9p41DFIvr9ko4O5zuafmhPCs5Xrac0QCm: "btahpU0m3B0P58kEaRdZy0nFZBHoZ", "rHvUX3cenIgJz2yE9ViCcT71q2NTjB8SXBqRC2Q73uBEAsACyC0YTTOesNtKzqG": q,)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;)!)|[}{^~[^?`)({+'=&@]+%<%{<];?;,(^#|,>_({!>&=~#+)<._<}}<|[?%}^-#$#&/%%+;XP2QZs6C8LSiDs54k:"Oel",^._|}($^/_.),'=?$}>{%[=[|!_[&%;^._|}($^/_.),'=?$}>{%[=[|!_[&%;ezzuAgpyp7kywLg1A2HH3y9YboI60O8b6W2WSqQfcINFWH2:nfzhjqd9zVrxUSZegMCUCLUnU9iNCDa4BdnIEUCA8zxPqJnaDnOPa, Sf7wLZoti6XO5fTyMlGkYlbIWdXDjEgk0ZXOKvPSX78cb8kc: Qy39FjSLfzDVFEKPveRpsHVtPOYx66sQpI2yDrV6fjLD9IzD,`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*`,]`%<]=$#);''>_']`$'=!$>^~<,?%],?{?!''?=*VytjFUoA3S5318nvEsx9OUHAWUz7u:"CzFDRqSiR4KYcnVSUqfUYCypydbjb7yghE0QdpnE7Zl6","y6QVMhEsnFHwEgcH":Bm8CP,_,%;+_,%;+"px31UR330u36KNSEHs1ugOFsqpStc5YDyUdfAlpiPw2E5394ybICic4sbb":UCTG1fajWOneKj4LRt1e0zUJ8I2ziniB7zAz6X4330gcRHwDlnz2f5Fn0cEe2o0,bLlsmLozotCglM0MtiIY3TKLN7:"IrH08izRiK8KY5XCprBqPZSSVWzj9bsjSVaPsJgP9UO2qglVgAYwDB","yP9xUgSLl9VnVWzC4EbWtyA":DfcKo, rJwSYwKSvMJNdL6cnvnT3x5: E,"elvKgLWUhW5UtFpXMt7N0":"M9bireL2H94G0zvPdg4VAhSTgdtv4CIpvEPGuO7PubERSq",xZo3rR4XPZQF8btXddzhU4rWj:S2ZAVhwYhp3O85TSdSanuR6scP8UbzNwcUHFsl, "zzllVmE6VloBKpfunNWBcRg9Deu": y3rpilRvnovCFnrOlVbM6zbDzInBIxpkwJdHWbf9th0uZIpprW5fNpnGi,&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<&'*+/')(^-;$(,[,,?+',/;'@@!,;(-]*+*.~{@!_|<"UHuX6Rplpa4AaYqVqh5":vxLx,@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%;@|=(/]--~(^<%',@>{{/*~#_$`&@.)*/!-!;[>*%_;]?>=-{[]};$^+},<}*-|^!=%; dDCVG: KeMuajNvTOgfy1HK,CxQK4x0UiarFpN2suyPL5Kft3gD:"udez9lPcQ4EtCwuKqOzLc", pQqr2gXZRvltRdv: P5zzbeRJz,KlATwtzOYPmUP:wRNpOQsI1KaVMLqAGa6aOPtvnuEVhxmfG5IL4vi,#,$+[=,~~._=+/};^'(|-((#,$+[=,~~._=+/};^'(|-(("f6L0n":"jWPWmovBVet2m6u4Cyoxm1X4soP9MOSp", OeHJeoy2evx1lgbcrn5l7ZYe6Qd9l3itOsH8jOzIk49iLkbjve3FZ0: m,kB7ISL7HRkKf3nUL4cT97DGQ:w6X2ve2u7NcDAIabmtCGP8BRxFrCpDpr,&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+&;'$[;}#_|#./!#`*@+,<[))/,=,%!/|,<<,%--=[>`]`>+"e9XeXFVAf6IiXgxaGohBFyX3RghKcwfOr6a":YQkvJjJU2kzRYBba4WCKliD55Dnb3VpHq9d,wXmGvpW2YafLFWCt7WESNmLv0e:iP0wpBfMkiXEPRPnc9bHR3Q3vjQajmwIEXqCMKhc9z7z89Xj9kXxRKF,Bd21P:YY9TDi8Rm,urnZjJ6fFO4dbNtVi765E9xNBBnHz9sR9eDgBcTul5Iyb:A9wZWHkxYNtENCRrWGPq5xVJeY4VFIMzONmAC0NxYIOQw3Y22XC8dtcMdb0OtIfS,N9HLLpjQCKT4mu7AU1V:"fkLkILSP", "pnoRXL1CGKBYTT": "aiEmgAWUCJF6TnwRrKMHNmCqR67pJ7zyCWAwIZ7Swq31Uz5ncX8Dkspm6aXw",J1uryaPpbVbskelsmvSmOsMMxv3MnWqx4rVQjgr:G,raJShKS4IFoyNCDnnxc8STgJyP:bA0fSjstXNCbtPIRQknMyv,N2INHuCGCQVr4I6kkxqeB:"HKcQA7KRA5JgkOThCfGp68BpZv0EQeRHgxI","nLX3avIOFHdR":D3ZqAXFTMI1Lc7q174CoCdVBfrNMM64BnswUV7Ceb0Go4r9jSAqoK9Er0fSCdM, EesRco1: CqfZfllqdp5oCFGUeOzmPbmHyQZRn0H,)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%)%==$=>}(,*.),`|(.&)^~)~|[}@**[@$%jvDGceB5vnSK4SEYHloWvpofVkAS8U7fbmUoReRseYywjt0A5iaxBGmA:p9NTPx1EmXYEeknZ61Ya67HfnEv5Xvzg67nTlBUEXyVMf9qu549mPq7c,N8NIshRps6i79ZJ0LMJK9182pPt65aNsH64UCZKp4vdhdJfBvMrj:"EoP9wjN2ZaI5pZqOA04CKbc2ES21Wo21DMGwaWHBCGh",aVHPhnJTe5lpkeHBnSxWf9gObr7A3Vjf34xScE73KbLE01o8A5izIitjU29y66j:omEpKEq33vjBcyMpo6BFyy8BViFmDWc9H,=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~=`=//*^+}]`,~-$/%!/({](}>${-_@+,<){_.`;?~`%?>,@,#'=_+;*-/`()?{(}^_~'^})*~ADIWO2c1Mn1t7j8tpUcge1zQWYfqEAQr:"x4otzpjzzl7oCCmgNvGw21iZXb3",(;($>(;(;($>(;"SCncnDV9WwpMPh42yM3Hm7H5p0OGjU7oe07G6L86xNbxvclPA4SJ5SHv":"tSOVC65LOOV4JgrGi6K86bU1HaL6Oi08RibDx5zZnTX2HPrWLEHD3WQZZ", "oDFIQUkBSrzq35e2cwyV37KCMdvvtypaw": JEgqwudx8uU0BAcwpfsUmxxM1ItmXTfeBW64uRJwbyGUwufCjR,"ZivNQx":eX2tw24ERVKorXCLrrX5GtF5fATBgAPFWNyquiJR5gPvDGvN8eHEiAwd, IpBplstgdAehpfEv: HQDostsjDNPo68TYf8wn,/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)-/<)_],,.^+]!#$)/};-=[;/^_;}}?)}==!#,),];])*;|[+![->>$(;][}[['![`})<_$/_&+#|~.@#^.-==!!];!>@_/*+)- t6vtJzquMZI4CYUgTdtLhjNqDwInJIXRj9sq6g53qoqCkF17gyFqILK46z8WUi: "vEL5Jj2tmSvLMNktxrWJ9Cbn", uGb2PC7: "sSvE6qKmXIWF8yfBGzR",&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?&<<{]``##??.|@;<&)}<[!,>!*/(./&^<&=^/^]'{%_^>}%`{_`;*^>*&]&|.-*_.)[%}>!+[}_=}*]$?JPbkVuE8n04GR9nu1CUbC1ZOn2GLEMmKvksteOcs5W3pLLmm2zoYluM8swKPqWDqy:"l7",@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@%)+%-}}!>+`@)?&[!=|?>#[^_]++@~'}'&!/->[+<@_]&*%^~}[([*#+@;>*/[>''!}]<(_=[{$@(-=[-`*)%^%@.*,-];]_}(-'$>??@?//)<(%_];;;&(?}@??&]!^..+/<})'^.:HJIOdl7BR2jYqXrFqECJFrWrGW, MuBKzvzCXqZ9kug: "Po4cPq4r9vM7qkzrPGxDU8239pXn1kft2s1VhcRGRXcFCnXfAGQkB9ChBmvU",{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*<{*?[_)}*,^|{''*(}`>][;^??((!+?@|+![>(+))]-;%_>!.#){{?}|?@=),*)~!&[^}*,#(~&#~*''$;={{=&.,()'~]#->,#(~&#~*'' lRlF8T6CGoxOIPedYNyqm27aed3SYVC4Gurg0: "emaxl6b", "V551GzCVmt0y5VlCrSGEKoJkd9J4PcEwpHdsZG87YxUEy4WpmL84P9Fsj9efpz": Z4fI3jiFoV9PkHVSXESlNOc4f14kwAIQZCalAxvvb86g4YPt9FhOLp4fkOXbR0SLh,EdsYI7brzy7:"QePcJmeHgboOxidBtJeRouVuGXtXXx1yIxLCSOdHbtCTAcbNcuZTVZfUGSo4X2",;-;-"lzACabZZVueD2HsaqmuISoZhUUY7lJIibsSEWBv67mecvvVTfmlVxDsgLE":bGCvMk8IGiKEzYLgwFv8BF4nrOg,#@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&##@)`]}@([@;%/],*(,`/]-],/^/>|-)@<`{{?}%&[}${|$,>|&@!'>#%;`%|.>(}~{+']&#PgNnwPvRnSwUpy6:s1BztB2JWFvkM8JFlPWeShvqJw4elyhNZeVVT,RDVkJeEfpmWEfzvYojVTOANCQnxWjPPZlL34JuOtD:dv107eeIJaq2o95zedddopl,+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.`+'{}/=>&..$->.%]#]*=,&#|]]=}?<&/'_+`]#^|;<*=]>_%@]?/)$&?+'-.` pYpDBJNwzX63JXKQ3XdiLezwis29PkkpH7Z1Bms4KydbXt: "Q9PVsEf43tW3DvA4m5hFIzSXXgAgnvD",V45h5gQOUgDpytvM0AFa3X34ENF5DJAHZEdM0sBfzQRYtCM:PGwYrEydaGcET7m0Kgc52rYw7xngmBJWwnBITpJFT9gb,//]^.,)=<.&~'.^|><.~$]?^;@{$//]^.,)=<.&~'.^|><.~$]?^;@{$IHaP438PCMPgQFJ5BUGImmqPSC53ZA9wNWwdGSKaehaO:b7g8vuQfIw3yEPQ7QJHVq6ViR,yc4bmjRXBDaOTm:CRf386u2KjhyOkOZcrlYu74tlh6yL97,==+%`)+}<#%{!$[@],[+$&*?-/!,|-+=!&.~^[}<}>!-!-*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/[<*;=+#+_*$]>*@('<^*#!+[`])[`[.})//!'`(,+{!+?)*$[<#/~*?~<`.}%#@_*=]/-=}!%,+;]&)_-/+?_.&/vwFdgDykiBQm2bmlUX4nYw41Cee9GPfVIeN0ozmPGdlLbW7y3HjEfUxV:X7SiSZQBQX6PgCHQ9n7YBrXas5yxlxlM1YZPJ6iaXvnr4q3SYzp0sYHPTrm359Rz,+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$.+|?]%>&&|_,.<)#,<+%.#_^%]?.<~=',|.[+][`|'~%]&;,?*!|}'.+><<`#;$!<*^&/~]%)$$;~}-&'?-}`-,|@{$. nIU5qqe7fxd3j8rISbxa8j8JwSPf6bNQ: orHBLp2CUlhuVG1u802r1NdJwKQyMJ8kpRt1fFeZ5BE8WeHdh9Ol, R0tmY3WwzexXNeT9LSKLf: dUAOyKJWAiULyL7EFmDfzM8mJADA9OY8cl14pLzYIxzmZsytBCf4gPLaoTIaLU,#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({#{.%=>'#'_?'{-*~^){;|<};_;{#<@_!?{@#}&.]^,`({J0dCB0xBsfdjVtjU7WGK2otaIEtZAb3QHLKiV6R:z4Mx3Ea55tZ5EXUf0oPSrNWrCScsvJzjkaAfnQPdkufRLFlSO1C2Z4fL1rmceNWM, yIADGaQdXTtuKITHbh1l4knP: "flkwKnnony8EaPlO1mgJnIJ2WvFdjkNalCAZHCZBNHEziDBHpfJfbCA3RceJ0", FUObW8NOKHzgJJLKYyWH3OD1ProcBJKHgQ6YKFtnI8ixq: yjk7eYa62, "gz7dhp3Y6tZV5WaYSCQ80N5mQ7kuNJz": "lXuDixURuhc1vmTqgNdXxvySVY0sYs2aliQHnVEOxIjs8xt8ODl5dIb9iseeZM",JUHOPqBOyDpfnFY:"nTJrzKBUr1oFt6",;;<+.@;&#<.?.?,?%?!@+;;;<+.@;&#<.?.?,?%?!@+;lFniC8Pp4Dmy673Ux08rLQO89y7:"rbku64JvgYvsGmGCNW9rkLSoOwNtWv",j59xnTvGim5gYNoHVfd7AM:fQ,"h2DoDbHvDgp0V8iNHIAOeatyEcdiXFOECg6sphDmsTUqSNE9":FzQsudSLzBNzvxXexKQuDZfMv6m6,YhCHxPWE4iWIM:bVt8gN5B1U,gIoe23EuQsZP3nrnP9zrclEMnWm58HFD2oHuyhDv0zqGHY74YaLq4s9RqqQr93EpT:h2QyN5q7101FyitvMeOFQXSvZ5CCkoc7vRv3Z1qhN9H, hq9HH296NgiqNx9d1fyBwMW: "BgjxY6q2v0dgnHYu7Z9LdpMb1", kHxSbIH7RVnyTqgDTmkDUlvwYXSag76pBPbLk: CXab7xEgPvtLbKW3xn2mSBXh2STW, U8SB7YfDr9PJ4iFWQnlr: oJohqaccXGejzjPbsCY50m5wbdKlii6Uvl1LCbcjXKM7gqklQENx1bjHswJS,T0x1Svoyyu9aN5rZTBZpE4tNfeIzwZ3:yjI6PMeV2,RwRtJxkWkZRiZcX1rQ3q5F:"vnSmZACTLguDCuZSe29DnbyXgws0U3Ge0BDi1SnrqGrg0oE86KlyS9EmYcJBM2RNV",XyLIwHm8:k8hmTah9k2CBagbHmjGfhvJ314BOm6JRIqvZKsV9bA,?_;&@!?/?_;&@!?/FJZL7qrDItSLZmNJ6nzVxhEWHCpf43xaBH:MMp78loe6OPfurl8NijRuwSinckN8uJ3bk8FVFOddbW82k,^{%{)](^)&@><#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*<#_#$'},~;[<{)_*|)@]/$+!?$-{$/!'=$}];/?~,*=..#];>$+!}#]>'(=-%/;'}?[@;@>$=*.>}^??}<]]'#'(=([(&+>&$<{}?;;^#<+$_*`!^>.>}^??}<]]'#'(=([(&+>&$<{ UUZ5rLvu21gdkJreVJ5dr3yJ0Oti: "u91BO4Y7M40d0UMkN8iy7hz4A9","Q6wH0DbegJLBU":Rvb3SBGtqqvCd7xo3XUv0E4ZExH9i0D4eiyN,FVBUe5uSaD0TYMEIJeK9bzrTC0WgrL3yMuCY:yqHyw5Y2lXw, MTi9ORdHxXk99dBZ50S8OqI8e9lR5prKw8HJtBVkMLr1KjdLlTjN2Z6qEHUzT1fc: vjUxlpeClv869QtkHNVU6yJRLoKLbukH5GtZbbXyAuO3joYgyY6,B7rib3hWHEnwKTpEZBZy6zN2sQkvMxjaKZlYiBZ6t:st6KifJeCQYTaNK1PFGAxWkOVCpCRmeFZ9qFWc6Rv2UM73czw, "kTpzvqbzlGaobsXfNVKSOdo": EU4r6gHz19YP5HLORb, Iw9wEfj3P: "iC","mfk27oow8XdMrWug61JVtdq79ONHSx7lSf7RgB1zY2":d6UCJRgwdm, "lv4UFUowMLuL1kUeBmBNneFMymq4drFr5th": NPRCJQSAfhwBcHx3IzNSktNX3RwT5cQ5TYtShCl0B3sCDPQmFa7Ym6IzbwU, TzdP0w5XevtXfn: "b0X1Bi1nsgtkZN6VuWQiKyPfaidAKZRGlbVVsidDuYBYe9XABj1ETf3vWp",h1i7Y5IeDolxhioNGwfT2:Lq0V6WH2zYo1iMSBOeC0kUdYlUuGQg5RMIOOmP, "YQZunHcRK2cBdyidFHlmwqSzB5houqLkWvMyp0eEBzMroyG74yxLFGoF5Ag": yjkKkm16ta30MvTnKUOFYUFQfsuAOsN7zFT9, LKU0pMXDWsZVzbIMbiI2: "zAk8Gb3beWvlNF","C1gqERWoNMSLpNjKAkSPgaF5iUGzGaTikLlzkIVccDBPGzGOvheG6XXYQj":upIkfimzqEU9uVYaXPgVbD4A2pK97WN3Gy5xqCntQqtdb41Vz3fFWIOb,KfQkxjiIU633qYVm9zm0gVRgj7cEIPs2o2DapwpnyR2UVE7CrHiFTfDl8ERD:yZ8oNv1od4OdGsejGqtmPUyL0CZun,"SDbSEAtq3o6Mo1HjBuQmUKfxQzdhdlVvg":VcVC7di0f843gHb0rR00F1MdyPn,QtTX2cETrWz0wpbT3Zowyxil2ZRCfzX6Nnem3qnjYjjyaCndaU4I5mqLhNfDlG:DHsZjGz9SYpvsUmpUufBbp5ypXbDJcmdXLmlyg2ipgBN,y9c0iHHUgvD3sYhl4mcbsC8vuEroNtS7l2383lu0Q5SlCWaDtM8yvRc4:EEpJtVZs14AwEPEHIUvi2If1jNQjPOq0BM7JiZXlCrTvss9,{+$={=(]|;=(;>~-_*]!!($_]&;?$[{+$={=(]|;=(;>~-_*]!!($_]&;?$["d8q":"oU3BrybBceQqVOHDJXMDjfM8bsZrajr2hQRhB",},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_},[{[[@%`?./,._%+]']?$*@(%|[%=,-+{-/%?|%${_;^!<],),$'``._#_N16ZBnA2f:W8wYtU597e4ITNn9JC538Ja5OvIBV5zfGEo28Hc8zlsy9oX,eW8is5PJDZlZV587lFDNSwdTfY5Iwv:"p8N",q7yi4Oia4LfEw1hlEYuAP5rWKWMgOiOeH:"HhDD5VMFIKIh314KxZD4J2vQY2iDA13kL2DLMwVGlnFi1KN6JUkbJy5JJG7",#/$|{,#&_<=(~#/$|{,#&_<=(~clLYus5Ik0NklUcr4hojYEOvEoKcy5fVPPeNPW6gESRQbbJiDOVZMs6:Ree,"K7KTo3qZ84FCH8u76ZbzwT9ECoO8EYUzkUmBAqRidvWC":sSxgpuQiOxEvlYd3DlIxfVbua2adJBnsUmCnFKTqt,^`^~^`^~ "ZwrjKpaEc055hY675W": XbH1UVlmxUxIc3cz0Se1d7EKMBWUo6GVtYrw, bX: sFgAK9DczKw81cLr0U4fAxnXWo5cE5AQxDFXXU1x5EazV,>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=>'!_+?}.]&#/|.)<{|(`#(`[}`$[*-{}<=tqGIxaXyL0Bua2bRe5iOANhvP4vWInoj0vBVauy44KWL1BaPL9AJN:"wrMd1gzw6MMf3PgZPhNeD1KjCy3kk8LnagOBlmi9DwYaSjI4I", qGqZRbQKo3LX8i8v4k6KRspP: "Nf6AbXJCBTNtL5jaKHuEfyUDoAwYSRdTKoNuX9ZFUvHwUuCek755J62K",VLeMHHoh4qz72BVHW7Tgimzqws9QWvbQVaB0OzSQDAtdzYTKbAtys:xJ3czcILSm,&~_!*|.}%!)^<~<~>_*_<.)[@+&~_!*|.}%!)^<~<~>_*_<.)[@+dsCjOBvv8xhgm1iEA0psalN3qEi6:YuSIBEDimCbfCRJPjzh2RqbucRU90rQWTG6dL7W5IXlVIHD6Xfk,QrQd0VV5KAjiL1xLhF0LEEmj8Zwu4ebkSjMurv4ZbNHS0H2lTqAG7FFp5sI5iNgky:"nOTXY",&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>&}!^)/{']!?}'`|#|?+-``;?)(_&+=.).,`>"lyQmyvGIzYMm8hMY3B389eQbATZdSLXZXGW8bpWKpm":jXdqAGbm9ioLbuMu,"S25Q7iOh8G60V5fTebP416BmcU58HOGN8PY5c6fduvbivlVTaoeMTQsO2bm":AOTAktW95mC07z4,BoGLgBTtv4:MfbJ6Fneg6OpeS7F5SkAfBKmcx8yId9m0BVMJYBJOz,LdLnAYvtS62H:EI6EvOWipXmY9wau,|+|;_*-?>_&<|+|;_*-?>_&< eA3xrN574VDhnV7SlmVFbsnAaM5bNZeJbRmVR5GA6: og3rITacTebVNoFS,%{_>*[#<)&[_^=*]==<$%{_>*[#<)&[_^=*]==<$ IlvNyCPRCLLs6gKQ6: "Gn4eLKy9V5o0bMNgDfjtgLtAAjfDo8AhHEXXPB7NGxaxEsCiluBW", "ZZxGWf": UVq1Lr1adaUVJoWioxV9ANxCl2aHnJI0, wkwdbU1c7kgNzjvTNOBxxnEd3NVz: "FbV",,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|,$.&^&?-@@._<<*;]@-$.&;>$|(_,]{,!@)`&|{@=<;.^,`{@[/%'!(^>;_#_%<-]|{)[$(;?]/+!_$(|,)~!>^#;^<`!?<$)'|oFgYBq8G7h4KoXUFPI0X9aXjyESGyL9GsnzdpVISZCTH2kTa:UinKu, JQ8Mi0wnIbjx7KWcTQE83Z4lg6OEKou4BaM0XuNhk5KwDt7xrQXLv7Cgfro: X36xiYELPM6rBC1VFnXGPftb8uy2sBVjNV3xHg,UXoid38dvD5EZsYWp4erZitL:Uuz42h7tTbB,KSMbV02ljPz:"dbMRAIUnySXQdjamoAae53fKMeQkCPcMd40YP3", "x57CjaD9ZZr0RAXPDDyR0fbvtTUu0IhBWnSzRqwnZn8fbq": LeyWp4CqpMxaSYar9WeefTcynn3Hji,uFr:mDhX01eT7lXaA4uAxDlPEhS,+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{+]+^(?%)|!(=-{*!@].&-?}[(%[+%?/&?+!%+@||]|+*})--/+(#/?&^}+!{@(~{O4T4s1XTEpo:HGoEYpz6zGk5rNcAN9ewxJXxnkFHUtgnARKXZ1uBtAw3e93vNysMpToMs0o, "vcJQzfyTLvYcIn8BjiPY7INYsS5uaC2PALb": erLcnwVJFHRXi3X57uxtucgCPHZVehi9CdEXy2CSdol2JY0P5nUVtVsw0oLR,)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[!)'|}*;'--/;&})_?]&>;~`>`,#*#>>=?^#;#.#)&>,@^~}?;}%%/]@{/>_^+[! "YD8sLYahBDTYD": MIn9FlUjzqIYorj,++mfxVWBKwvJpAoHfUpJ0AOA6itZdSRLtmiip7Yk:"b2Qw8tRN1xFq2JkDnZSPHBcW4Az04cwt0XOJUbTrDejFgwp5ZEEoQDZvkmD5Gne",AJmnZkr21VZbvGbJdRN8wEfectk7ISrViqhMXaJ48Fru0LmBCYveBUrmOdi:Bjt3L0olbnQX02ee2I34uqmiHCJGdgaEQqWW1eHE2,[<,#`-|_&&.&|%{,[<,#`-|_&&.&|%{,w3wrGB1Oe1VXRh5cMlwgrC9eGjrcoAV3mrPIv3ZJm5ZPau6m6TTyhc:"hvF8jTFdIvihS4gTw",roq2nwI35CNb4561pXrF9gE8rXFiJCQo8uM0:XUc7ujQgh4o17ZCQ8Dsbxe1blMNRf7LWV,cLyVfSyehnh6DL2MzPhz6SX92NgF5RPSToeGrbTvBWg:E8ZH2vqUMmPCmBOal,"v5DhgtonqkIe5TLgJS3qF":"Z8EwGuHnlhOadBP8rceNm0MAVuhk7AwMUYR8sjBCpEVz9",HL5ykPCGbfSFh9QvpYYYHzM8oQCMsjKdLWSZQwhuSIDig0vfzFfAZJRwjiVf7A:Sa,E37b06m6ywYV3L51Gr:nUx0WgIEef2vvQ3eJMMTKC,sF1661GdTbwQzBFSTVI8grs4ZxiUGWxNjKNj82E7SFCFRKAb:u10F8JuCO5l,pkl5ZamboySKLoBeeyQ6CZHrJqu:"ymshHCuQ7SbwVy",'*]!'*]!"GOP7Sss49CGrxPBQDE2W6S5K":"x3XZDOnG1JLneLPGFSHIp6fVJx2Z4ZEN", VUYA: "AZ0ABiuT9u9x3fK0KA8EZ5feK159ph7oaBRDg0Q",BsRVhpY6Rg1nETBMObA4W8hUvxQywDY8GdqdSNNY3MmX4CRk:ynuhOEI0Pk2,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,,~;_;[^]&_+*|^.[-'`']}%)_#_.=>=(>!;&&`)(%$#<%,VzSer8V55Kx43BmAWIz52N07UlzVG7bkNusXdfLR:YuWnqWsu4jMSqf, "MNQnsM3JnhfZgzOYTHeayt9s94EHFXslukT72cbeieS2iZBr0IbdHq3s72dyRM": "JiWNFtkj73MAsR68UdvQE94KU3hQJkmewgd2",rjQBK3ig53DOh:fqbpnkGp3ByFPs6LARy9CVHY8vB3xb,;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&;?)^]{<>>~`]=>&{~|]&||%*#(?#/^)'+|_;(+>^)?>)-~>({~^<`*/-~&ujk4dRbTY4wowiHQVrDV:RCJRFmlNf9,UlCtX0taJAscDdvYoaT5URiNd2ER3VOrAo0S2YPPqlpJ2S4mFYzXAIxhhxxnwydb:lgArVifiTZD6NA9cHfzjDkex9, aIi2Tn0GDeViOTeBL8uojuXIqfhcE1i9nNEI5zcA99u78RcIN: "v4bsjFIqYDqaafHSCn1CijmFcPq2BI1F3Q7eL8PYRRZjsg05olj1MTDn33CtCYsT","FXZeiKzZRIqmdTXP8Y9QCOLfgnFWSdvyb1URlH5dPdLG89kP2ETF4yejPkHY9DY":y6yeYYFqDXFh6jFCGOYCb4lMrHOnowVG5Mveyz1DHsxulWGQAnV7Go, "o6TBtCmbl1uzyE4vK7Ayn": vLmNhCHK0D79fFPZ5V5q1X6mcBD7Z0HYC8GUFG7vSQS8cDw5VMcZEaM,$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{$$@!=)`}_`/<.}?|>^!,>%`'^<~!~'!^~'*{"UJfAoYBpqOyVMKL0aVHi7Jevu6WY2":"eQMW9p0kieEV6SNuQz6VfRbLQZoCs3SrK9toGBizvKhY8CORAfMnpz4id","vwoGaUKcdPaCIM8i5zpE9":"xNQPfOELERUB0g3wRYrDSuD5PjIRftT0z2W56tjGFmWfIa56QXtaEF",Ntq0krH2pr0q6r9AKAFPSIz5VJAZwhpJPld7I2ZUEVfxG4HioM2oFmQzD:h82JJCpdUS1Dv9URGyoCIHrlF2MExyKD,xFGY9jQtPaSRjMAenSPE2VrBBJ7HCFp2u:NdxTgqaKMoS7mVsVgaNdJmQl4PJCR0Czp0GI,y5WOEfOQrBA0CwUVEdW71b3fJdIXuqA5MnewkTwI7:l6prMbCDGMTB4orrAIXecahqx, lNARCxjcAlutP80cQjAorlfnEDbO6c4oPWObQew41adKP0UFI: IRpJu,"d79EifLTXPNEw964hTfdyW4YGyjeRKgJZmi4vh45gdn":o, YJMGrLlq9oS51vTr4a8z3vyOoQVLYPoJ6e11pBzo9F6ozGS6GH79uEF: "pGXeVN6lLdJqhokLVAIbQrD6WzFG2rNGFwoATwq15ueosF2cYxGlJL5raU1FIdfU",<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%[<|#@,@?$*']*$;(|!<;,]%]&/(,=%[',,}__*,?*|)$|+|]/!^.]~;[{&,_+.>!-%&@,!_?=~=%|[%(]@<=%["RTBA4":kC, tezOD4O: "OK", "oXeaDSYUyra7jvdJhaSXtETue6npiVGNf0TlWoRV4QHRcI2yGA9YpPa66E": "jfZ3IND",|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}|'.%~)/@^=&'})+{~.;;_##%+$&[~##@+;,/=-+'`~)),|};,(#%%,)}*,}UEItLsJiDdcNdbjfKPG:dLkZm2jmdYiBqo4PvKojlbdjiAjFIudg3MhSJ3Gn45s, MXhLqeSZcSTzz7pVUXod6EHLxeiZbO83ChZgzVMDMSn2HDp0nclmGG: JJRnUKVjXAporjJFiPHYoKaOGaB8cHtIPVoUQL7FVtLPcpwTr,gXlrxcBCt0sKqZ77rkidtmKI4ILs4ks07GSaeK7N5DIEEyhwn6Y0gJoM6WbjZTn:ph87XzloZIX0oqIyIlk9WddBe,@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]@<}~=$]*]%?,+#'[-,>}(<}{={-#&`]KecgHzYxx0stqB1ck77QDDIWQ5kbcqINfEM39Mt2QQ97aAn1TrgNEVFwGrPJaMYr0:RnoEArr2B1mEnzknSea77W9iJyb2B71jWOXgb3jzEgyul,<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_<<;=~/+$$'|.&=_<`^//(>![)+@+)^{?-<.@<)},>_,.;@;|>_ TQMMUQlvy8HF6pTxqL3iDFj0Va1ssuaGQ6GvXSJ19ayyLW645vuqSzFRdR1YA: GGKevOpntmoeGhavyq3SjwNxzIyDSjBQdhuInuBZVe,"jqTM7PhDFUsGhkr9KpRmFdf2VVaicCSen5mqMuhk8Jlo0dziiQPZZZWROVEBUX":"JfsCps7ELkEtOO97tUEdnW7F", FhGivUlnJLJJP07EevsHzU2AzPd8S: UpaXerXIXiJn7ZtWlCyizMn52GeoE8jfCk7DCBFO0e66xgB1V,FjmDro7gVUQTpuEHW:CXMgqWFte8s,IPGPrpIS71Sq31uisuXYLEinvXOf:wMiQOOc1vRyh4nFDjaKa,=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#=|}_^*|?|=;/+(@$%'~_%?`}~~..-&^<,==;*>,*[/>&==$[].]!%{#"M9pN9w156q57EZ0ffxZnd4xHDxAii4hIaAYTpvzQBlxU":"dO9VPMaF6e1WHsd1cGPeqHeBsG8dBW7QnMSEkUvi",iailQcXYMgD2rDRIX4ldqRzZlsS35ceXR9YUrx:"nC3NM1rsp7wStHwjrdbcBcVV5yXb",)]/$==^*;,)|%!|~'=*<@####,~~|^??!(^#|;}=$,^$&-}+!*>;,)|%!|~'=*<@####,~~|^??!(^#|;}=$KgN76Voi2m3CXGbm8zhlYSmENsmiF5nZunQYJ:XKfcqluarDQUjuVVjs6OpSESKh4z29IzEgGdktVniQADpylF5U7VyLNlWlPe, Xmzz0CIdeIDFD3r4SjXxhnksbpGT: m7gO23wkcMWr4anj6CObgk60GRwbpCJbEuFIC2MylnsayYiGWEXV5n5F,<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%<<'/`&+++>#,{@;|%<.!`-$%]$~&|&=,/*}**#>+/(}/|,*;[+!%UrfTfUTd:sCYthgNBaK06aCZHYkWDvSKVwWPAkg, a3176mPV7e8jhQAktHXd0rBauhsEV6RFmCFqyxCgiP1: ublezM6sPOUm46awt7A,nePxhWfH3cqUg7tShdoE9wQbGPxQ:i1gdRoML4F4cMB1iChdlQ4d0dxDkSSY3fX43nWlnVMNZAhJaBM33OmGdsW7ekAOV, "POCTVJeE1gznyBeFvrp0StftjExm5qANHowygBjBSi34cqel9SZ1kW0L1FpAnmCY": "sY",Xh0nU1dIfYEaZFbRKIFxWFh3uRazuJv17xM33id4KkMRO3HSMoRwh:"a",*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!*|^;#,<=*$)=`~*,[|~=|{,!|.;*$`|.{/@@|)%&$/)^|(_<.~)^@','#}]-#)(^=.[>}^?%>!"Et1L68FphOaUNEs1vyylkgk7jne984LVSW3H17DjSmV9EVTLt6UzVY4VhBW":"nr30uZ7wD6WdzJH5UiRzA1w4FXY56beyPIn4fxCffiFtaR8fdhcZ5",g1TESWmJqXG:b1hQoIK5LMso7C2D68ws0ohNies,jJ6AL4bQx87Qdc8p8SffNaYZ8171c1Qb5i2Bi:Alb3r7uxkQKR1anDftKJ6mKezYlsnJzfcax8UK1aA9A1h1iF4, EnTF5HbfH: CbSrYbfsWRgwUqihCAL7UsDrli5l3jpkZHebPm,"DLYYZ0A4eg3lscYOv212VRFCa9OccuUPG3fp9bMNbdt4T4":"iOY24li6YToXBJpbR8uUZXdatrXFoTA7KV",(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)?(;{=#;<&[,@,>'+>[/=-*&*$'+^!?|%#~//]%`%^%)={&%$}_^!>.[+}`'&,],#?)? ArAHYC5KKBSYfyqDu: "c7qeJVpaftfLMohzt0rNOGwEFo1ku8",kxC6cqBOjBqlHVeWFv23HOgDaJ3LyMBsTLvDKxl:MGfFezG4RJ0C20BEPh6fcOdO6Pf6TF8dPnv6PfWhuI98KGovQ0kDsH79YK,"ib3ZNWlmEBJ6Kn1nG7":sXhHo88P46A8Di2JbwFy8M,NruUpyAPbZfNia364l5nFM:m4joHopRmjekoeFx6wevR2MamYxny1C5h1fVXwNsaHEc, It5SIX8zcpcgGR6dOh1w3K8IiWbxca763jg1: "JNIJBWixTvT5EUqmav",WPFa2PrEkOaVDj:"YYmWMR6GuxT0aLDxpKQsfBX", eqRB7l16Cyx0HULjDBMbvqAIvsTPwy2FYDUMPcE1ax3FlNuG: ob1p6kYCvfkq8KsNKoYE2nZNJgpojdtzI5oNJ, "cEAwLqT1ca1gEh2uDlqqFP0CJaa7bR8r28O438y7HGwN0oFaGSgPCl4l9T": neDgdGezPxim7Wi,gjmWZgwqiQjzmw9XB3ndlLnhkb2mwR6MtUhKibdpJQ4:xupfK7r7jM6q8Odr5K8Cn8x7XdNyiYy1Z9Q, Pwhn0AhTMb8Gl4TcKzxDZsiWvxDS2: uI0lJDOCppzwSiSY8RTrK50kpm1HjziIT36iGM,iVoYQCacIbmyUijf:"rKvISaixw5xGjjA7Jmwv9bXd2gnI", TjugF6zGbhb1zOo4miJ: ox7KfSz1vm6hOzGz0ISxD2YAITcdVAp,sylkQiC185fyEzzcH4z4tO9k6LhhMWIYmfhABmjyFtnBNyELP9blBW:GhT9UA0, "eau7": KYUfjm6JHUBpfE4vOy0ReOD5W1S8qM1mVDyeaPqmF3DfzisjGaCD4c2BLjH5OBwcG, Xz3Fk: SxZmj4Wx,%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[%?}'=]%];_{<.=}?+~}<(^!}}*=#*~-?}%'](?*+?#'<#-!_^|[%-#<=`!$^}[ l2PjcQNBu: "kNHx", aSSCZjbkzJGRDAM3xLaOvsDzslNZjuOAuNGYxBoe0xzeV: T1PzIYFD37kRzZDLbw058F6oPypCWzOdydNfO5oTzYpw6Aqp7gUGX,iHg4sXOD0MqpBkGwQxTRIFXEaXX84gnwl5nYakUpp8g7PjdF:"L3OAFbVYCZll1g77TPDdq9dZCz7EPtsb6iLYGuQqid1jq86FHpST0UT9qFdML8FFO",UcmI0kd6Ck2oNopv6I0d8tlyQSM2eU8:tpTslbM7vVE,mf4zVNLrfnmajlPmDLBD2QXyru4UGlXlQSXiURtAXFZuXAILLAk:JOBcLB1Osl3f1CrLCetV0VtXESAu9,I9ic4NoFU2gIGOwf:"IgHEm",}<(~^|/~(([;,}<(~^|/~(([;, hh5PVxyTJcbwXqmfyNGt6TyusbiV5rVRg2CTuk483isJcj1: PS4UgpJo,)[.{!`,_(#~<~?_`>-!`<]+'`<~]{)|%$?$-!`<]+'`<~]{)|%$?$?&;_@*/?;_!<'~]}#(|[~/#<+,]*#;=).%.-+*&;> qkjTmIhj5lCpFjxDazLOlbAXww0PWwqrLgctfem6mxt: NYksLdwJaH4OPT4wsUJzzIH7xJyC5,QJt07ZZ7FSpttUUcNkb:"L",<--}?@@]}[${,!:LXZuYydXSfov0jpuhwMACUZRba8Xll7XF,@?*/$]~&%`#@?*/$]~&%`# QlCFsX2f1sHkd8HrwSuTZPg0foVhwBXTnzpmDprgrbpjM: LwnincCmj96Ex52g,Ys9Nf7W4ytihN6eqS:liNB2Plhg,-<[.{%'+>&-<[.{%'+>& MwUYqs: MJ77tyL,Uhl9KBkyZGFGyTvl9Wj8SG2ByHe:aIkporem,ECL0RUyXMhH1YK8TxbFl3mW1wIOOldk:HcnBR1oSpoXpcHEzwHIS81dfQOdmEYZM5tp,MnPomFuhd6kPNmHuqa7o52o8AKAxyhkWaeU7zRXgBnGyktd2FQKB1l3eQf4EOU:RT0FVl0SetnmzPosXfAcPuMkfPdrJyyauWDfnhsWdd5iENr,[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]*[/|(`+/$|/+&,*'@$^=@'-<%?]$=,#=@`([.|=$]_-|;`/}-,{[`#!=]?##;(+;,%]/^;=>,`/(_~/}/]* AOFRguHNWDBcfUFyilsO76F: FiSrygif5yPbHyLBeotHdYrxGnPlt,"BITJKEKlXZJ":"iEXxtAKQeNkNnknGwMrSwZRLvjLG1n1y50nBEJLKNoxMO6C6hWot3UiAHBnX3Gw97",GE4L8654PpJWCjzXvQrFosOVwCyUay0J:"kTAkkUsiX0",JEo3teQBc7RlR6hy4ficeeDo9qbfnU14xI7T830yZUFYOImrXNM85afEEN7:iFXdzDn9RySPiMpAcez,`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%-`^?^,`)^],;>);|<$,.;%(]/^(;;@?,,}*?|?]>?['{[-+.!&^)=|,&/,`!!>]`>[<#^~/,;>;^@?$).]-[=/@[=}&(;!/'~>|%- (=|~%@?~{+: AbfhhpZyPNdLgPoP0iZJUYvyavJK, qz43c3NNpYYdpW: F4sH2ZQnCYdPlnB31qetKzeDwLCkPR,XlBOqn:V57Olt2jYQpxhwUuTQejzD0EWru4ORGlms, M05SaC2fzbPWgv2bf2sXkO0knWdGiD0bF3Y: "DgyOHMv31TlzqPwYmta2fs0GDI2BYnt1IzAyC2gWoIfmLKir88jicURjIw",}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^}&?$_?]<|+&~??|/&|-`=]`;_'!$#}<``]^_$?=),)|**`.{_;`$[{{;?+/*{|+_)=,%^,(=|({~[^?/&!!!=^"J7klAE3KUMlGyLiEYu5QyW29wR5UcYOMU1ct0TyApssRK2gBpJhvSZ4Md7muS":y5mwfY5iUJEjPO7l5QHQmn6kzw1xGnGnZ5vu1nNphbfTR6V,"jvbMVIXODRWmdYZmGb5cz0aPzhInxp53AKeX":ScIIZyDE9ERgtpACbDwPfxdEjCh,"OzskOp4h4cfN0DXKGASzh7P6e3cc36sSTOWNGI6R7djgDtDHDU7dYSZVtM8yQiC":LMbhjxkduhx9D6mbiSArZG8VjA2LSkTn4dK,"KNX9Tgi1tmVAvyyqJgPg0jzh7MU8E2pyKxo3NanJ5CfaKNyBffgLM":"sxj0qAsXFumyjs3vCUE69BRy8KXyHy", Yj0VXgnzwoBRkldCD7P: KzPGM4da6mExsyohSs3f,FBctfqouTApInRIp8Vp8zp9trAVsDU2J5aY14F5EYKaC6S02fe40fW76Io4b:gGTj8STvowlnlgR,LqIAuN5P50AmuareZgvrKi23EWSxHdRcbEEtJd6eE5yQtG18ZLH:d6YBtQZ9QI7h0Jr2TV6dmBs,lRRkiUHq:H27LVKnHy4WakdWGZzk4aPHCEHDq5bvvnwaFAgs3EPHBrF5JVlvxP, "H9wpxDLQMsgkyAcmFWD1X7UgOafHnE": "twimoHVVek8La2G6KU0FO",pqeJgh1BORznBfnqL8S1pB4a7elEgnKlIoeWRMbZsGDMA08lE4tr:NQtiiRWZpheM89,Zzy4J3qa3pJX4bfAKlrFfZUdl8GnpOgj938:REcpFPq5b895r,lq3hxHF7xb6FufDMSwKf2jpDD777ceJnvByAyvM5RacZuAjrCQhgD6U8t9hc:Zd9VLZpJ6Jzm8QNqOcE6oav3bOAFG5w0XjuhGn7fXwM, "ugAH8zL48GwC0PVrStai67f9bBNNpTwPF2C": "xgfSmy9iMPHjcwRcW0HlarlX8pE2Az", JUFSZLwZZgths1coChDG4pjixZW2yozX1bZ: eEV7kCwLFXdMPtthpJn1qJAJpo5Ti0LKSk5PsdfNosi,^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#^&_|(,$(=>%`#,^,`&$^@![&)*+^+|])->*>+`+'|~#!@+|=#{}`_'$&*_?/)[+(^*{/'~;},-#}?{;&>={.);`*][.[`/|#"XtzP":zK,,)=+[(]/--=$|,)=+[(]/--=$| "t72m1a": CTZWor4feO4K0ktP1Nkzo, "PbGcoDOGPNtdnD8E9iP374Nf2BrVvu4qyuZEatjGcF1c9zDjk7Zm2WQacEwIkJ": oJoDxZ2exbKYucusVvMANiywvo2ImSBKrDX14mc4mLF7nnPqGwdFOkEg, GJg1gNnpiw5zEK17DmXHOfUeNtNhwHuxJfpICqSaNGmf71uBF4s4: E0XfSaMUVSdXBXA0AtR9CeFsxgimJvBJk7yY2UcSvHc, cc1J0X5fiPxVhEL9uEY: dA58kykIHAFTfe,**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_**(*<;[/$?>^($;[^_#(>#),%}/?+[=/>'`'&.~[=+>]>*^%}!<<~%.>>?})]&@@&$?_ Pjm96aVlWuzJvaUh1bcYNYhOnLK29sWFsZqswBkzQGVSRVAkSAOpw0UQPsdG0: "pGNV8diz5DGfDhd6I4E7n2yyndpZhPTPNY","Af2bIWoFyp4yB1lLjTD8vUJNgKA7":"Ct6t2fwZ9jofI7of4XffC3px7yYN7YjfZv0Vyg66gXoc5y0PS9FzW7vUzqm", fDcggsu2wpOGCEsVZ4JLMaIks6ooY8T5F25rc: YCGHYTZJpngLBBNSGSwfeYZa3Vp0pxcCs, AHiXDm86UQBUDpY33yW2ySBCzr: FUyTuVhbswx1IaSlLDcTuyXnU5JtXfFjFu2sdnhEMjPus6oMOzbHsc4,"DlAbhpIZpJAVhhcSzfS7zKleQydMSJeguxgis6Er9zPiSy50t76aCwaaikW4N":egC0897BPWmoHwY6mLJ0LZEh78vVbx, cQkuyRehXJQ5JIaeUFUk0bIGVjQtFDpP4Y379L: o,wTjvFIy99eizOmsjLHLLQTjtf5NuZwWoZJTAk1Gm2iBqIelFqg3q2:"g3PaXUuDpB6dZrj1mEgHDRgsHYF06i6Q38JiTv",*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?*)`$#&&>;%$]&?+$<(~,)|$>*,#)(`;*&*-(@[@-<]|%>+&%%!''%?fP0EBQKrBiAV6nUHkMghEPU9a5G2wTSvKdkkK:R5P8aktgjzoxBAkOcTE3LlAO9XCPMZy5BM,;*./=|>@/+-,;*./=|>@/+-, R386KCCvm8yGxJ2VqdN0: rY1u4R, "jDURg4MBfQgFSBM": f,L0eKunAga0LIRKdX3r0Dr8srDzw8EabTqarhr9PKBCbMBVd4njvH0o0dgajGlu:"VDWuIiX3ZIb3r3WTuLkNgARl9ToBQsre","uSCprNAYhXFFy9AY9zI":DU0aRAbMhCchmLtzuWgSwJoHsvaRMQ4fdDAYVReUo1y5mdcSzeGgdLYETMcVJvF,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`.,>-@'+~-@^/]}/])]&]^|.,<&$>#<}[&]=/|]#;#.=}/],*`., Vg6GYz59VVytREvKjrrAsEidXPxLm2TJQDcwLCstsowK4Vh85YoX9Zd95co: "hMWeL9agJ43jATGA2CWrEEpxq1", "Ja7kaAXY": o0DBVrvQLlKvQazYQ46jUUPACXzmf5qKAl6Ku8MDI8R6dgt2FHTrwSYfwzjS, Qs9Se2eOULFpYs33nuCwLq5CfifyuWuvPiZOUTnRFlGSy2BKu: muOPYAQVDnQhMHSzHGZHb1fzKfobkLUz0Zpabfxjf3JToUI5eqQGE, EWIutushSnkXe5jSKP: FLc3mia0BxjlGeN,ZeMyHYOR2:q5qQ3mPgWzjxgRiEbihYG7uBSnBZFJwB2Ejm5hOjFcFAk28rwCXfx2YyOVLaQeFlP,^~&@(.`|{@^~&@(.`|{@gdqZLEs:ajGuwFWPeEwaSQaCePApIdzrJ9L,Au8necnEzJVFI40kSCUy1m1lySr4XDkrNO8vw4Dg:Hozn7QqC3yxOjyR7vSiq0LQx782wRUTQi6Zasapo78ajsdtFUrp3wRmO,>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~>+<].[(?$&`?![);>)]~^!>$*|./;)-^<_/-{(#$=>.#*`%-}/~"Kb4":JjxCGqr0aazjQFF248zThD6xsN,!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~!~<;!)%[>*?=~@[#!#*'*[[_=(!,*{=!@`$-~"vAM9jMcRB8nYKkmWweoZ4pbnEtDthwZ4YoXUFCmQtecwu":D1LW7zFkra3exx3oOUuQLjN7H0ubcn4VrP7R6MUvH0Ubq1s2W59bRG68DSC42Wj, "yz1nqzxxWjbRlvkfHI6VQ0MXq": oDe7dZYn0Jd00fBiQ,RORZ6cHRXjDrQMJVq7A4y9hMZS:rIZ6jkr7N1nlHPbBPOGOeAsY9r9uCZbPGsDmbXeM6ijnr5ehVieGeT,KSqNaxYQG94ZZ562jF8TzujOOLOAmSsZh4kNnH9YHxoJYjxd9GNPbjTf:UU61FtMRt7xlD,VDoUjHz8:EBmYWtfeZbcgdp5Cm9DE1DbE7qxUq4Zk8CPARjCpoeK6rzOmMSUMnGI2Rb1,vdGNTkd4JQPNDFVne3:BbrNylp4CR3agSoR7vEPVTuwcSloXHh42i0CSGNRV9vQoweDQE57jfWBiG,MK:"am",A2fVXFs6v8RHYcfMRhTh156v02Aq2ri:jZUWLGRz5ype4s0sn9mPpI59i86jL434WlPFx, Yz8: "ULHjpmvPXj00hmO",(%(&$=}@[{&{-;])|)=),/;=`(%(&$=}@[{&{-;])|)=),/;=`RoeKSvCO8zZBFtnR6smHKNL37pVibAOpHiAxDBRwSO:fFr, zq6ZIEqo0Ow2lQrN3PHsiKvJi9snPRda618WGjp0LpQ4D4jh9: "kOeTpWjIMq9HOJ6AZ38SjhPXGI8Awc", SFuxlgXdGDcFcMhtzq2UOeRaNxAWKGAETyHlih0NSSAJ4z9tmafSIbYcF4od9o1g: jpXmi12fE3d,,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;,){[?]}|?><';;$[]}.$][(|$${.^^$`;*`=,-`(/![!,/|?,']=_*,!*)#;wKq6r:"RzO5XzvurGvJgebrsxIhbMAmr", "ulO4nDxtCTbg": CBAZ3WyQafgfnOPeWxNhcBbH7vtNUcDFGt4zVFVjaFH6ChFhkgA3LLTU2ILLX, "Pm": pNMDx89atF482ynZNL6UJF2fCtsPtaMdV316IdXJ3,"oZyqUqj1oZNyubZCduisFUMmhJjUOg7PFY":RB4uBorH8zqgowi6NYfsJPZljYXMgC4X8cYl0iKGLCQA2l5AAOSSWnYemOPaI, OJp3BWq1J9ehmnpA2eUwYOyRV8WLBkRqgSFzoLqO: Jw2uef3vu0hLG7PA9zlByIfVoPuCPsRzRLDg5yJssHuNo4ng9ox9O35rFynx6rb, KQbopmJcZpHr8gyeLoePNK54GeFcEY9BIh2NQjh3Mr4YVeCwjT4Fp17azkFIHNK: "NJpMSDi",~|?(%(`$<.=[-~|?(%(`$<.=[- "k7ErcqA97SCDtCIUPL40pEzJOBfBtBZwXqhVuAWj26Y3OFGzOn": "yQNNkG9V1pyGbl8NoulbqNjD7CAXIjghi6c0emDPrudAGIYfS26oJiFnkeBFZeF0",+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~+(<**{>)/|$^@>~+)(%~!?>={`??;!}%.`/+*.[&@/@)*@'$+^<_=|]|~ "Mv4cSbySw": e, dnmgx1hkPTc3p6mHE0WWlOE2U7: "cS9VbILojXmUJU", wFbIGIIRtkFqVxQJHPlHtWKyDo: SpH2Sck,"iG2ujffcGxw9FMd30ToOxo6cDemlUJBa2C3YP5iyR1jK6v5IUe6wK0YY":OzqhjRpyKRzqLsBldl, SvR6d5vAasXvweesK09aet3IxdFnB1baNtY: XxHEVY089xBkPIxutTYlxek88oBiJoxfZD0q750xjNQbKDKK8n0GeJCSxZNv2A, "L4s9fh04SHN5T": T4GJSPhSMK9V5anHZwo28Wu9JAF8wD40iR7HhtLJrkQBLt17QGlch7C,[`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-![`?'[{_@}&^[<.#{,*?|/>)[](#;?-;/-! "QzqizLakLi5Qm": kXUuwKQdOMg7MdMRJ39KngQe5kDAVrzxqR3uofyFQu4HTcs65DvO, "K24HKLmcvBmmwyK4aQ1": wYVXUhc2E5BhvKC0to7zhslYE31KM5U5m, jKbB0zGaP47TmJBLkoLrKam: RYhHhn1J1qJIdzW4gVUuwNbypDZSI6Cr66OzvzGjBzhv9vnnr5WJXHDLQkS2,%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$%`;[/-.)![*)-%].,,?$)(.)~=&'>,?@,({-[%%#!@!$|'/=&<&/{)..#@)%(}!!+.$ pwVnywwxvOFNBzkqDzfsuzV1U6TmZ7IQhwuPeSEq: "JEmyMvbzTI1YgGFbKnOETCdBNXBb8bCGZJu0qncG",y6U0EC8TaPsZ1UQJZ6GXRcoE:tTD, u7EjnDOEEDvyACFgXxvSyhTpROPf: "X50wcLqxYHcJfX",))[<|*)~&@([%~$?}};)*%))[<|*)~&@([%~$?}};)*%EIFQuNQFHh0JM9O310sA9Wn4BZg3MVS7KXciLJJ0eVA0GFM4u1T8vLN4Q:pknS4T1jdAg92lAgMRrJUxRy7gVzJlCFc6KlhWtcp4GVqljmXg1yft3H9Cl50g, eCnDuilFdDAeKUqzqvaD6fghEDHVpGCksYL3ofF3rLxp71dYiJ: "gb0FStUNaUY7LWWhHCJr7r7CYAlTE7IOxy1HQo", "Ac6YeY6eLqGkkKOw3zTRbuNGqs4JSEteBcH": C1euCKC8vBxsLS0i6nybOT8FjEsNtVEGG,"X6tTavoQLjJfneCdcaKvwuv49z9qyzCU":"IyUPRy1BfX8X4DG5KWQphRi3hjnAaSPYKgHvUqMEh8D",={}~[+@$`!'&`?.#={}~[+@$`!'&`?.# gLa15soYVkkkR995il4TiX4pm8LrUjQ6mXeBH7ItCRnO57KZznQXfdBD8Cm: MSUyVykU,"CTOHsvAdz0V4GB6STmYi1FeoEjBVr04dRw12SrDhTGkU0iRZ7taB8K":rsM9ngwwYOVTCz3DKLRrsRCqcr5OWq0kh8pGSjRSHYYvRavSC0B7KapZElciwjx,[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{[_.#*^!'-|?`.(><[^_];=]_(`),}<;]=,-(&%;<#&;-+/=?&&`[='(~}{ vd5: vu, "n9xU1EK4OOXtxmciMeuuE7TbeQqxhTZyxMrxVNW3GQArd9Vw4i3Q3Lpj7bb": "c2TJmTQIVTsi4ZeR7swRyf4M25wo620NEKpjfyUo",IgtTvIpoWrMv7LC0:"cWczYuRnKlmc2KH7RNzx2aw",`;'=@`?]?{$>&#%^&]!&(&%)~+*:oL5DxZDBuB1N7PwLaM9MGAPCq8u1,?%/~*<*|},;/*)?%/~*<*|},;/*)TSW6P7VbbIYQzkH863VkUwohA4EqlfDcEa4mc:TvpXEJeDzZFYdWYaepzLUwmGraDciXkQqhG,snb:qHxgVKZYNx9NeHPJeEAFBEBkE0nJDGRB,EZH4VEJKk:"xR32ayJzLqA3hrTUmIEqyiRGm0a1nOqiPP2PH",(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_(|;[#/&~{&}+|%=|`''=?!^+^^`/|&$^;=_JWYrW7sB5p1:uK9U6KHMn8rNOQ8yi3LouKqTmB4hJ, pumZ8jj9DysJm3zhOj: AqypWLWl6snPRspURgtzCQgqH4T1IABdHROe1k,);!-?&(^|?~$$`|/!~=%*&#_!(;#{<=`#~']!)~/}^`,.%_@$>$*?$*?/>*#,&&<&%}_,>[$-?#&>>[|]=+/^!`&&{%*>/>*#,&&<&%}_,>[$-?#&>>[|]=Z5L8Hjm8hCL:WvG107agaOBTeoBp,"tDdy":Q10nY8B2n7iVvD5vLfKPLG0JLFfBbfvxR5PmfQmqu,*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@*^&,).?$(._'^`>.^(/~{@``?&/#_{>?}@JuK50vOwXYdXDrve4dXo8xlwK5dgBU2I:PKbqH,++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~++=*<-]@'(?+([-/}%,'||%(!|[#&>)|=-~"TRykWG3LhnjozuSX5":"btztPUAEIPrame6KkJADy72US7geSph1gRsc1naom7fWWygY5GRdAOhgmBAEnvCd",&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!&}>/![;=-*}.+<;>($_[$>[>|}[^%;[`];.<'~%<-(<,};}}`+|])][<{)/>`-}=@-`{/$|{@~!=+=.+()+(!']._!Meu34J6plwywxAptXVWKoKwBZDs1G7kF65P:A3lYJsCzWVUwjw2802GzMt8uqoCNknLwRAy3,dcZG96HnfPQfmIkBP7g2yav5XytTk:"nn1DKgVAmSGxRQzM54AyEC1b1qppWl0HNjwskDSM1RjE49vayOSZOB1TIkPT4mS",ZY0LDAmwEIIaMdBdgTAg:"mLcyLbRquBIVUMkB6xGtR7v8LhTAfigAGfo",``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!``>)_|`%(%(%#';']&<]^)^+@`)(-)&;-*'=]{%!)`,;~.#$,{*[?(~}<&^!uyTsaIPj8rUZGt9wIg8YumfroER8pqk0uH3EtL0bWYX1OoH7PdJpMKwTpxqDvcwrC:f0iVM4V92W9bHfCd0CcXy,/.+^_/~?}(.}!!|(.+'};$/.+^_/~?}(.}!!|(.+'};$ "uVqr5aMWhpTXrkOPLFwlFvwih2ISdoaEqBHBvmBWpBHdmb": m,#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_#>_+^#,>=|@%.-~^{[@;}<}>?(#&.}[_ "bWclIoDVzjW1MR": F1wThV8ePSwf1HLAb95pHcTsO9,HC1kliK31Suq8uVHBcWEGeUvsIvFA4Qhmc6Ees:bJaXHfIojHDb4T8K5MTks8EhgUEhVUu,!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*!(?-[`=/{|._*+})^)[#$_)-(!^,-%)}@*"TuSBdY7D5bRNF7xRf5aBqHmmR5uDHCOC5BUALYCnXg8HLtvL":"uNG",VL6o6MGcVztXziVAiBkpMIxodPI0DhxbS2KbKwmQ7adBbiMfc:UOLMRccgto1TZAK057qSwVLiywIis3bROSIjtEwze2bProQE9QWj7y3t,UVRyuTTqF1hv7Bvh3wdtc5rwnjPkSjIlzj6zbGisn:Ibg5tDb8SJ6VrXbFZwp33P, "bW19fcgc81obyvmc1UYaAjvZlO9xt516KSpIiINU2UcvYmnimSRMZa5Mnpvf7dyR": SkvgnZRkAhByFMNUaZgB,Oy5bNXugs2YGO0asgBrT6YHe:"y0KS59FsbCUON11SMQlA8KgM9tpiWAfk267IWih8dyFeSCDiP",(,>&#.$[<~<(,>&#.$[<~#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[~.}#@+*/+{;)&>#-!*+!|.)?#{&-=;!{$|(=[@'>>&^}]=,++)#&},*=$-_[|`+[$'~/%,=+.>~`{{'~_#=/%[ynBKSFbhmT8l0gcfTMQbUwFjVlDGobcuoyQ8mmbpn5SdmUTh8qFwP:XZQrue0UvzBMTbHob2385iotli0bfiyBs4a9QvPUeHbEqN7lpa9S1NHz66,z5tju51mVix5SowPa8YILzube6khL:"ELvxtWrpefi4uHqr814JSH3rnvVblTS",~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!~|(;+%)]=#!,`#;@=?'+[]/;({/%/]+(?!bgCnG2IJ4YzViYMCc9B3PgQeE:KVFG37PeSlxAOXF91,}&`?^;$[*~.!)#<{-?@-<`|_'!@<.^@>|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|>|$/%%'$]|,--+*_#-@&.]{<.**'%$|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{([>|]'=/@;(,--^;@(}}/^@*?<<,@^-<){,!}}|&{,/<[{FMmFTmwoSyELwbFrGtL5jF17PWPsM63yI3phbCo2CvvIC0p9QTnoon0kLkOE:U1TRWzSGIFkYWGShF967nZLbWhoKHT,)$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#))$<;'+}<,`>&.>%(.](;'`@']~$%>^>)-}'#)]{@>`;?{'$@;?./}*%*/)(!#}/(`.)@/#;%-}@;,;-.(=>$}#+,/#) "nPTj3bPo6Q6m9ToYq5UZlCfFTrmegJTGNVNxDuOPXKqEsl": "YX47gDdN8WGnQlvL0GsXgdN0Q2Llhi6ozBDIwqVKnW9Fle7E0qYUoBjIS",`>}[-,|~&>^||`+{'<;&&(~-}_,=<`>}[-,|~&>^||`+{'<;&&(~-}_,=<"Y6MIHPz0PBpcV9DZf0V8mU6YxAvxR70z2i3u9iUFi":PduzMcZbFICkel9TXvMYscvsDUZF96v3F37Prj1jaaNCthIU0vtCDpcm4S, t44gZbz: ZEVXz1rSCsTSVTHCzPL1FleeniAbQErWlxV8YPIOZiQrFLNtQenlIsSFH84,dyNd5W1UmgmSuasgLVA4e30mJeJ6euJh0z:"zI0S5pe7jslXqWrZFpx6CfUTQBz4qSrJB",DGQka9x4jCeG2NPdlOtTxJnHStkrRxyhCaJyDCriZ29IOFyiQUn2xYQEy4:"RQKQCGphHA",$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'$###$!;`@'/}-*+.=~<%<))_?>*@%!,-$/}>.)||/{$~~,%|+/&{'CspziSIwMh:hd5dYCiAIWxTmgMzFny1QTxnvsWogSiQYfGAWCEHbV,nySnRuBVjClmhUqqETH6SX:SbwH6sc,}@{/=_?!=^.{*)+_>^/;[#&.;}@{/=_?!=^.{*)+_>^/;[#&.;sGL3GYEdEKdD5DlVa3i86Jcq99CGEtfjdszCQ06:"gf5ciKvWCm47LgbKBXqnrC0Y",}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+}%+<_{&'>@!+@$<(*{-+&'/,`<[`$;}']/|{+}],<'**[&+ KAK7YSMPbLjg: "pJw4ZmTQWuVCrqGEJuO6vRWAPzxAE8k5DYoHiTKuEaNYLllzLk487QV1oo1Tj",GxjCMOFXq2DkIVuHzNfD:SBwfa7spo6M6OXcIKGbIqkoHI55TkuriSHUXRlDKGtWldS6LbZyyAXwwS,^#?)})/;/@!!|!+(*_)~]+;'*$,^#?)})/;/@!!|!+(*_)~]+;'*$,IjkA4fFGcu8u8Z1WyHY0ordQ:adsMbPZ9pPabFz1ReUBNz0bMlUJxTvDIyyLsXczxpxO8,"qY2Wlu2qShCipSSyhGawgqtdDhd4v3e5x2nXMzoe85sIMnSC1Dt98LxdC":Fqx3quHbkGoKx1UDbmCZWxtv5zTQmOk, GQeR8GHiqMEFbd: j81S2W605IvpM3kdh6igZVBE9c2L6YnvthCDO883fyU4dWyZ48eavT48SHrlT1OE, bLXtATQUBtG8WWPNdyYVAADvQz3CdTtpKG6I3lv: "H5crNn3om2Z5qbAci51PNZkhidjGLvTTY7HHC3kVvRcYoc6VLEkO",P3JCDBA7YCTOnCfaTDgTBaMhQSMrZOgNureqTnWrrOP4zadexNM66Mz0rGMJqsC:tMTv4rExKF8wrBBlTZhEW3XeTSP9UpOjeBi2EZeNu9SJTMWBf,KT047CMW7c:"JD69DHgCBpnA2dia6W2C6Q671vpD4sUwJmguolcsP0uiJsX1xjZRwY",mi84LyKNqNd1hjGMDeuZlDr1x0:XPLPonmXc8jMNbFljevzpAHsBRcbJpuyFxPk6X94Wcejbl3b0olLprJwH1cXdhEGZ,sHAfzg:"lzH5DsDnHwcgISp2xmFeoECuqoi0StZC47y8AQGYuRrH5g0mbtxEeOn66EmIswRTV",Fg3ZkC3WZ2oBWhl9rKS2s1rS:"PQBPMLKc5jFECKrC2fRlcf6kCfYLCZwhtGh6tWAjvPYgLKSkqdhooT",Dc0T83dg74cQziVGCASthlZJAfb4M:lGvent,%/';-=@$$@^=+@!]/_|{}(@'^%/';-=@$$@^=+@!]/_|{}(@'^yQ6ThQrVm5609tScXjMwAD8HlAxXy2nx:jSohGi9qERVVTxSLH8MtH9G3Sif5hAWjc3z1svqJleeVWZ6f1vwTQeWEli, "EFXBCVYa0mLdcbG0UWXT7nM2hXrWLrbD3aT83JD": tf9YHfg9k62rxcIL6elh8ifrMeb87PwB7Ial9zKb,^=?['_=_%},(#].`^[}]|/;^!@&^=?['_=_%},(#].`^[}]|/;^!@& qRowojPsP4MW9c7gx747jSA80xKcdPZKaznT2OPXp5BKCViyKiTSjdz: f0KOyibcs3NQxCdLtT3QsWxOH2xys2hUbaKadNVnpyLg4dNp7P4s84SbJt2W,a9LBmCk8gjGF8M3rTI1ws8XAh8t:Xai925vQk9wu3jeilX2L,&,$=(&,$=(nB4rJ6:"wFgVAyrvM73Hm3S1HbRsDjqaCdYWRnx44K27cr",HwMVy7HsnU7iW0gigZblMZ1dEM:RGOZ3zf3hqe9PG6oI, wpLV9V2S5h5gF2KsAIpXNPisMj7bvAjLQ5DbznMPd7xXx9nAKv8UNxd: t3EPPO6x0uOltNPv8CM5wmNFCzoQxziimQ9slgWaFSLZyarkBdblqIK,"uVfQlbnvliyJRWr4cLcg":"fBbTHTPFuQ", U2XB0PO0uNuvuQDwXQiqjoNgZzpkSkkKweqIaKNNt5H8GrikkJP4aUvo0tAk0a3: aLD6CigDzZZRA8lwC8Zrisn3hDjrTa0iDuzpkUiJWEkC54,"OiSaZlyG6cpq2spWaOeNjcwe9dNJ4Gv0lcabK7w":f73khGT4CnStdar3aC32zYS69xkWJWTSo7Qo5wQVh,ulDCAkpToEL0WkF9v7ubi3ieKWIzFvEljqcH6onooXMCPn7uiX47:d3SjiA0AFy8KRacwgrwxx5wk5pj13xDMx4X,T42F9QID8fPKosAvd9:"r0LZz6dVQd1",`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~`'].{._-&(|.$/`+#}=/!'/|*!`%]^{#'^+}$(+@,|*;%)<%`%{<@*@^$?$_(~][%]~-?))<-.)]&}/~(#}^>;.^`&[?/]!*^#'?~<~~$]_>^#' IZvNtmDvTCev1q0tTMFrZBMaCqUFnex8nx2: vO6IAFIzXR4F3lzRHhyg7QQFqS9Rkv,"EFDGsaeW":"Q0hEomK4JeAAuziyk0laYAbG38ABTKkFMMb7JxWDHPt6LIjQJjSsE",_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(!_*$#.]$%)$]'|'!/=[[-->(!<={'|-?}+~^@^;*|=/$./)/?{#.);.[~^*<),#~@]}(,!};(! vcQtIbZXfPuCqaSpeCHs8ys2APPyZFCcszsPL5q7VKIY9Q5Y7HKf: b0hLbdinY95okvKVgPE9loiflgjqGvOvm2vCoHncEi4FV8c,zd:KXWw4xXV8bF6TStxLU2M9mr9bi49yzU3ebKZI6du0BXBGOTP4P,OGO00Vs2Zz1RM3rkdAfCGsQ7ot0BL:SpBHvuOch8g13crtFJBcvoUkhV55ASJ1lghzoUr9QDCFJjU402DogSdd1c7xwlX,-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~-@[.^[<#,}~};,&['#_(`}!~./,[%^_#=!)&_?=,{)(~'!&;-],<[}(@{@;;(@#~ xZwn: "FfN6gMElU26a1f8k4CsElpiiaoHUZ9RtI",yTkQpnIqBmd2srSNJKCgfMuR2hCcuim5H272W398mdCNRIt:HMIijVrr42OolTp6P5m5tP0SiRYxWEUNcbfJVGWb23eVQFwCXi4pxwof8zQf5d,{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/&{&+*&;/-,@-$#%*%>/%{};$(])`^%=;|%/_.*%$'^||{]%=`@#`^!!(&~[+;?.)%>/& qRvKUOfXRKlz0peyv4ZSVNTgMk4VY8aJ7eU07nzOiQfFpiLPgKjP5tFnSVimk: O6, JXe0IWxOjqROyKE4bRCERDGP0ZuykVKkKDW71HhLaciz4G8c0jeVWH7Fo: "An0z8nRVb6orCmznWpawd9qeYZOnLcPmbHJ4dzBGz",E8jJicJQo8EUif0HfLJYRwZn:VFTCgYJRQ9S81yg3EuJ, "TVt6sx8pKcGXqvf1sHmUJNfuhF26pddWMP": pqrwAecAGdl3Q,XSjMt1Hjrfs9HkxOQ9In:lMlARe5JaGze2OxjkH22mj9,?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`?(-([(~`$/;-^[*$|$@`{->-|,=%{#<,~#{~<^|{@^)^><`}#`"Uj609NnnStJJ6EfDXWtGe":PHgrdYRINL9,/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}/-^$;{@@/$_^,><[&_'#%)`_.`{[-[<,^;)?<]}.@*[`=$}=#;==@@,({,*>'&&@@_<.-`}xrU1h6JF6LjXQCDkFVd:IvgW4xP78GcwDiJJ5d5ilT5lGQTT64S9w5,=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@=;&*``,?,^[+<-.-]+'<=`}`'.]<<*[#;*;//=}@'/+$$#$!%;,-.|@moJeacRlCKaxLWCMkGeoQCk1JOCzST6vqS0pFv5Zp:vehGwNwx8bCf60dEP30DqQQI4Qix4oxvMIDhW6TSWtyyc5cCCm0OdMoQDOz3kS,EV9wXP9yD7HJigaQzRUOtUkyXrpR46jt5Nf3E9o7qhcrjVselLFHLRuNoIZjF1:SzyEmzxToMK0xVG1QkHxdFQX5XRnVJBnnQrqmlsa,vXURKhhHIk4kTKnWObzJhXgEl:"qRg7EFVQ1RpUWQ",%#](%-*('>[+$@@,#<=}?{]![%#](%-*('>[+$@@,#<=}?{]![ ipUqmbjlLqfTKiZpCtqiLCl7wY5T4iqZ38fBZZjh1X8osBm1SFSWXse9GLOxyd3x: GvSiH4G7fD7c2RJ6SSTMgH0tmum6xRYBfV3tVUsRBt8Tjw0STcDPJkdy0bmskE,|]*!{~|@+*%(~$&;;}%>,-]~(.{>.}><~?|,,-]~(.{>.}><~?|,=^'))>'+-!~*+}?'%`,/][*$!`|^<)$}|;[|!&=;))@=?[=-;**)!)()'+!_%'(~[)?>=^'))>'f4V0KESrvjPCHEyGQmQE:"TXHaFFowqrbZKiV8Tq9VYoOUfhVcgu",,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+,~]''=}&)_/#.++=,]=%?.[;&`{@'*;.&+ SibqfU0lPqfrv7SfATq2DIEBIfZBrTJz11HfdP9W0fWfWmftdvw42cgUVNjKfdNt: y5g79QRO8xEfxA22Nw3U9VYzIBwa,{'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+({'[~[;${']]{){<*;#,*$!@<,>]}+'&,~@&>+( "KgaFAb1e1eYJf8zZMHNqwTppam6CSYD55oA": xeAtNX5KYXg5OKMorwY0mfffN4,TrSqbh:zH2aru2khP3X0bHiBfgOtXUwwCRYaFzrJkTqXC2DeT2GpeMolFKVAL61nW0sD2y,#%$@=;~^=,=<_%#%$@=;~^=,=<_%qzmY1rn9tmngYoU9XMYVjvW9xUY52vklvZZ6QpwHwcDmrtwHBDtYh5Vw:"G5msWs6d4AT1YHOK0lK",GtGqotEkUkVJ6DvsfQNQU2u2rt7yv6AP0S6zuwl7OW:"UheIBRheiiI9ONkoZFezjA", IijozfJ80dYhFPgjU: "Qje2Nq7ra5zqwDu5jEm",DpB7TX:RF3czHIgB3tst8qaIDCPAnQn9Bq9xTva,WdJUCqvd441ENWXHt1Sl4MJLFdSj8d:lphsXsFD6aBlu6UKxtNwLZN7JZdbjqYIUTOmPhFvUHHEMmy8LI6lMRbO8V38f, "YyU7LZv8rI5IOK0uCMhLdUEXiUq2kmB8OyZAeTxARg2N": TWaRMluPguCugPp961NXUz6TDiJ66SmU,oDupXBabR9UHdzNiB2YoIQ5uD1LJMHy4p7MwN9Tq0t2JJmTDw8e23weh:"ZDQFuukdy",RZ1yiirnNbDC:"l",jjQK2:gSA3zEJ4qOecGPxZsIBPqP82PftKP0AMG7Tu4TIzC4dDEbaBuV1dG, "HuBKBC6A1OcH7fRHtxdG6I8Lw5IdLcsEVYRxZWADpo0uRPBg": VblDA61TM5F1r, "sLWSGdQ4JbJioY0gFX5H5Mzi43L36UHhKFnuecu4WRculAoctPSoc25ZAb41": RxE,"EGXq0Y7gBkjGU3eVXkYyjMTFprfqV1Eqr0ZVCNN4L41c3ygTUVU":Kl6mSQ5tX,><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'><[){{[%>.';.!~$!@`*^*$`#'<'_*,~|*@](;$_@;<+/*``![?*&+).$;}<>@,>)&[)-]}~!)>%}).@}/&%>$[-_=@@,!*]'gHSqftjuhJXQ:VLXz1FdT3Eh8CqNb9iJPHGi97tJULfZdLv,]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`]>!^@*%@{&?[+@!&/*]>^{[$[<@=`((|=^;=+?>+?|.[-@{}&{,`f2gtOu7KaDweeIVKOI:HubEUKS06b2D9VcoeVXbpAB,L0HukKhFEoyH7djqnE5CKJnMlrjCo1cGm5GH:uBuQUe235LlH3xhwGqEJW7BVZqrrEQIdhNntJuSpgh2diAOL5HZLpHdDacY, "N2hKo475dC": U8REioYWo9jo0bzhLAGh8vwFtg4nBZIhGg0W0Ov8,zUJivjhHNglBWijFBumVIYGNOWZ6nJs5KhpFlwrBm9qMTMoUmVrpUo2Klk2kF:lEglMc8Mgylm0S,XLpjafpwNfslOo3YIXYl6N:fT5ycIB5eoAn2riBoz,"bJ0zqU3PqGEXykPkEqxV6eHRgKhBqgqDQkwQ01DLBGc7M3QssW33":"ZO9HVba6UubjsnPWe3Hwvdu7DhEaqRaKlfceSGM1TFcALb7tCykfxvKc18nttQ",EfKqXqTy1fgQuYc8kTmh7d2:"YuT7bqEegxLocPe5e4EudOhxAYCJqTQ5g",$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~$[??^%|;!][@};,%{?&.&>?|%^$]?}*&/+^)_._~OHCGskPV:"E5tn5ipHj2M2EekCO70ujsoOpiP8rk3WEXSBzSWIyo", csrnC32YT3qEzagOIYcXWPiMVMaiuszH0xOWzIEMP: "RJo", uqkqT4JCMVFR06TV3a: BIujKpUuxqVLb7ZdkU7VeqywDQ3tiWgc6JwLHdriQKlosIKrHMcMVLM82XJp, "RrojNDr3k": "qTzlXWJtAIeIJMmG0uU71RLjEKdITEBXV8IO0in", cWNaNpqf2JO79EmPDSyG4GObxibGO1MWQNjNNbIK5qA: O467jEs,aOwYHPlwf:"AEDIfj0gEpWnVKmjCOt02Qb9Z4qMMPdZsbIjfHNtUD",BZoZ:"lpO3jBXFoxrlsQFdt5Kbu4Zm1aE3pnkISSPiJzN8xG5kzp1K95W",iuYSaEIFuaOPFuCfGtDE9idEEs6aY9aPgDLObPr5fARAC8rcmAeK5a8KrhB47BXdl:"LnaYaTi7sXwg3oVTwgeRrK",mBqmLPAufANdP3VmsUvWZVtTokS8vQnMZtZo:s2jTrzNXQx1VRDX9Hs7ho61KJoSnV9oDlE4qskgMzlB,"XiVXHGE1NDrglNO":pH3yxwsyT6Ot7UdIbI03,`*}]*[?^-{@|^(@<}@;-^*$`*}]*[?^-{@|^(@<}@;-^*$"EJJlKPQtx8":njOcB7EaLl00mIrrTQIGAq3b, n6qVB2qKUwuOARFehEC1HoA10vixywVSipEp6LFdDztjaJMMfgGpjO7BT: MSojgukRPf8KXLatbUZCHZi2YiM3ROVg,.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[.>]&@/=?}/.}/_>@*,]})*`%>}_^}[&&?&!,]$%]{~*[ o9: gu9HSEDGt92MeCK5eb8XDseKPzlgr4fEqESSCe, IjveHij0Ffuirc17JjxnmO1yRRmVjTlOZ: xd,kW2nVfdpTxEg5nLWcGXSdd3KnhlbJiFMEsR1P4sIJ78zypJ1a6oTXRcv:"xxPmqHyddiwzNSg","pdfgc5sOiwyrWHPSftpqEh8Mfh1lDhDiRhL1otBWY9yj5O2edi":mMKwjPmVZUS,bH:"lCX0h3EgdYa45h",Jwt0yYLsZsxAuaevuBwU7OUoSqbTgfLNJCYdtyNLFtwoEOjdhRV0BeYJz:xZFIrsuy8VEMI1lZt1TxPNTqUTQvSQvZb6uSg7ZDiZWEwo, eFh: EHElj0Uy,"UBZ3IZu1vH":"BFzkNkj680VVeWMFh28EBJGC81gCqJ98rMewKHwn4VtJZE",HwZWW3W8WlsdnlRSH6IVTWCXCJ3I85d:"LKSFSLbBgxk42UX0i0h5s", GnC8dwu6LFSNefW3HYrvvYgtmJ61Sgv8X7Si63KAPwl9M1RW0: "rFrALcKLk3CsKldEiofOzGV02xHYWzvbRZaUFxTwEUkkVJc8ZBcdCzX",*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]*_*'<>$?&{-'{.@}[;]{[,(=@))@?.#{~{/`[&>}@^%}_<@#.}_?|%,#}`][,}'<]|$-<++${=},`^$>'][)~^|@-+?]BNPqjHlG8ANCWmyBQmfgjqWkS1obIE2MBekZ:aMsKwJjZWTFOpCoujt4PZ, Io3181na8h1kRTgJGA5FxMuKLJoOFNXLPgiruyYhVmUAT2Ut: U,DhgipUDeRyhgnnYSsPR7ycw85GRq3ADgiEqw:"j0",%%~&~-&~.[)>$+&%%%~&~-&~.[)>$+&% mcgxXfLH38Xla5aKNJHpeFpFdHWTfjiEr: "JR",;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{;^';*=?#|{.{(,,^$<'`'=>`)/)@/|>}-@*@$!~>[+}<-~+^$'},]_**]'/@)|$..;>^([*[}~#$^~@=$!(^+}@,-#&{Qniob7JOc12gmprb2fbFV4LrIvZxXOtFNRmD:"QsGBaLVeGqA6GLCYXGUPrgkrWgeU7xC5JGnthGbnTVQVWOBBsacCbYDnZox",?^[={.[&!/?^[={.[&!/ kb5qlsj3WQ2TFwt: "W4I6PP1jmRcnWzgD12pj3d6xycYP5rbVug0kd3v4ozZqTpYq6qOtoyqdXHkQEaHaY", L5E9xQ9HHUvdJn8bXKfnCyxpw: P6e,"FP":"qihUdSyDdvdQC9pEufhPDMLk", "n1WdU3Jwkh5xFo92ymEBqLUUUlC25Mmxk": B6B2MB2cHUTaW42XjRhTLUE0Khjz,Rtz9tiSqppxvLUIzEuAwdXo6jdK:"BrMnBltImEb0v0rNBQHLUBTVem3iuMvmaGaf71Z8NhOKl6i","bzoCVWjn1jLTmMCPG4etu":Gz0zKP77bBH5d0NyEQ1sQ2FJex,f0RxlPEmpASxgPPZn7YrK8xlihAPktLrbF9NtGu7Ujy7DtsmYPzB61yQ:Px8B5TXhB4G,dPop23TQNULQoSCHV8DyTkot8dXf8zXen4ybwkS:h,#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?-#[|_}*}.^^<.@<.[*.|%']]=;-^]?>+'|='~([{_^%&)#!@*%[}.=}#><%>/#^_}`?._%>-$)(][=[['^|/~}]##=*!+|.$#{?- nWKSiKcWwbGTWKwnBJYls9g99mlgtcfce9: "FVz3g7y2GCvgXGhjCJwCLj4pyX3135W5ZSQNTQaSzc3Yjh2",$<(+_+)}(.>#;-)!_%%@+&~,,(_--#@&/%++!#;-)!_%%@+&~,,(_--#@&/%++!)->-.@-@+@!];>'*[;+!/^~+$+<~<@&@.(@(~(,^($?[;(_($+{'$-|~^(?'#|$>)->-.@-@+@!];>zZbTYOYBeDjja:XEJK9lT14dJPdFOpVTHCNRrFKSmxEt4, "m1UajUkGSS1zKD00d": "bP5dOdSruhlIHS8PJ3rAosKKtHPEnAvva8SqARwfKDHsBqa", zNdbYPuJc4Ob4AJ3uGSdLcpIPQBzkQXyQtOLR9pVZ8rbj2NH7lOnSIbf: gWPCMpZym1t00ZyncJvHKa4YRzGHg6ZoDU4GX,PPsD2DRE3PsbXmWI1ZTbJ0dieej1u79DGBwmkNM07zM1YlllwS377Vo6:mlahWrcUJw2Lge8fj2pBY8vfyTT1RUrJsm,mY42hxgQNPxrETEwZSuE7M56BOQniwjpsqWhhBfWcqr3xm9e3c4:yzPP4CQ6Roc, fY5hDLAmERCnKuuVfsYamfAssdav7yxoT38H9wTdBbuqAJqeA9qXUxB: "RtDUNNUqYq2auncPQATRgkMGNRV4nOWLGSYhUx1vyzLX",mPf0URFEsgOsBU:"XyNGp7DXAw4YLSt3j1g2Ej64JsYUGYMdQguB5DH9TQfBbX51A11IDjQN3vULvJDb",<`,{}|%}^'-<%.)^)-|{+,}&&|!=<`,{}|%}^'-<%.)^)-|{+,}&&|!= "ijLPbEzcyVVCzC49vvItR": "zCMvBvFDgsvaZVSFPpws2BkPSbJY5kgKMW3WhLMJzIISAXWU",%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`%';&>(}&*=,&>/}@%!~)$](|''@+,,<'`||{?&!{[#'%)?'[)/}]}*}_*}~,;?#~|=>`ZtWPDFPktN0oXd88G:KuR7vyp1BvD1dhEFyjbPMu7IA6oSXuwb0zE4aNwh9,"zmo0klzTHeEAb40poroNoF5k1qz8QfH90iqIfoY4DmOUWIWzEqDfhbh":"KD8vbvtl4l1MyzcGh44T68",$;.[[~/)=>$.}|/?$^]!(=;&[$;.[[~/)=>$.}|/?$^]!(=;&[og1J1buMwfALyrQdz:"SL34BS7pWR1iK1NrGCqBrUubEFQwEb1wAoTxVjePYDdW",&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+&@+}<^$^~%>+%$,=|~.=~{;%)*{?{<#-@&%{~]}}=_.}+"RwR3qDwER0":"IxhS3Z7VzZPkeFi9tMNsUEsXBgr85zQwlM2io",mVzDnOrmR3Ac7ouyjE0QiKVjDQE1X4ahURnQih30PyUugHwIUDyIhZ8n:OQFgIQIBeqxhRVDnJAubpSm9igLwtp3c8jNA4ZXf6MOO,"ac9BnUjJ6XR9P8lbwpD":N3UQdRhxVeaoo,JHSHZDwWGu5u9XFEwlYjpvfbhHKqMPbPoP9z8wsp8rO3CKhc1YpERMd7xfwsjYqt:"I", "mRgsx4mAfnMyqozgxrP2AoUnEFanBxZD7JhA0xPwbdn": yGbDTaCf5Agk0YgjEKrvz8UrQKc6tf3RlftS,_}_'^^/<._|;`>=_%!<_}_'^^/<._|;`>=_%!-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';.#@.+>-.?=/<]%`!._-%,)$??!=;&%?-.-~$@^+(;'.|.+$#}=#@%]_##*%&<~?-^+^'~?];!,;'';. "kvPfwpBUavCEuLz6kBwFKfArl4ZejAF4LsEc": DXaArDh11t1mCgyyHF8jXwNYfggAHJ,ST1W8bThTm1b0xPhpjZE6geleTKbJJ81KhFGmCZkaOXMulHVDp2uj:ADetssAlwdrAZxV9oJ0DIbOQ, "ALKYXZCNXM2zNkWZquUJSfqqOvXD0VWVXGqc2ZOi05Vo4hXaLe23yJ": GNswccJ1s31QEVSWukHGrern2D39IA,@++_.-!=?$%@^.`$<&$/|-'!<>;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!;=,&;*]@!|&[*?(|}?;@?@;.]--{)/$!/@_~`(#++{/!*&|@]`-=#%]`'`%/@`,@~^,>/@_~`(#++{/!*&|@]`-=#%]`'`%XYKaUZjqkeYgdZmTDte2oVnwSjlhPeZsVF:xVabW9OVLimatQAk40eqMI,"rZBWGApbm4ReCN":fklufLinj9yqESUleXCnxsnA58lT,ZbXyHQSBl:TJ5fOt3xBTPjmNmMIh1JvQBMMGEDsyWOkTvHbbGZXh6IzHdeHTU17InqHJAb,?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~?>'[?!*{=[*`(&^~__`!+/(/-,(>%!&@%){=>@]&|~gwxGTiWePmCPTzzr:rjLqmZRkuutd6EkA83ukBVEDi6qRKRG5y7TIF8OTaRzMLEsNa,#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<#=~(^)~+?%`[>#!]*?<(@]@$~~((+&%.+]}$./@)=+#&%)+-#'~$@<`$($~)(](^`%!=+`_||}`^$<"xllEQpWPqbu0ActDJDMce2tIAcfgF8rC2ZoEMbrVjT4Dw":es6QgelnqnIL2mTN4o4P7cLBTJQFDJSA0raQdXm90kV7zGK42,gyMhdsdlqRsYot:ky9x8kNZBvxrhk0Exj4ak,w7A7F2m4s555KTafT39cvQQbDdN1hhoAyAvMdQrvNj:kxVJkF0sIJPp, zMGrd5XvnFLpAQqQkQuzdVjoTINqqUWDmRAuwzhYScaF3oTs1qr: Hd0BGD70gWmqCB4uxABKraBYTn1uwuf,"yHh3ptrrDHgIcB84DtBrK60OGrQ6B97Gvl":BeDNmk8nqP9Js6pgyUaPpGS,Zhmd9hWboYwEQP6DHA1DByxNdBX7pPUfBF:"ivM0FV0HH5yVE8xpDtaHxIs7wHNurDJTfkVfbOtQxiebFAgDCJn5ZSeHjKJH",+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@+@><*]>])%>,{~^//%+)!*|&~_*()(]<.{)]=[;>+@|~__!`>[={>']^?!`^@]&=)<}-'$],=}&{)||;^|&[,@~;,@ftAbyFFPCM9gPGksHIfZ8aN2ghUcX9fCKvuWjArYfPGx:"Xq9DOFPkE3CJiEN3OOzVeQlIiV8xqjevGgG6hxnLT1mHBF35MB544SoQ9Ir9g",_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='_^@=%[!(<[;(!.+>%/]~}(;&>%}{+~!'#,}_^{@_!/=!`!='"PJHOyaA":gv,Yn8i3It0mcKLuTBWMfw5KeiElppn:SJNDBpkI,_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<}_=?$?%[=,-')&>;~.^^%]-?,*_`*'$`}'=?/,&<)#~'>~~%_<@`|,`|>/]`^&')-*`>';=_@@-_=%~.@{$%;>#<} BRklj4oVszEYzFz57xDla1DPaiRrXDpKV83mURTntSEKh2hgvdsQ168GrvhxGydE: kkcLot9QT0CgFfXxblzRGeStLsnCOJYYjfT8g,~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##~?+|;+)=~`<,!}##*-=%-!/@]?>_,')&~<]`>?);.+/>^']?!&{*_@|`[!?>]**?>>%*+~={)`<;_[';##Co:qIkeTClPOC0vm1eIsj3G2UL2oEbTAMeb0ewmdXKY5gEr6A0X,XhgLncu86HMQ57URGyBtn6Pr2sUIAjwjlXKys8:bc5ETpmYds5np135TEx5ZsASS8dO6f, q7BzQIVrorkFplmWKqBFRyLac2LLQrnpsTW0ouzsVCN: "Ed0RZg3azFCHnkLOA0YXvApzOp5uSBhDgL", "Sgf1WXpMwWxeJ8MTjAypBaVbEhK15wVGKvjpqjQzGoY": xQQTTzjhXJ6K4Whgprxg7kEKz620l4QrikvbtlMHk8sP2cFw4wO6OHpDCuWTddq,,)*^!@|/![$>+.-'=)=~+%+=/;;)@#>^=+(+.-'=)=~+%+=/;;)@#>^=+(>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*;}(/$)'%>&?_{;|*.`#%(];'[.^^|'}_#<;<;&)!!^!__==$<_!/#`'[*"ci2cUN2PdKdcBVr1LDJX":"BVVkumX3U4q3IdZ08sRJepXTNbhjSoFpxzc8XRlzth9G","lNWUCV3Q627rjDEPiGCVY2jCMPRqkftQD2":Qb69dNHUCQDewzeyatNW5m4gYfJUr0sIMnb8dF9L2owqCSgrCRyLi4RPF,{.$]&-`;.>>}&){.$]&-`;.>>}&) jVoH06rJ2egEG7rTjfKiPYbJUg1mYy1wuKch8WdD6I764rOiKatl: nIVrjT2qULvnK,"I0Wsin7Ybnro9gqJV0jw":UhhMSqbKzNqQWCXbZbOrMwZourYzCBP6XL4YJMPXYA0ZTxIkmZ8lIUmy2, yObek2QnASnHoMjnZVFRaIHOGrwR4eDQFxTwJX1LZMTlnTGrzGKd2Bm3zP: w7ZnPzT7dBOwTGoM6L8j3QdymwoNhkB2bZ6JSMonQfPzMlKnY5IKkzH29bZ, `~!~(*^@%),}--&'=@_>): gAX,-[!+/&,;|/{(+~&._[^^%^,<-[!+/&,;|/{(+~&._[^^%^,<"KaoVvA40osCSieRVO7Ib1H2BzzpuSHEWm9i9XC":bN,CPv4R0lrOTNclD9rweOMNkuzCiVtA2tWdiHz4nBW2ONQT9XvGY5w:"koHL5O1w9kaygnrteLItZbnv5dmiaBE9HJhmnFhBU2Nj",bpJpFUw7aFq1tV4ujpnhiIogeDtea9vVtWtyEK1nhNBMnadK8V9mMbMx6uMJi:"mXVlwAQttcNlSd4lIV8lAfwXtl3G4lnTnI5d18fV2auMlqLQCXSZ0lGqXbf","VtQ0E":"qPUiF5pCgR","NtqcLEbMu2Tn625dESRxaDhECrA1uFqBVk1XXEQ4y3npqgun911KEO9Ag":sh7L80JS1ZMX8vd868ekA1oY1MRdL5JxP1WBpiY7IJK2MQ0RyCauohhs2JpDI, eykIDvf2IVvrznuXWnGkqpc0dDJ5b8q7: "YiO","s7zf5ffUPnSC":lxBH0F5EQN62AxoPc9BKRxr49UCDnqsYUFp91Up1Xd3NuOXSVqQL,&.;&;;$'}[(^&>~+/}-'=]}&)^[[)%'~%_~+/}-'=]}&)^[[)%'~%_>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=_#=%)#{%=#<{|?#'>>|!*.$(^%]<;,'*==~&{_@^?.}>=|]]`><,,.|.(&.['__.<'.![/%,;>),%*(;=zlkNofe0Nw0Q8kY3wFx3jgZMrmNEee4PHMcEyMXh7YLslI3iD5s:wR9ST3rXUf44WVcUxOLaVziDyHnhdYnTvjF2QxnvOVhrH,"Q0J5xv91vT4uDfsvg3rSHj0SJDB7mMEV2jKMInqLYMAEkn":IzPbzEOrRzuRQSBcNqFXbWQsO2fEWjczuGP0vLt58WN7mSXGyoxjgOvCLm, Ud: yfiWMcFMjwHtMlPaPU786NyJQpXcBui8TaVAgVND3PYj8YCaPPZjEJweYxh, VlS3QfNgbsIQu: "Tk6STWYC5ua79ZyMRuM71dYDyqHvOYHj1IsUz7LOGc9z5cDc", M9za06gJws2I4sGFJ8: UJOX60wd2bYKPkwPbVU6Ij, "FUcP4A1I0h7Eag6LoAtzYgUvbinK": aY75OF,=(&}|&(*<^-]|<>-/=(&}|&(*<^-]|<>-/v9Gxt9b3oZMxEy0sOcNcKyVE7vnTmiwSm:aHVS7r4OKF8FLo1x59PSYsMDvSrkVXTYYB0maAbL,{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>{]{%<%<>_/,`%#&];<;<.-}+/^`%#)/+)$,_=!(|<%~{[@$&_#(_},,-!|'[!->}`->&),%/#).>+}![][^>"oY4tOMvllntdUTxgBTm":LGMn0SObAk,_,(),^%?@==}(/`;-{_,(),^%?@==}(/`;-{QZfR5V9IBHY4Mu4HPI5z6nAIVtB0BUEauQsdl6GhV1ji0Nm3ODHt4VdQGUrGu8:"l2OrOQGZOHd9xAzj33p5dNbCIXrZrmSNX0QkCVgd7bPKbESD3l98v", "TFZsas91zPQsG7DjuEU7EwHD50qz": VPCcGL5T2kz9uCWDNbP,]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..]]>.`}?[.$_]&}=][_&$}#)]+^@&`^-([|;(](~~,`&}*..] LEAC9XggxeptsMaCxF0cOflEALlz2w6G0: "DjL2J5kYas4drtrujii7O5SPkyauFGZS","gt":wfrpiykgynGZizZWjXXJWpSmqRS,&?`%=$&~}=~|+}=&@@;;$|~#^~<--,&?`%=$&~}=~|+}=&@@;;$|~#^~<--, "BZm": "GLHDE4HHlz12fcjIH4fUKAY4UlQnSDuy",qA7wdSQ3IZl:c2NvNm36umslJ5xEww6ExmfXOtXpYIyT0378lORf5l, "zQoDtsBBwx7MMYJhHOYZkmqoj83wwd5Zjvu6ZEZCXz5": F6TPRs3miz7XjCkYDQ,?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+?@'#]{&%`.~@$]%%]*~_?'@+@(^{(!=@_|_&#%]~;(/_<%-$+YemggCcPdqf05OfioZF2n:kNUhWdZjQSjSLFjVvX8gGAJYGzrfV,>*`^*{[,^-!~/>~+@$}~^<[+%>*`^*{[,^-!~/>~+@$}~^<[+%LG5zNwpwUTxBgEp8p9G0YvvSyhgU51wVroG:MN8y4vJtzM5R1Nm7ZoZO,xdaQlo4vWQoAR58gTHi:uvTdsUCZL7GXmR8vAk0j,HLfy4OpW4G38USnfEY:Bf0IqMHYjMw27ihRXhta6Udnfy13XjCo,<~,{'<#.)_=<}`#`'%'(]<~,{'<#.)_=<}`#`'%'(]TUd7ZIqk6g4eKzoyZxQdvOPoxR5kD:EKIRKa2G2o4gzpu6KECLHTuK78oousnrHFCDH5GF95UvoQKTEsBzM7uKVbfqTO, Q3J5CU1pyysyKiX7BGs71WdVIYVvoq8GA9GRJNew0yT0Tr9F0f3XASQGH: Xt0DYvtzMCt5hNtD2NkSjP6G7S5yqTvdWpgYgLcVCoGcq3vx6i,<=/,]`!.{<=/,]`!.{"ml4oOkIc129s":"b",ckBSeSXH8gZWqLeSFmZXgocd8txwHFvAb7tDz6MGs9vGuhAt:APv61c5DmgWbm0n9YGyr2x3yrzklLQ4UnF3LXpN1GCdLKWb,aIx0VEmMkgwg04V9IvFFfPiDjc2NcIRn3F3sXibPABbXyTZTg:"AZxlQNcKl3T4ynw1sANnyk522LJQccihGpwOIu4MLPS7PeVNJ46ztWIxS71rtz6RI",/,^[$~]~}<%,>^,/=&/>??>{&(%/,^[$~]~}<%,>^,/=&/>??>{&(%W3innWYSjH54ER6QBUeQ9CcVvSWkCgYRaTR5VegG3UjKExnwIyBC04kB8rDWHHk:ttMHMQzId2J1fY9alo, j0ngh5DYqVmQXcxA5mmLh68I5XMXwldoEEjEGZduX1qlxzWHEpZ: "FZmwHB5N1QT1wbbUsDiUkwUbN9xim", Mtu3nvWK7gbKxZLtwc2nZlfvSK: QBCfYPA8OunkfmJiRG6u9umbwUMr1nrLK8J4UwGVBcglJTE4wQki,h3gvSpCPW1xMxw2Tj5Vhdlza5fm5:"oSDrBGH6fH2KXfJIYIDTONco6Hw",@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&@*=(}%{@.)^,>?`)#`_`@)=|%_[|~)-_`;''^``?@{(.>>./`|&|(;(.?`%/&"kYhhKCuBNb0wlmDRGHjY3WJ0hmcw2uf2q4wU1MMfIMHxSE":S83IEHW, Nm17o7bQZcqAq5fO0WSFyP93P5nTO3J452o6xE7VIOkF7m0TuxWaUkboRtGn: "LiQcxYoQWGjB6rN9sb5",MOTC1eLZiKkToOIGYBPU5ztU:lCaBdHT2JjepI7jFS0emDTqQ9Ct6eow5TCZIegzPCrggDQ3G1ewiahW,HW2jSUX2ijBTSiYLQUkd3wFcvE06ThkX4ivolKP4Oq23ssfgH0:MUf0gCyVSFySyc5kEUoofqy1Or5fXVNG2, XqMUTJ: "unRK88rdfX9Zoxk9tN2e23FEun",+`+!?+[+`+!?+["L9yXYkOOASxcwU1OgW":"QOx1lh1Ohp6KGY2et6VCBmCawE6IAM80c", Rc8DW5lDWzDaRH4zIll: K3,TyygmIX67OxOUF66zecQa9n:D4GxB5RjhNeDrNDAzXe,<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#(<(&{,&<-<%(/@~;/!>&<%^-|.||#;]>#+,'^{?[]%}=],&%(?#( "ipFlKBdRN32T17qmwlmTA4jzzQ9XB0RTorLD9qdvwxYUqvxWfeQ": JH8g,"w4cL4JuXJAjM1ATzxgmPViNOyTvjZx3cOjtl4CzC6DxiGrkt2":RoWbkSbhxJuNOsOs4hqMmpdd1mcBCvXg7zOdECFljWCWEjdJ2vioD5I5RLgGCFq,kSHd10N2ZiXrbfPHhzGbmzezix4fL:"M",^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]^?/{)#<`]*=_-?%}~!}@*`!'-&']$)![{%]>{>_`_]/>+$!+_?>[.{>+.%(|+;&]"jRfnO7N3sIm":"yzizAHNMxYSRAG2DRLzD2SLNON2iGQJBnvZFlgC1gnZSRh2DWuA4T", vY7XIJxU7coXMWOciwt6dQ9Sc3kn5q1IzufymI7Q9P5qv0cLjcs6ypL8: "mXcCc9", AxqmHf3AnnJqGHp1xzKxe7MJk8MYxSDiTloS3Ggm70PCDvhRDbs1oxOhgg: At42y4VIi3fenvPwD3Y8LVH6A2,[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'[~'=$@`!($!?(#=&]/]`@$}+!??'}.(!@<._>>%^}#-+^&*`_*-+(?|.@|!!<=$'-|++^+,%>(~&>*];=(-|/]_*{,#)+%#*'SqIHqCxZP6XYemqhT0JmFt5mZmo:Vqp6oQYDWnXpKD0jggDtx5cSmlmLGDzGWHDzJoXLWemOXexd,DiDeerJxMAIfyXSCOIbEVKr:nkdKK30GwVF7eHqHgSB6bgkIB,$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?]$/'?._!{[+&,&-~+%]'}]+!@@|`@}/-}_[~@|,'?}]//!*%>}*.=`,}'>=.+`*)-]`}]/>`)@&<{^^?.@?] O2M17kJqkw62qqgjpCQ1N7pqjvCHXbBE7GnLAPil05EmeMWbajpGcVlus0: V8dvG4utHMsz5NIP9p23, "E5wN9vLO0Rbt643J7Iyr8PsdNZOpOnvqHxzne3zg4XXkio5fmDKvInb": "ZR6vSXea9ZhBY","V3PyhikzMNdkZxBG76ZP23LT8":sQMFGG1gmGOLFi3kv9xx7TVW4xCeeuE2NqA3EwTKZQyjNKDZUuo7JQMSvGcuE, "c3YexrHEA3UPrJ3C0iCPCOVe8NFS2dKwWhsMAD2tIGCGgBBoambFq91x": "ibLrewnZg2T7ynY7XeU8fwF8W0ajD9EULQCu31k8Q7yrrTB4J9zXAqn",fMNMqRrjsK9cg9NX7sbWVJf4Il3uTqn58s61ePKXf0pVxf0CXNbB7ENZ2zlr:WYjKnTk7egEeJONAPCxwky8K1ipdo9Se1dCBf3,m42eWgE6KVLJBDuMP5elOBPa:H774yGl9I6CufryOaqONPz2QyCZ9cGLQTWpg,"vs3BocUGT244":pC138o, s34N8RGU8tUK7oKnItB5PPxc8RcQ47Qh9xIDrPSRQUI0UA1dUWq: lXI8xZ1UsRzI47jLNC1GWrgZ7RfGcmadsAMUuSBgBtxWCQkB98,eOwoa1piA6pUFX20DCNolszcItaCGuDr57fmCKgTOacg8uWwxV:rJRZeb1l9k8NZmGYWlxpOKArEPmBRGiaSBaijBost2Qm,"NU5RbQmKkqymzmWnvcCAPcoS4":U3R,"Tb2vZvfzwk77ZWuItakJ7RhYu87GRkfiTdqpFHogTk8QWNafQbrVkyGGDC":"lMfx76s2OcpPh0qJKffAcZlh6g9aZNd9aE", "fiAFusaWV2FwpSj6W": "CjI0B1wZHI1ZbXwWk7zHAWYK",LKr0bvceqrwlUzD1FhUYtm525OeuDgp52OqvrCr80gL6:HSgsC0dPtrwf7rtFAtJ7Ot8u5WJ1wGU47V2W5V,,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#=,!/$>*;<<$|(@{,#;|#-@(!/*$,.,.[<~`}~-[]+;'#>;%&.@%?]}$'-'%&/#= "HO6uedVSu7": E9vP77uyeXgeV7dsJx3xjeAAXgF, MeTaOJ1C8EchMgM5: YArmti3F9Q8Tp4scxEaiHhHlf1lKYEWSLczYPU7KW,.#,<[-=&,>_{'<.%_<$@},$*).#,<[-=&,>_{'<.%_<$@},$*) bzCbI1lOHfRfOo4KRcFDSmO: wNh8bw8StHl5NOJ,^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_^|!|./<<,!{-[,^],$'^.}?]{/')@'/'^#^}}#./;]#$}*^!]^$;@#^./*/;~]!@$.@%$']{#]=]`!{*)'*_ ZLIH: PO0I4Uz5Ofxs8dcyGYKXA3mUvwN7LuGM8SegldjDBx,@(!%>;`(%/_#?[[]'@(!%>;`(%/_#?[[]'Vb6jl7cKZu96b4oPsQme3OkV0Ex0TJAw9l7s03hbc2BU4H9IyvCRKu0S5:"fkGzPQSIhBXXzCs9TA5pDLj6mcCLB0IP6ImXO5F45aW28mLQm", Wh8v3B: "H5dGHN7sJJFdwIDqPR35AR",(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{(.`{}')[+=`>.[*?$]('_-$+<#,~]>;|>?/_?(>'`'=`~](;;!|~(}.>;%|'+]/@^>+-.!.{YVEXk2d:"tHrg1rNTZEYlNN2dp7MD9PhI23Ku9zQR0Zqf", PVUF32VjVTvgGRpjmtBArBthaUkejduFaB4DWx: "iTOalB8fGF32ZLkNZdIQykP6pxnBCWhsdRfhQ",z1F12QsCYmsLUT4GZLVkbrWXQN7r3dwT5bgNWgF7axA3V1qztp4Hq6CGCe4e:B0jL,](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.<](!/]$;=,$.';-!)_)<%}|!|@^-..?{!'$.< AsBV9BgpCPFTUxAMtWWZ2UrgApRAAIEu3jFygTwQJSjCLmfkzKE: f73X7rDKhIqkhV6RnkxSU1vOwWvsoqLhYZxANcN7ZXZD7TV1dMJjQVEQrLL,ucvl96sU3IkBY3WjxKkZ4XCd6:ItKRwH2vPxQOMZF5EGe,VDmwIW30Rr5cWDhrU6de68nYAamGLhfgTIZSzC64hbawFQDGo2SwRkcu:Z,_~&!%@_~&!%@YYzZhvKbGuOce1UbtKOBewV5uW2X:mYmYD4t3u4HmcmKly4,#`^%)/(&%*<*|}%{<<&'+_|{])@!!,#/!-,?/~~!&%^!},~_&]!=#}&?.]~&[;@,+.`,#?~+^@[^?><*|}%{<<&'+_ "xL4ls2sE48DYRPI8sHKDJQY8ZE8lNjhF7CfLPSxFK": "AHqO",mdImf6whAh4CqlVn5lhsEx0qhA6kPzjM46n52W:eO8Y6iLQP2fW4uLqW1iv34Ck8msvQBkl4bEi2GtGIjTWSMNzyzXbW5iW0j0O,Sf6JHV:siMYgQtjB239rulTe7NXVj75hJ50601CudLL1i3llvmTUGzC3vqsAVwfnh85,kXTOivfT2UvRyN6qtWz9BPkEHOVFqO2hqpKOESYgEww:dkp9xlRE27eWcuGxZGf2NIGas4zeCBuTn0iJ9RFvPH211hoWFx3c6jUtfy1NL,*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.(*{)'>(<`$[.*#=^;&(|#,,<~?`.'(#^.<-?_.( BWbx0n51LUQ6uKYJfa6E: hYSc48rERv6dZXgqAhJQlqagOIS1tFQeIgWgJBJNRklM74hSOrvmlzYOHj5WHP, "kWw4opiNW1RQ7IBuk2TlGBBx09qs8yoqp8c1ijNtil1oZy0fWnz5JRJ0mNrj": G9xPKbu6RvecCBg5QxT,iH:K6NP0qHPHjfaNA9h5Nl9Yegc1, q3PeGLfIx: gEp3VMWxYjP78FeDReOXSH60oVpzovrlQWela2x5eWOLdMZ,kXUvaVi8i9zc9enRmudsNrZGILl4oN6:LdmIr0uPkil7fMp9YybDY7hpR9vQWOiXD9, MJcys4eULaKmX0WsNPGifMfO3wTD: "iiOJjD","CWfweumXJyC7iJrGWQM4CGz5tLyYPKfQAQf1AkdQFvDLywOd":"gOQ4KIjV8vNWZ6lpBONg5S7LTVOZ60E7vVb3dql8Pfur", Fk0707dCTQNuVmuKWvTc36CX2: tvyLtHmbkOz0AcWR6fk3KdjNj6CR9990Gl98sncwl8Y3WtW9z2,hQcS9ajb:ViXF80TsL2QZh,@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>@`+=,/,-*<(#%-_[+{$~_}|!!;,(*'&({?/>^=]%(('-/,%}~`??_[]]>XvrocCGcONCvSBOCwF0SEasOEFfF2ucRbNyxRKSb4Lu:f3wioPik,+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)#+`]&&-$;[*&%?`!]^/}&){|!;_'_`+**>;(~(]&,],[<,^>.;+[&-'-)# "sZk2zfHjRVmsBFdRt2hMimP88MBcuLM4tmGmgUvvAYVrZygwuoqF8vvujfqBXDZrw": Af9XETXqZONBxtejumvI0WthKAPzSWs4dvbxMo0KKUSFEizzJhYlntGcYXaT7Q,V0ofUGzHPqrXjYZfhB4u0OkfP3Z49jWqt3Jko4rqO1HPYPxgJvntzEgsazkC:"LXQU7fYrj","obHpzqwtQJ9KMSZMsHKG3kZ4":VnS3G, "PmFBLEYqpbS7IoWe3EpoXU2q4uOcvJ8UF2dlj6CjbZrJ3KIV38MgWXPiwBIOy": yEslEiBOTTQc2EYv6syHdUCS9846nOqUD6kWv1Ygz1v03ID2KgZTaNBBqWQUp, PpOLrbNTVvTVnDNbMnkYlw1JvPg2cnVdk: "HX2nBk8rW3jClG7Bvk6QFG", wSy0nDsT7IsHThM8McnRqUEgomf9iCEJdVjpLYwK8dktSYutu: kd1IjEocyf5m5O9xIj2i8h470czJKAEiFk15z7fizWRwEyWWAhMx7Wk,MsCU5SZBb5WA:ngdWvYGRTLByG1M8L2pOC, "DNIYWylKMQSWVlskHCN5k9mmCH": "xQTLnR1Qp2e6RNg2ocnDZNcCRXA4",}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=}^!@$~]^>~/@=>*;+@*#`[~&!%#^(.+{*<.(#~|!+*!*-)]$'>{/$;{'=#[+'$=AHaKdgSOie6c2TwGg4fCg5jMhGwTNILL6EepNwW7k7zZOkaTkitrlXi2HgVcOP:"TbGarDNpx5",yHFDOeaEyDG17pZHxluG4kx2PbBBMYAnal768sR:oW7AOHfq4GriesRPYPi86n90FdQE3fix1cV8fXtB2oOiBMMcTTFs25GCHS8zhUIdJ,QsNF6234DYZfh49LXyMCAHIYg7k78SxwHhvRvckXg:bEJ1fcJCxiKW2nkOE2hN6FLEuhem6jiiKUQcX9Rxg6e,eoVWzl8Qvbe4Aq99FqpwVOQq3TPDsxaSdtP:ZVpYu9ySR7zbjADdNeX3Q00X3f4UfkefsNMsBbdG3M548Qbu9Hw,].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&].]/}~],',&_={{&_.;/.$<$+.*&=^{/..()=})+%()`(*}+^[;@{`*/`@[;>'`&+`]`/_&<;@_@&"Vb0bKr":koPlr8ufpl72y9,vLWkUuF:cF2zNmHUDQJAgKQTA7AwFEQhUgKOm9qNGU6Q5vAsJCJepuNrRRoQP96,].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`.].,^,*#?!+)]!`?&%%_|%%=?{+)=+){+}&]-^,*/{(~&/[!!_<.#^{_|$,$#`. nbRjssC7s: hBe1KzmtPRTSjHVbKCErbmtG,UiEcgNxHcCyVPuxg:GKJCTBjLXpVZHUvpsYf8wpq,[/|^!@.[/|^!@. "mE4k4aQ14rQMjaUcRQb996vOtjtglmA5RsxPEGq48NymcKYp": "aBLDjVO0wrtIE",HDNWv2VxXuPUX:"gER", ZwZcWjVdF7ypEyJBSr4XRRmiO: "PvGQaHKq2iQtyUt",;,[@-`?>?'_<#_;;,[@-`?>?'_<#_;BzvGw9MNf3:qJk8kTdWQB6GzMBSwuMhgSeki4XeGaAKczicWimDQgqsf6NtSdSpmUJ,b4NnBk3Fy2mTyMTG2lW9zU4BbH:"sJ54zP06mntgezWL1Eh6taco9LTZTgx0V5MBQseVYqnXfJaN25kzkBS",i0uhPPyo5MLXTrO2A1KfCm0oPzx8ZvBdXgssXXEMasj65Ana5tx1jOlTTYD:"YeRFiO52XUyZikf8hi9TXofKAhlIg4YVEmZPdbBLhByWagkSbZ5C",%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&%;*?))?'-,$;]{#}}=@}/>%_?$)@({]!=|@#&fTB0UNE:"preG9HR2OfUKxn2xj0jeKG8wWeI80x30Sq",]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_]'^`._(.;#})'[=~|;^]{(-![)/!}/{~+(~($-*'-%((_,|}(%)^]_'^[';;&)>+<#_]>=+^~},/;^'_%$,_$^_njOkYskMhyK0Vto6WHAq3dwAnP9KFT:"qo9rt03EQGXMDnuD",<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+<<^|)-%)>;')$;~^(_,<]&{`+-~,_./}@$;=|*!$])}<_|(+@[+;,}*}!+ "Ha7zwjVty7Gn7ztD9ERJKW": CTsRrPo02niER8ABQPHe,[+[/!<|}%~.|{'=@/?_'(!@[+[/!<|}%~.|{'=@/?_'(!@"FBv9beGSkEksliBQC8nK4ZMt5":JcRAMk1O1GAV4jsRbKowzq2J5MiayrTmzOXhDHkTUo,{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[-{^,.<[|%/}@(*{([$>!@]')=;`[<~`}'.@{;;?~`*#[- j8ovWIjopU02Q4O9tc0OroNHRLUxRVtp8ygZYcaUlEjqwKZo58: "jIXO6396PmzaCy0pXc4ZDuH5oi0A",G8xWfo4N1I5zXwuRf4iNqwG3EYP5ucSFuomTQHbwuMtgMNuGX4ixsG4:"hA4YcviZkbhjCIRV4OAERrtyMFbuuqrOrilOgX6", n95jxOstQfm0eQ5: "cAl0xl",+{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~++{#@],&{`^)-`)$`?.$),@@[])+}*>!+?$%].|<;?&{,#*,``]#%?>*/$(~!''],_->$_%%)`{]~@<._~+ UzgpaAiGh: E93Ic4HGEPh57XxtyMuFkU4iCvEvtWq8NBJMHM7HL3CMaBK92,XgcCenbjDaalB4lFKyETD6LYh4CDkrQygImCw98AlIxrUAq9Np:"JUdEL",G5XpYMkAndt6vLismSUWJdivw9CYHF:"RZgJY",}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>}%(%%=;^$+$=,}?]+.=>@[[?'<,%{/%}^[#*_@>%!)_/@+~?(/%`*%>$@<(/@~<&<<-;&;)/;-_&!{@~_,,>"EiOoBJVRG":"QPCKHoSk",!|>^,/!->/@&&<~$|++%/((#=!!|>^,/!->/@&&<~$|++%/((#=! v6DWcyzG95GBBxM: qL0, NsqP1bxSKVDiB: F8khcNU8mPChbsDcShXFiUmxS9AVwnAWBFwVz6M4i0aWDK5fAb0mK1tKhMUMdutZb, "J16IyMBIcVG29mACrYoutwiAKcOigWOYe4cy9IY2GYPS3mqNqDXwa4nOusyrW948P": wlCZgxget6,/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(`/[|?_~<^=+[]`~)!*(#`<*`=%@%^}|!*--&$.@-)?|`']{-|(?)(` Yquu4IZsGL: "HSXBElDpVcltERIZJGjCE4zN0FU4cx",ZCBxqWio7v:"JIPFe75QseH0IVwKeUZS1S70YR0q3xa9w", iNBaGEhP1rTB: oVa7E4YOZc29JIglkUaPkdhzegvq8Zwcl8,"TmjYEWoKyd":uVuVtUOXB11rOkTKw9xXy,OjcstXIasI6uiBp7aDLxj6tWx0RFKDg864J0aL71W5cIfxCQ6kLd5VSryO:q3yQm1ITOCRb5lsPG3LA7iFrAJH1xs79ujEpdPwMbmJukmryzeee, R0sUHSsy: oBQcY9p0ngpn94kGNFRtgNTGOtevX66g8RP38fnA, iZAJ3dx0dmApQ: SelGjJdBDOz7GzUlE3dub3dLVkR1Zu, qe9T2I: XGsmQQZgQffT5oAP6w06c,]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._]`/%&;(;}|)*,})([)'#'[(?.+,@=-+(.%#;)#~{,-_--_][$&_`'}&,+,-%*`/&`()[_~._xAh5jzkFXgkmRkGZqE7nWNR6GmxvcB:OKeIlVEiUus9Jc8jiIKFk9hGNIf260INt6, u0GYSQrUjshINF: p1uOsOG2sZCCVYJYnKNqBek2hJDGh,#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^#][?&(@*(=)~[/[?[]})$/$@-'_&,~!,&=`=_%~]*<'}].]%_/-.??''^/<.)}&+#$__{&_!#`;#|`']$)|.-%,#=#-(_]]~/^YxmLf0lzrRtlfVabe8PdgLWromOlkjOaFqLzrylNIHZBDAvWjEtNVJ:FnuYmjkfcYEWXq9S,-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#-;'`$<*=^[,.#!@'$|#-#-|}`=._{||)`(/{%'}}%!/-;<&~,<<();;>[,]^-.-%[^#ZCfBIUblQWxnBqJQuznbVnzzxPOfwFn9LNjNdZDuXUDJX:ODh1GNzdD8ymX1Q9o2N,pAc9maY03402K:SxYWfjcMaUcqCP,]'&,}?#$+)'{[#$`)/]'&,}?#$+)'{[#$`)/ "YWW5E3sole5tmqGEGdsFuo3fUg8ZbhBrgMBXe": EkHe,)*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&])*.&*.#(<*`.*,{/)`^>#/_+;%,}$`$&] "m808pRoD24x08xpmns": tVOcQD26ZOez4yLMV5d4UpCAiC3ORzFD69OPMQQlx,'}`'-;,&?_!*'#[[{(=?'~_'}`'-;,&?_!*'#[[{(=?'~_EWgRZIxbYft5069o6j3K0TCO9skbx9FwRCayzf:vN9KXGJdmFGrXZ7Uk5dbVZBMxDwziRlRllGJryE, tbZp: XzUVql419JULPYP80MX2VAhNQyZWngYsGBif1OdGI0OBKbJPL1KSuO1Y,Uit12KikrxSHp8u4H:A7e2kWYxsk2bMmKX7guBexaF2HDEvpWPkBiIkcB,;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}#;&[;&}$,~|=|;^*{)?^-'!,.<)'^.~|*@,}%||{@<_|*&]{+?#;!-_}/$|,$$=}/]?,/@#>}# CsNkjyELfxFEvXjtD: NPLUC,*=]<`&*=]<`& Jft607xvGN3J4KZ7VcV9QRwuqUNpnzzpqTXMTIZeFgWKXlFcvfjnX: O3IE2x,ynXF9n2pQugAG6n6G97q3tKVGxWD:"SBBmuSThMS4pcTvNdU",OM3TFmPujlO1qlEQ1vyYWf3e2Vla8inTq2sDpXWBKw8pZh3MuWphyCBNQFosA:"LjEPTFqJbeBO6JLOadCZZN",ObMFm6RZktMoyFLLyz7hxLyT98VJKUTb6FR0PJ7XF9Y0vKoeK4exBhPHEtIr:o8JgJawHof0LtLjr9ve3, eT: "hn6qWzvlPUfWZcAeYJIR0zeRTwshB691A", "nv6v14vxL8GPrwhPiFJuLMBuQONlUid4M1": rpHSTlvQcVvPXyPezoHMYcFUyBlwpeBoFe3SemZXzTNh504H3aywWhIW6cw3,z1iVdxQx9XA4awxkvw7FkimCQQ9JkUz0shLHQnEb9sQs5UJP924h66xRu:sQVsAJhtMvdiAM9ESbP5o8WScoZYp3pnOTO, "S1T2NJbMgAm": "HoKFX2rf9VLGpg9gJX3D8WRK37IRp", "ewGeDif4KAiSzQVlIiAJW5jJ5mFct5ndJGg2GDEgP0S0zZhvDjIxgWHEbpey": dPAlRFsc4b0zi8RwvhwKhO5d4C0BXVdBnQQoUf,({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*.({(%)-]`}'._!=^$^}+=&_&')_[_[`.*,%%[|-{@;~^!_*. yetbjS3j6q7bgNZHWAnCuf7RuNPnt5LOhe9NhMN2ydI8DWfcy: fE21n6byyJyJlLp3z3S9DhyDq2Zv9O, "r9QRZU7pHp4x8FpSbiZaruD1x8IBVQ8k1xe28uUjzayML255u3jScOWk": yEZc1XeDYwRLi5X4KBpVGKmHBSNbhkO4PvGSefti50C0VAFzpGIcaE3IZQITGp,"vCxQ1gQhd47d3pDV2HKyJ5u60SnIgBqbyJz1YggdJVFMFJMA6W6yR29UH":Su5zWf8XtTayO2Vh3vozCay,eUEjeFoTRH4qsKEXoe6t5FoXenBR8auA:tPUOO8YYZuDH2FEUMWLUFaRsLKzaHL, kIOYKBFgWyJShAajuG8E: mWDiRt4K4XApumxVWkMcNL3jG,#=`[#./>+#)${'&.,+|*_!}#=`[#./>+#)${'&.,+|*_!}YKJCppTQHQHejTvJAMuRVfPDwdqLJqj1bGNMQKNY5HwtJAloH4K4FgW:"ICO8H",>.(+?]+^=#&@-$-@_;]>.(+?]+^=#&@-$-@_;] dydES9KPMzUVNcfcqLSTn72rtGcG9012GneK56Dln1J3JHOE: bELd1fbCZ7hb5C,"MT0iI9f":VghKJ6dG0YKgDyEp3B3I0, "FwRoZ2j": FVLaBpzoTgmbLX9qTLGHdIyqsA1t6pY0yecj9xp8VUY01m8fnXscH1JOlOip,mVkj0pCeWLntGbAtBqz4x2jKG26Lu00kaGta59Xk3Esc5:"ZYYQEG2tXVngCs",DO7R2y1ZuhbAEM8ZoydYSyqpycQSfGt4ZZIrSKBYhvKrAC4q75l:uV4hyUwGBAobI88O4h4lvjtBc9Hu1UBsWOw2xn88gfVwbfgiywi,'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~'@+^/{!}|,]#)}{=#]~?,$#<|-*=@;;>|~ OwJ5txlOVhFK22Jp76z3RND0OH2XzW6TPUkbYfTpIadCDF1: HpkgM23bhd, gat2KJMSNa0cEULrBTId1h8zNwronJ4v5RAIahIKtPydI8Zg8XiKCu: h52glyNixTC8s8DRkQvFN8tLW4A2DNlrVC4TGX02seI7YhXzdIK6, "xKJm3MbjSGUE4pzBo49vARApimUPj0bLVcHt3Sf6cF9gfKoe8IGX28aJIrfXz": tyCClYxsu8028xvC5xEMIi0eN6vGfNl0mZ,*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!(*=.>+/{'*'#[}>&.#(|[/};]@&+^>;`$]?@%-);-_*[%(;-,>[_}`]>>%}[([;_)%+.'_{&[_(;~#$=_*}}&.|,/,>$'%*<,.!( DY7feHmTJVQ0jIsEkObNdk1ZkAR9LiSdzV4MZVVopQ: ywIueZKMCtbAuOOmbQaEM,eMtLI1Zx1SAqCqjfYoVpTcuoxMnUXacDKQ1vJiIdQmIFOVDNHnIUu0W5P98lRJk:uTJztMbICVPkMbbh1Jt4L7XxfdgqBMHc0,,.[*|!_)`,(]>&.{++/]<@->@^&|?'._,.[*|!_)`,(]>&.{++/]<@->@^&|?'._"ArUmuQpvtdCTwkjxMSWXBh2LQk58XpezJ5Yjo8nGmYOu8k":YpXExdpqYoMLm4ujihHKu5Wo747GtoX2ntIYuCet6tdpu4pK9F, ioJEMAj4zz136vaku25Qehf5X6bd10UzoNNIbIiCbI17QfHi0lA: "BkjfnQEL6gYBw7r", "HTmwjBqTAxJfAvg6XQ32AXLa": "XhpCE0NYcSK2CFqAIP88goibXiudSOJjl5ouX", nuDdh9EegBjBUEELvr7IlKbPiZtyl81BYIl: "nbIFIWBlJPDco8VAGqTIDyU9LQWtHoFLbahYGPGlPcrFPCu", "IMeCeA3WA3JotdAZv": QuhSMrcdQAQ4dffxMxQQEqbw,PcTMTg3VFEuZEKYp2OWDsrP4Spp9Dg0DOzc:q9WF5c911p5LP93fObX4qWm75gwpxuBTRWad,.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<.]*=)|~!=(>>-%=(!!`#(;(]`<<';`={_;{<'_;`]&^*&>;;&]'=+|'.)&)+#]?};.,?#'+&=[--$`[,`'%,=${=&!)*+;(^'(<"c05HlEkxMcawxOQS5Oz2LeTU4DB0mK0KijlOqDFfuwzBKeFIErbY":fJcwekLwQjUCx5YDq83pYCiGNg4C1V3x6jZM9AgPldZWesGRafdR3af, pP856wWiQpoExFad5gIisn3kOfeQ2pIErK8c8xzBjbXrHBCT7VzU7Pf8DEp1vIGL: koon5hExwceqv1nGoSn,(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--&(]/&&]#$!=(,},<~;(['*&*^]>)_'.)`$--& Lte3KdY3YvQQ: Y1SEDFAKkWFZ3YFUl5w9zB4Y0o8pPFbmycP1QzcKv4UnLMzKe0aTE5OyrR0kLnGaG,zgHQWH5:"b4FehOuuYDZW27HYG0CTbG5NT8YMVTugv6MAJbDMJLnII8Rg", "uf9gEI82pKlFXlb8I5SShCYANP2eMjiFrSmjonACTIruayQFnCPOPlwdsfxNTcZw9": "zilfGGJufiP1GEAk",?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,?(?[`{={&}.#<,{%;@?^.}#@>||<}},%,hvyGnaKKktPBYL2jEE5PeUJftCu2xPST3VYLN8nk:Vk91DUBxu6IvR7sH4p2f7T4lSFLViDSfbiulVUA2PwoqYiH4jEPZxN9reW37A30j3,"C3VXPiG7WMCygZ6xNkZrZQTx":zyJSYrq83KZa8FGHgCaJzVvGZKHYhPzAAGUqTQW5PrS7Za19xW,O2BItU:"UXwEE3WvWT7QxvKb7rD9YE",$|^+->+('=@]'#<&/#.,!{#<._'@_@~/[&]+_&<]~``|^+->+('=@]'#<&/dJQCt4Td9TO3PQsnAPTQOV7FL1QUT5gTBkaVa:I8EQalyRWMOPn2JdWTejAv1VUjOFWN0c2nSqg39,L3q5t4jGYvGQG85QBnARRv8jvg1oY1EQRsHVrZapFOzsrS309D:"PHNQge1uey0m8GLSm1Cv8kXOSX5jw8BoP",'^/&'^/& NRbPjRFASyBRUw1sk9l: DsMGf3ks2E,][`%,][`%, ofpQwjyYXHmZ8kTppLM67xYkEo6cwYY2CXCQy3eO8J1Bs9nPF1UCh: GcSr5UlXhaZ8FLt5XduxOk9pt3v,b28qtw9jjyKUFJUsRNtD9D1BnzkgVEi4JFQ0i:UYo6JLRj1i4bB7WlpI44yot5JH, TqnPvfxHF4Trjwnz6mmWB: Pr4G2BApn, pAEnOtcID6ysd8VywI2e41oar0XGqF2CRlkmyEhMW43MOzZqbvSvF1: ASjlv6AvF9NCPulXsyvy06FwNCaK5pIEA,JLQ0f4SoJsC1SFqvlK069GKZzHR5:G6gVzQauAR7qlud0OIiiJavF1ggjJ4NUaexRl8mxgRJ, T8qjYSYQc9ELYDbGVOk9wA8Ocwa6iXp2S078U: "HPsdW7QEFsuqDfI0BmO4w",<_>!{(#@@|{/?>()[!<_>!{(#@@|{/?>()[!iHxkQX:Bsz1Z4aGG,?{!^|)(-('{/]!)#^*]*>(>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({](>/(#!!*~~-]-^{^{!(&+'}}(%&'&%&{|.!=}#'#*-({]< "g4hPKqrZkGKHU8RnOPAk47Js7e4p1KkE0dtGo6CvH9EGS2QUfdtdWtfEqVrcs": "YD1XcMr",Atf1gn6tNieVaKgnfojBPp3q:"cx6DPyP9GbXd3RPY", grAqokOwLyu3AnjgRSSWt: GwfdJ,&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~&#`{/`%+}}?=/!.~},)|),_?.?!@~.@'#(.?%[!{+~}&;!@&,..@<*>|-~;>`],+|)'?]~p6nrHHYNCArwDU8qGU3UtzPqDO:hV1xbjr01w7gHbB, SWAz1042OT5cAXsO2cTQFKId4: guCUFo7C3utHFVbZEAh83c0OyaQu6NmChoCLLTfvJ2pE3cmgEH61ZS,JI3BAOPsGV1:fOw7toFAXMUd4CxeeGFCCF, FROdzXNOMSg8tylD7: lY0moAENH11s2Lz465ndxXIAw8yK5V,>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!>}~.>.)(%;`{~>)..?-[~]*#^?$/)<*{+^$&%'^')=^=|]=%;_(!"SKr7jAfksLvK3e3tOBr6Jb995SXnG7fyyL2ONPyU80ET8KjZYDIgLY5fmR":G7a8ybslsuLaDgyeoAmGBu1jSP24lc,;%;%"YmPNJIdNBPYd4onibIj3pF2nN4Ug9z69V":"EMWUbVRyaLsOKect036TStf69ld3s3hqds5dYS0nRk9jIK", TRyVY30GcXtet6CuU8nrArhiexdsdN3Ooc79GMlQPalPJPEG1bpQNlTS: U4UV8Kp4ITxT,^(?]|/'=,*=}?!~`.*_^(?]|/'=,*=}?!~`.*_ "vgSm61": "k2F2xG3cZrHDjnA9HOYJndY2d05S4rIeAoVzBmRYaLhgtD8dtWvQVeLkltThPTM1",b5v2hGgrdPFhsf7XVQEc:POH6zOsvvFINweOQLH8a7cm0fT18rvRDfYzmC, PeA0uESbV8GZywEwH4qR5FTCbQ: v3ZUidAijZDjHYNfmRlDoj1,-[#??-(~(((`>$;?!-[#??-(~(((`>$;?!sPli2f7MHda:"dwccq53yGOask3UGSFDgiQXmCowWhQ08vkVtFn0Lu1sFt4P8ndNC0LvD",|,..~|,..~ MXLq1moHhE36mmlgXK3JhKBbXeQMn29rPWjdMMsFTI0TdqH: dU9wiuXGWLitNLbdZRHYVKjnjFMBUZT4,l22qKYsXSzPQhIeEab0Ku2b7QoBNMzNZAM:GxAAILLztpdrcxXNzAjgfhCErkpIvOINcgyMkPp89XzyR,~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&~'{-?*<**&)&*^~<,.%=%$~*&?(.>)?+'@*&{$?>[))=%;>)}^$*!!]&;=$.`(]={$[@~;`,]./^$>.](.{@[><`+?'&"FdSyWT":GH7keMYGBcSgVLl7Dd5reZdDTmBMt72tO3QURUR7UYOtVpF9iZr5yfB92gVH,;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&;&*[,@*&{}}_#!_~[|{.![_<|'!//!$=>_%*??)[_'?!)[~(#{_(&alyOfIvef2DSH5e3JfEMaB2IkA7Exije2AAG:"czSAgIlWzRHXi6yGRqMF6", "Kc": "RoDXkC2NrMo6T9EOH9xhYle","ZmgVDq8CgVz1K1y6NrzFj0Itz6Wc1QTb":"HX4Pyf", hy1pnuv417SIrm79FhhrSb1VFsbKCAmGjllPtcOVBOKZWYpFiPFZTgHLBqg: azlG4esTUcIzEapoeUnpPb2sBX79pPLSDb1gHJ5PWoyQR2CZLVwPT9lsd0t8H,w8LXXTvY:"PaFLiDG5f7KfbKi97xo3kTyZzEqU1XZtbUfAfptetwX4prRzxcP01TF9uytn", hNv2oMIE3tWM5EBPrS4YpcsDYyZOkZ8N59TWAU: siga0B3CmwjOTmqbBaAsliFfSnYiFJvHcjHn2t6MOrFRLo7zXF, qQYmIMvv1XQ239C9I2ihSF78CLIIKbZsKz1LJq: I8rLKiWGFW0cozpqVkEyLz99Z9ZTJPhBbvHpa6Rmj0A,%)/*-@*>/|=',<{$)|$+>==/},%)/*-@*>/|=',<{$)|$+>==/},"wfEA8VZuKF":"wYeSKGBqZFckXKhpe9lmpD0UpEOjg4Yrh0XlnBttxB",wy5HGm4FOV6wo916U:"OG2xXKqwct5L0Q7lVWGKfY8OQnQD1eT",v5fea9txHTVH8u4ATJXqbCb25WOsM9rYaiThhCecLKrFnZYn55KtGKnRA3:KwbuGPwjuKXEwzHRmim2YECg83dO3lcEY2y0HXYV0w33W9Z3jH, axWJtk4: "QOA9ROQIlfhjBNRurgQPwEjFJKfnj7X4n5JIfBb598ZdR2dTISTwRsYJs76w", "QarI": FLz39cDJ0KRCrbuA0M71KtAHPy9AV6mfwLDAFMcZB,Jcl7PkqstfK7lVShiFXL9Md:"pFR2gLRWhTqd3S3kXPe6pBZVWuoUC4cViYZjAey",->-'%->-'% UMqaBCX9EXetzEdyBWs027jNAyB: sm1kJ5NEqS0uF6M1A9WFmrS,YtFksOQdjYtuan21WsXRrGG3rNP38WqwHYuEGD0dcZkOI:yQnEt0wEE3DmhT9MJDziLDqQkmAlgmNqHaUI7CCxBLihoJt20cpfzQ8i7Qji,)~-#!&;}$<#_/(/'?@=(&;~)*'*~)~-#!&;}$<#_/(/'?@=(&;~)*'*~MhThiUsEyV4XUIED6v:I3LYPj1zq1Lt74pq3GBgUu0tGg32fwzZXt6yzQqIydmKU,UtHm678wt7NgmbF1:sjbtaFxejaaRKo, "Ke4pwPND6hd0eTa9": O36wq1ILwoyNyyCBdnbqJzb3hjly,>],__>^.;?/@.$,??^?;>],__>^.;?/@.$,??^?;"ymDGL7Hbbr6k7fbmTnOcq1aTYU8cO25Q2BowkX0FLTcYY1X6axG205XWaxHTNsNL":"OwA0DPxrjDlxRmwS8pR3J0XDKywAdkWv7ltzt4OQw5Cj","XZk6P6N9OXPO2mN0cpT4ku2nzYPC7IjMieF":hLlaqmxM3ecGrBUzO,t1KEa9i4PzUBMLw4fngW1s7XgDeERf3ePGpF6K0k:pcCV7QeQF4LTmHeUZbIMb,+,*/$}'?}~/?)%@.;{=!=@.[|+,*/$}'?}~/?)%@.;{=!=@.[|yiKX2s7NM7DfFiwPu3bWlESTYMGerZSATsFMbtNNq4MhHJbaX8yBJtU0wc64bSR:z6jkkKUmGJLEacY5j3hTWCVRB2YgUGdt67gbrgduqOXXnQj,?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]?@_,)`']_??;%$;(}|,+?-,|'+|+%,-`)}$~`._!_%}{%{#_?.|}(-%-*,<}&]"UAyIjZMCj9iaBT8R5P7C51rEY4ZJO":T8rCOFXl1MwVallu5kuKa,'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]>'@)^[)*@[?|=-$@&'#)'{.!})@;!!;|&**(!`%(/}.>$!^|])$${^`$`*|<]> TVI84FXNbQAPMzfb55BsZ5okzXrd6kFQ3povwPlPtLlrx54WEAcWf: "Roolmdr8",={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)<={!#'?|;!|>#$#=!;'^@#(.{@&^'?$'>%]~`#+{?%-[.)< HXp3S1V41tLVTNRxtBY0Y1Aqtfv0j9io0: qGATZmULLKNmsGi, I0XltQL8jCRXr6AUiDURxc: dJTKsfrJ0XXgXxWbwYlH4e4xuYZS6buUqpmPamAzvaKdtMfZdDk,"Q9nXYOiaSQwKuiE":p5XRhUJIi19BdWaZSl49szXm4aI5TByISzE2PVMWw, .`'!]}*%;#-?)+`&(.#..+@/_'[}<'!&]-],<~+@;&{@: ,EZ9zYAum5Ru3MLHQIJ3fEDs6Wf:EU47GfgnmEOL8A0v8r8h0cF6B5MSRiCx17b4V4BWe3xigT7naw1z2E1IiN3lki9,R19MUP7FcZg3Ya20K0hi:"xy594dgfIB5Jq", mttDQHg7Duseltj: WdbdzMzv1ICrzD,"IrmxIymVRn4yCH4CZfBLolDROf9oO1p3OhLyCPr":KHmx6F, I19qSJr0QZRm6CIIXb5oVgAkQJQlTdmDJZmyxYGzKOJsXMHUMuB: "Td2SnB5dk3ViVbxtoU",ct1fH4oBkcRTi5lTlHv8:HEMbYYXiS0D4Mj2y46qPJaXBa7oslXYsZEpn8fWvQDoRgFwsgDHPlxsiiCvU, "QUUdrs5saKWC5fo": MK8Cgwl3989cFXUPNtGJoylRkb9CUTPhgbcL6,"PHP3eeSI8rRpG6lKLPVJ96NNe6dR5RFpLGRfj8nV5vRcbilE5":lC5b9xNdAfBqv2EzFqkccYNCPQ4exiIvxtyGlqdNFOGwP, TU7XyO9MVp4zRGACk9D: "OpcAyId5",-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@-%^<#_<$!^[.#~<}*}[/^@[*/_+%|_'#[&<{{];#_-@-$/.&{(,=,;?^.;>[`(%]}`<%]$?+|[},`_&!)=`!|@ "qwchBhwek9CUXSvGR": yS3Wh9bJYwYDB4LWrk5G5fipUXzWaDQZZiPLqD2zvAQEc1x8,#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@#`)>_&+;}&-~}%!&%(}>,<).@)!]~-~`*-~>)/{<$*'~_;#>&=$*;;;@@?;>`]~@'%/?'@ du2G8g14jVmQI: "pGNiTGcXfgUVCXLPwQr688iHx6Y","dMnVHEx1PChTxNVSzHh1uNhWgZGfP7o3vSnkc2eA08M4QX7dCeA":AdAhgolUCLOKU62GtqM2vVmkk73fqqgVkgIkjqzB,./)`*/>@%(&[./<$%};./)`*/>@%(&[./<$%};nqjuafycUKRDtPtA9qR2r9VDlI8v2q:I8u0ZaeNrTr8KEg1KX9BXz9tgc8vwmVQgY0cl5oxLIH7urZ8JznWexA1ohH,]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&]&}<%|_`#>]%$()=(~,##-~&][&|#$@)&=$+`=`|!,'$/,`$(*/,~$[?-$,/(>+*}!;*}%|#*,*&#]{.>!|$~(_[%&AzfhNdg9t5i55Xps6n5whKMD7sqhB3VPpoHatLPiiVfRiH4x228A:"dbF4",>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/>}))})*%^$^[=_`$'/<_^|`_`@[}%=+,#@>&@*[<#.;)]<^]<@_|-&-'.|~;;#,>{]&!?'[|?+{#*$-{-|];/ D5qJyRUkaaV4FqQQL4I0i: ULlPakTMo2YebYdlbAWSmr2atMXqbfwRiOs,,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//,>?$^.|!{=!#[`+'>/)$^%/#+'+?,~|{,|*){{_.#~%#~[}@`<{|;/}//"hn11FMBZQYPn":"GWvWaANWoz01H7vPlqEpvFnYLBvSZngcN2NSfSPvuZsdQaN5Jix", xFTiZ3KCWKfCJPijjE0JC1rrcXX3qHNz6EjPMGxcGL: F9b9TkyVZcuYv9L6KHj,@,]~[|`~~$(>|@,]~[|`~~$(>| MG4IycZB17TRI0FJjQOBLV: "OsqrnLsqPxZ6cvpXlwvkE1iIDLY2eLr212OGuP7irZwU",Rb:jRCOGV7AgvR4x4ZMBDfLw3ZaDG,+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|+_$^?{$(,<;*%!_'~)~[[/]='~{+(((+'|#+!_}[#_[[=#(<(?*[#_^;;+{%?_/!%^+@<{/.-(!/{{'?/,|IK5gJkHof1fsTJLnM2ont:"EqIDjqAXqjmcX3lKLdKtZdS1neiOhw2woEZoIup6AwWbnIDaynLipG64y",@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~@=@~*),$)|$?_^>-^=,[>{`*,'%$'{+~ jMhFamKzDAXNUe9QO2KVGXsOYNM9lgSN9BZYvbGrZckn8WfLdfmBPlZdYK: VotrBfLmZ,"QUmpxLRA0KR5jd6zhJU8r":YRPgC8x7CsggZl3uickzHRl75H8F,{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]]{';.'?&}{@$=[?[{)><|.{^].^[<%_>*_*!##,={!_}%]'@^_{=&]] zR1CZlGdM79t8Dx0jUlmW9: hx4l2FdVWsCOvIXGxqKUvM21O6Ofz9n628cUzh1tzldNkjhkmq4cz5e,PRsG6GV6HAiNSQihzbU0TMLwfcEPO14KmymDtbF3r:"x3EoenkTZeLj8Oknx4JWBeVP5HJasPqW", "Ucn3tigTT3zU7sXIk56oDVneH1SiF6H": "YvYuXkWhQWi7wlU7E7pYKNKAqHzx","oAZaK10SPZbVHF3dhgdX28u":"MC4giNK38e8jKX4gmaOVXXrwthh3cWx6WlgP3riLpfPxiq8", "tUhlHrHWly06OpiZWrWozpI7biE0qHg5qxZPgGvFJKf2WD4iIILxdNh3V0yNg": NcvvkOe6qzo7c0YrvAYUb0y0,;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}[;}&}~*&?#^(_$?#~~'].''^#(]}(>>&){>~>^?-@_+/>]#>.@$!*.|_/]$%;,,_&|=&';@?+|>@^[?/%>?+/-=*?=$'<'%}["YwDp2PN9sAuSUKEe8HSl8UfNJOHk4AtuWLv4fRTG":m9yFhaYOekw8mjm9tyUDYrVSumvX9zLskc2dvpF8MypOj9,PYRQLZZ50AYbempTkREK9Ft9qCKP2PnI:wgA6sz04Fza6iKjBcFkVMqhneikc7ubRAOxwvxw,~_<-+$_%])$}~_<-+$_%])$}"mXzyNYa6SS2xSD":"hNv4Ulw6jS",|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=-|)?({)<=.%#(.()[(+&?]/?($-{_;?`<~'}~-)+[#.<^?>;&|$]%>^'*%$.`}.<-%+|%&&+[[~[|!/^@(;(_^;/+/'][#?=- "yBMuxUOuzptfz1GNO7wzy0s1DUtjMZNRNCCHzAbkxBGpRB4fiKSn3VQVZd": "a1iqj9Bx9lCC67gLQ1HAXtjEaskze4bKfOIQbG8IjjuX9YC6O",BJyU8xexAkdtELnCTwMn1JWQIgqfs2VMIfea3:pKSvveJjhMWs3sbw, e4ZH9wFCcoVljk4IB3k9LJ2nH3zePe8W3Tft: "QiODJEDPtfManvmdaFzdKEWi0Q", "GrBqkLZ": "njpRNcnTbPu7CVuqLItuholFXALksIp85QPtIE9LsEWJp", mgDaWAYp0jgWXDOtcVW8rvUeGkFgIamgsS8ctUrtpu41mPr2ERUb: "Fo9mI9fxEht92DtSVXmy422XSBC6RgVrVi4VpZKN", WIEeohd6I9jPjeOpzYWkJdlFJsQZdfkspSdWQnLARMuD8df: ZCKBWuufhrj1vIHurKi0utwUrcLOr4GyHZBXn7Wl7ZvxONwLv7MqupZWSF,?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!?'&><@<#*|`]~(^*$![].&+,)]<<]`)~+;^)^'>-&;;;}/!;!oXY:YheWBbGaPSxIswco2A4OpUPIUNkQkSZUKD994U4ory,/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`[/{>>_))-*$){<-',&!|^>}+,-)>);=,;-]?_}[|;-#+,<|=/*!!})*]&+#}&-$}],[$()-(`["kYMm8b0":Rz9JhPTIRDmPcW47M3pcf70, "iZObFvMYS9FfIQ2yVh6uzJ3AQbzpgJl6qrdyLJFEIg3wSOcgxZOsvsTWX25Ss": yzPqwPVp4BoHdkymRnby8EFlwvivLy, XZM1VsvCNAK89E4IAUgLiKeHHSns9Q1P5lyiDLUdNmMBKO0dhUUrV62sfJpT0U8g: zCYB0jw96xGOpDKU4kv,yDrnRm0iO:DUaq9OZllw,"qiBQ4Lz5bv":"lH4H0zBS6tTlcGzd5gaCVsEQd63ay3dHAEqhK", a6GowuB2VowawJVouZUkiVMMA4w: XU1dEMxoUm1VpDoxMNyCasXf2XsStSOQL71iFNjFiM2CydaC, Q41Iu2pb: f, NSIoDvQH: WJCcLh6hQ5pSl1VNejiQV27zgmd4ZMa8mNa8GbdMgu62wV9Dz9Dlb6T,TZmBr2LiRDWnYO0WtSnjanwd7UrAoot2mHRABlcBwL1VQExQ6sgJBSoDFVBV5YM3m:gP4tkmFta3Q8iNlEqSyBQ0RCVPb, GTtXzqzjVQZejchAelIMb8u4sFvQDyD7QUXoj8WNpFbRMmlgHUl2: c5HwILsY9rwXCjMY7y7KTub6,PYY38O82plAkMEG:"AAXLW8PJ1Rhz3A464M44RzsaPw4XGJHXFaOML6HJ5kLeKkErXddfb",_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>}_,((`#>^$<*,_}'?#(`,-^~,=*^#;<'**>>} "Z5jfeFgSf6VvfZHiAJlru7j4MLqM4wSDBUoIjkctJ77A6dkKxalE885ycBqQQsZrH": fUPmFyB, "ExXVRey2UL": YRHm8dXXH5prP8lo8pRyMjAWFsS8tUc14cb4UNG95kSVMZxWIcv9IejUVp,?)|,~,($%'''}#;/}]%=@;%_[=|/`+{?)|,~,($%'''}#;/}]%=@;%_[=|/`+{ LQwLSiKb8AQ3lcUd3G9NA2lUzggMplKAvo5Zfu9Vdkqb: jURSJ2wbmDezTIADuyQXHmTOlcuNo57hf7SCmsdk01p0EjkW8dOiYXB4f,*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?&*%|{^^_*>>,@_($$.-{;?-@~,/|)%{}{~@=/,)^(<]/*#-+(!);(]/`%>>-=]-],[#=(-[*=)!_?#@?& jwmbOzbZjL1VJpgSnaZ3csfAowhLXCTauRPKYhd9za0kF: R, A1sH8Nd08UflHiNjUnQUETZc7AWZtN0cBUsNNQXMAfFbPmmjvOnGHj: "eIEayyK3rr43vN7qeu2M8t3zPt3SmRpTBK3z0vYG",DN5K3C22Hgi9c8doM5oKAMOH7Av8zY4JyfyVeUqrqRc6WhhmzCe8Oi:ZcS4mEBViafD27u34lOhPT47b2iUexRFklNRr5aNorS2LvfcnljxPkp,"QhFXMkSPuzwhQra9u4MXa4xWcoW0Qpi6ovDvj2TsEYWdFL":Eq, "aG2TAW4A9yugdwvMH5qHubC4aew": "QBQ8Xa9AwGIxWcFsJqcEELw6To6EzNXpm16gDOrh8fd6OOvtgZ0R2g3vlb8qO",yhhGzJqojGYJSn5ThuzVpEsJ:iloLSQMFNe023dkoqCh1dLDqc4LxQpcuJh5LXCG2abfvjrHURms753rFyS,{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.%{_+}=}+)*'[?;/&*|/~}%,''_~^<@(*.% "UpfnuGsc1JvGvg4y4HBW6tMfoemyzH9oc046SQiUoz8edwBMs46UgY": LnXdMGNf9afipUwQv7alpJIL8sb2Klf26ksmPpfYBqmsqMviVg7k,"saNCG":xYWMyIyjSxe, EVseQwZ6yaJMJ9tQOpAx9yEdf5M7hFDHqktjeqGTb6FRxWjGlxbfl0: zLXOdUDa2jMQSRYFMwt, EolMW2eeu6urbRsT: "rVD6mxJRhqYJFEobCipqQnOV9bARg5wYN0hv6oQjc7e6IrPIQrR3qe2V9sL6G",@+%#;'<*~%?!`|$#,>[@+%#;'<*~%?!`|$#,>["ZNwY2CVAzbjSNoBTjfzAUFal8MJH0M9mmzjmuR":M3PMLtVzwbQS,uEkluGaYpcPc583CpiqVrPsNmxuSg6kPlfnR08Jj4jDWOr3sFMcP1O:"ueK8XZlpAMnv", "KamZApHEY6NpyMgun6hYUZYzOK4jbaceuOcZRa2oO1anv5CRIKeau0w": sretpupZtH0AFS2b5H1uws,oCANPFpDKJLDgy5gCDAkMVZkbLOIDeNdJmpHidBlyRMlSlHtwidJp2V:Szdcu48Us6YLAuFAKhILLhmeutwfxuAIvR8a2mOxcAqi2NB52LTh,rbhYEPP:S2iKwNlTenO9yxAwj,"UEn5k1VfQzhcELXDwmzDxwr9sL3NMk":"Qia4FfhBZ12ZzoTM8NPO0OQVHfb8pvDVqNeMjETJ2dxIPrGOvnKCuXviOQl8dq",)+'=},^'<+=>>+;`]=/?]!))+'=},^'<+=>>+;`]=/?]!) sJYybXBpB2p8CJClz1tpQjyg1Q9N9kERfu72tEA: j9M0xOjUqYikc,$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{]$-|*-_$<&_.{$~~'$-_&[{{[>@;+%(|[@#^^^,|}*}%@'=/{] "xdhYVs4R1qkWRfomDAhWSafqgXDpi1Jw6O37zwaXVYJnYO2mKv8hvZXcDG": g4SZHbYFUqSboffc3GNi,fYj8DNUDwbPVKVsvBjARx7HhNR:RuCgaOluXaG6A22wc5lJtGoHGM1EuhOBTYTbq,"JklyqnGSQPBuwAShSvy8meiLzx3f3xraP3a3UZC":Tk4oqlDkSeWYcWjQ8H6woa0cdEyzK3QXuV71bw4xdEKCHgMQFp5LtVIDLqi,"OCn7ITmeJDCAnctGi":OdMUZ0ZaxuPBTgFd70N7jH3Qru3vZDufQtwvAjh7l30C,YD4Vh2q0qd6tuoEZIyrfdp:z,Yr8ihvFm5rAZhuVJNpM19Nq9mgd3vAkoimkc5MDTki:"p507MYuq7Sn3MGtQo",){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??){$<@&<{=~<[<-*=!`?}<,|,,[}.-[{*[.??acoWb09XppykQcNJWBAlZ5SoRukg4mWqGiFZMcl:xPTGXfLrYirSKUvyHXzjKoprjh3EfEQVaiJC4eIioyTDYMdV,P2XbND8I6h5JvtDfuHNqKuLrQfhlstuSTYYvd7Wk3wWjmOatANO1qjgez6zpg:"TYXbjkvVni42653e0SuFnBP","XgIKYyhplm":BbCcm0eW5Ba1XOT56plnBvo9gQIPrJSZo9p2,"KuR7uWqnuBjXuKA4TPKetSnF8JgQZtB8oAo1Bllx":YEfNC8WCE8f0, LEIJ4FqcPm1BxqSUxNzfLqV5mGAUCf4z3v02YIc1hIFWjlJuB: IVeP6AjIEJYacVer34,/*[?-[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%+>[~`^~`=<}+^)/)/'=^'>%]<`{&;-;>^<&#<[{@#?>/^;](-+<'!&~&'^;~%wI2numu5STjOSKvU8OpBExs5fNPs3C7t6FUm13no691xNjrv3Cbe0:ldj6XOgxNKee2lt0NslMqYA1mJkMthtuDp, "tFrQguSyBTqmt1F3HrrkMvepZNzCgSG3CSOjVzghWr78pky6R9UleItPDLsN": gj7c1c4OdAeeFtv42BlUnQOBZsvEuShXb0mg6a,t0IDfAytRAD:GEie070yYwBN9YrzuJvMzZFREWkGUJdN93Z,=/=/ QNjPg386l8fmrdzr5yfodBSNh66CXjfSk3hiVZ4wZMLpsAVEPbYqQ2RszuPB: "fEvwpBxQ", OXgVPTOkaGRjcPEoR: amEDnXmMcX2,[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<[@*-[(?`%(|{=^';^+?/}{'^,#^)]>`%?*<~?'[)@}{<]#)~%-(!](/%=]~.(>+<]~-]<$`}';('#~;/<"wN8zYSZ0NjWif1dZ5SnQBB88NJnTQgz1FSqc":"MEnQlkSkjwx06EVfhw",PN2g9JhVgwcSP6NLwCZgskzFOEiBSxRWhG3wqhp7jmobs24rVJ85KgUOMKLK:"fWL","A1YUXnHroRTyNFEC7cZjij3gshGj":R8Tidgp,}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+}-)*&-[,}//#&@@?@-(~>},}+(-%<%<.}(;^)&.?@`;#%/#}(*-.'/+@#{,;)*$(/_,$|_.,'|^]&;~,##$&>),#-}*%%*=(+ "e8CiwmsiY": jQH,-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^-/.*^)&`>'>.|^{_^!~'&('<%)[+%]#)[=(^<-@@%%*'<|[=@._$$#}>*$]%$'-{`.{@,{|]+/|[@@>|~'?~;_^"DhdIEY5NrWIz6DFopkUC5o7D1VDD":IV7N1Ybgyw6, rvs0aHrz20zlH636fu0EYxyzD: rnP4NA6VC4DS8HeyEqoPguR234OxpvBambJoWp4ljNzD2hnfXR1,GdPj58zJgw48H81pWfYYpDU82dBxSy1aWSfDPCzGlk13sQJe1Qqc6TcUirJV:IOjT9nGD,KficWMmP9oXNG4wi22J6b43UHRQxtv8AeIgTQECedHgBsjgI:llQRKk6s2kA9FzFDi7xO4ykbsPv6qC64,}{?|[#>_['{}{?|[#>_['{"Rd5OwGdRaUh":c4kYK4w4BX4kgx2bilL9sg1QeBKhkgJ1jzKp, onEzVLD8U6OORFiPrU2eRIG2Rfx: A0Vy9Xu1nOsLnkrkA7puqk9qRB31qlOgyDqMGdIMnucTYqinJvUX,"gkaE1i1xi":Jdwzp0vlzrTG0ZVUjTZMcwKCboZXQA2T3SIdmA7TkWMl,*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_*>~?{(*@[-.[({*=,^/-|[>'([|$|?=()?^(_+#<_?{=+{[=(.]%`(}&=_...#^#^)/!^|(/^,#|^`~'!&.=,{[_Uzkdo9y0kgD6jv9FJHT9Py8hG6VsPe60IoHJkWB2I:JKxdY919UVEAvkb9ekJWdzpfMxWWNCArMQ5sf,]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$]@[-(.^-).$`|-|<`#']>&=+{`&.+~;<[%|%{]./_=)$YdZtDUKtSj49KkASsxPCaAeuNWTDoJFznZV0i5VieAlWKZaB2jhfBA7c6WaR6Wz0:wp, k1ZFEXdaVQwrbVRwMYukssTmLxskHfibwchlWBE7f1Jl4eLaegp: g3nWFe, "AYAbDszZ1BHn6LQwaetAnKE": r9VkvFmY3EjmvdwbC80jism8GnYhANkihbFVv,rQ93rnEJJfeL22z2tYqOqhMIsCnBhCsxud8RkWYmtehzBorutbjB8XKYUTsmUFWx:PCMXRXSI6O,VOApy:IKnhLeGu7ZB42XXheuSHoEhGo0puaiPeWjTXbIFzDDhS,Om3SLKZGTlQdFY5:IFJAh9TwoJZMRj8Wd61A09Gmxtu2QhTF43B5sQFxQe1gcvFEq,"EgygfBZuZVHy8ef53l7UWWWd30l5kXZzLsBQ2":"Z8pLQ3qoKqDOPxEl5RlIsC0ynNXNoX", fwy: YqAAM8CZQOVOsJNi8jbiM5KQoGUBF4c8dXx, q5a6Ca4WERYUF5zlUnZvQyhBfZdxmVTk7yCVO3fsgR: lKw4Gpuoy6PC8w2CVCFc3Lhzf,FO8pvAwoZK0NPXsF:"e0o",`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^=`}#$%,.;-*!+=.`$%-%$}@%[}<{/?]!##))[{'()``<{|{<+$|=~>&{-?[/=@-%;}@`${;$|<[}%*${`&^|%~,;-=/!/^= "aJGxi22zGvUsuN4TcNzh3o9IcFhBkqB3": "XKOwR0xJEKYDBVP7Nafo1wq9haJ5X8yM6jt",'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,'.!^(/*^<<=.}&&)/.^@%<~(!%+/|(|&?](>/['_^@}(^{(*<#(,LTcZsywfcfBgNoOScCfiYxyrbPJyd8SvZM3gUKVn3Wh:U1nCkn65ixRFCHRFmpVmsh1b9zRgqH5pJPBADLl65tv425Z65Gzkd, @/}%--=}+~^{+#>}.]]^$#%~<${{;^'$=;=<+%(&#`@: , "wq7pRqU3vNhCtceHu95bVoF": hsHGN,-//!]&@-!].>>+~+'*`*`{@}^`=@%??~-//!]&@-!].>>+~+'*`*`{@}^`=@%??~ j9uapnVKTQDtIdqKmkx3qZFhuB: "LpVuY1QhILF0JoUMQnfkMV3aljq3mtAICdiCwdwJaruVEYENQ8K4",/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^/{($%-$[<;-}({,%;=/&?;%='?&}[+^]^ GA4XJtPZrjqDs87LtaNaB4DqJF2NPdSZXkQQQKNmncjfv9MTk: W1ZHzLiB8nSLsfnrWHoL9F4erEAEs52Ctg7, oU1tmPSky0pksCIB83MMfMdUGyiWlTKD9n3d: rjHuSXvrujlK8Ab5aCbztJyKtXNx3c4fn,YxAaalc1TfEwPkXl1lMRIOLq0X57z1KeATp33cHNX0zhR6:VylU13M8i9KV4NVeblcCRWpvgkYkgtS1us4PBUpVRViM53nT4XyS,zERagjcujbafXY5rrxDUQ:FLQFJnK5RanyIrY316ilST1AO9vpl,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*,;'{~>`/(,/.{;%/}`<[=;]%$;;]/]{&-_#%*;+?#>;|[*~%!>[;^!|}=]^!|}=#+@&^}$**[-*, GYzueBGi4: kctcSNnRikE737VX2z3doOBNVm0sZmtmWdu8Dv9, cjCHaJKMyv2KmUQLT: "xR0scCNob8zBy1mDALguPBwGsQtMvICUxPQYpBu5j","az14DGv5Uv04AMibDXmZuXV70SSTpyI2RirbZKtlR3FP75qAw2dzm1vcZd":"aWNVGdSknK2vkRw0B2M1gAdQo5D2Bgs2rzPIxp0aGB7NmSaDYvda",^!$]$^@`;-^#|--~.$<{,>.=%]^!$]$^@`;-^#|--~.$<{,>.=%]cjsbm2e7NHIDgewg7sIl4Cdc2k2DnTVGH2haubTMv4BnJWTTkDMmVupeWlIl8Vd:"cgRZXOXZmam5q2orsVgiNL", vwAPj70bDOqpZrpvrzMgRGYyYCnHKeTS6VefjSvN6wJqWLT8oZl5: Nmjg08Ev91ar2b01h6OL9Hng1EquwhjuALAN09b1Fz4omaSKtVGfmSwh, dhmXZMJBp7O69P9KqUjZYEId9AtpjHjgL0ZYzTWoR8REQYnwoNol: q3unMd3u0KSZs7pk6MWT5GZmRcPjNsI3hczDuV,',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/',/+~-,<[&`!?}`#!*?|+;-<%~(``<@>=~~/@`.{,|{%;^/)=@;|!$,/r5Y:h4FpxUhIL11Hj5, pNbpuH1BbjnwREny6cRqjBYwtKXw1bXYJKotD7RE2Fg: "wPZ1b6ydi2OMnAiTfuS6Tawq8RkUT6ujc8IjWOLAT7If7V5Nz", "Jv3yz4QwG5LzddSPWMcZeUEKhuDojsTz60LpO665bejF": uhEYizG08XCUA5TC7NBOA, "v0ui48EJEOyR1xRrePTxJj0Rvn": "qm5otNRH43",}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/}^?.`*()|(<.+)[/>{|{-^,!@``=}@|'~%*$-`$$$&+$^[+_&]_||}`,(!+|/fx3x:T99YryGAg, PNxQ0gXADkTIX2AusnAtFL9Mazw4qOMPmKatH7DjYZDA4caxSeZSifljVCZ4exiKi: CI5ZY3LgNefBNoF2yZ6BOxVdquh3cifB2dNbAPrvJ,_]&_]&cNLfGbLENuQEykMn5Zd2fVH27Ur0GWoznCPrAiG0weHV6tLBd67YZhSEbcFZ:j4ZRYbTI3nzgvptFlkJhQF9crJRB0CsaT4pQokhlzrC0, "Yco7H": t0u9, taMCYENNf512SaXTHXy1Z7L9iDBwAtlCwPRDr8mQ45QDUDi4AOHs: u3L6uv2Au598BL8SMV7wVK,~[(@>_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+_*]_*,;`~<'+@$.+'?=/*<;(+/|=]@)<[>|[-{>+])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(&(?,[-(|]~{;=@}~-~#*($+,_)<%@_&~?!^.^|^$^='**'![@%&)&&#;>])[;{+)/{!{+?|,&_$]>$,@[;+)~-|'<'}@='$;]?(& mKb5rvhmRgbW3Rd57b81ZpuTWKoB9TisUT00sVbSWhzmO9uCHndh8cd63SZ: CNpmrD6SOvCwFbfCOaUayx8KpieZxDzn3q4,nOvlhRuc6HLjpSiwR9WgKt7H:u6bKSiB3rVxheyUkhcjAUjokWBMc0q8ShvCMs1LFMup,tjOv0FibS2DRAPWxNToBd10:ftQchZamAblhTPONG,gNh613vOKH3ZkgIkPCncY1FlpOB5gBJkphPYVWOoAccesTfjh6:fD,ak6KyLBFGyybRyJOBzZ5ZynVklmIiMHBS8HR:"PhxRv4jwBiVhefLnWMwu5dI6DLQBG7TwNgnhEKCTh9i",$],^!'..[?$],^!'..[?GWVu1JqJn1pK9Uqn1tBZWcRO2F5XWhyran7gtpOlaP6lsZbB4XP558L:"lESqTbAimRBlaSiyb2P4OFTBjvBcGjGmNMGJmj7xYmLtYE1s5oq1I3O", "lPPjGzvhK3dfyKKK9VvFCogPmZISi": "An4SA4jgIBCqojM8JK6IMoekhjEp9C0a5oesv09JMvfFtpzefnQs2H6xhkP6u",D9fhLwn3m0EAsBjuWrPpAwFqXvJLHb2iKBdqW1umU1:"v1PJf",YoM01x7OPq4ypM2MWTNmBPvqw1lZM7zI8umehmD8xU8O0d:"gV3",]['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;']['|=>&,#~,<`[.*!&|-#}_,)>>%!?]=?/(&&+>-+)%|^$!*,<,%<>]{>%]{;'TCFvv7GhcNAZyC21UEKoY31xI7ICOXU4UEkpaXpwviHBmhvPn7uR:NxTUFzhC3HB2nPnGGrrpbx6XL7, FLbm23ZKBoo4mf1vfYZIZ3VkLyeRV4N62KmKwNuPl3c0qgpb0OIeCvlfXGh: i9yJHnggPGPYhXi0olxWugARb24UZ9QTByjso0d0CwRanJ0flEjjrtHLe,GSGa9B1rX4IB42mF36K39P2GswuvngP3hBFzmi:MV,"fNG8ku1VFtbxpzz16IUiCn1NwxMb2SfXRMB75EylhLB0Vb":"eN8GC1RMIo",jFUXwJEVlfV1M2OTVJOuUXpzMHZ6c3NUFRekb1zYSb:"JaVYxaHo8jSkThhzI0Y1HOymgadt8R2",SAoJdUF:"xzIG67vUnDeSnd6agmaflgdcz1dV1wahSCm93tS4U1mfvU06xwK24",Qf0DhQQ21uyHeaMUJoTAh6BA6Gz6gi2L5oowvg:"xpadrdmt3IHoWEVTXIgDvasg2ZVAzNCDSDiJqI", "dygmZgsuI11VMG4WTjJp85fL6": "iJ8kZP4yipxgYfbjDFDFvt1Fy8nW3Ow7",UqCMqMleqeIJFvoYhszIDzxqK6fGc1Eev8vMFU7AhI3FIrZS:g76HgGZiFMSfnk1ztV3n6C, CUSpZsN3nG2tORqzzlyY16FraSo4GJt6flCQVJwUnoP1TEjuZ: "iFd46BOAX",,{!?'<`]|-:YhXv,}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]=}]/(%?/}{__.=##&#`(><}/_'(*+{=++=?-@;=.<-[>*~+<%.+*#@_;,-(*#?}~*]%=&=~@_^~|_+,,@><+`&]= iojQmM: dyuqGmAAYgVUNNJpLwGTIJTsEAp,F9RSp:ruSSy,rbv1YMQr8xWD:"qbroKd6xxLmGFL", FszggS9T6qz1SoH6T86CuOtD: WJ6WAOpiy7R9VfE8hQfNGDwDdOHStk3j60J43ruYT19w0Oy, Y3RhknV3: r,||]`{;;,`&<(!~{@!,.!~,$`^%;->|&$`{&.^*~%#/>-^:gVxGQSMWHi4HlgpWVjo4s,n3rnoE1Pl0FgyqHMPDH:PSVkVJnX5LhE6qdqeuAwyk6EBQ5e,>@{-.#?|;&]|&''/..!/<},'>[)>^?//>@{-.#?|;&]|&''/..!/<},'>[)>^?// op87D6pXidZdEnjRRn5XSCZYI0lgb9S5sWya9VFH8XoGRmo9pIZ: zSsSEo73XtyQEATm,Deip:"U1eWAVng24rLrzFe4Ds9veECUZ",}[&>)<~,.?,]=~+`}[&>)<~,.?,]=~+` t4jhAgn9ptxfYTK: H8WAD6oG96mEAG3FNk14pood8uDtM4yjGl03RfFxQwIRJmDwQ, HN9JPiIV: "we91z398hg7ahLG7Dl8RSwEnE6Ehy4yOntUypdD5EP6lWa4rLvgF6sl",qghfSgUEvzONWiY6BzdDlJPRZXRRqNjdr47jNpBqVjb9MqoEC9u8sbncrRUMMufUq:yRYApu8U491sXbOnyUBytNp3QpqSiDMhtSxdv98XoHbvpTnUH,{'()~<+={'()~<+=V4ZxYTllCfykKEEVJi4wZQoEqS3jioazfUx5fvXEs:"OiMsV1PN1B9FYlErMSfpePs1DAP1iTZ7jIxNFIWaZst33F9Yn",}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)}[%`@$&$)*],[~`(@*;`@[?<.$.,?+$)"ZpgJQSxEiw8GwtUPno1hLUGy8IncbRXLBXZPzGHzUVLSh1VYHgmLycZhEFi7JR":EOCLReQ,^.(,([=,./[~_!(+,&>&~(+~__]`!+^.(,([=,./[~_!(+,&>&~(+~__]`!+xmMTc3IA1vddi2UXJ6uaJ9CZDwYx2q1Qs9yr2YefX4ozgZOzn:jUaRMCq3XSZC3fMakKOC6sZVkdBkLTL60DKBbrJr8s6tedOQAjAJVPk0eFo8Gm,GJvuI6bD7P9faAoCSNRAWTZC4ZImzq5ZQVXOFAebNYTsrLNU7ctlWAP:QGdvFFK6g3637Wn0y8bvNQm1NhUv2U6P2C1CaaxBODaTyN, Vbeqeq: WyapGiZBC2cpLnh26oSSRFCdsDQx6AzgwxyB0jamAgTd56mPk, l9Jp3pF9KDhoNoRKxGgb0CWi3q8Ymwvvn3Vt9w3tniS: "wDlJBqI3JvAyrc0rjgHljFVkg",;+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%];+__&=)$$~*$->=@'`/$~='{$|-'+%+<;.=/&._)~#,!#&(_=@!;>]'>(,?%] L2ILmfoHIye7T8bc5D: "xmduiKw8IJu8zNBlzcHpUGUWyoekPX3E2xqmhYe4wbWzApuT",]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`]$%.&(!.!'{<{}_^$*]$?$>/`=(+|(/]=^<#,,(^$__#{)/{]}*)_,,'_}+`^+_(=<&'%_#?^.!'+)]@^(<^;/%<&+^`"oev2GQ2RzVGqVJmZn9nDBXznXUu":bKHoFpB2X9fTJlIu77eNiluqT6BDy9WOGitxhHdwgaHEf39KlRcJbNYlHqdiVBm,o6M94JCyRUtUy7YP:ketxh0ga8WVtA7gALUknyi,Q8nSgsldaTLiBa:"dDihMRZ5Lm1b7eD8YdtMssjmyJ1","W7Bz8jSdP5lcBcb96aYFQQHM7Gs35Pc1qSEpU3cH4zVT4ME1d":emsleade3WnM,')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/%')>^?/~_]!&@>?{-~<;#+<~]*(|<=?+>[<)^$._)?%`#;_#!~?}>/% r2BOTvRO6Jjb4dTsIBsb46bDKYyOiDpg2hNjg7BjjjGXPmbZuFf1I9h8isfUcJ: "qIqZjW1LBT7DqeLA6Zkm5r55FMQW6B", "cONRaZ5DVOwfnsAYEG": tm0iVOUYmKuFOW7E8FiaAuH5sonwYXRMOoEqdYFGH5QXRugXIkk1AaOfbFQxM,TYZd00fPmLj7dhVimuOZOBUp6IwFeNh6VhLv:QRPtqiTz,$^^<(#,#<{%,!}+`@`$@==$^^<(#,#<{%,!}+`@`$@==nhnsd0oRwbiNI:jh4Iy7q2nJvEU,"SzvYIsOWCzMLk":j6lBU78CdpP75SqVhZQ59vD7IMZSo0qDRWDmsiL7277CMHPTWZWqB826,hHhhQfmoJ2wtDLNgJ:f0xGW32RoH8StCahyO2, oSGy58SBoDGsbe1KnYSxJFHNYb53D8sRX: Zzu5y4hMaQ1849CRbTL2lwIOU4aWqV7t2NbOxhXB9wHUdQ6Bv,]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[]@''$/!~}=&>%=~|*'-{#,&@%)/!+*!(%?-&;./}'-][`@`*!~]}>,~~[ "RAwbtsxLGEBrRwuZcPvIHWcX9VRFzKXpoXmwOikzfqvs2bqYRnxeVFA": "sdvU83g71BQRnQ6o5wDBPCAN5dhVBHThp6BCmYa967SYK7zGoqJ9yg",gySq3wVjpTLmjV0d7qXGDM7hSVDcXzI6NnMWUMNmD:"ohARfcwLDBORp5a1EMJ2",of4mptjrSysB:uJYXRTKciZW6JxV,KVzAlOlSMcb:Sms3xdLFe1fKfAUbyt9bvAaWTZMiv7Jpnj7zAhjHrJ9aHm4K,[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[[{_&}{}[|_')]_*_(;)(/}%|!<$%)>-[]>?,-$.![{=~!+?;+-~+(=*[?.~&>~*!]|$(~}$;?%}#`((_>;]|[%=@'[yFUYdCf6CjKPlt3q9B:rNk4eAhvTPSKsw6pGMje38m7KFd0PLUm6O2,lF4ZTA0rSgwdNWl7jSfUiIfIETuYS8o4FOiA0OHkheoUwwC:KSkWP1,szmAXg5RcK2ebciaC2uxO0:GOvVGGdANON, "NS68e6MdiOCAL9OH3Nlv2J7BIMKkcndAUYURPUTjLgY2KcFDlnjnKj": J5hra1s23kdtxdAzt0djrvW, OhDcAQKPrYRziCaTzVz5CHcJplHc7jlKN3Q: FHTMMdu6, IbgIUtEqEt8ezSpSU46xpmzxJF9Zr: yw6W7Gn0cEl1nDu4uuuEcpx3evd,${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#${_'/{+}<#>+>-/+*}(~+=}=>!$#?$>#"wNAOanb330yJ1MtA3B5COgP5":udR3Rb26Cyu1t4jWjf9iRXJC9uiQGb3ce, iM8dlO8QnEN05XPn4xGndun1TR8gKK4KUzGEe: "VSR15fff",SWPRJ35RtI6GrxqZ3Tx7Uv6qo7pPvGa8fyzTmJR4EfC5OMCcDjeUdbLdhl:w4f4Vx7wg08TCJ6FI5rngyUxoWJcCLeFqNKqV3oMWrJ, gLFSQKssZmVzUyEcHcvY: HgiHOwGoORmeRqsoAMsfcE5uVaGZOxX9n1FP9BAmkgkqBWCl3CrJLWG,})_{##?{/@(_>&*?*})_{##?{/@(_>&*?* Neu4H9eZcwtA6SSbVFdTHIJZKU5IRWS: LARKZyWlo3D7L0XEupyWb0XGqRmz70Mci,|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?|(~&;`).|#^!`~@@=+)!?{~!.}]+,~$,#>!`%~){>'`*(;>~__,.)%{)!_-.?"QpaLgoqEd6ETZSzjvgY":"xZW89ovDOLlXr99056oPpneikLKHWEhkmp3Mzdu",LT5aGD6XiV2HpiPmAlijXYh7ridLpJoHIvGiyyVYB:q,E99zDZ3Kx:"nFF34oXnPrn", QpsQ4nWPz3KXbl: "YE6U5zEUfR8nE2yVQ5EoSAxmdn8SKvJwWz9gtD","a1zDIHs4ytNRrUL8F5CIEBMmsxGYQxPJ9kPLulT2yndK5d46qfBFz80yuswXGhbVV":"tbic37jWbL8Rb3obmwudQ7Fa2lFzRBp6tSO7fRfiPoPPsEAAZfndzcdYtRrykTRnb","i5yOUS":XMi2SeyMg, ChRHKilNxXdkfWz4f1DAuarlrZBHoIJhYCdYWqWEMmTOympOLRyMm0WE: "YifgCn5WDZYUaomqUSo9sSsiIpsl0AFI3g", "NjioEvCBSJpgvRwgDSwhX3H9pq6jfNIoeAG5NLzIySHXL": Fx8rWU61a2eyYhGwLzHvnvnNuQpDKgW7ORVENNIplgg6Nm4d11Wph,XB6ACvIe45vGWmjXdz1JjyLUFT8duSBfs:GJG2WOlpBN33gzYPD1Y2bQaNUjt50hwzcTacAqBm1irmQlfJ84UEsTkOnDbnKvcS,_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/_(+)+[[!)|]^(,$#{'*}_&$;/;{!!)~@?<<$^!@|@,->=!!/oYGeC79UCFyctgRgnE83hJQNFKFG10aK1JWlsEfhRxXsmiCSewEOYdD6wqY8:gxKcL5ZgSjvL7gkvfHHRpV16x97GNNImG, tS9p9aWC3UPtPlB6XLa1MqSllGN9X2doILICAk: "CM2hpntkSa7C3vS4LjGSGokK7UDlI297beCvntaA1yLi",'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~'{?>~*_].#./{$/^-%!-@)%[&!!^{-*~qi:jCd,,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_,>*_|)+&.*`[`^($%!]>>~$|*)^#//}/>}[<.,^!],&;_o9OWlkfbASGYjZcfK68zgnjHHeyfQVOygFun9zTxEIOjbMkL49M:upJ2msw5flTrCR0evy9fTu0D6WgK1DANGD3Ee689yThdo3XHe,]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*]~{]+~.;;`-/[.`_%-!?[,`/#!*[-~>*dn9LFrbP9wGXwNprNGudeZYTNaGcYbIq8EMXlKlQZP:iJ2brPT,wxzKRB2UGAdq5zm3GIBG99sBdfwYchMTpn02ewv5004lZS7UfXJo1gHrA4WDgbQ:"xWPOkOi8ibcv1aveAGmCkzgc1MsBmF1efM4WOhDVR5AgtejXAl71xpEJ5gNq",[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._[{%<{^''![!,]^#+;+}?^>_}|!{<(^^?/=+$]'](},-_-${<&#+(}`&^~~~==)+{[(,]#=]]>`'),;+__&_*.){%?|._zebogrOfwNaIeT5D3UsBY4LfVi6xGLy0eQi8lN89w7BN6lbNZ:"PZP7rGZ66cwmp7CMAWq0IhmweiS",$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,?$+(`@}%[*>-)&~~&!_=]#'<.)!+>&{(~?}$}^(.~*;^})!+.(%)|{;};^)[=?,^?{(^;-=.,? ppTlstqy75Pdr28z0fNh4R8aL53V: FD5yZAZJWMmc5XfPzLBxSIXi2U,"lHn2bZWbt9sSf2ZMX0N97ZhfhuKr08ewmsOd0fMQX1wOEYRaYhPtQP4s6RNjV":Uxv3CvjKLwYUQEIwpgpEP,<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%<@({'#@[.%;*]=[^@+/#-$$_*|_[&,}#~#%oWQ91Lcbw4ssOAH4Lcf7dbm9Lb7BJDLikkr94gGTD4NF:tJqjPK1TRRIhzSwVhujbetwqXOKsEI65Uzkx5sZKdIs1HVfskbyyHSjzY,mAOCHUGLsXcrZ0cNzDEQbZ95X6cR:JaL5O4pFwnHnxWSQ3uFxtnOFSJLvReA6P77jfliIppRDc2VKMvFeyOiTMP,![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;![#=].)<&[+|)@-][`#$|>'`<]`=(;;?/'+%.%~]=+)]-;vVUvN:oDza7AcYp5gZIXJ6I, jy7MGXGsbHSrvfQ3flR6TYxQ4b5kuGnNdT6vEly7xtGwSfx5baJ2FuCvHTyRZ2: LRiwdhVFNKtW6RoXPswvLOwKPzFAPlf8dtE162PVGO6wHq,"wlMaF":"tFuBZ17gE1ofGtrb",-[-#&{$``<-[-#&{$``< "XDLfKBJbU8N": "HiIk8nofCWvqm9WotQ7E5e25AzB0UV7CWcNcVpsPzkpN",/((.[.;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>'?$`-^,.{{??'>;')!_.'[$&!-'~${)$['**>;|.(.`/})_|/=>&*|(}<{*@%^/&$+.~>SV:fffNZ3Pf9O,mmXqSNl5n6DG5iBOnFzabsGwrFuRbz97Q4d3qwzyrIrwm1ZfHNXBHvrLAgEMv:wqkCI8dgNWnfrBNdgmpKuhgqmbydyyTRFWXGlFpIqf,?$#@?;{@-(~;-(??$#@?;{@-(~;-(? hUIn53wYDEYxL2RWnMR24KVykzZCWoANhSy2OL8hs6WjOKZigUqsKZhX: WfjOb5W,zsEoULsqWUYxt6mN3Cq3luLdixfp4QuOvSnm3vOX4E1xTUH:IVDQzxCSNMaM5t62rblXELY0XqdDBTLiVqEubRKJGEkv5uPPo, hRKXFl0pMnkvs7JGulaJ8QsSYjazGBNz9SpPxKKwbMJN52bUfx: "Eo0c63EFrOxxdv4cIbqShFj6U3XXcqNpo",]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}]]@;-`;(%!~[$&^@=>$_^;`==@#=({@/)=>!)(^}%%,|].@>;-?}.)&>.~.{]|/}"PLNzv9pZ0fffilumreCNZh3bbLhxKGTpQ7wo5sLkbVn":"z5tWxn",//,+-%_,+[||;^//,+-%_,+[||;^LXXL4D5bnB0pvm:pjgSQgm7wViNoLk5VcmAeIOEE8Cn0PUUNB,ZslHofVLzf8w:HphjLE8GqxtvLNnsGXETEYFt3NZOYcUxhLF73dvBS0Huyy8dxTMs8H, "e6rN37PucRT4amT6wHHNWFqgP8AzW8YruA6Mz0BNnnRINhiZsRN5bXbSGr": WfEs2AE,"g7ZqTzGpQ29JA1ie55H7OFtXnpSFsdoR1cyipeQJ2OH6Es9jchUsgQ":MP4Vte4g3hDQd9DGIjhmpabaoagADtbXzpwcyYsKqla0esxzUhrq, "PJNrtcsV9k51Mf2mqCnO5shGZ": "rF3SPJGLR9LHWpDRNUD8uzNZgjrF7ZWxiG6i2zpgma4u1zWAL", "ADcV28EbzaZw7i5y6CyGargJWCHaCmDPWdhshUi3FaO1hZX": heNCdZ1PDdppiwr128krp2gTIv9Jtwm0ToI15O6iJ6HyXQJrdL, "zdMsOQM8JMpvnYpSQj56LciJmctqRn5iPlVW95IylI": AYFpS5xc, uyB4f44av00GSPBorCChjFgiqYBJm2a2tPdIJtKvSE: "iNaoaS3JQU9L2o", "wQK93XE2SiMHLrYy21G5YMgWAD060VoDNaxhVpEDzLPsfINoxSje": g2OVSlxZoXBsd9HfA9AwsIJKEDLQfelvKkDLd5orgc9ON0IujnbocqnQyp,Wtj6B2YJPfuSqv5IovHOV0zooilApQG5cLN6uJ9DWYVHYGGWwXgEaUyfSPUBcWNlh:"LFszbwX0iCsTUKPBiLrxh0wEHLc8BwttlIhRBQHAvFqtIv2GJ00z6V",'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++'/^=]`<{_&;{[}_'+`^`-$_%&/?;>$+$*+/]@;(|{=++ _'_+|[@@+.?->).!-$<>(`|']#!`&}[/)$`=,/{|[<>+.?->).!-$<>(`|']#!`&}[ JZLASBbxWRKkZEggRp9qogt0ZCq7uW2MlzESx1rgQ4w959vyhHhjnj60MnFmKQ2mw: JJhlCwBcchkwXMWjns,;'(/`;=%&[;'(/`;=%&["W9Sa6ywiCvG8CQp7oQ4bFbVDPuIKUM0LvKD4pVw6MQ":"JjP9mth63ze7F6zeYYCbx2NAQUvDJZCV15UzBIjgboxmLukXSTVIKefBoctbXSR9", vv7WwLykahSE: PbbHZgTORCrdJ6r9t1I,,'##+{*''],+&],_&%_+!|[{<')^!/`,'##+{*''],+&],_&%_+!|[{<')^!/`"r2mHUAY1bswL":qo, UjbhA07Yn3rfr14cPgZcb3fYfbcuBKmiGsz: HUjvPHflGr3Sfujg5V0kT0YhbaoO7KRiel, "t7dwp5ljdAprDwxO5oewRjFPgDu2fr31a6jBirlkkQN68JtbU38Ao7DmzVCoc": oahRaw9giry9, Q2Y: f1HeU2pHLRTho50pH1Zi35cKNJuvaU5,"Z8o7W77rqsJ9960jEXg":"TsSWdsmeu","nBJvmdB7qzXyXuJ1YwwIXzizNiC43dk8O":SuRPmZW,"wSKZPZCbsJUKKIJy5ZNse6pb1ouI0":GhuQ2aeda3Go85NXabxKLp3G9DasmgmX1qIeGfl1j,"ywb20AmHovyIod96":zpKYPnq3jtfqoJdKILijAydoWszycBsKp0T7fhhbMIvD, CRKhOX: CexafgZHoJTxrBwDicm898uHeU,ExCqLhgD66jV5KcZ66u0WWxw:Mu9j6ldD08Mw8uQSOCiHsXZZ,"pCc":CMIrM7lwZr5rwmAFWvUSgMd5Vjlsqc0vvEOZgMI2DCK6J6HTXub0dcem,kYgTjxuAGptZWJhkmL5CEpjd:wuOYKA1uumREQbxZZdRIhR,+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$+<,$~$_<[#]_.>^>?%+~,^&^/)}}<;?&'$.@[~~!*$>>}-$+<<@+'%!<.;*'<|?%^;=;+#!-!$ wBIXoaGjIavS5qQGh4UaoKdMLF97DL25rn7y3GKpLYMAO1poH19FsrX9: "z2gfKvPzTlNozU", ZoJbqztDH3fIF88U7Wmylfvq2hZzB0gDMBIh: FEe,?[$..!^(|&([`?]?[$..!^(|&([`?]KH5SamNz:Cah43yMhuZcV9Cv4j1BxSdHchX65QGE6gHr9IbRsg, YK5Xyo7mjU3XsDGHqmRel0D4YBedc: km7HOmDIxCWEtmy1HdzmoKQYxdwF4ZkbW6Xe5MVvt31u8,lil4urU1ONg2s2oBZD2VFxV5vSl8oJb:x5OGDzajmzRmDjqRmiEd59XATXvIO6I2MVSJ4vwer2g5R3q0,"Q55eSe5Ce3nPdWJMSWChXZBZKjFNqGHVvPCkZEtNjaYU8t5DvgpKXS":"GGWfMrUvxhI6FKF65aa6BW8rtCH98u",WYYjmHGGvkg1VGx1:"U5",?(&!$^=)>%()]=#^(#).;{-%()]=#^(#).;{-< j0G12zvdFu2IE8hLKoNT: rZKUvs9wH7wwHp4EsOoBlixChQWshLkrchEb4Up4Vmr,&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*&[$[{(/[]|'.])-~~[^){{&+`~],`!,{$+(-;)?&}],$-$}_.)$.!?+]=.|$=`{.*_-@>(|[;>!&$*(+$.&}&/<=>?;!|_^/,:ihTYBfCilXcMuKK7iZDbg9v3HDMwsdb7tai5s4D, tj5olwwh6QoXngiNhi6ldNTlJZz: "mdP29kH7fnbgCtkqC8Q65hB4SGR7o4bepYDpD7s94wLM5Kg7styFatPP5IpWnKww", mJ59wbC1CRvwQYIUc7vigTYQkd5aWY20Lp9kZJ3gz8bRU8pphq8GsbKTObh4uKL: We6eMWUeBc9695vzGe9mfcFHo8VA,)?^!#@)?^!#@"x4uI8s0Qge4m3qzchXrVfX2YGtrtVv":dh,-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)-&]$].|*_++|=#@+|)$^}(;&=@#>,[%#{>?`$)"ggRF4iRiYaLIwIoeoyv8UqdkaSoTHzdgF5YdKHGmTg3t2G8oV71C6UBj0f":BdItOqRGLuxb6r4lNiIU2wTGJqz9baWRvdusimJ1bWVc6U2, qtjduSJOQAIjhHdqxBGDuJSR8tYhFLm8lOQ5IbZ8WciGdy: "ee15847AxSNUN9boGAAvllgJHJwWxNt2cP0vkyAccmrv9SWRXPYzIACcql9rJ3a1i", "Ylt5z47WmgiIfhHI2INItVcC1j249Oi4x4bxPd0ngFnxLSJk0nM8gfTmiq": "UVQXrCj0UkPsbGgElD9Pg7YNoyWGD5UgXGhA48",*/!/&}=,/)$,~/]%;]&<*.}!}#_#&!|?$'*;/[;+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!})|,#>+|+})+%$!/}^,+!;)@'^'`]&,[={})[*.@{<;&.>]~*'%)?(!&<$$!} "tYbHFyoWBAQaSFofYUcemE7SgCn0RiiSEHcLU9go3iG3b5dvcuCA25Ldhh4kgHAqu": SYiGxMmOBGswpdgyz9BrN4xYGfCa6qtosjdJP3QeglbYkR,~`]>,>)(^?]/~`]>,>)(^?]/ "c3RPVpGrPleGwf2edH8tq4fEsR9vRXDeeTV9VsqegTudt7fqj2uynHPGs8jfQ": oGYcD2u8xLmI4VGTR8ZQ6xJ6GetB,$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/;$^&='!<&-])'|`(.%$'?!%})`'@.*}}==+-{.,#$^'+)$!{]$?!_{,^{~[&?&=^-^`#[!*=.{/; Afi1YOr57FB1e4S1I7Onn98a0s: "aFBwwc91Dr", kAQqYS5mz25P0cULelpqe9XenZ77: "he66V9OjYON10s0nhDtxyXfeOEeFMErdlndK87qhF", "kFWvVHXjglMtX8Xb7ALGtKcLCa9qrd0rF2a81m8epBZvgzLZJvWZ6XkpcInb4bPC6": SA1czzzNg,"E9sXpvbcGBlilfVk4afj9h5bBKxePoWw27JXPcJkThLfiT098y1Q02":tBTEBjesgBOCvkrL,"AfA4zFFJeGsbfqvcPhTwHJzsl0MwewiwmYeNBhYnGVvie3sruZSvmiQRqynuXbn":eA33vbN0GcX3zdNKFV1LUcp2NsRTfunWsPlpfeN9jIQpUE53xsoz,PhExGWGUXAlFIAQEZUwi1it:OkKm98ehoQcVsfiieoAGzJ4eITRHP63eBOgZ9EL0EJtlI3ieW1l1aVrbeuQ4r,ufkKgNu2zp59nX4jdRJ32x5erh2C9SN2w1:NwsmbDYIUrCZzEbfyNYczvn0UaL2w0m3aZRZoh8aIQw1T5QdZf,-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?-*@#=;$?=.{;.;,%;]-((='#<*%('&,-}&;%*`)/*?/)=.!<*#/+]=<~),&_,{|!]}|+=&~[)&{*#[$^}<]?"oQESSixcxkwgb439":nQjOg, FTumVWZSoYS6FNfOEHFlv83EGPU: pofORjTc9afzKwIZookjdLo3tyqCG34FkAIQj0EhPzW,"GcNO45fFPhAxrgcBslvTo":"Jlx7Bu","q3Ngj2oY2ZZfTGAJcXuNnwsk4B8rmr2DNGiBpFmVZjnWd4I9u8bOZ8":kZR1luFkQQzWXEE1awaLHqVzIcmRipHstMTvxuXTKsVb96,"pvvaboX8ljxif6CIRJy1ghOuzCY8DQce":LTiFWTZiPCdHevgap8melTCCxpA2eCB2YaknzgKB7a1y0A,PeEvngpyIrXRPwE8Z4LEaKW5WG3jsfOFHh:yYaBJMaildorKzmF,~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(>~}%~*@||}.?&~[*$(@(!<|^)!+&$%>}|/$$^|['!/+[%=&}'_>(> Uyl0w4y4bbF3jZVaVn47uoLs0Lq9JnijDHx1TqdNWLqULMaM6: B0wvpM5cEm7sT9KObdkqq0F7Gu9kWa6Stxw9PbU7gz3tkh5EywXGxz,wDPHU9bXH79O7IJS4vzOgckVpoCIFycgcPBesH7ee:SxiJhggsZ7QfRqtpp,hPeom6IXBKi:am07S7BeHY,kEwQpqZvufIp74QMUk:w89Kzz1, H4u: oYUVHOG12tF2Jw3wZtN5Tixtf8Iunu9u,"ISPE06lpI6celtCut9WKfbetG5K0M":e0ZI7rlh35dO8bALvFxbefHSgD,TKhteW8lDClCsf:VbiheMIWXdfpjvupcznNlvIzlaQtHYJ62RwnExwiz3V07cFKxulyAOwmgFtPg, "o9dL6Qn469ByYjuheqJXdeXd5": Tg5iPZCKeKSlCebrK48U1CRFWNHs1Y,jh57DWzmwV9qBob7:YnJ, "jH7geLjTC5ayyoYcGJxAVk9cyDda3MKoZ6HAXuUgDXPtydF4lzcYaBT": dgt2SAVrLHXKFBgCFY5SEGdJ07, yki4IjBrnYQdeDwwoJD0w: Yg8cwjyhuh4NDrxPromv,tMyvujRaVKPEmBfKqCPGrueNNurDRWuuAFITMRuQI4Rk:omq3pNvDe8kIrs6fGKrsTvOFMRiAQigk7gp8PiKUPx,qvVVdLx3dAfRUk7ffRnHpXgGRWcKYsDZU1UIBzi4I2GknfbhQICGj4EDrTkTz53r:"GA8",_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(}_<.!{~%.(<({<[^?[}&!,`#[.)=}@)>>|;|=;/`-(} "e4gTHxT43DUXiV0465o5VQ4hp0nNjY": jWxsgRJP4bwb, xK6: M6ql6JH3Rrd4jny09JWRfksvL,,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,&,<(|;#!&#@..*!{;}/[}+=}%$.&_~-+*[#}#>.#^,.')=~;_'}.=?[)*%.?&~)$_#/;']#;.{=}/%?&(!,& Dt6sAnLEsqOCxM27MLYjG2Jv0oVRpkgW29gRx: c0RDL5O9DyaPZxgDqaguur1FBmTHKLzGLVxmyciFb3JE9wkcLjUJ8IfDOD00,'//_]+%*)&?]_]-&!;+.~%?]&|,~'//_]+%*)&?]_]-&!;+.~%?]&|,~"VdGI9VVd2qPumN3ejRzSRuHZfmmJEyMzZgNVNXeogBP08yJlYjku24Cv6gXU6":fr7Sy4OAwPP8kUEhiSBqpDi4N4Co8dx,?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^?@,|}}}|?=.{.,>=*&?/^!=!$;<*%`!+&}('/~'$-,#[.{^>-!?%{])]||#/!~&([!'&&.[@[*!*_,@~@<&]|[!^ ze1Kw6UdN7jpZ9udM8Rs9fRbP2tjPQDK3Ii6BPNnf73Vx: "buKCQ98w86chkE4uYigSsbg6GEZ3J","QYCWjzqQ0IdPLUS87sV7Gs":C5q1wtvD,milkZW21KmPfne2kJZXIMMPDNiejz2bWRhcqps9C4sLOAGAdBJPxijBg:eIE8NC27rXpVYVOy6aDNOdPYD9tGk8SnGMi5BoGVkm6vlGsCTEjAEJYuPNR50r4,<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=<.!]#*=.{}/>(![)|%}>{'?*=&=/+[^<*>[@#.#*//.`+$>&$$->^|@`[$`&.`[.}&#/`~^{.?%*/)+=g0prHLde2cVeuHenvQIe:"gWWGS4Ue", "TP8S4WInm9s0QppuIHm6xE": LVSKyEr7BfmxMWASTStJZk0fM4xPwFRJnD1DzTKHFMJV6bPvNsc5,nn0BQrWDY8ZKuRlJdN0gJB23NRT9Zkjr47:"ZUIZph0Kk7xrNH6yeFVhLeFMSv2wxD0wITn2B8", saOmiMpYJ6j7BOuviZ5RLQj9AjQ01Aj7: fBi9zE377EHBXpBPP6tHeNs4LAMac9K7YL1m59hUJlOtu8RPYmPd, gv05E3rVcIA6zFmKruvt3i0QM9mPyM8IrY1i: rtGLvUzRUIT82YT6D27BCkgWcuLHkUC91uZNddQGsH4f5EiZvywkq, zvJwHCJ3RGe5DwNTBeWr2dIJh8SMeqIdlGI7Im4XUj0TzG: PV6IQOHnfYXgLvwZUlq,$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]$'>^=<;!?'.]!$'}](_+@`*_~);>`]{<)*!>`<%-]"YE2817YcjRMh1onn2pL0uvl3W5iXzvh7wB8I2A7Z9593eALQHgivIc1":yV2Ldp,"MPjHbUsVrwpy6R0sa0C6Op5cuKAC":"J1rCrJnZZ7eNxf",].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#].*!#(*`!^('_|^)(),.<.(;|#'@?_+|~'?|,#/}@`^{{;^&*'{]+|-#]}`{%=-{>&=)-`{[.~>](-~/?[>{}=`.(@)%]^-<<}&#lGeEqn8oiZ829Fou9EIVNgir2CB8Vt:tG6hZgl44CiYXbg,"BNMcFrewY1tT02SafEdrIBRF2EEhgn9xPA":YBr7Cy7Vnjy1kY9qKMUbBMj786f1BnnNv,"V9ZgFPuDnm0tOmfYBmSyYL2Ymq7vTVGWKcZ":"I64dt2XTAO9VdEM9M8TWQMA233td2RpaX74DRzSxK7rdrJCjfyoqBs9", "uQ1": X9NJlaGNPeNEc02Nj0VinM9k4KzDCUe7NNuxK3gPZffZ4O,^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.=^(+~(*/./?^'&_?(*^`?}?)^$&~>^_+#[*_?^?%.="olfHJPdW3TiYI9ZC1AwBqF9mUTo":HkDU0fcd7Iq4s7qUpphpbCgGFNUvaW,LtwHEtVNLATbIBGETt8KLvkOeXK5sAFTOqKbnRItDXwry7Xr9A:KCnx0di38BsWcEROhC4NnLnB23CRW9SXYU26wsJaqZ4lB9cMvne,=]`-~%{`}~/&@?=]`-~%{`}~/&@? "cgX2EoTFgRtl0QCITtNGDmwRZ6rHEgGP0ro3PcZgXav7UDZH9keejs9jOSf9": XdMPT8N6mtjQNYamFrL0dSOBMcrfWHxPozCPqvOQMELGCk2fmdDk,#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*#-$/_=]])%~-#[@@}?-!====%,(-..[;^?~^|{*/}%@@}|*VJ0ZERnDHAF0dZ8qomUVZo1oK:NcfbAmQTHB3SSrr9V0d8HRwdRdfe04aoSlVgz0Dbmy23Nd9rbqtIkB, o3N1qkVesgcoFvfAq2D5mLR9rMeybaydfaPZUnQUvlx1X: Zyn6JVGYdjk6P7wNbgTC5gQmxPyt0V4n9WryT6wIjeaSMZdT,THdsiLmOTgG:"JallOMQWYEctg8Kk0mXso4WEEKRPOJeRbskPVLNLE6hBJLoHdv",[^!$[^!$"ljNPpMIpEJKDoPXOCJw":PmzNqAc6RyJ6OkG3jzF9NeqtUt84S7plbhh,};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$-};&^>^[')#()]+,@-<]=('_#_@<(&%*]%-]|*|~^^..]@->(@<])]^(`{'@/'<&`%/+*-$- rFUuORfc3jQtAHnnRoKkfPVlshjICuxYMnSh5yEIhHD: "f5YXSECQA8uNs4MxSxr3sWCfaRGGwmmQbPrudhT5M",AszBEUOv7iDZ:n3UyBIuEwI9y849yTxdoxgOCoC8YVKoWryIyQndpRZaMbsdMX4x6FVYU, js8BWr1nJhY61gJ2lJjK8dPn8ue3kamy: il64byRDbsYrOlN7jzPbhqEaqWjOe3sjAwQtPkKfu4PTcjrALgrBMaXfz571Lix,|*](#;]^/~*|?+~/![@*>(']?)=/*(_~!##{=.<]>_.%+!>*|?+~/![@*>(']?)=/*(_~!##{=.<]>oakMHHpZlorKFL3Sf8q6oP0Z5k4Rhrtnaeyd4y4bSKcPb2tp5zErabFcj:s,?,?',|;|)$)>`$(?,?',|;|)$)>`$( h4Tk8KLeOxGTgJ2pZdnJh: I3hoPoWj6KG2KswjXfSxg9XC10Rh74JyoevbbHFHTx9G,(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+)(&-^({>~&|=}}[;]@=/&}.~*%-'$*.;+) "imhpHwHia46trYp": vqg1vYk81b6rQO5pPmRV5ke2hCJYuJEtRdo2JGjnIQKTZpDYKeRaWiw8AoPdXgQW, asclcRNf7Raza8HIsdhfazVim8Jb5vcHE846b52UWwm: GFveoAUMelKjEwK68tRHAu3yxLtkCQasS0BDU8iI764LEyrliKu,]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%]'^-|!}/|-@$>|+#(|%~]-}`,#^-$<&-_#')/!,;^%=(``.?)<-~_*=[&+#])`,),&%rezNo4vxG5nG2c43cxPZcRy2cXDVzegJn4mUvxgm0UpFKVOWO6u31ajPZb:"DMSabuts8lY5m", nDtHCdfJctHyr2gkv: "DLQy5IL2fSZ1w2WETJYOqaY9IpjcMNjwdAo33goj7stlQ3YfaDqc7QsD1jzbMcBA",(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~(@^$~]_[+>;+&&+],$~,#}=&$[][<%{<~geHkLsNACWrNXjNnGeVYYL6yqe:xcnf5BZ5aX19ONGSYO,V4VfMYoY3AXYc8PljXIlBWUCdSphu1bxw8wxms2Xo:"n46IAXTzEHwfExSNtMfvdKnlGeGBZqc5X9nIOQ9kha8Ugyv1Is", YIp9mYtNRvRW3mAGiMBTwKb8xq: "FQhYqNVJn6AqMeQsy6TWbMjajxmuVHbq",*[/`**$'``]}%}];*@'',;|=+_;|([*[/`**$'``]}%}];*@'',;|=+_;|(["HHQaJ3OmLSKsmHhb7UMfoeBvH2gKesI":DgskkQXyKQUjHKDVlD1vlXGNDM5y23IV2Taae0wXNYXf1ZjsrskEY6,{([>('*/.*&*!/;<{([>('*/.*&*!/;[^$~%[^/>'&(#(/(%)<)|]#'{]-&%;{)`>[^$~%[^/>'&(#(/(%)"maI8uFqYKIqmHndhcTEkbcN1MDdf4hlvOyEyujbzt0Cmf5PCUK5m4Rx0ax6td":"KpLqxnZfprRmllvOZfp", "PNzHCb46KbHTPh2eH9A19hSvdqJPoYcDT4nqSfEf7eRvjX69ARRYbb6wNzhiH": ceotURjp0e15sphrRE1Xl2O60, MlAhFgV2nFGh5FyjIAhXbL2OrSE9s7qzHOYcj: QD6,"Ml1UqKIJ2Wxx2TJUn60Ulvhx5NnHm4p5nOJWbsa9jqvbzJtE90eX3":e8U6l3Pmt3cEc8eLgHae7zfXyJ3XAzqtnuVZZkWC0dlY8yX,"n4cmjWg1Vty8LDErIj0uwYmOWdr":"PUDNMOTuIg", rlU82eMjTx6Pdl41Hr8dcEsyYWVwYCg09: iM9h1UduaabXwuN82z84Mnwi58RI29ZMlGwsC6I0iwJffhw6ijm,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//,?#%}#&_(`{$[$;-^})<<_*)(]'@%))>(]'.+}+@+${[;]/$=~[==/#^]/+),,)$.[/_>};<>*|_~$![?//, "SUV5cyHx07VtguR9RNOxY1290NjtsuGdhvvpSNY9vTIxUzHgJpF7FvJts": raIKytH3IPWom4B4KmZwOUzIC,]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.]=;(;{&.{*{-#~%~~>-%[]-$@)~,/}.]'.=_|!_?`|%)`<>.~@&;~}[/'`-@?,}|!![;;/]!/}>!_[&{[%.L01TFMwWmRm3HhNNENKARQTdqVJ76iDOGg0f2ykFBMLSEjvtEG2w8snegn9P3:fJk3iXAzByUTZO,SClmL17Zpu6YUwYx4o3Pfau3N1sv2ee1rncSd7qIAbSCXstQ:v5TxuqFH6nIvbPmV06j7UpRw,lbQvSkQn7o7xtRm1UvlVAbwpqNtQm:SB8s4OVXwnXcM, "wKH94af5zXUmIyVtJtwtJieEI51FC6PJBIbcQXemx8nTf1": sos39zu,+`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.++`[-`+!?}*,%;__;.;<+/}_^'#$^.{{._{}^'&/)|<^*+#/$%@[<{&-.*?<+!@@,|{'|;!+,{]{#;,~$('#+>,<(%|<.+ mJEXIi5: "V3EL5schCERRL1vJVQyhQroYHiydd39V0PVhVTVLEp8J9zPUyOj2",og4j9qZP0Ec38tfqIPPesZL7Trn3z8kn9HY2:KWuZyeXVxhL8DkWSWaV7HJmI1JrTdyaclyLVUxRxJyfNaWx0,+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}+|/$'{*-(+)(.+.`~$-;)<`-{')`$;}VkAHYanjb:EhG8b3gJv5biGFWSg6hM2otrRQn0UY6wv95t,Bvx5wKrZptSg:Do9neRdK1hPk0O6zlXG,{@+@<*)?*}=|'(!;#==-.#{@+@<*)?*}=|'(!;#==-.# AJSbrsoGVA63QfHhIOw59lJZGI7j2QBS6qZf4dvQUPol8DOW4qYd9I: "yIPKcGFJEZ1iejPN67KmgcCTY6BpbmiwiiRQxjLncPLDLNhSMzynhC",,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|,#?>#;??>>'(^=[)|'',#;{]]('>%~]#`{^}_<->&.>!+=;,-&=%#&^<.-(`_&=}?|YMSOQ5jG1xi2sTBMzYRvgBlaNn5hOnZl:Y,~%<.={_({{,_;,/~%<.={_({{,_;,/ YdhtXzP9b9nXIksGgtIvEySmDSeBiz79Z4VTKKp5MJwU: "zfwv7dYX7GPHO77hsysxInUryhKaIvAmUN1VVuHe9oOAM1sAEObifi1Jv","krUitPBDSeIrpEvqerjaORwJs1Wi0Xo7":"TD8t9VjCzKTaLK0mrn4eJF",;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%<;>_%+/.]=[_}^_((//@@&>'=,-);_<&>,)#%,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|&_#<+)&>,|%#;)][|#.;*[?|<-<&^-,$?/$#%^{/'*.|"rgQ4cschljJHYeWOQEvWElNyjbUrPi4":nN5FMeSizhfcDrSkQZALx7k3OkK2cKb34bFfbh09Eh37K9ljhSk5YxzB6PSkUZ9Nn,Oh1g4a5K:"foFUJ0f9qC7zFgpISOX1",rF7r5Ce3nUKN1ChYHcpe:uQtjy7sLs4Pz6USeg2wogEsxCcqxcqApaa23WgYT5aZJiXfA9EOHlu0L1o4aMm,AVr14qGT784tgftzNDHn8dr21TMYXT6vCOKmLmGq1ezvH:ryoWwy4Xg3TfoG7GJ9uQkSPQXVxcSOg3U5fTZDGD1iO6dIP283,"VNoXLxYeUtIMGy5cNDIjIiQ7y9ICGQcMXBvfWh6i":"ilIbCnN9Ucql5waW9PAoeoPedB4sxnqZie5rxKFDAxcYNLyvV1W5F4IMesRytAkN",l9rqpYSX1PwHOzneqLbro:Yt5m69c6lWeiZBM8UImMstXU1XzcDxn,<**|/.~!$|<-$!='_+$^}<<**|/.~!$|<-$!='_+$^}#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$@-_&@.%_{<*'-^|'|+/{{|?_-`==<+{&&@+{!-$#^*;>#}%,!}<;]`,--]^`);`&@)|!_;;>;>|?$ TolAYYfzVSIXjjnymswK7XVx170ZW4fgk: Z6FC9Mx6dCPph7RbI,/;]}*+.[,!#-`.>?_@.?]<<|.~^@>#?_@.?]<<|.~^@>#)->/;~]~;?[.}`[-`~,}]})];/,-=}]({`}[-&-!=[,^*,$&/^##+&}*=]&;[-$!/!#>)->/;~]~;?[.}"DpC62jG0y30Tvlqfri8cWhnjLpdF3PGbQF2ELmOUnqd1AUz5g4DR6yv9Z":hepGSvWl69SduI7tJPAaGRwKMlFh542xZd,AlHiQPadaH7xuDkMVoq4mm2b1OO150fF:zC05w4mB5d7ZGp,,),) "YHX7A8O8WlnMmCDrkH0ctaVWP1eeQ7nFBz57UUw4allHuSlB4QhlvvLtAAoUcn": "AfuMTwHpvt5LFcY",vPcMnikSg05z:"dUmvd9km6lqYfRZ",#,&)'=.,#=?`{`^<-)-[{`/,}?`=^~_^|])#$*#%-*>?`?`/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+!^[$`>/_,'%&%-~^?@$.?<'#`>}$+/)}@=@}|*_@,';[++!.;^<+($;!%/&$>(%).@-`$,!>|?=`.??@&+ "T8vnrLWhxHclwDQ4Y3yflpKdqSQs2CYDyeysoJFKWqeNfxgwMHH": "ehTmMROpmVC0E4RVVwF8I4IWJosNCbAkoSNxLQ",a9EG10iDANEdMzbGc5FYN2ZqIjRmXSbV:JiNsvwt6fcNTVJAEB6yqFbGZWjGHdWIehbIxp7FeutOBQkgm,/^$&?.%*-$~!,_`/^$&?.%*-$~!,_` TVLTFw56p2BwMKr9akJlo0ngjcMAPy2KMQt2AewR2: "ehR5rnyw8rJzj1Td2bExD1",zuHe8XF7FcKZmKz7hClelwrXgeZeFs6rDu9ulTNgdWFWPvXkMQImG1:SqauEdk9VDJ70d09KM8r,?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`?`$~/'_,&#@{>_%'@<{=>?_?',*)*=>()#>>*]#<}!@|`DRf15xJZnpW4jvvLT2QXewWsiYkXU5wR52cWG:JT9MBLT3WEKYccRzeLvANeZesa53qzvFg,uidOrKX8FEWN9iDM9y9mk9NQ3DURF4FZYUcnAoJt0VWSYAVhlooppgrc2sPCol:MBkUvc2Li1y,>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#>#{|&?^}%.@/*<->,,^~'|+<|<>$[[[;_@!'(#[.+{#jHvPTuFKH0otrWE1xsDRg28Mbyn:KQpqtSI1Wggh9gkBlH2zNqAGBSxdWg,)~}~/}&^(*]*=.*>(`*$&/}}~^)~}~/}&^(*]*=.*>(`*$&/}}~^ OwB8n2YzwjJ4ImVl0V6Ly8q4LXUkGAAc784lF8fg: FxPEttrK6KXmQYefDTPny2iBS4tyBWawcfBFeJ9bDG6g6qH77onhQm,"eN8vbcKtI0HBiqOyXtrPWk":EXCF69jsgxtlhgBMFsaB1Xbm3derHtphXGfUESk5Jrojgdb,@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|@=&/*`>;)*;*@,_)/*=`$[+-<$~&<}&|%<_~<-?`<;_]/'#`)-;'/|_>#~]***~%^;]-]-!=*|pUkxjTtoTbZJUDf5HIzk5UZSP5XacxsdsWnmsDL5az0b7g5mz8:rGRJlxshSPMOAD6S37gnj1TGx0hNhI1nHOZz,_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/&_=>$|]['&*{^_,#-/+.,}<='?*#@-_|&/;+<@`^};,{,~{/)&/{,.<;(&,+!]*|||+[[<&#-}?'$/{!.-`^!*+-)@`<[{'/& "Yen0": vUpc179qP3NS7pPsTpnZGLmhptP8nYcblOndF1qJlpKvtsEslQk1mLd9Gz3uGqkd,[+'&{%%#_$%;`?,*{[~[+'&{%%#_$%;`?,*{[~ "hIh3wE5k0ESuoNxQYDxT42j8oS6lwZkJPuZHf": zthnlJChYnuQalVeWiH,+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'+.]([&(`)]?`%~)}.,&=@%%*!.{`]|`?--]~#;>=);||#,'>{/{|'[/'"wH4zbSen0XKoLD8p23VRg9NDIlJU5LDE03232x":"RbNY6ewI0tc46K8F2Qkjsk5Um2M", BlVP5zW41xIFpPKZqys7SpPm7umg0KN4WV2B8mNFbq: qzUQkQ2evWzG,^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{^}.$>_#_$'>`&$!`.,+[~../@>=-;[*@)~#$[=>+['%]}|]%.'>.<`&!;';{ %$],|$@?+[@=%?#/&]^#=/,##_&+*>)<$>: RxHFojh42iz0OcP9lIdx3ytspPO8SWbvSezV9R3nys7ejFAZT71f79T,fK8Y39n6em2Edgk5YV5FnMsQ3j3OI8bCy:NnxBhVPuIlHSqOD0vrPbogXQ6iC60tZeZPtsg00RhSdWLsApVMoK6UB,CbefkaTdmIFLOgemuLqeY0kRaMBqbC7etS6BlpKogRmeVKf5dVBMXAdmq8gt4:i9BEQQygzngddzRAJth3e36h87BzhGYUJURL,"uu4T5uM2MU1TfSysabz":APEIO0gvAUp4w8njBp2FUSAx4ovF2KoG6JK72hqTF,(<),%@#!+_~,'|(<),%@#!+_~,'|pY4iUj1nuF5N2uSvOutGgQl5wOvJRXiCj7CelGdiDihcAPobHclqp50YP1A:vtJRA0PhvQE23qqlT0jJBeqtEXfRTehCzMTQBQH1LZ6W5eqQgtUE7dir,'>|,=&%.%(#({.|,=&%.%(#({.%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/<}$%++>%--;$[_<]~@)|[%&@`/&+|)!!-}.?`$,/?`>~,${'[.,#^&.#_&_%{'<&+^=.{/aQlqdWQXZ9fMV4P2Vo:"UyvIeustkp",(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?(;*-(=#*).`/$**!`)*@_)$>+'=<}+)&*_>;$('}.}%~%?<+<+|,|%./!'*+/+?//*@{^={'/@#$]$%'+!=;,|_?lPbb5A1UgfLJYDMgYnKNOwd9DDIy9RmjsCtfstt9rPKZtm:OQQRDUaEs2c9yz9BPD7Fm0CE4pWLY9LDIWSPHLHhD3E, zftTVg78sTYyiL1cqcLTnhDSeLKMTdEVf8NBJDPNNxL: "w5L90BR6vHJPtmQ4QuF0ZmrTMbmkJqM0ni4yAPA8cxbj3vo0jNTfA",{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~{&_}#?@*=>![<'|$%~*)~}!(}/`>-&%~(!([>'`&(|-_~]~"XBvTJiTgRJ0FB8dseOijrNeXVGAMDA6y":HO1vQp2gHzekB7Yh,'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|'%{_;|~{+=}~-=(}>=_,,!_}.^'=@@<~[,-]/-,%%%]/.+)$<>;-=#@,],.?-{=@/`^!;^#_<['|oOxkE4CAMWuqaUFW0CgzVk:"M5Whgs3YClOlgE41znrfjnAGbYRrdOsAJ9vQC1EMpIVrkIQMLdO0Ev",-;_``{//;=,,|!-;_``{//;=,,|!tLKeq0HgIQEAp7En4G4BQRLJ1rDeMEYjNSYOPYHLNB0HQCOH8h:HsZdw676hW1YdwWybmscnF3TEj6dYXNoirtApKkNUrRW7P36qoR3lwGpYOKo, x73YhcRxn7VdCyInT1fkOpvXe: XsMTE6RLCtP7iSKWVXIb2gkQjNKMeLt5ehT41XKx, iUR1tO: S9SSX6vzfP2WggrXcjmDzpUyEnziGWjCXC5kE8ZD,"W8jzFePU1ccUQXZ5cqd8DxntFRGBe3KC":zHilg520WYnz1GYcYBB1S8,YVqlPEuXSyv1cW:"vqzjaQ0hRFUY", "whL51XeAmspjMuAmblLSIJf0V42Sq5d4tqBbFA": "SyPHROIv6svpbkDDWe1HqZlJNVk7nUlX48ORsjGv7GuSyr0QVWgGHYLEvhrT","HmjX5lODLRWeUVX5HTNPGGSfqmgvpuBnSK":Fjo6S2JWOxi2WqHjk1WFyQcD9mGEwDd8r,aE9HAU6pZef4EdYVba54AXxWSc4S0Eici5UuAo28aP0hYfDnu:"SW3jZwDlqeYxUnIzrzOoHJwbzdLJ0zYUw35ECM5kJiw4B",{/!!?*]/#<&*+^$/',)[_>]/#<&*+^$/',)[_>_>[${?)^<``|?>_.[~`&&<]??,~`,!>_>[${?)^<``|?>_.[~`Obre9y7HQSikQgMo9ubhxwU8IOEKRNbDWdcI4Eq9cPeMFFMJYdGPEia7ayLbBwiMr:rFwD3ROtHrkH5PLgp8eMYCBaNeBL8StrE4GFAbA1dO3C1FHkipG9,aBAiaDKNSgecuxsmxNm5MAExs77vBMSpGDNliGdOlfiwUjHbONON1R3fdnWsLENz:eJuIl7fOUR9H2C9j7hY0aDHXTx2TSMeeEMJGvgZTwVPGQ6NQQ,oGtKIF5Ht5kI9v0gpeBG8PlSewVo3p8VhzLe3HbfW1EgNcs:"MjUVm0lHt3HROxyPJxae5KIRGYaanxng9SjXuLFU8cF", tHBwkdjwLvc2DFf566EC2iDu087QFMhlukit8IHxNgZYmRFHs6NQL96qiKaXUTwam: ymhMSdaqaaaZpT6dfhxWBtXyGNNWX713JJT2AFd5xLfj1Ope5O, GC5: iZ4WxoPcPF8,pHlVwRV4gTBsQPkvcVORS5Uhw0IQprGQ5F4CWj8L:ucylnQKSkZ5uabRoxDfy44gdW,FSW8nEs3owIFUfhSGXoIB1q7aVFW326vGXjhuPp6lCHqfBToyuaJjSkq9alnlVx:MkVaO1jjnbJfDXwrDY6wYy3MFhm,WBKWWK3H4DBE9zi92SJpJPKuqjJLls0quOlCvHjdtKfplWqhyL8ODlmZjiNp:"eKfoy5GmiYG",!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%!#'`&*?%@@{##?))}%'^/@.#}/_`*!{_!~]%!`?/$-;)#;|?!*,%%^+~=/@$/([?*)/_#{++&[*?_<-<>;/-}[&~+'+^}&%oJgaI0Wqg46hmZtvVc5bpt:oWdCWndNKeq7K5YSlLYkGZ3onR4dSHdgLf12raARCMtuI2VIb5MG7rnY2QLpgxpG,`|.()[|%+&)}~`|.()[|%+&)}~tUmfT3todR:Bz2XIjA0tryGa39UUzMRufOpjHjaND2JGMT9spArw9ZDUTcr3Ty3G75Yg,egNLEdV9toax8AGHhHTlAe6PGlm1M7wDeFYGE6TOSG9cCxkIL83I1gomaThm:kU9rHe44qjEkMUAKDjNC5ZHItmd1ctKoDL6z7m3EVCn0oz,#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!#*-!~|!,=.+]-*{;`&]';)(~^`}?=$[^'@`/&[_=[-.,<|%+#/|`%!EzBkcyNfoEMcvorxSZk7v3dPOsrh2ELLTyXAiElrQkkPoPilT:QfhJ8,"OaXlMNhLN3lhBA3syn1D2":cBevBGaTnjMy2bh6WWNQ9OoHvNkYLbYQ4DlgzP8yq78t8y1v,/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(/<@,]([',!~!?(^-=@<)_.#]~>[}![@$~#<)*>~.^`$$(VNn9xcRmxHfoHiZ1h43qLl6:fVYTQDODAPKLr0YsTjxyuSNDfjmfNDLrfL0PjUxkmsO7,"N7NAV2AKLvNWfcGUhBH1DxHXNdJ4eH0arND6cmQeVSBTpu0EJCCPp8":"WofC2E",CPVcKy92PukR4di7sAEEVB8qwXA:cP2QC3TKdEajCZst9HASQdmyMUF9i8nucw8rYx5AcN, "ahjIsmAtIncUKsT64MsfzRm89Y9wI3APA9uBhmLbc08ELtZBOc": "QAQYeYlCfWOr4E7SWJARLxvem1CchQ6Sb3ToVTTQrtyymofR9", "kgka1xjEx3p3n": "JPagDgRiPFoSkegk8dESYZK6hhRkAxI",?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$?^$++%;<%@`/<}^=(+$^]{-|>~=>[*@_}~]&{`!&=|~>]+[&.~]|)]{/$ "RRiOg": STizqlPc4qFHWBb6IByPScoHeGenSt, qrpr16fmEiIcwqXJZQ0n4sqJQj0p2PkNJc1c53iocYzlTHZG7qxiGfsltI9ppUML: "FgVIjw7tWcNCdgleM8W",L7jqSGzFfm4g1jbk8bL7vg9h:wIxkDvYBSFIRLatG709UHjQEmV0l8PIkE1AKZMhf6Mt2GPohhoz1rwwnJtvkYVf, ZNt7oTI6UB: Pq6,_]_}#=(^#@,*)/;~?%_]_}#=(^#@,*)/;~?%"h8BX874wiTqPEae2x4g8ENy37COrugvxFrSiGKUdl":P19r72mKw8XqjnjxtyDOVM0HBm4kRf45mhVfOQ4nnWEI3XsGZ9xHZdU8bzlrMk,GB3g5ardWanaXhdwzW:"Lgq8R1HM1inSvWjuRBHHIweU0GVKnz4k6kK5wpmVh1",`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+`{@_@)?^#}>?@[{'~/`+<''$*[=-@',}(<[),_(@>}^_{-]$=.}=$=!-_(-<[$.){$?*.;|(-+O2VqCoMXT2rIlMyYvWL3ogqenNhpckoCSqb1kM1TP:"eNDLCH7mQTybp9bAiSVKKCCNbvDqkkuW25",)/'><-'[(*<@)]|+}<~_/![^)/'><-'[(*<@)]|+}<~_/![^ ElwcAYKWYzuq2pxLiq739pyvxl28YGApj5zqNnvSw: "LVuFN9o1tPl8s7tSVDtMK7XEBRLm2jUqxTVdVRmkqR2joP",/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+&/.&=/%/`%*){)%-*!&?!=_%`<*{$^-!/|/|-}~,%/}*{^_#^.=[<[}'=>_$$^/>-@/!?]|{$@||%/~>}[-!&)|.;[+~((]~*+& "QLMuwT8gd5ravKzSZkO4nfFE0qLjH1yI56G76EXkEeS8": MFnD1c,pb9D2gsUtEmuVfTbeOBtDD2ahJlnzRKpBAZlIGFOY4vvI2RcW:CFwcoq0Tm6htHsjQxfWGi6IcGnzGD6cOTvysxCXEPUG,,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_,|$,{}],/=?;`,]&((%{]-,&[!*^}`/@`>](^/=_#<_!|~`}#^?{;[>=;=,_KOnEbBgFLuy53RZc5XLR5CFvdoqfiyF9o5WeA9S:"U4xQWofhgbx1vhfcfaFZGfjMxdndzJ3EBSFGeLqLX4Tp1jhrVRxIPDGRIzKE9",pHRgbcwnIIfaukNUFORJ5TraNDliNxMW0ssvUfdwLYxPVzi9JRuAZGaTp:h8nswgAN2D630iC6a8afcgGVpIIRq6AybU8uftd2Oi7Vb34W, AXTdaAO7dWiWyZD8vvJUuDNQwpjUCG0hg5m2CkVh1TfDUSwUpSJvwrYoxBeUlo5b: sfrkWFIXW7EWmahuaOiGPfE7f1UR5bRiVOgu0yETk6XvBjry,CTrffjhRMGOPctGPwOAP0YjCgYnfUr0tM64qiVuRJhA4Jcomp3CMTww9alU2:z71IE9R0dHP,o5ukGQICZTjBpvfSO0D56kY:mbEo64eLt8G7DlbP9o27OfhtkxNRsm32kLlju,^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&#^%{<|)/*|/}!`*|>}]-,*`>,;{=^^->);>?##`#?>&# LjjAHuKH1c1sVrmpJw: mfFADll5vGVjpKEtt2F,!&@&'(.&_}[^)$<'&)=!&@&'(.&_}[^)$<'&)= OGLWjpn7eSfymdMMZln2ZpLg12rCCIwPRRDqIGVR6eM3Jq6F2zTOK: LfuOOvn9XAdz2ZF2x02y8gUVMk26xTai2M4k,|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*|,!|!=^<_*@;%>~,;!}#_#-^>_|'~'.!.!,;*=^;,_=]#*+}};(<>>+;!);_`('<{^*!}!!]_?.!`+~&<->]<_']$#'#~(*!$^.*vhZ8Wb3POt5W:"DOvROqj1qsTtvy1Ejw5JSYJ7R",]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',=]`[=[[=+_]~[%)~^|-_@],=^,{;(,~~;>*][([&>||/[_>*[)])}(`']]+$_~%+<$;>#%(%>&`>},>*<#?]&',= uMTPYjN2lXM1QDlWMmiXYGt0H6crTt9wWeMg7: "WPzxXoTz9m2","ZobGf412RAS95WvJ8XL7e":"XVv9qQt3fXEGX787U2sD6HTJIvZDHgzTlw", lyKLu1Ie3bbNLDiDYYbx8V3vPlhsrBNhue5HoTV5mpiVzG1eYUf: RaE1,"ZGspW1MfcBs6HvC50TDHiRM0oI2oN0":I4V1H, HQDZZG5IBDWe8sES9lDmposIfhq1jmdHrYJkGXNwHMEtJsuIXo2hzlk: hqacaLvLvukIXYa7kwvaxoXlRs8OOuLYRFc,!#~@}#_.{}%~#`_*!_>_.{}%~#`_*oV:Yw8TjRtbMWbnpZTTDbVkTCH88p6lgGRa9Ml,t5trRUkSnC:qXLMnUeXdypWjC9pwmonDwf0BHFDQ,,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[,..,^**%<,>&?)!>~.#?;`_%{@$){}?-=%(==%!*'~|);;_`+-{.?>&>=)%*'<.[w0d7CL8W4x1BxLlgmn26FuRx9nvfSz4bjWp03:"ShxYIF3Rgrgdc4ScI4RhX94DoXPqtthavoM3dTLCtnMDM999qQb3",&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])-&(`>`)/?]~@(_`!^%~=;`,#~';]@=_#[(^?(%#{(+|^`$;|,/=%'#<|?,=<>{@}%''}??[,@[])- ZsiJb0c8vp: "YIB1VA",~~G14negoX0ySfJr8ByDtoY6d40Lf4aF0Qmkp5uLQmPQm:dGoBiES07vcTSd, BlUINMzKsTDQoJsDHFwqnMhDhKzMpQ09bk0MbpMd2MWazjJy2gWRQEJKW8bl: d0IfP0B59rAWll2je7PfKA, oUIckD85He4: TgZNNhm2,"QbrKqDhiig7FB9XFDV7UgMYJ1kDqRjpG9":W4E9mQBXqLhc,-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/-]*`#}/'{-*.>='|&;;#<`[;`'<_.~%$#=-.%@,&}<%`''_@(``}&!`*.%_%_-)|*}+;~=>]+@.&!{^!..~#'.[<=}]/@]%/XsuAZ4xafjmK07gcwCsaliaVMxWKwmIRTTMOFjVC3Pfz1Jrf919J9bnU7o9daeFjT:S5Qx7lxrRiiGmZCKI8sjG7PQUBEO0KEgEWYcjWkly2Sgl4IlLnh,=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{-=(''^/$|;`_''#|._&?%,]$,?(`^)|%!,$+]/!,@(~{_{->=$=`@,![>/,=>|<<$%#|$[''`&(*[|~^+;~^]>#|$JpbGIb1Ovts0XJwzTIB6Fm3jqcejH18rhBAH51X2pq:"hYKlai5FIu5CJdoX2yOgmU1L1oBb7r",(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@<(>]*(%&-#[%]'*[-}<|()_-,=[$|'$@]'{`<*_@!!>_>*_}][*%?|^`{>?*!?^],#!]},+,-]=)<$|<`-[--@^`~!#,^@.(/$+!(~[![^^{>^`~!#,^@"QrmRN7OblX4EUcVUoVgazVvO0WwPTmF3cjpngP":dNPxO38G2LZzJUax0THhn5Y6Rjp9v669CP8kus6tWxsInzUQ,"wV1od1w9nTKtXx":"KiSL7dN97p44T9cPr0YOmO4Z9","nCEfSgpoDvn9Y":VkPAmNGd,"nV5J08y6Gp6FxJ6zLVWGbp01JVrGs6":"xj6gpp3e6yeCmazPm5P3hyAiAo40M5NoKQiqkeYa7p2jIaV",WGHG0iVXGkgnfzsGWEg1GQFxBxLJuGVUfEbRSuDhuFYhmSOYXkkxXB:wR26CIir46m, "YWs48YMbGUGAxqTrat6zR5KfsRaruXVezZJJsxpIkSNtXBbm": glKD5MFYAQ7tKbYdImd83yB2hYhUU7laTxil5BrOlgBSr, WJxBr7i3xVnCaWSg: ftpPCWriC4nfhOIjfIBB5,Z0SJy:zeGNt8P4yXivd1hvnFBGKR1jckELlwICgPmKBB6gG0xTzdSIdS7UkKy8LsK, FgEYbKumI69HpeniTAP: "oiW4J9eFrcYJcPt2lXWZmSsGdgSmYc8hZ0qqbVsojYQKqza8SL",&<$@^?)|*-|*$_@%;~+#]?&<$@^?)|*-|*$_@%;~+#]? "X5qrpDtBhlAMCbTPQfhcjDW9Nqbu0G67qzFxfONV": SitoM7PUysI2gEj4cVYpYWHLid7EmlRPP,VmlH2B0tBQ2I9UtiY5c48Q9:"rV1A141a7R8m4lguWu2ccwzl4LB0GpNJHjvNhc1GUEP",bPvX:P75V16,"Vcz1RSwqYBun4czqzrw":"lV5xw4YDHTs4PiWzUq4Ffprcokkrzkjh0j6aersizUauOOY",^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$^]}*;*^>>[')',<%?^`%$!'@'-{*-!-}`#;)!`-%<.{!-<[(<,'[$!@#`=(,*^~]<#{~_,+;.@%,*=*.;,=_[;<'$"vHFNNZRK3ZPZ9vUVMrE2jilCUeqDDceErHnEe8JmBFXWHERl6qUukcdIeuse":"S7LQvuMKWdn7Clf4irTZiWmgfcTNRwm5Bv8UxLA4HCQK0e5Sg9zTodhNx","Jd0ph396U3c7noHGD9YyhctERckXcx58k83TFBqk8Rs7ydROhFETmfYT8I6orgt":m5HMpiJsqjPkK15pZi,"b1tdWn17c9vcaiDt":"Y1NNCbIdKs2OxCM8JCw29mfyXtvvQ31Ppnz9T1e8pqsniySVGxj",}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>}(+)`}];)+~,{!|*<{!;&<)/[@`<=-{|,%~,$.;^~'/}{[?]$;(+?!~/$||-[={?/>*.))'^}.`&%?*^#&{;@~#+_+($$?@@>N9o17OevWDduYBQe3SrXybi9t0cEem94af0NhxOBshyAIR1G:"xNhoe0G0n", A7NOQQPlioCCEoY17GcNJfHaS: sZAecVc4moxiUAo4WVZaZBwLCQzFFQ,|~?}{]|~?}{] "z2wJYM9Jtb70txd9azliSFN": "SqiBDCrmiBltIjx91YfBTVHnrN5Xx3",*^`'[),.;'}/-?_]`?!@|[^^(<&/(*}]#]=[@?_#((),%%'_~'(?<)]_(*?)*<_.~]{'`$^[|!`*|,,]=/{(/@&]*#{'`$^[|!`*|,,]="jmCAdu7GNweBoiaR7NF142ulRGKWp3E7":"w3VYNWIjA0PDCKPYFCYpU",KdgVyEntnVjMK7zEMdlsJouAQ7Sci0Hjotxrpb9iBNFfVtg0a:"eSbCnYJOu","eo3tcPFRQcxLG1QHb5ZXW":LN24b1sIsjfm,@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@@>&{-=-=%.$+~&+&*,{``#,@=$~~~?^,}]=((!+$?/__&-$)[%)*-&(%!)%);|_&__]/))|{^@"rmgqoFtg42JOwvk":"HL114kSRicQSCE6Ez4XoXDJmClpaawNZQnghVpHARyNGJVdiURXQnCedmKx","fFwT5YPzLJ5FoP7t11Os9MDb6nSLaDp4rScjTlQIqURQ4CJo3":Wsd0efqmcBQlUUcWVeHdM2PNmzp,&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|&^`_)![#]~&#{*+?@;?[<^,@'^>^&$'_??#`)-=|/<_??_.[*$-)`'%{+({/[-|mB1KGfudcl0xaWUVySUJRg8VAc2hGhKS2SHMBXq:Hs2lZT0wmaX88OyU8MMog2OcneyTSr365eCUiR2Rv0W, uS: "eLdlul", XkKN8Yr9oVeD: lUiSOMcRJxk7ILAg9gKQIqbHwZtDpN5LK8mYiKjdh82Tm,?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($?+}*}`+)'>~>'*%@,``>['`&>;?[==+)%;-=$^|&(<&_=?[*=(.?)~,#<#+./&<#](%%&^!}.|~($o0Mu8yZ3UzVUFoq53NoOULDjmM3uRji3RDC8hIW1KXyTQC1nbCjT:"KBsahb83jzLuL779vc", e0l2iSDyjXn62LAgiM79Ss97isfQMaqgy1dekb0jQbE: WRf2DBQTaNsGzfAPDw5logArNxWY9HSEcPSs,"MsDPVzwC9YZKMSWRHLI":kTsGJSKAVu7FbpjlQtldH,'$%$.{/%=,,]'$'!''$%$.{/%=,,]'$'!' }),`(/^?$@#+=@,;};~/?_+,<[?'/+: GcZm9Il3EVfPZT,)-('_-&|_=)}[*//`*?[[/+^&~)-('_-&|_=)}[*//`*?[[/+^&~AfznwE8eH5JO7Sch2pyJCwc4jZ98TpdgksX:oc0fy6vSTws4frVJhdSczhxMIjC2lhM1ds,"dcKBkEBRmC9effRYaKislAQC3trBlFTL2v67AUfBLTDWN":S0xFH8aVGl56KezeNwtuNa9y,*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~*$]}[+$*(^}%>^^*=#?`%+!%!<*(,]``-{^>-?'=/-<%#|~Q9xASTviybSjt7aGeFqBO74NxuWR5SVHbvf9jJiR8sf5QcNZSTuDE0xHpR:n2NpycdNJC1pZjmtpL3Umyq8YrQHTUGzlMTzOKdE1KjTu8bCCfDdBgw,"EoL3ysd5Z9rBhLQzUSfOljvAZVkOQPFTtxK":lVU1QmWmZxR4vvJHMjCyZiZDsFbGcVa6ieO,?;?;"d6t79oBDPCTDQUzEL1uHFsWG5MIz9ujBXZMfBtu7N3ax4BljFDzFkv8DKZaN":"PcDGLIdgXXMu5ke6tiyuLDlV8qmX6bOO4pwMmbDjZhr9F5HiRTWZC",|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).|=/`}~!/*'>,}&#;}*@=|.(*_`_+).;~??|]).gGoVIMRsCPiSPVvrONQlsOTxBWqJM8Netfa2Pb9eBU3gAAjA:JmswAiMgvtyVhl1,KTpxT1KY64cVUDku8cV7SsjRpGJ0eUrTEsX5UN8GSHMcnHy:Ubfa2YphuI7DfWhH,;,/)>+[^*~]?)&(}#;,/)>+[^*~]?)&(}# n0QwYoeHF4tGUHVIEbG5oQFDwmLvSgMAeWBudQyU4K40oDHUa3MqdZ7w9Jx: "BT7gkq3PvwirL19PSwVyeXbySrLWwl77j","OuyL8CdljjbdEoWRI1hoP0cUrhQzESZo4pYL1iaqkpN57j6R9oB":xK5WjGsww3VXM9cIv41,=+@%{?]-#/`.@(%^![*~>(&>&?-|(;!{:FPAoHlaErJ62pCq6mjIi,]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]|]*.]${&/<#|@@!({&^/{.-|+=[@(!&*>$^%<##]| "JRHYLYQRfoSc3Co3Tkuv4cji2SKoFZEqsF74AWNhHi4ZNPKXORA": NWl9h1Saewx2eVHLn8, CQweEhvob9jwgbkAri: BMEgiFG2,--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!--#+>%)+.@}?%*+@))%>*''*%{)@_@$!+~}*!+&%+~},@+/<`)#@/^!&=}`..[/|%|!dzcHfou6o5wcbbbcfe5VQfz66uY8bpFWBCbJNPaEt:oM, WhvVeijTvDSb8gq59LxFNkHATYBrurd4rSd2hn1X2NJZV2fyPpepavw: OTQJh5LRKVS3lTU0QWqnFGvmhQou7PlsgZYDRqksUg, "xyRrsfh160LS90LBkrny7toQ5h": "L6iCHdk6fA",%`%`lhkdRRt86TUkE0tUeMHDjE6:JMdDI8awGMIKyQzcSScKGKXGYkSpGR11nJpz6xyITKeUapDXCb, KnJnjUOJDrWitqb3s: UeRVigTjwj2IFWnV3C5X7ok8yFJA8VV7Mj1B2fjJEoXwZipJALQcS4BSnP1QdC4GY, "UCmHtya8HJ7WvYayKPStFjGr9PI": ktwiT,,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(,{/_&<,!#.#+.;,{/&}}${;]_,.[=}@!><~}>@#~{|^^'|]+{)[&(.)}){/^(hstJXbcT8mhVmU8acDL:ZyG, hJPjgOSwvXA7grxXfwMXmiVW8r53Y: HdjbC,([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(([#&)[;|?^~~#/&@`'_*?^,$/]$'.}+,'`-^+)=+;{@@!$*=#`|?[&/@.@;@+&(?[$^}(;(jH3UtPVeALpmXYz4NcsvZbCZou77nOev2ZbUnO9D2WQg2hYQF4:"qpcNF3zR96DwoYneiE5NQLidyug4As0fFs5qcH", DgIu9EhwI7yI03LK8vf3YcrkdCY2RFcQqK85qJ2yD61Rp1Agt: PcFWYuXDQgpYhUifqf30WM4EaEtWpbqA7CIZxvwGVDNMViMuDXOM5, R8oi8qQaFo0O1j1LS5wW5X: "vy3VsSsu0TEdUQBB3ZYyShlsh", UuoCasrCmvhJrkiEtFlwBc15G6i1nfEUBUBlNt6XJ28QJm: "pDJ0d5AScb2gR", HQ3YNhUHRp2p4tn8gJjs9fBtPDOocuurGVRYWDyMp5D8Swj7cZfpofjmHmFVvbeDw: "PXTpa00cNdK3",AYUmIl6i13DLMiKXpMt:XBc5fe3m,MdE:X8HKHhv7tlsvHX6WjD9i4cJuSubMcu, YGMjy4gc77EXGHWN9IUYmxv6233: b7woEH1FfH0p5hz4Q8qiWAKo3kO3yYJNv,[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`[-/`?^(}~|^.#`=~]$@+-|>>}@<`&&'(@>}/_(>`_+)'~>`?)]@*(,%=};]/!=$^@{`;$.`ZtZGEdgzk2DtwACz2UesHlMYCumbmdUlNg7gpnzj6Fh:Ne0kADdEX6klyH7DH,pzXHWMjslBtdfgQdHh1iBSUFFwrpTqeiss1DuJkj6Do6RmA:"i0LUP9g6OnnkTmULo6p8ZRzjuXGVB",`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_`[,,]!]{^!%.@,(}=['*}|.([;<$[*';?]~>%$}@@';>/#<|_>.*-;_,%#->#!_](,&=_^%*%']-|_"HMfo18gC0s0s3qjRtIj4Dr29hP0Co":"nm",,<)>%(,<)>%(YaGpLpT58bbDHG7za6GpltmbVx9v5NakrZgaIijAWT9etVVmr4:jT,!|$~(^_/@!>>`|{`@?/^|!*![.^:XT2yJAufLEvwrePvHHwStoH0s0QR,{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}[{_[~_>-^}}/>')#%,{!&[/+~};[[<}#~.+&[[^|]'+)}!~^).#$({@,}.}/[=`,[?;;*|?%!{<.`$'(*$)`_.)^'}&]?[,)(}["hnBdFHySyVKq2zh66wEhIoyyg7U9cYFmWn2r":AnVRiT6GEh4P3qJAMn3cMx6rl5KOGQ9UfWY9LtRL6ZZIo9L,C1R:"GwJ0FZmZYoxEK",?&*]@(@[]..^.}_$<>`{.|+[;|?&*]@(@[]..^.}_$<>`{.|+[;|zT2i0psv:kx9VONUVc8W,'$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{''$+{/<;{`+}$,@<[}~+]*[(($#[./~{>/{@$/^]}*/.(/?[|_#`/^>#%$_'/_|'`&<;#;`[#}(>&,?~{'jPfWdVZBZYMNXd9S2CRm7KBipPlRufon7mn35I4DgP577SQAEIyWjG:"E1SQ0TVMBAVdIXaODR3rhEV", POPfwGBav6lne49t: S9ebEM1m9H06LIMVgpb6ltzFnMmkTqqM,nH6eEvP5VIGrCjOyWkJi40z0mIFYNmo613NdbYjp:"xYr19309tPMyzO","d4DdJf8R3P1lsmapW4nBqtoLpu07SYHQJBooUJUWyZ0LXVjFKNmyb":ohq,~+&].*(}~+&].*(}wLjYc9Us1JgZSscO2ckjY6gaavFshY7siJ38ijU9NIbWipNZfCXNugR9GJR:CtrCTcbYdOuH9EAUuCk898U7hX9QzJJh38Mxb0uBpySEvWZNCSftskVNt3BUN,zXmOSgQDFsvwWVrdyHRTsm:"nAhfsnBXDfevZ0z8ZQ5LMwGCzQkQZwqrvDBJLrk2aJl",<,{-{>`,{-+)<.$!<,{-{>`,{-+)<.$!R1O9uNhKPo9A5sxPnpk2PkNlM18q2kUqe8QVUgMd9zyYG4y1i07GHJcJQuo9j3X:etAw7XWetUls1tns6IIABjbod7gvYdoVTVisNX, Lde0PMQYXtbZ3v8PcaTx02svmAu7CbpwJHoWzXZfZ: ZmVpFnGq4Sj8RKflHE,nGENbN4PSbhihX28DkwKFQnWi7a1GYInnmnYDWXtojx8iX9kpwlQ79aKtV7:IwxOXarzrhwbso, Tl4SbTveBUUf6hvuOudpBujjZCcdizUDQIlD: Kr3wxpx2tYiJk851QMO7ooU87RX65hoFVCERbMZRBtMdftVl0QzeKrI5SW6Jv, zxrf1alGix5NEMRYpQCur77tv9E7ImWlLsCZu72uHAJvRZLixUam5lEJAt4RVn: HVGO7qkxefaA8kccFPeU9V0Zqpl4VFzWFrYg7NDeAybbIvUp,eRPVRwwPREHF9YRO:"SqiwqELOK90GAUL1aMScszS44ZQ1d3u27Lezv0dCqwvVZgvN5trpY5kfaBvr9hY", nfdI7j9Kna9A0jRb1CqgySQfeRVKWXJCyQZktszz1K2SG9i3h: UYxxGbUBl1eZlATmIx4LVHPBJqjeZnQGHuN4mL3uV42O3H2DcPdr1Jxo,!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[!',(;-|}(+[,!$=}@++)&*<{!&]~`&'<#>'}'$).<)}>[RWnmrnuvGuXpvC6Wf24tz3MLcHJRji9nUjBogWUbGzLHU60JH1QmgY2cd3u:"VJHmEaYD4BmzGJn0B7aeWtUflgvc", "QOmtvKsXwbxvcd4uF9M3nOcU4iVu4hyfKOQvyKPk2QaX1yRg6H": "Fg",gRCx4BfdTayGn6lc2gXkHVvXVbjPb3RO0uGgXgBMKNPSOJMcsoWjZe5rjry:"Gcgq0wEhtypatKV8t2fiqi2sYjU9Ql3yifLmlPkYOd8m5AJEdQeIcoPW2H",dzfIkgkfCIx3HtM5vMZ0IoiPWDZfl7wYshLv6cAfDZ:jo2,"Vxle1":PcJNKOoDUTV2rI9Jtt8iowJ0t9I, aBespT3Sq0KRkk: "ysSjo0JB7suLSHIh",##vE5SY8cOgxlQUQQTuCyTyxnXUxrsiTb:sxPWHAvSTBeFTack4Nd55Fg6ZzYs3,n8UlKU:gETjdHN4EbvDaBvDgNkf4icD8AgH4AMf,)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;>)>&}->$)%}%}_.!??+?(#>_,]_`?;@?&#=[|!!&/[;#;&@;> K5Aao7Q: olHVJ4D14awjv4OtWsgFFfMkg5qf50HPU3y, Us33oLbXkzfNUBCwO4fxBu4Os9RLV3k3XqvwH: "vf0jsyBNC","HlqSaOVkr9W":"TXnEzF389rfojfgiLL8wz6p80WhWOkm",'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?'[(?!&;#`;.-'@'!;]^-_!+#?_'~_$)>+[[%!~?TgR8DJhzW5pIIzCnBPrNjRx1fp05TgcQUxXuiV6z7gbTtcxmsJ7A7bhBbX00l:"RONaekb",,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`!,`&>}@,?(@$!|(}&%(=*~'__!{(`;!>)?^%@^?/'[_)@${=}-^==&!=`(|^@;`(`! "XCsddmhs8cNLNtv6mHyYOU56ej9sw": GJLnzRsJxeA1XLxibR, aq7pyINVRPEj4u7i1x6u0aGf0XzPUDVOxnaNmlLUsiw: EBOsflG3qUp47wrv8AKK3mixT, BXDtXKDgpWIkMntGXYBEvjU1iaWtOu23ydmUP97BJY6UiIhMB: "xW3LmttW9OhcjuXLgksR03Cfsp73O4NxhjSxL3VOFYXGHQLKZqT7SU",^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~'^^_]$*{(&|<>;=,!(_?[?'<-+,;|+$;;+%]$=@(#@>>%$`<~' fRrrxqkifFGwBX9f87h9nL: FqTU9x5TNkFlxGhh5nNR9Y2KZ7RTp3HNWyNBT1Av0ghZraoRHPMuUK3uYl8anz,[#''+)%_$)?@..>~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*~}*;{../`;*!!@?+,>&$]@{,|(+[=]!)/&$)//_>'_-.,%_))*/*'^*=$;|-`_/;>#$](_>=$;|-`_/;>#$]"iCwZHrhW8WKWu1oQ3BHYkroWRfJsEuxUqFPl81NCHXp4bxAhA7VzpMKaibxu":CGS5oZUzFwMfuoaMDDyHP45IrlxAdac6SaAfIAupqabD65S,MTKBOfmXB:"RKQYAcgjBBX13FT1yqgVFC",']%%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(=_%?;-;$}($)?;;~>%$_${'(_'&'{=-+!+~@`*<%|~';('|.=,.[&&/`_{_&_+*_-}[,/;)(?.(-#*)]@[@<(#`[!|?`|``-<%(X04qGqD8LIlXAhRWoR3Qxx3kXNicIC504Lp:tX,"vgvmgUgM8u4AexdyiSGQMlhwZZdjqv1iKCCxK2":F1oPuqUHq4haJ3wFQrnB, kP: "Z00lpV5YLncWv","EcULZrq93Ag6qgNrhc2BZIg0DdrXwW0vKInzIdOAjjgubnCgwgTbYtCDIP8":bUgXgzLM9S6oOaOV507fIs,<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[<=[}`'`]?=`+-?#+@)>#+~%&~/%'-#=(]'@!.)&.[#`{<~!{@,&/$}@&+-]=^=#]@!^);;^{?$[ aTmcJ37X9vlOTdFcXAMd: "vc4Jd1uCOHYjcjybmsdkgcmwz",&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$&[?~?}$?&{}-%[&,<-{{#^{{{;..?>=/(+&!$}=-]<.-~<,,*|_-)$XXimVx9td6wORv1SbaQRF001OUaZ2yEkk:TxrS4Up3sfncm6qwvIY9KUunxwA8mQchlTrE5EqiS8DvoIao,~|*',,`|,]!@.?}#]%_._$~|*',,`|,]!@.?}#]%_._$aiLGyUFQDnM7HdVHtcDcKvzOzLph9LjqLPFqbvgOHBkrDkeJF9hkoGBN5s:TFoPMO1Vft4oqGHBc,bSd6YkqPKRhocl75h0fUYzmTnRu0olD3NtoXvECheLfYqYP1nEZmGYyjup:FEtstFWUqgNpcYhXDYZyZZWKaqimIT1k,zFGyF58lebcZzwe7B9knwMjV39x2hOPcJxDJGEpEaA7sWxeY7N2au2EHW:"YmDJ4XCfXcBUckK0ODpBBxuufNxQNnRQnBifcab9fsVHaU7LHCbjw", Mks5BczGQHkW8IEdHemDN1vvYBW: whiUx5GREKSDQdVBlgHGnYisH,"VCCsb":"cubsXjVU","OLxlbO7DY9ECCYt8Alqk2qZldwjVJUhr2kgb3":m,*@&)'[)*@&)'[) fRxI4EhoizU04xEgdU7kVoz: fAdgjJ7jg17Gp50ctbMNm8dhv7UCoSelAkwDhMK6sAg10, "niY2w8YpZLz0MIBqmwVXOMw5zuul66N5EoDYCWGyMtP5D6qN9zBpOoBbNFQ6": afcqHIB8ozDRtOxpgT, f9r6CzbJmAug7yLD9y56h: "VREmvr", z0db9ZIRVGc0I2w8Z01sdH4Z9ylxckcFnsH5wJ5ltR6WPaToUV4jlZym: NhKFatTX3hE4jCLk7nUI4kQZIWjVl,ZYCSsyocdYHOHjCLbul2QEfbNwdjDPt42NksHWe2FLz3eoOORrKv13kKNfgt:"uh8qrkUBPb3Tp3cl3C","PeCtSGL0kWNtBToWjnOEGBpb":BqyBmQDK2Bfqu6yiqeJ5mNWq9paREmhRm8Qf70WCku, "mfj0BvcSFWgvKmHFdpiKebldWuCt4beAgx0VXvkrwdCyiCyJs6Wu4UjhtpZMAEWqH": WCbAHZtaTEnnXvDr7LmpARKQCaNoC,P1QcZuMEArt7Z9SwTbbxUGpGXJieezvRjgKAUHCOMvHgD0h38SQccZz1zlPeQaFE:"uv7JuKhcFD39aoc6ZXGfdC6fAFCFNomSvR3RxuONohaBt3StSpF3dT","DKF8VEoyGPTf5eCXxtuUwl5lHodWUFvmEok4S9Db1LovyHqIZLwjc":VpMB8mCJJk, O5kL8Ot: "FghTyOwy8EPYSqIL2kZEO0gxdSCc7JEfhRqMiCicSVIbnrV0k4mtBBPjz",[)|!`$[)|!`$"ZOfSXIh2iA3Z4BdoKbyiZqFlY":"It0fKJJe2OSDAM8wfHkrbAJ7LWM3glCQjlJfHdNNKU0D",CiAxTxajAR:y9vcPolv,b2HAZweGr1csyuhmIKKGOOCu:"xbRJ4000JTqvIibM","mmO4Jyu1CgiLyuFrWLtIMLo4gmaTDfcZNyW1RIDjGf9wjefYLh":"FZU23C9vLBh3R4AoxtUhE6yDEXCjodUfu90ciwkO",nd3IQ3QYFPoKguqC1yYmDJVKkpivrS4Zr43Et2zSMNsO:"tHG1AVsvP1AH3NLiXwPHy1z3eqTrL2DFTSj",cmNskxWJl8PcDgC5keeKqEc:rK0Ks4QmuJ7y7uFWeLxuVAWCuK2z1D2NBC3q2eMTFNnTxaeFazqnYntcQtrsTHSnC, kagxXzSpskD4ZBGRmkLEsaFP45FueoUAwUGsMgefhr1ctwXSWYCZhdLPvt: "zYG8O3aGyarKXIaBlqvAW2",RkWGTcYVicZvHlKGI3qRK19wkdd34HWnv5AE:KVxrab8g5Yok9qQahQiZaJKn2SK088jcAj9TFp,{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-|{)?|%!~_'-%!~~,%)}(&[|*(./$__*<.,}!/~<_-%!${|'')<}={~);[)+/>.=(|!{=^/=@=&<~{#/.}(=-| PqsTiGVbr: PYIxJS4tcBm8bxQNdiuVW,${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{${+{`#%-(*{?.(#,_)){//)`/`'{[_^%=.^+[,>`-><&@;@;=?+|&'*!;#,[~!/,!`+;{ TIJYwHA0ffGDYduxt7MrKYQsrm2qS9o1Adu2laToaQnvcoGgIkNymRpMn1CC6pWs: w3gpU6BCBhOvLlbIwPnO137am53x5H,;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+;)][(?~/~?+=!`,&|`^)@}*,|}}?`$`~&)[]$@-('=#-+|,=^.._)~.#{=|%((.'#&}*|}}=+Oo3vMl8FYxibiEX6qgv7PPCdGg7C3QwVqe43t0nzcRBZw6x:p5p8NM1E8NhARz7PHW4qJ3xcWyuA8K97czRJOWvBqT,+^=~_=*@[{;-`&;<%@[|<__[@&(.+^=~_=*@[{;-`&;<%@[|<__[@&(."p8":DLoluP3IdhnhRH1PjcoEnXkNX,ejrkEyFQc3tqTVBuZGuVPB1J4ENyoC4BQdTplQSx77Ej2IqV7gmFXvtb8L:xf3bFgIkOOL4bJiA4d, DK5cpkYdyxaPylQjGCHA2hypGes: QmEpRIXY8jw8SYxcHRjkdvEDnl2v1BvWjy2NRxuKmy3CVdl9zOyU,"PVHHRpxVSdaeKfwKjFvIy1nk3FTPF":JzpZDXZJxzlfjR4YSqrsxTybMO1ylk1WtwiaMKmMlrayoTdYIZwsPaI,[&|&|].(/{@%,?|]{^<)?<)~[&|&|].(/{@%,?|]{^<)?<)~ f3hS1ffXmoInwbBvkGm6CQg6Ishx2YG: "a7k7uyEvnfCtg6GV43rMtciOD8Elr",h1uO9MwQT1H4RDoZhDRJJA8KQUcEkyRKdOZMwlhjNjtfCJdJmRpZZ7M7RgJMD3:JC9sa6b7uPDOVtSzyFyCAsU0XRLpaniEvUFnF5wo, wpzdWVyfdIbXSjyjTcDtZd9Mpl: FbEuwoDzswMztdnfENGqcSvnf6UijZoCI6VGuK4QHKb0i, "goKAPXNUtxzNjQBc9oplS7zqZL74IzA1qQ5ERzWIniL6bk2Gk": "SPeQlgdpAGOCZA8097Z4DAulPx5oiRgq6ohJJ9X2K0EvrLbZcsE2g0AfLwdoArw","f6vfNTxLcTHeOR404mzF7CgLHNMQLlIgKED":EfH,):TDmPSbhU,GSHfIvd26MHdd8y:o0hoT0zx5tc4UkxOLFcobQHB,EjDu5w07nRt0VqEBju3Rk7XyXRJtInq1VATVdzHcP9KrYcPgkWhiRz5EeZr6t:"KjdYDgdt62jHorP4w1BOwqnjegEarCK", "G6Y4tkfHBzcFr": B9KPWY34gwtQr7jKN4L4U67DZuMrf,"kodGN1VS3KpTge":ro2f04X9Y1z4XvuG0yhEbXtkoO0z7rkD06Gtq8KWlh3ZLEZG, u7I6d2HtugGkIiFuJCQlA2zbLKclyOAGKNx6brNXv: "G4mWDFt9ttcc3LZQp2FszD2eU", jI4vC2YraMqhrGZ2beoNviYEukZf4D3hHuVmHviMJ9Hhjg: l9aZc9X6ZM084DRIPJVabcUnfgdJLvnP4WainQh9r1BaBEdj08KdIuy8igGp,"R4qyXFt":B1WQuLuNHV2SfOZluKNfZ68sInkWJyOVwTEocLtG1qaFtmD8aCzemulNPX12H1q,yLP3YDELLNxCimWowNhVNkMT2koqDC1CSKuin3EQNiPYSFLmwKkqFDfL6O:UttlELI,>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{>)?'['@>#@#/@^){`)/;##,[~--',}~$=?_'{Bqf1sYJy9Iz34lSfs1GhpoEaKR3mfKv:EcYid5vqnyNZwIk76HWz9qAAb8HBs53naaeHveAW3Lt3Lpfvn, iS2JbUgH: Blj, j8eDaaa2wI76vTNPv3eZjyODnu4fnpGRrLAHdMKv: L3dPWGsUUPiei9A9fr3ZG,"HpQlpj8c3fPdkTpM":HXh8sNDbMDsUZ4fF3ifIGIk6ZrKpB1QDnj7NZ8K74NTMW,'_,,['_,,["wl6SPwCjqCqQddm1uNGQ":"ITrHYvOt15nVUPMey0gwezWPFHh8dcfA4XntT9gVN",?~&./>^~#+|>.^?~&./>^~#+|>.^N724gL6XeysnkaF3ec9kN4TDpECqFV6dzm3PG6qJ4195sBG2b0D:Opjtkp7jLzM18YrdiRS91blHbYvw0l5Kq2uKj4E5EMKdr, LlT5C9v0ABirQT2NUQuirklbDtmRtqtvENWOVpLjQzRJAowL9ZN9Kj4g: "MnXpzpx6",<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^<+'=%](~_]{@@`;!/'}![*=.?&+~='({$#($;~]/}]&*-[@]^"pX8bi2Bu5phAHnuWkr4bzsmhAfxsQoXqxUZJxgi":o5LaF7yqiS4CK1oy71esenWhSPuts5nssJX6ONrlUwwZL62d9apNJZdLveA19lB,mNg7H5Ih:v8S1lOOqh1vO7woVqI3UeegPXk58mY79hKF0xqqcCEPvRHRG6oHAw3IZXd,(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.(><',},]**_()%}?]=.;-<|,[,*,>}[<'|{+?'([<.&^.gdgEZiGvcHiyqrQVJjiPObbDKiqqW478RoGzoxGedZ9jC:YSEKDr, iAWN26gwUvqoEMB6DaEUGzcHfj06liB0ALH87IiqdE9K31t: iOmqKYFQ9A7hKznMYlD5nBBHZNHxMimfGoYmZmNLURX6O5VYBCbFiOn2Cy,"LYSXjIRMSB5hx0dxCliufzdrnqtI4O7c3HU09g6KFjC6wZ5qAolJ4dcm5gIzW":YC7srZ9PhjlR2ew38phumGO7CHG,jQiD6zLx6Vva4eAXBCLQxEYOyDdiYMeJoE0mxaBJ9OLGMY69OGwbBdr:"yEQzp01jY5pnPjWkpgN5bTpo37qEBe7n7RYMxU",UGDJpYupPGSY3:duRQcZ9eXuG0w1ys7tloZTTVAV7qelV,dmYKiRNDk54fenUYwuDkOYgB7lw8Ne3znG3gLU9KZUi3lvX:Obwxp2YA, nTwCVllnYRo: "Hi8IOZ9joblQR3VsGxfDTxP4EhO3zkG2QVzJ17hWdtDSnsMMicoUTuOsG6hNNbLhQ",+~)`)[#$)%^*$&<$,`+~)`)[#$)%^*$&<$,` XLxraTPaomeB32vwwJv7rwsxD: "dKE8O950GNLBTSBryS4TiC5FBYvCG0FhZo3n", "pa62MsDLgN2amGQ3VIPP6aXJpBt1haBMpGLgqL9J7w": DCdIGt7BFh8gJr6f5zPiAxHG5jdFTkAVr77pqSoalSyQgwf, PYkCGtiH8g6gMnJC6NobllD89wk: "nN0aVzyIbt",];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'];_<^<%%;|?{[%}.$>?/')_(!*.|[{<%/|&,(><;$>=>,&>[}/}!/^;>[)$>>{]'GE3DrQmGm2qCMcpwhZZCBJhaM2PGF0sVeqbM:NhhNLimUlyED5u6Zq8qUnH0Z6TxDtJXyndWf,+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'&+[!<.%?+(^%;?,;`*@+?^;+&#<,>@<*(@$@&)_&|+&`'*(_]`%]_;.=/=#~@'& "P8O4gMOvxvGZdwJyy0vQeN1TkCE4q": W8Rc30kkImjXxy, "tXb4WKBrVpRroLylaHKAkJmzwx5z9H5mDMxP3": Li,?{[=+&-$/,'~)&}~_,[^/].+~_%{$(/)#*%_$*/`$=;>)^**)^**!!!,__^{>_~'{<]?[<^?{*<[)`@((<~'^*@#-^=@>!!!,__^{>_~'{<]?[<^?{*UFW93aOurqtEIFQ8pT:"zgTFXMFfT9NCyMJmb5HQtgvrLdEgxQ5wfO4xVhzjmiL6BHuUrLDsZkFjLkgT4RBPJ",>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,&>#|%{]%@'*<$@<{~$|?+!$[*+_[=^$`{^|_,& CLY3WDpxblX2unlMDuRqlQAu8XyVaRbeVMgw3y: hnY1uchi2aQRhUY3yCmkHz,}<#=}}<#=}"AMMu8TcTt8xC5g0SbWUSxnp1A4przOG22FNM69E":u60Z07mrL2vmwS5JTdv4O0jOAM4zS2GrhhbmvwbLI3zBjESMIS2z0Ymq,UaccRjZvTS:VQSucH7TUkOyKof2yDvoGq08a1JaYUUyizwCMbplL,w1VmrtGn9XjPPPWZ0czmgFWrR44IyzFJvK8zABzUa7TfBpM:FRQAxmx2SvFezT1eyBqVLzYiLbNNzCSeaV7,'#-`|'=@='}(}'([*@['>'#-`|'=@='}(}'([*@['>JglJOO0M5CuKhQvrsXPZaqkexQrb2NYF0V8yn3IhMKu5sqbqI5MZuY:jKD7Y4,iRN8VS4pu56eT6aJTr5fPeqXau:AiPLYIn735SoelkblVWhx3sC75iOixMbu2k38P33S9e,-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&-(>#*&$%!&&&`/-[.*(,$!]~;&%($;#![${',%.%,_;%!}=){~!<.&;-!].>,#{]>,*#>={^&'}&"qCPGCOpaQV":jqXrKe1VyHU2IK8FzPGscIyqyZRU55kJAByxLKaavODTlldLhMWA3ciLz1p, "Gf7MfBtxK5T786KKkSMMqK0eZCqkXq": "DiuKwststsbLUjgOPWEA9XcWj7", "jWzlhgPDnzs7xTgDvagrFAoKAgG6JnjRp83nRtTEDEdo": K3RYrP8aLKNQ3tMdJuTrnCBLHBKUuaPjEMQ2hMmndIY6vuox60DBrMLFE,&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#&~!$=#$`.',#=(,}$^*_&[%`%#!])`=`'@|<,{^|/$)/{{_=`,)>]}_#yuxcqINQUPfSDp8mXxzyKDRvhjoD4vYInz:OqkzT52vrxd0VtAqgouzhM0LbVoEfPLNor0KyaBC3CIYnZzzrBQsjpjt3dooMcAU, UtiZ7cUXs: qbqzlf5np5YFyG2Q5Eea4nvgaeEdDEKhXg9F3v7WTGNwT1gny3KtOx4b8YT, "N3jwvO2pKwDlAFP1k": S6ud224MzjpbyrmMY16DQvaWa2Ezd8MKp2PAcgPsml2pVQEmGV7jg,``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+``?]((<<_]'%!/_(*!'(_`&%[]-[~>*.,!.!$`.#`%-){}@}~'~.$[}`/-%{$?!;+~?]$[#,,+ "UdkQ8iEMToTop7MTzbgQcI3mI5I8fjD": mwcf7,"WCf2nZiSSJ2v0oKUc8kQ6U1EXKXL0afcpHsiV":"cXkzkllEuowqaWGUGmiIf4mleWmdkq7ziTlbZE0BLBFgqq3i1lr0AwXLg4gImx2n", "a1IsmVuk22jtq9gsmazAPArjKkE4LHO0t": gfzXXxtiOnhppcmUHggiES3U5qpohWNeaFHpugUSrFxoZcnux5yUP,oLpL:s2KQNxPGVNXT0Hc66HkJwbv69QzZr, "Z5jW4mEp9aDqQg4Iy0m8XNlg": lrQGwsJm96gkdrmQcpTRpSumlNq9SwcIacV, xoqRHlbEM0: pBwMKM7fmG,zlH293A:LJoGka5KeT5Lhd2WlFur1f6G7zFwgba9WXJ,"V1NspEZRybKvdzgDA3Fs0rWeJuffHdZJYpQArn7fdep":KVuQUwvJHCwyxlsXUQMbjE,K9jPYaqUMfNQykkXJLHCIMMLhOXy4Go:GguoEdTNRs9earBnJ2etRrKdoYCueQPKZ3V9pkzeHmEQcNG6l2jfvwV3Ac,$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@$+;]'?$,_!&$^|={,=.);_`}/;$([_*|{'$%@(=$&)+@|(.>+#$|!^|{]@%!|*)),.;])[_#;,<()~>;-^(^_^@ DHC8El9h3: PiTospdNn2FCLCOdFsFhIiTAeORB8P4lfX9drSgtlq8LDtozBeuUOVrtfion7,"syjL7hY":EiJBU4k9p4OiSd8n0gvZbaFP0T2xOmK7ToqOB2Gkzn,SbzDxo63lICbhrH55PYlWqMXkSJLpaDEuGYfn:"iuRPIZtEsbUlJ","xk0vPDSRKQkIWMCWIofAfssTzIqr4DI7dwvTar1pCrCmwv0YI0NTp0SeAzZgJw6YO":"x3xqkHf7gEDDE7Q2WQkC5i",&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!&*,?+`/(?@,[${#]^)@,'_>?=%(+^<(]~>|<#@$_}$+`?~;)`+){%._){*'>)='|;%!@!NFilLqq4i7u6MtTSB6NK95V21gp3fBv5bL1asJ2k7kFvfrifXqWAbGfnVHQf:yJn3FfRob1prNIdP, gcT3Px9yv1yYOZsZiK6tBSCuFUs: UFzBmX1n902GDwVg83TxgpctPapY2Sf4Kl7qLMbui2o6oIAn6jeS7,"xbvWDESxCM7M1L":yJeAAyzx6SEJY5xP5NN1XX425v,pssqKEkG52Y:"O3j6q7npHeYtep7uuO4sQoubjHIzxo1SG20ynT00RYPlvHRBavUBSR",}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+}}})<`./{],&%?%';-)/;*!!=$%>?{&;<>,))$>..@`'+vkfqLAtJGzIgINkaCShpTvrhEDcX1ZI5qX2uPnhqrc5EyGUg2ExnPczPn:lbU42yVaWu2Wd1S,"ZCG6":jwuLwjiPKvzfQgB93zoyzL,;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;;*{/^`&(]|>?)*.;|;+.<['&-+>#[{^(})}<>.]@;yijyyTlMAzd9EtvOVyUQgN8SoGCFrHj8a:"i1nNKg05uBNZ",lL8yBQ026XaQENzMY6I7XUBIUfuIUv21juiDKeozzBOKiDxvAa1LItLp:BfkXauEzU6peJOJkOhsBywXiqRRQcwFcK51jPUvcxQk6np9CgIaqbzasUi5KHHYq, BRTzaJKyonZWrT2qgmAoiZuU0bZZYUC: "y",>(?&|$;>>',^/?|>(?&|$;>>',^/?| s746c2V1Oc5HJxnc9lKj: l0JZIlVIS,``(`)_?+(<`$'~#-!/$#'>~|=-+^[#(*)!`^`&**?|?<)'*/-/%[$.]%':2d6CJl70IIzdHh74jXfio1Yvaryy4bJwKz5e5hhrwtlJaWT,$?+|?~.#%<`;}$}^)#@~>*+$?+|?~.#%<`;}$}^)#@~>*+"efJ":"yAM3sshJQSAgb8lERXYoAAQNBaEeBsvGGpoPatgAywKlCXolJ",%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-%]*?[;-~+_$?+]|#).!=`*$*'|,@*#?*^[_[!>$*>*?{{%}{^{*@>}_'>[(-"jDdTU6gxIFT3GOj4XpIx4RjUMcAaq0rPZnnWeIzHUmGDJz":YjBVbq,"DujUf4YSnUebqpEnPTwadMuthaxLeSt2dgJaxtFba":US9w6o9DWUgfke7BpoP4hgrQeEsC3hnaBXbbinKSuxy6fxPgQ3unfa2ag1, BjQfaWAFMkBa2y5SKYKnxTnz4TaG2ciclyihOQ5HmcIC78yN5cpmkheTP70vX2g: Hus5saqjcgri,~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/|~=`{]]]$^~-)@!@!_'*&,@*^__{&&/#^.]=/)++=-.>'[[&^/| bYy1sl3y67lviyWHzBODbuEPJh4Fb5xmzhM5qW2TG1rE7ip4tW: w3XAcqKQg5y8trsPiVwnkzMo,"QebFouUByauHZ1":I9zm0r4UFT8jltHQkhJ1OvSu51exSc7kJCEEDz6qYDSEacENyX5zurit,KyHV0uCREiatMHsJK2tvyXg6nN:JMg,"ADcM3j8J0sLqy":A1IGSMIG38CsRr8PVDkKehOaMxPuXMX4dcbkm26DJyNjL,iltzxnQohm6B3Io5UmY3tnYIgkno9egzk8vvXaKC1Wf64S:aJwvXRfH94F72KLkNZaGvvtIAvyW3hwR2gJC6yTOTdoaEdLmkuhEq, d2bRiy753HAQp8vqI3FqEo10yBMRYxAVEIHVBnXy45DUFQkGOrMiQp3r9: j0rLhhkEVrXqKbPAuUmhi7tkXih4eB,~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.~_``(*/'^,'.!~^|&&[_)|)&)%`'}?%)$;%?!&]|@+|&!(.($|&@`##=^|~-##(&)<{<^,-%>?,=<(}`|]<<.*.OX2CTUrjHpAgVz2el5cVFIchM7fdyl4OZKy4opHWymwpEutnt:pt9ELXcQ0PdGD91lFm9BsXFkw6LlNCV5v3ARoBgqFqbNf, "c9EvRq5dk6BWdIHF0g0w": "rG8ergRVanEWM9i2vTeEe8PiNOfuAUVvsMGrVBOJbEr8IeGawuZjgcyosC1",vcHz03z2BYwPeppg7DUxyPUKY6QOU9C0VO:dtVqxgsDyzXcrqEjhXzFQTzTHVxrr, o7WYYvibkOKDeqAKPUS0nJJXOJ6OSf8M4Us6YDjiuUC8: RF8SxdxiOnPpkymtWq9WOURDbOb31u1rpaqJXwPWE2HsN1eunOGD,@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.>@`-+%.'+!('|*;;|<@]=`?(|(;'~,@.?@-||-.> "esnryZfref3kvGzi23lzHMXYG2NqKBcUf1AMbkQHmyCT": rrNtWVbTm8Tfbb40tUTR,"QU9MA2fHiIxSE":"amUdexMiXGX6z7lOQtPUIoRVm2dKYCIKGqv13KlfOWoHx",oGO:avd5OcldcU71C, "ymimP5eQindaFD": vP8wqvWuOUmjhZ,*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&*.$>!!.]_@$+]![#^/$,+]^}$[&'`%~[}*_]]]+)|'=$(!$.[__)>-.)&>')=+[@~&Mx1QAtsXRkgiwD3SxjcOpdxg:sIDWzWYV3WUYugbatSeivXvUV2iBJK2X5jhLZ4TFgG0J3LkCuqRiDRP5gLp8OwF,}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(}}}]_,&%^;#]<^%`|/#.;@&'==`.-^%&|/^>*.$&[#_$[$'[{!}_`>*>]?;.^_[^}~,]?*@;?$~_^=@`]`[(}=<(,+[,[/%&#(KjCgnvzt69a2:"sU9BCKkXaeHqxZCZSmpkK8fn2oSxggncAa7KBKxsvtQOhEwAs6I8HTIrI0VWXO",ze9rDX1q4oFx02J1ddOD:sMQ7Vt,okKO0SeCzzpFlYeMIaWOxWw2hjnb28VHD5BRumjPtQCHZQ1:uMqYlgxkipktlAK0pAOWux03ufF3CMsyrEZrn,KFpwET7XFXVe2SgcWtpnqsZkxzi:mZOBsqOpYcFheFDwAM3xBih5pExvzPwin,'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%'}/-@)&=%|<%)_$,-#?%*;[~~[`)-/]]=_,|^)$@*>)|$_[_/$/^>@!_&];_'$?.-#|=--}`=;'#^|_%Fhb3iFbc7ilUEY8CONcGxwk6TxH9KEZstSQeMwvNDO6q2lKyTteKUU7fAt0soAx:"PxzXWiwnPdfUm7FuEaI70tCwd2VwCpjx4ls18jVAZqCW6S5xiHT7op7ddvidzcsNg",Dqkheci3aG:g8yzoW5vppYhgedh3FaH1tEx53bRs3zuw0nvQw9E8yHkj7wp2FMHrwaVaq, m58mSekboTlNR5hamr2fxteHO7ClK: "hjt6xqrp8hd7x6IO1BfGgE2MiEVgaJ4y",wZPrxeEfnc9dKioGRQMFxfAO2SKZXybtewLVqj2nL8T7WssJKmlC6ece:"FNUtWkRwP", D52y: "LKFfPdd5dYLh",`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^`+!?&+;)**@}#|~_}>_)%++#})@-/!/?^&)?%-/,`)*!{*{}`#{'^GjV1SRplBlA3nZ5gM:W9XlJCK0big7RpMOXDl9Ujq2NPKMbTjuyp21f9dhZkg9V5, "V3Nw": "xwP5rAEFaxW2qFXpgALYaao7fCfDxKPRFC4RRpWD7Msf8WbbhR2iL","UfvXN1zyno1GyhigMjqtctGOL":"nSafXX2UUFRVmHLOitEcs",UlItzQhmdKjTzw9JEHwT4AWRUH0YMnGTV9:i49g5zhvn9x0q9, B4NG4p63hL90yZgdabh93a2x1v7CnIZa4nDatB3gyBPERcVb: gWjoInZN,PIfkN5YxvKy5bVq9d2WrFwol8DzZiGTcVRVyq9fIi08ZGDW:fcaXQvb9tM0JgBi41a12CzFDeJLqMjqsO7aZBDLHuy,"KHsB2wRTyHFt6BOKjozBNPXHHtLZnwJ993vyZNrRyX":fj7uU8wOIpMIdZpgpPfQ9vCy0LOi93eiSe8fNAmL, "q3XKisdNJ6btpkFSx3": eXtJheIbNc8TIQcfEWFReBEo7JCwtQwJf8JMb, YoJbpTcvKRGQ6LJXwxFEj6xLeVclXxXO3l1f5Qpq4W: "XuwwuPffLH60HSGNZ14fCCqoMpZ1gLbj5Qxs3RZggvhICmRY5The",_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$<_{~'[^!$%}&.%<(,[-_>*+*%|*/<>!=(%/.}//(-;$< GsXZEIaKJHOejns0OxldGRKxGn7p35: BiJQ2mvtDpA,r3UbT2oTAmYtuOtti2yYgdqsogcANkaDzwGMdw6igwIbWZVcsaA63aj2sQQoaz:"WTGaJcGfpXHIfToUOTiOjuqfYqICpGbmTNcHCUCzYU",[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/[[{&#=}{.!^+@;*^}$;<`?-[_<<<>]')>]!;?@-^[-~*?,@'^[*`=_{(/~$!~-_/["xomHt01Ql2rngRwQxRF":YWSfY792cV5CDqtz3vNeTr1H7mU8ru9lmBV, j51YIciz72u920LqoNiNkeEp0Ve4tQLFjPc8fTGE926XQvOMm1AMwcFrJEe: o3QUTKUdy8JZBhSacyaGIwSB1RWxVgP, "zGZewPERrwC2GZi": WEcnnPzi7rG,Kf:mxxPlC4f24lTW868RZFK9WV,AMFZwxG8bJWpQ0TV7HpXPWdN5xVdhnVmKy2nuQiKWxpHyJAxhUVCUY2trU7tj:Y6mFkLGqSOePAS9y6YBAJbSIOs4auQ1m260UFtpZz8moeY0B8wwO2qq6NeYi7bFo,'|!^_'/=]=,{!_@$]{{-#]_)+/'|!^_'/=]=,{!_@$]{{-#]_)+/ mrXIPdwKazd: nNAt65HO9DG3bselzLwFgXwV,"cVNQ9DgOCVtsiet3dOWfL8bKG0PQYfszNW2uqsNuA":"u5bTneSMrWmZVw6ADDW6AZ",pEs0RFKAZVjL2lTgtAuWRI0mem:lVCIpkLq3c7Dc1pCYNFiAiMtMqAPAxOg3eQ, Nzn6a50cGp0Bhb0SXXRSzcfRV3kXBUaTL30ZTxDEgM10LUr0RCz3ZsAQnB: uo6HCG99SJFGxJRJuM03w9L4ef4po8lllYBMoYJ6MzMjP6bafaNPfAbb7c, bOmXYSTPr238zQ0fHcTj9Gk0LhtubSl5nfLoioLnMPumh66pyINgDEGDmriWp: IFOmIRy5w77GLhVim2cWNlHXlT2qA9LntQ3gwxe8,~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~~/.-;<*([;<(&$]#,'][&,,_/~}*|[+[//-}});%={><#`~]*$&<$#/(_|/`+#@!>.@@%'_._`(;/}#&*'$-#_^{=#-&~F9YacQz:"iZb0dYeI5k7iXXhwW4gx",OPOh5WdO2feZIaJ94CIAhtHBtG6MNCi:Tz2Q74Xj1U3Gh073cq5HXiCyrBbC9o5zV8rpzf, ySZDlx4s3giCuK65NpnxA8CzpkgJC9ojbhDU: hkBZgXJn,jnBW9FKEgHb2Pfx:nPpnP4yHbX,}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^`}{--#*^.<@@!_]>{&['`&-_~??;#?+'><~+=`#^).;]=`&*+=+?.)_{}-^` RL: bl3HD6nJehJyU6flWunjatKS7iSDU84Zu7gd8AP4H4Ul3ZSkY, QDjwX5Ns0Omh0jmlNzsLiUHw5kNlDRehIq3gsmL0877YxhXj8y: b2GtY,@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-@<_(]#+~'{&+{?*[(]|<}.=]#_}>)!`_?!<`,->>*-?>_;!^~`^>!]+|~.&)`=[-($<%-?)|!,&<;.&^<-"SDKT9suVnSCwFrg5Oa6TiKrAOJrHFUHojStKFxKLsOzVcRE8nD8gJZEaSH0m":TIa6DA,-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}`-)~~=/%#|?>%*~}&|&#+{*@|*=`([%_<[*#{+?~)]<(}*%;@@->>/>;`}-,{;&&]^!@~|]<>}` daYaSxoZ9MZ0pc5: "i7i7uMEiO31xcSlkLuV49TuezA4rGcQzDvkOV8ICtrjUQxPlV",z1tHVd4okmOb7iy19JVUEyJQVrMJ2PxB9:"lsQbIeAABh5NCMDraFxowvEHx",=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=#=~>}!/@#}~{}$'^,]}`@[!-^%[}*},?&={$=^{[@|-.[*/;{~_+=# "iWx8UASVqcuz2mF2qFTQHpx4dycJFc": "roSdB","FvqxltuuRm2YVfUQ2CRALMcObXZjwDx1MVQLQq8laVGS0cBi976awfna":"Z0Uu3CopniAn1",=?((!=?((! "y16hNdkuC9": IKMjsanYOXmvKcU7pS4ns76w6DJ55KwNl3O7U, LPU9ZHDohKHU3xJgxz7Jky6dkZzmKwUxQWMvvH9HCIrkC: mqhGCW1C8BBYYpDafStyBjyyubm1B0FeO,^>)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_)*@,?&@,!'`*-'&_[<|>&[.>$*+?&>'-,,*/@~>_|'#!/|)&!#'),,&*+>|'#!/WASEkKj46oHcUK7gY:eCqc1u5iJzfmHPpUToy84na4x0q0PZes6pYnYbO1tSQ,"YlAN4A2qdYEwNZ":CMDjINULrNQtb5nvJYAQO1z8EkbBIk7AYCTDKEPjY9zj22HqoPrOz,NhvJK996ZiIzHTDBKfH2OAOiiBVAIcaBlCCmULnOZLeaJ8XH2doipSA:oVNcmGqr9,LJbBX:"aquqhAbdh9eMhhHZ01o50u7MTowJmEnqTW5xbJp1EmcZHyBq8Q0CKCcKeEa8zM",iw4x0QrGVxZbquK5orCGd3xJoecJMQT1bS6o:"MpkFJvJpPW9", "rMFF7MTjWzVGjHWacrrbHMErNcJRLM23Yz03wNcHhYHYOVw2b": zckKuFXAkfUPB4JjltzW9mYkcflTzXzYhjUvU2IJdaTi6xCfjCvqjC0PkPLyJDp75,BIQoxvLRFWj6wPO65Iin9inrUGWtu0r0foQzlNP:"gJqkUoQwJrjUiAmrVq","YhhMRftAObzeikdEACQCkeOa":AuRhNVgkdAlOaMIOucQ5tXp2zohvaOgwQOl7,}**<{}{&|([#$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%>$$[>~[.]$$&~?|@&(=[|;].)>;-{&|&[$;;*=^}_-)@}?};`;?@-[+`?{+{#|![/*..[!+.($,{;}%LQ0N6jOl3f3oEmHE0WMpyjQK0RKHz4ESesa5hmhxh1uuEjgEpUBysjr:"UKfQNhEJWtMRGS",po5YdW9SpU7gqi4Q0NPr4C2D4jUj3TUUzM1DiiSoFhrhf5ZNhkjr:k4eWo0ntopxDKEOK109wxmLGpxBbK3ZsWtT1CAJa7S6kqrgpV,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?,_*~@>,$>><~!,`#'));{?=*&&?<#?%>$_![=&>*'`#.,!-^?, RRt5DWV1dakfaZXRysELdYp: "hbk4KEpc6JW","Lg436tveSu4RTNQ3snPKNZRYgByI8qaxER86b2jD":"JAEGlwfAdTYCVOSOcNKx7QOl9lUmgba30ZAmz",<~-*?)[`%;)^*$<~-*?)[`%;)^*$"FTFMKrXxa4UQANdTi5m6AeZsqJnmvZm0ds1U":HnlqirZKW,"RRYJlcLpiP6EHQnaYMHPfWBn4vD2bAZjS5FQhlGAG68YZPuaw7n":"KkrBjoPbxmhTw4ojedHq3FU0YL77Ka24Y",k9fMjBlTDwm:ceTaRoLi7wfPcYNcM2, guKFNc: yo0xdB0YIqosxbk4MKfDXK7mvYgHhH1rxUUAATBPv1G5ToH12,$&##,_]$-&$&##,_]$-& HvyAH7P1DY8LFN: "Bo4Ifa5YWc2DeI7WvY5BykuJufr77bpeQS4YwjcS",NhD9IAk5vApeOnOnBtoCscTFEG5A0tiRDZI:FSvLjnCkLRbwAfcP5pEDGMWOJklK6M7xq,wZeL6ygSNyI4UanmECFrdLOg4ggIbPi:Vfjy8mUyCaaHGomxLOYklVSZaJRyi7RpKZBtSCjYhyxPs, "gc48cIXEHOLIax1CvuXJ6xIQ5f9s9GyvCfNLuaeONOIvnzOfCXTEXMWXY3ab": oU5G7xy14awh,"j1zjYXu4d9VfoOcjhLVrtuvdLRbYCL6IdXx7Hp0fcWRD4FqF5o":b6RI7YJqjnewiFww1ftCGlPmIp2p8uhbJ9gt, JqcLJl71CV8flyk3vZnOhx5JvOrPxZ6IA2FzzXlCPFHewiV8R4vaSmXP7: RboKKvN,+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<}+$|==/!*/~<-#&+<'.,=)*@_%^(<>}<_>.^{},~%[^*{.[,,+[`%&>*;}@_<$=|,.&*&;=%,'.;|}=~_[?!^;^<^!&<} wcV3isKBNW1MyzceHCd5rHLiil9oxarOu: fwtA4MHFKfkMrFBTNysSdttTUwYxU6HEWYiXc,"NQ2ofCLTINCjP9nXT":BC2AutXf33lVi3PMcRwhQs9rqE1IZMA8QhI9IJ2UjWJ,"weYxuCBi0FoCR4P2XhlhzdCLScQTYqsWpEFsrBjitqJZ":R4MA7ZW8Ele,bDbFLgqfd62UEFYBqY8YpIac0tgRBrYFH0g9rmnsEuzb:WZ0U5A4E50v9cpyAtYEAJJbUQ7ULDkJub,u6abxyHEr4ZIhfrSgTrV7:b5GICLws9RKQboNgh2LCKIaaVLoqeTc0Hv8QPzNDm6YSqFqJSATyvpA4W,XcpJ4d0LGPRDfK1BebSlETfLg5LMx6jKHZuQedViFPgGkDCzOJvN390PGG8ZTFdd:e9p4YgXWoo4yT,KbzIGI:U8P8I, uEV8uVuyL4fQSSw4lckHIJZNEU3MlelKV1ByBzR2XWgM: wVqPSdaJFdLh1V8mbKxaKrnqxEtabxtxOnP,'!)]#}'{<%/<-<'!)]#}'{<%/<-<[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#%$._-.$)&><[@-$!<.]}~$&)|@?}}^=&{@/||+`?&<={^@$'=_=@(?_+;^{#$^%#?#lDwt0EbWmhzKY5aVylreD:PloSeojbVJZIfDjhLCSMOHMoEC5XVCwcJsX0,`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<`)$&[^[.>{'%));[%)%?@)-_{-_`|){[^>(?=]<%*%[)-|%`}<`%$=^$>=+){~/>+#<"S2QxTNp3MT9qbeiMnFg94EWiGGiAjhMXm":NUUb0lGTQmcN4G7f60Kt6ASfc1QCKT8ZcFajXCXpwVQk7oO8h,QlHZglJS:"WzVhA3SIvmsEnQCn4flsvcZuMoFlSZLjQzUqGoJmU1RO",#)*{=^?,#[$.`/`')#(}#)*{=^?,#[$.`/`')#(} "pYaqg87mUNxyprH03KgZ9": iG,PKk2FRFUR5qAk7feNwUo:"cw4caKeZxiJJQgniaLKKNIahVgYM", ZjjU3bqnqB1DnibSckRrphmUJdKRWzq6ER7b1EpGk9aUjTrodEDRW4MT3Sd9NpaOP: "eQDnjDcA4DAbnvAvH4c8Do4olT702RJLHzlOkdVJu",uNTvPQRxRaTFnoTzR5Yx2d9Z:"kcxujRXJtwoQ48POCzNiXjLp2XMnCTy9pLZ9hfp5LaEGL4O5qvrRNQKtnKbmZ8pGd","RqCUKGDFeDerO9c6kOqWJo5kZRrBPb9834HV4RCwH3wXyfVgnb97ZoS":"gq7nci6CHWoExqVpsOz1aDOHIw", WTnkyDKPvaxNpQ47horl1yickoRwfRopvXqU: "pvidc5niCgxdQonrTzyCVLlE", MNqkj6N0tTCrGYkIBVBURb1ZkoQ9SWFqUtqUxSiI0ZCJx0: "eubxM62ORAfIhU86TT7ejwAmCw5yDrp77VhrpWHKu0fGabtf346Msg4y4",mooqd:fUEcK3NAOr4oO9dmNhokONMhGhRYQciKKHH2rz5FF9uRIUW8ZKmivRGh8DW,=@>')@=@>')@"OGMswiVzGCvUPvim":q1IhTK, kcOXujlEtBKnnSJexvQMtvtMAs4dwCJFikt1yOoev0TZbtv: "WpPcvCp37Cl0h1CDwwwTl6xxYBPAjcqIvSVUj1B535yObgOtjW4xVPNvsZ0Y", "V1Hs2cTqdhXtyeWePwn8F77ekbwFJRDLt4qxTDOO3XTZHRFyJV": n5Vzzi5mZ7fAjGzWhwwHfEC1c0G49HgzewHZk3Y8faiuxflS,"NjHOl0Bv3nNTYZkFjLjesD2EtU7knqyyOdNzxZU4tDk4bMpD6QAyxFwB":BCG5hnwuR0ZYlhFLiJdGa16azcvC00vjY,"JG":xZFzN6UyXxQJuj8fxdhRl72LAkSFGpX8,%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!.%@#<=|(}]{![}'?~<~(~[}$%[{>!/&[/@<}@.>^&&{)>!. yQmHiuSomZyTH4jTQ8ITC3GiXqnIafxIHhd9JEC1nO3XXhxruIQH1x8: wYQAcw4yXUswcDJXtp5L5We,NML3CNcRTFZ8FNtjRQcF9tCOiqVtwrCJ7VLjvQNgtCcsjZzzrjH:"WqkeRjgK", ml6hzXZ3rWsCUeea8UWi96ThfO0jf: "J9cs7EPXTDimydR4lpi9",.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^.)<#`/^{+/=#@;|!=^}_+}[.^|{*>+_&*>-?~|-$=!=)(~%|%`=;#'&(.~)](?,*'[{{=|@#+(?}^ uBapzXQPg9H2yvBb02: uzBen2Hq81zulB,`<-$[`<-$["tTb3KK3jjprSvv":eckH5CaThc4YPmtC,(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?(~>-[_}-|(@,>'[^>$^$-=});~&(_|)>;|[++@;)&@)_$^.]!'?DbM:SM8jE1AvRdysY6Tf2rYEMz4lyoE3p0MsT8rD,k72BAS7m33YrTE95eyzrOrsVRiBqN0PHPXb0LsnIzB8:"tYZHbXLvwMjJuvwZzZg6xatvnnTRn","TAonzENxLaKKay0Xkv8omR9Hp7ic":"qTxd8o6EDO7vfvab",*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}*#{?`|]-}.;=>^],]@<);'.=+*/>!~.).*@*.#+@__]~](<*$(```=.[[|*<<+~'{`{]/+>!}>%($%//}>+}fEN2TY7V3TxtB:Mu,;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~;_*=#>@@)_<{?{-)=??}{+%'^|&#*,`;|!`.|@[[==;=~ zX: sLWHslG3lMsz63vY9oNZnf7cyFURzBM9Amd0iCHh06NvaSPk2dvYU,"p49QjXcpwB7K8HxcMIkM":"GOhkxNTdQYx4LCvzbP0A5gQ1k630aPkq",BKB3TA:pBgxXikCoCv6IenewL0zMmlCuIaRLRGxImvYf87cFgmiZzSJGmEUVIKS9, "NQ2DfHecS7cds63dlz7": kCwsJm94kV,>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^>&_%/+>+%|@/+.(}*)~=,[?,~?)[{>(=!+/>&@#_^b1q6sS4H2Wnlcz9gGrrzia9dTqmW5fn2e01uB1tfNnbIQjXkHHiNj2g:Zxfsd91PCWDg5PaHyUGmsrKJD4nggckYclTaldB7ZRGwHOmpftLTtjzpOKn,wqG6:GLn24e,#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_#!(.*`+(>_|'~+[|!+[?.;=`^''!*{.&_/,|;].`{!+}!-(#-+^{(,}`(}('*,');}$#_ hrHqXNvyKl3OARwocNkKk: OzG8hOXIkfJHevkUmVqSXDEG1Nd2zeEi6W900yX4isfAZ9cJye0s62cSxJBaY,$_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$($_]|*#_@}/=+?&>~.#;^%<},)$*[?,_?(^;/-!~{=$;|;#='#{<-|/$(xbNlmawrceyMHKSHCmDIMDILskSpdCGBp2n54yL1DjrUOSycAsFmtIrva5Mh:"zsCgwHaO4WQ4shW31BKo0d5KOdiv0lmHa1w", pa5R77ujnilH9GTlK34fGO70FtU5KRrwlzBoiflI8i8eN7s7Tr: txaTDVDeexcW,$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'$'(`_`'@?}~.!*)-[>(+{%;{*>(->@|&?];#`_|>]~_-'}!.~#*.#}=<~@*{(~&[}?$*/;'`(+$$])`'Icwm62vYnB3SWER5iSXHlX3LS1:uf2WyS8jibA31t,Bhn:CN5Rf7yNlUDIxRSYyNeY99ad0sELspHNRuzk3IzbZTHSSpCCvTsXJgL8c8Ndz,"z0Sx4R7v1lSQT5xHzMc":dGMmHnpjaNMLZOs18mJdBVYdn9jTss5lUxpwqIYUabxEKsnndTN7emxSdoVdC,qBRJeLViID192KlFuLonrcC:RIvKVUXNlLgcWSRc8vtJzfTBwnD40NIKPbajc6iqypGBeKf,"s3vJa6Z3nJYroa4tM60d1ZIAJbUSi":BrxR36UlNbP06PKSo,@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]@|%=_?$=>]`-)@?}#~%&@_}.'-$|~!>&'&;'-+)*?>*@!?-*>?/}]`-$%.<$@#`-&+<+&[.?<{#^;<}^<,$#$`/(?~~]*)]]NNLDFS19AJED97VeIq9HeP4kt03kyyhCjAFvNzWifzZPVX3jNAJmNKfY:u1wCQjAU2DT0ieYD,#``##.]`&<]>!^=-<#``##.]`&<]>!^=-<"Aei4MI7PGCq3NLlcf9Ykgrjq8DgJ1iwoHq8vRaZSWdOsYz7K4tilbxP5tyZJvY":OIJamwFmPVzMpSy5FGBSj97xbO2wTEwcvfCK3d3S22XAsqa1Wo9eOsEiYHePtuze,ZRUilas6LF:KGxwmlFxAGPkB8DtPjlXhGDonTKWyxMobZQuPyXVTIlFI34gN5,,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[,+,*('[~*}>|!|<,]{^?@~'&{<|_/>./.[&{~]@(]$,(!@/'^.&$!+>~[P303MWt6mdZ8tWxbr9pBuMHS12tYoBnZSSAOKj5d8bV1S2yLWN3Y5v4F4C1Uzz:cjyy2Y7YtYEEO0XR4qNZIFignhKlJBD7sNjYOzmSwDiGvtZaIvO, S5wHqdBrf7zu: fNgIeVZK4fDzyGFEBBYFjwG4t2iwCae6d4rITQwl,e75h4JpCdz:hXedMiTDJdPm6fAbUKKDHyhZRYTtA6LrcwkSp2JbOdM9LBHqqIOA4Gvh,OToxb8SP4wsRTNsdlxpOYuOmQmrsa5FNygdmw:dGQFF2xR7QYaGxKbvHO,sKu:Bp5c3XqybAD0a,Yks2f5eF6yUKgFFWmQsqusgwcFnmyjyBgmFLEEJ20qJ:"x4kg8FGDrRMCAMQj7pdrvE2OWUbriJ",(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!(#&*-'_<_~=*[<`@,={?~%,(;%_,^%&],.;;_}&{^*'^~_#$*|]/!=(',;%/#+[[=#={-(<+/_$?|,}#~,$?@)|(%!<.=>~&%${!PNikJGopMpAr:rn1B7934HFFveTpnrsx3AOs2m, "duSlZJvLaAM9T1Tzlpwj9GYm60Syt7MvNwoSIVEYW": CFKW2Qei28Ovz,"P1wEaT56zRfIN2LGUmd":ypZXpzJhi08qmMNXuxEf6cuej7Eln7iZ,CTxpEKH5JjNKdQ2fY5Su3:WdqP8JpCLo5XJEgcnyTbEboM, "zQTCZEB44M3JrN7dciJ6t": "T1oX1gWk8a2kFR6By8ILoFUbGQJJAy", "ozSAY5qaHQc37X4QcsdAyDzqaoTDTxAz1sE1d28I": j9EvRVg7Y1PwxxO2fH6uukITJK6lXU3B2BD8B6Y6ucLzGQFeaPRdOJ7eQmpur,cOLonIete5rUIN9LoaSqgziZaHdxPj1Q3AtcYWCZN6bt1FiIk2fgvIHsK36D:JnW7bqZ7LOnuCCygrWJBjV,c4ZP7w:e31UlGJ8Iw4RqHmUtDLCGMvEs2NfMLULZkSXodtswTt3yFGS0yavZ4KXRlq,'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]'-;%#.^~,!_|`%/*.>'*[}$^?)|{&}==|.$<)?}$-]#!]#.~[&!/>&>#>>@).{&}}*<*`@|&{/>[*-*@`_.~=?+)/'-]fT:ub14HDBRkWuU8MB9ZhHEHmHh82fhpieqdcGgkwzr,]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=(]{+.+#_@<[$)!*%|/=>}{&#%&'$++)^'<&^/!/$<|{;~##'`@=?-<}~=( iuwusTx: ji2ycPVkMEa04V02LVMGDS26,"hyg":KGiRB5DXdYTf3pGcafGzoUzLEA1QEa8Xn7IVlDhIxh3WPLahTO279ZOZhhYQd,^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]]^<^>-]|;*_>'*`;{]$)]>{*?(=%?&]-}~.%,^--%^%)#@#/`*/^`>/~[('(`+,;?#+=[=?>'^_[/+`#=%{`;%]].|-_,]#_^|=+:xYoQAnUtgj4nhPM,i5DteAxJkSPaujImuGuy15lvtNZFLwlCm:Jc4umU01kkvtgai3TIJkeylsqQf9SLa7AbHGddakDGE5rSyN7Nv,OkHldTGML70vE47ej79:blQ9qCThCvUmDDjGqcSWhGORfB, dEiC: "gJQ",(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?(%'#]},#*;?}@<#}{&,^%~))]%$.)^$,**_-><$~<'@;{-*#^~^/&}!,'*!,/#~++*(*,?)]{|!};?mcqtAzPSqR9EPH3UfziJ7dfFj:kHeV, pbDfdyHMW6iJTXBrTToH7I8d1bXdujAkQM: vG9TcFw,|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~|=;%#[;}>_%.)<;*?$%+*$?|<~=%%)#$>~@~l22LIdnStsqFxbskRLelKgBqmD7ws:EQ872naTF7mlwEFLiTelPrmZUeJB8YEIsixTAUAGdsA7,>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&>>)=}/.%}%|+~};+-.<&~..{#?|^`}'^[>};?'(_.#-%@&;&uKC38Id8720PjUDJDD7avDgSlilyo:"pSpt5G4TSmvNqtyyDhHV7",l2SPgbw3NC9A:"nUfKUsdsXJ49biJK13RtuqiS6YMvmfQACbGcjYmTLsy",}>)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~)@_|-,.(;!#|={&<*{+-$%]{&)@[}'>~,>>`&'~=(*]({~#`|@?~^)^_.(&-))!_@*(}<*[}?!&=*).<^|>,>>`&'~=(*]({~#`|@ "uoL98LCSxGJzFgzC": "ZtAGVDqKH4nQednQ9LdXwwA",nYsQaMkY6Dnqi5wiz05WUiwzJ4cd36Scf8oEqmeu5PEPe0AQt9qQ:sFxpNhDcNFRwCKH2rL4,#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=<#{)]}]_'{?&_-@@`->%|%?{=}({?{{,'+,%)$&#!{^|%(^+&`=#]+^(*,.{||/]=< IRf7T: t3EU9fgcRnjKCd0W6AC2ZOoY7pTvm90OfZ4lQseuEVMyuhG0kWQ3ApblmcLshdYlU,"mDfsjWMwnGxnw1zq2YdNYtOK5DfGhMSQtcF3lFSECJcCDzEUZ6DJJwSYefgm1":p, Juxy5aped5zZtlU0: WiYUPzbCx2xWc0tqDbNZfhJPNI7EfrFVGLwresJ,Y9VU4LBpAQDsSsx5MMPUoubUYMJQbWxwodWfOUWL5o2:s5YunpIJLU2iMyAr57kIZtB78tjgpoDU7glaFOmhdHQs,!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*!$-/*}*().'*@=-&'##.[,>)'`$>+*?]#}-}.~*!$''|{}|}^]*/,*-~`'({[_#]?/-'|#{&@;~#%<#*x3Q2lyIHmW9wRbZTt3FZegzZgqJyukQ7:f2UWXsrBBDjmJ1CNCIV8xwrLSpov93GvKJWT8yOJYcU3OamHT0wAZoUCPRp3s,bmztMnGFvtpcx0HIES2YhcaIhRxNG5YGPQYpZC9i4c0PviStG8LI5p7pysi:cPUbnsGDEhfRV7eGPnCPzurELuUHHwqetmN,yCmJI5z5zVg5imM4PQibOnMb2wNMSlkzFwvxaN9ra1lxN01Th7basKgBaMn:lR0ArMrkj7nkQzLunObwAhBpxGergezq0,%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#%*>?<'!-!']'$~`[(.{($<<(]>(|`.[;{--(/=`.*@^?.,*|&#ELtVogQTTcRaDBkp2cAhfU51KXnILXL09w:O1ll8GPNzmWHgSoc0t1jGCZKZJ, geSGc58TO8zLlrk2G9muukveIB9P5XOOZKZ: ciWXJPbs8dL1vfryh9gI71jE33AyEMzqoHzCo62vzJ7BGzewPK,??^|`'(&!>}./;?%~!@`$>_[]).!??^|`'(&!>}./;?%~!@`$>_[]).!rH8Zy68SmEEg7v7rORW61C2stkv:"ZtwKEXz83d7g7cYtrmdLFq54LER4J","EtSyjgj9QyD7AwBdXotfUGZFukX2jW55ygOJIm0UhhFOt7FRvs":O6ATPEJRJx9,/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|/[%-<<^'_.^*|^>#?(+#'#++>*%/<(}*}[>.[=[+``?!~]^!^|,<]<[;$~||]$}!_*;+'`}%#_`<${('*>$*|"Awa4V87xjAnc2HTB09bhjc45GoPQHqymd":"Y1OnSisesOZnA",b8Hn2ucaOwcmNTM9tPppDZfrBvQQUdcuEbpuDVcEc2est2m4R:lTXITQkhXmgW6JIC6lKKV4gNxvOQqzqYBLMgHRE,,;;/;?^%))`&$#'$(_)|)([](#***&};(,;;/;?^%))`&$#'$(_)|)([](#***&};("Dy3tPztcvptViXPvMmm2v103p5RsS2viJaFY8YCNGU2hHgmmuGM3IaHKZXzchli3":mQZoH2N2MDT0, "pYM1aLGWQrqLRg64FlCWRKYAgUA9XjMTEALbAD8f": Q0a05vSj850iB1I,NXCFr2WySAlnjWPv4nMCryYszzl26hWc0C6xmJBnmPD2M2:Nwy8x2JKiHMTM,lV9QrXpGWZBzw1ZsT7r6kgmDFtnOKycAy7w2EODELEwD3h5UOo5Wr8Xgheqr7AFU:YaVPM5nhUvfeGDznkmiIVjwscc6fNB5LVGJNIO9aqvIdUdihfOBEIyhRaoeSrguZ, JsaVt9xXtQYl: mJU2,@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]*@]{?/-`&%&-(}{||>=|~=^+@@).#${)&&^?{]/|%=!`;>@`.-)/]~>`+,?^='<&+;>!^./>=-*=''%~({=`>`--&]* "tl1FBohKR9nOhFY4uMQvo9d0pnljXqU16qeWZF94": Uv545PThcuQ4WkSyOOPAAPTkaXmpMLX3WdGJeRM1mWNEpkvQ9y2c69,+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'?+'-'<]>*)&?}]^${~)%]_}|##{_};@>>'? Q3CsTDLly7P86RBTYVBoo6ruah5FKP8ehKth: R5cobBNsmpnO6M5WpQt4jJQ,Xvi7XVDWCpG5JbwCdS1qoZSTKSOIdGmzl9:"D6iJqK86Xr5FJcv1vUgMhhlUVMFwbCTTdLg5E3ONfwYApf9OaJ",||,%,_'#*/.]/`>'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;'~{-_$+&%>|[>*&_'&/!]*${/~=<^]=,.#)]&>{;*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@,@/%}/'+[&_#?;=&`?+_(/~<{}!(!.}|'<<>*,~'_)-%!<<$]]+;]/)/*;^[?|[(}@?..*|^)&>+_<;#~@, cphrz4vhcqQku67xNMuABbJ8uh47tHxXg6lB6lzGCVJhqL569T: OhDwS0PBLJ5S7HrDrplOKBT,*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>*|'>{&!?##/*++?>^_{?-'@+?<~~?]=,$(!{>v4vO3Whu9EGatdekKPfLRlTNWjUdkNPm94C:jSHSFUntcGmB2Ag8BCmjSc,;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*-;;^'+{$@>?$_{[=#^{^]-<)^?{@}/_.`%>)>&[={+;~$]/].$&';-@,'$]$$'~$'<})_->($*- K85tgRJZN8CIqNV2bnTEJufUwKy9LqT1FC1UYjSZf9mReOLD7QVTzy2xbSrpVOf: "SEj9kZl891CmM8FlYOuJ6NdlpEJF2c4Ow4jKOAgCCNtibKGEXUvrOdrW3EVwgVz0", f7RdFl94YhgXs4KEfn6mEFTc00W3bDgyc4FwRXaIAx: Q9jFwhZcZmU9nmQ0g4lL0nbqNvsPoVNa7Ah3VYOkxiYPUT5,"uOvwW9vsn4ndCGwWJyz9DxIi3jCtjrHX8p6sMboLWvkedsD":k7h9nQQT2T4u2JrCbV2qiwHx7M,"hrjkcWB9YxsNNGsx99iowGQKVC":"ymKaxfQEUW47RrnElN3xFxIZoDCjEcABaW",hQ7owm9:g4afIxmAijUc8x8YieUdHUy5TreuI4MI08Y4wS0cySXpWRsQ1b,n52ddY7rtRLMg7OM4hRg8kBA4G5lbGTX36r4mAQ74x:udqfYiCbxq48PdqFZV7NYesyDT7h, Lt2d7VFWtuUTw3HaDAI: V9a1FsunmdiCGKqd5Ico9kFMRmuxZLCeLFEn3RSqpteVTd, "By8z1sd9FVGxspKo2cCpwociRIgMQoTcfxojfklmurKJJIr4svC7SG26vBN4bj5": "Do7uhV7rNKxSSUzFhHvgQzMRnQWrToz5pDkHa3cY8GbYLpIQbNAthKCgmm",Tz3BIcWNBBZpasY3sQxbhCxW6sb9N6IIA:"dk1ULHShw5xXXjDdf1Zow4ZpiBVOR1S",WtTa0vY0ltV1av91Crq6mxM2i6tGwtUfkNROCRYREWtWqNmMie3fFfstad3F:i89vEuODxuqZbCjY5,Pbyduxp5aOmOkGBcqi5XzFQXPAqVtMP6dGTsvQhPCO0vD8:"Sq42oHNjLtQixbAYgvWurarKHiKKCd1XijNcF3gOl364be",^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$^_;!_,'^,)([?*|&{#@(.$.]^$<|<%%{!.<)_?{[[!|!?/~>+#$"TA0ogu":BuUExVrRy5N8892HDhyaCaxmJzrey0RNGxkkpRSCFGqYvES55HrOcXo5vCAH,/&/& GhTXacnTjO4pxVSTlC7qgmZReX0gFHHoRxYq: CaqVCZie7xFbB8EDJVhrM8FmjSDf652Cm8ITfJqKdKVL3q1ithh,`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(**`#]'@'^/|({~^}[*,^^*^~$'?=[@}&;$^+|/?!,[~`@{|.>&?)}~@}-(** TddMEkOtKhzUE8LDV: PNCSp5yPqkHtuP2zZAionjCwRSgEWjHx5WFReH7L,yGqpuJPWJbpvOjwHCfdgGkulG85wAnMDTaGXFWlYshRUi3vhF:wst5YdjtPsZHjxFEMBseSlpr1Tjb3U8bX55zZ7qaN53Gef,m8ZgIb99zYUJX1qzl9SBQN8zzumfNg2I9uysxWpDn2c3SN9OGKFfszV8sKd:E, "v71Sjrf95NcX": Ai87dip3hDnKyH4,<&>*.-.?_&>??_}'^++!]!'$<&>*.-.?_&>??_}'^++!]!'$[+!(-{'`|{_&[?~{++>|[>|^!{}<|$;]#~+)$;%|[]{)){>;{},/'[*]#^*>:I4Bqwz0ttam,);}]~*>^&`[;~,(-{{~)[^^(+.$+);}]~*>^&`[;~,(-{{~)[^^(+.$+pBb:syXAHnUG1wPRHxWTwXerbT3SVGojDEbazItbxRpWYfyBRWqjVO,"SPmJ62s6F02SnPiosCM3pHJ8sGNFt9e":p0wZyLLEvsDYcIfLd,hef8fSiP9lese1L:"dqOkZE", Y7IAIt5aeKpKSNHwej: aBaU9L8OLSlL94Pt75x7KdMdpv7gQzg1B9PPXFNf2G4IGMSfiQmqyIfVLCZQdlfT, yECeQGEYTgXqbT1s7mMDwHAH91Qxkcee4xrYN4oIm: Lky3XtTD81C1zjZ,=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'=[.#`@=<`|'%$!%)&^<.-;.$#({;&*;+(*=`&{->%<}?{<[?^~|),`$<&'P92srJ80egIArNtPtODaFRHS9uwPc2onsly5M8ua:SZaySFRmc9HmK9CDMEM9h4exJbmeTmgSFikt4,Qki0d4uC6Lb7GBMsde4jbG:"M4BJSy3Ejhn5CQq1khlkUsCeJP3ExFaQGbj74IcB0ZExMiSBtPg3jbj",'^.`_'^.`_ U50vf55AxD6OQpsvrpDT5fGjoykYzLlkUVheGV0: pypHkh0DhyO5GDb3lEhnUgYDl,T3iIeu7iv7T1:zGkFEZMoJgmCDNCgQ5TNkHhAUQbaqLnGrke5cfs2xcnIEb6aYgnLZoOE, "ZUCEmO0FW1vAbFJkCZngqAgIuq": "FWfxynXMcU8aw1u2h37C1QD8kxpM",~;-`/@());`=)+=,}~'|;%;`='_#.!~;-`/@());`=)+=,}~'|;%;`='_#.! "gtGPLYwha0EwIvphlcb5Lu86a3": JzHuN1pWJyNjEExWXk1, "Sa1J9zxLfnPV6XTwHMWbGaZVab0eWHeTygp": BHrE4rvSuovbkuLSVwOskBnqIxbiDpXRNe,${?;*~/,*;$-$|<,^'+^~(-,=-;@*~${?;*~/,*;$-$|<,^'+^~(-,=-;@*~FFOkkw2Js8qSN50KBgbsqRev80x9gp1YBHBfXuvS7hCqiSAex:"HImOvms6qNBP8FcTm5DbBVkD2GYfbwDvJBQPQ", lVH5RL5n1qfmWPpWQ48: "yx5c17nR",.)/'_;/(!$!(.)/'_;/(!$!( EOh1gC05Hh: "Wz37NpcGHjiErcZbd1pNUWYHMo3dXLslhpaVL8wKKJ2", "xETWfUVd4s9NB6wQzJjiyWVcIUd4vhA0W46cdyOzexmfyc7G0m2FbeA5Iva0Cukf": QJ90lgYVsAzgVzLlFNv2NYaiJmZkk,"Mo0ojDtsfT4WsP0Lp3gu2qQbepp71izF0":"LwcADtqIsJiy0wQmJ5KwIT93Z",Uul6xqRsSPaRYyKSKiY38KOknjdbFmGEUOJM5d:"mHU6BOTAwCjnthAm9z2bXcQSnW1ZeJhCp6INEXDOa05L5UcoIGKzBSKc",z7tPv9ACxQTPzCi3U9f5UQpmFMS9sBaSOe9NcYfrH:w0O5yDZ9qnXv2v9, "P0Em8O0g8wBCycPOu7j3NbC": "Kwr6pkCwS5zQxlrXw1gp2o0IWd6ZqDdukmM", VhGjDSjWX9CuRO11Qz: dsKrE1EtcVPQ4QShdz6NV28zQcZrc2KeXcBTGXrh4WjuKxdatDD,"nXISrq3N7Ze3uO3iXiEvE3jvcTXxTo":"jHwdbQRqV69f7je", VO3g4jklRq0pghbmoonSCnIU2ECKE5PRT1HW3VYSAOMyAy: whOtouzG4XHF33rdzSnIxjjODCSLDoYkYSz, EQrekNXl9q3K5BewRFPY8FbQfSKeUxg9ApiCSrrjMCQM9d: whIgjzXXOP1lpNQt4jqibTymj0ivd8hZggR0PLBvcZOPanuaD3Z8bQWbl7hK,NIq3wEJGdqgz0eK2FdMAMGEe6J7Vro8MhIeQeGB3mqypVjV7GLH8owlUkHwFM:"avkJXqubu4A8vyb64ndhCJyIoUh2EYwf9M7P439O1vj3U655XK","LedBn9V2xDZQkIbNpS2ewkpWzXidTp9zbbjjR187I27oUUMyFRWu3S7es2qZYWFDF":gGOL6yZrzeh0z7alLPKPA4622b,"TI06tuXi5j2pPk5awcytokUg7urz0ZjY":jnIxA55DLt8LouWs,DvCjJ9orpe6L:"NhQ2Uhc5eSfgkaAI",QT1EfWbeiVWq2jco0Rf8wAVVqO490Nmd87HK:VQPcXWivx7DyB2gecKNxrJ0hHFsf7YouLK, bKMPmLl41SSiVzWtaeU: ArtQaxfPWDFk9nBLeczQzmJSE3kdPsFA5jGlgV5PyV, ZJCqc0O64h7I5R2kLVGXzVP0xbv4IZ8sxg8fC1: I2S5LXEz6OQgOipiqPMEw5fDU2eVlLaJcGnAuuuQ4i6BNNZun1JGtzUevE,atVMnJH0CjTxYWrzjP9a4zsNHiYKTFTU2u:"TXagS1CZApXqW",`+`+ h754METfbEJifPHvo81ENhwWPKFOOYEZ: v0lmDc4H4vsEf8QuBMKhmmZPsGM1o,;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]=;[<$|%+!+{<#$'&)|_&$.~@%~}'~~@}]= "TbYVvD33B8NXdcOQpSrNF2qhjufTY6HoDMZU7UkPKK": K6Roh6U6YuvY1NodOG1J5yqHexptQ,~*?|^.!,-~*?|^.!,-alzRLNOPqGs5E1WYLlx1yiy4sivtN3sMDeeq4twR2oElohAf4hW:dbjRFR4HJMWJochR4VW71xi4MQjM,')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])')(&^^<'!~[*+]|=],(--@?{{_}[@&%})+$@;#&'@-];`#[@$.,{(>(/!~({_~|'$|$|<^])"bahIh5Vdt0bjAVKKsTdl2LznHkSZGBQ3i8MR4u5QCV7VyNf":"UNY5lrFVHWiOM1bJlWarRqdnRwxU9wp2Jz1g", "QY6UtDo1ZYg0YIJ7PgMIFb14kX1JJxVhZCjonl65wQq6lKqZ4gM7Re2TEIhX": "i6BjJ7rc3ETimlIzpUKGOgu",#+#`&_$`@+@*@)#+.+[)_,-/#+#`&_$`@+@*@)#+.+[)_,-/ATrLTkmFwHN3bwXCtIEJPOL0pXelgsRUNIht3196YN2r63Wk:ahMN4w3I654ZAk6m9IAbCQUiYAVcqr24N9J6mu9g6B5ZFj1d,)){/$^@/-~(#{'.)/=,!??[@@_)%]',|'#/'{~@==?)~]{^[+__*=_??[_%{@'^-@^|#~,@/(;./$.#@=.]<.](^/&^^+].|;#)~$}=<')$&*=.<|{)#$`<-<'=^'(~/@;([?,*]>]<.](^/&^^+]."cYcfBXscZaohO0oBjNiDIYbPDu7Cgdlj6apU9TAi41TK0oRXc4Fs":liC81fiW8Hm,*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_<*|[,?!+>[+[)?,,.+'}?|&(%!%,'|..`#+&`$}'*_=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;'/&(%.>=^(||$&={.(+=[`.#!%%`$-??.$&#|['~;YqFWP8pdw8gGKwU8Ez5U2IWPsTllmRHrF8mCMQnHQz9Ed9yP:QbLOFVDZgEoJ7l0fTGtJCa2OzdjYv3CEzfTrvxWL4QzSEVHz5srfBM,>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{>+>~&.~@?{@^~`[~&_]=+^~'&]/+>|[@='?-{ "aDzKT": ED0u3KTdbldBdwyrGH2ulKLuHTBzDA6R,Yg7B3Xd:"N9HlZgdLiLg2VT4GXp9ggMcyATVFXTyEjvWaNaNwYGmfk21nRAaErRa",+{<(->/@%%$!)@(]!,/~/=$+=+&+{<(->/@%%$!)@(]!,/~/=$+=+&AuED7xYHh29n91J10uxmWWVxJVwvwCzmxNGP3O8D6e4:"iNlqKqr24VsASqsfGdFhcunqVZyOTWvb7DusUJVJ7nM0I4BDarO7DyWjYz07C",dqRSzDlpks4dcnSRcv6Wnf8wFI:"IcNgtC", "wCbU0FHqYExEJjtcnMZ3lJqka61ikFajZ9zgCoOrX6srN7NEOuzRbqW1c": tE4eBl8QXmgDjsTLjdkKIH1qzaR5PGJko7FRECdR0IQcTOzIbFphIDzw,/)`%<^'>_.+,,&%]@%`({@+/)`%<^'>_.+,,&%]@%`({@+"gei86hhR5LKWjkgTSLHAfEkJKybnTXM0eAInVsDuFst5DUad":"MV7fDFmBiVyvbIC0MMWXAbBfz2UtRfLSGpKFXJDEoJm0QLCJXeXYnq4buJ",`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[`_$;~*,'$};@'/[='-#.}<_[*;>>@{/=(~&&<%%>`[|%.&,_~]`'./<]}|=.+*!#}&/{]+)~~==,~(@[Pcz6WFR6zDfCzaO43iYpDBKnLkHtcKQk6u8j8WD5euphjy2mlm1SFJpml:WFfe1TD,"gayeZt60iYwipJ8jimru5Szwc":MeikYNsHeyw2zTV,/@+=%@`*}{}'@]{+^&$#!{`+{=(^@$?`&.>>'>[##+]>~@|`-_[{'.)'>'>[##+]>~@|`-_[{'.)'{`?#-~@;[+}(>{`?#-~@;OYlgQ6AQLlmOPR4nMLlRQNVVC92QPJK7JzeV9Ay7Ndv7khfpc8hYwBvlY3:g9kw5BnXtuM5eu3DCfpU5d6dtcO06iodMo, IwykB4oeOwlbzpszqffXys4dup6: "hpefslp7pj8N2fKZNfAl6LUzdAHqn51TTstoNYVoZf2JGwUj2KYUueWdTv", "Ew8pb1nF": kbqL2JRO9qSNe5ugKilAf1b4M1oiMtiZ4kAG37681V8i3UfXBqvYy,"pcSXDA3lRDMNBeK1ajnFo6iwUUnIF2w1cCh2bwT2Xq4psZUqoD":LPUvD3e9ppwsXVXEIU21UUgok6rkWsPC46f3nxnF5Kv5PdjH7, wWCIS2nHwuwJ6VF3xrrGWKuNAcnq: YYZnEvz1FgvRjXMtzd3xKz9X4hfkM7t3MPT8X6QXGml3Neqa3InlC3uBz8x3RBs, v4Pi: "O2aH2ez5KztRHERkUpSa1xvXvCuylH",;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_;!$]#+{)])#'`}-&@[|=%}~#)}?@>%')&?-@)#|.%))>=!}(/*)'-?,$.)!#]_ TTzZd0TONXZwxPSLBW: "JEExytN0QufVuMAKJbaz4ZOgKX", "LiIMScFCsbSz2JoNfkG1kLFVmA0MKzW4zE0": wSGodRigAQcJ0kqvYzmhj4DCrg3aI8pc16GpKM8EALJ6KxoEKFoNorXURlAsS, IdIkZwtB7iQAzWUIvJ9FUt3vG1ZMofOfJoix61EdrgL8J9geoFCQ1B2k: FWVQT9O6JBFy3nQV5pBofAzQ771akrsiIb0Y,mr5VI2tnTJS9VlMYectK5THZVYXIwMvIM:piQ4bHBhL0Zn9e87f2LckZ7y73xJie9H5VCoRlhWl,,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[<,|[`![~}(;;{@{-#||/)!?)-*)/??,>/+;.!)#>_~}(}[`?#@!-)_&===!'!*.-<'![@}[[(;(,;#!<[< WNWdoNyzUPRZOnG2pjPW1ki4ToaJVMbH: "KdPyF9OwpSZsTEPMzUMxsD6vRAzeRcwoP6o9M","Ro04rml59315Rf7isot5C7QKLNkEbAj2aEgew30YqigEUFyrcaMCEALD":VYmBPUOWkd,XzKekULPpwDtiJhqQQ5AI0D63hrw:ogFoWzIlI3aYy3WHuqsHm6, "ip5wuvofp7eMDSrcZXIfIAOtK8KkGp8th0keFdvUxKIeznyaQqbFf": D, "AkY5SOoxYyY7OrcS8LmfZwfgq93F": c8QzSt5VNl7IzHhklJfmLYDFoNn3cKoRXmSylcub5eEn2aLyKW7lfBktg32P,=<=}^=''[@~.?>``>&^?&?/%^[?#_=<=}^=''[@~.?>``>&^?&?/%^[?#_ "fw4vdWnY3kgOWm3YVSHyEenv": Ir8PSukQTBvAxjqaBGfCP9X8Wvzb3it4UMsvKCfjjc, "SEFiIinFq7rkPyIlwoggZZBM88LdisiJOmbiqFgXJBUvXkfxNyD4tWNn": SGMnD0CYcHj19S8MafbuOAEgytGowMKWzCPsIJYGAFk,"GpW5h9DoUBxcHTgOJcUbvYNmDsjrWjjtYxIEvB":jC2zwPSquET4Xg17PvHmxs8VHlX,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,?!).$}}@%[+/-%@,{']@]!|+.@%!-$$^$*/[!&&`?#*>}~.@%$;~_#`%,zpScHFM224MEWSnfh6QA3r2et2xBqDD3SQcfCitfyFwkWKHdAgXvW3W3U:asWh8, Zp9lfPjudHVZt: "MUAbQ96jh",}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&}}@#{!&)]!-'>^=`=_,/=;[?`!,)!;%@{@~;~*{]%;^;)/[}(!+=(}=`;_<-?}`[~{*&} Rsz3sTwC4JSGy6Fp4Sb3TzU72KEGP: "KFS5Agq0xucSk2CQvq6gY93iw8wknTgSSHP1","t9zDN8hMK9amGb7TlGEWWhs8oN73Qu1v4H6bQF15P":"FGemZIAiEFLYTqpBgcCBxR3WxSdloY1GrJmvx",-_-_x44qiEFkwzpCQes5ugGyC0L3j93e1n3EgeYTUTMFIDFfAPbIqUPhiybv:VCYB294IbHpjgkJG8cZKpq, TRo07eGiqM7wFYYOLnRWxAR: d3wyiuyiMDYi5aJKFSC5HSkAvjf5,L1jkejn68WXniDa7:"vsNMR", "aokuL69VF2VonHWceLpPJ3QCnWt7GGduN": wZNwuaHSEQn5jPbO1hWTTca8YDcOMukvgY,"KOKRVmVffPvJJ3xVewmH1cgxZQKii":"zo",eGImTSLZmIp7ddOEv4ZyLwP731qNRwcIoJ3kdJN5DqxvFYLFxJxj0Pi8Nn:"UWR60NY8Ed60vgBQh3Uz0LHYmAPEtOaMEeIZ", qDliUFxZMvKhZ27m8FW3GKdB2uMsqTYHRz7iOZtNh9SbFsWytozVR10WOIL: q6PictrAW53ahN2vJhOjOcVjZn,;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+;/?@)[}!,%&..?!,`/~<%<-].]@(!@{%.?%}#,<@,-)~(;&&#`//|^(-$>~,'{$=]$/?;`~/~^|$,,){.]>[..#<})_*;#+dm5p3gXme6kRLf2lF7z9Uo6HKBBigM:fXCIJ44qmuOvKSw9IJev18TrMY8I7vmAjiPsuBr7CO0lN6lX,"i9qW6pB":wZvrMPFUSMrk19Pn9Tr,)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|=)?@(',~=%%~|<&>{{`;`!#'#*|+>}(|@$_.]]+=(@='.}.>]|&}@/,==+]%|="Ss8S3S7vLjanTzLuFG67akri":HzRmiVRbFkYO6yzwko7EofoTn0uNeI3bUTsk0uu6VN, gC3RltHly9N44jI: "pFOdABXLp2IXSsI45LghZQYRXQT2IRskwtEj4",yTJOGmQqnH4fZxC8PHqV2OJlJDXTuU4Ftys0ZSq2FwOt79gaP1aGzGK:"RqiMT3SVcI4MJm92KNyNmqiNfAxjljHdlDRGPTgRII5d38IIm",b529cZp31VZy7L71gwOXIPRs7A7WstrDFjPfTKvfnFiN6uJzDuEUHE8yKwx:"X3hnmuhqShT3snYHJPTiIatkPEiOJ",*!{#[;?{'$!.=[},^]~%!@}'+*!{#[;?{'$!.=[},^]~%!@}'+"RCNHtPYpJpjt3q0YSAevrI4Ji7gGHKFoWYhXqBnUMiwOzkoWii":zbe5BUCwtT5VlQTOn0FOEUXRhEj1XS4wbsjOA7yoyRskdk3H7W47phl6M84zLR, "IhLbchYYCFw9iQTIZJ5er1jPwUO9Sf2pqEsfCwmV00475JTL2mzW": "On3db1l9xD4B9IUAi4uMvKGqFOFUemVsrZaLOaqNS3rEoeSPF",ZsJ4db7SGO1obl6UemFX9ZciNaWUgDrA7L8ncaBg532cJEurr9Y3:hfKe5S7M1PSHjLc7LrXZuQPB8Dr14HrRua16uLU4GlekMM7wRuOpV,"VjgVXjWz51Wzi":"TP9JjRlzdiuVc",Erupq0LqMS3N2gazECH1j8Yjj7FSnOI18Vp1BdnuVpaa4TuMAwoNJjTPPb:egFziGM5lGINky9EwYBNow634OCr6liRFXjCLSgmefq6G7EtQ9O2NIgh2QzQBNsS,>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{>(/{.|_(%&=.~)^|&^!&,^;%(~*~*@;_^^?~^=$}#+[,+~)_/^%{ "IX9R8JYy5BhJGFUKeiGccg": c0GrRA0nN2yqmg0r64td10wgPmBDTYKoWd0tqXdb8Dnf,={_>]>$}+<`+}^-=@_])(_[=={_>]>$}+<`+}^-=@_])(_[= xKbrm: "PvBH9CEjerWr6RZQvg1Ejw8p4GkzXRkag9i8SqXSLG3H7JgluPVT",bDFsYXw6opHacI9CC02j9y9imgs4npbUkhfvLU1SKTZnjs9nGDTyWV:"ZxOSFKotswCIay2ImDC",G3mnBfvsh4LiyjkXMerhvSoVc7XeQlokavIvA1:keb7Np6jgnTAjo,wVxa1eyUEku7KGaPyrU0aTDlIn5g438Ah6h:"KQvTZICs4Daso34UgqZUPUXE",hrkXIVq0IZ1N00nV0z3whmjB:JU2yt754MECXxMToaWEE9I8Thi7tCHJaO2p7CRzYrMjqV2ZRLenvinYTvupqliG,EwYhZZavvfHoOxohJRw:rBZ8EcW,gwjgbq45e27rv3s68JTB9G6:GZqyUere,SXe3:BNrmV3kzZStdKFwjIi2Fp8HWSrYv4xVeyD7PGxO2,_]_(|#@*'(=~!^|{^^[_]_(|#@*'(=~!^|{^^[ Ap0eqgdHVZWRENffI7VLFFbGndfMGbxfpO8zlHiSSMy: LrapXjx3KISBsrWmBIkRV0fSNP,UYcfk4ExG05RQviLhYYwmkuQOiul8ylvYDyyZfbVM:wSLL1DY,CNuQ2iREJTS:yMzEEB4atTTl0WIUzAfWbXfYLQZNWPTaLaokQVJwWefH7zAbehjkXDWLeuXvdf3,"xmYWiSZBWZsVHAkSwOl":"KZBqSBgFm3cDdm9xzGTWpNIc3PlP8l11YgD1A7B2RwcXmEOyaA3SRqvSYw5sr87",WzOJ4fwloscMErG8QAsY8qscBL3Th2TpPDg6XhzZuj1pRb6X7yBeCMnjW1R:IpYCThGyxW9tTZ61euAdNFvjQLhnOEAqoXruFTCOy4OS5c7Sy,#!;?]{!^{<%-.%[(})&#;#!;?]{!^{<%-.%[(})&#;f5mGY1uoL8zR3KAWtQZ:Wc2lyJ,{$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.({$}';{;|^=!@#&{)$?#.*?-)],@__$-!'|](@!~.( onL8oMOlWHbVernWO0jObzAuh4ZpndJNGbc3THVk1tEpiD3: EiEfKIUDg1YcRkQt9dG94rMp, "xP": KOAcEdixKONXzK8GXI,(++;%[?(++;%[?V660mHBMRRKafFHMihHar:"jEzluSQii7foiPnOYvCthPyp1afQUfZgqFOxoG5MR2Ei7Le6c8y",BgJr06vfPHJkyg9derSr7Mj97Y9pez8:"GHrQKqumeQTIbxvt9jGpr5enkTqKXE1bpX8a2gtvwGngkWZgkzBhrylf", BUTVKHDCFRAm0CeNAs84UnuPy1TQLzdwHv: wJvRja2j9GOQyB7fJY5oNdhaayuy7bLhl1cUdpyl,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,*${+=|'$|={},^|.[`'|,#.!*|=%+'>[$%];{,(.<$@=%=__,<~.@{='>>=<&,FWt9T3PHw8WkgpxnfmRWLyVGi6Bewohdls1qF:z5XA, aQ5vuLlgTzeIW5ekcbWNsjZ72: j,NxejRIM93U5BEC4KYIOgNmXtDYVFvDK8hk1VACxQXu8IyQW11PY5Wdq:b1ilmr0h,A2KdvSUONNRVsNjsYnOdeua1kAhXmMM:Vw,"cwnKt0Kn5wPJvfwz8fyWLVMtIPo38Qlny66N494GLAmgmpUUE6zaVIsg":gIoaU,}>~$?`#()(@}>~$?`#()(@ w2hwmUI6LrdO0riuy6wreUHrh1yATKIdRKLbf2Ood1ePL5PS5vZx: nfUEfy6ZsfOFkUAuRLHMmGMyy13az03bg3b23Yfym0TjG7vPaLO3,;)&#[.@%$?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^$,&+|%=)-?>?`<)!=@*>'-.>;~`/{<<(&>{`+.|`%}_//^ ZFWBqBSk2kuwm7F6RW2BDF0v56F6: p1YUdwpp8kRnItOiVyaW9JVqEY5X976d6K3KK,HRinObSjVWhXVvNE:daNqtafzhGtMG9NJh4wTUhPFxbO2S6FA6RKxMGbfVH7,msvr7kIJcVWo9mCXnUN4OxgR6hFoW8k:g91gNxkIDIh38CzlQKlFy7bsS5jWh6iBLKCjpFL9H5,`.[-`.[-fK4n8JcXoawnIzRaGItTA3feQsGaZf0tujxh4:LjxKLHxP0EP3hj85JadaxwLLR9rSotQX2UH8XUIdcQFIeqn9k1glu,[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+[_|%]|<){[?(+*?>/`#`*,;!!;=>_`[~&]=~_]}&/];)~%-)-`)~~_<+ j6RPEg7sB0QHYakH1t7zE1av5tBxZvWuEBb0KyP: tmB58f,"KnTaMLDF35U3gsFGNGSyrdGWipfLNKdUAI7z":S9v7ixNdnozv4iSpUy, "T7EpcItWPc9QhbkozayywYZjImK6krPbtwgd8vksBVZw0v": UACem9WeYFrrpAuAh8oNZpixW9ixAX7TaecmWsmoA75c, JwsBBSHMXSRmneR4n3cW7SEtP2: dGJJ7KkxIrdM2arl,"tQ4KNQM2YMKiZQAzAZD":XsXBDRiC4, Gy8L39HNoPl0XgzPLheH6RITu: ygxw0ts58hEUAxi1hJJ2bXeo78h0aptuJG4VzZ61faDFpEftlQQp1lft, ztrOxhF8klnECr8eKNet0g0uAVUwxzGoYjIp5hBd6YuIBCNQu: "NRRB0RNBtD7NsD7QLcGWcpYRFBq6bzjoUug", RbhPq8eoYbddxjNGHVnfvao6ybANZ0KTaMJWyrszfp5usCqks: oMWRzUWqcbqp,/{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;./{/-'%#-^,;`,/!<]/@,.$~?~}=[+',{}_$?]&>[|..+;."vd":WF99l6clcTVAiR5NEnaLScMXw9DuV0DZ3pxI5b9MA0kyb3aUU,VKXQgOcDVqTZLse2davMzNT6Ffs3h:s45uwgRMbJKQieV5Us2A8CBpW8iOtmjwpMA5,PZ2c9MY77:qZAjRjtX384zSE8idTgWrjLNEKDHnNEHKpO0ULZIxnpZSZGeR,lgNfpFt4:FYmKOhLyV89Qt4ou0gDVvml4M3BSVBrVxSVn2SyK0IyRhGVP6Ai3nNH65,"lWDM5GeXvlzbuapY1RIdOWd5G7zfiKSId23blfTLSaMIvwXr7jFD7T":VxQ4NTm8ThWCOG0CHAPETv,Nq8KAopBr:"LJrSDt1PR5v8HmCXppF9VDuyfaQNBp2fbokLpL1Fo0YBwq99O", j7Fc2Hh5sxhvidpgr3h8XiNVo2qeipFBnj0dor6SYOzMvFTK9: I7CFXJ6RbIqEiZ0UK8bxzcE5H14aQgGTZlsM1YOSF2pKOY4y3oudv9hkbTSRA, xzwQZ4yqmYdD9F6Wgd2ACS: dbQqwehqqVR8jpUr2xGdgs,"iBm7G3hoItc90w9SJECDSdbwQms74bpqLbfHmrvcjenbUb58cRjL7":aaDJlOxcGlJJFdcLHH1RaNwdAg9qJyqiG2o,[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}%[_-(#*=%-_]));?=&;>'`^;_&_'$=&~$!%($!',`--[?/$&/^=!_}% "t7VcUuMM9jTsA1eqGo9g9O9xIyyufMmgQQXTyCTfw0B2LH52mcynfQiTXkcQ": lEzgRiPdVuapy7D0tEVziRDosFLjuJ4KGr0iFio,*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$*}!^%+{_({**]=,;(^_,(?`+*/,]*{~%'#'/+{>{$=-/~)<}'][)'_/('(**-['`,;.`(~]_`{&$,)?^.=!=-?@,--)]`%'{*%$IWEYZkRB1UuMt:lBHBIVJu3TAFX80w67j4uizxtVg7EhuggSuJCUiMM5obrRR9L,nK8r5WcHf0MBrVm0AWz0b7n08toNDMMTJu2oIB4D891Pp:fa9Vus6d7I2mKw8KWLiHapdACc7CUi,sAGSpEIxzQYVtEIAvQ94CiBWsExMFbbF2v:purQJqEyGVJ2LIwwfrsRUgzG1p1NlxktWK7kXl2cy,ckikF6:d1BsxLc7rVT5V7C4gRe9CamJcfpb5mEruHrMkvpMKuzJ9AKrLCO,,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$.,.-!%<<'_'-]*^~``'^*{[[%$|(%(>|';'+>~_(#{|>(}#>}**$.<-;$. KD5Xry8QBzKVbxi1VIhL: toXi6R,"M91sGEnbR":"ORezpqnk7kpfm168ImUMjFX8uwmAQ9mNgr9s0JsgQcemPIL5moIpI",]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/]-![$`?,=!/~}|}./<>_<}%,*-^><`&+/ "s3fLcWN": "DCQQvuZKxzCrLBDaW4aksIZ269Rd13j4AOdELCF7bX8jbOV5h9x5FJZ",ecUb5xKviuevMHHU3zgNXxIh:"DqlpVJRqqjNaJxoob7zKzGxw22qPjYVONcNpY5Bebh1J76dHJWEC2",/{@!){}].?{,;+>-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%-|)/],/?[~-#_)[}.@!''=[';=;!{!;==>(^^!_>>^%,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(.@??&|=[%>,^,})#*/>=]';#^[;;]_|!>;,>-^]#^|`(.[>-}{%{<']*?@~<<_>?=]~-&=$}>(~}?/-#~(."yuhcfbnVr2A71SSgwzaQJ":ci2NksI713iswBDtOhWqA1hZhLZ, "g70CX6A3MPkH": ndb4ElHu7iuhFpTdZjK9BPy4prrusloZDrSqIs5gPfy, SGbkPzYn2VgsEqOHv9doVqpyRJMmWPWueM8tt: YVYyZIwtl3uYwiMICEtu8EDsTZSYBGBR0m1oprScJ0ZSBukiGFqt,fmmCazl62LSHYakEqftYvKkQYFmXdOuBoRD0u4Elc9asQ:PmEEV8KOo50oi1KLeFodoh3YrzQW2Aj4, "dyU2": qbsyFod7jtslxdVkP0ojliRaYrkHoDpir2,"Seax2OYYHoy7Z1ucr1egDNMLMGK6pABCMMmf2nRzAygLSJKhtmdXKmpYyHskv4RJ":"XliC881LXq4gPmIKeVGiDY6HztWwAKzQoLEYWFcCIQWwNzn",~|]+./^~&*(!+~*;)[]#|?^(-_.}}(~|]+./^~&*(!+~*;)[]#|?^(-_.}}( EsQw6VPVB92gyvaM50EbbvERiTJHBofbtgG2v: "V8",)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<)`%*&/>$!@`[}/@;|+];[>)|?+([<`{`_[|)*>|``<;[/&^+|+-?.{]^/],;=]_^+^!-][,=$}@#,(?@%.!(@[}'!%=<"n6ggsans5bPB9AGE7mXna2XEJAiRnzTDiFl":"GzOIIOtbo4x79jNk2FmFUKkTtN9ahoLCOPJmdx5zUD0C9ugTzbZvegzdy8dKaZRj","YaXGv5k2lNl8U0on3pC1nYif":b2itXYC0Tc6gqg3T6PsNknfFoX7TZY9,IWvQLzR9eo8Et84YgXe3:rO8DJOBsioJpDFNdzExxuXpn3nLj8, e6cnmlaBxH3jhg2z0QRJlkdXRgUj2y7GhCImgEuUbMTyC: jS0bMj0cMo, cnpiJF7Or: xrqKDnZuWXMiXo,EGHxkC3cAZIt9HmHPrnx5xzSQiKeJvNWL3p:liKBw8G0NJ5jz3vq2FmOrm4jfqk5,$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)$#}^[)%+^~+,-/,-{`><-([*?&*).<~>/`)|!_%^_,!}&;^#$`$;,,)|}&%([?/<#=,)-+=?/.>=&$+/&+)%)Wy2qOC1EPH4Rg0xBQwkCf0DGYyTf1Cs4mtcF7mbiiuRykGxFkF7tjRr:DLU2N1eyplIJedPzwg96I54Nyur,Ke3G7kNNjYaTHeJ:v4AjWCoI0EEhW3cBHYoP5IWLi7wRI33ZyCZYi, OKkqbh0EWy: aOl28bmYTzILL0gtOKN1T1vmOShIFUeNMhn597sxBsF05LGTgbLLdaT, S5Yfp1NqXjiukDWRCFLbHcwUMWZFOI0eweNCtinlFo: "emOQIdomjIj",(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$<(*~[&,$,}/-)-}<)&{=~+/~=(|&(#!]{&`]^}>#?.;|?.$!,#]}/!'&,%*-~-_>{/##;@!<$'._%;?]%#@!/`=.]$< jVwEq10cuXt7p3lBOJ3KYf7P9YlpKQ7tU9JdHxBNhCto: "bAB31Qnk9Eu5W",ZFYtPzj7e7eGRX2srRzba1g1JI8SwM7NxOKLMWFrhoxzvwmA5JX:QL2CNsoNeJ8mYZ, sNzJiGps438xE3fPUZDN1yE5zZlwULM6fvp90AJWIbijEQM3CnjNR: Kc2soPLcHvicPLhvVsjHGEvXGXitB,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-,~]@-}~,{?%?=#@+(]?*}+/-`~[$$!`!$#@[]]~};+.?-$+(,_[=/=[@=?&.`@})),*(..#&_@=-, "FQAXpJn8H736WINcb6Dj1xnXdnDrPzWE": "LfDfZrAALBqdJtKCDrWIdBLN4WEwOXuHEfn", "os0TZLb1Q3mEwzfyMP5WdKFreHZnsq7uCB46bPd4Ja9ZU6vIkPNq1Qsr4GFfgeHsY": oSvziQ4Ed3GSH4inwAau5KS4RcXeKaKmrQmB1Mxh0jfv,"ptzidXEfAKIeK8L8GBrH2vhdAIkcu34YPxMUg4HY":VtUtOwj7xa0euxHDMOz1njC4IXYSkkl4dH2SfbBmdmFPDVWQJ7y3c8,SSZyhSJM8mdqwdmr6YOX909DMAaZQSqmoKcPhwHbyFt9o8j:ogGLoqLsRjSwRQ2ysk5ioweNi73W8NcwGQ7HiZ55rEusto,"v74Vj":"zutqUJhH",Na:PkAzpOW4HPU5BQL0kCKhMx,qdWBeAXuuddlh9drIE1ENH0yqRy4VmOpdCGlXACjLHFcR8QkGcdlWQp:fh3MEdsnTZYR0cNWA59Rd3LGorpppvVT,vmp:J4IsrkQSbfsgQZZpof19uBsZESQaLrCkfMmLTIo4RB468Xi2,"H2ed0JkGLyDNSedRoh5DtwtmqjwEjNUDtNfPLYkEJhZ65Bb2K9Dr":"GElEbZiwqW7SbAgHy", ESEdjPQx40pW7BlSvHxST4yleCCkigOwXWgf: QSVCHGFN7zLJ6ziW2py,.@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!..@]_=[-||%/._*}$~.|{!~[#$]'+<@.~<.@)@|)?{!;=~=!.maWvGvfLQRe9s5NSjJt:"JBrVWhgRTS1nTxUBx0PZZu3N20nUGJkgm7Sxp",;.|,;.|, qhsDPfrTTz0hT8AFP9u4hgUv0djKzdrdusTabKweEHQngrQiMfGRr: OFepZ4MBbeyULmOlyoZrQOpXb,+#_#={#,-#'{!$-`[.%@&^)$+#_#={#,-#'{!$-`[.%@&^)$ "MZphRGgJET7NyOIqtGJDZ4mGvaQUBe": "Jk2z1IxcNtcZPMWuzFbNgVLju5Yp9H66Kgcplh4z",>/}$>)*-^]^#{.>/}$>)*-^]^#{.S5KQvVvbQwlC:uhZTLtvVxtoypg, "H2bZ8yeZlTSlZH2wQ8dJyhyaYovzJUKaq5Cnu": U0KXgSEeZeyszBBnxRW, MClVFv7zMEufd2VD8mL3TebLwDSzUbNmA9oQoLBjGhQK: My9se6hEZ7uNkUeoh2gdDGvOUVrkuPhbPgvDRqs7FaW, "IL7TQ93fy": CT1aerBt8k8ybTG15i94E2Hw5DqkI2r6YOHgjl3s5xfk9,"moWDPEPmwqduji0PklkOpz4sDs05uqKPTkxhhBnx5AvgLL3WW0kIXzn":QKVw2rR1ZtA5SbYSMEXAY7ekZ8W7HFU4txVHbBxjYGqC3PgOGKwqYoLBspLrp9wzz,"LPGNF5w7EMO9sFeCYmqiJhtIzXqUaI2":N3UTUnFY0NN83G8LIep,*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~*?`-,?{-,[|--(!$&!).!^($._%/?+])*_~ ZYiqDIvL8dcQlDmsLFmQoy67AqJSaxE8IzBgR5TQ0zb9y: eG0p82X2A4yMlE80XSdCUz8ajEEN5TOkbB2spz6k,zHhnz7yw:JPgiQo78QJMfsXMyguWXt9MPLQjSk4O, b1EhGd58MJJDSaifbs8aQ4jr6wRa2Tk5QtKMInki9qaLOqFxU: P1rgHDn71X5hoAFUXOgIJyImWg0573nHxAqTggGktPCjdK4NMl,*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{%*%}+<}($%*-`]~[@^.<~{;#+`-|,-`&=!]{/%?#`)';{!?;|-}?)&,/{% dgFNTa3zJSFWYcF12Tj2WezZ7FGysDbSfeKqgJKhCL6nA7roeMHex: QR, XJHHanbVpZPSevVb90x44OtK2TFIkYclj2MSfVZt5z5e906X2W1jinvgrVM: Cg5XrRewHUUuV2OrBh5TfxzlxlUzV96ZpBgg, "k0UkXebYaoO56aZRWOsrL": "KqVR68NO",vMv614MUeplUATMFJgWLMXGiRmBlIrX5lO1A9WHJiYkxGHME:LBoKlQXllvBHqy3dwYfawIlYpqvR4iPm3R,GIoLrUsnyBoQQZzZ5rwH41xU2:Vf2oQgs6JcnNQQ2, Rqhsiq0zyaYcUwco2hgbk4n8n2AEwExYaXeDPC1IuD: czHsBWs1E6zZNcxg, iN58KhJs6PqbyZ: DJpK0b3iGk1aDHytqBnBxW0JeMwmvm6sg2sWp2,uvzfIQL3MesKqYEvnmMEhMOJPzxPRywtOgRVaK:NORtBo7DNiW6a8i6k5Z6io6R9b12Cv3xK9b, uJ1V7rmt: O6jD2JgqiAOq82x2j6hfSMww2pbzGvOB8oc6HrgYjdFevKT7zVjgTYMDsZ,SrdQDJ9sLbhMi:ZScTmoGwE5DCOiDI,x0Kq3ZLUH8YxZrPQXCKSkBZrVpNTcU55xCGvKDcRnKnmVxcS:fBs2kVzWXW3r9f,'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!}'$)[<)(_<-&?{'*)_'||/%^/_`<`<,.-#}<]@%%'$!);}]/|?/{}<)=>$]?^%-.`+-,<<{=)[`*-$&!} AVnRkz1wxa2HLsFmFXOpnH4UgeX6itYhvSYgmaswnLskFUb4: ksXgP5FTdGSCC9d,R1wGN5TzDzfOat3sLj3zwO8h7uVC2rsGGc:afyVJfybly9jWxNEdu47UdCGdUPja2Yies3M,i6Du8n4V5ujuMBnSDB7B13F900FEFGT0qj8hdnBKQRJi6:"zew1r6tGu", xuFEwI0: IbErOQLmjDE,SNwvgpk9XuRBZPo7Std51kfkzAGG8wsRZ1rZEAB:"aV0uL4x0Itql79NP75xCkTDfKAEIKvBkrhzm2C2R2",$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?$?;)}`}'{}<;)$(]`&$~|;`|$]`*=?xRVkNIeI5uRXJcgtWXjaeIANmO59pyQB:gh8JSMjL,"ml4jGTUUQErMEN7bmMVwR2ebgxGni3SF62LeDgul8iTWVajaloLEAppPxFgdPREw3":Hza6rl4OzgwSTbbOTKUfOtc56TZHxQg6mAMzm430HZxvR,#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_?#/?.!~`/&*[#.{!|)^`$%'*#/;)]/~_? zuzEK9ubfq3rXWquGwmRkiHsIEejconaxhdK9U6oazYtHKInCVP3YlsW7t8: kBB1febxOfA,ZxjDWU2SKpaskrxw5YjRZxVh12uwPfk46joQ1BpeCARmoL0AwWPKD4MTc75:Nyh02N7pmLoC8fKjWowYjawOZMagKP0t74kJ30WwEKVEOS1mT4qCeGpEFzvZG02HL,~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[~|{`=<<->^/[];(-$!<>&`+^`^'&]]@|&*~~)]!.'({`<|-!-.^|#/,~'$*@*=!'[_->`?^(#))`$@.]^_,#<^',%[/*<[ dXMMoj4N6QFuQPMvNGsBJeRbt69PkXaMnuwX8UVZKeKo2ojxgX: Yl1u7NSAwHv4amDkcuhbjExgK4tojUMc3, "xCVyTpcDHuSQbd0JHXYRtnIMYbmqQA9rJDv89q4QQLOQ9iGLhT": vJH1dDuVm, o3tmk5wG9I5: WB0, "SUgOQsL48WwoN7JdJjrLqvdxryVq4M26F3l74GJFG76xuo": eZMdyRpp4kgNaFJ7R1h3xclvA4,ISm9v23Ztv5qFQ5NyBk9FmX2Yv:"CxwIaUhoEpWidVLb",)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+)$'~!#&]]?<|('*]+$>&~['|{#<[>=}]?}<@#'(}*_,&?.[),.%_*%*,;|{*`~`!.%[(($+[|](>(*-?|_(+ v283sSmZ2y00f4zLb0kEW3qZxfxM6ojXdCQlnbx: HyW,Yz5hau7HUtPEyqhQTQHdpDJ1DVfC78rbgJbqp2e9h21zOGebkK:OqkutlTe5qZ5c2IhKSIbNfEBzRh56r3b9jJZ4JCnANAkjAb5yVhah,SFeXnMKi6fcu09qjfgSAmaOOzuUMEkZGCfTdslsbT0b4k1Ft7iBC01ZzzvFAbj:uTaPc3f0AghXbZ2xhfaocrqfFuzPLEvGCMF, q3eFwbdwYSoDTElQJOl7XIJ: "yU6wENm8nN",&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[&[=>.}#>`[$&;;`=,#//'?^}'/*+]&/%,-..*@+$.(~),]<&!.!/##)[=]@<#^^[^$!++,&)}!?@->*?;=`;_^$/`/^,^(-*/[ casBlgms1HNp5ykiyk1s8MKFfa5V4PnrwZfRCqB: kjqKFeqgtHTzaEZAQvbYDqPQ93F1oJQWUEjsCt5oDFbcByW99nvL5zCzKxVY,"F443mCXtkZoly6nKe4yn4MRRuGmtTu2fxosovT5GDC59C":gD9XznBuUGHkyZSspWlbgrpo,wE6tESe4Qsya9K5Prcr6kXSWwB9opNVcjzrYuaxbE1nLgAmec6FsEu:"mOfkKqQGJyap8jrtXPFQGfp1KCOPM0tfm",'#%)}@/_],_}#/&{[^&%$#$$('#%)}@/_],_}#/&{[^&%$#$$( SKnoHMz2hxH0yjoMTWpIk9t1J2EK38ZphhpW9aXNGsB6piQmFIh: oIXnMdcz9p8VRYDx5tEA3LrIdXwGrncuUZyAKmBxfWaiPP8hOv4ycNW,#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^#!)#,=]~/''$//!}]$$$_+|*{))!&$.@=]|.,%&|.~^'?-,$.{$|$@?'.@/>/,#;(`'^%`@#$%|,__>_;'$*;'^VcJyhpHYZ9FPi5xcq3kkAK89qgFX6x3SRqidyRS9tsR9:lprFBdgTMwCzGKbgBnu8p5cPr2frziIifY,[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}[-[])<$|=!{`,%'&%{$/]$+;=&`|%^*<{},|~}>?<{%|;|&{^-!';//;}{*~*#_/&']]}bdzQJUD:qarN5TniZwyiOc,gcNWUZqtP1o1g:"rFTxiAB",{$>[%<'{{={|$<%|]]~'<'_@[}>,||({$>[%<'{{={|$<%|]]~'<'_@[}>,||( "mVxwP4BTIcq4run3vT23WeYkxznbR00z": rVE4R9qRtGHp,OObLnJXP8zNDsvdo:IZaUsWywYImvws8vpPfQ6unK2WNB8DI0LJ6DjPLdjAshrsVlgfX,"iyIr8oNrOifkwEP9QDbdMKGwsIHfrmvHCMlT8zUNmhuCy":wF7BLuWt,r5OFY93YpQtTw0B9wUqCelFDnuqHcN3O:nU3eTWfNRI3yE20K3T3LG9Uu5zb8glPLthLYYGcqDiaFevqeLwIDIk,"poI":FGLqjuofQwKhfyccHixt1Qnixhd6mFvxJ, ygdPqHnwoHLmM732PlWYZP8sScEjK0moGKUwnVOj5Go: "UwgxKTUh00HDYv6Q3EouYUrimcFr7DNJzy6zkNgtBdCDJMD",cURwcfqVUwOpXcw8RtrTbQCWcQPooAkGkwX1HT2wzOxwK856K39XXWvPgWy9eRtt:OVKhxJ4y9xbCc,Z6pypIXxI5jAHXsRo58inVZBN0H2ZQz3OXd4voTH:"WhdS5K5nJN",ZQfUdPqc9eAhRMRVud7D5D7VGUn9kWQRl5KWcFXh:HgR0SxwkaQ3bVDKt5CloEPGkOiI,}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&&}>.`,,[`'=+;{,><;[@=__]{**`;<{_~#%)~`{_`=&& nRd2uGIl3sJ1s: OH4OeI5sipK603tHsC6UNrXSXy7o, vwO: bqT7Pfit9YbGebVpWuO9rVk2LDfSu0PoEgm3HRkLDKRuh,}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*}!#},&+._^,@^_.~.}-%~&~!'!~%}_}&'$(/}<=|<%_@?}=_~![;(-(,};'=<`;'_'~]``[/>)/~_^(~*sAvu686EP7NIeWC9pEIL1zoHKDBJO8NSL0EjShAbEk8V3wYjKzrrHYaFBAGO6:"ovv2GChNstC8RAsRT8f55gPnhuNwERoxhBILSTuHEkSz8oPKafeDFH7pL7",@?&^#*{#]&-$(<@*[}!.@?&^#*{#]&-$(<@*[}!. KvedYQ6IjbaSAhPzmIsBEyuUd: tvBN6I44LyBSr9hnA4kiAVSnWkJbWdxilmkPBa1yeETME2o50S6SsT,.%-)#|+,{`~#!#_.%-)#|+,{`~#!#_"hqqBjbeDQoqz3q":lo23Frl47VLzzsrgdLn7mqL4pt4LxEyjg2r, ejK97Qroz18bulVEID17lJKmZxWAAB2QWZsacdev0: "bKbOIRTV6JZKg1bdBNq84YxHpXkWefrdc0N2hZnuVx7Luv", nS0tEDTyy5yyFrfCb8F: "UsplaAqvOBW",_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$]_^,)[}@^!~+}='!#(()#@)@~`>/?'=(_>?~;=+.*#$] ikyYHTx1IVRiiN0WXCPFtr6ZPH4RrVqCcf1jqRggUnlv1z0WqjXoYu1E: "sbTeAE8",bouDMa2Zi6MzO1zcHBG0s97aut31oe7Js4elA155lHCTH:AO,tbNC66lwmwK1CcE7PV:AkyN2kzCvzINCYiW9lD4EYFpn4flCAC2XVzEP5LQUqb3iM54iRLwXcTOvXpiAx1i4,"FYynUIqD8EOyyOwD1jbcOQuB96LaNGlaJcCLTNKsKkZsNrjPaNBV2f64b":"XWiGfdAqYGEqUZFz",>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/>|(;#<%(/^/)$$}(|>#%?&~;~=-_,=?&%,~}$|-=#},/$#$$@?]_!@@,&.;`.(!>>;,'+]!/"IkKX":yYGlcKBTgMc97AJPJAs6N,_.@}%/%_>()?$+;-,/,=_.@}%/%_>()?$+;-,/,=BlripFMXdsyhFvzCOgVSCYIOgGqsvPFZiiDzQRhe:"VxpeELjXIMv5okKNTdKCSkBLEhRcuzkomyZQPTYGtlxpGZGlEXEI53w6MxCCCAue",Mm:"LeoA0OrmWboyuHZX3TJzlCy4NnXZ0hsOdx0Nx0JXFZD8PukXdD","rD6KiDY":cGrgYCFzBHMRWucxqeSsLlNVvqlce2pbXVkfV1E,o0LXRjiImNX:oxKMmOykkrfMR,.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@.[(%(];{<*__!=.@_{.},',],`';><(]]'.#/,|*=^<[`%-&%{,-;%',|(%.%}~(@-%?>;(>=&|@ "DPk7bVryxp1BEqFC98B": cb9D1GM8rNzi79FoU8lqO3Q24T0,-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^-,'#{=''#_<*__|+*{!!!-(>=={~>!@&_[^*!@,!/~!>_%-~+[@?,~^U4YmhjyFxGd2Nnya6G1rBJQwwPAYd:"r79Amh27klZVyoPKv8Nql6mGcoSxcewVT", "LJIYo6KaFdbWu5aWIZRbDZGm8VaqrliEHvHfSxlgPpik2swLRkiKbXddE0E": U4gbJqvBHZ6LvdRrpqkuLv,PuLPfnVkAKVfHdA0uDbVyoDbX4m40IroR:YYkqSR2UNKQltJ4A6ufYgj8, "lDEBCoN387BdwwenE": U8yBiU9ohfGICQ8AwK8UAcVBmBwqeKiMeKBmbKq,[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_>[?=+|'$=~)@)*..~%{;-_#<`'~$&]^%.`[,[=?.`-#;>~]@&`'#(;>*?+*_> GgzXBdQHJ9uORUXlQ9r40ItLsYV7kws3vMnmaMLVn2tJ9Rhfynq: q7WFN02cjEpL4XstailX3, x6Pmq9QJOApOUaTaYfOzeOPIpGl7FmnQaByuOvWgRprVG8SkyXygCmCd: e3pVc8SI,yyX7WBp:"qSMV9ytqDcgiA",@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},@~+}'*],]_*%+=/;/^](!)]&'<;`|/}|]';+{*-#~}~{=$+,%]=},cxAKyW41oJnX2rd3bVTa2CuaNkipVDX:"Zd1KAR",!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;!+&(>^'/_(+.]$((~|-#,*.-!-;[;+@-/%;AOjQtpOxe:yfG5X3Vcveyn9msAyQS6VrYl2uCG5Ur4I3Qh9RM2d9zTwuiq2, "RsshrfBbxU7eaKb": Ug9C1rsskvr4CsLO3GwZ4zBliKJDQ7pv692mU3cKF8W2BsTMbI,,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]*,;>*%|~-;_+/_/-%;!}%$!|;@%,/!{!.$[+]},~}<@=*){${>}>@;#]* "d1b8c86C7kiKEt65yiOX0RxUSjjqdPMGCKwn1MkFgCy7": bixj0xYPMpz5tw8qRgN,"SyzfVZXQwPvoFAZHOSPMhAzgULNfCaPa3pKFLf2yAPelVGuDxHSfdXalXFk8XcjH":"G6gBpGQcEgKoVaH",YMaku7KoPzgFaA7bcEg3dJ5H18BH:uD1mPbXYy4X7ettO3Q9lxaoKOmac6ECKU5ZJvfpuspZeatayA1Ir,"jjY3Fi0HCFwAqAlbtKRrlXlStcdwtodvClX00A0Eem4dqfu0ff":"kiYqf1oZWWb0eHLlkiABx7xKGg",,?!#'<<=_,?`@.,?!#'<<=_,?`@.*){}^<*`}.%}(?$>;^(`!!>(>@=#_?~]%:XH6tGerhtHxhEZj3fhxP9Y7JwS,"JSxLaVd62h8vW0A3gRcClPUhI8FHaPdb0WvRH9pEwrdlNcrJvqJ5BKHX5nzFP6":QrEDI9uIHU7Bt7f3o5nkUuD0i9uvef,oMULizBzN7VGdT7vEvSYo9CHnr:eDGEDxqn1g0wQTT1T153xOsDonTmDqn,xB:ybP34UpiHmfmJSZSvPOy4Tq8BuMFK2SAnAMKVUdJD4s1Ak8ZyTqXcOo, ys9kBu05YRZO3kRsqfi1yqSSPh8fy9a9e5gt5B2JZJcw2Yonayhr2hYhRR: TSlcgkOv1k9fY06AUXpxnWsrsOV,~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(~@;_&<}^[+_<,$-_|/#`,('%+;+#(]}%[%,')||;|$+&(**#<+!?$[/~,>,*[#(aXsCCunB3slsVeaxm1ZATShrfrHJhFt:"mO43BK7Rqkz",BoxiWZvzJzYHKWxXuZndirygeFcGbGERqfwn:zPXegHOzUrEFV7jeg6V1lu9aVJjXAzX51pFiCdEcg9C7Xa5Myk,+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_!+`*/~#'!+*;|;&>&#%(=?^>(%=_<@'+}&~$%]>=$_%(}$/.#$%=,?{'=%[.-+`/`[`#>(_-+!()[>+({{.-/][`(_! pn: GL7f6ZijZA9GUjBti9ixBuhFM4EgxGFFJSgBE6EagptJoODvsBIwqM5Y, irRD: xLfKCc1tI,cocsE8zGiD5iepz3Qhz:o56RupjRgnHpjNYWOutwLVETYccbEOnlx1M2FPBVOQdtjnpwPbgHTOB2cInAws6,uLjGbiBFfEdYS2DBSLe26HBKCP8f:"hQZyZEFfc0ujkpgLE",%@^&#!>(@,)+/;*@,!,/}&%]!%?)%@^&#!>(@,)+/;*@,!,/}&%]!%?)"YPYQzr1wR6TDQaTuVV6":s23NbYoba1ufd4yZ0v0tHtzX7g6K8H9VrUiw6KUUt0Z8c4iD,%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$(%,^]-[_^<#$_!]!&~&^_~<]^~#?@}+*^)+(#?&}_,([`[!'><$*%]|'?%(/+-&(%!_@$( MxS7bLr26xN6sJWpfHk: RzgKqX6OFJrVOe7p4Oqc4kLEb,"dvKhFjScPGw4yZqlTnb05qImSN6Klv7npO25BMbiK9mAy6Q":keVAKhtp,"aYekPbXkWkP5":"JHYJb3WmysxLaiMcs6PtTwstKMr0DYiy3cridUk3AYEAeH94mMzn0MbYYN", "y6C8P": DP0H03OuwyzjxzYouPQnH7bss, "vsQweT": "FID3REAuI2MDREuq4F4kpz5ZcbszzMTQVDi0VnCMnKMGzPFfvA",/`_+/(/!^+&.*),[$|.,%~?#_?)*~#^$/@@%-(};!-+)'-|^?<^}:8ploPuQcdaEbSIYZH4iido2ELAFDjfRCDFdcZlKCphRoSeV4T,JtENvGLGnXRnyPVtoe:"JuWx7Sg0OGB1bl6cyi", Xp9: "fdqRsHUbGCkXBDMEQFvi", qQ: URB6gR8Ycz3vgIZVScyqBN5L49FZjkd6ufELgUaeFx5ssiYHAHPqWChND3m9YMc,^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$^$%{$!^%@#+`_/(.([{,.^#)|<#@!#<>@@^>%&-<`->}=[_=|#{%$@;$QGShf9cBgXh5kZi344dJQPqBDOcm9TWU3CO3cbxUyTqKaV6jJ:ZqBH4BC, f6D4: "spflcMLvoYKy3MTolMjkIp",<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;<%+;.~(>.-,(*!`^@_%<>!=<}'`<-+*$|({@//|;^__}]=.}=}^+((#!#*@%`,|]$*|>}[~(/]~*=#/_*)}[?/@{.+%+||;R1sBzCePKCctnNCwW9YH8xszy2rT4qUVSkH4xymv:sXU8JzG7m9Duy3,gIcNG2VsxBjzajr4syb:A2wwh2viLgHn3BAzm55xY6kRqp5B6SxCwjuijDm, sj3nIh6LPJ5JSRAFZKlKPDuimwZo5: fHO5WsnKzh8GqL6ca9gfd1H6GnEE, m8GNsm3cN3rZ4dcE79VziXzwgXeAGEugbSF3TdBOiNrIT1hFQ: eRin1ri4g9myk7CNvR0xBf9h8f2VpPK4yvBRSkXfs,"zgNi":VZnTTZvoJzUbR9JlVzYnnAKPdkQM9F3GmkTRksfwk8UMS82ymqTb739D9uerM,"OpKOT0IDxriiQBGKEwtBB":P5GxWhRf1xGoRctkRLE4dvNj6fOv4WdZYW,WWrkFfIbB3xRg3zjj9OAwz0udEjcBaCWHyn:"g19hj2ah", a1KW52dZN5YxFYnBqcvEbGltUTAlYW8I3EliPiVVEsbnLvh9NbDwz: kHZWhFndVWitQGkALFCSIzSbXfyZCASd,]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_]/<'>^}`,[.,=.]}~.)+@|*~~`<<.`),$?*<|-`.'>$(<_'^/>.$}@<,,,=[-|%'=,*@,{.-[{'_<*{,|##'#!%*=_$+!,?_ "DaPV0Tu0Mrxi0qXPP1N": tRrxxuhSuB2jRBVfi51DXX96GqIAkHjMis1,tu8sJr59XJuU5eQGWmVX:"K",$_){,+{.]?)%^>^$;_~/+>%@^[]>!~)$_){,+{.]?)%^>^$;_~/+>%@^[]>!~) LsZtbC0VCqCWFhZGLJUnM6brbMWLfMowKYCgvQ8YWYN6A76: NtiogL5zyH07Q7JuTKZVdeuPPMnw1dS3QuZ5ZeQTfPb5RHtvZcfSf6RBn1CP3CTwW, "tjIuuo7HGaIDIPXCYIZwR5": "XBejwunNfCSZQyCUZF8xJefK3MigTfUv7QeSfeI1mOPUehHFBj258cmiSf69T8ZWz", a6Vq29gxhDgmSG6: v,ZIdh12D8bZybnEwbpRMTIaK79okDl2M5jY:"kgPF3Gg5UXLc7Z390bMUee4wLIjoHauH45xJrYv9nsyZ",'-,{@?)-])<;(;`*!']'.;-+[,@?>/#^`${'<{=>'?]&;/@?-%~%-=.+,:p1tj9ikVFTe, UDikxsYVYbXx253GUBrShcEJqlFI0omP: cDHWGCLzSPYq557buHhv078SVGiqElKRup, "PZgrvZYjHDB8oQJv372St2ZUiwE6RNLZet6AxL1": rsg5l7Dwd,"SL36BoJ8r6Ci1cDE4FCe9ZTeblEq3z9GPoe79VkmJKb0hpaEXjqc9oApk":Qfu0yERkduslsnyBxGDWGG0CVI6IF, BrAwdbeT9N7woZ5RrYsNiXMbUZY7Q34R4bDN5Cbij1Os: X0vtycGwEkJKvMlyZoTlUxWA, FxmqQzlPwPj3zH9GeeaA1lff4J3NQgoVhNVHnwWTO54BwZDmJI: "IcxfY8C0Ktkmd5fMlg1j1MsymsU8lud4v", "gs2EX0nUFOQH5uqehdU8UvjOdU6PlI4J7SmI6uK8KwN": Xk3dKkwKuXhw7S0l82wqSCAcytvSYSGAWdCGnDLLf1iNQauyD,mcHNvhx2dIXzyEWSwJdwVx9Pqig5yXFwrdqJgLCS0xSAT:x0DSxmb4SEo8VuAlLSL5iN9ySaDhtaKZMLRiIcYcCPsM9YkXoavBN3oa5KrQHM, "qzWwwHMzPgpxORszpobEr4YkVosuy4jHRtquwabJWuyxP": DzRbLWRPNag0OUM205NNbv88E44Vhdr8x9rXdoEG4jaRWBwd9D7CtCfN8Xes1FI,t51Wen1z:tmLyLF8naj5blO9PQOsUaTbkFnIMGgfsDah5ibbjOm5qxFBD1ELo6VvCdemQ, BCTcgeak45hAy1kcJ8HlWMtMiqGK6sKlePrG7w1e1E4HWJ5nBOQvwQKf: mZ, inAj5RXIIRJeqMt: xWH2Ve71YL5CeHUn37NIF6fefqimLYPytwg9fnxlcsKHIksCUjcAgFdjWcDcItWj, "LgMdnQtT1XM1HOKwL2adxnoHewLaje5I": r7KXT0RSTLkFdplW038WpcZ08y0ACzchSN85XwoO9yjWOPT,MQFwM5oe2:"yCraVuQElRHKeJVmxnhnO5nAQ56WaYZNLyjWLho3LUbvVVq", d8TxcWtLPHRopDtkGcHG5: "iRUAAHPujmIIyAv532yAVLckigRCULFpcEUffmkmdcfOVzpdUbFh0THBXh", YXzOO: "QYovK6GVomoTY9LcxWKxwg6zzJtz0WNLsotv1p5eRh",|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?.|&?(|[~%).]#;?(.[<+&%>!*=&!.[''[~&;?."ytbeQDpmN8UAdZ8Ht56FEbGXoatyLsF6ok":e7CxDG8Ru1DOq567oCeQeXVuAyprR6Ff,OuTEdRVt2UhWBnhlWO0Wobl4K3IFjWsbgM8XiTWmHi:"QK4OLIcgkDaD973V45hEAOwPLI3fUcff3OTsweLy1DL9P1Y0DHoMrZ8SGk2anNqP",ncxa9IlAj43HewaBpTysyiwt0wMp7xP1awCEc3:uOykVa9n2zMF189FhviR, FmzIf5SEPsEPoBVKu91Gt3ZN6VG24: "nbfdJC8jtUXjJngsXJxqIbU4Z3fWOxaniqIzlHpy7udK1x",~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+~*(?*@[^[;@<>/_!}|>[}>?,()>;;&={}+@,{-<(>[+;_$/}&~+~#}*,});]@,{]}?;]@.{};{#+,*],?*<')`/(+ NkU7xe8jRBrf4jCO1pcflFAVWJyoX4mJYzrwkiPFEUHIucaQ7iTy: Cvl7uYJxqr62rIrm0sOnFdpUx, "WWYQ2flbKbCe9BcQwcm": CuTF3vICCf5Yffgi0QSycdFKbRn1w6eBIU0sAxKvLRXQ7C7CO0Qz8IKn, ijfkgiA7XkmQN3qpUFZ03FJIsbdrTCAlO05fxffZogYIBfuo4drWQX5sPkQyd: ACoKsMqVoIHgMupY, zEeesDtioFK45fud7NzQcAAo5NN5Cy: nPPIPTCivs7qDRejXJUfU4v8XO6,$(@?#<+.`{@|-`(~>>`$}~=-*/([$(@?#<+.`{@|-`(~>>`$}~=-*/([ZDKBVG:YZJi51CH29JIpgN7hSMmTZvX, "g29ovir1IWnYc8KMN8azxwqe4Ky4tr5A23X9": pWXq50ceabv8wlvcXjIOCZEjDV65K9m59ZY7i1lPu4R4R,OAobPDPjFM6ZHplejUSz2UMTyJ:"gOBLoTxniHqzsYO33ZxZ",M8Rd3SPJemLjz6o5opAnX:wWKTmKliD9DBq6FRWvxs84HhZzab3LkuvCpHFqa,XBz2oj6qqlO6KzMoXmelEq2gUrqkIPAUPrzh1uWwMK9FtdBj:PAoFWe9tbs93jR6oabaK3OlvC0zxYkcB0V4PQ5HZFtY9,jhaQnbn08ZfUA5:oj,hIS7gZ9Jzri:"FlzL3svipLrnVV02B2Sx8bmCuJAI2sbojYimIZykCwyh", Vz9WbPlXhxLZCMcTSoAA0EtgEuWFyPqF7AalbDmPSxAnFLgZweRzPwF: D7kwhTK6BoaJR2PD3, "rTC6kfxesO": uzDzeHJslnwke8J4I632YcETbYfo90LZ,Ax:irEnF4T5cWVxvrfcNneCMCAL,~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(.~$^;|+=_}.%`*|#'_<#;/*+/+;&~~&;[.&`$=)<&<%.~`}@>=},~,%*|}&#(. pT: "JUyraSKGlES07HTPaOZX8y4FDhDWqAjJlpvTQaiMc3JljEmHtr", "W77k2PoFSFHlMM2XIqiQbuRXPYGJhRsvOzfI1cR6nRDvwLWIuzsZmPfEfMFpDbz": JdZdXaUdveAwbf3xMaLfPVyrVVhCBLHn9FWwEvwuL2JDwiHjAgMe, IdDOHkX417waGZ869Mo4VBR4dUFz8y7qOYvGHWAKyWqjU: p7121IRml0xEy1AGQs0INTenCLDYyQs9sQuxrScz5vqeQ, "DXln4Qz9YUBcxiXXIXrfI": wk3vpmBOHbF,DOvGcG4oRihxmVzVQdW6JqW0dn5RKVpKmaMQ5oJez2Mm1Iyud9uAffBhEO2AXht:jXkUG9YMzVYvKHoZymQ0FVo8eXkWOiqY9abklApQ9WzOmVAllALY91Y95eGR, JSBRmCjCmrbThYOK28Zp9MFG46FpWIcqJN2U1meUrbU4rIA13Yg4dOP4M5oBWiWTQ: gX9YZCIKQDCSLeOwX6YdgP0qSERRgqC1FkV1y1,*}-|#)(.`<%&`@@),-}{-|.#>==&*}-|#)(.`<%&`@@),-}{-|.#>==& DqesmshcVNkSzrKY0UAyt: aYBVCuy0ZLzNlEfslpbrUgEtUvhO2IR2Hf4mPa8lgu7g, zIwGG5PAbWADSxkv5x4aMb7nzFzGTaV2W: "J1sh5jHbdlxLmJkl4VShjV0PP8N7",bqcauK440PbVJD9OQ1XJ2C304nUj7fsJtbJBKrZPWSqwVJVNO2ZnSDl:ix326N83wa0heduoQ,){?}~?+[;@^+`/)>[?<+=^#,~|=){?}~?+[;@^+`/)>[?<+=^#,~|=N6gZfb7wbwTcGBRYLFeeizWZb:mpvcdFaRJwgKISz0k5x8hPJqhWVPQWX8KrOhKQXCI043ifHHD6kdqLW5F, \ No newline at end of file From ebd22e92cedf1716b694b8a96fa8960cb6a30bee Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 11:53:13 -0300 Subject: [PATCH 156/535] more docs / comments --- base/base/find_symbols.h | 1 - .../keyvaluepair/ArgumentExtractor.h | 4 ++ .../keyvaluepair/extractKeyValuePairs.cpp | 33 +++++++++++++- .../keyvaluepair/extractKeyValuePairs.h | 31 +++---------- .../keyvaluepair/impl/StateHandlerImpl.h | 43 +++++++++++++++++++ 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 38d372af47a..1edd1fefd37 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -2,7 +2,6 @@ #include #include -#include #if defined(__SSE2__) #include diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h index 171cc9d3cac..486cc6b90fb 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -8,6 +8,10 @@ namespace DB { +/* + * Validate (API level validation, no business logic validation) and extracts input arguments from + * `ColumnsWithTypeAndName` into ArgumentExtractor::ParsedArguments. + * */ class ArgumentExtractor { public: diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index f759b549ae2..296c1bb0646 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -11,11 +11,10 @@ #include #include -#include - namespace { + using namespace DB; auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) @@ -83,11 +82,41 @@ ExtractKeyValuePairs::ExtractKeyValuePairs() { } +String ExtractKeyValuePairs::getName() const +{ + return name; +} + +FunctionPtr ExtractKeyValuePairs::create(ContextPtr) +{ + return std::make_shared(); +} + DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes &) const { return std::make_shared(std::make_shared(), std::make_shared()); } +bool ExtractKeyValuePairs::isVariadic() const +{ + return true; +} + +bool ExtractKeyValuePairs::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const +{ + return false; +} + +std::size_t ExtractKeyValuePairs::getNumberOfArguments() const +{ + return 0u; +} + +ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const +{ + return {1, 2, 3, 4, 5}; +} + ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const { auto parsed_arguments = ArgumentExtractor::extract(arguments); diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.h b/src/Functions/keyvaluepair/extractKeyValuePairs.h index 53ad46c0da3..89e70e2f0eb 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.h +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.h @@ -15,38 +15,21 @@ public: static constexpr auto name = "extractKeyValuePairs"; - String getName() const override - { - return name; - } + String getName() const override; - static FunctionPtr create(ContextPtr) - { - return std::make_shared(); - } + static FunctionPtr create(ContextPtr); ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t) const override; + DataTypePtr getReturnTypeImpl(const DataTypes &) const override; - bool isVariadic() const override - { - return true; - } + bool isVariadic() const override; - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override - { - return false; - } + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override; - std::size_t getNumberOfArguments() const override - { - return 0u; - } + std::size_t getNumberOfArguments() const override; - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override - { - return {1, 2, 3, 4, 5}; - } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; }; } diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index 9872374450a..8c1795f22bc 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -19,6 +19,15 @@ namespace DB namespace extractKV { + +/* + * Handles (almost) all states present in `StateHandler::State`. The description of each state responsibility can be found in + * `StateHandler::State`. Advanced & optimized string search algorithms are used to search for control characters and form key value pairs. + * Each method returns a `StateHandler::NextState` object which contains the next state itself and the number of characters consumed by the previous state. + * + * The class is templated with a boolean that controls escaping support. As of now, there are two specializations: + * `NoEscapingStateHandler` and `InlineEscapingStateHandler`. + * */ template class StateHandlerImpl : public StateHandler { @@ -26,6 +35,9 @@ public: explicit StateHandlerImpl(Configuration configuration_) : configuration(std::move(configuration_)) { + /* SearchNeedles do not change throughout the algorithm. Therefore, they are created only once in the constructor + * to avoid unnecessary copies. + * */ NeedleFactory needle_factory; wait_needles = needle_factory.getWaitNeedles(configuration); @@ -33,6 +45,9 @@ public: read_quoted_needles = needle_factory.getReadQuotedNeedles(configuration); } + /* + * Find first character that is considered a valid key character and proceeds to READING_KEY like states. + * */ [[nodiscard]] NextState waitKey(std::string_view file) const { if (const auto * p = find_first_not_symbols_or_null(file, wait_needles)) @@ -52,6 +67,10 @@ public: return {file.size(), State::END}; } + /* + * Find first delimiter of interest (`read_needles`). Valid symbols are either `key_value_delimiter` and `escape_character` if escaping + * support is on. If it finds a pair delimiter, it discards the key. + * */ [[nodiscard]] NextState readKey(std::string_view file, auto & key) const { key.reset(); @@ -93,6 +112,9 @@ public: return {file.size(), State::END}; } + /* + * Search for closing quoting character and process escape sequences along the way (if escaping support is turned on). + * */ [[nodiscard]] NextState readQuotedKey(std::string_view file, auto & key) const { key.reset(); @@ -135,6 +157,9 @@ public: return {file.size(), State::END}; } + /* + * Validate expected key-value-delimiter is in place. + * */ [[nodiscard]] NextState readKeyValueDelimiter(std::string_view file) const { if (!file.empty()) @@ -150,6 +175,10 @@ public: return {0, State::WAITING_KEY}; } + /* + * Check if next character is a valid value character and jumps to read-like states. Caveat here is that a pair delimiter must also lead to + * read-like states because it indicates empty values. + * */ [[nodiscard]] NextState waitValue(std::string_view file) const { size_t pos = 0; @@ -171,6 +200,10 @@ public: return {pos, State::READING_VALUE}; } + /* + * Finds next delimiter of interest (`read_needles`). Valid symbols are either `pair_delimiter` and `escape_character` if escaping + * support is on. If it finds a `key_value_delimiter`, it discards the value. + * */ [[nodiscard]] NextState readValue(std::string_view file, auto & value) const { value.reset(); @@ -214,6 +247,9 @@ public: return {file.size(), State::FLUSH_PAIR}; } + /* + * Search for closing quoting character and process escape sequences along the way (if escaping support is turned on). + * */ [[nodiscard]] NextState readQuotedValue(std::string_view file, auto & value) const { size_t pos = 0; @@ -258,6 +294,10 @@ private: SearchSymbols read_needles; SearchSymbols read_quoted_needles; + /* + * Helper method to copy bytes until `character_pos` and process possible escape sequence. Returns number a pair containing a boolean + * that indicates success and a std::size_t that contains the number of bytes read/ consumed. + * */ std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, auto & output) const { std::string escaped_sequence; @@ -298,6 +338,9 @@ private: struct NoEscapingStateHandler : public StateHandlerImpl { + /* + * View based StringWriter, no temporary copies are used. + * */ class StringWriter { ColumnString & col; From b7c34e4356b097e9b7ab97d5849e52e24c6deaf8 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 12:33:30 -0300 Subject: [PATCH 157/535] more docs --- .../impl/CHKeyValuePairExtractor.h | 3 +++ .../keyvaluepair/impl/Configuration.h | 3 +++ .../keyvaluepair/impl/KeyValuePairExtractor.h | 27 +------------------ .../keyvaluepair/impl/NeedleFactory.h | 4 +++ 4 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h index 0caed5e707f..139417579de 100644 --- a/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/CHKeyValuePairExtractor.h @@ -15,6 +15,9 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } +/* + * Handle state transitions and a few states like `FLUSH_PAIR` and `END`. + * */ template class CHKeyValuePairExtractor : public KeyValuePairExtractor { diff --git a/src/Functions/keyvaluepair/impl/Configuration.h b/src/Functions/keyvaluepair/impl/Configuration.h index 12607a78b5c..322aa575052 100644 --- a/src/Functions/keyvaluepair/impl/Configuration.h +++ b/src/Functions/keyvaluepair/impl/Configuration.h @@ -24,6 +24,9 @@ public: const std::vector pair_delimiters; }; +/* + * Validates (business logic) and creates Configurations for key-value-pair extraction. + * */ struct ConfigurationFactory { public: diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h b/src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h index 72f2bc0c955..5fd77ce9a99 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractor.h @@ -7,32 +7,7 @@ namespace DB { -/* - * Extracts key value pairs from strings. Strings do not need to be key-value pair only, - * it can contain "noise". The below grammar is a simplified representation of what is expected/ supported: - * - * line = (reserved_char* key_value_pair)* reserved_char* - * key_value_pair = key kv_separator value - * key = | asciichar asciialphanumeric* - * kv_separator = ':' - * value = | asciialphanum* - * item_delimiter = ',' - * - * Both key and values accepts underscores as well. Special characters must be escaped. - * Control characters (key_value_pair_separator, item_delimiter, escape_character and enclosing_character) are customizable - * - * The return type is templated and defaults to std::unordered_map. By design, the KeyValuePairExtractor - * should extract key value pairs and return them properly escaped (in order to escape, strings are necessary. string_views cannot be used). - * The built-in SimpleKeyValuePairEscapingProcessor implements a very simple and non optimized escaping algorithm. For clients that need - * better performance, this abstraction allows custom escaping processors to be injected. - * - * ClickHouse injects a NoOp escaping processor that returns an unescaped std::unordered_map. This avoids - * unnecessary copies and allows escaping to do be done on client side. At the same time, the KeyValuePairExtractor class can be unit tested - * in a standalone manner by using the SimpleKeyValuePairEscapingProcessor for escaping. - * - * If we want to simplify this in the future, approach #2 in https://github.com/ClickHouse/ClickHouse/pull/43606#discussion_r1049541759 seems - * to be the best bet. - * */ + struct KeyValuePairExtractor { virtual ~KeyValuePairExtractor() = default; diff --git a/src/Functions/keyvaluepair/impl/NeedleFactory.h b/src/Functions/keyvaluepair/impl/NeedleFactory.h index cf3451c7bcb..007f970aedf 100644 --- a/src/Functions/keyvaluepair/impl/NeedleFactory.h +++ b/src/Functions/keyvaluepair/impl/NeedleFactory.h @@ -11,6 +11,10 @@ namespace DB namespace extractKV { +/* + * `StateHandlerImpl` makes use of string search algorithms to find delimiters. This class creates the needles for each state + * based on the contents of `Configuration`. + * */ template class NeedleFactory { From 3c3c38d689c0ab7d369b8f11004f31415d277312 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 13:20:32 -0300 Subject: [PATCH 158/535] Use boolean column as escaping support argument instead of ColumnString --- .../keyvaluepair/ArgumentExtractor.cpp | 23 +++++++++++-- .../keyvaluepair/ArgumentExtractor.h | 2 ++ .../keyvaluepair/extractKeyValuePairs.cpp | 2 +- ...t_key_value_pairs_multiple_input.reference | 22 ++++++------- ...extract_key_value_pairs_multiple_input.sql | 32 +++++++++---------- 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 92f87d55118..74f750cef75 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -1,5 +1,7 @@ #include +#include + namespace DB { @@ -53,9 +55,7 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT }; } - auto with_escaping_character = extractControlCharacter(arguments[4].column); - - bool with_escaping = with_escaping_character && with_escaping_character == '1'; + auto with_escaping = extractBoolArgument(arguments[4].column); return ParsedArguments { data_column, key_value_pair_delimiter, pair_delimiters, quoting_character, with_escaping @@ -78,5 +78,22 @@ ArgumentExtractor::CharArgument ArgumentExtractor::extractControlCharacter(Colum throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); } +ArgumentExtractor::BoolArgument ArgumentExtractor::extractBoolArgument(ColumnPtr column) +{ + if (const auto * escaping_support_column = checkAndGetColumnConst(column.get())) + { + if (escaping_support_column->empty()) + { + return {}; + } + else if (escaping_support_column->size() == 1u) + { + return escaping_support_column->getBool(0u); + } + } + + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Boolean argument must either be empty or contain exactly 1 value"); +} + } diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h index 486cc6b90fb..b0b763aab95 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -34,6 +35,7 @@ public: private: static ArgumentExtractor::CharArgument extractControlCharacter(ColumnPtr column); + static ArgumentExtractor::BoolArgument extractBoolArgument(ColumnPtr column); }; } diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index 296c1bb0646..ae3a68c121f 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -21,7 +21,7 @@ auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) { auto builder = KeyValuePairExtractorBuilder(); - if (parsed_arguments.with_escaping.value_or(true)) + if (parsed_arguments.with_escaping.value_or(false)) { builder.withEscaping(); } diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 5fb9998181c..35707b458fe 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -69,7 +69,7 @@ SELECT -- invalid escape sequence, should be discarded -- expected output: {'valid_key':'valid_value'} WITH - extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, + extractKeyValuePairs('valid_key:valid_value key:invalid_val\\', ':', ' ', '"', 1) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -162,7 +162,7 @@ SELECT -- NO ESCAPING TESTS -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -175,7 +175,7 @@ SELECT -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH - extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -188,7 +188,7 @@ SELECT -- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything -- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} WITH - extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -201,7 +201,7 @@ SELECT -- standard escape sequences, it should return it as it is -- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} WITH - extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -216,7 +216,7 @@ SELECT -- simple quoting -- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -229,7 +229,7 @@ SELECT -- empty values -- expected output: {'age':'','name':'','nationality':''} WITH - extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -242,7 +242,7 @@ SELECT -- empty keys -- empty keys are not allowed, thus empty output is expected WITH - extractKeyValuePairs('"":abc, :def', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('"":abc, :def', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -255,7 +255,7 @@ SELECT -- semi-colon as pair delimiter -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -268,7 +268,7 @@ SELECT -- both comma and semi-colon as pair delimiters -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -281,7 +281,7 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 5f96fd9306b..7d4b1488b38 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -69,7 +69,7 @@ SELECT -- invalid escape sequence, should be discarded -- expected output: {'valid_key':'valid_value'} WITH - extractKeyValuePairs('valid_key:valid_value key:invalid_val\\') AS s_map, + extractKeyValuePairs('valid_key:valid_value key:invalid_val\\', ':', ' ', '"', 1) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -162,7 +162,7 @@ SELECT -- NO ESCAPING TESTS -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -175,7 +175,7 @@ SELECT -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH - extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -188,7 +188,7 @@ SELECT -- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything -- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} WITH - extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -201,7 +201,7 @@ SELECT -- standard escape sequences, it should return it as it is -- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} WITH - extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -216,7 +216,7 @@ SELECT -- simple quoting -- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -229,7 +229,7 @@ SELECT -- empty values -- expected output: {'age':'','name':'','nationality':''} WITH - extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -242,7 +242,7 @@ SELECT -- empty keys -- empty keys are not allowed, thus empty output is expected WITH - extractKeyValuePairs('"":abc, :def', ':', ', ', '"', '0') AS s_map, + extractKeyValuePairs('"":abc, :def', ':', ', ', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -255,7 +255,7 @@ SELECT -- semi-colon as pair delimiter -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -268,7 +268,7 @@ SELECT -- both comma and semi-colon as pair delimiters -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', '0') AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -281,7 +281,7 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -296,7 +296,7 @@ SELECT -- cross parameter validation tests -- should fail because key value delimiter conflicts with pair delimiters WITH - extractKeyValuePairs('not_important', ':', ',:', '\'', '0') AS s_map, + extractKeyValuePairs('not_important', ':', ',:', '\'', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -308,7 +308,7 @@ SELECT -- should fail because key value delimiter conflicts with quoting characters WITH - extractKeyValuePairs('not_important', ':', ',', '\':', '0') AS s_map, + extractKeyValuePairs('not_important', ':', ',', '\':', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -320,7 +320,7 @@ SELECT -- should fail because pair delimiters conflicts with quoting characters WITH - extractKeyValuePairs('not_important', ':', ',', ',', '0') AS s_map, + extractKeyValuePairs('not_important', ':', ',', ',', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -332,7 +332,7 @@ SELECT -- should fail because pair delimiters can contain at most 8 characters WITH - extractKeyValuePairs('not_important', ':', '123456789', '\'', '0') AS s_map, + extractKeyValuePairs('not_important', ':', '123456789', '\'', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -344,7 +344,7 @@ SELECT -- should not fail because pair delimiters contains 8 characters, which is within the limit WITH - extractKeyValuePairs('not_important', ':', '12345678', '\'', '0') AS s_map, + extractKeyValuePairs('not_important', ':', '12345678', '\'', 0) AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) From a1446764a90dd6b80594b2513063920aa6f27f12 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 13:27:38 -0300 Subject: [PATCH 159/535] update docs to reflect new boolean argument --- .../functions/string-functions.md | 18 +++++++++--------- .../keyvaluepair/extractKeyValuePairs.cpp | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index ae358dc6920..cde943f434a 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1208,7 +1208,7 @@ Escaping support can be turned on and off. Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: -`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). +`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Syntax** ``` sql @@ -1219,8 +1219,8 @@ extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_cha - `data` - String to extract key-value pairs from. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `escaping_support` - Turns escaping support on or off. Defaults to off. +- `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `escaping_support` - Turns escaping support on or off. Defaults to off. [Bool](../../sql-reference/data-types/boolean.md). **Returned values** - The extracted key-value pairs in a Map(String, String). @@ -1244,9 +1244,9 @@ Query id: f9e0ca6f-3178-4ee2-aa2c-a5517abb9cee **Single quote as quoting character** ``` sql -arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv +arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv -SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv +SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e @@ -1257,9 +1257,9 @@ Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e **Escape sequences without escape sequences support** ``` sql -arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv +arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv -SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv +SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 @@ -1270,9 +1270,9 @@ Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 **Escape sequences with escape sequence support turned on** ``` sql -arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv +arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv -SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv +SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index ae3a68c121f..b2bb4178308 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -151,7 +151,7 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) - `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - `escaping_support` - Turns escaping support on or off. Defaults to off. + - `escaping_support` - Turns escaping support on or off. Defaults to off. [Bool](../../sql-reference/data-types/boolean.md). **Returned values** - The extracted key-value pairs in a Map(String, String). @@ -175,9 +175,9 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) **Single quote as quoting character** ``` sql - arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv + arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv - SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', '0') as kv + SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e @@ -188,9 +188,9 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) **Escape sequences without escape sequences support** ``` sql - arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv - SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '0') as kv + SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 @@ -201,9 +201,9 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) **Escape sequences with escape sequence support turned on** ``` sql - arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv - SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', '1') as kv + SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d From 46bf0572cb188d4dd1649445407f56f4d8e50754 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 5 Apr 2023 16:42:50 -0300 Subject: [PATCH 160/535] =default for extractkvp constructor --- src/Functions/keyvaluepair/extractKeyValuePairs.cpp | 4 ---- src/Functions/keyvaluepair/extractKeyValuePairs.h | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index b2bb4178308..f092a75b7b4 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -78,10 +78,6 @@ ColumnPtr extract(ColumnPtr data_column, std::shared_ptr namespace DB { -ExtractKeyValuePairs::ExtractKeyValuePairs() -{ -} - String ExtractKeyValuePairs::getName() const { return name; diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.h b/src/Functions/keyvaluepair/extractKeyValuePairs.h index 89e70e2f0eb..26cb31dd850 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.h +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.h @@ -11,7 +11,7 @@ namespace DB class ExtractKeyValuePairs : public IFunction { public: - ExtractKeyValuePairs(); + ExtractKeyValuePairs() = default; static constexpr auto name = "extractKeyValuePairs"; From 144ee7aed48ddf026efd03dddcc076c1314864ea Mon Sep 17 00:00:00 2001 From: pufit Date: Wed, 5 Apr 2023 22:52:31 -0400 Subject: [PATCH 161/535] Fix logic, additional tests --- .../Access/InterpreterGrantQuery.cpp | 76 ++++++++++++++++--- src/Parsers/Access/ASTGrantQuery.h | 1 + src/Parsers/Access/ParserGrantQuery.cpp | 13 ++-- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index acca4f628f6..5d06cb8fe4c 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -330,6 +330,67 @@ namespace updateGrantedAccessRightsAndRolesTemplate(*role, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, admin_option); } + template + void grantCurrentGrantsTemplate( + T & grantee, + const AccessRightsElements & elements_to_grant, + const AccessRightsElements & elements_to_revoke, + std::shared_ptr current_user_access, + bool grant_option) + { + if (!elements_to_revoke.empty()) + grantee.access.revoke(elements_to_revoke); + + /// We need to collect all current user's grant and filter them by grant option. + AccessRightsElements current_user_grantable_elements; + auto available_grant_elements = current_user_access->getAccessRights()->getElements(); + std::copy_if( + available_grant_elements.begin(), + available_grant_elements.end(), + std::back_inserter(current_user_grantable_elements), + [](AccessRightsElement x) { return x.grant_option || x.is_partial_revoke; }); + + AccessRights current_user_rights; + for (auto & element : current_user_grantable_elements) + { + if (element.is_partial_revoke) + current_user_rights.revoke(element); + else + current_user_rights.grant(element); + } + + /// If elements_to_grant was not specified it will grant all available for user grants. + /// Otherwise, we will intersect available grants with given set. + if (elements_to_grant.empty()) + { + if (!grant_option) + current_user_rights.revokeGrantOption(AccessType::ALL); + + grantee.access.makeUnion(current_user_rights); + } + else + { + AccessRights new_rights(elements_to_grant); + new_rights.makeIntersection(current_user_rights); + + grantee.access.makeUnion(new_rights); + } + } + + /// Grants current user's grants with grant options to specified user. + void grantCurrentGrants( + IAccessEntity & grantee, + const AccessRightsElements & elements_to_grant, + const AccessRightsElements & elements_to_revoke, + std::shared_ptr current_user_access, + bool grant_option) + { + if (auto * user = typeid_cast(&grantee)) + grantCurrentGrantsTemplate(*user, elements_to_grant, elements_to_revoke, current_user_access, grant_option); + else if (auto * role = typeid_cast(&grantee)) + grantCurrentGrantsTemplate(*role, elements_to_grant, elements_to_revoke, current_user_access, grant_option); + } + /// Updates grants of a specified user or role. void updateFromQuery(IAccessEntity & grantee, const ASTGrantQuery & query) { @@ -366,13 +427,6 @@ BlockIO InterpreterGrantQuery::execute() AccessRightsElements elements_to_grant, elements_to_revoke; collectAccessRightsElementsToGrantOrRevoke(query, elements_to_grant, elements_to_revoke); - if (query.current_grants) - { - AccessRights new_rights(elements_to_grant); - new_rights.makeIntersection(*current_user_access->getAccessRights()); - elements_to_grant = new_rights.getElements(); - } - std::vector roles_to_grant; RolesOrUsersSet roles_to_revoke; collectRolesToGrantOrRevoke(access_control, query, roles_to_grant, roles_to_revoke); @@ -393,7 +447,8 @@ BlockIO InterpreterGrantQuery::execute() elements_to_grant.replaceEmptyDatabase(current_database); elements_to_revoke.replaceEmptyDatabase(current_database); bool need_check_grantees_are_allowed = true; - checkGrantOption(access_control, *current_user_access, grantees, need_check_grantees_are_allowed, elements_to_grant, elements_to_revoke); + if (!query.current_grants) + checkGrantOption(access_control, *current_user_access, grantees, need_check_grantees_are_allowed, elements_to_grant, elements_to_revoke); /// Check if the current user has corresponding roles granted with admin option. checkAdminOption(access_control, *current_user_access, grantees, need_check_grantees_are_allowed, roles_to_grant, roles_to_revoke, query.admin_option); @@ -405,7 +460,10 @@ BlockIO InterpreterGrantQuery::execute() auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr { auto clone = entity->clone(); - updateGrantedAccessRightsAndRoles(*clone, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); + if (query.current_grants) + grantCurrentGrants(*clone, elements_to_grant, elements_to_revoke, current_user_access, query.with_grant_option); + else + updateGrantedAccessRightsAndRoles(*clone, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); return clone; }; diff --git a/src/Parsers/Access/ASTGrantQuery.h b/src/Parsers/Access/ASTGrantQuery.h index 2ccbac3dac8..365214d1b01 100644 --- a/src/Parsers/Access/ASTGrantQuery.h +++ b/src/Parsers/Access/ASTGrantQuery.h @@ -27,6 +27,7 @@ public: bool replace_access = false; bool replace_granted_roles = false; bool current_grants = false; + bool with_grant_option = false; std::shared_ptr grantees; diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index b8e0d7f7030..ce1ed8a4a96 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -285,19 +285,17 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) std::shared_ptr roles; bool current_grants = false; - if (!is_revoke && cluster.empty() && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) + if (!is_revoke && ParserKeyword{"CURRENT GRANTS"}.ignore(pos, expected)) { current_grants = true; if (ParserToken(TokenType::OpeningRoundBracket).ignore(pos, expected)) { - if (!parseElementsWithoutOptions(pos, expected, elements) && !parseRoles(pos, expected, is_revoke, attach_mode, roles)) + if (!parseElementsWithoutOptions(pos, expected, elements)) return false; if (!ParserToken(TokenType::ClosingRoundBracket).ignore(pos, expected)) return false; } - else - elements.emplace_back(AccessType::ALL); } else { @@ -305,14 +303,14 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) return false; } - if (cluster.empty() && !current_grants) + if (cluster.empty()) parseOnCluster(pos, expected, cluster); std::shared_ptr grantees; if (!parseToGrantees(pos, expected, is_revoke, grantees)) return false; - if (cluster.empty() && !current_grants) + if (cluster.empty()) parseOnCluster(pos, expected, cluster); if (!is_revoke) @@ -326,7 +324,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) is_replace = true; } - if (cluster.empty() && !current_grants) + if (cluster.empty()) parseOnCluster(pos, expected, cluster); if (grant_option && roles) @@ -372,6 +370,7 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->replace_access = replace_access; query->replace_granted_roles = replace_role; query->current_grants = current_grants; + query->with_grant_option = grant_option; return true; } From a3c5acb106d12fc47b602656faa261f77d0d5fae Mon Sep 17 00:00:00 2001 From: pufit Date: Wed, 5 Apr 2023 22:52:48 -0400 Subject: [PATCH 162/535] Additional tests --- .../integration/test_grant_and_revoke/test.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index fc5d179a973..668cd20c554 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -607,3 +607,56 @@ def test_grant_current_grants(): assert instance.query("SHOW GRANTS FOR C") == TSV( ["GRANT CREATE TABLE, CREATE VIEW ON test.* TO C"] ) + + +def test_grant_current_grants_with_partial_revoke(): + instance.query("CREATE USER A") + instance.query("GRANT CREATE TABLE ON *.* TO A") + instance.query("GRANT SELECT ON *.* TO A WITH GRANT OPTION") + instance.query("REVOKE SELECT ON test.* FROM A") + instance.query("GRANT SELECT ON test.table TO A WITH GRANT OPTION") + assert instance.query("SHOW GRANTS FOR A") == TSV( + [ + "GRANT CREATE TABLE ON *.* TO A", + "GRANT SELECT ON *.* TO A WITH GRANT OPTION", + "REVOKE SELECT ON test.* FROM A", + "GRANT SELECT ON test.table TO A WITH GRANT OPTION", + ] + ) + + instance.query("CREATE USER B") + instance.query("GRANT CURRENT GRANTS TO B", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + [ + "GRANT SELECT ON *.* TO B", + "REVOKE SELECT ON test.* FROM B", + "GRANT SELECT ON test.table TO B", + ] + ) + + +def test_current_grants_override(): + instance.query("CREATE USER A") + instance.query("GRANT SELECT ON *.* TO A WITH GRANT OPTION") + instance.query("REVOKE SELECT ON test.* FROM A") + assert instance.query("SHOW GRANTS FOR A") == TSV( + [ + "GRANT SELECT ON *.* TO A WITH GRANT OPTION", + "REVOKE SELECT ON test.* FROM A", + ] + ) + + instance.query("CREATE USER B") + instance.query("GRANT SELECT ON test.table TO B") + assert instance.query("SHOW GRANTS FOR B") == TSV( + ["GRANT SELECT ON test.table TO B"] + ) + + instance.query("GRANT CURRENT GRANTS TO B", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + [ + "GRANT SELECT ON *.* TO B", + "REVOKE SELECT ON test.* FROM B", + "GRANT SELECT ON test.table TO B", + ] + ) From 671f4b100c5aac21513e0c7f91ae8e7c1651123b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 6 Apr 2023 11:28:40 -0300 Subject: [PATCH 163/535] minor renaming --- src/Functions/keyvaluepair/ArgumentExtractor.cpp | 10 +++++----- src/Functions/keyvaluepair/ArgumentExtractor.h | 2 +- src/Functions/keyvaluepair/extractKeyValuePairs.cpp | 8 ++++---- .../keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp | 8 ++++---- .../keyvaluepair/impl/KeyValuePairExtractorBuilder.h | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 74f750cef75..627721ce6e7 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -25,11 +25,11 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT return ParsedArguments{data_column}; } - auto key_value_pair_delimiter = extractControlCharacter(arguments[1].column); + auto key_value_delimiter = extractControlCharacter(arguments[1].column); if (arguments.size() == 2u) { - return ParsedArguments {data_column, key_value_pair_delimiter}; + return ParsedArguments {data_column, key_value_delimiter}; } auto pair_delimiters_characters = arguments[2].column->getDataAt(0).toView(); @@ -39,7 +39,7 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT if (arguments.size() == 3u) { return ParsedArguments { - data_column, key_value_pair_delimiter, pair_delimiters + data_column, key_value_delimiter, pair_delimiters }; } @@ -49,7 +49,7 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT { return ParsedArguments { data_column, - key_value_pair_delimiter, + key_value_delimiter, pair_delimiters, quoting_character, }; @@ -58,7 +58,7 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT auto with_escaping = extractBoolArgument(arguments[4].column); return ParsedArguments { - data_column, key_value_pair_delimiter, pair_delimiters, quoting_character, with_escaping + data_column, key_value_delimiter, pair_delimiters, quoting_character, with_escaping }; } diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h index b0b763aab95..cf3a6c3afb7 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -24,7 +24,7 @@ public: { ColumnPtr data_column; - CharArgument key_value_pair_delimiter = {}; + CharArgument key_value_delimiter = {}; VectorArgument pair_delimiters = {}; CharArgument quoting_character = {}; BoolArgument with_escaping = {}; diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index f092a75b7b4..3171f324ef5 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -26,9 +26,9 @@ auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) builder.withEscaping(); } - if (parsed_arguments.key_value_pair_delimiter) + if (parsed_arguments.key_value_delimiter) { - builder.withKeyValuePairDelimiter(parsed_arguments.key_value_pair_delimiter.value()); + builder.withKeyValueDelimiter(parsed_arguments.key_value_delimiter.value()); } if (!parsed_arguments.pair_delimiters.empty()) @@ -117,9 +117,9 @@ ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & argum { auto parsed_arguments = ArgumentExtractor::extract(arguments); - auto extractor_without_escaping = getExtractor(parsed_arguments); + auto extractor = getExtractor(parsed_arguments); - return extract(parsed_arguments.data_column, extractor_without_escaping); + return extract(parsed_arguments.data_column, extractor); } REGISTER_FUNCTION(ExtractKeyValuePairs) diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp index c1b2b192fc4..188285dc4bd 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.cpp @@ -7,9 +7,9 @@ namespace DB { -KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValuePairDelimiter(char key_value_pair_delimiter_) +KeyValuePairExtractorBuilder & KeyValuePairExtractorBuilder::withKeyValueDelimiter(char key_value_delimiter_) { - key_value_pair_delimiter = key_value_pair_delimiter_; + key_value_delimiter = key_value_delimiter_; return *this; } @@ -55,14 +55,14 @@ auto makeStateHandler(const T && handler) std::shared_ptr KeyValuePairExtractorBuilder::buildWithoutEscaping() const { - auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); + auto configuration = ConfigurationFactory::createWithoutEscaping(key_value_delimiter, quoting_character, item_delimiters); return makeStateHandler(NoEscapingStateHandler(configuration)); } std::shared_ptr KeyValuePairExtractorBuilder::buildWithEscaping() const { - auto configuration = ConfigurationFactory::createWithEscaping(key_value_pair_delimiter, quoting_character, item_delimiters); + auto configuration = ConfigurationFactory::createWithEscaping(key_value_delimiter, quoting_character, item_delimiters); return makeStateHandler(InlineEscapingStateHandler(configuration)); } diff --git a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h index 4bed22962f8..5746c58dccc 100644 --- a/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h +++ b/src/Functions/keyvaluepair/impl/KeyValuePairExtractorBuilder.h @@ -12,7 +12,7 @@ class KeyValuePairExtractorBuilder { public: - KeyValuePairExtractorBuilder & withKeyValuePairDelimiter(char key_value_pair_delimiter_); + KeyValuePairExtractorBuilder & withKeyValueDelimiter(char key_value_delimiter_); KeyValuePairExtractorBuilder & withItemDelimiters(std::vector item_delimiters_); @@ -24,7 +24,7 @@ public: private: bool with_escaping = false; - char key_value_pair_delimiter = ':'; + char key_value_delimiter = ':'; char quoting_character = '"'; std::vector item_delimiters = {' ', ',', ';'}; From d1fa9596b885b541f9b639d53c6eb879af08736e Mon Sep 17 00:00:00 2001 From: pufit Date: Thu, 6 Apr 2023 10:56:35 -0400 Subject: [PATCH 164/535] Prevent execution on cluster --- src/Interpreters/Access/InterpreterGrantQuery.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index 5d06cb8fe4c..6bbc5b7963d 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -17,6 +17,7 @@ namespace DB { namespace ErrorCodes { + extern const int BAD_ARGUMENTS; extern const int LOGICAL_ERROR; } @@ -434,6 +435,9 @@ BlockIO InterpreterGrantQuery::execute() /// Executing on cluster. if (!query.cluster.empty()) { + if (query.current_grants) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "GRANT CURRENT GRANTS can't be executed on cluster."); + auto required_access = getRequiredAccessForExecutingOnCluster(elements_to_grant, elements_to_revoke); checkAdminOptionForExecutingOnCluster(*current_user_access, roles_to_grant, roles_to_revoke); current_user_access->checkGranteesAreAllowed(grantees); From 52e7a09de78fbf36345d308ecb5869a26a813b7a Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 6 Apr 2023 12:17:14 -0300 Subject: [PATCH 165/535] Use two functions extractKeyValuePairs and extractKeyValuePairsWithEscaping instead of boolean parameter --- .../functions/string-functions.md | 44 +-- .../keyvaluepair/extractKeyValuePairs.cpp | 281 +++++++++--------- .../keyvaluepair/extractKeyValuePairs.h | 35 --- ...t_key_value_pairs_multiple_input.reference | 22 +- ...extract_key_value_pairs_multiple_input.sql | 32 +- 5 files changed, 197 insertions(+), 217 deletions(-) delete mode 100644 src/Functions/keyvaluepair/extractKeyValuePairs.h diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index cde943f434a..38be76daad5 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1204,15 +1204,10 @@ Extracts key-value pairs from any string. The string does not need to be 100% st It can contain noise (e.g. log files). The key-value pair format to be interpreted should be specified via function arguments. A key-value pair consists of a key followed by a `key_value_delimiter` and a value. Quoted keys and values are also supported. Key value pairs must be separated by pair delimiters. -Escaping support can be turned on and off. - -Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. -Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: -`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Syntax** ``` sql -extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character], [escaping_support]) +extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character]) ``` **Arguments** @@ -1220,7 +1215,6 @@ extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_cha - `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `escaping_support` - Turns escaping support on or off. Defaults to off. [Bool](../../sql-reference/data-types/boolean.md). **Returned values** - The extracted key-value pairs in a Map(String, String). @@ -1244,9 +1238,9 @@ Query id: f9e0ca6f-3178-4ee2-aa2c-a5517abb9cee **Single quote as quoting character** ``` sql -arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv +arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv -SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv +SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e @@ -1257,26 +1251,34 @@ Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e **Escape sequences without escape sequences support** ``` sql -arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv +arthur :) select extractKeyValuePairs('age:\\x0A\\n\\0') as kv -SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv +SELECT extractKeyValuePairs('age:\\x0A\\n\\0') AS kv -Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 +Query id: e9fd26ee-b41f-4a11-b17f-25af6fd5d356 -┌─kv────────────────────────────────────────────────────┐ -│ {'age':'\\x0A'} │ -└───────────────────────────────────────────────────────┘ +┌─kv────────────────────┐ +│ {'age':'\\x0A\\n\\0'} │ +└───────────────────────┘ ``` +## extractKeyValuePairsWithEscaping + +Same as `extractKeyValuePairs` but with escaping support. + +Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. +Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: +`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31).\ + **Escape sequences with escape sequence support turned on** ``` sql -arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv +arthur :) select extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') as kv -SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv +SELECT extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') AS kv -Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d +Query id: 44c114f0-5658-4c75-ab87-4574de3a1645 -┌─kv────────────────────────────────────────────────────┐ -│ {'age':'\n'} │ -└───────────────────────────────────────────────────────┘ +┌─kv───────────────┐ +│ {'age':'\n\n\0'} │ +└──────────────────┘ ``` diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp index 3171f324ef5..a6290c59a23 100644 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.cpp +++ b/src/Functions/keyvaluepair/extractKeyValuePairs.cpp @@ -1,145 +1,150 @@ -#include +#include +#include + +#include +#include + +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include - - -namespace -{ - -using namespace DB; - -auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) -{ - auto builder = KeyValuePairExtractorBuilder(); - - if (parsed_arguments.with_escaping.value_or(false)) - { - builder.withEscaping(); - } - - if (parsed_arguments.key_value_delimiter) - { - builder.withKeyValueDelimiter(parsed_arguments.key_value_delimiter.value()); - } - - if (!parsed_arguments.pair_delimiters.empty()) - { - builder.withItemDelimiters(parsed_arguments.pair_delimiters); - } - - if (parsed_arguments.quoting_character) - { - builder.withQuotingCharacter(parsed_arguments.quoting_character.value()); - } - - return builder.build(); -} - -ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) -{ - auto offsets = ColumnUInt64::create(); - - auto keys = ColumnString::create(); - auto values = ColumnString::create(); - - uint64_t offset = 0u; - - for (auto i = 0u; i < data_column->size(); i++) - { - auto row = data_column->getDataAt(i).toView(); - - auto pairs_count = extractor->extract(row, keys, values); - - offset += pairs_count; - - offsets->insert(offset); - } - - keys->validate(); - values->validate(); - - ColumnPtr keys_ptr = std::move(keys); - - return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); -} - - -} - namespace DB { -String ExtractKeyValuePairs::getName() const +template +class ExtractKeyValuePairs : public IFunction { - return name; -} + auto getExtractor(const ArgumentExtractor::ParsedArguments & parsed_arguments) const + { + auto builder = KeyValuePairExtractorBuilder(); -FunctionPtr ExtractKeyValuePairs::create(ContextPtr) + if constexpr (WITH_ESCAPING) + { + builder.withEscaping(); + } + + if (parsed_arguments.key_value_delimiter) + { + builder.withKeyValueDelimiter(parsed_arguments.key_value_delimiter.value()); + } + + if (!parsed_arguments.pair_delimiters.empty()) + { + builder.withItemDelimiters(parsed_arguments.pair_delimiters); + } + + if (parsed_arguments.quoting_character) + { + builder.withQuotingCharacter(parsed_arguments.quoting_character.value()); + } + + return builder.build(); + } + + ColumnPtr extract(ColumnPtr data_column, std::shared_ptr extractor) const + { + auto offsets = ColumnUInt64::create(); + + auto keys = ColumnString::create(); + auto values = ColumnString::create(); + + uint64_t offset = 0u; + + for (auto i = 0u; i < data_column->size(); i++) + { + auto row = data_column->getDataAt(i).toView(); + + auto pairs_count = extractor->extract(row, keys, values); + + offset += pairs_count; + + offsets->insert(offset); + } + + keys->validate(); + values->validate(); + + ColumnPtr keys_ptr = std::move(keys); + + return ColumnMap::create(keys_ptr, std::move(values), std::move(offsets)); + } + +public: + ExtractKeyValuePairs() = default; + + static constexpr auto name = Name::name; + + String getName() const override + { + return name; + } + + static FunctionPtr create(ContextPtr) + { + return std::make_shared(); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const override + { + auto parsed_arguments = ArgumentExtractor::extract(arguments); + + auto extractor = getExtractor(parsed_arguments); + + return extract(parsed_arguments.data_column, extractor); + } + + DataTypePtr getReturnTypeImpl(const DataTypes &) const override + { + return std::make_shared(std::make_shared(), std::make_shared()); + } + + bool isVariadic() const override + { + return true; + } + + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override + { + return false; + } + + std::size_t getNumberOfArguments() const override + { + return 0u; + } + + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override + { + return {1, 2, 3, 4}; + } +}; + +struct NameExtractKeyValuePairs { - return std::make_shared(); -} + static constexpr auto name = "extractKeyValuePairs"; +}; -DataTypePtr ExtractKeyValuePairs::getReturnTypeImpl(const DataTypes &) const +struct NameExtractKeyValuePairsWithEscaping { - return std::make_shared(std::make_shared(), std::make_shared()); -} - -bool ExtractKeyValuePairs::isVariadic() const -{ - return true; -} - -bool ExtractKeyValuePairs::isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const -{ - return false; -} - -std::size_t ExtractKeyValuePairs::getNumberOfArguments() const -{ - return 0u; -} - -ColumnNumbers ExtractKeyValuePairs::getArgumentsThatAreAlwaysConstant() const -{ - return {1, 2, 3, 4, 5}; -} - -ColumnPtr ExtractKeyValuePairs::executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const -{ - auto parsed_arguments = ArgumentExtractor::extract(arguments); - - auto extractor = getExtractor(parsed_arguments); - - return extract(parsed_arguments.data_column, extractor); -} + static constexpr auto name = "extractKeyValuePairsWithEscaping"; +}; REGISTER_FUNCTION(ExtractKeyValuePairs) { - factory.registerFunction( + factory.registerFunction>( Documentation( R"(Extracts key-value pairs from any string. The string does not need to be 100% structured in a key value pair format; It can contain noise (e.g. log files). The key-value pair format to be interpreted should be specified via function arguments. A key-value pair consists of a key followed by a `key_value_delimiter` and a value. Quoted keys and values are also supported. Key value pairs must be separated by pair delimiters. - Escaping support can be turned on and off. - - Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. - Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: - `\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Syntax** ``` sql - extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character], [escaping_support]) + extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character]) ``` **Arguments** @@ -147,7 +152,6 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) - `key_value_delimiter` - Character to be used as delimiter between the key and the value. Defaults to `:`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `pair_delimiters` - Set of character to be used as delimiters between pairs. Defaults to `\space`, `,` and `;`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - `quoting_character` - Character to be used as quoting character. Defaults to `"`. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - - `escaping_support` - Turns escaping support on or off. Defaults to off. [Bool](../../sql-reference/data-types/boolean.md). **Returned values** - The extracted key-value pairs in a Map(String, String). @@ -171,9 +175,9 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) **Single quote as quoting character** ``` sql - arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv + arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv - SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) as kv + SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e @@ -184,30 +188,39 @@ REGISTER_FUNCTION(ExtractKeyValuePairs) **Escape sequences without escape sequences support** ``` sql - arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv + arthur :) select extractKeyValuePairs('age:\\x0A\\n\\0') as kv - SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 0) as kv + SELECT extractKeyValuePairs('age:\\x0A\\n\\0') AS kv - Query id: 4aa4a519-d130-4b09-b555-9214f9416c01 + Query id: e9fd26ee-b41f-4a11-b17f-25af6fd5d356 - ┌─kv────────────────────────────────────────────────────┐ - │ {'age':'\\x0A'} │ - └───────────────────────────────────────────────────────┘ - ``` + ┌─kv────────────────────┐ + │ {'age':'\\x0A\\n\\0'} │ + └───────────────────────┘ + ```)") + ); + + factory.registerFunction>( + Documentation( + R"(Same as `extractKeyValuePairs` but with escaping support. + + Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. + Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: + `\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31).\ **Escape sequences with escape sequence support turned on** ``` sql - arthur :) select extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv + arthur :) select extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') as kv - SELECT extractKeyValuePairs('age:\\x0A', ':', ',', '"', 1) as kv + SELECT extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') AS kv - Query id: 2c2044c6-3ca7-4300-a582-33b3192ad88d + Query id: 44c114f0-5658-4c75-ab87-4574de3a1645 - ┌─kv────────────────────────────────────────────────────┐ - │ {'age':'\n'} │ - └───────────────────────────────────────────────────────┘ + ┌─kv───────────────┐ + │ {'age':'\n\n\0'} │ + └──────────────────┘ ```)") - ); + ); } } diff --git a/src/Functions/keyvaluepair/extractKeyValuePairs.h b/src/Functions/keyvaluepair/extractKeyValuePairs.h deleted file mode 100644 index 26cb31dd850..00000000000 --- a/src/Functions/keyvaluepair/extractKeyValuePairs.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include - -#include -#include - -namespace DB -{ - -class ExtractKeyValuePairs : public IFunction -{ -public: - ExtractKeyValuePairs() = default; - - static constexpr auto name = "extractKeyValuePairs"; - - String getName() const override; - - static FunctionPtr create(ContextPtr); - - ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t) const override; - - DataTypePtr getReturnTypeImpl(const DataTypes &) const override; - - bool isVariadic() const override; - - bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override; - - std::size_t getNumberOfArguments() const override; - - ColumnNumbers getArgumentsThatAreAlwaysConstant() const override; -}; - -} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 35707b458fe..41f41c262ae 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -69,7 +69,7 @@ SELECT -- invalid escape sequence, should be discarded -- expected output: {'valid_key':'valid_value'} WITH - extractKeyValuePairs('valid_key:valid_value key:invalid_val\\', ':', ' ', '"', 1) AS s_map, + extractKeyValuePairsWithEscaping('valid_key:valid_value key:invalid_val\\', ':', ' ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -162,7 +162,7 @@ SELECT -- NO ESCAPING TESTS -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -175,7 +175,7 @@ SELECT -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH - extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -188,7 +188,7 @@ SELECT -- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything -- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} WITH - extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -201,7 +201,7 @@ SELECT -- standard escape sequences, it should return it as it is -- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} WITH - extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -216,7 +216,7 @@ SELECT -- simple quoting -- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -229,7 +229,7 @@ SELECT -- empty values -- expected output: {'age':'','name':'','nationality':''} WITH - extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -242,7 +242,7 @@ SELECT -- empty keys -- empty keys are not allowed, thus empty output is expected WITH - extractKeyValuePairs('"":abc, :def', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('"":abc, :def', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -255,7 +255,7 @@ SELECT -- semi-colon as pair delimiter -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -268,7 +268,7 @@ SELECT -- both comma and semi-colon as pair delimiters -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -281,7 +281,7 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index 7d4b1488b38..b4013d2c11e 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -69,7 +69,7 @@ SELECT -- invalid escape sequence, should be discarded -- expected output: {'valid_key':'valid_value'} WITH - extractKeyValuePairs('valid_key:valid_value key:invalid_val\\', ':', ' ', '"', 1) AS s_map, + extractKeyValuePairsWithEscaping('valid_key:valid_value key:invalid_val\\', ':', ' ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -162,7 +162,7 @@ SELECT -- NO ESCAPING TESTS -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -175,7 +175,7 @@ SELECT -- special (not control) characters in the middle of elements -- expected output: {'age':'3!','name':'ney!mar','nationality':'br4z!l','t&am':'@psg'} WITH - extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:ney!mar, age:3! t&am:@psg,nationality:br4z!l', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -188,7 +188,7 @@ SELECT -- non-standard escape characters (i.e not \n, \r, \t and etc), it should accept everything -- expected output: {'amount\\z':'$5\\h','currency':'\\$USD'} WITH - extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('currency:\$USD, amount\z:$5\h', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -201,7 +201,7 @@ SELECT -- standard escape sequences, it should return it as it is -- expected output: {'key1':'header\nbody','key2':'start_of_text\tend_of_text'} WITH - extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('key1:header\nbody key2:start_of_text\tend_of_text', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -216,7 +216,7 @@ SELECT -- simple quoting -- expected output: {'age':'31','name':'neymar','team':'psg'} WITH - extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:"neymar", "age":31 "team":"psg"', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -229,7 +229,7 @@ SELECT -- empty values -- expected output: {'age':'','name':'','nationality':''} WITH - extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('name:"", age: , nationality:', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -242,7 +242,7 @@ SELECT -- empty keys -- empty keys are not allowed, thus empty output is expected WITH - extractKeyValuePairs('"":abc, :def', ':', ', ', '"', 0) AS s_map, + extractKeyValuePairs('"":abc, :def', ':', ', ', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -255,7 +255,7 @@ SELECT -- semi-colon as pair delimiter -- expected output: {'age':'31','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil', ':', ';', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -268,7 +268,7 @@ SELECT -- both comma and semi-colon as pair delimiters -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"', 0) AS s_map, + extractKeyValuePairs('name:neymar;age:31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '"') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -281,7 +281,7 @@ SELECT -- single quote as quoting character -- expected output: {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} WITH - extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'', 0) AS s_map, + extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -296,7 +296,7 @@ SELECT -- cross parameter validation tests -- should fail because key value delimiter conflicts with pair delimiters WITH - extractKeyValuePairs('not_important', ':', ',:', '\'', 0) AS s_map, + extractKeyValuePairs('not_important', ':', ',:', '\'') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -308,7 +308,7 @@ SELECT -- should fail because key value delimiter conflicts with quoting characters WITH - extractKeyValuePairs('not_important', ':', ',', '\':', 0) AS s_map, + extractKeyValuePairs('not_important', ':', ',', '\':') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -320,7 +320,7 @@ SELECT -- should fail because pair delimiters conflicts with quoting characters WITH - extractKeyValuePairs('not_important', ':', ',', ',', 0) AS s_map, + extractKeyValuePairs('not_important', ':', ',', ',') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -332,7 +332,7 @@ SELECT -- should fail because pair delimiters can contain at most 8 characters WITH - extractKeyValuePairs('not_important', ':', '123456789', '\'', 0) AS s_map, + extractKeyValuePairs('not_important', ':', '123456789', '\'') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) @@ -344,7 +344,7 @@ SELECT -- should not fail because pair delimiters contains 8 characters, which is within the limit WITH - extractKeyValuePairs('not_important', ':', '12345678', '\'', 0) AS s_map, + extractKeyValuePairs('not_important', ':', '12345678', '\'') AS s_map, CAST( arrayMap( (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) From d381f82843478b254f56c4b142558dbd4bb44d9d Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 6 Apr 2023 12:22:47 -0300 Subject: [PATCH 166/535] remove escaping_support parameter left overs --- .../keyvaluepair/ArgumentExtractor.cpp | 34 +++---------------- .../keyvaluepair/ArgumentExtractor.h | 3 -- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 627721ce6e7..c7c99c3ae85 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -45,20 +45,11 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT auto quoting_character = extractControlCharacter(arguments[3].column); - if (arguments.size() == 4u) - { - return ParsedArguments { - data_column, - key_value_delimiter, - pair_delimiters, - quoting_character, - }; - } - - auto with_escaping = extractBoolArgument(arguments[4].column); - return ParsedArguments { - data_column, key_value_delimiter, pair_delimiters, quoting_character, with_escaping + data_column, + key_value_delimiter, + pair_delimiters, + quoting_character, }; } @@ -78,22 +69,5 @@ ArgumentExtractor::CharArgument ArgumentExtractor::extractControlCharacter(Colum throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); } -ArgumentExtractor::BoolArgument ArgumentExtractor::extractBoolArgument(ColumnPtr column) -{ - if (const auto * escaping_support_column = checkAndGetColumnConst(column.get())) - { - if (escaping_support_column->empty()) - { - return {}; - } - else if (escaping_support_column->size() == 1u) - { - return escaping_support_column->getBool(0u); - } - } - - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Boolean argument must either be empty or contain exactly 1 value"); -} - } diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h index cf3a6c3afb7..184d4ec3393 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -18,7 +18,6 @@ class ArgumentExtractor public: using CharArgument = std::optional; using VectorArgument = std::vector; - using BoolArgument = std::optional; struct ParsedArguments { @@ -27,7 +26,6 @@ public: CharArgument key_value_delimiter = {}; VectorArgument pair_delimiters = {}; CharArgument quoting_character = {}; - BoolArgument with_escaping = {}; }; @@ -35,7 +33,6 @@ public: private: static ArgumentExtractor::CharArgument extractControlCharacter(ColumnPtr column); - static ArgumentExtractor::BoolArgument extractBoolArgument(ColumnPtr column); }; } From b48c39bf87c96f4942a5426518eab23c7f9e1ee1 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Fri, 7 Apr 2023 10:01:07 -0300 Subject: [PATCH 167/535] use std::array instead of std::vector --- base/base/find_symbols.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/base/base/find_symbols.h b/base/base/find_symbols.h index 1edd1fefd37..488481dbc81 100644 --- a/base/base/find_symbols.h +++ b/base/base/find_symbols.h @@ -108,22 +108,22 @@ inline __m128i mm_is_in(__m128i bytes, const char * symbols, size_t num_chars) return accumulator; } -inline std::vector<__m128i> mm_is_in_prepare(const char * symbols, size_t num_chars) +inline std::array<__m128i, 16u> mm_is_in_prepare(const char * symbols, size_t num_chars) { - std::vector<__m128i> result; - result.reserve(num_chars); + std::array<__m128i, 16u> result {}; for (size_t i = 0; i < num_chars; ++i) { - result.emplace_back(_mm_set1_epi8(symbols[i])); + result[i] = _mm_set1_epi8(symbols[i]); } return result; } -inline __m128i mm_is_in_execute(__m128i bytes, const std::vector<__m128i> & needles) +inline __m128i mm_is_in_execute(__m128i bytes, const std::array<__m128i, 16u> & needles) { __m128i accumulator = _mm_setzero_si128(); + for (const auto & needle : needles) { __m128i eq = _mm_cmpeq_epi8(bytes, needle); From 054078e06d8a85e47f1ac2004360e25d6931c438 Mon Sep 17 00:00:00 2001 From: Yakov Olkhovskiy Date: Sat, 8 Apr 2023 05:34:35 +0000 Subject: [PATCH 168/535] fix nested map for keys of IP and UUID types --- base/base/IPv4andIPv6.h | 12 ++++++++++++ src/AggregateFunctions/Helpers.h | 2 ++ src/Common/HashTable/Hash.h | 2 ++ src/Common/HashTable/HashTable.h | 2 +- src/DataTypes/DataTypeIPv4andIPv6.h | 1 + .../Merges/Algorithms/SummingSortedAlgorithm.cpp | 7 +++++-- 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/base/base/IPv4andIPv6.h b/base/base/IPv4andIPv6.h index 0e97d83b07e..7b745ec7b84 100644 --- a/base/base/IPv4andIPv6.h +++ b/base/base/IPv4andIPv6.h @@ -51,3 +51,15 @@ namespace DB }; } + +namespace std +{ + template <> + struct hash + { + size_t operator()(const DB::IPv6 & x) const + { + return std::hash()(x.toUnderType()); + } + }; +} diff --git a/src/AggregateFunctions/Helpers.h b/src/AggregateFunctions/Helpers.h index c97733571a3..19904dd9215 100644 --- a/src/AggregateFunctions/Helpers.h +++ b/src/AggregateFunctions/Helpers.h @@ -130,6 +130,8 @@ static IAggregateFunction * createWithNumericBasedType(const IDataType & argumen if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate(std::forward(args)...); if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate(std::forward(args)...); if (which.idx == TypeIndex::UUID) return new AggregateFunctionTemplate(std::forward(args)...); + if (which.idx == TypeIndex::IPv4) return new AggregateFunctionTemplate(std::forward(args)...); + if (which.idx == TypeIndex::IPv6) return new AggregateFunctionTemplate(std::forward(args)...); return nullptr; } diff --git a/src/Common/HashTable/Hash.h b/src/Common/HashTable/Hash.h index efdc43917da..eb455c5f9e3 100644 --- a/src/Common/HashTable/Hash.h +++ b/src/Common/HashTable/Hash.h @@ -344,6 +344,8 @@ DEFINE_HASH(DB::Int256) DEFINE_HASH(DB::Float32) DEFINE_HASH(DB::Float64) DEFINE_HASH(DB::UUID) +DEFINE_HASH(DB::IPv4) +DEFINE_HASH(DB::IPv6) #undef DEFINE_HASH diff --git a/src/Common/HashTable/HashTable.h b/src/Common/HashTable/HashTable.h index 7ddcbc20b22..8542ddae144 100644 --- a/src/Common/HashTable/HashTable.h +++ b/src/Common/HashTable/HashTable.h @@ -75,7 +75,7 @@ template bool check(const T x) { return x == T{}; } template -void set(T & x) { x = {}; } +void set(T & x) { x = T{}; } } diff --git a/src/DataTypes/DataTypeIPv4andIPv6.h b/src/DataTypes/DataTypeIPv4andIPv6.h index 0a0c61d0ad8..ad70bdae933 100644 --- a/src/DataTypes/DataTypeIPv4andIPv6.h +++ b/src/DataTypes/DataTypeIPv4andIPv6.h @@ -37,6 +37,7 @@ public: bool textCanContainOnlyValidUTF8() const override { return true; } bool isComparable() const override { return true; } bool isValueRepresentedByNumber() const override { return true; } + bool isValueRepresentedByInteger() const override { return true; } bool isValueRepresentedByUnsignedInteger() const override { return true; } bool isValueUnambiguouslyRepresentedInContiguousMemoryRegion() const override { return true; } bool isValueUnambiguouslyRepresentedInFixedSizeContiguousMemoryRegion() const override { return true; } diff --git a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp index d8e95e6b950..c45613f18e5 100644 --- a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp @@ -328,8 +328,11 @@ static SummingSortedAlgorithm::ColumnsDefinition defineColumns( || endsWith(name, "Key") || endsWith(name, "Type")) { - if (!nested_type.isValueRepresentedByInteger() && !isStringOrFixedString(nested_type)) - break; + if (!nested_type.isValueRepresentedByInteger() && + !isStringOrFixedString(nested_type) && + !typeid_cast(&nested_type) && + !typeid_cast(&nested_type)) + break; map_desc.key_col_nums.push_back(*column_num_it); } From 3af36dd2d58e2d7a278d01da6a1c6db0bf799939 Mon Sep 17 00:00:00 2001 From: Yakov Olkhovskiy Date: Sat, 8 Apr 2023 15:12:01 +0000 Subject: [PATCH 169/535] add test --- ...0_aggregation_nested_map_ip_uuid.reference | 12 +++++++ .../02710_aggregation_nested_map_ip_uuid.sql | 36 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference create mode 100644 tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference new file mode 100644 index 00000000000..00fbecf6143 --- /dev/null +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference @@ -0,0 +1,12 @@ +1 ['1.2.3.4'] [4] ['::1'] [5] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [6] +1 ['1.2.3.4'] [1] ['::1'] [2] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [3] +1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] +1 ['1.2.3.4'] [22] ['::1'] [23] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [24] +2 ['1.2.3.4'] [19] ['::2'] [20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [21] +1 ['2.3.4.5'] [13] ['::2'] [14] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [15] +1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] +2 ['1.2.3.4'] [7] ['::1'] [8] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] +1 ['1.2.3.4'] [10] ['::1'] [11] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [12] +2 ['2.3.4.5'] [16] ['::1'] [17] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [18] +1 ['1.2.3.4','2.3.4.5'] [37,13] ['::1','::2'] [41,14] ['00000000-0cd4-4c3d-84c4-cc421eff480f','00130949-0cd4-4c3d-84c4-cc421eff480f'] [39,21] +2 ['1.2.3.4','2.3.4.5'] [26,16] ['::1','::2'] [25,20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [48] diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql new file mode 100644 index 00000000000..1cfdea3bd50 --- /dev/null +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql @@ -0,0 +1,36 @@ +DROP TABLE IF EXISTS summing_table; +CREATE TABLE summing_table +( + id UInt32, + `ip4Map.value` Array(IPv4), `ip4Map.total` Array(UInt32), + `ip6Map.value` Array(IPv6), `ip6Map.total` Array(UInt32), + `uuidMap.value` Array(UUID), `uuidMap.total` Array(UInt32) +) ENGINE = SummingMergeTree ORDER BY id; + +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values (1, ['1.2.3.4'], [1], ['::1'], [2], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [3]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(1, ['1.2.3.4'], [4], ['::1'], [5], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [6]); + +SELECT * FROM summing_table; +OPTIMIZE TABLE summing_table FINAL; +SELECT * FROM summing_table; + +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(2, ['1.2.3.4'], [7], ['::1'], [8], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [9]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(1, ['1.2.3.4'], [10], ['::1'], [11], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [12]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(1, ['2.3.4.5'], [13], ['::2'], [14], ['00000000-0cd4-4c3d-84c4-cc421eff480f'], [15]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(2, ['2.3.4.5'], [16], ['::1'], [17], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [18]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(2, ['1.2.3.4'], [19], ['::2'], [20], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [21]); +INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) + values(1, ['1.2.3.4'], [22], ['::1'], [23], ['00000000-0cd4-4c3d-84c4-cc421eff480f'], [24]); + +SELECT * FROM summing_table; +OPTIMIZE TABLE summing_table FINAL; +SELECT * FROM summing_table; + +DROP TABLE summing_table; From db609a36ea9aef7b3e28094c34bbcfa1c52efa79 Mon Sep 17 00:00:00 2001 From: Yakov Olkhovskiy Date: Sat, 8 Apr 2023 17:43:40 +0000 Subject: [PATCH 170/535] fix test --- .../02710_aggregation_nested_map_ip_uuid.reference | 10 +++++----- .../02710_aggregation_nested_map_ip_uuid.sql | 10 ++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference index 00fbecf6143..5f94203be3e 100644 --- a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference @@ -1,12 +1,12 @@ -1 ['1.2.3.4'] [4] ['::1'] [5] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [6] 1 ['1.2.3.4'] [1] ['::1'] [2] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [3] +1 ['1.2.3.4'] [4] ['::1'] [5] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [6] 1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] -1 ['1.2.3.4'] [22] ['::1'] [23] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [24] -2 ['1.2.3.4'] [19] ['::2'] [20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [21] -1 ['2.3.4.5'] [13] ['::2'] [14] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [15] 1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] -2 ['1.2.3.4'] [7] ['::1'] [8] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] 1 ['1.2.3.4'] [10] ['::1'] [11] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [12] +1 ['1.2.3.4'] [22] ['::1'] [23] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [24] +1 ['2.3.4.5'] [13] ['::2'] [14] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [15] +2 ['1.2.3.4'] [7] ['::1'] [8] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] +2 ['1.2.3.4'] [19] ['::2'] [20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [21] 2 ['2.3.4.5'] [16] ['::1'] [17] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [18] 1 ['1.2.3.4','2.3.4.5'] [37,13] ['::1','::2'] [41,14] ['00000000-0cd4-4c3d-84c4-cc421eff480f','00130949-0cd4-4c3d-84c4-cc421eff480f'] [39,21] 2 ['1.2.3.4','2.3.4.5'] [26,16] ['::1','::2'] [25,20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [48] diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql index 1cfdea3bd50..e1ef4c55670 100644 --- a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql @@ -11,10 +11,9 @@ INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.t values (1, ['1.2.3.4'], [1], ['::1'], [2], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [3]); INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) values(1, ['1.2.3.4'], [4], ['::1'], [5], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [6]); - -SELECT * FROM summing_table; +SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; OPTIMIZE TABLE summing_table FINAL; -SELECT * FROM summing_table; +SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) values(2, ['1.2.3.4'], [7], ['::1'], [8], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [9]); @@ -28,9 +27,8 @@ INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.t values(2, ['1.2.3.4'], [19], ['::2'], [20], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [21]); INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) values(1, ['1.2.3.4'], [22], ['::1'], [23], ['00000000-0cd4-4c3d-84c4-cc421eff480f'], [24]); - -SELECT * FROM summing_table; +SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; OPTIMIZE TABLE summing_table FINAL; -SELECT * FROM summing_table; +SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; DROP TABLE summing_table; From 059ea65cc2fecf33ef78da2726073eddfbc769de Mon Sep 17 00:00:00 2001 From: Yakov Olkhovskiy Date: Sun, 9 Apr 2023 15:52:44 +0000 Subject: [PATCH 171/535] fix test --- .../02710_aggregation_nested_map_ip_uuid.reference | 9 --------- .../0_stateless/02710_aggregation_nested_map_ip_uuid.sql | 2 -- 2 files changed, 11 deletions(-) diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference index 5f94203be3e..c5b787f3dd6 100644 --- a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.reference @@ -1,12 +1,3 @@ -1 ['1.2.3.4'] [1] ['::1'] [2] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [3] -1 ['1.2.3.4'] [4] ['::1'] [5] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [6] 1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] -1 ['1.2.3.4'] [5] ['::1'] [7] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] -1 ['1.2.3.4'] [10] ['::1'] [11] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [12] -1 ['1.2.3.4'] [22] ['::1'] [23] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [24] -1 ['2.3.4.5'] [13] ['::2'] [14] ['00000000-0cd4-4c3d-84c4-cc421eff480f'] [15] -2 ['1.2.3.4'] [7] ['::1'] [8] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [9] -2 ['1.2.3.4'] [19] ['::2'] [20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [21] -2 ['2.3.4.5'] [16] ['::1'] [17] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [18] 1 ['1.2.3.4','2.3.4.5'] [37,13] ['::1','::2'] [41,14] ['00000000-0cd4-4c3d-84c4-cc421eff480f','00130949-0cd4-4c3d-84c4-cc421eff480f'] [39,21] 2 ['1.2.3.4','2.3.4.5'] [26,16] ['::1','::2'] [25,20] ['00130949-0cd4-4c3d-84c4-cc421eff480f'] [48] diff --git a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql index e1ef4c55670..456e8723d08 100644 --- a/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql +++ b/tests/queries/0_stateless/02710_aggregation_nested_map_ip_uuid.sql @@ -11,7 +11,6 @@ INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.t values (1, ['1.2.3.4'], [1], ['::1'], [2], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [3]); INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) values(1, ['1.2.3.4'], [4], ['::1'], [5], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [6]); -SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; OPTIMIZE TABLE summing_table FINAL; SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; @@ -27,7 +26,6 @@ INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.t values(2, ['1.2.3.4'], [19], ['::2'], [20], ['00130949-0cd4-4c3d-84c4-cc421eff480f'], [21]); INSERT INTO summing_table(id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total) values(1, ['1.2.3.4'], [22], ['::1'], [23], ['00000000-0cd4-4c3d-84c4-cc421eff480f'], [24]); -SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; OPTIMIZE TABLE summing_table FINAL; SELECT * FROM summing_table ORDER BY id, ip4Map.value, ip4Map.total, ip6Map.value, ip6Map.total, uuidMap.value, uuidMap.total; From b60f51c4d69478011dff927d25dbdf8712c41e1b Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 10 Apr 2023 10:31:26 -0300 Subject: [PATCH 172/535] remove extra backslash in docs --- docs/en/sql-reference/functions/string-functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 38be76daad5..7b808c65a7a 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1268,7 +1268,7 @@ Same as `extractKeyValuePairs` but with escaping support. Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` and `\0`. Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: -`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31).\ +`\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). **Escape sequences with escape sequence support turned on** ``` sql From ed6efc5c6cf706658578877a167618feb3959ed4 Mon Sep 17 00:00:00 2001 From: Nikolay Degterinsky Date: Mon, 10 Apr 2023 15:21:17 +0000 Subject: [PATCH 173/535] Fix LOGICAL_ERROR in executable table function --- src/TableFunctions/TableFunctionExecutable.cpp | 2 +- .../0_stateless/02377_executable_function_settings.reference | 1 + .../queries/0_stateless/02377_executable_function_settings.sql | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/TableFunctions/TableFunctionExecutable.cpp b/src/TableFunctions/TableFunctionExecutable.cpp index ae0946f8a50..39f87827a3f 100644 --- a/src/TableFunctions/TableFunctionExecutable.cpp +++ b/src/TableFunctions/TableFunctionExecutable.cpp @@ -56,7 +56,7 @@ void TableFunctionExecutable::parseArguments(const ASTPtr & ast_function, Contex auto args = function->arguments->children; - if (args.size() < 3) + if (args.size() < 3 || args[2]->as()) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Table function '{}' requires minimum 3 arguments: script_name, format, structure, [input_query...]", getName()); diff --git a/tests/queries/0_stateless/02377_executable_function_settings.reference b/tests/queries/0_stateless/02377_executable_function_settings.reference index 5eef5774e14..edef1cca7a1 100644 --- a/tests/queries/0_stateless/02377_executable_function_settings.reference +++ b/tests/queries/0_stateless/02377_executable_function_settings.reference @@ -6,3 +6,4 @@ FROM executable(\'\', \'JSON\', \'data String\', SETTINGS max_command_execution_ -------------------- SELECT data FROM executable(\'\', \'JSON\', \'data String\', SETTINGS max_command_execution_time = 100, command_read_timeout = 1) +-------------------- diff --git a/tests/queries/0_stateless/02377_executable_function_settings.sql b/tests/queries/0_stateless/02377_executable_function_settings.sql index be60ad2d89b..f2b74d8c3ac 100644 --- a/tests/queries/0_stateless/02377_executable_function_settings.sql +++ b/tests/queries/0_stateless/02377_executable_function_settings.sql @@ -3,3 +3,5 @@ SELECT '--------------------'; EXPLAIN SYNTAX SELECT * from executable('', 'JSON', 'data String', SETTINGS max_command_execution_time=100); SELECT '--------------------'; EXPLAIN SYNTAX SELECT * from executable('', 'JSON', 'data String', SETTINGS max_command_execution_time=100, command_read_timeout=1); +SELECT '--------------------'; +EXPLAIN SYNTAX SELECT * from executable('JSON', 'data String', SETTINGS max_command_execution_time=100); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } From 078b8f53990072ad797488a1f66f57390f0cf14c Mon Sep 17 00:00:00 2001 From: pufit Date: Tue, 11 Apr 2023 19:55:59 -0400 Subject: [PATCH 174/535] Small refactor, additional tests --- docs/ru/sql-reference/statements/grant.md | 2 +- .../Access/InterpreterGrantQuery.cpp | 49 ++++++---------- src/Parsers/Access/ASTGrantQuery.h | 1 - src/Parsers/Access/ParserGrantQuery.cpp | 6 +- .../integration/test_grant_and_revoke/test.py | 56 ++++++++++++++++++- 5 files changed, 76 insertions(+), 38 deletions(-) diff --git a/docs/ru/sql-reference/statements/grant.md b/docs/ru/sql-reference/statements/grant.md index ba902688483..8c291b9f878 100644 --- a/docs/ru/sql-reference/statements/grant.md +++ b/docs/ru/sql-reference/statements/grant.md @@ -40,7 +40,7 @@ GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_US ## Синтаксис присвоения текущих привилегий {#grant-current-grants-syntax} ```sql -GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +GRANT CURRENT GRANTS[(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*})] TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Тип привилегии diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index 6bbc5b7963d..f527e2928f2 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -334,14 +334,22 @@ namespace template void grantCurrentGrantsTemplate( T & grantee, - const AccessRightsElements & elements_to_grant, - const AccessRightsElements & elements_to_revoke, - std::shared_ptr current_user_access, - bool grant_option) + const AccessRights & rights_to_grant, + const AccessRightsElements & elements_to_revoke) { if (!elements_to_revoke.empty()) grantee.access.revoke(elements_to_revoke); + grantee.access.makeUnion(rights_to_grant); + } + + /// Grants current user's grants with grant options to specified user. + void grantCurrentGrants( + IAccessEntity & grantee, + const AccessRightsElements & elements_to_grant, + const AccessRightsElements & elements_to_revoke, + std::shared_ptr current_user_access) + { /// We need to collect all current user's grant and filter them by grant option. AccessRightsElements current_user_grantable_elements; auto available_grant_elements = current_user_access->getAccessRights()->getElements(); @@ -360,36 +368,13 @@ namespace current_user_rights.grant(element); } - /// If elements_to_grant was not specified it will grant all available for user grants. - /// Otherwise, we will intersect available grants with given set. - if (elements_to_grant.empty()) - { - if (!grant_option) - current_user_rights.revokeGrantOption(AccessType::ALL); + AccessRights new_rights(elements_to_grant); + new_rights.makeIntersection(current_user_rights); - grantee.access.makeUnion(current_user_rights); - } - else - { - AccessRights new_rights(elements_to_grant); - new_rights.makeIntersection(current_user_rights); - - grantee.access.makeUnion(new_rights); - } - } - - /// Grants current user's grants with grant options to specified user. - void grantCurrentGrants( - IAccessEntity & grantee, - const AccessRightsElements & elements_to_grant, - const AccessRightsElements & elements_to_revoke, - std::shared_ptr current_user_access, - bool grant_option) - { if (auto * user = typeid_cast(&grantee)) - grantCurrentGrantsTemplate(*user, elements_to_grant, elements_to_revoke, current_user_access, grant_option); + grantCurrentGrantsTemplate(*user, new_rights, elements_to_revoke); else if (auto * role = typeid_cast(&grantee)) - grantCurrentGrantsTemplate(*role, elements_to_grant, elements_to_revoke, current_user_access, grant_option); + grantCurrentGrantsTemplate(*role, new_rights, elements_to_revoke); } /// Updates grants of a specified user or role. @@ -465,7 +450,7 @@ BlockIO InterpreterGrantQuery::execute() { auto clone = entity->clone(); if (query.current_grants) - grantCurrentGrants(*clone, elements_to_grant, elements_to_revoke, current_user_access, query.with_grant_option); + grantCurrentGrants(*clone, elements_to_grant, elements_to_revoke, current_user_access); else updateGrantedAccessRightsAndRoles(*clone, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); return clone; diff --git a/src/Parsers/Access/ASTGrantQuery.h b/src/Parsers/Access/ASTGrantQuery.h index 365214d1b01..2ccbac3dac8 100644 --- a/src/Parsers/Access/ASTGrantQuery.h +++ b/src/Parsers/Access/ASTGrantQuery.h @@ -27,7 +27,6 @@ public: bool replace_access = false; bool replace_granted_roles = false; bool current_grants = false; - bool with_grant_option = false; std::shared_ptr grantees; diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index ce1ed8a4a96..928326e6cb0 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -296,6 +296,11 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (!ParserToken(TokenType::ClosingRoundBracket).ignore(pos, expected)) return false; } + + /// If no elements were specified it will grant all available for user grants. + /// Using `.size() == 0` because `.empty()` is overridden and returns true for NONE elements. + if (elements.size() == 0) // NOLINT + elements.emplace_back(AccessType::ALL); } else { @@ -370,7 +375,6 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->replace_access = replace_access; query->replace_granted_roles = replace_role; query->current_grants = current_grants; - query->with_grant_option = grant_option; return true; } diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index 668cd20c554..bc61a6a8cdb 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -20,6 +20,9 @@ def start_cluster(): instance.query( "CREATE TABLE test.table(x UInt32, y UInt32) ENGINE = MergeTree ORDER BY tuple()" ) + instance.query( + "CREATE TABLE test.table2(x UInt32, y UInt32) ENGINE = MergeTree ORDER BY tuple()" + ) instance.query("INSERT INTO test.table VALUES (1,5), (2,10)") yield cluster @@ -608,19 +611,29 @@ def test_grant_current_grants(): ["GRANT CREATE TABLE, CREATE VIEW ON test.* TO C"] ) + instance.query("DROP USER IF EXISTS C") + instance.query("CREATE USER C") + instance.query("GRANT CURRENT GRANTS(NONE ON *.*) TO C", user="A") + assert instance.query("SHOW GRANTS FOR C") == TSV([]) + def test_grant_current_grants_with_partial_revoke(): instance.query("CREATE USER A") instance.query("GRANT CREATE TABLE ON *.* TO A") + instance.query("REVOKE CREATE TABLE ON test.* FROM A") + instance.query("GRANT CREATE TABLE ON test.table TO A WITH GRANT OPTION") instance.query("GRANT SELECT ON *.* TO A WITH GRANT OPTION") instance.query("REVOKE SELECT ON test.* FROM A") instance.query("GRANT SELECT ON test.table TO A WITH GRANT OPTION") + instance.query("GRANT SELECT ON test.table2 TO A") + assert instance.query("SHOW GRANTS FOR A") == TSV( [ "GRANT CREATE TABLE ON *.* TO A", "GRANT SELECT ON *.* TO A WITH GRANT OPTION", - "REVOKE SELECT ON test.* FROM A", - "GRANT SELECT ON test.table TO A WITH GRANT OPTION", + "REVOKE SELECT, CREATE TABLE ON test.* FROM A", + "GRANT SELECT, CREATE TABLE ON test.table TO A WITH GRANT OPTION", + "GRANT SELECT ON test.table2 TO A", ] ) @@ -630,7 +643,29 @@ def test_grant_current_grants_with_partial_revoke(): [ "GRANT SELECT ON *.* TO B", "REVOKE SELECT ON test.* FROM B", - "GRANT SELECT ON test.table TO B", + "GRANT SELECT, CREATE TABLE ON test.table TO B", + ] + ) + + instance.query("DROP USER IF EXISTS B") + instance.query("CREATE USER B") + instance.query("GRANT CURRENT GRANTS TO B WITH GRANT OPTION", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + [ + "GRANT SELECT ON *.* TO B WITH GRANT OPTION", + "REVOKE SELECT ON test.* FROM B", + "GRANT SELECT, CREATE TABLE ON test.table TO B WITH GRANT OPTION", + ] + ) + + instance.query("DROP USER IF EXISTS C") + instance.query("CREATE USER C") + instance.query("GRANT SELECT ON test.* TO B") + instance.query("GRANT CURRENT GRANTS TO C", user="B") + assert instance.query("SHOW GRANTS FOR C") == TSV( + [ + "GRANT SELECT ON *.* TO C", + "GRANT CREATE TABLE ON test.table TO C", ] ) @@ -660,3 +695,18 @@ def test_current_grants_override(): "GRANT SELECT ON test.table TO B", ] ) + + instance.query("DROP USER IF EXISTS B") + instance.query("CREATE USER B") + instance.query("GRANT SELECT ON test.table TO B") + assert instance.query("SHOW GRANTS FOR B") == TSV( + ["GRANT SELECT ON test.table TO B"] + ) + + instance.query("GRANT CURRENT GRANTS TO B WITH REPLACE OPTION", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + [ + "GRANT SELECT ON *.* TO B", + "REVOKE SELECT ON test.* FROM B", + ] + ) From 7fa0331dd4680aa88db56da643ce0aeab8cc7b3b Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Wed, 12 Apr 2023 10:35:14 +0000 Subject: [PATCH 175/535] maybe 60 --- ..._clickhouse_help_program_options.reference | 43 ++++++++++++------- .../02598_clickhouse_help_program_options.sh | 2 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference index e3c4989bb64..3421dcb5865 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference @@ -125,12 +125,14 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg + Set config file + --disk arg Set disk name + --command_name arg + Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level clickhouse extract @@ -322,16 +324,23 @@ Usage: sudo clickhouse install [options] directory for pid file --user arg (=clickhouse) clickhouse user --group arg (=clickhouse) clickhouse group + -y [ --noninteractive ] run non-interactively + --link create symlink to the binary instead of + copying to binary-path clickhouse keeper-converter Usage: clickhouse keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/data/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/data/version-2 --output-dir /var/lib/clickhouse/coordination/snapshots Allowed options: - -h [ --help ] produce help message - --zookeeper-logs-dir arg Path to directory with ZooKeeper logs - --zookeeper-snapshots-dir arg Path to directory with ZooKeeper snapshots - --output-dir arg Directory to place output clickhouse-keeper snapshot + -h [ --help ] produce help message + --zookeeper-logs-dir arg + Path to directory with ZooKeeper logs + --zookeeper-snapshots-dir arg + Path to directory with ZooKeeper + snapshots + --output-dir arg Directory to place output + clickhouse-keeper snapshot clickhouse obfuscator @@ -764,10 +773,12 @@ Path should be in format './' or './path' or 'path' list-disks List disks names clickhouse-disks: - -h [ --help ] Print common help message - -C [ --config-file ] arg Set config file - --disk arg Set disk name - --command_name arg Name for command to do - --save-logs Save logs to a file - --log-level arg Logging level + -h [ --help ] Print common help message + -C [ --config-file ] arg + Set config file + --disk arg Set disk name + --command_name arg + Name for command to do + --save-logs Save logs to a file + --log-level arg Logging level diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh index 240fedbbd0c..ca962304426 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh @@ -10,7 +10,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # In CI there is no tty and we just ignore failed stty calls. # Set 80 to have same as default size as in notty. backup_stty_size=$(stty size 2>/dev/null | awk '{print $2}' ||:) -stty columns 100 2>/dev/null ||: +stty columns 60 2>/dev/null ||: echo "================BINARY==========================" From f8e4d6bb41eae52d2dcc0da9284fffedc8d1c134 Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Wed, 12 Apr 2023 15:18:28 +0000 Subject: [PATCH 176/535] Add CI run with new analyzer enabled --- .github/workflows/pull_request.yml | 35 ++++++++++++++++++++++++++++++ tests/ci/functional_test_check.py | 2 ++ tests/config/install.sh | 4 ++++ tests/config/users.d/analyzer.xml | 7 ++++++ 4 files changed, 48 insertions(+) create mode 100644 tests/config/users.d/analyzer.xml diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6fccc0542b7..38a7a8713ae 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1308,6 +1308,40 @@ jobs: docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseAnalyzer: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_analyzer + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, analyzer) + REPO_COPY=${{runner.temp}}/stateless_analyzer/ClickHouse + KILL_TIMEOUT=10800 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseS3_0: needs: [BuilderDebRelease] runs-on: [self-hosted, func-tester] @@ -4755,6 +4789,7 @@ jobs: - FunctionalStatelessTestReleaseDatabaseReplicated2 - FunctionalStatelessTestReleaseDatabaseReplicated3 - FunctionalStatelessTestReleaseWideParts + - FunctionalStatelessTestReleaseAnalyzer - FunctionalStatelessTestAarch64 - FunctionalStatelessTestAsan0 - FunctionalStatelessTestAsan1 diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index 8e55c084f21..f10cd634605 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -53,6 +53,8 @@ def get_additional_envs(check_name, run_by_hash_num, run_by_hash_total): result.append("USE_PARALLEL_REPLICAS=1") if "s3 storage" in check_name: result.append("USE_S3_STORAGE_FOR_MERGE_TREE=1") + if "analyzer" in check_name: + result.append("USE_NEW_ANALYZER=1") if run_by_hash_total != 0: result.append(f"RUN_BY_HASH_NUM={run_by_hash_num}") diff --git a/tests/config/install.sh b/tests/config/install.sh index 77e8a8460ad..efa5a9c086e 100755 --- a/tests/config/install.sh +++ b/tests/config/install.sh @@ -79,6 +79,10 @@ ln -sf $SRC_PATH/users.d/marks.xml $DEST_SERVER_PATH/users.d/ ln -sf $SRC_PATH/users.d/insert_keeper_retries.xml $DEST_SERVER_PATH/users.d/ ln -sf $SRC_PATH/users.d/prefetch_settings.xml $DEST_SERVER_PATH/users.d/ +if [[ -n "$USE_NEW_ANALYZER" ]] && [[ "$USE_NEW_ANALYZER" -eq 1 ]]; then + ln -sf $SRC_PATH/users.d/analyzer.xml $DEST_SERVER_PATH/users.d/ +fi + # FIXME DataPartsExchange may hang for http_send_timeout seconds # when nobody is going to read from the other side of socket (due to "Fetching of part was cancelled"), # but socket is owned by HTTPSessionPool, so it's not closed. diff --git a/tests/config/users.d/analyzer.xml b/tests/config/users.d/analyzer.xml new file mode 100644 index 00000000000..aa374364ef0 --- /dev/null +++ b/tests/config/users.d/analyzer.xml @@ -0,0 +1,7 @@ + + + + 1 + + + From 360fc596945d4b78de47545b71a543790331042b Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Wed, 12 Apr 2023 16:46:30 +0000 Subject: [PATCH 177/535] Handle known broken tests --- docker/test/stateless-analyzer/Dockerfile | 7 + .../test/stateless-analyzer/broken_tests.txt | 170 +++++++++++++ docker/test/stateless-analyzer/run.sh | 230 ++++++++++++++++++ .../util/process_functional_tests_result.py | 30 ++- tests/ci/functional_test_check.py | 2 + 5 files changed, 431 insertions(+), 8 deletions(-) create mode 100644 docker/test/stateless-analyzer/Dockerfile create mode 100644 docker/test/stateless-analyzer/broken_tests.txt create mode 100755 docker/test/stateless-analyzer/run.sh diff --git a/docker/test/stateless-analyzer/Dockerfile b/docker/test/stateless-analyzer/Dockerfile new file mode 100644 index 00000000000..9cbcc69c795 --- /dev/null +++ b/docker/test/stateless-analyzer/Dockerfile @@ -0,0 +1,7 @@ +ARG FROM_TAG=latest +FROM clickhouse/stateless-test:$FROM_TAG + +COPY run.sh / +COPY broken_tests.txt / + +CMD ["/bin/bash", "/run.sh"] diff --git a/docker/test/stateless-analyzer/broken_tests.txt b/docker/test/stateless-analyzer/broken_tests.txt new file mode 100644 index 00000000000..cca1c556a98 --- /dev/null +++ b/docker/test/stateless-analyzer/broken_tests.txt @@ -0,0 +1,170 @@ +00223_shard_distributed_aggregation_memory_efficient +00562_in_subquery_merge_tree +00593_union_all_assert_columns_removed +00597_push_down_predicate_long +00673_subquery_prepared_set_performance +00700_decimal_compare +00717_merge_and_distributed +00725_memory_tracking +00754_distributed_optimize_skip_select_on_unused_shards +00754_distributed_optimize_skip_select_on_unused_shards_with_prewhere +00814_replicated_minimalistic_part_header_zookeeper +00838_unique_index +00897_flatten +00927_asof_joins +00940_order_by_read_in_order_query_plan +00945_bloom_filter_index +00952_input_function +00953_zookeeper_suetin_deduplication_bug +00979_set_index_not +00981_in_subquery_with_tuple +01049_join_low_card_bug_long +01062_pm_all_join_with_block_continuation +01064_incremental_streaming_from_2_src_with_feedback +01071_force_optimize_skip_unused_shards +01072_optimize_skip_unused_shards_const_expr_eval +01083_expressions_in_engine_arguments +01086_odbc_roundtrip +01142_join_lc_and_nullable_in_key +01142_merge_join_lc_and_nullable_in_key +01152_cross_replication +01155_rename_move_materialized_view +01173_transaction_control_queries +01211_optimize_skip_unused_shards_type_mismatch +01213_optimize_skip_unused_shards_DISTINCT +01214_test_storage_merge_aliases_with_where +01231_distributed_aggregation_memory_efficient_mix_levels +01232_extremes +01244_optimize_distributed_group_by_sharding_key +01247_optimize_distributed_group_by_sharding_key_dist_on_dist +01268_mv_scalars +01268_shard_avgweighted +01270_optimize_skip_unused_shards_low_cardinality +01319_optimize_skip_unused_shards_nesting +01353_low_cardinality_join_types +01357_version_collapsing_attach_detach_zookeeper +01396_inactive_replica_cleanup_nodes_zookeeper +01414_mutations_and_errors_zookeeper +01428_nullable_asof_join +01455_shard_leaf_max_rows_bytes_to_read +01476_right_full_join_switch +01477_lc_in_merge_join_left_key +01487_distributed_in_not_default_db +01495_subqueries_in_with_statement +01504_rocksdb +01505_trivial_count_with_partition_predicate +01527_dist_sharding_key_dictGet_reload +01528_allow_nondeterministic_optimize_skip_unused_shards +01540_verbatim_partition_pruning +01560_merge_distributed_join +01563_distributed_query_finish +01576_alias_column_rewrite +01582_distinct_optimization +01583_const_column_in_set_index +01584_distributed_buffer_cannot_find_column +01585_use_index_for_global_in +01585_use_index_for_global_in_with_null +01586_columns_pruning +01586_replicated_mutations_empty_partition +01593_concurrent_alter_mutations_kill_many_replicas_long +01600_detach_permanently +01615_random_one_shard_insertion +01622_constraints_simple_optimization +01624_soft_constraints +01650_drop_part_and_deduplication_zookeeper_long +01651_bugs_from_15889 +01655_plan_optimizations +01655_plan_optimizations_optimize_read_in_window_order +01656_test_query_log_factories_info +01674_filter_by_uint8 +01681_bloom_filter_nullable_column +01700_system_zookeeper_path_in +01705_normalize_create_alter_function_names +01710_aggregate_projections +01710_force_use_projection +01710_minmax_count_projection +01710_normal_projection_fix1 +01710_projection_additional_filters +01710_projection_aggregation_in_order +01710_projection_in_index +01710_projection_vertical_merges +01710_projection_with_joins +01710_projections +01710_projections_in_distributed_query +01710_projections_optimize_aggregation_in_order +01710_projections_partial_optimize_aggregation_in_order +01721_join_implicit_cast_long +01737_move_order_key_to_prewhere_select_final +01739_index_hint +01747_join_view_filter_dictionary +01748_partition_id_pruning +01753_system_zookeeper_query_param_path_long +01756_optimize_skip_unused_shards_rewrite_in +01757_optimize_skip_unused_shards_limit +01758_optimize_skip_unused_shards_once +01759_optimize_skip_unused_shards_zero_shards +01761_cast_to_enum_nullable +01786_explain_merge_tree +01848_partition_value_column +01889_key_condition_function_chains +01889_sqlite_read_write +01890_materialized_distributed_join +01901_in_literal_shard_prune +01925_join_materialized_columns +01925_test_group_by_const_consistency +01925_test_storage_merge_aliases +01930_optimize_skip_unused_shards_rewrite_in +01947_mv_subquery +01949_clickhouse_local_with_remote_localhost +01951_distributed_push_down_limit +01952_optimize_distributed_group_by_sharding_key +02000_join_on_const +02001_shard_num_shard_count +02024_join_on_or_long +02131_used_row_policies_in_query_log +02139_MV_with_scalar_subquery +02149_read_in_order_fixed_prefix +02174_cte_scalar_cache_mv +02221_system_zookeeper_unrestricted_like +02242_join_rocksdb +02267_join_dup_columns_issue36199 +02302_s3_file_pruning +02317_distinct_in_order_optimization_explain +02336_sort_optimization_with_fill +02341_global_join_cte +02343_aggregation_pipeline +02343_group_by_use_nulls_distributed +02345_implicit_transaction +02346_additional_filters +02346_additional_filters_distr +02346_additional_filters_index +02352_grouby_shadows_arg +02354_annoy +02366_union_decimal_conversion +02375_rocksdb_with_filters +02377_optimize_sorting_by_input_stream_properties_explain +02382_join_and_filtering_set +02402_merge_engine_with_view +02404_memory_bound_merging +02421_decimal_in_precision_issue_41125 +02426_orc_bug +02428_decimal_in_floating_point_literal +02428_parameterized_view +02458_use_structure_from_insertion_table +02479_mysql_connect_to_self +02479_race_condition_between_insert_and_droppin_mv +02481_aggregation_in_order_plan +02481_merge_array_join_sample_by +02483_check_virtuals_shile_using_structure_from_insertion_table +02493_inconsistent_hex_and_binary_number +02494_optimize_group_by_function_keys_and_alias_columns +02494_zero_copy_and_projection_and_mutation_work_together +02496_remove_redundant_sorting +02500_remove_redundant_distinct +02511_complex_literals_as_aggregate_function_parameters +02515_cleanup_async_insert_block_ids +02516_projections_and_context +02521_aggregation_by_partitions +02535_max_parallel_replicas_custom_key +02554_fix_grouping_sets_predicate_push_down +02575_merge_prewhere_different_default_kind \ No newline at end of file diff --git a/docker/test/stateless-analyzer/run.sh b/docker/test/stateless-analyzer/run.sh new file mode 100755 index 00000000000..d3bb78400e2 --- /dev/null +++ b/docker/test/stateless-analyzer/run.sh @@ -0,0 +1,230 @@ +#!/bin/bash + +# fail on errors, verbose and export all env variables +set -e -x -a + +# Choose random timezone for this test run. +TZ="$(rg -v '#' /usr/share/zoneinfo/zone.tab | awk '{print $3}' | shuf | head -n1)" +echo "Choosen random timezone $TZ" +ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone + +dpkg -i package_folder/clickhouse-common-static_*.deb +dpkg -i package_folder/clickhouse-common-static-dbg_*.deb +dpkg -i package_folder/clickhouse-server_*.deb +dpkg -i package_folder/clickhouse-client_*.deb + +ln -s /usr/share/clickhouse-test/clickhouse-test /usr/bin/clickhouse-test + +# install test configs +/usr/share/clickhouse-test/config/install.sh + +if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + echo "Azure is disabled" +else + azurite-blob --blobHost 0.0.0.0 --blobPort 10000 --debug /azurite_log & +fi + +./setup_minio.sh stateless +./setup_hdfs_minicluster.sh + +# For flaky check we also enable thread fuzzer +if [ "$NUM_TRIES" -gt "1" ]; then + export THREAD_FUZZER_CPU_TIME_PERIOD_US=1000 + export THREAD_FUZZER_SLEEP_PROBABILITY=0.1 + export THREAD_FUZZER_SLEEP_TIME_US=100000 + + export THREAD_FUZZER_pthread_mutex_lock_BEFORE_MIGRATE_PROBABILITY=1 + export THREAD_FUZZER_pthread_mutex_lock_AFTER_MIGRATE_PROBABILITY=1 + export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_MIGRATE_PROBABILITY=1 + export THREAD_FUZZER_pthread_mutex_unlock_AFTER_MIGRATE_PROBABILITY=1 + + export THREAD_FUZZER_pthread_mutex_lock_BEFORE_SLEEP_PROBABILITY=0.001 + export THREAD_FUZZER_pthread_mutex_lock_AFTER_SLEEP_PROBABILITY=0.001 + export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_SLEEP_PROBABILITY=0.001 + export THREAD_FUZZER_pthread_mutex_unlock_AFTER_SLEEP_PROBABILITY=0.001 + export THREAD_FUZZER_pthread_mutex_lock_BEFORE_SLEEP_TIME_US=10000 + export THREAD_FUZZER_pthread_mutex_lock_AFTER_SLEEP_TIME_US=10000 + export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_SLEEP_TIME_US=10000 + export THREAD_FUZZER_pthread_mutex_unlock_AFTER_SLEEP_TIME_US=10000 + + mkdir -p /var/run/clickhouse-server + # simpliest way to forward env variables to server + sudo -E -u clickhouse /usr/bin/clickhouse-server --config /etc/clickhouse-server/config.xml --daemon --pid-file /var/run/clickhouse-server/clickhouse-server.pid +else + sudo clickhouse start +fi + +if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + mkdir -p /var/run/clickhouse-server1 + sudo chown clickhouse:clickhouse /var/run/clickhouse-server1 + sudo -E -u clickhouse /usr/bin/clickhouse server --config /etc/clickhouse-server1/config.xml --daemon \ + --pid-file /var/run/clickhouse-server1/clickhouse-server.pid \ + -- --path /var/lib/clickhouse1/ --logger.stderr /var/log/clickhouse-server/stderr1.log \ + --logger.log /var/log/clickhouse-server/clickhouse-server1.log --logger.errorlog /var/log/clickhouse-server/clickhouse-server1.err.log \ + --tcp_port 19000 --tcp_port_secure 19440 --http_port 18123 --https_port 18443 --interserver_http_port 19009 --tcp_with_proxy_port 19010 \ + --mysql_port 19004 --postgresql_port 19005 \ + --keeper_server.tcp_port 19181 --keeper_server.server_id 2 \ + --prometheus.port 19988 \ + --macros.replica r2 # It doesn't work :( + + mkdir -p /var/run/clickhouse-server2 + sudo chown clickhouse:clickhouse /var/run/clickhouse-server2 + sudo -E -u clickhouse /usr/bin/clickhouse server --config /etc/clickhouse-server2/config.xml --daemon \ + --pid-file /var/run/clickhouse-server2/clickhouse-server.pid \ + -- --path /var/lib/clickhouse2/ --logger.stderr /var/log/clickhouse-server/stderr2.log \ + --logger.log /var/log/clickhouse-server/clickhouse-server2.log --logger.errorlog /var/log/clickhouse-server/clickhouse-server2.err.log \ + --tcp_port 29000 --tcp_port_secure 29440 --http_port 28123 --https_port 28443 --interserver_http_port 29009 --tcp_with_proxy_port 29010 \ + --mysql_port 29004 --postgresql_port 29005 \ + --keeper_server.tcp_port 29181 --keeper_server.server_id 3 \ + --prometheus.port 29988 \ + --macros.shard s2 # It doesn't work :( + + MAX_RUN_TIME=$((MAX_RUN_TIME < 9000 ? MAX_RUN_TIME : 9000)) # min(MAX_RUN_TIME, 2.5 hours) + MAX_RUN_TIME=$((MAX_RUN_TIME != 0 ? MAX_RUN_TIME : 9000)) # set to 2.5 hours if 0 (unlimited) +fi + +sleep 5 + +function run_tests() +{ + set -x + # We can have several additional options so we pass them as array because it is more ideologically correct. + read -ra ADDITIONAL_OPTIONS <<< "${ADDITIONAL_OPTIONS:-}" + + HIGH_LEVEL_COVERAGE=YES + + # Use random order in flaky check + if [ "$NUM_TRIES" -gt "1" ]; then + ADDITIONAL_OPTIONS+=('--order=random') + HIGH_LEVEL_COVERAGE=NO + fi + + if [[ -n "$USE_S3_STORAGE_FOR_MERGE_TREE" ]] && [[ "$USE_S3_STORAGE_FOR_MERGE_TREE" -eq 1 ]]; then + ADDITIONAL_OPTIONS+=('--s3-storage') + fi + + if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + ADDITIONAL_OPTIONS+=('--replicated-database') + ADDITIONAL_OPTIONS+=('--jobs') + ADDITIONAL_OPTIONS+=('2') + else + # Too many tests fail for DatabaseReplicated in parallel. All other + # configurations are OK. + ADDITIONAL_OPTIONS+=('--jobs') + ADDITIONAL_OPTIONS+=('8') + fi + + if [[ -n "$RUN_BY_HASH_NUM" ]] && [[ -n "$RUN_BY_HASH_TOTAL" ]]; then + ADDITIONAL_OPTIONS+=('--run-by-hash-num') + ADDITIONAL_OPTIONS+=("$RUN_BY_HASH_NUM") + ADDITIONAL_OPTIONS+=('--run-by-hash-total') + ADDITIONAL_OPTIONS+=("$RUN_BY_HASH_TOTAL") + HIGH_LEVEL_COVERAGE=NO + fi + + if [[ -n "$USE_DATABASE_ORDINARY" ]] && [[ "$USE_DATABASE_ORDINARY" -eq 1 ]]; then + ADDITIONAL_OPTIONS+=('--db-engine=Ordinary') + fi + + if [[ "${HIGH_LEVEL_COVERAGE}" = "YES" ]]; then + ADDITIONAL_OPTIONS+=('--report-coverage') + fi + + ADDITIONAL_OPTIONS+=('--report-logs-stats') + + set +e + clickhouse-test --testname --shard --zookeeper --check-zookeeper-session --hung-check --print-time \ + --test-runs "$NUM_TRIES" "${ADDITIONAL_OPTIONS[@]}" 2>&1 \ + | ts '%Y-%m-%d %H:%M:%S' \ + | tee -a test_output/test_result.txt + set -e +} + +export -f run_tests + +if [ "$NUM_TRIES" -gt "1" ]; then + # We don't run tests with Ordinary database in PRs, only in master. + # So run new/changed tests with Ordinary at least once in flaky check. + timeout "$MAX_RUN_TIME" bash -c 'NUM_TRIES=1; USE_DATABASE_ORDINARY=1; run_tests' \ + | sed 's/All tests have finished//' | sed 's/No tests were run//' ||: +fi + +timeout "$MAX_RUN_TIME" bash -c run_tests ||: + +echo "Files in current directory" +ls -la ./ +echo "Files in root directory" +ls -la / + +/process_functional_tests_result.py --broken_tests=broken_tests.txt || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv + +clickhouse-client -q "system flush logs" ||: + +# Stop server so we can safely read data with clickhouse-local. +# Why do we read data with clickhouse-local? +# Because it's the simplest way to read it when server has crashed. +sudo clickhouse stop ||: +if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + sudo clickhouse stop --pid-path /var/run/clickhouse-server1 ||: + sudo clickhouse stop --pid-path /var/run/clickhouse-server2 ||: +fi + +rg -Fa "" /var/log/clickhouse-server/clickhouse-server.log ||: +rg -A50 -Fa "============" /var/log/clickhouse-server/stderr.log ||: +zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.zst & + +# Compress tables. +# +# NOTE: +# - that due to tests with s3 storage we cannot use /var/lib/clickhouse/data +# directly +# - even though ci auto-compress some files (but not *.tsv) it does this only +# for files >64MB, we want this files to be compressed explicitly +for table in query_log zookeeper_log trace_log transactions_info_log +do + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.tsv.zst ||: + if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + clickhouse-local --path /var/lib/clickhouse1/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.1.tsv.zst ||: + clickhouse-local --path /var/lib/clickhouse2/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.2.tsv.zst ||: + fi +done + +# Also export trace log in flamegraph-friendly format. +for trace_type in CPU Memory Real +do + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q " + select + arrayStringConcat((arrayMap(x -> concat(splitByChar('/', addressToLine(x))[-1], '#', demangle(addressToSymbol(x)) ), trace)), ';') AS stack, + count(*) AS samples + from system.trace_log + where trace_type = '$trace_type' + group by trace + order by samples desc + settings allow_introspection_functions = 1 + format TabSeparated" \ + | zstd --threads=0 > "/test_output/trace-log-$trace_type-flamegraph.tsv.zst" ||: +done + + +# Compressed (FIXME: remove once only github actions will be left) +rm /var/log/clickhouse-server/clickhouse-server.log +mv /var/log/clickhouse-server/stderr.log /test_output/ ||: +if [[ -n "$WITH_COVERAGE" ]] && [[ "$WITH_COVERAGE" -eq 1 ]]; then + tar --zstd -chf /test_output/clickhouse_coverage.tar.zst /profraw ||: +fi + +tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||: + +if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then + rg -Fa "" /var/log/clickhouse-server/clickhouse-server1.log ||: + rg -Fa "" /var/log/clickhouse-server/clickhouse-server2.log ||: + zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.zst ||: + zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.zst ||: + # FIXME: remove once only github actions will be left + rm /var/log/clickhouse-server/clickhouse-server1.log + rm /var/log/clickhouse-server/clickhouse-server2.log + mv /var/log/clickhouse-server/stderr1.log /test_output/ ||: + mv /var/log/clickhouse-server/stderr2.log /test_output/ ||: + tar -chf /test_output/coordination1.tar /var/lib/clickhouse1/coordination ||: + tar -chf /test_output/coordination2.tar /var/lib/clickhouse2/coordination ||: +fi diff --git a/docker/test/util/process_functional_tests_result.py b/docker/test/util/process_functional_tests_result.py index da58db8e45d..84e1ad1dc2a 100755 --- a/docker/test/util/process_functional_tests_result.py +++ b/docker/test/util/process_functional_tests_result.py @@ -18,7 +18,7 @@ SUCCESS_FINISH_SIGNS = ["All tests have finished", "No tests were run"] RETRIES_SIGN = "Some tests were restarted" -def process_test_log(log_path): +def process_test_log(log_path, broken_tests): total = 0 skipped = 0 unknown = 0 @@ -62,8 +62,12 @@ def process_test_log(log_path): failed += 1 test_results.append((test_name, "Timeout", test_time, [])) elif FAIL_SIGN in line: - failed += 1 - test_results.append((test_name, "FAIL", test_time, [])) + if test_name in broken_tests: + success += 1 + test_results.append((test_name, "OK", test_time, [])) + else: + failed += 1 + test_results.append((test_name, "FAIL", test_time, [])) elif UNKNOWN_SIGN in line: unknown += 1 test_results.append((test_name, "FAIL", test_time, [])) @@ -71,8 +75,12 @@ def process_test_log(log_path): skipped += 1 test_results.append((test_name, "SKIPPED", test_time, [])) else: - success += int(OK_SIGN in line) - test_results.append((test_name, "OK", test_time, [])) + if OK_SIGN in line and test_name in broken_tests: + failed += 1 + test_results.append((test_name, "FAIL", test_time, ["Test is expected to fail!\n"])) + else: + success += int(OK_SIGN in line) + test_results.append((test_name, "OK", test_time, [])) test_end = False elif ( len(test_results) > 0 and test_results[-1][1] == "FAIL" and not test_end @@ -110,7 +118,7 @@ def process_test_log(log_path): ) -def process_result(result_path): +def process_result(result_path, broken_tests): test_results = [] state = "success" description = "" @@ -134,7 +142,7 @@ def process_result(result_path): success_finish, retries, test_results, - ) = process_test_log(result_path) + ) = process_test_log(result_path, broken_tests) is_flacky_check = 1 < int(os.environ.get("NUM_TRIES", 1)) logging.info("Is flaky check: %s", is_flacky_check) # If no tests were run (success == 0) it indicates an error (e.g. server did not start or crashed immediately) @@ -186,9 +194,15 @@ if __name__ == "__main__": parser.add_argument("--in-results-dir", default="/test_output/") parser.add_argument("--out-results-file", default="/test_output/test_results.tsv") parser.add_argument("--out-status-file", default="/test_output/check_status.tsv") + parser.add_argument("--broken-tests", default="") args = parser.parse_args() - state, description, test_results = process_result(args.in_results_dir) + broken_tests = list() + if len(args.broken_tests) != 0: + with open(args.broken_tests) as f: + broken_tests = f.readlines() + + state, description, test_results = process_result(args.in_results_dir, broken_tests) logging.info("Result parsed") status = (state, description) write_results(args.out_results_file, args.out_status_file, test_results, status) diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index f10cd634605..c4ce77c050e 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -64,6 +64,8 @@ def get_additional_envs(check_name, run_by_hash_num, run_by_hash_total): def get_image_name(check_name): + if "analyzer" in check_name.lower(): + return "clickhouse/stateless-analyzer" if "stateless" in check_name.lower(): return "clickhouse/stateless-test" if "stateful" in check_name.lower(): From fa7b72570b5caa3600d44a6dff4764fd2351fe88 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 12 Apr 2023 17:09:37 +0000 Subject: [PATCH 178/535] Automatic style fix --- docker/test/util/process_functional_tests_result.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docker/test/util/process_functional_tests_result.py b/docker/test/util/process_functional_tests_result.py index 84e1ad1dc2a..365a1b22523 100755 --- a/docker/test/util/process_functional_tests_result.py +++ b/docker/test/util/process_functional_tests_result.py @@ -77,7 +77,14 @@ def process_test_log(log_path, broken_tests): else: if OK_SIGN in line and test_name in broken_tests: failed += 1 - test_results.append((test_name, "FAIL", test_time, ["Test is expected to fail!\n"])) + test_results.append( + ( + test_name, + "FAIL", + test_time, + ["Test is expected to fail!\n"], + ) + ) else: success += int(OK_SIGN in line) test_results.append((test_name, "OK", test_time, [])) From d351c66a3416322d4468744d488821c6ce88fb2d Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Wed, 12 Apr 2023 17:55:17 +0000 Subject: [PATCH 179/535] Make test stable for sudo and no-sudo env --- .../02598_clickhouse_help_program_options.reference | 10 +++++----- .../02598_clickhouse_help_program_options.sh | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference index 3421dcb5865..c2fe09153ed 100644 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.reference @@ -311,7 +311,7 @@ clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/ clickhouse install -Usage: sudo clickhouse install [options] +Usage: clickhouse install [options] -h [ --help ] produce help message --prefix arg (=/) prefix for all paths --binary-path arg (=usr/bin) where to install binaries @@ -399,7 +399,7 @@ clickhouse static clickhouse start -Usage: sudo clickhouse start +Usage: clickhouse start -h [ --help ] produce help message --prefix arg (=/) prefix for all paths --binary-path arg (=usr/bin) directory with binary @@ -417,7 +417,7 @@ Usage: sudo clickhouse start clickhouse stop -Usage: sudo clickhouse stop +Usage: clickhouse stop -h [ --help ] produce help message --prefix arg (=/) prefix for all paths --pid-path arg (=var/run/clickhouse-server) @@ -432,7 +432,7 @@ Usage: sudo clickhouse stop clickhouse status -Usage: sudo clickhouse status +Usage: clickhouse status -h [ --help ] produce help message --prefix arg (=/) prefix for all paths --pid-path arg (=var/run/clickhouse-server) @@ -441,7 +441,7 @@ Usage: sudo clickhouse status clickhouse restart -Usage: sudo clickhouse restart +Usage: clickhouse restart -h [ --help ] produce help message --prefix arg (=/) prefix for all paths --binary-path arg (=usr/bin) directory with binary diff --git a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh index ca962304426..992ca50776f 100755 --- a/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh +++ b/tests/queries/0_stateless/02598_clickhouse_help_program_options.sh @@ -36,7 +36,7 @@ $CLICKHOUSE_BINARY format --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs echo -e "\nclickhouse git-import\n" $CLICKHOUSE_BINARY git-import --help | perl -0777 -pe 's/Allowed options:.*\n\n//igs' echo -e "\nclickhouse install\n" -$CLICKHOUSE_BINARY install --help +$CLICKHOUSE_BINARY install --help | perl -ne "s/sudo clickhouse/clickhouse/g; print;" echo -e "\nclickhouse keeper-converter\n" $CLICKHOUSE_BINARY keeper-converter --help echo -e "\nclickhouse obfuscator\n" @@ -47,13 +47,13 @@ $CLICKHOUSE_BINARY static-files-disk-uploader --help | perl -0777 -pe 's/Allowed echo -e "\nclickhouse start\n" -$CLICKHOUSE_BINARY start --help +$CLICKHOUSE_BINARY start --help | perl -ne "s/sudo clickhouse/clickhouse/g; print;" echo -e "\nclickhouse stop\n" -$CLICKHOUSE_BINARY stop --help +$CLICKHOUSE_BINARY stop --help | perl -ne "s/sudo clickhouse/clickhouse/g; print;" echo -e "\nclickhouse status\n" -$CLICKHOUSE_BINARY status --help +$CLICKHOUSE_BINARY status --help | perl -ne "s/sudo clickhouse/clickhouse/g; print;" echo -e "\nclickhouse restart\n" -$CLICKHOUSE_BINARY restart --help +$CLICKHOUSE_BINARY restart --help | perl -ne "s/sudo clickhouse/clickhouse/g; print;" echo -e "\nclickhouse su\n" $CLICKHOUSE_BINARY su --help echo -e "\nclickhouse hash\n" From a97fa9a4495e2018f980693e85c8c47ce084c158 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 12 Apr 2023 15:36:30 -0300 Subject: [PATCH 180/535] add input arguments type validation --- .../keyvaluepair/ArgumentExtractor.cpp | 72 ++++++++++++++++--- .../keyvaluepair/ArgumentExtractor.h | 8 ++- ...extract_key_value_pairs_multiple_input.sql | 48 +++++++++++++ 3 files changed, 117 insertions(+), 11 deletions(-) diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index c7c99c3ae85..253d341a567 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -2,6 +2,8 @@ #include +#include + namespace DB { @@ -11,39 +13,52 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } +namespace +{ + auto popFrontAndGet(auto & container) + { + auto element = container.front(); + container.pop_front(); + return element; + } +} + ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithTypeAndName & arguments) +{ + return extract(ColumnsWithTypeAndNameList{arguments.begin(), arguments.end()}); +} + +ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(ColumnsWithTypeAndNameList arguments) { if (arguments.empty()) { throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function extractKeyValuePairs requires at least one argument"); } - auto data_column = arguments[0].column; + auto data_column = extractStringColumn(popFrontAndGet(arguments), "data_column"); - if (arguments.size() == 1u) + if (arguments.empty()) { return ParsedArguments{data_column}; } - auto key_value_delimiter = extractControlCharacter(arguments[1].column); + auto key_value_delimiter = extractSingleCharacter(popFrontAndGet(arguments), "key_value_delimiter"); - if (arguments.size() == 2u) + if (arguments.empty()) { return ParsedArguments {data_column, key_value_delimiter}; } - auto pair_delimiters_characters = arguments[2].column->getDataAt(0).toView(); + auto pair_delimiters = extractVector(popFrontAndGet(arguments), "pair_delimiters"); - VectorArgument pair_delimiters {pair_delimiters_characters.begin(), pair_delimiters_characters.end()}; - - if (arguments.size() == 3u) + if (arguments.empty()) { return ParsedArguments { data_column, key_value_delimiter, pair_delimiters }; } - auto quoting_character = extractControlCharacter(arguments[3].column); + auto quoting_character = extractSingleCharacter(popFrontAndGet(arguments), "quoting_character"); return ParsedArguments { data_column, @@ -53,8 +68,13 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT }; } -ArgumentExtractor::CharArgument ArgumentExtractor::extractControlCharacter(ColumnPtr column) +ArgumentExtractor::CharArgument ArgumentExtractor::extractSingleCharacter(const ColumnWithTypeAndName & argument, const std::string & parameter_name) { + const auto type = argument.type; + const auto column = argument.column; + + validateColumnType(type, parameter_name); + auto view = column->getDataAt(0).toView(); if (view.empty()) @@ -69,5 +89,37 @@ ArgumentExtractor::CharArgument ArgumentExtractor::extractControlCharacter(Colum throw Exception(ErrorCodes::BAD_ARGUMENTS, "Control character argument must either be empty or contain exactly 1 character"); } +ColumnPtr ArgumentExtractor::extractStringColumn(const ColumnWithTypeAndName & argument, const std::string & parameter_name) +{ + auto type = argument.type; + auto column = argument.column; + + validateColumnType(type, parameter_name); + + return column; } +ArgumentExtractor::VectorArgument ArgumentExtractor::extractVector(const ColumnWithTypeAndName & argument, const std::string & parameter_name) +{ + const auto type = argument.type; + const auto column = argument.column; + + validateColumnType(type, parameter_name); + + auto view = column->getDataAt(0).toView(); + + return {view.begin(), view.end()}; +} + +void ArgumentExtractor::validateColumnType(DataTypePtr type, const std::string & parameter_name) +{ + if (!isStringOrFixedString(type)) + { + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "Illegal type {} of argument {}. Must be String.", + type, parameter_name); + } +} + +} diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.h b/src/Functions/keyvaluepair/ArgumentExtractor.h index 184d4ec3393..e6538584d01 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.h +++ b/src/Functions/keyvaluepair/ArgumentExtractor.h @@ -18,6 +18,7 @@ class ArgumentExtractor public: using CharArgument = std::optional; using VectorArgument = std::vector; + using ColumnsWithTypeAndNameList = std::list; struct ParsedArguments { @@ -30,9 +31,14 @@ public: static ParsedArguments extract(const ColumnsWithTypeAndName & arguments); + static ParsedArguments extract(ColumnsWithTypeAndNameList arguments); private: - static ArgumentExtractor::CharArgument extractControlCharacter(ColumnPtr column); + static CharArgument extractSingleCharacter(const ColumnWithTypeAndName & arguments, const std::string & parameter_name); + static ColumnPtr extractStringColumn(const ColumnWithTypeAndName & arguments, const std::string & parameter_name); + static VectorArgument extractVector(const ColumnWithTypeAndName & arguments, const std::string & parameter_name); + + static void validateColumnType(DataTypePtr type, const std::string & parameter_name); }; } diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index b4013d2c11e..d14fc81559b 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -330,6 +330,54 @@ WITH SELECT x; -- {serverError BAD_ARGUMENTS} +-- should fail because data_column argument must be of type String +WITH + extractKeyValuePairs([1, 2]) AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError ILLEGAL_TYPE_OF_ARGUMENT} + +-- should fail because key_value_delimiter argument must be of type String +WITH + extractKeyValuePairs('', [1, 2]) AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError ILLEGAL_TYPE_OF_ARGUMENT} + +-- should fail because pair_delimiters argument must be of type String +WITH + extractKeyValuePairs('', ':', [1, 2]) AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError ILLEGAL_TYPE_OF_ARGUMENT} + +-- should fail because quoting_character argument must be of type String +WITH + extractKeyValuePairs('', ':', ' ', [1, 2]) AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError ILLEGAL_TYPE_OF_ARGUMENT} + -- should fail because pair delimiters can contain at most 8 characters WITH extractKeyValuePairs('not_important', ':', '123456789', '\'') AS s_map, From ee6ad4a4611e2cb85484f72c09a74ff76d8e657f Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 12 Apr 2023 15:37:58 -0300 Subject: [PATCH 181/535] reject values starting with escape sequences if escaping support is turned on --- src/Functions/keyvaluepair/impl/StateHandlerImpl.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index 8c1795f22bc..f8270802034 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -195,6 +195,14 @@ public: { return {pos, State::WAITING_KEY}; } + + if constexpr (WITH_ESCAPING) + { + if (isEscapeCharacter(current_character)) + { + return {pos, State::WAITING_KEY}; + } + } } return {pos, State::READING_VALUE}; From 174885368fd24d56f148d9813cb82cc0aa138061 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Wed, 12 Apr 2023 18:46:07 +0000 Subject: [PATCH 182/535] Parallelize query processing right after reading FROM ... - mostly simple or external storages --- src/Storages/IStorage.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index d50f335c1c9..2994b3aae5f 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -133,6 +133,12 @@ void IStorage::read( size_t num_streams) { auto pipe = read(column_names, storage_snapshot, query_info, context, processed_stage, max_block_size, num_streams); + + /// parallelize processing if not yet + const size_t output_ports = pipe.numOutputPorts(); + if (output_ports > 0 && output_ports < num_streams) + pipe.resize(num_streams); + readFromPipe(query_plan, std::move(pipe), column_names, storage_snapshot, query_info, context, getName()); } From 41b4f8549f2b71585433190432f542f2cbc52c32 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Wed, 12 Apr 2023 17:15:58 -0300 Subject: [PATCH 183/535] define ILLEGAL_TYPE_OF_ARGUMENT in ArgumentExtractor --- src/Functions/keyvaluepair/ArgumentExtractor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 253d341a567..1fa3fd54f16 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -11,6 +11,7 @@ namespace ErrorCodes { extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int BAD_ARGUMENTS; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; } namespace From ac540335e7d51a894d8f18310faac318d2234624 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Wed, 12 Apr 2023 21:05:24 +0000 Subject: [PATCH 184/535] Let's see blast radius w/o parallelization after numbers() --- src/Storages/IStorage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index 2994b3aae5f..24e1f45ae4c 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -136,7 +136,7 @@ void IStorage::read( /// parallelize processing if not yet const size_t output_ports = pipe.numOutputPorts(); - if (output_ports > 0 && output_ports < num_streams) + if (output_ports > 0 && output_ports < num_streams && getName() != "SystemNumbers") pipe.resize(num_streams); readFromPipe(query_plan, std::move(pipe), column_names, storage_snapshot, query_info, context, getName()); From ba1adeba2be16fd8e60a2c97ff22c35d9736aa8e Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Wed, 12 Apr 2023 21:46:09 +0000 Subject: [PATCH 185/535] Fix fast tests + avoid parallelization after SourceFromSingleChunk, SystemOne --- src/Storages/IStorage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index 24e1f45ae4c..a6324fe7354 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -136,7 +136,9 @@ void IStorage::read( /// parallelize processing if not yet const size_t output_ports = pipe.numOutputPorts(); - if (output_ports > 0 && output_ports < num_streams && getName() != "SystemNumbers") + const auto storage_name = getName(); + if (output_ports > 0 && output_ports < num_streams && storage_name != "SystemNumbers" && storage_name != "SourceFromSingleChunk" + && storage_name != "SystemOne") pipe.resize(num_streams); readFromPipe(query_plan, std::move(pipe), column_names, storage_snapshot, query_info, context, getName()); From d6bff4c5a8255920eea65065aae04b0a92dd90f8 Mon Sep 17 00:00:00 2001 From: Alexander Tokmakov Date: Thu, 13 Apr 2023 00:20:43 +0200 Subject: [PATCH 186/535] limit the number of mutations commands per MUTATE_PART --- src/Storages/MergeTree/MergeTreeSettings.h | 1 + .../MergeTree/ReplicatedMergeTreeQueue.cpp | 31 ++++++++++++------- .../MergeTree/ReplicatedMergeTreeQueue.h | 12 +++---- ...tem_parts_race_condition_zookeeper_long.sh | 4 +-- ...tem_parts_race_condition_drop_zookeeper.sh | 4 ++- 5 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeSettings.h b/src/Storages/MergeTree/MergeTreeSettings.h index 4aabcbbf865..ad55c9d47f3 100644 --- a/src/Storages/MergeTree/MergeTreeSettings.h +++ b/src/Storages/MergeTree/MergeTreeSettings.h @@ -72,6 +72,7 @@ struct Settings; M(UInt64, merge_tree_enable_clear_old_broken_detached, false, "Enable clearing old broken detached parts operation in background.", 0) \ M(Bool, remove_rolled_back_parts_immediately, 1, "Setting for an incomplete experimental feature.", 0) \ M(CleanDeletedRows, clean_deleted_rows, CleanDeletedRows::Never, "Is the Replicated Merge cleanup has to be done automatically at each merge or manually (possible values are 'Always'/'Never' (default))", 0) \ + M(UInt64, replicated_max_mutations_in_one_entry, 10000, "Max number of mutation commands that can be merged together and executed in one MUTATE_PART entry (0 means unlimited)", 0) \ \ /** Inserts settings. */ \ M(UInt64, parts_to_delay_insert, 150, "If table contains at least that many active parts in single partition, artificially slow down insert into table. Disabled if set to 0", 0) \ diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp index 623210ae04c..88759542a17 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.cpp @@ -1526,7 +1526,7 @@ bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry( } -Int64 ReplicatedMergeTreeQueue::getCurrentMutationVersionImpl( +Int64 ReplicatedMergeTreeQueue::getCurrentMutationVersion( const String & partition_id, Int64 data_version, std::lock_guard & /* state_lock */) const { auto in_partition = mutations_by_partition.find(partition_id); @@ -1542,13 +1542,6 @@ Int64 ReplicatedMergeTreeQueue::getCurrentMutationVersionImpl( } -Int64 ReplicatedMergeTreeQueue::getCurrentMutationVersion(const String & partition_id, Int64 data_version) const -{ - std::lock_guard lock(state_mutex); - return getCurrentMutationVersionImpl(partition_id, data_version, lock); -} - - ReplicatedMergeTreeQueue::CurrentlyExecuting::CurrentlyExecuting( const ReplicatedMergeTreeQueue::LogEntryPtr & entry_, ReplicatedMergeTreeQueue & queue_, std::unique_lock & /* state_lock */) : entry(entry_), queue(queue_) @@ -2278,10 +2271,10 @@ bool ReplicatedMergeTreeMergePredicate::canMergeTwoParts( } } - Int64 left_mutation_ver = queue.getCurrentMutationVersionImpl( + Int64 left_mutation_ver = queue.getCurrentMutationVersion( left->info.partition_id, left->info.getDataVersion(), lock); - Int64 right_mutation_ver = queue.getCurrentMutationVersionImpl( + Int64 right_mutation_ver = queue.getCurrentMutationVersion( left->info.partition_id, right->info.getDataVersion(), lock); if (left_mutation_ver != right_mutation_ver) @@ -2382,7 +2375,10 @@ std::optional> ReplicatedMergeTreeMergePredicate::getDesir if (in_partition == queue.mutations_by_partition.end()) return {}; - Int64 current_version = queue.getCurrentMutationVersionImpl(part->info.partition_id, part->info.getDataVersion(), lock); + UInt64 mutations_limit = queue.storage.getSettings()->replicated_max_mutations_in_one_entry; + UInt64 mutations_count = 0; + + Int64 current_version = queue.getCurrentMutationVersion(part->info.partition_id, part->info.getDataVersion(), lock); Int64 max_version = in_partition->second.rbegin()->first; int alter_version = -1; @@ -2401,11 +2397,24 @@ std::optional> ReplicatedMergeTreeMergePredicate::getDesir break; } } + + if (current_version < max_version) + ++mutations_count; + + if (mutations_limit && mutations_count == mutations_limit) + { + LOG_WARNING(queue.log, "Will apply only {} of {} mutations and mutate part {} to version {} (the last version is {})", + mutations_count, in_partition->second.size(), part->name, max_version, in_partition->second.rbegin()->first); + break; + } } if (current_version >= max_version) return {}; + LOG_TRACE(queue.log, "Will apply {} mutations and mutate part {} to version {} (the last version is {})", + mutations_count, part->name, max_version, in_partition->second.rbegin()->first); + return std::make_pair(max_version, alter_version); } diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h index 841c26bb361..1e8406740f4 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeQueue.h @@ -207,7 +207,11 @@ private: MergeTreeDataMergerMutator & merger_mutator, MergeTreeData & data, std::unique_lock & state_lock) const; - Int64 getCurrentMutationVersionImpl(const String & partition_id, Int64 data_version, std::lock_guard & /* state_lock */) const; + /// Return the version (block number) of the last mutation that we don't need to apply to the part + /// with getDataVersion() == data_version. (Either this mutation was already applied or the part + /// was created after the mutation). + /// If there is no such mutation or it has already been executed and deleted, return 0. + Int64 getCurrentMutationVersion(const String & partition_id, Int64 data_version, std::lock_guard & /* state_lock */) const; /** Check that part isn't in currently generating parts and isn't covered by them. * Should be called under state_mutex. @@ -386,12 +390,6 @@ public: /// Returns functor which used by MergeTreeMergerMutator to select parts for merge ReplicatedMergeTreeMergePredicate getMergePredicate(zkutil::ZooKeeperPtr & zookeeper, PartitionIdsHint && partition_ids_hint); - /// Return the version (block number) of the last mutation that we don't need to apply to the part - /// with getDataVersion() == data_version. (Either this mutation was already applied or the part - /// was created after the mutation). - /// If there is no such mutation or it has already been executed and deleted, return 0. - Int64 getCurrentMutationVersion(const String & partition_id, Int64 data_version) const; - MutationCommands getMutationCommands(const MergeTreeData::DataPartPtr & part, Int64 desired_mutation_version) const; /// Return mutation commands for part with smallest mutation version bigger diff --git a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh index 8dbd10fc27b..d49f63e143d 100755 --- a/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh +++ b/tests/queries/0_stateless/00992_system_parts_race_condition_zookeeper_long.sh @@ -13,8 +13,8 @@ $CLICKHOUSE_CLIENT -n -q " DROP TABLE IF EXISTS alter_table0; DROP TABLE IF EXISTS alter_table1; - CREATE TABLE alter_table0 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0; - CREATE TABLE alter_table1 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0 + CREATE TABLE alter_table0 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r1') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0, replicated_max_mutations_in_one_entry = $(($RANDOM / 50)); + CREATE TABLE alter_table1 (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r2') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 1, cleanup_delay_period_random_add = 0, replicated_max_mutations_in_one_entry = $(($RANDOM / 50)); " function thread1() diff --git a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh index ff6a4b8fc42..bceda77c7f8 100755 --- a/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh +++ b/tests/queries/0_stateless/00993_system_parts_race_condition_drop_zookeeper.sh @@ -56,7 +56,9 @@ function thread6() while true; do REPLICA=$(($RANDOM % 10)) $CLICKHOUSE_CLIENT -n -q "DROP TABLE IF EXISTS alter_table_$REPLICA; - CREATE TABLE alter_table_$REPLICA (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r_$REPLICA') ORDER BY a PARTITION BY b % 10 SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 0, cleanup_delay_period_random_add = 0;"; + CREATE TABLE alter_table_$REPLICA (a UInt8, b Int16, c Float32, d String, e Array(UInt8), f Nullable(UUID), g Tuple(UInt8, UInt16)) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/alter_table', 'r_$REPLICA') ORDER BY a PARTITION BY b % 10 + SETTINGS old_parts_lifetime = 1, cleanup_delay_period = 0, cleanup_delay_period_random_add = 0, replicated_max_mutations_in_one_entry = $(($RANDOM / 50));"; sleep 0.$RANDOM; done } From aa0f3bc994786aa0ce0735981f1e9cc0c21b0897 Mon Sep 17 00:00:00 2001 From: pufit Date: Wed, 12 Apr 2023 20:28:17 -0400 Subject: [PATCH 187/535] Solve pr issues --- .../Access/InterpreterGrantQuery.cpp | 33 ++++++++++++------- src/Parsers/Access/ParserGrantQuery.cpp | 29 +++++++++++++--- .../integration/test_grant_and_revoke/test.py | 21 ++++++++---- 3 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/Interpreters/Access/InterpreterGrantQuery.cpp b/src/Interpreters/Access/InterpreterGrantQuery.cpp index f527e2928f2..0bce0b2a6bd 100644 --- a/src/Interpreters/Access/InterpreterGrantQuery.cpp +++ b/src/Interpreters/Access/InterpreterGrantQuery.cpp @@ -346,11 +346,21 @@ namespace /// Grants current user's grants with grant options to specified user. void grantCurrentGrants( IAccessEntity & grantee, - const AccessRightsElements & elements_to_grant, - const AccessRightsElements & elements_to_revoke, - std::shared_ptr current_user_access) + const AccessRights & new_rights, + const AccessRightsElements & elements_to_revoke) + { + if (auto * user = typeid_cast(&grantee)) + grantCurrentGrantsTemplate(*user, new_rights, elements_to_revoke); + else if (auto * role = typeid_cast(&grantee)) + grantCurrentGrantsTemplate(*role, new_rights, elements_to_revoke); + } + + /// Calculates all available rights to grant with current user intersection. + void calculateCurrentGrantRightsWithIntersection( + AccessRights & rights, + std::shared_ptr current_user_access, + const AccessRightsElements & elements_to_grant) { - /// We need to collect all current user's grant and filter them by grant option. AccessRightsElements current_user_grantable_elements; auto available_grant_elements = current_user_access->getAccessRights()->getElements(); std::copy_if( @@ -368,13 +378,8 @@ namespace current_user_rights.grant(element); } - AccessRights new_rights(elements_to_grant); - new_rights.makeIntersection(current_user_rights); - - if (auto * user = typeid_cast(&grantee)) - grantCurrentGrantsTemplate(*user, new_rights, elements_to_revoke); - else if (auto * role = typeid_cast(&grantee)) - grantCurrentGrantsTemplate(*role, new_rights, elements_to_revoke); + rights.grant(elements_to_grant); + rights.makeIntersection(current_user_rights); } /// Updates grants of a specified user or role. @@ -445,12 +450,16 @@ BlockIO InterpreterGrantQuery::execute() if (need_check_grantees_are_allowed) current_user_access->checkGranteesAreAllowed(grantees); + AccessRights new_rights; + if (query.current_grants) + calculateCurrentGrantRightsWithIntersection(new_rights, current_user_access, elements_to_grant); + /// Update roles and users listed in `grantees`. auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr { auto clone = entity->clone(); if (query.current_grants) - grantCurrentGrants(*clone, elements_to_grant, elements_to_revoke, current_user_access); + grantCurrentGrants(*clone, new_rights, elements_to_revoke); else updateGrantedAccessRightsAndRoles(*clone, elements_to_grant, elements_to_revoke, roles_to_grant, roles_to_revoke, query.admin_option); return clone; diff --git a/src/Parsers/Access/ParserGrantQuery.cpp b/src/Parsers/Access/ParserGrantQuery.cpp index 928326e6cb0..2ff110f136a 100644 --- a/src/Parsers/Access/ParserGrantQuery.cpp +++ b/src/Parsers/Access/ParserGrantQuery.cpp @@ -295,12 +295,31 @@ bool ParserGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (!ParserToken(TokenType::ClosingRoundBracket).ignore(pos, expected)) return false; - } - /// If no elements were specified it will grant all available for user grants. - /// Using `.size() == 0` because `.empty()` is overridden and returns true for NONE elements. - if (elements.size() == 0) // NOLINT - elements.emplace_back(AccessType::ALL); + /// If no elements were specified it will grant all available for user grants. + /// Using `.size() == 0` because `.empty()` is overridden and returns true for NONE elements. + /// Specifically, this should handle `GRANT CURRENT GRANTS() ...` + if (elements.size() == 0) // NOLINT + elements.emplace_back(AccessType::ALL); + } + else + { + AccessRightsElement default_element(AccessType::ALL); + + if (!ParserKeyword{"ON"}.ignore(pos, expected)) + return false; + + String database_name, table_name; + bool any_database = false, any_table = false; + if (!parseDatabaseAndTableNameOrAsterisks(pos, expected, database_name, any_database, table_name, any_table)) + return false; + + default_element.any_database = any_database; + default_element.database = database_name; + default_element.any_table = any_table; + default_element.table = table_name; + elements.push_back(std::move(default_element)); + } } else { diff --git a/tests/integration/test_grant_and_revoke/test.py b/tests/integration/test_grant_and_revoke/test.py index bc61a6a8cdb..ee5d4b5df93 100644 --- a/tests/integration/test_grant_and_revoke/test.py +++ b/tests/integration/test_grant_and_revoke/test.py @@ -600,7 +600,7 @@ def test_grant_current_grants(): ) instance.query("CREATE USER B") - instance.query("GRANT CURRENT GRANTS TO B", user="A") + instance.query("GRANT CURRENT GRANTS ON *.* TO B", user="A") assert instance.query("SHOW GRANTS FOR B") == TSV( ["GRANT SELECT, CREATE TABLE, CREATE VIEW ON test.* TO B"] ) @@ -638,7 +638,7 @@ def test_grant_current_grants_with_partial_revoke(): ) instance.query("CREATE USER B") - instance.query("GRANT CURRENT GRANTS TO B", user="A") + instance.query("GRANT CURRENT GRANTS ON *.* TO B", user="A") assert instance.query("SHOW GRANTS FOR B") == TSV( [ "GRANT SELECT ON *.* TO B", @@ -649,7 +649,7 @@ def test_grant_current_grants_with_partial_revoke(): instance.query("DROP USER IF EXISTS B") instance.query("CREATE USER B") - instance.query("GRANT CURRENT GRANTS TO B WITH GRANT OPTION", user="A") + instance.query("GRANT CURRENT GRANTS ON *.* TO B WITH GRANT OPTION", user="A") assert instance.query("SHOW GRANTS FOR B") == TSV( [ "GRANT SELECT ON *.* TO B WITH GRANT OPTION", @@ -661,7 +661,7 @@ def test_grant_current_grants_with_partial_revoke(): instance.query("DROP USER IF EXISTS C") instance.query("CREATE USER C") instance.query("GRANT SELECT ON test.* TO B") - instance.query("GRANT CURRENT GRANTS TO C", user="B") + instance.query("GRANT CURRENT GRANTS ON *.* TO C", user="B") assert instance.query("SHOW GRANTS FOR C") == TSV( [ "GRANT SELECT ON *.* TO C", @@ -669,6 +669,15 @@ def test_grant_current_grants_with_partial_revoke(): ] ) + instance.query("DROP USER IF EXISTS B") + instance.query("CREATE USER B") + instance.query("GRANT CURRENT GRANTS ON test.* TO B WITH GRANT OPTION", user="A") + assert instance.query("SHOW GRANTS FOR B") == TSV( + [ + "GRANT SELECT, CREATE TABLE ON test.table TO B WITH GRANT OPTION", + ] + ) + def test_current_grants_override(): instance.query("CREATE USER A") @@ -687,7 +696,7 @@ def test_current_grants_override(): ["GRANT SELECT ON test.table TO B"] ) - instance.query("GRANT CURRENT GRANTS TO B", user="A") + instance.query("GRANT CURRENT GRANTS ON *.* TO B", user="A") assert instance.query("SHOW GRANTS FOR B") == TSV( [ "GRANT SELECT ON *.* TO B", @@ -703,7 +712,7 @@ def test_current_grants_override(): ["GRANT SELECT ON test.table TO B"] ) - instance.query("GRANT CURRENT GRANTS TO B WITH REPLACE OPTION", user="A") + instance.query("GRANT CURRENT GRANTS ON *.* TO B WITH REPLACE OPTION", user="A") assert instance.query("SHOW GRANTS FOR B") == TSV( [ "GRANT SELECT ON *.* TO B", From afda642a4718053ee8f68be6b69bd64e18ed1731 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Thu, 13 Apr 2023 07:10:59 +0000 Subject: [PATCH 188/535] Try to add lost symlinks in packages --- packages/clickhouse-common-static.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/clickhouse-common-static.yaml b/packages/clickhouse-common-static.yaml index c77914d0d69..9f37745c14b 100644 --- a/packages/clickhouse-common-static.yaml +++ b/packages/clickhouse-common-static.yaml @@ -41,6 +41,10 @@ contents: dst: /usr/bin/clickhouse-library-bridge - src: root/usr/bin/clickhouse-odbc-bridge dst: /usr/bin/clickhouse-odbc-bridge +- src: root/usr/bin/clickhouse-static-files-disk-uploader + dst: /usr/bin/clickhouse-static-files-disk-uploader +- src: root/usr/bin/clickhouse-su + dst: /usr/bin/clickhouse-su - src: root/usr/share/bash-completion/completions dst: /usr/share/bash-completion/completions # docs From da9a539cf79edb3f8daf8521ea7cac14eb0271a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Wed, 12 Apr 2023 15:36:23 +0200 Subject: [PATCH 189/535] Reduce the usage of Arena.h --- .../AggregateFunctionDistinct.h | 1 + .../AggregateFunctionGroupUniqArray.h | 1 + .../AggregateFunctionHistogram.h | 2 +- .../AggregateFunctionIntervalLengthSum.h | 1 - .../AggregateFunctionKolmogorovSmirnovTest.h | 1 - .../AggregateFunctionMannWhitney.h | 1 - .../AggregateFunctionRankCorrelation.h | 2 -- .../AggregateFunctionRetention.h | 1 - .../AggregateFunctionTopK.h | 1 + .../AggregateFunctionWindowFunnel.h | 1 - src/Common/TLDListsHolder.h | 2 +- src/Dictionaries/DictionaryHelpers.h | 3 +- src/Dictionaries/IPAddressDictionary.h | 3 +- src/Dictionaries/RegExpTreeDictionary.h | 1 - src/IO/ReadHelpers.h | 17 ---------- src/IO/ReadHelpersArena.h | 31 +++++++++++++++++++ src/Interpreters/AggregationCommon.h | 3 +- src/Interpreters/Aggregator.h | 5 ++- .../Impl/ParallelFormattingOutputFormat.h | 1 - .../Transforms/TotalsHavingTransform.h | 4 --- 20 files changed, 46 insertions(+), 36 deletions(-) create mode 100644 src/IO/ReadHelpersArena.h diff --git a/src/AggregateFunctions/AggregateFunctionDistinct.h b/src/AggregateFunctions/AggregateFunctionDistinct.h index e09e0ef621d..4338dcff5c0 100644 --- a/src/AggregateFunctions/AggregateFunctionDistinct.h +++ b/src/AggregateFunctions/AggregateFunctionDistinct.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace DB diff --git a/src/AggregateFunctions/AggregateFunctionGroupUniqArray.h b/src/AggregateFunctions/AggregateFunctionGroupUniqArray.h index bc7ccb08267..4cd7a7932b0 100644 --- a/src/AggregateFunctions/AggregateFunctionGroupUniqArray.h +++ b/src/AggregateFunctions/AggregateFunctionGroupUniqArray.h @@ -4,6 +4,7 @@ #include #include +#include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionHistogram.h b/src/AggregateFunctions/AggregateFunctionHistogram.h index 3a98737f199..967bc9bb517 100644 --- a/src/AggregateFunctions/AggregateFunctionHistogram.h +++ b/src/AggregateFunctions/AggregateFunctionHistogram.h @@ -2,7 +2,6 @@ #include -#include #include #include @@ -29,6 +28,7 @@ namespace DB { struct Settings; +class Arena; namespace ErrorCodes { diff --git a/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h b/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h index e31c62802f1..16e9388d4bb 100644 --- a/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h +++ b/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h @@ -6,7 +6,6 @@ #include -#include #include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionKolmogorovSmirnovTest.h b/src/AggregateFunctions/AggregateFunctionKolmogorovSmirnovTest.h index 51e0950f782..737f37b1fba 100644 --- a/src/AggregateFunctions/AggregateFunctionKolmogorovSmirnovTest.h +++ b/src/AggregateFunctions/AggregateFunctionKolmogorovSmirnovTest.h @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionMannWhitney.h b/src/AggregateFunctions/AggregateFunctionMannWhitney.h index 86075440169..ac6ce0d0ca9 100644 --- a/src/AggregateFunctions/AggregateFunctionMannWhitney.h +++ b/src/AggregateFunctions/AggregateFunctionMannWhitney.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionRankCorrelation.h b/src/AggregateFunctions/AggregateFunctionRankCorrelation.h index 4f9ca55f9f5..4f7d04100cf 100644 --- a/src/AggregateFunctions/AggregateFunctionRankCorrelation.h +++ b/src/AggregateFunctions/AggregateFunctionRankCorrelation.h @@ -14,8 +14,6 @@ #include #include -#include - namespace DB { struct Settings; diff --git a/src/AggregateFunctions/AggregateFunctionRetention.h b/src/AggregateFunctions/AggregateFunctionRetention.h index 7ecb9509dd5..63ff5921540 100644 --- a/src/AggregateFunctions/AggregateFunctionRetention.h +++ b/src/AggregateFunctions/AggregateFunctionRetention.h @@ -8,7 +8,6 @@ #include #include #include -#include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionTopK.h b/src/AggregateFunctions/AggregateFunctionTopK.h index f1e57608195..89985c0ea6b 100644 --- a/src/AggregateFunctions/AggregateFunctionTopK.h +++ b/src/AggregateFunctions/AggregateFunctionTopK.h @@ -2,6 +2,7 @@ #include #include +#include #include #include diff --git a/src/AggregateFunctions/AggregateFunctionWindowFunnel.h b/src/AggregateFunctions/AggregateFunctionWindowFunnel.h index c4a9fa1b936..e83c5277d26 100644 --- a/src/AggregateFunctions/AggregateFunctionWindowFunnel.h +++ b/src/AggregateFunctions/AggregateFunctionWindowFunnel.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include diff --git a/src/Common/TLDListsHolder.h b/src/Common/TLDListsHolder.h index 5ea8c5afe9f..be399843c08 100644 --- a/src/Common/TLDListsHolder.h +++ b/src/Common/TLDListsHolder.h @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -11,6 +10,7 @@ namespace DB { +class Arena; enum TLDType { diff --git a/src/Dictionaries/DictionaryHelpers.h b/src/Dictionaries/DictionaryHelpers.h index 4fc080f2960..1de7be0bf4f 100644 --- a/src/Dictionaries/DictionaryHelpers.h +++ b/src/Dictionaries/DictionaryHelpers.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -29,6 +28,8 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } +class Arena; + /** Simple helper for getting default. * Initialized with default value and default values column. * If default values column is not null default value is taken from column. diff --git a/src/Dictionaries/IPAddressDictionary.h b/src/Dictionaries/IPAddressDictionary.h index 67827c6524e..40dc5dd6782 100644 --- a/src/Dictionaries/IPAddressDictionary.h +++ b/src/Dictionaries/IPAddressDictionary.h @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -18,6 +17,8 @@ namespace DB { +class Arena; + class IPAddressDictionary final : public IDictionary { public: diff --git a/src/Dictionaries/RegExpTreeDictionary.h b/src/Dictionaries/RegExpTreeDictionary.h index 17a0c6bbef3..4e8e20bba2d 100644 --- a/src/Dictionaries/RegExpTreeDictionary.h +++ b/src/Dictionaries/RegExpTreeDictionary.h @@ -10,7 +10,6 @@ #include #include -#include #include #include #include diff --git a/src/IO/ReadHelpers.h b/src/IO/ReadHelpers.h index 9c0c9525773..f1f001dd2c5 100644 --- a/src/IO/ReadHelpers.h +++ b/src/IO/ReadHelpers.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -142,22 +141,6 @@ inline void readStringBinary(std::string & s, ReadBuffer & buf, size_t max_strin buf.readStrict(s.data(), size); } - -inline StringRef readStringBinaryInto(Arena & arena, ReadBuffer & buf) -{ - size_t size = 0; - readVarUInt(size, buf); - - if (unlikely(size > DEFAULT_MAX_STRING_SIZE)) - throw Exception(ErrorCodes::TOO_LARGE_STRING_SIZE, "Too large string size."); - - char * data = arena.alloc(size); - buf.readStrict(data, size); - - return StringRef(data, size); -} - - template void readVectorBinary(std::vector & v, ReadBuffer & buf) { diff --git a/src/IO/ReadHelpersArena.h b/src/IO/ReadHelpersArena.h new file mode 100644 index 00000000000..3ff65817e33 --- /dev/null +++ b/src/IO/ReadHelpersArena.h @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include + + +namespace DB +{ + + +namespace ErrorCodes +{ + extern const int TOO_LARGE_STRING_SIZE; +} + +inline StringRef readStringBinaryInto(Arena & arena, ReadBuffer & buf) +{ + size_t size = 0; + readVarUInt(size, buf); + + if (unlikely(size > DEFAULT_MAX_STRING_SIZE)) + throw Exception(ErrorCodes::TOO_LARGE_STRING_SIZE, "Too large string size."); + + char * data = arena.alloc(size); + buf.readStrict(data, size); + + return StringRef(data, size); +} + +} diff --git a/src/Interpreters/AggregationCommon.h b/src/Interpreters/AggregationCommon.h index 32b01ee0416..2e6da40ff1f 100644 --- a/src/Interpreters/AggregationCommon.h +++ b/src/Interpreters/AggregationCommon.h @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -25,6 +24,8 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } +class Arena; + using Sizes = std::vector; /// When packing the values of nullable columns at a given row, we have to diff --git a/src/Interpreters/Aggregator.h b/src/Interpreters/Aggregator.h index 5fb94c5f4e8..92d0c27cac4 100644 --- a/src/Interpreters/Aggregator.h +++ b/src/Interpreters/Aggregator.h @@ -7,7 +7,6 @@ #include -#include #include #include #include @@ -47,6 +46,10 @@ namespace ErrorCodes extern const int UNKNOWN_AGGREGATED_DATA_VARIANT; } +class Arena; +using ArenaPtr = std::shared_ptr; +using Arenas = std::vector; + /** Different data structures that can be used for aggregation * For efficiency, the aggregation data itself is put into the pool. * Data and pool ownership (states of aggregate functions) diff --git a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h index 4e5aaab5dcb..fddcd059be5 100644 --- a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h +++ b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h @@ -2,7 +2,6 @@ #include -#include #include #include #include diff --git a/src/Processors/Transforms/TotalsHavingTransform.h b/src/Processors/Transforms/TotalsHavingTransform.h index f252d683b9a..350956c9c6b 100644 --- a/src/Processors/Transforms/TotalsHavingTransform.h +++ b/src/Processors/Transforms/TotalsHavingTransform.h @@ -2,14 +2,10 @@ #include #include -#include namespace DB { -class Arena; -using ArenaPtr = std::shared_ptr; - class ExpressionActions; using ExpressionActionsPtr = std::shared_ptr; From 10362c28bf1492ef8a55cc73dd6e7ca8b52afa76 Mon Sep 17 00:00:00 2001 From: Nikolay Degterinsky Date: Thu, 13 Apr 2023 08:58:51 +0000 Subject: [PATCH 190/535] Better --- src/TableFunctions/TableFunctionExecutable.cpp | 18 +++++++++++++----- .../02377_executable_function_settings.sql | 4 +++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/TableFunctions/TableFunctionExecutable.cpp b/src/TableFunctions/TableFunctionExecutable.cpp index 39f87827a3f..3943d94ef82 100644 --- a/src/TableFunctions/TableFunctionExecutable.cpp +++ b/src/TableFunctions/TableFunctionExecutable.cpp @@ -25,7 +25,7 @@ namespace ErrorCodes { extern const int LOGICAL_ERROR; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int UNSUPPORTED_METHOD; + extern const int BAD_ARGUMENTS; } std::vector TableFunctionExecutable::skipAnalysisForArguments(const QueryTreeNodePtr & query_node_table_function, ContextPtr) const @@ -56,11 +56,16 @@ void TableFunctionExecutable::parseArguments(const ASTPtr & ast_function, Contex auto args = function->arguments->children; - if (args.size() < 3 || args[2]->as()) + if (args.size() < 3) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Table function '{}' requires minimum 3 arguments: script_name, format, structure, [input_query...]", getName()); + if (args[2]->as()) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Table function '{}' requires 3 mandatory arguments: script_name, format, structure", + getName()); + for (size_t i = 0; i <= 2; ++i) args[i] = evaluateConstantExpressionOrIdentifierAsLiteral(args[i], context); @@ -83,15 +88,18 @@ void TableFunctionExecutable::parseArguments(const ASTPtr & ast_function, Contex } else { - ASTPtr query = args[i]->children.at(0); - if (query->as()) + ASTPtr query; + if (!args[i]->children.empty()) + query = args[i]->children.at(0); + + if (query && query->as()) { input_queries.emplace_back(std::move(query)); } else { throw Exception( - ErrorCodes::UNSUPPORTED_METHOD, + ErrorCodes::BAD_ARGUMENTS, "Table function '{}' argument is invalid {}", getName(), args[i]->formatForErrorMessage()); diff --git a/tests/queries/0_stateless/02377_executable_function_settings.sql b/tests/queries/0_stateless/02377_executable_function_settings.sql index f2b74d8c3ac..6887c95b06c 100644 --- a/tests/queries/0_stateless/02377_executable_function_settings.sql +++ b/tests/queries/0_stateless/02377_executable_function_settings.sql @@ -4,4 +4,6 @@ EXPLAIN SYNTAX SELECT * from executable('', 'JSON', 'data String', SETTINGS max_ SELECT '--------------------'; EXPLAIN SYNTAX SELECT * from executable('', 'JSON', 'data String', SETTINGS max_command_execution_time=100, command_read_timeout=1); SELECT '--------------------'; -EXPLAIN SYNTAX SELECT * from executable('JSON', 'data String', SETTINGS max_command_execution_time=100); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH } + +SELECT * from executable('JSON', 'data String', SETTINGS max_command_execution_time=100); -- { serverError BAD_ARGUMENTS } +SELECT * from executable('JSON', 'data String', 'TEST', 'TEST'); -- { serverError BAD_ARGUMENTS } From 5ed85d9bd7c611bf5870862276e5e10671c0ec74 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Thu, 13 Apr 2023 09:59:05 +0000 Subject: [PATCH 191/535] Fix 00109_shard_totals_after_having.sql --- tests/queries/0_stateless/00109_shard_totals_after_having.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/00109_shard_totals_after_having.sql b/tests/queries/0_stateless/00109_shard_totals_after_having.sql index 2a616b4a39d..958cd9928d9 100644 --- a/tests/queries/0_stateless/00109_shard_totals_after_having.sql +++ b/tests/queries/0_stateless/00109_shard_totals_after_having.sql @@ -16,7 +16,7 @@ SET totals_mode = 'after_having_inclusive'; SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; SET totals_mode = 'after_having_exclusive'; -SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; +SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; SET totals_mode = 'before_having'; SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; From 2b70e08f23b72f75a763dcf11bde4ad9348faca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Wed, 12 Apr 2023 17:09:05 +0200 Subject: [PATCH 192/535] Don't count unreserved bytes in Arenas as read_bytes --- src/Columns/ColumnAggregateFunction.cpp | 9 ++-- src/Common/Arena.h | 17 +++++-- src/Common/ArenaWithFreeLists.h | 9 ++-- src/Common/examples/arena_with_free_lists.cpp | 6 +-- src/Coordination/SnapshotableHashTable.h | 5 +- src/Dictionaries/CacheDictionaryStorage.h | 2 +- src/Dictionaries/FlatDictionary.cpp | 2 +- src/Dictionaries/HashedArrayDictionary.cpp | 2 +- src/Dictionaries/HashedDictionary.cpp | 2 +- src/Dictionaries/IPAddressDictionary.cpp | 2 +- src/Dictionaries/RangeHashedDictionary.h | 2 +- src/Interpreters/HashJoin.cpp | 2 +- .../Algorithms/AggregatingSortedAlgorithm.cpp | 6 +-- .../Algorithms/SummingSortedAlgorithm.cpp | 6 +-- ...714_read_bytes_aggregateFunction.reference | 6 +++ .../02714_read_bytes_aggregateFunction.sql | 49 +++++++++++++++++++ 16 files changed, 93 insertions(+), 34 deletions(-) create mode 100644 tests/queries/0_stateless/02714_read_bytes_aggregateFunction.reference create mode 100644 tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql diff --git a/src/Columns/ColumnAggregateFunction.cpp b/src/Columns/ColumnAggregateFunction.cpp index fd46b38ada8..b52f078c315 100644 --- a/src/Columns/ColumnAggregateFunction.cpp +++ b/src/Columns/ColumnAggregateFunction.cpp @@ -385,8 +385,7 @@ void ColumnAggregateFunction::updateHashFast(SipHash & hash) const /// threads, so we can't know the size of these data. size_t ColumnAggregateFunction::byteSize() const { - return data.size() * sizeof(data[0]) - + (my_arena ? my_arena->size() : 0); + return data.size() * sizeof(data[0]) + (my_arena ? my_arena->reservedBytes() : 0); } size_t ColumnAggregateFunction::byteSizeAt(size_t) const @@ -395,11 +394,11 @@ size_t ColumnAggregateFunction::byteSizeAt(size_t) const return sizeof(data[0]) + func->sizeOfData(); } -/// Like in byteSize(), the size is underestimated. +/// Similar to byteSize() the size is underestimated. +/// In this case it's also overestimated at the same time as it counts all the bytes allocated by the arena, used or not size_t ColumnAggregateFunction::allocatedBytes() const { - return data.allocated_bytes() - + (my_arena ? my_arena->size() : 0); + return data.allocated_bytes() + (my_arena ? my_arena->allocatedBytes() : 0); } void ColumnAggregateFunction::protect() diff --git a/src/Common/Arena.h b/src/Common/Arena.h index 5772dff6bca..4b358795972 100644 --- a/src/Common/Arena.h +++ b/src/Common/Arena.h @@ -299,10 +299,21 @@ public: return res; } - /// Size of MemoryChunks in bytes. - size_t size() const + /// Size of all MemoryChunks in bytes. + size_t allocatedBytes() const { return size_in_bytes; } + + /// Total reserved space of all MemoryChunks in bytes. + size_t reservedBytes() const { - return size_in_bytes; + size_t used_bytes = 0; + auto * current = head; + while (current) + { + used_bytes += current->pos - current->begin; + current = current->prev; + } + + return used_bytes; } /// Bad method, don't use it -- the MemoryChunks are not your business, the entire diff --git a/src/Common/ArenaWithFreeLists.h b/src/Common/ArenaWithFreeLists.h index 53a59c98299..76760a20320 100644 --- a/src/Common/ArenaWithFreeLists.h +++ b/src/Common/ArenaWithFreeLists.h @@ -107,10 +107,7 @@ public: } /// Size of the allocated pool in bytes - size_t size() const - { - return pool.size(); - } + size_t allocatedBytes() const { return pool.allocatedBytes(); } }; class SynchronizedArenaWithFreeLists : private ArenaWithFreeLists @@ -135,10 +132,10 @@ public: } /// Size of the allocated pool in bytes - size_t size() const + size_t allocatedBytes() const { std::lock_guard lock{mutex}; - return ArenaWithFreeLists::size(); + return ArenaWithFreeLists::allocatedBytes(); } private: mutable std::mutex mutex; diff --git a/src/Common/examples/arena_with_free_lists.cpp b/src/Common/examples/arena_with_free_lists.cpp index 4f209ccb5b2..3f1b3e88328 100644 --- a/src/Common/examples/arena_with_free_lists.cpp +++ b/src/Common/examples/arena_with_free_lists.cpp @@ -270,7 +270,7 @@ int main(int argc, char ** argv) watch.stop(); std::cerr - << "Insert info arena. Bytes: " << arena.size() + << "Insert info arena. Bytes: " << arena.allocatedBytes() << ", elapsed: " << watch.elapsedSeconds() << " (" << data.size() / watch.elapsedSeconds() << " elem/sec.," << " " << sum_strings_size / 1048576.0 / watch.elapsedSeconds() << " MiB/sec.)" @@ -298,7 +298,7 @@ int main(int argc, char ** argv) watch.stop(); std::cerr - << "Randomly remove and insert elements. Bytes: " << arena.size() + << "Randomly remove and insert elements. Bytes: " << arena.allocatedBytes() << ", elapsed: " << watch.elapsedSeconds() << " (" << data.size() / watch.elapsedSeconds() << " elem/sec.," << " " << bytes / 1048576.0 / watch.elapsedSeconds() << " MiB/sec.)" @@ -331,7 +331,7 @@ int main(int argc, char ** argv) watch.stop(); std::cerr - << "Filling cache. Bytes: " << arena.size() + << "Filling cache. Bytes: " << arena.allocatedBytes() << ", elapsed: " << watch.elapsedSeconds() << " (" << data.size() / watch.elapsedSeconds() << " elem/sec.," << " " << bytes / 1048576.0 / watch.elapsedSeconds() << " MiB/sec.)" diff --git a/src/Coordination/SnapshotableHashTable.h b/src/Coordination/SnapshotableHashTable.h index cfa3098b4a1..7db546bd4c8 100644 --- a/src/Coordination/SnapshotableHashTable.h +++ b/src/Coordination/SnapshotableHashTable.h @@ -333,10 +333,7 @@ public: } } - uint64_t keyArenaSize() const - { - return arena.size(); - } + uint64_t keyArenaSize() const { return arena.allocatedBytes(); } iterator begin() { return list.begin(); } const_iterator begin() const { return list.cbegin(); } diff --git a/src/Dictionaries/CacheDictionaryStorage.h b/src/Dictionaries/CacheDictionaryStorage.h index 5b52fbde00d..ba17cebebba 100644 --- a/src/Dictionaries/CacheDictionaryStorage.h +++ b/src/Dictionaries/CacheDictionaryStorage.h @@ -157,7 +157,7 @@ public: }); } - return arena.size() + sizeof(Cell) * configuration.max_size_in_cells + attributes_size_in_bytes; + return arena.allocatedBytes() + sizeof(Cell) * configuration.max_size_in_cells + attributes_size_in_bytes; } private: diff --git a/src/Dictionaries/FlatDictionary.cpp b/src/Dictionaries/FlatDictionary.cpp index cc345b97abe..d3699a150c4 100644 --- a/src/Dictionaries/FlatDictionary.cpp +++ b/src/Dictionaries/FlatDictionary.cpp @@ -505,7 +505,7 @@ void FlatDictionary::calculateBytesAllocated() bytes_allocated += hierarchical_index_bytes_allocated; } - bytes_allocated += string_arena.size(); + bytes_allocated += string_arena.allocatedBytes(); } FlatDictionary::Attribute FlatDictionary::createAttribute(const DictionaryAttribute & dictionary_attribute) diff --git a/src/Dictionaries/HashedArrayDictionary.cpp b/src/Dictionaries/HashedArrayDictionary.cpp index 9e6ce0597cb..880f68cea95 100644 --- a/src/Dictionaries/HashedArrayDictionary.cpp +++ b/src/Dictionaries/HashedArrayDictionary.cpp @@ -797,7 +797,7 @@ void HashedArrayDictionary::calculateBytesAllocated() bytes_allocated += hierarchical_index_bytes_allocated; } - bytes_allocated += string_arena.size(); + bytes_allocated += string_arena.allocatedBytes(); } template diff --git a/src/Dictionaries/HashedDictionary.cpp b/src/Dictionaries/HashedDictionary.cpp index 5cfac20e572..b27a0b5160e 100644 --- a/src/Dictionaries/HashedDictionary.cpp +++ b/src/Dictionaries/HashedDictionary.cpp @@ -1022,7 +1022,7 @@ void HashedDictionary::calculateBytesAlloc } for (const auto & arena : string_arenas) - bytes_allocated += arena->size(); + bytes_allocated += arena->allocatedBytes(); } template diff --git a/src/Dictionaries/IPAddressDictionary.cpp b/src/Dictionaries/IPAddressDictionary.cpp index ff1c784750b..6bb06de7506 100644 --- a/src/Dictionaries/IPAddressDictionary.cpp +++ b/src/Dictionaries/IPAddressDictionary.cpp @@ -541,7 +541,7 @@ template <> void IPAddressDictionary::addAttributeSize(const Attribute & attribute) { addAttributeSize(attribute); - bytes_allocated += sizeof(Arena) + attribute.string_arena->size(); + bytes_allocated += sizeof(Arena) + attribute.string_arena->allocatedBytes(); } void IPAddressDictionary::calculateBytesAllocated() diff --git a/src/Dictionaries/RangeHashedDictionary.h b/src/Dictionaries/RangeHashedDictionary.h index d6bb510542e..600530a3e70 100644 --- a/src/Dictionaries/RangeHashedDictionary.h +++ b/src/Dictionaries/RangeHashedDictionary.h @@ -726,7 +726,7 @@ void RangeHashedDictionary::calculateBytesAllocated() if (update_field_loaded_block) bytes_allocated += update_field_loaded_block->allocatedBytes(); - bytes_allocated += string_arena.size(); + bytes_allocated += string_arena.allocatedBytes(); } template diff --git a/src/Interpreters/HashJoin.cpp b/src/Interpreters/HashJoin.cpp index fe0244ff314..68bde0d3edb 100644 --- a/src/Interpreters/HashJoin.cpp +++ b/src/Interpreters/HashJoin.cpp @@ -517,7 +517,7 @@ size_t HashJoin::getTotalByteCount() const res += data->blocks_allocated_size; res += data->blocks_nullmaps_allocated_size; - res += data->pool.size(); + res += data->pool.allocatedBytes(); if (data->type != Type::CROSS) { diff --git a/src/Processors/Merges/Algorithms/AggregatingSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/AggregatingSortedAlgorithm.cpp index ef103eb508c..74cccdb08dd 100644 --- a/src/Processors/Merges/Algorithms/AggregatingSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/AggregatingSortedAlgorithm.cpp @@ -168,7 +168,7 @@ AggregatingSortedAlgorithm::AggregatingMergedData::AggregatingMergedData( if (def.allocates_memory_in_arena) { arena = std::make_unique(); - arena_size = arena->size(); + arena_size = arena->allocatedBytes(); } } @@ -194,10 +194,10 @@ void AggregatingSortedAlgorithm::AggregatingMergedData::startGroup(const ColumnR /// To avoid this, reset arena if and only if: /// - arena is required (i.e. SimpleAggregateFunction(any, String) in PK), /// - arena was used in the previous groups. - if (def.allocates_memory_in_arena && arena->size() > arena_size) + if (def.allocates_memory_in_arena && arena->allocatedBytes() > arena_size) { arena = std::make_unique(); - arena_size = arena->size(); + arena_size = arena->allocatedBytes(); } is_group_started = true; diff --git a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp index d8e95e6b950..7f4dcfba6c2 100644 --- a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp @@ -505,7 +505,7 @@ SummingSortedAlgorithm::SummingMergedData::SummingMergedData( if (def.allocates_memory_in_arena) { arena = std::make_unique(); - arena_size = arena->size(); + arena_size = arena->allocatedBytes(); } } @@ -519,10 +519,10 @@ void SummingSortedAlgorithm::SummingMergedData::startGroup(ColumnRawPtrs & raw_c for (auto & desc : def.columns_to_aggregate) desc.createState(); - if (def.allocates_memory_in_arena && arena->size() > arena_size) + if (def.allocates_memory_in_arena && arena->allocatedBytes() > arena_size) { arena = std::make_unique(); - arena_size = arena->size(); + arena_size = arena->allocatedBytes(); } if (def.maps_to_sum.empty()) diff --git a/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.reference b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.reference new file mode 100644 index 00000000000..d315d85a11e --- /dev/null +++ b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.reference @@ -0,0 +1,6 @@ +UInt64 1 8 +UInt64 10 80 +UInt64 1000 8000 +AggregateFunction(argMax, String, DateTime) 1 80 +AggregateFunction(argMax, String, DateTime) 10 800 +AggregateFunction(argMax, String, DateTime) 1000 80000 diff --git a/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql new file mode 100644 index 00000000000..f66857ddee6 --- /dev/null +++ b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql @@ -0,0 +1,49 @@ +CREATE TABLE test (id UInt64, `amax` AggregateFunction(argMax, String, DateTime)) +ENGINE=MergeTree() +ORDER BY id +SETTINGS ratio_of_defaults_for_sparse_serialization=1 -- Sparse columns will take more bytes for a single row +AS + SELECT number, argMaxState(number::String, '2023-04-12 16:23:01'::DateTime) + FROM numbers(1) + GROUP BY number; + +SELECT sum(id) FROM test FORMAT Null; +SELECT argMaxMerge(amax) FROM test FORMAT Null; + +INSERT INTO test + SELECT number, argMaxState(number::String, '2023-04-12 16:23:01'::DateTime) + FROM numbers(9) + GROUP BY number; + +SELECT sum(id) FROM test FORMAT Null; +SELECT argMaxMerge(amax) FROM test FORMAT Null; + +INSERT INTO test +SELECT number, argMaxState(number::String, '2023-04-12 16:23:01'::DateTime) +FROM numbers(990) +GROUP BY number; + +SELECT sum(id) FROM test FORMAT Null; +SELECT argMaxMerge(amax) FROM test FORMAT Null; + +SYSTEM FLUSH LOGS; + +SELECT 'UInt64', + read_rows, + read_bytes +FROM system.query_log +WHERE + current_database = currentDatabase() AND + query = 'SELECT sum(id) FROM test FORMAT Null;' AND + type = 2 AND event_date >= yesterday() +ORDER BY event_time_microseconds; + +SELECT 'AggregateFunction(argMax, String, DateTime)', + read_rows, + read_bytes +FROM system.query_log +WHERE + current_database = currentDatabase() AND + query = 'SELECT argMaxMerge(amax) FROM test FORMAT Null;' AND + type = 2 AND event_date >= yesterday() +ORDER BY event_time_microseconds; From e239df4c25e89bc5391ea37dc9ec3b37b68807d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Thu, 13 Apr 2023 13:41:44 +0200 Subject: [PATCH 193/535] Keep count to avoid iterating over lists --- src/Common/Arena.h | 32 ++++++++----------- .../02714_read_bytes_aggregateFunction.sql | 10 ++++++ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/Common/Arena.h b/src/Common/Arena.h index 4b358795972..829d0687e0d 100644 --- a/src/Common/Arena.h +++ b/src/Common/Arena.h @@ -80,7 +80,8 @@ private: /// Last contiguous MemoryChunk of memory. MemoryChunk * head; - size_t size_in_bytes; + size_t allocated_bytes; + size_t reserved_bytes; size_t page_size; static size_t roundUpToPageSize(size_t s, size_t page_size) @@ -119,7 +120,7 @@ private: void NO_INLINE addMemoryChunk(size_t min_size) { head = new MemoryChunk(nextSize(min_size + pad_right), head); - size_in_bytes += head->size(); + allocated_bytes += head->size(); } friend class ArenaAllocator; @@ -127,9 +128,12 @@ private: public: explicit Arena(size_t initial_size_ = 4096, size_t growth_factor_ = 2, size_t linear_growth_threshold_ = 128 * 1024 * 1024) - : growth_factor(growth_factor_), linear_growth_threshold(linear_growth_threshold_), - head(new MemoryChunk(initial_size_, nullptr)), size_in_bytes(head->size()), - page_size(static_cast(::getPageSize())) + : growth_factor(growth_factor_) + , linear_growth_threshold(linear_growth_threshold_) + , head(new MemoryChunk(initial_size_, nullptr)) + , allocated_bytes(head->size()) + , reserved_bytes(0) + , page_size(static_cast(::getPageSize())) { } @@ -141,6 +145,7 @@ public: /// Get piece of memory, without alignment. char * alloc(size_t size) { + reserved_bytes += size; if (unlikely(static_cast(size) > head->end - head->pos)) addMemoryChunk(size); @@ -153,6 +158,7 @@ public: /// Get piece of memory with alignment char * alignedAlloc(size_t size, size_t alignment) { + reserved_bytes += size; do { void * head_pos = head->pos; @@ -184,6 +190,7 @@ public: */ void * rollback(size_t size) { + reserved_bytes -= size; head->pos -= size; ASAN_POISON_MEMORY_REGION(head->pos, size + pad_right); return head->pos; @@ -300,21 +307,10 @@ public: } /// Size of all MemoryChunks in bytes. - size_t allocatedBytes() const { return size_in_bytes; } + size_t allocatedBytes() const { return allocated_bytes; } /// Total reserved space of all MemoryChunks in bytes. - size_t reservedBytes() const - { - size_t used_bytes = 0; - auto * current = head; - while (current) - { - used_bytes += current->pos - current->begin; - current = current->prev; - } - - return used_bytes; - } + size_t reservedBytes() const { return reserved_bytes; } /// Bad method, don't use it -- the MemoryChunks are not your business, the entire /// purpose of the arena code is to manage them for you, so if you find diff --git a/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql index f66857ddee6..26bc9ebe62b 100644 --- a/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql +++ b/tests/queries/0_stateless/02714_read_bytes_aggregateFunction.sql @@ -38,6 +38,16 @@ WHERE type = 2 AND event_date >= yesterday() ORDER BY event_time_microseconds; +-- Size of ColumnAggregateFunction: Number of pointers * pointer size + arena size +-- 1 * 8 + AggregateFunction(argMax, String, DateTime) +-- +-- Size of AggregateFunction(argMax, String, DateTime): +-- SingleValueDataString() + SingleValueDataFixed(DateTime) +-- SingleValueDataString = 64B for small strings, 64B + string size + 1 for larger +-- SingleValueDataFixed(DateTime) = 1 + 4. With padding = 8 +-- SingleValueDataString Total: 72B +-- +-- ColumnAggregateFunction total: 8 + 72 = 80 SELECT 'AggregateFunction(argMax, String, DateTime)', read_rows, read_bytes From 3523c0fb0effc186fbd71aa6bf61af813a1e0971 Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Thu, 13 Apr 2023 09:55:51 -0300 Subject: [PATCH 194/535] fix escap sequences unit tests, values are not allowed to start with escape sequences anymore --- .../tests/gtest_escaping_key_value_pair_extractor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp index a6a99e1c074..3dd914eb5a0 100644 --- a/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp +++ b/src/Functions/keyvaluepair/tests/gtest_escaping_key_value_pair_extractor.cpp @@ -24,7 +24,7 @@ TEST(extractKVPairEscapingKeyValuePairExtractor, EscapeSequences) auto keys = ColumnString::create(); auto values = ColumnString::create(); - auto pairs_count = extractor->extract(R"(key1:\xFF key2:\n\t\r)"sv, keys, values); + auto pairs_count = extractor->extract(R"(key1:a\xFF key2:a\n\t\r)"sv, keys, values); ASSERT_EQ(pairs_count, 2u); ASSERT_EQ(keys->size(), pairs_count); @@ -33,8 +33,8 @@ TEST(extractKVPairEscapingKeyValuePairExtractor, EscapeSequences) ASSERT_EQ(keys->getDataAt(0).toView(), "key1"); ASSERT_EQ(keys->getDataAt(1).toView(), "key2"); - assert_byte_equality(values->getDataAt(0), {0xFF}); - assert_byte_equality(values->getDataAt(1), {0xA, 0x9, 0xD}); + assert_byte_equality(values->getDataAt(0), {'a', 0xFF}); + assert_byte_equality(values->getDataAt(1), {'a', 0xA, 0x9, 0xD}); } } From d17abc9e89990dc36594a178d4cff6fbff2bf414 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Thu, 13 Apr 2023 13:14:18 +0000 Subject: [PATCH 195/535] recanonize 00910_client_window_size_detection and try to enable in fast test --- .../0_stateless/00910_client_window_size_detection.reference | 2 +- tests/queries/0_stateless/00910_client_window_size_detection.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/00910_client_window_size_detection.reference b/tests/queries/0_stateless/00910_client_window_size_detection.reference index f96ac067218..e64f24d5508 100644 --- a/tests/queries/0_stateless/00910_client_window_size_detection.reference +++ b/tests/queries/0_stateless/00910_client_window_size_detection.reference @@ -1 +1 @@ -105 +336 diff --git a/tests/queries/0_stateless/00910_client_window_size_detection.sh b/tests/queries/0_stateless/00910_client_window_size_detection.sh index 7bb70bb378b..47d913de152 100755 --- a/tests/queries/0_stateless/00910_client_window_size_detection.sh +++ b/tests/queries/0_stateless/00910_client_window_size_detection.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash -# Tags: no-fasttest CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh From bb60f10035f0ce7538b98bab02c219dff474fdae Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Thu, 13 Apr 2023 13:17:19 +0000 Subject: [PATCH 196/535] Fix 02231_buffer_aggregate_states_leak.sql --- .../queries/0_stateless/02231_buffer_aggregate_states_leak.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql b/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql index a53b7f50e51..d19ae780e8c 100644 --- a/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql +++ b/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql @@ -28,7 +28,7 @@ create materialized view mv_02231 to buffer_02231 as select from in_02231 group by key; -insert into in_02231 select * from numbers(10e6) settings max_memory_usage='300Mi'; +insert into in_02231 select * from numbers(10e6) settings max_memory_usage='300Mi', max_threads=1; drop table buffer_02231; drop table out_02231; From 3df33d74f520b5604a1f2c0bf03844ffd7682a4c Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Thu, 13 Apr 2023 17:22:12 +0200 Subject: [PATCH 197/535] Get rid of another docker image --- docker/test/stateless-analyzer/Dockerfile | 7 - docker/test/stateless-analyzer/run.sh | 230 ------------------ docker/test/stateless/run.sh | 6 +- .../broken_tests.txt | 0 tests/ci/functional_test_check.py | 1 + 5 files changed, 6 insertions(+), 238 deletions(-) delete mode 100644 docker/test/stateless-analyzer/Dockerfile delete mode 100755 docker/test/stateless-analyzer/run.sh rename {docker/test/stateless-analyzer => tests}/broken_tests.txt (100%) diff --git a/docker/test/stateless-analyzer/Dockerfile b/docker/test/stateless-analyzer/Dockerfile deleted file mode 100644 index 9cbcc69c795..00000000000 --- a/docker/test/stateless-analyzer/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -ARG FROM_TAG=latest -FROM clickhouse/stateless-test:$FROM_TAG - -COPY run.sh / -COPY broken_tests.txt / - -CMD ["/bin/bash", "/run.sh"] diff --git a/docker/test/stateless-analyzer/run.sh b/docker/test/stateless-analyzer/run.sh deleted file mode 100755 index d3bb78400e2..00000000000 --- a/docker/test/stateless-analyzer/run.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/bin/bash - -# fail on errors, verbose and export all env variables -set -e -x -a - -# Choose random timezone for this test run. -TZ="$(rg -v '#' /usr/share/zoneinfo/zone.tab | awk '{print $3}' | shuf | head -n1)" -echo "Choosen random timezone $TZ" -ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone - -dpkg -i package_folder/clickhouse-common-static_*.deb -dpkg -i package_folder/clickhouse-common-static-dbg_*.deb -dpkg -i package_folder/clickhouse-server_*.deb -dpkg -i package_folder/clickhouse-client_*.deb - -ln -s /usr/share/clickhouse-test/clickhouse-test /usr/bin/clickhouse-test - -# install test configs -/usr/share/clickhouse-test/config/install.sh - -if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - echo "Azure is disabled" -else - azurite-blob --blobHost 0.0.0.0 --blobPort 10000 --debug /azurite_log & -fi - -./setup_minio.sh stateless -./setup_hdfs_minicluster.sh - -# For flaky check we also enable thread fuzzer -if [ "$NUM_TRIES" -gt "1" ]; then - export THREAD_FUZZER_CPU_TIME_PERIOD_US=1000 - export THREAD_FUZZER_SLEEP_PROBABILITY=0.1 - export THREAD_FUZZER_SLEEP_TIME_US=100000 - - export THREAD_FUZZER_pthread_mutex_lock_BEFORE_MIGRATE_PROBABILITY=1 - export THREAD_FUZZER_pthread_mutex_lock_AFTER_MIGRATE_PROBABILITY=1 - export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_MIGRATE_PROBABILITY=1 - export THREAD_FUZZER_pthread_mutex_unlock_AFTER_MIGRATE_PROBABILITY=1 - - export THREAD_FUZZER_pthread_mutex_lock_BEFORE_SLEEP_PROBABILITY=0.001 - export THREAD_FUZZER_pthread_mutex_lock_AFTER_SLEEP_PROBABILITY=0.001 - export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_SLEEP_PROBABILITY=0.001 - export THREAD_FUZZER_pthread_mutex_unlock_AFTER_SLEEP_PROBABILITY=0.001 - export THREAD_FUZZER_pthread_mutex_lock_BEFORE_SLEEP_TIME_US=10000 - export THREAD_FUZZER_pthread_mutex_lock_AFTER_SLEEP_TIME_US=10000 - export THREAD_FUZZER_pthread_mutex_unlock_BEFORE_SLEEP_TIME_US=10000 - export THREAD_FUZZER_pthread_mutex_unlock_AFTER_SLEEP_TIME_US=10000 - - mkdir -p /var/run/clickhouse-server - # simpliest way to forward env variables to server - sudo -E -u clickhouse /usr/bin/clickhouse-server --config /etc/clickhouse-server/config.xml --daemon --pid-file /var/run/clickhouse-server/clickhouse-server.pid -else - sudo clickhouse start -fi - -if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - mkdir -p /var/run/clickhouse-server1 - sudo chown clickhouse:clickhouse /var/run/clickhouse-server1 - sudo -E -u clickhouse /usr/bin/clickhouse server --config /etc/clickhouse-server1/config.xml --daemon \ - --pid-file /var/run/clickhouse-server1/clickhouse-server.pid \ - -- --path /var/lib/clickhouse1/ --logger.stderr /var/log/clickhouse-server/stderr1.log \ - --logger.log /var/log/clickhouse-server/clickhouse-server1.log --logger.errorlog /var/log/clickhouse-server/clickhouse-server1.err.log \ - --tcp_port 19000 --tcp_port_secure 19440 --http_port 18123 --https_port 18443 --interserver_http_port 19009 --tcp_with_proxy_port 19010 \ - --mysql_port 19004 --postgresql_port 19005 \ - --keeper_server.tcp_port 19181 --keeper_server.server_id 2 \ - --prometheus.port 19988 \ - --macros.replica r2 # It doesn't work :( - - mkdir -p /var/run/clickhouse-server2 - sudo chown clickhouse:clickhouse /var/run/clickhouse-server2 - sudo -E -u clickhouse /usr/bin/clickhouse server --config /etc/clickhouse-server2/config.xml --daemon \ - --pid-file /var/run/clickhouse-server2/clickhouse-server.pid \ - -- --path /var/lib/clickhouse2/ --logger.stderr /var/log/clickhouse-server/stderr2.log \ - --logger.log /var/log/clickhouse-server/clickhouse-server2.log --logger.errorlog /var/log/clickhouse-server/clickhouse-server2.err.log \ - --tcp_port 29000 --tcp_port_secure 29440 --http_port 28123 --https_port 28443 --interserver_http_port 29009 --tcp_with_proxy_port 29010 \ - --mysql_port 29004 --postgresql_port 29005 \ - --keeper_server.tcp_port 29181 --keeper_server.server_id 3 \ - --prometheus.port 29988 \ - --macros.shard s2 # It doesn't work :( - - MAX_RUN_TIME=$((MAX_RUN_TIME < 9000 ? MAX_RUN_TIME : 9000)) # min(MAX_RUN_TIME, 2.5 hours) - MAX_RUN_TIME=$((MAX_RUN_TIME != 0 ? MAX_RUN_TIME : 9000)) # set to 2.5 hours if 0 (unlimited) -fi - -sleep 5 - -function run_tests() -{ - set -x - # We can have several additional options so we pass them as array because it is more ideologically correct. - read -ra ADDITIONAL_OPTIONS <<< "${ADDITIONAL_OPTIONS:-}" - - HIGH_LEVEL_COVERAGE=YES - - # Use random order in flaky check - if [ "$NUM_TRIES" -gt "1" ]; then - ADDITIONAL_OPTIONS+=('--order=random') - HIGH_LEVEL_COVERAGE=NO - fi - - if [[ -n "$USE_S3_STORAGE_FOR_MERGE_TREE" ]] && [[ "$USE_S3_STORAGE_FOR_MERGE_TREE" -eq 1 ]]; then - ADDITIONAL_OPTIONS+=('--s3-storage') - fi - - if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - ADDITIONAL_OPTIONS+=('--replicated-database') - ADDITIONAL_OPTIONS+=('--jobs') - ADDITIONAL_OPTIONS+=('2') - else - # Too many tests fail for DatabaseReplicated in parallel. All other - # configurations are OK. - ADDITIONAL_OPTIONS+=('--jobs') - ADDITIONAL_OPTIONS+=('8') - fi - - if [[ -n "$RUN_BY_HASH_NUM" ]] && [[ -n "$RUN_BY_HASH_TOTAL" ]]; then - ADDITIONAL_OPTIONS+=('--run-by-hash-num') - ADDITIONAL_OPTIONS+=("$RUN_BY_HASH_NUM") - ADDITIONAL_OPTIONS+=('--run-by-hash-total') - ADDITIONAL_OPTIONS+=("$RUN_BY_HASH_TOTAL") - HIGH_LEVEL_COVERAGE=NO - fi - - if [[ -n "$USE_DATABASE_ORDINARY" ]] && [[ "$USE_DATABASE_ORDINARY" -eq 1 ]]; then - ADDITIONAL_OPTIONS+=('--db-engine=Ordinary') - fi - - if [[ "${HIGH_LEVEL_COVERAGE}" = "YES" ]]; then - ADDITIONAL_OPTIONS+=('--report-coverage') - fi - - ADDITIONAL_OPTIONS+=('--report-logs-stats') - - set +e - clickhouse-test --testname --shard --zookeeper --check-zookeeper-session --hung-check --print-time \ - --test-runs "$NUM_TRIES" "${ADDITIONAL_OPTIONS[@]}" 2>&1 \ - | ts '%Y-%m-%d %H:%M:%S' \ - | tee -a test_output/test_result.txt - set -e -} - -export -f run_tests - -if [ "$NUM_TRIES" -gt "1" ]; then - # We don't run tests with Ordinary database in PRs, only in master. - # So run new/changed tests with Ordinary at least once in flaky check. - timeout "$MAX_RUN_TIME" bash -c 'NUM_TRIES=1; USE_DATABASE_ORDINARY=1; run_tests' \ - | sed 's/All tests have finished//' | sed 's/No tests were run//' ||: -fi - -timeout "$MAX_RUN_TIME" bash -c run_tests ||: - -echo "Files in current directory" -ls -la ./ -echo "Files in root directory" -ls -la / - -/process_functional_tests_result.py --broken_tests=broken_tests.txt || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv - -clickhouse-client -q "system flush logs" ||: - -# Stop server so we can safely read data with clickhouse-local. -# Why do we read data with clickhouse-local? -# Because it's the simplest way to read it when server has crashed. -sudo clickhouse stop ||: -if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - sudo clickhouse stop --pid-path /var/run/clickhouse-server1 ||: - sudo clickhouse stop --pid-path /var/run/clickhouse-server2 ||: -fi - -rg -Fa "" /var/log/clickhouse-server/clickhouse-server.log ||: -rg -A50 -Fa "============" /var/log/clickhouse-server/stderr.log ||: -zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.zst & - -# Compress tables. -# -# NOTE: -# - that due to tests with s3 storage we cannot use /var/lib/clickhouse/data -# directly -# - even though ci auto-compress some files (but not *.tsv) it does this only -# for files >64MB, we want this files to be compressed explicitly -for table in query_log zookeeper_log trace_log transactions_info_log -do - clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.tsv.zst ||: - if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - clickhouse-local --path /var/lib/clickhouse1/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.1.tsv.zst ||: - clickhouse-local --path /var/lib/clickhouse2/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | zstd --threads=0 > /test_output/$table.2.tsv.zst ||: - fi -done - -# Also export trace log in flamegraph-friendly format. -for trace_type in CPU Memory Real -do - clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q " - select - arrayStringConcat((arrayMap(x -> concat(splitByChar('/', addressToLine(x))[-1], '#', demangle(addressToSymbol(x)) ), trace)), ';') AS stack, - count(*) AS samples - from system.trace_log - where trace_type = '$trace_type' - group by trace - order by samples desc - settings allow_introspection_functions = 1 - format TabSeparated" \ - | zstd --threads=0 > "/test_output/trace-log-$trace_type-flamegraph.tsv.zst" ||: -done - - -# Compressed (FIXME: remove once only github actions will be left) -rm /var/log/clickhouse-server/clickhouse-server.log -mv /var/log/clickhouse-server/stderr.log /test_output/ ||: -if [[ -n "$WITH_COVERAGE" ]] && [[ "$WITH_COVERAGE" -eq 1 ]]; then - tar --zstd -chf /test_output/clickhouse_coverage.tar.zst /profraw ||: -fi - -tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||: - -if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - rg -Fa "" /var/log/clickhouse-server/clickhouse-server1.log ||: - rg -Fa "" /var/log/clickhouse-server/clickhouse-server2.log ||: - zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.zst ||: - zstd --threads=0 < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.zst ||: - # FIXME: remove once only github actions will be left - rm /var/log/clickhouse-server/clickhouse-server1.log - rm /var/log/clickhouse-server/clickhouse-server2.log - mv /var/log/clickhouse-server/stderr1.log /test_output/ ||: - mv /var/log/clickhouse-server/stderr2.log /test_output/ ||: - tar -chf /test_output/coordination1.tar /var/lib/clickhouse1/coordination ||: - tar -chf /test_output/coordination2.tar /var/lib/clickhouse2/coordination ||: -fi diff --git a/docker/test/stateless/run.sh b/docker/test/stateless/run.sh index e509809c028..6c8376b7676 100755 --- a/docker/test/stateless/run.sh +++ b/docker/test/stateless/run.sh @@ -156,7 +156,11 @@ ls -la ./ echo "Files in root directory" ls -la / -/process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv +if [[ -n "$USE_NEW_ANALYZER" ]] && [[ "$USE_NEW_ANALYZER" -eq 1 ]]; then + /process_functional_tests_result.py --broken-tests=/broken_tests.txt || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv +else + /process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv +fi clickhouse-client -q "system flush logs" ||: diff --git a/docker/test/stateless-analyzer/broken_tests.txt b/tests/broken_tests.txt similarity index 100% rename from docker/test/stateless-analyzer/broken_tests.txt rename to tests/broken_tests.txt diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index c4ce77c050e..30fd1babfca 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -111,6 +111,7 @@ def get_run_command( return ( f"docker run --volume={builds_path}:/package_folder " f"--volume={repo_tests_path}:/usr/share/clickhouse-test " + f"--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt " f"--volume={result_path}:/test_output --volume={server_log_path}:/var/log/clickhouse-server " f"--cap-add=SYS_PTRACE {env_str} {additional_options_str} {image}" ) From a9fcff72f35922fe2dbaa394d36b37352b4a93a1 Mon Sep 17 00:00:00 2001 From: pufit Date: Thu, 13 Apr 2023 12:57:21 -0400 Subject: [PATCH 198/535] Update docs --- docs/en/sql-reference/statements/grant.md | 2 +- docs/ru/sql-reference/statements/grant.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/sql-reference/statements/grant.md b/docs/en/sql-reference/statements/grant.md index 9bfc659a179..e7b239e40a9 100644 --- a/docs/en/sql-reference/statements/grant.md +++ b/docs/en/sql-reference/statements/grant.md @@ -38,7 +38,7 @@ The `WITH REPLACE OPTION` clause replace old roles by new role for the `user` or ## Grant Current Grants Syntax ``` sql -GRANT CURRENT GRANTS[(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*})] TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +GRANT CURRENT GRANTS{(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*}) | ON {db.table|db.*|*.*|table|*}} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Type of privilege. diff --git a/docs/ru/sql-reference/statements/grant.md b/docs/ru/sql-reference/statements/grant.md index 8c291b9f878..9b8fafabfcc 100644 --- a/docs/ru/sql-reference/statements/grant.md +++ b/docs/ru/sql-reference/statements/grant.md @@ -40,7 +40,7 @@ GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_US ## Синтаксис присвоения текущих привилегий {#grant-current-grants-syntax} ```sql -GRANT CURRENT GRANTS[(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*})] TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +GRANT CURRENT GRANTS{(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*}) | ON {db.table|db.*|*.*|table|*}} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` - `privilege` — Тип привилегии From ad48e1d010a8fff793762b92dc5836bfe5912f7b Mon Sep 17 00:00:00 2001 From: kssenii Date: Thu, 13 Apr 2023 19:33:58 +0200 Subject: [PATCH 199/535] Fox --- src/Databases/DatabaseFactory.cpp | 2 +- src/Dictionaries/MySQLDictionarySource.cpp | 92 +++++++++++++------ src/Storages/MySQL/MySQLHelpers.cpp | 14 ++- src/Storages/MySQL/MySQLHelpers.h | 9 +- src/Storages/StorageMySQL.cpp | 12 ++- src/Storages/StorageMySQL.h | 7 +- .../test_dictionaries_mysql/test.py | 13 +++ 7 files changed, 112 insertions(+), 37 deletions(-) diff --git a/src/Databases/DatabaseFactory.cpp b/src/Databases/DatabaseFactory.cpp index 89a799349bf..199bae4fbb4 100644 --- a/src/Databases/DatabaseFactory.cpp +++ b/src/Databases/DatabaseFactory.cpp @@ -188,7 +188,7 @@ DatabasePtr DatabaseFactory::getImpl(const ASTCreateQuery & create, const String if (auto named_collection = tryGetNamedCollectionWithOverrides(arguments, context)) { - configuration = StorageMySQL::processNamedCollectionResult(*named_collection, *mysql_settings, false); + configuration = StorageMySQL::processNamedCollectionResult(*named_collection, *mysql_settings, context, false); } else { diff --git a/src/Dictionaries/MySQLDictionarySource.cpp b/src/Dictionaries/MySQLDictionarySource.cpp index 82a2762e61e..730217f96b7 100644 --- a/src/Dictionaries/MySQLDictionarySource.cpp +++ b/src/Dictionaries/MySQLDictionarySource.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "readInvalidateQuery.h" @@ -37,7 +38,7 @@ namespace ErrorCodes extern const int UNSUPPORTED_METHOD; } -static const std::unordered_set dictionary_allowed_keys = { +static const ValidateKeysMultiset dictionary_allowed_keys = { "host", "port", "user", "password", "db", "database", "table", "schema", "update_field", "invalidate_query", "priority", @@ -69,13 +70,42 @@ void registerDictionarySourceMysql(DictionarySourceFactory & factory) std::shared_ptr pool; MySQLSettings mysql_settings; - StorageMySQL::Configuration configuration; + std::optional dictionary_configuration; auto named_collection = created_from_ddl ? tryGetNamedCollectionWithOverrides(config, settings_config_prefix) : nullptr; if (named_collection) { - named_collection->remove("name"); - configuration = StorageMySQL::processNamedCollectionResult(*named_collection, mysql_settings); - global_context->getRemoteHostFilter().checkHostAndPort(configuration.host, toString(configuration.port)); + auto allowed_arguments{dictionary_allowed_keys}; + for (const auto & setting : mysql_settings.all()) + allowed_arguments.insert(setting.getName()); + validateNamedCollection>(*named_collection, {}, allowed_arguments); + + StorageMySQL::Configuration::Addresses addresses; + const auto addresses_expr = named_collection->getOrDefault("addresses_expr", ""); + if (addresses_expr.empty()) + { + const auto host = named_collection->getAnyOrDefault({"host", "hostname"}, ""); + const auto port = static_cast(named_collection->get("port")); + addresses = {std::make_pair(host, port)}; + } + else + { + size_t max_addresses = global_context->getSettingsRef().glob_expansion_max_elements; + addresses = parseRemoteDescriptionForExternalDatabase(addresses_expr, max_addresses, 3306); + } + + for (auto & address : addresses) + global_context->getRemoteHostFilter().checkHostAndPort(address.first, toString(address.second)); + + dictionary_configuration.emplace(MySQLDictionarySource::Configuration{ + .db = named_collection->getAnyOrDefault({"database", "db"}, ""), + .table = named_collection->getOrDefault("table", ""), + .query = named_collection->getOrDefault("query", ""), + .where = named_collection->getOrDefault("where", ""), + .invalidate_query = named_collection->getOrDefault("invalidate_query", ""), + .update_field = named_collection->getOrDefault("update_field", ""), + .update_lag = named_collection->getOrDefault("update_lag", 1), + .dont_check_update_time = named_collection->getOrDefault("dont_check_update_time", false), + }); const auto & settings = global_context->getSettingsRef(); if (!mysql_settings.isChanged("connect_timeout")) @@ -83,38 +113,42 @@ void registerDictionarySourceMysql(DictionarySourceFactory & factory) if (!mysql_settings.isChanged("read_write_timeout")) mysql_settings.read_write_timeout = settings.external_storage_rw_timeout_sec; - pool = std::make_shared(createMySQLPoolWithFailover(configuration, mysql_settings)); + for (const auto & setting : mysql_settings.all()) + { + const auto & setting_name = setting.getName(); + if (named_collection->has(setting_name)) + mysql_settings.set(setting_name, named_collection->get(setting_name)); + } + + pool = std::make_shared( + createMySQLPoolWithFailover( + dictionary_configuration->db, + addresses, + named_collection->getAnyOrDefault({"user", "username"}, ""), + named_collection->getOrDefault("password", ""), + mysql_settings)); } else { - if (created_from_ddl) - { - for (auto & address : configuration.addresses) - global_context->getRemoteHostFilter().checkHostAndPort(address.first, toString(address.second)); - } + dictionary_configuration.emplace(MySQLDictionarySource::Configuration{ + .db = config.getString(settings_config_prefix + ".db", ""), + .table = config.getString(settings_config_prefix + ".table", ""), + .query = config.getString(settings_config_prefix + ".query", ""), + .where = config.getString(settings_config_prefix + ".where", ""), + .invalidate_query = config.getString(settings_config_prefix + ".invalidate_query", ""), + .update_field = config.getString(settings_config_prefix + ".update_field", ""), + .update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1), + .dont_check_update_time = config.getBool(settings_config_prefix + ".dont_check_update_time", false) + }); - configuration.database = config.getString(settings_config_prefix + ".db", ""); - configuration.table = config.getString(settings_config_prefix + ".table", ""); - pool = std::make_shared(mysqlxx::PoolFactory::instance().get(config, settings_config_prefix)); + pool = std::make_shared( + mysqlxx::PoolFactory::instance().get(config, settings_config_prefix)); } - auto query = config.getString(settings_config_prefix + ".query", ""); - if (query.empty() && configuration.table.empty()) + if (dictionary_configuration->query.empty() && dictionary_configuration->table.empty()) throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "MySQL dictionary source configuration must contain table or query field"); - MySQLDictionarySource::Configuration dictionary_configuration - { - .db = configuration.database, - .table = configuration.table, - .query = query, - .where = config.getString(settings_config_prefix + ".where", ""), - .invalidate_query = config.getString(settings_config_prefix + ".invalidate_query", ""), - .update_field = config.getString(settings_config_prefix + ".update_field", ""), - .update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1), - .dont_check_update_time = config.getBool(settings_config_prefix + ".dont_check_update_time", false) - }; - - return std::make_unique(dict_struct, dictionary_configuration, std::move(pool), sample_block, mysql_input_stream_settings); + return std::make_unique(dict_struct, *dictionary_configuration, std::move(pool), sample_block, mysql_input_stream_settings); #else throw Exception(ErrorCodes::SUPPORT_IS_DISABLED, "Dictionary source of type `mysql` is disabled because ClickHouse was built without mysql support."); diff --git a/src/Storages/MySQL/MySQLHelpers.cpp b/src/Storages/MySQL/MySQLHelpers.cpp index 63a3436ea4a..e9ad18ee3ac 100644 --- a/src/Storages/MySQL/MySQLHelpers.cpp +++ b/src/Storages/MySQL/MySQLHelpers.cpp @@ -13,12 +13,24 @@ namespace ErrorCodes } mysqlxx::PoolWithFailover createMySQLPoolWithFailover(const StorageMySQL::Configuration & configuration, const MySQLSettings & mysql_settings) +{ + return createMySQLPoolWithFailover( + configuration.database, configuration.addresses, + configuration.username, configuration.password, mysql_settings); +} + +mysqlxx::PoolWithFailover createMySQLPoolWithFailover( + const std::string & database, + const StorageMySQL::Configuration::Addresses & addresses, + const std::string & username, + const std::string & password, + const MySQLSettings & mysql_settings) { if (!mysql_settings.connection_pool_size) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Connection pool cannot have zero size"); return mysqlxx::PoolWithFailover( - configuration.database, configuration.addresses, configuration.username, configuration.password, + database, addresses, username, password, MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS, static_cast(mysql_settings.connection_pool_size), mysql_settings.connection_max_tries, diff --git a/src/Storages/MySQL/MySQLHelpers.h b/src/Storages/MySQL/MySQLHelpers.h index 71c331da16f..ebe00bd4cd1 100644 --- a/src/Storages/MySQL/MySQLHelpers.h +++ b/src/Storages/MySQL/MySQLHelpers.h @@ -10,8 +10,15 @@ namespace mysqlxx { class PoolWithFailover; } namespace DB { -mysqlxx::PoolWithFailover createMySQLPoolWithFailover(const StorageMySQL::Configuration & configuration, const MySQLSettings & mysql_settings); +mysqlxx::PoolWithFailover createMySQLPoolWithFailover( + const StorageMySQL::Configuration & configuration, const MySQLSettings & mysql_settings); +mysqlxx::PoolWithFailover createMySQLPoolWithFailover( + const std::string & database, + const StorageMySQL::Configuration::Addresses & addresses, + const std::string & username, + const std::string & password, + const MySQLSettings & mysql_settings); } #endif diff --git a/src/Storages/StorageMySQL.cpp b/src/Storages/StorageMySQL.cpp index c389f7d9f7f..232ff87d9ed 100644 --- a/src/Storages/StorageMySQL.cpp +++ b/src/Storages/StorageMySQL.cpp @@ -238,7 +238,7 @@ SinkToStoragePtr StorageMySQL::write(const ASTPtr & /*query*/, const StorageMeta } StorageMySQL::Configuration StorageMySQL::processNamedCollectionResult( - const NamedCollection & named_collection, MySQLSettings & storage_settings, bool require_table) + const NamedCollection & named_collection, MySQLSettings & storage_settings, ContextPtr context_, bool require_table) { StorageMySQL::Configuration configuration; @@ -255,10 +255,16 @@ StorageMySQL::Configuration StorageMySQL::processNamedCollectionResult( configuration.addresses_expr = named_collection.getOrDefault("addresses_expr", ""); if (configuration.addresses_expr.empty()) { - configuration.host = named_collection.getOrDefault("host", named_collection.getOrDefault("hostname", "")); + configuration.host = named_collection.getAnyOrDefault({"host", "hostname"}, ""); configuration.port = static_cast(named_collection.get("port")); configuration.addresses = {std::make_pair(configuration.host, configuration.port)}; } + else + { + size_t max_addresses = context_->getSettingsRef().glob_expansion_max_elements; + configuration.addresses = parseRemoteDescriptionForExternalDatabase( + configuration.addresses_expr, max_addresses, 3306); + } configuration.username = named_collection.getAny({"username", "user"}); configuration.password = named_collection.get("password"); @@ -283,7 +289,7 @@ StorageMySQL::Configuration StorageMySQL::getConfiguration(ASTs engine_args, Con StorageMySQL::Configuration configuration; if (auto named_collection = tryGetNamedCollectionWithOverrides(engine_args, context_)) { - configuration = StorageMySQL::processNamedCollectionResult(*named_collection, storage_settings); + configuration = StorageMySQL::processNamedCollectionResult(*named_collection, storage_settings, context_); } else { diff --git a/src/Storages/StorageMySQL.h b/src/Storages/StorageMySQL.h index 1c0e2639717..ae3d2f935b6 100644 --- a/src/Storages/StorageMySQL.h +++ b/src/Storages/StorageMySQL.h @@ -53,6 +53,8 @@ public: struct Configuration { + using Addresses = std::vector>; + String host; UInt16 port = 0; String username = "default"; @@ -63,14 +65,15 @@ public: bool replace_query = false; String on_duplicate_clause; - std::vector> addresses; /// Failover replicas. + Addresses addresses; /// Failover replicas. String addresses_expr; }; static Configuration getConfiguration(ASTs engine_args, ContextPtr context_, MySQLSettings & storage_settings); static Configuration processNamedCollectionResult( - const NamedCollection & named_collection, MySQLSettings & storage_settings, bool require_table = true); + const NamedCollection & named_collection, MySQLSettings & storage_settings, + ContextPtr context_, bool require_table = true); private: friend class StorageMySQLSink; diff --git a/tests/integration/test_dictionaries_mysql/test.py b/tests/integration/test_dictionaries_mysql/test.py index 5c67a4c434a..a12139a0bea 100644 --- a/tests/integration/test_dictionaries_mysql/test.py +++ b/tests/integration/test_dictionaries_mysql/test.py @@ -309,6 +309,19 @@ def test_predefined_connection_configuration(started_cluster): result = instance.query("SELECT dictGetUInt32(dict, 'value', toUInt64(100))") assert int(result) == 200 + instance.query( + """ + DROP DICTIONARY IF EXISTS dict; + CREATE DICTIONARY dict (id UInt32, value UInt32) + PRIMARY KEY id + SOURCE(MYSQL(NAME mysql4 connection_pool_size 1 close_connection 1 share_connection 1)) + LIFETIME(MIN 1 MAX 2) + LAYOUT(HASHED()); + """ + ) + result = instance.query("SELECT dictGetUInt32(dict, 'value', toUInt64(100))") + assert int(result) == 200 + def create_mysql_db(mysql_connection, name): with mysql_connection.cursor() as cursor: From fcd2eaea727eb7bb04297d282e5a8357ea6d65c9 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Thu, 13 Apr 2023 20:23:59 +0000 Subject: [PATCH 200/535] Disable 'Dictionary' storage due to count() can return incorrect result see test_dictionaries_redis/test_long.py::test_redis_dict_long --- src/Storages/IStorage.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index a6324fe7354..b432187d380 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -138,7 +138,9 @@ void IStorage::read( const size_t output_ports = pipe.numOutputPorts(); const auto storage_name = getName(); if (output_ports > 0 && output_ports < num_streams && storage_name != "SystemNumbers" && storage_name != "SourceFromSingleChunk" - && storage_name != "SystemOne") + && storage_name != "SystemOne" + && storage_name != "Dictionary") /// dictionaries are disabled due to some bug, count() can return wrong result + /// see test_dictionaries_redis/test_long.py::test_redis_dict_long pipe.resize(num_streams); readFromPipe(query_plan, std::move(pipe), column_names, storage_snapshot, query_info, context, getName()); From eacbd2bf1e02d87552d0ec7aca48ba4aea06777f Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Thu, 13 Apr 2023 20:26:23 +0000 Subject: [PATCH 201/535] Fix test_storage_mysql/test_settings_connection_wait_timeout --- tests/integration/test_storage_mysql/test.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/integration/test_storage_mysql/test.py b/tests/integration/test_storage_mysql/test.py index 0c9369a8efa..c5df8719f0a 100644 --- a/tests/integration/test_storage_mysql/test.py +++ b/tests/integration/test_storage_mysql/test.py @@ -519,21 +519,23 @@ def test_settings_connection_wait_timeout(started_cluster): ) ) + worker_started_event = threading.Event() def worker(): - node1.query("SELECT sleepEachRow(1) FROM {}".format(table_name)) + worker_started_event.set() + node1.query("SELECT sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name)) worker_thread = threading.Thread(target=worker) worker_thread.start() # ensure that first query started in worker_thread - time.sleep(1) + worker_started_event.wait(10) started = time.time() with pytest.raises( QueryRuntimeException, match=r"Exception: mysqlxx::Pool is full \(connection_wait_timeout is exceeded\)", ): - node1.query("SELECT sleepEachRow(1) FROM {}".format(table_name)) + node1.query("SELECT sleepEachRow(1) FROM {} settings max_threads=1".format(table_name)) ended = time.time() assert (ended - started) >= wait_timeout From e95044f7137f95ba1daafadb81ba43bb320a411d Mon Sep 17 00:00:00 2001 From: Suzy Wang Date: Thu, 13 Apr 2023 13:51:57 -0700 Subject: [PATCH 202/535] insert UInt32 Hashvalue in reverse order on big endian machine --- src/AggregateFunctions/UniquesHashSet.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/AggregateFunctions/UniquesHashSet.h b/src/AggregateFunctions/UniquesHashSet.h index 075b0897c3a..2abf6ed00d6 100644 --- a/src/AggregateFunctions/UniquesHashSet.h +++ b/src/AggregateFunctions/UniquesHashSet.h @@ -331,7 +331,11 @@ public: void ALWAYS_INLINE insert(Value x) { - HashValue hash_value = hash(x); + HashValue hash_value; + if constexpr (std::endian::native == std::endian::little) + hash_value = hash(x); + else + hash_value = __builtin_bswap32(hash(x)); if (!good(hash_value)) return; From 39df2bde858188ea9ab972bac472924ba78dbb09 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 13 Apr 2023 20:52:16 +0000 Subject: [PATCH 203/535] Automatic style fix --- tests/integration/test_storage_mysql/test.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_storage_mysql/test.py b/tests/integration/test_storage_mysql/test.py index c5df8719f0a..263771bcfa0 100644 --- a/tests/integration/test_storage_mysql/test.py +++ b/tests/integration/test_storage_mysql/test.py @@ -520,9 +520,12 @@ def test_settings_connection_wait_timeout(started_cluster): ) worker_started_event = threading.Event() + def worker(): worker_started_event.set() - node1.query("SELECT sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name)) + node1.query( + "SELECT sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) + ) worker_thread = threading.Thread(target=worker) worker_thread.start() @@ -535,7 +538,9 @@ def test_settings_connection_wait_timeout(started_cluster): QueryRuntimeException, match=r"Exception: mysqlxx::Pool is full \(connection_wait_timeout is exceeded\)", ): - node1.query("SELECT sleepEachRow(1) FROM {} settings max_threads=1".format(table_name)) + node1.query( + "SELECT sleepEachRow(1) FROM {} settings max_threads=1".format(table_name) + ) ended = time.time() assert (ended - started) >= wait_timeout From a01efbde27ba5b71f89d94258fe3636a6b188457 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Thu, 13 Apr 2023 20:53:24 +0000 Subject: [PATCH 204/535] Fix flaky check --- tests/queries/0_stateless/00109_shard_totals_after_having.sql | 4 ++-- .../0_stateless/02231_buffer_aggregate_states_leak.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/queries/0_stateless/00109_shard_totals_after_having.sql b/tests/queries/0_stateless/00109_shard_totals_after_having.sql index 958cd9928d9..c0f2a22c47d 100644 --- a/tests/queries/0_stateless/00109_shard_totals_after_having.sql +++ b/tests/queries/0_stateless/00109_shard_totals_after_having.sql @@ -10,10 +10,10 @@ CREATE TABLE numbers500k (number UInt32) ENGINE = TinyLog; INSERT INTO numbers500k SELECT number FROM system.numbers LIMIT 500000; SET totals_mode = 'after_having_auto'; -SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; +SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; SET totals_mode = 'after_having_inclusive'; -SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; +SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; SET totals_mode = 'after_having_exclusive'; SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; diff --git a/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql b/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql index d19ae780e8c..dbe18953957 100644 --- a/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql +++ b/tests/queries/0_stateless/02231_buffer_aggregate_states_leak.sql @@ -28,7 +28,7 @@ create materialized view mv_02231 to buffer_02231 as select from in_02231 group by key; -insert into in_02231 select * from numbers(10e6) settings max_memory_usage='300Mi', max_threads=1; +insert into in_02231 select * from numbers(10e6) settings max_memory_usage='310Mi', max_threads=1; drop table buffer_02231; drop table out_02231; From 206781cc4ea7fd11737c9b5107e685fa9a915126 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Fri, 14 Apr 2023 08:26:58 +0000 Subject: [PATCH 205/535] Fix abort on small terminal window --- programs/git-import/git-import.cpp | 2 +- .../static-files-disk-uploader/static-files-disk-uploader.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/git-import/git-import.cpp b/programs/git-import/git-import.cpp index 142028fdfb2..4b7469ff19d 100644 --- a/programs/git-import/git-import.cpp +++ b/programs/git-import/git-import.cpp @@ -1189,7 +1189,7 @@ try { using namespace DB; - po::options_description desc("Allowed options", getTerminalWidth()); + po::options_description desc = createOptionsDescription("Allowed options", getTerminalWidth()); desc.add_options() ("help,h", "produce help message") ("skip-commits-without-parents", po::value()->default_value(true), diff --git a/programs/static-files-disk-uploader/static-files-disk-uploader.cpp b/programs/static-files-disk-uploader/static-files-disk-uploader.cpp index 32f87d4d64a..f0c9d7d5380 100644 --- a/programs/static-files-disk-uploader/static-files-disk-uploader.cpp +++ b/programs/static-files-disk-uploader/static-files-disk-uploader.cpp @@ -145,7 +145,7 @@ try using namespace DB; namespace po = boost::program_options; - po::options_description description("Allowed options", getTerminalWidth()); + po::options_description description = createOptionsDescription("Allowed options", getTerminalWidth()); description.add_options() ("help,h", "produce help message") ("metadata-path", po::value(), "Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = 'database_name')") From 2c20850cde6e5ce62f55da8845df560a4657d019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Fri, 14 Apr 2023 10:35:33 +0200 Subject: [PATCH 206/535] Style --- src/IO/ReadHelpersArena.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/IO/ReadHelpersArena.h b/src/IO/ReadHelpersArena.h index 3ff65817e33..b88d5c037d4 100644 --- a/src/IO/ReadHelpersArena.h +++ b/src/IO/ReadHelpersArena.h @@ -1,3 +1,5 @@ +#pragma once + #include #include #include From 780e4f9831f394b2dc110dad1c43645cbb945592 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Fri, 14 Apr 2023 11:18:32 +0000 Subject: [PATCH 207/535] Fix flaky check: 00109_shard_totals_after_having.sql --- tests/queries/0_stateless/00109_shard_totals_after_having.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/00109_shard_totals_after_having.sql b/tests/queries/0_stateless/00109_shard_totals_after_having.sql index c0f2a22c47d..52506e9f69e 100644 --- a/tests/queries/0_stateless/00109_shard_totals_after_having.sql +++ b/tests/queries/0_stateless/00109_shard_totals_after_having.sql @@ -19,6 +19,6 @@ SET totals_mode = 'after_having_exclusive'; SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; SET totals_mode = 'before_having'; -SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; +SELECT intDiv(number, 2) AS k, count(), argMax(toString(number), number) FROM (SELECT * FROM remote('127.0.0.{2,3}', currentDatabase(), numbers500k) ORDER BY number) GROUP BY k WITH TOTALS ORDER BY k LIMIT 10; DROP TABLE numbers500k; From 7c84dc48c6919fe552c2f433bd4aa72807a934db Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Fri, 14 Apr 2023 12:00:02 +0000 Subject: [PATCH 208/535] Better way to define for which storage output is parallelized --- src/Storages/IStorage.cpp | 5 +---- src/Storages/IStorage.h | 2 ++ src/Storages/StorageDictionary.h | 4 ++++ src/Storages/StorageMySQL.h | 4 ++++ src/Storages/System/StorageSystemNumbers.h | 6 ++++++ src/Storages/System/StorageSystemOne.h | 2 ++ 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Storages/IStorage.cpp b/src/Storages/IStorage.cpp index b432187d380..87dcee9d9a6 100644 --- a/src/Storages/IStorage.cpp +++ b/src/Storages/IStorage.cpp @@ -137,10 +137,7 @@ void IStorage::read( /// parallelize processing if not yet const size_t output_ports = pipe.numOutputPorts(); const auto storage_name = getName(); - if (output_ports > 0 && output_ports < num_streams && storage_name != "SystemNumbers" && storage_name != "SourceFromSingleChunk" - && storage_name != "SystemOne" - && storage_name != "Dictionary") /// dictionaries are disabled due to some bug, count() can return wrong result - /// see test_dictionaries_redis/test_long.py::test_redis_dict_long + if (parallelizeOutputAfterReading() && output_ports > 0 && output_ports < num_streams) pipe.resize(num_streams); readFromPipe(query_plan, std::move(pipe), column_names, storage_snapshot, query_info, context, getName()); diff --git a/src/Storages/IStorage.h b/src/Storages/IStorage.h index 351e147e6cd..47382d1b9bb 100644 --- a/src/Storages/IStorage.h +++ b/src/Storages/IStorage.h @@ -368,6 +368,8 @@ private: size_t /*max_block_size*/, size_t /*num_streams*/); + virtual bool parallelizeOutputAfterReading() const { return true; } + public: /// Other version of read which adds reading step to query plan. /// Default implementation creates ReadFromStorageStep and uses usual read. diff --git a/src/Storages/StorageDictionary.h b/src/Storages/StorageDictionary.h index 2cbcc58fa65..02efa609337 100644 --- a/src/Storages/StorageDictionary.h +++ b/src/Storages/StorageDictionary.h @@ -74,6 +74,10 @@ public: size_t max_block_size, size_t threads) override; + /// FIXME: processing after reading from dictionaries are not parallelized due to some bug: + /// count() can return wrong result, see test_dictionaries_redis/test_long.py::test_redis_dict_long + bool parallelizeOutputAfterReading() const override { return false; } + std::shared_ptr getDictionary() const; static NamesAndTypesList getNamesAndTypes(const DictionaryStructure & dictionary_structure); diff --git a/src/Storages/StorageMySQL.h b/src/Storages/StorageMySQL.h index 1c0e2639717..b7773066bf0 100644 --- a/src/Storages/StorageMySQL.h +++ b/src/Storages/StorageMySQL.h @@ -49,6 +49,10 @@ public: size_t max_block_size, size_t num_streams) override; + /// FIXME: enable parallelization later, currently it makes mysql intergation test flaky, + /// see test_storage_mysql/test.py::test_settings_connection_wait_timeout + bool parallelizeOutputAfterReading() const override { return false; } + SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; struct Configuration diff --git a/src/Storages/System/StorageSystemNumbers.h b/src/Storages/System/StorageSystemNumbers.h index acddac681ef..2af699c25cf 100644 --- a/src/Storages/System/StorageSystemNumbers.h +++ b/src/Storages/System/StorageSystemNumbers.h @@ -40,6 +40,12 @@ public: size_t max_block_size, size_t num_streams) override; + /// TODO: introduce a setting to enable parallelization for numbers()? + /// a bit controversial since from one side there is number_mt(), + /// from other side, in general, there is no guarantee regarding order until ORDER BY is provided + /// enabling parallelization here will break some tests, so better do it in a separate PR + bool parallelizeOutputAfterReading() const override { return false; } + bool hasEvenlyDistributedRead() const override { return true; } bool isSystemStorage() const override { return true; } bool supportsTransactions() const override { return true; } diff --git a/src/Storages/System/StorageSystemOne.h b/src/Storages/System/StorageSystemOne.h index d8a26f1def4..eaf44b635cc 100644 --- a/src/Storages/System/StorageSystemOne.h +++ b/src/Storages/System/StorageSystemOne.h @@ -30,6 +30,8 @@ public: size_t max_block_size, size_t num_streams) override; + bool parallelizeOutputAfterReading() const override { return false; } + bool isSystemStorage() const override { return true; } bool supportsTransactions() const override { return true; } From d2351df69e02646a5e70e209b903c8d7fa93bad7 Mon Sep 17 00:00:00 2001 From: Ilya Yatsishin <2159081+qoega@users.noreply.github.com> Date: Fri, 14 Apr 2023 15:13:10 +0200 Subject: [PATCH 209/535] Update tests/ci/functional_test_check.py --- tests/ci/functional_test_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index 30fd1babfca..4d3e3604397 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -65,7 +65,7 @@ def get_additional_envs(check_name, run_by_hash_num, run_by_hash_total): def get_image_name(check_name): if "analyzer" in check_name.lower(): - return "clickhouse/stateless-analyzer" + return "clickhouse/stateless-test" if "stateless" in check_name.lower(): return "clickhouse/stateless-test" if "stateful" in check_name.lower(): From b04a4ec28769dd8991a17b1964bfe03025a17f6c Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Fri, 14 Apr 2023 15:25:06 +0200 Subject: [PATCH 210/535] Fix used image --- tests/ci/functional_test_check.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index 4d3e3604397..3a9951c1cdb 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -64,8 +64,6 @@ def get_additional_envs(check_name, run_by_hash_num, run_by_hash_total): def get_image_name(check_name): - if "analyzer" in check_name.lower(): - return "clickhouse/stateless-test" if "stateless" in check_name.lower(): return "clickhouse/stateless-test" if "stateful" in check_name.lower(): From c08e6d6c5fcd84b96c11ee8b5a14344e85f8ffe2 Mon Sep 17 00:00:00 2001 From: kssenii Date: Fri, 14 Apr 2023 15:52:51 +0200 Subject: [PATCH 211/535] Better processing of relative cache path --- src/Disks/ObjectStorages/Cached/registerDiskCache.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp b/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp index d8c4a9d42fd..a530174316e 100644 --- a/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp +++ b/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp @@ -40,7 +40,10 @@ void registerDiskCache(DiskFactory & factory, bool /* global_skip_access_check * FileCacheSettings file_cache_settings; file_cache_settings.loadFromConfig(config, config_prefix); - auto cache_base_path = config.getString(config_prefix + ".path", fs::path(context->getPath()) / "disks" / name / "cache/"); + fs::path cache_base_path = config.getString(config_prefix + ".path", fs::path(context->getPath()) / "disks" / name / "cache/"); + if (cache_base_path.is_relative()) + cache_base_path = fs::path(context->getPath()) / "caches" / cache_base_path; + if (!fs::exists(cache_base_path)) fs::create_directories(cache_base_path); From 3c8cd7f775e5c9de385f9c801029655cf2076ace Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 2 Mar 2023 20:04:45 +0100 Subject: [PATCH 212/535] Test with big subquery in mutation with multiple parts --- ..._big_sets_between_mutation_tasks.reference | 5 +++++ ..._share_big_sets_between_mutation_tasks.sql | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference new file mode 100644 index 00000000000..030f548efcd --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference @@ -0,0 +1,5 @@ +40000 +all_1_1_0 +all_2_2_0 +all_3_3_0 +all_4_4_0 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql new file mode 100644 index 00000000000..5c8c38a9939 --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql @@ -0,0 +1,20 @@ +DROP TABLE IF EXISTS 02581_trips; + +CREATE TABLE 02581_trips(id UInt32, description String) ENGINE=MergeTree ORDER BY id; + +-- Make multiple parts +INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+100000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+200000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+300000, '' FROM numbers(10000); +--INSERT INTO 02581_trips SELECT number+400000, '' FROM numbers(10000); +--INSERT INTO 02581_trips SELECT number+500000, '' FROM numbers(10000); + +SELECT count() from 02581_trips; + +SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; + +-- Run mutation with a 'IN big subquery' +ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(100000000)) SETTINGS mutations_sync=2; + +DROP TABLE 02581_trips; From 02876ed87da82af7c337caa5ab49cc1c7d69b633 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 2 Mar 2023 20:19:58 +0100 Subject: [PATCH 213/535] Share PreparedSet-s between task of the same mutation to reduce mem usage --- src/Interpreters/ActionsVisitor.cpp | 10 ++++ src/Interpreters/ActionsVisitor.h | 1 + src/Interpreters/Context.cpp | 11 ++++ src/Interpreters/Context.h | 10 ++++ src/Interpreters/ExpressionAnalyzer.cpp | 44 +++++++++----- src/Interpreters/PreparedSets.cpp | 58 +++++++++++++++++++ src/Interpreters/PreparedSets.h | 28 +++++++++ src/Storages/MergeTree/KeyCondition.cpp | 7 +++ .../MergeTree/MutatePlainMergeTreeTask.cpp | 5 ++ src/Storages/StorageMergeTree.cpp | 16 +++++ src/Storages/StorageMergeTree.h | 10 ++++ 11 files changed, 184 insertions(+), 16 deletions(-) diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 1f4969a7f9a..065d8063729 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -544,6 +544,7 @@ ActionsMatcher::Data::Data( , subquery_depth(subquery_depth_) , source_columns(source_columns_) , prepared_sets(prepared_sets_) + , prepared_sets_cache(context_->getPreparedSetsCache()) , no_subqueries(no_subqueries_) , no_makeset(no_makeset_) , only_consts(only_consts_) @@ -1393,6 +1394,15 @@ SetPtr ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_su if (SetPtr set = data.prepared_sets->get(set_key)) return set; + if (data.prepared_sets_cache) + { + if (auto set = data.prepared_sets_cache->findOrBuild(set_key, nullptr)) + { + data.prepared_sets->set(set_key, set); + return set; + } + } + /// A special case is if the name of the table is specified on the right side of the IN statement, /// and the table has the type Set (a previously prepared set). if (identifier) diff --git a/src/Interpreters/ActionsVisitor.h b/src/Interpreters/ActionsVisitor.h index 0269371b46e..1fce8dfc183 100644 --- a/src/Interpreters/ActionsVisitor.h +++ b/src/Interpreters/ActionsVisitor.h @@ -126,6 +126,7 @@ public: size_t subquery_depth; const NamesAndTypesList & source_columns; PreparedSetsPtr prepared_sets; + PreparedSetsCachePtr prepared_sets_cache; bool no_subqueries; bool no_makeset; bool only_consts; diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 400eb570131..a2270b976c2 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -4346,6 +4347,16 @@ bool Context::canUseParallelReplicasOnFollower() const && getClientInfo().collaborate_with_initiator; } +void Context::setPreparedSetsCache(const PreparedSetsCachePtr & cache) +{ + prepared_sets_cache = cache; +} + +PreparedSetsCachePtr Context::getPreparedSetsCache() const +{ + return prepared_sets_cache; +} + UInt64 Context::getClientProtocolVersion() const { return client_protocol_version; diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index 1988b9d82fe..95611e99d51 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -193,6 +193,9 @@ class MergeTreeMetadataCache; using MergeTreeMetadataCachePtr = std::shared_ptr; #endif +class PreparedSetsCache; +using PreparedSetsCachePtr = std::shared_ptr; + /// An empty interface for an arbitrary object that may be attached by a shared pointer /// to query context, when using ClickHouse as a library. struct IHostContext @@ -399,6 +402,10 @@ private: /// Temporary data for query execution accounting. TemporaryDataOnDiskScopePtr temp_data_on_disk; + /// Prepared sets that can be shared between different queries. One use case is when is to share prepared sets between + /// mutation tasks of one mutation executed against different parts of the same table. + PreparedSetsCachePtr prepared_sets_cache; + public: /// Some counters for current query execution. /// Most of them are workarounds and should be removed in the future. @@ -1128,6 +1135,9 @@ public: ParallelReplicasMode getParallelReplicasMode() const; + void setPreparedSetsCache(const PreparedSetsCachePtr & cache); + PreparedSetsCachePtr getPreparedSetsCache() const; + private: std::unique_lock getLock() const; diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index ade393a8c0e..434158314cc 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -459,25 +459,37 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ return; } - auto interpreter_subquery = interpretSubquery(subquery_or_table_name, getContext(), {}, query_options); - auto io = interpreter_subquery->execute(); - PullingAsyncPipelineExecutor executor(io.pipeline); - - SetPtr set = std::make_shared(settings.size_limits_for_set, true, getContext()->getSettingsRef().transform_null_in); - set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); - - Block block; - while (executor.pull(block)) + auto build_set = [&] () -> SetPtr { - if (block.rows() == 0) - continue; + auto interpreter_subquery = interpretSubquery(subquery_or_table_name, getContext(), {}, query_options); + auto io = interpreter_subquery->execute(); + PullingAsyncPipelineExecutor executor(io.pipeline); - /// If the limits have been exceeded, give up and let the default subquery processing actions take place. - if (!set->insertFromBlock(block.getColumnsWithTypeAndName())) - return; - } + SetPtr set = std::make_shared(settings.size_limits_for_set, true, getContext()->getSettingsRef().transform_null_in); + set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); - set->finishInsert(); + Block block; + while (executor.pull(block)) + { + if (block.rows() == 0) + continue; + + /// If the limits have been exceeded, give up and let the default subquery processing actions take place. + if (!set->insertFromBlock(block.getColumnsWithTypeAndName())) + return nullptr; + } + + set->finishInsert(); + + return set; + }; + + auto set_cache = getContext()->getPreparedSetsCache(); + + auto set = set_cache ? set_cache->findOrBuild(set_key, build_set) : build_set(); + + if (!set) + return; prepared_sets->set(set_key, std::move(set)); } diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 79cfb8b688a..6a205ec3261 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -106,4 +106,62 @@ QueryPlanPtr SubqueryForSet::detachSource() return res; } +SetPtr PreparedSetsCache::findOrBuild(const PreparedSetKey & key, const std::function & build_set) +{ + auto* log = &Poco::Logger::get("PreparedSetsCache"); + + EntryPtr entry; + bool need_to_build_set = false; + + /// Look for existing entry in the cache. + { + std::lock_guard lock(cache_mutex); + + auto it = cache.find(key); + if (it != cache.end()) + { + entry = it->second; + } + else + { + if (build_set == nullptr) + return nullptr; + + /// Insert the entry into the cache so that other threads can find it and start waiting for the set. + entry = std::make_shared(); + entry->filled_set = entry->promise.get_future(); + cache[key] = entry; + need_to_build_set = true; + } + } + + if (need_to_build_set) + { + LOG_DEBUG(log, "Building set for key {}:{}", key.ast_hash.first, key.ast_hash.second); + try + { + auto set = build_set(); + entry->promise.set_value(set); + } + catch (...) + { + entry->promise.set_exception(std::current_exception()); + throw; + } + + return entry->filled_set.get(); + } + + if (entry->filled_set.valid() && entry->filled_set.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + LOG_DEBUG(log, "Found set for key {}:{} without wait", key.ast_hash.first, key.ast_hash.second); + } + else + { + LOG_DEBUG(log, "Found set for key {}:{} with wait", key.ast_hash.first, key.ast_hash.second); + } + return entry->filled_set.get(); +} + + }; diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index a50e390ee5a..4699d0c334f 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -97,4 +98,31 @@ private: using PreparedSetsPtr = std::shared_ptr; + +/// This set cache is used to avoid building the same set multiple times. It is different from PreparedSets in way that +/// it can be used across multiple queries. One use case is when we execute the same mutation on multiple parts. In this +/// case each part is processed by a separate mutation task but they can share the same set. +class PreparedSetsCache +{ +public: + /// Returns the set from the cache or builds it using the provided function. + /// If the set is already being built by another task, then this call will wait for the set to be built. + SetPtr findOrBuild(const PreparedSetKey & key, const std::function & build_set); + +private: + struct Entry + { + std::promise promise; /// The promise is set when the set is built by the first task. + std::shared_future filled_set; /// Other tasks can wait for the set to be built. + }; + + using EntryPtr = std::shared_ptr; + + /// Protects just updates to the cache. When we got EntyPtr from the cache we can access it without locking. + std::mutex cache_mutex; + std::unordered_map cache; +}; + +using PreparedSetsCachePtr = std::shared_ptr; + } diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index 5c71804ef27..b9fc04b9d54 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -1202,6 +1202,13 @@ bool KeyCondition::tryPrepareSetIndex( for (size_t i = 0; i < indexes_mapping.size(); ++i) prepared_set->checkTypesEqual(indexes_mapping[i].tuple_index, data_types[i]); + /// Do not use index for large sets. Because building MergeTreeSetIndex consumes several times more memory than the set itself. + /// TODO: make this limit configurable? + /// TODO: consider adding range from min to max values from the prepared set. + if (//prepared_set->getTotalRowCount() > 100000000 || + prepared_set->getTotalByteCount() > 400000000) + return false; + out.set_index = std::make_shared(prepared_set->getSetElements(), std::move(indexes_mapping)); return true; diff --git a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp index e283cfa8a93..ddf72020f73 100644 --- a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp +++ b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp @@ -52,6 +52,11 @@ void MutatePlainMergeTreeTask::prepare() std::move(profile_counters_snapshot)); }; + /// Use PreparedSetsCache shared different tasks of this mutation. + auto mutation_id = future_part->part_info.mutation; + auto prepared_sets_cache_for_mutation = storage.getPreparedSetsCache(mutation_id); + task_context->setPreparedSetsCache(prepared_sets_cache_for_mutation); + mutate_task = storage.merger_mutator.mutatePartToTemporaryPart( future_part, metadata_snapshot, merge_mutate_entry->commands, merge_list_entry.get(), time(nullptr), task_context, merge_mutate_entry->txn, merge_mutate_entry->tagger->reserved_space, table_lock_holder); diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index 34bf5d55270..86d4d2e5b67 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -2181,6 +2181,22 @@ std::unique_ptr StorageMergeTree::getDefaultSettings() const return std::make_unique(getContext()->getMergeTreeSettings()); } +PreparedSetsCachePtr StorageMergeTree::getPreparedSetsCache(Int64 mutation_id) +{ + auto l = std::lock_guard(mutation_prepared_sets_cache_mutex); + if (mutation_id_of_prepared_sets_cache == mutation_id) + { + auto existing_set_cache = mutation_prepared_sets_cache.lock(); + if (existing_set_cache) + return existing_set_cache; + } + + auto cache = std::make_shared(); + mutation_prepared_sets_cache = cache; + mutation_id_of_prepared_sets_cache = mutation_id; + return cache; +} + void StorageMergeTree::fillNewPartName(MutableDataPartPtr & part, DataPartsLock &) { part->info.min_block = part->info.max_block = increment.get(); diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index a0629bb8d3e..8f41af325df 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -151,6 +151,14 @@ private: std::atomic shutdown_called {false}; std::atomic flush_called {false}; + /// PreparedSets cache for one executing mutation. + /// NOTE: we only store weak_ptr to PreparedSetsCache, so that the cache is shared between mutation tasks that are executed in parallel. + /// The goal is to avoiding consuming a lot of memory when the same big sets are used by multiple tasks at the same time. + /// If the tasks are executed without time overlap, we will destroy the cache to free memory, and the next task might rebuild the same sets. + std::mutex mutation_prepared_sets_cache_mutex; + PreparedSetsCachePtr::weak_type mutation_prepared_sets_cache; + Int64 mutation_id_of_prepared_sets_cache = 0; + void loadMutations(); /// Load and initialize deduplication logs. Even if deduplication setting @@ -259,6 +267,8 @@ private: std::unique_ptr getDefaultSettings() const override; + PreparedSetsCachePtr getPreparedSetsCache(Int64 mutation_id); + friend class MergeTreeSink; friend class MergeTreeData; friend class MergePlainMergeTreeTask; From 3884f89f5c4bc68c749a631f9357cb3ae444491e Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:22:38 +0100 Subject: [PATCH 214/535] Short and long tests --- ..._share_big_sets_between_mutation_tasks.sql | 4 +--- ...sets_between_mutation_tasks_long.reference | 5 +++++ ...e_big_sets_between_mutation_tasks_long.sql | 20 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql index 5c8c38a9939..cb98aa5b97e 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql @@ -7,14 +7,12 @@ INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); INSERT INTO 02581_trips SELECT number+100000, '' FROM numbers(10000); INSERT INTO 02581_trips SELECT number+200000, '' FROM numbers(10000); INSERT INTO 02581_trips SELECT number+300000, '' FROM numbers(10000); ---INSERT INTO 02581_trips SELECT number+400000, '' FROM numbers(10000); ---INSERT INTO 02581_trips SELECT number+500000, '' FROM numbers(10000); SELECT count() from 02581_trips; SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; -- Run mutation with a 'IN big subquery' -ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(100000000)) SETTINGS mutations_sync=2; +ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(10000000)) SETTINGS mutations_sync=2; DROP TABLE 02581_trips; diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference new file mode 100644 index 00000000000..030f548efcd --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference @@ -0,0 +1,5 @@ +40000 +all_1_1_0 +all_2_2_0 +all_3_3_0 +all_4_4_0 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql new file mode 100644 index 00000000000..7e66fa1671c --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql @@ -0,0 +1,20 @@ +-- Tags: long, no-tsan, no-asan, no-ubsan, no-msan + +DROP TABLE IF EXISTS 02581_trips; + +CREATE TABLE 02581_trips(id UInt32, description String) ENGINE=MergeTree ORDER BY id; + +-- Make multiple parts +INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+100000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+200000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+300000, '' FROM numbers(10000); + +SELECT count() from 02581_trips; + +SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; + +-- Run mutation with a 'IN big subquery' +ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(100000000)) SETTINGS mutations_sync=2; + +DROP TABLE 02581_trips; From 0b9579bfb848ba4a41dc1213aa2dc38296b93e76 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:01:01 +0200 Subject: [PATCH 215/535] Reworked, testing --- src/Analyzer/Passes/QueryAnalysisPass.cpp | 2 +- src/Columns/ColumnSet.h | 13 ++- src/DataTypes/DataTypeSet.h | 2 +- src/Interpreters/ActionsVisitor.cpp | 39 +++---- src/Interpreters/ActionsVisitor.h | 3 +- src/Interpreters/ExpressionAnalyzer.cpp | 31 +++++- src/Interpreters/PreparedSets.cpp | 100 ++++++++++-------- src/Interpreters/PreparedSets.h | 78 ++++++++------ src/Interpreters/Set.cpp | 24 +++++ src/Interpreters/Set.h | 10 +- src/Planner/Planner.cpp | 2 +- src/Planner/PlannerActionsVisitor.cpp | 2 +- src/Processors/QueryPlan/CreatingSetsStep.cpp | 4 +- .../Transforms/CreatingSetsTransform.cpp | 57 +++++++--- .../Transforms/CreatingSetsTransform.h | 2 + src/Storages/MergeTree/MutateTask.cpp | 7 ++ src/Storages/MergeTree/RPNBuilder.cpp | 2 +- ...sets_between_mutation_tasks_long.reference | 7 ++ ...e_big_sets_between_mutation_tasks_long.sql | 57 ++++++++-- 19 files changed, 306 insertions(+), 136 deletions(-) diff --git a/src/Analyzer/Passes/QueryAnalysisPass.cpp b/src/Analyzer/Passes/QueryAnalysisPass.cpp index d62c9af366c..3ed71654311 100644 --- a/src/Analyzer/Passes/QueryAnalysisPass.cpp +++ b/src/Analyzer/Passes/QueryAnalysisPass.cpp @@ -5124,7 +5124,7 @@ ProjectionNames QueryAnalyzer::resolveFunction(QueryTreeNodePtr & node, Identifi /// Create constant set column for constant folding - auto column_set = ColumnSet::create(1, std::move(set)); + auto column_set = ColumnSet::create(1, makeReadyFutureSet(std::move(set))); argument_columns[1].column = ColumnConst::create(std::move(column_set), 1); } diff --git a/src/Columns/ColumnSet.h b/src/Columns/ColumnSet.h index 316f8196e5a..3eeb60ba1f3 100644 --- a/src/Columns/ColumnSet.h +++ b/src/Columns/ColumnSet.h @@ -2,13 +2,18 @@ #include #include - +#include "Common/Exception.h" +#include +#include +#include namespace DB { class Set; +using SetPtr = std::shared_ptr; using ConstSetPtr = std::shared_ptr; +using FutureSet = std::shared_future; /** A column containing multiple values in the `IN` section. @@ -20,7 +25,7 @@ class ColumnSet final : public COWHelper private: friend class COWHelper; - ColumnSet(size_t s_, const ConstSetPtr & data_) : data(data_) { s = s_; } + ColumnSet(size_t s_, FutureSet data_) : data(std::move(data_)) { s = s_; } ColumnSet(const ColumnSet &) = default; public: @@ -28,13 +33,13 @@ public: TypeIndex getDataType() const override { return TypeIndex::Set; } MutableColumnPtr cloneDummy(size_t s_) const override { return ColumnSet::create(s_, data); } - ConstSetPtr getData() const { return data; } + ConstSetPtr getData() const { if (!data.valid() || data.wait_for(std::chrono::seconds(0)) != std::future_status::ready ) return nullptr; return data.get(); } // Used only for debugging, making it DUMPABLE Field operator[](size_t) const override { return {}; } private: - ConstSetPtr data; + FutureSet data; }; } diff --git a/src/DataTypes/DataTypeSet.h b/src/DataTypes/DataTypeSet.h index 7ef0d931279..7ddfeb9fe30 100644 --- a/src/DataTypes/DataTypeSet.h +++ b/src/DataTypes/DataTypeSet.h @@ -20,7 +20,7 @@ public: bool isParametric() const override { return true; } // Used for expressions analysis. - MutableColumnPtr createColumn() const override { return ColumnSet::create(0, nullptr); } + MutableColumnPtr createColumn() const override { return ColumnSet::create(0, FutureSet{}); } // Used only for debugging, making it DUMPABLE Field getDefault() const override { return Tuple(); } diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 065d8063729..86ee54c7f82 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -544,7 +544,6 @@ ActionsMatcher::Data::Data( , subquery_depth(subquery_depth_) , source_columns(source_columns_) , prepared_sets(prepared_sets_) - , prepared_sets_cache(context_->getPreparedSetsCache()) , no_subqueries(no_subqueries_) , no_makeset(no_makeset_) , only_consts(only_consts_) @@ -953,14 +952,16 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & return; } - SetPtr prepared_set; + FutureSet prepared_set; if (checkFunctionIsInOrGlobalInOperator(node)) { /// Let's find the type of the first argument (then getActionsImpl will be called again and will not affect anything). visit(node.arguments->children.at(0), data); - if (!data.no_makeset && !(data.is_create_parameterized_view && !analyzeReceiveQueryParams(ast).empty()) - && (prepared_set = makeSet(node, data, data.no_subqueries))) + if (!data.no_makeset && !(data.is_create_parameterized_view && !analyzeReceiveQueryParams(ast).empty())) + prepared_set = makeSet(node, data, data.no_subqueries); + + if (prepared_set.valid()) { /// Transform tuple or subquery into a set. } @@ -1173,14 +1174,15 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & num_arguments += columns.size() - 1; arg += columns.size() - 1; } - else if (checkFunctionIsInOrGlobalInOperator(node) && arg == 1 && prepared_set) + else if (checkFunctionIsInOrGlobalInOperator(node) && arg == 1 && prepared_set.valid()) { ColumnWithTypeAndName column; column.type = std::make_shared(); /// If the argument is a set given by an enumeration of values (so, the set was already built), give it a unique name, /// so that sets with the same literal representation do not fuse together (they can have different types). - if (!prepared_set->empty()) + const bool is_constant_set = prepared_set.wait_for(std::chrono::seconds(0)) == std::future_status::ready && prepared_set.get()->isCreated(); + if (is_constant_set) /// TODO: if the set is from prepared_sets_cache, it might be not empty already but we should not handle it as const!!! column.name = data.getUniqueName("__set"); else column.name = child->getColumnName(); @@ -1190,13 +1192,16 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & auto column_set = ColumnSet::create(1, prepared_set); /// If prepared_set is not empty, we have a set made with literals. /// Create a const ColumnSet to make constant folding work - if (!prepared_set->empty()) - column.column = ColumnConst::create(std::move(column_set), 1); + if (is_constant_set) + column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we alos must not handle set form cahce as const!!! else column.column = std::move(column_set); data.addColumn(column); } + // TODO: if we added an empty set it means that it has not been built yet. + // We should add a wait for it to be filled somewhere before we access it + argument_types.push_back(column.type); argument_names.push_back(column.name); } @@ -1371,10 +1376,10 @@ void ActionsMatcher::visit(const ASTLiteral & literal, const ASTPtr & /* ast */, data.addColumn(std::move(column)); } -SetPtr ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_subqueries) +FutureSet ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_subqueries) { if (!data.prepared_sets) - return nullptr; + return {};//nullptr; /** You need to convert the right argument to a set. * This can be a table name, a value, a value enumeration, or a subquery. @@ -1391,16 +1396,11 @@ SetPtr ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_su if (no_subqueries) return {}; auto set_key = PreparedSetKey::forSubquery(*right_in_operand); - if (SetPtr set = data.prepared_sets->get(set_key)) - return set; - if (data.prepared_sets_cache) { - if (auto set = data.prepared_sets_cache->findOrBuild(set_key, nullptr)) - { - data.prepared_sets->set(set_key, set); + auto set = data.prepared_sets->getFuture(set_key); + if (set.valid()) return set; - } } /// A special case is if the name of the table is specified on the right side of the IN statement, @@ -1417,7 +1417,7 @@ SetPtr ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_su { SetPtr set = storage_set->getSet(); data.prepared_sets->set(set_key, set); - return set; + return makeReadyFutureSet(set); } } } @@ -1449,7 +1449,8 @@ SetPtr ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_su const auto & index = data.actions_stack.getLastActionsIndex(); if (data.prepared_sets && index.contains(left_in_operand->getColumnName())) /// An explicit enumeration of values in parentheses. - return makeExplicitSet(&node, last_actions, false, data.getContext(), data.set_size_limit, *data.prepared_sets); + return makeReadyFutureSet( + makeExplicitSet(&node, last_actions, false, data.getContext(), data.set_size_limit, *data.prepared_sets)); else return {}; } diff --git a/src/Interpreters/ActionsVisitor.h b/src/Interpreters/ActionsVisitor.h index 1fce8dfc183..260fd5ab2c0 100644 --- a/src/Interpreters/ActionsVisitor.h +++ b/src/Interpreters/ActionsVisitor.h @@ -126,7 +126,6 @@ public: size_t subquery_depth; const NamesAndTypesList & source_columns; PreparedSetsPtr prepared_sets; - PreparedSetsCachePtr prepared_sets_cache; bool no_subqueries; bool no_makeset; bool only_consts; @@ -220,7 +219,7 @@ private: static void visit(const ASTLiteral & literal, const ASTPtr & ast, Data & data); static void visit(ASTExpressionList & expression_list, const ASTPtr & ast, Data & data); - static SetPtr makeSet(const ASTFunction & node, Data & data, bool no_subqueries); + static FutureSet makeSet(const ASTFunction & node, Data & data, bool no_subqueries); static ASTs doUntuple(const ASTFunction * function, ActionsMatcher::Data & data); static std::optional getNameAndTypeFromAST(const ASTPtr & ast, Data & data); }; diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 434158314cc..5f99bf1c450 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -56,6 +57,8 @@ #include #include #include +#include "Interpreters/PreparedSets.h" +#include "QueryPipeline/SizeLimits.h" #include @@ -450,7 +453,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto set_key = PreparedSetKey::forSubquery(*subquery_or_table_name); - if (prepared_sets->get(set_key)) + if (prepared_sets->getFuture(set_key).valid()) return; /// Already prepared. if (auto set_ptr_from_storage_set = isPlainStorageSetInSubquery(subquery_or_table_name)) @@ -465,7 +468,8 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto io = interpreter_subquery->execute(); PullingAsyncPipelineExecutor executor(io.pipeline); - SetPtr set = std::make_shared(settings.size_limits_for_set, true, getContext()->getSettingsRef().transform_null_in); + SizeLimits size_limits_for_key_condition_sets(0, 50*1000*1000, OverflowMode::BREAK); + SetPtr set = std::make_shared(size_limits_for_key_condition_sets, true, getContext()->getSettingsRef().transform_null_in); set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); Block block; @@ -484,9 +488,28 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ return set; }; - auto set_cache = getContext()->getPreparedSetsCache(); + SetPtr set; - auto set = set_cache ? set_cache->findOrBuild(set_key, build_set) : build_set(); + auto set_cache = getContext()->getPreparedSetsCache(); + if (set_cache) + { + auto from_cache = set_cache->findOrPromiseToBuild(set_key); + if (from_cache.index() == 0) + { + LOG_TRACE(getLogger(), "Building set, key: {}:{}", set_key.ast_hash.first, set_key.ast_hash.second); + set = build_set(); + std::get<0>(from_cache).set_value(set); + } + else + { + LOG_TRACE(getLogger(), "Waiting for set, key: {}:{}", set_key.ast_hash.first, set_key.ast_hash.second); + set = std::get<1>(from_cache).get(); + } + } + else + { + set = build_set(); + } if (!set) return; diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 6a205ec3261..35789169218 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -51,10 +53,20 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c /// If you already created a Set with the same subquery / table for another ast /// In that case several PreparedSetKey would share same subquery and set /// Not sure if it's really possible case (maybe for distributed query when set was filled by external table?) - if (subquery.set) - sets[key] = subquery.set; + if (subquery.set.valid()) + sets[key] = subquery.set; // TODO: else - sets[key] = subquery.set = std::make_shared(set_size_limit, false, transform_null_in); + { + subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); + sets[key] = subquery.promise_to_fill_set.get_future(); + } + + if (!subquery.set_in_progress) + { + subquery.key = key; + subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); + } + return subquery; } @@ -62,17 +74,31 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c /// It's aimed to fill external table passed to SubqueryForSet::createSource. SubqueryForSet & PreparedSets::getSubquery(const String & subquery_id) { return subqueries[subquery_id]; } -void PreparedSets::set(const PreparedSetKey & key, SetPtr set_) { sets[key] = set_; } +void PreparedSets::set(const PreparedSetKey & key, SetPtr set_) { sets[key] = makeReadyFutureSet(set_); } -SetPtr & PreparedSets::get(const PreparedSetKey & key) { return sets[key]; } +FutureSet PreparedSets::getFuture(const PreparedSetKey & key) const +{ + auto it = sets.find(key); + if (it == sets.end())// || it->second.wait_for(std::chrono::seconds(0)) != std::future_status::ready) + return {}; + return it->second; +} -std::vector PreparedSets::getByTreeHash(IAST::Hash ast_hash) +SetPtr PreparedSets::get(const PreparedSetKey & key) const +{ + auto it = sets.find(key); + if (it == sets.end() || it->second.wait_for(std::chrono::seconds(0)) != std::future_status::ready) + return nullptr; + return it->second.get(); +} + +std::vector PreparedSets::getByTreeHash(IAST::Hash ast_hash) const { std::vector res; for (const auto & it : this->sets) { if (it.first.ast_hash == ast_hash) - res.push_back(it.second); + res.push_back(it.second.get()); } return res; } @@ -106,12 +132,10 @@ QueryPlanPtr SubqueryForSet::detachSource() return res; } -SetPtr PreparedSetsCache::findOrBuild(const PreparedSetKey & key, const std::function & build_set) -{ - auto* log = &Poco::Logger::get("PreparedSetsCache"); - EntryPtr entry; - bool need_to_build_set = false; +std::variant, FutureSet> PreparedSetsCache::findOrPromiseToBuild(const PreparedSetKey & key) +{ +// auto* log = &Poco::Logger::get("PreparedSetsCache"); /// Look for existing entry in the cache. { @@ -120,48 +144,30 @@ SetPtr PreparedSetsCache::findOrBuild(const PreparedSetKey & key, const std::fun auto it = cache.find(key); if (it != cache.end()) { - entry = it->second; + /// If the set is being built, return its future, but if it's ready and is nullptr then we should retry building it. + /// TODO: consider moving retry logic outside of the cache. + if (it->second->future.valid() && + (it->second->future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second->future.get() != nullptr)) + return it->second->future; } - else - { - if (build_set == nullptr) - return nullptr; + { /// Insert the entry into the cache so that other threads can find it and start waiting for the set. - entry = std::make_shared(); - entry->filled_set = entry->promise.get_future(); + std::promise promise_to_fill_set; + auto entry = std::make_shared(); + entry->future = promise_to_fill_set.get_future(); cache[key] = entry; - need_to_build_set = true; + return promise_to_fill_set; } } - - if (need_to_build_set) - { - LOG_DEBUG(log, "Building set for key {}:{}", key.ast_hash.first, key.ast_hash.second); - try - { - auto set = build_set(); - entry->promise.set_value(set); - } - catch (...) - { - entry->promise.set_exception(std::current_exception()); - throw; - } - - return entry->filled_set.get(); - } - - if (entry->filled_set.valid() && entry->filled_set.wait_for(std::chrono::seconds(0)) == std::future_status::ready) - { - LOG_DEBUG(log, "Found set for key {}:{} without wait", key.ast_hash.first, key.ast_hash.second); - } - else - { - LOG_DEBUG(log, "Found set for key {}:{} with wait", key.ast_hash.first, key.ast_hash.second); - } - return entry->filled_set.get(); } +FutureSet makeReadyFutureSet(SetPtr set) +{ + std::promise promise; + promise.set_value(set); + return promise.get_future(); +} + }; diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 4699d0c334f..88322b000fe 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -18,32 +18,10 @@ class QueryPlan; class Set; using SetPtr = std::shared_ptr; +using ConstSetPtr = std::shared_ptr; +using FutureSet = std::shared_future; class InterpreterSelectWithUnionQuery; -/// Information on how to build set for the [GLOBAL] IN section. -class SubqueryForSet -{ -public: - - void createSource(InterpreterSelectWithUnionQuery & interpreter, StoragePtr table_ = nullptr); - - bool hasSource() const; - - /// Returns query plan for the set's source - /// and removes it from SubqueryForSet because we need to build it only once. - std::unique_ptr detachSource(); - - /// Build this set from the result of the subquery. - SetPtr set; - - /// If set, put the result into the table. - /// This is a temporary table for transferring to remote servers for distributed query processing. - StoragePtr table; - - /// The source is obtained using the InterpreterSelectQuery subquery. - std::unique_ptr source; -}; - struct PreparedSetKey { /// Prepared sets for tuple literals are indexed by the hash of the tree contents and by the desired @@ -66,9 +44,39 @@ struct PreparedSetKey }; }; + +/// Information on how to build set for the [GLOBAL] IN section. +class SubqueryForSet +{ +public: + + void createSource(InterpreterSelectWithUnionQuery & interpreter, StoragePtr table_ = nullptr); + + bool hasSource() const; + + /// Returns query plan for the set's source + /// and removes it from SubqueryForSet because we need to build it only once. + std::unique_ptr detachSource(); + + /// Build this set from the result of the subquery. + PreparedSetKey key; + SetPtr set_in_progress; + std::promise promise_to_fill_set; + FutureSet set = promise_to_fill_set.get_future(); + + /// If set, put the result into the table. + /// This is a temporary table for transferring to remote servers for distributed query processing. + StoragePtr table; + + /// The source is obtained using the InterpreterSelectQuery subquery. + std::unique_ptr source; +}; + class PreparedSets { public: +// explicit PreparedSets(PreparedSetsCachePtr cache_ = {}) : cache(cache_) {} + using SubqueriesForSets = std::unordered_map; SubqueryForSet & createOrGetSubquery(const String & subquery_id, const PreparedSetKey & key, @@ -76,7 +84,8 @@ public: SubqueryForSet & getSubquery(const String & subquery_id); void set(const PreparedSetKey & key, SetPtr set_); - SetPtr & get(const PreparedSetKey & key); + FutureSet getFuture(const PreparedSetKey & key) const; + SetPtr get(const PreparedSetKey & key) const; /// Get subqueries and clear them. /// We need to build a plan for subqueries just once. That's why we can clear them after accessing them. @@ -85,12 +94,12 @@ public: /// Returns all sets that match the given ast hash not checking types /// Used in KeyCondition and MergeTreeIndexConditionBloomFilter to make non exact match for types in PreparedSetKey - std::vector getByTreeHash(IAST::Hash ast_hash); + std::vector getByTreeHash(IAST::Hash ast_hash) const; bool empty() const; private: - std::unordered_map sets; + std::unordered_map sets; /// This is the information required for building sets SubqueriesForSets subqueries; @@ -98,22 +107,25 @@ private: using PreparedSetsPtr = std::shared_ptr; - /// This set cache is used to avoid building the same set multiple times. It is different from PreparedSets in way that /// it can be used across multiple queries. One use case is when we execute the same mutation on multiple parts. In this /// case each part is processed by a separate mutation task but they can share the same set. + +/// TODO: need to distinguish between sets with and w/o set_elements!!!! class PreparedSetsCache { public: /// Returns the set from the cache or builds it using the provided function. /// If the set is already being built by another task, then this call will wait for the set to be built. - SetPtr findOrBuild(const PreparedSetKey & key, const std::function & build_set); + FutureSet findOrBuild(const PreparedSetKey & key, const std::function & build_set); + + std::variant, FutureSet> findOrPromiseToBuild(const PreparedSetKey & key); private: struct Entry { - std::promise promise; /// The promise is set when the set is built by the first task. - std::shared_future filled_set; /// Other tasks can wait for the set to be built. +// std::promise promise; /// The promise is set when the set is built by the first task. + std::shared_future future; /// Other tasks can wait for the set to be built. }; using EntryPtr = std::shared_ptr; @@ -125,4 +137,8 @@ private: using PreparedSetsCachePtr = std::shared_ptr; + + +FutureSet makeReadyFutureSet(SetPtr set); + } diff --git a/src/Interpreters/Set.cpp b/src/Interpreters/Set.cpp index 75bb05f8346..a22e430ea67 100644 --- a/src/Interpreters/Set.cpp +++ b/src/Interpreters/Set.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include @@ -236,6 +238,26 @@ bool Set::insertFromBlock(const Columns & columns) return limits.check(data.getTotalRowCount(), data.getTotalByteCount(), "IN-set", ErrorCodes::SET_SIZE_LIMIT_EXCEEDED); } +void Set::finishInsert() +{ + is_created = true; + is_created_promise.set_value(); +} + +void Set::waitForIsCreated() const +{ + if (is_created.load()) + return; + +// FIXME: each thread must wait on its own copy of the future + std::shared_future local_is_created_future; + { + std::lock_guard lock(is_created_future_mutex); + local_is_created_future = is_created_future; + } + + local_is_created_future.wait(); +} ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) const { @@ -244,6 +266,8 @@ ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) co if (0 == num_key_columns) throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: no columns passed to Set::execute method."); + waitForIsCreated(); + auto res = ColumnUInt8::create(); ColumnUInt8::Container & vec_res = res->getData(); vec_res.resize(columns.at(0).column->size()); diff --git a/src/Interpreters/Set.h b/src/Interpreters/Set.h index e593f71cfbe..be15c449e09 100644 --- a/src/Interpreters/Set.h +++ b/src/Interpreters/Set.h @@ -34,6 +34,7 @@ public: : log(&Poco::Logger::get("Set")), limits(limits_), fill_set_elements(fill_set_elements_), transform_null_in(transform_null_in_) { + is_created_future = is_created_promise.get_future(); } /** Set can be created either from AST or from a stream of data (subquery result). @@ -49,11 +50,13 @@ public: bool insertFromBlock(const ColumnsWithTypeAndName & columns); /// Call after all blocks were inserted. To get the information that set is already created. - void finishInsert() { is_created = true; } + void finishInsert(); /// finishInsert and isCreated are thread-safe bool isCreated() const { return is_created.load(); } + void waitForIsCreated() const; + /** For columns of 'block', check belonging of corresponding rows to the set. * Return UInt8 column with the result. */ @@ -67,7 +70,7 @@ public: const DataTypes & getElementsTypes() const { return set_elements_types; } bool hasExplicitSetElements() const { return fill_set_elements; } - Columns getSetElements() const { return { set_elements.begin(), set_elements.end() }; } + Columns getSetElements() const { waitForIsCreated(); return { set_elements.begin(), set_elements.end() }; } void checkColumnsNumber(size_t num_key_columns) const; bool areTypesEqual(size_t set_type_idx, const DataTypePtr & other_type) const; @@ -115,6 +118,9 @@ private: /// Check if set contains all the data. std::atomic is_created = false; + std::promise is_created_promise; + mutable std::mutex is_created_future_mutex; + mutable std::shared_future is_created_future TSA_GUARDED_BY(is_created_future_mutex); /// If in the left part columns contains the same types as the elements of the set. void executeOrdinary( diff --git a/src/Planner/Planner.cpp b/src/Planner/Planner.cpp index 5217d240478..368c4ee9506 100644 --- a/src/Planner/Planner.cpp +++ b/src/Planner/Planner.cpp @@ -905,7 +905,7 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, subquery_planner.buildQueryPlanIfNeeded(); SubqueryForSet subquery_for_set; - subquery_for_set.set = planner_set->getSet(); + subquery_for_set.set = makeReadyFutureSet(planner_set->getSet()); // TODO: make it lazy? subquery_for_set.source = std::make_unique(std::move(subquery_planner).extractQueryPlan()); subqueries_for_sets.emplace(set_key, std::move(subquery_for_set)); diff --git a/src/Planner/PlannerActionsVisitor.cpp b/src/Planner/PlannerActionsVisitor.cpp index 1e6ef35f4ab..26ac7b4fad4 100644 --- a/src/Planner/PlannerActionsVisitor.cpp +++ b/src/Planner/PlannerActionsVisitor.cpp @@ -633,7 +633,7 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::ma column.type = std::make_shared(); bool set_is_created = planner_set.getSet()->isCreated(); - auto column_set = ColumnSet::create(1, planner_set.getSet()); + auto column_set = ColumnSet::create(1, FutureSet{});//planner_set.getSet()); if (set_is_created) column.column = ColumnConst::create(std::move(column_set), 1); diff --git a/src/Processors/QueryPlan/CreatingSetsStep.cpp b/src/Processors/QueryPlan/CreatingSetsStep.cpp index b696b77ccfe..a5081b8da46 100644 --- a/src/Processors/QueryPlan/CreatingSetsStep.cpp +++ b/src/Processors/QueryPlan/CreatingSetsStep.cpp @@ -60,7 +60,7 @@ void CreatingSetStep::describeActions(FormatSettings & settings) const String prefix(settings.offset, ' '); settings.out << prefix; - if (subquery_for_set.set) + if (subquery_for_set.set_in_progress) settings.out << "Set: "; settings.out << description << '\n'; @@ -68,7 +68,7 @@ void CreatingSetStep::describeActions(FormatSettings & settings) const void CreatingSetStep::describeActions(JSONBuilder::JSONMap & map) const { - if (subquery_for_set.set) +// if (subquery_for_set.set_in_progress) map.add("Set", description); } diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index f65e72c2723..acf9bc257b0 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -39,13 +40,37 @@ void CreatingSetsTransform::work() if (!is_initialized) init(); + if (done_with_set && done_with_table) + { + finishConsume(); + input.close(); // TODO: what is the proper way to finish the input? why input.close() was not called before my changes? + } + IAccumulatingTransform::work(); } void CreatingSetsTransform::startSubquery() { - if (subquery.set) - LOG_TRACE(log, "Creating set."); +// TODO: lookup the set in the context->prepared_sets_cache + auto ctx = context.lock(); + if (ctx && ctx->getPreparedSetsCache()) + { + auto from_cache = ctx->getPreparedSetsCache()->findOrPromiseToBuild(subquery.key); + if (from_cache.index() == 0) + promise_to_build = std::move(std::get<0>(from_cache)); + else + { + LOG_TRACE(log, "Waiting for set to be build by another thread."); + FutureSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); + SetPtr ready_set = set_built_by_another_thread.get(); + subquery.promise_to_fill_set.set_value(ready_set); + done_with_set = true; + subquery.set_in_progress.reset(); + } + } + + if (subquery.set_in_progress) + LOG_TRACE(log, "Creating set, key: {}:{}", subquery.key.ast_hash.first, subquery.key.ast_hash.second); if (subquery.table) LOG_TRACE(log, "Filling temporary table."); @@ -53,11 +78,12 @@ void CreatingSetsTransform::startSubquery() /// TODO: make via port table_out = QueryPipeline(subquery.table->write({}, subquery.table->getInMemoryMetadataPtr(), getContext())); - done_with_set = !subquery.set; + done_with_set = !subquery.set_in_progress; done_with_table = !subquery.table; - if (done_with_set /*&& done_with_join*/ && done_with_table) - throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: nothing to do with subquery"); +// TODO: properly do this check +// if (done_with_set /*&& done_with_join*/ && done_with_table) +// throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: nothing to do with subquery"); if (table_out.initialized()) { @@ -72,8 +98,8 @@ void CreatingSetsTransform::finishSubquery() { auto seconds = watch.elapsedNanoseconds() / 1e9; - if (subquery.set) - LOG_DEBUG(log, "Created Set with {} entries from {} rows in {} sec.", subquery.set->getTotalRowCount(), read_rows, seconds); + if (subquery.set_in_progress) + LOG_DEBUG(log, "Created Set with {} entries from {} rows in {} sec.", subquery.set_in_progress->getTotalRowCount(), read_rows, seconds); if (subquery.table) LOG_DEBUG(log, "Created Table with {} rows in {} sec.", read_rows, seconds); } @@ -87,8 +113,10 @@ void CreatingSetsTransform::init() { is_initialized = true; - if (subquery.set) - subquery.set->setHeader(getInputPort().getHeader().getColumnsWithTypeAndName()); + if (subquery.set_in_progress) + { + subquery.set_in_progress->setHeader(getInputPort().getHeader().getColumnsWithTypeAndName()); + } watch.restart(); startSubquery(); @@ -101,7 +129,7 @@ void CreatingSetsTransform::consume(Chunk chunk) if (!done_with_set) { - if (!subquery.set->insertFromBlock(block.getColumnsWithTypeAndName())) + if (!subquery.set_in_progress->insertFromBlock(block.getColumnsWithTypeAndName())) done_with_set = true; } @@ -124,8 +152,13 @@ void CreatingSetsTransform::consume(Chunk chunk) Chunk CreatingSetsTransform::generate() { - if (subquery.set) - subquery.set->finishInsert(); + if (subquery.set_in_progress) + { + subquery.set_in_progress->finishInsert(); + subquery.promise_to_fill_set.set_value(subquery.set_in_progress); + if (promise_to_build) + promise_to_build->set_value(subquery.set_in_progress); + } if (table_out.initialized()) { diff --git a/src/Processors/Transforms/CreatingSetsTransform.h b/src/Processors/Transforms/CreatingSetsTransform.h index ca59fb9e220..aedd169a33c 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.h +++ b/src/Processors/Transforms/CreatingSetsTransform.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -43,6 +44,7 @@ public: private: SubqueryForSet subquery; + std::optional> promise_to_build; QueryPipeline table_out; std::unique_ptr executor; diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index edcf85292f4..5d9528fd895 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1725,6 +1725,10 @@ bool MutateTask::prepare() context_for_reading->setSetting("force_index_by_date", false); context_for_reading->setSetting("force_primary_key", false); +// /// Skip using large sets in keyCondition +// context_for_reading->setSetting("max_bytes_in_set", 50*1000*1000); +// context_for_reading->setSetting("set_overflow_mode", String("break")); + for (const auto & command : *ctx->commands) if (!canSkipMutationCommandForPart(ctx->source_part, command, context_for_reading)) ctx->commands_for_part.emplace_back(command); @@ -1773,6 +1777,9 @@ bool MutateTask::prepare() context_for_reading->setSetting("max_threads", 1); context_for_reading->setSetting("allow_asynchronous_read_from_io_pool_for_merge_tree", false); context_for_reading->setSetting("max_streams_for_merge_tree_reading", Field(0)); + /// Restore settings for large sets. + context_for_reading->setSetting("max_bytes_in_set", ctx->context->getSettings().max_bytes_in_set.value); + context_for_reading->setSetting("set_overflow_mode", ctx->context->getSettings().set_overflow_mode.toString()); MutationHelpers::splitAndModifyMutationCommands(ctx->source_part, ctx->commands_for_part, ctx->for_interpreter, ctx->for_file_renames); diff --git a/src/Storages/MergeTree/RPNBuilder.cpp b/src/Storages/MergeTree/RPNBuilder.cpp index dd6dbf7e02e..7c8b3083842 100644 --- a/src/Storages/MergeTree/RPNBuilder.cpp +++ b/src/Storages/MergeTree/RPNBuilder.cpp @@ -288,7 +288,7 @@ ConstSetPtr tryGetSetFromDAGNode(const ActionsDAG::Node * dag_node) { auto set = column_set->getData(); - if (set->isCreated()) + if (set && set->isCreated()) return set; } diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference index 030f548efcd..3a7410d925f 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.reference @@ -3,3 +3,10 @@ all_1_1_0 all_2_2_0 all_3_3_0 all_4_4_0 +36000 +32000 +28000 +24000 +20000 +16000 +12000 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql index 7e66fa1671c..1aadc9203fb 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql @@ -2,19 +2,60 @@ DROP TABLE IF EXISTS 02581_trips; -CREATE TABLE 02581_trips(id UInt32, description String) ENGINE=MergeTree ORDER BY id; +CREATE TABLE 02581_trips(id UInt32, description String, id2 UInt32, PRIMARY KEY id) ENGINE=MergeTree ORDER BY id; -- Make multiple parts -INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+100000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+200000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+300000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+100000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+200000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+300000, '', number FROM numbers(10000); + +SELECT count() from 02581_trips WHERE description = ''; -SELECT count() from 02581_trips; SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; --- Run mutation with a 'IN big subquery' -ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(100000000)) SETTINGS mutations_sync=2; +-- Run mutation with `id` a 'IN big subquery' +ALTER TABLE 02581_trips UPDATE description='a' WHERE id IN (SELECT (number*10)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; +ALTER TABLE 02581_trips UPDATE description='a' WHERE id IN (SELECT (number*10 + 1)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=2, max_rows_in_set=1000; +SELECT count() from 02581_trips WHERE description = ''; + +-- Run mutation with func(`id`) IN big subquery +ALTER TABLE 02581_trips UPDATE description='b' WHERE id::UInt64 IN (SELECT (number*10 + 2)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + +-- Run mutation with non-PK `id2` IN big subquery +ALTER TABLE 02581_trips UPDATE description='c' WHERE id2 IN (SELECT (number*10 + 3)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + +-- Run mutation with PK and non-PK IN big subquery +ALTER TABLE 02581_trips UPDATE description='c' +WHERE + (id IN (SELECT (number*10 + 4)::UInt32 FROM numbers(200000000))) OR + (id2 IN (SELECT (number*10 + 4)::UInt32 FROM numbers(200000000))) +SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + +-- Run mutation with PK and non-PK IN big subquery +ALTER TABLE 02581_trips UPDATE description='c' +WHERE + (id::UInt64 IN (SELECT (number*10 + 5)::UInt32 FROM numbers(200000000))) OR + (id2::UInt64 IN (SELECT (number*10 + 5)::UInt32 FROM numbers(200000000))) +SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + + + +CREATE TABLE 02581_set (id UInt32) ENGINE = Set; + +INSERT INTO 02581_set SELECT number*10+6 FROM numbers(200000000); + +-- Run mutation with non-PK `id2` IN big subquery +ALTER TABLE 02581_trips UPDATE description='d' WHERE id IN 02581_set SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + + +DROP TABLE 02581_set; DROP TABLE 02581_trips; From adbe87e9d336ea89ab174fc0ed97a8a4bc961dfb Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 4 Apr 2023 17:35:35 +0200 Subject: [PATCH 216/535] Fixes --- src/Interpreters/ActionsVisitor.cpp | 2 +- src/Interpreters/ExpressionAnalyzer.cpp | 2 +- src/Interpreters/PreparedSets.h | 1 - src/Planner/Planner.cpp | 2 +- src/Planner/PlannerActionsVisitor.cpp | 3 ++- src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp | 1 - 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 86ee54c7f82..73277a14093 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -1193,7 +1193,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If prepared_set is not empty, we have a set made with literals. /// Create a const ColumnSet to make constant folding work if (is_constant_set) - column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we alos must not handle set form cahce as const!!! + column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we also must not handle set form cache as const!!! else column.column = std::move(column_set); data.addColumn(column); diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 5f99bf1c450..39effa5e2e5 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -468,7 +468,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto io = interpreter_subquery->execute(); PullingAsyncPipelineExecutor executor(io.pipeline); - SizeLimits size_limits_for_key_condition_sets(0, 50*1000*1000, OverflowMode::BREAK); + SizeLimits size_limits_for_key_condition_sets(0, 400*1024*1024, OverflowMode::BREAK); SetPtr set = std::make_shared(size_limits_for_key_condition_sets, true, getContext()->getSettingsRef().transform_null_in); set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 88322b000fe..0b1d7ad568d 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -138,7 +138,6 @@ private: using PreparedSetsCachePtr = std::shared_ptr; - FutureSet makeReadyFutureSet(SetPtr set); } diff --git a/src/Planner/Planner.cpp b/src/Planner/Planner.cpp index 368c4ee9506..192a32c9d00 100644 --- a/src/Planner/Planner.cpp +++ b/src/Planner/Planner.cpp @@ -905,7 +905,7 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, subquery_planner.buildQueryPlanIfNeeded(); SubqueryForSet subquery_for_set; - subquery_for_set.set = makeReadyFutureSet(planner_set->getSet()); // TODO: make it lazy? + subquery_for_set.set_in_progress = planner_set->getSet(); subquery_for_set.source = std::make_unique(std::move(subquery_planner).extractQueryPlan()); subqueries_for_sets.emplace(set_key, std::move(subquery_for_set)); diff --git a/src/Planner/PlannerActionsVisitor.cpp b/src/Planner/PlannerActionsVisitor.cpp index 26ac7b4fad4..40cdddd324e 100644 --- a/src/Planner/PlannerActionsVisitor.cpp +++ b/src/Planner/PlannerActionsVisitor.cpp @@ -632,8 +632,9 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::ma column.name = set_key; column.type = std::make_shared(); + /// TODO: Properly fix this to use FutureSet for non-yet-created sets. bool set_is_created = planner_set.getSet()->isCreated(); - auto column_set = ColumnSet::create(1, FutureSet{});//planner_set.getSet()); + auto column_set = ColumnSet::create(1, makeReadyFutureSet(planner_set.getSet())); if (set_is_created) column.column = ColumnConst::create(std::move(column_set), 1); diff --git a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp index ddf72020f73..e920213538f 100644 --- a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp +++ b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp @@ -52,7 +52,6 @@ void MutatePlainMergeTreeTask::prepare() std::move(profile_counters_snapshot)); }; - /// Use PreparedSetsCache shared different tasks of this mutation. auto mutation_id = future_part->part_info.mutation; auto prepared_sets_cache_for_mutation = storage.getPreparedSetsCache(mutation_id); task_context->setPreparedSetsCache(prepared_sets_cache_for_mutation); From fbf09a11154635f9bf4b1951545c2aa64cb949f0 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 4 Apr 2023 23:47:05 +0200 Subject: [PATCH 217/535] Fixes for new analyzer --- src/Columns/ColumnSet.h | 10 +-- src/Interpreters/ActionsVisitor.cpp | 2 +- src/Interpreters/ExpressionAnalyzer.cpp | 7 +- src/Interpreters/PreparedSets.cpp | 19 ++++- src/Interpreters/PreparedSets.h | 77 +++++++++++-------- src/Planner/CollectSets.cpp | 12 ++- src/Planner/Planner.cpp | 13 +++- src/Planner/PlannerActionsVisitor.cpp | 4 +- src/Planner/PlannerContext.cpp | 2 +- src/Planner/PlannerContext.h | 14 ++-- .../Transforms/CreatingSetsTransform.cpp | 2 +- .../Transforms/CreatingSetsTransform.h | 1 - 12 files changed, 94 insertions(+), 69 deletions(-) diff --git a/src/Columns/ColumnSet.h b/src/Columns/ColumnSet.h index 3eeb60ba1f3..3f5cf4ad280 100644 --- a/src/Columns/ColumnSet.h +++ b/src/Columns/ColumnSet.h @@ -1,19 +1,15 @@ #pragma once +#include #include #include -#include "Common/Exception.h" -#include -#include -#include + namespace DB { class Set; -using SetPtr = std::shared_ptr; using ConstSetPtr = std::shared_ptr; -using FutureSet = std::shared_future; /** A column containing multiple values in the `IN` section. @@ -33,7 +29,7 @@ public: TypeIndex getDataType() const override { return TypeIndex::Set; } MutableColumnPtr cloneDummy(size_t s_) const override { return ColumnSet::create(s_, data); } - ConstSetPtr getData() const { if (!data.valid() || data.wait_for(std::chrono::seconds(0)) != std::future_status::ready ) return nullptr; return data.get(); } + ConstSetPtr getData() const { if (!data.isReady()) return nullptr; return data.get(); } // Used only for debugging, making it DUMPABLE Field operator[](size_t) const override { return {}; } diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 73277a14093..e2062a49a45 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -1181,7 +1181,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If the argument is a set given by an enumeration of values (so, the set was already built), give it a unique name, /// so that sets with the same literal representation do not fuse together (they can have different types). - const bool is_constant_set = prepared_set.wait_for(std::chrono::seconds(0)) == std::future_status::ready && prepared_set.get()->isCreated(); + const bool is_constant_set = prepared_set.isCreated(); if (is_constant_set) /// TODO: if the set is from prepared_sets_cache, it might be not empty already but we should not handle it as const!!! column.name = data.getUniqueName("__set"); else diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 39effa5e2e5..a05aaf74fbb 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -1,4 +1,3 @@ -#include #include #include @@ -57,8 +56,7 @@ #include #include #include -#include "Interpreters/PreparedSets.h" -#include "QueryPipeline/SizeLimits.h" +#include #include @@ -71,6 +69,7 @@ #include #include #include +#include #include #include @@ -493,7 +492,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto set_cache = getContext()->getPreparedSetsCache(); if (set_cache) { - auto from_cache = set_cache->findOrPromiseToBuild(set_key); + auto from_cache = set_cache->findOrPromiseToBuild(toString(set_key)); if (from_cache.index() == 0) { LOG_TRACE(getLogger(), "Building set, key: {}:{}", set_key.ast_hash.first, set_key.ast_hash.second); diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 35789169218..c5e2b50545d 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -58,12 +58,12 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c else { subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); - sets[key] = subquery.promise_to_fill_set.get_future(); + sets[key] = FutureSet(subquery.promise_to_fill_set.get_future()); } if (!subquery.set_in_progress) { - subquery.key = key; + subquery.key = toString(key); subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); } @@ -132,8 +132,19 @@ QueryPlanPtr SubqueryForSet::detachSource() return res; } +bool FutureSet::isReady() const +{ + return valid() && + wait_for(std::chrono::seconds(0)) == std::future_status::ready; +} -std::variant, FutureSet> PreparedSetsCache::findOrPromiseToBuild(const PreparedSetKey & key) +bool FutureSet::isCreated() const +{ + return isReady() && get() != nullptr && get()->isCreated(); +} + + +std::variant, FutureSet> PreparedSetsCache::findOrPromiseToBuild(const String & key) { // auto* log = &Poco::Logger::get("PreparedSetsCache"); @@ -167,7 +178,7 @@ FutureSet makeReadyFutureSet(SetPtr set) { std::promise promise; promise.set_value(set); - return promise.get_future(); + return FutureSet(promise.get_future()); } }; diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 0b1d7ad568d..59c5d8797cd 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -18,10 +18,46 @@ class QueryPlan; class Set; using SetPtr = std::shared_ptr; -using ConstSetPtr = std::shared_ptr; -using FutureSet = std::shared_future; class InterpreterSelectWithUnionQuery; +class FutureSet final : public std::shared_future +{ +public: + FutureSet() = default; + FutureSet(const std::shared_future & future) : std::shared_future(future) {} + + bool isReady() const; + + bool isCreated() const; +}; + +/// Information on how to build set for the [GLOBAL] IN section. +class SubqueryForSet +{ +public: + + void createSource(InterpreterSelectWithUnionQuery & interpreter, StoragePtr table_ = nullptr); + + bool hasSource() const; + + /// Returns query plan for the set's source + /// and removes it from SubqueryForSet because we need to build it only once. + std::unique_ptr detachSource(); + + /// Build this set from the result of the subquery. + String key; + SetPtr set_in_progress; + std::promise promise_to_fill_set; + FutureSet set = {promise_to_fill_set.get_future()}; + + /// If set, put the result into the table. + /// This is a temporary table for transferring to remote servers for distributed query processing. + StoragePtr table; + + /// The source is obtained using the InterpreterSelectQuery subquery. + std::unique_ptr source; +}; + struct PreparedSetKey { /// Prepared sets for tuple literals are indexed by the hash of the tree contents and by the desired @@ -44,33 +80,10 @@ struct PreparedSetKey }; }; - -/// Information on how to build set for the [GLOBAL] IN section. -class SubqueryForSet +inline String toString(const PreparedSetKey & key) { -public: - - void createSource(InterpreterSelectWithUnionQuery & interpreter, StoragePtr table_ = nullptr); - - bool hasSource() const; - - /// Returns query plan for the set's source - /// and removes it from SubqueryForSet because we need to build it only once. - std::unique_ptr detachSource(); - - /// Build this set from the result of the subquery. - PreparedSetKey key; - SetPtr set_in_progress; - std::promise promise_to_fill_set; - FutureSet set = promise_to_fill_set.get_future(); - - /// If set, put the result into the table. - /// This is a temporary table for transferring to remote servers for distributed query processing. - StoragePtr table; - - /// The source is obtained using the InterpreterSelectQuery subquery. - std::unique_ptr source; -}; + return "__set_" + std::to_string(key.ast_hash.first) + "_" + std::to_string(key.ast_hash.second); +} class PreparedSets { @@ -115,11 +128,7 @@ using PreparedSetsPtr = std::shared_ptr; class PreparedSetsCache { public: - /// Returns the set from the cache or builds it using the provided function. - /// If the set is already being built by another task, then this call will wait for the set to be built. - FutureSet findOrBuild(const PreparedSetKey & key, const std::function & build_set); - - std::variant, FutureSet> findOrPromiseToBuild(const PreparedSetKey & key); + std::variant, FutureSet> findOrPromiseToBuild(const String & key); private: struct Entry @@ -132,7 +141,7 @@ private: /// Protects just updates to the cache. When we got EntyPtr from the cache we can access it without locking. std::mutex cache_mutex; - std::unordered_map cache; + std::unordered_map cache; }; using PreparedSetsCachePtr = std::shared_ptr; diff --git a/src/Planner/CollectSets.cpp b/src/Planner/CollectSets.cpp index bc4b0dd09f3..9877ec1c221 100644 --- a/src/Planner/CollectSets.cpp +++ b/src/Planner/CollectSets.cpp @@ -1,6 +1,7 @@ #include #include +#include #include @@ -52,7 +53,8 @@ public: if (storage_set) { - planner_context.registerSet(set_key, PlannerSet(storage_set->getSet())); + /// TODO: need to handle storage_set as not-yet-built set? + planner_context.registerSet(set_key, PlannerSet(makeReadyFutureSet(storage_set->getSet()))); } else if (const auto * constant_node = in_second_argument->as()) { @@ -62,16 +64,12 @@ public: constant_node->getResultType(), settings); - planner_context.registerSet(set_key, PlannerSet(std::move(set))); + planner_context.registerSet(set_key, PlannerSet(makeReadyFutureSet(std::move(set)))); } else if (in_second_argument_node_type == QueryTreeNodeType::QUERY || in_second_argument_node_type == QueryTreeNodeType::UNION) { - SizeLimits size_limits_for_set = {settings.max_rows_in_set, settings.max_bytes_in_set, settings.set_overflow_mode}; - bool tranform_null_in = settings.transform_null_in; - auto set = std::make_shared(size_limits_for_set, false /*fill_set_elements*/, tranform_null_in); - - planner_context.registerSet(set_key, PlannerSet(std::move(set), in_second_argument)); + planner_context.registerSet(set_key, PlannerSet(in_second_argument)); } else { diff --git a/src/Planner/Planner.cpp b/src/Planner/Planner.cpp index 192a32c9d00..297907e9245 100644 --- a/src/Planner/Planner.cpp +++ b/src/Planner/Planner.cpp @@ -894,7 +894,7 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, if (!planner_set) continue; - if (planner_set->getSet()->isCreated() || !planner_set->getSubqueryNode()) + if (planner_set->getSet().isCreated() || !planner_set->getSubqueryNode()) continue; auto subquery_options = select_query_options.subquery(); @@ -904,8 +904,17 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, planner_context->getGlobalPlannerContext()); subquery_planner.buildQueryPlanIfNeeded(); + const auto & settings = planner_context->getQueryContext()->getSettingsRef(); + SizeLimits size_limits_for_set = {settings.max_rows_in_set, settings.max_bytes_in_set, settings.set_overflow_mode}; + bool tranform_null_in = settings.transform_null_in; + auto set = std::make_shared(size_limits_for_set, false /*fill_set_elements*/, tranform_null_in); + + /// TODO: cleanup this initialization SubqueryForSet subquery_for_set; - subquery_for_set.set_in_progress = planner_set->getSet(); + subquery_for_set.key = set_key; + subquery_for_set.set_in_progress = set; + subquery_for_set.promise_to_fill_set = planner_set->getPromiseToBuildSet(); + subquery_for_set.set = planner_set->getSet(); subquery_for_set.source = std::make_unique(std::move(subquery_planner).extractQueryPlan()); subqueries_for_sets.emplace(set_key, std::move(subquery_for_set)); diff --git a/src/Planner/PlannerActionsVisitor.cpp b/src/Planner/PlannerActionsVisitor.cpp index 40cdddd324e..83172d39d25 100644 --- a/src/Planner/PlannerActionsVisitor.cpp +++ b/src/Planner/PlannerActionsVisitor.cpp @@ -633,8 +633,8 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::ma column.type = std::make_shared(); /// TODO: Properly fix this to use FutureSet for non-yet-created sets. - bool set_is_created = planner_set.getSet()->isCreated(); - auto column_set = ColumnSet::create(1, makeReadyFutureSet(planner_set.getSet())); + bool set_is_created = planner_set.getSet().isCreated(); + auto column_set = ColumnSet::create(1, planner_set.getSet()); if (set_is_created) column.column = ColumnConst::create(std::move(column_set), 1); diff --git a/src/Planner/PlannerContext.cpp b/src/Planner/PlannerContext.cpp index 59ae0f20fac..b606cb06ef2 100644 --- a/src/Planner/PlannerContext.cpp +++ b/src/Planner/PlannerContext.cpp @@ -128,7 +128,7 @@ PlannerContext::SetKey PlannerContext::createSetKey(const QueryTreeNodePtr & set void PlannerContext::registerSet(const SetKey & key, PlannerSet planner_set) { - if (!planner_set.getSet()) + if (!planner_set.getSet().valid()) // TODO throw Exception(ErrorCodes::LOGICAL_ERROR, "Set must be initialized"); const auto & subquery_node = planner_set.getSubqueryNode(); diff --git a/src/Planner/PlannerContext.h b/src/Planner/PlannerContext.h index e47198bfe5f..22c32b9139d 100644 --- a/src/Planner/PlannerContext.h +++ b/src/Planner/PlannerContext.h @@ -7,6 +7,7 @@ #include #include +#include #include @@ -56,18 +57,18 @@ class PlannerSet { public: /// Construct planner set that is ready for execution - explicit PlannerSet(SetPtr set_) + explicit PlannerSet(FutureSet set_) : set(std::move(set_)) {} /// Construct planner set with set and subquery node - explicit PlannerSet(SetPtr set_, QueryTreeNodePtr subquery_node_) - : set(std::move(set_)) + explicit PlannerSet(QueryTreeNodePtr subquery_node_) + : set(promise_to_build_set.get_future()) , subquery_node(std::move(subquery_node_)) {} /// Get set - const SetPtr & getSet() const + const FutureSet & getSet() const { return set; } @@ -78,8 +79,11 @@ public: return subquery_node; } + std::promise getPromiseToBuildSet() const { return std::move(promise_to_build_set); } + private: - SetPtr set; + mutable std::promise promise_to_build_set; // FIXME: mutable is a hack + FutureSet set; QueryTreeNodePtr subquery_node; }; diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index acf9bc257b0..3ce3028295b 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -70,7 +70,7 @@ void CreatingSetsTransform::startSubquery() } if (subquery.set_in_progress) - LOG_TRACE(log, "Creating set, key: {}:{}", subquery.key.ast_hash.first, subquery.key.ast_hash.second); + LOG_TRACE(log, "Creating set, key: {}", subquery.key); if (subquery.table) LOG_TRACE(log, "Filling temporary table."); diff --git a/src/Processors/Transforms/CreatingSetsTransform.h b/src/Processors/Transforms/CreatingSetsTransform.h index aedd169a33c..c2ce8629bef 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.h +++ b/src/Processors/Transforms/CreatingSetsTransform.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include From ae2da385499362e1d6943178a6acd699df8c42b9 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:05:36 +0200 Subject: [PATCH 218/535] Check that the set has been built before it is used --- src/Interpreters/Set.cpp | 28 ++++++++++++++-------------- src/Interpreters/Set.h | 12 ++++++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Interpreters/Set.cpp b/src/Interpreters/Set.cpp index a22e430ea67..c5e3cb8ad63 100644 --- a/src/Interpreters/Set.cpp +++ b/src/Interpreters/Set.cpp @@ -241,22 +241,22 @@ bool Set::insertFromBlock(const Columns & columns) void Set::finishInsert() { is_created = true; - is_created_promise.set_value(); +// is_created_promise.set_value(); } -void Set::waitForIsCreated() const +void Set::checkIsCreated() const { - if (is_created.load()) - return; - -// FIXME: each thread must wait on its own copy of the future - std::shared_future local_is_created_future; - { - std::lock_guard lock(is_created_future_mutex); - local_is_created_future = is_created_future; - } - - local_is_created_future.wait(); + if (!is_created.load()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: Trying to use set before it has been built."); +// +//// FIXME: each thread must wait on its own copy of the future +// std::shared_future local_is_created_future; +// { +// std::lock_guard lock(is_created_future_mutex); +// local_is_created_future = is_created_future; +// } +// +// local_is_created_future.wait(); } ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) const @@ -266,7 +266,7 @@ ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) co if (0 == num_key_columns) throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: no columns passed to Set::execute method."); - waitForIsCreated(); + checkIsCreated(); auto res = ColumnUInt8::create(); ColumnUInt8::Container & vec_res = res->getData(); diff --git a/src/Interpreters/Set.h b/src/Interpreters/Set.h index be15c449e09..cbfbe874b35 100644 --- a/src/Interpreters/Set.h +++ b/src/Interpreters/Set.h @@ -34,7 +34,7 @@ public: : log(&Poco::Logger::get("Set")), limits(limits_), fill_set_elements(fill_set_elements_), transform_null_in(transform_null_in_) { - is_created_future = is_created_promise.get_future(); +// is_created_future = is_created_promise.get_future(); } /** Set can be created either from AST or from a stream of data (subquery result). @@ -55,7 +55,7 @@ public: /// finishInsert and isCreated are thread-safe bool isCreated() const { return is_created.load(); } - void waitForIsCreated() const; + void checkIsCreated() const; /** For columns of 'block', check belonging of corresponding rows to the set. * Return UInt8 column with the result. @@ -70,7 +70,7 @@ public: const DataTypes & getElementsTypes() const { return set_elements_types; } bool hasExplicitSetElements() const { return fill_set_elements; } - Columns getSetElements() const { waitForIsCreated(); return { set_elements.begin(), set_elements.end() }; } + Columns getSetElements() const { checkIsCreated(); return { set_elements.begin(), set_elements.end() }; } void checkColumnsNumber(size_t num_key_columns) const; bool areTypesEqual(size_t set_type_idx, const DataTypePtr & other_type) const; @@ -118,9 +118,9 @@ private: /// Check if set contains all the data. std::atomic is_created = false; - std::promise is_created_promise; - mutable std::mutex is_created_future_mutex; - mutable std::shared_future is_created_future TSA_GUARDED_BY(is_created_future_mutex); +// std::promise is_created_promise; +// mutable std::mutex is_created_future_mutex; +// mutable std::shared_future is_created_future TSA_GUARDED_BY(is_created_future_mutex); /// If in the left part columns contains the same types as the elements of the set. void executeOrdinary( From 0aa7979dd59bb0cbbb29f2a2e58c48a58f130e95 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 5 Apr 2023 15:24:45 +0200 Subject: [PATCH 219/535] Unblock tests with ENGINE=Set --- src/Interpreters/Set.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Interpreters/Set.cpp b/src/Interpreters/Set.cpp index c5e3cb8ad63..68b8e7450c4 100644 --- a/src/Interpreters/Set.cpp +++ b/src/Interpreters/Set.cpp @@ -266,7 +266,8 @@ ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) co if (0 == num_key_columns) throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: no columns passed to Set::execute method."); - checkIsCreated(); +// TODO: in case of ENGINE=Set it is the set can be used and updated "concurrently" +// checkIsCreated(); auto res = ColumnUInt8::create(); ColumnUInt8::Container & vec_res = res->getData(); From 05a9d1cbfc461f8543f6c2b95fa6bde99bf170df Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 5 Apr 2023 18:26:35 +0200 Subject: [PATCH 220/535] Cleanups --- src/Analyzer/Passes/QueryAnalysisPass.cpp | 2 +- src/Interpreters/ActionsVisitor.cpp | 8 ++++---- src/Interpreters/PreparedSets.cpp | 21 +++++++++++---------- src/Interpreters/PreparedSets.h | 9 +++++---- src/Planner/CollectSets.cpp | 4 ++-- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Analyzer/Passes/QueryAnalysisPass.cpp b/src/Analyzer/Passes/QueryAnalysisPass.cpp index 3ed71654311..67327428d6e 100644 --- a/src/Analyzer/Passes/QueryAnalysisPass.cpp +++ b/src/Analyzer/Passes/QueryAnalysisPass.cpp @@ -5124,7 +5124,7 @@ ProjectionNames QueryAnalyzer::resolveFunction(QueryTreeNodePtr & node, Identifi /// Create constant set column for constant folding - auto column_set = ColumnSet::create(1, makeReadyFutureSet(std::move(set))); + auto column_set = ColumnSet::create(1, FutureSet(std::move(set))); argument_columns[1].column = ColumnConst::create(std::move(column_set), 1); } diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index e2062a49a45..217a46c5716 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -1182,7 +1182,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If the argument is a set given by an enumeration of values (so, the set was already built), give it a unique name, /// so that sets with the same literal representation do not fuse together (they can have different types). const bool is_constant_set = prepared_set.isCreated(); - if (is_constant_set) /// TODO: if the set is from prepared_sets_cache, it might be not empty already but we should not handle it as const!!! + if (is_constant_set) /// TODO: if the set is from prepared_sets_cache, it might be not empty already but we should not handle it as const! column.name = data.getUniqueName("__set"); else column.name = child->getColumnName(); @@ -1193,7 +1193,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If prepared_set is not empty, we have a set made with literals. /// Create a const ColumnSet to make constant folding work if (is_constant_set) - column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we also must not handle set form cache as const!!! + column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we also must not handle set from cache as const! else column.column = std::move(column_set); data.addColumn(column); @@ -1417,7 +1417,7 @@ FutureSet ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no { SetPtr set = storage_set->getSet(); data.prepared_sets->set(set_key, set); - return makeReadyFutureSet(set); + return FutureSet(set); } } } @@ -1449,7 +1449,7 @@ FutureSet ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no const auto & index = data.actions_stack.getLastActionsIndex(); if (data.prepared_sets && index.contains(left_in_operand->getColumnName())) /// An explicit enumeration of values in parentheses. - return makeReadyFutureSet( + return FutureSet( makeExplicitSet(&node, last_actions, false, data.getContext(), data.set_size_limit, *data.prepared_sets)); else return {}; diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index c5e2b50545d..9f242bb0693 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -74,7 +74,7 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c /// It's aimed to fill external table passed to SubqueryForSet::createSource. SubqueryForSet & PreparedSets::getSubquery(const String & subquery_id) { return subqueries[subquery_id]; } -void PreparedSets::set(const PreparedSetKey & key, SetPtr set_) { sets[key] = makeReadyFutureSet(set_); } +void PreparedSets::set(const PreparedSetKey & key, SetPtr set_) { sets[key] = FutureSet(set_); } FutureSet PreparedSets::getFuture(const PreparedSetKey & key) const { @@ -132,6 +132,15 @@ QueryPlanPtr SubqueryForSet::detachSource() return res; } + +FutureSet::FutureSet(SetPtr set) +{ + std::promise promise; + promise.set_value(set); + *this = FutureSet(promise.get_future()); +} + + bool FutureSet::isReady() const { return valid() && @@ -159,7 +168,7 @@ std::variant, FutureSet> PreparedSetsCache::findOrPromiseTo /// TODO: consider moving retry logic outside of the cache. if (it->second->future.valid() && (it->second->future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second->future.get() != nullptr)) - return it->second->future; + return FutureSet{it->second->future}; } { @@ -173,12 +182,4 @@ std::variant, FutureSet> PreparedSetsCache::findOrPromiseTo } } - -FutureSet makeReadyFutureSet(SetPtr set) -{ - std::promise promise; - promise.set_value(set); - return FutureSet(promise.get_future()); -} - }; diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 59c5d8797cd..ad8b8847aa4 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -24,7 +24,8 @@ class FutureSet final : public std::shared_future { public: FutureSet() = default; - FutureSet(const std::shared_future & future) : std::shared_future(future) {} + explicit FutureSet(const std::shared_future & future) : std::shared_future(future) {} + explicit FutureSet(SetPtr readySet); bool isReady() const; @@ -48,7 +49,7 @@ public: String key; SetPtr set_in_progress; std::promise promise_to_fill_set; - FutureSet set = {promise_to_fill_set.get_future()}; + FutureSet set = FutureSet{promise_to_fill_set.get_future()}; /// If set, put the result into the table. /// This is a temporary table for transferring to remote servers for distributed query processing. @@ -124,7 +125,7 @@ using PreparedSetsPtr = std::shared_ptr; /// it can be used across multiple queries. One use case is when we execute the same mutation on multiple parts. In this /// case each part is processed by a separate mutation task but they can share the same set. -/// TODO: need to distinguish between sets with and w/o set_elements!!!! +/// TODO: need to distinguish between sets with and w/o set_elements! class PreparedSetsCache { public: @@ -147,6 +148,6 @@ private: using PreparedSetsCachePtr = std::shared_ptr; -FutureSet makeReadyFutureSet(SetPtr set); +//FutureSet makeReadyFutureSet(SetPtr set); } diff --git a/src/Planner/CollectSets.cpp b/src/Planner/CollectSets.cpp index 9877ec1c221..0081a0ff6ac 100644 --- a/src/Planner/CollectSets.cpp +++ b/src/Planner/CollectSets.cpp @@ -54,7 +54,7 @@ public: if (storage_set) { /// TODO: need to handle storage_set as not-yet-built set? - planner_context.registerSet(set_key, PlannerSet(makeReadyFutureSet(storage_set->getSet()))); + planner_context.registerSet(set_key, PlannerSet(FutureSet(storage_set->getSet()))); } else if (const auto * constant_node = in_second_argument->as()) { @@ -64,7 +64,7 @@ public: constant_node->getResultType(), settings); - planner_context.registerSet(set_key, PlannerSet(makeReadyFutureSet(std::move(set)))); + planner_context.registerSet(set_key, PlannerSet(FutureSet(std::move(set)))); } else if (in_second_argument_node_type == QueryTreeNodeType::QUERY || in_second_argument_node_type == QueryTreeNodeType::UNION) From 0ae74ddf42d0f48f4946600a093c5f81cfeb13fb Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:24:38 +0200 Subject: [PATCH 221/535] Use different types for referencing local set and set that is stored in cache shared between tasks --- src/Interpreters/ActionsVisitor.cpp | 6 +-- src/Interpreters/ExpressionAnalyzer.cpp | 9 ++-- src/Interpreters/PreparedSets.cpp | 52 +++++++++++++------ src/Interpreters/PreparedSets.h | 48 ++++++++++------- src/Planner/PlannerContext.cpp | 2 +- .../Transforms/CreatingSetsTransform.cpp | 2 +- 6 files changed, 75 insertions(+), 44 deletions(-) diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index 217a46c5716..cfc874bbd57 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -961,7 +961,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & if (!data.no_makeset && !(data.is_create_parameterized_view && !analyzeReceiveQueryParams(ast).empty())) prepared_set = makeSet(node, data, data.no_subqueries); - if (prepared_set.valid()) + if (prepared_set.isValid()) { /// Transform tuple or subquery into a set. } @@ -1174,7 +1174,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & num_arguments += columns.size() - 1; arg += columns.size() - 1; } - else if (checkFunctionIsInOrGlobalInOperator(node) && arg == 1 && prepared_set.valid()) + else if (checkFunctionIsInOrGlobalInOperator(node) && arg == 1 && prepared_set.isValid()) { ColumnWithTypeAndName column; column.type = std::make_shared(); @@ -1399,7 +1399,7 @@ FutureSet ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no { auto set = data.prepared_sets->getFuture(set_key); - if (set.valid()) + if (set.isValid()) return set; } diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index a05aaf74fbb..584ca840f08 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -452,7 +452,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto set_key = PreparedSetKey::forSubquery(*subquery_or_table_name); - if (prepared_sets->getFuture(set_key).valid()) + if (prepared_sets->getFuture(set_key).isValid()) return; /// Already prepared. if (auto set_ptr_from_storage_set = isPlainStorageSetInSubquery(subquery_or_table_name)) @@ -463,6 +463,8 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto build_set = [&] () -> SetPtr { + LOG_TRACE(getLogger(), "Building set, key: {}", set_key.toString()); + auto interpreter_subquery = interpretSubquery(subquery_or_table_name, getContext(), {}, query_options); auto io = interpreter_subquery->execute(); PullingAsyncPipelineExecutor executor(io.pipeline); @@ -492,16 +494,15 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto set_cache = getContext()->getPreparedSetsCache(); if (set_cache) { - auto from_cache = set_cache->findOrPromiseToBuild(toString(set_key)); + auto from_cache = set_cache->findOrPromiseToBuild(set_key.toString()); if (from_cache.index() == 0) { - LOG_TRACE(getLogger(), "Building set, key: {}:{}", set_key.ast_hash.first, set_key.ast_hash.second); set = build_set(); std::get<0>(from_cache).set_value(set); } else { - LOG_TRACE(getLogger(), "Waiting for set, key: {}:{}", set_key.ast_hash.first, set_key.ast_hash.second); + LOG_TRACE(getLogger(), "Waiting for set, key: {}", set_key.toString()); set = std::get<1>(from_cache).get(); } } diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 9f242bb0693..caa3948a97c 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace DB { @@ -45,6 +46,26 @@ bool PreparedSetKey::operator==(const PreparedSetKey & other) const return true; } +String PreparedSetKey::toString() const +{ + WriteBufferFromOwnString buf; + buf << "__set_" << ast_hash.first << "_" << ast_hash.second; + if (!types.empty()) + { + buf << "("; + bool first = true; + for (const auto & type : types) + { + if (!first) + buf << ","; + first = false; + buf << type->getName(); + } + buf << ")"; + } + return buf.str(); +} + SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, const PreparedSetKey & key, SizeLimits set_size_limit, bool transform_null_in) { @@ -53,7 +74,7 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c /// If you already created a Set with the same subquery / table for another ast /// In that case several PreparedSetKey would share same subquery and set /// Not sure if it's really possible case (maybe for distributed query when set was filled by external table?) - if (subquery.set.valid()) + if (subquery.set.isValid()) sets[key] = subquery.set; // TODO: else { @@ -63,7 +84,7 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c if (!subquery.set_in_progress) { - subquery.key = toString(key); + subquery.key = key.toString(); subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); } @@ -87,7 +108,7 @@ FutureSet PreparedSets::getFuture(const PreparedSetKey & key) const SetPtr PreparedSets::get(const PreparedSetKey & key) const { auto it = sets.find(key); - if (it == sets.end() || it->second.wait_for(std::chrono::seconds(0)) != std::future_status::ready) + if (it == sets.end() || !it->second.isReady()) return nullptr; return it->second.get(); } @@ -143,8 +164,8 @@ FutureSet::FutureSet(SetPtr set) bool FutureSet::isReady() const { - return valid() && - wait_for(std::chrono::seconds(0)) == std::future_status::ready; + return future_set.valid() && + future_set.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } bool FutureSet::isCreated() const @@ -153,7 +174,7 @@ bool FutureSet::isCreated() const } -std::variant, FutureSet> PreparedSetsCache::findOrPromiseToBuild(const String & key) +std::variant, SharedSet> PreparedSetsCache::findOrPromiseToBuild(const String & key) { // auto* log = &Poco::Logger::get("PreparedSetsCache"); @@ -166,19 +187,16 @@ std::variant, FutureSet> PreparedSetsCache::findOrPromiseTo { /// If the set is being built, return its future, but if it's ready and is nullptr then we should retry building it. /// TODO: consider moving retry logic outside of the cache. - if (it->second->future.valid() && - (it->second->future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second->future.get() != nullptr)) - return FutureSet{it->second->future}; + if (it->second.future.valid() && + (it->second.future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second.future.get() != nullptr)) + return it->second.future; } - { - /// Insert the entry into the cache so that other threads can find it and start waiting for the set. - std::promise promise_to_fill_set; - auto entry = std::make_shared(); - entry->future = promise_to_fill_set.get_future(); - cache[key] = entry; - return promise_to_fill_set; - } + /// Insert the entry into the cache so that other threads can find it and start waiting for the set. + std::promise promise_to_fill_set; + Entry & entry = cache[key]; + entry.future = promise_to_fill_set.get_future(); + return promise_to_fill_set; } } diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index ad8b8847aa4..90fa1c19c2a 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -20,16 +20,35 @@ class Set; using SetPtr = std::shared_ptr; class InterpreterSelectWithUnionQuery; -class FutureSet final : public std::shared_future +/// Represents a set in a query that might be referenced at analysis time and built later during execution. +/// Also it can represent a constant set that is ready to use. +/// At analysis stage the FutureSets are created but not necessarily filled. Then for non-constant sets there +/// must be an explicit step to build them before they can be used. +/// FutureSet objects can be stored in PreparedSets and are not intended to be used from multiple threads. +class FutureSet final { public: FutureSet() = default; - explicit FutureSet(const std::shared_future & future) : std::shared_future(future) {} + + /// Create FutureSet from an object that will be created in the future. + explicit FutureSet(const std::shared_future & future_set_) : future_set(future_set_) {} + + /// Create FutureSet from a ready set. explicit FutureSet(SetPtr readySet); + /// The set object will be ready in the future, as oposed to 'null' object when FutureSet is default constructed. + bool isValid() const { return future_set.valid(); } + + /// The the value of SetPtr is ready, but the set object might not have been filled yet. bool isReady() const; + /// The set object is ready and filled. bool isCreated() const; + + SetPtr get() const { chassert(isReady()); return future_set.get(); } + +private: + std::shared_future future_set; }; /// Information on how to build set for the [GLOBAL] IN section. @@ -75,22 +94,18 @@ struct PreparedSetKey bool operator==(const PreparedSetKey & other) const; + String toString() const; + struct Hash { UInt64 operator()(const PreparedSetKey & key) const { return key.ast_hash.first; } }; }; -inline String toString(const PreparedSetKey & key) -{ - return "__set_" + std::to_string(key.ast_hash.first) + "_" + std::to_string(key.ast_hash.second); -} class PreparedSets { public: -// explicit PreparedSets(PreparedSetsCachePtr cache_ = {}) : cache(cache_) {} - using SubqueriesForSets = std::unordered_map; SubqueryForSet & createOrGetSubquery(const String & subquery_id, const PreparedSetKey & key, @@ -121,6 +136,10 @@ private: using PreparedSetsPtr = std::shared_ptr; +/// A reference to a set that is being built by another task. +/// The difference from FutureSet is that this object can be used to wait for the set to be built in another thread. +using SharedSet = std::shared_future; + /// This set cache is used to avoid building the same set multiple times. It is different from PreparedSets in way that /// it can be used across multiple queries. One use case is when we execute the same mutation on multiple parts. In this /// case each part is processed by a separate mutation task but they can share the same set. @@ -129,25 +148,18 @@ using PreparedSetsPtr = std::shared_ptr; class PreparedSetsCache { public: - std::variant, FutureSet> findOrPromiseToBuild(const String & key); + std::variant, SharedSet> findOrPromiseToBuild(const String & key); private: struct Entry { -// std::promise promise; /// The promise is set when the set is built by the first task. - std::shared_future future; /// Other tasks can wait for the set to be built. + SharedSet future; /// Other tasks can wait for the set to be built. }; - using EntryPtr = std::shared_ptr; - - /// Protects just updates to the cache. When we got EntyPtr from the cache we can access it without locking. std::mutex cache_mutex; - std::unordered_map cache; + std::unordered_map cache; }; using PreparedSetsCachePtr = std::shared_ptr; - -//FutureSet makeReadyFutureSet(SetPtr set); - } diff --git a/src/Planner/PlannerContext.cpp b/src/Planner/PlannerContext.cpp index b606cb06ef2..6c3eaca2985 100644 --- a/src/Planner/PlannerContext.cpp +++ b/src/Planner/PlannerContext.cpp @@ -128,7 +128,7 @@ PlannerContext::SetKey PlannerContext::createSetKey(const QueryTreeNodePtr & set void PlannerContext::registerSet(const SetKey & key, PlannerSet planner_set) { - if (!planner_set.getSet().valid()) // TODO + if (!planner_set.getSet().isValid()) // TODO throw Exception(ErrorCodes::LOGICAL_ERROR, "Set must be initialized"); const auto & subquery_node = planner_set.getSubqueryNode(); diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index 3ce3028295b..31b68eb473b 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -61,7 +61,7 @@ void CreatingSetsTransform::startSubquery() else { LOG_TRACE(log, "Waiting for set to be build by another thread."); - FutureSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); + SharedSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); SetPtr ready_set = set_built_by_another_thread.get(); subquery.promise_to_fill_set.set_value(ready_set); done_with_set = true; From 28d0cc974a5872fc5aaa48e61c801834d6f098a1 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 11 Apr 2023 23:19:44 +0200 Subject: [PATCH 222/535] Cleanups --- src/Interpreters/ActionsVisitor.cpp | 9 +-- src/Interpreters/PreparedSets.cpp | 40 ++++++------- src/Interpreters/PreparedSets.h | 8 ++- src/Interpreters/Set.cpp | 20 ------- src/Interpreters/Set.h | 6 +- .../Transforms/CreatingSetsTransform.cpp | 56 ++++++++++++------- .../Transforms/CreatingSetsTransform.h | 1 + src/Storages/MergeTree/RPNBuilder.cpp | 8 +-- 8 files changed, 69 insertions(+), 79 deletions(-) diff --git a/src/Interpreters/ActionsVisitor.cpp b/src/Interpreters/ActionsVisitor.cpp index cfc874bbd57..3bb3ea67e29 100644 --- a/src/Interpreters/ActionsVisitor.cpp +++ b/src/Interpreters/ActionsVisitor.cpp @@ -1182,7 +1182,7 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If the argument is a set given by an enumeration of values (so, the set was already built), give it a unique name, /// so that sets with the same literal representation do not fuse together (they can have different types). const bool is_constant_set = prepared_set.isCreated(); - if (is_constant_set) /// TODO: if the set is from prepared_sets_cache, it might be not empty already but we should not handle it as const! + if (is_constant_set) column.name = data.getUniqueName("__set"); else column.name = child->getColumnName(); @@ -1193,15 +1193,12 @@ void ActionsMatcher::visit(const ASTFunction & node, const ASTPtr & ast, Data & /// If prepared_set is not empty, we have a set made with literals. /// Create a const ColumnSet to make constant folding work if (is_constant_set) - column.column = ColumnConst::create(std::move(column_set), 1); /// TODO: and here we also must not handle set from cache as const! + column.column = ColumnConst::create(std::move(column_set), 1); else column.column = std::move(column_set); data.addColumn(column); } - // TODO: if we added an empty set it means that it has not been built yet. - // We should add a wait for it to be filled somewhere before we access it - argument_types.push_back(column.type); argument_names.push_back(column.name); } @@ -1379,7 +1376,7 @@ void ActionsMatcher::visit(const ASTLiteral & literal, const ASTPtr & /* ast */, FutureSet ActionsMatcher::makeSet(const ASTFunction & node, Data & data, bool no_subqueries) { if (!data.prepared_sets) - return {};//nullptr; + return {}; /** You need to convert the right argument to a set. * This can be a table name, a value, a value enumeration, or a subquery. diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index caa3948a97c..7c1fefc10fc 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -100,7 +100,7 @@ void PreparedSets::set(const PreparedSetKey & key, SetPtr set_) { sets[key] = Fu FutureSet PreparedSets::getFuture(const PreparedSetKey & key) const { auto it = sets.find(key); - if (it == sets.end())// || it->second.wait_for(std::chrono::seconds(0)) != std::future_status::ready) + if (it == sets.end()) return {}; return it->second; } @@ -113,13 +113,13 @@ SetPtr PreparedSets::get(const PreparedSetKey & key) const return it->second.get(); } -std::vector PreparedSets::getByTreeHash(IAST::Hash ast_hash) const +std::vector PreparedSets::getByTreeHash(IAST::Hash ast_hash) const { - std::vector res; + std::vector res; for (const auto & it : this->sets) { if (it.first.ast_hash == ast_hash) - res.push_back(it.second.get()); + res.push_back(it.second); } return res; } @@ -178,26 +178,22 @@ std::variant, SharedSet> PreparedSetsCache::findOrPromiseTo { // auto* log = &Poco::Logger::get("PreparedSetsCache"); - /// Look for existing entry in the cache. + std::lock_guard lock(cache_mutex); + + auto it = cache.find(key); + if (it != cache.end()) { - std::lock_guard lock(cache_mutex); - - auto it = cache.find(key); - if (it != cache.end()) - { - /// If the set is being built, return its future, but if it's ready and is nullptr then we should retry building it. - /// TODO: consider moving retry logic outside of the cache. - if (it->second.future.valid() && - (it->second.future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second.future.get() != nullptr)) - return it->second.future; - } - - /// Insert the entry into the cache so that other threads can find it and start waiting for the set. - std::promise promise_to_fill_set; - Entry & entry = cache[key]; - entry.future = promise_to_fill_set.get_future(); - return promise_to_fill_set; + /// If the set is being built, return its future, but if it's ready and is nullptr then we should retry building it. + if (it->second.future.valid() && + (it->second.future.wait_for(std::chrono::seconds(0)) != std::future_status::ready || it->second.future.get() != nullptr)) + return it->second.future; } + + /// Insert the entry into the cache so that other threads can find it and start waiting for the set. + std::promise promise_to_fill_set; + Entry & entry = cache[key]; + entry.future = promise_to_fill_set.get_future(); + return promise_to_fill_set; } }; diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 90fa1c19c2a..5d5418949ad 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -36,7 +36,7 @@ public: /// Create FutureSet from a ready set. explicit FutureSet(SetPtr readySet); - /// The set object will be ready in the future, as oposed to 'null' object when FutureSet is default constructed. + /// The set object will be ready in the future, as opposed to 'null' object when FutureSet is default constructed. bool isValid() const { return future_set.valid(); } /// The the value of SetPtr is ready, but the set object might not have been filled yet. @@ -102,7 +102,6 @@ struct PreparedSetKey }; }; - class PreparedSets { public: @@ -123,7 +122,7 @@ public: /// Returns all sets that match the given ast hash not checking types /// Used in KeyCondition and MergeTreeIndexConditionBloomFilter to make non exact match for types in PreparedSetKey - std::vector getByTreeHash(IAST::Hash ast_hash) const; + std::vector getByTreeHash(IAST::Hash ast_hash) const; bool empty() const; @@ -148,6 +147,9 @@ using SharedSet = std::shared_future; class PreparedSetsCache { public: + /// Lookup for set in the cache. + /// If it is found, get the future to be able to wait for the set to be built. + /// Otherwise create a promise, build the set and set the promise value. std::variant, SharedSet> findOrPromiseToBuild(const String & key); private: diff --git a/src/Interpreters/Set.cpp b/src/Interpreters/Set.cpp index 68b8e7450c4..a7bea63bd99 100644 --- a/src/Interpreters/Set.cpp +++ b/src/Interpreters/Set.cpp @@ -1,5 +1,3 @@ -#include -#include #include #include @@ -238,25 +236,10 @@ bool Set::insertFromBlock(const Columns & columns) return limits.check(data.getTotalRowCount(), data.getTotalByteCount(), "IN-set", ErrorCodes::SET_SIZE_LIMIT_EXCEEDED); } -void Set::finishInsert() -{ - is_created = true; -// is_created_promise.set_value(); -} - void Set::checkIsCreated() const { if (!is_created.load()) throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: Trying to use set before it has been built."); -// -//// FIXME: each thread must wait on its own copy of the future -// std::shared_future local_is_created_future; -// { -// std::lock_guard lock(is_created_future_mutex); -// local_is_created_future = is_created_future; -// } -// -// local_is_created_future.wait(); } ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) const @@ -266,9 +249,6 @@ ColumnPtr Set::execute(const ColumnsWithTypeAndName & columns, bool negative) co if (0 == num_key_columns) throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: no columns passed to Set::execute method."); -// TODO: in case of ENGINE=Set it is the set can be used and updated "concurrently" -// checkIsCreated(); - auto res = ColumnUInt8::create(); ColumnUInt8::Container & vec_res = res->getData(); vec_res.resize(columns.at(0).column->size()); diff --git a/src/Interpreters/Set.h b/src/Interpreters/Set.h index cbfbe874b35..fff5fa4e1b1 100644 --- a/src/Interpreters/Set.h +++ b/src/Interpreters/Set.h @@ -34,7 +34,6 @@ public: : log(&Poco::Logger::get("Set")), limits(limits_), fill_set_elements(fill_set_elements_), transform_null_in(transform_null_in_) { -// is_created_future = is_created_promise.get_future(); } /** Set can be created either from AST or from a stream of data (subquery result). @@ -50,7 +49,7 @@ public: bool insertFromBlock(const ColumnsWithTypeAndName & columns); /// Call after all blocks were inserted. To get the information that set is already created. - void finishInsert(); + void finishInsert() { is_created = true; } /// finishInsert and isCreated are thread-safe bool isCreated() const { return is_created.load(); } @@ -118,9 +117,6 @@ private: /// Check if set contains all the data. std::atomic is_created = false; -// std::promise is_created_promise; -// mutable std::mutex is_created_future_mutex; -// mutable std::shared_future is_created_future TSA_GUARDED_BY(is_created_future_mutex); /// If in the left part columns contains the same types as the elements of the set. void executeOrdinary( diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index 31b68eb473b..c5be1df2f04 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -43,7 +43,7 @@ void CreatingSetsTransform::work() if (done_with_set && done_with_table) { finishConsume(); - input.close(); // TODO: what is the proper way to finish the input? why input.close() was not called before my changes? + input.close(); } IAccumulatingTransform::work(); @@ -51,21 +51,36 @@ void CreatingSetsTransform::work() void CreatingSetsTransform::startSubquery() { -// TODO: lookup the set in the context->prepared_sets_cache + /// Lookup the set in the cache if we don't need to build table. auto ctx = context.lock(); - if (ctx && ctx->getPreparedSetsCache()) + if (ctx && ctx->getPreparedSetsCache() && !subquery.table) { - auto from_cache = ctx->getPreparedSetsCache()->findOrPromiseToBuild(subquery.key); - if (from_cache.index() == 0) - promise_to_build = std::move(std::get<0>(from_cache)); - else + /// Try to find the set in the cache and wait for it to be built. + /// Retry if the set from cache fails to be built. + while (true) { - LOG_TRACE(log, "Waiting for set to be build by another thread."); - SharedSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); - SetPtr ready_set = set_built_by_another_thread.get(); - subquery.promise_to_fill_set.set_value(ready_set); - done_with_set = true; - subquery.set_in_progress.reset(); + auto from_cache = ctx->getPreparedSetsCache()->findOrPromiseToBuild(subquery.key); + if (from_cache.index() == 0) + { + promise_to_build = std::move(std::get<0>(from_cache)); + } + else + { + LOG_TRACE(log, "Waiting for set to be build by another thread, key: {}", subquery.key); + SharedSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); + SetPtr ready_set = set_built_by_another_thread.get(); + if (!ready_set) + { + LOG_TRACE(log, "Failed to use set from cache, key: {}", subquery.key); + continue; + } + + subquery.promise_to_fill_set.set_value(ready_set); + subquery.set_in_progress.reset(); + done_with_set = true; + set_from_cache = true; + } + break; } } @@ -81,9 +96,8 @@ void CreatingSetsTransform::startSubquery() done_with_set = !subquery.set_in_progress; done_with_table = !subquery.table; -// TODO: properly do this check -// if (done_with_set /*&& done_with_join*/ && done_with_table) -// throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: nothing to do with subquery"); + if ((done_with_set && !set_from_cache) /*&& done_with_join*/ && done_with_table) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error: nothing to do with subquery"); if (table_out.initialized()) { @@ -94,10 +108,14 @@ void CreatingSetsTransform::startSubquery() void CreatingSetsTransform::finishSubquery() { - if (read_rows != 0) - { - auto seconds = watch.elapsedNanoseconds() / 1e9; + auto seconds = watch.elapsedNanoseconds() / 1e9; + if (set_from_cache) + { + LOG_DEBUG(log, "Got set from cache in {} sec.", seconds); + } + else if (read_rows != 0) + { if (subquery.set_in_progress) LOG_DEBUG(log, "Created Set with {} entries from {} rows in {} sec.", subquery.set_in_progress->getTotalRowCount(), read_rows, seconds); if (subquery.table) diff --git a/src/Processors/Transforms/CreatingSetsTransform.h b/src/Processors/Transforms/CreatingSetsTransform.h index c2ce8629bef..26bbc45933d 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.h +++ b/src/Processors/Transforms/CreatingSetsTransform.h @@ -48,6 +48,7 @@ private: QueryPipeline table_out; std::unique_ptr executor; UInt64 read_rows = 0; + bool set_from_cache = false; Stopwatch watch; bool done_with_set = true; diff --git a/src/Storages/MergeTree/RPNBuilder.cpp b/src/Storages/MergeTree/RPNBuilder.cpp index 7c8b3083842..e49459d3d17 100644 --- a/src/Storages/MergeTree/RPNBuilder.cpp +++ b/src/Storages/MergeTree/RPNBuilder.cpp @@ -305,8 +305,8 @@ ConstSetPtr RPNBuilderTreeNode::tryGetPreparedSet() const { auto prepared_sets_with_same_hash = prepared_sets->getByTreeHash(ast_node->getTreeHash()); for (auto & set : prepared_sets_with_same_hash) - if (set->isCreated()) - return set; + if (set.isCreated()) + return set.get(); } else if (dag_node) { @@ -368,8 +368,8 @@ ConstSetPtr RPNBuilderTreeNode::tryGetPreparedSet( auto tree_hash = ast_node->getTreeHash(); for (const auto & set : prepared_sets->getByTreeHash(tree_hash)) { - if (types_match(set)) - return set; + if (set.isCreated() && types_match(set.get())) + return set.get(); } } else From 84cb2ff879fc224aa8694ecafa850affc90b6eba Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 2 Jul 2018 22:37:04 +0300 Subject: [PATCH 223/535] Added setting "use_index_for_in_with_subqueries_max_values" #2571 --- src/Core/Settings.h | 1 + src/Interpreters/ExpressionAnalyzer.cpp | 8 ++++++-- src/Interpreters/ExpressionAnalyzer.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index c47432ae14a..113a717f093 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -302,6 +302,7 @@ class IColumn; M(Bool, http_skip_not_found_url_for_globs, true, "Skip url's for globs with HTTP_NOT_FOUND error", 0) \ M(Bool, optimize_throw_if_noop, false, "If setting is enabled and OPTIMIZE query didn't actually assign a merge then an explanatory exception is thrown", 0) \ M(Bool, use_index_for_in_with_subqueries, true, "Try using an index if there is a subquery or a table expression on the right side of the IN operator.", 0) \ + M(UInt64, use_index_for_in_with_subqueries_max_values, 0, "Don't use index of a table for filtering by right hand size of the IN operator if the size of set is larger than specified threshold. This allows to avoid performance degradation and higher memory usage due to preparation of additional data structures.", 0) \ M(Bool, joined_subquery_requires_alias, true, "Force joined subqueries and table functions to have aliases for correct name qualification.", 0) \ M(Bool, empty_result_for_aggregation_by_empty_set, false, "Return empty result when aggregating without keys on empty set.", 0) \ M(Bool, empty_result_for_aggregation_by_constant_keys_on_empty_set, true, "Return empty result when aggregating by constant keys on empty set.", 0) \ diff --git a/src/Interpreters/ExpressionAnalyzer.cpp b/src/Interpreters/ExpressionAnalyzer.cpp index 584ca840f08..cc54e7620f6 100644 --- a/src/Interpreters/ExpressionAnalyzer.cpp +++ b/src/Interpreters/ExpressionAnalyzer.cpp @@ -149,6 +149,11 @@ ExpressionAnalyzerData::~ExpressionAnalyzerData() = default; ExpressionAnalyzer::ExtractedSettings::ExtractedSettings(const Settings & settings_) : use_index_for_in_with_subqueries(settings_.use_index_for_in_with_subqueries) , size_limits_for_set(settings_.max_rows_in_set, settings_.max_bytes_in_set, settings_.set_overflow_mode) + , size_limits_for_set_used_with_index( + (settings_.use_index_for_in_with_subqueries_max_values && + settings_.use_index_for_in_with_subqueries_max_values < settings_.max_rows_in_set) ? + size_limits_for_set : + SizeLimits(settings_.use_index_for_in_with_subqueries_max_values, settings_.max_bytes_in_set, OverflowMode::BREAK)) , distributed_group_by_no_merge(settings_.distributed_group_by_no_merge) {} @@ -469,8 +474,7 @@ void ExpressionAnalyzer::tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_ auto io = interpreter_subquery->execute(); PullingAsyncPipelineExecutor executor(io.pipeline); - SizeLimits size_limits_for_key_condition_sets(0, 400*1024*1024, OverflowMode::BREAK); - SetPtr set = std::make_shared(size_limits_for_key_condition_sets, true, getContext()->getSettingsRef().transform_null_in); + SetPtr set = std::make_shared(settings.size_limits_for_set_used_with_index, true, getContext()->getSettingsRef().transform_null_in); set->setHeader(executor.getHeader().getColumnsWithTypeAndName()); Block block; diff --git a/src/Interpreters/ExpressionAnalyzer.h b/src/Interpreters/ExpressionAnalyzer.h index 1676cb506c0..1b6e8e24091 100644 --- a/src/Interpreters/ExpressionAnalyzer.h +++ b/src/Interpreters/ExpressionAnalyzer.h @@ -95,6 +95,7 @@ private: { const bool use_index_for_in_with_subqueries; const SizeLimits size_limits_for_set; + const SizeLimits size_limits_for_set_used_with_index; const UInt64 distributed_group_by_no_merge; explicit ExtractedSettings(const Settings & settings_); From 633aaa73aa6cd4e1c0eada812b2c991a855dd1a7 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 12 Apr 2023 19:29:38 +0200 Subject: [PATCH 224/535] Use use_index_for_in_with_subqueries_max_values setting to limit sizes of sets used in KeyCondition --- src/Storages/MergeTree/KeyCondition.cpp | 7 ------- src/Storages/MergeTree/MutateTask.cpp | 9 ++------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index b9fc04b9d54..5c71804ef27 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -1202,13 +1202,6 @@ bool KeyCondition::tryPrepareSetIndex( for (size_t i = 0; i < indexes_mapping.size(); ++i) prepared_set->checkTypesEqual(indexes_mapping[i].tuple_index, data_types[i]); - /// Do not use index for large sets. Because building MergeTreeSetIndex consumes several times more memory than the set itself. - /// TODO: make this limit configurable? - /// TODO: consider adding range from min to max values from the prepared set. - if (//prepared_set->getTotalRowCount() > 100000000 || - prepared_set->getTotalByteCount() > 400000000) - return false; - out.set_index = std::make_shared(prepared_set->getSetElements(), std::move(indexes_mapping)); return true; diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index 5d9528fd895..a3fa210ac42 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1724,10 +1724,8 @@ bool MutateTask::prepare() /// Allow mutations to work when force_index_by_date or force_primary_key is on. context_for_reading->setSetting("force_index_by_date", false); context_for_reading->setSetting("force_primary_key", false); - -// /// Skip using large sets in keyCondition -// context_for_reading->setSetting("max_bytes_in_set", 50*1000*1000); -// context_for_reading->setSetting("set_overflow_mode", String("break")); + /// Skip using large sets in KeyCondition + context_for_reading->setSetting("use_index_for_in_with_subqueries_max_values", 100000); for (const auto & command : *ctx->commands) if (!canSkipMutationCommandForPart(ctx->source_part, command, context_for_reading)) @@ -1777,9 +1775,6 @@ bool MutateTask::prepare() context_for_reading->setSetting("max_threads", 1); context_for_reading->setSetting("allow_asynchronous_read_from_io_pool_for_merge_tree", false); context_for_reading->setSetting("max_streams_for_merge_tree_reading", Field(0)); - /// Restore settings for large sets. - context_for_reading->setSetting("max_bytes_in_set", ctx->context->getSettings().max_bytes_in_set.value); - context_for_reading->setSetting("set_overflow_mode", ctx->context->getSettings().set_overflow_mode.toString()); MutationHelpers::splitAndModifyMutationCommands(ctx->source_part, ctx->commands_for_part, ctx->for_interpreter, ctx->for_file_renames); From 09775ea8057ba186b1cb2320481d4ca4fb105aef Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 12 Apr 2023 20:09:59 +0200 Subject: [PATCH 225/535] Make tests more resilient to set size limit --- .../02581_share_big_sets_between_mutation_tasks.sql | 6 +++--- .../02581_share_big_sets_between_mutation_tasks_long.sql | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql index cb98aa5b97e..e6f99f7db46 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql @@ -4,9 +4,9 @@ CREATE TABLE 02581_trips(id UInt32, description String) ENGINE=MergeTree ORDER B -- Make multiple parts INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+100000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+200000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+300000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+10000000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+20000000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+30000000, '' FROM numbers(10000); SELECT count() from 02581_trips; diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql index 1aadc9203fb..116901622fe 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql @@ -6,9 +6,9 @@ CREATE TABLE 02581_trips(id UInt32, description String, id2 UInt32, PRIMARY KEY -- Make multiple parts INSERT INTO 02581_trips SELECT number, '', number FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+100000, '', number FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+200000, '', number FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+300000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+10000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+20000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+30000000, '', number FROM numbers(10000); SELECT count() from 02581_trips WHERE description = ''; From 7a381e9232ae89110d25f296af853d97fd24b180 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:11:16 +0200 Subject: [PATCH 226/535] Added enable_sharing_sets_for_mutations setting --- src/Core/Settings.h | 1 + src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 113a717f093..87e765c6c72 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -570,6 +570,7 @@ class IColumn; M(Bool, query_cache_squash_partial_results, true, "Squash partial result blocks to blocks of size 'max_block_size'. Reduces performance of inserts into the query cache but improves the compressability of cache entries.", 0) \ M(Seconds, query_cache_ttl, 60, "After this time in seconds entries in the query cache become stale", 0) \ M(Bool, query_cache_share_between_users, false, "Allow other users to read entry in the query cache", 0) \ + M(Bool, enable_sharing_sets_for_mutations, true, "Allow sharing set objects build for IN subqueries between different tasks of the same mutation. This reduces memory usage and CPU consumption", 0) \ \ M(Bool, optimize_rewrite_sum_if_to_count_if, false, "Rewrite sumIf() and sum(if()) function countIf() function when logically equivalent", 0) \ M(Bool, optimize_rewrite_aggregate_function_with_if, true, "Rewrite aggregate functions with if expression as argument when logically equivalent. For example, avg(if(cond, col, null)) can be rewritten to avgIf(cond, col)", 0) \ diff --git a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp index e920213538f..04effdb8894 100644 --- a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp +++ b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp @@ -52,9 +52,13 @@ void MutatePlainMergeTreeTask::prepare() std::move(profile_counters_snapshot)); }; - auto mutation_id = future_part->part_info.mutation; - auto prepared_sets_cache_for_mutation = storage.getPreparedSetsCache(mutation_id); - task_context->setPreparedSetsCache(prepared_sets_cache_for_mutation); + if (task_context->getSettingsRef().enable_sharing_sets_for_mutations) + { + /// If we have a prepared sets cache for this mutations, we will use it. + auto mutation_id = future_part->part_info.mutation; + auto prepared_sets_cache_for_mutation = storage.getPreparedSetsCache(mutation_id); + task_context->setPreparedSetsCache(prepared_sets_cache_for_mutation); + } mutate_task = storage.merger_mutator.mutatePartToTemporaryPart( future_part, metadata_snapshot, merge_mutate_entry->commands, merge_list_entry.get(), From 6854dd064fa775bbcadfcc59bd79aede4468f243 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:54:03 +0200 Subject: [PATCH 227/535] More detailed test --- ..._big_sets_between_mutation_tasks.reference | 24 +++++++++++++++---- ..._share_big_sets_between_mutation_tasks.sql | 17 +++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference index 030f548efcd..18e83d1244a 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.reference @@ -1,5 +1,19 @@ -40000 -all_1_1_0 -all_2_2_0 -all_3_3_0 -all_4_4_0 +-- { echoOn } +SELECT count(), _part FROM 02581_trips GROUP BY _part ORDER BY _part; +10000 all_1_1_0 +10000 all_2_2_0 +10000 all_3_3_0 +10000 all_4_4_0 +-- Run mutation with a 'IN big subquery' +ALTER TABLE 02581_trips UPDATE description='1' WHERE id IN (SELECT (number*10+1)::UInt32 FROM numbers(10000000)) SETTINGS mutations_sync=2; +SELECT count(), _part FROM 02581_trips WHERE description = '' GROUP BY _part ORDER BY _part; +9000 all_1_1_0_5 +9000 all_2_2_0_5 +9000 all_3_3_0_5 +9000 all_4_4_0_5 +ALTER TABLE 02581_trips UPDATE description='2' WHERE id IN (SELECT (number*10+2)::UInt32 FROM numbers(10000)) SETTINGS mutations_sync=2; +SELECT count(), _part FROM 02581_trips WHERE description = '' GROUP BY _part ORDER BY _part; +8000 all_1_1_0_6 +8000 all_2_2_0_6 +8000 all_3_3_0_6 +8000 all_4_4_0_6 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql index e6f99f7db46..fc90582d20e 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks.sql @@ -4,15 +4,18 @@ CREATE TABLE 02581_trips(id UInt32, description String) ENGINE=MergeTree ORDER B -- Make multiple parts INSERT INTO 02581_trips SELECT number, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+10000000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+20000000, '' FROM numbers(10000); -INSERT INTO 02581_trips SELECT number+30000000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+10000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+20000, '' FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+30000, '' FROM numbers(10000); -SELECT count() from 02581_trips; - -SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; +-- { echoOn } +SELECT count(), _part FROM 02581_trips GROUP BY _part ORDER BY _part; -- Run mutation with a 'IN big subquery' -ALTER TABLE 02581_trips UPDATE description='' WHERE id IN (SELECT (number+5)::UInt32 FROM numbers(10000000)) SETTINGS mutations_sync=2; +ALTER TABLE 02581_trips UPDATE description='1' WHERE id IN (SELECT (number*10+1)::UInt32 FROM numbers(10000000)) SETTINGS mutations_sync=2; +SELECT count(), _part FROM 02581_trips WHERE description = '' GROUP BY _part ORDER BY _part; +ALTER TABLE 02581_trips UPDATE description='2' WHERE id IN (SELECT (number*10+2)::UInt32 FROM numbers(10000)) SETTINGS mutations_sync=2; +SELECT count(), _part FROM 02581_trips WHERE description = '' GROUP BY _part ORDER BY _part; +-- { echoOff } DROP TABLE 02581_trips; From 9e93ddc689b0846a37063a1befad268418e47d7d Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:59:53 +0200 Subject: [PATCH 228/535] Test with multiple mutations --- ...en_multiple_mutations_tasks_long.reference | 9 +++++++ ..._between_multiple_mutations_tasks_long.sql | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.reference create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.reference b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.reference new file mode 100644 index 00000000000..3a92fcf283d --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.reference @@ -0,0 +1,9 @@ +40000 +all_1_1_0 +all_2_2_0 +all_3_3_0 +all_4_4_0 +5000 all_1_1_0_9 +5000 all_2_2_0_9 +5000 all_3_3_0_9 +5000 all_4_4_0_9 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql new file mode 100644 index 00000000000..368ab084bba --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql @@ -0,0 +1,27 @@ +-- Tags: long, no-tsan, no-asan, no-ubsan, no-msan + +DROP TABLE IF EXISTS 02581_trips; + +CREATE TABLE 02581_trips(id UInt32, description String, id2 UInt32, PRIMARY KEY id) ENGINE=MergeTree ORDER BY id; + +-- Make multiple parts +INSERT INTO 02581_trips SELECT number, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+10000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+20000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+30000000, '', number FROM numbers(10000); + +SELECT count() from 02581_trips WHERE description = ''; + +SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; + +-- Start multiple mutations simultaneously +SYSTEM STOP MERGES 02581_trips; +ALTER TABLE 02581_trips UPDATE description='5' WHERE id IN (SELECT (number*10 + 5)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=0; +ALTER TABLE 02581_trips UPDATE description='6' WHERE id IN (SELECT (number*10 + 6)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=0; +ALTER TABLE 02581_trips DELETE WHERE id IN (SELECT (number*10 + 7)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=0; +ALTER TABLE 02581_trips UPDATE description='8' WHERE id IN (SELECT (number*10 + 8)::UInt32 FROM numbers(200000000)) SETTINGS mutations_sync=0; +SYSTEM START MERGES 02581_trips; +DELETE FROM 02581_trips WHERE id IN (SELECT (number*10 + 9)::UInt32 FROM numbers(200000000)); +SELECT count(), _part from 02581_trips WHERE description = '' GROUP BY _part ORDER BY _part; + +DROP TABLE 02581_trips; From a7b05589b6decb42553450a9ce39688133cec870 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 16:04:30 +0200 Subject: [PATCH 229/535] Caches for multiple mutations --- src/Storages/StorageMergeTree.cpp | 21 +++++++++++++++++---- src/Storages/StorageMergeTree.h | 3 +-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index 86d4d2e5b67..5513603bca6 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -2184,16 +2184,29 @@ std::unique_ptr StorageMergeTree::getDefaultSettings() const PreparedSetsCachePtr StorageMergeTree::getPreparedSetsCache(Int64 mutation_id) { auto l = std::lock_guard(mutation_prepared_sets_cache_mutex); - if (mutation_id_of_prepared_sets_cache == mutation_id) + + /// Cleanup stale entries where the shared_ptr is expired. + while (!mutation_prepared_sets_cache.empty()) { - auto existing_set_cache = mutation_prepared_sets_cache.lock(); + auto it = mutation_prepared_sets_cache.begin(); + if (it->second.lock()) + break; + mutation_prepared_sets_cache.erase(it); + } + + /// Look up an existing entry. + auto it = mutation_prepared_sets_cache.find(mutation_id); + if (it != mutation_prepared_sets_cache.end()) + { + /// If the entry is still alive, return it. + auto existing_set_cache = it->second.lock(); if (existing_set_cache) return existing_set_cache; } + /// Create new entry. auto cache = std::make_shared(); - mutation_prepared_sets_cache = cache; - mutation_id_of_prepared_sets_cache = mutation_id; + mutation_prepared_sets_cache[mutation_id] = cache; return cache; } diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index 8f41af325df..6f8acf9965a 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -156,8 +156,7 @@ private: /// The goal is to avoiding consuming a lot of memory when the same big sets are used by multiple tasks at the same time. /// If the tasks are executed without time overlap, we will destroy the cache to free memory, and the next task might rebuild the same sets. std::mutex mutation_prepared_sets_cache_mutex; - PreparedSetsCachePtr::weak_type mutation_prepared_sets_cache; - Int64 mutation_id_of_prepared_sets_cache = 0; + std::map mutation_prepared_sets_cache; void loadMutations(); From 3260341b01c644a8360b28f4a8c31846b0631048 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:48:17 +0200 Subject: [PATCH 230/535] Test case with different types of columns --- ...hare_big_sets_between_mutation_tasks_long.sql | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql index 116901622fe..97cf979e80a 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_long.sql @@ -46,16 +46,12 @@ WHERE SETTINGS mutations_sync=2; SELECT count() from 02581_trips WHERE description = ''; - - -CREATE TABLE 02581_set (id UInt32) ENGINE = Set; - -INSERT INTO 02581_set SELECT number*10+6 FROM numbers(200000000); - --- Run mutation with non-PK `id2` IN big subquery -ALTER TABLE 02581_trips UPDATE description='d' WHERE id IN 02581_set SETTINGS mutations_sync=2; +-- Run mutation with PK and non-PK IN big subquery +ALTER TABLE 02581_trips UPDATE description='c' +WHERE + (id::UInt32 IN (SELECT (number*10 + 6)::UInt32 FROM numbers(200000000))) OR + ((id2+1)::String IN (SELECT (number*10 + 6)::UInt32 FROM numbers(200000000))) +SETTINGS mutations_sync=2; SELECT count() from 02581_trips WHERE description = ''; - -DROP TABLE 02581_set; DROP TABLE 02581_trips; From 1454e84741a1ccf15576e17914539356a8fdd96e Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:48:45 +0200 Subject: [PATCH 231/535] Test with IN StorageSet --- ..._mutation_tasks_with_storage_set.reference | 7 ++++ ...etween_mutation_tasks_with_storage_set.sql | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.reference create mode 100644 tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.sql diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.reference b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.reference new file mode 100644 index 00000000000..267105947b9 --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.reference @@ -0,0 +1,7 @@ +40000 +all_1_1_0 +all_2_2_0 +all_3_3_0 +all_4_4_0 +36000 +32000 diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.sql b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.sql new file mode 100644 index 00000000000..9a14f78628b --- /dev/null +++ b/tests/queries/0_stateless/02581_share_big_sets_between_mutation_tasks_with_storage_set.sql @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS 02581_trips; + +CREATE TABLE 02581_trips(id UInt32, description String, id2 UInt32, PRIMARY KEY id) ENGINE=MergeTree ORDER BY id; + +-- Make multiple parts +INSERT INTO 02581_trips SELECT number, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+10000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+20000000, '', number FROM numbers(10000); +INSERT INTO 02581_trips SELECT number+30000000, '', number FROM numbers(10000); + +SELECT count() from 02581_trips WHERE description = ''; + + +SELECT name FROM system.parts WHERE database=currentDatabase() AND table = '02581_trips' AND active ORDER BY name; + +CREATE TABLE 02581_set (id UInt32) ENGINE = Set; + +INSERT INTO 02581_set SELECT number*10+7 FROM numbers(10000000); + +-- Run mutation with PK `id` IN big set +ALTER TABLE 02581_trips UPDATE description='d' WHERE id IN 02581_set SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + +INSERT INTO 02581_set SELECT number*10+8 FROM numbers(10000000); + +-- Run mutation with PK `id` IN big set after it is updated +ALTER TABLE 02581_trips UPDATE description='d' WHERE id IN 02581_set SETTINGS mutations_sync=2; +SELECT count() from 02581_trips WHERE description = ''; + + +DROP TABLE 02581_set; +DROP TABLE 02581_trips; From 4dfad9ed9d5f01639ad2953d403da860f64d3b63 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Fri, 14 Apr 2023 14:33:33 +0000 Subject: [PATCH 232/535] Try to fix flaky intergration test test_storage_mysql/test.py:test_settings_connection_wait_timeout --- tests/integration/test_storage_mysql/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_storage_mysql/test.py b/tests/integration/test_storage_mysql/test.py index 263771bcfa0..2ac24ac00bc 100644 --- a/tests/integration/test_storage_mysql/test.py +++ b/tests/integration/test_storage_mysql/test.py @@ -531,7 +531,7 @@ def test_settings_connection_wait_timeout(started_cluster): worker_thread.start() # ensure that first query started in worker_thread - worker_started_event.wait(10) + assert worker_started_event.wait(20) started = time.time() with pytest.raises( From 018f768e7ef82ab0639133254393d12908d11094 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Thu, 13 Apr 2023 18:24:57 +0200 Subject: [PATCH 233/535] Cleanups --- src/Interpreters/PreparedSets.cpp | 4 +--- src/Interpreters/PreparedSets.h | 4 ++-- src/Planner/CollectSets.cpp | 2 +- src/Planner/Planner.cpp | 5 ++--- src/Planner/PlannerActionsVisitor.cpp | 1 - src/Planner/PlannerContext.cpp | 4 ++-- src/Planner/PlannerContext.h | 12 ++++++++---- src/Processors/QueryPlan/CreatingSetsStep.cpp | 2 +- src/Processors/Transforms/CreatingSetsTransform.cpp | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 7c1fefc10fc..7b0efddae87 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -75,7 +75,7 @@ SubqueryForSet & PreparedSets::createOrGetSubquery(const String & subquery_id, c /// In that case several PreparedSetKey would share same subquery and set /// Not sure if it's really possible case (maybe for distributed query when set was filled by external table?) if (subquery.set.isValid()) - sets[key] = subquery.set; // TODO: + sets[key] = subquery.set; else { subquery.set_in_progress = std::make_shared(set_size_limit, false, transform_null_in); @@ -176,8 +176,6 @@ bool FutureSet::isCreated() const std::variant, SharedSet> PreparedSetsCache::findOrPromiseToBuild(const String & key) { -// auto* log = &Poco::Logger::get("PreparedSetsCache"); - std::lock_guard lock(cache_mutex); auto it = cache.find(key); diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index 5d5418949ad..4a7d1c3de46 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -67,6 +67,8 @@ public: /// Build this set from the result of the subquery. String key; SetPtr set_in_progress; + /// After set_in_progress is finished it will be put into promise_to_fill_set and thus all FutureSet's + /// that are referencing this set will be filled. std::promise promise_to_fill_set; FutureSet set = FutureSet{promise_to_fill_set.get_future()}; @@ -142,8 +144,6 @@ using SharedSet = std::shared_future; /// This set cache is used to avoid building the same set multiple times. It is different from PreparedSets in way that /// it can be used across multiple queries. One use case is when we execute the same mutation on multiple parts. In this /// case each part is processed by a separate mutation task but they can share the same set. - -/// TODO: need to distinguish between sets with and w/o set_elements! class PreparedSetsCache { public: diff --git a/src/Planner/CollectSets.cpp b/src/Planner/CollectSets.cpp index 0081a0ff6ac..02069aad292 100644 --- a/src/Planner/CollectSets.cpp +++ b/src/Planner/CollectSets.cpp @@ -53,7 +53,7 @@ public: if (storage_set) { - /// TODO: need to handle storage_set as not-yet-built set? + /// Handle storage_set as ready set. planner_context.registerSet(set_key, PlannerSet(FutureSet(storage_set->getSet()))); } else if (const auto * constant_node = in_second_argument->as()) diff --git a/src/Planner/Planner.cpp b/src/Planner/Planner.cpp index 297907e9245..d036c895fbb 100644 --- a/src/Planner/Planner.cpp +++ b/src/Planner/Planner.cpp @@ -890,7 +890,7 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, for (const auto & node : actions_to_execute->getNodes()) { const auto & set_key = node.result_name; - const auto * planner_set = planner_context->getSetOrNull(set_key); + auto * planner_set = planner_context->getSetOrNull(set_key); if (!planner_set) continue; @@ -909,12 +909,11 @@ void addBuildSubqueriesForSetsStepIfNeeded(QueryPlan & query_plan, bool tranform_null_in = settings.transform_null_in; auto set = std::make_shared(size_limits_for_set, false /*fill_set_elements*/, tranform_null_in); - /// TODO: cleanup this initialization SubqueryForSet subquery_for_set; subquery_for_set.key = set_key; subquery_for_set.set_in_progress = set; - subquery_for_set.promise_to_fill_set = planner_set->getPromiseToBuildSet(); subquery_for_set.set = planner_set->getSet(); + subquery_for_set.promise_to_fill_set = planner_set->extractPromiseToBuildSet(); subquery_for_set.source = std::make_unique(std::move(subquery_planner).extractQueryPlan()); subqueries_for_sets.emplace(set_key, std::move(subquery_for_set)); diff --git a/src/Planner/PlannerActionsVisitor.cpp b/src/Planner/PlannerActionsVisitor.cpp index 83172d39d25..c64d82299ca 100644 --- a/src/Planner/PlannerActionsVisitor.cpp +++ b/src/Planner/PlannerActionsVisitor.cpp @@ -632,7 +632,6 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::ma column.name = set_key; column.type = std::make_shared(); - /// TODO: Properly fix this to use FutureSet for non-yet-created sets. bool set_is_created = planner_set.getSet().isCreated(); auto column_set = ColumnSet::create(1, planner_set.getSet()); diff --git a/src/Planner/PlannerContext.cpp b/src/Planner/PlannerContext.cpp index 6c3eaca2985..346cc6d2080 100644 --- a/src/Planner/PlannerContext.cpp +++ b/src/Planner/PlannerContext.cpp @@ -128,7 +128,7 @@ PlannerContext::SetKey PlannerContext::createSetKey(const QueryTreeNodePtr & set void PlannerContext::registerSet(const SetKey & key, PlannerSet planner_set) { - if (!planner_set.getSet().isValid()) // TODO + if (!planner_set.getSet().isValid()) throw Exception(ErrorCodes::LOGICAL_ERROR, "Set must be initialized"); const auto & subquery_node = planner_set.getSubqueryNode(); @@ -162,7 +162,7 @@ const PlannerSet & PlannerContext::getSetOrThrow(const SetKey & key) const return it->second; } -const PlannerSet * PlannerContext::getSetOrNull(const SetKey & key) const +PlannerSet * PlannerContext::getSetOrNull(const SetKey & key) { auto it = set_key_to_set.find(key); if (it == set_key_to_set.end()) diff --git a/src/Planner/PlannerContext.h b/src/Planner/PlannerContext.h index 22c32b9139d..ccc4ab43638 100644 --- a/src/Planner/PlannerContext.h +++ b/src/Planner/PlannerContext.h @@ -67,7 +67,7 @@ public: , subquery_node(std::move(subquery_node_)) {} - /// Get set + /// Get a reference to a set that might be not built yet const FutureSet & getSet() const { return set; @@ -79,10 +79,14 @@ public: return subquery_node; } - std::promise getPromiseToBuildSet() const { return std::move(promise_to_build_set); } + /// This promise will be fulfilled when set is built and all FutureSet objects will become ready + std::promise extractPromiseToBuildSet() + { + return std::move(promise_to_build_set); + } private: - mutable std::promise promise_to_build_set; // FIXME: mutable is a hack + std::promise promise_to_build_set; FutureSet set; QueryTreeNodePtr subquery_node; @@ -190,7 +194,7 @@ public: const PlannerSet & getSetOrThrow(const SetKey & key) const; /// Get set for key, if no set is registered null is returned - const PlannerSet * getSetOrNull(const SetKey & key) const; + PlannerSet * getSetOrNull(const SetKey & key); /// Get registered sets const SetKeyToSet & getRegisteredSets() const diff --git a/src/Processors/QueryPlan/CreatingSetsStep.cpp b/src/Processors/QueryPlan/CreatingSetsStep.cpp index a5081b8da46..9eec3e90494 100644 --- a/src/Processors/QueryPlan/CreatingSetsStep.cpp +++ b/src/Processors/QueryPlan/CreatingSetsStep.cpp @@ -68,7 +68,7 @@ void CreatingSetStep::describeActions(FormatSettings & settings) const void CreatingSetStep::describeActions(JSONBuilder::JSONMap & map) const { -// if (subquery_for_set.set_in_progress) + if (subquery_for_set.set_in_progress) map.add("Set", description); } diff --git a/src/Processors/Transforms/CreatingSetsTransform.cpp b/src/Processors/Transforms/CreatingSetsTransform.cpp index c5be1df2f04..e3ae2d4fd4e 100644 --- a/src/Processors/Transforms/CreatingSetsTransform.cpp +++ b/src/Processors/Transforms/CreatingSetsTransform.cpp @@ -68,7 +68,7 @@ void CreatingSetsTransform::startSubquery() { LOG_TRACE(log, "Waiting for set to be build by another thread, key: {}", subquery.key); SharedSet set_built_by_another_thread = std::move(std::get<1>(from_cache)); - SetPtr ready_set = set_built_by_another_thread.get(); + const SetPtr & ready_set = set_built_by_another_thread.get(); if (!ready_set) { LOG_TRACE(log, "Failed to use set from cache, key: {}", subquery.key); From 034dce58f135874e0a6e9c479e6b03bba08a61b6 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:11:24 +0200 Subject: [PATCH 234/535] Disable long test in debug --- ...581_share_big_sets_between_multiple_mutations_tasks_long.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql index 368ab084bba..92e372d0cdb 100644 --- a/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql +++ b/tests/queries/0_stateless/02581_share_big_sets_between_multiple_mutations_tasks_long.sql @@ -1,4 +1,4 @@ --- Tags: long, no-tsan, no-asan, no-ubsan, no-msan +-- Tags: long, no-debug, no-tsan, no-asan, no-ubsan, no-msan DROP TABLE IF EXISTS 02581_trips; From 9e92c26d53c1628ea29623601b57eb5b817ac125 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Fri, 14 Apr 2023 20:10:57 +0000 Subject: [PATCH 235/535] Fix test_storage_mysql/test.py::test_settings_connection_wait_timeout --- src/Storages/StorageMySQL.h | 4 ---- tests/integration/test_storage_mysql/test.py | 7 ++++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Storages/StorageMySQL.h b/src/Storages/StorageMySQL.h index b7773066bf0..1c0e2639717 100644 --- a/src/Storages/StorageMySQL.h +++ b/src/Storages/StorageMySQL.h @@ -49,10 +49,6 @@ public: size_t max_block_size, size_t num_streams) override; - /// FIXME: enable parallelization later, currently it makes mysql intergation test flaky, - /// see test_storage_mysql/test.py::test_settings_connection_wait_timeout - bool parallelizeOutputAfterReading() const override { return false; } - SinkToStoragePtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, ContextPtr context) override; struct Configuration diff --git a/tests/integration/test_storage_mysql/test.py b/tests/integration/test_storage_mysql/test.py index 2ac24ac00bc..aed58fce1df 100644 --- a/tests/integration/test_storage_mysql/test.py +++ b/tests/integration/test_storage_mysql/test.py @@ -524,14 +524,15 @@ def test_settings_connection_wait_timeout(started_cluster): def worker(): worker_started_event.set() node1.query( - "SELECT sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) + "SELECT 1, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) ) worker_thread = threading.Thread(target=worker) worker_thread.start() # ensure that first query started in worker_thread - assert worker_started_event.wait(20) + assert worker_started_event.wait(10) + time.sleep(1) started = time.time() with pytest.raises( @@ -539,7 +540,7 @@ def test_settings_connection_wait_timeout(started_cluster): match=r"Exception: mysqlxx::Pool is full \(connection_wait_timeout is exceeded\)", ): node1.query( - "SELECT sleepEachRow(1) FROM {} settings max_threads=1".format(table_name) + "SELECT 2, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) ) ended = time.time() assert (ended - started) >= wait_timeout From 6c03b2ef0c179334ed2b0306022e825bca61f3af Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 14 Apr 2023 20:38:11 +0000 Subject: [PATCH 236/535] Automatic style fix --- tests/integration/test_storage_mysql/test.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_storage_mysql/test.py b/tests/integration/test_storage_mysql/test.py index aed58fce1df..084e2eaa976 100644 --- a/tests/integration/test_storage_mysql/test.py +++ b/tests/integration/test_storage_mysql/test.py @@ -524,7 +524,9 @@ def test_settings_connection_wait_timeout(started_cluster): def worker(): worker_started_event.set() node1.query( - "SELECT 1, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) + "SELECT 1, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format( + table_name + ) ) worker_thread = threading.Thread(target=worker) @@ -540,7 +542,9 @@ def test_settings_connection_wait_timeout(started_cluster): match=r"Exception: mysqlxx::Pool is full \(connection_wait_timeout is exceeded\)", ): node1.query( - "SELECT 2, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format(table_name) + "SELECT 2, sleepEachRow(1) FROM {} SETTINGS max_threads=1".format( + table_name + ) ) ended = time.time() assert (ended - started) >= wait_timeout From 8603807b57f911766710fbde70d06897625fee50 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Sat, 15 Apr 2023 12:33:21 +0000 Subject: [PATCH 237/535] Use generic way to parallelize output for file() + disable parallelization for storage Null --- src/Storages/StorageFile.cpp | 10 +--------- src/Storages/StorageNull.h | 2 ++ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Storages/StorageFile.cpp b/src/Storages/StorageFile.cpp index 1b195d2eb47..7e5a93c13c1 100644 --- a/src/Storages/StorageFile.cpp +++ b/src/Storages/StorageFile.cpp @@ -791,15 +791,7 @@ Pipe StorageFile::read( std::move(read_buffer))); } - Pipe pipe = Pipe::unitePipes(std::move(pipes)); - /// Parallelize output as much as possible - /// Note: number of streams can be 0 if paths is empty - /// It happens if globs in file(path, ...) expands to empty set i.e. no files to process - if (num_streams > 0 && num_streams < max_num_streams) - { - pipe.resize(max_num_streams); - } - return pipe; + return Pipe::unitePipes(std::move(pipes)); } diff --git a/src/Storages/StorageNull.h b/src/Storages/StorageNull.h index 2270731c0e3..24ddb311b65 100644 --- a/src/Storages/StorageNull.h +++ b/src/Storages/StorageNull.h @@ -42,6 +42,8 @@ public: std::make_shared(storage_snapshot->getSampleBlockForColumns(column_names))); } + bool parallelizeOutputAfterReading() const override { return false; } + bool supportsParallelInsert() const override { return true; } SinkToStoragePtr write(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, ContextPtr) override From 908ad291067b148690c3b6b66cf8bb398fac0958 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Sat, 15 Apr 2023 22:14:18 +0000 Subject: [PATCH 238/535] Do not parallelize output for zeroes() --- src/Storages/System/StorageSystemNumbers.h | 4 ---- src/Storages/System/StorageSystemZeros.h | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Storages/System/StorageSystemNumbers.h b/src/Storages/System/StorageSystemNumbers.h index 2af699c25cf..f7277f147f9 100644 --- a/src/Storages/System/StorageSystemNumbers.h +++ b/src/Storages/System/StorageSystemNumbers.h @@ -40,10 +40,6 @@ public: size_t max_block_size, size_t num_streams) override; - /// TODO: introduce a setting to enable parallelization for numbers()? - /// a bit controversial since from one side there is number_mt(), - /// from other side, in general, there is no guarantee regarding order until ORDER BY is provided - /// enabling parallelization here will break some tests, so better do it in a separate PR bool parallelizeOutputAfterReading() const override { return false; } bool hasEvenlyDistributedRead() const override { return true; } diff --git a/src/Storages/System/StorageSystemZeros.h b/src/Storages/System/StorageSystemZeros.h index 64443a3cfd6..936fb772453 100644 --- a/src/Storages/System/StorageSystemZeros.h +++ b/src/Storages/System/StorageSystemZeros.h @@ -31,6 +31,8 @@ public: size_t max_block_size, size_t num_streams) override; + bool parallelizeOutputAfterReading() const override { return false; } + bool hasEvenlyDistributedRead() const override { return true; } bool isSystemStorage() const override { return true; } bool supportsTransactions() const override { return true; } From c3b9d5fe6e5cb7f06d9e064ec53ad58a488b1520 Mon Sep 17 00:00:00 2001 From: Sema Checherinda Date: Sun, 16 Apr 2023 12:11:35 +0200 Subject: [PATCH 239/535] introduce sqllogic runner --- .github/workflows/pull_request.yml | 9305 +++++++++--------- docker/images.json | 4 + docker/test/sqllogic/Dockerfile | 45 + docker/test/sqllogic/Dockerfile.1.2 | 43 + docker/test/sqllogic/run.sh | 100 + tests/ci/ci_config.py | 36 +- tests/ci/report.py | 2 +- tests/ci/sqllogic_test.py | 212 + tests/ci/tests/docker_images.json | 4 + tests/sqllogic/connection.py | 285 + tests/sqllogic/exceptions.py | 133 + tests/sqllogic/runner.py | 428 + tests/sqllogic/self-test/canonic_report.json | 1 + tests/sqllogic/self-test/test.test | 145 + tests/sqllogic/test_parser.py | 609 ++ tests/sqllogic/test_runner.py | 584 ++ 16 files changed, 7287 insertions(+), 4649 deletions(-) create mode 100644 docker/test/sqllogic/Dockerfile create mode 100644 docker/test/sqllogic/Dockerfile.1.2 create mode 100755 docker/test/sqllogic/run.sh create mode 100755 tests/ci/sqllogic_test.py create mode 100644 tests/sqllogic/connection.py create mode 100644 tests/sqllogic/exceptions.py create mode 100755 tests/sqllogic/runner.py create mode 100644 tests/sqllogic/self-test/canonic_report.json create mode 100644 tests/sqllogic/self-test/test.test create mode 100755 tests/sqllogic/test_parser.py create mode 100644 tests/sqllogic/test_runner.py diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6fccc0542b7..32c60d9459e 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -19,9 +19,9 @@ on: # yamllint disable-line rule:truthy - 'docker/docs/**' - 'docs/**' - 'utils/check-style/aspell-ignore/**' -########################################################################################## -##################################### SMALL CHECKS ####################################### -########################################################################################## +########################################################################################### +###################################### SMALL CHECKS ####################################### +########################################################################################### jobs: CheckLabels: runs-on: [self-hosted, style-checker] @@ -143,103 +143,104 @@ jobs: docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" - FastTest: - needs: DockerHubPush - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/fasttest - REPO_COPY=${{runner.temp}}/fasttest/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - EOF - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.TEMP_PATH }} - - name: Fast Test - run: | - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 fast_test_check.py - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - CompatibilityCheckX86: - needs: [BuilderDebRelease] - runs-on: [self-hosted, style-checker] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/compatibility_check - REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse - REPORTS_PATH=${{runner.temp}}/reports_dir - EOF - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: CompatibilityCheckX86 - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (amd64)" --check-glibc --check-distributions - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - CompatibilityCheckAarch64: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, style-checker] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/compatibility_check - REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse - REPORTS_PATH=${{runner.temp}}/reports_dir - EOF - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: CompatibilityCheckAarch64 - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (aarch64)" --check-glibc - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -######################################################################################### -#################################### ORDINARY BUILDS #################################### -######################################################################################### +# FastTest: +# needs: DockerHubPush +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/fasttest +# REPO_COPY=${{runner.temp}}/fasttest/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# EOF +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.TEMP_PATH }} +# - name: Fast Test +# run: | +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 fast_test_check.py +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# CompatibilityCheckX86: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, style-checker] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/compatibility_check +# REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse +# REPORTS_PATH=${{runner.temp}}/reports_dir +# EOF +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: CompatibilityCheckX86 +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (amd64)" --check-glibc --check-distributions +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# CompatibilityCheckAarch64: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, style-checker] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/compatibility_check +# REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse +# REPORTS_PATH=${{runner.temp}}/reports_dir +# EOF +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: CompatibilityCheckAarch64 +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (aarch64)" --check-glibc +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +########################################################################################## +##################################### ORDINARY BUILDS #################################### +########################################################################################## BuilderDebRelease: - needs: [DockerHubPush, FastTest, StyleCheck] + # needs: [DockerHubPush, FastTest, StyleCheck] + needs: [DockerHubPush] runs-on: [self-hosted, builder] steps: - name: Set envs @@ -280,2661 +281,4587 @@ jobs: docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" - BuilderBinRelease: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_release - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebAarch64: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_aarch64 - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ runner.temp }}/images_path - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - fetch-depth: 0 # for performance artifact - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebAsan: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_asan - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebUBsan: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_ubsan - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebTsan: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_tsan - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebMsan: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_msan - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderDebDebug: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=package_debug - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Apply sparse checkout for contrib # in order to check that it doesn't break build - run: | - rm -rf "$GITHUB_WORKSPACE/contrib" && echo 'removed' - git -C "$GITHUB_WORKSPACE" checkout . && echo 'restored' - "$GITHUB_WORKSPACE/contrib/update-submodules.sh" && echo 'OK' - du -hs "$GITHUB_WORKSPACE/contrib" ||: - find "$GITHUB_WORKSPACE/contrib" -type f | wc -l ||: - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -########################################################################################## -##################################### SPECIAL BUILDS ##################################### -########################################################################################## - BuilderBinClangTidy: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_tidy - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinDarwin: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_darwin - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinAarch64: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_aarch64 - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinFreeBSD: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_freebsd - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinDarwinAarch64: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_darwin_aarch64 - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinPPC64: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_ppc64le - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinAmd64Compat: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_amd64_compat - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - BuilderBinAarch64V80Compat: - needs: [DockerHubPush, FastTest, StyleCheck] - runs-on: [self-hosted, builder] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/build_check - IMAGES_PATH=${{runner.temp}}/images_path - REPO_COPY=${{runner.temp}}/build_check/ClickHouse - CACHES_PATH=${{runner.temp}}/../ccaches - BUILD_NAME=binary_aarch64_v80compat - EOF - - name: Download changed images - uses: actions/download-artifact@v3 - with: - name: changed_images - path: ${{ env.IMAGES_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - submodules: true - - name: Build - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - - name: Upload build URLs to artifacts - if: ${{ success() || failure() }} - uses: actions/upload-artifact@v3 - with: - name: ${{ env.BUILD_URLS }} - path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -############################################################################################ -##################################### Docker images ####################################### -############################################################################################ - DockerServerImages: - needs: - - BuilderDebRelease - - BuilderDebAarch64 - runs-on: [self-hosted, style-checker] - steps: - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - fetch-depth: 0 # It MUST BE THE SAME for all dependencies and the job itself - - name: Check docker clickhouse/clickhouse-server building - run: | - cd "$GITHUB_WORKSPACE/tests/ci" - python3 docker_server.py --release-type head --no-push \ - --image-repo clickhouse/clickhouse-server --image-path docker/server - python3 docker_server.py --release-type head --no-push \ - --image-repo clickhouse/clickhouse-keeper --image-path docker/keeper - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################ -##################################### BUILD REPORTER ####################################### -############################################################################################ - BuilderReport: - needs: - - BuilderBinRelease - - BuilderDebAarch64 - - BuilderDebAsan - - BuilderDebDebug - - BuilderDebMsan - - BuilderDebRelease - - BuilderDebTsan - - BuilderDebUBsan - runs-on: [self-hosted, style-checker] - if: ${{ success() || failure() }} - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - CHECK_NAME=ClickHouse build check - REPORTS_PATH=${{runner.temp}}/reports_dir - TEMP_PATH=${{runner.temp}}/report_check - NEEDS_DATA_PATH=${{runner.temp}}/needs.json - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Report Builder - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cat > "$NEEDS_DATA_PATH" << 'EOF' - ${{ toJSON(needs) }} - EOF - cd "$GITHUB_WORKSPACE/tests/ci" - python3 build_report_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - BuilderSpecialReport: - needs: - - BuilderBinAarch64 - - BuilderBinDarwin - - BuilderBinDarwinAarch64 - - BuilderBinFreeBSD - - BuilderBinPPC64 - - BuilderBinAmd64Compat - - BuilderBinAarch64V80Compat - - BuilderBinClangTidy - runs-on: [self-hosted, style-checker] - if: ${{ success() || failure() }} - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/report_check - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=ClickHouse special build check - NEEDS_DATA_PATH=${{runner.temp}}/needs.json - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Report Builder - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cat > "$NEEDS_DATA_PATH" << 'EOF' - ${{ toJSON(needs) }} - EOF - cd "$GITHUB_WORKSPACE/tests/ci" - python3 build_report_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################ -#################################### INSTALL PACKAGES ###################################### -############################################################################################ - InstallPackagesTestRelease: - needs: [BuilderDebRelease] - runs-on: [self-hosted, style-checker] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/test_install - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Install packages (amd64) - REPO_COPY=${{runner.temp}}/test_install/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Test packages installation - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 install_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - InstallPackagesTestAarch64: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, style-checker-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/test_install - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Install packages (arm64) - REPO_COPY=${{runner.temp}}/test_install/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Test packages installation - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 install_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" +# BuilderBinRelease: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_release +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebAarch64: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_aarch64 +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ runner.temp }}/images_path +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# fetch-depth: 0 # for performance artifact +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebAsan: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_asan +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebUBsan: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_ubsan +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebTsan: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_tsan +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebMsan: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_msan +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderDebDebug: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=package_debug +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Apply sparse checkout for contrib # in order to check that it doesn't break build +# run: | +# rm -rf "$GITHUB_WORKSPACE/contrib" && echo 'removed' +# git -C "$GITHUB_WORKSPACE" checkout . && echo 'restored' +# "$GITHUB_WORKSPACE/contrib/update-submodules.sh" && echo 'OK' +# du -hs "$GITHUB_WORKSPACE/contrib" ||: +# find "$GITHUB_WORKSPACE/contrib" -type f | wc -l ||: +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +########################################################################################### +###################################### SPECIAL BUILDS ##################################### +########################################################################################### +# BuilderBinClangTidy: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_tidy +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinDarwin: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_darwin +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinAarch64: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_aarch64 +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinFreeBSD: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_freebsd +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinDarwinAarch64: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_darwin_aarch64 +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinPPC64: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_ppc64le +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinAmd64Compat: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_amd64_compat +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +# BuilderBinAarch64V80Compat: +# needs: [DockerHubPush, FastTest, StyleCheck] +# runs-on: [self-hosted, builder] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/build_check +# IMAGES_PATH=${{runner.temp}}/images_path +# REPO_COPY=${{runner.temp}}/build_check/ClickHouse +# CACHES_PATH=${{runner.temp}}/../ccaches +# BUILD_NAME=binary_aarch64_v80compat +# EOF +# - name: Download changed images +# uses: actions/download-artifact@v3 +# with: +# name: changed_images +# path: ${{ env.IMAGES_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# submodules: true +# - name: Build +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" +# - name: Upload build URLs to artifacts +# if: ${{ success() || failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: ${{ env.BUILD_URLS }} +# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +############################################################################################# +###################################### Docker images ####################################### +############################################################################################# +# DockerServerImages: +# needs: +# - BuilderDebRelease +# - BuilderDebAarch64 +# runs-on: [self-hosted, style-checker] +# steps: +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# fetch-depth: 0 # It MUST BE THE SAME for all dependencies and the job itself +# - name: Check docker clickhouse/clickhouse-server building +# run: | +# cd "$GITHUB_WORKSPACE/tests/ci" +# python3 docker_server.py --release-type head --no-push \ +# --image-repo clickhouse/clickhouse-server --image-path docker/server +# python3 docker_server.py --release-type head --no-push \ +# --image-repo clickhouse/clickhouse-keeper --image-path docker/keeper +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################# +###################################### BUILD REPORTER ####################################### +############################################################################################# +# BuilderReport: +# needs: +# - BuilderBinRelease +# - BuilderDebAarch64 +# - BuilderDebAsan +# - BuilderDebDebug +# - BuilderDebMsan +# - BuilderDebRelease +# - BuilderDebTsan +# - BuilderDebUBsan +# runs-on: [self-hosted, style-checker] +# if: ${{ success() || failure() }} +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# CHECK_NAME=ClickHouse build check +# REPORTS_PATH=${{runner.temp}}/reports_dir +# TEMP_PATH=${{runner.temp}}/report_check +# NEEDS_DATA_PATH=${{runner.temp}}/needs.json +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Report Builder +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cat > "$NEEDS_DATA_PATH" << 'EOF' +# ${{ toJSON(needs) }} +# EOF +# cd "$GITHUB_WORKSPACE/tests/ci" +# python3 build_report_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# BuilderSpecialReport: +# needs: +# - BuilderBinAarch64 +# - BuilderBinDarwin +# - BuilderBinDarwinAarch64 +# - BuilderBinFreeBSD +# - BuilderBinPPC64 +# - BuilderBinAmd64Compat +# - BuilderBinAarch64V80Compat +# - BuilderBinClangTidy +# runs-on: [self-hosted, style-checker] +# if: ${{ success() || failure() }} +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/report_check +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=ClickHouse special build check +# NEEDS_DATA_PATH=${{runner.temp}}/needs.json +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Report Builder +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cat > "$NEEDS_DATA_PATH" << 'EOF' +# ${{ toJSON(needs) }} +# EOF +# cd "$GITHUB_WORKSPACE/tests/ci" +# python3 build_report_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################# +##################################### INSTALL PACKAGES ###################################### +############################################################################################# +# InstallPackagesTestRelease: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, style-checker] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/test_install +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Install packages (amd64) +# REPO_COPY=${{runner.temp}}/test_install/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Test packages installation +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 install_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# InstallPackagesTestAarch64: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, style-checker-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/test_install +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Install packages (arm64) +# REPO_COPY=${{runner.temp}}/test_install/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Test packages installation +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 install_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################### +############################ FUNCTIONAl STATELESS TESTS ####################################### +############################################################################################### +# FunctionalStatelessTestRelease: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release) +# REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse +# KILL_TIMEOUT=10800 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseDatabaseReplicated0: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_database_replicated +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, DatabaseReplicated) +# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseDatabaseReplicated1: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_database_replicated +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, DatabaseReplicated) +# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseDatabaseReplicated2: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_database_replicated +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, DatabaseReplicated) +# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseDatabaseReplicated3: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_database_replicated +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, DatabaseReplicated) +# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseWideParts: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_wide_parts +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, wide parts enabled) +# REPO_COPY=${{runner.temp}}/stateless_wide_parts/ClickHouse +# KILL_TIMEOUT=10800 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseS3_0: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=2 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestReleaseS3_1: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (release, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=2 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug0: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug1: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug2: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug3: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug4: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Debug5: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=5 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Tsan0: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Tsan1: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Tsan2: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Tsan3: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestS3Tsan4: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan, s3 storage) +# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestAarch64: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (aarch64) +# REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse +# KILL_TIMEOUT=10800 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestAsan0: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (asan) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestAsan1: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (asan) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestAsan2: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (asan) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestAsan3: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (asan) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestTsan0: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan) +# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestTsan1: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan) +# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestTsan2: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan) +# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestTsan3: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan) +# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestTsan4: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (tsan) +# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestUBsan0: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (ubsan) +# REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=2 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestUBsan1: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (ubsan) +# REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=2 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan0: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan1: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan2: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan3: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan4: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestMsan5: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (msan) +# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=5 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestDebug0: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestDebug1: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestDebug2: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestDebug3: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestDebug4: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests (debug) +# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse +# KILL_TIMEOUT=10800 +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=5 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatelessTestFlakyCheck: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateless_flaky_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateless tests flaky check (asan) +# REPO_COPY=${{runner.temp}}/stateless_flaky_asan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# TestsBugfixCheck: +# needs: [CheckLabels, StyleCheck] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/tests_bugfix_check +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=tests bugfix validate check +# KILL_TIMEOUT=3600 +# REPO_COPY=${{runner.temp}}/tests_bugfix_check/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Bugfix test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# +# TEMP_PATH="${TEMP_PATH}/integration" \ +# REPORTS_PATH="${REPORTS_PATH}/integration" \ +# python3 integration_test_check.py "Integration $CHECK_NAME" \ +# --validate-bugfix --post-commit-status=file || echo 'ignore exit code' +# +# TEMP_PATH="${TEMP_PATH}/stateless" \ +# REPORTS_PATH="${REPORTS_PATH}/stateless" \ +# python3 functional_test_check.py "Stateless $CHECK_NAME" "$KILL_TIMEOUT" \ +# --validate-bugfix --post-commit-status=file || echo 'ignore exit code' +# +# python3 bugfix_validate_check.py "${TEMP_PATH}/stateless/functional_commit_status.tsv" "${TEMP_PATH}/integration/integration_commit_status.tsv" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################### +############################# FUNCTIONAl STATEFUL TESTS ####################################### +############################################################################################### +# FunctionalStatefulTestRelease: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (release) +# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestAarch64: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (aarch64) +# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestAsan: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (asan) +# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestTsan: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (tsan) +# REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestMsan: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_msan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (msan) +# REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestUBsan: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (ubsan) +# REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestDebug: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (debug) +# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# # Parallel replicas +# FunctionalStatefulTestDebugParallelReplicas: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (debug, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestUBsanParallelReplicas: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (ubsan, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestMsanParallelReplicas: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_msan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (msan, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestTsanParallelReplicas: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (tsan, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestAsanParallelReplicas: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (asan, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# FunctionalStatefulTestReleaseParallelReplicas: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stateful_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stateful tests (release, ParallelReplicas) +# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse +# KILL_TIMEOUT=3600 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v2 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Clear repository +# run: | +# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" +# - name: Check out repository code +# uses: actions/checkout@v2 +# - name: Functional test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################### +########################################## STRESS TESTS ####################################### +############################################################################################### +# StressTestAsan: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stress_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stress test (asan) +# REPO_COPY=${{runner.temp}}/stress_asan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Stress test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 stress_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# StressTestTsan: +# needs: [BuilderDebTsan] +# # func testers have 16 cores + 128 GB memory +# # while stress testers have 36 cores + 72 memory +# # It would be better to have something like 32 + 128, +# # but such servers almost unavailable as spot instances. +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stress_thread +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stress test (tsan) +# REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Stress test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 stress_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# StressTestMsan: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stress_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stress test (msan) +# REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Stress test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 stress_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# StressTestUBsan: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stress_undefined +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stress test (ubsan) +# REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Stress test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 stress_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# StressTestDebug: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/stress_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Stress test (debug) +# REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Stress test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 stress_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# ############################################################################################## +# ######################################### UPGRADE CHECK ###################################### +# ############################################################################################## +# UpgradeCheckAsan: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/upgrade_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Upgrade check (asan) +# REPO_COPY=${{runner.temp}}/upgrade_asan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Upgrade check +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 upgrade_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UpgradeCheckTsan: +# needs: [BuilderDebTsan] +# # same as for stress test with tsan +# runs-on: [self-hosted, func-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/upgrade_thread +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Upgrade check (tsan) +# REPO_COPY=${{runner.temp}}/upgrade_thread/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Upgrade check +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 upgrade_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UpgradeCheckMsan: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/upgrade_memory +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Upgrade check (msan) +# REPO_COPY=${{runner.temp}}/upgrade_memory/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Upgrade check +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 upgrade_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UpgradeCheckDebug: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/upgrade_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Upgrade check (debug) +# REPO_COPY=${{runner.temp}}/upgrade_debug/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Upgrade check +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 upgrade_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################### +###################################### AST FUZZERS ############################################ +############################################################################################### +# ASTFuzzerTestAsan: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=AST fuzzer (asan) +# REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Fuzzer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 ast_fuzzer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# ASTFuzzerTestTsan: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=AST fuzzer (tsan) +# REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Fuzzer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 ast_fuzzer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# ASTFuzzerTestUBSan: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=AST fuzzer (ubsan) +# REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Fuzzer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 ast_fuzzer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# ASTFuzzerTestMSan: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=AST fuzzer (msan) +# REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Fuzzer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 ast_fuzzer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# ASTFuzzerTestDebug: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=AST fuzzer (debug) +# REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Fuzzer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 ast_fuzzer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" ############################################################################################## -########################### FUNCTIONAl STATELESS TESTS ####################################### +############################## INTEGRATION TESTS ############################################# ############################################################################################## - FunctionalStatelessTestRelease: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release) - REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse - KILL_TIMEOUT=10800 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseDatabaseReplicated0: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_database_replicated - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, DatabaseReplicated) - REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseDatabaseReplicated1: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_database_replicated - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, DatabaseReplicated) - REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseDatabaseReplicated2: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_database_replicated - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, DatabaseReplicated) - REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseDatabaseReplicated3: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_database_replicated - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, DatabaseReplicated) - REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseWideParts: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_wide_parts - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, wide parts enabled) - REPO_COPY=${{runner.temp}}/stateless_wide_parts/ClickHouse - KILL_TIMEOUT=10800 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseS3_0: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=2 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestReleaseS3_1: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (release, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=2 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug0: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug1: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug2: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug3: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug4: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Debug5: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=5 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Tsan0: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Tsan1: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Tsan2: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Tsan3: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestS3Tsan4: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan, s3 storage) - REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestAarch64: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (aarch64) - REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse - KILL_TIMEOUT=10800 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestAsan0: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (asan) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestAsan1: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (asan) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestAsan2: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (asan) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestAsan3: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (asan) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestTsan0: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan) - REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestTsan1: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan) - REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestTsan2: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan) - REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestTsan3: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan) - REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestTsan4: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (tsan) - REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestUBsan0: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (ubsan) - REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=2 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestUBsan1: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (ubsan) - REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=2 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan0: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan1: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan2: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan3: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan4: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestMsan5: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (msan) - REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=5 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestDebug0: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestDebug1: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestDebug2: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestDebug3: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestDebug4: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests (debug) - REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse - KILL_TIMEOUT=10800 - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=5 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatelessTestFlakyCheck: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateless_flaky_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateless tests flaky check (asan) - REPO_COPY=${{runner.temp}}/stateless_flaky_asan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - TestsBugfixCheck: - needs: [CheckLabels, StyleCheck] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/tests_bugfix_check - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=tests bugfix validate check - KILL_TIMEOUT=3600 - REPO_COPY=${{runner.temp}}/tests_bugfix_check/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Bugfix test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - - TEMP_PATH="${TEMP_PATH}/integration" \ - REPORTS_PATH="${REPORTS_PATH}/integration" \ - python3 integration_test_check.py "Integration $CHECK_NAME" \ - --validate-bugfix --post-commit-status=file || echo 'ignore exit code' - - TEMP_PATH="${TEMP_PATH}/stateless" \ - REPORTS_PATH="${REPORTS_PATH}/stateless" \ - python3 functional_test_check.py "Stateless $CHECK_NAME" "$KILL_TIMEOUT" \ - --validate-bugfix --post-commit-status=file || echo 'ignore exit code' - - python3 bugfix_validate_check.py "${TEMP_PATH}/stateless/functional_commit_status.tsv" "${TEMP_PATH}/integration/integration_commit_status.tsv" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan0: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan1: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan2: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan3: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan4: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsAsan5: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse +# RUN_BY_HASH_NUM=5 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan0: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan1: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan2: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan3: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan4: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=4 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsTsan5: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (tsan) +# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse +# RUN_BY_HASH_NUM=5 +# RUN_BY_HASH_TOTAL=6 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsRelease0: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (release) +# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsRelease1: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (release) +# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsRelease2: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (release) +# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsRelease3: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests (release) +# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# IntegrationTestsFlakyCheck: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/integration_tests_asan_flaky_check +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Integration tests flaky check (asan) +# REPO_COPY=${{runner.temp}}/integration_tests_asan_flaky_check/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Integration test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 integration_test_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" ############################################################################################## -############################ FUNCTIONAl STATEFUL TESTS ####################################### +##################################### UNIT TESTS ############################################# ############################################################################################## - FunctionalStatefulTestRelease: +# UnitTestsAsan: +# needs: [BuilderDebAsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/unit_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Unit tests (asan) +# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Unit test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 unit_tests_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UnitTestsReleaseClang: +# needs: [BuilderBinRelease] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/unit_tests_asan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Unit tests (release-clang) +# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Unit test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 unit_tests_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UnitTestsTsan: +# needs: [BuilderDebTsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/unit_tests_tsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Unit tests (tsan) +# REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Unit test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 unit_tests_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UnitTestsMsan: +# needs: [BuilderDebMsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/unit_tests_msan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Unit tests (msan) +# REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Unit test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 unit_tests_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# UnitTestsUBsan: +# needs: [BuilderDebUBsan] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/unit_tests_ubsan +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Unit tests (ubsan) +# REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Unit test +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 unit_tests_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################## +##################################### PERFORMANCE TESTS ###################################### +############################################################################################## +# PerformanceComparisonX86-0: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonX86-1: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonX86-2: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonX86-3: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, stress-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonAarch-0: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison Aarch64 +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=0 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonAarch-1: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison Aarch64 +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=1 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonAarch-2: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison Aarch64 +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=2 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# PerformanceComparisonAarch-3: +# needs: [BuilderDebAarch64] +# runs-on: [self-hosted, func-tester-aarch64] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/performance_comparison +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=Performance Comparison Aarch64 +# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse +# RUN_BY_HASH_NUM=3 +# RUN_BY_HASH_TOTAL=4 +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Performance Comparison +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 performance_comparison_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################### +####################################### SQLANCER FUZZERS ###################################### +############################################################################################### +# SQLancerTestRelease: +# needs: [BuilderDebRelease] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/sqlancer_release +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=SQLancer (release) +# REPO_COPY=${{runner.temp}}/sqlancer_release/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: SQLancer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 sqlancer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +# SQLancerTestDebug: +# needs: [BuilderDebDebug] +# runs-on: [self-hosted, fuzzer-unit-tester] +# steps: +# - name: Set envs +# run: | +# cat >> "$GITHUB_ENV" << 'EOF' +# TEMP_PATH=${{runner.temp}}/sqlancer_debug +# REPORTS_PATH=${{runner.temp}}/reports_dir +# CHECK_NAME=SQLancer (debug) +# REPO_COPY=${{runner.temp}}/sqlancer_debug/ClickHouse +# EOF +# - name: Download json reports +# uses: actions/download-artifact@v3 +# with: +# path: ${{ env.REPORTS_PATH }} +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: SQLancer +# run: | +# sudo rm -fr "$TEMP_PATH" +# mkdir -p "$TEMP_PATH" +# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" +# cd "$REPO_COPY/tests/ci" +# python3 sqlancer_check.py "$CHECK_NAME" +# - name: Cleanup +# if: always() +# run: | +# docker ps --quiet | xargs --no-run-if-empty docker kill ||: +# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: +# sudo rm -fr "$TEMP_PATH" +############################################################################################## +####################################### JEPSEN TESTS ######################################### +############################################################################################## +# Jepsen: +# # This is special test NOT INCLUDED in FinishCheck +# # When it's skipped, all dependent tasks will be skipped too. +# # DO NOT add it there +# if: contains(github.event.pull_request.labels.*.name, 'jepsen-test') +# needs: [BuilderBinRelease] +# uses: ./.github/workflows/jepsen.yml +# FinishCheck: +# needs: +# - StyleCheck +# - DockerHubPush +# - DockerServerImages +# - CheckLabels +# - BuilderReport +# - BuilderSpecialReport +# - FastTest +# - FunctionalStatelessTestDebug0 +# - FunctionalStatelessTestDebug1 +# - FunctionalStatelessTestDebug2 +# - FunctionalStatelessTestDebug3 +# - FunctionalStatelessTestDebug4 +# - FunctionalStatelessTestRelease +# - FunctionalStatelessTestReleaseDatabaseReplicated0 +# - FunctionalStatelessTestReleaseDatabaseReplicated1 +# - FunctionalStatelessTestReleaseDatabaseReplicated2 +# - FunctionalStatelessTestReleaseDatabaseReplicated3 +# - FunctionalStatelessTestReleaseWideParts +# - FunctionalStatelessTestAarch64 +# - FunctionalStatelessTestAsan0 +# - FunctionalStatelessTestAsan1 +# - FunctionalStatelessTestAsan2 +# - FunctionalStatelessTestAsan3 +# - FunctionalStatelessTestTsan0 +# - FunctionalStatelessTestTsan1 +# - FunctionalStatelessTestTsan2 +# - FunctionalStatelessTestTsan3 +# - FunctionalStatelessTestTsan4 +# - FunctionalStatelessTestMsan0 +# - FunctionalStatelessTestMsan1 +# - FunctionalStatelessTestMsan2 +# - FunctionalStatelessTestMsan3 +# - FunctionalStatelessTestMsan4 +# - FunctionalStatelessTestMsan5 +# - FunctionalStatelessTestUBsan0 +# - FunctionalStatelessTestUBsan1 +# - FunctionalStatefulTestDebug +# - FunctionalStatefulTestRelease +# - FunctionalStatefulTestAarch64 +# - FunctionalStatefulTestAsan +# - FunctionalStatefulTestTsan +# - FunctionalStatefulTestMsan +# - FunctionalStatefulTestUBsan +# - FunctionalStatelessTestReleaseS3_0 +# - FunctionalStatelessTestReleaseS3_1 +# - FunctionalStatelessTestS3Debug0 +# - FunctionalStatelessTestS3Debug1 +# - FunctionalStatelessTestS3Debug2 +# - FunctionalStatelessTestS3Debug4 +# - FunctionalStatelessTestS3Debug5 +# - FunctionalStatelessTestS3Tsan0 +# - FunctionalStatelessTestS3Tsan1 +# - FunctionalStatelessTestS3Tsan2 +# - FunctionalStatelessTestS3Tsan4 +# - StressTestDebug +# - StressTestAsan +# - StressTestTsan +# - StressTestMsan +# - StressTestUBsan +# - ASTFuzzerTestDebug +# - ASTFuzzerTestAsan +# - ASTFuzzerTestTsan +# - ASTFuzzerTestMSan +# - ASTFuzzerTestUBSan +# - IntegrationTestsAsan0 +# - IntegrationTestsAsan1 +# - IntegrationTestsAsan2 +# - IntegrationTestsAsan3 +# - IntegrationTestsAsan4 +# - IntegrationTestsAsan5 +# - IntegrationTestsRelease0 +# - IntegrationTestsRelease1 +# - IntegrationTestsRelease2 +# - IntegrationTestsRelease3 +# - IntegrationTestsTsan0 +# - IntegrationTestsTsan1 +# - IntegrationTestsTsan2 +# - IntegrationTestsTsan3 +# - IntegrationTestsTsan4 +# - IntegrationTestsTsan5 +# - PerformanceComparisonX86-0 +# - PerformanceComparisonX86-1 +# - PerformanceComparisonX86-2 +# - PerformanceComparisonX86-3 +# - PerformanceComparisonAarch-0 +# - PerformanceComparisonAarch-1 +# - PerformanceComparisonAarch-2 +# - PerformanceComparisonAarch-3 +# - UnitTestsAsan +# - UnitTestsTsan +# - UnitTestsMsan +# - UnitTestsUBsan +# - UnitTestsReleaseClang +# - CompatibilityCheckX86 +# - CompatibilityCheckAarch64 +# - IntegrationTestsFlakyCheck +# - SQLancerTestRelease +# - SQLancerTestDebug +# runs-on: [self-hosted, style-checker] +# steps: +# - name: Check out repository code +# uses: ClickHouse/checkout@v1 +# with: +# clear-repository: true +# - name: Finish label +# run: | +# cd "$GITHUB_WORKSPACE/tests/ci" +# python3 finish_check.py +# python3 merge_pr.py --check-approved +############################################################################################## +########################### SQLLOGIC TEST ################################################### +############################################################################################## + SQLLogicTestRelease: needs: [BuilderDebRelease] runs-on: [self-hosted, func-tester] steps: - name: Set envs run: | cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_release + TEMP_PATH=${{runner.temp}}/sqllogic_debug REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (release) - REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestAarch64: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (aarch64) - REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestAsan: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (asan) - REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestTsan: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (tsan) - REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestMsan: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_msan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (msan) - REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestUBsan: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (ubsan) - REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestDebug: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (debug) - REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - # Parallel replicas - FunctionalStatefulTestDebugParallelReplicas: - needs: [BuilderDebDebug] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (debug, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse - KILL_TIMEOUT=3600 + CHECK_NAME=Sqllogic test (release) + REPO_COPY=${{runner.temp}}/sqllogic_debug/ClickHouse + KILL_TIMEOUT=10800 EOF - name: Download json reports uses: actions/download-artifact@v2 @@ -2945,1904 +4872,16 @@ jobs: sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - name: Check out repository code uses: actions/checkout@v2 - - name: Functional test + - name: Sqllogic test run: | sudo rm -fr "$TEMP_PATH" mkdir -p "$TEMP_PATH" cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + python3 sqllogic_test.py "$CHECK_NAME" "$KILL_TIMEOUT" - name: Cleanup if: always() run: | docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestUBsanParallelReplicas: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (ubsan, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v2 - with: - path: ${{ env.REPORTS_PATH }} - - name: Clear repository - run: | - sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - - name: Check out repository code - uses: actions/checkout@v2 - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestMsanParallelReplicas: - needs: [BuilderDebMsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_msan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (msan, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v2 - with: - path: ${{ env.REPORTS_PATH }} - - name: Clear repository - run: | - sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - - name: Check out repository code - uses: actions/checkout@v2 - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestTsanParallelReplicas: - needs: [BuilderDebTsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (tsan, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v2 - with: - path: ${{ env.REPORTS_PATH }} - - name: Clear repository - run: | - sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - - name: Check out repository code - uses: actions/checkout@v2 - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestAsanParallelReplicas: - needs: [BuilderDebAsan] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (asan, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v2 - with: - path: ${{ env.REPORTS_PATH }} - - name: Clear repository - run: | - sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - - name: Check out repository code - uses: actions/checkout@v2 - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - FunctionalStatefulTestReleaseParallelReplicas: - needs: [BuilderDebRelease] - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stateful_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stateful tests (release, ParallelReplicas) - REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse - KILL_TIMEOUT=3600 - EOF - - name: Download json reports - uses: actions/download-artifact@v2 - with: - path: ${{ env.REPORTS_PATH }} - - name: Clear repository - run: | - sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - - name: Check out repository code - uses: actions/checkout@v2 - - name: Functional test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################## -######################################### STRESS TESTS ####################################### -############################################################################################## - StressTestAsan: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stress_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stress test (asan) - REPO_COPY=${{runner.temp}}/stress_asan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Stress test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 stress_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - StressTestTsan: - needs: [BuilderDebTsan] - # func testers have 16 cores + 128 GB memory - # while stress testers have 36 cores + 72 memory - # It would be better to have something like 32 + 128, - # but such servers almost unavailable as spot instances. - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stress_thread - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stress test (tsan) - REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Stress test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 stress_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - StressTestMsan: - needs: [BuilderDebMsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stress_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stress test (msan) - REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Stress test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 stress_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - StressTestUBsan: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stress_undefined - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stress test (ubsan) - REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Stress test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 stress_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - StressTestDebug: - needs: [BuilderDebDebug] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/stress_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Stress test (debug) - REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Stress test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 stress_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - ############################################################################################## - ######################################### UPGRADE CHECK ###################################### - ############################################################################################## - UpgradeCheckAsan: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/upgrade_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Upgrade check (asan) - REPO_COPY=${{runner.temp}}/upgrade_asan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Upgrade check - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 upgrade_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UpgradeCheckTsan: - needs: [BuilderDebTsan] - # same as for stress test with tsan - runs-on: [self-hosted, func-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/upgrade_thread - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Upgrade check (tsan) - REPO_COPY=${{runner.temp}}/upgrade_thread/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Upgrade check - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 upgrade_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UpgradeCheckMsan: - needs: [BuilderDebMsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/upgrade_memory - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Upgrade check (msan) - REPO_COPY=${{runner.temp}}/upgrade_memory/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Upgrade check - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 upgrade_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UpgradeCheckDebug: - needs: [BuilderDebDebug] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/upgrade_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Upgrade check (debug) - REPO_COPY=${{runner.temp}}/upgrade_debug/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Upgrade check - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 upgrade_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################## -##################################### AST FUZZERS ############################################ -############################################################################################## - ASTFuzzerTestAsan: - needs: [BuilderDebAsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=AST fuzzer (asan) - REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Fuzzer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 ast_fuzzer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - ASTFuzzerTestTsan: - needs: [BuilderDebTsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=AST fuzzer (tsan) - REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Fuzzer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 ast_fuzzer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - ASTFuzzerTestUBSan: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=AST fuzzer (ubsan) - REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Fuzzer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 ast_fuzzer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - ASTFuzzerTestMSan: - needs: [BuilderDebMsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=AST fuzzer (msan) - REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Fuzzer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 ast_fuzzer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - ASTFuzzerTestDebug: - needs: [BuilderDebDebug] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=AST fuzzer (debug) - REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Fuzzer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 ast_fuzzer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################# -############################# INTEGRATION TESTS ############################################# -############################################################################################# - IntegrationTestsAsan0: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsAsan1: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsAsan2: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsAsan3: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsAsan4: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsAsan5: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse - RUN_BY_HASH_NUM=5 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan0: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan1: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan2: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan3: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan4: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=4 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsTsan5: - needs: [BuilderDebTsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (tsan) - REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse - RUN_BY_HASH_NUM=5 - RUN_BY_HASH_TOTAL=6 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsRelease0: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (release) - REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsRelease1: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (release) - REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsRelease2: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (release) - REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsRelease3: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests (release) - REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - IntegrationTestsFlakyCheck: - needs: [BuilderDebAsan] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/integration_tests_asan_flaky_check - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Integration tests flaky check (asan) - REPO_COPY=${{runner.temp}}/integration_tests_asan_flaky_check/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Integration test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 integration_test_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################# -#################################### UNIT TESTS ############################################# -############################################################################################# - UnitTestsAsan: - needs: [BuilderDebAsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/unit_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Unit tests (asan) - REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Unit test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 unit_tests_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UnitTestsReleaseClang: - needs: [BuilderBinRelease] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/unit_tests_asan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Unit tests (release-clang) - REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Unit test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 unit_tests_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UnitTestsTsan: - needs: [BuilderDebTsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/unit_tests_tsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Unit tests (tsan) - REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Unit test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 unit_tests_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UnitTestsMsan: - needs: [BuilderDebMsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/unit_tests_msan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Unit tests (msan) - REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Unit test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 unit_tests_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - UnitTestsUBsan: - needs: [BuilderDebUBsan] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/unit_tests_ubsan - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Unit tests (ubsan) - REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Unit test - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 unit_tests_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################# -#################################### PERFORMANCE TESTS ###################################### -############################################################################################# - PerformanceComparisonX86-0: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonX86-1: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonX86-2: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonX86-3: - needs: [BuilderDebRelease] - runs-on: [self-hosted, stress-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonAarch-0: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison Aarch64 - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=0 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonAarch-1: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison Aarch64 - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=1 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonAarch-2: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison Aarch64 - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=2 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - PerformanceComparisonAarch-3: - needs: [BuilderDebAarch64] - runs-on: [self-hosted, func-tester-aarch64] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/performance_comparison - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=Performance Comparison Aarch64 - REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse - RUN_BY_HASH_NUM=3 - RUN_BY_HASH_TOTAL=4 - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Performance Comparison - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 performance_comparison_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################## -###################################### SQLANCER FUZZERS ###################################### -############################################################################################## - SQLancerTestRelease: - needs: [BuilderDebRelease] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/sqlancer_release - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=SQLancer (release) - REPO_COPY=${{runner.temp}}/sqlancer_release/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: SQLancer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 sqlancer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" - SQLancerTestDebug: - needs: [BuilderDebDebug] - runs-on: [self-hosted, fuzzer-unit-tester] - steps: - - name: Set envs - run: | - cat >> "$GITHUB_ENV" << 'EOF' - TEMP_PATH=${{runner.temp}}/sqlancer_debug - REPORTS_PATH=${{runner.temp}}/reports_dir - CHECK_NAME=SQLancer (debug) - REPO_COPY=${{runner.temp}}/sqlancer_debug/ClickHouse - EOF - - name: Download json reports - uses: actions/download-artifact@v3 - with: - path: ${{ env.REPORTS_PATH }} - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: SQLancer - run: | - sudo rm -fr "$TEMP_PATH" - mkdir -p "$TEMP_PATH" - cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - cd "$REPO_COPY/tests/ci" - python3 sqlancer_check.py "$CHECK_NAME" - - name: Cleanup - if: always() - run: | - docker ps --quiet | xargs --no-run-if-empty docker kill ||: - docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: - sudo rm -fr "$TEMP_PATH" -############################################################################################# -###################################### JEPSEN TESTS ######################################### -############################################################################################# - Jepsen: - # This is special test NOT INCLUDED in FinishCheck - # When it's skipped, all dependent tasks will be skipped too. - # DO NOT add it there - if: contains(github.event.pull_request.labels.*.name, 'jepsen-test') - needs: [BuilderBinRelease] - uses: ./.github/workflows/jepsen.yml - FinishCheck: - needs: - - StyleCheck - - DockerHubPush - - DockerServerImages - - CheckLabels - - BuilderReport - - BuilderSpecialReport - - FastTest - - FunctionalStatelessTestDebug0 - - FunctionalStatelessTestDebug1 - - FunctionalStatelessTestDebug2 - - FunctionalStatelessTestDebug3 - - FunctionalStatelessTestDebug4 - - FunctionalStatelessTestRelease - - FunctionalStatelessTestReleaseDatabaseReplicated0 - - FunctionalStatelessTestReleaseDatabaseReplicated1 - - FunctionalStatelessTestReleaseDatabaseReplicated2 - - FunctionalStatelessTestReleaseDatabaseReplicated3 - - FunctionalStatelessTestReleaseWideParts - - FunctionalStatelessTestAarch64 - - FunctionalStatelessTestAsan0 - - FunctionalStatelessTestAsan1 - - FunctionalStatelessTestAsan2 - - FunctionalStatelessTestAsan3 - - FunctionalStatelessTestTsan0 - - FunctionalStatelessTestTsan1 - - FunctionalStatelessTestTsan2 - - FunctionalStatelessTestTsan3 - - FunctionalStatelessTestTsan4 - - FunctionalStatelessTestMsan0 - - FunctionalStatelessTestMsan1 - - FunctionalStatelessTestMsan2 - - FunctionalStatelessTestMsan3 - - FunctionalStatelessTestMsan4 - - FunctionalStatelessTestMsan5 - - FunctionalStatelessTestUBsan0 - - FunctionalStatelessTestUBsan1 - - FunctionalStatefulTestDebug - - FunctionalStatefulTestRelease - - FunctionalStatefulTestAarch64 - - FunctionalStatefulTestAsan - - FunctionalStatefulTestTsan - - FunctionalStatefulTestMsan - - FunctionalStatefulTestUBsan - - FunctionalStatelessTestReleaseS3_0 - - FunctionalStatelessTestReleaseS3_1 - - FunctionalStatelessTestS3Debug0 - - FunctionalStatelessTestS3Debug1 - - FunctionalStatelessTestS3Debug2 - - FunctionalStatelessTestS3Debug4 - - FunctionalStatelessTestS3Debug5 - - FunctionalStatelessTestS3Tsan0 - - FunctionalStatelessTestS3Tsan1 - - FunctionalStatelessTestS3Tsan2 - - FunctionalStatelessTestS3Tsan4 - - StressTestDebug - - StressTestAsan - - StressTestTsan - - StressTestMsan - - StressTestUBsan - - ASTFuzzerTestDebug - - ASTFuzzerTestAsan - - ASTFuzzerTestTsan - - ASTFuzzerTestMSan - - ASTFuzzerTestUBSan - - IntegrationTestsAsan0 - - IntegrationTestsAsan1 - - IntegrationTestsAsan2 - - IntegrationTestsAsan3 - - IntegrationTestsAsan4 - - IntegrationTestsAsan5 - - IntegrationTestsRelease0 - - IntegrationTestsRelease1 - - IntegrationTestsRelease2 - - IntegrationTestsRelease3 - - IntegrationTestsTsan0 - - IntegrationTestsTsan1 - - IntegrationTestsTsan2 - - IntegrationTestsTsan3 - - IntegrationTestsTsan4 - - IntegrationTestsTsan5 - - PerformanceComparisonX86-0 - - PerformanceComparisonX86-1 - - PerformanceComparisonX86-2 - - PerformanceComparisonX86-3 - - PerformanceComparisonAarch-0 - - PerformanceComparisonAarch-1 - - PerformanceComparisonAarch-2 - - PerformanceComparisonAarch-3 - - UnitTestsAsan - - UnitTestsTsan - - UnitTestsMsan - - UnitTestsUBsan - - UnitTestsReleaseClang - - CompatibilityCheckX86 - - CompatibilityCheckAarch64 - - IntegrationTestsFlakyCheck - - SQLancerTestRelease - - SQLancerTestDebug - runs-on: [self-hosted, style-checker] - steps: - - name: Check out repository code - uses: ClickHouse/checkout@v1 - with: - clear-repository: true - - name: Finish label - run: | - cd "$GITHUB_WORKSPACE/tests/ci" - python3 finish_check.py - python3 merge_pr.py --check-approved diff --git a/docker/images.json b/docker/images.json index 508138d79af..9150abe1f1c 100644 --- a/docker/images.json +++ b/docker/images.json @@ -151,5 +151,9 @@ "name": "clickhouse/docs-builder", "dependent": [ ] + }, + "docker/test/sqllogic": { + "name": "clickhouse/sqllogic-test", + "dependent": [] } } diff --git a/docker/test/sqllogic/Dockerfile b/docker/test/sqllogic/Dockerfile new file mode 100644 index 00000000000..83dcf7e1f56 --- /dev/null +++ b/docker/test/sqllogic/Dockerfile @@ -0,0 +1,45 @@ +# docker build -t clickhouse/sqllogic-test . +ARG FROM_TAG=latest +FROM clickhouse/test-base:$FROM_TAG + +RUN apt-get update --yes \ + && env DEBIAN_FRONTEND=noninteractive \ + apt-get install --yes --no-install-recommends \ + wget \ + git \ + python3 \ + python3-dev \ + python3-pip \ + sqlite3 \ + unixodbc \ + unixodbc-dev \ + sudo \ + && apt-get clean + +RUN pip3 install \ + numpy \ + pyodbc \ + deepdiff + +ARG odbc_repo="https://github.com/ClickHouse/clickhouse-odbc.git" + +RUN git clone --recursive ${odbc_repo} \ + && mkdir -p /clickhouse-odbc/build \ + && cmake -S /clickhouse-odbc -B /clickhouse-odbc/build \ + && ls /clickhouse-odbc/build/driver \ + && make -j 10 -C /clickhouse-odbc/build \ + && ls /clickhouse-odbc/build/driver \ + && mkdir -p /usr/local/lib64/ && cp /clickhouse-odbc/build/driver/lib*.so /usr/local/lib64/ \ + && odbcinst -i -d -f /clickhouse-odbc/packaging/odbcinst.ini.sample \ + && odbcinst -i -s -l -f /clickhouse-odbc/packaging/odbc.ini.sample + +ENV TZ=Europe/Amsterdam +ENV MAX_RUN_TIME=900 +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +ARG sqllogic_test_repo="https://github.com/gregrahn/sqllogictest.git" + +RUN git clone --recursive ${sqllogic_test_repo} + +COPY run.sh / +CMD ["/bin/bash", "/run.sh"] diff --git a/docker/test/sqllogic/Dockerfile.1.2 b/docker/test/sqllogic/Dockerfile.1.2 new file mode 100644 index 00000000000..9ad8e719d31 --- /dev/null +++ b/docker/test/sqllogic/Dockerfile.1.2 @@ -0,0 +1,43 @@ +# docker build -t clickhouse/sqllogic-test . +ARG FROM_TAG=latest +FROM clickhouse/test-base:$FROM_TAG + +RUN apt-get update --yes \ + && env DEBIAN_FRONTEND=noninteractive \ + apt-get install --yes --no-install-recommends \ + wget \ + git \ + python3 \ + python3-dev \ + python3-pip \ + sqlite3 \ + unixodbc \ + unixodbc-dev \ + sudo \ + unzip \ + && apt-get clean + +RUN pip3 install \ + numpy \ + pyodbc + +# ARG odbc_driver_url="https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.1.4.20200302/clickhouse-odbc-1.1.4-Linux.tar.gz" +ARG odbc_driver_url="https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.2.1.20220905/clickhouse-odbc-linux.zip" + +RUN mkdir -p /tmp/clickhouse-odbc-tmp \ + && cd /tmp/clickhouse-odbc-tmp \ + && wget -nv ${odbc_driver_url} -O /tmp/clickhouse-odbc-tmp/clickhouse-odbc-linux.zip \ + && unzip /tmp/clickhouse-odbc-tmp/clickhouse-odbc-linux.zip -d /tmp/clickhouse-odbc-tmp \ + && tar -xzf /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux.tar.gz -C /tmp/clickhouse-odbc-tmp \ + && mkdir -p /usr/local/lib64 \ + && cp /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/lib64/*.so /usr/local/lib64/ \ + && odbcinst -i -d -f /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/share/doc/clickhouse-odbc/config/odbcinst.ini.sample \ + && odbcinst -i -s -l -f /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/share/doc/clickhouse-odbc/config/odbc.ini.sample \ + && rm -rf /tmp/clickhouse-odbc-tmp + +ENV TZ=Europe/Amsterdam +ENV MAX_RUN_TIME=900 +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +COPY run.sh / +CMD ["/bin/bash", "/run.sh"] diff --git a/docker/test/sqllogic/run.sh b/docker/test/sqllogic/run.sh new file mode 100755 index 00000000000..8d0252e3c98 --- /dev/null +++ b/docker/test/sqllogic/run.sh @@ -0,0 +1,100 @@ +#!/bin/bash +set -exu +trap "exit" INT TERM + +echo "ENV" +env + +# fail on errors, verbose and export all env variables +set -e -x -a + +echo "Current directory" +pwd +echo "Files in current directory" +ls -la ./ +echo "Files in root directory" +ls -la / +echo "Files in /clickhouse-tests directory" +ls -la /clickhouse-tests +echo "Files in /clickhouse-tests/sqllogic directory" +ls -la /clickhouse-tests/sqllogic +echo "Files in /package_folder directory" +ls -la /package_folder +echo "Files in /test_output" +ls -la /test_output +echo "File in /sqllogictest" +ls -la /sqllogictest + +dpkg -i package_folder/clickhouse-common-static_*.deb +dpkg -i package_folder/clickhouse-common-static-dbg_*.deb +dpkg -i package_folder/clickhouse-server_*.deb +dpkg -i package_folder/clickhouse-client_*.deb + +# install test configs +# /clickhouse-tests/config/install.sh + +sudo clickhouse start + +sleep 5 +for _ in $(seq 1 60); do if [[ $(wget --timeout=1 -q 'localhost:8123' -O-) == 'Ok.' ]]; then break ; else sleep 1; fi ; done + +function run_tests() +{ + set -x + + cd /test_output + + /clickhouse-tests/sqllogic/runner.py --help 2>&1 \ + | ts '%Y-%m-%d %H:%M:%S' + + mkdir -p /test_output/self-test + /clickhouse-tests/sqllogic/runner.py --log-file /test_output/runner-self-test.log \ + self-test \ + --self-test-dir /clickhouse-tests/sqllogic/self-test \ + --out-dir /test_output/self-test \ + 2>&1 \ + | ts '%Y-%m-%d %H:%M:%S' + + cat /test_output/self-test/check_status.tsv >> /test_output/check_status.tsv + cat /test_output/self-test/test_results.tsv >> /test_output/test_results.tsv ||: + tar -zcvf self-test.tar.gz self-test 1>/dev/null + + if [ -d /sqllogictest ] + then + mkdir -p /test_output/statements-test + /clickhouse-tests/sqllogic/runner.py \ + --log-file /test_output/runner-statements-test.log \ + --log-level info \ + statements-test \ + --input-dir /sqllogictest \ + --out-dir /test_output/statements-test \ + 2>&1 \ + | ts '%Y-%m-%d %H:%M:%S' + + cat /test_output/statements-test/check_status.tsv >> /test_output/check_status.tsv + cat /test_output/statements-test/test_results.tsv >> /test_output/test_results.tsv + tar -zcvf statements-check.tar.gz statements-test 1>/dev/null + fi +} + +export -f run_tests + +timeout "${MAX_RUN_TIME:-9000}" bash -c run_tests || echo "timeout reached" >&2 + +#/process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv + +clickhouse-client -q "system flush logs" ||: + +# Stop server so we can safely read data with clickhouse-local. +# Why do we read data with clickhouse-local? +# Because it's the simplest way to read it when server has crashed. +sudo clickhouse stop ||: + +for _ in $(seq 1 60); do if [[ $(wget --timeout=1 -q 'localhost:8123' -O-) == 'Ok.' ]]; then sleep 1 ; else break; fi ; done + +grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server.log ||: +pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.gz & + +# Compressed (FIXME: remove once only github actions will be left) +rm /var/log/clickhouse-server/clickhouse-server.log +mv /var/log/clickhouse-server/stderr.log /test_output/ ||: diff --git a/tests/ci/ci_config.py b/tests/ci/ci_config.py index 2f35b337cb3..f65593157d0 100644 --- a/tests/ci/ci_config.py +++ b/tests/ci/ci_config.py @@ -159,14 +159,14 @@ CI_CONFIG = { "builds_report_config": { "ClickHouse build check": [ "package_release", - "coverity", + # "coverity", "package_aarch64", - "package_asan", - "package_ubsan", - "package_tsan", - "package_msan", - "package_debug", - "binary_release", + # "package_asan", + # "package_ubsan", + # "package_tsan", + # "package_msan", + # "package_debug", + # "binary_release", ], "ClickHouse special build check": [ "binary_tidy", @@ -375,6 +375,12 @@ CI_CONFIG = { "SQLancer (debug)": { "required_build": "package_debug", }, + "Sqllogic test (debug)": { + "required_build": "package_debug", + }, + "Sqllogic test (release)": { + "required_build": "package_release", + }, }, } # type: dict @@ -383,12 +389,12 @@ REQUIRED_CHECKS = [ "Fast test", "Style Check", "ClickHouse build check", - "ClickHouse special build check", - "Stateful tests (release)", - "Stateless tests (release)", - "Unit tests (release-clang)", - "Unit tests (asan)", - "Unit tests (msan)", - "Unit tests (tsan)", - "Unit tests (ubsan)", + # "ClickHouse special build check", + # "Stateful tests (release)", + # "Stateless tests (release)", + # "Unit tests (release-clang)", + # "Unit tests (asan)", + # "Unit tests (msan)", + # "Unit tests (tsan)", + # "Unit tests (ubsan)", ] diff --git a/tests/ci/report.py b/tests/ci/report.py index ddee035d26f..15d8ff9010e 100644 --- a/tests/ci/report.py +++ b/tests/ci/report.py @@ -196,7 +196,7 @@ class TestResult: ) for log_path in log_paths: file = Path(log_path) - assert file.exists() + assert file.exists(), file self.log_files.append(file) diff --git a/tests/ci/sqllogic_test.py b/tests/ci/sqllogic_test.py new file mode 100755 index 00000000000..9b41ff4680f --- /dev/null +++ b/tests/ci/sqllogic_test.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 + +import argparse +import csv +import logging +import os +import subprocess +import sys +from pathlib import Path + +from github import Github + +from env_helper import TEMP_PATH, REPO_COPY, REPORTS_PATH +from s3_helper import S3Helper +from get_robot_token import get_best_robot_token +from pr_info import FORCE_TESTS_LABEL, PRInfo +from build_download_helper import download_all_deb_packages +from upload_result_helper import upload_results +from docker_pull_helper import get_image_with_version +from commit_status_helper import override_status, post_commit_status +from report import TestResults, read_test_results + +from stopwatch import Stopwatch +from rerun_helper import RerunHelper +from tee_popen import TeePopen + + +NO_CHANGES_MSG = "Nothing to run" +IMAGE_NAME = "clickhouse/sqllogic-test" + + +def get_run_command( + builds_path, + repo_tests_path, + result_path, + server_log_path, + kill_timeout, + additional_envs, + image, +): + envs = [ + f"-e MAX_RUN_TIME={int(0.9 * kill_timeout)}", + ] + envs += [f"-e {e}" for e in additional_envs] + + env_str = " ".join(envs) + + return ( + f"docker run " + f"--volume={builds_path}:/package_folder " + f"--volume={repo_tests_path}:/clickhouse-tests " + f"--volume={result_path}:/test_output " + f"--volume={server_log_path}:/var/log/clickhouse-server " + f"--cap-add=SYS_PTRACE {env_str} {image}" + ) + + +def __files_in_dir(dir_path): + return [ + os.path.join(dir_path, f) + for f in os.listdir(dir_path) + if os.path.isfile(os.path.join(dir_path, f)) + ] + + +def read_check_status(result_folder): + status_path = os.path.join(result_folder, "check_status.tsv") + if not os.path.exists(status_path): + return "error", "Not found check_status.tsv" + + logging.info("Found check_status.tsv") + with open(status_path, "r", encoding="utf-8") as status_file: + status_rows = list(csv.reader(status_file, delimiter="\t")) + + for row in status_rows: + if len(row) != 2: + return "error", "Invalid check_status.tsv" + if row[0] != "success": + return row[0], row[1] + + return status_rows[-1][0], status_rows[-1][1] + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("check_name") + parser.add_argument("kill_timeout", type=int) + return parser.parse_args() + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + + stopwatch = Stopwatch() + + temp_path = TEMP_PATH + repo_path = REPO_COPY + reports_path = REPORTS_PATH + + args = parse_args() + check_name = args.check_name + kill_timeout = args.kill_timeout + + pr_info = PRInfo() + gh = Github(get_best_robot_token(), per_page=100) + + rerun_helper = RerunHelper(gh, pr_info, check_name) + if rerun_helper.is_already_finished_by_status(): + logging.info("Check is already finished according to github status, exiting") + sys.exit(0) + + if not os.path.exists(temp_path): + os.makedirs(temp_path) + + docker_image = get_image_with_version(reports_path, IMAGE_NAME) + + repo_tests_path = os.path.join(repo_path, "tests") + + packages_path = os.path.join(temp_path, "packages") + if not os.path.exists(packages_path): + os.makedirs(packages_path) + + download_all_deb_packages(check_name, reports_path, packages_path) + + server_log_path = os.path.join(temp_path, "server_log") + if not os.path.exists(server_log_path): + os.makedirs(server_log_path) + + result_path = os.path.join(temp_path, "result_path") + if not os.path.exists(result_path): + os.makedirs(result_path) + + run_log_path = os.path.join(result_path, "runlog.log") + + additional_envs = [] # type: ignore + + run_command = get_run_command( # run script inside docker + packages_path, + repo_tests_path, + result_path, + server_log_path, + kill_timeout, + additional_envs, + docker_image, + ) + logging.info("Going to run func tests: %s", run_command) + + with TeePopen(run_command, run_log_path) as process: + retcode = process.wait() + if retcode == 0: + logging.info("Run successfully") + else: + logging.info("Run failed") + + subprocess.check_call(f"sudo chown -R ubuntu:ubuntu {temp_path}", shell=True) + + logging.info("Files in result folder %s", os.listdir(result_path)) + + s3_helper = S3Helper() + + status = None + description = None + + additional_logs = [] + if os.path.exists(result_path): + additional_logs.extend(__files_in_dir(result_path)) + + if os.path.exists(server_log_path): + additional_logs.extend(__files_in_dir(server_log_path)) + + status, description = read_check_status(result_path) + + test_results = [] # type: TestResults + test_results_path = Path(result_path) / "test_results.tsv" + if test_results_path.exists(): + logging.info("Found test_results.tsv") + test_results = read_test_results(test_results_path) + + if len(test_results) > 1000: + test_results = test_results[:1000] + + if len(test_results) == 0: + status, description = "error", "Empty test_results.tsv" + + assert status is not None + status = override_status(status, check_name) + + report_url = upload_results( + s3_helper, + pr_info.number, + pr_info.sha, + test_results, + [run_log_path] + additional_logs, + check_name, + ) + + print( + f"::notice:: {check_name}" + f", Result: '{status}'" + f", Description: '{description}'" + f", Report url: '{report_url}'" + ) + + # Until it pass all tests, do not block CI, report "success" + assert description is not None + post_commit_status(gh, pr_info.sha, check_name, description, "success", report_url) + + if status != "success": + if FORCE_TESTS_LABEL in pr_info.labels: + print(f"'{FORCE_TESTS_LABEL}' enabled, will report success") + else: + sys.exit(1) diff --git a/tests/ci/tests/docker_images.json b/tests/ci/tests/docker_images.json index 30fa1416f9e..0d40d43c33f 100644 --- a/tests/ci/tests/docker_images.json +++ b/tests/ci/tests/docker_images.json @@ -149,5 +149,9 @@ "docker/docs/release": { "name": "clickhouse/docs-release", "dependent": [] + }, + "docker/test/sqllogic": { + "name": "clickhouse/sqllogic-test", + "dependent": [] } } diff --git a/tests/sqllogic/connection.py b/tests/sqllogic/connection.py new file mode 100644 index 00000000000..a9976a7beca --- /dev/null +++ b/tests/sqllogic/connection.py @@ -0,0 +1,285 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import datetime +import logging +import pyodbc +import sqlite3 +import traceback +import enum +import random +import string +from contextlib import contextmanager + +from exceptions import ProgramError + + +logger = logging.getLogger("connection") +logger.setLevel(logging.DEBUG) + + +class OdbcConnectingArgs: + def __init__(self, **kwargs): + self._kwargs = kwargs + + def __str__(self): + conn_str = ";".join( + ["{}={}".format(x, y) for x, y in self._kwargs.items() if y] + ) + return conn_str + + def update_database(self, database): + self._kwargs["Database"] = database + + @staticmethod + def create_from_kw( + dsn="", server="localhost", user="default", database="default", **kwargs + ): + conn_args = { + "DSN": dsn, + "Server": server, + "User": user, + "Database": database, + } + conn_args.update(kwargs) + return OdbcConnectingArgs(**conn_args) + + @staticmethod + def create_from_connection_string(conn_str): + args = OdbcConnectingArgs() + for kv in conn_str.split(";"): + if kv: + k, v = kv.split("=", 1) + args._kwargs[k] = v + return args + + +def _random_str(length=8): + alphabet = string.ascii_lowercase + string.digits + return "".join(random.SystemRandom().choice(alphabet) for _ in range(length)) + + +def default_clickhouse_odbc_conn_str(): + return str( + OdbcConnectingArgs.create_from_kw( + dsn="ClickHouse DSN (ANSI)", + ) + ) + + +class Engines(enum.Enum): + SQLITE = enum.auto() + ODBC = enum.auto() + + @staticmethod + def list(): + return list(map(lambda c: c.name.lower(), Engines)) + + +class KnownDBMS(str, enum.Enum): + sqlite = "sqlite" + clickhouse = "ClickHouse" + + +class ConnectionWrap(object): + def __init__(self, connection=None, factory=None, factory_kwargs=None): + self._factory = factory + self._factory_kwargs = factory_kwargs + self._connection = connection + + self.DBMS_NAME = None + self.DATABASE_NAME = None + self.USER_NAME = None + + @staticmethod + def create(connection): + return ConnectionWrap(connection=connection) + + @staticmethod + def create_form_factory(factory, factory_kwargs): + return ConnectionWrap( + factory=factory, factory_kwargs=factory_kwargs + ).reconnect() + + def can_reconnect(self): + return self._factory is not None + + def reconnect(self): + if self._connection is not None: + self._connection.close() + self._connection = self._factory(self._factory_kwargs) + return self + + def assert_can_reconnect(self): + assert self.can_reconnect(), f"no reconnect for: {self.DBMS_NAME}" + + def __getattr__(self, item): + return getattr(self._connection, item) + + def __enter__(self): + return self + + def drop_all_tables(self): + if self.DBMS_NAME == KnownDBMS.clickhouse.value: + list_query = ( + f"SELECT name FROM system.tables WHERE database='{self.DATABASE_NAME}'" + ) + elif self.DBMS_NAME == KnownDBMS.sqlite.value: + list_query = f"SELECT name FROM sqlite_master WHERE type='table'" + else: + logger.warning( + "unable to drop all tables for unknown database: %s", self.DBMS_NAME + ) + return + + list_result = execute_request(list_query, self) + logger.info("tables will be dropped: %s", list_result.get_result()) + for table_name in list_result.get_result(): + table_name = table_name[0] + execute_request(f"DROP TABLE {table_name}", self).assert_no_exception() + logger.debug("success drop table: %s", table_name) + + def _use_database(self, database="default"): + if self.DBMS_NAME == KnownDBMS.clickhouse.value: + logger.info("use test database: %s", database) + self._factory_kwargs.update_database(database) + self.reconnect() + self.DATABASE_NAME = database + + def use_random_database(self): + if self.DBMS_NAME == KnownDBMS.clickhouse.value: + database = f"test_{_random_str()}" + execute_request(f"CREATE DATABASE {database}", self).assert_no_exception() + self._use_database(database) + logger.info( + "currentDatabase : %s", + execute_request(f"SELECT currentDatabase()", self).get_result(), + ) + + @contextmanager + def with_one_test_scope(self): + try: + yield self + finally: + self.drop_all_tables() + + @contextmanager + def with_test_database_scope(self): + self.use_random_database() + try: + yield self + finally: + self._use_database() + + def __exit__(self, *args): + if hasattr(self._connection, "close"): + return self._connection.close() + + +def setup_connection(engine, conn_str=None, make_debug_request=True): + connection = None + + if isinstance(engine, str): + engine = Engines[engine.upper()] + + if engine == Engines.ODBC: + if conn_str is None: + raise ProgramError("conn_str has to be set up for ODBC connection") + + logger.debug("Drivers: %s", pyodbc.drivers()) + logger.debug("DataSources: %s", pyodbc.dataSources()) + logger.debug("Connection string: %s", conn_str) + + conn_args = OdbcConnectingArgs.create_from_connection_string(conn_str) + + connection = ConnectionWrap.create_form_factory( + factory=lambda args: pyodbc.connect(str(args)), + factory_kwargs=conn_args, + ) + connection.add_output_converter(pyodbc.SQL_UNKNOWN_TYPE, lambda x: None) + + connection.DBMS_NAME = connection.getinfo(pyodbc.SQL_DBMS_NAME) + connection.DATABASE_NAME = connection.getinfo(pyodbc.SQL_DATABASE_NAME) + connection.USER_NAME = connection.getinfo(pyodbc.SQL_USER_NAME) + + elif engine == Engines.SQLITE: + conn_str = conn_str if conn_str is not None else ":memory:" + connection = ConnectionWrap.create(sqlite3.connect(conn_str)) + + connection.DBMS_NAME = "sqlite" + connection.DATABASE_NAME = "main" + connection.USER_NAME = "default" + + logger.info( + "Connection info: DBMS name %s, database %s, user %s", + connection.DBMS_NAME, + connection.DATABASE_NAME, + connection.USER_NAME, + ) + + if make_debug_request: + request = "SELECT 1" + logger.debug("Make debug request to the connection: %s", request) + result = execute_request(request, connection) + logger.debug("Debug request returned: %s", result.get_result()) + + logger.debug("Connection is ok") + return connection + + +class ExecResult: + def __init__(self): + self._exception = None + self._result = None + self._description = None + + def as_exception(self, exc): + self._exception = exc + return self + + def get_result(self): + self.assert_no_exception() + return self._result + + def get_description(self): + self.assert_no_exception() + return self._description + + def as_ok(self, rows=None, description=None): + if rows is None: + self._result = True + return self + self._result = rows + self._description = description + return self + + def get_exception(self): + return self._exception + + def has_exception(self): + return self._exception is not None + + def assert_no_exception(self): + if self.has_exception(): + raise ProgramError( + f"request doesn't have a result set, it has the exception", + parent=self._exception, + ) + + +def execute_request(request, connection): + cursor = connection.cursor() + try: + cursor.execute(request) + if cursor.description: + logging.debug("request has a description %s", cursor.description) + rows = cursor.fetchall() + connection.commit() + return ExecResult().as_ok(rows=rows, description=cursor.description) + else: + logging.debug("request doesn't have a description") + connection.commit() + return ExecResult().as_ok() + except (pyodbc.Error, sqlite3.DatabaseError) as err: + return ExecResult().as_exception(err) + finally: + cursor.close() diff --git a/tests/sqllogic/exceptions.py b/tests/sqllogic/exceptions.py new file mode 100644 index 00000000000..30c8983d80f --- /dev/null +++ b/tests/sqllogic/exceptions.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from enum import Enum + + +class Error(Exception): + def __init__( + self, + message, + file=None, + name=None, + pos=None, + request=None, + details=None, + *args, + **kwargs, + ): + super().__init__(message, *args, **kwargs) + self._file = file + self._name = name + self._pos = pos + self._request = request + self._details = details + + @property + def test_file(self): + return self._file + + @property + def test_name(self): + return self._name + + @property + def test_pos(self): + return self._pos + + @property + def request(self): + return self._request + + @property + def message(self): + return super().__str__() + + @property + def reason(self): + return ", ".join( + ( + str(x) + for x in [ + super().__str__(), + "details: {}".format(self._details) if self._details else "", + ] + if x + ) + ) + + def set_details(self, file=None, name=None, pos=None, request=None, details=None): + if file is not None: + self._file = file + if name is not None: + self._name = name + if pos is not None: + self._pos = pos + if pos is not None: + self._request = request + if request is not None: + self._request = request + if details is not None: + self._details = details + + def _at_file_and_pos(self): + if self._file is not None and self._pos is not None: + return f"at: [{self._file}:{self._pos}]" + if self._name is not None and self._pos is not None: + return f"at: [{self._name}:{self._pos}]" + return None + + +class ErrorWithParent(Error): + def __init__(self, message, parent=None, *args, **kwargs): + super().__init__(message, *args, **kwargs) + self._parent = parent + + def get_parent(self): + return self._parent + + @property + def reason(self): + return ", ".join( + ( + str(x) + for x in [ + super().reason, + "exception: {}".format(str(self._parent)) if self._parent else "", + ] + if x + ) + ) + + +class ProgramError(ErrorWithParent): + def __str__(self): + return self.reason + + +class DataResultDiffer(Error): + pass + + +class SchemeResultDiffer(Error): + pass + + +class StatementExecutionError(ErrorWithParent): + pass + + +class QueryExecutionError(ErrorWithParent): + pass + + +class StatementSuccess(Error): + def __init__(self, *args, **kwargs): + message = kwargs["success"] if "message" in kwargs else "success" + super().__init__(message, *args, **kwargs) + + +class QuerySuccess(Error): + def __init__(self, *args, **kwargs): + message = kwargs["success"] if "message" in kwargs else "success" + super().__init__(message, *args, **kwargs) diff --git a/tests/sqllogic/runner.py b/tests/sqllogic/runner.py new file mode 100755 index 00000000000..1cf4c19c649 --- /dev/null +++ b/tests/sqllogic/runner.py @@ -0,0 +1,428 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import argparse +import enum +import os +import logging +import csv +import json +import multiprocessing +from functools import reduce +from deepdiff import DeepDiff + +from connection import setup_connection, Engines, default_clickhouse_odbc_conn_str +from test_runner import TestRunner, Status, RequestType + + +LEVEL_NAMES = [x.lower() for x in logging._nameToLevel.keys() if x != logging.NOTSET] + + +def setup_logger(args): + logging.getLogger().setLevel(logging.NOTSET) + formatter = logging.Formatter( + fmt="%(asctime)s %(levelname)s %(name)s %(filename)s %(funcName)s:%(lineno)d - %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + + if args.log_file: + file_handler = logging.FileHandler(args.log_file) + file_handler.setLevel(args.log_level.upper()) + file_handler.setFormatter(formatter) + logging.getLogger().addHandler(file_handler) + else: + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.INFO) + stream_handler.setFormatter(formatter) + logging.getLogger().addHandler(stream_handler) + + +def __write_check_status(status_row, out_dir): + if len(status_row) > 140: + status_row = status_row[0:135] + "..." + check_status_path = os.path.join(out_dir, "check_status.tsv") + with open(check_status_path, "a") as stream: + writer = csv.writer(stream, delimiter="\t", lineterminator="\n") + writer.writerow(status_row) + + +class TestNameGranularity(str, enum.Enum): + file = enum.auto() + request = enum.auto() + + +def __write_test_result( + reports, + out_dir, + mode_name, + granularity=TestNameGranularity.request, + only_errors=None, +): + all_stages = reports.keys() + test_results_path = os.path.join(out_dir, "test_results.tsv") + with open(test_results_path, "a") as stream: + writer = csv.writer(stream, delimiter="\t", lineterminator="\n") + for stage in all_stages: + report = reports[stage] + for test_report in report.tests.values(): + test_name_prefix = ( + f"sqllogic::{mode_name}::{stage}::{test_report.test_name}" + ) + + for request_status in test_report.requests.values(): + if request_status.status == Status.error or not only_errors: + test_name = test_name_prefix + if granularity == TestNameGranularity.request: + test_name += f"::{request_status.position}" + + test_status = "success" + if request_status.status == Status.error: + test_status = "FAIL" + + log_row = ( + f"position: {request_status.position}" + f", type: {request_status.request_type.name.lower()}" + f", request: '{request_status.request}'" + ) + if request_status.status == Status.error: + log_row += f", reason: '{request_status.reason}'" + + writer.writerow( + [ + test_name, + test_status, + 0, + log_row, + ] + ) + + +def statements_report(reports, out_dir, mode_name): + __write_test_result( + reports, + out_dir, + mode_name, + granularity=TestNameGranularity.file, + only_errors=True, + ) + + failed_stages = [] + for stage, report in reports.items(): + if report.stats.total.fail > 0: + failed_stages.append(stage) + + if len(failed_stages) == 0: + status_row = [ + "success", + f"All tests from {mode_name} are successful", + ] + __write_check_status(status_row, out_dir) + return + + stage = max(failed_stages, key=lambda x: reports[x].stats.total.fail) + stats = reports[stage].stats + status_row = [ + "error", + f"{stats.total.fail}/{stats.total.all} tests failed at {mode_name}::{stage}", + ] + __write_check_status(status_row, out_dir) + + +def _child_process(setup_kwargs, runner_kwargs, input_dir, output_dir, test): + with setup_connection(**setup_kwargs) as connection: + with connection.with_test_database_scope(): + runner = TestRunner(connection, **runner_kwargs) + runner.run_all_tests_from_file(test, input_dir) + runner.write_results_to_dir(output_dir) + return runner.report + + +def run_all_tests_in_parallel(setup_kwargs, runner_kwargs, input_dir, output_dir): + process_count = max(1, os.cpu_count() - 2) + with multiprocessing.Pool(process_count) as pool: + async_results = [ + pool.apply_async( + _child_process, + args=( + setup_kwargs, + runner_kwargs, + input_dir, + output_dir, + test, + ), + ) + for test in TestRunner.list_tests(input_dir) + ] + reports = [ar.get() for ar in async_results] + + report = reduce(lambda x, y: x.combine_with(y), reports) + report.write_report(output_dir) + return report + + +def as_kwargs(**kwargs): + return kwargs + + +def mode_check_statements(parser): + parser.add_argument("--input-dir", metavar="DIR", required=True) + parser.add_argument("--out-dir", metavar="DIR", required=True) + + def calle(args): + input_dir = os.path.realpath(args.input_dir) + out_dir = os.path.realpath(args.out_dir) + + if not os.path.exists(input_dir): + raise FileNotFoundError( + input_dir, f"check statements: no such file or directory {input_dir}" + ) + + if not os.path.isdir(input_dir): + raise NotADirectoryError( + input_dir, f"check statements:: not a dir {input_dir}" + ) + + reports = dict() + + out_stages_dir = os.path.join(out_dir, f"{args.mode}-stages") + + complete_sqlite_dir = os.path.join(out_stages_dir, "complete-sqlite") + os.makedirs(complete_sqlite_dir, exist_ok=True) + + reports["complete-sqlite"] = run_all_tests_in_parallel( + setup_kwargs=as_kwargs( + engine=Engines.SQLITE, + ), + runner_kwargs=as_kwargs( + verify_mode=False, + skip_request_types=[RequestType.query], + stop_at_statement_error=True, + ), + input_dir=input_dir, + output_dir=complete_sqlite_dir, + ) + + verify_clickhouse_dir = os.path.join(out_stages_dir, "verify-clickhouse") + os.makedirs(verify_clickhouse_dir, exist_ok=True) + + reports["verify-clickhouse"] = run_all_tests_in_parallel( + setup_kwargs=as_kwargs( + engine=Engines.ODBC, + conn_str=default_clickhouse_odbc_conn_str(), + ), + runner_kwargs=as_kwargs( + verify_mode=True, + skip_request_types=[RequestType.query], + stop_at_statement_error=True, + ), + input_dir=complete_sqlite_dir, + output_dir=verify_clickhouse_dir, + ) + + statements_report(reports, out_dir, args.mode) + + parser.set_defaults(func=calle) + + +def make_actual_report(reports): + return {stage: report.get_map() for stage, report in reports.items()} + + +def write_actual_report(actial, out_dir): + with open(os.path.join(out_dir, "actual_report.json"), "w") as f: + f.write(json.dumps(actial)) + + +def read_canonic_report(input_dir): + file = os.path.join(input_dir, "canonic_report.json") + if not os.path.exists(file): + return {} + + with open(os.path.join(input_dir, "canonic_report.json"), "r") as f: + data = f.read() + return json.loads(data) + + +def write_canonic_report(canonic, out_dir): + with open(os.path.join(out_dir, "canonic_report.json"), "w") as f: + f.write(json.dumps(canonic)) + + +def self_test_report(reports, input_dir, out_dir, mode_name): + actual = make_actual_report(reports) + write_actual_report(actual, out_dir) + + canonic = read_canonic_report(input_dir) + write_canonic_report(canonic, out_dir) + + status_row = [ + "success", + f"All statements from {mode_name} are successful", + ] + + failed_stages = {} + + for stage, actual_report in actual.items(): + actual_stats = actual_report["stats"] + + if stage not in canonic: + failed_stages[stage] = actual_stats.items() + continue + + canonic_report = canonic[stage] + canonic_stats = canonic_report["stats"] + + logging.debug("stage: %s, canonic: %s", stage, canonic_stats) + logging.debug("stage: %s, actual: %s", stage, actual_stats) + + diff = DeepDiff(actual_stats, canonic_stats) + if len(diff): + failed_stages[stage] = diff + logging.error("diff: %s", diff) + else: + logging.debug("diff: %s", diff) + + all_stages = actual.keys() + if len(failed_stages) > 0: + description = f"Failed {len(failed_stages)}/{len(all_stages)} from {mode_name}, stages: {','.join(failed_stages)}" + status_row = ["error", description] + + __write_check_status(status_row, out_dir) + + +def mode_self_test(parser): + parser.add_argument("--self-test-dir", metavar="DIR", required=True) + parser.add_argument("--out-dir", metavar="DIR", required=True) + + def calle(args): + self_test_dir = os.path.realpath(args.self_test_dir) + if not os.path.exists(self_test_dir): + raise FileNotFoundError( + self_test_dir, f"self test: no such file or directory {self_test_dir}" + ) + if not os.path.isdir(self_test_dir): + raise NotADirectoryError( + self_test_dir, f"self test: not a dir {self_test_dir}" + ) + logging.debug("self test dir is: %s", self_test_dir) + + out_dir = os.path.realpath(args.out_dir) + if not os.path.exists(out_dir): + raise FileNotFoundError(out_dir, f"self test: dir not found {out_dir}") + if not os.path.isdir(out_dir): + raise NotADirectoryError(out_dir, f"self test: not a dir {out_dir}") + + reports = dict() + + out_stages_dir = os.path.join(out_dir, f"{args.mode}-stages") + + out_dir_sqlite_complete = os.path.join(out_stages_dir, "sqlite-complete") + os.makedirs(out_dir_sqlite_complete, exist_ok=True) + with setup_connection(Engines.SQLITE) as sqlite: + runner = TestRunner(sqlite) + runner.run_all_tests_from_dir(self_test_dir) + runner.write_results_to_dir(out_dir_sqlite_complete) + runner.write_report(out_dir_sqlite_complete) + reports["sqlite-complete"] = runner.report + + out_dir_sqlite_vs_sqlite = os.path.join(out_stages_dir, "sqlite-vs-sqlite") + os.makedirs(out_dir_sqlite_vs_sqlite, exist_ok=True) + with setup_connection(Engines.SQLITE) as sqlite: + runner = TestRunner(sqlite) + runner.with_verify_mode() + runner.run_all_tests_from_dir(out_dir_sqlite_complete) + runner.write_results_to_dir(out_dir_sqlite_vs_sqlite) + runner.write_report(out_dir_sqlite_vs_sqlite) + reports["sqlite-vs-sqlite"] = runner.report + + out_dir_clickhouse_complete = os.path.join( + out_stages_dir, "clickhouse-complete" + ) + os.makedirs(out_dir_clickhouse_complete, exist_ok=True) + with setup_connection( + Engines.ODBC, default_clickhouse_odbc_conn_str() + ) as clickhouse: + runner = TestRunner(clickhouse) + runner.run_all_tests_from_dir(self_test_dir) + runner.write_results_to_dir(out_dir_clickhouse_complete) + runner.write_report(out_dir_clickhouse_complete) + reports["clickhouse-complete"] = runner.report + + out_dir_clickhouse_vs_clickhouse = os.path.join( + out_stages_dir, "clickhouse-vs-clickhouse" + ) + os.makedirs(out_dir_clickhouse_vs_clickhouse, exist_ok=True) + with setup_connection( + Engines.ODBC, default_clickhouse_odbc_conn_str() + ) as clickhouse: + runner = TestRunner(clickhouse) + runner.with_verify_mode() + runner.run_all_tests_from_dir(out_dir_clickhouse_complete) + runner.write_results_to_dir(out_dir_clickhouse_vs_clickhouse) + runner.write_report(os.path.join(out_dir_clickhouse_vs_clickhouse)) + reports["clickhouse-vs-clickhouse"] = runner.report + + out_dir_sqlite_vs_clickhouse = os.path.join( + out_stages_dir, "sqlite-vs-clickhouse" + ) + os.makedirs(out_dir_sqlite_vs_clickhouse, exist_ok=True) + + reports["sqlite-vs-clickhouse"] = run_all_tests_in_parallel( + setup_kwargs=as_kwargs( + engine=Engines.ODBC, + conn_str=default_clickhouse_odbc_conn_str(), + ), + runner_kwargs=as_kwargs( + verify_mode=True, + ), + input_dir=out_dir_sqlite_complete, + output_dir=out_dir_sqlite_vs_clickhouse, + ) + + self_test_report(reports, self_test_dir, out_dir, args.mode) + + parser.set_defaults(func=calle) + + +def parse_args(): + parser = argparse.ArgumentParser( + description="This script runs sqllogic tests over database." + ) + + parser.add_argument("--log-file", help="write logs to the file", metavar="FILE") + parser.add_argument( + "--log-level", + help="define the log level for log file", + metavar="level", + choices=LEVEL_NAMES, + default="debug", + ) + + subparsers = parser.add_subparsers(dest="mode") + mode_check_statements( + subparsers.add_parser( + "statements-test", + help="Run all test. Check that all statements are passed", + ) + ) + mode_self_test( + subparsers.add_parser( + "self-test", + help="Run all test. Check that all statements are passed", + ) + ) + args = parser.parse_args() + if args.mode is None: + parser.print_help() + return args + + +def main(): + args = parse_args() + setup_logger(args) + if args.mode is not None: + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/tests/sqllogic/self-test/canonic_report.json b/tests/sqllogic/self-test/canonic_report.json new file mode 100644 index 00000000000..0cd1aa4b43b --- /dev/null +++ b/tests/sqllogic/self-test/canonic_report.json @@ -0,0 +1 @@ +{"sqlite-complete": {"dbms_name": "sqlite", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 14, "fail": 4}, "total": {"success": 18, "fail": 4}}, "input_dir": "/clickhouse-tests/sqllogic/self-test", "output_dir": "/test_output/self-test/self-test-stages/sqlite-complete", "tests": {"test.test": {"test_name": "test.test", "test_file": "/clickhouse-tests/sqllogic/self-test/test.test", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 14, "fail": 4}, "total": {"success": 18, "fail": 4}}, "requests": {"5": {"status": "success", "position": 5, "request_type": "statement", "request": "CREATE TABLE t1(a INTEGER, b INTEGER)", "reason": "success"}, "9": {"status": "success", "position": 9, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(1,2)", "reason": "success"}, "12": {"status": "success", "position": 12, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(3,4)", "reason": "success"}, "15": {"status": "success", "position": 15, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(5,6)", "reason": "success"}, "18": {"status": "success", "position": 18, "request_type": "query", "request": "SELECT a, b FROM t1 ORDER BY 2,1", "reason": "success"}, "25": {"status": "error", "position": 25, "request_type": "query", "request": "SELECT a, c FROM t1 ORDER BY 2,1", "reason": "query execution failed with an exception, exception: no such column: c"}, "38": {"status": "success", "position": 38, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "success"}, "44": {"status": "error", "position": 44, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "query is expected to fail with different error, details: expected error: expect to fail in a different way, exception: no such column: c"}, "49": {"status": "success", "position": 49, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "55": {"status": "success", "position": 55, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "60": {"status": "success", "position": 60, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "64": {"status": "success", "position": 64, "request_type": "query", "request": "SELECT -1.0", "reason": "success"}, "70": {"status": "success", "position": 70, "request_type": "query", "request": "SELECT -1", "reason": "success"}, "76": {"status": "success", "position": 76, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "success"}, "82": {"status": "error", "position": 82, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "canonic and actual columns count differ, details: expected columns 1, actual columns 2"}, "88": {"status": "error", "position": 88, "request_type": "query", "request": "SELECT 1.0", "reason": "canonic and actual columns count differ, details: expected columns 2, actual columns 1"}, "94": {"status": "success", "position": 94, "request_type": "query", "request": "select a, b from t1 where a = b", "reason": "success"}, "99": {"status": "success", "position": 99, "request_type": "query", "request": "SELECT 1.0013", "reason": "success"}, "105": {"status": "success", "position": 105, "request_type": "query", "request": "SELECT NULL as a", "reason": "success"}, "116": {"status": "success", "position": 116, "request_type": "query", "request": "SELECT NULL", "reason": "success"}, "121": {"status": "success", "position": 121, "request_type": "query", "request": "SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15", "reason": "success"}, "126": {"status": "success", "position": 126, "request_type": "query", "request": "WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 20 ) SELECT x FROM cnt;", "reason": "success"}}}}}, "sqlite-vs-sqlite": {"dbms_name": "sqlite", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 15, "fail": 3}, "total": {"success": 19, "fail": 3}}, "input_dir": "/test_output/self-test/self-test-stages/sqlite-complete", "output_dir": "/test_output/self-test/self-test-stages/sqlite-vs-sqlite", "tests": {"test.test": {"test_name": "test.test", "test_file": "/test_output/self-test/self-test-stages/sqlite-complete/test.test", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 15, "fail": 3}, "total": {"success": 19, "fail": 3}}, "requests": {"5": {"status": "success", "position": 5, "request_type": "statement", "request": "CREATE TABLE t1(a INTEGER, b INTEGER)", "reason": "success"}, "9": {"status": "success", "position": 9, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(1,2)", "reason": "success"}, "12": {"status": "success", "position": 12, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(3,4)", "reason": "success"}, "15": {"status": "success", "position": 15, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(5,6)", "reason": "success"}, "18": {"status": "success", "position": 18, "request_type": "query", "request": "SELECT a, b FROM t1 ORDER BY 2,1", "reason": "success"}, "28": {"status": "success", "position": 28, "request_type": "query", "request": "SELECT a, c FROM t1 ORDER BY 2,1", "reason": "success"}, "42": {"status": "success", "position": 42, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "success"}, "48": {"status": "error", "position": 48, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "query is expected to fail with different error, details: expected error: expect to fail in a different way, exception: no such column: c"}, "54": {"status": "success", "position": 54, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "60": {"status": "success", "position": 60, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "66": {"status": "success", "position": 66, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "72": {"status": "success", "position": 72, "request_type": "query", "request": "SELECT -1.0", "reason": "success"}, "78": {"status": "success", "position": 78, "request_type": "query", "request": "SELECT -1", "reason": "success"}, "84": {"status": "success", "position": 84, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "success"}, "90": {"status": "error", "position": 90, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "canonic and actual columns count differ, details: expected columns 1, actual columns 2"}, "96": {"status": "error", "position": 96, "request_type": "query", "request": "SELECT 1.0", "reason": "canonic and actual columns count differ, details: expected columns 2, actual columns 1"}, "102": {"status": "success", "position": 102, "request_type": "query", "request": "select a, b from t1 where a = b", "reason": "success"}, "107": {"status": "success", "position": 107, "request_type": "query", "request": "SELECT 1.0013", "reason": "success"}, "113": {"status": "success", "position": 113, "request_type": "query", "request": "SELECT NULL as a", "reason": "success"}, "124": {"status": "success", "position": 124, "request_type": "query", "request": "SELECT NULL", "reason": "success"}, "129": {"status": "success", "position": 129, "request_type": "query", "request": "SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15", "reason": "success"}, "135": {"status": "success", "position": 135, "request_type": "query", "request": "WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x+1 FROM cnt LIMIT 20 ) SELECT x FROM cnt;", "reason": "success"}}}}}, "clickhouse-complete": {"dbms_name": "ClickHouse", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 15, "fail": 4}, "total": {"success": 19, "fail": 4}}, "input_dir": "/clickhouse-tests/sqllogic/self-test", "output_dir": "/test_output/self-test/self-test-stages/clickhouse-complete", "tests": {"test.test": {"test_name": "test.test", "test_file": "/clickhouse-tests/sqllogic/self-test/test.test", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 15, "fail": 4}, "total": {"success": 19, "fail": 4}}, "requests": {"1": {"status": "success", "position": 1, "request_type": "statement", "request": "CREATE TABLE t1(a INTEGER, b INTEGER) ENGINE = MergeTree() PRIMARY KEY tuple()", "reason": "success"}, "9": {"status": "success", "position": 9, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(1,2)", "reason": "success"}, "12": {"status": "success", "position": 12, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(3,4)", "reason": "success"}, "15": {"status": "success", "position": 15, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(5,6)", "reason": "success"}, "18": {"status": "success", "position": 18, "request_type": "query", "request": "SELECT a, b FROM t1 ORDER BY 2,1", "reason": "success"}, "25": {"status": "error", "position": 25, "request_type": "query", "request": "SELECT a, c FROM t1 ORDER BY 2,1", "reason": "query execution failed with an exception, exception: ('HY000', \"[HY000] HTTP status code: 404\nReceived error:\nCode: 47. DB::Exception: Missing columns: 'c' while processing query: 'SELECT a, c FROM t1 ORDER BY c ASC, a ASC', required columns: 'a' 'c', maybe you meant: 'a'. (UNKNOWN_IDENTIFIER) (version 23.3.1.1654 (official build))\n\n (1) (SQLExecDirectW)\")"}, "32": {"status": "success", "position": 32, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "success"}, "44": {"status": "error", "position": 44, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "query is expected to fail with different error, details: expected error: expect to fail in a different way, exception: ('HY000', \"[HY000] HTTP status code: 404\nReceived error:\nCode: 47. DB::Exception: Missing columns: 'c' while processing query: 'SELECT a, c FROM t1', required columns: 'a' 'c', maybe you meant: 'a'. (UNKNOWN_IDENTIFIER) (version 23.3.1.1654 (official build))\n\n (1) (SQLExecDirectW)\")"}, "49": {"status": "success", "position": 49, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "55": {"status": "success", "position": 55, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "60": {"status": "success", "position": 60, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "64": {"status": "success", "position": 64, "request_type": "query", "request": "SELECT -1.0", "reason": "success"}, "70": {"status": "success", "position": 70, "request_type": "query", "request": "SELECT -1", "reason": "success"}, "76": {"status": "success", "position": 76, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "success"}, "82": {"status": "error", "position": 82, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "canonic and actual columns count differ, details: expected columns 1, actual columns 2"}, "88": {"status": "error", "position": 88, "request_type": "query", "request": "SELECT 1.0", "reason": "canonic and actual columns count differ, details: expected columns 2, actual columns 1"}, "94": {"status": "success", "position": 94, "request_type": "query", "request": "select a, b from t1 where a = b", "reason": "success"}, "99": {"status": "success", "position": 99, "request_type": "query", "request": "SELECT 1.0013", "reason": "success"}, "105": {"status": "success", "position": 105, "request_type": "query", "request": "SELECT NULL as a", "reason": "success"}, "110": {"status": "success", "position": 110, "request_type": "query", "request": "SELECT CAST(NULL AS Nullable(INTEGER))", "reason": "success"}, "116": {"status": "success", "position": 116, "request_type": "query", "request": "SELECT NULL", "reason": "success"}, "121": {"status": "success", "position": 121, "request_type": "query", "request": "SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15", "reason": "success"}, "139": {"status": "success", "position": 139, "request_type": "query", "request": "SELECT number+1 from system.numbers LIMIT 20", "reason": "success"}}}}}, "clickhouse-vs-clickhouse": {"dbms_name": "ClickHouse", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 16, "fail": 3}, "total": {"success": 20, "fail": 3}}, "input_dir": "/test_output/self-test/self-test-stages/clickhouse-complete", "output_dir": "/test_output/self-test/self-test-stages/clickhouse-vs-clickhouse", "tests": {"test.test": {"test_name": "test.test", "test_file": "/test_output/self-test/self-test-stages/clickhouse-complete/test.test", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 16, "fail": 3}, "total": {"success": 20, "fail": 3}}, "requests": {"1": {"status": "success", "position": 1, "request_type": "statement", "request": "CREATE TABLE t1(a INTEGER, b INTEGER) ENGINE = MergeTree() PRIMARY KEY tuple()", "reason": "success"}, "9": {"status": "success", "position": 9, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(1,2)", "reason": "success"}, "12": {"status": "success", "position": 12, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(3,4)", "reason": "success"}, "15": {"status": "success", "position": 15, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(5,6)", "reason": "success"}, "18": {"status": "success", "position": 18, "request_type": "query", "request": "SELECT a, b FROM t1 ORDER BY 2,1", "reason": "success"}, "28": {"status": "success", "position": 28, "request_type": "query", "request": "SELECT a, c FROM t1 ORDER BY 2,1", "reason": "success"}, "36": {"status": "success", "position": 36, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "success"}, "48": {"status": "error", "position": 48, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "query is expected to fail with different error, details: expected error: expect to fail in a different way, exception: ('HY000', \"[HY000] HTTP status code: 404\nReceived error:\nCode: 47. DB::Exception: Missing columns: 'c' while processing query: 'SELECT a, c FROM t1', required columns: 'a' 'c', maybe you meant: 'a'. (UNKNOWN_IDENTIFIER) (version 23.3.1.1654 (official build))\n\n (1) (SQLExecDirectW)\")"}, "54": {"status": "success", "position": 54, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "60": {"status": "success", "position": 60, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "66": {"status": "success", "position": 66, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "72": {"status": "success", "position": 72, "request_type": "query", "request": "SELECT -1.0", "reason": "success"}, "78": {"status": "success", "position": 78, "request_type": "query", "request": "SELECT -1", "reason": "success"}, "84": {"status": "success", "position": 84, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "success"}, "90": {"status": "error", "position": 90, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "canonic and actual columns count differ, details: expected columns 1, actual columns 2"}, "96": {"status": "error", "position": 96, "request_type": "query", "request": "SELECT 1.0", "reason": "canonic and actual columns count differ, details: expected columns 2, actual columns 1"}, "102": {"status": "success", "position": 102, "request_type": "query", "request": "select a, b from t1 where a = b", "reason": "success"}, "107": {"status": "success", "position": 107, "request_type": "query", "request": "SELECT 1.0013", "reason": "success"}, "113": {"status": "success", "position": 113, "request_type": "query", "request": "SELECT NULL as a", "reason": "success"}, "118": {"status": "success", "position": 118, "request_type": "query", "request": "SELECT CAST(NULL AS Nullable(INTEGER))", "reason": "success"}, "124": {"status": "success", "position": 124, "request_type": "query", "request": "SELECT NULL", "reason": "success"}, "129": {"status": "success", "position": 129, "request_type": "query", "request": "SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15", "reason": "success"}, "148": {"status": "success", "position": 148, "request_type": "query", "request": "SELECT number+1 from system.numbers LIMIT 20", "reason": "success"}}}}}, "sqlite-vs-clickhouse": {"dbms_name": "ClickHouse", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 13, "fail": 6}, "total": {"success": 17, "fail": 6}}, "input_dir": "/test_output/self-test/self-test-stages/sqlite-complete", "output_dir": "/test_output/self-test/self-test-stages/sqlite-vs-clickhouse", "tests": {"test.test": {"test_name": "test.test", "test_file": "/test_output/self-test/self-test-stages/sqlite-complete/test.test", "stats": {"statements": {"success": 4, "fail": 0}, "queries": {"success": 13, "fail": 6}, "total": {"success": 17, "fail": 6}}, "requests": {"1": {"status": "success", "position": 1, "request_type": "statement", "request": "CREATE TABLE t1(a INTEGER, b INTEGER) ENGINE = MergeTree() PRIMARY KEY tuple()", "reason": "success"}, "9": {"status": "success", "position": 9, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(1,2)", "reason": "success"}, "12": {"status": "success", "position": 12, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(3,4)", "reason": "success"}, "15": {"status": "success", "position": 15, "request_type": "statement", "request": "INSERT INTO t1(a,b) VALUES(5,6)", "reason": "success"}, "18": {"status": "success", "position": 18, "request_type": "query", "request": "SELECT a, b FROM t1 ORDER BY 2,1", "reason": "success"}, "28": {"status": "error", "position": 28, "request_type": "query", "request": "SELECT a, c FROM t1 ORDER BY 2,1", "reason": "canonic and actual results have different exceptions, details: canonic: query execution failed with an exception, original is: no such column: c, actual: query execution failed with an exception, original is: ('HY000', \"[HY000] HTTP status code: 404\nReceived error:\nCode: 47. DB::Exception: Missing columns: 'c' while processing query: 'SELECT a, c FROM t1 ORDER BY c ASC, a ASC', required columns: 'a' 'c', maybe you meant: 'a'. (UNKNOWN_IDENTIFIER) (version 23.3.1.1654 (official build))\n\n (1) (SQLExecDirectW)\")"}, "36": {"status": "success", "position": 36, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "success"}, "48": {"status": "error", "position": 48, "request_type": "query", "request": "SELECT a, c FROM t1", "reason": "query is expected to fail with different error, details: expected error: expect to fail in a different way, exception: ('HY000', \"[HY000] HTTP status code: 404\nReceived error:\nCode: 47. DB::Exception: Missing columns: 'c' while processing query: 'SELECT a, c FROM t1', required columns: 'a' 'c', maybe you meant: 'a'. (UNKNOWN_IDENTIFIER) (version 23.3.1.1654 (official build))\n\n (1) (SQLExecDirectW)\")"}, "54": {"status": "success", "position": 54, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "60": {"status": "success", "position": 60, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "66": {"status": "success", "position": 66, "request_type": "query", "request": "SELECT ''", "reason": "success"}, "72": {"status": "success", "position": 72, "request_type": "query", "request": "SELECT -1.0", "reason": "success"}, "78": {"status": "success", "position": 78, "request_type": "query", "request": "SELECT -1", "reason": "success"}, "84": {"status": "success", "position": 84, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "success"}, "90": {"status": "error", "position": 90, "request_type": "query", "request": "SELECT 1.0, 1", "reason": "canonic and actual columns count differ, details: expected columns 1, actual columns 2"}, "96": {"status": "error", "position": 96, "request_type": "query", "request": "SELECT 1.0", "reason": "canonic and actual columns count differ, details: expected columns 2, actual columns 1"}, "102": {"status": "success", "position": 102, "request_type": "query", "request": "select a, b from t1 where a = b", "reason": "success"}, "107": {"status": "success", "position": 107, "request_type": "query", "request": "SELECT 1.0013", "reason": "success"}, "113": {"status": "error", "position": 113, "request_type": "query", "request": "SELECT NULL as a", "reason": "actual result has exception and canonic result doesn't, details: actual: query execution failed with an exception, original is: ('ODBC SQL type 0 is not yet supported. column-index=0 type=0', 'HY106')"}, "118": {"status": "success", "position": 118, "request_type": "query", "request": "SELECT CAST(NULL AS Nullable(INTEGER))", "reason": "success"}, "124": {"status": "error", "position": 124, "request_type": "query", "request": "SELECT NULL", "reason": "actual result has exception and canonic result doesn't, details: actual: query execution failed with an exception, original is: ('ODBC SQL type 0 is not yet supported. column-index=0 type=0', 'HY106')"}, "129": {"status": "success", "position": 129, "request_type": "query", "request": "SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15", "reason": "success"}, "148": {"status": "success", "position": 148, "request_type": "query", "request": "SELECT number+1 from system.numbers LIMIT 20", "reason": "success"}}}}}} diff --git a/tests/sqllogic/self-test/test.test b/tests/sqllogic/self-test/test.test new file mode 100644 index 00000000000..1659b2b22ac --- /dev/null +++ b/tests/sqllogic/self-test/test.test @@ -0,0 +1,145 @@ +onlyif ClickHouse +statement ok +CREATE TABLE t1(a INTEGER, b INTEGER) ENGINE = MergeTree() PRIMARY KEY tuple() + +skipif ClickHouse +statement ok +CREATE TABLE t1(a INTEGER, b INTEGER) + +statement ok +INSERT INTO t1(a,b) VALUES(1,2) + +statement ok +INSERT INTO t1(a,b) VALUES(3,4) + +statement ok +INSERT INTO t1(a,b) VALUES(5,6) + +# just ok request +query II nosort +SELECT a, b + FROM t1 + ORDER BY 2,1 +---- + +# will fail and write exception as a result +query II nosort +SELECT a, c + FROM t1 + ORDER BY 2,1 +---- + +# expect to fail +onlyif ClickHouse +query error UNKNOWN_IDENTIFIER +SELECT a, c FROM t1 +---- + +# expect to fail +onlyif sqlite +query error No such column +SELECT a, c FROM t1 +---- + +# expect to fail in a different way +query error expect to fail in a different way +SELECT a, c FROM t1 +---- + +# print empty as (empty) +query T nosort +SELECT '' +---- +(empty) + +# without result set +query T nosort +SELECT '' +---- + +# without result and saparator +query T nosort +SELECT '' + +# just ok with REAL +query R nosort +SELECT -1.0 +---- +-1.000 + +# just ok with signed +query I nosort +SELECT -1 +---- +-1 + +# just ok +query RI nosort +SELECT 1.0, 1 +---- +1.000 1 + +# mess with columns count +query R nosort +SELECT 1.0, 1 +---- +1.000 1 + +# mess with colums count +query RT nosort +SELECT 1.0 +---- +1.000 + +# empty result set +query II nosort +select a, b from t1 where a = b +---- + +# precise is 3 digits +query R nosort +SELECT 1.0013 +---- +1.001 + +query T nosort +SELECT NULL as a +---- +NULL + +onlyif ClickHouse +query I nosort +SELECT CAST(NULL AS Nullable(INTEGER)) +---- +NULL + +query T nosort +SELECT NULL +---- +NULL NULL + +# thish check how result hashing works +query IIIIIIIIIIIIIII nosort +SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +---- + +skipif ClickHouse +query I nosort +WITH RECURSIVE + cnt(x) AS ( + SELECT 1 + UNION ALL + SELECT x+1 FROM cnt + LIMIT 20 + ) +SELECT x FROM cnt; +---- +20 values hashing to 52c46dff81346ead02fcf6245c762b1a + +onlyif ClickHouse +query I nosort +SELECT number+1 from system.numbers LIMIT 20 +---- +20 values hashing to 52c46dff81346ead02fcf6245c762b1a + + diff --git a/tests/sqllogic/test_parser.py b/tests/sqllogic/test_parser.py new file mode 100755 index 00000000000..42adb83809f --- /dev/null +++ b/tests/sqllogic/test_parser.py @@ -0,0 +1,609 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import logging +import os + +from itertools import chain +from enum import Enum +from hashlib import md5 +from functools import reduce + +from exceptions import Error, ProgramError, ErrorWithParent, DataResultDiffer + + +logger = logging.getLogger("parser") +logger.setLevel(logging.DEBUG) + +CONDITION_SKIP = "skipif" +CONDITION_ONLY = "onlyif" + + +# TODO replace assertions with raise exception +class TestFileFormatException(Error): + pass + + +class FileAndPos: + def __init__(self, file=None, pos=None): + self.file = file + self.pos = pos + + def __str__(self): + return f"{self.file}:{self.pos}" + + +def check_conditions(conditions, dbms_name): + rules = {} + for rec in conditions: + key, val = rec + if key not in conditions: + rules[key] = [] + rules[key].append(val) + if CONDITION_SKIP in rules: + if dbms_name in rules[CONDITION_SKIP]: + return False + if CONDITION_ONLY in rules: + if dbms_name not in rules[CONDITION_ONLY]: + return False + return True + + +class BlockType(Enum): + comments = 1 + control = 2 + statement = 3 + query = 4 + + +COMMENT_TOKENS = ["#"] +RESULT_SEPARATION_LINE = "----" +CONTROL_TOKENS = ["halt", "hash-threshold"] + +CONDITIONS_TOKENS = [CONDITION_SKIP, CONDITION_ONLY] +STATEMENT_TOKEN = "statement" +QUERY_TOKEN = "query" + + +ACCEPTABLE_TYPES = {type(""): "T", type(1): "I", type(0.001): "R"} + + +def _is_comment_line(tokens): + return tokens and tokens[0][0] in COMMENT_TOKENS + + +def _is_separation_line(tokens): + return tokens and tokens[0] == RESULT_SEPARATION_LINE + + +def _is_control_line(tokens): + return tokens and tokens[0] in CONTROL_TOKENS + + +def _is_conditional_line(tokens): + return tokens and tokens[0] in CONDITIONS_TOKENS + + +def _is_statement_line(tokens): + return tokens and tokens[0] == STATEMENT_TOKEN + + +def _is_query_line(tokens): + return tokens and tokens[0] == QUERY_TOKEN + + +class FileBlockBase: + def __init__(self, parser, start, end): + self._parser = parser + self._start = start + self._end = end + + def get_block_type(self): + pass + + def get_pos(self): + return self._start + 1 + + @staticmethod + def __parse_request(test_file, start, end): + request_end = start + while request_end < end: + tokens = test_file.get_tokens(request_end) + if not tokens or _is_separation_line(tokens): + break + request_end += 1 + request = test_file.get_tokens_from_lines(start, request_end) + logger.debug("slice request %s:%s end %s", start, request_end, end) + return " ".join(request), request_end + + @staticmethod + def __parse_result(test_file, start, end): + result_end = start + while result_end < end: + tokens = test_file.get_tokens(result_end) + if not tokens: + break + result_end += 1 + logger.debug("slice result %s:%s end %s", start, result_end, end) + result = test_file.get_tokens(start, result_end) + return result, result_end + + @staticmethod + def parse_block(parser, start, end): + file_pos = FileAndPos(parser.get_test_name(), start + 1) + logger.debug("%s start %s end %s", file_pos, start, end) + + block_type = BlockType.comments + conditions = [] + controls = [] + statement = None + query = None + request = [] + result_line = None + result = [] + + line = start + while line < end: + tokens = parser.get_tokens(line) + + if _is_comment_line(tokens): + pass + elif _is_conditional_line(tokens): + conditions.append(parser.get_tokens(line)) + + elif _is_control_line(tokens): + assert block_type in (BlockType.comments, BlockType.control) + block_type = BlockType.control + controls.append(parser.get_tokens(line)) + + elif _is_statement_line(tokens): + assert block_type in (BlockType.comments,) + block_type = BlockType.statement + statement = parser.get_tokens(line) + request, last_line = FileBlockBase.__parse_request( + parser, line + 1, end + ) + assert last_line == end + line = last_line + + elif _is_query_line(tokens): + assert block_type in (BlockType.comments,) + block_type = BlockType.query + query = parser.get_tokens(line) + request, last_line = FileBlockBase.__parse_request( + parser, line + 1, end + ) + result_line = last_line + line = last_line + if line == end: + break + tokens = parser.get_tokens(line) + assert _is_separation_line(tokens), f"last_line {last_line}, end {end}" + result, last_line = FileBlockBase.__parse_result(parser, line + 1, end) + assert last_line == end + line = last_line + line += 1 + + if block_type == BlockType.comments: + return FileBlockComments(parser, start, end) + + if block_type == BlockType.control: + return FileBlockControl(parser, start, end, conditions, controls) + + if block_type == BlockType.statement: + return FileBlockStatement( + parser, start, end, conditions, statement, request + ) + + if block_type == BlockType.query: + block = FileBlockQuery( + parser, start, end, conditions, query, request, result_line + ) + block.with_result(result) + return block + + def dump_to(self, output): + if output is None: + return + for line in range(self._start, self._end): + output.write(self._parser.get_line(line)) + output.write("\n") + + +class FileBlockComments(FileBlockBase): + def __init__(self, parser, start, end): + super().__init__(parser, start, end) + + def get_block_type(self): + return BlockType.comments + + +class FileBlockControl(FileBlockBase): + def __init__(self, parser, start, end, conditions, control): + super().__init__(parser, start, end) + self.conditions = conditions + self.control = control + + def get_block_type(self): + return BlockType.control + + def get_conditions(self): + return self.conditions + + +class FileBlockStatement(FileBlockBase): + def __init__(self, parser, start, end, conditions, statement, request): + super().__init__(parser, start, end) + self.conditions = conditions + self.statement = statement + self.request = request + + def get_block_type(self): + return BlockType.statement + + def get_request(self): + return self.request + + def get_conditions(self): + return self.conditions + + def get_statement(self): + return self.statement + + def expected_error(self): + return self.statement[1] == "error" + + +class FileBlockQuery(FileBlockBase): + def __init__(self, parser, start, end, conditions, query, request, result_line): + super().__init__(parser, start, end) + self.conditions = conditions + self.query = query + self.request = request + self.result = None + self.result_line = result_line + + def get_block_type(self): + return BlockType.query + + def get_request(self): + return self.request + + def get_conditions(self): + return self.conditions + + def get_query(self): + return self.query + + def expected_error(self): + return " ".join(self.query[2:]).lower() if self.query[1] == "error" else None + + def get_types(self): + if self.query[1] == "error": + raise TestFileFormatException( + "the query is expected to fail, there are no types" + ) + return self.query[1] + + def get_sort_mode(self): + return self.query[2] + + def get_result(self): + return self.result + + def with_result(self, result): + self.result = result + + def dump_to(self, output): + if output is None: + return + + for line in range(self._start, self.result_line): + output.write(self._parser.get_line(line)) + + if self.result is not None: + logger.debug("dump result %s", self.result) + output.write("----\n") + for row in self.result: + output.write(" ".join(row) + "\n") + + output.write("\n") + + +class TestFileParser: + CONTROL_TOKENS = ["halt", "hash-threshold"] + CONDITIONS_TOKENS = [CONDITION_SKIP, CONDITION_ONLY] + STATEMENT_TOKEN = "statement" + QUERY_TOKEN = "query" + COMMENT_TOKEN = "#" + + DEFAULT_HASH_THRESHOLD = 8 + + def __init__(self, stream, test_name, test_file): + self._stream = stream + self._test_name = test_name + self._test_file = test_file + + self._lines = [] + self._raw_tokens = [] + self._tokens = [] + self._empty_lines = [] + + def get_test_name(self): + return self._test_name + + def get_test_file(self): + if self._test_file is not None: + return self._test_file + return self._test_name + + def get_line(self, line): + return self._lines[line] + + def get_tokens(self, start, end=None): + if end is None: + return self._tokens[start] + else: + return self._tokens[start:end] + + def get_tokens_from_lines(self, start, end): + return list(chain(*self._tokens[start:end])) + + def __load_file(self): + self._lines = self._stream.readlines() + + self._raw_tokens = [line.split() for line in self._lines] + assert len(self._lines) == len(self._raw_tokens) + + self._tokens = [] + for line in self._raw_tokens: + if self.COMMENT_TOKEN in line: + comment_starts_at = line.index(self.COMMENT_TOKEN) + self._tokens.append(line[0:comment_starts_at]) + else: + self._tokens.append(line) + + self._empty_lines = [i for i, x in enumerate(self._raw_tokens) if len(x) == 0] + + logger.debug( + "Test file %s loaded rows %s, empty rows %s", + self.get_test_file(), + len(self._lines), + len(self._empty_lines), + ) + + def __unload_file(self): + self._test_file = None + self._test_name = None + self._stream = None + self._lines = [] + self._raw_tokens = [] + self._tokens = [] + self._empty_lines = [] + + def _iterate_blocks(self): + prev = 0 + for i in self._empty_lines: + if prev != i: + yield FileBlockBase.parse_block(self, prev, i) + prev = i + 1 + + if prev != len(self._lines): + yield FileBlockBase.parse_block(self, prev, len(self._lines)) + + def test_blocks(self): + try: + self.__load_file() + yield from self._iterate_blocks() + finally: + self.__unload_file() + + +class QueryResult: + def __init__( + self, + rows=None, + values_count=None, + data_hash=None, + exception=None, + hash_threshold=0, + ): + self.rows = rows + self.values_count = values_count + self.data_hash = data_hash + self.exception = exception + self.hash_threshold = hash_threshold + self.hash_it() + logger.debug("created QueryResult %s", str(self)) + + def __str__(self): + params = ", ".join( + ( + str(x) + for x in [ + "rows: {}".format(self.rows) if self.rows else "", + "values_count: {}".format(self.values_count) + if self.values_count + else "", + "data_hash: {}".format(self.data_hash) if self.data_hash else "", + "exception: {}".format(self.exception) if self.exception else "", + "hash_threshold: {}".format(self.hash_threshold) + if self.hash_threshold + else "", + ] + if x + ) + ) + return "QueryResult({})".format(params) + + def __iter__(self): + if self.rows is not None: + if self.hash_threshold == 0: + return iter(self.rows) + if self.values_count <= self.hash_threshold: + return iter(self.rows) + if self.data_hash is not None: + return iter( + [["{} values hashing to {}".format(self.values_count, self.data_hash)]] + ) + if self.exception is not None: + return iter([["exception: {}".format(self.exception)]]) + raise ProgramError("Query result is empty", details="{}".format(self.__str__())) + + @staticmethod + def __value_count(rows): + return reduce(lambda a, b: a + len(b), rows, 0) + + @staticmethod + def parse_it(rows, hash_threshold): + logger.debug("parse result len: %s rows: %s", len(rows), rows) + if len(rows) == 1: + logger.debug("one row is %s", rows) + if len(rows[0]) > 0 and rows[0][0] == "exception:": + logging.debug("as exception") + message = " ".join(rows[0][1:]) + return QueryResult(exception=message) + if len(rows[0]) == 5 and " ".join(rows[0][1:4]) == "values hashing to": + logging.debug("as hashed data") + values_count = int(rows[0][0]) + data_hash = rows[0][4] + return QueryResult(data_hash=data_hash, values_count=values_count) + logger.debug("as data") + values_count = QueryResult.__value_count(rows) + return QueryResult( + rows=rows, values_count=values_count, hash_threshold=hash_threshold + ) + + @staticmethod + def __result_as_strings(rows, types): + res = [] + for row in rows: + res_row = [] + for c, t in zip(row, types): + if c is None: + res_row.append("NULL") + continue + + if t == "T": + if c == "": + res_row.append("(empty)") + else: + res_row.append(str(c)) + elif t == "I": + res_row.append(str(int(c))) + elif t == "R": + res_row.append(f"{c:.3f}") + + res.append(res_row) + return res + + @staticmethod + def __sort_result(rows, sort_mode): + if sort_mode == "nosort": + return rows + if sort_mode == "rowsort": + return sorted(rows) + if sort_mode == "valuesort": + values = list(chain(*rows)) + values.sort() + return [values] if values else [] + + @staticmethod + def __calculate_hash(rows): + md5_hash = md5() + for row in rows: + for value in row: + md5_hash.update(value.encode("ascii")) + return str(md5_hash.hexdigest()) + + @staticmethod + def make_it(rows, types, sort_mode, hash_threshold): + values_count = QueryResult.__value_count(rows) + as_string = QueryResult.__result_as_strings(rows, types) + as_sorted = QueryResult.__sort_result(as_string, sort_mode) + return QueryResult( + rows=as_sorted, values_count=values_count, hash_threshold=hash_threshold + ) + + def hash_it(self): + if self.rows is not None and self.data_hash is None: + self.data_hash = QueryResult.__calculate_hash(self.rows) + return self + + @staticmethod + def as_exception(e): + # do not print details to the test file + # but print original exception + if isinstance(e, ErrorWithParent): + message = "{}, original is: {}".format(e, e.get_parent()) + else: + message = "{}".format(e) + + return QueryResult(exception=message) + + @staticmethod + def assert_eq(canonic, actual): + if not isinstance(canonic, QueryResult): + raise ProgramError("NotImplemented") + + if not isinstance(actual, QueryResult): + raise ProgramError("NotImplemented") + + if canonic.exception is not None or actual.exception is not None: + if canonic.exception is not None and actual.exception is not None: + if canonic.exception != actual.exception: + raise DataResultDiffer( + "canonic and actual results have different exceptions", + details=f"canonic: {canonic.exception}, actual: {actual.exception}", + ) + else: + # exceptions are the same + return + elif canonic.exception is not None: + raise DataResultDiffer( + "canonic result has exception and actual result doesn't", + details=f"canonic: {canonic.exception}", + ) + else: + raise DataResultDiffer( + "actual result has exception and canonic result doesn't", + details=f"actual: {actual.exception}", + ) + + canonic.hash_it() + actual.hash_it() + + if canonic.data_hash is not None: + if actual.data_hash is None: + raise ProgramError("actual result has to have hash for data") + if canonic.values_count != actual.values_count: + raise DataResultDiffer( + "canonic and actual results have different value count", + details="canonic values count {}, actual {}".format( + canonic.values_count, actual.values_count + ), + ) + if canonic.data_hash != actual.data_hash: + raise DataResultDiffer( + "canonic and actual results have different hashes" + ) + return + + if canonic.rows is not None and actual.rows is not None: + if canonic.values_count != actual.values_count: + raise DataResultDiffer( + "canonic and actual results have different value count", + details="canonic values count {}, actual {}".format( + canonic.values_count, actual.values_count + ), + ) + if canonic.rows != actual.rows: + raise DataResultDiffer( + "canonic and actual results have different values" + ) + return + + raise ProgramError( + "Unable to compare results", + details="actual {}, canonic {}".format(actual, canonic), + ) diff --git a/tests/sqllogic/test_runner.py b/tests/sqllogic/test_runner.py new file mode 100644 index 00000000000..3df38e7fce5 --- /dev/null +++ b/tests/sqllogic/test_runner.py @@ -0,0 +1,584 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import enum +import logging +import os +import traceback +import io +import json + +import test_parser +from exceptions import ( + Error, + ProgramError, + DataResultDiffer, + StatementExecutionError, + StatementSuccess, + QueryExecutionError, + QuerySuccess, + SchemeResultDiffer, +) +from connection import execute_request + + +logger = logging.getLogger("parser") +logger.setLevel(logging.DEBUG) + + +def _list_files(path): + logger.debug("list files in %s, type %s", path, type(path)) + + if not isinstance(path, str): + raise ProgramError("NotImplemented") + + if os.path.isfile(path): + yield path + else: + with os.scandir(path) as it: + for entry in it: + yield from _list_files(entry.path) + + +def _filter_files(suffix, files): + yield from (path for path in files if path.endswith(suffix)) + + +class RequestType(str, enum.Enum): + statement = enum.auto() + query = enum.auto() + + +class Status(str, enum.Enum): + success = "success" + error = "error" + + +class TestStatus: + def __init__(self): + self.status = None + self.file = None + self.position = None + self.request_type = None + self.request = None + self.reason = None + + def get_map(self): + return { + "status": self.status.name.lower(), + # "file": self.file, + "position": self.position, + "request_type": self.request_type.name.lower(), + "request": self.request, + "reason": self.reason, + } + + @staticmethod + def __from_error(err): + if isinstance(err, Error): + result = TestStatus() + result.name = err.test_name + result.file = err.test_file + result.position = err.test_pos + result.request = err.request + result.reason = err.reason + return result + raise ProgramError("NotImplemented") + + @staticmethod + def from_exception(ex): + result = TestStatus.__from_error(ex) + + if isinstance(ex, StatementSuccess): + result.status = Status.success + result.request_type = RequestType.statement + elif isinstance(ex, StatementExecutionError): + result.status = Status.error + result.request_type = RequestType.statement + elif isinstance(ex, QuerySuccess): + result.status = Status.success + result.request_type = RequestType.query + elif isinstance(ex, QueryExecutionError): + result.status = Status.error + result.request_type = RequestType.query + elif isinstance(ex, SchemeResultDiffer): + result.status = Status.error + result.request_type = RequestType.query + elif isinstance(ex, DataResultDiffer): + result.status = Status.error + result.request_type = RequestType.query + else: + raise ProgramError("NotImplemented", parent=ex) + + return result + + +class SimpleStats: + def __init__(self, general=None): + self._general = general + self._success = 0 + self._fail = 0 + + @property + def all(self): + return self._success + self.fail + + @property + def success(self): + return self._success + + @success.setter + def success(self, value): + if self._general is not None: + self._general.success += value - self._success + self._success = value + + @property + def fail(self): + return self._fail + + @fail.setter + def fail(self, value): + if self._general is not None: + self._general.fail += value - self._fail + self._fail = value + + def __repr__(self): + return str(self.get_map()) + + def update(self, status): + if not isinstance(status, TestStatus): + raise ProgramError("NotImplemented") + + if status.status == Status.error: + self.fail += 1 + else: + self.success += 1 + + def get_map(self): + result = dict() + result["success"] = self.success + result["fail"] = self.fail + return result + + def combine_with(self, right): + if not isinstance(right, SimpleStats): + raise ProgramError("NotImplemented") + self.success += right.success + self.fail += right.fail + + +class Stats: + def __init__(self): + self.total = SimpleStats() + self.statements = SimpleStats(self.total) + self.queries = SimpleStats(self.total) + + def __repr__(self): + return str(self.get_map()) + + def update(self, status): + if not isinstance(status, TestStatus): + raise ProgramError("NotImplemented") + + if status.request_type == RequestType.query: + choose = self.queries + else: + choose = self.statements + choose.update(status) + + def get_map(self): + result = dict() + result["statements"] = self.statements.get_map() + result["queries"] = self.queries.get_map() + result["total"] = self.total.get_map() + return result + + def combine_with(self, right): + if not isinstance(right, Stats): + raise ProgramError("NotImplemented") + self.statements.combine_with(right.statements) + self.queries.combine_with(right.queries) + + +class OneReport: + def __init__(self, test_name, test_file): + self.test_name = test_name + self.test_file = test_file + self.stats = Stats() + self.requests = dict() # type: dict(int, TestStatus) + + def update(self, status): + if not isinstance(status, TestStatus): + raise ProgramError("NotImplemented") + + self.stats.update(status) + self.requests[status.position] = status + + def __repr__(self): + return str(self.get_map()) + + def get_map(self): + result = dict() + result["test_name"] = self.test_name + result["test_file"] = self.test_file + result["stats"] = self.stats.get_map() + result["requests"] = dict() + requests = result["requests"] + for pos, status in self.requests.items(): + requests[pos] = status.get_map() + return result + + +class Report: + def __init__(self, dbms_name, input_dir=None): + self.dbms_name = dbms_name + self.stats = Stats() + self.tests = dict() # type: dict(str, OneReport) + self.input_dir = input_dir + self.output_dir = None + + def update(self, status): + if not isinstance(status, TestStatus): + raise ProgramError("NotImplemented") + + self.stats.update(status) + self.__get_file_report(status).update(status) + + def __get_file_report(self, status): + if status.name not in self.tests: + self.tests[status.name] = OneReport(status.name, status.file) + return self.tests[status.name] + + def __repr__(self): + return str(self.get_map()) + + def assign_result_dir(self, res_dir): + self.output_dir = res_dir + + def get_map(self): + result = dict() + result["dbms_name"] = self.dbms_name + result["stats"] = self.stats.get_map() + result["input_dir"] = self.input_dir + if self.input_dir is not None: + result["input_dir"] = self.input_dir + if self.output_dir is not None: + result["output_dir"] = self.output_dir + result["tests"] = dict() + tests = result["tests"] + for test_name, one_report in self.tests.items(): + tests.update({test_name: one_report.get_map()}) + return result + + def combine_with(self, right): + if not isinstance(right, Report): + raise ProgramError("NotImplemented") + + if self.dbms_name != right.dbms_name: + raise ProgramError("reports are attached to the different databases") + + if self.input_dir is None or right.input_dir is None: + raise ProgramError("can't compare input dirs") + + if self.input_dir != right.input_dir: + raise ProgramError( + "can't combine reports, they are attached to the different input dirs" + ) + + for test_name in right.tests.keys(): + if test_name in self.tests: + raise ProgramError( + f"can't combine reports, they have intersect tests, {test_name}" + ) + + self.tests.update(right.tests) + self.stats.combine_with(right.stats) + return self + + def write_report(self, report_dir): + report_path = os.path.join(report_dir, "report.json") + logger.info(f"create file {report_path}") + with open(report_path, "w") as stream: + stream.write(json.dumps(self.get_map(), indent=4)) + + +class TestRunner: + def __init__( + self, + connection, + verify_mode=None, + skip_request_types=None, + stop_at_statement_error=None, + ): + self.connection = connection + self.verify = False if verify_mode is None else verify_mode + self.skip_request_types = [] + if skip_request_types is not None: + for req_type in skip_request_types: + self.with_skip(req_type) + self.stop_at_statement_error = ( + False if stop_at_statement_error is None else stop_at_statement_error + ) + + self.dbms_name = connection.DBMS_NAME + self.report = None + self.results = None + self._input_dir = None + + def with_verify_mode(self): + self.verify = True + return self + + def with_completion_mode(self): + self.verify = False + return self + + def with_skip(self, type_request): + if type_request == RequestType.query: + self.skip_request_types.append(test_parser.BlockType.query) + if type_request == RequestType.statement: + self.skip_request_types.append(test_parser.BlockType.statement) + + def __statuses(self, parser, out_stream): + skip_rest = False + + for block in parser.test_blocks(): + test_file = parser.get_test_file() + test_name = parser.get_test_name() + position = block.get_pos() + name_pos = f"{test_name}:{position}" + + clogger = logging.getLogger(f"parser at {name_pos}") + + if skip_rest: + clogger.debug("Skip rest blocks") + block.dump_to(out_stream) + continue + + if block.get_block_type() == test_parser.BlockType.comments: + clogger.debug("Skip comment block") + block.dump_to(out_stream) + continue + + if block.get_block_type() == test_parser.BlockType.control: + clogger.debug("Skip control block", name_pos) + block.dump_to(out_stream) + continue + + clogger.debug("Request <%s>", block.get_request()) + + cond_lines = block.get_conditions() + if not test_parser.check_conditions(cond_lines, self.dbms_name): + clogger.debug("Conditionally skip block for %s", self.dbms_name) + block.dump_to(out_stream) + continue + + request = block.get_request() + exec_res = execute_request(request, self.connection) + + if block.get_block_type() in self.skip_request_types: + clogger.debug("Runtime skip block for %s", self.dbms_name) + block.dump_to(out_stream) + continue + + if block.get_block_type() == test_parser.BlockType.statement: + try: + clogger.debug("this is statement") + if block.expected_error(): + clogger.debug("error is expected") + if not exec_res.has_exception(): + raise StatementExecutionError( + "statement request did not fail as expected" + ) + else: + clogger.debug("ok is expected") + if exec_res.has_exception(): + raise StatementExecutionError( + "statement failed with exception", + parent=exec_res.get_exception(), + ) + raise StatementSuccess() + except StatementSuccess as ok: + clogger.debug("statement is ok") + ok.set_details( + file=test_file, name=test_name, pos=position, request=request + ) + block.dump_to(out_stream) + yield TestStatus.from_exception(ok) + except StatementExecutionError as err: + err.set_details( + file=test_file, name=test_name, pos=position, request=request + ) + clogger.critical("Unable to execute statement, %s", err.reason) + block.dump_to(out_stream) + if self.stop_at_statement_error: + clogger.critical("Will skip the rest of the file") + skip_rest = True + yield TestStatus.from_exception(err) + + if block.get_block_type() == test_parser.BlockType.query: + try: + clogger.debug("this is query") + expected_error = block.expected_error() + if expected_error: + clogger.debug("error is expected %s", expected_error) + if exec_res.has_exception(): + e = exec_res.get_exception() + clogger.debug("had error %s", e) + message = str(e).lower() + if expected_error not in message: + clogger.debug("errors differed") + raise QueryExecutionError( + "query is expected to fail with different error", + details=f"expected error: {expected_error}", + parent=exec_res.get_exception(), + ) + else: + clogger.debug("errors matched") + raise QuerySuccess() + else: + clogger.debug("missed error") + raise QueryExecutionError( + "query is expected to fail with error", + details="expected error: {}".format(expected_error), + ) + else: + clogger.debug("success is expected") + if exec_res.has_exception(): + clogger.debug("had error") + if self.verify: + clogger.debug("verify mode") + canonic = test_parser.QueryResult.parse_it( + block.get_result(), 10 + ) + exception = QueryExecutionError( + "query execution failed with an exception", + parent=exec_res.get_exception(), + ) + actual = test_parser.QueryResult.as_exception(exception) + test_parser.QueryResult.assert_eq(canonic, actual) + block.with_result(actual) + raise QuerySuccess() + else: + clogger.debug("completion mode") + raise QueryExecutionError( + "query execution failed with an exception", + parent=exec_res.get_exception(), + ) + + canonic_types = block.get_types() + clogger.debug("canonic types %s", canonic_types) + + if len(exec_res.get_result()) > 0: + actual_columns_count = len(exec_res.get_result()[0]) + canonic_columns_count = len(canonic_types) + if canonic_columns_count != actual_columns_count: + raise SchemeResultDiffer( + "canonic and actual columns count differ", + details="expected columns {}, actual columns {}".format( + canonic_columns_count, actual_columns_count + ), + ) + + actual = test_parser.QueryResult.make_it( + exec_res.get_result(), canonic_types, block.get_sort_mode(), 10 + ) + + if self.verify: + clogger.debug("verify mode") + canonic = test_parser.QueryResult.parse_it( + block.get_result(), 10 + ) + test_parser.QueryResult.assert_eq(canonic, actual) + + block.with_result(actual) + raise QuerySuccess() + + except QuerySuccess as ok: + ok.set_details( + file=test_file, name=test_name, pos=position, request=request + ) + clogger.debug("query ok") + block.dump_to(out_stream) + yield TestStatus.from_exception(ok) + except Error as err: + err.set_details( + file=test_file, name=test_name, pos=position, request=request + ) + clogger.warning( + "Query has failed with exception: %s", + err.reason, + ) + block.with_result(test_parser.QueryResult.as_exception(err)) + block.dump_to(out_stream) + yield TestStatus.from_exception(err) + + def run_one_test(self, stream, test_name, test_file): + if self._input_dir is not None: + if not test_file.startswith(self._input_dir): + raise ProgramError( + f"that runner instance is attached to tests in dir {self._input_dir}" + f", can't run with file {test_file}" + ) + else: + self._input_dir = os.path.dirname(test_file) + + if self.report is None: + self.report = Report(self.dbms_name, self._input_dir) + + if self.results is None: + self.results = dict() + + with self.connection.with_one_test_scope(): + out_stream = io.StringIO() + self.results[test_name] = out_stream + + parser = test_parser.TestFileParser(stream, test_name, test_file) + for status in self.__statuses(parser, out_stream): + self.report.update(status) + + def _assert_input_dir(self, input_dir): + if self._input_dir is not None: + if self._input_dir != input_dir: + raise ProgramError( + f"that runner instance is attached to tests in dir {self._input_dir}" + f", can't run with {input_dir}" + ) + + def run_all_tests_from_file(self, test_file, input_dir=None): + self._assert_input_dir(input_dir) + self._input_dir = input_dir + if self._input_dir is None: + self._input_dir = os.path.dirname(test_file) + + test_name = os.path.relpath(test_file, start=self._input_dir) + logger.debug("open file %s", test_name) + with open(test_file, "r") as stream: + self.run_one_test(stream, test_name, test_file) + + def run_all_tests_from_dir(self, input_dir): + self._assert_input_dir(input_dir) + self._input_dir = input_dir + for file_path in TestRunner.list_tests(self._input_dir): + self.run_all_tests_from_file(file_path, self._input_dir) + + def write_results_to_dir(self, dir_path): + if not os.path.isdir(dir_path): + raise NotADirectoryError(dir_path) + + self.report.assign_result_dir(dir_path) + + for test_name, stream in self.results.items(): + test_file = os.path.join(dir_path, test_name) + logger.info(f"create file {test_file}") + result_dir = os.path.dirname(test_file) + os.makedirs(result_dir, exist_ok=True) + with open(test_file, "w") as output: + output.write(stream.getvalue()) + + def write_report(self, report_dir): + self.report.write_report(report_dir) + + @staticmethod + def list_tests(input_dir): + yield from _filter_files(".test", _list_files(input_dir)) From b37dcaa3ee9f2651042c62b7b016c5cab6cb7ef9 Mon Sep 17 00:00:00 2001 From: Kseniia Sumarokova <54203879+kssenii@users.noreply.github.com> Date: Sun, 16 Apr 2023 21:00:17 +0200 Subject: [PATCH 240/535] Update registerDiskCache.cpp --- src/Disks/ObjectStorages/Cached/registerDiskCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp b/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp index 4aaad38d3c8..3a624d8a18d 100644 --- a/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp +++ b/src/Disks/ObjectStorages/Cached/registerDiskCache.cpp @@ -43,7 +43,7 @@ void registerDiskCache(DiskFactory & factory, bool /* global_skip_access_check * if (file_cache_settings.base_path.empty()) file_cache_settings.base_path = fs::path(context->getPath()) / "disks" / name / "cache/"; else if (fs::path(file_cache_settings.base_path).is_relative()) - file_cache_settings.base_path = fs::path(context->getPath()) / "caches" / cache_base_path; + file_cache_settings.base_path = fs::path(context->getPath()) / "caches" / file_cache_settings.base_path; auto cache = FileCacheFactory::instance().getOrCreate(name, file_cache_settings); auto disk = disk_it->second; From 8a28064ad4a0a6ec2d9b93f108de6e40fe20a36a Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 17 Apr 2023 01:46:58 +0200 Subject: [PATCH 241/535] Remove excessive logging --- src/IO/S3/Credentials.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/IO/S3/Credentials.cpp b/src/IO/S3/Credentials.cpp index b6b264e274e..5f494ff55b8 100644 --- a/src/IO/S3/Credentials.cpp +++ b/src/IO/S3/Credentials.cpp @@ -270,7 +270,6 @@ void AWSInstanceProfileCredentialsProvider::Reload() void AWSInstanceProfileCredentialsProvider::refreshIfExpired() { - LOG_DEBUG(logger, "Checking if latest credential pull has expired."); Aws::Utils::Threading::ReaderLockGuard guard(m_reloadLock); if (!IsTimeToRefresh(load_frequency_ms)) { From dc6e34075e690e27c718ce2b504b2abc10308f0e Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Mon, 13 Mar 2023 18:51:56 +0000 Subject: [PATCH 242/535] Read less unnecessary data from Parquet files --- src/Core/Settings.h | 2 +- src/IO/ReadBufferFromS3.cpp | 20 +++++++++++++++++++- src/IO/ReadBufferFromS3.h | 1 + src/Processors/Formats/ISchemaReader.h | 2 +- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index c47432ae14a..5e4124462a3 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -638,7 +638,7 @@ class IColumn; M(Int64, read_priority, 0, "Priority to read data from local filesystem. Only supported for 'pread_threadpool' method.", 0) \ M(UInt64, merge_tree_min_rows_for_concurrent_read_for_remote_filesystem, (20 * 8192), "If at least as many lines are read from one file, the reading can be parallelized, when reading from remote filesystem.", 0) \ M(UInt64, merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem, (24 * 10 * 1024 * 1024), "If at least as many bytes are read from one file, the reading can be parallelized, when reading from remote filesystem.", 0) \ - M(UInt64, remote_read_min_bytes_for_seek, 4 * DBMS_DEFAULT_BUFFER_SIZE, "Min bytes required for remote read (url, s3) to do seek, instead for read with ignore.", 0) \ + M(UInt64, remote_read_min_bytes_for_seek, 4 * DBMS_DEFAULT_BUFFER_SIZE, "Min bytes required for remote read (url, s3) to do seek, instead of read with ignore.", 0) \ \ M(UInt64, async_insert_threads, 16, "Maximum number of threads to actually parse and insert data in background. Zero means asynchronous mode is disabled", 0) \ M(Bool, async_insert, false, "If true, data from INSERT query is stored in queue and later flushed to table in background. Makes sense only for inserts via HTTP protocol. If wait_for_async_insert is false, INSERT query is processed almost instantly, otherwise client will wait until data will be flushed to table", 0) \ diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index 91905330b74..bf95bf59151 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -270,7 +270,25 @@ void ReadBufferFromS3::setReadUntilPosition(size_t position) if (position != static_cast(read_until_position)) { read_until_position = position; - impl.reset(); + if (impl) + { + // Not exactly a seek, but close enough. + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } + } +} + +void ReadBufferFromS3::setReadUntilEnd() +{ + if (read_until_position) + { + read_until_position = 0; + if (impl) + { + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } } } diff --git a/src/IO/ReadBufferFromS3.h b/src/IO/ReadBufferFromS3.h index 84e8d36865c..ad0430d35b1 100644 --- a/src/IO/ReadBufferFromS3.h +++ b/src/IO/ReadBufferFromS3.h @@ -69,6 +69,7 @@ public: size_t getFileSize() override; void setReadUntilPosition(size_t position) override; + void setReadUntilEnd() override; Range getRemainingReadRange() const override; diff --git a/src/Processors/Formats/ISchemaReader.h b/src/Processors/Formats/ISchemaReader.h index e6982ea743b..78b34a07840 100644 --- a/src/Processors/Formats/ISchemaReader.h +++ b/src/Processors/Formats/ISchemaReader.h @@ -16,7 +16,7 @@ namespace ErrorCodes } /// Base class for schema inference for the data in some specific format. -/// It reads some data from read buffer and try to determine the schema +/// It reads some data from read buffer and tries to determine the schema /// from read data. class ISchemaReader { From 2d4fe85513052cef84e90efa1d7c00fa28075bf9 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Mon, 13 Mar 2023 19:29:59 +0000 Subject: [PATCH 243/535] Something --- src/Common/ProfileEvents.cpp | 4 +- src/Common/RangeGenerator.h | 46 -------- src/Common/tests/gtest_range_generator.cpp | 22 ---- src/Dictionaries/HTTPDictionarySource.cpp | 4 - .../IO/CachedOnDiskReadBufferFromFile.cpp | 25 ++-- .../IO/ReadBufferFromAzureBlobStorage.cpp | 8 -- src/Disks/IO/ReadBufferFromAzureBlobStorage.h | 2 - src/Disks/IO/ReadBufferFromWebServer.cpp | 22 ++-- src/Disks/IO/ReadBufferFromWebServer.h | 2 - src/Formats/FormatFactory.cpp | 10 +- src/Formats/FormatFactory.h | 24 +++- src/Formats/FormatSettings.h | 4 + src/IO/BoundedReadBuffer.cpp | 8 -- src/IO/BoundedReadBuffer.h | 2 - src/IO/ParallelReadBuffer.cpp | 56 ++++++--- src/IO/ParallelReadBuffer.h | 12 +- src/IO/ReadBuffer.h | 16 ++- src/IO/ReadBufferFromFileDescriptor.h | 2 - src/IO/ReadBufferFromS3.cpp | 46 +++----- src/IO/ReadBufferFromS3.h | 15 +-- src/IO/ReadWriteBufferFromHTTP.h | 110 +++++++++--------- src/IO/SeekableReadBuffer.h | 21 +--- .../Formats/Impl/ArrowBufferedStreams.cpp | 28 +++-- .../Formats/Impl/ArrowBufferedStreams.h | 13 ++- .../Formats/Impl/ParquetBlockInputFormat.cpp | 98 +++++++++++----- .../Formats/Impl/ParquetBlockInputFormat.h | 29 ++++- src/Storages/StorageS3.cpp | 4 +- src/Storages/StorageURL.cpp | 7 +- src/Storages/System/StorageSystemFormats.cpp | 2 +- 29 files changed, 320 insertions(+), 322 deletions(-) delete mode 100644 src/Common/RangeGenerator.h delete mode 100644 src/Common/tests/gtest_range_generator.cpp diff --git a/src/Common/ProfileEvents.cpp b/src/Common/ProfileEvents.cpp index a17d73e1673..f9ecb62c7a9 100644 --- a/src/Common/ProfileEvents.cpp +++ b/src/Common/ProfileEvents.cpp @@ -63,7 +63,7 @@ M(DiskReadElapsedMicroseconds, "Total time spent waiting for read syscall. This include reads from page cache.") \ M(DiskWriteElapsedMicroseconds, "Total time spent waiting for write syscall. This include writes to page cache.") \ M(NetworkReceiveElapsedMicroseconds, "Total time spent waiting for data to receive or receiving data from network. Only ClickHouse-related network interaction is included, not by 3rd party libraries.") \ - M(NetworkSendElapsedMicroseconds, "Total time spent waiting for data to send to network or sending data to network. Only ClickHouse-related network interaction is included, not by 3rd party libraries..") \ + M(NetworkSendElapsedMicroseconds, "Total time spent waiting for data to send to network or sending data to network. Only ClickHouse-related network interaction is included, not by 3rd party libraries.") \ M(NetworkReceiveBytes, "Total number of bytes received from network. Only ClickHouse-related network interaction is included, not by 3rd party libraries.") \ M(NetworkSendBytes, "Total number of bytes send to network. Only ClickHouse-related network interaction is included, not by 3rd party libraries.") \ \ @@ -249,7 +249,7 @@ The server successfully detected this situation and will download merged part fr M(RWLockWritersWaitMilliseconds, "Total time spent waiting for a write lock to be acquired (in a heavy RWLock).") \ M(DNSError, "Total count of errors in DNS resolution") \ \ - M(RealTimeMicroseconds, "Total (wall clock) time spent in processing (queries and other tasks) threads (not that this is a sum).") \ + M(RealTimeMicroseconds, "Total (wall clock) time spent in processing (queries and other tasks) threads (note that this is a sum).") \ M(UserTimeMicroseconds, "Total time spent in processing (queries and other tasks) threads executing CPU instructions in user space. This include time CPU pipeline was stalled due to cache misses, branch mispredictions, hyper-threading, etc.") \ M(SystemTimeMicroseconds, "Total time spent in processing (queries and other tasks) threads executing CPU instructions in OS kernel space. This include time CPU pipeline was stalled due to cache misses, branch mispredictions, hyper-threading, etc.") \ M(MemoryOvercommitWaitTimeMicroseconds, "Total time spent in waiting for memory to be freed in OvercommitTracker.") \ diff --git a/src/Common/RangeGenerator.h b/src/Common/RangeGenerator.h deleted file mode 100644 index bb68cf78e1c..00000000000 --- a/src/Common/RangeGenerator.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include -#include - -namespace DB -{ - -class RangeGenerator -{ -public: - explicit RangeGenerator(size_t total_size_, size_t range_step_, size_t range_start = 0) - : from(range_start), range_step(range_step_), total_size(total_size_) - { - } - - size_t totalRanges() const { return static_cast(ceil(static_cast(total_size - from) / range_step)); } - - using Range = std::pair; - - // return upper exclusive range of values, i.e. [from_range, to_range> - std::optional nextRange() - { - if (from >= total_size) - { - return std::nullopt; - } - - auto to = from + range_step; - if (to >= total_size) - { - to = total_size; - } - - Range range{from, to}; - from = to; - return range; - } - -private: - size_t from; - size_t range_step; - size_t total_size; -}; - -} diff --git a/src/Common/tests/gtest_range_generator.cpp b/src/Common/tests/gtest_range_generator.cpp deleted file mode 100644 index 1f25164dfda..00000000000 --- a/src/Common/tests/gtest_range_generator.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -using namespace DB; - - -TEST(RangeGenerator, Common) -{ - RangeGenerator g{25, 10}; - EXPECT_EQ(g.totalRanges(), 3); - - std::vector ranges{{0, 10}, {10, 20}, {20, 25}}; - for (size_t i = 0; i < 3; ++i) - { - auto r = g.nextRange(); - EXPECT_TRUE(r); - EXPECT_EQ(r, ranges[i]); - } - - auto r = g.nextRange(); - EXPECT_TRUE(!r); -} diff --git a/src/Dictionaries/HTTPDictionarySource.cpp b/src/Dictionaries/HTTPDictionarySource.cpp index d2d3b344df5..757a3b1819b 100644 --- a/src/Dictionaries/HTTPDictionarySource.cpp +++ b/src/Dictionaries/HTTPDictionarySource.cpp @@ -99,7 +99,6 @@ QueryPipeline HTTPDictionarySource::loadAll() DBMS_DEFAULT_BUFFER_SIZE, context->getReadSettings(), configuration.header_entries, - ReadWriteBufferFromHTTP::Range{}, nullptr, false); return createWrappedBuffer(std::move(in_ptr)); @@ -120,7 +119,6 @@ QueryPipeline HTTPDictionarySource::loadUpdatedAll() DBMS_DEFAULT_BUFFER_SIZE, context->getReadSettings(), configuration.header_entries, - ReadWriteBufferFromHTTP::Range{}, nullptr, false); return createWrappedBuffer(std::move(in_ptr)); @@ -150,7 +148,6 @@ QueryPipeline HTTPDictionarySource::loadIds(const std::vector & ids) DBMS_DEFAULT_BUFFER_SIZE, context->getReadSettings(), configuration.header_entries, - ReadWriteBufferFromHTTP::Range{}, nullptr, false); return createWrappedBuffer(std::move(in_ptr)); @@ -180,7 +177,6 @@ QueryPipeline HTTPDictionarySource::loadKeys(const Columns & key_columns, const DBMS_DEFAULT_BUFFER_SIZE, context->getReadSettings(), configuration.header_entries, - ReadWriteBufferFromHTTP::Range{}, nullptr, false); return createWrappedBuffer(std::move(in_ptr)); diff --git a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp index 31f9373de18..096bf91e959 100644 --- a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp +++ b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp @@ -456,10 +456,12 @@ CachedOnDiskReadBufferFromFile::getImplementationBuffer(FileSegmentPtr & file_se { throw Exception( ErrorCodes::LOGICAL_ERROR, - "Buffer's offsets mismatch. Cached buffer offset: {}, current_write_offset: {} implementation buffer offset: {}, " - "implementation buffer remaining range: {}, file segment info: {}", - file_offset_of_buffer_end, current_write_offset, read_buffer_for_file_segment->getPosition(), - read_buffer_for_file_segment->getRemainingReadRange().toString(), file_segment->getInfoForLog()); + "Buffer's offsets mismatch. Cached buffer offset: {}, current_write_offset: {}, implementation buffer offset: {}, file " + "segment info: {}", + file_offset_of_buffer_end, + current_write_offset, + read_buffer_for_file_segment->getPosition(), + file_segment->getInfoForLog()); } break; @@ -844,10 +846,9 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() LOG_TEST( log, - "Current count: {}, position: {}, read range: {}, file segment: {}", + "Current count: {}, position: {}, file segment: {}", implementation_buffer->count(), implementation_buffer->getPosition(), - implementation_buffer->getRemainingReadRange().toString(), file_segment->getInfoForLog()); chassert(current_read_range.left <= file_offset_of_buffer_end); @@ -908,9 +909,9 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() LOG_TEST( log, - "Read {} bytes, read type {}, position: {}, offset: {}, remaining read range: {}", + "Read {} bytes, read type {}, position: {}, offset: {}", size, toString(read_type), implementation_buffer->getPosition(), - implementation_buffer->getFileOffsetOfBufferEnd(), implementation_buffer->getRemainingReadRange().toString()); + implementation_buffer->getFileOffsetOfBufferEnd()); if (read_type == ReadType::CACHED) { @@ -1182,12 +1183,6 @@ void CachedOnDiskReadBufferFromFile::assertCorrectness() const String CachedOnDiskReadBufferFromFile::getInfoForLog() { - String implementation_buffer_read_range_str; - if (implementation_buffer) - implementation_buffer_read_range_str = implementation_buffer->getRemainingReadRange().toString(); - else - implementation_buffer_read_range_str = "None"; - String current_file_segment_info; if (current_file_segment_it != file_segments_holder->file_segments.end()) current_file_segment_info = (*current_file_segment_it)->getInfoForLog(); @@ -1196,12 +1191,10 @@ String CachedOnDiskReadBufferFromFile::getInfoForLog() return fmt::format( "Buffer path: {}, hash key: {}, file_offset_of_buffer_end: {}, " - "internal buffer remaining read range: {}, " "read_type: {}, last caller: {}, file segment info: {}", source_file_path, getHexUIntLowercase(cache_key), file_offset_of_buffer_end, - implementation_buffer_read_range_str, toString(read_type), last_caller_id, current_file_segment_info); diff --git a/src/Disks/IO/ReadBufferFromAzureBlobStorage.cpp b/src/Disks/IO/ReadBufferFromAzureBlobStorage.cpp index 47d9cd83fd9..0f197c2ff06 100644 --- a/src/Disks/IO/ReadBufferFromAzureBlobStorage.cpp +++ b/src/Disks/IO/ReadBufferFromAzureBlobStorage.cpp @@ -54,14 +54,6 @@ ReadBufferFromAzureBlobStorage::ReadBufferFromAzureBlobStorage( } } -SeekableReadBuffer::Range ReadBufferFromAzureBlobStorage::getRemainingReadRange() const -{ - return Range{ - .left = static_cast(offset), - .right = read_until_position ? std::optional{read_until_position - 1} : std::nullopt - }; -} - void ReadBufferFromAzureBlobStorage::setReadUntilPosition(size_t position) { read_until_position = position; diff --git a/src/Disks/IO/ReadBufferFromAzureBlobStorage.h b/src/Disks/IO/ReadBufferFromAzureBlobStorage.h index 711b4ce23f7..6164a005773 100644 --- a/src/Disks/IO/ReadBufferFromAzureBlobStorage.h +++ b/src/Disks/IO/ReadBufferFromAzureBlobStorage.h @@ -38,8 +38,6 @@ public: void setReadUntilPosition(size_t position) override; - Range getRemainingReadRange() const override; - bool supportsRightBoundedReads() const override { return true; } private: diff --git a/src/Disks/IO/ReadBufferFromWebServer.cpp b/src/Disks/IO/ReadBufferFromWebServer.cpp index 04f9ce7d53e..1f4818c8cb9 100644 --- a/src/Disks/IO/ReadBufferFromWebServer.cpp +++ b/src/Disks/IO/ReadBufferFromWebServer.cpp @@ -41,18 +41,15 @@ ReadBufferFromWebServer::ReadBufferFromWebServer( std::unique_ptr ReadBufferFromWebServer::initialize() { Poco::URI uri(url); - ReadWriteBufferFromHTTP::Range range; if (read_until_position) { if (read_until_position < offset) throw Exception(ErrorCodes::LOGICAL_ERROR, "Attempt to read beyond right offset ({} > {})", offset, read_until_position - 1); - range = { .begin = static_cast(offset), .end = read_until_position - 1 }; LOG_DEBUG(log, "Reading with range: {}-{}", offset, read_until_position); } else { - range = { .begin = static_cast(offset), .end = std::nullopt }; LOG_DEBUG(log, "Reading from offset: {}", offset); } @@ -60,7 +57,7 @@ std::unique_ptr ReadBufferFromWebServer::initialize() const auto & config = context->getConfigRef(); Poco::Timespan http_keep_alive_timeout{config.getUInt("keep_alive_timeout", 20), 0}; - return std::make_unique( + auto res = std::make_unique( uri, Poco::Net::HTTPRequest::HTTP_GET, ReadWriteBufferFromHTTP::OutStreamCallback(), @@ -74,10 +71,16 @@ std::unique_ptr ReadBufferFromWebServer::initialize() buf_size, read_settings, HTTPHeaderEntries{}, - range, &context->getRemoteHostFilter(), /* delay_initialization */true, use_external_buffer); + + if (read_until_position) + res->setReadUntilPosition(read_until_position); + if (offset) + res->seek(offset, SEEK_SET); + + return res; } @@ -88,15 +91,6 @@ void ReadBufferFromWebServer::setReadUntilPosition(size_t position) } -SeekableReadBuffer::Range ReadBufferFromWebServer::getRemainingReadRange() const -{ - return Range{ - .left = static_cast(offset), - .right = read_until_position ? std::optional{read_until_position - 1} : std::nullopt - }; -} - - bool ReadBufferFromWebServer::nextImpl() { if (read_until_position) diff --git a/src/Disks/IO/ReadBufferFromWebServer.h b/src/Disks/IO/ReadBufferFromWebServer.h index 03cd107bf9a..dd9cf63224f 100644 --- a/src/Disks/IO/ReadBufferFromWebServer.h +++ b/src/Disks/IO/ReadBufferFromWebServer.h @@ -37,8 +37,6 @@ public: size_t getFileOffsetOfBufferEnd() const override { return offset; } - Range getRemainingReadRange() const override; - bool supportsRightBoundedReads() const override { return true; } private: diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index c6d85a5d84f..7a7522722bc 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -452,12 +452,14 @@ ExternalSchemaReaderPtr FormatFactory::getExternalSchemaReader( return external_schema_reader_creator(format_settings); } -void FormatFactory::registerInputFormat(const String & name, InputCreator input_creator) +void FormatFactory::registerInputFormat(const String & name, InputCreator input_creator, MultistreamInputCreator multistream_input_creator) { - auto & target = dict[name].input_creator; - if (target) + chassert(input_creator); + auto & creators = dict[name]; + if (creators.input_creator) throw Exception(ErrorCodes::LOGICAL_ERROR, "FormatFactory: Input format {} is already registered", name); - target = std::move(input_creator); + creators.input_creator = std::move(input_creator); + creators.multistream_input_creator = std::move(multistream_input_creator); registerFileExtension(name, name); KnownFormatNames::instance().add(name); } diff --git a/src/Formats/FormatFactory.h b/src/Formats/FormatFactory.h index 6697a22984c..9dd13b1fd72 100644 --- a/src/Formats/FormatFactory.h +++ b/src/Formats/FormatFactory.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -77,6 +78,26 @@ private: const RowInputFormatParams & params, const FormatSettings & settings)>; + // Advanced interface for the few more structured formats, like Parquet, which want more precise + // control over reading. The format is responsible for parallelizing reading+parsing. + // The motivating use case is ParquetBlockInputFormat, see comment there. + // + // Formats implementing this must implement InputCreator too, for non-seekable read buffers like + // stdin. + // + // In future we may also want to pass some information about WHERE conditions (SelectQueryInfo?) + // and get some information about projections (min/max/count per column per row group). + using MultistreamInputCreator = std::function io_schedule, + size_t max_download_threads, + size_t max_parsing_threads)>; + using OutputCreator = std::function & format_settings_ = std::nullopt); /// Register format by its name. - void registerInputFormat(const String & name, InputCreator input_creator); + void registerInputFormat(const String & name, InputCreator input_creator, MultistreamInputCreator multistream_input_creator = nullptr); void registerOutputFormat(const String & name, OutputCreator output_creator); /// Register file extension for format diff --git a/src/Formats/FormatSettings.h b/src/Formats/FormatSettings.h index 053b461244b..a82321ae6d3 100644 --- a/src/Formats/FormatSettings.h +++ b/src/Formats/FormatSettings.h @@ -216,6 +216,10 @@ struct FormatSettings UInt64 max_block_size = 8192; ParquetVersion output_version; ParquetCompression output_compression_method = ParquetCompression::SNAPPY; + // TODO: asdqwe use ReadSettings.remote_read_min_bytes_for_seek instead. + size_t min_bytes_for_seek = 4 * 1024 * 1024; + // Limit on read size, but not on memory usage; many reads can be buffered at once. + size_t max_bytes_to_read_at_once = 128 * 1024 * 1024; } parquet; struct Pretty diff --git a/src/IO/BoundedReadBuffer.cpp b/src/IO/BoundedReadBuffer.cpp index f4467bb2c0c..bda79d82ad3 100644 --- a/src/IO/BoundedReadBuffer.cpp +++ b/src/IO/BoundedReadBuffer.cpp @@ -19,14 +19,6 @@ void BoundedReadBuffer::setReadUntilEnd() read_until_position.reset(); } -SeekableReadBuffer::Range BoundedReadBuffer::getRemainingReadRange() const -{ - std::optional right_bound_included; - if (read_until_position) - right_bound_included = *read_until_position - 1; - return Range{file_offset_of_buffer_end, right_bound_included}; -} - off_t BoundedReadBuffer::getPosition() { return file_offset_of_buffer_end - (working_buffer.end() - pos); diff --git a/src/IO/BoundedReadBuffer.h b/src/IO/BoundedReadBuffer.h index e645e7f655c..183dbedb78b 100644 --- a/src/IO/BoundedReadBuffer.h +++ b/src/IO/BoundedReadBuffer.h @@ -22,8 +22,6 @@ public: off_t seek(off_t off, int whence) override; - Range getRemainingReadRange() const override; - size_t getFileOffsetOfBufferEnd() const override { return file_offset_of_buffer_end; } /// file_offset_of_buffer_end can differ from impl's file_offset_of_buffer_end diff --git a/src/IO/ParallelReadBuffer.cpp b/src/IO/ParallelReadBuffer.cpp index 1c7c136c315..6f5dbfb7d0e 100644 --- a/src/IO/ParallelReadBuffer.cpp +++ b/src/IO/ParallelReadBuffer.cpp @@ -13,12 +13,13 @@ namespace ErrorCodes } +// A subrange of the input, read by one SeekableReadBuffer. struct ParallelReadBuffer::ReadWorker { - explicit ReadWorker(SeekableReadBufferPtr reader_) : reader(std::move(reader_)), range(reader->getRemainingReadRange()) + ReadWorker(SeekableReadBufferPtr reader_, size_t offset_, size_t size) + : reader(std::move(reader_)), offset(offset_), bytes_left(size), range_end(offset + bytes_left) { - assert(range.right); - bytes_left = *range.right - range.left + 1; + assert(bytes_left); } auto hasSegment() const { return current_segment_index < segments.size(); } @@ -28,26 +29,34 @@ struct ParallelReadBuffer::ReadWorker assert(hasSegment()); auto next_segment = std::move(segments[current_segment_index]); ++current_segment_index; - range.left += next_segment.size(); + offset += next_segment.size(); return next_segment; } SeekableReadBufferPtr reader; - std::vector> segments; - size_t current_segment_index = 0; - bool finished{false}; - SeekableReadBuffer::Range range; - size_t bytes_left{0}; + // Reader thread produces segments, nextImpl() consumes them. + std::vector> segments; // segments that were produced + size_t current_segment_index = 0; // first segment that's not consumed + bool finished{false}; // no more segments will be produced + size_t offset; // start of segments[current_segment_idx] + size_t bytes_left; // bytes left to produce above segments end + size_t range_end; // segments end + bytes_left, i.e. how far this worker will read + + // segments[current_segment_idx..end] range_end + // |-------------|--------------------------------------|------------| + // offset bytes_left + std::atomic_bool cancel{false}; std::mutex worker_mutex; }; ParallelReadBuffer::ParallelReadBuffer( - std::unique_ptr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers_) + std::unique_ptr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers_, size_t range_step_) : SeekableReadBuffer(nullptr, 0) , max_working_readers(max_working_readers_) , schedule(std::move(schedule_)) , reader_factory(std::move(reader_factory_)) + , range_step(std::max(1ul, range_step_)) { try { @@ -62,13 +71,20 @@ ParallelReadBuffer::ParallelReadBuffer( bool ParallelReadBuffer::addReaderToPool() { + size_t file_size = reader_factory->getFileSize(); + if (next_range_start >= file_size) + return false; + size_t range_start = next_range_start; + size_t size = std::min(range_step, file_size - range_start); + next_range_start += size; + auto reader = reader_factory->getReader(); if (!reader) { return false; } - auto worker = read_workers.emplace_back(std::make_shared(std::move(reader))); + auto worker = read_workers.emplace_back(std::make_shared(std::move(reader), range_start, size)); ++active_working_reader; schedule([this, worker = std::move(worker)]() mutable { readerThreadFunction(std::move(worker)); }, 0); @@ -100,9 +116,9 @@ off_t ParallelReadBuffer::seek(off_t offset, int whence) } const auto offset_is_in_range - = [&](const auto & range) { return static_cast(offset) >= range.left && static_cast(offset) <= *range.right; }; + = [&](const auto & worker) { return static_cast(offset) >= worker->offset && static_cast(offset) < worker->range_end; }; - while (!read_workers.empty() && (offset < current_position || !offset_is_in_range(read_workers.front()->range))) + while (!read_workers.empty() && (offset < current_position || !offset_is_in_range(read_workers.front()))) { read_workers.front()->cancel = true; read_workers.pop_front(); @@ -111,7 +127,7 @@ off_t ParallelReadBuffer::seek(off_t offset, int whence) if (!read_workers.empty()) { auto & front_worker = read_workers.front(); - current_position = front_worker->range.left; + current_position = front_worker->offset; while (true) { std::unique_lock lock{front_worker->worker_mutex}; @@ -121,26 +137,25 @@ off_t ParallelReadBuffer::seek(off_t offset, int whence) handleEmergencyStop(); auto next_segment = front_worker->nextSegment(); - if (static_cast(offset) < current_position + next_segment.size()) + current_position += next_segment.size(); + if (offset < current_position) { current_segment = std::move(next_segment); working_buffer = internal_buffer = Buffer(current_segment.data(), current_segment.data() + current_segment.size()); - current_position += current_segment.size(); pos = working_buffer.end() - (current_position - offset); addReaders(); return offset; } - - current_position += next_segment.size(); } + chassert(false); } finishAndWait(); - reader_factory->seek(offset, whence); all_completed = false; read_workers.clear(); + next_range_start = offset; current_position = offset; resetWorkingBuffer(); @@ -249,6 +264,9 @@ void ParallelReadBuffer::readerThreadFunction(ReadWorkerPtr read_worker) try { + read_worker->reader->setReadUntilPosition(read_worker->range_end); + read_worker->reader->seek(read_worker->offset, SEEK_SET); + while (!emergency_stop && !read_worker->cancel) { if (!read_worker->reader->next()) diff --git a/src/IO/ParallelReadBuffer.h b/src/IO/ParallelReadBuffer.h index a7b78be442c..96f9f29c7ba 100644 --- a/src/IO/ParallelReadBuffer.h +++ b/src/IO/ParallelReadBuffer.h @@ -34,11 +34,15 @@ public: public: ~ReadBufferFactory() override = default; + // We usually call setReadUntilPosition() and seek() on the returned buffer before reading. + // So it's recommended that the returned implementation be lazy, i.e. don't start reading + // before the first call to nextImpl(). virtual SeekableReadBufferPtr getReader() = 0; - virtual off_t seek(off_t off, int whence) = 0; }; - ParallelReadBuffer(std::unique_ptr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers); + using ReadBufferFactoryPtr = std::unique_ptr; + + ParallelReadBuffer(ReadBufferFactoryPtr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers, size_t range_step_); ~ParallelReadBuffer() override { finishAndWait(); } @@ -78,6 +82,8 @@ private: ThreadPoolCallbackRunner schedule; std::unique_ptr reader_factory; + size_t range_step; + size_t next_range_start{0}; /** * FIFO queue of readers. @@ -94,7 +100,7 @@ private: std::exception_ptr background_exception = nullptr; std::atomic_bool emergency_stop{false}; - off_t current_position{0}; + off_t current_position{0}; // end of working_buffer bool all_completed{false}; }; diff --git a/src/IO/ReadBuffer.h b/src/IO/ReadBuffer.h index 3c0add151c2..3d9c713c798 100644 --- a/src/IO/ReadBuffer.h +++ b/src/IO/ReadBuffer.h @@ -211,7 +211,21 @@ public: /** * Set upper bound for read range [..., position). - * Required for reading from remote filesystem, when it matters how much we read. + * Useful for reading from remote filesystem, when it matters how much we read. + * Doesn't affect getFileSize(). + * See also: SeekableReadBuffer::supportsRightBoundedReads(). + * + * Behavior in weird cases is currently implementation-defined: + * - setReadUntilPosition() below current position, + * - setReadUntilPosition() above the end of the file, + * - seek() to a position above the until position (even if you setUntilPosition() to a higher + * value right after the seek!), + * + * Typical implementations discard any current buffers and connections, even if the position is + * adjusted only a little. + * + * Typical usage is to call it right after creating the ReadBuffer, before it started doing any + * work. */ virtual void setReadUntilPosition(size_t /* position */) {} diff --git a/src/IO/ReadBufferFromFileDescriptor.h b/src/IO/ReadBufferFromFileDescriptor.h index 46bf04d41ed..daf8ac56d13 100644 --- a/src/IO/ReadBufferFromFileDescriptor.h +++ b/src/IO/ReadBufferFromFileDescriptor.h @@ -55,8 +55,6 @@ public: return file_offset_of_buffer_end - (working_buffer.end() - pos); } - Range getRemainingReadRange() const override { return Range{ .left = file_offset_of_buffer_end, .right = std::nullopt }; } - size_t getFileOffsetOfBufferEnd() const override { return file_offset_of_buffer_end; } /// If 'offset' is small enough to stay in buffer after seek, then true seek in file does not happen. diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index bf95bf59151..5389806324a 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -226,8 +226,8 @@ off_t ReadBufferFromS3::seek(off_t offset_, int whence) return getPosition(); } - auto position = getPosition(); - if (offset_ > position) + off_t position = getPosition(); + if (impl && offset_ > position) { size_t diff = offset_ - position; if (diff < read_settings.remote_read_min_bytes_for_seek) @@ -240,7 +240,8 @@ off_t ReadBufferFromS3::seek(off_t offset_, int whence) resetWorkingBuffer(); if (impl) { - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } } @@ -269,13 +270,13 @@ void ReadBufferFromS3::setReadUntilPosition(size_t position) { if (position != static_cast(read_until_position)) { - read_until_position = position; if (impl) { - // Not exactly a seek, but close enough. - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } + read_until_position = position; } } @@ -286,15 +287,21 @@ void ReadBufferFromS3::setReadUntilEnd() read_until_position = 0; if (impl) { - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } } } -SeekableReadBuffer::Range ReadBufferFromS3::getRemainingReadRange() const -{ - return Range{ .left = static_cast(offset), .right = read_until_position ? std::optional{read_until_position - 1} : std::nullopt }; +bool ReadBufferFromS3::atEndOfRequestedRangeGuess() { + if (!impl) + return true; + if (read_until_position) + return getPosition() >= read_until_position; + if (file_size) + return getPosition() >= file_size; + return false; } std::unique_ptr ReadBufferFromS3::initialize() @@ -369,28 +376,13 @@ std::unique_ptr ReadBufferFromS3::initialize() SeekableReadBufferPtr ReadBufferS3Factory::getReader() { - const auto next_range = range_generator.nextRange(); - if (!next_range) - return nullptr; - - auto reader = std::make_shared( + return std::make_shared( client_ptr, bucket, key, version_id, request_settings, - read_settings.adjustBufferSize(object_size), - false /*use_external_buffer*/, - next_range->first, - next_range->second); - - return reader; -} - -off_t ReadBufferS3Factory::seek(off_t off, [[maybe_unused]] int whence) -{ - range_generator = RangeGenerator{object_size, range_step, static_cast(off)}; - return off; + read_settings.adjustBufferSize(object_size)); } size_t ReadBufferS3Factory::getFileSize() diff --git a/src/IO/ReadBufferFromS3.h b/src/IO/ReadBufferFromS3.h index ad0430d35b1..f23a131aefa 100644 --- a/src/IO/ReadBufferFromS3.h +++ b/src/IO/ReadBufferFromS3.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include "config.h" @@ -71,8 +70,6 @@ public: void setReadUntilPosition(size_t position) override; void setReadUntilEnd() override; - Range getRemainingReadRange() const override; - size_t getFileOffsetOfBufferEnd() const override { return offset; } bool supportsRightBoundedReads() const override { return true; } @@ -82,6 +79,9 @@ public: private: std::unique_ptr initialize(); + // If true, if we destroy impl now, no work was wasted. Just for metrics. + bool atEndOfRequestedRangeGuess(); + ReadSettings read_settings; bool use_external_buffer; @@ -100,7 +100,6 @@ public: const String & bucket_, const String & key_, const String & version_id_, - size_t range_step_, size_t object_size_, const S3Settings::RequestSettings & request_settings_, const ReadSettings & read_settings_) @@ -109,8 +108,6 @@ public: , key(key_) , version_id(version_id_) , read_settings(read_settings_) - , range_generator(object_size_, range_step_) - , range_step(range_step_) , object_size(object_size_) , request_settings(request_settings_) { @@ -120,8 +117,6 @@ public: SeekableReadBufferPtr getReader() override; - off_t seek(off_t off, [[maybe_unused]] int whence) override; - size_t getFileSize() override; String getFileName() const override { return bucket + "/" + key; } @@ -132,11 +127,7 @@ private: const String key; const String version_id; ReadSettings read_settings; - - RangeGenerator range_generator; - size_t range_step; size_t object_size; - const S3Settings::RequestSettings request_settings; }; diff --git a/src/IO/ReadWriteBufferFromHTTP.h b/src/IO/ReadWriteBufferFromHTTP.h index 28f7a7f600b..8b04e9b79dc 100644 --- a/src/IO/ReadWriteBufferFromHTTP.h +++ b/src/IO/ReadWriteBufferFromHTTP.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -91,7 +90,7 @@ namespace detail template class ReadWriteBufferFromHTTPBase : public SeekableReadBuffer, public WithFileName, public WithFileSize { - public: + protected: /// HTTP range, including right bound [begin, end]. struct Range { @@ -99,7 +98,6 @@ namespace detail std::optional end; }; - protected: Poco::URI uri; std::string method; std::string content_encoding; @@ -118,7 +116,6 @@ namespace detail bool use_external_buffer; size_t offset_from_begin_pos = 0; - const Range initial_read_range; Range read_range; std::optional file_size; @@ -167,8 +164,8 @@ namespace detail std::optional range; if constexpr (for_object_info) { - if (withPartialContent(initial_read_range)) - range = initial_read_range; + if (withPartialContent(Range{})) + range = Range{0, std::nullopt}; } else { @@ -229,9 +226,6 @@ namespace detail if (response.hasContentLength()) { - if (!read_range.end) - read_range.end = getRangeBegin() + response.getContentLength(); - file_size = response.getContentLength(); return *file_size; } @@ -300,7 +294,6 @@ namespace detail size_t buffer_size_ = DBMS_DEFAULT_BUFFER_SIZE, const ReadSettings & settings_ = {}, HTTPHeaderEntries http_header_entries_ = {}, - Range read_range_ = {}, const RemoteHostFilter * remote_host_filter_ = nullptr, bool delay_initialization = false, bool use_external_buffer_ = false, @@ -315,8 +308,6 @@ namespace detail , remote_host_filter {remote_host_filter_} , buffer_size {buffer_size_} , use_external_buffer {use_external_buffer_} - , initial_read_range(read_range_) - , read_range(read_range_) , http_skip_not_found_url(http_skip_not_found_url_) , settings {settings_} , log(&Poco::Logger::get("ReadWriteBufferFromHTTP")) @@ -486,7 +477,7 @@ namespace detail if (withPartialContent(read_range) && response.getStatus() != Poco::Net::HTTPResponse::HTTPStatus::HTTP_PARTIAL_CONTENT) { /// Having `200 OK` instead of `206 Partial Content` is acceptable in case we retried with range.begin == 0. - if (read_range.begin && *read_range.begin != 0) + if (getOffset() != 0) { if (!exception) { @@ -506,7 +497,7 @@ namespace detail return; } - else if (read_range.end) + else if (read_range.end && file_size && *read_range.end + 1 < *file_size) { /// We could have range.begin == 0 and range.end != 0 in case of DiskWeb and failing to read with partial content /// will affect only performance, so a warning is enough. @@ -514,9 +505,6 @@ namespace detail } } - if (!offset_from_begin_pos && !read_range.end && response.hasContentLength()) - read_range.end = getRangeBegin() + response.getContentLength(); - try { impl = std::make_unique(*istr, buffer_size); @@ -547,7 +535,6 @@ namespace detail if (read_range.end && getOffset() > read_range.end.value()) { - assert(getOffset() == read_range.end.value() + 1); return false; } @@ -570,6 +557,7 @@ namespace detail bool result = false; size_t milliseconds_to_wait = settings.http_retry_initial_backoff_ms; + bool last_attempt = false; auto on_retriable_error = [&]() { @@ -577,11 +565,19 @@ namespace detail impl.reset(); auto http_session = session->getSession(); http_session->reset(); - sleepForMilliseconds(milliseconds_to_wait); + if (!last_attempt) + { + sleepForMilliseconds(milliseconds_to_wait); + milliseconds_to_wait = std::min(milliseconds_to_wait * 2, settings.http_retry_max_backoff_ms); + } }; - for (size_t i = 0; i < settings.http_max_tries; ++i) + for (size_t i = 0;; ++i) { + if (last_attempt) + break; + last_attempt = i + 1 >= settings.http_max_tries; + exception = nullptr; initialization_error = InitializeError::NONE; @@ -656,8 +652,6 @@ namespace detail on_retriable_error(); exception = std::current_exception(); } - - milliseconds_to_wait = std::min(milliseconds_to_wait * 2, settings.http_retry_max_backoff_ms); } if (exception) @@ -693,32 +687,57 @@ namespace detail return getPosition(); } - auto position = getPosition(); - if (offset_ > position) - { - size_t diff = offset_ - position; - if (diff < settings.remote_read_min_bytes_for_seek) + if (impl) { + auto position = getPosition(); + if (offset_ > position) { - ignore(diff); - return offset_; + size_t diff = offset_ - position; + if (diff < settings.remote_read_min_bytes_for_seek) + { + ignore(diff); + return offset_; + } } - } - if (impl) - { ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } resetWorkingBuffer(); read_range.begin = offset_; - read_range.end = std::nullopt; offset_from_begin_pos = 0; return offset_; } - SeekableReadBuffer::Range getRemainingReadRange() const override { return {getOffset(), read_range.end}; } + void setReadUntilPosition(size_t until) override + { + until = std::max(until, 1ul); + if (read_range.end && *read_range.end + 1 == until) + return; + read_range.end = until - 1; + read_range.begin = getPosition(); + resetWorkingBuffer(); + if (impl) { + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } + } + + void setReadUntilEnd() override + { + if (!read_range.end) + return; + read_range.end.reset(); + read_range.begin = getPosition(); + resetWorkingBuffer(); + if (impl) { + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } + } + + bool supportsRightBoundedReads() const override { return true; } std::string getResponseCookie(const std::string & name, const std::string & def) const { @@ -789,7 +808,6 @@ public: size_t buffer_size_ = DBMS_DEFAULT_BUFFER_SIZE, const ReadSettings & settings_ = {}, const HTTPHeaderEntries & http_header_entries_ = {}, - Range read_range_ = {}, const RemoteHostFilter * remote_host_filter_ = nullptr, bool delay_initialization_ = true, bool use_external_buffer_ = false, @@ -803,7 +821,6 @@ public: buffer_size_, settings_, http_header_entries_, - read_range_, remote_host_filter_, delay_initialization_, use_external_buffer_, @@ -819,7 +836,6 @@ class RangedReadWriteBufferFromHTTPFactory : public ParallelReadBuffer::ReadBuff public: RangedReadWriteBufferFromHTTPFactory( size_t total_object_size_, - size_t range_step_, Poco::URI uri_, std::string method_, OutStreamCallback out_stream_callback_, @@ -833,9 +849,7 @@ public: bool delay_initialization_ = true, bool use_external_buffer_ = false, bool skip_not_found_url_ = false) - : range_generator(total_object_size_, range_step_) - , total_object_size(total_object_size_) - , range_step(range_step_) + : total_object_size(total_object_size_) , uri(uri_) , method(std::move(method_)) , out_stream_callback(out_stream_callback_) @@ -854,12 +868,6 @@ public: SeekableReadBufferPtr getReader() override { - const auto next_range = range_generator.nextRange(); - if (!next_range) - { - return nullptr; - } - return std::make_shared( uri, method, @@ -870,28 +878,18 @@ public: buffer_size, settings, http_header_entries, - // HTTP Range has inclusive bounds, i.e. [from, to] - ReadWriteBufferFromHTTP::Range{next_range->first, next_range->second - 1}, remote_host_filter, delay_initialization, use_external_buffer, skip_not_found_url); } - off_t seek(off_t off, [[maybe_unused]] int whence) override - { - range_generator = RangeGenerator{total_object_size, range_step, static_cast(off)}; - return off; - } - size_t getFileSize() override { return total_object_size; } String getFileName() const override { return uri.toString(); } private: - RangeGenerator range_generator; size_t total_object_size; - size_t range_step; Poco::URI uri; std::string method; OutStreamCallback out_stream_callback; diff --git a/src/IO/SeekableReadBuffer.h b/src/IO/SeekableReadBuffer.h index 02142673b2b..9882ffbeca4 100644 --- a/src/IO/SeekableReadBuffer.h +++ b/src/IO/SeekableReadBuffer.h @@ -26,6 +26,8 @@ public: * @param off Offset. * @param whence Seek mode (@see SEEK_SET, @see SEEK_CUR). * @return New position from the beginning of underlying buffer / file. + * + * What happens if you seek above the end of the file? Implementation-defined. */ virtual off_t seek(off_t off, int whence) = 0; @@ -40,28 +42,11 @@ public: */ virtual off_t getPosition() = 0; - struct Range - { - size_t left; - std::optional right; - - String toString() const { return fmt::format("[{}:{}]", left, right ? std::to_string(*right) : "None"); } - }; - - /** - * Returns a struct, where `left` is current read position in file and `right` is the - * last included offset for reading according to setReadUntilPosition() or setReadUntilEnd(). - * E.g. next nextImpl() call will read within range [left, right]. - */ - virtual Range getRemainingReadRange() const - { - throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getRemainingReadRange() not implemented"); - } - virtual String getInfoForLog() { return ""; } virtual size_t getFileOffsetOfBufferEnd() const { throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getFileOffsetOfBufferEnd() not implemented"); } + // If true, setReadUntilPosition() guarantees that eof will be reported at the given position. virtual bool supportsRightBoundedReads() const { return false; } virtual bool isIntegratedWithFilesystemCache() const { return false; } diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp index 27fd7ac1575..44b532f8584 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -47,14 +48,10 @@ arrow::Status ArrowBufferedOutputStream::Write(const void * data, int64_t length return arrow::Status::OK(); } -RandomAccessFileFromSeekableReadBuffer::RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_, off_t file_size_) - : in{in_}, seekable_in{dynamic_cast(in_)}, file_size{file_size_}, is_open{true} -{ -} - -RandomAccessFileFromSeekableReadBuffer::RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_) - : in{in_}, seekable_in{dynamic_cast(in_)}, is_open{true} +RandomAccessFileFromSeekableReadBuffer::RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_, std::optional file_size_, bool avoid_buffering_) + : in{in_}, seekable_in{dynamic_cast(in_)}, file_size{file_size_}, is_open{true}, avoid_buffering(avoid_buffering_) { + LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe creating with size {}", file_size.value_or(0)); } arrow::Result RandomAccessFileFromSeekableReadBuffer::GetSize() @@ -69,6 +66,7 @@ arrow::Result RandomAccessFileFromSeekableReadBuffer::GetSize() arrow::Status RandomAccessFileFromSeekableReadBuffer::Close() { + LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe closing"); is_open = false; return arrow::Status::OK(); } @@ -80,6 +78,9 @@ arrow::Result RandomAccessFileFromSeekableReadBuffer::Tell() const arrow::Result RandomAccessFileFromSeekableReadBuffer::Read(int64_t nbytes, void * out) { + LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe read {}", nbytes); + if (avoid_buffering) + in.setReadUntilPosition(seekable_in.getPosition() + nbytes); return in.readBig(reinterpret_cast(out), nbytes); } @@ -102,6 +103,12 @@ arrow::Future> RandomAccessFileFromSeekableReadBu arrow::Status RandomAccessFileFromSeekableReadBuffer::Seek(int64_t position) { + LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe seek {}", position); + if (avoid_buffering) { + // Seeking to a position above a previous setReadUntilPosition() confuses some of the + // ReadBuffer implementations. + in.setReadUntilEnd(); + } seekable_in.seek(position, SEEK_SET); return arrow::Status::OK(); } @@ -148,7 +155,8 @@ std::shared_ptr asArrowFile( const FormatSettings & settings, std::atomic & is_cancelled, const std::string & format_name, - const std::string & magic_bytes) + const std::string & magic_bytes, + bool avoid_buffering) { if (auto * fd_in = dynamic_cast(&in)) { @@ -156,12 +164,12 @@ std::shared_ptr asArrowFile( auto res = ::fstat(fd_in->getFD(), &stat); // if fd is a regular file i.e. not stdin if (res == 0 && S_ISREG(stat.st_mode)) - return std::make_shared(*fd_in, stat.st_size); + return std::make_shared(*fd_in, stat.st_size, avoid_buffering); } else if (dynamic_cast(&in) && isBufferWithFileSize(in)) { if (settings.seekable_read) - return std::make_shared(in); + return std::make_shared(in, std::nullopt, avoid_buffering); } // fallback to loading the entire file in memory diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.h b/src/Processors/Formats/Impl/ArrowBufferedStreams.h index 325975a7cfe..f4e78d7b2cd 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.h +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.h @@ -46,9 +46,7 @@ private: class RandomAccessFileFromSeekableReadBuffer : public arrow::io::RandomAccessFile { public: - RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_, off_t file_size_); - - explicit RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_); + RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_, std::optional file_size_, bool avoid_buffering_); arrow::Result GetSize() override; @@ -74,6 +72,7 @@ private: SeekableReadBuffer & seekable_in; std::optional file_size; bool is_open = false; + bool avoid_buffering = false; ARROW_DISALLOW_COPY_AND_ASSIGN(RandomAccessFileFromSeekableReadBuffer); }; @@ -101,7 +100,13 @@ std::shared_ptr asArrowFile( const FormatSettings & settings, std::atomic & is_cancelled, const std::string & format_name, - const std::string & magic_bytes); + const std::string & magic_bytes, + // If true, we'll use ReadBuffer::setReadUntilPosition() to avoid buffering and readahead as + // much buffering as possible. For HTTP or S3 ReadBuffer, this means that each RandomAccessFile + // read call will do a new HTTP request. Used in parquet pre-buffered reading mode, which makes + // arrow do its own buffering and coalescing of reads. + // (ReadBuffer is not a good abstraction in this case, but it works.) + bool avoid_buffering = false); } diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp index d47e2c2953e..35f017ccf58 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp @@ -45,43 +45,33 @@ Chunk ParquetBlockInputFormat::generate() block_missing_values.clear(); if (!file_reader) + prepareFileReader(); + + while (true) { - prepareReader(); - file_reader->set_batch_size(format_settings.parquet.max_block_size); - std::vector row_group_indices; - for (int i = 0; i < row_group_total; ++i) + if (!current_record_batch_reader && !prepareRowGroupReader()) + return {}; + if (is_stopped) + return {}; + + auto batch = current_record_batch_reader->Next(); + if (!batch.ok()) + throw ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", batch.status().ToString()); + if (!*batch) { - if (!skip_row_groups.contains(i)) - row_group_indices.emplace_back(i); + ++row_group_current; + current_record_batch_reader.reset(); + continue; } - auto read_status = file_reader->GetRecordBatchReader(row_group_indices, column_indices, ¤t_record_batch_reader); - if (!read_status.ok()) - throw DB::ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", read_status.ToString()); - } - if (is_stopped) - return {}; - - auto batch = current_record_batch_reader->Next(); - if (!batch.ok()) - { - throw ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", - batch.status().ToString()); - } - if (*batch) - { auto tmp_table = arrow::Table::FromRecordBatches({*batch}); /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. /// Otherwise fill the missing columns with zero values of its type. BlockMissingValues * block_missing_values_ptr = format_settings.defaults_for_omitted_fields ? &block_missing_values : nullptr; arrow_column_to_ch_column->arrowTableToCHChunk(res, *tmp_table, (*tmp_table)->num_rows(), block_missing_values_ptr); - } - else - { - return {}; - } - return res; + return res; + } } void ParquetBlockInputFormat::resetParser() @@ -107,14 +97,42 @@ static void getFileReaderAndSchema( const FormatSettings & format_settings, std::atomic & is_stopped) { - auto arrow_file = asArrowFile(in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES); + auto arrow_file = asArrowFile(in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES, /* avoid_buffering */ true); if (is_stopped) return; - THROW_ARROW_NOT_OK(parquet::arrow::OpenFile(std::move(arrow_file), arrow::default_memory_pool(), &file_reader)); + + parquet::ArrowReaderProperties properties; + properties.set_use_threads(false); + + // When reading a row group, arrow will: + // 1. Before reading anything, look at all the byte ranges it'll need to read from the file + // (typically one per requested column in the row group). This information is in file + // metadata. + // 2. Coalesce ranges that are close together, trading off seeks vs read amplification. + // This is controlled by CacheOptions. + // 3. Process the columns one by one, issuing the corresponding (coalesced) range reads as + // needed. Each range gets its own memory buffer allocated. These buffers stay in memory + // (in arrow::io::internal::ReadRangeCache) until the whole row group reading is done. + // So the memory usage of a "SELECT *" will be at least the compressed size of a row group + // (typically hundreds of MB). + // + // With this coalescing, we don't need any readahead on our side, hence avoid_buffering above. + properties.set_pre_buffer(true); + auto cache_options = arrow::io::CacheOptions::LazyDefaults(); + cache_options.hole_size_limit = format_settings.parquet.min_bytes_for_seek; + cache_options.range_size_limit = format_settings.parquet.max_bytes_to_read_at_once; + properties.set_cache_options(cache_options); + + parquet::arrow::FileReaderBuilder builder; + THROW_ARROW_NOT_OK(builder.Open(std::move(arrow_file))); + builder.properties(properties); + // TODO: Pass custom memory_pool() to enable memory accounting with non-jemalloc allocators. + THROW_ARROW_NOT_OK(builder.Build(&file_reader)); + THROW_ARROW_NOT_OK(file_reader->GetSchema(&schema)); } -void ParquetBlockInputFormat::prepareReader() +void ParquetBlockInputFormat::prepareFileReader() { std::shared_ptr schema; getFileReaderAndSchema(*in, file_reader, schema, format_settings, is_stopped); @@ -138,6 +156,26 @@ void ParquetBlockInputFormat::prepareReader() column_indices = field_util.findRequiredIndices(getPort().getHeader(), *schema); } +bool ParquetBlockInputFormat::prepareRowGroupReader() +{ + file_reader->set_batch_size(format_settings.parquet.max_block_size); + + while (row_group_current < row_group_total && skip_row_groups.contains(row_group_current)) + ++row_group_current; + if (row_group_current >= row_group_total) + return false; + + // Read row groups one at a time. They're normally hundreds of MB each. + // If we ever encounter parquet files with lots of tiny row groups, we could detect this here + // and group them together to reduce number of seeks. + + auto read_status = file_reader->GetRecordBatchReader({row_group_current}, column_indices, ¤t_record_batch_reader); + if (!read_status.ok()) + throw DB::ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", read_status.ToString()); + + return true; +} + ParquetSchemaReader::ParquetSchemaReader(ReadBuffer & in_, const FormatSettings & format_settings_) : ISchemaReader(in_), format_settings(format_settings_) { diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h index afc46939c79..7fe295dd47c 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h @@ -15,6 +15,31 @@ namespace DB class ArrowColumnToCHColumn; +// Parquet files contain a metadata block with the following information: +// * list of columns, +// * list of "row groups", +// * for each column in each row group: +// - byte range for the data, +// - min, max, count. +// +// This information could be used for: +// (1) Precise reads - only reading the byte ranges we need, instead of filling the whole +// arbitrarily-sized buffer inside ReadBuffer. We know in advance exactly what ranges we'll +// need to read. +// (2) Skipping row groups based on WHERE conditions. +// (3) Skipping parsing of individual rows based on PREWHERE. +// (4) Projections. I.e. for queries that only request min/max/count, we can report the +// min/max/count from metadata. This can be done per row group. I.e. for row groups that +// fully pass the WHERE conditions we'll use min/max/count from metadata, for row groups that +// only partially overlap with the WHERE conditions we'll read data. +// (4a) Before projections are implemented, we should at least be able to do `SELECT count(*)` +// without reading data. +// +// For (1), we need the IInputFormat to be in control of reading, with its own implementation of +// parallel reading+parsing, instead of using ParallelParsingInputFormat, ParallelReadBuffer, +// AsynchronousReadIndirectBufferFromRemoteFS, ReadBufferFromRemoteFSGather. +// That's what MultistreamInputCreator in FormatFactory is about. + class ParquetBlockInputFormat : public IInputFormat { public: @@ -29,7 +54,8 @@ public: private: Chunk generate() override; - void prepareReader(); + void prepareFileReader(); + bool prepareRowGroupReader(); // false if at end void onCancel() override { @@ -45,6 +71,7 @@ private: BlockMissingValues block_missing_values; const FormatSettings format_settings; const std::unordered_set & skip_row_groups; + // Reads a single row group. std::shared_ptr current_record_batch_reader; std::atomic is_stopped{0}; diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index 4d71ad6471f..fa4b18f734f 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -629,13 +629,13 @@ std::unique_ptr StorageS3Source::createS3ReadBuffer(const String & k } auto factory = std::make_unique( - client, bucket, key, version_id, download_buffer_size, object_size, request_settings, read_settings); + client, bucket, key, version_id, object_size, request_settings, read_settings); LOG_TRACE(log, "Downloading from S3 in {} threads. Object size: {}, Range size: {}.", download_thread_num, object_size, download_buffer_size); - return std::make_unique(std::move(factory), threadPoolCallbackRunner(IOThreadPool::get(), "S3ParallelRead"), download_thread_num); + return std::make_unique(std::move(factory), threadPoolCallbackRunner(IOThreadPool::get(), "S3ParallelRead"), download_thread_num, download_buffer_size); } std::unique_ptr StorageS3Source::createAsyncS3ReadBuffer( diff --git a/src/Storages/StorageURL.cpp b/src/Storages/StorageURL.cpp index 982e7fb5f9b..2232b56951b 100644 --- a/src/Storages/StorageURL.cpp +++ b/src/Storages/StorageURL.cpp @@ -331,7 +331,6 @@ namespace settings.max_read_buffer_size, read_settings, headers, - ReadWriteBufferFromHTTP::Range{0, std::nullopt}, &context->getRemoteHostFilter(), true, /* use_external_buffer */ false, @@ -384,7 +383,6 @@ namespace auto read_buffer_factory = std::make_unique( res.getContentLength(), - settings.max_download_buffer_size, request_uri, http_method, callback, @@ -403,7 +401,8 @@ namespace std::make_unique( std::move(read_buffer_factory), threadPoolCallbackRunner(IOThreadPool::get(), "URLParallelRead"), - download_threads), + download_threads, + settings.max_download_buffer_size), compression_method, zstd_window_log_max); } @@ -431,7 +430,6 @@ namespace settings.max_read_buffer_size, read_settings, headers, - ReadWriteBufferFromHTTP::Range{}, &context->getRemoteHostFilter(), delay_initialization, /* use_external_buffer */ false, @@ -936,7 +934,6 @@ std::optional IStorageURLBase::getLastModificationTime( settings.max_read_buffer_size, context->getReadSettings(), headers, - ReadWriteBufferFromHTTP::Range{}, &context->getRemoteHostFilter(), true, false, diff --git a/src/Storages/System/StorageSystemFormats.cpp b/src/Storages/System/StorageSystemFormats.cpp index d8a49880257..464af029187 100644 --- a/src/Storages/System/StorageSystemFormats.cpp +++ b/src/Storages/System/StorageSystemFormats.cpp @@ -25,7 +25,7 @@ void StorageSystemFormats::fillData(MutableColumns & res_columns, ContextPtr, co const auto & [format_name, creators] = pair; UInt64 has_input_format(creators.input_creator != nullptr); UInt64 has_output_format(creators.output_creator != nullptr); - UInt64 supports_parallel_parsing(creators.file_segmentation_engine != nullptr); + UInt64 supports_parallel_parsing(creators.file_segmentation_engine != nullptr || creators.multistream_input_creator != nullptr); UInt64 supports_parallel_formatting(creators.supports_parallel_formatting); res_columns[0]->insert(format_name); From 683077890f30390edc1487c5748dfb615a0420e3 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Mon, 20 Mar 2023 07:55:44 +0000 Subject: [PATCH 244/535] Highly questionable refactoring (getInputMultistream() nonsense) --- src/Formats/FormatFactory.cpp | 186 +++++++++++++++++------ src/Formats/FormatFactory.h | 44 +++++- src/IO/ParallelReadBuffer.cpp | 4 +- src/IO/ParallelReadBuffer.h | 2 +- src/IO/ReadBufferFromS3.cpp | 4 +- src/IO/ReadBufferFromS3.h | 2 +- src/IO/ReadWriteBufferFromHTTP.h | 4 +- src/Storages/FileLog/FileLogSource.cpp | 4 +- src/Storages/Hive/StorageHive.cpp | 14 +- src/Storages/Kafka/KafkaSource.cpp | 4 +- src/Storages/NATS/NATSSource.cpp | 4 +- src/Storages/RabbitMQ/RabbitMQSource.cpp | 4 +- src/Storages/StorageURL.cpp | 96 ++++++++---- 13 files changed, 268 insertions(+), 104 deletions(-) diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index 7a7522722bc..1cc8dc7f9a2 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -221,45 +221,131 @@ InputFormatPtr FormatFactory::getInput( const Block & sample, ContextPtr context, UInt64 max_block_size, - const std::optional & _format_settings) const + const std::optional & format_settings, + std::optional max_parsing_threads) const { - auto format_settings = _format_settings - ? *_format_settings : getFormatSettings(context); + return getInputImpl( + name, + nullptr, + &buf, + sample, + context, + max_block_size, + /* is_remote_fs */ false, + CompressionMethod::None, + /* io_schedule */ nullptr, + format_settings, + /* max_download_threads */ 1, + max_parsing_threads); +} - if (!getCreators(name).input_creator) +InputFormatPtr FormatFactory::getInputMultistream( + const String & name, + ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, + const Block & sample, + ContextPtr context, + UInt64 max_block_size, + bool is_remote_fs, + CompressionMethod compression, + ThreadPoolCallbackRunner io_schedule, + const std::optional & format_settings, + std::optional max_download_threads, + std::optional max_parsing_threads) const +{ + return getInputImpl( + name, + std::move(buf_factory), + nullptr, + sample, + context, + max_block_size, + is_remote_fs, + compression, + io_schedule, + format_settings, + max_download_threads, + max_parsing_threads); +} + +InputFormatPtr FormatFactory::getInputImpl( + const String & name, + // exactly one of the following two is nullptr + ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, + ReadBuffer * _buf, + const Block & sample, + ContextPtr context, + UInt64 max_block_size, + bool is_remote_fs, + CompressionMethod compression, + ThreadPoolCallbackRunner io_schedule, + const std::optional & _format_settings, + std::optional _max_download_threads, + std::optional _max_parsing_threads) const +{ + chassert((!_buf) != (!buf_factory)); + auto& creators = getCreators(name); + if (!creators.input_creator) throw Exception(ErrorCodes::FORMAT_IS_NOT_SUITABLE_FOR_INPUT, "Format {} is not suitable for input", name); + auto format_settings = _format_settings ? *_format_settings : getFormatSettings(context); const Settings & settings = context->getSettingsRef(); - const auto & file_segmentation_engine = getCreators(name).file_segmentation_engine; + const auto & file_segmentation_engine = creators.file_segmentation_engine; + size_t max_parsing_threads = _max_parsing_threads.value_or(settings.max_threads); + size_t max_download_threads = _max_download_threads.value_or(settings.max_download_threads); + std::unique_ptr owned_buf; - // Doesn't make sense to use parallel parsing with less than four threads - // (segmentator + two parsers + reader). - bool parallel_parsing = settings.input_format_parallel_parsing && file_segmentation_engine && settings.max_threads >= 4; + if (context->hasQueryContext() && settings.log_queries) + context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Format, name); - if (settings.max_memory_usage && settings.min_chunk_bytes_for_parallel_parsing * settings.max_threads * 2 > settings.max_memory_usage) + // Prepare a read buffer. + + bool parallel_read = max_download_threads > 1 && buf_factory && format_settings.seekable_read + && (!creators.multistream_input_creator || compression != CompressionMethod::None); + if (parallel_read) + owned_buf = std::make_unique( + std::move(buf_factory), + std::move(io_schedule), + max_download_threads, + settings.max_download_buffer_size); + + if (compression != CompressionMethod::None) + { + chassert(buf_factory); + if (!owned_buf) + owned_buf = buf_factory->getReader(); + owned_buf = wrapReadBufferWithCompressionMethod(std::move(owned_buf), compression, static_cast(settings.zstd_window_log_max)); + } + + if (!creators.multistream_input_creator && buf_factory && !owned_buf) + owned_buf = buf_factory->getReader(); + + auto buf = owned_buf ? owned_buf.get() : _buf; + + // Return parallel parser if needed. + + bool parallel_parsing = max_parsing_threads > 1 && settings.input_format_parallel_parsing && creators.file_segmentation_engine; + if (settings.max_memory_usage && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage) parallel_parsing = false; - - if (settings.max_memory_usage_for_user && settings.min_chunk_bytes_for_parallel_parsing * settings.max_threads * 2 > settings.max_memory_usage_for_user) + if (settings.max_memory_usage_for_user && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage_for_user) parallel_parsing = false; - if (parallel_parsing) { const auto & non_trivial_prefix_and_suffix_checker = getCreators(name).non_trivial_prefix_and_suffix_checker; /// Disable parallel parsing for input formats with non-trivial readPrefix() and readSuffix(). - if (non_trivial_prefix_and_suffix_checker && non_trivial_prefix_and_suffix_checker(buf)) + if (non_trivial_prefix_and_suffix_checker && non_trivial_prefix_and_suffix_checker(*buf)) parallel_parsing = false; } + RowInputFormatParams row_input_format_params; + row_input_format_params.max_block_size = max_block_size; + row_input_format_params.allow_errors_num = format_settings.input_allow_errors_num; + row_input_format_params.allow_errors_ratio = format_settings.input_allow_errors_ratio; + row_input_format_params.max_execution_time = settings.max_execution_time; + row_input_format_params.timeout_overflow_mode = settings.timeout_overflow_mode; + if (parallel_parsing) { - const auto & input_getter = getCreators(name).input_creator; - - RowInputFormatParams row_input_format_params; - row_input_format_params.max_block_size = max_block_size; - row_input_format_params.allow_errors_num = format_settings.input_allow_errors_num; - row_input_format_params.allow_errors_ratio = format_settings.input_allow_errors_ratio; - row_input_format_params.max_execution_time = settings.max_execution_time; - row_input_format_params.timeout_overflow_mode = settings.timeout_overflow_mode; + const auto & input_getter = creators.input_creator; /// Const reference is copied to lambda. auto parser_creator = [input_getter, sample, row_input_format_params, format_settings] @@ -267,51 +353,53 @@ InputFormatPtr FormatFactory::getInput( { return input_getter(input, sample, row_input_format_params, format_settings); }; ParallelParsingInputFormat::Params params{ - buf, sample, parser_creator, file_segmentation_engine, name, settings.max_threads, + *buf, sample, parser_creator, file_segmentation_engine, name, max_parsing_threads, settings.min_chunk_bytes_for_parallel_parsing, max_block_size, context->getApplicationType() == Context::ApplicationType::SERVER}; auto format = std::make_shared(params); + + if (owned_buf) + format->addBuffer(std::move(owned_buf)); if (!settings.input_format_record_errors_file_path.toString().empty()) format->setErrorsLogger(std::make_shared(context)); + return format; } - else + + // Return multistream parser if needed. + + if (creators.multistream_input_creator && !buf) { - auto format = getInputFormat(name, buf, sample, context, max_block_size, format_settings); + auto format = creators.multistream_input_creator( + std::move(buf_factory), + sample, + format_settings, + context->getReadSettings(), + is_remote_fs, + io_schedule, + max_download_threads, + max_parsing_threads); + if (!settings.input_format_record_errors_file_path.toString().empty()) - format->setErrorsLogger(std::make_shared(context)); + format->setErrorsLogger(std::make_shared(context)); + return format; } -} -InputFormatPtr FormatFactory::getInputFormat( - const String & name, - ReadBuffer & buf, - const Block & sample, - ContextPtr context, - UInt64 max_block_size, - const std::optional & _format_settings) const -{ - const auto & input_getter = getCreators(name).input_creator; - if (!input_getter) - throw Exception(ErrorCodes::FORMAT_IS_NOT_SUITABLE_FOR_INPUT, "Format {} is not suitable for input", name); + // TODO: What about the case `creators.multistream_input_creator && buf`? Currently it'll be parsed in one thread. Lame. Need to change the interface to allow making it parallel. + // Maybe the read parallelization should be taken out of the format and into a new interface RangeSetReader (or whatever), which would support both a single buffer and a factory. The logic from asArrowFile() would move there. Check if this works for ORC and Arrow formats. - const Settings & settings = context->getSettingsRef(); + // Basic parser from one ReadBuffer. - if (context->hasQueryContext() && settings.log_queries) - context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Format, name); + auto format = creators.input_creator(*buf, sample, row_input_format_params, format_settings); - auto format_settings = _format_settings ? *_format_settings : getFormatSettings(context); - - RowInputFormatParams params; - params.max_block_size = max_block_size; - params.allow_errors_num = format_settings.input_allow_errors_num; - params.allow_errors_ratio = format_settings.input_allow_errors_ratio; - params.max_execution_time = settings.max_execution_time; - params.timeout_overflow_mode = settings.timeout_overflow_mode; - auto format = input_getter(buf, sample, params, format_settings); + if (owned_buf) + format->addBuffer(std::move(owned_buf)); + if (!settings.input_format_record_errors_file_path.toString().empty()) + format->setErrorsLogger(std::make_shared(context)); /// It's a kludge. Because I cannot remove context from values format. + /// (This is not needed in the parallel_parsing and multistream cases above because VALUES format doesn't support them.) if (auto * values = typeid_cast(format.get())) values->setContext(context); diff --git a/src/Formats/FormatFactory.h b/src/Formats/FormatFactory.h index 9dd13b1fd72..f4b3d18f3c1 100644 --- a/src/Formats/FormatFactory.h +++ b/src/Formats/FormatFactory.h @@ -82,15 +82,19 @@ private: // control over reading. The format is responsible for parallelizing reading+parsing. // The motivating use case is ParquetBlockInputFormat, see comment there. // - // Formats implementing this must implement InputCreator too, for non-seekable read buffers like - // stdin. + // Formats implementing this must implement InputCreator too, for cases when there's only one + // read buffer available (e.g. stdin or incoming HTTP request). + // + // When created this way, the IInputFormat doesn't support resetParser() and setReadBuffer(). + // Incompatible with FileSegmentationEngine. // // In future we may also want to pass some information about WHERE conditions (SelectQueryInfo?) // and get some information about projections (min/max/count per column per row group). + // + // TODO: This doesn't seem good. Rethink. using MultistreamInputCreator = std::function & format_settings = std::nullopt) const; + const std::optional & format_settings = std::nullopt, + std::optional max_parsing_threads = std::nullopt) const; - InputFormatPtr getInputFormat( + // Format parser from a random-access source (factory of seekable read buffers). + // Parallelizes both parsing and reading when possible. + // Prefer this over getInput() when reading from random-access source like file or HTTP. + InputFormatPtr getInputMultistream( const String & name, - ReadBuffer & buf, + ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, const Block & sample, ContextPtr context, UInt64 max_block_size, - const std::optional & format_settings = std::nullopt) const; + bool is_remote_fs, + CompressionMethod compression, + ThreadPoolCallbackRunner io_schedule, + // if nullopt, getFormatSettings(context) is used + const std::optional & format_settings = std::nullopt, + std::optional max_download_threads = std::nullopt, + std::optional max_parsing_threads = std::nullopt) const; /// Checks all preconditions. Returns ordinary format if parallel formatting cannot be done. OutputFormatPtr getOutputFormatParallelIfPossible( @@ -247,6 +263,20 @@ private: const Creators & getCreators(const String & name) const; + InputFormatPtr getInputImpl( + const String & name, + // exactly one of the following two is nullptr + ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, + ReadBuffer * buf, + const Block & sample, + ContextPtr context, + UInt64 max_block_size, + bool is_remote_fs, + CompressionMethod compression, + ThreadPoolCallbackRunner io_schedule, + const std::optional & format_settings, + std::optional max_download_threads, + std::optional max_parsing_threads) const; }; } diff --git a/src/IO/ParallelReadBuffer.cpp b/src/IO/ParallelReadBuffer.cpp index 6f5dbfb7d0e..efb888768f4 100644 --- a/src/IO/ParallelReadBuffer.cpp +++ b/src/IO/ParallelReadBuffer.cpp @@ -16,7 +16,7 @@ namespace ErrorCodes // A subrange of the input, read by one SeekableReadBuffer. struct ParallelReadBuffer::ReadWorker { - ReadWorker(SeekableReadBufferPtr reader_, size_t offset_, size_t size) + ReadWorker(std::unique_ptr reader_, size_t offset_, size_t size) : reader(std::move(reader_)), offset(offset_), bytes_left(size), range_end(offset + bytes_left) { assert(bytes_left); @@ -33,7 +33,7 @@ struct ParallelReadBuffer::ReadWorker return next_segment; } - SeekableReadBufferPtr reader; + std::unique_ptr reader; // Reader thread produces segments, nextImpl() consumes them. std::vector> segments; // segments that were produced size_t current_segment_index = 0; // first segment that's not consumed diff --git a/src/IO/ParallelReadBuffer.h b/src/IO/ParallelReadBuffer.h index 96f9f29c7ba..2f13faf4816 100644 --- a/src/IO/ParallelReadBuffer.h +++ b/src/IO/ParallelReadBuffer.h @@ -37,7 +37,7 @@ public: // We usually call setReadUntilPosition() and seek() on the returned buffer before reading. // So it's recommended that the returned implementation be lazy, i.e. don't start reading // before the first call to nextImpl(). - virtual SeekableReadBufferPtr getReader() = 0; + virtual std::unique_ptr getReader() = 0; }; using ReadBufferFactoryPtr = std::unique_ptr; diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index 5389806324a..8fa4d6a3cff 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -374,9 +374,9 @@ std::unique_ptr ReadBufferFromS3::initialize() } } -SeekableReadBufferPtr ReadBufferS3Factory::getReader() +std::unique_ptr ReadBufferS3Factory::getReader() { - return std::make_shared( + return std::make_unique( client_ptr, bucket, key, diff --git a/src/IO/ReadBufferFromS3.h b/src/IO/ReadBufferFromS3.h index f23a131aefa..705ac9a8405 100644 --- a/src/IO/ReadBufferFromS3.h +++ b/src/IO/ReadBufferFromS3.h @@ -115,7 +115,7 @@ public: assert(range_step < object_size); } - SeekableReadBufferPtr getReader() override; + std::unique_ptr getReader() override; size_t getFileSize() override; diff --git a/src/IO/ReadWriteBufferFromHTTP.h b/src/IO/ReadWriteBufferFromHTTP.h index 8b04e9b79dc..1e602b70182 100644 --- a/src/IO/ReadWriteBufferFromHTTP.h +++ b/src/IO/ReadWriteBufferFromHTTP.h @@ -866,9 +866,9 @@ public: { } - SeekableReadBufferPtr getReader() override + std::unique_ptr getReader() override { - return std::make_shared( + return std::make_unique( uri, method, out_stream_callback, diff --git a/src/Storages/FileLog/FileLogSource.cpp b/src/Storages/FileLog/FileLogSource.cpp index c461f4b8160..be97cd58de9 100644 --- a/src/Storages/FileLog/FileLogSource.cpp +++ b/src/Storages/FileLog/FileLogSource.cpp @@ -77,8 +77,8 @@ Chunk FileLogSource::generate() MutableColumns virtual_columns = virtual_header.cloneEmptyColumns(); - auto input_format - = FormatFactory::instance().getInputFormat(storage.getFormatName(), *buffer, non_virtual_header, context, max_block_size); + auto input_format = FormatFactory::instance().getInput( + storage.getFormatName(), *buffer, non_virtual_header, context, max_block_size, std::nullopt, 1); StreamingFormatExecutor executor(non_virtual_header, input_format); diff --git a/src/Storages/Hive/StorageHive.cpp b/src/Storages/Hive/StorageHive.cpp index 71830e8bc86..965b27b4c05 100644 --- a/src/Storages/Hive/StorageHive.cpp +++ b/src/Storages/Hive/StorageHive.cpp @@ -275,8 +275,8 @@ public: else read_buf = std::move(remote_read_buf); - auto input_format = FormatFactory::instance().getInputFormat( - format, *read_buf, to_read_block, getContext(), max_block_size, updateFormatSettings(current_file)); + auto input_format = FormatFactory::instance().getInput( + format, *read_buf, to_read_block, getContext(), max_block_size, updateFormatSettings(current_file), /* max_parsing_threads */ 1); Pipe pipe(input_format); if (columns_description.hasDefaults()) @@ -607,8 +607,14 @@ HiveFiles StorageHive::collectHiveFilesFromPartition( writeString("\n", wb); ReadBufferFromString buffer(wb.str()); - auto format = FormatFactory::instance().getInputFormat( - "CSV", buffer, partition_key_expr->getSampleBlock(), getContext(), getContext()->getSettingsRef().max_block_size); + auto format = FormatFactory::instance().getInput( + "CSV", + buffer, + partition_key_expr->getSampleBlock(), + getContext(), + getContext()->getSettingsRef().max_block_size, + std::nullopt, + /* max_parsing_threads */ 1); auto pipeline = QueryPipeline(std::move(format)); auto reader = std::make_unique(pipeline); Block block; diff --git a/src/Storages/Kafka/KafkaSource.cpp b/src/Storages/Kafka/KafkaSource.cpp index 3c5253f7640..ba242417058 100644 --- a/src/Storages/Kafka/KafkaSource.cpp +++ b/src/Storages/Kafka/KafkaSource.cpp @@ -101,8 +101,8 @@ Chunk KafkaSource::generateImpl() auto put_error_to_stream = handle_error_mode == HandleKafkaErrorMode::STREAM; EmptyReadBuffer empty_buf; - auto input_format = FormatFactory::instance().getInputFormat( - storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size); + auto input_format = FormatFactory::instance().getInput( + storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size, std::nullopt, 1); std::optional exception_message; size_t total_rows = 0; diff --git a/src/Storages/NATS/NATSSource.cpp b/src/Storages/NATS/NATSSource.cpp index 793b69e7e46..89af173533d 100644 --- a/src/Storages/NATS/NATSSource.cpp +++ b/src/Storages/NATS/NATSSource.cpp @@ -95,8 +95,8 @@ Chunk NATSSource::generate() MutableColumns virtual_columns = virtual_header.cloneEmptyColumns(); EmptyReadBuffer empty_buf; - auto input_format - = FormatFactory::instance().getInputFormat(storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size); + auto input_format = FormatFactory::instance().getInput( + storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size, std::nullopt, 1); StreamingFormatExecutor executor(non_virtual_header, input_format); diff --git a/src/Storages/RabbitMQ/RabbitMQSource.cpp b/src/Storages/RabbitMQ/RabbitMQSource.cpp index d755dff3202..1f31d6f32b2 100644 --- a/src/Storages/RabbitMQ/RabbitMQSource.cpp +++ b/src/Storages/RabbitMQ/RabbitMQSource.cpp @@ -131,8 +131,8 @@ Chunk RabbitMQSource::generateImpl() MutableColumns virtual_columns = virtual_header.cloneEmptyColumns(); EmptyReadBuffer empty_buf; - auto input_format = FormatFactory::instance().getInputFormat( - storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size); + auto input_format = FormatFactory::instance().getInput( + storage.getFormatName(), empty_buf, non_virtual_header, context, max_block_size, std::nullopt, 1); StreamingFormatExecutor executor(non_virtual_header, input_format); size_t total_rows = 0; diff --git a/src/Storages/StorageURL.cpp b/src/Storages/StorageURL.cpp index 2232b56951b..5b82aafe755 100644 --- a/src/Storages/StorageURL.cpp +++ b/src/Storages/StorageURL.cpp @@ -205,7 +205,7 @@ namespace throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty url list"); auto first_option = uri_options.begin(); - read_buf = getFirstAvailableURLReadBuffer( + auto buf_info = getFirstAvailableURLReadBuffer( first_option, uri_options.end(), context, @@ -219,18 +219,45 @@ namespace glob_url, uri_options.size() == 1, download_threads); + InputFormatPtr input_format; - try + auto format_settings_to_use = format_settings ? *format_settings : getFormatSettings(context); + format_settings_to_use.seekable_read &= buf_info.seekable_read; + + if (buf_info.buf_factory) { - total_size += getFileSizeFromReadBuffer(*read_buf); + read_buf.reset(); + total_size += buf_info.buf_factory->getFileSize(); + // TODO: Pass max_download_threads adjusted for num_streams. + input_format = FormatFactory::instance().getInputMultistream( + format, + std::move(buf_info.buf_factory), + sample_block, + context, + max_block_size, + /* is_remote_fs */ true, + compression_method, + threadPoolCallbackRunner(IOThreadPool::get(), "URLParallelRead"), + format_settings_to_use); } - catch (...) + else { - // we simply continue without total_size + read_buf = std::move(buf_info.buf); + + try + { + total_size += getFileSizeFromReadBuffer(*read_buf); + } + catch (...) + { + // we simply continue without total_size + } + + // TODO: Pass max_download_threads adjusted for num_streams. + input_format = FormatFactory::instance().getInput( + format, *read_buf, sample_block, context, max_block_size, format_settings_to_use); } - auto input_format - = FormatFactory::instance().getInput(format, *read_buf, sample_block, context, max_block_size, format_settings); QueryPipelineBuilder builder; builder.init(Pipe(input_format)); @@ -284,7 +311,18 @@ namespace return {}; } - static std::unique_ptr getFirstAvailableURLReadBuffer( + struct ReadBufferInfo { + // Exactly one of these two is nullptr. + std::unique_ptr buf; + ParallelReadBuffer::ReadBufferFactoryPtr buf_factory; + + // TODO: This is currently not always used and not always assigned. Rethink. + // Something like this is required to make Parquet format work when the HTTP + // server doesn't support ranges; otherwise it does a seek, and the buffer throws. + bool seekable_read = true; + }; + + static ReadBufferInfo getFirstAvailableURLReadBuffer( std::vector::const_iterator & option, const std::vector::const_iterator & end, ContextPtr context, @@ -315,6 +353,7 @@ namespace const auto settings = context->getSettings(); int zstd_window_log_max = static_cast(settings.zstd_window_log_max); + ReadBufferInfo buf_info; try { if (download_threads > 1) @@ -362,17 +401,23 @@ namespace } } - // to check if Range header is supported, we need to send a request with it set - const bool supports_ranges = (res.has("Accept-Ranges") && res.get("Accept-Ranges") == "bytes") + // To check if Range header is supported, we need to send a request with it set. + // TODO: This is not quite enough. Some servers (e.g. althttpd) support ranges + // but don't send "Accept-Ranges" and don't include "Content-Range" if + // the requested range is a trivial "Range: bytes=0-". + // We should probably request "Range: bytes=1-", then add 1 to the + // returned content length (and have trouble if the file is empty). + // TODO: We only do this when download_threads <= 1, so parquet will be + // broken with non-seekable http sources and download_threads = 1. + buf_info.seekable_read = (res.has("Accept-Ranges") && res.get("Accept-Ranges") == "bytes") || (res.has("Content-Range") && res.get("Content-Range").starts_with("bytes")); - if (supports_ranges) + if (buf_info.seekable_read) LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "HTTP Range is supported"); else LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "HTTP Range is not supported"); - - if (supports_ranges && res.getStatus() == Poco::Net::HTTPResponse::HTTP_PARTIAL_CONTENT + if (buf_info.seekable_read && res.getStatus() == Poco::Net::HTTPResponse::HTTP_PARTIAL_CONTENT && res.hasContentLength()) { LOG_TRACE( @@ -381,7 +426,7 @@ namespace download_threads, settings.max_download_buffer_size); - auto read_buffer_factory = std::make_unique( + buf_info.buf_factory = std::make_unique( res.getContentLength(), request_uri, http_method, @@ -396,15 +441,7 @@ namespace delay_initialization, /* use_external_buffer */ false, /* skip_url_not_found_error */ skip_url_not_found_error); - - return wrapReadBufferWithCompressionMethod( - std::make_unique( - std::move(read_buffer_factory), - threadPoolCallbackRunner(IOThreadPool::get(), "URLParallelRead"), - download_threads, - settings.max_download_buffer_size), - compression_method, - zstd_window_log_max); + return buf_info; } } catch (const Poco::Exception & e) @@ -419,7 +456,7 @@ namespace LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "Using single-threaded read buffer"); - return wrapReadBufferWithCompressionMethod( + buf_info.buf = wrapReadBufferWithCompressionMethod( std::make_unique( request_uri, http_method, @@ -434,8 +471,9 @@ namespace delay_initialization, /* use_external_buffer */ false, /* skip_url_not_found_error */ skip_url_not_found_error), - compression_method, + compression_method, zstd_window_log_max); + return buf_info; } catch (...) { @@ -654,7 +692,7 @@ ColumnsDescription IStorageURLBase::getTableStructureFromData( if (it == urls_to_check.cend()) return nullptr; - auto buf = StorageURLSource::getFirstAvailableURLReadBuffer( + auto buf_info = StorageURLSource::getFirstAvailableURLReadBuffer( it, urls_to_check.cend(), context, @@ -667,9 +705,11 @@ ColumnsDescription IStorageURLBase::getTableStructureFromData( headers, false, false, - context->getSettingsRef().max_download_threads);\ + // this ensures buf_info.buf will be set + /* max_download_threads */ 1); + chassert(buf_info.buf); ++it; - return buf; + return std::move(buf_info.buf); }; ColumnsDescription columns; From e13363335924bc89d74f93891791049d50f7d0f7 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Fri, 24 Mar 2023 01:34:24 +0000 Subject: [PATCH 245/535] Parallel decoding with one row group per thread --- src/Common/CurrentMetrics.cpp | 2 + src/Common/ThreadPool.h | 2 +- src/Formats/FormatFactory.cpp | 4 +- src/Formats/FormatFactory.h | 19 +- src/Formats/FormatSettings.h | 6 +- src/IO/ParallelReadBuffer.cpp | 2 +- src/IO/ParallelReadBuffer.h | 23 +- src/IO/ReadBuffer.h | 4 +- src/IO/ReadBufferFromS3.cpp | 2 +- src/IO/ReadBufferFromS3.h | 2 +- src/IO/ReadWriteBufferFromHTTP.h | 36 +- src/IO/SeekableReadBuffer.h | 14 + src/Processors/Formats/IInputFormat.cpp | 6 +- src/Processors/Formats/IInputFormat.h | 7 +- src/Processors/Formats/IRowInputFormat.cpp | 2 +- .../Formats/Impl/ArrowBlockInputFormat.cpp | 2 +- .../Formats/Impl/ArrowBufferedStreams.cpp | 68 ++- .../Formats/Impl/ArrowBufferedStreams.h | 36 +- .../Impl/JSONColumnsBlockInputFormatBase.cpp | 2 +- src/Processors/Formats/Impl/NativeFormat.cpp | 2 +- .../Formats/Impl/ORCBlockInputFormat.cpp | 2 +- .../Formats/Impl/ParallelParsingInputFormat.h | 2 +- .../Formats/Impl/ParquetBlockInputFormat.cpp | 389 +++++++++++++----- .../Formats/Impl/ParquetBlockInputFormat.h | 106 ++++- .../Formats/Impl/ValuesBlockInputFormat.cpp | 2 +- src/Storages/StorageURL.cpp | 5 +- 26 files changed, 561 insertions(+), 186 deletions(-) diff --git a/src/Common/CurrentMetrics.cpp b/src/Common/CurrentMetrics.cpp index 81c1481e2de..0802941bff6 100644 --- a/src/Common/CurrentMetrics.cpp +++ b/src/Common/CurrentMetrics.cpp @@ -140,6 +140,8 @@ M(RestartReplicaThreadsActive, "Number of threads in the RESTART REPLICA thread pool running a task.") \ M(QueryPipelineExecutorThreads, "Number of threads in the PipelineExecutor thread pool.") \ M(QueryPipelineExecutorThreadsActive, "Number of threads in the PipelineExecutor thread pool running a task.") \ + M(ParquetDecoderThreads, "Number of threads in the ParquetBlockInputFormat thread pool running a task.") \ + M(ParquetDecoderThreadsActive, "Number of threads in the ParquetBlockInputFormat thread pool.") \ M(DistributedFilesToInsert, "Number of pending files to process for asynchronous insertion into Distributed tables. Number of files for every shard is summed.") \ M(BrokenDistributedFilesToInsert, "Number of files for asynchronous insertion into Distributed tables that has been marked as broken. This metric will starts from 0 on start. Number of files for every shard is summed.") \ M(TablesToDropQueueSize, "Number of dropped tables, that are waiting for background data removal.") \ diff --git a/src/Common/ThreadPool.h b/src/Common/ThreadPool.h index 68023c8a410..12bc7815784 100644 --- a/src/Common/ThreadPool.h +++ b/src/Common/ThreadPool.h @@ -323,7 +323,7 @@ using ThreadFromGlobalPool = ThreadFromGlobalPoolImpl; /// one is at GlobalThreadPool level, the other is at ThreadPool level, so tracing context will be initialized on the same thread twice. /// /// Once the worker on ThreadPool gains the control of execution, it won't return until it's shutdown, -/// which means the tracing context initialized at underlying worker level won't be delete for a very long time. +/// which means the tracing context initialized at underlying worker level won't be deleted for a very long time. /// This would cause wrong context for further jobs scheduled in ThreadPool. /// /// To make sure the tracing context is correctly propagated, we explicitly disable context propagation(including initialization and de-initialization) at underlying worker level. diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index 1cc8dc7f9a2..290124e486a 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -241,7 +241,7 @@ InputFormatPtr FormatFactory::getInput( InputFormatPtr FormatFactory::getInputMultistream( const String & name, - ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, + SeekableReadBufferFactoryPtr buf_factory, const Block & sample, ContextPtr context, UInt64 max_block_size, @@ -270,7 +270,7 @@ InputFormatPtr FormatFactory::getInputMultistream( InputFormatPtr FormatFactory::getInputImpl( const String & name, // exactly one of the following two is nullptr - ParallelReadBuffer::ReadBufferFactoryPtr buf_factory, + SeekableReadBufferFactoryPtr buf_factory, ReadBuffer * _buf, const Block & sample, ContextPtr context, diff --git a/src/Formats/FormatFactory.h b/src/Formats/FormatFactory.h index f4b3d18f3c1..24f58ea85e0 100644 --- a/src/Formats/FormatFactory.h +++ b/src/Formats/FormatFactory.h @@ -92,8 +92,21 @@ private: // and get some information about projections (min/max/count per column per row group). // // TODO: This doesn't seem good. Rethink. + // * Rename multistream to random-access. + // * Pass max_parsing_threads to InputCreator too. Or require random-access formats to be + // created with this function, not InputCreator, and add a ReadBuf* param here. + // * Pass max_download_buffer_size to both creators. Maybe it should be in ReadSettings? + // * Do something about the seekable_read situation in StorageURL. + // Probably add something like checkIfActuallySeekable() in SeekableReadBuffer or in + // SeekableReadBufferFactory. + // (There's also the problem that if the http server doesn't support ranges, we'll read + // the file twice: for schema, then for data. But I think we should ignore that, even + // if we end up solving the related problem of caching metadata.) + // * Would be good to distinguish between max_download_threads = 0 vs 1. 0 would mean + // read inline, on normal threads. 1 would mean read from one IO thread, so that IO can + // overlap with processing. using MultistreamInputCreator = std::function skip_row_groups = {}; bool output_string_as_string = false; bool output_fixed_string_as_fixed_byte_array = true; + // TODO: This should probably be shared among all formats, and interact with + // https://github.com/ClickHouse/ClickHouse/issues/38755 + bool preserve_order = false; UInt64 max_block_size = 8192; ParquetVersion output_version; ParquetCompression output_compression_method = ParquetCompression::SNAPPY; - // TODO: asdqwe use ReadSettings.remote_read_min_bytes_for_seek instead. - size_t min_bytes_for_seek = 4 * 1024 * 1024; // Limit on read size, but not on memory usage; many reads can be buffered at once. + // TODO: Remove and use max_download_buffer_size instead. size_t max_bytes_to_read_at_once = 128 * 1024 * 1024; } parquet; diff --git a/src/IO/ParallelReadBuffer.cpp b/src/IO/ParallelReadBuffer.cpp index efb888768f4..81a26b252e7 100644 --- a/src/IO/ParallelReadBuffer.cpp +++ b/src/IO/ParallelReadBuffer.cpp @@ -51,7 +51,7 @@ struct ParallelReadBuffer::ReadWorker }; ParallelReadBuffer::ParallelReadBuffer( - std::unique_ptr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers_, size_t range_step_) + std::unique_ptr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers_, size_t range_step_) : SeekableReadBuffer(nullptr, 0) , max_working_readers(max_working_readers_) , schedule(std::move(schedule_)) diff --git a/src/IO/ParallelReadBuffer.h b/src/IO/ParallelReadBuffer.h index 2f13faf4816..70f925f9735 100644 --- a/src/IO/ParallelReadBuffer.h +++ b/src/IO/ParallelReadBuffer.h @@ -11,7 +11,7 @@ namespace DB /** * Reads from multiple ReadBuffers in parallel. - * Preserves order of readers obtained from ReadBufferFactory. + * Preserves order of readers obtained from SeekableReadBufferFactory. * * It consumes multiple readers and yields data from them in order as it passed. * Each working reader save segments of data to internal queue. @@ -29,20 +29,7 @@ private: bool nextImpl() override; public: - class ReadBufferFactory : public WithFileSize - { - public: - ~ReadBufferFactory() override = default; - - // We usually call setReadUntilPosition() and seek() on the returned buffer before reading. - // So it's recommended that the returned implementation be lazy, i.e. don't start reading - // before the first call to nextImpl(). - virtual std::unique_ptr getReader() = 0; - }; - - using ReadBufferFactoryPtr = std::unique_ptr; - - ParallelReadBuffer(ReadBufferFactoryPtr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers, size_t range_step_); + ParallelReadBuffer(SeekableReadBufferFactoryPtr reader_factory_, ThreadPoolCallbackRunner schedule_, size_t max_working_readers, size_t range_step_); ~ParallelReadBuffer() override { finishAndWait(); } @@ -50,8 +37,8 @@ public: size_t getFileSize(); off_t getPosition() override; - const ReadBufferFactory & getReadBufferFactory() const { return *reader_factory; } - ReadBufferFactory & getReadBufferFactory() { return *reader_factory; } + const SeekableReadBufferFactory & getReadBufferFactory() const { return *reader_factory; } + SeekableReadBufferFactory & getReadBufferFactory() { return *reader_factory; } private: /// Reader in progress with a list of read segments @@ -81,7 +68,7 @@ private: ThreadPoolCallbackRunner schedule; - std::unique_ptr reader_factory; + std::unique_ptr reader_factory; size_t range_step; size_t next_range_start{0}; diff --git a/src/IO/ReadBuffer.h b/src/IO/ReadBuffer.h index 3d9c713c798..2950e16bfbb 100644 --- a/src/IO/ReadBuffer.h +++ b/src/IO/ReadBuffer.h @@ -218,8 +218,8 @@ public: * Behavior in weird cases is currently implementation-defined: * - setReadUntilPosition() below current position, * - setReadUntilPosition() above the end of the file, - * - seek() to a position above the until position (even if you setUntilPosition() to a higher - * value right after the seek!), + * - seek() to a position above the until position (even if you setReadUntilPosition() to a + * higher value right after the seek!), * * Typical implementations discard any current buffers and connections, even if the position is * adjusted only a little. diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index 8fa4d6a3cff..197220a94cb 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -300,7 +300,7 @@ bool ReadBufferFromS3::atEndOfRequestedRangeGuess() { if (read_until_position) return getPosition() >= read_until_position; if (file_size) - return getPosition() >= file_size; + return getPosition() >= static_cast(*file_size); return false; } diff --git a/src/IO/ReadBufferFromS3.h b/src/IO/ReadBufferFromS3.h index 705ac9a8405..106dbd72a2d 100644 --- a/src/IO/ReadBufferFromS3.h +++ b/src/IO/ReadBufferFromS3.h @@ -92,7 +92,7 @@ private: }; /// Creates separate ReadBufferFromS3 for sequence of ranges of particular object -class ReadBufferS3Factory : public ParallelReadBuffer::ReadBufferFactory, public WithFileName +class ReadBufferS3Factory : public SeekableReadBufferFactory, public WithFileName { public: explicit ReadBufferS3Factory( diff --git a/src/IO/ReadWriteBufferFromHTTP.h b/src/IO/ReadWriteBufferFromHTTP.h index 1e602b70182..2c41e3bccab 100644 --- a/src/IO/ReadWriteBufferFromHTTP.h +++ b/src/IO/ReadWriteBufferFromHTTP.h @@ -534,9 +534,7 @@ namespace detail next_callback(count()); if (read_range.end && getOffset() > read_range.end.value()) - { return false; - } if (impl) { @@ -699,7 +697,8 @@ namespace detail } } - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } @@ -715,30 +714,43 @@ namespace detail until = std::max(until, 1ul); if (read_range.end && *read_range.end + 1 == until) return; + if (impl) { + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } read_range.end = until - 1; read_range.begin = getPosition(); resetWorkingBuffer(); - if (impl) { - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); - impl.reset(); - } } void setReadUntilEnd() override { if (!read_range.end) return; + if (impl) { + if (!atEndOfRequestedRangeGuess()) + ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + impl.reset(); + } read_range.end.reset(); read_range.begin = getPosition(); resetWorkingBuffer(); - if (impl) { - ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); - impl.reset(); - } } bool supportsRightBoundedReads() const override { return true; } + // If true, if we destroy impl now, no work was wasted. Just for metrics. + bool atEndOfRequestedRangeGuess() { + if (!impl) + return true; + if (read_range.end) + return getPosition() > static_cast(*read_range.end); + if (file_size) + return getPosition() >= static_cast(*file_size); + return false; + } + std::string getResponseCookie(const std::string & name, const std::string & def) const { for (const auto & cookie : cookies) @@ -829,7 +841,7 @@ public: } }; -class RangedReadWriteBufferFromHTTPFactory : public ParallelReadBuffer::ReadBufferFactory, public WithFileName +class RangedReadWriteBufferFromHTTPFactory : public SeekableReadBufferFactory, public WithFileName { using OutStreamCallback = ReadWriteBufferFromHTTP::OutStreamCallback; diff --git a/src/IO/SeekableReadBuffer.h b/src/IO/SeekableReadBuffer.h index 9882ffbeca4..d0581f58249 100644 --- a/src/IO/SeekableReadBuffer.h +++ b/src/IO/SeekableReadBuffer.h @@ -52,8 +52,22 @@ public: virtual bool isIntegratedWithFilesystemCache() const { return false; } }; +// Useful for reading in parallel. +class SeekableReadBufferFactory : public WithFileSize +{ +public: + ~SeekableReadBufferFactory() override = default; + + // We usually call setReadUntilPosition() and seek() on the returned buffer before reading. + // So it's recommended that the returned implementation be lazy, i.e. don't start reading + // before the first call to nextImpl(). + virtual std::unique_ptr getReader() = 0; +}; + using SeekableReadBufferPtr = std::shared_ptr; +using SeekableReadBufferFactoryPtr = std::unique_ptr; + /// Wraps a reference to a SeekableReadBuffer into an unique pointer to SeekableReadBuffer. /// This function is like wrapReadBufferReference() but for SeekableReadBuffer. std::unique_ptr wrapSeekableReadBufferReference(SeekableReadBuffer & ref); diff --git a/src/Processors/Formats/IInputFormat.cpp b/src/Processors/Formats/IInputFormat.cpp index 674a4affc46..20f87d60e88 100644 --- a/src/Processors/Formats/IInputFormat.cpp +++ b/src/Processors/Formats/IInputFormat.cpp @@ -5,14 +5,15 @@ namespace DB { -IInputFormat::IInputFormat(Block header, ReadBuffer & in_) - : ISource(std::move(header)), in(&in_) +IInputFormat::IInputFormat(Block header, ReadBuffer * in_) + : ISource(std::move(header)), in(in_) { column_mapping = std::make_shared(); } void IInputFormat::resetParser() { + chassert(in); in->ignoreAll(); // those are protected attributes from ISource (I didn't want to propagate resetParser up there) finished = false; @@ -23,6 +24,7 @@ void IInputFormat::resetParser() void IInputFormat::setReadBuffer(ReadBuffer & in_) { + chassert(in); // not supported by random-access formats in = &in_; } diff --git a/src/Processors/Formats/IInputFormat.h b/src/Processors/Formats/IInputFormat.h index fd8a5fbeb94..a5a39a5f5b4 100644 --- a/src/Processors/Formats/IInputFormat.h +++ b/src/Processors/Formats/IInputFormat.h @@ -18,10 +18,11 @@ class IInputFormat : public ISource { protected: - ReadBuffer * in [[maybe_unused]]; + ReadBuffer * in [[maybe_unused]] = nullptr; public: - IInputFormat(Block header, ReadBuffer & in_); + // ReadBuffer can be nullptr for random-access formats. + IInputFormat(Block header, ReadBuffer * in_); /** In some usecase (hello Kafka) we need to read a lot of tiny streams in exactly the same format. * The recreating of parser for each small stream takes too long, so we introduce a method @@ -32,7 +33,7 @@ public: virtual void resetParser(); virtual void setReadBuffer(ReadBuffer & in_); - ReadBuffer & getReadBuffer() const { return *in; } + ReadBuffer & getReadBuffer() const { chassert(in); return *in; } virtual const BlockMissingValues & getMissingValues() const { diff --git a/src/Processors/Formats/IRowInputFormat.cpp b/src/Processors/Formats/IRowInputFormat.cpp index 948e6f4cb82..2686a44806d 100644 --- a/src/Processors/Formats/IRowInputFormat.cpp +++ b/src/Processors/Formats/IRowInputFormat.cpp @@ -54,7 +54,7 @@ bool isParseError(int code) } IRowInputFormat::IRowInputFormat(Block header, ReadBuffer & in_, Params params_) - : IInputFormat(std::move(header), in_), serializations(getPort().getHeader().getSerializations()), params(params_) + : IInputFormat(std::move(header), &in_), serializations(getPort().getHeader().getSerializations()), params(params_) { } diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index cd8facb83eb..ef1a4d9754d 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -24,7 +24,7 @@ namespace ErrorCodes } ArrowBlockInputFormat::ArrowBlockInputFormat(ReadBuffer & in_, const Block & header_, bool stream_, const FormatSettings & format_settings_) - : IInputFormat(header_, in_), stream{stream_}, format_settings(format_settings_) + : IInputFormat(header_, &in_), stream{stream_}, format_settings(format_settings_) { } diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp index 44b532f8584..0f3cc12bc12 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include @@ -51,7 +50,6 @@ arrow::Status ArrowBufferedOutputStream::Write(const void * data, int64_t length RandomAccessFileFromSeekableReadBuffer::RandomAccessFileFromSeekableReadBuffer(ReadBuffer & in_, std::optional file_size_, bool avoid_buffering_) : in{in_}, seekable_in{dynamic_cast(in_)}, file_size{file_size_}, is_open{true}, avoid_buffering(avoid_buffering_) { - LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe creating with size {}", file_size.value_or(0)); } arrow::Result RandomAccessFileFromSeekableReadBuffer::GetSize() @@ -66,7 +64,6 @@ arrow::Result RandomAccessFileFromSeekableReadBuffer::GetSize() arrow::Status RandomAccessFileFromSeekableReadBuffer::Close() { - LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe closing"); is_open = false; return arrow::Status::OK(); } @@ -78,7 +75,6 @@ arrow::Result RandomAccessFileFromSeekableReadBuffer::Tell() const arrow::Result RandomAccessFileFromSeekableReadBuffer::Read(int64_t nbytes, void * out) { - LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe read {}", nbytes); if (avoid_buffering) in.setReadUntilPosition(seekable_in.getPosition() + nbytes); return in.readBig(reinterpret_cast(out), nbytes); @@ -103,7 +99,6 @@ arrow::Future> RandomAccessFileFromSeekableReadBu arrow::Status RandomAccessFileFromSeekableReadBuffer::Seek(int64_t position) { - LOG_INFO(&Poco::Logger::get("asdqwe"), "asdqwe seek {}", position); if (avoid_buffering) { // Seeking to a position above a previous setReadUntilPosition() confuses some of the // ReadBuffer implementations. @@ -150,6 +145,59 @@ arrow::Status ArrowInputStreamFromReadBuffer::Close() return arrow::Status(); } +RandomAccessFileFromManyReadBuffers::RandomAccessFileFromManyReadBuffers(SeekableReadBufferFactory & factory) : buf_factory(factory) {} + +arrow::Result RandomAccessFileFromManyReadBuffers::GetSize() { + return buf_factory.getFileSize(); +} + +arrow::Result RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes, void* out) { + std::unique_lock lock(mutex); + if (free_bufs.empty()) + free_bufs.push_back(buf_factory.getReader()); + auto buf = std::move(free_bufs.back()); + free_bufs.pop_back(); + lock.unlock(); + + buf->seek(position, SEEK_SET); + buf->setReadUntilPosition(position + nbytes); + size_t bytes_read = buf->readBig(reinterpret_cast(out), nbytes); + + // Seeking to a position above a previous setReadUntilPosition() confuses some of the + // ReadBuffer implementations. So we reset it before next seek. + buf->setReadUntilEnd(); + + lock.lock(); + free_bufs.push_back(std::move(buf)); + + return static_cast(bytes_read); +} + +arrow::Result> RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes) { + ARROW_ASSIGN_OR_RAISE(auto buffer, arrow::AllocateResizableBuffer(nbytes)) + ARROW_ASSIGN_OR_RAISE(int64_t bytes_read, ReadAt(position, nbytes, buffer->mutable_data())) + + if (bytes_read < nbytes) + RETURN_NOT_OK(buffer->Resize(bytes_read)); + + return buffer; +} + +arrow::Future> RandomAccessFileFromManyReadBuffers::ReadAsync(const arrow::io::IOContext&, int64_t position, int64_t nbytes) { + return arrow::Future>::MakeFinished(ReadAt(position, nbytes)); +} + +arrow::Status RandomAccessFileFromManyReadBuffers::Close() { + chassert(is_open); + is_open = false; + return arrow::Status::OK(); +} + +arrow::Status RandomAccessFileFromManyReadBuffers::Seek(int64_t) { return arrow::Status::NotImplemented(""); } +arrow::Result RandomAccessFileFromManyReadBuffers::Tell() const { return arrow::Status::NotImplemented(""); } +arrow::Result RandomAccessFileFromManyReadBuffers::Read(int64_t, void*) { return arrow::Status::NotImplemented(""); } +arrow::Result> RandomAccessFileFromManyReadBuffers::Read(int64_t) { return arrow::Status::NotImplemented(""); } + std::shared_ptr asArrowFile( ReadBuffer & in, const FormatSettings & settings, @@ -160,11 +208,11 @@ std::shared_ptr asArrowFile( { if (auto * fd_in = dynamic_cast(&in)) { - struct stat stat; - auto res = ::fstat(fd_in->getFD(), &stat); - // if fd is a regular file i.e. not stdin - if (res == 0 && S_ISREG(stat.st_mode)) - return std::make_shared(*fd_in, stat.st_size, avoid_buffering); + struct stat stat; + auto res = ::fstat(fd_in->getFD(), &stat); + // if fd is a regular file i.e. not stdin + if (res == 0 && S_ISREG(stat.st_mode)) + return std::make_shared(*fd_in, stat.st_size, avoid_buffering); } else if (dynamic_cast(&in) && isBufferWithFileSize(in)) { diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.h b/src/Processors/Formats/Impl/ArrowBufferedStreams.h index f4e78d7b2cd..dee38a7db7e 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.h +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.h @@ -18,6 +18,7 @@ class ReadBuffer; class WriteBuffer; class SeekableReadBuffer; +class SeekableReadBufferFactory; struct FormatSettings; class ArrowBufferedOutputStream : public arrow::io::OutputStream @@ -77,6 +78,39 @@ private: ARROW_DISALLOW_COPY_AND_ASSIGN(RandomAccessFileFromSeekableReadBuffer); }; +// Thread-safe. +// Maintains a pool of SeekableReadBuffer-s. For each ReadAt(), takes a buffer, seeks it, and reads. +class RandomAccessFileFromManyReadBuffers : public arrow::io::RandomAccessFile +{ +public: + explicit RandomAccessFileFromManyReadBuffers(SeekableReadBufferFactory & factory); + + // These are thread safe. + arrow::Result GetSize() override; + arrow::Result ReadAt(int64_t position, int64_t nbytes, void* out) override; + arrow::Result> ReadAt(int64_t position, int64_t nbytes) override; + arrow::Future> ReadAsync(const arrow::io::IOContext&, int64_t position, + int64_t nbytes) override; + + // These are not thread safe, and arrow shouldn't call them. Return NotImplemented error. + arrow::Status Seek(int64_t) override; + arrow::Result Tell() const override; + arrow::Result Read(int64_t, void*) override; + arrow::Result> Read(int64_t) override; + + arrow::Status Close() override; + bool closed() const override { return !is_open; } + +private: + SeekableReadBufferFactory & buf_factory; + bool is_open = true; + + std::mutex mutex; + std::vector> free_bufs; + + ARROW_DISALLOW_COPY_AND_ASSIGN(RandomAccessFileFromManyReadBuffers); +}; + class ArrowInputStreamFromReadBuffer : public arrow::io::InputStream { public: @@ -102,7 +136,7 @@ std::shared_ptr asArrowFile( const std::string & format_name, const std::string & magic_bytes, // If true, we'll use ReadBuffer::setReadUntilPosition() to avoid buffering and readahead as - // much buffering as possible. For HTTP or S3 ReadBuffer, this means that each RandomAccessFile + // much as possible. For HTTP or S3 ReadBuffer, this means that each RandomAccessFile // read call will do a new HTTP request. Used in parquet pre-buffered reading mode, which makes // arrow do its own buffering and coalescing of reads. // (ReadBuffer is not a good abstraction in this case, but it works.) diff --git a/src/Processors/Formats/Impl/JSONColumnsBlockInputFormatBase.cpp b/src/Processors/Formats/Impl/JSONColumnsBlockInputFormatBase.cpp index a39722950e4..3d052e23c21 100644 --- a/src/Processors/Formats/Impl/JSONColumnsBlockInputFormatBase.cpp +++ b/src/Processors/Formats/Impl/JSONColumnsBlockInputFormatBase.cpp @@ -72,7 +72,7 @@ void JSONColumnsReaderBase::skipColumn() JSONColumnsBlockInputFormatBase::JSONColumnsBlockInputFormatBase( ReadBuffer & in_, const Block & header_, const FormatSettings & format_settings_, std::unique_ptr reader_) - : IInputFormat(header_, in_) + : IInputFormat(header_, &in_) , format_settings(format_settings_) , fields(header_.getNamesAndTypes()) , serializations(header_.getSerializations()) diff --git a/src/Processors/Formats/Impl/NativeFormat.cpp b/src/Processors/Formats/Impl/NativeFormat.cpp index d3fd9ef73e1..cf1fecca810 100644 --- a/src/Processors/Formats/Impl/NativeFormat.cpp +++ b/src/Processors/Formats/Impl/NativeFormat.cpp @@ -16,7 +16,7 @@ class NativeInputFormat final : public IInputFormat { public: NativeInputFormat(ReadBuffer & buf, const Block & header_, const FormatSettings & settings) - : IInputFormat(header_, buf) + : IInputFormat(header_, &buf) , reader(std::make_unique( buf, header_, diff --git a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp index eae8f494c19..5cbe2e24359 100644 --- a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp @@ -22,7 +22,7 @@ namespace ErrorCodes } ORCBlockInputFormat::ORCBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) - : IInputFormat(std::move(header_), in_), format_settings(format_settings_), skip_stripes(format_settings.orc.skip_stripes) + : IInputFormat(std::move(header_), &in_), format_settings(format_settings_), skip_stripes(format_settings.orc.skip_stripes) { } diff --git a/src/Processors/Formats/Impl/ParallelParsingInputFormat.h b/src/Processors/Formats/Impl/ParallelParsingInputFormat.h index ae9f123d411..6b084962710 100644 --- a/src/Processors/Formats/Impl/ParallelParsingInputFormat.h +++ b/src/Processors/Formats/Impl/ParallelParsingInputFormat.h @@ -94,7 +94,7 @@ public: }; explicit ParallelParsingInputFormat(Params params) - : IInputFormat(std::move(params.header), params.in) + : IInputFormat(std::move(params.header), ¶ms.in) , internal_parser_creator(params.internal_parser_creator) , file_segmentation_engine(params.file_segmentation_engine) , format_name(params.format_name) diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp index 35f017ccf58..1b537219aeb 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp @@ -11,12 +11,18 @@ #include #include #include +#include #include #include "ArrowBufferedStreams.h" #include "ArrowColumnToCHColumn.h" #include "ArrowFieldIndexUtil.h" #include +namespace CurrentMetrics +{ + extern const Metric ParquetDecoderThreads; + extern const Metric ParquetDecoderThreadsActive; +} namespace DB { @@ -34,75 +40,58 @@ namespace ErrorCodes throw Exception::createDeprecated(_s.ToString(), ErrorCodes::BAD_ARGUMENTS); \ } while (false) -ParquetBlockInputFormat::ParquetBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) - : IInputFormat(std::move(header_), in_), format_settings(format_settings_), skip_row_groups(format_settings.parquet.skip_row_groups) +ParquetBlockInputFormat::ParquetBlockInputFormat( + ReadBuffer * buf, + SeekableReadBufferFactoryPtr buf_factory_, + const Block & header_, + const FormatSettings & format_settings_, + size_t max_decoding_threads_, + size_t min_bytes_for_seek_) + : IInputFormat(std::move(header_), buf) + , buf_factory(std::move(buf_factory_)) + , format_settings(format_settings_) + , skip_row_groups(format_settings.parquet.skip_row_groups) + , max_decoding_threads(max_decoding_threads_) + , min_bytes_for_seek(min_bytes_for_seek_) + , to_deliver(ChunkToDeliver::Compare { .row_group_first = format_settings_.parquet.preserve_order }) { + if (max_decoding_threads > 1) + pool.emplace(CurrentMetrics::ParquetDecoderThreads, CurrentMetrics::ParquetDecoderThreadsActive, max_decoding_threads); } -Chunk ParquetBlockInputFormat::generate() -{ - Chunk res; - block_missing_values.clear(); +ParquetBlockInputFormat::~ParquetBlockInputFormat() = default; - if (!file_reader) - prepareFileReader(); +void ParquetBlockInputFormat::initializeIfNeeded() { + if (std::exchange(is_initialized, true)) + return; - while (true) - { - if (!current_record_batch_reader && !prepareRowGroupReader()) - return {}; - if (is_stopped) - return {}; + if (buf_factory) + arrow_file = std::make_shared(*buf_factory); + else + arrow_file = asArrowFile(*in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES, /* avoid_buffering */ true); - auto batch = current_record_batch_reader->Next(); - if (!batch.ok()) - throw ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", batch.status().ToString()); - if (!*batch) - { - ++row_group_current; - current_record_batch_reader.reset(); - continue; - } - - auto tmp_table = arrow::Table::FromRecordBatches({*batch}); - /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. - /// Otherwise fill the missing columns with zero values of its type. - BlockMissingValues * block_missing_values_ptr = format_settings.defaults_for_omitted_fields ? &block_missing_values : nullptr; - arrow_column_to_ch_column->arrowTableToCHChunk(res, *tmp_table, (*tmp_table)->num_rows(), block_missing_values_ptr); - - return res; - } -} - -void ParquetBlockInputFormat::resetParser() -{ - IInputFormat::resetParser(); - - file_reader.reset(); - current_record_batch_reader.reset(); - column_indices.clear(); - row_group_current = 0; - block_missing_values.clear(); -} - -const BlockMissingValues & ParquetBlockInputFormat::getMissingValues() const -{ - return block_missing_values; -} - -static void getFileReaderAndSchema( - ReadBuffer & in, - std::unique_ptr & file_reader, - std::shared_ptr & schema, - const FormatSettings & format_settings, - std::atomic & is_stopped) -{ - auto arrow_file = asArrowFile(in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES, /* avoid_buffering */ true); if (is_stopped) return; + metadata = parquet::ReadMetaData(arrow_file); + + std::shared_ptr schema; + THROW_ARROW_NOT_OK(parquet::arrow::FromParquetSchema(metadata->schema(), &schema)); + + row_groups.resize(metadata->num_row_groups()); + + ArrowFieldIndexUtil field_util( + format_settings.parquet.case_insensitive_column_matching, + format_settings.parquet.allow_missing_columns); + column_indices = field_util.findRequiredIndices(getPort().getHeader(), *schema); +} + +void ParquetBlockInputFormat::prepareRowGroupReader(size_t row_group_idx) { + auto & row_group = row_groups[row_group_idx]; + parquet::ArrowReaderProperties properties; properties.set_use_threads(false); + properties.set_batch_size(format_settings.parquet.max_block_size); // When reading a row group, arrow will: // 1. Before reading anything, look at all the byte ranges it'll need to read from the file @@ -116,66 +105,245 @@ static void getFileReaderAndSchema( // So the memory usage of a "SELECT *" will be at least the compressed size of a row group // (typically hundreds of MB). // - // With this coalescing, we don't need any readahead on our side, hence avoid_buffering above. + // With this coalescing, we don't need any readahead on our side, hence avoid_buffering in + // asArrowFile(). + // + // This adds one unnecessary copy. We should probably do coalescing and prefetch scheduling on + // our side instead. properties.set_pre_buffer(true); auto cache_options = arrow::io::CacheOptions::LazyDefaults(); - cache_options.hole_size_limit = format_settings.parquet.min_bytes_for_seek; + cache_options.hole_size_limit = min_bytes_for_seek; cache_options.range_size_limit = format_settings.parquet.max_bytes_to_read_at_once; properties.set_cache_options(cache_options); parquet::arrow::FileReaderBuilder builder; - THROW_ARROW_NOT_OK(builder.Open(std::move(arrow_file))); + THROW_ARROW_NOT_OK( + builder.Open(arrow_file, /* not to be confused with ArrowReaderProperties */ parquet::default_reader_properties(), metadata)); builder.properties(properties); // TODO: Pass custom memory_pool() to enable memory accounting with non-jemalloc allocators. - THROW_ARROW_NOT_OK(builder.Build(&file_reader)); + THROW_ARROW_NOT_OK(builder.Build(&row_group.file_reader)); - THROW_ARROW_NOT_OK(file_reader->GetSchema(&schema)); -} + THROW_ARROW_NOT_OK( + row_group.file_reader->GetRecordBatchReader({static_cast(row_group_idx)}, column_indices, &row_group.record_batch_reader)); -void ParquetBlockInputFormat::prepareFileReader() -{ - std::shared_ptr schema; - getFileReaderAndSchema(*in, file_reader, schema, format_settings, is_stopped); - if (is_stopped) - return; - - row_group_total = file_reader->num_row_groups(); - row_group_current = 0; - - arrow_column_to_ch_column = std::make_unique( + row_group.arrow_column_to_ch_column = std::make_unique( getPort().getHeader(), "Parquet", format_settings.parquet.import_nested, format_settings.parquet.allow_missing_columns, format_settings.null_as_default, format_settings.parquet.case_insensitive_column_matching); - - ArrowFieldIndexUtil field_util( - format_settings.parquet.case_insensitive_column_matching, - format_settings.parquet.allow_missing_columns); - column_indices = field_util.findRequiredIndices(getPort().getHeader(), *schema); } -bool ParquetBlockInputFormat::prepareRowGroupReader() +void ParquetBlockInputFormat::scheduleRowGroup(size_t row_group_idx) { - file_reader->set_batch_size(format_settings.parquet.max_block_size); + chassert(!mutex.try_lock()); + chassert(!row_groups[row_group_idx].running); - while (row_group_current < row_group_total && skip_row_groups.contains(row_group_current)) - ++row_group_current; - if (row_group_current >= row_group_total) + row_groups[row_group_idx].running = true; + + pool->scheduleOrThrowOnError( + [this, row_group_idx, thread_group = CurrentThread::getGroup()]() + { + if (thread_group) + CurrentThread::attachToGroupIfDetached(thread_group); + SCOPE_EXIT_SAFE(if (thread_group) CurrentThread::detachFromGroupIfNotDetached();); + + try + { + setThreadName("ParquetDecoder"); + + threadFunction(row_group_idx); + } + catch (...) + { + std::lock_guard lock(mutex); + background_exception = std::current_exception(); + condvar.notify_all(); + } + }); +} + +void ParquetBlockInputFormat::threadFunction(size_t row_group_idx) +{ + std::unique_lock lock(mutex); + + auto & row_group = row_groups[row_group_idx]; + chassert(!row_group.done); + + while (row_group.chunks_decoded - row_group.chunks_delivered < max_pending_chunks_per_row_group && !is_stopped) + { + if (!decodeOneChunk(row_group_idx, lock)) + break; + } + + row_group.running = false; +} + +bool ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_lock & lock) +{ + // TODO: Do most reading on IO threads. Separate max_download_threads from max_parsing_threads. + + auto & row_group = row_groups[row_group_idx]; + chassert(!row_group.done); + chassert(lock.owns_lock()); + + lock.unlock(); + + auto end_of_row_group = [&] { + lock.lock(); + row_group.done = true; + row_group.arrow_column_to_ch_column.reset(); + row_group.record_batch_reader.reset(); + row_group.file_reader.reset(); + + // We may be able to schedule more work now, but can't call scheduleMoreWorkIfNeeded() right + // here because we're running on the same thread pool, so it may deadlock if thread limit is + // reached. Wake up generate() instead. + condvar.notify_all(); + }; + + if (!row_group.record_batch_reader) + { + if (skip_row_groups.contains(static_cast(row_group_idx))) + { + // Pretend that the row group is empty. + // (This happens kind of late. We could avoid scheduling the row group on a thread in + // the first place. But the skip_row_groups feature is mostly unused, so it's better to + // be a little inefficient than to add a bunch of extra mostly-dead code for this.) + end_of_row_group(); + return false; + } + else + { + prepareRowGroupReader(row_group_idx); + } + } + + auto batch = row_group.record_batch_reader->Next(); + if (!batch.ok()) + throw ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", batch.status().ToString()); + + if (!*batch) + { + end_of_row_group(); return false; + } - // Read row groups one at a time. They're normally hundreds of MB each. - // If we ever encounter parquet files with lots of tiny row groups, we could detect this here - // and group them together to reduce number of seeks. + auto tmp_table = arrow::Table::FromRecordBatches({*batch}); - auto read_status = file_reader->GetRecordBatchReader({row_group_current}, column_indices, ¤t_record_batch_reader); - if (!read_status.ok()) - throw DB::ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", read_status.ToString()); + ChunkToDeliver res = {.chunk_idx = row_group.chunks_decoded, .row_group_idx = row_group_idx}; + + /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. + /// Otherwise fill the missing columns with zero values of its type. + BlockMissingValues * block_missing_values_ptr = format_settings.defaults_for_omitted_fields ? &res.block_missing_values : nullptr; + row_group.arrow_column_to_ch_column->arrowTableToCHChunk(res.chunk, *tmp_table, (*tmp_table)->num_rows(), block_missing_values_ptr); + + lock.lock(); + + ++row_group.chunks_decoded; + to_deliver.push(std::move(res)); + condvar.notify_all(); return true; } +void ParquetBlockInputFormat::scheduleMoreWorkIfNeeded(std::optional row_group_touched) +{ + while (row_groups_retired < row_groups.size()) + { + auto & row_group = row_groups[row_groups_retired]; + if (!row_group.done || row_group.chunks_delivered < row_group.chunks_decoded) + break; + ++row_groups_retired; + } + + if (pool) + { + while (row_groups_started - row_groups_retired < max_decoding_threads && row_groups_started < row_groups.size()) + scheduleRowGroup(row_groups_started++); + + if (row_group_touched) + { + auto & row_group = row_groups[*row_group_touched]; + if (!row_group.done && !row_group.running && row_group.chunks_decoded - row_group.chunks_delivered < max_pending_chunks_per_row_group) + scheduleRowGroup(*row_group_touched); + } + } +} + +Chunk ParquetBlockInputFormat::generate() +{ + initializeIfNeeded(); + + std::unique_lock lock(mutex); + + while (true) + { + if (background_exception) + { + is_stopped = true; + std::rethrow_exception(background_exception); + } + if (is_stopped) + return {}; + + scheduleMoreWorkIfNeeded(); + + if (!to_deliver.empty() && (!format_settings.parquet.preserve_order || to_deliver.top().row_group_idx == row_groups_retired)) + { + ChunkToDeliver chunk = std::move(const_cast(to_deliver.top())); + to_deliver.pop(); + + previous_block_missing_values = chunk.block_missing_values; + + auto & row_group = row_groups[chunk.row_group_idx]; + chassert(chunk.chunk_idx == row_group.chunks_delivered); + ++row_group.chunks_delivered; + + scheduleMoreWorkIfNeeded(chunk.row_group_idx); + + return std::move(chunk.chunk); + } + + if (row_groups_retired == row_groups.size()) + return {}; + + if (pool) + condvar.wait(lock); + else + decodeOneChunk(row_groups_retired, lock); + } +} + +void ParquetBlockInputFormat::resetParser() +{ + is_stopped = true; + if (pool) + pool->wait(); + + arrow_file.reset(); + metadata.reset(); + column_indices.clear(); + row_groups.clear(); + while (!to_deliver.empty()) + to_deliver.pop(); + row_groups_retired = 0; + previous_block_missing_values.clear(); + row_groups_started = 0; + background_exception = nullptr; + + is_stopped = false; + is_initialized = false; + + IInputFormat::resetParser(); +} + +const BlockMissingValues & ParquetBlockInputFormat::getMissingValues() const +{ + return previous_block_missing_values; +} + ParquetSchemaReader::ParquetSchemaReader(ReadBuffer & in_, const FormatSettings & format_settings_) : ISchemaReader(in_), format_settings(format_settings_) { @@ -183,10 +351,14 @@ ParquetSchemaReader::ParquetSchemaReader(ReadBuffer & in_, const FormatSettings NamesAndTypesList ParquetSchemaReader::readSchema() { - std::unique_ptr file_reader; + std::atomic is_stopped{0}; + auto file = asArrowFile(in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES); + + auto metadata = parquet::ReadMetaData(file); + std::shared_ptr schema; - std::atomic is_stopped = 0; - getFileReaderAndSchema(in, file_reader, schema, format_settings, is_stopped); + THROW_ARROW_NOT_OK(parquet::arrow::FromParquetSchema(metadata->schema(), &schema)); + auto header = ArrowColumnToCHColumn::arrowSchemaToCHHeader( *schema, "Parquet", format_settings.parquet.skip_columns_with_unsupported_types_in_schema_inference); if (format_settings.schema_inference_make_columns_nullable) @@ -198,12 +370,31 @@ void registerInputFormatParquet(FormatFactory & factory) { factory.registerInputFormat( "Parquet", - [](ReadBuffer &buf, - const Block &sample, - const RowInputFormatParams &, - const FormatSettings & settings) + [](ReadBuffer & buf, + const Block & sample, + const RowInputFormatParams &, + const FormatSettings & settings) { - return std::make_shared(buf, sample, settings); + // TODO: Propagate the last two from settings. + return std::make_shared(&buf, nullptr, sample, settings, 1, 4 * DBMS_DEFAULT_BUFFER_SIZE); + }, + [](SeekableReadBufferFactoryPtr buf_factory, + const Block & sample, + const FormatSettings & settings, + const ReadSettings& read_settings, + bool is_remote_fs, + ThreadPoolCallbackRunner /* io_schedule */, + size_t /* max_download_threads */, + size_t max_parsing_threads) + { + size_t min_bytes_for_seek = is_remote_fs ? read_settings.remote_read_min_bytes_for_seek : 8 * 1024; + return std::make_shared( + nullptr, + std::move(buf_factory), + sample, + settings, + max_parsing_threads, + min_bytes_for_seek); }); factory.markFormatSupportsSubcolumns("Parquet"); factory.markFormatSupportsSubsetOfColumns("Parquet"); diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h index 7fe295dd47c..4230ba1f953 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h @@ -6,28 +6,33 @@ #include #include +namespace parquet { class FileMetaData; } namespace parquet::arrow { class FileReader; } - namespace arrow { class Buffer; class RecordBatchReader;} +namespace arrow::io { class RandomAccessFile; } namespace DB { class ArrowColumnToCHColumn; +class SeekableReadBufferFactory; // Parquet files contain a metadata block with the following information: // * list of columns, // * list of "row groups", // * for each column in each row group: // - byte range for the data, -// - min, max, count. +// - min, max, count, +// - (note that we *don't* have a reliable estimate of the decompressed+decoded size; the +// metadata has decompressed size, but decoded size is sometimes much bigger because of +// dictionary encoding) // // This information could be used for: // (1) Precise reads - only reading the byte ranges we need, instead of filling the whole // arbitrarily-sized buffer inside ReadBuffer. We know in advance exactly what ranges we'll // need to read. // (2) Skipping row groups based on WHERE conditions. -// (3) Skipping parsing of individual rows based on PREWHERE. +// (3) Skipping decoding of individual pages based on PREWHERE. // (4) Projections. I.e. for queries that only request min/max/count, we can report the // min/max/count from metadata. This can be done per row group. I.e. for row groups that // fully pass the WHERE conditions we'll use min/max/count from metadata, for row groups that @@ -36,14 +41,21 @@ class ArrowColumnToCHColumn; // without reading data. // // For (1), we need the IInputFormat to be in control of reading, with its own implementation of -// parallel reading+parsing, instead of using ParallelParsingInputFormat, ParallelReadBuffer, -// AsynchronousReadIndirectBufferFromRemoteFS, ReadBufferFromRemoteFSGather. +// parallel reading+decoding, instead of using ParallelReadBuffer and ParallelParsingInputFormat. // That's what MultistreamInputCreator in FormatFactory is about. class ParquetBlockInputFormat : public IInputFormat { public: - ParquetBlockInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_); + ParquetBlockInputFormat( + // exactly one of these two is nullptr + ReadBuffer * buf, + std::unique_ptr buf_factory, + const Block & header, + const FormatSettings & format_settings, + size_t max_decoding_threads, + size_t min_bytes_for_seek); + ~ParquetBlockInputFormat() override; void resetParser() override; @@ -54,27 +66,85 @@ public: private: Chunk generate() override; - void prepareFileReader(); - bool prepareRowGroupReader(); // false if at end - void onCancel() override { is_stopped = 1; } - std::unique_ptr file_reader; - int row_group_total = 0; - int row_group_current = 0; - // indices of columns to read from Parquet file - std::vector column_indices; - std::unique_ptr arrow_column_to_ch_column; - BlockMissingValues block_missing_values; + void initializeIfNeeded(); + + void prepareRowGroupReader(size_t row_group_idx); + + // The lock must be locked when calling and when returning. + bool decodeOneChunk(size_t row_group_idx, std::unique_lock & lock); + + void scheduleMoreWorkIfNeeded(std::optional row_group_touched = std::nullopt); + void scheduleRowGroup(size_t row_group_idx); + + void threadFunction(size_t row_group_idx); + + struct RowGroupState { + bool running = false; + bool done = false; // all chunks were decoded + + size_t chunks_decoded = 0; // added to_deliver + size_t chunks_delivered = 0; // removed from to_deliver + + // These are only used by the decoding thread, so don't require locking the mutex. + std::unique_ptr file_reader; + std::shared_ptr record_batch_reader; + std::unique_ptr arrow_column_to_ch_column; + }; + + struct ChunkToDeliver { + Chunk chunk; + BlockMissingValues block_missing_values; + size_t chunk_idx; // within row group + size_t row_group_idx; + + // For priority_queue. + // In ordered mode we deliver strictly in order of increasing row group idx, + // in unordered mode we prefer to interleave chunks from different row groups. + struct Compare { + bool row_group_first = false; + + bool operator()(const ChunkToDeliver & a, const ChunkToDeliver & b) const { + auto tuplificate = [this](const ChunkToDeliver & c) + { return row_group_first ? std::tie(c.row_group_idx, c.chunk_idx) + : std::tie(c.chunk_idx, c.row_group_idx); }; + return tuplificate(a) > tuplificate(b); + } + }; + }; + + std::unique_ptr buf_factory; const FormatSettings format_settings; const std::unordered_set & skip_row_groups; - // Reads a single row group. - std::shared_ptr current_record_batch_reader; + size_t max_decoding_threads; + size_t min_bytes_for_seek; + const size_t max_pending_chunks_per_row_group = 2; + // RandomAccessFile is thread safe, so we share it among threads. + // FileReader is not, so each thread creates its own. + std::shared_ptr arrow_file; + std::shared_ptr metadata; + // indices of columns to read from Parquet file + std::vector column_indices; + + std::mutex mutex; + std::condition_variable condvar; // notified after adding to to_deliver + std::vector row_groups; + std::priority_queue, ChunkToDeliver::Compare> to_deliver; + size_t row_groups_retired = 0; + BlockMissingValues previous_block_missing_values; + + // These are only used when max_decoding_threads > 1. + size_t row_groups_started = 0; + std::optional pool; + + std::exception_ptr background_exception = nullptr; std::atomic is_stopped{0}; + bool is_initialized = false; }; class ParquetSchemaReader : public ISchemaReader diff --git a/src/Processors/Formats/Impl/ValuesBlockInputFormat.cpp b/src/Processors/Formats/Impl/ValuesBlockInputFormat.cpp index 3bc2284a567..ad4e259d874 100644 --- a/src/Processors/Formats/Impl/ValuesBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ValuesBlockInputFormat.cpp @@ -45,7 +45,7 @@ ValuesBlockInputFormat::ValuesBlockInputFormat( const Block & header_, const RowInputFormatParams & params_, const FormatSettings & format_settings_) - : IInputFormat(header_, *buf_), buf(std::move(buf_)), + : IInputFormat(header_, buf_.get()), buf(std::move(buf_)), params(params_), format_settings(format_settings_), num_columns(header_.columns()), parser_type_for_column(num_columns, ParserType::Streaming), attempts_to_deduce_template(num_columns), attempts_to_deduce_template_cached(num_columns), diff --git a/src/Storages/StorageURL.cpp b/src/Storages/StorageURL.cpp index 5b82aafe755..a8edb64bac8 100644 --- a/src/Storages/StorageURL.cpp +++ b/src/Storages/StorageURL.cpp @@ -314,7 +314,7 @@ namespace struct ReadBufferInfo { // Exactly one of these two is nullptr. std::unique_ptr buf; - ParallelReadBuffer::ReadBufferFactoryPtr buf_factory; + SeekableReadBufferFactoryPtr buf_factory; // TODO: This is currently not always used and not always assigned. Rethink. // Something like this is required to make Parquet format work when the HTTP @@ -417,8 +417,7 @@ namespace else LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "HTTP Range is not supported"); - if (buf_info.seekable_read && res.getStatus() == Poco::Net::HTTPResponse::HTTP_PARTIAL_CONTENT - && res.hasContentLength()) + if (buf_info.seekable_read && res.hasContentLength()) { LOG_TRACE( &Poco::Logger::get("StorageURLSource"), From 87be78e6de9a0542d70ba75beeab77e4012b6b30 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Tue, 28 Mar 2023 20:28:28 +0000 Subject: [PATCH 246/535] Better --- src/Core/BackgroundSchedulePool.cpp | 25 +- src/Core/Settings.h | 2 + ...chronousReadIndirectBufferFromRemoteFS.cpp | 7 +- .../IO/CachedOnDiskReadBufferFromFile.cpp | 11 +- src/Formats/FormatFactory.cpp | 203 ++++++++------- src/Formats/FormatFactory.h | 60 ++--- src/Formats/FormatSettings.h | 5 +- src/IO/ParallelReadBuffer.cpp | 1 - src/IO/ReadBufferFromS3.cpp | 21 +- src/IO/ReadBufferFromS3.h | 8 +- src/IO/ReadWriteBufferFromHTTP.h | 162 ++++++++---- src/IO/SeekableReadBuffer.h | 14 ++ .../Formats/Impl/ArrowBufferedStreams.cpp | 40 ++- .../Formats/Impl/ArrowBufferedStreams.h | 7 + .../Formats/Impl/ParquetBlockInputFormat.cpp | 166 +++++++------ .../Formats/Impl/ParquetBlockInputFormat.h | 168 +++++++++++-- .../MergeTree/MergeTreeBlockReadUtils.h | 2 +- .../MergeTree/MergeTreePrefetchedReadPool.cpp | 2 - src/Storages/StorageS3.cpp | 71 +++--- src/Storages/StorageS3.h | 8 +- src/Storages/StorageURL.cpp | 233 ++++-------------- src/Storages/System/StorageSystemFormats.cpp | 4 +- .../01455_opentelemetry_distributed.reference | 4 +- .../0_stateless/02205_HTTP_user_agent.python | 2 +- 24 files changed, 715 insertions(+), 511 deletions(-) diff --git a/src/Core/BackgroundSchedulePool.cpp b/src/Core/BackgroundSchedulePool.cpp index 39724ec07fa..ec1ae047d05 100644 --- a/src/Core/BackgroundSchedulePool.cpp +++ b/src/Core/BackgroundSchedulePool.cpp @@ -11,6 +11,9 @@ namespace DB { +namespace ErrorCodes { extern const int CANNOT_SCHEDULE_TASK; } + + BackgroundSchedulePoolTaskInfo::BackgroundSchedulePoolTaskInfo( BackgroundSchedulePool & pool_, const std::string & log_name_, const BackgroundSchedulePool::TaskFunc & function_) : pool(pool_), log_name(log_name_), function(function_) @@ -158,10 +161,26 @@ BackgroundSchedulePool::BackgroundSchedulePool(size_t size_, CurrentMetrics::Met LOG_INFO(&Poco::Logger::get("BackgroundSchedulePool/" + thread_name), "Create BackgroundSchedulePool with {} threads", size_); threads.resize(size_); - for (auto & thread : threads) - thread = ThreadFromGlobalPoolNoTracingContextPropagation([this] { threadFunction(); }); - delayed_thread = std::make_unique([this] { delayExecutionThreadFunction(); }); + try + { + for (auto & thread : threads) + thread = ThreadFromGlobalPoolNoTracingContextPropagation([this] { threadFunction(); }); + + delayed_thread = std::make_unique([this] { delayExecutionThreadFunction(); }); + } + catch (...) + { + LOG_FATAL( + &Poco::Logger::get("BackgroundSchedulePool/" + thread_name), + "Couldn't get {} threads from global thread pool: {}", + size_, + getCurrentExceptionCode() == DB::ErrorCodes::CANNOT_SCHEDULE_TASK + ? "Not enough threads. Please make sure max_thread_pool_size is considerably " + "bigger than background_schedule_pool_size." + : getCurrentExceptionMessage(/* with_stacktrace */ true)); + abort(); + } } diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 5e4124462a3..199b093360f 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -812,6 +812,8 @@ class IColumn; M(Bool, input_format_orc_case_insensitive_column_matching, false, "Ignore case when matching ORC columns with CH columns.", 0) \ M(Bool, input_format_parquet_import_nested, false, "Allow to insert array of structs into Nested table in Parquet input format.", 0) \ M(Bool, input_format_parquet_case_insensitive_column_matching, false, "Ignore case when matching Parquet columns with CH columns.", 0) \ + /* TODO: Consider unifying this with https://github.com/ClickHouse/ClickHouse/issues/38755 */ \ + M(Bool, input_format_parquet_preserve_order, true, "Avoid reordering rows when reading from Parquet files. Usually makes it much slower.", 0) \ M(Bool, input_format_allow_seeks, true, "Allow seeks while reading in ORC/Parquet/Arrow input formats", 0) \ M(Bool, input_format_orc_allow_missing_columns, false, "Allow missing columns while reading ORC input formats", 0) \ M(Bool, input_format_parquet_allow_missing_columns, false, "Allow missing columns while reading Parquet input formats", 0) \ diff --git a/src/Disks/IO/AsynchronousReadIndirectBufferFromRemoteFS.cpp b/src/Disks/IO/AsynchronousReadIndirectBufferFromRemoteFS.cpp index 697b1b87359..c834d271883 100644 --- a/src/Disks/IO/AsynchronousReadIndirectBufferFromRemoteFS.cpp +++ b/src/Disks/IO/AsynchronousReadIndirectBufferFromRemoteFS.cpp @@ -146,12 +146,7 @@ void AsynchronousReadIndirectBufferFromRemoteFS::prefetch(int64_t priority) void AsynchronousReadIndirectBufferFromRemoteFS::setReadUntilPosition(size_t position) { - /// Do not reinitialize internal state in case the new end of range is already included. - /// Actually it is likely that we will anyway reinitialize it as seek method is called after - /// changing end position, but seek avoiding feature might help to avoid reinitialization, - /// so this check is useful to save the prefetch for the time when we try to avoid seek by - /// reading and ignoring some data. - if (!read_until_position || position > *read_until_position) + if (!read_until_position || position != *read_until_position) { read_until_position = position; diff --git a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp index 096bf91e959..77358dc3d7e 100644 --- a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp +++ b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp @@ -1143,9 +1143,16 @@ void CachedOnDiskReadBufferFromFile::setReadUntilPosition(size_t position) if (!allow_seeks_after_first_read) throw Exception(ErrorCodes::LOGICAL_ERROR, "Method `setReadUntilPosition()` not allowed"); - read_until_position = position; - initialized = false; + if (read_until_position == position) + return; + + file_offset_of_buffer_end = getPosition(); + resetWorkingBuffer(); + file_segments_holder.reset(); implementation_buffer.reset(); + initialized = false; + + read_until_position = position; } void CachedOnDiskReadBufferFromFile::setReadUntilEnd() diff --git a/src/Formats/FormatFactory.cpp b/src/Formats/FormatFactory.cpp index 290124e486a..628b81a79f8 100644 --- a/src/Formats/FormatFactory.cpp +++ b/src/Formats/FormatFactory.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -113,6 +114,7 @@ FormatSettings getFormatSettings(ContextPtr context, const Settings & settings) format_settings.parquet.output_version = settings.output_format_parquet_version; format_settings.parquet.import_nested = settings.input_format_parquet_import_nested; format_settings.parquet.case_insensitive_column_matching = settings.input_format_parquet_case_insensitive_column_matching; + format_settings.parquet.preserve_order = settings.input_format_parquet_preserve_order; format_settings.parquet.allow_missing_columns = settings.input_format_parquet_allow_missing_columns; format_settings.parquet.skip_columns_with_unsupported_types_in_schema_inference = settings.input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference; format_settings.parquet.output_string_as_string = settings.output_format_parquet_string_as_string; @@ -233,13 +235,12 @@ InputFormatPtr FormatFactory::getInput( max_block_size, /* is_remote_fs */ false, CompressionMethod::None, - /* io_schedule */ nullptr, format_settings, /* max_download_threads */ 1, max_parsing_threads); } -InputFormatPtr FormatFactory::getInputMultistream( +InputFormatPtr FormatFactory::getInputRandomAccess( const String & name, SeekableReadBufferFactoryPtr buf_factory, const Block & sample, @@ -247,7 +248,6 @@ InputFormatPtr FormatFactory::getInputMultistream( UInt64 max_block_size, bool is_remote_fs, CompressionMethod compression, - ThreadPoolCallbackRunner io_schedule, const std::optional & format_settings, std::optional max_download_threads, std::optional max_parsing_threads) const @@ -261,7 +261,6 @@ InputFormatPtr FormatFactory::getInputMultistream( max_block_size, is_remote_fs, compression, - io_schedule, format_settings, max_download_threads, max_parsing_threads); @@ -277,64 +276,19 @@ InputFormatPtr FormatFactory::getInputImpl( UInt64 max_block_size, bool is_remote_fs, CompressionMethod compression, - ThreadPoolCallbackRunner io_schedule, const std::optional & _format_settings, std::optional _max_download_threads, std::optional _max_parsing_threads) const { chassert((!_buf) != (!buf_factory)); - auto& creators = getCreators(name); - if (!creators.input_creator) + const auto& creators = getCreators(name); + if (!creators.input_creator && !creators.random_access_input_creator) throw Exception(ErrorCodes::FORMAT_IS_NOT_SUITABLE_FOR_INPUT, "Format {} is not suitable for input", name); auto format_settings = _format_settings ? *_format_settings : getFormatSettings(context); const Settings & settings = context->getSettingsRef(); - const auto & file_segmentation_engine = creators.file_segmentation_engine; size_t max_parsing_threads = _max_parsing_threads.value_or(settings.max_threads); size_t max_download_threads = _max_download_threads.value_or(settings.max_download_threads); - std::unique_ptr owned_buf; - - if (context->hasQueryContext() && settings.log_queries) - context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Format, name); - - // Prepare a read buffer. - - bool parallel_read = max_download_threads > 1 && buf_factory && format_settings.seekable_read - && (!creators.multistream_input_creator || compression != CompressionMethod::None); - if (parallel_read) - owned_buf = std::make_unique( - std::move(buf_factory), - std::move(io_schedule), - max_download_threads, - settings.max_download_buffer_size); - - if (compression != CompressionMethod::None) - { - chassert(buf_factory); - if (!owned_buf) - owned_buf = buf_factory->getReader(); - owned_buf = wrapReadBufferWithCompressionMethod(std::move(owned_buf), compression, static_cast(settings.zstd_window_log_max)); - } - - if (!creators.multistream_input_creator && buf_factory && !owned_buf) - owned_buf = buf_factory->getReader(); - - auto buf = owned_buf ? owned_buf.get() : _buf; - - // Return parallel parser if needed. - - bool parallel_parsing = max_parsing_threads > 1 && settings.input_format_parallel_parsing && creators.file_segmentation_engine; - if (settings.max_memory_usage && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage) - parallel_parsing = false; - if (settings.max_memory_usage_for_user && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage_for_user) - parallel_parsing = false; - if (parallel_parsing) - { - const auto & non_trivial_prefix_and_suffix_checker = getCreators(name).non_trivial_prefix_and_suffix_checker; - /// Disable parallel parsing for input formats with non-trivial readPrefix() and readSuffix(). - if (non_trivial_prefix_and_suffix_checker && non_trivial_prefix_and_suffix_checker(*buf)) - parallel_parsing = false; - } RowInputFormatParams row_input_format_params; row_input_format_params.max_block_size = max_block_size; @@ -343,6 +297,37 @@ InputFormatPtr FormatFactory::getInputImpl( row_input_format_params.max_execution_time = settings.max_execution_time; row_input_format_params.timeout_overflow_mode = settings.timeout_overflow_mode; + if (context->hasQueryContext() && settings.log_queries) + context->getQueryContext()->addQueryFactoriesInfo(Context::QueryLogFactories::Format, name); + + // Prepare a read buffer. + + std::unique_ptr owned_buf; + if (buf_factory) + owned_buf = prepareReadBuffer(buf_factory, compression, creators, format_settings, settings, max_download_threads); + auto * buf = owned_buf ? owned_buf.get() : _buf; + + // Decide whether to use parallel ParallelParsingInputFormat. + + bool parallel_parsing = max_parsing_threads > 1 && settings.input_format_parallel_parsing && creators.file_segmentation_engine && !creators.random_access_input_creator; + + if (settings.max_memory_usage && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage) + parallel_parsing = false; + if (settings.max_memory_usage_for_user && settings.min_chunk_bytes_for_parallel_parsing * max_parsing_threads * 2 > settings.max_memory_usage_for_user) + parallel_parsing = false; + + if (parallel_parsing) + { + const auto & non_trivial_prefix_and_suffix_checker = creators.non_trivial_prefix_and_suffix_checker; + /// Disable parallel parsing for input formats with non-trivial readPrefix() and readSuffix(). + if (non_trivial_prefix_and_suffix_checker && non_trivial_prefix_and_suffix_checker(*buf)) + parallel_parsing = false; + } + + // Create the InputFormat in one of 3 ways. + + InputFormatPtr format; + if (parallel_parsing) { const auto & input_getter = creators.input_creator; @@ -353,45 +338,27 @@ InputFormatPtr FormatFactory::getInputImpl( { return input_getter(input, sample, row_input_format_params, format_settings); }; ParallelParsingInputFormat::Params params{ - *buf, sample, parser_creator, file_segmentation_engine, name, max_parsing_threads, + *buf, sample, parser_creator, creators.file_segmentation_engine, name, max_parsing_threads, settings.min_chunk_bytes_for_parallel_parsing, max_block_size, context->getApplicationType() == Context::ApplicationType::SERVER}; - auto format = std::make_shared(params); - - if (owned_buf) - format->addBuffer(std::move(owned_buf)); - if (!settings.input_format_record_errors_file_path.toString().empty()) - format->setErrorsLogger(std::make_shared(context)); - - return format; + format = std::make_shared(params); } - - // Return multistream parser if needed. - - if (creators.multistream_input_creator && !buf) + else if (creators.random_access_input_creator) { - auto format = creators.multistream_input_creator( + format = creators.random_access_input_creator( + buf, std::move(buf_factory), sample, format_settings, context->getReadSettings(), is_remote_fs, - io_schedule, max_download_threads, max_parsing_threads); - - if (!settings.input_format_record_errors_file_path.toString().empty()) - format->setErrorsLogger(std::make_shared(context)); - - return format; } - - // TODO: What about the case `creators.multistream_input_creator && buf`? Currently it'll be parsed in one thread. Lame. Need to change the interface to allow making it parallel. - // Maybe the read parallelization should be taken out of the format and into a new interface RangeSetReader (or whatever), which would support both a single buffer and a factory. The logic from asArrowFile() would move there. Check if this works for ORC and Arrow formats. - - // Basic parser from one ReadBuffer. - - auto format = creators.input_creator(*buf, sample, row_input_format_params, format_settings); + else + { + format = creators.input_creator(*buf, sample, row_input_format_params, format_settings); + } if (owned_buf) format->addBuffer(std::move(owned_buf)); @@ -399,13 +366,73 @@ InputFormatPtr FormatFactory::getInputImpl( format->setErrorsLogger(std::make_shared(context)); /// It's a kludge. Because I cannot remove context from values format. - /// (This is not needed in the parallel_parsing and multistream cases above because VALUES format doesn't support them.) + /// (Not needed in the parallel_parsing case above because VALUES format doesn't support it.) if (auto * values = typeid_cast(format.get())) values->setContext(context); return format; } +std::unique_ptr FormatFactory::prepareReadBuffer( + SeekableReadBufferFactoryPtr & buf_factory, + CompressionMethod compression, + const Creators & creators, + const FormatSettings & format_settings, + const Settings & settings, + size_t max_download_threads) const +{ + std::unique_ptr res; + + bool parallel_read = max_download_threads > 1 && buf_factory && format_settings.seekable_read; + if (creators.random_access_input_creator) + parallel_read &= compression != CompressionMethod::None; + + if (parallel_read) + { + try + { + parallel_read = buf_factory->checkIfActuallySeekable() + && buf_factory->getFileSize() >= 2 * settings.max_download_buffer_size; + } + catch (const Poco::Exception & e) + { + parallel_read = false; + LOG_TRACE( + &Poco::Logger::get("FormatFactory"), + "Failed to setup ParallelReadBuffer because of an exception:\n{}.\n" + "Falling back to the single-threaded buffer", + e.displayText()); + } + } + + if (parallel_read) + { + LOG_TRACE( + &Poco::Logger::get("FormatFactory"), + "Using ParallelReadBuffer with {} workers with chunks of {} bytes", + max_download_threads, + settings.max_download_buffer_size); + + res = std::make_unique( + std::move(buf_factory), + threadPoolCallbackRunner(IOThreadPool::get(), "ParallelRead"), + max_download_threads, + settings.max_download_buffer_size); + } + + if (compression != CompressionMethod::None) + { + if (!res) + res = buf_factory->getReader(); // NOLINT + res = wrapReadBufferWithCompressionMethod(std::move(res), compression, static_cast(settings.zstd_window_log_max)); + } + + if (!creators.random_access_input_creator && !res) + res = buf_factory->getReader(); + + return res; +} + static void addExistingProgressToOutputFormat(OutputFormatPtr format, ContextPtr context) { auto element_id = context->getProcessListElement(); @@ -540,14 +567,24 @@ ExternalSchemaReaderPtr FormatFactory::getExternalSchemaReader( return external_schema_reader_creator(format_settings); } -void FormatFactory::registerInputFormat(const String & name, InputCreator input_creator, MultistreamInputCreator multistream_input_creator) +void FormatFactory::registerInputFormat(const String & name, InputCreator input_creator) { chassert(input_creator); auto & creators = dict[name]; - if (creators.input_creator) + if (creators.input_creator || creators.random_access_input_creator) throw Exception(ErrorCodes::LOGICAL_ERROR, "FormatFactory: Input format {} is already registered", name); creators.input_creator = std::move(input_creator); - creators.multistream_input_creator = std::move(multistream_input_creator); + registerFileExtension(name, name); + KnownFormatNames::instance().add(name); +} + +void FormatFactory::registerRandomAccessInputFormat(const String & name, RandomAccessInputCreator input_creator) +{ + chassert(input_creator); + auto & creators = dict[name]; + if (creators.input_creator || creators.random_access_input_creator) + throw Exception(ErrorCodes::LOGICAL_ERROR, "FormatFactory: Input format {} is already registered", name); + creators.random_access_input_creator = std::move(input_creator); registerFileExtension(name, name); KnownFormatNames::instance().add(name); } @@ -731,7 +768,7 @@ String FormatFactory::getAdditionalInfoForSchemaCache(const String & name, Conte bool FormatFactory::isInputFormat(const String & name) const { auto it = dict.find(name); - return it != dict.end() && it->second.input_creator; + return it != dict.end() && (it->second.input_creator || it->second.random_access_input_creator); } bool FormatFactory::isOutputFormat(const String & name) const diff --git a/src/Formats/FormatFactory.h b/src/Formats/FormatFactory.h index 24f58ea85e0..87f48247f4b 100644 --- a/src/Formats/FormatFactory.h +++ b/src/Formats/FormatFactory.h @@ -72,46 +72,37 @@ public: size_t max_rows)>; private: + // On the input side, there are two kinds of formats: + // * InputCreator - formats parsed sequentially, e.g. CSV. Almost all formats are like this. + // FormatFactory uses ParallelReadBuffer to read in parallel, and ParallelParsingInputFormat + // to parse in parallel; the formats mostly don't need to worry about it. + // * RandomAccessInputCreator - column-oriented formats that require seeking back and forth in + // the file when reading. E.g. Parquet has metadata at the end of the file (needs to be read + // before we can parse any data), can skip columns by seeking in the file, and often reads + // many short byte ranges from the file. ParallelReadBuffer and ParallelParsingInputFormat + // are a poor fit. Instead, the format implementation is in charge of parallelizing both + // reading and parsing. + using InputCreator = std::function; - // Advanced interface for the few more structured formats, like Parquet, which want more precise - // control over reading. The format is responsible for parallelizing reading+parsing. - // The motivating use case is ParquetBlockInputFormat, see comment there. - // - // Formats implementing this must implement InputCreator too, for cases when there's only one - // read buffer available (e.g. stdin or incoming HTTP request). - // - // When created this way, the IInputFormat doesn't support resetParser() and setReadBuffer(). // Incompatible with FileSegmentationEngine. + // When created using SeekableReadBufferFactoryPtr, the IInputFormat doesn't support + // resetParser() and setReadBuffer(). // // In future we may also want to pass some information about WHERE conditions (SelectQueryInfo?) // and get some information about projections (min/max/count per column per row group). - // - // TODO: This doesn't seem good. Rethink. - // * Rename multistream to random-access. - // * Pass max_parsing_threads to InputCreator too. Or require random-access formats to be - // created with this function, not InputCreator, and add a ReadBuf* param here. - // * Pass max_download_buffer_size to both creators. Maybe it should be in ReadSettings? - // * Do something about the seekable_read situation in StorageURL. - // Probably add something like checkIfActuallySeekable() in SeekableReadBuffer or in - // SeekableReadBufferFactory. - // (There's also the problem that if the http server doesn't support ranges, we'll read - // the file twice: for schema, then for data. But I think we should ignore that, even - // if we end up solving the related problem of caching metadata.) - // * Would be good to distinguish between max_download_threads = 0 vs 1. 0 would mean - // read inline, on normal threads. 1 would mean read from one IO thread, so that IO can - // overlap with processing. - using MultistreamInputCreator = std::function io_schedule, size_t max_download_threads, size_t max_parsing_threads)>; @@ -142,7 +133,7 @@ private: struct Creators { InputCreator input_creator; - MultistreamInputCreator multistream_input_creator; + RandomAccessInputCreator random_access_input_creator; OutputCreator output_creator; FileSegmentationEngine file_segmentation_engine; SchemaReaderCreator schema_reader_creator; @@ -175,7 +166,7 @@ public: // Format parser from a random-access source (factory of seekable read buffers). // Parallelizes both parsing and reading when possible. // Prefer this over getInput() when reading from random-access source like file or HTTP. - InputFormatPtr getInputMultistream( + InputFormatPtr getInputRandomAccess( const String & name, SeekableReadBufferFactoryPtr buf_factory, const Block & sample, @@ -183,7 +174,6 @@ public: UInt64 max_block_size, bool is_remote_fs, CompressionMethod compression, - ThreadPoolCallbackRunner io_schedule, // if nullopt, getFormatSettings(context) is used const std::optional & format_settings = std::nullopt, std::optional max_download_threads = std::nullopt, @@ -233,7 +223,8 @@ public: bool checkIfFormatSupportAppend(const String & name, ContextPtr context, const std::optional & format_settings_ = std::nullopt); /// Register format by its name. - void registerInputFormat(const String & name, InputCreator input_creator, MultistreamInputCreator multistream_input_creator = nullptr); + void registerInputFormat(const String & name, InputCreator input_creator); + void registerRandomAccessInputFormat(const String & name, RandomAccessInputCreator input_creator); void registerOutputFormat(const String & name, OutputCreator output_creator); /// Register file extension for format @@ -286,10 +277,19 @@ private: UInt64 max_block_size, bool is_remote_fs, CompressionMethod compression, - ThreadPoolCallbackRunner io_schedule, const std::optional & format_settings, std::optional max_download_threads, std::optional max_parsing_threads) const; + + // Creates a ReadBuffer to give to an input format. + // Returns nullptr if we should give it the whole factory. + std::unique_ptr prepareReadBuffer( + SeekableReadBufferFactoryPtr & buf_factory, + CompressionMethod compression, + const Creators & creators, + const FormatSettings & format_settings, + const Settings & settings, + size_t max_download_threads) const; }; } diff --git a/src/Formats/FormatSettings.h b/src/Formats/FormatSettings.h index ac56faf422d..19ce795b971 100644 --- a/src/Formats/FormatSettings.h +++ b/src/Formats/FormatSettings.h @@ -213,15 +213,12 @@ struct FormatSettings std::unordered_set skip_row_groups = {}; bool output_string_as_string = false; bool output_fixed_string_as_fixed_byte_array = true; - // TODO: This should probably be shared among all formats, and interact with + // TODO: This should probably be shared among all formats and with // https://github.com/ClickHouse/ClickHouse/issues/38755 bool preserve_order = false; UInt64 max_block_size = 8192; ParquetVersion output_version; ParquetCompression output_compression_method = ParquetCompression::SNAPPY; - // Limit on read size, but not on memory usage; many reads can be buffered at once. - // TODO: Remove and use max_download_buffer_size instead. - size_t max_bytes_to_read_at_once = 128 * 1024 * 1024; } parquet; struct Pretty diff --git a/src/IO/ParallelReadBuffer.cpp b/src/IO/ParallelReadBuffer.cpp index 81a26b252e7..b2ba670ca44 100644 --- a/src/IO/ParallelReadBuffer.cpp +++ b/src/IO/ParallelReadBuffer.cpp @@ -147,7 +147,6 @@ off_t ParallelReadBuffer::seek(off_t offset, int whence) return offset; } } - chassert(false); } finishAndWait(); diff --git a/src/IO/ReadBufferFromS3.cpp b/src/IO/ReadBufferFromS3.cpp index 197220a94cb..e0bca52d333 100644 --- a/src/IO/ReadBufferFromS3.cpp +++ b/src/IO/ReadBufferFromS3.cpp @@ -53,8 +53,9 @@ ReadBufferFromS3::ReadBufferFromS3( bool use_external_buffer_, size_t offset_, size_t read_until_position_, - bool restricted_seek_) - : ReadBufferFromFileBase(use_external_buffer_ ? 0 : settings_.remote_fs_buffer_size, nullptr, 0) + bool restricted_seek_, + std::optional file_size_) + : ReadBufferFromFileBase(use_external_buffer_ ? 0 : settings_.remote_fs_buffer_size, nullptr, 0, file_size_) , client_ptr(std::move(client_ptr_)) , bucket(bucket_) , key(key_) @@ -177,6 +178,7 @@ bool ReadBufferFromS3::nextImpl() sleep_time_with_backoff_milliseconds *= 2; /// Try to reinitialize `impl`. + resetWorkingBuffer(); impl.reset(); } } @@ -197,15 +199,15 @@ bool ReadBufferFromS3::nextImpl() off_t ReadBufferFromS3::seek(off_t offset_, int whence) { - if (offset_ == offset && whence == SEEK_SET) - return offset; + if (offset_ == getPosition() && whence == SEEK_SET) + return offset_; if (impl && restricted_seek) throw Exception( ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Seek is allowed only before first read attempt from the buffer (current offset: " "{}, new offset: {}, reading until position: {}, available: {})", - offset, offset_, read_until_position, available()); + getPosition(), offset_, read_until_position, available()); if (whence != SEEK_SET) throw Exception(ErrorCodes::CANNOT_SEEK_THROUGH_FILE, "Only SEEK_SET mode is allowed."); @@ -221,7 +223,7 @@ off_t ReadBufferFromS3::seek(off_t offset_, int whence) { pos = working_buffer.end() - (offset - offset_); assert(pos >= working_buffer.begin()); - assert(pos <= working_buffer.end()); + assert(pos < working_buffer.end()); return getPosition(); } @@ -274,6 +276,8 @@ void ReadBufferFromS3::setReadUntilPosition(size_t position) { if (!atEndOfRequestedRangeGuess()) ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + offset = getPosition(); + resetWorkingBuffer(); impl.reset(); } read_until_position = position; @@ -289,12 +293,15 @@ void ReadBufferFromS3::setReadUntilEnd() { if (!atEndOfRequestedRangeGuess()) ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); + offset = getPosition(); + resetWorkingBuffer(); impl.reset(); } } } -bool ReadBufferFromS3::atEndOfRequestedRangeGuess() { +bool ReadBufferFromS3::atEndOfRequestedRangeGuess() +{ if (!impl) return true; if (read_until_position) diff --git a/src/IO/ReadBufferFromS3.h b/src/IO/ReadBufferFromS3.h index 106dbd72a2d..52dd74bdd14 100644 --- a/src/IO/ReadBufferFromS3.h +++ b/src/IO/ReadBufferFromS3.h @@ -57,7 +57,8 @@ public: bool use_external_buffer = false, size_t offset_ = 0, size_t read_until_position_ = 0, - bool restricted_seek_ = false); + bool restricted_seek_ = false, + std::optional file_size = std::nullopt); bool nextImpl() override; @@ -110,10 +111,7 @@ public: , read_settings(read_settings_) , object_size(object_size_) , request_settings(request_settings_) - { - assert(range_step > 0); - assert(range_step < object_size); - } + {} std::unique_ptr getReader() override; diff --git a/src/IO/ReadWriteBufferFromHTTP.h b/src/IO/ReadWriteBufferFromHTTP.h index 2c41e3bccab..f9f98b21388 100644 --- a/src/IO/ReadWriteBufferFromHTTP.h +++ b/src/IO/ReadWriteBufferFromHTTP.h @@ -90,6 +90,15 @@ namespace detail template class ReadWriteBufferFromHTTPBase : public SeekableReadBuffer, public WithFileName, public WithFileSize { + public: + struct FileInfo + { + // nullopt if the server doesn't report it. + std::optional file_size; + std::optional last_modified; + bool seekable = false; + }; + protected: /// HTTP range, including right bound [begin, end]. struct Range @@ -117,7 +126,7 @@ namespace detail size_t offset_from_begin_pos = 0; Range read_range; - std::optional file_size; + std::optional file_info; /// Delayed exception in case retries with partial content are not satisfiable. std::exception_ptr exception; @@ -133,7 +142,7 @@ namespace detail bool withPartialContent(const Range & range) const { /** - * Add range header if we have some passed range (for disk web) + * Add range header if we have some passed range * or if we want to retry GET request on purpose. */ return range.begin || range.end || retry_with_range_header; @@ -162,12 +171,7 @@ namespace detail request.set(header, value); std::optional range; - if constexpr (for_object_info) - { - if (withPartialContent(Range{})) - range = Range{0, std::nullopt}; - } - else + if constexpr (!for_object_info) { if (withPartialContent(read_range)) range = Range{getOffset(), read_range.end}; @@ -218,21 +222,22 @@ namespace detail size_t getFileSize() override { - if (file_size) - return *file_size; + if (!file_info) + file_info = getFileInfo(); - Poco::Net::HTTPResponse response; - getHeadResponse(response); - - if (response.hasContentLength()) - { - file_size = response.getContentLength(); - return *file_size; - } + if (file_info->file_size) + return *file_info->file_size; throw Exception(ErrorCodes::UNKNOWN_FILE_SIZE, "Cannot find out file size for: {}", uri.toString()); } + bool checkIfActuallySeekable() override + { + if (!file_info) + file_info = getFileInfo(); + return file_info->seekable; + } + String getFileName() const override { return uri.toString(); } enum class InitializeError @@ -297,7 +302,8 @@ namespace detail const RemoteHostFilter * remote_host_filter_ = nullptr, bool delay_initialization = false, bool use_external_buffer_ = false, - bool http_skip_not_found_url_ = false) + bool http_skip_not_found_url_ = false, + std::optional file_info_ = std::nullopt) : SeekableReadBuffer(nullptr, 0) , uri {uri_} , method {!method_.empty() ? method_ : out_stream_callback_ ? Poco::Net::HTTPRequest::HTTP_POST : Poco::Net::HTTPRequest::HTTP_GET} @@ -308,6 +314,7 @@ namespace detail , remote_host_filter {remote_host_filter_} , buffer_size {buffer_size_} , use_external_buffer {use_external_buffer_} + , file_info(file_info_) , http_skip_not_found_url(http_skip_not_found_url_) , settings {settings_} , log(&Poco::Logger::get("ReadWriteBufferFromHTTP")) @@ -497,7 +504,7 @@ namespace detail return; } - else if (read_range.end && file_size && *read_range.end + 1 < *file_size) + else if (read_range.end) { /// We could have range.begin == 0 and range.end != 0 in case of DiskWeb and failing to read with partial content /// will affect only performance, so a warning is enough. @@ -505,6 +512,10 @@ namespace detail } } + // Remember file size. It'll be used to report eof in next nextImpl() call. + if (!read_range.end && response.hasContentLength()) + file_info = parseFileInfo(response, withPartialContent(read_range) ? getOffset() : 0); + try { impl = std::make_unique(*istr, buffer_size); @@ -533,7 +544,8 @@ namespace detail if (next_callback) next_callback(count()); - if (read_range.end && getOffset() > read_range.end.value()) + if ((read_range.end && getOffset() > read_range.end.value()) || + (file_info && file_info->file_size && getOffset() >= file_info->file_size.value())) return false; if (impl) @@ -680,12 +692,13 @@ namespace detail { pos = working_buffer.end() - (current_offset - offset_); assert(pos >= working_buffer.begin()); - assert(pos <= working_buffer.end()); + assert(pos < working_buffer.end()); return getPosition(); } - if (impl) { + if (impl) + { auto position = getPosition(); if (offset_ > position) { @@ -714,40 +727,43 @@ namespace detail until = std::max(until, 1ul); if (read_range.end && *read_range.end + 1 == until) return; - if (impl) { + read_range.end = until - 1; + read_range.begin = getPosition(); + resetWorkingBuffer(); + if (impl) + { if (!atEndOfRequestedRangeGuess()) ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } - read_range.end = until - 1; - read_range.begin = getPosition(); - resetWorkingBuffer(); } void setReadUntilEnd() override { if (!read_range.end) return; - if (impl) { + read_range.end.reset(); + read_range.begin = getPosition(); + resetWorkingBuffer(); + if (impl) + { if (!atEndOfRequestedRangeGuess()) ProfileEvents::increment(ProfileEvents::ReadBufferSeekCancelConnection); impl.reset(); } - read_range.end.reset(); - read_range.begin = getPosition(); - resetWorkingBuffer(); } bool supportsRightBoundedReads() const override { return true; } // If true, if we destroy impl now, no work was wasted. Just for metrics. - bool atEndOfRequestedRangeGuess() { + bool atEndOfRequestedRangeGuess() + { if (!impl) return true; if (read_range.end) return getPosition() > static_cast(*read_range.end); - if (file_size) - return getPosition() >= static_cast(*file_size); + if (file_info && file_info->file_size) + return getPosition() >= static_cast(*file_info->file_size); return false; } @@ -773,19 +789,46 @@ namespace detail const std::string & getCompressionMethod() const { return content_encoding; } std::optional getLastModificationTime() + { + return getFileInfo().last_modified; + } + + FileInfo getFileInfo() { Poco::Net::HTTPResponse response; getHeadResponse(response); - if (!response.has("Last-Modified")) - return std::nullopt; + return parseFileInfo(response, 0); + } - String date_str = response.get("Last-Modified"); - struct tm info; - char * res = strptime(date_str.data(), "%a, %d %b %Y %H:%M:%S %Z", &info); - if (!res || res != date_str.data() + date_str.size()) - return std::nullopt; + FileInfo parseFileInfo(const Poco::Net::HTTPResponse & response, size_t requested_range_begin) + { + FileInfo res; - return timegm(&info); + if (response.hasContentLength()) + { + res.file_size = response.getContentLength(); + + if (response.getStatus() == Poco::Net::HTTPResponse::HTTPStatus::HTTP_PARTIAL_CONTENT) + { + *res.file_size += requested_range_begin; + res.seekable = true; + } + else + { + res.seekable = response.has("Accept-Ranges") && response.get("Accept-Ranges") == "bytes"; + } + } + + if (response.has("Last-Modified")) + { + String date_str = response.get("Last-Modified"); + struct tm info; + char * end = strptime(date_str.data(), "%a, %d %b %Y %H:%M:%S %Z", &info); + if (end == date_str.data() + date_str.size()) + res.last_modified = timegm(&info); + } + + return res; } }; } @@ -823,7 +866,8 @@ public: const RemoteHostFilter * remote_host_filter_ = nullptr, bool delay_initialization_ = true, bool use_external_buffer_ = false, - bool skip_not_found_url_ = false) + bool skip_not_found_url_ = false, + std::optional file_info_ = std::nullopt) : Parent( std::make_shared(uri_, max_redirects, std::make_shared(timeouts)), uri_, @@ -836,7 +880,8 @@ public: remote_host_filter_, delay_initialization_, use_external_buffer_, - skip_not_found_url_) + skip_not_found_url_, + file_info_) { } }; @@ -847,7 +892,6 @@ class RangedReadWriteBufferFromHTTPFactory : public SeekableReadBufferFactory, p public: RangedReadWriteBufferFromHTTPFactory( - size_t total_object_size_, Poco::URI uri_, std::string method_, OutStreamCallback out_stream_callback_, @@ -861,8 +905,7 @@ public: bool delay_initialization_ = true, bool use_external_buffer_ = false, bool skip_not_found_url_ = false) - : total_object_size(total_object_size_) - , uri(uri_) + : uri(uri_) , method(std::move(method_)) , out_stream_callback(out_stream_callback_) , timeouts(std::move(timeouts_)) @@ -893,15 +936,33 @@ public: remote_host_filter, delay_initialization, use_external_buffer, - skip_not_found_url); + skip_not_found_url, + file_info); } - size_t getFileSize() override { return total_object_size; } + size_t getFileSize() override + { + auto s = getFileInfo().file_size; + if (!s) + throw Exception(ErrorCodes::UNKNOWN_FILE_SIZE, "Cannot find out file size for: {}", uri.toString()); + return *s; + } + + bool checkIfActuallySeekable() override + { + return getFileInfo().seekable; + } + + ReadWriteBufferFromHTTP::FileInfo getFileInfo() + { + if (!file_info) + file_info = static_cast(getReader().get())->getFileInfo(); + return *file_info; + } String getFileName() const override { return uri.toString(); } private: - size_t total_object_size; Poco::URI uri; std::string method; OutStreamCallback out_stream_callback; @@ -912,6 +973,7 @@ private: ReadSettings settings; HTTPHeaderEntries http_header_entries; const RemoteHostFilter * remote_host_filter; + std::optional file_info; bool delay_initialization; bool use_external_buffer; bool skip_not_found_url; diff --git a/src/IO/SeekableReadBuffer.h b/src/IO/SeekableReadBuffer.h index d0581f58249..efbafff03e2 100644 --- a/src/IO/SeekableReadBuffer.h +++ b/src/IO/SeekableReadBuffer.h @@ -50,9 +50,21 @@ public: virtual bool supportsRightBoundedReads() const { return false; } virtual bool isIntegratedWithFilesystemCache() const { return false; } + + // Returns true if seek() actually works, false if seek() will always throw (or make subsequent + // nextImpl() calls throw). + // + // This is needed because: + // * Sometimes there's no cheap way to know in advance whether the buffer is really seekable. + // Specifically, HTTP read buffer needs to send a request to check whether the server + // supports byte ranges. + // * Sometimes when we create such buffer we don't know in advance whether we'll need it to be + // seekable or not. So we don't want to pay the price for this check in advance. + virtual bool checkIfActuallySeekable() { return true; } }; // Useful for reading in parallel. +// The created read buffers may outlive the factory. class SeekableReadBufferFactory : public WithFileSize { public: @@ -62,6 +74,8 @@ public: // So it's recommended that the returned implementation be lazy, i.e. don't start reading // before the first call to nextImpl(). virtual std::unique_ptr getReader() = 0; + + virtual bool checkIfActuallySeekable() { return true; } }; using SeekableReadBufferPtr = std::shared_ptr; diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp index 0f3cc12bc12..54f3b76ff60 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp @@ -99,7 +99,8 @@ arrow::Future> RandomAccessFileFromSeekableReadBu arrow::Status RandomAccessFileFromSeekableReadBuffer::Seek(int64_t position) { - if (avoid_buffering) { + if (avoid_buffering) + { // Seeking to a position above a previous setReadUntilPosition() confuses some of the // ReadBuffer implementations. in.setReadUntilEnd(); @@ -147,11 +148,13 @@ arrow::Status ArrowInputStreamFromReadBuffer::Close() RandomAccessFileFromManyReadBuffers::RandomAccessFileFromManyReadBuffers(SeekableReadBufferFactory & factory) : buf_factory(factory) {} -arrow::Result RandomAccessFileFromManyReadBuffers::GetSize() { +arrow::Result RandomAccessFileFromManyReadBuffers::GetSize() +{ return buf_factory.getFileSize(); } -arrow::Result RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes, void* out) { +arrow::Result RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes, void* out) +{ std::unique_lock lock(mutex); if (free_bufs.empty()) free_bufs.push_back(buf_factory.getReader()); @@ -159,6 +162,14 @@ arrow::Result RandomAccessFileFromManyReadBuffers::ReadAt(int64_t posit free_bufs.pop_back(); lock.unlock(); + // To work well with this, ReadBuffer implementations need to respect setReadUntilPosition() and + // not read above it. We often do very small reads here. + // Also nice if they: + // * Make readBig() read directly into the provided memory, instead of copying from internal + // buffer. + // * Allocate the internal buffer (if any) lazily in first nextImpl() call. If all reads are + // tiny readBig() calls (as is typical here), it won't allocate an unnecessary 1 MB buffer. + buf->seek(position, SEEK_SET); buf->setReadUntilPosition(position + nbytes); size_t bytes_read = buf->readBig(reinterpret_cast(out), nbytes); @@ -173,7 +184,8 @@ arrow::Result RandomAccessFileFromManyReadBuffers::ReadAt(int64_t posit return static_cast(bytes_read); } -arrow::Result> RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes) { +arrow::Result> RandomAccessFileFromManyReadBuffers::ReadAt(int64_t position, int64_t nbytes) +{ ARROW_ASSIGN_OR_RAISE(auto buffer, arrow::AllocateResizableBuffer(nbytes)) ARROW_ASSIGN_OR_RAISE(int64_t bytes_read, ReadAt(position, nbytes, buffer->mutable_data())) @@ -183,11 +195,13 @@ arrow::Result> RandomAccessFileFromManyReadBuffer return buffer; } -arrow::Future> RandomAccessFileFromManyReadBuffers::ReadAsync(const arrow::io::IOContext&, int64_t position, int64_t nbytes) { +arrow::Future> RandomAccessFileFromManyReadBuffers::ReadAsync(const arrow::io::IOContext&, int64_t position, int64_t nbytes) +{ return arrow::Future>::MakeFinished(ReadAt(position, nbytes)); } -arrow::Status RandomAccessFileFromManyReadBuffers::Close() { +arrow::Status RandomAccessFileFromManyReadBuffers::Close() +{ chassert(is_open); is_open = false; return arrow::Status::OK(); @@ -214,13 +228,23 @@ std::shared_ptr asArrowFile( if (res == 0 && S_ISREG(stat.st_mode)) return std::make_shared(*fd_in, stat.st_size, avoid_buffering); } - else if (dynamic_cast(&in) && isBufferWithFileSize(in)) + else if (auto * seekable_in = dynamic_cast(&in); + seekable_in && settings.seekable_read && isBufferWithFileSize(in) && + seekable_in->checkIfActuallySeekable()) { - if (settings.seekable_read) return std::make_shared(in, std::nullopt, avoid_buffering); } // fallback to loading the entire file in memory + return asArrowFileLoadIntoMemory(in, is_cancelled, format_name, magic_bytes); +} + +std::shared_ptr asArrowFileLoadIntoMemory( + ReadBuffer & in, + std::atomic & is_cancelled, + const std::string & format_name, + const std::string & magic_bytes) +{ std::string file_data; { PeekableReadBuffer buf(in); diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.h b/src/Processors/Formats/Impl/ArrowBufferedStreams.h index dee38a7db7e..9307172cb11 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.h +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.h @@ -142,6 +142,13 @@ std::shared_ptr asArrowFile( // (ReadBuffer is not a good abstraction in this case, but it works.) bool avoid_buffering = false); +// Reads the whole file into a memory buffer, owned by the returned RandomAccessFile. +std::shared_ptr asArrowFileLoadIntoMemory( + ReadBuffer & in, + std::atomic & is_cancelled, + const std::string & format_name, + const std::string & magic_bytes); + } #endif diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp index 1b537219aeb..7f90c1197ce 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.cpp @@ -3,6 +3,7 @@ #if USE_PARQUET +#include #include #include #include @@ -16,6 +17,7 @@ #include "ArrowBufferedStreams.h" #include "ArrowColumnToCHColumn.h" #include "ArrowFieldIndexUtil.h" +#include #include namespace CurrentMetrics @@ -47,28 +49,39 @@ ParquetBlockInputFormat::ParquetBlockInputFormat( const FormatSettings & format_settings_, size_t max_decoding_threads_, size_t min_bytes_for_seek_) - : IInputFormat(std::move(header_), buf) + : IInputFormat(header_, buf) , buf_factory(std::move(buf_factory_)) , format_settings(format_settings_) , skip_row_groups(format_settings.parquet.skip_row_groups) , max_decoding_threads(max_decoding_threads_) , min_bytes_for_seek(min_bytes_for_seek_) - , to_deliver(ChunkToDeliver::Compare { .row_group_first = format_settings_.parquet.preserve_order }) + , pending_chunks(PendingChunk::Compare { .row_group_first = format_settings_.parquet.preserve_order }) { if (max_decoding_threads > 1) - pool.emplace(CurrentMetrics::ParquetDecoderThreads, CurrentMetrics::ParquetDecoderThreadsActive, max_decoding_threads); + pool = std::make_unique(CurrentMetrics::ParquetDecoderThreads, CurrentMetrics::ParquetDecoderThreadsActive, max_decoding_threads); } ParquetBlockInputFormat::~ParquetBlockInputFormat() = default; -void ParquetBlockInputFormat::initializeIfNeeded() { +void ParquetBlockInputFormat::initializeIfNeeded() +{ if (std::exchange(is_initialized, true)) return; + // Create arrow file adapter. + // TODO: Make the adapter do prefetching on IO threads, based on the full set of ranges that + // we'll need to read (which we know in advance). Use max_download_threads for that. if (buf_factory) - arrow_file = std::make_shared(*buf_factory); + { + if (format_settings.seekable_read && buf_factory->checkIfActuallySeekable()) + arrow_file = std::make_shared(*buf_factory); + else + arrow_file = asArrowFileLoadIntoMemory(*buf_factory->getReader(), is_stopped, "Parquet", PARQUET_MAGIC_BYTES); + } else + { arrow_file = asArrowFile(*in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES, /* avoid_buffering */ true); + } if (is_stopped) return; @@ -86,7 +99,8 @@ void ParquetBlockInputFormat::initializeIfNeeded() { column_indices = field_util.findRequiredIndices(getPort().getHeader(), *schema); } -void ParquetBlockInputFormat::prepareRowGroupReader(size_t row_group_idx) { +void ParquetBlockInputFormat::initializeRowGroupReader(size_t row_group_idx) +{ auto & row_group = row_groups[row_group_idx]; parquet::ArrowReaderProperties properties; @@ -94,9 +108,8 @@ void ParquetBlockInputFormat::prepareRowGroupReader(size_t row_group_idx) { properties.set_batch_size(format_settings.parquet.max_block_size); // When reading a row group, arrow will: - // 1. Before reading anything, look at all the byte ranges it'll need to read from the file - // (typically one per requested column in the row group). This information is in file - // metadata. + // 1. Look at `metadata` to get all byte ranges it'll need to read from the file (typically one + // per requested column in the row group). // 2. Coalesce ranges that are close together, trading off seeks vs read amplification. // This is controlled by CacheOptions. // 3. Process the columns one by one, issuing the corresponding (coalesced) range reads as @@ -113,9 +126,22 @@ void ParquetBlockInputFormat::prepareRowGroupReader(size_t row_group_idx) { properties.set_pre_buffer(true); auto cache_options = arrow::io::CacheOptions::LazyDefaults(); cache_options.hole_size_limit = min_bytes_for_seek; - cache_options.range_size_limit = format_settings.parquet.max_bytes_to_read_at_once; + cache_options.range_size_limit = 1l << 40; // reading the whole row group at once is fine properties.set_cache_options(cache_options); + // Workaround for a workaround in the parquet library. + // + // From ComputeColumnChunkRange() in contrib/arrow/cpp/src/parquet/file_reader.cc: + // > The Parquet MR writer had a bug in 1.2.8 and below where it didn't include the + // > dictionary page header size in total_compressed_size and total_uncompressed_size + // > (see IMPALA-694). We add padding to compensate. + // + // That padding breaks the pre-buffered mode because the padded read ranges may overlap each + // other, failing an assert. So we disable pre-buffering in this case. + // That version is >10 years old, so this is not very important. + if (metadata->writer_version().VersionLt(parquet::ApplicationVersion::PARQUET_816_FIXED_VERSION())) + properties.set_pre_buffer(false); + parquet::arrow::FileReaderBuilder builder; THROW_ARROW_NOT_OK( builder.Open(arrow_file, /* not to be confused with ArrowReaderProperties */ parquet::default_reader_properties(), metadata)); @@ -138,9 +164,11 @@ void ParquetBlockInputFormat::prepareRowGroupReader(size_t row_group_idx) { void ParquetBlockInputFormat::scheduleRowGroup(size_t row_group_idx) { chassert(!mutex.try_lock()); - chassert(!row_groups[row_group_idx].running); - row_groups[row_group_idx].running = true; + auto & status = row_groups[row_group_idx].status; + chassert(status == RowGroupState::Status::NotStarted || status == RowGroupState::Status::Paused); + + status = RowGroupState::Status::Running; pool->scheduleOrThrowOnError( [this, row_group_idx, thread_group = CurrentThread::getGroup()]() @@ -169,36 +197,42 @@ void ParquetBlockInputFormat::threadFunction(size_t row_group_idx) std::unique_lock lock(mutex); auto & row_group = row_groups[row_group_idx]; - chassert(!row_group.done); + chassert(row_group.status == RowGroupState::Status::Running); - while (row_group.chunks_decoded - row_group.chunks_delivered < max_pending_chunks_per_row_group && !is_stopped) + while (true) { - if (!decodeOneChunk(row_group_idx, lock)) - break; - } + if (is_stopped || row_group.num_pending_chunks >= max_pending_chunks_per_row_group) + { + row_group.status = RowGroupState::Status::Paused; + return; + } - row_group.running = false; + decodeOneChunk(row_group_idx, lock); + + if (row_group.status == RowGroupState::Status::Done) + return; + } } -bool ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_lock & lock) +void ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_lock & lock) { - // TODO: Do most reading on IO threads. Separate max_download_threads from max_parsing_threads. - auto & row_group = row_groups[row_group_idx]; - chassert(!row_group.done); + chassert(row_group.status != RowGroupState::Status::Done); chassert(lock.owns_lock()); + SCOPE_EXIT({ chassert(lock.owns_lock() || std::uncaught_exceptions()); }); lock.unlock(); auto end_of_row_group = [&] { - lock.lock(); - row_group.done = true; row_group.arrow_column_to_ch_column.reset(); row_group.record_batch_reader.reset(); row_group.file_reader.reset(); + lock.lock(); + row_group.status = RowGroupState::Status::Done; + // We may be able to schedule more work now, but can't call scheduleMoreWorkIfNeeded() right - // here because we're running on the same thread pool, so it may deadlock if thread limit is + // here because we're running on the same thread pool, so it'll deadlock if thread limit is // reached. Wake up generate() instead. condvar.notify_all(); }; @@ -208,18 +242,17 @@ bool ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_l if (skip_row_groups.contains(static_cast(row_group_idx))) { // Pretend that the row group is empty. - // (This happens kind of late. We could avoid scheduling the row group on a thread in - // the first place. But the skip_row_groups feature is mostly unused, so it's better to - // be a little inefficient than to add a bunch of extra mostly-dead code for this.) + // (We could avoid scheduling the row group on a thread in the first place. But the + // skip_row_groups feature is mostly unused, so it's better to be a little inefficient + // than to add a bunch of extra mostly-dead code for this.) end_of_row_group(); - return false; - } - else - { - prepareRowGroupReader(row_group_idx); + return; } + + initializeRowGroupReader(row_group_idx); } + auto batch = row_group.record_batch_reader->Next(); if (!batch.ok()) throw ParsingException(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading Parquet data: {}", batch.status().ToString()); @@ -227,12 +260,12 @@ bool ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_l if (!*batch) { end_of_row_group(); - return false; + return; } auto tmp_table = arrow::Table::FromRecordBatches({*batch}); - ChunkToDeliver res = {.chunk_idx = row_group.chunks_decoded, .row_group_idx = row_group_idx}; + PendingChunk res = {.chunk_idx = row_group.next_chunk_idx, .row_group_idx = row_group_idx}; /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. /// Otherwise fill the missing columns with zero values of its type. @@ -241,32 +274,33 @@ bool ParquetBlockInputFormat::decodeOneChunk(size_t row_group_idx, std::unique_l lock.lock(); - ++row_group.chunks_decoded; - to_deliver.push(std::move(res)); + ++row_group.next_chunk_idx; + ++row_group.num_pending_chunks; + pending_chunks.push(std::move(res)); condvar.notify_all(); - - return true; } void ParquetBlockInputFormat::scheduleMoreWorkIfNeeded(std::optional row_group_touched) { - while (row_groups_retired < row_groups.size()) + while (row_groups_completed < row_groups.size()) { - auto & row_group = row_groups[row_groups_retired]; - if (!row_group.done || row_group.chunks_delivered < row_group.chunks_decoded) + auto & row_group = row_groups[row_groups_completed]; + if (row_group.status != RowGroupState::Status::Done || row_group.num_pending_chunks != 0) break; - ++row_groups_retired; + ++row_groups_completed; } if (pool) { - while (row_groups_started - row_groups_retired < max_decoding_threads && row_groups_started < row_groups.size()) + while (row_groups_started - row_groups_completed < max_decoding_threads && + row_groups_started < row_groups.size()) scheduleRowGroup(row_groups_started++); if (row_group_touched) { auto & row_group = row_groups[*row_group_touched]; - if (!row_group.done && !row_group.running && row_group.chunks_decoded - row_group.chunks_delivered < max_pending_chunks_per_row_group) + if (row_group.status == RowGroupState::Status::Paused && + row_group.num_pending_chunks < max_pending_chunks_per_row_group) scheduleRowGroup(*row_group_touched); } } @@ -290,29 +324,31 @@ Chunk ParquetBlockInputFormat::generate() scheduleMoreWorkIfNeeded(); - if (!to_deliver.empty() && (!format_settings.parquet.preserve_order || to_deliver.top().row_group_idx == row_groups_retired)) + if (!pending_chunks.empty() && + (!format_settings.parquet.preserve_order || + pending_chunks.top().row_group_idx == row_groups_completed)) { - ChunkToDeliver chunk = std::move(const_cast(to_deliver.top())); - to_deliver.pop(); - - previous_block_missing_values = chunk.block_missing_values; + PendingChunk chunk = std::move(const_cast(pending_chunks.top())); + pending_chunks.pop(); auto & row_group = row_groups[chunk.row_group_idx]; - chassert(chunk.chunk_idx == row_group.chunks_delivered); - ++row_group.chunks_delivered; + chassert(row_group.num_pending_chunks != 0); + chassert(chunk.chunk_idx == row_group.next_chunk_idx - row_group.num_pending_chunks); + --row_group.num_pending_chunks; scheduleMoreWorkIfNeeded(chunk.row_group_idx); + previous_block_missing_values = std::move(chunk.block_missing_values); return std::move(chunk.chunk); } - if (row_groups_retired == row_groups.size()) + if (row_groups_completed == row_groups.size()) return {}; if (pool) condvar.wait(lock); else - decodeOneChunk(row_groups_retired, lock); + decodeOneChunk(row_groups_completed, lock); } } @@ -326,9 +362,9 @@ void ParquetBlockInputFormat::resetParser() metadata.reset(); column_indices.clear(); row_groups.clear(); - while (!to_deliver.empty()) - to_deliver.pop(); - row_groups_retired = 0; + while (!pending_chunks.empty()) + pending_chunks.pop(); + row_groups_completed = 0; previous_block_missing_values.clear(); row_groups_started = 0; background_exception = nullptr; @@ -368,28 +404,20 @@ NamesAndTypesList ParquetSchemaReader::readSchema() void registerInputFormatParquet(FormatFactory & factory) { - factory.registerInputFormat( + factory.registerRandomAccessInputFormat( "Parquet", - [](ReadBuffer & buf, - const Block & sample, - const RowInputFormatParams &, - const FormatSettings & settings) - { - // TODO: Propagate the last two from settings. - return std::make_shared(&buf, nullptr, sample, settings, 1, 4 * DBMS_DEFAULT_BUFFER_SIZE); - }, - [](SeekableReadBufferFactoryPtr buf_factory, + [](ReadBuffer * buf, + SeekableReadBufferFactoryPtr buf_factory, const Block & sample, const FormatSettings & settings, const ReadSettings& read_settings, bool is_remote_fs, - ThreadPoolCallbackRunner /* io_schedule */, size_t /* max_download_threads */, size_t max_parsing_threads) { size_t min_bytes_for_seek = is_remote_fs ? read_settings.remote_read_min_bytes_for_seek : 8 * 1024; return std::make_shared( - nullptr, + buf, std::move(buf_factory), sample, settings, diff --git a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h index 4230ba1f953..f17eee59414 100644 --- a/src/Processors/Formats/Impl/ParquetBlockInputFormat.h +++ b/src/Processors/Formats/Impl/ParquetBlockInputFormat.h @@ -42,7 +42,7 @@ class SeekableReadBufferFactory; // // For (1), we need the IInputFormat to be in control of reading, with its own implementation of // parallel reading+decoding, instead of using ParallelReadBuffer and ParallelParsingInputFormat. -// That's what MultistreamInputCreator in FormatFactory is about. +// That's what RandomAccessInputCreator in FormatFactory is about. class ParquetBlockInputFormat : public IInputFormat { @@ -72,23 +72,136 @@ private: } void initializeIfNeeded(); + void initializeRowGroupReader(size_t row_group_idx); - void prepareRowGroupReader(size_t row_group_idx); - - // The lock must be locked when calling and when returning. - bool decodeOneChunk(size_t row_group_idx, std::unique_lock & lock); + void decodeOneChunk(size_t row_group_idx, std::unique_lock & lock); void scheduleMoreWorkIfNeeded(std::optional row_group_touched = std::nullopt); void scheduleRowGroup(size_t row_group_idx); void threadFunction(size_t row_group_idx); - struct RowGroupState { - bool running = false; - bool done = false; // all chunks were decoded + // Data layout in the file: + // + // row group 0 + // column 0 + // page 0, page 1, ... + // column 1 + // page 0, page 1, ... + // ... + // row group 1 + // column 0 + // ... + // ... + // ... + // + // All columns in one row group have the same number of rows. + // (Not necessarily the same number of *values* if there are arrays or nulls.) + // Pages have arbitrary sizes and numbers of rows, independent from each other, even if in the + // same column or row group. + // + // We can think of this as having lots of data streams, one for each column x row group. + // The main job of this class is to schedule read operations for these streams across threads. + // Also: reassembling the results into chunks, creating/destroying these streams, prefetching. + // + // Some considerations: + // * Row group size is typically hundreds of MB (compressed). Apache recommends 0.5 - 1 GB. + // * Compression ratio can be pretty extreme, especially with dictionary compression. + // We can afford to keep a compressed row group in memory, but not uncompressed. + // * For each pair , the data lives in one contiguous range in the + // file. We know all these ranges in advance, from metadata. + // * The byte range for a column in a row group is often very short, like a few KB. + // So we need to: + // - Avoid unnecessary readahead, e.g. don't read 1 MB when we only need 1 KB. + // - Coalesce nearby ranges into longer reads when needed. E.g. if we need to read 5 ranges, + // 1 KB each, with 1 KB gaps between them, it's better to do 1 x 9 KB read instead of + // 5 x 1 KB reads. + // - Have lots of parallelism for reading (not necessarily for parsing). E.g. if we're + // reading one small column, it may translate to hundreds of tiny reads with long gaps + // between them. If the data comes from an HTTP server, that's hundreds of tiny HTTP GET + // requests. To get good performance, we have to do tens or hundreds of them in parallel. + // So we should probably have separate parallelism control for IO vs parsing (since we + // don't want hundreds of worker threads oversubscribing the CPU cores). + // + // (Some motivating example access patterns: + // - 'SELECT small_column'. Bottlenecked on number of seeks. Need to do lots of file/network + // reads in parallel, for lots of row groups. + // - 'SELECT *' when row group size is big and there are many columns. Read the whole file. + // Need some moderate parallelism for IO and for parsing. Ideally read+parse columns of + // one row group in parallel to avoid having multiple row groups in memory at once. + // - 'SELECT big_column'. Have to read+parse multiple row groups in parallel. + // - 'SELECT big_column, many small columns'. This is a mix of the previous two scenarios. + // We have many columns, but still need to read+parse multiple row groups in parallel.) - size_t chunks_decoded = 0; // added to_deliver - size_t chunks_delivered = 0; // removed from to_deliver + // With all that in mind, here's what we do. + // + // We treat each row group as a sequential single-threaded stream of blocks. + // + // We have a sliding window of active row groups. When a row group becomes active, we start + // reading its data (using RAM). Row group becomes inactive when we finish reading and + // delivering all its blocks and free the RAM. Size of the window is max_decoding_threads. + // + // Decoded blocks are placed in `pending_chunks` queue, then picked up by generate(). + // If row group decoding runs too far ahead of delivery (by `max_pending_chunks_per_row_group` + // chunks), we pause the stream for the row group, to avoid using too much memory when decoded + // chunks are much bigger than the compressed data. + // + // Also: + // * If preserve_order = true, we deliver chunks strictly in order of increasing row group. + // Decoding may still proceed in later row groups. + // * If max_decoding_threads <= 1, we run all tasks inline in generate(), without thread pool. + + // Potential improvements: + // * Plan all read ranges ahead of time, for the whole file, and do prefetching for them + // in background. Using max_download_threads, which can be made much greater than + // max_decoding_threads by default. + // * Can parse different columns within the same row group in parallel. This would let us have + // fewer row groups in memory at once, reducing memory usage when selecting many columns. + // Should probably do more than one column per task because columns are often very small. + // Maybe split each row group into, say, max_decoding_threads * 2 equal-sized column bunches? + // * Sliding window could take into account the (predicted) memory usage of row groups. + // If row groups are big and many columns are selected, we may use lots of memory when + // reading max_decoding_threads row groups at once. Can adjust the sliding window size based + // on row groups' data sizes from metadata. + // * The max_pending_chunks_per_row_group limit could be based on actual memory usage too. + // Useful for preserve_order. + + struct RowGroupState + { + // Transitions: + // + // NotStarted -> Running -> Complete + // Ʌ + // V + // Paused + // + // If max_decoding_threads <= 1: NotStarted -> Complete. + enum class Status + { + NotStarted, + Running, + // Paused decoding because too many chunks are pending. + Paused, + // Decoded everything. + Done, + }; + + Status status = Status::NotStarted; + + // Window of chunks that were decoded but not returned from generate(): + // + // (delivered) next_chunk_idx + // v v v + // +---+---+---+---+---+---+---+---+---+---+ + // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <-- all chunks + // +---+---+---+---+---+---+---+---+---+---+ + // ^ ^ ^ ^ ^ + // num_pending_chunks + // (in pending_chunks) + // (at most max_pending_chunks_per_row_group) + + size_t next_chunk_idx = 0; + size_t num_pending_chunks = 0; // These are only used by the decoding thread, so don't require locking the mutex. std::unique_ptr file_reader; @@ -96,7 +209,9 @@ private: std::unique_ptr arrow_column_to_ch_column; }; - struct ChunkToDeliver { + // Chunk ready to be delivered by generate(). + struct PendingChunk + { Chunk chunk; BlockMissingValues block_missing_values; size_t chunk_idx; // within row group @@ -105,11 +220,13 @@ private: // For priority_queue. // In ordered mode we deliver strictly in order of increasing row group idx, // in unordered mode we prefer to interleave chunks from different row groups. - struct Compare { + struct Compare + { bool row_group_first = false; - bool operator()(const ChunkToDeliver & a, const ChunkToDeliver & b) const { - auto tuplificate = [this](const ChunkToDeliver & c) + bool operator()(const PendingChunk & a, const PendingChunk & b) const + { + auto tuplificate = [this](const PendingChunk & c) { return row_group_first ? std::tie(c.row_group_idx, c.chunk_idx) : std::tie(c.chunk_idx, c.row_group_idx); }; return tuplificate(a) > tuplificate(b); @@ -131,16 +248,29 @@ private: // indices of columns to read from Parquet file std::vector column_indices; + // Window of active row groups: + // + // row_groups_completed row_groups_started + // v v + // +---+---+---+---+---+---+---+---+---+---+ + // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <-- all row groups + // +---+---+---+---+---+---+---+---+---+---+ + // ^ ^ ^ ^ ^ + // Done NotStarted + std::mutex mutex; - std::condition_variable condvar; // notified after adding to to_deliver + // Wakes up the generate() call, if any. + std::condition_variable condvar; + std::vector row_groups; - std::priority_queue, ChunkToDeliver::Compare> to_deliver; - size_t row_groups_retired = 0; - BlockMissingValues previous_block_missing_values; + std::priority_queue, PendingChunk::Compare> pending_chunks; + size_t row_groups_completed = 0; // These are only used when max_decoding_threads > 1. size_t row_groups_started = 0; - std::optional pool; + std::unique_ptr pool; + + BlockMissingValues previous_block_missing_values; std::exception_ptr background_exception = nullptr; std::atomic is_stopped{0}; diff --git a/src/Storages/MergeTree/MergeTreeBlockReadUtils.h b/src/Storages/MergeTree/MergeTreeBlockReadUtils.h index e7dad5173ff..5fce95e1714 100644 --- a/src/Storages/MergeTree/MergeTreeBlockReadUtils.h +++ b/src/Storages/MergeTree/MergeTreeBlockReadUtils.h @@ -64,7 +64,7 @@ struct MergeTreeReadTask /// Used to save current range processing status MergeTreeRangeReader range_reader; /// Range readers for multiple filtering steps: row level security, PREWHERE etc. - /// NOTE: we take references to elements and push_back new elements, that's why it is a deque but noit a vector + /// NOTE: we take references to elements and push_back new elements, that's why it is a deque but not a vector std::deque pre_range_readers; using MergeTreeReaderPtr = std::unique_ptr; diff --git a/src/Storages/MergeTree/MergeTreePrefetchedReadPool.cpp b/src/Storages/MergeTree/MergeTreePrefetchedReadPool.cpp index e184f84528b..d862d4e060c 100644 --- a/src/Storages/MergeTree/MergeTreePrefetchedReadPool.cpp +++ b/src/Storages/MergeTree/MergeTreePrefetchedReadPool.cpp @@ -365,7 +365,6 @@ MergeTreePrefetchedReadPool::ThreadsTasks MergeTreePrefetchedReadPool::createThr min_prefetch_step_marks = static_cast(std::round(static_cast(sum_marks) / settings.filesystem_prefetches_limit)); } - size_t total_prefetches_approx = 0; for (const auto & part : parts_infos) { if (settings.filesystem_prefetch_step_marks) @@ -425,7 +424,6 @@ MergeTreePrefetchedReadPool::ThreadsTasks MergeTreePrefetchedReadPool::createThr sum_marks, threads, min_marks_per_thread, settings.filesystem_prefetch_step_bytes, settings.filesystem_prefetches_limit, total_size_approx); size_t current_prefetches_count = 0; - prefetch_queue.reserve(total_prefetches_approx); ThreadsTasks result_threads_tasks; size_t memory_usage_approx = 0; diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index fa4b18f734f..55bf1b36c1e 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -574,14 +574,34 @@ StorageS3Source::ReaderHolder StorageS3Source::createReader() return {}; size_t object_size = info ? info->size : S3::getObjectSize(*client, bucket, current_key, version_id, request_settings); + auto compression_method = chooseCompressionMethod(current_key, compression_hint); - int zstd_window_log_max = static_cast(getContext()->getSettingsRef().zstd_window_log_max); - auto read_buf = wrapReadBufferWithCompressionMethod( - createS3ReadBuffer(current_key, object_size), - chooseCompressionMethod(current_key, compression_hint), - zstd_window_log_max); + InputFormatPtr input_format; + std::unique_ptr owned_read_buf; + + auto read_buf_or_factory = createS3ReadBuffer(current_key, object_size); + if (read_buf_or_factory.buf_factory) + { + input_format = FormatFactory::instance().getInputRandomAccess( + format, + std::move(read_buf_or_factory.buf_factory), + sample_block, + getContext(), + max_block_size, + /* is_remote_fs */ true, + compression_method, + format_settings); + } + else + { + owned_read_buf = wrapReadBufferWithCompressionMethod( + std::move(read_buf_or_factory.buf), + compression_method, + static_cast(getContext()->getSettingsRef().zstd_window_log_max)); + input_format = FormatFactory::instance().getInput( + format, *owned_read_buf, sample_block, getContext(), max_block_size, format_settings); + } - auto input_format = getContext()->getInputFormat(format, *read_buf, sample_block, max_block_size, format_settings); QueryPipelineBuilder builder; builder.init(Pipe(input_format)); @@ -595,7 +615,7 @@ StorageS3Source::ReaderHolder StorageS3Source::createReader() auto pipeline = std::make_unique(QueryPipelineBuilder::getPipeline(std::move(builder))); auto current_reader = std::make_unique(*pipeline); - return ReaderHolder{fs::path(bucket) / current_key, std::move(read_buf), std::move(pipeline), std::move(current_reader)}; + return ReaderHolder{fs::path(bucket) / current_key, std::move(owned_read_buf), std::move(pipeline), std::move(current_reader)}; } std::future StorageS3Source::createReaderAsync() @@ -603,46 +623,34 @@ std::future StorageS3Source::createReaderAsync() return create_reader_scheduler([this] { return createReader(); }, 0); } -std::unique_ptr StorageS3Source::createS3ReadBuffer(const String & key, size_t object_size) +StorageS3Source::ReadBufferOrFactory StorageS3Source::createS3ReadBuffer(const String & key, size_t object_size) { auto read_settings = getContext()->getReadSettings().adjustBufferSize(object_size); read_settings.enable_filesystem_cache = false; - auto download_buffer_size = getContext()->getSettings().max_download_buffer_size; - const bool use_parallel_download = download_buffer_size > 0 && download_thread_num > 1; - const bool object_too_small = object_size < download_thread_num * download_buffer_size; + const bool object_too_small = object_size <= 2 * download_buffer_size; - if (!use_parallel_download || object_too_small) + // Create a read buffer that will prefetch the first ~1 MB of the file. + // When reading lots of tiny files, this prefetching almost doubles the throughput. + // For bigger files, parallel reading is more useful. + if (object_too_small && read_settings.remote_fs_method == RemoteFSReadMethod::threadpool) { - LOG_TRACE(log, "Downloading object of size {} from S3 in single thread", object_size); - if (read_settings.remote_fs_method == RemoteFSReadMethod::threadpool) - return createAsyncS3ReadBuffer(key, read_settings, object_size); - - return std::make_unique(client, bucket, key, version_id, request_settings, read_settings); + LOG_TRACE(log, "Downloading object of size {} from S3 with initial prefetch", object_size); + return {.buf = createAsyncS3ReadBuffer(key, read_settings, object_size)}; } - assert(object_size > 0); - if (download_buffer_size < DBMS_DEFAULT_BUFFER_SIZE) - { - LOG_WARNING(log, "Downloading buffer {} bytes too small, set at least {} bytes", download_buffer_size, DBMS_DEFAULT_BUFFER_SIZE); - download_buffer_size = DBMS_DEFAULT_BUFFER_SIZE; - } + chassert(object_size > 0); auto factory = std::make_unique( client, bucket, key, version_id, object_size, request_settings, read_settings); - - LOG_TRACE(log, - "Downloading from S3 in {} threads. Object size: {}, Range size: {}.", - download_thread_num, object_size, download_buffer_size); - - return std::make_unique(std::move(factory), threadPoolCallbackRunner(IOThreadPool::get(), "S3ParallelRead"), download_thread_num, download_buffer_size); + return {.buf_factory = std::move(factory)}; } std::unique_ptr StorageS3Source::createAsyncS3ReadBuffer( const String & key, const ReadSettings & read_settings, size_t object_size) { auto read_buffer_creator = - [this, read_settings] + [this, read_settings, object_size] (const std::string & path, size_t read_until_position) -> std::shared_ptr { return std::make_shared( @@ -655,7 +663,8 @@ std::unique_ptr StorageS3Source::createAsyncS3ReadBuffer( /* use_external_buffer */true, /* offset */0, read_until_position, - /* restricted_seek */true); + /* restricted_seek */true, + object_size); }; auto s3_impl = std::make_unique( diff --git a/src/Storages/StorageS3.h b/src/Storages/StorageS3.h index 3b14cf2859a..fd23dd89ccd 100644 --- a/src/Storages/StorageS3.h +++ b/src/Storages/StorageS3.h @@ -203,6 +203,12 @@ private: std::unique_ptr reader; }; + struct ReadBufferOrFactory + { + std::unique_ptr buf; + SeekableReadBufferFactoryPtr buf_factory; + }; + ReaderHolder reader; std::vector requested_virtual_columns; @@ -223,7 +229,7 @@ private: ReaderHolder createReader(); std::future createReaderAsync(); - std::unique_ptr createS3ReadBuffer(const String & key, size_t object_size); + ReadBufferOrFactory createS3ReadBuffer(const String & key, size_t object_size); std::unique_ptr createAsyncS3ReadBuffer(const String & key, const ReadSettings & read_settings, size_t object_size); }; diff --git a/src/Storages/StorageURL.cpp b/src/Storages/StorageURL.cpp index a8edb64bac8..d2df3881c71 100644 --- a/src/Storages/StorageURL.cpp +++ b/src/Storages/StorageURL.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include #include @@ -205,7 +204,7 @@ namespace throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty url list"); auto first_option = uri_options.begin(); - auto buf_info = getFirstAvailableURLReadBuffer( + auto buf_factory = getFirstAvailableURLReadBuffer( first_option, uri_options.end(), context, @@ -213,50 +212,31 @@ namespace http_method, callback, timeouts, - compression_method, credentials, headers, glob_url, - uri_options.size() == 1, - download_threads); - InputFormatPtr input_format; + uri_options.size() == 1); - auto format_settings_to_use = format_settings ? *format_settings : getFormatSettings(context); - format_settings_to_use.seekable_read &= buf_info.seekable_read; - - if (buf_info.buf_factory) + try { - read_buf.reset(); - total_size += buf_info.buf_factory->getFileSize(); - // TODO: Pass max_download_threads adjusted for num_streams. - input_format = FormatFactory::instance().getInputMultistream( + total_size += buf_factory->getFileSize(); + } + catch (...) + { + // we simply continue without total_size + } + + // TODO: Pass max_parsing_threads and max_download_threads adjusted for num_streams. + auto input_format = FormatFactory::instance().getInputRandomAccess( format, - std::move(buf_info.buf_factory), + std::move(buf_factory), sample_block, context, max_block_size, /* is_remote_fs */ true, compression_method, - threadPoolCallbackRunner(IOThreadPool::get(), "URLParallelRead"), - format_settings_to_use); - } - else - { - read_buf = std::move(buf_info.buf); - - try - { - total_size += getFileSizeFromReadBuffer(*read_buf); - } - catch (...) - { - // we simply continue without total_size - } - - // TODO: Pass max_download_threads adjusted for num_streams. - input_format = FormatFactory::instance().getInput( - format, *read_buf, sample_block, context, max_block_size, format_settings_to_use); - } + format_settings, + download_threads); QueryPipelineBuilder builder; builder.init(Pipe(input_format)); @@ -311,18 +291,7 @@ namespace return {}; } - struct ReadBufferInfo { - // Exactly one of these two is nullptr. - std::unique_ptr buf; - SeekableReadBufferFactoryPtr buf_factory; - - // TODO: This is currently not always used and not always assigned. Rethink. - // Something like this is required to make Parquet format work when the HTTP - // server doesn't support ranges; otherwise it does a seek, and the buffer throws. - bool seekable_read = true; - }; - - static ReadBufferInfo getFirstAvailableURLReadBuffer( + static SeekableReadBufferFactoryPtr getFirstAvailableURLReadBuffer( std::vector::const_iterator & option, const std::vector::const_iterator & end, ContextPtr context, @@ -330,12 +299,10 @@ namespace const String & http_method, std::function callback, const ConnectionTimeouts & timeouts, - CompressionMethod compression_method, Poco::Net::HTTPBasicCredentials & credentials, const HTTPHeaderEntries & headers, bool glob_url, - bool delay_initialization, - size_t download_threads) + bool delay_initialization) { String first_exception_message; ReadSettings read_settings = context->getReadSettings(); @@ -352,138 +319,40 @@ namespace setCredentials(credentials, request_uri); const auto settings = context->getSettings(); - int zstd_window_log_max = static_cast(settings.zstd_window_log_max); - ReadBufferInfo buf_info; - try + auto res = std::make_unique( + request_uri, + http_method, + callback, + timeouts, + credentials, + settings.max_http_get_redirects, + settings.max_read_buffer_size, + read_settings, + headers, + &context->getRemoteHostFilter(), + delay_initialization, + /* use_external_buffer */ false, + /* skip_url_not_found_error */ skip_url_not_found_error); + + if (options > 1) { - if (download_threads > 1) + // Send a HEAD request to check availability. + try { - try - { - ReadWriteBufferFromHTTP buffer( - request_uri, - Poco::Net::HTTPRequest::HTTP_HEAD, - callback, - timeouts, - credentials, - settings.max_http_get_redirects, - settings.max_read_buffer_size, - read_settings, - headers, - &context->getRemoteHostFilter(), - true, - /* use_external_buffer */ false, - /* skip_url_not_found_error */ skip_url_not_found_error); - - Poco::Net::HTTPResponse res; - - for (size_t i = 0; i < settings.http_max_tries; ++i) - { - try - { - buffer.callWithRedirects(res, Poco::Net::HTTPRequest::HTTP_HEAD, true); - break; - } - catch (const Poco::Exception & e) - { - LOG_TRACE( - &Poco::Logger::get("StorageURLSource"), - "HTTP HEAD request to `{}` failed at try {}/{}. " - "Error: {}.", - request_uri.toString(), - i + 1, - settings.http_max_tries, - e.displayText()); - if (!ReadWriteBufferFromHTTP::isRetriableError(res.getStatus())) - { - throw; - } - } - } - - // To check if Range header is supported, we need to send a request with it set. - // TODO: This is not quite enough. Some servers (e.g. althttpd) support ranges - // but don't send "Accept-Ranges" and don't include "Content-Range" if - // the requested range is a trivial "Range: bytes=0-". - // We should probably request "Range: bytes=1-", then add 1 to the - // returned content length (and have trouble if the file is empty). - // TODO: We only do this when download_threads <= 1, so parquet will be - // broken with non-seekable http sources and download_threads = 1. - buf_info.seekable_read = (res.has("Accept-Ranges") && res.get("Accept-Ranges") == "bytes") - || (res.has("Content-Range") && res.get("Content-Range").starts_with("bytes")); - - if (buf_info.seekable_read) - LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "HTTP Range is supported"); - else - LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "HTTP Range is not supported"); - - if (buf_info.seekable_read && res.hasContentLength()) - { - LOG_TRACE( - &Poco::Logger::get("StorageURLSource"), - "Using ParallelReadBuffer with {} workers with chunks of {} bytes", - download_threads, - settings.max_download_buffer_size); - - buf_info.buf_factory = std::make_unique( - res.getContentLength(), - request_uri, - http_method, - callback, - timeouts, - credentials, - settings.max_http_get_redirects, - settings.max_read_buffer_size, - read_settings, - headers, - &context->getRemoteHostFilter(), - delay_initialization, - /* use_external_buffer */ false, - /* skip_url_not_found_error */ skip_url_not_found_error); - return buf_info; - } - } - catch (const Poco::Exception & e) - { - LOG_TRACE( - &Poco::Logger::get("StorageURLSource"), - "Failed to setup ParallelReadBuffer because of an exception:\n{}.\nFalling back to the single-threaded " - "buffer", - e.displayText()); - } + res->getFileInfo(); } + catch (...) + { + if (first_exception_message.empty()) + first_exception_message = getCurrentExceptionMessage(false); - LOG_TRACE(&Poco::Logger::get("StorageURLSource"), "Using single-threaded read buffer"); + tryLogCurrentException(__PRETTY_FUNCTION__); - buf_info.buf = wrapReadBufferWithCompressionMethod( - std::make_unique( - request_uri, - http_method, - callback, - timeouts, - credentials, - settings.max_http_get_redirects, - settings.max_read_buffer_size, - read_settings, - headers, - &context->getRemoteHostFilter(), - delay_initialization, - /* use_external_buffer */ false, - /* skip_url_not_found_error */ skip_url_not_found_error), - compression_method, - zstd_window_log_max); - return buf_info; + continue; + } } - catch (...) - { - if (first_exception_message.empty()) - first_exception_message = getCurrentExceptionMessage(false); - if (options == 1) - throw; - - tryLogCurrentException(__PRETTY_FUNCTION__); - } + return res; } throw Exception(ErrorCodes::NETWORK_ERROR, "All uri ({}) options are unreachable: {}", options, first_exception_message); @@ -496,7 +365,6 @@ namespace String name; URIInfoPtr uri_info; - std::unique_ptr read_buf; std::unique_ptr pipeline; std::unique_ptr reader; @@ -691,7 +559,7 @@ ColumnsDescription IStorageURLBase::getTableStructureFromData( if (it == urls_to_check.cend()) return nullptr; - auto buf_info = StorageURLSource::getFirstAvailableURLReadBuffer( + auto buf_factory = StorageURLSource::getFirstAvailableURLReadBuffer( it, urls_to_check.cend(), context, @@ -699,16 +567,15 @@ ColumnsDescription IStorageURLBase::getTableStructureFromData( Poco::Net::HTTPRequest::HTTP_GET, {}, getHTTPTimeouts(context), - compression_method, credentials, headers, false, - false, - // this ensures buf_info.buf will be set - /* max_download_threads */ 1); - chassert(buf_info.buf); + false); ++it; - return std::move(buf_info.buf); + return wrapReadBufferWithCompressionMethod( + buf_factory->getReader(), + compression_method, + static_cast(context->getSettingsRef().zstd_window_log_max)); }; ColumnsDescription columns; diff --git a/src/Storages/System/StorageSystemFormats.cpp b/src/Storages/System/StorageSystemFormats.cpp index 464af029187..b005b725a99 100644 --- a/src/Storages/System/StorageSystemFormats.cpp +++ b/src/Storages/System/StorageSystemFormats.cpp @@ -23,9 +23,9 @@ void StorageSystemFormats::fillData(MutableColumns & res_columns, ContextPtr, co for (const auto & pair : formats) { const auto & [format_name, creators] = pair; - UInt64 has_input_format(creators.input_creator != nullptr); + UInt64 has_input_format(creators.input_creator != nullptr || creators.random_access_input_creator != nullptr); UInt64 has_output_format(creators.output_creator != nullptr); - UInt64 supports_parallel_parsing(creators.file_segmentation_engine != nullptr || creators.multistream_input_creator != nullptr); + UInt64 supports_parallel_parsing(creators.file_segmentation_engine != nullptr || creators.random_access_input_creator != nullptr); UInt64 supports_parallel_formatting(creators.supports_parallel_formatting); res_columns[0]->insert(format_name); diff --git a/tests/queries/0_stateless/01455_opentelemetry_distributed.reference b/tests/queries/0_stateless/01455_opentelemetry_distributed.reference index 9343593e1ba..0729dd7b881 100644 --- a/tests/queries/0_stateless/01455_opentelemetry_distributed.reference +++ b/tests/queries/0_stateless/01455_opentelemetry_distributed.reference @@ -12,12 +12,10 @@ {"query":"select * from url('http:\/\/127.0.0.2:8123\/?query=select%201%20format%20Null', CSV, 'a int')","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} {"query":"select 1 format Null\n","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} {"query":"select 1 format Null\n","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} -{"query":"select 1 format Null\n","status":"QueryFinish","tracestate":"another custom state","sorted_by_start_time":1} -{"query":"select 1 format Null\n","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} {"query":"select 1 format Null\n","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} {"query":"select 1 format Null\n","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} {"query":"select * from url('http:\/\/127.0.0.2:8123\/?query=select%201%20format%20Null', CSV, 'a int')","query_status":"QueryFinish","tracestate":"another custom state","sorted_by_finish_time":1} -{"total spans":"4","unique spans":"4","unique non-zero parent spans":"4"} +{"total spans":"3","unique spans":"3","unique non-zero parent spans":"3"} {"initial query spans with proper parent":"1"} {"unique non-empty tracestate values":"1"} ===sampled=== diff --git a/tests/queries/0_stateless/02205_HTTP_user_agent.python b/tests/queries/0_stateless/02205_HTTP_user_agent.python index 5787ae186ab..d8f8a32b6db 100644 --- a/tests/queries/0_stateless/02205_HTTP_user_agent.python +++ b/tests/queries/0_stateless/02205_HTTP_user_agent.python @@ -143,7 +143,7 @@ def test_select(): def main(): # HEAD + GET - t = start_server(3) + t = start_server(2) t.start() test_select() t.join() From 473f212c8264b902e02d4afec61712655daa2ba9 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Wed, 12 Apr 2023 01:36:25 +0000 Subject: [PATCH 247/535] Hopefully fix assertion failure in CachedOnDiskReadBufferFromFile --- .../IO/CachedOnDiskReadBufferFromFile.cpp | 62 +++++++++++++++---- src/IO/ReadBuffer.h | 8 ++- src/IO/ReadSettings.h | 4 +- src/Interpreters/Cache/FileCache.h | 2 +- src/Interpreters/Cache/FileSegment.cpp | 35 ++++++++--- src/Interpreters/Cache/FileSegment.h | 7 ++- src/Storages/StorageS3.cpp | 2 - 7 files changed, 91 insertions(+), 29 deletions(-) diff --git a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp index 77358dc3d7e..b3c1d591c4d 100644 --- a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp +++ b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp @@ -151,6 +151,11 @@ CachedOnDiskReadBufferFromFile::getCacheReadBuffer(const FileSegment & file_segm /// Do not allow to use asynchronous version of LocalFSReadMethod. local_read_settings.local_fs_method = LocalFSReadMethod::pread; + // The buffer will unnecessarily allocate a Memory of size local_fs_buffer_size, which will then + // most likely be unused because we're swap()ping our own internal_buffer into + // implementation_buffer before each read. But we can't just set local_fs_buffer_size = 0 here + // because some buffer implementations actually use that memory (e.g. for prefetching). + auto buf = createReadBufferFromFileBase(path, local_read_settings); if (getFileSizeFromReadBuffer(*buf) == 0) @@ -176,7 +181,7 @@ CachedOnDiskReadBufferFromFile::getRemoteFSReadBuffer(FileSegment & file_segment * [___________] -- read_range_1 for query1 * [_______________] -- read_range_2 for query2 * ^___________^______^ - * | segment1 | segment2 + * | segment1 | segment2 * * So query2 can reuse implementation buffer, which downloaded segment1. * Implementation buffer from segment1 is passed to segment2 once segment1 is loaded. @@ -195,6 +200,10 @@ CachedOnDiskReadBufferFromFile::getRemoteFSReadBuffer(FileSegment & file_segment file_segment.setRemoteFileReader(remote_fs_segment_reader); } + else + { + chassert(remote_fs_segment_reader->getFileOffsetOfBufferEnd() == file_segment.getCurrentWriteOffset()); + } return remote_fs_segment_reader; } @@ -447,8 +456,7 @@ CachedOnDiskReadBufferFromFile::getImplementationBuffer(FileSegmentPtr & file_se { read_buffer_for_file_segment->seek(file_offset_of_buffer_end, SEEK_SET); - assert(static_cast(read_buffer_for_file_segment->getPosition()) == file_offset_of_buffer_end); - assert(static_cast(read_buffer_for_file_segment->getFileOffsetOfBufferEnd()) == file_offset_of_buffer_end); + assert(read_buffer_for_file_segment->getFileOffsetOfBufferEnd() == file_offset_of_buffer_end); } auto current_write_offset = file_segment->getCurrentWriteOffset(); @@ -456,11 +464,12 @@ CachedOnDiskReadBufferFromFile::getImplementationBuffer(FileSegmentPtr & file_se { throw Exception( ErrorCodes::LOGICAL_ERROR, - "Buffer's offsets mismatch. Cached buffer offset: {}, current_write_offset: {}, implementation buffer offset: {}, file " - "segment info: {}", + "Buffer's offsets mismatch. Cached buffer offset: {}, current_write_offset: {}, implementation buffer position: {}, " + "implementation buffer end position: {}, file segment info: {}", file_offset_of_buffer_end, current_write_offset, read_buffer_for_file_segment->getPosition(), + read_buffer_for_file_segment->getFileOffsetOfBufferEnd(), file_segment->getInfoForLog()); } @@ -468,6 +477,8 @@ CachedOnDiskReadBufferFromFile::getImplementationBuffer(FileSegmentPtr & file_se } } + chassert(!read_buffer_for_file_segment->hasPendingData()); + return read_buffer_for_file_segment; } @@ -537,7 +548,7 @@ void CachedOnDiskReadBufferFromFile::predownload(FileSegmentPtr & file_segment) /// download from offset a'' < a', but return buffer from offset a'. LOG_TEST(log, "Bytes to predownload: {}, caller_id: {}", bytes_to_predownload, FileSegment::getCallerId()); - chassert(implementation_buffer->getFileOffsetOfBufferEnd() == file_segment->getCurrentWriteOffset()); + chassert(static_cast(implementation_buffer->getPosition()) == file_segment->getCurrentWriteOffset()); size_t current_offset = file_segment->getCurrentWriteOffset(); const auto & current_range = file_segment->range(); @@ -794,6 +805,7 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() if (current_file_segment_it == file_segments_holder->file_segments.end()) return false; + bool implementation_buffer_can_be_reused = false; SCOPE_EXIT({ try { @@ -810,7 +822,12 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() { bool need_complete_file_segment = file_segment->isDownloader(); if (need_complete_file_segment) + { + if (!implementation_buffer_can_be_reused) + file_segment->resetRemoteFileReader(); + file_segment->completePartAndResetDownloader(); + } } chassert(!file_segment->isDownloader()); @@ -839,6 +856,10 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() chassert(!internal_buffer.empty()); + // Pass a valid external buffer for implementation_buffer to read into. + // We then take it back with another swap() after reading is done. + // (If we get an exception in between, we'll be left with an invalid internal_buffer. That's ok, as long as + // the caller doesn't try to use this CachedOnDiskReadBufferFromFile after it threw an exception.) swap(*implementation_buffer); auto & file_segment = *current_file_segment_it; @@ -846,9 +867,10 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() LOG_TEST( log, - "Current count: {}, position: {}, file segment: {}", + "Current count: {}, position: {}, buffer end: {}, file segment: {}", implementation_buffer->count(), implementation_buffer->getPosition(), + implementation_buffer->getFileOffsetOfBufferEnd(), file_segment->getInfoForLog()); chassert(current_read_range.left <= file_offset_of_buffer_end); @@ -905,13 +927,16 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() auto elapsed = watch.elapsedMicroseconds(); current_file_segment_counters.increment(ProfileEvents::FileSegmentReadMicroseconds, elapsed); + // We don't support implementation_buffer implementations that use nextimpl_working_buffer_offset. + chassert(implementation_buffer->position() == implementation_buffer->buffer().begin()); + size = implementation_buffer->buffer().size(); LOG_TEST( log, - "Read {} bytes, read type {}, position: {}, offset: {}", + "Read {} bytes, read type {}, position: {}, offset: {}, segment end: {}", size, toString(read_type), implementation_buffer->getPosition(), - implementation_buffer->getFileOffsetOfBufferEnd()); + implementation_buffer->getFileOffsetOfBufferEnd(), file_segment->range().right); if (read_type == ReadType::CACHED) { @@ -945,6 +970,12 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() || file_segment->getCurrentWriteOffset() == implementation_buffer->getFileOffsetOfBufferEnd()); LOG_TEST(log, "Successfully written {} bytes", size); + + // The implementation_buffer is valid and positioned correctly (at file_segment->getCurrentWriteOffset()). + // Later reads for this file segment can reuse it. + // (It's reusable even if we don't reach the swap(*implementation_buffer) below, + // because the reuser must assign implementation_buffer's buffer anyway.) + implementation_buffer_can_be_reused = true; } else { @@ -981,12 +1012,15 @@ bool CachedOnDiskReadBufferFromFile::nextImplStep() } file_offset_of_buffer_end += size; + + chassert(file_offset_of_buffer_end <= read_until_position); } swap(*implementation_buffer); current_file_segment_counters.increment(ProfileEvents::FileSegmentUsedBytes, available()); + // No necessary because of the SCOPE_EXIT above, but useful for logging below. if (download_current_segment) file_segment->completePartAndResetDownloader(); @@ -1119,6 +1153,8 @@ off_t CachedOnDiskReadBufferFromFile::seek(off_t offset, int whence) implementation_buffer.reset(); initialized = false; + LOG_TEST(log, "Reset state for seek to position {}", new_pos); + return new_pos; } @@ -1153,6 +1189,8 @@ void CachedOnDiskReadBufferFromFile::setReadUntilPosition(size_t position) initialized = false; read_until_position = position; + + LOG_TEST(log, "Set read_until_position to {}", read_until_position); } void CachedOnDiskReadBufferFromFile::setReadUntilEnd() @@ -1197,11 +1235,13 @@ String CachedOnDiskReadBufferFromFile::getInfoForLog() current_file_segment_info = "None"; return fmt::format( - "Buffer path: {}, hash key: {}, file_offset_of_buffer_end: {}, " - "read_type: {}, last caller: {}, file segment info: {}", + "Buffer path: {}, hash key: {}, file_offset_of_buffer_end: {}, read_until_position: {}, " + "internal buffer end: {}, read_type: {}, last caller: {}, file segment info: {}", source_file_path, getHexUIntLowercase(cache_key), file_offset_of_buffer_end, + read_until_position, + implementation_buffer ? std::to_string(implementation_buffer->getFileOffsetOfBufferEnd()) : "None", toString(read_type), last_caller_id, current_file_segment_info); diff --git a/src/IO/ReadBuffer.h b/src/IO/ReadBuffer.h index 2950e16bfbb..1a8222001a9 100644 --- a/src/IO/ReadBuffer.h +++ b/src/IO/ReadBuffer.h @@ -54,8 +54,12 @@ public: // FIXME: behavior differs greately from `BufferBase::set()` and it's very confusing. void set(Position ptr, size_t size) { BufferBase::set(ptr, size, 0); working_buffer.resize(0); } - /** read next data and fill a buffer with it; set position to the beginning; - * return `false` in case of end, `true` otherwise; throw an exception, if something is wrong + /** read next data and fill a buffer with it; set position to the beginning of the new data + * (but not necessarily to the beginning of working_buffer!); + * return `false` in case of end, `true` otherwise; throw an exception, if something is wrong; + * + * if an exception was thrown, is the ReadBuffer left in a usable state? this varies across implementations; + * can the caller retry next() after an exception, or call other methods? not recommended */ bool next() { diff --git a/src/IO/ReadSettings.h b/src/IO/ReadSettings.h index 8c676b2d00b..7d44b0b7ad1 100644 --- a/src/IO/ReadSettings.h +++ b/src/IO/ReadSettings.h @@ -125,8 +125,8 @@ struct ReadSettings ReadSettings adjustBufferSize(size_t file_size) const { ReadSettings res = *this; - res.local_fs_buffer_size = std::min(file_size, local_fs_buffer_size); - res.remote_fs_buffer_size = std::min(file_size, remote_fs_buffer_size); + res.local_fs_buffer_size = std::min(std::max(1ul, file_size), local_fs_buffer_size); + res.remote_fs_buffer_size = std::min(std::max(1ul, file_size), remote_fs_buffer_size); return res; } }; diff --git a/src/Interpreters/Cache/FileCache.h b/src/Interpreters/Cache/FileCache.h index c80e707d42d..83435b67562 100644 --- a/src/Interpreters/Cache/FileCache.h +++ b/src/Interpreters/Cache/FileCache.h @@ -55,7 +55,7 @@ public: * Segments in returned list are ordered in ascending order and represent a full contiguous * interval (no holes). Each segment in returned list has state: DOWNLOADED, DOWNLOADING or EMPTY. * - * As long as pointers to returned file segments are hold + * As long as pointers to returned file segments are held * it is guaranteed that these file segments are not removed from cache. */ FileSegmentsHolder getOrSet(const Key & key, size_t offset, size_t size, const CreateFileSegmentSettings & settings); diff --git a/src/Interpreters/Cache/FileSegment.cpp b/src/Interpreters/Cache/FileSegment.cpp index 8122d7a168e..4a11ade5b42 100644 --- a/src/Interpreters/Cache/FileSegment.cpp +++ b/src/Interpreters/Cache/FileSegment.cpp @@ -228,7 +228,7 @@ void FileSegment::assertIsDownloaderUnlocked(const std::string & operation, std: { auto caller = getCallerId(); auto current_downloader = getDownloaderUnlocked(segment_lock); - LOG_TEST(log, "Downloader id: {}, caller id: {}", current_downloader, caller); + LOG_TEST(log, "Downloader id: {}, caller id: {}, operation: {}", current_downloader, caller, operation); if (caller != current_downloader) { @@ -289,9 +289,6 @@ void FileSegment::resetRemoteFileReader() std::unique_lock segment_lock(mutex); assertIsDownloaderUnlocked("resetRemoteFileReader", segment_lock); - if (!remote_file_reader) - throw Exception(ErrorCodes::LOGICAL_ERROR, "Remote file reader does not exist"); - remote_file_reader.reset(); } @@ -358,7 +355,21 @@ void FileSegment::write(const char * from, size_t size, size_t offset) throw Exception(ErrorCodes::LOGICAL_ERROR, "Cache writer was detached"); auto download_path = getPathInLocalCache(); - cache_writer = std::make_unique(download_path); + + try + { + cache_writer = std::make_unique(download_path); + } + catch (Exception & e) + { + wrapWithCacheInfo(e, "while opening file in local cache", segment_lock); + + setDownloadFailedUnlocked(segment_lock); + + cv.notify_all(); + + throw; + } } } @@ -498,7 +509,7 @@ void FileSegment::setDownloadedUnlocked([[maybe_unused]] std::unique_lock & segment_lock) { - LOG_INFO(log, "Settings download as failed: {}", getInfoForLogUnlocked(segment_lock)); + LOG_INFO(log, "Setting download as failed: {}", getInfoForLogUnlocked(segment_lock)); setDownloadState(State::PARTIALLY_DOWNLOADED_NO_CONTINUATION); resetDownloaderUnlocked(segment_lock); @@ -507,8 +518,9 @@ void FileSegment::setDownloadFailedUnlocked(std::unique_lock & segme { cache_writer->finalize(); cache_writer.reset(); - remote_file_reader.reset(); } + + remote_file_reader.reset(); } void FileSegment::completePartAndResetDownloader() @@ -591,10 +603,13 @@ void FileSegment::completeBasedOnCurrentState(std::lock_guard & cach resetDownloaderUnlocked(segment_lock); } - if (cache_writer && (is_downloader || is_last_holder)) + if (is_downloader || is_last_holder) { - cache_writer->finalize(); - cache_writer.reset(); + if (cache_writer) + { + cache_writer->finalize(); + cache_writer.reset(); + } remote_file_reader.reset(); } diff --git a/src/Interpreters/Cache/FileSegment.h b/src/Interpreters/Cache/FileSegment.h index c6d9f90cbee..44bc5662c40 100644 --- a/src/Interpreters/Cache/FileSegment.h +++ b/src/Interpreters/Cache/FileSegment.h @@ -221,7 +221,7 @@ public: * ========== Methods for _only_ file segment's `downloader` ================== */ - /// Try to reserve exactly `size` bytes. + /// Try to reserve exactly `size` bytes (in addition to the getDownloadedSize() bytes already downloaded). /// Returns true if reservation was successful, false otherwise. bool reserve(size_t size_to_reserve); @@ -243,6 +243,11 @@ public: void resetDownloader(); + // Invariant: if state() != DOWNLOADING and remote file reader is present, the reader's + // available() == 0, and getFileOffsetOfBufferEnd() == our getCurrentWriteOffset(). + // + // The reader typically requires its internal_buffer to be assigned from the outside before + // calling next(). RemoteFileReaderPtr getRemoteFileReader(); RemoteFileReaderPtr extractRemoteFileReader(); diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index 55bf1b36c1e..b4ca8f18b40 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -639,8 +639,6 @@ StorageS3Source::ReadBufferOrFactory StorageS3Source::createS3ReadBuffer(const S return {.buf = createAsyncS3ReadBuffer(key, read_settings, object_size)}; } - chassert(object_size > 0); - auto factory = std::make_unique( client, bucket, key, version_id, object_size, request_settings, read_settings); return {.buf_factory = std::move(factory)}; From bd426a7d6d99f473c8e2c1f9cc1e0d498b4c7460 Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Mon, 17 Apr 2023 04:57:17 +0000 Subject: [PATCH 248/535] Unbreak reading from web servers that don't support HEAD requests --- src/IO/ReadWriteBufferFromHTTP.h | 20 ++++++++++++++++++- src/IO/SeekableReadBuffer.h | 33 ++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/IO/ReadWriteBufferFromHTTP.h b/src/IO/ReadWriteBufferFromHTTP.h index f9f98b21388..8629a0a3349 100644 --- a/src/IO/ReadWriteBufferFromHTTP.h +++ b/src/IO/ReadWriteBufferFromHTTP.h @@ -91,6 +91,7 @@ namespace detail class ReadWriteBufferFromHTTPBase : public SeekableReadBuffer, public WithFileName, public WithFileSize { public: + /// Information from HTTP response header. struct FileInfo { // nullopt if the server doesn't report it. @@ -796,7 +797,24 @@ namespace detail FileInfo getFileInfo() { Poco::Net::HTTPResponse response; - getHeadResponse(response); + try + { + getHeadResponse(response); + } + catch (HTTPException & e) + { + /// Maybe the web server doesn't support HEAD requests. + /// E.g. webhdfs reports status 400. + /// We should proceed in hopes that the actual GET request will succeed. + /// (Unless the error in transient. Don't want to nondeterministically sometimes + /// fall back to slow whole-file reads when HEAD is actually supported; that sounds + /// like a nightmare to debug.) + if (e.getHTTPStatus() >= 400 && e.getHTTPStatus() <= 499 && + e.getHTTPStatus() != Poco::Net::HTTPResponse::HTTP_TOO_MANY_REQUESTS) + return FileInfo{}; + + throw; + } return parseFileInfo(response, 0); } diff --git a/src/IO/SeekableReadBuffer.h b/src/IO/SeekableReadBuffer.h index efbafff03e2..b055aa57975 100644 --- a/src/IO/SeekableReadBuffer.h +++ b/src/IO/SeekableReadBuffer.h @@ -46,25 +46,34 @@ public: virtual size_t getFileOffsetOfBufferEnd() const { throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Method getFileOffsetOfBufferEnd() not implemented"); } - // If true, setReadUntilPosition() guarantees that eof will be reported at the given position. + /// If true, setReadUntilPosition() guarantees that eof will be reported at the given position. virtual bool supportsRightBoundedReads() const { return false; } virtual bool isIntegratedWithFilesystemCache() const { return false; } - // Returns true if seek() actually works, false if seek() will always throw (or make subsequent - // nextImpl() calls throw). - // - // This is needed because: - // * Sometimes there's no cheap way to know in advance whether the buffer is really seekable. - // Specifically, HTTP read buffer needs to send a request to check whether the server - // supports byte ranges. - // * Sometimes when we create such buffer we don't know in advance whether we'll need it to be - // seekable or not. So we don't want to pay the price for this check in advance. + /// Returns true if seek() actually works, false if seek() will always throw (or make subsequent + /// nextImpl() calls throw). + /// + /// This is needed because: + /// * Sometimes there's no cheap way to know in advance whether the buffer is really seekable. + /// Specifically, HTTP read buffer needs to send a request to check whether the server + /// supports byte ranges. + /// * Sometimes when we create such buffer we don't know in advance whether we'll need it to be + /// seekable or not. So we don't want to pay the price for this check in advance. virtual bool checkIfActuallySeekable() { return true; } }; -// Useful for reading in parallel. -// The created read buffers may outlive the factory. +/// Useful for reading in parallel. +/// The created read buffers may outlive the factory. +/// +/// There are 2 ways to use this: +/// (1) Never call seek() or getFileSize(), read the file sequentially. +/// For HTTP, this usually translates to just one HTTP request. +/// (2) Call checkIfActuallySeekable(), then: +/// a. If it returned false, go to (1). seek() and getFileSize() are not available (throw if called). +/// b. If it returned true, seek() and getFileSize() are available, knock yourself out. +/// For HTTP, checkIfActuallySeekable() sends a HEAD request and returns false if the web server +/// doesn't support ranges (or doesn't support HEAD requests). class SeekableReadBufferFactory : public WithFileSize { public: From 9ea4a55ddf23d9bc73c731919aa03753d8f00674 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Fri, 17 Mar 2023 12:51:46 +0100 Subject: [PATCH 249/535] Add a test for stringstream with INT_MAX Signed-off-by: Azat Khuzhin --- src/IO/tests/gtest_stringstream.cpp | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/IO/tests/gtest_stringstream.cpp diff --git a/src/IO/tests/gtest_stringstream.cpp b/src/IO/tests/gtest_stringstream.cpp new file mode 100644 index 00000000000..c4352740695 --- /dev/null +++ b/src/IO/tests/gtest_stringstream.cpp @@ -0,0 +1,37 @@ +#include + +#include +#include + +// There are few places where stringstream is used to pass data to some 3d +// party code. +// +// And there was problems with feeding > INT_MAX to stringstream in libc++, +// this is the regression test for it. +// +// Since that places in Clickhouse can operate on buffers > INT_MAX (i.e. +// WriteBufferFromS3), so it is better to have a test for this in ClickHouse +// too. +TEST(stringstream, INTMAX) +{ + std::stringstream ss; + ss.exceptions(std::ios::badbit); + + std::string payload(1<<20, 'A'); + + // write up to INT_MAX-1MiB + for (size_t i = 0; i < (2ULL<<30) - payload.size(); i += payload.size()) + { + ASSERT_NE(ss.tellp(), -1); + ss.write(payload.data(), payload.size()); + // std::cerr << "i: " << ss.tellp()/1024/1024 << " MB\n"; + } + + ASSERT_NE(ss.tellp(), -1); + // write up to INT_MAX + ss.write(payload.data(), payload.size()); + + ASSERT_NE(ss.tellp(), -1); + // write one more 1MiB chunk + ss.write(payload.data(), payload.size()); +} From 91713325a205e77c7114e824b284d11edb6981dc Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Fri, 17 Mar 2023 15:19:21 +0100 Subject: [PATCH 250/535] Add a test with S3 single part upload that exceeds INT_MAX Signed-off-by: Azat Khuzhin --- .../queries/0_stateless/02700_s3_part_INT_MAX.reference | 1 + tests/queries/0_stateless/02700_s3_part_INT_MAX.sql | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/queries/0_stateless/02700_s3_part_INT_MAX.reference create mode 100644 tests/queries/0_stateless/02700_s3_part_INT_MAX.sql diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference b/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference new file mode 100644 index 00000000000..f6662c006b7 --- /dev/null +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference @@ -0,0 +1 @@ +3145728 diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql new file mode 100644 index 00000000000..b86a804ef76 --- /dev/null +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql @@ -0,0 +1,9 @@ +-- Tags: no-parallel, long + +-- Regression test for crash in case of part exceeds INT_MAX +INSERT INTO FUNCTION s3('http://localhost:11111/test/test_INT_MAX.tsv', '', '', 'TSV') +-- NOTE: 2GiB is enough, but let's use 3GiB, just in case. +SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 3) / 1024) +SETTINGS s3_truncate_on_insert = 1, s3_max_single_part_upload_size = '10Gi'; + +SELECT count() FROM s3('http://localhost:11111/test/test_INT_MAX.tsv'); From 8dcee4c48214aeed22a65ca40f23831728749eaa Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 20 Mar 2023 18:08:16 +0200 Subject: [PATCH 251/535] Decrease part size in 02700_s3_part_INT_MAX Seems that the IO is too slow [1]. [1]: https://s3.amazonaws.com/clickhouse-test-reports/47693/6d869e3b0d3e439260eb54c32e3fa99acecae063/stateless_tests_flaky_check__asan_.html Signed-off-by: Azat Khuzhin --- tests/queries/0_stateless/02700_s3_part_INT_MAX.reference | 2 +- tests/queries/0_stateless/02700_s3_part_INT_MAX.sql | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference b/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference index f6662c006b7..8425fb4df60 100644 --- a/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.reference @@ -1 +1 @@ -3145728 +2097152 diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql index b86a804ef76..739aa845d23 100644 --- a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql @@ -2,8 +2,7 @@ -- Regression test for crash in case of part exceeds INT_MAX INSERT INTO FUNCTION s3('http://localhost:11111/test/test_INT_MAX.tsv', '', '', 'TSV') --- NOTE: 2GiB is enough, but let's use 3GiB, just in case. -SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 3) / 1024) +SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 2) / 1024) SETTINGS s3_truncate_on_insert = 1, s3_max_single_part_upload_size = '10Gi'; SELECT count() FROM s3('http://localhost:11111/test/test_INT_MAX.tsv'); From f55f33b64dc37257c93e1ced4c5e157f20daeec2 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Tue, 21 Mar 2023 08:54:05 +0200 Subject: [PATCH 252/535] Avoid using s3_truncate_on_insert in 02700_s3_part_INT_MAX Seems that version of MinIO that is used on CI is too slow for this [1], I've tried the same locally with RELEASE.2023-02-10T18-48-39Z and everythings works OK, but I have NVME locally and more recent MinIO. [1]: https://s3.amazonaws.com/clickhouse-test-reports/47693/5c701b090c3ec10cb2a4a708b60d364eb02192fe/stateless_tests_flaky_check__asan_.html Signed-off-by: Azat Khuzhin --- .../0_stateless/02700_s3_part_INT_MAX.sh | 19 +++++++++++++++++++ .../0_stateless/02700_s3_part_INT_MAX.sql | 8 -------- 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100755 tests/queries/0_stateless/02700_s3_part_INT_MAX.sh delete mode 100644 tests/queries/0_stateless/02700_s3_part_INT_MAX.sql diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh new file mode 100755 index 00000000000..d831c7d9806 --- /dev/null +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Tags: no-parallel, long + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Regression test for crash in case of part exceeds INT_MAX +# +# NOTE: .sh test is used over .sql because it needs $CLICKHOUSE_DATABASE to +# avoid truncation, since seems that the version of MinIO that is used on CI +# too slow with this. +$CLICKHOUSE_CLIENT -nm -q " + INSERT INTO FUNCTION s3('http://localhost:11111/test/$CLICKHOUSE_DATABASE/test_INT_MAX.tsv', '', '', 'TSV') + SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 2) / 1024) + SETTINGS s3_max_single_part_upload_size = '10Gi'; + + SELECT count() FROM s3('http://localhost:11111/test/$CLICKHOUSE_DATABASE/test_INT_MAX.tsv'); +" diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql deleted file mode 100644 index 739aa845d23..00000000000 --- a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Tags: no-parallel, long - --- Regression test for crash in case of part exceeds INT_MAX -INSERT INTO FUNCTION s3('http://localhost:11111/test/test_INT_MAX.tsv', '', '', 'TSV') -SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 2) / 1024) -SETTINGS s3_truncate_on_insert = 1, s3_max_single_part_upload_size = '10Gi'; - -SELECT count() FROM s3('http://localhost:11111/test/test_INT_MAX.tsv'); From f5c3f3a4ab0a2210d86a0f95f9577b450b1fcb5a Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 17 Apr 2023 10:49:11 +0200 Subject: [PATCH 253/535] Remove quirk for s3_max_single_part_upload_size (when it exceed INT_MAX) Reverts: #48816 Signed-off-by: Azat Khuzhin --- src/Storages/StorageS3Settings.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Storages/StorageS3Settings.cpp b/src/Storages/StorageS3Settings.cpp index d58e043a149..17a11ba9848 100644 --- a/src/Storages/StorageS3Settings.cpp +++ b/src/Storages/StorageS3Settings.cpp @@ -77,12 +77,6 @@ void S3Settings::RequestSettings::PartUploadSettings::updateFromSettingsImpl(con if (!if_changed || settings.s3_max_single_part_upload_size.changed) max_single_part_upload_size = settings.s3_max_single_part_upload_size; - - /// AWS S3 SDK library has a bug. It is using std::*stream (which is a major offense). - /// LLVM libc++ has a bug. It does not allow std::*stream to work for large strings. - - if (max_single_part_upload_size >= 2_GiB) - throw Exception(ErrorCodes::INVALID_SETTING_VALUE, "Uploading parts of 2 GiB or larger is not supported due to a bug in AWS and LLVM. Lower the value of `s3_max_single_part_upload_size` setting."); } void S3Settings::RequestSettings::PartUploadSettings::validate() From fff6062c7b36eb9abd42746fb22b9282461898e5 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Mon, 17 Apr 2023 10:47:51 +0200 Subject: [PATCH 254/535] Update llvm to fix std::stringstream for payload > INT_MAX Refs: https://reviews.llvm.org/D146294 Refs: https://github.com/ClickHouse/llvm-project/pull/9 Refs: https://github.com/ClickHouse/llvm-project/pull/16 Signed-off-by: Azat Khuzhin --- contrib/llvm-project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/llvm-project b/contrib/llvm-project index e0accd51793..2aedf7598a4 160000 --- a/contrib/llvm-project +++ b/contrib/llvm-project @@ -1 +1 @@ -Subproject commit e0accd517933ebb44aff84bc8db448ffd8ef1929 +Subproject commit 2aedf7598a4040b23881dbe05b6afaca25a337ef From db71bbb08da0832d1f08bbdad62c6379944c85ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Mon, 17 Apr 2023 10:59:40 +0200 Subject: [PATCH 255/535] Fix examples build --- src/Interpreters/examples/string_hash_map.cpp | 2 +- src/Interpreters/examples/string_hash_set.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Interpreters/examples/string_hash_map.cpp b/src/Interpreters/examples/string_hash_map.cpp index 15df8c399de..f55ed983fbc 100644 --- a/src/Interpreters/examples/string_hash_map.cpp +++ b/src/Interpreters/examples/string_hash_map.cpp @@ -156,7 +156,7 @@ void NO_INLINE bench(const std::vector & data, DB::Arena &, const cha } watch.stop(); - std::cerr << "arena-memory " << pool.size() + map.getBufferSizeInBytes() << std::endl; + std::cerr << "arena-memory " << pool.allocatedBytes() + map.getBufferSizeInBytes() << std::endl; std::cerr << "single-run " << std::setprecision(3) << watch.elapsedSeconds() << std::endl; } diff --git a/src/Interpreters/examples/string_hash_set.cpp b/src/Interpreters/examples/string_hash_set.cpp index 355789e97ec..527ada1579d 100644 --- a/src/Interpreters/examples/string_hash_set.cpp +++ b/src/Interpreters/examples/string_hash_set.cpp @@ -34,7 +34,7 @@ void NO_INLINE bench(const std::vector & data, DB::Arena & pool, cons } watch.stop(); - std::cerr << "arena-memory " << pool.size() + set.getBufferSizeInBytes() << std::endl; + std::cerr << "arena-memory " << pool.allocatedBytes() + set.getBufferSizeInBytes() << std::endl; std::cerr << "single-run " << std::setprecision(3) << watch.elapsedSeconds() << std::endl; } From 4e15b66f4c835d7d7213773b19b625b728225fff Mon Sep 17 00:00:00 2001 From: Kseniia Sumarokova <54203879+kssenii@users.noreply.github.com> Date: Mon, 17 Apr 2023 11:21:16 +0200 Subject: [PATCH 256/535] Fix test --- tests/queries/0_stateless/02344_describe_cache.reference | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/02344_describe_cache.reference b/tests/queries/0_stateless/02344_describe_cache.reference index d3bb37af5cf..c98e9d263ca 100644 --- a/tests/queries/0_stateless/02344_describe_cache.reference +++ b/tests/queries/0_stateless/02344_describe_cache.reference @@ -1,2 +1,2 @@ -2147483648 1048576 104857600 1 0 0 0 s3_cache/ 0 -2147483648 1048576 104857600 0 0 0 0 s3_cache_2/ 0 +2147483648 1048576 104857600 1 0 0 0 /var/lib/clickhouse/caches/s3_cache/ 0 +2147483648 1048576 104857600 0 0 0 0 /var/lib/clickhouse/caches/s3_cache_2/ 0 From 9bddda6a6e2bb0666f8dc4d6a93d581ed6e131d4 Mon Sep 17 00:00:00 2001 From: Yatsishin Ilya <2159081+qoega@users.noreply.github.com> Date: Mon, 17 Apr 2023 09:56:32 +0000 Subject: [PATCH 257/535] move clickhouse-su to clickhouse-server packager --- packages/clickhouse-common-static.yaml | 2 -- packages/clickhouse-server.yaml | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/clickhouse-common-static.yaml b/packages/clickhouse-common-static.yaml index 9f37745c14b..abdce11f788 100644 --- a/packages/clickhouse-common-static.yaml +++ b/packages/clickhouse-common-static.yaml @@ -43,8 +43,6 @@ contents: dst: /usr/bin/clickhouse-odbc-bridge - src: root/usr/bin/clickhouse-static-files-disk-uploader dst: /usr/bin/clickhouse-static-files-disk-uploader -- src: root/usr/bin/clickhouse-su - dst: /usr/bin/clickhouse-su - src: root/usr/share/bash-completion/completions dst: /usr/share/bash-completion/completions # docs diff --git a/packages/clickhouse-server.yaml b/packages/clickhouse-server.yaml index 018e88ef828..0d5a71a2c6e 100644 --- a/packages/clickhouse-server.yaml +++ b/packages/clickhouse-server.yaml @@ -59,6 +59,8 @@ contents: dst: /usr/bin/clickhouse-report - src: root/usr/bin/clickhouse-server dst: /usr/bin/clickhouse-server +- src: root/usr/bin/clickhouse-su + dst: /usr/bin/clickhouse-su # docs - src: ../AUTHORS dst: /usr/share/doc/clickhouse-server/AUTHORS From 4370abf3c483ce3d20913684f26c7549e70887ac Mon Sep 17 00:00:00 2001 From: serxa Date: Mon, 17 Apr 2023 10:33:59 +0000 Subject: [PATCH 258/535] Try fix flacky test_concurrent_alter_move_and_drop --- tests/integration/test_multiple_disks/test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/test_multiple_disks/test.py b/tests/integration/test_multiple_disks/test.py index 221d830f62e..6f2bee3edd7 100644 --- a/tests/integration/test_multiple_disks/test.py +++ b/tests/integration/test_multiple_disks/test.py @@ -1262,13 +1262,13 @@ def test_concurrent_alter_move_and_drop(start_cluster, name, engine): else: raise e - insert(100) + insert(20) p = Pool(15) tasks = [] for i in range(5): - tasks.append(p.apply_async(insert, (100,))) - tasks.append(p.apply_async(alter_move, (100,))) - tasks.append(p.apply_async(alter_drop, (100,))) + tasks.append(p.apply_async(insert, (20,))) + tasks.append(p.apply_async(alter_move, (20,))) + tasks.append(p.apply_async(alter_drop, (20,))) for task in tasks: task.get(timeout=120) From daa55ae0d2e4e37e153afb6dd480c87cca6ea1b4 Mon Sep 17 00:00:00 2001 From: Sema Checherinda Date: Mon, 17 Apr 2023 13:01:28 +0200 Subject: [PATCH 259/535] fix the race wait loading parts --- src/Storages/MergeTree/MergeTreeData.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 45759c449f6..f5f12660223 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -1870,8 +1870,7 @@ try if (outdated_unloaded_data_parts.empty()) break; - part = std::move(outdated_unloaded_data_parts.back()); - outdated_unloaded_data_parts.pop_back(); + part = outdated_unloaded_data_parts.back(); } auto res = loadDataPartWithRetries( @@ -1886,6 +1885,15 @@ try res.part->remove(); else preparePartForRemoval(res.part); + + { + std::lock_guard lock(outdated_data_parts_mutex); + chassert(part == outdated_unloaded_data_parts.back()); + outdated_unloaded_data_parts.pop_back(); + + if (outdated_unloaded_data_parts.empty()) + break; + } } LOG_DEBUG(log, "Loaded {} outdated data parts {}", From 97d27c87a6b5f47807fcbb846860645ad2e10af3 Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Mon, 17 Apr 2023 15:58:21 +0800 Subject: [PATCH 260/535] Fix key condition on duplicate primary keys Fix key condition usage when encountering duplicate primary keys. This can happen in projections. This bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/45686. This PR is also an optimization because we don't need to create unused FieldRefs anymore. --- src/Storages/MergeTree/KeyCondition.cpp | 33 +++---- src/Storages/MergeTree/KeyCondition.h | 8 +- .../MergeTree/MergeTreeDataSelectExecutor.cpp | 26 ++--- .../02540_duplicate_primary_key.sql | 16 +-- .../02540_duplicate_primary_key2.reference | 1 + .../02540_duplicate_primary_key2.sql | 99 +++++++++++++++++++ 6 files changed, 142 insertions(+), 41 deletions(-) create mode 100644 tests/queries/0_stateless/02540_duplicate_primary_key2.reference create mode 100644 tests/queries/0_stateless/02540_duplicate_primary_key2.sql diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index 5c71804ef27..5d961425469 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -743,9 +743,16 @@ KeyCondition::KeyCondition( , single_point(single_point_) , strict(strict_) { + size_t key_index = 0; for (const auto & name : key_column_names) + { if (!key_columns.contains(name)) + { key_columns[name] = key_columns.size(); + key_indices.push_back(key_index); + } + ++key_index; + } auto filter_node = buildFilterNode(query, additional_filter_asts); @@ -808,9 +815,16 @@ KeyCondition::KeyCondition( , single_point(single_point_) , strict(strict_) { + size_t key_index = 0; for (const auto & name : key_column_names) + { if (!key_columns.contains(name)) + { key_columns[name] = key_columns.size(); + key_indices.push_back(key_index); + } + ++key_index; + } if (!filter_dag) { @@ -2561,25 +2575,6 @@ bool KeyCondition::alwaysFalse() const return rpn_stack[0] == 0; } -size_t KeyCondition::getMaxKeyColumn() const -{ - size_t res = 0; - for (const auto & element : rpn) - { - if (element.function == RPNElement::FUNCTION_NOT_IN_RANGE - || element.function == RPNElement::FUNCTION_IN_RANGE - || element.function == RPNElement::FUNCTION_IS_NULL - || element.function == RPNElement::FUNCTION_IS_NOT_NULL - || element.function == RPNElement::FUNCTION_IN_SET - || element.function == RPNElement::FUNCTION_NOT_IN_SET) - { - if (element.key_column > res) - res = element.key_column; - } - } - return res; -} - bool KeyCondition::hasMonotonicFunctionsChain() const { for (const auto & element : rpn) diff --git a/src/Storages/MergeTree/KeyCondition.h b/src/Storages/MergeTree/KeyCondition.h index 0a4ac93b082..f29ace57e32 100644 --- a/src/Storages/MergeTree/KeyCondition.h +++ b/src/Storages/MergeTree/KeyCondition.h @@ -286,9 +286,6 @@ public: bool alwaysFalse() const; - /// Get the maximum number of the key element used in the condition. - size_t getMaxKeyColumn() const; - bool hasMonotonicFunctionsChain() const; /// Impose an additional condition: the value in the column `column` must be in the range `range`. @@ -297,6 +294,9 @@ public: String toString() const; + /// Get the key indices of key names used in the condition. + const std::vector & getKeyIndices() const { return key_indices; } + /// Condition description for EXPLAIN query. struct Description { @@ -478,6 +478,8 @@ private: RPN rpn; ColumnIndices key_columns; + std::vector key_indices; + /// Expression which is used for key condition. const ExpressionActionsPtr key_expr; /// All intermediate columns are used to calculate key_expr. diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index 2039912106c..22df8f298c4 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -1430,18 +1430,21 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( return res; } - size_t used_key_size = key_condition.getMaxKeyColumn() + 1; - const String & part_name = part->isProjectionPart() ? fmt::format("{}.{}", part->name, part->getParentPart()->name) : part->name; + const auto & primary_key = metadata_snapshot->getPrimaryKey(); + auto index_columns = std::make_shared(); + const auto & key_indices = key_condition.getKeyIndices(); + DataTypes key_types; + for (size_t i : key_indices) + { + index_columns->emplace_back(ColumnWithTypeAndName{index[i], primary_key.data_types[i], primary_key.column_names[i]}); + key_types.emplace_back(primary_key.data_types[i]); + } - std::function create_field_ref; /// If there are no monotonic functions, there is no need to save block reference. /// Passing explicit field to FieldRef allows to optimize ranges and shows better performance. - const auto & primary_key = metadata_snapshot->getPrimaryKey(); + std::function create_field_ref; if (key_condition.hasMonotonicFunctionsChain()) { - auto index_columns = std::make_shared(); - for (size_t i = 0; i < used_key_size; ++i) - index_columns->emplace_back(ColumnWithTypeAndName{index[i], primary_key.data_types[i], primary_key.column_names[i]}); create_field_ref = [index_columns](size_t row, size_t column, FieldRef & field) { @@ -1453,9 +1456,9 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( } else { - create_field_ref = [&index](size_t row, size_t column, FieldRef & field) + create_field_ref = [index_columns](size_t row, size_t column, FieldRef & field) { - index[column]->get(row, field); + (*index_columns)[column].column->get(row, field); // NULL_LAST if (field.isNull()) field = POSITIVE_INFINITY; @@ -1463,6 +1466,7 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( } /// NOTE Creating temporary Field objects to pass to KeyCondition. + size_t used_key_size = key_indices.size(); std::vector index_left(used_key_size); std::vector index_right(used_key_size); @@ -1487,10 +1491,10 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange( create_field_ref(range.end, i, index_right[i]); } } - return key_condition.mayBeTrueInRange( - used_key_size, index_left.data(), index_right.data(), primary_key.data_types); + return key_condition.mayBeTrueInRange(used_key_size, index_left.data(), index_right.data(), key_types); }; + const String & part_name = part->isProjectionPart() ? fmt::format("{}.{}", part->name, part->getParentPart()->name) : part->name; if (!key_condition.matchesExactContinuousRange()) { // Do exclusion search, where we drop ranges that do not match diff --git a/tests/queries/0_stateless/02540_duplicate_primary_key.sql b/tests/queries/0_stateless/02540_duplicate_primary_key.sql index 322b6d74845..a084d76964b 100644 --- a/tests/queries/0_stateless/02540_duplicate_primary_key.sql +++ b/tests/queries/0_stateless/02540_duplicate_primary_key.sql @@ -90,16 +90,16 @@ ORDER BY (coverage, situation_name, NAME_toe, NAME_cockroach); insert into test select * from generateRandom() limit 10; -with dissonance as ( - Select cast(toStartOfInterval(coverage, INTERVAL 1 day) as Date) as flour, count() as regulation +with dissonance as ( + Select cast(toStartOfInterval(coverage, INTERVAL 1 day) as Date) as flour, count() as regulation from test - group by flour having flour >= toDate(now())-100 + group by flour having flour >= toDate(now())-100 ), -cheetah as ( - Select flour, regulation from dissonance - union distinct - Select toDate(now())-1, ifnull((select regulation from dissonance where flour = toDate(now())-1),0) as regulation -) +cheetah as ( + Select flour, regulation from dissonance + union distinct + Select toDate(now())-1, ifnull((select regulation from dissonance where flour = toDate(now())-1),0) as regulation +) Select flour, regulation from cheetah order by flour with fill step 1 limit 100 format Null; drop table test; diff --git a/tests/queries/0_stateless/02540_duplicate_primary_key2.reference b/tests/queries/0_stateless/02540_duplicate_primary_key2.reference new file mode 100644 index 00000000000..08839f6bb29 --- /dev/null +++ b/tests/queries/0_stateless/02540_duplicate_primary_key2.reference @@ -0,0 +1 @@ +200 diff --git a/tests/queries/0_stateless/02540_duplicate_primary_key2.sql b/tests/queries/0_stateless/02540_duplicate_primary_key2.sql new file mode 100644 index 00000000000..d0f02a894f2 --- /dev/null +++ b/tests/queries/0_stateless/02540_duplicate_primary_key2.sql @@ -0,0 +1,99 @@ +drop table if exists test; + +set allow_suspicious_low_cardinality_types = 1; + +CREATE TABLE test +( + `timestamp` DateTime, + `latitude` Nullable(Float32) CODEC(Gorilla, ZSTD(1)), + `longitude` Nullable(Float32) CODEC(Gorilla, ZSTD(1)), + `xxxx1` LowCardinality(UInt8), + `xxxx2` LowCardinality(Nullable(Int16)), + `xxxx3` LowCardinality(Nullable(Int16)), + `xxxx4` Nullable(Int32), + `xxxx5` LowCardinality(Nullable(Int32)), + `xxxx6` Nullable(Int32), + `xxxx7` Nullable(Int32), + `xxxx8` LowCardinality(Int32), + `xxxx9` LowCardinality(Nullable(Int16)), + `xxxx10` LowCardinality(Nullable(Int16)), + `xxxx11` LowCardinality(Nullable(Int16)), + `xxxx12` LowCardinality(String), + `xxxx13` Nullable(Float32), + `xxxx14` LowCardinality(String), + `xxxx15` LowCardinality(Nullable(String)), + `xxxx16` LowCardinality(String), + `xxxx17` LowCardinality(String), + `xxxx18` FixedString(19), + `xxxx19` FixedString(17), + `xxxx20` LowCardinality(UInt8), + `xxxx21` LowCardinality(Nullable(Int16)), + `xxxx22` LowCardinality(Nullable(Int16)), + `xxxx23` LowCardinality(Nullable(Int16)), + `xxxx24` LowCardinality(Nullable(Int16)), + `xxxx25` LowCardinality(Nullable(Int16)), + `xxxx26` LowCardinality(Nullable(Int16)), + `xxxx27` Nullable(Float32), + `xxxx28` LowCardinality(Nullable(String)), + `xxxx29` LowCardinality(String), + `xxxx30` LowCardinality(String), + `xxxx31` LowCardinality(Nullable(String)), + `xxxx32` UInt64, + PROJECTION cumsum_projection_simple + ( + SELECT + xxxx1, + toStartOfInterval(timestamp, toIntervalMonth(1)), + toStartOfWeek(timestamp, 8), + toStartOfInterval(timestamp, toIntervalDay(1)), + xxxx17, + xxxx16, + xxxx14, + xxxx9, + xxxx10, + xxxx21, + xxxx22, + xxxx11, + sum(multiIf(xxxx21 IS NULL, 0, 1)), + sum(multiIf(xxxx22 IS NULL, 0, 1)), + sum(multiIf(xxxx23 IS NULL, 0, 1)), + max(toStartOfInterval(timestamp, toIntervalDay(1))), + max(CAST(CAST(toStartOfInterval(timestamp, toIntervalDay(1)), 'Nullable(DATE)'), 'Nullable(TIMESTAMP)')), + min(toStartOfInterval(timestamp, toIntervalDay(1))), + min(CAST(CAST(toStartOfInterval(timestamp, toIntervalDay(1)), 'Nullable(DATE)'), 'Nullable(TIMESTAMP)')), + count(), + sum(1), + COUNTDistinct(xxxx16), + COUNTDistinct(xxxx31), + COUNTDistinct(xxxx14), + COUNTDistinct(CAST(toStartOfInterval(timestamp, toIntervalDay(1)), 'Nullable(DATE)')) + GROUP BY + xxxx1, + toStartOfInterval(timestamp, toIntervalMonth(1)), + toStartOfWeek(timestamp, 8), + toStartOfInterval(timestamp, toIntervalDay(1)), + xxxx1, + toStartOfInterval(timestamp, toIntervalMonth(1)), + toStartOfWeek(timestamp, 8), + toStartOfInterval(timestamp, toIntervalDay(1)), + xxxx17, + xxxx16, + xxxx14, + xxxx9, + xxxx10, + xxxx21, + xxxx22, + xxxx11 + ) +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(timestamp) +ORDER BY (xxxx17, xxxx14, xxxx16, toStartOfDay(timestamp), left(xxxx19, 10), timestamp); + +INSERT INTO test SELECT * replace 1 as xxxx16 replace 1 as xxxx1 replace '2022-02-02 01:00:00' as timestamp replace 'Airtel' as xxxx14 FROM generateRandom() LIMIT 100; +INSERT INTO test SELECT * replace 1 as xxxx16 replace 1 as xxxx1 replace '2022-02-02 01:00:00' as timestamp replace 'BSNL' as xxxx14 FROM generateRandom() LIMIT 100; +INSERT INTO test SELECT * replace 1 as xxxx16 replace 1 as xxxx1 replace '2022-02-02 01:00:00' as timestamp replace 'xxx' as xxxx14 FROM generateRandom() LIMIT 100; + +select sum(1) from test where toStartOfInterval(timestamp, INTERVAL 1 day) >= TIMESTAMP '2022-02-01 01:00:00' and xxxx14 in ('Airtel', 'BSNL') and xxxx1 = 1 GROUP BY xxxx16; + +drop table test; From 0b6235426118806da9116d1eac5e30e66c6d6b9e Mon Sep 17 00:00:00 2001 From: kssenii Date: Mon, 17 Apr 2023 13:30:51 +0200 Subject: [PATCH 261/535] Fix data race, refactor --- src/Storages/RabbitMQ/RabbitMQConsumer.cpp | 140 +++++++++++---------- src/Storages/RabbitMQ/RabbitMQConsumer.h | 68 +++++----- src/Storages/RabbitMQ/RabbitMQSource.cpp | 30 ++--- src/Storages/RabbitMQ/RabbitMQSource.h | 2 + src/Storages/RabbitMQ/StorageRabbitMQ.cpp | 46 ++----- src/Storages/RabbitMQ/StorageRabbitMQ.h | 4 +- 6 files changed, 135 insertions(+), 155 deletions(-) diff --git a/src/Storages/RabbitMQ/RabbitMQConsumer.cpp b/src/Storages/RabbitMQ/RabbitMQConsumer.cpp index 65063e004a5..f6facc04212 100644 --- a/src/Storages/RabbitMQ/RabbitMQConsumer.cpp +++ b/src/Storages/RabbitMQ/RabbitMQConsumer.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "Poco/Timer.h" @@ -34,7 +35,7 @@ RabbitMQConsumer::RabbitMQConsumer( { } -void RabbitMQConsumer::shutdown() +void RabbitMQConsumer::stop() { stopped = true; cv.notify_one(); @@ -53,10 +54,9 @@ void RabbitMQConsumer::subscribe() consumer_channel->consume(queue_name) .onSuccess([&](const std::string & /* consumer_tag */) { - LOG_TRACE(log, "Consumer on channel {} is subscribed to queue {}", channel_id, queue_name); - - if (++subscribed == queues.size()) - wait_subscription.store(false); + LOG_TRACE( + log, "Consumer on channel {} ({}/{}) is subscribed to queue {}", + channel_id, subscriptions_num, queues.size(), queue_name); }) .onReceived([&](const AMQP::Message & message, uint64_t delivery_tag, bool redelivered) { @@ -64,9 +64,15 @@ void RabbitMQConsumer::subscribe() { String message_received = std::string(message.body(), message.body() + message.bodySize()); - if (!received.push({message_received, message.hasMessageID() ? message.messageID() : "", - message.hasTimestamp() ? message.timestamp() : 0, - redelivered, AckTracker(delivery_tag, channel_id)})) + MessageData result{ + .message = message_received, + .message_id = message.hasMessageID() ? message.messageID() : "", + .timestamp = message.hasTimestamp() ? message.timestamp() : 0, + .redelivered = redelivered, + .delivery_tag = delivery_tag, + .channel_id = channel_id}; + + if (!received.push(std::move(result))) throw Exception(ErrorCodes::LOGICAL_ERROR, "Could not push to received queue"); cv.notify_one(); @@ -74,98 +80,100 @@ void RabbitMQConsumer::subscribe() }) .onError([&](const char * message) { - /* End up here either if channel ends up in an error state (then there will be resubscription) or consume call error, which - * arises from queue settings mismatch or queue level error, which should not happen as no one else is supposed to touch them + /* End up here either if channel ends up in an error state (then there will be resubscription) + * or consume call error, which arises from queue settings mismatch or queue level error, + * which should not happen as no one else is supposed to touch them */ LOG_ERROR(log, "Consumer failed on channel {}. Reason: {}", channel_id, message); - wait_subscription.store(false); + state = State::ERROR; }); } } -bool RabbitMQConsumer::ackMessages() +bool RabbitMQConsumer::ackMessages(const CommitInfo & commit_info) { - AckTracker record_info = last_inserted_record_info; + if (state != State::OK) + return false; - /* Do not send ack to server if message's channel is not the same as current running channel because delivery tags are scoped per - * channel, so if channel fails, all previous delivery tags become invalid - */ - if (record_info.channel_id == channel_id && record_info.delivery_tag && record_info.delivery_tag > prev_tag) + /// Nothing to ack. + if (!commit_info.delivery_tag) + return false; + + /// Do not send ack to server if message's channel is not the same as + /// current running channel because delivery tags are scoped per channel, + /// so if channel fails, all previous delivery tags become invalid. + if (commit_info.channel_id != channel_id) + return false; + + /// Duplicate ack? + if (commit_info.delivery_tag > last_commited_delivery_tag + && consumer_channel->ack(commit_info.delivery_tag, AMQP::multiple)) { - /// Commit all received messages with delivery tags from last committed to last inserted - if (!consumer_channel->ack(record_info.delivery_tag, AMQP::multiple)) - { - LOG_ERROR(log, "Failed to commit messages with delivery tags from last committed to {} on channel {}", - record_info.delivery_tag, channel_id); - return false; - } + last_commited_delivery_tag = commit_info.delivery_tag; - prev_tag = record_info.delivery_tag; - LOG_TRACE(log, "Consumer committed messages with deliveryTags up to {} on channel {}", record_info.delivery_tag, channel_id); + LOG_TRACE( + log, "Consumer committed messages with deliveryTags up to {} on channel {}", + last_commited_delivery_tag, channel_id); + + return true; } - return true; + LOG_ERROR( + log, + "Did not commit messages for {}:{}, (current commit point {}:{})", + commit_info.channel_id, commit_info.delivery_tag, + channel_id, last_commited_delivery_tag); + + return false; } -void RabbitMQConsumer::updateAckTracker(AckTracker record_info) +void RabbitMQConsumer::updateChannel(RabbitMQConnection & connection) { - if (record_info.delivery_tag && channel_error.load()) - return; - - if (!record_info.delivery_tag) - prev_tag = 0; - - last_inserted_record_info = record_info; -} - - -void RabbitMQConsumer::setupChannel() -{ - if (!consumer_channel) - return; - - wait_subscription.store(true); + state = State::INITIALIZING; + last_commited_delivery_tag = 0; + consumer_channel = connection.createChannel(); consumer_channel->onReady([&]() { - /* First number indicates current consumer buffer; second number indicates serial number of created channel for current buffer, - * i.e. if channel fails - another one is created and its serial number is incremented; channel_base is to guarantee that - * channel_id is unique for each table - */ - channel_id = std::to_string(channel_id_base) + "_" + std::to_string(channel_id_counter++) + "_" + channel_base; - LOG_TRACE(log, "Channel {} is created", channel_id); + try + { + /// 1. channel_id_base - indicates current consumer buffer. + /// 2. channel_id_couner - indicates serial number of created channel for current buffer + /// (incremented on each channel update). + /// 3. channel_base is to guarantee that channel_id is unique for each table. + channel_id = fmt::format("{}_{}_{}", channel_id_base, channel_id_counter++, channel_base); - subscribed = 0; - subscribe(); - channel_error.store(false); + LOG_TRACE(log, "Channel {} is successfully created", channel_id); + + subscriptions_num = 0; + subscribe(); + + state = State::OK; + } + catch (...) + { + state = State::ERROR; + tryLogCurrentException(__PRETTY_FUNCTION__); + } }); consumer_channel->onError([&](const char * message) { - LOG_ERROR(log, "Channel {} error: {}", channel_id, message); - - channel_error.store(true); - wait_subscription.store(false); + LOG_ERROR(log, "Channel {} in an error state: {}", channel_id, message); + state = State::ERROR; }); } bool RabbitMQConsumer::needChannelUpdate() { - if (wait_subscription) - return false; - - return channel_error || !consumer_channel || !consumer_channel->usable(); + chassert(consumer_channel); + return state == State::ERROR; } -void RabbitMQConsumer::iterateEventLoop() -{ - event_handler.iterateLoop(); -} - ReadBufferPtr RabbitMQConsumer::consume() { if (stopped || !received.tryPop(current)) diff --git a/src/Storages/RabbitMQ/RabbitMQConsumer.h b/src/Storages/RabbitMQ/RabbitMQConsumer.h index c7adb856212..89dfa060eec 100644 --- a/src/Storages/RabbitMQ/RabbitMQConsumer.h +++ b/src/Storages/RabbitMQ/RabbitMQConsumer.h @@ -19,6 +19,7 @@ namespace DB { class RabbitMQHandler; +class RabbitMQConnection; using ChannelPtr = std::unique_ptr; static constexpr auto SANITY_TIMEOUT = 1000 * 60 * 10; /// 10min. @@ -27,55 +28,44 @@ class RabbitMQConsumer public: RabbitMQConsumer( - RabbitMQHandler & event_handler_, - std::vector & queues_, - size_t channel_id_base_, - const String & channel_base_, - Poco::Logger * log_, - uint32_t queue_size_); + RabbitMQHandler & event_handler_, + std::vector & queues_, + size_t channel_id_base_, + const String & channel_base_, + Poco::Logger * log_, + uint32_t queue_size_); - struct AckTracker + struct CommitInfo { - UInt64 delivery_tag; + UInt64 delivery_tag = 0; String channel_id; - - AckTracker() = default; - AckTracker(UInt64 tag, String id) : delivery_tag(tag), channel_id(id) {} }; struct MessageData { String message; String message_id; - uint64_t timestamp = 0; + UInt64 timestamp = 0; bool redelivered = false; - AckTracker track{}; + UInt64 delivery_tag = 0; + String channel_id; }; + const MessageData & currentMessage() { return current; } /// Return read buffer containing next available message /// or nullptr if there are no messages to process. ReadBufferPtr consume(); - ChannelPtr & getChannel() { return consumer_channel; } - void setupChannel(); bool needChannelUpdate(); - void shutdown(); - - void updateQueues(std::vector & queues_) { queues = queues_; } - size_t queuesCount() { return queues.size(); } + void updateChannel(RabbitMQConnection & connection); + void stop(); bool isConsumerStopped() const { return stopped.load(); } - bool ackMessages(); - void updateAckTracker(AckTracker record = AckTracker()); + + bool ackMessages(const CommitInfo & commit_info); bool hasPendingMessages() { return !received.empty(); } - auto getChannelID() const { return current.track.channel_id; } - auto getDeliveryTag() const { return current.track.delivery_tag; } - auto getRedelivered() const { return current.redelivered; } - auto getMessageID() const { return current.message_id; } - auto getTimestamp() const { return current.timestamp; } - void waitForMessages(std::optional timeout_ms = std::nullopt) { std::unique_lock lock(mutex); @@ -88,24 +78,36 @@ public: private: void subscribe(); - void iterateEventLoop(); + bool isChannelUsable(); + void updateCommitInfo(CommitInfo record); ChannelPtr consumer_channel; RabbitMQHandler & event_handler; /// Used concurrently, but is thread safe. - std::vector queues; + + const std::vector queues; const String channel_base; const size_t channel_id_base; + Poco::Logger * log; std::atomic stopped; String channel_id; - std::atomic channel_error = true, wait_subscription = false; + UInt64 channel_id_counter = 0; + + enum class State + { + NONE, + INITIALIZING, + OK, + ERROR, + }; + std::atomic state = State::NONE; + size_t subscriptions_num = 0; + ConcurrentBoundedQueue received; MessageData current; - size_t subscribed = 0; - AckTracker last_inserted_record_info; - UInt64 prev_tag = 0, channel_id_counter = 0; + UInt64 last_commited_delivery_tag; std::condition_variable cv; std::mutex mutex; diff --git a/src/Storages/RabbitMQ/RabbitMQSource.cpp b/src/Storages/RabbitMQ/RabbitMQSource.cpp index d755dff3202..7194683f3fc 100644 --- a/src/Storages/RabbitMQ/RabbitMQSource.cpp +++ b/src/Storages/RabbitMQ/RabbitMQSource.cpp @@ -99,10 +99,7 @@ void RabbitMQSource::updateChannel() if (!consumer) return; - consumer->updateAckTracker(); - - if (storage.updateChannel(consumer->getChannel())) - consumer->setupChannel(); + consumer->updateChannel(storage.getConnection()); } Chunk RabbitMQSource::generate() @@ -137,6 +134,7 @@ Chunk RabbitMQSource::generateImpl() StreamingFormatExecutor executor(non_virtual_header, input_format); size_t total_rows = 0; + RabbitMQConsumer::CommitInfo current_commit_info; while (true) { size_t new_rows = 0; @@ -149,26 +147,21 @@ Chunk RabbitMQSource::generateImpl() if (new_rows) { - auto exchange_name = storage.getExchange(); - auto channel_id = consumer->getChannelID(); - auto delivery_tag = consumer->getDeliveryTag(); - auto redelivered = consumer->getRedelivered(); - auto message_id = consumer->getMessageID(); - auto timestamp = consumer->getTimestamp(); - - consumer->updateAckTracker({delivery_tag, channel_id}); + const auto exchange_name = storage.getExchange(); + const auto & message = consumer->currentMessage(); for (size_t i = 0; i < new_rows; ++i) { virtual_columns[0]->insert(exchange_name); - virtual_columns[1]->insert(channel_id); - virtual_columns[2]->insert(delivery_tag); - virtual_columns[3]->insert(redelivered); - virtual_columns[4]->insert(message_id); - virtual_columns[5]->insert(timestamp); + virtual_columns[1]->insert(message.channel_id); + virtual_columns[2]->insert(message.delivery_tag); + virtual_columns[3]->insert(message.redelivered); + virtual_columns[4]->insert(message.message_id); + virtual_columns[5]->insert(message.timestamp); } total_rows += new_rows; + current_commit_info = {message.delivery_tag, message.channel_id}; } else if (total_rows == 0) { @@ -210,6 +203,7 @@ Chunk RabbitMQSource::generateImpl() for (auto & column : virtual_columns) result_columns.push_back(std::move(column)); + commit_info = current_commit_info; return Chunk(std::move(result_columns), total_rows); } @@ -219,7 +213,7 @@ bool RabbitMQSource::sendAck() if (!consumer) return false; - if (!consumer->ackMessages()) + if (!consumer->ackMessages(commit_info)) return false; return true; diff --git a/src/Storages/RabbitMQ/RabbitMQSource.h b/src/Storages/RabbitMQ/RabbitMQSource.h index 5d2d8b25630..fd78e326038 100644 --- a/src/Storages/RabbitMQ/RabbitMQSource.h +++ b/src/Storages/RabbitMQ/RabbitMQSource.h @@ -51,6 +51,8 @@ private: uint64_t max_execution_time_ms = 0; Stopwatch total_stopwatch {CLOCK_MONOTONIC_COARSE}; + RabbitMQConsumer::CommitInfo commit_info; + RabbitMQSource( StorageRabbitMQ & storage_, const StorageSnapshotPtr & storage_snapshot_, diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp index 7999d4af71a..7d3a205c722 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp @@ -371,6 +371,14 @@ void StorageRabbitMQ::initRabbitMQ() for (const auto i : collections::range(0, num_queues)) bindQueue(i + 1, *rabbit_channel); + if (queues.size() != num_queues) + { + throw Exception( + ErrorCodes::LOGICAL_ERROR, + "Expected all queues to be initialized (but having {}/{})", + queues.size(), num_queues); + } + LOG_TRACE(log, "RabbitMQ setup completed"); rabbit_is_ready = true; rabbit_channel->close(); @@ -593,35 +601,6 @@ void StorageRabbitMQ::bindQueue(size_t queue_id, AMQP::TcpChannel & rabbit_chann } -bool StorageRabbitMQ::updateChannel(ChannelPtr & channel) -{ - try - { - channel = connection->createChannel(); - return true; - } - catch (...) - { - tryLogCurrentException(log); - return false; - } -} - - -void StorageRabbitMQ::prepareChannelForConsumer(RabbitMQConsumerPtr consumer) -{ - if (!consumer) - return; - - if (consumer->queuesCount() != queues.size()) - consumer->updateQueues(queues); - - consumer->updateAckTracker(); - - if (updateChannel(consumer->getChannel())) - consumer->setupChannel(); -} - void StorageRabbitMQ::unbindExchange() { /* This is needed because with RabbitMQ (without special adjustments) can't, for example, properly make mv if there was insert query @@ -820,7 +799,7 @@ void StorageRabbitMQ::shutdown() shutdown_called = true; for (auto & consumer : consumers_ref) - consumer.lock()->shutdown(); + consumer.lock()->stop(); LOG_TRACE(log, "Deactivating background tasks"); @@ -982,7 +961,7 @@ void StorageRabbitMQ::initializeBuffers() if (!initialized) { for (const auto & consumer : consumers) - prepareChannelForConsumer(consumer); + consumer->updateChannel(*connection); initialized = true; } } @@ -1144,10 +1123,7 @@ bool StorageRabbitMQ::tryStreamToViews() ++queue_empty; if (source->needChannelUpdate()) - { - auto consumer = source->getBuffer(); - prepareChannelForConsumer(consumer); - } + source->getBuffer()->updateChannel(*connection); /* false is returned by the sendAck function in only two cases: * 1) if connection failed. In this case all channels will be closed and will be unable to send ack. Also ack is made based on diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.h b/src/Storages/RabbitMQ/StorageRabbitMQ.h index c6cb340619c..a30919f2b25 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.h +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.h @@ -72,9 +72,7 @@ public: String getExchange() const { return exchange_name; } void unbindExchange(); - bool updateChannel(ChannelPtr & channel); - void updateQueues(std::vector & queues_) { queues_ = queues; } - void prepareChannelForConsumer(RabbitMQConsumerPtr consumer); + RabbitMQConnection & getConnection() { return *connection; } void incrementReader(); void decrementReader(); From 5c9b404c6eef9a81da5d001c1cb14a268289e3be Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Mon, 17 Apr 2023 14:02:07 +0200 Subject: [PATCH 262/535] Update src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> --- src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp index ce7bb98e148..19b2dcccf64 100644 --- a/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp +++ b/src/Processors/Formats/Impl/CHColumnToArrowColumn.cpp @@ -313,10 +313,7 @@ namespace DB const PaddedPODArray & mapping_data = assert_cast *>(mapping.get())->getData(); PaddedPODArray result; result.reserve(end - start); - if (shift) - std::transform(indexes_data.begin() + start, indexes_data.begin() + end, std::back_inserter(result), [&](IndexesType value) { return mapping_data[Int64(value)] - 1; }); - else - std::transform(indexes_data.begin() + start, indexes_data.begin() + end, std::back_inserter(result), [&](IndexesType value) { return mapping_data[Int64(value)]; }); + std::transform(indexes_data.begin() + start, indexes_data.begin() + end, std::back_inserter(result), [&](IndexesType value) { return mapping_data[Int64(value)] - shift; }); return result; } From 0354a964cd72d4f3f7e8405606e34708eb3166a3 Mon Sep 17 00:00:00 2001 From: Sema Checherinda Date: Mon, 17 Apr 2023 14:07:56 +0200 Subject: [PATCH 263/535] turn on all CI back --- .github/workflows/pull_request.yml | 9315 +++++++++++++-------------- docker/test/sqllogic/Dockerfile.1.2 | 43 - tests/ci/ci_config.py | 33 +- 3 files changed, 4672 insertions(+), 4719 deletions(-) delete mode 100644 docker/test/sqllogic/Dockerfile.1.2 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 32c60d9459e..782cfad43f8 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -19,9 +19,9 @@ on: # yamllint disable-line rule:truthy - 'docker/docs/**' - 'docs/**' - 'utils/check-style/aspell-ignore/**' -########################################################################################### -###################################### SMALL CHECKS ####################################### -########################################################################################### +########################################################################################## +##################################### SMALL CHECKS ####################################### +########################################################################################## jobs: CheckLabels: runs-on: [self-hosted, style-checker] @@ -143,104 +143,103 @@ jobs: docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" -# FastTest: -# needs: DockerHubPush -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/fasttest -# REPO_COPY=${{runner.temp}}/fasttest/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# EOF -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.TEMP_PATH }} -# - name: Fast Test -# run: | -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 fast_test_check.py -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# CompatibilityCheckX86: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, style-checker] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/compatibility_check -# REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse -# REPORTS_PATH=${{runner.temp}}/reports_dir -# EOF -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: CompatibilityCheckX86 -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (amd64)" --check-glibc --check-distributions -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# CompatibilityCheckAarch64: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, style-checker] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/compatibility_check -# REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse -# REPORTS_PATH=${{runner.temp}}/reports_dir -# EOF -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: CompatibilityCheckAarch64 -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (aarch64)" --check-glibc -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -########################################################################################## -##################################### ORDINARY BUILDS #################################### -########################################################################################## + FastTest: + needs: DockerHubPush + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/fasttest + REPO_COPY=${{runner.temp}}/fasttest/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + EOF + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.TEMP_PATH }} + - name: Fast Test + run: | + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 fast_test_check.py + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + CompatibilityCheckX86: + needs: [BuilderDebRelease] + runs-on: [self-hosted, style-checker] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/compatibility_check + REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse + REPORTS_PATH=${{runner.temp}}/reports_dir + EOF + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: CompatibilityCheckX86 + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (amd64)" --check-glibc --check-distributions + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + CompatibilityCheckAarch64: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, style-checker] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/compatibility_check + REPO_COPY=${{runner.temp}}/compatibility_check/ClickHouse + REPORTS_PATH=${{runner.temp}}/reports_dir + EOF + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: CompatibilityCheckAarch64 + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 compatibility_check.py --check-name "Compatibility check (aarch64)" --check-glibc + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +######################################################################################### +#################################### ORDINARY BUILDS #################################### +######################################################################################### BuilderDebRelease: - # needs: [DockerHubPush, FastTest, StyleCheck] - needs: [DockerHubPush] + needs: [DockerHubPush, FastTest, StyleCheck] runs-on: [self-hosted, builder] steps: - name: Set envs @@ -281,4572 +280,4572 @@ jobs: docker ps --quiet | xargs --no-run-if-empty docker kill ||: docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" -# BuilderBinRelease: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_release -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebAarch64: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_aarch64 -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ runner.temp }}/images_path -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# fetch-depth: 0 # for performance artifact -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebAsan: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_asan -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebUBsan: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_ubsan -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebTsan: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_tsan -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebMsan: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_msan -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderDebDebug: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=package_debug -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Apply sparse checkout for contrib # in order to check that it doesn't break build -# run: | -# rm -rf "$GITHUB_WORKSPACE/contrib" && echo 'removed' -# git -C "$GITHUB_WORKSPACE" checkout . && echo 'restored' -# "$GITHUB_WORKSPACE/contrib/update-submodules.sh" && echo 'OK' -# du -hs "$GITHUB_WORKSPACE/contrib" ||: -# find "$GITHUB_WORKSPACE/contrib" -type f | wc -l ||: -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -########################################################################################### -###################################### SPECIAL BUILDS ##################################### -########################################################################################### -# BuilderBinClangTidy: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_tidy -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinDarwin: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_darwin -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinAarch64: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_aarch64 -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinFreeBSD: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_freebsd -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinDarwinAarch64: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_darwin_aarch64 -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinPPC64: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_ppc64le -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinAmd64Compat: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_amd64_compat -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" -# BuilderBinAarch64V80Compat: -# needs: [DockerHubPush, FastTest, StyleCheck] -# runs-on: [self-hosted, builder] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/build_check -# IMAGES_PATH=${{runner.temp}}/images_path -# REPO_COPY=${{runner.temp}}/build_check/ClickHouse -# CACHES_PATH=${{runner.temp}}/../ccaches -# BUILD_NAME=binary_aarch64_v80compat -# EOF -# - name: Download changed images -# uses: actions/download-artifact@v3 -# with: -# name: changed_images -# path: ${{ env.IMAGES_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# submodules: true -# - name: Build -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" -# - name: Upload build URLs to artifacts -# if: ${{ success() || failure() }} -# uses: actions/upload-artifact@v3 -# with: -# name: ${{ env.BUILD_URLS }} -# path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinRelease: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_release + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebAarch64: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_aarch64 + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ runner.temp }}/images_path + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + fetch-depth: 0 # for performance artifact + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebAsan: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_asan + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebUBsan: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_ubsan + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebTsan: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_tsan + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebMsan: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_msan + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderDebDebug: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=package_debug + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Apply sparse checkout for contrib # in order to check that it doesn't break build + run: | + rm -rf "$GITHUB_WORKSPACE/contrib" && echo 'removed' + git -C "$GITHUB_WORKSPACE" checkout . && echo 'restored' + "$GITHUB_WORKSPACE/contrib/update-submodules.sh" && echo 'OK' + du -hs "$GITHUB_WORKSPACE/contrib" ||: + find "$GITHUB_WORKSPACE/contrib" -type f | wc -l ||: + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +########################################################################################## +##################################### SPECIAL BUILDS ##################################### +########################################################################################## + BuilderBinClangTidy: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_tidy + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwin: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAarch64: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_aarch64 + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinFreeBSD: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_freebsd + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwinAarch64: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin_aarch64 + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinPPC64: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_ppc64le + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAmd64Compat: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_amd64_compat + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAarch64V80Compat: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_aarch64_v80compat + EOF + - name: Download changed images + uses: actions/download-artifact@v3 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + submodules: true + - name: Build + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" +############################################################################################ +##################################### Docker images ####################################### +############################################################################################ + DockerServerImages: + needs: + - BuilderDebRelease + - BuilderDebAarch64 + runs-on: [self-hosted, style-checker] + steps: + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + fetch-depth: 0 # It MUST BE THE SAME for all dependencies and the job itself + - name: Check docker clickhouse/clickhouse-server building + run: | + cd "$GITHUB_WORKSPACE/tests/ci" + python3 docker_server.py --release-type head --no-push \ + --image-repo clickhouse/clickhouse-server --image-path docker/server + python3 docker_server.py --release-type head --no-push \ + --image-repo clickhouse/clickhouse-keeper --image-path docker/keeper + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################ +##################################### BUILD REPORTER ####################################### +############################################################################################ + BuilderReport: + needs: + - BuilderBinRelease + - BuilderDebAarch64 + - BuilderDebAsan + - BuilderDebDebug + - BuilderDebMsan + - BuilderDebRelease + - BuilderDebTsan + - BuilderDebUBsan + runs-on: [self-hosted, style-checker] + if: ${{ success() || failure() }} + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + CHECK_NAME=ClickHouse build check + REPORTS_PATH=${{runner.temp}}/reports_dir + TEMP_PATH=${{runner.temp}}/report_check + NEEDS_DATA_PATH=${{runner.temp}}/needs.json + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Report Builder + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cat > "$NEEDS_DATA_PATH" << 'EOF' + ${{ toJSON(needs) }} + EOF + cd "$GITHUB_WORKSPACE/tests/ci" + python3 build_report_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + BuilderSpecialReport: + needs: + - BuilderBinAarch64 + - BuilderBinDarwin + - BuilderBinDarwinAarch64 + - BuilderBinFreeBSD + - BuilderBinPPC64 + - BuilderBinAmd64Compat + - BuilderBinAarch64V80Compat + - BuilderBinClangTidy + runs-on: [self-hosted, style-checker] + if: ${{ success() || failure() }} + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/report_check + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=ClickHouse special build check + NEEDS_DATA_PATH=${{runner.temp}}/needs.json + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Report Builder + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cat > "$NEEDS_DATA_PATH" << 'EOF' + ${{ toJSON(needs) }} + EOF + cd "$GITHUB_WORKSPACE/tests/ci" + python3 build_report_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################ +#################################### INSTALL PACKAGES ###################################### +############################################################################################ + InstallPackagesTestRelease: + needs: [BuilderDebRelease] + runs-on: [self-hosted, style-checker] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/test_install + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Install packages (amd64) + REPO_COPY=${{runner.temp}}/test_install/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Test packages installation + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 install_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + InstallPackagesTestAarch64: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, style-checker-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/test_install + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Install packages (arm64) + REPO_COPY=${{runner.temp}}/test_install/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Test packages installation + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 install_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################## +########################### FUNCTIONAl STATELESS TESTS ####################################### +############################################################################################## + FunctionalStatelessTestRelease: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release) + REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse + KILL_TIMEOUT=10800 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseDatabaseReplicated0: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_database_replicated + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, DatabaseReplicated) + REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseDatabaseReplicated1: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_database_replicated + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, DatabaseReplicated) + REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseDatabaseReplicated2: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_database_replicated + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, DatabaseReplicated) + REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseDatabaseReplicated3: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_database_replicated + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, DatabaseReplicated) + REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseWideParts: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_wide_parts + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, wide parts enabled) + REPO_COPY=${{runner.temp}}/stateless_wide_parts/ClickHouse + KILL_TIMEOUT=10800 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseS3_0: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=2 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestReleaseS3_1: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (release, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=2 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug0: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug1: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug2: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug3: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug4: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Debug5: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=5 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Tsan0: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Tsan1: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Tsan2: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Tsan3: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestS3Tsan4: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan, s3 storage) + REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestAarch64: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (aarch64) + REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse + KILL_TIMEOUT=10800 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestAsan0: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (asan) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestAsan1: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (asan) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestAsan2: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (asan) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestAsan3: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (asan) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestTsan0: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan) + REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestTsan1: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan) + REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestTsan2: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan) + REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestTsan3: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan) + REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestTsan4: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (tsan) + REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestUBsan0: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (ubsan) + REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=2 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestUBsan1: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (ubsan) + REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=2 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan0: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan1: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan2: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan3: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan4: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestMsan5: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (msan) + REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=5 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestDebug0: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestDebug1: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestDebug2: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestDebug3: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestDebug4: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests (debug) + REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse + KILL_TIMEOUT=10800 + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=5 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatelessTestFlakyCheck: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateless_flaky_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateless tests flaky check (asan) + REPO_COPY=${{runner.temp}}/stateless_flaky_asan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + TestsBugfixCheck: + needs: [CheckLabels, StyleCheck] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/tests_bugfix_check + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=tests bugfix validate check + KILL_TIMEOUT=3600 + REPO_COPY=${{runner.temp}}/tests_bugfix_check/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Bugfix test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + + TEMP_PATH="${TEMP_PATH}/integration" \ + REPORTS_PATH="${REPORTS_PATH}/integration" \ + python3 integration_test_check.py "Integration $CHECK_NAME" \ + --validate-bugfix --post-commit-status=file || echo 'ignore exit code' + + TEMP_PATH="${TEMP_PATH}/stateless" \ + REPORTS_PATH="${REPORTS_PATH}/stateless" \ + python3 functional_test_check.py "Stateless $CHECK_NAME" "$KILL_TIMEOUT" \ + --validate-bugfix --post-commit-status=file || echo 'ignore exit code' + + python3 bugfix_validate_check.py "${TEMP_PATH}/stateless/functional_commit_status.tsv" "${TEMP_PATH}/integration/integration_commit_status.tsv" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################## +############################ FUNCTIONAl STATEFUL TESTS ####################################### +############################################################################################## + FunctionalStatefulTestRelease: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (release) + REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestAarch64: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (aarch64) + REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestAsan: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (asan) + REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestTsan: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (tsan) + REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestMsan: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_msan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (msan) + REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestUBsan: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (ubsan) + REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestDebug: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (debug) + REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + # Parallel replicas + FunctionalStatefulTestDebugParallelReplicas: + needs: [BuilderDebDebug] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (debug, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestUBsanParallelReplicas: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (ubsan, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestMsanParallelReplicas: + needs: [BuilderDebMsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_msan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (msan, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestTsanParallelReplicas: + needs: [BuilderDebTsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (tsan, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestAsanParallelReplicas: + needs: [BuilderDebAsan] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (asan, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + FunctionalStatefulTestReleaseParallelReplicas: + needs: [BuilderDebRelease] + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stateful_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stateful tests (release, ParallelReplicas) + REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse + KILL_TIMEOUT=3600 + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Functional test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################## +######################################### STRESS TESTS ####################################### +############################################################################################## + StressTestAsan: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stress_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stress test (asan) + REPO_COPY=${{runner.temp}}/stress_asan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Stress test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 stress_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + StressTestTsan: + needs: [BuilderDebTsan] + # func testers have 16 cores + 128 GB memory + # while stress testers have 36 cores + 72 memory + # It would be better to have something like 32 + 128, + # but such servers almost unavailable as spot instances. + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stress_thread + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stress test (tsan) + REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Stress test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 stress_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + StressTestMsan: + needs: [BuilderDebMsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stress_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stress test (msan) + REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Stress test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 stress_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + StressTestUBsan: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stress_undefined + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stress test (ubsan) + REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Stress test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 stress_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + StressTestDebug: + needs: [BuilderDebDebug] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/stress_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Stress test (debug) + REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Stress test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 stress_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + ############################################################################################## + ######################################### UPGRADE CHECK ###################################### + ############################################################################################## + UpgradeCheckAsan: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/upgrade_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Upgrade check (asan) + REPO_COPY=${{runner.temp}}/upgrade_asan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Upgrade check + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 upgrade_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UpgradeCheckTsan: + needs: [BuilderDebTsan] + # same as for stress test with tsan + runs-on: [self-hosted, func-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/upgrade_thread + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Upgrade check (tsan) + REPO_COPY=${{runner.temp}}/upgrade_thread/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Upgrade check + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 upgrade_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UpgradeCheckMsan: + needs: [BuilderDebMsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/upgrade_memory + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Upgrade check (msan) + REPO_COPY=${{runner.temp}}/upgrade_memory/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Upgrade check + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 upgrade_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UpgradeCheckDebug: + needs: [BuilderDebDebug] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/upgrade_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Upgrade check (debug) + REPO_COPY=${{runner.temp}}/upgrade_debug/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Upgrade check + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 upgrade_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################## +##################################### AST FUZZERS ############################################ +############################################################################################## + ASTFuzzerTestAsan: + needs: [BuilderDebAsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=AST fuzzer (asan) + REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Fuzzer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 ast_fuzzer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + ASTFuzzerTestTsan: + needs: [BuilderDebTsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=AST fuzzer (tsan) + REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Fuzzer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 ast_fuzzer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + ASTFuzzerTestUBSan: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=AST fuzzer (ubsan) + REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Fuzzer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 ast_fuzzer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + ASTFuzzerTestMSan: + needs: [BuilderDebMsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=AST fuzzer (msan) + REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Fuzzer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 ast_fuzzer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + ASTFuzzerTestDebug: + needs: [BuilderDebDebug] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=AST fuzzer (debug) + REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Fuzzer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 ast_fuzzer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" ############################################################################################# -###################################### Docker images ####################################### +############################# INTEGRATION TESTS ############################################# ############################################################################################# -# DockerServerImages: -# needs: -# - BuilderDebRelease -# - BuilderDebAarch64 -# runs-on: [self-hosted, style-checker] -# steps: -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# fetch-depth: 0 # It MUST BE THE SAME for all dependencies and the job itself -# - name: Check docker clickhouse/clickhouse-server building -# run: | -# cd "$GITHUB_WORKSPACE/tests/ci" -# python3 docker_server.py --release-type head --no-push \ -# --image-repo clickhouse/clickhouse-server --image-path docker/server -# python3 docker_server.py --release-type head --no-push \ -# --image-repo clickhouse/clickhouse-keeper --image-path docker/keeper -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan0: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan1: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan2: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan3: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan4: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsAsan5: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse + RUN_BY_HASH_NUM=5 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan0: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan1: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan2: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan3: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan4: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=4 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsTsan5: + needs: [BuilderDebTsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (tsan) + REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse + RUN_BY_HASH_NUM=5 + RUN_BY_HASH_TOTAL=6 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsRelease0: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (release) + REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsRelease1: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (release) + REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsRelease2: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (release) + REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsRelease3: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests (release) + REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + IntegrationTestsFlakyCheck: + needs: [BuilderDebAsan] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/integration_tests_asan_flaky_check + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Integration tests flaky check (asan) + REPO_COPY=${{runner.temp}}/integration_tests_asan_flaky_check/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Integration test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 integration_test_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" ############################################################################################# -###################################### BUILD REPORTER ####################################### +#################################### UNIT TESTS ############################################# ############################################################################################# -# BuilderReport: -# needs: -# - BuilderBinRelease -# - BuilderDebAarch64 -# - BuilderDebAsan -# - BuilderDebDebug -# - BuilderDebMsan -# - BuilderDebRelease -# - BuilderDebTsan -# - BuilderDebUBsan -# runs-on: [self-hosted, style-checker] -# if: ${{ success() || failure() }} -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# CHECK_NAME=ClickHouse build check -# REPORTS_PATH=${{runner.temp}}/reports_dir -# TEMP_PATH=${{runner.temp}}/report_check -# NEEDS_DATA_PATH=${{runner.temp}}/needs.json -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Report Builder -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cat > "$NEEDS_DATA_PATH" << 'EOF' -# ${{ toJSON(needs) }} -# EOF -# cd "$GITHUB_WORKSPACE/tests/ci" -# python3 build_report_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# BuilderSpecialReport: -# needs: -# - BuilderBinAarch64 -# - BuilderBinDarwin -# - BuilderBinDarwinAarch64 -# - BuilderBinFreeBSD -# - BuilderBinPPC64 -# - BuilderBinAmd64Compat -# - BuilderBinAarch64V80Compat -# - BuilderBinClangTidy -# runs-on: [self-hosted, style-checker] -# if: ${{ success() || failure() }} -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/report_check -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=ClickHouse special build check -# NEEDS_DATA_PATH=${{runner.temp}}/needs.json -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Report Builder -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cat > "$NEEDS_DATA_PATH" << 'EOF' -# ${{ toJSON(needs) }} -# EOF -# cd "$GITHUB_WORKSPACE/tests/ci" -# python3 build_report_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" + UnitTestsAsan: + needs: [BuilderDebAsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/unit_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Unit tests (asan) + REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Unit test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 unit_tests_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UnitTestsReleaseClang: + needs: [BuilderBinRelease] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/unit_tests_asan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Unit tests (release-clang) + REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Unit test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 unit_tests_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UnitTestsTsan: + needs: [BuilderDebTsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/unit_tests_tsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Unit tests (tsan) + REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Unit test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 unit_tests_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UnitTestsMsan: + needs: [BuilderDebMsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/unit_tests_msan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Unit tests (msan) + REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Unit test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 unit_tests_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + UnitTestsUBsan: + needs: [BuilderDebUBsan] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/unit_tests_ubsan + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Unit tests (ubsan) + REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Unit test + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 unit_tests_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" ############################################################################################# -##################################### INSTALL PACKAGES ###################################### +#################################### PERFORMANCE TESTS ###################################### ############################################################################################# -# InstallPackagesTestRelease: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, style-checker] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/test_install -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Install packages (amd64) -# REPO_COPY=${{runner.temp}}/test_install/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Test packages installation -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 install_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# InstallPackagesTestAarch64: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, style-checker-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/test_install -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Install packages (arm64) -# REPO_COPY=${{runner.temp}}/test_install/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Test packages installation -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 install_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################### -############################ FUNCTIONAl STATELESS TESTS ####################################### -############################################################################################### -# FunctionalStatelessTestRelease: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release) -# REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse -# KILL_TIMEOUT=10800 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseDatabaseReplicated0: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_database_replicated -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, DatabaseReplicated) -# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseDatabaseReplicated1: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_database_replicated -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, DatabaseReplicated) -# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseDatabaseReplicated2: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_database_replicated -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, DatabaseReplicated) -# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseDatabaseReplicated3: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_database_replicated -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, DatabaseReplicated) -# REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseWideParts: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_wide_parts -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, wide parts enabled) -# REPO_COPY=${{runner.temp}}/stateless_wide_parts/ClickHouse -# KILL_TIMEOUT=10800 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseS3_0: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=2 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestReleaseS3_1: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (release, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=2 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug0: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug1: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug2: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug3: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug4: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Debug5: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=5 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Tsan0: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Tsan1: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Tsan2: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Tsan3: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestS3Tsan4: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_s3_storage_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan, s3 storage) -# REPO_COPY=${{runner.temp}}/stateless_s3_storage_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestAarch64: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (aarch64) -# REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse -# KILL_TIMEOUT=10800 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestAsan0: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (asan) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestAsan1: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (asan) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestAsan2: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (asan) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestAsan3: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (asan) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestTsan0: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan) -# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestTsan1: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan) -# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestTsan2: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan) -# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestTsan3: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan) -# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestTsan4: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (tsan) -# REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestUBsan0: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (ubsan) -# REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=2 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestUBsan1: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (ubsan) -# REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=2 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan0: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan1: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan2: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan3: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan4: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestMsan5: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (msan) -# REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=5 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestDebug0: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestDebug1: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestDebug2: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestDebug3: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestDebug4: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests (debug) -# REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse -# KILL_TIMEOUT=10800 -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=5 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatelessTestFlakyCheck: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateless_flaky_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateless tests flaky check (asan) -# REPO_COPY=${{runner.temp}}/stateless_flaky_asan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# TestsBugfixCheck: -# needs: [CheckLabels, StyleCheck] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/tests_bugfix_check -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=tests bugfix validate check -# KILL_TIMEOUT=3600 -# REPO_COPY=${{runner.temp}}/tests_bugfix_check/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Bugfix test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# -# TEMP_PATH="${TEMP_PATH}/integration" \ -# REPORTS_PATH="${REPORTS_PATH}/integration" \ -# python3 integration_test_check.py "Integration $CHECK_NAME" \ -# --validate-bugfix --post-commit-status=file || echo 'ignore exit code' -# -# TEMP_PATH="${TEMP_PATH}/stateless" \ -# REPORTS_PATH="${REPORTS_PATH}/stateless" \ -# python3 functional_test_check.py "Stateless $CHECK_NAME" "$KILL_TIMEOUT" \ -# --validate-bugfix --post-commit-status=file || echo 'ignore exit code' -# -# python3 bugfix_validate_check.py "${TEMP_PATH}/stateless/functional_commit_status.tsv" "${TEMP_PATH}/integration/integration_commit_status.tsv" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################### -############################# FUNCTIONAl STATEFUL TESTS ####################################### -############################################################################################### -# FunctionalStatefulTestRelease: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (release) -# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestAarch64: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (aarch64) -# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestAsan: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (asan) -# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestTsan: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (tsan) -# REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestMsan: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_msan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (msan) -# REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestUBsan: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (ubsan) -# REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestDebug: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (debug) -# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# # Parallel replicas -# FunctionalStatefulTestDebugParallelReplicas: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (debug, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestUBsanParallelReplicas: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (ubsan, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestMsanParallelReplicas: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_msan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (msan, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestTsanParallelReplicas: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (tsan, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestAsanParallelReplicas: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (asan, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# FunctionalStatefulTestReleaseParallelReplicas: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stateful_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stateful tests (release, ParallelReplicas) -# REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse -# KILL_TIMEOUT=3600 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v2 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Clear repository -# run: | -# sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" -# - name: Check out repository code -# uses: actions/checkout@v2 -# - name: Functional test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 functional_test_check.py "$CHECK_NAME" "$KILL_TIMEOUT" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################### -########################################## STRESS TESTS ####################################### -############################################################################################### -# StressTestAsan: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stress_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stress test (asan) -# REPO_COPY=${{runner.temp}}/stress_asan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Stress test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 stress_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# StressTestTsan: -# needs: [BuilderDebTsan] -# # func testers have 16 cores + 128 GB memory -# # while stress testers have 36 cores + 72 memory -# # It would be better to have something like 32 + 128, -# # but such servers almost unavailable as spot instances. -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stress_thread -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stress test (tsan) -# REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Stress test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 stress_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# StressTestMsan: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stress_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stress test (msan) -# REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Stress test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 stress_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# StressTestUBsan: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stress_undefined -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stress test (ubsan) -# REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Stress test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 stress_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# StressTestDebug: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/stress_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Stress test (debug) -# REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Stress test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 stress_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# ############################################################################################## -# ######################################### UPGRADE CHECK ###################################### -# ############################################################################################## -# UpgradeCheckAsan: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/upgrade_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Upgrade check (asan) -# REPO_COPY=${{runner.temp}}/upgrade_asan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Upgrade check -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 upgrade_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UpgradeCheckTsan: -# needs: [BuilderDebTsan] -# # same as for stress test with tsan -# runs-on: [self-hosted, func-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/upgrade_thread -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Upgrade check (tsan) -# REPO_COPY=${{runner.temp}}/upgrade_thread/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Upgrade check -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 upgrade_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UpgradeCheckMsan: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/upgrade_memory -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Upgrade check (msan) -# REPO_COPY=${{runner.temp}}/upgrade_memory/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Upgrade check -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 upgrade_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UpgradeCheckDebug: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/upgrade_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Upgrade check (debug) -# REPO_COPY=${{runner.temp}}/upgrade_debug/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Upgrade check -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 upgrade_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################### -###################################### AST FUZZERS ############################################ -############################################################################################### -# ASTFuzzerTestAsan: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=AST fuzzer (asan) -# REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Fuzzer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 ast_fuzzer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# ASTFuzzerTestTsan: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=AST fuzzer (tsan) -# REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Fuzzer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 ast_fuzzer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# ASTFuzzerTestUBSan: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=AST fuzzer (ubsan) -# REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Fuzzer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 ast_fuzzer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# ASTFuzzerTestMSan: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=AST fuzzer (msan) -# REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Fuzzer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 ast_fuzzer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# ASTFuzzerTestDebug: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=AST fuzzer (debug) -# REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Fuzzer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 ast_fuzzer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" + PerformanceComparisonX86-0: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonX86-1: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonX86-2: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonX86-3: + needs: [BuilderDebRelease] + runs-on: [self-hosted, stress-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonAarch-0: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison Aarch64 + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=0 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonAarch-1: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison Aarch64 + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=1 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonAarch-2: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison Aarch64 + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=2 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + PerformanceComparisonAarch-3: + needs: [BuilderDebAarch64] + runs-on: [self-hosted, func-tester-aarch64] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/performance_comparison + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=Performance Comparison Aarch64 + REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse + RUN_BY_HASH_NUM=3 + RUN_BY_HASH_TOTAL=4 + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Performance Comparison + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 performance_comparison_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" ############################################################################################## -############################## INTEGRATION TESTS ############################################# +###################################### SQLANCER FUZZERS ###################################### ############################################################################################## -# IntegrationTestsAsan0: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsAsan1: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsAsan2: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsAsan3: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsAsan4: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsAsan5: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse -# RUN_BY_HASH_NUM=5 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan0: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan1: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan2: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan3: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan4: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=4 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsTsan5: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (tsan) -# REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse -# RUN_BY_HASH_NUM=5 -# RUN_BY_HASH_TOTAL=6 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsRelease0: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (release) -# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsRelease1: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (release) -# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsRelease2: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (release) -# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsRelease3: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests (release) -# REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# IntegrationTestsFlakyCheck: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/integration_tests_asan_flaky_check -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Integration tests flaky check (asan) -# REPO_COPY=${{runner.temp}}/integration_tests_asan_flaky_check/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Integration test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 integration_test_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################## -##################################### UNIT TESTS ############################################# -############################################################################################## -# UnitTestsAsan: -# needs: [BuilderDebAsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/unit_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Unit tests (asan) -# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Unit test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 unit_tests_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UnitTestsReleaseClang: -# needs: [BuilderBinRelease] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/unit_tests_asan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Unit tests (release-clang) -# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Unit test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 unit_tests_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UnitTestsTsan: -# needs: [BuilderDebTsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/unit_tests_tsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Unit tests (tsan) -# REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Unit test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 unit_tests_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UnitTestsMsan: -# needs: [BuilderDebMsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/unit_tests_msan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Unit tests (msan) -# REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Unit test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 unit_tests_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# UnitTestsUBsan: -# needs: [BuilderDebUBsan] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/unit_tests_ubsan -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Unit tests (ubsan) -# REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Unit test -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 unit_tests_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################## -##################################### PERFORMANCE TESTS ###################################### -############################################################################################## -# PerformanceComparisonX86-0: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonX86-1: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonX86-2: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonX86-3: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, stress-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonAarch-0: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison Aarch64 -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=0 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonAarch-1: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison Aarch64 -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=1 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonAarch-2: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison Aarch64 -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=2 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# PerformanceComparisonAarch-3: -# needs: [BuilderDebAarch64] -# runs-on: [self-hosted, func-tester-aarch64] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/performance_comparison -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=Performance Comparison Aarch64 -# REPO_COPY=${{runner.temp}}/performance_comparison/ClickHouse -# RUN_BY_HASH_NUM=3 -# RUN_BY_HASH_TOTAL=4 -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Performance Comparison -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 performance_comparison_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################### -####################################### SQLANCER FUZZERS ###################################### -############################################################################################### -# SQLancerTestRelease: -# needs: [BuilderDebRelease] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/sqlancer_release -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=SQLancer (release) -# REPO_COPY=${{runner.temp}}/sqlancer_release/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: SQLancer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 sqlancer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -# SQLancerTestDebug: -# needs: [BuilderDebDebug] -# runs-on: [self-hosted, fuzzer-unit-tester] -# steps: -# - name: Set envs -# run: | -# cat >> "$GITHUB_ENV" << 'EOF' -# TEMP_PATH=${{runner.temp}}/sqlancer_debug -# REPORTS_PATH=${{runner.temp}}/reports_dir -# CHECK_NAME=SQLancer (debug) -# REPO_COPY=${{runner.temp}}/sqlancer_debug/ClickHouse -# EOF -# - name: Download json reports -# uses: actions/download-artifact@v3 -# with: -# path: ${{ env.REPORTS_PATH }} -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: SQLancer -# run: | -# sudo rm -fr "$TEMP_PATH" -# mkdir -p "$TEMP_PATH" -# cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" -# cd "$REPO_COPY/tests/ci" -# python3 sqlancer_check.py "$CHECK_NAME" -# - name: Cleanup -# if: always() -# run: | -# docker ps --quiet | xargs --no-run-if-empty docker kill ||: -# docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: -# sudo rm -fr "$TEMP_PATH" -############################################################################################## -####################################### JEPSEN TESTS ######################################### -############################################################################################## -# Jepsen: -# # This is special test NOT INCLUDED in FinishCheck -# # When it's skipped, all dependent tasks will be skipped too. -# # DO NOT add it there -# if: contains(github.event.pull_request.labels.*.name, 'jepsen-test') -# needs: [BuilderBinRelease] -# uses: ./.github/workflows/jepsen.yml -# FinishCheck: -# needs: -# - StyleCheck -# - DockerHubPush -# - DockerServerImages -# - CheckLabels -# - BuilderReport -# - BuilderSpecialReport -# - FastTest -# - FunctionalStatelessTestDebug0 -# - FunctionalStatelessTestDebug1 -# - FunctionalStatelessTestDebug2 -# - FunctionalStatelessTestDebug3 -# - FunctionalStatelessTestDebug4 -# - FunctionalStatelessTestRelease -# - FunctionalStatelessTestReleaseDatabaseReplicated0 -# - FunctionalStatelessTestReleaseDatabaseReplicated1 -# - FunctionalStatelessTestReleaseDatabaseReplicated2 -# - FunctionalStatelessTestReleaseDatabaseReplicated3 -# - FunctionalStatelessTestReleaseWideParts -# - FunctionalStatelessTestAarch64 -# - FunctionalStatelessTestAsan0 -# - FunctionalStatelessTestAsan1 -# - FunctionalStatelessTestAsan2 -# - FunctionalStatelessTestAsan3 -# - FunctionalStatelessTestTsan0 -# - FunctionalStatelessTestTsan1 -# - FunctionalStatelessTestTsan2 -# - FunctionalStatelessTestTsan3 -# - FunctionalStatelessTestTsan4 -# - FunctionalStatelessTestMsan0 -# - FunctionalStatelessTestMsan1 -# - FunctionalStatelessTestMsan2 -# - FunctionalStatelessTestMsan3 -# - FunctionalStatelessTestMsan4 -# - FunctionalStatelessTestMsan5 -# - FunctionalStatelessTestUBsan0 -# - FunctionalStatelessTestUBsan1 -# - FunctionalStatefulTestDebug -# - FunctionalStatefulTestRelease -# - FunctionalStatefulTestAarch64 -# - FunctionalStatefulTestAsan -# - FunctionalStatefulTestTsan -# - FunctionalStatefulTestMsan -# - FunctionalStatefulTestUBsan -# - FunctionalStatelessTestReleaseS3_0 -# - FunctionalStatelessTestReleaseS3_1 -# - FunctionalStatelessTestS3Debug0 -# - FunctionalStatelessTestS3Debug1 -# - FunctionalStatelessTestS3Debug2 -# - FunctionalStatelessTestS3Debug4 -# - FunctionalStatelessTestS3Debug5 -# - FunctionalStatelessTestS3Tsan0 -# - FunctionalStatelessTestS3Tsan1 -# - FunctionalStatelessTestS3Tsan2 -# - FunctionalStatelessTestS3Tsan4 -# - StressTestDebug -# - StressTestAsan -# - StressTestTsan -# - StressTestMsan -# - StressTestUBsan -# - ASTFuzzerTestDebug -# - ASTFuzzerTestAsan -# - ASTFuzzerTestTsan -# - ASTFuzzerTestMSan -# - ASTFuzzerTestUBSan -# - IntegrationTestsAsan0 -# - IntegrationTestsAsan1 -# - IntegrationTestsAsan2 -# - IntegrationTestsAsan3 -# - IntegrationTestsAsan4 -# - IntegrationTestsAsan5 -# - IntegrationTestsRelease0 -# - IntegrationTestsRelease1 -# - IntegrationTestsRelease2 -# - IntegrationTestsRelease3 -# - IntegrationTestsTsan0 -# - IntegrationTestsTsan1 -# - IntegrationTestsTsan2 -# - IntegrationTestsTsan3 -# - IntegrationTestsTsan4 -# - IntegrationTestsTsan5 -# - PerformanceComparisonX86-0 -# - PerformanceComparisonX86-1 -# - PerformanceComparisonX86-2 -# - PerformanceComparisonX86-3 -# - PerformanceComparisonAarch-0 -# - PerformanceComparisonAarch-1 -# - PerformanceComparisonAarch-2 -# - PerformanceComparisonAarch-3 -# - UnitTestsAsan -# - UnitTestsTsan -# - UnitTestsMsan -# - UnitTestsUBsan -# - UnitTestsReleaseClang -# - CompatibilityCheckX86 -# - CompatibilityCheckAarch64 -# - IntegrationTestsFlakyCheck -# - SQLancerTestRelease -# - SQLancerTestDebug -# runs-on: [self-hosted, style-checker] -# steps: -# - name: Check out repository code -# uses: ClickHouse/checkout@v1 -# with: -# clear-repository: true -# - name: Finish label -# run: | -# cd "$GITHUB_WORKSPACE/tests/ci" -# python3 finish_check.py -# python3 merge_pr.py --check-approved + SQLancerTestRelease: + needs: [BuilderDebRelease] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/sqlancer_release + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=SQLancer (release) + REPO_COPY=${{runner.temp}}/sqlancer_release/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: SQLancer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 sqlancer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + SQLancerTestDebug: + needs: [BuilderDebDebug] + runs-on: [self-hosted, fuzzer-unit-tester] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/sqlancer_debug + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=SQLancer (debug) + REPO_COPY=${{runner.temp}}/sqlancer_debug/ClickHouse + EOF + - name: Download json reports + uses: actions/download-artifact@v3 + with: + path: ${{ env.REPORTS_PATH }} + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: SQLancer + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" + python3 sqlancer_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" +############################################################################################# +###################################### JEPSEN TESTS ######################################### +############################################################################################# + Jepsen: + # This is special test NOT INCLUDED in FinishCheck + # When it's skipped, all dependent tasks will be skipped too. + # DO NOT add it there + if: contains(github.event.pull_request.labels.*.name, 'jepsen-test') + needs: [BuilderBinRelease] + uses: ./.github/workflows/jepsen.yml + FinishCheck: + needs: + - StyleCheck + - DockerHubPush + - DockerServerImages + - CheckLabels + - BuilderReport + - BuilderSpecialReport + - FastTest + - FunctionalStatelessTestDebug0 + - FunctionalStatelessTestDebug1 + - FunctionalStatelessTestDebug2 + - FunctionalStatelessTestDebug3 + - FunctionalStatelessTestDebug4 + - FunctionalStatelessTestRelease + - FunctionalStatelessTestReleaseDatabaseReplicated0 + - FunctionalStatelessTestReleaseDatabaseReplicated1 + - FunctionalStatelessTestReleaseDatabaseReplicated2 + - FunctionalStatelessTestReleaseDatabaseReplicated3 + - FunctionalStatelessTestReleaseWideParts + - FunctionalStatelessTestAarch64 + - FunctionalStatelessTestAsan0 + - FunctionalStatelessTestAsan1 + - FunctionalStatelessTestAsan2 + - FunctionalStatelessTestAsan3 + - FunctionalStatelessTestTsan0 + - FunctionalStatelessTestTsan1 + - FunctionalStatelessTestTsan2 + - FunctionalStatelessTestTsan3 + - FunctionalStatelessTestTsan4 + - FunctionalStatelessTestMsan0 + - FunctionalStatelessTestMsan1 + - FunctionalStatelessTestMsan2 + - FunctionalStatelessTestMsan3 + - FunctionalStatelessTestMsan4 + - FunctionalStatelessTestMsan5 + - FunctionalStatelessTestUBsan0 + - FunctionalStatelessTestUBsan1 + - FunctionalStatefulTestDebug + - FunctionalStatefulTestRelease + - FunctionalStatefulTestAarch64 + - FunctionalStatefulTestAsan + - FunctionalStatefulTestTsan + - FunctionalStatefulTestMsan + - FunctionalStatefulTestUBsan + - FunctionalStatelessTestReleaseS3_0 + - FunctionalStatelessTestReleaseS3_1 + - FunctionalStatelessTestS3Debug0 + - FunctionalStatelessTestS3Debug1 + - FunctionalStatelessTestS3Debug2 + - FunctionalStatelessTestS3Debug4 + - FunctionalStatelessTestS3Debug5 + - FunctionalStatelessTestS3Tsan0 + - FunctionalStatelessTestS3Tsan1 + - FunctionalStatelessTestS3Tsan2 + - FunctionalStatelessTestS3Tsan4 + - StressTestDebug + - StressTestAsan + - StressTestTsan + - StressTestMsan + - StressTestUBsan + - ASTFuzzerTestDebug + - ASTFuzzerTestAsan + - ASTFuzzerTestTsan + - ASTFuzzerTestMSan + - ASTFuzzerTestUBSan + - IntegrationTestsAsan0 + - IntegrationTestsAsan1 + - IntegrationTestsAsan2 + - IntegrationTestsAsan3 + - IntegrationTestsAsan4 + - IntegrationTestsAsan5 + - IntegrationTestsRelease0 + - IntegrationTestsRelease1 + - IntegrationTestsRelease2 + - IntegrationTestsRelease3 + - IntegrationTestsTsan0 + - IntegrationTestsTsan1 + - IntegrationTestsTsan2 + - IntegrationTestsTsan3 + - IntegrationTestsTsan4 + - IntegrationTestsTsan5 + - PerformanceComparisonX86-0 + - PerformanceComparisonX86-1 + - PerformanceComparisonX86-2 + - PerformanceComparisonX86-3 + - PerformanceComparisonAarch-0 + - PerformanceComparisonAarch-1 + - PerformanceComparisonAarch-2 + - PerformanceComparisonAarch-3 + - UnitTestsAsan + - UnitTestsTsan + - UnitTestsMsan + - UnitTestsUBsan + - UnitTestsReleaseClang + - CompatibilityCheckX86 + - CompatibilityCheckAarch64 + - IntegrationTestsFlakyCheck + - SQLancerTestRelease + - SQLancerTestDebug + runs-on: [self-hosted, style-checker] + steps: + - name: Check out repository code + uses: ClickHouse/checkout@v1 + with: + clear-repository: true + - name: Finish label + run: | + cd "$GITHUB_WORKSPACE/tests/ci" + python3 finish_check.py + python3 merge_pr.py --check-approved ############################################################################################## ########################### SQLLOGIC TEST ################################################### ############################################################################################## diff --git a/docker/test/sqllogic/Dockerfile.1.2 b/docker/test/sqllogic/Dockerfile.1.2 deleted file mode 100644 index 9ad8e719d31..00000000000 --- a/docker/test/sqllogic/Dockerfile.1.2 +++ /dev/null @@ -1,43 +0,0 @@ -# docker build -t clickhouse/sqllogic-test . -ARG FROM_TAG=latest -FROM clickhouse/test-base:$FROM_TAG - -RUN apt-get update --yes \ - && env DEBIAN_FRONTEND=noninteractive \ - apt-get install --yes --no-install-recommends \ - wget \ - git \ - python3 \ - python3-dev \ - python3-pip \ - sqlite3 \ - unixodbc \ - unixodbc-dev \ - sudo \ - unzip \ - && apt-get clean - -RUN pip3 install \ - numpy \ - pyodbc - -# ARG odbc_driver_url="https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.1.4.20200302/clickhouse-odbc-1.1.4-Linux.tar.gz" -ARG odbc_driver_url="https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.2.1.20220905/clickhouse-odbc-linux.zip" - -RUN mkdir -p /tmp/clickhouse-odbc-tmp \ - && cd /tmp/clickhouse-odbc-tmp \ - && wget -nv ${odbc_driver_url} -O /tmp/clickhouse-odbc-tmp/clickhouse-odbc-linux.zip \ - && unzip /tmp/clickhouse-odbc-tmp/clickhouse-odbc-linux.zip -d /tmp/clickhouse-odbc-tmp \ - && tar -xzf /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux.tar.gz -C /tmp/clickhouse-odbc-tmp \ - && mkdir -p /usr/local/lib64 \ - && cp /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/lib64/*.so /usr/local/lib64/ \ - && odbcinst -i -d -f /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/share/doc/clickhouse-odbc/config/odbcinst.ini.sample \ - && odbcinst -i -s -l -f /tmp/clickhouse-odbc-tmp/clickhouse-odbc-1.2.1-Linux/share/doc/clickhouse-odbc/config/odbc.ini.sample \ - && rm -rf /tmp/clickhouse-odbc-tmp - -ENV TZ=Europe/Amsterdam -ENV MAX_RUN_TIME=900 -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -COPY run.sh / -CMD ["/bin/bash", "/run.sh"] diff --git a/tests/ci/ci_config.py b/tests/ci/ci_config.py index f65593157d0..8b4bd3681a6 100644 --- a/tests/ci/ci_config.py +++ b/tests/ci/ci_config.py @@ -159,14 +159,14 @@ CI_CONFIG = { "builds_report_config": { "ClickHouse build check": [ "package_release", - # "coverity", + "coverity", "package_aarch64", - # "package_asan", - # "package_ubsan", - # "package_tsan", - # "package_msan", - # "package_debug", - # "binary_release", + "package_asan", + "package_ubsan", + "package_tsan", + "package_msan", + "package_debug", + "binary_release", ], "ClickHouse special build check": [ "binary_tidy", @@ -375,9 +375,6 @@ CI_CONFIG = { "SQLancer (debug)": { "required_build": "package_debug", }, - "Sqllogic test (debug)": { - "required_build": "package_debug", - }, "Sqllogic test (release)": { "required_build": "package_release", }, @@ -389,12 +386,12 @@ REQUIRED_CHECKS = [ "Fast test", "Style Check", "ClickHouse build check", - # "ClickHouse special build check", - # "Stateful tests (release)", - # "Stateless tests (release)", - # "Unit tests (release-clang)", - # "Unit tests (asan)", - # "Unit tests (msan)", - # "Unit tests (tsan)", - # "Unit tests (ubsan)", + "ClickHouse special build check", + "Stateful tests (release)", + "Stateless tests (release)", + "Unit tests (release-clang)", + "Unit tests (asan)", + "Unit tests (msan)", + "Unit tests (tsan)", + "Unit tests (ubsan)", ] From 7ed4c413e3706ad6fbff573c1021d61ed5175d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E6=B6=9B?= Date: Fri, 7 Apr 2023 18:53:18 +0800 Subject: [PATCH 264/535] add settings allow_suspicious_indices --- src/Core/SettingsChangesHistory.h | 1 + src/Storages/MergeTree/MergeTreeData.cpp | 42 +++++++++++++++++-- src/Storages/MergeTree/MergeTreeData.h | 2 + src/Storages/MergeTree/MergeTreeSettings.h | 1 + .../02710_allow_suspicious_indices.reference | 0 .../02710_allow_suspicious_indices.sql | 20 +++++++++ 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 tests/queries/0_stateless/02710_allow_suspicious_indices.reference create mode 100644 tests/queries/0_stateless/02710_allow_suspicious_indices.sql diff --git a/src/Core/SettingsChangesHistory.h b/src/Core/SettingsChangesHistory.h index 4f89397ed9d..b6366fcd96f 100644 --- a/src/Core/SettingsChangesHistory.h +++ b/src/Core/SettingsChangesHistory.h @@ -80,6 +80,7 @@ namespace SettingsChangesHistory /// It's used to implement `compatibility` setting (see https://github.com/ClickHouse/ClickHouse/issues/35972) static std::map settings_changes_history = { + {"23.4", {{"allow_suspicious_indices", true, false, "If true, index can defined with identical expressions"}}}, {"23.3", {{"output_format_parquet_version", "1.0", "2.latest", "Use latest Parquet format version for output format"}, {"input_format_json_ignore_unknown_keys_in_named_tuple", false, true, "Improve parsing JSON objects as named tuples"}, {"input_format_native_allow_types_conversion", false, true, "Allow types conversion in Native input forma"}, diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index a49dbe21f1b..000a6242e57 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -43,8 +43,11 @@ #include #include #include +#include #include #include +#include +#include #include #include #include @@ -54,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +90,7 @@ #include #include +#include #include #include @@ -454,6 +459,7 @@ void MergeTreeData::checkProperties( "{} is greater than the sorting key length: {}", primary_key_size, sorting_key_size); NameSet primary_key_columns_set; + bool allow_suspicious_indices = getSettings()->allow_suspicious_indices; for (size_t i = 0; i < sorting_key_size; ++i) { @@ -467,7 +473,7 @@ void MergeTreeData::checkProperties( "Primary key must be a prefix of the sorting key, " "but the column in the position {} is {}", i, sorting_key_column +", not " + pk_column); - if (!primary_key_columns_set.emplace(pk_column).second) + if (!primary_key_columns_set.emplace(pk_column).second && !allow_suspicious_indices && !attach) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Primary key contains duplicate columns"); } @@ -530,6 +536,12 @@ void MergeTreeData::checkProperties( for (const auto & index : new_metadata.secondary_indices) { + if (!allow_suspicious_indices && !attach) + { + const auto * index_ast = typeid_cast(index.definition_ast.get()); + checkSuspiciousIndices(index_ast->expr->as()); + } + MergeTreeIndexFactory::instance().validate(index, attach); if (indices_names.find(index.name) != indices_names.end()) @@ -989,6 +1001,20 @@ std::optional MergeTreeData::totalRowsByPartitionPredicateImpl( return res; } +void MergeTreeData::checkSuspiciousIndices(const ASTFunction & index_function) const +{ + NameSet index_key_set; + for (const auto & child : index_function.arguments->children) + { + const auto & tree_hash = child->getTreeHash(); + const String key = toString(tree_hash.first); + + if (!index_key_set.emplace(key).second) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Primary key or secondary indices contains duplicate expressios"); + } +} + String MergeTreeData::MergingParams::getModeName() const { @@ -2976,10 +3002,18 @@ void MergeTreeData::checkAlterIsPossible(const AlterCommands & commands, Context } } - if (command.type == AlterCommand::MODIFY_ORDER_BY && !is_custom_partitioned) + if (command.type == AlterCommand::MODIFY_ORDER_BY) { - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "ALTER MODIFY ORDER BY is not supported for default-partitioned tables created with the old syntax"); + bool allow_suspicious_indices = getSettings()->allow_suspicious_indices; + if (!allow_suspicious_indices) + { + const auto * alter_ast = command.ast->as(); + checkSuspiciousIndices(alter_ast->order_by->as()); + } + + if (!is_custom_partitioned) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "ALTER MODIFY ORDER BY is not supported for default-partitioned tables created with the old syntax"); } if (command.type == AlterCommand::MODIFY_TTL && !is_custom_partitioned) { diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index 8312efa216d..b0fe631891f 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -431,6 +431,8 @@ public: bool supportsLightweightDelete() const override; + void checkSuspiciousIndices(const ASTFunction & index_funtion) const; + NamesAndTypesList getVirtuals() const override; bool mayBenefitFromIndexForIn(const ASTPtr & left_in_operand, ContextPtr, const StorageMetadataPtr & metadata_snapshot) const override; diff --git a/src/Storages/MergeTree/MergeTreeSettings.h b/src/Storages/MergeTree/MergeTreeSettings.h index 4aabcbbf865..fd44f7ec5f5 100644 --- a/src/Storages/MergeTree/MergeTreeSettings.h +++ b/src/Storages/MergeTree/MergeTreeSettings.h @@ -132,6 +132,7 @@ struct Settings; M(Bool, compatibility_allow_sampling_expression_not_in_primary_key, false, "Allow to create a table with sampling expression not in primary key. This is needed only to temporarily allow to run the server with wrong tables for backward compatibility.", 0) \ M(Bool, use_minimalistic_checksums_in_zookeeper, true, "Use small format (dozens bytes) for part checksums in ZooKeeper instead of ordinary ones (dozens KB). Before enabling check that all replicas support new format.", 0) \ M(Bool, use_minimalistic_part_header_in_zookeeper, true, "Store part header (checksums and columns) in a compact format and a single part znode instead of separate znodes (/columns and /checksums). This can dramatically reduce snapshot size in ZooKeeper. Before enabling check that all replicas support new format.", 0) \ + M(Bool, allow_suspicious_indices, false, "If true, index can be defined with identical expressions", 0) \ M(UInt64, finished_mutations_to_keep, 100, "How many records about mutations that are done to keep. If zero, then keep all of them.", 0) \ M(UInt64, min_merge_bytes_to_use_direct_io, 10ULL * 1024 * 1024 * 1024, "Minimal amount of bytes to enable O_DIRECT in merge (0 - disabled).", 0) \ M(UInt64, index_granularity_bytes, 10 * 1024 * 1024, "Approximate amount of bytes in single granule (0 - disabled).", 0) \ diff --git a/tests/queries/0_stateless/02710_allow_suspicious_indices.reference b/tests/queries/0_stateless/02710_allow_suspicious_indices.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02710_allow_suspicious_indices.sql b/tests/queries/0_stateless/02710_allow_suspicious_indices.sql new file mode 100644 index 00000000000..b521a14a1f1 --- /dev/null +++ b/tests/queries/0_stateless/02710_allow_suspicious_indices.sql @@ -0,0 +1,20 @@ +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by (id, id) settings allow_suspicious_indices = 1; +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by (id, id) settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax GRANULARITY 1) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 1; +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 1; +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax GRANULARITY 1) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 0; +ALTER TABLE allow_suspicious_indices ADD COLUMN `id2` UInt32, MODIFY ORDER BY (id + 1, id2 + 1, id2 + 1); -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 0; +ALTER TABLE allow_suspicious_indices ADD COLUMN `id2` UInt32, MODIFY ORDER BY (id + 1, id2 + 1, id + 1); -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; + From d1a14900ea5654941f2df83bc0d1adc18a7542a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E6=B6=9B?= Date: Mon, 17 Apr 2023 20:26:31 +0800 Subject: [PATCH 265/535] remove unused h --- src/Storages/MergeTree/MergeTreeData.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 000a6242e57..44fca62291e 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -90,7 +90,6 @@ #include #include -#include #include #include From 0493b2cbce2a5e66429010f6509831c62242d5ff Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:01:45 +0200 Subject: [PATCH 266/535] A wrapper to allow calling join() from multiple threads --- src/Common/ZooKeeper/ZooKeeperImpl.cpp | 19 ++++++------------- src/Common/ZooKeeper/ZooKeeperImpl.h | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/Common/ZooKeeper/ZooKeeperImpl.cpp b/src/Common/ZooKeeper/ZooKeeperImpl.cpp index 79a975e683f..f97bf292198 100644 --- a/src/Common/ZooKeeper/ZooKeeperImpl.cpp +++ b/src/Common/ZooKeeper/ZooKeeperImpl.cpp @@ -299,11 +299,8 @@ ZooKeeper::~ZooKeeper() { finalize(false, false, "Destructor called"); - if (send_thread.joinable()) - send_thread.join(); - - if (receive_thread.joinable()) - receive_thread.join(); + send_thread.join(); + receive_thread.join(); } catch (...) { @@ -365,11 +362,8 @@ ZooKeeper::ZooKeeper( { tryLogCurrentException(log, "Failed to connect to ZooKeeper"); - if (send_thread.joinable()) - send_thread.join(); - - if (receive_thread.joinable()) - receive_thread.join(); + send_thread.join(); + receive_thread.join(); throw; } @@ -914,8 +908,7 @@ void ZooKeeper::finalize(bool error_send, bool error_receive, const String & rea } /// Send thread will exit after sending close request or on expired flag - if (send_thread.joinable()) - send_thread.join(); + send_thread.join(); } /// Set expired flag after we sent close event @@ -932,7 +925,7 @@ void ZooKeeper::finalize(bool error_send, bool error_receive, const String & rea tryLogCurrentException(log); } - if (!error_receive && receive_thread.joinable()) + if (!error_receive) receive_thread.join(); { diff --git a/src/Common/ZooKeeper/ZooKeeperImpl.h b/src/Common/ZooKeeper/ZooKeeperImpl.h index 91c5083bda1..9fff12309bd 100644 --- a/src/Common/ZooKeeper/ZooKeeperImpl.h +++ b/src/Common/ZooKeeper/ZooKeeperImpl.h @@ -255,8 +255,30 @@ private: Watches watches TSA_GUARDED_BY(watches_mutex); std::mutex watches_mutex; - ThreadFromGlobalPool send_thread; - ThreadFromGlobalPool receive_thread; + /// A wrapper around ThreadFromGlobalPool that allows to call join() on it from multiple threads. + class ThreadReference + { + public: + const ThreadReference & operator = (ThreadFromGlobalPool && thread_) + { + std::lock_guard l(lock); + thread = std::move(thread_); + return *this; + } + + void join() + { + std::lock_guard l(lock); + if (thread.joinable()) + thread.join(); + } + private: + std::mutex lock; + ThreadFromGlobalPool thread; + }; + + ThreadReference send_thread; + ThreadReference receive_thread; Poco::Logger * log; From eb4c26d81fc02f5e245ccceec9314b277e00765f Mon Sep 17 00:00:00 2001 From: Sichen Zhao Date: Mon, 17 Apr 2023 12:45:04 +0000 Subject: [PATCH 267/535] add aliases for parts name and names --- src/Interpreters/PartLog.cpp | 1 + src/Storages/System/StorageSystemPartsBase.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Interpreters/PartLog.cpp b/src/Interpreters/PartLog.cpp index cf231cbd7c9..881fcae4de6 100644 --- a/src/Interpreters/PartLog.cpp +++ b/src/Interpreters/PartLog.cpp @@ -135,6 +135,7 @@ NamesAndAliases PartLogElement::getNamesAndAliases() { {"ProfileEvents.Names", {std::make_shared(std::make_shared())}, "mapKeys(ProfileEvents)"}, {"ProfileEvents.Values", {std::make_shared(std::make_shared())}, "mapValues(ProfileEvents)"}, + {"name", {std::make_shared()}, "part_name"}, }; } diff --git a/src/Storages/System/StorageSystemPartsBase.cpp b/src/Storages/System/StorageSystemPartsBase.cpp index fb7f4f9066a..0979b9d9371 100644 --- a/src/Storages/System/StorageSystemPartsBase.cpp +++ b/src/Storages/System/StorageSystemPartsBase.cpp @@ -304,6 +304,7 @@ StorageSystemPartsBase::StorageSystemPartsBase(const StorageID & table_id_, Name /// Add aliases for old column names for backwards compatibility. add_alias("bytes", "bytes_on_disk"); add_alias("marks_size", "marks_bytes"); + add_alias("part_name", "name"); StorageInMemoryMetadata storage_metadata; storage_metadata.setColumns(tmp_columns); From 3380c9120630caf1c2d199186f406b6b058af6ae Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 17 Apr 2023 11:15:24 -0300 Subject: [PATCH 268/535] Add validation for number of arguments provided and update doc examples --- .../functions/string-functions.md | 20 +++++++-------- .../keyvaluepair/ArgumentExtractor.cpp | 8 ++++-- ...t_key_value_pairs_multiple_input.reference | 12 +++++++++ ...extract_key_value_pairs_multiple_input.sql | 25 +++++++++++++++++++ 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 940be6334d5..5562de66a27 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1285,15 +1285,15 @@ Query id: 0e22bf6b-9844-414a-99dc-32bf647abd5e **Escape sequences without escape sequences support** ``` sql -arthur :) select extractKeyValuePairs('age:\\x0A\\n\\0') as kv +arthur :) select extractKeyValuePairs('age:a\\x0A\\n\\0') as kv -SELECT extractKeyValuePairs('age:\\x0A\\n\\0') AS kv +SELECT extractKeyValuePairs('age:a\\x0A\\n\\0') AS kv Query id: e9fd26ee-b41f-4a11-b17f-25af6fd5d356 -┌─kv────────────────────┐ -│ {'age':'\\x0A\\n\\0'} │ -└───────────────────────┘ +┌─kv─────────────────────┐ +│ {'age':'a\\x0A\\n\\0'} │ +└────────────────────────┘ ``` ## extractKeyValuePairsWithEscaping @@ -1306,13 +1306,13 @@ Non standard escape sequences are returned as it is (including the backslash) un **Escape sequences with escape sequence support turned on** ``` sql -arthur :) select extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') as kv +arthur :) select extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') as kv -SELECT extractKeyValuePairsWithEscaping('age:\\x0A\\n\\0') AS kv +SELECT extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') AS kv Query id: 44c114f0-5658-4c75-ab87-4574de3a1645 -┌─kv───────────────┐ -│ {'age':'\n\n\0'} │ -└──────────────────┘ +┌─kv────────────────┐ +│ {'age':'a\n\n\0'} │ +└───────────────────┘ ``` diff --git a/src/Functions/keyvaluepair/ArgumentExtractor.cpp b/src/Functions/keyvaluepair/ArgumentExtractor.cpp index 1fa3fd54f16..39af80cb561 100644 --- a/src/Functions/keyvaluepair/ArgumentExtractor.cpp +++ b/src/Functions/keyvaluepair/ArgumentExtractor.cpp @@ -31,9 +31,13 @@ ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(const ColumnsWithT ArgumentExtractor::ParsedArguments ArgumentExtractor::extract(ColumnsWithTypeAndNameList arguments) { - if (arguments.empty()) + static constexpr auto MAX_NUMBER_OF_ARGUMENTS = 4u; + + if (arguments.empty() || arguments.size() > MAX_NUMBER_OF_ARGUMENTS) { - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function extractKeyValuePairs requires at least one argument"); + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + "Function extractKeyValuePairs requires at least 1 argument and at most {}. {} was provided", + MAX_NUMBER_OF_ARGUMENTS, arguments.size()); } auto data_column = extractStringColumn(popFrontAndGet(arguments), "data_column"); diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference index 41f41c262ae..531af404c21 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.reference @@ -291,4 +291,16 @@ WITH SELECT x; {'age':'31','last_key':'last_value','name':'neymar','nationality':'brazil','team':'psg'} +-- { echoOn } +-- should not fail because pair delimiters contains 8 characters, which is within the limit +WITH + extractKeyValuePairs('not_important', ':', '12345678', '\'') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; {} diff --git a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql index d14fc81559b..1db7dc85573 100644 --- a/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql +++ b/tests/queries/0_stateless/02499_extract_key_value_pairs_multiple_input.sql @@ -390,6 +390,31 @@ WITH SELECT x; -- {serverError BAD_ARGUMENTS} +-- should fail because no argument has been provided +WITH + extractKeyValuePairs() AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH} + +-- should fail because one extra argument / non existent has been provided +WITH + extractKeyValuePairs('a', ':', ',', '"', '') AS s_map, + CAST( + arrayMap( + (x) -> (x, s_map[x]), arraySort(mapKeys(s_map)) + ), + 'Map(String,String)' + ) AS x +SELECT + x; -- {serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH} + +-- { echoOn } -- should not fail because pair delimiters contains 8 characters, which is within the limit WITH extractKeyValuePairs('not_important', ':', '12345678', '\'') AS s_map, From c7d7df75f26f35887b67df2987ef3e1947ec32cd Mon Sep 17 00:00:00 2001 From: Arthur Passos Date: Mon, 17 Apr 2023 11:20:03 -0300 Subject: [PATCH 269/535] minor doc update --- docs/en/sql-reference/functions/string-functions.md | 2 ++ src/Functions/keyvaluepair/impl/StateHandlerImpl.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 5562de66a27..0a080f38429 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1304,6 +1304,8 @@ Escape sequences supported: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t` Non standard escape sequences are returned as it is (including the backslash) unless they are one of the following: `\\`, `'`, `"`, `backtick`, `/`, `=` or ASCII control characters (c <= 31). +Leading escape sequences will be skipped in keys and will be considered invalid for values. + **Escape sequences with escape sequence support turned on** ``` sql arthur :) select extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') as kv diff --git a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h index f8270802034..625ff83c495 100644 --- a/src/Functions/keyvaluepair/impl/StateHandlerImpl.h +++ b/src/Functions/keyvaluepair/impl/StateHandlerImpl.h @@ -303,7 +303,7 @@ private: SearchSymbols read_quoted_needles; /* - * Helper method to copy bytes until `character_pos` and process possible escape sequence. Returns number a pair containing a boolean + * Helper method to copy bytes until `character_pos` and process possible escape sequence. Returns a pair containing a boolean * that indicates success and a std::size_t that contains the number of bytes read/ consumed. * */ std::pair consumeWithEscapeSequence(std::string_view file, size_t start_pos, size_t character_pos, auto & output) const From ae67375769a86ec1a31fc4c73b0e92ecf048151a Mon Sep 17 00:00:00 2001 From: Han Fei Date: Mon, 17 Apr 2023 16:58:36 +0200 Subject: [PATCH 270/535] suppress test_system_replicated_fetches --- .../integration/test_system_replicated_fetches/test.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/integration/test_system_replicated_fetches/test.py b/tests/integration/test_system_replicated_fetches/test.py index bcf9b38d3d4..ab6808dca89 100644 --- a/tests/integration/test_system_replicated_fetches/test.py +++ b/tests/integration/test_system_replicated_fetches/test.py @@ -96,11 +96,11 @@ def test_system_replicated_fetches(started_cluster): # ), "Bytes read ({}) more than total bytes ({}). It's a bug".format( # elem["bytes_read_compressed"], elem["total_size_bytes_compressed"] # ) - assert ( - 0.0 <= elem["progress"] <= 1.0 - ), "Progress shouldn't less than 0 and bigger than 1, got {}".format( - elem["progress"] - ) + # assert ( + # 0.0 <= elem["progress"] <= 1.0 + # ), "Progress shouldn't less than 0 and bigger than 1, got {}".format( + # elem["progress"] + # ) assert ( 0.0 <= elem["elapsed"] ), "Elapsed time must be greater than 0, got {}".format(elem["elapsed"]) From 61e552d660e8da2b3dcd5c55a7e1c4f4435a6c0a Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Mon, 17 Apr 2023 15:23:02 +0000 Subject: [PATCH 271/535] Fix used build --- tests/ci/ci_config.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/ci/ci_config.py b/tests/ci/ci_config.py index 2f35b337cb3..811ae16a495 100644 --- a/tests/ci/ci_config.py +++ b/tests/ci/ci_config.py @@ -259,6 +259,9 @@ CI_CONFIG = { "Stateless tests (release, wide parts enabled)": { "required_build": "package_release", }, + "Stateless tests (release, analyzer)": { + "required_build": "package_release", + }, "Stateless tests (release, DatabaseOrdinary)": { "required_build": "package_release", }, From 047388df8cbdd25182f46830710cf14826b7ee10 Mon Sep 17 00:00:00 2001 From: DanRoscigno Date: Mon, 17 Apr 2023 11:41:32 -0400 Subject: [PATCH 272/535] move transactions to clickhouse repo --- docs/en/sql-reference/transactions.md | 260 ++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 docs/en/sql-reference/transactions.md diff --git a/docs/en/sql-reference/transactions.md b/docs/en/sql-reference/transactions.md new file mode 100644 index 00000000000..94a30f015f1 --- /dev/null +++ b/docs/en/sql-reference/transactions.md @@ -0,0 +1,260 @@ +--- +slug: /en/guides/developer/transactional +--- +# Transactional (ACID) support + +INSERT into one partition* in one table* of MergeTree* family up to max_insert_block_size rows* is transactional (ACID): +- Atomic: INSERT is succeeded or rejected as a whole: if confirmation is sent to the client, all rows INSERTed; if error is sent to the client, no rows INSERTed. +- Consistent: if there are no table constraints violated, then all rows in an INSERT are inserted and the INSERT succeeds; if constraints are violated, then no rows are inserted. +- Isolated: concurrent clients observe a consistent snapshot of the table–the state of the table either as if before INSERT or after successfull INSERT; no partial state is seen; +- Durable: successful INSERT is written to the filesystem before answering to the client, on single replica or multiple replicas (controlled by the `insert_quorum` setting), and ClickHouse can ask the OS to sync the filesystem data on the storage media (controlled by the `fsync_after_insert` setting). +* If table has many partitions and INSERT covers many partitions–then insertion into every partition is transactional on its own; +* INSERT into multiple tables with one statement is possible if materialized views are involved; +* INSERT into Distributed table is not transactional as a whole, while insertion into every shard is transactional; +* another example: insert into Buffer tables is neither atomic nor isolated or consistent or durable; +* atomicity is ensured even if `async_insert` is enabled, but it can be turned off by the wait_for_async_insert setting; +* max_insert_block_size is 1 000 000 by default and can be adjusted as needed; +* if client did not receive the answer from the server, the client does not know if transaction succeeded, and it can repeat the transaction, using exactly-once insertion properties; +* ClickHouse is using MVCC with snapshot isolation internally; +* all ACID properties are valid even in case of server kill / crash; +* either insert_quorum into different AZ or fsync should be enabled to ensure durable inserts in typical setup; +* "consistency" in ACID terms does not cover the semantics of distributed systems, see https://jepsen.io/consistency which is controlled by different settings (select_sequential_consistency) +* this explanation does not cover a new transactions feature that allow to have full-featured transactions over multiple tables, materialized views, for multiple SELECTs, etc. + +## Transactions, Commit, and Rollback + +In addition to the functionality described at the top of this document, ClickHouse has experimental support for transactions, commits, and rollback functionality. + +### Requirements + +- Deploy ClickHouse Keeper or ZooKeeper to track transactions +- Atomic DB only (Default) +- Non-Replicated MergeTree table engine only +- Enable experimental transaction support by adding this setting in `config.d/transactions.xml`: + ```xml + + 1 + + ``` + +### Notes +- This is an experimental feature, and changes should be expected. +- If an exception occurs during a transaction, you cannot commit the transaction. This includes all exceptions, including `UNKNOWN_FUNCTION` exceptions caused by typos. +- Nested transactions are not supported; finish the current transaction and start a new one instead + +### Configuration + +These examples are with a single node ClickHouse server with ClickHouse Keeper enabled. + +#### Enable experimental transaction support + +```xml title=/etc/clickhouse-server/config.d/transactions.xml + + 1 + +``` + +#### Basic configuration for a single ClickHouse server node with ClickHouse Keeper enabled + +:::note +See the [deployment](docs/en/deployment-guides/terminology.md) documentation for details on deploying ClickHouse server and a proper quorum of ClickHouse Keeper nodes. The configuration shown here is for experimental purposes. +::: + +```xml title=/etc/clickhouse-server/config.d/config.xml + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + node 1 + 0.0.0.0 + 8123 + 9000 + + + clickhouse-01 + 9181 + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + information + + + + 1 + clickhouse-keeper-01 + 9234 + + + + +``` + +### Example + +#### Verify that experimental transactions are enabled + +Issue a `BEGIN TRANSACTION` forllowed by a `ROLLBACK` to verify that experimental transactions are enabled, and that ClickHouse Keeper is enabled as it is used to track transactions. + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +:::tip +If you see the following error, then check your configuration file to make sure that `allow_experimental_transactions` is set to `1` (or any value other than `0` or `false`). +``` +Code: 48. DB::Exception: Received from localhost:9000. +DB::Exception: Transactions are not supported. +(NOT_IMPLEMENTED) +``` + +You can also check ClickHouse Keeper by issuing +``` +echo ruok | nc localhost 9181 +``` +ClickHouse Keeper should respond with `imok`. +::: + +```sql +ROLLBACK +``` +```response +Ok. +``` + +#### Create a table for testing + +:::tip +Creation of tables is not transactional. Run this DDL query outside of a transaction. +::: + +```sql +CREATE TABLE mergetree_table +( + `n` Int64 +) +ENGINE = MergeTree +ORDER BY n +``` +```response +Ok. +``` + +#### Begin a transaction and insert a row + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +```sql +INSERT INTO mergetree_table FORMAT Values (10) +``` +```response +Ok. +``` + +```sql +SELECT * +FROM mergetree_table +``` +```response +┌──n─┐ +│ 10 │ +└────┘ +``` +:::note +You can query the table from within a transaction and see that the row was inserted even though it has not yet been committed. +::: + +#### Rollback the transaction, and query the table again + +Verify that the transaction is rolled back: +```sql +ROLLBACK +``` +```response +Ok. +``` +```sql +SELECT * +FROM mergetree_table +``` +```response +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +#### Complete a transaction and query the table again + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +```sql +INSERT INTO mergetree_table FORMAT Values (42) +``` +```response +Ok. +``` + +```sql +COMMIT +``` +```response +Ok. Elapsed: 0.002 sec. +``` + +```sql +SELECT * +FROM mergetree_table +``` +```response +┌──n─┐ +│ 42 │ +└────┘ +``` + +### Transactions introspection + +You can inspect transactions by querying the `system.transactions` table, but note that you cannot query that +table from a session that is in a transaction–open a second `clickhouse client` sesssion to query that table. + +```sql +SELECT * +FROM system.transactions +FORMAT Vertical +``` +```response +Row 1: +────── +tid: (33,61,'51e60bce-6b82-4732-9e1d-b40705ae9ab8') +tid_hash: 11240433987908122467 +elapsed: 210.017820947 +is_readonly: 1 +state: RUNNING +``` + +## More Details + +See this [meta issue](https://github.com/ClickHouse/ClickHouse/issues/48794) to find much more extensive tests and to keep up to date with the progress. + From 51c9ae05fbdefe80db741ed45d080fdf127ac757 Mon Sep 17 00:00:00 2001 From: Michael Lex Date: Mon, 17 Apr 2023 15:57:41 +0000 Subject: [PATCH 273/535] Fix unexpected part name error when trying to drop a ignored detache partition with zero copy replication Before this fix, the integration test failed with this error E Code: 233. DB::Exception: Received from 172.22.0.9:9000. DB::Exception: Unexpected part name: ignored_all_0_0_0 for format version: 1. Stack trace: E E 0. /home/ubuntu/clickhouse/contrib/llvm-project/libcxx/include/exception:134: std::exception::capture() @ 0x19bc7d02 in /usr/bin/clickhouse E 1. /home/ubuntu/clickhouse/contrib/llvm-project/libcxx/include/exception:112: std::exception::exception[abi:v15000]() @ 0x19bc7ccd in /usr/bin/clickhouse E 2. /home/ubuntu/clickhouse/base/poco/Foundation/src/Exception.cpp:27: Poco::Exception::Exception(String const&, int) @ 0x3194fae0 in /usr/bin/clickhouse E 3. /home/ubuntu/clickhouse/src/Common/Exception.cpp:89: DB::Exception::Exception(DB::Exception::MessageMasked&&, int, bool) @ 0x2268ae6e in /usr/bin/clickhouse E 4. /home/ubuntu/clickhouse/src/Common/Exception.h:54: DB::Exception::Exception(String&&, int, bool) @ 0x19bbb00a in /usr/bin/clickhouse E 5. /home/ubuntu/clickhouse/src/Common/Exception.h:81: DB::Exception::Exception&>(int, FormatStringHelperImpl::type, std::type_identity&>::type>, String const&, StrongTypedef&) @ 0x2c4f318c in /usr/bin/clickhouse E 6. /home/ubuntu/clickhouse/src/Storages/MergeTree/MergeTreePartInfo.cpp:23: DB::MergeTreePartInfo::fromPartName(String const&, StrongTypedef) @ 0x2c4f0867 in /usr/bin/clickhouse E 7. /home/ubuntu/clickhouse/src/Storages/StorageReplicatedMergeTree.cpp:8305: DB::(anonymous namespace)::getParentLockedBlobs(std::shared_ptr const&, String const&, String const&, StrongTypedef, Poco::Logger*) @ 0x2bca90f7 in /usr/bin/clickhouse --- src/Storages/StorageReplicatedMergeTree.cpp | 23 ++++-- src/Storages/StorageReplicatedMergeTree.h | 2 +- .../__init__.py | 1 + .../configs/storage_conf.xml | 30 ++++++++ .../test.py | 76 +++++++++++++++++++ 5 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 tests/integration/test_zero_copy_replication_drop_detached_part/__init__.py create mode 100644 tests/integration/test_zero_copy_replication_drop_detached_part/configs/storage_conf.xml create mode 100644 tests/integration/test_zero_copy_replication_drop_detached_part/test.py diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 5cd02c33d55..36fbfa1b579 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -96,6 +96,8 @@ #include #include +#include "MergeTree/MergeTreeDataFormatVersion.h" +#include "MergeTree/MergeTreePartInfo.h" #include #include @@ -149,6 +151,7 @@ namespace ErrorCodes extern const int REPLICA_IS_NOT_IN_QUORUM; extern const int TABLE_IS_READ_ONLY; extern const int NOT_FOUND_NODE; + extern const int BAD_DATA_PART_NAME; extern const int NO_ACTIVE_REPLICAS; extern const int NOT_A_LEADER; extern const int TABLE_WAS_NOT_DROPPED; @@ -8281,7 +8284,7 @@ StorageReplicatedMergeTree::unlockSharedData(const IMergeTreeDataPart & part, co return std::make_pair(true, NameSet{}); return unlockSharedDataByID( - part.getUniqueId(), shared_id, part.name, replica_name, + part.getUniqueId(), shared_id, part.info, replica_name, part.getDataPartStorage().getDiskType(), zookeeper, *getSettings(), log, zookeeper_path, format_version); } @@ -8298,11 +8301,10 @@ namespace /// But sometimes we need an opposite. When we deleting all_0_0_0_1 it can be non replicated to other replicas, so we are the only owner of this part. /// In this case when we will drop all_0_0_0_1 we will drop blobs for all_0_0_0. But it will lead to dataloss. For such case we need to check that other replicas /// still need parent part. -std::pair getParentLockedBlobs(const ZooKeeperWithFaultInjectionPtr & zookeeper_ptr, const std::string & zero_copy_part_path_prefix, const std::string & part_info_str, MergeTreeDataFormatVersion format_version, Poco::Logger * log) +std::pair getParentLockedBlobs(const ZooKeeperWithFaultInjectionPtr & zookeeper_ptr, const std::string & zero_copy_part_path_prefix, const MergeTreePartInfo & part_info, MergeTreeDataFormatVersion format_version, Poco::Logger * log) { NameSet files_not_to_remove; - MergeTreePartInfo part_info = MergeTreePartInfo::fromPartName(part_info_str, format_version); /// No mutations -- no hardlinks -- no issues if (part_info.mutation == 0) return {false, files_not_to_remove}; @@ -8336,7 +8338,7 @@ std::pair getParentLockedBlobs(const ZooKeeperWithFaultInjectionP /// We are mutation child of this parent if (part_info.isMutationChildOf(parent_candidate_info)) { - LOG_TRACE(log, "Found mutation parent {} for part {}", part_candidate_info_str, part_info_str); + LOG_TRACE(log, "Found mutation parent {} for part {}", part_candidate_info_str, part_info.getPartNameV1()); /// Get hardlinked files String files_not_to_remove_str; Coordination::Error code; @@ -8359,12 +8361,14 @@ std::pair getParentLockedBlobs(const ZooKeeperWithFaultInjectionP } std::pair StorageReplicatedMergeTree::unlockSharedDataByID( - String part_id, const String & table_uuid, const String & part_name, + String part_id, const String & table_uuid, const MergeTreePartInfo & part_info, const String & replica_name_, const std::string & disk_type, const ZooKeeperWithFaultInjectionPtr & zookeeper_ptr, const MergeTreeSettings & settings, Poco::Logger * logger, const String & zookeeper_path_old, MergeTreeDataFormatVersion data_format_version) { boost::replace_all(part_id, "/", "_"); + auto part_name = part_info.getPartNameV1(); + Strings zc_zookeeper_paths = getZeroCopyPartPath(settings, disk_type, table_uuid, part_name, zookeeper_path_old); bool part_has_no_more_locks = true; @@ -8380,7 +8384,7 @@ std::pair StorageReplicatedMergeTree::unlockSharedDataByID( boost::split(files_not_to_remove, files_not_to_remove_str, boost::is_any_of("\n ")); auto [has_parent, parent_not_to_remove] = getParentLockedBlobs( - zookeeper_ptr, fs::path(zc_zookeeper_path).parent_path(), part_name, data_format_version, logger); + zookeeper_ptr, fs::path(zc_zookeeper_path).parent_path(), part_info, data_format_version, logger); files_not_to_remove.insert(parent_not_to_remove.begin(), parent_not_to_remove.end()); String zookeeper_part_uniq_node = fs::path(zc_zookeeper_path) / part_id; @@ -9035,6 +9039,11 @@ bool StorageReplicatedMergeTree::removeSharedDetachedPart(DiskPtr disk, const St NameSet files_not_to_remove; + auto part_info = DetachedPartInfo::parseDetachedPartName(disk, part_name, MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING); + if (!part_info.valid_name) { + throw Exception(ErrorCodes::BAD_DATA_PART_NAME, "Invalid detached part name {} on disk {}", path, disk->getName()); + } + fs::path checksums = fs::path(path) / IMergeTreeDataPart::FILE_FOR_REFERENCES_CHECK; if (disk->exists(checksums)) { @@ -9043,7 +9052,7 @@ bool StorageReplicatedMergeTree::removeSharedDetachedPart(DiskPtr disk, const St String id = disk->getUniqueId(checksums); bool can_remove = false; std::tie(can_remove, files_not_to_remove) = StorageReplicatedMergeTree::unlockSharedDataByID( - id, table_uuid, part_name, + id, table_uuid, part_info, detached_replica_name, toString(disk->getDataSourceDescription().type), std::make_shared(zookeeper), local_context->getReplicatedMergeTreeSettings(), diff --git a/src/Storages/StorageReplicatedMergeTree.h b/src/Storages/StorageReplicatedMergeTree.h index e99af135133..ade4e4f0b4b 100644 --- a/src/Storages/StorageReplicatedMergeTree.h +++ b/src/Storages/StorageReplicatedMergeTree.h @@ -267,7 +267,7 @@ public: static std::pair unlockSharedDataByID( String part_id, const String & table_uuid, - const String & part_name, + const MergeTreePartInfo & part_info, const String & replica_name_, const std::string & disk_type, const ZooKeeperWithFaultInjectionPtr & zookeeper_, diff --git a/tests/integration/test_zero_copy_replication_drop_detached_part/__init__.py b/tests/integration/test_zero_copy_replication_drop_detached_part/__init__.py new file mode 100644 index 00000000000..e5a0d9b4834 --- /dev/null +++ b/tests/integration/test_zero_copy_replication_drop_detached_part/__init__.py @@ -0,0 +1 @@ +#!/usr/bin/env python3 diff --git a/tests/integration/test_zero_copy_replication_drop_detached_part/configs/storage_conf.xml b/tests/integration/test_zero_copy_replication_drop_detached_part/configs/storage_conf.xml new file mode 100644 index 00000000000..b08721c44e2 --- /dev/null +++ b/tests/integration/test_zero_copy_replication_drop_detached_part/configs/storage_conf.xml @@ -0,0 +1,30 @@ + + + test + + + + + + s3 + http://minio1:9001/root/data/ + minio + minio123 + + + + + +
+ s3 +
+
+
+
+
+ + + s3 + true + +
diff --git a/tests/integration/test_zero_copy_replication_drop_detached_part/test.py b/tests/integration/test_zero_copy_replication_drop_detached_part/test.py new file mode 100644 index 00000000000..0a94b88d192 --- /dev/null +++ b/tests/integration/test_zero_copy_replication_drop_detached_part/test.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +import logging +import random +import string +import time +import os + +from multiprocessing.dummy import Pool +import pytest +from helpers.cluster import ClickHouseCluster + + +cluster = ClickHouseCluster(__file__) + + +@pytest.fixture(scope="module") +def started_cluster(): + try: + cluster.add_instance( + "node1", + main_configs=["configs/storage_conf.xml"], + with_minio=True, + with_zookeeper=True, + ) + cluster.start() + + yield cluster + finally: + cluster.shutdown() + + +def test_drop_detached_part(started_cluster): + node1 = cluster.instances["node1"] + + node1.query( + """ +CREATE TABLE test1 (EventDate Date, CounterID UInt32) +ENGINE = ReplicatedMergeTree('/clickhouse-tables/test1', 'r1') +ORDER BY (CounterID, EventDate)""" + ) + + node1.query( + "INSERT INTO test1 SELECT toDate('2023-01-01') + toIntervalDay(number), number + 1000 from system.numbers limit 20" + ) + node1.query("ALTER TABLE test1 DETACH PART 'all_0_0_0'") + + def get_path_to_detached_part(query_result): + part_to_disk = {} + for row in query_result.strip().split("\n"): + print(row) + return row + + path_to_detached_part = get_path_to_detached_part( + node1.query( + "SELECT path FROM system.detached_parts where table = 'test1'" + ) + ) + + new_part_name = "ignored_" + os.path.basename(path_to_detached_part) + new_path_to_detached_part_name = os.path.dirname(path_to_detached_part) + os.sep + new_part_name + + node1.exec_in_container( + [ + "bash", + "-c", + f"mv {path_to_detached_part} {new_path_to_detached_part_name}", + ], + privileged=True, + user="root") + + assert node1.query("SELECT path FROM system.detached_parts where table = 'test1'").strip() == new_path_to_detached_part_name + + node1.query(f"ALTER TABLE test1 DROP DETACHED PART '{new_part_name}'", settings={"allow_drop_detached": 1}) + + assert node1.query("SELECT path FROM system.detached_parts where table = 'test1'").strip() == "" \ No newline at end of file From 1deaf788f409a5824ffe123e2b133888e7bd7347 Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Mon, 17 Apr 2023 16:00:34 +0000 Subject: [PATCH 274/535] Fix: do not run test_store_cleanup_disk_s3 in parallel --- tests/integration/parallel_skip.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/parallel_skip.json b/tests/integration/parallel_skip.json index 5aca96467b4..e9089fcde73 100644 --- a/tests/integration/parallel_skip.json +++ b/tests/integration/parallel_skip.json @@ -31,6 +31,7 @@ "test_limited_replicated_fetches/test.py::test_limited_fetches", "test_materialized_mysql_database/test.py::test_network_partition_5_7", "test_materialized_mysql_database/test.py::test_network_partition_8_0", + "test_merge_tree_s3/test.py::test_store_cleanup_disk_s3", "test_mysql_database_engine/test.py::test_restart_server", "test_parts_delete_zookeeper/test.py::test_merge_doesnt_work_without_zookeeper", "test_quorum_inserts_parallel/test.py::test_parallel_quorum_actually_quorum", From c53f2b763f1fd9e9d8354c3d5cb046dbcfc6e398 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 17 Apr 2023 16:17:02 +0000 Subject: [PATCH 275/535] Automatic style fix --- .../test.py | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tests/integration/test_zero_copy_replication_drop_detached_part/test.py b/tests/integration/test_zero_copy_replication_drop_detached_part/test.py index 0a94b88d192..2ecf026d9fb 100644 --- a/tests/integration/test_zero_copy_replication_drop_detached_part/test.py +++ b/tests/integration/test_zero_copy_replication_drop_detached_part/test.py @@ -52,25 +52,39 @@ ORDER BY (CounterID, EventDate)""" return row path_to_detached_part = get_path_to_detached_part( - node1.query( - "SELECT path FROM system.detached_parts where table = 'test1'" - ) + node1.query("SELECT path FROM system.detached_parts where table = 'test1'") ) new_part_name = "ignored_" + os.path.basename(path_to_detached_part) - new_path_to_detached_part_name = os.path.dirname(path_to_detached_part) + os.sep + new_part_name + new_path_to_detached_part_name = ( + os.path.dirname(path_to_detached_part) + os.sep + new_part_name + ) node1.exec_in_container( - [ - "bash", - "-c", - f"mv {path_to_detached_part} {new_path_to_detached_part_name}", - ], - privileged=True, - user="root") + [ + "bash", + "-c", + f"mv {path_to_detached_part} {new_path_to_detached_part_name}", + ], + privileged=True, + user="root", + ) - assert node1.query("SELECT path FROM system.detached_parts where table = 'test1'").strip() == new_path_to_detached_part_name + assert ( + node1.query( + "SELECT path FROM system.detached_parts where table = 'test1'" + ).strip() + == new_path_to_detached_part_name + ) - node1.query(f"ALTER TABLE test1 DROP DETACHED PART '{new_part_name}'", settings={"allow_drop_detached": 1}) + node1.query( + f"ALTER TABLE test1 DROP DETACHED PART '{new_part_name}'", + settings={"allow_drop_detached": 1}, + ) - assert node1.query("SELECT path FROM system.detached_parts where table = 'test1'").strip() == "" \ No newline at end of file + assert ( + node1.query( + "SELECT path FROM system.detached_parts where table = 'test1'" + ).strip() + == "" + ) From fc4fd3e300f657995f5ce7759debc70fac392a9b Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Mon, 17 Apr 2023 18:21:56 +0200 Subject: [PATCH 276/535] Clarify setting description Co-authored-by: Vladimir C --- src/Core/Settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 87e765c6c72..72a83692663 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -302,7 +302,7 @@ class IColumn; M(Bool, http_skip_not_found_url_for_globs, true, "Skip url's for globs with HTTP_NOT_FOUND error", 0) \ M(Bool, optimize_throw_if_noop, false, "If setting is enabled and OPTIMIZE query didn't actually assign a merge then an explanatory exception is thrown", 0) \ M(Bool, use_index_for_in_with_subqueries, true, "Try using an index if there is a subquery or a table expression on the right side of the IN operator.", 0) \ - M(UInt64, use_index_for_in_with_subqueries_max_values, 0, "Don't use index of a table for filtering by right hand size of the IN operator if the size of set is larger than specified threshold. This allows to avoid performance degradation and higher memory usage due to preparation of additional data structures.", 0) \ + M(UInt64, use_index_for_in_with_subqueries_max_values, 0, "The maximum size of set in the right hand side of the IN operator to use table index for filtering. It allows to avoid performance degradation and higher memory usage due to preparation of additional data structures for large queries. Zero means no limit.", 0) \ M(Bool, joined_subquery_requires_alias, true, "Force joined subqueries and table functions to have aliases for correct name qualification.", 0) \ M(Bool, empty_result_for_aggregation_by_empty_set, false, "Return empty result when aggregating without keys on empty set.", 0) \ M(Bool, empty_result_for_aggregation_by_constant_keys_on_empty_set, true, "Return empty result when aggregating by constant keys on empty set.", 0) \ From 1d15fed184c29bd5c805b7a25d6e83b1ed39e3f1 Mon Sep 17 00:00:00 2001 From: DanRoscigno Date: Mon, 17 Apr 2023 12:25:38 -0400 Subject: [PATCH 277/535] spelling --- docs/en/sql-reference/transactions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/sql-reference/transactions.md b/docs/en/sql-reference/transactions.md index 94a30f015f1..68fbfe0b22a 100644 --- a/docs/en/sql-reference/transactions.md +++ b/docs/en/sql-reference/transactions.md @@ -6,7 +6,7 @@ slug: /en/guides/developer/transactional INSERT into one partition* in one table* of MergeTree* family up to max_insert_block_size rows* is transactional (ACID): - Atomic: INSERT is succeeded or rejected as a whole: if confirmation is sent to the client, all rows INSERTed; if error is sent to the client, no rows INSERTed. - Consistent: if there are no table constraints violated, then all rows in an INSERT are inserted and the INSERT succeeds; if constraints are violated, then no rows are inserted. -- Isolated: concurrent clients observe a consistent snapshot of the table–the state of the table either as if before INSERT or after successfull INSERT; no partial state is seen; +- Isolated: concurrent clients observe a consistent snapshot of the table–the state of the table either as if before INSERT or after successful INSERT; no partial state is seen; - Durable: successful INSERT is written to the filesystem before answering to the client, on single replica or multiple replicas (controlled by the `insert_quorum` setting), and ClickHouse can ask the OS to sync the filesystem data on the storage media (controlled by the `fsync_after_insert` setting). * If table has many partitions and INSERT covers many partitions–then insertion into every partition is transactional on its own; * INSERT into multiple tables with one statement is possible if materialized views are involved; @@ -104,7 +104,7 @@ See the [deployment](docs/en/deployment-guides/terminology.md) documentation for #### Verify that experimental transactions are enabled -Issue a `BEGIN TRANSACTION` forllowed by a `ROLLBACK` to verify that experimental transactions are enabled, and that ClickHouse Keeper is enabled as it is used to track transactions. +Issue a `BEGIN TRANSACTION` followed by a `ROLLBACK` to verify that experimental transactions are enabled, and that ClickHouse Keeper is enabled as it is used to track transactions. ```sql BEGIN TRANSACTION @@ -237,7 +237,7 @@ FROM mergetree_table ### Transactions introspection You can inspect transactions by querying the `system.transactions` table, but note that you cannot query that -table from a session that is in a transaction–open a second `clickhouse client` sesssion to query that table. +table from a session that is in a transaction–open a second `clickhouse client` session to query that table. ```sql SELECT * From bf302653c112b5c3712e63de0c443be3ac4894d5 Mon Sep 17 00:00:00 2001 From: DanRoscigno Date: Mon, 17 Apr 2023 12:30:57 -0400 Subject: [PATCH 278/535] add related words to aspell --- utils/check-style/aspell-ignore/en/aspell-dict.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/utils/check-style/aspell-ignore/en/aspell-dict.txt b/utils/check-style/aspell-ignore/en/aspell-dict.txt index 4eb0e9dc42d..effd48aebbd 100644 --- a/utils/check-style/aspell-ignore/en/aspell-dict.txt +++ b/utils/check-style/aspell-ignore/en/aspell-dict.txt @@ -56,6 +56,7 @@ Homebrew Homebrew's HorizontalDivide Hostname +INSERTed IPv IntN Integrations @@ -92,6 +93,7 @@ LineAsString LinksDeployment LowCardinality MEMTABLE +MVCC MSan MacOS Memcheck @@ -147,6 +149,7 @@ RowBinaryWithNames RowBinaryWithNamesAndTypes Runtime SATA +SELECTs SERIALIZABLE SIMD SMALLINT @@ -173,6 +176,7 @@ Testflows Tgz Toolset Tradeoff +Transactional TwoColumnList UBSan UInt @@ -204,6 +208,7 @@ analytics anonymized ansi async +atomicity autogeneration autostart avro @@ -296,6 +301,7 @@ flatbuffers fmtlib formatschema formatter +fsync fuzzer fuzzers gRPC @@ -514,6 +520,7 @@ tokenization toml toolchain toolset +transactional transactionally tskv tsv From 527572e7bd0a10c14515bbcec77949183ef75f7e Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 17 Apr 2023 16:51:22 +0000 Subject: [PATCH 279/535] Fix reading Date32 Parquet/Arrow column into not Date32 column --- .../Formats/Impl/ArrowColumnToCHColumn.cpp | 34 +++++++++++++----- .../02716_parquet_invalid_date32.reference | 2 ++ .../02716_parquet_invalid_date32.sh | 11 ++++++ .../data_parquet/02716_data.parquet | Bin 0 -> 529 bytes 4 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 tests/queries/0_stateless/02716_parquet_invalid_date32.reference create mode 100755 tests/queries/0_stateless/02716_parquet_invalid_date32.sh create mode 100644 tests/queries/0_stateless/data_parquet/02716_data.parquet diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index 3690a49d5ae..cabc8441b12 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -250,9 +250,15 @@ static ColumnWithTypeAndName readColumnWithBooleanData(std::shared_ptr & arrow_column, const String & column_name) +static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr & arrow_column, const String & column_name, const DataTypePtr & type_hint) { - auto internal_type = std::make_shared(); + DataTypePtr internal_type; + /// Make result type Date32 when requested type is actually Date32 or when we use schema inference + if (!type_hint || (type_hint && isDate32(*type_hint))) + internal_type = std::make_shared(); + else + internal_type = std::make_shared(); + auto internal_column = internal_type->createColumn(); PaddedPODArray & column_data = assert_cast &>(*internal_column).getData(); column_data.reserve(arrow_column->length()); @@ -261,14 +267,24 @@ static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr(*(arrow_column->chunk(chunk_i))); - for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + /// Check date range only when requested type is actually Date32 + if (isDate32(*internal_type)) { - Int32 days_num = static_cast(chunk.Value(value_i)); - if (days_num > DATE_LUT_MAX_EXTEND_DAY_NUM) - throw Exception{ErrorCodes::VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE, - "Input value {} of a column \"{}\" is greater than max allowed Date value, which is {}", days_num, column_name, DATE_LUT_MAX_DAY_NUM}; + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + Int32 days_num = static_cast(chunk.Value(value_i)); + if (days_num > DATE_LUT_MAX_EXTEND_DAY_NUM || days_num < -DAYNUM_OFFSET_EPOCH) + throw Exception{ErrorCodes::VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE, + "Input value {} of a column \"{}\" is out of allowed Date32 range, which is [{}, {}]", days_num, column_name, DAYNUM_OFFSET_EPOCH, DATE_LUT_MAX_EXTEND_DAY_NUM}; - column_data.emplace_back(days_num); + column_data.emplace_back(days_num); + } + } + else + { + std::shared_ptr buffer = chunk.data()->buffers[1]; + const auto * raw_data = reinterpret_cast(buffer->data()) + chunk.offset(); + column_data.insert_assume_reserved(raw_data, raw_data + chunk.length()); } } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -731,7 +747,7 @@ static ColumnWithTypeAndName readColumnFromArrowColumn( case arrow::Type::BOOL: return readColumnWithBooleanData(arrow_column, column_name); case arrow::Type::DATE32: - return readColumnWithDate32Data(arrow_column, column_name); + return readColumnWithDate32Data(arrow_column, column_name, type_hint); case arrow::Type::DATE64: return readColumnWithDate64Data(arrow_column, column_name); // ClickHouse writes Date as arrow UINT16 and DateTime as arrow UINT32, diff --git a/tests/queries/0_stateless/02716_parquet_invalid_date32.reference b/tests/queries/0_stateless/02716_parquet_invalid_date32.reference new file mode 100644 index 00000000000..1052b48e58c --- /dev/null +++ b/tests/queries/0_stateless/02716_parquet_invalid_date32.reference @@ -0,0 +1,2 @@ +1 +200000 diff --git a/tests/queries/0_stateless/02716_parquet_invalid_date32.sh b/tests/queries/0_stateless/02716_parquet_invalid_date32.sh new file mode 100755 index 00000000000..5b909eecc34 --- /dev/null +++ b/tests/queries/0_stateless/02716_parquet_invalid_date32.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Tags: no-fasttest + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +$CLICKHOUSE_LOCAL -q "select * from file('$CURDIR/data_parquet/02716_data.parquet', auto, 'date Date32')" 2>&1 | grep -c "VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE" + +$CLICKHOUSE_LOCAL -q "select * from file('$CURDIR/data_parquet/02716_data.parquet', auto, 'date Int32')" + diff --git a/tests/queries/0_stateless/data_parquet/02716_data.parquet b/tests/queries/0_stateless/data_parquet/02716_data.parquet new file mode 100644 index 0000000000000000000000000000000000000000..21875ca286c5b3136ff12411b6c837caab478840 GIT binary patch literal 529 zcmb_aO-sW-5S^?cRESWD6SA;}TpB#IwMBXn3QkJZV#PKf>M_(1rPbE7+P~q^qd&kO z=}e-a7f-&!yqPzjEIX#SgEm&s9ic*~0od-*&K4kG4ZQ|yRdmoXzAb8LJ=psZ0l;>k z*ec6X5WZUmmF`x-(Y}3~tW#8;@?I_P%?jIL<*z}y!IuCkSzcuVKwCGu;5)17UHXtn zM%7h0w(gGRT;VBgwE5qya;*w0eDN-THoi-7d~tPH9^rpj`+|dv7!xs!GolSe866X4 z)GtyLMMUS4>=O-zIsRsj1|nUGVUIbJ{!^L5m`HJn!LX=|3cYYkT~ Date: Mon, 17 Apr 2023 12:51:34 -0400 Subject: [PATCH 280/535] remove whitespace --- utils/check-style/aspell-ignore/en/aspell-dict.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/check-style/aspell-ignore/en/aspell-dict.txt b/utils/check-style/aspell-ignore/en/aspell-dict.txt index effd48aebbd..05f5f34eaa4 100644 --- a/utils/check-style/aspell-ignore/en/aspell-dict.txt +++ b/utils/check-style/aspell-ignore/en/aspell-dict.txt @@ -56,7 +56,7 @@ Homebrew Homebrew's HorizontalDivide Hostname -INSERTed +INSERTed IPv IntN Integrations From 7bc43e05b31aa9597faed8d7578309eb113f0ef8 Mon Sep 17 00:00:00 2001 From: DanRoscigno Date: Mon, 17 Apr 2023 12:55:06 -0400 Subject: [PATCH 281/535] remove whitespace --- utils/check-style/aspell-ignore/en/aspell-dict.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/utils/check-style/aspell-ignore/en/aspell-dict.txt b/utils/check-style/aspell-ignore/en/aspell-dict.txt index 05f5f34eaa4..c3153bff8e3 100644 --- a/utils/check-style/aspell-ignore/en/aspell-dict.txt +++ b/utils/check-style/aspell-ignore/en/aspell-dict.txt @@ -93,7 +93,7 @@ LineAsString LinksDeployment LowCardinality MEMTABLE -MVCC +MVCC MSan MacOS Memcheck @@ -149,7 +149,7 @@ RowBinaryWithNames RowBinaryWithNamesAndTypes Runtime SATA -SELECTs +SELECTs SERIALIZABLE SIMD SMALLINT @@ -176,7 +176,7 @@ Testflows Tgz Toolset Tradeoff -Transactional +Transactional TwoColumnList UBSan UInt @@ -208,7 +208,7 @@ analytics anonymized ansi async -atomicity +atomicity autogeneration autostart avro @@ -301,7 +301,7 @@ flatbuffers fmtlib formatschema formatter -fsync +fsync fuzzer fuzzers gRPC From c02882fd791f6521334d77b91996ce57ccd7bd78 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 01:05:08 +0800 Subject: [PATCH 282/535] [chore] add int128/256, uint128/256 for arrayDifference, arrayCumSum 1. add tests. Signed-off-by: clundro <859287553@qq.com> --- src/Functions/array/arrayCumSum.cpp | 61 +++++++++++-------- src/Functions/array/arrayDifference.cpp | 43 +++++++------ .../02716_int256_arrayfunc.reference | 19 ++++++ .../0_stateless/02716_int256_arrayfunc.sql | 19 ++++++ 4 files changed, 96 insertions(+), 46 deletions(-) create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.reference create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.sql diff --git a/src/Functions/array/arrayCumSum.cpp b/src/Functions/array/arrayCumSum.cpp index b1077bfb18b..86766e44143 100644 --- a/src/Functions/array/arrayCumSum.cpp +++ b/src/Functions/array/arrayCumSum.cpp @@ -29,15 +29,28 @@ struct ArrayCumSumImpl { WhichDataType which(expression_return); - if (which.isNativeUInt()) - return std::make_shared(std::make_shared()); + if (which.isUInt()) + { + if (which.isNativeUInt()) + return std::make_shared(std::make_shared()); + if (which.isUInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } - if (which.isNativeInt()) - return std::make_shared(std::make_shared()); + if (which.isInt()) + { + if (which.isNativeInt()) + return std::make_shared(std::make_shared()); + if (which.isInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } if (which.isFloat()) return std::make_shared(std::make_shared()); - if (which.isDecimal()) { UInt32 scale = getDecimalScale(*expression_return); @@ -54,8 +67,8 @@ struct ArrayCumSumImpl template - static void NO_SANITIZE_UNDEFINED implConst( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) + static void NO_SANITIZE_UNDEFINED + implConst(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -71,8 +84,8 @@ struct ArrayCumSumImpl } template - static void NO_SANITIZE_UNDEFINED implVector( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED + implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -136,35 +149,31 @@ struct ArrayCumSumImpl implVector(offsets.size(), offsets.data(), res_values.data(), data.data()); res_ptr = ColumnArray::create(std::move(res_nested), array.getOffsetsPtr()); return true; - } static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) { ColumnPtr res; - if (executeType< UInt8 , UInt64>(mapped, array, res) || - executeType< UInt16, UInt64>(mapped, array, res) || - executeType< UInt32, UInt64>(mapped, array, res) || - executeType< UInt64, UInt64>(mapped, array, res) || - executeType< Int8 , Int64>(mapped, array, res) || - executeType< Int16, Int64>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayCumSum: {}", mapped->getName()); } - }; -struct NameArrayCumSum { static constexpr auto name = "arrayCumSum"; }; +struct NameArrayCumSum +{ + static constexpr auto name = "arrayCumSum"; +}; using FunctionArrayCumSum = FunctionArrayMapped; REGISTER_FUNCTION(ArrayCumSum) diff --git a/src/Functions/array/arrayDifference.cpp b/src/Functions/array/arrayDifference.cpp index d210a2559a2..9dcc730d4f6 100644 --- a/src/Functions/array/arrayDifference.cpp +++ b/src/Functions/array/arrayDifference.cpp @@ -41,6 +41,12 @@ struct ArrayDifferenceImpl if (which.isUInt32() || which.isUInt64() || which.isInt32() || which.isInt64() || which.isDate32() || which.isDateTime()) return std::make_shared(std::make_shared()); + if (which.isUInt128() || which.isInt128()) + return std::make_shared(std::make_shared()); + + if (which.isUInt256() || which.isInt256()) + return std::make_shared(std::make_shared()); + if (which.isFloat32() || which.isFloat64()) return std::make_shared(std::make_shared()); @@ -55,7 +61,8 @@ struct ArrayDifferenceImpl return std::make_shared(std::make_shared>(precision, scale)); } - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); } @@ -82,9 +89,7 @@ struct ArrayDifferenceImpl ResultNativeType result_value; bool overflow = common::subOverflow( - static_cast(curr.value), - static_cast(prev.value), - result_value); + static_cast(curr.value), static_cast(prev.value), result_value); if (overflow) throw Exception(ErrorCodes::DECIMAL_OVERFLOW, "Decimal math overflow"); @@ -141,28 +146,26 @@ struct ArrayDifferenceImpl ColumnPtr res; mapped = mapped->convertToFullColumnIfConst(); - if (executeType< UInt8 , Int16>(mapped, array, res) || - executeType< UInt16, Int32>(mapped, array, res) || - executeType< UInt32, Int64>(mapped, array, res) || - executeType< UInt64, Int64>(mapped, array, res) || - executeType< Int8 , Int16>(mapped, array, res) || - executeType< Int16, Int32>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayDifference: {}", mapped->getName()); } }; -struct NameArrayDifference { static constexpr auto name = "arrayDifference"; }; +struct NameArrayDifference +{ + static constexpr auto name = "arrayDifference"; +}; using FunctionArrayDifference = FunctionArrayMapped; REGISTER_FUNCTION(ArrayDifference) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference new file mode 100644 index 00000000000..cce0afa05e8 --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -0,0 +1,19 @@ +[1,3] +[1,3] +[1,3] +[1,3] +[3,4,5] +[1,2] +Array(UInt128) +Array(Int128) +Array(UInt256) +Array(Int256) + +[0,2] +[0,2] +[0,2] +[0,2] +Array(Int128) +Array(Int128) +Array(Int256) +Array(Int256) \ No newline at end of file diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql new file mode 100644 index 00000000000..3d8122a8edc --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -0,0 +1,19 @@ +SELECT arrayCumSum([CAST('1', 'Int128'), 2]); +SELECT arrayCumSum([CAST('1', 'Int256'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt128'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt256'), 2]); +SELECT arrayCumSum([3, CAST('1', 'Int128'),CAST('1', 'Int256')]); +SELECT arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')]); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt256'), CAST('1', 'UInt128')])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')])); + +SELECT arrayDifference([CAST('1', 'Int256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt128'), 3]); +SELECT arrayDifference([CAST('1', 'Int128'), 3]); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); \ No newline at end of file From c32ab59a966971347485d0a16c3f90c3b608b795 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 01:05:08 +0800 Subject: [PATCH 283/535] [chore] add int128/256, uint128/256 for arrayDifference, arrayCumSum 1. add tests. Signed-off-by: clundro <859287553@qq.com> --- src/Functions/array/arrayCumSum.cpp | 61 +++++++++++-------- src/Functions/array/arrayDifference.cpp | 43 +++++++------ .../02716_int256_arrayfunc.reference | 19 ++++++ .../0_stateless/02716_int256_arrayfunc.sql | 19 ++++++ 4 files changed, 96 insertions(+), 46 deletions(-) create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.reference create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.sql diff --git a/src/Functions/array/arrayCumSum.cpp b/src/Functions/array/arrayCumSum.cpp index b1077bfb18b..86766e44143 100644 --- a/src/Functions/array/arrayCumSum.cpp +++ b/src/Functions/array/arrayCumSum.cpp @@ -29,15 +29,28 @@ struct ArrayCumSumImpl { WhichDataType which(expression_return); - if (which.isNativeUInt()) - return std::make_shared(std::make_shared()); + if (which.isUInt()) + { + if (which.isNativeUInt()) + return std::make_shared(std::make_shared()); + if (which.isUInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } - if (which.isNativeInt()) - return std::make_shared(std::make_shared()); + if (which.isInt()) + { + if (which.isNativeInt()) + return std::make_shared(std::make_shared()); + if (which.isInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } if (which.isFloat()) return std::make_shared(std::make_shared()); - if (which.isDecimal()) { UInt32 scale = getDecimalScale(*expression_return); @@ -54,8 +67,8 @@ struct ArrayCumSumImpl template - static void NO_SANITIZE_UNDEFINED implConst( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) + static void NO_SANITIZE_UNDEFINED + implConst(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -71,8 +84,8 @@ struct ArrayCumSumImpl } template - static void NO_SANITIZE_UNDEFINED implVector( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED + implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -136,35 +149,31 @@ struct ArrayCumSumImpl implVector(offsets.size(), offsets.data(), res_values.data(), data.data()); res_ptr = ColumnArray::create(std::move(res_nested), array.getOffsetsPtr()); return true; - } static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) { ColumnPtr res; - if (executeType< UInt8 , UInt64>(mapped, array, res) || - executeType< UInt16, UInt64>(mapped, array, res) || - executeType< UInt32, UInt64>(mapped, array, res) || - executeType< UInt64, UInt64>(mapped, array, res) || - executeType< Int8 , Int64>(mapped, array, res) || - executeType< Int16, Int64>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayCumSum: {}", mapped->getName()); } - }; -struct NameArrayCumSum { static constexpr auto name = "arrayCumSum"; }; +struct NameArrayCumSum +{ + static constexpr auto name = "arrayCumSum"; +}; using FunctionArrayCumSum = FunctionArrayMapped; REGISTER_FUNCTION(ArrayCumSum) diff --git a/src/Functions/array/arrayDifference.cpp b/src/Functions/array/arrayDifference.cpp index d210a2559a2..9dcc730d4f6 100644 --- a/src/Functions/array/arrayDifference.cpp +++ b/src/Functions/array/arrayDifference.cpp @@ -41,6 +41,12 @@ struct ArrayDifferenceImpl if (which.isUInt32() || which.isUInt64() || which.isInt32() || which.isInt64() || which.isDate32() || which.isDateTime()) return std::make_shared(std::make_shared()); + if (which.isUInt128() || which.isInt128()) + return std::make_shared(std::make_shared()); + + if (which.isUInt256() || which.isInt256()) + return std::make_shared(std::make_shared()); + if (which.isFloat32() || which.isFloat64()) return std::make_shared(std::make_shared()); @@ -55,7 +61,8 @@ struct ArrayDifferenceImpl return std::make_shared(std::make_shared>(precision, scale)); } - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); } @@ -82,9 +89,7 @@ struct ArrayDifferenceImpl ResultNativeType result_value; bool overflow = common::subOverflow( - static_cast(curr.value), - static_cast(prev.value), - result_value); + static_cast(curr.value), static_cast(prev.value), result_value); if (overflow) throw Exception(ErrorCodes::DECIMAL_OVERFLOW, "Decimal math overflow"); @@ -141,28 +146,26 @@ struct ArrayDifferenceImpl ColumnPtr res; mapped = mapped->convertToFullColumnIfConst(); - if (executeType< UInt8 , Int16>(mapped, array, res) || - executeType< UInt16, Int32>(mapped, array, res) || - executeType< UInt32, Int64>(mapped, array, res) || - executeType< UInt64, Int64>(mapped, array, res) || - executeType< Int8 , Int16>(mapped, array, res) || - executeType< Int16, Int32>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayDifference: {}", mapped->getName()); } }; -struct NameArrayDifference { static constexpr auto name = "arrayDifference"; }; +struct NameArrayDifference +{ + static constexpr auto name = "arrayDifference"; +}; using FunctionArrayDifference = FunctionArrayMapped; REGISTER_FUNCTION(ArrayDifference) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference new file mode 100644 index 00000000000..cce0afa05e8 --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -0,0 +1,19 @@ +[1,3] +[1,3] +[1,3] +[1,3] +[3,4,5] +[1,2] +Array(UInt128) +Array(Int128) +Array(UInt256) +Array(Int256) + +[0,2] +[0,2] +[0,2] +[0,2] +Array(Int128) +Array(Int128) +Array(Int256) +Array(Int256) \ No newline at end of file diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql new file mode 100644 index 00000000000..3d8122a8edc --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -0,0 +1,19 @@ +SELECT arrayCumSum([CAST('1', 'Int128'), 2]); +SELECT arrayCumSum([CAST('1', 'Int256'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt128'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt256'), 2]); +SELECT arrayCumSum([3, CAST('1', 'Int128'),CAST('1', 'Int256')]); +SELECT arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')]); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt256'), CAST('1', 'UInt128')])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')])); + +SELECT arrayDifference([CAST('1', 'Int256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt128'), 3]); +SELECT arrayDifference([CAST('1', 'Int128'), 3]); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); \ No newline at end of file From 447d6cf15315045b484eae00197c74816ca20949 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 01:36:38 +0800 Subject: [PATCH 284/535] [chore] add test for arrayCumSumNonNegative. Signed-off-by: clundro <859287553@qq.com> --- .../array/arrayCumSumNonNegative.cpp | 60 +++++++++++-------- .../02716_int256_arrayfunc.reference | 11 +++- .../0_stateless/02716_int256_arrayfunc.sql | 11 +++- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/Functions/array/arrayCumSumNonNegative.cpp b/src/Functions/array/arrayCumSumNonNegative.cpp index 6b20ad35afc..a06d06c246d 100644 --- a/src/Functions/array/arrayCumSumNonNegative.cpp +++ b/src/Functions/array/arrayCumSumNonNegative.cpp @@ -30,11 +30,25 @@ struct ArrayCumSumNonNegativeImpl { WhichDataType which(expression_return); - if (which.isNativeUInt()) - return std::make_shared(std::make_shared()); + if (which.isUInt()) + { + if (which.isNativeUInt()) + return std::make_shared(std::make_shared()); + if (which.isUInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } - if (which.isNativeInt()) - return std::make_shared(std::make_shared()); + if (which.isInt()) + { + if (which.isNativeInt()) + return std::make_shared(std::make_shared()); + if (which.isInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } if (which.isFloat()) return std::make_shared(std::make_shared()); @@ -50,14 +64,14 @@ struct ArrayCumSumNonNegativeImpl return std::make_shared(nested); } - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); } template - static void NO_SANITIZE_UNDEFINED implVector( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED + implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -100,7 +114,6 @@ struct ArrayCumSumNonNegativeImpl implVector(offsets.size(), offsets.data(), res_values.data(), data.data()); res_ptr = ColumnArray::create(std::move(res_nested), array.getOffsetsPtr()); return true; - } static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) @@ -108,28 +121,25 @@ struct ArrayCumSumNonNegativeImpl ColumnPtr res; mapped = mapped->convertToFullColumnIfConst(); - if (executeType< UInt8 , UInt64>(mapped, array, res) || - executeType< UInt16, UInt64>(mapped, array, res) || - executeType< UInt32, UInt64>(mapped, array, res) || - executeType< UInt64, UInt64>(mapped, array, res) || - executeType< Int8 , Int64>(mapped, array, res) || - executeType< Int16, Int64>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayCumSumNonNegativeImpl: {}", mapped->getName()); } - }; -struct NameArrayCumSumNonNegative { static constexpr auto name = "arrayCumSumNonNegative"; }; +struct NameArrayCumSumNonNegative +{ + static constexpr auto name = "arrayCumSumNonNegative"; +}; using FunctionArrayCumSumNonNegative = FunctionArrayMapped; REGISTER_FUNCTION(ArrayCumSumNonNegative) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference index cce0afa05e8..e4f45772de0 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.reference +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -8,7 +8,6 @@ Array(UInt128) Array(Int128) Array(UInt256) Array(Int256) - [0,2] [0,2] [0,2] @@ -16,4 +15,12 @@ Array(Int256) Array(Int128) Array(Int128) Array(Int256) -Array(Int256) \ No newline at end of file +Array(Int256) +[1,0] +[1,0] +[1,3] +[1,3] +Array(Int128) +Array(Int256) +Array(UInt128) +Array(UInt256) \ No newline at end of file diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql index 3d8122a8edc..3afa2fc8b46 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.sql +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -16,4 +16,13 @@ SELECT arrayDifference([CAST('1', 'Int128'), 3]); SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); -SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); \ No newline at end of file +SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); + +SELECT arrayCumSumNonNegative([CAST('1', 'Int128'), -2]); +SELECT arrayCumSumNonNegative([CAST('1', 'Int256'), -2]); +SELECT arrayCumSumNonNegative([CAST('1', 'UInt128'), 2]); +SELECT arrayCumSumNonNegative([CAST('1', 'UInt256'), 2]); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int128'), -2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int256'), -2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt128'), 2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); \ No newline at end of file From 634791852d3df8d485b90b1e9692baabc9f4f135 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 02:10:41 +0800 Subject: [PATCH 285/535] [doc] add doc for array func. Signed-off-by: clundro <859287553@qq.com> --- .../functions/array-functions.md | 209 +++++++++++------- 1 file changed, 123 insertions(+), 86 deletions(-) diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index 9d2f89c1837..fbf1904bd1e 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -18,7 +18,7 @@ empty([x]) An array is considered empty if it does not contain any elements. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT empty(arr) FROM TABLE;` transforms to `SELECT arr.size0 = 0 FROM TABLE;`. ::: @@ -26,11 +26,11 @@ The function also works for [strings](string-functions.md#empty) or [UUID](uuid- **Arguments** -- `[x]` — Input array. [Array](../data-types/array.md). +- `[x]` — Input array. [Array](../data-types/array.md). **Returned value** -- Returns `1` for an empty array or `0` for a non-empty array. +- Returns `1` for an empty array or `0` for a non-empty array. Type: [UInt8](../data-types/int-uint.md). @@ -62,7 +62,7 @@ notEmpty([x]) An array is considered non-empty if it contains at least one element. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT notEmpty(arr) FROM table` transforms to `SELECT arr.size0 != 0 FROM TABLE`. ::: @@ -70,11 +70,11 @@ The function also works for [strings](string-functions.md#notempty) or [UUID](uu **Arguments** -- `[x]` — Input array. [Array](../data-types/array.md). +- `[x]` — Input array. [Array](../data-types/array.md). **Returned value** -- Returns `1` for a non-empty array or `0` for an empty array. +- Returns `1` for a non-empty array or `0` for an empty array. Type: [UInt8](../data-types/int-uint.md). @@ -118,38 +118,41 @@ Accepts zero arguments and returns an empty array of the appropriate type. Accepts an empty array and returns a one-element array that is equal to the default value. - ## range(end), range(\[start, \] end \[, step\]) Returns an array of numbers from `start` to `end - 1` by `step`. The supported types are [UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64](../data-types/int-uint.md). **Syntax** + ``` sql range([start, ] end [, step]) ``` **Arguments** -- `start` — The first element of the array. Optional, required if `step` is used. Default value: 0. -- `end` — The number before which the array is constructed. Required. -- `step` — Determines the incremental step between each element in the array. Optional. Default value: 1. +- `start` — The first element of the array. Optional, required if `step` is used. Default value: 0. +- `end` — The number before which the array is constructed. Required. +- `step` — Determines the incremental step between each element in the array. Optional. Default value: 1. **Returned value** -- Array of numbers from `start` to `end - 1` by `step`. +- Array of numbers from `start` to `end - 1` by `step`. **Implementation details** -- All arguments `start`, `end`, `step` must be below data types: `UInt8`, `UInt16`, `UInt32`, `UInt64`,`Int8`, `Int16`, `Int32`, `Int64`, as well as elements of the returned array, which's type is a super type of all arguments's. -- An exception is thrown if query results in arrays with a total length of more than number of elements specified by the [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block) setting. +- All arguments `start`, `end`, `step` must be below data types: `UInt8`, `UInt16`, `UInt32`, `UInt64`,`Int8`, `Int16`, `Int32`, `Int64`, as well as elements of the returned array, which's type is a super type of all arguments's. +- An exception is thrown if query results in arrays with a total length of more than number of elements specified by the [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block) setting. **Examples** Query: + ``` sql SELECT range(5), range(1, 5), range(1, 5, 2), range(-1, 5, 2); ``` + Result: + ```txt ┌─range(5)────┬─range(1, 5)─┬─range(1, 5, 2)─┬─range(-1, 5, 2)─┐ │ [0,1,2,3,4] │ [1,2,3,4] │ [1,3] │ [-1,1,3] │ @@ -176,7 +179,7 @@ arrayConcat(arrays) **Arguments** -- `arrays` – Arbitrary number of arguments of [Array](../../sql-reference/data-types/array.md) type. +- `arrays` – Arbitrary number of arguments of [Array](../../sql-reference/data-types/array.md) type. **Example** @@ -226,19 +229,19 @@ hasAll(set, subset) **Arguments** -- `set` – Array of any type with a set of elements. -- `subset` – Array of any type with elements that should be tested to be a subset of `set`. +- `set` – Array of any type with a set of elements. +- `subset` – Array of any type with elements that should be tested to be a subset of `set`. **Return values** -- `1`, if `set` contains all of the elements from `subset`. -- `0`, otherwise. +- `1`, if `set` contains all of the elements from `subset`. +- `0`, otherwise. **Peculiar properties** -- An empty array is a subset of any array. -- `Null` processed as a value. -- Order of values in both of arrays does not matter. +- An empty array is a subset of any array. +- `Null` processed as a value. +- Order of values in both of arrays does not matter. **Examples** @@ -264,18 +267,18 @@ hasAny(array1, array2) **Arguments** -- `array1` – Array of any type with a set of elements. -- `array2` – Array of any type with a set of elements. +- `array1` – Array of any type with a set of elements. +- `array2` – Array of any type with a set of elements. **Return values** -- `1`, if `array1` and `array2` have one similar element at least. -- `0`, otherwise. +- `1`, if `array1` and `array2` have one similar element at least. +- `0`, otherwise. **Peculiar properties** -- `Null` processed as a value. -- Order of values in both of arrays does not matter. +- `Null` processed as a value. +- Order of values in both of arrays does not matter. **Examples** @@ -301,24 +304,25 @@ In other words, the functions will check whether all the elements of `array2` ar the `hasAll` function. In addition, it will check that the elements are observed in the same order in both `array1` and `array2`. For Example: + - `hasSubstr([1,2,3,4], [2,3])` returns 1. However, `hasSubstr([1,2,3,4], [3,2])` will return `0`. - `hasSubstr([1,2,3,4], [1,2,3])` returns 1. However, `hasSubstr([1,2,3,4], [1,2,4])` will return `0`. **Arguments** -- `array1` – Array of any type with a set of elements. -- `array2` – Array of any type with a set of elements. +- `array1` – Array of any type with a set of elements. +- `array2` – Array of any type with a set of elements. **Return values** -- `1`, if `array1` contains `array2`. -- `0`, otherwise. +- `1`, if `array1` contains `array2`. +- `0`, otherwise. **Peculiar properties** -- The function will return `1` if `array2` is empty. -- `Null` processed as a value. In other words `hasSubstr([1, 2, NULL, 3, 4], [2,3])` will return `0`. However, `hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])` will return `1` -- Order of values in both of arrays does matter. +- The function will return `1` if `array2` is empty. +- `Null` processed as a value. In other words `hasSubstr([1, 2, NULL, 3, 4], [2,3])` will return `0`. However, `hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])` will return `1` +- Order of values in both of arrays does matter. **Examples** @@ -484,7 +488,7 @@ arrayPopBack(array) **Arguments** -- `array` – Array. +- `array` – Array. **Example** @@ -508,7 +512,7 @@ arrayPopFront(array) **Arguments** -- `array` – Array. +- `array` – Array. **Example** @@ -532,8 +536,8 @@ arrayPushBack(array, single_value) **Arguments** -- `array` – Array. -- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. **Example** @@ -557,8 +561,8 @@ arrayPushFront(array, single_value) **Arguments** -- `array` – Array. -- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. **Example** @@ -582,11 +586,11 @@ arrayResize(array, size[, extender]) **Arguments:** -- `array` — Array. -- `size` — Required length of the array. - - If `size` is less than the original size of the array, the array is truncated from the right. -- If `size` is larger than the initial size of the array, the array is extended to the right with `extender` values or default values for the data type of the array items. -- `extender` — Value for extending an array. Can be `NULL`. +- `array` — Array. +- `size` — Required length of the array. + - If `size` is less than the original size of the array, the array is truncated from the right. +- If `size` is larger than the initial size of the array, the array is extended to the right with `extender` values or default values for the data type of the array items. +- `extender` — Value for extending an array. Can be `NULL`. **Returned value:** @@ -682,10 +686,10 @@ SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]); └───────────────────────────────────────────────────────────┘ ``` -- `-Inf` values are first in the array. -- `NULL` values are last in the array. -- `NaN` values are right before `NULL`. -- `Inf` values are right before `NaN`. +- `-Inf` values are first in the array. +- `NULL` values are last in the array. +- `NaN` values are right before `NULL`. +- `Inf` values are right before `NaN`. Note that `arraySort` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. In this case, sorting order is determined by the result of the lambda function applied to the elements of the array. @@ -739,7 +743,7 @@ SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; └─────────┘ ``` -:::note +:::note To improve sorting efficiency, the [Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform) is used. ::: @@ -783,10 +787,10 @@ SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res; └───────────────────────────────────────┘ ``` -- `Inf` values are first in the array. -- `NULL` values are last in the array. -- `NaN` values are right before `NULL`. -- `-Inf` values are right before `NaN`. +- `Inf` values are first in the array. +- `NULL` values are last in the array. +- `NaN` values are right before `NULL`. +- `-Inf` values are right before `NaN`. Note that the `arrayReverseSort` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. Example is shown below. @@ -802,8 +806,8 @@ SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res; The array is sorted in the following way: -1. At first, the source array (\[1, 2, 3\]) is sorted according to the result of the lambda function applied to the elements of the array. The result is an array \[3, 2, 1\]. -2. Array that is obtained on the previous step, is reversed. So, the final result is \[1, 2, 3\]. +1. At first, the source array (\[1, 2, 3\]) is sorted according to the result of the lambda function applied to the elements of the array. The result is an array \[3, 2, 1\]. +2. Array that is obtained on the previous step, is reversed. So, the final result is \[1, 2, 3\]. The lambda function can accept multiple arguments. In this case, you need to pass the `arrayReverseSort` function several arrays of identical length that the arguments of lambda function will correspond to. The resulting array will consist of elements from the first input array; elements from the next input array(s) specify the sorting keys. For example: @@ -819,8 +823,8 @@ SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; In this example, the array is sorted in the following way: -1. At first, the source array (\[‘hello’, ‘world’\]) is sorted according to the result of the lambda function applied to the elements of the arrays. The elements that are passed in the second array (\[2, 1\]), define the sorting keys for corresponding elements from the source array. The result is an array \[‘world’, ‘hello’\]. -2. Array that was sorted on the previous step, is reversed. So, the final result is \[‘hello’, ‘world’\]. +1. At first, the source array (\[‘hello’, ‘world’\]) is sorted according to the result of the lambda function applied to the elements of the arrays. The elements that are passed in the second array (\[2, 1\]), define the sorting keys for corresponding elements from the source array. The result is an array \[‘world’, ‘hello’\]. +2. Array that was sorted on the previous step, is reversed. So, the final result is \[‘hello’, ‘world’\]. Other examples are shown below. @@ -867,7 +871,7 @@ arrayDifference(array) **Arguments** -- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). +- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). **Returned values** @@ -919,7 +923,7 @@ arrayDistinct(array) **Arguments** -- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). +- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). **Returned values** @@ -987,8 +991,8 @@ arrayReduce(agg_func, arr1, arr2, ..., arrN) **Arguments** -- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). -- `arr` — Any number of [array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. +- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). +- `arr` — Any number of [array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. **Returned value** @@ -1052,13 +1056,13 @@ arrayReduceInRanges(agg_func, ranges, arr1, arr2, ..., arrN) **Arguments** -- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). -- `ranges` — The ranges to aggretate which should be an [array](../../sql-reference/data-types/array.md) of [tuples](../../sql-reference/data-types/tuple.md) which containing the index and the length of each range. -- `arr` — Any number of [Array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. +- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). +- `ranges` — The ranges to aggretate which should be an [array](../../sql-reference/data-types/array.md) of [tuples](../../sql-reference/data-types/tuple.md) which containing the index and the length of each range. +- `arr` — Any number of [Array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. **Returned value** -- Array containing results of the aggregate function over specified ranges. +- Array containing results of the aggregate function over specified ranges. Type: [Array](../../sql-reference/data-types/array.md). @@ -1108,8 +1112,8 @@ Converts an array of arrays to a flat array. Function: -- Applies to any depth of nested arrays. -- Does not change arrays that are already flat. +- Applies to any depth of nested arrays. +- Does not change arrays that are already flat. The flattened array contains all the elements from all source arrays. @@ -1123,7 +1127,7 @@ Alias: `flatten`. **Arguments** -- `array_of_arrays` — [Array](../../sql-reference/data-types/array.md) of arrays. For example, `[[1,2,3], [4,5]]`. +- `array_of_arrays` — [Array](../../sql-reference/data-types/array.md) of arrays. For example, `[[1,2,3], [4,5]]`. **Examples** @@ -1185,13 +1189,13 @@ arrayZip(arr1, arr2, ..., arrN) **Arguments** -- `arrN` — [Array](../../sql-reference/data-types/array.md). +- `arrN` — [Array](../../sql-reference/data-types/array.md). The function can take any number of arrays of different types. All the input arrays must be of equal size. **Returned value** -- Array with elements from the source arrays grouped into [tuples](../../sql-reference/data-types/tuple.md). Data types in the tuple are the same as types of the input arrays and in the same order as arrays are passed. +- Array with elements from the source arrays grouped into [tuples](../../sql-reference/data-types/tuple.md). Data types in the tuple are the same as types of the input arrays and in the same order as arrays are passed. Type: [Array](../../sql-reference/data-types/array.md). @@ -1213,7 +1217,7 @@ Result: ## arrayAUC -Calculate AUC (Area Under the Curve, which is a concept in machine learning, see more details: https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve). +Calculate AUC (Area Under the Curve, which is a concept in machine learning, see more details: ). **Syntax** @@ -1433,12 +1437,12 @@ arrayMin([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The minimum of function values (or the array minimum). +- The minimum of function values (or the array minimum). Type: if `func` is specified, matches `func` return value type, else matches the array elements type. @@ -1488,12 +1492,12 @@ arrayMax([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The maximum of function values (or the array maximum). +- The maximum of function values (or the array maximum). Type: if `func` is specified, matches `func` return value type, else matches the array elements type. @@ -1543,12 +1547,12 @@ arraySum([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The sum of the function values (or the array sum). +- The sum of the function values (or the array sum). Type: for decimal numbers in source array (or for converted values, if `func` is specified) — [Decimal128](../../sql-reference/data-types/decimal.md), for floating point numbers — [Float64](../../sql-reference/data-types/float.md), for numeric unsigned — [UInt64](../../sql-reference/data-types/int-uint.md), and for numeric signed — [Int64](../../sql-reference/data-types/int-uint.md). @@ -1598,12 +1602,12 @@ arrayAvg([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The average of function values (or the array average). +- The average of function values (or the array average). Type: [Float64](../../sql-reference/data-types/float.md). @@ -1641,6 +1645,22 @@ Result: Returns an array of partial sums of elements in the source array (a running sum). If the `func` function is specified, then the values of the array elements are converted by `func(arr1[i], …, arrN[i])` before summing. +**Syntax** + +``` sql +arrayCumSum(arr) +``` + +**Arguments** + +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. + +**Returned value** + +- Returns an array of partial sums of elements in the source array. + +Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). + Example: ``` sql @@ -1659,6 +1679,22 @@ Note that the `arrayCumSum` is a [higher-order function](../../sql-reference/fun Same as `arrayCumSum`, returns an array of partial sums of elements in the source array (a running sum). Different `arrayCumSum`, when then returned value contains a value less than zero, the value is replace with zero and the subsequent calculation is performed with zero parameters. For example: +**Syntax** + +``` sql +arrayCumSumNonNegative(arr) +``` + +**Arguments** + +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. + +**Returned value** + +- Returns an array of non-negative partial sums of elements in the source array. + +Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). + ``` sql SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res ``` @@ -1668,6 +1704,7 @@ SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res │ [1,2,0,1] │ └───────────┘ ``` + Note that the `arraySumNonNegative` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. ## arrayProduct @@ -1682,11 +1719,11 @@ arrayProduct(arr) **Arguments** -- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. **Returned value** -- A product of array's elements. +- A product of array's elements. Type: [Float64](../../sql-reference/data-types/float.md). From ca8f3a10b01694fd9f862c47d4a6c13fec2263fc Mon Sep 17 00:00:00 2001 From: alesapin Date: Mon, 17 Apr 2023 20:20:39 +0200 Subject: [PATCH 286/535] Update src/Storages/StorageReplicatedMergeTree.cpp --- src/Storages/StorageReplicatedMergeTree.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 36fbfa1b579..5eded966aba 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -9040,7 +9040,8 @@ bool StorageReplicatedMergeTree::removeSharedDetachedPart(DiskPtr disk, const St NameSet files_not_to_remove; auto part_info = DetachedPartInfo::parseDetachedPartName(disk, part_name, MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING); - if (!part_info.valid_name) { + if (!part_info.valid_name) + { throw Exception(ErrorCodes::BAD_DATA_PART_NAME, "Invalid detached part name {} on disk {}", path, disk->getName()); } From be0b0e79213aba34f00be5b1162a16ad7a4bf00a Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:58:19 +0200 Subject: [PATCH 287/535] Fix build --- src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index cabc8441b12..fe3f3cacb8b 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -287,7 +287,7 @@ static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr Date: Mon, 17 Apr 2023 20:14:00 +0100 Subject: [PATCH 288/535] Client: disable indent_multiline mode for Replxx history --- src/Client/ReplxxLineReader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Client/ReplxxLineReader.cpp b/src/Client/ReplxxLineReader.cpp index 180be77ca1c..e691105ecba 100644 --- a/src/Client/ReplxxLineReader.cpp +++ b/src/Client/ReplxxLineReader.cpp @@ -335,6 +335,7 @@ ReplxxLineReader::ReplxxLineReader( rx.set_complete_on_empty(false); rx.set_word_break_characters(word_break_characters); rx.set_ignore_case(true); + rx.set_indent_multiline(false); if (highlighter) rx.set_highlighter_callback(highlighter); From 3bbc347901b093314450e0e526e4acbffb5b461b Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Mon, 17 Apr 2023 22:22:26 +0200 Subject: [PATCH 289/535] Fix build --- src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index fe3f3cacb8b..c8b242804e8 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -287,7 +287,7 @@ static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr Date: Tue, 18 Apr 2023 00:22:52 +0200 Subject: [PATCH 290/535] Fix style --- src/Storages/StorageReplicatedMergeTree.cpp | 48 ++++++++++----------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 5eded966aba..135cfee9aee 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -14,37 +14,40 @@ #include #include #include -#include #include #include #include -#include #include -#include +#include +#include +#include +#include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include +#include +#include +#include #include #include @@ -96,9 +99,6 @@ #include #include -#include "MergeTree/MergeTreeDataFormatVersion.h" -#include "MergeTree/MergeTreePartInfo.h" -#include #include #include @@ -9040,10 +9040,8 @@ bool StorageReplicatedMergeTree::removeSharedDetachedPart(DiskPtr disk, const St NameSet files_not_to_remove; auto part_info = DetachedPartInfo::parseDetachedPartName(disk, part_name, MERGE_TREE_DATA_MIN_FORMAT_VERSION_WITH_CUSTOM_PARTITIONING); - if (!part_info.valid_name) - { + if (!part_info.valid_name) throw Exception(ErrorCodes::BAD_DATA_PART_NAME, "Invalid detached part name {} on disk {}", path, disk->getName()); - } fs::path checksums = fs::path(path) / IMergeTreeDataPart::FILE_FOR_REFERENCES_CHECK; if (disk->exists(checksums)) From 55389def0450d9f967086b4e206a395523277605 Mon Sep 17 00:00:00 2001 From: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> Date: Mon, 17 Apr 2023 19:29:02 -0400 Subject: [PATCH 291/535] use Poco::Timestamp() instead of std::time --- src/Storages/WindowView/StorageWindowView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Storages/WindowView/StorageWindowView.cpp b/src/Storages/WindowView/StorageWindowView.cpp index f4181018f5e..f140cdf8294 100644 --- a/src/Storages/WindowView/StorageWindowView.cpp +++ b/src/Storages/WindowView/StorageWindowView.cpp @@ -1020,7 +1020,7 @@ void StorageWindowView::threadFuncFireProc() std::lock_guard lock(fire_signal_mutex); /// TODO: consider using time_t instead (for every timestamp in this class) - UInt32 timestamp_now = static_cast(std::time(nullptr)); + UInt32 timestamp_now = static_cast(Poco::Timestamp().epochMicroseconds() / 1000000); while (next_fire_signal <= timestamp_now) { From 6197d3d55fcfcaf60c3f0be5361b76d2e461a1d7 Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Tue, 18 Apr 2023 00:12:30 +0000 Subject: [PATCH 292/535] Pass volume only for analyzer --- docker/test/stateless/run.sh | 6 +----- docker/test/util/process_functional_tests_result.py | 4 ++-- tests/ci/functional_test_check.py | 5 ++++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docker/test/stateless/run.sh b/docker/test/stateless/run.sh index 6c8376b7676..e509809c028 100755 --- a/docker/test/stateless/run.sh +++ b/docker/test/stateless/run.sh @@ -156,11 +156,7 @@ ls -la ./ echo "Files in root directory" ls -la / -if [[ -n "$USE_NEW_ANALYZER" ]] && [[ "$USE_NEW_ANALYZER" -eq 1 ]]; then - /process_functional_tests_result.py --broken-tests=/broken_tests.txt || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv -else - /process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv -fi +/process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv clickhouse-client -q "system flush logs" ||: diff --git a/docker/test/util/process_functional_tests_result.py b/docker/test/util/process_functional_tests_result.py index 365a1b22523..59bec585681 100755 --- a/docker/test/util/process_functional_tests_result.py +++ b/docker/test/util/process_functional_tests_result.py @@ -201,11 +201,11 @@ if __name__ == "__main__": parser.add_argument("--in-results-dir", default="/test_output/") parser.add_argument("--out-results-file", default="/test_output/test_results.tsv") parser.add_argument("--out-status-file", default="/test_output/check_status.tsv") - parser.add_argument("--broken-tests", default="") + parser.add_argument("--broken-tests", default="/broken_tests.txt") args = parser.parse_args() broken_tests = list() - if len(args.broken_tests) != 0: + if os.path.exists(args.broken_tests): with open(args.broken_tests) as f: broken_tests = f.readlines() diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index 3a9951c1cdb..ce8deb206f7 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -73,6 +73,7 @@ def get_image_name(check_name): def get_run_command( + check_name, builds_path, repo_tests_path, result_path, @@ -105,11 +106,12 @@ def get_run_command( envs += [f"-e {e}" for e in additional_envs] env_str = " ".join(envs) + volume_with_broken_test = "--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt" if "analyzer" in check_name else "" return ( f"docker run --volume={builds_path}:/package_folder " f"--volume={repo_tests_path}:/usr/share/clickhouse-test " - f"--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt " + f"{volume_with_broken_test} " f"--volume={result_path}:/test_output --volume={server_log_path}:/var/log/clickhouse-server " f"--cap-add=SYS_PTRACE {env_str} {additional_options_str} {image}" ) @@ -325,6 +327,7 @@ def main(): additional_envs.append("GLOBAL_TAGS=no-random-settings") run_command = get_run_command( + check_name, packages_path, repo_tests_path, result_path, From f6127a68acf4d613e5b8e7d4bcfd6170f78c20ac Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 18 Apr 2023 00:56:29 +0000 Subject: [PATCH 293/535] Automatic style fix --- tests/ci/functional_test_check.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index ce8deb206f7..044eeb6fb2c 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -106,7 +106,11 @@ def get_run_command( envs += [f"-e {e}" for e in additional_envs] env_str = " ".join(envs) - volume_with_broken_test = "--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt" if "analyzer" in check_name else "" + volume_with_broken_test = ( + "--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt" + if "analyzer" in check_name + else "" + ) return ( f"docker run --volume={builds_path}:/package_folder " From a975211185094978833e74930b0a0dab513ad148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E6=B6=9B?= Date: Tue, 18 Apr 2023 10:26:35 +0800 Subject: [PATCH 294/535] add more tests --- src/Storages/MergeTree/MergeTreeData.cpp | 28 +++++++++---------- src/Storages/MergeTree/MergeTreeData.h | 2 -- .../02710_allow_suspicious_indices.sql | 10 ++++--- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 44fca62291e..49ad9f5493f 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -176,6 +176,19 @@ namespace ErrorCodes extern const int SOCKET_TIMEOUT; } +static void checkSuspiciousIndices(const ASTFunction & index_function) +{ + NameSet index_key_set; + for (const auto & child : index_function.arguments->children) + { + const auto & tree_hash = child->getTreeHash(); + const String key = toString(tree_hash.first); + + if (!index_key_set.emplace(key).second) + throw Exception(ErrorCodes::BAD_ARGUMENTS, + "Primary key or secondary indices contains duplicate expressios"); + } +} static void checkSampleExpression(const StorageInMemoryMetadata & metadata, bool allow_sampling_expression_not_in_primary_key, bool check_sample_column_is_correct) { @@ -1000,21 +1013,6 @@ std::optional MergeTreeData::totalRowsByPartitionPredicateImpl( return res; } -void MergeTreeData::checkSuspiciousIndices(const ASTFunction & index_function) const -{ - NameSet index_key_set; - for (const auto & child : index_function.arguments->children) - { - const auto & tree_hash = child->getTreeHash(); - const String key = toString(tree_hash.first); - - if (!index_key_set.emplace(key).second) - throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Primary key or secondary indices contains duplicate expressios"); - } -} - - String MergeTreeData::MergingParams::getModeName() const { switch (mode) diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index b0fe631891f..8312efa216d 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -431,8 +431,6 @@ public: bool supportsLightweightDelete() const override; - void checkSuspiciousIndices(const ASTFunction & index_funtion) const; - NamesAndTypesList getVirtuals() const override; bool mayBenefitFromIndexForIn(const ASTPtr & left_in_operand, ContextPtr, const StorageMetadataPtr & metadata_snapshot) const override; diff --git a/tests/queries/0_stateless/02710_allow_suspicious_indices.sql b/tests/queries/0_stateless/02710_allow_suspicious_indices.sql index b521a14a1f1..57dd381202c 100644 --- a/tests/queries/0_stateless/02710_allow_suspicious_indices.sql +++ b/tests/queries/0_stateless/02710_allow_suspicious_indices.sql @@ -3,12 +3,8 @@ CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by DROP TABLE IF EXISTS allow_suspicious_indices; CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by (id, id) settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } DROP TABLE IF EXISTS allow_suspicious_indices; -CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax GRANULARITY 1) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 1; -DROP TABLE IF EXISTS allow_suspicious_indices; CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 1; DROP TABLE IF EXISTS allow_suspicious_indices; -CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax GRANULARITY 1) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } -DROP TABLE IF EXISTS allow_suspicious_indices; CREATE TABLE allow_suspicious_indices (id UInt32, index idx (id, id) TYPE minmax) ENGINE = MergeTree() order by id settings allow_suspicious_indices = 0; -- { serverError BAD_ARGUMENTS } DROP TABLE IF EXISTS allow_suspicious_indices; CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 0; @@ -17,4 +13,10 @@ DROP TABLE IF EXISTS allow_suspicious_indices; CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 0; ALTER TABLE allow_suspicious_indices ADD COLUMN `id2` UInt32, MODIFY ORDER BY (id + 1, id2 + 1, id + 1); -- { serverError BAD_ARGUMENTS } DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 0; +ALTER TABLE allow_suspicious_indices ADD INDEX idx (id+1, id+1) type minmax; -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS allow_suspicious_indices; +CREATE TABLE allow_suspicious_indices (id UInt32) ENGINE = MergeTree() order by id + 1 settings allow_suspicious_indices = 1; +ALTER TABLE allow_suspicious_indices ADD INDEX idx (id+1, id+1) type minmax; +DROP TABLE IF EXISTS allow_suspicious_indices; From 4530e527d6fe1ae91f9197fbbb5f0df774cf764a Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 12:01:43 +0800 Subject: [PATCH 295/535] [tests] add new line Signed-off-by: clundro <859287553@qq.com> --- tests/queries/0_stateless/02716_int256_arrayfunc.reference | 2 +- tests/queries/0_stateless/02716_int256_arrayfunc.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference index e4f45772de0..4f6df732d50 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.reference +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -23,4 +23,4 @@ Array(Int256) Array(Int128) Array(Int256) Array(UInt128) -Array(UInt256) \ No newline at end of file +Array(UInt256) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql index 3afa2fc8b46..20721d228ac 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.sql +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -25,4 +25,4 @@ SELECT arrayCumSumNonNegative([CAST('1', 'UInt256'), 2]); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int128'), -2])); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int256'), -2])); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt128'), 2])); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); \ No newline at end of file +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); From a2c86619368348b96d94dd36060f823609fbdc9a Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 01:05:08 +0800 Subject: [PATCH 296/535] [chore] add int128/256, uint128/256 for arrayDifference, arrayCumSum 1. add tests. Signed-off-by: clundro <859287553@qq.com> --- src/Functions/array/arrayCumSum.cpp | 61 +++++++++++-------- src/Functions/array/arrayDifference.cpp | 43 +++++++------ .../02716_int256_arrayfunc.reference | 19 ++++++ .../0_stateless/02716_int256_arrayfunc.sql | 19 ++++++ 4 files changed, 96 insertions(+), 46 deletions(-) create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.reference create mode 100644 tests/queries/0_stateless/02716_int256_arrayfunc.sql diff --git a/src/Functions/array/arrayCumSum.cpp b/src/Functions/array/arrayCumSum.cpp index b1077bfb18b..86766e44143 100644 --- a/src/Functions/array/arrayCumSum.cpp +++ b/src/Functions/array/arrayCumSum.cpp @@ -29,15 +29,28 @@ struct ArrayCumSumImpl { WhichDataType which(expression_return); - if (which.isNativeUInt()) - return std::make_shared(std::make_shared()); + if (which.isUInt()) + { + if (which.isNativeUInt()) + return std::make_shared(std::make_shared()); + if (which.isUInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } - if (which.isNativeInt()) - return std::make_shared(std::make_shared()); + if (which.isInt()) + { + if (which.isNativeInt()) + return std::make_shared(std::make_shared()); + if (which.isInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } if (which.isFloat()) return std::make_shared(std::make_shared()); - if (which.isDecimal()) { UInt32 scale = getDecimalScale(*expression_return); @@ -54,8 +67,8 @@ struct ArrayCumSumImpl template - static void NO_SANITIZE_UNDEFINED implConst( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) + static void NO_SANITIZE_UNDEFINED + implConst(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -71,8 +84,8 @@ struct ArrayCumSumImpl } template - static void NO_SANITIZE_UNDEFINED implVector( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED + implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -136,35 +149,31 @@ struct ArrayCumSumImpl implVector(offsets.size(), offsets.data(), res_values.data(), data.data()); res_ptr = ColumnArray::create(std::move(res_nested), array.getOffsetsPtr()); return true; - } static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) { ColumnPtr res; - if (executeType< UInt8 , UInt64>(mapped, array, res) || - executeType< UInt16, UInt64>(mapped, array, res) || - executeType< UInt32, UInt64>(mapped, array, res) || - executeType< UInt64, UInt64>(mapped, array, res) || - executeType< Int8 , Int64>(mapped, array, res) || - executeType< Int16, Int64>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayCumSum: {}", mapped->getName()); } - }; -struct NameArrayCumSum { static constexpr auto name = "arrayCumSum"; }; +struct NameArrayCumSum +{ + static constexpr auto name = "arrayCumSum"; +}; using FunctionArrayCumSum = FunctionArrayMapped; REGISTER_FUNCTION(ArrayCumSum) diff --git a/src/Functions/array/arrayDifference.cpp b/src/Functions/array/arrayDifference.cpp index d210a2559a2..9dcc730d4f6 100644 --- a/src/Functions/array/arrayDifference.cpp +++ b/src/Functions/array/arrayDifference.cpp @@ -41,6 +41,12 @@ struct ArrayDifferenceImpl if (which.isUInt32() || which.isUInt64() || which.isInt32() || which.isInt64() || which.isDate32() || which.isDateTime()) return std::make_shared(std::make_shared()); + if (which.isUInt128() || which.isInt128()) + return std::make_shared(std::make_shared()); + + if (which.isUInt256() || which.isInt256()) + return std::make_shared(std::make_shared()); + if (which.isFloat32() || which.isFloat64()) return std::make_shared(std::make_shared()); @@ -55,7 +61,8 @@ struct ArrayDifferenceImpl return std::make_shared(std::make_shared>(precision, scale)); } - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayDifference cannot process values of type {}", expression_return->getName()); } @@ -82,9 +89,7 @@ struct ArrayDifferenceImpl ResultNativeType result_value; bool overflow = common::subOverflow( - static_cast(curr.value), - static_cast(prev.value), - result_value); + static_cast(curr.value), static_cast(prev.value), result_value); if (overflow) throw Exception(ErrorCodes::DECIMAL_OVERFLOW, "Decimal math overflow"); @@ -141,28 +146,26 @@ struct ArrayDifferenceImpl ColumnPtr res; mapped = mapped->convertToFullColumnIfConst(); - if (executeType< UInt8 , Int16>(mapped, array, res) || - executeType< UInt16, Int32>(mapped, array, res) || - executeType< UInt32, Int64>(mapped, array, res) || - executeType< UInt64, Int64>(mapped, array, res) || - executeType< Int8 , Int16>(mapped, array, res) || - executeType< Int16, Int32>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayDifference: {}", mapped->getName()); } }; -struct NameArrayDifference { static constexpr auto name = "arrayDifference"; }; +struct NameArrayDifference +{ + static constexpr auto name = "arrayDifference"; +}; using FunctionArrayDifference = FunctionArrayMapped; REGISTER_FUNCTION(ArrayDifference) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference new file mode 100644 index 00000000000..cce0afa05e8 --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -0,0 +1,19 @@ +[1,3] +[1,3] +[1,3] +[1,3] +[3,4,5] +[1,2] +Array(UInt128) +Array(Int128) +Array(UInt256) +Array(Int256) + +[0,2] +[0,2] +[0,2] +[0,2] +Array(Int128) +Array(Int128) +Array(Int256) +Array(Int256) \ No newline at end of file diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql new file mode 100644 index 00000000000..3d8122a8edc --- /dev/null +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -0,0 +1,19 @@ +SELECT arrayCumSum([CAST('1', 'Int128'), 2]); +SELECT arrayCumSum([CAST('1', 'Int256'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt128'), 2]); +SELECT arrayCumSum([CAST('1', 'UInt256'), 2]); +SELECT arrayCumSum([3, CAST('1', 'Int128'),CAST('1', 'Int256')]); +SELECT arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')]); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int128'), 2])); +SELECT toTypeName(arrayCumSum([CAST('1', 'UInt256'), CAST('1', 'UInt128')])); +SELECT toTypeName(arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')])); + +SELECT arrayDifference([CAST('1', 'Int256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt256'), 3]); +SELECT arrayDifference([CAST('1', 'UInt128'), 3]); +SELECT arrayDifference([CAST('1', 'Int128'), 3]); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); +SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); \ No newline at end of file From f5e07f84ff495cf2a01c74eb231fa7071a363783 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 01:36:38 +0800 Subject: [PATCH 297/535] [chore] add test for arrayCumSumNonNegative. Signed-off-by: clundro <859287553@qq.com> --- .../array/arrayCumSumNonNegative.cpp | 60 +++++++++++-------- .../02716_int256_arrayfunc.reference | 11 +++- .../0_stateless/02716_int256_arrayfunc.sql | 11 +++- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/Functions/array/arrayCumSumNonNegative.cpp b/src/Functions/array/arrayCumSumNonNegative.cpp index 6b20ad35afc..a06d06c246d 100644 --- a/src/Functions/array/arrayCumSumNonNegative.cpp +++ b/src/Functions/array/arrayCumSumNonNegative.cpp @@ -30,11 +30,25 @@ struct ArrayCumSumNonNegativeImpl { WhichDataType which(expression_return); - if (which.isNativeUInt()) - return std::make_shared(std::make_shared()); + if (which.isUInt()) + { + if (which.isNativeUInt()) + return std::make_shared(std::make_shared()); + if (which.isUInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } - if (which.isNativeInt()) - return std::make_shared(std::make_shared()); + if (which.isInt()) + { + if (which.isNativeInt()) + return std::make_shared(std::make_shared()); + if (which.isInt256()) + return std::make_shared(std::make_shared()); + else + return std::make_shared(std::make_shared()); + } if (which.isFloat()) return std::make_shared(std::make_shared()); @@ -50,14 +64,14 @@ struct ArrayCumSumNonNegativeImpl return std::make_shared(nested); } - throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, - "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); + throw Exception( + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); } template - static void NO_SANITIZE_UNDEFINED implVector( - size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED + implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -100,7 +114,6 @@ struct ArrayCumSumNonNegativeImpl implVector(offsets.size(), offsets.data(), res_values.data(), data.data()); res_ptr = ColumnArray::create(std::move(res_nested), array.getOffsetsPtr()); return true; - } static ColumnPtr execute(const ColumnArray & array, ColumnPtr mapped) @@ -108,28 +121,25 @@ struct ArrayCumSumNonNegativeImpl ColumnPtr res; mapped = mapped->convertToFullColumnIfConst(); - if (executeType< UInt8 , UInt64>(mapped, array, res) || - executeType< UInt16, UInt64>(mapped, array, res) || - executeType< UInt32, UInt64>(mapped, array, res) || - executeType< UInt64, UInt64>(mapped, array, res) || - executeType< Int8 , Int64>(mapped, array, res) || - executeType< Int16, Int64>(mapped, array, res) || - executeType< Int32, Int64>(mapped, array, res) || - executeType< Int64, Int64>(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res) || - executeType(mapped, array, res)) + if (executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res) + || executeType(mapped, array, res) || executeType(mapped, array, res)) return res; else throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Unexpected column for arrayCumSumNonNegativeImpl: {}", mapped->getName()); } - }; -struct NameArrayCumSumNonNegative { static constexpr auto name = "arrayCumSumNonNegative"; }; +struct NameArrayCumSumNonNegative +{ + static constexpr auto name = "arrayCumSumNonNegative"; +}; using FunctionArrayCumSumNonNegative = FunctionArrayMapped; REGISTER_FUNCTION(ArrayCumSumNonNegative) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference index cce0afa05e8..e4f45772de0 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.reference +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -8,7 +8,6 @@ Array(UInt128) Array(Int128) Array(UInt256) Array(Int256) - [0,2] [0,2] [0,2] @@ -16,4 +15,12 @@ Array(Int256) Array(Int128) Array(Int128) Array(Int256) -Array(Int256) \ No newline at end of file +Array(Int256) +[1,0] +[1,0] +[1,3] +[1,3] +Array(Int128) +Array(Int256) +Array(UInt128) +Array(UInt256) \ No newline at end of file diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql index 3d8122a8edc..3afa2fc8b46 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.sql +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -16,4 +16,13 @@ SELECT arrayDifference([CAST('1', 'Int128'), 3]); SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); -SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); \ No newline at end of file +SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); + +SELECT arrayCumSumNonNegative([CAST('1', 'Int128'), -2]); +SELECT arrayCumSumNonNegative([CAST('1', 'Int256'), -2]); +SELECT arrayCumSumNonNegative([CAST('1', 'UInt128'), 2]); +SELECT arrayCumSumNonNegative([CAST('1', 'UInt256'), 2]); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int128'), -2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int256'), -2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt128'), 2])); +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); \ No newline at end of file From 0ecb766de63f67f81a001b04a2b69b93ab106c05 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 02:10:41 +0800 Subject: [PATCH 298/535] [doc] add doc for array func. Signed-off-by: clundro <859287553@qq.com> --- .../functions/array-functions.md | 209 +++++++++++------- 1 file changed, 123 insertions(+), 86 deletions(-) diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index 9d2f89c1837..fbf1904bd1e 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -18,7 +18,7 @@ empty([x]) An array is considered empty if it does not contain any elements. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT empty(arr) FROM TABLE;` transforms to `SELECT arr.size0 = 0 FROM TABLE;`. ::: @@ -26,11 +26,11 @@ The function also works for [strings](string-functions.md#empty) or [UUID](uuid- **Arguments** -- `[x]` — Input array. [Array](../data-types/array.md). +- `[x]` — Input array. [Array](../data-types/array.md). **Returned value** -- Returns `1` for an empty array or `0` for a non-empty array. +- Returns `1` for an empty array or `0` for a non-empty array. Type: [UInt8](../data-types/int-uint.md). @@ -62,7 +62,7 @@ notEmpty([x]) An array is considered non-empty if it contains at least one element. -:::note +:::note Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [size0](../../sql-reference/data-types/array.md#array-size) subcolumn instead of reading and processing the whole array column. The query `SELECT notEmpty(arr) FROM table` transforms to `SELECT arr.size0 != 0 FROM TABLE`. ::: @@ -70,11 +70,11 @@ The function also works for [strings](string-functions.md#notempty) or [UUID](uu **Arguments** -- `[x]` — Input array. [Array](../data-types/array.md). +- `[x]` — Input array. [Array](../data-types/array.md). **Returned value** -- Returns `1` for a non-empty array or `0` for an empty array. +- Returns `1` for a non-empty array or `0` for an empty array. Type: [UInt8](../data-types/int-uint.md). @@ -118,38 +118,41 @@ Accepts zero arguments and returns an empty array of the appropriate type. Accepts an empty array and returns a one-element array that is equal to the default value. - ## range(end), range(\[start, \] end \[, step\]) Returns an array of numbers from `start` to `end - 1` by `step`. The supported types are [UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64](../data-types/int-uint.md). **Syntax** + ``` sql range([start, ] end [, step]) ``` **Arguments** -- `start` — The first element of the array. Optional, required if `step` is used. Default value: 0. -- `end` — The number before which the array is constructed. Required. -- `step` — Determines the incremental step between each element in the array. Optional. Default value: 1. +- `start` — The first element of the array. Optional, required if `step` is used. Default value: 0. +- `end` — The number before which the array is constructed. Required. +- `step` — Determines the incremental step between each element in the array. Optional. Default value: 1. **Returned value** -- Array of numbers from `start` to `end - 1` by `step`. +- Array of numbers from `start` to `end - 1` by `step`. **Implementation details** -- All arguments `start`, `end`, `step` must be below data types: `UInt8`, `UInt16`, `UInt32`, `UInt64`,`Int8`, `Int16`, `Int32`, `Int64`, as well as elements of the returned array, which's type is a super type of all arguments's. -- An exception is thrown if query results in arrays with a total length of more than number of elements specified by the [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block) setting. +- All arguments `start`, `end`, `step` must be below data types: `UInt8`, `UInt16`, `UInt32`, `UInt64`,`Int8`, `Int16`, `Int32`, `Int64`, as well as elements of the returned array, which's type is a super type of all arguments's. +- An exception is thrown if query results in arrays with a total length of more than number of elements specified by the [function_range_max_elements_in_block](../../operations/settings/settings.md#settings-function_range_max_elements_in_block) setting. **Examples** Query: + ``` sql SELECT range(5), range(1, 5), range(1, 5, 2), range(-1, 5, 2); ``` + Result: + ```txt ┌─range(5)────┬─range(1, 5)─┬─range(1, 5, 2)─┬─range(-1, 5, 2)─┐ │ [0,1,2,3,4] │ [1,2,3,4] │ [1,3] │ [-1,1,3] │ @@ -176,7 +179,7 @@ arrayConcat(arrays) **Arguments** -- `arrays` – Arbitrary number of arguments of [Array](../../sql-reference/data-types/array.md) type. +- `arrays` – Arbitrary number of arguments of [Array](../../sql-reference/data-types/array.md) type. **Example** @@ -226,19 +229,19 @@ hasAll(set, subset) **Arguments** -- `set` – Array of any type with a set of elements. -- `subset` – Array of any type with elements that should be tested to be a subset of `set`. +- `set` – Array of any type with a set of elements. +- `subset` – Array of any type with elements that should be tested to be a subset of `set`. **Return values** -- `1`, if `set` contains all of the elements from `subset`. -- `0`, otherwise. +- `1`, if `set` contains all of the elements from `subset`. +- `0`, otherwise. **Peculiar properties** -- An empty array is a subset of any array. -- `Null` processed as a value. -- Order of values in both of arrays does not matter. +- An empty array is a subset of any array. +- `Null` processed as a value. +- Order of values in both of arrays does not matter. **Examples** @@ -264,18 +267,18 @@ hasAny(array1, array2) **Arguments** -- `array1` – Array of any type with a set of elements. -- `array2` – Array of any type with a set of elements. +- `array1` – Array of any type with a set of elements. +- `array2` – Array of any type with a set of elements. **Return values** -- `1`, if `array1` and `array2` have one similar element at least. -- `0`, otherwise. +- `1`, if `array1` and `array2` have one similar element at least. +- `0`, otherwise. **Peculiar properties** -- `Null` processed as a value. -- Order of values in both of arrays does not matter. +- `Null` processed as a value. +- Order of values in both of arrays does not matter. **Examples** @@ -301,24 +304,25 @@ In other words, the functions will check whether all the elements of `array2` ar the `hasAll` function. In addition, it will check that the elements are observed in the same order in both `array1` and `array2`. For Example: + - `hasSubstr([1,2,3,4], [2,3])` returns 1. However, `hasSubstr([1,2,3,4], [3,2])` will return `0`. - `hasSubstr([1,2,3,4], [1,2,3])` returns 1. However, `hasSubstr([1,2,3,4], [1,2,4])` will return `0`. **Arguments** -- `array1` – Array of any type with a set of elements. -- `array2` – Array of any type with a set of elements. +- `array1` – Array of any type with a set of elements. +- `array2` – Array of any type with a set of elements. **Return values** -- `1`, if `array1` contains `array2`. -- `0`, otherwise. +- `1`, if `array1` contains `array2`. +- `0`, otherwise. **Peculiar properties** -- The function will return `1` if `array2` is empty. -- `Null` processed as a value. In other words `hasSubstr([1, 2, NULL, 3, 4], [2,3])` will return `0`. However, `hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])` will return `1` -- Order of values in both of arrays does matter. +- The function will return `1` if `array2` is empty. +- `Null` processed as a value. In other words `hasSubstr([1, 2, NULL, 3, 4], [2,3])` will return `0`. However, `hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])` will return `1` +- Order of values in both of arrays does matter. **Examples** @@ -484,7 +488,7 @@ arrayPopBack(array) **Arguments** -- `array` – Array. +- `array` – Array. **Example** @@ -508,7 +512,7 @@ arrayPopFront(array) **Arguments** -- `array` – Array. +- `array` – Array. **Example** @@ -532,8 +536,8 @@ arrayPushBack(array, single_value) **Arguments** -- `array` – Array. -- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. **Example** @@ -557,8 +561,8 @@ arrayPushFront(array, single_value) **Arguments** -- `array` – Array. -- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. +- `array` – Array. +- `single_value` – A single value. Only numbers can be added to an array with numbers, and only strings can be added to an array of strings. When adding numbers, ClickHouse automatically sets the `single_value` type for the data type of the array. For more information about the types of data in ClickHouse, see “[Data types](../../sql-reference/data-types/index.md#data_types)”. Can be `NULL`. The function adds a `NULL` element to an array, and the type of array elements converts to `Nullable`. **Example** @@ -582,11 +586,11 @@ arrayResize(array, size[, extender]) **Arguments:** -- `array` — Array. -- `size` — Required length of the array. - - If `size` is less than the original size of the array, the array is truncated from the right. -- If `size` is larger than the initial size of the array, the array is extended to the right with `extender` values or default values for the data type of the array items. -- `extender` — Value for extending an array. Can be `NULL`. +- `array` — Array. +- `size` — Required length of the array. + - If `size` is less than the original size of the array, the array is truncated from the right. +- If `size` is larger than the initial size of the array, the array is extended to the right with `extender` values or default values for the data type of the array items. +- `extender` — Value for extending an array. Can be `NULL`. **Returned value:** @@ -682,10 +686,10 @@ SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]); └───────────────────────────────────────────────────────────┘ ``` -- `-Inf` values are first in the array. -- `NULL` values are last in the array. -- `NaN` values are right before `NULL`. -- `Inf` values are right before `NaN`. +- `-Inf` values are first in the array. +- `NULL` values are last in the array. +- `NaN` values are right before `NULL`. +- `Inf` values are right before `NaN`. Note that `arraySort` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. In this case, sorting order is determined by the result of the lambda function applied to the elements of the array. @@ -739,7 +743,7 @@ SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; └─────────┘ ``` -:::note +:::note To improve sorting efficiency, the [Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform) is used. ::: @@ -783,10 +787,10 @@ SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res; └───────────────────────────────────────┘ ``` -- `Inf` values are first in the array. -- `NULL` values are last in the array. -- `NaN` values are right before `NULL`. -- `-Inf` values are right before `NaN`. +- `Inf` values are first in the array. +- `NULL` values are last in the array. +- `NaN` values are right before `NULL`. +- `-Inf` values are right before `NaN`. Note that the `arrayReverseSort` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. Example is shown below. @@ -802,8 +806,8 @@ SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res; The array is sorted in the following way: -1. At first, the source array (\[1, 2, 3\]) is sorted according to the result of the lambda function applied to the elements of the array. The result is an array \[3, 2, 1\]. -2. Array that is obtained on the previous step, is reversed. So, the final result is \[1, 2, 3\]. +1. At first, the source array (\[1, 2, 3\]) is sorted according to the result of the lambda function applied to the elements of the array. The result is an array \[3, 2, 1\]. +2. Array that is obtained on the previous step, is reversed. So, the final result is \[1, 2, 3\]. The lambda function can accept multiple arguments. In this case, you need to pass the `arrayReverseSort` function several arrays of identical length that the arguments of lambda function will correspond to. The resulting array will consist of elements from the first input array; elements from the next input array(s) specify the sorting keys. For example: @@ -819,8 +823,8 @@ SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; In this example, the array is sorted in the following way: -1. At first, the source array (\[‘hello’, ‘world’\]) is sorted according to the result of the lambda function applied to the elements of the arrays. The elements that are passed in the second array (\[2, 1\]), define the sorting keys for corresponding elements from the source array. The result is an array \[‘world’, ‘hello’\]. -2. Array that was sorted on the previous step, is reversed. So, the final result is \[‘hello’, ‘world’\]. +1. At first, the source array (\[‘hello’, ‘world’\]) is sorted according to the result of the lambda function applied to the elements of the arrays. The elements that are passed in the second array (\[2, 1\]), define the sorting keys for corresponding elements from the source array. The result is an array \[‘world’, ‘hello’\]. +2. Array that was sorted on the previous step, is reversed. So, the final result is \[‘hello’, ‘world’\]. Other examples are shown below. @@ -867,7 +871,7 @@ arrayDifference(array) **Arguments** -- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). +- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). **Returned values** @@ -919,7 +923,7 @@ arrayDistinct(array) **Arguments** -- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). +- `array` – [Array](https://clickhouse.com/docs/en/data_types/array/). **Returned values** @@ -987,8 +991,8 @@ arrayReduce(agg_func, arr1, arr2, ..., arrN) **Arguments** -- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). -- `arr` — Any number of [array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. +- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). +- `arr` — Any number of [array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. **Returned value** @@ -1052,13 +1056,13 @@ arrayReduceInRanges(agg_func, ranges, arr1, arr2, ..., arrN) **Arguments** -- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). -- `ranges` — The ranges to aggretate which should be an [array](../../sql-reference/data-types/array.md) of [tuples](../../sql-reference/data-types/tuple.md) which containing the index and the length of each range. -- `arr` — Any number of [Array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. +- `agg_func` — The name of an aggregate function which should be a constant [string](../../sql-reference/data-types/string.md). +- `ranges` — The ranges to aggretate which should be an [array](../../sql-reference/data-types/array.md) of [tuples](../../sql-reference/data-types/tuple.md) which containing the index and the length of each range. +- `arr` — Any number of [Array](../../sql-reference/data-types/array.md) type columns as the parameters of the aggregation function. **Returned value** -- Array containing results of the aggregate function over specified ranges. +- Array containing results of the aggregate function over specified ranges. Type: [Array](../../sql-reference/data-types/array.md). @@ -1108,8 +1112,8 @@ Converts an array of arrays to a flat array. Function: -- Applies to any depth of nested arrays. -- Does not change arrays that are already flat. +- Applies to any depth of nested arrays. +- Does not change arrays that are already flat. The flattened array contains all the elements from all source arrays. @@ -1123,7 +1127,7 @@ Alias: `flatten`. **Arguments** -- `array_of_arrays` — [Array](../../sql-reference/data-types/array.md) of arrays. For example, `[[1,2,3], [4,5]]`. +- `array_of_arrays` — [Array](../../sql-reference/data-types/array.md) of arrays. For example, `[[1,2,3], [4,5]]`. **Examples** @@ -1185,13 +1189,13 @@ arrayZip(arr1, arr2, ..., arrN) **Arguments** -- `arrN` — [Array](../../sql-reference/data-types/array.md). +- `arrN` — [Array](../../sql-reference/data-types/array.md). The function can take any number of arrays of different types. All the input arrays must be of equal size. **Returned value** -- Array with elements from the source arrays grouped into [tuples](../../sql-reference/data-types/tuple.md). Data types in the tuple are the same as types of the input arrays and in the same order as arrays are passed. +- Array with elements from the source arrays grouped into [tuples](../../sql-reference/data-types/tuple.md). Data types in the tuple are the same as types of the input arrays and in the same order as arrays are passed. Type: [Array](../../sql-reference/data-types/array.md). @@ -1213,7 +1217,7 @@ Result: ## arrayAUC -Calculate AUC (Area Under the Curve, which is a concept in machine learning, see more details: https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve). +Calculate AUC (Area Under the Curve, which is a concept in machine learning, see more details: ). **Syntax** @@ -1433,12 +1437,12 @@ arrayMin([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The minimum of function values (or the array minimum). +- The minimum of function values (or the array minimum). Type: if `func` is specified, matches `func` return value type, else matches the array elements type. @@ -1488,12 +1492,12 @@ arrayMax([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The maximum of function values (or the array maximum). +- The maximum of function values (or the array maximum). Type: if `func` is specified, matches `func` return value type, else matches the array elements type. @@ -1543,12 +1547,12 @@ arraySum([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The sum of the function values (or the array sum). +- The sum of the function values (or the array sum). Type: for decimal numbers in source array (or for converted values, if `func` is specified) — [Decimal128](../../sql-reference/data-types/decimal.md), for floating point numbers — [Float64](../../sql-reference/data-types/float.md), for numeric unsigned — [UInt64](../../sql-reference/data-types/int-uint.md), and for numeric signed — [Int64](../../sql-reference/data-types/int-uint.md). @@ -1598,12 +1602,12 @@ arrayAvg([func,] arr) **Arguments** -- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). -- `arr` — Array. [Array](../../sql-reference/data-types/array.md). +- `func` — Function. [Expression](../../sql-reference/data-types/special-data-types/expression.md). +- `arr` — Array. [Array](../../sql-reference/data-types/array.md). **Returned value** -- The average of function values (or the array average). +- The average of function values (or the array average). Type: [Float64](../../sql-reference/data-types/float.md). @@ -1641,6 +1645,22 @@ Result: Returns an array of partial sums of elements in the source array (a running sum). If the `func` function is specified, then the values of the array elements are converted by `func(arr1[i], …, arrN[i])` before summing. +**Syntax** + +``` sql +arrayCumSum(arr) +``` + +**Arguments** + +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. + +**Returned value** + +- Returns an array of partial sums of elements in the source array. + +Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). + Example: ``` sql @@ -1659,6 +1679,22 @@ Note that the `arrayCumSum` is a [higher-order function](../../sql-reference/fun Same as `arrayCumSum`, returns an array of partial sums of elements in the source array (a running sum). Different `arrayCumSum`, when then returned value contains a value less than zero, the value is replace with zero and the subsequent calculation is performed with zero parameters. For example: +**Syntax** + +``` sql +arrayCumSumNonNegative(arr) +``` + +**Arguments** + +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. + +**Returned value** + +- Returns an array of non-negative partial sums of elements in the source array. + +Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). + ``` sql SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res ``` @@ -1668,6 +1704,7 @@ SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res │ [1,2,0,1] │ └───────────┘ ``` + Note that the `arraySumNonNegative` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. ## arrayProduct @@ -1682,11 +1719,11 @@ arrayProduct(arr) **Arguments** -- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. +- `arr` — [Array](../../sql-reference/data-types/array.md) of numeric values. **Returned value** -- A product of array's elements. +- A product of array's elements. Type: [Float64](../../sql-reference/data-types/float.md). From 2b982bcc3d2c68f43795cb733e123dcb330ba894 Mon Sep 17 00:00:00 2001 From: clundro <859287553@qq.com> Date: Tue, 18 Apr 2023 12:01:43 +0800 Subject: [PATCH 299/535] [tests] add new line Signed-off-by: clundro <859287553@qq.com> --- tests/queries/0_stateless/02716_int256_arrayfunc.reference | 2 +- tests/queries/0_stateless/02716_int256_arrayfunc.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference index e4f45772de0..4f6df732d50 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.reference +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -23,4 +23,4 @@ Array(Int256) Array(Int128) Array(Int256) Array(UInt128) -Array(UInt256) \ No newline at end of file +Array(UInt256) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql index 3afa2fc8b46..20721d228ac 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.sql +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -25,4 +25,4 @@ SELECT arrayCumSumNonNegative([CAST('1', 'UInt256'), 2]); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int128'), -2])); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int256'), -2])); SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt128'), 2])); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); \ No newline at end of file +SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); From b929547ab20f069c8bfe49d776c3bf097650a00f Mon Sep 17 00:00:00 2001 From: Larry Luo Date: Mon, 17 Apr 2023 21:37:32 -0700 Subject: [PATCH 300/535] fix build without parquet --- src/Storages/DataLakes/DeltaLakeMetadataParser.cpp | 2 +- src/Storages/DataLakes/StorageDeltaLake.h | 2 +- src/Storages/DataLakes/registerDataLakes.cpp | 3 ++- src/Storages/registerStorages.cpp | 5 +++++ src/TableFunctions/TableFunctionDeltaLake.cpp | 2 +- src/TableFunctions/registerTableFunctions.cpp | 2 ++ src/TableFunctions/registerTableFunctions.h | 2 ++ 7 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Storages/DataLakes/DeltaLakeMetadataParser.cpp b/src/Storages/DataLakes/DeltaLakeMetadataParser.cpp index 4d4ff8ccbf8..45189ca325a 100644 --- a/src/Storages/DataLakes/DeltaLakeMetadataParser.cpp +++ b/src/Storages/DataLakes/DeltaLakeMetadataParser.cpp @@ -3,7 +3,7 @@ #include "config.h" #include -#if USE_AWS_S3 +#if USE_AWS_S3 && USE_PARQUET #include #include #include diff --git a/src/Storages/DataLakes/StorageDeltaLake.h b/src/Storages/DataLakes/StorageDeltaLake.h index 39312cadc6b..8b4ba28d6f7 100644 --- a/src/Storages/DataLakes/StorageDeltaLake.h +++ b/src/Storages/DataLakes/StorageDeltaLake.h @@ -18,7 +18,7 @@ struct StorageDeltaLakeName static constexpr auto name = "DeltaLake"; }; -#if USE_AWS_S3 +#if USE_AWS_S3 && USE_PARQUET using StorageDeltaLakeS3 = IStorageDataLake>; #endif diff --git a/src/Storages/DataLakes/registerDataLakes.cpp b/src/Storages/DataLakes/registerDataLakes.cpp index 46287b81d5a..508cf9c8d80 100644 --- a/src/Storages/DataLakes/registerDataLakes.cpp +++ b/src/Storages/DataLakes/registerDataLakes.cpp @@ -24,11 +24,12 @@ namespace DB .source_access_type = AccessType::S3, \ }); - +#if USE_PARQUET void registerStorageDeltaLake(StorageFactory & factory) { REGISTER_DATA_LAKE_STORAGE(StorageDeltaLakeS3, StorageDeltaLakeName::name) } +#endif void registerStorageIceberg(StorageFactory & factory) { diff --git a/src/Storages/registerStorages.cpp b/src/Storages/registerStorages.cpp index e690189c365..8be176a5375 100644 --- a/src/Storages/registerStorages.cpp +++ b/src/Storages/registerStorages.cpp @@ -34,7 +34,9 @@ void registerStorageS3(StorageFactory & factory); void registerStorageCOS(StorageFactory & factory); void registerStorageOSS(StorageFactory & factory); void registerStorageHudi(StorageFactory & factory); +#if USE_PARQUET void registerStorageDeltaLake(StorageFactory & factory); +#endif #if USE_AVRO void registerStorageIceberg(StorageFactory & factory); #endif @@ -126,7 +128,10 @@ void registerStorages() registerStorageCOS(factory); registerStorageOSS(factory); registerStorageHudi(factory); + + #if USE_PARQUET registerStorageDeltaLake(factory); + #endif #if USE_AVRO registerStorageIceberg(factory); diff --git a/src/TableFunctions/TableFunctionDeltaLake.cpp b/src/TableFunctions/TableFunctionDeltaLake.cpp index c273967342f..27ae9e6df2d 100644 --- a/src/TableFunctions/TableFunctionDeltaLake.cpp +++ b/src/TableFunctions/TableFunctionDeltaLake.cpp @@ -1,6 +1,6 @@ #include "config.h" -#if USE_AWS_S3 +#if USE_AWS_S3 && USE_PARQUET #include #include diff --git a/src/TableFunctions/registerTableFunctions.cpp b/src/TableFunctions/registerTableFunctions.cpp index 7b2b989e724..379b534f3e8 100644 --- a/src/TableFunctions/registerTableFunctions.cpp +++ b/src/TableFunctions/registerTableFunctions.cpp @@ -29,7 +29,9 @@ void registerTableFunctions() registerTableFunctionCOS(factory); registerTableFunctionOSS(factory); registerTableFunctionHudi(factory); +#if USE_PARQUET registerTableFunctionDeltaLake(factory); +#endif #if USE_AVRO registerTableFunctionIceberg(factory); #endif diff --git a/src/TableFunctions/registerTableFunctions.h b/src/TableFunctions/registerTableFunctions.h index 911aae199e2..b6a4172afca 100644 --- a/src/TableFunctions/registerTableFunctions.h +++ b/src/TableFunctions/registerTableFunctions.h @@ -26,7 +26,9 @@ void registerTableFunctionS3Cluster(TableFunctionFactory & factory); void registerTableFunctionCOS(TableFunctionFactory & factory); void registerTableFunctionOSS(TableFunctionFactory & factory); void registerTableFunctionHudi(TableFunctionFactory & factory); +#if USE_PARQUET void registerTableFunctionDeltaLake(TableFunctionFactory & factory); +#endif #if USE_AVRO void registerTableFunctionIceberg(TableFunctionFactory & factory); #endif From 5557f4524cb971e09577d5b9756f01024c13d221 Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Tue, 18 Apr 2023 08:44:46 +0000 Subject: [PATCH 301/535] Fix string formatting --- tests/ci/functional_test_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ci/functional_test_check.py b/tests/ci/functional_test_check.py index 044eeb6fb2c..813386bc0db 100644 --- a/tests/ci/functional_test_check.py +++ b/tests/ci/functional_test_check.py @@ -107,7 +107,7 @@ def get_run_command( env_str = " ".join(envs) volume_with_broken_test = ( - "--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt" + f"--volume={repo_tests_path}/broken_tests.txt:/broken_tests.txt" if "analyzer" in check_name else "" ) From 082c5b0224ad5d38ed7061472a86befd82fb6513 Mon Sep 17 00:00:00 2001 From: Youenn Lebras Date: Tue, 18 Apr 2023 10:55:56 +0200 Subject: [PATCH 302/535] Document the new feature of the ReplacingMergeTree engine of the PR #41005 --- .../mergetree-family/replacingmergetree.md | 13 +++++++++++-- docs/en/operations/settings/merge-tree-settings.md | 10 ++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md index 8351a31db55..eb0b0f4ea34 100644 --- a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md @@ -20,12 +20,12 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... -) ENGINE = ReplacingMergeTree([ver]) +) ENGINE = ReplacingMergeTree([ver [, is_del]]) [PARTITION BY expr] [ORDER BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] -[SETTINGS name=value, ...] +[SETTINGS name=value, clean_deleted_rows=value, ...] ``` For a description of request parameters, see [statement description](../../../sql-reference/statements/create/table.md). @@ -88,6 +88,15 @@ SELECT * FROM mySecondReplacingMT FINAL; └─────┴─────────┴─────────────────────┘ ``` +### is_del + +`is_del` — Name of the column with the type of row: `1` is a “deleted“ row, `0` is a “state“ row. + + Column data type — `Int8`. + + Can only be enabled when `ver` is used. + The row is deleted when use the `OPTIMIZE ... FINAL CLEANUP`, or `OPTIMIZE ... FINAL` if the engine settings `clean_deleted_rows` has been set to `Always`. + ## Query clauses When creating a `ReplacingMergeTree` table the same [clauses](../../../engines/table-engines/mergetree-family/mergetree.md) are required, as when creating a `MergeTree` table. diff --git a/docs/en/operations/settings/merge-tree-settings.md b/docs/en/operations/settings/merge-tree-settings.md index 4008b71ef8b..e8b14c10392 100644 --- a/docs/en/operations/settings/merge-tree-settings.md +++ b/docs/en/operations/settings/merge-tree-settings.md @@ -831,3 +831,13 @@ You can see which parts of `s` were stored using the sparse serialization: │ s │ Sparse │ └────────┴────────────────────┘ ``` + +## clean_deleted_rows + +Enable/disable automatic deletion of rows flagged as `is_deleted` when perform `OPTIMIZE ... FINAL` on a table using the ReplacingMergeTree engine. When disabled, the `CLEANUP` keyword has to be added to the `OPTIMIZE ... FINAL` to have the same behaviour. + +Possible values: + +- `Always` or `Never`. + +Default value: `Never` \ No newline at end of file From fecd58ca762a4ce6e6d50b47ec40671a27f41f11 Mon Sep 17 00:00:00 2001 From: Tyler Hannan Date: Tue, 18 Apr 2023 12:50:18 +0200 Subject: [PATCH 303/535] Update README.md updating release webinar date to 26 April --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e42c6d1a94..4f93a4a8b74 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ curl https://clickhouse.com/ | sh ## Upcoming Events * [**ClickHouse Spring Meetup in Manhattan**](https://www.meetup.com/clickhouse-new-york-user-group/events/292517734) - April 26 - It's spring, and it's time to meet again in the city! Talks include: "Building a domain specific query language on top of Clickhouse", "A Galaxy of Information", "Our Journey to ClickHouse Cloud from Redshift", and a ClickHouse update! -* [**v23.4 Release Webinar**](https://clickhouse.com/company/events/v23-4-release-webinar?utm_source=github&utm_medium=social&utm_campaign=release-webinar-2023-04) - April 27 - 23.4 is rapidly approaching. Original creator, co-founder, and CTO of ClickHouse Alexey Milovidov will walk us through the highlights of the release. +* [**v23.4 Release Webinar**](https://clickhouse.com/company/events/v23-4-release-webinar?utm_source=github&utm_medium=social&utm_campaign=release-webinar-2023-04) - April 26 - 23.4 is rapidly approaching. Original creator, co-founder, and CTO of ClickHouse Alexey Milovidov will walk us through the highlights of the release. ## Recent Recordings * **Recent Meetup Videos**: [Meetup Playlist](https://www.youtube.com/playlist?list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U) Whenever possible recordings of the ClickHouse Community Meetups are edited and presented as individual talks. Current featuring "Modern SQL in 2023", "Fast, Concurrent, and Consistent Asynchronous INSERTS in ClickHouse", and "Full-Text Indices: Design and Experiments" From 58ca460663c2b5d439c1db0864eaaa2a0517df05 Mon Sep 17 00:00:00 2001 From: Larry Luo Date: Tue, 18 Apr 2023 05:31:11 -0700 Subject: [PATCH 304/535] remove trailing spaces. --- src/TableFunctions/registerTableFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TableFunctions/registerTableFunctions.cpp b/src/TableFunctions/registerTableFunctions.cpp index 379b534f3e8..4a6019966dd 100644 --- a/src/TableFunctions/registerTableFunctions.cpp +++ b/src/TableFunctions/registerTableFunctions.cpp @@ -29,7 +29,7 @@ void registerTableFunctions() registerTableFunctionCOS(factory); registerTableFunctionOSS(factory); registerTableFunctionHudi(factory); -#if USE_PARQUET +#if USE_PARQUET registerTableFunctionDeltaLake(factory); #endif #if USE_AVRO From 066f5ac8fdd96d3b72aa009a13981ff6d590f4a4 Mon Sep 17 00:00:00 2001 From: Youenn Lebras Date: Tue, 18 Apr 2023 14:53:00 +0200 Subject: [PATCH 305/535] Renaming for clearer comprehension --- .../table-engines/mergetree-family/replacingmergetree.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md index eb0b0f4ea34..42f13b9889b 100644 --- a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md @@ -20,7 +20,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... -) ENGINE = ReplacingMergeTree([ver [, is_del]]) +) ENGINE = ReplacingMergeTree([ver [, is_deleted]]) [PARTITION BY expr] [ORDER BY expr] [PRIMARY KEY expr] @@ -88,14 +88,17 @@ SELECT * FROM mySecondReplacingMT FINAL; └─────┴─────────┴─────────────────────┘ ``` -### is_del +### is_deleted -`is_del` — Name of the column with the type of row: `1` is a “deleted“ row, `0` is a “state“ row. +`is_deleted` — Name of the column with the type of row: `1` is a “deleted“ row, `0` is a “state“ row. Column data type — `Int8`. Can only be enabled when `ver` is used. The row is deleted when use the `OPTIMIZE ... FINAL CLEANUP`, or `OPTIMIZE ... FINAL` if the engine settings `clean_deleted_rows` has been set to `Always`. + No matter the operation on the data, the version must be increased. If two inserted rows have the same version number, the last inserted one is the one kept. + + ## Query clauses From e356f92b77d9815be1a46ba636cbc8e4c16c0ed4 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 13:28:59 +0000 Subject: [PATCH 306/535] Add PrettyJSONEachRow format to output pretty JSON --- src/DataTypes/Serializations/ISerialization.h | 5 ++ .../Serializations/SerializationArray.cpp | 29 ++++++++ .../Serializations/SerializationArray.h | 1 + .../Serializations/SerializationMap.cpp | 37 ++++++++++ .../Serializations/SerializationMap.h | 1 + .../Serializations/SerializationObject.cpp | 42 ++++++++++- .../Serializations/SerializationObject.h | 5 +- .../Serializations/SerializationTuple.cpp | 35 +++++++++ .../Serializations/SerializationTuple.h | 1 + .../Serializations/SerializationWrapper.cpp | 5 ++ .../Serializations/SerializationWrapper.h | 2 + src/Formats/JSONUtils.cpp | 34 ++++++++- src/Formats/JSONUtils.h | 3 +- .../Impl/JSONEachRowRowOutputFormat.cpp | 32 +++++--- .../Formats/Impl/JSONEachRowRowOutputFormat.h | 4 +- .../0_stateless/02717_pretty_json.reference | 74 +++++++++++++++++++ .../queries/0_stateless/02717_pretty_json.sql | 3 + 17 files changed, 293 insertions(+), 20 deletions(-) create mode 100644 tests/queries/0_stateless/02717_pretty_json.reference create mode 100644 tests/queries/0_stateless/02717_pretty_json.sql diff --git a/src/DataTypes/Serializations/ISerialization.h b/src/DataTypes/Serializations/ISerialization.h index 470ed05c487..17e6dfb85bc 100644 --- a/src/DataTypes/Serializations/ISerialization.h +++ b/src/DataTypes/Serializations/ISerialization.h @@ -345,6 +345,11 @@ public: */ virtual void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const = 0; virtual void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const = 0; + virtual void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t /*indent*/) const + { + serializeTextJSON(column, row_num, ostr, settings); + } + /** Text serialization for putting into the XML format. */ diff --git a/src/DataTypes/Serializations/SerializationArray.cpp b/src/DataTypes/Serializations/SerializationArray.cpp index 5ed85cd1d1a..4a477958daa 100644 --- a/src/DataTypes/Serializations/SerializationArray.cpp +++ b/src/DataTypes/Serializations/SerializationArray.cpp @@ -520,6 +520,35 @@ void SerializationArray::serializeTextJSON(const IColumn & column, size_t row_nu writeChar(']', ostr); } +void SerializationArray::serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const +{ + const ColumnArray & column_array = assert_cast(column); + const ColumnArray::Offsets & offsets = column_array.getOffsets(); + + size_t offset = offsets[row_num - 1]; + size_t next_offset = offsets[row_num]; + + const IColumn & nested_column = column_array.getData(); + + if (offset == next_offset) + { + writeCString("[]", ostr); + return; + } + + writeCString("[\n", ostr); + for (size_t i = offset; i < next_offset; ++i) + { + if (i != offset) + writeCString(",\n", ostr); + writeChar(' ', (indent + 1) * 4, ostr); + nested->serializeTextJSONPretty(nested_column, i, ostr, settings, indent + 1); + } + writeChar('\n', ostr); + writeChar(' ', indent * 4, ostr); + writeChar(']', ostr); +} + void SerializationArray::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { diff --git a/src/DataTypes/Serializations/SerializationArray.h b/src/DataTypes/Serializations/SerializationArray.h index a5e10cd22fb..de331169db5 100644 --- a/src/DataTypes/Serializations/SerializationArray.h +++ b/src/DataTypes/Serializations/SerializationArray.h @@ -23,6 +23,7 @@ public: void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; + void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const override; void serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; diff --git a/src/DataTypes/Serializations/SerializationMap.cpp b/src/DataTypes/Serializations/SerializationMap.cpp index a176d4c0719..af1d96c4ca7 100644 --- a/src/DataTypes/Serializations/SerializationMap.cpp +++ b/src/DataTypes/Serializations/SerializationMap.cpp @@ -215,6 +215,43 @@ void SerializationMap::serializeTextJSON(const IColumn & column, size_t row_num, }); } +void SerializationMap::serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const +{ + const auto & column_map = assert_cast(column); + + const auto & nested_array = column_map.getNestedColumn(); + const auto & nested_tuple = column_map.getNestedData(); + const auto & offsets = nested_array.getOffsets(); + + size_t offset = offsets[row_num - 1]; + size_t next_offset = offsets[row_num]; + + if (offset == next_offset) + { + writeCString("{}", ostr); + return; + } + + writeCString("{\n", ostr); + for (size_t i = offset; i < next_offset; ++i) + { + if (i != offset) + writeCString(",\n", ostr); + + WriteBufferFromOwnString str_buf; + key->serializeText(nested_tuple.getColumn(0), i, str_buf, settings); + + writeChar(' ', (indent + 1) * 4, ostr); + writeJSONString(str_buf.str(), ostr, settings); + writeCString(": ", ostr); + value->serializeTextJSONPretty(nested_tuple.getColumn(1), i, ostr, settings, indent + 1); + } + writeChar('\n', ostr); + writeChar(' ', indent * 4, ostr); + writeChar('}', ostr); +} + + void SerializationMap::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { deserializeTextImpl(column, istr, diff --git a/src/DataTypes/Serializations/SerializationMap.h b/src/DataTypes/Serializations/SerializationMap.h index 556a50fbbc1..f32c656757d 100644 --- a/src/DataTypes/Serializations/SerializationMap.h +++ b/src/DataTypes/Serializations/SerializationMap.h @@ -26,6 +26,7 @@ public: void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings &, bool whole) const override; void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; + void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const override; void serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; void serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; diff --git a/src/DataTypes/Serializations/SerializationObject.cpp b/src/DataTypes/Serializations/SerializationObject.cpp index 3c718ded6dc..df9489213c8 100644 --- a/src/DataTypes/Serializations/SerializationObject.cpp +++ b/src/DataTypes/Serializations/SerializationObject.cpp @@ -422,8 +422,9 @@ void SerializationObject::serializeTextImpl(const IColumn & column, size } template +template void SerializationObject::serializeTextFromSubcolumn( - const ColumnObject::Subcolumn & subcolumn, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const + const ColumnObject::Subcolumn & subcolumn, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const { const auto & least_common_type = subcolumn.getLeastCommonType(); @@ -432,7 +433,10 @@ void SerializationObject::serializeTextFromSubcolumn( const auto & finalized_column = subcolumn.getFinalizedColumn(); auto info = least_common_type->getSerializationInfo(finalized_column); auto serialization = least_common_type->getSerialization(*info); - serialization->serializeTextJSON(finalized_column, row_num, ostr, settings); + if constexpr (pretty_json) + serialization->serializeTextJSONPretty(finalized_column, row_num, ostr, settings, indent); + else + serialization->serializeTextJSON(finalized_column, row_num, ostr, settings); return; } @@ -445,7 +449,10 @@ void SerializationObject::serializeTextFromSubcolumn( auto info = least_common_type->getSerializationInfo(*tmp_column); auto serialization = least_common_type->getSerialization(*info); - serialization->serializeTextJSON(*tmp_column, 0, ostr, settings); + if constexpr (pretty_json) + serialization->serializeTextJSONPretty(*tmp_column, 0, ostr, settings, indent); + else + serialization->serializeTextJSON(*tmp_column, 0, ostr, settings); return; } @@ -457,7 +464,10 @@ void SerializationObject::serializeTextFromSubcolumn( auto part_type = getDataTypeByColumn(*part); auto info = part_type->getSerializationInfo(*part); auto serialization = part_type->getSerialization(*info); - serialization->serializeTextJSON(*part, ind, ostr, settings); + if constexpr (pretty_json) + serialization->serializeTextJSONPretty(*part, ind, ostr, settings, indent); + else + serialization->serializeTextJSON(*part, ind, ostr, settings); return; } @@ -503,6 +513,30 @@ void SerializationObject::serializeTextCSV(const IColumn & column, size_ writeCSVString(ostr_str.str(), ostr); } +template +void SerializationObject::serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const +{ + const auto & column_object = assert_cast(column); + const auto & subcolumns = column_object.getSubcolumns(); + + writeCString("{\n", ostr); + for (auto it = subcolumns.begin(); it != subcolumns.end(); ++it) + { + const auto & entry = *it; + if (it != subcolumns.begin()) + writeCString(",\n", ostr); + + writeChar(' ', (indent + 1) * 4, ostr); + writeDoubleQuoted(entry->path.getPath(), ostr); + writeCString(": ", ostr); + serializeTextFromSubcolumn(entry->data, row_num, ostr, settings, indent + 1); + } + writeChar('\n', ostr); + writeChar(' ', indent * 4, ostr); + writeChar('}', ostr); +} + + SerializationPtr getObjectSerialization(const String & schema_format) { if (schema_format == "json") diff --git a/src/DataTypes/Serializations/SerializationObject.h b/src/DataTypes/Serializations/SerializationObject.h index 9cf56fcab96..de54f5739f5 100644 --- a/src/DataTypes/Serializations/SerializationObject.h +++ b/src/DataTypes/Serializations/SerializationObject.h @@ -66,6 +66,7 @@ public: void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override; void serializeTextQuoted(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override; void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override; + void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const override; void serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override; void deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override; @@ -105,7 +106,9 @@ private: void deserializeTextImpl(IColumn & column, Reader && reader) const; void serializeTextImpl(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const; - void serializeTextFromSubcolumn(const ColumnObject::Subcolumn & subcolumn, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const; + + template + void serializeTextFromSubcolumn(const ColumnObject::Subcolumn & subcolumn, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent = 0) const; /// Pool of parser objects to make SerializationObject thread safe. mutable SimpleObjectPool parsers_pool; diff --git a/src/DataTypes/Serializations/SerializationTuple.cpp b/src/DataTypes/Serializations/SerializationTuple.cpp index b963d35d785..7f3e7619b0d 100644 --- a/src/DataTypes/Serializations/SerializationTuple.cpp +++ b/src/DataTypes/Serializations/SerializationTuple.cpp @@ -185,6 +185,41 @@ void SerializationTuple::serializeTextJSON(const IColumn & column, size_t row_nu } } +void SerializationTuple::serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const +{ + if (settings.json.write_named_tuples_as_objects + && have_explicit_names) + { + writeCString("{\n", ostr); + for (size_t i = 0; i < elems.size(); ++i) + { + if (i != 0) + writeCString(",\n", ostr); + writeChar(' ', (indent + 1) * 4, ostr); + writeJSONString(elems[i]->getElementName(), ostr, settings); + writeCString(": ", ostr); + elems[i]->serializeTextJSONPretty(extractElementColumn(column, i), row_num, ostr, settings, indent + 1); + } + writeChar('\n', ostr); + writeChar(' ', indent * 4, ostr); + writeChar('}', ostr); + } + else + { + writeCString("[\n", ostr); + for (size_t i = 0; i < elems.size(); ++i) + { + if (i != 0) + writeCString(",\n", ostr); + writeChar(' ', (indent + 1) * 4, ostr); + elems[i]->serializeTextJSONPretty(extractElementColumn(column, i), row_num, ostr, settings, indent + 1); + } + writeChar('\n', ostr); + writeChar(' ', indent * 4, ostr); + writeChar(']', ostr); + } +} + void SerializationTuple::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { if (settings.json.read_named_tuples_as_objects diff --git a/src/DataTypes/Serializations/SerializationTuple.h b/src/DataTypes/Serializations/SerializationTuple.h index 5c177e3f0e8..7325259f440 100644 --- a/src/DataTypes/Serializations/SerializationTuple.h +++ b/src/DataTypes/Serializations/SerializationTuple.h @@ -25,6 +25,7 @@ public: void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings &, bool whole) const override; void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; + void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const override; void serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; /// Tuples in CSV format will be serialized as separate columns (that is, losing their nesting in the tuple). diff --git a/src/DataTypes/Serializations/SerializationWrapper.cpp b/src/DataTypes/Serializations/SerializationWrapper.cpp index ce598142ab2..18e4891ee65 100644 --- a/src/DataTypes/Serializations/SerializationWrapper.cpp +++ b/src/DataTypes/Serializations/SerializationWrapper.cpp @@ -136,6 +136,11 @@ void SerializationWrapper::deserializeTextJSON(IColumn & column, ReadBuffer & is nested_serialization->deserializeTextJSON(column, istr, settings); } +void SerializationWrapper::serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const +{ + nested_serialization->serializeTextJSONPretty(column, row_num, ostr, settings, indent); +} + void SerializationWrapper::serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const { nested_serialization->serializeTextXML(column, row_num, ostr, settings); diff --git a/src/DataTypes/Serializations/SerializationWrapper.h b/src/DataTypes/Serializations/SerializationWrapper.h index c141ff5e38d..bf922888af9 100644 --- a/src/DataTypes/Serializations/SerializationWrapper.h +++ b/src/DataTypes/Serializations/SerializationWrapper.h @@ -75,6 +75,8 @@ public: void serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; void deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override; + void serializeTextJSONPretty(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings, size_t indent) const override; + void serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override; }; diff --git a/src/Formats/JSONUtils.cpp b/src/Formats/JSONUtils.cpp index 6580d98fe98..284cffdb9d7 100644 --- a/src/Formats/JSONUtils.cpp +++ b/src/Formats/JSONUtils.cpp @@ -244,6 +244,15 @@ namespace JSONUtils writeCString(after_delimiter, out); } + void writeTitlePretty(const char * title, WriteBuffer & out, size_t indent, const char * after_delimiter) + { + writeChar(' ', indent * 4, out); + writeChar('"', out); + writeCString(title, out); + writeCString("\": ", out); + writeCString(after_delimiter, out); + } + void writeObjectStart(WriteBuffer & out, size_t indent, const char * title) { if (title) @@ -306,10 +315,20 @@ namespace JSONUtils WriteBuffer & out, const std::optional & name, size_t indent, - const char * title_after_delimiter) + const char * title_after_delimiter, + bool pretty_json) { if (name.has_value()) - writeTitle(name->data(), out, indent, title_after_delimiter); + { + if (pretty_json) + { + writeTitlePretty(name->data(), out, indent, title_after_delimiter); + } + else + { + writeTitle(name->data(), out, indent, title_after_delimiter); + } + } if (yield_strings) { @@ -319,7 +338,16 @@ namespace JSONUtils writeJSONString(buf.str(), out, settings); } else - serialization.serializeTextJSON(column, row_num, out, settings); + { + if (pretty_json) + { + serialization.serializeTextJSONPretty(column, row_num, out, settings, indent); + } + else + { + serialization.serializeTextJSON(column, row_num, out, settings); + } + } } void writeColumns( diff --git a/src/Formats/JSONUtils.h b/src/Formats/JSONUtils.h index 5835e364c2b..fd1ba7db980 100644 --- a/src/Formats/JSONUtils.h +++ b/src/Formats/JSONUtils.h @@ -73,7 +73,8 @@ namespace JSONUtils WriteBuffer & out, const std::optional & name = std::nullopt, size_t indent = 0, - const char * title_after_delimiter = " "); + const char * title_after_delimiter = " ", + bool pretty_json = false); void writeColumns( const Columns & columns, diff --git a/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.cpp b/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.cpp index 2e2209bb6e3..5b8f6cc1af7 100644 --- a/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.cpp +++ b/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.cpp @@ -12,9 +12,11 @@ namespace DB JSONEachRowRowOutputFormat::JSONEachRowRowOutputFormat( WriteBuffer & out_, const Block & header_, - const FormatSettings & settings_) + const FormatSettings & settings_, + bool pretty_json_) : RowOutputFormatWithUTF8ValidationAdaptor(settings_.json.validate_utf8, header_, out_), - settings(settings_) + pretty_json(pretty_json_), + settings(settings_) { fields = JSONUtils::makeNamesValidJSONStrings(getPort(PortKind::Main).getHeader().getNames(), settings, settings.json.validate_utf8); } @@ -22,7 +24,7 @@ JSONEachRowRowOutputFormat::JSONEachRowRowOutputFormat( void JSONEachRowRowOutputFormat::writeField(const IColumn & column, const ISerialization & serialization, size_t row_num) { - JSONUtils::writeFieldFromColumn(column, serialization, row_num, settings.json.serialize_as_strings, settings, *ostr, fields[field_number], 0, ""); + JSONUtils::writeFieldFromColumn(column, serialization, row_num, settings.json.serialize_as_strings, settings, *ostr, fields[field_number], pretty_json ? 1 : 0, "", pretty_json); ++field_number; } @@ -30,17 +32,24 @@ void JSONEachRowRowOutputFormat::writeField(const IColumn & column, const ISeria void JSONEachRowRowOutputFormat::writeFieldDelimiter() { writeChar(',', *ostr); + if (pretty_json) + writeChar('\n', *ostr); } void JSONEachRowRowOutputFormat::writeRowStartDelimiter() { writeChar('{', *ostr); + if (pretty_json) + writeChar('\n', *ostr); } void JSONEachRowRowOutputFormat::writeRowEndDelimiter() { + if (pretty_json) + writeChar('\n', *ostr); + if (settings.json.array_of_rows) writeChar('}', *ostr); else @@ -74,24 +83,27 @@ void JSONEachRowRowOutputFormat::writeSuffix() void registerOutputFormatJSONEachRow(FormatFactory & factory) { - auto register_function = [&](const String & format, bool serialize_as_strings) + auto register_function = [&](const String & format, bool serialize_as_strings, bool pretty_json) { - factory.registerOutputFormat(format, [serialize_as_strings]( + factory.registerOutputFormat(format, [serialize_as_strings, pretty_json]( WriteBuffer & buf, const Block & sample, const FormatSettings & _format_settings) { FormatSettings settings = _format_settings; settings.json.serialize_as_strings = serialize_as_strings; - return std::make_shared(buf, sample, settings); + return std::make_shared(buf, sample, settings, pretty_json); }); factory.markOutputFormatSupportsParallelFormatting(format); }; - register_function("JSONEachRow", false); - register_function("JSONLines", false); - register_function("NDJSON", false); - register_function("JSONStringsEachRow", true); + register_function("JSONEachRow", false, false); + register_function("PrettyJSONEachRow", false, true); + register_function("JSONLines", false, false); + register_function("PrettyJSONLines", false, true); + register_function("NDJSON", false, false); + register_function("PrettyNDJSON", false, true); + register_function("JSONStringsEachRow", true, false); } } diff --git a/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.h b/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.h index 62b8188cb4d..e05d189afe9 100644 --- a/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.h +++ b/src/Processors/Formats/Impl/JSONEachRowRowOutputFormat.h @@ -17,7 +17,8 @@ public: JSONEachRowRowOutputFormat( WriteBuffer & out_, const Block & header_, - const FormatSettings & settings_); + const FormatSettings & settings_, + bool pretty_json_ = false); String getName() const override { return "JSONEachRowRowOutputFormat"; } @@ -37,6 +38,7 @@ protected: void writeSuffix() override; size_t field_number = 0; + bool pretty_json; private: Names fields; diff --git a/tests/queries/0_stateless/02717_pretty_json.reference b/tests/queries/0_stateless/02717_pretty_json.reference new file mode 100644 index 00000000000..a8bd1b450e0 --- /dev/null +++ b/tests/queries/0_stateless/02717_pretty_json.reference @@ -0,0 +1,74 @@ +{ + "num": 42, + "arr": [ + 42, + 42 + ], + "nested_arr": [ + [ + [ + 42, + 42 + ], + [ + 42, + 42 + ] + ], + [ + [ + 42, + 42 + ] + ] + ], + "tuple": { + "a": 42, + "b": 42 + }, + "nested_tuple": { + "a": { + "b": { + "c": 42, + "d": 42 + }, + "e": 42 + }, + "f": 42 + }, + "map": { + "42": 42, + "24": 24 + }, + "nested_map": { + "42": { + "42": { + "42": 42 + } + } + }, + "nested_types": [ + [ + { + "42": 42 + }, + [ + 42, + 42 + ] + ], + [ + { + "42": 42 + }, + [ + 42, + 42 + ] + ] + ], + "json_object": { + "a.b": 1, + "a.c": 2 + } +} diff --git a/tests/queries/0_stateless/02717_pretty_json.sql b/tests/queries/0_stateless/02717_pretty_json.sql new file mode 100644 index 00000000000..8a49eb50adf --- /dev/null +++ b/tests/queries/0_stateless/02717_pretty_json.sql @@ -0,0 +1,3 @@ +set allow_experimental_object_type=1; +select 42 as num, [42, 42] as arr, [[[42, 42], [42, 42]], [[42, 42]]] as nested_arr, tuple(42, 42)::Tuple(a UInt32, b UInt32) as tuple, tuple(tuple(tuple(42, 42), 42), 42)::Tuple(a Tuple(b Tuple(c UInt32, d UInt32), e UInt32), f UInt32) as nested_tuple, map(42, 42, 24, 24) as map, map(42, map(42, map(42, 42))) as nested_map, [tuple(map(42, 42), [42, 42]), tuple(map(42, 42), [42, 42])]::Array(Tuple(Map(UInt32, UInt32), Array(UInt32))) as nested_types, '{"a" : {"b" : 1, "c" : 2}}'::JSON as json_object format PrettyNDJSON; + From e47bb5cc7288ac93bc088802f1cf406a6b8368da Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 13:35:28 +0000 Subject: [PATCH 307/535] Add docs --- docs/en/interfaces/formats.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index b4823d5ebaf..cef3b9318ab 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -38,6 +38,7 @@ The supported formats are: | [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | | [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | | [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [PrettyJSONEachRow](#prettyjsoneachrow) | ✗ | ✔ | | [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | | [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | | [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | @@ -915,7 +916,39 @@ Example: {"num":44,"str":"hello","arr":[0,1,2,3]} ``` -While importing data columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](/docs/en/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) is set to 1. +## PrettyJSONEachRow {#prettyjsoneachrow} + +Differs from JSONEachRow only in that JSON is pretty formatted with new line delimiters and 4 space indents. Suitable onlt for output. + +Example + +```json +{ + "num": "42", + "str": "hello", + "arr": [ + "0", + "1" + ], + "tuple": { + "num": 42, + "str": "world" + } +} +{ + "num": "43", + "str": "hello", + "arr": [ + "0", + "1", + "2" + ], + "tuple": { + "num": 43, + "str": "world" + } +} +``` ## JSONStringsEachRow {#jsonstringseachrow} From 81998725584bc4ebeaf91f09321a5f93fab949fc Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 18 Apr 2023 13:38:41 +0000 Subject: [PATCH 308/535] bitNot marked as NO_SANITIZE_UNDEFINED --- src/Functions/bitNot.cpp | 2 +- .../0_stateless/02715_bit_operations_float.reference | 2 ++ tests/queries/0_stateless/02715_bit_operations_float.sql | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/02715_bit_operations_float.reference create mode 100644 tests/queries/0_stateless/02715_bit_operations_float.sql diff --git a/src/Functions/bitNot.cpp b/src/Functions/bitNot.cpp index f8bfad64494..d7aa87b288f 100644 --- a/src/Functions/bitNot.cpp +++ b/src/Functions/bitNot.cpp @@ -20,7 +20,7 @@ struct BitNotImpl static const constexpr bool allow_fixed_string = true; static const constexpr bool allow_string_integer = false; - static inline ResultType apply(A a) + static inline ResultType NO_SANITIZE_UNDEFINED apply(A a) { return ~static_cast(a); } diff --git a/tests/queries/0_stateless/02715_bit_operations_float.reference b/tests/queries/0_stateless/02715_bit_operations_float.reference new file mode 100644 index 00000000000..395d1c127c9 --- /dev/null +++ b/tests/queries/0_stateless/02715_bit_operations_float.reference @@ -0,0 +1,2 @@ +9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807 +12 11 41 12 diff --git a/tests/queries/0_stateless/02715_bit_operations_float.sql b/tests/queries/0_stateless/02715_bit_operations_float.sql new file mode 100644 index 00000000000..9e3bc5dd1d5 --- /dev/null +++ b/tests/queries/0_stateless/02715_bit_operations_float.sql @@ -0,0 +1,8 @@ +SELECT bitNot(-inf), bitNot(inf), bitNot(3.40282e+38), bitNot(nan); +SELECT bitCount(-inf), bitCount(inf), bitCount(3.40282e+38), bitCount(nan); + +SELECT bitAnd(1.0, 1.0); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +SELECT bitOr(1.0, 1.0); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +SELECT bitRotateLeft(1.0, 1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +SELECT bitShiftLeft(1.0, 1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } +SELECT bitTest(1.0, 1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } From 308970da83c33cf4107ded167dcb29aa4131b20a Mon Sep 17 00:00:00 2001 From: Dmitry Novik Date: Tue, 18 Apr 2023 13:53:13 +0000 Subject: [PATCH 309/535] Add logging --- docker/test/util/process_functional_tests_result.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/test/util/process_functional_tests_result.py b/docker/test/util/process_functional_tests_result.py index 59bec585681..53913b2fbe7 100755 --- a/docker/test/util/process_functional_tests_result.py +++ b/docker/test/util/process_functional_tests_result.py @@ -206,8 +206,10 @@ if __name__ == "__main__": broken_tests = list() if os.path.exists(args.broken_tests): + logging.info(f"File {args.broken_tests} with broken tests found") with open(args.broken_tests) as f: - broken_tests = f.readlines() + broken_tests = f.read().splitlines() + logging.info(f"Broken tests in the list: {len(broken_tests)}") state, description, test_results = process_result(args.in_results_dir, broken_tests) logging.info("Result parsed") From 59459cb287d49202df7152c98b40436f19de6c16 Mon Sep 17 00:00:00 2001 From: kssenii Date: Tue, 18 Apr 2023 15:54:36 +0200 Subject: [PATCH 310/535] Fix test --- src/Storages/RabbitMQ/RabbitMQSource.h | 2 +- src/Storages/RabbitMQ/StorageRabbitMQ.cpp | 160 +++++++++++----------- src/Storages/RabbitMQ/StorageRabbitMQ.h | 4 - 3 files changed, 81 insertions(+), 85 deletions(-) diff --git a/src/Storages/RabbitMQ/RabbitMQSource.h b/src/Storages/RabbitMQ/RabbitMQSource.h index fd78e326038..4a7f4578190 100644 --- a/src/Storages/RabbitMQ/RabbitMQSource.h +++ b/src/Storages/RabbitMQ/RabbitMQSource.h @@ -24,7 +24,7 @@ public: ~RabbitMQSource() override; String getName() const override { return storage.getName(); } - RabbitMQConsumerPtr getBuffer() { return consumer; } + void updateChannel(RabbitMQConnection & connection) { consumer->updateChannel(connection); } Chunk generate() override; diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp index 7d3a205c722..e7029b78e12 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp @@ -287,7 +287,7 @@ void StorageRabbitMQ::stopLoopIfNoReaders() void StorageRabbitMQ::startLoop() { - assert(rabbit_is_ready); + chassert(initialized); connection->getHandler().updateLoopState(Loop::RUN); looping_task->activateAndSchedule(); } @@ -307,13 +307,23 @@ void StorageRabbitMQ::decrementReader() void StorageRabbitMQ::connectionFunc() { - if (rabbit_is_ready) + if (initialized) return; - if (connection->reconnect()) - initRabbitMQ(); - else - connection_task->scheduleAfter(RESCHEDULE_MS); + try + { + if (connection->reconnect()) + initRabbitMQ(); + + streaming_task->scheduleAfter(RESCHEDULE_MS); + return; + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } + + connection_task->scheduleAfter(RESCHEDULE_MS); } @@ -349,46 +359,70 @@ size_t StorageRabbitMQ::getMaxBlockSize() const void StorageRabbitMQ::initRabbitMQ() { - if (shutdown_called || rabbit_is_ready) + if (shutdown_called || initialized) return; if (use_user_setup) { queues.emplace_back(queue_base); - rabbit_is_ready = true; - return; } - - try + else { - auto rabbit_channel = connection->createChannel(); - - /// Main exchange -> Bridge exchange -> ( Sharding exchange ) -> Queues -> Consumers - - initExchange(*rabbit_channel); - bindExchange(*rabbit_channel); - - for (const auto i : collections::range(0, num_queues)) - bindQueue(i + 1, *rabbit_channel); - - if (queues.size() != num_queues) + try { - throw Exception( - ErrorCodes::LOGICAL_ERROR, - "Expected all queues to be initialized (but having {}/{})", - queues.size(), num_queues); - } + auto rabbit_channel = connection->createChannel(); - LOG_TRACE(log, "RabbitMQ setup completed"); - rabbit_is_ready = true; - rabbit_channel->close(); - } - catch (...) - { - tryLogCurrentException(log); - if (!is_attach) + /// Main exchange -> Bridge exchange -> ( Sharding exchange ) -> Queues -> Consumers + + initExchange(*rabbit_channel); + bindExchange(*rabbit_channel); + + for (const auto i : collections::range(0, num_queues)) + bindQueue(i + 1, *rabbit_channel); + + if (queues.size() != num_queues) + { + throw Exception( + ErrorCodes::LOGICAL_ERROR, + "Expected all queues to be initialized (but having {}/{})", + queues.size(), num_queues); + } + + LOG_TRACE(log, "RabbitMQ setup completed"); + rabbit_channel->close(); + } + catch (...) + { + tryLogCurrentException(log); + if (is_attach) + return; /// A user will have to reattach the table. throw; + } } + + LOG_TRACE(log, "Registering {} conumers", num_consumers); + + for (size_t i = 0; i < num_consumers; ++i) + { + try + { + auto consumer = createConsumer(); + consumer->updateChannel(*connection); + consumers_ref.push_back(consumer); + pushConsumer(consumer); + ++num_created_consumers; + } + catch (...) + { + if (!is_attach) + throw; + + tryLogCurrentException(log); + } + } + + LOG_TRACE(log, "Registered {}/{} conumers", num_created_consumers, num_consumers); + initialized = true; } @@ -655,7 +689,7 @@ void StorageRabbitMQ::read( size_t /* max_block_size */, size_t /* num_streams */) { - if (!rabbit_is_ready) + if (!initialized) throw Exception(ErrorCodes::CANNOT_CONNECT_RABBITMQ, "RabbitMQ setup not finished. Connection might be lost"); if (num_created_consumers == 0) @@ -685,8 +719,6 @@ void StorageRabbitMQ::read( throw Exception(ErrorCodes::CANNOT_CONNECT_RABBITMQ, "No connection to {}", connection->connectionInfoForLog()); } - initializeBuffers(); - Pipes pipes; pipes.reserve(num_created_consumers); @@ -752,35 +784,11 @@ SinkToStoragePtr StorageRabbitMQ::write(const ASTPtr &, const StorageMetadataPtr void StorageRabbitMQ::startup() { - if (!rabbit_is_ready) - { - if (connection->isConnected()) - { - try - { - initRabbitMQ(); - } - catch (...) - { - if (!is_attach) - throw; - tryLogCurrentException(log); - } - } - else - { - connection_task->activateAndSchedule(); - } - } - - for (size_t i = 0; i < num_consumers; ++i) + if (connection->isConnected()) { try { - auto consumer = createConsumer(); - consumers_ref.push_back(consumer); - pushConsumer(consumer); - ++num_created_consumers; + initRabbitMQ(); } catch (...) { @@ -789,8 +797,12 @@ void StorageRabbitMQ::startup() tryLogCurrentException(log); } } + else + { + connection_task->activateAndSchedule(); + } - streaming_task->activateAndSchedule(); + streaming_task->activate(); } @@ -955,21 +967,10 @@ bool StorageRabbitMQ::hasDependencies(const StorageID & table_id) } -void StorageRabbitMQ::initializeBuffers() -{ - assert(rabbit_is_ready); - if (!initialized) - { - for (const auto & consumer : consumers) - consumer->updateChannel(*connection); - initialized = true; - } -} - - void StorageRabbitMQ::streamingToViewsFunc() { - if (rabbit_is_ready) + chassert(initialized); + if (initialized) { try { @@ -981,7 +982,6 @@ void StorageRabbitMQ::streamingToViewsFunc() if (num_views && rabbit_connected) { - initializeBuffers(); auto start_time = std::chrono::steady_clock::now(); mv_attached.store(true); @@ -1123,7 +1123,7 @@ bool StorageRabbitMQ::tryStreamToViews() ++queue_empty; if (source->needChannelUpdate()) - source->getBuffer()->updateChannel(*connection); + source->updateChannel(*connection); /* false is returned by the sendAck function in only two cases: * 1) if connection failed. In this case all channels will be closed and will be unable to send ack. Also ack is made based on diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.h b/src/Storages/RabbitMQ/StorageRabbitMQ.h index a30919f2b25..421a7eac56c 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.h +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.h @@ -140,9 +140,6 @@ private: /// Counter for producers, needed for channel id. /// Needed to generate unique producer identifiers. std::atomic producer_id = 1; - /// Has connection background task completed successfully? - /// It is started only once -- in constructor. - std::atomic rabbit_is_ready = false; /// Allow to remove exchange only once. std::atomic exchange_removed = false; /// For select query we must be aware of the end of streaming @@ -163,7 +160,6 @@ private: bool is_attach; RabbitMQConsumerPtr createConsumer(); - void initializeBuffers(); bool initialized = false; /// Functions working in the background From 8aade2d39ed34a57ccbb1eed89397ff5c690fa12 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:56:41 +0200 Subject: [PATCH 311/535] Fix typo --- docs/en/interfaces/formats.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index cef3b9318ab..9556f016805 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -918,7 +918,7 @@ Example: ## PrettyJSONEachRow {#prettyjsoneachrow} -Differs from JSONEachRow only in that JSON is pretty formatted with new line delimiters and 4 space indents. Suitable onlt for output. +Differs from JSONEachRow only in that JSON is pretty formatted with new line delimiters and 4 space indents. Suitable only for output. Example From 59a74b47ee36d1787c07ae8dd0c5f27fc82ae23b Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:57:50 +0200 Subject: [PATCH 312/535] Update aspell-dict.txt --- utils/check-style/aspell-ignore/en/aspell-dict.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/check-style/aspell-ignore/en/aspell-dict.txt b/utils/check-style/aspell-ignore/en/aspell-dict.txt index 4eb0e9dc42d..271bf7baf56 100644 --- a/utils/check-style/aspell-ignore/en/aspell-dict.txt +++ b/utils/check-style/aspell-ignore/en/aspell-dict.txt @@ -132,6 +132,7 @@ PrettySpace PrettySpaceMonoBlock PrettySpaceNoEscapes PrettySpaceNoEscapesMonoBlock +PrettyJSONEachRow Protobuf ProtobufSingle QEMU @@ -428,6 +429,7 @@ prettyspace prettyspacemonoblock prettyspacenoescapes prettyspacenoescapesmonoblock +prettyjsoneachrow prlimit prometheus proto From e9784b94448938d25d7fdfbc15420f5a87809460 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:06:21 +0200 Subject: [PATCH 313/535] Bring back accidentally deleted line --- docs/en/interfaces/formats.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index 9556f016805..a3a23cf830a 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -916,6 +916,8 @@ Example: {"num":44,"str":"hello","arr":[0,1,2,3]} ``` +While importing data columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](/docs/en/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) is set to 1. + ## PrettyJSONEachRow {#prettyjsoneachrow} Differs from JSONEachRow only in that JSON is pretty formatted with new line delimiters and 4 space indents. Suitable only for output. From e34dcabeca2a078ceb75509ffabdacdd142f77d9 Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 18 Apr 2023 14:25:21 +0000 Subject: [PATCH 314/535] Fix order by in test_storage_delta --- tests/integration/test_storage_delta/test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_storage_delta/test.py b/tests/integration/test_storage_delta/test.py index 85d22b71488..9477b66dab8 100644 --- a/tests/integration/test_storage_delta/test.py +++ b/tests/integration/test_storage_delta/test.py @@ -251,8 +251,10 @@ def test_checkpoint(started_cluster): assert ( instance.query(f"SELECT * FROM {TABLE_NAME} ORDER BY 1").strip() == instance.query( + "SELECT * FROM (" "SELECT number, toString(number + 1) FROM numbers(5) " - "UNION ALL SELECT number, toString(number + 1) FROM numbers(10, 15) ORDER BY 1" + "UNION ALL SELECT number, toString(number + 1) FROM numbers(10, 15) " + ") ORDER BY 1" ).strip() ) From f7fe747ddc93affa28fbc2ea41d4583b840b6420 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:30:58 +0200 Subject: [PATCH 315/535] Fix segfault --- src/Storages/System/StorageSystemZooKeeper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Storages/System/StorageSystemZooKeeper.cpp b/src/Storages/System/StorageSystemZooKeeper.cpp index e21bd887ecb..6ca74406b17 100644 --- a/src/Storages/System/StorageSystemZooKeeper.cpp +++ b/src/Storages/System/StorageSystemZooKeeper.cpp @@ -314,7 +314,7 @@ static void extractPathImpl(const ActionsDAG::Node & node, Paths & res, ContextP return; auto set = column_set->getData(); - if (!set->isCreated()) + if (!set || !set->isCreated()) return; if (!set->hasExplicitSetElements()) From 93cc552b8fc858ae157814fe8dcebafac8939e61 Mon Sep 17 00:00:00 2001 From: Thom O'Connor Date: Tue, 18 Apr 2023 08:46:22 -0600 Subject: [PATCH 316/535] Update mutations.md Adding the SQL to monitor system.mutations updates --- docs/en/operations/system-tables/mutations.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/en/operations/system-tables/mutations.md b/docs/en/operations/system-tables/mutations.md index d65bccb9aaa..a247870005c 100644 --- a/docs/en/operations/system-tables/mutations.md +++ b/docs/en/operations/system-tables/mutations.md @@ -5,7 +5,7 @@ slug: /en/operations/system-tables/mutations The table contains information about [mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) of [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) tables and their progress. Each mutation command is represented by a single row. -Columns: +## Columns: - `database` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the database to which the mutation was applied. @@ -43,6 +43,15 @@ If there were problems with mutating some data parts, the following columns cont - `latest_fail_reason` ([String](/docs/en/sql-reference/data-types/string.md)) — The exception message that caused the most recent part mutation failure. +## Monitoring Mutations + +To track the progress on the system.mutations table, use a query like the following - this requires read permissions on the system.* tables: + +``` sql +SELECT * FROM clusterAllReplicas('cluster_name', 'db', system.mutations) +WHERE is_done=0 AND table='tmp'; +``` + **See Also** - [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) From 2a829d9838098fe4b95ad07969331bda8038a4be Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:11:19 +0200 Subject: [PATCH 317/535] Check getData() result in other places --- src/Functions/in.cpp | 3 +++ src/Interpreters/ExpressionActions.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Functions/in.cpp b/src/Functions/in.cpp index 53dc25b55af..7a41ae2e3ea 100644 --- a/src/Functions/in.cpp +++ b/src/Functions/in.cpp @@ -123,6 +123,9 @@ public: } auto set = column_set->getData(); + if (!set) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Not-ready Set passed as the second argument for function '{}'", getName()); + auto set_types = set->getDataTypes(); if (tuple && set_types.size() != 1 && set_types.size() == tuple->tupleSize()) diff --git a/src/Interpreters/ExpressionActions.cpp b/src/Interpreters/ExpressionActions.cpp index d47d5880fde..36725f36804 100644 --- a/src/Interpreters/ExpressionActions.cpp +++ b/src/Interpreters/ExpressionActions.cpp @@ -940,7 +940,8 @@ bool ExpressionActions::checkColumnIsAlwaysFalse(const String & column_name) con // Constant ColumnSet cannot be empty, so we only need to check non-constant ones. if (const auto * column_set = checkAndGetColumn(action.node->column.get())) { - if (column_set->getData()->isCreated() && column_set->getData()->getTotalRowCount() == 0) + auto set = column_set->getData(); + if (set && set->isCreated() && set->getTotalRowCount() == 0) return true; } } From b60169d2581d4bfad21099635b805db8d9a286d4 Mon Sep 17 00:00:00 2001 From: Thom O'Connor Date: Tue, 18 Apr 2023 09:48:32 -0600 Subject: [PATCH 318/535] Update postgresql.md Added examples for INSERT INTO from SELECT * for initial load from PostgreSQL and incremental inserts --- .../table-engines/integrations/postgresql.md | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index 2fcc0b10e78..378b09e8259 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -111,7 +111,7 @@ In the example below replica `example01-1` has the highest priority: ## Usage Example {#usage-example} -Table in PostgreSQL: +### Table in PostgreSQL ``` text postgres=# CREATE TABLE "public"."test" ( @@ -134,7 +134,9 @@ postgresql> SELECT * FROM test; (1 row) ``` -Table in ClickHouse, retrieving data from the PostgreSQL table created above: +### Creating Table in ClickHouse, and connecting to PostgreSQL table created above + +This example uses the [PostgreSQL table engine](/docs/en/engines/table-engines/integrations/postgresql) to connect the ClickHouse table to the PostgreSQL table: ``` sql CREATE TABLE default.postgresql_table @@ -146,6 +148,35 @@ CREATE TABLE default.postgresql_table ENGINE = PostgreSQL('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); ``` +### Inserting initial data from PostgreSQL table into ClickHouse table, using a SELECT query + +The [postgresql table function](/docs/en/sql-reference/table-functions/postgresql) copies the data from PostgreSQL to ClickHouse, which is often used for improving the query performance of the data by querying or performing analytics in ClickHouse rather than in PostgreSQL, or can also be used for migrating data from PostgreSQL to ClickHouse: + +``` sql +INSERT INTO default.postgresql_table +SELECT * FROM postgresql('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); +``` + +### Inserting incremental data from PostgreSQL table into ClickHouse table + +If then performing ongoing synchronization between the PostgreSQL table and ClickHouse table after the initial insert, you can use a WHERE clause in ClickHouse to insert only data added to PostgreSQL based on a timestamp or unique sequence ID. + +This would require keeping track of the max ID or timestamp previously added, such as the following: + +``` sql +SELECT max(`int_id`) AS maxIntID FROM default.postgresql_table; +``` + +Then inserting values from PostgreSQL table greater than the max + +``` sql +INSERT INTO default.postgresql_table +SELECT * FROM postgresql('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); +WHERE int_id > maxIntID; +``` + +### Selecting data from the resulting ClickHouse table + ``` sql SELECT * FROM postgresql_table WHERE str IN ('test'); ``` @@ -156,7 +187,7 @@ SELECT * FROM postgresql_table WHERE str IN ('test'); └────────────────┴──────┴────────┘ ``` -Using Non-default Schema: +### Using Non-default Schema ```text postgres=# CREATE SCHEMA "nice.schema"; From a123250a402088f6a61e9c1977dfcfdf69c5733f Mon Sep 17 00:00:00 2001 From: cluster Date: Mon, 17 Apr 2023 14:21:11 +0800 Subject: [PATCH 319/535] remove duplicate indentwith IndentWidth key shoudle be unique --- .clang-format | 1 - 1 file changed, 1 deletion(-) diff --git a/.clang-format b/.clang-format index d8f273702c8..2da3911dced 100644 --- a/.clang-format +++ b/.clang-format @@ -21,7 +21,6 @@ ConstructorInitializerAllOnOneLineOrOnePerLine: true ExperimentalAutoDetectBinPacking: true UseTab: Never TabWidth: 4 -IndentWidth: 4 Standard: Cpp11 PointerAlignment: Middle MaxEmptyLinesToKeep: 2 From 8710c15c8536fedb2cf144ce6e8a1dcdb73c22a9 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Tue, 18 Apr 2023 18:25:54 +0200 Subject: [PATCH 320/535] Apply suggestion --- src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index c8b242804e8..0b4700c9d4c 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -253,11 +253,17 @@ static ColumnWithTypeAndName readColumnWithBooleanData(std::shared_ptr & arrow_column, const String & column_name, const DataTypePtr & type_hint) { DataTypePtr internal_type; + bool check_date_range = false; /// Make result type Date32 when requested type is actually Date32 or when we use schema inference if (!type_hint || (type_hint && isDate32(*type_hint))) + { internal_type = std::make_shared(); + check_date_range = true; + } else + { internal_type = std::make_shared(); + } auto internal_column = internal_type->createColumn(); PaddedPODArray & column_data = assert_cast &>(*internal_column).getData(); @@ -268,7 +274,7 @@ static ColumnWithTypeAndName readColumnWithDate32Data(std::shared_ptr(*(arrow_column->chunk(chunk_i))); /// Check date range only when requested type is actually Date32 - if (isDate32(*internal_type)) + if (check_date_range) { for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { From b277a5c943a1cc5e64d78c8dbcc737aad9cf1539 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 11:07:08 +0000 Subject: [PATCH 321/535] Add ParquetMetadata input format to read Parquet file metadata --- docs/en/interfaces/formats.md | 272 +++++++--- src/Formats/registerFormats.cpp | 5 + .../Impl/ParquetMetadataInputFormat.cpp | 499 ++++++++++++++++++ .../Formats/Impl/ParquetMetadataInputFormat.h | 90 ++++ .../02718_parquet_metadata_format.reference | 154 ++++++ .../02718_parquet_metadata_format.sh | 7 + .../data_parquet/02718_data.parquet | Bin 0 -> 28165 bytes 7 files changed, 952 insertions(+), 75 deletions(-) create mode 100644 src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp create mode 100644 src/Processors/Formats/Impl/ParquetMetadataInputFormat.h create mode 100644 tests/queries/0_stateless/02718_parquet_metadata_format.reference create mode 100755 tests/queries/0_stateless/02718_parquet_metadata_format.sh create mode 100644 tests/queries/0_stateless/data_parquet/02718_data.parquet diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index b4823d5ebaf..b17c3c14f73 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -10,80 +10,82 @@ results of a `SELECT`, and to perform `INSERT`s into a file-backed table. The supported formats are: -| Format | Input | Output | -|-------------------------------------------------------------------------------------------|------|--------| -| [TabSeparated](#tabseparated) | ✔ | ✔ | -| [TabSeparatedRaw](#tabseparatedraw) | ✔ | ✔ | -| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | -| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | -| [TabSeparatedRawWithNames](#tabseparatedrawwithnames) | ✔ | ✔ | -| [TabSeparatedRawWithNamesAndTypes](#tabseparatedrawwithnamesandtypes) | ✔ | ✔ | -| [Template](#format-template) | ✔ | ✔ | -| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | -| [CSV](#csv) | ✔ | ✔ | -| [CSVWithNames](#csvwithnames) | ✔ | ✔ | -| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ | -| [CustomSeparated](#format-customseparated) | ✔ | ✔ | -| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ | -| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ | -| [SQLInsert](#sqlinsert) | ✗ | ✔ | -| [Values](#data-format-values) | ✔ | ✔ | -| [Vertical](#vertical) | ✗ | ✔ | -| [JSON](#json) | ✔ | ✔ | -| [JSONAsString](#jsonasstring) | ✔ | ✗ | -| [JSONStrings](#jsonstrings) | ✔ | ✔ | -| [JSONColumns](#jsoncolumns) | ✔ | ✔ | -| [JSONColumnsWithMetadata](#jsoncolumnsmonoblock)) | ✔ | ✔ | -| [JSONCompact](#jsoncompact) | ✔ | ✔ | -| [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | -| [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | -| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | -| [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | -| [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | -| [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | -| [JSONCompactEachRow](#jsoncompacteachrow) | ✔ | ✔ | -| [JSONCompactEachRowWithNames](#jsoncompacteachrowwithnames) | ✔ | ✔ | -| [JSONCompactEachRowWithNamesAndTypes](#jsoncompacteachrowwithnamesandtypes) | ✔ | ✔ | -| [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | -| [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | +| Format | Input | Output | +|------------------------------------------------------------------------------------------|------|--------| +| [TabSeparated](#tabseparated) | ✔ | ✔ | +| [TabSeparatedRaw](#tabseparatedraw) | ✔ | ✔ | +| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | +| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | +| [TabSeparatedRawWithNames](#tabseparatedrawwithnames) | ✔ | ✔ | +| [TabSeparatedRawWithNamesAndTypes](#tabseparatedrawwithnamesandtypes) | ✔ | ✔ | +| [Template](#format-template) | ✔ | ✔ | +| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | +| [CSV](#csv) | ✔ | ✔ | +| [CSVWithNames](#csvwithnames) | ✔ | ✔ | +| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ | +| [CustomSeparated](#format-customseparated) | ✔ | ✔ | +| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ | +| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ | +| [SQLInsert](#sqlinsert) | ✗ | ✔ | +| [Values](#data-format-values) | ✔ | ✔ | +| [Vertical](#vertical) | ✗ | ✔ | +| [JSON](#json) | ✔ | ✔ | +| [JSONAsString](#jsonasstring) | ✔ | ✗ | +| [JSONStrings](#jsonstrings) | ✔ | ✔ | +| [JSONColumns](#jsoncolumns) | ✔ | ✔ | +| [JSONColumnsWithMetadata](#jsoncolumnsmonoblock)) | ✔ | ✔ | +| [JSONCompact](#jsoncompact) | ✔ | ✔ | +| [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | +| [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | +| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [PrettyJSONEachRow](#prettyjsoneachrow) | ✗ | ✔ | +| [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | +| [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | +| [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | +| [JSONCompactEachRow](#jsoncompacteachrow) | ✔ | ✔ | +| [JSONCompactEachRowWithNames](#jsoncompacteachrowwithnames) | ✔ | ✔ | +| [JSONCompactEachRowWithNamesAndTypes](#jsoncompacteachrowwithnamesandtypes) | ✔ | ✔ | +| [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | +| [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | | [JSONCompactStringsEachRowWithNamesAndTypes](#jsoncompactstringseachrowwithnamesandtypes) | ✔ | ✔ | -| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | -| [BSONEachRow](#bsoneachrow) | ✔ | ✔ | -| [TSKV](#tskv) | ✔ | ✔ | -| [Pretty](#pretty) | ✗ | ✔ | -| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | -| [PrettyMonoBlock](#prettymonoblock) | ✗ | ✔ | -| [PrettyNoEscapesMonoBlock](#prettynoescapesmonoblock) | ✗ | ✔ | -| [PrettyCompact](#prettycompact) | ✗ | ✔ | -| [PrettyCompactNoEscapes](#prettycompactnoescapes) | ✗ | ✔ | -| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | -| [PrettyCompactNoEscapesMonoBlock](#prettycompactnoescapesmonoblock) | ✗ | ✔ | -| [PrettySpace](#prettyspace) | ✗ | ✔ | -| [PrettySpaceNoEscapes](#prettyspacenoescapes) | ✗ | ✔ | -| [PrettySpaceMonoBlock](#prettyspacemonoblock) | ✗ | ✔ | -| [PrettySpaceNoEscapesMonoBlock](#prettyspacenoescapesmonoblock) | ✗ | ✔ | -| [Prometheus](#prometheus) | ✗ | ✔ | -| [Protobuf](#protobuf) | ✔ | ✔ | -| [ProtobufSingle](#protobufsingle) | ✔ | ✔ | -| [Avro](#data-format-avro) | ✔ | ✔ | -| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | -| [Parquet](#data-format-parquet) | ✔ | ✔ | -| [Arrow](#data-format-arrow) | ✔ | ✔ | -| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | -| [ORC](#data-format-orc) | ✔ | ✔ | -| [RowBinary](#rowbinary) | ✔ | ✔ | -| [RowBinaryWithNames](#rowbinarywithnamesandtypes) | ✔ | ✔ | -| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | -| [Native](#native) | ✔ | ✔ | -| [Null](#null) | ✗ | ✔ | -| [XML](#xml) | ✗ | ✔ | -| [CapnProto](#capnproto) | ✔ | ✔ | -| [LineAsString](#lineasstring) | ✔ | ✔ | -| [Regexp](#data-format-regexp) | ✔ | ✗ | -| [RawBLOB](#rawblob) | ✔ | ✔ | -| [MsgPack](#msgpack) | ✔ | ✔ | -| [MySQLDump](#mysqldump) | ✔ | ✗ | -| [Markdown](#markdown) | ✗ | ✔ | +| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | +| [BSONEachRow](#bsoneachrow) | ✔ | ✔ | +| [TSKV](#tskv) | ✔ | ✔ | +| [Pretty](#pretty) | ✗ | ✔ | +| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | +| [PrettyMonoBlock](#prettymonoblock) | ✗ | ✔ | +| [PrettyNoEscapesMonoBlock](#prettynoescapesmonoblock) | ✗ | ✔ | +| [PrettyCompact](#prettycompact) | ✗ | ✔ | +| [PrettyCompactNoEscapes](#prettycompactnoescapes) | ✗ | ✔ | +| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | +| [PrettyCompactNoEscapesMonoBlock](#prettycompactnoescapesmonoblock) | ✗ | ✔ | +| [PrettySpace](#prettyspace) | ✗ | ✔ | +| [PrettySpaceNoEscapes](#prettyspacenoescapes) | ✗ | ✔ | +| [PrettySpaceMonoBlock](#prettyspacemonoblock) | ✗ | ✔ | +| [PrettySpaceNoEscapesMonoBlock](#prettyspacenoescapesmonoblock) | ✗ | ✔ | +| [Prometheus](#prometheus) | ✗ | ✔ | +| [Protobuf](#protobuf) | ✔ | ✔ | +| [ProtobufSingle](#protobufsingle) | ✔ | ✔ | +| [Avro](#data-format-avro) | ✔ | ✔ | +| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | +| [Parquet](#data-format-parquet) | ✔ | ✔ | +| [ParqueMetadata](#data-format-parquet-metadata) | ✔ | ✗ | +| [Arrow](#data-format-arrow) | ✔ | ✔ | +| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | +| [ORC](#data-format-orc) | ✔ | ✔ | +| [RowBinary](#rowbinary) | ✔ | ✔ | +| [RowBinaryWithNames](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [Native](#native) | ✔ | ✔ | +| [Null](#null) | ✗ | ✔ | +| [XML](#xml) | ✗ | ✔ | +| [CapnProto](#capnproto) | ✔ | ✔ | +| [LineAsString](#lineasstring) | ✔ | ✔ | +| [Regexp](#data-format-regexp) | ✔ | ✗ | +| [RawBLOB](#rawblob) | ✔ | ✔ | +| [MsgPack](#msgpack) | ✔ | ✔ | +| [MySQLDump](#mysqldump) | ✔ | ✗ | +| [Markdown](#markdown) | ✗ | ✔ | You can control some format processing parameters with the ClickHouse settings. For more information read the [Settings](/docs/en/operations/settings/settings-formats.md) section. @@ -915,8 +917,6 @@ Example: {"num":44,"str":"hello","arr":[0,1,2,3]} ``` -While importing data columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](/docs/en/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) is set to 1. - ## JSONStringsEachRow {#jsonstringseachrow} Differs from JSONEachRow only in that data fields are output in strings, not in typed JSON values. @@ -2003,6 +2003,128 @@ To exchange data with Hadoop, you can use [HDFS table engine](/docs/en/engines/t - [output_format_parquet_version](/docs/en/operations/settings/settings-formats.md/#output_format_parquet_version) - The version of Parquet format used in output format. Default value - `2.latest`. - [output_format_parquet_compression_method](/docs/en/operations/settings/settings-formats.md/#output_format_parquet_compression_method) - compression method used in output Parquet format. Default value - `snappy`. +## ParquetMetadata {data-format-parquet-metadata} + +Special format for reading Parquet file metadata (https://parquet.apache.org/docs/file-format/metadata/). It always outputs one row with the next structure/content: +- num_columns - the number of columns +- num_rows - the total number of rows +- num_row_groups - the total number of row groups +- format_version - parquet format version, always 1.0 or 2.6 +- total_byte_size - total bytes size of the data, calculated as the sum of total_byte_size from all row groups +- total_compressed_size - total compressed bytes size of the data, calculated as the sum of total_compressed_size from all row groups +- columns - the list of columns metadata with the next structure: + - name - column name + - path - column path (differs from name for nested column) + - max_definition_level - maximum definition level + - max_repetition_level - maximum repetition level + - physical_type - column physical type + - logical_type - column logical type + - compression - compression used for this column + - encodings - the list of encodings used for this column +- row_groups - the list of row groups metadata with the next structure: + - num_columns - the number of columns in the row group + - num_rows - the number of rows in the row group + - total_byte_size - total bytes size of the row group + - total_compressed_size - total compressed bytes size of the row group + - columns - the list of column chunks metadata with the next structure: + - name - column name + - path - column path + - total_compressed_size - total compressed bytes size of the column + - total_uncompressed_size - total uncompressed bytes size of the row group + - have_statistics - bool flag that indicates if column chunk metadata contains column statistics + - statistics - column chunk statistics (all fields are NULL if have_statistics = false) with the next structure: + - num_values - the number of non-null values in the column chunk + - null_count - the number of NULL values in the column chunk + - distinct_count - the number of distinct values in the column chunk + - min - the minimum value of the column chunk + - max - the maximum column of the column chunk + +Example: + +```sql +SELECT * FROM file(data.parquet, ParquetMetadata) format PrettyJSONEachRow +``` + +```json +{ + "num_columns": "2", + "num_rows": "1000000", + "num_row_groups": "16", + "format_version": "2.6", + "total_byte_size": "10001981", + "total_compressed_size": "6011415", + "columns": [ + { + "name": "number", + "path": "number", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "INT64", + "logical_type": "Int(bitWidth=64, isSigned=false)", + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "'Hello'", + "path": "'Hello'", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "BYTE_ARRAY", + "logical_type": "None", + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + } + ], + "row_groups": [ + { + "num_columns": "2", + "num_rows": "65409", + "total_byte_size": "654367", + "total_compressed_size": "393396", + "columns": [ + { + "name": "number", + "path": "number", + "total_compressed_size": "393329", + "total_uncompressed_size": "654302", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "0", + "max": "65408" + } + }, + { + "name": "'Hello'", + "path": "'Hello'", + "total_compressed_size": "67", + "total_uncompressed_size": "65", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "Hello", + "max": "Hello" + } + } + ] + }, + ... + ] +} +``` + ## Arrow {#data-format-arrow} [Apache Arrow](https://arrow.apache.org/) comes with two built-in columnar storage formats. ClickHouse supports read and write operations for these formats. diff --git a/src/Formats/registerFormats.cpp b/src/Formats/registerFormats.cpp index 285e234167b..29ef46f330f 100644 --- a/src/Formats/registerFormats.cpp +++ b/src/Formats/registerFormats.cpp @@ -100,6 +100,7 @@ void registerInputFormatJSONAsString(FormatFactory & factory); void registerInputFormatJSONAsObject(FormatFactory & factory); void registerInputFormatLineAsString(FormatFactory & factory); void registerInputFormatMySQLDump(FormatFactory & factory); +void registerInputFormatParquetMetadata(FormatFactory & factory); #if USE_HIVE void registerInputFormatHiveText(FormatFactory & factory); @@ -140,6 +141,7 @@ void registerValuesSchemaReader(FormatFactory & factory); void registerTemplateSchemaReader(FormatFactory & factory); void registerMySQLSchemaReader(FormatFactory & factory); void registerBSONEachRowSchemaReader(FormatFactory & factory); +void registerParquetMetadataSchemaReader(FormatFactory & factory); void registerFileExtensions(FormatFactory & factory); @@ -240,6 +242,8 @@ void registerFormats() registerInputFormatCapnProto(factory); registerInputFormatMySQLDump(factory); + registerInputFormatParquetMetadata(factory); + registerNonTrivialPrefixAndSuffixCheckerJSONEachRow(factory); registerNonTrivialPrefixAndSuffixCheckerJSONAsString(factory); registerNonTrivialPrefixAndSuffixCheckerJSONAsObject(factory); @@ -274,6 +278,7 @@ void registerFormats() registerTemplateSchemaReader(factory); registerMySQLSchemaReader(factory); registerBSONEachRowSchemaReader(factory); + registerParquetMetadataSchemaReader(factory); } } diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp new file mode 100644 index 00000000000..c384c3811db --- /dev/null +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -0,0 +1,499 @@ +#include "ParquetMetadataInputFormat.h" + +#if USE_PARQUET + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ArrowBufferedStreams.h" +#include + + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +static NamesAndTypesList getHeaderForParquetMetadata() +{ + NamesAndTypesList names_and_types{ + {"num_columns", std::make_shared()}, + {"num_rows", std::make_shared()}, + {"num_row_groups", std::make_shared()}, + {"format_version", std::make_shared()}, + {"total_byte_size", std::make_shared()}, + {"total_compressed_size", std::make_shared()}, + {"columns", + std::make_shared( + std::make_shared( + DataTypes{ + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(std::make_shared())}, + Names{ + "name", + "path", + "max_definition_level", + "max_repetition_level", + "physical_type", + "logical_type", + "compression", + "encodings"}))}, + {"row_groups", + std::make_shared(std::make_shared( + DataTypes{ + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared( + std::make_shared( + DataTypes{ + std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), + DataTypeFactory::instance().get("Bool"), + std::make_shared( + DataTypes{ + std::make_shared(std::make_shared()), + std::make_shared(std::make_shared()), + std::make_shared(std::make_shared()), + std::make_shared(std::make_shared()), + std::make_shared(std::make_shared())}, + Names{"num_values", "null_count", "distinct_count", "min", "max"}), + }, + Names{"name", "path", "total_compressed_size", "total_uncompressed_size", "have_statistics", "statistics"}))}, + Names{"num_columns", "num_rows", "total_byte_size", "total_compressed_size", "columns"}))}, + }; + return names_and_types; +} + +void checkHeader(const Block & header) +{ + auto expected_names_and_types = getHeaderForParquetMetadata(); + std::unordered_map name_to_type; + for (const auto & [name, type] : expected_names_and_types) + name_to_type[name] = type; + + for (const auto & [name, type] : header.getNamesAndTypes()) + { + auto it = name_to_type.find(name); + if (it == name_to_type.end()) + throw Exception( + ErrorCodes::BAD_ARGUMENTS, + "Unexpected column: {}. ParquetMetadata format allows only the next columns: num_columns, num_rows, num_row_groups, " + "format_version, columns, row_groups", name); + + if (!it->second->equals(*type)) + throw Exception( + ErrorCodes::BAD_ARGUMENTS, + "Unexpected type {} for column {}. Expected type: {}", + type->getName(), + name, + it->second->getName()); + } +} + +static std::shared_ptr getFileMetadata( + ReadBuffer & in, + const FormatSettings & format_settings, + std::atomic & is_stopped) +{ + auto arrow_file = asArrowFile(in, format_settings, is_stopped, "Parquet", PARQUET_MAGIC_BYTES); + return parquet::ReadMetaData(arrow_file); +} + +ParquetMetadataInputFormat::ParquetMetadataInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) + : IInputFormat(std::move(header_), in_), format_settings(format_settings_) +{ + checkHeader(getPort().getHeader()); +} + +Chunk ParquetMetadataInputFormat::generate() +{ + Chunk res; + if (done) + return res; + + auto metadata = getFileMetadata(*in, format_settings, is_stopped); + + const auto & header = getPort().getHeader(); + auto names_and_types = getHeaderForParquetMetadata(); + auto names = names_and_types.getNames(); + auto types = names_and_types.getTypes(); + + for (const auto & name : header.getNames()) + { + /// num_columns + if (name == names[0]) + { + auto column = types[0]->createColumn(); + assert_cast(*column).insertValue(metadata->num_columns()); + res.addColumn(std::move(column)); + } + /// num_rows + else if (name == names[1]) + { + auto column = types[1]->createColumn(); + assert_cast(*column).insertValue(metadata->num_rows()); + res.addColumn(std::move(column)); + } + /// num_row_groups + else if (name == names[2]) + { + auto column = types[2]->createColumn(); + assert_cast(*column).insertValue(metadata->num_row_groups()); + res.addColumn(std::move(column)); + } + /// format_version + else if (name == names[3]) + { + auto column = types[3]->createColumn(); + String version = metadata->version() == parquet::ParquetVersion::PARQUET_1_0 ? "1.0" : "2.6"; + assert_cast(*column).insertData(version.data(), version.size()); + res.addColumn(std::move(column)); + } + /// total_byte_size + else if (name == names[4]) + { + auto column = types[4]->createColumn(); + size_t total_byte_size = 0; + for (int32_t i = 0; i != metadata->num_row_groups(); ++i) + total_byte_size += metadata->RowGroup(i)->total_byte_size(); + + assert_cast(*column).insertValue(total_byte_size); + res.addColumn(std::move(column)); + } + /// total_compressed_size + else if (name == names[5]) + { + auto column = types[5]->createColumn(); + size_t total_compressed_size = 0; + for (int32_t i = 0; i != metadata->num_row_groups(); ++i) + total_compressed_size += metadata->RowGroup(i)->total_compressed_size(); + + assert_cast(*column).insertValue(total_compressed_size); + res.addColumn(std::move(column)); + } + /// columns + else if (name == names[6]) + { + auto column = types[6]->createColumn(); + fillColumnsMetadata(metadata, column); + res.addColumn(std::move(column)); + } + /// row_groups + else if (name == names[7]) + { + auto column = types[7]->createColumn(); + fillRowGroupsMetadata(metadata, column); + res.addColumn(std::move(column)); + } + } + + done = true; + return res; +} + +void ParquetMetadataInputFormat::fillColumnsMetadata(const std::shared_ptr & metadata, MutableColumnPtr & column) +{ + auto & array_column = assert_cast(*column); + auto & tuple_column = assert_cast(array_column.getData()); + int32_t num_columns = metadata->num_columns(); + for (int32_t i = 0; i != num_columns; ++i) + { + const auto * column_info = metadata->schema()->Column(i); + /// name + String column_name = column_info->name(); + assert_cast(tuple_column.getColumn(0)).insertData(column_name.data(), column_name.size()); + /// path + String path = column_info->path()->ToDotString(); + assert_cast(tuple_column.getColumn(1)).insertData(path.data(), path.size()); + /// max_definition_level + assert_cast(tuple_column.getColumn(2)).insertValue(column_info->max_definition_level()); + /// max_repetition_level + assert_cast(tuple_column.getColumn(3)).insertValue(column_info->max_repetition_level()); + /// physical_type + std::string_view physical_type = magic_enum::enum_name(column_info->physical_type()); + assert_cast(tuple_column.getColumn(4)).insertData(physical_type.data(), physical_type.size()); + /// logical_type + String logical_type = column_info->logical_type()->ToString(); + assert_cast(tuple_column.getColumn(5)).insertData(logical_type.data(), logical_type.size()); + + if (metadata->num_row_groups() > 0) + { + auto column_chunk_metadata = metadata->RowGroup(0)->ColumnChunk(i); + std::string_view compression = magic_enum::enum_name(column_chunk_metadata->compression()); + assert_cast(tuple_column.getColumn(6)).insertData(compression.data(), compression.size()); + auto & encodings_array_column = assert_cast(tuple_column.getColumn(7)); + auto & encodings_nested_column = assert_cast(encodings_array_column.getData()); + for (auto codec : column_chunk_metadata->encodings()) + { + auto codec_name = magic_enum::enum_name(codec); + encodings_nested_column.insertData(codec_name.data(), codec_name.size()); + } + encodings_array_column.getOffsets().push_back(encodings_nested_column.size()); + } + else + { + String compression = "NONE"; + assert_cast(tuple_column.getColumn(5)).insertData(compression.data(), compression.size()); + tuple_column.getColumn(6).insertDefault(); + } + } + array_column.getOffsets().push_back(tuple_column.size()); +} + +void ParquetMetadataInputFormat::fillRowGroupsMetadata(const std::shared_ptr & metadata, MutableColumnPtr & column) +{ + auto & row_groups_array_column = assert_cast(*column); + auto & row_groups_column = assert_cast(row_groups_array_column.getData()); + for (int32_t i = 0; i != metadata->num_row_groups(); ++i) + { + auto row_group_metadata = metadata->RowGroup(i); + /// num_columns + assert_cast(row_groups_column.getColumn(0)).insertValue(row_group_metadata->num_columns()); + /// num_rows + assert_cast(row_groups_column.getColumn(1)).insertValue(row_group_metadata->num_rows()); + /// total_bytes_size + assert_cast(row_groups_column.getColumn(2)).insertValue(row_group_metadata->total_byte_size()); + /// total_compressed_size + assert_cast(row_groups_column.getColumn(3)).insertValue(row_group_metadata->total_compressed_size()); + /// columns + fillColumnChunksMetadata(row_group_metadata, row_groups_column.getColumn(4)); + } + row_groups_array_column.getOffsets().push_back(row_groups_column.size()); +} + +void ParquetMetadataInputFormat::fillColumnChunksMetadata(const std::unique_ptr & row_group_metadata, IColumn & column) +{ + auto & array_column = assert_cast(column); + auto & tuple_column = assert_cast(array_column.getData()); + for (int32_t column_i = 0; column_i != row_group_metadata->num_columns(); ++column_i) + { + auto column_chunk_metadata = row_group_metadata->ColumnChunk(column_i); + /// name + String column_name = row_group_metadata->schema()->Column(column_i)->name(); + assert_cast(tuple_column.getColumn(0)).insertData(column_name.data(), column_name.size()); + /// path + String path = row_group_metadata->schema()->Column(column_i)->path()->ToDotString(); + assert_cast(tuple_column.getColumn(1)).insertData(path.data(), path.size()); + /// total_compressed_size + assert_cast(tuple_column.getColumn(2)).insertValue(column_chunk_metadata->total_compressed_size()); + /// total_uncompressed_size + assert_cast(tuple_column.getColumn(3)).insertValue(column_chunk_metadata->total_uncompressed_size()); + /// have_statistics + bool have_statistics = column_chunk_metadata->is_stats_set(); + assert_cast(tuple_column.getColumn(4)).insertValue(have_statistics); + if (have_statistics) + fillColumnStatistics(column_chunk_metadata->statistics(), tuple_column.getColumn(5), row_group_metadata->schema()->Column(column_i)->type_length()); + else + tuple_column.getColumn(5).insertDefault(); + } + array_column.getOffsets().push_back(tuple_column.size()); +} + +template +static void getMinMaxNumberStatistics(const std::shared_ptr & statistics, String & min, String & max) +{ + const auto & typed_statistics = dynamic_cast &>(*statistics); + min = std::to_string(typed_statistics.min()); + max = std::to_string(typed_statistics.max()); +} + +void ParquetMetadataInputFormat::fillColumnStatistics(const std::shared_ptr & statistics, IColumn & column, int32_t type_length) +{ + auto & statistics_column = assert_cast(column); + /// num_values + auto & nullable_num_values = assert_cast(statistics_column.getColumn(0)); + assert_cast(nullable_num_values.getNestedColumn()).insertValue(statistics->num_values()); + nullable_num_values.getNullMapData().push_back(0); + + /// null_count + if (statistics->HasNullCount()) + { + auto & nullable_null_count = assert_cast(statistics_column.getColumn(1)); + assert_cast(nullable_null_count.getNestedColumn()).insertValue(statistics->null_count()); + nullable_null_count.getNullMapData().push_back(0); + } + else + { + statistics_column.getColumn(1).insertDefault(); + } + + /// distinct_count + if (statistics->HasDistinctCount()) + { + auto & nullable_distinct_count = assert_cast(statistics_column.getColumn(2)); + size_t distinct_count = statistics->distinct_count(); + /// It can be set but still be 0 because of a bug: https://github.com/apache/arrow/issues/27644 + /// If we see distinct_count = 0 with non 0 values in chunk, set it to NULL. + if (distinct_count == 0 && statistics->num_values() != 0) + { + nullable_distinct_count.insertDefault(); + } + else + { + assert_cast(nullable_distinct_count.getNestedColumn()).insertValue(distinct_count); + nullable_distinct_count.getNullMapData().push_back(0); + } + } + else + { + statistics_column.getColumn(2).insertDefault(); + } + + /// min/max + if (statistics->HasMinMax() && statistics->physical_type() != parquet::Type::type::UNDEFINED) + { + String min; + String max; + switch (statistics->physical_type()) + { + case parquet::Type::type::FLOAT: + { + getMinMaxNumberStatistics(statistics, min, max); + break; + } + case parquet::Type::type::DOUBLE: + { + getMinMaxNumberStatistics(statistics, min, max); + break; + } + case parquet::Type::type::INT32: + { + getMinMaxNumberStatistics(statistics, min, max); + break; + } + case parquet::Type::type::INT64: + { + getMinMaxNumberStatistics(statistics, min, max); + break; + } + case parquet::Type::type::INT96: + { + const auto & int96_statistics = dynamic_cast &>(*statistics); + min = parquet::Int96ToString(int96_statistics.min()); + max = parquet::Int96ToString(int96_statistics.max()); + break; + } + case parquet::Type::type::BOOLEAN: + { + getMinMaxNumberStatistics(statistics, min, max); + break; + } + case parquet::Type::type::BYTE_ARRAY: + { + const auto & byte_array_statistics = dynamic_cast(*statistics); + min = parquet::ByteArrayToString(byte_array_statistics.min()); + max = parquet::ByteArrayToString(byte_array_statistics.max()); + break; + } + case parquet::Type::type::FIXED_LEN_BYTE_ARRAY: + { + const auto & flba_statistics = dynamic_cast(*statistics); + min = parquet::FixedLenByteArrayToString(flba_statistics.min(), type_length); + max = parquet::FixedLenByteArrayToString(flba_statistics.max(), type_length); + break; + } + case parquet::Type::type::UNDEFINED: + { + break; /// unreachable + } + } + + auto & nullable_min = assert_cast(statistics_column.getColumn(3)); + assert_cast(nullable_min.getNestedColumn()).insertData(min.data(), min.size()); + nullable_min.getNullMapData().push_back(0); + auto & nullable_max = assert_cast(statistics_column.getColumn(4)); + assert_cast(nullable_max.getNestedColumn()).insertData(max.data(), max.size()); + nullable_max.getNullMapData().push_back(0); + } + else + { + statistics_column.getColumn(3).insertDefault(); + statistics_column.getColumn(4).insertDefault(); + } +} + +void ParquetMetadataInputFormat::resetParser() +{ + IInputFormat::resetParser(); + done = false; +} + +ParquetMetadataSchemaReader::ParquetMetadataSchemaReader(ReadBuffer & in_) + : ISchemaReader(in_) +{ +} + +NamesAndTypesList ParquetMetadataSchemaReader::readSchema() +{ + return getHeaderForParquetMetadata(); +} + +void registerInputFormatParquetMetadata(FormatFactory & factory) +{ + factory.registerInputFormat( + "ParquetMetadata", + [](ReadBuffer &buf, + const Block &sample, + const RowInputFormatParams &, + const FormatSettings & settings) + { + return std::make_shared(buf, sample, settings); + }); + factory.markFormatSupportsSubcolumns("ParquetMetadata"); + factory.markFormatSupportsSubsetOfColumns("ParquetMetadata"); +} + +void registerParquetMetadataSchemaReader(FormatFactory & factory) +{ + factory.registerSchemaReader( + "ParquetMetadata", + [](ReadBuffer & buf, const FormatSettings &) + { + return std::make_shared(buf); + } + ); +} + +} + +#else + +namespace DB +{ +class FormatFactory; +void registerInputFormatParquetMetadata(FormatFactory &) +{ +} + +void registerParquetMetadataSchemaReader(FormatFactory &) {} +} + +#endif diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h new file mode 100644 index 00000000000..3561ec6dae8 --- /dev/null +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h @@ -0,0 +1,90 @@ +#pragma once +#include "config.h" +#if USE_PARQUET + +#include +#include +#include +#include + +namespace parquet::arrow { class FileReader; } + +namespace arrow { class Buffer; class RecordBatchReader;} + +namespace DB +{ + +/* Special format that always returns just one row with Parquet file metadata (see https://parquet.apache.org/docs/file-format/metadata/). + * The result row have the next structure: + * num_columns - the number of columns + * num_rows - the total number of rows + * num_row_groups - the total number of row groups + * format_version - parquet format version, always 1.0 or 2.6 + * total_byte_size - total bytes size of the data, calculated as the sum of total_byte_size from all row groups + * total_compressed_size - total compressed bytes size of the data, calculated as the sum of total_compressed_size from all row groups + * columns - the list of columns metadata with the next structure: + * name - column name + * path - column path (differs from name for nested column) + * max_definition_level - maximum definition level + * max_repetition_level - maximum repetition level + * physical_type - column physical type + * logical_type - column logical type + * compression - compression used for this column + * encodings - the list of encodings used for this column + * row_groups - the list of row groups metadata with the next structure: + * num_columns - the number of columns in the row group + * num_rows - the number of rows in the row group + * total_byte_size - total bytes size of the row group + * total_compressed_size - total compressed bytes size of the row group + * columns - the list of column chunks metadata with the next structure: + * name - column name + * path - column path + * total_compressed_size - total compressed bytes size of the column + * total_uncompressed_size - total uncompressed bytes size of the row group + * have_statistics - bool flag that indicates if column chunk metadata contains column statistics + * statistics - column chunk statistics (all fields are NULL if have_statistics = false) with the next structure: + * num_values - the number of non-null values in the column chunk + * null_count - the number of NULL values in the column chunk + * distinct_count - the number pf distinct values in the column chunk + * min - the minimum value of the column chunk + * max - the maximum column of the column chunk + * */ + +class ParquetMetadataInputFormat : public IInputFormat +{ +public: + ParquetMetadataInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_); + + String getName() const override { return "ParquetMetadataInputFormat"; } + + void resetParser() override; + +private: + Chunk generate() override; + + void onCancel() override + { + is_stopped = 1; + } + + void fillColumnsMetadata(const std::shared_ptr & metadata, MutableColumnPtr & column); + void fillRowGroupsMetadata(const std::shared_ptr & metadata, MutableColumnPtr & column); + void fillColumnChunksMetadata(const std::unique_ptr & row_group_metadata, IColumn & column); + void fillColumnStatistics(const std::shared_ptr & statistics, IColumn & column, int32_t type_length); + + const FormatSettings format_settings; + bool done = false; + std::atomic is_stopped{0}; +}; + +class ParquetMetadataSchemaReader : public ISchemaReader +{ +public: + ParquetMetadataSchemaReader(ReadBuffer & in_); + + NamesAndTypesList readSchema() override; +}; + +} + +#endif diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.reference b/tests/queries/0_stateless/02718_parquet_metadata_format.reference new file mode 100644 index 00000000000..5ec8b097cea --- /dev/null +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.reference @@ -0,0 +1,154 @@ +{ + "num_columns": "3", + "num_rows": "100000", + "num_row_groups": "2", + "format_version": "2.6", + "total_byte_size": "314147", + "total_compressed_size": "27081", + "columns": [ + { + "name": "number", + "path": "number", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=16, isSigned=false)", + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "str", + "path": "str", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "BYTE_ARRAY", + "logical_type": "None", + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "mod", + "path": "mod", + "max_definition_level": "1", + "max_repetition_level": "0", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=8, isSigned=false)", + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + } + ], + "row_groups": [ + { + "num_columns": "3", + "num_rows": "65409", + "total_byte_size": "200527", + "total_compressed_size": "14406", + "columns": [ + { + "name": "number", + "path": "number", + "total_compressed_size": "7070", + "total_uncompressed_size": "85956", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "0", + "max": "999" + } + }, + { + "name": "str", + "path": "str", + "total_compressed_size": "7093", + "total_uncompressed_size": "93853", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "Hello0", + "max": "Hello999" + } + }, + { + "name": "mod", + "path": "mod", + "total_compressed_size": "243", + "total_uncompressed_size": "20718", + "have_statistics": true, + "statistics": { + "num_values": "32705", + "null_count": "32704", + "distinct_count": null, + "min": "0", + "max": "8" + } + } + ] + }, + { + "num_columns": "3", + "num_rows": "34591", + "total_byte_size": "113620", + "total_compressed_size": "12675", + "columns": [ + { + "name": "number", + "path": "number", + "total_compressed_size": "6223", + "total_uncompressed_size": "47365", + "have_statistics": true, + "statistics": { + "num_values": "34591", + "null_count": "0", + "distinct_count": null, + "min": "0", + "max": "999" + } + }, + { + "name": "str", + "path": "str", + "total_compressed_size": "6247", + "total_uncompressed_size": "55262", + "have_statistics": true, + "statistics": { + "num_values": "34591", + "null_count": "0", + "distinct_count": null, + "min": "Hello0", + "max": "Hello999" + } + }, + { + "name": "mod", + "path": "mod", + "total_compressed_size": "205", + "total_uncompressed_size": "10993", + "have_statistics": true, + "statistics": { + "num_values": "17295", + "null_count": "17296", + "distinct_count": null, + "min": "0", + "max": "8" + } + } + ] + } + ] +} diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.sh b/tests/queries/0_stateless/02718_parquet_metadata_format.sh new file mode 100755 index 00000000000..f785abde368 --- /dev/null +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +$CLICKHOUSE_LOCAL -q "select * from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata) format JSONEachRow" | python3 -m json.tool diff --git a/tests/queries/0_stateless/data_parquet/02718_data.parquet b/tests/queries/0_stateless/data_parquet/02718_data.parquet new file mode 100644 index 0000000000000000000000000000000000000000..6a930689c83eefbb100f6210a3bab04c7094bfd7 GIT binary patch literal 28165 zcmeI*30%$j{>Smt;uNCLNr*z7LejpFJ%kXl%rG;d2q{a}F*1b4V2pieOh`g#X0nbY zq_QO>A*5YG$iAHa>vv{c^PQP{r~iGp_s%>X=RD?_^ZC8M51oF$&d;gO?{mhtV?PIl zt|FTM7096neN;s?REGg-pe77qgj(S5lhuJS z6fi+un4%u)qXEp&5RG6C3p7R(G=(LspoBGS&C&viMD8m_UM3)=!DMjLKk#JH+Z8vdY~tK&1Ho z@ew}8C-BEG495rrAP^%l3PBi+F&K+rj6(=QF&+~z5t9&x$(Vwvn1<u7Gnv%!cu&VWmt|CScz3wjWzfNYq1Vd_!jH&9ip)T z8?gy7*o;_gK^(SX8@3}JJFpYGkbv*;1Aaszc4H6rVjuS70Di(j9KvB7K@yJQ7>*+u zCy;_vq~Rn^;WWWxftD8M0O&v$RUn5R z^idVnP#p%SftoOc5o)0}>cAKZn4m69Q4jUe0A^^2Mlgp38lwrC!V*?c!WuSchURDi zTeO57TEQL;aD)?_;R08;kDAdJQsj72cUAq1fqj|rHF zNeIJaOu@aXDZa)sEXNA0 z#44=D8hnGbScfQli}m;p(b#~E*n}8tMl7}<4qLGe+Yyf)*oj?8!1wq8KOzyku?Ksx z5BqTdKj9z_;V_OM2}f}Z$B~Q^NI@#na1y6*8fS18={ScBoW})RL?$jF3zw0NE4Yel z$ia2oz)j@h7V?mf0u-VM#VEmTl;RG`a2NM*ALV#}hj@evJjN3|#WOs|3%tZDyv7@- zApPU71#Rd+7gZpK9`sQa)leMT@(Ew&>h(<7n1sbCX zn!*xRP{JBEXolu!0b8_$9a_O24se7MoZ$jjxWOGBXpJ`TL|e2&dvriYbV6r%p$odA z8@$mSJT^ z7>q?Q#vufu7>@~;WK6+SOv7}{z^9mr&oB$&n2pad2XhgDd6VJW`GGAzdmti&p;#u|KswOEHJe2ew?4$;_vjo5@3Y(^}$AP!rx4cifq9oUIo zNWk~_0Y4%UyRip*u@C!k06*a%4&gA4APGlt49Ag-6G%ZS(r^-|a2jWD7U?*L44lUW zTtp@=Aq$t0jVri{YskTM+`vub;ui9dj{+2;2*oJDZIt2;%5WF=a3AG(fQNX53OvRW zJjF9S#|yl~E4;=Vs2*1@=imROS~@)cp#xo1fgF0!M^#iqbr_%qYQhjksD;|717j#) zg1Rt8J=8}7n4uvW!5kK7j3#IbOISe(YuKO}nxh45(GqrO1$#Ka5l(Q13tZs_cX*&R z+Q1WS(GKm=0Ugl^o#BNp=!$OeMtAf;Pxzo0dZQ0~(HH&DAAT5sff$6r_y8Yb2!`S# ze2h=vk6{>&5ePsaMq(6#FdAbp7Qq;Y5QJhpCSW2aAq0+z z1*u5GNu0uIoWWV7;~X+@9v5&CnYe^3Tt+so;3}>m2iI`}H<625$U{B~P>3QFLm^XK zRaI5Iva?mpd84N=Qpgo@Ggq07t`wT;@(;Lldm_D#zgjI^rfZQT(>3-_($cq#PSQ4T z&P~!W^0GLpYwYKLw2Em!^ijE4Sng3hiwKKj`j#vFk5#pai9S}%HZk{Db^BzC;|9)| z{>N*$7epVg=~E=$Z$Z&RM!^qgl!=7@7`pA~F6 z*X~tC{<-$DDwY`?bQJ*^9rdkZGCCQ!6l8QZ>SB4`%XmP*`7Wk`G3UFQO)fa!&0?PA z1#ioh0T;U4Y>v6m!*+MUg`V~&EHC;vUkbR`%e^q>VsFpK1sD5tsA84r>!k?H?CWi{ zIkTUSOJQbz-!4{{{QL$4UK%hsaPy^sLnjwr8stCEDr<1S%D}7-f;Ml?`Y?ERVb+lG zC#)_H4Z9S0`J-utn=gMn^Ks$jPi9w9X8T7dMrIF-w2I9hzR0C0d&JT%$}0gY28_HC zxF#_6%E+k6MOQ{e&r@Cvidi}G>gc%5u~)~$?=HGJHsOTwT5#f}k=MrUD~!Dsa`17{ zwa}z0);Z&o6{B({q*-mrnRv#fIA>Bu7whX`nFB^$pPU`I<@%JI$;H>F=FYReF|A(m2tUq z3|vcc=NfgjxfNkNFzD7i(~)tv=9^6^xwXJzzD-`F<*J~(FKlAt@)p|eDarfNKE)<~ zk#km1{$lr{xcnuaPfGH?>L71cu+++l8zB=Qk@_6R>J@(KkV{TZ`5P@3~#HZhT6!;;68!(Z%0RE81GTe&&&(vnR}yEeZavtrsb_vB2ub9Zm<{1*526|5S2Z+}Vb_In4)_T0JmQ+Y~@`v)ts z#@;{ltZ4iF!>^v)xqn2aXIq}6TQ|7;sJ?Z4`7r~xvhw3b-E1Eu8xIP8aKdy{{DTy; zsbvpREf&~5OtV}a{P3jBmiULKZ1t@DD?H?>`}X3KgpST z|Mk<{1+CsZD_9-+=6SxZd3b@YN;O2DuWKmX8Oj~=@U*HbRbP35t~|BsuL>!Nuc=aX zW2KgQomefcqf)gctFF$(D$G=+aw1cxGqD=nP^D@{X0Fb}%Cm_|Wlq*ior#r&wMwNR zb5dtwrE9BFRVQn!&cv$3UZv6^>!!}c>Wqu(2~l5lBoqm)Rb?d7o-z*?iWTiuc_e}A zL@1_tsj^8z)rn9H?XF5EnXXRW9s%?44!u>$Y@Vy${Ewp`eMZavsskj8)rq*@^#`jG zh*qm3b+NS0bT<5a9Lk2OVktJLQ=!Nhrivoju1Kb6l=z+B1w*@6QP(n zUNwv4q&g7_|H-N_l8fp@D7=bfFQv#w9SKE6;sYres7{0;dw;Q% z_^T74IC%KFl#Ed)+)azxrmDVe2Cq=K(nI&?pu2ZGKXkO?4F?n}=SRk}Li&M!M5vLaO4oUPt073_#~>0~H94TGNtN@3pb3*R?Gq@+xp{I-w> zKbJ>V7%r$#<*E0w{NQ0j+wBUucdR^MgM4L(Ie9-ZSLRQw~cv!_=x;=7CgKq~DzWd{ZWem?^aDxfsdh^-SdVcp>ng*Ib(P`Hy2|ii-Jfvv@X)`ZQ`g==R@VWJaDp>j;0iam8_4vgv80k5 zSyvfOtg8%X)>VcJ>ng*Qb(P`9y2@~8U1fN%?oa3?=qerUr^)^wAIjO;3A+C)){f4( zT0H9i)#v|bpV!*a&0FVvKQ1S}PL2QQK2SQj+f=FaPIl&iX#6GifzsK71Lwj4(fI4^ z16PiR#$RV2xN$r*{yO`>o#UbL*VzXi9FM;NrH6AulfT0Q{dXUuf`i~29O~iW@z2_R z`syF%Szs#v`Nw*GzSlJWG|fLv^H0jnt$*5UYh0~-;|o>pLw|0?h`Aq-6vLJyHBjdcAr>@ z?LM)3+w!Yy^Y8EtEi;9|FWo<#NnvkWe+Ld!Hz^HKmhRM2W`;`5zu&+1|HBrbjl$MP zQB6JNS6)SGFiNdK=|VxN7pM<@wn#gstw`4vE-9R?(y`H%;(uIJ7&^&&(M<%QjR=l$nQ5*V@vD z&Ea<1>#I!H>chJ5huSgP$uh$|I{)gg|4o)>J}J_6xo>0;Uzai|pB?zNeX27qG~k!s zY0hzNlOi4E##}As)tg#ouD|^X|8VayCYkfDfBJSrN~LP88Dh~4vDD|O)Bt8^h(<7n z1sbCXn!*xRP{JBEXolu!0b8_$9a_O24se7MoZ$jjxWOGBXpJ`TL|e2&dvriYbV6r% zp$odA8@$mSJT^7>q?Q#vufu7>@~;WK6+SOv7}{z^9mr&oB$&n2pad2XhgDd6VJW`GGAzdmti&p;#u|KswOEHJe2ew?4$;_vjo5@3Y(^}$AP!rx4cifq z9oUIoNWk~_0Y4%UyRip*u@C!k06*a%4&gA4APGlt49Ag-6G%ZS(r^-|a2jWD7U?*L z44lUWTtp@=Aq$t0jVri{YskTM+`vub;ui9dj{+2;2*oJDZIt2;%5WF=a3AG(fQNX5 z3OvRWJjF9S#|yl~E4;=Vs37B7cr9o{2fC;NIrN~9s;GwQFhC8|gdvPj3$;-P#!$cn zbzzEnsE-CPLqjxzIV{i^P0$pUu!0iSut764M+?}ZCG5}&_HckBoZt)>xWWzY@IY&{ zfhXFc9onM_P&*#}D`siP()j*o%GGj|2D#2XP38aRf;?ieosAWSl?> zQjvy}IEB+VgR@A-Ib`5GF5n_EaS2(tjBH%NRa`?3uHy!7A{V!ihkO*E5Jf14blajQ z&6;uZl}THq7o^gwQ|U#i9;8>ERZ$JqVSpN_2}2m67HXpojG=%D>cSNDP#+CohK6Va zb6B7;nxH8xVFe|uVS{F9jux;*OW2_m?BM`MIKde%aD^M(;epm@15dO?JG4g!bVMg~ zh8Mb^E4slO-O&R*;e%f2jXv;2U-UzN_+bDBVh{%71AK@f7>bYZF+PDmhG95HAOL|F ziBSl`XpF&F1Y;aR5Q_1bfQgudFigf2OvN-z#|(UmnfMH|5RTdS9CI)i5txVhSb#`; zfra=Ii?A3=@D-NgYb?WZtiVdF!fLF+H&}~xh{Cs6kM9tT4cLfHh{0yWVhiH172B{K z@z{Z#*o6dqk00vuu6dsc_Q7hb0l(PD ziK(K*PQVK`DKgyBe`5QZa#LKuz|3Sl@>D1`o~Pze1|p%D6`LLu}=g+gqPij~+b z6)SOCQmn*rNwE^gC55W*FXNH}eHm1@lqoAtXus=Byc_J|#fiznf+{BKhbc2RX)Ch| zXikXl=LLj zNLs^;kkZvbSNl(gg(@>7B(15;kdUdk! z8UMe(4>XtD|8*|8myU(zlKa2bKG0lp|JS+XUOEQ@}RDK|+UrrbGSN4Y3f`#q1Nq;Jzw z%wZhmS66LBFVX((I7+ixTuQd>kH=9CnfFy08LM=fzvuCjNb_c1CYHYHi5BIu9qgOm z44O#$CU3iz$yyy{(l#CCv#mO2uD^Zkf7H#X=i?$Xl}{QG6gX~}LeAUxSyBG{)_+!} zKJj&oYSZ0O7_e0u36gScQ)#xv%7jo~3QdyM8q~9`=lQnJ$2#B{{Zg)0C2T2@c;k- literal 0 HcmV?d00001 From d095a3b06b9f5966604c774ac23f7bc99815cd93 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Tue, 18 Apr 2023 12:50:40 -0400 Subject: [PATCH 322/535] Update docs/en/operations/system-tables/mutations.md --- docs/en/operations/system-tables/mutations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/en/operations/system-tables/mutations.md b/docs/en/operations/system-tables/mutations.md index a247870005c..27cb1dba067 100644 --- a/docs/en/operations/system-tables/mutations.md +++ b/docs/en/operations/system-tables/mutations.md @@ -52,6 +52,9 @@ SELECT * FROM clusterAllReplicas('cluster_name', 'db', system.mutations) WHERE is_done=0 AND table='tmp'; ``` +:::tip +replace `tmp` in `table='tmp'` with the name of the table that you are checking mutations on. +::: **See Also** - [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) From 0ca09db306349157157713aa6576e0d5f7bda055 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Tue, 18 Apr 2023 12:51:27 -0400 Subject: [PATCH 323/535] Update docs/en/operations/system-tables/mutations.md --- docs/en/operations/system-tables/mutations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/operations/system-tables/mutations.md b/docs/en/operations/system-tables/mutations.md index 27cb1dba067..e6d1eafb9b4 100644 --- a/docs/en/operations/system-tables/mutations.md +++ b/docs/en/operations/system-tables/mutations.md @@ -55,6 +55,7 @@ WHERE is_done=0 AND table='tmp'; :::tip replace `tmp` in `table='tmp'` with the name of the table that you are checking mutations on. ::: + **See Also** - [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) From 8b05fb6f83407827a5e803e479910ea6ffbe4268 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Tue, 18 Apr 2023 12:54:54 -0400 Subject: [PATCH 324/535] need full path to markdown file including the md --- docs/en/engines/table-engines/integrations/postgresql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index 378b09e8259..d129e7a5560 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -150,7 +150,7 @@ ENGINE = PostgreSQL('localhost:5432', 'public', 'test', 'postges_user', 'postgre ### Inserting initial data from PostgreSQL table into ClickHouse table, using a SELECT query -The [postgresql table function](/docs/en/sql-reference/table-functions/postgresql) copies the data from PostgreSQL to ClickHouse, which is often used for improving the query performance of the data by querying or performing analytics in ClickHouse rather than in PostgreSQL, or can also be used for migrating data from PostgreSQL to ClickHouse: +The [postgresql table function](/docs/en/sql-reference/table-functions/postgresql.md) copies the data from PostgreSQL to ClickHouse, which is often used for improving the query performance of the data by querying or performing analytics in ClickHouse rather than in PostgreSQL, or can also be used for migrating data from PostgreSQL to ClickHouse: ``` sql INSERT INTO default.postgresql_table From 5704eea076a49096335de2916b22029211558431 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Tue, 18 Apr 2023 12:55:27 -0400 Subject: [PATCH 325/535] Update docs/en/engines/table-engines/integrations/postgresql.md --- docs/en/engines/table-engines/integrations/postgresql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index d129e7a5560..d8dc6d55cba 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -136,7 +136,7 @@ postgresql> SELECT * FROM test; ### Creating Table in ClickHouse, and connecting to PostgreSQL table created above -This example uses the [PostgreSQL table engine](/docs/en/engines/table-engines/integrations/postgresql) to connect the ClickHouse table to the PostgreSQL table: +This example uses the [PostgreSQL table engine](/docs/en/engines/table-engines/integrations/postgresql.md) to connect the ClickHouse table to the PostgreSQL table: ``` sql CREATE TABLE default.postgresql_table From f7f609dfb93b00486f0d57ca759b48bdff9bceaf Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 16:57:55 +0000 Subject: [PATCH 326/535] Better --- docs/en/interfaces/formats.md | 149 +++++++++--------- .../Impl/ParquetMetadataInputFormat.cpp | 2 +- 2 files changed, 75 insertions(+), 76 deletions(-) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index b17c3c14f73..1efaa70517f 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -10,82 +10,81 @@ results of a `SELECT`, and to perform `INSERT`s into a file-backed table. The supported formats are: -| Format | Input | Output | -|------------------------------------------------------------------------------------------|------|--------| -| [TabSeparated](#tabseparated) | ✔ | ✔ | -| [TabSeparatedRaw](#tabseparatedraw) | ✔ | ✔ | -| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | -| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | -| [TabSeparatedRawWithNames](#tabseparatedrawwithnames) | ✔ | ✔ | -| [TabSeparatedRawWithNamesAndTypes](#tabseparatedrawwithnamesandtypes) | ✔ | ✔ | -| [Template](#format-template) | ✔ | ✔ | -| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | -| [CSV](#csv) | ✔ | ✔ | -| [CSVWithNames](#csvwithnames) | ✔ | ✔ | -| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ | -| [CustomSeparated](#format-customseparated) | ✔ | ✔ | -| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ | -| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ | -| [SQLInsert](#sqlinsert) | ✗ | ✔ | -| [Values](#data-format-values) | ✔ | ✔ | -| [Vertical](#vertical) | ✗ | ✔ | -| [JSON](#json) | ✔ | ✔ | -| [JSONAsString](#jsonasstring) | ✔ | ✗ | -| [JSONStrings](#jsonstrings) | ✔ | ✔ | -| [JSONColumns](#jsoncolumns) | ✔ | ✔ | -| [JSONColumnsWithMetadata](#jsoncolumnsmonoblock)) | ✔ | ✔ | -| [JSONCompact](#jsoncompact) | ✔ | ✔ | -| [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | -| [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | -| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | -| [PrettyJSONEachRow](#prettyjsoneachrow) | ✗ | ✔ | -| [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | -| [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | -| [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | -| [JSONCompactEachRow](#jsoncompacteachrow) | ✔ | ✔ | -| [JSONCompactEachRowWithNames](#jsoncompacteachrowwithnames) | ✔ | ✔ | -| [JSONCompactEachRowWithNamesAndTypes](#jsoncompacteachrowwithnamesandtypes) | ✔ | ✔ | -| [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | -| [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | +| Format | Input | Output | +|-------------------------------------------------------------------------------------------|------|--------| +| [TabSeparated](#tabseparated) | ✔ | ✔ | +| [TabSeparatedRaw](#tabseparatedraw) | ✔ | ✔ | +| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | +| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | +| [TabSeparatedRawWithNames](#tabseparatedrawwithnames) | ✔ | ✔ | +| [TabSeparatedRawWithNamesAndTypes](#tabseparatedrawwithnamesandtypes) | ✔ | ✔ | +| [Template](#format-template) | ✔ | ✔ | +| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | +| [CSV](#csv) | ✔ | ✔ | +| [CSVWithNames](#csvwithnames) | ✔ | ✔ | +| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ | +| [CustomSeparated](#format-customseparated) | ✔ | ✔ | +| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ | +| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ | +| [SQLInsert](#sqlinsert) | ✗ | ✔ | +| [Values](#data-format-values) | ✔ | ✔ | +| [Vertical](#vertical) | ✗ | ✔ | +| [JSON](#json) | ✔ | ✔ | +| [JSONAsString](#jsonasstring) | ✔ | ✗ | +| [JSONStrings](#jsonstrings) | ✔ | ✔ | +| [JSONColumns](#jsoncolumns) | ✔ | ✔ | +| [JSONColumnsWithMetadata](#jsoncolumnsmonoblock)) | ✔ | ✔ | +| [JSONCompact](#jsoncompact) | ✔ | ✔ | +| [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | +| [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | +| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | +| [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | +| [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | +| [JSONCompactEachRow](#jsoncompacteachrow) | ✔ | ✔ | +| [JSONCompactEachRowWithNames](#jsoncompacteachrowwithnames) | ✔ | ✔ | +| [JSONCompactEachRowWithNamesAndTypes](#jsoncompacteachrowwithnamesandtypes) | ✔ | ✔ | +| [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | +| [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | | [JSONCompactStringsEachRowWithNamesAndTypes](#jsoncompactstringseachrowwithnamesandtypes) | ✔ | ✔ | -| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | -| [BSONEachRow](#bsoneachrow) | ✔ | ✔ | -| [TSKV](#tskv) | ✔ | ✔ | -| [Pretty](#pretty) | ✗ | ✔ | -| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | -| [PrettyMonoBlock](#prettymonoblock) | ✗ | ✔ | -| [PrettyNoEscapesMonoBlock](#prettynoescapesmonoblock) | ✗ | ✔ | -| [PrettyCompact](#prettycompact) | ✗ | ✔ | -| [PrettyCompactNoEscapes](#prettycompactnoescapes) | ✗ | ✔ | -| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | -| [PrettyCompactNoEscapesMonoBlock](#prettycompactnoescapesmonoblock) | ✗ | ✔ | -| [PrettySpace](#prettyspace) | ✗ | ✔ | -| [PrettySpaceNoEscapes](#prettyspacenoescapes) | ✗ | ✔ | -| [PrettySpaceMonoBlock](#prettyspacemonoblock) | ✗ | ✔ | -| [PrettySpaceNoEscapesMonoBlock](#prettyspacenoescapesmonoblock) | ✗ | ✔ | -| [Prometheus](#prometheus) | ✗ | ✔ | -| [Protobuf](#protobuf) | ✔ | ✔ | -| [ProtobufSingle](#protobufsingle) | ✔ | ✔ | -| [Avro](#data-format-avro) | ✔ | ✔ | -| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | -| [Parquet](#data-format-parquet) | ✔ | ✔ | -| [ParqueMetadata](#data-format-parquet-metadata) | ✔ | ✗ | -| [Arrow](#data-format-arrow) | ✔ | ✔ | -| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | -| [ORC](#data-format-orc) | ✔ | ✔ | -| [RowBinary](#rowbinary) | ✔ | ✔ | -| [RowBinaryWithNames](#rowbinarywithnamesandtypes) | ✔ | ✔ | -| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | -| [Native](#native) | ✔ | ✔ | -| [Null](#null) | ✗ | ✔ | -| [XML](#xml) | ✗ | ✔ | -| [CapnProto](#capnproto) | ✔ | ✔ | -| [LineAsString](#lineasstring) | ✔ | ✔ | -| [Regexp](#data-format-regexp) | ✔ | ✗ | -| [RawBLOB](#rawblob) | ✔ | ✔ | -| [MsgPack](#msgpack) | ✔ | ✔ | -| [MySQLDump](#mysqldump) | ✔ | ✗ | -| [Markdown](#markdown) | ✗ | ✔ | +| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | +| [BSONEachRow](#bsoneachrow) | ✔ | ✔ | +| [TSKV](#tskv) | ✔ | ✔ | +| [Pretty](#pretty) | ✗ | ✔ | +| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | +| [PrettyMonoBlock](#prettymonoblock) | ✗ | ✔ | +| [PrettyNoEscapesMonoBlock](#prettynoescapesmonoblock) | ✗ | ✔ | +| [PrettyCompact](#prettycompact) | ✗ | ✔ | +| [PrettyCompactNoEscapes](#prettycompactnoescapes) | ✗ | ✔ | +| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | +| [PrettyCompactNoEscapesMonoBlock](#prettycompactnoescapesmonoblock) | ✗ | ✔ | +| [PrettySpace](#prettyspace) | ✗ | ✔ | +| [PrettySpaceNoEscapes](#prettyspacenoescapes) | ✗ | ✔ | +| [PrettySpaceMonoBlock](#prettyspacemonoblock) | ✗ | ✔ | +| [PrettySpaceNoEscapesMonoBlock](#prettyspacenoescapesmonoblock) | ✗ | ✔ | +| [Prometheus](#prometheus) | ✗ | ✔ | +| [Protobuf](#protobuf) | ✔ | ✔ | +| [ProtobufSingle](#protobufsingle) | ✔ | ✔ | +| [Avro](#data-format-avro) | ✔ | ✔ | +| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | +| [Parquet](#data-format-parquet) | ✔ | ✔ | +| [ParqueMetadata](#data-format-parquet-metadata) | ✔ | ✗ | +| [Arrow](#data-format-arrow) | ✔ | ✔ | +| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | +| [ORC](#data-format-orc) | ✔ | ✔ | +| [RowBinary](#rowbinary) | ✔ | ✔ | +| [RowBinaryWithNames](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [Native](#native) | ✔ | ✔ | +| [Null](#null) | ✗ | ✔ | +| [XML](#xml) | ✗ | ✔ | +| [CapnProto](#capnproto) | ✔ | ✔ | +| [LineAsString](#lineasstring) | ✔ | ✔ | +| [Regexp](#data-format-regexp) | ✔ | ✗ | +| [RawBLOB](#rawblob) | ✔ | ✔ | +| [MsgPack](#msgpack) | ✔ | ✔ | +| [MySQLDump](#mysqldump) | ✔ | ✗ | +| [Markdown](#markdown) | ✗ | ✔ | You can control some format processing parameters with the ClickHouse settings. For more information read the [Settings](/docs/en/operations/settings/settings-formats.md) section. diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp index c384c3811db..e7739c3535a 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -351,7 +351,7 @@ void ParquetMetadataInputFormat::fillColumnStatistics(const std::shared_ptr(statistics_column.getColumn(2)); size_t distinct_count = statistics->distinct_count(); /// It can be set but still be 0 because of a bug: https://github.com/apache/arrow/issues/27644 - /// If we see distinct_count = 0 with non 0 values in chunk, set it to NULL. + /// If we see distinct_count = 0 with non 0 values in chunk, set it to NULL if (distinct_count == 0 && statistics->num_values() != 0) { nullable_distinct_count.insertDefault(); From 2518ee4988443516092c3d40b52046237fd851b8 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 16:58:43 +0000 Subject: [PATCH 327/535] Remove deleted line --- docs/en/interfaces/formats.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index 1efaa70517f..51eac1251be 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -916,6 +916,8 @@ Example: {"num":44,"str":"hello","arr":[0,1,2,3]} ``` +While importing data columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](/docs/en/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) is set to 1. + ## JSONStringsEachRow {#jsonstringseachrow} Differs from JSONEachRow only in that data fields are output in strings, not in typed JSON values. From b8b4db8c26e8885ac6b1ea53d46b295758ff0d0f Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 17:05:59 +0000 Subject: [PATCH 328/535] More tests --- .../02718_parquet_metadata_format.reference | 58 +++++++++++++++++++ .../02718_parquet_metadata_format.sh | 13 ++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.reference b/tests/queries/0_stateless/02718_parquet_metadata_format.reference index 5ec8b097cea..c467029481b 100644 --- a/tests/queries/0_stateless/02718_parquet_metadata_format.reference +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.reference @@ -13,6 +13,7 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=16, isSigned=false)", + "is_nullable": false, "compression": "LZ4", "encodings": [ "RLE_DICTIONARY", @@ -27,6 +28,7 @@ "max_repetition_level": "0", "physical_type": "BYTE_ARRAY", "logical_type": "None", + "is_nullable": false, "compression": "LZ4", "encodings": [ "RLE_DICTIONARY", @@ -41,6 +43,7 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=8, isSigned=false)", + "is_nullable": true, "compression": "LZ4", "encodings": [ "RLE_DICTIONARY", @@ -152,3 +155,58 @@ } ] } +{ + "num_columns": "3", + "format_version": "2.6" +} +{ + "columns": [ + { + "name": "number", + "path": "number", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=16, isSigned=false)", + "is_nullable": false, + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "str", + "path": "str", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "BYTE_ARRAY", + "logical_type": "None", + "is_nullable": false, + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "mod", + "path": "mod", + "max_definition_level": "1", + "max_repetition_level": "0", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=8, isSigned=false)", + "is_nullable": true, + "compression": "LZ4", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + } + ] +} +1 +1 diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.sh b/tests/queries/0_stateless/02718_parquet_metadata_format.sh index f785abde368..3a532fe9604 100755 --- a/tests/queries/0_stateless/02718_parquet_metadata_format.sh +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.sh @@ -4,4 +4,15 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh -$CLICKHOUSE_LOCAL -q "select * from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata) format JSONEachRow" | python3 -m json.tool +$CLICKHOUSE_LOCAL -q "select * from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata) format JSONEachRow" | python3 -m json.tool + +$CLICKHOUSE_LOCAL -q "select num_columns, format_version from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata, 'num_columns UInt64, format_version String') format JSONEachRow" | python3 -m json.tool + +$CLICKHOUSE_LOCAL -q "select columns from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata) format JSONEachRow" | python3 -m json.tool + + +$CLICKHOUSE_LOCAL -q "select some_column from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata, 'some_column Array(UInt32)')" 2>&1 | grep -c "BAD_ARGUMENTS" + +$CLICKHOUSE_LOCAL -q "select num_columns from file('$CURDIR/data_parquet/02718_data.parquet', ParquetMetadata, 'num_columns Array(UInt32)')" 2>&1 | grep -c "BAD_ARGUMENTS" + + From c5efa4dc01200504609e26319d5aa06a24fac5c5 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 17:10:37 +0000 Subject: [PATCH 329/535] Add comment --- src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp index e7739c3535a..c6c7d5fac79 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -173,6 +173,7 @@ Chunk ParquetMetadataInputFormat::generate() else if (name == names[3]) { auto column = types[3]->createColumn(); + /// Version сan be only PARQUET_1_0 or PARQUET_2_LATEST (which is 2.6). String version = metadata->version() == parquet::ParquetVersion::PARQUET_1_0 ? "1.0" : "2.6"; assert_cast(*column).insertData(version.data(), version.size()); res.addColumn(std::move(column)); From b0e5f7069e617d2a715c72a59f3330848cd8625c Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 17:15:16 +0000 Subject: [PATCH 330/535] Update exception message --- src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp index c6c7d5fac79..8f237d12da6 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -106,7 +106,7 @@ void checkHeader(const Block & header) throw Exception( ErrorCodes::BAD_ARGUMENTS, "Unexpected column: {}. ParquetMetadata format allows only the next columns: num_columns, num_rows, num_row_groups, " - "format_version, columns, row_groups", name); + "format_version, total_byte_size, total_compressed_size, columns, row_groups", name); if (!it->second->equals(*type)) throw Exception( From 7a67951f64084205849c8a763e65a2bedecad0e3 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 17:59:01 +0000 Subject: [PATCH 331/535] Add more fields, fix style --- docs/en/interfaces/formats.md | 60 ++++++++------ .../Impl/ParquetMetadataInputFormat.cpp | 78 ++++++++++++++----- .../Formats/Impl/ParquetMetadataInputFormat.h | 11 ++- .../02718_parquet_metadata_format.reference | 31 +++++--- .../aspell-ignore/en/aspell-dict.txt | 2 + 5 files changed, 123 insertions(+), 59 deletions(-) diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index 51eac1251be..fa1e9f82421 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -68,7 +68,7 @@ The supported formats are: | [Avro](#data-format-avro) | ✔ | ✔ | | [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | | [Parquet](#data-format-parquet) | ✔ | ✔ | -| [ParqueMetadata](#data-format-parquet-metadata) | ✔ | ✗ | +| [ParquetMetadata](#data-format-parquet-metadata) | ✔ | ✗ | | [Arrow](#data-format-arrow) | ✔ | ✔ | | [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | | [ORC](#data-format-orc) | ✔ | ✔ | @@ -2011,7 +2011,7 @@ Special format for reading Parquet file metadata (https://parquet.apache.org/doc - num_rows - the total number of rows - num_row_groups - the total number of row groups - format_version - parquet format version, always 1.0 or 2.6 -- total_byte_size - total bytes size of the data, calculated as the sum of total_byte_size from all row groups +- total_uncompressed_size - total uncompressed bytes size of the data, calculated as the sum of total_byte_size from all row groups - total_compressed_size - total compressed bytes size of the data, calculated as the sum of total_compressed_size from all row groups - columns - the list of columns metadata with the next structure: - name - column name @@ -2021,18 +2021,21 @@ Special format for reading Parquet file metadata (https://parquet.apache.org/doc - physical_type - column physical type - logical_type - column logical type - compression - compression used for this column + - total_uncompressed_size - total uncompressed bytes size of the column, calculated as the sum of total_uncompressed_size of the column from all row groups + - total_compressed_size - total compressed bytes size of the column, calculated as the sum of total_compressed_size of the column from all row groups + - space_saved - percent of space saved by compression, calculated as (1 - total_compressed_size/total_uncompressed_size). - encodings - the list of encodings used for this column - row_groups - the list of row groups metadata with the next structure: - num_columns - the number of columns in the row group - num_rows - the number of rows in the row group - - total_byte_size - total bytes size of the row group + - total_uncompressed_size - total uncompressed bytes size of the row group - total_compressed_size - total compressed bytes size of the row group - columns - the list of column chunks metadata with the next structure: - name - column name - path - column path - total_compressed_size - total compressed bytes size of the column - total_uncompressed_size - total uncompressed bytes size of the row group - - have_statistics - bool flag that indicates if column chunk metadata contains column statistics + - have_statistics - boolean flag that indicates if column chunk metadata contains column statistics - statistics - column chunk statistics (all fields are NULL if have_statistics = false) with the next structure: - num_values - the number of non-null values in the column chunk - null_count - the number of NULL values in the column chunk @@ -2049,20 +2052,24 @@ SELECT * FROM file(data.parquet, ParquetMetadata) format PrettyJSONEachRow ```json { "num_columns": "2", - "num_rows": "1000000", - "num_row_groups": "16", + "num_rows": "100000", + "num_row_groups": "2", "format_version": "2.6", - "total_byte_size": "10001981", - "total_compressed_size": "6011415", + "metadata_size": "577", + "total_uncompressed_size": "282436", + "total_compressed_size": "26633", "columns": [ { "name": "number", "path": "number", "max_definition_level": "0", "max_repetition_level": "0", - "physical_type": "INT64", - "logical_type": "Int(bitWidth=64, isSigned=false)", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=16, isSigned=false)", "compression": "LZ4", + "total_uncompressed_size": "133321", + "total_compressed_size": "13293", + "space_saved": "90.03%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -2070,13 +2077,16 @@ SELECT * FROM file(data.parquet, ParquetMetadata) format PrettyJSONEachRow ] }, { - "name": "'Hello'", - "path": "'Hello'", + "name": "concat('Hello', toString(modulo(number, 1000)))", + "path": "concat('Hello', toString(modulo(number, 1000)))", "max_definition_level": "0", "max_repetition_level": "0", "physical_type": "BYTE_ARRAY", "logical_type": "None", "compression": "LZ4", + "total_uncompressed_size": "149115", + "total_compressed_size": "13340", + "space_saved": "91.05%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -2088,41 +2098,41 @@ SELECT * FROM file(data.parquet, ParquetMetadata) format PrettyJSONEachRow { "num_columns": "2", "num_rows": "65409", - "total_byte_size": "654367", - "total_compressed_size": "393396", + "total_uncompressed_size": "179809", + "total_compressed_size": "14163", "columns": [ { "name": "number", "path": "number", - "total_compressed_size": "393329", - "total_uncompressed_size": "654302", + "total_compressed_size": "7070", + "total_uncompressed_size": "85956", "have_statistics": true, "statistics": { "num_values": "65409", "null_count": "0", "distinct_count": null, "min": "0", - "max": "65408" + "max": "999" } }, { - "name": "'Hello'", - "path": "'Hello'", - "total_compressed_size": "67", - "total_uncompressed_size": "65", + "name": "concat('Hello', toString(modulo(number, 1000)))", + "path": "concat('Hello', toString(modulo(number, 1000)))", + "total_compressed_size": "7093", + "total_uncompressed_size": "93853", "have_statistics": true, "statistics": { "num_values": "65409", "null_count": "0", "distinct_count": null, - "min": "Hello", - "max": "Hello" + "min": "Hello0", + "max": "Hello999" } } ] }, - ... - ] + ... + ] } ``` diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp index 8f237d12da6..c7d96cedb29 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -39,7 +39,8 @@ static NamesAndTypesList getHeaderForParquetMetadata() {"num_rows", std::make_shared()}, {"num_row_groups", std::make_shared()}, {"format_version", std::make_shared()}, - {"total_byte_size", std::make_shared()}, + {"metadata_size", std::make_shared()}, + {"total_uncompressed_size", std::make_shared()}, {"total_compressed_size", std::make_shared()}, {"columns", std::make_shared( @@ -52,6 +53,9 @@ static NamesAndTypesList getHeaderForParquetMetadata() std::make_shared(), std::make_shared(), std::make_shared(), + std::make_shared(), + std::make_shared(), + std::make_shared(), std::make_shared(std::make_shared())}, Names{ "name", @@ -61,6 +65,9 @@ static NamesAndTypesList getHeaderForParquetMetadata() "physical_type", "logical_type", "compression", + "total_uncompressed_size", + "total_compressed_size", + "space_saved", "encodings"}))}, {"row_groups", std::make_shared(std::make_shared( @@ -87,7 +94,7 @@ static NamesAndTypesList getHeaderForParquetMetadata() Names{"num_values", "null_count", "distinct_count", "min", "max"}), }, Names{"name", "path", "total_compressed_size", "total_uncompressed_size", "have_statistics", "statistics"}))}, - Names{"num_columns", "num_rows", "total_byte_size", "total_compressed_size", "columns"}))}, + Names{"num_columns", "num_rows", "total_uncompressed_size", "total_compressed_size", "columns"}))}, }; return names_and_types; } @@ -106,7 +113,7 @@ void checkHeader(const Block & header) throw Exception( ErrorCodes::BAD_ARGUMENTS, "Unexpected column: {}. ParquetMetadata format allows only the next columns: num_columns, num_rows, num_row_groups, " - "format_version, total_byte_size, total_compressed_size, columns, row_groups", name); + "format_version, metadata_size, total_uncompressed_size, total_compressed_size, columns, row_groups", name); if (!it->second->equals(*type)) throw Exception( @@ -178,21 +185,28 @@ Chunk ParquetMetadataInputFormat::generate() assert_cast(*column).insertData(version.data(), version.size()); res.addColumn(std::move(column)); } - /// total_byte_size + /// metadata_size else if (name == names[4]) { auto column = types[4]->createColumn(); - size_t total_byte_size = 0; - for (int32_t i = 0; i != metadata->num_row_groups(); ++i) - total_byte_size += metadata->RowGroup(i)->total_byte_size(); - - assert_cast(*column).insertValue(total_byte_size); + assert_cast(*column).insertValue(metadata->size()); res.addColumn(std::move(column)); } - /// total_compressed_size + /// total_uncompressed_size else if (name == names[5]) { auto column = types[5]->createColumn(); + size_t total_uncompressed_size = 0; + for (int32_t i = 0; i != metadata->num_row_groups(); ++i) + total_uncompressed_size += metadata->RowGroup(i)->total_byte_size(); + + assert_cast(*column).insertValue(total_uncompressed_size); + res.addColumn(std::move(column)); + } + /// total_compressed_size + else if (name == names[6]) + { + auto column = types[6]->createColumn(); size_t total_compressed_size = 0; for (int32_t i = 0; i != metadata->num_row_groups(); ++i) total_compressed_size += metadata->RowGroup(i)->total_compressed_size(); @@ -201,16 +215,16 @@ Chunk ParquetMetadataInputFormat::generate() res.addColumn(std::move(column)); } /// columns - else if (name == names[6]) + else if (name == names[7]) { - auto column = types[6]->createColumn(); + auto column = types[7]->createColumn(); fillColumnsMetadata(metadata, column); res.addColumn(std::move(column)); } /// row_groups - else if (name == names[7]) + else if (name == names[8]) { - auto column = types[7]->createColumn(); + auto column = types[8]->createColumn(); fillRowGroupsMetadata(metadata, column); res.addColumn(std::move(column)); } @@ -225,9 +239,9 @@ void ParquetMetadataInputFormat::fillColumnsMetadata(const std::shared_ptr(*column); auto & tuple_column = assert_cast(array_column.getData()); int32_t num_columns = metadata->num_columns(); - for (int32_t i = 0; i != num_columns; ++i) + for (int32_t column_i = 0; column_i != num_columns; ++column_i) { - const auto * column_info = metadata->schema()->Column(i); + const auto * column_info = metadata->schema()->Column(column_i); /// name String column_name = column_info->name(); assert_cast(tuple_column.getColumn(0)).insertData(column_name.data(), column_name.size()); @@ -247,10 +261,29 @@ void ParquetMetadataInputFormat::fillColumnsMetadata(const std::shared_ptrnum_row_groups() > 0) { - auto column_chunk_metadata = metadata->RowGroup(0)->ColumnChunk(i); + auto column_chunk_metadata = metadata->RowGroup(0)->ColumnChunk(column_i); + /// compression std::string_view compression = magic_enum::enum_name(column_chunk_metadata->compression()); assert_cast(tuple_column.getColumn(6)).insertData(compression.data(), compression.size()); - auto & encodings_array_column = assert_cast(tuple_column.getColumn(7)); + + /// total_uncompressed_size/total_compressed_size + size_t total_uncompressed_size = 0; + size_t total_compressed_size = 0; + for (int32_t row_group_i = 0; row_group_i != metadata->num_row_groups(); ++row_group_i) + { + column_chunk_metadata = metadata->RowGroup(row_group_i)->ColumnChunk(column_i); + total_uncompressed_size += column_chunk_metadata->total_uncompressed_size(); + total_compressed_size += column_chunk_metadata->total_compressed_size(); + } + assert_cast(tuple_column.getColumn(7)).insertValue(total_uncompressed_size); + assert_cast(tuple_column.getColumn(8)).insertValue(total_compressed_size); + + /// space_saved + String space_saved = fmt::format("{:.4}%", (1 - double(total_compressed_size) / total_uncompressed_size) * 100); + assert_cast(tuple_column.getColumn(9)).insertData(space_saved.data(), space_saved.size()); + + /// encodings + auto & encodings_array_column = assert_cast(tuple_column.getColumn(10)); auto & encodings_nested_column = assert_cast(encodings_array_column.getData()); for (auto codec : column_chunk_metadata->encodings()) { @@ -262,8 +295,11 @@ void ParquetMetadataInputFormat::fillColumnsMetadata(const std::shared_ptr(tuple_column.getColumn(5)).insertData(compression.data(), compression.size()); - tuple_column.getColumn(6).insertDefault(); + assert_cast(tuple_column.getColumn(6)).insertData(compression.data(), compression.size()); + tuple_column.getColumn(7).insertDefault(); + tuple_column.getColumn(8).insertDefault(); + tuple_column.getColumn(9).insertDefault(); + tuple_column.getColumn(10).insertDefault(); } } array_column.getOffsets().push_back(tuple_column.size()); @@ -280,7 +316,7 @@ void ParquetMetadataInputFormat::fillRowGroupsMetadata(const std::shared_ptr(row_groups_column.getColumn(0)).insertValue(row_group_metadata->num_columns()); /// num_rows assert_cast(row_groups_column.getColumn(1)).insertValue(row_group_metadata->num_rows()); - /// total_bytes_size + /// total_uncompressed_size assert_cast(row_groups_column.getColumn(2)).insertValue(row_group_metadata->total_byte_size()); /// total_compressed_size assert_cast(row_groups_column.getColumn(3)).insertValue(row_group_metadata->total_compressed_size()); diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h index 3561ec6dae8..2d027e5000f 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.h @@ -20,7 +20,7 @@ namespace DB * num_rows - the total number of rows * num_row_groups - the total number of row groups * format_version - parquet format version, always 1.0 or 2.6 - * total_byte_size - total bytes size of the data, calculated as the sum of total_byte_size from all row groups + * total_uncompressed_size - total bytes size of the data, calculated as the sum of total_uncompressed_size from all row groups * total_compressed_size - total compressed bytes size of the data, calculated as the sum of total_compressed_size from all row groups * columns - the list of columns metadata with the next structure: * name - column name @@ -30,17 +30,20 @@ namespace DB * physical_type - column physical type * logical_type - column logical type * compression - compression used for this column + * total_compressed_size - total compressed bytes size of the column, calculated as the sum of total_uncompressed_size of the column from all row groups + * total_uncompressed_size - total uncompressed bytes size of the column, calculated as the sum of total_compressed_size of the column from all row groups + * space_saved - percent of space saved by compression, calculated as (1 - total_compressed_size/total_uncompressed_size). * encodings - the list of encodings used for this column * row_groups - the list of row groups metadata with the next structure: * num_columns - the number of columns in the row group * num_rows - the number of rows in the row group - * total_byte_size - total bytes size of the row group + * total_uncompressed_size - total bytes size of the row group * total_compressed_size - total compressed bytes size of the row group * columns - the list of column chunks metadata with the next structure: * name - column name * path - column path - * total_compressed_size - total compressed bytes size of the column - * total_uncompressed_size - total uncompressed bytes size of the row group + * total_compressed_size - total compressed bytes size of the column in the row group + * total_uncompressed_size - total uncompressed bytes size of the column in the row group * have_statistics - bool flag that indicates if column chunk metadata contains column statistics * statistics - column chunk statistics (all fields are NULL if have_statistics = false) with the next structure: * num_values - the number of non-null values in the column chunk diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.reference b/tests/queries/0_stateless/02718_parquet_metadata_format.reference index c467029481b..1f55c29da56 100644 --- a/tests/queries/0_stateless/02718_parquet_metadata_format.reference +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.reference @@ -3,7 +3,8 @@ "num_rows": "100000", "num_row_groups": "2", "format_version": "2.6", - "total_byte_size": "314147", + "metadata_size": "617", + "total_uncompressed_size": "314147", "total_compressed_size": "27081", "columns": [ { @@ -13,8 +14,10 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=16, isSigned=false)", - "is_nullable": false, "compression": "LZ4", + "total_uncompressed_size": "133321", + "total_compressed_size": "13293", + "space_saved": "90.03%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -28,8 +31,10 @@ "max_repetition_level": "0", "physical_type": "BYTE_ARRAY", "logical_type": "None", - "is_nullable": false, "compression": "LZ4", + "total_uncompressed_size": "149115", + "total_compressed_size": "13340", + "space_saved": "91.05%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -43,8 +48,10 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=8, isSigned=false)", - "is_nullable": true, "compression": "LZ4", + "total_uncompressed_size": "31711", + "total_compressed_size": "448", + "space_saved": "98.59%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -56,7 +63,7 @@ { "num_columns": "3", "num_rows": "65409", - "total_byte_size": "200527", + "total_uncompressed_size": "200527", "total_compressed_size": "14406", "columns": [ { @@ -106,7 +113,7 @@ { "num_columns": "3", "num_rows": "34591", - "total_byte_size": "113620", + "total_uncompressed_size": "113620", "total_compressed_size": "12675", "columns": [ { @@ -168,8 +175,10 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=16, isSigned=false)", - "is_nullable": false, "compression": "LZ4", + "total_uncompressed_size": "133321", + "total_compressed_size": "13293", + "space_saved": "90.03%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -183,8 +192,10 @@ "max_repetition_level": "0", "physical_type": "BYTE_ARRAY", "logical_type": "None", - "is_nullable": false, "compression": "LZ4", + "total_uncompressed_size": "149115", + "total_compressed_size": "13340", + "space_saved": "91.05%", "encodings": [ "RLE_DICTIONARY", "PLAIN", @@ -198,8 +209,10 @@ "max_repetition_level": "0", "physical_type": "INT32", "logical_type": "Int(bitWidth=8, isSigned=false)", - "is_nullable": true, "compression": "LZ4", + "total_uncompressed_size": "31711", + "total_compressed_size": "448", + "space_saved": "98.59%", "encodings": [ "RLE_DICTIONARY", "PLAIN", diff --git a/utils/check-style/aspell-ignore/en/aspell-dict.txt b/utils/check-style/aspell-ignore/en/aspell-dict.txt index 4eb0e9dc42d..1ad32f6e280 100644 --- a/utils/check-style/aspell-ignore/en/aspell-dict.txt +++ b/utils/check-style/aspell-ignore/en/aspell-dict.txt @@ -119,6 +119,7 @@ OpenStack OpenTelemetry PAAMAYIM Parsers +ParquetMetadata Postgres Precompiled PrettyCompact @@ -287,6 +288,7 @@ dragonbox durations endian enum +encodings exFAT fastops fcoverage From d2608e46153cb81ce19ed4d93fcc20d0f3a1008e Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 18:01:42 +0000 Subject: [PATCH 332/535] Tag no-fasttest --- tests/queries/0_stateless/02718_parquet_metadata_format.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/queries/0_stateless/02718_parquet_metadata_format.sh b/tests/queries/0_stateless/02718_parquet_metadata_format.sh index 3a532fe9604..94d7f453850 100755 --- a/tests/queries/0_stateless/02718_parquet_metadata_format.sh +++ b/tests/queries/0_stateless/02718_parquet_metadata_format.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# Tags: no-fasttest CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh From 0878ab844316db9af22dca5aa2df9f1058301f83 Mon Sep 17 00:00:00 2001 From: avogar Date: Tue, 18 Apr 2023 19:51:53 +0000 Subject: [PATCH 333/535] Fix build --- src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp index c7d96cedb29..229a0630328 100644 --- a/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetMetadataInputFormat.cpp @@ -135,7 +135,7 @@ static std::shared_ptr getFileMetadata( } ParquetMetadataInputFormat::ParquetMetadataInputFormat(ReadBuffer & in_, Block header_, const FormatSettings & format_settings_) - : IInputFormat(std::move(header_), in_), format_settings(format_settings_) + : IInputFormat(std::move(header_), &in_), format_settings(format_settings_) { checkHeader(getPort().getHeader()); } From d5eb65b5eac4b133d0eb99c7e33cdc381a98ac4c Mon Sep 17 00:00:00 2001 From: Igor Nikonov Date: Tue, 18 Apr 2023 22:41:28 +0000 Subject: [PATCH 334/535] Remove redundant narrowPipe() --- src/Storages/StorageS3.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Storages/StorageS3.cpp b/src/Storages/StorageS3.cpp index b4ca8f18b40..ec030a184a1 100644 --- a/src/Storages/StorageS3.cpp +++ b/src/Storages/StorageS3.cpp @@ -44,7 +44,6 @@ #include #include #include -#include #include @@ -1076,10 +1075,7 @@ Pipe StorageS3::read( max_download_threads)); } - auto pipe = Pipe::unitePipes(std::move(pipes)); - - narrowPipe(pipe, num_streams); - return pipe; + return Pipe::unitePipes(std::move(pipes)); } SinkToStoragePtr StorageS3::write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, ContextPtr local_context) From 11b3469eacef209a6667d8a166313d65460c6cb2 Mon Sep 17 00:00:00 2001 From: xieyichen Date: Wed, 19 Apr 2023 11:13:16 +0800 Subject: [PATCH 335/535] reopen stale fd --- src/Common/AsynchronousMetrics.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Common/AsynchronousMetrics.cpp b/src/Common/AsynchronousMetrics.cpp index 32d54b7644e..06fb005c314 100644 --- a/src/Common/AsynchronousMetrics.cpp +++ b/src/Common/AsynchronousMetrics.cpp @@ -683,6 +683,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/loadavg", loadavg); } } @@ -700,6 +701,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/uptime", uptime); } } @@ -887,6 +889,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/stat", proc_stat); } } @@ -1007,6 +1010,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/meminfo", meminfo); } } @@ -1059,6 +1063,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/cpuinfo", cpuinfo); } } @@ -1076,6 +1081,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/sys/fs/file-nr", file_nr); } } @@ -1308,6 +1314,7 @@ void AsynchronousMetrics::update(TimePoint update_time) catch (...) { tryLogCurrentException(__PRETTY_FUNCTION__); + openFileIfExists("/proc/net/dev", net_dev); } } From 33bedc0291d9410c1c0ff0d9c1e1faee797aacf5 Mon Sep 17 00:00:00 2001 From: lgbo-ustc Date: Fri, 14 Apr 2023 10:03:38 +0800 Subject: [PATCH 336/535] improve jsonpath support in json functions --- .../Parsers/ParserJSONPathMemberAccess.cpp | 50 ++++++++++++++---- ...arserJSONPathMemberSquareBracketAccess.cpp | 51 +++++++++++++++++++ .../ParserJSONPathMemberSquareBracketAccess.h | 17 +++++++ .../JSONPath/Parsers/ParserJSONPathQuery.cpp | 3 ++ .../01889_sql_json_functions.reference | 20 ++++++++ .../0_stateless/01889_sql_json_functions.sql | 10 ++++ 6 files changed, 142 insertions(+), 9 deletions(-) create mode 100644 src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.cpp create mode 100644 src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.h diff --git a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp index f0ed178e1c2..8a415816798 100644 --- a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp +++ b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp @@ -1,9 +1,11 @@ #include #include +#include #include #include #include +#include namespace DB { @@ -16,18 +18,48 @@ namespace DB */ bool ParserJSONPathMemberAccess::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { - if (pos->type != TokenType::Dot) + // There's a specical case, that a path member can begin with number + if (pos->type != TokenType::Dot && pos->type != TokenType::Number) return false; + if (pos->type != TokenType::Number) + ++pos; - ++pos; - - if (pos->type != TokenType::BareWord && pos->type !=TokenType::QuotedIdentifier) - return false; - - ParserIdentifier name_p; ASTPtr member_name; - if (!name_p.parse(pos, member_name, expected)) - return false; + + if (pos->type == TokenType::Number)[[unlikely]] + { + for (const auto * c = pos->begin; c != pos->end; ++c) + { + if (*c == '.' && c == pos->begin) + continue; + if (!isNumericASCII(*c)) + { + return false; + } + } + const auto * last_begin = *pos->begin == '.' ? pos->begin + 1 : pos->begin; + const auto * last_end = pos->end; + ++pos; + + if (pos.isValid() && pos->type == TokenType::BareWord && pos->begin == last_end) + { + member_name = std::make_shared(String(last_begin, pos->end)); + ++pos; + } + else + { + return false; + } + } + else + { + if (pos->type != TokenType::BareWord && pos->type != TokenType::QuotedIdentifier) + return false; + + ParserIdentifier name_p; + if (!name_p.parse(pos, member_name, expected)) + return false; + } auto member_access = std::make_shared(); node = member_access; diff --git a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.cpp b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.cpp new file mode 100644 index 00000000000..b3059fcfd94 --- /dev/null +++ b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.cpp @@ -0,0 +1,51 @@ +#include "ParserJSONPathMemberSquareBracketAccess.h" +#include +#include +#include +#include +#include +#include + +namespace DB +{ +bool ParserJSONPathMemberSquareBracketAccess::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +{ + if (pos->type != TokenType::OpeningSquareBracket) + return false; + ++pos; + ASTPtr member_name; + if (pos->type == TokenType::BareWord || pos->type == TokenType::QuotedIdentifier) + { + ParserIdentifier name_p; + if (!name_p.parse(pos, member_name, expected)) + return false; + } + else if (pos->type == TokenType::StringLiteral) + { + try + { + ReadBufferFromMemory in(pos->begin, pos->size()); + String name; + readQuotedStringWithSQLStyle(name, in); + member_name = std::make_shared(name); + ++pos; + } + catch (const Exception &) + { + return false; + } + } + else + { + return false; + } + if (pos->type != TokenType::ClosingSquareBracket) + { + return false; + } + ++pos; + auto member_access = std::make_shared(); + node = member_access; + return tryGetIdentifierNameInto(member_name, member_access->member_name); +} +} diff --git a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.h b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.h new file mode 100644 index 00000000000..b682ec5bb96 --- /dev/null +++ b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberSquareBracketAccess.h @@ -0,0 +1,17 @@ +#pragma once +#include +// cases +// - [ident] +// - ['ident'] +// - ["ident"] +namespace DB +{ +class ParserJSONPathMemberSquareBracketAccess : public IParserBase +{ +private: + const char * getName() const override { return "ParserJSONPathMemberSquareBracketAccess"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +public: + explicit ParserJSONPathMemberSquareBracketAccess() = default; +}; +} diff --git a/src/Functions/JSONPath/Parsers/ParserJSONPathQuery.cpp b/src/Functions/JSONPath/Parsers/ParserJSONPathQuery.cpp index c18b2ad9b31..d8d633a1ec9 100644 --- a/src/Functions/JSONPath/Parsers/ParserJSONPathQuery.cpp +++ b/src/Functions/JSONPath/Parsers/ParserJSONPathQuery.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,7 @@ bool ParserJSONPathQuery::parseImpl(Pos & pos, ASTPtr & query, Expected & expect { query = std::make_shared(); ParserJSONPathMemberAccess parser_jsonpath_member_access; + ParserJSONPathMemberSquareBracketAccess parser_jsonpath_member_square_bracket_access; ParserJSONPathRange parser_jsonpath_range; ParserJSONPathStar parser_jsonpath_star; ParserJSONPathRoot parser_jsonpath_root; @@ -32,6 +34,7 @@ bool ParserJSONPathQuery::parseImpl(Pos & pos, ASTPtr & query, Expected & expect ASTPtr accessor; while (parser_jsonpath_member_access.parse(pos, accessor, expected) + || parser_jsonpath_member_square_bracket_access.parse(pos, accessor, expected) || parser_jsonpath_range.parse(pos, accessor, expected) || parser_jsonpath_star.parse(pos, accessor, expected)) { diff --git a/tests/queries/0_stateless/01889_sql_json_functions.reference b/tests/queries/0_stateless/01889_sql_json_functions.reference index 5ac1ff501e5..23630bffb93 100644 --- a/tests/queries/0_stateless/01889_sql_json_functions.reference +++ b/tests/queries/0_stateless/01889_sql_json_functions.reference @@ -37,6 +37,16 @@ select JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_v {"world":"!"} SELECT JSON_VALUE('{"hello":["world","world2"]}', '$.hello') settings function_json_value_return_type_allow_complex=true; ["world","world2"] +SELECT JSON_VALUE('{"1key":1}', '$.1key'); +1 +SELECT JSON_VALUE('{"hello":1}', '$[hello]'); +1 +SELECT JSON_VALUE('{"hello":1}', '$["hello"]'); +1 +SELECT JSON_VALUE('{"hello":1}', '$[\'hello\']'); +1 +SELECT JSON_VALUE('{"hello 1":1}', '$["hello 1"]'); +1 SELECT '--JSON_QUERY--'; --JSON_QUERY-- SELECT JSON_QUERY('{"hello":1}', '$'); @@ -61,6 +71,16 @@ SELECT JSON_QUERY('', '$.hello'); SELECT JSON_QUERY('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]'); [0, 1, 4, 0, -1, -4] +SELECT JSON_QUERY('{"1key":1}', '$.1key'); +[1] +SELECT JSON_QUERY('{"hello":1}', '$[hello]'); +[1] +SELECT JSON_QUERY('{"hello":1}', '$["hello"]'); +[1] +SELECT JSON_QUERY('{"hello":1}', '$[\'hello\']'); +[1] +SELECT JSON_QUERY('{"hello 1":1}', '$["hello 1"]'); +[1] SELECT '--JSON_EXISTS--'; --JSON_EXISTS-- SELECT JSON_EXISTS('{"hello":1}', '$'); diff --git a/tests/queries/0_stateless/01889_sql_json_functions.sql b/tests/queries/0_stateless/01889_sql_json_functions.sql index f174d04933c..7f417f3f228 100644 --- a/tests/queries/0_stateless/01889_sql_json_functions.sql +++ b/tests/queries/0_stateless/01889_sql_json_functions.sql @@ -20,6 +20,11 @@ select JSON_VALUE('{"a":"\\u263a"}', '$.a'); select JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_return_type_allow_nullable=true; select JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_value_return_type_allow_complex=true; SELECT JSON_VALUE('{"hello":["world","world2"]}', '$.hello') settings function_json_value_return_type_allow_complex=true; +SELECT JSON_VALUE('{"1key":1}', '$.1key'); +SELECT JSON_VALUE('{"hello":1}', '$[hello]'); +SELECT JSON_VALUE('{"hello":1}', '$["hello"]'); +SELECT JSON_VALUE('{"hello":1}', '$[\'hello\']'); +SELECT JSON_VALUE('{"hello 1":1}', '$["hello 1"]'); SELECT '--JSON_QUERY--'; SELECT JSON_QUERY('{"hello":1}', '$'); @@ -33,6 +38,11 @@ SELECT JSON_QUERY('{"hello":{"world":"!"}}', '$.hello'); SELECT JSON_QUERY( '{hello:{"world":"!"}}}', '$.hello'); -- invalid json => default value (empty string) SELECT JSON_QUERY('', '$.hello'); SELECT JSON_QUERY('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]'); +SELECT JSON_QUERY('{"1key":1}', '$.1key'); +SELECT JSON_QUERY('{"hello":1}', '$[hello]'); +SELECT JSON_QUERY('{"hello":1}', '$["hello"]'); +SELECT JSON_QUERY('{"hello":1}', '$[\'hello\']'); +SELECT JSON_QUERY('{"hello 1":1}', '$["hello 1"]'); SELECT '--JSON_EXISTS--'; SELECT JSON_EXISTS('{"hello":1}', '$'); From d8d7639ba7501158f4bf0c0af22fb964914926a8 Mon Sep 17 00:00:00 2001 From: lgbo-ustc Date: Fri, 14 Apr 2023 14:42:59 +0800 Subject: [PATCH 337/535] fixed typos & style --- src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp index 8a415816798..460f1d6a649 100644 --- a/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp +++ b/src/Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.cpp @@ -18,7 +18,7 @@ namespace DB */ bool ParserJSONPathMemberAccess::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) { - // There's a specical case, that a path member can begin with number + // There's a special case, that a path member can begin with number if (pos->type != TokenType::Dot && pos->type != TokenType::Number) return false; if (pos->type != TokenType::Number) From c9848e0822e1f172625f198e732bbfb59d75bb34 Mon Sep 17 00:00:00 2001 From: caipengxiang <291458254@qq.com> Date: Wed, 19 Apr 2023 12:22:17 +0800 Subject: [PATCH 338/535] bugfix: maskLowBits(3) => 00000111, but maskLowBits(3) => 11111111, so I fixed it. after I fixed it, the result is: maskLowBits(3) => 00000111, maskLowBits(3) => 00000111 --- src/Common/BitHelpers.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Common/BitHelpers.h b/src/Common/BitHelpers.h index 6356d5b81d5..35d6dd9f0fa 100644 --- a/src/Common/BitHelpers.h +++ b/src/Common/BitHelpers.h @@ -101,22 +101,24 @@ inline size_t getTrailingZeroBits(T x) /** Returns a mask that has '1' for `bits` LSB set: * maskLowBits(3) => 00000111 + * maskLowBits(3) => 00000111 */ template inline T maskLowBits(unsigned char bits) { + using unsigedT = std::make_unsigned_t; if (bits == 0) { return 0; } - T result = static_cast(~T{0}); + unsigedT result = static_cast(~unsigedT{0}); if (bits < sizeof(T) * 8) { - result = static_cast(result >> (sizeof(T) * 8 - bits)); + result = static_cast(result >> (sizeof(unsigedT) * 8 - bits)); } - return result; + return static_cast(result); } template From 6a6a028a5198ddc4c25e95187a41e57ca84d628b Mon Sep 17 00:00:00 2001 From: "Mikhail f. Shiryaev" Date: Wed, 19 Apr 2023 09:44:53 +0200 Subject: [PATCH 339/535] Reduce docker image size, fix slow startup --- docker/test/integration/runner/Dockerfile | 14 +++++++------- .../test/integration/runner/dockerd-entrypoint.sh | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docker/test/integration/runner/Dockerfile b/docker/test/integration/runner/Dockerfile index 2e613de3337..14c97e479f6 100644 --- a/docker/test/integration/runner/Dockerfile +++ b/docker/test/integration/runner/Dockerfile @@ -47,10 +47,9 @@ ENV TZ=Etc/UTC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ENV DOCKER_CHANNEL stable -RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - -RUN add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -c -s) ${DOCKER_CHANNEL}" - -RUN apt-get update \ +RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - \ + && add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -c -s) ${DOCKER_CHANNEL}" \ + && apt-get update \ && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \ docker-ce \ && rm -rf \ @@ -61,7 +60,7 @@ RUN apt-get update \ RUN dockerd --version; docker --version -RUN python3 -m pip install \ +RUN python3 -m pip install --no-cache-dir \ PyMySQL \ aerospike==4.0.0 \ avro==1.10.2 \ @@ -104,8 +103,9 @@ COPY dockerd-entrypoint.sh /usr/local/bin/ COPY compose/ /compose/ COPY misc/ /misc/ -RUN wget https://dlcdn.apache.org/spark/spark-3.3.2/spark-3.3.2-bin-hadoop3.tgz \ - && tar xzvf spark-3.3.2-bin-hadoop3.tgz -C / +RUN curl -fsSL -O https://dlcdn.apache.org/spark/spark-3.3.2/spark-3.3.2-bin-hadoop3.tgz \ + && tar xzvf spark-3.3.2-bin-hadoop3.tgz -C / \ + && rm spark-3.3.2-bin-hadoop3.tgz # download spark and packages # if you change packages, don't forget to update them in tests/integration/helpers/cluster.py diff --git a/docker/test/integration/runner/dockerd-entrypoint.sh b/docker/test/integration/runner/dockerd-entrypoint.sh index 824fb8108c6..0d248290bb7 100755 --- a/docker/test/integration/runner/dockerd-entrypoint.sh +++ b/docker/test/integration/runner/dockerd-entrypoint.sh @@ -16,7 +16,9 @@ echo '{ # and on hung you can simply press Ctrl-C and it will spawn a python pdb, # but on SIGINT dockerd will exit, so ignore it to preserve the daemon. trap '' INT -dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 --default-address-pool base=172.17.0.0/12,size=24 &>/ClickHouse/tests/integration/dockerd.log & +# Binding to an IP address without --tlsverify is deprecated. Startup is intentionally being slowed +# unless --tlsverify=false is set +dockerd --host=unix:///var/run/docker.sock --tlsverify=false --host=tcp://0.0.0.0:2375 --default-address-pool base=172.17.0.0/12,size=24 &>/ClickHouse/tests/integration/dockerd.log & set +e reties=0 From 5ecdb3502908b5148c081cebc7ababc2a84ec173 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 19 Apr 2023 11:54:45 +0300 Subject: [PATCH 340/535] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 449abc9484d..4b201802cae 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,11 +7,11 @@ tests/ci/run_check.py ### Changelog category (leave one): - New Feature - Improvement -- Bug Fix (user-visible misbehavior in an official stable release) - Performance Improvement - Backward Incompatible Change - Build/Testing/Packaging Improvement - Documentation (changelog entry is not required) +- Bug Fix (user-visible misbehavior in an official stable release) - Not for changelog (changelog entry is not required) From 15db30618c9a8e4ed4a42102ad3f5752a17fc37d Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 08:45:25 +0000 Subject: [PATCH 341/535] Various fixes and cleanups --- .../functions/array-functions.md | 12 ++--- src/DataTypes/IDataType.h | 4 +- src/Functions/array/arrayCumSum.cpp | 18 ++++---- .../array/arrayCumSumNonNegative.cpp | 17 +++---- .../02716_int256_arrayfunc.reference | 42 +++++++---------- .../0_stateless/02716_int256_arrayfunc.sql | 46 ++++++++----------- 6 files changed, 63 insertions(+), 76 deletions(-) diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index fbf1904bd1e..072a3b8f705 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -861,7 +861,7 @@ A special function. See the section [“ArrayJoin function”](../../sql-referen ## arrayDifference -Calculates the difference between adjacent array elements. Returns an array where the first element will be 0, the second is the difference between `a[1] - a[0]`, etc. The type of elements in the resulting array is determined by the type inference rules for subtraction (e.g. `UInt8` - `UInt8` = `Int16`). +Calculates an array of differences between adjacent array elements. The first element of the result array will be 0, the second `a[1] - a[0]`, the third `a[2] - a[1]`, etc. The type of elements in the result array is determined by the type inference rules for subtraction (e.g. `UInt8` - `UInt8` = `Int16`). **Syntax** @@ -875,7 +875,7 @@ arrayDifference(array) **Returned values** -Returns an array of differences between adjacent elements. +Returns an array of differences between adjacent array elements. Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). @@ -1643,7 +1643,7 @@ Result: ## arrayCumSum(\[func,\] arr1, …) -Returns an array of partial sums of elements in the source array (a running sum). If the `func` function is specified, then the values of the array elements are converted by `func(arr1[i], …, arrN[i])` before summing. +Returns an array of the partial (running) sums of the elements in the source array `arr1`. If `func` is specified, then the sum is computed from applying `func` to `arr1`, `arr2`, ..., `arrN`, i.e. `func(arr1[i], …, arrN[i])`. **Syntax** @@ -1657,7 +1657,7 @@ arrayCumSum(arr) **Returned value** -- Returns an array of partial sums of elements in the source array. +- Returns an array of the partial sums of the elements in the source array. Type: [UInt\*](https://clickhouse.com/docs/en/data_types/int_uint/#uint-ranges), [Int\*](https://clickhouse.com/docs/en/data_types/int_uint/#int-ranges), [Float\*](https://clickhouse.com/docs/en/data_types/float/). @@ -1675,9 +1675,9 @@ SELECT arrayCumSum([1, 1, 1, 1]) AS res Note that the `arrayCumSum` is a [higher-order function](../../sql-reference/functions/index.md#higher-order-functions). You can pass a lambda function to it as the first argument. -## arrayCumSumNonNegative(arr) +## arrayCumSumNonNegative(\[func,\] arr1, …) -Same as `arrayCumSum`, returns an array of partial sums of elements in the source array (a running sum). Different `arrayCumSum`, when then returned value contains a value less than zero, the value is replace with zero and the subsequent calculation is performed with zero parameters. For example: +Same as `arrayCumSum`, returns an array of the partial (running) sums of the elements in the source array. If `func` is specified, then the sum is computed from applying `func` to `arr1`, `arr2`, ..., `arrN`, i.e. `func(arr1[i], …, arrN[i])`. Unlike `arrayCumSum`, if the current running sum is smaller than `0`, it is replaced by `0`. **Syntax** diff --git a/src/DataTypes/IDataType.h b/src/DataTypes/IDataType.h index 4750db3f9ee..7cc18fea00c 100644 --- a/src/DataTypes/IDataType.h +++ b/src/DataTypes/IDataType.h @@ -340,8 +340,8 @@ struct WhichDataType constexpr bool isUInt64() const { return idx == TypeIndex::UInt64; } constexpr bool isUInt128() const { return idx == TypeIndex::UInt128; } constexpr bool isUInt256() const { return idx == TypeIndex::UInt256; } - constexpr bool isUInt() const { return isUInt8() || isUInt16() || isUInt32() || isUInt64() || isUInt128() || isUInt256(); } constexpr bool isNativeUInt() const { return isUInt8() || isUInt16() || isUInt32() || isUInt64(); } + constexpr bool isUInt() const { return isNativeUInt() || isUInt128() || isUInt256(); } constexpr bool isInt8() const { return idx == TypeIndex::Int8; } constexpr bool isInt16() const { return idx == TypeIndex::Int16; } @@ -349,8 +349,8 @@ struct WhichDataType constexpr bool isInt64() const { return idx == TypeIndex::Int64; } constexpr bool isInt128() const { return idx == TypeIndex::Int128; } constexpr bool isInt256() const { return idx == TypeIndex::Int256; } - constexpr bool isInt() const { return isInt8() || isInt16() || isInt32() || isInt64() || isInt128() || isInt256(); } constexpr bool isNativeInt() const { return isInt8() || isInt16() || isInt32() || isInt64(); } + constexpr bool isInt() const { return isNativeInt() || isInt128() || isInt256(); } constexpr bool isDecimal32() const { return idx == TypeIndex::Decimal32; } constexpr bool isDecimal64() const { return idx == TypeIndex::Decimal64; } diff --git a/src/Functions/array/arrayCumSum.cpp b/src/Functions/array/arrayCumSum.cpp index 86766e44143..c91498ee50a 100644 --- a/src/Functions/array/arrayCumSum.cpp +++ b/src/Functions/array/arrayCumSum.cpp @@ -33,20 +33,22 @@ struct ArrayCumSumImpl { if (which.isNativeUInt()) return std::make_shared(std::make_shared()); + if (which.isUInt128()) + return std::make_shared(std::make_shared()); if (which.isUInt256()) return std::make_shared(std::make_shared()); - else - return std::make_shared(std::make_shared()); + UNREACHABLE(); } if (which.isInt()) { if (which.isNativeInt()) return std::make_shared(std::make_shared()); + if (which.isInt128()) + return std::make_shared(std::make_shared()); if (which.isInt256()) return std::make_shared(std::make_shared()); - else - return std::make_shared(std::make_shared()); + UNREACHABLE(); } if (which.isFloat()) @@ -67,8 +69,8 @@ struct ArrayCumSumImpl template - static void NO_SANITIZE_UNDEFINED - implConst(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) + static void NO_SANITIZE_UNDEFINED implConst( + size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, Src src_value) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) @@ -84,8 +86,8 @@ struct ArrayCumSumImpl } template - static void NO_SANITIZE_UNDEFINED - implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED implVector( + size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) diff --git a/src/Functions/array/arrayCumSumNonNegative.cpp b/src/Functions/array/arrayCumSumNonNegative.cpp index a06d06c246d..9a34ec12cd8 100644 --- a/src/Functions/array/arrayCumSumNonNegative.cpp +++ b/src/Functions/array/arrayCumSumNonNegative.cpp @@ -34,20 +34,22 @@ struct ArrayCumSumNonNegativeImpl { if (which.isNativeUInt()) return std::make_shared(std::make_shared()); + if (which.isUInt128()) + return std::make_shared(std::make_shared()); if (which.isUInt256()) return std::make_shared(std::make_shared()); - else - return std::make_shared(std::make_shared()); + UNREACHABLE(); } if (which.isInt()) { if (which.isNativeInt()) return std::make_shared(std::make_shared()); + if (which.isInt128()) + return std::make_shared(std::make_shared()); if (which.isInt256()) return std::make_shared(std::make_shared()); - else - return std::make_shared(std::make_shared()); + UNREACHABLE(); } if (which.isFloat()) @@ -64,14 +66,13 @@ struct ArrayCumSumNonNegativeImpl return std::make_shared(nested); } - throw Exception( - ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "arrayCumSumNonNegativeImpl cannot add values of type {}", expression_return->getName()); } template - static void NO_SANITIZE_UNDEFINED - implVector(size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) + static void NO_SANITIZE_UNDEFINED implVector( + size_t size, const IColumn::Offset * __restrict offsets, Dst * __restrict res_values, const Src * __restrict src_values) { size_t pos = 0; for (const auto * end = offsets + size; offsets < end; ++offsets) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.reference b/tests/queries/0_stateless/02716_int256_arrayfunc.reference index 4f6df732d50..d95216fd264 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.reference +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.reference @@ -1,26 +1,16 @@ -[1,3] -[1,3] -[1,3] -[1,3] -[3,4,5] -[1,2] -Array(UInt128) -Array(Int128) -Array(UInt256) -Array(Int256) -[0,2] -[0,2] -[0,2] -[0,2] -Array(Int128) -Array(Int128) -Array(Int256) -Array(Int256) -[1,0] -[1,0] -[1,3] -[1,3] -Array(Int128) -Array(Int256) -Array(UInt128) -Array(UInt256) +[0,2] Array(Int128) +[0,2] Array(Int128) +[0,2] Array(Int256) +[0,2] Array(Int256) +--- +[1,3] Array(UInt128) +[1,3] Array(Int128) +[1,3] Array(UInt256) +[1,3] Array(Int256) +[3,4,5] Array(UInt256) +[1,2] Array(Int256) +--- +[1,3] Array(UInt128) +[1,0] Array(Int128) +[1,3] Array(UInt256) +[1,0] Array(Int256) diff --git a/tests/queries/0_stateless/02716_int256_arrayfunc.sql b/tests/queries/0_stateless/02716_int256_arrayfunc.sql index 20721d228ac..779a3168ea6 100644 --- a/tests/queries/0_stateless/02716_int256_arrayfunc.sql +++ b/tests/queries/0_stateless/02716_int256_arrayfunc.sql @@ -1,28 +1,22 @@ -SELECT arrayCumSum([CAST('1', 'Int128'), 2]); -SELECT arrayCumSum([CAST('1', 'Int256'), 2]); -SELECT arrayCumSum([CAST('1', 'UInt128'), 2]); -SELECT arrayCumSum([CAST('1', 'UInt256'), 2]); -SELECT arrayCumSum([3, CAST('1', 'Int128'),CAST('1', 'Int256')]); -SELECT arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')]); -SELECT toTypeName(arrayCumSum([CAST('1', 'UInt128'), 2])); -SELECT toTypeName(arrayCumSum([CAST('1', 'Int128'), 2])); -SELECT toTypeName(arrayCumSum([CAST('1', 'UInt256'), CAST('1', 'UInt128')])); -SELECT toTypeName(arrayCumSum([CAST('1', 'Int256'), CAST('1', 'Int128')])); +SELECT arrayDifference([toUInt128(1), 3]), toTypeName(arrayDifference([toUInt128(1), 3])); +SELECT arrayDifference([toInt128(1), 3]), toTypeName(arrayDifference([toInt128(1), 3])); +SELECT arrayDifference([toUInt256(1), 3]), toTypeName(arrayDifference([toUInt256(1), 3])); +SELECT arrayDifference([toInt256(1), 3]), toTypeName(arrayDifference([toInt256(1), 3])); -SELECT arrayDifference([CAST('1', 'Int256'), 3]); -SELECT arrayDifference([CAST('1', 'UInt256'), 3]); -SELECT arrayDifference([CAST('1', 'UInt128'), 3]); -SELECT arrayDifference([CAST('1', 'Int128'), 3]); -SELECT toTypeName(arrayDifference([CAST('1', 'UInt128'), 3])); -SELECT toTypeName(arrayDifference([CAST('1', 'Int128'), 3])); -SELECT toTypeName(arrayDifference([CAST('1', 'UInt256'), 3])); -SELECT toTypeName(arrayDifference([CAST('1', 'Int256'), 3])); +SELECT '---'; + +SELECT arrayCumSum([toUInt128(1), 2]), toTypeName(arrayCumSum([toUInt128(1), 2])); +SELECT arrayCumSum([toInt128(1), 2]), toTypeName(arrayCumSum([toInt128(1), 2])); +SELECT arrayCumSum([toUInt256(1), 2]), toTypeName(arrayCumSum([toUInt256(1), 2])); +SELECT arrayCumSum([toInt256(1), 2]), toTypeName(arrayCumSum([toInt256(1), 2])); + +SELECT arrayCumSum([3, toInt128(1), toInt256(1)]), toTypeName(arrayCumSum([toUInt256(1), toUInt128(1)])); +SELECT arrayCumSum([toInt256(1), toInt128(1)]), toTypeName(arrayCumSum([toInt256(1), toInt128(1)])); + +SELECT '---'; + +SELECT arrayCumSumNonNegative([toUInt128(1), 2]), toTypeName(arrayCumSumNonNegative([toUInt128(1), 2])); +SELECT arrayCumSumNonNegative([toInt128(1), -2]), toTypeName(arrayCumSumNonNegative([toInt128(1), -2])); +SELECT arrayCumSumNonNegative([toUInt256(1), 2]), toTypeName(arrayCumSumNonNegative([toUInt256(1), 2])); +SELECT arrayCumSumNonNegative([toInt256(1), -2]), toTypeName(arrayCumSumNonNegative([toInt256(1), -2])); -SELECT arrayCumSumNonNegative([CAST('1', 'Int128'), -2]); -SELECT arrayCumSumNonNegative([CAST('1', 'Int256'), -2]); -SELECT arrayCumSumNonNegative([CAST('1', 'UInt128'), 2]); -SELECT arrayCumSumNonNegative([CAST('1', 'UInt256'), 2]); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int128'), -2])); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'Int256'), -2])); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt128'), 2])); -SELECT toTypeName(arrayCumSumNonNegative([CAST('1', 'UInt256'), 2])); From 9a254d60d06c6d054b8f70abf4bd3a70c4f0856e Mon Sep 17 00:00:00 2001 From: Vladimir C Date: Wed, 19 Apr 2023 11:51:24 +0200 Subject: [PATCH 342/535] Do not check undefined result value in 02715_bit_operations_float --- tests/queries/0_stateless/02715_bit_operations_float.reference | 2 +- tests/queries/0_stateless/02715_bit_operations_float.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/02715_bit_operations_float.reference b/tests/queries/0_stateless/02715_bit_operations_float.reference index 395d1c127c9..a208d00f211 100644 --- a/tests/queries/0_stateless/02715_bit_operations_float.reference +++ b/tests/queries/0_stateless/02715_bit_operations_float.reference @@ -1,2 +1,2 @@ -9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807 +1 1 1 1 12 11 41 12 diff --git a/tests/queries/0_stateless/02715_bit_operations_float.sql b/tests/queries/0_stateless/02715_bit_operations_float.sql index 9e3bc5dd1d5..6dc0a14e9b4 100644 --- a/tests/queries/0_stateless/02715_bit_operations_float.sql +++ b/tests/queries/0_stateless/02715_bit_operations_float.sql @@ -1,4 +1,4 @@ -SELECT bitNot(-inf), bitNot(inf), bitNot(3.40282e+38), bitNot(nan); +SELECT bitNot(-inf) != 0, bitNot(inf) != 0, bitNot(3.40282e+38) != 0, bitNot(nan) != 0; SELECT bitCount(-inf), bitCount(inf), bitCount(3.40282e+38), bitCount(nan); SELECT bitAnd(1.0, 1.0); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT } From 1036d21002f37858b7540a8e3815abdc488649d8 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 09:48:06 +0000 Subject: [PATCH 343/535] Less flaky 01079_new_range_reader_segfault Usage of `rand()` means that the SELECT produces with probability 0.5^20 = 0.000000953 no result. This happend in (*). The query is build to trigger some specific logic in MergeTreeReader. Rewriting it is not a good idea. I therefore increased the amout of test data to reduce the probability of en empty result siginficantly. I hope that the same logic as before is triggered. (*) https://s3.amazonaws.com/clickhouse-test-reports/0/905587b39def432667437efd92c28dde9cc0dfb2/stateless_tests__release__s3_storage__[1/2].html --- tests/queries/0_stateless/01079_new_range_reader_segfault.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/01079_new_range_reader_segfault.sql b/tests/queries/0_stateless/01079_new_range_reader_segfault.sql index 9c3f073c72f..697c28e4c23 100644 --- a/tests/queries/0_stateless/01079_new_range_reader_segfault.sql +++ b/tests/queries/0_stateless/01079_new_range_reader_segfault.sql @@ -3,7 +3,7 @@ drop table if exists t; create table t (a Int) engine = MergeTree order by a; -- some magic to satisfy conditions to run optimizations in MergeTreeRangeReader -insert into t select number < 20 ? 0 : 1 from numbers(50); +insert into t select number < 20000 ? 0 : 1 from numbers(50000); alter table t add column s String default 'foo'; select s from t prewhere a != 1 where rand() % 2 = 0 limit 1; From bb6cf5252fd05cadb1b4c9c5e981742fa5fb6a4d Mon Sep 17 00:00:00 2001 From: avogar Date: Thu, 6 Apr 2023 12:41:42 +0000 Subject: [PATCH 344/535] Fix logical error with IPv4 in Protobuf, add support for Date32 --- src/Formats/ProtobufSerializer.cpp | 13 +++++++++---- .../02710_protobuf_ipv4_date32.reference | 1 + .../0_stateless/02710_protobuf_ipv4_date32.sh | 11 +++++++++++ .../0_stateless/format_schemas/02710_schema.proto | 7 +++++++ 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference create mode 100755 tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh create mode 100644 tests/queries/0_stateless/format_schemas/02710_schema.proto diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index c712a1083d9..1eb230d9d3e 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -59,6 +59,7 @@ namespace ErrorCodes extern const int PROTOBUF_BAD_CAST; extern const int LOGICAL_ERROR; extern const int BAD_ARGUMENTS; + extern const int ILLEGAL_COLUMN; } namespace @@ -298,7 +299,10 @@ namespace try { /// TODO: use accurate::convertNumeric() maybe? - result = boost::numeric_cast(value); + if constexpr (std::is_same_v) + result = boost::numeric_cast(value.toUnderType()); + else + result = boost::numeric_cast(value); } catch (boost::numeric::bad_numeric_cast &) { @@ -504,7 +508,7 @@ namespace { UInt64 u64 = readUInt(); if (u64 < 2) - return static_cast(u64); + return castNumber(u64); else cannotConvertValue(toString(u64), field_descriptor.type_name(), TypeName); }; @@ -1722,7 +1726,7 @@ namespace String text_buffer; }; - using ProtobufSerializerIPv4 = ProtobufSerializerNumber; + using ProtobufSerializerIPv4 = ProtobufSerializerNumber; using ProtobufSerializerInterval = ProtobufSerializerNumber; @@ -3341,6 +3345,7 @@ namespace case TypeIndex::UInt256: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int8: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int16: return std::make_unique>(column_name, field_descriptor, reader_or_writer); + case TypeIndex::Date32: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int32: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int64: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int128: return std::make_unique>(column_name, field_descriptor, reader_or_writer); @@ -3528,7 +3533,7 @@ namespace } default: - throw Exception(ErrorCodes::LOGICAL_ERROR, "Unknown data type: {}", data_type->getName()); + throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Type {} is not supported in Protobuf format", data_type->getName()); } } diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference new file mode 100644 index 00000000000..1062f575556 --- /dev/null +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference @@ -0,0 +1 @@ +0.0.0.0 2020-01-01 diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh new file mode 100755 index 00000000000..3703fab3270 --- /dev/null +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Tags: no-fasttest + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +SCHEMADIR=$CURDIR/format_schemas + +$CLICKHOUSE_LOCAL -q "select '0.0.0.0'::IPv4 as ipv4, '2020-01-01'::Date32 as date32 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, date32 Date32" -q "select * from table" + diff --git a/tests/queries/0_stateless/format_schemas/02710_schema.proto b/tests/queries/0_stateless/format_schemas/02710_schema.proto new file mode 100644 index 00000000000..a708823cf06 --- /dev/null +++ b/tests/queries/0_stateless/format_schemas/02710_schema.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +message Message +{ + uint32 ipv4 = 1; + int32 date32 = 2; +} From c2f18281c8bab8e97b8aebe85fc521714e8a0ef1 Mon Sep 17 00:00:00 2001 From: avogar Date: Thu, 6 Apr 2023 17:09:38 +0000 Subject: [PATCH 345/535] Make better --- src/Formats/ProtobufSerializer.cpp | 155 +++++++++++++++++- .../02710_protobuf_ipv4_date32.reference | 2 +- .../0_stateless/02710_protobuf_ipv4_date32.sh | 2 +- .../format_schemas/02710_schema.proto | 6 +- 4 files changed, 159 insertions(+), 6 deletions(-) diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index 1eb230d9d3e..d6ac75a622f 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -1486,6 +1486,157 @@ namespace } }; + class ProtobufSerializerDate32 : public ProtobufSerializerNumber + { + public: + ProtobufSerializerDate32( + std::string_view column_name_, + const FieldDescriptor & field_descriptor_, + const ProtobufReaderOrWriter & reader_or_writer_) + : ProtobufSerializerNumber(column_name_, field_descriptor_, reader_or_writer_) + { + setFunctions(); + } + + void describeTree(WriteBuffer & out, size_t indent) const override + { + writeIndent(out, indent) << "ProtobufSerializerDate32: column " << quoteString(column_name) << " -> field " + << quoteString(field_descriptor.full_name()) << " (" << field_descriptor.type_name() << ")\n"; + } + + private: + void setFunctions() + { + switch (field_typeid) + { + case FieldTypeId::TYPE_INT32: + case FieldTypeId::TYPE_SINT32: + case FieldTypeId::TYPE_UINT32: + case FieldTypeId::TYPE_INT64: + case FieldTypeId::TYPE_SINT64: + case FieldTypeId::TYPE_UINT64: + case FieldTypeId::TYPE_FIXED32: + case FieldTypeId::TYPE_SFIXED32: + case FieldTypeId::TYPE_FIXED64: + case FieldTypeId::TYPE_SFIXED64: + case FieldTypeId::TYPE_FLOAT: + case FieldTypeId::TYPE_DOUBLE: + break; /// already set in ProtobufSerializerNumber::setFunctions(). + + case FieldTypeId::TYPE_STRING: + case FieldTypeId::TYPE_BYTES: + { + write_function = [this](Int32 value) + { + dateToString(static_cast(value), text_buffer); + writeStr(text_buffer); + }; + + read_function = [this]() -> Int32 + { + readStr(text_buffer); + return stringToDate(text_buffer); + }; + + default_function = [this]() -> Int32 { return stringToDate(field_descriptor.default_value_string()); }; + break; + } + + default: + incompatibleColumnType("Date"); + } + } + + static void dateToString(ExtendedDayNum date, String & str) + { + WriteBufferFromString buf{str}; + writeDateText(date, buf); + } + + static ExtendedDayNum stringToDate(const String & str) + { + ExtendedDayNum date; + ReadBufferFromString buf{str}; + readDateText(date, buf); + return date; + } + }; + + class ProtobufSerializerIPv4 : public ProtobufSerializerNumber + { + public: + ProtobufSerializerIPv4( + std::string_view column_name_, + const FieldDescriptor & field_descriptor_, + const ProtobufReaderOrWriter & reader_or_writer_) + : ProtobufSerializerNumber(column_name_, field_descriptor_, reader_or_writer_) + { + setFunctions(); + } + + void describeTree(WriteBuffer & out, size_t indent) const override + { + writeIndent(out, indent) << "ProtobufSerializerDate: column " << quoteString(column_name) << " -> field " + << quoteString(field_descriptor.full_name()) << " (" << field_descriptor.type_name() << ")\n"; + } + + private: + void setFunctions() + { + switch (field_typeid) + { + case FieldTypeId::TYPE_INT32: + case FieldTypeId::TYPE_SINT32: + case FieldTypeId::TYPE_UINT32: + case FieldTypeId::TYPE_INT64: + case FieldTypeId::TYPE_SINT64: + case FieldTypeId::TYPE_UINT64: + case FieldTypeId::TYPE_FIXED32: + case FieldTypeId::TYPE_SFIXED32: + case FieldTypeId::TYPE_FIXED64: + case FieldTypeId::TYPE_SFIXED64: + case FieldTypeId::TYPE_FLOAT: + case FieldTypeId::TYPE_DOUBLE: + break; /// already set in ProtobufSerializerNumber::setFunctions(). + + case FieldTypeId::TYPE_STRING: + case FieldTypeId::TYPE_BYTES: + { + write_function = [this](IPv4 value) + { + ipv4ToString(value, text_buffer); + writeStr(text_buffer); + }; + + read_function = [this]() -> IPv4 + { + readStr(text_buffer); + return stringToIPv4(text_buffer); + }; + + default_function = [this]() -> IPv4 { return stringToIPv4(field_descriptor.default_value_string()); }; + break; + } + + default: + incompatibleColumnType("Date"); + } + } + + static void ipv4ToString(IPv4 value, String & str) + { + WriteBufferFromString buf{str}; + writeIPv4Text(value, buf); + } + + static IPv4 stringToIPv4(const String & str) + { + IPv4 value; + ReadBufferFromString buf{str}; + readIPv4Text(value, buf); + return value; + } + }; /// Serializes a ColumnVector containing datetimes to a field of any type except TYPE_MESSAGE, TYPE_GROUP, TYPE_BOOL, TYPE_ENUM. class ProtobufSerializerDateTime : public ProtobufSerializerNumber @@ -1726,8 +1877,6 @@ namespace String text_buffer; }; - using ProtobufSerializerIPv4 = ProtobufSerializerNumber; - using ProtobufSerializerInterval = ProtobufSerializerNumber; @@ -3345,7 +3494,7 @@ namespace case TypeIndex::UInt256: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int8: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int16: return std::make_unique>(column_name, field_descriptor, reader_or_writer); - case TypeIndex::Date32: return std::make_unique>(column_name, field_descriptor, reader_or_writer); + case TypeIndex::Date32: return std::make_unique(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int32: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int64: return std::make_unique>(column_name, field_descriptor, reader_or_writer); case TypeIndex::Int128: return std::make_unique>(column_name, field_descriptor, reader_or_writer); diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference index 1062f575556..f8a0ccc72e1 100644 --- a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference @@ -1 +1 @@ -0.0.0.0 2020-01-01 +0.0.0.0 0.0.0.0 0.0.0.0 2020-01-01 2020-01-01 2020-01-01 diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh index 3703fab3270..d1885a5f26b 100755 --- a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh @@ -7,5 +7,5 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) SCHEMADIR=$CURDIR/format_schemas -$CLICKHOUSE_LOCAL -q "select '0.0.0.0'::IPv4 as ipv4, '2020-01-01'::Date32 as date32 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, date32 Date32" -q "select * from table" +$CLICKHOUSE_LOCAL -q "select '0.0.0.0'::IPv4 as ipv4, ipv4 as ipv4_bytes, ipv4 as ipv4_int64, '2020-01-01'::Date32 as date32, date32 as date32_bytes, date32 as date32_int64 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, ipv4_bytes IPv4, ipv4_int64 IPv4, date32 Date32, date32_bytes Date32, date32_int64 Date32" -q "select * from table" diff --git a/tests/queries/0_stateless/format_schemas/02710_schema.proto b/tests/queries/0_stateless/format_schemas/02710_schema.proto index a708823cf06..d6bf0ad350a 100644 --- a/tests/queries/0_stateless/format_schemas/02710_schema.proto +++ b/tests/queries/0_stateless/format_schemas/02710_schema.proto @@ -3,5 +3,9 @@ syntax = "proto3"; message Message { uint32 ipv4 = 1; - int32 date32 = 2; + bytes ipv4_bytes = 2; + int64 ipv4_int64 = 3; + int32 date32 = 4; + bytes date32_bytes = 5; + int64 date32_int64 = 6; } From 8af9cf67fd12188ffc83b439defd44fc8c991838 Mon Sep 17 00:00:00 2001 From: avogar Date: Thu, 6 Apr 2023 17:10:50 +0000 Subject: [PATCH 346/535] Fix comments --- src/Formats/ProtobufSerializer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index d6ac75a622f..8b22eb55c09 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -1521,7 +1521,7 @@ namespace case FieldTypeId::TYPE_SFIXED64: case FieldTypeId::TYPE_FLOAT: case FieldTypeId::TYPE_DOUBLE: - break; /// already set in ProtobufSerializerNumber::setFunctions(). + break; /// already set in ProtobufSerializerNumber::setFunctions(). case FieldTypeId::TYPE_STRING: case FieldTypeId::TYPE_BYTES: @@ -1597,7 +1597,7 @@ namespace case FieldTypeId::TYPE_SFIXED64: case FieldTypeId::TYPE_FLOAT: case FieldTypeId::TYPE_DOUBLE: - break; /// already set in ProtobufSerializerNumber::setFunctions(). + break; /// already set in ProtobufSerializerNumber::setFunctions(). case FieldTypeId::TYPE_STRING: case FieldTypeId::TYPE_BYTES: From 34cc7b635af76339e811749bd4e7fb8f4aeee7b7 Mon Sep 17 00:00:00 2001 From: avogar Date: Thu, 6 Apr 2023 17:11:22 +0000 Subject: [PATCH 347/535] Fix type name --- src/Formats/ProtobufSerializer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index 8b22eb55c09..cdcd42713ec 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -1543,7 +1543,7 @@ namespace } default: - incompatibleColumnType("Date"); + incompatibleColumnType("Date32"); } } @@ -1619,7 +1619,7 @@ namespace } default: - incompatibleColumnType("Date"); + incompatibleColumnType("IPv4"); } } From 7dcf64260109026b672174769c5b308baef016ac Mon Sep 17 00:00:00 2001 From: avogar Date: Wed, 19 Apr 2023 11:26:19 +0000 Subject: [PATCH 348/535] Test more ipv4 values --- .../0_stateless/02710_protobuf_ipv4_date32.reference | 2 ++ tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference index f8a0ccc72e1..11383548d90 100644 --- a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.reference @@ -1 +1,3 @@ 0.0.0.0 0.0.0.0 0.0.0.0 2020-01-01 2020-01-01 2020-01-01 +1.2.3.4 1.2.3.4 1.2.3.4 +255.255.255.255 255.255.255.255 255.255.255.255 diff --git a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh index d1885a5f26b..83657e590bb 100755 --- a/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh +++ b/tests/queries/0_stateless/02710_protobuf_ipv4_date32.sh @@ -9,3 +9,9 @@ SCHEMADIR=$CURDIR/format_schemas $CLICKHOUSE_LOCAL -q "select '0.0.0.0'::IPv4 as ipv4, ipv4 as ipv4_bytes, ipv4 as ipv4_int64, '2020-01-01'::Date32 as date32, date32 as date32_bytes, date32 as date32_int64 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, ipv4_bytes IPv4, ipv4_int64 IPv4, date32 Date32, date32_bytes Date32, date32_int64 Date32" -q "select * from table" +$CLICKHOUSE_LOCAL -q "select '1.2.3.4'::IPv4 as ipv4, ipv4 as ipv4_bytes, ipv4 as ipv4_int64 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, ipv4_bytes IPv4, ipv4_int64 IPv4" -q "select * from table" + +$CLICKHOUSE_LOCAL -q "select '255.255.255.255'::IPv4 as ipv4, ipv4 as ipv4_bytes, ipv4 as ipv4_int64 format Protobuf settings format_schema = '$SCHEMADIR/02710_schema:Message'" | $CLICKHOUSE_LOCAL --input-format Protobuf --format_schema="$SCHEMADIR/02710_schema:Message" --structure="ipv4 IPv4, ipv4_bytes IPv4, ipv4_int64 IPv4" -q "select * from table" + + + From 87b6db54ce380d55010400a6ad537ebdaa014d78 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 11:19:00 +0000 Subject: [PATCH 349/535] Document integer promotion Fixes #48933 --- .../functions/type-conversion-functions.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index 5ce72caa3b9..32882e189b4 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -8,12 +8,16 @@ sidebar_label: Type Conversion ## Common Issues with Data Conversion +ClickHouse generally uses the [same behavior as C++ programs](https://en.cppreference.com/w/cpp/language/implicit_conversion). In particular, +- the result of addition or multiplication of two integers is unsigned unless one of the integers is signed, +- the result of addition or multiplication of two integers is of the next bigger integer type such that every possible result can be represented (e.g. `UInt8 + UInt16 = UInt32`). Size promotion only happens for integers up to 32 bit. If one of the integers has 64 or more bits, the result of addition or multiplication is of the same type as the bigger of the input integers (e.g. `UInt16 + UInt128 = UInt128`) - while this introduces a risk of overflows around the value range boundary it ensures that calculations are performed quickly using the maximum native integer width of 64 bit. + +`to` functions and [cast](#castx-t) behave differently in some cases, for example in case of [LowCardinality](../data-types/lowcardinality.md): [cast](#castx-t) removes [LowCardinality](../data-types/lowcardinality.md) trait `to` functions don't. The same with [Nullable](../data-types/nullable.md), this behaviour is not compatible with SQL standard, and it can be changed using [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) setting. + +:::note Be aware of potential data loss if values of a datatype are converted to a smaller datatype (for example from `Int64` to `Int32`) or between incompatible datatypes (for example from `String` to `Int`). Make sure to check carefully if the result is as expected. - -ClickHouse generally uses the [same behavior as C++ programs](https://en.cppreference.com/w/cpp/language/implicit_conversion). - -`to` functions and [cast](#castx-t) have different behaviour in some cases, for example in case of [LowCardinality](../data-types/lowcardinality.md): [cast](#castx-t) removes [LowCardinality](../data-types/lowcardinality.md) trait `to` functions don't. The same with [Nullable](../data-types/nullable.md), this behaviour is not compatible with SQL standard, and it can be changed using [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) setting. +::: Example: From 58b973fa91fcc72a5cb8210bc1de2529e417e49a Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:30:46 +0200 Subject: [PATCH 350/535] Update programs/copier/ClusterCopier.cpp Co-authored-by: Azat Khuzhin --- programs/copier/ClusterCopier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp index bf349a59ea6..c564f31ef51 100644 --- a/programs/copier/ClusterCopier.cpp +++ b/programs/copier/ClusterCopier.cpp @@ -1766,7 +1766,7 @@ String ClusterCopier::getRemoteCreateTable(const DatabaseAndTableName & table, C QueryPipelineBuilder builder; builder.init(Pipe(std::make_shared( - std::make_shared(connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context), false, false, false))); + std::make_shared(connection, query, InterpreterShowCreateQuery::getSampleBlock(), remote_context), false, false, /* async_query_sending= */ false))); Block block = getBlockWithAllStreamData(std::move(builder)); return typeid_cast(*block.safeGetByPosition(0).column).getDataAt(0).toString(); } From 66bdd5281ab383227860d80d11b971c2265fde1c Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:32:32 +0200 Subject: [PATCH 351/535] Update src/Processors/QueryPlan/ReadFromRemote.cpp Co-authored-by: Nikita Taranov --- src/Processors/QueryPlan/ReadFromRemote.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Processors/QueryPlan/ReadFromRemote.cpp b/src/Processors/QueryPlan/ReadFromRemote.cpp index df6e5a9444f..14277019559 100644 --- a/src/Processors/QueryPlan/ReadFromRemote.cpp +++ b/src/Processors/QueryPlan/ReadFromRemote.cpp @@ -138,7 +138,7 @@ void ReadFromRemote::addLazyPipe(Pipes & pipes, const ClusterProxy::SelectStream bool add_totals = false; bool add_extremes = false; bool async_read = context->getSettingsRef().async_socket_for_remote; - bool async_query_sending = context->getSettingsRef().async_query_sending_for_remote; + const bool async_query_sending = context->getSettingsRef().async_query_sending_for_remote; if (stage == QueryProcessingStage::Complete) { From 95eb78a5931e7be7f3bd99020cd3118468f99921 Mon Sep 17 00:00:00 2001 From: "Mikhail f. Shiryaev" Date: Wed, 19 Apr 2023 13:33:15 +0200 Subject: [PATCH 352/535] Using a proper --tls=false option to disable TLS --- docker/test/integration/runner/dockerd-entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/test/integration/runner/dockerd-entrypoint.sh b/docker/test/integration/runner/dockerd-entrypoint.sh index 0d248290bb7..fe47fc90951 100755 --- a/docker/test/integration/runner/dockerd-entrypoint.sh +++ b/docker/test/integration/runner/dockerd-entrypoint.sh @@ -17,8 +17,8 @@ echo '{ # but on SIGINT dockerd will exit, so ignore it to preserve the daemon. trap '' INT # Binding to an IP address without --tlsverify is deprecated. Startup is intentionally being slowed -# unless --tlsverify=false is set -dockerd --host=unix:///var/run/docker.sock --tlsverify=false --host=tcp://0.0.0.0:2375 --default-address-pool base=172.17.0.0/12,size=24 &>/ClickHouse/tests/integration/dockerd.log & +# unless --tls=false or --tlsverify=false is set +dockerd --host=unix:///var/run/docker.sock --tls=false --host=tcp://0.0.0.0:2375 --default-address-pool base=172.17.0.0/12,size=24 &>/ClickHouse/tests/integration/dockerd.log & set +e reties=0 From c80d8081d24d8cf8c3484f400afc25c626ab571c Mon Sep 17 00:00:00 2001 From: "Mikhail f. Shiryaev" Date: Wed, 19 Apr 2023 12:48:02 +0200 Subject: [PATCH 353/535] Add building stage to the fasttests report --- docker/test/fasttest/run.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index e0e30a63bb4..3ed0c4df093 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -194,7 +194,12 @@ function build { ( cd "$FASTTEST_BUILD" - time ninja clickhouse-bundle 2>&1 | ts '%Y-%m-%d %H:%M:%S' | tee "$FASTTEST_OUTPUT/build_log.txt" + TIMEFORMAT=$'\nreal\t%3R\nuser\t%3U\nsys\t%3S' + ( time ninja clickhouse-bundle) |& ts '%Y-%m-%d %H:%M:%S' | tee "$FASTTEST_OUTPUT/build_log.txt" + BUILD_SECONDS_ELAPSED=$(awk '/^....-..-.. ..:..:.. real\t[0-9]/ {print $4}' < "$FASTTEST_OUTPUT/build_log.txt") + echo "build_clickhouse_fasttest_binary: [ OK ] $BUILD_SECONDS_ELAPSED sec." \ + | ts '%Y-%m-%d %H:%M:%S' \ + | tee "$FASTTEST_OUTPUT/test_result.txt" if [ "$COPY_CLICKHOUSE_BINARY_TO_OUTPUT" -eq "1" ]; then cp programs/clickhouse "$FASTTEST_OUTPUT/clickhouse" @@ -251,7 +256,7 @@ function run_tests ) time clickhouse-test "${test_opts[@]}" -- "$FASTTEST_FOCUS" 2>&1 \ | ts '%Y-%m-%d %H:%M:%S' \ - | tee "$FASTTEST_OUTPUT/test_result.txt" + | tee -a "$FASTTEST_OUTPUT/test_result.txt" set -e clickhouse stop --pid-path "$FASTTEST_DATA" From a23262bb77918fe97d268494491d2eb3c4d42599 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Wed, 19 Apr 2023 13:40:40 +0200 Subject: [PATCH 354/535] Update src/Client/Connection.cpp Co-authored-by: Nikita Taranov --- src/Client/Connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Client/Connection.cpp b/src/Client/Connection.cpp index 2f34146954e..d39148d3016 100644 --- a/src/Client/Connection.cpp +++ b/src/Client/Connection.cpp @@ -135,7 +135,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts) async_callback(socket->impl()->sockfd(), connection_timeout, AsyncEventTimeoutType::CONNECT, description, AsyncTaskExecutor::READ | AsyncTaskExecutor::WRITE | AsyncTaskExecutor::ERROR); if (auto err = socket->impl()->socketError()) - socket->impl()->error(err); + socket->impl()->error(err); // Throws an exception socket->setBlocking(true); From 96c8692c8ab82bcbe91e22df95d54c5bf11f372c Mon Sep 17 00:00:00 2001 From: Han Fei Date: Wed, 19 Apr 2023 13:42:55 +0200 Subject: [PATCH 355/535] fix test --- .../02117_show_create_table_system.reference | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/queries/0_stateless/02117_show_create_table_system.reference b/tests/queries/0_stateless/02117_show_create_table_system.reference index e3a2ac07c66..f2524cac115 100644 --- a/tests/queries/0_stateless/02117_show_create_table_system.reference +++ b/tests/queries/0_stateless/02117_show_create_table_system.reference @@ -510,7 +510,8 @@ CREATE TABLE system.parts `last_removal_attemp_time` DateTime, `removal_state` String, `bytes` UInt64, - `marks_size` UInt64 + `marks_size` UInt64, + `part_name` String ) ENGINE = SystemParts COMMENT 'SYSTEM TABLE is built on the fly.' @@ -564,7 +565,8 @@ CREATE TABLE system.parts_columns `subcolumns.data_uncompressed_bytes` Array(UInt64), `subcolumns.marks_bytes` Array(UInt64), `bytes` UInt64, - `marks_size` UInt64 + `marks_size` UInt64, + `part_name` String ) ENGINE = SystemPartsColumns COMMENT 'SYSTEM TABLE is built on the fly.' @@ -685,7 +687,8 @@ CREATE TABLE system.projection_parts `rows_where_ttl_info.min` Array(DateTime), `rows_where_ttl_info.max` Array(DateTime), `bytes` UInt64, - `marks_size` UInt64 + `marks_size` UInt64, + `part_name` String ) ENGINE = SystemProjectionParts COMMENT 'SYSTEM TABLE is built on the fly.' @@ -739,7 +742,8 @@ CREATE TABLE system.projection_parts_columns `column_data_uncompressed_bytes` UInt64, `column_marks_bytes` UInt64, `bytes` UInt64, - `marks_size` UInt64 + `marks_size` UInt64, + `part_name` String ) ENGINE = SystemProjectionPartsColumns COMMENT 'SYSTEM TABLE is built on the fly.' From df70f6985c9acc643fd580d14edd1e4b5aae7642 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Wed, 19 Apr 2023 09:16:22 -0400 Subject: [PATCH 356/535] Update query-complexity.md The docs say that max_memory_usage is set to 10GB in the default config, but max_memory_usage does not appear in the default config, so the default is unlimited. --- docs/en/operations/settings/query-complexity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/operations/settings/query-complexity.md b/docs/en/operations/settings/query-complexity.md index 7a6b2340d29..3c1d60c1d6b 100644 --- a/docs/en/operations/settings/query-complexity.md +++ b/docs/en/operations/settings/query-complexity.md @@ -26,7 +26,7 @@ It can take one of two values: `throw` or `break`. Restrictions on aggregation ( The maximum amount of RAM to use for running a query on a single server. -In the default configuration file, the maximum is 10 GB. +The default setting is unlimited (set to `0`). The setting does not consider the volume of available memory or the total volume of memory on the machine. The restriction applies to a single query within a single server. From 323caae3c03d9b0cffc9a43ca51d5a126f19d00f Mon Sep 17 00:00:00 2001 From: kssenii Date: Wed, 19 Apr 2023 16:29:38 +0200 Subject: [PATCH 357/535] Fix --- src/Storages/RabbitMQ/StorageRabbitMQ.cpp | 26 +++++++---------------- src/Storages/RabbitMQ/StorageRabbitMQ.h | 2 +- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp index e7029b78e12..f53a7afedd1 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.cpp +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.cpp @@ -187,8 +187,8 @@ StorageRabbitMQ::StorageRabbitMQ( streaming_task = getContext()->getMessageBrokerSchedulePool().createTask("RabbitMQStreamingTask", [this]{ streamingToViewsFunc(); }); streaming_task->deactivate(); - connection_task = getContext()->getMessageBrokerSchedulePool().createTask("RabbitMQConnectionTask", [this]{ connectionFunc(); }); - connection_task->deactivate(); + init_task = getContext()->getMessageBrokerSchedulePool().createTask("RabbitMQConnectionTask", [this]{ connectionFunc(); }); + init_task->deactivate(); } @@ -323,7 +323,7 @@ void StorageRabbitMQ::connectionFunc() tryLogCurrentException(__PRETTY_FUNCTION__); } - connection_task->scheduleAfter(RESCHEDULE_MS); + init_task->scheduleAfter(RESCHEDULE_MS); } @@ -784,25 +784,15 @@ SinkToStoragePtr StorageRabbitMQ::write(const ASTPtr &, const StorageMetadataPtr void StorageRabbitMQ::startup() { - if (connection->isConnected()) + if (initialized) { - try - { - initRabbitMQ(); - } - catch (...) - { - if (!is_attach) - throw; - tryLogCurrentException(log); - } + streaming_task->activateAndSchedule(); } else { - connection_task->activateAndSchedule(); + streaming_task->activate(); + init_task->activateAndSchedule(); } - - streaming_task->activate(); } @@ -816,7 +806,7 @@ void StorageRabbitMQ::shutdown() LOG_TRACE(log, "Deactivating background tasks"); /// In case it has not yet been able to setup connection; - deactivateTask(connection_task, true, false); + deactivateTask(init_task, true, false); /// The order of deactivating tasks is important: wait for streamingToViews() func to finish and /// then wait for background event loop to finish. diff --git a/src/Storages/RabbitMQ/StorageRabbitMQ.h b/src/Storages/RabbitMQ/StorageRabbitMQ.h index 421a7eac56c..c531026d83a 100644 --- a/src/Storages/RabbitMQ/StorageRabbitMQ.h +++ b/src/Storages/RabbitMQ/StorageRabbitMQ.h @@ -127,7 +127,7 @@ private: std::mutex task_mutex; BackgroundSchedulePool::TaskHolder streaming_task; BackgroundSchedulePool::TaskHolder looping_task; - BackgroundSchedulePool::TaskHolder connection_task; + BackgroundSchedulePool::TaskHolder init_task; uint64_t milliseconds_to_wait; From 92d0d9d4ff68c0b53e19317ff9218eab44e9588b Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 11 Apr 2023 15:36:05 +0000 Subject: [PATCH 358/535] Http temporary buffer integration with fs cache --- src/Disks/DiskLocal.cpp | 6 +- .../IO/WriteBufferFromTemporaryFile.cpp | 23 ++++--- .../IO/WriteBufferFromTemporaryFile.h | 10 +-- .../gtest_cascade_and_memory_write_buffer.cpp | 8 +-- .../Cache/WriteBufferToFileSegment.cpp | 20 +++++- .../Cache/WriteBufferToFileSegment.h | 13 +++- src/Interpreters/TemporaryDataOnDisk.cpp | 68 +++++++++++-------- src/Interpreters/TemporaryDataOnDisk.h | 10 ++- .../tests/gtest_lru_file_cache.cpp | 21 ++++++ src/Server/HTTPHandler.cpp | 9 ++- 10 files changed, 130 insertions(+), 58 deletions(-) rename src/{ => Disks}/IO/WriteBufferFromTemporaryFile.cpp (66%) rename src/{ => Disks}/IO/WriteBufferFromTemporaryFile.h (68%) rename src/{IO => Disks}/tests/gtest_cascade_and_memory_write_buffer.cpp (95%) diff --git a/src/Disks/DiskLocal.cpp b/src/Disks/DiskLocal.cpp index 160fcb5732c..f5280d1d010 100644 --- a/src/Disks/DiskLocal.cpp +++ b/src/Disks/DiskLocal.cpp @@ -19,12 +19,14 @@ #include #include +#include + #include #include -#include #include #include + namespace CurrentMetrics { extern const Metric DiskSpaceReservedForMerge; @@ -588,7 +590,7 @@ try static DiskWriteCheckData data; String tmp_template = fs::path(disk_path) / ""; { - auto buf = WriteBufferFromTemporaryFile::create(tmp_template); + auto buf = std::make_unique(tmp_template); buf->write(data.data, data.PAGE_SIZE_IN_BYTES); buf->sync(); } diff --git a/src/IO/WriteBufferFromTemporaryFile.cpp b/src/Disks/IO/WriteBufferFromTemporaryFile.cpp similarity index 66% rename from src/IO/WriteBufferFromTemporaryFile.cpp rename to src/Disks/IO/WriteBufferFromTemporaryFile.cpp index 6528175cdb4..469636af227 100644 --- a/src/IO/WriteBufferFromTemporaryFile.cpp +++ b/src/Disks/IO/WriteBufferFromTemporaryFile.cpp @@ -1,5 +1,6 @@ -#include +#include #include +#include #include @@ -12,18 +13,18 @@ namespace ErrorCodes extern const int CANNOT_SEEK_THROUGH_FILE; } - -WriteBufferFromTemporaryFile::WriteBufferFromTemporaryFile(std::unique_ptr && tmp_file_) - : WriteBufferFromFile(tmp_file_->path(), DBMS_DEFAULT_BUFFER_SIZE, O_RDWR | O_TRUNC | O_CREAT, /* throttler= */ {}, 0600), tmp_file(std::move(tmp_file_)) -{} - - -WriteBufferFromTemporaryFile::Ptr WriteBufferFromTemporaryFile::create(const std::string & tmp_dir) +WriteBufferFromTemporaryFile::WriteBufferFromTemporaryFile(TemporaryFileOnDiskHolder && tmp_file_) + : WriteBufferFromFile(tmp_file_->getPath(), DBMS_DEFAULT_BUFFER_SIZE, O_RDWR | O_TRUNC | O_CREAT, /* throttler= */ {}, 0600) + , tmp_file(std::move(tmp_file_)) { - return Ptr{new WriteBufferFromTemporaryFile(createTemporaryFile(tmp_dir))}; } +WriteBufferFromTemporaryFile::WriteBufferFromTemporaryFile(const String & tmp_file_path) + : WriteBufferFromFile(tmp_file_path, DBMS_DEFAULT_BUFFER_SIZE, O_RDWR | O_TRUNC | O_CREAT, /* throttler= */ {}, 0600) +{ +} + class ReadBufferFromTemporaryWriteBuffer : public ReadBufferFromFile { public: @@ -40,11 +41,11 @@ public: return std::make_shared(fd, file_name, std::move(origin->tmp_file)); } - ReadBufferFromTemporaryWriteBuffer(int fd_, const std::string & file_name_, std::unique_ptr && tmp_file_) + ReadBufferFromTemporaryWriteBuffer(int fd_, const std::string & file_name_, TemporaryFileOnDiskHolder && tmp_file_) : ReadBufferFromFile(fd_, file_name_), tmp_file(std::move(tmp_file_)) {} - std::unique_ptr tmp_file; + TemporaryFileOnDiskHolder tmp_file; }; diff --git a/src/IO/WriteBufferFromTemporaryFile.h b/src/Disks/IO/WriteBufferFromTemporaryFile.h similarity index 68% rename from src/IO/WriteBufferFromTemporaryFile.h rename to src/Disks/IO/WriteBufferFromTemporaryFile.h index a4e83b95ac6..7a5a75791bf 100644 --- a/src/IO/WriteBufferFromTemporaryFile.h +++ b/src/Disks/IO/WriteBufferFromTemporaryFile.h @@ -8,6 +8,9 @@ namespace DB { +class TemporaryFileOnDisk; +using TemporaryFileOnDiskHolder = std::unique_ptr; + /// Rereadable WriteBuffer, could be used as disk buffer /// Creates unique temporary in directory (and directory itself) class WriteBufferFromTemporaryFile : public WriteBufferFromFile, public IReadableWriteBuffer @@ -15,16 +18,15 @@ class WriteBufferFromTemporaryFile : public WriteBufferFromFile, public IReadabl public: using Ptr = std::shared_ptr; - static Ptr create(const std::string & tmp_dir); + explicit WriteBufferFromTemporaryFile(TemporaryFileOnDiskHolder && tmp_file_); + explicit WriteBufferFromTemporaryFile(const String & tmp_file_path); ~WriteBufferFromTemporaryFile() override; private: - explicit WriteBufferFromTemporaryFile(std::unique_ptr && tmp_file); - std::shared_ptr getReadBufferImpl() override; - std::unique_ptr tmp_file; + TemporaryFileOnDiskHolder tmp_file; friend class ReadBufferFromTemporaryWriteBuffer; }; diff --git a/src/IO/tests/gtest_cascade_and_memory_write_buffer.cpp b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp similarity index 95% rename from src/IO/tests/gtest_cascade_and_memory_write_buffer.cpp rename to src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp index 583ba9c97de..a175f53eae6 100644 --- a/src/IO/tests/gtest_cascade_and_memory_write_buffer.cpp +++ b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp @@ -3,11 +3,11 @@ #include #include #include -#include #include #include #include #include +#include #include namespace fs = std::filesystem; @@ -214,7 +214,7 @@ try std::string tmp_template = "tmp/TemporaryFileWriteBuffer/"; std::string data = makeTestArray(s); - auto buf = WriteBufferFromTemporaryFile::create(tmp_template); + auto buf = std::make_shared(tmp_template); buf->write(data.data(), data.size()); std::string tmp_filename = buf->getFileName(); @@ -253,7 +253,7 @@ try testCascadeBufferRedability(makeTestArray(s), {}, { - [=] (auto) { return WriteBufferFromTemporaryFile::create(tmp_template); } + [=] (auto) { return std::make_shared(tmp_template); } }); testCascadeBufferRedability(makeTestArray(s), @@ -261,7 +261,7 @@ try std::make_shared(std::max(1ul, s/3ul), 2, 1.5), }, { - [=] (auto) { return WriteBufferFromTemporaryFile::create(tmp_template); } + [=] (auto) { return std::make_shared(tmp_template); } }); } } diff --git a/src/Interpreters/Cache/WriteBufferToFileSegment.cpp b/src/Interpreters/Cache/WriteBufferToFileSegment.cpp index a8dfeb214d0..a1f0992afdf 100644 --- a/src/Interpreters/Cache/WriteBufferToFileSegment.cpp +++ b/src/Interpreters/Cache/WriteBufferToFileSegment.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include @@ -11,11 +12,23 @@ namespace DB namespace ErrorCodes { + extern const int LOGICAL_ERROR; extern const int NOT_ENOUGH_SPACE; } WriteBufferToFileSegment::WriteBufferToFileSegment(FileSegment * file_segment_) - : WriteBufferFromFileDecorator(file_segment_->detachWriter()), file_segment(file_segment_) + : WriteBufferFromFileDecorator(file_segment_->detachWriter()) + , file_segment(file_segment_) +{ +} + +WriteBufferToFileSegment::WriteBufferToFileSegment(FileSegmentsHolder && segment_holder_) + : WriteBufferFromFileDecorator( + segment_holder_.file_segments.size() == 1 + ? segment_holder_.file_segments.front()->detachWriter() + : throw Exception(ErrorCodes::LOGICAL_ERROR, "WriteBufferToFileSegment can be created only from single segment")) + , file_segment(segment_holder_.file_segments.front().get()) + , segment_holder(std::move(segment_holder_)) { } @@ -52,6 +65,11 @@ void WriteBufferToFileSegment::nextImpl() file_segment->setDownloadedSize(bytes_to_write); } +std::shared_ptr WriteBufferToFileSegment::getReadBufferImpl() +{ + finalize(); + return std::make_shared(file_segment->getPathInLocalCache()); +} WriteBufferToFileSegment::~WriteBufferToFileSegment() { diff --git a/src/Interpreters/Cache/WriteBufferToFileSegment.h b/src/Interpreters/Cache/WriteBufferToFileSegment.h index 4748891a6e0..1305bcf8387 100644 --- a/src/Interpreters/Cache/WriteBufferToFileSegment.h +++ b/src/Interpreters/Cache/WriteBufferToFileSegment.h @@ -1,23 +1,34 @@ #pragma once #include +#include +#include namespace DB { class FileSegment; -class WriteBufferToFileSegment : public WriteBufferFromFileDecorator +class WriteBufferToFileSegment : public WriteBufferFromFileDecorator, public IReadableWriteBuffer { public: explicit WriteBufferToFileSegment(FileSegment * file_segment_); + explicit WriteBufferToFileSegment(FileSegmentsHolder && segment_holder); void nextImpl() override; ~WriteBufferToFileSegment() override; private: + + std::shared_ptr getReadBufferImpl() override; + + /// Reference to the file segment in segment_holder if owned by this WriteBufferToFileSegment + /// or to the external file segment passed to the constructor FileSegment * file_segment; + + /// Empty if file_segment is not owned by this WriteBufferToFileSegment + FileSegmentsHolder segment_holder; }; diff --git a/src/Interpreters/TemporaryDataOnDisk.cpp b/src/Interpreters/TemporaryDataOnDisk.cpp index c57de88d964..11877eccc5c 100644 --- a/src/Interpreters/TemporaryDataOnDisk.cpp +++ b/src/Interpreters/TemporaryDataOnDisk.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -54,29 +55,52 @@ TemporaryDataOnDisk::TemporaryDataOnDisk(TemporaryDataOnDiskScopePtr parent_, Cu , current_metric_scope(metric_scope) {} -TemporaryFileStream & TemporaryDataOnDisk::createStream(const Block & header, size_t max_file_size) +WriteBufferPtr TemporaryDataOnDisk::createRawStream(size_t max_file_size) { if (file_cache) - return createStreamToCacheFile(header, max_file_size); + { + auto holder = createCacheFile(max_file_size); + return std::make_shared(std::move(holder)); + } else if (volume) - return createStreamToRegularFile(header, max_file_size); + { + auto tmp_file = createRegularFile(max_file_size); + return std::make_shared(std::move(tmp_file)); + } throw Exception(ErrorCodes::LOGICAL_ERROR, "TemporaryDataOnDiskScope has no cache and no volume"); } -TemporaryFileStream & TemporaryDataOnDisk::createStreamToCacheFile(const Block & header, size_t max_file_size) +TemporaryFileStream & TemporaryDataOnDisk::createStream(const Block & header, size_t max_file_size) +{ + if (file_cache) + { + auto holder = createCacheFile(max_file_size); + + std::lock_guard lock(mutex); + TemporaryFileStreamPtr & tmp_stream = streams.emplace_back(std::make_unique(std::move(holder), header, this)); + return *tmp_stream; + } + else if (volume) + { + auto tmp_file = createRegularFile(max_file_size); + std::lock_guard lock(mutex); + TemporaryFileStreamPtr & tmp_stream = streams.emplace_back(std::make_unique(std::move(tmp_file), header, this)); + return *tmp_stream; + } + + throw Exception(ErrorCodes::LOGICAL_ERROR, "TemporaryDataOnDiskScope has no cache and no volume"); +} + +FileSegmentsHolder TemporaryDataOnDisk::createCacheFile(size_t max_file_size) { if (!file_cache) throw Exception(ErrorCodes::LOGICAL_ERROR, "TemporaryDataOnDiskScope has no cache"); - auto holder = file_cache->set(FileSegment::Key::random(), 0, std::max(10_MiB, max_file_size), CreateFileSegmentSettings(FileSegmentKind::Temporary, /* unbounded */ true)); - - std::lock_guard lock(mutex); - TemporaryFileStreamPtr & tmp_stream = streams.emplace_back(std::make_unique(std::move(holder), header, this)); - return *tmp_stream; + return file_cache->set(FileSegment::Key::random(), 0, std::max(10_MiB, max_file_size), CreateFileSegmentSettings(FileSegmentKind::Temporary, /* unbounded */ true)); } -TemporaryFileStream & TemporaryDataOnDisk::createStreamToRegularFile(const Block & header, size_t max_file_size) +TemporaryFileOnDiskHolder TemporaryDataOnDisk::createRegularFile(size_t max_file_size) { if (!volume) throw Exception(ErrorCodes::LOGICAL_ERROR, "TemporaryDataOnDiskScope has no volume"); @@ -94,11 +118,7 @@ TemporaryFileStream & TemporaryDataOnDisk::createStreamToRegularFile(const Block disk = volume->getDisk(); } - auto tmp_file = std::make_unique(disk, current_metric_scope); - - std::lock_guard lock(mutex); - TemporaryFileStreamPtr & tmp_stream = streams.emplace_back(std::make_unique(std::move(tmp_file), header, this)); - return *tmp_stream; + return std::make_unique(disk, current_metric_scope); } std::vector TemporaryDataOnDisk::getStreams() const @@ -119,22 +139,11 @@ bool TemporaryDataOnDisk::empty() const struct TemporaryFileStream::OutputWriter { - OutputWriter(const String & path, const Block & header_) - : out_buf(std::make_unique(path)) - , out_compressed_buf(*out_buf) - , out_writer(out_compressed_buf, DBMS_TCP_PROTOCOL_VERSION, header_) - { - LOG_TEST(&Poco::Logger::get("TemporaryFileStream"), "Writing to temporary file {}", path); - } - - OutputWriter(std::unique_ptr out_buf_, const Block & header_) + OutputWriter(std::unique_ptr out_buf_, const Block & header_) : out_buf(std::move(out_buf_)) , out_compressed_buf(*out_buf) , out_writer(out_compressed_buf, DBMS_TCP_PROTOCOL_VERSION, header_) { - LOG_TEST(&Poco::Logger::get("TemporaryFileStream"), - "Writing to temporary file {}", - static_cast(out_buf.get())->getFileName()); } size_t write(const Block & block) @@ -223,8 +232,9 @@ TemporaryFileStream::TemporaryFileStream(TemporaryFileOnDiskHolder file_, const : parent(parent_) , header(header_) , file(std::move(file_)) - , out_writer(std::make_unique(file->getPath(), header)) + , out_writer(std::make_unique(std::make_unique(file->getPath()), header)) { + LOG_TEST(&Poco::Logger::get("TemporaryFileStream"), "Writing to temporary file {}", file->getPath()); } TemporaryFileStream::TemporaryFileStream(FileSegmentsHolder && segments_, const Block & header_, TemporaryDataOnDisk * parent_) @@ -236,6 +246,8 @@ TemporaryFileStream::TemporaryFileStream(FileSegmentsHolder && segments_, const throw Exception(ErrorCodes::LOGICAL_ERROR, "TemporaryFileStream can be created only from single segment"); auto & segment = segment_holder.file_segments.front(); auto out_buf = std::make_unique(segment.get()); + + LOG_TEST(&Poco::Logger::get("TemporaryFileStream"), "Writing to temporary file {}", out_buf->getFileName()); out_writer = std::make_unique(std::move(out_buf), header); } diff --git a/src/Interpreters/TemporaryDataOnDisk.h b/src/Interpreters/TemporaryDataOnDisk.h index f7a6249a1ee..7f7c3aaef78 100644 --- a/src/Interpreters/TemporaryDataOnDisk.h +++ b/src/Interpreters/TemporaryDataOnDisk.h @@ -90,14 +90,20 @@ public: /// If max_file_size > 0, then check that there's enough space on the disk and throw an exception in case of lack of free space TemporaryFileStream & createStream(const Block & header, size_t max_file_size = 0); + /// Write raw data directly into buffer. + /// Differences from `createStream`: + /// 1) it doesn't account data in parent scope + /// 2) returned buffer owns resources (instead of TemporaryDataOnDisk itself) + WriteBufferPtr createRawStream(size_t max_file_size = 0); + std::vector getStreams() const; bool empty() const; const StatAtomic & getStat() const { return stat; } private: - TemporaryFileStream & createStreamToCacheFile(const Block & header, size_t max_file_size); - TemporaryFileStream & createStreamToRegularFile(const Block & header, size_t max_file_size); + FileSegmentsHolder createCacheFile(size_t max_file_size); + TemporaryFileOnDiskHolder createRegularFile(size_t max_file_size); mutable std::mutex mutex; std::vector streams TSA_GUARDED_BY(mutex); diff --git a/src/Interpreters/tests/gtest_lru_file_cache.cpp b/src/Interpreters/tests/gtest_lru_file_cache.cpp index b9a24ef5e50..0754c394f66 100644 --- a/src/Interpreters/tests/gtest_lru_file_cache.cpp +++ b/src/Interpreters/tests/gtest_lru_file_cache.cpp @@ -708,6 +708,27 @@ TEST_F(FileCacheTest, temporaryData) ASSERT_EQ(file_cache.getUsedCacheSize(), used_size_before_attempt); } + + { + size_t before_used_size = file_cache.getUsedCacheSize(); + auto tmp_data = std::make_unique(tmp_data_scope); + + auto write_buf_stream = tmp_data->createRawStream(); + + write_buf_stream->write("1234567890", 10); + write_buf_stream->write("abcde", 5); + auto read_buf = dynamic_cast(write_buf_stream.get())->tryGetReadBuffer(); + + ASSERT_GT(file_cache.getUsedCacheSize(), before_used_size + 10); + + char buf[15]; + size_t read_size = read_buf->read(buf, 15); + ASSERT_EQ(read_size, 15); + ASSERT_EQ(std::string(buf, 15), "1234567890abcde"); + read_size = read_buf->read(buf, 15); + ASSERT_EQ(read_size, 0); + } + { auto tmp_data = std::make_unique(tmp_data_scope); auto & stream = tmp_data->createStream(generateBlock()); diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index d407c9dd25d..778af5849b1 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -11,10 +11,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -623,12 +623,11 @@ void HTTPHandler::processQuery( if (buffer_until_eof) { - const std::string tmp_path(server.context()->getGlobalTemporaryVolume()->getDisk()->getPath()); - const std::string tmp_path_template(fs::path(tmp_path) / "http_buffers/"); + auto tmp_data = std::make_shared(server.context()->getTempDataOnDisk()); - auto create_tmp_disk_buffer = [tmp_path_template] (const WriteBufferPtr &) + auto create_tmp_disk_buffer = [tmp_data] (const WriteBufferPtr &) -> WriteBufferPtr { - return WriteBufferFromTemporaryFile::create(tmp_path_template); + return tmp_data->createRawStream(0); }; cascade_buffer2.emplace_back(std::move(create_tmp_disk_buffer)); From be0f424d1bcf593073fd888d358184b1e2c7ca40 Mon Sep 17 00:00:00 2001 From: vdimir Date: Wed, 12 Apr 2023 12:40:56 +0000 Subject: [PATCH 359/535] Fix gtest_cascade_and_memory_write_buffer --- src/Disks/DiskLocal.cpp | 8 ++-- src/Disks/DiskLocal.h | 2 +- src/Disks/IO/WriteBufferFromTemporaryFile.cpp | 6 --- src/Disks/IO/WriteBufferFromTemporaryFile.h | 3 -- .../gtest_cascade_and_memory_write_buffer.cpp | 38 +++++++++++++++---- src/Server/HTTPHandler.cpp | 3 -- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/Disks/DiskLocal.cpp b/src/Disks/DiskLocal.cpp index f5280d1d010..49f28a19b31 100644 --- a/src/Disks/DiskLocal.cpp +++ b/src/Disks/DiskLocal.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -584,13 +585,14 @@ struct DiskWriteCheckData } }; -bool DiskLocal::canWrite() const noexcept +bool DiskLocal::canWrite() noexcept try { static DiskWriteCheckData data; - String tmp_template = fs::path(disk_path) / ""; { - auto buf = std::make_unique(tmp_template); + auto disk_ptr = std::static_pointer_cast(shared_from_this()); + auto tmp_file = std::make_unique(disk_ptr); + auto buf = std::make_unique(std::move(tmp_file)); buf->write(data.data, data.PAGE_SIZE_IN_BYTES); buf->sync(); } diff --git a/src/Disks/DiskLocal.h b/src/Disks/DiskLocal.h index d6182463ebf..7ea2c04704c 100644 --- a/src/Disks/DiskLocal.h +++ b/src/Disks/DiskLocal.h @@ -119,7 +119,7 @@ public: /// rudimentary. The more advanced choice would be using /// https://github.com/smartmontools/smartmontools. However, it's good enough for now. bool canRead() const noexcept; - bool canWrite() const noexcept; + bool canWrite() noexcept; DiskObjectStoragePtr createDiskObjectStorage() override; diff --git a/src/Disks/IO/WriteBufferFromTemporaryFile.cpp b/src/Disks/IO/WriteBufferFromTemporaryFile.cpp index 469636af227..5818c405e93 100644 --- a/src/Disks/IO/WriteBufferFromTemporaryFile.cpp +++ b/src/Disks/IO/WriteBufferFromTemporaryFile.cpp @@ -19,12 +19,6 @@ WriteBufferFromTemporaryFile::WriteBufferFromTemporaryFile(TemporaryFileOnDiskHo { } - -WriteBufferFromTemporaryFile::WriteBufferFromTemporaryFile(const String & tmp_file_path) - : WriteBufferFromFile(tmp_file_path, DBMS_DEFAULT_BUFFER_SIZE, O_RDWR | O_TRUNC | O_CREAT, /* throttler= */ {}, 0600) -{ -} - class ReadBufferFromTemporaryWriteBuffer : public ReadBufferFromFile { public: diff --git a/src/Disks/IO/WriteBufferFromTemporaryFile.h b/src/Disks/IO/WriteBufferFromTemporaryFile.h index 7a5a75791bf..3e909dbcaaa 100644 --- a/src/Disks/IO/WriteBufferFromTemporaryFile.h +++ b/src/Disks/IO/WriteBufferFromTemporaryFile.h @@ -16,10 +16,7 @@ using TemporaryFileOnDiskHolder = std::unique_ptr; class WriteBufferFromTemporaryFile : public WriteBufferFromFile, public IReadableWriteBuffer { public: - using Ptr = std::shared_ptr; - explicit WriteBufferFromTemporaryFile(TemporaryFileOnDiskHolder && tmp_file_); - explicit WriteBufferFromTemporaryFile(const String & tmp_file_path); ~WriteBufferFromTemporaryFile() override; diff --git a/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp index a175f53eae6..a24056a141f 100644 --- a/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp +++ b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp @@ -7,7 +7,10 @@ #include #include #include +#include #include +#include + #include namespace fs = std::filesystem; @@ -22,6 +25,26 @@ static std::string makeTestArray(size_t size) return res; } +class TestCascadeWriteBufferWithDisk : public testing::Test +{ +public: + constexpr static auto tmp_root = "tmp/RereadWithTemporaryFileWriteBuffer/"; + + void SetUp() override + { + fs::create_directories(tmp_root); + disk = std::make_shared("local_disk", tmp_root, 0); + } + + void TearDown() override + { + disk.reset(); + fs::remove_all(tmp_root); + } + + DB::DiskPtr disk; +}; + static void testCascadeBufferRedability( std::string data, CascadeWriteBuffer::WriteBufferPtrs && arg1, @@ -206,17 +229,18 @@ TEST(MemoryWriteBuffer, WriteAndReread) } -TEST(TemporaryFileWriteBuffer, WriteAndReread) +TEST_F(TestCascadeWriteBufferWithDisk, WriteAndReread) try { for (size_t s = 0; s < 2500000; s += 500000) { - std::string tmp_template = "tmp/TemporaryFileWriteBuffer/"; std::string data = makeTestArray(s); - auto buf = std::make_shared(tmp_template); + auto tmp_file = std::make_unique(disk); + auto buf = std::make_shared(std::move(tmp_file)); buf->write(data.data(), data.size()); + std::string tmp_template = TestCascadeWriteBufferWithDisk::tmp_root; std::string tmp_filename = buf->getFileName(); ASSERT_EQ(tmp_template, tmp_filename.substr(0, tmp_template.size())); @@ -243,17 +267,15 @@ catch (...) } -TEST(CascadeWriteBuffer, RereadWithTemporaryFileWriteBuffer) +TEST_F(TestCascadeWriteBufferWithDisk, RereadWithTemporaryFileWriteBuffer) try { - const std::string tmp_template = "tmp/RereadWithTemporaryFileWriteBuffer/"; - for (size_t s = 0; s < 4000000; s += 1000000) { testCascadeBufferRedability(makeTestArray(s), {}, { - [=] (auto) { return std::make_shared(tmp_template); } + [=, this] (auto) { return std::make_shared(std::make_unique(disk)); } }); testCascadeBufferRedability(makeTestArray(s), @@ -261,7 +283,7 @@ try std::make_shared(std::max(1ul, s/3ul), 2, 1.5), }, { - [=] (auto) { return std::make_shared(tmp_template); } + [=, this] (auto) { return std::make_shared(std::make_unique(disk)); } }); } } diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index 778af5849b1..c071703e404 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -46,9 +46,6 @@ #include #include -#include - -namespace fs = std::filesystem; #if USE_SSL #include From c7bdd24bdbfe8531c0636c7f3fef28846da66edc Mon Sep 17 00:00:00 2001 From: vdimir Date: Wed, 12 Apr 2023 13:49:16 +0000 Subject: [PATCH 360/535] Test wait_end_of_query in test_temporary_data_in_cache --- .../test_temporary_data_in_cache/test.py | 64 +++++++++++++------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/tests/integration/test_temporary_data_in_cache/test.py b/tests/integration/test_temporary_data_in_cache/test.py index 0e8c7305405..e6142c7eef1 100644 --- a/tests/integration/test_temporary_data_in_cache/test.py +++ b/tests/integration/test_temporary_data_in_cache/test.py @@ -26,20 +26,24 @@ def start_cluster(): def test_cache_evicted_by_temporary_data(start_cluster): q = node.query - qi = lambda query: int(node.query(query).strip()) - - cache_size_initial = qi("SELECT sum(size) FROM system.filesystem_cache") - assert cache_size_initial == 0 - - free_space_initial = qi( - "SELECT free_space FROM system.disks WHERE name = 'tiny_local_cache_local_disk'" + get_free_space = lambda: int( + q( + "SELECT free_space FROM system.disks WHERE name = 'tiny_local_cache_local_disk'" + ).strip() + ) + get_cache_size = lambda: int( + q("SELECT sum(size) FROM system.filesystem_cache").strip() ) - assert free_space_initial > 8 * 1024 * 1024 + assert get_cache_size() == 0 + + assert get_free_space() > 8 * 1024 * 1024 + + # Codec is NONE to make cache size predictable q( - "CREATE TABLE t1 (x UInt64) ENGINE = MergeTree ORDER BY x SETTINGS storage_policy = 'tiny_local_cache'" + "CREATE TABLE t1 (x UInt64 CODEC(NONE), y UInt64 CODEC(NONE)) ENGINE = MergeTree ORDER BY x SETTINGS storage_policy = 'tiny_local_cache'" ) - q("INSERT INTO t1 SELECT number FROM numbers(1024 * 1024)") + q("INSERT INTO t1 SELECT number, number FROM numbers(1024 * 1024)") # To be sure that nothing is reading the cache and entries for t1 can be evited q("OPTIMIZE TABLE t1 FINAL") @@ -48,13 +52,11 @@ def test_cache_evicted_by_temporary_data(start_cluster): # Read some data to fill the cache q("SELECT sum(x) FROM t1") - cache_size_with_t1 = qi("SELECT sum(size) FROM system.filesystem_cache") + cache_size_with_t1 = get_cache_size() assert cache_size_with_t1 > 8 * 1024 * 1024 # Almost all disk space is occupied by t1 cache - free_space_with_t1 = qi( - "SELECT free_space FROM system.disks WHERE name = 'tiny_local_cache_local_disk'" - ) + free_space_with_t1 = get_free_space() assert free_space_with_t1 < 4 * 1024 * 1024 # Try to sort the table, but fail because of lack of disk space @@ -69,13 +71,39 @@ def test_cache_evicted_by_temporary_data(start_cluster): assert "Failed to reserve space for the file cache" in str(exc.value) # Some data evicted from cache by temporary data - cache_size_after_eviction = qi("SELECT sum(size) FROM system.filesystem_cache") + cache_size_after_eviction = get_cache_size() assert cache_size_after_eviction < cache_size_with_t1 # Disk space freed, at least 3 MB, because temporary data tried to write 4 MB - free_space_after_eviction = qi( - "SELECT free_space FROM system.disks WHERE name = 'tiny_local_cache_local_disk'" + assert get_free_space() > free_space_with_t1 + 3 * 1024 * 1024 + + # Read some data to fill the cache again + q("SELECT avg(y) FROM t1") + + cache_size_with_t1 = get_cache_size() + assert cache_size_with_t1 > 8 * 1024 * 1024, q( + "SELECT * FROM system.filesystem_cache FORMAT Vertical" ) - assert free_space_after_eviction > free_space_with_t1 + 3 * 1024 * 1024 + + # Almost all disk space is occupied by t1 cache + free_space_with_t1 = get_free_space() + assert free_space_with_t1 < 4 * 1024 * 1024, q( + "SELECT * FROM system.disks WHERE name = 'tiny_local_cache_local_disk' FORMAT Vertical" + ) + + node.http_query( + "SELECT randomPrintableASCII(1024) FROM numbers(8 * 1024) FORMAT TSV", + params={"buffer_size": 0, "wait_end_of_query": 1}, + ) + + assert get_free_space() > free_space_with_t1 + 3 * 1024 * 1024 + + # not enough space for buffering 32 MB + with pytest.raises(Exception) as exc: + node.http_query( + "SELECT randomPrintableASCII(1024) FROM numbers(32 * 1024) FORMAT TSV", + params={"buffer_size": 0, "wait_end_of_query": 1}, + ) + assert "Failed to reserve space for the file cache" in str(exc.value) q("DROP TABLE IF EXISTS t1") From 61635eb2d345881a7fd84a2c2708d9d2d02c3e04 Mon Sep 17 00:00:00 2001 From: Vladimir C Date: Thu, 13 Apr 2023 16:55:31 +0200 Subject: [PATCH 361/535] Update TemporaryDataOnDisk::createRawStream --- src/Interpreters/TemporaryDataOnDisk.h | 1 + src/Server/HTTPHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Interpreters/TemporaryDataOnDisk.h b/src/Interpreters/TemporaryDataOnDisk.h index 7f7c3aaef78..d06f0564559 100644 --- a/src/Interpreters/TemporaryDataOnDisk.h +++ b/src/Interpreters/TemporaryDataOnDisk.h @@ -94,6 +94,7 @@ public: /// Differences from `createStream`: /// 1) it doesn't account data in parent scope /// 2) returned buffer owns resources (instead of TemporaryDataOnDisk itself) + /// If max_file_size > 0, then check that there's enough space on the disk and throw an exception in case of lack of free space WriteBufferPtr createRawStream(size_t max_file_size = 0); std::vector getStreams() const; diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index c071703e404..c280ff06c69 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -624,7 +624,7 @@ void HTTPHandler::processQuery( auto create_tmp_disk_buffer = [tmp_data] (const WriteBufferPtr &) -> WriteBufferPtr { - return tmp_data->createRawStream(0); + return tmp_data->createRawStream(); }; cascade_buffer2.emplace_back(std::move(create_tmp_disk_buffer)); From d6416a132102b91a690e04aa717259f2a36b554f Mon Sep 17 00:00:00 2001 From: vdimir Date: Fri, 14 Apr 2023 19:41:26 +0000 Subject: [PATCH 362/535] Store clusters from ClusterDiscovery in separate map --- src/Interpreters/ClusterDiscovery.cpp | 28 +++++++++++++++++-- src/Interpreters/ClusterDiscovery.h | 6 ++++ src/Interpreters/Context.cpp | 23 +++++++++++++-- src/Interpreters/Context.h | 4 ++- src/Storages/System/StorageSystemClusters.cpp | 2 +- .../test_cluster_discovery/test.py | 6 ++++ 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/Interpreters/ClusterDiscovery.cpp b/src/Interpreters/ClusterDiscovery.cpp index 36b2f17e8a1..2e7ccb816a2 100644 --- a/src/Interpreters/ClusterDiscovery.cpp +++ b/src/Interpreters/ClusterDiscovery.cpp @@ -308,7 +308,9 @@ bool ClusterDiscovery::updateCluster(ClusterInfo & cluster_info) LOG_DEBUG(log, "Updating system.clusters record for '{}' with {} nodes", cluster_info.name, cluster_info.nodes_info.size()); auto cluster = makeCluster(cluster_info); - context->setCluster(cluster_info.name, cluster); + + std::lock_guard lock(mutex); + cluster_impls[cluster_info.name] = cluster; return true; } @@ -445,6 +447,21 @@ bool ClusterDiscovery::runMainThread(std::function up_to_date_callback) return finished; } +ClusterPtr ClusterDiscovery::getCluster(const String & cluster_name) const +{ + std::lock_guard lock(mutex); + auto it = cluster_impls.find(cluster_name); + if (it == cluster_impls.end()) + return nullptr; + return it->second; +} + +std::unordered_map ClusterDiscovery::getClusters() const +{ + std::lock_guard lock(mutex); + return cluster_impls; +} + void ClusterDiscovery::shutdown() { LOG_DEBUG(log, "Shutting down"); @@ -456,7 +473,14 @@ void ClusterDiscovery::shutdown() ClusterDiscovery::~ClusterDiscovery() { - ClusterDiscovery::shutdown(); + try + { + ClusterDiscovery::shutdown(); + } + catch (...) + { + tryLogCurrentException(log, "Error on ClusterDiscovery shutdown"); + } } bool ClusterDiscovery::NodeInfo::parse(const String & data, NodeInfo & result) diff --git a/src/Interpreters/ClusterDiscovery.h b/src/Interpreters/ClusterDiscovery.h index 1c7337406b7..8c976ca1b7f 100644 --- a/src/Interpreters/ClusterDiscovery.h +++ b/src/Interpreters/ClusterDiscovery.h @@ -33,6 +33,9 @@ public: void start(); + ClusterPtr getCluster(const String & cluster_name) const; + std::unordered_map getClusters() const; + ~ClusterDiscovery(); private: @@ -124,6 +127,9 @@ private: /// It prevents accessing to invalid object after ClusterDiscovery is destroyed. std::shared_ptr clusters_to_update; + mutable std::mutex mutex; + std::unordered_map cluster_impls; + ThreadFromGlobalPool main_thread; Poco::Logger * log; diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 73d78e84198..8be16b23d1e 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -2966,11 +2966,20 @@ std::shared_ptr Context::getCluster(const std::string & cluster_name) c std::shared_ptr Context::tryGetCluster(const std::string & cluster_name) const { - auto res = getClusters()->getCluster(cluster_name); + auto res = getClustersImpl()->getCluster(cluster_name); if (res) return res; + if (!cluster_name.empty()) res = tryGetReplicatedDatabaseCluster(cluster_name); + + if (res) + return res; + + std::lock_guard lock(shared->clusters_mutex); + if (shared->cluster_discovery) + res = shared->cluster_discovery->getCluster(cluster_name); + return res; } @@ -3001,8 +3010,18 @@ void Context::reloadClusterConfig() const } } +std::map Context::getClusters() const +{ + auto clusters = getClustersImpl()->getContainer(); + if (shared->cluster_discovery) + { + for (const auto & [name, cluster] : shared->cluster_discovery->getClusters()) + clusters.emplace(name, cluster); + } + return clusters; +} -std::shared_ptr Context::getClusters() const +std::shared_ptr Context::getClustersImpl() const { std::lock_guard lock(shared->clusters_mutex); if (!shared->clusters) diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index 95611e99d51..4de259e193e 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -926,7 +926,7 @@ public: void setDDLWorker(std::unique_ptr ddl_worker); DDLWorker & getDDLWorker() const; - std::shared_ptr getClusters() const; + std::map> getClusters() const; std::shared_ptr getCluster(const std::string & cluster_name) const; std::shared_ptr tryGetCluster(const std::string & cluster_name) const; void setClustersConfig(const ConfigurationPtr & config, bool enable_discovery = false, const String & config_name = "remote_servers"); @@ -1159,6 +1159,8 @@ private: DisksMap getDisksMap(std::lock_guard & lock) const; + std::shared_ptr getClustersImpl() const; + /// Throttling public: ThrottlerPtr getReplicatedFetchesThrottler() const; diff --git a/src/Storages/System/StorageSystemClusters.cpp b/src/Storages/System/StorageSystemClusters.cpp index 096e2aa206d..64d4609bcfb 100644 --- a/src/Storages/System/StorageSystemClusters.cpp +++ b/src/Storages/System/StorageSystemClusters.cpp @@ -31,7 +31,7 @@ NamesAndTypesList StorageSystemClusters::getNamesAndTypes() void StorageSystemClusters::fillData(MutableColumns & res_columns, ContextPtr context, const SelectQueryInfo &) const { - for (const auto & name_and_cluster : context->getClusters()->getContainer()) + for (const auto & name_and_cluster : context->getClusters()) writeCluster(res_columns, name_and_cluster); const auto databases = DatabaseCatalog::instance().getDatabases(); diff --git a/tests/integration/test_cluster_discovery/test.py b/tests/integration/test_cluster_discovery/test.py index 4dd892553c4..c89feb5c37e 100644 --- a/tests/integration/test_cluster_discovery/test.py +++ b/tests/integration/test_cluster_discovery/test.py @@ -95,6 +95,12 @@ def test_cluster_discovery_startup_and_stop(start_cluster): [nodes["node0"], nodes["node2"], nodes["node_observer"]], total_shards ) + nodes["node1"].query("SYSTEM DROP DNS CACHE") + nodes["node0"].query("SYSTEM DROP DNS CACHE") + check_shard_num( + [nodes["node0"], nodes["node2"], nodes["node_observer"]], total_shards + ) + nodes["node1"].stop_clickhouse(kill=True) check_nodes_count( [nodes["node0"], nodes["node2"], nodes["node_observer"]], total_nodes - 1 From 33ee94f08fb7f721b9f49497854a4d8786fae20a Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 18 Apr 2023 11:55:50 +0000 Subject: [PATCH 363/535] Add CREATE TABLE tbl ON CLUSTER to test_cluster_discovery --- .../test_cluster_discovery/test.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/integration/test_cluster_discovery/test.py b/tests/integration/test_cluster_discovery/test.py index c89feb5c37e..ad3deb5b142 100644 --- a/tests/integration/test_cluster_discovery/test.py +++ b/tests/integration/test_cluster_discovery/test.py @@ -95,8 +95,29 @@ def test_cluster_discovery_startup_and_stop(start_cluster): [nodes["node0"], nodes["node2"], nodes["node_observer"]], total_shards ) + # test ON CLUSTER query + nodes["node0"].query( + "CREATE TABLE tbl ON CLUSTER 'test_auto_cluster' (x UInt64) ENGINE = MergeTree ORDER BY x" + ) + nodes["node0"].query("INSERT INTO tbl VALUES (1)") + nodes["node1"].query("INSERT INTO tbl VALUES (2)") + + assert ( + int( + nodes["node_observer"] + .query( + "SELECT sum(x) FROM clusterAllReplicas(test_auto_cluster, default.tbl)" + ) + .strip() + ) + == 3 + ) + + # Query SYSTEM DROP DNS CACHE may reload cluster configuration + # check that it does not affect cluster discovery nodes["node1"].query("SYSTEM DROP DNS CACHE") nodes["node0"].query("SYSTEM DROP DNS CACHE") + check_shard_num( [nodes["node0"], nodes["node2"], nodes["node_observer"]], total_shards ) From b1f0e0d62f490e4d3720443cd7c34adf885f503a Mon Sep 17 00:00:00 2001 From: vdimir Date: Tue, 18 Apr 2023 12:01:45 +0000 Subject: [PATCH 364/535] Lock clusters_mutex for cluster_discovery --- src/Interpreters/Context.cpp | 32 +++++++++++++++++--------------- src/Interpreters/Context.h | 3 ++- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 8be16b23d1e..22955bf08b2 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -327,8 +327,8 @@ struct ContextSharedPart : boost::noncopyable /// Initialized on demand (on distributed storages initialization) since Settings should be initialized std::shared_ptr clusters; ConfigurationPtr clusters_config; /// Stores updated configs - mutable std::mutex clusters_mutex; /// Guards clusters and clusters_config std::unique_ptr cluster_discovery; + mutable std::mutex clusters_mutex; /// Guards clusters, clusters_config and cluster_discovery std::shared_ptr async_insert_queue; std::map server_ports; @@ -2966,20 +2966,19 @@ std::shared_ptr Context::getCluster(const std::string & cluster_name) c std::shared_ptr Context::tryGetCluster(const std::string & cluster_name) const { - auto res = getClustersImpl()->getCluster(cluster_name); - if (res) - return res; + std::shared_ptr res = nullptr; - if (!cluster_name.empty()) + { + std::lock_guard lock(shared->clusters_mutex); + res = getClustersImpl(lock)->getCluster(cluster_name); + + if (res == nullptr && shared->cluster_discovery) + res = shared->cluster_discovery->getCluster(cluster_name); + } + + if (res == nullptr && !cluster_name.empty()) res = tryGetReplicatedDatabaseCluster(cluster_name); - if (res) - return res; - - std::lock_guard lock(shared->clusters_mutex); - if (shared->cluster_discovery) - res = shared->cluster_discovery->getCluster(cluster_name); - return res; } @@ -3012,7 +3011,10 @@ void Context::reloadClusterConfig() const std::map Context::getClusters() const { - auto clusters = getClustersImpl()->getContainer(); + std::lock_guard lock(shared->clusters_mutex); + + auto clusters = getClustersImpl(lock)->getContainer(); + if (shared->cluster_discovery) { for (const auto & [name, cluster] : shared->cluster_discovery->getClusters()) @@ -3021,9 +3023,8 @@ std::map Context::getClusters() const return clusters; } -std::shared_ptr Context::getClustersImpl() const +std::shared_ptr Context::getClustersImpl(std::lock_guard & /* lock */) const { - std::lock_guard lock(shared->clusters_mutex); if (!shared->clusters) { const auto & config = shared->clusters_config ? *shared->clusters_config : getConfigRef(); @@ -3035,6 +3036,7 @@ std::shared_ptr Context::getClustersImpl() const void Context::startClusterDiscovery() { + std::lock_guard lock(shared->clusters_mutex); if (!shared->cluster_discovery) return; shared->cluster_discovery->start(); diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index 4de259e193e..36a6a8e6f49 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -1159,7 +1159,8 @@ private: DisksMap getDisksMap(std::lock_guard & lock) const; - std::shared_ptr getClustersImpl() const; + /// Expect lock for shared->clusters_mutex + std::shared_ptr getClustersImpl(std::lock_guard & lock) const; /// Throttling public: From b31f696aae3e00ba647065a3bbfde2f9a2fd752b Mon Sep 17 00:00:00 2001 From: Vladimir C Date: Tue, 18 Apr 2023 16:10:46 +0200 Subject: [PATCH 365/535] Fix iteration in Context::getClusters --- src/Interpreters/Context.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 22955bf08b2..ddba935e59f 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -3017,7 +3017,8 @@ std::map Context::getClusters() const if (shared->cluster_discovery) { - for (const auto & [name, cluster] : shared->cluster_discovery->getClusters()) + const auto & cluster_discovery_map = shared->cluster_discovery->getClusters(); + for (const auto & [name, cluster] : cluster_discovery_map) clusters.emplace(name, cluster); } return clusters; From 0e4aff9dc7aa077b9dd81c091e4d7ce4d19ceb28 Mon Sep 17 00:00:00 2001 From: Alexander Gololobov <440544+davenger@users.noreply.github.com> Date: Wed, 19 Apr 2023 17:00:25 +0200 Subject: [PATCH 366/535] WHERE clause is not optional for DELETE statement --- docs/en/sql-reference/statements/delete.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/sql-reference/statements/delete.md b/docs/en/sql-reference/statements/delete.md index d18f94031ae..fa9f08e225f 100644 --- a/docs/en/sql-reference/statements/delete.md +++ b/docs/en/sql-reference/statements/delete.md @@ -8,7 +8,7 @@ title: DELETE Statement --- ``` sql -DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr] +DELETE FROM [db.]table [ON CLUSTER cluster] WHERE expr ``` `DELETE FROM` removes rows from the table `[db.]table` that match the expression `expr`. The deleted rows are marked as deleted immediately and will be automatically filtered out of all subsequent queries. Cleanup of data happens asynchronously in the background. This feature is only available for the MergeTree table engine family. From 2fb337828b0d1ec98304c9e97f89b56cce3b01c2 Mon Sep 17 00:00:00 2001 From: DanRoscigno Date: Wed, 19 Apr 2023 11:14:39 -0400 Subject: [PATCH 367/535] added file() write to docs --- docs/en/sql-reference/table-functions/file.md | 70 ++++++++++++++++--- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/docs/en/sql-reference/table-functions/file.md b/docs/en/sql-reference/table-functions/file.md index 48c2cadc62c..20f167be6d9 100644 --- a/docs/en/sql-reference/table-functions/file.md +++ b/docs/en/sql-reference/table-functions/file.md @@ -6,9 +6,9 @@ sidebar_label: file # file -Creates a table from a file. This table function is similar to [url](/docs/en/sql-reference/table-functions/url.md) and [hdfs](/docs/en/sql-reference/table-functions/hdfs.md) ones. +Provides a table-like interface to SELECT from and INSERT to files. This table function is similar to the [s3](/docs/en/sql-reference/table-functions/url.md) table function. Use file() when working with local files, and s3() when working with buckets in S3, GCS, or MinIO. -`file` function can be used in `SELECT` and `INSERT` queries on data in [File](/docs/en/engines/table-engines/special/file.md) tables. +The `file` function can be used in `SELECT` and `INSERT` queries to read from or write to files. **Syntax** @@ -27,7 +27,52 @@ file(path [,format] [,structure] [,compression]) A table with the specified structure for reading or writing data in the specified file. -**Examples** +## File Write Examples + +### Write to a TSV file + +```sql +INSERT INTO TABLE FUNCTION +file('test.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2) +``` + +As a result, the data is written into the file `test.tsv`: + +```bash +# cat /var/lib/clickhouse/user_files/test.tsv +1 2 3 +3 2 1 +1 3 2 +``` + +### Partitioned Write to multiple TSV files + +If you specify `PARTITION BY` expression when inserting data into a file() function, a separate file is created for each partition value. Splitting the data into separate files helps to improve reading operations efficiency. + +```sql +INSERT INTO TABLE FUNCTION +file('test_{_partition_id}.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +PARTITION BY column3 +VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2) +``` + +As a result, the data is written into three files: `test_1.tsv`, `test_2.tsv`, and `test_3.tsv`. + +```bash +# cat /var/lib/clickhouse/user_files/test_1.tsv +3 2 1 + +# cat /var/lib/clickhouse/user_files/test_2.tsv +1 3 2 + +# cat /var/lib/clickhouse/user_files/test_3.tsv +1 2 3 +``` + +## File Read Examples + +### SELECT from a CSV file Setting `user_files_path` and the contents of the file `test.csv`: @@ -44,7 +89,9 @@ $ cat /var/lib/clickhouse/user_files/test.csv Getting data from a table in `test.csv` and selecting the first two rows from it: ``` sql -SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') LIMIT 2; +SELECT * FROM +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2; ``` ``` text @@ -57,14 +104,21 @@ SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 U Getting the first 10 lines of a table that contains 3 columns of [UInt32](/docs/en/sql-reference/data-types/int-uint.md) type from a CSV file: ``` sql -SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') LIMIT 10; +SELECT * FROM +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 10; ``` -Inserting data from a file into a table: +### Inserting data from a file into a table: ``` sql -INSERT INTO FUNCTION file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') VALUES (1, 2, 3), (3, 2, 1); -SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32'); +INSERT INTO FUNCTION +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +VALUES (1, 2, 3), (3, 2, 1); +``` +```sql +SELECT * FROM +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32'); ``` ``` text From 746787d800e0c8a3e634d2fa33e92d67498524e8 Mon Sep 17 00:00:00 2001 From: Kseniia Sumarokova <54203879+kssenii@users.noreply.github.com> Date: Wed, 19 Apr 2023 17:32:01 +0200 Subject: [PATCH 368/535] Update Settings.h --- src/Core/Settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 4d21960906d..401a29bc9e9 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -637,7 +637,7 @@ class IColumn; M(String, remote_filesystem_read_method, "threadpool", "Method of reading data from remote filesystem, one of: read, threadpool.", 0) \ M(Bool, local_filesystem_read_prefetch, false, "Should use prefetching when reading data from local filesystem.", 0) \ M(Bool, remote_filesystem_read_prefetch, true, "Should use prefetching when reading data from remote filesystem.", 0) \ - M(Int64, read_priority, 0, "Priority to read data from local filesystem. Only supported for 'pread_threadpool' method.", 0) \ + M(Int64, read_priority, 0, "Priority to read data from local filesystem or remote filesystem. Only supported for 'pread_threadpool' method for local filesystem and for `threadpool` method for remote filesystem.", 0) \ M(UInt64, merge_tree_min_rows_for_concurrent_read_for_remote_filesystem, (20 * 8192), "If at least as many lines are read from one file, the reading can be parallelized, when reading from remote filesystem.", 0) \ M(UInt64, merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem, (24 * 10 * 1024 * 1024), "If at least as many bytes are read from one file, the reading can be parallelized, when reading from remote filesystem.", 0) \ M(UInt64, remote_read_min_bytes_for_seek, 4 * DBMS_DEFAULT_BUFFER_SIZE, "Min bytes required for remote read (url, s3) to do seek, instead of read with ignore.", 0) \ From 5a8efd3261d41aad3f1ce2043eed5327b53c7d8d Mon Sep 17 00:00:00 2001 From: Kseniia Sumarokova <54203879+kssenii@users.noreply.github.com> Date: Wed, 19 Apr 2023 17:35:57 +0200 Subject: [PATCH 369/535] Update cluster.py --- tests/integration/helpers/cluster.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index 6683b75c14a..edcff9631ec 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -376,6 +376,7 @@ class ClickHouseCluster: # # [1]: https://github.com/ClickHouse/ClickHouse/issues/43426#issuecomment-1368512678 self.env_variables["ASAN_OPTIONS"] = "use_sigaltstack=0" + self.env_variables["TSAN_OPTIONS"] = "use_sigaltstack=0" self.env_variables["CLICKHOUSE_WATCHDOG_ENABLE"] = "0" self.env_variables["CLICKHOUSE_NATS_TLS_SECURE"] = "0" self.up_called = False From 50064f261b02d20273b39a87674bd5a376fb763a Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 15:40:06 +0000 Subject: [PATCH 370/535] Replace by rowNumberInBlock() --- tests/queries/0_stateless/01079_new_range_reader_segfault.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/01079_new_range_reader_segfault.sql b/tests/queries/0_stateless/01079_new_range_reader_segfault.sql index 697c28e4c23..804d4316ea8 100644 --- a/tests/queries/0_stateless/01079_new_range_reader_segfault.sql +++ b/tests/queries/0_stateless/01079_new_range_reader_segfault.sql @@ -3,9 +3,9 @@ drop table if exists t; create table t (a Int) engine = MergeTree order by a; -- some magic to satisfy conditions to run optimizations in MergeTreeRangeReader -insert into t select number < 20000 ? 0 : 1 from numbers(50000); +insert into t select number < 20 ? 0 : 1 from numbers(50); alter table t add column s String default 'foo'; -select s from t prewhere a != 1 where rand() % 2 = 0 limit 1; +select s from t prewhere a != 1 where rowNumberInBlock() % 2 = 0 limit 1; drop table t; From c406663442a8e5df2e87b02325c794307828d926 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 15:55:29 +0000 Subject: [PATCH 371/535] Docs: Replace annoying three spaces in enumerations by a single space --- docs/en/development/architecture.md | 10 +- docs/en/development/build.md | 20 +- docs/en/development/style.md | 22 +- docs/en/development/tests.md | 10 +- docs/en/engines/database-engines/atomic.md | 2 +- docs/en/engines/database-engines/index.md | 16 +- .../database-engines/materialized-mysql.md | 8 +- .../materialized-postgresql.md | 14 +- docs/en/engines/database-engines/mysql.md | 14 +- .../en/engines/database-engines/postgresql.md | 12 +- .../en/engines/database-engines/replicated.md | 6 +- docs/en/engines/database-engines/sqlite.md | 2 +- docs/en/engines/table-engines/index.md | 78 +- .../integrations/ExternalDistributed.md | 22 +- .../table-engines/integrations/deltalake.md | 4 +- .../table-engines/integrations/hdfs.md | 28 +- .../table-engines/integrations/hive.md | 12 +- .../table-engines/integrations/hudi.md | 4 +- .../table-engines/integrations/iceberg.md | 4 +- .../table-engines/integrations/index.md | 34 +- .../table-engines/integrations/jdbc.md | 8 +- .../table-engines/integrations/kafka.md | 62 +- .../integrations/materialized-postgresql.md | 14 +- .../table-engines/integrations/mongodb.md | 12 +- .../table-engines/integrations/mysql.md | 40 +- .../table-engines/integrations/nats.md | 6 +- .../table-engines/integrations/odbc.md | 16 +- .../table-engines/integrations/postgresql.md | 24 +- .../table-engines/integrations/rabbitmq.md | 30 +- .../engines/table-engines/integrations/s3.md | 82 +- .../table-engines/integrations/sqlite.md | 8 +- .../engines/table-engines/log-family/index.md | 18 +- .../table-engines/log-family/stripelog.md | 4 +- .../mergetree-family/collapsingmergetree.md | 2 +- .../custom-partitioning-key.md | 22 +- .../mergetree-family/graphitemergetree.md | 30 +- .../mergetree-family/mergetree.md | 166 ++-- .../mergetree-family/replacingmergetree.md | 2 +- .../mergetree-family/replication.md | 34 +- .../mergetree-family/summingmergetree.md | 6 +- .../versionedcollapsingmergetree.md | 8 +- .../table-engines/special/dictionary.md | 2 +- .../table-engines/special/distributed.md | 10 +- docs/en/engines/table-engines/special/file.md | 22 +- .../engines/table-engines/special/generate.md | 16 +- .../en/engines/table-engines/special/index.md | 6 +- docs/en/engines/table-engines/special/join.md | 4 +- .../en/engines/table-engines/special/merge.md | 6 +- docs/en/engines/table-engines/special/url.md | 10 +- .../example-datasets/nypd_complaint_data.md | 2 +- .../example-datasets/ontime.md | 12 +- .../example-datasets/recipes.md | 14 +- docs/en/getting-started/install.md | 18 +- docs/en/getting-started/playground.md | 4 +- docs/en/interfaces/cli.md | 58 +- docs/en/interfaces/formats.md | 70 +- docs/en/interfaces/grpc.md | 34 +- docs/en/interfaces/http.md | 30 +- docs/en/interfaces/jdbc.md | 6 +- docs/en/interfaces/mysql.md | 4 +- docs/en/interfaces/overview.md | 20 +- .../third-party/client-libraries.md | 130 +-- docs/en/interfaces/third-party/gui.md | 150 ++-- docs/en/interfaces/third-party/index.md | 8 +- .../en/interfaces/third-party/integrations.md | 196 ++-- docs/en/interfaces/third-party/proxy.md | 18 +- docs/en/operations/_troubleshooting.md | 34 +- docs/en/operations/configuration-files.md | 8 +- docs/en/operations/monitoring.md | 12 +- .../optimizing-performance/index.md | 2 +- .../sampling-query-profiler.md | 20 +- docs/en/operations/quotas.md | 4 +- .../settings.md | 370 ++++---- docs/en/operations/settings/index.md | 8 +- .../settings/merge-tree-settings.md | 138 +-- .../settings/permissions-for-queries.md | 14 +- .../operations/settings/query-complexity.md | 28 +- .../operations/settings/settings-formats.md | 152 ++-- docs/en/operations/settings/settings-users.md | 16 +- docs/en/operations/settings/settings.md | 846 +++++++++--------- docs/en/operations/storing-data.md | 26 +- .../system-tables/asynchronous_metric_log.md | 10 +- .../system-tables/asynchronous_metrics.md | 14 +- docs/en/operations/system-tables/clusters.md | 32 +- docs/en/operations/system-tables/columns.md | 42 +- .../operations/system-tables/contributors.md | 2 +- docs/en/operations/system-tables/crash-log.md | 24 +- .../system-tables/data_skipping_indices.md | 20 +- .../system-tables/data_type_families.md | 8 +- docs/en/operations/system-tables/databases.md | 14 +- .../operations/system-tables/dictionaries.md | 60 +- docs/en/operations/system-tables/disks.md | 12 +- .../system-tables/distributed_ddl_queue.md | 24 +- .../system-tables/distribution_queue.md | 22 +- .../system-tables/dropped_tables.md | 14 +- docs/en/operations/system-tables/errors.md | 14 +- docs/en/operations/system-tables/events.md | 14 +- docs/en/operations/system-tables/functions.md | 4 +- docs/en/operations/system-tables/grants.md | 16 +- .../system-tables/graphite_retentions.md | 18 +- docs/en/operations/system-tables/index.md | 40 +- .../system-tables/information_schema.md | 110 +-- .../system-tables/merge_tree_settings.md | 10 +- docs/en/operations/system-tables/merges.md | 34 +- .../en/operations/system-tables/metric_log.md | 16 +- docs/en/operations/system-tables/metrics.md | 14 +- docs/en/operations/system-tables/moves.md | 22 +- docs/en/operations/system-tables/mutations.md | 36 +- .../system-tables/opentelemetry_span_log.md | 32 +- docs/en/operations/system-tables/part_log.md | 70 +- docs/en/operations/system-tables/parts.md | 98 +- .../operations/system-tables/parts_columns.md | 86 +- docs/en/operations/system-tables/processes.md | 22 +- .../system-tables/processors_profile_log.md | 32 +- docs/en/operations/system-tables/query_log.md | 154 ++-- .../system-tables/query_thread_log.md | 96 +- .../system-tables/query_views_log.md | 58 +- .../operations/system-tables/quota_usage.md | 2 +- docs/en/operations/system-tables/quotas.md | 2 +- .../operations/system-tables/quotas_usage.md | 2 +- docs/en/operations/system-tables/replicas.md | 62 +- .../system-tables/replicated_fetches.md | 34 +- .../system-tables/replication_queue.md | 60 +- .../operations/system-tables/role-grants.md | 8 +- docs/en/operations/system-tables/roles.md | 2 +- .../operations/system-tables/row_policies.md | 24 +- .../system-tables/schema_inference_cache.md | 2 +- .../system-tables/server_settings.md | 18 +- .../operations/system-tables/session_log.md | 72 +- docs/en/operations/system-tables/settings.md | 32 +- .../settings_profile_elements.md | 20 +- .../system-tables/settings_profiles.md | 16 +- .../operations/system-tables/stack_trace.md | 16 +- .../system-tables/storage_policies.md | 30 +- .../operations/system-tables/table_engines.md | 22 +- docs/en/operations/system-tables/tables.md | 64 +- docs/en/operations/system-tables/text_log.md | 44 +- .../en/operations/system-tables/time_zones.md | 2 +- docs/en/operations/system-tables/trace_log.md | 36 +- docs/en/operations/system-tables/users.md | 26 +- docs/en/operations/system-tables/zookeeper.md | 28 +- .../operations/system-tables/zookeeper_log.md | 78 +- .../utilities/clickhouse-benchmark.md | 56 +- .../operations/utilities/clickhouse-copier.md | 20 +- .../operations/utilities/clickhouse-local.md | 38 +- docs/en/operations/utilities/index.md | 14 +- .../aggregate-functions/combinators.md | 32 +- .../aggregate-functions/index.md | 4 +- .../parametric-functions.md | 74 +- .../aggregate-functions/reference/anyheavy.md | 2 +- .../aggregate-functions/reference/argmax.md | 6 +- .../aggregate-functions/reference/argmin.md | 6 +- .../aggregate-functions/reference/avg.md | 6 +- .../reference/avgweighted.md | 8 +- .../reference/contingency.md | 2 +- .../aggregate-functions/reference/count.md | 12 +- .../aggregate-functions/reference/cramersv.md | 2 +- .../reference/cramersvbiascorrected.md | 2 +- .../aggregate-functions/reference/deltasum.md | 4 +- .../reference/deltasumtimestamp.md | 6 +- .../aggregate-functions/reference/entropy.md | 4 +- .../reference/exponentialmovingaverage.md | 6 +- .../reference/grouparrayinsertat.md | 14 +- .../reference/grouparraymovingavg.md | 6 +- .../reference/grouparraymovingsum.md | 6 +- .../reference/grouparraysample.md | 8 +- .../aggregate-functions/reference/index.md | 138 +-- .../reference/intervalLengthSum.md | 6 +- .../reference/mannwhitneyutest.md | 22 +- .../reference/meanztest.md | 18 +- .../aggregate-functions/reference/median.md | 18 +- .../aggregate-functions/reference/quantile.md | 16 +- .../reference/quantileApprox.md | 18 +- .../reference/quantilebfloat16.md | 10 +- .../reference/quantiledeterministic.md | 18 +- .../reference/quantileexact.md | 64 +- .../reference/quantileexactweighted.md | 18 +- .../reference/quantileinterpolatedweighted.md | 18 +- .../reference/quantiles.md | 32 +- .../reference/quantiletdigest.md | 16 +- .../reference/quantiletdigestweighted.md | 18 +- .../reference/quantiletiming.md | 18 +- .../reference/quantiletimingweighted.md | 16 +- .../aggregate-functions/reference/rankCorr.md | 8 +- .../reference/simplelinearregression.md | 4 +- .../aggregate-functions/reference/sparkbar.md | 12 +- .../reference/stochasticlinearregression.md | 4 +- .../reference/stochasticlogisticregression.md | 4 +- .../reference/studentttest.md | 18 +- .../aggregate-functions/reference/sumcount.md | 4 +- .../aggregate-functions/reference/sumkahan.md | 2 +- .../aggregate-functions/reference/theilsu.md | 2 +- .../aggregate-functions/reference/topk.md | 4 +- .../reference/topkweighted.md | 8 +- .../aggregate-functions/reference/uniq.md | 18 +- .../reference/uniqcombined.md | 24 +- .../reference/uniqexact.md | 8 +- .../reference/uniqhll12.md | 16 +- .../reference/uniqthetasketch.md | 18 +- .../reference/welchttest.md | 18 +- .../data-types/aggregatefunction.md | 4 +- docs/en/sql-reference/data-types/date.md | 6 +- docs/en/sql-reference/data-types/date32.md | 6 +- docs/en/sql-reference/data-types/datetime.md | 20 +- .../en/sql-reference/data-types/datetime64.md | 22 +- docs/en/sql-reference/data-types/decimal.md | 30 +- .../sql-reference/data-types/domains/index.md | 22 +- docs/en/sql-reference/data-types/enum.md | 4 +- .../sql-reference/data-types/fixedstring.md | 12 +- docs/en/sql-reference/data-types/float.md | 22 +- docs/en/sql-reference/data-types/int-uint.md | 32 +- .../data-types/lowcardinality.md | 18 +- docs/en/sql-reference/data-types/map.md | 8 +- .../data-types/simpleaggregatefunction.md | 32 +- .../data-types/special-data-types/interval.md | 24 +- docs/en/sql-reference/data-types/string.md | 2 +- docs/en/sql-reference/dictionaries/index.md | 352 ++++---- .../functions/arithmetic-functions.md | 28 +- .../sql-reference/functions/bit-functions.md | 34 +- .../functions/bitmap-functions.md | 66 +- .../functions/comparison-functions.md | 8 +- .../functions/conditional-functions.md | 20 +- .../functions/date-time-functions.md | 132 +-- .../functions/distance-functions.md | 68 +- .../functions/encoding-functions.md | 24 +- .../functions/encryption-functions.md | 76 +- .../functions/ext-dict-functions.md | 80 +- docs/en/sql-reference/functions/files.md | 8 +- .../functions/functions-for-nulls.md | 40 +- .../functions/geo/coordinates.md | 36 +- .../en/sql-reference/functions/geo/geohash.md | 26 +- docs/en/sql-reference/functions/geo/h3.md | 178 ++-- docs/en/sql-reference/functions/geo/index.md | 112 +-- docs/en/sql-reference/functions/geo/s2.md | 74 +- .../sql-reference/functions/hash-functions.md | 204 ++--- docs/en/sql-reference/functions/index.md | 38 +- .../sql-reference/functions/introspection.md | 38 +- .../functions/ip-address-functions.md | 28 +- .../sql-reference/functions/json-functions.md | 30 +- .../functions/logical-functions.md | 32 +- .../sql-reference/functions/math-functions.md | 54 +- .../sql-reference/functions/nlp-functions.md | 20 +- .../functions/other-functions.md | 232 ++--- .../functions/random-functions.md | 4 +- .../functions/rounding-functions.md | 48 +- .../functions/splitting-merging-functions.md | 66 +- .../functions/string-functions.md | 108 +-- .../functions/string-search-functions.md | 118 +-- .../functions/tuple-functions.md | 62 +- .../functions/tuple-map-functions.md | 62 +- .../functions/type-conversion-functions.md | 226 ++--- .../sql-reference/functions/ulid-functions.md | 10 +- .../functions/uniqtheta-functions.md | 8 +- .../sql-reference/functions/url-functions.md | 58 +- .../sql-reference/functions/uuid-functions.md | 26 +- .../functions/ym-dict-functions.md | 8 +- docs/en/sql-reference/operators/in.md | 2 +- docs/en/sql-reference/operators/index.md | 32 +- .../sql-reference/statements/alter/column.md | 24 +- .../sql-reference/statements/alter/delete.md | 6 +- .../sql-reference/statements/alter/index.md | 30 +- .../statements/alter/partition.md | 76 +- .../sql-reference/statements/alter/setting.md | 2 +- .../statements/alter/skipping-index.md | 6 +- .../sql-reference/statements/alter/update.md | 6 +- .../en/sql-reference/statements/alter/user.md | 8 +- .../sql-reference/statements/check-table.md | 12 +- .../statements/create/database.md | 4 +- .../statements/create/function.md | 6 +- .../sql-reference/statements/create/index.md | 20 +- .../sql-reference/statements/create/table.md | 28 +- .../sql-reference/statements/create/user.md | 44 +- .../sql-reference/statements/create/view.md | 2 +- .../statements/describe-table.md | 18 +- docs/en/sql-reference/statements/detach.md | 4 +- docs/en/sql-reference/statements/exchange.md | 2 +- docs/en/sql-reference/statements/explain.md | 34 +- docs/en/sql-reference/statements/grant.md | 520 +++++------ docs/en/sql-reference/statements/index.md | 44 +- .../sql-reference/statements/insert-into.md | 26 +- docs/en/sql-reference/statements/optimize.md | 8 +- docs/en/sql-reference/statements/rename.md | 2 +- .../statements/select/array-join.md | 4 +- .../statements/select/distinct.md | 6 +- .../sql-reference/statements/select/except.md | 4 +- .../sql-reference/statements/select/from.md | 10 +- .../statements/select/group-by.md | 16 +- .../sql-reference/statements/select/index.md | 68 +- .../statements/select/intersect.md | 4 +- .../statements/select/into-outfile.md | 8 +- .../sql-reference/statements/select/join.md | 40 +- .../statements/select/limit-by.md | 4 +- .../statements/select/order-by.md | 4 +- .../sql-reference/statements/select/sample.md | 12 +- .../sql-reference/statements/select/union.md | 4 +- docs/en/sql-reference/statements/show.md | 12 +- docs/en/sql-reference/syntax.md | 34 +- .../sql-reference/table-functions/cluster.md | 10 +- .../table-functions/dictionary.md | 4 +- .../table-functions/executable.md | 12 +- docs/en/sql-reference/table-functions/file.md | 36 +- .../sql-reference/table-functions/format.md | 8 +- .../sql-reference/table-functions/generate.md | 10 +- docs/en/sql-reference/table-functions/hdfs.md | 32 +- .../table-functions/hdfsCluster.md | 24 +- .../en/sql-reference/table-functions/index.md | 4 +- .../en/sql-reference/table-functions/input.md | 4 +- .../en/sql-reference/table-functions/merge.md | 2 +- .../sql-reference/table-functions/mongodb.md | 18 +- .../en/sql-reference/table-functions/mysql.md | 18 +- docs/en/sql-reference/table-functions/null.md | 4 +- docs/en/sql-reference/table-functions/odbc.md | 10 +- .../table-functions/postgresql.md | 16 +- docs/en/sql-reference/table-functions/s3.md | 28 +- .../table-functions/s3Cluster.md | 14 +- .../sql-reference/table-functions/sqlite.md | 8 +- docs/en/sql-reference/table-functions/view.md | 6 +- 317 files changed, 5492 insertions(+), 5492 deletions(-) diff --git a/docs/en/development/architecture.md b/docs/en/development/architecture.md index dd46b294ddd..da7f95ac207 100644 --- a/docs/en/development/architecture.md +++ b/docs/en/development/architecture.md @@ -79,8 +79,8 @@ In most cases, the read method is only responsible for reading the specified col But there are notable exceptions: -- The AST query is passed to the `read` method, and the table engine can use it to derive index usage and to read fewer data from a table. -- Sometimes the table engine can process data itself to a specific stage. For example, `StorageDistributed` can send a query to remote servers, ask them to process data to a stage where data from different remote servers can be merged, and return that preprocessed data. The query interpreter then finishes processing the data. +- The AST query is passed to the `read` method, and the table engine can use it to derive index usage and to read fewer data from a table. +- Sometimes the table engine can process data itself to a specific stage. For example, `StorageDistributed` can send a query to remote servers, ask them to process data to a stage where data from different remote servers can be merged, and return that preprocessed data. The query interpreter then finishes processing the data. The table’s `read` method can return multiple `IBlockInputStream` objects to allow parallel data processing. These multiple block input streams can read from a table in parallel. Then you can wrap these streams with various transformations (such as expression evaluation or filtering) that can be calculated independently and create a `UnionBlockInputStream` on top of them, to read from multiple streams in parallel. @@ -132,9 +132,9 @@ Aggregation states can be serialized and deserialized to pass over the network d The server implements several different interfaces: -- An HTTP interface for any foreign clients. -- A TCP interface for the native ClickHouse client and for cross-server communication during distributed query execution. -- An interface for transferring data for replication. +- An HTTP interface for any foreign clients. +- A TCP interface for the native ClickHouse client and for cross-server communication during distributed query execution. +- An interface for transferring data for replication. Internally, it is just a primitive multithread server without coroutines or fibers. Since the server is not designed to process a high rate of simple queries but to process a relatively low rate of complex queries, each of them can process a vast amount of data for analytics. diff --git a/docs/en/development/build.md b/docs/en/development/build.md index 00a8a54f80a..6df46d9dec7 100644 --- a/docs/en/development/build.md +++ b/docs/en/development/build.md @@ -9,9 +9,9 @@ description: How to build ClickHouse on Linux Supported platforms: -- x86_64 -- AArch64 -- Power9 (experimental) +- x86_64 +- AArch64 +- Power9 (experimental) ## Normal Build for Development on Ubuntu @@ -82,13 +82,13 @@ This will create the `programs/clickhouse` executable, which can be used with `c The build requires the following components: -- Git (is used only to checkout the sources, it’s not needed for the build) -- CMake 3.15 or newer -- Ninja -- C++ compiler: clang-15 or newer -- Linker: lld -- Yasm -- Gawk +- Git (is used only to checkout the sources, it’s not needed for the build) +- CMake 3.15 or newer +- Ninja +- C++ compiler: clang-15 or newer +- Linker: lld +- Yasm +- Gawk If all the components are installed, you may build in the same way as the steps above. diff --git a/docs/en/development/style.md b/docs/en/development/style.md index 78b1d1e9ebb..5b03468623d 100644 --- a/docs/en/development/style.md +++ b/docs/en/development/style.md @@ -370,8 +370,8 @@ If the file contains a single function, name the file the same way as the functi **11.** If the name contains an abbreviation, then: -- For variable names, the abbreviation should use lowercase letters `mysql_connection` (not `mySQL_connection`). -- For names of classes and functions, keep the uppercase letters in the abbreviation`MySQLConnection` (not `MySqlConnection`). +- For variable names, the abbreviation should use lowercase letters `mysql_connection` (not `mySQL_connection`). +- For names of classes and functions, keep the uppercase letters in the abbreviation`MySQLConnection` (not `MySqlConnection`). **12.** Constructor arguments that are used just to initialize the class members should be named the same way as the class members, but with an underscore at the end. @@ -434,9 +434,9 @@ In application code, memory must be freed by the object that owns it. Examples: -- The easiest way is to place an object on the stack, or make it a member of another class. -- For a large number of small objects, use containers. -- For automatic deallocation of a small number of objects that reside in the heap, use `shared_ptr/unique_ptr`. +- The easiest way is to place an object on the stack, or make it a member of another class. +- For a large number of small objects, use containers. +- For automatic deallocation of a small number of objects that reside in the heap, use `shared_ptr/unique_ptr`. **2.** Resource management. @@ -504,10 +504,10 @@ This is not recommended, but it is allowed. Use the following options: -- Create a function (`done()` or `finalize()`) that will do all the work in advance that might lead to an exception. If that function was called, there should be no exceptions in the destructor later. -- Tasks that are too complex (such as sending messages over the network) can be put in separate method that the class user will have to call before destruction. -- If there is an exception in the destructor, it’s better to log it than to hide it (if the logger is available). -- In simple applications, it is acceptable to rely on `std::terminate` (for cases of `noexcept` by default in C++11) to handle exceptions. +- Create a function (`done()` or `finalize()`) that will do all the work in advance that might lead to an exception. If that function was called, there should be no exceptions in the destructor later. +- Tasks that are too complex (such as sending messages over the network) can be put in separate method that the class user will have to call before destruction. +- If there is an exception in the destructor, it’s better to log it than to hide it (if the logger is available). +- In simple applications, it is acceptable to rely on `std::terminate` (for cases of `noexcept` by default in C++11) to handle exceptions. **6.** Anonymous code blocks. @@ -529,11 +529,11 @@ ready_any.set(); In offline data processing programs: -- Try to get the best possible performance on a single CPU core. You can then parallelize your code if necessary. +- Try to get the best possible performance on a single CPU core. You can then parallelize your code if necessary. In server applications: -- Use the thread pool to process requests. At this point, we haven’t had any tasks that required userspace context switching. +- Use the thread pool to process requests. At this point, we haven’t had any tasks that required userspace context switching. Fork is not used for parallelization. diff --git a/docs/en/development/tests.md b/docs/en/development/tests.md index 98dbe5f8d57..1d3e7d4964e 100644 --- a/docs/en/development/tests.md +++ b/docs/en/development/tests.md @@ -194,11 +194,11 @@ If the system clickhouse-server is already running and you do not want to stop i Build tests allow to check that build is not broken on various alternative configurations and on some foreign systems. These tests are automated as well. Examples: -- cross-compile for Darwin x86_64 (macOS) -- cross-compile for FreeBSD x86_64 -- cross-compile for Linux AArch64 -- build on Ubuntu with libraries from system packages (discouraged) -- build with shared linking of libraries (discouraged) +- cross-compile for Darwin x86_64 (macOS) +- cross-compile for FreeBSD x86_64 +- cross-compile for Linux AArch64 +- build on Ubuntu with libraries from system packages (discouraged) +- build with shared linking of libraries (discouraged) For example, build with system packages is bad practice, because we cannot guarantee what exact version of packages a system will have. But this is really needed by Debian maintainers. For this reason we at least have to support this variant of build. Another example: shared linking is a common source of trouble, but it is needed for some enthusiasts. diff --git a/docs/en/engines/database-engines/atomic.md b/docs/en/engines/database-engines/atomic.md index 3ea5008c80a..0224e1aba21 100644 --- a/docs/en/engines/database-engines/atomic.md +++ b/docs/en/engines/database-engines/atomic.md @@ -59,4 +59,4 @@ For [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table ## See Also -- [system.databases](../../operations/system-tables/databases.md) system table +- [system.databases](../../operations/system-tables/databases.md) system table diff --git a/docs/en/engines/database-engines/index.md b/docs/en/engines/database-engines/index.md index 835383f503f..233cbbb4247 100644 --- a/docs/en/engines/database-engines/index.md +++ b/docs/en/engines/database-engines/index.md @@ -11,18 +11,18 @@ Database engines allow you to work with tables. By default, ClickHouse uses the Here is a complete list of available database engines. Follow the links for more details: -- [Atomic](../../engines/database-engines/atomic.md) +- [Atomic](../../engines/database-engines/atomic.md) -- [MySQL](../../engines/database-engines/mysql.md) +- [MySQL](../../engines/database-engines/mysql.md) -- [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) +- [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) -- [Lazy](../../engines/database-engines/lazy.md) +- [Lazy](../../engines/database-engines/lazy.md) -- [PostgreSQL](../../engines/database-engines/postgresql.md) +- [PostgreSQL](../../engines/database-engines/postgresql.md) -- [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) +- [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) -- [Replicated](../../engines/database-engines/replicated.md) +- [Replicated](../../engines/database-engines/replicated.md) -- [SQLite](../../engines/database-engines/sqlite.md) +- [SQLite](../../engines/database-engines/sqlite.md) diff --git a/docs/en/engines/database-engines/materialized-mysql.md b/docs/en/engines/database-engines/materialized-mysql.md index 45719b1340e..1f1c996d4bf 100644 --- a/docs/en/engines/database-engines/materialized-mysql.md +++ b/docs/en/engines/database-engines/materialized-mysql.md @@ -22,10 +22,10 @@ ENGINE = MaterializedMySQL('host:port', ['database' | database], 'user', 'passwo **Engine Parameters** -- `host:port` — MySQL server endpoint. -- `database` — MySQL database name. -- `user` — MySQL user. -- `password` — User password. +- `host:port` — MySQL server endpoint. +- `database` — MySQL database name. +- `user` — MySQL user. +- `password` — User password. ## Engine Settings diff --git a/docs/en/engines/database-engines/materialized-postgresql.md b/docs/en/engines/database-engines/materialized-postgresql.md index 32e3435afa2..08e9f998626 100644 --- a/docs/en/engines/database-engines/materialized-postgresql.md +++ b/docs/en/engines/database-engines/materialized-postgresql.md @@ -26,10 +26,10 @@ ENGINE = MaterializedPostgreSQL('host:port', 'database', 'user', 'password') [SE **Engine Parameters** -- `host:port` — PostgreSQL server endpoint. -- `database` — PostgreSQL database name. -- `user` — PostgreSQL user. -- `password` — User password. +- `host:port` — PostgreSQL server endpoint. +- `database` — PostgreSQL database name. +- `user` — PostgreSQL user. +- `password` — User password. ## Example of Use {#example-of-use} @@ -120,9 +120,9 @@ Warning: for this case dots in table name are not allowed. 2. Each replicated table must have one of the following [replica identity](https://www.postgresql.org/docs/10/sql-altertable.html#SQL-CREATETABLE-REPLICA-IDENTITY): -- primary key (by default) +- primary key (by default) -- index +- index ``` bash postgres# CREATE TABLE postgres_table (a Integer NOT NULL, b Integer, c Integer NOT NULL, d Integer, e Integer NOT NULL); @@ -171,7 +171,7 @@ Replication of [**TOAST**](https://www.postgresql.org/docs/9.5/storage-toast.htm Possible values: - - Positive integer. + - Positive integer. Default value: `65536`. diff --git a/docs/en/engines/database-engines/mysql.md b/docs/en/engines/database-engines/mysql.md index 7c8c3459ec5..20434ad124e 100644 --- a/docs/en/engines/database-engines/mysql.md +++ b/docs/en/engines/database-engines/mysql.md @@ -12,9 +12,9 @@ The `MySQL` database engine translate queries to the MySQL server so you can per You cannot perform the following queries: -- `RENAME` -- `CREATE TABLE` -- `ALTER` +- `RENAME` +- `CREATE TABLE` +- `ALTER` ## Creating a Database {#creating-a-database} @@ -25,10 +25,10 @@ ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') **Engine Parameters** -- `host:port` — MySQL server address. -- `database` — Remote database name. -- `user` — MySQL user. -- `password` — User password. +- `host:port` — MySQL server address. +- `database` — Remote database name. +- `user` — MySQL user. +- `password` — User password. ## Data Types Support {#data_types-support} diff --git a/docs/en/engines/database-engines/postgresql.md b/docs/en/engines/database-engines/postgresql.md index 95d6a6192e3..294d1202bdd 100644 --- a/docs/en/engines/database-engines/postgresql.md +++ b/docs/en/engines/database-engines/postgresql.md @@ -21,12 +21,12 @@ ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `schema`, `use **Engine Parameters** -- `host:port` — PostgreSQL server address. -- `database` — Remote database name. -- `user` — PostgreSQL user. -- `password` — User password. -- `schema` — PostgreSQL schema. -- `use_table_cache` — Defines if the database table structure is cached or not. Optional. Default value: `0`. +- `host:port` — PostgreSQL server address. +- `database` — Remote database name. +- `user` — PostgreSQL user. +- `password` — User password. +- `schema` — PostgreSQL schema. +- `use_table_cache` — Defines if the database table structure is cached or not. Optional. Default value: `0`. ## Data Types Support {#data_types-support} diff --git a/docs/en/engines/database-engines/replicated.md b/docs/en/engines/database-engines/replicated.md index 43d1ce5ec3f..5672633c4a2 100644 --- a/docs/en/engines/database-engines/replicated.md +++ b/docs/en/engines/database-engines/replicated.md @@ -17,9 +17,9 @@ CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_na **Engine Parameters** -- `zoo_path` — ZooKeeper path. The same ZooKeeper path corresponds to the same database. -- `shard_name` — Shard name. Database replicas are grouped into shards by `shard_name`. -- `replica_name` — Replica name. Replica names must be different for all replicas of the same shard. +- `zoo_path` — ZooKeeper path. The same ZooKeeper path corresponds to the same database. +- `shard_name` — Shard name. Database replicas are grouped into shards by `shard_name`. +- `replica_name` — Replica name. Replica names must be different for all replicas of the same shard. For [ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) tables if no arguments provided, then default arguments are used: `/clickhouse/tables/{uuid}/{shard}` and `{replica}`. These can be changed in the server settings [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) and [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name). Macro `{uuid}` is unfolded to table's uuid, `{shard}` and `{replica}` are unfolded to values from server config, not from database engine arguments. But in the future, it will be possible to use `shard_name` and `replica_name` of Replicated database. diff --git a/docs/en/engines/database-engines/sqlite.md b/docs/en/engines/database-engines/sqlite.md index eef0bb84088..fc2a6525a68 100644 --- a/docs/en/engines/database-engines/sqlite.md +++ b/docs/en/engines/database-engines/sqlite.md @@ -17,7 +17,7 @@ Allows to connect to [SQLite](https://www.sqlite.org/index.html) database and pe **Engine Parameters** -- `db_path` — Path to a file with SQLite database. +- `db_path` — Path to a file with SQLite database. ## Data Types Support {#data_types-support} diff --git a/docs/en/engines/table-engines/index.md b/docs/en/engines/table-engines/index.md index 31563e2e727..d7c582164de 100644 --- a/docs/en/engines/table-engines/index.md +++ b/docs/en/engines/table-engines/index.md @@ -9,12 +9,12 @@ toc_title: Introduction The table engine (type of table) determines: -- How and where data is stored, where to write it to, and where to read it from. -- Which queries are supported, and how. -- Concurrent data access. -- Use of indexes, if present. -- Whether multithread request execution is possible. -- Data replication parameters. +- How and where data is stored, where to write it to, and where to read it from. +- Which queries are supported, and how. +- Concurrent data access. +- Use of indexes, if present. +- Whether multithread request execution is possible. +- Data replication parameters. ## Engine Families {#engine-families} @@ -24,13 +24,13 @@ The most universal and functional table engines for high-load tasks. The propert Engines in the family: -- [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#mergetree) -- [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md#replacingmergetree) -- [SummingMergeTree](../../engines/table-engines/mergetree-family/summingmergetree.md#summingmergetree) -- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md#aggregatingmergetree) -- [CollapsingMergeTree](../../engines/table-engines/mergetree-family/collapsingmergetree.md#table_engine-collapsingmergetree) -- [VersionedCollapsingMergeTree](../../engines/table-engines/mergetree-family/versionedcollapsingmergetree.md#versionedcollapsingmergetree) -- [GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) +- [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#mergetree) +- [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md#replacingmergetree) +- [SummingMergeTree](../../engines/table-engines/mergetree-family/summingmergetree.md#summingmergetree) +- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md#aggregatingmergetree) +- [CollapsingMergeTree](../../engines/table-engines/mergetree-family/collapsingmergetree.md#table_engine-collapsingmergetree) +- [VersionedCollapsingMergeTree](../../engines/table-engines/mergetree-family/versionedcollapsingmergetree.md#versionedcollapsingmergetree) +- [GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) ### Log {#log} @@ -38,9 +38,9 @@ Lightweight [engines](../../engines/table-engines/log-family/index.md) with mini Engines in the family: -- [TinyLog](../../engines/table-engines/log-family/tinylog.md#tinylog) -- [StripeLog](../../engines/table-engines/log-family/stripelog.md#stripelog) -- [Log](../../engines/table-engines/log-family/log.md#log) +- [TinyLog](../../engines/table-engines/log-family/tinylog.md#tinylog) +- [StripeLog](../../engines/table-engines/log-family/stripelog.md#stripelog) +- [Log](../../engines/table-engines/log-family/log.md#log) ### Integration Engines {#integration-engines} @@ -49,34 +49,34 @@ Engines for communicating with other data storage and processing systems. Engines in the family: -- [ODBC](../../engines/table-engines/integrations/odbc.md) -- [JDBC](../../engines/table-engines/integrations/jdbc.md) -- [MySQL](../../engines/table-engines/integrations/mysql.md) -- [MongoDB](../../engines/table-engines/integrations/mongodb.md) -- [HDFS](../../engines/table-engines/integrations/hdfs.md) -- [S3](../../engines/table-engines/integrations/s3.md) -- [Kafka](../../engines/table-engines/integrations/kafka.md) -- [EmbeddedRocksDB](../../engines/table-engines/integrations/embedded-rocksdb.md) -- [RabbitMQ](../../engines/table-engines/integrations/rabbitmq.md) -- [PostgreSQL](../../engines/table-engines/integrations/postgresql.md) +- [ODBC](../../engines/table-engines/integrations/odbc.md) +- [JDBC](../../engines/table-engines/integrations/jdbc.md) +- [MySQL](../../engines/table-engines/integrations/mysql.md) +- [MongoDB](../../engines/table-engines/integrations/mongodb.md) +- [HDFS](../../engines/table-engines/integrations/hdfs.md) +- [S3](../../engines/table-engines/integrations/s3.md) +- [Kafka](../../engines/table-engines/integrations/kafka.md) +- [EmbeddedRocksDB](../../engines/table-engines/integrations/embedded-rocksdb.md) +- [RabbitMQ](../../engines/table-engines/integrations/rabbitmq.md) +- [PostgreSQL](../../engines/table-engines/integrations/postgresql.md) ### Special Engines {#special-engines} Engines in the family: -- [Distributed](../../engines/table-engines/special/distributed.md#distributed) -- [MaterializedView](../../engines/table-engines/special/materializedview.md#materializedview) -- [Dictionary](../../engines/table-engines/special/dictionary.md#dictionary) -- [Merge](../../engines/table-engines/special/merge.md#merge) -- [File](../../engines/table-engines/special/file.md#file) -- [Null](../../engines/table-engines/special/null.md#null) -- [Set](../../engines/table-engines/special/set.md#set) -- [Join](../../engines/table-engines/special/join.md#join) -- [URL](../../engines/table-engines/special/url.md#table_engines-url) -- [View](../../engines/table-engines/special/view.md#table_engines-view) -- [Memory](../../engines/table-engines/special/memory.md#memory) -- [Buffer](../../engines/table-engines/special/buffer.md#buffer) -- [KeeperMap](../../engines/table-engines/special/keepermap.md) +- [Distributed](../../engines/table-engines/special/distributed.md#distributed) +- [MaterializedView](../../engines/table-engines/special/materializedview.md#materializedview) +- [Dictionary](../../engines/table-engines/special/dictionary.md#dictionary) +- [Merge](../../engines/table-engines/special/merge.md#merge) +- [File](../../engines/table-engines/special/file.md#file) +- [Null](../../engines/table-engines/special/null.md#null) +- [Set](../../engines/table-engines/special/set.md#set) +- [Join](../../engines/table-engines/special/join.md#join) +- [URL](../../engines/table-engines/special/url.md#table_engines-url) +- [View](../../engines/table-engines/special/view.md#table_engines-view) +- [Memory](../../engines/table-engines/special/memory.md#memory) +- [Buffer](../../engines/table-engines/special/buffer.md#buffer) +- [KeeperMap](../../engines/table-engines/special/keepermap.md) ## Virtual Columns {#table_engines-virtual_columns} diff --git a/docs/en/engines/table-engines/integrations/ExternalDistributed.md b/docs/en/engines/table-engines/integrations/ExternalDistributed.md index 4e0f66ebd4f..3fb3fe88b55 100644 --- a/docs/en/engines/table-engines/integrations/ExternalDistributed.md +++ b/docs/en/engines/table-engines/integrations/ExternalDistributed.md @@ -22,17 +22,17 @@ See a detailed description of the [CREATE TABLE](../../../sql-reference/statemen The table structure can differ from the original table structure: -- Column names should be the same as in the original table, but you can use just some of these columns and in any order. -- Column types may differ from those in the original table. ClickHouse tries to [cast](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) values to the ClickHouse data types. +- Column names should be the same as in the original table, but you can use just some of these columns and in any order. +- Column types may differ from those in the original table. ClickHouse tries to [cast](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) values to the ClickHouse data types. **Engine Parameters** -- `engine` — The table engine `MySQL` or `PostgreSQL`. -- `host:port` — MySQL or PostgreSQL server address. -- `database` — Remote database name. -- `table` — Remote table name. -- `user` — User name. -- `password` — User password. +- `engine` — The table engine `MySQL` or `PostgreSQL`. +- `host:port` — MySQL or PostgreSQL server address. +- `database` — Remote database name. +- `table` — Remote table name. +- `user` — User name. +- `password` — User password. ## Implementation Details {#implementation-details} @@ -48,6 +48,6 @@ You can specify any number of shards and any number of replicas for each shard. **See Also** -- [MySQL table engine](../../../engines/table-engines/integrations/mysql.md) -- [PostgreSQL table engine](../../../engines/table-engines/integrations/postgresql.md) -- [Distributed table engine](../../../engines/table-engines/special/distributed.md) +- [MySQL table engine](../../../engines/table-engines/integrations/mysql.md) +- [PostgreSQL table engine](../../../engines/table-engines/integrations/postgresql.md) +- [Distributed table engine](../../../engines/table-engines/special/distributed.md) diff --git a/docs/en/engines/table-engines/integrations/deltalake.md b/docs/en/engines/table-engines/integrations/deltalake.md index 99183ac7308..bf4a59b4a5d 100644 --- a/docs/en/engines/table-engines/integrations/deltalake.md +++ b/docs/en/engines/table-engines/integrations/deltalake.md @@ -18,8 +18,8 @@ CREATE TABLE deltalake **Engine parameters** -- `url` — Bucket url with path to the existing Delta Lake table. -- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. +- `url` — Bucket url with path to the existing Delta Lake table. +- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. Engine parameters can be specified using [Named Collections](../../../operations/named-collections.md) diff --git a/docs/en/engines/table-engines/integrations/hdfs.md b/docs/en/engines/table-engines/integrations/hdfs.md index 1497ea47eca..88316d1c94a 100644 --- a/docs/en/engines/table-engines/integrations/hdfs.md +++ b/docs/en/engines/table-engines/integrations/hdfs.md @@ -58,11 +58,11 @@ SELECT * FROM hdfs_engine_table LIMIT 2 ## Implementation Details {#implementation-details} -- Reads and writes can be parallel. -- Not supported: - - `ALTER` and `SELECT...SAMPLE` operations. - - Indexes. - - [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is possible, but not recommended. +- Reads and writes can be parallel. +- Not supported: + - `ALTER` and `SELECT...SAMPLE` operations. + - Indexes. + - [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is possible, but not recommended. :::note Zero-copy replication is not ready for production Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use. @@ -72,10 +72,10 @@ SELECT * FROM hdfs_engine_table LIMIT 2 Multiple path components can have globs. For being processed file should exists and matches to the whole path pattern. Listing of files determines during `SELECT` (not at `CREATE` moment). -- `*` — Substitutes any number of any characters except `/` including empty string. -- `?` — Substitutes any single character. -- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. -- `{N..M}` — Substitutes any number in range from N to M including both borders. +- `*` — Substitutes any number of any characters except `/` including empty string. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. Constructions with `{}` are similar to the [remote](../../../sql-reference/table-functions/remote.md) table function. @@ -145,7 +145,7 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us | **parameter** | **default value** | -| - | - | +| - | - | | rpc\_client\_connect\_tcpnodelay | true | | dfs\_client\_read\_shortcircuit | true | | output\_replace-datanode-on-failure | true | @@ -195,7 +195,7 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us #### ClickHouse extras {#clickhouse-extras} | **parameter** | **default value** | -| - | - | +| - | - | |hadoop\_kerberos\_keytab | "" | |hadoop\_kerberos\_principal | "" | |libhdfs3\_conf | "" | @@ -230,9 +230,9 @@ libhdfs3 support HDFS namenode HA. ## Virtual Columns {#virtual-columns} -- `_path` — Path to the file. -- `_file` — Name of the file. +- `_path` — Path to the file. +- `_file` — Name of the file. **See Also** -- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) +- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/en/engines/table-engines/integrations/hive.md b/docs/en/engines/table-engines/integrations/hive.md index fd16e717c89..adcb73605bb 100644 --- a/docs/en/engines/table-engines/integrations/hive.md +++ b/docs/en/engines/table-engines/integrations/hive.md @@ -28,17 +28,17 @@ PARTITION BY expr See a detailed description of the [CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query) query. The table structure can differ from the original Hive table structure: -- Column names should be the same as in the original Hive table, but you can use just some of these columns and in any order, also you can use some alias columns calculated from other columns. -- Column types should be the same from those in the original Hive table. -- Partition by expression should be consistent with the original Hive table, and columns in partition by expression should be in the table structure. +- Column names should be the same as in the original Hive table, but you can use just some of these columns and in any order, also you can use some alias columns calculated from other columns. +- Column types should be the same from those in the original Hive table. +- Partition by expression should be consistent with the original Hive table, and columns in partition by expression should be in the table structure. **Engine Parameters** -- `thrift://host:port` — Hive Metastore address +- `thrift://host:port` — Hive Metastore address -- `database` — Remote database name. +- `database` — Remote database name. -- `table` — Remote table name. +- `table` — Remote table name. ## Usage Example {#usage-example} diff --git a/docs/en/engines/table-engines/integrations/hudi.md b/docs/en/engines/table-engines/integrations/hudi.md index a14134ecdfa..970ff4adc6c 100644 --- a/docs/en/engines/table-engines/integrations/hudi.md +++ b/docs/en/engines/table-engines/integrations/hudi.md @@ -18,8 +18,8 @@ CREATE TABLE hudi_table **Engine parameters** -- `url` — Bucket url with the path to an existing Hudi table. -- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. +- `url` — Bucket url with the path to an existing Hudi table. +- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. Engine parameters can be specified using [Named Collections](../../../operations/named-collections.md) diff --git a/docs/en/engines/table-engines/integrations/iceberg.md b/docs/en/engines/table-engines/integrations/iceberg.md index 4322fc6b773..c7fdfc5ec05 100644 --- a/docs/en/engines/table-engines/integrations/iceberg.md +++ b/docs/en/engines/table-engines/integrations/iceberg.md @@ -18,8 +18,8 @@ CREATE TABLE iceberg_table **Engine parameters** -- `url` — url with the path to an existing Iceberg table. -- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. +- `url` — url with the path to an existing Iceberg table. +- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. Engine parameters can be specified using [Named Collections](../../../operations/named-collections.md) diff --git a/docs/en/engines/table-engines/integrations/index.md b/docs/en/engines/table-engines/integrations/index.md index 7a8b537aea8..b321a644d32 100644 --- a/docs/en/engines/table-engines/integrations/index.md +++ b/docs/en/engines/table-engines/integrations/index.md @@ -10,20 +10,20 @@ ClickHouse provides various means for integrating with external systems, includi List of supported integrations: -- [ODBC](../../../engines/table-engines/integrations/odbc.md) -- [JDBC](../../../engines/table-engines/integrations/jdbc.md) -- [MySQL](../../../engines/table-engines/integrations/mysql.md) -- [MongoDB](../../../engines/table-engines/integrations/mongodb.md) -- [HDFS](../../../engines/table-engines/integrations/hdfs.md) -- [S3](../../../engines/table-engines/integrations/s3.md) -- [Kafka](../../../engines/table-engines/integrations/kafka.md) -- [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md) -- [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) -- [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md) -- [SQLite](../../../engines/table-engines/integrations/sqlite.md) -- [Hive](../../../engines/table-engines/integrations/hive.md) -- [ExternalDistributed](../../../engines/table-engines/integrations/ExternalDistributed.md) -- [MaterializedPostgreSQL](../../../engines/table-engines/integrations/materialized-postgresql.md) -- [NATS](../../../engines/table-engines/integrations/nats.md) -- [DeltaLake](../../../engines/table-engines/integrations/deltalake.md) -- [Hudi](../../../engines/table-engines/integrations/hudi.md) +- [ODBC](../../../engines/table-engines/integrations/odbc.md) +- [JDBC](../../../engines/table-engines/integrations/jdbc.md) +- [MySQL](../../../engines/table-engines/integrations/mysql.md) +- [MongoDB](../../../engines/table-engines/integrations/mongodb.md) +- [HDFS](../../../engines/table-engines/integrations/hdfs.md) +- [S3](../../../engines/table-engines/integrations/s3.md) +- [Kafka](../../../engines/table-engines/integrations/kafka.md) +- [EmbeddedRocksDB](../../../engines/table-engines/integrations/embedded-rocksdb.md) +- [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) +- [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md) +- [SQLite](../../../engines/table-engines/integrations/sqlite.md) +- [Hive](../../../engines/table-engines/integrations/hive.md) +- [ExternalDistributed](../../../engines/table-engines/integrations/ExternalDistributed.md) +- [MaterializedPostgreSQL](../../../engines/table-engines/integrations/materialized-postgresql.md) +- [NATS](../../../engines/table-engines/integrations/nats.md) +- [DeltaLake](../../../engines/table-engines/integrations/deltalake.md) +- [Hudi](../../../engines/table-engines/integrations/hudi.md) diff --git a/docs/en/engines/table-engines/integrations/jdbc.md b/docs/en/engines/table-engines/integrations/jdbc.md index 6853b5d1df7..99f851dcf3e 100644 --- a/docs/en/engines/table-engines/integrations/jdbc.md +++ b/docs/en/engines/table-engines/integrations/jdbc.md @@ -25,14 +25,14 @@ ENGINE = JDBC(datasource_uri, external_database, external_table) **Engine Parameters** -- `datasource_uri` — URI or name of an external DBMS. +- `datasource_uri` — URI or name of an external DBMS. URI Format: `jdbc:://:/?user=&password=`. Example for MySQL: `jdbc:mysql://localhost:3306/?user=root&password=root`. -- `external_database` — Database in an external DBMS. +- `external_database` — Database in an external DBMS. -- `external_table` — Name of the table in `external_database` or a select query like `select * from table1 where column1=1`. +- `external_table` — Name of the table in `external_database` or a select query like `select * from table1 where column1=1`. ## Usage Example {#usage-example} @@ -91,4 +91,4 @@ FROM system.numbers ## See Also {#see-also} -- [JDBC table function](../../../sql-reference/table-functions/jdbc.md). +- [JDBC table function](../../../sql-reference/table-functions/jdbc.md). diff --git a/docs/en/engines/table-engines/integrations/kafka.md b/docs/en/engines/table-engines/integrations/kafka.md index 0b1717978b7..ab69e4e90ce 100644 --- a/docs/en/engines/table-engines/integrations/kafka.md +++ b/docs/en/engines/table-engines/integrations/kafka.md @@ -10,9 +10,9 @@ This engine works with [Apache Kafka](http://kafka.apache.org/). Kafka lets you: -- Publish or subscribe to data flows. -- Organize fault-tolerant storage. -- Process streams as they become available. +- Publish or subscribe to data flows. +- Organize fault-tolerant storage. +- Process streams as they become available. ## Creating a Table {#table_engine-kafka-creating-a-table} @@ -46,27 +46,27 @@ SETTINGS Required parameters: -- `kafka_broker_list` — A comma-separated list of brokers (for example, `localhost:9092`). -- `kafka_topic_list` — A list of Kafka topics. -- `kafka_group_name` — A group of Kafka consumers. Reading margins are tracked for each group separately. If you do not want messages to be duplicated in the cluster, use the same group name everywhere. -- `kafka_format` — Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. +- `kafka_broker_list` — A comma-separated list of brokers (for example, `localhost:9092`). +- `kafka_topic_list` — A list of Kafka topics. +- `kafka_group_name` — A group of Kafka consumers. Reading margins are tracked for each group separately. If you do not want messages to be duplicated in the cluster, use the same group name everywhere. +- `kafka_format` — Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. Optional parameters: -- `kafka_row_delimiter` — Delimiter character, which ends the message. **This setting is deprecated and is no longer used, not left for compatibility reasons.** -- `kafka_schema` — Parameter that must be used if the format requires a schema definition. For example, [Cap’n Proto](https://capnproto.org/) requires the path to the schema file and the name of the root `schema.capnp:Message` object. -- `kafka_num_consumers` — The number of consumers per table. Specify more consumers if the throughput of one consumer is insufficient. The total number of consumers should not exceed the number of partitions in the topic, since only one consumer can be assigned per partition, and must not be greater than the number of physical cores on the server where ClickHouse is deployed. Default: `1`. -- `kafka_max_block_size` — The maximum batch size (in messages) for poll. Default: [max_insert_block_size](../../../operations/settings/settings.md#setting-max_insert_block_size). -- `kafka_skip_broken_messages` — Kafka message parser tolerance to schema-incompatible messages per block. If `kafka_skip_broken_messages = N` then the engine skips *N* Kafka messages that cannot be parsed (a message equals a row of data). Default: `0`. -- `kafka_commit_every_batch` — Commit every consumed and handled batch instead of a single commit after writing a whole block. Default: `0`. -- `kafka_client_id` — Client identifier. Empty by default. -- `kafka_poll_timeout_ms` — Timeout for single poll from Kafka. Default: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms). -- `kafka_poll_max_batch_size` — Maximum amount of messages to be polled in a single Kafka poll. Default: [max_block_size](../../../operations/settings/settings.md#setting-max_block_size). -- `kafka_flush_interval_ms` — Timeout for flushing data from Kafka. Default: [stream_flush_interval_ms](../../../operations/settings/settings.md#stream-flush-interval-ms). -- `kafka_thread_per_consumer` — Provide independent thread for each consumer. When enabled, every consumer flush the data independently, in parallel (otherwise — rows from several consumers squashed to form one block). Default: `0`. -- `kafka_handle_error_mode` — How to handle errors for Kafka engine. Possible values: default, stream. -- `kafka_commit_on_select` — Commit messages when select query is made. Default: `false`. -- `kafka_max_rows_per_message` — The maximum number of rows written in one kafka message for row-based formats. Default : `1`. +- `kafka_row_delimiter` — Delimiter character, which ends the message. **This setting is deprecated and is no longer used, not left for compatibility reasons.** +- `kafka_schema` — Parameter that must be used if the format requires a schema definition. For example, [Cap’n Proto](https://capnproto.org/) requires the path to the schema file and the name of the root `schema.capnp:Message` object. +- `kafka_num_consumers` — The number of consumers per table. Specify more consumers if the throughput of one consumer is insufficient. The total number of consumers should not exceed the number of partitions in the topic, since only one consumer can be assigned per partition, and must not be greater than the number of physical cores on the server where ClickHouse is deployed. Default: `1`. +- `kafka_max_block_size` — The maximum batch size (in messages) for poll. Default: [max_insert_block_size](../../../operations/settings/settings.md#setting-max_insert_block_size). +- `kafka_skip_broken_messages` — Kafka message parser tolerance to schema-incompatible messages per block. If `kafka_skip_broken_messages = N` then the engine skips *N* Kafka messages that cannot be parsed (a message equals a row of data). Default: `0`. +- `kafka_commit_every_batch` — Commit every consumed and handled batch instead of a single commit after writing a whole block. Default: `0`. +- `kafka_client_id` — Client identifier. Empty by default. +- `kafka_poll_timeout_ms` — Timeout for single poll from Kafka. Default: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms). +- `kafka_poll_max_batch_size` — Maximum amount of messages to be polled in a single Kafka poll. Default: [max_block_size](../../../operations/settings/settings.md#setting-max_block_size). +- `kafka_flush_interval_ms` — Timeout for flushing data from Kafka. Default: [stream_flush_interval_ms](../../../operations/settings/settings.md#stream-flush-interval-ms). +- `kafka_thread_per_consumer` — Provide independent thread for each consumer. When enabled, every consumer flush the data independently, in parallel (otherwise — rows from several consumers squashed to form one block). Default: `0`. +- `kafka_handle_error_mode` — How to handle errors for Kafka engine. Possible values: default, stream. +- `kafka_commit_on_select` — Commit messages when select query is made. Default: `false`. +- `kafka_max_rows_per_message` — The maximum number of rows written in one kafka message for row-based formats. Default : `1`. Examples: @@ -239,14 +239,14 @@ Example: ## Virtual Columns {#virtual-columns} -- `_topic` — Kafka topic. -- `_key` — Key of the message. -- `_offset` — Offset of the message. -- `_timestamp` — Timestamp of the message. -- `_timestamp_ms` — Timestamp in milliseconds of the message. -- `_partition` — Partition of Kafka topic. -- `_headers.name` — Array of message's headers keys. -- `_headers.value` — Array of message's headers values. +- `_topic` — Kafka topic. +- `_key` — Key of the message. +- `_offset` — Offset of the message. +- `_timestamp` — Timestamp of the message. +- `_timestamp_ms` — Timestamp in milliseconds of the message. +- `_partition` — Partition of Kafka topic. +- `_headers.name` — Array of message's headers keys. +- `_headers.value` — Array of message's headers values. ## Data formats support {#data-formats-support} @@ -258,5 +258,5 @@ The number of rows in one Kafka message depends on whether the format is row-bas **See Also** -- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) -- [background_message_broker_schedule_pool_size](../../../operations/server-configuration-parameters/settings.md#background_message_broker_schedule_pool_size) +- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) +- [background_message_broker_schedule_pool_size](../../../operations/server-configuration-parameters/settings.md#background_message_broker_schedule_pool_size) diff --git a/docs/en/engines/table-engines/integrations/materialized-postgresql.md b/docs/en/engines/table-engines/integrations/materialized-postgresql.md index b456b3c7de9..e112ca3bbb1 100644 --- a/docs/en/engines/table-engines/integrations/materialized-postgresql.md +++ b/docs/en/engines/table-engines/integrations/materialized-postgresql.md @@ -19,11 +19,11 @@ PRIMARY KEY key; **Engine Parameters** -- `host:port` — PostgreSQL server address. -- `database` — Remote database name. -- `table` — Remote table name. -- `user` — PostgreSQL user. -- `password` — User password. +- `host:port` — PostgreSQL server address. +- `database` — Remote database name. +- `table` — Remote table name. +- `user` — PostgreSQL user. +- `password` — User password. ## Requirements {#requirements} @@ -37,9 +37,9 @@ PRIMARY KEY key; ## Virtual columns {#virtual-columns} -- `_version` — Transaction counter. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `_version` — Transaction counter. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `_sign` — Deletion mark. Type: [Int8](../../../sql-reference/data-types/int-uint.md). Possible values: +- `_sign` — Deletion mark. Type: [Int8](../../../sql-reference/data-types/int-uint.md). Possible values: - `1` — Row is not deleted, - `-1` — Row is deleted. diff --git a/docs/en/engines/table-engines/integrations/mongodb.md b/docs/en/engines/table-engines/integrations/mongodb.md index be45ce88c67..a647ac9993f 100644 --- a/docs/en/engines/table-engines/integrations/mongodb.md +++ b/docs/en/engines/table-engines/integrations/mongodb.md @@ -21,17 +21,17 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name **Engine Parameters** -- `host:port` — MongoDB server address. +- `host:port` — MongoDB server address. -- `database` — Remote database name. +- `database` — Remote database name. -- `collection` — Remote collection name. +- `collection` — Remote collection name. -- `user` — MongoDB user. +- `user` — MongoDB user. -- `password` — User password. +- `password` — User password. -- `options` — MongoDB connection string options (optional parameter). +- `options` — MongoDB connection string options (optional parameter). ## Usage Example {#usage-example} diff --git a/docs/en/engines/table-engines/integrations/mysql.md b/docs/en/engines/table-engines/integrations/mysql.md index 4b285ee80a5..6ff6221c877 100644 --- a/docs/en/engines/table-engines/integrations/mysql.md +++ b/docs/en/engines/table-engines/integrations/mysql.md @@ -31,25 +31,25 @@ See a detailed description of the [CREATE TABLE](../../../sql-reference/statemen The table structure can differ from the original MySQL table structure: -- Column names should be the same as in the original MySQL table, but you can use just some of these columns and in any order. -- Column types may differ from those in the original MySQL table. ClickHouse tries to [cast](../../../engines/database-engines/mysql.md#data_types-support) values to the ClickHouse data types. -- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. +- Column names should be the same as in the original MySQL table, but you can use just some of these columns and in any order. +- Column types may differ from those in the original MySQL table. ClickHouse tries to [cast](../../../engines/database-engines/mysql.md#data_types-support) values to the ClickHouse data types. +- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. **Engine Parameters** -- `host:port` — MySQL server address. +- `host:port` — MySQL server address. -- `database` — Remote database name. +- `database` — Remote database name. -- `table` — Remote table name. +- `table` — Remote table name. -- `user` — MySQL user. +- `user` — MySQL user. -- `password` — User password. +- `password` — User password. -- `replace_query` — Flag that converts `INSERT INTO` queries to `REPLACE INTO`. If `replace_query=1`, the query is substituted. +- `replace_query` — Flag that converts `INSERT INTO` queries to `REPLACE INTO`. If `replace_query=1`, the query is substituted. -- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression that is added to the `INSERT` query. +- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression that is added to the `INSERT` query. Example: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, where `on_duplicate_clause` is `UPDATE c2 = c2 + 1`. See the [MySQL documentation](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html) to find which `on_duplicate_clause` you can use with the `ON DUPLICATE KEY` clause. @@ -121,8 +121,8 @@ Allows to automatically close the connection after query execution, i.e. disable Possible values: -- 1 — Auto-close connection is allowed, so the connection reuse is disabled -- 0 — Auto-close connection is not allowed, so the connection reuse is enabled +- 1 — Auto-close connection is allowed, so the connection reuse is disabled +- 0 — Auto-close connection is not allowed, so the connection reuse is enabled Default value: `1`. @@ -132,8 +132,8 @@ Sets the number of retries for pool with failover. Possible values: -- Positive integer. -- 0 — There are no retries for pool with failover. +- Positive integer. +- 0 — There are no retries for pool with failover. Default value: `3`. @@ -143,7 +143,7 @@ Size of connection pool (if all connections are in use, the query will wait unti Possible values: -- Positive integer. +- Positive integer. Default value: `16`. @@ -153,7 +153,7 @@ Timeout (in seconds) for waiting for free connection (in case of there is alread Possible values: -- Positive integer. +- Positive integer. Default value: `5`. @@ -163,7 +163,7 @@ Connect timeout (in seconds). Possible values: -- Positive integer. +- Positive integer. Default value: `10`. @@ -173,11 +173,11 @@ Read/write timeout (in seconds). Possible values: -- Positive integer. +- Positive integer. Default value: `300`. ## See Also {#see-also} -- [The mysql table function](../../../sql-reference/table-functions/mysql.md) -- [Using MySQL as a dictionary source](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) +- [The mysql table function](../../../sql-reference/table-functions/mysql.md) +- [Using MySQL as a dictionary source](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) diff --git a/docs/en/engines/table-engines/integrations/nats.md b/docs/en/engines/table-engines/integrations/nats.md index f2856c89238..7f09c516d6f 100644 --- a/docs/en/engines/table-engines/integrations/nats.md +++ b/docs/en/engines/table-engines/integrations/nats.md @@ -45,9 +45,9 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] Required parameters: -- `nats_url` – host:port (for example, `localhost:5672`).. -- `nats_subjects` – List of subject for NATS table to subscribe/publsh to. Supports wildcard subjects like `foo.*.bar` or `baz.>` -- `nats_format` – Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. +- `nats_url` – host:port (for example, `localhost:5672`).. +- `nats_subjects` – List of subject for NATS table to subscribe/publsh to. Supports wildcard subjects like `foo.*.bar` or `baz.>` +- `nats_format` – Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. Optional parameters: diff --git a/docs/en/engines/table-engines/integrations/odbc.md b/docs/en/engines/table-engines/integrations/odbc.md index 8aac9dc3af0..37e08dc1420 100644 --- a/docs/en/engines/table-engines/integrations/odbc.md +++ b/docs/en/engines/table-engines/integrations/odbc.md @@ -28,15 +28,15 @@ See a detailed description of the [CREATE TABLE](../../../sql-reference/statemen The table structure can differ from the source table structure: -- Column names should be the same as in the source table, but you can use just some of these columns and in any order. -- Column types may differ from those in the source table. ClickHouse tries to [cast](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) values to the ClickHouse data types. -- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. +- Column names should be the same as in the source table, but you can use just some of these columns and in any order. +- Column types may differ from those in the source table. ClickHouse tries to [cast](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) values to the ClickHouse data types. +- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. **Engine Parameters** -- `connection_settings` — Name of the section with connection settings in the `odbc.ini` file. -- `external_database` — Name of a database in an external DBMS. -- `external_table` — Name of a table in the `external_database`. +- `connection_settings` — Name of the section with connection settings in the `odbc.ini` file. +- `external_database` — Name of a database in an external DBMS. +- `external_table` — Name of a table in the `external_database`. ## Usage Example {#usage-example} @@ -126,5 +126,5 @@ SELECT * FROM odbc_t ## See Also {#see-also} -- [ODBC dictionaries](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) -- [ODBC table function](../../../sql-reference/table-functions/odbc.md) +- [ODBC dictionaries](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) +- [ODBC table function](../../../sql-reference/table-functions/odbc.md) diff --git a/docs/en/engines/table-engines/integrations/postgresql.md b/docs/en/engines/table-engines/integrations/postgresql.md index d8dc6d55cba..fbd6d944363 100644 --- a/docs/en/engines/table-engines/integrations/postgresql.md +++ b/docs/en/engines/table-engines/integrations/postgresql.md @@ -23,19 +23,19 @@ See a detailed description of the [CREATE TABLE](../../../sql-reference/statemen The table structure can differ from the original PostgreSQL table structure: -- Column names should be the same as in the original PostgreSQL table, but you can use just some of these columns and in any order. -- Column types may differ from those in the original PostgreSQL table. ClickHouse tries to [cast](../../../engines/database-engines/postgresql.md#data_types-support) values to the ClickHouse data types. -- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. +- Column names should be the same as in the original PostgreSQL table, but you can use just some of these columns and in any order. +- Column types may differ from those in the original PostgreSQL table. ClickHouse tries to [cast](../../../engines/database-engines/postgresql.md#data_types-support) values to the ClickHouse data types. +- The [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) setting defines how to handle Nullable columns. Default value: 1. If 0, the table function does not make Nullable columns and inserts default values instead of nulls. This is also applicable for NULL values inside arrays. **Engine Parameters** -- `host:port` — PostgreSQL server address. -- `database` — Remote database name. -- `table` — Remote table name. -- `user` — PostgreSQL user. -- `password` — User password. -- `schema` — Non-default table schema. Optional. -- `on conflict ...` — example: `ON CONFLICT DO NOTHING`. Optional. Note: adding this option will make insertion less efficient. +- `host:port` — PostgreSQL server address. +- `database` — Remote database name. +- `table` — Remote table name. +- `user` — PostgreSQL user. +- `password` — User password. +- `schema` — Non-default table schema. Optional. +- `on conflict ...` — example: `ON CONFLICT DO NOTHING`. Optional. Note: adding this option will make insertion less efficient. or via config (since version 21.11): @@ -204,8 +204,8 @@ CREATE TABLE pg_table_schema_with_dots (a UInt32) **See Also** -- [The `postgresql` table function](../../../sql-reference/table-functions/postgresql.md) -- [Using PostgreSQL as a dictionary source](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) +- [The `postgresql` table function](../../../sql-reference/table-functions/postgresql.md) +- [Using PostgreSQL as a dictionary source](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) ## Related content diff --git a/docs/en/engines/table-engines/integrations/rabbitmq.md b/docs/en/engines/table-engines/integrations/rabbitmq.md index eec8691a165..08062278904 100644 --- a/docs/en/engines/table-engines/integrations/rabbitmq.md +++ b/docs/en/engines/table-engines/integrations/rabbitmq.md @@ -10,8 +10,8 @@ This engine allows integrating ClickHouse with [RabbitMQ](https://www.rabbitmq.c `RabbitMQ` lets you: -- Publish or subscribe to data flows. -- Process streams as they become available. +- Publish or subscribe to data flows. +- Process streams as they become available. ## Creating a Table {#table_engine-rabbitmq-creating-a-table} @@ -51,9 +51,9 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] Required parameters: -- `rabbitmq_host_port` – host:port (for example, `localhost:5672`). -- `rabbitmq_exchange_name` – RabbitMQ exchange name. -- `rabbitmq_format` – Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. +- `rabbitmq_host_port` – host:port (for example, `localhost:5672`). +- `rabbitmq_exchange_name` – RabbitMQ exchange name. +- `rabbitmq_format` – Message format. Uses the same notation as the SQL `FORMAT` function, such as `JSONEachRow`. For more information, see the [Formats](../../../interfaces/formats.md) section. Optional parameters: @@ -138,24 +138,24 @@ There can be no more than one exchange per table. One exchange can be shared bet Exchange type options: -- `direct` - Routing is based on the exact matching of keys. Example table key list: `key1,key2,key3,key4,key5`, message key can equal any of them. -- `fanout` - Routing to all tables (where exchange name is the same) regardless of the keys. -- `topic` - Routing is based on patterns with dot-separated keys. Examples: `*.logs`, `records.*.*.2020`, `*.2018,*.2019,*.2020`. -- `headers` - Routing is based on `key=value` matches with a setting `x-match=all` or `x-match=any`. Example table key list: `x-match=all,format=logs,type=report,year=2020`. -- `consistent_hash` - Data is evenly distributed between all bound tables (where the exchange name is the same). Note that this exchange type must be enabled with RabbitMQ plugin: `rabbitmq-plugins enable rabbitmq_consistent_hash_exchange`. +- `direct` - Routing is based on the exact matching of keys. Example table key list: `key1,key2,key3,key4,key5`, message key can equal any of them. +- `fanout` - Routing to all tables (where exchange name is the same) regardless of the keys. +- `topic` - Routing is based on patterns with dot-separated keys. Examples: `*.logs`, `records.*.*.2020`, `*.2018,*.2019,*.2020`. +- `headers` - Routing is based on `key=value` matches with a setting `x-match=all` or `x-match=any`. Example table key list: `x-match=all,format=logs,type=report,year=2020`. +- `consistent_hash` - Data is evenly distributed between all bound tables (where the exchange name is the same). Note that this exchange type must be enabled with RabbitMQ plugin: `rabbitmq-plugins enable rabbitmq_consistent_hash_exchange`. Setting `rabbitmq_queue_base` may be used for the following cases: -- to let different tables share queues, so that multiple consumers could be registered for the same queues, which makes a better performance. If using `rabbitmq_num_consumers` and/or `rabbitmq_num_queues` settings, the exact match of queues is achieved in case these parameters are the same. -- to be able to restore reading from certain durable queues when not all messages were successfully consumed. To resume consumption from one specific queue - set its name in `rabbitmq_queue_base` setting and do not specify `rabbitmq_num_consumers` and `rabbitmq_num_queues` (defaults to 1). To resume consumption from all queues, which were declared for a specific table - just specify the same settings: `rabbitmq_queue_base`, `rabbitmq_num_consumers`, `rabbitmq_num_queues`. By default, queue names will be unique to tables. -- to reuse queues as they are declared durable and not auto-deleted. (Can be deleted via any of RabbitMQ CLI tools.) +- to let different tables share queues, so that multiple consumers could be registered for the same queues, which makes a better performance. If using `rabbitmq_num_consumers` and/or `rabbitmq_num_queues` settings, the exact match of queues is achieved in case these parameters are the same. +- to be able to restore reading from certain durable queues when not all messages were successfully consumed. To resume consumption from one specific queue - set its name in `rabbitmq_queue_base` setting and do not specify `rabbitmq_num_consumers` and `rabbitmq_num_queues` (defaults to 1). To resume consumption from all queues, which were declared for a specific table - just specify the same settings: `rabbitmq_queue_base`, `rabbitmq_num_consumers`, `rabbitmq_num_queues`. By default, queue names will be unique to tables. +- to reuse queues as they are declared durable and not auto-deleted. (Can be deleted via any of RabbitMQ CLI tools.) To improve performance, received messages are grouped into blocks the size of [max_insert_block_size](../../../operations/server-configuration-parameters/settings.md#settings-max_insert_block_size). If the block wasn’t formed within [stream_flush_interval_ms](../../../operations/server-configuration-parameters/settings.md) milliseconds, the data will be flushed to the table regardless of the completeness of the block. If `rabbitmq_num_consumers` and/or `rabbitmq_num_queues` settings are specified along with `rabbitmq_exchange_type`, then: -- `rabbitmq-consistent-hash-exchange` plugin must be enabled. -- `message_id` property of the published messages must be specified (unique for each message/batch). +- `rabbitmq-consistent-hash-exchange` plugin must be enabled. +- `message_id` property of the published messages must be specified (unique for each message/batch). For insert query there is message metadata, which is added for each published message: `messageID` and `republished` flag (true, if published more than once) - can be accessed via message headers. diff --git a/docs/en/engines/table-engines/integrations/s3.md b/docs/en/engines/table-engines/integrations/s3.md index 6cbb5af82f6..e149dec9146 100644 --- a/docs/en/engines/table-engines/integrations/s3.md +++ b/docs/en/engines/table-engines/integrations/s3.md @@ -19,11 +19,11 @@ CREATE TABLE s3_engine_table (name String, value UInt32) **Engine parameters** -- `path` — Bucket url with path to file. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings. For more information see [below](#wildcards-in-path). -- `NOSIGN` - If this keyword is provided in place of credentials, all the requests will not be signed. -- `format` — The [format](../../../interfaces/formats.md#formats) of the file. -- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. For more information see [Using S3 for Data Storage](../mergetree-family/mergetree.md#table_engine-mergetree-s3). -- `compression` — Compression type. Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Parameter is optional. By default, it will autodetect compression by file extension. +- `path` — Bucket url with path to file. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings. For more information see [below](#wildcards-in-path). +- `NOSIGN` - If this keyword is provided in place of credentials, all the requests will not be signed. +- `format` — The [format](../../../interfaces/formats.md#formats) of the file. +- `aws_access_key_id`, `aws_secret_access_key` - Long-term credentials for the [AWS](https://aws.amazon.com/) account user. You can use these to authenticate your requests. Parameter is optional. If credentials are not specified, they are used from the configuration file. For more information see [Using S3 for Data Storage](../mergetree-family/mergetree.md#table_engine-mergetree-s3). +- `compression` — Compression type. Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Parameter is optional. By default, it will autodetect compression by file extension. ### PARTITION BY @@ -51,18 +51,18 @@ SELECT * FROM s3_engine_table LIMIT 2; ``` ## Virtual columns {#virtual-columns} -- `_path` — Path to the file. -- `_file` — Name of the file. +- `_path` — Path to the file. +- `_file` — Name of the file. For more information about virtual columns see [here](../../../engines/table-engines/index.md#table_engines-virtual_columns). ## Implementation Details {#implementation-details} -- Reads and writes can be parallel -- Not supported: - - `ALTER` and `SELECT...SAMPLE` operations. - - Indexes. - - [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is possible, but not supported. +- Reads and writes can be parallel +- Not supported: + - `ALTER` and `SELECT...SAMPLE` operations. + - Indexes. + - [Zero-copy](../../../operations/storing-data.md#zero-copy) replication is possible, but not supported. :::note Zero-copy replication is not ready for production Zero-copy replication is disabled by default in ClickHouse version 22.8 and higher. This feature is not recommended for production use. @@ -72,10 +72,10 @@ For more information about virtual columns see [here](../../../engines/table-eng `path` argument can specify multiple files using bash-like wildcards. For being processed file should exist and match to the whole path pattern. Listing of files is determined during `SELECT` (not at `CREATE` moment). -- `*` — Substitutes any number of any characters except `/` including empty string. -- `?` — Substitutes any single character. -- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. -- `{N..M}` — Substitutes any number in range from N to M including both borders. N and M can have leading zeroes e.g. `000..078`. +- `*` — Substitutes any number of any characters except `/` including empty string. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. N and M can have leading zeroes e.g. `000..078`. Constructions with `{}` are similar to the [remote](../../../sql-reference/table-functions/remote.md) table function. @@ -96,12 +96,12 @@ CREATE TABLE big_table (name String, value UInt32) Suppose we have several files in CSV format with the following URIs on S3: -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_1.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_2.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_3.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_1.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_2.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv' There are several ways to make a table consisting of all six files: @@ -131,14 +131,14 @@ CREATE TABLE table_with_asterisk (name String, value UInt32) The following settings can be set before query execution or placed into configuration file. -- `s3_max_single_part_upload_size` — The maximum size of object to upload using singlepart upload to S3. Default value is `64Mb`. -- `s3_min_upload_part_size` — The minimum size of part to upload during multipart upload to [S3 Multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html). Default value is `512Mb`. -- `s3_max_redirects` — Max number of S3 redirects hops allowed. Default value is `10`. -- `s3_single_read_retries` — The maximum number of attempts during single read. Default value is `4`. -- `s3_max_put_rps` — Maximum PUT requests per second rate before throttling. Default value is `0` (unlimited). -- `s3_max_put_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_put_rps`. -- `s3_max_get_rps` — Maximum GET requests per second rate before throttling. Default value is `0` (unlimited). -- `s3_max_get_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_get_rps`. +- `s3_max_single_part_upload_size` — The maximum size of object to upload using singlepart upload to S3. Default value is `64Mb`. +- `s3_min_upload_part_size` — The minimum size of part to upload during multipart upload to [S3 Multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html). Default value is `512Mb`. +- `s3_max_redirects` — Max number of S3 redirects hops allowed. Default value is `10`. +- `s3_single_read_retries` — The maximum number of attempts during single read. Default value is `4`. +- `s3_max_put_rps` — Maximum PUT requests per second rate before throttling. Default value is `0` (unlimited). +- `s3_max_put_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_put_rps`. +- `s3_max_get_rps` — Maximum GET requests per second rate before throttling. Default value is `0` (unlimited). +- `s3_max_get_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_get_rps`. Security consideration: if malicious user can specify arbitrary S3 URLs, `s3_max_redirects` must be set to zero to avoid [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) attacks; or alternatively, `remote_host_filter` must be specified in server configuration. @@ -146,17 +146,17 @@ Security consideration: if malicious user can specify arbitrary S3 URLs, `s3_max The following settings can be specified in configuration file for given endpoint (which will be matched by exact prefix of a URL): -- `endpoint` — Specifies prefix of an endpoint. Mandatory. -- `access_key_id` and `secret_access_key` — Specifies credentials to use with given endpoint. Optional. -- `use_environment_credentials` — If set to `true`, S3 client will try to obtain credentials from environment variables and [Amazon EC2](https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud) metadata for given endpoint. Optional, default value is `false`. -- `region` — Specifies S3 region name. Optional. -- `use_insecure_imds_request` — If set to `true`, S3 client will use insecure IMDS request while obtaining credentials from Amazon EC2 metadata. Optional, default value is `false`. -- `expiration_window_seconds` — Grace period for checking if expiration-based credentials have expired. Optional, default value is `120`. -- `no_sign_request` - Ignore all the credentials so requests are not signed. Useful for accessing public buckets. -- `header` — Adds specified HTTP header to a request to given endpoint. Optional, can be specified multiple times. -- `server_side_encryption_customer_key_base64` — If specified, required headers for accessing S3 objects with SSE-C encryption will be set. Optional. -- `max_single_read_retries` — The maximum number of attempts during single read. Default value is `4`. Optional. -- `max_put_rps`, `max_put_burst`, `max_get_rps` and `max_get_burst` - Throttling settings (see description above) to use for specific endpoint instead of per query. Optional. +- `endpoint` — Specifies prefix of an endpoint. Mandatory. +- `access_key_id` and `secret_access_key` — Specifies credentials to use with given endpoint. Optional. +- `use_environment_credentials` — If set to `true`, S3 client will try to obtain credentials from environment variables and [Amazon EC2](https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud) metadata for given endpoint. Optional, default value is `false`. +- `region` — Specifies S3 region name. Optional. +- `use_insecure_imds_request` — If set to `true`, S3 client will use insecure IMDS request while obtaining credentials from Amazon EC2 metadata. Optional, default value is `false`. +- `expiration_window_seconds` — Grace period for checking if expiration-based credentials have expired. Optional, default value is `120`. +- `no_sign_request` - Ignore all the credentials so requests are not signed. Useful for accessing public buckets. +- `header` — Adds specified HTTP header to a request to given endpoint. Optional, can be specified multiple times. +- `server_side_encryption_customer_key_base64` — If specified, required headers for accessing S3 objects with SSE-C encryption will be set. Optional. +- `max_single_read_retries` — The maximum number of attempts during single read. Default value is `4`. Optional. +- `max_put_rps`, `max_put_burst`, `max_get_rps` and `max_get_burst` - Throttling settings (see description above) to use for specific endpoint instead of per query. Optional. **Example:** diff --git a/docs/en/engines/table-engines/integrations/sqlite.md b/docs/en/engines/table-engines/integrations/sqlite.md index ba11b73339d..20597d37a87 100644 --- a/docs/en/engines/table-engines/integrations/sqlite.md +++ b/docs/en/engines/table-engines/integrations/sqlite.md @@ -20,8 +20,8 @@ The engine allows to import and export data to SQLite and supports queries to SQ **Engine Parameters** -- `db_path` — Path to SQLite file with a database. -- `table` — Name of a table in the SQLite database. +- `db_path` — Path to SQLite file with a database. +- `table` — Name of a table in the SQLite database. ## Usage Example {#usage-example} @@ -56,5 +56,5 @@ SELECT * FROM sqlite_db.table2 ORDER BY col1; **See Also** -- [SQLite](../../../engines/database-engines/sqlite.md) engine -- [sqlite](../../../sql-reference/table-functions/sqlite.md) table function +- [SQLite](../../../engines/database-engines/sqlite.md) engine +- [sqlite](../../../sql-reference/table-functions/sqlite.md) table function diff --git a/docs/en/engines/table-engines/log-family/index.md b/docs/en/engines/table-engines/log-family/index.md index 9e671163bbf..aca24e68378 100644 --- a/docs/en/engines/table-engines/log-family/index.md +++ b/docs/en/engines/table-engines/log-family/index.md @@ -10,9 +10,9 @@ These engines were developed for scenarios when you need to quickly write many s Engines of the family: -- [StripeLog](/docs/en/engines/table-engines/log-family/stripelog.md) -- [Log](/docs/en/engines/table-engines/log-family/log.md) -- [TinyLog](/docs/en/engines/table-engines/log-family/tinylog.md) +- [StripeLog](/docs/en/engines/table-engines/log-family/stripelog.md) +- [Log](/docs/en/engines/table-engines/log-family/log.md) +- [TinyLog](/docs/en/engines/table-engines/log-family/tinylog.md) `Log` family table engines can store data to [HDFS](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-hdfs) or [S3](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3) distributed file systems. @@ -20,21 +20,21 @@ Engines of the family: Engines: -- Store data on a disk. +- Store data on a disk. -- Append data to the end of file when writing. +- Append data to the end of file when writing. -- Support locks for concurrent data access. +- Support locks for concurrent data access. During `INSERT` queries, the table is locked, and other queries for reading and writing data both wait for the table to unlock. If there are no data writing queries, any number of data reading queries can be performed concurrently. -- Do not support [mutations](/docs/en/sql-reference/statements/alter/index.md#alter-mutations). +- Do not support [mutations](/docs/en/sql-reference/statements/alter/index.md#alter-mutations). -- Do not support indexes. +- Do not support indexes. This means that `SELECT` queries for ranges of data are not efficient. -- Do not write data atomically. +- Do not write data atomically. You can get a table with corrupted data if something breaks the write operation, for example, abnormal server shutdown. diff --git a/docs/en/engines/table-engines/log-family/stripelog.md b/docs/en/engines/table-engines/log-family/stripelog.md index 747713fe69a..6aaa6caf654 100644 --- a/docs/en/engines/table-engines/log-family/stripelog.md +++ b/docs/en/engines/table-engines/log-family/stripelog.md @@ -29,8 +29,8 @@ The `StripeLog` engine stores all the columns in one file. For each `INSERT` que For each table ClickHouse writes the files: -- `data.bin` — Data file. -- `index.mrk` — File with marks. Marks contain offsets for each column of each data block inserted. +- `data.bin` — Data file. +- `index.mrk` — File with marks. Marks contain offsets for each column of each data block inserted. The `StripeLog` engine does not support the `ALTER UPDATE` and `ALTER DELETE` operations. diff --git a/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md b/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md index 7e16f4926db..0043e1b6748 100644 --- a/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md @@ -60,7 +60,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] All of the parameters excepting `sign` have the same meaning as in `MergeTree`. -- `sign` — Name of the column with the type of row: `1` — “state” row, `-1` — “cancel” row. +- `sign` — Name of the column with the type of row: `1` — “state” row, `-1` — “cancel” row. Column Data Type — `Int8`. diff --git a/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md b/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md index f5b8436fdfe..edb320a2507 100644 --- a/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md +++ b/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md @@ -77,11 +77,11 @@ The `name` column contains the names of the partition data parts. You can use th Let’s break down the name of the part: `201901_1_9_2_11`: -- `201901` is the partition name. -- `1` is the minimum number of the data block. -- `9` is the maximum number of the data block. -- `2` is the chunk level (the depth of the merge tree it is formed from). -- `11` is the mutation version (if a part mutated) +- `201901` is the partition name. +- `1` is the minimum number of the data block. +- `9` is the maximum number of the data block. +- `2` is the chunk level (the depth of the merge tree it is formed from). +- `11` is the mutation version (if a part mutated) :::info The parts of old-type tables have the name: `20190117_20190123_2_2_0` (minimum date - maximum date - minimum block number - maximum block number - level). @@ -165,9 +165,9 @@ Performance of such a query heavily depends on the table layout. Because of that The key factors for a good performance: -- number of partitions involved in the query should be sufficiently large (more than `max_threads / 2`), otherwise query will underutilize the machine -- partitions shouldn't be too small, so batch processing won't degenerate into row-by-row processing -- partitions should be comparable in size, so all threads will do roughly the same amount of work +- number of partitions involved in the query should be sufficiently large (more than `max_threads / 2`), otherwise query will underutilize the machine +- partitions shouldn't be too small, so batch processing won't degenerate into row-by-row processing +- partitions should be comparable in size, so all threads will do roughly the same amount of work :::info It's recommended to apply some hash function to columns in `partition by` clause in order to distribute data evenly between partitions. @@ -175,6 +175,6 @@ It's recommended to apply some hash function to columns in `partition by` clause Relevant settings are: -- `allow_aggregate_partitions_independently` - controls if the use of optimisation is enabled -- `force_aggregate_partitions_independently` - forces its use when it's applicable from the correctness standpoint, but getting disabled by internal logic that estimates its expediency -- `max_number_of_partitions_for_independent_aggregation` - hard limit on the maximal number of partitions table could have +- `allow_aggregate_partitions_independently` - controls if the use of optimisation is enabled +- `force_aggregate_partitions_independently` - forces its use when it's applicable from the correctness standpoint, but getting disabled by internal logic that estimates its expediency +- `max_number_of_partitions_for_independent_aggregation` - hard limit on the maximal number of partitions table could have diff --git a/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md index 9577c8dc936..03e8be13474 100644 --- a/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/graphitemergetree.md @@ -33,19 +33,19 @@ See a detailed description of the [CREATE TABLE](../../../sql-reference/statemen A table for the Graphite data should have the following columns for the following data: -- Metric name (Graphite sensor). Data type: `String`. +- Metric name (Graphite sensor). Data type: `String`. -- Time of measuring the metric. Data type: `DateTime`. +- Time of measuring the metric. Data type: `DateTime`. -- Value of the metric. Data type: `Float64`. +- Value of the metric. Data type: `Float64`. -- Version of the metric. Data type: any numeric (ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts). +- Version of the metric. Data type: any numeric (ClickHouse saves the rows with the highest version or the last written if versions are the same. Other rows are deleted during the merge of data parts). The names of these columns should be set in the rollup configuration. **GraphiteMergeTree parameters** -- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. +- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. **Query clauses** @@ -73,7 +73,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] All of the parameters excepting `config_section` have the same meaning as in `MergeTree`. -- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. +- `config_section` — Name of the section in the configuration file, where are the rules of rollup set. @@ -141,18 +141,18 @@ When processing a row, ClickHouse checks the rules in the `pattern` sections. Ea Fields for `pattern` and `default` sections: -- `rule_type` - a rule's type. It's applied only to a particular metrics. The engine use it to separate plain and tagged metrics. Optional parameter. Default value: `all`. +- `rule_type` - a rule's type. It's applied only to a particular metrics. The engine use it to separate plain and tagged metrics. Optional parameter. Default value: `all`. It's unnecessary when performance is not critical, or only one metrics type is used, e.g. plain metrics. By default only one type of rules set is created. Otherwise, if any of special types is defined, two different sets are created. One for plain metrics (root.branch.leaf) and one for tagged metrics (root.branch.leaf;tag1=value1). The default rules are ended up in both sets. Valid values: - - `all` (default) - a universal rule, used when `rule_type` is omitted. - - `plain` - a rule for plain metrics. The field `regexp` is processed as regular expression. - - `tagged` - a rule for tagged metrics (metrics are stored in DB in the format of `someName?tag1=value1&tag2=value2&tag3=value3`). Regular expression must be sorted by tags' names, first tag must be `__name__` if exists. The field `regexp` is processed as regular expression. - - `tag_list` - a rule for tagged matrics, a simple DSL for easier metric description in graphite format `someName;tag1=value1;tag2=value2`, `someName`, or `tag1=value1;tag2=value2`. The field `regexp` is translated into a `tagged` rule. The sorting by tags' names is unnecessary, ti will be done automatically. A tag's value (but not a name) can be set as a regular expression, e.g. `env=(dev|staging)`. -- `regexp` – A pattern for the metric name (a regular or DSL). -- `age` – The minimum age of the data in seconds. -- `precision`– How precisely to define the age of the data in seconds. Should be a divisor for 86400 (seconds in a day). -- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. Accepted functions: min / max / any / avg. The average is calculated imprecisely, like the average of the averages. + - `all` (default) - a universal rule, used when `rule_type` is omitted. + - `plain` - a rule for plain metrics. The field `regexp` is processed as regular expression. + - `tagged` - a rule for tagged metrics (metrics are stored in DB in the format of `someName?tag1=value1&tag2=value2&tag3=value3`). Regular expression must be sorted by tags' names, first tag must be `__name__` if exists. The field `regexp` is processed as regular expression. + - `tag_list` - a rule for tagged matrics, a simple DSL for easier metric description in graphite format `someName;tag1=value1;tag2=value2`, `someName`, or `tag1=value1;tag2=value2`. The field `regexp` is translated into a `tagged` rule. The sorting by tags' names is unnecessary, ti will be done automatically. A tag's value (but not a name) can be set as a regular expression, e.g. `env=(dev|staging)`. +- `regexp` – A pattern for the metric name (a regular or DSL). +- `age` – The minimum age of the data in seconds. +- `precision`– How precisely to define the age of the data in seconds. Should be a divisor for 86400 (seconds in a day). +- `function` – The name of the aggregating function to apply to data whose age falls within the range `[age, age + precision]`. Accepted functions: min / max / any / avg. The average is calculated imprecisely, like the average of the averages. ### Configuration Example without rules types {#configuration-example} diff --git a/docs/en/engines/table-engines/mergetree-family/mergetree.md b/docs/en/engines/table-engines/mergetree-family/mergetree.md index 92d85367da3..d5189d4b9d9 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -12,19 +12,19 @@ Engines in the `MergeTree` family are designed for inserting a very large amount Main features: -- Stores data sorted by primary key. +- Stores data sorted by primary key. This allows you to create a small sparse index that helps find data faster. -- Partitions can be used if the [partitioning key](/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md) is specified. +- Partitions can be used if the [partitioning key](/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md) is specified. ClickHouse supports certain operations with partitions that are more efficient than general operations on the same data with the same result. ClickHouse also automatically cuts off the partition data where the partitioning key is specified in the query. -- Data replication support. +- Data replication support. The family of `ReplicatedMergeTree` tables provides data replication. For more information, see [Data replication](/docs/en/engines/table-engines/mergetree-family/replication.md). -- Data sampling support. +- Data sampling support. If necessary, you can set the data sampling method in the table. @@ -207,10 +207,10 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] **MergeTree() Parameters** -- `date-column` — The name of a column of the [Date](/docs/en/sql-reference/data-types/date.md) type. ClickHouse automatically creates partitions by month based on this column. The partition names are in the `"YYYYMM"` format. -- `sampling_expression` — An expression for sampling. -- `(primary, key)` — Primary key. Type: [Tuple()](/docs/en/sql-reference/data-types/tuple.md) -- `index_granularity` — The granularity of an index. The number of data rows between the “marks” of an index. The value 8192 is appropriate for most tasks. +- `date-column` — The name of a column of the [Date](/docs/en/sql-reference/data-types/date.md) type. ClickHouse automatically creates partitions by month based on this column. The partition names are in the `"YYYYMM"` format. +- `sampling_expression` — An expression for sampling. +- `(primary, key)` — Primary key. Type: [Tuple()](/docs/en/sql-reference/data-types/tuple.md) +- `index_granularity` — The granularity of an index. The number of data rows between the “marks” of an index. The value 8192 is appropriate for most tasks. **Example** @@ -250,9 +250,9 @@ Take the `(CounterID, Date)` primary key as an example. In this case, the sortin If the data query specifies: -- `CounterID in ('a', 'h')`, the server reads the data in the ranges of marks `[0, 3)` and `[6, 8)`. -- `CounterID IN ('a', 'h') AND Date = 3`, the server reads the data in the ranges of marks `[1, 3)` and `[7, 8)`. -- `Date = 3`, the server reads the data in the range of marks `[1, 10]`. +- `CounterID in ('a', 'h')`, the server reads the data in the ranges of marks `[0, 3)` and `[6, 8)`. +- `CounterID IN ('a', 'h') AND Date = 3`, the server reads the data in the ranges of marks `[1, 3)` and `[7, 8)`. +- `Date = 3`, the server reads the data in the range of marks `[1, 10]`. The examples above show that it is always more effective to use an index than a full scan. @@ -268,18 +268,18 @@ You can use `Nullable`-typed expressions in the `PRIMARY KEY` and `ORDER BY` cla The number of columns in the primary key is not explicitly limited. Depending on the data structure, you can include more or fewer columns in the primary key. This may: -- Improve the performance of an index. +- Improve the performance of an index. If the primary key is `(a, b)`, then adding another column `c` will improve the performance if the following conditions are met: - - There are queries with a condition on column `c`. - - Long data ranges (several times longer than the `index_granularity`) with identical values for `(a, b)` are common. In other words, when adding another column allows you to skip quite long data ranges. + - There are queries with a condition on column `c`. + - Long data ranges (several times longer than the `index_granularity`) with identical values for `(a, b)` are common. In other words, when adding another column allows you to skip quite long data ranges. -- Improve data compression. +- Improve data compression. ClickHouse sorts data by primary key, so the higher the consistency, the better the compression. -- Provide additional logic when merging data parts in the [CollapsingMergeTree](/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md/#table_engine-collapsingmergetree) and [SummingMergeTree](/docs/en/engines/table-engines/mergetree-family/summingmergetree.md) engines. +- Provide additional logic when merging data parts in the [CollapsingMergeTree](/docs/en/engines/table-engines/mergetree-family/collapsingmergetree.md/#table_engine-collapsingmergetree) and [SummingMergeTree](/docs/en/engines/table-engines/mergetree-family/summingmergetree.md) engines. In this case it makes sense to specify the *sorting key* that is different from the primary key. @@ -490,18 +490,18 @@ Bloom filters can have false positive matches, so the `ngrambf_v1`, `tokenbf_v1` For example: -- Can be optimized: - - `s LIKE '%test%'` - - `NOT s NOT LIKE '%test%'` - - `s = 1` - - `NOT s != 1` - - `startsWith(s, 'test')` -- Can not be optimized: - - `NOT s LIKE '%test%'` - - `s NOT LIKE '%test%'` - - `NOT s = 1` - - `s != 1` - - `NOT startsWith(s, 'test')` +- Can be optimized: + - `s LIKE '%test%'` + - `NOT s NOT LIKE '%test%'` + - `s = 1` + - `NOT s != 1` + - `startsWith(s, 'test')` +- Can not be optimized: + - `NOT s LIKE '%test%'` + - `s NOT LIKE '%test%'` + - `NOT s = 1` + - `s != 1` + - `NOT startsWith(s, 'test')` ::: @@ -614,11 +614,11 @@ TTL expr Type of TTL rule may follow each TTL expression. It affects an action which is to be done once the expression is satisfied (reaches current time): -- `DELETE` - delete expired rows (default action); -- `RECOMPRESS codec_name` - recompress data part with the `codec_name`; -- `TO DISK 'aaa'` - move part to the disk `aaa`; -- `TO VOLUME 'bbb'` - move part to the disk `bbb`; -- `GROUP BY` - aggregate expired rows. +- `DELETE` - delete expired rows (default action); +- `RECOMPRESS codec_name` - recompress data part with the `codec_name`; +- `TO DISK 'aaa'` - move part to the disk `aaa`; +- `TO VOLUME 'bbb'` - move part to the disk `bbb`; +- `GROUP BY` - aggregate expired rows. `DELETE` action can be used together with `WHERE` clause to delete only some of the expired rows based on a filtering condition: ``` sql @@ -722,10 +722,10 @@ Data part is the minimum movable unit for `MergeTree`-engine tables. The data be ### Terms {#terms} -- Disk — Block device mounted to the filesystem. -- Default disk — Disk that stores the path specified in the [path](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-path) server setting. -- Volume — Ordered set of equal disks (similar to [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)). -- Storage policy — Set of volumes and the rules for moving data between them. +- Disk — Block device mounted to the filesystem. +- Default disk — Disk that stores the path specified in the [path](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-path) server setting. +- Volume — Ordered set of equal disks (similar to [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)). +- Storage policy — Set of volumes and the rules for moving data between them. The names given to the described entities can be found in the system tables, [system.storage_policies](/docs/en/operations/system-tables/storage_policies.md/#system_tables-storage_policies) and [system.disks](/docs/en/operations/system-tables/disks.md/#system_tables-disks). To apply one of the configured storage policies for a table, use the `storage_policy` setting of `MergeTree`-engine family tables. @@ -759,9 +759,9 @@ Configuration structure: Tags: -- `` — Disk name. Names must be different for all disks. -- `path` — path under which a server will store data (`data` and `shadow` folders), should be terminated with ‘/’. -- `keep_free_space_bytes` — the amount of free disk space to be reserved. +- `` — Disk name. Names must be different for all disks. +- `path` — path under which a server will store data (`data` and `shadow` folders), should be terminated with ‘/’. +- `keep_free_space_bytes` — the amount of free disk space to be reserved. The order of the disk definition is not important. @@ -797,14 +797,14 @@ Storage policies configuration markup: Tags: -- `policy_name_N` — Policy name. Policy names must be unique. -- `volume_name_N` — Volume name. Volume names must be unique. -- `disk` — a disk within a volume. -- `max_data_part_size_bytes` — the maximum size of a part that can be stored on any of the volume’s disks. If the a size of a merged part estimated to be bigger than `max_data_part_size_bytes` then this part will be written to a next volume. Basically this feature allows to keep new/small parts on a hot (SSD) volume and move them to a cold (HDD) volume when they reach large size. Do not use this setting if your policy has only one volume. -- `move_factor` — when the amount of available space gets lower than this factor, data automatically starts to move on the next volume if any (by default, 0.1). ClickHouse sorts existing parts by size from largest to smallest (in descending order) and selects parts with the total size that is sufficient to meet the `move_factor` condition. If the total size of all parts is insufficient, all parts will be moved. -- `prefer_not_to_merge` — Disables merging of data parts on this volume. When this setting is enabled, merging data on this volume is not allowed. This allows controlling how ClickHouse works with slow disks. -- `perform_ttl_move_on_insert` — Disables TTL move on data part INSERT. By default if we insert a data part that already expired by the TTL move rule it immediately goes to a volume/disk declared in move rule. This can significantly slowdown insert in case if destination volume/disk is slow (e.g. S3). -- `load_balancing` - Policy for disk balancing, `round_robin` or `least_used`. +- `policy_name_N` — Policy name. Policy names must be unique. +- `volume_name_N` — Volume name. Volume names must be unique. +- `disk` — a disk within a volume. +- `max_data_part_size_bytes` — the maximum size of a part that can be stored on any of the volume’s disks. If the a size of a merged part estimated to be bigger than `max_data_part_size_bytes` then this part will be written to a next volume. Basically this feature allows to keep new/small parts on a hot (SSD) volume and move them to a cold (HDD) volume when they reach large size. Do not use this setting if your policy has only one volume. +- `move_factor` — when the amount of available space gets lower than this factor, data automatically starts to move on the next volume if any (by default, 0.1). ClickHouse sorts existing parts by size from largest to smallest (in descending order) and selects parts with the total size that is sufficient to meet the `move_factor` condition. If the total size of all parts is insufficient, all parts will be moved. +- `prefer_not_to_merge` — Disables merging of data parts on this volume. When this setting is enabled, merging data on this volume is not allowed. This allows controlling how ClickHouse works with slow disks. +- `perform_ttl_move_on_insert` — Disables TTL move on data part INSERT. By default if we insert a data part that already expired by the TTL move rule it immediately goes to a volume/disk declared in move rule. This can significantly slowdown insert in case if destination volume/disk is slow (e.g. S3). +- `load_balancing` - Policy for disk balancing, `round_robin` or `least_used`. Cofiguration examples: @@ -880,10 +880,10 @@ The number of threads performing background moves of data parts can be changed b In the case of `MergeTree` tables, data is getting to disk in different ways: -- As a result of an insert (`INSERT` query). -- During background merges and [mutations](/docs/en/sql-reference/statements/alter/index.md#alter-mutations). -- When downloading from another replica. -- As a result of partition freezing [ALTER TABLE … FREEZE PARTITION](/docs/en/sql-reference/statements/alter/partition.md/#alter_freeze-partition). +- As a result of an insert (`INSERT` query). +- During background merges and [mutations](/docs/en/sql-reference/statements/alter/index.md#alter-mutations). +- When downloading from another replica. +- As a result of partition freezing [ALTER TABLE … FREEZE PARTITION](/docs/en/sql-reference/statements/alter/partition.md/#alter_freeze-partition). In all these cases except for mutations and partition freezing, a part is stored on a volume and a disk according to the given storage policy: @@ -956,30 +956,30 @@ ClickHouse versions 22.3 through 22.7 use a different cache configuration, see [ Required parameters: -- `endpoint` — S3 endpoint URL in `path` or `virtual hosted` [styles](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html). Endpoint URL should contain a bucket and root path to store data. -- `access_key_id` — S3 access key id. -- `secret_access_key` — S3 secret access key. +- `endpoint` — S3 endpoint URL in `path` or `virtual hosted` [styles](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html). Endpoint URL should contain a bucket and root path to store data. +- `access_key_id` — S3 access key id. +- `secret_access_key` — S3 secret access key. Optional parameters: -- `region` — S3 region name. -- `support_batch_delete` — This controls the check to see if batch deletes are supported. Set this to `false` when using Google Cloud Storage (GCS) as GCS does not support batch deletes and preventing the checks will prevent error messages in the logs. -- `use_environment_credentials` — Reads AWS credentials from the Environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN if they exist. Default value is `false`. -- `use_insecure_imds_request` — If set to `true`, S3 client will use insecure IMDS request while obtaining credentials from Amazon EC2 metadata. Default value is `false`. -- `expiration_window_seconds` — Grace period for checking if expiration-based credentials have expired. Optional, default value is `120`. -- `proxy` — Proxy configuration for S3 endpoint. Each `uri` element inside `proxy` block should contain a proxy URL. -- `connect_timeout_ms` — Socket connect timeout in milliseconds. Default value is `10 seconds`. -- `request_timeout_ms` — Request timeout in milliseconds. Default value is `5 seconds`. -- `retry_attempts` — Number of retry attempts in case of failed request. Default value is `10`. -- `single_read_retries` — Number of retry attempts in case of connection drop during read. Default value is `4`. -- `min_bytes_for_seek` — Minimal number of bytes to use seek operation instead of sequential read. Default value is `1 Mb`. -- `metadata_path` — Path on local FS to store metadata files for S3. Default value is `/var/lib/clickhouse/disks//`. -- `skip_access_check` — If true, disk access checks will not be performed on disk start-up. Default value is `false`. -- `server_side_encryption_customer_key_base64` — If specified, required headers for accessing S3 objects with SSE-C encryption will be set. -- `s3_max_put_rps` — Maximum PUT requests per second rate before throttling. Default value is `0` (unlimited). -- `s3_max_put_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_put_rps`. -- `s3_max_get_rps` — Maximum GET requests per second rate before throttling. Default value is `0` (unlimited). -- `s3_max_get_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_get_rps`. +- `region` — S3 region name. +- `support_batch_delete` — This controls the check to see if batch deletes are supported. Set this to `false` when using Google Cloud Storage (GCS) as GCS does not support batch deletes and preventing the checks will prevent error messages in the logs. +- `use_environment_credentials` — Reads AWS credentials from the Environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN if they exist. Default value is `false`. +- `use_insecure_imds_request` — If set to `true`, S3 client will use insecure IMDS request while obtaining credentials from Amazon EC2 metadata. Default value is `false`. +- `expiration_window_seconds` — Grace period for checking if expiration-based credentials have expired. Optional, default value is `120`. +- `proxy` — Proxy configuration for S3 endpoint. Each `uri` element inside `proxy` block should contain a proxy URL. +- `connect_timeout_ms` — Socket connect timeout in milliseconds. Default value is `10 seconds`. +- `request_timeout_ms` — Request timeout in milliseconds. Default value is `5 seconds`. +- `retry_attempts` — Number of retry attempts in case of failed request. Default value is `10`. +- `single_read_retries` — Number of retry attempts in case of connection drop during read. Default value is `4`. +- `min_bytes_for_seek` — Minimal number of bytes to use seek operation instead of sequential read. Default value is `1 Mb`. +- `metadata_path` — Path on local FS to store metadata files for S3. Default value is `/var/lib/clickhouse/disks//`. +- `skip_access_check` — If true, disk access checks will not be performed on disk start-up. Default value is `false`. +- `server_side_encryption_customer_key_base64` — If specified, required headers for accessing S3 objects with SSE-C encryption will be set. +- `s3_max_put_rps` — Maximum PUT requests per second rate before throttling. Default value is `0` (unlimited). +- `s3_max_put_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_put_rps`. +- `s3_max_get_rps` — Maximum GET requests per second rate before throttling. Default value is `0` (unlimited). +- `s3_max_get_burst` — Max number of requests that can be issued simultaneously before hitting request per second limit. By default (`0` value) equals to `s3_max_get_rps`. ### Configuring the cache @@ -994,12 +994,12 @@ This is the cache configuration from above: ``` These parameters define the cache layer: -- `type` — If a disk is of type `cache` it caches mark and index files in memory. -- `disk` — The name of the disk that will be cached. +- `type` — If a disk is of type `cache` it caches mark and index files in memory. +- `disk` — The name of the disk that will be cached. Cache parameters: -- `path` — The path where metadata for the cache is stored. -- `max_size` — The size (amount of memory) that the cache can grow to. +- `path` — The path where metadata for the cache is stored. +- `max_size` — The size (amount of memory) that the cache can grow to. :::tip There are several other cache parameters that you can use to tune your storage, see [using local cache](/docs/en/operations/storing-data.md/#using-local-cache) for the details. @@ -1100,9 +1100,9 @@ Examples of working configurations can be found in integration tests directory ( ## Virtual Columns {#virtual-columns} -- `_part` — Name of a part. -- `_part_index` — Sequential index of the part in the query result. -- `_partition_id` — Name of a partition. -- `_part_uuid` — Unique part identifier (if enabled MergeTree setting `assign_part_uuids`). -- `_partition_value` — Values (a tuple) of a `partition by` expression. -- `_sample_factor` — Sample factor (from the query). +- `_part` — Name of a part. +- `_part_index` — Sequential index of the part in the query result. +- `_partition_id` — Name of a partition. +- `_part_uuid` — Unique part identifier (if enabled MergeTree setting `assign_part_uuids`). +- `_partition_value` — Values (a tuple) of a `partition by` expression. +- `_sample_factor` — Sample factor (from the query). diff --git a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md index 42f13b9889b..81d8cc2d3ca 100644 --- a/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/replacingmergetree.md @@ -123,6 +123,6 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] All of the parameters excepting `ver` have the same meaning as in `MergeTree`. -- `ver` - column with the version. Optional parameter. For a description, see the text above. +- `ver` - column with the version. Optional parameter. For a description, see the text above. diff --git a/docs/en/engines/table-engines/mergetree-family/replication.md b/docs/en/engines/table-engines/mergetree-family/replication.md index e14ba5699e4..01782ac25bd 100644 --- a/docs/en/engines/table-engines/mergetree-family/replication.md +++ b/docs/en/engines/table-engines/mergetree-family/replication.md @@ -26,13 +26,13 @@ ENGINE = ReplicatedReplacingMergeTree Replication is only supported for tables in the MergeTree family: -- ReplicatedMergeTree -- ReplicatedSummingMergeTree -- ReplicatedReplacingMergeTree -- ReplicatedAggregatingMergeTree -- ReplicatedCollapsingMergeTree -- ReplicatedVersionedCollapsingMergeTree -- ReplicatedGraphiteMergeTree +- ReplicatedMergeTree +- ReplicatedSummingMergeTree +- ReplicatedReplacingMergeTree +- ReplicatedAggregatingMergeTree +- ReplicatedCollapsingMergeTree +- ReplicatedVersionedCollapsingMergeTree +- ReplicatedGraphiteMergeTree Replication works at the level of an individual table, not the entire server. A server can store both replicated and non-replicated tables at the same time. @@ -42,9 +42,9 @@ Compressed data for `INSERT` and `ALTER` queries is replicated (for more informa `CREATE`, `DROP`, `ATTACH`, `DETACH` and `RENAME` queries are executed on a single server and are not replicated: -- The `CREATE TABLE` query creates a new replicatable table on the server where the query is run. If this table already exists on other servers, it adds a new replica. -- The `DROP TABLE` query deletes the replica located on the server where the query is run. -- The `RENAME` query renames the table on one of the replicas. In other words, replicated tables can have different names on different replicas. +- The `CREATE TABLE` query creates a new replicatable table on the server where the query is run. If this table already exists on other servers, it adds a new replica. +- The `DROP TABLE` query deletes the replica located on the server where the query is run. +- The `RENAME` query renames the table on one of the replicas. In other words, replicated tables can have different names on different replicas. ClickHouse uses [ClickHouse Keeper](/docs/en/guides/sre/keeper/index.md) for storing replicas meta information. It is possible to use ZooKeeper version 3.4.5 or newer, but ClickHouse Keeper is recommended. @@ -316,8 +316,8 @@ Create a MergeTree table with a different name. Move all the data from the direc If you want to get rid of a `ReplicatedMergeTree` table without launching the server: -- Delete the corresponding `.sql` file in the metadata directory (`/var/lib/clickhouse/metadata/`). -- Delete the corresponding path in ClickHouse Keeper (`/path_to_table/replica_name`). +- Delete the corresponding `.sql` file in the metadata directory (`/var/lib/clickhouse/metadata/`). +- Delete the corresponding path in ClickHouse Keeper (`/path_to_table/replica_name`). After this, you can launch the server, create a `MergeTree` table, move the data to its directory, and then restart the server. @@ -327,8 +327,8 @@ If the data in ClickHouse Keeper was lost or damaged, you can save data by movin **See Also** -- [background_schedule_pool_size](/docs/en/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) -- [background_fetches_pool_size](/docs/en/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) -- [execute_merges_on_single_replica_time_threshold](/docs/en/operations/settings/settings.md/#execute-merges-on-single-replica-time-threshold) -- [max_replicated_fetches_network_bandwidth](/docs/en/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) -- [max_replicated_sends_network_bandwidth](/docs/en/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) +- [background_schedule_pool_size](/docs/en/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) +- [background_fetches_pool_size](/docs/en/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) +- [execute_merges_on_single_replica_time_threshold](/docs/en/operations/settings/settings.md/#execute-merges-on-single-replica-time-threshold) +- [max_replicated_fetches_network_bandwidth](/docs/en/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) +- [max_replicated_sends_network_bandwidth](/docs/en/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) diff --git a/docs/en/engines/table-engines/mergetree-family/summingmergetree.md b/docs/en/engines/table-engines/mergetree-family/summingmergetree.md index d15323bbc88..c3cbb0d2a03 100644 --- a/docs/en/engines/table-engines/mergetree-family/summingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/summingmergetree.md @@ -59,7 +59,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] All of the parameters excepting `columns` have the same meaning as in `MergeTree`. -- `columns` — tuple with names of columns values of which will be summarized. Optional parameter. For a description, see the text above. +- `columns` — tuple with names of columns values of which will be summarized. Optional parameter. For a description, see the text above. @@ -122,8 +122,8 @@ Table can have nested data structures that are processed in a special way. If the name of a nested table ends with `Map` and it contains at least two columns that meet the following criteria: -- the first column is numeric `(*Int*, Date, DateTime)` or a string `(String, FixedString)`, let’s call it `key`, -- the other columns are arithmetic `(*Int*, Float32/64)`, let’s call it `(values...)`, +- the first column is numeric `(*Int*, Date, DateTime)` or a string `(String, FixedString)`, let’s call it `key`, +- the other columns are arithmetic `(*Int*, Float32/64)`, let’s call it `(values...)`, then this nested table is interpreted as a mapping of `key => (values...)`, and when merging its rows, the elements of two data sets are merged by `key` with a summation of the corresponding `(values...)`. diff --git a/docs/en/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/docs/en/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md index 74ac9c97fc0..22a15c0e15e 100644 --- a/docs/en/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md @@ -8,8 +8,8 @@ sidebar_label: VersionedCollapsingMergeTree This engine: -- Allows quick writing of object states that are continually changing. -- Deletes old object states in the background. This significantly reduces the volume of storage. +- Allows quick writing of object states that are continually changing. +- Deletes old object states in the background. This significantly reduces the volume of storage. See the section [Collapsing](#table_engines_versionedcollapsingmergetree) for details. @@ -73,11 +73,11 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] All of the parameters except `sign` and `version` have the same meaning as in `MergeTree`. -- `sign` — Name of the column with the type of row: `1` is a “state” row, `-1` is a “cancel” row. +- `sign` — Name of the column with the type of row: `1` is a “state” row, `-1` is a “cancel” row. Column Data Type — `Int8`. -- `version` — Name of the column with the version of the object state. +- `version` — Name of the column with the version of the object state. The column data type should be `UInt*`. diff --git a/docs/en/engines/table-engines/special/dictionary.md b/docs/en/engines/table-engines/special/dictionary.md index 05d07d94e56..3517ebfcdc6 100644 --- a/docs/en/engines/table-engines/special/dictionary.md +++ b/docs/en/engines/table-engines/special/dictionary.md @@ -97,4 +97,4 @@ select * from products limit 1; **See Also** -- [Dictionary function](../../../sql-reference/table-functions/dictionary.md#dictionary-function) +- [Dictionary function](../../../sql-reference/table-functions/dictionary.md#dictionary-function) diff --git a/docs/en/engines/table-engines/special/distributed.md b/docs/en/engines/table-engines/special/distributed.md index d13453bc08f..bb97e56c1cc 100644 --- a/docs/en/engines/table-engines/special/distributed.md +++ b/docs/en/engines/table-engines/special/distributed.md @@ -229,8 +229,8 @@ A simple remainder from the division is a limited solution for sharding and isn You should be concerned about the sharding scheme in the following cases: -- Queries are used that require joining data (`IN` or `JOIN`) by a specific key. If data is sharded by this key, you can use local `IN` or `JOIN` instead of `GLOBAL IN` or `GLOBAL JOIN`, which is much more efficient. -- A large number of servers is used (hundreds or more) with a large number of small queries, for example, queries for data of individual clients (e.g. websites, advertisers, or partners). In order for the small queries to not affect the entire cluster, it makes sense to locate data for a single client on a single shard. Alternatively, you can set up bi-level sharding: divide the entire cluster into “layers”, where a layer may consist of multiple shards. Data for a single client is located on a single layer, but shards can be added to a layer as necessary, and data is randomly distributed within them. `Distributed` tables are created for each layer, and a single shared distributed table is created for global queries. +- Queries are used that require joining data (`IN` or `JOIN`) by a specific key. If data is sharded by this key, you can use local `IN` or `JOIN` instead of `GLOBAL IN` or `GLOBAL JOIN`, which is much more efficient. +- A large number of servers is used (hundreds or more) with a large number of small queries, for example, queries for data of individual clients (e.g. websites, advertisers, or partners). In order for the small queries to not affect the entire cluster, it makes sense to locate data for a single client on a single shard. Alternatively, you can set up bi-level sharding: divide the entire cluster into “layers”, where a layer may consist of multiple shards. Data for a single client is located on a single layer, but shards can be added to a layer as necessary, and data is randomly distributed within them. `Distributed` tables are created for each layer, and a single shared distributed table is created for global queries. Data is written asynchronously. When inserted in the table, the data block is just written to the local file system. The data is sent to the remote servers in the background as soon as possible. The periodicity for sending data is managed by the [distributed_directory_monitor_sleep_time_ms](../../../operations/settings/settings.md#distributed_directory_monitor_sleep_time_ms) and [distributed_directory_monitor_max_sleep_time_ms](../../../operations/settings/settings.md#distributed_directory_monitor_max_sleep_time_ms) settings. The `Distributed` engine sends each file with inserted data separately, but you can enable batch sending of files with the [distributed_directory_monitor_batch_inserts](../../../operations/settings/settings.md#distributed_directory_monitor_batch_inserts) setting. This setting improves cluster performance by better utilizing local server and network resources. You should check whether data is sent successfully by checking the list of files (data waiting to be sent) in the table directory: `/var/lib/clickhouse/data/database/table/`. The number of threads performing background tasks can be set by [background_distributed_schedule_pool_size](../../../operations/settings/settings.md#background_distributed_schedule_pool_size) setting. @@ -256,6 +256,6 @@ Since [remote](../../../sql-reference/table-functions/remote.md) and [cluster](. **See Also** -- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) description -- [background_distributed_schedule_pool_size](../../../operations/settings/settings.md#background_distributed_schedule_pool_size) setting -- [shardNum()](../../../sql-reference/functions/other-functions.md#shard-num) and [shardCount()](../../../sql-reference/functions/other-functions.md#shard-count) functions +- [Virtual columns](../../../engines/table-engines/index.md#table_engines-virtual_columns) description +- [background_distributed_schedule_pool_size](../../../operations/settings/settings.md#background_distributed_schedule_pool_size) setting +- [shardNum()](../../../sql-reference/functions/other-functions.md#shard-num) and [shardCount()](../../../sql-reference/functions/other-functions.md#shard-count) functions diff --git a/docs/en/engines/table-engines/special/file.md b/docs/en/engines/table-engines/special/file.md index e99b1c83cbc..9c4e87487b4 100644 --- a/docs/en/engines/table-engines/special/file.md +++ b/docs/en/engines/table-engines/special/file.md @@ -10,9 +10,9 @@ The File table engine keeps the data in a file in one of the supported [file for Usage scenarios: -- Data export from ClickHouse to file. -- Convert data from one format to another. -- Updating data in ClickHouse via editing a file on a disk. +- Data export from ClickHouse to file. +- Convert data from one format to another. +- Updating data in ClickHouse via editing a file on a disk. ## Usage in ClickHouse Server {#usage-in-clickhouse-server} @@ -78,14 +78,14 @@ $ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64 ## Details of Implementation {#details-of-implementation} -- Multiple `SELECT` queries can be performed concurrently, but `INSERT` queries will wait each other. -- Supported creating new file by `INSERT` query. -- If file exists, `INSERT` would append new values in it. -- Not supported: - - `ALTER` - - `SELECT ... SAMPLE` - - Indices - - Replication +- Multiple `SELECT` queries can be performed concurrently, but `INSERT` queries will wait each other. +- Supported creating new file by `INSERT` query. +- If file exists, `INSERT` would append new values in it. +- Not supported: + - `ALTER` + - `SELECT ... SAMPLE` + - Indices + - Replication ## PARTITION BY diff --git a/docs/en/engines/table-engines/special/generate.md b/docs/en/engines/table-engines/special/generate.md index 714afe3c3b5..9fcdb47e555 100644 --- a/docs/en/engines/table-engines/special/generate.md +++ b/docs/en/engines/table-engines/special/generate.md @@ -9,8 +9,8 @@ The GenerateRandom table engine produces random data for given table schema. Usage examples: -- Use in test to populate reproducible large table. -- Generate random input for fuzzing tests. +- Use in test to populate reproducible large table. +- Generate random input for fuzzing tests. ## Usage in ClickHouse Server {#usage-in-clickhouse-server} @@ -49,9 +49,9 @@ SELECT * FROM generate_engine_table LIMIT 3 ## Details of Implementation {#details-of-implementation} -- Not supported: - - `ALTER` - - `SELECT ... SAMPLE` - - `INSERT` - - Indices - - Replication +- Not supported: + - `ALTER` + - `SELECT ... SAMPLE` + - `INSERT` + - Indices + - Replication diff --git a/docs/en/engines/table-engines/special/index.md b/docs/en/engines/table-engines/special/index.md index 2247aeae5af..a1c5056de22 100644 --- a/docs/en/engines/table-engines/special/index.md +++ b/docs/en/engines/table-engines/special/index.md @@ -8,8 +8,8 @@ sidebar_label: Special There are three main categories of table engines: -- [MergeTree engine family](../../../engines/table-engines/mergetree-family/index.md) for main production use. -- [Log engine family](../../../engines/table-engines/log-family/index.md) for small temporary data. -- [Table engines for integrations](../../../engines/table-engines/integrations/index.md). +- [MergeTree engine family](../../../engines/table-engines/mergetree-family/index.md) for main production use. +- [Log engine family](../../../engines/table-engines/log-family/index.md) for small temporary data. +- [Table engines for integrations](../../../engines/table-engines/integrations/index.md). The remaining engines are unique in their purpose and are not grouped into families yet, thus they are placed in this “special” category. diff --git a/docs/en/engines/table-engines/special/join.md b/docs/en/engines/table-engines/special/join.md index a7cc525dd6c..e9f0678beee 100644 --- a/docs/en/engines/table-engines/special/join.md +++ b/docs/en/engines/table-engines/special/join.md @@ -54,8 +54,8 @@ You can use `INSERT` queries to add data to the `Join`-engine tables. If the tab Main use-cases for `Join`-engine tables are following: -- Place the table to the right side in a `JOIN` clause. -- Call the [joinGet](/docs/en/sql-reference/functions/other-functions.md/#joinget) function, which lets you extract data from the table the same way as from a dictionary. +- Place the table to the right side in a `JOIN` clause. +- Call the [joinGet](/docs/en/sql-reference/functions/other-functions.md/#joinget) function, which lets you extract data from the table the same way as from a dictionary. ### Deleting Data {#deleting-data} diff --git a/docs/en/engines/table-engines/special/merge.md b/docs/en/engines/table-engines/special/merge.md index ccdb5b5fad7..bd6149406a9 100644 --- a/docs/en/engines/table-engines/special/merge.md +++ b/docs/en/engines/table-engines/special/merge.md @@ -78,11 +78,11 @@ SELECT * FROM WatchLog; ## Virtual Columns {#virtual-columns} -- `_table` — Contains the name of the table from which data was read. Type: [String](../../../sql-reference/data-types/string.md). +- `_table` — Contains the name of the table from which data was read. Type: [String](../../../sql-reference/data-types/string.md). You can set the constant conditions on `_table` in the `WHERE/PREWHERE` clause (for example, `WHERE _table='xyz'`). In this case the read operation is performed only for that tables where the condition on `_table` is satisfied, so the `_table` column acts as an index. **See Also** -- [Virtual columns](../../../engines/table-engines/special/index.md#table_engines-virtual_columns) -- [merge](../../../sql-reference/table-functions/merge.md) table function +- [Virtual columns](../../../engines/table-engines/special/index.md#table_engines-virtual_columns) +- [merge](../../../sql-reference/table-functions/merge.md) table function diff --git a/docs/en/engines/table-engines/special/url.md b/docs/en/engines/table-engines/special/url.md index af8a80c75b0..c2a8d9ce8bf 100644 --- a/docs/en/engines/table-engines/special/url.md +++ b/docs/en/engines/table-engines/special/url.md @@ -91,11 +91,11 @@ SELECT * FROM url_engine_table ## Details of Implementation {#details-of-implementation} -- Reads and writes can be parallel -- Not supported: - - `ALTER` and `SELECT...SAMPLE` operations. - - Indexes. - - Replication. +- Reads and writes can be parallel +- Not supported: + - `ALTER` and `SELECT...SAMPLE` operations. + - Indexes. + - Replication. ## PARTITION BY diff --git a/docs/en/getting-started/example-datasets/nypd_complaint_data.md b/docs/en/getting-started/example-datasets/nypd_complaint_data.md index 154cfa78e53..71c5ce0f179 100644 --- a/docs/en/getting-started/example-datasets/nypd_complaint_data.md +++ b/docs/en/getting-started/example-datasets/nypd_complaint_data.md @@ -380,7 +380,7 @@ decide that we would look at the types of crimes reported over time in the five New York City. These fields might be then included in the `ORDER BY`: | Column | Description (from the data dictionary) | -| ----------- | --------------------------------------------------- | +| ----------- | --------------------------------------------------- | | OFNS_DESC | Description of offense corresponding with key code | | RPT_DT | Date event was reported to police | | BORO_NM | The name of the borough in which the incident occurred | diff --git a/docs/en/getting-started/example-datasets/ontime.md b/docs/en/getting-started/example-datasets/ontime.md index 7a6e78206b9..9efa1afb5c4 100644 --- a/docs/en/getting-started/example-datasets/ontime.md +++ b/docs/en/getting-started/example-datasets/ontime.md @@ -390,9 +390,9 @@ You can also play with the data in Playground, [example](https://play.clickhouse This performance test was created by Vadim Tkachenko. See: -- https://www.percona.com/blog/2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/ -- https://www.percona.com/blog/2009/10/26/air-traffic-queries-in-luciddb/ -- https://www.percona.com/blog/2009/11/02/air-traffic-queries-in-infinidb-early-alpha/ -- https://www.percona.com/blog/2014/04/21/using-apache-hadoop-and-impala-together-with-mysql-for-data-analysis/ -- https://www.percona.com/blog/2016/01/07/apache-spark-with-air-ontime-performance-data/ -- http://nickmakos.blogspot.ru/2012/08/analyzing-air-traffic-performance-with.html +- https://www.percona.com/blog/2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/ +- https://www.percona.com/blog/2009/10/26/air-traffic-queries-in-luciddb/ +- https://www.percona.com/blog/2009/11/02/air-traffic-queries-in-infinidb-early-alpha/ +- https://www.percona.com/blog/2014/04/21/using-apache-hadoop-and-impala-together-with-mysql-for-data-analysis/ +- https://www.percona.com/blog/2016/01/07/apache-spark-with-air-ontime-performance-data/ +- http://nickmakos.blogspot.ru/2012/08/analyzing-air-traffic-performance-with.html diff --git a/docs/en/getting-started/example-datasets/recipes.md b/docs/en/getting-started/example-datasets/recipes.md index 729d3d17015..e0a66022d37 100644 --- a/docs/en/getting-started/example-datasets/recipes.md +++ b/docs/en/getting-started/example-datasets/recipes.md @@ -50,13 +50,13 @@ clickhouse-client --query " This is a showcase how to parse custom CSV, as it requires multiple tunes. Explanation: -- The dataset is in CSV format, but it requires some preprocessing on insertion; we use table function [input](../../sql-reference/table-functions/input.md) to perform preprocessing; -- The structure of CSV file is specified in the argument of the table function `input`; -- The field `num` (row number) is unneeded - we parse it from file and ignore; -- We use `FORMAT CSVWithNames` but the header in CSV will be ignored (by command line parameter `--input_format_with_names_use_header 0`), because the header does not contain the name for the first field; -- File is using only double quotes to enclose CSV strings; some strings are not enclosed in double quotes, and single quote must not be parsed as the string enclosing - that's why we also add the `--format_csv_allow_single_quote 0` parameter; -- Some strings from CSV cannot parse, because they contain `\M/` sequence at the beginning of the value; the only value starting with backslash in CSV can be `\N` that is parsed as SQL NULL. We add `--input_format_allow_errors_num 10` parameter and up to ten malformed records can be skipped; -- There are arrays for ingredients, directions and NER fields; these arrays are represented in unusual form: they are serialized into string as JSON and then placed in CSV - we parse them as String and then use [JSONExtract](../../sql-reference/functions/json-functions.md) function to transform it to Array. +- The dataset is in CSV format, but it requires some preprocessing on insertion; we use table function [input](../../sql-reference/table-functions/input.md) to perform preprocessing; +- The structure of CSV file is specified in the argument of the table function `input`; +- The field `num` (row number) is unneeded - we parse it from file and ignore; +- We use `FORMAT CSVWithNames` but the header in CSV will be ignored (by command line parameter `--input_format_with_names_use_header 0`), because the header does not contain the name for the first field; +- File is using only double quotes to enclose CSV strings; some strings are not enclosed in double quotes, and single quote must not be parsed as the string enclosing - that's why we also add the `--format_csv_allow_single_quote 0` parameter; +- Some strings from CSV cannot parse, because they contain `\M/` sequence at the beginning of the value; the only value starting with backslash in CSV can be `\N` that is parsed as SQL NULL. We add `--input_format_allow_errors_num 10` parameter and up to ten malformed records can be skipped; +- There are arrays for ingredients, directions and NER fields; these arrays are represented in unusual form: they are serialized into string as JSON and then placed in CSV - we parse them as String and then use [JSONExtract](../../sql-reference/functions/json-functions.md) function to transform it to Array. ## Validate the Inserted Data diff --git a/docs/en/getting-started/install.md b/docs/en/getting-started/install.md index 2c0ac70a321..d5c476f08b4 100644 --- a/docs/en/getting-started/install.md +++ b/docs/en/getting-started/install.md @@ -161,11 +161,11 @@ sudo systemctl status clickhouse-keeper #### Packages {#packages} -- `clickhouse-common-static` — Installs ClickHouse compiled binary files. -- `clickhouse-server` — Creates a symbolic link for `clickhouse-server` and installs the default server configuration. -- `clickhouse-client` — Creates a symbolic link for `clickhouse-client` and other client-related tools. and installs client configuration files. -- `clickhouse-common-static-dbg` — Installs ClickHouse compiled binary files with debug info. -- `clickhouse-keeper` - Used to install ClickHouse Keeper on dedicated ClickHouse Keeper nodes. If you are running ClickHouse Keeper on the same server as ClickHouse server, then you do not need to install this package. Installs ClickHouse Keeper and the default ClickHouse Keeper configuration files. +- `clickhouse-common-static` — Installs ClickHouse compiled binary files. +- `clickhouse-server` — Creates a symbolic link for `clickhouse-server` and installs the default server configuration. +- `clickhouse-client` — Creates a symbolic link for `clickhouse-client` and other client-related tools. and installs client configuration files. +- `clickhouse-common-static-dbg` — Installs ClickHouse compiled binary files with debug info. +- `clickhouse-keeper` - Used to install ClickHouse Keeper on dedicated ClickHouse Keeper nodes. If you are running ClickHouse Keeper on the same server as ClickHouse server, then you do not need to install this package. Installs ClickHouse Keeper and the default ClickHouse Keeper configuration files. :::info If you need to install specific version of ClickHouse you have to install all packages with the same version: @@ -429,8 +429,8 @@ We recommend using a minimum of 4GB of RAM to perform non-trivial queries. The C The required volume of RAM generally depends on: -- The complexity of queries. -- The amount of data that is processed in queries. +- The complexity of queries. +- The amount of data that is processed in queries. To calculate the required volume of RAM, you may estimate the size of temporary data for [GROUP BY](/docs/en/sql-reference/statements/select/group-by.md#select-group-by-clause), [DISTINCT](/docs/en/sql-reference/statements/select/distinct.md#select-distinct), [JOIN](/docs/en/sql-reference/statements/select/join.md#select-join) and other operations you use. @@ -442,11 +442,11 @@ The ClickHouse binary requires at least 2.5 GB of disk space for installation. The volume of storage required for your data may be calculated separately based on -- an estimation of the data volume. +- an estimation of the data volume. You can take a sample of the data and get the average size of a row from it. Then multiply the value by the number of rows you plan to store. -- The data compression coefficient. +- The data compression coefficient. To estimate the data compression coefficient, load a sample of your data into ClickHouse, and compare the actual size of the data with the size of the table stored. For example, clickstream data is usually compressed by 6-10 times. diff --git a/docs/en/getting-started/playground.md b/docs/en/getting-started/playground.md index dbb8d46a2fc..6a6d4092177 100644 --- a/docs/en/getting-started/playground.md +++ b/docs/en/getting-started/playground.md @@ -26,8 +26,8 @@ You can make queries to Playground using any HTTP client, for example [curl](htt The queries are executed as a read-only user. It implies some limitations: -- DDL queries are not allowed -- INSERT queries are not allowed +- DDL queries are not allowed +- INSERT queries are not allowed The service also have quotas on its usage. diff --git a/docs/en/interfaces/cli.md b/docs/en/interfaces/cli.md index e3b40d83efe..4ebaaf8a82d 100644 --- a/docs/en/interfaces/cli.md +++ b/docs/en/interfaces/cli.md @@ -148,8 +148,8 @@ Format a query as usual, then place the values that you want to pass from the ap {:} ``` -- `name` — Placeholder identifier. In the console client it should be used in app parameters as `--param_ = value`. -- `data type` — [Data type](../sql-reference/data-types/index.md) of the app parameter value. For example, a data structure like `(integer, ('string', integer))` can have the `Tuple(UInt8, Tuple(String, UInt8))` data type (you can also use another [integer](../sql-reference/data-types/int-uint.md) types). It's also possible to pass table, database, column names as a parameter, in that case you would need to use `Identifier` as a data type. +- `name` — Placeholder identifier. In the console client it should be used in app parameters as `--param_ = value`. +- `data type` — [Data type](../sql-reference/data-types/index.md) of the app parameter value. For example, a data structure like `(integer, ('string', integer))` can have the `Tuple(UInt8, Tuple(String, UInt8))` data type (you can also use another [integer](../sql-reference/data-types/int-uint.md) types). It's also possible to pass table, database, column names as a parameter, in that case you would need to use `Identifier` as a data type. #### Example {#example} @@ -162,37 +162,37 @@ $ clickhouse-client --param_tbl="numbers" --param_db="system" --param_col="numbe You can pass parameters to `clickhouse-client` (all parameters have a default value) using: -- From the Command Line +- From the Command Line Command-line options override the default values and settings in configuration files. -- Configuration files. +- Configuration files. Settings in the configuration files override the default values. ### Command Line Options {#command-line-options} -- `--host, -h` – The server name, ‘localhost’ by default. You can use either the name or the IPv4 or IPv6 address. -- `--port` – The port to connect to. Default value: 9000. Note that the HTTP interface and the native interface use different ports. -- `--user, -u` – The username. Default value: default. -- `--password` – The password. Default value: empty string. -- `--ask-password` - Prompt the user to enter a password. -- `--query, -q` – The query to process when using non-interactive mode. You must specify either `query` or `queries-file` option. -- `--queries-file` – file path with queries to execute. You must specify either `query` or `queries-file` option. -- `--database, -d` – Select the current default database. Default value: the current database from the server settings (‘default’ by default). -- `--multiline, -m` – If specified, allow multiline queries (do not send the query on Enter). -- `--multiquery, -n` – If specified, allow processing multiple queries separated by semicolons. -- `--format, -f` – Use the specified default format to output the result. -- `--vertical, -E` – If specified, use the [Vertical format](../interfaces/formats.md#vertical) by default to output the result. This is the same as `–format=Vertical`. In this format, each value is printed on a separate line, which is helpful when displaying wide tables. -- `--time, -t` – If specified, print the query execution time to ‘stderr’ in non-interactive mode. -- `--stacktrace` – If specified, also print the stack trace if an exception occurs. -- `--config-file` – The name of the configuration file. -- `--secure` – If specified, will connect to server over secure connection (TLS). You might need to configure your CA certificates in the [configuration file](#configuration_files). The available configuration settings are the same as for [server-side TLS configuration](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl). -- `--history_file` — Path to a file containing command history. -- `--param_` — Value for a [query with parameters](#cli-queries-with-parameters). -- `--hardware-utilization` — Print hardware utilization information in progress bar. -- `--print-profile-events` – Print `ProfileEvents` packets. -- `--profile-events-delay-ms` – Delay between printing `ProfileEvents` packets (-1 - print only totals, 0 - print every single packet). +- `--host, -h` – The server name, ‘localhost’ by default. You can use either the name or the IPv4 or IPv6 address. +- `--port` – The port to connect to. Default value: 9000. Note that the HTTP interface and the native interface use different ports. +- `--user, -u` – The username. Default value: default. +- `--password` – The password. Default value: empty string. +- `--ask-password` - Prompt the user to enter a password. +- `--query, -q` – The query to process when using non-interactive mode. You must specify either `query` or `queries-file` option. +- `--queries-file` – file path with queries to execute. You must specify either `query` or `queries-file` option. +- `--database, -d` – Select the current default database. Default value: the current database from the server settings (‘default’ by default). +- `--multiline, -m` – If specified, allow multiline queries (do not send the query on Enter). +- `--multiquery, -n` – If specified, allow processing multiple queries separated by semicolons. +- `--format, -f` – Use the specified default format to output the result. +- `--vertical, -E` – If specified, use the [Vertical format](../interfaces/formats.md#vertical) by default to output the result. This is the same as `–format=Vertical`. In this format, each value is printed on a separate line, which is helpful when displaying wide tables. +- `--time, -t` – If specified, print the query execution time to ‘stderr’ in non-interactive mode. +- `--stacktrace` – If specified, also print the stack trace if an exception occurs. +- `--config-file` – The name of the configuration file. +- `--secure` – If specified, will connect to server over secure connection (TLS). You might need to configure your CA certificates in the [configuration file](#configuration_files). The available configuration settings are the same as for [server-side TLS configuration](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl). +- `--history_file` — Path to a file containing command history. +- `--param_` — Value for a [query with parameters](#cli-queries-with-parameters). +- `--hardware-utilization` — Print hardware utilization information in progress bar. +- `--print-profile-events` – Print `ProfileEvents` packets. +- `--profile-events-delay-ms` – Delay between printing `ProfileEvents` packets (-1 - print only totals, 0 - print every single packet). Since version 20.5, `clickhouse-client` has automatic syntax highlighting (always enabled). @@ -200,10 +200,10 @@ Since version 20.5, `clickhouse-client` has automatic syntax highlighting (alway `clickhouse-client` uses the first existing file of the following: -- Defined in the `--config-file` parameter. -- `./clickhouse-client.xml` -- `~/.clickhouse-client/config.xml` -- `/etc/clickhouse-client/config.xml` +- Defined in the `--config-file` parameter. +- `./clickhouse-client.xml` +- `~/.clickhouse-client/config.xml` +- `/etc/clickhouse-client/config.xml` Example of a config file: diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index a3a23cf830a..de525f0a5a3 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -256,11 +256,11 @@ where `delimiter_i` is a delimiter between values (`$` symbol can be escaped as `column_i` is a name or index of a column whose values are to be selected or inserted (if empty, then column will be skipped), `serializeAs_i` is an escaping rule for the column values. The following escaping rules are supported: -- `CSV`, `JSON`, `XML` (similar to the formats of the same names) -- `Escaped` (similar to `TSV`) -- `Quoted` (similar to `Values`) -- `Raw` (without escaping, similar to `TSVRaw`) -- `None` (no escaping rule, see further) +- `CSV`, `JSON`, `XML` (similar to the formats of the same names) +- `Escaped` (similar to `TSV`) +- `Quoted` (similar to `Values`) +- `Raw` (without escaping, similar to `TSVRaw`) +- `None` (no escaping rule, see further) If an escaping rule is omitted, then `None` will be used. `XML` is suitable only for output. @@ -276,15 +276,15 @@ The `format_template_rows_between_delimiter` setting specifies the delimiter bet Setting `format_template_resultset` specifies the path to the file, which contains a format string for resultset. Format string for resultset has the same syntax as a format string for row and allows to specify a prefix, a suffix and a way to print some additional information. It contains the following placeholders instead of column names: -- `data` is the rows with data in `format_template_row` format, separated by `format_template_rows_between_delimiter`. This placeholder must be the first placeholder in the format string. -- `totals` is the row with total values in `format_template_row` format (when using WITH TOTALS) -- `min` is the row with minimum values in `format_template_row` format (when extremes are set to 1) -- `max` is the row with maximum values in `format_template_row` format (when extremes are set to 1) -- `rows` is the total number of output rows -- `rows_before_limit` is the minimal number of rows there would have been without LIMIT. Output only if the query contains LIMIT. If the query contains GROUP BY, rows_before_limit_at_least is the exact number of rows there would have been without a LIMIT. -- `time` is the request execution time in seconds -- `rows_read` is the number of rows has been read -- `bytes_read` is the number of bytes (uncompressed) has been read +- `data` is the rows with data in `format_template_row` format, separated by `format_template_rows_between_delimiter`. This placeholder must be the first placeholder in the format string. +- `totals` is the row with total values in `format_template_row` format (when using WITH TOTALS) +- `min` is the row with minimum values in `format_template_row` format (when extremes are set to 1) +- `max` is the row with maximum values in `format_template_row` format (when extremes are set to 1) +- `rows` is the total number of output rows +- `rows_before_limit` is the minimal number of rows there would have been without LIMIT. Output only if the query contains LIMIT. If the query contains GROUP BY, rows_before_limit_at_least is the exact number of rows there would have been without a LIMIT. +- `time` is the request execution time in seconds +- `rows_read` is the number of rows has been read +- `bytes_read` is the number of bytes (uncompressed) has been read The placeholders `data`, `totals`, `min` and `max` must not have escaping rule specified (or `None` must be specified explicitly). The remaining placeholders may have any escaping rule specified. If the `format_template_resultset` setting is an empty string, `${data}` is used as the default value. @@ -620,8 +620,8 @@ ClickHouse supports [NULL](/docs/en/sql-reference/syntax.md), which is displayed **See Also** -- [JSONEachRow](#jsoneachrow) format -- [output_format_json_array_of_rows](/docs/en/operations/settings/settings-formats.md/#output_format_json_array_of_rows) setting +- [JSONEachRow](#jsoneachrow) format +- [output_format_json_array_of_rows](/docs/en/operations/settings/settings-formats.md/#output_format_json_array_of_rows) setting For JSON input format, if setting [input_format_json_validate_types_from_metadata](/docs/en/operations/settings/settings-formats.md/#input_format_json_validate_types_from_metadata) is set to 1, the types from metadata in input data will be compared with the types of the corresponding columns from the table. @@ -1131,8 +1131,8 @@ INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021 ClickHouse allows: -- Any order of key-value pairs in the object. -- Omitting some values. +- Any order of key-value pairs in the object. +- Omitting some values. ClickHouse ignores spaces between elements and commas after the objects. You can pass all the objects in one line. You do not have to separate them with line breaks. @@ -1152,8 +1152,8 @@ CREATE TABLE IF NOT EXISTS example_table ) ENGINE = Memory; ``` -- If `input_format_defaults_for_omitted_fields = 0`, then the default value for `x` and `a` equals `0` (as the default value for the `UInt32` data type). -- If `input_format_defaults_for_omitted_fields = 1`, then the default value for `x` equals `0`, but the default value of `a` equals `x * 2`. +- If `input_format_defaults_for_omitted_fields = 0`, then the default value for `x` and `a` equals `0` (as the default value for the `UInt32` data type). +- If `input_format_defaults_for_omitted_fields = 1`, then the default value for `x` equals `0`, but the default value of `a` equals `x * 2`. :::note When inserting data with `input_format_defaults_for_omitted_fields = 1`, ClickHouse consumes more computational resources, compared to insertion with `input_format_defaults_for_omitted_fields = 0`. @@ -1482,8 +1482,8 @@ For [NULL](/docs/en/sql-reference/syntax.md/#null-literal) support, an additiona Similar to [RowBinary](#rowbinary), but with added header: -- [LEB128](https://en.wikipedia.org/wiki/LEB128)-encoded number of columns (N) -- N `String`s specifying column names +- [LEB128](https://en.wikipedia.org/wiki/LEB128)-encoded number of columns (N) +- N `String`s specifying column names :::note If setting [input_format_with_names_use_header](/docs/en/operations/settings/settings-formats.md/#input_format_with_names_use_header) is set to 1, @@ -1495,9 +1495,9 @@ Otherwise, the first row will be skipped. Similar to [RowBinary](#rowbinary), but with added header: -- [LEB128](https://en.wikipedia.org/wiki/LEB128)-encoded number of columns (N) -- N `String`s specifying column names -- N `String`s specifying column types +- [LEB128](https://en.wikipedia.org/wiki/LEB128)-encoded number of columns (N) +- N `String`s specifying column names +- N `String`s specifying column types :::note If setting [input_format_with_names_use_header](/docs/en/operations/settings/settings-formats.md/#input_format_with_names_use_header) is set to 1, @@ -1907,8 +1907,8 @@ $ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro Column names must: -- start with `[A-Za-z_]` -- subsequently contain only `[A-Za-z0-9_]` +- start with `[A-Za-z_]` +- subsequently contain only `[A-Za-z0-9_]` Output Avro file compression and sync interval can be configured with [output_format_avro_codec](/docs/en/operations/settings/settings-formats.md/#output_format_avro_codec) and [output_format_avro_sync_interval](/docs/en/operations/settings/settings-formats.md/#output_format_avro_sync_interval) respectively. @@ -2206,17 +2206,17 @@ Each line of imported data is parsed according to the regular expression. When working with the `Regexp` format, you can use the following settings: -- `format_regexp` — [String](/docs/en/sql-reference/data-types/string.md). Contains regular expression in the [re2](https://github.com/google/re2/wiki/Syntax) format. +- `format_regexp` — [String](/docs/en/sql-reference/data-types/string.md). Contains regular expression in the [re2](https://github.com/google/re2/wiki/Syntax) format. -- `format_regexp_escaping_rule` — [String](/docs/en/sql-reference/data-types/string.md). The following escaping rules are supported: +- `format_regexp_escaping_rule` — [String](/docs/en/sql-reference/data-types/string.md). The following escaping rules are supported: - - CSV (similarly to [CSV](#csv)) - - JSON (similarly to [JSONEachRow](#jsoneachrow)) - - Escaped (similarly to [TSV](#tabseparated)) - - Quoted (similarly to [Values](#data-format-values)) - - Raw (extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](#tabseparatedraw)) + - CSV (similarly to [CSV](#csv)) + - JSON (similarly to [JSONEachRow](#jsoneachrow)) + - Escaped (similarly to [TSV](#tabseparated)) + - Quoted (similarly to [Values](#data-format-values)) + - Raw (extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](#tabseparatedraw)) -- `format_regexp_skip_unmatched` — [UInt8](/docs/en/sql-reference/data-types/int-uint.md). Defines the need to throw an exception in case the `format_regexp` expression does not match the imported data. Can be set to `0` or `1`. +- `format_regexp_skip_unmatched` — [UInt8](/docs/en/sql-reference/data-types/int-uint.md). Defines the need to throw an exception in case the `format_regexp` expression does not match the imported data. Can be set to `0` or `1`. **Usage** diff --git a/docs/en/interfaces/grpc.md b/docs/en/interfaces/grpc.md index 807663be646..3087ad20eac 100644 --- a/docs/en/interfaces/grpc.md +++ b/docs/en/interfaces/grpc.md @@ -10,14 +10,14 @@ sidebar_label: gRPC Interface ClickHouse supports [gRPC](https://grpc.io/) interface. It is an open source remote procedure call system that uses HTTP/2 and [Protocol Buffers](https://en.wikipedia.org/wiki/Protocol_Buffers). The implementation of gRPC in ClickHouse supports: -- SSL; -- authentication; -- sessions; -- compression; -- parallel queries through the same channel; -- cancellation of queries; -- getting progress and logs; -- external tables. +- SSL; +- authentication; +- sessions; +- compression; +- parallel queries through the same channel; +- cancellation of queries; +- getting progress and logs; +- external tables. The specification of the interface is described in [clickhouse_grpc.proto](https://github.com/ClickHouse/ClickHouse/blob/master/src/Server/grpc_protos/clickhouse_grpc.proto). @@ -64,15 +64,15 @@ Or you can use a built-in Python client. It is placed in [utils/grpc-client/clic The client supports the following arguments: -- `--help` – Shows a help message and exits. -- `--host HOST, -h HOST` – A server name. Default value: `localhost`. You can use IPv4 or IPv6 addresses also. -- `--port PORT` – A port to connect to. This port should be enabled in the ClickHouse server configuration (see `grpc_port`). Default value: `9100`. -- `--user USER_NAME, -u USER_NAME` – A user name. Default value: `default`. -- `--password PASSWORD` – A password. Default value: empty string. -- `--query QUERY, -q QUERY` – A query to process when using non-interactive mode. -- `--database DATABASE, -d DATABASE` – A default database. If not specified, the current database set in the server settings is used (`default` by default). -- `--format OUTPUT_FORMAT, -f OUTPUT_FORMAT` – A result output [format](formats.md). Default value for interactive mode: `PrettyCompact`. -- `--debug` – Enables showing debug information. +- `--help` – Shows a help message and exits. +- `--host HOST, -h HOST` – A server name. Default value: `localhost`. You can use IPv4 or IPv6 addresses also. +- `--port PORT` – A port to connect to. This port should be enabled in the ClickHouse server configuration (see `grpc_port`). Default value: `9100`. +- `--user USER_NAME, -u USER_NAME` – A user name. Default value: `default`. +- `--password PASSWORD` – A password. Default value: empty string. +- `--query QUERY, -q QUERY` – A query to process when using non-interactive mode. +- `--database DATABASE, -d DATABASE` – A default database. If not specified, the current database set in the server settings is used (`default` by default). +- `--format OUTPUT_FORMAT, -f OUTPUT_FORMAT` – A result output [format](formats.md). Default value for interactive mode: `PrettyCompact`. +- `--debug` – Enables showing debug information. To run the client in an interactive mode call it without `--query` argument. diff --git a/docs/en/interfaces/http.md b/docs/en/interfaces/http.md index 710c23a3dd9..3a7f6d4d854 100644 --- a/docs/en/interfaces/http.md +++ b/docs/en/interfaces/http.md @@ -293,11 +293,11 @@ X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_ro Possible header fields: -- `read_rows` — Number of rows read. -- `read_bytes` — Volume of data read in bytes. -- `total_rows_to_read` — Total number of rows to be read. -- `written_rows` — Number of rows written. -- `written_bytes` — Volume of data written in bytes. +- `read_rows` — Number of rows read. +- `read_bytes` — Volume of data read in bytes. +- `total_rows_to_read` — Total number of rows to be read. +- `written_rows` — Number of rows written. +- `written_bytes` — Volume of data written in bytes. Running requests do not stop automatically if the HTTP connection is lost. Parsing and data formatting are performed on the server-side, and using the network might be ineffective. The optional ‘query_id’ parameter can be passed as the query ID (any string). For more information, see the section “Settings, replace_running_query”. @@ -374,7 +374,7 @@ ClickHouse also supports Predefined HTTP Interface which can help you more easil Example: -- First of all, add this section to server configuration file: +- First of all, add this section to server configuration file: @@ -393,7 +393,7 @@ Example: ``` -- You can now request the URL directly for data in the Prometheus format: +- You can now request the URL directly for data in the Prometheus format: @@ -448,22 +448,22 @@ As you can see from the example if `http_handlers` is configured in the config.x Now `rule` can configure `method`, `headers`, `url`, `handler`: - `method` is responsible for matching the method part of the HTTP request. `method` fully conforms to the definition of [method](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) in the HTTP protocol. It is an optional configuration. If it is not defined in the configuration file, it does not match the method portion of the HTTP request. -- `url` is responsible for matching the URL part of the HTTP request. It is compatible with [RE2](https://github.com/google/re2)’s regular expressions. It is an optional configuration. If it is not defined in the configuration file, it does not match the URL portion of the HTTP request. +- `url` is responsible for matching the URL part of the HTTP request. It is compatible with [RE2](https://github.com/google/re2)’s regular expressions. It is an optional configuration. If it is not defined in the configuration file, it does not match the URL portion of the HTTP request. -- `headers` are responsible for matching the header part of the HTTP request. It is compatible with RE2’s regular expressions. It is an optional configuration. If it is not defined in the configuration file, it does not match the header portion of the HTTP request. +- `headers` are responsible for matching the header part of the HTTP request. It is compatible with RE2’s regular expressions. It is an optional configuration. If it is not defined in the configuration file, it does not match the header portion of the HTTP request. -- `handler` contains the main processing part. Now `handler` can configure `type`, `status`, `content_type`, `response_content`, `query`, `query_param_name`. +- `handler` contains the main processing part. Now `handler` can configure `type`, `status`, `content_type`, `response_content`, `query`, `query_param_name`. `type` currently supports three types: [predefined_query_handler](#predefined_query_handler), [dynamic_query_handler](#dynamic_query_handler), [static](#static). - - `query` — use with `predefined_query_handler` type, executes query when the handler is called. + - `query` — use with `predefined_query_handler` type, executes query when the handler is called. - - `query_param_name` — use with `dynamic_query_handler` type, extracts and executes the value corresponding to the `query_param_name` value in HTTP request parameters. + - `query_param_name` — use with `dynamic_query_handler` type, extracts and executes the value corresponding to the `query_param_name` value in HTTP request parameters. - - `status` — use with `static` type, response status code. + - `status` — use with `static` type, response status code. - - `content_type` — use with any type, response [content-type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type). + - `content_type` — use with any type, response [content-type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type). - - `response_content` — use with `static` type, response content sent to client, when using the prefix ‘file://’ or ‘config://’, find the content from the file or configuration sends to client. + - `response_content` — use with `static` type, response content sent to client, when using the prefix ‘file://’ or ‘config://’, find the content from the file or configuration sends to client. Next are the configuration methods for different `type`. diff --git a/docs/en/interfaces/jdbc.md b/docs/en/interfaces/jdbc.md index b2ff2829af9..2b68316cc3d 100644 --- a/docs/en/interfaces/jdbc.md +++ b/docs/en/interfaces/jdbc.md @@ -8,6 +8,6 @@ sidebar_label: JDBC Driver Use the [official JDBC driver](https://github.com/ClickHouse/clickhouse-jdbc) (and Java client) to access ClickHouse from your Java applications. -- Third-party drivers: - - [ClickHouse-Native-JDBC](https://github.com/housepower/ClickHouse-Native-JDBC) - - [clickhouse4j](https://github.com/blynkkk/clickhouse4j) +- Third-party drivers: + - [ClickHouse-Native-JDBC](https://github.com/housepower/ClickHouse-Native-JDBC) + - [clickhouse4j](https://github.com/blynkkk/clickhouse4j) diff --git a/docs/en/interfaces/mysql.md b/docs/en/interfaces/mysql.md index c2d6038125b..fab3ba42758 100644 --- a/docs/en/interfaces/mysql.md +++ b/docs/en/interfaces/mysql.md @@ -57,9 +57,9 @@ If user password is specified using [SHA256](../operations/settings/settings-use Restrictions: -- prepared queries are not supported +- prepared queries are not supported -- some data types are sent as strings +- some data types are sent as strings To cancel a long query use `KILL QUERY connection_id` statement (it is replaced with `KILL QUERY WHERE query_id = connection_id` while proceeding). For example: diff --git a/docs/en/interfaces/overview.md b/docs/en/interfaces/overview.md index ee47e010f9e..8f16dcf5f83 100644 --- a/docs/en/interfaces/overview.md +++ b/docs/en/interfaces/overview.md @@ -10,19 +10,19 @@ description: ClickHouse provides three network interfaces ClickHouse provides three network interfaces (they can be optionally wrapped in TLS for additional security): -- [HTTP](http.md), which is documented and easy to use directly. -- [Native TCP](../interfaces/tcp.md), which has less overhead. -- [gRPC](grpc.md). +- [HTTP](http.md), which is documented and easy to use directly. +- [Native TCP](../interfaces/tcp.md), which has less overhead. +- [gRPC](grpc.md). In most cases it is recommended to use an appropriate tool or library instead of interacting with those directly. The following are officially supported by ClickHouse: -- [Command-line client](../interfaces/cli.md) -- [JDBC driver](../interfaces/jdbc.md) -- [ODBC driver](../interfaces/odbc.md) -- [C++ client library](../interfaces/cpp.md) +- [Command-line client](../interfaces/cli.md) +- [JDBC driver](../interfaces/jdbc.md) +- [ODBC driver](../interfaces/odbc.md) +- [C++ client library](../interfaces/cpp.md) There are also a wide range of third-party libraries for working with ClickHouse: -- [Client libraries](../interfaces/third-party/client-libraries.md) -- [Integrations](../interfaces/third-party/integrations.md) -- [Visual interfaces](../interfaces/third-party/gui.md) +- [Client libraries](../interfaces/third-party/client-libraries.md) +- [Integrations](../interfaces/third-party/integrations.md) +- [Visual interfaces](../interfaces/third-party/gui.md) diff --git a/docs/en/interfaces/third-party/client-libraries.md b/docs/en/interfaces/third-party/client-libraries.md index 1069a04391f..f7603994163 100644 --- a/docs/en/interfaces/third-party/client-libraries.md +++ b/docs/en/interfaces/third-party/client-libraries.md @@ -10,68 +10,68 @@ sidebar_label: Client Libraries ClickHouse Inc does **not** maintain the libraries listed below and hasn’t done any extensive testing to ensure their quality. ::: -- Python - - [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm) - - [clickhouse-driver](https://github.com/mymarilyn/clickhouse-driver) - - [clickhouse-client](https://github.com/yurial/clickhouse-client) - - [aiochclient](https://github.com/maximdanilchenko/aiochclient) - - [asynch](https://github.com/long2ice/asynch) -- PHP - - [smi2/phpclickhouse](https://packagist.org/packages/smi2/phpClickHouse) - - [8bitov/clickhouse-php-client](https://packagist.org/packages/8bitov/clickhouse-php-client) - - [bozerkins/clickhouse-client](https://packagist.org/packages/bozerkins/clickhouse-client) - - [simpod/clickhouse-client](https://packagist.org/packages/simpod/clickhouse-client) - - [seva-code/php-click-house-client](https://packagist.org/packages/seva-code/php-click-house-client) - - [SeasClick C++ client](https://github.com/SeasX/SeasClick) - - [one-ck](https://github.com/lizhichao/one-ck) - - [glushkovds/phpclickhouse-laravel](https://packagist.org/packages/glushkovds/phpclickhouse-laravel) - - [kolya7k ClickHouse PHP extension](https://github.com//kolya7k/clickhouse-php) - - [hyvor/clickhouse-php](https://github.com/hyvor/clickhouse-php) -- Go - - [clickhouse](https://github.com/kshvakov/clickhouse/) - - [go-clickhouse](https://github.com/roistat/go-clickhouse) - - [chconn](https://github.com/vahid-sohrabloo/chconn) - - [mailrugo-clickhouse](https://github.com/mailru/go-clickhouse) - - [golang-clickhouse](https://github.com/leprosus/golang-clickhouse) - - [uptrace/go-clickhouse](https://clickhouse.uptrace.dev/) -- Swift - - [ClickHouseNIO](https://github.com/patrick-zippenfenig/ClickHouseNIO) - - [ClickHouseVapor ORM](https://github.com/patrick-zippenfenig/ClickHouseVapor) -- NodeJs - - [clickhouse (NodeJs)](https://github.com/TimonKK/clickhouse) - - [node-clickhouse](https://github.com/apla/node-clickhouse) - - [nestjs-clickhouse](https://github.com/depyronick/nestjs-clickhouse) - - [clickhouse-client](https://github.com/depyronick/clickhouse-client) - - [node-clickhouse-orm](https://github.com/zimv/node-clickhouse-orm) -- Perl - - [perl-DBD-ClickHouse](https://github.com/elcamlost/perl-DBD-ClickHouse) - - [HTTP-ClickHouse](https://metacpan.org/release/HTTP-ClickHouse) - - [AnyEvent-ClickHouse](https://metacpan.org/release/AnyEvent-ClickHouse) -- Ruby - - [ClickHouse (Ruby)](https://github.com/shlima/click_house) - - [clickhouse-activerecord](https://github.com/PNixx/clickhouse-activerecord) -- Rust - - [clickhouse.rs](https://github.com/loyd/clickhouse.rs) - - [clickhouse-rs](https://github.com/suharev7/clickhouse-rs) - - [Klickhouse](https://github.com/Protryon/klickhouse) -- R - - [RClickHouse](https://github.com/IMSMWU/RClickHouse) -- Java - - [clickhouse-client-java](https://github.com/VirtusAI/clickhouse-client-java) - - [clickhouse-client](https://github.com/Ecwid/clickhouse-client) -- Scala - - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) -- Kotlin - - [AORM](https://github.com/TanVD/AORM) -- C# - - [Octonica.ClickHouseClient](https://github.com/Octonica/ClickHouseClient) - - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) - - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) - - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) -- Elixir - - [clickhousex](https://github.com/appodeal/clickhousex/) - - [pillar](https://github.com/sofakingworld/pillar) -- Nim - - [nim-clickhouse](https://github.com/leonardoce/nim-clickhouse) -- Haskell - - [hdbc-clickhouse](https://github.com/zaneli/hdbc-clickhouse) +- Python + - [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm) + - [clickhouse-driver](https://github.com/mymarilyn/clickhouse-driver) + - [clickhouse-client](https://github.com/yurial/clickhouse-client) + - [aiochclient](https://github.com/maximdanilchenko/aiochclient) + - [asynch](https://github.com/long2ice/asynch) +- PHP + - [smi2/phpclickhouse](https://packagist.org/packages/smi2/phpClickHouse) + - [8bitov/clickhouse-php-client](https://packagist.org/packages/8bitov/clickhouse-php-client) + - [bozerkins/clickhouse-client](https://packagist.org/packages/bozerkins/clickhouse-client) + - [simpod/clickhouse-client](https://packagist.org/packages/simpod/clickhouse-client) + - [seva-code/php-click-house-client](https://packagist.org/packages/seva-code/php-click-house-client) + - [SeasClick C++ client](https://github.com/SeasX/SeasClick) + - [one-ck](https://github.com/lizhichao/one-ck) + - [glushkovds/phpclickhouse-laravel](https://packagist.org/packages/glushkovds/phpclickhouse-laravel) + - [kolya7k ClickHouse PHP extension](https://github.com//kolya7k/clickhouse-php) + - [hyvor/clickhouse-php](https://github.com/hyvor/clickhouse-php) +- Go + - [clickhouse](https://github.com/kshvakov/clickhouse/) + - [go-clickhouse](https://github.com/roistat/go-clickhouse) + - [chconn](https://github.com/vahid-sohrabloo/chconn) + - [mailrugo-clickhouse](https://github.com/mailru/go-clickhouse) + - [golang-clickhouse](https://github.com/leprosus/golang-clickhouse) + - [uptrace/go-clickhouse](https://clickhouse.uptrace.dev/) +- Swift + - [ClickHouseNIO](https://github.com/patrick-zippenfenig/ClickHouseNIO) + - [ClickHouseVapor ORM](https://github.com/patrick-zippenfenig/ClickHouseVapor) +- NodeJs + - [clickhouse (NodeJs)](https://github.com/TimonKK/clickhouse) + - [node-clickhouse](https://github.com/apla/node-clickhouse) + - [nestjs-clickhouse](https://github.com/depyronick/nestjs-clickhouse) + - [clickhouse-client](https://github.com/depyronick/clickhouse-client) + - [node-clickhouse-orm](https://github.com/zimv/node-clickhouse-orm) +- Perl + - [perl-DBD-ClickHouse](https://github.com/elcamlost/perl-DBD-ClickHouse) + - [HTTP-ClickHouse](https://metacpan.org/release/HTTP-ClickHouse) + - [AnyEvent-ClickHouse](https://metacpan.org/release/AnyEvent-ClickHouse) +- Ruby + - [ClickHouse (Ruby)](https://github.com/shlima/click_house) + - [clickhouse-activerecord](https://github.com/PNixx/clickhouse-activerecord) +- Rust + - [clickhouse.rs](https://github.com/loyd/clickhouse.rs) + - [clickhouse-rs](https://github.com/suharev7/clickhouse-rs) + - [Klickhouse](https://github.com/Protryon/klickhouse) +- R + - [RClickHouse](https://github.com/IMSMWU/RClickHouse) +- Java + - [clickhouse-client-java](https://github.com/VirtusAI/clickhouse-client-java) + - [clickhouse-client](https://github.com/Ecwid/clickhouse-client) +- Scala + - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) +- Kotlin + - [AORM](https://github.com/TanVD/AORM) +- C# + - [Octonica.ClickHouseClient](https://github.com/Octonica/ClickHouseClient) + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) +- Elixir + - [clickhousex](https://github.com/appodeal/clickhousex/) + - [pillar](https://github.com/sofakingworld/pillar) +- Nim + - [nim-clickhouse](https://github.com/leonardoce/nim-clickhouse) +- Haskell + - [hdbc-clickhouse](https://github.com/zaneli/hdbc-clickhouse) diff --git a/docs/en/interfaces/third-party/gui.md b/docs/en/interfaces/third-party/gui.md index cba6240788a..900764b8128 100644 --- a/docs/en/interfaces/third-party/gui.md +++ b/docs/en/interfaces/third-party/gui.md @@ -14,11 +14,11 @@ Web interface for ClickHouse in the [Tabix](https://github.com/tabixio/tabix) pr Features: -- Works with ClickHouse directly from the browser, without the need to install additional software. -- Query editor with syntax highlighting. -- Auto-completion of commands. -- Tools for graphical analysis of query execution. -- Colour scheme options. +- Works with ClickHouse directly from the browser, without the need to install additional software. +- Query editor with syntax highlighting. +- Auto-completion of commands. +- Tools for graphical analysis of query execution. +- Colour scheme options. [Tabix documentation](https://tabix.io/doc/). @@ -28,21 +28,21 @@ Features: Features: -- Query builder with syntax highlighting. View the response in a table or JSON view. -- Export query results as CSV or JSON. -- List of processes with descriptions. Write mode. Ability to stop (`KILL`) a process. -- Database graph. Shows all tables and their columns with additional information. -- A quick view of the column size. -- Server configuration. +- Query builder with syntax highlighting. View the response in a table or JSON view. +- Export query results as CSV or JSON. +- List of processes with descriptions. Write mode. Ability to stop (`KILL`) a process. +- Database graph. Shows all tables and their columns with additional information. +- A quick view of the column size. +- Server configuration. The following features are planned for development: -- Database management. -- User management. -- Real-time data analysis. -- Cluster monitoring. -- Cluster management. -- Monitoring replicated and Kafka tables. +- Database management. +- User management. +- Real-time data analysis. +- Cluster monitoring. +- Cluster management. +- Monitoring replicated and Kafka tables. ### LightHouse {#lighthouse} @@ -50,9 +50,9 @@ The following features are planned for development: Features: -- Table list with filtering and metadata. -- Table preview with filtering and sorting. -- Read-only queries execution. +- Table list with filtering and metadata. +- Table preview with filtering and sorting. +- Read-only queries execution. ### Redash {#redash} @@ -62,9 +62,9 @@ Supports for multiple data sources including ClickHouse, Redash can join results Features: -- Powerful editor of queries. -- Database explorer. -- Visualization tools, that allow you to represent data in different forms. +- Powerful editor of queries. +- Database explorer. +- Visualization tools, that allow you to represent data in different forms. ### Grafana {#grafana} @@ -92,10 +92,10 @@ Features: Features: -- Query development with syntax highlight and autocompletion. -- Table list with filters and metadata search. -- Table data preview. -- Full-text search. +- Query development with syntax highlight and autocompletion. +- Table list with filters and metadata search. +- Table data preview. +- Full-text search. By default, DBeaver does not connect using a session (the CLI for example does). If you require session support (for example to set settings for your session), edit the driver connection properties and set `session_id` to a random string (it uses the http connection under the hood). Then you can use any setting from the query window. @@ -105,10 +105,10 @@ By default, DBeaver does not connect using a session (the CLI for example does). Features: -- Autocompletion. -- Syntax highlighting for the queries and data output. -- Pager support for the data output. -- Custom PostgreSQL-like commands. +- Autocompletion. +- Syntax highlighting for the queries and data output. +- Pager support for the data output. +- Custom PostgreSQL-like commands. ### clickhouse-flamegraph {#clickhouse-flamegraph} @@ -132,15 +132,15 @@ Features: Features: -- Support query history (pagination, clear all, etc.) -- Support selected sql clauses query -- Support terminating query -- Support table management (metadata, delete, preview) -- Support database management (delete, create) -- Support custom query -- Support multiple data sources management(connection test, monitoring) -- Support monitor (processor, connection, query) -- Support migrate data +- Support query history (pagination, clear all, etc.) +- Support selected sql clauses query +- Support terminating query +- Support table management (metadata, delete, preview) +- Support database management (delete, create) +- Support custom query +- Support multiple data sources management(connection test, monitoring) +- Support monitor (processor, connection, query) +- Support migrate data ### Bytebase {#bytebase} @@ -148,13 +148,13 @@ Features: Features: -- Schema review between developers and DBAs. -- Database-as-Code, version control the schema in VCS such GitLab and trigger the deployment upon code commit. -- Streamlined deployment with per-environment policy. -- Full migration history. -- Schema drift detection. -- Backup and restore. -- RBAC. +- Schema review between developers and DBAs. +- Database-as-Code, version control the schema in VCS such GitLab and trigger the deployment upon code commit. +- Streamlined deployment with per-environment policy. +- Full migration history. +- Schema drift detection. +- Backup and restore. +- RBAC. ### Zeppelin-Interpreter-for-ClickHouse {#zeppelin-interpreter-for-clickhouse} @@ -166,9 +166,9 @@ Features: Features: -- An online SQL editor which can run your SQL code without any installing. -- You can observe all processes and mutations. For those unfinished processes, you can kill them in ui. -- The Metrics contains Cluster Analysis,Data Analysis,Query Analysis. +- An online SQL editor which can run your SQL code without any installing. +- You can observe all processes and mutations. For those unfinished processes, you can kill them in ui. +- The Metrics contains Cluster Analysis,Data Analysis,Query Analysis. ### ClickVisual {#clickvisual} @@ -218,12 +218,12 @@ Features: Features: -- Very fast code completion. -- ClickHouse syntax highlighting. -- Support for features specific to ClickHouse, for example, nested columns, table engines. -- Data Editor. -- Refactorings. -- Search and Navigation. +- Very fast code completion. +- ClickHouse syntax highlighting. +- Support for features specific to ClickHouse, for example, nested columns, table engines. +- Data Editor. +- Refactorings. +- Search and Navigation. ### Yandex DataLens {#yandex-datalens} @@ -231,15 +231,15 @@ Features: Features: -- Wide range of available visualizations, from simple bar charts to complex dashboards. -- Dashboards could be made publicly available. -- Support for multiple data sources including ClickHouse. -- Storage for materialized data based on ClickHouse. +- Wide range of available visualizations, from simple bar charts to complex dashboards. +- Dashboards could be made publicly available. +- Support for multiple data sources including ClickHouse. +- Storage for materialized data based on ClickHouse. DataLens is [available for free](https://cloud.yandex.com/docs/datalens/pricing) for low-load projects, even for commercial use. -- [DataLens documentation](https://cloud.yandex.com/docs/datalens/). -- [Tutorial](https://cloud.yandex.com/docs/solutions/datalens/data-from-ch-visualization) on visualizing data from a ClickHouse database. +- [DataLens documentation](https://cloud.yandex.com/docs/datalens/). +- [Tutorial](https://cloud.yandex.com/docs/solutions/datalens/data-from-ch-visualization) on visualizing data from a ClickHouse database. ### Holistics Software {#holistics-software} @@ -247,11 +247,11 @@ DataLens is [available for free](https://cloud.yandex.com/docs/datalens/pricing) Features: -- Automated email, Slack and Google Sheet schedules of reports. -- SQL editor with visualizations, version control, auto-completion, reusable query components and dynamic filters. -- Embedded analytics of reports and dashboards via iframe. -- Data preparation and ETL capabilities. -- SQL data modelling support for relational mapping of data. +- Automated email, Slack and Google Sheet schedules of reports. +- SQL editor with visualizations, version control, auto-completion, reusable query components and dynamic filters. +- Embedded analytics of reports and dashboards via iframe. +- Data preparation and ETL capabilities. +- SQL data modelling support for relational mapping of data. ### Looker {#looker} @@ -260,9 +260,9 @@ to integrate data with other applications. Features: -- Easy and agile development using LookML, a language which supports curated +- Easy and agile development using LookML, a language which supports curated [Data Modeling](https://looker.com/platform/data-modeling) to support report writers and end-users. -- Powerful workflow integration via Looker’s [Data Actions](https://looker.com/platform/actions). +- Powerful workflow integration via Looker’s [Data Actions](https://looker.com/platform/actions). [How to configure ClickHouse in Looker.](https://docs.looker.com/setup-and-management/database-config/clickhouse) @@ -272,12 +272,12 @@ Features: Features: -- Business users-friendly reports builder. -- Powerful report parameters for SQL filtering and report-specific query customizations. -- Can connect to ClickHouse both with a native TCP/IP endpoint and a HTTP(S) interface (2 different drivers). -- It is possible to use all power of ClickHouse SQL dialect in dimensions/measures definitions. -- [Web API](https://www.seektable.com/help/web-api-integration) for automated reports generation. -- Supports reports development flow with account data [backup/restore](https://www.seektable.com/help/self-hosted-backup-restore); data models (cubes) / reports configuration is a human-readable XML and can be stored under version control system. +- Business users-friendly reports builder. +- Powerful report parameters for SQL filtering and report-specific query customizations. +- Can connect to ClickHouse both with a native TCP/IP endpoint and a HTTP(S) interface (2 different drivers). +- It is possible to use all power of ClickHouse SQL dialect in dimensions/measures definitions. +- [Web API](https://www.seektable.com/help/web-api-integration) for automated reports generation. +- Supports reports development flow with account data [backup/restore](https://www.seektable.com/help/self-hosted-backup-restore); data models (cubes) / reports configuration is a human-readable XML and can be stored under version control system. SeekTable is [free](https://www.seektable.com/help/cloud-pricing) for personal/individual usage. diff --git a/docs/en/interfaces/third-party/index.md b/docs/en/interfaces/third-party/index.md index ad5ed0650a5..adb673d1ff8 100644 --- a/docs/en/interfaces/third-party/index.md +++ b/docs/en/interfaces/third-party/index.md @@ -8,10 +8,10 @@ sidebar_position: 24 This is a collection of links to third-party tools that provide some sort of interface to ClickHouse. It can be either visual interface, command-line interface or an API: -- [Client libraries](../../interfaces/third-party/client-libraries.md) -- [Integrations](../../interfaces/third-party/integrations.md) -- [GUI](../../interfaces/third-party/gui.md) -- [Proxies](../../interfaces/third-party/proxy.md) +- [Client libraries](../../interfaces/third-party/client-libraries.md) +- [Integrations](../../interfaces/third-party/integrations.md) +- [GUI](../../interfaces/third-party/gui.md) +- [Proxies](../../interfaces/third-party/proxy.md) :::note Generic tools that support common API like [ODBC](../../interfaces/odbc.md) or [JDBC](../../interfaces/jdbc.md) usually can work with ClickHouse as well, but are not listed here because there are way too many of them. diff --git a/docs/en/interfaces/third-party/integrations.md b/docs/en/interfaces/third-party/integrations.md index a089b3eff17..3e1b1e84f5d 100644 --- a/docs/en/interfaces/third-party/integrations.md +++ b/docs/en/interfaces/third-party/integrations.md @@ -12,104 +12,104 @@ ClickHouse, Inc. does **not** maintain the tools and libraries listed below and ## Infrastructure Products {#infrastructure-products} -- Relational database management systems - - [MySQL](https://www.mysql.com) - - [mysql2ch](https://github.com/long2ice/mysql2ch) - - [ProxySQL](https://github.com/sysown/proxysql/wiki/ClickHouse-Support) - - [clickhouse-mysql-data-reader](https://github.com/Altinity/clickhouse-mysql-data-reader) - - [horgh-replicator](https://github.com/larsnovikov/horgh-replicator) - - [PostgreSQL](https://www.postgresql.org) - - [clickhousedb_fdw](https://github.com/Percona-Lab/clickhousedb_fdw) - - [infi.clickhouse_fdw](https://github.com/Infinidat/infi.clickhouse_fdw) (uses [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) - - [pg2ch](https://github.com/mkabilov/pg2ch) - - [clickhouse_fdw](https://github.com/adjust/clickhouse_fdw) - - [MSSQL](https://en.wikipedia.org/wiki/Microsoft_SQL_Server) - - [ClickHouseMigrator](https://github.com/zlzforever/ClickHouseMigrator) -- Message queues - - [Kafka](https://kafka.apache.org) - - [clickhouse_sinker](https://github.com/housepower/clickhouse_sinker) (uses [Go client](https://github.com/ClickHouse/clickhouse-go/)) - - [stream-loader-clickhouse](https://github.com/adform/stream-loader) -- Batch processing - - [Spark](https://spark.apache.org) - - [spark-clickhouse-connector](https://github.com/housepower/spark-clickhouse-connector) -- Stream processing - - [Flink](https://flink.apache.org) - - [flink-clickhouse-sink](https://github.com/ivi-ru/flink-clickhouse-sink) -- Object storages - - [S3](https://en.wikipedia.org/wiki/Amazon_S3) - - [clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup) -- Container orchestration - - [Kubernetes](https://kubernetes.io) - - [clickhouse-operator](https://github.com/Altinity/clickhouse-operator) -- Configuration management - - [puppet](https://puppet.com) - - [innogames/clickhouse](https://forge.puppet.com/innogames/clickhouse) - - [mfedotov/clickhouse](https://forge.puppet.com/mfedotov/clickhouse) -- Monitoring - - [Graphite](https://graphiteapp.org) - - [graphouse](https://github.com/ClickHouse/graphouse) - - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) - - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) - - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - optimizes staled partitions in [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) if rules from [rollup configuration](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) could be applied - - [Grafana](https://grafana.com/) - - [clickhouse-grafana](https://github.com/Vertamedia/clickhouse-grafana) - - [Prometheus](https://prometheus.io/) - - [clickhouse_exporter](https://github.com/f1yegor/clickhouse_exporter) - - [PromHouse](https://github.com/Percona-Lab/PromHouse) - - [clickhouse_exporter](https://github.com/hot-wifi/clickhouse_exporter) (uses [Go client](https://github.com/kshvakov/clickhouse/)) - - [Nagios](https://www.nagios.org/) - - [check_clickhouse](https://github.com/exogroup/check_clickhouse/) - - [check_clickhouse.py](https://github.com/innogames/igmonplugins/blob/master/src/check_clickhouse.py) - - [Zabbix](https://www.zabbix.com) - - [clickhouse-zabbix-template](https://github.com/Altinity/clickhouse-zabbix-template) - - [Sematext](https://sematext.com/) - - [clickhouse integration](https://github.com/sematext/sematext-agent-integrations/tree/master/clickhouse) -- Logging - - [rsyslog](https://www.rsyslog.com/) - - [omclickhouse](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html) - - [fluentd](https://www.fluentd.org) - - [loghouse](https://github.com/flant/loghouse) (for [Kubernetes](https://kubernetes.io)) - - [logagent](https://www.sematext.com/logagent) - - [logagent output-plugin-clickhouse](https://sematext.com/docs/logagent/output-plugin-clickhouse/) -- Geo - - [MaxMind](https://dev.maxmind.com/geoip/) - - [clickhouse-maxmind-geoip](https://github.com/AlexeyKupershtokh/clickhouse-maxmind-geoip) -- AutoML - - [MindsDB](https://mindsdb.com/) - - [MindsDB](https://github.com/mindsdb/mindsdb) - Predictive AI layer for ClickHouse database. +- Relational database management systems + - [MySQL](https://www.mysql.com) + - [mysql2ch](https://github.com/long2ice/mysql2ch) + - [ProxySQL](https://github.com/sysown/proxysql/wiki/ClickHouse-Support) + - [clickhouse-mysql-data-reader](https://github.com/Altinity/clickhouse-mysql-data-reader) + - [horgh-replicator](https://github.com/larsnovikov/horgh-replicator) + - [PostgreSQL](https://www.postgresql.org) + - [clickhousedb_fdw](https://github.com/Percona-Lab/clickhousedb_fdw) + - [infi.clickhouse_fdw](https://github.com/Infinidat/infi.clickhouse_fdw) (uses [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [pg2ch](https://github.com/mkabilov/pg2ch) + - [clickhouse_fdw](https://github.com/adjust/clickhouse_fdw) + - [MSSQL](https://en.wikipedia.org/wiki/Microsoft_SQL_Server) + - [ClickHouseMigrator](https://github.com/zlzforever/ClickHouseMigrator) +- Message queues + - [Kafka](https://kafka.apache.org) + - [clickhouse_sinker](https://github.com/housepower/clickhouse_sinker) (uses [Go client](https://github.com/ClickHouse/clickhouse-go/)) + - [stream-loader-clickhouse](https://github.com/adform/stream-loader) +- Batch processing + - [Spark](https://spark.apache.org) + - [spark-clickhouse-connector](https://github.com/housepower/spark-clickhouse-connector) +- Stream processing + - [Flink](https://flink.apache.org) + - [flink-clickhouse-sink](https://github.com/ivi-ru/flink-clickhouse-sink) +- Object storages + - [S3](https://en.wikipedia.org/wiki/Amazon_S3) + - [clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup) +- Container orchestration + - [Kubernetes](https://kubernetes.io) + - [clickhouse-operator](https://github.com/Altinity/clickhouse-operator) +- Configuration management + - [puppet](https://puppet.com) + - [innogames/clickhouse](https://forge.puppet.com/innogames/clickhouse) + - [mfedotov/clickhouse](https://forge.puppet.com/mfedotov/clickhouse) +- Monitoring + - [Graphite](https://graphiteapp.org) + - [graphouse](https://github.com/ClickHouse/graphouse) + - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) + - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) + - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - optimizes staled partitions in [\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) if rules from [rollup configuration](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration) could be applied + - [Grafana](https://grafana.com/) + - [clickhouse-grafana](https://github.com/Vertamedia/clickhouse-grafana) + - [Prometheus](https://prometheus.io/) + - [clickhouse_exporter](https://github.com/f1yegor/clickhouse_exporter) + - [PromHouse](https://github.com/Percona-Lab/PromHouse) + - [clickhouse_exporter](https://github.com/hot-wifi/clickhouse_exporter) (uses [Go client](https://github.com/kshvakov/clickhouse/)) + - [Nagios](https://www.nagios.org/) + - [check_clickhouse](https://github.com/exogroup/check_clickhouse/) + - [check_clickhouse.py](https://github.com/innogames/igmonplugins/blob/master/src/check_clickhouse.py) + - [Zabbix](https://www.zabbix.com) + - [clickhouse-zabbix-template](https://github.com/Altinity/clickhouse-zabbix-template) + - [Sematext](https://sematext.com/) + - [clickhouse integration](https://github.com/sematext/sematext-agent-integrations/tree/master/clickhouse) +- Logging + - [rsyslog](https://www.rsyslog.com/) + - [omclickhouse](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html) + - [fluentd](https://www.fluentd.org) + - [loghouse](https://github.com/flant/loghouse) (for [Kubernetes](https://kubernetes.io)) + - [logagent](https://www.sematext.com/logagent) + - [logagent output-plugin-clickhouse](https://sematext.com/docs/logagent/output-plugin-clickhouse/) +- Geo + - [MaxMind](https://dev.maxmind.com/geoip/) + - [clickhouse-maxmind-geoip](https://github.com/AlexeyKupershtokh/clickhouse-maxmind-geoip) +- AutoML + - [MindsDB](https://mindsdb.com/) + - [MindsDB](https://github.com/mindsdb/mindsdb) - Predictive AI layer for ClickHouse database. ## Programming Language Ecosystems {#programming-language-ecosystems} -- Python - - [SQLAlchemy](https://www.sqlalchemy.org) - - [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) (uses [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) - - [pandas](https://pandas.pydata.org) - - [pandahouse](https://github.com/kszucs/pandahouse) -- PHP - - [Doctrine](https://www.doctrine-project.org/) - - [dbal-clickhouse](https://packagist.org/packages/friendsofdoctrine/dbal-clickhouse) -- R - - [dplyr](https://db.rstudio.com/dplyr/) - - [RClickHouse](https://github.com/IMSMWU/RClickHouse) (uses [clickhouse-cpp](https://github.com/artpaul/clickhouse-cpp)) -- Java - - [Hadoop](http://hadoop.apache.org) - - [clickhouse-hdfs-loader](https://github.com/jaykelin/clickhouse-hdfs-loader) (uses [JDBC](../../sql-reference/table-functions/jdbc.md)) -- Scala - - [Akka](https://akka.io) - - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) -- C# - - [ADO.NET](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview) - - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) - - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) - - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) - - [ClickHouse.Net.Migrations](https://github.com/ilyabreev/ClickHouse.Net.Migrations) - - [Linq To DB](https://github.com/linq2db/linq2db) -- Elixir - - [Ecto](https://github.com/elixir-ecto/ecto) - - [clickhouse_ecto](https://github.com/appodeal/clickhouse_ecto) -- Ruby - - [Ruby on Rails](https://rubyonrails.org/) - - [activecube](https://github.com/bitquery/activecube) - - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) - - [GraphQL](https://github.com/graphql) - - [activecube-graphql](https://github.com/bitquery/activecube-graphql) +- Python + - [SQLAlchemy](https://www.sqlalchemy.org) + - [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) (uses [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [pandas](https://pandas.pydata.org) + - [pandahouse](https://github.com/kszucs/pandahouse) +- PHP + - [Doctrine](https://www.doctrine-project.org/) + - [dbal-clickhouse](https://packagist.org/packages/friendsofdoctrine/dbal-clickhouse) +- R + - [dplyr](https://db.rstudio.com/dplyr/) + - [RClickHouse](https://github.com/IMSMWU/RClickHouse) (uses [clickhouse-cpp](https://github.com/artpaul/clickhouse-cpp)) +- Java + - [Hadoop](http://hadoop.apache.org) + - [clickhouse-hdfs-loader](https://github.com/jaykelin/clickhouse-hdfs-loader) (uses [JDBC](../../sql-reference/table-functions/jdbc.md)) +- Scala + - [Akka](https://akka.io) + - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) +- C# + - [ADO.NET](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview) + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) + - [ClickHouse.Net.Migrations](https://github.com/ilyabreev/ClickHouse.Net.Migrations) + - [Linq To DB](https://github.com/linq2db/linq2db) +- Elixir + - [Ecto](https://github.com/elixir-ecto/ecto) + - [clickhouse_ecto](https://github.com/appodeal/clickhouse_ecto) +- Ruby + - [Ruby on Rails](https://rubyonrails.org/) + - [activecube](https://github.com/bitquery/activecube) + - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) + - [GraphQL](https://github.com/graphql) + - [activecube-graphql](https://github.com/bitquery/activecube-graphql) diff --git a/docs/en/interfaces/third-party/proxy.md b/docs/en/interfaces/third-party/proxy.md index 4fd3f31f08b..43063ea4c1d 100644 --- a/docs/en/interfaces/third-party/proxy.md +++ b/docs/en/interfaces/third-party/proxy.md @@ -12,9 +12,9 @@ sidebar_label: Proxies Features: -- Per-user routing and response caching. -- Flexible limits. -- Automatic SSL certificate renewal. +- Per-user routing and response caching. +- Flexible limits. +- Automatic SSL certificate renewal. Implemented in Go. @@ -24,9 +24,9 @@ Implemented in Go. Features: -- In-memory and on-disk data buffering. -- Per-table routing. -- Load-balancing and health checking. +- In-memory and on-disk data buffering. +- Per-table routing. +- Load-balancing and health checking. Implemented in Go. @@ -36,8 +36,8 @@ Implemented in Go. Features: -- Group requests and send by threshold or interval. -- Multiple remote servers. -- Basic authentication. +- Group requests and send by threshold or interval. +- Multiple remote servers. +- Basic authentication. Implemented in Go. diff --git a/docs/en/operations/_troubleshooting.md b/docs/en/operations/_troubleshooting.md index a5c07ed18bd..dbb0dad7976 100644 --- a/docs/en/operations/_troubleshooting.md +++ b/docs/en/operations/_troubleshooting.md @@ -1,17 +1,17 @@ [//]: # (This file is included in FAQ > Troubleshooting) -- [Installation](#troubleshooting-installation-errors) -- [Connecting to the server](#troubleshooting-accepts-no-connections) -- [Query processing](#troubleshooting-does-not-process-queries) -- [Efficiency of query processing](#troubleshooting-too-slow) +- [Installation](#troubleshooting-installation-errors) +- [Connecting to the server](#troubleshooting-accepts-no-connections) +- [Query processing](#troubleshooting-does-not-process-queries) +- [Efficiency of query processing](#troubleshooting-too-slow) ## Installation {#troubleshooting-installation-errors} ### You Cannot Get Deb Packages from ClickHouse Repository with Apt-get {#you-cannot-get-deb-packages-from-clickhouse-repository-with-apt-get} -- Check firewall settings. -- If you cannot access the repository for any reason, download packages as described in the [install guide](../getting-started/install.md) article and install them manually using the `sudo dpkg -i ` command. You will also need the `tzdata` package. +- Check firewall settings. +- If you cannot access the repository for any reason, download packages as described in the [install guide](../getting-started/install.md) article and install them manually using the `sudo dpkg -i ` command. You will also need the `tzdata` package. ### You Cannot Update Deb Packages from ClickHouse Repository with Apt-get {#you-cannot-update-deb-packages-from-clickhouse-repository-with-apt-get} @@ -73,8 +73,8 @@ After that follow the [install guide](../getting-started/install.md#from-rpm-pac Possible issues: -- The server is not running. -- Unexpected or wrong configuration parameters. +- The server is not running. +- Unexpected or wrong configuration parameters. ### Server Is Not Running {#server-is-not-running} @@ -98,8 +98,8 @@ The main log of `clickhouse-server` is in `/var/log/clickhouse-server/clickhouse If the server started successfully, you should see the strings: -- ` Application: starting up.` — Server started. -- ` Application: Ready for connections.` — Server is running and ready for connections. +- ` Application: starting up.` — Server started. +- ` Application: Ready for connections.` — Server is running and ready for connections. If `clickhouse-server` start failed with a configuration error, you should see the `` string with an error description. For example: @@ -149,30 +149,30 @@ This command starts the server as an interactive app with standard parameters of Check: -- Docker settings. +- Docker settings. If you run ClickHouse in Docker in an IPv6 network, make sure that `network=host` is set. -- Endpoint settings. +- Endpoint settings. Check [listen_host](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-listen_host) and [tcp_port](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) settings. ClickHouse server accepts localhost connections only by default. -- HTTP protocol settings. +- HTTP protocol settings. Check protocol settings for the HTTP API. -- Secure connection settings. +- Secure connection settings. Check: - - The [tcp_port_secure](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure) setting. - - Settings for [SSL certificates](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl). + - The [tcp_port_secure](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure) setting. + - Settings for [SSL certificates](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl). Use proper parameters while connecting. For example, use the `port_secure` parameter with `clickhouse_client`. -- User settings. +- User settings. You might be using the wrong user name or password. diff --git a/docs/en/operations/configuration-files.md b/docs/en/operations/configuration-files.md index 2e241ec1980..b3583e156ad 100644 --- a/docs/en/operations/configuration-files.md +++ b/docs/en/operations/configuration-files.md @@ -14,10 +14,10 @@ All XML files should have the same root element, usually ``. As for Some settings specified in the main configuration file can be overridden in other configuration files: -- The `replace` or `remove` attributes can be specified for the elements of these configuration files. -- If neither is specified, it combines the contents of elements recursively, replacing values of duplicate children. -- If `replace` is specified, it replaces the entire element with the specified one. -- If `remove` is specified, it deletes the element. +- The `replace` or `remove` attributes can be specified for the elements of these configuration files. +- If neither is specified, it combines the contents of elements recursively, replacing values of duplicate children. +- If `replace` is specified, it replaces the entire element with the specified one. +- If `remove` is specified, it deletes the element. You can also declare attributes as coming from environment variables by using `from_env="VARIABLE_NAME"`: diff --git a/docs/en/operations/monitoring.md b/docs/en/operations/monitoring.md index 04c5840d514..ebf981690a9 100644 --- a/docs/en/operations/monitoring.md +++ b/docs/en/operations/monitoring.md @@ -12,15 +12,15 @@ import SelfManaged from '@site/docs/en/_snippets/_self_managed_only_automated.md You can monitor: -- Utilization of hardware resources. -- ClickHouse server metrics. +- Utilization of hardware resources. +- ClickHouse server metrics. ## Resource Utilization {#resource-utilization} ClickHouse also monitors the state of hardware resources by itself such as: -- Load and temperature on processors. -- Utilization of storage system, RAM and network. +- Load and temperature on processors. +- Utilization of storage system, RAM and network. This data is collected in the `system.asynchronous_metric_log` table. @@ -32,8 +32,8 @@ To track server events use server logs. See the [logger](../operations/server-co ClickHouse collects: -- Different metrics of how the server uses computational resources. -- Common statistics on query processing. +- Different metrics of how the server uses computational resources. +- Common statistics on query processing. You can find metrics in the [system.metrics](../operations/system-tables/metrics.md#system_tables-metrics), [system.events](../operations/system-tables/events.md#system_tables-events), and [system.asynchronous_metrics](../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) tables. diff --git a/docs/en/operations/optimizing-performance/index.md b/docs/en/operations/optimizing-performance/index.md index e25f3b4adb7..83e9430ed27 100644 --- a/docs/en/operations/optimizing-performance/index.md +++ b/docs/en/operations/optimizing-performance/index.md @@ -6,4 +6,4 @@ sidebar_position: 52 # Optimizing Performance -- [Sampling query profiler](../../operations/optimizing-performance/sampling-query-profiler.md) +- [Sampling query profiler](../../operations/optimizing-performance/sampling-query-profiler.md) diff --git a/docs/en/operations/optimizing-performance/sampling-query-profiler.md b/docs/en/operations/optimizing-performance/sampling-query-profiler.md index ab42eec4190..f5d0e5d6aed 100644 --- a/docs/en/operations/optimizing-performance/sampling-query-profiler.md +++ b/docs/en/operations/optimizing-performance/sampling-query-profiler.md @@ -25,11 +25,11 @@ SETTINGS allow_introspection_functions = 1 In self-managed deployments, to use query profiler: -- Setup the [trace_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-trace_log) section of the server configuration. +- Setup the [trace_log](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-trace_log) section of the server configuration. This section configures the [trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log) system table containing the results of the profiler functioning. It is configured by default. Remember that data in this table is valid only for a running server. After the server restart, ClickHouse does not clean up the table and all the stored virtual memory address may become invalid. -- Setup the [query_profiler_cpu_time_period_ns](../../operations/settings/settings.md#query_profiler_cpu_time_period_ns) or [query_profiler_real_time_period_ns](../../operations/settings/settings.md#query_profiler_real_time_period_ns) settings. Both settings can be used simultaneously. +- Setup the [query_profiler_cpu_time_period_ns](../../operations/settings/settings.md#query_profiler_cpu_time_period_ns) or [query_profiler_real_time_period_ns](../../operations/settings/settings.md#query_profiler_real_time_period_ns) settings. Both settings can be used simultaneously. These settings allow you to configure profiler timers. As these are the session settings, you can get different sampling frequency for the whole server, individual users or user profiles, for your interactive session, and for each individual query. @@ -37,13 +37,13 @@ The default sampling frequency is one sample per second and both CPU and real ti To analyze the `trace_log` system table: -- Install the `clickhouse-common-static-dbg` package. See [Install from DEB Packages](../../getting-started/install.md#install-from-deb-packages). +- Install the `clickhouse-common-static-dbg` package. See [Install from DEB Packages](../../getting-started/install.md#install-from-deb-packages). -- Allow introspection functions by the [allow_introspection_functions](../../operations/settings/settings.md#settings-allow_introspection_functions) setting. +- Allow introspection functions by the [allow_introspection_functions](../../operations/settings/settings.md#settings-allow_introspection_functions) setting. For security reasons, introspection functions are disabled by default. -- Use the `addressToLine`, `addressToLineWithInlines`, `addressToSymbol` and `demangle` [introspection functions](../../sql-reference/functions/introspection.md) to get function names and their positions in ClickHouse code. To get a profile for some query, you need to aggregate data from the `trace_log` table. You can aggregate data by individual functions or by the whole stack traces. +- Use the `addressToLine`, `addressToLineWithInlines`, `addressToSymbol` and `demangle` [introspection functions](../../sql-reference/functions/introspection.md) to get function names and their positions in ClickHouse code. To get a profile for some query, you need to aggregate data from the `trace_log` table. You can aggregate data by individual functions or by the whole stack traces. If you need to visualize `trace_log` info, try [flamegraph](../../interfaces/third-party/gui.md#clickhouse-flamegraph-clickhouse-flamegraph) and [speedscope](https://github.com/laplab/clickhouse-speedscope). @@ -51,14 +51,14 @@ If you need to visualize `trace_log` info, try [flamegraph](../../interfaces/thi In this example we: -- Filtering `trace_log` data by a query identifier and the current date. +- Filtering `trace_log` data by a query identifier and the current date. -- Aggregating by stack trace. +- Aggregating by stack trace. -- Using introspection functions, we will get a report of: +- Using introspection functions, we will get a report of: - - Names of symbols and corresponding source code functions. - - Source code locations of these functions. + - Names of symbols and corresponding source code functions. + - Source code locations of these functions. diff --git a/docs/en/operations/quotas.md b/docs/en/operations/quotas.md index f1f3ca78802..2f0cdec0983 100644 --- a/docs/en/operations/quotas.md +++ b/docs/en/operations/quotas.md @@ -12,8 +12,8 @@ The system also has a feature for limiting the complexity of a single query. See In contrast to query complexity restrictions, quotas: -- Place restrictions on a set of queries that can be run over a period of time, instead of limiting a single query. -- Account for resources spent on all remote servers for distributed query processing. +- Place restrictions on a set of queries that can be run over a period of time, instead of limiting a single query. +- Account for resources spent on all remote servers for distributed query processing. Let’s look at the section of the ‘users.xml’ file that defines quotas. diff --git a/docs/en/operations/server-configuration-parameters/settings.md b/docs/en/operations/server-configuration-parameters/settings.md index 7c97d0ab640..981209521cc 100644 --- a/docs/en/operations/server-configuration-parameters/settings.md +++ b/docs/en/operations/server-configuration-parameters/settings.md @@ -45,17 +45,17 @@ Configuration template: `` fields: -- `min_part_size` – The minimum size of a data part. -- `min_part_size_ratio` – The ratio of the data part size to the table size. -- `method` – Compression method. Acceptable values: `lz4`, `lz4hc`, `zstd`,`deflate_qpl`. -- `level` – Compression level. See [Codecs](../../sql-reference/statements/create/table.md#create-query-general-purpose-codecs). +- `min_part_size` – The minimum size of a data part. +- `min_part_size_ratio` – The ratio of the data part size to the table size. +- `method` – Compression method. Acceptable values: `lz4`, `lz4hc`, `zstd`,`deflate_qpl`. +- `level` – Compression level. See [Codecs](../../sql-reference/statements/create/table.md#create-query-general-purpose-codecs). You can configure multiple `` sections. Actions when conditions are met: -- If a data part matches a condition set, ClickHouse uses the specified compression method. -- If a data part matches multiple condition sets, ClickHouse uses the first matched condition set. +- If a data part matches a condition set, ClickHouse uses the specified compression method. +- If a data part matches multiple condition sets, ClickHouse uses the first matched condition set. If no conditions met for a data part, ClickHouse uses the `lz4` compression. @@ -165,7 +165,7 @@ List of prefixes for [custom settings](../../operations/settings/index.md#custom **See Also** -- [Custom settings](../../operations/settings/index.md#custom_settings) +- [Custom settings](../../operations/settings/index.md#custom_settings) ## core_dump {#server_configuration_parameters-core_dump} @@ -173,7 +173,7 @@ Configures soft limit for core dump file size. Possible values: -- Positive integer. +- Positive integer. Default value: `1073741824` (1 GB). @@ -274,8 +274,8 @@ The path to the config file for dictionaries. Path: -- Specify the absolute path or the path relative to the server config file. -- The path can contain wildcards \* and ?. +- Specify the absolute path or the path relative to the server config file. +- The path can contain wildcards \* and ?. See also “[Dictionaries](../../sql-reference/dictionaries/index.md)”. @@ -291,8 +291,8 @@ The path to the config file for executable user defined functions. Path: -- Specify the absolute path or the path relative to the server config file. -- The path can contain wildcards \* and ?. +- Specify the absolute path or the path relative to the server config file. +- The path can contain wildcards \* and ?. See also “[Executable User Defined Functions](../../sql-reference/functions/index.md#executable-user-defined-functions).”. @@ -335,15 +335,15 @@ Sending data to [Graphite](https://github.com/graphite-project). Settings: -- host – The Graphite server. -- port – The port on the Graphite server. -- interval – The interval for sending, in seconds. -- timeout – The timeout for sending data, in seconds. -- root_path – Prefix for keys. -- metrics – Sending data from the [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) table. -- events – Sending deltas data accumulated for the time period from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. -- events_cumulative – Sending cumulative data from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. -- asynchronous_metrics – Sending data from the [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) table. +- host – The Graphite server. +- port – The port on the Graphite server. +- interval – The interval for sending, in seconds. +- timeout – The timeout for sending data, in seconds. +- root_path – Prefix for keys. +- metrics – Sending data from the [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) table. +- events – Sending deltas data accumulated for the time period from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. +- events_cumulative – Sending cumulative data from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. +- asynchronous_metrics – Sending data from the [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) table. You can configure multiple `` clauses. For instance, you can use this for sending different data at different intervals. @@ -516,10 +516,10 @@ These credentials are common for replication via `HTTP` and `HTTPS`. The section contains the following parameters: -- `user` — Username. -- `password` — Password. -- `allow_empty` — If `true`, then other replicas are allowed to connect without authentication even if credentials are set. If `false`, then connections without authentication are refused. Default value: `false`. -- `old` — Contains old `user` and `password` used during credential rotation. Several `old` sections can be specified. +- `user` — Username. +- `password` — Password. +- `allow_empty` — If `true`, then other replicas are allowed to connect without authentication even if credentials are set. If `false`, then connections without authentication are refused. Default value: `false`. +- `old` — Contains old `user` and `password` used during credential rotation. Several `old` sections can be specified. **Credentials Rotation** @@ -603,13 +603,13 @@ Logging settings. Keys: -- `level` – Logging level. Acceptable values: `trace`, `debug`, `information`, `warning`, `error`. -- `log` – The log file. Contains all the entries according to `level`. -- `errorlog` – Error log file. -- `size` – Size of the file. Applies to `log` and `errorlog`. Once the file reaches `size`, ClickHouse archives and renames it, and creates a new log file in its place. -- `count` – The number of archived log files that ClickHouse stores. -- `console` – Send `log` and `errorlog` to the console instead of file. To enable, set to `1` or `true`. -- `stream_compress` – Compress `log` and `errorlog` with `lz4` stream compression. To enable, set to `1` or `true`. +- `level` – Logging level. Acceptable values: `trace`, `debug`, `information`, `warning`, `error`. +- `log` – The log file. Contains all the entries according to `level`. +- `errorlog` – Error log file. +- `size` – Size of the file. Applies to `log` and `errorlog`. Once the file reaches `size`, ClickHouse archives and renames it, and creates a new log file in its place. +- `count` – The number of archived log files that ClickHouse stores. +- `console` – Send `log` and `errorlog` to the console instead of file. To enable, set to `1` or `true`. +- `stream_compress` – Compress `log` and `errorlog` with `lz4` stream compression. To enable, set to `1` or `true`. **Example** @@ -649,12 +649,12 @@ Writing to the syslog is also supported. Config example: Keys for syslog: -- use_syslog — Required setting if you want to write to the syslog. -- address — The host\[:port\] of syslogd. If omitted, the local daemon is used. -- hostname — Optional. The name of the host that logs are sent from. -- facility — [The syslog facility keyword](https://en.wikipedia.org/wiki/Syslog#Facility) in uppercase letters with the “LOG_” prefix: (`LOG_USER`, `LOG_DAEMON`, `LOG_LOCAL3`, and so on). +- use_syslog — Required setting if you want to write to the syslog. +- address — The host\[:port\] of syslogd. If omitted, the local daemon is used. +- hostname — Optional. The name of the host that logs are sent from. +- facility — [The syslog facility keyword](https://en.wikipedia.org/wiki/Syslog#Facility) in uppercase letters with the “LOG_” prefix: (`LOG_USER`, `LOG_DAEMON`, `LOG_LOCAL3`, and so on). Default value: `LOG_USER` if `address` is specified, `LOG_DAEMON` otherwise. -- format – Message format. Possible values: `bsd` and `syslog.` +- format – Message format. Possible values: `bsd` and `syslog.` ## send_crash_reports {#server_configuration_parameters-send_crash_reports} @@ -665,13 +665,13 @@ The server will need access to the public Internet via IPv4 (at the time of writ Keys: -- `enabled` – Boolean flag to enable the feature, `false` by default. Set to `true` to allow sending crash reports. -- `endpoint` – You can override the Sentry endpoint URL for sending crash reports. It can be either a separate Sentry account or your self-hosted Sentry instance. Use the [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk) syntax. -- `anonymize` - Avoid attaching the server hostname to the crash report. -- `http_proxy` - Configure HTTP proxy for sending crash reports. -- `debug` - Sets the Sentry client into debug mode. -- `tmp_path` - Filesystem path for temporary crash report state. -- `environment` - An arbitrary name of an environment in which the ClickHouse server is running. It will be mentioned in each crash report. The default value is `test` or `prod` depending on the version of ClickHouse. +- `enabled` – Boolean flag to enable the feature, `false` by default. Set to `true` to allow sending crash reports. +- `endpoint` – You can override the Sentry endpoint URL for sending crash reports. It can be either a separate Sentry account or your self-hosted Sentry instance. Use the [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk) syntax. +- `anonymize` - Avoid attaching the server hostname to the crash report. +- `http_proxy` - Configure HTTP proxy for sending crash reports. +- `debug` - Sets the Sentry client into debug mode. +- `tmp_path` - Filesystem path for temporary crash report state. +- `environment` - An arbitrary name of an environment in which the ClickHouse server is running. It will be mentioned in each crash report. The default value is `test` or `prod` depending on the version of ClickHouse. **Recommended way to use** @@ -713,8 +713,8 @@ Limits total RAM usage by the ClickHouse server. Possible values: -- Positive integer. -- 0 — Auto. +- Positive integer. +- 0 — Auto. Default value: `0`. @@ -724,8 +724,8 @@ The default `max_server_memory_usage` value is calculated as `memory_amount * ma **See also** -- [max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) -- [max_server_memory_usage_to_ram_ratio](#max_server_memory_usage_to_ram_ratio) +- [max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) +- [max_server_memory_usage_to_ram_ratio](#max_server_memory_usage_to_ram_ratio) ## max_server_memory_usage_to_ram_ratio {#max_server_memory_usage_to_ram_ratio} @@ -733,8 +733,8 @@ Defines the fraction of total physical RAM amount, available to the ClickHouse s Possible values: -- Positive double. -- 0 — The ClickHouse server can use all available RAM. +- Positive double. +- 0 — The ClickHouse server can use all available RAM. Default value: `0.9`. @@ -750,21 +750,21 @@ On hosts with low RAM and swap, you possibly need setting `max_server_memory_usa **See Also** -- [max_server_memory_usage](#max_server_memory_usage) +- [max_server_memory_usage](#max_server_memory_usage) ## concurrent_threads_soft_limit_num {#concurrent_threads_soft_limit_num} The maximum number of query processing threads, excluding threads for retrieving data from remote servers, allowed to run all queries. This is not a hard limit. In case if the limit is reached the query will still get at least one thread to run. Query can upscale to desired number of threads during execution if more threads become available. Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. **See Also** -- [Concurrency Control](/docs/en/development/architecture.md#concurrency-control) +- [Concurrency Control](/docs/en/development/architecture.md#concurrency-control) ## concurrent_threads_soft_limit_ratio_to_cores {#concurrent_threads_soft_limit_ratio_to_cores} The maximum number of query processing threads as multiple of number of logical cores. @@ -772,8 +772,8 @@ More details: [concurrent_threads_soft_limit_num](#concurrent_threads_soft_limit Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -794,8 +794,8 @@ These settings can be modified at runtime and will take effect immediately. Quer Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `100`. @@ -815,8 +815,8 @@ These settings can be modified at runtime and will take effect immediately. Quer Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -836,8 +836,8 @@ These settings can be modified at runtime and will take effect immediately. Quer Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -853,8 +853,8 @@ The maximum number of simultaneously processed queries related to MergeTree tabl Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -874,8 +874,8 @@ Modifying the setting for one query or user does not affect other queries. Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -887,7 +887,7 @@ Default value: `0`. **See Also** -- [max_concurrent_queries](#max-concurrent-queries) +- [max_concurrent_queries](#max-concurrent-queries) ## max_connections {#max-connections} @@ -937,7 +937,7 @@ ClickHouse uses threads from the Global Thread pool to process queries. If there Possible values: -- Positive integer. +- Positive integer. Default value: `10000`. @@ -953,7 +953,7 @@ If the number of **idle** threads in the Global Thread pool is greater than `max Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -969,8 +969,8 @@ The maximum number of jobs that can be scheduled on the Global Thread pool. Incr Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `10000`. @@ -986,7 +986,7 @@ ClickHouse uses threads from the IO Thread pool to do some IO operations (e.g. t Possible values: -- Positive integer. +- Positive integer. Default value: `100`. @@ -996,7 +996,7 @@ If the number of **idle** threads in the IO Thread pool exceeds `max_io_thread_p Possible values: -- Positive integer. +- Positive integer. Default value: `0`. @@ -1006,8 +1006,8 @@ The maximum number of jobs that can be scheduled on the IO Thread pool. Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `10000`. @@ -1017,7 +1017,7 @@ ClickHouse uses threads from the Backups IO Thread pool to do S3 backup IO opera Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -1027,8 +1027,8 @@ If the number of **idle** threads in the Backups IO Thread pool exceeds `max_bac Possible values: -- Positive integer. -- Zero. +- Positive integer. +- Zero. Default value: `0`. @@ -1038,8 +1038,8 @@ The maximum number of jobs that can be scheduled on the Backups IO Thread pool. Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0`. @@ -1051,7 +1051,7 @@ Before changing it, please also take a look at related MergeTree settings, such Possible values: -- Any positive integer. +- Any positive integer. Default value: 16. @@ -1069,7 +1069,7 @@ The same as for `background_pool_size` setting `background_merges_mutations_conc Possible values: -- Any positive integer. +- Any positive integer. Default value: 2. @@ -1086,8 +1086,8 @@ Could be applied from the `default` profile for backward compatibility. Possible values: -- "round_robin" — Every concurrent merge and mutation is executed in round-robin order to ensure starvation-free operation. Smaller merges are completed faster than bigger ones just because they have fewer blocks to merge. -- "shortest_task_first" — Always execute smaller merge or mutation. Merges and mutations are assigned priorities based on their resulting size. Merges with smaller sizes are strictly preferred over bigger ones. This policy ensures the fastest possible merge of small parts but can lead to indefinite starvation of big merges in partitions heavily overloaded by INSERTs. +- "round_robin" — Every concurrent merge and mutation is executed in round-robin order to ensure starvation-free operation. Smaller merges are completed faster than bigger ones just because they have fewer blocks to merge. +- "shortest_task_first" — Always execute smaller merge or mutation. Merges and mutations are assigned priorities based on their resulting size. Merges with smaller sizes are strictly preferred over bigger ones. This policy ensures the fastest possible merge of small parts but can lead to indefinite starvation of big merges in partitions heavily overloaded by INSERTs. Default value: "round_robin". @@ -1103,7 +1103,7 @@ Sets the number of threads performing background moves for tables with MergeTree Possible values: -- Any positive integer. +- Any positive integer. Default value: 8. @@ -1119,7 +1119,7 @@ Sets the number of threads performing background fetches for tables with Replica Possible values: -- Any positive integer. +- Any positive integer. Default value: 8. @@ -1135,7 +1135,7 @@ Sets the number of threads performing background non-specialized operations like Possible values: -- Any positive integer. +- Any positive integer. Default value: 8. @@ -1151,7 +1151,7 @@ Sets the number of threads performing background flush in [Buffer](../../engines Possible values: -- Any positive integer. +- Any positive integer. Default value: 16. @@ -1161,7 +1161,7 @@ Sets the number of threads performing background tasks for [replicated](../../en Possible values: -- Any positive integer. +- Any positive integer. Default value: 128. @@ -1233,26 +1233,26 @@ Support for SSL is provided by the `libpoco` library. The available configuratio Keys for server/client settings: -- privateKeyFile – The path to the file with the secret key of the PEM certificate. The file may contain a key and certificate at the same time. -- certificateFile – The path to the client/server certificate file in PEM format. You can omit it if `privateKeyFile` contains the certificate. -- caConfig (default: none) – The path to the file or directory that contains trusted CA certificates. If this points to a file, it must be in PEM format and can contain several CA certificates. If this points to a directory, it must contain one .pem file per CA certificate. The filenames are looked up by the CA subject name hash value. Details can be found in the man page of [SSL_CTX_load_verify_locations](https://www.openssl.org/docs/man3.0/man3/SSL_CTX_load_verify_locations.html). -- verificationMode (default: relaxed) – The method for checking the node’s certificates. Details are in the description of the [Context](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/Context.h) class. Possible values: `none`, `relaxed`, `strict`, `once`. -- verificationDepth (default: 9) – The maximum length of the verification chain. Verification will fail if the certificate chain length exceeds the set value. -- loadDefaultCAFile (default: true) – Wether built-in CA certificates for OpenSSL will be used. ClickHouse assumes that builtin CA certificates are in the file `/etc/ssl/cert.pem` (resp. the directory `/etc/ssl/certs`) or in file (resp. directory) specified by the environment variable `SSL_CERT_FILE` (resp. `SSL_CERT_DIR`). -- cipherList (default: `ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH`) - Supported OpenSSL encryptions. -- cacheSessions (default: false) – Enables or disables caching sessions. Must be used in combination with `sessionIdContext`. Acceptable values: `true`, `false`. -- sessionIdContext (default: `${application.name}`) – A unique set of random characters that the server appends to each generated identifier. The length of the string must not exceed `SSL_MAX_SSL_SESSION_ID_LENGTH`. This parameter is always recommended since it helps avoid problems both if the server caches the session and if the client requested caching. Default value: `${application.name}`. -- sessionCacheSize (default: [1024\*20](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1978)) – The maximum number of sessions that the server caches. A value of 0 means unlimited sessions. -- sessionTimeout (default: [2h](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1926)) – Time for caching the session on the server. -- extendedVerification (default: false) – If enabled, verify that the certificate CN or SAN matches the peer hostname. -- requireTLSv1 (default: false) – Require a TLSv1 connection. Acceptable values: `true`, `false`. -- requireTLSv1_1 (default: false) – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. -- requireTLSv1_2 (default: false) – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. -- fips (default: false) – Activates OpenSSL FIPS mode. Supported if the library’s OpenSSL version supports FIPS. -- privateKeyPassphraseHandler (default: `KeyConsoleHandler`)– Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. -- invalidCertificateHandler (default: `ConsoleCertificateHandler`) – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . -- disableProtocols (default: "") – Protocols that are not allowed to use. -- preferServerCiphers (default: false) – Preferred server ciphers on the client. +- privateKeyFile – The path to the file with the secret key of the PEM certificate. The file may contain a key and certificate at the same time. +- certificateFile – The path to the client/server certificate file in PEM format. You can omit it if `privateKeyFile` contains the certificate. +- caConfig (default: none) – The path to the file or directory that contains trusted CA certificates. If this points to a file, it must be in PEM format and can contain several CA certificates. If this points to a directory, it must contain one .pem file per CA certificate. The filenames are looked up by the CA subject name hash value. Details can be found in the man page of [SSL_CTX_load_verify_locations](https://www.openssl.org/docs/man3.0/man3/SSL_CTX_load_verify_locations.html). +- verificationMode (default: relaxed) – The method for checking the node’s certificates. Details are in the description of the [Context](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/Context.h) class. Possible values: `none`, `relaxed`, `strict`, `once`. +- verificationDepth (default: 9) – The maximum length of the verification chain. Verification will fail if the certificate chain length exceeds the set value. +- loadDefaultCAFile (default: true) – Wether built-in CA certificates for OpenSSL will be used. ClickHouse assumes that builtin CA certificates are in the file `/etc/ssl/cert.pem` (resp. the directory `/etc/ssl/certs`) or in file (resp. directory) specified by the environment variable `SSL_CERT_FILE` (resp. `SSL_CERT_DIR`). +- cipherList (default: `ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH`) - Supported OpenSSL encryptions. +- cacheSessions (default: false) – Enables or disables caching sessions. Must be used in combination with `sessionIdContext`. Acceptable values: `true`, `false`. +- sessionIdContext (default: `${application.name}`) – A unique set of random characters that the server appends to each generated identifier. The length of the string must not exceed `SSL_MAX_SSL_SESSION_ID_LENGTH`. This parameter is always recommended since it helps avoid problems both if the server caches the session and if the client requested caching. Default value: `${application.name}`. +- sessionCacheSize (default: [1024\*20](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1978)) – The maximum number of sessions that the server caches. A value of 0 means unlimited sessions. +- sessionTimeout (default: [2h](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1926)) – Time for caching the session on the server. +- extendedVerification (default: false) – If enabled, verify that the certificate CN or SAN matches the peer hostname. +- requireTLSv1 (default: false) – Require a TLSv1 connection. Acceptable values: `true`, `false`. +- requireTLSv1_1 (default: false) – Require a TLSv1.1 connection. Acceptable values: `true`, `false`. +- requireTLSv1_2 (default: false) – Require a TLSv1.2 connection. Acceptable values: `true`, `false`. +- fips (default: false) – Activates OpenSSL FIPS mode. Supported if the library’s OpenSSL version supports FIPS. +- privateKeyPassphraseHandler (default: `KeyConsoleHandler`)– Class (PrivateKeyPassphraseHandler subclass) that requests the passphrase for accessing the private key. For example: ``, `KeyFileHandler`, `test`, ``. +- invalidCertificateHandler (default: `ConsoleCertificateHandler`) – Class (a subclass of CertificateHandler) for verifying invalid certificates. For example: ` ConsoleCertificateHandler ` . +- disableProtocols (default: "") – Protocols that are not allowed to use. +- preferServerCiphers (default: false) – Preferred server ciphers on the client. **Example of settings:** @@ -1292,12 +1292,12 @@ Queries are logged in the [system.part_log](../../operations/system-tables/part_ Use the following parameters to configure logging: -- `database` – Name of the database. -- `table` – Name of the system table. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `database` – Name of the database. +- `table` – Name of the system table. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) **Example** @@ -1330,11 +1330,11 @@ Exposing metrics data for scraping from [Prometheus](https://prometheus.io). Settings: -- `endpoint` – HTTP endpoint for scraping metrics by prometheus server. Start from ‘/’. -- `port` – Port for `endpoint`. -- `metrics` – Flag that sets to expose metrics from the [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) table. -- `events` – Flag that sets to expose metrics from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. -- `asynchronous_metrics` – Flag that sets to expose current metrics values from the [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) table. +- `endpoint` – HTTP endpoint for scraping metrics by prometheus server. Start from ‘/’. +- `port` – Port for `endpoint`. +- `metrics` – Flag that sets to expose metrics from the [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) table. +- `events` – Flag that sets to expose metrics from the [system.events](../../operations/system-tables/events.md#system_tables-events) table. +- `asynchronous_metrics` – Flag that sets to expose current metrics values from the [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) table. **Example** @@ -1356,12 +1356,12 @@ Queries are logged in the [system.query_log](../../operations/system-tables/quer Use the following parameters to configure logging: -- `database` – Name of the database. -- `table` – Name of the system table the queries will be logged in. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) If the table does not exist, ClickHouse will create it. If the structure of the query log changed when the ClickHouse server was updated, the table with the old structure is renamed, and a new table is created automatically. @@ -1382,10 +1382,10 @@ If the table does not exist, ClickHouse will create it. If the structure of the The following settings are available: -- `max_size`: The maximum cache size in bytes. 0 means the query cache is disabled. Default value: `1073741824` (1 GiB). -- `max_entries`: The maximum number of `SELECT` query results stored in the cache. Default value: `1024`. -- `max_entry_size`: The maximum size in bytes `SELECT` query results may have to be saved in the cache. Default value: `1048576` (1 MiB). -- `max_entry_rows`: The maximum number of rows `SELECT` query results may have to be saved in the cache. Default value: `30000000` (30 mil). +- `max_size`: The maximum cache size in bytes. 0 means the query cache is disabled. Default value: `1073741824` (1 GiB). +- `max_entries`: The maximum number of `SELECT` query results stored in the cache. Default value: `1024`. +- `max_entry_size`: The maximum size in bytes `SELECT` query results may have to be saved in the cache. Default value: `1048576` (1 MiB). +- `max_entry_rows`: The maximum number of rows `SELECT` query results may have to be saved in the cache. Default value: `30000000` (30 mil). Changed settings take effect immediately. @@ -1412,12 +1412,12 @@ Queries are logged in the [system.query_thread_log](../../operations/system-tabl Use the following parameters to configure logging: -- `database` – Name of the database. -- `table` – Name of the system table the queries will be logged in. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) If the table does not exist, ClickHouse will create it. If the structure of the query thread log changed when the ClickHouse server was updated, the table with the old structure is renamed, and a new table is created automatically. @@ -1440,12 +1440,12 @@ Queries are logged in the [system.query_views_log](../../operations/system-table Use the following parameters to configure logging: -- `database` – Name of the database. -- `table` – Name of the system table the queries will be logged in. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `database` – Name of the database. +- `table` – Name of the system table the queries will be logged in. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` – Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) If the table does not exist, ClickHouse will create it. If the structure of the query views log changed when the ClickHouse server was updated, the table with the old structure is renamed, and a new table is created automatically. @@ -1466,13 +1466,13 @@ Settings for the [text_log](../../operations/system-tables/text_log.md#system_ta Parameters: -- `level` — Maximum Message Level (by default `Trace`) which will be stored in a table. -- `database` — Database name. -- `table` — Table name. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `level` — Maximum Message Level (by default `Trace`) which will be stored in a table. +- `database` — Database name. +- `table` — Table name. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) **Example** ```xml @@ -1495,12 +1495,12 @@ Settings for the [trace_log](../../operations/system-tables/trace_log.md#system_ Parameters: -- `database` — Database for storing a table. -- `table` — Table name. -- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. -- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/index.md) for a system table. Can't be used if `partition_by` defined. -- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. -- `storage_policy` – Name of storage policy to use for the table (optional) +- `database` — Database for storing a table. +- `table` — Table name. +- `partition_by` — [Custom partitioning key](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) for a system table. Can't be used if `engine` defined. +- `engine` - [MergeTree Engine Definition](../../engines/table-engines/mergetree-family/index.md) for a system table. Can't be used if `partition_by` defined. +- `flush_interval_milliseconds` — Interval for flushing data from the buffer in memory to the table. +- `storage_policy` – Name of storage policy to use for the table (optional) The default server configuration file `config.xml` contains the following settings section: @@ -1557,7 +1557,7 @@ For the value of the `incl` attribute, see the section “[Configuration files]( **See Also** -- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards) +- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards) ## timezone {#server_configuration_parameters-timezone} @@ -1731,11 +1731,11 @@ Default value: `0`. **See also** -- [max_temporary_data_on_disk_size_for_user](../../operations/settings/query-complexity.md#settings_max_temporary_data_on_disk_size_for_user) -- [max_temporary_data_on_disk_size_for_query](../../operations/settings/query-complexity.md#settings_max_temporary_data_on_disk_size_for_query) -- [tmp_path](#tmp-path) -- [tmp_policy](#tmp-policy) -- [max_server_memory_usage](#max_server_memory_usage) +- [max_temporary_data_on_disk_size_for_user](../../operations/settings/query-complexity.md#settings_max_temporary_data_on_disk_size_for_user) +- [max_temporary_data_on_disk_size_for_query](../../operations/settings/query-complexity.md#settings_max_temporary_data_on_disk_size_for_query) +- [tmp_path](#tmp-path) +- [tmp_policy](#tmp-policy) +- [max_server_memory_usage](#max_server_memory_usage) ## uncompressed_cache_size {#server-settings-uncompressed_cache_size} @@ -1785,10 +1785,10 @@ The directory with user defined files. Used for SQL user defined functions [SQL Path to the file that contains: -- User configurations. -- Access rights. -- Settings profiles. -- Quota settings. +- User configurations. +- Access rights. +- Settings profiles. +- Quota settings. **Example** @@ -1804,7 +1804,7 @@ ClickHouse uses ZooKeeper for storing metadata of replicas when using replicated This section contains the following parameters: -- `node` — ZooKeeper endpoint. You can set multiple endpoints. +- `node` — ZooKeeper endpoint. You can set multiple endpoints. For example: @@ -1847,9 +1847,9 @@ This section contains the following parameters: **See Also** -- [Replication](../../engines/table-engines/mergetree-family/replication.md) -- [ZooKeeper Programmer’s Guide](http://zookeeper.apache.org/doc/current/zookeeperProgrammers.html) -- [Optional secured communication between ClickHouse and Zookeeper](../ssl-zookeeper.md#secured-communication-with-zookeeper) +- [Replication](../../engines/table-engines/mergetree-family/replication.md) +- [ZooKeeper Programmer’s Guide](http://zookeeper.apache.org/doc/current/zookeeperProgrammers.html) +- [Optional secured communication between ClickHouse and Zookeeper](../ssl-zookeeper.md#secured-communication-with-zookeeper) ## use_minimalistic_part_header_in_zookeeper {#server-settings-use_minimalistic_part_header_in_zookeeper} @@ -1857,18 +1857,18 @@ Storage method for data part headers in ZooKeeper. This setting only applies to the `MergeTree` family. It can be specified: -- Globally in the [merge_tree](#server_configuration_parameters-merge_tree) section of the `config.xml` file. +- Globally in the [merge_tree](#server_configuration_parameters-merge_tree) section of the `config.xml` file. ClickHouse uses the setting for all the tables on the server. You can change the setting at any time. Existing tables change their behaviour when the setting changes. -- For each table. +- For each table. When creating a table, specify the corresponding [engine setting](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table). The behaviour of an existing table with this setting does not change, even if the global setting changes. **Possible values** -- 0 — Functionality is turned off. -- 1 — Functionality is turned on. +- 0 — Functionality is turned off. +- 1 — Functionality is turned on. If `use_minimalistic_part_header_in_zookeeper = 1`, then [replicated](../../engines/table-engines/mergetree-family/replication.md) tables store the headers of the data parts compactly using a single `znode`. If the table contains many columns, this storage method significantly reduces the volume of the data stored in Zookeeper. @@ -1896,7 +1896,7 @@ The update is performed asynchronously, in a separate system thread. **See also** -- [background_schedule_pool_size](../../operations/settings/settings.md#background_schedule_pool_size) +- [background_schedule_pool_size](../../operations/settings/settings.md#background_schedule_pool_size) ## distributed_ddl {#server-settings-distributed_ddl} @@ -1954,9 +1954,9 @@ Default value: `/var/lib/clickhouse/access/`. ## user_directories {#user_directories} Section of the configuration file that contains settings: -- Path to configuration file with predefined users. -- Path to folder where users created by SQL commands are stored. -- ZooKeeper node path where users created by SQL commands are stored and replicated (experimental). +- Path to configuration file with predefined users. +- Path to folder where users created by SQL commands are stored. +- ZooKeeper node path where users created by SQL commands are stored and replicated (experimental). If this section is specified, the path from [users_config](../../operations/server-configuration-parameters/settings.md#users-config) and [access_control_path](../../operations/server-configuration-parameters/settings.md#access_control_path) won't be used. @@ -1991,8 +1991,8 @@ Users, roles, row policies, quotas, and profiles can be also stored in ZooKeeper You can also define sections `memory` — means storing information only in memory, without writing to disk, and `ldap` — means storing information on an LDAP server. To add an LDAP server as a remote user directory of users that are not defined locally, define a single `ldap` section with a following parameters: -- `server` — one of LDAP server names defined in `ldap_servers` config section. This parameter is mandatory and cannot be empty. -- `roles` — section with a list of locally defined roles that will be assigned to each user retrieved from the LDAP server. If no roles are specified, user will not be able to perform any actions after authentication. If any of the listed roles is not defined locally at the time of authentication, the authentication attempt will fail as if the provided password was incorrect. +- `server` — one of LDAP server names defined in `ldap_servers` config section. This parameter is mandatory and cannot be empty. +- `roles` — section with a list of locally defined roles that will be assigned to each user retrieved from the LDAP server. If no roles are specified, user will not be able to perform any actions after authentication. If any of the listed roles is not defined locally at the time of authentication, the authentication attempt will fail as if the provided password was incorrect. **Example** @@ -2012,7 +2012,7 @@ Sets the memory size (in bytes) for a stack trace at every peak allocation step. Possible values: -- Positive integer. +- Positive integer. Default value: `4194304`. @@ -2022,8 +2022,8 @@ Allows to collect random allocations and deallocations and writes them in the [s Possible values: -- Positive integer. -- 0 — Writing of random allocations and deallocations in the `system.trace_log` system table is disabled. +- Positive integer. +- 0 — Writing of random allocations and deallocations in the `system.trace_log` system table is disabled. Default value: `0`. @@ -2033,7 +2033,7 @@ Sets the cache size (in bytes) for mapped files. This setting allows to avoid fr Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -2043,7 +2043,7 @@ Sets the cache size (in bytes) for [compiled expressions](../../operations/cache Possible values: -- Positive integer. +- Positive integer. Default value: `134217728`. @@ -2053,6 +2053,6 @@ Sets the cache size (in elements) for [compiled expressions](../../operations/ca Possible values: -- Positive integer. +- Positive integer. Default value: `10000`. diff --git a/docs/en/operations/settings/index.md b/docs/en/operations/settings/index.md index fae282c861f..eb1d5db5676 100644 --- a/docs/en/operations/settings/index.md +++ b/docs/en/operations/settings/index.md @@ -22,9 +22,9 @@ The order of priority for defining a setting is: 3. Query settings - - When starting the ClickHouse console client in non-interactive mode, set the startup parameter `--setting=value`. - - When using the HTTP API, pass CGI parameters (`URL?setting_1=value&setting_2=value...`). - - Define settings in the [SETTINGS](../../sql-reference/statements/select/index.md#settings-in-select-query) clause of the SELECT query. The setting value is applied only to that query and is reset to the default or previous value after the query is executed. + - When starting the ClickHouse console client in non-interactive mode, set the startup parameter `--setting=value`. + - When using the HTTP API, pass CGI parameters (`URL?setting_1=value&setting_2=value...`). + - Define settings in the [SETTINGS](../../sql-reference/statements/select/index.md#settings-in-select-query) clause of the SELECT query. The setting value is applied only to that query and is reset to the default or previous value after the query is executed. View the [Settings](./settings.md) page for a description of the ClickHouse settings. @@ -93,4 +93,4 @@ SELECT getSetting('custom_a'); **See Also** -- [Server Configuration Settings](../../operations/server-configuration-parameters/settings.md) +- [Server Configuration Settings](../../operations/server-configuration-parameters/settings.md) diff --git a/docs/en/operations/settings/merge-tree-settings.md b/docs/en/operations/settings/merge-tree-settings.md index e8b14c10392..0b1207ee7b6 100644 --- a/docs/en/operations/settings/merge-tree-settings.md +++ b/docs/en/operations/settings/merge-tree-settings.md @@ -13,7 +13,7 @@ If the number of broken parts in a single partition exceeds the `max_suspicious_ Possible values: -- Any positive integer. +- Any positive integer. Default value: 100. @@ -54,7 +54,7 @@ If the number of active parts in a single partition exceeds the `parts_to_throw_ Possible values: -- Any positive integer. +- Any positive integer. Default value: 300. @@ -69,7 +69,7 @@ If the number of active parts in a single partition exceeds the `parts_to_delay_ Possible values: -- Any positive integer. +- Any positive integer. Default value: 150. @@ -81,7 +81,7 @@ If the number of inactive parts in a single partition more than the `inactive_pa Possible values: -- Any positive integer. +- Any positive integer. Default value: 0 (unlimited). @@ -91,7 +91,7 @@ If the number of inactive parts in a single partition in the table at least that Possible values: -- Any positive integer. +- Any positive integer. Default value: 0 (unlimited). @@ -101,7 +101,7 @@ The value in seconds, which is used to calculate the `INSERT` delay, if the numb Possible values: -- Any positive integer. +- Any positive integer. Default value: 1. @@ -127,7 +127,7 @@ If the total number of active parts in all partitions of a table exceeds the `ma Possible values: -- Any positive integer. +- Any positive integer. Default value: 100000. @@ -146,8 +146,8 @@ The number of most recently inserted blocks for which ClickHouse Keeper stores h Possible values: -- Any positive integer. -- 0 (disable deduplication) +- Any positive integer. +- 0 (disable deduplication) Default value: 100. @@ -161,8 +161,8 @@ The number of the most recently inserted blocks in the non-replicated [MergeTree Possible values: -- Any positive integer. -- 0 (disable deduplication). +- Any positive integer. +- 0 (disable deduplication). Default value: 0. @@ -174,7 +174,7 @@ The number of seconds after which the hash sums of the inserted blocks are remov Possible values: -- Any positive integer. +- Any positive integer. Default value: 604800 (1 week). @@ -188,8 +188,8 @@ The number of most recently async inserted blocks for which ClickHouse Keeper st Possible values: -- Any positive integer. -- 0 (disable deduplication for async_inserts) +- Any positive integer. +- 0 (disable deduplication for async_inserts) Default value: 10000. @@ -203,7 +203,7 @@ The number of seconds after which the hash sums of the async inserts are removed Possible values: -- Any positive integer. +- Any positive integer. Default value: 604800 (1 week). @@ -229,7 +229,7 @@ The minimum interval (in milliseconds) to update the `use_async_block_ids_cache` Possible values: -- Any positive integer. +- Any positive integer. Default value: 100. @@ -241,7 +241,7 @@ How many records may be in the ClickHouse Keeper log if there is inactive replic Possible values: -- Any positive integer. +- Any positive integer. Default value: 1000 @@ -251,7 +251,7 @@ Keep about this number of last records in ZooKeeper log, even if they are obsole Possible values: -- Any positive integer. +- Any positive integer. Default value: 10 @@ -261,7 +261,7 @@ If the time passed since a replication log (ClickHouse Keeper or ZooKeeper) entr Possible values: -- Any positive integer. +- Any positive integer. Default value: 3600 @@ -271,7 +271,7 @@ If the sum of the size of parts exceeds this threshold and the time since a repl Possible values: -- Any positive integer. +- Any positive integer. Default value: 10,737,418,240 @@ -281,7 +281,7 @@ When this setting has a value greater than zero, only a single replica starts th Possible values: -- Any positive integer. +- Any positive integer. Default value: 0 (seconds) @@ -295,7 +295,7 @@ Zero-copy replication is disabled by default in ClickHouse version 22.8 and high Possible values: -- Any positive integer. +- Any positive integer. Default value: 10800 @@ -305,7 +305,7 @@ Recompression works slow in most cases, so we don't start merge with recompressi Possible values: -- Any positive integer. +- Any positive integer. Default value: 7200 @@ -315,7 +315,7 @@ If true, this replica never merges parts and always downloads merged parts from Possible values: -- true, false +- true, false Default value: false @@ -325,7 +325,7 @@ Max broken parts, if more - deny automatic deletion. Possible values: -- Any positive integer. +- Any positive integer. Default value: 100 @@ -336,7 +336,7 @@ Max size of all broken parts, if more - deny automatic deletion. Possible values: -- Any positive integer. +- Any positive integer. Default value: 1,073,741,824 @@ -346,7 +346,7 @@ Do not apply ALTER if number of files for modification(deletion, addition) is gr Possible values: -- Any positive integer. +- Any positive integer. Default value: 75 @@ -356,7 +356,7 @@ Do not apply ALTER, if the number of files for deletion is greater than this set Possible values: -- Any positive integer. +- Any positive integer. Default value: 50 @@ -366,7 +366,7 @@ If the ratio of wrong parts to total number of parts is less than this - allow t Possible values: -- Float, 0.0 - 1.0 +- Float, 0.0 - 1.0 Default value: 0.5 @@ -376,7 +376,7 @@ Limit parallel fetches from endpoint (actually pool size). Possible values: -- Any positive integer. +- Any positive integer. Default value: 15 @@ -386,7 +386,7 @@ HTTP connection timeout for part fetch requests. Inherited from default profile Possible values: -- Any positive integer. +- Any positive integer. Default value: Inherited from default profile `http_connection_timeout` if not set explicitly. @@ -396,7 +396,7 @@ If true, replicated tables replicas on this node will try to acquire leadership. Possible values: -- true, false +- true, false Default value: true @@ -406,7 +406,7 @@ ZooKeeper session expiration check period, in seconds. Possible values: -- Any positive integer. +- Any positive integer. Default value: 60 @@ -416,7 +416,7 @@ Do not remove old local parts when repairing lost replica. Possible values: -- true, false +- true, false Default value: true @@ -426,8 +426,8 @@ HTTP connection timeout (in seconds) for part fetch requests. Inherited from def Possible values: -- Any positive integer. -- 0 - Use value of `http_connection_timeout`. +- Any positive integer. +- 0 - Use value of `http_connection_timeout`. Default value: 0. @@ -437,8 +437,8 @@ HTTP send timeout (in seconds) for part fetch requests. Inherited from default p Possible values: -- Any positive integer. -- 0 - Use value of `http_send_timeout`. +- Any positive integer. +- 0 - Use value of `http_send_timeout`. Default value: 0. @@ -448,8 +448,8 @@ HTTP receive timeout (in seconds) for fetch part requests. Inherited from defaul Possible values: -- Any positive integer. -- 0 - Use value of `http_receive_timeout`. +- Any positive integer. +- 0 - Use value of `http_receive_timeout`. Default value: 0. @@ -463,8 +463,8 @@ The setting isn't followed perfectly accurately. Possible values: -- Positive integer. -- 0 — Unlimited. +- Positive integer. +- 0 — Unlimited. Default value: `0`. @@ -482,8 +482,8 @@ The setting isn't followed perfectly accurately. Possible values: -- Positive integer. -- 0 — Unlimited. +- Positive integer. +- 0 — Unlimited. Default value: `0`. @@ -497,7 +497,7 @@ The time (in seconds) of storing inactive parts to protect against data loss dur Possible values: -- Any positive integer. +- Any positive integer. Default value: 480. @@ -520,7 +520,7 @@ The maximum total parts size (in bytes) to be merged into one part, if there are Possible values: -- Any positive integer. +- Any positive integer. Default value: 161061273600 (150 GB). @@ -534,7 +534,7 @@ The maximum total part size (in bytes) to be merged into one part, with the mini Possible values: -- Any positive integer. +- Any positive integer. Default value: 1048576 (1 MB) @@ -547,7 +547,7 @@ The number of rows that are read from the merged parts into memory. Possible values: -- Any positive integer. +- Any positive integer. Default value: 8192 @@ -560,7 +560,7 @@ This is to allow small merges to process - not filling the pool with long runnin Possible values: -- Any positive integer. +- Any positive integer. Default value: 8 @@ -571,7 +571,7 @@ This is to leave free threads for regular merges and avoid "Too many parts". Possible values: -- Any positive integer. +- Any positive integer. Default value: 20 @@ -585,7 +585,7 @@ The maximum number of threads that read parts when ClickHouse starts. Possible values: -- Any positive integer. +- Any positive integer. Default value: auto (number of CPU cores). @@ -599,7 +599,7 @@ The setting value specified when the table is created can be overridden via quer Possible values: -- Any positive integer. +- Any positive integer. Default value: -1 (unlimited). @@ -609,7 +609,7 @@ Merge parts if every part in the range is older than the value of `min_age_to_fo Possible values: -- Positive integer. +- Positive integer. Default value: 0 — Disabled. @@ -619,7 +619,7 @@ Whether `min_age_to_force_merge_seconds` should be applied only on the entire pa Possible values: -- true, false +- true, false Default value: false @@ -629,8 +629,8 @@ Enables to allow floating-point number as a partition key. Possible values: -- 0 — Floating-point partition key not allowed. -- 1 — Floating-point partition key allowed. +- 0 — Floating-point partition key not allowed. +- 1 — Floating-point partition key allowed. Default value: `0`. @@ -640,8 +640,8 @@ Enables the check at table creation, that the data type of a column for sampling Possible values: -- true — The check is enabled. -- false — The check is disabled at table creation. +- true — The check is enabled. +- false — The check is disabled at table creation. Default value: `true`. @@ -653,8 +653,8 @@ Sets minimal amount of bytes to enable balancing when distributing new big parts Possible values: -- Positive integer. -- 0 — Balancing is disabled. +- Positive integer. +- 0 — Balancing is disabled. Default value: `0`. @@ -670,8 +670,8 @@ The setting is applicable to `MergeTree` tables with enabled [data replication]( Possible values: -- 0 — Parts are removed. -- 1 — Parts are detached. +- 0 — Parts are removed. +- 1 — Parts are detached. Default value: `0`. @@ -681,7 +681,7 @@ Sets the interval in seconds for ClickHouse to execute the cleanup of old tempor Possible values: -- Any positive integer. +- Any positive integer. Default value: `60` seconds. @@ -691,7 +691,7 @@ Sets the interval in seconds for ClickHouse to execute the cleanup of old parts, Possible values: -- Any positive integer. +- Any positive integer. Default value: `1` second. @@ -701,8 +701,8 @@ Max number of concurrently executed queries related to the MergeTree table. Quer Possible values: -- Positive integer. -- 0 — No limit. +- Positive integer. +- 0 — No limit. Default value: `0` (no limit). @@ -718,8 +718,8 @@ The minimal number of marks read by the query for applying the [max_concurrent_q Possible values: -- Positive integer. -- 0 — Disabled (`max_concurrent_queries` limit applied to no queries). +- Positive integer. +- 0 — Disabled (`max_concurrent_queries` limit applied to no queries). Default value: `0` (limit never applied). @@ -838,6 +838,6 @@ Enable/disable automatic deletion of rows flagged as `is_deleted` when perform ` Possible values: -- `Always` or `Never`. +- `Always` or `Never`. Default value: `Never` \ No newline at end of file diff --git a/docs/en/operations/settings/permissions-for-queries.md b/docs/en/operations/settings/permissions-for-queries.md index c565de9b21a..9e9c564d426 100644 --- a/docs/en/operations/settings/permissions-for-queries.md +++ b/docs/en/operations/settings/permissions-for-queries.md @@ -21,8 +21,8 @@ Restricts permissions for read data, write data, and change settings queries. When set to 1, allows: -- All types of read queries (like SELECT and equivalent queries). -- Queries that modify only session context (like USE). +- All types of read queries (like SELECT and equivalent queries). +- Queries that modify only session context (like USE). When set to 2, allows the above plus: - SET and CREATE TEMPORARY TABLE @@ -33,9 +33,9 @@ When set to 2, allows the above plus: Possible values: -- 0 — Read, Write, and Change settings queries are allowed. -- 1 — Only Read data queries are allowed. -- 2 — Read data and Change settings queries are allowed. +- 0 — Read, Write, and Change settings queries are allowed. +- 1 — Only Read data queries are allowed. +- 2 — Read data and Change settings queries are allowed. Default value: 0 @@ -54,8 +54,8 @@ Allows or denies [DDL](https://en.wikipedia.org/wiki/Data_definition_language) q Possible values: -- 0 — DDL queries are not allowed. -- 1 — DDL queries are allowed. +- 0 — DDL queries are not allowed. +- 1 — DDL queries are allowed. Default value: 1 diff --git a/docs/en/operations/settings/query-complexity.md b/docs/en/operations/settings/query-complexity.md index 7a6b2340d29..48e6656df06 100644 --- a/docs/en/operations/settings/query-complexity.md +++ b/docs/en/operations/settings/query-complexity.md @@ -101,8 +101,8 @@ Enables or disables execution of `GROUP BY` clauses in external memory. See [GRO Possible values: -- Maximum volume of RAM (in bytes) that can be used by the single [GROUP BY](../../sql-reference/statements/select/group-by.md#select-group-by-clause) operation. -- 0 — `GROUP BY` in external memory disabled. +- Maximum volume of RAM (in bytes) that can be used by the single [GROUP BY](../../sql-reference/statements/select/group-by.md#select-group-by-clause) operation. +- 0 — `GROUP BY` in external memory disabled. Default value: 0. @@ -257,8 +257,8 @@ ClickHouse can proceed with different actions when the limit is reached. Use the Possible values: -- Positive integer. -- 0 — Unlimited number of rows. +- Positive integer. +- 0 — Unlimited number of rows. Default value: 0. @@ -274,8 +274,8 @@ ClickHouse can proceed with different actions when the limit is reached. Use [jo Possible values: -- Positive integer. -- 0 — Memory control is disabled. +- Positive integer. +- 0 — Memory control is disabled. Default value: 0. @@ -283,27 +283,27 @@ Default value: 0. Defines what action ClickHouse performs when any of the following join limits is reached: -- [max_bytes_in_join](#settings-max_bytes_in_join) -- [max_rows_in_join](#settings-max_rows_in_join) +- [max_bytes_in_join](#settings-max_bytes_in_join) +- [max_rows_in_join](#settings-max_rows_in_join) Possible values: -- `THROW` — ClickHouse throws an exception and breaks operation. -- `BREAK` — ClickHouse breaks operation and does not throw an exception. +- `THROW` — ClickHouse throws an exception and breaks operation. +- `BREAK` — ClickHouse breaks operation and does not throw an exception. Default value: `THROW`. **See Also** -- [JOIN clause](../../sql-reference/statements/select/join.md#select-join) -- [Join table engine](../../engines/table-engines/special/join.md) +- [JOIN clause](../../sql-reference/statements/select/join.md#select-join) +- [Join table engine](../../engines/table-engines/special/join.md) ## max_partitions_per_insert_block {#max-partitions-per-insert-block} Limits the maximum number of partitions in a single inserted block. -- Positive integer. -- 0 — Unlimited number of partitions. +- Positive integer. +- 0 — Unlimited number of partitions. Default value: 100. diff --git a/docs/en/operations/settings/settings-formats.md b/docs/en/operations/settings/settings-formats.md index 91b67ee8238..ef4bbeeba89 100644 --- a/docs/en/operations/settings/settings-formats.md +++ b/docs/en/operations/settings/settings-formats.md @@ -24,8 +24,8 @@ Supported formats: Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -52,8 +52,8 @@ Supported formats: Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -72,8 +72,8 @@ Supported formats: Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -87,8 +87,8 @@ When this option is enabled, extended table metadata are sent from server to cli Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -103,8 +103,8 @@ For complex default expressions `input_format_defaults_for_omitted_fields` must Possible values: -- 0 — Inserting `NULL` into a not nullable column causes an exception. -- 1 — `NULL` fields are initialized with default column values. +- 0 — Inserting `NULL` into a not nullable column causes an exception. +- 1 — `NULL` fields are initialized with default column values. Default value: `1`. @@ -179,11 +179,11 @@ The setting does not apply to [date and time functions](../../sql-reference/func Possible values: -- `'best_effort'` — Enables extended parsing. +- `'best_effort'` — Enables extended parsing. ClickHouse can parse the basic `YYYY-MM-DD HH:MM:SS` format and all [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time formats. For example, `'2018-06-08T01:02:03.000Z'`. -- `'basic'` — Use basic parser. +- `'basic'` — Use basic parser. ClickHouse can parse only the basic `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DD` format. For example, `2019-08-20 10:18:56` or `2019-08-20`. @@ -191,8 +191,8 @@ Default value: `'basic'`. See also: -- [DateTime data type.](../../sql-reference/data-types/datetime.md) -- [Functions for working with dates and times.](../../sql-reference/functions/date-time-functions.md) +- [DateTime data type.](../../sql-reference/data-types/datetime.md) +- [Functions for working with dates and times.](../../sql-reference/functions/date-time-functions.md) ## date_time_output_format {#date_time_output_format} @@ -200,15 +200,15 @@ Allows choosing different output formats of the text representation of date and Possible values: -- `simple` - Simple output format. +- `simple` - Simple output format. ClickHouse output date and time `YYYY-MM-DD hh:mm:ss` format. For example, `2019-08-20 10:18:56`. The calculation is performed according to the data type's time zone (if present) or server time zone. -- `iso` - ISO output format. +- `iso` - ISO output format. ClickHouse output date and time in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) `YYYY-MM-DDThh:mm:ssZ` format. For example, `2019-08-20T10:18:56Z`. Note that output is in UTC (`Z` means UTC). -- `unix_timestamp` - Unix timestamp output format. +- `unix_timestamp` - Unix timestamp output format. ClickHouse output date and time in [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time) format. For example `1566285536`. @@ -216,8 +216,8 @@ Default value: `simple`. See also: -- [DateTime data type.](../../sql-reference/data-types/datetime.md) -- [Functions for working with dates and times.](../../sql-reference/functions/date-time-functions.md) +- [DateTime data type.](../../sql-reference/data-types/datetime.md) +- [Functions for working with dates and times.](../../sql-reference/functions/date-time-functions.md) ## input_format_ipv4_default_on_conversion_error {#input_format_ipv4_default_on_conversion_error} @@ -298,8 +298,8 @@ By default, when inserting data into a `Distributed` table with more than one sh Possible values: -- 0 — Insertion is rejected if there are multiple shards and no distributed key is given. -- 1 — Insertion is done randomly among all available shards when no distributed key is given. +- 0 — Insertion is rejected if there are multiple shards and no distributed key is given. +- 1 — Insertion is done randomly among all available shards when no distributed key is given. Default value: `0`. @@ -311,18 +311,18 @@ Enables or disables the insertion of JSON data with nested objects. Supported formats: -- [JSONEachRow](../../interfaces/formats.md/#jsoneachrow) +- [JSONEachRow](../../interfaces/formats.md/#jsoneachrow) Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. See also: -- [Usage of Nested Structures](../../interfaces/formats.md/#jsoneachrow-nested) with the `JSONEachRow` format. +- [Usage of Nested Structures](../../interfaces/formats.md/#jsoneachrow-nested) with the `JSONEachRow` format. ## input_format_json_read_bools_as_numbers {#input_format_json_read_bools_as_numbers} @@ -373,8 +373,8 @@ Such integers are enclosed in quotes by default. This behavior is compatible wit Possible values: -- 0 — Integers are output without quotes. -- 1 — Integers are enclosed in quotes. +- 0 — Integers are output without quotes. +- 1 — Integers are enclosed in quotes. Default value: 1. @@ -390,8 +390,8 @@ Enables `+nan`, `-nan`, `+inf`, `-inf` outputs in [JSON](../../interfaces/format Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -526,8 +526,8 @@ Enables the ability to output all rows as a JSON array in the [JSONEachRow](../. Possible values: -- 1 — ClickHouse outputs all rows as an array, each row in the `JSONEachRow` format. -- 0 — ClickHouse outputs each row separately in the `JSONEachRow` format. +- 1 — ClickHouse outputs all rows as an array, each row in the `JSONEachRow` format. +- 0 — ClickHouse outputs each row separately in the `JSONEachRow` format. Default value: `0`. @@ -594,8 +594,8 @@ When enabled, always treat enum values as enum ids for TSV input format. It's re Possible values: -- 0 — Enum values are parsed as values or as enum IDs. -- 1 — Enum values are parsed only as enum IDs. +- 0 — Enum values are parsed as values or as enum IDs. +- 1 — Enum values are parsed only as enum IDs. Default value: 0. @@ -743,8 +743,8 @@ When enabled, always treat enum values as enum ids for CSV input format. It's re Possible values: -- 0 — Enum values are parsed as values or as enum IDs. -- 1 — Enum values are parsed only as enum IDs. +- 0 — Enum values are parsed as values or as enum IDs. +- 1 — Enum values are parsed only as enum IDs. Default value: 0. @@ -873,11 +873,11 @@ Enables or disables the full SQL parser if the fast stream parser can’t parse Possible values: -- 0 — Disabled. +- 0 — Disabled. In this case, you must provide formatted data. See the [Formats](../../interfaces/formats.md) section. -- 1 — Enabled. +- 1 — Enabled. In this case, you can use an SQL expression as a value, but data insertion is much slower this way. If you insert only formatted data, then ClickHouse behaves as if the setting value is 0. @@ -923,8 +923,8 @@ Enables or disables template deduction for SQL expressions in [Values](../../int Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -934,9 +934,9 @@ For the following query: INSERT INTO test VALUES (lower('Hello')), (lower('world')), (lower('INSERT')), (upper('Values')), ... ``` -- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=0`, expressions are interpreted separately for each row (this is very slow for large number of rows). -- If `input_format_values_interpret_expressions=0` and `format_values_deduce_templates_of_expressions=1`, expressions in the first, second and third rows are parsed using template `lower(String)` and interpreted together, expression in the forth row is parsed with another template (`upper(String)`). -- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=1`, the same as in previous case, but also allows fallback to interpreting expressions separately if it’s not possible to deduce template. +- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=0`, expressions are interpreted separately for each row (this is very slow for large number of rows). +- If `input_format_values_interpret_expressions=0` and `format_values_deduce_templates_of_expressions=1`, expressions in the first, second and third rows are parsed using template `lower(String)` and interpreted together, expression in the forth row is parsed with another template (`upper(String)`). +- If `input_format_values_interpret_expressions=1` and `format_values_deduce_templates_of_expressions=1`, the same as in previous case, but also allows fallback to interpreting expressions separately if it’s not possible to deduce template. ### input_format_values_accurate_types_of_literals {#input_format_values_accurate_types_of_literals} @@ -950,11 +950,11 @@ This setting is used only when `input_format_values_deduce_templates_of_expressi Possible values: -- 0 — Disabled. +- 0 — Disabled. In this case, ClickHouse may use a more general type for some literals (e.g., `Float64` or `Int64` instead of `UInt64` for `42`), but it may cause overflow and precision issues. -- 1 — Enabled. +- 1 — Enabled. In this case, ClickHouse checks the actual type of literal and uses an expression template of the corresponding type. In some cases, it may significantly slow down expression evaluation in `Values`. @@ -968,8 +968,8 @@ Enables or disables the ability to insert the data into [Nested](../../sql-refer Possible values: -- 0 — Data can not be inserted into `Nested` columns as an array of structs. -- 1 — Data can be inserted into `Nested` columns as an array of structs. +- 0 — Data can not be inserted into `Nested` columns as an array of structs. +- 1 — Data can be inserted into `Nested` columns as an array of structs. Default value: `0`. @@ -997,8 +997,8 @@ Allows to convert the [LowCardinality](../../sql-reference/data-types/lowcardina Possible values: -- 0 — The `LowCardinality` type is not converted to the `DICTIONARY` type. -- 1 — The `LowCardinality` type is converted to the `DICTIONARY` type. +- 0 — The `LowCardinality` type is not converted to the `DICTIONARY` type. +- 1 — The `LowCardinality` type is converted to the `DICTIONARY` type. Default value: `0`. @@ -1028,8 +1028,8 @@ Enables or disables the ability to insert the data into [Nested](../../sql-refer Possible values: -- 0 — Data can not be inserted into `Nested` columns as an array of structs. -- 1 — Data can be inserted into `Nested` columns as an array of structs. +- 0 — Data can not be inserted into `Nested` columns as an array of structs. +- 1 — Data can be inserted into `Nested` columns as an array of structs. Default value: `0`. @@ -1077,8 +1077,8 @@ Enables or disables the ability to insert the data into [Nested](../../sql-refer Possible values: -- 0 — Data can not be inserted into `Nested` columns as an array of structs. -- 1 — Data can be inserted into `Nested` columns as an array of structs. +- 0 — Data can not be inserted into `Nested` columns as an array of structs. +- 1 — Data can be inserted into `Nested` columns as an array of structs. Default value: `0`. @@ -1192,8 +1192,8 @@ Enables using fields that are not specified in [Avro](../../interfaces/formats.m Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -1211,9 +1211,9 @@ Type: string Possible values: -- `null` — No compression -- `deflate` — Compress with Deflate (zlib) -- `snappy` — Compress with [Snappy](https://google.github.io/snappy/) +- `null` — No compression +- `deflate` — Compress with Deflate (zlib) +- `snappy` — Compress with [Snappy](https://google.github.io/snappy/) Default value: `snappy` (if available) or `deflate`. @@ -1260,8 +1260,8 @@ Limits the width of value displayed in [Pretty](../../interfaces/formats.md/#pre Possible values: -- Positive integer. -- 0 — The value is cut completely. +- Positive integer. +- 0 — The value is cut completely. Default value: `10000` symbols. @@ -1336,8 +1336,8 @@ Adds row numbers to output in the [Pretty](../../interfaces/formats.md/#pretty) Possible values: -- 0 — Output without row numbers. -- 1 — Output with row numbers. +- 0 — Output without row numbers. +- 1 — Output with row numbers. Default value: `0`. @@ -1381,12 +1381,12 @@ Sets the field escaping rule for [CustomSeparated](../../interfaces/formats.md/# Possible values: -- `'Escaped'` — Similarly to [TSV](../../interfaces/formats.md/#tabseparated). -- `'Quoted'` — Similarly to [Values](../../interfaces/formats.md/#data-format-values). -- `'CSV'` — Similarly to [CSV](../../interfaces/formats.md/#csv). -- `'JSON'` — Similarly to [JSONEachRow](../../interfaces/formats.md/#jsoneachrow). -- `'XML'` — Similarly to [XML](../../interfaces/formats.md/#xml). -- `'Raw'` — Extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](../../interfaces/formats.md/#tabseparatedraw). +- `'Escaped'` — Similarly to [TSV](../../interfaces/formats.md/#tabseparated). +- `'Quoted'` — Similarly to [Values](../../interfaces/formats.md/#data-format-values). +- `'CSV'` — Similarly to [CSV](../../interfaces/formats.md/#csv). +- `'JSON'` — Similarly to [JSONEachRow](../../interfaces/formats.md/#jsoneachrow). +- `'XML'` — Similarly to [XML](../../interfaces/formats.md/#xml). +- `'Raw'` — Extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](../../interfaces/formats.md/#tabseparatedraw). Default value: `'Escaped'`. @@ -1434,12 +1434,12 @@ Field escaping rule. Possible values: -- `'Escaped'` — Similarly to [TSV](../../interfaces/formats.md/#tabseparated). -- `'Quoted'` — Similarly to [Values](../../interfaces/formats.md/#data-format-values). -- `'CSV'` — Similarly to [CSV](../../interfaces/formats.md/#csv). -- `'JSON'` — Similarly to [JSONEachRow](../../interfaces/formats.md/#jsoneachrow). -- `'XML'` — Similarly to [XML](../../interfaces/formats.md/#xml). -- `'Raw'` — Extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](../../interfaces/formats.md/#tabseparatedraw). +- `'Escaped'` — Similarly to [TSV](../../interfaces/formats.md/#tabseparated). +- `'Quoted'` — Similarly to [Values](../../interfaces/formats.md/#data-format-values). +- `'CSV'` — Similarly to [CSV](../../interfaces/formats.md/#csv). +- `'JSON'` — Similarly to [JSONEachRow](../../interfaces/formats.md/#jsoneachrow). +- `'XML'` — Similarly to [XML](../../interfaces/formats.md/#xml). +- `'Raw'` — Extracts subpatterns as a whole, no escaping rules, similarly to [TSVRaw](../../interfaces/formats.md/#tabseparatedraw). Default value: `Raw`. @@ -1457,9 +1457,9 @@ Determines how to map ClickHouse `Enum` data type and [CapnProto](../../interfac Possible values: -- `'by_values'` — Values in enums should be the same, names can be different. -- `'by_names'` — Names in enums should be the same, values can be different. -- `'by_name_case_insensitive'` — Names in enums should be the same case-insensitive, values can be different. +- `'by_values'` — Values in enums should be the same, names can be different. +- `'by_names'` — Names in enums should be the same, values can be different. +- `'by_name_case_insensitive'` — Names in enums should be the same case-insensitive, values can be different. Default value: `'by_values'`. diff --git a/docs/en/operations/settings/settings-users.md b/docs/en/operations/settings/settings-users.md index bafac853377..9f6fe87ae5f 100644 --- a/docs/en/operations/settings/settings-users.md +++ b/docs/en/operations/settings/settings-users.md @@ -47,13 +47,13 @@ Structure of the `users` section: Password can be specified in plaintext or in SHA256 (hex format). -- To assign a password in plaintext (**not recommended**), place it in a `password` element. +- To assign a password in plaintext (**not recommended**), place it in a `password` element. For example, `qwerty`. The password can be left blank. -- To assign a password using its SHA256 hash, place it in a `password_sha256_hex` element. +- To assign a password using its SHA256 hash, place it in a `password_sha256_hex` element. For example, `65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5`. @@ -65,7 +65,7 @@ Password can be specified in plaintext or in SHA256 (hex format). -- For compatibility with MySQL clients, password can be specified in double SHA1 hash. Place it in `password_double_sha1_hex` element. +- For compatibility with MySQL clients, password can be specified in double SHA1 hash. Place it in `password_double_sha1_hex` element. For example, `08b4a0f1de6ad37da17359e592c8d74788a83eb0`. @@ -81,8 +81,8 @@ This setting enables or disables using of SQL-driven [access control and account Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -92,17 +92,17 @@ List of networks from which the user can connect to the ClickHouse server. Each element of the list can have one of the following forms: -- `` — IP address or network mask. +- `` — IP address or network mask. Examples: `213.180.204.3`, `10.0.0.1/8`, `10.0.0.1/255.255.255.0`, `2a02:6b8::3`, `2a02:6b8::3/64`, `2a02:6b8::3/ffff:ffff:ffff:ffff::`. -- `` — Hostname. +- `` — Hostname. Example: `example01.host.ru`. To check access, a DNS query is performed, and all returned IP addresses are compared to the peer address. -- `` — Regular expression for hostnames. +- `` — Regular expression for hostnames. Example, `^example\d\d-\d\d-\d\.host\.ru$` diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index f690a6d506c..0fb0b15b75a 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -104,17 +104,17 @@ ClickHouse applies this setting when the query contains the product of distribut Restrictions: -- Only applied for IN and JOIN subqueries. -- Only if the FROM section uses a distributed table containing more than one shard. -- If the subquery concerns a distributed table containing more than one shard. -- Not used for a table-valued [remote](../../sql-reference/table-functions/remote.md) function. +- Only applied for IN and JOIN subqueries. +- Only if the FROM section uses a distributed table containing more than one shard. +- If the subquery concerns a distributed table containing more than one shard. +- Not used for a table-valued [remote](../../sql-reference/table-functions/remote.md) function. Possible values: -- `deny` — Default value. Prohibits using these types of subqueries (returns the “Double-distributed in/JOIN subqueries is denied” exception). -- `local` — Replaces the database and table in the subquery with local ones for the destination server (shard), leaving the normal `IN`/`JOIN.` -- `global` — Replaces the `IN`/`JOIN` query with `GLOBAL IN`/`GLOBAL JOIN.` -- `allow` — Allows the use of these types of subqueries. +- `deny` — Default value. Prohibits using these types of subqueries (returns the “Double-distributed in/JOIN subqueries is denied” exception). +- `local` — Replaces the database and table in the subquery with local ones for the destination server (shard), leaving the normal `IN`/`JOIN.` +- `global` — Replaces the `IN`/`JOIN` query with `GLOBAL IN`/`GLOBAL JOIN.` +- `allow` — Allows the use of these types of subqueries. ## prefer_global_in_and_join {#prefer-global-in-and-join} @@ -122,8 +122,8 @@ Enables the replacement of `IN`/`JOIN` operators with `GLOBAL IN`/`GLOBAL JOIN`. Possible values: -- 0 — Disabled. `IN`/`JOIN` operators are not replaced with `GLOBAL IN`/`GLOBAL JOIN`. -- 1 — Enabled. `IN`/`JOIN` operators are replaced with `GLOBAL IN`/`GLOBAL JOIN`. +- 0 — Disabled. `IN`/`JOIN` operators are not replaced with `GLOBAL IN`/`GLOBAL JOIN`. +- 1 — Enabled. `IN`/`JOIN` operators are replaced with `GLOBAL IN`/`GLOBAL JOIN`. Default value: `0`. @@ -137,7 +137,7 @@ Another use case of `prefer_global_in_and_join` is accessing tables created by **See also:** -- [Distributed subqueries](../../sql-reference/operators/in.md/#select-distributed-subqueries) for more information on how to use `GLOBAL IN`/`GLOBAL JOIN` +- [Distributed subqueries](../../sql-reference/operators/in.md/#select-distributed-subqueries) for more information on how to use `GLOBAL IN`/`GLOBAL JOIN` ## enable_optimize_predicate_expression {#enable-optimize-predicate-expression} @@ -147,8 +147,8 @@ Predicate pushdown may significantly reduce network traffic for distributed quer Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -195,8 +195,8 @@ Use data skipping indexes during query execution. Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -310,14 +310,14 @@ Sets the safety threshold for data volume generated by function [range](../../sq Possible values: -- Positive integer. +- Positive integer. Default value: `500,000,000`. **See Also** -- [max_block_size](#setting-max_block_size) -- [min_insert_block_size_rows](#min-insert-block-size-rows) +- [max_block_size](#setting-max_block_size) +- [min_insert_block_size_rows](#min-insert-block-size-rows) ## enable_http_compression {#settings-enable_http_compression} @@ -327,8 +327,8 @@ For more information, read the [HTTP interface description](../../interfaces/htt Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -348,8 +348,8 @@ For more information, read the [HTTP interface description](../../interfaces/htt Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -359,7 +359,7 @@ Sets the maximum URI length of an HTTP request. Possible values: -- Positive integer. +- Positive integer. Default value: 1048576. @@ -369,7 +369,7 @@ Sets the maximum number of addresses generated from patterns for the [remote](.. Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -379,7 +379,7 @@ Sets the maximum number of addresses generated from patterns for external storag Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -391,8 +391,8 @@ For more information, read the [HTTP interface description](../../interfaces/htt Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -402,8 +402,8 @@ Limits the maximum number of HTTP GET redirect hops for [URL](../../engines/tabl Possible values: -- Any positive integer number of hops. -- 0 — No hops allowed. +- Any positive integer number of hops. +- 0 — No hops allowed. Default value: 0. @@ -416,8 +416,8 @@ This setting is applicable to [INSERT ... SELECT](../../sql-reference/statements Possible values: -- 0 — Inserting `NULL` into a not nullable column causes an exception. -- 1 — Default column value is inserted instead of `NULL`. +- 0 — Inserting `NULL` into a not nullable column causes an exception. +- 1 — Default column value is inserted instead of `NULL`. Default value: `1`. @@ -427,10 +427,10 @@ Sets default strictness for [JOIN clauses](../../sql-reference/statements/select Possible values: -- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the normal `JOIN` behaviour from standard SQL. -- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of `ANY` and `ALL` are the same. -- `ASOF` — For joining sequences with an uncertain match. -- `Empty string` — If `ALL` or `ANY` is not specified in the query, ClickHouse throws an exception. +- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the normal `JOIN` behaviour from standard SQL. +- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of `ANY` and `ALL` are the same. +- `ASOF` — For joining sequences with an uncertain match. +- `Empty string` — If `ALL` or `ANY` is not specified in the query, ClickHouse throws an exception. Default value: `ALL`. @@ -499,16 +499,16 @@ This setting applies only for `JOIN` operations with [Join](../../engines/table- Possible values: -- 0 — If the right table has more than one matching row, only the first one found is joined. -- 1 — If the right table has more than one matching row, only the last one found is joined. +- 0 — If the right table has more than one matching row, only the first one found is joined. +- 1 — If the right table has more than one matching row, only the last one found is joined. Default value: 0. See also: -- [JOIN clause](../../sql-reference/statements/select/join.md/#select-join) -- [Join table engine](../../engines/table-engines/special/join.md) -- [join_default_strictness](#settings-join_default_strictness) +- [JOIN clause](../../sql-reference/statements/select/join.md/#select-join) +- [Join table engine](../../engines/table-engines/special/join.md) +- [join_default_strictness](#settings-join_default_strictness) ## join_use_nulls {#join_use_nulls} @@ -516,8 +516,8 @@ Sets the type of [JOIN](../../sql-reference/statements/select/join.md) behaviour Possible values: -- 0 — The empty cells are filled with the default value of the corresponding field type. -- 1 — `JOIN` behaves the same way as in standard SQL. The type of the corresponding field is converted to [Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable), and empty cells are filled with [NULL](../../sql-reference/syntax.md). +- 0 — The empty cells are filled with the default value of the corresponding field type. +- 1 — `JOIN` behaves the same way as in standard SQL. The type of the corresponding field is converted to [Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable), and empty cells are filled with [NULL](../../sql-reference/syntax.md). Default value: 0. @@ -529,14 +529,14 @@ Columns for these keys are filled with either default value or `NULL` in corresp Possible values: -- 0 — The default value for the aggregation key type is used to produce missing values. -- 1 — ClickHouse executes `GROUP BY` the same way as the SQL standard says. The types of aggregation keys are converted to [Nullable](/docs/en/sql-reference/data-types/nullable.md/#data_type-nullable). Columns for corresponding aggregation keys are filled with [NULL](/docs/en/sql-reference/syntax.md) for rows that didn't use it. +- 0 — The default value for the aggregation key type is used to produce missing values. +- 1 — ClickHouse executes `GROUP BY` the same way as the SQL standard says. The types of aggregation keys are converted to [Nullable](/docs/en/sql-reference/data-types/nullable.md/#data_type-nullable). Columns for corresponding aggregation keys are filled with [NULL](/docs/en/sql-reference/syntax.md) for rows that didn't use it. Default value: 0. See also: -- [GROUP BY clause](/docs/en/sql-reference/statements/select/group-by.md) +- [GROUP BY clause](/docs/en/sql-reference/statements/select/group-by.md) ## partial_merge_join_optimizations {#partial_merge_join_optimizations} @@ -546,8 +546,8 @@ By default, this setting enables improvements that could lead to wrong results. Possible values: -- 0 — Optimizations disabled. -- 1 — Optimizations enabled. +- 0 — Optimizations disabled. +- 1 — Optimizations enabled. Default value: 1. @@ -563,7 +563,7 @@ ClickHouse server: Possible values: -- Any positive integer. Recommended range of values: \[1000, 100000\]. +- Any positive integer. Recommended range of values: \[1000, 100000\]. Default value: 65536. @@ -575,7 +575,7 @@ The bigger the value of the setting, the more RAM is used and the less disk I/O Possible values: -- Any positive integer, starting from 2. +- Any positive integer, starting from 2. Default value: 64. @@ -589,24 +589,24 @@ Use this setting only for backward compatibility if your use cases depend on leg When the legacy behaviour is enabled: -- Results of `t1 ANY LEFT JOIN t2` and `t2 ANY RIGHT JOIN t1` operations are not equal because ClickHouse uses the logic with many-to-one left-to-right table keys mapping. -- Results of `ANY INNER JOIN` operations contain all rows from the left table like the `SEMI LEFT JOIN` operations do. +- Results of `t1 ANY LEFT JOIN t2` and `t2 ANY RIGHT JOIN t1` operations are not equal because ClickHouse uses the logic with many-to-one left-to-right table keys mapping. +- Results of `ANY INNER JOIN` operations contain all rows from the left table like the `SEMI LEFT JOIN` operations do. When the legacy behaviour is disabled: -- Results of `t1 ANY LEFT JOIN t2` and `t2 ANY RIGHT JOIN t1` operations are equal because ClickHouse uses the logic which provides one-to-many keys mapping in `ANY RIGHT JOIN` operations. -- Results of `ANY INNER JOIN` operations contain one row per key from both the left and right tables. +- Results of `t1 ANY LEFT JOIN t2` and `t2 ANY RIGHT JOIN t1` operations are equal because ClickHouse uses the logic which provides one-to-many keys mapping in `ANY RIGHT JOIN` operations. +- Results of `ANY INNER JOIN` operations contain one row per key from both the left and right tables. Possible values: -- 0 — Legacy behaviour is disabled. -- 1 — Legacy behaviour is enabled. +- 0 — Legacy behaviour is disabled. +- 1 — Legacy behaviour is enabled. Default value: 0. See also: -- [JOIN strictness](../../sql-reference/statements/select/join.md/#join-settings) +- [JOIN strictness](../../sql-reference/statements/select/join.md/#join-settings) ## temporary_files_codec {#temporary_files_codec} @@ -614,8 +614,8 @@ Sets compression codec for temporary files used in sorting and joining operation Possible values: -- LZ4 — [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression is applied. -- NONE — No compression is applied. +- LZ4 — [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression is applied. +- NONE — No compression is applied. Default value: LZ4. @@ -639,7 +639,7 @@ If the number of rows to be read from a file of a [MergeTree](../../engines/tabl Possible values: -- Positive integer. +- Positive integer. Default value: `163840`. @@ -649,7 +649,7 @@ The minimum number of lines to read from one file before the [MergeTree](../../e Possible values: -- Positive integer. +- Positive integer. Default value: `163840`. @@ -659,7 +659,7 @@ If the number of bytes to read from one file of a [MergeTree](../../engines/tabl Possible value: -- Positive integer. +- Positive integer. Default value: `251658240`. @@ -669,7 +669,7 @@ The minimum number of bytes to read from one file before [MergeTree](../../engin Possible values: -- Positive integer. +- Positive integer. Default value: `251658240`. @@ -679,7 +679,7 @@ If the distance between two data blocks to be read in one file is less than `mer Possible values: -- Any positive integer. +- Any positive integer. Default value: 0. @@ -689,7 +689,7 @@ If the distance between two data blocks to be read in one file is less than `mer Possible values: -- Any positive integer. +- Any positive integer. Default value: 0. @@ -699,7 +699,7 @@ When searching for data, ClickHouse checks the data marks in the index file. If Possible values: -- Any positive even integer. +- Any positive even integer. Default value: 8. @@ -711,7 +711,7 @@ The cache of uncompressed blocks stores data extracted for queries. ClickHouse u Possible values: -- Any positive integer. +- Any positive integer. Default value: 128 ✕ 8192. @@ -723,7 +723,7 @@ The cache of uncompressed blocks stores data extracted for queries. ClickHouse u Possible values: -- Any positive integer. +- Any positive integer. Default value: 2013265920. @@ -735,8 +735,8 @@ ClickHouse uses this setting when reading data from tables. If the total storage Possible values: -- 0 — Direct I/O is disabled. -- Positive integer. +- 0 — Direct I/O is disabled. +- Positive integer. Default value: 0. @@ -746,14 +746,14 @@ Sets the method of data compression that is used for communication between serve Possible values: -- `LZ4` — sets LZ4 compression method. -- `ZSTD` — sets ZSTD compression method. +- `LZ4` — sets LZ4 compression method. +- `ZSTD` — sets ZSTD compression method. Default value: `LZ4`. **See Also** -- [network_zstd_compression_level](#network_zstd_compression_level) +- [network_zstd_compression_level](#network_zstd_compression_level) ## network_zstd_compression_level {#network_zstd_compression_level} @@ -761,7 +761,7 @@ Adjusts the level of ZSTD compression. Used only when [network_compression_metho Possible values: -- Positive integer from 1 to 15. +- Positive integer from 1 to 15. Default value: `1`. @@ -789,8 +789,8 @@ Only the queries with the following type will get to the log: - `QUERY_FINISH` - `EXCEPTION_WHILE_PROCESSING` -- Type: milliseconds -- Default value: 0 (any query) +- Type: milliseconds +- Default value: 0 (any query) ## log_queries_min_type {#settings-log-queries-min-type} @@ -818,8 +818,8 @@ Query threads log into the [system.query_thread_log](../../operations/system-tab Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: `1`. @@ -847,8 +847,8 @@ Allows to log formatted queries to the [system.query_log](../../operations/syste Possible values: -- 0 — Formatted queries are not logged in the system table. -- 1 — Formatted queries are logged in the system table. +- 0 — Formatted queries are not logged in the system table. +- 1 — Formatted queries are logged in the system table. Default value: `0`. @@ -860,7 +860,7 @@ It can be used to improve the readability of server logs. Additionally, it helps Possible values: -- Any string no longer than [max_query_size](#settings-max_query_size). If the max_query_size is exceeded, the server throws an exception. +- Any string no longer than [max_query_size](#settings-max_query_size). If the max_query_size is exceeded, the server throws an exception. Default value: empty string. @@ -890,8 +890,8 @@ Write time that processor spent during execution/waiting for data to `system.pro See also: -- [`system.processors_profile_log`](../../operations/system-tables/processors_profile_log.md#system-processors_profile_log) -- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) +- [`system.processors_profile_log`](../../operations/system-tables/processors_profile_log.md#system-processors_profile_log) +- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) ## max_insert_block_size {#settings-max_insert_block_size} @@ -911,8 +911,8 @@ Sets the minimum number of rows in the block that can be inserted into a table b Possible values: -- Positive integer. -- 0 — Squashing disabled. +- Positive integer. +- 0 — Squashing disabled. Default value: 1048576. @@ -922,8 +922,8 @@ Sets the minimum number of bytes in the block which can be inserted into a table Possible values: -- Positive integer. -- 0 — Squashing disabled. +- Positive integer. +- 0 — Squashing disabled. Default value: 268435456. @@ -935,8 +935,8 @@ Sets the time in seconds. If a replica's lag is greater than or equal to the set Possible values: -- Positive integer. -- 0 — Replica lags are not checked. +- Positive integer. +- 0 — Replica lags are not checked. To prevent the use of any replica with a non-zero lag, set this parameter to 1. @@ -963,8 +963,8 @@ The maximum number of threads to execute the `INSERT SELECT` query. Possible values: -- 0 (or 1) — `INSERT SELECT` no parallel execution. -- Positive integer. Bigger than 1. +- 0 (or 1) — `INSERT SELECT` no parallel execution. +- Positive integer. Bigger than 1. Default value: 0. @@ -1010,8 +1010,8 @@ Limits maximum recursion depth in the recursive descent parser. Allows controlli Possible values: -- Positive integer. -- 0 — Recursion depth is unlimited. +- Positive integer. +- 0 — Recursion depth is unlimited. Default value: 1000. @@ -1027,7 +1027,7 @@ Timeout to close idle TCP connections after specified number of seconds. Possible values: -- Positive integer (0 - close immediatly, after 0 seconds). +- Positive integer (0 - close immediatly, after 0 seconds). Default value: 3600. @@ -1071,8 +1071,8 @@ If the value is exceeded, the server throws an exception. Possible values: -- Positive integer. -- 0 — Unlimited depth. +- Positive integer. +- 0 — Unlimited depth. Default value: `5`. @@ -1084,8 +1084,8 @@ The setting isn't followed perfectly accurately. Possible values: -- Positive integer. -- 0 — Unlimited. +- Positive integer. +- 0 — Unlimited. Default value: `0`. @@ -1105,8 +1105,8 @@ The setting isn't followed perfectly accurately. Possible values: -- Positive integer. -- 0 — Unlimited. +- Positive integer. +- 0 — Unlimited. Default value: `0`. @@ -1217,15 +1217,15 @@ Specifies the algorithm of replicas selection that is used for distributed query ClickHouse supports the following algorithms of choosing replicas: -- [Random](#load_balancing-random) (by default) -- [Nearest hostname](#load_balancing-nearest_hostname) -- [In order](#load_balancing-in_order) -- [First or random](#load_balancing-first_or_random) -- [Round robin](#load_balancing-round_robin) +- [Random](#load_balancing-random) (by default) +- [Nearest hostname](#load_balancing-nearest_hostname) +- [In order](#load_balancing-in_order) +- [First or random](#load_balancing-first_or_random) +- [Round robin](#load_balancing-round_robin) See also: -- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) +- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) ### Random (by Default) {#load_balancing-random} @@ -1285,8 +1285,8 @@ Enables/disables preferable using the localhost replica when processing distribu Possible values: -- 1 — ClickHouse always sends a query to the localhost replica if it exists. -- 0 — ClickHouse uses the balancing strategy specified by the [load_balancing](#settings-load_balancing) setting. +- 1 — ClickHouse always sends a query to the localhost replica if it exists. +- 0 — ClickHouse uses the balancing strategy specified by the [load_balancing](#settings-load_balancing) setting. Default value: 1. @@ -1312,7 +1312,7 @@ The maximum number of replicas for each shard when executing a query. Possible values: -- Positive integer. +- Positive integer. Default value: `1`. @@ -1355,8 +1355,8 @@ How to use `parallel_replicas_custom_key` expression for splitting work between Possible values: -- `default` — Use the default implementation using modulo operation on the `parallel_replicas_custom_key`. -- `range` — Split the entire value space of the expression in the ranges. This type of filtering is useful if values of `parallel_replicas_custom_key` are uniformly spread across the entire integer space, e.g. hash values. +- `default` — Use the default implementation using modulo operation on the `parallel_replicas_custom_key`. +- `range` — Split the entire value space of the expression in the ranges. This type of filtering is useful if values of `parallel_replicas_custom_key` are uniformly spread across the entire integer space, e.g. hash values. Default value: `default`. @@ -1383,14 +1383,14 @@ Enables or disables JIT-compilation of aggregate functions to native code. Enabl Possible values: -- 0 — Aggregation is done without JIT compilation. -- 1 — Aggregation is done using JIT compilation. +- 0 — Aggregation is done without JIT compilation. +- 1 — Aggregation is done using JIT compilation. Default value: `1`. **See Also** -- [min_count_to_compile_aggregate_expression](#min_count_to_compile_aggregate_expression) +- [min_count_to_compile_aggregate_expression](#min_count_to_compile_aggregate_expression) ## min_count_to_compile_aggregate_expression {#min_count_to_compile_aggregate_expression} @@ -1398,8 +1398,8 @@ The minimum number of identical aggregate expressions to start JIT-compilation. Possible values: -- Positive integer. -- 0 — Identical aggregate expressions are always JIT-compiled. +- Positive integer. +- 0 — Identical aggregate expressions are always JIT-compiled. Default value: `3`. @@ -1516,9 +1516,9 @@ Default value: `0`. Enables the quorum writes. -- If `insert_quorum < 2`, the quorum writes are disabled. -- If `insert_quorum >= 2`, the quorum writes are enabled. -- If `insert_quorum = 'auto'`, use majority number (`number_of_replicas / 2 + 1`) as quorum number. +- If `insert_quorum < 2`, the quorum writes are disabled. +- If `insert_quorum >= 2`, the quorum writes are enabled. +- If `insert_quorum = 'auto'`, use majority number (`number_of_replicas / 2 + 1`) as quorum number. Default value: 0 - disabled. @@ -1530,14 +1530,14 @@ When `insert_quorum_parallel` is disabled, all replicas in the quorum are consis ClickHouse generates an exception: -- If the number of available replicas at the time of the query is less than the `insert_quorum`. -- When `insert_quorum_parallel` is disabled and an attempt to write data is made when the previous block has not yet been inserted in `insert_quorum` of replicas. This situation may occur if the user tries to perform another `INSERT` query to the same table before the previous one with `insert_quorum` is completed. +- If the number of available replicas at the time of the query is less than the `insert_quorum`. +- When `insert_quorum_parallel` is disabled and an attempt to write data is made when the previous block has not yet been inserted in `insert_quorum` of replicas. This situation may occur if the user tries to perform another `INSERT` query to the same table before the previous one with `insert_quorum` is completed. See also: -- [insert_quorum_timeout](#settings-insert_quorum_timeout) -- [insert_quorum_parallel](#settings-insert_quorum_parallel) -- [select_sequential_consistency](#settings-select_sequential_consistency) +- [insert_quorum_timeout](#settings-insert_quorum_timeout) +- [insert_quorum_parallel](#settings-insert_quorum_parallel) +- [select_sequential_consistency](#settings-select_sequential_consistency) ## insert_quorum_timeout {#settings-insert_quorum_timeout} @@ -1547,9 +1547,9 @@ Default value: 600 000 milliseconds (ten minutes). See also: -- [insert_quorum](#settings-insert_quorum) -- [insert_quorum_parallel](#settings-insert_quorum_parallel) -- [select_sequential_consistency](#settings-select_sequential_consistency) +- [insert_quorum](#settings-insert_quorum) +- [insert_quorum_parallel](#settings-insert_quorum_parallel) +- [select_sequential_consistency](#settings-select_sequential_consistency) ## insert_quorum_parallel {#settings-insert_quorum_parallel} @@ -1557,16 +1557,16 @@ Enables or disables parallelism for quorum `INSERT` queries. If enabled, additio Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. See also: -- [insert_quorum](#settings-insert_quorum) -- [insert_quorum_timeout](#settings-insert_quorum_timeout) -- [select_sequential_consistency](#settings-select_sequential_consistency) +- [insert_quorum](#settings-insert_quorum) +- [insert_quorum_timeout](#settings-insert_quorum_timeout) +- [select_sequential_consistency](#settings-select_sequential_consistency) ## select_sequential_consistency {#settings-select_sequential_consistency} @@ -1574,8 +1574,8 @@ Enables or disables sequential consistency for `SELECT` queries. Requires `inser Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -1587,9 +1587,9 @@ When `insert_quorum_parallel` is enabled (the default), then `select_sequential_ See also: -- [insert_quorum](#settings-insert_quorum) -- [insert_quorum_timeout](#settings-insert_quorum_timeout) -- [insert_quorum_parallel](#settings-insert_quorum_parallel) +- [insert_quorum](#settings-insert_quorum) +- [insert_quorum_timeout](#settings-insert_quorum_timeout) +- [insert_quorum_parallel](#settings-insert_quorum_parallel) ## insert_deduplicate {#settings-insert-deduplicate} @@ -1597,8 +1597,8 @@ Enables or disables block deduplication of `INSERT` (for Replicated\* tables). Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -1620,8 +1620,8 @@ If [wait_for_async_insert](#wait-for-async-insert) is enabled, every client will Possible values: -- 0 — Insertions are made synchronously, one after another. -- 1 — Multiple asynchronous insertions enabled. +- 0 — Insertions are made synchronously, one after another. +- 1 — Multiple asynchronous insertions enabled. Default value: `0`. @@ -1631,8 +1631,8 @@ The maximum number of threads for background data parsing and insertion. Possible values: -- Positive integer. -- 0 — Asynchronous insertions are disabled. +- Positive integer. +- 0 — Asynchronous insertions are disabled. Default value: `16`. @@ -1642,8 +1642,8 @@ Enables or disables waiting for processing of asynchronous insertion. If enabled Possible values: -- 0 — Server returns `OK` even if the data is not yet inserted. -- 1 — Server returns `OK` only after the data is inserted. +- 0 — Server returns `OK` even if the data is not yet inserted. +- 1 — Server returns `OK` only after the data is inserted. Default value: `1`. @@ -1653,8 +1653,8 @@ The timeout in seconds for waiting for processing of asynchronous insertion. Possible values: -- Positive integer. -- 0 — Disabled. +- Positive integer. +- 0 — Disabled. Default value: [lock_acquire_timeout](#lock_acquire_timeout). @@ -1664,8 +1664,8 @@ The maximum size of the unparsed data in bytes collected per query before being Possible values: -- Positive integer. -- 0 — Asynchronous insertions are disabled. +- Positive integer. +- 0 — Asynchronous insertions are disabled. Default value: `100000`. @@ -1675,8 +1675,8 @@ The maximum number of insert queries per block before being inserted. This setti Possible values: -- Positive integer. -- 0 — Asynchronous insertions are disabled. +- Positive integer. +- 0 — Asynchronous insertions are disabled. Default value: `450`. @@ -1686,8 +1686,8 @@ The maximum timeout in milliseconds since the first `INSERT` query before insert Possible values: -- Positive integer. -- 0 — Timeout disabled. +- Positive integer. +- 0 — Timeout disabled. Default value: `200`. @@ -1697,8 +1697,8 @@ The maximum timeout in milliseconds since the last `INSERT` query before dumping Possible values: -- Positive integer. -- 0 — Timeout disabled. +- Positive integer. +- 0 — Timeout disabled. Default value: `0`. @@ -1708,8 +1708,8 @@ Enables or disables insert deduplication of `ASYNC INSERT` (for Replicated\* tab Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -1787,8 +1787,8 @@ The setting sets the maximum number of retries for ClickHouse Keeper (or ZooKeep Possible values: -- Positive integer. -- 0 — Retries are disabled +- Positive integer. +- 0 — Retries are disabled Default value: 0 @@ -1808,8 +1808,8 @@ Initial timeout(in milliseconds) to retry a failed Keeper request during INSERT Possible values: -- Positive integer. -- 0 — No timeout +- Positive integer. +- 0 — No timeout Default value: 100 @@ -1819,8 +1819,8 @@ Maximum timeout (in milliseconds) to retry a failed Keeper request during INSERT Possible values: -- Positive integer. -- 0 — Maximum timeout is not limited +- Positive integer. +- 0 — Maximum timeout is not limited Default value: 10000 @@ -1830,8 +1830,8 @@ Limits the data volume (in bytes) that is received or transmitted over the netwo Possible values: -- Positive integer. -- 0 — Data volume control is disabled. +- Positive integer. +- 0 — Data volume control is disabled. Default value: 0. @@ -1841,8 +1841,8 @@ Limits the speed of the data exchange over the network in bytes per second. This Possible values: -- Positive integer. -- 0 — Bandwidth control is disabled. +- Positive integer. +- 0 — Bandwidth control is disabled. Default value: 0. @@ -1852,8 +1852,8 @@ Limits the speed of the data exchange over the network in bytes per second. This Possible values: -- Positive integer. -- 0 — Control of the data speed is disabled. +- Positive integer. +- 0 — Control of the data speed is disabled. Default value: 0. @@ -1863,8 +1863,8 @@ Limits the speed that data is exchanged at over the network in bytes per second. Possible values: -- Positive integer. -- 0 — Control of the data speed is disabled. +- Positive integer. +- 0 — Control of the data speed is disabled. Default value: 0. @@ -1874,11 +1874,11 @@ Specifies which of the `uniq*` functions should be used to perform the [COUNT(DI Possible values: -- [uniq](../../sql-reference/aggregate-functions/reference/uniq.md/#agg_function-uniq) -- [uniqCombined](../../sql-reference/aggregate-functions/reference/uniqcombined.md/#agg_function-uniqcombined) -- [uniqCombined64](../../sql-reference/aggregate-functions/reference/uniqcombined64.md/#agg_function-uniqcombined64) -- [uniqHLL12](../../sql-reference/aggregate-functions/reference/uniqhll12.md/#agg_function-uniqhll12) -- [uniqExact](../../sql-reference/aggregate-functions/reference/uniqexact.md/#agg_function-uniqexact) +- [uniq](../../sql-reference/aggregate-functions/reference/uniq.md/#agg_function-uniq) +- [uniqCombined](../../sql-reference/aggregate-functions/reference/uniqcombined.md/#agg_function-uniqcombined) +- [uniqCombined64](../../sql-reference/aggregate-functions/reference/uniqcombined64.md/#agg_function-uniqcombined64) +- [uniqHLL12](../../sql-reference/aggregate-functions/reference/uniqhll12.md/#agg_function-uniqhll12) +- [uniqExact](../../sql-reference/aggregate-functions/reference/uniqexact.md/#agg_function-uniqexact) Default value: `uniqExact`. @@ -1888,25 +1888,25 @@ Enables or disables silently skipping of unavailable shards. Shard is considered unavailable if all its replicas are unavailable. A replica is unavailable in the following cases: -- ClickHouse can’t connect to replica for any reason. +- ClickHouse can’t connect to replica for any reason. When connecting to a replica, ClickHouse performs several attempts. If all these attempts fail, the replica is considered unavailable. -- Replica can’t be resolved through DNS. +- Replica can’t be resolved through DNS. If replica’s hostname can’t be resolved through DNS, it can indicate the following situations: - - Replica’s host has no DNS record. It can occur in systems with dynamic DNS, for example, [Kubernetes](https://kubernetes.io), where nodes can be unresolvable during downtime, and this is not an error. + - Replica’s host has no DNS record. It can occur in systems with dynamic DNS, for example, [Kubernetes](https://kubernetes.io), where nodes can be unresolvable during downtime, and this is not an error. - - Configuration error. ClickHouse configuration file contains a wrong hostname. + - Configuration error. ClickHouse configuration file contains a wrong hostname. Possible values: -- 1 — skipping enabled. +- 1 — skipping enabled. If a shard is unavailable, ClickHouse returns a result based on partial data and does not report node availability issues. -- 0 — skipping disabled. +- 0 — skipping disabled. If a shard is unavailable, ClickHouse throws an exception. @@ -1918,9 +1918,9 @@ Do not merge aggregation states from different servers for distributed query pro Possible values: -- `0` — Disabled (final query processing is done on the initiator node). -- `1` - Do not merge aggregation states from different servers for distributed query processing (query completelly processed on the shard, initiator only proxy the data), can be used in case it is for certain that there are different keys on different shards. -- `2` - Same as `1` but applies `ORDER BY` and `LIMIT` (it is not possible when the query processed completelly on the remote node, like for `distributed_group_by_no_merge=1`) on the initiator (can be used for queries with `ORDER BY` and/or `LIMIT`). +- `0` — Disabled (final query processing is done on the initiator node). +- `1` - Do not merge aggregation states from different servers for distributed query processing (query completelly processed on the shard, initiator only proxy the data), can be used in case it is for certain that there are different keys on different shards. +- `2` - Same as `1` but applies `ORDER BY` and `LIMIT` (it is not possible when the query processed completelly on the remote node, like for `distributed_group_by_no_merge=1`) on the initiator (can be used for queries with `ORDER BY` and/or `LIMIT`). Default value: `0` @@ -1977,9 +1977,9 @@ Default value: `1`. See also: -- [distributed_group_by_no_merge](#distributed-group-by-no-merge) -- [optimize_skip_unused_shards](#optimize-skip-unused-shards) -- [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key) +- [distributed_group_by_no_merge](#distributed-group-by-no-merge) +- [optimize_skip_unused_shards](#optimize-skip-unused-shards) +- [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key) ## optimize_skip_unused_shards_limit {#optimize-skip-unused-shards-limit} @@ -1995,8 +1995,8 @@ Enables or disables skipping of unused shards for [SELECT](../../sql-reference/s Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0 @@ -2006,8 +2006,8 @@ Rewrite IN in query for remote shards to exclude values that does not belong to Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1 (since it requires `optimize_skip_unused_shards` anyway, which `0` by default) @@ -2017,8 +2017,8 @@ Allow nondeterministic (like `rand` or `dictGet`, since later has some caveats w Possible values: -- 0 — Disallowed. -- 1 — Allowed. +- 0 — Disallowed. +- 1 — Allowed. Default value: 0 @@ -2028,9 +2028,9 @@ Controls [`optimize_skip_unused_shards`](#optimize-skip-unused-shards) (hence st Possible values: -- 0 — Disabled, `optimize_skip_unused_shards` works always. -- 1 — Enables `optimize_skip_unused_shards` only for the first level. -- 2 — Enables `optimize_skip_unused_shards` up to the second level. +- 0 — Disabled, `optimize_skip_unused_shards` works always. +- 1 — Enables `optimize_skip_unused_shards` only for the first level. +- 2 — Enables `optimize_skip_unused_shards` up to the second level. Default value: 0 @@ -2040,9 +2040,9 @@ Enables or disables query execution if [optimize_skip_unused_shards](#optimize-s Possible values: -- 0 — Disabled. ClickHouse does not throw an exception. -- 1 — Enabled. Query execution is disabled only if the table has a sharding key. -- 2 — Enabled. Query execution is disabled regardless of whether a sharding key is defined for the table. +- 0 — Disabled. ClickHouse does not throw an exception. +- 1 — Enabled. Query execution is disabled only if the table has a sharding key. +- 2 — Enabled. Query execution is disabled regardless of whether a sharding key is defined for the table. Default value: 0 @@ -2052,9 +2052,9 @@ Controls [`force_optimize_skip_unused_shards`](#force-optimize-skip-unused-shard Possible values: -- 0 - Disabled, `force_optimize_skip_unused_shards` works always. -- 1 — Enables `force_optimize_skip_unused_shards` only for the first level. -- 2 — Enables `force_optimize_skip_unused_shards` up to the second level. +- 0 - Disabled, `force_optimize_skip_unused_shards` works always. +- 1 — Enables `force_optimize_skip_unused_shards` only for the first level. +- 2 — Enables `force_optimize_skip_unused_shards` up to the second level. Default value: 0 @@ -2079,16 +2079,16 @@ The following types of queries are not supported (support for some of them may b Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0 See also: -- [distributed_group_by_no_merge](#distributed-group-by-no-merge) -- [distributed_push_down_limit](#distributed-push-down-limit) -- [optimize_skip_unused_shards](#optimize-skip-unused-shards) +- [distributed_group_by_no_merge](#distributed-group-by-no-merge) +- [distributed_push_down_limit](#distributed-push-down-limit) +- [optimize_skip_unused_shards](#optimize-skip-unused-shards) :::note Right now it requires `optimize_skip_unused_shards` (the reason behind this is that one day it may be enabled by default, and it will work correctly only if data was inserted via Distributed table, i.e. data is distributed according to sharding_key). @@ -2102,8 +2102,8 @@ By default, `OPTIMIZE` returns successfully even if it didn’t do anything. Thi Possible values: -- 1 — Throwing an exception is enabled. -- 0 — Throwing an exception is disabled. +- 1 — Throwing an exception is enabled. +- 0 — Throwing an exception is disabled. Default value: 0. @@ -2117,8 +2117,8 @@ By default, `OPTIMIZE TABLE ... FINAL` query rewrites the one part even if there Possible values: -- 1 - Enable optimization. -- 0 - Disable optimization. +- 1 - Enable optimization. +- 0 - Disable optimization. Default value: 0. @@ -2128,19 +2128,19 @@ Enables or disables optimization by transforming some functions to reading subco These functions can be transformed: -- [length](../../sql-reference/functions/array-functions.md/#array_functions-length) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. -- [empty](../../sql-reference/functions/array-functions.md/#function-empty) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. -- [notEmpty](../../sql-reference/functions/array-functions.md/#function-notempty) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. -- [isNull](../../sql-reference/operators/index.md#operator-is-null) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. -- [isNotNull](../../sql-reference/operators/index.md#is-not-null) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. -- [count](../../sql-reference/aggregate-functions/reference/count.md) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. -- [mapKeys](../../sql-reference/functions/tuple-map-functions.md/#mapkeys) to read the [keys](../../sql-reference/data-types/map.md/#map-subcolumns) subcolumn. -- [mapValues](../../sql-reference/functions/tuple-map-functions.md/#mapvalues) to read the [values](../../sql-reference/data-types/map.md/#map-subcolumns) subcolumn. +- [length](../../sql-reference/functions/array-functions.md/#array_functions-length) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. +- [empty](../../sql-reference/functions/array-functions.md/#function-empty) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. +- [notEmpty](../../sql-reference/functions/array-functions.md/#function-notempty) to read the [size0](../../sql-reference/data-types/array.md/#array-size) subcolumn. +- [isNull](../../sql-reference/operators/index.md#operator-is-null) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. +- [isNotNull](../../sql-reference/operators/index.md#is-not-null) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. +- [count](../../sql-reference/aggregate-functions/reference/count.md) to read the [null](../../sql-reference/data-types/nullable.md/#finding-null) subcolumn. +- [mapKeys](../../sql-reference/functions/tuple-map-functions.md/#mapkeys) to read the [keys](../../sql-reference/data-types/map.md/#map-subcolumns) subcolumn. +- [mapValues](../../sql-reference/functions/tuple-map-functions.md/#mapvalues) to read the [values](../../sql-reference/data-types/map.md/#map-subcolumns) subcolumn. Possible values: -- 0 — Optimization disabled. -- 1 — Optimization enabled. +- 0 — Optimization disabled. +- 1 — Optimization enabled. Default value: `0`. @@ -2157,49 +2157,49 @@ Default value: `1`. See also: -- [optimize_functions_to_subcolumns](#optimize-functions-to-subcolumns) +- [optimize_functions_to_subcolumns](#optimize-functions-to-subcolumns) ## distributed_replica_error_half_life {#settings-distributed_replica_error_half_life} -- Type: seconds -- Default value: 60 seconds +- Type: seconds +- Default value: 60 seconds Controls how fast errors in distributed tables are zeroed. If a replica is unavailable for some time, accumulates 5 errors, and distributed_replica_error_half_life is set to 1 second, then the replica is considered normal 3 seconds after the last error. See also: -- [load_balancing](#load_balancing-round_robin) -- [Table engine Distributed](../../engines/table-engines/special/distributed.md) -- [distributed_replica_error_cap](#settings-distributed_replica_error_cap) -- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) +- [load_balancing](#load_balancing-round_robin) +- [Table engine Distributed](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap](#settings-distributed_replica_error_cap) +- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) ## distributed_replica_error_cap {#settings-distributed_replica_error_cap} -- Type: unsigned int -- Default value: 1000 +- Type: unsigned int +- Default value: 1000 The error count of each replica is capped at this value, preventing a single replica from accumulating too many errors. See also: -- [load_balancing](#load_balancing-round_robin) -- [Table engine Distributed](../../engines/table-engines/special/distributed.md) -- [distributed_replica_error_half_life](#settings-distributed_replica_error_half_life) -- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) +- [load_balancing](#load_balancing-round_robin) +- [Table engine Distributed](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_half_life](#settings-distributed_replica_error_half_life) +- [distributed_replica_max_ignored_errors](#settings-distributed_replica_max_ignored_errors) ## distributed_replica_max_ignored_errors {#settings-distributed_replica_max_ignored_errors} -- Type: unsigned int -- Default value: 0 +- Type: unsigned int +- Default value: 0 The number of errors that will be ignored while choosing replicas (according to `load_balancing` algorithm). See also: -- [load_balancing](#load_balancing-round_robin) -- [Table engine Distributed](../../engines/table-engines/special/distributed.md) -- [distributed_replica_error_cap](#settings-distributed_replica_error_cap) -- [distributed_replica_error_half_life](#settings-distributed_replica_error_half_life) +- [load_balancing](#load_balancing-round_robin) +- [Table engine Distributed](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap](#settings-distributed_replica_error_cap) +- [distributed_replica_error_half_life](#settings-distributed_replica_error_half_life) ## distributed_directory_monitor_sleep_time_ms {#distributed_directory_monitor_sleep_time_ms} @@ -2207,7 +2207,7 @@ Base interval for the [Distributed](../../engines/table-engines/special/distribu Possible values: -- A positive integer number of milliseconds. +- A positive integer number of milliseconds. Default value: 100 milliseconds. @@ -2217,7 +2217,7 @@ Maximum interval for the [Distributed](../../engines/table-engines/special/distr Possible values: -- A positive integer number of milliseconds. +- A positive integer number of milliseconds. Default value: 30000 milliseconds (30 seconds). @@ -2229,8 +2229,8 @@ When batch sending is enabled, the [Distributed](../../engines/table-engines/spe Possible values: -- 1 — Enabled. -- 0 — Disabled. +- 1 — Enabled. +- 0 — Disabled. Default value: 0. @@ -2244,8 +2244,8 @@ So installing this setting to `1` will disable batching for such batches (i.e. t Possible values: -- 1 — Enabled. -- 0 — Disabled. +- 1 — Enabled. +- 0 — Disabled. Default value: 0. @@ -2267,7 +2267,7 @@ To use this setting, you need to set the `CAP_SYS_NICE` capability. The `clickho Possible values: -- You can set values in the range `[-20, 19]`. +- You can set values in the range `[-20, 19]`. Lower values mean higher priority. Threads with low `nice` priority values are executed more frequently than threads with high values. High values are preferable for long-running non-interactive queries because it allows them to quickly give up resources in favour of short interactive queries when they arrive. @@ -2279,14 +2279,14 @@ Sets the period for a real clock timer of the [query profiler](../../operations/ Possible values: -- Positive integer number, in nanoseconds. +- Positive integer number, in nanoseconds. Recommended values: - 10000000 (100 times a second) nanoseconds and less for single queries. - 1000000000 (once a second) for cluster-wide profiling. -- 0 for turning off the timer. +- 0 for turning off the timer. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -2294,7 +2294,7 @@ Default value: 1000000000 nanoseconds (once a second). See also: -- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) +- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) ## query_profiler_cpu_time_period_ns {#query_profiler_cpu_time_period_ns} @@ -2302,14 +2302,14 @@ Sets the period for a CPU clock timer of the [query profiler](../../operations/o Possible values: -- A positive integer number of nanoseconds. +- A positive integer number of nanoseconds. Recommended values: - 10000000 (100 times a second) nanoseconds and more for single queries. - 1000000000 (once a second) for cluster-wide profiling. -- 0 for turning off the timer. +- 0 for turning off the timer. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -2317,7 +2317,7 @@ Default value: 1000000000 nanoseconds. See also: -- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) +- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) ## memory_profiler_step {#memory_profiler_step} @@ -2325,9 +2325,9 @@ Sets the step of memory profiler. Whenever query memory usage becomes larger tha Possible values: -- A positive integer number of bytes. +- A positive integer number of bytes. -- 0 for turning off the memory profiler. +- 0 for turning off the memory profiler. Default value: 4,194,304 bytes (4 MiB). @@ -2337,9 +2337,9 @@ Sets the probability of collecting stacktraces at random allocations and dealloc Possible values: -- A positive floating-point number in the range [0..1]. +- A positive floating-point number in the range [0..1]. -- 0.0 for turning off the memory sampling. +- 0.0 for turning off the memory sampling. Default value: 0.0. @@ -2349,8 +2349,8 @@ Enables or disables collecting stacktraces on each update of profile events alon Possible values: -- 1 — Tracing of profile events enabled. -- 0 — Tracing of profile events disabled. +- 1 — Tracing of profile events enabled. +- 0 — Tracing of profile events disabled. Default value: 0. @@ -2360,15 +2360,15 @@ Enables or disables [introspections functions](../../sql-reference/functions/int Possible values: -- 1 — Introspection functions enabled. -- 0 — Introspection functions disabled. +- 1 — Introspection functions enabled. +- 0 — Introspection functions disabled. Default value: 0. **See Also** -- [Sampling Query Profiler](../../operations/optimizing-performance/sampling-query-profiler.md) -- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) +- [Sampling Query Profiler](../../operations/optimizing-performance/sampling-query-profiler.md) +- System table [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) ## input_format_parallel_parsing {#input-format-parallel-parsing} @@ -2376,8 +2376,8 @@ Enables or disables order-preserving parallel parsing of data formats. Supported Possible values: -- 1 — Enabled. -- 0 — Disabled. +- 1 — Enabled. +- 0 — Disabled. Default value: `1`. @@ -2387,15 +2387,15 @@ Enables or disables parallel formatting of data formats. Supported only for [TSV Possible values: -- 1 — Enabled. -- 0 — Disabled. +- 1 — Enabled. +- 0 — Disabled. Default value: `1`. ## min_chunk_bytes_for_parallel_parsing {#min-chunk-bytes-for-parallel-parsing} -- Type: unsigned int -- Default value: 1 MiB +- Type: unsigned int +- Default value: 1 MiB The minimum chunk size in bytes, which each thread will parse in parallel. @@ -2405,7 +2405,7 @@ Sleep time for merge selecting when no part is selected. A lower setting trigger Possible values: -- Any positive integer. +- Any positive integer. Default value: `5000`. @@ -2417,9 +2417,9 @@ If we execute `INSERT INTO distributed_table_a SELECT ... FROM distributed_table Possible values: -- 0 — Disabled. -- 1 — `SELECT` will be executed on each shard from the underlying table of the distributed engine. -- 2 — `SELECT` and `INSERT` will be executed on each shard from/to the underlying table of the distributed engine. +- 0 — Disabled. +- 1 — `SELECT` will be executed on each shard from the underlying table of the distributed engine. +- 2 — `SELECT` and `INSERT` will be executed on each shard from/to the underlying table of the distributed engine. Default value: 0. @@ -2431,15 +2431,15 @@ By default, when inserting data into a `Distributed` table, the ClickHouse serve Possible values: -- 0 — Data is inserted in asynchronous mode. -- 1 — Data is inserted in synchronous mode. +- 0 — Data is inserted in asynchronous mode. +- 1 — Data is inserted in synchronous mode. Default value: `0`. **See Also** -- [Distributed Table Engine](../../engines/table-engines/special/distributed.md/#distributed) -- [Managing Distributed Tables](../../sql-reference/statements/system.md/#query-language-system-distributed) +- [Distributed Table Engine](../../engines/table-engines/special/distributed.md/#distributed) +- [Managing Distributed Tables](../../sql-reference/statements/system.md/#query-language-system-distributed) ## insert_shard_id {#insert_shard_id} @@ -2455,8 +2455,8 @@ SELECT uniq(shard_num) FROM system.clusters WHERE cluster = 'requested_cluster'; Possible values: -- 0 — Disabled. -- Any number from `1` to `shards_num` of corresponding [Distributed](../../engines/table-engines/special/distributed.md/#distributed) table. +- 0 — Disabled. +- Any number from `1` to `shards_num` of corresponding [Distributed](../../engines/table-engines/special/distributed.md/#distributed) table. Default value: `0`. @@ -2494,8 +2494,8 @@ Uses compact format for storing blocks for async (`insert_distributed_sync`) INS Possible values: -- 0 — Uses `user[:password]@host:port#default_database` directory format. -- 1 — Uses `[shard{shard_index}[_replica{replica_index}]]` directory format. +- 0 — Uses `user[:password]@host:port#default_database` directory format. +- 1 — Uses `[shard{shard_index}[_replica{replica_index}]]` directory format. Default value: `1`. @@ -2528,14 +2528,14 @@ When merging is prohibited, the replica never merges parts and always downloads Possible values: -- 0 — `Replicated*MergeTree`-engine tables merge data parts at the replica. -- 1 — `Replicated*MergeTree`-engine tables do not merge data parts at the replica. The tables download merged data parts from other replicas. +- 0 — `Replicated*MergeTree`-engine tables merge data parts at the replica. +- 1 — `Replicated*MergeTree`-engine tables do not merge data parts at the replica. The tables download merged data parts from other replicas. Default value: 0. **See Also** -- [Data Replication](../../engines/table-engines/mergetree-family/replication.md) +- [Data Replication](../../engines/table-engines/mergetree-family/replication.md) ## background_distributed_schedule_pool_size {#background_distributed_schedule_pool_size} @@ -2564,8 +2564,8 @@ By default, `NULL` values can’t be compared because `NULL` means undefined val Possible values: -- 0 — Comparison of `NULL` values in `IN` operator returns `false`. -- 1 — Comparison of `NULL` values in `IN` operator returns `true`. +- 0 — Comparison of `NULL` values in `IN` operator returns `false`. +- 1 — Comparison of `NULL` values in `IN` operator returns `true`. Default value: 0. @@ -2612,7 +2612,7 @@ Result: **See Also** -- [NULL Processing in IN Operators](../../sql-reference/operators/in.md/#in-null-processing) +- [NULL Processing in IN Operators](../../sql-reference/operators/in.md/#in-null-processing) ## low_cardinality_max_dictionary_size {#low_cardinality_max_dictionary_size} @@ -2620,7 +2620,7 @@ Sets a maximum size in rows of a shared global dictionary for the [LowCardinalit Possible values: -- Any positive integer. +- Any positive integer. Default value: 8192. @@ -2632,8 +2632,8 @@ By default, the ClickHouse server monitors the size of dictionaries and if a dic Possible values: -- 1 — Creating several dictionaries for the data part is prohibited. -- 0 — Creating several dictionaries for the data part is not prohibited. +- 1 — Creating several dictionaries for the data part is prohibited. +- 0 — Creating several dictionaries for the data part is not prohibited. Default value: 0. @@ -2647,8 +2647,8 @@ This setting is required mainly for third-party clients which do not support `Lo Possible values: -- 1 — Usage of `LowCardinality` is not restricted. -- 0 — Usage of `LowCardinality` is restricted. +- 1 — Usage of `LowCardinality` is not restricted. +- 0 — Usage of `LowCardinality` is restricted. Default value: 1. @@ -2658,16 +2658,16 @@ Allows or restricts using [LowCardinality](../../sql-reference/data-types/lowcar For small fixed values using of `LowCardinality` is usually inefficient, because ClickHouse stores a numeric index for each row. As a result: -- Disk space usage can rise. -- RAM consumption can be higher, depending on a dictionary size. -- Some functions can work slower due to extra coding/encoding operations. +- Disk space usage can rise. +- RAM consumption can be higher, depending on a dictionary size. +- Some functions can work slower due to extra coding/encoding operations. Merge times in [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)-engine tables can grow due to all the reasons described above. Possible values: -- 1 — Usage of `LowCardinality` is not restricted. -- 0 — Usage of `LowCardinality` is restricted. +- 1 — Usage of `LowCardinality` is not restricted. +- 0 — Usage of `LowCardinality` is restricted. Default value: 0. @@ -2677,14 +2677,14 @@ Sets the minimum number of rows in the block which can be inserted into a table Possible values: -- Any positive integer. -- 0 — Squashing disabled. +- Any positive integer. +- 0 — Squashing disabled. Default value: 1048576. **See Also** -- [min_insert_block_size_rows](#min-insert-block-size-rows) +- [min_insert_block_size_rows](#min-insert-block-size-rows) ## min_insert_block_size_bytes_for_materialized_views {#min-insert-block-size-bytes-for-materialized-views} @@ -2692,14 +2692,14 @@ Sets the minimum number of bytes in the block which can be inserted into a table Possible values: -- Any positive integer. -- 0 — Squashing disabled. +- Any positive integer. +- 0 — Squashing disabled. Default value: 268435456. **See also** -- [min_insert_block_size_bytes](#min-insert-block-size-bytes) +- [min_insert_block_size_bytes](#min-insert-block-size-bytes) ## optimize_read_in_order {#optimize_read_in_order} @@ -2707,14 +2707,14 @@ Enables [ORDER BY](../../sql-reference/statements/select/order-by.md/#optimize_r Possible values: -- 0 — `ORDER BY` optimization is disabled. -- 1 — `ORDER BY` optimization is enabled. +- 0 — `ORDER BY` optimization is disabled. +- 1 — `ORDER BY` optimization is enabled. Default value: `1`. **See Also** -- [ORDER BY Clause](../../sql-reference/statements/select/order-by.md/#optimize_read_in_order) +- [ORDER BY Clause](../../sql-reference/statements/select/order-by.md/#optimize_read_in_order) ## optimize_aggregation_in_order {#optimize_aggregation_in_order} @@ -2722,14 +2722,14 @@ Enables [GROUP BY](../../sql-reference/statements/select/group-by.md) optimizati Possible values: -- 0 — `GROUP BY` optimization is disabled. -- 1 — `GROUP BY` optimization is enabled. +- 0 — `GROUP BY` optimization is disabled. +- 1 — `GROUP BY` optimization is enabled. Default value: `0`. **See Also** -- [GROUP BY optimization](../../sql-reference/statements/select/group-by.md/#aggregation-in-order) +- [GROUP BY optimization](../../sql-reference/statements/select/group-by.md/#aggregation-in-order) ## mutations_sync {#mutations_sync} @@ -2737,16 +2737,16 @@ Allows to execute `ALTER TABLE ... UPDATE|DELETE` queries ([mutations](../../sql Possible values: -- 0 - Mutations execute asynchronously. -- 1 - The query waits for all mutations to complete on the current server. -- 2 - The query waits for all mutations to complete on all replicas (if they exist). +- 0 - Mutations execute asynchronously. +- 1 - The query waits for all mutations to complete on the current server. +- 2 - The query waits for all mutations to complete on all replicas (if they exist). Default value: `0`. **See Also** -- [Synchronicity of ALTER Queries](../../sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) -- [Mutations](../../sql-reference/statements/alter/index.md#mutations) +- [Synchronicity of ALTER Queries](../../sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [Mutations](../../sql-reference/statements/alter/index.md#mutations) ## ttl_only_drop_parts {#ttl_only_drop_parts} @@ -2760,15 +2760,15 @@ Dropping whole parts instead of partial cleaning TTL-d rows allows having shorte Possible values: -- 0 — The complete dropping of data parts is disabled. -- 1 — The complete dropping of data parts is enabled. +- 0 — The complete dropping of data parts is disabled. +- 1 — The complete dropping of data parts is enabled. Default value: `0`. **See Also** -- [CREATE TABLE query clauses and settings](../../engines/table-engines/mergetree-family/mergetree.md/#mergetree-query-clauses) (`merge_with_ttl_timeout` setting) -- [Table TTL](../../engines/table-engines/mergetree-family/mergetree.md/#mergetree-table-ttl) +- [CREATE TABLE query clauses and settings](../../engines/table-engines/mergetree-family/mergetree.md/#mergetree-query-clauses) (`merge_with_ttl_timeout` setting) +- [Table TTL](../../engines/table-engines/mergetree-family/mergetree.md/#mergetree-table-ttl) ## lock_acquire_timeout {#lock_acquire_timeout} @@ -2778,8 +2778,8 @@ Locking timeout is used to protect from deadlocks while executing read/write ope Possible values: -- Positive integer (in seconds). -- 0 — No locking timeout. +- Positive integer (in seconds). +- 0 — No locking timeout. Default value: `120` seconds. @@ -2830,7 +2830,7 @@ Result: **See Also** -- [CAST](../../sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast) function +- [CAST](../../sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast) function ## system_events_show_zero_values {#system_events_show_zero_values} @@ -2840,8 +2840,8 @@ Some monitoring systems require passing all the metrics values to them for each Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: `0`. @@ -2899,8 +2899,8 @@ It is implemented via query rewrite (similar to [count_distinct_implementation]( Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 0. @@ -2931,9 +2931,9 @@ Sets a mode for combining `SELECT` query results. The setting is only used when Possible values: -- `'DISTINCT'` — ClickHouse outputs rows as a result of combining queries removing duplicate rows. -- `'ALL'` — ClickHouse outputs all rows as a result of combining queries including duplicate rows. -- `''` — ClickHouse generates an exception when used with `UNION`. +- `'DISTINCT'` — ClickHouse outputs rows as a result of combining queries removing duplicate rows. +- `'ALL'` — ClickHouse outputs all rows as a result of combining queries including duplicate rows. +- `''` — ClickHouse generates an exception when used with `UNION`. Default value: `''`. @@ -3010,8 +3010,8 @@ Enables special logic to perform merges on replicas. Possible values: -- Positive integer (in seconds). -- 0 — Special merges logic is not used. Merges happen in the usual way on all the replicas. +- Positive integer (in seconds). +- 0 — Special merges logic is not used. Merges happen in the usual way on all the replicas. Default value: `0`. @@ -3029,8 +3029,8 @@ Sets the maximum number of parallel threads for the `SELECT` query data read pha Possible values: -- Positive integer. -- 0 or 1 — Disabled. `SELECT` queries are executed in a single thread. +- Positive integer. +- 0 or 1 — Disabled. `SELECT` queries are executed in a single thread. Default value: `16`. @@ -3040,9 +3040,9 @@ Sets the probability that the ClickHouse can start a trace for executed queries Possible values: -- 0 — The trace for all executed queries is disabled (if no parent trace context is supplied). -- Positive floating-point number in the range [0..1]. For example, if the setting value is `0,5`, ClickHouse can start a trace on average for half of the queries. -- 1 — The trace for all executed queries is enabled. +- 0 — The trace for all executed queries is disabled (if no parent trace context is supplied). +- Positive floating-point number in the range [0..1]. For example, if the setting value is `0,5`, ClickHouse can start a trace on average for half of the queries. +- 1 — The trace for all executed queries is enabled. Default value: `0`. @@ -3052,8 +3052,8 @@ Enables or disables data transformation before the insertion, as if merge was do Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: 1. @@ -3182,8 +3182,8 @@ Allows working with experimental [geo data types](../../sql-reference/data-types Possible values: -- 0 — Working with geo data types is disabled. -- 1 — Working with geo data types is enabled. +- 0 — Working with geo data types is disabled. +- 1 — Working with geo data types is enabled. Default value: `0`. @@ -3193,8 +3193,8 @@ Adds a modifier `SYNC` to all `DROP` and `DETACH` queries. Possible values: -- 0 — Queries will be executed with delay. -- 1 — Queries will be executed without delay. +- 0 — Queries will be executed with delay. +- 1 — Queries will be executed without delay. Default value: `0`. @@ -3204,8 +3204,8 @@ Sets the `SHOW TABLE` query display. Possible values: -- 0 — The query will be displayed without table UUID. -- 1 — The query will be displayed with table UUID. +- 0 — The query will be displayed without table UUID. +- 1 — The query will be displayed with table UUID. Default value: `0`. @@ -3215,8 +3215,8 @@ Allows creation of experimental [live views](../../sql-reference/statements/crea Possible values: -- 0 — Working with live views is disabled. -- 1 — Working with live views is enabled. +- 0 — Working with live views is disabled. +- 1 — Working with live views is enabled. Default value: `0`. @@ -3244,8 +3244,8 @@ HTTP connection timeout (in seconds). Possible values: -- Any positive integer. -- 0 - Disabled (infinite timeout). +- Any positive integer. +- 0 - Disabled (infinite timeout). Default value: 1. @@ -3255,8 +3255,8 @@ HTTP send timeout (in seconds). Possible values: -- Any positive integer. -- 0 - Disabled (infinite timeout). +- Any positive integer. +- 0 - Disabled (infinite timeout). Default value: 180. @@ -3266,8 +3266,8 @@ HTTP receive timeout (in seconds). Possible values: -- Any positive integer. -- 0 - Disabled (infinite timeout). +- Any positive integer. +- 0 - Disabled (infinite timeout). Default value: 180. @@ -3277,8 +3277,8 @@ Defines the level of detail for the [CHECK TABLE](../../sql-reference/statements Possible values: -- 0 — the query shows a check status for every individual data part of a table. -- 1 — the query shows the general table check status. +- 0 — the query shows a check status for every individual data part of a table. +- 1 — the query shows the general table check status. Default value: `0`. @@ -3332,8 +3332,8 @@ Sets the maximum number of rows to get from the query result. It adjusts the val Possible values: -- 0 — The number of rows is not limited. -- Positive integer. +- 0 — The number of rows is not limited. +- Positive integer. Default value: `0`. @@ -3343,8 +3343,8 @@ Sets the number of rows to skip before starting to return rows from the query. I Possible values: -- 0 — No rows are skipped . -- Positive integer. +- 0 — No rows are skipped . +- Positive integer. Default value: `0`. @@ -3380,8 +3380,8 @@ Enables to fuse aggregate functions with identical argument. It rewrites query c Possible values: -- 0 — Functions with identical argument are not fused. -- 1 — Functions with identical argument are fused. +- 0 — Functions with identical argument are not fused. +- 1 — Functions with identical argument are fused. Default value: `0`. @@ -3421,8 +3421,8 @@ Enables to create databases with [Replicated](../../engines/database-engines/rep Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: `0`. @@ -3432,8 +3432,8 @@ Sets how long initial DDL query should wait for Replicated database to precess p Possible values: -- Positive integer. -- 0 — Unlimited. +- Positive integer. +- 0 — Unlimited. Default value: `300`. @@ -3443,9 +3443,9 @@ Sets timeout for DDL query responses from all hosts in cluster. If a DDL request Possible values: -- Positive integer. -- 0 — Async mode. -- Negative integer — infinite timeout. +- Positive integer. +- 0 — Async mode. +- Negative integer — infinite timeout. Default value: `180`. @@ -3455,10 +3455,10 @@ Sets format of distributed DDL query result. Possible values: -- `throw` — Returns result set with query execution status for all hosts where query is finished. If query has failed on some hosts, then it will rethrow the first exception. If query is not finished yet on some hosts and [distributed_ddl_task_timeout](#distributed_ddl_task_timeout) exceeded, then it throws `TIMEOUT_EXCEEDED` exception. -- `none` — Is similar to throw, but distributed DDL query returns no result set. -- `null_status_on_timeout` — Returns `NULL` as execution status in some rows of result set instead of throwing `TIMEOUT_EXCEEDED` if query is not finished on the corresponding hosts. -- `never_throw` — Do not throw `TIMEOUT_EXCEEDED` and do not rethrow exceptions if query has failed on some hosts. +- `throw` — Returns result set with query execution status for all hosts where query is finished. If query has failed on some hosts, then it will rethrow the first exception. If query is not finished yet on some hosts and [distributed_ddl_task_timeout](#distributed_ddl_task_timeout) exceeded, then it throws `TIMEOUT_EXCEEDED` exception. +- `none` — Is similar to throw, but distributed DDL query returns no result set. +- `null_status_on_timeout` — Returns `NULL` as execution status in some rows of result set instead of throwing `TIMEOUT_EXCEEDED` if query is not finished on the corresponding hosts. +- `never_throw` — Do not throw `TIMEOUT_EXCEEDED` and do not rethrow exceptions if query has failed on some hosts. Default value: `throw`. @@ -3468,8 +3468,8 @@ Sets the data format of a [nested](../../sql-reference/data-types/nested-data-st Possible values: -- 1 — Nested column is flattened to separate arrays. -- 0 — Nested column stays a single array of tuples. +- 1 — Nested column is flattened to separate arrays. +- 0 — Nested column stays a single array of tuples. Default value: `1`. @@ -3533,8 +3533,8 @@ Defines how [mysql](../../sql-reference/table-functions/mysql.md), [postgresql]( Possible values: -- 0 — The table function explicitly uses Nullable columns. -- 1 — The table function implicitly uses Nullable columns. +- 0 — The table function explicitly uses Nullable columns. +- 1 — The table function implicitly uses Nullable columns. Default value: `1`. @@ -3548,8 +3548,8 @@ Enables or disables [projection](../../engines/table-engines/mergetree-family/me Possible values: -- 0 — Projection optimization disabled. -- 1 — Projection optimization enabled. +- 0 — Projection optimization disabled. +- 1 — Projection optimization enabled. Default value: `1`. @@ -3559,8 +3559,8 @@ Enables or disables the obligatory use of [projections](../../engines/table-engi Possible values: -- 0 — Projection optimization is not obligatory. -- 1 — Projection optimization is obligatory. +- 0 — Projection optimization is not obligatory. +- 1 — Projection optimization is obligatory. Default value: `0`. @@ -3570,9 +3570,9 @@ Allows to set up waiting for actions to be executed on replicas by [ALTER](../.. Possible values: -- 0 — Do not wait. -- 1 — Wait for own execution. -- 2 — Wait for everyone. +- 0 — Do not wait. +- 1 — Wait for own execution. +- 2 — Wait for everyone. Default value: `1`. @@ -3582,9 +3582,9 @@ Specifies how long (in seconds) to wait for inactive replicas to execute [ALTER] Possible values: -- 0 — Do not wait. -- Negative integer — Wait for unlimited time. -- Positive integer — The number of seconds to wait. +- 0 — Do not wait. +- Negative integer — Wait for unlimited time. +- Positive integer — The number of seconds to wait. Default value: `120` seconds. @@ -3594,7 +3594,7 @@ Sets the maximum number of matches for a single regular expression per row. Use Possible values: -- Positive integer. +- Positive integer. Default value: `1000`. @@ -3604,7 +3604,7 @@ Sets the maximum number of retries during a single HTTP read. Possible values: -- Positive integer. +- Positive integer. Default value: `1024`. @@ -3614,9 +3614,9 @@ Allows a user to write to [query_log](../../operations/system-tables/query_log.m Possible values: -- 0 — Queries are not logged in the system tables. -- Positive floating-point number in the range [0..1]. For example, if the setting value is `0.5`, about half of the queries are logged in the system tables. -- 1 — All queries are logged in the system tables. +- 0 — Queries are not logged in the system tables. +- Positive floating-point number in the range [0..1]. For example, if the setting value is `0.5`, about half of the queries are logged in the system tables. +- 1 — All queries are logged in the system tables. Default value: `1`. @@ -3626,9 +3626,9 @@ Allows calculating the [if](../../sql-reference/functions/conditional-functions. Possible values: -- `enable` — Enables short-circuit function evaluation for functions that are suitable for it (can throw an exception or computationally heavy). -- `force_enable` — Enables short-circuit function evaluation for all functions. -- `disable` — Disables short-circuit function evaluation. +- `enable` — Enables short-circuit function evaluation for functions that are suitable for it (can throw an exception or computationally heavy). +- `force_enable` — Enables short-circuit function evaluation for all functions. +- `disable` — Disables short-circuit function evaluation. Default value: `enable`. @@ -3638,8 +3638,8 @@ Defines the maximum length for each regular expression in the [hyperscan multi-m Possible values: -- Positive integer. -- 0 - The length is not limited. +- Positive integer. +- 0 - The length is not limited. Default value: `0`. @@ -3673,7 +3673,7 @@ Exception: Regexp length too large. **See Also** -- [max_hyperscan_regexp_total_length](#max-hyperscan-regexp-total-length) +- [max_hyperscan_regexp_total_length](#max-hyperscan-regexp-total-length) ## max_hyperscan_regexp_total_length {#max-hyperscan-regexp-total-length} @@ -3681,8 +3681,8 @@ Sets the maximum length total of all regular expressions in each [hyperscan mult Possible values: -- Positive integer. -- 0 - The length is not limited. +- Positive integer. +- 0 - The length is not limited. Default value: `0`. @@ -3716,7 +3716,7 @@ Exception: Total regexp lengths too large. **See Also** -- [max_hyperscan_regexp_length](#max-hyperscan-regexp-length) +- [max_hyperscan_regexp_length](#max-hyperscan-regexp-length) ## enable_positional_arguments {#enable-positional-arguments} @@ -3724,8 +3724,8 @@ Enables or disables supporting positional arguments for [GROUP BY](../../sql-ref Possible values: -- 0 — Positional arguments aren't supported. -- 1 — Positional arguments are supported: column numbers can use instead of column names. +- 0 — Positional arguments aren't supported. +- 1 — Positional arguments are supported: column numbers can use instead of column names. Default value: `1`. @@ -3754,13 +3754,13 @@ Result: ## enable_extended_results_for_datetime_functions {#enable-extended-results-for-datetime-functions} Enables or disables returning results of type: -- `Date32` with extended range (compared to type `Date`) for functions [toStartOfYear](../../sql-reference/functions/date-time-functions.md/#tostartofyear), [toStartOfISOYear](../../sql-reference/functions/date-time-functions.md/#tostartofisoyear), [toStartOfQuarter](../../sql-reference/functions/date-time-functions.md/#tostartofquarter), [toStartOfMonth](../../sql-reference/functions/date-time-functions.md/#tostartofmonth), [toStartOfWeek](../../sql-reference/functions/date-time-functions.md/#tostartofweek), [toMonday](../../sql-reference/functions/date-time-functions.md/#tomonday) and [toLastDayOfMonth](../../sql-reference/functions/date-time-functions.md/#tolastdayofmonth). -- `DateTime64` with extended range (compared to type `DateTime`) for functions [toStartOfDay](../../sql-reference/functions/date-time-functions.md/#tostartofday), [toStartOfHour](../../sql-reference/functions/date-time-functions.md/#tostartofhour), [toStartOfMinute](../../sql-reference/functions/date-time-functions.md/#tostartofminute), [toStartOfFiveMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoffiveminutes), [toStartOfTenMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoftenminutes), [toStartOfFifteenMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoffifteenminutes) and [timeSlot](../../sql-reference/functions/date-time-functions.md/#timeslot). +- `Date32` with extended range (compared to type `Date`) for functions [toStartOfYear](../../sql-reference/functions/date-time-functions.md/#tostartofyear), [toStartOfISOYear](../../sql-reference/functions/date-time-functions.md/#tostartofisoyear), [toStartOfQuarter](../../sql-reference/functions/date-time-functions.md/#tostartofquarter), [toStartOfMonth](../../sql-reference/functions/date-time-functions.md/#tostartofmonth), [toStartOfWeek](../../sql-reference/functions/date-time-functions.md/#tostartofweek), [toMonday](../../sql-reference/functions/date-time-functions.md/#tomonday) and [toLastDayOfMonth](../../sql-reference/functions/date-time-functions.md/#tolastdayofmonth). +- `DateTime64` with extended range (compared to type `DateTime`) for functions [toStartOfDay](../../sql-reference/functions/date-time-functions.md/#tostartofday), [toStartOfHour](../../sql-reference/functions/date-time-functions.md/#tostartofhour), [toStartOfMinute](../../sql-reference/functions/date-time-functions.md/#tostartofminute), [toStartOfFiveMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoffiveminutes), [toStartOfTenMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoftenminutes), [toStartOfFifteenMinutes](../../sql-reference/functions/date-time-functions.md/#tostartoffifteenminutes) and [timeSlot](../../sql-reference/functions/date-time-functions.md/#timeslot). Possible values: -- 0 — Functions return `Date` or `DateTime` for all types of arguments. -- 1 — Functions return `Date32` or `DateTime64` for `Date32` or `DateTime64` arguments and `Date` or `DateTime` otherwise. +- 0 — Functions return `Date` or `DateTime` for all types of arguments. +- 1 — Functions return `Date32` or `DateTime64` for `Date32` or `DateTime64` arguments and `Date` or `DateTime` otherwise. Default value: `0`. @@ -3772,8 +3772,8 @@ Works only for [*MergeTree](../../engines/table-engines/mergetree-family/index.m Possible values: -- 0 — Automatic `PREWHERE` optimization is disabled. -- 1 — Automatic `PREWHERE` optimization is enabled. +- 0 — Automatic `PREWHERE` optimization is disabled. +- 1 — Automatic `PREWHERE` optimization is enabled. Default value: `1`. @@ -3785,14 +3785,14 @@ Works only for [*MergeTree](../../engines/table-engines/mergetree-family/index.m Possible values: -- 0 — Automatic `PREWHERE` optimization in `SELECT` queries with `FINAL` modifier is disabled. -- 1 — Automatic `PREWHERE` optimization in `SELECT` queries with `FINAL` modifier is enabled. +- 0 — Automatic `PREWHERE` optimization in `SELECT` queries with `FINAL` modifier is disabled. +- 1 — Automatic `PREWHERE` optimization in `SELECT` queries with `FINAL` modifier is enabled. Default value: `0`. **See Also** -- [optimize_move_to_prewhere](#optimize_move_to_prewhere) setting +- [optimize_move_to_prewhere](#optimize_move_to_prewhere) setting ## optimize_using_constraints @@ -3824,8 +3824,8 @@ Enables describing subcolumns for a [DESCRIBE](../../sql-reference/statements/de Possible values: -- 0 — Subcolumns are not included in `DESCRIBE` queries. -- 1 — Subcolumns are included in `DESCRIBE` queries. +- 0 — Subcolumns are not included in `DESCRIBE` queries. +- 1 — Subcolumns are included in `DESCRIBE` queries. Default value: `0`. @@ -3841,8 +3841,8 @@ Applicable to [ATTACH PARTITION|PART](../../sql-reference/statements/alter/parti Possible values: -- 0 — disable verbosity. -- 1 — enable verbosity. +- 0 — disable verbosity. +- 1 — enable verbosity. Default value: `0`. @@ -3875,8 +3875,8 @@ This is an experimental setting. Sets the minimum amount of memory for reading l Possible values: -- Positive integer. -- 0 — Big files read with only copying data from kernel to userspace. +- Positive integer. +- 0 — Big files read with only copying data from kernel to userspace. Default value: `0`. @@ -3886,8 +3886,8 @@ Enables or disables waiting unfinished queries when shutdown server. Possible values: -- 0 — Disabled. -- 1 — Enabled. The wait time equal shutdown_wait_unfinished config. +- 0 — Disabled. +- 1 — Enabled. The wait time equal shutdown_wait_unfinished config. Default value: 0. @@ -3999,8 +3999,8 @@ INSERT INTO FUNCTION null('foo String') VALUES ('bar') SETTINGS max_threads=1; Possible values: -- 0 — Disallow. -- 1 — Allow. +- 0 — Disallow. +- 1 — Allow. Default value: `0`. @@ -4120,8 +4120,8 @@ SELECT JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_retur Possible values: -- true — Allow. -- false — Disallow. +- true — Allow. +- false — Disallow. Default value: `false`. @@ -4141,7 +4141,7 @@ SELECT JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_v Possible values: -- true — Allow. -- false — Disallow. +- true — Allow. +- false — Disallow. Default value: `false`. diff --git a/docs/en/operations/storing-data.md b/docs/en/operations/storing-data.md index af7c526e29b..ac6ea22ab75 100644 --- a/docs/en/operations/storing-data.md +++ b/docs/en/operations/storing-data.md @@ -45,11 +45,11 @@ Configuration markup: Required parameters: -- `endpoint` — HDFS endpoint URL in `path` format. Endpoint URL should contain a root path to store data. +- `endpoint` — HDFS endpoint URL in `path` format. Endpoint URL should contain a root path to store data. Optional parameters: -- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1 Mb`. +- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1 Mb`. ## Using Virtual File System for Data Encryption {#encrypted-virtual-file-system} @@ -78,16 +78,16 @@ When writing the same file to `disk2`, it will actually be written to the physic Required parameters: -- `type` — `encrypted`. Otherwise the encrypted disk is not created. -- `disk` — Type of disk for data storage. -- `key` — The key for encryption and decryption. Type: [Uint64](/docs/en/sql-reference/data-types/int-uint.md). You can use `key_hex` parameter to encode the key in hexadecimal form. +- `type` — `encrypted`. Otherwise the encrypted disk is not created. +- `disk` — Type of disk for data storage. +- `key` — The key for encryption and decryption. Type: [Uint64](/docs/en/sql-reference/data-types/int-uint.md). You can use `key_hex` parameter to encode the key in hexadecimal form. You can specify multiple keys using the `id` attribute (see example above). Optional parameters: -- `path` — Path to the location on the disk where the data will be saved. If not specified, the data will be saved in the root directory. -- `current_key_id` — The key used for encryption. All the specified keys can be used for decryption, and you can always switch to another key while maintaining access to previously encrypted data. -- `algorithm` — [Algorithm](/docs/en/sql-reference/statements/create/table.md/#create-query-encryption-codecs) for encryption. Possible values: `AES_128_CTR`, `AES_192_CTR` or `AES_256_CTR`. Default value: `AES_128_CTR`. The key length depends on the algorithm: `AES_128_CTR` — 16 bytes, `AES_192_CTR` — 24 bytes, `AES_256_CTR` — 32 bytes. +- `path` — Path to the location on the disk where the data will be saved. If not specified, the data will be saved in the root directory. +- `current_key_id` — The key used for encryption. All the specified keys can be used for decryption, and you can always switch to another key while maintaining access to previously encrypted data. +- `algorithm` — [Algorithm](/docs/en/sql-reference/statements/create/table.md/#create-query-encryption-codecs) for encryption. Possible values: `AES_128_CTR`, `AES_192_CTR` or `AES_256_CTR`. Default value: `AES_128_CTR`. The key length depends on the algorithm: `AES_128_CTR` — 16 bytes, `AES_192_CTR` — 24 bytes, `AES_256_CTR` — 32 bytes. Example of disk configuration: @@ -446,14 +446,14 @@ SETTINGS storage_policy='web'; Required parameters: -- `type` — `web`. Otherwise the disk is not created. -- `endpoint` — The endpoint URL in `path` format. Endpoint URL must contain a root path to store data, where they were uploaded. +- `type` — `web`. Otherwise the disk is not created. +- `endpoint` — The endpoint URL in `path` format. Endpoint URL must contain a root path to store data, where they were uploaded. Optional parameters: -- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1` Mb. -- `remote_fs_read_backoff_threashold` — The maximum wait time when trying to read data for remote disk. Default value: `10000` seconds. -- `remote_fs_read_backoff_max_tries` — The maximum number of attempts to read with backoff. Default value: `5`. +- `min_bytes_for_seek` — The minimal number of bytes to use seek operation instead of sequential read. Default value: `1` Mb. +- `remote_fs_read_backoff_threashold` — The maximum wait time when trying to read data for remote disk. Default value: `10000` seconds. +- `remote_fs_read_backoff_max_tries` — The maximum number of attempts to read with backoff. Default value: `5`. If a query fails with an exception `DB:Exception Unreachable URL`, then you can try to adjust the settings: [http_connection_timeout](/docs/en/operations/settings/settings.md/#http_connection_timeout), [http_receive_timeout](/docs/en/operations/settings/settings.md/#http_receive_timeout), [keep_alive_timeout](/docs/en/operations/server-configuration-parameters/settings.md/#keep-alive-timeout). diff --git a/docs/en/operations/system-tables/asynchronous_metric_log.md b/docs/en/operations/system-tables/asynchronous_metric_log.md index 8a2f25629f6..4290799b6bc 100644 --- a/docs/en/operations/system-tables/asynchronous_metric_log.md +++ b/docs/en/operations/system-tables/asynchronous_metric_log.md @@ -7,11 +7,11 @@ Contains the historical values for `system.asynchronous_metrics`, which are save Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. -- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds resolution. -- `name` ([String](../../sql-reference/data-types/string.md)) — Metric name. -- `value` ([Float64](../../sql-reference/data-types/float.md)) — Metric value. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds resolution. +- `name` ([String](../../sql-reference/data-types/string.md)) — Metric name. +- `value` ([Float64](../../sql-reference/data-types/float.md)) — Metric value. **Example** diff --git a/docs/en/operations/system-tables/asynchronous_metrics.md b/docs/en/operations/system-tables/asynchronous_metrics.md index 551aa771ec9..6ef15028887 100644 --- a/docs/en/operations/system-tables/asynchronous_metrics.md +++ b/docs/en/operations/system-tables/asynchronous_metrics.md @@ -7,9 +7,9 @@ Contains metrics that are calculated periodically in the background. For example Columns: -- `metric` ([String](../../sql-reference/data-types/string.md)) — Metric name. -- `value` ([Float64](../../sql-reference/data-types/float.md)) — Metric value. -- `description` ([String](../../sql-reference/data-types/string.md) - Metric description) +- `metric` ([String](../../sql-reference/data-types/string.md)) — Metric name. +- `value` ([Float64](../../sql-reference/data-types/float.md)) — Metric value. +- `description` ([String](../../sql-reference/data-types/string.md) - Metric description) **Example** @@ -34,7 +34,7 @@ SELECT * FROM system.asynchronous_metrics LIMIT 10 **See Also** -- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. -- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — Contains instantly calculated metrics. -- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that have occurred. -- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` and `system.events`. +- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. +- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — Contains instantly calculated metrics. +- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that have occurred. +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` and `system.events`. diff --git a/docs/en/operations/system-tables/clusters.md b/docs/en/operations/system-tables/clusters.md index 2c5e2699b4f..4b1e75c25a1 100644 --- a/docs/en/operations/system-tables/clusters.md +++ b/docs/en/operations/system-tables/clusters.md @@ -7,19 +7,19 @@ Contains information about clusters available in the config file and the servers Columns: -- `cluster` ([String](../../sql-reference/data-types/string.md)) — The cluster name. -- `shard_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The shard number in the cluster, starting from 1. -- `shard_weight` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The relative weight of the shard when writing data. -- `replica_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The replica number in the shard, starting from 1. -- `host_name` ([String](../../sql-reference/data-types/string.md)) — The host name, as specified in the config. -- `host_address` ([String](../../sql-reference/data-types/string.md)) — The host IP address obtained from DNS. -- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port to use for connecting to the server. -- `is_local` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the host is local. -- `user` ([String](../../sql-reference/data-types/string.md)) — The name of the user for connecting to the server. -- `default_database` ([String](../../sql-reference/data-types/string.md)) — The default database name. -- `errors_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of times this host failed to reach replica. -- `slowdowns_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of slowdowns that led to changing replica when establishing a connection with hedged requests. -- `estimated_recovery_time` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Seconds remaining until the replica error count is zeroed and it is considered to be back to normal. +- `cluster` ([String](../../sql-reference/data-types/string.md)) — The cluster name. +- `shard_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The shard number in the cluster, starting from 1. +- `shard_weight` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The relative weight of the shard when writing data. +- `replica_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The replica number in the shard, starting from 1. +- `host_name` ([String](../../sql-reference/data-types/string.md)) — The host name, as specified in the config. +- `host_address` ([String](../../sql-reference/data-types/string.md)) — The host IP address obtained from DNS. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port to use for connecting to the server. +- `is_local` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the host is local. +- `user` ([String](../../sql-reference/data-types/string.md)) — The name of the user for connecting to the server. +- `default_database` ([String](../../sql-reference/data-types/string.md)) — The default database name. +- `errors_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of times this host failed to reach replica. +- `slowdowns_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of slowdowns that led to changing replica when establishing a connection with hedged requests. +- `estimated_recovery_time` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Seconds remaining until the replica error count is zeroed and it is considered to be back to normal. **Example** @@ -67,6 +67,6 @@ estimated_recovery_time: 0 **See Also** -- [Table engine Distributed](../../engines/table-engines/special/distributed.md) -- [distributed_replica_error_cap setting](../../operations/settings/settings.md#settings-distributed_replica_error_cap) -- [distributed_replica_error_half_life setting](../../operations/settings/settings.md#settings-distributed_replica_error_half_life) +- [Table engine Distributed](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap setting](../../operations/settings/settings.md#settings-distributed_replica_error_cap) +- [distributed_replica_error_half_life setting](../../operations/settings/settings.md#settings-distributed_replica_error_half_life) diff --git a/docs/en/operations/system-tables/columns.md b/docs/en/operations/system-tables/columns.md index bdb35e24e37..ccdc2d8c742 100644 --- a/docs/en/operations/system-tables/columns.md +++ b/docs/en/operations/system-tables/columns.md @@ -11,27 +11,27 @@ Columns from [temporary tables](../../sql-reference/statements/create/table.md#t The `system.columns` table contains the following columns (the column type is shown in brackets): -- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. -- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `name` ([String](../../sql-reference/data-types/string.md)) — Column name. -- `type` ([String](../../sql-reference/data-types/string.md)) — Column type. -- `position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. -- `default_kind` ([String](../../sql-reference/data-types/string.md)) — Expression type (`DEFAULT`, `MATERIALIZED`, `ALIAS`) for the default value, or an empty string if it is not defined. -- `default_expression` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. -- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of compressed data, in bytes. -- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of decompressed data, in bytes. -- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of marks, in bytes. -- `comment` ([String](../../sql-reference/data-types/string.md)) — Comment on the column, or an empty string if it is not defined. -- `is_in_partition_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the partition expression. -- `is_in_sorting_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the sorting key expression. -- `is_in_primary_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the primary key expression. -- `is_in_sampling_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the sampling key expression. -- `compression_codec` ([String](../../sql-reference/data-types/string.md)) — Compression codec name. -- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. -- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Accuracy of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse it is bitness for integer types and decimal precision for `Decimal` types. Otherwise, the `NULL` value is returned. -- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The base of the number system is the accuracy of approximate numeric data, exact numeric data, integer data or monetary data. In ClickHouse it's 2 for integer types and 10 for `Decimal` types. Otherwise, the `NULL` value is returned. -- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The scale of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse makes sense only for `Decimal` types. Otherwise, the `NULL` value is returned. -- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Decimal precision of `DateTime64` data type. For other data types, the `NULL` value is returned. +- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. +- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Column name. +- `type` ([String](../../sql-reference/data-types/string.md)) — Column type. +- `position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. +- `default_kind` ([String](../../sql-reference/data-types/string.md)) — Expression type (`DEFAULT`, `MATERIALIZED`, `ALIAS`) for the default value, or an empty string if it is not defined. +- `default_expression` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of compressed data, in bytes. +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of decompressed data, in bytes. +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of marks, in bytes. +- `comment` ([String](../../sql-reference/data-types/string.md)) — Comment on the column, or an empty string if it is not defined. +- `is_in_partition_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the partition expression. +- `is_in_sorting_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the sorting key expression. +- `is_in_primary_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the primary key expression. +- `is_in_sampling_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column is in the sampling key expression. +- `compression_codec` ([String](../../sql-reference/data-types/string.md)) — Compression codec name. +- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. +- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Accuracy of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse it is bitness for integer types and decimal precision for `Decimal` types. Otherwise, the `NULL` value is returned. +- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The base of the number system is the accuracy of approximate numeric data, exact numeric data, integer data or monetary data. In ClickHouse it's 2 for integer types and 10 for `Decimal` types. Otherwise, the `NULL` value is returned. +- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The scale of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse makes sense only for `Decimal` types. Otherwise, the `NULL` value is returned. +- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Decimal precision of `DateTime64` data type. For other data types, the `NULL` value is returned. **Example** diff --git a/docs/en/operations/system-tables/contributors.md b/docs/en/operations/system-tables/contributors.md index b871bb20f2e..f00329e2dbe 100644 --- a/docs/en/operations/system-tables/contributors.md +++ b/docs/en/operations/system-tables/contributors.md @@ -7,7 +7,7 @@ Contains information about contributors. The order is random at query execution Columns: -- `name` (String) — Contributor (author) name from git log. +- `name` (String) — Contributor (author) name from git log. **Example** diff --git a/docs/en/operations/system-tables/crash-log.md b/docs/en/operations/system-tables/crash-log.md index a44b0db8e9b..4d015a513a2 100644 --- a/docs/en/operations/system-tables/crash-log.md +++ b/docs/en/operations/system-tables/crash-log.md @@ -7,17 +7,17 @@ Contains information about stack traces for fatal errors. The table does not exi Columns: -- `event_date` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date of the event. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Time of the event. -- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Timestamp of the event with nanoseconds. -- `signal` ([Int32](../../sql-reference/data-types/int-uint.md)) — Signal number. -- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread ID. -- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query ID. -- `trace` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Stack trace at the moment of crash. Each element is a virtual memory address inside ClickHouse server process. -- `trace_full` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Stack trace at the moment of crash. Each element contains a called method inside ClickHouse server process. -- `version` ([String](../../sql-reference/data-types/string.md)) — ClickHouse server version. -- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse server revision. -- `build_id` ([String](../../sql-reference/data-types/string.md)) — BuildID that is generated by compiler. +- `event_date` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date of the event. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Time of the event. +- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Timestamp of the event with nanoseconds. +- `signal` ([Int32](../../sql-reference/data-types/int-uint.md)) — Signal number. +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread ID. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query ID. +- `trace` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Stack trace at the moment of crash. Each element is a virtual memory address inside ClickHouse server process. +- `trace_full` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Stack trace at the moment of crash. Each element contains a called method inside ClickHouse server process. +- `version` ([String](../../sql-reference/data-types/string.md)) — ClickHouse server version. +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse server revision. +- `build_id` ([String](../../sql-reference/data-types/string.md)) — BuildID that is generated by compiler. **Example** @@ -46,6 +46,6 @@ build_id: ``` **See also** -- [trace_log](../../operations/system-tables/trace_log.md) system table +- [trace_log](../../operations/system-tables/trace_log.md) system table [Original article](https://clickhouse.com/docs/en/operations/system-tables/crash-log) diff --git a/docs/en/operations/system-tables/data_skipping_indices.md b/docs/en/operations/system-tables/data_skipping_indices.md index f1e233b33f7..188d94c50da 100644 --- a/docs/en/operations/system-tables/data_skipping_indices.md +++ b/docs/en/operations/system-tables/data_skipping_indices.md @@ -7,16 +7,16 @@ Contains information about existing data skipping indices in all the tables. Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. -- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `name` ([String](../../sql-reference/data-types/string.md)) — Index name. -- `type` ([String](../../sql-reference/data-types/string.md)) — Index type. -- `type_full` ([String](../../sql-reference/data-types/string.md)) — Index type expression from create statement. -- `expr` ([String](../../sql-reference/data-types/string.md)) — Expression for the index calculation. -- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of granules in the block. -- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of compressed data, in bytes. -- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of decompressed data, in bytes. -- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of marks, in bytes. +- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. +- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Index name. +- `type` ([String](../../sql-reference/data-types/string.md)) — Index type. +- `type_full` ([String](../../sql-reference/data-types/string.md)) — Index type expression from create statement. +- `expr` ([String](../../sql-reference/data-types/string.md)) — Expression for the index calculation. +- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of granules in the block. +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of compressed data, in bytes. +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of decompressed data, in bytes. +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of marks, in bytes. **Example** diff --git a/docs/en/operations/system-tables/data_type_families.md b/docs/en/operations/system-tables/data_type_families.md index f914d5545d3..1392e977f60 100644 --- a/docs/en/operations/system-tables/data_type_families.md +++ b/docs/en/operations/system-tables/data_type_families.md @@ -7,9 +7,9 @@ Contains information about supported [data types](../../sql-reference/data-types Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Data type name. -- `case_insensitive` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Property that shows whether you can use a data type name in a query in case insensitive manner or not. For example, `Date` and `date` are both valid. -- `alias_to` ([String](../../sql-reference/data-types/string.md)) — Data type name for which `name` is an alias. +- `name` ([String](../../sql-reference/data-types/string.md)) — Data type name. +- `case_insensitive` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Property that shows whether you can use a data type name in a query in case insensitive manner or not. For example, `Date` and `date` are both valid. +- `alias_to` ([String](../../sql-reference/data-types/string.md)) — Data type name for which `name` is an alias. **Example** @@ -34,4 +34,4 @@ SELECT * FROM system.data_type_families WHERE alias_to = 'String' **See Also** -- [Syntax](../../sql-reference/syntax.md) — Information about supported syntax. +- [Syntax](../../sql-reference/syntax.md) — Information about supported syntax. diff --git a/docs/en/operations/system-tables/databases.md b/docs/en/operations/system-tables/databases.md index 8f0cc6e56d2..f3d3d388c36 100644 --- a/docs/en/operations/system-tables/databases.md +++ b/docs/en/operations/system-tables/databases.md @@ -7,13 +7,13 @@ Contains information about the databases that are available to the current user. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Database name. -- `engine` ([String](../../sql-reference/data-types/string.md)) — [Database engine](../../engines/database-engines/index.md). -- `data_path` ([String](../../sql-reference/data-types/string.md)) — Data path. -- `metadata_path` ([String](../../sql-reference/data-types/enum.md)) — Metadata path. -- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Database UUID. -- `comment` ([String](../../sql-reference/data-types/enum.md)) — Database comment. -- `engine_full` ([String](../../sql-reference/data-types/enum.md)) — Parameters of the database engine. +- `name` ([String](../../sql-reference/data-types/string.md)) — Database name. +- `engine` ([String](../../sql-reference/data-types/string.md)) — [Database engine](../../engines/database-engines/index.md). +- `data_path` ([String](../../sql-reference/data-types/string.md)) — Data path. +- `metadata_path` ([String](../../sql-reference/data-types/enum.md)) — Metadata path. +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Database UUID. +- `comment` ([String](../../sql-reference/data-types/enum.md)) — Database comment. +- `engine_full` ([String](../../sql-reference/data-types/enum.md)) — Parameters of the database engine. The `name` column from this system table is used for implementing the `SHOW DATABASES` query. diff --git a/docs/en/operations/system-tables/dictionaries.md b/docs/en/operations/system-tables/dictionaries.md index ca6b7faaa78..8632581144c 100644 --- a/docs/en/operations/system-tables/dictionaries.md +++ b/docs/en/operations/system-tables/dictionaries.md @@ -7,36 +7,36 @@ Contains information about [dictionaries](../../sql-reference/dictionaries/index Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database containing the dictionary created by DDL query. Empty string for other dictionaries. -- `name` ([String](../../sql-reference/data-types/string.md)) — [Dictionary name](../../sql-reference/dictionaries/index.md). -- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Dictionary UUID. -- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Dictionary status. Possible values: - - `NOT_LOADED` — Dictionary was not loaded because it was not used. - - `LOADED` — Dictionary loaded successfully. - - `FAILED` — Unable to load the dictionary as a result of an error. - - `LOADING` — Dictionary is loading now. - - `LOADED_AND_RELOADING` — Dictionary is loaded successfully, and is being reloaded right now (frequent reasons: [SYSTEM RELOAD DICTIONARY](../../sql-reference/statements/system.md#query_language-system-reload-dictionary) query, timeout, dictionary config has changed). - - `FAILED_AND_RELOADING` — Could not load the dictionary as a result of an error and is loading now. -- `origin` ([String](../../sql-reference/data-types/string.md)) — Path to the configuration file that describes the dictionary. -- `type` ([String](../../sql-reference/data-types/string.md)) — Type of a dictionary allocation. [Storing Dictionaries in Memory](../../sql-reference/dictionaries/index.md#storig-dictionaries-in-memory). -- `key.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of [key names](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key) provided by the dictionary. -- `key.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Corresponding array of [key types](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key) provided by the dictionary. -- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of [attribute names](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes) provided by the dictionary. -- `attribute.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Corresponding array of [attribute types](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes) provided by the dictionary. -- `bytes_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Amount of RAM allocated for the dictionary. -- `query_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of queries since the dictionary was loaded or since the last successful reboot. -- `hit_rate` ([Float64](../../sql-reference/data-types/float.md)) — For cache dictionaries, the percentage of uses for which the value was in the cache. -- `found_rate` ([Float64](../../sql-reference/data-types/float.md)) — The percentage of uses for which the value was found. -- `element_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of items stored in the dictionary. -- `load_factor` ([Float64](../../sql-reference/data-types/float.md)) — Percentage filled in the dictionary (for a hashed dictionary, the percentage filled in the hash table). -- `source` ([String](../../sql-reference/data-types/string.md)) — Text describing the [data source](../../sql-reference/dictionaries/index.md#dictionary-sources) for the dictionary. -- `lifetime_min` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Minimum [lifetime](../../sql-reference/dictionaries/index.md#dictionary-updates) of the dictionary in memory, after which ClickHouse tries to reload the dictionary (if `invalidate_query` is set, then only if it has changed). Set in seconds. -- `lifetime_max` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Maximum [lifetime](../../sql-reference/dictionaries/index.md#dictionary-updates) of the dictionary in memory, after which ClickHouse tries to reload the dictionary (if `invalidate_query` is set, then only if it has changed). Set in seconds. -- `loading_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time for loading the dictionary. -- `last_successful_update_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — End time for loading or updating the dictionary. Helps to monitor some troubles with dictionary sources and investigate the causes. -- `loading_duration` ([Float32](../../sql-reference/data-types/float.md)) — Duration of a dictionary loading. -- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text of the error that occurs when creating or reloading the dictionary if the dictionary couldn’t be created. -- `comment` ([String](../../sql-reference/data-types/string.md)) — Text of the comment to dictionary. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database containing the dictionary created by DDL query. Empty string for other dictionaries. +- `name` ([String](../../sql-reference/data-types/string.md)) — [Dictionary name](../../sql-reference/dictionaries/index.md). +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Dictionary UUID. +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Dictionary status. Possible values: + - `NOT_LOADED` — Dictionary was not loaded because it was not used. + - `LOADED` — Dictionary loaded successfully. + - `FAILED` — Unable to load the dictionary as a result of an error. + - `LOADING` — Dictionary is loading now. + - `LOADED_AND_RELOADING` — Dictionary is loaded successfully, and is being reloaded right now (frequent reasons: [SYSTEM RELOAD DICTIONARY](../../sql-reference/statements/system.md#query_language-system-reload-dictionary) query, timeout, dictionary config has changed). + - `FAILED_AND_RELOADING` — Could not load the dictionary as a result of an error and is loading now. +- `origin` ([String](../../sql-reference/data-types/string.md)) — Path to the configuration file that describes the dictionary. +- `type` ([String](../../sql-reference/data-types/string.md)) — Type of a dictionary allocation. [Storing Dictionaries in Memory](../../sql-reference/dictionaries/index.md#storig-dictionaries-in-memory). +- `key.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of [key names](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key) provided by the dictionary. +- `key.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Corresponding array of [key types](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key) provided by the dictionary. +- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of [attribute names](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes) provided by the dictionary. +- `attribute.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Corresponding array of [attribute types](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes) provided by the dictionary. +- `bytes_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Amount of RAM allocated for the dictionary. +- `query_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of queries since the dictionary was loaded or since the last successful reboot. +- `hit_rate` ([Float64](../../sql-reference/data-types/float.md)) — For cache dictionaries, the percentage of uses for which the value was in the cache. +- `found_rate` ([Float64](../../sql-reference/data-types/float.md)) — The percentage of uses for which the value was found. +- `element_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of items stored in the dictionary. +- `load_factor` ([Float64](../../sql-reference/data-types/float.md)) — Percentage filled in the dictionary (for a hashed dictionary, the percentage filled in the hash table). +- `source` ([String](../../sql-reference/data-types/string.md)) — Text describing the [data source](../../sql-reference/dictionaries/index.md#dictionary-sources) for the dictionary. +- `lifetime_min` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Minimum [lifetime](../../sql-reference/dictionaries/index.md#dictionary-updates) of the dictionary in memory, after which ClickHouse tries to reload the dictionary (if `invalidate_query` is set, then only if it has changed). Set in seconds. +- `lifetime_max` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Maximum [lifetime](../../sql-reference/dictionaries/index.md#dictionary-updates) of the dictionary in memory, after which ClickHouse tries to reload the dictionary (if `invalidate_query` is set, then only if it has changed). Set in seconds. +- `loading_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time for loading the dictionary. +- `last_successful_update_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — End time for loading or updating the dictionary. Helps to monitor some troubles with dictionary sources and investigate the causes. +- `loading_duration` ([Float32](../../sql-reference/data-types/float.md)) — Duration of a dictionary loading. +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text of the error that occurs when creating or reloading the dictionary if the dictionary couldn’t be created. +- `comment` ([String](../../sql-reference/data-types/string.md)) — Text of the comment to dictionary. **Example** diff --git a/docs/en/operations/system-tables/disks.md b/docs/en/operations/system-tables/disks.md index a079f3338d2..ed67e2a2416 100644 --- a/docs/en/operations/system-tables/disks.md +++ b/docs/en/operations/system-tables/disks.md @@ -7,12 +7,12 @@ Contains information about disks defined in the [server configuration](../../eng Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a disk in the server configuration. -- `path` ([String](../../sql-reference/data-types/string.md)) — Path to the mount point in the file system. -- `free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Free space on disk in bytes. -- `total_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Disk volume in bytes. -- `unreserved_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Free space which is not taken by reservations (`free_space` minus the size of reservations taken by merges, inserts, and other disk write operations currently running). -- `keep_free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Amount of disk space that should stay free on disk in bytes. Defined in the `keep_free_space_bytes` parameter of disk configuration. +- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a disk in the server configuration. +- `path` ([String](../../sql-reference/data-types/string.md)) — Path to the mount point in the file system. +- `free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Free space on disk in bytes. +- `total_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Disk volume in bytes. +- `unreserved_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Free space which is not taken by reservations (`free_space` minus the size of reservations taken by merges, inserts, and other disk write operations currently running). +- `keep_free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Amount of disk space that should stay free on disk in bytes. Defined in the `keep_free_space_bytes` parameter of disk configuration. **Example** diff --git a/docs/en/operations/system-tables/distributed_ddl_queue.md b/docs/en/operations/system-tables/distributed_ddl_queue.md index acc68372a4c..8cccf946621 100644 --- a/docs/en/operations/system-tables/distributed_ddl_queue.md +++ b/docs/en/operations/system-tables/distributed_ddl_queue.md @@ -7,18 +7,18 @@ Contains information about [distributed ddl queries (ON CLUSTER clause)](../../s Columns: -- `entry` ([String](../../sql-reference/data-types/string.md)) — Query id. -- `host_name` ([String](../../sql-reference/data-types/string.md)) — Hostname. -- `host_address` ([String](../../sql-reference/data-types/string.md)) — IP address that the Hostname resolves to. -- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — Host Port. -- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the query. -- `cluster` ([String](../../sql-reference/data-types/string.md)) — Cluster name. -- `query` ([String](../../sql-reference/data-types/string.md)) — Query executed. -- `initiator` ([String](../../sql-reference/data-types/string.md)) — Node that executed the query. -- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query start time. -- `query_finish_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query finish time. -- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Duration of query execution (in milliseconds). -- `exception_code` ([Enum8](../../sql-reference/data-types/enum.md)) — Exception code from [ClickHouse Keeper](../../operations/tips.md#zookeeper). +- `entry` ([String](../../sql-reference/data-types/string.md)) — Query id. +- `host_name` ([String](../../sql-reference/data-types/string.md)) — Hostname. +- `host_address` ([String](../../sql-reference/data-types/string.md)) — IP address that the Hostname resolves to. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — Host Port. +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the query. +- `cluster` ([String](../../sql-reference/data-types/string.md)) — Cluster name. +- `query` ([String](../../sql-reference/data-types/string.md)) — Query executed. +- `initiator` ([String](../../sql-reference/data-types/string.md)) — Node that executed the query. +- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query start time. +- `query_finish_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query finish time. +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Duration of query execution (in milliseconds). +- `exception_code` ([Enum8](../../sql-reference/data-types/enum.md)) — Exception code from [ClickHouse Keeper](../../operations/tips.md#zookeeper). **Example** diff --git a/docs/en/operations/system-tables/distribution_queue.md b/docs/en/operations/system-tables/distribution_queue.md index 8f461590ee1..0dee805c022 100644 --- a/docs/en/operations/system-tables/distribution_queue.md +++ b/docs/en/operations/system-tables/distribution_queue.md @@ -7,25 +7,25 @@ Contains information about local files that are in the queue to be sent to the s Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. -- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. +- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. -- `data_path` ([String](../../sql-reference/data-types/string.md)) — Path to the folder with local files. +- `data_path` ([String](../../sql-reference/data-types/string.md)) — Path to the folder with local files. -- `is_blocked` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag indicates whether sending local files to the server is blocked. +- `is_blocked` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag indicates whether sending local files to the server is blocked. -- `error_count` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of errors. +- `error_count` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of errors. -- `data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of local files in a folder. +- `data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of local files in a folder. -- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of compressed data in local files, in bytes. +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of compressed data in local files, in bytes. -- `broken_data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of files that has been marked as broken (due to an error). +- `broken_data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of files that has been marked as broken (due to an error). -- `broken_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of compressed data in broken files, in bytes. +- `broken_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of compressed data in broken files, in bytes. -- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text message about the last error that occurred (if any). +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text message about the last error that occurred (if any). **Example** @@ -48,4 +48,4 @@ last_exception: **See Also** -- [Distributed table engine](../../engines/table-engines/special/distributed.md) +- [Distributed table engine](../../engines/table-engines/special/distributed.md) diff --git a/docs/en/operations/system-tables/dropped_tables.md b/docs/en/operations/system-tables/dropped_tables.md index cb6cec0035a..144c03109ac 100644 --- a/docs/en/operations/system-tables/dropped_tables.md +++ b/docs/en/operations/system-tables/dropped_tables.md @@ -7,13 +7,13 @@ Contains information about tables that drop table has been executed but data cle Columns: -- `index` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Index in marked_dropped_tables queue. -- `database` ([String](../../sql-reference/data-types/string.md)) — Database. -- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Table uuid. -- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name. -- `metadata_dropped_path` ([String](../../sql-reference/data-types/string.md)) — Path of table's metadata file in metadate_dropped directory. -- `table_dropped_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time when the next attempt to remove table's data is scheduled on. Usually it's the table when the table was dropped plus `database_atomic_delay_before_drop_table_sec` +- `index` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Index in marked_dropped_tables queue. +- `database` ([String](../../sql-reference/data-types/string.md)) — Database. +- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Table uuid. +- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name. +- `metadata_dropped_path` ([String](../../sql-reference/data-types/string.md)) — Path of table's metadata file in metadate_dropped directory. +- `table_dropped_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time when the next attempt to remove table's data is scheduled on. Usually it's the table when the table was dropped plus `database_atomic_delay_before_drop_table_sec` **Example** diff --git a/docs/en/operations/system-tables/errors.md b/docs/en/operations/system-tables/errors.md index 48437f43b7d..01762962152 100644 --- a/docs/en/operations/system-tables/errors.md +++ b/docs/en/operations/system-tables/errors.md @@ -7,13 +7,13 @@ Contains error codes with the number of times they have been triggered. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — name of the error (`errorCodeToName`). -- `code` ([Int32](../../sql-reference/data-types/int-uint.md)) — code number of the error. -- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — the number of times this error has been happened. -- `last_error_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — time when the last error happened. -- `last_error_message` ([String](../../sql-reference/data-types/string.md)) — message for the last error. -- `last_error_trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — A [stack trace](https://en.wikipedia.org/wiki/Stack_trace) which represents a list of physical addresses where the called methods are stored. -- `remote` ([UInt8](../../sql-reference/data-types/int-uint.md)) — remote exception (i.e. received during one of the distributed query). +- `name` ([String](../../sql-reference/data-types/string.md)) — name of the error (`errorCodeToName`). +- `code` ([Int32](../../sql-reference/data-types/int-uint.md)) — code number of the error. +- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — the number of times this error has been happened. +- `last_error_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — time when the last error happened. +- `last_error_message` ([String](../../sql-reference/data-types/string.md)) — message for the last error. +- `last_error_trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — A [stack trace](https://en.wikipedia.org/wiki/Stack_trace) which represents a list of physical addresses where the called methods are stored. +- `remote` ([UInt8](../../sql-reference/data-types/int-uint.md)) — remote exception (i.e. received during one of the distributed query). **Example** diff --git a/docs/en/operations/system-tables/events.md b/docs/en/operations/system-tables/events.md index 68217a6daaf..ba5602ee292 100644 --- a/docs/en/operations/system-tables/events.md +++ b/docs/en/operations/system-tables/events.md @@ -7,9 +7,9 @@ Contains information about the number of events that have occurred in the system Columns: -- `event` ([String](../../sql-reference/data-types/string.md)) — Event name. -- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of events occurred. -- `description` ([String](../../sql-reference/data-types/string.md)) — Event description. +- `event` ([String](../../sql-reference/data-types/string.md)) — Event name. +- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of events occurred. +- `description` ([String](../../sql-reference/data-types/string.md)) — Event description. **Example** @@ -29,7 +29,7 @@ SELECT * FROM system.events LIMIT 5 **See Also** -- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. -- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — Contains instantly calculated metrics. -- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` и `system.events`. -- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. +- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — Contains instantly calculated metrics. +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` и `system.events`. +- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. diff --git a/docs/en/operations/system-tables/functions.md b/docs/en/operations/system-tables/functions.md index cb4d8e938eb..60bfa08975b 100644 --- a/docs/en/operations/system-tables/functions.md +++ b/docs/en/operations/system-tables/functions.md @@ -7,8 +7,8 @@ Contains information about normal and aggregate functions. Columns: -- `name`(`String`) – The name of the function. -- `is_aggregate`(`UInt8`) — Whether the function is aggregate. +- `name`(`String`) – The name of the function. +- `is_aggregate`(`UInt8`) — Whether the function is aggregate. **Example** diff --git a/docs/en/operations/system-tables/grants.md b/docs/en/operations/system-tables/grants.md index 7f41f5f07dd..4b525ce708b 100644 --- a/docs/en/operations/system-tables/grants.md +++ b/docs/en/operations/system-tables/grants.md @@ -6,20 +6,20 @@ slug: /en/operations/system-tables/grants Privileges granted to ClickHouse user accounts. Columns: -- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. -- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role assigned to user account. +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role assigned to user account. -- `access_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Access parameters for ClickHouse user account. +- `access_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Access parameters for ClickHouse user account. -- `database` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a database. +- `database` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a database. -- `table` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a table. +- `table` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a table. -- `column` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a column to which access is granted. +- `column` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a column to which access is granted. -- `is_partial_revoke` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Logical value. It shows whether some privileges have been revoked. Possible values: +- `is_partial_revoke` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Logical value. It shows whether some privileges have been revoked. Possible values: - `0` — The row describes a partial revoke. - `1` — The row describes a grant. -- `grant_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Permission is granted `WITH GRANT OPTION`, see [GRANT](../../sql-reference/statements/grant.md#grant-privigele-syntax). +- `grant_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Permission is granted `WITH GRANT OPTION`, see [GRANT](../../sql-reference/statements/grant.md#grant-privigele-syntax). diff --git a/docs/en/operations/system-tables/graphite_retentions.md b/docs/en/operations/system-tables/graphite_retentions.md index 230fa4cede9..19a751b6ef2 100644 --- a/docs/en/operations/system-tables/graphite_retentions.md +++ b/docs/en/operations/system-tables/graphite_retentions.md @@ -7,12 +7,12 @@ Contains information about parameters [graphite_rollup](../../operations/server- Columns: -- `config_name` (String) - `graphite_rollup` parameter name. -- `regexp` (String) - A pattern for the metric name. -- `function` (String) - The name of the aggregating function. -- `age` (UInt64) - The minimum age of the data in seconds. -- `precision` (UInt64) - How precisely to define the age of the data in seconds. -- `priority` (UInt16) - Pattern priority. -- `is_default` (UInt8) - Whether the pattern is the default. -- `Tables.database` (Array(String)) - Array of names of database tables that use the `config_name` parameter. -- `Tables.table` (Array(String)) - Array of table names that use the `config_name` parameter. +- `config_name` (String) - `graphite_rollup` parameter name. +- `regexp` (String) - A pattern for the metric name. +- `function` (String) - The name of the aggregating function. +- `age` (UInt64) - The minimum age of the data in seconds. +- `precision` (UInt64) - How precisely to define the age of the data in seconds. +- `priority` (UInt16) - Pattern priority. +- `is_default` (UInt8) - Whether the pattern is the default. +- `Tables.database` (Array(String)) - Array of names of database tables that use the `config_name` parameter. +- `Tables.table` (Array(String)) - Array of table names that use the `config_name` parameter. diff --git a/docs/en/operations/system-tables/index.md b/docs/en/operations/system-tables/index.md index 284ba866cc8..508419783ef 100644 --- a/docs/en/operations/system-tables/index.md +++ b/docs/en/operations/system-tables/index.md @@ -11,14 +11,14 @@ pagination_next: 'en/operations/system-tables/asynchronous_metric_log' System tables provide information about: -- Server states, processes, and environment. -- Server’s internal processes. +- Server states, processes, and environment. +- Server’s internal processes. System tables: -- Located in the `system` database. -- Available only for reading data. -- Can’t be dropped or altered, but can be detached. +- Located in the `system` database. +- Available only for reading data. +- Can’t be dropped or altered, but can be detached. Most of system tables store their data in RAM. A ClickHouse server creates such system tables at the start. @@ -26,12 +26,12 @@ Unlike other system tables, the system log tables [metric_log](../../operations/ System log tables can be customized by creating a config file with the same name as the table under `/etc/clickhouse-server/config.d/`, or setting corresponding elements in `/etc/clickhouse-server/config.xml`. Elements can be customized are: -- `database`: database the system log table belongs to. This option is deprecated now. All system log tables are under database `system`. -- `table`: table to insert data. -- `partition_by`: specify [PARTITION BY](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) expression. -- `ttl`: specify table [TTL](../../sql-reference/statements/alter/ttl.md) expression. -- `flush_interval_milliseconds`: interval of flushing data to disk. -- `engine`: provide full engine expression (starting with `ENGINE =` ) with parameters. This option is contradict with `partition_by` and `ttl`. If set together, the server would raise an exception and exit. +- `database`: database the system log table belongs to. This option is deprecated now. All system log tables are under database `system`. +- `table`: table to insert data. +- `partition_by`: specify [PARTITION BY](../../engines/table-engines/mergetree-family/custom-partitioning-key.md) expression. +- `ttl`: specify table [TTL](../../sql-reference/statements/alter/ttl.md) expression. +- `flush_interval_milliseconds`: interval of flushing data to disk. +- `engine`: provide full engine expression (starting with `ENGINE =` ) with parameters. This option is contradict with `partition_by` and `ttl`. If set together, the server would raise an exception and exit. An example: @@ -56,8 +56,8 @@ By default, table growth is unlimited. To control a size of a table, you can use For collecting system metrics ClickHouse server uses: -- `CAP_NET_ADMIN` capability. -- [procfs](https://en.wikipedia.org/wiki/Procfs) (only in Linux). +- `CAP_NET_ADMIN` capability. +- [procfs](https://en.wikipedia.org/wiki/Procfs) (only in Linux). **procfs** @@ -65,13 +65,13 @@ If ClickHouse server does not have `CAP_NET_ADMIN` capability, it tries to fall If procfs is supported and enabled on the system, ClickHouse server collects these metrics: -- `OSCPUVirtualTimeMicroseconds` -- `OSCPUWaitMicroseconds` -- `OSIOWaitMicroseconds` -- `OSReadChars` -- `OSWriteChars` -- `OSReadBytes` -- `OSWriteBytes` +- `OSCPUVirtualTimeMicroseconds` +- `OSCPUWaitMicroseconds` +- `OSIOWaitMicroseconds` +- `OSReadChars` +- `OSWriteChars` +- `OSReadBytes` +- `OSWriteBytes` ## Related content diff --git a/docs/en/operations/system-tables/information_schema.md b/docs/en/operations/system-tables/information_schema.md index a8e516f02a3..07e9a9e2f58 100644 --- a/docs/en/operations/system-tables/information_schema.md +++ b/docs/en/operations/system-tables/information_schema.md @@ -22,10 +22,10 @@ SHOW TABLES FROM INFORMATION_SCHEMA; `INFORMATION_SCHEMA` contains the following views: -- [COLUMNS](#columns) -- [SCHEMATA](#schemata) -- [TABLES](#tables) -- [VIEWS](#views) +- [COLUMNS](#columns) +- [SCHEMATA](#schemata) +- [TABLES](#tables) +- [VIEWS](#views) ## COLUMNS {#columns} @@ -33,29 +33,29 @@ Contains columns read from the [system.columns](../../operations/system-tables/c Columns: -- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `column_name` ([String](../../sql-reference/data-types/string.md)) — Column name. -- `ordinal_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. -- `column_default` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. -- `is_nullable` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column type is `Nullable`. -- `data_type` ([String](../../sql-reference/data-types/string.md)) — Column type. -- `character_maximum_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. -- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. -- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Accuracy of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse it is bitness for integer types and decimal precision for `Decimal` types. Otherwise, the `NULL` value is returned. -- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The base of the number system is the accuracy of approximate numeric data, exact numeric data, integer data or monetary data. In ClickHouse it's 2 for integer types and 10 for `Decimal` types. Otherwise, the `NULL` value is returned. -- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The scale of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse makes sense only for `Decimal` types. Otherwise, the `NULL` value is returned. -- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Decimal precision of `DateTime64` data type. For other data types, the `NULL` value is returned. -- `character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `collation_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `collation_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `collation_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `domain_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `domain_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `domain_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `column_name` ([String](../../sql-reference/data-types/string.md)) — Column name. +- `ordinal_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. +- `column_default` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. +- `is_nullable` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the column type is `Nullable`. +- `data_type` ([String](../../sql-reference/data-types/string.md)) — Column type. +- `character_maximum_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. +- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Maximum length in bytes for binary data, character data, or text data and images. In ClickHouse makes sense only for `FixedString` data type. Otherwise, the `NULL` value is returned. +- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Accuracy of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse it is bitness for integer types and decimal precision for `Decimal` types. Otherwise, the `NULL` value is returned. +- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The base of the number system is the accuracy of approximate numeric data, exact numeric data, integer data or monetary data. In ClickHouse it's 2 for integer types and 10 for `Decimal` types. Otherwise, the `NULL` value is returned. +- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — The scale of approximate numeric data, exact numeric data, integer data, or monetary data. In ClickHouse makes sense only for `Decimal` types. Otherwise, the `NULL` value is returned. +- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — Decimal precision of `DateTime64` data type. For other data types, the `NULL` value is returned. +- `character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `collation_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `collation_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `collation_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `domain_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `domain_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `domain_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. **Example** @@ -101,13 +101,13 @@ Contains columns read from the [system.databases](../../operations/system-tables Columns: -- `catalog_name` ([String](../../sql-reference/data-types/string.md)) — The name of the database. -- `schema_name` ([String](../../sql-reference/data-types/string.md)) — The name of the database. -- `schema_owner` ([String](../../sql-reference/data-types/string.md)) — Schema owner name, always `'default'`. -- `default_character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `default_character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `default_character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. -- `sql_path` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `catalog_name` ([String](../../sql-reference/data-types/string.md)) — The name of the database. +- `schema_name` ([String](../../sql-reference/data-types/string.md)) — The name of the database. +- `schema_owner` ([String](../../sql-reference/data-types/string.md)) — Schema owner name, always `'default'`. +- `default_character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `default_character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `default_character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. +- `sql_path` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`, not supported. **Example** @@ -137,15 +137,15 @@ Contains columns read from the [system.tables](../../operations/system-tables/ta Columns: -- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `table_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Table type. Possible values: - - `BASE TABLE` - - `VIEW` - - `FOREIGN TABLE` - - `LOCAL TEMPORARY` - - `SYSTEM VIEW` +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `table_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Table type. Possible values: + - `BASE TABLE` + - `VIEW` + - `FOREIGN TABLE` + - `LOCAL TEMPORARY` + - `SYSTEM VIEW` **Example** @@ -172,18 +172,18 @@ Contains columns read from the [system.tables](../../operations/system-tables/ta Columns: -- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. -- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `view_definition` ([String](../../sql-reference/data-types/string.md)) — `SELECT` query for view. -- `check_option` ([String](../../sql-reference/data-types/string.md)) — `NONE`, no checking. -- `is_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the view is not updated. -- `is_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — Shows whether the created view is [materialized](../../sql-reference/statements/create/view.md/#materialized-view). Possible values: - - `NO` — The created view is not materialized. - - `YES` — The created view is materialized. -- `is_trigger_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the trigger is not updated. -- `is_trigger_deletable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the trigger is not deleted. -- `is_trigger_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, no data is inserted into the trigger. +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — The name of the database in which the table is located. +- `table_name` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `view_definition` ([String](../../sql-reference/data-types/string.md)) — `SELECT` query for view. +- `check_option` ([String](../../sql-reference/data-types/string.md)) — `NONE`, no checking. +- `is_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the view is not updated. +- `is_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — Shows whether the created view is [materialized](../../sql-reference/statements/create/view.md/#materialized-view). Possible values: + - `NO` — The created view is not materialized. + - `YES` — The created view is materialized. +- `is_trigger_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the trigger is not updated. +- `is_trigger_deletable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, the trigger is not deleted. +- `is_trigger_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`, no data is inserted into the trigger. **Example** diff --git a/docs/en/operations/system-tables/merge_tree_settings.md b/docs/en/operations/system-tables/merge_tree_settings.md index 672c79e335b..d8539908bf7 100644 --- a/docs/en/operations/system-tables/merge_tree_settings.md +++ b/docs/en/operations/system-tables/merge_tree_settings.md @@ -7,11 +7,11 @@ Contains information about settings for `MergeTree` tables. Columns: -- `name` (String) — Setting name. -- `value` (String) — Setting value. -- `description` (String) — Setting description. -- `type` (String) — Setting type (implementation specific string value). -- `changed` (UInt8) — Whether the setting was explicitly defined in the config or explicitly changed. +- `name` (String) — Setting name. +- `value` (String) — Setting value. +- `description` (String) — Setting description. +- `type` (String) — Setting type (implementation specific string value). +- `changed` (UInt8) — Whether the setting was explicitly defined in the config or explicitly changed. **Example** ```sql diff --git a/docs/en/operations/system-tables/merges.md b/docs/en/operations/system-tables/merges.md index a5055639393..ec1d4c8e656 100644 --- a/docs/en/operations/system-tables/merges.md +++ b/docs/en/operations/system-tables/merges.md @@ -7,20 +7,20 @@ Contains information about merges and part mutations currently in process for ta Columns: -- `database` (String) — The name of the database the table is in. -- `table` (String) — Table name. -- `elapsed` (Float64) — The time elapsed (in seconds) since the merge started. -- `progress` (Float64) — The percentage of completed work from 0 to 1. -- `num_parts` (UInt64) — The number of pieces to be merged. -- `result_part_name` (String) — The name of the part that will be formed as the result of merging. -- `is_mutation` (UInt8) — 1 if this process is a part mutation. -- `total_size_bytes_compressed` (UInt64) — The total size of the compressed data in the merged chunks. -- `total_size_marks` (UInt64) — The total number of marks in the merged parts. -- `bytes_read_uncompressed` (UInt64) — Number of bytes read, uncompressed. -- `rows_read` (UInt64) — Number of rows read. -- `bytes_written_uncompressed` (UInt64) — Number of bytes written, uncompressed. -- `rows_written` (UInt64) — Number of rows written. -- `memory_usage` (UInt64) — Memory consumption of the merge process. -- `thread_id` (UInt64) — Thread ID of the merge process. -- `merge_type` — The type of current merge. Empty if it's an mutation. -- `merge_algorithm` — The algorithm used in current merge. Empty if it's an mutation. +- `database` (String) — The name of the database the table is in. +- `table` (String) — Table name. +- `elapsed` (Float64) — The time elapsed (in seconds) since the merge started. +- `progress` (Float64) — The percentage of completed work from 0 to 1. +- `num_parts` (UInt64) — The number of pieces to be merged. +- `result_part_name` (String) — The name of the part that will be formed as the result of merging. +- `is_mutation` (UInt8) — 1 if this process is a part mutation. +- `total_size_bytes_compressed` (UInt64) — The total size of the compressed data in the merged chunks. +- `total_size_marks` (UInt64) — The total number of marks in the merged parts. +- `bytes_read_uncompressed` (UInt64) — Number of bytes read, uncompressed. +- `rows_read` (UInt64) — Number of rows read. +- `bytes_written_uncompressed` (UInt64) — Number of bytes written, uncompressed. +- `rows_written` (UInt64) — Number of rows written. +- `memory_usage` (UInt64) — Memory consumption of the merge process. +- `thread_id` (UInt64) — Thread ID of the merge process. +- `merge_type` — The type of current merge. Empty if it's an mutation. +- `merge_algorithm` — The algorithm used in current merge. Empty if it's an mutation. diff --git a/docs/en/operations/system-tables/metric_log.md b/docs/en/operations/system-tables/metric_log.md index b22e672a31b..9ea0dde3f80 100644 --- a/docs/en/operations/system-tables/metric_log.md +++ b/docs/en/operations/system-tables/metric_log.md @@ -6,9 +6,9 @@ slug: /en/operations/system-tables/metric_log Contains history of metrics values from tables `system.metrics` and `system.events`, periodically flushed to disk. Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. -- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds resolution. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds resolution. **Example** @@ -45,8 +45,8 @@ CurrentMetric_DistributedFilesToInsert: 0 **See also** -- [metric_log setting](../../operations/server-configuration-parameters/settings.md#metric_log) — Enabling and disabling the setting. -- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md) — Contains periodically calculated metrics. -- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that occurred. -- [system.metrics](../../operations/system-tables/metrics.md) — Contains instantly calculated metrics. -- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. +- [metric_log setting](../../operations/server-configuration-parameters/settings.md#metric_log) — Enabling and disabling the setting. +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md) — Contains periodically calculated metrics. +- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that occurred. +- [system.metrics](../../operations/system-tables/metrics.md) — Contains instantly calculated metrics. +- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. diff --git a/docs/en/operations/system-tables/metrics.md b/docs/en/operations/system-tables/metrics.md index 141fc3c82c2..efa6e316a59 100644 --- a/docs/en/operations/system-tables/metrics.md +++ b/docs/en/operations/system-tables/metrics.md @@ -7,9 +7,9 @@ Contains metrics which can be calculated instantly, or have a current value. For Columns: -- `metric` ([String](../../sql-reference/data-types/string.md)) — Metric name. -- `value` ([Int64](../../sql-reference/data-types/int-uint.md)) — Metric value. -- `description` ([String](../../sql-reference/data-types/string.md)) — Metric description. +- `metric` ([String](../../sql-reference/data-types/string.md)) — Metric name. +- `value` ([Int64](../../sql-reference/data-types/int-uint.md)) — Metric value. +- `description` ([String](../../sql-reference/data-types/string.md)) — Metric description. The list of supported metrics you can find in the [src/Common/CurrentMetrics.cpp](https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/CurrentMetrics.cpp) source file of ClickHouse. @@ -36,7 +36,7 @@ SELECT * FROM system.metrics LIMIT 10 **See Also** -- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. -- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that occurred. -- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` and `system.events`. -- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — Contains periodically calculated metrics. +- [system.events](../../operations/system-tables/events.md#system_tables-events) — Contains a number of events that occurred. +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — Contains a history of metrics values from tables `system.metrics` and `system.events`. +- [Monitoring](../../operations/monitoring.md) — Base concepts of ClickHouse monitoring. diff --git a/docs/en/operations/system-tables/moves.md b/docs/en/operations/system-tables/moves.md index 54f07540507..cd543ce7536 100644 --- a/docs/en/operations/system-tables/moves.md +++ b/docs/en/operations/system-tables/moves.md @@ -7,21 +7,21 @@ The table contains information about in-progress [data part moves](/docs/en/sql- Columns: -- `database` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the database. +- `database` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the database. -- `table` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the table containing moving data part. +- `table` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the table containing moving data part. -- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — Time elapsed (in seconds) since data part movement started. +- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — Time elapsed (in seconds) since data part movement started. -- `target_disk_name` ([String](disks.md)) — Name of [disk](/docs/en/operations/system-tables/disks/) to which the data part is moving. +- `target_disk_name` ([String](disks.md)) — Name of [disk](/docs/en/operations/system-tables/disks/) to which the data part is moving. -- `target_disk_path` ([String](disks.md)) — Path to the mount point of the [disk](/docs/en/operations/system-tables/disks/) in the file system. +- `target_disk_path` ([String](disks.md)) — Path to the mount point of the [disk](/docs/en/operations/system-tables/disks/) in the file system. -- `part_name` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the data part being moved. +- `part_name` ([String](/docs/en/sql-reference/data-types/string.md)) — Name of the data part being moved. -- `part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Data part size. +- `part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Data part size. -- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Identifier of a thread performing the movement. +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Identifier of a thread performing the movement. **Example** @@ -37,6 +37,6 @@ SELECT * FROM system.moves **See Also** -- [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) table engine -- [Using Multiple Block Devices for Data Storage](/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes) -- [ALTER TABLE ... MOVE PART](/docs/en/sql-reference/statements/alter/partition#move-partitionpart) command +- [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) table engine +- [Using Multiple Block Devices for Data Storage](/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes) +- [ALTER TABLE ... MOVE PART](/docs/en/sql-reference/statements/alter/partition#move-partitionpart) command diff --git a/docs/en/operations/system-tables/mutations.md b/docs/en/operations/system-tables/mutations.md index e6d1eafb9b4..64e86992af9 100644 --- a/docs/en/operations/system-tables/mutations.md +++ b/docs/en/operations/system-tables/mutations.md @@ -7,29 +7,29 @@ The table contains information about [mutations](/docs/en/sql-reference/statemen ## Columns: -- `database` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the database to which the mutation was applied. +- `database` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the database to which the mutation was applied. -- `table` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the table to which the mutation was applied. +- `table` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the table to which the mutation was applied. -- `mutation_id` ([String](/docs/en/sql-reference/data-types/string.md)) — The ID of the mutation. For replicated tables these IDs correspond to znode names in the `/mutations/` directory in ClickHouse Keeper. For non-replicated tables the IDs correspond to file names in the data directory of the table. +- `mutation_id` ([String](/docs/en/sql-reference/data-types/string.md)) — The ID of the mutation. For replicated tables these IDs correspond to znode names in the `/mutations/` directory in ClickHouse Keeper. For non-replicated tables the IDs correspond to file names in the data directory of the table. -- `command` ([String](/docs/en/sql-reference/data-types/string.md)) — The mutation command string (the part of the query after `ALTER TABLE [db.]table`). +- `command` ([String](/docs/en/sql-reference/data-types/string.md)) — The mutation command string (the part of the query after `ALTER TABLE [db.]table`). -- `create_time` ([DateTime](/docs/en/sql-reference/data-types/datetime.md)) — Date and time when the mutation command was submitted for execution. +- `create_time` ([DateTime](/docs/en/sql-reference/data-types/datetime.md)) — Date and time when the mutation command was submitted for execution. -- `block_numbers.partition_id` ([Array](/docs/en/sql-reference/data-types/array.md)([String](/docs/en/sql-reference/data-types/string.md))) — For mutations of replicated tables, the array contains the partitions' IDs (one record for each partition). For mutations of non-replicated tables the array is empty. +- `block_numbers.partition_id` ([Array](/docs/en/sql-reference/data-types/array.md)([String](/docs/en/sql-reference/data-types/string.md))) — For mutations of replicated tables, the array contains the partitions' IDs (one record for each partition). For mutations of non-replicated tables the array is empty. -- `block_numbers.number` ([Array](/docs/en/sql-reference/data-types/array.md)([Int64](/docs/en/sql-reference/data-types/int-uint.md))) — For mutations of replicated tables, the array contains one record for each partition, with the block number that was acquired by the mutation. Only parts that contain blocks with numbers less than this number will be mutated in the partition. +- `block_numbers.number` ([Array](/docs/en/sql-reference/data-types/array.md)([Int64](/docs/en/sql-reference/data-types/int-uint.md))) — For mutations of replicated tables, the array contains one record for each partition, with the block number that was acquired by the mutation. Only parts that contain blocks with numbers less than this number will be mutated in the partition. In non-replicated tables, block numbers in all partitions form a single sequence. This means that for mutations of non-replicated tables, the column will contain one record with a single block number acquired by the mutation. -- `parts_to_do_names` ([Array](/docs/en/sql-reference/data-types/array.md)([String](/docs/en/sql-reference/data-types/string.md))) — An array of names of data parts that need to be mutated for the mutation to complete. +- `parts_to_do_names` ([Array](/docs/en/sql-reference/data-types/array.md)([String](/docs/en/sql-reference/data-types/string.md))) — An array of names of data parts that need to be mutated for the mutation to complete. -- `parts_to_do` ([Int64](/docs/en/sql-reference/data-types/int-uint.md)) — The number of data parts that need to be mutated for the mutation to complete. +- `parts_to_do` ([Int64](/docs/en/sql-reference/data-types/int-uint.md)) — The number of data parts that need to be mutated for the mutation to complete. -- `is_done` ([UInt8](/docs/en/sql-reference/data-types/int-uint.md)) — The flag whether the mutation is done or not. Possible values: - - `1` if the mutation is completed, - - `0` if the mutation is still in process. +- `is_done` ([UInt8](/docs/en/sql-reference/data-types/int-uint.md)) — The flag whether the mutation is done or not. Possible values: + - `1` if the mutation is completed, + - `0` if the mutation is still in process. :::note Even if `parts_to_do = 0` it is possible that a mutation of a replicated table is not completed yet because of a long-running `INSERT` query, that will create a new data part needed to be mutated. @@ -37,11 +37,11 @@ Even if `parts_to_do = 0` it is possible that a mutation of a replicated table i If there were problems with mutating some data parts, the following columns contain additional information: -- `latest_failed_part` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the most recent part that could not be mutated. +- `latest_failed_part` ([String](/docs/en/sql-reference/data-types/string.md)) — The name of the most recent part that could not be mutated. -- `latest_fail_time` ([DateTime](/docs/en/sql-reference/data-types/datetime.md)) — The date and time of the most recent part mutation failure. +- `latest_fail_time` ([DateTime](/docs/en/sql-reference/data-types/datetime.md)) — The date and time of the most recent part mutation failure. -- `latest_fail_reason` ([String](/docs/en/sql-reference/data-types/string.md)) — The exception message that caused the most recent part mutation failure. +- `latest_fail_reason` ([String](/docs/en/sql-reference/data-types/string.md)) — The exception message that caused the most recent part mutation failure. ## Monitoring Mutations @@ -58,6 +58,6 @@ replace `tmp` in `table='tmp'` with the name of the table that you are checking **See Also** -- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) -- [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) table engine -- [ReplicatedMergeTree](/docs/en/engines/table-engines/mergetree-family/replication.md) family +- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) +- [MergeTree](/docs/en/engines/table-engines/mergetree-family/mergetree.md) table engine +- [ReplicatedMergeTree](/docs/en/engines/table-engines/mergetree-family/replication.md) family diff --git a/docs/en/operations/system-tables/opentelemetry_span_log.md b/docs/en/operations/system-tables/opentelemetry_span_log.md index 7d7d1ef1b04..a605a46c14c 100644 --- a/docs/en/operations/system-tables/opentelemetry_span_log.md +++ b/docs/en/operations/system-tables/opentelemetry_span_log.md @@ -7,30 +7,30 @@ Contains information about [trace spans](https://opentracing.io/docs/overview/sp Columns: -- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID of the trace for executed query. +- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — ID of the trace for executed query. -- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the `trace span`. +- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the `trace span`. -- `parent_span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the parent `trace span`. +- `parent_span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the parent `trace span`. -- `operation_name` ([String](../../sql-reference/data-types/string.md)) — The name of the operation. +- `operation_name` ([String](../../sql-reference/data-types/string.md)) — The name of the operation. -- `kind` ([Enum8](../../sql-reference/data-types/enum.md)) — The [SpanKind](https://opentelemetry.io/docs/reference/specification/trace/api/#spankind) of the span. - - `INTERNAL` — Indicates that the span represents an internal operation within an application. - - `SERVER` — Indicates that the span covers server-side handling of a synchronous RPC or other remote request. - - `CLIENT` — Indicates that the span describes a request to some remote service. - - `PRODUCER` — Indicates that the span describes the initiators of an asynchronous request. This parent span will often end before the corresponding child CONSUMER span, possibly even before the child span starts. - - `CONSUMER` - Indicates that the span describes a child of an asynchronous PRODUCER request. +- `kind` ([Enum8](../../sql-reference/data-types/enum.md)) — The [SpanKind](https://opentelemetry.io/docs/reference/specification/trace/api/#spankind) of the span. + - `INTERNAL` — Indicates that the span represents an internal operation within an application. + - `SERVER` — Indicates that the span covers server-side handling of a synchronous RPC or other remote request. + - `CLIENT` — Indicates that the span describes a request to some remote service. + - `PRODUCER` — Indicates that the span describes the initiators of an asynchronous request. This parent span will often end before the corresponding child CONSUMER span, possibly even before the child span starts. + - `CONSUMER` - Indicates that the span describes a child of an asynchronous PRODUCER request. -- `start_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The start time of the `trace span` (in microseconds). +- `start_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The start time of the `trace span` (in microseconds). -- `finish_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The finish time of the `trace span` (in microseconds). +- `finish_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The finish time of the `trace span` (in microseconds). -- `finish_date` ([Date](../../sql-reference/data-types/date.md)) — The finish date of the `trace span`. +- `finish_date` ([Date](../../sql-reference/data-types/date.md)) — The finish date of the `trace span`. -- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — [Attribute](https://opentelemetry.io/docs/go/instrumentation/#attributes) names depending on the `trace span`. They are filled in according to the recommendations in the [OpenTelemetry](https://opentelemetry.io/) standard. +- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — [Attribute](https://opentelemetry.io/docs/go/instrumentation/#attributes) names depending on the `trace span`. They are filled in according to the recommendations in the [OpenTelemetry](https://opentelemetry.io/) standard. -- `attribute.values` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Attribute values depending on the `trace span`. They are filled in according to the recommendations in the `OpenTelemetry` standard. +- `attribute.values` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Attribute values depending on the `trace span`. They are filled in according to the recommendations in the `OpenTelemetry` standard. **Example** @@ -59,4 +59,4 @@ attribute.values: [] **See Also** -- [OpenTelemetry](../../operations/opentelemetry.md) +- [OpenTelemetry](../../operations/opentelemetry.md) diff --git a/docs/en/operations/system-tables/part_log.md b/docs/en/operations/system-tables/part_log.md index 8ccde889289..c9e34962c79 100644 --- a/docs/en/operations/system-tables/part_log.md +++ b/docs/en/operations/system-tables/part_log.md @@ -9,41 +9,41 @@ This table contains information about events that occurred with [data parts](../ The `system.part_log` table contains the following columns: -- `query_id` ([String](../../sql-reference/data-types/string.md)) — Identifier of the `INSERT` query that created this data part. -- `event_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of the event that occurred with the data part. Can have one of the following values: - - `NEW_PART` — Inserting of a new data part. - - `MERGE_PARTS` — Merging of data parts. - - `DOWNLOAD_PART` — Downloading a data part. - - `REMOVE_PART` — Removing or detaching a data part using [DETACH PARTITION](../../sql-reference/statements/alter/partition.md#alter_detach-partition). - - `MUTATE_PART` — Mutating of a data part. - - `MOVE_PART` — Moving the data part from the one disk to another one. -- `merge_reason` ([Enum8](../../sql-reference/data-types/enum.md)) — The reason for the event with type `MERGE_PARTS`. Can have one of the following values: - - `NOT_A_MERGE` — The current event has the type other than `MERGE_PARTS`. - - `REGULAR_MERGE` — Some regular merge. - - `TTL_DELETE_MERGE` — Cleaning up expired data. - - `TTL_RECOMPRESS_MERGE` — Recompressing data part with the. -- `merge_algorithm` ([Enum8](../../sql-reference/data-types/enum.md)) — Merge algorithm for the event with type `MERGE_PARTS`. Can have one of the following values: - - `UNDECIDED` - - `HORIZONTAL` - - `VERTICAL` -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. -- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds precision. -- `duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Duration. -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database the data part is in. -- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table the data part is in. -- `part_name` ([String](../../sql-reference/data-types/string.md)) — Name of the data part. -- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition that the data part was inserted to. The column takes the `all` value if the partitioning is by `tuple()`. -- `path_on_disk` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the folder with data part files. -- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows in the data part. -- `size_in_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of the data part in bytes. -- `merged_from` ([Array(String)](../../sql-reference/data-types/array.md)) — An array of names of the parts which the current part was made up from (after the merge). -- `bytes_uncompressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of uncompressed bytes. -- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows was read during the merge. -- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes was read during the merge. -- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this thread. -- `error` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The code number of the occurred error. -- `exception` ([String](../../sql-reference/data-types/string.md)) — Text message of the occurred error. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — Identifier of the `INSERT` query that created this data part. +- `event_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of the event that occurred with the data part. Can have one of the following values: + - `NEW_PART` — Inserting of a new data part. + - `MERGE_PARTS` — Merging of data parts. + - `DOWNLOAD_PART` — Downloading a data part. + - `REMOVE_PART` — Removing or detaching a data part using [DETACH PARTITION](../../sql-reference/statements/alter/partition.md#alter_detach-partition). + - `MUTATE_PART` — Mutating of a data part. + - `MOVE_PART` — Moving the data part from the one disk to another one. +- `merge_reason` ([Enum8](../../sql-reference/data-types/enum.md)) — The reason for the event with type `MERGE_PARTS`. Can have one of the following values: + - `NOT_A_MERGE` — The current event has the type other than `MERGE_PARTS`. + - `REGULAR_MERGE` — Some regular merge. + - `TTL_DELETE_MERGE` — Cleaning up expired data. + - `TTL_RECOMPRESS_MERGE` — Recompressing data part with the. +- `merge_algorithm` ([Enum8](../../sql-reference/data-types/enum.md)) — Merge algorithm for the event with type `MERGE_PARTS`. Can have one of the following values: + - `UNDECIDED` + - `HORIZONTAL` + - `VERTICAL` +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Event date. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Event time. +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Event time with microseconds precision. +- `duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Duration. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database the data part is in. +- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table the data part is in. +- `part_name` ([String](../../sql-reference/data-types/string.md)) — Name of the data part. +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition that the data part was inserted to. The column takes the `all` value if the partitioning is by `tuple()`. +- `path_on_disk` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the folder with data part files. +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows in the data part. +- `size_in_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of the data part in bytes. +- `merged_from` ([Array(String)](../../sql-reference/data-types/array.md)) — An array of names of the parts which the current part was made up from (after the merge). +- `bytes_uncompressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Size of uncompressed bytes. +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows was read during the merge. +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes was read during the merge. +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this thread. +- `error` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The code number of the occurred error. +- `exception` ([String](../../sql-reference/data-types/string.md)) — Text message of the occurred error. The `system.part_log` table is created after the first inserting data to the `MergeTree` table. diff --git a/docs/en/operations/system-tables/parts.md b/docs/en/operations/system-tables/parts.md index e7700562e35..e61c6ed2ba4 100644 --- a/docs/en/operations/system-tables/parts.md +++ b/docs/en/operations/system-tables/parts.md @@ -9,107 +9,107 @@ Each row describes one data part. Columns: -- `partition` ([String](../../sql-reference/data-types/string.md)) – The partition name. To learn what a partition is, see the description of the [ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) query. +- `partition` ([String](../../sql-reference/data-types/string.md)) – The partition name. To learn what a partition is, see the description of the [ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) query. Formats: - - `YYYYMM` for automatic partitioning by month. - - `any_string` when partitioning manually. + - `YYYYMM` for automatic partitioning by month. + - `any_string` when partitioning manually. -- `name` ([String](../../sql-reference/data-types/string.md)) – Name of the data part. +- `name` ([String](../../sql-reference/data-types/string.md)) – Name of the data part. -- `part_type` ([String](../../sql-reference/data-types/string.md)) — The data part storing format. +- `part_type` ([String](../../sql-reference/data-types/string.md)) — The data part storing format. Possible Values: - - `Wide` — Each column is stored in a separate file in a filesystem. - - `Compact` — All columns are stored in one file in a filesystem. + - `Wide` — Each column is stored in a separate file in a filesystem. + - `Compact` — All columns are stored in one file in a filesystem. Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. - - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) – Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. + - `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) – Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. -- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The number of marks. To get the approximate number of rows in a data part, multiply `marks` by the index granularity (usually 8192) (this hint does not work for adaptive granularity). +- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The number of marks. To get the approximate number of rows in a data part, multiply `marks` by the index granularity (usually 8192) (this hint does not work for adaptive granularity). -- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The number of rows. +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The number of rows. -- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of all the data part files in bytes. +- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of all the data part files in bytes. -- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of compressed data in the data part. All the auxiliary files (for example, files with marks) are not included. +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of compressed data in the data part. All the auxiliary files (for example, files with marks) are not included. -- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of uncompressed data in the data part. All the auxiliary files (for example, files with marks) are not included. +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of uncompressed data in the data part. All the auxiliary files (for example, files with marks) are not included. -- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The size of the file with marks. +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The size of the file with marks. -- `secondary_indices_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of compressed data for secondary indices in the data part. All the auxiliary files (for example, files with marks) are not included. +- `secondary_indices_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of compressed data for secondary indices in the data part. All the auxiliary files (for example, files with marks) are not included. -- `secondary_indices_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of uncompressed data for secondary indices in the data part. All the auxiliary files (for example, files with marks) are not included. +- `secondary_indices_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Total size of uncompressed data for secondary indices in the data part. All the auxiliary files (for example, files with marks) are not included. -- `secondary_indices_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The size of the file with marks for secondary indices. +- `secondary_indices_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The size of the file with marks for secondary indices. -- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The time the directory with the data part was modified. This usually corresponds to the time of data part creation. +- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The time the directory with the data part was modified. This usually corresponds to the time of data part creation. -- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The time when the data part became inactive. +- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The time when the data part became inactive. -- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) – The number of places where the data part is used. A value greater than 2 indicates that the data part is used in queries or merges. +- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) – The number of places where the data part is used. A value greater than 2 indicates that the data part is used in queries or merges. -- `min_date` ([Date](../../sql-reference/data-types/date.md)) – The minimum value of the date key in the data part. +- `min_date` ([Date](../../sql-reference/data-types/date.md)) – The minimum value of the date key in the data part. -- `max_date` ([Date](../../sql-reference/data-types/date.md)) – The maximum value of the date key in the data part. +- `max_date` ([Date](../../sql-reference/data-types/date.md)) – The maximum value of the date key in the data part. -- `min_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The minimum value of the date and time key in the data part. +- `min_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – The minimum value of the date and time key in the data part. -- `max_time`([DateTime](../../sql-reference/data-types/datetime.md)) – The maximum value of the date and time key in the data part. +- `max_time`([DateTime](../../sql-reference/data-types/datetime.md)) – The maximum value of the date and time key in the data part. -- `partition_id` ([String](../../sql-reference/data-types/string.md)) – ID of the partition. +- `partition_id` ([String](../../sql-reference/data-types/string.md)) – ID of the partition. -- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The minimum number of data parts that make up the current part after merging. +- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The minimum number of data parts that make up the current part after merging. -- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The maximum number of data parts that make up the current part after merging. +- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The maximum number of data parts that make up the current part after merging. -- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) – Depth of the merge tree. Zero means that the current part was created by insert rather than by merging other parts. +- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) – Depth of the merge tree. Zero means that the current part was created by insert rather than by merging other parts. -- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Number that is used to determine which mutations should be applied to the data part (mutations with a version higher than `data_version`). +- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Number that is used to determine which mutations should be applied to the data part (mutations with a version higher than `data_version`). -- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The amount of memory (in bytes) used by primary key values. +- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The amount of memory (in bytes) used by primary key values. -- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The amount of memory (in bytes) reserved for primary key values. +- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) – The amount of memory (in bytes) reserved for primary key values. -- `is_frozen` ([UInt8](../../sql-reference/data-types/int-uint.md)) – Flag that shows that a partition data backup exists. 1, the backup exists. 0, the backup does not exist. For more details, see [FREEZE PARTITION](../../sql-reference/statements/alter/partition.md/#alter_freeze-partition) +- `is_frozen` ([UInt8](../../sql-reference/data-types/int-uint.md)) – Flag that shows that a partition data backup exists. 1, the backup exists. 0, the backup does not exist. For more details, see [FREEZE PARTITION](../../sql-reference/statements/alter/partition.md/#alter_freeze-partition) -- `database` ([String](../../sql-reference/data-types/string.md)) – Name of the database. +- `database` ([String](../../sql-reference/data-types/string.md)) – Name of the database. -- `table` ([String](../../sql-reference/data-types/string.md)) – Name of the table. +- `table` ([String](../../sql-reference/data-types/string.md)) – Name of the table. -- `engine` ([String](../../sql-reference/data-types/string.md)) – Name of the table engine without parameters. +- `engine` ([String](../../sql-reference/data-types/string.md)) – Name of the table engine without parameters. -- `path` ([String](../../sql-reference/data-types/string.md)) – Absolute path to the folder with data part files. +- `path` ([String](../../sql-reference/data-types/string.md)) – Absolute path to the folder with data part files. -- `disk_name` ([String](../../sql-reference/data-types/string.md)) – Name of a disk that stores the data part. +- `disk_name` ([String](../../sql-reference/data-types/string.md)) – Name of a disk that stores the data part. -- `hash_of_all_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of compressed files. +- `hash_of_all_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of compressed files. -- `hash_of_uncompressed_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of uncompressed files (files with marks, index file etc.). +- `hash_of_uncompressed_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of uncompressed files (files with marks, index file etc.). -- `uncompressed_hash_of_compressed_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of data in the compressed files as if they were uncompressed. +- `uncompressed_hash_of_compressed_files` ([String](../../sql-reference/data-types/string.md)) – [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128) of data in the compressed files as if they were uncompressed. -- `delete_ttl_info_min` ([DateTime](../../sql-reference/data-types/datetime.md)) — The minimum value of the date and time key for [TTL DELETE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). +- `delete_ttl_info_min` ([DateTime](../../sql-reference/data-types/datetime.md)) — The minimum value of the date and time key for [TTL DELETE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). -- `delete_ttl_info_max` ([DateTime](../../sql-reference/data-types/datetime.md)) — The maximum value of the date and time key for [TTL DELETE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). +- `delete_ttl_info_max` ([DateTime](../../sql-reference/data-types/datetime.md)) — The maximum value of the date and time key for [TTL DELETE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). -- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of expressions. Each expression defines a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). +- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Array of expressions. Each expression defines a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). :::note The `move_ttl_info.expression` array is kept mostly for backward compatibility, now the simpliest way to check `TTL MOVE` rule is to use the `move_ttl_info.min` and `move_ttl_info.max` fields. ::: -- `move_ttl_info.min` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — Array of date and time values. Each element describes the minimum key value for a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). +- `move_ttl_info.min` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — Array of date and time values. Each element describes the minimum key value for a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). -- `move_ttl_info.max` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — Array of date and time values. Each element describes the maximum key value for a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). +- `move_ttl_info.max` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — Array of date and time values. Each element describes the maximum key value for a [TTL MOVE rule](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl). -- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Alias for `bytes_on_disk`. +- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Alias for `bytes_on_disk`. -- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Alias for `marks_bytes`. +- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) – Alias for `marks_bytes`. **Example** @@ -165,5 +165,5 @@ move_ttl_info.max: [] **See Also** -- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) -- [TTL for Columns and Tables](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl) +- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) +- [TTL for Columns and Tables](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl) diff --git a/docs/en/operations/system-tables/parts_columns.md b/docs/en/operations/system-tables/parts_columns.md index d389d5bbb29..00d7164af59 100644 --- a/docs/en/operations/system-tables/parts_columns.md +++ b/docs/en/operations/system-tables/parts_columns.md @@ -9,93 +9,93 @@ Each row describes one data part. Columns: -- `partition` ([String](../../sql-reference/data-types/string.md)) — The partition name. To learn what a partition is, see the description of the [ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) query. +- `partition` ([String](../../sql-reference/data-types/string.md)) — The partition name. To learn what a partition is, see the description of the [ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) query. Formats: - - `YYYYMM` for automatic partitioning by month. - - `any_string` when partitioning manually. + - `YYYYMM` for automatic partitioning by month. + - `any_string` when partitioning manually. -- `name` ([String](../../sql-reference/data-types/string.md)) — Name of the data part. +- `name` ([String](../../sql-reference/data-types/string.md)) — Name of the data part. -- `part_type` ([String](../../sql-reference/data-types/string.md)) — The data part storing format. +- `part_type` ([String](../../sql-reference/data-types/string.md)) — The data part storing format. Possible values: - - `Wide` — Each column is stored in a separate file in a filesystem. - - `Compact` — All columns are stored in one file in a filesystem. + - `Wide` — Each column is stored in a separate file in a filesystem. + - `Compact` — All columns are stored in one file in a filesystem. Data storing format is controlled by the `min_bytes_for_wide_part` and `min_rows_for_wide_part` settings of the [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) table. -- `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. +- `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the data part is active. If a data part is active, it’s used in a table. Otherwise, it’s deleted. Inactive data parts remain after merging. -- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of marks. To get the approximate number of rows in a data part, multiply `marks` by the index granularity (usually 8192) (this hint does not work for adaptive granularity). +- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of marks. To get the approximate number of rows in a data part, multiply `marks` by the index granularity (usually 8192) (this hint does not work for adaptive granularity). -- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows. +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows. -- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of all the data part files in bytes. +- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of all the data part files in bytes. -- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of compressed data in the data part. All the auxiliary files (for example, files with marks) are not included. +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of compressed data in the data part. All the auxiliary files (for example, files with marks) are not included. -- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of uncompressed data in the data part. All the auxiliary files (for example, files with marks) are not included. +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of uncompressed data in the data part. All the auxiliary files (for example, files with marks) are not included. -- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of the file with marks. +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of the file with marks. -- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time the directory with the data part was modified. This usually corresponds to the time of data part creation. +- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time the directory with the data part was modified. This usually corresponds to the time of data part creation. -- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time when the data part became inactive. +- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The time when the data part became inactive. -- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of places where the data part is used. A value greater than 2 indicates that the data part is used in queries or merges. +- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of places where the data part is used. A value greater than 2 indicates that the data part is used in queries or merges. -- `min_date` ([Date](../../sql-reference/data-types/date.md)) — The minimum value of the date key in the data part. +- `min_date` ([Date](../../sql-reference/data-types/date.md)) — The minimum value of the date key in the data part. -- `max_date` ([Date](../../sql-reference/data-types/date.md)) — The maximum value of the date key in the data part. +- `max_date` ([Date](../../sql-reference/data-types/date.md)) — The maximum value of the date key in the data part. -- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition. +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition. -- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The minimum number of data parts that make up the current part after merging. +- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The minimum number of data parts that make up the current part after merging. -- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The maximum number of data parts that make up the current part after merging. +- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The maximum number of data parts that make up the current part after merging. -- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Depth of the merge tree. Zero means that the current part was created by insert rather than by merging other parts. +- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Depth of the merge tree. Zero means that the current part was created by insert rather than by merging other parts. -- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number that is used to determine which mutations should be applied to the data part (mutations with a version higher than `data_version`). +- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number that is used to determine which mutations should be applied to the data part (mutations with a version higher than `data_version`). -- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The amount of memory (in bytes) used by primary key values. +- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The amount of memory (in bytes) used by primary key values. -- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The amount of memory (in bytes) reserved for primary key values. +- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The amount of memory (in bytes) reserved for primary key values. -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. -- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. +- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. -- `engine` ([String](../../sql-reference/data-types/string.md)) — Name of the table engine without parameters. +- `engine` ([String](../../sql-reference/data-types/string.md)) — Name of the table engine without parameters. -- `disk_name` ([String](../../sql-reference/data-types/string.md)) — Name of a disk that stores the data part. +- `disk_name` ([String](../../sql-reference/data-types/string.md)) — Name of a disk that stores the data part. -- `path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the folder with data part files. +- `path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the folder with data part files. -- `column` ([String](../../sql-reference/data-types/string.md)) — Name of the column. +- `column` ([String](../../sql-reference/data-types/string.md)) — Name of the column. -- `type` ([String](../../sql-reference/data-types/string.md)) — Column type. +- `type` ([String](../../sql-reference/data-types/string.md)) — Column type. -- `column_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. +- `column_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Ordinal position of a column in a table starting with 1. -- `default_kind` ([String](../../sql-reference/data-types/string.md)) — Expression type (`DEFAULT`, `MATERIALIZED`, `ALIAS`) for the default value, or an empty string if it is not defined. +- `default_kind` ([String](../../sql-reference/data-types/string.md)) — Expression type (`DEFAULT`, `MATERIALIZED`, `ALIAS`) for the default value, or an empty string if it is not defined. -- `default_expression` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. +- `default_expression` ([String](../../sql-reference/data-types/string.md)) — Expression for the default value, or an empty string if it is not defined. -- `column_bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of the column in bytes. +- `column_bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of the column in bytes. -- `column_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of compressed data in the column, in bytes. +- `column_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of compressed data in the column, in bytes. -- `column_data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of the decompressed data in the column, in bytes. +- `column_data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Total size of the decompressed data in the column, in bytes. -- `column_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of the column with marks, in bytes. +- `column_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The size of the column with marks, in bytes. -- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Alias for `bytes_on_disk`. +- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Alias for `bytes_on_disk`. -- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Alias for `marks_bytes`. +- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Alias for `marks_bytes`. **Example** @@ -146,4 +146,4 @@ column_marks_bytes: 48 **See Also** -- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) +- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) diff --git a/docs/en/operations/system-tables/processes.md b/docs/en/operations/system-tables/processes.md index 76219813ad7..2e729920ed0 100644 --- a/docs/en/operations/system-tables/processes.md +++ b/docs/en/operations/system-tables/processes.md @@ -7,17 +7,17 @@ This system table is used for implementing the `SHOW PROCESSLIST` query. Columns: -- `user` (String) – The user who made the query. Keep in mind that for distributed processing, queries are sent to remote servers under the `default` user. The field contains the username for a specific query, not for a query that this query initiated. -- `address` (String) – The IP address the request was made from. The same for distributed processing. To track where a distributed query was originally made from, look at `system.processes` on the query requestor server. -- `elapsed` (Float64) – The time in seconds since request execution started. -- `rows_read` (UInt64) – The number of rows read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. -- `bytes_read` (UInt64) – The number of uncompressed bytes read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. -- `total_rows_approx` (UInt64) – The approximation of the total number of rows that should be read. For distributed processing, on the requestor server, this is the total for all remote servers. It can be updated during request processing, when new sources to process become known. -- `memory_usage` (UInt64) – Amount of RAM the request uses. It might not include some types of dedicated memory. See the [max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) setting. -- `query` (String) – The query text. For `INSERT`, it does not include the data to insert. -- `query_id` (String) – Query ID, if defined. -- `is_cancelled` (Int8) – Was query cancelled. -- `is_all_data_sent` (Int8) – Was all data sent to the client (in other words query had been finished on the server). +- `user` (String) – The user who made the query. Keep in mind that for distributed processing, queries are sent to remote servers under the `default` user. The field contains the username for a specific query, not for a query that this query initiated. +- `address` (String) – The IP address the request was made from. The same for distributed processing. To track where a distributed query was originally made from, look at `system.processes` on the query requestor server. +- `elapsed` (Float64) – The time in seconds since request execution started. +- `rows_read` (UInt64) – The number of rows read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. +- `bytes_read` (UInt64) – The number of uncompressed bytes read from the table. For distributed processing, on the requestor server, this is the total for all remote servers. +- `total_rows_approx` (UInt64) – The approximation of the total number of rows that should be read. For distributed processing, on the requestor server, this is the total for all remote servers. It can be updated during request processing, when new sources to process become known. +- `memory_usage` (UInt64) – Amount of RAM the request uses. It might not include some types of dedicated memory. See the [max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) setting. +- `query` (String) – The query text. For `INSERT`, it does not include the data to insert. +- `query_id` (String) – Query ID, if defined. +- `is_cancelled` (Int8) – Was query cancelled. +- `is_all_data_sent` (Int8) – Was all data sent to the client (in other words query had been finished on the server). ```sql SELECT * FROM system.processes LIMIT 10 FORMAT Vertical; diff --git a/docs/en/operations/system-tables/processors_profile_log.md b/docs/en/operations/system-tables/processors_profile_log.md index a2e7a9ebabd..1eb7dc4b1d2 100644 --- a/docs/en/operations/system-tables/processors_profile_log.md +++ b/docs/en/operations/system-tables/processors_profile_log.md @@ -4,21 +4,21 @@ This table contains profiling on processors level (that you can find in [`EXPLAI Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened. -- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened. -- `id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of processor -- `parent_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Parent processors IDs -- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query -- `name` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — Name of the processor. -- `elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was executed. -- `input_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was waiting for data (from other processor). -- `output_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was waiting because output port was full. -- `plan_step` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the query plan step which created this processor. The value is zero if the processor was not added from any step. -- `plan_group` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Group of the processor if it was created by query plan step. A group is a logical partitioning of processors added from the same query plan step. Group is used only for beautifying the result of EXPLAIN PIPELINE result. -- `input_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows consumed by processor. -- `input_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes consumed by processor. -- `output_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows generated by processor. -- `output_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes generated by processor. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened. +- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened. +- `id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of processor +- `parent_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Parent processors IDs +- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query +- `name` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — Name of the processor. +- `elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was executed. +- `input_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was waiting for data (from other processor). +- `output_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of microseconds this processor was waiting because output port was full. +- `plan_step` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ID of the query plan step which created this processor. The value is zero if the processor was not added from any step. +- `plan_group` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Group of the processor if it was created by query plan step. A group is a logical partitioning of processors added from the same query plan step. Group is used only for beautifying the result of EXPLAIN PIPELINE result. +- `input_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows consumed by processor. +- `input_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes consumed by processor. +- `output_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of rows generated by processor. +- `output_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of bytes generated by processor. **Example** Query: @@ -73,4 +73,4 @@ Here you can see: **See Also** -- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) \ No newline at end of file +- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) \ No newline at end of file diff --git a/docs/en/operations/system-tables/query_log.md b/docs/en/operations/system-tables/query_log.md index a04214f6488..42247e6fba2 100644 --- a/docs/en/operations/system-tables/query_log.md +++ b/docs/en/operations/system-tables/query_log.md @@ -34,82 +34,82 @@ You can use the [log_formatted_queries](../../operations/settings/settings.md#se Columns: -- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of an event that occurred when executing the query. Values: - - `'QueryStart' = 1` — Successful start of query execution. - - `'QueryFinish' = 2` — Successful end of query execution. - - `'ExceptionBeforeStart' = 3` — Exception before the start of query execution. - - `'ExceptionWhileProcessing' = 4` — Exception during the query execution. -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Query starting date. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query starting time. -- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query starting time with microseconds precision. -- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time of query execution. -- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Start time of query execution with microsecond precision. -- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of query execution in milliseconds. -- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Total number of rows read from all tables and table functions participated in query. It includes usual subqueries, subqueries for `IN` and `JOIN`. For distributed queries `read_rows` includes the total number of rows read at all replicas. Each replica sends it’s `read_rows` value, and the server-initiator of the query summarizes all received and local values. The cache volumes do not affect this value. -- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Total number of bytes read from all tables and table functions participated in query. It includes usual subqueries, subqueries for `IN` and `JOIN`. For distributed queries `read_bytes` includes the total number of rows read at all replicas. Each replica sends it’s `read_bytes` value, and the server-initiator of the query summarizes all received and local values. The cache volumes do not affect this value. -- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written rows. For other queries, the column value is 0. -- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written bytes. For other queries, the column value is 0. -- `result_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of rows in a result of the `SELECT` query, or a number of rows in the `INSERT` query. -- `result_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — RAM volume in bytes used to store a query result. -- `memory_usage` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Memory consumption by the query. -- `current_database` ([String](../../sql-reference/data-types/string.md)) — Name of the current database. -- `query` ([String](../../sql-reference/data-types/string.md)) — Query string. -- `formatted_query` ([String](../../sql-reference/data-types/string.md)) — Formatted query string. -- `normalized_query_hash` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Identical hash value without the values of literals for similar queries. -- `query_kind` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — Type of the query. -- `databases` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the databases present in the query. -- `tables` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the tables present in the query. -- `views` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the (materialized or live) views present in the query. -- `columns` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the columns present in the query. -- `projections` ([String](../../sql-reference/data-types/string.md)) — Names of the projections used during the query execution. -- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. -- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. -- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. -- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Query type. Possible values: - - 1 — Query was initiated by the client. - - 0 — Query was initiated by another query as part of distributed query execution. -- `user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who initiated the current query. -- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query. -- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that was used to make the query. -- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to make the query. -- `initial_user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who ran the initial query (for distributed query execution). -- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). -- `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that the parent query was launched from. -- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to make the parent query. -- `initial_query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Initial query starting time (for distributed query execution). -- `initial_query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Initial query starting time with microseconds precision (for distributed query execution). -- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Interface that the query was initiated from. Possible values: - - 1 — TCP. - - 2 — HTTP. -- `os_user` ([String](../../sql-reference/data-types/string.md)) — Operating system username who runs [clickhouse-client](../../interfaces/cli.md). -- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. -- `client_name` ([String](../../sql-reference/data-types/string.md)) — The [clickhouse-client](../../interfaces/cli.md) or another TCP client name. -- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Major version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Minor version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the [clickhouse-client](../../interfaces/cli.md) or another TCP client version. -- `http_method` (UInt8) — HTTP method that initiated the query. Possible values: - - 0 — The query was launched from the TCP interface. - - 1 — `GET` method was used. - - 2 — `POST` method was used. -- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — HTTP header `UserAgent` passed in the HTTP query. -- `http_referer` ([String](../../sql-reference/data-types/string.md)) — HTTP header `Referer` passed in the HTTP query (contains an absolute or partial address of the page making the query). -- `forwarded_for` ([String](../../sql-reference/data-types/string.md)) — HTTP header `X-Forwarded-For` passed in the HTTP query. -- `quota_key` ([String](../../sql-reference/data-types/string.md)) — The `quota key` specified in the [quotas](../../operations/quotas.md) setting (see `keyed`). -- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse revision. -- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics. The description of them could be found in the table [system.events](../../operations/system-tables/events.md#system_tables-events) -- `Settings` ([Map(String, String)](../../sql-reference/data-types/array.md)) — Settings that were changed when the client ran the query. To enable logging changes to settings, set the `log_query_settings` parameter to 1. -- `log_comment` ([String](../../sql-reference/data-types/string.md)) — Log comment. It can be set to arbitrary string no longer than [max_query_size](../../operations/settings/settings.md#settings-max_query_size). An empty string if it is not defined. -- `thread_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Thread ids that are participating in query execution. -- `used_aggregate_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `aggregate functions`, which were used during query execution. -- `used_aggregate_function_combinators` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `aggregate functions combinators`, which were used during query execution. -- `used_database_engines` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `database engines`, which were used during query execution. -- `used_data_type_families` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `data type families`, which were used during query execution. -- `used_dictionaries` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `dictionaries`, which were used during query execution. -- `used_formats` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `formats`, which were used during query execution. -- `used_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `functions`, which were used during query execution. -- `used_storages` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `storages`, which were used during query execution. -- `used_table_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `table functions`, which were used during query execution. +- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of an event that occurred when executing the query. Values: + - `'QueryStart' = 1` — Successful start of query execution. + - `'QueryFinish' = 2` — Successful end of query execution. + - `'ExceptionBeforeStart' = 3` — Exception before the start of query execution. + - `'ExceptionWhileProcessing' = 4` — Exception during the query execution. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Query starting date. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query starting time. +- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — Query starting time with microseconds precision. +- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time of query execution. +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Start time of query execution with microsecond precision. +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of query execution in milliseconds. +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Total number of rows read from all tables and table functions participated in query. It includes usual subqueries, subqueries for `IN` and `JOIN`. For distributed queries `read_rows` includes the total number of rows read at all replicas. Each replica sends it’s `read_rows` value, and the server-initiator of the query summarizes all received and local values. The cache volumes do not affect this value. +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Total number of bytes read from all tables and table functions participated in query. It includes usual subqueries, subqueries for `IN` and `JOIN`. For distributed queries `read_bytes` includes the total number of rows read at all replicas. Each replica sends it’s `read_bytes` value, and the server-initiator of the query summarizes all received and local values. The cache volumes do not affect this value. +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written rows. For other queries, the column value is 0. +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written bytes. For other queries, the column value is 0. +- `result_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of rows in a result of the `SELECT` query, or a number of rows in the `INSERT` query. +- `result_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — RAM volume in bytes used to store a query result. +- `memory_usage` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Memory consumption by the query. +- `current_database` ([String](../../sql-reference/data-types/string.md)) — Name of the current database. +- `query` ([String](../../sql-reference/data-types/string.md)) — Query string. +- `formatted_query` ([String](../../sql-reference/data-types/string.md)) — Formatted query string. +- `normalized_query_hash` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Identical hash value without the values of literals for similar queries. +- `query_kind` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — Type of the query. +- `databases` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the databases present in the query. +- `tables` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the tables present in the query. +- `views` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the (materialized or live) views present in the query. +- `columns` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — Names of the columns present in the query. +- `projections` ([String](../../sql-reference/data-types/string.md)) — Names of the projections used during the query execution. +- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. +- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. +- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. +- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Query type. Possible values: + - 1 — Query was initiated by the client. + - 0 — Query was initiated by another query as part of distributed query execution. +- `user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who initiated the current query. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query. +- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that was used to make the query. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to make the query. +- `initial_user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who ran the initial query (for distributed query execution). +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). +- `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that the parent query was launched from. +- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to make the parent query. +- `initial_query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Initial query starting time (for distributed query execution). +- `initial_query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Initial query starting time with microseconds precision (for distributed query execution). +- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Interface that the query was initiated from. Possible values: + - 1 — TCP. + - 2 — HTTP. +- `os_user` ([String](../../sql-reference/data-types/string.md)) — Operating system username who runs [clickhouse-client](../../interfaces/cli.md). +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. +- `client_name` ([String](../../sql-reference/data-types/string.md)) — The [clickhouse-client](../../interfaces/cli.md) or another TCP client name. +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Major version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Minor version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the [clickhouse-client](../../interfaces/cli.md) or another TCP client version. +- `http_method` (UInt8) — HTTP method that initiated the query. Possible values: + - 0 — The query was launched from the TCP interface. + - 1 — `GET` method was used. + - 2 — `POST` method was used. +- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — HTTP header `UserAgent` passed in the HTTP query. +- `http_referer` ([String](../../sql-reference/data-types/string.md)) — HTTP header `Referer` passed in the HTTP query (contains an absolute or partial address of the page making the query). +- `forwarded_for` ([String](../../sql-reference/data-types/string.md)) — HTTP header `X-Forwarded-For` passed in the HTTP query. +- `quota_key` ([String](../../sql-reference/data-types/string.md)) — The `quota key` specified in the [quotas](../../operations/quotas.md) setting (see `keyed`). +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse revision. +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics. The description of them could be found in the table [system.events](../../operations/system-tables/events.md#system_tables-events) +- `Settings` ([Map(String, String)](../../sql-reference/data-types/array.md)) — Settings that were changed when the client ran the query. To enable logging changes to settings, set the `log_query_settings` parameter to 1. +- `log_comment` ([String](../../sql-reference/data-types/string.md)) — Log comment. It can be set to arbitrary string no longer than [max_query_size](../../operations/settings/settings.md#settings-max_query_size). An empty string if it is not defined. +- `thread_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Thread ids that are participating in query execution. +- `used_aggregate_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `aggregate functions`, which were used during query execution. +- `used_aggregate_function_combinators` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `aggregate functions combinators`, which were used during query execution. +- `used_database_engines` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `database engines`, which were used during query execution. +- `used_data_type_families` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `data type families`, which were used during query execution. +- `used_dictionaries` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `dictionaries`, which were used during query execution. +- `used_formats` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `formats`, which were used during query execution. +- `used_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `functions`, which were used during query execution. +- `used_storages` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `storages`, which were used during query execution. +- `used_table_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — Canonical names of `table functions`, which were used during query execution. **Example** @@ -189,4 +189,4 @@ used_table_functions: [] **See Also** -- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. +- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. diff --git a/docs/en/operations/system-tables/query_thread_log.md b/docs/en/operations/system-tables/query_thread_log.md index d7bbaa63471..cdd23bb15db 100644 --- a/docs/en/operations/system-tables/query_thread_log.md +++ b/docs/en/operations/system-tables/query_thread_log.md @@ -18,52 +18,52 @@ You can use the [log_queries_probability](../../operations/settings/settings.md# Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the thread has finished execution of the query. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the thread has finished execution of the query. -- `event_time_microsecinds` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the thread has finished execution of the query with microseconds precision. -- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time of query execution. -- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Start time of query execution with microsecond precision. -- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of query execution. -- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read rows. -- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read bytes. -- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written rows. For other queries, the column value is 0. -- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written bytes. For other queries, the column value is 0. -- `memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The difference between the amount of allocated and freed memory in context of this thread. -- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this thread. -- `thread_name` ([String](../../sql-reference/data-types/string.md)) — Name of the thread. -- `thread_number` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Internal thread ID. -- `thread_id` ([Int32](../../sql-reference/data-types/int-uint.md)) — thread ID. -- `master_thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — OS initial ID of initial thread. -- `query` ([String](../../sql-reference/data-types/string.md)) — Query string. -- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Query type. Possible values: - - 1 — Query was initiated by the client. - - 0 — Query was initiated by another query for distributed query execution. -- `user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who initiated the current query. -- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query. -- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that was used to make the query. -- `port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — The client port that was used to make the query. -- `initial_user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who ran the initial query (for distributed query execution). -- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). -- `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that the parent query was launched from. -- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — The client port that was used to make the parent query. -- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Interface that the query was initiated from. Possible values: - - 1 — TCP. - - 2 — HTTP. -- `os_user` ([String](../../sql-reference/data-types/string.md)) — OS’s username who runs [clickhouse-client](../../interfaces/cli.md). -- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. -- `client_name` ([String](../../sql-reference/data-types/string.md)) — The [clickhouse-client](../../interfaces/cli.md) or another TCP client name. -- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Major version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Minor version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. -- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the [clickhouse-client](../../interfaces/cli.md) or another TCP client version. -- `http_method` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — HTTP method that initiated the query. Possible values: - - 0 — The query was launched from the TCP interface. - - 1 — `GET` method was used. - - 2 — `POST` method was used. -- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — The `UserAgent` header passed in the HTTP request. -- `quota_key` ([String](../../sql-reference/data-types/string.md)) — The “quota key” specified in the [quotas](../../operations/quotas.md) setting (see `keyed`). -- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse revision. -- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics for this thread. The description of them could be found in the table [system.events](#system_tables-events). +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the thread has finished execution of the query. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the thread has finished execution of the query. +- `event_time_microsecinds` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the thread has finished execution of the query with microseconds precision. +- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Start time of query execution. +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Start time of query execution with microsecond precision. +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of query execution. +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read rows. +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read bytes. +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written rows. For other queries, the column value is 0. +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — For `INSERT` queries, the number of written bytes. For other queries, the column value is 0. +- `memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The difference between the amount of allocated and freed memory in context of this thread. +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this thread. +- `thread_name` ([String](../../sql-reference/data-types/string.md)) — Name of the thread. +- `thread_number` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Internal thread ID. +- `thread_id` ([Int32](../../sql-reference/data-types/int-uint.md)) — thread ID. +- `master_thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — OS initial ID of initial thread. +- `query` ([String](../../sql-reference/data-types/string.md)) — Query string. +- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Query type. Possible values: + - 1 — Query was initiated by the client. + - 0 — Query was initiated by another query for distributed query execution. +- `user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who initiated the current query. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the query. +- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that was used to make the query. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — The client port that was used to make the query. +- `initial_user` ([String](../../sql-reference/data-types/string.md)) — Name of the user who ran the initial query (for distributed query execution). +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). +- `initial_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address that the parent query was launched from. +- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — The client port that was used to make the parent query. +- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Interface that the query was initiated from. Possible values: + - 1 — TCP. + - 2 — HTTP. +- `os_user` ([String](../../sql-reference/data-types/string.md)) — OS’s username who runs [clickhouse-client](../../interfaces/cli.md). +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. +- `client_name` ([String](../../sql-reference/data-types/string.md)) — The [clickhouse-client](../../interfaces/cli.md) or another TCP client name. +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Major version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Minor version of the [clickhouse-client](../../interfaces/cli.md) or another TCP client. +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the [clickhouse-client](../../interfaces/cli.md) or another TCP client version. +- `http_method` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — HTTP method that initiated the query. Possible values: + - 0 — The query was launched from the TCP interface. + - 1 — `GET` method was used. + - 2 — `POST` method was used. +- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — The `UserAgent` header passed in the HTTP request. +- `quota_key` ([String](../../sql-reference/data-types/string.md)) — The “quota key” specified in the [quotas](../../operations/quotas.md) setting (see `keyed`). +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse revision. +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics for this thread. The description of them could be found in the table [system.events](#system_tables-events). **Example** @@ -116,5 +116,5 @@ ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'Compr **See Also** -- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. -- [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) — This table contains information about each view executed during a query. +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. +- [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) — This table contains information about each view executed during a query. diff --git a/docs/en/operations/system-tables/query_views_log.md b/docs/en/operations/system-tables/query_views_log.md index 55cab49e52f..e107e4f926c 100644 --- a/docs/en/operations/system-tables/query_views_log.md +++ b/docs/en/operations/system-tables/query_views_log.md @@ -18,33 +18,33 @@ You can use the [log_queries_probability](../../operations/settings/settings.md# Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the last event of the view happened. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution. -- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution with microseconds precision. -- `view_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of view execution (sum of its stages) in milliseconds. -- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). -- `view_name` ([String](../../sql-reference/data-types/string.md)) — Name of the view. -- `view_uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — UUID of the view. -- `view_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of the view. Values: - - `'Default' = 1` — [Default views](../../sql-reference/statements/create/view.md#normal). Should not appear in this log. - - `'Materialized' = 2` — [Materialized views](../../sql-reference/statements/create/view.md#materialized). - - `'Live' = 3` — [Live views](../../sql-reference/statements/create/view.md#live-view). -- `view_query` ([String](../../sql-reference/data-types/string.md)) — The query executed by the view. -- `view_target` ([String](../../sql-reference/data-types/string.md)) — The name of the view target table. -- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read rows. -- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read bytes. -- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written rows. -- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written bytes. -- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this view. -- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics. The description of them could be found in the table [system.events](../../operations/system-tables/events.md#system_tables-events). -- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the view. Values: - - `'QueryStart' = 1` — Successful start the view execution. Should not appear. - - `'QueryFinish' = 2` — Successful end of the view execution. - - `'ExceptionBeforeStart' = 3` — Exception before the start of the view execution. - - `'ExceptionWhileProcessing' = 4` — Exception during the view execution. -- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. -- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. -- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the last event of the view happened. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution. +- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — The date and time when the view finished execution with microseconds precision. +- `view_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Duration of view execution (sum of its stages) in milliseconds. +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — ID of the initial query (for distributed query execution). +- `view_name` ([String](../../sql-reference/data-types/string.md)) — Name of the view. +- `view_uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — UUID of the view. +- `view_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of the view. Values: + - `'Default' = 1` — [Default views](../../sql-reference/statements/create/view.md#normal). Should not appear in this log. + - `'Materialized' = 2` — [Materialized views](../../sql-reference/statements/create/view.md#materialized). + - `'Live' = 3` — [Live views](../../sql-reference/statements/create/view.md#live-view). +- `view_query` ([String](../../sql-reference/data-types/string.md)) — The query executed by the view. +- `view_target` ([String](../../sql-reference/data-types/string.md)) — The name of the view target table. +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read rows. +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of read bytes. +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written rows. +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Number of written bytes. +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — The maximum difference between the amount of allocated and freed memory in context of this view. +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — ProfileEvents that measure different metrics. The description of them could be found in the table [system.events](../../operations/system-tables/events.md#system_tables-events). +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Status of the view. Values: + - `'QueryStart' = 1` — Successful start the view execution. Should not appear. + - `'QueryFinish' = 2` — Successful end of the view execution. + - `'ExceptionBeforeStart' = 3` — Exception before the start of the view execution. + - `'ExceptionWhileProcessing' = 4` — Exception during the view execution. +- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — Code of an exception. +- `exception` ([String](../../sql-reference/data-types/string.md)) — Exception message. +- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [Stack trace](https://en.wikipedia.org/wiki/Stack_trace). An empty string, if the query was completed successfully. **Example** @@ -83,5 +83,5 @@ stack_trace: **See Also** -- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. -- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — Description of the `query_log` system table which contains common information about queries execution. +- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — This table contains information about each query execution thread. diff --git a/docs/en/operations/system-tables/quota_usage.md b/docs/en/operations/system-tables/quota_usage.md index 7286ad9efa9..0dca7c525f2 100644 --- a/docs/en/operations/system-tables/quota_usage.md +++ b/docs/en/operations/system-tables/quota_usage.md @@ -30,4 +30,4 @@ Columns: ## See Also {#see-also} -- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) +- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) diff --git a/docs/en/operations/system-tables/quotas.md b/docs/en/operations/system-tables/quotas.md index ffe7a95df5b..a9748a2b464 100644 --- a/docs/en/operations/system-tables/quotas.md +++ b/docs/en/operations/system-tables/quotas.md @@ -25,4 +25,4 @@ Columns: ## See Also {#see-also} -- [SHOW QUOTAS](../../sql-reference/statements/show.md#show-quotas-statement) +- [SHOW QUOTAS](../../sql-reference/statements/show.md#show-quotas-statement) diff --git a/docs/en/operations/system-tables/quotas_usage.md b/docs/en/operations/system-tables/quotas_usage.md index e29ffff6b41..a04018ac2c8 100644 --- a/docs/en/operations/system-tables/quotas_usage.md +++ b/docs/en/operations/system-tables/quotas_usage.md @@ -33,4 +33,4 @@ Columns: ## See Also {#see-also} -- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) +- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) diff --git a/docs/en/operations/system-tables/replicas.md b/docs/en/operations/system-tables/replicas.md index 15426eefbcc..122a03ca629 100644 --- a/docs/en/operations/system-tables/replicas.md +++ b/docs/en/operations/system-tables/replicas.md @@ -58,43 +58,43 @@ replica_is_active: {'r1':1,'r2':1} Columns: -- `database` (`String`) - Database name -- `table` (`String`) - Table name -- `engine` (`String`) - Table engine name -- `is_leader` (`UInt8`) - Whether the replica is the leader. +- `database` (`String`) - Database name +- `table` (`String`) - Table name +- `engine` (`String`) - Table engine name +- `is_leader` (`UInt8`) - Whether the replica is the leader. Multiple replicas can be leaders at the same time. A replica can be prevented from becoming a leader using the `merge_tree` setting `replicated_can_become_leader`. The leaders are responsible for scheduling background merges. Note that writes can be performed to any replica that is available and has a session in ZK, regardless of whether it is a leader. -- `can_become_leader` (`UInt8`) - Whether the replica can be a leader. -- `is_readonly` (`UInt8`) - Whether the replica is in read-only mode. +- `can_become_leader` (`UInt8`) - Whether the replica can be a leader. +- `is_readonly` (`UInt8`) - Whether the replica is in read-only mode. This mode is turned on if the config does not have sections with ClickHouse Keeper, if an unknown error occurred when reinitializing sessions in ClickHouse Keeper, and during session reinitialization in ClickHouse Keeper. -- `is_session_expired` (`UInt8`) - the session with ClickHouse Keeper has expired. Basically the same as `is_readonly`. -- `future_parts` (`UInt32`) - The number of data parts that will appear as the result of INSERTs or merges that haven’t been done yet. -- `parts_to_check` (`UInt32`) - The number of data parts in the queue for verification. A part is put in the verification queue if there is suspicion that it might be damaged. -- `zookeeper_path` (`String`) - Path to table data in ClickHouse Keeper. -- `replica_name` (`String`) - Replica name in ClickHouse Keeper. Different replicas of the same table have different names. -- `replica_path` (`String`) - Path to replica data in ClickHouse Keeper. The same as concatenating ‘zookeeper_path/replicas/replica_path’. -- `columns_version` (`Int32`) - Version number of the table structure. Indicates how many times ALTER was performed. If replicas have different versions, it means some replicas haven’t made all of the ALTERs yet. -- `queue_size` (`UInt32`) - Size of the queue for operations waiting to be performed. Operations include inserting blocks of data, merges, and certain other actions. It usually coincides with `future_parts`. -- `inserts_in_queue` (`UInt32`) - Number of inserts of blocks of data that need to be made. Insertions are usually replicated fairly quickly. If this number is large, it means something is wrong. -- `merges_in_queue` (`UInt32`) - The number of merges waiting to be made. Sometimes merges are lengthy, so this value may be greater than zero for a long time. -- `part_mutations_in_queue` (`UInt32`) - The number of mutations waiting to be made. -- `queue_oldest_time` (`DateTime`) - If `queue_size` greater than 0, shows when the oldest operation was added to the queue. -- `inserts_oldest_time` (`DateTime`) - See `queue_oldest_time` -- `merges_oldest_time` (`DateTime`) - See `queue_oldest_time` -- `part_mutations_oldest_time` (`DateTime`) - See `queue_oldest_time` +- `is_session_expired` (`UInt8`) - the session with ClickHouse Keeper has expired. Basically the same as `is_readonly`. +- `future_parts` (`UInt32`) - The number of data parts that will appear as the result of INSERTs or merges that haven’t been done yet. +- `parts_to_check` (`UInt32`) - The number of data parts in the queue for verification. A part is put in the verification queue if there is suspicion that it might be damaged. +- `zookeeper_path` (`String`) - Path to table data in ClickHouse Keeper. +- `replica_name` (`String`) - Replica name in ClickHouse Keeper. Different replicas of the same table have different names. +- `replica_path` (`String`) - Path to replica data in ClickHouse Keeper. The same as concatenating ‘zookeeper_path/replicas/replica_path’. +- `columns_version` (`Int32`) - Version number of the table structure. Indicates how many times ALTER was performed. If replicas have different versions, it means some replicas haven’t made all of the ALTERs yet. +- `queue_size` (`UInt32`) - Size of the queue for operations waiting to be performed. Operations include inserting blocks of data, merges, and certain other actions. It usually coincides with `future_parts`. +- `inserts_in_queue` (`UInt32`) - Number of inserts of blocks of data that need to be made. Insertions are usually replicated fairly quickly. If this number is large, it means something is wrong. +- `merges_in_queue` (`UInt32`) - The number of merges waiting to be made. Sometimes merges are lengthy, so this value may be greater than zero for a long time. +- `part_mutations_in_queue` (`UInt32`) - The number of mutations waiting to be made. +- `queue_oldest_time` (`DateTime`) - If `queue_size` greater than 0, shows when the oldest operation was added to the queue. +- `inserts_oldest_time` (`DateTime`) - See `queue_oldest_time` +- `merges_oldest_time` (`DateTime`) - See `queue_oldest_time` +- `part_mutations_oldest_time` (`DateTime`) - See `queue_oldest_time` The next 4 columns have a non-zero value only where there is an active session with ZK. -- `log_max_index` (`UInt64`) - Maximum entry number in the log of general activity. -- `log_pointer` (`UInt64`) - Maximum entry number in the log of general activity that the replica copied to its execution queue, plus one. If `log_pointer` is much smaller than `log_max_index`, something is wrong. -- `last_queue_update` (`DateTime`) - When the queue was updated last time. -- `absolute_delay` (`UInt64`) - How big lag in seconds the current replica has. -- `total_replicas` (`UInt8`) - The total number of known replicas of this table. -- `active_replicas` (`UInt8`) - The number of replicas of this table that have a session in ClickHouse Keeper (i.e., the number of functioning replicas). -- `lost_part_count` (`UInt64`) - The number of data parts lost in the table by all replicas in total since table creation. Value is persisted in ClickHouse Keeper and can only increase. -- `last_queue_update_exception` (`String`) - When the queue contains broken entries. Especially important when ClickHouse breaks backward compatibility between versions and log entries written by newer versions aren't parseable by old versions. -- `zookeeper_exception` (`String`) - The last exception message, got if the error happened when fetching the info from ClickHouse Keeper. -- `replica_is_active` ([Map(String, UInt8)](../../sql-reference/data-types/map.md)) — Map between replica name and is replica active. +- `log_max_index` (`UInt64`) - Maximum entry number in the log of general activity. +- `log_pointer` (`UInt64`) - Maximum entry number in the log of general activity that the replica copied to its execution queue, plus one. If `log_pointer` is much smaller than `log_max_index`, something is wrong. +- `last_queue_update` (`DateTime`) - When the queue was updated last time. +- `absolute_delay` (`UInt64`) - How big lag in seconds the current replica has. +- `total_replicas` (`UInt8`) - The total number of known replicas of this table. +- `active_replicas` (`UInt8`) - The number of replicas of this table that have a session in ClickHouse Keeper (i.e., the number of functioning replicas). +- `lost_part_count` (`UInt64`) - The number of data parts lost in the table by all replicas in total since table creation. Value is persisted in ClickHouse Keeper and can only increase. +- `last_queue_update_exception` (`String`) - When the queue contains broken entries. Especially important when ClickHouse breaks backward compatibility between versions and log entries written by newer versions aren't parseable by old versions. +- `zookeeper_exception` (`String`) - The last exception message, got if the error happened when fetching the info from ClickHouse Keeper. +- `replica_is_active` ([Map(String, UInt8)](../../sql-reference/data-types/map.md)) — Map between replica name and is replica active. If you request all the columns, the table may work a bit slowly, since several reads from ClickHouse Keeper are made for each row. If you do not request the last 4 columns (log_max_index, log_pointer, total_replicas, active_replicas), the table works quickly. diff --git a/docs/en/operations/system-tables/replicated_fetches.md b/docs/en/operations/system-tables/replicated_fetches.md index 9bd068e3c58..0f9be7bac83 100644 --- a/docs/en/operations/system-tables/replicated_fetches.md +++ b/docs/en/operations/system-tables/replicated_fetches.md @@ -7,37 +7,37 @@ Contains information about currently running background fetches. Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. -- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. +- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. -- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — The time elapsed (in seconds) since showing currently running background fetches started. +- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — The time elapsed (in seconds) since showing currently running background fetches started. -- `progress` ([Float64](../../sql-reference/data-types/float.md)) — The percentage of completed work from 0 to 1. +- `progress` ([Float64](../../sql-reference/data-types/float.md)) — The percentage of completed work from 0 to 1. -- `result_part_name` ([String](../../sql-reference/data-types/string.md)) — The name of the part that will be formed as the result of showing currently running background fetches. +- `result_part_name` ([String](../../sql-reference/data-types/string.md)) — The name of the part that will be formed as the result of showing currently running background fetches. -- `result_part_path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the part that will be formed as the result of showing currently running background fetches. +- `result_part_path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the part that will be formed as the result of showing currently running background fetches. -- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition. +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — ID of the partition. -- `total_size_bytes_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The total size (in bytes) of the compressed data in the result part. +- `total_size_bytes_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The total size (in bytes) of the compressed data in the result part. -- `bytes_read_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of compressed bytes read from the result part. +- `bytes_read_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — The number of compressed bytes read from the result part. -- `source_replica_path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the source replica. +- `source_replica_path` ([String](../../sql-reference/data-types/string.md)) — Absolute path to the source replica. -- `source_replica_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the source replica. +- `source_replica_hostname` ([String](../../sql-reference/data-types/string.md)) — Hostname of the source replica. -- `source_replica_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — Port number of the source replica. +- `source_replica_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — Port number of the source replica. -- `interserver_scheme` ([String](../../sql-reference/data-types/string.md)) — Name of the interserver scheme. +- `interserver_scheme` ([String](../../sql-reference/data-types/string.md)) — Name of the interserver scheme. -- `URI` ([String](../../sql-reference/data-types/string.md)) — Uniform resource identifier. +- `URI` ([String](../../sql-reference/data-types/string.md)) — Uniform resource identifier. -- `to_detached` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether the currently running background fetch is being performed using the `TO DETACHED` expression. +- `to_detached` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether the currently running background fetch is being performed using the `TO DETACHED` expression. -- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread identifier. +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread identifier. **Example** @@ -68,4 +68,4 @@ thread_id: 54 **See Also** -- [Managing ReplicatedMergeTree Tables](../../sql-reference/statements/system.md/#managing-replicatedmergetree-tables) +- [Managing ReplicatedMergeTree Tables](../../sql-reference/statements/system.md/#managing-replicatedmergetree-tables) diff --git a/docs/en/operations/system-tables/replication_queue.md b/docs/en/operations/system-tables/replication_queue.md index dcc61b8e6a7..dd8f6328688 100644 --- a/docs/en/operations/system-tables/replication_queue.md +++ b/docs/en/operations/system-tables/replication_queue.md @@ -7,55 +7,55 @@ Contains information about tasks from replication queues stored in ClickHouse Ke Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. +- `database` ([String](../../sql-reference/data-types/string.md)) — Name of the database. -- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. +- `table` ([String](../../sql-reference/data-types/string.md)) — Name of the table. -- `replica_name` ([String](../../sql-reference/data-types/string.md)) — Replica name in ClickHouse Keeper. Different replicas of the same table have different names. +- `replica_name` ([String](../../sql-reference/data-types/string.md)) — Replica name in ClickHouse Keeper. Different replicas of the same table have different names. -- `position` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Position of the task in the queue. +- `position` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Position of the task in the queue. -- `node_name` ([String](../../sql-reference/data-types/string.md)) — Node name in ClickHouse Keeper. +- `node_name` ([String](../../sql-reference/data-types/string.md)) — Node name in ClickHouse Keeper. -- `type` ([String](../../sql-reference/data-types/string.md)) — Type of the task in the queue, one of: +- `type` ([String](../../sql-reference/data-types/string.md)) — Type of the task in the queue, one of: - - `GET_PART` — Get the part from another replica. - - `ATTACH_PART` — Attach the part, possibly from our own replica (if found in the `detached` folder). You may think of it as a `GET_PART` with some optimizations as they're nearly identical. - - `MERGE_PARTS` — Merge the parts. - - `DROP_RANGE` — Delete the parts in the specified partition in the specified number range. - - `CLEAR_COLUMN` — NOTE: Deprecated. Drop specific column from specified partition. - - `CLEAR_INDEX` — NOTE: Deprecated. Drop specific index from specified partition. - - `REPLACE_RANGE` — Drop a certain range of parts and replace them with new ones. - - `MUTATE_PART` — Apply one or several mutations to the part. - - `ALTER_METADATA` — Apply alter modification according to global /metadata and /columns paths. + - `GET_PART` — Get the part from another replica. + - `ATTACH_PART` — Attach the part, possibly from our own replica (if found in the `detached` folder). You may think of it as a `GET_PART` with some optimizations as they're nearly identical. + - `MERGE_PARTS` — Merge the parts. + - `DROP_RANGE` — Delete the parts in the specified partition in the specified number range. + - `CLEAR_COLUMN` — NOTE: Deprecated. Drop specific column from specified partition. + - `CLEAR_INDEX` — NOTE: Deprecated. Drop specific index from specified partition. + - `REPLACE_RANGE` — Drop a certain range of parts and replace them with new ones. + - `MUTATE_PART` — Apply one or several mutations to the part. + - `ALTER_METADATA` — Apply alter modification according to global /metadata and /columns paths. -- `create_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was submitted for execution. +- `create_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was submitted for execution. -- `required_quorum` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of replicas waiting for the task to complete with confirmation of completion. This column is only relevant for the `GET_PARTS` task. +- `required_quorum` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of replicas waiting for the task to complete with confirmation of completion. This column is only relevant for the `GET_PARTS` task. -- `source_replica` ([String](../../sql-reference/data-types/string.md)) — Name of the source replica. +- `source_replica` ([String](../../sql-reference/data-types/string.md)) — Name of the source replica. -- `new_part_name` ([String](../../sql-reference/data-types/string.md)) — Name of the new part. +- `new_part_name` ([String](../../sql-reference/data-types/string.md)) — Name of the new part. -- `parts_to_merge` ([Array](../../sql-reference/data-types/array.md) ([String](../../sql-reference/data-types/string.md))) — Names of parts to merge or update. +- `parts_to_merge` ([Array](../../sql-reference/data-types/array.md) ([String](../../sql-reference/data-types/string.md))) — Names of parts to merge or update. -- `is_detach` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether the `DETACH_PARTS` task is in the queue. +- `is_detach` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether the `DETACH_PARTS` task is in the queue. -- `is_currently_executing` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether a specific task is being performed right now. +- `is_currently_executing` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The flag indicates whether a specific task is being performed right now. -- `num_tries` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of failed attempts to complete the task. +- `num_tries` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of failed attempts to complete the task. -- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text message about the last error that occurred (if any). +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Text message about the last error that occurred (if any). -- `last_attempt_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was last attempted. +- `last_attempt_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was last attempted. -- `num_postponed` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of postponed tasks. +- `num_postponed` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of postponed tasks. -- `postpone_reason` ([String](../../sql-reference/data-types/string.md)) — The reason why the task was postponed. +- `postpone_reason` ([String](../../sql-reference/data-types/string.md)) — The reason why the task was postponed. -- `last_postpone_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was last postponed. +- `last_postpone_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Date and time when the task was last postponed. -- `merge_type` ([String](../../sql-reference/data-types/string.md)) — Type of the current merge. Empty if it's a mutation. +- `merge_type` ([String](../../sql-reference/data-types/string.md)) — Type of the current merge. Empty if it's a mutation. **Example** @@ -89,4 +89,4 @@ last_postpone_time: 1970-01-01 03:00:00 **See Also** -- [Managing ReplicatedMergeTree Tables](../../sql-reference/statements/system.md#query-language-system-replicated) +- [Managing ReplicatedMergeTree Tables](../../sql-reference/statements/system.md#query-language-system-replicated) diff --git a/docs/en/operations/system-tables/role-grants.md b/docs/en/operations/system-tables/role-grants.md index 22f69fce7fb..ffe1f1d74e2 100644 --- a/docs/en/operations/system-tables/role-grants.md +++ b/docs/en/operations/system-tables/role-grants.md @@ -14,9 +14,9 @@ Columns: - `granted_role_name` ([String](../../sql-reference/data-types/string.md)) — Name of role granted to the `role_name` role. To grant one role to another one use `GRANT role1 TO role2`. - `granted_role_is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Flag that shows whether `granted_role` is a default role. Possible values: - - 1 — `granted_role` is a default role. - - 0 — `granted_role` is not a default role. + - 1 — `granted_role` is a default role. + - 0 — `granted_role` is not a default role. - `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Flag that shows whether `granted_role` is a role with [ADMIN OPTION](../../sql-reference/statements/grant.md#admin-option-privilege) privilege. Possible values: - - 1 — The role has `ADMIN OPTION` privilege. - - 0 — The role without `ADMIN OPTION` privilege. + - 1 — The role has `ADMIN OPTION` privilege. + - 0 — The role without `ADMIN OPTION` privilege. diff --git a/docs/en/operations/system-tables/roles.md b/docs/en/operations/system-tables/roles.md index 5ef5e765c0f..1614e0580b8 100644 --- a/docs/en/operations/system-tables/roles.md +++ b/docs/en/operations/system-tables/roles.md @@ -13,4 +13,4 @@ Columns: ## See Also {#see-also} -- [SHOW ROLES](../../sql-reference/statements/show.md#show-roles-statement) +- [SHOW ROLES](../../sql-reference/statements/show.md#show-roles-statement) diff --git a/docs/en/operations/system-tables/row_policies.md b/docs/en/operations/system-tables/row_policies.md index b21a9500825..db6bbe42703 100644 --- a/docs/en/operations/system-tables/row_policies.md +++ b/docs/en/operations/system-tables/row_policies.md @@ -6,30 +6,30 @@ slug: /en/operations/system-tables/row_policies Contains filters for one particular table, as well as a list of roles and/or users which should use this row policy. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a row policy. +- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a row policy. -- `short_name` ([String](../../sql-reference/data-types/string.md)) — Short name of a row policy. Names of row policies are compound, for example: myfilter ON mydb.mytable. Here "myfilter ON mydb.mytable" is the name of the row policy, "myfilter" is it's short name. +- `short_name` ([String](../../sql-reference/data-types/string.md)) — Short name of a row policy. Names of row policies are compound, for example: myfilter ON mydb.mytable. Here "myfilter ON mydb.mytable" is the name of the row policy, "myfilter" is it's short name. -- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. +- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. -- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Row policy ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Row policy ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. -- `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Condition which is used to filter rows. +- `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Condition which is used to filter rows. -- `is_restrictive` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the row policy restricts access to rows, see [CREATE ROW POLICY](../../sql-reference/statements/create/row-policy.md#create-row-policy-as). Value: +- `is_restrictive` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the row policy restricts access to rows, see [CREATE ROW POLICY](../../sql-reference/statements/create/row-policy.md#create-row-policy-as). Value: - `0` — The row policy is defined with `AS PERMISSIVE` clause. - `1` — The row policy is defined with `AS RESTRICTIVE` clause. -- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the row policies set for all roles and/or users. +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the row policies set for all roles and/or users. -- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the row policies is applied. +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the row policies is applied. -- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The row policies is applied to all roles and/or users excepting of the listed ones. +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The row policies is applied to all roles and/or users excepting of the listed ones. ## See Also {#see-also} -- [SHOW POLICIES](../../sql-reference/statements/show.md#show-policies-statement) +- [SHOW POLICIES](../../sql-reference/statements/show.md#show-policies-statement) diff --git a/docs/en/operations/system-tables/schema_inference_cache.md b/docs/en/operations/system-tables/schema_inference_cache.md index 8a65f29bc30..8624ee9cec9 100644 --- a/docs/en/operations/system-tables/schema_inference_cache.md +++ b/docs/en/operations/system-tables/schema_inference_cache.md @@ -66,4 +66,4 @@ schema: id Nullable(Float64), age Nullable(Float64), name Nullab **See also** -- [Automatic schema inference from input data](/docs/en/interfaces/schema-inference.md) +- [Automatic schema inference from input data](/docs/en/interfaces/schema-inference.md) diff --git a/docs/en/operations/system-tables/server_settings.md b/docs/en/operations/system-tables/server_settings.md index e1bf8c3d63f..3085b1acaf4 100644 --- a/docs/en/operations/system-tables/server_settings.md +++ b/docs/en/operations/system-tables/server_settings.md @@ -8,12 +8,12 @@ Currently, the table shows only settings from the first layer of `config.xml` an Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Server setting name. -- `value` ([String](../../sql-reference/data-types/string.md)) — Server setting value. -- `default` ([String](../../sql-reference/data-types/string.md)) — Server setting default value. -- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether a setting was specified in `config.xml` -- `description` ([String](../../sql-reference/data-types/string.md)) — Short server setting description. -- `type` ([String](../../sql-reference/data-types/string.md)) — Server setting value type. +- `name` ([String](../../sql-reference/data-types/string.md)) — Server setting name. +- `value` ([String](../../sql-reference/data-types/string.md)) — Server setting value. +- `default` ([String](../../sql-reference/data-types/string.md)) — Server setting default value. +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether a setting was specified in `config.xml` +- `description` ([String](../../sql-reference/data-types/string.md)) — Short server setting description. +- `type` ([String](../../sql-reference/data-types/string.md)) — Server setting value type. **Example** @@ -47,6 +47,6 @@ SELECT * FROM system.server_settings WHERE changed AND name='max_thread_pool_siz **See also** -- [Settings](../../operations/system-tables/settings.md) -- [Configuration Files](../../operations/configuration-files.md) -- [Server Settings](../../operations/server-configuration-parameters/settings.md) +- [Settings](../../operations/system-tables/settings.md) +- [Configuration Files](../../operations/configuration-files.md) +- [Server Settings](../../operations/server-configuration-parameters/settings.md) diff --git a/docs/en/operations/system-tables/session_log.md b/docs/en/operations/system-tables/session_log.md index cdf86b57ef6..661d34677e4 100644 --- a/docs/en/operations/system-tables/session_log.md +++ b/docs/en/operations/system-tables/session_log.md @@ -7,42 +7,42 @@ Contains information about all successful and failed login and logout events. Columns: -- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — Login/logout result. Possible values: - - `LoginFailure` — Login error. - - `LoginSuccess` — Successful login. - - `Logout` — Logout from the system. -- `auth_id` ([UUID](../../sql-reference/data-types/uuid.md)) — Authentication ID, which is a UUID that is automatically generated each time user logins. -- `session_id` ([String](../../sql-reference/data-types/string.md)) — Session ID that is passed by client via [HTTP](../../interfaces/http.md) interface. -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Login/logout date. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Login/logout time. -- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Login/logout starting time with microseconds precision. -- `user` ([String](../../sql-reference/data-types/string.md)) — User name. -- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)) — The authentication type. Possible values: - - `NO_PASSWORD` - - `PLAINTEXT_PASSWORD` - - `SHA256_PASSWORD` - - `DOUBLE_SHA1_PASSWORD` - - `LDAP` - - `KERBEROS` - - `SSL_CERTIFICATE` -- `profiles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — The list of profiles set for all roles and/or users. -- `roles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — The list of roles to which the profile is applied. -- `settings` ([Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md), [String](../../sql-reference/data-types/string.md)))) — Settings that were changed when the client logged in/out. -- `client_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — The IP address that was used to log in/out. -- `client_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to log in/out. -- `interface` ([Enum8](../../sql-reference/data-types/enum.md)) — The interface from which the login was initiated. Possible values: - - `TCP` - - `HTTP` - - `gRPC` - - `MySQL` - - `PostgreSQL` -- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — The hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. -- `client_name` ([String](../../sql-reference/data-types/string.md)) — The `clickhouse-client` or another TCP client name. -- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the `clickhouse-client` or another TCP client. -- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The major version of the `clickhouse-client` or another TCP client. -- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The minor version of the `clickhouse-client` or another TCP client. -- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the `clickhouse-client` or another TCP client version. -- `failure_reason` ([String](../../sql-reference/data-types/string.md)) — The exception message containing the reason for the login/logout failure. +- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — Login/logout result. Possible values: + - `LoginFailure` — Login error. + - `LoginSuccess` — Successful login. + - `Logout` — Logout from the system. +- `auth_id` ([UUID](../../sql-reference/data-types/uuid.md)) — Authentication ID, which is a UUID that is automatically generated each time user logins. +- `session_id` ([String](../../sql-reference/data-types/string.md)) — Session ID that is passed by client via [HTTP](../../interfaces/http.md) interface. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Login/logout date. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Login/logout time. +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Login/logout starting time with microseconds precision. +- `user` ([String](../../sql-reference/data-types/string.md)) — User name. +- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)) — The authentication type. Possible values: + - `NO_PASSWORD` + - `PLAINTEXT_PASSWORD` + - `SHA256_PASSWORD` + - `DOUBLE_SHA1_PASSWORD` + - `LDAP` + - `KERBEROS` + - `SSL_CERTIFICATE` +- `profiles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — The list of profiles set for all roles and/or users. +- `roles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — The list of roles to which the profile is applied. +- `settings` ([Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md), [String](../../sql-reference/data-types/string.md)))) — Settings that were changed when the client logged in/out. +- `client_address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — The IP address that was used to log in/out. +- `client_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The client port that was used to log in/out. +- `interface` ([Enum8](../../sql-reference/data-types/enum.md)) — The interface from which the login was initiated. Possible values: + - `TCP` + - `HTTP` + - `gRPC` + - `MySQL` + - `PostgreSQL` +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — The hostname of the client machine where the [clickhouse-client](../../interfaces/cli.md) or another TCP client is run. +- `client_name` ([String](../../sql-reference/data-types/string.md)) — The `clickhouse-client` or another TCP client name. +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Revision of the `clickhouse-client` or another TCP client. +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The major version of the `clickhouse-client` or another TCP client. +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The minor version of the `clickhouse-client` or another TCP client. +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Patch component of the `clickhouse-client` or another TCP client version. +- `failure_reason` ([String](../../sql-reference/data-types/string.md)) — The exception message containing the reason for the login/logout failure. **Example** diff --git a/docs/en/operations/system-tables/settings.md b/docs/en/operations/system-tables/settings.md index a3dfa937abe..afae45077cc 100644 --- a/docs/en/operations/system-tables/settings.md +++ b/docs/en/operations/system-tables/settings.md @@ -7,16 +7,16 @@ Contains information about session settings for current user. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Setting name. -- `value` ([String](../../sql-reference/data-types/string.md)) — Setting value. -- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether a setting is changed from its default value. -- `description` ([String](../../sql-reference/data-types/string.md)) — Short setting description. -- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Minimum value of the setting, if any is set via [constraints](../../operations/settings/constraints-on-settings.md#constraints-on-settings). If the setting has no minimum value, contains [NULL](../../sql-reference/syntax.md#null-literal). -- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Maximum value of the setting, if any is set via [constraints](../../operations/settings/constraints-on-settings.md#constraints-on-settings). If the setting has no maximum value, contains [NULL](../../sql-reference/syntax.md#null-literal). -- `readonly` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the current user can change the setting: - - `0` — Current user can change the setting. - - `1` — Current user can’t change the setting. -- `default` ([String](../../sql-reference/data-types/string.md)) — Setting default value. +- `name` ([String](../../sql-reference/data-types/string.md)) — Setting name. +- `value` ([String](../../sql-reference/data-types/string.md)) — Setting value. +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether a setting is changed from its default value. +- `description` ([String](../../sql-reference/data-types/string.md)) — Short setting description. +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Minimum value of the setting, if any is set via [constraints](../../operations/settings/constraints-on-settings.md#constraints-on-settings). If the setting has no minimum value, contains [NULL](../../sql-reference/syntax.md#null-literal). +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Maximum value of the setting, if any is set via [constraints](../../operations/settings/constraints-on-settings.md#constraints-on-settings). If the setting has no maximum value, contains [NULL](../../sql-reference/syntax.md#null-literal). +- `readonly` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the current user can change the setting: + - `0` — Current user can change the setting. + - `1` — Current user can’t change the setting. +- `default` ([String](../../sql-reference/data-types/string.md)) — Setting default value. **Example** @@ -38,8 +38,8 @@ WHERE name LIKE '%min_i%' Using of `WHERE changed` can be useful, for example, when you want to check: -- Whether settings in configuration files are loaded correctly and are in use. -- Settings that changed in the current session. +- Whether settings in configuration files are loaded correctly and are in use. +- Settings that changed in the current session. @@ -49,7 +49,7 @@ SELECT * FROM system.settings WHERE changed AND name='load_balancing' **See also** -- [Settings](../../operations/settings/index.md#session-settings-intro) -- [Permissions for Queries](../../operations/settings/permissions-for-queries.md#settings_readonly) -- [Constraints on Settings](../../operations/settings/constraints-on-settings.md) -- [SHOW SETTINGS](../../sql-reference/statements/show.md#show-settings) statement +- [Settings](../../operations/settings/index.md#session-settings-intro) +- [Permissions for Queries](../../operations/settings/permissions-for-queries.md#settings_readonly) +- [Constraints on Settings](../../operations/settings/constraints-on-settings.md) +- [SHOW SETTINGS](../../sql-reference/statements/show.md#show-settings) statement diff --git a/docs/en/operations/system-tables/settings_profile_elements.md b/docs/en/operations/system-tables/settings_profile_elements.md index f4c77dfc76a..da6248e791d 100644 --- a/docs/en/operations/system-tables/settings_profile_elements.md +++ b/docs/en/operations/system-tables/settings_profile_elements.md @@ -10,22 +10,22 @@ Describes the content of the settings profile: - Parent settings profiles. Columns: -- `profile_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting profile name. +- `profile_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting profile name. -- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. -- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role name. +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role name. -- `index` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Sequential number of the settings profile element. +- `index` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Sequential number of the settings profile element. -- `setting_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting name. +- `setting_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting name. -- `value` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting value. +- `value` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting value. -- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The minimum value of the setting. `NULL` if not set. +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The minimum value of the setting. `NULL` if not set. -- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The maximum value of the setting. NULL if not set. +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The maximum value of the setting. NULL if not set. -- `readonly` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges))) — Profile that allows only read queries. +- `readonly` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges))) — Profile that allows only read queries. -- `inherit_profile` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — A parent profile for this setting profile. `NULL` if not set. Setting profile will inherit all the settings' values and constraints (`min`, `max`, `readonly`) from its parent profiles. +- `inherit_profile` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — A parent profile for this setting profile. `NULL` if not set. Setting profile will inherit all the settings' values and constraints (`min`, `max`, `readonly`) from its parent profiles. diff --git a/docs/en/operations/system-tables/settings_profiles.md b/docs/en/operations/system-tables/settings_profiles.md index ef9068ae1b8..8138022cbe6 100644 --- a/docs/en/operations/system-tables/settings_profiles.md +++ b/docs/en/operations/system-tables/settings_profiles.md @@ -6,20 +6,20 @@ slug: /en/operations/system-tables/settings_profiles Contains properties of configured setting profiles. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Setting profile name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Setting profile name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Setting profile ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Setting profile ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. -- `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of elements for this profile in the `system.settings_profile_elements` table. +- `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of elements for this profile in the `system.settings_profile_elements` table. -- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the settings profile set for all roles and/or users. +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the settings profile set for all roles and/or users. -- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the setting profile is applied. +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the setting profile is applied. -- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The setting profile is applied to all roles and/or users excepting of the listed ones. +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The setting profile is applied to all roles and/or users excepting of the listed ones. ## See Also {#see-also} -- [SHOW PROFILES](../../sql-reference/statements/show.md#show-profiles-statement) +- [SHOW PROFILES](../../sql-reference/statements/show.md#show-profiles-statement) diff --git a/docs/en/operations/system-tables/stack_trace.md b/docs/en/operations/system-tables/stack_trace.md index d6963160399..52ee7088597 100644 --- a/docs/en/operations/system-tables/stack_trace.md +++ b/docs/en/operations/system-tables/stack_trace.md @@ -9,10 +9,10 @@ To analyze stack frames, use the `addressToLine`, `addressToLineWithInlines`, `a Columns: -- `thread_name` ([String](../../sql-reference/data-types/string.md)) — Thread name. -- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread identifier. -- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query identifier that can be used to get details about a query that was running from the [query_log](../system-tables/query_log.md) system table. -- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — A [stack trace](https://en.wikipedia.org/wiki/Stack_trace) which represents a list of physical addresses where the called methods are stored. +- `thread_name` ([String](../../sql-reference/data-types/string.md)) — Thread name. +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Thread identifier. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query identifier that can be used to get details about a query that was running from the [query_log](../system-tables/query_log.md) system table. +- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — A [stack trace](https://en.wikipedia.org/wiki/Stack_trace) which represents a list of physical addresses where the called methods are stored. :::tip Check out the Knowledge Base for some handy queries, including [how to see what threads are currently running](https://clickhouse.com/docs/knowledgebase/find-expensive-queries) and [useful queries for troubleshooting](https://clickhouse.com/docs/knowledgebase/useful-queries-for-troubleshooting). @@ -92,7 +92,7 @@ res: /lib/x86_64-linux-gnu/libc-2.27.so **See Also** -- [Introspection Functions](../../sql-reference/functions/introspection.md) — Which introspection functions are available and how to use them. -- [system.trace_log](../system-tables/trace_log.md) — Contains stack traces collected by the sampling query profiler. -- [arrayMap](../../sql-reference/functions/array-functions.md#array-map) — Description and usage example of the `arrayMap` function. -- [arrayFilter](../../sql-reference/functions/array-functions.md#array-filter) — Description and usage example of the `arrayFilter` function. +- [Introspection Functions](../../sql-reference/functions/introspection.md) — Which introspection functions are available and how to use them. +- [system.trace_log](../system-tables/trace_log.md) — Contains stack traces collected by the sampling query profiler. +- [arrayMap](../../sql-reference/functions/array-functions.md#array-map) — Description and usage example of the `arrayMap` function. +- [arrayFilter](../../sql-reference/functions/array-functions.md#array-filter) — Description and usage example of the `arrayFilter` function. diff --git a/docs/en/operations/system-tables/storage_policies.md b/docs/en/operations/system-tables/storage_policies.md index 69e0f7f0a55..5c7184b2b22 100644 --- a/docs/en/operations/system-tables/storage_policies.md +++ b/docs/en/operations/system-tables/storage_policies.md @@ -7,20 +7,20 @@ Contains information about storage policies and volumes defined in the [server c Columns: -- `policy_name` ([String](../../sql-reference/data-types/string.md)) — Name of the storage policy. -- `volume_name` ([String](../../sql-reference/data-types/string.md)) — Volume name defined in the storage policy. -- `volume_priority` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Volume order number in the configuration, the data fills the volumes according this priority, i.e. data during inserts and merges is written to volumes with a lower priority (taking into account other rules: TTL, `max_data_part_size`, `move_factor`). -- `disks` ([Array(String)](../../sql-reference/data-types/array.md)) — Disk names, defined in the storage policy. -- `volume_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of volume. Can have one of the following values: - - `JBOD` - - `SINGLE_DISK` - - `UNKNOWN` -- `max_data_part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Maximum size of a data part that can be stored on volume disks (0 — no limit). -- `move_factor` ([Float64](../../sql-reference/data-types/float.md)) — Ratio of free disk space. When the ratio exceeds the value of configuration parameter, ClickHouse start to move data to the next volume in order. -- `prefer_not_to_merge` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Value of the `prefer_not_to_merge` setting. When this setting is enabled, merging data on this volume is not allowed. This allows controlling how ClickHouse works with slow disks. -- `perform_ttl_move_on_insert` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Value of the `perform_ttl_move_on_insert` setting. — Disables TTL move on data part INSERT. By default if we insert a data part that already expired by the TTL move rule it immediately goes to a volume/disk declared in move rule. This can significantly slowdown insert in case if destination volume/disk is slow (e.g. S3). -- `load_balancing` ([Enum8](../../sql-reference/data-types/enum.md)) — Policy for disk balancing. Can have one of the following values: - - `ROUND_ROBIN` - - `LEAST_USED` +- `policy_name` ([String](../../sql-reference/data-types/string.md)) — Name of the storage policy. +- `volume_name` ([String](../../sql-reference/data-types/string.md)) — Volume name defined in the storage policy. +- `volume_priority` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Volume order number in the configuration, the data fills the volumes according this priority, i.e. data during inserts and merges is written to volumes with a lower priority (taking into account other rules: TTL, `max_data_part_size`, `move_factor`). +- `disks` ([Array(String)](../../sql-reference/data-types/array.md)) — Disk names, defined in the storage policy. +- `volume_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Type of volume. Can have one of the following values: + - `JBOD` + - `SINGLE_DISK` + - `UNKNOWN` +- `max_data_part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Maximum size of a data part that can be stored on volume disks (0 — no limit). +- `move_factor` ([Float64](../../sql-reference/data-types/float.md)) — Ratio of free disk space. When the ratio exceeds the value of configuration parameter, ClickHouse start to move data to the next volume in order. +- `prefer_not_to_merge` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Value of the `prefer_not_to_merge` setting. When this setting is enabled, merging data on this volume is not allowed. This allows controlling how ClickHouse works with slow disks. +- `perform_ttl_move_on_insert` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Value of the `perform_ttl_move_on_insert` setting. — Disables TTL move on data part INSERT. By default if we insert a data part that already expired by the TTL move rule it immediately goes to a volume/disk declared in move rule. This can significantly slowdown insert in case if destination volume/disk is slow (e.g. S3). +- `load_balancing` ([Enum8](../../sql-reference/data-types/enum.md)) — Policy for disk balancing. Can have one of the following values: + - `ROUND_ROBIN` + - `LEAST_USED` If the storage policy contains more then one volume, then information for each volume is stored in the individual row of the table. diff --git a/docs/en/operations/system-tables/table_engines.md b/docs/en/operations/system-tables/table_engines.md index 5178f1640c7..08594739ecf 100644 --- a/docs/en/operations/system-tables/table_engines.md +++ b/docs/en/operations/system-tables/table_engines.md @@ -7,14 +7,14 @@ Contains description of table engines supported by server and their feature supp This table contains the following columns (the column type is shown in brackets): -- `name` (String) — The name of table engine. -- `supports_settings` (UInt8) — Flag that indicates if table engine supports `SETTINGS` clause. -- `supports_skipping_indices` (UInt8) — Flag that indicates if table engine supports [skipping indices](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-data_skipping-indexes). -- `supports_ttl` (UInt8) — Flag that indicates if table engine supports [TTL](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). -- `supports_sort_order` (UInt8) — Flag that indicates if table engine supports clauses `PARTITION_BY`, `PRIMARY_KEY`, `ORDER_BY` and `SAMPLE_BY`. -- `supports_replication` (UInt8) — Flag that indicates if table engine supports [data replication](../../engines/table-engines/mergetree-family/replication.md). -- `supports_duduplication` (UInt8) — Flag that indicates if table engine supports data deduplication. -- `supports_parallel_insert` (UInt8) — Flag that indicates if table engine supports parallel insert (see [`max_insert_threads`](../../operations/settings/settings.md#settings-max-insert-threads) setting). +- `name` (String) — The name of table engine. +- `supports_settings` (UInt8) — Flag that indicates if table engine supports `SETTINGS` clause. +- `supports_skipping_indices` (UInt8) — Flag that indicates if table engine supports [skipping indices](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-data_skipping-indexes). +- `supports_ttl` (UInt8) — Flag that indicates if table engine supports [TTL](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl). +- `supports_sort_order` (UInt8) — Flag that indicates if table engine supports clauses `PARTITION_BY`, `PRIMARY_KEY`, `ORDER_BY` and `SAMPLE_BY`. +- `supports_replication` (UInt8) — Flag that indicates if table engine supports [data replication](../../engines/table-engines/mergetree-family/replication.md). +- `supports_duduplication` (UInt8) — Flag that indicates if table engine supports data deduplication. +- `supports_parallel_insert` (UInt8) — Flag that indicates if table engine supports parallel insert (see [`max_insert_threads`](../../operations/settings/settings.md#settings-max-insert-threads) setting). Example: @@ -34,6 +34,6 @@ WHERE name in ('Kafka', 'MergeTree', 'ReplicatedCollapsingMergeTree') **See also** -- MergeTree family [query clauses](../../engines/table-engines/mergetree-family/mergetree.md#mergetree-query-clauses) -- Kafka [settings](../../engines/table-engines/integrations/kafka.md#table_engine-kafka-creating-a-table) -- Join [settings](../../engines/table-engines/special/join.md#join-limitations-and-settings) +- MergeTree family [query clauses](../../engines/table-engines/mergetree-family/mergetree.md#mergetree-query-clauses) +- Kafka [settings](../../engines/table-engines/integrations/kafka.md#table_engine-kafka-creating-a-table) +- Join [settings](../../engines/table-engines/special/join.md#join-limitations-and-settings) diff --git a/docs/en/operations/system-tables/tables.md b/docs/en/operations/system-tables/tables.md index 497e23dd7ca..82e9fa206ea 100644 --- a/docs/en/operations/system-tables/tables.md +++ b/docs/en/operations/system-tables/tables.md @@ -11,67 +11,67 @@ Contains metadata of each table that the server knows about. Columns: -- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in. +- `database` ([String](../../sql-reference/data-types/string.md)) — The name of the database the table is in. -- `name` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Table uuid (Atomic database). +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — Table uuid (Atomic database). -- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name (without parameters). +- `engine` ([String](../../sql-reference/data-types/string.md)) — Table engine name (without parameters). -- `is_temporary` ([UInt8](../../sql-reference/data-types/int-uint.md)) - Flag that indicates whether the table is temporary. +- `is_temporary` ([UInt8](../../sql-reference/data-types/int-uint.md)) - Flag that indicates whether the table is temporary. -- `data_paths` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Paths to the table data in the file systems. +- `data_paths` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Paths to the table data in the file systems. -- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table metadata in the file system. +- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - Path to the table metadata in the file system. -- `metadata_modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) - Time of latest modification of the table metadata. +- `metadata_modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) - Time of latest modification of the table metadata. -- `dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Database dependencies. +- `dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Database dependencies. -- `dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Table dependencies ([MaterializedView](../../engines/table-engines/special/materializedview.md) tables based on the current table). +- `dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Table dependencies ([MaterializedView](../../engines/table-engines/special/materializedview.md) tables based on the current table). -- `create_table_query` ([String](../../sql-reference/data-types/string.md)) - The query that was used to create the table. +- `create_table_query` ([String](../../sql-reference/data-types/string.md)) - The query that was used to create the table. -- `engine_full` ([String](../../sql-reference/data-types/string.md)) - Parameters of the table engine. +- `engine_full` ([String](../../sql-reference/data-types/string.md)) - Parameters of the table engine. -- `as_select` ([String](../../sql-reference/data-types/string.md)) - `SELECT` query for view. +- `as_select` ([String](../../sql-reference/data-types/string.md)) - `SELECT` query for view. -- `partition_key` ([String](../../sql-reference/data-types/string.md)) - The partition key expression specified in the table. +- `partition_key` ([String](../../sql-reference/data-types/string.md)) - The partition key expression specified in the table. -- `sorting_key` ([String](../../sql-reference/data-types/string.md)) - The sorting key expression specified in the table. +- `sorting_key` ([String](../../sql-reference/data-types/string.md)) - The sorting key expression specified in the table. -- `primary_key` ([String](../../sql-reference/data-types/string.md)) - The primary key expression specified in the table. +- `primary_key` ([String](../../sql-reference/data-types/string.md)) - The primary key expression specified in the table. -- `sampling_key` ([String](../../sql-reference/data-types/string.md)) - The sampling key expression specified in the table. +- `sampling_key` ([String](../../sql-reference/data-types/string.md)) - The sampling key expression specified in the table. -- `storage_policy` ([String](../../sql-reference/data-types/string.md)) - The storage policy: +- `storage_policy` ([String](../../sql-reference/data-types/string.md)) - The storage policy: - - [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) - - [Distributed](../../engines/table-engines/special/distributed.md#distributed) + - [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) + - [Distributed](../../engines/table-engines/special/distributed.md#distributed) -- `total_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows, if it is possible to quickly determine exact number of rows in the table, otherwise `NULL` (including underying `Buffer` table). +- `total_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows, if it is possible to quickly determine exact number of rows in the table, otherwise `NULL` (including underying `Buffer` table). -- `total_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes, if it is possible to quickly determine exact number of bytes for the table on storage, otherwise `NULL` (does not includes any underlying storage). +- `total_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes, if it is possible to quickly determine exact number of bytes for the table on storage, otherwise `NULL` (does not includes any underlying storage). - - If the table stores data on disk, returns used space on disk (i.e. compressed). - - If the table stores data in memory, returns approximated number of used bytes in memory. + - If the table stores data on disk, returns used space on disk (i.e. compressed). + - If the table stores data in memory, returns approximated number of used bytes in memory. -- `lifetime_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows INSERTed since server start (only for `Buffer` tables). +- `lifetime_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of rows INSERTed since server start (only for `Buffer` tables). -- `lifetime_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes INSERTed since server start (only for `Buffer` tables). +- `lifetime_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - Total number of bytes INSERTed since server start (only for `Buffer` tables). -- `comment` ([String](../../sql-reference/data-types/string.md)) - The comment for the table. +- `comment` ([String](../../sql-reference/data-types/string.md)) - The comment for the table. -- `has_own_data` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the table itself stores some data on disk or only accesses some other source. +- `has_own_data` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Flag that indicates whether the table itself stores some data on disk or only accesses some other source. -- `loading_dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Database loading dependencies (list of objects which should be loaded before the current object). +- `loading_dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Database loading dependencies (list of objects which should be loaded before the current object). -- `loading_dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Table loading dependencies (list of objects which should be loaded before the current object). +- `loading_dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Table loading dependencies (list of objects which should be loaded before the current object). -- `loading_dependent_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Dependent loading database. +- `loading_dependent_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Dependent loading database. -- `loading_dependent_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Dependent loading table. +- `loading_dependent_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - Dependent loading table. The `system.tables` table is used in `SHOW TABLES` query implementation. diff --git a/docs/en/operations/system-tables/text_log.md b/docs/en/operations/system-tables/text_log.md index c0ddacc719c..897cefab0be 100644 --- a/docs/en/operations/system-tables/text_log.md +++ b/docs/en/operations/system-tables/text_log.md @@ -7,28 +7,28 @@ Contains logging entries. The logging level which goes to this table can be limi Columns: -- `event_date` (Date) — Date of the entry. -- `event_time` (DateTime) — Time of the entry. -- `event_time_microseconds` (DateTime) — Time of the entry with microseconds precision. -- `microseconds` (UInt32) — Microseconds of the entry. -- `thread_name` (String) — Name of the thread from which the logging was done. -- `thread_id` (UInt64) — OS thread ID. -- `level` (`Enum8`) — Entry level. Possible values: - - `1` or `'Fatal'`. - - `2` or `'Critical'`. - - `3` or `'Error'`. - - `4` or `'Warning'`. - - `5` or `'Notice'`. - - `6` or `'Information'`. - - `7` or `'Debug'`. - - `8` or `'Trace'`. -- `query_id` (String) — ID of the query. -- `logger_name` (LowCardinality(String)) — Name of the logger (i.e. `DDLWorker`). -- `message` (String) — The message itself. -- `revision` (UInt32) — ClickHouse revision. -- `source_file` (LowCardinality(String)) — Source file from which the logging was done. -- `source_line` (UInt64) — Source line from which the logging was done. -- `message_format_string` (LowCardinality(String)) — A format string that was used to format the message. +- `event_date` (Date) — Date of the entry. +- `event_time` (DateTime) — Time of the entry. +- `event_time_microseconds` (DateTime) — Time of the entry with microseconds precision. +- `microseconds` (UInt32) — Microseconds of the entry. +- `thread_name` (String) — Name of the thread from which the logging was done. +- `thread_id` (UInt64) — OS thread ID. +- `level` (`Enum8`) — Entry level. Possible values: + - `1` or `'Fatal'`. + - `2` or `'Critical'`. + - `3` or `'Error'`. + - `4` or `'Warning'`. + - `5` or `'Notice'`. + - `6` or `'Information'`. + - `7` or `'Debug'`. + - `8` or `'Trace'`. +- `query_id` (String) — ID of the query. +- `logger_name` (LowCardinality(String)) — Name of the logger (i.e. `DDLWorker`). +- `message` (String) — The message itself. +- `revision` (UInt32) — ClickHouse revision. +- `source_file` (LowCardinality(String)) — Source file from which the logging was done. +- `source_line` (UInt64) — Source line from which the logging was done. +- `message_format_string` (LowCardinality(String)) — A format string that was used to format the message. **Example** diff --git a/docs/en/operations/system-tables/time_zones.md b/docs/en/operations/system-tables/time_zones.md index 498c9bfd217..906651b2960 100644 --- a/docs/en/operations/system-tables/time_zones.md +++ b/docs/en/operations/system-tables/time_zones.md @@ -7,7 +7,7 @@ Contains a list of time zones that are supported by the ClickHouse server. This Columns: -- `time_zone` (String) — List of supported time zones. +- `time_zone` (String) — List of supported time zones. **Example** diff --git a/docs/en/operations/system-tables/trace_log.md b/docs/en/operations/system-tables/trace_log.md index 4994248ce5c..a5aae422be7 100644 --- a/docs/en/operations/system-tables/trace_log.md +++ b/docs/en/operations/system-tables/trace_log.md @@ -12,38 +12,38 @@ To analyze logs, use the `addressToLine`, `addressToLineWithInlines`, `addressTo Columns: -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Date of sampling moment. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — Date of sampling moment. -- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Timestamp of the sampling moment. +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Timestamp of the sampling moment. -- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Timestamp of the sampling moment with microseconds precision. +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — Timestamp of the sampling moment with microseconds precision. -- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Timestamp of the sampling moment in nanoseconds. +- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Timestamp of the sampling moment in nanoseconds. -- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse server build revision. +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse server build revision. When connecting to the server by `clickhouse-client`, you see the string similar to `Connected to ClickHouse server version 19.18.1 revision 54429.`. This field contains the `revision`, but not the `version` of a server. -- `trace_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Trace type: +- `trace_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Trace type: - - `Real` represents collecting stack traces by wall-clock time. - - `CPU` represents collecting stack traces by CPU time. - - `Memory` represents collecting allocations and deallocations when memory allocation exceeds the subsequent watermark. - - `MemorySample` represents collecting random allocations and deallocations. - - `MemoryPeak` represents collecting updates of peak memory usage. - - `ProfileEvent` represents collecting of increments of profile events. + - `Real` represents collecting stack traces by wall-clock time. + - `CPU` represents collecting stack traces by CPU time. + - `Memory` represents collecting allocations and deallocations when memory allocation exceeds the subsequent watermark. + - `MemorySample` represents collecting random allocations and deallocations. + - `MemoryPeak` represents collecting updates of peak memory usage. + - `ProfileEvent` represents collecting of increments of profile events. -- `thread_number` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Thread identifier. +- `thread_number` ([UInt32](../../sql-reference/data-types/int-uint.md)) — Thread identifier. -- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query identifier that can be used to get details about a query that was running from the [query_log](#system_tables-query_log) system table. +- `query_id` ([String](../../sql-reference/data-types/string.md)) — Query identifier that can be used to get details about a query that was running from the [query_log](#system_tables-query_log) system table. -- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Stack trace at the moment of sampling. Each element is a virtual memory address inside ClickHouse server process. +- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — Stack trace at the moment of sampling. Each element is a virtual memory address inside ClickHouse server process. -- `size` ([Int64](../../sql-reference/data-types/int-uint.md)) - For trace types `Memory`, `MemorySample` or `MemoryPeak` is the amount of memory allocated, for other trace types is 0. +- `size` ([Int64](../../sql-reference/data-types/int-uint.md)) - For trace types `Memory`, `MemorySample` or `MemoryPeak` is the amount of memory allocated, for other trace types is 0. -- `event` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) - For trace type `ProfileEvent` is the name of updated profile event, for other trace types is an empty string. +- `event` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) - For trace type `ProfileEvent` is the name of updated profile event, for other trace types is an empty string. -- `increment` ([UInt64](../../sql-reference/data-types/int-uint.md)) - For trace type `ProfileEvent` is the amount of incremnt of profile event, for other trace types is 0. +- `increment` ([UInt64](../../sql-reference/data-types/int-uint.md)) - For trace type `ProfileEvent` is the amount of incremnt of profile event, for other trace types is 0. **Example** diff --git a/docs/en/operations/system-tables/users.md b/docs/en/operations/system-tables/users.md index 385e3151eb7..61fa490933e 100644 --- a/docs/en/operations/system-tables/users.md +++ b/docs/en/operations/system-tables/users.md @@ -6,30 +6,30 @@ slug: /en/operations/system-tables/users Contains a list of [user accounts](../../guides/sre/user-management/index.md#user-account-management) configured at the server. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — User name. +- `name` ([String](../../sql-reference/data-types/string.md)) — User name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — User ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — User ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. -- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5, 'ssl_certificate' = 6)) — Shows the authentication type. There are multiple ways of user identification: with no password, with plain text password, with [SHA256](https://ru.wikipedia.org/wiki/SHA-2)-encoded password or with [double SHA-1](https://ru.wikipedia.org/wiki/SHA-1)-encoded password. +- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5, 'ssl_certificate' = 6)) — Shows the authentication type. There are multiple ways of user identification: with no password, with plain text password, with [SHA256](https://ru.wikipedia.org/wiki/SHA-2)-encoded password or with [double SHA-1](https://ru.wikipedia.org/wiki/SHA-1)-encoded password. -- `auth_params` ([String](../../sql-reference/data-types/string.md)) — Authentication parameters in the JSON format depending on the `auth_type`. +- `auth_params` ([String](../../sql-reference/data-types/string.md)) — Authentication parameters in the JSON format depending on the `auth_type`. -- `host_ip` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — IP addresses of hosts that are allowed to connect to the ClickHouse server. +- `host_ip` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — IP addresses of hosts that are allowed to connect to the ClickHouse server. -- `host_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server. +- `host_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server. -- `host_names_regexp` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Regular expression for host names that are allowed to connect to the ClickHouse server. +- `host_names_regexp` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Regular expression for host names that are allowed to connect to the ClickHouse server. -- `host_names_like` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server, set using the LIKE predicate. +- `host_names_like` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server, set using the LIKE predicate. -- `default_roles_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that all granted roles set for user by default. +- `default_roles_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that all granted roles set for user by default. -- `default_roles_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of granted roles provided by default. +- `default_roles_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of granted roles provided by default. -- `default_roles_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — All the granted roles set as default excepting of the listed ones. +- `default_roles_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — All the granted roles set as default excepting of the listed ones. ## See Also {#see-also} -- [SHOW USERS](../../sql-reference/statements/show.md#show-users-statement) +- [SHOW USERS](../../sql-reference/statements/show.md#show-users-statement) diff --git a/docs/en/operations/system-tables/zookeeper.md b/docs/en/operations/system-tables/zookeeper.md index 503debf4302..7f948a238ac 100644 --- a/docs/en/operations/system-tables/zookeeper.md +++ b/docs/en/operations/system-tables/zookeeper.md @@ -16,20 +16,20 @@ It can be used to do a batch of Keeper path queries. Columns: -- `name` (String) — The name of the node. -- `path` (String) — The path to the node. -- `value` (String) — Node value. -- `dataLength` (Int32) — Size of the value. -- `numChildren` (Int32) — Number of descendants. -- `czxid` (Int64) — ID of the transaction that created the node. -- `mzxid` (Int64) — ID of the transaction that last changed the node. -- `pzxid` (Int64) — ID of the transaction that last deleted or added descendants. -- `ctime` (DateTime) — Time of node creation. -- `mtime` (DateTime) — Time of the last modification of the node. -- `version` (Int32) — Node version: the number of times the node was changed. -- `cversion` (Int32) — Number of added or removed descendants. -- `aversion` (Int32) — Number of changes to the ACL. -- `ephemeralOwner` (Int64) — For ephemeral nodes, the ID of the session that owns this node. +- `name` (String) — The name of the node. +- `path` (String) — The path to the node. +- `value` (String) — Node value. +- `dataLength` (Int32) — Size of the value. +- `numChildren` (Int32) — Number of descendants. +- `czxid` (Int64) — ID of the transaction that created the node. +- `mzxid` (Int64) — ID of the transaction that last changed the node. +- `pzxid` (Int64) — ID of the transaction that last deleted or added descendants. +- `ctime` (DateTime) — Time of node creation. +- `mtime` (DateTime) — Time of the last modification of the node. +- `version` (Int32) — Node version: the number of times the node was changed. +- `cversion` (Int32) — Number of added or removed descendants. +- `aversion` (Int32) — Number of changes to the ACL. +- `ephemeralOwner` (Int64) — For ephemeral nodes, the ID of the session that owns this node. Example: diff --git a/docs/en/operations/system-tables/zookeeper_log.md b/docs/en/operations/system-tables/zookeeper_log.md index 58c44325737..970ed192a48 100644 --- a/docs/en/operations/system-tables/zookeeper_log.md +++ b/docs/en/operations/system-tables/zookeeper_log.md @@ -9,46 +9,46 @@ For requests, only columns with request parameters are filled in, and the remain Columns with request parameters: -- `type` ([Enum](../../sql-reference/data-types/enum.md)) — Event type in the ZooKeeper client. Can have one of the following values: - - `Request` — The request has been sent. - - `Response` — The response was received. - - `Finalize` — The connection is lost, no response was received. -- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened. -- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened. -- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address of ZooKeeper server that was used to make the request. -- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port of ZooKeeper server that was used to make the request. -- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — The session ID that the ZooKeeper server sets for each connection. -- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — The ID of the request within the session. This is usually a sequential request number. It is the same for the request row and the paired `response`/`finalize` row. -- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The request whether the [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches) has been set. -- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — The type of request or response. -- `path` ([String](../../sql-reference/data-types/string.md)) — The path to the ZooKeeper node specified in the request, or an empty string if the request not requires specifying a path. -- `data` ([String](../../sql-reference/data-types/string.md)) — The data written to the ZooKeeper node (for the `SET` and `CREATE` requests — what the request wanted to write, for the response to the `GET` request — what was read) or an empty string. -- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes). -- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming). -- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — The version of the ZooKeeper node that the request expects when executing. This is supported for `CHECK`, `SET`, `REMOVE` requests (is relevant `-1` if the request does not check the version or `NULL` for other requests that do not support version checking). -- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of requests included in the multi request (this is a special request that consists of several consecutive ordinary requests and executes them atomically). All requests included in multi request will have the same `xid`. -- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of the request included in multi request (for multi request — `0`, then in order from `1`). +- `type` ([Enum](../../sql-reference/data-types/enum.md)) — Event type in the ZooKeeper client. Can have one of the following values: + - `Request` — The request has been sent. + - `Response` — The response was received. + - `Finalize` — The connection is lost, no response was received. +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — The date when the event happened. +- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — The date and time when the event happened. +- `address` ([IPv6](../../sql-reference/data-types/domains/ipv6.md)) — IP address of ZooKeeper server that was used to make the request. +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — The port of ZooKeeper server that was used to make the request. +- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — The session ID that the ZooKeeper server sets for each connection. +- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — The ID of the request within the session. This is usually a sequential request number. It is the same for the request row and the paired `response`/`finalize` row. +- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — The request whether the [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches) has been set. +- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — The type of request or response. +- `path` ([String](../../sql-reference/data-types/string.md)) — The path to the ZooKeeper node specified in the request, or an empty string if the request not requires specifying a path. +- `data` ([String](../../sql-reference/data-types/string.md)) — The data written to the ZooKeeper node (for the `SET` and `CREATE` requests — what the request wanted to write, for the response to the `GET` request — what was read) or an empty string. +- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes). +- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — Is the ZooKeeper node being created as an [sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming). +- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — The version of the ZooKeeper node that the request expects when executing. This is supported for `CHECK`, `SET`, `REMOVE` requests (is relevant `-1` if the request does not check the version or `NULL` for other requests that do not support version checking). +- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of requests included in the multi request (this is a special request that consists of several consecutive ordinary requests and executes them atomically). All requests included in multi request will have the same `xid`. +- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — The number of the request included in multi request (for multi request — `0`, then in order from `1`). Columns with request response parameters: -- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeper transaction ID. The serial number issued by the ZooKeeper server in response to a successfully executed request (`0` if the request was not executed/returned an error/the client does not know whether the request was executed). -- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — Error code. Can have many values, here are just some of them: - - `ZOK` — The request was executed seccessfully. - - `ZCONNECTIONLOSS` — The connection was lost. - - `ZOPERATIONTIMEOUT` — The request execution timeout has expired. - - `ZSESSIONEXPIRED` — The session has expired. - - `NULL` — The request is completed. -- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The type of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. -- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The status of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. -- `path_created` ([String](../../sql-reference/data-types/string.md)) — The path to the created ZooKeeper node (for responses to the `CREATE` request), may differ from the `path` if the node is created as a `sequential`. -- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that caused this ZooKeeper node to be created. -- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that last modified this ZooKeeper node. -- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The transaction ID of the change that last modified childern of this ZooKeeper node. -- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the data of this ZooKeeper node. -- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the children of this ZooKeeper node. -- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — The length of the data field of this ZooKeeper node. -- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of children of this ZooKeeper node. -- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — The list of child ZooKeeper nodes (for responses to `LIST` request). +- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeper transaction ID. The serial number issued by the ZooKeeper server in response to a successfully executed request (`0` if the request was not executed/returned an error/the client does not know whether the request was executed). +- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — Error code. Can have many values, here are just some of them: + - `ZOK` — The request was executed seccessfully. + - `ZCONNECTIONLOSS` — The connection was lost. + - `ZOPERATIONTIMEOUT` — The request execution timeout has expired. + - `ZSESSIONEXPIRED` — The session has expired. + - `NULL` — The request is completed. +- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The type of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. +- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — The status of the `watch` event (for responses with `op_num` = `Watch`), for the remaining responses: `NULL`. +- `path_created` ([String](../../sql-reference/data-types/string.md)) — The path to the created ZooKeeper node (for responses to the `CREATE` request), may differ from the `path` if the node is created as a `sequential`. +- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that caused this ZooKeeper node to be created. +- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The `zxid` of the change that last modified this ZooKeeper node. +- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — The transaction ID of the change that last modified childern of this ZooKeeper node. +- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the data of this ZooKeeper node. +- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of changes to the children of this ZooKeeper node. +- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — The length of the data field of this ZooKeeper node. +- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — The number of children of this ZooKeeper node. +- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — The list of child ZooKeeper nodes (for responses to `LIST` request). **Example** @@ -128,5 +128,5 @@ children: ['query-0000000006','query-0000000005','query-0000000004','que **See Also** -- [ZooKeeper](../../operations/tips.md#zookeeper) -- [ZooKeeper guide](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html) +- [ZooKeeper](../../operations/tips.md#zookeeper) +- [ZooKeeper guide](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html) diff --git a/docs/en/operations/utilities/clickhouse-benchmark.md b/docs/en/operations/utilities/clickhouse-benchmark.md index 0126cda160a..8620b44c368 100644 --- a/docs/en/operations/utilities/clickhouse-benchmark.md +++ b/docs/en/operations/utilities/clickhouse-benchmark.md @@ -41,24 +41,24 @@ clickhouse-benchmark [keys] < queries_file; ## Keys {#clickhouse-benchmark-keys} -- `--query=QUERY` — Query to execute. If this parameter is not passed, `clickhouse-benchmark` will read queries from standard input. -- `-c N`, `--concurrency=N` — Number of queries that `clickhouse-benchmark` sends simultaneously. Default value: 1. -- `-d N`, `--delay=N` — Interval in seconds between intermediate reports (to disable reports set 0). Default value: 1. -- `-h HOST`, `--host=HOST` — Server host. Default value: `localhost`. For the [comparison mode](#clickhouse-benchmark-comparison-mode) you can use multiple `-h` keys. -- `-p N`, `--port=N` — Server port. Default value: 9000. For the [comparison mode](#clickhouse-benchmark-comparison-mode) you can use multiple `-p` keys. -- `-i N`, `--iterations=N` — Total number of queries. Default value: 0 (repeat forever). -- `-r`, `--randomize` — Random order of queries execution if there is more than one input query. -- `-s`, `--secure` — Using `TLS` connection. -- `-t N`, `--timelimit=N` — Time limit in seconds. `clickhouse-benchmark` stops sending queries when the specified time limit is reached. Default value: 0 (time limit disabled). -- `--confidence=N` — Level of confidence for T-test. Possible values: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%). Default value: 5. In the [comparison mode](#clickhouse-benchmark-comparison-mode) `clickhouse-benchmark` performs the [Independent two-sample Student’s t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test) to determine whether the two distributions aren’t different with the selected level of confidence. -- `--cumulative` — Printing cumulative data instead of data per interval. -- `--database=DATABASE_NAME` — ClickHouse database name. Default value: `default`. -- `--json=FILEPATH` — `JSON` output. When the key is set, `clickhouse-benchmark` outputs a report to the specified JSON-file. -- `--user=USERNAME` — ClickHouse user name. Default value: `default`. -- `--password=PSWD` — ClickHouse user password. Default value: empty string. -- `--stacktrace` — Stack traces output. When the key is set, `clickhouse-bencmark` outputs stack traces of exceptions. -- `--stage=WORD` — Query processing stage at server. ClickHouse stops query processing and returns an answer to `clickhouse-benchmark` at the specified stage. Possible values: `complete`, `fetch_columns`, `with_mergeable_state`. Default value: `complete`. -- `--help` — Shows the help message. +- `--query=QUERY` — Query to execute. If this parameter is not passed, `clickhouse-benchmark` will read queries from standard input. +- `-c N`, `--concurrency=N` — Number of queries that `clickhouse-benchmark` sends simultaneously. Default value: 1. +- `-d N`, `--delay=N` — Interval in seconds between intermediate reports (to disable reports set 0). Default value: 1. +- `-h HOST`, `--host=HOST` — Server host. Default value: `localhost`. For the [comparison mode](#clickhouse-benchmark-comparison-mode) you can use multiple `-h` keys. +- `-p N`, `--port=N` — Server port. Default value: 9000. For the [comparison mode](#clickhouse-benchmark-comparison-mode) you can use multiple `-p` keys. +- `-i N`, `--iterations=N` — Total number of queries. Default value: 0 (repeat forever). +- `-r`, `--randomize` — Random order of queries execution if there is more than one input query. +- `-s`, `--secure` — Using `TLS` connection. +- `-t N`, `--timelimit=N` — Time limit in seconds. `clickhouse-benchmark` stops sending queries when the specified time limit is reached. Default value: 0 (time limit disabled). +- `--confidence=N` — Level of confidence for T-test. Possible values: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%). Default value: 5. In the [comparison mode](#clickhouse-benchmark-comparison-mode) `clickhouse-benchmark` performs the [Independent two-sample Student’s t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test) to determine whether the two distributions aren’t different with the selected level of confidence. +- `--cumulative` — Printing cumulative data instead of data per interval. +- `--database=DATABASE_NAME` — ClickHouse database name. Default value: `default`. +- `--json=FILEPATH` — `JSON` output. When the key is set, `clickhouse-benchmark` outputs a report to the specified JSON-file. +- `--user=USERNAME` — ClickHouse user name. Default value: `default`. +- `--password=PSWD` — ClickHouse user password. Default value: empty string. +- `--stacktrace` — Stack traces output. When the key is set, `clickhouse-bencmark` outputs stack traces of exceptions. +- `--stage=WORD` — Query processing stage at server. ClickHouse stops query processing and returns an answer to `clickhouse-benchmark` at the specified stage. Possible values: `complete`, `fetch_columns`, `with_mergeable_state`. Default value: `complete`. +- `--help` — Shows the help message. If you want to apply some [settings](../../operations/settings/index.md) for queries, pass them as a key `--= SETTING_VALUE`. For example, `--max_memory_usage=1048576`. @@ -91,19 +91,19 @@ localhost:9000, queries 10, QPS: 6.772, RPS: 67904487.440, MiB/s: 518.070, resul In the report you can find: -- Number of queries in the `Queries executed:` field. +- Number of queries in the `Queries executed:` field. -- Status string containing (in order): +- Status string containing (in order): - - Endpoint of ClickHouse server. - - Number of processed queries. - - QPS: How many queries the server performed per second during a period specified in the `--delay` argument. - - RPS: How many rows the server reads per second during a period specified in the `--delay` argument. - - MiB/s: How many mebibytes the server reads per second during a period specified in the `--delay` argument. - - result RPS: How many rows placed by the server to the result of a query per second during a period specified in the `--delay` argument. - - result MiB/s. How many mebibytes placed by the server to the result of a query per second during a period specified in the `--delay` argument. + - Endpoint of ClickHouse server. + - Number of processed queries. + - QPS: How many queries the server performed per second during a period specified in the `--delay` argument. + - RPS: How many rows the server reads per second during a period specified in the `--delay` argument. + - MiB/s: How many mebibytes the server reads per second during a period specified in the `--delay` argument. + - result RPS: How many rows placed by the server to the result of a query per second during a period specified in the `--delay` argument. + - result MiB/s. How many mebibytes placed by the server to the result of a query per second during a period specified in the `--delay` argument. -- Percentiles of queries execution time. +- Percentiles of queries execution time. ## Comparison Mode {#clickhouse-benchmark-comparison-mode} diff --git a/docs/en/operations/utilities/clickhouse-copier.md b/docs/en/operations/utilities/clickhouse-copier.md index ccce7ea1b79..a9b82404b90 100644 --- a/docs/en/operations/utilities/clickhouse-copier.md +++ b/docs/en/operations/utilities/clickhouse-copier.md @@ -16,12 +16,12 @@ You can run multiple `clickhouse-copier` instances on different servers to perfo After starting, `clickhouse-copier`: -- Connects to ClickHouse Keeper and receives: +- Connects to ClickHouse Keeper and receives: - - Copying jobs. - - The state of the copying jobs. + - Copying jobs. + - The state of the copying jobs. -- It performs the jobs. +- It performs the jobs. Each running process chooses the “closest” shard of the source cluster and copies the data into the destination cluster, resharding the data if necessary. @@ -39,12 +39,12 @@ $ clickhouse-copier --daemon --config keeper.xml --task-path /task/path --base-d Parameters: -- `daemon` — Starts `clickhouse-copier` in daemon mode. -- `config` — The path to the `keeper.xml` file with the parameters for the connection to ClickHouse Keeper. -- `task-path` — The path to the ClickHouse Keeper node. This node is used for syncing `clickhouse-copier` processes and storing tasks. Tasks are stored in `$task-path/description`. -- `task-file` — Optional path to file with task configuration for initial upload to ClickHouse Keeper. -- `task-upload-force` — Force upload `task-file` even if node already exists. -- `base-dir` — The path to logs and auxiliary files. When it starts, `clickhouse-copier` creates `clickhouse-copier_YYYYMMHHSS_` subdirectories in `$base-dir`. If this parameter is omitted, the directories are created in the directory where `clickhouse-copier` was launched. +- `daemon` — Starts `clickhouse-copier` in daemon mode. +- `config` — The path to the `keeper.xml` file with the parameters for the connection to ClickHouse Keeper. +- `task-path` — The path to the ClickHouse Keeper node. This node is used for syncing `clickhouse-copier` processes and storing tasks. Tasks are stored in `$task-path/description`. +- `task-file` — Optional path to file with task configuration for initial upload to ClickHouse Keeper. +- `task-upload-force` — Force upload `task-file` even if node already exists. +- `base-dir` — The path to logs and auxiliary files. When it starts, `clickhouse-copier` creates `clickhouse-copier_YYYYMMHHSS_` subdirectories in `$base-dir`. If this parameter is omitted, the directories are created in the directory where `clickhouse-copier` was launched. ## Format of keeper.xml {#format-of-zookeeper-xml} diff --git a/docs/en/operations/utilities/clickhouse-local.md b/docs/en/operations/utilities/clickhouse-local.md index 4439f823240..f64d8337387 100644 --- a/docs/en/operations/utilities/clickhouse-local.md +++ b/docs/en/operations/utilities/clickhouse-local.md @@ -180,25 +180,25 @@ $ ./clickhouse local --structure "table_structure" --input-format "format_of_inc Arguments: -- `-S`, `--structure` — table structure for input data. -- `--input-format` — input format, `TSV` by default. -- `-f`, `--file` — path to data, `stdin` by default. -- `-q`, `--query` — queries to execute with `;` as delimeter. You must specify either `query` or `queries-file` option. -- `--queries-file` - file path with queries to execute. You must specify either `query` or `queries-file` option. -- `-N`, `--table` — table name where to put output data, `table` by default. -- `--format`, `--output-format` — output format, `TSV` by default. -- `-d`, `--database` — default database, `_local` by default. -- `--stacktrace` — whether to dump debug output in case of exception. -- `--echo` — print query before execution. -- `--verbose` — more details on query execution. -- `--logger.console` — Log to console. -- `--logger.log` — Log file name. -- `--logger.level` — Log level. -- `--ignore-error` — do not stop processing if a query failed. -- `-c`, `--config-file` — path to configuration file in same format as for ClickHouse server, by default the configuration empty. -- `--no-system-tables` — do not attach system tables. -- `--help` — arguments references for `clickhouse-local`. -- `-V`, `--version` — print version information and exit. +- `-S`, `--structure` — table structure for input data. +- `--input-format` — input format, `TSV` by default. +- `-f`, `--file` — path to data, `stdin` by default. +- `-q`, `--query` — queries to execute with `;` as delimeter. You must specify either `query` or `queries-file` option. +- `--queries-file` - file path with queries to execute. You must specify either `query` or `queries-file` option. +- `-N`, `--table` — table name where to put output data, `table` by default. +- `--format`, `--output-format` — output format, `TSV` by default. +- `-d`, `--database` — default database, `_local` by default. +- `--stacktrace` — whether to dump debug output in case of exception. +- `--echo` — print query before execution. +- `--verbose` — more details on query execution. +- `--logger.console` — Log to console. +- `--logger.log` — Log file name. +- `--logger.level` — Log level. +- `--ignore-error` — do not stop processing if a query failed. +- `-c`, `--config-file` — path to configuration file in same format as for ClickHouse server, by default the configuration empty. +- `--no-system-tables` — do not attach system tables. +- `--help` — arguments references for `clickhouse-local`. +- `-V`, `--version` — print version information and exit. Also there are arguments for each ClickHouse configuration variable which are more commonly used instead of `--config-file`. diff --git a/docs/en/operations/utilities/index.md b/docs/en/operations/utilities/index.md index bf6b3a63d23..112a51cfa97 100644 --- a/docs/en/operations/utilities/index.md +++ b/docs/en/operations/utilities/index.md @@ -7,10 +7,10 @@ pagination_next: 'en/operations/utilities/clickhouse-copier' # List of tools and utilities -- [clickhouse-local](../../operations/utilities/clickhouse-local.md) — Allows running SQL queries on data without starting the ClickHouse server, similar to how `awk` does this. -- [clickhouse-copier](../../operations/utilities/clickhouse-copier.md) — Copies (and reshards) data from one cluster to another cluster. -- [clickhouse-benchmark](../../operations/utilities/clickhouse-benchmark.md) — Loads server with the custom queries and settings. -- [clickhouse-format](../../operations/utilities/clickhouse-format.md) — Enables formatting input queries. -- [ClickHouse obfuscator](../../operations/utilities/clickhouse-obfuscator.md) — Obfuscates data. -- [ClickHouse compressor](../../operations/utilities/clickhouse-compressor.md) — Compresses and decompresses data. -- [clickhouse-odbc-bridge](../../operations/utilities/odbc-bridge.md) — A proxy server for ODBC driver. +- [clickhouse-local](../../operations/utilities/clickhouse-local.md) — Allows running SQL queries on data without starting the ClickHouse server, similar to how `awk` does this. +- [clickhouse-copier](../../operations/utilities/clickhouse-copier.md) — Copies (and reshards) data from one cluster to another cluster. +- [clickhouse-benchmark](../../operations/utilities/clickhouse-benchmark.md) — Loads server with the custom queries and settings. +- [clickhouse-format](../../operations/utilities/clickhouse-format.md) — Enables formatting input queries. +- [ClickHouse obfuscator](../../operations/utilities/clickhouse-obfuscator.md) — Obfuscates data. +- [ClickHouse compressor](../../operations/utilities/clickhouse-compressor.md) — Compresses and decompresses data. +- [clickhouse-odbc-bridge](../../operations/utilities/odbc-bridge.md) — A proxy server for ODBC driver. diff --git a/docs/en/sql-reference/aggregate-functions/combinators.md b/docs/en/sql-reference/aggregate-functions/combinators.md index a28e58ca880..e1db5d8d23e 100644 --- a/docs/en/sql-reference/aggregate-functions/combinators.md +++ b/docs/en/sql-reference/aggregate-functions/combinators.md @@ -44,7 +44,7 @@ If you apply this combinator, the aggregate function returns the same value but **Arguments** -- `x` — Aggregate function parameters. +- `x` — Aggregate function parameters. **Returned values** @@ -72,11 +72,11 @@ If you apply this combinator, the aggregate function does not return the resulti To work with these states, use: -- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md) table engine. -- [finalizeAggregation](../../sql-reference/functions/other-functions.md#function-finalizeaggregation) function. -- [runningAccumulate](../../sql-reference/functions/other-functions.md#runningaccumulate) function. -- [-Merge](#aggregate_functions_combinators-merge) combinator. -- [-MergeState](#aggregate_functions_combinators-mergestate) combinator. +- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md) table engine. +- [finalizeAggregation](../../sql-reference/functions/other-functions.md#function-finalizeaggregation) function. +- [runningAccumulate](../../sql-reference/functions/other-functions.md#runningaccumulate) function. +- [-Merge](#aggregate_functions_combinators-merge) combinator. +- [-MergeState](#aggregate_functions_combinators-mergestate) combinator. ## -Merge @@ -111,7 +111,7 @@ If an aggregate function does not have input values, with this combinator it ret **Arguments** -- `x` — Aggregate function parameters. +- `x` — Aggregate function parameters. **Returned values** @@ -171,12 +171,12 @@ This combinator converts a result of an aggregate function to the [Nullable](../ **Arguments** -- `x` — Aggregate function parameters. +- `x` — Aggregate function parameters. **Returned values** -- The result of the aggregate function, converted to the `Nullable` data type. -- `NULL`, if there is nothing to aggregate. +- The result of the aggregate function, converted to the `Nullable` data type. +- `NULL`, if there is nothing to aggregate. Type: `Nullable(aggregate function return type)`. @@ -228,15 +228,15 @@ Lets you divide data into groups, and then separately aggregates the data in tho **Arguments** -- `start` — Starting value of the whole required interval for `resampling_key` values. -- `stop` — Ending value of the whole required interval for `resampling_key` values. The whole interval does not include the `stop` value `[start, stop)`. -- `step` — Step for separating the whole interval into subintervals. The `aggFunction` is executed over each of those subintervals independently. -- `resampling_key` — Column whose values are used for separating data into intervals. -- `aggFunction_params` — `aggFunction` parameters. +- `start` — Starting value of the whole required interval for `resampling_key` values. +- `stop` — Ending value of the whole required interval for `resampling_key` values. The whole interval does not include the `stop` value `[start, stop)`. +- `step` — Step for separating the whole interval into subintervals. The `aggFunction` is executed over each of those subintervals independently. +- `resampling_key` — Column whose values are used for separating data into intervals. +- `aggFunction_params` — `aggFunction` parameters. **Returned values** -- Array of `aggFunction` results for each subinterval. +- Array of `aggFunction` results for each subinterval. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/index.md b/docs/en/sql-reference/aggregate-functions/index.md index 56a55c6b7a0..8951ac4ee6a 100644 --- a/docs/en/sql-reference/aggregate-functions/index.md +++ b/docs/en/sql-reference/aggregate-functions/index.md @@ -10,8 +10,8 @@ Aggregate functions work in the [normal](http://www.sql-tutorial.com/sql-aggrega ClickHouse also supports: -- [Parametric aggregate functions](../../sql-reference/aggregate-functions/parametric-functions.md#aggregate_functions_parametric), which accept other parameters in addition to columns. -- [Combinators](../../sql-reference/aggregate-functions/combinators.md#aggregate_functions_combinators), which change the behavior of aggregate functions. +- [Parametric aggregate functions](../../sql-reference/aggregate-functions/parametric-functions.md#aggregate_functions_parametric), which accept other parameters in addition to columns. +- [Combinators](../../sql-reference/aggregate-functions/combinators.md#aggregate_functions_combinators), which change the behavior of aggregate functions. ## NULL Processing diff --git a/docs/en/sql-reference/aggregate-functions/parametric-functions.md b/docs/en/sql-reference/aggregate-functions/parametric-functions.md index 3b874dbe7cd..5b0b33b7ec9 100644 --- a/docs/en/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/en/sql-reference/aggregate-functions/parametric-functions.md @@ -28,7 +28,7 @@ The functions uses [A Streaming Parallel Decision Tree Algorithm](http://jmlr.or **Returned values** -- [Array](../../sql-reference/data-types/array.md) of [Tuples](../../sql-reference/data-types/tuple.md) of the following format: +- [Array](../../sql-reference/data-types/array.md) of [Tuples](../../sql-reference/data-types/tuple.md) of the following format: ``` [(lower_1, upper_1, height_1), ... (lower_N, upper_N, height_N)] @@ -96,29 +96,29 @@ Events that occur at the same second may lay in the sequence in an undefined ord **Arguments** -- `timestamp` — Column considered to contain time data. Typical data types are `Date` and `DateTime`. You can also use any of the supported [UInt](../../sql-reference/data-types/int-uint.md) data types. +- `timestamp` — Column considered to contain time data. Typical data types are `Date` and `DateTime`. You can also use any of the supported [UInt](../../sql-reference/data-types/int-uint.md) data types. -- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. You can pass up to 32 condition arguments. The function takes only the events described in these conditions into account. If the sequence contains data that isn’t described in a condition, the function skips them. +- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. You can pass up to 32 condition arguments. The function takes only the events described in these conditions into account. If the sequence contains data that isn’t described in a condition, the function skips them. **Parameters** -- `pattern` — Pattern string. See [Pattern syntax](#sequence-function-pattern-syntax). +- `pattern` — Pattern string. See [Pattern syntax](#sequence-function-pattern-syntax). **Returned values** -- 1, if the pattern is matched. -- 0, if the pattern isn’t matched. +- 1, if the pattern is matched. +- 0, if the pattern isn’t matched. Type: `UInt8`. **Pattern syntax** -- `(?N)` — Matches the condition argument at position `N`. Conditions are numbered in the `[1, 32]` range. For example, `(?1)` matches the argument passed to the `cond1` parameter. +- `(?N)` — Matches the condition argument at position `N`. Conditions are numbered in the `[1, 32]` range. For example, `(?1)` matches the argument passed to the `cond1` parameter. -- `.*` — Matches any number of events. You do not need conditional arguments to match this element of the pattern. +- `.*` — Matches any number of events. You do not need conditional arguments to match this element of the pattern. -- `(?t operator value)` — Sets the time in seconds that should separate two events. For example, pattern `(?1)(?t>1800)(?2)` matches events that occur more than 1800 seconds from each other. An arbitrary number of any events can lay between these events. You can use the `>=`, `>`, `<`, `<=`, `==` operators. +- `(?t operator value)` — Sets the time in seconds that should separate two events. For example, pattern `(?1)(?t>1800)(?2)` matches events that occur more than 1800 seconds from each other. An arbitrary number of any events can lay between these events. You can use the `>=`, `>`, `<`, `<=`, `==` operators. **Examples** @@ -170,7 +170,7 @@ SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM **See Also** -- [sequenceCount](#function-sequencecount) +- [sequenceCount](#function-sequencecount) ## sequenceCount(pattern)(time, cond1, cond2, …) @@ -186,17 +186,17 @@ sequenceCount(pattern)(timestamp, cond1, cond2, ...) **Arguments** -- `timestamp` — Column considered to contain time data. Typical data types are `Date` and `DateTime`. You can also use any of the supported [UInt](../../sql-reference/data-types/int-uint.md) data types. +- `timestamp` — Column considered to contain time data. Typical data types are `Date` and `DateTime`. You can also use any of the supported [UInt](../../sql-reference/data-types/int-uint.md) data types. -- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. You can pass up to 32 condition arguments. The function takes only the events described in these conditions into account. If the sequence contains data that isn’t described in a condition, the function skips them. +- `cond1`, `cond2` — Conditions that describe the chain of events. Data type: `UInt8`. You can pass up to 32 condition arguments. The function takes only the events described in these conditions into account. If the sequence contains data that isn’t described in a condition, the function skips them. **Parameters** -- `pattern` — Pattern string. See [Pattern syntax](#sequence-function-pattern-syntax). +- `pattern` — Pattern string. See [Pattern syntax](#sequence-function-pattern-syntax). **Returned values** -- Number of non-overlapping event chains that are matched. +- Number of non-overlapping event chains that are matched. Type: `UInt64`. @@ -229,7 +229,7 @@ SELECT sequenceCount('(?1).*(?2)')(time, number = 1, number = 2) FROM t **See Also** -- [sequenceMatch](#function-sequencematch) +- [sequenceMatch](#function-sequencematch) ## windowFunnel @@ -237,11 +237,11 @@ Searches for event chains in a sliding time window and calculates the maximum nu The function works according to the algorithm: -- The function searches for data that triggers the first condition in the chain and sets the event counter to 1. This is the moment when the sliding window starts. +- The function searches for data that triggers the first condition in the chain and sets the event counter to 1. This is the moment when the sliding window starts. -- If events from the chain occur sequentially within the window, the counter is incremented. If the sequence of events is disrupted, the counter isn’t incremented. +- If events from the chain occur sequentially within the window, the counter is incremented. If the sequence of events is disrupted, the counter isn’t incremented. -- If the data has multiple event chains at varying points of completion, the function will only output the size of the longest chain. +- If the data has multiple event chains at varying points of completion, the function will only output the size of the longest chain. **Syntax** @@ -251,16 +251,16 @@ windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN) **Arguments** -- `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) and other unsigned integer types (note that even though timestamp supports the `UInt64` type, it’s value can’t exceed the Int64 maximum, which is 2^63 - 1). -- `cond` — Conditions or data describing the chain of events. [UInt8](../../sql-reference/data-types/int-uint.md). +- `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) and other unsigned integer types (note that even though timestamp supports the `UInt64` type, it’s value can’t exceed the Int64 maximum, which is 2^63 - 1). +- `cond` — Conditions or data describing the chain of events. [UInt8](../../sql-reference/data-types/int-uint.md). **Parameters** -- `window` — Length of the sliding window, it is the time interval between the first and the last condition. The unit of `window` depends on the `timestamp` itself and varies. Determined using the expression `timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`. -- `mode` — It is an optional argument. One or more modes can be set. - - `'strict_deduplication'` — If the same condition holds for the sequence of events, then such repeating event interrupts further processing. - - `'strict_order'` — Don't allow interventions of other events. E.g. in the case of `A->B->D->C`, it stops finding `A->B->C` at the `D` and the max event level is 2. - - `'strict_increase'` — Apply conditions only to events with strictly increasing timestamps. +- `window` — Length of the sliding window, it is the time interval between the first and the last condition. The unit of `window` depends on the `timestamp` itself and varies. Determined using the expression `timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`. +- `mode` — It is an optional argument. One or more modes can be set. + - `'strict_deduplication'` — If the same condition holds for the sequence of events, then such repeating event interrupts further processing. + - `'strict_order'` — Don't allow interventions of other events. E.g. in the case of `A->B->D->C`, it stops finding `A->B->C` at the `D` and the max event level is 2. + - `'strict_increase'` — Apply conditions only to events with strictly increasing timestamps. **Returned value** @@ -341,14 +341,14 @@ retention(cond1, cond2, ..., cond32); **Arguments** -- `cond` — An expression that returns a `UInt8` result (1 or 0). +- `cond` — An expression that returns a `UInt8` result (1 or 0). **Returned value** The array of 1 or 0. -- 1 — Condition was met for the event. -- 0 — Condition wasn’t met for the event. +- 1 — Condition was met for the event. +- 0 — Condition wasn’t met for the event. Type: `UInt8`. @@ -481,9 +481,9 @@ Result: Where: -- `r1`- the number of unique visitors who visited the site during 2020-01-01 (the `cond1` condition). -- `r2`- the number of unique visitors who visited the site during a specific time period between 2020-01-01 and 2020-01-02 (`cond1` and `cond2` conditions). -- `r3`- the number of unique visitors who visited the site during a specific time period between 2020-01-01 and 2020-01-03 (`cond1` and `cond3` conditions). +- `r1`- the number of unique visitors who visited the site during 2020-01-01 (the `cond1` condition). +- `r2`- the number of unique visitors who visited the site during a specific time period between 2020-01-01 and 2020-01-02 (`cond1` and `cond2` conditions). +- `r3`- the number of unique visitors who visited the site during a specific time period between 2020-01-01 and 2020-01-03 (`cond1` and `cond3` conditions). ## uniqUpTo(N)(x) @@ -524,11 +524,11 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event **Parameters** -- `direction` — Used to navigate to directions. +- `direction` — Used to navigate to directions. - forward — Moving forward. - backward — Moving backward. -- `base` — Used to set the base point. +- `base` — Used to set the base point. - head — Set the base point to the first event. - tail — Set the base point to the last event. - first_match — Set the base point to the first matched `event1`. @@ -536,10 +536,10 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event **Arguments** -- `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) and other unsigned integer types. -- `event_column` — Name of the column containing the value of the next event to be returned. Data types supported: [String](../../sql-reference/data-types/string.md) and [Nullable(String)](../../sql-reference/data-types/nullable.md). -- `base_condition` — Condition that the base point must fulfill. -- `event1`, `event2`, ... — Conditions describing the chain of events. [UInt8](../../sql-reference/data-types/int-uint.md). +- `timestamp` — Name of the column containing the timestamp. Data types supported: [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) and other unsigned integer types. +- `event_column` — Name of the column containing the value of the next event to be returned. Data types supported: [String](../../sql-reference/data-types/string.md) and [Nullable(String)](../../sql-reference/data-types/nullable.md). +- `base_condition` — Condition that the base point must fulfill. +- `event1`, `event2`, ... — Conditions describing the chain of events. [UInt8](../../sql-reference/data-types/int-uint.md). **Returned values** diff --git a/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md b/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md index 88a56463de1..9fbc21910f8 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md +++ b/docs/en/sql-reference/aggregate-functions/reference/anyheavy.md @@ -13,7 +13,7 @@ anyHeavy(column) **Arguments** -- `column` – The column name. +- `column` – The column name. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/argmax.md b/docs/en/sql-reference/aggregate-functions/reference/argmax.md index 7b99c831010..65c43ab04c0 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/argmax.md +++ b/docs/en/sql-reference/aggregate-functions/reference/argmax.md @@ -15,12 +15,12 @@ argMax(arg, val) **Arguments** -- `arg` — Argument. -- `val` — Value. +- `arg` — Argument. +- `val` — Value. **Returned value** -- `arg` value that corresponds to maximum `val` value. +- `arg` value that corresponds to maximum `val` value. Type: matches `arg` type. diff --git a/docs/en/sql-reference/aggregate-functions/reference/argmin.md b/docs/en/sql-reference/aggregate-functions/reference/argmin.md index 945dda5e46d..a7c21e3f15b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/argmin.md +++ b/docs/en/sql-reference/aggregate-functions/reference/argmin.md @@ -15,12 +15,12 @@ argMin(arg, val) **Arguments** -- `arg` — Argument. -- `val` — Value. +- `arg` — Argument. +- `val` — Value. **Returned value** -- `arg` value that corresponds to minimum `val` value. +- `arg` value that corresponds to minimum `val` value. Type: matches `arg` type. diff --git a/docs/en/sql-reference/aggregate-functions/reference/avg.md b/docs/en/sql-reference/aggregate-functions/reference/avg.md index dd37fe62b95..5463d8a1874 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/avg.md +++ b/docs/en/sql-reference/aggregate-functions/reference/avg.md @@ -15,12 +15,12 @@ avg(x) **Arguments** -- `x` — input values, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). +- `x` — input values, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). **Returned value** -- The arithmetic mean, always as [Float64](../../../sql-reference/data-types/float.md). -- `NaN` if the input parameter `x` is empty. +- The arithmetic mean, always as [Float64](../../../sql-reference/data-types/float.md). +- `NaN` if the input parameter `x` is empty. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md b/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md index 00dffdc33d2..99d3bac763d 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/avgweighted.md @@ -15,8 +15,8 @@ avgWeighted(x, weight) **Arguments** -- `x` — Values. -- `weight` — Weights of the values. +- `x` — Values. +- `weight` — Weights of the values. `x` and `weight` must both be [Integer](../../../sql-reference/data-types/int-uint.md), @@ -26,8 +26,8 @@ but may have different types. **Returned value** -- `NaN` if all the weights are equal to 0 or the supplied weights parameter is empty. -- Weighted mean otherwise. +- `NaN` if all the weights are equal to 0 or the supplied weights parameter is empty. +- Weighted mean otherwise. **Return type** is always [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/contingency.md b/docs/en/sql-reference/aggregate-functions/reference/contingency.md index 9e89e99e66d..e87b03196d7 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/contingency.md +++ b/docs/en/sql-reference/aggregate-functions/reference/contingency.md @@ -16,7 +16,7 @@ contingency(column1, column2) **Arguments** -- `column1` and `column2` are the columns to be compared +- `column1` and `column2` are the columns to be compared **Returned value** diff --git a/docs/en/sql-reference/aggregate-functions/reference/count.md b/docs/en/sql-reference/aggregate-functions/reference/count.md index 356f731ff16..a98c8e50174 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/count.md +++ b/docs/en/sql-reference/aggregate-functions/reference/count.md @@ -9,20 +9,20 @@ Counts the number of rows or not-NULL values. ClickHouse supports the following syntaxes for `count`: -- `count(expr)` or `COUNT(DISTINCT expr)`. -- `count()` or `COUNT(*)`. The `count()` syntax is ClickHouse-specific. +- `count(expr)` or `COUNT(DISTINCT expr)`. +- `count()` or `COUNT(*)`. The `count()` syntax is ClickHouse-specific. **Arguments** The function can take: -- Zero parameters. -- One [expression](../../../sql-reference/syntax.md#syntax-expressions). +- Zero parameters. +- One [expression](../../../sql-reference/syntax.md#syntax-expressions). **Returned value** -- If the function is called without parameters it counts the number of rows. -- If the [expression](../../../sql-reference/syntax.md#syntax-expressions) is passed, then the function counts how many times this expression returned not null. If the expression returns a [Nullable](../../../sql-reference/data-types/nullable.md)-type value, then the result of `count` stays not `Nullable`. The function returns 0 if the expression returned `NULL` for all the rows. +- If the function is called without parameters it counts the number of rows. +- If the [expression](../../../sql-reference/syntax.md#syntax-expressions) is passed, then the function counts how many times this expression returned not null. If the expression returns a [Nullable](../../../sql-reference/data-types/nullable.md)-type value, then the result of `count` stays not `Nullable`. The function returns 0 if the expression returned `NULL` for all the rows. In both cases the type of the returned value is [UInt64](../../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/cramersv.md b/docs/en/sql-reference/aggregate-functions/reference/cramersv.md index fa37e3b5781..45e3758631b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/cramersv.md +++ b/docs/en/sql-reference/aggregate-functions/reference/cramersv.md @@ -15,7 +15,7 @@ cramersV(column1, column2) **Arguments** -- `column1` and `column2` are the columns to be compared +- `column1` and `column2` are the columns to be compared **Returned value** diff --git a/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md b/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md index 651b5e7b5a2..718fe733e84 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md +++ b/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md @@ -18,7 +18,7 @@ cramersVBiasCorrected(column1, column2) **Arguments** -- `column1` and `column2` are the columns to be compared +- `column1` and `column2` are the columns to be compared **Returned value** diff --git a/docs/en/sql-reference/aggregate-functions/reference/deltasum.md b/docs/en/sql-reference/aggregate-functions/reference/deltasum.md index d5d9e9369a4..37d9d08cbdb 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/deltasum.md +++ b/docs/en/sql-reference/aggregate-functions/reference/deltasum.md @@ -19,7 +19,7 @@ deltaSum(value) **Arguments** -- `value` — Input values, must be [Integer](../../data-types/int-uint.md) or [Float](../../data-types/float.md) type. +- `value` — Input values, must be [Integer](../../data-types/int-uint.md) or [Float](../../data-types/float.md) type. **Returned value** @@ -71,4 +71,4 @@ Result: ## See Also -- [runningDifference](../../functions/other-functions.md#other_functions-runningdifference) +- [runningDifference](../../functions/other-functions.md#other_functions-runningdifference) diff --git a/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md b/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md index afcf2a48c23..c51d86389b0 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md +++ b/docs/en/sql-reference/aggregate-functions/reference/deltasumtimestamp.md @@ -18,12 +18,12 @@ deltaSumTimestamp(value, timestamp) **Arguments** -- `value` — Input values, must be some [Integer](../../data-types/int-uint.md) type or [Float](../../data-types/float.md) type or a [Date](../../data-types/date.md) or [DateTime](../../data-types/datetime.md). -- `timestamp` — The parameter for order values, must be some [Integer](../../data-types/int-uint.md) type or [Float](../../data-types/float.md) type or a [Date](../../data-types/date.md) or [DateTime](../../data-types/datetime.md). +- `value` — Input values, must be some [Integer](../../data-types/int-uint.md) type or [Float](../../data-types/float.md) type or a [Date](../../data-types/date.md) or [DateTime](../../data-types/datetime.md). +- `timestamp` — The parameter for order values, must be some [Integer](../../data-types/int-uint.md) type or [Float](../../data-types/float.md) type or a [Date](../../data-types/date.md) or [DateTime](../../data-types/datetime.md). **Returned value** -- Accumulated differences between consecutive values, ordered by the `timestamp` parameter. +- Accumulated differences between consecutive values, ordered by the `timestamp` parameter. Type: [Integer](../../data-types/int-uint.md) or [Float](../../data-types/float.md) or [Date](../../data-types/date.md) or [DateTime](../../data-types/datetime.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/entropy.md b/docs/en/sql-reference/aggregate-functions/reference/entropy.md index d86f4f4197a..fc8d627ecab 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/entropy.md +++ b/docs/en/sql-reference/aggregate-functions/reference/entropy.md @@ -15,11 +15,11 @@ entropy(val) **Arguments** -- `val` — Column of values of any type. +- `val` — Column of values of any type. **Returned value** -- Shannon entropy. +- Shannon entropy. Type: [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md b/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md index 5d82d3575fc..a8203c6b3f4 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md +++ b/docs/en/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md @@ -18,12 +18,12 @@ Each `value` corresponds to the determinate `timeunit`. The half-life `x` is the **Arguments** -- `value` — Value. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). -- `timeunit` — Timeunit. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). Timeunit is not timestamp (seconds), it's -- an index of the time interval. Can be calculated using [intDiv](../../functions/arithmetic-functions.md#intdiva-b). +- `value` — Value. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `timeunit` — Timeunit. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). Timeunit is not timestamp (seconds), it's -- an index of the time interval. Can be calculated using [intDiv](../../functions/arithmetic-functions.md#intdiva-b). **Parameters** -- `x` — Half-life period. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `x` — Half-life period. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). **Returned values** diff --git a/docs/en/sql-reference/aggregate-functions/reference/grouparrayinsertat.md b/docs/en/sql-reference/aggregate-functions/reference/grouparrayinsertat.md index aafa643a972..d745e8a0e7a 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/grouparrayinsertat.md +++ b/docs/en/sql-reference/aggregate-functions/reference/grouparrayinsertat.md @@ -15,19 +15,19 @@ groupArrayInsertAt(default_x, size)(x, pos) If in one query several values are inserted into the same position, the function behaves in the following ways: -- If a query is executed in a single thread, the first one of the inserted values is used. -- If a query is executed in multiple threads, the resulting value is an undetermined one of the inserted values. +- If a query is executed in a single thread, the first one of the inserted values is used. +- If a query is executed in multiple threads, the resulting value is an undetermined one of the inserted values. **Arguments** -- `x` — Value to be inserted. [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in one of the [supported data types](../../../sql-reference/data-types/index.md). -- `pos` — Position at which the specified element `x` is to be inserted. Index numbering in the array starts from zero. [UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges). -- `default_x` — Default value for substituting in empty positions. Optional parameter. [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in the data type configured for the `x` parameter. If `default_x` is not defined, the [default values](../../../sql-reference/statements/create/table.md#create-default-values) are used. -- `size` — Length of the resulting array. Optional parameter. When using this parameter, the default value `default_x` must be specified. [UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges). +- `x` — Value to be inserted. [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in one of the [supported data types](../../../sql-reference/data-types/index.md). +- `pos` — Position at which the specified element `x` is to be inserted. Index numbering in the array starts from zero. [UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges). +- `default_x` — Default value for substituting in empty positions. Optional parameter. [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in the data type configured for the `x` parameter. If `default_x` is not defined, the [default values](../../../sql-reference/statements/create/table.md#create-default-values) are used. +- `size` — Length of the resulting array. Optional parameter. When using this parameter, the default value `default_x` must be specified. [UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges). **Returned value** -- Array with inserted values. +- Array with inserted values. Type: [Array](../../../sql-reference/data-types/array.md#data-type-array). diff --git a/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingavg.md b/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingavg.md index 8fa1939e7d3..32c0608afeb 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingavg.md +++ b/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingavg.md @@ -16,12 +16,12 @@ The function can take the window size as a parameter. If left unspecified, the f **Arguments** -- `numbers_for_summing` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in a numeric data type value. -- `window_size` — Size of the calculation window. +- `numbers_for_summing` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in a numeric data type value. +- `window_size` — Size of the calculation window. **Returned values** -- Array of the same size and type as the input data. +- Array of the same size and type as the input data. The function uses [rounding towards zero](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero). It truncates the decimal places insignificant for the resulting data type. diff --git a/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingsum.md b/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingsum.md index a51857418c6..6f2a60dd080 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingsum.md +++ b/docs/en/sql-reference/aggregate-functions/reference/grouparraymovingsum.md @@ -16,12 +16,12 @@ The function can take the window size as a parameter. If left unspecified, the f **Arguments** -- `numbers_for_summing` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in a numeric data type value. -- `window_size` — Size of the calculation window. +- `numbers_for_summing` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) resulting in a numeric data type value. +- `window_size` — Size of the calculation window. **Returned values** -- Array of the same size and type as the input data. +- Array of the same size and type as the input data. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md b/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md index 26c41c6636b..393087161df 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md +++ b/docs/en/sql-reference/aggregate-functions/reference/grouparraysample.md @@ -15,13 +15,13 @@ groupArraySample(max_size[, seed])(x) **Arguments** -- `max_size` — Maximum size of the resulting array. [UInt64](../../data-types/int-uint.md). -- `seed` — Seed for the random number generator. Optional. [UInt64](../../data-types/int-uint.md). Default value: `123456`. -- `x` — Argument (column name or expression). +- `max_size` — Maximum size of the resulting array. [UInt64](../../data-types/int-uint.md). +- `seed` — Seed for the random number generator. Optional. [UInt64](../../data-types/int-uint.md). Default value: `123456`. +- `x` — Argument (column name or expression). **Returned values** -- Array of randomly selected `x` arguments. +- Array of randomly selected `x` arguments. Type: [Array](../../data-types/array.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/index.md b/docs/en/sql-reference/aggregate-functions/reference/index.md index bd8e72e0fec..e25e3a54356 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/index.md +++ b/docs/en/sql-reference/aggregate-functions/reference/index.md @@ -9,75 +9,75 @@ toc_hidden: true Standard aggregate functions: -- [count](../../../sql-reference/aggregate-functions/reference/count.md) -- [min](../../../sql-reference/aggregate-functions/reference/min.md) -- [max](../../../sql-reference/aggregate-functions/reference/max.md) -- [sum](../../../sql-reference/aggregate-functions/reference/sum.md) -- [avg](../../../sql-reference/aggregate-functions/reference/avg.md) -- [any](../../../sql-reference/aggregate-functions/reference/any.md) -- [stddevPop](../../../sql-reference/aggregate-functions/reference/stddevpop.md) -- [stddevSamp](../../../sql-reference/aggregate-functions/reference/stddevsamp.md) -- [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) -- [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) -- [covarPop](../../../sql-reference/aggregate-functions/reference/covarpop.md) -- [covarSamp](../../../sql-reference/aggregate-functions/reference/covarsamp.md) +- [count](../../../sql-reference/aggregate-functions/reference/count.md) +- [min](../../../sql-reference/aggregate-functions/reference/min.md) +- [max](../../../sql-reference/aggregate-functions/reference/max.md) +- [sum](../../../sql-reference/aggregate-functions/reference/sum.md) +- [avg](../../../sql-reference/aggregate-functions/reference/avg.md) +- [any](../../../sql-reference/aggregate-functions/reference/any.md) +- [stddevPop](../../../sql-reference/aggregate-functions/reference/stddevpop.md) +- [stddevSamp](../../../sql-reference/aggregate-functions/reference/stddevsamp.md) +- [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) +- [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) +- [covarPop](../../../sql-reference/aggregate-functions/reference/covarpop.md) +- [covarSamp](../../../sql-reference/aggregate-functions/reference/covarsamp.md) ClickHouse-specific aggregate functions: -- [anyHeavy](../../../sql-reference/aggregate-functions/reference/anyheavy.md) -- [anyLast](../../../sql-reference/aggregate-functions/reference/anylast.md) -- [argMin](../../../sql-reference/aggregate-functions/reference/argmin.md) -- [argMax](../../../sql-reference/aggregate-functions/reference/argmax.md) -- [avgWeighted](../../../sql-reference/aggregate-functions/reference/avgweighted.md) -- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) -- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) -- [groupArray](../../../sql-reference/aggregate-functions/reference/grouparray.md) -- [groupArrayLast](../../../sql-reference/aggregate-functions/reference/grouparraylast.md) -- [groupUniqArray](../../../sql-reference/aggregate-functions/reference/groupuniqarray.md) -- [groupArrayInsertAt](../../../sql-reference/aggregate-functions/reference/grouparrayinsertat.md) -- [groupArrayMovingAvg](../../../sql-reference/aggregate-functions/reference/grouparraymovingavg.md) -- [groupArrayMovingSum](../../../sql-reference/aggregate-functions/reference/grouparraymovingsum.md) -- [groupBitAnd](../../../sql-reference/aggregate-functions/reference/groupbitand.md) -- [groupBitOr](../../../sql-reference/aggregate-functions/reference/groupbitor.md) -- [groupBitXor](../../../sql-reference/aggregate-functions/reference/groupbitxor.md) -- [groupBitmap](../../../sql-reference/aggregate-functions/reference/groupbitmap.md) -- [groupBitmapAnd](../../../sql-reference/aggregate-functions/reference/groupbitmapand.md) -- [groupBitmapOr](../../../sql-reference/aggregate-functions/reference/groupbitmapor.md) -- [groupBitmapXor](../../../sql-reference/aggregate-functions/reference/groupbitmapxor.md) -- [sumWithOverflow](../../../sql-reference/aggregate-functions/reference/sumwithoverflow.md) -- [sumMap](../../../sql-reference/aggregate-functions/reference/summap.md) -- [minMap](../../../sql-reference/aggregate-functions/reference/minmap.md) -- [maxMap](../../../sql-reference/aggregate-functions/reference/maxmap.md) -- [skewSamp](../../../sql-reference/aggregate-functions/reference/skewsamp.md) -- [skewPop](../../../sql-reference/aggregate-functions/reference/skewpop.md) -- [kurtSamp](../../../sql-reference/aggregate-functions/reference/kurtsamp.md) -- [kurtPop](../../../sql-reference/aggregate-functions/reference/kurtpop.md) -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md) -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md) -- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md) -- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md) -- [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md) -- [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md) -- [quantileExactLow](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactlow) -- [quantileExactHigh](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexacthigh) -- [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md) -- [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md) -- [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md) -- [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md) -- [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md) -- [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md) -- [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16) -- [quantileBFloat16Weighted](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16weighted) -- [simpleLinearRegression](../../../sql-reference/aggregate-functions/reference/simplelinearregression.md) -- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md) -- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md) -- [categoricalInformationValue](../../../sql-reference/aggregate-functions/reference/categoricalinformationvalue.md) -- [contingency](./contingency.md) -- [cramersV](./cramersv.md) -- [cramersVBiasCorrected](./cramersvbiascorrected.md) -- [theilsU](./theilsu.md) -- [maxIntersections](./maxintersections.md) -- [maxIntersectionsPosition](./maxintersectionsposition.md) +- [anyHeavy](../../../sql-reference/aggregate-functions/reference/anyheavy.md) +- [anyLast](../../../sql-reference/aggregate-functions/reference/anylast.md) +- [argMin](../../../sql-reference/aggregate-functions/reference/argmin.md) +- [argMax](../../../sql-reference/aggregate-functions/reference/argmax.md) +- [avgWeighted](../../../sql-reference/aggregate-functions/reference/avgweighted.md) +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) +- [groupArray](../../../sql-reference/aggregate-functions/reference/grouparray.md) +- [groupArrayLast](../../../sql-reference/aggregate-functions/reference/grouparraylast.md) +- [groupUniqArray](../../../sql-reference/aggregate-functions/reference/groupuniqarray.md) +- [groupArrayInsertAt](../../../sql-reference/aggregate-functions/reference/grouparrayinsertat.md) +- [groupArrayMovingAvg](../../../sql-reference/aggregate-functions/reference/grouparraymovingavg.md) +- [groupArrayMovingSum](../../../sql-reference/aggregate-functions/reference/grouparraymovingsum.md) +- [groupBitAnd](../../../sql-reference/aggregate-functions/reference/groupbitand.md) +- [groupBitOr](../../../sql-reference/aggregate-functions/reference/groupbitor.md) +- [groupBitXor](../../../sql-reference/aggregate-functions/reference/groupbitxor.md) +- [groupBitmap](../../../sql-reference/aggregate-functions/reference/groupbitmap.md) +- [groupBitmapAnd](../../../sql-reference/aggregate-functions/reference/groupbitmapand.md) +- [groupBitmapOr](../../../sql-reference/aggregate-functions/reference/groupbitmapor.md) +- [groupBitmapXor](../../../sql-reference/aggregate-functions/reference/groupbitmapxor.md) +- [sumWithOverflow](../../../sql-reference/aggregate-functions/reference/sumwithoverflow.md) +- [sumMap](../../../sql-reference/aggregate-functions/reference/summap.md) +- [minMap](../../../sql-reference/aggregate-functions/reference/minmap.md) +- [maxMap](../../../sql-reference/aggregate-functions/reference/maxmap.md) +- [skewSamp](../../../sql-reference/aggregate-functions/reference/skewsamp.md) +- [skewPop](../../../sql-reference/aggregate-functions/reference/skewpop.md) +- [kurtSamp](../../../sql-reference/aggregate-functions/reference/kurtsamp.md) +- [kurtPop](../../../sql-reference/aggregate-functions/reference/kurtpop.md) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md) +- [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md) +- [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md) +- [quantileExactLow](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactlow) +- [quantileExactHigh](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexacthigh) +- [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md) +- [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md) +- [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md) +- [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md) +- [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md) +- [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md) +- [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16) +- [quantileBFloat16Weighted](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16weighted) +- [simpleLinearRegression](../../../sql-reference/aggregate-functions/reference/simplelinearregression.md) +- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md) +- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md) +- [categoricalInformationValue](../../../sql-reference/aggregate-functions/reference/categoricalinformationvalue.md) +- [contingency](./contingency.md) +- [cramersV](./cramersv.md) +- [cramersVBiasCorrected](./cramersvbiascorrected.md) +- [theilsU](./theilsu.md) +- [maxIntersections](./maxintersections.md) +- [maxIntersectionsPosition](./maxintersectionsposition.md) diff --git a/docs/en/sql-reference/aggregate-functions/reference/intervalLengthSum.md b/docs/en/sql-reference/aggregate-functions/reference/intervalLengthSum.md index e161a8c5754..5990345b765 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/intervalLengthSum.md +++ b/docs/en/sql-reference/aggregate-functions/reference/intervalLengthSum.md @@ -15,8 +15,8 @@ intervalLengthSum(start, end) **Arguments** -- `start` — The starting value of the interval. [Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) or [Date](../../../sql-reference/data-types/date.md#data_type-date). -- `end` — The ending value of the interval. [Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) or [Date](../../../sql-reference/data-types/date.md#data_type-date). +- `start` — The starting value of the interval. [Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) or [Date](../../../sql-reference/data-types/date.md#data_type-date). +- `end` — The ending value of the interval. [Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) or [Date](../../../sql-reference/data-types/date.md#data_type-date). :::note Arguments must be of the same data type. Otherwise, an exception will be thrown. @@ -24,7 +24,7 @@ Arguments must be of the same data type. Otherwise, an exception will be thrown. **Returned value** -- Total length of union of all ranges (segments on numeric axis). Depending on the type of the argument, the return value may be [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64) type. +- Total length of union of all ranges (segments on numeric axis). Depending on the type of the argument, the return value may be [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64) type. **Examples** diff --git a/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md b/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md index 70c75b898c6..af744f445d9 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/mannwhitneyutest.md @@ -19,23 +19,23 @@ The null hypothesis is that two populations are stochastically equal. Also one-s **Arguments** -- `sample_data` — sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). -- `sample_index` — sample index. [Integer](../../../sql-reference/data-types/int-uint.md). +- `sample_data` — sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `sample_index` — sample index. [Integer](../../../sql-reference/data-types/int-uint.md). **Parameters** -- `alternative` — alternative hypothesis. (Optional, default: `'two-sided'`.) [String](../../../sql-reference/data-types/string.md). - - `'two-sided'`; - - `'greater'`; - - `'less'`. -- `continuity_correction` — if not 0 then continuity correction in the normal approximation for the p-value is applied. (Optional, default: 1.) [UInt64](../../../sql-reference/data-types/int-uint.md). +- `alternative` — alternative hypothesis. (Optional, default: `'two-sided'`.) [String](../../../sql-reference/data-types/string.md). + - `'two-sided'`; + - `'greater'`; + - `'less'`. +- `continuity_correction` — if not 0 then continuity correction in the normal approximation for the p-value is applied. (Optional, default: 1.) [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** [Tuple](../../../sql-reference/data-types/tuple.md) with two elements: -- calculated U-statistic. [Float64](../../../sql-reference/data-types/float.md). -- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). +- calculated U-statistic. [Float64](../../../sql-reference/data-types/float.md). +- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -69,5 +69,5 @@ Result: **See Also** -- [Mann–Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test) -- [Stochastic ordering](https://en.wikipedia.org/wiki/Stochastic_ordering) +- [Mann–Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test) +- [Stochastic ordering](https://en.wikipedia.org/wiki/Stochastic_ordering) diff --git a/docs/en/sql-reference/aggregate-functions/reference/meanztest.md b/docs/en/sql-reference/aggregate-functions/reference/meanztest.md index 89742ca1509..1cf2bebf26f 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/meanztest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/meanztest.md @@ -19,23 +19,23 @@ The null hypothesis is that means of populations are equal. Normal distribution **Arguments** -- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). -- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). +- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). **Parameters** -- `population_variance_x` — Variance for population x. [Float](../../../sql-reference/data-types/float.md). -- `population_variance_y` — Variance for population y. [Float](../../../sql-reference/data-types/float.md). -- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). +- `population_variance_x` — Variance for population x. [Float](../../../sql-reference/data-types/float.md). +- `population_variance_y` — Variance for population y. [Float](../../../sql-reference/data-types/float.md). +- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). **Returned values** [Tuple](../../../sql-reference/data-types/tuple.md) with four elements: -- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). -- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). -- calculated confidence-interval-low. [Float64](../../../sql-reference/data-types/float.md). -- calculated confidence-interval-high. [Float64](../../../sql-reference/data-types/float.md). +- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). +- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). +- calculated confidence-interval-low. [Float64](../../../sql-reference/data-types/float.md). +- calculated confidence-interval-high. [Float64](../../../sql-reference/data-types/float.md). **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/median.md b/docs/en/sql-reference/aggregate-functions/reference/median.md index 5ac3c6ef721..f20b23a0c8b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/median.md +++ b/docs/en/sql-reference/aggregate-functions/reference/median.md @@ -9,15 +9,15 @@ The `median*` functions are the aliases for the corresponding `quantile*` functi Functions: -- `median` — Alias for [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile). -- `medianDeterministic` — Alias for [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md#quantiledeterministic). -- `medianExact` — Alias for [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact). -- `medianExactWeighted` — Alias for [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md#quantileexactweighted). -- `medianTiming` — Alias for [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming). -- `medianTimingWeighted` — Alias for [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md#quantiletimingweighted). -- `medianTDigest` — Alias for [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md#quantiletdigest). -- `medianTDigestWeighted` — Alias for [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md#quantiletdigestweighted). -- `medianBFloat16` — Alias for [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16). +- `median` — Alias for [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile). +- `medianDeterministic` — Alias for [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md#quantiledeterministic). +- `medianExact` — Alias for [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact). +- `medianExactWeighted` — Alias for [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md#quantileexactweighted). +- `medianTiming` — Alias for [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming). +- `medianTimingWeighted` — Alias for [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md#quantiletimingweighted). +- `medianTDigest` — Alias for [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md#quantiletdigest). +- `medianTDigestWeighted` — Alias for [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md#quantiletdigestweighted). +- `medianBFloat16` — Alias for [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16). **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantile.md b/docs/en/sql-reference/aggregate-functions/reference/quantile.md index 414574e00e6..91b6b1b0d80 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantile.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantile.md @@ -23,18 +23,18 @@ Alias: `median`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Approximate quantile of the specified level. +- Approximate quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -65,5 +65,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md b/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md index 21b9a3500c4..46096ca374e 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md @@ -19,23 +19,23 @@ Alias: `medianApprox`. **Arguments** -- `accuracy` — Accuracy of quantile. Constant positive integer. Larger accuracy value means less error. For example, if the accuracy argument is set to 100, the computed quantile will have an error no greater than 1% with high probability. There is a trade-off between the accuracy of the computed quantiles and the computational complexity of the algorithm. A larger accuracy requires more memory and computational resources to compute the quantile accurately, while a smaller accuracy argument allows for a faster and more memory-efficient computation but with a slightly lower accuracy. +- `accuracy` — Accuracy of quantile. Constant positive integer. Larger accuracy value means less error. For example, if the accuracy argument is set to 100, the computed quantile will have an error no greater than 1% with high probability. There is a trade-off between the accuracy of the computed quantiles and the computational complexity of the algorithm. A larger accuracy requires more memory and computational resources to compute the quantile accurately, while a smaller accuracy argument allows for a faster and more memory-efficient computation but with a slightly lower accuracy. -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Quantile of the specified level and accuracy. +- Quantile of the specified level and accuracy. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -72,5 +72,5 @@ FROM numbers(1000) **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md b/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md index 94feca9e69e..4377f2f1b17 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantilebfloat16.md @@ -18,15 +18,15 @@ Alias: `medianBFloat16` **Arguments** -- `expr` — Column with numeric data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md). +- `expr` — Column with numeric data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md). **Parameters** -- `level` — Level of quantile. Optional. Possible values are in the range from 0 to 1. Default value: 0.5. [Float](../../../sql-reference/data-types/float.md). +- `level` — Level of quantile. Optional. Possible values are in the range from 0 to 1. Default value: 0.5. [Float](../../../sql-reference/data-types/float.md). **Returned value** -- Approximate quantile of the specified level. +- Approximate quantile of the specified level. Type: [Float64](../../../sql-reference/data-types/float.md#float32-float64). @@ -64,5 +64,5 @@ Like `quantileBFloat16` but takes into account the weight of each sequence membe **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiledeterministic.md b/docs/en/sql-reference/aggregate-functions/reference/quantiledeterministic.md index 26826afd126..446d287f0d2 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiledeterministic.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiledeterministic.md @@ -21,19 +21,19 @@ Alias: `medianDeterministic`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). -- `determinator` — Number whose hash is used instead of a random number generator in the reservoir sampling algorithm to make the result of sampling deterministic. As a determinator you can use any deterministic positive number, for example, a user id or an event id. If the same determinator value occures too often, the function works incorrectly. +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `determinator` — Number whose hash is used instead of a random number generator in the reservoir sampling algorithm to make the result of sampling deterministic. As a determinator you can use any deterministic positive number, for example, a user id or an event id. If the same determinator value occures too often, the function works incorrectly. **Returned value** -- Approximate quantile of the specified level. +- Approximate quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -64,5 +64,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md b/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md index 04fe597a34e..d7d7413c283 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileexact.md @@ -23,18 +23,18 @@ Alias: `medianExact`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -82,18 +82,18 @@ Alias: `medianExactLow`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -132,18 +132,18 @@ Alias: `medianExactHigh`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -179,21 +179,21 @@ quantileExactExclusive(level)(expr) **Arguments** -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Parameters** -- `level` — Level of quantile. Optional. Possible values: (0, 1) — bounds not included. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). [Float](../../../sql-reference/data-types/float.md). +- `level` — Level of quantile. Optional. Possible values: (0, 1) — bounds not included. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). [Float](../../../sql-reference/data-types/float.md). **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -231,21 +231,21 @@ quantileExactInclusive(level)(expr) **Arguments** -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Parameters** -- `level` — Level of quantile. Optional. Possible values: [0, 1] — bounds included. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). [Float](../../../sql-reference/data-types/float.md). +- `level` — Level of quantile. Optional. Possible values: [0, 1] — bounds included. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). [Float](../../../sql-reference/data-types/float.md). **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -267,5 +267,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileexactweighted.md b/docs/en/sql-reference/aggregate-functions/reference/quantileexactweighted.md index 16e6438a3bf..34def8d7411 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileexactweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileexactweighted.md @@ -21,19 +21,19 @@ Alias: `medianExactWeighted`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). -- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -64,5 +64,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md b/docs/en/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md index 07fcd187217..41d2627fb7b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md @@ -21,19 +21,19 @@ Alias: `medianInterpolatedWeighted`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). -- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `weight` — Column with weights of sequence members. Weight is a number of value occurrences. **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -64,5 +64,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md index fe22ad7b048..77020ee6acc 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md @@ -29,21 +29,21 @@ quantilesExactExclusive(level1, level2, ...)(expr) **Arguments** -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Parameters** -- `level` — Levels of quantiles. Possible values: (0, 1) — bounds not included. [Float](../../../sql-reference/data-types/float.md). +- `level` — Levels of quantiles. Possible values: (0, 1) — bounds not included. [Float](../../../sql-reference/data-types/float.md). **Returned value** -- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. +- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. Type of array values: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -81,21 +81,21 @@ quantilesExactInclusive(level1, level2, ...)(expr) **Arguments** -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Parameters** -- `level` — Levels of quantiles. Possible values: [0, 1] — bounds included. [Float](../../../sql-reference/data-types/float.md). +- `level` — Levels of quantiles. Possible values: [0, 1] — bounds included. [Float](../../../sql-reference/data-types/float.md). **Returned value** -- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. +- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. Type of array values: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -127,13 +127,13 @@ quantilesApprox(accuracy, level1, level2, ...)(expr) **Returned value** -- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. +- [Array](../../../sql-reference/data-types/array.md) of quantiles of the specified levels. Type of array values: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiletdigest.md b/docs/en/sql-reference/aggregate-functions/reference/quantiletdigest.md index 5da37a4832f..796e87b02d8 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiletdigest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiletdigest.md @@ -23,18 +23,18 @@ Alias: `medianTDigest`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). **Returned value** -- Approximate quantile of the specified level. +- Approximate quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -54,5 +54,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md b/docs/en/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md index e7abe08e39f..7b9addbbdde 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md @@ -27,19 +27,19 @@ Alias: `medianTDigestWeighted`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). -- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `expr` — Expression over the column values resulting in numeric [data types](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) or [DateTime](../../../sql-reference/data-types/datetime.md). +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. **Returned value** -- Approximate quantile of the specified level. +- Approximate quantile of the specified level. Type: -- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. -- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. -- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. +- [Float64](../../../sql-reference/data-types/float.md) for numeric data type input. +- [Date](../../../sql-reference/data-types/date.md) if input values have the `Date` type. +- [DateTime](../../../sql-reference/data-types/datetime.md) if input values have the `DateTime` type. **Example** @@ -59,5 +59,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiletiming.md b/docs/en/sql-reference/aggregate-functions/reference/quantiletiming.md index ead381b4497..b5b1c8a0c01 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiletiming.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiletiming.md @@ -21,19 +21,19 @@ Alias: `medianTiming`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) over a column values returning a [Float\*](../../../sql-reference/data-types/float.md)-type number. +- `expr` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) over a column values returning a [Float\*](../../../sql-reference/data-types/float.md)-type number. - - If negative values are passed to the function, the behavior is undefined. - - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. + - If negative values are passed to the function, the behavior is undefined. + - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. **Accuracy** The calculation is accurate if: -- Total number of values does not exceed 5670. -- Total number of values exceeds 5670, but the page loading time is less than 1024ms. +- Total number of values does not exceed 5670. +- Total number of values exceeds 5670, but the page loading time is less than 1024ms. Otherwise, the result of the calculation is rounded to the nearest multiple of 16 ms. @@ -43,7 +43,7 @@ For calculating page loading time quantiles, this function is more effective and **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: `Float32`. @@ -85,5 +85,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiletimingweighted.md b/docs/en/sql-reference/aggregate-functions/reference/quantiletimingweighted.md index f65c6b1e6ec..df483aac01e 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiletimingweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiletimingweighted.md @@ -21,21 +21,21 @@ Alias: `medianTimingWeighted`. **Arguments** -- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). +- `level` — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a `level` value in the range of `[0.01, 0.99]`. Default value: 0.5. At `level=0.5` the function calculates [median](https://en.wikipedia.org/wiki/Median). -- `expr` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) over a column values returning a [Float\*](../../../sql-reference/data-types/float.md)-type number. +- `expr` — [Expression](../../../sql-reference/syntax.md#syntax-expressions) over a column values returning a [Float\*](../../../sql-reference/data-types/float.md)-type number. - If negative values are passed to the function, the behavior is undefined. - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000. -- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. +- `weight` — Column with weights of sequence elements. Weight is a number of value occurrences. **Accuracy** The calculation is accurate if: -- Total number of values does not exceed 5670. -- Total number of values exceeds 5670, but the page loading time is less than 1024ms. +- Total number of values does not exceed 5670. +- Total number of values exceeds 5670, but the page loading time is less than 1024ms. Otherwise, the result of the calculation is rounded to the nearest multiple of 16 ms. @@ -45,7 +45,7 @@ For calculating page loading time quantiles, this function is more effective and **Returned value** -- Quantile of the specified level. +- Quantile of the specified level. Type: `Float32`. @@ -118,5 +118,5 @@ Result: **See Also** -- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) -- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/en/sql-reference/aggregate-functions/reference/rankCorr.md b/docs/en/sql-reference/aggregate-functions/reference/rankCorr.md index 231eb2b091b..27f2dd124e4 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/rankCorr.md +++ b/docs/en/sql-reference/aggregate-functions/reference/rankCorr.md @@ -15,12 +15,12 @@ rankCorr(x, y) **Arguments** -- `x` — Arbitrary value. [Float32](../../../sql-reference/data-types/float.md#float32-float64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64). -- `y` — Arbitrary value. [Float32](../../../sql-reference/data-types/float.md#float32-float64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64). +- `x` — Arbitrary value. [Float32](../../../sql-reference/data-types/float.md#float32-float64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64). +- `y` — Arbitrary value. [Float32](../../../sql-reference/data-types/float.md#float32-float64) or [Float64](../../../sql-reference/data-types/float.md#float32-float64). **Returned value(s)** -- Returns a rank correlation coefficient of the ranks of x and y. The value of the correlation coefficient ranges from -1 to +1. If less than two arguments are passed, the function will return an exception. The value close to +1 denotes a high linear relationship, and with an increase of one random variable, the second random variable also increases. The value close to -1 denotes a high linear relationship, and with an increase of one random variable, the second random variable decreases. The value close or equal to 0 denotes no relationship between the two random variables. +- Returns a rank correlation coefficient of the ranks of x and y. The value of the correlation coefficient ranges from -1 to +1. If less than two arguments are passed, the function will return an exception. The value close to +1 denotes a high linear relationship, and with an increase of one random variable, the second random variable also increases. The value close to -1 denotes a high linear relationship, and with an increase of one random variable, the second random variable decreases. The value close or equal to 0 denotes no relationship between the two random variables. Type: [Float64](../../../sql-reference/data-types/float.md#float32-float64). @@ -55,4 +55,4 @@ Result: ``` **See Also** -- [Spearman's rank correlation coefficient](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient) \ No newline at end of file +- [Spearman's rank correlation coefficient](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient) \ No newline at end of file diff --git a/docs/en/sql-reference/aggregate-functions/reference/simplelinearregression.md b/docs/en/sql-reference/aggregate-functions/reference/simplelinearregression.md index a6380b78a79..bcff05ada47 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/simplelinearregression.md +++ b/docs/en/sql-reference/aggregate-functions/reference/simplelinearregression.md @@ -13,8 +13,8 @@ simpleLinearRegression(x, y) Parameters: -- `x` — Column with dependent variable values. -- `y` — Column with explanatory variable values. +- `x` — Column with dependent variable values. +- `y` — Column with explanatory variable values. Returned values: diff --git a/docs/en/sql-reference/aggregate-functions/reference/sparkbar.md b/docs/en/sql-reference/aggregate-functions/reference/sparkbar.md index 05ea373d4da..e21dad5b2f5 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sparkbar.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sparkbar.md @@ -21,18 +21,18 @@ sparkbar(buckets[, min_x, max_x])(x, y) **Parameters** -- `buckets` — The number of segments. Type: [Integer](../../../sql-reference/data-types/int-uint.md). -- `min_x` — The interval start. Optional parameter. -- `max_x` — The interval end. Optional parameter. +- `buckets` — The number of segments. Type: [Integer](../../../sql-reference/data-types/int-uint.md). +- `min_x` — The interval start. Optional parameter. +- `max_x` — The interval end. Optional parameter. **Arguments** -- `x` — The field with values. -- `y` — The field with the frequency of values. +- `x` — The field with values. +- `y` — The field with the frequency of values. **Returned value** -- The frequency histogram. +- The frequency histogram. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/stochasticlinearregression.md b/docs/en/sql-reference/aggregate-functions/reference/stochasticlinearregression.md index 8126a80e25e..9481172c25b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/stochasticlinearregression.md +++ b/docs/en/sql-reference/aggregate-functions/reference/stochasticlinearregression.md @@ -72,5 +72,5 @@ The query will return a column of predicted values. Note that first argument of **See Also** -- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#agg_functions-stochasticlogisticregression) -- [Difference between linear and logistic regressions](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) +- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#agg_functions-stochasticlogisticregression) +- [Difference between linear and logistic regressions](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) diff --git a/docs/en/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md b/docs/en/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md index 41eeb70c04f..0a040689681 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md +++ b/docs/en/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md @@ -52,5 +52,5 @@ stochasticLogisticRegression(1.0, 1.0, 10, 'SGD') **See Also** -- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md#agg_functions-stochasticlinearregression) -- [Difference between linear and logistic regressions.](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) +- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md#agg_functions-stochasticlinearregression) +- [Difference between linear and logistic regressions.](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) diff --git a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md index 5ce0c769576..29b43851f44 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/studentttest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/studentttest.md @@ -19,22 +19,22 @@ The null hypothesis is that means of populations are equal. Normal distribution **Arguments** -- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). -- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). +- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). **Parameters** -- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). +- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). **Returned values** [Tuple](../../../sql-reference/data-types/tuple.md) with two or four elements (if the optional `confidence_level` is specified): -- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). -- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). -- [calculated confidence-interval-low.] [Float64](../../../sql-reference/data-types/float.md). -- [calculated confidence-interval-high.] [Float64](../../../sql-reference/data-types/float.md). +- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). +- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). +- [calculated confidence-interval-low.] [Float64](../../../sql-reference/data-types/float.md). +- [calculated confidence-interval-high.] [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -68,5 +68,5 @@ Result: **See Also** -- [Student's t-test](https://en.wikipedia.org/wiki/Student%27s_t-test) -- [welchTTest function](welchttest.md#welchttest) +- [Student's t-test](https://en.wikipedia.org/wiki/Student%27s_t-test) +- [welchTTest function](welchttest.md#welchttest) diff --git a/docs/en/sql-reference/aggregate-functions/reference/sumcount.md b/docs/en/sql-reference/aggregate-functions/reference/sumcount.md index b7773b0d09b..a59b87022d6 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sumcount.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sumcount.md @@ -14,11 +14,11 @@ sumCount(x) **Arguments** -- `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). +- `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). **Returned value** -- Tuple `(sum, count)`, where `sum` is the sum of numbers and `count` is the number of rows with not-NULL values. +- Tuple `(sum, count)`, where `sum` is the sum of numbers and `count` is the number of rows with not-NULL values. Type: [Tuple](../../../sql-reference/data-types/tuple.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md index 3e0783e9ad2..3cb5f17b6bb 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md @@ -17,7 +17,7 @@ sumKahan(x) **Arguments** -- `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). +- `x` — Input value, must be [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md). **Returned value** diff --git a/docs/en/sql-reference/aggregate-functions/reference/theilsu.md b/docs/en/sql-reference/aggregate-functions/reference/theilsu.md index f2103d7862b..9a56f9832d8 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/theilsu.md +++ b/docs/en/sql-reference/aggregate-functions/reference/theilsu.md @@ -16,7 +16,7 @@ theilsU(column1, column2) **Arguments** -- `column1` and `column2` are the columns to be compared +- `column1` and `column2` are the columns to be compared **Returned value** diff --git a/docs/en/sql-reference/aggregate-functions/reference/topk.md b/docs/en/sql-reference/aggregate-functions/reference/topk.md index b025f6f6d54..bde29275f79 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/topk.md +++ b/docs/en/sql-reference/aggregate-functions/reference/topk.md @@ -19,13 +19,13 @@ We recommend using the `N < 10` value; performance is reduced with large `N` val **Arguments** -- `N` – The number of elements to return. +- `N` – The number of elements to return. If the parameter is omitted, default value 10 is used. **Arguments** -- `x` – The value to calculate frequency. +- `x` – The value to calculate frequency. **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/topkweighted.md b/docs/en/sql-reference/aggregate-functions/reference/topkweighted.md index 32b234fd6b8..03932e88a6a 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/topkweighted.md +++ b/docs/en/sql-reference/aggregate-functions/reference/topkweighted.md @@ -15,9 +15,9 @@ topKWeighted(N)(x, weight) **Arguments** -- `N` — The number of elements to return. -- `x` — The value. -- `weight` — The weight. Every value is accounted `weight` times for frequency calculation. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `N` — The number of elements to return. +- `x` — The value. +- `weight` — The weight. Every value is accounted `weight` times for frequency calculation. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -42,4 +42,4 @@ Result: **See Also** -- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) diff --git a/docs/en/sql-reference/aggregate-functions/reference/uniq.md b/docs/en/sql-reference/aggregate-functions/reference/uniq.md index d72311b3ede..b1c8336630b 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/uniq.md +++ b/docs/en/sql-reference/aggregate-functions/reference/uniq.md @@ -17,24 +17,24 @@ The function takes a variable number of parameters. Parameters can be `Tuple`, ` **Returned value** -- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. +- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. **Implementation details** Function: -- Calculates a hash for all parameters in the aggregate, then uses it in calculations. +- Calculates a hash for all parameters in the aggregate, then uses it in calculations. -- Uses an adaptive sampling algorithm. For the calculation state, the function uses a sample of element hash values up to 65536. This algorithm is very accurate and very efficient on the CPU. When the query contains several of these functions, using `uniq` is almost as fast as using other aggregate functions. +- Uses an adaptive sampling algorithm. For the calculation state, the function uses a sample of element hash values up to 65536. This algorithm is very accurate and very efficient on the CPU. When the query contains several of these functions, using `uniq` is almost as fast as using other aggregate functions. -- Provides the result deterministically (it does not depend on the query processing order). +- Provides the result deterministically (it does not depend on the query processing order). We recommend using this function in almost all scenarios. **See Also** -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) -- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) -- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/en/sql-reference/aggregate-functions/reference/uniqcombined.md b/docs/en/sql-reference/aggregate-functions/reference/uniqcombined.md index f1287c6ff9b..2f3efde859d 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/uniqcombined.md +++ b/docs/en/sql-reference/aggregate-functions/reference/uniqcombined.md @@ -21,19 +21,19 @@ The function takes a variable number of parameters. Parameters can be `Tuple`, ` **Returned value** -- A number [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. +- A number [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. **Implementation details** Function: -- Calculates a hash (64-bit hash for `String` and 32-bit otherwise) for all parameters in the aggregate, then uses it in calculations. +- Calculates a hash (64-bit hash for `String` and 32-bit otherwise) for all parameters in the aggregate, then uses it in calculations. -- Uses a combination of three algorithms: array, hash table, and HyperLogLog with an error correction table. +- Uses a combination of three algorithms: array, hash table, and HyperLogLog with an error correction table. For a small number of distinct elements, an array is used. When the set size is larger, a hash table is used. For a larger number of elements, HyperLogLog is used, which will occupy a fixed amount of memory. -- Provides the result deterministically (it does not depend on the query processing order). +- Provides the result deterministically (it does not depend on the query processing order). :::note Since it uses 32-bit hash for non-`String` type, the result will have very high error for cardinalities significantly larger than `UINT_MAX` (error will raise quickly after a few tens of billions of distinct values), hence in this case you should use [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) @@ -41,14 +41,14 @@ Since it uses 32-bit hash for non-`String` type, the result will have very high Compared to the [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) function, the `uniqCombined`: -- Consumes several times less memory. -- Calculates with several times higher accuracy. -- Usually has slightly lower performance. In some scenarios, `uniqCombined` can perform better than `uniq`, for example, with distributed queries that transmit a large number of aggregation states over the network. +- Consumes several times less memory. +- Calculates with several times higher accuracy. +- Usually has slightly lower performance. In some scenarios, `uniqCombined` can perform better than `uniq`, for example, with distributed queries that transmit a large number of aggregation states over the network. **See Also** -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) -- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) -- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/en/sql-reference/aggregate-functions/reference/uniqexact.md b/docs/en/sql-reference/aggregate-functions/reference/uniqexact.md index 901c631b756..fd68a464881 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/uniqexact.md +++ b/docs/en/sql-reference/aggregate-functions/reference/uniqexact.md @@ -21,7 +21,7 @@ The function takes a variable number of parameters. Parameters can be `Tuple`, ` **See Also** -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqcombined) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqhll12) -- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqcombined) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqhll12) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/en/sql-reference/aggregate-functions/reference/uniqhll12.md b/docs/en/sql-reference/aggregate-functions/reference/uniqhll12.md index b598ad23df3..8594ebb3782 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/uniqhll12.md +++ b/docs/en/sql-reference/aggregate-functions/reference/uniqhll12.md @@ -17,25 +17,25 @@ The function takes a variable number of parameters. Parameters can be `Tuple`, ` **Returned value** -- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. +- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. **Implementation details** Function: -- Calculates a hash for all parameters in the aggregate, then uses it in calculations. +- Calculates a hash for all parameters in the aggregate, then uses it in calculations. -- Uses the HyperLogLog algorithm to approximate the number of different argument values. +- Uses the HyperLogLog algorithm to approximate the number of different argument values. 2^12 5-bit cells are used. The size of the state is slightly more than 2.5 KB. The result is not very accurate (up to ~10% error) for small data sets (<10K elements). However, the result is fairly accurate for high-cardinality data sets (10K-100M), with a maximum error of ~1.6%. Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements). -- Provides the determinate result (it does not depend on the query processing order). +- Provides the determinate result (it does not depend on the query processing order). We do not recommend using this function. In most cases, use the [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) or [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) function. **See Also** -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) -- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/en/sql-reference/aggregate-functions/reference/uniqthetasketch.md b/docs/en/sql-reference/aggregate-functions/reference/uniqthetasketch.md index e2adf672909..45970f144cb 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/uniqthetasketch.md +++ b/docs/en/sql-reference/aggregate-functions/reference/uniqthetasketch.md @@ -16,24 +16,24 @@ The function takes a variable number of parameters. Parameters can be `Tuple`, ` **Returned value** -- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. +- A [UInt64](../../../sql-reference/data-types/int-uint.md)-type number. **Implementation details** Function: -- Calculates a hash for all parameters in the aggregate, then uses it in calculations. +- Calculates a hash for all parameters in the aggregate, then uses it in calculations. -- Uses the [KMV](https://datasketches.apache.org/docs/Theta/InverseEstimate.html) algorithm to approximate the number of different argument values. +- Uses the [KMV](https://datasketches.apache.org/docs/Theta/InverseEstimate.html) algorithm to approximate the number of different argument values. 4096(2^12) 64-bit sketch are used. The size of the state is about 41 KB. -- The relative error is 3.125% (95% confidence), see the [relative error table](https://datasketches.apache.org/docs/Theta/ThetaErrorTable.html) for detail. +- The relative error is 3.125% (95% confidence), see the [relative error table](https://datasketches.apache.org/docs/Theta/ThetaErrorTable.html) for detail. **See Also** -- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) -- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) -- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) -- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) -- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) diff --git a/docs/en/sql-reference/aggregate-functions/reference/welchttest.md b/docs/en/sql-reference/aggregate-functions/reference/welchttest.md index ab35f8794e6..4f1085e65b4 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/welchttest.md +++ b/docs/en/sql-reference/aggregate-functions/reference/welchttest.md @@ -19,21 +19,21 @@ The null hypothesis is that means of populations are equal. Normal distribution **Arguments** -- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). -- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). +- `sample_data` — Sample data. [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) or [Decimal](../../../sql-reference/data-types/decimal.md). +- `sample_index` — Sample index. [Integer](../../../sql-reference/data-types/int-uint.md). **Parameters** -- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). +- `confidence_level` — Confidence level in order to calculate confidence intervals. [Float](../../../sql-reference/data-types/float.md). **Returned values** [Tuple](../../../sql-reference/data-types/tuple.md) with two or four elements (if the optional `confidence_level` is specified) -- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). -- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). -- calculated confidence-interval-low. [Float64](../../../sql-reference/data-types/float.md). -- calculated confidence-interval-high. [Float64](../../../sql-reference/data-types/float.md). +- calculated t-statistic. [Float64](../../../sql-reference/data-types/float.md). +- calculated p-value. [Float64](../../../sql-reference/data-types/float.md). +- calculated confidence-interval-low. [Float64](../../../sql-reference/data-types/float.md). +- calculated confidence-interval-high. [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -67,5 +67,5 @@ Result: **See Also** -- [Welch's t-test](https://en.wikipedia.org/wiki/Welch%27s_t-test) -- [studentTTest function](studentttest.md#studentttest) +- [Welch's t-test](https://en.wikipedia.org/wiki/Welch%27s_t-test) +- [studentTTest function](studentttest.md#studentttest) diff --git a/docs/en/sql-reference/data-types/aggregatefunction.md b/docs/en/sql-reference/data-types/aggregatefunction.md index 90dd8bd2311..fe6d7ebe0dc 100644 --- a/docs/en/sql-reference/data-types/aggregatefunction.md +++ b/docs/en/sql-reference/data-types/aggregatefunction.md @@ -12,9 +12,9 @@ Aggregate functions can have an implementation-defined intermediate state that c **Parameters** -- Name of the aggregate function. If the function is parametric, specify its parameters too. +- Name of the aggregate function. If the function is parametric, specify its parameters too. -- Types of the aggregate function arguments. +- Types of the aggregate function arguments. **Example** diff --git a/docs/en/sql-reference/data-types/date.md b/docs/en/sql-reference/data-types/date.md index d43a00312dd..048466f7ae4 100644 --- a/docs/en/sql-reference/data-types/date.md +++ b/docs/en/sql-reference/data-types/date.md @@ -39,6 +39,6 @@ SELECT * FROM dt; **See Also** -- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) -- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) -- [`DateTime` data type](../../sql-reference/data-types/datetime.md) +- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) +- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) +- [`DateTime` data type](../../sql-reference/data-types/datetime.md) diff --git a/docs/en/sql-reference/data-types/date32.md b/docs/en/sql-reference/data-types/date32.md index 826dc20a96d..7cf8b1b95fe 100644 --- a/docs/en/sql-reference/data-types/date32.md +++ b/docs/en/sql-reference/data-types/date32.md @@ -35,6 +35,6 @@ SELECT * FROM new; **See Also** -- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) -- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) -- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) diff --git a/docs/en/sql-reference/data-types/datetime.md b/docs/en/sql-reference/data-types/datetime.md index b10ceb79d13..059c6acdb9e 100644 --- a/docs/en/sql-reference/data-types/datetime.md +++ b/docs/en/sql-reference/data-types/datetime.md @@ -62,8 +62,8 @@ SELECT * FROM dt; └─────────────────────┴──────────┘ ``` -- When inserting datetime as an integer, it is treated as Unix Timestamp (UTC). `1546300800` represents `'2019-01-01 00:00:00'` UTC. However, as `timestamp` column has `Asia/Istanbul` (UTC+3) timezone specified, when outputting as string the value will be shown as `'2019-01-01 03:00:00'` -- When inserting string value as datetime, it is treated as being in column timezone. `'2019-01-01 00:00:00'` will be treated as being in `Asia/Istanbul` timezone and saved as `1546290000`. +- When inserting datetime as an integer, it is treated as Unix Timestamp (UTC). `1546300800` represents `'2019-01-01 00:00:00'` UTC. However, as `timestamp` column has `Asia/Istanbul` (UTC+3) timezone specified, when outputting as string the value will be shown as `'2019-01-01 03:00:00'` +- When inserting string value as datetime, it is treated as being in column timezone. `'2019-01-01 00:00:00'` will be treated as being in `Asia/Istanbul` timezone and saved as `1546290000`. **2.** Filtering on `DateTime` values @@ -137,11 +137,11 @@ Time shifts for multiple days. Some pacific islands changed their timezone offse ## See Also -- [Type conversion functions](../../sql-reference/functions/type-conversion-functions.md) -- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) -- [Functions for working with arrays](../../sql-reference/functions/array-functions.md) -- [The `date_time_input_format` setting](../../operations/settings/settings.md#settings-date_time_input_format) -- [The `date_time_output_format` setting](../../operations/settings/settings.md#settings-date_time_output_format) -- [The `timezone` server configuration parameter](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) -- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) -- [The `Date` data type](../../sql-reference/data-types/date.md) +- [Type conversion functions](../../sql-reference/functions/type-conversion-functions.md) +- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) +- [Functions for working with arrays](../../sql-reference/functions/array-functions.md) +- [The `date_time_input_format` setting](../../operations/settings/settings.md#settings-date_time_input_format) +- [The `date_time_output_format` setting](../../operations/settings/settings.md#settings-date_time_output_format) +- [The `timezone` server configuration parameter](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) +- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) +- [The `Date` data type](../../sql-reference/data-types/date.md) diff --git a/docs/en/sql-reference/data-types/datetime64.md b/docs/en/sql-reference/data-types/datetime64.md index fa3a1eecd46..2d4035831fa 100644 --- a/docs/en/sql-reference/data-types/datetime64.md +++ b/docs/en/sql-reference/data-types/datetime64.md @@ -52,8 +52,8 @@ SELECT * FROM dt; └─────────────────────────┴──────────┘ ``` -- When inserting datetime as an integer, it is treated as an appropriately scaled Unix Timestamp (UTC). `1546300800000` (with precision 3) represents `'2019-01-01 00:00:00'` UTC. However, as `timestamp` column has `Asia/Istanbul` (UTC+3) timezone specified, when outputting as a string the value will be shown as `'2019-01-01 03:00:00'`. Inserting datetime as a decimal will treat it similarly as an integer, except the value before the decimal point is the Unix Timestamp up to and including the seconds, and after the decimal point will be treated as the precision. -- When inserting string value as datetime, it is treated as being in column timezone. `'2019-01-01 00:00:00'` will be treated as being in `Asia/Istanbul` timezone and stored as `1546290000000`. +- When inserting datetime as an integer, it is treated as an appropriately scaled Unix Timestamp (UTC). `1546300800000` (with precision 3) represents `'2019-01-01 00:00:00'` UTC. However, as `timestamp` column has `Asia/Istanbul` (UTC+3) timezone specified, when outputting as a string the value will be shown as `'2019-01-01 03:00:00'`. Inserting datetime as a decimal will treat it similarly as an integer, except the value before the decimal point is the Unix Timestamp up to and including the seconds, and after the decimal point will be treated as the precision. +- When inserting string value as datetime, it is treated as being in column timezone. `'2019-01-01 00:00:00'` will be treated as being in `Asia/Istanbul` timezone and stored as `1546290000000`. 2. Filtering on `DateTime64` values @@ -113,12 +113,12 @@ FROM dt; **See Also** -- [Type conversion functions](../../sql-reference/functions/type-conversion-functions.md) -- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) -- [Functions for working with arrays](../../sql-reference/functions/array-functions.md) -- [The `date_time_input_format` setting](../../operations/settings/settings.md#settings-date_time_input_format) -- [The `date_time_output_format` setting](../../operations/settings/settings.md#settings-date_time_output_format) -- [The `timezone` server configuration parameter](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) -- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) -- [`Date` data type](../../sql-reference/data-types/date.md) -- [`DateTime` data type](../../sql-reference/data-types/datetime.md) +- [Type conversion functions](../../sql-reference/functions/type-conversion-functions.md) +- [Functions for working with dates and times](../../sql-reference/functions/date-time-functions.md) +- [Functions for working with arrays](../../sql-reference/functions/array-functions.md) +- [The `date_time_input_format` setting](../../operations/settings/settings.md#settings-date_time_input_format) +- [The `date_time_output_format` setting](../../operations/settings/settings.md#settings-date_time_output_format) +- [The `timezone` server configuration parameter](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) +- [Operators for working with dates and times](../../sql-reference/operators/index.md#operators-datetime) +- [`Date` data type](../../sql-reference/data-types/date.md) +- [`DateTime` data type](../../sql-reference/data-types/datetime.md) diff --git a/docs/en/sql-reference/data-types/decimal.md b/docs/en/sql-reference/data-types/decimal.md index 7e4cb5ecaac..8df8b2519e3 100644 --- a/docs/en/sql-reference/data-types/decimal.md +++ b/docs/en/sql-reference/data-types/decimal.md @@ -10,8 +10,8 @@ Signed fixed-point numbers that keep precision during add, subtract and multiply ## Parameters -- P - precision. Valid range: \[ 1 : 76 \]. Determines how many decimal digits number can have (including fraction). -- S - scale. Valid range: \[ 0 : P \]. Determines how many decimal digits fraction can have. +- P - precision. Valid range: \[ 1 : 76 \]. Determines how many decimal digits number can have (including fraction). +- S - scale. Valid range: \[ 0 : P \]. Determines how many decimal digits fraction can have. Depending on P parameter value Decimal(P, S) is a synonym for: - P from \[ 1 : 9 \] - for Decimal32(S) @@ -21,10 +21,10 @@ Depending on P parameter value Decimal(P, S) is a synonym for: ## Decimal Value Ranges -- Decimal32(S) - ( -1 \* 10^(9 - S), 1 \* 10^(9 - S) ) -- Decimal64(S) - ( -1 \* 10^(18 - S), 1 \* 10^(18 - S) ) -- Decimal128(S) - ( -1 \* 10^(38 - S), 1 \* 10^(38 - S) ) -- Decimal256(S) - ( -1 \* 10^(76 - S), 1 \* 10^(76 - S) ) +- Decimal32(S) - ( -1 \* 10^(9 - S), 1 \* 10^(9 - S) ) +- Decimal64(S) - ( -1 \* 10^(18 - S), 1 \* 10^(18 - S) ) +- Decimal128(S) - ( -1 \* 10^(38 - S), 1 \* 10^(38 - S) ) +- Decimal256(S) - ( -1 \* 10^(76 - S), 1 \* 10^(76 - S) ) For example, Decimal32(4) can contain numbers from -99999.9999 to 99999.9999 with 0.0001 step. @@ -38,16 +38,16 @@ Because modern CPUs do not support 128-bit integers natively, operations on Deci Binary operations on Decimal result in wider result type (with any order of arguments). -- `Decimal64(S1) Decimal32(S2) -> Decimal64(S)` -- `Decimal128(S1) Decimal32(S2) -> Decimal128(S)` -- `Decimal128(S1) Decimal64(S2) -> Decimal128(S)` -- `Decimal256(S1) Decimal<32|64|128>(S2) -> Decimal256(S)` +- `Decimal64(S1) Decimal32(S2) -> Decimal64(S)` +- `Decimal128(S1) Decimal32(S2) -> Decimal128(S)` +- `Decimal128(S1) Decimal64(S2) -> Decimal128(S)` +- `Decimal256(S1) Decimal<32|64|128>(S2) -> Decimal256(S)` Rules for scale: -- add, subtract: S = max(S1, S2). -- multiply: S = S1 + S2. -- divide: S = S1. +- add, subtract: S = max(S1, S2). +- multiply: S = S1 + S2. +- divide: S = S1. For similar operations between Decimal and integers, the result is Decimal of the same size as an argument. @@ -109,5 +109,5 @@ DB::Exception: Can't compare. ``` **See also** -- [isDecimalOverflow](../../sql-reference/functions/other-functions.md#is-decimal-overflow) -- [countDigits](../../sql-reference/functions/other-functions.md#count-digits) +- [isDecimalOverflow](../../sql-reference/functions/other-functions.md#is-decimal-overflow) +- [countDigits](../../sql-reference/functions/other-functions.md#count-digits) diff --git a/docs/en/sql-reference/data-types/domains/index.md b/docs/en/sql-reference/data-types/domains/index.md index f6f14186dcc..13ec1735d4d 100644 --- a/docs/en/sql-reference/data-types/domains/index.md +++ b/docs/en/sql-reference/data-types/domains/index.md @@ -10,20 +10,20 @@ Domains are special-purpose types that add some extra features atop of existing You can use domains anywhere corresponding base type can be used, for example: -- Create a column of a domain type -- Read/write values from/to domain column -- Use it as an index if a base type can be used as an index -- Call functions with values of domain column +- Create a column of a domain type +- Read/write values from/to domain column +- Use it as an index if a base type can be used as an index +- Call functions with values of domain column ### Extra Features of Domains -- Explicit column type name in `SHOW CREATE TABLE` or `DESCRIBE TABLE` -- Input from human-friendly format with `INSERT INTO domain_table(domain_column) VALUES(...)` -- Output to human-friendly format for `SELECT domain_column FROM domain_table` -- Loading data from an external source in the human-friendly format: `INSERT INTO domain_table FORMAT CSV ...` +- Explicit column type name in `SHOW CREATE TABLE` or `DESCRIBE TABLE` +- Input from human-friendly format with `INSERT INTO domain_table(domain_column) VALUES(...)` +- Output to human-friendly format for `SELECT domain_column FROM domain_table` +- Loading data from an external source in the human-friendly format: `INSERT INTO domain_table FORMAT CSV ...` ### Limitations -- Can’t convert index column of base type to domain type via `ALTER TABLE`. -- Can’t implicitly convert string values into domain values when inserting data from another column or table. -- Domain adds no constrains on stored values. +- Can’t convert index column of base type to domain type via `ALTER TABLE`. +- Can’t implicitly convert string values into domain values when inserting data from another column or table. +- Domain adds no constrains on stored values. diff --git a/docs/en/sql-reference/data-types/enum.md b/docs/en/sql-reference/data-types/enum.md index a685b341414..02e73a0360e 100644 --- a/docs/en/sql-reference/data-types/enum.md +++ b/docs/en/sql-reference/data-types/enum.md @@ -12,8 +12,8 @@ Named values can be declared as `'string' = integer` pairs or `'string'` names . ClickHouse supports: -- 8-bit `Enum`. It can contain up to 256 values enumerated in the `[-128, 127]` range. -- 16-bit `Enum`. It can contain up to 65536 values enumerated in the `[-32768, 32767]` range. +- 8-bit `Enum`. It can contain up to 256 values enumerated in the `[-128, 127]` range. +- 16-bit `Enum`. It can contain up to 65536 values enumerated in the `[-32768, 32767]` range. ClickHouse automatically chooses the type of `Enum` when data is inserted. You can also use `Enum8` or `Enum16` types to be sure in the size of storage. diff --git a/docs/en/sql-reference/data-types/fixedstring.md b/docs/en/sql-reference/data-types/fixedstring.md index e28f957e49c..a56b3fccbc1 100644 --- a/docs/en/sql-reference/data-types/fixedstring.md +++ b/docs/en/sql-reference/data-types/fixedstring.md @@ -20,17 +20,17 @@ The `FixedString` type is efficient when data has the length of precisely `N` by Examples of the values that can be efficiently stored in `FixedString`-typed columns: -- The binary representation of IP addresses (`FixedString(16)` for IPv6). -- Language codes (ru_RU, en_US … ). -- Currency codes (USD, RUB … ). -- Binary representation of hashes (`FixedString(16)` for MD5, `FixedString(32)` for SHA256). +- The binary representation of IP addresses (`FixedString(16)` for IPv6). +- Language codes (ru_RU, en_US … ). +- Currency codes (USD, RUB … ). +- Binary representation of hashes (`FixedString(16)` for MD5, `FixedString(32)` for SHA256). To store UUID values, use the [UUID](../../sql-reference/data-types/uuid.md) data type. When inserting the data, ClickHouse: -- Complements a string with null bytes if the string contains fewer than `N` bytes. -- Throws the `Too large value for FixedString(N)` exception if the string contains more than `N` bytes. +- Complements a string with null bytes if the string contains fewer than `N` bytes. +- Throws the `Too large value for FixedString(N)` exception if the string contains more than `N` bytes. When selecting the data, ClickHouse does not remove the null bytes at the end of the string. If you use the `WHERE` clause, you should add null bytes manually to match the `FixedString` value. The following example illustrates how to use the `WHERE` clause with `FixedString`. diff --git a/docs/en/sql-reference/data-types/float.md b/docs/en/sql-reference/data-types/float.md index c89b24ad235..3b55271f707 100644 --- a/docs/en/sql-reference/data-types/float.md +++ b/docs/en/sql-reference/data-types/float.md @@ -30,19 +30,19 @@ SELECT sumKahan(my_float), sumKahan(my_decimal) FROM float_vs_decimal; Types are equivalent to types of C: -- `Float32` — `float`. -- `Float64` — `double`. +- `Float32` — `float`. +- `Float64` — `double`. Aliases: -- `Float32` — `FLOAT`. -- `Float64` — `DOUBLE`. +- `Float32` — `FLOAT`. +- `Float64` — `DOUBLE`. When creating tables, numeric parameters for floating point numbers can be set (e.g. `FLOAT(12)`, `FLOAT(15, 22)`, `DOUBLE(12)`, `DOUBLE(4, 18)`), but ClickHouse ignores them. ## Using Floating-point Numbers -- Computations with floating-point numbers might produce a rounding error. +- Computations with floating-point numbers might produce a rounding error. @@ -56,15 +56,15 @@ SELECT 1 - 0.9 └─────────────────────┘ ``` -- The result of the calculation depends on the calculation method (the processor type and architecture of the computer system). -- Floating-point calculations might result in numbers such as infinity (`Inf`) and “not-a-number” (`NaN`). This should be taken into account when processing the results of calculations. -- When parsing floating-point numbers from text, the result might not be the nearest machine-representable number. +- The result of the calculation depends on the calculation method (the processor type and architecture of the computer system). +- Floating-point calculations might result in numbers such as infinity (`Inf`) and “not-a-number” (`NaN`). This should be taken into account when processing the results of calculations. +- When parsing floating-point numbers from text, the result might not be the nearest machine-representable number. ## NaN and Inf In contrast to standard SQL, ClickHouse supports the following categories of floating-point numbers: -- `Inf` – Infinity. +- `Inf` – Infinity. @@ -78,7 +78,7 @@ SELECT 0.5 / 0 └────────────────┘ ``` -- `-Inf` — Negative infinity. +- `-Inf` — Negative infinity. @@ -92,7 +92,7 @@ SELECT -0.5 / 0 └─────────────────┘ ``` -- `NaN` — Not a number. +- `NaN` — Not a number. diff --git a/docs/en/sql-reference/data-types/int-uint.md b/docs/en/sql-reference/data-types/int-uint.md index b8a55b62e36..b551143d92f 100644 --- a/docs/en/sql-reference/data-types/int-uint.md +++ b/docs/en/sql-reference/data-types/int-uint.md @@ -12,25 +12,25 @@ When creating tables, numeric parameters for integer numbers can be set (e.g. `T ## Int Ranges -- `Int8` — \[-128 : 127\] -- `Int16` — \[-32768 : 32767\] -- `Int32` — \[-2147483648 : 2147483647\] -- `Int64` — \[-9223372036854775808 : 9223372036854775807\] -- `Int128` — \[-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727\] -- `Int256` — \[-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967\] +- `Int8` — \[-128 : 127\] +- `Int16` — \[-32768 : 32767\] +- `Int32` — \[-2147483648 : 2147483647\] +- `Int64` — \[-9223372036854775808 : 9223372036854775807\] +- `Int128` — \[-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727\] +- `Int256` — \[-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967\] Aliases: -- `Int8` — `TINYINT`, `BOOL`, `BOOLEAN`, `INT1`. -- `Int16` — `SMALLINT`, `INT2`. -- `Int32` — `INT`, `INT4`, `INTEGER`. -- `Int64` — `BIGINT`. +- `Int8` — `TINYINT`, `BOOL`, `BOOLEAN`, `INT1`. +- `Int16` — `SMALLINT`, `INT2`. +- `Int32` — `INT`, `INT4`, `INTEGER`. +- `Int64` — `BIGINT`. ## UInt Ranges -- `UInt8` — \[0 : 255\] -- `UInt16` — \[0 : 65535\] -- `UInt32` — \[0 : 4294967295\] -- `UInt64` — \[0 : 18446744073709551615\] -- `UInt128` — \[0 : 340282366920938463463374607431768211455\] -- `UInt256` — \[0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935\] +- `UInt8` — \[0 : 255\] +- `UInt16` — \[0 : 65535\] +- `UInt32` — \[0 : 4294967295\] +- `UInt64` — \[0 : 18446744073709551615\] +- `UInt128` — \[0 : 340282366920938463463374607431768211455\] +- `UInt256` — \[0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935\] diff --git a/docs/en/sql-reference/data-types/lowcardinality.md b/docs/en/sql-reference/data-types/lowcardinality.md index 58a99baa09e..7810f4c5324 100644 --- a/docs/en/sql-reference/data-types/lowcardinality.md +++ b/docs/en/sql-reference/data-types/lowcardinality.md @@ -16,7 +16,7 @@ LowCardinality(data_type) **Parameters** -- `data_type` — [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), and numbers excepting [Decimal](../../sql-reference/data-types/decimal.md). `LowCardinality` is not efficient for some data types, see the [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) setting description. +- `data_type` — [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), and numbers excepting [Decimal](../../sql-reference/data-types/decimal.md). `LowCardinality` is not efficient for some data types, see the [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) setting description. ## Description @@ -44,19 +44,19 @@ ORDER BY id Settings: -- [low_cardinality_max_dictionary_size](../../operations/settings/settings.md#low_cardinality_max_dictionary_size) -- [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) -- [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) -- [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) -- [output_format_arrow_low_cardinality_as_dictionary](../../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) +- [low_cardinality_max_dictionary_size](../../operations/settings/settings.md#low_cardinality_max_dictionary_size) +- [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) +- [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) +- [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) +- [output_format_arrow_low_cardinality_as_dictionary](../../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) Functions: -- [toLowCardinality](../../sql-reference/functions/type-conversion-functions.md#tolowcardinality) +- [toLowCardinality](../../sql-reference/functions/type-conversion-functions.md#tolowcardinality) ## Related content -- [Reducing ClickHouse Storage Cost with the Low Cardinality Type – Lessons from an Instana Engineer](https://www.instana.com/blog/reducing-clickhouse-storage-cost-with-the-low-cardinality-type-lessons-from-an-instana-engineer/) -- [String Optimization (video presentation in Russian)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [Slides in English](https://github.com/ClickHouse/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf) +- [Reducing ClickHouse Storage Cost with the Low Cardinality Type – Lessons from an Instana Engineer](https://www.instana.com/blog/reducing-clickhouse-storage-cost-with-the-low-cardinality-type-lessons-from-an-instana-engineer/) +- [String Optimization (video presentation in Russian)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [Slides in English](https://github.com/ClickHouse/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf) - Blog: [Optimizing ClickHouse with Schemas and Codecs](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) - Blog: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/en/sql-reference/data-types/map.md b/docs/en/sql-reference/data-types/map.md index ad99bc75f24..0ea183d73d8 100644 --- a/docs/en/sql-reference/data-types/map.md +++ b/docs/en/sql-reference/data-types/map.md @@ -10,8 +10,8 @@ sidebar_label: Map(key, value) **Parameters** -- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md). -- `value` — The value part of the pair. Arbitrary type, including [Map](../../sql-reference/data-types/map.md) and [Array](../../sql-reference/data-types/array.md). +- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md). +- `value` — The value part of the pair. Arbitrary type, including [Map](../../sql-reference/data-types/map.md) and [Array](../../sql-reference/data-types/array.md). To get the value from an `a Map('key', 'value')` column, use `a['key']` syntax. This lookup works now with a linear complexity. @@ -106,8 +106,8 @@ Result: **See Also** -- [map()](../../sql-reference/functions/tuple-map-functions.md#function-map) function -- [CAST()](../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) function +- [map()](../../sql-reference/functions/tuple-map-functions.md#function-map) function +- [CAST()](../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) function ## Related content diff --git a/docs/en/sql-reference/data-types/simpleaggregatefunction.md b/docs/en/sql-reference/data-types/simpleaggregatefunction.md index 342a0294eb6..517a28576f0 100644 --- a/docs/en/sql-reference/data-types/simpleaggregatefunction.md +++ b/docs/en/sql-reference/data-types/simpleaggregatefunction.md @@ -9,20 +9,20 @@ The common way to produce an aggregate function value is by calling the aggregat The following aggregate functions are supported: -- [`any`](../../sql-reference/aggregate-functions/reference/any.md#agg_function-any) -- [`anyLast`](../../sql-reference/aggregate-functions/reference/anylast.md#anylastx) -- [`min`](../../sql-reference/aggregate-functions/reference/min.md#agg_function-min) -- [`max`](../../sql-reference/aggregate-functions/reference/max.md#agg_function-max) -- [`sum`](../../sql-reference/aggregate-functions/reference/sum.md#agg_function-sum) -- [`sumWithOverflow`](../../sql-reference/aggregate-functions/reference/sumwithoverflow.md#sumwithoverflowx) -- [`groupBitAnd`](../../sql-reference/aggregate-functions/reference/groupbitand.md#groupbitand) -- [`groupBitOr`](../../sql-reference/aggregate-functions/reference/groupbitor.md#groupbitor) -- [`groupBitXor`](../../sql-reference/aggregate-functions/reference/groupbitxor.md#groupbitxor) -- [`groupArrayArray`](../../sql-reference/aggregate-functions/reference/grouparray.md#agg_function-grouparray) -- [`groupUniqArrayArray`](../../sql-reference/aggregate-functions/reference/groupuniqarray.md) -- [`sumMap`](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap) -- [`minMap`](../../sql-reference/aggregate-functions/reference/minmap.md#agg_functions-minmap) -- [`maxMap`](../../sql-reference/aggregate-functions/reference/maxmap.md#agg_functions-maxmap) +- [`any`](../../sql-reference/aggregate-functions/reference/any.md#agg_function-any) +- [`anyLast`](../../sql-reference/aggregate-functions/reference/anylast.md#anylastx) +- [`min`](../../sql-reference/aggregate-functions/reference/min.md#agg_function-min) +- [`max`](../../sql-reference/aggregate-functions/reference/max.md#agg_function-max) +- [`sum`](../../sql-reference/aggregate-functions/reference/sum.md#agg_function-sum) +- [`sumWithOverflow`](../../sql-reference/aggregate-functions/reference/sumwithoverflow.md#sumwithoverflowx) +- [`groupBitAnd`](../../sql-reference/aggregate-functions/reference/groupbitand.md#groupbitand) +- [`groupBitOr`](../../sql-reference/aggregate-functions/reference/groupbitor.md#groupbitor) +- [`groupBitXor`](../../sql-reference/aggregate-functions/reference/groupbitxor.md#groupbitxor) +- [`groupArrayArray`](../../sql-reference/aggregate-functions/reference/grouparray.md#agg_function-grouparray) +- [`groupUniqArrayArray`](../../sql-reference/aggregate-functions/reference/groupuniqarray.md) +- [`sumMap`](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap) +- [`minMap`](../../sql-reference/aggregate-functions/reference/minmap.md#agg_functions-minmap) +- [`maxMap`](../../sql-reference/aggregate-functions/reference/maxmap.md#agg_functions-maxmap) :::note @@ -33,8 +33,8 @@ Values of the `SimpleAggregateFunction(func, Type)` look and stored the same way **Parameters** -- Name of the aggregate function. -- Types of the aggregate function arguments. +- Name of the aggregate function. +- Types of the aggregate function arguments. **Example** diff --git a/docs/en/sql-reference/data-types/special-data-types/interval.md b/docs/en/sql-reference/data-types/special-data-types/interval.md index 0ac5248e36c..c89c2e78752 100644 --- a/docs/en/sql-reference/data-types/special-data-types/interval.md +++ b/docs/en/sql-reference/data-types/special-data-types/interval.md @@ -14,19 +14,19 @@ The family of data types representing time and date intervals. The resulting typ Structure: -- Time interval as an unsigned integer value. -- Type of an interval. +- Time interval as an unsigned integer value. +- Type of an interval. Supported interval types: -- `SECOND` -- `MINUTE` -- `HOUR` -- `DAY` -- `WEEK` -- `MONTH` -- `QUARTER` -- `YEAR` +- `SECOND` +- `MINUTE` +- `HOUR` +- `DAY` +- `WEEK` +- `MONTH` +- `QUARTER` +- `YEAR` For each interval type, there is a separate data type. For example, the `DAY` interval corresponds to the `IntervalDay` data type: @@ -81,5 +81,5 @@ Code: 43. DB::Exception: Received from localhost:9000. DB::Exception: Wrong argu ## See Also -- [INTERVAL](../../../sql-reference/operators/index.md#operator-interval) operator -- [toInterval](../../../sql-reference/functions/type-conversion-functions.md#function-tointerval) type conversion functions +- [INTERVAL](../../../sql-reference/operators/index.md#operator-interval) operator +- [toInterval](../../../sql-reference/functions/type-conversion-functions.md#function-tointerval) type conversion functions diff --git a/docs/en/sql-reference/data-types/string.md b/docs/en/sql-reference/data-types/string.md index fce16320240..f891a9303e5 100644 --- a/docs/en/sql-reference/data-types/string.md +++ b/docs/en/sql-reference/data-types/string.md @@ -13,7 +13,7 @@ When creating tables, numeric parameters for string fields can be set (e.g. `VAR Aliases: -- `String` — `LONGTEXT`, `MEDIUMTEXT`, `TINYTEXT`, `TEXT`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `VARCHAR`, `CHAR`. +- `String` — `LONGTEXT`, `MEDIUMTEXT`, `TINYTEXT`, `TEXT`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `VARCHAR`, `CHAR`. ## Encodings diff --git a/docs/en/sql-reference/dictionaries/index.md b/docs/en/sql-reference/dictionaries/index.md index f697b1ecdcf..48a8ce45d33 100644 --- a/docs/en/sql-reference/dictionaries/index.md +++ b/docs/en/sql-reference/dictionaries/index.md @@ -15,8 +15,8 @@ ClickHouse supports special functions for working with dictionaries that can be ClickHouse supports: -- Dictionaries with a [set of functions](../../sql-reference/functions/ext-dict-functions.md). -- [Embedded dictionaries](#embedded_dictionaries) with a specific [set of functions](../../sql-reference/functions/ym-dict-functions.md). +- Dictionaries with a [set of functions](../../sql-reference/functions/ext-dict-functions.md). +- [Embedded dictionaries](#embedded_dictionaries) with a specific [set of functions](../../sql-reference/functions/ym-dict-functions.md). :::tip Tutorial @@ -27,9 +27,9 @@ You can add your own dictionaries from various data sources. The source for a di ClickHouse: -- Fully or partially stores dictionaries in RAM. -- Periodically updates dictionaries and dynamically loads missing values. In other words, dictionaries can be loaded dynamically. -- Allows creating dictionaries with xml files or [DDL queries](../../sql-reference/statements/create/dictionary.md). +- Fully or partially stores dictionaries in RAM. +- Periodically updates dictionaries and dynamically loads missing values. In other words, dictionaries can be loaded dynamically. +- Allows creating dictionaries with xml files or [DDL queries](../../sql-reference/statements/create/dictionary.md). The configuration of dictionaries can be located in one or more xml-files. The path to the configuration is specified in the [dictionaries_config](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-dictionaries_config) parameter. @@ -37,9 +37,9 @@ Dictionaries can be loaded at server startup or at first use, depending on the [ The [dictionaries](../../operations/system-tables/dictionaries.md#system_tables-dictionaries) system table contains information about dictionaries configured at server. For each dictionary you can find there: -- Status of the dictionary. -- Configuration parameters. -- Metrics like amount of RAM allocated for the dictionary or a number of queries since the dictionary was successfully loaded. +- Status of the dictionary. +- Configuration parameters. +- Metrics like amount of RAM allocated for the dictionary or a number of queries since the dictionary was successfully loaded. @@ -133,13 +133,13 @@ Caching is not recommended because of potentially poor performance and difficult There are several ways to improve dictionary performance: -- Call the function for working with the dictionary after `GROUP BY`. -- Mark attributes to extract as injective. An attribute is called injective if different attribute values correspond to different keys. So when `GROUP BY` uses a function that fetches an attribute value by the key, this function is automatically taken out of `GROUP BY`. +- Call the function for working with the dictionary after `GROUP BY`. +- Mark attributes to extract as injective. An attribute is called injective if different attribute values correspond to different keys. So when `GROUP BY` uses a function that fetches an attribute value by the key, this function is automatically taken out of `GROUP BY`. ClickHouse generates an exception for errors with dictionaries. Examples of errors: -- The dictionary being accessed could not be loaded. -- Error querying a `cached` dictionary. +- The dictionary being accessed could not be loaded. +- Error querying a `cached` dictionary. You can view the list of dictionaries and their statuses in the [system.dictionaries](../../operations/system-tables/dictionaries.md) table. @@ -201,22 +201,22 @@ Configuration example of a composite key (key has one element with [String](../. ## Ways to Store Dictionaries in Memory -- [flat](#flat) -- [hashed](#hashed) -- [sparse_hashed](#sparse_hashed) -- [complex_key_hashed](#complex_key_hashed) -- [complex_key_sparse_hashed](#complex_key_sparse_hashed) -- [hashed_array](#hashed_array) -- [complex_key_hashed_array](#complex_key_hashed_array) -- [range_hashed](#range_hashed) -- [complex_key_range_hashed](#complex_key_range_hashed) -- [cache](#cache) -- [complex_key_cache](#complex_key_cache) -- [ssd_cache](#ssd_cache) -- [complex_key_ssd_cache](#complex_key_ssd_cache) -- [direct](#direct) -- [complex_key_direct](#complex_key_direct) -- [ip_trie](#ip_trie) +- [flat](#flat) +- [hashed](#hashed) +- [sparse_hashed](#sparse_hashed) +- [complex_key_hashed](#complex_key_hashed) +- [complex_key_sparse_hashed](#complex_key_sparse_hashed) +- [hashed_array](#hashed_array) +- [complex_key_hashed_array](#complex_key_hashed_array) +- [range_hashed](#range_hashed) +- [complex_key_range_hashed](#complex_key_range_hashed) +- [cache](#cache) +- [complex_key_cache](#complex_key_cache) +- [ssd_cache](#ssd_cache) +- [complex_key_ssd_cache](#complex_key_ssd_cache) +- [direct](#direct) +- [complex_key_direct](#complex_key_direct) +- [ip_trie](#ip_trie) ### flat @@ -476,10 +476,10 @@ This function returns the value for the specified `id`s and the date range that Details of the algorithm: -- If the `id` is not found or a range is not found for the `id`, it returns the default value of the attribute's type. -- If there are overlapping ranges and `range_lookup_strategy=min`, it returns a matching range with minimal `range_min`, if several ranges found, it returns a range with minimal `range_max`, if again several ranges found (several ranges had the same `range_min` and `range_max` it returns a random range of them. -- If there are overlapping ranges and `range_lookup_strategy=max`, it returns a matching range with maximal `range_min`, if several ranges found, it returns a range with maximal `range_max`, if again several ranges found (several ranges had the same `range_min` and `range_max` it returns a random range of them. -- If the `range_max` is `NULL`, the range is open. `NULL` is treated as maximal possible value. For the `range_min` `1970-01-01` or `0` (-MAX_INT) can be used as the open value. +- If the `id` is not found or a range is not found for the `id`, it returns the default value of the attribute's type. +- If there are overlapping ranges and `range_lookup_strategy=min`, it returns a matching range with minimal `range_min`, if several ranges found, it returns a range with minimal `range_max`, if again several ranges found (several ranges had the same `range_min` and `range_max` it returns a random range of them. +- If there are overlapping ranges and `range_lookup_strategy=max`, it returns a matching range with maximal `range_min`, if several ranges found, it returns a range with maximal `range_max`, if again several ranges found (several ranges had the same `range_min` and `range_max` it returns a random range of them. +- If the `range_max` is `NULL`, the range is open. `NULL` is treated as maximal possible value. For the `range_min` `1970-01-01` or `0` (-MAX_INT) can be used as the open value. Configuration example: @@ -919,14 +919,14 @@ In this case, ClickHouse can reload the dictionary earlier if the dictionary con When updating the dictionaries, the ClickHouse server applies different logic depending on the type of [source](#dictionary-sources): -- For a text file, it checks the time of modification. If the time differs from the previously recorded time, the dictionary is updated. -- For MySQL source, the time of modification is checked using a `SHOW TABLE STATUS` query (in case of MySQL 8 you need to disable meta-information caching in MySQL by `set global information_schema_stats_expiry=0`). -- Dictionaries from other sources are updated every time by default. +- For a text file, it checks the time of modification. If the time differs from the previously recorded time, the dictionary is updated. +- For MySQL source, the time of modification is checked using a `SHOW TABLE STATUS` query (in case of MySQL 8 you need to disable meta-information caching in MySQL by `set global information_schema_stats_expiry=0`). +- Dictionaries from other sources are updated every time by default. For other sources (ODBC, PostgreSQL, ClickHouse, etc), you can set up a query that will update the dictionaries only if they really changed, rather than each time. To do this, follow these steps: -- The dictionary table must have a field that always changes when the source data is updated. -- The settings of the source must specify a query that retrieves the changing field. The ClickHouse server interprets the query result as a row, and if this row has changed relative to its previous state, the dictionary is updated. Specify the query in the `` field in the settings for the [source](#dictionary-sources). +- The dictionary table must have a field that always changes when the source data is updated. +- The settings of the source must specify a query that retrieves the changing field. The ClickHouse server interprets the query result as a row, and if this row has changed relative to its previous state, the dictionary is updated. Specify the query in the `` field in the settings for the [source](#dictionary-sources). Example of settings: @@ -953,9 +953,9 @@ For `Cache`, `ComplexKeyCache`, `SSDCache`, and `SSDComplexKeyCache` dictionarie It is also possible for `Flat`, `Hashed`, `ComplexKeyHashed` dictionaries to only request data that was changed after the previous update. If `update_field` is specified as part of the dictionary source configuration, value of the previous update time in seconds will be added to the data request. Depends on source type (Executable, HTTP, MySQL, PostgreSQL, ClickHouse, or ODBC) different logic will be applied to `update_field` before request data from an external source. -- If the source is HTTP then `update_field` will be added as a query parameter with the last update time as the parameter value. -- If the source is Executable then `update_field` will be added as an executable script argument with the last update time as the argument value. -- If the source is ClickHouse, MySQL, PostgreSQL, ODBC there will be an additional part of `WHERE`, where `update_field` is compared as greater or equal with the last update time. +- If the source is HTTP then `update_field` will be added as a query parameter with the last update time as the parameter value. +- If the source is Executable then `update_field` will be added as an executable script argument with the last update time as the argument value. +- If the source is ClickHouse, MySQL, PostgreSQL, ODBC there will be an additional part of `WHERE`, where `update_field` is compared as greater or equal with the last update time. - Per default, this `WHERE`-condition is checked at the highest level of the SQL-Query. Alternatively, the condition can be checked in any other `WHERE`-clause within the query using the `{condition}`-keyword. Example: ```sql ... @@ -1054,18 +1054,18 @@ SETTINGS(format_csv_allow_single_quotes = 0) Types of sources (`source_type`): -- [Local file](#local_file) -- [Executable File](#executable) -- [Executable Pool](#executable_pool) -- [HTTP(s)](#http) -- DBMS - - [ODBC](#odbc) - - [MySQL](#mysql) - - [ClickHouse](#clickhouse) - - [MongoDB](#mongodb) - - [Redis](#redis) - - [Cassandra](#cassandra) - - [PostgreSQL](#postgresql) +- [Local file](#local_file) +- [Executable File](#executable) +- [Executable Pool](#executable_pool) +- [HTTP(s)](#http) +- DBMS + - [ODBC](#odbc) + - [MySQL](#mysql) + - [ClickHouse](#clickhouse) + - [MongoDB](#mongodb) + - [Redis](#redis) + - [Cassandra](#cassandra) + - [PostgreSQL](#postgresql) ## Local File {#local_file} @@ -1088,14 +1088,14 @@ SOURCE(FILE(path './user_files/os.tsv' format 'TabSeparated')) Setting fields: -- `path` – The absolute path to the file. -- `format` – The file format. All the formats described in [Formats](../../interfaces/formats.md#formats) are supported. +- `path` – The absolute path to the file. +- `format` – The file format. All the formats described in [Formats](../../interfaces/formats.md#formats) are supported. When a dictionary with source `FILE` is created via DDL command (`CREATE DICTIONARY ...`), the source file needs to be located in the `user_files` directory to prevent DB users from accessing arbitrary files on the ClickHouse node. **See Also** -- [Dictionary function](../../sql-reference/table-functions/dictionary.md#dictionary-function) +- [Dictionary function](../../sql-reference/table-functions/dictionary.md#dictionary-function) ## Executable File {#executable} @@ -1115,14 +1115,14 @@ Example of settings: Setting fields: -- `command` — The absolute path to the executable file, or the file name (if the command's directory is in the `PATH`). -- `format` — The file format. All the formats described in [Formats](../../interfaces/formats.md#formats) are supported. -- `command_termination_timeout` — The executable script should contain a main read-write loop. After the dictionary is destroyed, the pipe is closed, and the executable file will have `command_termination_timeout` seconds to shutdown before ClickHouse will send a SIGTERM signal to the child process. `command_termination_timeout` is specified in seconds. Default value is 10. Optional parameter. -- `command_read_timeout` - Timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. -- `command_write_timeout` - Timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. -- `implicit_key` — The executable source file can return only values, and the correspondence to the requested keys is determined implicitly — by the order of rows in the result. Default value is false. -- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using a whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `0`. Optional parameter. -- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. +- `command` — The absolute path to the executable file, or the file name (if the command's directory is in the `PATH`). +- `format` — The file format. All the formats described in [Formats](../../interfaces/formats.md#formats) are supported. +- `command_termination_timeout` — The executable script should contain a main read-write loop. After the dictionary is destroyed, the pipe is closed, and the executable file will have `command_termination_timeout` seconds to shutdown before ClickHouse will send a SIGTERM signal to the child process. `command_termination_timeout` is specified in seconds. Default value is 10. Optional parameter. +- `command_read_timeout` - Timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. +- `command_write_timeout` - Timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. +- `implicit_key` — The executable source file can return only values, and the correspondence to the requested keys is determined implicitly — by the order of rows in the result. Default value is false. +- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using a whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `0`. Optional parameter. +- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. That dictionary source can be configured only via XML configuration. Creating dictionaries with executable source via DDL is disabled; otherwise, the DB user would be able to execute arbitrary binaries on the ClickHouse node. @@ -1148,16 +1148,16 @@ Example of settings: Setting fields: -- `command` — The absolute path to the executable file, or the file name (if the program directory is written to `PATH`). -- `format` — The file format. All the formats described in “[Formats](../../interfaces/formats.md#formats)” are supported. -- `pool_size` — Size of pool. If 0 is specified as `pool_size` then there is no pool size restrictions. Default value is `16`. -- `command_termination_timeout` — executable script should contain main read-write loop. After dictionary is destroyed, pipe is closed, and executable file will have `command_termination_timeout` seconds to shutdown, before ClickHouse will send SIGTERM signal to child process. Specified in seconds. Default value is 10. Optional parameter. -- `max_command_execution_time` — Maximum executable script command execution time for processing block of data. Specified in seconds. Default value is 10. Optional parameter. -- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. -- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. -- `implicit_key` — The executable source file can return only values, and the correspondence to the requested keys is determined implicitly — by the order of rows in the result. Default value is false. Optional parameter. -- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `1`. Optional parameter. -- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. +- `command` — The absolute path to the executable file, or the file name (if the program directory is written to `PATH`). +- `format` — The file format. All the formats described in “[Formats](../../interfaces/formats.md#formats)” are supported. +- `pool_size` — Size of pool. If 0 is specified as `pool_size` then there is no pool size restrictions. Default value is `16`. +- `command_termination_timeout` — executable script should contain main read-write loop. After dictionary is destroyed, pipe is closed, and executable file will have `command_termination_timeout` seconds to shutdown, before ClickHouse will send SIGTERM signal to child process. Specified in seconds. Default value is 10. Optional parameter. +- `max_command_execution_time` — Maximum executable script command execution time for processing block of data. Specified in seconds. Default value is 10. Optional parameter. +- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. +- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. +- `implicit_key` — The executable source file can return only values, and the correspondence to the requested keys is determined implicitly — by the order of rows in the result. Default value is false. Optional parameter. +- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `1`. Optional parameter. +- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. That dictionary source can be configured only via XML configuration. Creating dictionaries with executable source via DDL is disabled, otherwise, the DB user would be able to execute arbitrary binary on ClickHouse node. @@ -1201,15 +1201,15 @@ In order for ClickHouse to access an HTTPS resource, you must [configure openSSL Setting fields: -- `url` – The source URL. -- `format` – The file format. All the formats described in “[Formats](../../interfaces/formats.md#formats)” are supported. -- `credentials` – Basic HTTP authentication. Optional parameter. -- `user` – Username required for the authentication. -- `password` – Password required for the authentication. -- `headers` – All custom HTTP headers entries used for the HTTP request. Optional parameter. -- `header` – Single HTTP header entry. -- `name` – Identifiant name used for the header send on the request. -- `value` – Value set for a specific identifiant name. +- `url` – The source URL. +- `format` – The file format. All the formats described in “[Formats](../../interfaces/formats.md#formats)” are supported. +- `credentials` – Basic HTTP authentication. Optional parameter. +- `user` – Username required for the authentication. +- `password` – Password required for the authentication. +- `headers` – All custom HTTP headers entries used for the HTTP request. Optional parameter. +- `header` – Single HTTP header entry. +- `name` – Identifiant name used for the header send on the request. +- `value` – Value set for a specific identifiant name. When creating a dictionary using the DDL command (`CREATE DICTIONARY ...`) remote hosts for HTTP dictionaries are checked against the contents of `remote_url_allow_hosts` section from config to prevent database users to access arbitrary HTTP server. @@ -1461,11 +1461,11 @@ SOURCE(ODBC( Setting fields: -- `db` – Name of the database. Omit it if the database name is set in the `` parameters. -- `table` – Name of the table and schema if exists. -- `connection_string` – Connection string. -- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). -- `query` – The custom query. Optional parameter. +- `db` – Name of the database. Omit it if the database name is set in the `` parameters. +- `table` – Name of the table and schema if exists. +- `connection_string` – Connection string. +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). +- `query` – The custom query. Optional parameter. :::note The `table` and `query` fields cannot be used together. And either one of the `table` or `query` fields must be declared. @@ -1523,28 +1523,28 @@ SOURCE(MYSQL( Setting fields: -- `port` – The port on the MySQL server. You can specify it for all replicas, or for each one individually (inside ``). +- `port` – The port on the MySQL server. You can specify it for all replicas, or for each one individually (inside ``). -- `user` – Name of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). +- `user` – Name of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). -- `password` – Password of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). +- `password` – Password of the MySQL user. You can specify it for all replicas, or for each one individually (inside ``). -- `replica` – Section of replica configurations. There can be multiple sections. +- `replica` – Section of replica configurations. There can be multiple sections. - `replica/host` – The MySQL host. - `replica/priority` – The replica priority. When attempting to connect, ClickHouse traverses the replicas in order of priority. The lower the number, the higher the priority. -- `db` – Name of the database. +- `db` – Name of the database. -- `table` – Name of the table. +- `table` – Name of the table. -- `where` – The selection criteria. The syntax for conditions is the same as for `WHERE` clause in MySQL, for example, `id > 10 AND id < 20`. Optional parameter. +- `where` – The selection criteria. The syntax for conditions is the same as for `WHERE` clause in MySQL, for example, `id > 10 AND id < 20`. Optional parameter. -- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). -- `fail_on_connection_loss` – The configuration parameter that controls behavior of the server on connection loss. If `true`, an exception is thrown immediately if the connection between client and server was lost. If `false`, the ClickHouse server retries to execute the query three times before throwing an exception. Note that retrying leads to increased response times. Default value: `false`. +- `fail_on_connection_loss` – The configuration parameter that controls behavior of the server on connection loss. If `true`, an exception is thrown immediately if the connection between client and server was lost. If `false`, the ClickHouse server retries to execute the query three times before throwing an exception. Note that retrying leads to increased response times. Default value: `false`. -- `query` – The custom query. Optional parameter. +- `query` – The custom query. Optional parameter. :::note The `table` or `where` fields cannot be used together with the `query` field. And either one of the `table` or `query` fields must be declared. @@ -1630,16 +1630,16 @@ SOURCE(CLICKHOUSE( Setting fields: -- `host` – The ClickHouse host. If it is a local host, the query is processed without any network activity. To improve fault tolerance, you can create a [Distributed](../../engines/table-engines/special/distributed.md) table and enter it in subsequent configurations. -- `port` – The port on the ClickHouse server. -- `user` – Name of the ClickHouse user. -- `password` – Password of the ClickHouse user. -- `db` – Name of the database. -- `table` – Name of the table. -- `where` – The selection criteria. May be omitted. -- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). -- `secure` - Use ssl for connection. -- `query` – The custom query. Optional parameter. +- `host` – The ClickHouse host. If it is a local host, the query is processed without any network activity. To improve fault tolerance, you can create a [Distributed](../../engines/table-engines/special/distributed.md) table and enter it in subsequent configurations. +- `port` – The port on the ClickHouse server. +- `user` – Name of the ClickHouse user. +- `password` – Password of the ClickHouse user. +- `db` – Name of the database. +- `table` – Name of the table. +- `where` – The selection criteria. May be omitted. +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). +- `secure` - Use ssl for connection. +- `query` – The custom query. Optional parameter. :::note The `table` or `where` fields cannot be used together with the `query` field. And either one of the `table` or `query` fields must be declared. @@ -1677,12 +1677,12 @@ SOURCE(MONGODB( Setting fields: -- `host` – The MongoDB host. -- `port` – The port on the MongoDB server. -- `user` – Name of the MongoDB user. -- `password` – Password of the MongoDB user. -- `db` – Name of the database. -- `collection` – Name of the collection. +- `host` – The MongoDB host. +- `port` – The port on the MongoDB server. +- `user` – Name of the MongoDB user. +- `password` – Password of the MongoDB user. +- `db` – Name of the database. +- `collection` – Name of the collection. ### Redis @@ -1712,10 +1712,10 @@ SOURCE(REDIS( Setting fields: -- `host` – The Redis host. -- `port` – The port on the Redis server. -- `storage_type` – The structure of internal Redis storage using for work with keys. `simple` is for simple sources and for hashed single key sources, `hash_map` is for hashed sources with two keys. Ranged sources and cache sources with complex key are unsupported. May be omitted, default value is `simple`. -- `db_index` – The specific numeric index of Redis logical database. May be omitted, default value is 0. +- `host` – The Redis host. +- `port` – The port on the Redis server. +- `storage_type` – The structure of internal Redis storage using for work with keys. `simple` is for simple sources and for hashed single key sources, `hash_map` is for hashed sources with two keys. Ranged sources and cache sources with complex key are unsupported. May be omitted, default value is `simple`. +- `db_index` – The specific numeric index of Redis logical database. May be omitted, default value is 0. ### Cassandra @@ -1742,18 +1742,18 @@ Example of settings: Setting fields: -- `host` – The Cassandra host or comma-separated list of hosts. -- `port` – The port on the Cassandra servers. If not specified, default port 9042 is used. -- `user` – Name of the Cassandra user. -- `password` – Password of the Cassandra user. -- `keyspace` – Name of the keyspace (database). -- `column_family` – Name of the column family (table). -- `allow_filering` – Flag to allow or not potentially expensive conditions on clustering key columns. Default value is 1. -- `partition_key_prefix` – Number of partition key columns in primary key of the Cassandra table. Required for compose key dictionaries. Order of key columns in the dictionary definition must be the same as in Cassandra. Default value is 1 (the first key column is a partition key and other key columns are clustering key). -- `consistency` – Consistency level. Possible values: `One`, `Two`, `Three`, `All`, `EachQuorum`, `Quorum`, `LocalQuorum`, `LocalOne`, `Serial`, `LocalSerial`. Default value is `One`. -- `where` – Optional selection criteria. -- `max_threads` – The maximum number of threads to use for loading data from multiple partitions in compose key dictionaries. -- `query` – The custom query. Optional parameter. +- `host` – The Cassandra host or comma-separated list of hosts. +- `port` – The port on the Cassandra servers. If not specified, default port 9042 is used. +- `user` – Name of the Cassandra user. +- `password` – Password of the Cassandra user. +- `keyspace` – Name of the keyspace (database). +- `column_family` – Name of the column family (table). +- `allow_filering` – Flag to allow or not potentially expensive conditions on clustering key columns. Default value is 1. +- `partition_key_prefix` – Number of partition key columns in primary key of the Cassandra table. Required for compose key dictionaries. Order of key columns in the dictionary definition must be the same as in Cassandra. Default value is 1 (the first key column is a partition key and other key columns are clustering key). +- `consistency` – Consistency level. Possible values: `One`, `Two`, `Three`, `All`, `EachQuorum`, `Quorum`, `LocalQuorum`, `LocalOne`, `Serial`, `LocalSerial`. Default value is `One`. +- `where` – Optional selection criteria. +- `max_threads` – The maximum number of threads to use for loading data from multiple partitions in compose key dictionaries. +- `query` – The custom query. Optional parameter. :::note The `column_family` or `where` fields cannot be used together with the `query` field. And either one of the `column_family` or `query` fields must be declared. @@ -1798,19 +1798,19 @@ SOURCE(POSTGRESQL( Setting fields: -- `host` – The host on the PostgreSQL server. You can specify it for all replicas, or for each one individually (inside ``). -- `port` – The port on the PostgreSQL server. You can specify it for all replicas, or for each one individually (inside ``). -- `user` – Name of the PostgreSQL user. You can specify it for all replicas, or for each one individually (inside ``). -- `password` – Password of the PostgreSQL user. You can specify it for all replicas, or for each one individually (inside ``). -- `replica` – Section of replica configurations. There can be multiple sections: - - `replica/host` – The PostgreSQL host. - - `replica/port` – The PostgreSQL port. - - `replica/priority` – The replica priority. When attempting to connect, ClickHouse traverses the replicas in order of priority. The lower the number, the higher the priority. -- `db` – Name of the database. -- `table` – Name of the table. -- `where` – The selection criteria. The syntax for conditions is the same as for `WHERE` clause in PostgreSQL. For example, `id > 10 AND id < 20`. Optional parameter. -- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). -- `query` – The custom query. Optional parameter. +- `host` – The host on the PostgreSQL server. You can specify it for all replicas, or for each one individually (inside ``). +- `port` – The port on the PostgreSQL server. You can specify it for all replicas, or for each one individually (inside ``). +- `user` – Name of the PostgreSQL user. You can specify it for all replicas, or for each one individually (inside ``). +- `password` – Password of the PostgreSQL user. You can specify it for all replicas, or for each one individually (inside ``). +- `replica` – Section of replica configurations. There can be multiple sections: + - `replica/host` – The PostgreSQL host. + - `replica/port` – The PostgreSQL port. + - `replica/priority` – The replica priority. When attempting to connect, ClickHouse traverses the replicas in order of priority. The lower the number, the higher the priority. +- `db` – Name of the database. +- `table` – Name of the table. +- `where` – The selection criteria. The syntax for conditions is the same as for `WHERE` clause in PostgreSQL. For example, `id > 10 AND id < 20`. Optional parameter. +- `invalidate_query` – Query for checking the dictionary status. Optional parameter. Read more in the section [Updating dictionaries](#dictionary-updates). +- `query` – The custom query. Optional parameter. :::note The `table` or `where` fields cannot be used together with the `query` field. And either one of the `table` or `query` fields must be declared. @@ -1860,8 +1860,8 @@ XML description: Attributes are described in the elements: -- `` — Key column -- `` — Data column: there can be a multiple number of attributes. +- `` — Key column +- `` — Data column: there can be a multiple number of attributes. DDL query: @@ -1876,15 +1876,15 @@ PRIMARY KEY Id Attributes are described in the query body: -- `PRIMARY KEY` — Key column -- `AttrName AttrType` — Data column. There can be a multiple number of attributes. +- `PRIMARY KEY` — Key column +- `AttrName AttrType` — Data column. There can be a multiple number of attributes. ## Key ClickHouse supports the following types of keys: -- Numeric key. `UInt64`. Defined in the `` tag or using `PRIMARY KEY` keyword. -- Composite key. Set of values of different types. Defined in the tag `` or `PRIMARY KEY` keyword. +- Numeric key. `UInt64`. Defined in the `` tag or using `PRIMARY KEY` keyword. +- Composite key. Set of values of different types. Defined in the tag `` or `PRIMARY KEY` keyword. An xml structure can contain either `` or ``. DDL-query must contain single `PRIMARY KEY`. @@ -1906,7 +1906,7 @@ Configuration example: Configuration fields: -- `name` – The name of the column with keys. +- `name` – The name of the column with keys. For DDL-query: @@ -1919,7 +1919,7 @@ PRIMARY KEY Id ... ``` -- `PRIMARY KEY` – The name of the column with keys. +- `PRIMARY KEY` – The name of the column with keys. ### Composite Key @@ -2118,8 +2118,8 @@ LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1)) When configuring the polygon dictionary, the key must have one of two types: -- A simple polygon. It is an array of points. -- MultiPolygon. It is an array of polygons. Each polygon is a two-dimensional array of points. The first element of this array is the outer boundary of the polygon, and subsequent elements specify areas to be excluded from it. +- A simple polygon. It is an array of points. +- MultiPolygon. It is an array of polygons. Each polygon is a two-dimensional array of points. The first element of this array is the outer boundary of the polygon, and subsequent elements specify areas to be excluded from it. Points can be specified as an array or a tuple of their coordinates. In the current implementation, only two-dimensional points are supported. @@ -2127,17 +2127,17 @@ The user can upload their own data in all formats supported by ClickHouse. There are 3 types of [in-memory storage](#storig-dictionaries-in-memory) available: -- `POLYGON_SIMPLE`. This is a naive implementation, where a linear pass through all polygons is made for each query, and membership is checked for each one without using additional indexes. +- `POLYGON_SIMPLE`. This is a naive implementation, where a linear pass through all polygons is made for each query, and membership is checked for each one without using additional indexes. -- `POLYGON_INDEX_EACH`. A separate index is built for each polygon, which allows you to quickly check whether it belongs in most cases (optimized for geographical regions). +- `POLYGON_INDEX_EACH`. A separate index is built for each polygon, which allows you to quickly check whether it belongs in most cases (optimized for geographical regions). Also, a grid is superimposed on the area under consideration, which significantly narrows the number of polygons under consideration. The grid is created by recursively dividing the cell into 16 equal parts and is configured with two parameters. The division stops when the recursion depth reaches `MAX_DEPTH` or when the cell crosses no more than `MIN_INTERSECTIONS` polygons. To respond to the query, there is a corresponding cell, and the index for the polygons stored in it is accessed alternately. -- `POLYGON_INDEX_CELL`. This placement also creates the grid described above. The same options are available. For each sheet cell, an index is built on all pieces of polygons that fall into it, which allows you to quickly respond to a request. +- `POLYGON_INDEX_CELL`. This placement also creates the grid described above. The same options are available. For each sheet cell, an index is built on all pieces of polygons that fall into it, which allows you to quickly respond to a request. -- `POLYGON`. Synonym to `POLYGON_INDEX_CELL`. +- `POLYGON`. Synonym to `POLYGON_INDEX_CELL`. Dictionary queries are carried out using standard [functions](../../sql-reference/functions/ext-dict-functions.md) for working with dictionaries. An important difference is that here the keys will be the points for which you want to find the polygon containing them. @@ -2272,10 +2272,10 @@ ClickHouse contains a built-in feature for working with a geobase. This allows you to: -- Use a region’s ID to get its name in the desired language. -- Use a region’s ID to get the ID of a city, area, federal district, country, or continent. -- Check whether a region is part of another region. -- Get a chain of parent regions. +- Use a region’s ID to get its name in the desired language. +- Use a region’s ID to get the ID of a city, area, federal district, country, or continent. +- Check whether a region is part of another region. +- Get a chain of parent regions. All the functions support “translocality,” the ability to simultaneously use different perspectives on region ownership. For more information, see the section “Functions for working with web analytics dictionaries”. @@ -2292,15 +2292,15 @@ You can also create these files yourself. The file format is as follows: `regions_hierarchy*.txt`: TabSeparated (no header), columns: -- region ID (`UInt32`) -- parent region ID (`UInt32`) -- region type (`UInt8`): 1 - continent, 3 - country, 4 - federal district, 5 - region, 6 - city; other types do not have values -- population (`UInt32`) — optional column +- region ID (`UInt32`) +- parent region ID (`UInt32`) +- region type (`UInt8`): 1 - continent, 3 - country, 4 - federal district, 5 - region, 6 - city; other types do not have values +- population (`UInt32`) — optional column `regions_names_*.txt`: TabSeparated (no header), columns: -- region ID (`UInt32`) -- region name (`String`) — Can’t contain tabs or line feeds, even escaped ones. +- region ID (`UInt32`) +- region name (`String`) — Can’t contain tabs or line feeds, even escaped ones. A flat array is used for storing in RAM. For this reason, IDs shouldn’t be more than a million. @@ -2321,10 +2321,10 @@ ClickHouse contains a built-in feature for working with a geobase. This allows you to: -- Use a region’s ID to get its name in the desired language. -- Use a region’s ID to get the ID of a city, area, federal district, country, or continent. -- Check whether a region is part of another region. -- Get a chain of parent regions. +- Use a region’s ID to get its name in the desired language. +- Use a region’s ID to get the ID of a city, area, federal district, country, or continent. +- Check whether a region is part of another region. +- Get a chain of parent regions. All the functions support “translocality,” the ability to simultaneously use different perspectives on region ownership. For more information, see the section “Functions for working with web analytics dictionaries”. @@ -2341,15 +2341,15 @@ You can also create these files yourself. The file format is as follows: `regions_hierarchy*.txt`: TabSeparated (no header), columns: -- region ID (`UInt32`) -- parent region ID (`UInt32`) -- region type (`UInt8`): 1 - continent, 3 - country, 4 - federal district, 5 - region, 6 - city; other types do not have values -- population (`UInt32`) — optional column +- region ID (`UInt32`) +- parent region ID (`UInt32`) +- region type (`UInt8`): 1 - continent, 3 - country, 4 - federal district, 5 - region, 6 - city; other types do not have values +- population (`UInt32`) — optional column `regions_names_*.txt`: TabSeparated (no header), columns: -- region ID (`UInt32`) -- region name (`String`) — Can’t contain tabs or line feeds, even escaped ones. +- region ID (`UInt32`) +- region name (`String`) — Can’t contain tabs or line feeds, even escaped ones. A flat array is used for storing in RAM. For this reason, IDs shouldn’t be more than a million. diff --git a/docs/en/sql-reference/functions/arithmetic-functions.md b/docs/en/sql-reference/functions/arithmetic-functions.md index c5244cf62e3..136e90854df 100644 --- a/docs/en/sql-reference/functions/arithmetic-functions.md +++ b/docs/en/sql-reference/functions/arithmetic-functions.md @@ -145,12 +145,12 @@ max2(value1, value2) **Arguments** -- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). -- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). **Returned value** -- The maximum of two values. +- The maximum of two values. Type: [Float](../../sql-reference/data-types/float.md). @@ -182,12 +182,12 @@ min2(value1, value2) **Arguments** -- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). -- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). **Returned value** -- The minimum of two values. +- The minimum of two values. Type: [Float](../../sql-reference/data-types/float.md). @@ -225,13 +225,13 @@ multiplyDecimal(a, b[, result_scale]) **Arguments** -- `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). -- `b` — Second value: [Decimal](../../sql-reference/data-types/decimal.md). -- `result_scale` — Scale of result: [Int/UInt](../../sql-reference/data-types/int-uint.md). +- `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). +- `b` — Second value: [Decimal](../../sql-reference/data-types/decimal.md). +- `result_scale` — Scale of result: [Int/UInt](../../sql-reference/data-types/int-uint.md). **Returned value** -- The result of multiplication with given scale. +- The result of multiplication with given scale. Type: [Decimal256](../../sql-reference/data-types/decimal.md). @@ -297,13 +297,13 @@ divideDecimal(a, b[, result_scale]) **Arguments** -- `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). -- `b` — Second value: [Decimal](../../sql-reference/data-types/decimal.md). -- `result_scale` — Scale of result: [Int/UInt](../../sql-reference/data-types/int-uint.md). +- `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). +- `b` — Second value: [Decimal](../../sql-reference/data-types/decimal.md). +- `result_scale` — Scale of result: [Int/UInt](../../sql-reference/data-types/int-uint.md). **Returned value** -- The result of division with given scale. +- The result of division with given scale. Type: [Decimal256](../../sql-reference/data-types/decimal.md). diff --git a/docs/en/sql-reference/functions/bit-functions.md b/docs/en/sql-reference/functions/bit-functions.md index 1648ce35056..8223976b354 100644 --- a/docs/en/sql-reference/functions/bit-functions.md +++ b/docs/en/sql-reference/functions/bit-functions.md @@ -34,12 +34,12 @@ bitShiftLeft(a, b) **Arguments** -- `a` — A value to shift. [Integer types](../../sql-reference/data-types/int-uint.md), [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `b` — The number of shift positions. [Unsigned integer types](../../sql-reference/data-types/int-uint.md), 64 bit types or less are allowed. +- `a` — A value to shift. [Integer types](../../sql-reference/data-types/int-uint.md), [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `b` — The number of shift positions. [Unsigned integer types](../../sql-reference/data-types/int-uint.md), 64 bit types or less are allowed. **Returned value** -- Shifted value. +- Shifted value. The type of the returned value is the same as the type of the input value. @@ -81,12 +81,12 @@ bitShiftRight(a, b) **Arguments** -- `a` — A value to shift. [Integer types](../../sql-reference/data-types/int-uint.md), [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `b` — The number of shift positions. [Unsigned integer types](../../sql-reference/data-types/int-uint.md), 64 bit types or less are allowed. +- `a` — A value to shift. [Integer types](../../sql-reference/data-types/int-uint.md), [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `b` — The number of shift positions. [Unsigned integer types](../../sql-reference/data-types/int-uint.md), 64 bit types or less are allowed. **Returned value** -- Shifted value. +- Shifted value. The type of the returned value is the same as the type of the input value. @@ -179,8 +179,8 @@ SELECT bitTest(number, index) **Arguments** -- `number` – Integer number. -- `index` – Position of bit. +- `number` – Integer number. +- `index` – Position of bit. **Returned values** @@ -244,8 +244,8 @@ SELECT bitTestAll(number, index1, index2, index3, index4, ...) **Arguments** -- `number` – Integer number. -- `index1`, `index2`, `index3`, `index4` – Positions of bit. For example, for set of positions (`index1`, `index2`, `index3`, `index4`) is true if and only if all of its positions are true (`index1` ⋀ `index2`, ⋀ `index3` ⋀ `index4`). +- `number` – Integer number. +- `index1`, `index2`, `index3`, `index4` – Positions of bit. For example, for set of positions (`index1`, `index2`, `index3`, `index4`) is true if and only if all of its positions are true (`index1` ⋀ `index2`, ⋀ `index3` ⋀ `index4`). **Returned values** @@ -309,8 +309,8 @@ SELECT bitTestAny(number, index1, index2, index3, index4, ...) **Arguments** -- `number` – Integer number. -- `index1`, `index2`, `index3`, `index4` – Positions of bit. +- `number` – Integer number. +- `index1`, `index2`, `index3`, `index4` – Positions of bit. **Returned values** @@ -364,11 +364,11 @@ bitCount(x) **Arguments** -- `x` — [Integer](../../sql-reference/data-types/int-uint.md) or [floating-point](../../sql-reference/data-types/float.md) number. The function uses the value representation in memory. It allows supporting floating-point numbers. +- `x` — [Integer](../../sql-reference/data-types/int-uint.md) or [floating-point](../../sql-reference/data-types/float.md) number. The function uses the value representation in memory. It allows supporting floating-point numbers. **Returned value** -- Number of bits set to one in the input number. +- Number of bits set to one in the input number. The function does not convert input value to a larger type ([sign extension](https://en.wikipedia.org/wiki/Sign_extension)). So, for example, `bitCount(toUInt8(-1)) = 8`. @@ -404,12 +404,12 @@ bitHammingDistance(int1, int2) **Arguments** -- `int1` — First integer value. [Int64](../../sql-reference/data-types/int-uint.md). -- `int2` — Second integer value. [Int64](../../sql-reference/data-types/int-uint.md). +- `int1` — First integer value. [Int64](../../sql-reference/data-types/int-uint.md). +- `int2` — Second integer value. [Int64](../../sql-reference/data-types/int-uint.md). **Returned value** -- The Hamming distance. +- The Hamming distance. Type: [UInt8](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/bitmap-functions.md b/docs/en/sql-reference/functions/bitmap-functions.md index 9751de8abed..69e9e672f6a 100644 --- a/docs/en/sql-reference/functions/bitmap-functions.md +++ b/docs/en/sql-reference/functions/bitmap-functions.md @@ -24,7 +24,7 @@ bitmapBuild(array) **Arguments** -- `array` – Unsigned integer array. +- `array` – Unsigned integer array. **Example** @@ -48,7 +48,7 @@ bitmapToArray(bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -72,9 +72,9 @@ bitmapSubsetInRange(bitmap, range_start, range_end) **Arguments** -- `bitmap` – [Bitmap object](#bitmap_functions-bitmapbuild). -- `range_start` – Range start point. Type: [UInt32](../../sql-reference/data-types/int-uint.md). -- `range_end` – Range end point (excluded). Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `bitmap` – [Bitmap object](#bitmap_functions-bitmapbuild). +- `range_start` – Range start point. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `range_end` – Range end point (excluded). Type: [UInt32](../../sql-reference/data-types/int-uint.md). **Example** @@ -100,9 +100,9 @@ bitmapSubsetLimit(bitmap, range_start, cardinality_limit) **Arguments** -- `bitmap` – [Bitmap object](#bitmap_functions-bitmapbuild). -- `range_start` – The subset starting point. Type: [UInt32](../../sql-reference/data-types/int-uint.md). -- `cardinality_limit` – The subset cardinality upper limit. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `bitmap` – [Bitmap object](#bitmap_functions-bitmapbuild). +- `range_start` – The subset starting point. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `cardinality_limit` – The subset cardinality upper limit. Type: [UInt32](../../sql-reference/data-types/int-uint.md). **Returned value** @@ -138,9 +138,9 @@ subBitmap(bitmap, offset, cardinality_limit) **Arguments** -- `bitmap` – The bitmap. Type: [Bitmap object](#bitmap_functions-bitmapbuild). -- `offset` – The position of the first element of the subset. Type: [UInt32](../../sql-reference/data-types/int-uint.md). -- `cardinality_limit` – The maximum number of elements in the subset. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `bitmap` – The bitmap. Type: [Bitmap object](#bitmap_functions-bitmapbuild). +- `offset` – The position of the first element of the subset. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `cardinality_limit` – The maximum number of elements in the subset. Type: [UInt32](../../sql-reference/data-types/int-uint.md). **Returned value** @@ -174,13 +174,13 @@ bitmapContains(haystack, needle) **Arguments** -- `haystack` – [Bitmap object](#bitmap_functions-bitmapbuild), where the function searches. -- `needle` – Value that the function searches. Type: [UInt32](../../sql-reference/data-types/int-uint.md). +- `haystack` – [Bitmap object](#bitmap_functions-bitmapbuild), where the function searches. +- `needle` – Value that the function searches. Type: [UInt32](../../sql-reference/data-types/int-uint.md). **Returned values** -- 0 — If `haystack` does not contain `needle`. -- 1 — If `haystack` contains `needle`. +- 0 — If `haystack` does not contain `needle`. +- 1 — If `haystack` contains `needle`. Type: `UInt8`. @@ -208,12 +208,12 @@ If you are sure that `bitmap2` contains strictly one element, consider using the **Arguments** -- `bitmap*` – Bitmap object. +- `bitmap*` – Bitmap object. **Return values** -- `1`, if `bitmap1` and `bitmap2` have one similar element at least. -- `0`, otherwise. +- `1`, if `bitmap1` and `bitmap2` have one similar element at least. +- `0`, otherwise. **Example** @@ -238,7 +238,7 @@ bitmapHasAll(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -262,7 +262,7 @@ bitmapCardinality(bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -284,7 +284,7 @@ Retrun the smallest value of type UInt64 in the set, UINT32_MAX if the set is em **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -306,7 +306,7 @@ Retrun the greatest value of type UInt64 in the set, 0 if the set is empty. **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -328,9 +328,9 @@ Transform an array of values in a bitmap to another array of values, the result **Arguments** -- `bitmap` – Bitmap object. -- `from_array` – UInt32 array. For idx in range \[0, from_array.size()), if bitmap contains from_array\[idx\], then replace it with to_array\[idx\]. Note that the result depends on array ordering if there are common elements between from_array and to_array. -- `to_array` – UInt32 array, its size shall be the same to from_array. +- `bitmap` – Bitmap object. +- `from_array` – UInt32 array. For idx in range \[0, from_array.size()), if bitmap contains from_array\[idx\], then replace it with to_array\[idx\]. Note that the result depends on array ordering if there are common elements between from_array and to_array. +- `to_array` – UInt32 array, its size shall be the same to from_array. **Example** @@ -354,7 +354,7 @@ bitmapAnd(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -378,7 +378,7 @@ bitmapOr(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -402,7 +402,7 @@ bitmapXor(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -426,7 +426,7 @@ bitmapAndnot(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -450,7 +450,7 @@ bitmapAndCardinality(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -474,7 +474,7 @@ bitmapOrCardinality(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -498,7 +498,7 @@ bitmapXorCardinality(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** @@ -522,7 +522,7 @@ bitmapAndnotCardinality(bitmap,bitmap) **Arguments** -- `bitmap` – Bitmap object. +- `bitmap` – Bitmap object. **Example** diff --git a/docs/en/sql-reference/functions/comparison-functions.md b/docs/en/sql-reference/functions/comparison-functions.md index 586c0dc54e6..8476448cddd 100644 --- a/docs/en/sql-reference/functions/comparison-functions.md +++ b/docs/en/sql-reference/functions/comparison-functions.md @@ -10,10 +10,10 @@ Comparison functions always return 0 or 1 (Uint8). The following types can be compared: -- numbers -- strings and fixed strings -- dates -- dates with times +- numbers +- strings and fixed strings +- dates +- dates with times within each group, but not between different groups. diff --git a/docs/en/sql-reference/functions/conditional-functions.md b/docs/en/sql-reference/functions/conditional-functions.md index ff1ac237025..e93bbc04ac2 100644 --- a/docs/en/sql-reference/functions/conditional-functions.md +++ b/docs/en/sql-reference/functions/conditional-functions.md @@ -22,9 +22,9 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Arguments** -- `cond` – The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL. -- `then` – The expression to return if condition is met. -- `else` – The expression to return if condition is not met. +- `cond` – The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL. +- `then` – The expression to return if condition is met. +- `else` – The expression to return if condition is not met. **Returned values** @@ -60,7 +60,7 @@ Result: └────────────┘ ``` -- `then` and `else` must have the lowest common type. +- `then` and `else` must have the lowest common type. **Example:** @@ -106,13 +106,13 @@ Syntax: `cond ? then : else` Returns `then` if the `cond` evaluates to be true (greater than zero), otherwise returns `else`. -- `cond` must be of type of `UInt8`, and `then` and `else` must have the lowest common type. +- `cond` must be of type of `UInt8`, and `then` and `else` must have the lowest common type. -- `then` and `else` can be `NULL` +- `then` and `else` can be `NULL` **See also** -- [ifNotFinite](../../sql-reference/functions/other-functions.md#ifnotfinite). +- [ifNotFinite](../../sql-reference/functions/other-functions.md#ifnotfinite). ## multiIf @@ -128,9 +128,9 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Arguments** -- `cond_N` — The condition for the function to return `then_N`. -- `then_N` — The result of the function when executed. -- `else` — The result of the function if none of the conditions is met. +- `cond_N` — The condition for the function to return `then_N`. +- `then_N` — The result of the function when executed. +- `else` — The result of the function if none of the conditions is met. The function accepts `2N+1` parameters. diff --git a/docs/en/sql-reference/functions/date-time-functions.md b/docs/en/sql-reference/functions/date-time-functions.md index d5c11920c67..446e9484436 100644 --- a/docs/en/sql-reference/functions/date-time-functions.md +++ b/docs/en/sql-reference/functions/date-time-functions.md @@ -39,7 +39,7 @@ Alias: `timezone`. **Returned value** -- Timezone. +- Timezone. Type: [String](../../sql-reference/data-types/string.md). @@ -57,12 +57,12 @@ Alias: `toTimezone`. **Arguments** -- `value` — Time or date and time. [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — Timezone for the returned value. [String](../../sql-reference/data-types/string.md). This argument is a constant, because `toTimezone` changes the timezone of a column (timezone is an attribute of `DateTime*` types). +- `value` — Time or date and time. [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — Timezone for the returned value. [String](../../sql-reference/data-types/string.md). This argument is a constant, because `toTimezone` changes the timezone of a column (timezone is an attribute of `DateTime*` types). **Returned value** -- Date and time. +- Date and time. Type: [DateTime](../../sql-reference/data-types/datetime.md). @@ -115,11 +115,11 @@ Alias: `timezoneOf`. **Arguments** -- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). **Returned value** -- Timezone name. +- Timezone name. Type: [String](../../sql-reference/data-types/string.md). @@ -152,11 +152,11 @@ Alias: `timezoneOffset`. **Arguments** -- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). **Returned value** -- Offset from UTC in seconds. +- Offset from UTC in seconds. Type: [Int32](../../sql-reference/data-types/int-uint.md). @@ -262,7 +262,7 @@ toUnixTimestamp(str, [timezone]) **Returned value** -- Returns the unix timestamp. +- Returns the unix timestamp. Type: `UInt32`. @@ -367,12 +367,12 @@ toStartOfSecond(value, [timezone]) **Arguments** -- `value` — Date and time. [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). If not specified, the function uses the timezone of the `value` parameter. [String](../../sql-reference/data-types/string.md). +- `value` — Date and time. [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). If not specified, the function uses the timezone of the `value` parameter. [String](../../sql-reference/data-types/string.md). **Returned value** -- Input value without sub-seconds. +- Input value without sub-seconds. Type: [DateTime64](../../sql-reference/data-types/datetime64.md). @@ -410,7 +410,7 @@ Result: **See also** -- [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) server configuration parameter. +- [Timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) server configuration parameter. ## toStartOfFiveMinutes @@ -499,9 +499,9 @@ The following table describes how the mode argument works. For mode values with a meaning of “with 4 or more days this year,” weeks are numbered according to ISO 8601:1988: -- If the week containing January 1 has 4 or more days in the new year, it is week 1. +- If the week containing January 1 has 4 or more days in the new year, it is week 1. -- Otherwise, it is the last week of the previous year, and the next week is week 1. +- Otherwise, it is the last week of the previous year, and the next week is week 1. For mode values with a meaning of “contains January 1”, the week contains January 1 is week 1. It does not matter how many days in the new year the week contained, even if it contained only one day. @@ -513,9 +513,9 @@ toWeek(t[, mode[, time_zone]]) **Arguments** -- `t` – Date or DateTime. -- `mode` – Optional parameter, Range of values is \[0,9\], default is 0. -- `Timezone` – Optional parameter, it behaves like any other conversion function. +- `t` – Date or DateTime. +- `mode` – Optional parameter, Range of values is \[0,9\], default is 0. +- `Timezone` – Optional parameter, it behaves like any other conversion function. **Example** @@ -570,7 +570,7 @@ age('unit', startdate, enddate, [timezone]) **Arguments** -- `unit` — The type of interval for result. [String](../../sql-reference/data-types/string.md). +- `unit` — The type of interval for result. [String](../../sql-reference/data-types/string.md). Possible values: - `second` (possible abbreviations: `ss`, `s`) @@ -582,11 +582,11 @@ age('unit', startdate, enddate, [timezone]) - `quarter` (possible abbreviations: `qq`, `q`) - `year` (possible abbreviations: `yyyy`, `yy`) -- `startdate` — The first time value to subtract (the subtrahend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `startdate` — The first time value to subtract (the subtrahend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `enddate` — The second time value to subtract from (the minuend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `enddate` — The second time value to subtract from (the minuend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) (optional). If specified, it is applied to both `startdate` and `enddate`. If not specified, timezones of `startdate` and `enddate` are used. If they are not the same, the result is unspecified. [String](../../sql-reference/data-types/string.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) (optional). If specified, it is applied to both `startdate` and `enddate`. If not specified, timezones of `startdate` and `enddate` are used. If they are not the same, the result is unspecified. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -649,7 +649,7 @@ Aliases: `dateDiff`, `DATE_DIFF`, `timestampDiff`, `timestamp_diff`, `TIMESTAMP_ **Arguments** -- `unit` — The type of interval for result. [String](../../sql-reference/data-types/string.md). +- `unit` — The type of interval for result. [String](../../sql-reference/data-types/string.md). Possible values: - `second` (possible abbreviations: `ss`, `s`) @@ -661,11 +661,11 @@ Aliases: `dateDiff`, `DATE_DIFF`, `timestampDiff`, `timestamp_diff`, `TIMESTAMP_ - `quarter` (possible abbreviations: `qq`, `q`) - `year` (possible abbreviations: `yyyy`, `yy`) -- `startdate` — The first time value to subtract (the subtrahend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `startdate` — The first time value to subtract (the subtrahend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `enddate` — The second time value to subtract from (the minuend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `enddate` — The second time value to subtract from (the minuend). [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) (optional). If specified, it is applied to both `startdate` and `enddate`. If not specified, timezones of `startdate` and `enddate` are used. If they are not the same, the result is unspecified. [String](../../sql-reference/data-types/string.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) (optional). If specified, it is applied to both `startdate` and `enddate`. If not specified, timezones of `startdate` and `enddate` are used. If they are not the same, the result is unspecified. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -722,7 +722,7 @@ Alias: `dateTrunc`. **Arguments** -- `unit` — The type of interval to truncate the result. [String Literal](../syntax.md#syntax-string-literal). +- `unit` — The type of interval to truncate the result. [String Literal](../syntax.md#syntax-string-literal). Possible values: - `second` @@ -734,12 +734,12 @@ Alias: `dateTrunc`. - `quarter` - `year` -- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). If not specified, the function uses the timezone of the `value` parameter. [String](../../sql-reference/data-types/string.md). +- `value` — Date and time. [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). If not specified, the function uses the timezone of the `value` parameter. [String](../../sql-reference/data-types/string.md). **Returned value** -- Value, truncated to the specified part of date. +- Value, truncated to the specified part of date. Type: [DateTime](../../sql-reference/data-types/datetime.md). @@ -775,7 +775,7 @@ Result: **See Also** -- [toStartOfInterval](#tostartofintervaltime-or-data-interval-x-unit-time-zone) +- [toStartOfInterval](#tostartofintervaltime-or-data-interval-x-unit-time-zone) ## date\_add @@ -791,7 +791,7 @@ Aliases: `dateAdd`, `DATE_ADD`. **Arguments** -- `unit` — The type of interval to add. [String](../../sql-reference/data-types/string.md). +- `unit` — The type of interval to add. [String](../../sql-reference/data-types/string.md). Possible values: - `second` @@ -803,8 +803,8 @@ Aliases: `dateAdd`, `DATE_ADD`. - `quarter` - `year` -- `value` — Value of interval to add. [Int](../../sql-reference/data-types/int-uint.md). -- `date` — The date or date with time to which `value` is added. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `value` — Value of interval to add. [Int](../../sql-reference/data-types/int-uint.md). +- `date` — The date or date with time to which `value` is added. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** @@ -842,7 +842,7 @@ Aliases: `dateSub`, `DATE_SUB`. **Arguments** -- `unit` — The type of interval to subtract. Note: The unit should be unquoted. +- `unit` — The type of interval to subtract. Note: The unit should be unquoted. Possible values: @@ -855,8 +855,8 @@ Aliases: `dateSub`, `DATE_SUB`. - `quarter` - `year` -- `value` — Value of interval to subtract. [Int](../../sql-reference/data-types/int-uint.md). -- `date` — The date or date with time from which `value` is subtracted. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `value` — Value of interval to subtract. [Int](../../sql-reference/data-types/int-uint.md). +- `date` — The date or date with time from which `value` is subtracted. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** @@ -894,9 +894,9 @@ Aliases: `timeStampAdd`, `TIMESTAMP_ADD`. **Arguments** -- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). -- `value` — Value of interval to add. [Int](../../sql-reference/data-types/int-uint.md). -- `unit` — The type of interval to add. [String](../../sql-reference/data-types/string.md). +- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `value` — Value of interval to add. [Int](../../sql-reference/data-types/int-uint.md). +- `unit` — The type of interval to add. [String](../../sql-reference/data-types/string.md). Possible values: - `second` @@ -944,7 +944,7 @@ Aliases: `timeStampSub`, `TIMESTAMP_SUB`. **Arguments** -- `unit` — The type of interval to subtract. [String](../../sql-reference/data-types/string.md). +- `unit` — The type of interval to subtract. [String](../../sql-reference/data-types/string.md). Possible values: - `second` @@ -956,8 +956,8 @@ Aliases: `timeStampSub`, `TIMESTAMP_SUB`. - `quarter` - `year` -- `value` — Value of interval to subtract. [Int](../../sql-reference/data-types/int-uint.md). -- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `value` — Value of interval to subtract. [Int](../../sql-reference/data-types/int-uint.md). +- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** @@ -993,11 +993,11 @@ now([timezone]) **Arguments** -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). **Returned value** -- Current date and time. +- Current date and time. Type: [DateTime](../../sql-reference/data-types/datetime.md). @@ -1043,12 +1043,12 @@ now64([scale], [timezone]) **Arguments** -- `scale` - Tick size (precision): 10-precision seconds. Valid range: [ 0 : 9 ]. Typically are used - 3 (default) (milliseconds), 6 (microseconds), 9 (nanoseconds). -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). +- `scale` - Tick size (precision): 10-precision seconds. Valid range: [ 0 : 9 ]. Typically are used - 3 (default) (milliseconds), 6 (microseconds), 9 (nanoseconds). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). **Returned value** -- Current date and time with sub-second precision. +- Current date and time with sub-second precision. Type: [DateTime64](../../sql-reference/data-types/datetime64.md). @@ -1080,11 +1080,11 @@ nowInBlock([timezone]) **Arguments** -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). **Returned value** -- Current date and time at the moment of processing of each block of data. +- Current date and time at the moment of processing of each block of data. Type: [DateTime](../../sql-reference/data-types/datetime.md). @@ -1331,7 +1331,7 @@ Result: **See Also** -- [formatDateTimeInJodaSyntax](##formatDateTimeInJodaSyntax) +- [formatDateTimeInJodaSyntax](##formatDateTimeInJodaSyntax) ## formatDateTimeInJodaSyntax {#date_time_functions-formatDateTimeInJodaSyntax} @@ -1400,13 +1400,13 @@ dateName(date_part, date) **Arguments** -- `date_part` — Date part. Possible values: 'year', 'quarter', 'month', 'week', 'dayofyear', 'day', 'weekday', 'hour', 'minute', 'second'. [String](../../sql-reference/data-types/string.md). -- `date` — Date. [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `timezone` — Timezone. Optional. [String](../../sql-reference/data-types/string.md). +- `date_part` — Date part. Possible values: 'year', 'quarter', 'month', 'week', 'dayofyear', 'day', 'weekday', 'hour', 'minute', 'second'. [String](../../sql-reference/data-types/string.md). +- `date` — Date. [Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md) or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `timezone` — Timezone. Optional. [String](../../sql-reference/data-types/string.md). **Returned value** -- The specified part of date. +- The specified part of date. Type: [String](../../sql-reference/data-types/string.md#string) @@ -1442,11 +1442,11 @@ monthName(date) **Arguments** -- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `date` — Date or date with time. [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** -- The name of the month. +- The name of the month. Type: [String](../../sql-reference/data-types/string.md#string) @@ -1507,7 +1507,7 @@ SELECT fromUnixTimestamp(1234334543, '%Y-%m-%d %R:%S') AS DateTime; **See Also** -- [fromUnixTimestampInJodaSyntax](##fromUnixTimestampInJodaSyntax) +- [fromUnixTimestampInJodaSyntax](##fromUnixTimestampInJodaSyntax) ## fromUnixTimestampInJodaSyntax @@ -1539,11 +1539,11 @@ toModifiedJulianDay(date) **Arguments** -- `date` — Date in text form. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `date` — Date in text form. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). **Returned value** -- Modified Julian Day number. +- Modified Julian Day number. Type: [Int32](../../sql-reference/data-types/int-uint.md). @@ -1575,11 +1575,11 @@ toModifiedJulianDayOrNull(date) **Arguments** -- `date` — Date in text form. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `date` — Date in text form. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). **Returned value** -- Modified Julian Day number. +- Modified Julian Day number. Type: [Nullable(Int32)](../../sql-reference/data-types/int-uint.md). @@ -1611,11 +1611,11 @@ fromModifiedJulianDay(day) **Arguments** -- `day` — Modified Julian Day number. [Any integral types](../../sql-reference/data-types/int-uint.md). +- `day` — Modified Julian Day number. [Any integral types](../../sql-reference/data-types/int-uint.md). **Returned value** -- Date in text form. +- Date in text form. Type: [String](../../sql-reference/data-types/string.md) @@ -1647,11 +1647,11 @@ fromModifiedJulianDayOrNull(day) **Arguments** -- `day` — Modified Julian Day number. [Any integral types](../../sql-reference/data-types/int-uint.md). +- `day` — Modified Julian Day number. [Any integral types](../../sql-reference/data-types/int-uint.md). **Returned value** -- Date in text form. +- Date in text form. Type: [Nullable(String)](../../sql-reference/data-types/string.md) diff --git a/docs/en/sql-reference/functions/distance-functions.md b/docs/en/sql-reference/functions/distance-functions.md index 293e02f8a54..93c17819eec 100644 --- a/docs/en/sql-reference/functions/distance-functions.md +++ b/docs/en/sql-reference/functions/distance-functions.md @@ -17,11 +17,11 @@ Alias: `normL1`. **Arguments** -- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- L1-norm or [taxicab geometry](https://en.wikipedia.org/wiki/Taxicab_geometry) distance. +- L1-norm or [taxicab geometry](https://en.wikipedia.org/wiki/Taxicab_geometry) distance. Type: [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). @@ -55,11 +55,11 @@ Alias: `normL2`. **Arguments** -- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- L2-norm or [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance). +- L2-norm or [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance). Type: [Float](../../sql-reference/data-types/float.md). @@ -93,11 +93,11 @@ Alias: `normLinf`. **Arguments** -- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- Linf-norm or the maximum absolute value. +- Linf-norm or the maximum absolute value. Type: [Float](../../sql-reference/data-types/float.md). @@ -131,12 +131,12 @@ Alias: `normLp`. **Arguments** -- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `p` — The power. Possible values: real number in `[1; inf)`. [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `vector` — [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `p` — The power. Possible values: real number in `[1; inf)`. [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). **Returned value** -- [Lp-norm](https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm) +- [Lp-norm](https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm) Type: [Float](../../sql-reference/data-types/float.md). @@ -170,12 +170,12 @@ Alias: `distanceL1`. **Arguments** -- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- 1-norm distance. +- 1-norm distance. Type: [Float](../../sql-reference/data-types/float.md). @@ -209,12 +209,12 @@ Alias: `distanceL2`. **Arguments** -- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- 2-norm distance. +- 2-norm distance. Type: [Float](../../sql-reference/data-types/float.md). @@ -248,12 +248,12 @@ Alias: `distanceLinf`. **Arguments** -- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `vector1` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector1` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- Infinity-norm distance. +- Infinity-norm distance. Type: [Float](../../sql-reference/data-types/float.md). @@ -287,13 +287,13 @@ Alias: `distanceLp`. **Arguments** -- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `p` — The power. Possible values: real number from `[1; inf)`. [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `vector1` — First vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector2` — Second vector. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `p` — The power. Possible values: real number from `[1; inf)`. [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). **Returned value** -- p-norm distance. +- p-norm distance. Type: [Float](../../sql-reference/data-types/float.md). @@ -328,11 +328,11 @@ Alias: `normalizeL1`. **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Unit vector. +- Unit vector. Type: [Tuple](../../sql-reference/data-types/tuple.md) of [Float](../../sql-reference/data-types/float.md). @@ -366,11 +366,11 @@ Alias: `normalizeL1`. **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Unit vector. +- Unit vector. Type: [Tuple](../../sql-reference/data-types/tuple.md) of [Float](../../sql-reference/data-types/float.md). @@ -404,11 +404,11 @@ Alias: `normalizeLinf `. **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Unit vector. +- Unit vector. Type: [Tuple](../../sql-reference/data-types/tuple.md) of [Float](../../sql-reference/data-types/float.md). @@ -442,12 +442,12 @@ Alias: `normalizeLp `. **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). -- `p` — The power. Possible values: any number from [1;inf). [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `p` — The power. Possible values: any number from [1;inf). [UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). **Returned value** -- Unit vector. +- Unit vector. Type: [Tuple](../../sql-reference/data-types/tuple.md) of [Float](../../sql-reference/data-types/float.md). @@ -479,12 +479,12 @@ cosineDistance(vector1, vector2) **Arguments** -- `vector1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). -- `vector2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). +- `vector2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md) or [Array](../../sql-reference/data-types/array.md). **Returned value** -- Cosine of the angle between two vectors substracted from one. +- Cosine of the angle between two vectors substracted from one. Type: [Float](../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/functions/encoding-functions.md b/docs/en/sql-reference/functions/encoding-functions.md index cccc02c2553..c1d85db9a12 100644 --- a/docs/en/sql-reference/functions/encoding-functions.md +++ b/docs/en/sql-reference/functions/encoding-functions.md @@ -18,11 +18,11 @@ char(number_1, [number_2, ..., number_n]); **Arguments** -- `number_1, number_2, ..., number_n` — Numerical arguments interpreted as integers. Types: [Int](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md). +- `number_1, number_2, ..., number_n` — Numerical arguments interpreted as integers. Types: [Int](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md). **Returned value** -- a string of given bytes. +- a string of given bytes. Type: `String`. @@ -98,11 +98,11 @@ Values of [UUID](../data-types/uuid.md) type are encoded as big-endian order str **Arguments** -- `arg` — A value to convert to hexadecimal. Types: [String](../../sql-reference/data-types/string.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md), [Decimal](../../sql-reference/data-types/decimal.md), [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). +- `arg` — A value to convert to hexadecimal. Types: [String](../../sql-reference/data-types/string.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md), [Decimal](../../sql-reference/data-types/decimal.md), [Date](../../sql-reference/data-types/date.md) or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** -- A string with the hexadecimal representation of the argument. +- A string with the hexadecimal representation of the argument. Type: [String](../../sql-reference/data-types/string.md). @@ -185,13 +185,13 @@ unhex(arg) **Arguments** -- `arg` — A string containing any number of hexadecimal digits. Type: [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md). +- `arg` — A string containing any number of hexadecimal digits. Type: [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md). Supports both uppercase and lowercase letters `A-F`. The number of hexadecimal digits does not have to be even. If it is odd, the last digit is interpreted as the least significant half of the `00-0F` byte. If the argument string contains anything other than hexadecimal digits, some implementation-defined result is returned (an exception isn’t thrown). For a numeric argument the inverse of hex(N) is not performed by unhex(). **Returned value** -- A binary string (BLOB). +- A binary string (BLOB). Type: [String](../../sql-reference/data-types/string.md). @@ -247,11 +247,11 @@ Values of [UUID](../data-types/uuid.md) type are encoded as big-endian order str **Arguments** -- `arg` — A value to convert to binary. [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md), [Decimal](../../sql-reference/data-types/decimal.md), [Date](../../sql-reference/data-types/date.md), or [DateTime](../../sql-reference/data-types/datetime.md). +- `arg` — A value to convert to binary. [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md), [Decimal](../../sql-reference/data-types/decimal.md), [Date](../../sql-reference/data-types/date.md), or [DateTime](../../sql-reference/data-types/datetime.md). **Returned value** -- A string with the binary representation of the argument. +- A string with the binary representation of the argument. Type: [String](../../sql-reference/data-types/string.md). @@ -338,11 +338,11 @@ Supports binary digits `0` and `1`. The number of binary digits does not have to **Arguments** -- `arg` — A string containing any number of binary digits. [String](../../sql-reference/data-types/string.md). +- `arg` — A string containing any number of binary digits. [String](../../sql-reference/data-types/string.md). **Returned value** -- A binary string (BLOB). +- A binary string (BLOB). Type: [String](../../sql-reference/data-types/string.md). @@ -396,11 +396,11 @@ bitPositionsToArray(arg) **Arguments** -- `arg` — Integer value. [Int/UInt](../../sql-reference/data-types/int-uint.md). +- `arg` — Integer value. [Int/UInt](../../sql-reference/data-types/int-uint.md). **Returned value** -- An array containing a list of positions of bits that equal `1`, in ascending order. +- An array containing a list of positions of bits that equal `1`, in ascending order. Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)). diff --git a/docs/en/sql-reference/functions/encryption-functions.md b/docs/en/sql-reference/functions/encryption-functions.md index 1edb20fd9ed..a4cab4f57ac 100644 --- a/docs/en/sql-reference/functions/encryption-functions.md +++ b/docs/en/sql-reference/functions/encryption-functions.md @@ -17,11 +17,11 @@ Note that these functions work slowly until ClickHouse 21.1. This function encrypts data using these modes: -- aes-128-ecb, aes-192-ecb, aes-256-ecb -- aes-128-cbc, aes-192-cbc, aes-256-cbc -- aes-128-ofb, aes-192-ofb, aes-256-ofb -- aes-128-gcm, aes-192-gcm, aes-256-gcm -- aes-128-ctr, aes-192-ctr, aes-256-ctr +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-gcm, aes-192-gcm, aes-256-gcm +- aes-128-ctr, aes-192-ctr, aes-256-ctr **Syntax** @@ -31,15 +31,15 @@ encrypt('mode', 'plaintext', 'key' [, iv, aad]) **Arguments** -- `mode` — Encryption mode. [String](../../sql-reference/data-types/string.md#string). -- `plaintext` — Text thats need to be encrypted. [String](../../sql-reference/data-types/string.md#string). -- `key` — Encryption key. [String](../../sql-reference/data-types/string.md#string). -- `iv` — Initialization vector. Required for `-gcm` modes, optinal for others. [String](../../sql-reference/data-types/string.md#string). -- `aad` — Additional authenticated data. It isn't encrypted, but it affects decryption. Works only in `-gcm` modes, for others would throw an exception. [String](../../sql-reference/data-types/string.md#string). +- `mode` — Encryption mode. [String](../../sql-reference/data-types/string.md#string). +- `plaintext` — Text thats need to be encrypted. [String](../../sql-reference/data-types/string.md#string). +- `key` — Encryption key. [String](../../sql-reference/data-types/string.md#string). +- `iv` — Initialization vector. Required for `-gcm` modes, optinal for others. [String](../../sql-reference/data-types/string.md#string). +- `aad` — Additional authenticated data. It isn't encrypted, but it affects decryption. Works only in `-gcm` modes, for others would throw an exception. [String](../../sql-reference/data-types/string.md#string). **Returned value** -- Ciphertext binary string. [String](../../sql-reference/data-types/string.md#string). +- Ciphertext binary string. [String](../../sql-reference/data-types/string.md#string). **Examples** @@ -112,9 +112,9 @@ Will produce the same ciphertext as `encrypt` on equal inputs. But when `key` or Supported encryption modes: -- aes-128-ecb, aes-192-ecb, aes-256-ecb -- aes-128-cbc, aes-192-cbc, aes-256-cbc -- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb **Syntax** @@ -124,10 +124,10 @@ aes_encrypt_mysql('mode', 'plaintext', 'key' [, iv]) **Arguments** -- `mode` — Encryption mode. [String](../../sql-reference/data-types/string.md#string). -- `plaintext` — Text that needs to be encrypted. [String](../../sql-reference/data-types/string.md#string). -- `key` — Encryption key. If key is longer than required by mode, MySQL-specific key folding is performed. [String](../../sql-reference/data-types/string.md#string). -- `iv` — Initialization vector. Optional, only first 16 bytes are taken into account [String](../../sql-reference/data-types/string.md#string). +- `mode` — Encryption mode. [String](../../sql-reference/data-types/string.md#string). +- `plaintext` — Text that needs to be encrypted. [String](../../sql-reference/data-types/string.md#string). +- `key` — Encryption key. If key is longer than required by mode, MySQL-specific key folding is performed. [String](../../sql-reference/data-types/string.md#string). +- `iv` — Initialization vector. Optional, only first 16 bytes are taken into account [String](../../sql-reference/data-types/string.md#string). **Returned value** @@ -217,11 +217,11 @@ mysql> SELECT aes_encrypt('Secret', '123456789101213141516171819202122', 'iviviv This function decrypts ciphertext into a plaintext using these modes: -- aes-128-ecb, aes-192-ecb, aes-256-ecb -- aes-128-cbc, aes-192-cbc, aes-256-cbc -- aes-128-ofb, aes-192-ofb, aes-256-ofb -- aes-128-gcm, aes-192-gcm, aes-256-gcm -- aes-128-ctr, aes-192-ctr, aes-256-ctr +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-gcm, aes-192-gcm, aes-256-gcm +- aes-128-ctr, aes-192-ctr, aes-256-ctr **Syntax** @@ -231,15 +231,15 @@ decrypt('mode', 'ciphertext', 'key' [, iv, aad]) **Arguments** -- `mode` — Decryption mode. [String](../../sql-reference/data-types/string.md#string). -- `ciphertext` — Encrypted text that needs to be decrypted. [String](../../sql-reference/data-types/string.md#string). -- `key` — Decryption key. [String](../../sql-reference/data-types/string.md#string). -- `iv` — Initialization vector. Required for `-gcm` modes, optinal for others. [String](../../sql-reference/data-types/string.md#string). -- `aad` — Additional authenticated data. Won't decrypt if this value is incorrect. Works only in `-gcm` modes, for others would throw an exception. [String](../../sql-reference/data-types/string.md#string). +- `mode` — Decryption mode. [String](../../sql-reference/data-types/string.md#string). +- `ciphertext` — Encrypted text that needs to be decrypted. [String](../../sql-reference/data-types/string.md#string). +- `key` — Decryption key. [String](../../sql-reference/data-types/string.md#string). +- `iv` — Initialization vector. Required for `-gcm` modes, optinal for others. [String](../../sql-reference/data-types/string.md#string). +- `aad` — Additional authenticated data. Won't decrypt if this value is incorrect. Works only in `-gcm` modes, for others would throw an exception. [String](../../sql-reference/data-types/string.md#string). **Returned value** -- Decrypted String. [String](../../sql-reference/data-types/string.md#string). +- Decrypted String. [String](../../sql-reference/data-types/string.md#string). **Examples** @@ -349,10 +349,10 @@ Will produce same plaintext as `decrypt` on equal inputs. But when `key` or `iv` Supported decryption modes: -- aes-128-ecb, aes-192-ecb, aes-256-ecb -- aes-128-cbc, aes-192-cbc, aes-256-cbc -- aes-128-cfb128 -- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-cfb128 +- aes-128-ofb, aes-192-ofb, aes-256-ofb **Syntax** @@ -362,14 +362,14 @@ aes_decrypt_mysql('mode', 'ciphertext', 'key' [, iv]) **Arguments** -- `mode` — Decryption mode. [String](../../sql-reference/data-types/string.md#string). -- `ciphertext` — Encrypted text that needs to be decrypted. [String](../../sql-reference/data-types/string.md#string). -- `key` — Decryption key. [String](../../sql-reference/data-types/string.md#string). -- `iv` — Initialization vector. Optinal. [String](../../sql-reference/data-types/string.md#string). +- `mode` — Decryption mode. [String](../../sql-reference/data-types/string.md#string). +- `ciphertext` — Encrypted text that needs to be decrypted. [String](../../sql-reference/data-types/string.md#string). +- `key` — Decryption key. [String](../../sql-reference/data-types/string.md#string). +- `iv` — Initialization vector. Optinal. [String](../../sql-reference/data-types/string.md#string). **Returned value** -- Decrypted String. [String](../../sql-reference/data-types/string.md#string). +- Decrypted String. [String](../../sql-reference/data-types/string.md#string). **Examples** diff --git a/docs/en/sql-reference/functions/ext-dict-functions.md b/docs/en/sql-reference/functions/ext-dict-functions.md index 07226b67601..c95171bf743 100644 --- a/docs/en/sql-reference/functions/ext-dict-functions.md +++ b/docs/en/sql-reference/functions/ext-dict-functions.md @@ -24,16 +24,16 @@ dictGetOrNull('dict_name', attr_name, id_expr) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `attr_names` — Name of the column of the dictionary, [String literal](../../sql-reference/syntax.md#syntax-string-literal), or tuple of column names, [Tuple](../../sql-reference/data-types/tuple.md)([String literal](../../sql-reference/syntax.md#syntax-string-literal)). -- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. -- `default_value_expr` — Values returned if the dictionary does not contain a row with the `id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) or [Tuple](../../sql-reference/data-types/tuple.md)([Expression](../../sql-reference/syntax.md#syntax-expressions)), returning the value (or values) in the data types configured for the `attr_names` attribute. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `attr_names` — Name of the column of the dictionary, [String literal](../../sql-reference/syntax.md#syntax-string-literal), or tuple of column names, [Tuple](../../sql-reference/data-types/tuple.md)([String literal](../../sql-reference/syntax.md#syntax-string-literal)). +- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. +- `default_value_expr` — Values returned if the dictionary does not contain a row with the `id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) or [Tuple](../../sql-reference/data-types/tuple.md)([Expression](../../sql-reference/syntax.md#syntax-expressions)), returning the value (or values) in the data types configured for the `attr_names` attribute. **Returned value** -- If ClickHouse parses the attribute successfully in the [attribute’s data type](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes), functions return the value of the dictionary attribute that corresponds to `id_expr`. +- If ClickHouse parses the attribute successfully in the [attribute’s data type](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes), functions return the value of the dictionary attribute that corresponds to `id_expr`. -- If there is no the key, corresponding to `id_expr`, in the dictionary, then: +- If there is no the key, corresponding to `id_expr`, in the dictionary, then: - `dictGet` returns the content of the `` element specified for the attribute in the dictionary configuration. - `dictGetOrDefault` returns the value passed as the `default_value_expr` parameter. @@ -226,7 +226,7 @@ Result: **See Also** -- [Dictionaries](../../sql-reference/dictionaries/index.md) +- [Dictionaries](../../sql-reference/dictionaries/index.md) ## dictHas @@ -238,13 +238,13 @@ dictHas('dict_name', id_expr) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning dictionary key-type value or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. **Returned value** -- 0, if there is no key. -- 1, if there is a key. +- 0, if there is no key. +- 1, if there is a key. Type: `UInt8`. @@ -260,12 +260,12 @@ dictGetHierarchy('dict_name', key) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. **Returned value** -- Parents for the key. +- Parents for the key. Type: [Array(UInt64)](../../sql-reference/data-types/array.md). @@ -279,14 +279,14 @@ dictIsIn('dict_name', child_id_expr, ancestor_id_expr) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `child_id_expr` — Key to be checked. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. -- `ancestor_id_expr` — Alleged ancestor of the `child_id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `child_id_expr` — Key to be checked. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `ancestor_id_expr` — Alleged ancestor of the `child_id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. **Returned value** -- 0, if `child_id_expr` is not a child of `ancestor_id_expr`. -- 1, if `child_id_expr` is a child of `ancestor_id_expr` or if `child_id_expr` is an `ancestor_id_expr`. +- 0, if `child_id_expr` is not a child of `ancestor_id_expr`. +- 1, if `child_id_expr` is a child of `ancestor_id_expr` or if `child_id_expr` is an `ancestor_id_expr`. Type: `UInt8`. @@ -302,12 +302,12 @@ dictGetChildren(dict_name, key) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. **Returned values** -- First-level descendants for the key. +- First-level descendants for the key. Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)). @@ -351,13 +351,13 @@ dictGetDescendants(dict_name, key, level) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. -- `level` — Hierarchy level. If `level = 0` returns all descendants to the end. [UInt8](../../sql-reference/data-types/int-uint.md). +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `key` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md)-type value. +- `level` — Hierarchy level. If `level = 0` returns all descendants to the end. [UInt8](../../sql-reference/data-types/int-uint.md). **Returned values** -- Descendants for the key. +- Descendants for the key. Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)). @@ -409,14 +409,14 @@ ClickHouse supports specialized functions that convert dictionary attribute valu Functions: -- `dictGetInt8`, `dictGetInt16`, `dictGetInt32`, `dictGetInt64` -- `dictGetUInt8`, `dictGetUInt16`, `dictGetUInt32`, `dictGetUInt64` -- `dictGetFloat32`, `dictGetFloat64` -- `dictGetDate` -- `dictGetDateTime` -- `dictGetUUID` -- `dictGetString` -- `dictGetIPv4`, `dictGetIPv6` +- `dictGetInt8`, `dictGetInt16`, `dictGetInt32`, `dictGetInt64` +- `dictGetUInt8`, `dictGetUInt16`, `dictGetUInt32`, `dictGetUInt64` +- `dictGetFloat32`, `dictGetFloat64` +- `dictGetDate` +- `dictGetDateTime` +- `dictGetUUID` +- `dictGetString` +- `dictGetIPv4`, `dictGetIPv6` All these functions have the `OrDefault` modification. For example, `dictGetDateOrDefault`. @@ -429,16 +429,16 @@ dictGet[Type]OrDefault('dict_name', 'attr_name', id_expr, default_value_expr) **Arguments** -- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `attr_name` — Name of the column of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). -- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md) or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. -- `default_value_expr` — Value returned if the dictionary does not contain a row with the `id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning the value in the data type configured for the `attr_name` attribute. +- `dict_name` — Name of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `attr_name` — Name of the column of the dictionary. [String literal](../../sql-reference/syntax.md#syntax-string-literal). +- `id_expr` — Key value. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning a [UInt64](../../sql-reference/data-types/int-uint.md) or [Tuple](../../sql-reference/data-types/tuple.md)-type value depending on the dictionary configuration. +- `default_value_expr` — Value returned if the dictionary does not contain a row with the `id_expr` key. [Expression](../../sql-reference/syntax.md#syntax-expressions) returning the value in the data type configured for the `attr_name` attribute. **Returned value** -- If ClickHouse parses the attribute successfully in the [attribute’s data type](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes), functions return the value of the dictionary attribute that corresponds to `id_expr`. +- If ClickHouse parses the attribute successfully in the [attribute’s data type](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes), functions return the value of the dictionary attribute that corresponds to `id_expr`. -- If there is no requested `id_expr` in the dictionary then: +- If there is no requested `id_expr` in the dictionary then: - `dictGet[Type]` returns the content of the `` element specified for the attribute in the dictionary configuration. - `dictGet[Type]OrDefault` returns the value passed as the `default_value_expr` parameter. diff --git a/docs/en/sql-reference/functions/files.md b/docs/en/sql-reference/functions/files.md index 91279cd991a..2e4f18ee809 100644 --- a/docs/en/sql-reference/functions/files.md +++ b/docs/en/sql-reference/functions/files.md @@ -17,8 +17,8 @@ file(path[, default]) **Arguments** -- `path` — The relative path to the file from [user_files_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path). Path to file support following wildcards: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc', 'def'` — strings. -- `default` — The value that will be returned in the case when a file does not exist or cannot be accessed. Data types supported: [String](../../sql-reference/data-types/string.md) and [NULL](../../sql-reference/syntax.md#null-literal). +- `path` — The relative path to the file from [user_files_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path). Path to file support following wildcards: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc', 'def'` — strings. +- `default` — The value that will be returned in the case when a file does not exist or cannot be accessed. Data types supported: [String](../../sql-reference/data-types/string.md) and [NULL](../../sql-reference/syntax.md#null-literal). **Example** @@ -32,5 +32,5 @@ INSERT INTO table SELECT file('a.txt'), file('b.txt'); **See Also** -- [user_files_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path) -- [file](../table-functions/file.md) +- [user_files_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path) +- [file](../table-functions/file.md) diff --git a/docs/en/sql-reference/functions/functions-for-nulls.md b/docs/en/sql-reference/functions/functions-for-nulls.md index 7dc798aa6c1..f810cc386cf 100644 --- a/docs/en/sql-reference/functions/functions-for-nulls.md +++ b/docs/en/sql-reference/functions/functions-for-nulls.md @@ -18,12 +18,12 @@ Alias: `ISNULL`. **Arguments** -- `x` — A value with a non-compound data type. +- `x` — A value with a non-compound data type. **Returned value** -- `1` if `x` is `NULL`. -- `0` if `x` is not `NULL`. +- `1` if `x` is `NULL`. +- `0` if `x` is not `NULL`. **Example** @@ -58,12 +58,12 @@ isNotNull(x) **Arguments:** -- `x` — A value with a non-compound data type. +- `x` — A value with a non-compound data type. **Returned value** -- `0` if `x` is `NULL`. -- `1` if `x` is not `NULL`. +- `0` if `x` is `NULL`. +- `1` if `x` is not `NULL`. **Example** @@ -98,12 +98,12 @@ coalesce(x,...) **Arguments:** -- Any number of parameters of a non-compound type. All parameters must be compatible by data type. +- Any number of parameters of a non-compound type. All parameters must be compatible by data type. **Returned values** -- The first non-`NULL` argument. -- `NULL`, if all arguments are `NULL`. +- The first non-`NULL` argument. +- `NULL`, if all arguments are `NULL`. **Example** @@ -141,13 +141,13 @@ ifNull(x,alt) **Arguments:** -- `x` — The value to check for `NULL`. -- `alt` — The value that the function returns if `x` is `NULL`. +- `x` — The value to check for `NULL`. +- `alt` — The value that the function returns if `x` is `NULL`. **Returned values** -- The value `x`, if `x` is not `NULL`. -- The value `alt`, if `x` is `NULL`. +- The value `x`, if `x` is not `NULL`. +- The value `alt`, if `x` is `NULL`. **Example** @@ -185,8 +185,8 @@ nullIf(x, y) **Returned values** -- `NULL`, if the arguments are equal. -- The `x` value, if the arguments are not equal. +- `NULL`, if the arguments are equal. +- The `x` value, if the arguments are not equal. **Example** @@ -220,12 +220,12 @@ assumeNotNull(x) **Arguments:** -- `x` — The original value. +- `x` — The original value. **Returned values** -- The original value from the non-`Nullable` type, if it is not `NULL`. -- Implementation specific result if the original value was `NULL`. +- The original value from the non-`Nullable` type, if it is not `NULL`. +- Implementation specific result if the original value was `NULL`. **Example** @@ -282,11 +282,11 @@ toNullable(x) **Arguments:** -- `x` — The value of any non-compound type. +- `x` — The value of any non-compound type. **Returned value** -- The input value with a `Nullable` type. +- The input value with a `Nullable` type. **Example** diff --git a/docs/en/sql-reference/functions/geo/coordinates.md b/docs/en/sql-reference/functions/geo/coordinates.md index 01802e336bf..1cbc1933206 100644 --- a/docs/en/sql-reference/functions/geo/coordinates.md +++ b/docs/en/sql-reference/functions/geo/coordinates.md @@ -15,10 +15,10 @@ greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) **Input parameters** -- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`. -- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`. -- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`. -- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`. +- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`. +- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`. +- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`. +- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`. Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude. @@ -53,10 +53,10 @@ geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) **Input parameters** -- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`. -- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`. -- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`. -- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`. +- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`. +- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`. +- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`. +- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`. Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude. @@ -88,10 +88,10 @@ greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg) **Input parameters** -- `lon1Deg` — Longitude of the first point in degrees. -- `lat1Deg` — Latitude of the first point in degrees. -- `lon2Deg` — Longitude of the second point in degrees. -- `lat2Deg` — Latitude of the second point in degrees. +- `lon1Deg` — Longitude of the first point in degrees. +- `lat1Deg` — Latitude of the first point in degrees. +- `lon2Deg` — Longitude of the second point in degrees. +- `lat2Deg` — Latitude of the second point in degrees. **Returned value** @@ -120,9 +120,9 @@ pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ) **Input parameters** -- `x, y` — Coordinates of a point on the plane. -- `xᵢ, yᵢ` — Coordinates of the center of the `i`-th ellipsis. -- `aᵢ, bᵢ` — Axes of the `i`-th ellipsis in units of x, y coordinates. +- `x, y` — Coordinates of a point on the plane. +- `xᵢ, yᵢ` — Coordinates of the center of the `i`-th ellipsis. +- `aᵢ, bᵢ` — Axes of the `i`-th ellipsis in units of x, y coordinates. The input parameters must be `2+4⋅n`, where `n` is the number of ellipses. @@ -152,9 +152,9 @@ pointInPolygon((x, y), [(a, b), (c, d) ...], ...) **Input values** -- `(x, y)` — Coordinates of a point on the plane. Data type — [Tuple](../../../sql-reference/data-types/tuple.md) — A tuple of two numbers. -- `[(a, b), (c, d) ...]` — Polygon vertices. Data type — [Array](../../../sql-reference/data-types/array.md). Each vertex is represented by a pair of coordinates `(a, b)`. Vertices should be specified in a clockwise or counterclockwise order. The minimum number of vertices is 3. The polygon must be constant. -- The function also supports polygons with holes (cut out sections). In this case, add polygons that define the cut out sections using additional arguments of the function. The function does not support non-simply-connected polygons. +- `(x, y)` — Coordinates of a point on the plane. Data type — [Tuple](../../../sql-reference/data-types/tuple.md) — A tuple of two numbers. +- `[(a, b), (c, d) ...]` — Polygon vertices. Data type — [Array](../../../sql-reference/data-types/array.md). Each vertex is represented by a pair of coordinates `(a, b)`. Vertices should be specified in a clockwise or counterclockwise order. The minimum number of vertices is 3. The polygon must be constant. +- The function also supports polygons with holes (cut out sections). In this case, add polygons that define the cut out sections using additional arguments of the function. The function does not support non-simply-connected polygons. **Returned values** diff --git a/docs/en/sql-reference/functions/geo/geohash.md b/docs/en/sql-reference/functions/geo/geohash.md index baed8243935..ce16af44e90 100644 --- a/docs/en/sql-reference/functions/geo/geohash.md +++ b/docs/en/sql-reference/functions/geo/geohash.md @@ -18,13 +18,13 @@ geohashEncode(longitude, latitude, [precision]) **Input values** -- longitude - longitude part of the coordinate you want to encode. Floating in range`[-180°, 180°]` -- latitude - latitude part of the coordinate you want to encode. Floating in range `[-90°, 90°]` -- precision - Optional, length of the resulting encoded string, defaults to `12`. Integer in range `[1, 12]`. Any value less than `1` or greater than `12` is silently converted to `12`. +- longitude - longitude part of the coordinate you want to encode. Floating in range`[-180°, 180°]` +- latitude - latitude part of the coordinate you want to encode. Floating in range `[-90°, 90°]` +- precision - Optional, length of the resulting encoded string, defaults to `12`. Integer in range `[1, 12]`. Any value less than `1` or greater than `12` is silently converted to `12`. **Returned values** -- alphanumeric `String` of encoded coordinate (modified version of the base32-encoding alphabet is used). +- alphanumeric `String` of encoded coordinate (modified version of the base32-encoding alphabet is used). **Example** @@ -44,11 +44,11 @@ Decodes any [geohash](#geohash)-encoded string into longitude and latitude. **Input values** -- encoded string - geohash-encoded string. +- encoded string - geohash-encoded string. **Returned values** -- (longitude, latitude) - 2-tuple of `Float64` values of longitude and latitude. +- (longitude, latitude) - 2-tuple of `Float64` values of longitude and latitude. **Example** @@ -74,11 +74,11 @@ geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precisi **Arguments** -- `longitude_min` — Minimum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md). -- `latitude_min` — Minimum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md). -- `longitude_max` — Maximum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md). -- `latitude_max` — Maximum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md). -- `precision` — Geohash precision. Range: `[1, 12]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `longitude_min` — Minimum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md). +- `latitude_min` — Minimum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md). +- `longitude_max` — Maximum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md). +- `latitude_max` — Maximum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md). +- `precision` — Geohash precision. Range: `[1, 12]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). :::note All coordinate parameters must be of the same type: either `Float32` or `Float64`. @@ -86,8 +86,8 @@ All coordinate parameters must be of the same type: either `Float32` or `Float64 **Returned values** -- Array of precision-long strings of geohash-boxes covering provided area, you should not rely on order of items. -- `[]` - Empty array if minimum latitude and longitude values aren’t less than corresponding maximum values. +- Array of precision-long strings of geohash-boxes covering provided area, you should not rely on order of items. +- `[]` - Empty array if minimum latitude and longitude values aren’t less than corresponding maximum values. Type: [Array](../../../sql-reference/data-types/array.md)([String](../../../sql-reference/data-types/string.md)). diff --git a/docs/en/sql-reference/functions/geo/h3.md b/docs/en/sql-reference/functions/geo/h3.md index ce15fed0f21..a3698779ea0 100644 --- a/docs/en/sql-reference/functions/geo/h3.md +++ b/docs/en/sql-reference/functions/geo/h3.md @@ -26,12 +26,12 @@ h3IsValid(h3index) **Parameter** -- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- 1 — The number is a valid H3 index. -- 0 — The number is not a valid H3 index. +- 1 — The number is a valid H3 index. +- 0 — The number is not a valid H3 index. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -63,12 +63,12 @@ h3GetResolution(h3index) **Parameter** -- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Index resolution. Range: `[0, 15]`. -- If the index is not valid, the function returns a random value. Use [h3IsValid](#h3isvalid) to verify the index. +- Index resolution. Range: `[0, 15]`. +- If the index is not valid, the function returns a random value. Use [h3IsValid](#h3isvalid) to verify the index. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -100,11 +100,11 @@ h3EdgeAngle(resolution) **Parameter** -- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. +- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. **Returned values** -- The average length of the [H3](#h3index) hexagon edge in grades. Type: [Float64](../../../sql-reference/data-types/float.md). +- The average length of the [H3](#h3index) hexagon edge in grades. Type: [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -134,11 +134,11 @@ h3EdgeLengthM(resolution) **Parameter** -- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. +- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. **Returned values** -- The average length of the [H3](#h3index) hexagon edge in meters. Type: [Float64](../../../sql-reference/data-types/float.md). +- The average length of the [H3](#h3index) hexagon edge in meters. Type: [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -168,11 +168,11 @@ h3EdgeLengthKm(resolution) **Parameter** -- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. +- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`. **Returned values** -- The average length of the [H3](#h3index) hexagon edge in kilometers. Type: [Float64](../../../sql-reference/data-types/float.md). +- The average length of the [H3](#h3index) hexagon edge in kilometers. Type: [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -202,14 +202,14 @@ geoToH3(lon, lat, resolution) **Arguments** -- `lon` — Longitude. Type: [Float64](../../../sql-reference/data-types/float.md). -- `lat` — Latitude. Type: [Float64](../../../sql-reference/data-types/float.md). -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `lon` — Longitude. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat` — Latitude. Type: [Float64](../../../sql-reference/data-types/float.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Hexagon index number. -- 0 in case of error. +- Hexagon index number. +- 0 in case of error. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -241,11 +241,11 @@ h3ToGeo(h3Index) **Arguments** -- `h3Index` — H3 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `h3Index` — H3 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- A tuple consisting of two values: `tuple(lon,lat)`. `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md). +- A tuple consisting of two values: `tuple(lon,lat)`. `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -275,11 +275,11 @@ h3ToGeoBoundary(h3Index) **Arguments** -- `h3Index` — H3 Index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `h3Index` — H3 Index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Array of pairs '(lon, lat)'. +- Array of pairs '(lon, lat)'. Type: [Array](../../../sql-reference/data-types/array.md)([Float64](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md)). @@ -311,12 +311,12 @@ h3kRing(h3index, k) **Arguments** -- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `k` — Radius. Type: [integer](../../../sql-reference/data-types/int-uint.md) +- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `k` — Radius. Type: [integer](../../../sql-reference/data-types/int-uint.md) **Returned values** -- Array of H3 indexes. +- Array of H3 indexes. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -354,11 +354,11 @@ h3GetBaseCell(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Hexagon base cell number. +- Hexagon base cell number. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -390,11 +390,11 @@ h3HexAreaM2(resolution) **Parameter** -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Area in square meters. +- Area in square meters. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -426,11 +426,11 @@ h3HexAreaKm2(resolution) **Parameter** -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Area in square kilometers. +- Area in square kilometers. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -462,13 +462,13 @@ h3IndexesAreNeighbors(index1, index2) **Arguments** -- `index1` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `index2` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index1` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index2` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- `1` — Indexes are neighbours. -- `0` — Indexes are not neighbours. +- `1` — Indexes are neighbours. +- `0` — Indexes are not neighbours. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -500,12 +500,12 @@ h3ToChildren(index, resolution) **Arguments** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Array of the child H3-indexes. +- Array of the child H3-indexes. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -537,12 +537,12 @@ h3ToParent(index, resolution) **Arguments** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Parent H3 index. +- Parent H3 index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -572,11 +572,11 @@ h3ToString(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- String representation of the H3 index. +- String representation of the H3 index. Type: [String](../../../sql-reference/data-types/string.md). @@ -608,11 +608,11 @@ stringToH3(index_str) **Parameter** -- `index_str` — String representation of the H3 index. Type: [String](../../../sql-reference/data-types/string.md). +- `index_str` — String representation of the H3 index. Type: [String](../../../sql-reference/data-types/string.md). **Returned value** -- Hexagon index number. Returns 0 on error. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- Hexagon index number. Returns 0 on error. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Example** @@ -642,11 +642,11 @@ h3GetResolution(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Example** @@ -676,12 +676,12 @@ h3IsResClassIII(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- `1` — Index has a resolution with Class III orientation. -- `0` — Index doesn't have a resolution with Class III orientation. +- `1` — Index has a resolution with Class III orientation. +- `0` — Index doesn't have a resolution with Class III orientation. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -713,12 +713,12 @@ h3IsPentagon(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- `1` — Index represents a pentagonal cell. -- `0` — Index doesn't represent a pentagonal cell. +- `1` — Index represents a pentagonal cell. +- `0` — Index doesn't represent a pentagonal cell. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -750,11 +750,11 @@ h3GetFaces(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Array containing icosahedron faces intersected by a given H3 index. +- Array containing icosahedron faces intersected by a given H3 index. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -786,11 +786,11 @@ h3CellAreaM2(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Cell area in square meters. +- Cell area in square meters. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -822,11 +822,11 @@ h3CellAreaRads2(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Cell area in square radians. +- Cell area in square radians. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -858,8 +858,8 @@ h3ToCenterChild(index, resolution) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned values** @@ -895,7 +895,7 @@ h3ExactEdgeLengthM(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -931,7 +931,7 @@ h3ExactEdgeLengthKm(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -967,7 +967,7 @@ h3ExactEdgeLengthRads(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1003,7 +1003,7 @@ h3NumHexagons(resolution) **Parameter** -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1039,8 +1039,8 @@ h3PointDistM(lat1, lon1, lat2, lon2) **Arguments** -- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). -- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). **Returned values** @@ -1076,8 +1076,8 @@ h3PointDistKm(lat1, lon1, lat2, lon2) **Arguments** -- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). -- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). **Returned values** @@ -1113,8 +1113,8 @@ h3PointDistRads(lat1, lon1, lat2, lon2) **Arguments** -- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). -- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat1`, `lon1` — Latitude and Longitude of point1 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). +- `lat2`, `lon2` — Latitude and Longitude of point2 in degrees. Type: [Float64](../../../sql-reference/data-types/float.md). **Returned values** @@ -1183,7 +1183,7 @@ h3GetPentagonIndexes(resolution) **Parameter** -- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). +- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1219,8 +1219,8 @@ h3Line(start,end) **Parameter** -- `start` — Hexagon index number that represents a starting point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `end` — Hexagon index number that represents an ending point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `start` — Hexagon index number that represents a starting point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `end` — Hexagon index number that represents an ending point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1256,8 +1256,8 @@ h3Distance(start,end) **Parameter** -- `start` — Hexagon index number that represents a starting point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `end` — Hexagon index number that represents an ending point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `start` — Hexagon index number that represents a starting point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `end` — Hexagon index number that represents an ending point. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1297,12 +1297,12 @@ h3HexRing(index, k) **Parameter** -- `index` — Hexagon index number that represents the origin. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `k` — Distance. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number that represents the origin. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `k` — Distance. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- Array of H3 indexes. +- Array of H3 indexes. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -1334,8 +1334,8 @@ h3GetUnidirectionalEdge(originIndex, destinationIndex) **Parameter** -- `originIndex` — Origin Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `destinationIndex` — Destination Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `originIndex` — Origin Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `destinationIndex` — Destination Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1371,12 +1371,12 @@ h3UnidirectionalEdgeisValid(index) **Parameter** -- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- 1 — The H3 index is a valid unidirectional edge. -- 0 — The H3 index is not a valid unidirectional edge. +- 1 — The H3 index is a valid unidirectional edge. +- 0 — The H3 index is not a valid unidirectional edge. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -1408,7 +1408,7 @@ h3GetOriginIndexFromUnidirectionalEdge(edge) **Parameter** -- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1444,7 +1444,7 @@ h3GetDestinationIndexFromUnidirectionalEdge(edge) **Parameter** -- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1480,7 +1480,7 @@ h3GetIndexesFromUnidirectionalEdge(edge) **Parameter** -- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `edge` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1519,7 +1519,7 @@ h3GetUnidirectionalEdgesFromHexagon(index) **Parameter** -- `index` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** @@ -1555,11 +1555,11 @@ h3GetUnidirectionalEdgeBoundary(index) **Parameter** -- `index` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `index` — Hexagon index number that represents a unidirectional edge. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned value** -- Array of pairs '(lon, lat)'. +- Array of pairs '(lon, lat)'. Type: [Array](../../../sql-reference/data-types/array.md)([Float64](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md)). diff --git a/docs/en/sql-reference/functions/geo/index.md b/docs/en/sql-reference/functions/geo/index.md index 3d5ca806c7e..d46e60281e2 100644 --- a/docs/en/sql-reference/functions/geo/index.md +++ b/docs/en/sql-reference/functions/geo/index.md @@ -8,67 +8,67 @@ title: "Geo Functions" ## Geographical Coordinates Functions -- [greatCircleDistance](./coordinates.md#greatcircledistance) -- [geoDistance](./coordinates.md#geodistance) -- [greatCircleAngle](./coordinates.md#greatcircleangle) -- [pointInEllipses](./coordinates.md#pointinellipses) -- [pointInPolygon](./coordinates.md#pointinpolygon) +- [greatCircleDistance](./coordinates.md#greatcircledistance) +- [geoDistance](./coordinates.md#geodistance) +- [greatCircleAngle](./coordinates.md#greatcircleangle) +- [pointInEllipses](./coordinates.md#pointinellipses) +- [pointInPolygon](./coordinates.md#pointinpolygon) ## Geohash Functions -- [geohashEncode](./geohash.md#geohashencode) -- [geohashDecode](./geohash.md#geohashdecode) -- [geohashesInBox](./geohash.md#geohashesinbox) +- [geohashEncode](./geohash.md#geohashencode) +- [geohashDecode](./geohash.md#geohashdecode) +- [geohashesInBox](./geohash.md#geohashesinbox) ## H3 Indexes Functions -- [h3IsValid](./h3.md#h3isvalid) -- [h3GetResolution](./h3.md#h3getresolution) -- [h3EdgeAngle](./h3.md#h3edgeangle) -- [h3EdgeLengthM](./h3.md#h3edgelengthm) -- [h3EdgeLengthKm](./h3.md#h3edgelengthkm) -- [geoToH3](./h3.md#geotoh3) -- [h3ToGeo](./h3.md#h3togeo) -- [h3ToGeoBoundary](./h3.md#h3togeoboundary) -- [h3kRing](./h3.md#h3kring) -- [h3GetBaseCell](./h3.md#h3getbasecell) -- [h3HexAreaM2](./h3.md#h3hexaream2) -- [h3HexAreaKm2](./h3.md#h3hexareakm2) -- [h3IndexesAreNeighbors](./h3.md#h3indexesareneighbors) -- [h3ToChildren](./h3.md#h3tochildren) -- [h3ToParent](./h3.md#h3toparent) -- [h3ToString](./h3.md#h3tostring) -- [stringToH3](./h3.md#stringtoh3) -- [h3GetResolution](./h3.md#h3getresolution) -- [h3IsResClassIII](./h3.md#h3isresclassiii) -- [h3IsPentagon](./h3.md#h3ispentagon) -- [h3GetFaces](./h3.md#h3getfaces) -- [h3CellAreaM2](./h3.md#h3cellaream2) -- [h3CellAreaRads2](./h3.md#h3cellarearads2) -- [h3ToCenterChild](./h3.md#h3tocenterchild) -- [h3ExactEdgeLengthM](./h3.md#h3exactedgelengthm) -- [h3ExactEdgeLengthKm](./h3.md#h3exactedgelengthkm) -- [h3ExactEdgeLengthRads](./h3.md#h3exactedgelengthrads) -- [h3NumHexagons](./h3.md#h3numhexagons) -- [h3Line](./h3.md#h3line) -- [h3Distance](./h3.md#h3distance) -- [h3HexRing](./h3.md#h3hexring) -- [h3GetUnidirectionalEdge](./h3.md#h3getunidirectionaledge) -- [h3UnidirectionalEdgeIsValid](./h3.md#h3unidirectionaledgeisvalid) -- [h3GetOriginIndexFromUnidirectionalEdge](./h3.md#h3getoriginindexfromunidirectionaledge) -- [h3GetDestinationIndexFromUnidirectionalEdge](./h3.md#h3getdestinationindexfromunidirectionaledge) -- [h3GetIndexesFromUnidirectionalEdge](./h3.md#h3getindexesfromunidirectionaledge) -- [h3GetUnidirectionalEdgesFromHexagon](./h3.md#h3getunidirectionaledgesfromhexagon) -- [h3GetUnidirectionalEdgeBoundary](./h3.md#h3getunidirectionaledgeboundary) +- [h3IsValid](./h3.md#h3isvalid) +- [h3GetResolution](./h3.md#h3getresolution) +- [h3EdgeAngle](./h3.md#h3edgeangle) +- [h3EdgeLengthM](./h3.md#h3edgelengthm) +- [h3EdgeLengthKm](./h3.md#h3edgelengthkm) +- [geoToH3](./h3.md#geotoh3) +- [h3ToGeo](./h3.md#h3togeo) +- [h3ToGeoBoundary](./h3.md#h3togeoboundary) +- [h3kRing](./h3.md#h3kring) +- [h3GetBaseCell](./h3.md#h3getbasecell) +- [h3HexAreaM2](./h3.md#h3hexaream2) +- [h3HexAreaKm2](./h3.md#h3hexareakm2) +- [h3IndexesAreNeighbors](./h3.md#h3indexesareneighbors) +- [h3ToChildren](./h3.md#h3tochildren) +- [h3ToParent](./h3.md#h3toparent) +- [h3ToString](./h3.md#h3tostring) +- [stringToH3](./h3.md#stringtoh3) +- [h3GetResolution](./h3.md#h3getresolution) +- [h3IsResClassIII](./h3.md#h3isresclassiii) +- [h3IsPentagon](./h3.md#h3ispentagon) +- [h3GetFaces](./h3.md#h3getfaces) +- [h3CellAreaM2](./h3.md#h3cellaream2) +- [h3CellAreaRads2](./h3.md#h3cellarearads2) +- [h3ToCenterChild](./h3.md#h3tocenterchild) +- [h3ExactEdgeLengthM](./h3.md#h3exactedgelengthm) +- [h3ExactEdgeLengthKm](./h3.md#h3exactedgelengthkm) +- [h3ExactEdgeLengthRads](./h3.md#h3exactedgelengthrads) +- [h3NumHexagons](./h3.md#h3numhexagons) +- [h3Line](./h3.md#h3line) +- [h3Distance](./h3.md#h3distance) +- [h3HexRing](./h3.md#h3hexring) +- [h3GetUnidirectionalEdge](./h3.md#h3getunidirectionaledge) +- [h3UnidirectionalEdgeIsValid](./h3.md#h3unidirectionaledgeisvalid) +- [h3GetOriginIndexFromUnidirectionalEdge](./h3.md#h3getoriginindexfromunidirectionaledge) +- [h3GetDestinationIndexFromUnidirectionalEdge](./h3.md#h3getdestinationindexfromunidirectionaledge) +- [h3GetIndexesFromUnidirectionalEdge](./h3.md#h3getindexesfromunidirectionaledge) +- [h3GetUnidirectionalEdgesFromHexagon](./h3.md#h3getunidirectionaledgesfromhexagon) +- [h3GetUnidirectionalEdgeBoundary](./h3.md#h3getunidirectionaledgeboundary) ## S2 Index Functions -- [geoToS2](./s2.md#geotos2) -- [s2ToGeo](./s2.md#s2togeo) -- [s2GetNeighbors](./s2.md#s2getneighbors) -- [s2CellsIntersect](./s2.md#s2cellsintersect) -- [s2CapContains](./s2.md#s2capcontains) -- [s2CapUnion](./s2.md#s2capunion) -- [s2RectAdd](./s2.md#s2rectadd) -- [s2RectContains](./s2.md#s2rectcontains) -- [s2RectUnion](./s2.md#s2rectunion) -- [s2RectIntersection](./s2.md#s2rectintersection) +- [geoToS2](./s2.md#geotos2) +- [s2ToGeo](./s2.md#s2togeo) +- [s2GetNeighbors](./s2.md#s2getneighbors) +- [s2CellsIntersect](./s2.md#s2cellsintersect) +- [s2CapContains](./s2.md#s2capcontains) +- [s2CapUnion](./s2.md#s2capunion) +- [s2RectAdd](./s2.md#s2rectadd) +- [s2RectContains](./s2.md#s2rectcontains) +- [s2RectUnion](./s2.md#s2rectunion) +- [s2RectIntersection](./s2.md#s2rectintersection) diff --git a/docs/en/sql-reference/functions/geo/s2.md b/docs/en/sql-reference/functions/geo/s2.md index 3cd66cfaaeb..24a9ac53f4d 100644 --- a/docs/en/sql-reference/functions/geo/s2.md +++ b/docs/en/sql-reference/functions/geo/s2.md @@ -21,12 +21,12 @@ geoToS2(lon, lat) **Arguments** -- `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). -- `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md). +- `lon` — Longitude. [Float64](../../../sql-reference/data-types/float.md). +- `lat` — Latitude. [Float64](../../../sql-reference/data-types/float.md). **Returned values** -- S2 point index. +- S2 point index. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -58,11 +58,11 @@ s2ToGeo(s2index) **Arguments** -- `s2index` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2index` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- A tuple consisting of two values: `tuple(lon,lat)`. +- A tuple consisting of two values: `tuple(lon,lat)`. Type: `lon` — [Float64](../../../sql-reference/data-types/float.md). `lat` — [Float64](../../../sql-reference/data-types/float.md). @@ -94,11 +94,11 @@ s2GetNeighbors(s2index) **Arguments** -- `s2index` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2index` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- An array consisting of 4 neighbor indexes: `array[s2index1, s2index3, s2index2, s2index4]`. +- An array consisting of 4 neighbor indexes: `array[s2index1, s2index3, s2index2, s2index4]`. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -130,12 +130,12 @@ s2CellsIntersect(s2index1, s2index2) **Arguments** -- `siIndex1`, `s2index2` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `siIndex1`, `s2index2` — S2 Index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- 1 — If the cells intersect. -- 0 — If the cells don't intersect. +- 1 — If the cells intersect. +- 0 — If the cells don't intersect. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -167,14 +167,14 @@ s2CapContains(center, degrees, point) **Arguments** -- `center` — S2 point index corresponding to the cap. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `degrees` — Radius of the cap in degrees. [Float64](../../../sql-reference/data-types/float.md). -- `point` — S2 point index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `center` — S2 point index corresponding to the cap. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `degrees` — Radius of the cap in degrees. [Float64](../../../sql-reference/data-types/float.md). +- `point` — S2 point index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- 1 — If the cap contains the S2 point index. -- 0 — If the cap doesn't contain the S2 point index. +- 1 — If the cap contains the S2 point index. +- 0 — If the cap doesn't contain the S2 point index. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). @@ -206,13 +206,13 @@ s2CapUnion(center1, radius1, center2, radius2) **Arguments** -- `center1`, `center2` — S2 point indixes corresponding to the two input caps. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `radius1`, `radius2` — Radius of the two input caps in degrees. [Float64](../../../sql-reference/data-types/float.md). +- `center1`, `center2` — S2 point indixes corresponding to the two input caps. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `radius1`, `radius2` — Radius of the two input caps in degrees. [Float64](../../../sql-reference/data-types/float.md). **Returned values** -- `center` — S2 point index corresponding the center of the smallest cap containing the two input caps. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `radius` — Radius of the smallest cap containing the two input caps. Type: [Float64](../../../sql-reference/data-types/float.md). +- `center` — S2 point index corresponding the center of the smallest cap containing the two input caps. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `radius` — Radius of the smallest cap containing the two input caps. Type: [Float64](../../../sql-reference/data-types/float.md). **Example** @@ -242,14 +242,14 @@ s2RectAdd(s2pointLow, s2pointHigh, s2Point) **Arguments** -- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2Point` — Target S2 point index that the bound rectangle should be grown to include. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Point` — Target S2 point index that the bound rectangle should be grown to include. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- `s2PointLow` — Low S2 cell id corresponding to the grown rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2PointHigh` — Hight S2 cell id corresponding to the grown rectangle. Type: [UInt64](../../../sql-reference/data-types/float.md). +- `s2PointLow` — Low S2 cell id corresponding to the grown rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2PointHigh` — Hight S2 cell id corresponding to the grown rectangle. Type: [UInt64](../../../sql-reference/data-types/float.md). **Example** @@ -279,14 +279,14 @@ s2RectContains(s2PointLow, s2PointHi, s2Point) **Arguments** -- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2Point` — Target S2 point index. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2PointLow` — Low S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2PointHigh` — High S2 point index corresponding to the rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Point` — Target S2 point index. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- 1 — If the rectangle contains the given S2 point. -- 0 — If the rectangle doesn't contain the given S2 point. +- 1 — If the rectangle contains the given S2 point. +- 0 — If the rectangle doesn't contain the given S2 point. **Example** @@ -316,13 +316,13 @@ s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi) **Arguments** -- `s2Rect1PointLow`, `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2Rect2PointLow`, `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Rect1PointLow`, `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Rect2PointLow`, `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the union rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2UnionRect2PointHi` — High S2 cell id corresponding to the union rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the union rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2UnionRect2PointHi` — High S2 cell id corresponding to the union rectangle. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Example** @@ -352,13 +352,13 @@ s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2Poin **Arguments** -- `s2Rect1PointLow`, `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2Rect2PointLow`, `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Rect1PointLow`, `s2Rect1PointHi` — Low and High S2 point indexes corresponding to the first rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2Rect2PointLow`, `s2Rect2PointHi` — Low and High S2 point indexes corresponding to the second rectangle. [UInt64](../../../sql-reference/data-types/int-uint.md). **Returned values** -- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). -- `s2UnionRect2PointHi` — High S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2UnionRect2PointLow` — Low S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). +- `s2UnionRect2PointHi` — High S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). **Example** diff --git a/docs/en/sql-reference/functions/hash-functions.md b/docs/en/sql-reference/functions/hash-functions.md index 5fcf6a2d1df..4f7cd7ee662 100644 --- a/docs/en/sql-reference/functions/hash-functions.md +++ b/docs/en/sql-reference/functions/hash-functions.md @@ -335,11 +335,11 @@ Even in these cases, we recommend applying the function offline and pre-calculat **Arguments** -- `s` — Input string for SHA hash calculation. [String](/docs/en/sql-reference/data-types/string.md). +- `s` — Input string for SHA hash calculation. [String](/docs/en/sql-reference/data-types/string.md). **Returned value** -- SHA hash as a hex-unencoded FixedString. SHA-1 returns as FixedString(20), SHA-224 as FixedString(28), SHA-256 — FixedString(32), SHA-512 — FixedString(64). +- SHA hash as a hex-unencoded FixedString. SHA-1 returns as FixedString(20), SHA-224 as FixedString(28), SHA-256 — FixedString(32), SHA-512 — FixedString(64). Type: [FixedString](/docs/en/sql-reference/data-types/fixedstring.md). @@ -502,7 +502,7 @@ javaHashUTF16LE(stringUtf16le) **Arguments** -- `stringUtf16le` — a string in UTF-16LE encoding. +- `stringUtf16le` — a string in UTF-16LE encoding. **Returned value** @@ -607,8 +607,8 @@ Both functions take a variable number of input parameters. Arguments can be any **Returned Value** -- The `murmurHash2_32` function returns hash value having the [UInt32](/docs/en/sql-reference/data-types/int-uint.md) data type. -- The `murmurHash2_64` function returns hash value having the [UInt64](/docs/en/sql-reference/data-types/int-uint.md) data type. +- The `murmurHash2_32` function returns hash value having the [UInt32](/docs/en/sql-reference/data-types/int-uint.md) data type. +- The `murmurHash2_64` function returns hash value having the [UInt64](/docs/en/sql-reference/data-types/int-uint.md) data type. **Example** @@ -634,11 +634,11 @@ gccMurmurHash(par1, ...) **Arguments** -- `par1, ...` — A variable number of parameters that can be any of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). +- `par1, ...` — A variable number of parameters that can be any of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). **Returned value** -- Calculated hash value. +- Calculated hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -673,11 +673,11 @@ MurmurHash(par1, ...) **Arguments** -- `par1, ...` — A variable number of parameters that can be any of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). +- `par1, ...` — A variable number of parameters that can be any of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). **Returned value** -- Calculated hash value. +- Calculated hash value. Type: [UInt32](/docs/en/sql-reference/data-types/int-uint.md). @@ -714,8 +714,8 @@ Both functions take a variable number of input parameters. Arguments can be any **Returned Value** -- The `murmurHash3_32` function returns a [UInt32](/docs/en/sql-reference/data-types/int-uint.md) data type hash value. -- The `murmurHash3_64` function returns a [UInt64](/docs/en/sql-reference/data-types/int-uint.md) data type hash value. +- The `murmurHash3_32` function returns a [UInt32](/docs/en/sql-reference/data-types/int-uint.md) data type hash value. +- The `murmurHash3_64` function returns a [UInt64](/docs/en/sql-reference/data-types/int-uint.md) data type hash value. **Example** @@ -741,7 +741,7 @@ murmurHash3_128(expr) **Arguments** -- `expr` — A list of [expressions](/docs/en/sql-reference/syntax.md/#syntax-expressions). [String](/docs/en/sql-reference/data-types/string.md). +- `expr` — A list of [expressions](/docs/en/sql-reference/syntax.md/#syntax-expressions). [String](/docs/en/sql-reference/data-types/string.md). **Returned value** @@ -777,7 +777,7 @@ xxh3(expr) **Arguments** -- `expr` — A list of [expressions](/docs/en/sql-reference/syntax.md/#syntax-expressions) of any data type. +- `expr` — A list of [expressions](/docs/en/sql-reference/syntax.md/#syntax-expressions) of any data type. **Returned value** @@ -837,7 +837,7 @@ Result: **See Also** -- [xxHash](http://cyan4973.github.io/xxHash/). +- [xxHash](http://cyan4973.github.io/xxHash/). ## ngramSimHash @@ -853,12 +853,12 @@ ngramSimHash(string[, ngramsize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -892,12 +892,12 @@ ngramSimHashCaseInsensitive(string[, ngramsize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -931,12 +931,12 @@ ngramSimHashUTF8(string[, ngramsize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -970,12 +970,12 @@ ngramSimHashCaseInsensitiveUTF8(string[, ngramsize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -1009,12 +1009,12 @@ wordShingleSimHash(string[, shinglesize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -1048,12 +1048,12 @@ wordShingleSimHashCaseInsensitive(string[, shinglesize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -1087,12 +1087,12 @@ wordShingleSimHashUTF8(string[, shinglesize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optinal. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optinal. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -1126,12 +1126,12 @@ wordShingleSimHashCaseInsensitiveUTF8(string[, shinglesize]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -1165,13 +1165,13 @@ ngramMinHash(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1205,13 +1205,13 @@ ngramMinHashCaseInsensitive(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1245,13 +1245,13 @@ ngramMinHashUTF8(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1285,13 +1285,13 @@ ngramMinHashCaseInsensitiveUTF8(string [, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1323,13 +1323,13 @@ ngramMinHashArg(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` n-grams each. +- Tuple with two tuples with `hashnum` n-grams each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1361,13 +1361,13 @@ ngramMinHashArgCaseInsensitive(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` n-grams each. +- Tuple with two tuples with `hashnum` n-grams each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1399,13 +1399,13 @@ ngramMinHashArgUTF8(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` n-grams each. +- Tuple with two tuples with `hashnum` n-grams each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1437,13 +1437,13 @@ ngramMinHashArgCaseInsensitiveUTF8(string[, ngramsize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `ngramsize` — The size of an n-gram. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` n-grams each. +- Tuple with two tuples with `hashnum` n-grams each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1477,13 +1477,13 @@ wordShingleMinHash(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1517,13 +1517,13 @@ wordShingleMinHashCaseInsensitive(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1557,13 +1557,13 @@ wordShingleMinHashUTF8(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1597,13 +1597,13 @@ wordShingleMinHashCaseInsensitiveUTF8(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two hashes — the minimum and the maximum. +- Tuple with two hashes — the minimum and the maximum. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([UInt64](/docs/en/sql-reference/data-types/int-uint.md), [UInt64](/docs/en/sql-reference/data-types/int-uint.md)). @@ -1635,13 +1635,13 @@ wordShingleMinHashArg(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` word shingles each. +- Tuple with two tuples with `hashnum` word shingles each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1673,13 +1673,13 @@ wordShingleMinHashArgCaseInsensitive(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` word shingles each. +- Tuple with two tuples with `hashnum` word shingles each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1711,13 +1711,13 @@ wordShingleMinHashArgUTF8(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` word shingles each. +- Tuple with two tuples with `hashnum` word shingles each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). @@ -1749,13 +1749,13 @@ wordShingleMinHashArgCaseInsensitiveUTF8(string[, shinglesize, hashnum]) **Arguments** -- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). -- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `string` — String. [String](/docs/en/sql-reference/data-types/string.md). +- `shinglesize` — The size of a word shingle. Optional. Possible values: any number from `1` to `25`. Default value: `3`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `hashnum` — The number of minimum and maximum hashes used to calculate the result. Optional. Possible values: any number from `1` to `25`. Default value: `6`. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). **Returned value** -- Tuple with two tuples with `hashnum` word shingles each. +- Tuple with two tuples with `hashnum` word shingles each. Type: [Tuple](/docs/en/sql-reference/data-types/tuple.md)([Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md)), [Tuple](/docs/en/sql-reference/data-types/tuple.md)([String](/docs/en/sql-reference/data-types/string.md))). diff --git a/docs/en/sql-reference/functions/index.md b/docs/en/sql-reference/functions/index.md index 01da5f01679..6767d7c6b7d 100644 --- a/docs/en/sql-reference/functions/index.md +++ b/docs/en/sql-reference/functions/index.md @@ -37,8 +37,8 @@ Functions can be implemented in different ways for constant and non-constant arg Functions have the following behaviors: -- If at least one of the arguments of the function is `NULL`, the function result is also `NULL`. -- Special behavior that is specified individually in the description of each function. In the ClickHouse source code, these functions have `UseDefaultImplementationForNulls=false`. +- If at least one of the arguments of the function is `NULL`, the function result is also `NULL`. +- Special behavior that is specified individually in the description of each function. In the ClickHouse source code, these functions have `UseDefaultImplementationForNulls=false`. ## Constancy @@ -70,21 +70,21 @@ The configuration of executable user defined functions can be located in one or A function configuration contains the following settings: -- `name` - a function name. -- `command` - script name to execute or command if `execute_direct` is false. -- `argument` - argument description with the `type`, and optional `name` of an argument. Each argument is described in a separate setting. Specifying name is necessary if argument names are part of serialization for user defined function format like [Native](../../interfaces/formats.md#native) or [JSONEachRow](../../interfaces/formats.md#jsoneachrow). Default argument name value is `c` + argument_number. -- `format` - a [format](../../interfaces/formats.md) in which arguments are passed to the command. -- `return_type` - the type of a returned value. -- `return_name` - name of retuned value. Specifying return name is necessary if return name is part of serialization for user defined function format like [Native](../../interfaces/formats.md#native) or [JSONEachRow](../../interfaces/formats.md#jsoneachrow). Optional. Default value is `result`. -- `type` - an executable type. If `type` is set to `executable` then single command is started. If it is set to `executable_pool` then a pool of commands is created. -- `max_command_execution_time` - maximum execution time in seconds for processing block of data. This setting is valid for `executable_pool` commands only. Optional. Default value is `10`. -- `command_termination_timeout` - time in seconds during which a command should finish after its pipe is closed. After that time `SIGTERM` is sent to the process executing the command. Optional. Default value is `10`. -- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. -- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. -- `pool_size` - the size of a command pool. Optional. Default value is `16`. -- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. -- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `1`. Optional parameter. -- `lifetime` - the reload interval of a function in seconds. If it is set to `0` then the function is not reloaded. Default value is `0`. Optional parameter. +- `name` - a function name. +- `command` - script name to execute or command if `execute_direct` is false. +- `argument` - argument description with the `type`, and optional `name` of an argument. Each argument is described in a separate setting. Specifying name is necessary if argument names are part of serialization for user defined function format like [Native](../../interfaces/formats.md#native) or [JSONEachRow](../../interfaces/formats.md#jsoneachrow). Default argument name value is `c` + argument_number. +- `format` - a [format](../../interfaces/formats.md) in which arguments are passed to the command. +- `return_type` - the type of a returned value. +- `return_name` - name of retuned value. Specifying return name is necessary if return name is part of serialization for user defined function format like [Native](../../interfaces/formats.md#native) or [JSONEachRow](../../interfaces/formats.md#jsoneachrow). Optional. Default value is `result`. +- `type` - an executable type. If `type` is set to `executable` then single command is started. If it is set to `executable_pool` then a pool of commands is created. +- `max_command_execution_time` - maximum execution time in seconds for processing block of data. This setting is valid for `executable_pool` commands only. Optional. Default value is `10`. +- `command_termination_timeout` - time in seconds during which a command should finish after its pipe is closed. After that time `SIGTERM` is sent to the process executing the command. Optional. Default value is `10`. +- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. Optional parameter. +- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. Optional parameter. +- `pool_size` - the size of a command pool. Optional. Default value is `16`. +- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Optional. Default value is `false`. +- `execute_direct` - If `execute_direct` = `1`, then `command` will be searched inside user_scripts folder specified by [user_scripts_path](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_scripts_path). Additional script arguments can be specified using whitespace separator. Example: `script_name arg1 arg2`. If `execute_direct` = `0`, `command` is passed as argument for `bin/sh -c`. Default value is `1`. Optional parameter. +- `lifetime` - the reload interval of a function in seconds. If it is set to `0` then the function is not reloaded. Default value is `0`. Optional parameter. The command must read arguments from `STDIN` and must output the result to `STDOUT`. The command must process arguments iteratively. That is after processing a chunk of arguments it must wait for the next chunk. @@ -287,8 +287,8 @@ For distributed query processing, as many stages of query processing as possible This means that functions can be performed on different servers. For example, in the query `SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),` -- if a `distributed_table` has at least two shards, the functions ‘g’ and ‘h’ are performed on remote servers, and the function ‘f’ is performed on the requestor server. -- if a `distributed_table` has only one shard, all the ‘f’, ‘g’, and ‘h’ functions are performed on this shard’s server. +- if a `distributed_table` has at least two shards, the functions ‘g’ and ‘h’ are performed on remote servers, and the function ‘f’ is performed on the requestor server. +- if a `distributed_table` has only one shard, all the ‘f’, ‘g’, and ‘h’ functions are performed on this shard’s server. The result of a function usually does not depend on which server it is performed on. However, sometimes this is important. For example, functions that work with dictionaries use the dictionary that exists on the server they are running on. diff --git a/docs/en/sql-reference/functions/introspection.md b/docs/en/sql-reference/functions/introspection.md index c01abd6ed89..a02e549e931 100644 --- a/docs/en/sql-reference/functions/introspection.md +++ b/docs/en/sql-reference/functions/introspection.md @@ -14,9 +14,9 @@ These functions are slow and may impose security considerations. For proper operation of introspection functions: -- Install the `clickhouse-common-static-dbg` package. +- Install the `clickhouse-common-static-dbg` package. -- Set the [allow_introspection_functions](../../operations/settings/settings.md#settings-allow_introspection_functions) setting to 1. +- Set the [allow_introspection_functions](../../operations/settings/settings.md#settings-allow_introspection_functions) setting to 1. For security reasons introspection functions are disabled by default. @@ -36,17 +36,17 @@ addressToLine(address_of_binary_instruction) **Arguments** -- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. +- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. **Returned value** -- Source code filename and the line number in this file delimited by colon. +- Source code filename and the line number in this file delimited by colon. For example, `/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199`, where `199` is a line number. -- Name of a binary, if the function couldn’t find the debug information. +- Name of a binary, if the function couldn’t find the debug information. -- Empty string, if the address is not valid. +- Empty string, if the address is not valid. Type: [String](../../sql-reference/data-types/string.md). @@ -129,15 +129,15 @@ addressToLineWithInlines(address_of_binary_instruction) **Arguments** -- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. +- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. **Returned value** -- Array which first element is source code filename and the line number in this file delimited by colon. And from second element, inline functions' source code filename and line number and function name are listed. +- Array which first element is source code filename and the line number in this file delimited by colon. And from second element, inline functions' source code filename and line number and function name are listed. -- Array with single element which is name of a binary, if the function couldn’t find the debug information. +- Array with single element which is name of a binary, if the function couldn’t find the debug information. -- Empty array, if the address is not valid. +- Empty array, if the address is not valid. Type: [Array(String)](../../sql-reference/data-types/array.md). @@ -232,12 +232,12 @@ addressToSymbol(address_of_binary_instruction) **Arguments** -- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. +- `address_of_binary_instruction` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Address of instruction in a running process. **Returned value** -- Symbol from ClickHouse object files. -- Empty string, if the address is not valid. +- Symbol from ClickHouse object files. +- Empty string, if the address is not valid. Type: [String](../../sql-reference/data-types/string.md). @@ -329,12 +329,12 @@ demangle(symbol) **Arguments** -- `symbol` ([String](../../sql-reference/data-types/string.md)) — Symbol from an object file. +- `symbol` ([String](../../sql-reference/data-types/string.md)) — Symbol from an object file. **Returned value** -- Name of the C++ function. -- Empty string if a symbol is not valid. +- Name of the C++ function. +- Empty string if a symbol is not valid. Type: [String](../../sql-reference/data-types/string.md). @@ -425,7 +425,7 @@ tid() **Returned value** -- Current thread id. [Uint64](../../sql-reference/data-types/int-uint.md#uint-ranges). +- Current thread id. [Uint64](../../sql-reference/data-types/int-uint.md#uint-ranges). **Example** @@ -455,11 +455,11 @@ logTrace('message') **Arguments** -- `message` — Message that is emitted to server log. [String](../../sql-reference/data-types/string.md#string). +- `message` — Message that is emitted to server log. [String](../../sql-reference/data-types/string.md#string). **Returned value** -- Always returns 0. +- Always returns 0. **Example** diff --git a/docs/en/sql-reference/functions/ip-address-functions.md b/docs/en/sql-reference/functions/ip-address-functions.md index 47058a28d12..b55b64674cb 100644 --- a/docs/en/sql-reference/functions/ip-address-functions.md +++ b/docs/en/sql-reference/functions/ip-address-functions.md @@ -147,11 +147,11 @@ IPv6StringToNum(string) **Argument** -- `string` — IP address. [String](../../sql-reference/data-types/string.md). +- `string` — IP address. [String](../../sql-reference/data-types/string.md). **Returned value** -- IPv6 address in binary format. +- IPv6 address in binary format. Type: [FixedString(16)](../../sql-reference/data-types/fixedstring.md). @@ -175,7 +175,7 @@ Result: **See Also** -- [cutIPv6](#cutipv6x-bytestocutforipv6-bytestocutforipv4). +- [cutIPv6](#cutipv6x-bytestocutforipv6-bytestocutforipv4). ## IPv6StringToNumOrDefault(s) @@ -309,11 +309,11 @@ toIPv6(string) **Argument** -- `string` — IP address. [String](../../sql-reference/data-types/string.md) +- `string` — IP address. [String](../../sql-reference/data-types/string.md) **Returned value** -- IP address. +- IP address. Type: [IPv6](../../sql-reference/data-types/domains/ipv6.md). @@ -370,11 +370,11 @@ isIPv4String(string) **Arguments** -- `string` — IP address. [String](../../sql-reference/data-types/string.md). +- `string` — IP address. [String](../../sql-reference/data-types/string.md). **Returned value** -- `1` if `string` is IPv4 address, `0` otherwise. +- `1` if `string` is IPv4 address, `0` otherwise. Type: [UInt8](../../sql-reference/data-types/int-uint.md). @@ -408,11 +408,11 @@ isIPv6String(string) **Arguments** -- `string` — IP address. [String](../../sql-reference/data-types/string.md). +- `string` — IP address. [String](../../sql-reference/data-types/string.md). **Returned value** -- `1` if `string` is IPv6 address, `0` otherwise. +- `1` if `string` is IPv6 address, `0` otherwise. Type: [UInt8](../../sql-reference/data-types/int-uint.md). @@ -449,12 +449,12 @@ This function accepts both IPv4 and IPv6 addresses (and networks) represented as **Arguments** -- `address` — An IPv4 or IPv6 address. [String](../../sql-reference/data-types/string.md). -- `prefix` — An IPv4 or IPv6 network prefix in CIDR. [String](../../sql-reference/data-types/string.md). +- `address` — An IPv4 or IPv6 address. [String](../../sql-reference/data-types/string.md). +- `prefix` — An IPv4 or IPv6 network prefix in CIDR. [String](../../sql-reference/data-types/string.md). **Returned value** -- `1` or `0`. +- `1` or `0`. Type: [UInt8](../../sql-reference/data-types/int-uint.md). @@ -516,11 +516,11 @@ This function performs reverse DNS resolutions on both IPv4 and IPv6. **Arguments** -- `address` — An IPv4 or IPv6 address. [String](../../sql-reference/data-types/string.md). +- `address` — An IPv4 or IPv6 address. [String](../../sql-reference/data-types/string.md). **Returned value** -- Associated domains (PTR records). +- Associated domains (PTR records). Type: Type: [Array(String)](../../sql-reference/data-types/array.md). diff --git a/docs/en/sql-reference/functions/json-functions.md b/docs/en/sql-reference/functions/json-functions.md index 808474edf22..cce1dad4753 100644 --- a/docs/en/sql-reference/functions/json-functions.md +++ b/docs/en/sql-reference/functions/json-functions.md @@ -109,9 +109,9 @@ SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0 `indices_or_keys` is a list of zero or more arguments each of them can be either string or integer. -- String = access object member by key. -- Positive integer = access the n-th member/key from the beginning. -- Negative integer = access the n-th member/key from the end. +- String = access object member by key. +- Positive integer = access the n-th member/key from the beginning. +- Negative integer = access the n-th member/key from the end. Minimum index of the element is 1. Thus the element 0 does not exist. @@ -236,8 +236,8 @@ JSONExtractKeys(json[, a, b, c...]) **Arguments** -- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. -- `a, b, c...` — Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a [String](../../sql-reference/data-types/string.md) to get the field by the key or an [Integer](../../sql-reference/data-types/int-uint.md) to get the N-th field (indexed from 1, negative integers count from the end). If not set, the whole JSON is parsed as the top-level object. Optional parameter. +- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. +- `a, b, c...` — Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a [String](../../sql-reference/data-types/string.md) to get the field by the key or an [Integer](../../sql-reference/data-types/int-uint.md) to get the N-th field (indexed from 1, negative integers count from the end). If not set, the whole JSON is parsed as the top-level object. Optional parameter. **Returned value** @@ -298,13 +298,13 @@ JSONExtractKeysAndValuesRaw(json[, p, a, t, h]) **Arguments** -- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. -- `p, a, t, h` — Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a [string](../../sql-reference/data-types/string.md) to get the field by the key or an [integer](../../sql-reference/data-types/int-uint.md) to get the N-th field (indexed from 1, negative integers count from the end). If not set, the whole JSON is parsed as the top-level object. Optional parameter. +- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. +- `p, a, t, h` — Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a [string](../../sql-reference/data-types/string.md) to get the field by the key or an [integer](../../sql-reference/data-types/int-uint.md) to get the N-th field (indexed from 1, negative integers count from the end). If not set, the whole JSON is parsed as the top-level object. Optional parameter. **Returned values** -- Array with `('key', 'value')` tuples. Both tuple members are strings. -- Empty array if the requested object does not exist, or input JSON is invalid. +- Array with `('key', 'value')` tuples. Both tuple members are strings. +- Empty array if the requested object does not exist, or input JSON is invalid. Type: [Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([String](../../sql-reference/data-types/string.md), [String](../../sql-reference/data-types/string.md)). @@ -443,11 +443,11 @@ toJSONString(value) **Arguments** -- `value` — Value to serialize. Value may be of any data type. +- `value` — Value to serialize. Value may be of any data type. **Returned value** -- JSON representation of the value. +- JSON representation of the value. Type: [String](../../sql-reference/data-types/string.md). @@ -472,8 +472,8 @@ Result: **See Also** -- [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) -- [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) +- [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) +- [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) ## JSONArrayLength @@ -490,11 +490,11 @@ Alias: `JSON_ARRAY_LENGTH(json)`. **Arguments** -- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. +- `json` — [String](../../sql-reference/data-types/string.md) with valid JSON. **Returned value** -- If `json` is a valid JSON array string, returns the number of array elements, otherwise returns NULL. +- If `json` is a valid JSON array string, returns the number of array elements, otherwise returns NULL. Type: [Nullable(UInt64)](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/logical-functions.md b/docs/en/sql-reference/functions/logical-functions.md index 137753d12c9..51baae07c12 100644 --- a/docs/en/sql-reference/functions/logical-functions.md +++ b/docs/en/sql-reference/functions/logical-functions.md @@ -24,13 +24,13 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Arguments** -- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). **Returned value** -- `0`, if there is at least one zero value argument. -- `NULL`, if there are no zero values arguments and there is at least one `NULL` argument. -- `1`, otherwise. +- `0`, if there is at least one zero value argument. +- `NULL`, if there are no zero values arguments and there is at least one `NULL` argument. +- `1`, otherwise. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). @@ -78,13 +78,13 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Arguments** -- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). **Returned value** -- `1`, if there is at least one non-zero value. -- `0`, if there are only zero values. -- `NULL`, if there are only zero values and `NULL`. +- `1`, if there is at least one non-zero value. +- `0`, if there are only zero values. +- `NULL`, if there are only zero values and `NULL`. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). @@ -130,13 +130,13 @@ not(val); **Arguments** -- `val` — The value. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). +- `val` — The value. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). **Returned value** -- `1`, if the `val` is `0`. -- `0`, if the `val` is a non-zero value. -- `NULL`, if the `val` is a `NULL` value. +- `1`, if the `val` is `0`. +- `0`, if the `val` is a non-zero value. +- `NULL`, if the `val` is a `NULL` value. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). @@ -168,13 +168,13 @@ xor(val1, val2...) **Arguments** -- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). +- `val1, val2, ...` — List of at least two values. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). **Returned value** -- `1`, for two values: if one of the values is zero and other is not. -- `0`, for two values: if both values are zero or non-zero at the same time. -- `NULL`, if there is at least one `NULL` value. +- `1`, for two values: if one of the values is zero and other is not. +- `0`, for two values: if both values are zero or non-zero at the same time. +- `NULL`, if there is at least one `NULL` value. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). diff --git a/docs/en/sql-reference/functions/math-functions.md b/docs/en/sql-reference/functions/math-functions.md index 10bc73c4a72..4ec0e3cd778 100644 --- a/docs/en/sql-reference/functions/math-functions.md +++ b/docs/en/sql-reference/functions/math-functions.md @@ -124,11 +124,11 @@ cosh(x) **Arguments** -- `x` — The angle, in radians. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — The angle, in radians. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- Values from the interval: `1 <= cosh(x) < +∞`. +- Values from the interval: `1 <= cosh(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -160,11 +160,11 @@ acosh(x) **Arguments** -- `x` — Hyperbolic cosine of angle. Values from the interval: `1 <= x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Hyperbolic cosine of angle. Values from the interval: `1 <= x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- The angle, in radians. Values from the interval: `0 <= acosh(x) < +∞`. +- The angle, in radians. Values from the interval: `0 <= acosh(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -186,7 +186,7 @@ Result: **See Also** -- [cosh(x)](../../sql-reference/functions/math-functions.md#coshx) +- [cosh(x)](../../sql-reference/functions/math-functions.md#coshx) ## sinh(x) @@ -200,11 +200,11 @@ sinh(x) **Arguments** -- `x` — The angle, in radians. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — The angle, in radians. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- Values from the interval: `-∞ < sinh(x) < +∞`. +- Values from the interval: `-∞ < sinh(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -236,11 +236,11 @@ asinh(x) **Arguments** -- `x` — Hyperbolic sine of angle. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Hyperbolic sine of angle. Values from the interval: `-∞ < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- The angle, in radians. Values from the interval: `-∞ < asinh(x) < +∞`. +- The angle, in radians. Values from the interval: `-∞ < asinh(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -262,7 +262,7 @@ Result: **See Also** -- [sinh(x)](../../sql-reference/functions/math-functions.md#sinhx) +- [sinh(x)](../../sql-reference/functions/math-functions.md#sinhx) ## atanh(x) @@ -276,11 +276,11 @@ atanh(x) **Arguments** -- `x` — Hyperbolic tangent of angle. Values from the interval: `–1 < x < 1`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Hyperbolic tangent of angle. Values from the interval: `–1 < x < 1`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- The angle, in radians. Values from the interval: `-∞ < atanh(x) < +∞`. +- The angle, in radians. Values from the interval: `-∞ < atanh(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -312,12 +312,12 @@ atan2(y, x) **Arguments** -- `y` — y-coordinate of the point through which the ray passes. [Float64](../../sql-reference/data-types/float.md#float32-float64). -- `x` — x-coordinate of the point through which the ray passes. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `y` — y-coordinate of the point through which the ray passes. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — x-coordinate of the point through which the ray passes. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- The angle `θ` such that `−π < θ ≤ π`, in radians. +- The angle `θ` such that `−π < θ ≤ π`, in radians. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -349,12 +349,12 @@ hypot(x, y) **Arguments** -- `x` — The first cathetus of a right-angle triangle. [Float64](../../sql-reference/data-types/float.md#float32-float64). -- `y` — The second cathetus of a right-angle triangle. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — The first cathetus of a right-angle triangle. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `y` — The second cathetus of a right-angle triangle. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- The length of the hypotenuse of a right-angle triangle. +- The length of the hypotenuse of a right-angle triangle. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -386,11 +386,11 @@ log1p(x) **Arguments** -- `x` — Values from the interval: `-1 < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Values from the interval: `-1 < x < +∞`. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- Values from the interval: `-∞ < log1p(x) < +∞`. +- Values from the interval: `-∞ < log1p(x) < +∞`. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -412,7 +412,7 @@ Result: **See Also** -- [log(x)](../../sql-reference/functions/math-functions.md#logx-lnx) +- [log(x)](../../sql-reference/functions/math-functions.md#logx-lnx) ## sign(x) @@ -426,7 +426,7 @@ sign(x) **Arguments** -- `x` — Values from `-∞` to `+∞`. Support all numeric types in ClickHouse. +- `x` — Values from `-∞` to `+∞`. Support all numeric types in ClickHouse. **Returned value** @@ -490,11 +490,11 @@ degrees(x) **Arguments** -- `x` — Input in radians. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Input in radians. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- Value in degrees. +- Value in degrees. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -526,11 +526,11 @@ radians(x) **Arguments** -- `x` — Input in degrees. [Float64](../../sql-reference/data-types/float.md#float32-float64). +- `x` — Input in degrees. [Float64](../../sql-reference/data-types/float.md#float32-float64). **Returned value** -- Value in radians. +- Value in radians. Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). @@ -608,4 +608,4 @@ Result: ┌─widthBucket(10.15, -8.6, 23, 18)─┐ │ 11 │ └──────────────────────────────────┘ -``` \ No newline at end of file +``` diff --git a/docs/en/sql-reference/functions/nlp-functions.md b/docs/en/sql-reference/functions/nlp-functions.md index 132a126edee..0b95a14dda4 100644 --- a/docs/en/sql-reference/functions/nlp-functions.md +++ b/docs/en/sql-reference/functions/nlp-functions.md @@ -21,8 +21,8 @@ stem('language', word) **Arguments** -- `language` — Language which rules will be applied. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). -- `word` — word that needs to be stemmed. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). +- `language` — Language which rules will be applied. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). +- `word` — word that needs to be stemmed. Must be in lowercase. [String](../../sql-reference/data-types/string.md#string). **Examples** @@ -52,8 +52,8 @@ lemmatize('language', word) **Arguments** -- `language` — Language which rules will be applied. [String](../../sql-reference/data-types/string.md#string). -- `word` — Word that needs to be lemmatized. Must be lowercase. [String](../../sql-reference/data-types/string.md#string). +- `language` — Language which rules will be applied. [String](../../sql-reference/data-types/string.md#string). +- `word` — Word that needs to be lemmatized. Must be lowercase. [String](../../sql-reference/data-types/string.md#string). **Examples** @@ -97,8 +97,8 @@ synonyms('extension_name', word) **Arguments** -- `extension_name` — Name of the extension in which search will be performed. [String](../../sql-reference/data-types/string.md#string). -- `word` — Word that will be searched in extension. [String](../../sql-reference/data-types/string.md#string). +- `extension_name` — Name of the extension in which search will be performed. [String](../../sql-reference/data-types/string.md#string). +- `word` — Word that will be searched in extension. [String](../../sql-reference/data-types/string.md#string). **Examples** @@ -146,7 +146,7 @@ detectLanguage('text_to_be_analyzed') **Arguments** -- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). +- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). **Returned value** @@ -184,7 +184,7 @@ detectLanguageMixed('text_to_be_analyzed') **Arguments** -- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). +- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). **Returned value** @@ -220,7 +220,7 @@ detectLanguageUnknown('text_to_be_analyzed') **Arguments** -- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). +- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). **Returned value** @@ -260,7 +260,7 @@ detectCharset('text_to_be_analyzed') **Arguments** -- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). +- `text_to_be_analyzed` — A collection (or sentences) of strings to analyze. [String](../../sql-reference/data-types/string.md#string). **Returned value** diff --git a/docs/en/sql-reference/functions/other-functions.md b/docs/en/sql-reference/functions/other-functions.md index 2e44fa5e9f6..32cf7972864 100644 --- a/docs/en/sql-reference/functions/other-functions.md +++ b/docs/en/sql-reference/functions/other-functions.md @@ -23,11 +23,11 @@ getMacro(name); **Arguments** -- `name` — Name to retrieve from the `macros` section. [String](../../sql-reference/data-types/string.md#string). +- `name` — Name to retrieve from the `macros` section. [String](../../sql-reference/data-types/string.md#string). **Returned value** -- Value of the specified macro. +- Value of the specified macro. Type: [String](../../sql-reference/data-types/string.md). @@ -82,7 +82,7 @@ This function is case-insensitive. **Returned value** -- String with the fully qualified domain name. +- String with the fully qualified domain name. Type: `String`. @@ -112,17 +112,17 @@ basename( expr ) **Arguments** -- `expr` — Expression resulting in a [String](../../sql-reference/data-types/string.md) type value. All the backslashes must be escaped in the resulting value. +- `expr` — Expression resulting in a [String](../../sql-reference/data-types/string.md) type value. All the backslashes must be escaped in the resulting value. **Returned Value** A string that contains: -- The trailing part of a string after the last slash or backslash. +- The trailing part of a string after the last slash or backslash. If the input string contains a path ending with slash or backslash, for example, `/` or `c:\`, the function returns an empty string. -- The original string if there are no slashes or backslashes. +- The original string if there are no slashes or backslashes. **Example** @@ -196,11 +196,11 @@ byteSize(argument [, ...]) **Arguments** -- `argument` — Value. +- `argument` — Value. **Returned value** -- Estimation of byte size of the arguments in memory. +- Estimation of byte size of the arguments in memory. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -316,8 +316,8 @@ Alias: `user()`, `USER()`. **Returned values** -- Login of current user. -- Login of user that initiated query in case of disributed query. +- Login of current user. +- Login of user that initiated query in case of disributed query. Type: `String`. @@ -353,12 +353,12 @@ isConstant(x) **Arguments** -- `x` — Expression to check. +- `x` — Expression to check. **Returned values** -- `1` — `x` is constant. -- `0` — `x` is non-constant. +- `1` — `x` is constant. +- `0` — `x` is non-constant. Type: [UInt8](../../sql-reference/data-types/int-uint.md). @@ -424,13 +424,13 @@ Checks whether floating point value is finite. **Arguments** -- `x` — Value to be checked for infinity. Type: [Float\*](../../sql-reference/data-types/float.md). -- `y` — Fallback value. Type: [Float\*](../../sql-reference/data-types/float.md). +- `x` — Value to be checked for infinity. Type: [Float\*](../../sql-reference/data-types/float.md). +- `y` — Fallback value. Type: [Float\*](../../sql-reference/data-types/float.md). **Returned value** -- `x` if `x` is finite. -- `y` if `x` is not finite. +- `x` if `x` is finite. +- `y` if `x` is not finite. **Example** @@ -464,9 +464,9 @@ Allows building a unicode-art diagram. **Arguments** -- `x` — Size to display. -- `min, max` — Integer constants. The value must fit in `Int64`. -- `width` — Constant, positive integer, can be fractional. +- `x` — Size to display. +- `min, max` — Integer constants. The value must fit in `Int64`. +- `width` — Constant, positive integer, can be fractional. The band is drawn with accuracy to one eighth of a symbol. @@ -670,8 +670,8 @@ formatReadableTimeDelta(column[, maximum_unit]) **Arguments** -- `column` — A column with numeric time delta. -- `maximum_unit` — Optional. Maximum unit to show. Acceptable values seconds, minutes, hours, days, months, years. +- `column` — A column with numeric time delta. +- `maximum_unit` — Optional. Maximum unit to show. Acceptable values seconds, minutes, hours, days, months, years. Example: @@ -715,12 +715,12 @@ parseTimeDelta(timestr) **Arguments** -- `timestr` — A sequence of numbers followed by something resembling a time unit. +- `timestr` — A sequence of numbers followed by something resembling a time unit. **Returned value** -- A floating-point number with the number of seconds. +- A floating-point number with the number of seconds. **Example** @@ -801,14 +801,14 @@ To prevent that you can make a subquery with [ORDER BY](../../sql-reference/stat **Arguments** -- `column` — A column name or scalar expression. -- `offset` — The number of rows forwards or backwards from the current row of `column`. [Int64](../../sql-reference/data-types/int-uint.md). -- `default_value` — Optional. The value to be returned if offset goes beyond the scope of the block. Type of data blocks affected. +- `column` — A column name or scalar expression. +- `offset` — The number of rows forwards or backwards from the current row of `column`. [Int64](../../sql-reference/data-types/int-uint.md). +- `default_value` — Optional. The value to be returned if offset goes beyond the scope of the block. Type of data blocks affected. **Returned values** -- Value for `column` in `offset` distance from current row if `offset` value is not outside block bounds. -- Default value for `column` if `offset` value is outside block bounds. If `default_value` is given, then it will be used. +- Value for `column` in `offset` distance from current row if `offset` value is not outside block bounds. +- Default value for `column` if `offset` value is outside block bounds. If `default_value` is given, then it will be used. Type: type of data blocks affected or default value type. @@ -998,12 +998,12 @@ runningConcurrency(start, end) **Arguments** -- `start` — A column with the start time of events. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), or [DateTime64](../../sql-reference/data-types/datetime64.md). -- `end` — A column with the end time of events. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `start` — A column with the start time of events. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), or [DateTime64](../../sql-reference/data-types/datetime64.md). +- `end` — A column with the end time of events. [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), or [DateTime64](../../sql-reference/data-types/datetime64.md). **Returned values** -- The number of concurrent events at each event start time. +- The number of concurrent events at each event start time. Type: [UInt32](../../sql-reference/data-types/int-uint.md) @@ -1059,12 +1059,12 @@ getSizeOfEnumType(value) **Arguments:** -- `value` — Value of type `Enum`. +- `value` — Value of type `Enum`. **Returned values** -- The number of fields with `Enum` input values. -- An exception is thrown if the type is not `Enum`. +- The number of fields with `Enum` input values. +- An exception is thrown if the type is not `Enum`. **Example** @@ -1088,11 +1088,11 @@ blockSerializedSize(value[, value[, ...]]) **Arguments** -- `value` — Any value. +- `value` — Any value. **Returned values** -- The number of bytes that will be written to disk for block of values (without compression). +- The number of bytes that will be written to disk for block of values (without compression). **Example** @@ -1120,11 +1120,11 @@ toColumnTypeName(value) **Arguments:** -- `value` — Any type of value. +- `value` — Any type of value. **Returned values** -- A string with the name of the class that is used for representing the `value` data type in RAM. +- A string with the name of the class that is used for representing the `value` data type in RAM. **Example of the difference between`toTypeName ' and ' toColumnTypeName`** @@ -1160,11 +1160,11 @@ dumpColumnStructure(value) **Arguments:** -- `value` — Any type of value. +- `value` — Any type of value. **Returned values** -- A string describing the structure that is used for representing the `value` data type in RAM. +- A string describing the structure that is used for representing the `value` data type in RAM. **Example** @@ -1190,13 +1190,13 @@ defaultValueOfArgumentType(expression) **Arguments:** -- `expression` — Arbitrary type of value or an expression that results in a value of an arbitrary type. +- `expression` — Arbitrary type of value or an expression that results in a value of an arbitrary type. **Returned values** -- `0` for numbers. -- Empty string for strings. -- `ᴺᵁᴸᴸ` for [Nullable](../../sql-reference/data-types/nullable.md). +- `0` for numbers. +- Empty string for strings. +- `ᴺᵁᴸᴸ` for [Nullable](../../sql-reference/data-types/nullable.md). **Example** @@ -1232,13 +1232,13 @@ defaultValueOfTypeName(type) **Arguments:** -- `type` — A string representing a type name. +- `type` — A string representing a type name. **Returned values** -- `0` for numbers. -- Empty string for strings. -- `ᴺᵁᴸᴸ` for [Nullable](../../sql-reference/data-types/nullable.md). +- `0` for numbers. +- Empty string for strings. +- `ᴺᵁᴸᴸ` for [Nullable](../../sql-reference/data-types/nullable.md). **Example** @@ -1377,8 +1377,8 @@ SELECT replicate(x, arr); **Arguments:** -- `arr` — Original array. ClickHouse creates a new array of the same length as the original and fills it with the value `x`. -- `x` — The value that the resulting array will be filled with. +- `arr` — Original array. ClickHouse creates a new array of the same length as the original and fills it with the value `x`. +- `x` — The value that the resulting array will be filled with. **Returned value** @@ -1414,7 +1414,7 @@ filesystemAvailable() **Returned value** -- The amount of remaining space available in bytes. +- The amount of remaining space available in bytes. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -1446,7 +1446,7 @@ filesystemFree() **Returned value** -- Amount of free space in bytes. +- Amount of free space in bytes. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -1478,7 +1478,7 @@ filesystemCapacity() **Returned value** -- Capacity information of the filesystem in bytes. +- Capacity information of the filesystem in bytes. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -1510,8 +1510,8 @@ initializeAggregation (aggregate_function, arg1, arg2, ..., argN) **Arguments** -- `aggregate_function` — Name of the aggregation function to initialize. [String](../../sql-reference/data-types/string.md). -- `arg` — Arguments of aggregate function. +- `aggregate_function` — Name of the aggregation function to initialize. [String](../../sql-reference/data-types/string.md). +- `arg` — Arguments of aggregate function. **Returned value(s)** @@ -1568,7 +1568,7 @@ INSERT INTO metrics VALUES (0, initializeAggregation('sumState', toUInt64(42))) ``` **See Also** -- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) +- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) ## finalizeAggregation @@ -1582,11 +1582,11 @@ finalizeAggregation(state) **Arguments** -- `state` — State of aggregation. [AggregateFunction](../../sql-reference/data-types/aggregatefunction.md#data-type-aggregatefunction). +- `state` — State of aggregation. [AggregateFunction](../../sql-reference/data-types/aggregatefunction.md#data-type-aggregatefunction). **Returned value(s)** -- Value/values that was aggregated. +- Value/values that was aggregated. Type: Value of any types that was aggregated. @@ -1667,8 +1667,8 @@ Result: ``` **See Also** -- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) -- [initializeAggregation](#initializeaggregation) +- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) +- [initializeAggregation](#initializeaggregation) ## runningAccumulate @@ -1686,12 +1686,12 @@ runningAccumulate(agg_state[, grouping]); **Arguments** -- `agg_state` — State of the aggregate function. [AggregateFunction](../../sql-reference/data-types/aggregatefunction.md#data-type-aggregatefunction). -- `grouping` — Grouping key. Optional. The state of the function is reset if the `grouping` value is changed. It can be any of the [supported data types](../../sql-reference/data-types/index.md) for which the equality operator is defined. +- `agg_state` — State of the aggregate function. [AggregateFunction](../../sql-reference/data-types/aggregatefunction.md#data-type-aggregatefunction). +- `grouping` — Grouping key. Optional. The state of the function is reset if the `grouping` value is changed. It can be any of the [supported data types](../../sql-reference/data-types/index.md) for which the equality operator is defined. **Returned value** -- Each resulting row contains a result of the aggregate function, accumulated for all the input rows from 0 to the current position. `runningAccumulate` resets states for each new data block or when the `grouping` value changes. +- Each resulting row contains a result of the aggregate function, accumulated for all the input rows from 0 to the current position. `runningAccumulate` resets states for each new data block or when the `grouping` value changes. Type depends on the aggregate function used. @@ -1792,9 +1792,9 @@ joinGet(join_storage_table_name, `value_column`, join_keys) **Arguments** -- `join_storage_table_name` — an [identifier](../../sql-reference/syntax.md#syntax-identifiers) indicates where search is performed. The identifier is searched in the default database (see parameter `default_database` in the config file). To override the default database, use the `USE db_name` or specify the database and the table through the separator `db_name.db_table`, see the example. -- `value_column` — name of the column of the table that contains required data. -- `join_keys` — list of keys. +- `join_storage_table_name` — an [identifier](../../sql-reference/syntax.md#syntax-identifiers) indicates where search is performed. The identifier is searched in the default database (see parameter `default_database` in the config file). To override the default database, use the `USE db_name` or specify the database and the table through the separator `db_name.db_table`, see the example. +- `value_column` — name of the column of the table that contains required data. +- `join_keys` — list of keys. **Returned value** @@ -1939,13 +1939,13 @@ randomPrintableASCII(length) **Arguments** -- `length` — Resulting string length. Positive integer. +- `length` — Resulting string length. Positive integer. If you pass `length < 0`, behavior of the function is undefined. **Returned value** -- String with a random set of [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) printable characters. +- String with a random set of [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) printable characters. Type: [String](../../sql-reference/data-types/string.md) @@ -1975,11 +1975,11 @@ randomString(length) **Arguments** -- `length` — String length. Positive integer. +- `length` — String length. Positive integer. **Returned value** -- String filled with random bytes. +- String filled with random bytes. Type: [String](../../sql-reference/data-types/string.md). @@ -2007,8 +2007,8 @@ len: 30 **See Also** -- [generateRandom](../../sql-reference/table-functions/generate.md#generaterandom) -- [randomPrintableASCII](../../sql-reference/functions/other-functions.md#randomascii) +- [generateRandom](../../sql-reference/table-functions/generate.md#generaterandom) +- [randomPrintableASCII](../../sql-reference/functions/other-functions.md#randomascii) ## randomFixedString @@ -2023,11 +2023,11 @@ randomFixedString(length); **Arguments** -- `length` — String length in bytes. [UInt64](../../sql-reference/data-types/int-uint.md). +- `length` — String length in bytes. [UInt64](../../sql-reference/data-types/int-uint.md). **Returned value(s)** -- String filled with random bytes. +- String filled with random bytes. Type: [FixedString](../../sql-reference/data-types/fixedstring.md). @@ -2060,11 +2060,11 @@ randomStringUTF8(length); **Arguments** -- `length` — Required length of the resulting string in code points. [UInt64](../../sql-reference/data-types/int-uint.md). +- `length` — Required length of the resulting string in code points. [UInt64](../../sql-reference/data-types/int-uint.md). **Returned value(s)** -- UTF-8 random string. +- UTF-8 random string. Type: [String](../../sql-reference/data-types/string.md). @@ -2097,11 +2097,11 @@ getSetting('custom_setting'); **Parameter** -- `custom_setting` — The setting name. [String](../../sql-reference/data-types/string.md). +- `custom_setting` — The setting name. [String](../../sql-reference/data-types/string.md). **Returned value** -- The setting current value. +- The setting current value. **Example** @@ -2118,7 +2118,7 @@ SELECT getSetting('custom_a'); **See Also** -- [Custom Settings](../../operations/settings/index.md#custom_settings) +- [Custom Settings](../../operations/settings/index.md#custom_settings) ## isDecimalOverflow @@ -2132,13 +2132,13 @@ isDecimalOverflow(d, [p]) **Arguments** -- `d` — value. [Decimal](../../sql-reference/data-types/decimal.md). -- `p` — precision. Optional. If omitted, the initial precision of the first argument is used. Using of this paratemer could be helpful for data extraction to another DBMS or file. [UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges). +- `d` — value. [Decimal](../../sql-reference/data-types/decimal.md). +- `p` — precision. Optional. If omitted, the initial precision of the first argument is used. Using of this paratemer could be helpful for data extraction to another DBMS or file. [UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges). **Returned values** -- `1` — Decimal value has more digits then it's precision allow, -- `0` — Decimal value satisfies the specified precision. +- `1` — Decimal value has more digits then it's precision allow, +- `0` — Decimal value satisfies the specified precision. **Example** @@ -2169,7 +2169,7 @@ countDigits(x) **Arguments** -- `x` — [Int](../../sql-reference/data-types/int-uint.md) or [Decimal](../../sql-reference/data-types/decimal.md) value. +- `x` — [Int](../../sql-reference/data-types/int-uint.md) or [Decimal](../../sql-reference/data-types/decimal.md) value. **Returned value** @@ -2201,7 +2201,7 @@ Result: **Returned value** -- Variable name for the error code. +- Variable name for the error code. Type: [LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md). @@ -2230,11 +2230,11 @@ tcpPort() **Arguments** -- None. +- None. **Returned value** -- The TCP port number. +- The TCP port number. Type: [UInt16](../../sql-reference/data-types/int-uint.md). @@ -2256,7 +2256,7 @@ Result: **See Also** -- [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) +- [tcp_port](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port) ## currentProfiles @@ -2272,7 +2272,7 @@ currentProfiles() **Returned value** -- List of the current user settings profiles. +- List of the current user settings profiles. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2288,7 +2288,7 @@ enabledProfiles() **Returned value** -- List of the enabled settings profiles. +- List of the enabled settings profiles. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2304,7 +2304,7 @@ defaultProfiles() **Returned value** -- List of the default settings profiles. +- List of the default settings profiles. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2320,7 +2320,7 @@ currentRoles() **Returned value** -- List of the current roles for the current user. +- List of the current roles for the current user. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2336,7 +2336,7 @@ enabledRoles() **Returned value** -- List of the enabled roles for the current user. +- List of the enabled roles for the current user. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2352,7 +2352,7 @@ defaultRoles() **Returned value** -- List of the default roles for the current user. +- List of the default roles for the current user. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -2368,22 +2368,22 @@ getServerPort(port_name) **Arguments** -- `port_name` — The name of the server port. [String](../../sql-reference/data-types/string.md#string). Possible values: +- `port_name` — The name of the server port. [String](../../sql-reference/data-types/string.md#string). Possible values: - - 'tcp_port' - - 'tcp_port_secure' - - 'http_port' - - 'https_port' - - 'interserver_http_port' - - 'interserver_https_port' - - 'mysql_port' - - 'postgresql_port' - - 'grpc_port' - - 'prometheus.port' + - 'tcp_port' + - 'tcp_port_secure' + - 'http_port' + - 'https_port' + - 'interserver_http_port' + - 'interserver_https_port' + - 'mysql_port' + - 'postgresql_port' + - 'grpc_port' + - 'prometheus.port' **Returned value** -- The number of the server port. +- The number of the server port. Type: [UInt16](../../sql-reference/data-types/int-uint.md). @@ -2417,7 +2417,7 @@ queryID() **Returned value** -- The ID of the current query. +- The ID of the current query. Type: [String](../../sql-reference/data-types/string.md) @@ -2453,7 +2453,7 @@ initialQueryID() **Returned value** -- The ID of the initial current query. +- The ID of the initial current query. Type: [String](../../sql-reference/data-types/string.md) @@ -2488,7 +2488,7 @@ shardNum() **Returned value** -- Shard index or constant `0`. +- Shard index or constant `0`. Type: [UInt32](../../sql-reference/data-types/int-uint.md). @@ -2515,7 +2515,7 @@ Result: **See Also** -- [Distributed Table Engine](../../engines/table-engines/special/distributed.md) +- [Distributed Table Engine](../../engines/table-engines/special/distributed.md) ## shardCount @@ -2530,7 +2530,7 @@ shardCount() **Returned value** -- Total number of shards or `0`. +- Total number of shards or `0`. Type: [UInt32](../../sql-reference/data-types/int-uint.md). @@ -2550,11 +2550,11 @@ getOSKernelVersion() **Arguments** -- None. +- None. **Returned value** -- The current OS kernel version. +- The current OS kernel version. Type: [String](../../sql-reference/data-types/string.md). @@ -2586,11 +2586,11 @@ zookeeperSessionUptime() **Arguments** -- None. +- None. **Returned value** -- Uptime of the current ZooKeeper session in seconds. +- Uptime of the current ZooKeeper session in seconds. Type: [UInt32](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/random-functions.md b/docs/en/sql-reference/functions/random-functions.md index eb6866d28ea..ce003e239f2 100644 --- a/docs/en/sql-reference/functions/random-functions.md +++ b/docs/en/sql-reference/functions/random-functions.md @@ -41,11 +41,11 @@ randConstant([x]) **Arguments** -- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. +- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. **Returned value** -- Pseudo-random number. +- Pseudo-random number. Type: [UInt32](../../sql-reference/data-types/int-uint.md). diff --git a/docs/en/sql-reference/functions/rounding-functions.md b/docs/en/sql-reference/functions/rounding-functions.md index 40ff958e0ae..9e2c747c8c2 100644 --- a/docs/en/sql-reference/functions/rounding-functions.md +++ b/docs/en/sql-reference/functions/rounding-functions.md @@ -38,11 +38,11 @@ round(expression [, decimal_places]) **Arguments** -- `expression` — A number to be rounded. Can be any [expression](../../sql-reference/syntax.md#syntax-expressions) returning the numeric [data type](../../sql-reference/data-types/index.md#data_types). -- `decimal-places` — An integer value. - - If `decimal-places > 0` then the function rounds the value to the right of the decimal point. - - If `decimal-places < 0` then the function rounds the value to the left of the decimal point. - - If `decimal-places = 0` then the function rounds the value to integer. In this case the argument can be omitted. +- `expression` — A number to be rounded. Can be any [expression](../../sql-reference/syntax.md#syntax-expressions) returning the numeric [data type](../../sql-reference/data-types/index.md#data_types). +- `decimal-places` — An integer value. + - If `decimal-places > 0` then the function rounds the value to the right of the decimal point. + - If `decimal-places < 0` then the function rounds the value to the left of the decimal point. + - If `decimal-places = 0` then the function rounds the value to integer. In this case the argument can be omitted. **Returned value:** @@ -101,27 +101,27 @@ round(3.65, 1) = 3.6 **See Also** -- [roundBankers](#roundbankers) +- [roundBankers](#roundbankers) ## roundBankers Rounds a number to a specified decimal position. -- If the rounding number is halfway between two numbers, the function uses banker’s rounding. +- If the rounding number is halfway between two numbers, the function uses banker’s rounding. Banker's rounding is a method of rounding fractional numbers. When the rounding number is halfway between two numbers, it's rounded to the nearest even digit at the specified decimal position. For example: 3.5 rounds up to 4, 2.5 rounds down to 2. It's the default rounding method for floating point numbers defined in [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest). The [round](#rounding_functions-round) function performs the same rounding for floating point numbers. The `roundBankers` function also rounds integers the same way, for example, `roundBankers(45, -1) = 40`. -- In other cases, the function rounds numbers to the nearest integer. +- In other cases, the function rounds numbers to the nearest integer. Using banker’s rounding, you can reduce the effect that rounding numbers has on the results of summing or subtracting these numbers. For example, sum numbers 1.5, 2.5, 3.5, 4.5 with different rounding: -- No rounding: 1.5 + 2.5 + 3.5 + 4.5 = 12. -- Banker’s rounding: 2 + 2 + 4 + 4 = 12. -- Rounding to the nearest integer: 2 + 3 + 4 + 5 = 14. +- No rounding: 1.5 + 2.5 + 3.5 + 4.5 = 12. +- Banker’s rounding: 2 + 2 + 4 + 4 = 12. +- Rounding to the nearest integer: 2 + 3 + 4 + 5 = 14. **Syntax** @@ -131,11 +131,11 @@ roundBankers(expression [, decimal_places]) **Arguments** -- `expression` — A number to be rounded. Can be any [expression](../../sql-reference/syntax.md#syntax-expressions) returning the numeric [data type](../../sql-reference/data-types/index.md#data_types). -- `decimal-places` — Decimal places. An integer number. - - `decimal-places > 0` — The function rounds the number to the given position right of the decimal point. Example: `roundBankers(3.55, 1) = 3.6`. - - `decimal-places < 0` — The function rounds the number to the given position left of the decimal point. Example: `roundBankers(24.55, -1) = 20`. - - `decimal-places = 0` — The function rounds the number to an integer. In this case the argument can be omitted. Example: `roundBankers(2.5) = 2`. +- `expression` — A number to be rounded. Can be any [expression](../../sql-reference/syntax.md#syntax-expressions) returning the numeric [data type](../../sql-reference/data-types/index.md#data_types). +- `decimal-places` — Decimal places. An integer number. + - `decimal-places > 0` — The function rounds the number to the given position right of the decimal point. Example: `roundBankers(3.55, 1) = 3.6`. + - `decimal-places < 0` — The function rounds the number to the given position left of the decimal point. Example: `roundBankers(24.55, -1) = 20`. + - `decimal-places = 0` — The function rounds the number to an integer. In this case the argument can be omitted. Example: `roundBankers(2.5) = 2`. **Returned value** @@ -182,7 +182,7 @@ roundBankers(10.755, 2) = 10.76 **See Also** -- [round](#rounding_functions-round) +- [round](#rounding_functions-round) ## roundToExp2(num) @@ -195,13 +195,13 @@ Accepts a number. If the number is less than one, it returns 0. Otherwise, it ro ## roundAge(num) Accepts a number. If the number is -- smaller than 1, it returns 0, -- between 1 and 17, it returns 17, -- between 18 and 24, it returns 18, -- between 25 and 34, it returns 25, -- between 35 and 44, it returns 35, -- between 45 and 54, it returns 45, -- larger than 55, it returns 55. +- smaller than 1, it returns 0, +- between 1 and 17, it returns 17, +- between 18 and 24, it returns 18, +- between 25 and 34, it returns 25, +- between 35 and 44, it returns 35, +- between 45 and 54, it returns 45, +- larger than 55, it returns 55. ## roundDown(num, arr) diff --git a/docs/en/sql-reference/functions/splitting-merging-functions.md b/docs/en/sql-reference/functions/splitting-merging-functions.md index 6015bb79b87..423be39be1c 100644 --- a/docs/en/sql-reference/functions/splitting-merging-functions.md +++ b/docs/en/sql-reference/functions/splitting-merging-functions.md @@ -19,17 +19,17 @@ splitByChar(separator, s[, max_substrings])) **Arguments** -- `separator` — The separator which should contain exactly one character. [String](../../sql-reference/data-types/string.md). -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `separator` — The separator which should contain exactly one character. [String](../../sql-reference/data-types/string.md). +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** Returns an array of selected substrings. Empty substrings may be selected when: -- A separator occurs at the beginning or end of the string; -- There are multiple consecutive separators; -- The original string `s` is empty. +- A separator occurs at the beginning or end of the string; +- There are multiple consecutive separators; +- The original string `s` is empty. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -57,9 +57,9 @@ splitByString(separator, s[, max_substrings])) **Arguments** -- `separator` — The separator. [String](../../sql-reference/data-types/string.md). -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `separator` — The separator. [String](../../sql-reference/data-types/string.md). +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** @@ -68,9 +68,9 @@ Returns an array of selected substrings. Empty substrings may be selected when: Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). -- A non-empty separator occurs at the beginning or end of the string; -- There are multiple consecutive non-empty separators; -- The original string `s` is empty while the separator is not empty. +- A non-empty separator occurs at the beginning or end of the string; +- There are multiple consecutive non-empty separators; +- The original string `s` is empty while the separator is not empty. **Example** @@ -106,18 +106,18 @@ splitByRegexp(regexp, s[, max_substrings])) **Arguments** -- `regexp` — Regular expression. Constant. [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `regexp` — Regular expression. Constant. [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** Returns an array of selected substrings. Empty substrings may be selected when: -- A non-empty regular expression match occurs at the beginning or end of the string; -- There are multiple consecutive non-empty regular expression matches; -- The original string `s` is empty while the regular expression is not empty. +- A non-empty regular expression match occurs at the beginning or end of the string; +- There are multiple consecutive non-empty regular expression matches; +- The original string `s` is empty while the regular expression is not empty. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -164,8 +164,8 @@ splitByWhitespace(s[, max_substrings])) **Arguments** -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** @@ -199,8 +199,8 @@ splitByNonAlpha(s[, max_substrings])) **Arguments** -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** @@ -250,8 +250,8 @@ splitByAlpha(s[, max_substrings]) **Arguments** -- `s` — The string to split. [String](../../sql-reference/data-types/string.md). -- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. +- `s` — The string to split. [String](../../sql-reference/data-types/string.md). +- `max_substrings` — An optional `Int64` defaulting to 0. When `max_substrings` > 0, the returned substrings will be no more than `max_substrings`, otherwise the function will return as many substrings as possible. **Returned value(s)** @@ -283,14 +283,14 @@ extractAllGroups(text, regexp) **Arguments** -- `text` — [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). -- `regexp` — Regular expression. Constant. [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). +- `text` — [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). +- `regexp` — Regular expression. Constant. [String](../data-types/string.md) or [FixedString](../data-types/fixedstring.md). **Returned values** -- If the function finds at least one matching group, it returns `Array(Array(String))` column, clustered by group_id (1 to N, where N is number of capturing groups in `regexp`). +- If the function finds at least one matching group, it returns `Array(Array(String))` column, clustered by group_id (1 to N, where N is number of capturing groups in `regexp`). -- If there is no matching group, returns an empty array. +- If there is no matching group, returns an empty array. Type: [Array](../data-types/array.md). @@ -322,12 +322,12 @@ ngrams(string, ngramsize) **Arguments** -- `string` — String. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- `ngramsize` — The size of an n-gram. [UInt](../../sql-reference/data-types/int-uint.md). +- `string` — String. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- `ngramsize` — The size of an n-gram. [UInt](../../sql-reference/data-types/int-uint.md). **Returned values** -- Array with n-grams. +- Array with n-grams. Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)). @@ -353,11 +353,11 @@ Splits a string into tokens using non-alphanumeric ASCII characters as separator **Arguments** -- `input_string` — Any set of bytes represented as the [String](../../sql-reference/data-types/string.md) data type object. +- `input_string` — Any set of bytes represented as the [String](../../sql-reference/data-types/string.md) data type object. **Returned value** -- The resulting array of tokens from input string. +- The resulting array of tokens from input string. Type: [Array](../data-types/array.md). diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index a52ca9f53f1..58433785290 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -26,11 +26,11 @@ The function also works for [arrays](array-functions.md#function-empty) or [UUID **Arguments** -- `x` — Input value. [String](../data-types/string.md). +- `x` — Input value. [String](../data-types/string.md). **Returned value** -- Returns `1` for an empty string or `0` for a non-empty string. +- Returns `1` for an empty string or `0` for a non-empty string. Type: [UInt8](../data-types/int-uint.md). @@ -66,11 +66,11 @@ The function also works for [arrays](array-functions.md#function-notempty) or [U **Arguments** -- `x` — Input value. [String](../data-types/string.md). +- `x` — Input value. [String](../data-types/string.md). **Returned value** -- Returns `1` for a non-empty string or `0` for an empty string string. +- Returns `1` for a non-empty string or `0` for an empty string string. Type: [UInt8](../data-types/int-uint.md). @@ -123,13 +123,13 @@ leftPad('string', 'length'[, 'pad_string']) **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. -- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- The resulting string of the given length. Type: [String](../data-types/string.md). @@ -161,13 +161,13 @@ leftPadUTF8('string','length'[, 'pad_string']) **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. -- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- The resulting string of the given length. Type: [String](../data-types/string.md). @@ -199,13 +199,13 @@ rightPad('string', 'length'[, 'pad_string']) **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. -- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- The resulting string of the given length. Type: [String](../data-types/string.md). @@ -237,13 +237,13 @@ rightPadUTF8('string','length'[, 'pad_string']) **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. -- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. +- `string` — Input string that needs to be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- The resulting string of the given length. Type: [String](../data-types/string.md). @@ -299,7 +299,7 @@ toValidUTF8(input_string) **Arguments** -- `input_string` — Any set of bytes represented as the [String](../../sql-reference/data-types/string.md) data type object. +- `input_string` — Any set of bytes represented as the [String](../../sql-reference/data-types/string.md) data type object. Returned value: Valid UTF-8 string. @@ -329,8 +329,8 @@ repeat(s, n) **Arguments** -- `s` — The string to repeat. [String](../../sql-reference/data-types/string.md). -- `n` — The number of times to repeat the string. [UInt or Int](../../sql-reference/data-types/int-uint.md). +- `s` — The string to repeat. [String](../../sql-reference/data-types/string.md). +- `n` — The number of times to repeat the string. [UInt or Int](../../sql-reference/data-types/int-uint.md). **Returned value** @@ -511,7 +511,7 @@ base58Encode(plaintext) **Returned value** -- A string containing encoded value of 1st argument. +- A string containing encoded value of 1st argument. Type: [String](../../sql-reference/data-types/string.md). @@ -546,7 +546,7 @@ base58Decode(encoded_text) **Returned value** -- A string containing decoded value of 1st argument. +- A string containing decoded value of 1st argument. Type: [String](../../sql-reference/data-types/string.md). @@ -599,8 +599,8 @@ SELECT startsWith('Spider-Man', 'Spi'); **Returned values** -- 1, if the string starts with the specified prefix. -- 0, if the string does not start with the specified prefix. +- 1, if the string starts with the specified prefix. +- 0, if the string does not start with the specified prefix. **Example** @@ -631,8 +631,8 @@ trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) **Arguments** -- `trim_character` — Specified characters for trim. [String](../../sql-reference/data-types/string.md). -- `input_string` — String for trim. [String](../../sql-reference/data-types/string.md). +- `trim_character` — Specified characters for trim. [String](../../sql-reference/data-types/string.md). +- `input_string` — String for trim. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -670,7 +670,7 @@ Alias: `ltrim(input_string)`. **Arguments** -- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). +- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -708,7 +708,7 @@ Alias: `rtrim(input_string)`. **Arguments** -- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). +- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -746,7 +746,7 @@ Alias: `trim(input_string)`. **Arguments** -- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). +- `input_string` — string to trim. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -800,11 +800,11 @@ normalizeQuery(x) **Arguments** -- `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). **Returned value** -- Sequence of characters with placeholders. +- Sequence of characters with placeholders. Type: [String](../../sql-reference/data-types/string.md). @@ -836,11 +836,11 @@ normalizedQueryHash(x) **Arguments** -- `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — Sequence of characters. [String](../../sql-reference/data-types/string.md). **Returned value** -- Hash value. +- Hash value. Type: [UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges). @@ -872,11 +872,11 @@ normalizeUTF8NFC(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). **Returned value** -- String transformed to NFC normalization form. +- String transformed to NFC normalization form. Type: [String](../../sql-reference/data-types/string.md). @@ -908,11 +908,11 @@ normalizeUTF8NFD(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). **Returned value** -- String transformed to NFD normalization form. +- String transformed to NFD normalization form. Type: [String](../../sql-reference/data-types/string.md). @@ -944,11 +944,11 @@ normalizeUTF8NFKC(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). **Returned value** -- String transformed to NFKC normalization form. +- String transformed to NFKC normalization form. Type: [String](../../sql-reference/data-types/string.md). @@ -980,11 +980,11 @@ normalizeUTF8NFKD(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). **Returned value** -- String transformed to NFKD normalization form. +- String transformed to NFKD normalization form. Type: [String](../../sql-reference/data-types/string.md). @@ -1018,11 +1018,11 @@ encodeXMLComponent(x) **Arguments** -- `x` — The sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — The sequence of characters. [String](../../sql-reference/data-types/string.md). **Returned value** -- The sequence of characters with escape characters. +- The sequence of characters with escape characters. Type: [String](../../sql-reference/data-types/string.md). @@ -1059,11 +1059,11 @@ decodeXMLComponent(x) **Arguments** -- `x` — A sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — A sequence of characters. [String](../../sql-reference/data-types/string.md). **Returned value** -- The sequence of characters after replacement. +- The sequence of characters after replacement. Type: [String](../../sql-reference/data-types/string.md). @@ -1085,7 +1085,7 @@ Result: **See Also** -- [List of XML and HTML character entity references](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references) +- [List of XML and HTML character entity references](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references) @@ -1121,11 +1121,11 @@ extractTextFromHTML(x) **Arguments** -- `x` — input text. [String](../../sql-reference/data-types/string.md). +- `x` — input text. [String](../../sql-reference/data-types/string.md). **Returned value** -- Extracted text. +- Extracted text. Type: [String](../../sql-reference/data-types/string.md). @@ -1170,11 +1170,11 @@ concatWithSeparator(sep, expr1, expr2, expr3...) ``` **Arguments** -- sep — separator. Const [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- exprN — expression to be concatenated. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- sep — separator. Const [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- exprN — expression to be concatenated. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). **Returned values** -- The concatenated String. +- The concatenated String. **Example** diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md index 38ccb43cbc9..058acfc0952 100644 --- a/docs/en/sql-reference/functions/string-search-functions.md +++ b/docs/en/sql-reference/functions/string-search-functions.md @@ -38,14 +38,14 @@ Syntax of `position(needle IN haystack)` provides SQL-compatibility, the functio **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` – Position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). Optional. +- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` – Position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). Optional. **Returned values** -- Starting position in bytes (counting from 1), if substring was found. -- 0, if the substring was not found. +- Starting position in bytes (counting from 1), if substring was found. +- 0, if the substring was not found. Type: `Integer`. @@ -165,14 +165,14 @@ positionCaseInsensitive(haystack, needle[, start_pos]) **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). +- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). **Returned values** -- Starting position in bytes (counting from 1), if substring was found. -- 0, if the substring was not found. +- Starting position in bytes (counting from 1), if substring was found. +- 0, if the substring was not found. Type: `Integer`. @@ -208,14 +208,14 @@ positionUTF8(haystack, needle[, start_pos]) **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) +- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) **Returned values** -- Starting position in Unicode points (counting from 1), if substring was found. -- 0, if the substring was not found. +- Starting position in Unicode points (counting from 1), if substring was found. +- 0, if the substring was not found. Type: `Integer`. @@ -281,14 +281,14 @@ positionCaseInsensitiveUTF8(haystack, needle[, start_pos]) **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) +- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) **Returned value** -- Starting position in Unicode points (counting from 1), if substring was found. -- 0, if the substring was not found. +- Starting position in Unicode points (counting from 1), if substring was found. +- 0, if the substring was not found. Type: `Integer`. @@ -314,9 +314,9 @@ The same as [position](../../sql-reference/functions/string-search-functions.md# The search is performed on sequences of bytes without respect to string encoding and collation. -- For case-insensitive ASCII search, use the function `multiSearchAllPositionsCaseInsensitive`. -- For search in UTF-8, use the function [multiSearchAllPositionsUTF8](#multiSearchAllPositionsUTF8). -- For case-insensitive UTF-8 search, use the function multiSearchAllPositionsCaseInsensitiveUTF8. +- For case-insensitive ASCII search, use the function `multiSearchAllPositionsCaseInsensitive`. +- For search in UTF-8, use the function [multiSearchAllPositionsUTF8](#multiSearchAllPositionsUTF8). +- For case-insensitive UTF-8 search, use the function multiSearchAllPositionsCaseInsensitiveUTF8. **Syntax** @@ -326,12 +326,12 @@ multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen]) **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). **Returned values** -- Array of starting positions in bytes (counting from 1), if the corresponding substring was found and 0 if not found. +- Array of starting positions in bytes (counting from 1), if the corresponding substring was found and 0 if not found. **Example** @@ -457,12 +457,12 @@ extractAllGroupsHorizontal(haystack, pattern) **Arguments** -- `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). -- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). +- `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). +- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). **Returned value** -- Type: [Array](../../sql-reference/data-types/array.md). +- Type: [Array](../../sql-reference/data-types/array.md). If `haystack` does not match the `pattern` regex, an array of empty arrays is returned. @@ -484,7 +484,7 @@ Result: **See Also** -- [extractAllGroupsVertical](#extractallgroups-vertical) +- [extractAllGroupsVertical](#extractallgroups-vertical) ## extractAllGroupsVertical @@ -498,12 +498,12 @@ extractAllGroupsVertical(haystack, pattern) **Arguments** -- `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). -- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). +- `haystack` — Input string. Type: [String](../../sql-reference/data-types/string.md). +- `pattern` — Regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). Must contain groups, each group enclosed in parentheses. If `pattern` contains no groups, an exception is thrown. Type: [String](../../sql-reference/data-types/string.md). **Returned value** -- Type: [Array](../../sql-reference/data-types/array.md). +- Type: [Array](../../sql-reference/data-types/array.md). If `haystack` does not match the `pattern` regex, an empty array is returned. @@ -525,18 +525,18 @@ Result: **See Also** -- [extractAllGroupsHorizontal](#extractallgroups-horizontal) +- [extractAllGroupsHorizontal](#extractallgroups-horizontal) ## like(haystack, pattern), haystack LIKE pattern operator Checks whether a string matches a LIKE expression. A LIKE expression contains a mix of normal characters and the following metasymbols: -- `%` indicates an arbitrary number of arbitrary characters (including zero characters). +- `%` indicates an arbitrary number of arbitrary characters (including zero characters). -- `_` indicates a single arbitrary character. +- `_` indicates a single arbitrary character. -- `\` is for escaping literals `%`, `_` and `\`. +- `\` is for escaping literals `%`, `_` and `\`. Matching is based on UTF-8, e.g. `_` matches the Unicode code point `¥` which is represented in UTF-8 using two bytes. If the haystack or the pattern are not valid UTF-8, then the behavior is undefined. @@ -567,8 +567,8 @@ ilike(haystack, pattern) **Arguments** -- `haystack` — Input string. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `pattern` — If `pattern` does not contain percent signs or underscores, then the `pattern` only represents the string itself. An underscore (`_`) in `pattern` stands for (matches) any single character. A percent sign (`%`) matches any sequence of zero or more characters. +- `haystack` — Input string. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `pattern` — If `pattern` does not contain percent signs or underscores, then the `pattern` only represents the string itself. An underscore (`_`) in `pattern` stands for (matches) any single character. A percent sign (`%`) matches any sequence of zero or more characters. Some `pattern` examples: @@ -581,8 +581,8 @@ Some `pattern` examples: **Returned values** -- True, if the string matches `pattern`. -- False, if the string does not match `pattern`. +- True, if the string matches `pattern`. +- False, if the string does not match `pattern`. **Example** @@ -645,13 +645,13 @@ countSubstrings(haystack, needle[, start_pos]) **Arguments** -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` – Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). +- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` – Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). **Returned values** -- Number of occurrences. +- Number of occurrences. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -711,13 +711,13 @@ countSubstringsCaseInsensitive(haystack, needle[, start_pos]) **Arguments** -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). +- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). **Returned values** -- Number of occurrences. +- Number of occurrences. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -777,13 +777,13 @@ SELECT countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos]) **Arguments** -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). +- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). **Returned values** -- Number of occurrences. +- Number of occurrences. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -829,12 +829,12 @@ countMatches(haystack, pattern) **Arguments** -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `pattern` — The regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). [String](../../sql-reference/data-types/string.md). +- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `pattern` — The regular expression with [re2 syntax](https://github.com/google/re2/wiki/Syntax). [String](../../sql-reference/data-types/string.md). **Returned value** -- The number of matches. +- The number of matches. Type: [UInt64](../../sql-reference/data-types/int-uint.md). @@ -882,9 +882,9 @@ Alias: `REGEXP_EXTRACT(haystack, pattern[, index])`. **Arguments** -- `haystack` — String, in which regexp pattern will to be matched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `pattern` — String, regexp expression, must be constant. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `index` – An integer number greater or equal 0 with default 1. It represents which regex group to extract. [UInt or Int](../../sql-reference/data-types/int-uint.md). Optional. +- `haystack` — String, in which regexp pattern will to be matched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `pattern` — String, regexp expression, must be constant. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `index` – An integer number greater or equal 0 with default 1. It represents which regex group to extract. [UInt or Int](../../sql-reference/data-types/int-uint.md). Optional. **Returned values** diff --git a/docs/en/sql-reference/functions/tuple-functions.md b/docs/en/sql-reference/functions/tuple-functions.md index c4742d0bac7..bb0b7f639d8 100644 --- a/docs/en/sql-reference/functions/tuple-functions.md +++ b/docs/en/sql-reference/functions/tuple-functions.md @@ -47,11 +47,11 @@ You can use the `EXCEPT` expression to skip columns as a result of the query. **Arguments** -- `x` — A `tuple` function, column, or tuple of elements. [Tuple](../../sql-reference/data-types/tuple.md). +- `x` — A `tuple` function, column, or tuple of elements. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- None. +- None. **Examples** @@ -111,7 +111,7 @@ Result: **See Also** -- [Tuple](../../sql-reference/data-types/tuple.md) +- [Tuple](../../sql-reference/data-types/tuple.md) ## tupleHammingDistance @@ -125,14 +125,14 @@ tupleHammingDistance(tuple1, tuple2) **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). Tuples should have the same type of the elements. **Returned value** -- The Hamming distance. +- The Hamming distance. Type: The result type is calculed the same way it is for [Arithmetic functions](../../sql-reference/functions/arithmetic-functions.md), based on the number of elements in the input tuples. @@ -195,11 +195,11 @@ tupleToNameValuePairs(tuple) **Arguments** -- `tuple` — Named tuple. [Tuple](../../sql-reference/data-types/tuple.md) with any types of values. +- `tuple` — Named tuple. [Tuple](../../sql-reference/data-types/tuple.md) with any types of values. **Returned value** -- An array with (name, value) pairs. +- An array with (name, value) pairs. Type: [Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([String](../../sql-reference/data-types/string.md), ...)). @@ -272,12 +272,12 @@ Alias: `vectorSum`. **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Tuple with the sum. +- Tuple with the sum. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -311,12 +311,12 @@ Alias: `vectorDifference`. **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Tuple with the result of subtraction. +- Tuple with the result of subtraction. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -348,12 +348,12 @@ tupleMultiply(tuple1, tuple2) **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Tuple with the multiplication. +- Tuple with the multiplication. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -385,12 +385,12 @@ tupleDivide(tuple1, tuple2) **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Tuple with the result of division. +- Tuple with the result of division. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -422,11 +422,11 @@ tupleNegate(tuple) **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Tuple with the result of negation. +- Tuple with the result of negation. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -458,12 +458,12 @@ tupleMultiplyByNumber(tuple, number) **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). -- `number` — Multiplier. [Int/UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `number` — Multiplier. [Int/UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). **Returned value** -- Tuple with multiplied values. +- Tuple with multiplied values. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -495,12 +495,12 @@ tupleDivideByNumber(tuple, number) **Arguments** -- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). -- `number` — Divider. [Int/UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). +- `tuple` — [Tuple](../../sql-reference/data-types/tuple.md). +- `number` — Divider. [Int/UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). **Returned value** -- Tuple with divided values. +- Tuple with divided values. Type: [Tuple](../../sql-reference/data-types/tuple.md). @@ -534,12 +534,12 @@ Alias: `scalarProduct`. **Arguments** -- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). -- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple1` — First tuple. [Tuple](../../sql-reference/data-types/tuple.md). +- `tuple2` — Second tuple. [Tuple](../../sql-reference/data-types/tuple.md). **Returned value** -- Scalar product. +- Scalar product. Type: [Int/UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Decimal](../../sql-reference/data-types/decimal.md). diff --git a/docs/en/sql-reference/functions/tuple-map-functions.md b/docs/en/sql-reference/functions/tuple-map-functions.md index cdecbbcc2e9..e6d0023cba7 100644 --- a/docs/en/sql-reference/functions/tuple-map-functions.md +++ b/docs/en/sql-reference/functions/tuple-map-functions.md @@ -17,12 +17,12 @@ map(key1, value1[, key2, value2, ...]) **Arguments** -- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md). -- `value` — The value part of the pair. Arbitrary type, including [Map](../../sql-reference/data-types/map.md) and [Array](../../sql-reference/data-types/array.md). +- `key` — The key part of the pair. [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md). +- `value` — The value part of the pair. Arbitrary type, including [Map](../../sql-reference/data-types/map.md) and [Array](../../sql-reference/data-types/array.md). **Returned value** -- Data structure as `key:value` pairs. +- Data structure as `key:value` pairs. Type: [Map(key, value)](../../sql-reference/data-types/map.md). @@ -64,7 +64,7 @@ Result: **See Also** -- [Map(key, value)](../../sql-reference/data-types/map.md) data type +- [Map(key, value)](../../sql-reference/data-types/map.md) data type ## mapFromArrays @@ -81,8 +81,8 @@ mapFromArrays(keys, values) Alias: `MAP_FROM_ARRAYS(keys, values)` **Arguments** -- `keys` — Given key array to create a map from. The nested type of array must be: [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md) -- `values` - Given value array or map to create a map from. +- `keys` — Given key array to create a map from. The nested type of array must be: [String](../../sql-reference/data-types/string.md), [Integer](../../sql-reference/data-types/int-uint.md), [LowCardinality](../../sql-reference/data-types/lowcardinality.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [UUID](../../sql-reference/data-types/uuid.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md), [Date32](../../sql-reference/data-types/date32.md), [Enum](../../sql-reference/data-types/enum.md) +- `values` - Given value array or map to create a map from. **Returned value** @@ -122,7 +122,7 @@ Arguments are [maps](../../sql-reference/data-types/map.md) or [tuples](../../sq **Returned value** -- Depending on the arguments returns one [map](../../sql-reference/data-types/map.md) or [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. +- Depending on the arguments returns one [map](../../sql-reference/data-types/map.md) or [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. **Example** @@ -170,7 +170,7 @@ Arguments are [maps](../../sql-reference/data-types/map.md) or [tuples](../../sq **Returned value** -- Depending on the arguments returns one [map](../../sql-reference/data-types/map.md) or [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. +- Depending on the arguments returns one [map](../../sql-reference/data-types/map.md) or [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2), where the first array contains the sorted keys and the second array contains values. **Example** @@ -223,17 +223,17 @@ Arguments are [maps](../../sql-reference/data-types/map.md) or two [arrays](../. Mapped arrays: -- `keys` — Array of keys. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). -- `values` — Array of values. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). -- `max` — Maximum key value. Optional. [Int8, Int16, Int32, Int64, Int128, Int256](../../sql-reference/data-types/int-uint.md#int-ranges). +- `keys` — Array of keys. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). +- `values` — Array of values. [Array](../../sql-reference/data-types/array.md#data-type-array)([Int](../../sql-reference/data-types/int-uint.md#uint-ranges)). +- `max` — Maximum key value. Optional. [Int8, Int16, Int32, Int64, Int128, Int256](../../sql-reference/data-types/int-uint.md#int-ranges). or -- `map` — Map with integer keys. [Map](../../sql-reference/data-types/map.md). +- `map` — Map with integer keys. [Map](../../sql-reference/data-types/map.md). **Returned value** -- Depending on the arguments returns a [map](../../sql-reference/data-types/map.md) or a [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array): keys in sorted order, and values the corresponding keys. +- Depending on the arguments returns a [map](../../sql-reference/data-types/map.md) or a [tuple](../../sql-reference/data-types/tuple.md#tuplet1-t2) of two [arrays](../../sql-reference/data-types/array.md#data-type-array): keys in sorted order, and values the corresponding keys. **Example** @@ -277,12 +277,12 @@ mapContains(map, key) **Arguments** -- `map` — Map. [Map](../../sql-reference/data-types/map.md). -- `key` — Key. Type matches the type of keys of `map` parameter. +- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `key` — Key. Type matches the type of keys of `map` parameter. **Returned value** -- `1` if `map` contains `key`, `0` if not. +- `1` if `map` contains `key`, `0` if not. Type: [UInt8](../../sql-reference/data-types/int-uint.md). @@ -322,11 +322,11 @@ mapKeys(map) **Arguments** -- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `map` — Map. [Map](../../sql-reference/data-types/map.md). **Returned value** -- Array containing all keys from the `map`. +- Array containing all keys from the `map`. Type: [Array](../../sql-reference/data-types/array.md). @@ -365,11 +365,11 @@ mapValues(map) **Arguments** -- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `map` — Map. [Map](../../sql-reference/data-types/map.md). **Returned value** -- Array containing all the values from `map`. +- Array containing all the values from `map`. Type: [Array](../../sql-reference/data-types/array.md). @@ -404,12 +404,12 @@ mapContainsKeyLike(map, pattern) **Arguments** -- `map` — Map. [Map](../../sql-reference/data-types/map.md). -- `pattern` - String pattern to match. +- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `pattern` - String pattern to match. **Returned value** -- `1` if `map` contains `key` like specified pattern, `0` if not. +- `1` if `map` contains `key` like specified pattern, `0` if not. **Example** @@ -442,8 +442,8 @@ mapExtractKeyLike(map, pattern) **Arguments** -- `map` — Map. [Map](../../sql-reference/data-types/map.md). -- `pattern` - String pattern to match. +- `map` — Map. [Map](../../sql-reference/data-types/map.md). +- `pattern` - String pattern to match. **Returned value** @@ -480,8 +480,8 @@ mapApply(func, map) **Arguments** -- `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). -- `map` — [Map](../../sql-reference/data-types/map.md). +- `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). +- `map` — [Map](../../sql-reference/data-types/map.md). **Returned value** @@ -520,8 +520,8 @@ mapFilter(func, map) **Arguments** -- `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). -- `map` — [Map](../../sql-reference/data-types/map.md). +- `func` - [Lambda function](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function). +- `map` — [Map](../../sql-reference/data-types/map.md). **Returned value** @@ -562,8 +562,8 @@ mapUpdate(map1, map2) **Arguments** -- `map1` [Map](../../sql-reference/data-types/map.md). -- `map2` [Map](../../sql-reference/data-types/map.md). +- `map1` [Map](../../sql-reference/data-types/map.md). +- `map2` [Map](../../sql-reference/data-types/map.md). **Returned value** diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index 32882e189b4..43eadc992c5 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -55,16 +55,16 @@ SETTINGS cast_keep_nullable = 1 Converts an input value to a value the [Int](/docs/en/sql-reference/data-types/int-uint.md) data type. This function family includes: -- `toInt8(expr)` — Converts to a value of data type `Int8`. -- `toInt16(expr)` — Converts to a value of data type `Int16`. -- `toInt32(expr)` — Converts to a value of data type `Int32`. -- `toInt64(expr)` — Converts to a value of data type `Int64`. -- `toInt128(expr)` — Converts to a value of data type `Int128`. -- `toInt256(expr)` — Converts to a value of data type `Int256`. +- `toInt8(expr)` — Converts to a value of data type `Int8`. +- `toInt16(expr)` — Converts to a value of data type `Int16`. +- `toInt32(expr)` — Converts to a value of data type `Int32`. +- `toInt64(expr)` — Converts to a value of data type `Int64`. +- `toInt128(expr)` — Converts to a value of data type `Int128`. +- `toInt256(expr)` — Converts to a value of data type `Int256`. **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped. +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped. **Returned value** @@ -155,19 +155,19 @@ Result: Converts an input value to the [UInt](/docs/en/sql-reference/data-types/int-uint.md) data type. This function family includes: -- `toUInt8(expr)` — Converts to a value of data type `UInt8`. -- `toUInt16(expr)` — Converts to a value of data type `UInt16`. -- `toUInt32(expr)` — Converts to a value of data type `UInt32`. -- `toUInt64(expr)` — Converts to a value of data type `UInt64`. -- `toUInt256(expr)` — Converts to a value of data type `UInt256`. +- `toUInt8(expr)` — Converts to a value of data type `UInt8`. +- `toUInt16(expr)` — Converts to a value of data type `UInt16`. +- `toUInt32(expr)` — Converts to a value of data type `UInt32`. +- `toUInt64(expr)` — Converts to a value of data type `UInt64`. +- `toUInt256(expr)` — Converts to a value of data type `UInt256`. **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped. +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) returning a number or a string with the decimal representation of a number. Binary, octal, and hexadecimal representations of numbers are not supported. Leading zeroes are stripped. **Returned value** -- Integer value in the `UInt8`, `UInt16`, `UInt32`, `UInt64` or `UInt256` data type. +- Integer value in the `UInt8`, `UInt16`, `UInt32`, `UInt64` or `UInt256` data type. Functions use [rounding towards zero](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero), meaning they truncate fractional digits of numbers. @@ -342,11 +342,11 @@ toDate32(expr) **Arguments** -- `expr` — The value. [String](/docs/en/sql-reference/data-types/string.md), [UInt32](/docs/en/sql-reference/data-types/int-uint.md) or [Date](/docs/en/sql-reference/data-types/date.md). +- `expr` — The value. [String](/docs/en/sql-reference/data-types/string.md), [UInt32](/docs/en/sql-reference/data-types/int-uint.md) or [Date](/docs/en/sql-reference/data-types/date.md). **Returned value** -- A calendar date. Type [Date32](/docs/en/sql-reference/data-types/date32.md). +- A calendar date. Type [Date32](/docs/en/sql-reference/data-types/date32.md). **Example** @@ -460,13 +460,13 @@ toDateTime64(expr, scale, [timezone]) **Arguments** -- `expr` — The value. [String](/docs/en/sql-reference/data-types/string.md), [UInt32](/docs/en/sql-reference/data-types/int-uint.md), [Float](/docs/en/sql-reference/data-types/float.md) or [DateTime](/docs/en/sql-reference/data-types/datetime.md). -- `scale` - Tick size (precision): 10-precision seconds. Valid range: [ 0 : 9 ]. -- `timezone` - Time zone of the specified datetime64 object. +- `expr` — The value. [String](/docs/en/sql-reference/data-types/string.md), [UInt32](/docs/en/sql-reference/data-types/int-uint.md), [Float](/docs/en/sql-reference/data-types/float.md) or [DateTime](/docs/en/sql-reference/data-types/datetime.md). +- `scale` - Tick size (precision): 10-precision seconds. Valid range: [ 0 : 9 ]. +- `timezone` - Time zone of the specified datetime64 object. **Returned value** -- A calendar date and time of day, with sub-second precision. +- A calendar date and time of day, with sub-second precision. Type: [DateTime64](/docs/en/sql-reference/data-types/datetime64.md). @@ -526,33 +526,33 @@ SELECT toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul') AS value, toTypeN Converts `value` to the [Decimal](/docs/en/sql-reference/data-types/decimal.md) data type with precision of `S`. The `value` can be a number or a string. The `S` (scale) parameter specifies the number of decimal places. -- `toDecimal32(value, S)` -- `toDecimal64(value, S)` -- `toDecimal128(value, S)` -- `toDecimal256(value, S)` +- `toDecimal32(value, S)` +- `toDecimal64(value, S)` +- `toDecimal128(value, S)` +- `toDecimal256(value, S)` ## toDecimal(32\|64\|128\|256)OrNull Converts an input string to a [Nullable(Decimal(P,S))](/docs/en/sql-reference/data-types/decimal.md) data type value. This family of functions includes: -- `toDecimal32OrNull(expr, S)` — Results in `Nullable(Decimal32(S))` data type. -- `toDecimal64OrNull(expr, S)` — Results in `Nullable(Decimal64(S))` data type. -- `toDecimal128OrNull(expr, S)` — Results in `Nullable(Decimal128(S))` data type. -- `toDecimal256OrNull(expr, S)` — Results in `Nullable(Decimal256(S))` data type. +- `toDecimal32OrNull(expr, S)` — Results in `Nullable(Decimal32(S))` data type. +- `toDecimal64OrNull(expr, S)` — Results in `Nullable(Decimal64(S))` data type. +- `toDecimal128OrNull(expr, S)` — Results in `Nullable(Decimal128(S))` data type. +- `toDecimal256OrNull(expr, S)` — Results in `Nullable(Decimal256(S))` data type. These functions should be used instead of `toDecimal*()` functions, if you prefer to get a `NULL` value instead of an exception in the event of an input value parsing error. **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. -- `S` — Scale, the number of decimal places in the resulting value. +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. +- `S` — Scale, the number of decimal places in the resulting value. **Returned value** A value in the `Nullable(Decimal(P,S))` data type. The value contains: -- Number with `S` decimal places, if ClickHouse interprets the input string as a number. -- `NULL`, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. +- Number with `S` decimal places, if ClickHouse interprets the input string as a number. +- `NULL`, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. **Examples** @@ -589,24 +589,24 @@ Result: Converts an input string to a [Decimal(P,S)](/docs/en/sql-reference/data-types/decimal.md) data type value. This family of functions includes: -- `toDecimal32OrDefault(expr, S)` — Results in `Decimal32(S)` data type. -- `toDecimal64OrDefault(expr, S)` — Results in `Decimal64(S)` data type. -- `toDecimal128OrDefault(expr, S)` — Results in `Decimal128(S)` data type. -- `toDecimal256OrDefault(expr, S)` — Results in `Decimal256(S)` data type. +- `toDecimal32OrDefault(expr, S)` — Results in `Decimal32(S)` data type. +- `toDecimal64OrDefault(expr, S)` — Results in `Decimal64(S)` data type. +- `toDecimal128OrDefault(expr, S)` — Results in `Decimal128(S)` data type. +- `toDecimal256OrDefault(expr, S)` — Results in `Decimal256(S)` data type. These functions should be used instead of `toDecimal*()` functions, if you prefer to get a default value instead of an exception in the event of an input value parsing error. **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. -- `S` — Scale, the number of decimal places in the resulting value. +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. +- `S` — Scale, the number of decimal places in the resulting value. **Returned value** A value in the `Decimal(P,S)` data type. The value contains: -- Number with `S` decimal places, if ClickHouse interprets the input string as a number. -- Default `Decimal(P,S)` data type value, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. +- Number with `S` decimal places, if ClickHouse interprets the input string as a number. +- Default `Decimal(P,S)` data type value, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. **Examples** @@ -642,24 +642,24 @@ Result: Converts an input value to the [Decimal(P,S)](/docs/en/sql-reference/data-types/decimal.md) data type. This family of functions includes: -- `toDecimal32OrZero( expr, S)` — Results in `Decimal32(S)` data type. -- `toDecimal64OrZero( expr, S)` — Results in `Decimal64(S)` data type. -- `toDecimal128OrZero( expr, S)` — Results in `Decimal128(S)` data type. -- `toDecimal256OrZero( expr, S)` — Results in `Decimal256(S)` data type. +- `toDecimal32OrZero( expr, S)` — Results in `Decimal32(S)` data type. +- `toDecimal64OrZero( expr, S)` — Results in `Decimal64(S)` data type. +- `toDecimal128OrZero( expr, S)` — Results in `Decimal128(S)` data type. +- `toDecimal256OrZero( expr, S)` — Results in `Decimal256(S)` data type. These functions should be used instead of `toDecimal*()` functions, if you prefer to get a `0` value instead of an exception in the event of an input value parsing error. **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. -- `S` — Scale, the number of decimal places in the resulting value. +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions), returns a value in the [String](/docs/en/sql-reference/data-types/string.md) data type. ClickHouse expects the textual representation of the decimal number. For example, `'1.111'`. +- `S` — Scale, the number of decimal places in the resulting value. **Returned value** A value in the `Nullable(Decimal(P,S))` data type. The value contains: -- Number with `S` decimal places, if ClickHouse interprets the input string as a number. -- 0 with `S` decimal places, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. +- Number with `S` decimal places, if ClickHouse interprets the input string as a number. +- 0 with `S` decimal places, if ClickHouse can’t interpret the input string as a number or if the input number contains more than `S` decimal places. **Example** @@ -787,14 +787,14 @@ toDecimalString(number, scale) **Parameters** -- `number` — Value to be represented as String, [Int, UInt](/docs/en/sql-reference/data-types/int-uint.md), [Float](/docs/en/sql-reference/data-types/float.md), [Decimal](/docs/en/sql-reference/data-types/decimal.md), -- `scale` — Number of fractional digits, [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `number` — Value to be represented as String, [Int, UInt](/docs/en/sql-reference/data-types/int-uint.md), [Float](/docs/en/sql-reference/data-types/float.md), [Decimal](/docs/en/sql-reference/data-types/decimal.md), +- `scale` — Number of fractional digits, [UInt8](/docs/en/sql-reference/data-types/int-uint.md). * Maximum scale for [Decimal](/docs/en/sql-reference/data-types/decimal.md) and [Int, UInt](/docs/en/sql-reference/data-types/int-uint.md) types is 77 (it is the maximum possible number of significant digits for Decimal), * Maximum scale for [Float](/docs/en/sql-reference/data-types/float.md) is 60. **Returned value** -- Input value represented as [String](/docs/en/sql-reference/data-types/string.md) with given number of fractional digits (scale). +- Input value represented as [String](/docs/en/sql-reference/data-types/string.md) with given number of fractional digits (scale). The number is rounded up or down according to common arithmetics in case requested scale is smaller than original number's scale. **Example** @@ -849,11 +849,11 @@ reinterpretAsUUID(fixed_string) **Arguments** -- `fixed_string` — Big-endian byte string. [FixedString](/docs/en/sql-reference/data-types/fixedstring.md/#fixedstring). +- `fixed_string` — Big-endian byte string. [FixedString](/docs/en/sql-reference/data-types/fixedstring.md/#fixedstring). **Returned value** -- The UUID type value. [UUID](/docs/en/sql-reference/data-types/uuid.md/#uuid-data-type). +- The UUID type value. [UUID](/docs/en/sql-reference/data-types/uuid.md/#uuid-data-type). **Examples** @@ -905,12 +905,12 @@ reinterpret(x, type) **Arguments** -- `x` — Any type. -- `type` — Destination type. [String](/docs/en/sql-reference/data-types/string.md). +- `x` — Any type. +- `type` — Destination type. [String](/docs/en/sql-reference/data-types/string.md). **Returned value** -- Destination type value. +- Destination type value. **Examples** @@ -944,13 +944,13 @@ x::t **Arguments** -- `x` — A value to convert. May be of any type. -- `T` — The name of the target data type. [String](/docs/en/sql-reference/data-types/string.md). -- `t` — The target data type. +- `x` — A value to convert. May be of any type. +- `T` — The name of the target data type. [String](/docs/en/sql-reference/data-types/string.md). +- `t` — The target data type. **Returned value** -- Converted value. +- Converted value. :::note If the input value does not fit the bounds of the target type, the result overflows. For example, `CAST(-1, 'UInt8')` returns `255`. @@ -1032,7 +1032,7 @@ Result: **See also** -- [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) setting +- [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) setting ## accurateCast(x, T) @@ -1080,12 +1080,12 @@ accurateCastOrNull(x, T) **Parameters** -- `x` — Input value. -- `T` — The name of the returned data type. +- `x` — Input value. +- `T` — The name of the returned data type. **Returned value** -- The value, converted to the specified data type `T`. +- The value, converted to the specified data type `T`. **Example** @@ -1133,13 +1133,13 @@ accurateCastOrDefault(x, T) **Parameters** -- `x` — Input value. -- `T` — The name of the returned data type. -- `default_value` — Default value of returned data type. +- `x` — Input value. +- `T` — The name of the returned data type. +- `default_value` — Default value of returned data type. **Returned value** -- The value converted to the specified data type `T`. +- The value converted to the specified data type `T`. **Example** @@ -1196,11 +1196,11 @@ toIntervalYear(number) **Arguments** -- `number` — Duration of interval. Positive integer number. +- `number` — Duration of interval. Positive integer number. **Returned values** -- The value in `Interval` data type. +- The value in `Interval` data type. **Example** @@ -1238,9 +1238,9 @@ parseDateTime(str, format[, timezone]) **Arguments** -- `str` — the String to be parsed -- `format` — the format string -- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional. +- `str` — the String to be parsed +- `format` — the format string +- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional. **Returned value(s)** @@ -1287,9 +1287,9 @@ parseDateTimeInJodaSyntax(str, format[, timezone]) **Arguments** -- `str` — the String to be parsed -- `format` — the format string -- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional. +- `str` — the String to be parsed +- `format` — the format string +- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional. **Returned value(s)** @@ -1335,22 +1335,22 @@ parseDateTimeBestEffort(time_string [, time_zone]) **Arguments** -- `time_string` — String containing a date and time to convert. [String](/docs/en/sql-reference/data-types/string.md). -- `time_zone` — Time zone. The function parses `time_string` according to the time zone. [String](/docs/en/sql-reference/data-types/string.md). +- `time_string` — String containing a date and time to convert. [String](/docs/en/sql-reference/data-types/string.md). +- `time_zone` — Time zone. The function parses `time_string` according to the time zone. [String](/docs/en/sql-reference/data-types/string.md). **Supported non-standard formats** -- A string containing 9..10 digit [unix timestamp](https://en.wikipedia.org/wiki/Unix_time). -- A string with a date and a time component: `YYYYMMDDhhmmss`, `DD/MM/YYYY hh:mm:ss`, `DD-MM-YY hh:mm`, `YYYY-MM-DD hh:mm:ss`, etc. -- A string with a date, but no time component: `YYYY`, `YYYYMM`, `YYYY*MM`, `DD/MM/YYYY`, `DD-MM-YY` etc. -- A string with a day and time: `DD`, `DD hh`, `DD hh:mm`. In this case `YYYY-MM` are substituted as `2000-01`. -- A string that includes the date and time along with time zone offset information: `YYYY-MM-DD hh:mm:ss ±h:mm`, etc. For example, `2020-12-12 17:36:00 -5:00`. +- A string containing 9..10 digit [unix timestamp](https://en.wikipedia.org/wiki/Unix_time). +- A string with a date and a time component: `YYYYMMDDhhmmss`, `DD/MM/YYYY hh:mm:ss`, `DD-MM-YY hh:mm`, `YYYY-MM-DD hh:mm:ss`, etc. +- A string with a date, but no time component: `YYYY`, `YYYYMM`, `YYYY*MM`, `DD/MM/YYYY`, `DD-MM-YY` etc. +- A string with a day and time: `DD`, `DD hh`, `DD hh:mm`. In this case `YYYY-MM` are substituted as `2000-01`. +- A string that includes the date and time along with time zone offset information: `YYYY-MM-DD hh:mm:ss ±h:mm`, etc. For example, `2020-12-12 17:36:00 -5:00`. For all of the formats with separator the function parses months names expressed by their full name or by the first three letters of a month name. Examples: `24/DEC/18`, `24-Dec-18`, `01-September-2018`. **Returned value** -- `time_string` converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. +- `time_string` converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. **Examples** @@ -1430,10 +1430,10 @@ Result: **See Also** -- [RFC 1123](https://tools.ietf.org/html/rfc1123) -- [toDate](#todate) -- [toDateTime](#todatetime) -- [ISO 8601 announcement by @xkcd](https://xkcd.com/1179/) +- [RFC 1123](https://tools.ietf.org/html/rfc1123) +- [toDate](#todate) +- [toDateTime](#todatetime) +- [ISO 8601 announcement by @xkcd](https://xkcd.com/1179/) ## parseDateTimeBestEffortUS @@ -1469,13 +1469,13 @@ parseDateTime64BestEffort(time_string [, precision [, time_zone]]) **Parameters** -- `time_string` — String containing a date or date with time to convert. [String](/docs/en/sql-reference/data-types/string.md). -- `precision` — Required precision. `3` — for milliseconds, `6` — for microseconds. Default — `3`. Optional. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). -- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). +- `time_string` — String containing a date or date with time to convert. [String](/docs/en/sql-reference/data-types/string.md). +- `precision` — Required precision. `3` — for milliseconds, `6` — for microseconds. Default — `3`. Optional. [UInt8](/docs/en/sql-reference/data-types/int-uint.md). +- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). **Returned value** -- `time_string` converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. +- `time_string` converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. **Examples** @@ -1537,11 +1537,11 @@ toLowCardinality(expr) **Arguments** -- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) resulting in one of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). +- `expr` — [Expression](/docs/en/sql-reference/syntax.md/#syntax-expressions) resulting in one of the [supported data types](/docs/en/sql-reference/data-types/index.md/#data_types). **Returned values** -- Result of `expr`. +- Result of `expr`. Type: `LowCardinality(expr_result_type)` @@ -1583,11 +1583,11 @@ toUnixTimestamp64Nano(value) **Arguments** -- `value` — DateTime64 value with any precision. +- `value` — DateTime64 value with any precision. **Returned value** -- `value` converted to the `Int64` data type. +- `value` converted to the `Int64` data type. **Examples** @@ -1639,12 +1639,12 @@ fromUnixTimestamp64Nano(value [, timezone]) **Arguments** -- `value` — `Int64` value with any precision. -- `timezone` — `String` (optional) timezone name of the result. +- `value` — `Int64` value with any precision. +- `timezone` — `String` (optional) timezone name of the result. **Returned value** -- `value` converted to the `DateTime64` data type. +- `value` converted to the `DateTime64` data type. **Example** @@ -1675,12 +1675,12 @@ formatRow(format, x, y, ...) **Arguments** -- `format` — Text format. For example, [CSV](/docs/en/interfaces/formats.md/#csv), [TSV](/docs/en/interfaces/formats.md/#tabseparated). -- `x`,`y`, ... — Expressions. +- `format` — Text format. For example, [CSV](/docs/en/interfaces/formats.md/#csv), [TSV](/docs/en/interfaces/formats.md/#tabseparated). +- `x`,`y`, ... — Expressions. **Returned value** -- A formatted string. (for text formats it's usually terminated with the new line character). +- A formatted string. (for text formats it's usually terminated with the new line character). **Example** @@ -1746,12 +1746,12 @@ formatRowNoNewline(format, x, y, ...) **Arguments** -- `format` — Text format. For example, [CSV](/docs/en/interfaces/formats.md/#csv), [TSV](/docs/en/interfaces/formats.md/#tabseparated). -- `x`,`y`, ... — Expressions. +- `format` — Text format. For example, [CSV](/docs/en/interfaces/formats.md/#csv), [TSV](/docs/en/interfaces/formats.md/#tabseparated). +- `x`,`y`, ... — Expressions. **Returned value** -- A formatted string. +- A formatted string. **Example** @@ -1784,8 +1784,8 @@ snowflakeToDateTime(value [, time_zone]) **Parameters** -- `value` — Snowflake ID. [Int64](/docs/en/sql-reference/data-types/int-uint.md). -- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). +- `value` — Snowflake ID. [Int64](/docs/en/sql-reference/data-types/int-uint.md). +- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). **Returned value** @@ -1820,8 +1820,8 @@ snowflakeToDateTime64(value [, time_zone]) **Parameters** -- `value` — Snowflake ID. [Int64](/docs/en/sql-reference/data-types/int-uint.md). -- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). +- `value` — Snowflake ID. [Int64](/docs/en/sql-reference/data-types/int-uint.md). +- `time_zone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). The function parses `time_string` according to the timezone. Optional. [String](/docs/en/sql-reference/data-types/string.md). **Returned value** @@ -1856,11 +1856,11 @@ dateTimeToSnowflake(value) **Parameters** -- `value` — Date and time. [DateTime](/docs/en/sql-reference/data-types/datetime.md). +- `value` — Date and time. [DateTime](/docs/en/sql-reference/data-types/datetime.md). **Returned value** -- Input value converted to the [Int64](/docs/en/sql-reference/data-types/int-uint.md) data type as the first Snowflake ID at that time. +- Input value converted to the [Int64](/docs/en/sql-reference/data-types/int-uint.md) data type as the first Snowflake ID at that time. **Example** @@ -1890,11 +1890,11 @@ dateTime64ToSnowflake(value) **Parameters** -- `value` — Date and time. [DateTime64](/docs/en/sql-reference/data-types/datetime64.md). +- `value` — Date and time. [DateTime64](/docs/en/sql-reference/data-types/datetime64.md). **Returned value** -- Input value converted to the [Int64](/docs/en/sql-reference/data-types/int-uint.md) data type as the first Snowflake ID at that time. +- Input value converted to the [Int64](/docs/en/sql-reference/data-types/int-uint.md) data type as the first Snowflake ID at that time. **Example** diff --git a/docs/en/sql-reference/functions/ulid-functions.md b/docs/en/sql-reference/functions/ulid-functions.md index 3d32a851df2..469105c9c74 100644 --- a/docs/en/sql-reference/functions/ulid-functions.md +++ b/docs/en/sql-reference/functions/ulid-functions.md @@ -18,7 +18,7 @@ generateULID([x]) **Arguments** -- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. +- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. **Returned value** @@ -60,12 +60,12 @@ ULIDStringToDateTime(ulid[, timezone]) **Arguments** -- `ulid` — Input ULID. [String](/docs/en/sql-reference/data-types/string.md) or [FixedString(26)](/docs/en/sql-reference/data-types/fixedstring.md). -- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). +- `ulid` — Input ULID. [String](/docs/en/sql-reference/data-types/string.md) or [FixedString(26)](/docs/en/sql-reference/data-types/fixedstring.md). +- `timezone` — [Timezone name](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) for the returned value (optional). [String](../../sql-reference/data-types/string.md). **Returned value** -- Timestamp with milliseconds precision. +- Timestamp with milliseconds precision. Type: [DateTime64(3)](/docs/en/sql-reference/data-types/datetime64.md). @@ -83,4 +83,4 @@ SELECT ULIDStringToDateTime('01GNB2S2FGN2P93QPXDNB4EN2R') ## See Also -- [UUID](../../sql-reference/functions/uuid-functions.md) +- [UUID](../../sql-reference/functions/uuid-functions.md) diff --git a/docs/en/sql-reference/functions/uniqtheta-functions.md b/docs/en/sql-reference/functions/uniqtheta-functions.md index b2d3712abfc..4fa2e47ce05 100644 --- a/docs/en/sql-reference/functions/uniqtheta-functions.md +++ b/docs/en/sql-reference/functions/uniqtheta-functions.md @@ -21,7 +21,7 @@ uniqThetaUnion(uniqThetaSketch,uniqThetaSketch) **Arguments** -- `uniqThetaSketch` – uniqThetaSketch object. +- `uniqThetaSketch` – uniqThetaSketch object. **Example** @@ -47,7 +47,7 @@ uniqThetaIntersect(uniqThetaSketch,uniqThetaSketch) **Arguments** -- `uniqThetaSketch` – uniqThetaSketch object. +- `uniqThetaSketch` – uniqThetaSketch object. **Example** @@ -73,7 +73,7 @@ uniqThetaNot(uniqThetaSketch,uniqThetaSketch) **Arguments** -- `uniqThetaSketch` – uniqThetaSketch object. +- `uniqThetaSketch` – uniqThetaSketch object. **Example** @@ -91,4 +91,4 @@ from **See Also** -- [uniqThetaSketch](../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) +- [uniqThetaSketch](../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/en/sql-reference/functions/url-functions.md b/docs/en/sql-reference/functions/url-functions.md index b515f6ad518..f675563aec4 100644 --- a/docs/en/sql-reference/functions/url-functions.md +++ b/docs/en/sql-reference/functions/url-functions.md @@ -28,7 +28,7 @@ domain(url) **Arguments** -- `url` — URL. Type: [String](../../sql-reference/data-types/string.md). +- `url` — URL. Type: [String](../../sql-reference/data-types/string.md). The URL can be specified with or without a scheme. Examples: @@ -48,8 +48,8 @@ clickhouse.com **Returned values** -- Host name. If ClickHouse can parse the input string as a URL. -- Empty string. If ClickHouse can’t parse the input string as a URL. +- Host name. If ClickHouse can parse the input string as a URL. +- Empty string. If ClickHouse can’t parse the input string as a URL. Type: `String`. @@ -79,7 +79,7 @@ topLevelDomain(url) **Arguments** -- `url` — URL. Type: [String](../../sql-reference/data-types/string.md). +- `url` — URL. Type: [String](../../sql-reference/data-types/string.md). The URL can be specified with or without a scheme. Examples: @@ -91,8 +91,8 @@ https://clickhouse.com/time/ **Returned values** -- Domain name. If ClickHouse can parse the input string as a URL. -- Empty string. If ClickHouse cannot parse the input string as a URL. +- Domain name. If ClickHouse can parse the input string as a URL. +- Empty string. If ClickHouse cannot parse the input string as a URL. Type: `String`. @@ -118,9 +118,9 @@ Returns the part of the domain that includes top-level subdomains up to the “f For example: -- `cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/') = 'clickhouse.com.tr'`. -- `cutToFirstSignificantSubdomain('www.tr') = 'tr'`. -- `cutToFirstSignificantSubdomain('tr') = ''`. +- `cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/') = 'clickhouse.com.tr'`. +- `cutToFirstSignificantSubdomain('www.tr') = 'tr'`. +- `cutToFirstSignificantSubdomain('tr') = ''`. ### cutToFirstSignificantSubdomainWithWWW @@ -128,9 +128,9 @@ Returns the part of the domain that includes top-level subdomains up to the “f For example: -- `cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/') = 'clickhouse.com.tr'`. -- `cutToFirstSignificantSubdomain('www.tr') = 'www.tr'`. -- `cutToFirstSignificantSubdomain('tr') = ''`. +- `cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/') = 'clickhouse.com.tr'`. +- `cutToFirstSignificantSubdomain('www.tr') = 'www.tr'`. +- `cutToFirstSignificantSubdomain('tr') = ''`. ### cutToFirstSignificantSubdomainCustom @@ -157,12 +157,12 @@ cutToFirstSignificantSubdomain(URL, TLD) **Parameters** -- `URL` — URL. [String](../../sql-reference/data-types/string.md). -- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). +- `URL` — URL. [String](../../sql-reference/data-types/string.md). +- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). **Returned value** -- Part of the domain that includes top-level subdomains up to the first significant subdomain. +- Part of the domain that includes top-level subdomains up to the first significant subdomain. Type: [String](../../sql-reference/data-types/string.md). @@ -184,7 +184,7 @@ Result: **See Also** -- [firstSignificantSubdomain](#firstsignificantsubdomain). +- [firstSignificantSubdomain](#firstsignificantsubdomain). ### cutToFirstSignificantSubdomainCustomWithWWW @@ -211,12 +211,12 @@ cutToFirstSignificantSubdomainCustomWithWWW(URL, TLD) **Parameters** -- `URL` — URL. [String](../../sql-reference/data-types/string.md). -- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). +- `URL` — URL. [String](../../sql-reference/data-types/string.md). +- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). **Returned value** -- Part of the domain that includes top-level subdomains up to the first significant subdomain without stripping `www`. +- Part of the domain that includes top-level subdomains up to the first significant subdomain without stripping `www`. Type: [String](../../sql-reference/data-types/string.md). @@ -238,7 +238,7 @@ Result: **See Also** -- [firstSignificantSubdomain](#firstsignificantsubdomain). +- [firstSignificantSubdomain](#firstsignificantsubdomain). ### firstSignificantSubdomainCustom @@ -265,12 +265,12 @@ firstSignificantSubdomainCustom(URL, TLD) **Parameters** -- `URL` — URL. [String](../../sql-reference/data-types/string.md). -- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). +- `URL` — URL. [String](../../sql-reference/data-types/string.md). +- `TLD` — Custom TLD list name. [String](../../sql-reference/data-types/string.md). **Returned value** -- First significant subdomain. +- First significant subdomain. Type: [String](../../sql-reference/data-types/string.md). @@ -292,7 +292,7 @@ Result: **See Also** -- [firstSignificantSubdomain](#firstsignificantsubdomain). +- [firstSignificantSubdomain](#firstsignificantsubdomain). ### port(URL\[, default_port = 0\]) @@ -418,11 +418,11 @@ netloc(URL) **Arguments** -- `url` — URL. [String](../../sql-reference/data-types/string.md). +- `url` — URL. [String](../../sql-reference/data-types/string.md). **Returned value** -- `username:password@host:port`. +- `username:password@host:port`. Type: `String`. @@ -474,12 +474,12 @@ cutURLParameter(URL, name) **Arguments** -- `url` — URL. [String](../../sql-reference/data-types/string.md). -- `name` — name of URL parameter. [String](../../sql-reference/data-types/string.md) or [Array](../../sql-reference/data-types/array.md) of Strings. +- `url` — URL. [String](../../sql-reference/data-types/string.md). +- `name` — name of URL parameter. [String](../../sql-reference/data-types/string.md) or [Array](../../sql-reference/data-types/array.md) of Strings. **Returned value** -- URL with `name` URL parameter removed. +- URL with `name` URL parameter removed. Type: `String`. diff --git a/docs/en/sql-reference/functions/uuid-functions.md b/docs/en/sql-reference/functions/uuid-functions.md index 474e3248d1f..6599d63ec3c 100644 --- a/docs/en/sql-reference/functions/uuid-functions.md +++ b/docs/en/sql-reference/functions/uuid-functions.md @@ -20,7 +20,7 @@ generateUUIDv4([x]) **Arguments** -- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. +- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. **Returned value** @@ -69,11 +69,11 @@ The function also works for [arrays](array-functions.md#function-empty) or [stri **Arguments** -- `x` — Input UUID. [UUID](../data-types/uuid.md). +- `x` — Input UUID. [UUID](../data-types/uuid.md). **Returned value** -- Returns `1` for an empty UUID or `0` for a non-empty UUID. +- Returns `1` for an empty UUID or `0` for a non-empty UUID. Type: [UInt8](../data-types/int-uint.md). @@ -111,11 +111,11 @@ The function also works for [arrays](array-functions.md#function-notempty) or [s **Arguments** -- `x` — Input UUID. [UUID](../data-types/uuid.md). +- `x` — Input UUID. [UUID](../data-types/uuid.md). **Returned value** -- Returns `1` for a non-empty UUID or `0` for an empty UUID. +- Returns `1` for a non-empty UUID or `0` for an empty UUID. Type: [UInt8](../data-types/int-uint.md). @@ -165,8 +165,8 @@ SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid **Arguments** -- `string` — String of 36 characters or FixedString(36). [String](../../sql-reference/syntax.md#string). -- `default` — UUID to be used as the default if the first argument cannot be converted to a UUID type. [UUID](/docs/en/sql-reference/data-types/uuid.md). +- `string` — String of 36 characters or FixedString(36). [String](../../sql-reference/syntax.md#string). +- `default` — UUID to be used as the default if the first argument cannot be converted to a UUID type. [UUID](/docs/en/sql-reference/data-types/uuid.md). **Returned value** @@ -265,8 +265,8 @@ UUIDStringToNum(string[, variant = 1]) **Arguments** -- `string` — String of 36 characters or FixedString(36). [String](../../sql-reference/syntax.md#syntax-string-literal). -- `variant` — Integer, representing a variant as specified by [RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.1). 1 = `Big-endian` (default), 2 = `Microsoft`. +- `string` — String of 36 characters or FixedString(36). [String](../../sql-reference/syntax.md#syntax-string-literal). +- `variant` — Integer, representing a variant as specified by [RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.1). 1 = `Big-endian` (default), 2 = `Microsoft`. **Returned value** @@ -310,8 +310,8 @@ UUIDNumToString(binary[, variant = 1]) **Arguments** -- `binary` — [FixedString(16)](../../sql-reference/data-types/fixedstring.md) as a binary representation of a UUID. -- `variant` — Integer, representing a variant as specified by [RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.1). 1 = `Big-endian` (default), 2 = `Microsoft`. +- `binary` — [FixedString(16)](../../sql-reference/data-types/fixedstring.md) as a binary representation of a UUID. +- `variant` — Integer, representing a variant as specified by [RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.1). 1 = `Big-endian` (default), 2 = `Microsoft`. **Returned value** @@ -355,10 +355,10 @@ serverUUID() **Returned value** -- The UUID of the server. +- The UUID of the server. Type: [UUID](../data-types/uuid.md). ## See Also -- [dictGetUUID](../../sql-reference/functions/ext-dict-functions.md#ext_dict_functions-other) +- [dictGetUUID](../../sql-reference/functions/ext-dict-functions.md#ext_dict_functions-other) diff --git a/docs/en/sql-reference/functions/ym-dict-functions.md b/docs/en/sql-reference/functions/ym-dict-functions.md index cf25b67a15a..918d61aad82 100644 --- a/docs/en/sql-reference/functions/ym-dict-functions.md +++ b/docs/en/sql-reference/functions/ym-dict-functions.md @@ -118,13 +118,13 @@ regionToTopContinent(id[, geobase]) **Arguments** -- `id` — Region ID from the geobase. [UInt32](../../sql-reference/data-types/int-uint.md). -- `geobase` — Dictionary key. See [Multiple Geobases](#multiple-geobases). [String](../../sql-reference/data-types/string.md). Optional. +- `id` — Region ID from the geobase. [UInt32](../../sql-reference/data-types/int-uint.md). +- `geobase` — Dictionary key. See [Multiple Geobases](#multiple-geobases). [String](../../sql-reference/data-types/string.md). Optional. **Returned value** -- Identifier of the top level continent (the latter when you climb the hierarchy of regions). -- 0, if there is none. +- Identifier of the top level continent (the latter when you climb the hierarchy of regions). +- 0, if there is none. Type: `UInt32`. diff --git a/docs/en/sql-reference/operators/in.md b/docs/en/sql-reference/operators/in.md index 0599a50c0a4..8a8c86624d2 100644 --- a/docs/en/sql-reference/operators/in.md +++ b/docs/en/sql-reference/operators/in.md @@ -158,7 +158,7 @@ Now let’s examine a query with IN: SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34) ``` -- Calculation of the intersection of audiences of two sites. +- Calculation of the intersection of audiences of two sites. This query will be sent to all remote servers as diff --git a/docs/en/sql-reference/operators/index.md b/docs/en/sql-reference/operators/index.md index ade2d601f80..c8ed2627e2b 100644 --- a/docs/en/sql-reference/operators/index.md +++ b/docs/en/sql-reference/operators/index.md @@ -159,12 +159,12 @@ Extract parts from a given date. For example, you can retrieve a month from a gi The `part` parameter specifies which part of the date to retrieve. The following values are available: -- `DAY` — The day of the month. Possible values: 1–31. -- `MONTH` — The number of a month. Possible values: 1–12. -- `YEAR` — The year. -- `SECOND` — The second. Possible values: 0–59. -- `MINUTE` — The minute. Possible values: 0–59. -- `HOUR` — The hour. Possible values: 0–23. +- `DAY` — The day of the month. Possible values: 1–31. +- `MONTH` — The number of a month. Possible values: 1–12. +- `YEAR` — The year. +- `SECOND` — The second. Possible values: 0–59. +- `MINUTE` — The minute. Possible values: 0–59. +- `HOUR` — The hour. Possible values: 0–23. The `part` parameter is case-insensitive. @@ -285,8 +285,8 @@ SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 6 **See Also** -- [Interval](../../sql-reference/data-types/special-data-types/interval.md) data type -- [toInterval](../../sql-reference/functions/type-conversion-functions.md#function-tointerval) type conversion functions +- [Interval](../../sql-reference/data-types/special-data-types/interval.md) data type +- [toInterval](../../sql-reference/functions/type-conversion-functions.md#function-tointerval) type conversion functions ## Logical AND Operator @@ -355,10 +355,10 @@ ClickHouse supports the `IS NULL` and `IS NOT NULL` operators. ### IS NULL -- For [Nullable](../../sql-reference/data-types/nullable.md) type values, the `IS NULL` operator returns: - - `1`, if the value is `NULL`. - - `0` otherwise. -- For other values, the `IS NULL` operator always returns `0`. +- For [Nullable](../../sql-reference/data-types/nullable.md) type values, the `IS NULL` operator returns: + - `1`, if the value is `NULL`. + - `0` otherwise. +- For other values, the `IS NULL` operator always returns `0`. Can be optimized by enabling the [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) setting. With `optimize_functions_to_subcolumns = 1` the function reads only [null](../../sql-reference/data-types/nullable.md#finding-null) subcolumn instead of reading and processing the whole column data. The query `SELECT n IS NULL FROM table` transforms to `SELECT n.null FROM TABLE`. @@ -376,10 +376,10 @@ SELECT x+100 FROM t_null WHERE y IS NULL ### IS NOT NULL -- For [Nullable](../../sql-reference/data-types/nullable.md) type values, the `IS NOT NULL` operator returns: - - `0`, if the value is `NULL`. - - `1` otherwise. -- For other values, the `IS NOT NULL` operator always returns `1`. +- For [Nullable](../../sql-reference/data-types/nullable.md) type values, the `IS NOT NULL` operator returns: + - `0`, if the value is `NULL`. + - `1` otherwise. +- For other values, the `IS NOT NULL` operator always returns `1`. diff --git a/docs/en/sql-reference/statements/alter/column.md b/docs/en/sql-reference/statements/alter/column.md index 921785102a8..ff55f700023 100644 --- a/docs/en/sql-reference/statements/alter/column.md +++ b/docs/en/sql-reference/statements/alter/column.md @@ -18,14 +18,14 @@ Each action is an operation on a column. The following actions are supported: -- [ADD COLUMN](#add-column) — Adds a new column to the table. -- [DROP COLUMN](#drop-column) — Deletes the column. -- [RENAME COLUMN](#rename-column) — Renames an existing column. -- [CLEAR COLUMN](#clear-column) — Resets column values. -- [COMMENT COLUMN](#comment-column) — Adds a text comment to the column. -- [MODIFY COLUMN](#modify-column) — Changes column’s type, default expression and TTL. -- [MODIFY COLUMN REMOVE](#modify-column-remove) — Removes one of the column properties. -- [MATERIALIZE COLUMN](#materialize-column) — Materializes the column in the parts where the column is missing. +- [ADD COLUMN](#add-column) — Adds a new column to the table. +- [DROP COLUMN](#drop-column) — Deletes the column. +- [RENAME COLUMN](#rename-column) — Renames an existing column. +- [CLEAR COLUMN](#clear-column) — Resets column values. +- [COMMENT COLUMN](#comment-column) — Adds a text comment to the column. +- [MODIFY COLUMN](#modify-column) — Changes column’s type, default expression and TTL. +- [MODIFY COLUMN REMOVE](#modify-column-remove) — Removes one of the column properties. +- [MATERIALIZE COLUMN](#materialize-column) — Materializes the column in the parts where the column is missing. These actions are described in detail below. @@ -144,13 +144,13 @@ ALTER COLUMN [IF EXISTS] name TYPE [type] [default_expr] [codec] [TTL] [AFTER na This query changes the `name` column properties: -- Type +- Type -- Default expression +- Default expression -- Compression Codec +- Compression Codec -- TTL +- TTL For examples of columns compression CODECS modifying, see [Column Compression Codecs](../create/table.md/#codecs). diff --git a/docs/en/sql-reference/statements/alter/delete.md b/docs/en/sql-reference/statements/alter/delete.md index 21ae6a1e5d1..b6f45b67d52 100644 --- a/docs/en/sql-reference/statements/alter/delete.md +++ b/docs/en/sql-reference/statements/alter/delete.md @@ -25,9 +25,9 @@ The synchronicity of the query processing is defined by the [mutations_sync](/do **See also** -- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) -- [Synchronicity of ALTER Queries](/docs/en/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) -- [mutations_sync](/docs/en/operations/settings/settings.md/#mutations_sync) setting +- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) +- [Synchronicity of ALTER Queries](/docs/en/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [mutations_sync](/docs/en/operations/settings/settings.md/#mutations_sync) setting ## Related content diff --git a/docs/en/sql-reference/statements/alter/index.md b/docs/en/sql-reference/statements/alter/index.md index cbec9572bb1..7a687a067aa 100644 --- a/docs/en/sql-reference/statements/alter/index.md +++ b/docs/en/sql-reference/statements/alter/index.md @@ -8,14 +8,14 @@ sidebar_label: ALTER Most `ALTER TABLE` queries modify table settings or data: -- [COLUMN](/docs/en/sql-reference/statements/alter/column.md) -- [PARTITION](/docs/en/sql-reference/statements/alter/partition.md) -- [DELETE](/docs/en/sql-reference/statements/alter/delete.md) -- [UPDATE](/docs/en/sql-reference/statements/alter/update.md) -- [ORDER BY](/docs/en/sql-reference/statements/alter/order-by.md) -- [INDEX](/docs/en/sql-reference/statements/alter/skipping-index.md) -- [CONSTRAINT](/docs/en/sql-reference/statements/alter/constraint.md) -- [TTL](/docs/en/sql-reference/statements/alter/ttl.md) +- [COLUMN](/docs/en/sql-reference/statements/alter/column.md) +- [PARTITION](/docs/en/sql-reference/statements/alter/partition.md) +- [DELETE](/docs/en/sql-reference/statements/alter/delete.md) +- [UPDATE](/docs/en/sql-reference/statements/alter/update.md) +- [ORDER BY](/docs/en/sql-reference/statements/alter/order-by.md) +- [INDEX](/docs/en/sql-reference/statements/alter/skipping-index.md) +- [CONSTRAINT](/docs/en/sql-reference/statements/alter/constraint.md) +- [TTL](/docs/en/sql-reference/statements/alter/ttl.md) :::note Most `ALTER TABLE` queries are supported only for [\*MergeTree](/docs/en/engines/table-engines/mergetree-family/index.md) tables, as well as [Merge](/docs/en/engines/table-engines/special/merge.md) and [Distributed](/docs/en/engines/table-engines/special/distributed.md). @@ -23,16 +23,16 @@ Most `ALTER TABLE` queries are supported only for [\*MergeTree](/docs/en/engines These `ALTER` statements manipulate views: -- [ALTER TABLE ... MODIFY QUERY](/docs/en/sql-reference/statements/alter/view.md) — Modifies a [Materialized view](/docs/en/sql-reference/statements/create/view.md/#materialized) structure. -- [ALTER LIVE VIEW](/docs/en/sql-reference/statements/alter/view.md/#alter-live-view) — Refreshes a [Live view](/docs/en/sql-reference/statements/create/view.md/#live-view). +- [ALTER TABLE ... MODIFY QUERY](/docs/en/sql-reference/statements/alter/view.md) — Modifies a [Materialized view](/docs/en/sql-reference/statements/create/view.md/#materialized) structure. +- [ALTER LIVE VIEW](/docs/en/sql-reference/statements/alter/view.md/#alter-live-view) — Refreshes a [Live view](/docs/en/sql-reference/statements/create/view.md/#live-view). These `ALTER` statements modify entities related to role-based access control: -- [USER](/docs/en/sql-reference/statements/alter/user.md) -- [ROLE](/docs/en/sql-reference/statements/alter/role.md) -- [QUOTA](/docs/en/sql-reference/statements/alter/quota.md) -- [ROW POLICY](/docs/en/sql-reference/statements/alter/row-policy.md) -- [SETTINGS PROFILE](/docs/en/sql-reference/statements/alter/settings-profile.md) +- [USER](/docs/en/sql-reference/statements/alter/user.md) +- [ROLE](/docs/en/sql-reference/statements/alter/role.md) +- [QUOTA](/docs/en/sql-reference/statements/alter/quota.md) +- [ROW POLICY](/docs/en/sql-reference/statements/alter/row-policy.md) +- [SETTINGS PROFILE](/docs/en/sql-reference/statements/alter/settings-profile.md) [ALTER TABLE ... MODIFY COMMENT](/docs/en/sql-reference/statements/alter/comment.md) statement adds, modifies, or removes comments to the table, regardless if it was set before or not. diff --git a/docs/en/sql-reference/statements/alter/partition.md b/docs/en/sql-reference/statements/alter/partition.md index aad52efb39d..2fb20e4e462 100644 --- a/docs/en/sql-reference/statements/alter/partition.md +++ b/docs/en/sql-reference/statements/alter/partition.md @@ -7,20 +7,20 @@ title: "Manipulating Partitions and Parts" The following operations with [partitions](/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key.md) are available: -- [DETACH PARTITION\|PART](#detach-partitionpart) — Moves a partition or part to the `detached` directory and forget it. -- [DROP PARTITION\|PART](#drop-partitionpart) — Deletes a partition or part. -- [ATTACH PARTITION\|PART](#attach-partitionpart) — Adds a partition or part from the `detached` directory to the table. -- [ATTACH PARTITION FROM](#attach-partition-from) — Copies the data partition from one table to another and adds. -- [REPLACE PARTITION](#replace-partition) — Copies the data partition from one table to another and replaces. -- [MOVE PARTITION TO TABLE](#move-partition-to-table) — Moves the data partition from one table to another. -- [CLEAR COLUMN IN PARTITION](#clear-column-in-partition) — Resets the value of a specified column in a partition. -- [CLEAR INDEX IN PARTITION](#clear-index-in-partition) — Resets the specified secondary index in a partition. -- [FREEZE PARTITION](#freeze-partition) — Creates a backup of a partition. -- [UNFREEZE PARTITION](#unfreeze-partition) — Removes a backup of a partition. -- [FETCH PARTITION\|PART](#fetch-partitionpart) — Downloads a part or partition from another server. -- [MOVE PARTITION\|PART](#move-partitionpart) — Move partition/data part to another disk or volume. -- [UPDATE IN PARTITION](#update-in-partition) — Update data inside the partition by condition. -- [DELETE IN PARTITION](#delete-in-partition) — Delete data inside the partition by condition. +- [DETACH PARTITION\|PART](#detach-partitionpart) — Moves a partition or part to the `detached` directory and forget it. +- [DROP PARTITION\|PART](#drop-partitionpart) — Deletes a partition or part. +- [ATTACH PARTITION\|PART](#attach-partitionpart) — Adds a partition or part from the `detached` directory to the table. +- [ATTACH PARTITION FROM](#attach-partition-from) — Copies the data partition from one table to another and adds. +- [REPLACE PARTITION](#replace-partition) — Copies the data partition from one table to another and replaces. +- [MOVE PARTITION TO TABLE](#move-partition-to-table) — Moves the data partition from one table to another. +- [CLEAR COLUMN IN PARTITION](#clear-column-in-partition) — Resets the value of a specified column in a partition. +- [CLEAR INDEX IN PARTITION](#clear-index-in-partition) — Resets the specified secondary index in a partition. +- [FREEZE PARTITION](#freeze-partition) — Creates a backup of a partition. +- [UNFREEZE PARTITION](#unfreeze-partition) — Removes a backup of a partition. +- [FETCH PARTITION\|PART](#fetch-partitionpart) — Downloads a part or partition from another server. +- [MOVE PARTITION\|PART](#move-partitionpart) — Move partition/data part to another disk or volume. +- [UPDATE IN PARTITION](#update-in-partition) — Update data inside the partition by condition. +- [DELETE IN PARTITION](#delete-in-partition) — Delete data inside the partition by condition. @@ -107,9 +107,9 @@ Note that data will be deleted neither from `table1` nor from `table2`. For the query to run successfully, the following conditions must be met: -- Both tables must have the same structure. -- Both tables must have the same partition key, the same order by key and the same primary key. -- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). +- Both tables must have the same structure. +- Both tables must have the same partition key, the same order by key and the same primary key. +- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). ## REPLACE PARTITION @@ -121,9 +121,9 @@ This query copies the data partition from the `table1` to `table2` and replaces For the query to run successfully, the following conditions must be met: -- Both tables must have the same structure. -- Both tables must have the same partition key, the same order by key and the same primary key. -- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). +- Both tables must have the same structure. +- Both tables must have the same partition key, the same order by key and the same primary key. +- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). ## MOVE PARTITION TO TABLE @@ -135,10 +135,10 @@ This query moves the data partition from the `table_source` to `table_dest` with For the query to run successfully, the following conditions must be met: -- Both tables must have the same structure. -- Both tables must have the same partition key, the same order by key and the same primary key. -- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). -- Both tables must be the same engine family (replicated or non-replicated). +- Both tables must have the same structure. +- Both tables must have the same partition key, the same order by key and the same primary key. +- Both tables must have the same storage policy (a disk where the partition is stored should be available for both tables). +- Both tables must be the same engine family (replicated or non-replicated). ## CLEAR COLUMN IN PARTITION @@ -170,9 +170,9 @@ Note that for old-styled tables you can specify the prefix of the partition name At the time of execution, for a data snapshot, the query creates hardlinks to a table data. Hardlinks are placed in the directory `/var/lib/clickhouse/shadow/N/...`, where: -- `/var/lib/clickhouse/` is the working ClickHouse directory specified in the config. -- `N` is the incremental number of the backup. -- if the `WITH NAME` parameter is specified, then the value of the `'backup_name'` parameter is used instead of the incremental number. +- `/var/lib/clickhouse/` is the working ClickHouse directory specified in the config. +- `N` is the incremental number of the backup. +- if the `WITH NAME` parameter is specified, then the value of the `'backup_name'` parameter is used instead of the incremental number. :::note If you use [a set of disks for data storage in a table](/docs/en/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-multiple-volumes), the `shadow/N` directory appears on every disk, storing data parts that matched by the `PARTITION` expression. @@ -240,8 +240,8 @@ ALTER TABLE users ATTACH PART 201901_2_2_0; Note that: -- The `ALTER ... FETCH PARTITION|PART` query isn’t replicated. It places the part or partition to the `detached` directory only on the local server. -- The `ALTER TABLE ... ATTACH` query is replicated. It adds the data to all replicas. The data is added to one of the replicas from the `detached` directory, and to the others - from neighboring replicas. +- The `ALTER ... FETCH PARTITION|PART` query isn’t replicated. It places the part or partition to the `detached` directory only on the local server. +- The `ALTER TABLE ... ATTACH` query is replicated. It adds the data to all replicas. The data is added to one of the replicas from the `detached` directory, and to the others - from neighboring replicas. Before downloading, the system checks if the partition exists and the table structure matches. The most appropriate replica is selected automatically from the healthy replicas. @@ -257,9 +257,9 @@ ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr T The `ALTER TABLE t MOVE` query: -- Not replicated, because different replicas can have different storage policies. -- Returns an error if the specified disk or volume is not configured. Query also returns an error if conditions of data moving, that specified in the storage policy, can’t be applied. -- Can return an error in the case, when data to be moved is already moved by a background process, concurrent `ALTER TABLE t MOVE` query or as a result of background data merging. A user shouldn’t perform any additional actions in this case. +- Not replicated, because different replicas can have different storage policies. +- Returns an error if the specified disk or volume is not configured. Query also returns an error if conditions of data moving, that specified in the storage policy, can’t be applied. +- Can return an error in the case, when data to be moved is already moved by a background process, concurrent `ALTER TABLE t MOVE` query or as a result of background data merging. A user shouldn’t perform any additional actions in this case. Example: @@ -286,7 +286,7 @@ ALTER TABLE mt UPDATE x = x + 1 IN PARTITION 2 WHERE p = 2; ### See Also -- [UPDATE](/docs/en/sql-reference/statements/alter/update.md/#alter-table-update-statements) +- [UPDATE](/docs/en/sql-reference/statements/alter/update.md/#alter-table-update-statements) ## DELETE IN PARTITION @@ -306,16 +306,16 @@ ALTER TABLE mt DELETE IN PARTITION 2 WHERE p = 2; ### See Also -- [DELETE](/docs/en/sql-reference/statements/alter/delete.md/#alter-mutations) +- [DELETE](/docs/en/sql-reference/statements/alter/delete.md/#alter-mutations) ## How to Set Partition Expression You can specify the partition expression in `ALTER ... PARTITION` queries in different ways: -- As a value from the `partition` column of the `system.parts` table. For example, `ALTER TABLE visits DETACH PARTITION 201901`. -- As a tuple of expressions or constants that matches (in types) the table partitioning keys tuple. In the case of a single element partitioning key, the expression should be wrapped in the `tuple (...)` function. For example, `ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25')))`. -- Using the partition ID. Partition ID is a string identifier of the partition (human-readable, if possible) that is used as the names of partitions in the file system and in ZooKeeper. The partition ID must be specified in the `PARTITION ID` clause, in a single quotes. For example, `ALTER TABLE visits DETACH PARTITION ID '201901'`. -- In the [ALTER ATTACH PART](#alter_attach-partition) and [DROP DETACHED PART](#alter_drop-detached) query, to specify the name of a part, use string literal with a value from the `name` column of the [system.detached_parts](/docs/en/operations/system-tables/detached_parts.md/#system_tables-detached_parts) table. For example, `ALTER TABLE visits ATTACH PART '201901_1_1_0'`. +- As a value from the `partition` column of the `system.parts` table. For example, `ALTER TABLE visits DETACH PARTITION 201901`. +- As a tuple of expressions or constants that matches (in types) the table partitioning keys tuple. In the case of a single element partitioning key, the expression should be wrapped in the `tuple (...)` function. For example, `ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25')))`. +- Using the partition ID. Partition ID is a string identifier of the partition (human-readable, if possible) that is used as the names of partitions in the file system and in ZooKeeper. The partition ID must be specified in the `PARTITION ID` clause, in a single quotes. For example, `ALTER TABLE visits DETACH PARTITION ID '201901'`. +- In the [ALTER ATTACH PART](#alter_attach-partition) and [DROP DETACHED PART](#alter_drop-detached) query, to specify the name of a part, use string literal with a value from the `name` column of the [system.detached_parts](/docs/en/operations/system-tables/detached_parts.md/#system_tables-detached_parts) table. For example, `ALTER TABLE visits ATTACH PART '201901_1_1_0'`. Usage of quotes when specifying the partition depends on the type of partition expression. For example, for the `String` type, you have to specify its name in quotes (`'`). For the `Date` and `Int*` types no quotes are needed. diff --git a/docs/en/sql-reference/statements/alter/setting.md b/docs/en/sql-reference/statements/alter/setting.md index f68f035146a..e18ec0cc293 100644 --- a/docs/en/sql-reference/statements/alter/setting.md +++ b/docs/en/sql-reference/statements/alter/setting.md @@ -58,4 +58,4 @@ ALTER TABLE example_table RESET SETTING max_part_loading_threads; **See Also** -- [MergeTree settings](../../../operations/settings/merge-tree-settings.md) +- [MergeTree settings](../../../operations/settings/merge-tree-settings.md) diff --git a/docs/en/sql-reference/statements/alter/skipping-index.md b/docs/en/sql-reference/statements/alter/skipping-index.md index 87124c86eac..67af76986da 100644 --- a/docs/en/sql-reference/statements/alter/skipping-index.md +++ b/docs/en/sql-reference/statements/alter/skipping-index.md @@ -10,11 +10,11 @@ sidebar_label: INDEX The following operations are available: -- `ALTER TABLE [db].table_name [ON CLUSTER cluster] ADD INDEX name expression TYPE type GRANULARITY value [FIRST|AFTER name]` - Adds index description to tables metadata. +- `ALTER TABLE [db].table_name [ON CLUSTER cluster] ADD INDEX name expression TYPE type GRANULARITY value [FIRST|AFTER name]` - Adds index description to tables metadata. -- `ALTER TABLE [db].table_name [ON CLUSTER cluster] DROP INDEX name` - Removes index description from tables metadata and deletes index files from disk. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations). +- `ALTER TABLE [db].table_name [ON CLUSTER cluster] DROP INDEX name` - Removes index description from tables metadata and deletes index files from disk. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations). -- `ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX name [IN PARTITION partition_name]` - Rebuilds the secondary index `name` for the specified `partition_name`. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations). If `IN PARTITION` part is omitted then it rebuilds the index for the whole table data. +- `ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX name [IN PARTITION partition_name]` - Rebuilds the secondary index `name` for the specified `partition_name`. Implemented as a [mutation](/docs/en/sql-reference/statements/alter/index.md#mutations). If `IN PARTITION` part is omitted then it rebuilds the index for the whole table data. The first two commands are lightweight in a sense that they only change metadata or remove files. diff --git a/docs/en/sql-reference/statements/alter/update.md b/docs/en/sql-reference/statements/alter/update.md index c0036c060eb..ab7d0ca7378 100644 --- a/docs/en/sql-reference/statements/alter/update.md +++ b/docs/en/sql-reference/statements/alter/update.md @@ -24,9 +24,9 @@ The synchronicity of the query processing is defined by the [mutations_sync](/do **See also** -- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) -- [Synchronicity of ALTER Queries](/docs/en/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) -- [mutations_sync](/docs/en/operations/settings/settings.md/#mutations_sync) setting +- [Mutations](/docs/en/sql-reference/statements/alter/index.md#mutations) +- [Synchronicity of ALTER Queries](/docs/en/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [mutations_sync](/docs/en/operations/settings/settings.md/#mutations_sync) setting ## Related content diff --git a/docs/en/sql-reference/statements/alter/user.md b/docs/en/sql-reference/statements/alter/user.md index 31db89164d7..8785610f58a 100644 --- a/docs/en/sql-reference/statements/alter/user.md +++ b/docs/en/sql-reference/statements/alter/user.md @@ -25,10 +25,10 @@ To use `ALTER USER` you must have the [ALTER USER](../../../sql-reference/statem Specifies users or roles which are allowed to receive [privileges](../../../sql-reference/statements/grant.md#grant-privileges) from this user on the condition this user has also all required access granted with [GRANT OPTION](../../../sql-reference/statements/grant.md#grant-privigele-syntax). Options of the `GRANTEES` clause: -- `user` — Specifies a user this user can grant privileges to. -- `role` — Specifies a role this user can grant privileges to. -- `ANY` — This user can grant privileges to anyone. It's the default setting. -- `NONE` — This user can grant privileges to none. +- `user` — Specifies a user this user can grant privileges to. +- `role` — Specifies a role this user can grant privileges to. +- `ANY` — This user can grant privileges to anyone. It's the default setting. +- `NONE` — This user can grant privileges to none. You can exclude any user or role by using the `EXCEPT` expression. For example, `ALTER USER user1 GRANTEES ANY EXCEPT user2`. It means if `user1` has some privileges granted with `GRANT OPTION` it will be able to grant those privileges to anyone except `user2`. diff --git a/docs/en/sql-reference/statements/check-table.md b/docs/en/sql-reference/statements/check-table.md index 8c4b8ab90a2..0209d59b018 100644 --- a/docs/en/sql-reference/statements/check-table.md +++ b/docs/en/sql-reference/statements/check-table.md @@ -16,15 +16,15 @@ The `CHECK TABLE` query compares actual file sizes with the expected values whic The query response contains the `result` column with a single row. The row has a value of [Boolean](../../sql-reference/data-types/boolean.md) type: -- 0 - The data in the table is corrupted. -- 1 - The data maintains integrity. +- 0 - The data in the table is corrupted. +- 1 - The data maintains integrity. The `CHECK TABLE` query supports the following table engines: -- [Log](../../engines/table-engines/log-family/log.md) -- [TinyLog](../../engines/table-engines/log-family/tinylog.md) -- [StripeLog](../../engines/table-engines/log-family/stripelog.md) -- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) +- [Log](../../engines/table-engines/log-family/log.md) +- [TinyLog](../../engines/table-engines/log-family/tinylog.md) +- [StripeLog](../../engines/table-engines/log-family/stripelog.md) +- [MergeTree family](../../engines/table-engines/mergetree-family/mergetree.md) Performed over the tables with another table engines causes an exception. diff --git a/docs/en/sql-reference/statements/create/database.md b/docs/en/sql-reference/statements/create/database.md index 7954d1362f1..a2f5b2b9fba 100644 --- a/docs/en/sql-reference/statements/create/database.md +++ b/docs/en/sql-reference/statements/create/database.md @@ -18,8 +18,8 @@ CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(.. If the `db_name` database already exists, then ClickHouse does not create a new database and: -- Doesn’t throw an exception if clause is specified. -- Throws an exception if clause isn’t specified. +- Doesn’t throw an exception if clause is specified. +- Throws an exception if clause isn’t specified. ### ON CLUSTER diff --git a/docs/en/sql-reference/statements/create/function.md b/docs/en/sql-reference/statements/create/function.md index 6c786b48fad..08946934f0c 100644 --- a/docs/en/sql-reference/statements/create/function.md +++ b/docs/en/sql-reference/statements/create/function.md @@ -17,9 +17,9 @@ A function can have an arbitrary number of parameters. There are a few restrictions: -- The name of a function must be unique among user defined and system functions. -- Recursive functions are not allowed. -- All variables used by a function must be specified in its parameter list. +- The name of a function must be unique among user defined and system functions. +- Recursive functions are not allowed. +- All variables used by a function must be specified in its parameter list. If any restriction is violated then an exception is raised. diff --git a/docs/en/sql-reference/statements/create/index.md b/docs/en/sql-reference/statements/create/index.md index b9062249f65..14e29d051d7 100644 --- a/docs/en/sql-reference/statements/create/index.md +++ b/docs/en/sql-reference/statements/create/index.md @@ -8,13 +8,13 @@ sidebar_label: CREATE Create queries make a new entity of one of the following kinds: -- [DATABASE](../../../sql-reference/statements/create/database.md) -- [TABLE](../../../sql-reference/statements/create/table.md) -- [VIEW](../../../sql-reference/statements/create/view.md) -- [DICTIONARY](../../../sql-reference/statements/create/dictionary.md) -- [FUNCTION](../../../sql-reference/statements/create/function.md) -- [USER](../../../sql-reference/statements/create/user.md) -- [ROLE](../../../sql-reference/statements/create/role.md) -- [ROW POLICY](../../../sql-reference/statements/create/row-policy.md) -- [QUOTA](../../../sql-reference/statements/create/quota.md) -- [SETTINGS PROFILE](../../../sql-reference/statements/create/settings-profile.md) +- [DATABASE](../../../sql-reference/statements/create/database.md) +- [TABLE](../../../sql-reference/statements/create/table.md) +- [VIEW](../../../sql-reference/statements/create/view.md) +- [DICTIONARY](../../../sql-reference/statements/create/dictionary.md) +- [FUNCTION](../../../sql-reference/statements/create/function.md) +- [USER](../../../sql-reference/statements/create/user.md) +- [ROLE](../../../sql-reference/statements/create/role.md) +- [ROW POLICY](../../../sql-reference/statements/create/row-policy.md) +- [QUOTA](../../../sql-reference/statements/create/quota.md) +- [SETTINGS PROFILE](../../../sql-reference/statements/create/settings-profile.md) diff --git a/docs/en/sql-reference/statements/create/table.md b/docs/en/sql-reference/statements/create/table.md index 3432066864f..f0101d39479 100644 --- a/docs/en/sql-reference/statements/create/table.md +++ b/docs/en/sql-reference/statements/create/table.md @@ -349,10 +349,10 @@ You can’t decompress ClickHouse database files with external utilities like `l Compression is supported for the following table engines: -- [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) family. Supports column compression codecs and selecting the default compression method by [compression](../../../operations/server-configuration-parameters/settings.md#server-settings-compression) settings. -- [Log](../../../engines/table-engines/log-family/index.md) family. Uses the `lz4` compression method by default and supports column compression codecs. -- [Set](../../../engines/table-engines/special/set.md). Only supported the default compression. -- [Join](../../../engines/table-engines/special/join.md). Only supported the default compression. +- [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) family. Supports column compression codecs and selecting the default compression method by [compression](../../../operations/server-configuration-parameters/settings.md#server-settings-compression) settings. +- [Log](../../../engines/table-engines/log-family/index.md) family. Uses the `lz4` compression method by default and supports column compression codecs. +- [Set](../../../engines/table-engines/special/set.md). Only supported the default compression. +- [Join](../../../engines/table-engines/special/join.md). Only supported the default compression. ClickHouse supports general purpose codecs and specialized codecs. @@ -380,10 +380,10 @@ High compression levels are useful for asymmetric scenarios, like compress once, `DEFLATE_QPL` — [Deflate compression algorithm](https://github.com/intel/qpl) implemented by Intel® Query Processing Library. Some limitations apply: -- DEFLATE_QPL is experimental and can only be used after setting configuration parameter `allow_experimental_codecs=1`. -- DEFLATE_QPL only works if ClickHouse was compiled with support for AVX2 or AVX512 instructions. Refer to [Build Clickhouse with DEFLATE_QPL](/docs/en/development/building_and_benchmarking_deflate_qpl.md/#Build-Clickhouse-with-DEFLATE_QPL) for more details. -- DEFLATE_QPL works best if the system has a Intel® IAA (In-Memory Analytics Accelerator) offloading device. Refer to [Accelerator Configuration](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration) and [Benchmark with DEFLATE_QPL](/docs/en/development/building_and_benchmarking_deflate_qpl.md/#Run-Benchmark-with-DEFLATE_QPL) for more details. -- DEFLATE_QPL-compressed data can only be transferred between ClickHouse nodes compiled with support for AVX2/AVX512 +- DEFLATE_QPL is experimental and can only be used after setting configuration parameter `allow_experimental_codecs=1`. +- DEFLATE_QPL only works if ClickHouse was compiled with support for AVX2 or AVX512 instructions. Refer to [Build Clickhouse with DEFLATE_QPL](/docs/en/development/building_and_benchmarking_deflate_qpl.md/#Build-Clickhouse-with-DEFLATE_QPL) for more details. +- DEFLATE_QPL works best if the system has a Intel® IAA (In-Memory Analytics Accelerator) offloading device. Refer to [Accelerator Configuration](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration) and [Benchmark with DEFLATE_QPL](/docs/en/development/building_and_benchmarking_deflate_qpl.md/#Run-Benchmark-with-DEFLATE_QPL) for more details. +- DEFLATE_QPL-compressed data can only be transferred between ClickHouse nodes compiled with support for AVX2/AVX512 ### Specialized Codecs @@ -474,12 +474,12 @@ ENGINE = MergeTree ORDER BY x; ClickHouse supports temporary tables which have the following characteristics: -- Temporary tables disappear when the session ends, including if the connection is lost. -- A temporary table uses the Memory table engine when engine is not specified and it may use any table engine except Replicated and `KeeperMap` engines. -- The DB can’t be specified for a temporary table. It is created outside of databases. -- Impossible to create a temporary table with distributed DDL query on all cluster servers (by using `ON CLUSTER`): this table exists only in the current session. -- If a temporary table has the same name as another one and a query specifies the table name without specifying the DB, the temporary table will be used. -- For distributed query processing, temporary tables used in a query are passed to remote servers. +- Temporary tables disappear when the session ends, including if the connection is lost. +- A temporary table uses the Memory table engine when engine is not specified and it may use any table engine except Replicated and `KeeperMap` engines. +- The DB can’t be specified for a temporary table. It is created outside of databases. +- Impossible to create a temporary table with distributed DDL query on all cluster servers (by using `ON CLUSTER`): this table exists only in the current session. +- If a temporary table has the same name as another one and a query specifies the table name without specifying the DB, the temporary table will be used. +- For distributed query processing, temporary tables used in a query are passed to remote servers. To create a temporary table, use the following syntax: diff --git a/docs/en/sql-reference/statements/create/user.md b/docs/en/sql-reference/statements/create/user.md index b9bd2c1c507..3548ef7cc07 100644 --- a/docs/en/sql-reference/statements/create/user.md +++ b/docs/en/sql-reference/statements/create/user.md @@ -26,15 +26,15 @@ CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [ON CLUSTER cluster_name1] There are multiple ways of user identification: -- `IDENTIFIED WITH no_password` -- `IDENTIFIED WITH plaintext_password BY 'qwerty'` -- `IDENTIFIED WITH sha256_password BY 'qwerty'` or `IDENTIFIED BY 'password'` -- `IDENTIFIED WITH sha256_hash BY 'hash'` or `IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'` -- `IDENTIFIED WITH double_sha1_password BY 'qwerty'` -- `IDENTIFIED WITH double_sha1_hash BY 'hash'` -- `IDENTIFIED WITH ldap SERVER 'server_name'` -- `IDENTIFIED WITH kerberos` or `IDENTIFIED WITH kerberos REALM 'realm'` -- `IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'` +- `IDENTIFIED WITH no_password` +- `IDENTIFIED WITH plaintext_password BY 'qwerty'` +- `IDENTIFIED WITH sha256_password BY 'qwerty'` or `IDENTIFIED BY 'password'` +- `IDENTIFIED WITH sha256_hash BY 'hash'` or `IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'` +- `IDENTIFIED WITH double_sha1_password BY 'qwerty'` +- `IDENTIFIED WITH double_sha1_hash BY 'hash'` +- `IDENTIFIED WITH ldap SERVER 'server_name'` +- `IDENTIFIED WITH kerberos` or `IDENTIFIED WITH kerberos REALM 'realm'` +- `IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'` ## Examples @@ -96,18 +96,18 @@ There are multiple ways of user identification: User host is a host from which a connection to ClickHouse server could be established. The host can be specified in the `HOST` query section in the following ways: -- `HOST IP 'ip_address_or_subnetwork'` — User can connect to ClickHouse server only from the specified IP address or a [subnetwork](https://en.wikipedia.org/wiki/Subnetwork). Examples: `HOST IP '192.168.0.0/16'`, `HOST IP '2001:DB8::/32'`. For use in production, only specify `HOST IP` elements (IP addresses and their masks), since using `host` and `host_regexp` might cause extra latency. -- `HOST ANY` — User can connect from any location. This is a default option. -- `HOST LOCAL` — User can connect only locally. -- `HOST NAME 'fqdn'` — User host can be specified as FQDN. For example, `HOST NAME 'mysite.com'`. -- `HOST REGEXP 'regexp'` — You can use [pcre](http://www.pcre.org/) regular expressions when specifying user hosts. For example, `HOST REGEXP '.*\.mysite\.com'`. -- `HOST LIKE 'template'` — Allows you to use the [LIKE](../../../sql-reference/functions/string-search-functions.md#function-like) operator to filter the user hosts. For example, `HOST LIKE '%'` is equivalent to `HOST ANY`, `HOST LIKE '%.mysite.com'` filters all the hosts in the `mysite.com` domain. +- `HOST IP 'ip_address_or_subnetwork'` — User can connect to ClickHouse server only from the specified IP address or a [subnetwork](https://en.wikipedia.org/wiki/Subnetwork). Examples: `HOST IP '192.168.0.0/16'`, `HOST IP '2001:DB8::/32'`. For use in production, only specify `HOST IP` elements (IP addresses and their masks), since using `host` and `host_regexp` might cause extra latency. +- `HOST ANY` — User can connect from any location. This is a default option. +- `HOST LOCAL` — User can connect only locally. +- `HOST NAME 'fqdn'` — User host can be specified as FQDN. For example, `HOST NAME 'mysite.com'`. +- `HOST REGEXP 'regexp'` — You can use [pcre](http://www.pcre.org/) regular expressions when specifying user hosts. For example, `HOST REGEXP '.*\.mysite\.com'`. +- `HOST LIKE 'template'` — Allows you to use the [LIKE](../../../sql-reference/functions/string-search-functions.md#function-like) operator to filter the user hosts. For example, `HOST LIKE '%'` is equivalent to `HOST ANY`, `HOST LIKE '%.mysite.com'` filters all the hosts in the `mysite.com` domain. Another way of specifying host is to use `@` syntax following the username. Examples: -- `CREATE USER mira@'127.0.0.1'` — Equivalent to the `HOST IP` syntax. -- `CREATE USER mira@'localhost'` — Equivalent to the `HOST LOCAL` syntax. -- `CREATE USER mira@'192.168.%.%'` — Equivalent to the `HOST LIKE` syntax. +- `CREATE USER mira@'127.0.0.1'` — Equivalent to the `HOST IP` syntax. +- `CREATE USER mira@'localhost'` — Equivalent to the `HOST LOCAL` syntax. +- `CREATE USER mira@'192.168.%.%'` — Equivalent to the `HOST LIKE` syntax. :::tip ClickHouse treats `user_name@'address'` as a username as a whole. Thus, technically you can create multiple users with the same `user_name` and different constructions after `@`. However, we do not recommend to do so. @@ -117,10 +117,10 @@ ClickHouse treats `user_name@'address'` as a username as a whole. Thus, technica Specifies users or roles which are allowed to receive [privileges](../../../sql-reference/statements/grant.md#grant-privileges) from this user on the condition this user has also all required access granted with [GRANT OPTION](../../../sql-reference/statements/grant.md#grant-privigele-syntax). Options of the `GRANTEES` clause: -- `user` — Specifies a user this user can grant privileges to. -- `role` — Specifies a role this user can grant privileges to. -- `ANY` — This user can grant privileges to anyone. It's the default setting. -- `NONE` — This user can grant privileges to none. +- `user` — Specifies a user this user can grant privileges to. +- `role` — Specifies a role this user can grant privileges to. +- `ANY` — This user can grant privileges to anyone. It's the default setting. +- `NONE` — This user can grant privileges to none. You can exclude any user or role by using the `EXCEPT` expression. For example, `CREATE USER user1 GRANTEES ANY EXCEPT user2`. It means if `user1` has some privileges granted with `GRANT OPTION` it will be able to grant those privileges to anyone except `user2`. diff --git a/docs/en/sql-reference/statements/create/view.md b/docs/en/sql-reference/statements/create/view.md index d7b16a88f6b..10b15638152 100644 --- a/docs/en/sql-reference/statements/create/view.md +++ b/docs/en/sql-reference/statements/create/view.md @@ -235,7 +235,7 @@ Most common uses of live view tables include: - Watching metrics from system tables using periodic refresh. **See Also** -- [ALTER LIVE VIEW](../alter/view.md#alter-live-view) +- [ALTER LIVE VIEW](../alter/view.md#alter-live-view) ## Window View [Experimental] diff --git a/docs/en/sql-reference/statements/describe-table.md b/docs/en/sql-reference/statements/describe-table.md index b9190107127..20f7061dedd 100644 --- a/docs/en/sql-reference/statements/describe-table.md +++ b/docs/en/sql-reference/statements/describe-table.md @@ -15,14 +15,14 @@ DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format] The `DESCRIBE` statement returns a row for each table column with the following [String](../../sql-reference/data-types/string.md) values: -- `name` — A column name. -- `type` — A column type. -- `default_type` — A clause that is used in the column [default expression](../../sql-reference/statements/create/table.md#create-default-values): `DEFAULT`, `MATERIALIZED` or `ALIAS`. If there is no default expression, then empty string is returned. -- `default_expression` — An expression specified after the `DEFAULT` clause. -- `comment` — A [column comment](../../sql-reference/statements/alter/column.md#alter_comment-column). -- `codec_expression` — A [codec](../../sql-reference/statements/create/table.md#codecs) that is applied to the column. -- `ttl_expression` — A [TTL](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl) expression. -- `is_subcolumn` — A flag that equals `1` for internal subcolumns. It is included into the result only if subcolumn description is enabled by the [describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) setting. +- `name` — A column name. +- `type` — A column type. +- `default_type` — A clause that is used in the column [default expression](../../sql-reference/statements/create/table.md#create-default-values): `DEFAULT`, `MATERIALIZED` or `ALIAS`. If there is no default expression, then empty string is returned. +- `default_expression` — An expression specified after the `DEFAULT` clause. +- `comment` — A [column comment](../../sql-reference/statements/alter/column.md#alter_comment-column). +- `codec_expression` — A [codec](../../sql-reference/statements/create/table.md#codecs) that is applied to the column. +- `ttl_expression` — A [TTL](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl) expression. +- `is_subcolumn` — A flag that equals `1` for internal subcolumns. It is included into the result only if subcolumn description is enabled by the [describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) setting. All columns in [Nested](../../sql-reference/data-types/nested-data-structures/index.md) data structures are described separately. The name of each column is prefixed with a parent column name and a dot. @@ -66,4 +66,4 @@ The second query additionally shows subcolumns: **See Also** -- [describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) setting. +- [describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) setting. diff --git a/docs/en/sql-reference/statements/detach.md b/docs/en/sql-reference/statements/detach.md index 5f1513d3f44..6f08168bbef 100644 --- a/docs/en/sql-reference/statements/detach.md +++ b/docs/en/sql-reference/statements/detach.md @@ -72,5 +72,5 @@ Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table defa **See Also** -- [Materialized View](../../sql-reference/statements/create/view.md#materialized) -- [Dictionaries](../../sql-reference/dictionaries/index.md) +- [Materialized View](../../sql-reference/statements/create/view.md#materialized) +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/exchange.md b/docs/en/sql-reference/statements/exchange.md index 33f3e08d547..babb29ae977 100644 --- a/docs/en/sql-reference/statements/exchange.md +++ b/docs/en/sql-reference/statements/exchange.md @@ -41,4 +41,4 @@ EXCHANGE DICTIONARIES [db0.]dict_A AND [db1.]dict_B [ON CLUSTER cluster] **See Also** -- [Dictionaries](../../sql-reference/dictionaries/index.md) +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/explain.md b/docs/en/sql-reference/statements/explain.md index 5081abf2fb8..d2472966b7d 100644 --- a/docs/en/sql-reference/statements/explain.md +++ b/docs/en/sql-reference/statements/explain.md @@ -115,9 +115,9 @@ CROSS JOIN system.numbers AS c Settings: -- `run_passes` — Run all query tree passes before dumping the query tree. Defaul: `1`. -- `dump_passes` — Dump information about used passes before dumping the query tree. Default: `0`. -- `passes` — Specifies how many passes to run. If set to `-1`, runs all the passes. Default: `-1`. +- `run_passes` — Run all query tree passes before dumping the query tree. Defaul: `1`. +- `dump_passes` — Dump information about used passes before dumping the query tree. Default: `0`. +- `passes` — Specifies how many passes to run. If set to `-1`, runs all the passes. Default: `-1`. Example: ```sql @@ -143,11 +143,11 @@ Dump query plan steps. Settings: -- `header` — Prints output header for step. Default: 0. -- `description` — Prints step description. Default: 1. -- `indexes` — Shows used indexes, the number of filtered parts and the number of filtered granules for every index applied. Default: 0. Supported for [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) tables. -- `actions` — Prints detailed information about step actions. Default: 0. -- `json` — Prints query plan steps as a row in [JSON](../../interfaces/formats.md#json) format. Default: 0. It is recommended to use [TSVRaw](../../interfaces/formats.md#tabseparatedraw) format to avoid unnecessary escaping. +- `header` — Prints output header for step. Default: 0. +- `description` — Prints step description. Default: 1. +- `indexes` — Shows used indexes, the number of filtered parts and the number of filtered granules for every index applied. Default: 0. Supported for [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) tables. +- `actions` — Prints detailed information about step actions. Default: 0. +- `json` — Prints query plan steps as a row in [JSON](../../interfaces/formats.md#json) format. Default: 0. It is recommended to use [TSVRaw](../../interfaces/formats.md#tabseparatedraw) format to avoid unnecessary escaping. Example: @@ -276,12 +276,12 @@ EXPLAIN json = 1, description = 0, header = 1 SELECT 1, 2 + dummy; With `indexes` = 1, the `Indexes` key is added. It contains an array of used indexes. Each index is described as JSON with `Type` key (a string `MinMax`, `Partition`, `PrimaryKey` or `Skip`) and optional keys: -- `Name` — The index name (currently only used for `Skip` indexes). -- `Keys` — The array of columns used by the index. -- `Condition` — The used condition. -- `Description` — The index description (currently only used for `Skip` indexes). -- `Parts` — The number of parts before/after the index is applied. -- `Granules` — The number of granules before/after the index is applied. +- `Name` — The index name (currently only used for `Skip` indexes). +- `Keys` — The array of columns used by the index. +- `Condition` — The used condition. +- `Description` — The index description (currently only used for `Skip` indexes). +- `Parts` — The number of parts before/after the index is applied. +- `Granules` — The number of granules before/after the index is applied. Example: @@ -380,9 +380,9 @@ EXPLAIN json = 1, actions = 1, description = 0 SELECT 1 FORMAT TSVRaw; Settings: -- `header` — Prints header for each output port. Default: 0. -- `graph` — Prints a graph described in the [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) graph description language. Default: 0. -- `compact` — Prints graph in compact mode if `graph` setting is enabled. Default: 1. +- `header` — Prints header for each output port. Default: 0. +- `graph` — Prints a graph described in the [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) graph description language. Default: 0. +- `compact` — Prints graph in compact mode if `graph` setting is enabled. Default: 1. Example: diff --git a/docs/en/sql-reference/statements/grant.md b/docs/en/sql-reference/statements/grant.md index 1d9b2c9ea30..8fa3b5de1b8 100644 --- a/docs/en/sql-reference/statements/grant.md +++ b/docs/en/sql-reference/statements/grant.md @@ -6,8 +6,8 @@ sidebar_label: GRANT # GRANT Statement -- Grants [privileges](#grant-privileges) to ClickHouse user accounts or roles. -- Assigns roles to user accounts or to the other roles. +- Grants [privileges](#grant-privileges) to ClickHouse user accounts or roles. +- Assigns roles to user accounts or to the other roles. To revoke privileges, use the [REVOKE](../../sql-reference/statements/revoke.md) statement. Also you can list granted privileges with the [SHOW GRANTS](../../sql-reference/statements/show.md#show-grants-statement) statement. @@ -17,9 +17,9 @@ To revoke privileges, use the [REVOKE](../../sql-reference/statements/revoke.md) GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] ``` -- `privilege` — Type of privilege. -- `role` — ClickHouse user role. -- `user` — ClickHouse user account. +- `privilege` — Type of privilege. +- `role` — ClickHouse user role. +- `user` — ClickHouse user account. The `WITH GRANT OPTION` clause grants `user` or `role` with permission to execute the `GRANT` query. Users can grant privileges of the same scope they have and less. The `WITH REPLACE OPTION` clause replace old privileges by new privileges for the `user` or `role`, if is not specified it appends privileges. @@ -30,8 +30,8 @@ The `WITH REPLACE OPTION` clause replace old privileges by new privileges for th GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] ``` -- `role` — ClickHouse user role. -- `user` — ClickHouse user account. +- `role` — ClickHouse user role. +- `user` — ClickHouse user account. The `WITH ADMIN OPTION` clause grants [ADMIN OPTION](#admin-option-privilege) privilege to `user` or `role`. The `WITH REPLACE OPTION` clause replace old roles by new role for the `user` or `role`, if is not specified it appends roles. @@ -48,9 +48,9 @@ GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION It means that `john` has the permission to execute: -- `SELECT x,y FROM db.table`. -- `SELECT x FROM db.table`. -- `SELECT y FROM db.table`. +- `SELECT x,y FROM db.table`. +- `SELECT x FROM db.table`. +- `SELECT y FROM db.table`. `john` can’t execute `SELECT z FROM db.table`. The `SELECT * FROM db.table` also is not available. Processing this query, ClickHouse does not return any data, even `x` and `y`. The only exception is if a table contains only `x` and `y` columns. In this case ClickHouse returns all the data. @@ -70,151 +70,151 @@ Privileges have a hierarchical structure. A set of permitted queries depends on Hierarchy of privileges: -- [SELECT](#grant-select) -- [INSERT](#grant-insert) -- [ALTER](#grant-alter) - - `ALTER TABLE` - - `ALTER UPDATE` - - `ALTER DELETE` - - `ALTER COLUMN` - - `ALTER ADD COLUMN` - - `ALTER DROP COLUMN` - - `ALTER MODIFY COLUMN` - - `ALTER COMMENT COLUMN` - - `ALTER CLEAR COLUMN` - - `ALTER RENAME COLUMN` - - `ALTER INDEX` - - `ALTER ORDER BY` - - `ALTER SAMPLE BY` - - `ALTER ADD INDEX` - - `ALTER DROP INDEX` - - `ALTER MATERIALIZE INDEX` - - `ALTER CLEAR INDEX` - - `ALTER CONSTRAINT` - - `ALTER ADD CONSTRAINT` - - `ALTER DROP CONSTRAINT` - - `ALTER TTL` - - `ALTER MATERIALIZE TTL` - - `ALTER SETTINGS` - - `ALTER MOVE PARTITION` - - `ALTER FETCH PARTITION` - - `ALTER FREEZE PARTITION` - - `ALTER VIEW` - - `ALTER VIEW REFRESH` - - `ALTER VIEW MODIFY QUERY` -- [CREATE](#grant-create) - - `CREATE DATABASE` - - `CREATE TABLE` - - `CREATE ARBITRARY TEMPORARY TABLE` - - `CREATE TEMPORARY TABLE` - - `CREATE VIEW` - - `CREATE DICTIONARY` - - `CREATE FUNCTION` -- [DROP](#grant-drop) - - `DROP DATABASE` - - `DROP TABLE` - - `DROP VIEW` - - `DROP DICTIONARY` - - `DROP FUNCTION` -- [TRUNCATE](#grant-truncate) -- [OPTIMIZE](#grant-optimize) -- [SHOW](#grant-show) - - `SHOW DATABASES` - - `SHOW TABLES` - - `SHOW COLUMNS` - - `SHOW DICTIONARIES` -- [KILL QUERY](#grant-kill-query) -- [ACCESS MANAGEMENT](#grant-access-management) - - `CREATE USER` - - `ALTER USER` - - `DROP USER` - - `CREATE ROLE` - - `ALTER ROLE` - - `DROP ROLE` - - `CREATE ROW POLICY` - - `ALTER ROW POLICY` - - `DROP ROW POLICY` - - `CREATE QUOTA` - - `ALTER QUOTA` - - `DROP QUOTA` - - `CREATE SETTINGS PROFILE` - - `ALTER SETTINGS PROFILE` - - `DROP SETTINGS PROFILE` - - `SHOW ACCESS` - - `SHOW_USERS` - - `SHOW_ROLES` - - `SHOW_ROW_POLICIES` - - `SHOW_QUOTAS` - - `SHOW_SETTINGS_PROFILES` - - `ROLE ADMIN` -- [SYSTEM](#grant-system) - - `SYSTEM SHUTDOWN` - - `SYSTEM DROP CACHE` - - `SYSTEM DROP DNS CACHE` - - `SYSTEM DROP MARK CACHE` - - `SYSTEM DROP UNCOMPRESSED CACHE` - - `SYSTEM RELOAD` - - `SYSTEM RELOAD CONFIG` - - `SYSTEM RELOAD DICTIONARY` - - `SYSTEM RELOAD EMBEDDED DICTIONARIES` - - `SYSTEM RELOAD FUNCTION` - - `SYSTEM RELOAD FUNCTIONS` - - `SYSTEM MERGES` - - `SYSTEM TTL MERGES` - - `SYSTEM FETCHES` - - `SYSTEM MOVES` - - `SYSTEM SENDS` - - `SYSTEM DISTRIBUTED SENDS` - - `SYSTEM REPLICATED SENDS` - - `SYSTEM REPLICATION QUEUES` - - `SYSTEM SYNC REPLICA` - - `SYSTEM RESTART REPLICA` - - `SYSTEM FLUSH` - - `SYSTEM FLUSH DISTRIBUTED` - - `SYSTEM FLUSH LOGS` - - `CLUSTER` (see also `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive) -- [INTROSPECTION](#grant-introspection) - - `addressToLine` - - `addressToLineWithInlines` - - `addressToSymbol` - - `demangle` -- [SOURCES](#grant-sources) - - `FILE` - - `URL` - - `REMOTE` - - `YSQL` - - `ODBC` - - `JDBC` - - `HDFS` - - `S3` -- [dictGet](#grant-dictget) +- [SELECT](#grant-select) +- [INSERT](#grant-insert) +- [ALTER](#grant-alter) + - `ALTER TABLE` + - `ALTER UPDATE` + - `ALTER DELETE` + - `ALTER COLUMN` + - `ALTER ADD COLUMN` + - `ALTER DROP COLUMN` + - `ALTER MODIFY COLUMN` + - `ALTER COMMENT COLUMN` + - `ALTER CLEAR COLUMN` + - `ALTER RENAME COLUMN` + - `ALTER INDEX` + - `ALTER ORDER BY` + - `ALTER SAMPLE BY` + - `ALTER ADD INDEX` + - `ALTER DROP INDEX` + - `ALTER MATERIALIZE INDEX` + - `ALTER CLEAR INDEX` + - `ALTER CONSTRAINT` + - `ALTER ADD CONSTRAINT` + - `ALTER DROP CONSTRAINT` + - `ALTER TTL` + - `ALTER MATERIALIZE TTL` + - `ALTER SETTINGS` + - `ALTER MOVE PARTITION` + - `ALTER FETCH PARTITION` + - `ALTER FREEZE PARTITION` + - `ALTER VIEW` + - `ALTER VIEW REFRESH` + - `ALTER VIEW MODIFY QUERY` +- [CREATE](#grant-create) + - `CREATE DATABASE` + - `CREATE TABLE` + - `CREATE ARBITRARY TEMPORARY TABLE` + - `CREATE TEMPORARY TABLE` + - `CREATE VIEW` + - `CREATE DICTIONARY` + - `CREATE FUNCTION` +- [DROP](#grant-drop) + - `DROP DATABASE` + - `DROP TABLE` + - `DROP VIEW` + - `DROP DICTIONARY` + - `DROP FUNCTION` +- [TRUNCATE](#grant-truncate) +- [OPTIMIZE](#grant-optimize) +- [SHOW](#grant-show) + - `SHOW DATABASES` + - `SHOW TABLES` + - `SHOW COLUMNS` + - `SHOW DICTIONARIES` +- [KILL QUERY](#grant-kill-query) +- [ACCESS MANAGEMENT](#grant-access-management) + - `CREATE USER` + - `ALTER USER` + - `DROP USER` + - `CREATE ROLE` + - `ALTER ROLE` + - `DROP ROLE` + - `CREATE ROW POLICY` + - `ALTER ROW POLICY` + - `DROP ROW POLICY` + - `CREATE QUOTA` + - `ALTER QUOTA` + - `DROP QUOTA` + - `CREATE SETTINGS PROFILE` + - `ALTER SETTINGS PROFILE` + - `DROP SETTINGS PROFILE` + - `SHOW ACCESS` + - `SHOW_USERS` + - `SHOW_ROLES` + - `SHOW_ROW_POLICIES` + - `SHOW_QUOTAS` + - `SHOW_SETTINGS_PROFILES` + - `ROLE ADMIN` +- [SYSTEM](#grant-system) + - `SYSTEM SHUTDOWN` + - `SYSTEM DROP CACHE` + - `SYSTEM DROP DNS CACHE` + - `SYSTEM DROP MARK CACHE` + - `SYSTEM DROP UNCOMPRESSED CACHE` + - `SYSTEM RELOAD` + - `SYSTEM RELOAD CONFIG` + - `SYSTEM RELOAD DICTIONARY` + - `SYSTEM RELOAD EMBEDDED DICTIONARIES` + - `SYSTEM RELOAD FUNCTION` + - `SYSTEM RELOAD FUNCTIONS` + - `SYSTEM MERGES` + - `SYSTEM TTL MERGES` + - `SYSTEM FETCHES` + - `SYSTEM MOVES` + - `SYSTEM SENDS` + - `SYSTEM DISTRIBUTED SENDS` + - `SYSTEM REPLICATED SENDS` + - `SYSTEM REPLICATION QUEUES` + - `SYSTEM SYNC REPLICA` + - `SYSTEM RESTART REPLICA` + - `SYSTEM FLUSH` + - `SYSTEM FLUSH DISTRIBUTED` + - `SYSTEM FLUSH LOGS` + - `CLUSTER` (see also `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive) +- [INTROSPECTION](#grant-introspection) + - `addressToLine` + - `addressToLineWithInlines` + - `addressToSymbol` + - `demangle` +- [SOURCES](#grant-sources) + - `FILE` + - `URL` + - `REMOTE` + - `YSQL` + - `ODBC` + - `JDBC` + - `HDFS` + - `S3` +- [dictGet](#grant-dictget) Examples of how this hierarchy is treated: -- The `ALTER` privilege includes all other `ALTER*` privileges. -- `ALTER CONSTRAINT` includes `ALTER ADD CONSTRAINT` and `ALTER DROP CONSTRAINT` privileges. +- The `ALTER` privilege includes all other `ALTER*` privileges. +- `ALTER CONSTRAINT` includes `ALTER ADD CONSTRAINT` and `ALTER DROP CONSTRAINT` privileges. Privileges are applied at different levels. Knowing of a level suggests syntax available for privilege. Levels (from lower to higher): -- `COLUMN` — Privilege can be granted for column, table, database, or globally. -- `TABLE` — Privilege can be granted for table, database, or globally. -- `VIEW` — Privilege can be granted for view, database, or globally. -- `DICTIONARY` — Privilege can be granted for dictionary, database, or globally. -- `DATABASE` — Privilege can be granted for database or globally. -- `GLOBAL` — Privilege can be granted only globally. -- `GROUP` — Groups privileges of different levels. When `GROUP`-level privilege is granted, only that privileges from the group are granted which correspond to the used syntax. +- `COLUMN` — Privilege can be granted for column, table, database, or globally. +- `TABLE` — Privilege can be granted for table, database, or globally. +- `VIEW` — Privilege can be granted for view, database, or globally. +- `DICTIONARY` — Privilege can be granted for dictionary, database, or globally. +- `DATABASE` — Privilege can be granted for database or globally. +- `GLOBAL` — Privilege can be granted only globally. +- `GROUP` — Groups privileges of different levels. When `GROUP`-level privilege is granted, only that privileges from the group are granted which correspond to the used syntax. Examples of allowed syntax: -- `GRANT SELECT(x) ON db.table TO user` -- `GRANT SELECT ON db.* TO user` +- `GRANT SELECT(x) ON db.table TO user` +- `GRANT SELECT ON db.* TO user` Examples of disallowed syntax: -- `GRANT CREATE USER(x) ON db.table TO user` -- `GRANT CREATE USER ON db.* TO user` +- `GRANT CREATE USER(x) ON db.table TO user` +- `GRANT CREATE USER ON db.* TO user` The special privilege [ALL](#grant-all) grants all the privileges to a user account or a role. @@ -264,74 +264,74 @@ The granted privilege allows `john` to insert data to the `x` and/or `y` columns Allows executing [ALTER](../../sql-reference/statements/alter/index.md) queries according to the following hierarchy of privileges: -- `ALTER`. Level: `COLUMN`. - - `ALTER TABLE`. Level: `GROUP` - - `ALTER UPDATE`. Level: `COLUMN`. Aliases: `UPDATE` - - `ALTER DELETE`. Level: `COLUMN`. Aliases: `DELETE` - - `ALTER COLUMN`. Level: `GROUP` - - `ALTER ADD COLUMN`. Level: `COLUMN`. Aliases: `ADD COLUMN` - - `ALTER DROP COLUMN`. Level: `COLUMN`. Aliases: `DROP COLUMN` - - `ALTER MODIFY COLUMN`. Level: `COLUMN`. Aliases: `MODIFY COLUMN` - - `ALTER COMMENT COLUMN`. Level: `COLUMN`. Aliases: `COMMENT COLUMN` - - `ALTER CLEAR COLUMN`. Level: `COLUMN`. Aliases: `CLEAR COLUMN` - - `ALTER RENAME COLUMN`. Level: `COLUMN`. Aliases: `RENAME COLUMN` - - `ALTER INDEX`. Level: `GROUP`. Aliases: `INDEX` - - `ALTER ORDER BY`. Level: `TABLE`. Aliases: `ALTER MODIFY ORDER BY`, `MODIFY ORDER BY` - - `ALTER SAMPLE BY`. Level: `TABLE`. Aliases: `ALTER MODIFY SAMPLE BY`, `MODIFY SAMPLE BY` - - `ALTER ADD INDEX`. Level: `TABLE`. Aliases: `ADD INDEX` - - `ALTER DROP INDEX`. Level: `TABLE`. Aliases: `DROP INDEX` - - `ALTER MATERIALIZE INDEX`. Level: `TABLE`. Aliases: `MATERIALIZE INDEX` - - `ALTER CLEAR INDEX`. Level: `TABLE`. Aliases: `CLEAR INDEX` - - `ALTER CONSTRAINT`. Level: `GROUP`. Aliases: `CONSTRAINT` - - `ALTER ADD CONSTRAINT`. Level: `TABLE`. Aliases: `ADD CONSTRAINT` - - `ALTER DROP CONSTRAINT`. Level: `TABLE`. Aliases: `DROP CONSTRAINT` - - `ALTER TTL`. Level: `TABLE`. Aliases: `ALTER MODIFY TTL`, `MODIFY TTL` - - `ALTER MATERIALIZE TTL`. Level: `TABLE`. Aliases: `MATERIALIZE TTL` - - `ALTER SETTINGS`. Level: `TABLE`. Aliases: `ALTER SETTING`, `ALTER MODIFY SETTING`, `MODIFY SETTING` - - `ALTER MOVE PARTITION`. Level: `TABLE`. Aliases: `ALTER MOVE PART`, `MOVE PARTITION`, `MOVE PART` - - `ALTER FETCH PARTITION`. Level: `TABLE`. Aliases: `ALTER FETCH PART`, `FETCH PARTITION`, `FETCH PART` - - `ALTER FREEZE PARTITION`. Level: `TABLE`. Aliases: `FREEZE PARTITION` - - `ALTER VIEW` Level: `GROUP` - - `ALTER VIEW REFRESH`. Level: `VIEW`. Aliases: `ALTER LIVE VIEW REFRESH`, `REFRESH VIEW` - - `ALTER VIEW MODIFY QUERY`. Level: `VIEW`. Aliases: `ALTER TABLE MODIFY QUERY` +- `ALTER`. Level: `COLUMN`. + - `ALTER TABLE`. Level: `GROUP` + - `ALTER UPDATE`. Level: `COLUMN`. Aliases: `UPDATE` + - `ALTER DELETE`. Level: `COLUMN`. Aliases: `DELETE` + - `ALTER COLUMN`. Level: `GROUP` + - `ALTER ADD COLUMN`. Level: `COLUMN`. Aliases: `ADD COLUMN` + - `ALTER DROP COLUMN`. Level: `COLUMN`. Aliases: `DROP COLUMN` + - `ALTER MODIFY COLUMN`. Level: `COLUMN`. Aliases: `MODIFY COLUMN` + - `ALTER COMMENT COLUMN`. Level: `COLUMN`. Aliases: `COMMENT COLUMN` + - `ALTER CLEAR COLUMN`. Level: `COLUMN`. Aliases: `CLEAR COLUMN` + - `ALTER RENAME COLUMN`. Level: `COLUMN`. Aliases: `RENAME COLUMN` + - `ALTER INDEX`. Level: `GROUP`. Aliases: `INDEX` + - `ALTER ORDER BY`. Level: `TABLE`. Aliases: `ALTER MODIFY ORDER BY`, `MODIFY ORDER BY` + - `ALTER SAMPLE BY`. Level: `TABLE`. Aliases: `ALTER MODIFY SAMPLE BY`, `MODIFY SAMPLE BY` + - `ALTER ADD INDEX`. Level: `TABLE`. Aliases: `ADD INDEX` + - `ALTER DROP INDEX`. Level: `TABLE`. Aliases: `DROP INDEX` + - `ALTER MATERIALIZE INDEX`. Level: `TABLE`. Aliases: `MATERIALIZE INDEX` + - `ALTER CLEAR INDEX`. Level: `TABLE`. Aliases: `CLEAR INDEX` + - `ALTER CONSTRAINT`. Level: `GROUP`. Aliases: `CONSTRAINT` + - `ALTER ADD CONSTRAINT`. Level: `TABLE`. Aliases: `ADD CONSTRAINT` + - `ALTER DROP CONSTRAINT`. Level: `TABLE`. Aliases: `DROP CONSTRAINT` + - `ALTER TTL`. Level: `TABLE`. Aliases: `ALTER MODIFY TTL`, `MODIFY TTL` + - `ALTER MATERIALIZE TTL`. Level: `TABLE`. Aliases: `MATERIALIZE TTL` + - `ALTER SETTINGS`. Level: `TABLE`. Aliases: `ALTER SETTING`, `ALTER MODIFY SETTING`, `MODIFY SETTING` + - `ALTER MOVE PARTITION`. Level: `TABLE`. Aliases: `ALTER MOVE PART`, `MOVE PARTITION`, `MOVE PART` + - `ALTER FETCH PARTITION`. Level: `TABLE`. Aliases: `ALTER FETCH PART`, `FETCH PARTITION`, `FETCH PART` + - `ALTER FREEZE PARTITION`. Level: `TABLE`. Aliases: `FREEZE PARTITION` + - `ALTER VIEW` Level: `GROUP` + - `ALTER VIEW REFRESH`. Level: `VIEW`. Aliases: `ALTER LIVE VIEW REFRESH`, `REFRESH VIEW` + - `ALTER VIEW MODIFY QUERY`. Level: `VIEW`. Aliases: `ALTER TABLE MODIFY QUERY` Examples of how this hierarchy is treated: -- The `ALTER` privilege includes all other `ALTER*` privileges. -- `ALTER CONSTRAINT` includes `ALTER ADD CONSTRAINT` and `ALTER DROP CONSTRAINT` privileges. +- The `ALTER` privilege includes all other `ALTER*` privileges. +- `ALTER CONSTRAINT` includes `ALTER ADD CONSTRAINT` and `ALTER DROP CONSTRAINT` privileges. **Notes** -- The `MODIFY SETTING` privilege allows modifying table engine settings. It does not affect settings or server configuration parameters. -- The `ATTACH` operation needs the [CREATE](#grant-create) privilege. -- The `DETACH` operation needs the [DROP](#grant-drop) privilege. -- To stop mutation by the [KILL MUTATION](../../sql-reference/statements/kill.md#kill-mutation) query, you need to have a privilege to start this mutation. For example, if you want to stop the `ALTER UPDATE` query, you need the `ALTER UPDATE`, `ALTER TABLE`, or `ALTER` privilege. +- The `MODIFY SETTING` privilege allows modifying table engine settings. It does not affect settings or server configuration parameters. +- The `ATTACH` operation needs the [CREATE](#grant-create) privilege. +- The `DETACH` operation needs the [DROP](#grant-drop) privilege. +- To stop mutation by the [KILL MUTATION](../../sql-reference/statements/kill.md#kill-mutation) query, you need to have a privilege to start this mutation. For example, if you want to stop the `ALTER UPDATE` query, you need the `ALTER UPDATE`, `ALTER TABLE`, or `ALTER` privilege. ### CREATE Allows executing [CREATE](../../sql-reference/statements/create/index.md) and [ATTACH](../../sql-reference/statements/attach.md) DDL-queries according to the following hierarchy of privileges: -- `CREATE`. Level: `GROUP` - - `CREATE DATABASE`. Level: `DATABASE` - - `CREATE TABLE`. Level: `TABLE` - - `CREATE ARBITRARY TEMPORARY TABLE`. Level: `GLOBAL` - - `CREATE TEMPORARY TABLE`. Level: `GLOBAL` - - `CREATE VIEW`. Level: `VIEW` - - `CREATE DICTIONARY`. Level: `DICTIONARY` +- `CREATE`. Level: `GROUP` + - `CREATE DATABASE`. Level: `DATABASE` + - `CREATE TABLE`. Level: `TABLE` + - `CREATE ARBITRARY TEMPORARY TABLE`. Level: `GLOBAL` + - `CREATE TEMPORARY TABLE`. Level: `GLOBAL` + - `CREATE VIEW`. Level: `VIEW` + - `CREATE DICTIONARY`. Level: `DICTIONARY` **Notes** -- To delete the created table, a user needs [DROP](#grant-drop). +- To delete the created table, a user needs [DROP](#grant-drop). ### DROP Allows executing [DROP](../../sql-reference/statements/drop.md) and [DETACH](../../sql-reference/statements/detach.md) queries according to the following hierarchy of privileges: -- `DROP`. Level: `GROUP` - - `DROP DATABASE`. Level: `DATABASE` - - `DROP TABLE`. Level: `TABLE` - - `DROP VIEW`. Level: `VIEW` - - `DROP DICTIONARY`. Level: `DICTIONARY` +- `DROP`. Level: `GROUP` + - `DROP DATABASE`. Level: `DATABASE` + - `DROP TABLE`. Level: `TABLE` + - `DROP VIEW`. Level: `VIEW` + - `DROP DICTIONARY`. Level: `DICTIONARY` ### TRUNCATE @@ -349,11 +349,11 @@ Privilege level: `TABLE`. Allows executing `SHOW`, `DESCRIBE`, `USE`, and `EXISTS` queries according to the following hierarchy of privileges: -- `SHOW`. Level: `GROUP` - - `SHOW DATABASES`. Level: `DATABASE`. Allows to execute `SHOW DATABASES`, `SHOW CREATE DATABASE`, `USE ` queries. - - `SHOW TABLES`. Level: `TABLE`. Allows to execute `SHOW TABLES`, `EXISTS
`, `CHECK
` queries. - - `SHOW COLUMNS`. Level: `COLUMN`. Allows to execute `SHOW CREATE TABLE`, `DESCRIBE` queries. - - `SHOW DICTIONARIES`. Level: `DICTIONARY`. Allows to execute `SHOW DICTIONARIES`, `SHOW CREATE DICTIONARY`, `EXISTS ` queries. +- `SHOW`. Level: `GROUP` + - `SHOW DATABASES`. Level: `DATABASE`. Allows to execute `SHOW DATABASES`, `SHOW CREATE DATABASE`, `USE ` queries. + - `SHOW TABLES`. Level: `TABLE`. Allows to execute `SHOW TABLES`, `EXISTS
`, `CHECK
` queries. + - `SHOW COLUMNS`. Level: `COLUMN`. Allows to execute `SHOW CREATE TABLE`, `DESCRIBE` queries. + - `SHOW DICTIONARIES`. Level: `DICTIONARY`. Allows to execute `SHOW DICTIONARIES`, `SHOW CREATE DICTIONARY`, `EXISTS ` queries. **Notes** @@ -373,29 +373,29 @@ Privilege level: `GLOBAL`. Allows a user to execute queries that manage users, roles and row policies. -- `ACCESS MANAGEMENT`. Level: `GROUP` - - `CREATE USER`. Level: `GLOBAL` - - `ALTER USER`. Level: `GLOBAL` - - `DROP USER`. Level: `GLOBAL` - - `CREATE ROLE`. Level: `GLOBAL` - - `ALTER ROLE`. Level: `GLOBAL` - - `DROP ROLE`. Level: `GLOBAL` - - `ROLE ADMIN`. Level: `GLOBAL` - - `CREATE ROW POLICY`. Level: `GLOBAL`. Aliases: `CREATE POLICY` - - `ALTER ROW POLICY`. Level: `GLOBAL`. Aliases: `ALTER POLICY` - - `DROP ROW POLICY`. Level: `GLOBAL`. Aliases: `DROP POLICY` - - `CREATE QUOTA`. Level: `GLOBAL` - - `ALTER QUOTA`. Level: `GLOBAL` - - `DROP QUOTA`. Level: `GLOBAL` - - `CREATE SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `CREATE PROFILE` - - `ALTER SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `ALTER PROFILE` - - `DROP SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `DROP PROFILE` - - `SHOW ACCESS`. Level: `GROUP` - - `SHOW_USERS`. Level: `GLOBAL`. Aliases: `SHOW CREATE USER` - - `SHOW_ROLES`. Level: `GLOBAL`. Aliases: `SHOW CREATE ROLE` - - `SHOW_ROW_POLICIES`. Level: `GLOBAL`. Aliases: `SHOW POLICIES`, `SHOW CREATE ROW POLICY`, `SHOW CREATE POLICY` - - `SHOW_QUOTAS`. Level: `GLOBAL`. Aliases: `SHOW CREATE QUOTA` - - `SHOW_SETTINGS_PROFILES`. Level: `GLOBAL`. Aliases: `SHOW PROFILES`, `SHOW CREATE SETTINGS PROFILE`, `SHOW CREATE PROFILE` +- `ACCESS MANAGEMENT`. Level: `GROUP` + - `CREATE USER`. Level: `GLOBAL` + - `ALTER USER`. Level: `GLOBAL` + - `DROP USER`. Level: `GLOBAL` + - `CREATE ROLE`. Level: `GLOBAL` + - `ALTER ROLE`. Level: `GLOBAL` + - `DROP ROLE`. Level: `GLOBAL` + - `ROLE ADMIN`. Level: `GLOBAL` + - `CREATE ROW POLICY`. Level: `GLOBAL`. Aliases: `CREATE POLICY` + - `ALTER ROW POLICY`. Level: `GLOBAL`. Aliases: `ALTER POLICY` + - `DROP ROW POLICY`. Level: `GLOBAL`. Aliases: `DROP POLICY` + - `CREATE QUOTA`. Level: `GLOBAL` + - `ALTER QUOTA`. Level: `GLOBAL` + - `DROP QUOTA`. Level: `GLOBAL` + - `CREATE SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `CREATE PROFILE` + - `ALTER SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `ALTER PROFILE` + - `DROP SETTINGS PROFILE`. Level: `GLOBAL`. Aliases: `DROP PROFILE` + - `SHOW ACCESS`. Level: `GROUP` + - `SHOW_USERS`. Level: `GLOBAL`. Aliases: `SHOW CREATE USER` + - `SHOW_ROLES`. Level: `GLOBAL`. Aliases: `SHOW CREATE ROLE` + - `SHOW_ROW_POLICIES`. Level: `GLOBAL`. Aliases: `SHOW POLICIES`, `SHOW CREATE ROW POLICY`, `SHOW CREATE POLICY` + - `SHOW_QUOTAS`. Level: `GLOBAL`. Aliases: `SHOW CREATE QUOTA` + - `SHOW_SETTINGS_PROFILES`. Level: `GLOBAL`. Aliases: `SHOW PROFILES`, `SHOW CREATE SETTINGS PROFILE`, `SHOW CREATE PROFILE` The `ROLE ADMIN` privilege allows a user to assign and revoke any roles including those which are not assigned to the user with the admin option. @@ -403,29 +403,29 @@ The `ROLE ADMIN` privilege allows a user to assign and revoke any roles includin Allows a user to execute [SYSTEM](../../sql-reference/statements/system.md) queries according to the following hierarchy of privileges. -- `SYSTEM`. Level: `GROUP` - - `SYSTEM SHUTDOWN`. Level: `GLOBAL`. Aliases: `SYSTEM KILL`, `SHUTDOWN` - - `SYSTEM DROP CACHE`. Aliases: `DROP CACHE` - - `SYSTEM DROP DNS CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP DNS`, `DROP DNS CACHE`, `DROP DNS` - - `SYSTEM DROP MARK CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP MARK`, `DROP MARK CACHE`, `DROP MARKS` - - `SYSTEM DROP UNCOMPRESSED CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP UNCOMPRESSED`, `DROP UNCOMPRESSED CACHE`, `DROP UNCOMPRESSED` - - `SYSTEM RELOAD`. Level: `GROUP` - - `SYSTEM RELOAD CONFIG`. Level: `GLOBAL`. Aliases: `RELOAD CONFIG` - - `SYSTEM RELOAD DICTIONARY`. Level: `GLOBAL`. Aliases: `SYSTEM RELOAD DICTIONARIES`, `RELOAD DICTIONARY`, `RELOAD DICTIONARIES` - - `SYSTEM RELOAD EMBEDDED DICTIONARIES`. Level: `GLOBAL`. Aliases: `RELOAD EMBEDDED DICTIONARIES` - - `SYSTEM MERGES`. Level: `TABLE`. Aliases: `SYSTEM STOP MERGES`, `SYSTEM START MERGES`, `STOP MERGES`, `START MERGES` - - `SYSTEM TTL MERGES`. Level: `TABLE`. Aliases: `SYSTEM STOP TTL MERGES`, `SYSTEM START TTL MERGES`, `STOP TTL MERGES`, `START TTL MERGES` - - `SYSTEM FETCHES`. Level: `TABLE`. Aliases: `SYSTEM STOP FETCHES`, `SYSTEM START FETCHES`, `STOP FETCHES`, `START FETCHES` - - `SYSTEM MOVES`. Level: `TABLE`. Aliases: `SYSTEM STOP MOVES`, `SYSTEM START MOVES`, `STOP MOVES`, `START MOVES` - - `SYSTEM SENDS`. Level: `GROUP`. Aliases: `SYSTEM STOP SENDS`, `SYSTEM START SENDS`, `STOP SENDS`, `START SENDS` - - `SYSTEM DISTRIBUTED SENDS`. Level: `TABLE`. Aliases: `SYSTEM STOP DISTRIBUTED SENDS`, `SYSTEM START DISTRIBUTED SENDS`, `STOP DISTRIBUTED SENDS`, `START DISTRIBUTED SENDS` - - `SYSTEM REPLICATED SENDS`. Level: `TABLE`. Aliases: `SYSTEM STOP REPLICATED SENDS`, `SYSTEM START REPLICATED SENDS`, `STOP REPLICATED SENDS`, `START REPLICATED SENDS` - - `SYSTEM REPLICATION QUEUES`. Level: `TABLE`. Aliases: `SYSTEM STOP REPLICATION QUEUES`, `SYSTEM START REPLICATION QUEUES`, `STOP REPLICATION QUEUES`, `START REPLICATION QUEUES` - - `SYSTEM SYNC REPLICA`. Level: `TABLE`. Aliases: `SYNC REPLICA` - - `SYSTEM RESTART REPLICA`. Level: `TABLE`. Aliases: `RESTART REPLICA` - - `SYSTEM FLUSH`. Level: `GROUP` - - `SYSTEM FLUSH DISTRIBUTED`. Level: `TABLE`. Aliases: `FLUSH DISTRIBUTED` - - `SYSTEM FLUSH LOGS`. Level: `GLOBAL`. Aliases: `FLUSH LOGS` +- `SYSTEM`. Level: `GROUP` + - `SYSTEM SHUTDOWN`. Level: `GLOBAL`. Aliases: `SYSTEM KILL`, `SHUTDOWN` + - `SYSTEM DROP CACHE`. Aliases: `DROP CACHE` + - `SYSTEM DROP DNS CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP DNS`, `DROP DNS CACHE`, `DROP DNS` + - `SYSTEM DROP MARK CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP MARK`, `DROP MARK CACHE`, `DROP MARKS` + - `SYSTEM DROP UNCOMPRESSED CACHE`. Level: `GLOBAL`. Aliases: `SYSTEM DROP UNCOMPRESSED`, `DROP UNCOMPRESSED CACHE`, `DROP UNCOMPRESSED` + - `SYSTEM RELOAD`. Level: `GROUP` + - `SYSTEM RELOAD CONFIG`. Level: `GLOBAL`. Aliases: `RELOAD CONFIG` + - `SYSTEM RELOAD DICTIONARY`. Level: `GLOBAL`. Aliases: `SYSTEM RELOAD DICTIONARIES`, `RELOAD DICTIONARY`, `RELOAD DICTIONARIES` + - `SYSTEM RELOAD EMBEDDED DICTIONARIES`. Level: `GLOBAL`. Aliases: `RELOAD EMBEDDED DICTIONARIES` + - `SYSTEM MERGES`. Level: `TABLE`. Aliases: `SYSTEM STOP MERGES`, `SYSTEM START MERGES`, `STOP MERGES`, `START MERGES` + - `SYSTEM TTL MERGES`. Level: `TABLE`. Aliases: `SYSTEM STOP TTL MERGES`, `SYSTEM START TTL MERGES`, `STOP TTL MERGES`, `START TTL MERGES` + - `SYSTEM FETCHES`. Level: `TABLE`. Aliases: `SYSTEM STOP FETCHES`, `SYSTEM START FETCHES`, `STOP FETCHES`, `START FETCHES` + - `SYSTEM MOVES`. Level: `TABLE`. Aliases: `SYSTEM STOP MOVES`, `SYSTEM START MOVES`, `STOP MOVES`, `START MOVES` + - `SYSTEM SENDS`. Level: `GROUP`. Aliases: `SYSTEM STOP SENDS`, `SYSTEM START SENDS`, `STOP SENDS`, `START SENDS` + - `SYSTEM DISTRIBUTED SENDS`. Level: `TABLE`. Aliases: `SYSTEM STOP DISTRIBUTED SENDS`, `SYSTEM START DISTRIBUTED SENDS`, `STOP DISTRIBUTED SENDS`, `START DISTRIBUTED SENDS` + - `SYSTEM REPLICATED SENDS`. Level: `TABLE`. Aliases: `SYSTEM STOP REPLICATED SENDS`, `SYSTEM START REPLICATED SENDS`, `STOP REPLICATED SENDS`, `START REPLICATED SENDS` + - `SYSTEM REPLICATION QUEUES`. Level: `TABLE`. Aliases: `SYSTEM STOP REPLICATION QUEUES`, `SYSTEM START REPLICATION QUEUES`, `STOP REPLICATION QUEUES`, `START REPLICATION QUEUES` + - `SYSTEM SYNC REPLICA`. Level: `TABLE`. Aliases: `SYNC REPLICA` + - `SYSTEM RESTART REPLICA`. Level: `TABLE`. Aliases: `RESTART REPLICA` + - `SYSTEM FLUSH`. Level: `GROUP` + - `SYSTEM FLUSH DISTRIBUTED`. Level: `TABLE`. Aliases: `FLUSH DISTRIBUTED` + - `SYSTEM FLUSH LOGS`. Level: `GLOBAL`. Aliases: `FLUSH LOGS` The `SYSTEM RELOAD EMBEDDED DICTIONARIES` privilege implicitly granted by the `SYSTEM RELOAD DICTIONARY ON *.*` privilege. @@ -433,36 +433,36 @@ The `SYSTEM RELOAD EMBEDDED DICTIONARIES` privilege implicitly granted by the `S Allows using [introspection](../../operations/optimizing-performance/sampling-query-profiler.md) functions. -- `INTROSPECTION`. Level: `GROUP`. Aliases: `INTROSPECTION FUNCTIONS` - - `addressToLine`. Level: `GLOBAL` - - `addressToLineWithInlines`. Level: `GLOBAL` - - `addressToSymbol`. Level: `GLOBAL` - - `demangle`. Level: `GLOBAL` +- `INTROSPECTION`. Level: `GROUP`. Aliases: `INTROSPECTION FUNCTIONS` + - `addressToLine`. Level: `GLOBAL` + - `addressToLineWithInlines`. Level: `GLOBAL` + - `addressToSymbol`. Level: `GLOBAL` + - `demangle`. Level: `GLOBAL` ### SOURCES Allows using external data sources. Applies to [table engines](../../engines/table-engines/index.md) and [table functions](../../sql-reference/table-functions/index.md#table-functions). -- `SOURCES`. Level: `GROUP` - - `FILE`. Level: `GLOBAL` - - `URL`. Level: `GLOBAL` - - `REMOTE`. Level: `GLOBAL` - - `YSQL`. Level: `GLOBAL` - - `ODBC`. Level: `GLOBAL` - - `JDBC`. Level: `GLOBAL` - - `HDFS`. Level: `GLOBAL` - - `S3`. Level: `GLOBAL` +- `SOURCES`. Level: `GROUP` + - `FILE`. Level: `GLOBAL` + - `URL`. Level: `GLOBAL` + - `REMOTE`. Level: `GLOBAL` + - `YSQL`. Level: `GLOBAL` + - `ODBC`. Level: `GLOBAL` + - `JDBC`. Level: `GLOBAL` + - `HDFS`. Level: `GLOBAL` + - `S3`. Level: `GLOBAL` The `SOURCES` privilege enables use of all the sources. Also you can grant a privilege for each source individually. To use sources, you need additional privileges. Examples: -- To create a table with the [MySQL table engine](../../engines/table-engines/integrations/mysql.md), you need `CREATE TABLE (ON db.table_name)` and `MYSQL` privileges. -- To use the [mysql table function](../../sql-reference/table-functions/mysql.md), you need `CREATE TEMPORARY TABLE` and `MYSQL` privileges. +- To create a table with the [MySQL table engine](../../engines/table-engines/integrations/mysql.md), you need `CREATE TABLE (ON db.table_name)` and `MYSQL` privileges. +- To use the [mysql table function](../../sql-reference/table-functions/mysql.md), you need `CREATE TEMPORARY TABLE` and `MYSQL` privileges. ### dictGet -- `dictGet`. Aliases: `dictHas`, `dictGetHierarchy`, `dictIsIn` +- `dictGet`. Aliases: `dictHas`, `dictGetHierarchy`, `dictIsIn` Allows a user to execute [dictGet](../../sql-reference/functions/ext-dict-functions.md#dictget), [dictHas](../../sql-reference/functions/ext-dict-functions.md#dicthas), [dictGetHierarchy](../../sql-reference/functions/ext-dict-functions.md#dictgethierarchy), [dictIsIn](../../sql-reference/functions/ext-dict-functions.md#dictisin) functions. @@ -470,8 +470,8 @@ Privilege level: `DICTIONARY`. **Examples** -- `GRANT dictGet ON mydb.mydictionary TO john` -- `GRANT dictGet ON mydictionary TO john` +- `GRANT dictGet ON mydb.mydictionary TO john` +- `GRANT dictGet ON mydictionary TO john` ### ALL diff --git a/docs/en/sql-reference/statements/index.md b/docs/en/sql-reference/statements/index.md index 100b8889aaa..5aa61cf8d21 100644 --- a/docs/en/sql-reference/statements/index.md +++ b/docs/en/sql-reference/statements/index.md @@ -8,25 +8,25 @@ sidebar_label: List of statements Statements represent various kinds of action you can perform using SQL queries. Each kind of statement has it’s own syntax and usage details that are described separately: -- [SELECT](/docs/en/sql-reference/statements/select/index.md) -- [INSERT INTO](/docs/en/sql-reference/statements/insert-into.md) -- [CREATE](/docs/en/sql-reference/statements/create/index.md) -- [ALTER](/docs/en/sql-reference/statements/alter/index.md) -- [SYSTEM](/docs/en/sql-reference/statements/system.md) -- [SHOW](/docs/en/sql-reference/statements/show.md) -- [GRANT](/docs/en/sql-reference/statements/grant.md) -- [REVOKE](/docs/en/sql-reference/statements/revoke.md) -- [ATTACH](/docs/en/sql-reference/statements/attach.md) -- [CHECK TABLE](/docs/en/sql-reference/statements/check-table.md) -- [DESCRIBE TABLE](/docs/en/sql-reference/statements/describe-table.md) -- [DETACH](/docs/en/sql-reference/statements/detach.md) -- [DROP](/docs/en/sql-reference/statements/drop.md) -- [EXISTS](/docs/en/sql-reference/statements/exists.md) -- [KILL](/docs/en/sql-reference/statements/kill.md) -- [OPTIMIZE](/docs/en/sql-reference/statements/optimize.md) -- [RENAME](/docs/en/sql-reference/statements/rename.md) -- [SET](/docs/en/sql-reference/statements/set.md) -- [SET ROLE](/docs/en/sql-reference/statements/set-role.md) -- [TRUNCATE](/docs/en/sql-reference/statements/truncate.md) -- [USE](/docs/en/sql-reference/statements/use.md) -- [EXPLAIN](/docs/en/sql-reference/statements/explain.md) +- [SELECT](/docs/en/sql-reference/statements/select/index.md) +- [INSERT INTO](/docs/en/sql-reference/statements/insert-into.md) +- [CREATE](/docs/en/sql-reference/statements/create/index.md) +- [ALTER](/docs/en/sql-reference/statements/alter/index.md) +- [SYSTEM](/docs/en/sql-reference/statements/system.md) +- [SHOW](/docs/en/sql-reference/statements/show.md) +- [GRANT](/docs/en/sql-reference/statements/grant.md) +- [REVOKE](/docs/en/sql-reference/statements/revoke.md) +- [ATTACH](/docs/en/sql-reference/statements/attach.md) +- [CHECK TABLE](/docs/en/sql-reference/statements/check-table.md) +- [DESCRIBE TABLE](/docs/en/sql-reference/statements/describe-table.md) +- [DETACH](/docs/en/sql-reference/statements/detach.md) +- [DROP](/docs/en/sql-reference/statements/drop.md) +- [EXISTS](/docs/en/sql-reference/statements/exists.md) +- [KILL](/docs/en/sql-reference/statements/kill.md) +- [OPTIMIZE](/docs/en/sql-reference/statements/optimize.md) +- [RENAME](/docs/en/sql-reference/statements/rename.md) +- [SET](/docs/en/sql-reference/statements/set.md) +- [SET ROLE](/docs/en/sql-reference/statements/set-role.md) +- [TRUNCATE](/docs/en/sql-reference/statements/truncate.md) +- [USE](/docs/en/sql-reference/statements/use.md) +- [EXPLAIN](/docs/en/sql-reference/statements/explain.md) diff --git a/docs/en/sql-reference/statements/insert-into.md b/docs/en/sql-reference/statements/insert-into.md index 354ab95c598..d6e30827f9b 100644 --- a/docs/en/sql-reference/statements/insert-into.md +++ b/docs/en/sql-reference/statements/insert-into.md @@ -64,8 +64,8 @@ INSERT INTO insert_select_testtable VALUES (1, DEFAULT, 1) ; If a list of columns does not include all existing columns, the rest of the columns are filled with: -- The values calculated from the `DEFAULT` expressions specified in the table definition. -- Zeros and empty strings, if `DEFAULT` expressions are not defined. +- The values calculated from the `DEFAULT` expressions specified in the table definition. +- Zeros and empty strings, if `DEFAULT` expressions are not defined. Data can be passed to the INSERT in any [format](../../interfaces/formats.md#formats) supported by ClickHouse. The format must be specified explicitly in the query: @@ -208,22 +208,22 @@ Result: `INSERT` sorts the input data by primary key and splits them into partitions by a partition key. If you insert data into several partitions at once, it can significantly reduce the performance of the `INSERT` query. To avoid this: -- Add data in fairly large batches, such as 100,000 rows at a time. -- Group data by a partition key before uploading it to ClickHouse. +- Add data in fairly large batches, such as 100,000 rows at a time. +- Group data by a partition key before uploading it to ClickHouse. Performance will not decrease if: -- Data is added in real time. -- You upload data that is usually sorted by time. +- Data is added in real time. +- You upload data that is usually sorted by time. It's also possible to asynchronously insert data in small but frequent inserts. The data from such insertions is combined into batches and then safely inserted into a table. To enable the asynchronous mode, switch on the [async_insert](../../operations/settings/settings.md#async-insert) setting. Note that asynchronous insertions are supported only over HTTP protocol, and deduplication is not supported for them. **See Also** -- [async_insert](../../operations/settings/settings.md#async-insert) -- [async_insert_threads](../../operations/settings/settings.md#async-insert-threads) -- [wait_for_async_insert](../../operations/settings/settings.md#wait-for-async-insert) -- [wait_for_async_insert_timeout](../../operations/settings/settings.md#wait-for-async-insert-timeout) -- [async_insert_max_data_size](../../operations/settings/settings.md#async-insert-max-data-size) -- [async_insert_busy_timeout_ms](../../operations/settings/settings.md#async-insert-busy-timeout-ms) -- [async_insert_stale_timeout_ms](../../operations/settings/settings.md#async-insert-stale-timeout-ms) +- [async_insert](../../operations/settings/settings.md#async-insert) +- [async_insert_threads](../../operations/settings/settings.md#async-insert-threads) +- [wait_for_async_insert](../../operations/settings/settings.md#wait-for-async-insert) +- [wait_for_async_insert_timeout](../../operations/settings/settings.md#wait-for-async-insert-timeout) +- [async_insert_max_data_size](../../operations/settings/settings.md#async-insert-max-data-size) +- [async_insert_busy_timeout_ms](../../operations/settings/settings.md#async-insert-busy-timeout-ms) +- [async_insert_stale_timeout_ms](../../operations/settings/settings.md#async-insert-stale-timeout-ms) diff --git a/docs/en/sql-reference/statements/optimize.md b/docs/en/sql-reference/statements/optimize.md index 427ee75cd5f..8a7411b2594 100644 --- a/docs/en/sql-reference/statements/optimize.md +++ b/docs/en/sql-reference/statements/optimize.md @@ -21,10 +21,10 @@ The `OPTIMIZE` query is supported for [MergeTree](../../engines/table-engines/me When `OPTIMIZE` is used with the [ReplicatedMergeTree](../../engines/table-engines/mergetree-family/replication.md) family of table engines, ClickHouse creates a task for merging and waits for execution on all replicas (if the [alter_sync](../../operations/settings/settings.md#alter-sync) setting is set to `2`) or on current replica (if the [alter_sync](../../operations/settings/settings.md#alter-sync) setting is set to `1`). -- If `OPTIMIZE` does not perform a merge for any reason, it does not notify the client. To enable notifications, use the [optimize_throw_if_noop](../../operations/settings/settings.md#setting-optimize_throw_if_noop) setting. -- If you specify a `PARTITION`, only the specified partition is optimized. [How to set partition expression](alter/partition.md#how-to-set-partition-expression). -- If you specify `FINAL`, optimization is performed even when all the data is already in one part. You can control this behaviour with [optimize_skip_merged_partitions](../../operations/settings/settings.md#optimize-skip-merged-partitions). Also, the merge is forced even if concurrent merges are performed. -- If you specify `DEDUPLICATE`, then completely identical rows (unless by-clause is specified) will be deduplicated (all columns are compared), it makes sense only for the MergeTree engine. +- If `OPTIMIZE` does not perform a merge for any reason, it does not notify the client. To enable notifications, use the [optimize_throw_if_noop](../../operations/settings/settings.md#setting-optimize_throw_if_noop) setting. +- If you specify a `PARTITION`, only the specified partition is optimized. [How to set partition expression](alter/partition.md#how-to-set-partition-expression). +- If you specify `FINAL`, optimization is performed even when all the data is already in one part. You can control this behaviour with [optimize_skip_merged_partitions](../../operations/settings/settings.md#optimize-skip-merged-partitions). Also, the merge is forced even if concurrent merges are performed. +- If you specify `DEDUPLICATE`, then completely identical rows (unless by-clause is specified) will be deduplicated (all columns are compared), it makes sense only for the MergeTree engine. You can specify how long (in seconds) to wait for inactive replicas to execute `OPTIMIZE` queries by the [replication_wait_for_inactive_replica_timeout](../../operations/settings/settings.md#replication-wait-for-inactive-replica-timeout) setting. diff --git a/docs/en/sql-reference/statements/rename.md b/docs/en/sql-reference/statements/rename.md index cc33a7c41d4..a2d4b15df13 100644 --- a/docs/en/sql-reference/statements/rename.md +++ b/docs/en/sql-reference/statements/rename.md @@ -60,4 +60,4 @@ RENAME DICTIONARY [db0.]dict_A TO [db1.]dict_B [,...] [ON CLUSTER cluster] **See Also** -- [Dictionaries](../../sql-reference/dictionaries/index.md) +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/en/sql-reference/statements/select/array-join.md b/docs/en/sql-reference/statements/select/array-join.md index 3d88a0f9b7a..9045ec4aba3 100644 --- a/docs/en/sql-reference/statements/select/array-join.md +++ b/docs/en/sql-reference/statements/select/array-join.md @@ -23,8 +23,8 @@ You can specify only one `ARRAY JOIN` clause in a `SELECT` query. Supported types of `ARRAY JOIN` are listed below: -- `ARRAY JOIN` - In base case, empty arrays are not included in the result of `JOIN`. -- `LEFT ARRAY JOIN` - The result of `JOIN` contains rows with empty arrays. The value for an empty array is set to the default value for the array element type (usually 0, empty string or NULL). +- `ARRAY JOIN` - In base case, empty arrays are not included in the result of `JOIN`. +- `LEFT ARRAY JOIN` - The result of `JOIN` contains rows with empty arrays. The value for an empty array is set to the default value for the array element type (usually 0, empty string or NULL). ## Basic ARRAY JOIN Examples diff --git a/docs/en/sql-reference/statements/select/distinct.md b/docs/en/sql-reference/statements/select/distinct.md index b2d940af3bb..10326b0ef8f 100644 --- a/docs/en/sql-reference/statements/select/distinct.md +++ b/docs/en/sql-reference/statements/select/distinct.md @@ -105,6 +105,6 @@ Take this implementation specificity into account when programming queries. It is possible to obtain the same result by applying [GROUP BY](../../../sql-reference/statements/select/group-by.md) across the same set of values as specified as `SELECT` clause, without using any aggregate functions. But there are few differences from `GROUP BY` approach: -- `DISTINCT` can be applied together with `GROUP BY`. -- When [ORDER BY](../../../sql-reference/statements/select/order-by.md) is omitted and [LIMIT](../../../sql-reference/statements/select/limit.md) is defined, the query stops running immediately after the required number of different rows has been read. -- Data blocks are output as they are processed, without waiting for the entire query to finish running. +- `DISTINCT` can be applied together with `GROUP BY`. +- When [ORDER BY](../../../sql-reference/statements/select/order-by.md) is omitted and [LIMIT](../../../sql-reference/statements/select/limit.md) is defined, the query stops running immediately after the required number of different rows has been read. +- Data blocks are output as they are processed, without waiting for the entire query to finish running. diff --git a/docs/en/sql-reference/statements/select/except.md b/docs/en/sql-reference/statements/select/except.md index f73cbff9819..cc4bb9d1c24 100644 --- a/docs/en/sql-reference/statements/select/except.md +++ b/docs/en/sql-reference/statements/select/except.md @@ -149,5 +149,5 @@ Result: **See Also** -- [UNION](union.md#union-clause) -- [INTERSECT](intersect.md#intersect-clause) +- [UNION](union.md#union-clause) +- [INTERSECT](intersect.md#intersect-clause) diff --git a/docs/en/sql-reference/statements/select/from.md b/docs/en/sql-reference/statements/select/from.md index fb6c1f94902..4ca8e8287c0 100644 --- a/docs/en/sql-reference/statements/select/from.md +++ b/docs/en/sql-reference/statements/select/from.md @@ -7,9 +7,9 @@ sidebar_label: FROM The `FROM` clause specifies the source to read data from: -- [Table](../../../engines/table-engines/index.md) -- [Subquery](../../../sql-reference/statements/select/index.md) -- [Table function](../../../sql-reference/table-functions/index.md#table-functions) +- [Table](../../../engines/table-engines/index.md) +- [Subquery](../../../sql-reference/statements/select/index.md) +- [Table function](../../../sql-reference/table-functions/index.md#table-functions) [JOIN](../../../sql-reference/statements/select/join.md) and [ARRAY JOIN](../../../sql-reference/statements/select/array-join.md) clauses may also be used to extend the functionality of the `FROM` clause. @@ -31,8 +31,8 @@ There are drawbacks to using `FINAL` (see below). Queries that use `FINAL` are executed slightly slower than similar queries that do not, because: -- Data is merged during query execution. -- Queries with `FINAL` read primary key columns in addition to the columns specified in the query. +- Data is merged during query execution. +- Queries with `FINAL` read primary key columns in addition to the columns specified in the query. **In most cases, avoid using `FINAL`.** The common approach is to use different queries that assume the background processes of the `MergeTree` engine have’t happened yet and deal with it by applying aggregation (for example, to discard duplicates). diff --git a/docs/en/sql-reference/statements/select/group-by.md b/docs/en/sql-reference/statements/select/group-by.md index 1018b24f50b..36d401ba04a 100644 --- a/docs/en/sql-reference/statements/select/group-by.md +++ b/docs/en/sql-reference/statements/select/group-by.md @@ -7,9 +7,9 @@ sidebar_label: GROUP BY `GROUP BY` clause switches the `SELECT` query into an aggregation mode, which works as follows: -- `GROUP BY` clause contains a list of expressions (or a single expression, which is considered to be the list of length one). This list acts as a “grouping key”, while each individual expression will be referred to as a “key expression”. -- All the expressions in the [SELECT](../../../sql-reference/statements/select/index.md), [HAVING](../../../sql-reference/statements/select/having.md), and [ORDER BY](../../../sql-reference/statements/select/order-by.md) clauses **must** be calculated based on key expressions **or** on [aggregate functions](../../../sql-reference/aggregate-functions/index.md) over non-key expressions (including plain columns). In other words, each column selected from the table must be used either in a key expression or inside an aggregate function, but not both. -- Result of aggregating `SELECT` query will contain as many rows as there were unique values of “grouping key” in source table. Usually, this significantly reduces the row count, often by orders of magnitude, but not necessarily: row count stays the same if all “grouping key” values were distinct. +- `GROUP BY` clause contains a list of expressions (or a single expression, which is considered to be the list of length one). This list acts as a “grouping key”, while each individual expression will be referred to as a “key expression”. +- All the expressions in the [SELECT](../../../sql-reference/statements/select/index.md), [HAVING](../../../sql-reference/statements/select/having.md), and [ORDER BY](../../../sql-reference/statements/select/order-by.md) clauses **must** be calculated based on key expressions **or** on [aggregate functions](../../../sql-reference/aggregate-functions/index.md) over non-key expressions (including plain columns). In other words, each column selected from the table must be used either in a key expression or inside an aggregate function, but not both. +- Result of aggregating `SELECT` query will contain as many rows as there were unique values of “grouping key” in source table. Usually, this significantly reduces the row count, often by orders of magnitude, but not necessarily: row count stays the same if all “grouping key” values were distinct. When you want to group data in the table by column numbers instead of column names, enable the setting [enable_positional_arguments](../../../operations/settings/settings.md#enable-positional-arguments). @@ -220,11 +220,11 @@ If the `WITH TOTALS` modifier is specified, another row will be calculated. This This extra row is only produced in `JSON*`, `TabSeparated*`, and `Pretty*` formats, separately from the other rows: -- In `XML` and `JSON*` formats, this row is output as a separate ‘totals’ field. -- In `TabSeparated*`, `CSV*` and `Vertical` formats, the row comes after the main result, preceded by an empty row (after the other data). -- In `Pretty*` formats, the row is output as a separate table after the main result. -- In `Template` format, the row is output according to specified template. -- In the other formats it is not available. +- In `XML` and `JSON*` formats, this row is output as a separate ‘totals’ field. +- In `TabSeparated*`, `CSV*` and `Vertical` formats, the row comes after the main result, preceded by an empty row (after the other data). +- In `Pretty*` formats, the row is output as a separate table after the main result. +- In `Template` format, the row is output according to specified template. +- In the other formats it is not available. :::note totals is output in the results of `SELECT` queries, and is not output in `INSERT INTO ... SELECT`. diff --git a/docs/en/sql-reference/statements/select/index.md b/docs/en/sql-reference/statements/select/index.md index f65e40dede5..2863c5c0116 100644 --- a/docs/en/sql-reference/statements/select/index.md +++ b/docs/en/sql-reference/statements/select/index.md @@ -34,24 +34,24 @@ All clauses are optional, except for the required list of expressions immediatel Specifics of each optional clause are covered in separate sections, which are listed in the same order as they are executed: -- [WITH clause](../../../sql-reference/statements/select/with.md) -- [SELECT clause](#select-clause) -- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md) -- [FROM clause](../../../sql-reference/statements/select/from.md) -- [SAMPLE clause](../../../sql-reference/statements/select/sample.md) -- [JOIN clause](../../../sql-reference/statements/select/join.md) -- [PREWHERE clause](../../../sql-reference/statements/select/prewhere.md) -- [WHERE clause](../../../sql-reference/statements/select/where.md) -- [GROUP BY clause](../../../sql-reference/statements/select/group-by.md) -- [LIMIT BY clause](../../../sql-reference/statements/select/limit-by.md) -- [HAVING clause](../../../sql-reference/statements/select/having.md) -- [LIMIT clause](../../../sql-reference/statements/select/limit.md) -- [OFFSET clause](../../../sql-reference/statements/select/offset.md) -- [UNION clause](../../../sql-reference/statements/select/union.md) -- [INTERSECT clause](../../../sql-reference/statements/select/intersect.md) -- [EXCEPT clause](../../../sql-reference/statements/select/except.md) -- [INTO OUTFILE clause](../../../sql-reference/statements/select/into-outfile.md) -- [FORMAT clause](../../../sql-reference/statements/select/format.md) +- [WITH clause](../../../sql-reference/statements/select/with.md) +- [SELECT clause](#select-clause) +- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md) +- [FROM clause](../../../sql-reference/statements/select/from.md) +- [SAMPLE clause](../../../sql-reference/statements/select/sample.md) +- [JOIN clause](../../../sql-reference/statements/select/join.md) +- [PREWHERE clause](../../../sql-reference/statements/select/prewhere.md) +- [WHERE clause](../../../sql-reference/statements/select/where.md) +- [GROUP BY clause](../../../sql-reference/statements/select/group-by.md) +- [LIMIT BY clause](../../../sql-reference/statements/select/limit-by.md) +- [HAVING clause](../../../sql-reference/statements/select/having.md) +- [LIMIT clause](../../../sql-reference/statements/select/limit.md) +- [OFFSET clause](../../../sql-reference/statements/select/offset.md) +- [UNION clause](../../../sql-reference/statements/select/union.md) +- [INTERSECT clause](../../../sql-reference/statements/select/intersect.md) +- [EXCEPT clause](../../../sql-reference/statements/select/except.md) +- [INTO OUTFILE clause](../../../sql-reference/statements/select/into-outfile.md) +- [FORMAT clause](../../../sql-reference/statements/select/format.md) ## SELECT Clause @@ -123,11 +123,11 @@ Columns that matched the `COLUMNS` expression can have different data types. If You can put an asterisk in any part of a query instead of an expression. When the query is analyzed, the asterisk is expanded to a list of all table columns (excluding the `MATERIALIZED` and `ALIAS` columns). There are only a few cases when using an asterisk is justified: -- When creating a table dump. -- For tables containing just a few columns, such as system tables. -- For getting information about what columns are in a table. In this case, set `LIMIT 1`. But it is better to use the `DESC TABLE` query. -- When there is strong filtration on a small number of columns using `PREWHERE`. -- In subqueries (since columns that aren’t needed for the external query are excluded from subqueries). +- When creating a table dump. +- For tables containing just a few columns, such as system tables. +- For getting information about what columns are in a table. In this case, set `LIMIT 1`. But it is better to use the `DESC TABLE` query. +- When there is strong filtration on a small number of columns using `PREWHERE`. +- In subqueries (since columns that aren’t needed for the external query are excluded from subqueries). In all other cases, we do not recommend using the asterisk, since it only gives you the drawbacks of a columnar DBMS instead of the advantages. In other words using the asterisk is not recommended. @@ -151,17 +151,17 @@ The `GROUP BY`, `ORDER BY`, and `LIMIT BY` clauses can support positional argume If the query omits the `DISTINCT`, `GROUP BY` and `ORDER BY` clauses and the `IN` and `JOIN` subqueries, the query will be completely stream processed, using O(1) amount of RAM. Otherwise, the query might consume a lot of RAM if the appropriate restrictions are not specified: -- `max_memory_usage` -- `max_rows_to_group_by` -- `max_rows_to_sort` -- `max_rows_in_distinct` -- `max_bytes_in_distinct` -- `max_rows_in_set` -- `max_bytes_in_set` -- `max_rows_in_join` -- `max_bytes_in_join` -- `max_bytes_before_external_sort` -- `max_bytes_before_external_group_by` +- `max_memory_usage` +- `max_rows_to_group_by` +- `max_rows_to_sort` +- `max_rows_in_distinct` +- `max_bytes_in_distinct` +- `max_rows_in_set` +- `max_bytes_in_set` +- `max_rows_in_join` +- `max_bytes_in_join` +- `max_bytes_before_external_sort` +- `max_bytes_before_external_group_by` For more information, see the section “Settings”. It is possible to use external sorting (saving temporary tables to a disk) and external aggregation. diff --git a/docs/en/sql-reference/statements/select/intersect.md b/docs/en/sql-reference/statements/select/intersect.md index ea7a39421a5..8c0ee6b2e96 100644 --- a/docs/en/sql-reference/statements/select/intersect.md +++ b/docs/en/sql-reference/statements/select/intersect.md @@ -153,5 +153,5 @@ Result: **See Also** -- [UNION](union.md#union-clause) -- [EXCEPT](except.md#except-clause) +- [UNION](union.md#union-clause) +- [EXCEPT](except.md#except-clause) diff --git a/docs/en/sql-reference/statements/select/into-outfile.md b/docs/en/sql-reference/statements/select/into-outfile.md index a14b23f6689..bd6db9e7d55 100644 --- a/docs/en/sql-reference/statements/select/into-outfile.md +++ b/docs/en/sql-reference/statements/select/into-outfile.md @@ -21,10 +21,10 @@ SELECT INTO OUTFILE file_name [AND STDOUT] [COMPRESSION type [LEVEL ## Implementation Details -- This functionality is available in the [command-line client](../../../interfaces/cli.md) and [clickhouse-local](../../../operations/utilities/clickhouse-local.md). Thus a query sent via [HTTP interface](../../../interfaces/http.md) will fail. -- The query will fail if a file with the same file name already exists. -- The default [output format](../../../interfaces/formats.md) is `TabSeparated` (like in the command-line client batch mode). Use [FORMAT](format.md) clause to change it. -- If `AND STDOUT` is mentioned in the query then the output that is written to the file is also displayed on standard output. If used with compression, the plaintext is displayed on standard output. +- This functionality is available in the [command-line client](../../../interfaces/cli.md) and [clickhouse-local](../../../operations/utilities/clickhouse-local.md). Thus a query sent via [HTTP interface](../../../interfaces/http.md) will fail. +- The query will fail if a file with the same file name already exists. +- The default [output format](../../../interfaces/formats.md) is `TabSeparated` (like in the command-line client batch mode). Use [FORMAT](format.md) clause to change it. +- If `AND STDOUT` is mentioned in the query then the output that is written to the file is also displayed on standard output. If used with compression, the plaintext is displayed on standard output. **Example** diff --git a/docs/en/sql-reference/statements/select/join.md b/docs/en/sql-reference/statements/select/join.md index 62947dcefdd..08ffae838f8 100644 --- a/docs/en/sql-reference/statements/select/join.md +++ b/docs/en/sql-reference/statements/select/join.md @@ -26,20 +26,20 @@ Expressions from `ON` clause and columns from `USING` clause are called “join All standard [SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL)) types are supported: -- `INNER JOIN`, only matching rows are returned. -- `LEFT OUTER JOIN`, non-matching rows from left table are returned in addition to matching rows. -- `RIGHT OUTER JOIN`, non-matching rows from right table are returned in addition to matching rows. -- `FULL OUTER JOIN`, non-matching rows from both tables are returned in addition to matching rows. -- `CROSS JOIN`, produces cartesian product of whole tables, “join keys” are **not** specified. +- `INNER JOIN`, only matching rows are returned. +- `LEFT OUTER JOIN`, non-matching rows from left table are returned in addition to matching rows. +- `RIGHT OUTER JOIN`, non-matching rows from right table are returned in addition to matching rows. +- `FULL OUTER JOIN`, non-matching rows from both tables are returned in addition to matching rows. +- `CROSS JOIN`, produces cartesian product of whole tables, “join keys” are **not** specified. `JOIN` without specified type implies `INNER`. Keyword `OUTER` can be safely omitted. Alternative syntax for `CROSS JOIN` is specifying multiple tables in [FROM clause](../../../sql-reference/statements/select/from.md) separated by commas. Additional join types available in ClickHouse: -- `LEFT SEMI JOIN` and `RIGHT SEMI JOIN`, a whitelist on “join keys”, without producing a cartesian product. -- `LEFT ANTI JOIN` and `RIGHT ANTI JOIN`, a blacklist on “join keys”, without producing a cartesian product. -- `LEFT ANY JOIN`, `RIGHT ANY JOIN` and `INNER ANY JOIN`, partially (for opposite side of `LEFT` and `RIGHT`) or completely (for `INNER` and `FULL`) disables the cartesian product for standard `JOIN` types. -- `ASOF JOIN` and `LEFT ASOF JOIN`, joining sequences with a non-exact match. `ASOF JOIN` usage is described below. +- `LEFT SEMI JOIN` and `RIGHT SEMI JOIN`, a whitelist on “join keys”, without producing a cartesian product. +- `LEFT ANTI JOIN` and `RIGHT ANTI JOIN`, a blacklist on “join keys”, without producing a cartesian product. +- `LEFT ANY JOIN`, `RIGHT ANY JOIN` and `INNER ANY JOIN`, partially (for opposite side of `LEFT` and `RIGHT`) or completely (for `INNER` and `FULL`) disables the cartesian product for standard `JOIN` types. +- `ASOF JOIN` and `LEFT ASOF JOIN`, joining sequences with a non-exact match. `ASOF JOIN` usage is described below. :::note When [join_algorithm](../../../operations/settings/settings.md#settings-join_algorithm) is set to `partial_merge`, `RIGHT JOIN` and `FULL JOIN` are supported only with `ALL` strictness (`SEMI`, `ANTI`, `ANY`, and `ASOF` are not supported). @@ -166,9 +166,9 @@ Result: Algorithm requires the special column in tables. This column: -- Must contain an ordered sequence. -- Can be one of the following types: [Int, UInt](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal](../../../sql-reference/data-types/decimal.md). -- Can’t be the only column in the `JOIN` clause. +- Must contain an ordered sequence. +- Can be one of the following types: [Int, UInt](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal](../../../sql-reference/data-types/decimal.md). +- Can’t be the only column in the `JOIN` clause. Syntax `ASOF JOIN ... ON`: @@ -198,7 +198,7 @@ For example, consider the following tables: table_1 table_2 event | ev_time | user_id event | ev_time | user_id - ----------|---------|---------- ----------|---------|---------- + ----------|---------|---------- ----------|---------|---------- ... ... event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42 ... event_2_2 | 12:30 | 42 @@ -215,8 +215,8 @@ For example, consider the following tables: There are two ways to execute join involving distributed tables: -- When using a normal `JOIN`, the query is sent to remote servers. Subqueries are run on each of them in order to make the right table, and the join is performed with this table. In other words, the right table is formed on each server separately. -- When using `GLOBAL ... JOIN`, first the requestor server runs a subquery to calculate the right table. This temporary table is passed to each remote server, and queries are run on them using the temporary data that was transmitted. +- When using a normal `JOIN`, the query is sent to remote servers. Subqueries are run on each of them in order to make the right table, and the join is performed with this table. In other words, the right table is formed on each server separately. +- When using `GLOBAL ... JOIN`, first the requestor server runs a subquery to calculate the right table. This temporary table is passed to each remote server, and queries are run on them using the temporary data that was transmitted. Be careful when using `GLOBAL`. For more information, see the [Distributed subqueries](../../../sql-reference/operators/in.md#select-distributed-subqueries) section. @@ -274,12 +274,12 @@ The `USING` clause specifies one or more columns to join, which establishes the For multiple `JOIN` clauses in a single `SELECT` query: -- Taking all the columns via `*` is available only if tables are joined, not subqueries. -- The `PREWHERE` clause is not available. +- Taking all the columns via `*` is available only if tables are joined, not subqueries. +- The `PREWHERE` clause is not available. For `ON`, `WHERE`, and `GROUP BY` clauses: -- Arbitrary expressions cannot be used in `ON`, `WHERE`, and `GROUP BY` clauses, but you can define an expression in a `SELECT` clause and then use it in these clauses via an alias. +- Arbitrary expressions cannot be used in `ON`, `WHERE`, and `GROUP BY` clauses, but you can define an expression in a `SELECT` clause and then use it in these clauses via an alias. ### Performance @@ -297,8 +297,8 @@ By default, ClickHouse uses the [hash join](https://en.wikipedia.org/wiki/Hash_j If you need to restrict `JOIN` operation memory consumption use the following settings: -- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — Limits number of rows in the hash table. -- [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — Limits size of the hash table. +- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — Limits number of rows in the hash table. +- [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — Limits size of the hash table. When any of these limits is reached, ClickHouse acts as the [join_overflow_mode](../../../operations/settings/query-complexity.md#settings-join_overflow_mode) setting instructs. diff --git a/docs/en/sql-reference/statements/select/limit-by.md b/docs/en/sql-reference/statements/select/limit-by.md index 28f3d7e86d7..4cfc56ecbf9 100644 --- a/docs/en/sql-reference/statements/select/limit-by.md +++ b/docs/en/sql-reference/statements/select/limit-by.md @@ -9,8 +9,8 @@ A query with the `LIMIT n BY expressions` clause selects the first `n` rows for ClickHouse supports the following syntax variants: -- `LIMIT [offset_value, ]n BY expressions` -- `LIMIT n OFFSET offset_value BY expressions` +- `LIMIT [offset_value, ]n BY expressions` +- `LIMIT n OFFSET offset_value BY expressions` During query processing, ClickHouse selects data ordered by sorting key. The sorting key is set explicitly using an [ORDER BY](order-by.md#select-order-by) clause or implicitly as a property of the table engine (row order is only guaranteed when using [ORDER BY](order-by.md#select-order-by), otherwise the row blocks will not be ordered due to multi-threading). Then ClickHouse applies `LIMIT n BY expressions` and returns the first `n` rows for each distinct combination of `expressions`. If `OFFSET` is specified, then for each data block that belongs to a distinct combination of `expressions`, ClickHouse skips `offset_value` number of rows from the beginning of the block and returns a maximum of `n` rows as a result. If `offset_value` is bigger than the number of rows in the data block, ClickHouse returns zero rows from the block. diff --git a/docs/en/sql-reference/statements/select/order-by.md b/docs/en/sql-reference/statements/select/order-by.md index e231a1cc72c..62feca9ecf6 100644 --- a/docs/en/sql-reference/statements/select/order-by.md +++ b/docs/en/sql-reference/statements/select/order-by.md @@ -16,8 +16,8 @@ If the ORDER BY clause is omitted, the order of the rows is also undefined, and There are two approaches to `NaN` and `NULL` sorting order: -- By default or with the `NULLS LAST` modifier: first the values, then `NaN`, then `NULL`. -- With the `NULLS FIRST` modifier: first `NULL`, then `NaN`, then other values. +- By default or with the `NULLS LAST` modifier: first the values, then `NaN`, then `NULL`. +- With the `NULLS FIRST` modifier: first `NULL`, then `NaN`, then other values. ### Example diff --git a/docs/en/sql-reference/statements/select/sample.md b/docs/en/sql-reference/statements/select/sample.md index fb44d7c5a44..a0c9257ed94 100644 --- a/docs/en/sql-reference/statements/select/sample.md +++ b/docs/en/sql-reference/statements/select/sample.md @@ -11,9 +11,9 @@ When data sampling is enabled, the query is not performed on all the data, but o Approximated query processing can be useful in the following cases: -- When you have strict latency requirements (like below 100ms) but you can’t justify the cost of additional hardware resources to meet them. -- When your raw data is not accurate, so approximation does not noticeably degrade the quality. -- Business requirements target approximate results (for cost-effectiveness, or to market exact results to premium users). +- When you have strict latency requirements (like below 100ms) but you can’t justify the cost of additional hardware resources to meet them. +- When your raw data is not accurate, so approximation does not noticeably degrade the quality. +- Business requirements target approximate results (for cost-effectiveness, or to market exact results to premium users). :::note You can only use sampling with the tables in the [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) family, and only if the sampling expression was specified during table creation (see [MergeTree engine](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)). @@ -21,9 +21,9 @@ You can only use sampling with the tables in the [MergeTree](../../../engines/ta The features of data sampling are listed below: -- Data sampling is a deterministic mechanism. The result of the same `SELECT .. SAMPLE` query is always the same. -- Sampling works consistently for different tables. For tables with a single sampling key, a sample with the same coefficient always selects the same subset of possible data. For example, a sample of user IDs takes rows with the same subset of all the possible user IDs from different tables. This means that you can use the sample in subqueries in the [IN](../../../sql-reference/operators/in.md) clause. Also, you can join samples using the [JOIN](../../../sql-reference/statements/select/join.md) clause. -- Sampling allows reading less data from a disk. Note that you must specify the sampling key correctly. For more information, see [Creating a MergeTree Table](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table). +- Data sampling is a deterministic mechanism. The result of the same `SELECT .. SAMPLE` query is always the same. +- Sampling works consistently for different tables. For tables with a single sampling key, a sample with the same coefficient always selects the same subset of possible data. For example, a sample of user IDs takes rows with the same subset of all the possible user IDs from different tables. This means that you can use the sample in subqueries in the [IN](../../../sql-reference/operators/in.md) clause. Also, you can join samples using the [JOIN](../../../sql-reference/statements/select/join.md) clause. +- Sampling allows reading less data from a disk. Note that you must specify the sampling key correctly. For more information, see [Creating a MergeTree Table](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table). For the `SAMPLE` clause the following syntax is supported: diff --git a/docs/en/sql-reference/statements/select/union.md b/docs/en/sql-reference/statements/select/union.md index 002aeaa4488..92a4ed1bb20 100644 --- a/docs/en/sql-reference/statements/select/union.md +++ b/docs/en/sql-reference/statements/select/union.md @@ -81,8 +81,8 @@ Queries that are parts of `UNION/UNION ALL/UNION DISTINCT` can be run simultaneo **See Also** -- [insert_null_as_default](../../../operations/settings/settings.md#insert_null_as_default) setting. -- [union_default_mode](../../../operations/settings/settings.md#union-default-mode) setting. +- [insert_null_as_default](../../../operations/settings/settings.md#insert_null_as_default) setting. +- [union_default_mode](../../../operations/settings/settings.md#union-default-mode) setting. [Original article](https://clickhouse.com/docs/en/sql-reference/statements/select/union/) diff --git a/docs/en/sql-reference/statements/show.md b/docs/en/sql-reference/statements/show.md index 599dda63400..6a7b8aab014 100644 --- a/docs/en/sql-reference/statements/show.md +++ b/docs/en/sql-reference/statements/show.md @@ -96,7 +96,7 @@ Result: **See also** -- [CREATE DATABASE](https://clickhouse.com/docs/en/sql-reference/statements/create/database/#query-language-create-database) +- [CREATE DATABASE](https://clickhouse.com/docs/en/sql-reference/statements/create/database/#query-language-create-database) ## SHOW PROCESSLIST @@ -195,8 +195,8 @@ Result: **See also** -- [Create Tables](https://clickhouse.com/docs/en/getting-started/tutorial/#create-tables) -- [SHOW CREATE TABLE](https://clickhouse.com/docs/en/sql-reference/statements/show/#show-create-table) +- [Create Tables](https://clickhouse.com/docs/en/getting-started/tutorial/#create-tables) +- [SHOW CREATE TABLE](https://clickhouse.com/docs/en/sql-reference/statements/show/#show-create-table) ## SHOW COLUMNS @@ -244,7 +244,7 @@ Result: **See also** -- [system.columns](https://clickhouse.com/docs/en/operations/system-tables/columns) +- [system.columns](https://clickhouse.com/docs/en/operations/system-tables/columns) ## SHOW DICTIONARIES @@ -560,7 +560,7 @@ Result: **See Also** -- [system.settings](../../operations/system-tables/settings.md) table +- [system.settings](../../operations/system-tables/settings.md) table ## SHOW ENGINES @@ -572,4 +572,4 @@ Outputs the content of the [system.table_engines](../../operations/system-tables **See Also** -- [system.table_engines](../../operations/system-tables/table_engines.md) table +- [system.table_engines](../../operations/system-tables/table_engines.md) table diff --git a/docs/en/sql-reference/syntax.md b/docs/en/sql-reference/syntax.md index ea2df235c1a..f5651c2dcb6 100644 --- a/docs/en/sql-reference/syntax.md +++ b/docs/en/sql-reference/syntax.md @@ -31,15 +31,15 @@ There may be any number of space symbols between syntactical constructions (incl ClickHouse supports either SQL-style and C-style comments: -- SQL-style comments start with `--`, `#!` or `# ` and continue to the end of the line, a space after `--` and `#!` can be omitted. -- C-style are from `/*` to `*/`and can be multiline, spaces are not required either. +- SQL-style comments start with `--`, `#!` or `# ` and continue to the end of the line, a space after `--` and `#!` can be omitted. +- C-style are from `/*` to `*/`and can be multiline, spaces are not required either. ## Keywords Keywords are case-insensitive when they correspond to: -- SQL standard. For example, `SELECT`, `select` and `SeLeCt` are all valid. -- Implementation in some popular DBMS (MySQL or Postgres). For example, `DateTime` is the same as `datetime`. +- SQL standard. For example, `SELECT`, `select` and `SeLeCt` are all valid. +- Implementation in some popular DBMS (MySQL or Postgres). For example, `DateTime` is the same as `datetime`. You can check whether a data type name is case-sensitive in the [system.data_type_families](../operations/system-tables/data_type_families.md#system_tables-data_type_families) table. @@ -51,10 +51,10 @@ Keywords are not reserved; they are treated as such only in the corresponding co Identifiers are: -- Cluster, database, table, partition, and column names. -- Functions. -- Data types. -- [Expression aliases](#expression_aliases). +- Cluster, database, table, partition, and column names. +- Functions. +- Data types. +- [Expression aliases](#expression_aliases). Identifiers can be quoted or non-quoted. The latter is preferred. @@ -70,10 +70,10 @@ There are numeric, string, compound, and `NULL` literals. Numeric literal tries to be parsed: -- First, as a 64-bit signed number, using the [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul) function. -- If unsuccessful, as a 64-bit unsigned number, using the [strtoll](https://en.cppreference.com/w/cpp/string/byte/strtol) function. -- If unsuccessful, as a floating-point number using the [strtod](https://en.cppreference.com/w/cpp/string/byte/strtof) function. -- Otherwise, it returns an error. +- First, as a 64-bit signed number, using the [strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul) function. +- If unsuccessful, as a 64-bit unsigned number, using the [strtoll](https://en.cppreference.com/w/cpp/string/byte/strtol) function. +- If unsuccessful, as a floating-point number using the [strtod](https://en.cppreference.com/w/cpp/string/byte/strtof) function. +- Otherwise, it returns an error. Literal value has the smallest type that the value fits in. For example, 1 is parsed as `UInt8`, but 256 is parsed as `UInt16`. For more information, see [Data types](../sql-reference/data-types/index.md). @@ -86,8 +86,8 @@ Examples: `1`, `10_000_000`, `0xffff_ffff`, `18446744073709551615`, `0xDEADBEEF` String literals must be enclosed in single quotes, double quotes are not supported. Escaping works either -- using a preceding single quote where the single-quote character `'` (and only this character) can be escaped as `''`, or -- using a preceding backslash with the following supported escape sequences: `\\`, `\'`, `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`. The backslash loses its special meaning, i.e. will be interpreted literally, if it precedes characters different than the listed ones. +- using a preceding single quote where the single-quote character `'` (and only this character) can be escaped as `''`, or +- using a preceding backslash with the following supported escape sequences: `\\`, `\'`, `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`. The backslash loses its special meaning, i.e. will be interpreted literally, if it precedes characters different than the listed ones. In string literals, you need to escape at least `'` and `\` using escape codes `\'` (or: `''`) and `\\`. @@ -209,17 +209,17 @@ An alias is a user-defined name for expression in a query. expr AS alias ``` -- `AS` — The keyword for defining aliases. You can define the alias for a table name or a column name in a `SELECT` clause without using the `AS` keyword. +- `AS` — The keyword for defining aliases. You can define the alias for a table name or a column name in a `SELECT` clause without using the `AS` keyword. For example, `SELECT table_name_alias.column_name FROM table_name table_name_alias`. In the [CAST](./functions/type-conversion-functions.md#castx-t) function, the `AS` keyword has another meaning. See the description of the function. -- `expr` — Any expression supported by ClickHouse. +- `expr` — Any expression supported by ClickHouse. For example, `SELECT column_name * 2 AS double FROM some_table`. -- `alias` — Name for `expr`. Aliases should comply with the [identifiers](#identifiers) syntax. +- `alias` — Name for `expr`. Aliases should comply with the [identifiers](#identifiers) syntax. For example, `SELECT "table t".column_name FROM table_name AS "table t"`. diff --git a/docs/en/sql-reference/table-functions/cluster.md b/docs/en/sql-reference/table-functions/cluster.md index 4904553c39a..f73a1cc0c3a 100644 --- a/docs/en/sql-reference/table-functions/cluster.md +++ b/docs/en/sql-reference/table-functions/cluster.md @@ -47,13 +47,13 @@ Using the `cluster` and `clusterAllReplicas` table functions are less efficient The `cluster` and `clusterAllReplicas` table functions can be useful in the following cases: -- Accessing a specific cluster for data comparison, debugging, and testing. -- Queries to various ClickHouse clusters and replicas for research purposes. -- Infrequent distributed requests that are made manually. +- Accessing a specific cluster for data comparison, debugging, and testing. +- Queries to various ClickHouse clusters and replicas for research purposes. +- Infrequent distributed requests that are made manually. Connection settings like `host`, `port`, `user`, `password`, `compression`, `secure` are taken from `` config section. See details in [Distributed engine](../../engines/table-engines/special/distributed.md). **See Also** -- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards) -- [load_balancing](../../operations/settings/settings.md#settings-load_balancing) +- [skip_unavailable_shards](../../operations/settings/settings.md#settings-skip_unavailable_shards) +- [load_balancing](../../operations/settings/settings.md#settings-load_balancing) diff --git a/docs/en/sql-reference/table-functions/dictionary.md b/docs/en/sql-reference/table-functions/dictionary.md index ab511843d63..c4bdde4dce2 100644 --- a/docs/en/sql-reference/table-functions/dictionary.md +++ b/docs/en/sql-reference/table-functions/dictionary.md @@ -15,7 +15,7 @@ dictionary('dict') **Arguments** -- `dict` — A dictionary name. [String](../../sql-reference/data-types/string.md). +- `dict` — A dictionary name. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -56,4 +56,4 @@ Result: **See Also** -- [Dictionary engine](../../engines/table-engines/special/dictionary.md#dictionary) +- [Dictionary engine](../../engines/table-engines/special/dictionary.md#dictionary) diff --git a/docs/en/sql-reference/table-functions/executable.md b/docs/en/sql-reference/table-functions/executable.md index 5a24c3ab11d..c6aba61aedb 100644 --- a/docs/en/sql-reference/table-functions/executable.md +++ b/docs/en/sql-reference/table-functions/executable.md @@ -85,12 +85,12 @@ The response looks like: ## Settings -- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Default value is `false`. -- `pool_size` — Size of pool. If 0 is specified as `pool_size` then there is no pool size restrictions. Default value is `16`. -- `max_command_execution_time` — Maximum executable script command execution time for processing block of data. Specified in seconds. Default value is 10. -- `command_termination_timeout` — executable script should contain main read-write loop. After table function is destroyed, pipe is closed, and executable file will have `command_termination_timeout` seconds to shutdown, before ClickHouse will send SIGTERM signal to child process. Specified in seconds. Default value is 10. -- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. -- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. +- `send_chunk_header` - controls whether to send row count before sending a chunk of data to process. Default value is `false`. +- `pool_size` — Size of pool. If 0 is specified as `pool_size` then there is no pool size restrictions. Default value is `16`. +- `max_command_execution_time` — Maximum executable script command execution time for processing block of data. Specified in seconds. Default value is 10. +- `command_termination_timeout` — executable script should contain main read-write loop. After table function is destroyed, pipe is closed, and executable file will have `command_termination_timeout` seconds to shutdown, before ClickHouse will send SIGTERM signal to child process. Specified in seconds. Default value is 10. +- `command_read_timeout` - timeout for reading data from command stdout in milliseconds. Default value 10000. +- `command_write_timeout` - timeout for writing data to command stdin in milliseconds. Default value 10000. ## Passing Query Results to a Script diff --git a/docs/en/sql-reference/table-functions/file.md b/docs/en/sql-reference/table-functions/file.md index 48c2cadc62c..49c58ea5ac6 100644 --- a/docs/en/sql-reference/table-functions/file.md +++ b/docs/en/sql-reference/table-functions/file.md @@ -18,10 +18,10 @@ file(path [,format] [,structure] [,compression]) **Parameters** -- `path` — The relative path to the file from [user_files_path](/docs/en/operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path). Path to file support following globs in read-only mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc', 'def'` — strings. -- `format` — The [format](/docs/en/interfaces/formats.md#formats) of the file. -- `structure` — Structure of the table. Format: `'column1_name column1_type, column2_name column2_type, ...'`. -- `compression` — The existing compression type when used in a `SELECT` query, or the desired compression type when used in an `INSERT` query. The supported compression types are `gz`, `br`, `xz`, `zst`, `lz4`, and `bz2`. +- `path` — The relative path to the file from [user_files_path](/docs/en/operations/server-configuration-parameters/settings.md#server_configuration_parameters-user_files_path). Path to file support following globs in read-only mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc', 'def'` — strings. +- `format` — The [format](/docs/en/interfaces/formats.md#formats) of the file. +- `structure` — Structure of the table. Format: `'column1_name column1_type, column2_name column2_type, ...'`. +- `compression` — The existing compression type when used in a `SELECT` query, or the desired compression type when used in an `INSERT` query. The supported compression types are `gz`, `br`, `xz`, `zst`, `lz4`, and `bz2`. **Returned value** @@ -78,11 +78,11 @@ SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 U Multiple path components can have globs. For being processed file must exist and match to the whole path pattern (not only suffix or prefix). -- `*` — Substitutes any number of any characters except `/` including empty string. -- `?` — Substitutes any single character. -- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. -- `{N..M}` — Substitutes any number in range from N to M including both borders. -- `**` - Fetches all files inside the folder recursively. +- `*` — Substitutes any number of any characters except `/` including empty string. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. +- `**` - Fetches all files inside the folder recursively. Constructions with `{}` are similar to the [remote](remote.md) table function. @@ -90,12 +90,12 @@ Constructions with `{}` are similar to the [remote](remote.md) table function. Suppose we have several files with the following relative paths: -- 'some_dir/some_file_1' -- 'some_dir/some_file_2' -- 'some_dir/some_file_3' -- 'another_dir/some_file_1' -- 'another_dir/some_file_2' -- 'another_dir/some_file_3' +- 'some_dir/some_file_1' +- 'some_dir/some_file_2' +- 'some_dir/some_file_3' +- 'another_dir/some_file_1' +- 'another_dir/some_file_2' +- 'another_dir/some_file_3' Query the number of rows in these files: @@ -139,9 +139,9 @@ SELECT count(*) FROM file('big_dir/**/file002', 'CSV', 'name String, value UInt3 ## Virtual Columns -- `_path` — Path to the file. -- `_file` — Name of the file. +- `_path` — Path to the file. +- `_file` — Name of the file. **See Also** -- [Virtual columns](/docs/en/engines/table-engines/index.md#table_engines-virtual_columns) +- [Virtual columns](/docs/en/engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/en/sql-reference/table-functions/format.md b/docs/en/sql-reference/table-functions/format.md index 811eae12942..2813eef5bcf 100644 --- a/docs/en/sql-reference/table-functions/format.md +++ b/docs/en/sql-reference/table-functions/format.md @@ -16,9 +16,9 @@ format(format_name, [structure], data) **Parameters** -- `format_name` — The [format](../../interfaces/formats.md#formats) of the data. -- `structure` - Structure of the table. Optional. Format 'column1_name column1_type, column2_name column2_type, ...'. -- `data` — String literal or constant expression that returns a string containing data in specified format +- `format_name` — The [format](../../interfaces/formats.md#formats) of the data. +- `structure` - Structure of the table. Optional. Format 'column1_name column1_type, column2_name column2_type, ...'. +- `data` — String literal or constant expression that returns a string containing data in specified format **Returned value** @@ -95,4 +95,4 @@ $$) **See Also** -- [Formats](../../interfaces/formats.md) +- [Formats](../../interfaces/formats.md) diff --git a/docs/en/sql-reference/table-functions/generate.md b/docs/en/sql-reference/table-functions/generate.md index b53ccdd42b5..bfc114daa72 100644 --- a/docs/en/sql-reference/table-functions/generate.md +++ b/docs/en/sql-reference/table-functions/generate.md @@ -16,11 +16,11 @@ generateRandom('name TypeName[, name TypeName]...', [, 'random_seed'[, 'max_stri **Arguments** -- `name` — Name of corresponding column. -- `TypeName` — Type of corresponding column. -- `max_array_length` — Maximum elements for all generated arrays or maps. Defaults to `10`. -- `max_string_length` — Maximum string length for all generated strings. Defaults to `10`. -- `random_seed` — Specify random seed manually to produce stable results. If NULL — seed is randomly generated. +- `name` — Name of corresponding column. +- `TypeName` — Type of corresponding column. +- `max_array_length` — Maximum elements for all generated arrays or maps. Defaults to `10`. +- `max_string_length` — Maximum string length for all generated strings. Defaults to `10`. +- `random_seed` — Specify random seed manually to produce stable results. If NULL — seed is randomly generated. **Returned Value** diff --git a/docs/en/sql-reference/table-functions/hdfs.md b/docs/en/sql-reference/table-functions/hdfs.md index 1b4588a9b55..6ba24211131 100644 --- a/docs/en/sql-reference/table-functions/hdfs.md +++ b/docs/en/sql-reference/table-functions/hdfs.md @@ -14,9 +14,9 @@ hdfs(URI, format, structure) **Input parameters** -- `URI` — The relative URI to the file in HDFS. Path to file support following globs in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, \``'abc', 'def'` — strings. -- `format` — The [format](../../interfaces/formats.md#formats) of the file. -- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. +- `URI` — The relative URI to the file in HDFS. Path to file support following globs in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, \``'abc', 'def'` — strings. +- `format` — The [format](../../interfaces/formats.md#formats) of the file. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. **Returned value** @@ -43,10 +43,10 @@ LIMIT 2 Multiple path components can have globs. For being processed file should exists and matches to the whole path pattern (not only suffix or prefix). -- `*` — Substitutes any number of any characters except `/` including empty string. -- `?` — Substitutes any single character. -- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. -- `{N..M}` — Substitutes any number in range from N to M including both borders. +- `*` — Substitutes any number of any characters except `/` including empty string. +- `?` — Substitutes any single character. +- `{some_string,another_string,yet_another_one}` — Substitutes any of strings `'some_string', 'another_string', 'yet_another_one'`. +- `{N..M}` — Substitutes any number in range from N to M including both borders. Constructions with `{}` are similar to the [remote table function](../../sql-reference/table-functions/remote.md)). @@ -54,12 +54,12 @@ Constructions with `{}` are similar to the [remote table function](../../sql-ref 1. Suppose that we have several files with following URIs on HDFS: -- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ 2. Query the amount of rows in these files: @@ -94,9 +94,9 @@ FROM hdfs('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name Strin ## Virtual Columns -- `_path` — Path to the file. -- `_file` — Name of the file. +- `_path` — Path to the file. +- `_file` — Name of the file. **See Also** -- [Virtual columns](../../engines/table-engines/index.md#table_engines-virtual_columns) +- [Virtual columns](../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/en/sql-reference/table-functions/hdfsCluster.md b/docs/en/sql-reference/table-functions/hdfsCluster.md index 546c6a3d1b1..fa17a01accf 100644 --- a/docs/en/sql-reference/table-functions/hdfsCluster.md +++ b/docs/en/sql-reference/table-functions/hdfsCluster.md @@ -16,10 +16,10 @@ hdfsCluster(cluster_name, URI, format, structure) **Arguments** -- `cluster_name` — Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. -- `URI` — URI to a file or a bunch of files. Supports following wildcards in readonly mode: `*`, `?`, `{'abc','def'}` and `{N..M}` where `N`, `M` — numbers, `abc`, `def` — strings. For more information see [Wildcards In Path](../../engines/table-engines/integrations/s3.md#wildcards-in-path). -- `format` — The [format](../../interfaces/formats.md#formats) of the file. -- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. +- `cluster_name` — Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. +- `URI` — URI to a file or a bunch of files. Supports following wildcards in readonly mode: `*`, `?`, `{'abc','def'}` and `{N..M}` where `N`, `M` — numbers, `abc`, `def` — strings. For more information see [Wildcards In Path](../../engines/table-engines/integrations/s3.md#wildcards-in-path). +- `format` — The [format](../../interfaces/formats.md#formats) of the file. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. **Returned value** @@ -29,12 +29,12 @@ A table with the specified structure for reading data in the specified file. 1. Suppose that we have a ClickHouse cluster named `cluster_simple`, and several files with following URIs on HDFS: -- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ -- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ 2. Query the amount of rows in these files: @@ -56,5 +56,5 @@ If your listing of files contains number ranges with leading zeros, use the cons **See Also** -- [HDFS engine](../../engines/table-engines/integrations/hdfs.md) -- [HDFS table function](../../sql-reference/table-functions/hdfs.md) +- [HDFS engine](../../engines/table-engines/integrations/hdfs.md) +- [HDFS table function](../../sql-reference/table-functions/hdfs.md) diff --git a/docs/en/sql-reference/table-functions/index.md b/docs/en/sql-reference/table-functions/index.md index 1010d53e86d..650361b5f2c 100644 --- a/docs/en/sql-reference/table-functions/index.md +++ b/docs/en/sql-reference/table-functions/index.md @@ -14,11 +14,11 @@ You can use table functions in: The method for creating a temporary table that is available only in the current query. The table is deleted when the query finishes. -- [CREATE TABLE AS table_function()](../../sql-reference/statements/create/table.md) query. +- [CREATE TABLE AS table_function()](../../sql-reference/statements/create/table.md) query. It's one of the methods of creating a table. -- [INSERT INTO TABLE FUNCTION](../../sql-reference/statements/insert-into.md#inserting-into-table-function) query. +- [INSERT INTO TABLE FUNCTION](../../sql-reference/statements/insert-into.md#inserting-into-table-function) query. :::note You can’t use table functions if the [allow_ddl](../../operations/settings/permissions-for-queries.md#settings_allow_ddl) setting is disabled. diff --git a/docs/en/sql-reference/table-functions/input.md b/docs/en/sql-reference/table-functions/input.md index b07bc1bb431..6aa1cab00c1 100644 --- a/docs/en/sql-reference/table-functions/input.md +++ b/docs/en/sql-reference/table-functions/input.md @@ -24,7 +24,7 @@ with all transferred data is not created. **Examples** -- Let the `test` table has the following structure `(a String, b String)` +- Let the `test` table has the following structure `(a String, b String)` and data in `data.csv` has a different structure `(col1 String, col2 Date, col3 Int32)`. Query for insert data from the `data.csv` into the `test` table with simultaneous conversion looks like this: @@ -34,7 +34,7 @@ with all transferred data is not created. $ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV"; ``` -- If `data.csv` contains data of the same structure `test_structure` as the table `test` then these two queries are equal: +- If `data.csv` contains data of the same structure `test_structure` as the table `test` then these two queries are equal: diff --git a/docs/en/sql-reference/table-functions/merge.md b/docs/en/sql-reference/table-functions/merge.md index ce3cdded3f2..ba0d19b804e 100644 --- a/docs/en/sql-reference/table-functions/merge.md +++ b/docs/en/sql-reference/table-functions/merge.md @@ -24,4 +24,4 @@ merge('db_name', 'tables_regexp') **See Also** -- [Merge](../../engines/table-engines/special/merge.md) table engine +- [Merge](../../engines/table-engines/special/merge.md) table engine diff --git a/docs/en/sql-reference/table-functions/mongodb.md b/docs/en/sql-reference/table-functions/mongodb.md index 706ab68fee4..042225dd1f0 100644 --- a/docs/en/sql-reference/table-functions/mongodb.md +++ b/docs/en/sql-reference/table-functions/mongodb.md @@ -16,19 +16,19 @@ mongodb(host:port, database, collection, user, password, structure [, options]) **Arguments** -- `host:port` — MongoDB server address. +- `host:port` — MongoDB server address. -- `database` — Remote database name. +- `database` — Remote database name. -- `collection` — Remote collection name. +- `collection` — Remote collection name. -- `user` — MongoDB user. +- `user` — MongoDB user. -- `password` — User password. +- `password` — User password. -- `structure` - The schema for the ClickHouse table returned from this function. +- `structure` - The schema for the ClickHouse table returned from this function. -- `options` - MongoDB connection string options (optional parameter). +- `options` - MongoDB connection string options (optional parameter). **Returned Value** @@ -70,5 +70,5 @@ SELECT * FROM mongodb( **See Also** -- [The `MongoDB` table engine](/docs/en/engines/table-engines/integrations/mongodb.md) -- [Using MongoDB as a dictionary source](/docs/en/sql-reference/dictionaries/index.md#mongodb) +- [The `MongoDB` table engine](/docs/en/engines/table-engines/integrations/mongodb.md) +- [Using MongoDB as a dictionary source](/docs/en/sql-reference/dictionaries/index.md#mongodb) diff --git a/docs/en/sql-reference/table-functions/mysql.md b/docs/en/sql-reference/table-functions/mysql.md index 64ddcd86f7f..8d7656365f5 100644 --- a/docs/en/sql-reference/table-functions/mysql.md +++ b/docs/en/sql-reference/table-functions/mysql.md @@ -16,21 +16,21 @@ mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_ **Arguments** -- `host:port` — MySQL server address. +- `host:port` — MySQL server address. -- `database` — Remote database name. +- `database` — Remote database name. -- `table` — Remote table name. +- `table` — Remote table name. -- `user` — MySQL user. +- `user` — MySQL user. -- `password` — User password. +- `password` — User password. -- `replace_query` — Flag that converts `INSERT INTO` queries to `REPLACE INTO`. Possible values: +- `replace_query` — Flag that converts `INSERT INTO` queries to `REPLACE INTO`. Possible values: - `0` - The query is executed as `INSERT INTO`. - `1` - The query is executed as `REPLACE INTO`. -- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression that is added to the `INSERT` query. Can be specified only with `replace_query = 0` (if you simultaneously pass `replace_query = 1` and `on_duplicate_clause`, ClickHouse generates an exception). +- `on_duplicate_clause` — The `ON DUPLICATE KEY on_duplicate_clause` expression that is added to the `INSERT` query. Can be specified only with `replace_query = 0` (if you simultaneously pass `replace_query = 1` and `on_duplicate_clause`, ClickHouse generates an exception). Example: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;` @@ -109,5 +109,5 @@ SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123'); **See Also** -- [The ‘MySQL’ table engine](../../engines/table-engines/integrations/mysql.md) -- [Using MySQL as a dictionary source](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) +- [The ‘MySQL’ table engine](../../engines/table-engines/integrations/mysql.md) +- [Using MySQL as a dictionary source](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) diff --git a/docs/en/sql-reference/table-functions/null.md b/docs/en/sql-reference/table-functions/null.md index 04d7f08f259..d27295f1916 100644 --- a/docs/en/sql-reference/table-functions/null.md +++ b/docs/en/sql-reference/table-functions/null.md @@ -15,7 +15,7 @@ null('structure') **Parameter** -- `structure` — A list of columns and column types. [String](../../sql-reference/data-types/string.md). +- `structure` — A list of columns and column types. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -38,4 +38,4 @@ DROP TABLE IF EXISTS t; See also: -- [Null table engine](../../engines/table-engines/special/null.md) +- [Null table engine](../../engines/table-engines/special/null.md) diff --git a/docs/en/sql-reference/table-functions/odbc.md b/docs/en/sql-reference/table-functions/odbc.md index 397a9ba6c89..781ebacc680 100644 --- a/docs/en/sql-reference/table-functions/odbc.md +++ b/docs/en/sql-reference/table-functions/odbc.md @@ -14,9 +14,9 @@ odbc(connection_settings, external_database, external_table) Parameters: -- `connection_settings` — Name of the section with connection settings in the `odbc.ini` file. -- `external_database` — Name of a database in an external DBMS. -- `external_table` — Name of a table in the `external_database`. +- `connection_settings` — Name of the section with connection settings in the `odbc.ini` file. +- `external_database` — Name of a database in an external DBMS. +- `external_table` — Name of a table in the `external_database`. To safely implement ODBC connections, ClickHouse uses a separate program `clickhouse-odbc-bridge`. If the ODBC driver is loaded directly from `clickhouse-server`, driver problems can crash the ClickHouse server. ClickHouse automatically starts `clickhouse-odbc-bridge` when it is required. The ODBC bridge program is installed from the same package as the `clickhouse-server`. @@ -101,5 +101,5 @@ SELECT * FROM odbc('DSN=mysqlconn', 'test', 'test') ## See Also -- [ODBC dictionaries](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) -- [ODBC table engine](../../engines/table-engines/integrations/odbc.md). +- [ODBC dictionaries](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) +- [ODBC table engine](../../engines/table-engines/integrations/odbc.md). diff --git a/docs/en/sql-reference/table-functions/postgresql.md b/docs/en/sql-reference/table-functions/postgresql.md index 975a04fa0de..3e147fb8417 100644 --- a/docs/en/sql-reference/table-functions/postgresql.md +++ b/docs/en/sql-reference/table-functions/postgresql.md @@ -16,12 +16,12 @@ postgresql('host:port', 'database', 'table', 'user', 'password'[, `schema`]) **Arguments** -- `host:port` — PostgreSQL server address. -- `database` — Remote database name. -- `table` — Remote table name. -- `user` — PostgreSQL user. -- `password` — User password. -- `schema` — Non-default table schema. Optional. +- `host:port` — PostgreSQL server address. +- `database` — Remote database name. +- `table` — Remote table name. +- `user` — PostgreSQL user. +- `password` — User password. +- `schema` — Non-default table schema. Optional. **Returned Value** @@ -129,8 +129,8 @@ CREATE TABLE pg_table_schema_with_dots (a UInt32) **See Also** -- [The PostgreSQL table engine](../../engines/table-engines/integrations/postgresql.md) -- [Using PostgreSQL as a dictionary source](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) +- [The PostgreSQL table engine](../../engines/table-engines/integrations/postgresql.md) +- [Using PostgreSQL as a dictionary source](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) ## Related content diff --git a/docs/en/sql-reference/table-functions/s3.md b/docs/en/sql-reference/table-functions/s3.md index 12894abb3ff..a9ddc286ec5 100644 --- a/docs/en/sql-reference/table-functions/s3.md +++ b/docs/en/sql-reference/table-functions/s3.md @@ -23,7 +23,7 @@ For GCS, substitute your HMAC key and HMAC secret where you see `aws_access_key_ **Arguments** -- `path` — Bucket url with path to file. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings. For more information see [here](../../engines/table-engines/integrations/s3.md#wildcards-in-path). +- `path` — Bucket url with path to file. Supports following wildcards in readonly mode: `*`, `?`, `{abc,def}` and `{N..M}` where `N`, `M` — numbers, `'abc'`, `'def'` — strings. For more information see [here](../../engines/table-engines/integrations/s3.md#wildcards-in-path). :::note GCS The GCS path is in this format as the endpoint for the Google XML API is different than the JSON API: @@ -33,10 +33,10 @@ For GCS, substitute your HMAC key and HMAC secret where you see `aws_access_key_ and not ~~https://storage.cloud.google.com~~. ::: -- `NOSIGN` - If this keyword is provided in place of credentials, all the requests will not be signed. -- `format` — The [format](../../interfaces/formats.md#formats) of the file. -- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. -- `compression` — Parameter is optional. Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. By default, it will autodetect compression by file extension. +- `NOSIGN` - If this keyword is provided in place of credentials, all the requests will not be signed. +- `format` — The [format](../../interfaces/formats.md#formats) of the file. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. +- `compression` — Parameter is optional. Supported values: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. By default, it will autodetect compression by file extension. **Returned value** @@ -84,14 +84,14 @@ ClickHouse also can determine the compression of the file. For example, if the f Suppose that we have several files with following URIs on S3: -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv' -- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv' Count the amount of rows in files ending with numbers from 1 to 3: @@ -204,4 +204,4 @@ LIMIT 5; **See Also** -- [S3 engine](../../engines/table-engines/integrations/s3.md) +- [S3 engine](../../engines/table-engines/integrations/s3.md) diff --git a/docs/en/sql-reference/table-functions/s3Cluster.md b/docs/en/sql-reference/table-functions/s3Cluster.md index 504f92b4dc0..7ac6773672c 100644 --- a/docs/en/sql-reference/table-functions/s3Cluster.md +++ b/docs/en/sql-reference/table-functions/s3Cluster.md @@ -15,11 +15,11 @@ s3Cluster(cluster_name, source, [,access_key_id, secret_access_key] [,format] [, **Arguments** -- `cluster_name` — Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. -- `source` — URL to a file or a bunch of files. Supports following wildcards in readonly mode: `*`, `?`, `{'abc','def'}` and `{N..M}` where `N`, `M` — numbers, `abc`, `def` — strings. For more information see [Wildcards In Path](../../engines/table-engines/integrations/s3.md#wildcards-in-path). -- `access_key_id` and `secret_access_key` — Keys that specify credentials to use with given endpoint. Optional. -- `format` — The [format](../../interfaces/formats.md#formats) of the file. -- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. +- `cluster_name` — Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. +- `source` — URL to a file or a bunch of files. Supports following wildcards in readonly mode: `*`, `?`, `{'abc','def'}` and `{N..M}` where `N`, `M` — numbers, `abc`, `def` — strings. For more information see [Wildcards In Path](../../engines/table-engines/integrations/s3.md#wildcards-in-path). +- `access_key_id` and `secret_access_key` — Keys that specify credentials to use with given endpoint. Optional. +- `format` — The [format](../../interfaces/formats.md#formats) of the file. +- `structure` — Structure of the table. Format `'column1_name column1_type, column2_name column2_type, ...'`. **Returned value** @@ -48,5 +48,5 @@ If your listing of files contains number ranges with leading zeros, use the cons **See Also** -- [S3 engine](../../engines/table-engines/integrations/s3.md) -- [s3 table function](../../sql-reference/table-functions/s3.md) +- [S3 engine](../../engines/table-engines/integrations/s3.md) +- [s3 table function](../../sql-reference/table-functions/s3.md) diff --git a/docs/en/sql-reference/table-functions/sqlite.md b/docs/en/sql-reference/table-functions/sqlite.md index 1895f32421e..344fab4fad2 100644 --- a/docs/en/sql-reference/table-functions/sqlite.md +++ b/docs/en/sql-reference/table-functions/sqlite.md @@ -15,12 +15,12 @@ Allows to perform queries on a data stored in an [SQLite](../../engines/database **Arguments** -- `db_path` — Path to a file with an SQLite database. [String](../../sql-reference/data-types/string.md). -- `table_name` — Name of a table in the SQLite database. [String](../../sql-reference/data-types/string.md). +- `db_path` — Path to a file with an SQLite database. [String](../../sql-reference/data-types/string.md). +- `table_name` — Name of a table in the SQLite database. [String](../../sql-reference/data-types/string.md). **Returned value** -- A table object with the same columns as in the original `SQLite` table. +- A table object with the same columns as in the original `SQLite` table. **Example** @@ -42,4 +42,4 @@ Result: **See Also** -- [SQLite](../../engines/table-engines/integrations/sqlite.md) table engine +- [SQLite](../../engines/table-engines/integrations/sqlite.md) table engine diff --git a/docs/en/sql-reference/table-functions/view.md b/docs/en/sql-reference/table-functions/view.md index 074481cc522..2c21fe9ff4b 100644 --- a/docs/en/sql-reference/table-functions/view.md +++ b/docs/en/sql-reference/table-functions/view.md @@ -15,11 +15,11 @@ view(subquery) **Arguments** -- `subquery` — `SELECT` query. +- `subquery` — `SELECT` query. **Returned value** -- A table. +- A table. **Example** @@ -63,4 +63,4 @@ SELECT * FROM cluster(`cluster_name`, view(SELECT a, b, c FROM table_name)); **See Also** -- [View Table Engine](https://clickhouse.com/docs/en/engines/table-engines/special/view/) +- [View Table Engine](https://clickhouse.com/docs/en/engines/table-engines/special/view/) From cdf28f9b7104b944abbdca03f72f85530b9864dd Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 16:10:51 +0000 Subject: [PATCH 372/535] Minor fixups --- .../table-engines/integrations/deltalake.md | 2 +- .../table-engines/integrations/hdfs.md | 18 +++++------ .../table-engines/integrations/hudi.md | 2 +- .../table-engines/integrations/iceberg.md | 2 +- .../engines/table-engines/integrations/s3.md | 2 +- .../example-datasets/amazon-reviews.md | 2 +- .../example-datasets/nypd_complaint_data.md | 2 +- .../settings.md | 8 ++--- docs/en/operations/settings/settings.md | 24 +++++++-------- docs/en/operations/system-tables/grants.md | 16 +++++----- .../system-tables/processors_profile_log.md | 6 ++-- .../operations/system-tables/row_policies.md | 22 +++++++------- .../settings_profile_elements.md | 20 ++++++------- .../system-tables/settings_profiles.md | 14 ++++----- docs/en/operations/system-tables/users.md | 24 +++++++-------- .../parametric-functions.md | 4 +-- .../reference/contingency.md | 2 +- .../aggregate-functions/reference/cramersv.md | 2 +- .../reference/cramersvbiascorrected.md | 2 +- .../aggregate-functions/reference/sumkahan.md | 2 +- .../aggregate-functions/reference/theilsu.md | 2 +- docs/en/sql-reference/functions/geo/h3.md | 30 +++++++++---------- .../sql-reference/functions/math-functions.md | 4 +-- .../functions/type-conversion-functions.md | 6 ++-- docs/en/sql-reference/statements/explain.md | 10 +++---- docs/en/sql-reference/statements/show.md | 2 +- .../sql-reference/table-functions/cluster.md | 2 +- .../en/sql-reference/table-functions/index.md | 2 +- .../sql-reference/window-functions/index.md | 4 +-- 29 files changed, 119 insertions(+), 119 deletions(-) diff --git a/docs/en/engines/table-engines/integrations/deltalake.md b/docs/en/engines/table-engines/integrations/deltalake.md index bf4a59b4a5d..3e2e177e28f 100644 --- a/docs/en/engines/table-engines/integrations/deltalake.md +++ b/docs/en/engines/table-engines/integrations/deltalake.md @@ -49,4 +49,4 @@ CREATE TABLE deltalake ENGINE=DeltaLake(deltalake_conf, filename = 'test_table') ## See also -- [deltaLake table function](../../../sql-reference/table-functions/deltalake.md) +- [deltaLake table function](../../../sql-reference/table-functions/deltalake.md) diff --git a/docs/en/engines/table-engines/integrations/hdfs.md b/docs/en/engines/table-engines/integrations/hdfs.md index 88316d1c94a..b9db0fae68f 100644 --- a/docs/en/engines/table-engines/integrations/hdfs.md +++ b/docs/en/engines/table-engines/integrations/hdfs.md @@ -17,7 +17,7 @@ ENGINE = HDFS(URI, format) **Engine Parameters** - `URI` - whole file URI in HDFS. The path part of `URI` may contain globs. In this case the table would be readonly. -- `format` - specifies one of the available file formats. To perform +- `format` - specifies one of the available file formats. To perform `SELECT` queries, the format must be supported for input, and to perform `INSERT` queries – for output. The available formats are listed in the [Formats](../../../interfaces/formats.md#formats) section. @@ -83,12 +83,12 @@ Constructions with `{}` are similar to the [remote](../../../sql-reference/table 1. Suppose we have several files in TSV format with the following URIs on HDFS: - - 'hdfs://hdfs1:9000/some_dir/some_file_1' - - 'hdfs://hdfs1:9000/some_dir/some_file_2' - - 'hdfs://hdfs1:9000/some_dir/some_file_3' - - 'hdfs://hdfs1:9000/another_dir/some_file_1' - - 'hdfs://hdfs1:9000/another_dir/some_file_2' - - 'hdfs://hdfs1:9000/another_dir/some_file_3' + - 'hdfs://hdfs1:9000/some_dir/some_file_1' + - 'hdfs://hdfs1:9000/some_dir/some_file_2' + - 'hdfs://hdfs1:9000/some_dir/some_file_3' + - 'hdfs://hdfs1:9000/another_dir/some_file_1' + - 'hdfs://hdfs1:9000/another_dir/some_file_2' + - 'hdfs://hdfs1:9000/another_dir/some_file_3' 1. There are several ways to make a table consisting of all six files: @@ -145,7 +145,7 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us | **parameter** | **default value** | -| - | - | +| - | - | | rpc\_client\_connect\_tcpnodelay | true | | dfs\_client\_read\_shortcircuit | true | | output\_replace-datanode-on-failure | true | @@ -195,7 +195,7 @@ Similar to GraphiteMergeTree, the HDFS engine supports extended configuration us #### ClickHouse extras {#clickhouse-extras} | **parameter** | **default value** | -| - | - | +| - | - | |hadoop\_kerberos\_keytab | "" | |hadoop\_kerberos\_principal | "" | |libhdfs3\_conf | "" | diff --git a/docs/en/engines/table-engines/integrations/hudi.md b/docs/en/engines/table-engines/integrations/hudi.md index 970ff4adc6c..a11e915aa3d 100644 --- a/docs/en/engines/table-engines/integrations/hudi.md +++ b/docs/en/engines/table-engines/integrations/hudi.md @@ -49,4 +49,4 @@ CREATE TABLE hudi_table ENGINE=Hudi(hudi_conf, filename = 'test_table') ## See also -- [hudi table function](/docs/en/sql-reference/table-functions/hudi.md) +- [hudi table function](/docs/en/sql-reference/table-functions/hudi.md) diff --git a/docs/en/engines/table-engines/integrations/iceberg.md b/docs/en/engines/table-engines/integrations/iceberg.md index c7fdfc5ec05..77cefc9283d 100644 --- a/docs/en/engines/table-engines/integrations/iceberg.md +++ b/docs/en/engines/table-engines/integrations/iceberg.md @@ -49,4 +49,4 @@ CREATE TABLE iceberg_table ENGINE=Iceberg(iceberg_conf, filename = 'test_table') ## See also -- [iceberg table function](/docs/en/sql-reference/table-functions/iceberg.md) +- [iceberg table function](/docs/en/sql-reference/table-functions/iceberg.md) diff --git a/docs/en/engines/table-engines/integrations/s3.md b/docs/en/engines/table-engines/integrations/s3.md index e149dec9146..cde09d79cd8 100644 --- a/docs/en/engines/table-engines/integrations/s3.md +++ b/docs/en/engines/table-engines/integrations/s3.md @@ -191,4 +191,4 @@ CREATE TABLE big_table (name String, value UInt32) ## See also -- [s3 table function](../../../sql-reference/table-functions/s3.md) +- [s3 table function](../../../sql-reference/table-functions/s3.md) diff --git a/docs/en/getting-started/example-datasets/amazon-reviews.md b/docs/en/getting-started/example-datasets/amazon-reviews.md index 55014d9b5f4..f35806aa66f 100644 --- a/docs/en/getting-started/example-datasets/amazon-reviews.md +++ b/docs/en/getting-started/example-datasets/amazon-reviews.md @@ -43,7 +43,7 @@ The rows look like: ```response ┌─marketplace─┬─customer_id─┬─review_id──────┬─product_id─┬─product_parent─┬─product_title──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─product_category─┬─star_rating─┬─helpful_votes─┬─total_votes─┬─vine──┬─verified_purchase─┬─review_headline───────────┬─review_body────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─review_date─┐ -│ US │ 16414143 │ R3W4P9UBGNGH1U │ B00YL0EKWE │ 852431543 │ LG G4 Case Hard Transparent Slim Clear Cover for LG G4 │ Wireless │ 2 │ 1 │ 3 │ false │ true │ Looks good, functions meh │ 2 issues - Once I turned on the circle apps and installed this case, my battery drained twice as fast as usual. I ended up turning off the circle apps, which kind of makes the case just a case... with a hole in it. Second, the wireless charging doesn't work. I have a Motorola 360 watch and a Qi charging pad. The watch charges fine but this case doesn't. But hey, it looks nice. │ 2015-08-31 │ +│ US │ 16414143 │ R3W4P9UBGNGH1U │ B00YL0EKWE │ 852431543 │ LG G4 Case Hard Transparent Slim Clear Cover for LG G4 │ Wireless │ 2 │ 1 │ 3 │ false │ true │ Looks good, functions meh │ 2 issues - Once I turned on the circle apps and installed this case, my battery drained twice as fast as usual. I ended up turning off the circle apps, which kind of makes the case just a case... with a hole in it. Second, the wireless charging doesn't work. I have a Motorola 360 watch and a Qi charging pad. The watch charges fine but this case doesn't. But hey, it looks nice. │ 2015-08-31 │ │ US │ 50800750 │ R15V54KBMTQWAY │ B00XK95RPQ │ 516894650 │ Selfie Stick Fiblastiq™ Extendable Wireless Bluetooth Selfie Stick with built-in Bluetooth Adjustable Phone Holder │ Wireless │ 4 │ 0 │ 0 │ false │ false │ A fun little gadget │ I’m embarrassed to admit that until recently, I have had a very negative opinion about “selfie sticks” aka “monopods” aka “narcissticks.” But having reviewed a number of them recently, they’re growing on me. This one is pretty nice and simple to set up and with easy instructions illustrated on the back of the box (not sure why some reviewers have stated that there are no instructions when they are clearly printed on the box unless they received different packaging than I did). Once assembled, the pairing via bluetooth and use of the stick are easy and intuitive. Nothing to it.

The stick comes with a USB charging cable but arrived with a charge so you can use it immediately, though it’s probably a good idea to charge it right away so that you have no interruption of use out of the box. Make sure the stick is switched to on (it will light up) and extend your stick to the length you desire up to about a yard’s length and snap away.

The phone clamp held the phone sturdily so I wasn’t worried about it slipping out. But the longer you extend the stick, the harder it is to maneuver. But that will happen with any stick and is not specific to this one in particular.

Two things that could improve this: 1) add the option to clamp this in portrait orientation instead of having to try and hold the stick at the portrait angle, which makes it feel unstable; 2) add the opening for a tripod so that this can be used to sit upright on a table for skyping and facetime eliminating the need to hold the phone up with your hand, causing fatigue.

But other than that, this is a nice quality monopod for a variety of picture taking opportunities.

I received a sample in exchange for my honest opinion. │ 2015-08-31 │ │ US │ 15184378 │ RY8I449HNXSVF │ B00SXRXUKO │ 984297154 │ Tribe AB40 Water Resistant Sports Armband with Key Holder for 4.7-Inch iPhone 6S/6/5/5S/5C, Galaxy S4 + Screen Protector - Dark Pink │ Wireless │ 5 │ 0 │ 0 │ false │ true │ Five Stars │ Fits iPhone 6 well │ 2015-08-31 │ │ US │ 10203548 │ R18TLJYCKJFLSR │ B009V5X1CE │ 279912704 │ RAVPower® Element 10400mAh External Battery USB Portable Charger (Dual USB Outputs, Ultra Compact Design), Travel Charger for iPhone 6,iPhone 6 plus,iPhone 5, 5S, 5C, 4S, 4, iPad Air, 4, 3, 2, Mini 2 (Apple adapters not included); Samsung Galaxy S5, S4, S3, S2, Note 3, Note 2; HTC One, EVO, Thunderbolt, Incredible, Droid DNA, Motorola ATRIX, Droid, Moto X, Google Glass, Nexus 4, Nexus 5, Nexus 7, │ Wireless │ 5 │ 0 │ 0 │ false │ true │ Great charger │ Great charger. I easily get 3+ charges on a Samsung Galaxy 3. Works perfectly for camping trips or long days on the boat. │ 2015-08-31 │ diff --git a/docs/en/getting-started/example-datasets/nypd_complaint_data.md b/docs/en/getting-started/example-datasets/nypd_complaint_data.md index 71c5ce0f179..a178fe456a6 100644 --- a/docs/en/getting-started/example-datasets/nypd_complaint_data.md +++ b/docs/en/getting-started/example-datasets/nypd_complaint_data.md @@ -380,7 +380,7 @@ decide that we would look at the types of crimes reported over time in the five New York City. These fields might be then included in the `ORDER BY`: | Column | Description (from the data dictionary) | -| ----------- | --------------------------------------------------- | +| ----------- | --------------------------------------------------- | | OFNS_DESC | Description of offense corresponding with key code | | RPT_DT | Date event was reported to police | | BORO_NM | The name of the borough in which the incident occurred | diff --git a/docs/en/operations/server-configuration-parameters/settings.md b/docs/en/operations/server-configuration-parameters/settings.md index 981209521cc..af0d2415f1d 100644 --- a/docs/en/operations/server-configuration-parameters/settings.md +++ b/docs/en/operations/server-configuration-parameters/settings.md @@ -584,12 +584,12 @@ Backlog (queue size of pending connections) of the listen socket. Default value: `4096` (as in linux [5.4+](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=19f92a030ca6d772ab44b22ee6a01378a8cb32d4)). Usually this value does not need to be changed, since: -- default value is large enough, -- and for accepting client's connections server has separate thread. +- default value is large enough, +- and for accepting client's connections server has separate thread. So even if you have `TcpExtListenOverflows` (from `nstat`) non zero and this counter grows for ClickHouse server it does not mean that this value need to be increased, since: -- usually if 4096 is not enough it shows some internal ClickHouse scaling issue, so it is better to report an issue. -- and it does not mean that the server can handle more connections later (and even if it could, by that moment clients may be gone or disconnected). +- usually if 4096 is not enough it shows some internal ClickHouse scaling issue, so it is better to report an issue. +- and it does not mean that the server can handle more connections later (and even if it could, by that moment clients may be gone or disconnected). Examples: diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index 0fb0b15b75a..26721d3f0fb 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -1744,7 +1744,7 @@ user can avoid the same inserted data being deduplicated. Possible values: -- Any string +- Any string Default value: empty string (disabled) @@ -1958,20 +1958,20 @@ FORMAT PrettyCompactMonoBlock Enables or disables [LIMIT](#limit) applying on each shard separatelly. This will allow to avoid: -- Sending extra rows over network; -- Processing rows behind the limit on the initiator. +- Sending extra rows over network; +- Processing rows behind the limit on the initiator. Starting from 21.9 version you cannot get inaccurate results anymore, since `distributed_push_down_limit` changes query execution only if at least one of the conditions met: -- [distributed_group_by_no_merge](#distributed-group-by-no-merge) > 0. -- Query **does not have** `GROUP BY`/`DISTINCT`/`LIMIT BY`, but it has `ORDER BY`/`LIMIT`. -- Query **has** `GROUP BY`/`DISTINCT`/`LIMIT BY` with `ORDER BY`/`LIMIT` and: - - [optimize_skip_unused_shards](#optimize-skip-unused-shards) is enabled. - - [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key) is enabled. +- [distributed_group_by_no_merge](#distributed-group-by-no-merge) > 0. +- Query **does not have** `GROUP BY`/`DISTINCT`/`LIMIT BY`, but it has `ORDER BY`/`LIMIT`. +- Query **has** `GROUP BY`/`DISTINCT`/`LIMIT BY` with `ORDER BY`/`LIMIT` and: + - [optimize_skip_unused_shards](#optimize-skip-unused-shards) is enabled. + - [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key) is enabled. Possible values: -- 0 — Disabled. -- 1 — Enabled. +- 0 — Disabled. +- 1 — Enabled. Default value: `1`. @@ -2791,8 +2791,8 @@ When the setting is enabled and the argument of `CAST` function is `Nullable`, t Possible values: -- 0 — The `CAST` result has exactly the destination type specified. -- 1 — If the argument type is `Nullable`, the `CAST` result is transformed to `Nullable(DestinationDataType)`. +- 0 — The `CAST` result has exactly the destination type specified. +- 1 — If the argument type is `Nullable`, the `CAST` result is transformed to `Nullable(DestinationDataType)`. Default value: `0`. diff --git a/docs/en/operations/system-tables/grants.md b/docs/en/operations/system-tables/grants.md index 4b525ce708b..b12f656cb75 100644 --- a/docs/en/operations/system-tables/grants.md +++ b/docs/en/operations/system-tables/grants.md @@ -6,20 +6,20 @@ slug: /en/operations/system-tables/grants Privileges granted to ClickHouse user accounts. Columns: -- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. -- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role assigned to user account. +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role assigned to user account. -- `access_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Access parameters for ClickHouse user account. +- `access_type` ([Enum8](../../sql-reference/data-types/enum.md)) — Access parameters for ClickHouse user account. -- `database` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a database. +- `database` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a database. -- `table` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a table. +- `table` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a table. -- `column` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a column to which access is granted. +- `column` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Name of a column to which access is granted. -- `is_partial_revoke` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Logical value. It shows whether some privileges have been revoked. Possible values: +- `is_partial_revoke` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Logical value. It shows whether some privileges have been revoked. Possible values: - `0` — The row describes a partial revoke. - `1` — The row describes a grant. -- `grant_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Permission is granted `WITH GRANT OPTION`, see [GRANT](../../sql-reference/statements/grant.md#grant-privigele-syntax). +- `grant_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Permission is granted `WITH GRANT OPTION`, see [GRANT](../../sql-reference/statements/grant.md#grant-privigele-syntax). diff --git a/docs/en/operations/system-tables/processors_profile_log.md b/docs/en/operations/system-tables/processors_profile_log.md index 1eb7dc4b1d2..e849525e495 100644 --- a/docs/en/operations/system-tables/processors_profile_log.md +++ b/docs/en/operations/system-tables/processors_profile_log.md @@ -67,9 +67,9 @@ Result: Here you can see: -- `ExpressionTransform` was executing `sleep(1)` function, so it `work` will takes 1e6, and so `elapsed_us` > 1e6. -- `SourceFromSingleChunk` need to wait, because `ExpressionTransform` does not accept any data during execution of `sleep(1)`, so it will be in `PortFull` state for 1e6 us, and so `output_wait_elapsed_us` > 1e6. -- `LimitsCheckingTransform`/`NullSource`/`LazyOutputFormat` need to wait until `ExpressionTransform` will execute `sleep(1)` to process the result, so `input_wait_elapsed_us` > 1e6. +- `ExpressionTransform` was executing `sleep(1)` function, so it `work` will takes 1e6, and so `elapsed_us` > 1e6. +- `SourceFromSingleChunk` need to wait, because `ExpressionTransform` does not accept any data during execution of `sleep(1)`, so it will be in `PortFull` state for 1e6 us, and so `output_wait_elapsed_us` > 1e6. +- `LimitsCheckingTransform`/`NullSource`/`LazyOutputFormat` need to wait until `ExpressionTransform` will execute `sleep(1)` to process the result, so `input_wait_elapsed_us` > 1e6. **See Also** diff --git a/docs/en/operations/system-tables/row_policies.md b/docs/en/operations/system-tables/row_policies.md index db6bbe42703..2c4d060ce66 100644 --- a/docs/en/operations/system-tables/row_policies.md +++ b/docs/en/operations/system-tables/row_policies.md @@ -6,29 +6,29 @@ slug: /en/operations/system-tables/row_policies Contains filters for one particular table, as well as a list of roles and/or users which should use this row policy. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a row policy. +- `name` ([String](../../sql-reference/data-types/string.md)) — Name of a row policy. -- `short_name` ([String](../../sql-reference/data-types/string.md)) — Short name of a row policy. Names of row policies are compound, for example: myfilter ON mydb.mytable. Here "myfilter ON mydb.mytable" is the name of the row policy, "myfilter" is it's short name. +- `short_name` ([String](../../sql-reference/data-types/string.md)) — Short name of a row policy. Names of row policies are compound, for example: myfilter ON mydb.mytable. Here "myfilter ON mydb.mytable" is the name of the row policy, "myfilter" is it's short name. -- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. +- `database` ([String](../../sql-reference/data-types/string.md)) — Database name. -- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. +- `table` ([String](../../sql-reference/data-types/string.md)) — Table name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Row policy ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Row policy ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Name of the directory where the row policy is stored. -- `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Condition which is used to filter rows. +- `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Condition which is used to filter rows. -- `is_restrictive` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the row policy restricts access to rows, see [CREATE ROW POLICY](../../sql-reference/statements/create/row-policy.md#create-row-policy-as). Value: +- `is_restrictive` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows whether the row policy restricts access to rows, see [CREATE ROW POLICY](../../sql-reference/statements/create/row-policy.md#create-row-policy-as). Value: - `0` — The row policy is defined with `AS PERMISSIVE` clause. - `1` — The row policy is defined with `AS RESTRICTIVE` clause. -- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the row policies set for all roles and/or users. +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the row policies set for all roles and/or users. -- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the row policies is applied. +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the row policies is applied. -- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The row policies is applied to all roles and/or users excepting of the listed ones. +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The row policies is applied to all roles and/or users excepting of the listed ones. ## See Also {#see-also} diff --git a/docs/en/operations/system-tables/settings_profile_elements.md b/docs/en/operations/system-tables/settings_profile_elements.md index da6248e791d..c1fc562e1e9 100644 --- a/docs/en/operations/system-tables/settings_profile_elements.md +++ b/docs/en/operations/system-tables/settings_profile_elements.md @@ -10,22 +10,22 @@ Describes the content of the settings profile: - Parent settings profiles. Columns: -- `profile_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting profile name. +- `profile_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting profile name. -- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — User name. -- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role name. +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Role name. -- `index` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Sequential number of the settings profile element. +- `index` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Sequential number of the settings profile element. -- `setting_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting name. +- `setting_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting name. -- `value` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting value. +- `value` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — Setting value. -- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The minimum value of the setting. `NULL` if not set. +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The minimum value of the setting. `NULL` if not set. -- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The maximum value of the setting. NULL if not set. +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — The maximum value of the setting. NULL if not set. -- `readonly` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges))) — Profile that allows only read queries. +- `readonly` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges))) — Profile that allows only read queries. -- `inherit_profile` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — A parent profile for this setting profile. `NULL` if not set. Setting profile will inherit all the settings' values and constraints (`min`, `max`, `readonly`) from its parent profiles. +- `inherit_profile` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — A parent profile for this setting profile. `NULL` if not set. Setting profile will inherit all the settings' values and constraints (`min`, `max`, `readonly`) from its parent profiles. diff --git a/docs/en/operations/system-tables/settings_profiles.md b/docs/en/operations/system-tables/settings_profiles.md index 8138022cbe6..635a4e47dfd 100644 --- a/docs/en/operations/system-tables/settings_profiles.md +++ b/docs/en/operations/system-tables/settings_profiles.md @@ -6,19 +6,19 @@ slug: /en/operations/system-tables/settings_profiles Contains properties of configured setting profiles. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — Setting profile name. +- `name` ([String](../../sql-reference/data-types/string.md)) — Setting profile name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Setting profile ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — Setting profile ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of setting profiles. Configured in the `access_control_path` parameter. -- `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of elements for this profile in the `system.settings_profile_elements` table. +- `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — Number of elements for this profile in the `system.settings_profile_elements` table. -- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the settings profile set for all roles and/or users. +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that the settings profile set for all roles and/or users. -- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the setting profile is applied. +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of the roles and/or users to which the setting profile is applied. -- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The setting profile is applied to all roles and/or users excepting of the listed ones. +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — The setting profile is applied to all roles and/or users excepting of the listed ones. ## See Also {#see-also} diff --git a/docs/en/operations/system-tables/users.md b/docs/en/operations/system-tables/users.md index 61fa490933e..a90fa01a45d 100644 --- a/docs/en/operations/system-tables/users.md +++ b/docs/en/operations/system-tables/users.md @@ -6,29 +6,29 @@ slug: /en/operations/system-tables/users Contains a list of [user accounts](../../guides/sre/user-management/index.md#user-account-management) configured at the server. Columns: -- `name` ([String](../../sql-reference/data-types/string.md)) — User name. +- `name` ([String](../../sql-reference/data-types/string.md)) — User name. -- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — User ID. +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — User ID. -- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. +- `storage` ([String](../../sql-reference/data-types/string.md)) — Path to the storage of users. Configured in the `access_control_path` parameter. -- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5, 'ssl_certificate' = 6)) — Shows the authentication type. There are multiple ways of user identification: with no password, with plain text password, with [SHA256](https://ru.wikipedia.org/wiki/SHA-2)-encoded password or with [double SHA-1](https://ru.wikipedia.org/wiki/SHA-1)-encoded password. +- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0,'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5, 'ssl_certificate' = 6)) — Shows the authentication type. There are multiple ways of user identification: with no password, with plain text password, with [SHA256](https://ru.wikipedia.org/wiki/SHA-2)-encoded password or with [double SHA-1](https://ru.wikipedia.org/wiki/SHA-1)-encoded password. -- `auth_params` ([String](../../sql-reference/data-types/string.md)) — Authentication parameters in the JSON format depending on the `auth_type`. +- `auth_params` ([String](../../sql-reference/data-types/string.md)) — Authentication parameters in the JSON format depending on the `auth_type`. -- `host_ip` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — IP addresses of hosts that are allowed to connect to the ClickHouse server. +- `host_ip` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — IP addresses of hosts that are allowed to connect to the ClickHouse server. -- `host_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server. +- `host_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server. -- `host_names_regexp` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Regular expression for host names that are allowed to connect to the ClickHouse server. +- `host_names_regexp` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Regular expression for host names that are allowed to connect to the ClickHouse server. -- `host_names_like` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server, set using the LIKE predicate. +- `host_names_like` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Names of hosts that are allowed to connect to the ClickHouse server, set using the LIKE predicate. -- `default_roles_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that all granted roles set for user by default. +- `default_roles_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Shows that all granted roles set for user by default. -- `default_roles_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of granted roles provided by default. +- `default_roles_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — List of granted roles provided by default. -- `default_roles_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — All the granted roles set as default excepting of the listed ones. +- `default_roles_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — All the granted roles set as default excepting of the listed ones. ## See Also {#see-also} diff --git a/docs/en/sql-reference/aggregate-functions/parametric-functions.md b/docs/en/sql-reference/aggregate-functions/parametric-functions.md index 5b0b33b7ec9..1b20f74d466 100644 --- a/docs/en/sql-reference/aggregate-functions/parametric-functions.md +++ b/docs/en/sql-reference/aggregate-functions/parametric-functions.md @@ -543,8 +543,8 @@ sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event **Returned values** -- `event_column[next_index]` — If the pattern is matched and next value exists. -- `NULL` - If the pattern isn’t matched or next value doesn't exist. +- `event_column[next_index]` — If the pattern is matched and next value exists. +- `NULL` - If the pattern isn’t matched or next value doesn't exist. Type: [Nullable(String)](../../sql-reference/data-types/nullable.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/contingency.md b/docs/en/sql-reference/aggregate-functions/reference/contingency.md index e87b03196d7..1b53ca1528f 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/contingency.md +++ b/docs/en/sql-reference/aggregate-functions/reference/contingency.md @@ -20,7 +20,7 @@ contingency(column1, column2) **Returned value** -- a value between 0 to 1. The larger the result, the closer the association of the two columns. +- a value between 0 to 1. The larger the result, the closer the association of the two columns. **Return type** is always [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/cramersv.md b/docs/en/sql-reference/aggregate-functions/reference/cramersv.md index 45e3758631b..f412724ea08 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/cramersv.md +++ b/docs/en/sql-reference/aggregate-functions/reference/cramersv.md @@ -19,7 +19,7 @@ cramersV(column1, column2) **Returned value** -- a value between 0 (corresponding to no association between the columns' values) to 1 (complete association). +- a value between 0 (corresponding to no association between the columns' values) to 1 (complete association). **Return type** is always [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md b/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md index 718fe733e84..8e577efbc4d 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md +++ b/docs/en/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md @@ -22,7 +22,7 @@ cramersVBiasCorrected(column1, column2) **Returned value** -- a value between 0 (corresponding to no association between the columns' values) to 1 (complete association). +- a value between 0 (corresponding to no association between the columns' values) to 1 (complete association). **Return type** is always [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md index 3cb5f17b6bb..1a729b18b42 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md +++ b/docs/en/sql-reference/aggregate-functions/reference/sumkahan.md @@ -21,7 +21,7 @@ sumKahan(x) **Returned value** -- the sum of numbers, with type [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md) depends on type of input arguments +- the sum of numbers, with type [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), or [Decimal](../../../sql-reference/data-types/decimal.md) depends on type of input arguments **Example** diff --git a/docs/en/sql-reference/aggregate-functions/reference/theilsu.md b/docs/en/sql-reference/aggregate-functions/reference/theilsu.md index 9a56f9832d8..ef19438a53a 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/theilsu.md +++ b/docs/en/sql-reference/aggregate-functions/reference/theilsu.md @@ -20,7 +20,7 @@ theilsU(column1, column2) **Returned value** -- a value between -1 and 1 +- a value between -1 and 1 **Return type** is always [Float64](../../../sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/functions/geo/h3.md b/docs/en/sql-reference/functions/geo/h3.md index a3698779ea0..1f695a13598 100644 --- a/docs/en/sql-reference/functions/geo/h3.md +++ b/docs/en/sql-reference/functions/geo/h3.md @@ -279,7 +279,7 @@ h3ToGeoBoundary(h3Index) **Returned values** -- Array of pairs '(lon, lat)'. +- Array of pairs '(lon, lat)'. Type: [Array](../../../sql-reference/data-types/array.md)([Float64](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md)). @@ -899,7 +899,7 @@ h3ExactEdgeLengthM(index) **Returned value** -- Exact edge length in meters. +- Exact edge length in meters. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -935,7 +935,7 @@ h3ExactEdgeLengthKm(index) **Returned value** -- Exact edge length in kilometers. +- Exact edge length in kilometers. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -971,7 +971,7 @@ h3ExactEdgeLengthRads(index) **Returned value** -- Exact edge length in radians. +- Exact edge length in radians. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -1007,7 +1007,7 @@ h3NumHexagons(resolution) **Returned value** -- Number of H3 indices. +- Number of H3 indices. Type: [Int64](../../../sql-reference/data-types/int-uint.md). @@ -1044,7 +1044,7 @@ h3PointDistM(lat1, lon1, lat2, lon2) **Returned values** -- Haversine or great circle distance in meters. +- Haversine or great circle distance in meters. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -1081,7 +1081,7 @@ h3PointDistKm(lat1, lon1, lat2, lon2) **Returned values** -- Haversine or great circle distance in kilometers. +- Haversine or great circle distance in kilometers. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -1118,7 +1118,7 @@ h3PointDistRads(lat1, lon1, lat2, lon2) **Returned values** -- Haversine or great circle distance in radians. +- Haversine or great circle distance in radians. Type: [Float64](../../../sql-reference/data-types/float.md). @@ -1150,7 +1150,7 @@ h3GetRes0Indexes() **Returned values** -- Array of all the resolution 0 H3 indexes. +- Array of all the resolution 0 H3 indexes. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -1187,7 +1187,7 @@ h3GetPentagonIndexes(resolution) **Returned value** -- Array of all pentagon H3 indexes. +- Array of all pentagon H3 indexes. Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)). @@ -1261,7 +1261,7 @@ h3Distance(start,end) **Returned value** -- Number of grid cells. +- Number of grid cells. Type: [Int64](../../../sql-reference/data-types/int-uint.md). @@ -1339,7 +1339,7 @@ h3GetUnidirectionalEdge(originIndex, destinationIndex) **Returned value** -- Unidirectional Edge Hexagon Index number. +- Unidirectional Edge Hexagon Index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -1412,7 +1412,7 @@ h3GetOriginIndexFromUnidirectionalEdge(edge) **Returned value** -- Origin Hexagon Index number. +- Origin Hexagon Index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -1448,7 +1448,7 @@ h3GetDestinationIndexFromUnidirectionalEdge(edge) **Returned value** -- Destination Hexagon Index number. +- Destination Hexagon Index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md). @@ -1559,7 +1559,7 @@ h3GetUnidirectionalEdgeBoundary(index) **Returned value** -- Array of pairs '(lon, lat)'. +- Array of pairs '(lon, lat)'. Type: [Array](../../../sql-reference/data-types/array.md)([Float64](../../../sql-reference/data-types/float.md), [Float64](../../../sql-reference/data-types/float.md)). diff --git a/docs/en/sql-reference/functions/math-functions.md b/docs/en/sql-reference/functions/math-functions.md index 4ec0e3cd778..78d8d7c37e2 100644 --- a/docs/en/sql-reference/functions/math-functions.md +++ b/docs/en/sql-reference/functions/math-functions.md @@ -431,8 +431,8 @@ sign(x) **Returned value** - -1 for `x < 0` -- 0 for `x = 0` -- 1 for `x > 0` +- 0 for `x = 0` +- 1 for `x > 0` **Examples** diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index 43eadc992c5..25bac9c0a5a 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -950,7 +950,7 @@ x::t **Returned value** -- Converted value. +- Converted value. :::note If the input value does not fit the bounds of the target type, the result overflows. For example, `CAST(-1, 'UInt8')` returns `255`. @@ -1789,7 +1789,7 @@ snowflakeToDateTime(value [, time_zone]) **Returned value** -- Input value converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. +- Input value converted to the [DateTime](/docs/en/sql-reference/data-types/datetime.md) data type. **Example** @@ -1825,7 +1825,7 @@ snowflakeToDateTime64(value [, time_zone]) **Returned value** -- Input value converted to the [DateTime64](/docs/en/sql-reference/data-types/datetime64.md) data type. +- Input value converted to the [DateTime64](/docs/en/sql-reference/data-types/datetime64.md) data type. **Example** diff --git a/docs/en/sql-reference/statements/explain.md b/docs/en/sql-reference/statements/explain.md index d2472966b7d..1c93707402f 100644 --- a/docs/en/sql-reference/statements/explain.md +++ b/docs/en/sql-reference/statements/explain.md @@ -45,11 +45,11 @@ Union ## EXPLAIN Types -- `AST` — Abstract syntax tree. -- `SYNTAX` — Query text after AST-level optimizations. -- `QUERY TREE` — Query tree after Query Tree level optimizations. -- `PLAN` — Query execution plan. -- `PIPELINE` — Query execution pipeline. +- `AST` — Abstract syntax tree. +- `SYNTAX` — Query text after AST-level optimizations. +- `QUERY TREE` — Query tree after Query Tree level optimizations. +- `PLAN` — Query execution plan. +- `PIPELINE` — Query execution pipeline. ### EXPLAIN AST diff --git a/docs/en/sql-reference/statements/show.md b/docs/en/sql-reference/statements/show.md index 6a7b8aab014..428a04ae030 100644 --- a/docs/en/sql-reference/statements/show.md +++ b/docs/en/sql-reference/statements/show.md @@ -244,7 +244,7 @@ Result: **See also** -- [system.columns](https://clickhouse.com/docs/en/operations/system-tables/columns) +- [system.columns](https://clickhouse.com/docs/en/operations/system-tables/columns) ## SHOW DICTIONARIES diff --git a/docs/en/sql-reference/table-functions/cluster.md b/docs/en/sql-reference/table-functions/cluster.md index f73a1cc0c3a..904c678750c 100644 --- a/docs/en/sql-reference/table-functions/cluster.md +++ b/docs/en/sql-reference/table-functions/cluster.md @@ -25,7 +25,7 @@ clusterAllReplicas('cluster_name', db, table[, sharding_key]) - `cluster_name` – Name of a cluster that is used to build a set of addresses and connection parameters to remote and local servers. - `db.table` or `db`, `table` - Name of a database and a table. -- `sharding_key` - A sharding key. Optional. Needs to be specified if the cluster has more than one shard. +- `sharding_key` - A sharding key. Optional. Needs to be specified if the cluster has more than one shard. **Returned value** diff --git a/docs/en/sql-reference/table-functions/index.md b/docs/en/sql-reference/table-functions/index.md index 650361b5f2c..b16295db36a 100644 --- a/docs/en/sql-reference/table-functions/index.md +++ b/docs/en/sql-reference/table-functions/index.md @@ -10,7 +10,7 @@ Table functions are methods for constructing tables. You can use table functions in: -- [FROM](../../sql-reference/statements/select/from.md) clause of the `SELECT` query. +- [FROM](../../sql-reference/statements/select/from.md) clause of the `SELECT` query. The method for creating a temporary table that is available only in the current query. The table is deleted when the query finishes. diff --git a/docs/en/sql-reference/window-functions/index.md b/docs/en/sql-reference/window-functions/index.md index 59d49830852..bc0bf03e5d4 100644 --- a/docs/en/sql-reference/window-functions/index.md +++ b/docs/en/sql-reference/window-functions/index.md @@ -140,8 +140,8 @@ ORDER BY │ 1 │ 1 │ 1 │ [1,2,3] │ <┐ │ 1 │ 2 │ 2 │ [1,2,3] │ │ 1-st group │ 1 │ 3 │ 3 │ [1,2,3] │ <┘ -│ 2 │ 0 │ 0 │ [0] │ <- 2-nd group -│ 3 │ 0 │ 0 │ [0] │ <- 3-d group +│ 2 │ 0 │ 0 │ [0] │ <- 2-nd group +│ 3 │ 0 │ 0 │ [0] │ <- 3-d group └──────────┴───────┴───────┴──────────────┘ ``` From a7217c357571b571da8d760effda6dae24882ab7 Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Wed, 19 Apr 2023 18:21:38 +0200 Subject: [PATCH 373/535] Fix flaky 02706_arrow_different_dictionaries --- tests/queries/0_stateless/02706_arrow_different_dictionaries.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh b/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh index b755696aec2..d3958aa768d 100755 --- a/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh +++ b/tests/queries/0_stateless/02706_arrow_different_dictionaries.sh @@ -5,5 +5,5 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh -$CLICKHOUSE_LOCAL -q "select toLowCardinality(toString(number % 10)) as x from numbers(20) format Arrow settings max_block_size=7, output_format_arrow_low_cardinality_as_dictionary=1" | $CLICKHOUSE_LOCAL -q "select * from table" --input-format='Arrow' +$CLICKHOUSE_LOCAL -q "select toLowCardinality(toString(number % 10)) as x from numbers(20) format Arrow settings max_block_size=7, output_format_arrow_low_cardinality_as_dictionary=1" | $CLICKHOUSE_LOCAL -q "select * from table order by x" --input-format='Arrow' From 8f159e3a01a8fdb8870614ac819f2d8586aa099d Mon Sep 17 00:00:00 2001 From: Kruglov Pavel <48961922+Avogar@users.noreply.github.com> Date: Wed, 19 Apr 2023 18:23:02 +0200 Subject: [PATCH 374/535] Update test reference --- ...2706_arrow_different_dictionaries.reference | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference b/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference index 7b36cc96f5e..eda4c04d605 100644 --- a/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference +++ b/tests/queries/0_stateless/02706_arrow_different_dictionaries.reference @@ -1,20 +1,20 @@ 0 +0 1 -2 -3 -4 -5 -6 -7 -8 -9 -0 1 2 +2 +3 3 4 +4 +5 5 6 +6 +7 7 8 +8 +9 9 From ec5b421be470ab325260d7eda3ffff6df45b1d2c Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 17:05:55 +0000 Subject: [PATCH 375/535] Docs: Sort functions in sidebar --- .../functions/arithmetic-functions.md | 2 +- .../functions/array-functions.md | 2 +- docs/en/sql-reference/functions/array-join.md | 2 +- .../sql-reference/functions/bit-functions.md | 2 +- .../functions/bitmap-functions.md | 2 +- .../functions/comparison-functions.md | 2 +- .../functions/conditional-functions.md | 4 +- .../functions/date-time-functions.md | 2 +- .../functions/distance-functions.md | 5 ++- .../functions/encoding-functions.md | 2 +- .../functions/encryption-functions.md | 3 +- .../functions/ext-dict-functions.md | 2 +- docs/en/sql-reference/functions/files.md | 3 +- .../functions/functions-for-nulls.md | 2 +- .../sql-reference/functions/hash-functions.md | 2 +- .../sql-reference/functions/in-functions.md | 2 +- docs/en/sql-reference/functions/index.md | 6 +-- .../sql-reference/functions/introspection.md | 2 +- .../functions/ip-address-functions.md | 2 +- .../sql-reference/functions/json-functions.md | 2 +- .../functions/logical-functions.md | 2 +- .../functions/machine-learning-functions.md | 4 +- .../sql-reference/functions/math-functions.md | 2 +- .../sql-reference/functions/nlp-functions.md | 5 +-- .../functions/other-functions.md | 2 +- .../functions/random-functions.md | 38 +++++++++---------- .../functions/rounding-functions.md | 2 +- .../functions/splitting-merging-functions.md | 2 +- .../functions/string-functions.md | 2 +- .../functions/string-replace-functions.md | 2 +- .../functions/string-search-functions.md | 2 +- .../functions/time-window-functions.md | 4 +- .../functions/tuple-functions.md | 3 +- .../functions/tuple-map-functions.md | 3 +- .../functions/type-conversion-functions.md | 2 +- .../sql-reference/functions/ulid-functions.md | 2 +- .../functions/uniqtheta-functions.md | 2 + .../sql-reference/functions/url-functions.md | 2 +- .../sql-reference/functions/uuid-functions.md | 2 +- .../functions/ym-dict-functions.md | 2 +- 40 files changed, 68 insertions(+), 68 deletions(-) diff --git a/docs/en/sql-reference/functions/arithmetic-functions.md b/docs/en/sql-reference/functions/arithmetic-functions.md index 136e90854df..4cfd10f40c0 100644 --- a/docs/en/sql-reference/functions/arithmetic-functions.md +++ b/docs/en/sql-reference/functions/arithmetic-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/arithmetic-functions -sidebar_position: 34 +sidebar_position: 5 sidebar_label: Arithmetic --- diff --git a/docs/en/sql-reference/functions/array-functions.md b/docs/en/sql-reference/functions/array-functions.md index 072a3b8f705..2657e67934d 100644 --- a/docs/en/sql-reference/functions/array-functions.md +++ b/docs/en/sql-reference/functions/array-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/array-functions -sidebar_position: 35 +sidebar_position: 10 sidebar_label: Arrays --- diff --git a/docs/en/sql-reference/functions/array-join.md b/docs/en/sql-reference/functions/array-join.md index d6256ba2dc5..14968eb1092 100644 --- a/docs/en/sql-reference/functions/array-join.md +++ b/docs/en/sql-reference/functions/array-join.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/array-join -sidebar_position: 61 +sidebar_position: 15 sidebar_label: arrayJoin --- diff --git a/docs/en/sql-reference/functions/bit-functions.md b/docs/en/sql-reference/functions/bit-functions.md index 8223976b354..e754aa297c0 100644 --- a/docs/en/sql-reference/functions/bit-functions.md +++ b/docs/en/sql-reference/functions/bit-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/bit-functions -sidebar_position: 48 +sidebar_position: 20 sidebar_label: Bit --- diff --git a/docs/en/sql-reference/functions/bitmap-functions.md b/docs/en/sql-reference/functions/bitmap-functions.md index 69e9e672f6a..cfb4a39deab 100644 --- a/docs/en/sql-reference/functions/bitmap-functions.md +++ b/docs/en/sql-reference/functions/bitmap-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/bitmap-functions -sidebar_position: 49 +sidebar_position: 25 sidebar_label: Bitmap --- diff --git a/docs/en/sql-reference/functions/comparison-functions.md b/docs/en/sql-reference/functions/comparison-functions.md index 8476448cddd..66edbc62131 100644 --- a/docs/en/sql-reference/functions/comparison-functions.md +++ b/docs/en/sql-reference/functions/comparison-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/comparison-functions -sidebar_position: 36 +sidebar_position: 35 sidebar_label: Comparison --- diff --git a/docs/en/sql-reference/functions/conditional-functions.md b/docs/en/sql-reference/functions/conditional-functions.md index e93bbc04ac2..2f509dc9799 100644 --- a/docs/en/sql-reference/functions/conditional-functions.md +++ b/docs/en/sql-reference/functions/conditional-functions.md @@ -1,7 +1,7 @@ --- slug: /en/sql-reference/functions/conditional-functions -sidebar_position: 43 -sidebar_label: 'Conditional ' +sidebar_position: 40 +sidebar_label: Conditional --- # Conditional Functions diff --git a/docs/en/sql-reference/functions/date-time-functions.md b/docs/en/sql-reference/functions/date-time-functions.md index 446e9484436..e7e673c4fdd 100644 --- a/docs/en/sql-reference/functions/date-time-functions.md +++ b/docs/en/sql-reference/functions/date-time-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/date-time-functions -sidebar_position: 39 +sidebar_position: 45 sidebar_label: Dates and Times --- diff --git a/docs/en/sql-reference/functions/distance-functions.md b/docs/en/sql-reference/functions/distance-functions.md index 93c17819eec..660af6912b0 100644 --- a/docs/en/sql-reference/functions/distance-functions.md +++ b/docs/en/sql-reference/functions/distance-functions.md @@ -1,7 +1,10 @@ --- slug: /en/sql-reference/functions/distance-functions +sidebar_position: 55 +sidebar_label: Distance --- -# Distance functions + +# Distance Functions ## L1Norm diff --git a/docs/en/sql-reference/functions/encoding-functions.md b/docs/en/sql-reference/functions/encoding-functions.md index c1d85db9a12..618dd3f4b4f 100644 --- a/docs/en/sql-reference/functions/encoding-functions.md +++ b/docs/en/sql-reference/functions/encoding-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/encoding-functions -sidebar_position: 52 +sidebar_position: 65 sidebar_label: Encoding --- diff --git a/docs/en/sql-reference/functions/encryption-functions.md b/docs/en/sql-reference/functions/encryption-functions.md index a4cab4f57ac..1224b7bc92b 100644 --- a/docs/en/sql-reference/functions/encryption-functions.md +++ b/docs/en/sql-reference/functions/encryption-functions.md @@ -1,8 +1,7 @@ --- slug: /en/sql-reference/functions/encryption-functions -sidebar_position: 67 +sidebar_position: 70 sidebar_label: Encryption -title: "Encryption functions" --- These functions implement encryption and decryption of data with AES (Advanced Encryption Standard) algorithm. diff --git a/docs/en/sql-reference/functions/ext-dict-functions.md b/docs/en/sql-reference/functions/ext-dict-functions.md index c95171bf743..7d8aa2c0390 100644 --- a/docs/en/sql-reference/functions/ext-dict-functions.md +++ b/docs/en/sql-reference/functions/ext-dict-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/ext-dict-functions -sidebar_position: 58 +sidebar_position: 50 sidebar_label: Dictionaries --- diff --git a/docs/en/sql-reference/functions/files.md b/docs/en/sql-reference/functions/files.md index 2e4f18ee809..1c5b847d15d 100644 --- a/docs/en/sql-reference/functions/files.md +++ b/docs/en/sql-reference/functions/files.md @@ -1,8 +1,7 @@ --- slug: /en/sql-reference/functions/files -sidebar_position: 43 +sidebar_position: 75 sidebar_label: Files -title: "Functions for Working with Files" --- ## file diff --git a/docs/en/sql-reference/functions/functions-for-nulls.md b/docs/en/sql-reference/functions/functions-for-nulls.md index f810cc386cf..0b7df54b776 100644 --- a/docs/en/sql-reference/functions/functions-for-nulls.md +++ b/docs/en/sql-reference/functions/functions-for-nulls.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/functions-for-nulls -sidebar_position: 63 +sidebar_position: 135 sidebar_label: Nullable --- diff --git a/docs/en/sql-reference/functions/hash-functions.md b/docs/en/sql-reference/functions/hash-functions.md index 4f7cd7ee662..1f471e99255 100644 --- a/docs/en/sql-reference/functions/hash-functions.md +++ b/docs/en/sql-reference/functions/hash-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/hash-functions -sidebar_position: 50 +sidebar_position: 85 sidebar_label: Hash --- diff --git a/docs/en/sql-reference/functions/in-functions.md b/docs/en/sql-reference/functions/in-functions.md index 185672227da..193c54cea44 100644 --- a/docs/en/sql-reference/functions/in-functions.md +++ b/docs/en/sql-reference/functions/in-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/in-functions -sidebar_position: 60 +sidebar_position: 90 sidebar_label: IN Operator --- diff --git a/docs/en/sql-reference/functions/index.md b/docs/en/sql-reference/functions/index.md index 6767d7c6b7d..1577c01eec9 100644 --- a/docs/en/sql-reference/functions/index.md +++ b/docs/en/sql-reference/functions/index.md @@ -1,10 +1,10 @@ --- slug: /en/sql-reference/functions/ -sidebar_position: 32 -sidebar_label: Functions +sidebar_position: 1 +sidebar_label: Overview --- -# Functions +# Regular Functions There are at least\* two types of functions - regular functions (they are just called “functions”) and aggregate functions. These are completely different concepts. Regular functions work as if they are applied to each row separately (for each row, the result of the function does not depend on the other rows). Aggregate functions accumulate a set of values from various rows (i.e. they depend on the entire set of rows). diff --git a/docs/en/sql-reference/functions/introspection.md b/docs/en/sql-reference/functions/introspection.md index a02e549e931..8cb35483555 100644 --- a/docs/en/sql-reference/functions/introspection.md +++ b/docs/en/sql-reference/functions/introspection.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/introspection -sidebar_position: 65 +sidebar_position: 100 sidebar_label: Introspection --- diff --git a/docs/en/sql-reference/functions/ip-address-functions.md b/docs/en/sql-reference/functions/ip-address-functions.md index b55b64674cb..0dc1db1161b 100644 --- a/docs/en/sql-reference/functions/ip-address-functions.md +++ b/docs/en/sql-reference/functions/ip-address-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/ip-address-functions -sidebar_position: 55 +sidebar_position: 95 sidebar_label: IP Addresses --- diff --git a/docs/en/sql-reference/functions/json-functions.md b/docs/en/sql-reference/functions/json-functions.md index cce1dad4753..31d53ba0359 100644 --- a/docs/en/sql-reference/functions/json-functions.md +++ b/docs/en/sql-reference/functions/json-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/json-functions -sidebar_position: 56 +sidebar_position: 105 sidebar_label: JSON --- diff --git a/docs/en/sql-reference/functions/logical-functions.md b/docs/en/sql-reference/functions/logical-functions.md index 51baae07c12..36777d4e67f 100644 --- a/docs/en/sql-reference/functions/logical-functions.md +++ b/docs/en/sql-reference/functions/logical-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/logical-functions -sidebar_position: 37 +sidebar_position: 110 sidebar_label: Logical --- diff --git a/docs/en/sql-reference/functions/machine-learning-functions.md b/docs/en/sql-reference/functions/machine-learning-functions.md index 98408ef459c..44ce4dcd211 100644 --- a/docs/en/sql-reference/functions/machine-learning-functions.md +++ b/docs/en/sql-reference/functions/machine-learning-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/machine-learning-functions -sidebar_position: 64 +sidebar_position: 115 sidebar_label: Machine Learning --- @@ -16,4 +16,4 @@ The [stochasticLinearRegression](../../sql-reference/aggregate-functions/referen ## stochasticLogisticRegression -The [stochasticLogisticRegression](../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#agg_functions-stochasticlogisticregression) aggregate function implements stochastic gradient descent method for binary classification problem. Uses `evalMLMethod` to predict on new data. \ No newline at end of file +The [stochasticLogisticRegression](../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#agg_functions-stochasticlogisticregression) aggregate function implements stochastic gradient descent method for binary classification problem. Uses `evalMLMethod` to predict on new data. diff --git a/docs/en/sql-reference/functions/math-functions.md b/docs/en/sql-reference/functions/math-functions.md index 78d8d7c37e2..023b5d50f4b 100644 --- a/docs/en/sql-reference/functions/math-functions.md +++ b/docs/en/sql-reference/functions/math-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/math-functions -sidebar_position: 44 +sidebar_position: 125 sidebar_label: Mathematical --- diff --git a/docs/en/sql-reference/functions/nlp-functions.md b/docs/en/sql-reference/functions/nlp-functions.md index 0b95a14dda4..41773dc1a0d 100644 --- a/docs/en/sql-reference/functions/nlp-functions.md +++ b/docs/en/sql-reference/functions/nlp-functions.md @@ -1,8 +1,7 @@ --- slug: /en/sql-reference/functions/nlp-functions -sidebar_position: 67 -sidebar_label: NLP -title: "[experimental] Natural Language Processing functions" +sidebar_position: 130 +sidebar_label: NLP (experimental) --- :::note diff --git a/docs/en/sql-reference/functions/other-functions.md b/docs/en/sql-reference/functions/other-functions.md index 32cf7972864..600ec576339 100644 --- a/docs/en/sql-reference/functions/other-functions.md +++ b/docs/en/sql-reference/functions/other-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/other-functions -sidebar_position: 67 +sidebar_position: 140 sidebar_label: Other --- diff --git a/docs/en/sql-reference/functions/random-functions.md b/docs/en/sql-reference/functions/random-functions.md index ce003e239f2..879cf376028 100644 --- a/docs/en/sql-reference/functions/random-functions.md +++ b/docs/en/sql-reference/functions/random-functions.md @@ -1,31 +1,31 @@ --- slug: /en/sql-reference/functions/random-functions -sidebar_position: 51 -sidebar_label: Pseudo-Random Numbers +sidebar_position: 145 +sidebar_label: Random Numbers --- -# Functions for Generating Pseudo-Random Numbers +# Functions for Generating Random Numbers All the functions accept zero arguments or one argument. If an argument is passed, it can be any type, and its value is not used for anything. The only purpose of this argument is to prevent common subexpression elimination, so that two different instances of the same function return different columns with different random numbers. :::note -Non-cryptographic generators of pseudo-random numbers are used. +Non-cryptographic generators of random numbers are used. ::: ## rand, rand32 -Returns a pseudo-random UInt32 number, evenly distributed among all UInt32-type numbers. +Returns a random UInt32 number, evenly distributed among all UInt32-type numbers. Uses a linear congruential generator. ## rand64 -Returns a pseudo-random UInt64 number, evenly distributed among all UInt64-type numbers. +Returns a random UInt64 number, evenly distributed among all UInt64-type numbers. Uses a linear congruential generator. ## randCanonical -The function generates pseudo random results with independent and identically distributed uniformly distributed values in [0, 1). +The function generates results with independent and identically distributed uniformly distributed values in [0, 1). Non-deterministic. Return type is Float64. @@ -45,7 +45,7 @@ randConstant([x]) **Returned value** -- Pseudo-random number. +- Random number. Type: [UInt32](../../sql-reference/data-types/int-uint.md). @@ -93,7 +93,7 @@ randUniform(min, max) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -136,7 +136,7 @@ randNormal(meam, variance) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -179,7 +179,7 @@ randLogNormal(meam, variance) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -222,7 +222,7 @@ randBinomial(experiments, probability) **Returned value** -- Pseudo-random number. +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -265,7 +265,7 @@ randNegativeBinomial(experiments, probability) **Returned value** -- Pseudo-random number. +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -307,7 +307,7 @@ randPoisson(n) **Returned value** -- Pseudo-random number. +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -349,7 +349,7 @@ randBernoulli(probability) **Returned value** -- Pseudo-random number. +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). @@ -391,7 +391,7 @@ randExponential(lambda) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -433,7 +433,7 @@ randChiSquared(degree_of_freedom) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -475,7 +475,7 @@ randStudentT(degree_of_freedom) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). @@ -518,7 +518,7 @@ randFisherF(d1, d2) **Returned value** -- Pseudo-random number. +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). diff --git a/docs/en/sql-reference/functions/rounding-functions.md b/docs/en/sql-reference/functions/rounding-functions.md index 9e2c747c8c2..e9a0ed72466 100644 --- a/docs/en/sql-reference/functions/rounding-functions.md +++ b/docs/en/sql-reference/functions/rounding-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/rounding-functions -sidebar_position: 45 +sidebar_position: 155 sidebar_label: Rounding --- diff --git a/docs/en/sql-reference/functions/splitting-merging-functions.md b/docs/en/sql-reference/functions/splitting-merging-functions.md index 423be39be1c..51efb5688bf 100644 --- a/docs/en/sql-reference/functions/splitting-merging-functions.md +++ b/docs/en/sql-reference/functions/splitting-merging-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/splitting-merging-functions -sidebar_position: 47 +sidebar_position: 165 sidebar_label: Splitting and Merging Strings and Arrays --- diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 58433785290..35bf154d14c 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/string-functions -sidebar_position: 40 +sidebar_position: 170 sidebar_label: Strings --- diff --git a/docs/en/sql-reference/functions/string-replace-functions.md b/docs/en/sql-reference/functions/string-replace-functions.md index d4c7c451af2..084b20bb3eb 100644 --- a/docs/en/sql-reference/functions/string-replace-functions.md +++ b/docs/en/sql-reference/functions/string-replace-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/string-replace-functions -sidebar_position: 42 +sidebar_position: 150 sidebar_label: Replacing in Strings --- diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md index 058acfc0952..587636376f9 100644 --- a/docs/en/sql-reference/functions/string-search-functions.md +++ b/docs/en/sql-reference/functions/string-search-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/string-search-functions -sidebar_position: 41 +sidebar_position: 160 sidebar_label: Searching in Strings --- diff --git a/docs/en/sql-reference/functions/time-window-functions.md b/docs/en/sql-reference/functions/time-window-functions.md index c0eed01cccd..d8f23c92e61 100644 --- a/docs/en/sql-reference/functions/time-window-functions.md +++ b/docs/en/sql-reference/functions/time-window-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/time-window-functions -sidebar_position: 68 +sidebar_position: 175 sidebar_label: Time Window --- @@ -118,4 +118,4 @@ hopEnd(time_attr, hop_interval, window_interval [, timezone]); ## Related content -- Blog: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) \ No newline at end of file +- Blog: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/en/sql-reference/functions/tuple-functions.md b/docs/en/sql-reference/functions/tuple-functions.md index bb0b7f639d8..d7594e67443 100644 --- a/docs/en/sql-reference/functions/tuple-functions.md +++ b/docs/en/sql-reference/functions/tuple-functions.md @@ -1,8 +1,7 @@ --- slug: /en/sql-reference/functions/tuple-functions -sidebar_position: 66 +sidebar_position: 180 sidebar_label: Tuples -title: "Functions for Working with Tuples" --- ## tuple diff --git a/docs/en/sql-reference/functions/tuple-map-functions.md b/docs/en/sql-reference/functions/tuple-map-functions.md index e6d0023cba7..087a133500e 100644 --- a/docs/en/sql-reference/functions/tuple-map-functions.md +++ b/docs/en/sql-reference/functions/tuple-map-functions.md @@ -1,8 +1,7 @@ --- slug: /en/sql-reference/functions/tuple-map-functions -sidebar_position: 46 +sidebar_position: 120 sidebar_label: Maps -title: "Functions for Maps" --- ## map diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index 25bac9c0a5a..ff2288abac8 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/type-conversion-functions -sidebar_position: 38 +sidebar_position: 185 sidebar_label: Type Conversion --- diff --git a/docs/en/sql-reference/functions/ulid-functions.md b/docs/en/sql-reference/functions/ulid-functions.md index 469105c9c74..eb69b1779ae 100644 --- a/docs/en/sql-reference/functions/ulid-functions.md +++ b/docs/en/sql-reference/functions/ulid-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/ulid-functions -sidebar_position: 54 +sidebar_position: 190 sidebar_label: ULID --- diff --git a/docs/en/sql-reference/functions/uniqtheta-functions.md b/docs/en/sql-reference/functions/uniqtheta-functions.md index 4fa2e47ce05..abe58e48715 100644 --- a/docs/en/sql-reference/functions/uniqtheta-functions.md +++ b/docs/en/sql-reference/functions/uniqtheta-functions.md @@ -1,5 +1,7 @@ --- slug: /en/sql-reference/functions/uniqtheta-functions +sidebar_position: 210 +sidebar_label: uniqTheta --- # uniqTheta Functions diff --git a/docs/en/sql-reference/functions/url-functions.md b/docs/en/sql-reference/functions/url-functions.md index f675563aec4..f6871c86c4f 100644 --- a/docs/en/sql-reference/functions/url-functions.md +++ b/docs/en/sql-reference/functions/url-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/url-functions -sidebar_position: 54 +sidebar_position: 200 sidebar_label: URLs --- diff --git a/docs/en/sql-reference/functions/uuid-functions.md b/docs/en/sql-reference/functions/uuid-functions.md index 6599d63ec3c..7322603c88c 100644 --- a/docs/en/sql-reference/functions/uuid-functions.md +++ b/docs/en/sql-reference/functions/uuid-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/uuid-functions -sidebar_position: 53 +sidebar_position: 205 sidebar_label: UUID --- diff --git a/docs/en/sql-reference/functions/ym-dict-functions.md b/docs/en/sql-reference/functions/ym-dict-functions.md index 918d61aad82..a516f09d709 100644 --- a/docs/en/sql-reference/functions/ym-dict-functions.md +++ b/docs/en/sql-reference/functions/ym-dict-functions.md @@ -1,6 +1,6 @@ --- slug: /en/sql-reference/functions/ym-dict-functions -sidebar_position: 59 +sidebar_position: 60 sidebar_label: Embedded Dictionaries --- From 69db6f19126a53d7f611817dafb33e6a5e4f8a44 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 17:49:40 +0000 Subject: [PATCH 376/535] Docs: Cleanup arithmetic function docs --- .../functions/arithmetic-functions.md | 274 +++++++++++------- .../functions/type-conversion-functions.md | 4 +- 2 files changed, 177 insertions(+), 101 deletions(-) diff --git a/docs/en/sql-reference/functions/arithmetic-functions.md b/docs/en/sql-reference/functions/arithmetic-functions.md index 4cfd10f40c0..164f5693e1c 100644 --- a/docs/en/sql-reference/functions/arithmetic-functions.md +++ b/docs/en/sql-reference/functions/arithmetic-functions.md @@ -6,7 +6,9 @@ sidebar_label: Arithmetic # Arithmetic Functions -For all arithmetic functions, the result type is calculated as the smallest number type that the result fits in, if there is such a type. The minimum is taken simultaneously based on the number of bits, whether it is signed, and whether it floats. If there are not enough bits, the highest bit type is taken. +The result type of all arithmetic functions is the smallest type which can represent all possible results. Size promotion happens for integers up to 32 bit, e.g. `UInt8 + UInt16 = UInt32`. If one of the inters has 64 or more bits, the result is of the same type as the bigger of the input integers, e.g. `UInt16 + UInt128 = UInt128`. While this introduces a risk of overflows around the value range boundary, it ensures that calculations are performed quickly using the maximum native integer width of 64 bit. + +The result of addition or multiplication of two integers is unsigned unless one of the integers is signed. Example: @@ -20,36 +22,74 @@ SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 └───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘ ``` -Arithmetic functions work for any pair of types from UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, or Float64. +Arithmetic functions work for any pair of `UInt8`, `UInt16`, `UInt32`, `UInt64`, `Int8`, `Int16`, `Int32`, `Int64`, `Float32`, or `Float64` values. -Overflow is produced the same way as in C++. +Overflows are produced the same way as in C++. -## plus(a, b), a + b operator +## plus -Calculates the sum of the numbers. -You can also add integer numbers with a date or date and time. In the case of a date, adding an integer means adding the corresponding number of days. For a date with time, it means adding the corresponding number of seconds. +**Syntax** -## minus(a, b), a - b operator +```sql +plus(a, b) +``` -Calculates the difference. The result is always signed. +Calculates the sum of `a` and `b`. -You can also calculate integer numbers from a date or date with time. The idea is the same – see above for ‘plus’. +It is possible to add an integer and a date or date with time. The former operation increments the number of days in the date, the latter operation increments the number of seconds. -## multiply(a, b), a \* b operator +Alias: `a + b` (operator) -Calculates the product of the numbers. +## minus -## divide(a, b), a / b operator +**Syntax** -Calculates the quotient of the numbers. The result type is always a floating-point type. -It is not integer division. For integer division, use the ‘intDiv’ function. -When dividing by zero you get ‘inf’, ‘-inf’, or ‘nan’. +```sql +minus(a, b) +``` +Calculates the difference of `a` and `b`. The result is always signed. -## intDiv(a, b) +Similar to `plus`, it is possible to subtract an integer from a date or date with time. -Calculates the quotient of the numbers. Divides into integers, rounding down (by the absolute value). +Alias: `a - b` (operator) -Returns an integer of the type of the dividend (the first parameter). +## multiply + +**Syntax** + +```sql +multiply(a, b) +``` + +Calculates the product of `a` and `b`. + +Alias: `a \* b` (operator) + +## divide + +**Syntax** + +```sql +divide(a, b) +``` + +Calculates the quotient of `a` and `b`. The result is always a floating-point value. If you need integer division, you can use the `intDiv` function. + +Division by 0 returns `inf`, `-inf`, or `nan`. + +Alias: `a / b` (operator) + +## intDiv + +**Syntax** + +```sql +intDiv(a, b) +``` + +Performs an integer division of `a` by `b`, i.e. computes the quotient rounded down to the next smallest integer. + +The result has the same type as the dividend (the first parameter). An exception is thrown when dividing by zero, when the quotient does not fit in the range of the dividend, or when dividing a minimal negative number by minus one. @@ -62,6 +102,7 @@ SELECT intDiv(toFloat64(1), 0.001) AS res, toTypeName(res) ``` + ```response ┌──res─┬─toTypeName(intDiv(toFloat64(1), 0.001))─┐ │ 1000 │ Int64 │ @@ -73,30 +114,64 @@ SELECT intDiv(1, 0.001) AS res, toTypeName(res) ``` + ```response Received exception from server (version 23.2.1): Code: 153. DB::Exception: Received from localhost:9000. DB::Exception: Cannot perform integer division, because it will produce infinite or too large number: While processing intDiv(1, 0.001) AS res, toTypeName(res). (ILLEGAL_DIVISION) ``` -## intDivOrZero(a, b) +## intDivOrZero -Differs from ‘intDiv’ in that it returns zero when dividing by zero or when dividing a minimal negative number by minus one. +**Syntax** -## modulo(a, b), a % b operator +```sql +intDivOrZero(a, b) +``` + +Same as `intDiv` but returns zero when dividing by zero or when dividing a minimal negative number by minus one. + +## modulo + +**Syntax** + +```sql +modulo(a, b) +``` +Calculates the remainder of the division of `a` by `b`. -Calculates the remainder when dividing `a` by `b`. The result type is an integer if both inputs are integers. If one of the inputs is a floating-point number, the result is a floating-point number. + The remainder is computed like in C++. Truncated division is used for negative numbers. + An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. -## moduloOrZero(a, b) +Alias: `a % b` (operator) -Differs from [modulo](#modulo) in that it returns zero when the divisor is zero. +## moduloOrZero -## positiveModulo(a, b), positive_modulo(a, b), pmod(a, b) -Calculates the remainder when dividing `a` by `b`. Similar to the function `modulo` except that `positive_modulo` always returns a non-negative number. +**Syntax** -Notice that `positive_modulo` is 4-5 times slower than `modulo`. You should not use `positive_modulo` unless you want to get a positive result and don't care about performance too much. +```sql +moduloOrZero(a, b) +``` + +Like [modulo](#modulo) but returns zero when the divisor is zero. + +## positiveModulo(a, b) + +**Syntax** + +```sql +positiveModulo(a, b) +``` + +Like [modulo](#modulo) but always returns a non-negative number. + +This function is 4-5 times slower than `modulo`. + +Alias: +- `positive_modulo(a, b)` +- `pmod(a, b)` **Example** @@ -108,51 +183,67 @@ SELECT positiveModulo(-1, 10) Result: -```text - +```result ┌─positiveModulo(-1, 10)─┐ │ 9 │ └────────────────────────┘ ``` -## negate(a), -a operator - -Calculates a number with the reverse sign. The result is always signed. - -## abs(a) - -Calculates the absolute value of the number (a). That is, if a \< 0, it returns -a. For unsigned types it does not do anything. For signed integer types, it returns an unsigned number. - -## gcd(a, b) - -Returns the greatest common divisor of the numbers. -An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. - -## lcm(a, b) - -Returns the least common multiple of the numbers. -An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. - -## max2 - -Compares two values and returns the maximum. The returned value is converted to [Float64](../../sql-reference/data-types/float.md). +## negate **Syntax** ```sql -max2(value1, value2) +negate(a) ``` -**Arguments** +Negates `a`. The result is always signed. -- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). -- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). +Alias: `-a` -**Returned value** +## abs -- The maximum of two values. +**Syntax** -Type: [Float](../../sql-reference/data-types/float.md). +```sql +abs(a) +``` + +Calculates the absolute value of `a`. Has no effect if `a` is of an unsigned type. If `a` is of a signed type, it returns an unsigned number. + +## gcd + +**Syntax** + +```sql +gcd(a, b) +``` + +Returns the greatest common divisor of `a` and `b`. + +An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. + +## lcm(a, b) + +Returns the least common multiple of `a` and `b`. + +An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. + +**Syntax** + +```sql +lcm(a, b) +``` + +## max2 + +**Syntax** + +```sql +max2(a, b) +``` + +Returns the bigger of `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). **Example** @@ -164,7 +255,7 @@ SELECT max2(-1, 2); Result: -```text +```result ┌─max2(-1, 2)─┐ │ 2 │ └─────────────┘ @@ -172,24 +263,13 @@ Result: ## min2 -Compares two values and returns the minimum. The returned value is converted to [Float64](../../sql-reference/data-types/float.md). - **Syntax** ```sql -min2(value1, value2) +min2(a, b) ``` -**Arguments** - -- `value1` — First value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). -- `value2` — Second value. [Int/UInt](../../sql-reference/data-types/int-uint.md) or [Float](../../sql-reference/data-types/float.md). - -**Returned value** - -- The minimum of two values. - -Type: [Float](../../sql-reference/data-types/float.md). +Returns the smaller of `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). **Example** @@ -201,21 +281,13 @@ SELECT min2(-1, 2); Result: -```text +```result ┌─min2(-1, 2)─┐ │ -1 │ └─────────────┘ ``` -## multiplyDecimal(a, b[, result_scale]) - -Performs multiplication on two decimals. Result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). -Result scale can be explicitly specified by `result_scale` argument (const Integer in range `[0, 76]`). If not specified, the result scale is the max scale of given arguments. - -:::note -These functions work significantly slower than usual `multiply`. -In case you don't really need controlled precision and/or need fast computation, consider using [multiply](#multiply) -::: +## multiplyDecimal **Syntax** @@ -223,6 +295,12 @@ In case you don't really need controlled precision and/or need fast computation, multiplyDecimal(a, b[, result_scale]) ``` +Multiplies decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). + +The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. + +This function work significantly slower than usual `multiply`. In case no control over the result precision is needed and/or fast computation is desired, consider using `multiply`. + **Arguments** - `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). @@ -237,19 +315,20 @@ Type: [Decimal256](../../sql-reference/data-types/decimal.md). **Example** -```text +```result ┌─multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)─┐ │ 25.2 │ └────────────────────────────────────────────────────────────────┘ ``` -**Difference from regular multiplication:** +**Differences compared to regular multiplication:** + ```sql SELECT toDecimal64(-12.647, 3) * toDecimal32(2.1239, 4); SELECT toDecimal64(-12.647, 3) as a, toDecimal32(2.1239, 4) as b, multiplyDecimal(a, b); ``` -```text +```result ┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐ │ -26.8609633 │ └───────────────────────────────────────────────────────────┘ @@ -270,7 +349,7 @@ SELECT a * b; ``` -```text +```result ┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐ │ -12.647987876 │ 123.967645643 │ -1567.941279108 │ └───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘ @@ -279,15 +358,7 @@ Received exception from server (version 22.11.1): Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow: While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW) ``` -## divideDecimal(a, b[, result_scale]) - -Performs division on two decimals. Result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). -Result scale can be explicitly specified by `result_scale` argument (const Integer in range `[0, 76]`). If not specified, the result scale is the max scale of given arguments. - -:::note -These function work significantly slower than usual `divide`. -In case you don't really need controlled precision and/or need fast computation, consider using [divide](#divide). -::: +## divideDecimal **Syntax** @@ -295,6 +366,12 @@ In case you don't really need controlled precision and/or need fast computation, divideDecimal(a, b[, result_scale]) ``` +Divides two decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). + +The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. + +This function work significantly slower than usual `divide`. In case no control over the result precision is needed and/or fast computation is desired, consider using `divide`. + **Arguments** - `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). @@ -309,19 +386,20 @@ Type: [Decimal256](../../sql-reference/data-types/decimal.md). **Example** -```text +```result ┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐ │ -5.7142857142 │ └──────────────────────────────────────────────────────────────┘ ``` -**Difference from regular division:** +**Differences compared to regular division:** + ```sql SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1); SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); ``` -```text +```result ┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐ │ -5.7 │ └──────────────────────────────────────────────────┘ @@ -336,7 +414,7 @@ SELECT toDecimal64(-12, 0) / toDecimal32(2.1, 1); SELECT toDecimal64(-12, 0) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); ``` -```text +```result DB::Exception: Decimal result's scale is less than argument's one: While processing toDecimal64(-12, 0) / toDecimal32(2.1, 1). (ARGUMENT_OUT_OF_BOUND) ┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 5)─┐ diff --git a/docs/en/sql-reference/functions/type-conversion-functions.md b/docs/en/sql-reference/functions/type-conversion-functions.md index ff2288abac8..c7c66cc771f 100644 --- a/docs/en/sql-reference/functions/type-conversion-functions.md +++ b/docs/en/sql-reference/functions/type-conversion-functions.md @@ -8,9 +8,7 @@ sidebar_label: Type Conversion ## Common Issues with Data Conversion -ClickHouse generally uses the [same behavior as C++ programs](https://en.cppreference.com/w/cpp/language/implicit_conversion). In particular, -- the result of addition or multiplication of two integers is unsigned unless one of the integers is signed, -- the result of addition or multiplication of two integers is of the next bigger integer type such that every possible result can be represented (e.g. `UInt8 + UInt16 = UInt32`). Size promotion only happens for integers up to 32 bit. If one of the integers has 64 or more bits, the result of addition or multiplication is of the same type as the bigger of the input integers (e.g. `UInt16 + UInt128 = UInt128`) - while this introduces a risk of overflows around the value range boundary it ensures that calculations are performed quickly using the maximum native integer width of 64 bit. +ClickHouse generally uses the [same behavior as C++ programs](https://en.cppreference.com/w/cpp/language/implicit_conversion). `to` functions and [cast](#castx-t) behave differently in some cases, for example in case of [LowCardinality](../data-types/lowcardinality.md): [cast](#castx-t) removes [LowCardinality](../data-types/lowcardinality.md) trait `to` functions don't. The same with [Nullable](../data-types/nullable.md), this behaviour is not compatible with SQL standard, and it can be changed using [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) setting. From 9e13e5a52ade6efeee3984b60150a2781f11c952 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 18:09:20 +0000 Subject: [PATCH 377/535] Some fixes --- .../functions/arithmetic-functions.md | 123 ++++++++++-------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/docs/en/sql-reference/functions/arithmetic-functions.md b/docs/en/sql-reference/functions/arithmetic-functions.md index 164f5693e1c..790598196ce 100644 --- a/docs/en/sql-reference/functions/arithmetic-functions.md +++ b/docs/en/sql-reference/functions/arithmetic-functions.md @@ -28,71 +28,72 @@ Overflows are produced the same way as in C++. ## plus +Calculates the sum of two values `a` and `b`. + **Syntax** ```sql plus(a, b) ``` -Calculates the sum of `a` and `b`. - It is possible to add an integer and a date or date with time. The former operation increments the number of days in the date, the latter operation increments the number of seconds. Alias: `a + b` (operator) ## minus +Calculates the difference of two values `a` and `b`. The result is always signed. + +Similar to `plus`, it is possible to subtract an integer from a date or date with time. + **Syntax** ```sql minus(a, b) ``` -Calculates the difference of `a` and `b`. The result is always signed. - -Similar to `plus`, it is possible to subtract an integer from a date or date with time. Alias: `a - b` (operator) ## multiply +Calculates the product of two values `a` and `b`. + **Syntax** ```sql multiply(a, b) ``` -Calculates the product of `a` and `b`. - Alias: `a \* b` (operator) ## divide +Calculates the quotient of two values `a` and `b`. The result is always a floating-point value. If you need integer division, you can use the `intDiv` function. + +Division by 0 returns `inf`, `-inf`, or `nan`. + **Syntax** ```sql divide(a, b) ``` -Calculates the quotient of `a` and `b`. The result is always a floating-point value. If you need integer division, you can use the `intDiv` function. - -Division by 0 returns `inf`, `-inf`, or `nan`. - Alias: `a / b` (operator) ## intDiv +Performs an integer division of two values `a` by `b`, i.e. computes the quotient rounded down to the next smallest integer. + +The result has the same type as the dividend (the first parameter). + +An exception is thrown when dividing by zero, when the quotient does not fit in the range of the dividend, or when dividing a minimal negative number by minus one. + **Syntax** ```sql intDiv(a, b) ``` -Performs an integer division of `a` by `b`, i.e. computes the quotient rounded down to the next smallest integer. - -The result has the same type as the dividend (the first parameter). - -An exception is thrown when dividing by zero, when the quotient does not fit in the range of the dividend, or when dividing a minimal negative number by minus one. - **Example** Query: @@ -122,22 +123,17 @@ Code: 153. DB::Exception: Received from localhost:9000. DB::Exception: Cannot pe ## intDivOrZero +Same as `intDiv` but returns zero when dividing by zero or when dividing a minimal negative number by minus one. + **Syntax** ```sql intDivOrZero(a, b) ``` -Same as `intDiv` but returns zero when dividing by zero or when dividing a minimal negative number by minus one. - ## modulo -**Syntax** - -```sql -modulo(a, b) -``` -Calculates the remainder of the division of `a` by `b`. +Calculates the remainder of the division of two values `a` by `b`. The result type is an integer if both inputs are integers. If one of the inputs is a floating-point number, the result is a floating-point number. @@ -145,30 +141,36 @@ The remainder is computed like in C++. Truncated division is used for negative n An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. +**Syntax** + +```sql +modulo(a, b) +``` + Alias: `a % b` (operator) ## moduloOrZero +Like [modulo](#modulo) but returns zero when the divisor is zero. + **Syntax** ```sql moduloOrZero(a, b) ``` -Like [modulo](#modulo) but returns zero when the divisor is zero. - ## positiveModulo(a, b) +Like [modulo](#modulo) but always returns a non-negative number. + +This function is 4-5 times slower than `modulo`. + **Syntax** ```sql positiveModulo(a, b) ``` -Like [modulo](#modulo) but always returns a non-negative number. - -This function is 4-5 times slower than `modulo`. - Alias: - `positive_modulo(a, b)` - `pmod(a, b)` @@ -191,41 +193,41 @@ Result: ## negate +Negates a value `a`. The result is always signed. + **Syntax** ```sql negate(a) ``` -Negates `a`. The result is always signed. - Alias: `-a` ## abs +Calculates the absolute value of `a`. Has no effect if `a` is of an unsigned type. If `a` is of a signed type, it returns an unsigned number. + **Syntax** ```sql abs(a) ``` -Calculates the absolute value of `a`. Has no effect if `a` is of an unsigned type. If `a` is of a signed type, it returns an unsigned number. - ## gcd +Returns the greatest common divisor of two values `a` and `b`. + +An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. + **Syntax** ```sql gcd(a, b) ``` -Returns the greatest common divisor of `a` and `b`. - -An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. - ## lcm(a, b) -Returns the least common multiple of `a` and `b`. +Returns the least common multiple of two values `a` and `b`. An exception is thrown when dividing by zero or when dividing a minimal negative number by minus one. @@ -237,14 +239,14 @@ lcm(a, b) ## max2 +Returns the bigger of two values `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). + **Syntax** ```sql max2(a, b) ``` -Returns the bigger of `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). - **Example** Query: @@ -263,14 +265,14 @@ Result: ## min2 +Returns the smaller of two values `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). + **Syntax** ```sql min2(a, b) ``` -Returns the smaller of `a` and `b`. The returned value is of type [Float64](../../sql-reference/data-types/float.md). - **Example** Query: @@ -289,18 +291,18 @@ Result: ## multiplyDecimal +Multiplies decimals two values `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). + +The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. + +This function work significantly slower than usual `multiply`. In case no control over the result precision is needed and/or fast computation is desired, consider using `multiply`. + **Syntax** ```sql multiplyDecimal(a, b[, result_scale]) ``` -Multiplies decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). - -The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. - -This function work significantly slower than usual `multiply`. In case no control over the result precision is needed and/or fast computation is desired, consider using `multiply`. - **Arguments** - `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). @@ -328,6 +330,8 @@ SELECT toDecimal64(-12.647, 3) * toDecimal32(2.1239, 4); SELECT toDecimal64(-12.647, 3) as a, toDecimal32(2.1239, 4) as b, multiplyDecimal(a, b); ``` +Result: + ```result ┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐ │ -26.8609633 │ @@ -349,6 +353,8 @@ SELECT a * b; ``` +Result: + ```result ┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐ │ -12.647987876 │ 123.967645643 │ -1567.941279108 │ @@ -360,18 +366,19 @@ Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal m ## divideDecimal + +Divides two decimals two values `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). + +The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. + +This function work significantly slower than usual `divide`. In case no control over the result precision is needed and/or fast computation is desired, consider using `divide`. + **Syntax** ```sql divideDecimal(a, b[, result_scale]) ``` -Divides two decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). - -The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. - -This function work significantly slower than usual `divide`. In case no control over the result precision is needed and/or fast computation is desired, consider using `divide`. - **Arguments** - `a` — First value: [Decimal](../../sql-reference/data-types/decimal.md). @@ -399,6 +406,8 @@ SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1); SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); ``` +Result: + ```result ┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐ │ -5.7 │ @@ -414,6 +423,8 @@ SELECT toDecimal64(-12, 0) / toDecimal32(2.1, 1); SELECT toDecimal64(-12, 0) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); ``` +Result: + ```result DB::Exception: Decimal result's scale is less than argument's one: While processing toDecimal64(-12, 0) / toDecimal32(2.1, 1). (ARGUMENT_OUT_OF_BOUND) From bb0573cd56a05d1cfec561b16c7ccfb24d02bfe1 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 18:11:50 +0000 Subject: [PATCH 378/535] More fixes --- docs/en/sql-reference/functions/arithmetic-functions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/sql-reference/functions/arithmetic-functions.md b/docs/en/sql-reference/functions/arithmetic-functions.md index 790598196ce..64fae0e82f0 100644 --- a/docs/en/sql-reference/functions/arithmetic-functions.md +++ b/docs/en/sql-reference/functions/arithmetic-functions.md @@ -36,7 +36,7 @@ Calculates the sum of two values `a` and `b`. plus(a, b) ``` -It is possible to add an integer and a date or date with time. The former operation increments the number of days in the date, the latter operation increments the number of seconds. +It is possible to add an integer and a date or date with time. The former operation increments the number of days in the date, the latter operation increments the number of seconds in the date with time. Alias: `a + b` (operator) @@ -291,7 +291,7 @@ Result: ## multiplyDecimal -Multiplies decimals two values `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). +Multiplies two decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. @@ -367,7 +367,7 @@ Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal m ## divideDecimal -Divides two decimals two values `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). +Divides two decimals `a` and `b`. The result value will be of type [Decimal256](../../sql-reference/data-types/decimal.md). The scale of the result can be explicitly specified by `result_scale`. If `result_scale` is not specified, it is assumed to be the maximum scale of the input values. From eca1ca31d148263060f4dd06a367cac9a6351d1b Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 18:03:01 +0000 Subject: [PATCH 379/535] Cleanup random function docs --- .../functions/random-functions.md | 251 +++++++----------- 1 file changed, 95 insertions(+), 156 deletions(-) diff --git a/docs/en/sql-reference/functions/random-functions.md b/docs/en/sql-reference/functions/random-functions.md index 879cf376028..e0d7b7dea5b 100644 --- a/docs/en/sql-reference/functions/random-functions.md +++ b/docs/en/sql-reference/functions/random-functions.md @@ -6,53 +6,39 @@ sidebar_label: Random Numbers # Functions for Generating Random Numbers -All the functions accept zero arguments or one argument. If an argument is passed, it can be any type, and its value is not used for anything. The only purpose of this argument is to prevent common subexpression elimination, so that two different instances of the same function return different columns with different random numbers. +All functions in this section accept zero or one arguments. The only use of the argument (if provided) is to prevent prevent [common subexpression +elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) such that two different execution of the same random +function in a query return different random values. -:::note -Non-cryptographic generators of random numbers are used. +Related content +- Blog: [Generating random data in ClickHouse](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse) + +:::note +The random numbers are generated by non-cryptographic algorithms. ::: ## rand, rand32 -Returns a random UInt32 number, evenly distributed among all UInt32-type numbers. +Returns a random UInt32 number, evenly distributed accross the range of all possible UInt32 numbers. Uses a linear congruential generator. ## rand64 -Returns a random UInt64 number, evenly distributed among all UInt64-type numbers. +Returns a random UInt64 number, evenly distributed accross the range of all possible UInt64 numbers. Uses a linear congruential generator. ## randCanonical -The function generates results with independent and identically distributed uniformly distributed values in [0, 1). -Non-deterministic. Return type is Float64. +Returns a Float64 value, evenly distributed in [0, 1). ## randConstant -Produces a constant column with a random value. - -**Syntax** - -``` sql -randConstant([x]) -``` - -**Arguments** - -- `x` — [Expression](../../sql-reference/syntax.md#syntax-expressions) resulting in any of the [supported data types](../../sql-reference/data-types/index.md#data_types). The resulting value is discarded, but the expression itself if used for bypassing [common subexpression elimination](../../sql-reference/functions/index.md#common-subexpression-elimination) if the function is called multiple times in one query. Optional parameter. - -**Returned value** - -- Random number. - -Type: [UInt32](../../sql-reference/data-types/int-uint.md). +Like `rand` but produces a constant column with a random value. **Example** -Query: - ``` sql SELECT rand(), rand(1), rand(number), randConstant(), randConstant(1), randConstant(number) FROM numbers(3) @@ -60,7 +46,7 @@ FROM numbers(3) Result: -``` text +``` result ┌─────rand()─┬────rand(1)─┬─rand(number)─┬─randConstant()─┬─randConstant(1)─┬─randConstant(number)─┐ │ 3047369878 │ 4132449925 │ 4044508545 │ 2740811946 │ 4229401477 │ 1924032898 │ │ 2938880146 │ 1267722397 │ 4154983056 │ 2740811946 │ 4229401477 │ 1924032898 │ @@ -68,17 +54,11 @@ Result: └────────────┴────────────┴──────────────┴────────────────┴─────────────────┴──────────────────────┘ ``` -# Functions for Generating Random Numbers based on Distributions - -:::note -These functions are available starting from 22.10. -::: - - +# Functions for Generating Random Numbers based on a Distribution ## randUniform -Return random number based on [continuous uniform distribution](https://en.wikipedia.org/wiki/Continuous_uniform_distribution) in a specified range from `min` to `max`. +Returns a Float64 drawn uniformly from the interval between `min` and `max` ([continuous uniform distribution](https://en.wikipedia.org/wiki/Continuous_uniform_distribution)). **Syntax** @@ -93,21 +73,17 @@ randUniform(min, max) **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randUniform(5.5, 10) FROM numbers(5) ``` Result: -``` text +``` result ┌─randUniform(5.5, 10)─┐ │ 8.094978491443102 │ │ 7.3181248914450885 │ @@ -117,40 +93,34 @@ Result: └──────────────────────┘ ``` - - ## randNormal -Return random number based on [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution). +Returns a Float64 drawn from a [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution). **Syntax** ``` sql -randNormal(meam, variance) +randNormal(mean, variance) ``` **Arguments** -- `meam` - `Float64` mean value of distribution, +- `mean` - `Float64` - mean value of distribution, - `variance` - `Float64` - [variance](https://en.wikipedia.org/wiki/Variance). **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randNormal(10, 2) FROM numbers(5) ``` Result: -``` text +``` result ┌──randNormal(10, 2)─┐ │ 13.389228911709653 │ │ 8.622949707401295 │ @@ -160,40 +130,34 @@ Result: └────────────────────┘ ``` - - ## randLogNormal -Return random number based on [log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution). +Returns a Float64 drawn from a [log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution). **Syntax** ``` sql -randLogNormal(meam, variance) +randLogNormal(mean, variance) ``` **Arguments** -- `meam` - `Float64` mean value of distribution, +- `mean` - `Float64` - mean value of distribution, - `variance` - `Float64` - [variance](https://en.wikipedia.org/wiki/Variance). **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randLogNormal(100, 5) FROM numbers(5) ``` Result: -``` text +``` result ┌─randLogNormal(100, 5)─┐ │ 1.295699673937363e48 │ │ 9.719869109186684e39 │ @@ -203,11 +167,9 @@ Result: └───────────────────────┘ ``` - - ## randBinomial -Return random number based on [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). +Returns a UInt64 drawn from a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). **Syntax** @@ -217,26 +179,22 @@ randBinomial(experiments, probability) **Arguments** -- `experiments` - `UInt64` number of experiments, +- `experiments` - `UInt64` - number of experiments, - `probability` - `Float64` - probability of success in each experiment (values in `0...1` range only). **Returned value** -- Random number. - -Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** -Query: - ``` sql SELECT randBinomial(100, .75) FROM numbers(5) ``` Result: -``` text +``` result ┌─randBinomial(100, 0.75)─┐ │ 74 │ │ 78 │ @@ -246,11 +204,9 @@ Result: └─────────────────────────┘ ``` - - ## randNegativeBinomial -Return random number based on [negative binomial distribution](https://en.wikipedia.org/wiki/Negative_binomial_distribution). +Returns a UInt64 drawn from a [negative binomial distribution](https://en.wikipedia.org/wiki/Negative_binomial_distribution). **Syntax** @@ -260,26 +216,22 @@ randNegativeBinomial(experiments, probability) **Arguments** -- `experiments` - `UInt64` number of experiments, +- `experiments` - `UInt64` - number of experiments, - `probability` - `Float64` - probability of failure in each experiment (values in `0...1` range only). **Returned value** -- Random number. - -Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** -Query: - ``` sql SELECT randNegativeBinomial(100, .75) FROM numbers(5) ``` Result: -``` text +``` result ┌─randNegativeBinomial(100, 0.75)─┐ │ 33 │ │ 32 │ @@ -289,11 +241,9 @@ Result: └─────────────────────────────────┘ ``` - - ## randPoisson -Return random number based on [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution). +Returns a UInt64 drawn from a [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution). **Syntax** @@ -303,25 +253,21 @@ randPoisson(n) **Arguments** -- `n` - `UInt64` mean number of occurrences. +- `n` - `UInt64` - mean number of occurrences. **Returned value** -- Random number. - -Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** -Query: - ``` sql SELECT randPoisson(10) FROM numbers(5) ``` Result: -``` text +``` result ┌─randPoisson(10)─┐ │ 8 │ │ 8 │ @@ -331,11 +277,9 @@ Result: └─────────────────┘ ``` - - ## randBernoulli -Return random number based on [Bernoulli distribution](https://en.wikipedia.org/wiki/Bernoulli_distribution). +Returns a UInt64 drawn from a [Bernoulli distribution](https://en.wikipedia.org/wiki/Bernoulli_distribution). **Syntax** @@ -349,21 +293,17 @@ randBernoulli(probability) **Returned value** -- Random number. - -Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** -Query: - ``` sql SELECT randBernoulli(.75) FROM numbers(5) ``` Result: -``` text +``` result ┌─randBernoulli(0.75)─┐ │ 1 │ │ 1 │ @@ -373,11 +313,9 @@ Result: └─────────────────────┘ ``` - - ## randExponential -Return random number based on [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution). +Returns a Float64 drawn from a [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution). **Syntax** @@ -387,25 +325,21 @@ randExponential(lambda) **Arguments** -- `lambda` - `Float64` lambda value. +- `lambda` - `Float64` - lambda value. **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randExponential(1/10) FROM numbers(5) ``` Result: -``` text +``` result ┌─randExponential(divide(1, 10))─┐ │ 44.71628934340778 │ │ 4.211013337903262 │ @@ -415,11 +349,9 @@ Result: └────────────────────────────────┘ ``` - - ## randChiSquared -Return random number based on [Chi-square distribution](https://en.wikipedia.org/wiki/Chi-squared_distribution) - a distribution of a sum of the squares of k independent standard normal random variables. +Returns a Float64 drawn from a [Chi-square distribution](https://en.wikipedia.org/wiki/Chi-squared_distribution) - a distribution of a sum of the squares of k independent standard normal random variables. **Syntax** @@ -429,25 +361,21 @@ randChiSquared(degree_of_freedom) **Arguments** -- `degree_of_freedom` - `Float64` degree of freedom. +- `degree_of_freedom` - `Float64` - degree of freedom. **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randChiSquared(10) FROM numbers(5) ``` Result: -``` text +``` result ┌─randChiSquared(10)─┐ │ 10.015463656521543 │ │ 9.621799919882768 │ @@ -457,11 +385,9 @@ Result: └────────────────────┘ ``` - - ## randStudentT -Return random number based on [Student's t-distribution](https://en.wikipedia.org/wiki/Student%27s_t-distribution). +Returns a Float64 drawn from a [Student's t-distribution](https://en.wikipedia.org/wiki/Student%27s_t-distribution). **Syntax** @@ -471,25 +397,21 @@ randStudentT(degree_of_freedom) **Arguments** -- `degree_of_freedom` - `Float64` degree of freedom. +- `degree_of_freedom` - `Float64` - degree of freedom. **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randStudentT(10) FROM numbers(5) ``` Result: -``` text +``` result ┌─────randStudentT(10)─┐ │ 1.2217309938538725 │ │ 1.7941971681200541 │ @@ -499,11 +421,9 @@ Result: └──────────────────────┘ ``` - - ## randFisherF -Return random number based on [F-distribution](https://en.wikipedia.org/wiki/F-distribution). +Returns a Float64 drawn from a [F-distribution](https://en.wikipedia.org/wiki/F-distribution). **Syntax** @@ -513,26 +433,22 @@ randFisherF(d1, d2) **Arguments** -- `d1` - `Float64` d1 degree of freedom in `X = (S1 / d1) / (S2 / d2)`, -- `d2` - `Float64` d2 degree of freedom in `X = (S1 / d1) / (S2 / d2)`, +- `d1` - `Float64` - d1 degree of freedom in `X = (S1 / d1) / (S2 / d2)`, +- `d2` - `Float64` - d2 degree of freedom in `X = (S1 / d1) / (S2 / d2)`, **Returned value** -- Random number. - -Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** -Query: - ``` sql SELECT randFisherF(10, 3) FROM numbers(5) ``` Result: -``` text +``` result ┌──randFisherF(10, 3)─┐ │ 7.286287504216609 │ │ 0.26590779413050386 │ @@ -542,35 +458,61 @@ Result: └─────────────────────┘ ``` - - - -# Random Functions for Working with Strings +# Functions for Generating Random Strings ## randomString +Returns a random String of specified `length`. Not all characters may be printable. + +**Syntax** + +```sql +randomString(length) +``` + ## randomFixedString +Like `randomString` but returns a FixedString. + ## randomPrintableASCII +Returns a random String of specified `length`. All characters are printable. + +**Syntax** + +```sql +randomPrintableASCII(length) +``` + ## randomStringUTF8 +Returns a random String containing `length` many UTF8 codepoints. Not all characters may be printable + +**Syntax** + +```sql +randomStringUTF8(length) +``` + ## fuzzBits **Syntax** -``` sql -fuzzBits([s], [prob]) -``` +Inverts the bits of String or FixedString `s`, each with probability `prob`. -Inverts bits of `s`, each with probability `prob`. +**Syntax** + +``` sql +fuzzBits(s, prob) +``` **Arguments** - `s` - `String` or `FixedString` - `prob` - constant `Float32/64` **Returned value** -Fuzzed string with same as s type. + +Fuzzed string with same type as `s`. **Example** @@ -581,13 +523,10 @@ FROM numbers(3) Result: -``` text +``` result ┌─fuzzBits(materialize('abacaba'), 0.1)─┐ │ abaaaja │ │ a*cjab+ │ │ aeca2A │ └───────────────────────────────────────┘ ``` - -## Related content -- Blog: [Generating random data in ClickHouse](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse) From 74c21bbc5d451ecfdba7be1d7d3a9ce834c72def Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 18:36:10 +0000 Subject: [PATCH 380/535] UUID --> UUIDs --- docs/en/sql-reference/functions/uuid-functions.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/en/sql-reference/functions/uuid-functions.md b/docs/en/sql-reference/functions/uuid-functions.md index 7322603c88c..c338add3a57 100644 --- a/docs/en/sql-reference/functions/uuid-functions.md +++ b/docs/en/sql-reference/functions/uuid-functions.md @@ -1,12 +1,10 @@ --- slug: /en/sql-reference/functions/uuid-functions sidebar_position: 205 -sidebar_label: UUID +sidebar_label: UUIDs --- -# Functions for Working with UUID - -The functions for working with UUID are listed below. +# Functions for Working with UUIDs ## generateUUIDv4 From 92890f4e089ac1f13be57036c9eb6155abd43a45 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 18:51:38 +0000 Subject: [PATCH 381/535] Cleanup logical function docs --- .../functions/logical-functions.md | 52 +++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/docs/en/sql-reference/functions/logical-functions.md b/docs/en/sql-reference/functions/logical-functions.md index 36777d4e67f..1c45994605a 100644 --- a/docs/en/sql-reference/functions/logical-functions.md +++ b/docs/en/sql-reference/functions/logical-functions.md @@ -6,13 +6,13 @@ sidebar_label: Logical # Logical Functions -Performs logical operations on arguments of any numeric types, but returns a [UInt8](../../sql-reference/data-types/int-uint.md) number equal to 0, 1 or `NULL` in some cases. +Below functions perform logical operations on arguments of arbitrary numeric types. They return either 0 or 1 as [UInt8](../../sql-reference/data-types/int-uint.md) or in some cases `NULL`. -Zero as an argument is considered `false`, while any non-zero value is considered `true`. +Zero as an argument is considered `false`, non-zero values are considered `true`. ## and -Calculates the result of the logical conjunction between two or more values. Corresponds to [Logical AND Operator](../../sql-reference/operators/index.md#logical-and-operator). +Calculates the logical conjunction between two or more values. **Syntax** @@ -20,7 +20,9 @@ Calculates the result of the logical conjunction between two or more values. Cor and(val1, val2...) ``` -You can use the [short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) setting to calculate the `and` function according to a short scheme. If this setting is enabled, `vali` is evaluated only on rows where `(val1 AND val2 AND ... AND val{i-1})` is true. For example, an exception about division by zero is not thrown when executing the query `SELECT and(number = 2, intDiv(1, number)) FROM numbers(10)`. +Setting [short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) controls whether short-circuit evaluation is used. If enabled, `val_i` is evaluated only if `(val_1 AND val_2 AND ... AND val_{i-1})` is `true`. For example, with short-circuit evaluation, no division-by-zero exception is thrown when executing the query `SELECT and(number = 2, intDiv(1, number)) FROM numbers(5)`. + +Alias: The [AND Operator](../../sql-reference/operators/index.md#logical-and-operator). **Arguments** @@ -28,16 +30,14 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Returned value** -- `0`, if there is at least one zero value argument. -- `NULL`, if there are no zero values arguments and there is at least one `NULL` argument. +- `0`, if there at least one argument evaluates to `false`, +- `NULL`, if no argumetn evaluates to `false` and at least one argument is `NULL`, - `1`, otherwise. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). **Example** -Query: - ``` sql SELECT and(0, 1, -2); ``` @@ -66,7 +66,7 @@ Result: ## or -Calculates the result of the logical disjunction between two or more values. Corresponds to [Logical OR Operator](../../sql-reference/operators/index.md#logical-or-operator). +Calculates the logical disjunction between two or more values. **Syntax** @@ -74,7 +74,9 @@ Calculates the result of the logical disjunction between two or more values. Cor or(val1, val2...) ``` -You can use the [short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) setting to calculate the `or` function according to a short scheme. If this setting is enabled, `vali` is evaluated only on rows where `((NOT val1) AND (NOT val2) AND ... AND (NOT val{i-1}))` is true. For example, an exception about division by zero is not thrown when executing the query `SELECT or(number = 0, intDiv(1, number) != 0) FROM numbers(10)`. +Setting [short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) controls whether short-circuit evaluation is used. If enabled, `val_i` is evaluated only if `((NOT val_1) AND (NOT val_2) AND ... AND (NOT val_{i-1}))` is `true`. For example, with short-circuit evaluation, no division-by-zero exception is thrown when executing the query `SELECT or(number = 0, intDiv(1, number) != 0) FROM numbers(5)`. + +Alias: The [OR Operator](../../sql-reference/operators/index.md#logical-or-operator). **Arguments** @@ -82,16 +84,14 @@ You can use the [short_circuit_function_evaluation](../../operations/settings/se **Returned value** -- `1`, if there is at least one non-zero value. -- `0`, if there are only zero values. -- `NULL`, if there are only zero values and `NULL`. +- `1`, if at least one argument evalutes to `true`, +- `0`, if all arguments evaluate to `false`, +- `NULL`, if all arguments evaluate to `false` and at least one argument is `NULL`. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). **Example** -Query: - ``` sql SELECT or(1, 0, 0, 2, NULL); ``` @@ -120,7 +120,7 @@ Result: ## not -Calculates the result of the logical negation of the value. Corresponds to [Logical Negation Operator](../../sql-reference/operators/index.md#logical-negation-operator). +Calculates logical negation of a value. **Syntax** @@ -128,22 +128,22 @@ Calculates the result of the logical negation of the value. Corresponds to [Logi not(val); ``` +Alias: The [Negation Operator](../../sql-reference/operators/index.md#logical-negation-operator). + **Arguments** - `val` — The value. [Int](../../sql-reference/data-types/int-uint.md), [UInt](../../sql-reference/data-types/int-uint.md), [Float](../../sql-reference/data-types/float.md) or [Nullable](../../sql-reference/data-types/nullable.md). **Returned value** -- `1`, if the `val` is `0`. -- `0`, if the `val` is a non-zero value. -- `NULL`, if the `val` is a `NULL` value. +- `1`, if `val` evaluates to `false`, +- `0`, if `val` evaluates to `true`, +- `NULL`, if `val` is `NULL`. Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). **Example** -Query: - ``` sql SELECT NOT(1); ``` @@ -158,7 +158,7 @@ Result: ## xor -Calculates the result of the logical exclusive disjunction between two or more values. For more than two values the function works as if it calculates `XOR` of the first two values and then uses the result with the next value to calculate `XOR` and so on. +Calculates the logical exclusive disjunction between two or more values. For more than two values the function first xor-s the first two values, then xor-s the result with the third value etc. **Syntax** @@ -172,16 +172,14 @@ xor(val1, val2...) **Returned value** -- `1`, for two values: if one of the values is zero and other is not. -- `0`, for two values: if both values are zero or non-zero at the same time. -- `NULL`, if there is at least one `NULL` value. +- `1`, for two values: if one of the values evaluates to `false` and other does not, +- `0`, for two values: if both values evalute to `false` or to both `true`, +- `NULL`, if at least one of the inputs is `NULL` Type: [UInt8](../../sql-reference/data-types/int-uint.md) or [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md)). **Example** -Query: - ``` sql SELECT xor(0, 1, 1); ``` From 75e283323ffcfe61d5e58de8d6b66a412f658740 Mon Sep 17 00:00:00 2001 From: Nikolay Degterinsky Date: Wed, 19 Apr 2023 20:03:02 +0000 Subject: [PATCH 382/535] Use default parameters in Replicated engine --- src/Databases/DatabaseFactory.cpp | 14 ++++++++++---- src/Interpreters/InterpreterCreateQuery.cpp | 6 +++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Databases/DatabaseFactory.cpp b/src/Databases/DatabaseFactory.cpp index 89a799349bf..d9cc7ab5fec 100644 --- a/src/Databases/DatabaseFactory.cpp +++ b/src/Databases/DatabaseFactory.cpp @@ -280,16 +280,22 @@ DatabasePtr DatabaseFactory::getImpl(const ASTCreateQuery & create, const String { const ASTFunction * engine = engine_define->engine; - if (!engine->arguments || engine->arguments->children.size() != 3) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Replicated database requires 3 arguments: zookeeper path, shard name and replica name"); + if (!engine->arguments || engine->arguments->children.empty() || engine->arguments->children.size() > 3) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Replicated database requires at least 1 argument: zookeeper path, and optionally shard name and replica name"); auto & arguments = engine->arguments->children; for (auto & engine_arg : arguments) engine_arg = evaluateConstantExpressionOrIdentifierAsLiteral(engine_arg, context); String zookeeper_path = safeGetLiteralValue(arguments[0], "Replicated"); - String shard_name = safeGetLiteralValue(arguments[1], "Replicated"); - String replica_name = safeGetLiteralValue(arguments[2], "Replicated"); + String shard_name = "{shard}"; + String replica_name = "{replica}"; + + if (engine->arguments->children.size() > 1) + shard_name = safeGetLiteralValue(arguments[1], "Replicated"); + + if (engine->arguments->children.size() > 2) + replica_name = safeGetLiteralValue(arguments[2], "Replicated"); zookeeper_path = context->getMacros()->expand(zookeeper_path); shard_name = context->getMacros()->expand(shard_name); diff --git a/src/Interpreters/InterpreterCreateQuery.cpp b/src/Interpreters/InterpreterCreateQuery.cpp index 77179ad2f32..f71ac02a3a2 100644 --- a/src/Interpreters/InterpreterCreateQuery.cpp +++ b/src/Interpreters/InterpreterCreateQuery.cpp @@ -233,7 +233,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create) { throw Exception(ErrorCodes::UNKNOWN_DATABASE_ENGINE, "MaterializedMySQL is an experimental database engine. " - "Enable allow_experimental_database_materialized_mysql to use it."); + "Enable allow_experimental_database_materialized_mysql to use it"); } if (create.storage->engine->name == "Replicated" @@ -242,7 +242,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create) { throw Exception(ErrorCodes::UNKNOWN_DATABASE_ENGINE, "Replicated is an experimental database engine. " - "Enable allow_experimental_database_replicated to use it."); + "Enable allow_experimental_database_replicated to use it"); } if (create.storage->engine->name == "MaterializedPostgreSQL" @@ -251,7 +251,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create) { throw Exception(ErrorCodes::UNKNOWN_DATABASE_ENGINE, "MaterializedPostgreSQL is an experimental database engine. " - "Enable allow_experimental_database_materialized_postgresql to use it."); + "Enable allow_experimental_database_materialized_postgresql to use it"); } bool need_write_metadata = !create.attach || !fs::exists(metadata_file_path); From 4756629b848467b8c6fb4691a61349ec231395f9 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 20:04:59 +0000 Subject: [PATCH 383/535] Clean up string function docs --- .../functions/random-functions.md | 44 +- .../functions/string-functions.md | 531 +++++++++--------- 2 files changed, 291 insertions(+), 284 deletions(-) diff --git a/docs/en/sql-reference/functions/random-functions.md b/docs/en/sql-reference/functions/random-functions.md index e0d7b7dea5b..21c8ffa6e8c 100644 --- a/docs/en/sql-reference/functions/random-functions.md +++ b/docs/en/sql-reference/functions/random-functions.md @@ -73,7 +73,9 @@ randUniform(min, max) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -110,7 +112,9 @@ randNormal(mean, variance) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -147,7 +151,9 @@ randLogNormal(mean, variance) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -184,7 +190,9 @@ randBinomial(experiments, probability) **Returned value** -- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. + +Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** @@ -221,7 +229,9 @@ randNegativeBinomial(experiments, probability) **Returned value** -- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. + +Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** @@ -257,7 +267,9 @@ randPoisson(n) **Returned value** -- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. + +Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** @@ -293,7 +305,9 @@ randBernoulli(probability) **Returned value** -- Random number. Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). +- Random number. + +Type: [UInt64](/docs/en/sql-reference/data-types/int-uint.md). **Example** @@ -329,7 +343,9 @@ randExponential(lambda) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -365,7 +381,9 @@ randChiSquared(degree_of_freedom) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -401,7 +419,9 @@ randStudentT(degree_of_freedom) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** @@ -438,7 +458,9 @@ randFisherF(d1, d2) **Returned value** -- Random number. Type: [Float64](/docs/en/sql-reference/data-types/float.md). +- Random number. + +Type: [Float64](/docs/en/sql-reference/data-types/float.md). **Example** diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 35bf154d14c..555234089e6 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -7,23 +7,23 @@ sidebar_label: Strings # Functions for Working with Strings :::note -Functions for [searching](../../sql-reference/functions/string-search-functions.md) and [replacing](../../sql-reference/functions/string-replace-functions.md) in strings are described separately. +Functions for [searching](../../sql-reference/functions/string-search-functions.md) in strings and for [replacing](../../sql-reference/functions/string-replace-functions.md) in strings are described separately. ::: ## empty Checks whether the input string is empty. +A string is considered non-empty if it contains at least one byte, even if this byte is a space or the null byte. + +The function is also available for [arrays](array-functions.md#function-empty) and [UUIDs](uuid-functions.md#empty). + **Syntax** ``` sql empty(x) ``` -A string is considered non-empty if it contains at least one byte, even if this is a space or a null byte. - -The function also works for [arrays](array-functions.md#function-empty) or [UUID](uuid-functions.md#empty). - **Arguments** - `x` — Input value. [String](../data-types/string.md). @@ -36,15 +36,13 @@ Type: [UInt8](../data-types/int-uint.md). **Example** -Query: - ```sql SELECT empty(''); ``` Result: -```text +```result ┌─empty('')─┐ │ 1 │ └───────────┘ @@ -54,16 +52,16 @@ Result: Checks whether the input string is non-empty. +A string is considered non-empty if it contains at least one byte, even if this byte is a space or the null byte. + +The function is also available for [arrays](array-functions.md#function-notempty) and [UUIDs](uuid-functions.md#notempty). + **Syntax** ``` sql notEmpty(x) ``` -A string is considered non-empty if it contains at least one byte, even if this is a space or a null byte. - -The function also works for [arrays](array-functions.md#function-notempty) or [UUID](uuid-functions.md#notempty). - **Arguments** - `x` — Input value. [String](../data-types/string.md). @@ -76,15 +74,13 @@ Type: [UInt8](../data-types/int-uint.md). **Example** -Query: - ```sql SELECT notEmpty('text'); ``` Result: -```text +```result ┌─notEmpty('text')─┐ │ 1 │ └──────────────────┘ @@ -92,58 +88,51 @@ Result: ## length -Returns the length of a string in bytes (not in characters, and not in code points). -The result type is UInt64. +Returns the length of a string in bytes (not: in characters or Unicode code points). + The function also works for arrays. ## lengthUTF8 -Returns the length of a string in Unicode code points (not in characters), assuming that the string contains a set of bytes that make up UTF-8 encoded text. If this assumption is not met, it returns some result (it does not throw an exception). -The result type is UInt64. +Returns the length of a string in Unicode code points (not: in bytes or characters). It assumes that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined. -## char_length, CHAR_LENGTH - -Returns the length of a string in Unicode code points (not in characters), assuming that the string contains a set of bytes that make up UTF-8 encoded text. If this assumption is not met, it returns some result (it does not throw an exception). -The result type is UInt64. - -## character_length, CHARACTER_LENGTH - -Returns the length of a string in Unicode code points (not in characters), assuming that the string contains a set of bytes that make up UTF-8 encoded text. If this assumption is not met, it returns some result (it does not throw an exception). -The result type is UInt64. +Alias: +- `CHAR_LENGTH`` +- `CHARACTER_LENGTH` ## leftPad -Pads the current string from the left with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `LPAD` function. +Pads a string from the left with spaces or with a specified string (multiple times, if needed) until the resulting string reaches the specified `length`. **Syntax** ``` sql -leftPad('string', 'length'[, 'pad_string']) +leftPad(string, length[, pad_string]) ``` +Alias: `LPAD` + **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `string` — Input string that should be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is smaller than the input string length, then the input string is shortened to `length` characters. - `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- A left-padded string of the given length. Type: [String](../data-types/string.md). **Example** -Query: - ``` sql SELECT leftPad('abc', 7, '*'), leftPad('def', 7); ``` Result: -``` text +```result ┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐ │ ****abc │ def │ └────────────────────────┴───────────────────┘ @@ -151,37 +140,35 @@ Result: ## leftPadUTF8 -Pads the current string from the left with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `LPAD` function. While in the [leftPad](#leftpad) function the length is measured in bytes, here in the `leftPadUTF8` function it is measured in code points. +Pads the string from the left with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Unlike [leftPad](#leftpad) which measures the string length in bytes, the string length is measured in code points. **Syntax** ``` sql -leftPadUTF8('string','length'[, 'pad_string']) +leftPadUTF8(string, length[, pad_string]) ``` **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `string` — Input string that should be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is smaller than the input string length, then the input string is shortened to `length` characters. - `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- A left-padded string of the given length. Type: [String](../data-types/string.md). **Example** -Query: - ``` sql SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7); ``` Result: -``` text +```result ┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐ │ ***абвг │ дежз │ └─────────────────────────────┴────────────────────────┘ @@ -189,37 +176,37 @@ Result: ## rightPad -Pads the current string from the right with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `RPAD` function. +Pads a string from the right with spaces or with a specified string (multiple times, if needed) until the resulting string reaches the specified `length`. **Syntax** ``` sql -rightPad('string', 'length'[, 'pad_string']) +rightPad(string, length[, pad_string]) ``` +Alias: `RPAD` + **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `string` — Input string that should be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is smaller than the input string length, then the input string is shortened to `length` characters. - `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- A left-padded string of the given length. Type: [String](../data-types/string.md). **Example** -Query: - ``` sql SELECT rightPad('abc', 7, '*'), rightPad('abc', 7); ``` Result: -``` text +```result ┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐ │ abc**** │ abc │ └─────────────────────────┴────────────────────┘ @@ -227,72 +214,78 @@ Result: ## rightPadUTF8 -Pads the current string from the right with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Similarly to the MySQL `RPAD` function. While in the [rightPad](#rightpad) function the length is measured in bytes, here in the `rightPadUTF8` function it is measured in code points. +Pads the string from the right with spaces or a specified string (multiple times, if needed) until the resulting string reaches the given length. Unlike [rightPad](#rightpad) which measures the string length in bytes, the string length is measured in code points. **Syntax** ``` sql -rightPadUTF8('string','length'[, 'pad_string']) +rightPadUTF8(string, length[, pad_string]) ``` **Arguments** -- `string` — Input string that needs to be padded. [String](../data-types/string.md). -- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is less than the input string length, then the input string is shortened to `length` characters. +- `string` — Input string that should be padded. [String](../data-types/string.md). +- `length` — The length of the resulting string. [UInt or Int](../data-types/int-uint.md). If the value is smaller than the input string length, then the input string is shortened to `length` characters. - `pad_string` — The string to pad the input string with. [String](../data-types/string.md). Optional. If not specified, then the input string is padded with spaces. **Returned value** -- The resulting string of the given length. +- A right-padded string of the given length. Type: [String](../data-types/string.md). **Example** -Query: - ``` sql SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7); ``` Result: -``` text +```result ┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐ │ абвг*** │ абвг │ └──────────────────────────────┴─────────────────────────┘ ``` -## lower, lcase +## lower -Converts ASCII Latin symbols in a string to lowercase. +Converts the ASCII Latin symbols in a string to lowercase. -## upper, ucase +Alias: `lcase` -Converts ASCII Latin symbols in a string to uppercase. +## upper + +Converts the ASCII Latin symbols in a string to uppercase. + +Alias: `ucase` ## lowerUTF8 -Converts a string to lowercase, assuming the string contains a set of bytes that make up a UTF-8 encoded text. -It does not detect the language. E.g. for Turkish the result might not be exactly correct (i/İ vs. i/I). +Converts a string to lowercase, assuming that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined. + +Does not detect the language, e.g. for Turkish the result might not be exactly correct (i/İ vs. i/I). + If the length of the UTF-8 byte sequence is different for upper and lower case of a code point, the result may be incorrect for this code point. -If the string contains a sequence of bytes that are not valid UTF-8, then the behavior is undefined. ## upperUTF8 -Converts a string to uppercase, assuming the string contains a set of bytes that make up a UTF-8 encoded text. -It does not detect the language. E.g. for Turkish the result might not be exactly correct (i/İ vs. i/I). +Converts a string to uppercase, assuming that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined. + +Does not detect the language, e.g. for Turkish the result might not be exactly correct (i/İ vs. i/I). + If the length of the UTF-8 byte sequence is different for upper and lower case of a code point, the result may be incorrect for this code point. -If the string contains a sequence of bytes that are not valid UTF-8, then the behavior is undefined. ## isValidUTF8 -Returns 1, if the set of bytes is valid UTF-8 encoded, otherwise 0. +Returns 1, if the set of bytes constitutes valid UTF-8-encoded text, otherwise 0. ## toValidUTF8 Replaces invalid UTF-8 characters by the `�` (U+FFFD) character. All running in a row invalid characters are collapsed into the one replacement character. +**Syntax** + ``` sql toValidUTF8(input_string) ``` @@ -301,7 +294,9 @@ toValidUTF8(input_string) - `input_string` — Any set of bytes represented as the [String](../../sql-reference/data-types/string.md) data type object. -Returned value: Valid UTF-8 string. +**Returned value** + +- A valid UTF-8 string. **Example** @@ -309,7 +304,7 @@ Returned value: Valid UTF-8 string. SELECT toValidUTF8('\x61\xF0\x80\x80\x80b'); ``` -``` text +```result ┌─toValidUTF8('a����b')─┐ │ a�b │ └───────────────────────┘ @@ -317,9 +312,7 @@ SELECT toValidUTF8('\x61\xF0\x80\x80\x80b'); ## repeat -Repeats a string as many times as specified and concatenates the replicated values as a single string. - -Alias: `REPEAT`. +Conatenates a string as many times with itself as specified. **Syntax** @@ -327,6 +320,8 @@ Alias: `REPEAT`. repeat(s, n) ``` +Alias: `REPEAT` + **Arguments** - `s` — The string to repeat. [String](../../sql-reference/data-types/string.md). @@ -334,21 +329,19 @@ repeat(s, n) **Returned value** -The single string, which contains the string `s` repeated `n` times. If `n` \< 1, the function returns empty string. +The single string containing string `s` repeated `n` times. If `n` \< 1, the function returns empty string. Type: `String`. **Example** -Query: - ``` sql SELECT repeat('abc', 10); ``` Result: -``` text +```result ┌─repeat('abc', 10)──────────────┐ │ abcabcabcabcabcabcabcabcabcabc │ └────────────────────────────────┘ @@ -356,31 +349,41 @@ Result: ## reverse -Reverses the string (as a sequence of bytes). +Reverses the sequence of bytes in a string. ## reverseUTF8 -Reverses a sequence of Unicode code points, assuming that the string contains a set of bytes representing a UTF-8 text. Otherwise, it does something else (it does not throw an exception). +Reverses a sequence of Unicode code points in a string. Assumes that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined. -## format(pattern, s0, s1, …) +## format -Formatting constant pattern with the string listed in the arguments. `pattern` is a simplified Python format pattern. Format string contains “replacement fields” surrounded by curly braces `{}`. Anything that is not contained in braces is considered literal text, which is copied unchanged to the output. If you need to include a brace character in the literal text, it can be escaped by doubling: `{{ '{{' }}` and `{{ '}}' }}`. Field names can be numbers (starting from zero) or empty (then they are treated as consequence numbers). +Format the `pattern` string with the strings listed in the arguments, similar to formatting in Python. The pattern string can contain replacement fields surrounded by curly braces `{}`. Anything not contained in braces is considered literal text and copied verbatim into the output. Literal brace character can be escaped by two braces: `{{ '{{' }}` and `{{ '}}' }}`. Field names can be numbers (starting from zero) or empty (then they are implicitely given monotonically increasing numbers). + +**Syntax** + +```sql +format(pattern, s0, s1, …) +``` + +**Example** ``` sql SELECT format('{1} {0} {1}', 'World', 'Hello') ``` -``` text +```result ┌─format('{1} {0} {1}', 'World', 'Hello')─┐ │ Hello World Hello │ └─────────────────────────────────────────┘ ``` +With implicit numbers: + ``` sql SELECT format('{} {}', 'Hello', 'World') ``` -``` text +```result ┌─format('{} {}', 'Hello', 'World')─┐ │ Hello World │ └───────────────────────────────────┘ @@ -388,7 +391,7 @@ SELECT format('{} {}', 'Hello', 'World') ## concat -Concatenates the strings listed in the arguments, without a separator. +Concatenates the strings listed in the arguments without separator. **Syntax** @@ -402,21 +405,19 @@ Values of type String or FixedString. **Returned values** -Returns the String that results from concatenating the arguments. +The String created by concatenating the arguments. -If any of argument values is `NULL`, `concat` returns `NULL`. +If any of arguments is `NULL`, the function returns `NULL`. **Example** -Query: - ``` sql SELECT concat('Hello, ', 'World!'); ``` Result: -``` text +```result ┌─concat('Hello, ', 'World!')─┐ │ Hello, World! │ └─────────────────────────────┘ @@ -424,9 +425,9 @@ Result: ## concatAssumeInjective -Same as [concat](#concat), the difference is that you need to ensure that `concat(s1, s2, ...) → sn` is injective, it will be used for optimization of GROUP BY. +Like [concat](#concat) but assumes that `concat(s1, s2, ...) → sn` is injective. Can be used for optimization of GROUP BY. -The function is named “injective” if it always returns different result for different values of arguments. In other words: different arguments never yield identical result. +A function is called injective if it returns for different arguments different results. In other words: different arguments never produce identical result. **Syntax** @@ -440,9 +441,9 @@ Values of type String or FixedString. **Returned values** -Returns the String that results from concatenating the arguments. +The String created by concatenating the arguments. -If any of argument values is `NULL`, `concatAssumeInjective` returns `NULL`. +If any of argument values is `NULL`, the function returns `NULL`. **Example** @@ -454,7 +455,7 @@ INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello SELECT * from key_val; ``` -``` text +```result ┌─key1────┬─key2─────┬─value─┐ │ Hello, │ World │ 1 │ │ Hello, │ World │ 2 │ @@ -463,15 +464,13 @@ SELECT * from key_val; └─────────┴──────────┴───────┘ ``` -Query: - ``` sql SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY concatAssumeInjective(key1, key2); ``` Result: -``` text +```result ┌─concat(key1, key2)─┬─sum(value)─┐ │ Hello, World! │ 3 │ │ Hello, World! │ 2 │ @@ -479,25 +478,88 @@ Result: └────────────────────┴────────────┘ ``` -## substring(s, offset, length), mid(s, offset, length), substr(s, offset, length) +## concatWithSeparator -Returns a substring starting with the byte from the ‘offset’ index that is ‘length’ bytes long. Character indexing starts from one (as in standard SQL). +Concatenates the given strings with a given separator. -## substringUTF8(s, offset, length) +**Syntax** -The same as ‘substring’, but for Unicode code points. Works under the assumption that the string contains a set of bytes representing a UTF-8 encoded text. If this assumption is not met, it returns some result (it does not throw an exception). +``` sql +concatWithSeparator(sep, expr1, expr2, expr3...) +``` -## appendTrailingCharIfAbsent(s, c) +**Arguments** -If the ‘s’ string is non-empty and does not contain the ‘c’ character at the end, it appends the ‘c’ character to the end. +- sep — separator. Const [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). +- exprN — expression to be concatenated. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -## convertCharset(s, from, to) +**Returned values** -Returns the string ‘s’ that was converted from the encoding in ‘from’ to the encoding in ‘to’. +The String created by concatenating the arguments. -## base58Encode(plaintext) +If any of the argument values is `NULL`, the function returns `NULL`. -Accepts a String and encodes it using [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) encoding scheme using "Bitcoin" alphabet. +**Example** + +``` sql +SELECT concatWithSeparator('a', '1', '2', '3', '4') +``` + +Result: + +```result +┌─concatWithSeparator('a', '1', '2', '3', '4')─┐ +│ 1a2a3a4 │ +└───────────────────────────────────┘ +``` + +## concatWithSeparatorAssumeInjective + +Like `concatWithSeparator` but assumes that `concatWithSeparator(sep, expr1, expr2, expr3...) → result` is injective. Can be used for optimization of GROUP BY. + +A function is called injective if it returns for different arguments different results. In other words: different arguments never produce identical result. + +## substring(s, offset, length) + +Returns a substring with `length` many bytes, starting at the byte at index `offset`. Character indexing starts from 1. + +**Syntax** + +```sql +substring(s, offset, length) +``` + +Alias: +- `substr` +- `mid` + +## substringUTF8 + +Like `substring` but for Unicode code points. Assumes that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined. + +## appendTrailingCharIfAbsent + +Appends character `c` to string `s` if `s` is non-empty and does not end with character `c`. + +**Syntax** + +```sql +appendTrailingCharIfAbsent(s, c) +``` + +## convertCharset + +Returns string `s` converted from the encoding `from` to encoding `to`. + +**Syntax** + +```sql +convertCharset(s, from, to) +``` + +## base58Encode + +Encodes a String using [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) in the "Bitcoin" alphabet. **Syntax** @@ -511,117 +573,107 @@ base58Encode(plaintext) **Returned value** -- A string containing encoded value of 1st argument. +- A string containing the encoded value of the argument. Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT base58Encode('Encoded'); ``` Result: -```text + +```result ┌─base58Encode('Encoded')─┐ │ 3dc8KtHrwM │ └─────────────────────────┘ ``` -## base58Decode(encoded_text) +## base58Decode Accepts a String and decodes it using [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) encoding scheme using "Bitcoin" alphabet. **Syntax** ```sql -base58Decode(encoded_text) +base58Decode(encoded) ``` **Arguments** -- `encoded_text` — [String](../../sql-reference/data-types/string.md) column or constant. If the string is not a valid base58-encoded value, an exception is thrown. +- `encoded` — [String](../../sql-reference/data-types/string.md) column or constant. If the string is not a valid Base58-encoded value, an exception is thrown. **Returned value** -- A string containing decoded value of 1st argument. +- A string containing the decoded value of the argument. Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT base58Decode('3dc8KtHrwM'); ``` Result: -```text + +```result ┌─base58Decode('3dc8KtHrwM')─┐ │ Encoded │ └────────────────────────────┘ ``` -## tryBase58Decode(s) +## tryBase58Decode -Similar to base58Decode, but returns an empty string in case of error. +Like `base58Decode` but returns an empty string in case of error. -## base64Encode(s) +## base64Encode -Encodes ‘s’ FixedString or String into base64. +Encodes a String or FixedString as base64. Alias: `TO_BASE64`. -## base64Decode(s) +## base64Decode -Decode base64-encoded FixedString or String ‘s’ into original string. In case of failure raises an exception. +Decodes a base64-encoded String or FixedString. Throws an exception in case of error. Alias: `FROM_BASE64`. -## tryBase64Decode(s) +## tryBase64Decode -Similar to base64Decode, but returns an empty string in case of error. +Like `base64Decode` but returns an empty string in case of error. -## endsWith(s, suffix) +## endsWith -Returns whether to end with the specified suffix. Returns 1 if the string ends with the specified suffix, otherwise it returns 0. +Returns whether string `str` ends with `suffix`. -## startsWith(str, prefix) +**Syntax** -Returns 1 whether string starts with the specified prefix, otherwise it returns 0. +```sql +endsWith(str, suffix) +``` + +## startsWith + +Returns whether string `str` starts with `prefix`. + +**Syntax** + +```sql +startsWith(str, prefix) +``` + +**Example** ``` sql SELECT startsWith('Spider-Man', 'Spi'); ``` -**Returned values** - -- 1, if the string starts with the specified prefix. -- 0, if the string does not start with the specified prefix. - -**Example** - -Query: - -``` sql -SELECT startsWith('Hello, world!', 'He'); -``` - -Result: - -``` text -┌─startsWith('Hello, world!', 'He')─┐ -│ 1 │ -└───────────────────────────────────┘ -``` - ## trim -Removes all specified characters from the start or end of a string. -By default removes all consecutive occurrences of common whitespace (ASCII character 32) from both ends of a string. +Removes the specified characters from the start or end of a string. If not specified otherwise, the function removes whitespace (ASCII-character 32). **Syntax** @@ -636,21 +688,19 @@ trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) **Returned value** -A string without leading and (or) trailing specified characters. +A string without leading and/or trailing specified characters. Type: `String`. **Example** -Query: - ``` sql SELECT trim(BOTH ' ()' FROM '( Hello, world! )'); ``` Result: -``` text +```result ┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐ │ Hello, world! │ └───────────────────────────────────────────────┘ @@ -658,7 +708,7 @@ Result: ## trimLeft -Removes all consecutive occurrences of common whitespace (ASCII character 32) from the beginning of a string. It does not remove other kinds of whitespace characters (tab, no-break space, etc.). +Removes the consecutive occurrences of whitespace (ASCII-character 32) from the start of a string. **Syntax** @@ -680,15 +730,13 @@ Type: `String`. **Example** -Query: - ``` sql SELECT trimLeft(' Hello, world! '); ``` Result: -``` text +```result ┌─trimLeft(' Hello, world! ')─┐ │ Hello, world! │ └─────────────────────────────────────┘ @@ -696,7 +744,7 @@ Result: ## trimRight -Removes all consecutive occurrences of common whitespace (ASCII character 32) from the end of a string. It does not remove other kinds of whitespace characters (tab, no-break space, etc.). +Removes the consecutive occurrences of whitespace (ASCII-character 32) from the end of a string. **Syntax** @@ -718,15 +766,13 @@ Type: `String`. **Example** -Query: - ``` sql SELECT trimRight(' Hello, world! '); ``` Result: -``` text +```result ┌─trimRight(' Hello, world! ')─┐ │ Hello, world! │ └──────────────────────────────────────┘ @@ -734,7 +780,7 @@ Result: ## trimBoth -Removes all consecutive occurrences of common whitespace (ASCII character 32) from both ends of a string. It does not remove other kinds of whitespace characters (tab, no-break space, etc.). +Removes the consecutive occurrences of whitespace (ASCII-character 32) from both ends of a string. **Syntax** @@ -756,33 +802,31 @@ Type: `String`. **Example** -Query: - ``` sql SELECT trimBoth(' Hello, world! '); ``` Result: -``` text +```result ┌─trimBoth(' Hello, world! ')─┐ │ Hello, world! │ └─────────────────────────────────────┘ ``` -## CRC32(s) +## CRC32 -Returns the CRC32 checksum of a string, using CRC-32-IEEE 802.3 polynomial and initial value `0xffffffff` (zlib implementation). +Returns the CRC32 checksum of a string using CRC-32-IEEE 802.3 polynomial and initial value `0xffffffff` (zlib implementation). The result type is UInt32. -## CRC32IEEE(s) +## CRC32IEEE Returns the CRC32 checksum of a string, using CRC-32-IEEE 802.3 polynomial. The result type is UInt32. -## CRC64(s) +## CRC64 Returns the CRC64 checksum of a string, using CRC-64-ECMA polynomial. @@ -810,15 +854,13 @@ Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT normalizeQuery('[1, 2, 3, x]') AS query; ``` Result: -``` text +```result ┌─query────┐ │ [?.., x] │ └──────────┘ @@ -826,7 +868,7 @@ Result: ## normalizedQueryHash -Returns identical 64bit hash values without the values of literals for similar queries. It helps to analyze query log. +Returns identical 64bit hash values without the values of literals for similar queries. Can be helpful to analyze query log. **Syntax** @@ -846,15 +888,13 @@ Type: [UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges). **Example** -Query: - ``` sql SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 AS `abc`') AS res; ``` Result: -``` text +```result ┌─res─┐ │ 1 │ └─────┘ @@ -862,7 +902,7 @@ Result: ## normalizeUTF8NFC -Converts a string to [NFC normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string contains a set of bytes that make up a UTF-8 encoded text. +Converts a string to [NFC normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string is valid UTF8-encoded text. **Syntax** @@ -872,7 +912,7 @@ normalizeUTF8NFC(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — UTF8-encoded input string. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -882,15 +922,13 @@ Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT length('â'), normalizeUTF8NFC('â') AS nfc, length(nfc) AS nfc_len; ``` Result: -``` text +```result ┌─length('â')─┬─nfc─┬─nfc_len─┐ │ 2 │ â │ 2 │ └─────────────┴─────┴─────────┘ @@ -898,7 +936,7 @@ Result: ## normalizeUTF8NFD -Converts a string to [NFD normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string contains a set of bytes that make up a UTF-8 encoded text. +Converts a string to [NFD normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string is valid UTF8-encoded text. **Syntax** @@ -908,7 +946,7 @@ normalizeUTF8NFD(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — UTF8-encoded input string. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -918,15 +956,13 @@ Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT length('â'), normalizeUTF8NFD('â') AS nfd, length(nfd) AS nfd_len; ``` Result: -``` text +```result ┌─length('â')─┬─nfd─┬─nfd_len─┐ │ 2 │ â │ 3 │ └─────────────┴─────┴─────────┘ @@ -934,7 +970,7 @@ Result: ## normalizeUTF8NFKC -Converts a string to [NFKC normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string contains a set of bytes that make up a UTF-8 encoded text. +Converts a string to [NFKC normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string is valid UTF8-encoded text. **Syntax** @@ -944,7 +980,7 @@ normalizeUTF8NFKC(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — UTF8-encoded input string. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -954,15 +990,13 @@ Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT length('â'), normalizeUTF8NFKC('â') AS nfkc, length(nfkc) AS nfkc_len; ``` Result: -``` text +```result ┌─length('â')─┬─nfkc─┬─nfkc_len─┐ │ 2 │ â │ 2 │ └─────────────┴──────┴──────────┘ @@ -970,7 +1004,7 @@ Result: ## normalizeUTF8NFKD -Converts a string to [NFKD normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string contains a set of bytes that make up a UTF-8 encoded text. +Converts a string to [NFKD normalized form](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms), assuming the string is valid UTF8-encoded text. **Syntax** @@ -980,7 +1014,7 @@ normalizeUTF8NFKD(words) **Arguments** -- `words` — Input string that contains UTF-8 encoded text. [String](../../sql-reference/data-types/string.md). +- `words` — UTF8-encoded input string. [String](../../sql-reference/data-types/string.md). **Returned value** @@ -990,15 +1024,13 @@ Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT length('â'), normalizeUTF8NFKD('â') AS nfkd, length(nfkd) AS nfkd_len; ``` Result: -``` text +```result ┌─length('â')─┬─nfkd─┬─nfkd_len─┐ │ 2 │ â │ 3 │ └─────────────┴──────┴──────────┘ @@ -1006,9 +1038,10 @@ Result: ## encodeXMLComponent -Escapes characters to place string into XML text node or attribute. +Escapes characters with special meaning in XML such that they can afterwards be place into a XML text node or attribute. -The following five XML predefined entities will be replaced: `<`, `&`, `>`, `"`, `'`. +The following characters are replaced: `<`, `&`, `>`, `"`, `'`. +Also see the [list of XML and HTML character entity references](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references). **Syntax** @@ -1018,18 +1051,16 @@ encodeXMLComponent(x) **Arguments** -- `x` — The sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — An input string. [String](../../sql-reference/data-types/string.md). **Returned value** -- The sequence of characters with escape characters. +- The escaped string. Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT encodeXMLComponent('Hello, "world"!'); SELECT encodeXMLComponent('<123>'); @@ -1039,7 +1070,7 @@ SELECT encodeXMLComponent('\'foo\''); Result: -``` text +```result Hello, "world"! <123> &clickhouse @@ -1048,7 +1079,8 @@ Hello, "world"! ## decodeXMLComponent -Replaces XML predefined entities with characters. Predefined entities are `"` `&` `'` `>` `<` +Un-escapes substrings with special meaning in XML. These substrings are: `"` `&` `'` `>` `<` + This function also replaces numeric character references with Unicode characters. Both decimal (like `✓`) and hexadecimal (`✓`) forms are supported. **Syntax** @@ -1059,18 +1091,16 @@ decodeXMLComponent(x) **Arguments** -- `x` — A sequence of characters. [String](../../sql-reference/data-types/string.md). +- `x` — An input string. [String](../../sql-reference/data-types/string.md). **Returned value** -- The sequence of characters after replacement. +- The un-escaped string. Type: [String](../../sql-reference/data-types/string.md). **Example** -Query: - ``` sql SELECT decodeXMLComponent(''foo''); SELECT decodeXMLComponent('< Σ >'); @@ -1078,25 +1108,20 @@ SELECT decodeXMLComponent('< Σ >'); Result: -``` text +```result 'foo' < Σ > ``` -**See Also** - -- [List of XML and HTML character entity references](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references) - - - ## extractTextFromHTML -A function to extract text from HTML or XHTML. -It does not necessarily 100% conform to any of the HTML, XML or XHTML standards, but the implementation is reasonably accurate and it is fast. The rules are the following: +This function extracts plain text from HTML or XHTML. -1. Comments are skipped. Example: ``. Comment must end with `-->`. Nested comments are not possible. +It does not conform 100% to the HTML, XML or XHTML specification but the implementation is reasonably accurate and fast. The rules are the following: + +1. Comments are skipped. Example: ``. Comment must end with `-->`. Nested comments are disallowed. Note: constructions like `` and `` are not valid comments in HTML but they are skipped by other rules. -2. CDATA is pasted verbatim. Note: CDATA is XML/XHTML specific. But it is processed for "best-effort" approach. +2. CDATA is pasted verbatim. Note: CDATA is XML/XHTML-specific and processed on a "best-effort" basis. 3. `script` and `style` elements are removed with all their content. Note: it is assumed that closing tag cannot appear inside content. For example, in JS string literal has to be escaped like `"<\/script>"`. Note: comments and CDATA are possible inside `script` or `style` - then closing tags are not searched inside CDATA. Example: `]]>`. But they are still searched inside comments. Sometimes it becomes complicated: ` var y = "-->"; alert(x + y);` Note: `script` and `style` can be the names of XML namespaces - then they are not treated like usual `script` or `style` elements. Example: `Hello`. @@ -1135,8 +1160,6 @@ The first example contains several tags and a comment and also shows whitespace The second example shows `CDATA` and `script` tag processing. In the third example text is extracted from the full HTML response received by the [url](../../sql-reference/table-functions/url.md) function. -Query: - ``` sql SELECT extractTextFromHTML('

A text withtags.

'); SELECT extractTextFromHTML('CDATA
]]> '); @@ -1145,59 +1168,24 @@ SELECT extractTextFromHTML(html) FROM url('http://www.donothingfor2minutes.com/' Result: -``` text +```result A text with tags . The content within CDATA Do Nothing for 2 Minutes 2:00   ``` -## ascii(s) {#ascii} +## ascii {#ascii} -Returns the ASCII code point of the first character of str. The result type is Int32. +Returns the ASCII code point (as Int32) of the first character of string `s`. -If s is empty, the result is 0. If the first character is not an ASCII character or not part of the Latin-1 Supplement range of UTF-16, the result is undefined. - - - -## concatWithSeparator - -Returns the concatenation strings separated by string separator. If any of the argument values is `NULL`, the function returns `NULL`. +If `s` is empty, the result is 0. If the first character is not an ASCII character or not part of the Latin-1 supplement range of UTF-16, the result is undefined. **Syntax** -``` sql -concatWithSeparator(sep, expr1, expr2, expr3...) +```sql +ascii(s) ``` -**Arguments** -- sep — separator. Const [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). -- exprN — expression to be concatenated. [String](../../sql-reference/data-types/string.md) or [FixedString](../../sql-reference/data-types/fixedstring.md). - -**Returned values** -- The concatenated String. - -**Example** - -Query: - -``` sql -SELECT concatWithSeparator('a', '1', '2', '3', '4') -``` - -Result: - -``` text -┌─concatWithSeparator('a', '1', '2', '3', '4')─┐ -│ 1a2a3a4 │ -└───────────────────────────────────┘ -``` - -## concatWithSeparatorAssumeInjective - -Same as concatWithSeparator, the difference is that you need to ensure that concatWithSeparator(sep, expr1, expr2, expr3...) → result is injective, it will be used for optimization of GROUP BY. - -The function is named “injective” if it always returns different result for different values of arguments. In other words: different arguments never yield identical result. - ## soundex Returns the [Soundex code](https://en.wikipedia.org/wiki/Soundex) of a string. @@ -1218,17 +1206,14 @@ soundex(val) **Example** -Query: - ``` sql select soundex('aksel'); ``` Result: -``` text +```result ┌─soundex('aksel')─┐ │ A240 │ └──────────────────┘ ``` - From 4b0b25c6558f99627112e34f07254bbe1c628546 Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Wed, 19 Apr 2023 20:33:39 +0000 Subject: [PATCH 384/535] Cleanup math function docs --- .../sql-reference/functions/math-functions.md | 356 +++++++++++------- 1 file changed, 229 insertions(+), 127 deletions(-) diff --git a/docs/en/sql-reference/functions/math-functions.md b/docs/en/sql-reference/functions/math-functions.md index 023b5d50f4b..9851378d4fd 100644 --- a/docs/en/sql-reference/functions/math-functions.md +++ b/docs/en/sql-reference/functions/math-functions.md @@ -6,115 +6,255 @@ sidebar_label: Mathematical # Mathematical Functions -All the functions return a Float64 number. The accuracy of the result is close to the maximum precision possible, but the result might not coincide with the machine representable number nearest to the corresponding real number. +All the functions return a Float64 number. Results are generally as close to the actual result as possible, but in some cases less precise than the machine-representable number. -## e() +## e -Returns a Float64 number that is close to the number e. +Returns e. -## pi() +**Syntax** -Returns a Float64 number that is close to the number π. +```sql +e() +``` -## exp(x) +## pi -Accepts a numeric argument and returns a Float64 number close to the exponent of the argument. +Returns π. -## log(x), ln(x) +**Syntax** -Accepts a numeric argument and returns a Float64 number close to the natural logarithm of the argument. +```sql +pi() +``` -## exp2(x) +## exp -Accepts a numeric argument and returns a Float64 number close to 2 to the power of x. +Returns e to the power of the given argument. -## log2(x) +**Syntax** -Accepts a numeric argument and returns a Float64 number close to the binary logarithm of the argument. +```sql +exp(x) +``` -## exp10(x) +## log -Accepts a numeric argument and returns a Float64 number close to 10 to the power of x. +Returns the natural logarithm of the argument. -## log10(x) +**Syntax** -Accepts a numeric argument and returns a Float64 number close to the decimal logarithm of the argument. +```sql +log(x) +``` -## sqrt(x) +Alias: `ln(x)` -Accepts a numeric argument and returns a Float64 number close to the square root of the argument. +## exp2 -## cbrt(x) +Returns 2 to the power of the given argumetn -Accepts a numeric argument and returns a Float64 number close to the cubic root of the argument. +**Syntax** -## erf(x) +```sql +exp2(x) +``` -If ‘x’ is non-negative, then `erf(x / σ√2)` is the probability that a random variable having a normal distribution with standard deviation ‘σ’ takes the value that is separated from the expected value by more than ‘x’. +## intExp2 -Example (three sigma rule): +Like `exp` but returns a UInt64. + +**Syntax** + +```sql +intExp2(x) +``` + +## log2 + +Returns the binary logarithm of the argument. + +**Syntax** + +```sql +log2(x) +``` + +## exp10 + +Returns 10 to the power of the given argumetn + +**Syntax** + +```sql +exp10(x) +``` + +## intExp10 + +Like `exp10` but returns a UInt64. + +**Syntax** + +```sql +intExp10(x) +``` + +## log10 + +Returns the decimal logarithm of the argument. + +**Syntax** + +```sql +log10(x) +``` + +## sqrt + +Returns the square root of the argument. + +```sql +sqrt(x) +``` + +## cbrt + +Returns the cubic root of the argument. + +```sql +cbrt(x) +``` + +## erf + +If `x` is non-negative, then `erf(x / σ√2)` is the probability that a random variable having a normal distribution with standard deviation `σ` takes the value that is separated from the expected value by more than `x`. + +**Syntax** + +```sql +erf(x) +``` + +**Example** + +(three sigma rule) ``` sql SELECT erf(3 / sqrt(2)); ``` -``` text +```result ┌─erf(divide(3, sqrt(2)))─┐ │ 0.9973002039367398 │ └─────────────────────────┘ ``` -## erfc(x) +## erfc -Accepts a numeric argument and returns a Float64 number close to 1 - erf(x), but without loss of precision for large ‘x’ values. +Returns a number close to `1 - erf(x)` without loss of precision for large ‘x’ values. -## lgamma(x) +**Syntax** -The logarithm of the gamma function. +```sql +erfc(x) +``` -## tgamma(x) +## lgamma -Gamma function. +Returns the logarithm of the gamma function. -## sin(x) +**Syntax** -The sine. +```sql +lgamma(x) +``` -## cos(x) +## tgamma -The cosine. +Returns the gamma function. -## tan(x) +**Syntax** -The tangent. +```sql +gamma(x) +``` -## asin(x) +## sin -The arc sine. +Returns the sine of the argument -## acos(x) +**Syntax** -The arc cosine. +```sql +sin(x) +``` -## atan(x) +## cos -The arc tangent. +Returns the cosine of the argument. -## pow(x, y), power(x, y) +**Syntax** -Takes two numeric arguments x and y. Returns a Float64 number close to x to the power of y. +```sql +cos(x) +``` -## intExp2 +## tan -Accepts a numeric argument and returns a UInt64 number close to 2 to the power of x. +Returns the tangent of the argument. -## intExp10 +**Syntax** -Accepts a numeric argument and returns a UInt64 number close to 10 to the power of x. +```sql +tan(x) +``` -## cosh(x) +## asin -[Hyperbolic cosine](https://in.mathworks.com/help/matlab/ref/cosh.html). +Returns the arc sine of the argument. + +**Syntax** + +```sql +asin(x) +``` + +## acos + +Returns the arc cosine of the argument. + +**Syntax** + +```sql +acos(x) +``` + +## atan + +Returns the arc tangent of the argument. + +**Syntax** + +```sql +atan(x) +``` + +## pow + +Returns `x` to the power of `y`. + +**Syntax** + +```sql +pow(x, y) +``` + +Alias: `power(x, y)` + +## cosh + +Returns the [hyperbolic cosine](https://in.mathworks.com/help/matlab/ref/cosh.html) of the argument. **Syntax** @@ -134,23 +274,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT cosh(0); ``` Result: -``` text +```result ┌─cosh(0)──┐ │ 1 │ └──────────┘ ``` -## acosh(x) +## acosh -[Inverse hyperbolic cosine](https://www.mathworks.com/help/matlab/ref/acosh.html). +Returns the [inverse hyperbolic cosine](https://www.mathworks.com/help/matlab/ref/acosh.html). **Syntax** @@ -170,27 +308,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT acosh(1); ``` Result: -``` text +```result ┌─acosh(1)─┐ │ 0 │ └──────────┘ ``` -**See Also** +## sinh -- [cosh(x)](../../sql-reference/functions/math-functions.md#coshx) - -## sinh(x) - -[Hyperbolic sine](https://www.mathworks.com/help/matlab/ref/sinh.html). +Returns the [hyperbolic sine](https://www.mathworks.com/help/matlab/ref/sinh.html). **Syntax** @@ -210,23 +342,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT sinh(0); ``` Result: -``` text +```result ┌─sinh(0)──┐ │ 0 │ └──────────┘ ``` -## asinh(x) +## asinh -[Inverse hyperbolic sine](https://www.mathworks.com/help/matlab/ref/asinh.html). +Returns the [inverse hyperbolic sine](https://www.mathworks.com/help/matlab/ref/asinh.html). **Syntax** @@ -246,27 +376,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT asinh(0); ``` Result: -``` text +```result ┌─asinh(0)─┐ │ 0 │ └──────────┘ ``` -**See Also** +## atanh -- [sinh(x)](../../sql-reference/functions/math-functions.md#sinhx) - -## atanh(x) - -[Inverse hyperbolic tangent](https://www.mathworks.com/help/matlab/ref/atanh.html). +Returns the [inverse hyperbolic tangent](https://www.mathworks.com/help/matlab/ref/atanh.html). **Syntax** @@ -286,23 +410,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT atanh(0); ``` Result: -``` text +```result ┌─atanh(0)─┐ │ 0 │ └──────────┘ ``` -## atan2(y, x) +## atan2 -The [function](https://en.wikipedia.org/wiki/Atan2) calculates the angle in the Euclidean plane, given in radians, between the positive x axis and the ray to the point `(x, y) ≠ (0, 0)`. +Returns the [atan2](https://en.wikipedia.org/wiki/Atan2) as the angle in the Euclidean plane, given in radians, between the positive x axis and the ray to the point `(x, y) ≠ (0, 0)`. **Syntax** @@ -323,23 +445,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT atan2(1, 1); ``` Result: -``` text +```result ┌────────atan2(1, 1)─┐ │ 0.7853981633974483 │ └────────────────────┘ ``` -## hypot(x, y) +## hypot -Calculates the length of the hypotenuse of a right-angle triangle. The [function](https://en.wikipedia.org/wiki/Hypot) avoids problems that occur when squaring very large or very small numbers. +Returns the length of the hypotenuse of a right-angle triangle. [Hypot](https://en.wikipedia.org/wiki/Hypot) avoids problems that occur when squaring very large or very small numbers. **Syntax** @@ -360,23 +480,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT hypot(1, 1); ``` Result: -``` text +```result ┌────────hypot(1, 1)─┐ │ 1.4142135623730951 │ └────────────────────┘ ``` -## log1p(x) +## log1p -Calculates `log(1+x)`. The [function](https://en.wikipedia.org/wiki/Natural_logarithm#lnp1) `log1p(x)` is more accurate than `log(1+x)` for small values of x. +Calculates `log(1+x)`. The [calculation](https://en.wikipedia.org/wiki/Natural_logarithm#lnp1) `log1p(x)` is more accurate than `log(1+x)` for small values of x. **Syntax** @@ -396,25 +514,19 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT log1p(0); ``` Result: -``` text +```result ┌─log1p(0)─┐ │ 0 │ └──────────┘ ``` -**See Also** - -- [log(x)](../../sql-reference/functions/math-functions.md#logx-lnx) - -## sign(x) +## sign Returns the sign of a real number. @@ -444,7 +556,7 @@ SELECT sign(0); Result: -``` text +```result ┌─sign(0)─┐ │ 0 │ └─────────┘ @@ -458,7 +570,7 @@ SELECT sign(1); Result: -``` text +```result ┌─sign(1)─┐ │ 1 │ └─────────┘ @@ -472,15 +584,15 @@ SELECT sign(-1); Result: -``` text +```result ┌─sign(-1)─┐ │ -1 │ └──────────┘ ``` -## degrees(x) +## degrees -Converts the input value in radians to degrees. +Converts radians to degrees. **Syntax** @@ -500,23 +612,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT degrees(3.141592653589793); ``` Result: -``` text +```result ┌─degrees(3.141592653589793)─┐ │ 180 │ └────────────────────────────┘ ``` -## radians(x) +## radians -Converts the input value in degrees to radians. +Converts degrees to radians. **Syntax** @@ -536,24 +646,21 @@ Type: [Float64](../../sql-reference/data-types/float.md#float32-float64). **Example** -Query: - ``` sql SELECT radians(180); ``` Result: -``` text +```result ┌──────radians(180)─┐ │ 3.141592653589793 │ └───────────────────┘ ``` +## factorial -## factorial(n) - -Computes the factorial of an integer value. It works with any native integer type including UInt(8|16|32|64) and Int(8|16|32|64). The return type is UInt64. +Computes the factorial of an integer value. Works with any native integer type including UInt(8|16|32|64) and Int(8|16|32|64). The return type is UInt64. The factorial of 0 is 1. Likewise, the factorial() function returns 1 for any negative value. The maximum positive value for the input argument is 20, a value of 21 or greater will cause exception throw. @@ -566,21 +673,19 @@ factorial(n) **Example** -Query: - ``` sql SELECT factorial(10); ``` Result: -``` text +```result ┌─factorial(10)─┐ │ 3628800 │ └───────────────┘ ``` -## width_bucket(operand, low, high, count) +## width_bucket Returns the number of the bucket in which `operand` falls in a histogram having `count` equal-width buckets spanning the range `low` to `high`. Returns `0` if `operand < low`, and returns `count+1` if `operand >= high`. @@ -591,20 +696,17 @@ Returns the number of the bucket in which `operand` falls in a histogram having ```sql widthBucket(operand, low, high, count) ``` - -There is also a case insensitive alias called `WIDTH_BUCKET` to provide compatibility with other databases. +Alias: `WIDTH_BUCKET` **Example** -Query: - ``` sql SELECT widthBucket(10.15, -8.6, 23, 18); ``` Result: -``` text +```result ┌─widthBucket(10.15, -8.6, 23, 18)─┐ │ 11 │ └──────────────────────────────────┘ From 214ee232fdf56a8388dea2412c3b2fccee61fe2c Mon Sep 17 00:00:00 2001 From: Robert Schulze Date: Thu, 20 Apr 2023 09:30:11 +0000 Subject: [PATCH 385/535] Clean up string search function docs --- .../functions/string-functions.md | 2 - .../functions/string-replace-functions.md | 2 - .../functions/string-search-functions.md | 729 ++++++------------ 3 files changed, 228 insertions(+), 505 deletions(-) diff --git a/docs/en/sql-reference/functions/string-functions.md b/docs/en/sql-reference/functions/string-functions.md index 555234089e6..37135811cd7 100644 --- a/docs/en/sql-reference/functions/string-functions.md +++ b/docs/en/sql-reference/functions/string-functions.md @@ -6,9 +6,7 @@ sidebar_label: Strings # Functions for Working with Strings -:::note Functions for [searching](../../sql-reference/functions/string-search-functions.md) in strings and for [replacing](../../sql-reference/functions/string-replace-functions.md) in strings are described separately. -::: ## empty diff --git a/docs/en/sql-reference/functions/string-replace-functions.md b/docs/en/sql-reference/functions/string-replace-functions.md index 084b20bb3eb..f80e435c82f 100644 --- a/docs/en/sql-reference/functions/string-replace-functions.md +++ b/docs/en/sql-reference/functions/string-replace-functions.md @@ -6,9 +6,7 @@ sidebar_label: Replacing in Strings # Functions for Searching and Replacing in Strings -:::note Functions for [searching](../../sql-reference/functions/string-search-functions.md) and [other manipulations with strings](../../sql-reference/functions/string-functions.md) are described separately. -::: ## replaceOne(haystack, pattern, replacement) diff --git a/docs/en/sql-reference/functions/string-search-functions.md b/docs/en/sql-reference/functions/string-search-functions.md index 587636376f9..49296dc7239 100644 --- a/docs/en/sql-reference/functions/string-search-functions.md +++ b/docs/en/sql-reference/functions/string-search-functions.md @@ -6,19 +6,22 @@ sidebar_label: Searching in Strings # Functions for Searching in Strings -The search is case-sensitive by default in all these functions. There are separate variants for case insensitive search. +All functions in this section search by default case-sensitively. Case-insensitive search is usually provided by separate function variants. +Note that case-insensitive search follows the lowercase-uppercase rules of the English language. E.g. Uppercased `i` in English language is +`I` whereas in Turkish language it is `İ` - results for languages other than English may be unexpected. -:::note -Functions for [replacing](../../sql-reference/functions/string-replace-functions.md) and [other manipulations with strings](../../sql-reference/functions/string-functions.md) are described separately. -::: +Functions in this section also assume that the searched string and the search string are single-byte encoded text. If this assumption is +violated, no exception is thrown and results are undefined. Search with UTF-8 encoded strings is usually provided by separate function +variants. Likewise, if a UTF-8 function variant is used and the input strings are not UTF-8 encoded text, no exception is thrown and the +results are undefined. Note that no automatic Unicode normalization is performed, you can use the +[normalizeUTF8*()](https://clickhouse.com/docs/en/sql-reference/functions/string-functions/) functions for that. -## position(haystack, needle), locate(haystack, needle) -Searches for the substring `needle` in the string `haystack`. +[General strings functions](../../sql-reference/functions/string-functions.md) and [functions for replacing in strings](../../sql-reference/functions/string-replace-functions.md) are described separately. -Returns the position (in bytes) of the found substring in the string, starting from 1. +## position -For a case-insensitive search, use the function [positionCaseInsensitive](#positioncaseinsensitive). +Returns the position (in bytes, starting at 1) of a substring `needle` in a string `haystack`. **Syntax** @@ -26,35 +29,33 @@ For a case-insensitive search, use the function [positionCaseInsensitive](#posit position(haystack, needle[, start_pos]) ``` -``` sql -position(needle IN haystack) -``` - -Alias: `locate(haystack, needle[, start_pos])`. - -:::note -Syntax of `position(needle IN haystack)` provides SQL-compatibility, the function works the same way as to `position(haystack, needle)`. -::: +Alias: +- `position(needle IN haystack)` +- `locate(haystack, needle[, start_pos])`. **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `haystack` — String in which the search is performed. [String](../../sql-reference/syntax.md#syntax-string-literal). - `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` – Position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). Optional. +- `start_pos` – Position (1-based) in `haystack` at which the search starts. [UInt](../../sql-reference/data-types/int-uint.md). Optional. **Returned values** -- Starting position in bytes (counting from 1), if substring was found. +- Starting position in bytes and counting from 1, if the substring was found. - 0, if the substring was not found. +If substring `needle` is empty, these rules apply: +- if no `start_pos` was specified: return `1` +- if `start_pos = 0`: return `1` +- if `start_pos >= 1` and `start_pos <= length(haystack) + 1`: return `start_pos` +- otherwise: return `0` + +The same rules also apply to functions `positionCaseInsensitive`, `positionUTF8` and `positionCaseInsensitiveUTF8` + Type: `Integer`. **Examples** -The phrase “Hello, world!” contains a set of bytes representing a single-byte encoded text. The function returns some expected result: - -Query: - ``` sql SELECT position('Hello, world!', '!'); ``` @@ -67,6 +68,8 @@ Result: └────────────────────────────────┘ ``` +Example with `start_pos` argument: + ``` sql SELECT position('Hello, world!', 'o', 1), @@ -79,29 +82,21 @@ SELECT └───────────────────────────────────┴───────────────────────────────────┘ ``` -The same phrase in Russian contains characters which can’t be represented using a single byte. The function returns some unexpected result (use [positionUTF8](#positionutf8) function for multi-byte encoded text): +Example for `needle IN haystack` syntax: -Query: - -``` sql -SELECT position('Привет, мир!', '!'); +```sql +SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s); ``` Result: -``` text -┌─position('Привет, мир!', '!')─┐ -│ 21 │ -└───────────────────────────────┘ +```text +┌─equals(6, position(s, '/'))─┐ +│ 1 │ +└─────────────────────────────┘ ``` -If argument `needle` is empty the following rules apply: -- if no `start_pos` was specified: return `1` -- if `start_pos = 0`: return `1` -- if `start_pos >= 1` and `start_pos <= length(haystack) + 1`: return `start_pos` -- otherwise: return `0` - -The same rules also apply to functions `positionCaseInsensitive`, `positionUTF8` and `positionCaseInsensitiveUTF8` +Examples with empty `needle` substring: ``` sql SELECT @@ -120,223 +115,59 @@ SELECT └─────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┘ ``` - -**Examples for POSITION(needle IN haystack) syntax** - -Query: - -```sql -SELECT 3 = position('c' IN 'abc'); -``` - -Result: - -```text -┌─equals(3, position('abc', 'c'))─┐ -│ 1 │ -└─────────────────────────────────┘ -``` - -Query: - -```sql -SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s); -``` - -Result: - -```text -┌─equals(6, position(s, '/'))─┐ -│ 1 │ -└─────────────────────────────┘ -``` - ## positionCaseInsensitive -The same as [position](#position) returns the position (in bytes) of the found substring in the string, starting from 1. Use the function for a case-insensitive search. - -Works under the assumption that the string contains a set of bytes representing a single-byte encoded text. If this assumption is not met and a character can’t be represented using a single byte, the function does not throw an exception and returns some unexpected result. If character can be represented using two bytes, it will use two bytes and so on. - -**Syntax** - -``` sql -positionCaseInsensitive(haystack, needle[, start_pos]) -``` - -**Arguments** - -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md). - -**Returned values** - -- Starting position in bytes (counting from 1), if substring was found. -- 0, if the substring was not found. - -Type: `Integer`. - -**Example** - -Query: - -``` sql -SELECT positionCaseInsensitive('Hello, world!', 'hello'); -``` - -Result: - -``` text -┌─positionCaseInsensitive('Hello, world!', 'hello')─┐ -│ 1 │ -└───────────────────────────────────────────────────┘ -``` +Like [position](#position) but searches case-insensitively. ## positionUTF8 -Returns the position (in Unicode points) of the found substring in the string, starting from 1. - -Works under the assumption that the string contains a set of bytes representing a UTF-8 encoded text. If this assumption is not met, the function does not throw an exception and returns some unexpected result. If character can be represented using two Unicode points, it will use two and so on. - -For a case-insensitive search, use the function [positionCaseInsensitiveUTF8](#positioncaseinsensitiveutf8). - -**Syntax** - -``` sql -positionUTF8(haystack, needle[, start_pos]) -``` - -**Arguments** - -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) - -**Returned values** - -- Starting position in Unicode points (counting from 1), if substring was found. -- 0, if the substring was not found. - -Type: `Integer`. +Like [position](#position) but assumes `haystack` and `needle` are UTF-8 encoded strings. **Examples** -The phrase “Hello, world!” in Russian contains a set of Unicode points representing a single-point encoded text. The function returns some expected result: - -Query: +Function `positionUTF8` correctly counts character `ö` (represented by two points) as a single Unicode codepoint: ``` sql -SELECT positionUTF8('Привет, мир!', '!'); +SELECT positionUTF8('Motörhead', 'r'); ``` Result: ``` text -┌─positionUTF8('Привет, мир!', '!')─┐ -│ 12 │ -└───────────────────────────────────┘ -``` - -The phrase “Salut, étudiante!”, where character `é` can be represented using a one point (`U+00E9`) or two points (`U+0065U+0301`) the function can be returned some unexpected result: - -Query for the letter `é`, which is represented one Unicode point `U+00E9`: - -``` sql -SELECT positionUTF8('Salut, étudiante!', '!'); -``` - -Result: - -``` text -┌─positionUTF8('Salut, étudiante!', '!')─┐ -│ 17 │ -└────────────────────────────────────────┘ -``` - -Query for the letter `é`, which is represented two Unicode points `U+0065U+0301`: - -``` sql -SELECT positionUTF8('Salut, étudiante!', '!'); -``` - -Result: - -``` text -┌─positionUTF8('Salut, étudiante!', '!')─┐ -│ 18 │ -└────────────────────────────────────────┘ +┌─position('Motörhead', 'r')─┐ +│ 5 │ +└────────────────────────────┘ ``` ## positionCaseInsensitiveUTF8 -The same as [positionUTF8](#positionutf8), but is case-insensitive. Returns the position (in Unicode points) of the found substring in the string, starting from 1. - -Works under the assumption that the string contains a set of bytes representing a UTF-8 encoded text. If this assumption is not met, the function does not throw an exception and returns some unexpected result. If character can be represented using two Unicode points, it will use two and so on. - -**Syntax** - -``` sql -positionCaseInsensitiveUTF8(haystack, needle[, start_pos]) -``` - -**Arguments** - -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Optional parameter, position of the first character in the string to start search. [UInt](../../sql-reference/data-types/int-uint.md) - -**Returned value** - -- Starting position in Unicode points (counting from 1), if substring was found. -- 0, if the substring was not found. - -Type: `Integer`. - -**Example** - -Query: - -``` sql -SELECT positionCaseInsensitiveUTF8('Привет, мир!', 'Мир'); -``` - -Result: - -``` text -┌─positionCaseInsensitiveUTF8('Привет, мир!', 'Мир')─┐ -│ 9 │ -└────────────────────────────────────────────────────┘ -``` +Like [positionUTF8](#positionutf8) but searches case-insensitively. ## multiSearchAllPositions -The same as [position](../../sql-reference/functions/string-search-functions.md#position) but returns `Array` of positions (in bytes) of the found corresponding substrings in the string. Positions are indexed starting from 1. +Like [position](#position) but returns an array of positions (in bytes, starting at 1) for multiple `needle` substrings in a `haystack` string. -The search is performed on sequences of bytes without respect to string encoding and collation. - -- For case-insensitive ASCII search, use the function `multiSearchAllPositionsCaseInsensitive`. -- For search in UTF-8, use the function [multiSearchAllPositionsUTF8](#multiSearchAllPositionsUTF8). -- For case-insensitive UTF-8 search, use the function multiSearchAllPositionsCaseInsensitiveUTF8. +:::note +All `multiSearch*()` functions only support up to 28 needles. +::: **Syntax** ``` sql -multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen]) +multiSearchAllPositions(haystack, [needle1, needle2, ..., needleN]) ``` **Arguments** -- `haystack` — String, in which substring will to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `haystack` — String in which the search is performed. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substrings to be searched. Array **Returned values** -- Array of starting positions in bytes (counting from 1), if the corresponding substring was found and 0 if not found. +- Array of the starting position in bytes and counting from 1 (if the substring was found) or 0 (if the substring was not found) **Example** -Query: - ``` sql SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world']); ``` @@ -351,103 +182,172 @@ Result: ## multiSearchAllPositionsUTF8 -See `multiSearchAllPositions`. +Like [multiSearchAllPositions](#multiSearchAllPositions) but assumes `haystack` and the `needle`-s are UTF-8 encoded strings. -## multiSearchFirstPosition(haystack, \[needle1, needle2, …, needlen\]) +## multiSearchFirstPosition -The same as `position` but returns the leftmost offset of the string `haystack` that is matched to some of the needles. +Like `position` but returns the leftmost offset in a `haystack` string which matches any of multiple `needle` strings. -For a case-insensitive search or/and in UTF-8 format use functions `multiSearchFirstPositionCaseInsensitive, multiSearchFirstPositionUTF8, multiSearchFirstPositionCaseInsensitiveUTF8`. +Functions `multiSearchFirstPositionCaseInsensitive`, `multiSearchFirstPositionUTF8` and `multiSearchFirstPositionCaseInsensitiveUTF8` provide case-insensitive and/or UTF-8 variants of this function. -## multiSearchFirstIndex(haystack, \[needle1, needle2, …, needlen\]) +**Syntax** + +```sql +multiSearchFirstPosition(haystack, \[needle1, needle2, …, needlen\]) +``` + +## multiSearchFirstIndex Returns the index `i` (starting from 1) of the leftmost found needlei in the string `haystack` and 0 otherwise. -For a case-insensitive search or/and in UTF-8 format use functions `multiSearchFirstIndexCaseInsensitive, multiSearchFirstIndexUTF8, multiSearchFirstIndexCaseInsensitiveUTF8`. +Functions `multiSearchFirstIndexCaseInsensitive`, `multiSearchFirstIndexUTF8` and `multiSearchFirstIndexCaseInsensitiveUTF8` provide case-insensitive and/or UTF-8 variants of this function. -## multiSearchAny(haystack, \[needle1, needle2, …, needlen\]) +**Syntax** + +```sql +multiSearchFirstIndex(haystack, \[needle1, needle2, …, needlen\]) +``` + +## multiSearchAny Returns 1, if at least one string needlei matches the string `haystack` and 0 otherwise. -For a case-insensitive search or/and in UTF-8 format use functions `multiSearchAnyCaseInsensitive, multiSearchAnyUTF8, multiSearchAnyCaseInsensitiveUTF8`. +Functions `multiSearchAnyCaseInsensitive`, `multiSearchAnyUTF8` and `multiSearchAnyCaseInsensitiveUTF8` provide case-insensitive and/or UTF-8 variants of this function. -:::note -In all `multiSearch*` functions the number of needles should be less than 28 because of implementation specification. -::: +**Syntax** -## match(haystack, pattern), haystack REGEXP pattern operator +```sql +multiSearchAny(haystack, \[needle1, needle2, …, needlen\]) +``` -Checks whether string `haystack` matches the regular expression `pattern`. The pattern is an [re2 regular expression](https://github.com/google/re2/wiki/Syntax) which has a more limited syntax than Perl regular expressions. +## match -Returns 1 in case of a match, and 0 otherwise. +Returns whether string `haystack` matches the regular expression `pattern` in [re2 regular syntax](https://github.com/google/re2/wiki/Syntax). -Matching is based on UTF-8, e.g. `.` matches the Unicode code point `¥` which is represented in UTF-8 using two bytes. The regular expression must not contain null bytes. -If the haystack or the pattern are not valid UTF-8, then the behavior is undefined. -No automatic Unicode normalization is performed, you can use the [normalizeUTF8*()](https://clickhouse.com/docs/en/sql-reference/functions/string-functions/) functions for that. +Matching is based on UTF-8, e.g. `.` matches the Unicode code point `¥` which is represented in UTF-8 using two bytes. The regular +expression must not contain null bytes. If the haystack or the pattern are not valid UTF-8, then the behavior is undefined. Unlike re2's default behavior, `.` matches line breaks. To disable this, prepend the pattern with `(?-s)`. -For patterns to search for substrings in a string, it is better to use functions [like](#like) or [position](#position) since they work much faster. +If you only want to search substrings in a string, you can use functions [like](#like) or [position](#position) instead - they work much faster than this function. -## multiMatchAny(haystack, \[pattern1, pattern2, …, patternn\]) +**Syntax** -The same as `match`, but returns 0 if none of the regular expressions are matched and 1 if any of the patterns matches. For patterns to search substrings in a string, it is better to use `multiSearchAny` since it works much faster. +```sql +match(haystack, pattern) +``` + +Alias: `haystack REGEXP pattern operator` + +## multiMatchAny + +Like `match` but returns 1 if at least one of the patterns match and 0 otherwise. :::note -Functions `multiMatchAny`, `multiMatchAnyIndex`, `multiMatchAllIndices` and their fuzzy equivalents (`multiFuzzyMatchAny`, -`multiFuzzyMatchAnyIndex`, `multiFuzzyMatchAllIndices`) use the (Vectorscan)[https://github.com/VectorCamp/vectorscan] library. As such, -they are only enabled if ClickHouse is compiled with support for vectorscan. +Functions in the `multi[Fuzzy]Match*()` family use the the (Vectorscan)[https://github.com/VectorCamp/vectorscan] library. As such, they are only enabled if ClickHouse is compiled with support for vectorscan. + +To turn off all functions that use hyperscan, use setting `SET allow_hyperscan = 0;`. Due to restrictions of vectorscan, the length of the `haystack` string must be less than 232 bytes. Hyperscan is generally vulnerable to regular expression denial of service (ReDoS) attacks (e.g. see (here)[https://www.usenix.org/conference/usenixsecurity22/presentation/turonova], (here)[https://doi.org/10.1007/s10664-021-10033-1] and -(here)[ https://doi.org/10.1145/3236024.3236027]. Users are adviced to check the provided patterns carefully. +(here)[https://doi.org/10.1145/3236024.3236027]. Users are adviced to check the provided patterns carefully. ::: -## multiMatchAnyIndex(haystack, \[pattern1, pattern2, …, patternn\]) +If you only want to search multiple substrings in a string, you can use function [multiSearchAny](#multisearchany) instead - it works much faster than this function. -The same as `multiMatchAny`, but returns any index that matches the haystack. +**Syntax** -## multiMatchAllIndices(haystack, \[pattern1, pattern2, …, patternn\]) +```sql +multiMatchAny(haystack, \[pattern1, pattern2, …, patternn\]) +``` -The same as `multiMatchAny`, but returns the array of all indices that match the haystack in any order. +## multiMatchAnyIndex -## multiFuzzyMatchAny(haystack, distance, \[pattern1, pattern2, …, patternn\]) +Like `multiMatchAny` but returns any index that matches the haystack. -The same as `multiMatchAny`, but returns 1 if any pattern matches the haystack within a constant [edit distance](https://en.wikipedia.org/wiki/Edit_distance). This function relies on the experimental feature of [hyperscan](https://intel.github.io/hyperscan/dev-reference/compilation.html#approximate-matching) library, and can be slow for some corner cases. The performance depends on the edit distance value and patterns used, but it's always more expensive compared to a non-fuzzy variants. +**Syntax** -## multiFuzzyMatchAnyIndex(haystack, distance, \[pattern1, pattern2, …, patternn\]) +```sql +multiMatchAnyIndex(haystack, \[pattern1, pattern2, …, patternn\]) +``` -The same as `multiFuzzyMatchAny`, but returns any index that matches the haystack within a constant edit distance. +## multiMatchAllIndices -## multiFuzzyMatchAllIndices(haystack, distance, \[pattern1, pattern2, …, patternn\]) +Like `multiMatchAny` but returns the array of all indices that match the haystack in any order. -The same as `multiFuzzyMatchAny`, but returns the array of all indices in any order that match the haystack within a constant edit distance. +**Syntax** + +```sql +multiMatchAllIndices(haystack, \[pattern1, pattern2, …, patternn\]) +``` + +## multiFuzzyMatchAny + +Like `multiMatchAny` but returns 1 if any pattern matches the haystack within a constant [edit distance](https://en.wikipedia.org/wiki/Edit_distance). This function relies on the experimental feature of [hyperscan](https://intel.github.io/hyperscan/dev-reference/compilation.html#approximate-matching) library, and can be slow for some corner cases. The performance depends on the edit distance value and patterns used, but it's always more expensive compared to a non-fuzzy variants. :::note -`multiFuzzyMatch*` functions do not support UTF-8 regular expressions, and such expressions are treated as bytes because of hyperscan restriction. +`multiFuzzyMatch*()` function family do not support UTF-8 regular expressions (it threats them as a sequence of bytes) due to restrictions of hyperscan. ::: -:::note -To turn off all functions that use hyperscan, use setting `SET allow_hyperscan = 0;`. -::: +**Syntax** -## extract(haystack, pattern) +```sql +multiFuzzyMatchAny(haystack, distance, \[pattern1, pattern2, …, patternn\]) +``` -Extracts a fragment of a string using a regular expression. If ‘haystack’ does not match the ‘pattern’ regex, an empty string is returned. If the regex does not contain subpatterns, it takes the fragment that matches the entire regex. Otherwise, it takes the fragment that matches the first subpattern. +## multiFuzzyMatchAnyIndex -## extractAll(haystack, pattern) +Like `multiFuzzyMatchAny` but returns any index that matches the haystack within a constant edit distance. -Extracts all the fragments of a string using a regular expression. If ‘haystack’ does not match the ‘pattern’ regex, an empty string is returned. Returns an array of strings consisting of all matches to the regex. In general, the behavior is the same as the ‘extract’ function (it takes the first subpattern, or the entire expression if there isn’t a subpattern). +**Syntax** + +```sql +multiFuzzyMatchAnyIndex(haystack, distance, \[pattern1, pattern2, …, patternn\]) +``` + +## multiFuzzyMatchAllIndices + +Like `multiFuzzyMatchAny` but returns the array of all indices in any order that match the haystack within a constant edit distance. + +**Syntax** + +```sql +multiFuzzyMatchAllIndices(haystack, distance, \[pattern1, pattern2, …, patternn\]) +``` + +## extract + +Extracts a fragment of a string using a regular expression. If `haystack` does not match the `pattern` regex, an empty string is returned. + +For regex without subpatterns, the function uses the fragment that matches the entire regex. Otherwise, it uses the fragment that matches the first subpattern. + +**Syntax** + +```sql +extract(haystack, pattern) +``` + +## extractAll + +Extracts all fragments of a string using a regular expression. If `haystack` does not match the `pattern` regex, an empty string is returned. + +Returns an array of strings consisting of all matches of the regex. + +The behavior with respect to subpatterns is the same as in function `extract`. + +**Syntax** + +```sql +extractAll(haystack, pattern) +``` ## extractAllGroupsHorizontal Matches all groups of the `haystack` string using the `pattern` regular expression. Returns an array of arrays, where the first array includes all fragments matching the first group, the second array - matching the second group, etc. -:::note -`extractAllGroupsHorizontal` function is slower than [extractAllGroupsVertical](#extractallgroups-vertical). -::: +This function is slower than [extractAllGroupsVertical](#extractallgroups-vertical). **Syntax** @@ -468,8 +368,6 @@ If `haystack` does not match the `pattern` regex, an array of empty arrays is re **Example** -Query: - ``` sql SELECT extractAllGroupsHorizontal('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)'); ``` @@ -482,10 +380,6 @@ Result: └──────────────────────────────────────────────────────────────────────────────────────────┘ ``` -**See Also** - -- [extractAllGroupsVertical](#extractallgroups-vertical) - ## extractAllGroupsVertical Matches all groups of the `haystack` string using the `pattern` regular expression. Returns an array of arrays, where each array includes matching fragments from every group. Fragments are grouped in order of appearance in the `haystack`. @@ -509,8 +403,6 @@ If `haystack` does not match the `pattern` regex, an empty array is returned. **Example** -Query: - ``` sql SELECT extractAllGroupsVertical('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)'); ``` @@ -523,119 +415,88 @@ Result: └────────────────────────────────────────────────────────────────────────────────────────┘ ``` -**See Also** +## like -- [extractAllGroupsHorizontal](#extractallgroups-horizontal) +Returns whether string `haystack` matches the LIKE expression `pattern`. -## like(haystack, pattern), haystack LIKE pattern operator - -Checks whether a string matches a LIKE expression. -A LIKE expression contains a mix of normal characters and the following metasymbols: +A LIKE expression can contain normal characters and the following metasymbols: - `%` indicates an arbitrary number of arbitrary characters (including zero characters). - - `_` indicates a single arbitrary character. - - `\` is for escaping literals `%`, `_` and `\`. Matching is based on UTF-8, e.g. `_` matches the Unicode code point `¥` which is represented in UTF-8 using two bytes. -If the haystack or the pattern are not valid UTF-8, then the behavior is undefined. + +If the haystack or the LIKE expression are not valid UTF-8, the behavior is undefined. + No automatic Unicode normalization is performed, you can use the [normalizeUTF8*()](https://clickhouse.com/docs/en/sql-reference/functions/string-functions/) functions for that. -To match against literals `%`, `_` and `/` (which are LIKE metacharacters), prepend them with a backslash, i.e. `\%`, `\_` and `\\`. -The backslash loses its special meaning, i.e. is interpreted literally, if it prepends a character different than `%`, `_` or `\`. +To match against literal `%`, `_` and `/` (which are LIKE metacharacters), prepend them with a backslash: `\%`, `\_` and `\\`. +The backslash loses its special meaning (i.e. is interpreted literally) if it prepends a character different than `%`, `_` or `\`. Note that ClickHouse requires backslashes in strings [to be quoted as well](../syntax.md#string), so you would actually need to write `\\%`, `\\_` and `\\\\`. -For patterns of the form `%needle%`, the function is as fast as the `position` function. -Other LIKE expressions are internally converted to a regular expression and executed with a performance similar to function `match`. - -## notLike(haystack, pattern), haystack NOT LIKE pattern operator - -The same thing as `like`, but negative. - -## ilike - -Case insensitive variant of [like](https://clickhouse.com/docs/en/sql-reference/functions/string-search-functions/#function-like) function. You can use `ILIKE` operator instead of the `ilike` function. - -The function ignores the language, e.g. for Turkish (i/İ), the result might be incorrect. +For LIKE expressions of the form `%needle%`, the function is as fast as the `position` function. +All other LIKE expressions are internally converted to a regular expression and executed with a performance similar to function `match`. **Syntax** -``` sql -ilike(haystack, pattern) +```sql +like(haystack, pattern) ``` -**Arguments** +Alias: `haystack LIKE pattern` (operator) -- `haystack` — Input string. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `pattern` — If `pattern` does not contain percent signs or underscores, then the `pattern` only represents the string itself. An underscore (`_`) in `pattern` stands for (matches) any single character. A percent sign (`%`) matches any sequence of zero or more characters. +## notLike -Some `pattern` examples: +Like `like` but negates the result. -``` text -'abc' ILIKE 'abc' true -'abc' ILIKE 'a%' true -'abc' ILIKE '_b_' true -'abc' ILIKE 'c' false +Alias: `haystack NOT LIKE pattern` (operator) + +## ilike + +Like `like` but searches case-insensitively. + +Alias: `haystack ILIKE pattern` (operator) + +## notILike + +Like `ilike` but negates the result. + +Alias: `haystack NOT ILIKE pattern` (operator) + +## ngramDistance + +Calculates the 4-gram distance between a `haystack` string and a `needle` string. For that, it counts the symmetric difference between two multisets of 4-grams and normalizes it by the sum of their cardinalities. Returns a Float32 between 0 and 1. The smaller the result is, the more strings are similar to each other. Throws an exception if constant `needle` or `haystack` arguments are more than 32Kb in size. If any of non-constant `haystack` or `needle` arguments is more than 32Kb in size, the distance is always 1. + +Functions `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8` provide case-insensitive and/or UTF-8 variants of this function. + +**Syntax** + +```sql +ngramDistance(haystack, needle) ``` -**Returned values** +## ngramSearch -- True, if the string matches `pattern`. -- False, if the string does not match `pattern`. +Like `ngramDistance` but calculates the non-symmetric difference between a `needle` string and a `haystack` string, i.e. the number of n-grams from needle minus the common number of n-grams normalized by the number of `needle` n-grams. Returns a Float32 between 0 and 1. The bigger the result is, the more likely `needle` is in the `haystack`. This function is useful for fuzzy string search. Also see function `soundex`. -**Example** - -Input table: - -``` text -┌─id─┬─name─────┬─days─┐ -│ 1 │ January │ 31 │ -│ 2 │ February │ 29 │ -│ 3 │ March │ 31 │ -│ 4 │ April │ 30 │ -└────┴──────────┴──────┘ -``` - -Query: - -``` sql -SELECT * FROM Months WHERE ilike(name, '%j%'); -``` - -Result: - -``` text -┌─id─┬─name────┬─days─┐ -│ 1 │ January │ 31 │ -└────┴─────────┴──────┘ -``` - -## notILike(haystack, pattern), haystack NOT ILIKE pattern operator - -The same thing as `ilike`, but negative. - -## ngramDistance(haystack, needle) - -Calculates the 4-gram distance between `haystack` and `needle`: counts the symmetric difference between two multisets of 4-grams and normalizes it by the sum of their cardinalities. Returns float number from 0 to 1 – the closer to zero, the more strings are similar to each other. If the constant `needle` or `haystack` is more than 32Kb, throws an exception. If some of the non-constant `haystack` or `needle` strings are more than 32Kb, the distance is always one. - -For case-insensitive search or/and in UTF-8 format use functions `ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8`. - -## ngramSearch(haystack, needle) - -Same as `ngramDistance` but calculates the non-symmetric difference between `needle` and `haystack` – the number of n-grams from needle minus the common number of n-grams normalized by the number of `needle` n-grams. The closer to one, the more likely `needle` is in the `haystack`. Can be useful for fuzzy string search. - -For case-insensitive search or/and in UTF-8 format use functions `ngramSearchCaseInsensitive, ngramSearchUTF8, ngramSearchCaseInsensitiveUTF8`. +Functions `ngramSearchCaseInsensitive, ngramSearchUTF8, ngramSearchCaseInsensitiveUTF8` provide case-insensitive and/or UTF-8 variants of this function. :::note -For UTF-8 case we use 3-gram distance. All these are not perfectly fair n-gram distances. We use 2-byte hashes to hash n-grams and then calculate the (non-)symmetric difference between these hash tables – collisions may occur. With UTF-8 case-insensitive format we do not use fair `tolower` function – we zero the 5-th bit (starting from zero) of each codepoint byte and first bit of zeroth byte if bytes more than one – this works for Latin and mostly for all Cyrillic letters. +The UTF-8 variants use the 3-gram distance. These are not perfectly fair n-gram distances. We use 2-byte hashes to hash n-grams and then calculate the (non-)symmetric difference between these hash tables – collisions may occur. With UTF-8 case-insensitive format we do not use fair `tolower` function – we zero the 5-th bit (starting from zero) of each codepoint byte and first bit of zeroth byte if bytes more than one – this works for Latin and mostly for all Cyrillic letters. ::: +**Syntax** + +```sql +ngramSearch(haystack, needle) +``` + ## countSubstrings -Returns the number of substring occurrences. +Returns how often substring `needle` occurs in string `haystack`. -For a case-insensitive search, use [countSubstringsCaseInsensitive](../../sql-reference/functions/string-search-functions.md#countSubstringsCaseInsensitive) or [countSubstringsCaseInsensitiveUTF8](../../sql-reference/functions/string-search-functions.md#countSubstringsCaseInsensitiveUTF8) functions. +Functions `countSubstringsCaseInsensitive` and `countSubstringsCaseInsensitiveUTF8` provide a case-insensitive and case-insensitive + UTF-8 variants of this function. **Syntax** @@ -645,34 +506,18 @@ countSubstrings(haystack, needle[, start_pos]) **Arguments** -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` – Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). +- `haystack` — String in which the search is performed. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `needle` — Substring to be searched. [String](../../sql-reference/syntax.md#syntax-string-literal). +- `start_pos` – Position (1-based) in `haystack` at which the search starts. [UInt](../../sql-reference/data-types/int-uint.md). Optional. **Returned values** -- Number of occurrences. +- The number of occurrences. Type: [UInt64](../../sql-reference/data-types/int-uint.md). **Examples** -Query: - -``` sql -SELECT countSubstrings('foobar.com', '.'); -``` - -Result: - -``` text -┌─countSubstrings('foobar.com', '.')─┐ -│ 1 │ -└────────────────────────────────────┘ -``` - -Query: - ``` sql SELECT countSubstrings('aaaa', 'aa'); ``` @@ -685,7 +530,7 @@ Result: └───────────────────────────────┘ ``` -Query: +Example with `start_pos` argument: ```sql SELECT countSubstrings('abc___abc', 'abc', 4); @@ -699,125 +544,7 @@ Result: └────────────────────────────────────────┘ ``` -## countSubstringsCaseInsensitive - -Returns the number of substring occurrences case-insensitive. - -**Syntax** - -``` sql -countSubstringsCaseInsensitive(haystack, needle[, start_pos]) -``` - -**Arguments** - -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). - -**Returned values** - -- Number of occurrences. - -Type: [UInt64](../../sql-reference/data-types/int-uint.md). - -**Examples** - -Query: - -``` sql -SELECT countSubstringsCaseInsensitive('aba', 'B'); -``` - -Result: - -``` text -┌─countSubstringsCaseInsensitive('aba', 'B')─┐ -│ 1 │ -└────────────────────────────────────────────┘ -``` - -Query: - -``` sql -SELECT countSubstringsCaseInsensitive('foobar.com', 'CoM'); -``` - -Result: - -``` text -┌─countSubstringsCaseInsensitive('foobar.com', 'CoM')─┐ -│ 1 │ -└─────────────────────────────────────────────────────┘ -``` - -Query: - -``` sql -SELECT countSubstringsCaseInsensitive('abC___abC', 'aBc', 2); -``` - -Result: - -``` text -┌─countSubstringsCaseInsensitive('abC___abC', 'aBc', 2)─┐ -│ 1 │ -└───────────────────────────────────────────────────────┘ -``` - -## countSubstringsCaseInsensitiveUTF8 - -Returns the number of substring occurrences in `UTF-8` case-insensitive. - -**Syntax** - -``` sql -SELECT countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos]) -``` - -**Arguments** - -- `haystack` — The string to search in. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `needle` — The substring to search for. [String](../../sql-reference/syntax.md#syntax-string-literal). -- `start_pos` — Position of the first character in the string to start search. Optional. [UInt](../../sql-reference/data-types/int-uint.md). - -**Returned values** - -- Number of occurrences. - -Type: [UInt64](../../sql-reference/data-types/int-uint.md). - -**Examples** - -Query: - -``` sql -SELECT countSubstringsCaseInsensitiveUTF8('абв', 'A'); -``` - -Result: - -``` text -┌─countSubstringsCaseInsensitiveUTF8('абв', 'A')─┐ -│ 1 │ -└────────────────────────────────────────────────┘ -``` - -Query: - -```sql -SELECT countSubstringsCaseInsensitiveUTF8('аБв__АбВ__абв', 'Абв'); -``` - -Result: - -``` text -┌─countSubstringsCaseInsensitiveUTF8('аБв__АбВ__абв', 'Абв')─┐ -│ 3 │ -└────────────────────────────────────────────────────────────┘ -``` - -## countMatches(haystack, pattern) +## countMatches Returns the number of regular expression matches for a `pattern` in a `haystack`. @@ -840,8 +567,6 @@ Type: [UInt64](../../sql-reference/data-types/int-uint.md). **Examples** -Query: - ``` sql SELECT countMatches('foobar.com', 'o+'); ``` @@ -854,8 +579,6 @@ Result: └──────────────────────────────────┘ ``` -Query: - ``` sql SELECT countMatches('aaaa', 'aa'); ``` @@ -868,7 +591,7 @@ Result: └───────────────────────────────┘ ``` -## regexpExtract(haystack, pattern[, index]) +## regexpExtract Extracts the first string in haystack that matches the regexp pattern and corresponds to the regex group index. @@ -899,8 +622,12 @@ SELECT regexpExtract('100-200', '(\\d+)-(\\d+)', 1), regexpExtract('100-200', '(\\d+)-(\\d+)', 2), regexpExtract('100-200', '(\\d+)-(\\d+)', 0), - regexpExtract('100-200', '(\\d+)-(\\d+)') + regexpExtract('100-200', '(\\d+)-(\\d+)'); +``` +Result: + +``` text ┌─regexpExtract('100-200', '(\\d+)-(\\d+)', 1)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)', 2)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)', 0)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)')─┐ │ 100 │ 200 │ 100-200 │ 100 │ └──────────────────────────────────────────────┴──────────────────────────────────────────────┴──────────────────────────────────────────────┴───────────────────────────────────────────┘ From 042b4ff525172a070479a863c22ab19d00122afb Mon Sep 17 00:00:00 2001 From: vdimir Date: Thu, 20 Apr 2023 11:41:17 +0200 Subject: [PATCH 386/535] Rename quantileApprox -> quantileGK --- .../{quantileApprox.md => quantileGK.md} | 44 +++++++++---------- .../reference/quantiles.md | 38 ++++++++-------- .../AggregateFunctionQuantile.h | 14 +++--- .../AggregateFunctionQuantileApprox.cpp | 10 ++--- src/AggregateFunctions/QuantileApprox.h | 8 ++-- 5 files changed, 57 insertions(+), 57 deletions(-) rename docs/en/sql-reference/aggregate-functions/reference/{quantileApprox.md => quantileGK.md} (70%) diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md b/docs/en/sql-reference/aggregate-functions/reference/quantileGK.md similarity index 70% rename from docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md rename to docs/en/sql-reference/aggregate-functions/reference/quantileGK.md index 46096ca374e..7352781d126 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantileApprox.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantileGK.md @@ -1,21 +1,21 @@ --- -slug: /en/sql-reference/aggregate-functions/reference/quantileApprox +slug: /en/sql-reference/aggregate-functions/reference/quantileGK sidebar_position: 204 --- -# quantileApprox +# quantileGK -Computes the [quantile](https://en.wikipedia.org/wiki/Quantile) of a numeric data sequence using the [Greenwald-Khanna](http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf) algorithm. The Greenwald-Khanna algorithm is an algorithm used to compute quantiles on a stream of data in a highly efficient manner. It was introduced by Michael Greenwald and Sanjeev Khanna in 2001. It is widely used in databases and big data systems where computing accurate quantiles on a large stream of data in real-time is necessary. The algorithm is highly efficient, taking only O(log n) space and O(log log n) time per item (where n is the size of the input). It is also highly accurate, providing an approximate quantile value with high probability. +Computes the [quantile](https://en.wikipedia.org/wiki/Quantile) of a numeric data sequence using the [Greenwald-Khanna](http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf) algorithm. The Greenwald-Khanna algorithm is an algorithm used to compute quantiles on a stream of data in a highly efficient manner. It was introduced by Michael Greenwald and Sanjeev Khanna in 2001. It is widely used in databases and big data systems where computing accurate quantiles on a large stream of data in real-time is necessary. The algorithm is highly efficient, taking only O(log n) space and O(log log n) time per item (where n is the size of the input). It is also highly accurate, providing an approximate quantile value with high probability. -`quantileApprox` is different from other quantile functions in ClickHouse, because it enables user to control the accuracy of the approximate quantile result. +`quantileGK` is different from other quantile functions in ClickHouse, because it enables user to control the accuracy of the approximate quantile result. **Syntax** ``` sql -quantileApprox(accuracy, level)(expr) +quantileGK(accuracy, level)(expr) ``` -Alias: `medianApprox`. +Alias: `medianGK`. **Arguments** @@ -40,33 +40,33 @@ Type: **Example** ``` sql -SELECT quantileApprox(1, 0.25)(number + 1) +SELECT quantileGK(1, 0.25)(number + 1) FROM numbers(1000) -┌─quantileApprox(1, 0.25)(plus(number, 1))─┐ -│ 1 │ -└──────────────────────────────────────────┘ +┌─quantileGK(1, 0.25)(plus(number, 1))─┐ +│ 1 │ +└──────────────────────────────────────┘ -SELECT quantileApprox(10, 0.25)(number + 1) +SELECT quantileGK(10, 0.25)(number + 1) FROM numbers(1000) -┌─quantileApprox(10, 0.25)(plus(number, 1))─┐ -│ 156 │ -└───────────────────────────────────────────┘ +┌─quantileGK(10, 0.25)(plus(number, 1))─┐ +│ 156 │ +└───────────────────────────────────────┘ -SELECT quantileApprox(100, 0.25)(number + 1) +SELECT quantileGK(100, 0.25)(number + 1) FROM numbers(1000) -┌─quantileApprox(100, 0.25)(plus(number, 1))─┐ -│ 251 │ -└────────────────────────────────────────────┘ +┌─quantileGK(100, 0.25)(plus(number, 1))─┐ +│ 251 │ +└────────────────────────────────────────┘ -SELECT quantileApprox(1000, 0.25)(number + 1) +SELECT quantileGK(1000, 0.25)(number + 1) FROM numbers(1000) -┌─quantileApprox(1000, 0.25)(plus(number, 1))─┐ -│ 249 │ -└─────────────────────────────────────────────┘ +┌─quantileGK(1000, 0.25)(plus(number, 1))─┐ +│ 249 │ +└─────────────────────────────────────────┘ ``` diff --git a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md index 77020ee6acc..38db39d2eec 100644 --- a/docs/en/sql-reference/aggregate-functions/reference/quantiles.md +++ b/docs/en/sql-reference/aggregate-functions/reference/quantiles.md @@ -115,14 +115,14 @@ Result: └─────────────────────────────────────────────────────────────────────┘ ``` -## quantilesApprox +## quantilesGK -`quantilesApprox` works similarly with `quantileApprox` but allows us to calculate quantities at different levels simultaneously and returns an array. +`quantilesGK` works similarly with `quantileGK` but allows us to calculate quantities at different levels simultaneously and returns an array. **Syntax** ``` sql -quantilesApprox(accuracy, level1, level2, ...)(expr) +quantilesGK(accuracy, level1, level2, ...)(expr) ``` **Returned value** @@ -141,32 +141,32 @@ Query: ``` sql -SELECT quantilesApprox(1, 0.25, 0.5, 0.75)(number + 1) +SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000) -┌─quantilesApprox(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐ -│ [1,1,1] │ -└──────────────────────────────────────────────────────┘ +┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [1,1,1] │ +└──────────────────────────────────────────────────┘ -SELECT quantilesApprox(10, 0.25, 0.5, 0.75)(number + 1) +SELECT quantilesGK(10, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000) -┌─quantilesApprox(10, 0.25, 0.5, 0.75)(plus(number, 1))─┐ -│ [156,413,659] │ -└───────────────────────────────────────────────────────┘ +┌─quantilesGK(10, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [156,413,659] │ +└───────────────────────────────────────────────────┘ -SELECT quantilesApprox(100, 0.25, 0.5, 0.75)(number + 1) +SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000) -┌─quantilesApprox(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐ -│ [251,498,741] │ -└────────────────────────────────────────────────────────┘ +┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [251,498,741] │ +└────────────────────────────────────────────────────┘ -SELECT quantilesApprox(1000, 0.25, 0.5, 0.75)(number + 1) +SELECT quantilesGK(1000, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000) -┌─quantilesApprox(1000, 0.25, 0.5, 0.75)(plus(number, 1))─┐ -│ [249,499,749] │ -└─────────────────────────────────────────────────────────┘ +┌─quantilesGK(1000, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [249,499,749] │ +└─────────────────────────────────────────────────────┘ ``` diff --git a/src/AggregateFunctions/AggregateFunctionQuantile.h b/src/AggregateFunctions/AggregateFunctionQuantile.h index 93cff6326ba..c03b7f16a2a 100644 --- a/src/AggregateFunctions/AggregateFunctionQuantile.h +++ b/src/AggregateFunctions/AggregateFunctionQuantile.h @@ -30,7 +30,7 @@ namespace ErrorCodes } template class QuantileTiming; -template class QuantileApprox; +template class QuantileGK; /** Generic aggregate function for calculation of quantiles. @@ -62,7 +62,7 @@ private: using ColVecType = ColumnVectorOrDecimal; static constexpr bool returns_float = !(std::is_same_v); - static constexpr bool is_quantile_approx = std::is_same_v>; + static constexpr bool is_quantile_gk = std::is_same_v>; static_assert(!is_decimal || !returns_float); QuantileLevels levels; @@ -79,14 +79,14 @@ public: AggregateFunctionQuantile(const DataTypes & argument_types_, const Array & params) : IAggregateFunctionDataHelper>( argument_types_, params, createResultType(argument_types_)) - , levels(is_quantile_approx && !params.empty() ? Array(params.begin() + 1, params.end()) : params, returns_many) + , levels(is_quantile_gk && !params.empty() ? Array(params.begin() + 1, params.end()) : params, returns_many) , level(levels.levels[0]) , argument_type(this->argument_types[0]) { if (!returns_many && levels.size() > 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Aggregate function {} requires one level parameter or less", getName()); - if constexpr (is_quantile_approx) + if constexpr (is_quantile_gk) { if (params.empty()) throw Exception( @@ -115,7 +115,7 @@ public: void create(AggregateDataPtr __restrict place) const override /// NOLINT { - if constexpr (is_quantile_approx) + if constexpr (is_quantile_gk) new (place) Data(accuracy); else new (place) Data; @@ -295,7 +295,7 @@ struct NameQuantilesBFloat16 { static constexpr auto name = "quantilesBFloat16"; struct NameQuantileBFloat16Weighted { static constexpr auto name = "quantileBFloat16Weighted"; }; struct NameQuantilesBFloat16Weighted { static constexpr auto name = "quantilesBFloat16Weighted"; }; -struct NameQuantileApprox { static constexpr auto name = "quantileApprox"; }; -struct NameQuantilesApprox { static constexpr auto name = "quantilesApprox"; }; +struct NameQuantileGK { static constexpr auto name = "quantileGK"; }; +struct NameQuantilesGK { static constexpr auto name = "quantilesGK"; }; } diff --git a/src/AggregateFunctions/AggregateFunctionQuantileApprox.cpp b/src/AggregateFunctions/AggregateFunctionQuantileApprox.cpp index 2a913fdc956..c190aaa30d5 100644 --- a/src/AggregateFunctions/AggregateFunctionQuantileApprox.cpp +++ b/src/AggregateFunctions/AggregateFunctionQuantileApprox.cpp @@ -17,8 +17,8 @@ namespace ErrorCodes namespace { -template using FuncQuantileApprox = AggregateFunctionQuantile, NameQuantileApprox, false, void, false>; -template using FuncQuantilesApprox = AggregateFunctionQuantile, NameQuantilesApprox, false, void, true>; +template using FuncQuantileGK = AggregateFunctionQuantile, NameQuantileGK, false, void, false>; +template using FuncQuantilesGK = AggregateFunctionQuantile, NameQuantilesGK, false, void, true>; template